ZGlmZiAtLWdpdCBhL2dyb292eS8uY2xhc3NwYXRoIGIvZ3Jvb3Z5Ly5jbGFzc3BhdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg5ZWMwZgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS8uY2xhc3NwYXRoCkBAIC0wLDAgKzEsMzYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8Y2xhc3NwYXRoPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy9tYWluIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgb3V0cHV0PSJ0YXJnZXQvdGVzdC1jbGFzc2VzIiBwYXRoPSJzcmMvdGVzdCIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0idmFyIiBwYXRoPSJNMl9SRVBPL29yZy9hcGFjaGUvYW50L2FudC8xLjcuMC9hbnQtMS43LjAuamFyIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIgcGF0aD0iTTJfUkVQTy9qYXZheC9zZXJ2bGV0L2pzcC1hcGkvMi4wL2pzcC1hcGktMi4wLmphciIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9Ik0yX1JFUE8vYXNtL2FzbS10cmVlLzIuMi9hc20tdHJlZS0yLjIuamFyIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIgcGF0aD0iTTJfUkVQTy9qYXZheC9zZXJ2bGV0L3NlcnZsZXQtYXBpLzIuNC9zZXJ2bGV0LWFwaS0yLjQuamFyIiBzb3VyY2VwYXRoPSJNMl9SRVBPL2phdmF4L3NlcnZsZXQvc2VydmxldC1hcGkvMi40L3NlcnZsZXQtYXBpLTIuNC1zb3VyY2VzLmphciIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9Ik0yX1JFUE8vYnNmL2JzZi8yLjQuMC9ic2YtMi40LjAuamFyIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIgcGF0aD0iTTJfUkVQTy9teDRqL214NGovMy4wLjIvbXg0ai0zLjAuMi5qYXIiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0idmFyIiBwYXRoPSJNMl9SRVBPL2FudGxyL2FudGxyLzIuNy42L2FudGxyLTIuNy42LmphciIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9Ik0yX1JFUE8vam1vY2svam1vY2stY2dsaWIvMS4yLjAvam1vY2stY2dsaWItMS4yLjAuamFyIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIgcGF0aD0iTTJfUkVQTy9hc20vYXNtLWF0dHJzLzIuMi9hc20tYXR0cnMtMi4yLmphciIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9Ik0yX1JFUE8vb3JnL2FwYWNoZS9hbnQvYW50LWp1bml0LzEuNy4wL2FudC1qdW5pdC0xLjcuMC5qYXIiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0idmFyIiBwYXRoPSJNMl9SRVBPL2p1bml0L2p1bml0LzMuOC4yL2p1bml0LTMuOC4yLmphciIgc291cmNlcGF0aD0iTTJfUkVQTy9qdW5pdC9qdW5pdC8zLjguMi9qdW5pdC0zLjguMi1zb3VyY2VzLmphciIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9Ik0yX1JFUE8vY29tbW9ucy1jbGkvY29tbW9ucy1jbGkvMS4wL2NvbW1vbnMtY2xpLTEuMC5qYXIiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0idmFyIiBwYXRoPSJNMl9SRVBPL29yZy9jb2RlaGF1cy9jYXN0b3IvY2FzdG9yLzEuMS4yLjEvY2FzdG9yLTEuMS4yLjEuamFyIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIgcGF0aD0iTTJfUkVQTy9oc3FsZGIvaHNxbGRiLzEuOC4wLjcvaHNxbGRiLTEuOC4wLjcuamFyIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIgcGF0aD0iTTJfUkVQTy94bWx1bml0L3htbHVuaXQvMS4xL3htbHVuaXQtMS4xLmphciIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9Ik0yX1JFUE8vY29tL3Rob3VnaHR3b3Jrcy94c3RyZWFtL3hzdHJlYW0vMS4yLjIveHN0cmVhbS0xLjIuMi5qYXIiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0idmFyIiBwYXRoPSJNMl9SRVBPL2FzbS9hc20tYW5hbHlzaXMvMi4yL2FzbS1hbmFseXNpcy0yLjIuamFyIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIgcGF0aD0iTTJfUkVQTy9jZ2xpYi9jZ2xpYi1ub2RlcC8yLjFfMy9jZ2xpYi1ub2RlcC0yLjFfMy5qYXIiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0idmFyIiBwYXRoPSJNMl9SRVBPL2ptb2NrL2ptb2NrLzEuMi4wL2ptb2NrLTEuMi4wLmphciIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9Ik0yX1JFUE8vbW9ja29iamVjdHMvbW9ja29iamVjdHMtY29yZS8wLjA5L21vY2tvYmplY3RzLWNvcmUtMC4wOS5qYXIiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0idmFyIiBwYXRoPSJNMl9SRVBPL29wZW5lamIvb3BlbmVqYi1sb2FkZXIvMS4wL29wZW5lamItbG9hZGVyLTEuMC5qYXIiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0idmFyIiBwYXRoPSJNMl9SRVBPL3hwcDMveHBwM19taW4vMS4xLjMuNC5PL3hwcDNfbWluLTEuMS4zLjQuTy5qYXIiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0idmFyIiBwYXRoPSJNMl9SRVBPL2FzbS9hc20vMi4yL2FzbS0yLjIuamFyIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIgcGF0aD0iTTJfUkVQTy9hc20vYXNtLXV0aWwvMi4yL2FzbS11dGlsLTIuMi5qYXIiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0idmFyIiBwYXRoPSJNMl9SRVBPL29yZy9hcGFjaGUvYW50L2FudC1sYXVuY2hlci8xLjcuMC9hbnQtbGF1bmNoZXItMS43LjAuamFyIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0ic2VjdXJpdHkvR3Jvb3Z5SmFyVGVzdC5qYXIiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0idmFyIiBwYXRoPSJNMl9SRVBPL2NvbW1vbnMtbG9nZ2luZy9jb21tb25zLWxvZ2dpbmcvMS4wLjQvY29tbW9ucy1sb2dnaW5nLTEuMC40LmphciIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9Ik0yX1JFUE8vbG9nNGovbG9nNGovMS4yLjgvbG9nNGotMS4yLjguamFyIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIgcGF0aD0iTTJfUkVQTy9qbGluZS9qbGluZS8wLjkuOTEvamxpbmUtMC45LjkxLmphciIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9InRhcmdldC9jbGFzc2VzIi8+Cis8L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2dyb292eS8uZXh0ZXJuYWxUb29sQnVpbGRlcnMvR3Jvb3Z5IGVuc3VyZUdyYW1tYXJzLmxhdW5jaCBiL2dyb292eS8uZXh0ZXJuYWxUb29sQnVpbGRlcnMvR3Jvb3Z5IGVuc3VyZUdyYW1tYXJzLmxhdW5jaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzVkYWU3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5Ly5leHRlcm5hbFRvb2xCdWlsZGVycy9Hcm9vdnkgZW5zdXJlR3JhbW1hcnMubGF1bmNoCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/Pg0KKzxsYXVuY2hDb25maWd1cmF0aW9uIHR5cGU9Im9yZy5lY2xpcHNlLmFudC5BbnRCdWlsZGVyTGF1bmNoQ29uZmlndXJhdGlvblR5cGUiPg0KKzxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5hbnQudWkuQVRUUl9BTlRfQUZURVJfQ0xFQU5fVEFSR0VUUyIgdmFsdWU9ImVuc3VyZUdyYW1tYXJzLCIvPg0KKzxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5hbnQudWkuQVRUUl9BTlRfTUFOVUFMX1RBUkdFVFMiIHZhbHVlPSJlbnN1cmVHcmFtbWFycywiLz4NCis8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmFudC51aS5BVFRSX1RBUkdFVFNfVVBEQVRFRCIgdmFsdWU9InRydWUiLz4NCis8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmFudC51aS5ERUZBVUxUX1ZNX0lOU1RBTEwiIHZhbHVlPSJmYWxzZSIvPg0KKzxsaXN0QXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5NQVBQRURfUkVTT1VSQ0VfUEFUSFMiPg0KKzxsaXN0RW50cnkgdmFsdWU9Ii9ncm9vdnkvYnVpbGQueG1sIi8+DQorPC9saXN0QXR0cmlidXRlPg0KKzxsaXN0QXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5NQVBQRURfUkVTT1VSQ0VfVFlQRVMiPg0KKzxsaXN0RW50cnkgdmFsdWU9IjEiLz4NCis8L2xpc3RBdHRyaWJ1dGU+DQorPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLmFwcGVuZEVudmlyb25tZW50VmFyaWFibGVzIiB2YWx1ZT0idHJ1ZSIvPg0KKzxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcudWkuQVRUUl9MQVVOQ0hfSU5fQkFDS0dST1VORCIgdmFsdWU9ImZhbHNlIi8+DQorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuQ0xBU1NQQVRIX1BST1ZJREVSIiB2YWx1ZT0ib3JnLmVjbGlwc2UuYW50LnVpLkFudENsYXNzcGF0aFByb3ZpZGVyIi8+DQorPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkRFRkFVTFRfQ0xBU1NQQVRIIiB2YWx1ZT0idHJ1ZSIvPg0KKzxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlBST0pFQ1RfQVRUUiIgdmFsdWU9Imdyb292eSIvPg0KKzxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkFUVFJfTE9DQVRJT04iIHZhbHVlPSIke3dvcmtzcGFjZV9sb2M6L2dyb292eS9idWlsZC54bWx9Ii8+DQorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9SVU5fQlVJTERfS0lORFMiIHZhbHVlPSJmdWxsLGluY3JlbWVudGFsLCIvPg0KKzxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX1RSSUdHRVJTX0NPTkZJR1VSRUQiIHZhbHVlPSJ0cnVlIi8+DQorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9XT1JLSU5HX0RJUkVDVE9SWSIgdmFsdWU9IiR7cHJvamVjdF9sb2M6L2dyb292eX0iLz4NCis8L2xhdW5jaENvbmZpZ3VyYXRpb24+DQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5Ly5wcm9qZWN0IGIvZ3Jvb3Z5Ly5wcm9qZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZmY5ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvLnByb2plY3QKQEAgLTAsMCArMSwyNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0RGVzY3JpcHRpb24+CisJPG5hbWU+Z3Jvb3Z5PC9uYW1lPgorCTxjb21tZW50Pkdyb292eTogQSBwb3dlcmZ1bCwgZHluYW1pYyBsYW5ndWFnZSBmb3IgdGhlIEpWTTwvY29tbWVudD4KKwk8cHJvamVjdHM+CisJPC9wcm9qZWN0cz4KKwk8YnVpbGRTcGVjPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5FeHRlcm5hbFRvb2xCdWlsZGVyPC9uYW1lPgorCQkJPHRyaWdnZXJzPmZ1bGwsaW5jcmVtZW50YWwsPC90cmlnZ2Vycz4KKwkJCTxhcmd1bWVudHM+CisJCQkJPGRpY3Rpb25hcnk+CisJCQkJCTxrZXk+TGF1bmNoQ29uZmlnSGFuZGxlPC9rZXk+CisJCQkJCTx2YWx1ZT4mbHQ7cHJvamVjdCZndDsvLmV4dGVybmFsVG9vbEJ1aWxkZXJzL0dyb292eSBlbnN1cmVHcmFtbWFycy5sYXVuY2g8L3ZhbHVlPgorCQkJCTwvZGljdGlvbmFyeT4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwk8L2J1aWxkU3BlYz4KKwk8bmF0dXJlcz4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+CisJPC9uYXR1cmVzPgorPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9ncm9vdnkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvZ3Jvb3Z5Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Nzg1ZGIwCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpAQCAtMCwwICsxLDMgQEAKKyNUdWUgSnVuIDA2IDE3OjUxOjQxIEJTVCAyMDA2CitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQorZW5jb2RpbmcvL3NyYy90ZXN0L2dyb292eS9CYXNlNjRUZXN0Lmdyb292eT1VVEYtOApkaWZmIC0tZ2l0IGEvZ3Jvb3Z5Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2dyb292eS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg4ODczNAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKQEAgLTAsMCArMSw1NyBAQAorI1NhdCBKdW4gMTEgMDM6NDU6MzYgQ0VTVCAyMDA1CitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNApkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L0FTTS1MSUNFTlNFLnR4dCBiL2dyb292eS9BU00tTElDRU5TRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY0Yjc5NAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9BU00tTElDRU5TRS50eHQKQEAgLTAsMCArMSwzMSBAQAorLyoqKgorICogaHR0cDovL2FzbS5vYmplY3R3ZWIub3JnLworICoKKyAqIEFTTTogYSB2ZXJ5IHNtYWxsIGFuZCBmYXN0IEphdmEgYnl0ZWNvZGUgbWFuaXB1bGF0aW9uIGZyYW1ld29yaworICogQ29weXJpZ2h0IChjKSAyMDAwLDIwMDIsMjAwMyBJTlJJQSwgRnJhbmNlIFRlbGVjb20KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLwpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L0xJQ0VOU0UudHh0IGIvZ3Jvb3Z5L0xJQ0VOU0UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwOTA4ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvTElDRU5TRS50eHQKQEAgLTAsMCArMSwxNSBAQAorLyoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9OT1RJQ0UudHh0IGIvZ3Jvb3Z5L05PVElDRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg0OGI5NgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9OT1RJQ0UudHh0CkBAIC0wLDAgKzEsMTIgQEAKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgID09ICBOT1RJQ0UgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzZWN0aW9uIDQgZCBvZiAgICAgICAgICAgICAgICAgICAgPT0KKyAgID09ICB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0KKyAgID09ICBpbiB0aGlzIGNhc2UgZm9yIHRoZSBHcm9vdnkgTGFuZ3VhZ2UgZGlzdHJpYnV0aW9uLiAgICAgICAgICAgICAgICAgPT0KKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgR3Jvb3Z5IExhbmd1YWdlCisgICBDb3B5cmlnaHQgMjAwMy0yMDA3IFRoZSByZXNwZWN0aXZlIGF1dGhvcnMgYW5kIGRldmVsb3BlcnMKKyAgIERldmVsb3BlcnMgYW5kIENvbnRyaWJ1dG9ycyBhcmUgbGlzdGVkIGluIHRoZSBwcm9qZWN0IFBPTSBmaWxlCisKKyAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkKKyAgIFRoZSBHcm9vdnkgY29tbXVuaXR5IChodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8pLgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L1JFQURNRS50eHQgYi9ncm9vdnkvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjBmM2JlCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L1JFQURNRS50eHQKQEAgLTAsMCArMSwyMiBAQAorJElkJAorCitCdWlsZGluZworPT09PT09PT0KKworVG8gYnVpbGQgeW91IHdpbGwgbmVlZDoKKworICogSkRLIDEuNCsgKEoyU0UgMS40LjArKSAoaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC4yKQorICogQXBhY2hlIEFudCAxLjcrIChodHRwOi8vYW50LmFwYWNoZS5vcmcpCisKK0ZvciBkZXRhaWxlZCBpbnN0cnVjdGlvbnMgcGxlYXNlIHNlZToKKworICAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnL0J1aWxkaW5nK0dyb292eStmcm9tK1NvdXJjZQorCitUbyBidWlsZCBldmVyeXRoaW5nLCBydW4gdGVzdHMgYW5kIGNyZWF0ZSBhIGNvbXBsZXRlIGluc3RhbGxhdGlvbjoKKworICAgIGFudCBpbnN0YWxsCisKK1RvIGJ1aWxkIHdpdGhvdXQgcnVubmluZyB0ZXN0czoKKworICAgIGFudCBpbnN0YWxsIC1Ec2tpcFRlc3RzPXRydWUKKwpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L1RPRE8udHh0IGIvZ3Jvb3Z5L1RPRE8udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyN2VmMTMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvVE9ETy50eHQKQEAgLTAsMCArMSwyMDggQEAKKyEhISEhISBPYnNvbGV0ZSBmaWxlISEgRG9uJ3QgYWRkIGFueXRoaW5nIGhlcmUsIHVzZSBKaXJhIGluc3RlYWQuCisKK1RPRE86IHJlbW92ZSBpcnJlbGV2YW50IGVudHJpZXMsIGFkZCBvdGhlcnMgdG8gSmlyYS4KKworVGhpbmdzIHRvIFRlc3QKKz09PT09PT09PT09PT09CisKKyogdGVzdCBzeW5jaHJvbml6ZWQgc3RhdGVtZW50CisKK0NvcmUgR3Jvb3Z5IFRhc2tzCis9PT09PT09PT09PT09PT09PQorCisqIG5ldyBHcm9vdnlNZXRob2RzCXRvIGJlIGFkZGVkCisJLSBGaWxlLmdyZXAocGF0dGVybikgLT4gTGlzdAorCS0gRmlsZS5ncmVwKHBhdHRlcm4pIHsgY2xvc3VyZSB9IAorCQlhbGxvdyBpdGVyYXRpb24gdGhyb3VnaCBhIGZpbGUgZm9yIGVhY2ggbGluZSBtYXRjaGluZyBhIHJlZ2V4IHBhdHRlcm4KKwkJCisJLSBMaXN0LmZpcnN0KCksIExpc3QubGFzdCgpLCBwb3AoKQorCS0gQ29sbGVjdGlvbi5yZW1vdmVJZiB7IHggfCB4ID4gMCB9CisJLSBDb2xsZWN0aW9uLmNvdW50KGZvbykgLT4gcmV0dXJucyBudW1iZXIgb2Ygb2JqZWN0cyB0aGF0IGVxdWFsIGZvbworCisJLSBNYXAuZ2V0KGtleSwgZGVmYXVsdFZhbHVlKQorCS0gTWFwLnNldERlZmF1bHQoa2V5LCBkZWZhdWx0VmFsdWUpIGZvciB0aGluZ3MgbGlrZQorICAJCSBtYXAuc2V0RGVmYXVsdChrZXksIFtdKS5hZGQobmV3VmFsdWUpCisJCisJLSBPYmplY3QuZWFjaFByb3BlcnR5CisJLSBPYmplY3QuZWFjaFByb3BlcnR5TmFtZSB7IG9iamVjdC5nZXRQcm9wZXJ0eShpdCkgfQorCS0gT2JqZWN0LnNldFByb3BlcnRpZXMoZm9vOidhYmMnLCB4OjEyMykKKwkKKwktIHNvbWUga2luZCBvZiBSZWdleHAgaXRlcmF0b3Igb2Ygc3RyaW5ncyBsaWtlIFJ1YnkncyBzY2FuCisJLSBtYXliZSBzdXBwb3J0IFB5dGhvbnMnIHppcCBhbmQgcmVkdWNlIGZ1bmN0aW9ucz8KKwkKKwkJbWF5YmUgYWRkIHRoZSB2YXJpb3VzIHJlYWRvbmx5IExpc3QgQVBJcyB0byBPYmplY3RbXSBhbmQgKltdIHR5cGVzCisJCWlmIHdlIGV2ZXIgc3VwcG9ydCB0aGUgRFREIC8gWGVkIHN0eWxlIHR5cGUqLCB0eXBlKyB0aGVuIHdlIGNhbiBkbyB0aGUgc2FtZQorCQl0aGVyZSB0b28KKworKiBTUUwgYnVpbGRlcgorCitzcWwudGFibGUoInVzZXJzIikgeworysrKIGNvbHVtbigndXNlci1pZCcpIHsgYXV0b2luYygpLCBwcmltYXJ5S2V5KCksIHJlZmVyZW5jZXMoJ2ZvbycpLCBpbml0aWFsVmFsdWUoMTIzNCkgfQorysrKIGNvbHVtbignbmlja25hbWUnKSB7IHZhcmNoYXIoMjAwKSB9CisJY29sdW1uKG5hbWU6J2ZvbycsIHR5cGU6J3ZhcmNoYXIoMjAwKScsIHJlZmVyZW5jZXM6WydhJywgJ2InXSwgaW5pdGlhbFZhbHVlOjEyMzQpCisgIH0KK30KKworKiB1c2luZyBtaXhpbiBmb3IgYWRkaW5nIHVzaW5nIHN0eWxlIGJlaGF2aW91ciB0byBhbnkgb2JqZWN0Pz8KKworCW1peGluIFVzaW5nIHsKKwkKKwkJc3RhdGljIHVzaW5nKHlpZWxkKSB7CisJCQlvYmplY3QgPSB0aGlzLm5ld0luc3RhbmNlKCkKKwkJCXRyeSB7CisJCQkJeWllbGQob2JqZWN0KQorCQkJCW9iamVjdC5jbG9zZSgpCisJCQl9CisJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQl0cnkgeworCQkJCQlvYmplY3QuY2xvc2UoKQorCQkJCX0KKwkJCQljYXRjaCAoRXhjZXB0aW9uIGUyKQorCQkJCQkvLyBpZ25vcmUgZTIKKwkJCQkJdGhyb3cgZQorCQkJCX0KKwkJCX0KKwkJfQorCQkKKwkJb3IKKwkJCisJCXVzaW5nKHlpZWxkKSB7CisJCQl0cnkgeworCQkJCXlpZWxkKHRoaXMpCisJCQkJY2xvc2UoKQorCQkJfQorCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJdHJ5IHsKKwkJCQkJY2xvc2UoKQorCQkJCX0KKwkJCQljYXRjaCAoRXhjZXB0aW9uIGUyKQorCQkJCQkvLyBpZ25vcmUgZTIKKwkJCQkJdGhyb3cgZQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKwkKKwl0aGVuIHVzZSBpdCBhcyAKKwkKKwkJbmV3IEZpbGVJbnB1dFN0cmVhbSgpLnVzaW5nIHsgaW4gfAorCQkJLi4uCisJCX0KKworKiBsb29rcyBsaWtlIGEgYnVnIG9uIGdlbmVyYXRlZCBtZXRob2RzLCBzaG91bGQgdXNlIHBhcmFtIG5hbWUgb3ZlciBhbnkgZmllbGQgbmFtZQorCS0gYWxzbyBpdCBsb29rcyBsaWtlIHRoZXJlJ3MgdmFyaW91cyB1bm5lY2Vzc2FyeSBzdHVmZiAoY3JlYXRpb24gb2YgdHVwbGVzKSB3aGVuIGludm9raW5nCisJbWV0aG9kcworCQorKiB0ZXN0IGlkZW50aXR5IC0+IGhhc2hDb2RlICsgZXF1YWxzIG1ldGhvZHMKKworKiBzdXBwb3J0IGZvciBwcm9wZXJ0eSBjb252ZXJ0ZXJzLCBiYXNlZCBvbiB0eXBlCisKKyogdG8gc3VwcG9ydCBkeW5hbWljIG1peGlucyB3ZSBzaG91bGQgdXNlIGR5bmFtaWMgcHJveGllcyB0byBhbGxvdworCWEgZ3Jvb3Z5IG9iamVjdCB0byBjaGFuZ2UgbWV0YWNsYXNzIGF0IHJ1bnRpbWUKKworKiBncm9vdnkgZHluYW1pYyBwcm94eSBvZiBhbnkgSmF2YSBvYmplY3QgaW4gSmF2YS1sYW5kPworCU51bGxPYmplY3QgcGF0dGVybgorCQorKiBpbW11dGFibGUgYmVhbgorCisqIHN1cHBvcnQgc3RhdGljIG5ld0luc3RhbmNlKCkgbWV0aG9kIGZvciBjb25zdHJ1Y3RvcnMKKworKiBtYXliZSBzcGxpdCB1cCBDbGFzc0dlbmVyYXRvciAtIGRvIGNvZGUgZ2VuICYgY2xhc3MgZ2VuIHNlcGFyYXRlbHkKKworKiBtaXhpbiBzdXBwb3J0Li4uCisKKwlTb21lQ2xhc3MuYWRkTWl4aW4oRm9vKTsKKwkKKwlNZXRhQ2xhc3MuYWRkSW50ZXJjZXB0b3IoIG5ldyBJbnRlcmNlcHRvcigpIHsKKwkJZmlsdGVyKG1ldGhvZCkgeworCQkJcmV0dXJuIG1ldGhvZC5pc1B1YmxpYygpOworCQl9CisJCWludm9rZShtZXRob2QsIGFyZ3MpIHsKKwkJCS8vIGRvIHNvbWV0aGluZworCQkJbWV0aG9kLmludm9rZShhcmdzKTsKKwkJfQorCX0pOworCisJKiBhbGxvdyBtZXRhIGNsYXNzZXMgdG8gYmUgYWRkZWQgZHluYW1pY2FsbHkgdXNpbmcgY2xvc3VyZSBzeW50YXg/CisJZS5nLiBNYXA/CisJCisKK1NUVUZGIFRPIFBPTkRFUgorPT09PT09PT09PT09PT09CisKKyogU3VwcG9ydCBtdWx0aXBsZSByZXR1cm4gdmFsdWVzLi4uCisKKwlTdHJpbmcsIE51bWJlciBjaGVlc2UoKSB7CisJCSJoZWxsbyIsIDcKKwl9CisJCisJYSwgYiA9IGNoZWVzZSgpCisJCisJYWxzbyBpZiB3ZSBkbyB0aGlzIHdlIHNob3VsZCBkbyBhc3NpZ25tZW50IC8gc3dhcHBpbmcKKwkKKwkJYSwgYiA9IDEsIDIKKwkJYSwgYiA9IGIsIGEKKworKiB1c2luZyBtYWNyb3MgdG8gYXZvaWQgZGVwZW5kZW5jaWVzIG9uIGxvZ2dpbmcgc3R1ZmYgKHNheSkKKworCWNsYXNzIEdyb292eUxvZyB7CisJCXN3aXRjaCAoU3lzdGVtLmdldFByb3BlcnR5KCdncm9vdnkubG9nLmltcGwnLCAndXNlQ29tbW9uc0xvZ2dpbmcnKSkgeworCQkJY2FzZSAndXNlQ29tbW9uc0xvZ2dpbmcnOiB7CisJCQkJLy8gbGV0cyBkZWZpbmUgdGhlIG5ldyBpbnN0YW5jZSBtZXRob2QKKwkJCQluZXdJbnN0YW5jZSgpIHsKKwkJCQkJcmV0dXJuIG5ldyBDb21tb25zTG9nZ2luZ1RoaW5neSgpCisJCQkJfQorCQkJfQorCQkJZGVmYXVsdCB7CisJCQkJbmV3SW5zdGFuY2UoKSB7CisJCQkJCXJldHVybiBuZXcgU2ltcGxlR3Jvb3Z5TG9nKCkKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJCisJZG9pbmcgdGhpbmdzIGxpa2UgdGhpcyBhdCBjb21waWxlIHRpbWUgbWVhbnMgbm8gcnVudGltZSBkZXBlbmRlbmNpZXMuIERpdHRvIHRvIGRvIEpESyBiYXNlZCBjb21waWxlcworCQorVUkgV09SSworPT09PT09PQorCisqIHRyZWUgZGVtby4uLgorCisqIHdoZW4gbmFtZWQgbWV0aG9kIGNhbGxzIGFyZSBzdXBwb3J0ZWQgd2l0aCBkZWZhdWx0IHZhbHVlcywgcmVmYWN0b3IgU3dpbmdCdWlsZGVyCisJc28gdGhhdCBhbGwgdGhlIGNyZWF0aW9ucyBvZiB3aWRnZXRzIG9jY3VyIHdpdGggU3dpbmdGYWN0b3J5IHdoaWNoIHdvdWxkIGJlIAorCXVzZWZ1bCBpbiBhbmQgb2YgaXRzZWxmCisJLSBwbHVzIHdlIHNob3VsZCBiZSB1c2luZyBub3JtYWwgbWV0aG9kIGNhbGwgbWVjaGFuaXNtICYgZm9yIGdyb292eSB0byBkbyB0aGUgcmVzdCB0byBhdm9pZAorCXRoZSBsb25nIGxhYm9yaW91cyBNYXAgY29kaW5nCisJCisqIEZvcm1Nb2RlbC5hZGRQcm9wZXJ0eU1vZGVsKHByb3BlcnR5KQorCUZvcm1Nb2RlbC5hZGRDbG9zdXJlTW9kZWwocmVhZENsb3N1cmUsIHdyaXRlQ2xvc3VyZSkKKworKiBMaXN0TW9kZWwgaXMtYSBMaXN0IGJ1dCBkZWxlZ2F0ZXMgdG8gYW4gdW5kZXJseWluZyBsaXN0IGFuZCBoYXMgZXZlbnRzCisKKyogcmVuYW1lIHRhYmxlTGF5b3V0IC0+IHRhYmxlIGFuZCB0YWJsZSAtPiBncmlkCisKKyogYWRkIHNvcnRhYmxlR3JpZAorCisqIGNyZWF0ZSBhIEdyb292eVVJCisJLT4gaW50ZXJhY3RpdmUgc2NyaXB0ICsgYWxsb3dzIHNjcmlwdHMgdG8gYmUgcnVuICYgb2JqZWN0cyBleHBsb3JlZAorCisKK0pVTklUIFdPUksKKz09PT09PT09PT0KKworKiBwYXRjaCBHcm9vdnlUZXN0Q2FzZSBzbyB0aGF0IG1ldGhvZHMgd2hpY2ggcmV0dXJuIE9iamVjdCBhcmUgaW5jbHVkZWQgaW4gdGhlIHRlc3QuIFRoaXMgYXZvaWRzIHVzIGhhdmluZyB0bworc3BlY2lmeSB2b2lkIGZvciBtZXRob2QgcmV0dXJuIHR5cGVzLlRoaXMgcmVxdWlyZXMgYSBjbGV2ZXIgc3RhdGljIG1ldGhvZCB3aGVuIHdlIGdlbmVyYXRlIHRoZQorCWJ5dGVjb2RlIHdoaWNoIGNhbiBpbnN0YW50aWF0ZSBhIHNwZWNpYWwga2luZCBvZiBUZXN0U3VpdGUKKwl1bmxlc3MgdGhlcmUncyBhbm90aGVyIHdheT8KKworCitPUFRJTUlTQVRJT05TCis9PT09PT09PT09PT09CisqIG1ldGhvZCBpbnZvY2F0aW9ucyAtIGlmIGZvbyBpbnN0YW5jZW9mIEdyb292eU9iamVjdAordGhlbiBnZW5lcmF0ZSBieXRlY29kZQorCitmb28uaW52b2tlTWV0aG9kKG1ldGhvZCwgYXJncyk7CisKKyogY291bGQgY29kZSBnZW5lcmF0ZSB0aGUgTWV0YUNsYXNzIHdpdGggdmVyeSBlZmZpY2llbnQgZHluYW1pYyBkaXNwYXRjaAorCWUuZy4gY291bGQgc3dpdGNoKCkgb24gdGhlIG1ldGhvZCBuYW1lICYgdGhlbiB1c2UgcmVhbCBtZXRob2QgaW52b2NhdGlvbgorCW9uIHRoZSBtZXRob2QgaW5zdGFuY2UKZGlmZiAtLWdpdCBhL2dyb292eS9ib290c3RyYXAvbWF2ZW4tYW50LXRhc2tzLTIuMC43LmphciBiL2dyb292eS9ib290c3RyYXAvbWF2ZW4tYW50LXRhc2tzLTIuMC43LmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjBkZmRkCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L2Jvb3RzdHJhcC9tYXZlbi1hbnQtdGFza3MtMi4wLjcuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyb292eS9idWlsZC5wcm9wZXJ0aWVzIGIvZ3Jvb3Z5L2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ2OWVjYgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9idWlsZC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTMgQEAKK2dyb292eVZlcnNpb24gPSAxLjUuMAorCisjIHVuY29tbWVudCB0aGUgZm9sbG93aW5nIGxpbmUgdG8gZW5hYmxlIGphdmE1IGVsZW1lbnRzIGluIHRoZSBidWlsZAorIyBncm9vdnkuYnVpbGQudm01PXRydWUKKworIyAgTWFueSBwZW9wbGUgaGF2ZSByZXBvcnRlZCBwcm9ibGVtcyB0ZXN0aW5nIFViZXJUZXN0Q2FzZUdyb292eVNvdXJjZVN1YlBhY2thZ2VzLCBvdGhlcnMgaGF2ZSBubyBkaWZmaWN1bHRpZXMgd2l0aCB0aGUgZGVmYXVsdAorIyAgdmFsdWVzIGFudCBqdW5pdCB0YXNrIHVzZXMuICBUaGUgZGVjaXNpb24gaGFzIGJlZW4gdGFrZW4gdG8gcHJvdmlkZSB0aGUgdmFsdWVzIHRvIHRyeSBhbmQgY2F1c2UgdGhlIGxlYXN0CisjICBoYXNzbGUgdG8gdGhlIG1vc3QgcGVvcGxlLgorCitncm9vdnlKVW5pdF9tcyA9IDI1Nm0KK2dyb292eUpVbml0X214ID0gMjU2bQorZ3Jvb3Z5SlVuaXRfcGVybVNpemUgPSA2NG0KK2dyb292eUpVbml0X21heFBlcm1TaXplPTEyOG0KZGlmZiAtLWdpdCBhL2dyb292eS9idWlsZC54bWwgYi9ncm9vdnkvYnVpbGQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkYjBlZTYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvYnVpbGQueG1sCkBAIC0wLDAgKzEsNzQzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorCis8IS0tCitBbnQgYnVpbGQgc2NyaXB0IGZvciBHcm9vdnkuCisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbgorY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMKK2Rpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgoraW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworVGhpcyB3b3JrIGlzIGNvcHlyaWdodCBieSB0aGUgYXV0aG9yKHMpIGFuZCBpcyBwYXJ0IG9mIGEgZ3JlYXRlciB3b3JrIGNvbGxlY3RpdmVseSBjb3B5cmlnaHQgYnkgQ29kZWhhdXMgb24KK2JlaGFsZiBvZiB0aGUgR3Jvb3Z5IGNvbW11bml0eS4gU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uCisKK0F1dGhvciA6IFJ1c3NlbCBXaW5kZXIKK0F1dGhvciA6IFBhdWwgS2luZworJFJldmlzaW9uJCAoJExhc3RDaGFuZ2VkQnkkKQorJERhdGUkCistLT4KKworPHByb2plY3QgbmFtZT0iR3Jvb3Z5IiBkZWZhdWx0PSJjcmVhdGVKYXJzIiBiYXNlZGlyPSIuIj4KKworICAgIDxwcm9wZXJ0eSBmaWxlPSJsb2NhbC5idWlsZC5wcm9wZXJ0aWVzIi8+CisgICAgPHByb3BlcnR5IGZpbGU9ImJ1aWxkLnByb3BlcnRpZXMiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iYW50LnJlcXVpcmVkVmVyc2lvbiIgdmFsdWU9IjEuNi41Ii8+CisKKyAgICA8IS0tIGNvbmZpZy9hbnQvYnVpbGQtbWF2ZW4ueG1sIGltcG9ydHMgY29uZmlnL2FudC9idWlsZC1zZXR1cC54bWwgd2hlcmUgYWxsIHRoZSBwYXRocyBhcmUgZGVmaW5lZC4gLS0+CisgICAgPGltcG9ydCBmaWxlPSJjb25maWcvYW50L2J1aWxkLW1hdmVuLnhtbCIvPgorICAgIDxpbXBvcnQgZmlsZT0iY29uZmlnL2FudC9idWlsZC1jaGVja3N0eWxlLnhtbCIvPgorICAgIDxpbXBvcnQgZmlsZT0iY29uZmlnL2FudC9idWlsZC1jb2JlcnR1cmEueG1sIi8+CisKKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJfc2tpcFRlc3RzXyI+CisgICAgICAgIDxvcj4KKyAgICAgICAgICAgIDxlcXVhbHMgYXJnMT0iJHt0ZXN0fSIgYXJnMj0iZmFsc2UiLz4KKyAgICAgICAgICAgIDxpc3RydWUgdmFsdWU9IiR7c2tpcFRlc3RzfSIvPgorICAgICAgICA8L29yPgorICAgIDwvY29uZGl0aW9uPgorCisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iX3NraXBFeGFtcGxlc18iPgorICAgICAgICA8aXN0cnVlIHZhbHVlPSIke3NraXBFeGFtcGxlc30iLz4KKyAgICA8L2NvbmRpdGlvbj4KKworICAgIDxjb25kaXRpb24gcHJvcGVydHk9Imdyb292eS5idWlsZC52bTUiPgorICAgICAgICA8bm90PgorICAgICAgICAgICAgPGNvbnRhaW5zIHN0cmluZz0iJHthbnQuamF2YS52ZXJzaW9ufSIgc3Vic3RyaW5nPSIxLjQiLz4KKyAgICAgICAgPC9ub3Q+CisgICAgPC9jb25kaXRpb24+CisKKyAgICA8dGFyZ2V0IG5hbWU9Ii1pbml0Q292ZXJhZ2UiPgorICAgICAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJfZm9yY2VDb3ZlcmFnZV8iPgorICAgICAgICAgICAgPGFuZD4KKyAgICAgICAgICAgICAgICA8bm90PgorICAgICAgICAgICAgICAgICAgICA8aXN0cnVlIHZhbHVlPSIke3NraXBUZXN0c30iLz4KKyAgICAgICAgICAgICAgICA8L25vdD4KKyAgICAgICAgICAgICAgICA8aXN0cnVlIHZhbHVlPSIke2ZvcmNlQ292ZXJhZ2V9Ii8+CisgICAgICAgICAgICA8L2FuZD4KKyAgICAgICAgPC9jb25kaXRpb24+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImVuc3VyZUdyYW1tYXJzIiBkZXNjcmlwdGlvbj0iRW5zdXJlIGFsbCB0aGUgQW50bHIgZ2VuZXJhdGVkIGZpbGVzIGFyZSB1cCB0byBkYXRlLiI+CisgICAgICAgIDxta2RpciBkaXI9IiR7Z3Jvb3Z5UGFyc2VyRGlyZWN0b3J5fSIvPgorICAgICAgICA8YW50bHIgdGFyZ2V0PSIke2FudGxyRGlyZWN0b3J5fS9ncm9vdnkuZyIgb3V0cHV0ZGlyZWN0b3J5PSIke2dyb292eVBhcnNlckRpcmVjdG9yeX0iPgorICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0iY29tcGlsZVBhdGgiLz4KKyAgICAgICAgPC9hbnRscj4KKyAgICAgICAgPGFudGxyIHRhcmdldD0iJHtqYXZhUGFyc2VyRGlyZWN0b3J5fS9qYXZhLmciIG91dHB1dGRpcmVjdG9yeT0iJHtqYXZhUGFyc2VyRGlyZWN0b3J5fSI+CisgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJjb21waWxlUGF0aCIvPgorICAgICAgICA8L2FudGxyPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSItaW5pdCIgZGVwZW5kcz0iLWZldGNoRGVwZW5kZW5jaWVzIj4KKyAgICAgICAgPGVjaG8gbWVzc2FnZT0iSmF2YSBSdW50aW1lIEVudmlyb25tZW50IHZlcnNpb246ICR7amF2YS52ZXJzaW9ufSIvPgorICAgICAgICA8ZWNobyBtZXNzYWdlPSJKYXZhIFJ1bnRpbWUgRW52aXJvbm1lbnQgdmVuZG9yOiAke2phdmEudmVuZG9yfSIvPgorICAgICAgICA8ZWNobyBtZXNzYWdlPSJBbnQgdmVyc2lvbjogJHthbnQudmVyc2lvbn0iLz4KKyAgICAgICAgPGVjaG8gbWVzc2FnZT0iT3BlcmF0aW5nIHN5c3RlbSBuYW1lOiAke29zLm5hbWV9Ii8+CisgICAgICAgIDxlY2hvIG1lc3NhZ2U9Ik9wZXJhdGluZyBzeXN0ZW0gYXJjaGl0ZWN0dXJlOiAke29zLmFyY2h9Ii8+CisgICAgICAgIDxlY2hvIG1lc3NhZ2U9Ik9wZXJhdGluZyBzeXN0ZW0gdmVyc2lvbjogJHtvcy52ZXJzaW9ufSIvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSItanZtMTRCdWlsZFdhcm5pbmciIHVubGVzcz0iZ3Jvb3Z5LmJ1aWxkLnZtNSI+CisgICAgICAgIDxlY2hvPgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBXQVJOSU5HOiBZb3UgYXJlIGJ1aWxkaW5nIEdyb292eSB3aXRoIGEgMS40IEpESyAtIHRoZSByZXN1bHRpbmcKKyAgICAgICAgICAgamFyIHdpbGwgYmUgbWlzc2luZyBzb21lIEphdmEgMS41KyBzcGVjaWZpYyBmZWF0dXJlcy4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgPC9lY2hvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPCEtLSB3aWxsIGdvIGF3YXkgYWZ0ZXIgMS4xIGZpbmFsIC0tPgorICAgIDx0YXJnZXQgbmFtZT0iLWp2bTE1QnVpbGRXYXJuaW5nIiBpZj0iZ3Jvb3Z5LmJ1aWxkLnZtNSI+CisgICAgICAgIDxlY2hvPgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBXQVJOSU5HOiBZb3UgYXJlIGJ1aWxkaW5nIEdyb292eSB3aXRoIGEgMS41KyBKREsgLSBwbGVhc2UgY2hlY2sKKyAgICAgICAgICAgdGhhdCB5b3UgYXJlIG5vdCB1c2luZyBhbnkgMS41KyBjbGFzc2VzIGRpcmVjdGx5IGluIGEKKyAgICAgICAgICAgd2F5IHRoYXQgd291bGQgYnJlYWsgdGhlIDEuNCBidWlsZC4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgPC9lY2hvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSItY2hlY2tBbnRWZXJzaW9uIiBkZXBlbmRzPSItZXhjbHVkZUxlZ2FjeUFudFZlcnNpb24iCisgICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ2hlY2sgdGhhdCB3ZSBhcmUgcnVubmluZyBvbiB0aGUgcmVxdWlyZWQgdmVyc2lvbiBvZiBBbnQuIi8+CisKKyAgICA8dGFyZ2V0IG5hbWU9Ii1leGNsdWRlTGVnYWN5QW50VmVyc2lvbiI+CisgICAgICAgIDwhLS0gYW50dmVyc2lvbiBkaWRuJ3QgZXhpc3QgaW4gZWFybHkgdmVyc2lvbnMgb2YgYW50IHNvIHdlIGhhdmUKKyAgICAgICAgICAgICBhIGxlZ2FjeSBjaGVjayB0byBwcm92aWRlIGEgbmljZXIgZXJyb3IgbWVzc2FnZSBpbiB0aGlzIGNhc2UgLS0+CisgICAgICAgIDxmYWlsIG1lc3NhZ2U9IllvdSBhcmUgdXNpbmcgYW50ICR7YW50LnZlcnNpb259LCBwbGVhc2UgYnVpbGQgdXNpbmcgYW50ICR7YW50LnJlcXVpcmVkVmVyc2lvbn0rIj4KKyAgICAgICAgICAgIDxjb25kaXRpb24+CisgICAgICAgICAgICAgICAgPG9yPgorICAgICAgICAgICAgICAgICAgICA8Y29udGFpbnMgc3RyaW5nPSIke2FudC52ZXJzaW9ufSIgc3Vic3RyaW5nPSIxLjEiPjwvY29udGFpbnM+CisgICAgICAgICAgICAgICAgICAgIDxjb250YWlucyBzdHJpbmc9IiR7YW50LnZlcnNpb259IiBzdWJzdHJpbmc9IjEuMiI+PC9jb250YWlucz4KKyAgICAgICAgICAgICAgICAgICAgPGNvbnRhaW5zIHN0cmluZz0iJHthbnQudmVyc2lvbn0iIHN1YnN0cmluZz0iMS4zIj48L2NvbnRhaW5zPgorICAgICAgICAgICAgICAgICAgICA8Y29udGFpbnMgc3RyaW5nPSIke2FudC52ZXJzaW9ufSIgc3Vic3RyaW5nPSIxLjQiPjwvY29udGFpbnM+CisgICAgICAgICAgICAgICAgICAgIDxjb250YWlucyBzdHJpbmc9IiR7YW50LnZlcnNpb259IiBzdWJzdHJpbmc9IjEuNSI+PC9jb250YWlucz4KKyAgICAgICAgICAgICAgICAgICAgPGFuZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjb250YWlucyBzdHJpbmc9IiR7YW50LnZlcnNpb259IiBzdWJzdHJpbmc9IjEuNiI+PC9jb250YWlucz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxub3Q+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbnRhaW5zIHN0cmluZz0iJHthbnQudmVyc2lvbn0iIHN1YnN0cmluZz0iJHthbnQucmVxdWlyZWRWZXJzaW9ufSI+PC9jb250YWlucz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbm90PgorICAgICAgICAgICAgICAgICAgICA8L2FuZD4KKyAgICAgICAgICAgICAgICA8L29yPgorICAgICAgICAgICAgPC9jb25kaXRpb24+CisgICAgICAgIDwvZmFpbD4KKyAgICA8L3RhcmdldD4KKworICAgIDwhLS0gYWRkIGJhY2sgaW4gaWYgd2UgbWFrZSAxLjcrIG1pbmltYWwgcmVxdWlyZWQgdmVyc2lvbiBmb3IgYnVpbGQgYWdhaW4KKyAgICAgICAgPHRhcmdldCBuYW1lPSItZW5zdXJlUmVxdWlyZWRBbnRWZXJzaW9uIj4KKyAgICAgICAgICAgPGZhaWwgbWVzc2FnZT0iWW91IGFyZSB1c2luZyBhbnQgJHthbnQudmVyc2lvbn0sIHBsZWFzZSBpbnN0YWxsIHVzaW5nIGFudCAke2FudC5yZXF1aXJlZFZlcnNpb259KyIvPgorICAgICAgICAgICAgICAgPGNvbmRpdGlvbj48bm90PjxhbnR2ZXJzaW9uIGF0bGVhc3Q9IiR7YW50LnJlcXVpcmVkVmVyc2lvbn0iLz48L25vdD48L2NvbmRpdGlvbj4KKyAgICAgICAgICAgPC9mYWlsPgorICAgICAgICA8L3RhcmdldD4KKyAgICAtLT4KKworICAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZU1haW4iIGRlcGVuZHM9InViZXJjb21waWxlLHN0YWdlZGNvbXBpbGUiCisgICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ29tcGlsZSB0aGUgSmF2YSBhbmQgR3Jvb3Z5IGNvZGUgaW4gdGhlIG1haW4gc291cmNlLiI+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InN0YWdlZGNvbXBpbGUiIGRlcGVuZHM9Ii1pbml0LC1pbmNsdWRlUmVzb3VyY2VzLGVuc3VyZUdyYW1tYXJzLC1qdm0xNEJ1aWxkV2FybmluZywtanZtMTVCdWlsZFdhcm5pbmciIHVubGVzcz0idWJlciI+CisgICAgICAgIDxta2RpciBkaXI9IiR7bWFpbkNsYXNzZXNEaXJlY3Rvcnl9Ii8+CisgICAgICAgIDxta2RpciBkaXI9IiR7dG9vbHNDbGFzc2VzRGlyZWN0b3J5fSIvPgorICAgICAgICA8amF2YWMgc3JjZGlyPSIke21haW5Tb3VyY2VEaXJlY3Rvcnl9IiBpbmNsdWRlYW50cnVudGltZT0iZmFsc2UiIGRlc3RkaXI9IiR7bWFpbkNsYXNzZXNEaXJlY3Rvcnl9IgorICAgICAgICAgICAgICAgZGVwcmVjYXRpb249Im9uIiBkZWJ1Zz0ieWVzIiBzb3VyY2U9IjEuNCIgdGFyZ2V0PSIxLjQiIGZvcms9InRydWUiIGNsYXNzcGF0aHJlZj0iY29tcGlsZVBhdGgiPgorICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovdm1wbHVnaW4vdjUvKioiIHVubGVzcz0iZ3Jvb3Z5LmJ1aWxkLnZtNSIvPgorICAgICAgICA8L2phdmFjPgorCisgICAgICAgIDxlY2hvIG1lc3NhZ2U9Ikdyb292eWMgb2YgbWFpbiBjb2RlLiIvPgorICAgICAgICA8dGFza2RlZiBuYW1lPSJncm9vdnljIiBjbGFzc25hbWU9Im9yZy5jb2RlaGF1cy5ncm9vdnkuYW50Lkdyb292eWMiIGNsYXNzcGF0aD0iJHttYWluQ2xhc3Nlc0RpcmVjdG9yeX0iCisgICAgICAgICAgICAgICAgIGNsYXNzcGF0aHJlZj0icnVudGltZVBhdGgiLz4KKyAgICAgICAgPGdyb292eWMgc3JjZGlyPSIke21haW5Tb3VyY2VEaXJlY3Rvcnl9IiBkZXN0ZGlyPSIke21haW5DbGFzc2VzRGlyZWN0b3J5fSIgY2xhc3NwYXRocmVmPSJjb21waWxlUGF0aCIvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJ1YmVyY29tcGlsZTpib290c3RyYXAiIGRlcGVuZHM9Ii1pbml0LC1pbmNsdWRlUmVzb3VyY2VzLGVuc3VyZUdyYW1tYXJzIiBpZj0idWJlciI+CisgICAgICAgIDxta2RpciBkaXI9IiR7bWFpbkNsYXNzZXNEaXJlY3Rvcnl9Ii8+CisKKyAgICAgICAgPGphdmFjIGRlc3RkaXI9IiR7bWFpbkNsYXNzZXNEaXJlY3Rvcnl9IgorICAgICAgICAgICAgICAgZGVwcmVjYXRpb249Im9uIgorICAgICAgICAgICAgICAgZGVidWc9InllcyIKKyAgICAgICAgICAgICAgIHNvdXJjZT0iMS40IgorICAgICAgICAgICAgICAgdGFyZ2V0PSIxLjQiCisgICAgICAgICAgICAgICBmb3JrPSJ0cnVlIgorICAgICAgICAgICAgICAgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIj4KKyAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9ImNvbXBpbGVQYXRoIi8+CisgICAgICAgICAgICA8c3JjIGxvY2F0aW9uPSIke21haW5Tb3VyY2VEaXJlY3Rvcnl9Ii8+CisKKyAgICAgICAgICAgIDwhLS0KKyAgICAgICAgICAgIE5PVEU6IFRoaXMgbGlzdCBpbmNsdWRlcyAqbW9zdCogb2YgdGhlIGNsYXNzZXMgd2hpY2ggYXJlIHJlcXVpcmVkIGZvciB0aGUgdWJlcmNvbXBpbGUKKyAgICAgICAgICAgICAgICAgIGJpdHMgdG8gd29yaywgYWRkaW5nIHRoZW0gaGVyZSB0byBhbGxvdyBmb3IgbW9yZSBpbmNyZW1lbnRhbCBjb21waWxhdGlvbiB3aGVuCisgICAgICAgICAgICAgICAgICByZXF1aXJlZCBzdXBwb3J0IGNsYXNzZXMgY2hhbmdlLgorICAgICAgICAgICAgLS0+CisKKyAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Imdyb292eS9sYW5nLyoqLyouamF2YSIvPgorICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2NvZGVoYXVzL2dyb292eS9hbnQvKiovKi5qYXZhIi8+CisgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudGxyLyoqLyouamF2YSIvPgorICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2NvZGVoYXVzL2dyb292eS9hc3QvKiovKi5qYXZhIi8+CisgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuLyoqLyouamF2YSIvPgorICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2NvZGVoYXVzL2dyb292eS9jb250cm9sLyoqLyouamF2YSIvPgorICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2NvZGVoYXVzL2dyb292eS9yZWZsZWN0aW9uLyoqLyouamF2YSIvPgorICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lLyoqLyouamF2YSIvPgorICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvKiovKi5qYXZhIi8+CisgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2phdmFjLyoqLyouamF2YSIvPgorICAgICAgICA8L2phdmFjPgorCisgICAgICAgIDx0YXNrZGVmIG5hbWU9InViZXJjb21waWxlIiBjbGFzc25hbWU9Im9yZy5jb2RlaGF1cy5ncm9vdnkuYW50LlViZXJDb21waWxlVGFzayI+CisgICAgICAgICAgICA8Y2xhc3NwYXRoPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHttYWluQ2xhc3Nlc0RpcmVjdG9yeX0iLz4KKyAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0iY29tcGlsZVBhdGgiLz4KKyAgICAgICAgICAgIDwvY2xhc3NwYXRoPgorICAgICAgICA8L3Rhc2tkZWY+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InViZXJjb21waWxlIiBkZXBlbmRzPSJ1YmVyY29tcGlsZTpib290c3RyYXAiIGlmPSJ1YmVyIj4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHttYWluU3R1YnNEaXJlY3Rvcnl9Ii8+CisKKyAgICAgICAgPHViZXJjb21waWxlIGRlc3RkaXI9IiR7bWFpbkNsYXNzZXNEaXJlY3Rvcnl9Ij4KKyAgICAgICAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke21haW5DbGFzc2VzRGlyZWN0b3J5fSIvPgorICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJjb21waWxlUGF0aCIvPgorICAgICAgICAgICAgPC9jbGFzc3BhdGg+CisgICAgICAgICAgICA8c3JjIGxvY2F0aW9uPSIke21haW5Tb3VyY2VEaXJlY3Rvcnl9Ii8+CisKKyAgICAgICAgICAgIDxnZW5lcmF0ZXN0dWJzIGRlc3RkaXI9IiR7bWFpblN0dWJzRGlyZWN0b3J5fSIgaW5jbHVkZXM9IioqLyouZ3Jvb3Z5Ij4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbiB0YXJnZXRCeXRlY29kZT0iMS40Ii8+CisgICAgICAgICAgICA8L2dlbmVyYXRlc3R1YnM+CisKKyAgICAgICAgICAgIDxqYXZhYyBpbmNsdWRlYW50cnVudGltZT0iZmFsc2UiIGRlcHJlY2F0aW9uPSJvbiIgZGVidWc9InllcyIgc291cmNlPSIxLjQiIHRhcmdldD0iMS40IiBmb3JrPSJ0cnVlIi8+CisgICAgICAgICAgICA8Z3Jvb3Z5YyBpbmNsdWRlcz0iKiovKi5ncm9vdnkiPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uIGRlYnVnPSJ0cnVlIiB2ZXJib3NlPSJ0cnVlIi8+CisgICAgICAgICAgICA8L2dyb292eWM+CisgICAgICAgIDwvdWJlcmNvbXBpbGU+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGVUZXN0IiBkZXBlbmRzPSJjb21waWxlTWFpbiIgdW5sZXNzPSJfc2tpcFRlc3RzXyIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDb21waWxlIHRoZSBKYXZhIGFuZCBHcm9vdnkgY29kZSBpbiB0aGUgdGVzdCBzb3VyY2UuIj4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHt0ZXN0Q2xhc3Nlc0RpcmVjdG9yeX0iLz4KKyAgICAgICAgPGFudGZvcmtlZCB0YXJnZXQ9InJlYWxDb21waWxlVGVzdCIvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJyZWFsQ29tcGlsZVRlc3QiPgorICAgICAgICA8dGFza2RlZiBuYW1lPSJncm9vdnljIiBjbGFzc25hbWU9Im9yZy5jb2RlaGF1cy5ncm9vdnkuYW50Lkdyb292eWMiIGNsYXNzcGF0aD0iJHttYWluQ2xhc3Nlc0RpcmVjdG9yeX0iCisgICAgICAgICAgICAgICAgIGNsYXNzcGF0aHJlZj0idGVzdFBhdGgiLz4KKyAgICAgICAgPCEtLSBjb21waWxlIEdyb292eSB0ZXN0IGZpbGVzIGV4Y2x1ZGluZyBvbmVzIHdoaWNoIHdlIHdhbnQgdG8gcGljayB1cCBmcm9tIHRoZSBmaWxlIHN5c3RlbSAtLT4KKyAgICAgICAgPGdyb292eWMgc3JjZGlyPSIke3Rlc3RTb3VyY2VEaXJlY3Rvcnl9IgorICAgICAgICAgICAgICAgICBkZXN0ZGlyPSIke3Rlc3RDbGFzc2VzRGlyZWN0b3J5fSIKKyAgICAgICAgICAgICAgICAgZXhjbHVkZXM9Im9yZy9jb2RlaGF1cy9ncm9vdnkvYW50LyoqL0dyb292eVRlc3QqLmdyb292eSxnbHMvKiovdm01LypUZXN0Lmdyb292eSIgPgorICAgICAgICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHttYWluQ2xhc3Nlc0RpcmVjdG9yeX0iLz4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHt0ZXN0Q2xhc3Nlc0RpcmVjdG9yeX0iLz4KKyAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0idGVzdFBhdGgiLz4KKyAgICAgICAgICAgIDwvY2xhc3NwYXRoPgorICAgICAgICAgICAgPGphdmFjIHNvdXJjZT0iMS40IiB0YXJnZXQ9IjEuNCIgZm9yaz0idHJ1ZSIgbWVtb3J5bWF4aW11bXNpemU9IjY0bSIvPgorICAgICAgICA8L2dyb292eWM+CisgICAgICAgIDxhbnRjYWxsIHRhcmdldD0icmVhbENvbXBpbGVUZXN0X3ZtNSIvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJyZWFsQ29tcGlsZVRlc3Rfdm01IiBpZj0iZ3Jvb3Z5LmJ1aWxkLnZtNSI+CisgICAgICAgIDxncm9vdnljIHNyY2Rpcj0iJHt0ZXN0U291cmNlRGlyZWN0b3J5fSIKKyAgICAgICAgICAgICAgICAgZGVzdGRpcj0iJHt0ZXN0Q2xhc3Nlc0RpcmVjdG9yeX0iCisgICAgICAgICAgICAgICAgIGluY2x1ZGVzPSJnbHMvKiovdm01LypUZXN0Lmdyb292eSIgPgorICAgICAgICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHttYWluQ2xhc3Nlc0RpcmVjdG9yeX0iLz4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHt0ZXN0Q2xhc3Nlc0RpcmVjdG9yeX0iLz4KKyAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0idGVzdFBhdGgiLz4KKyAgICAgICAgICAgIDwvY2xhc3NwYXRoPgorICAgICAgICAgICAgPGphdmFjIGZvcms9InRydWUiIG1lbW9yeW1heGltdW1zaXplPSI2NG0iLz4KKyAgICAgICAgPC9ncm9vdnljPgorCisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGVFeGFtcGxlcyIgZGVwZW5kcz0iY29tcGlsZU1haW4iIHVubGVzcz0iX3NraXBFeGFtcGxlc18iCisgICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ29tcGlsZSB0aGUgSmF2YSBhbmQgR3Jvb3Z5IGNvZGUgaW4gdGhlIGV4YW1wbGVzIHNvdXJjZSBkaXJlY3RvcnkuIj4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtleGFtcGxlc0NsYXNzZXNEaXJlY3Rvcnl9Ii8+CisgICAgICAgIDxlY2hvIG1lc3NhZ2U9IkNvbXBpbGluZyBleGFtcGxlIGNvZGUuIi8+CisgICAgICAgIDxhbnRmb3JrZWQgdGFyZ2V0PSJyZWFsQ29tcGlsZUV4YW1wbGVzIi8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InJlYWxDb21waWxlRXhhbXBsZXMiPgorICAgICAgICA8dGFza2RlZiBuYW1lPSJncm9vdnljIiBjbGFzc25hbWU9Im9yZy5jb2RlaGF1cy5ncm9vdnkuYW50Lkdyb292eWMiIGNsYXNzcGF0aD0iJHttYWluQ2xhc3Nlc0RpcmVjdG9yeX0iLz4KKyAgICAgICAgPGdyb292eWMgc3JjZGlyPSIke2V4YW1wbGVzU291cmNlRGlyZWN0b3J5fS93ZWJhcHBzL2dyb292bGV0LWV4YW1wbGVzL1dFQi1JTkYvZ3Jvb3Z5IgorICAgICAgICAgICAgICAgICBkZXN0ZGlyPSIke2V4YW1wbGVzQ2xhc3Nlc0RpcmVjdG9yeX0iPgorICAgICAgICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHttYWluQ2xhc3Nlc0RpcmVjdG9yeX0iLz4KKyAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0iY29tcGlsZVBhdGgiLz4KKyAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0iZXhhbXBsZXNQYXRoIi8+CisgICAgICAgICAgICA8L2NsYXNzcGF0aD4KKyAgICAgICAgPC9ncm9vdnljPgorICAgICAgICA8Z3Jvb3Z5YyBzcmNkaXI9IiR7ZXhhbXBsZXNTb3VyY2VEaXJlY3Rvcnl9IgorICAgICAgICAgICAgICAgIGRlc3RkaXI9IiR7ZXhhbXBsZXNDbGFzc2VzRGlyZWN0b3J5fSIKKyAgICAgICAgICAgICAgICBleGNsdWRlcz0id2ViYXBwcy9ncm9vdmxldC1leGFtcGxlcy9XRUItSU5GL2dyb292eS8qKiI+CisgICAgICAgICAgICA8Y2xhc3NwYXRoPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke21haW5DbGFzc2VzRGlyZWN0b3J5fSIvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2V4YW1wbGVzQ2xhc3Nlc0RpcmVjdG9yeX0iLz4KKyAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0iY29tcGlsZVBhdGgiLz4KKyAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0iZXhhbXBsZXNQYXRoIi8+CisgICAgICAgICAgICA8L2NsYXNzcGF0aD4KKyAgICAgICAgICAgIDxqYXZhYyBzb3VyY2U9IjEuNCIgdGFyZ2V0PSIxLjQiIGZvcms9InRydWUiIG1lbW9yeW1heGltdW1zaXplPSI2NG0iLz4KKyAgICAgICAgPC9ncm9vdnljPgorCisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9Ii1pbml0aWFsaXplUmVwb3J0cyI+CisgICAgICAgIDxta2RpciBkaXI9IiR7cmVwb3J0c0RpcmVjdG9yeX0iLz4KKyAgICA8L3RhcmdldD4KKworICAgIDxjb25kaXRpb24gcHJvcGVydHk9Il9zaG91bGRCZUhlYWRsZXNzXyI+CisgICAgICAgIDxvcj4KKyAgICAgICAgICAgIDxpc3RydWUgdmFsdWU9IiR7amF2YS5hd3QuaGVhZGxlc3N9Ii8+CisgICAgICAgICAgICA8b3MgbmFtZT0iTWFjIE9TIFgiLz4KKyAgICAgICAgPC9vcj4KKyAgICA8L2NvbmRpdGlvbj4KKworICAgIDx0YXJnZXQgbmFtZT0iLXRlc3RJbml0IiBkZXBlbmRzPSItaW5pdEhlYWRsZXNzIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImhlYWRsZXNzQXJnIiB2YWx1ZT0iIi8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJqdW5pdEp2bUFyZ3MiCisgICAgICAgICAgICAgICAgICB2YWx1ZT0iLVhtcyR7Z3Jvb3Z5SlVuaXRfbXN9IC1YWDpQZXJtU2l6ZT0ke2dyb292eUpVbml0X3Blcm1TaXplfSAtWFg6TWF4UGVybVNpemU9JHtncm9vdnlKVW5pdF9tYXhQZXJtU2l6ZX0gJHtoZWFkbGVzc0FyZ30iLz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iLWluaXRIZWFkbGVzcyIgaWY9Il9zaG91bGRCZUhlYWRsZXNzXyI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoZWFkbGVzc0FyZyIgdmFsdWU9Ii1EamF2YS5hd3QuaGVhZGxlc3M9dHJ1ZSIvPgorICAgICAgICA8ZWNobyBtZXNzYWdlPSJTZXR0aW5nIGhlYWRsZXNzIG1vZGUgLi4uIi8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InRlc3QiCisgICAgICAgICAgICBkZXBlbmRzPSItY2hlY2tBbnRWZXJzaW9uLC1pbml0aWFsaXplUmVwb3J0cyxjb21waWxlVGVzdCwtY292ZXJhZ2VJbnN0cnVtZW50LC10ZXN0SW5pdCwtdGVzdE9uZSwtdGVzdEFsbCIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDb21waWxlIGFuZCB0ZXN0IGFsbCB0aGUgY2xhc3NlcyAob3IganVzdCBvbmUgY2xhc3MgaWYgdGVzdENhc2UgcHJvcGVydHkgaXMgZGVmaW5lZCkuIi8+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImNsZWFuLXRlc3QiIGRlcGVuZHM9ImNsZWFuLHRlc3QiCisgICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ2xlYW4gYW5kIGNvbXBpbGUgYW5kIHRlc3QgYWxsIHRoZSBjbGFzc2VzIChvciBqdXN0IG9uZSBjbGFzcyBpZiB0ZXN0Q2FzZSBwcm9wZXJ0eSBpcyBkZWZpbmVkKS4iLz4KKworICAgIDxjb25kaXRpb24gcHJvcGVydHk9Il90ZXN0T25lXyI+CisgICAgICAgIDxhbmQ+CisgICAgICAgICAgICA8bm90PgorICAgICAgICAgICAgICAgIDxpc3RydWUgdmFsdWU9IiR7X3NraXBUZXN0c199Ii8+CisgICAgICAgICAgICA8L25vdD4KKyAgICAgICAgICAgIDxpc3NldCBwcm9wZXJ0eT0idGVzdENhc2UiLz4KKyAgICAgICAgPC9hbmQ+CisgICAgPC9jb25kaXRpb24+CisKKyAgICA8dGFyZ2V0IG5hbWU9Ii10ZXN0T25lIiBpZj0iX3Rlc3RPbmVfIj4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtqdW5pdFJhd0RpcmVjdG9yeX0iLz4KKyAgICAgICAgPGp1bml0IHByaW50c3VtbWFyeT0idHJ1ZSIgZm9yaz0idHJ1ZSIgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIiBoYWx0b25mYWlsdXJlPSJ5ZXMiCisgICAgICAgICAgICAgICBtYXhtZW1vcnk9IiR7Z3Jvb3Z5SlVuaXRfbXh9IiBkaXI9IiR7YmFzZWRpcn0iPgorICAgICAgICAgICAgPGp2bWFyZyBsaW5lPSIke2p1bml0SnZtQXJnc30iLz4KKyAgICAgICAgICAgIDx0ZXN0IG5hbWU9IiR7dGVzdENhc2V9IiB0b2Rpcj0iJHtqdW5pdFJhd0RpcmVjdG9yeX0iLz4KKyAgICAgICAgICAgIDxmb3JtYXR0ZXIgdHlwZT0iYnJpZWYiIHVzZWZpbGU9ImZhbHNlIi8+CisgICAgICAgICAgICA8Y2xhc3NwYXRoPgorICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJ0ZXN0UGF0aCIvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2luc3RydW1lbnRlZENsYXNzZXNEaXJlY3Rvcnl9Ii8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7bWFpbkNsYXNzZXNEaXJlY3Rvcnl9Ii8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7dGVzdENsYXNzZXNEaXJlY3Rvcnl9Ii8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9InNyYy90ZXN0Ii8+CisgICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9ImNvYmVydHVyYVBhdGgiLz4KKyAgICAgICAgICAgIDwvY2xhc3NwYXRoPgorICAgICAgICA8L2p1bml0PgorICAgIDwvdGFyZ2V0PgorCisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iX3Rlc3RBbGxfIj4KKyAgICAgICAgPGFuZD4KKyAgICAgICAgICAgIDxub3Q+CisgICAgICAgICAgICAgICAgPGlzdHJ1ZSB2YWx1ZT0iJHtfc2tpcFRlc3RzX30iLz4KKyAgICAgICAgICAgIDwvbm90PgorICAgICAgICAgICAgPG5vdD4KKyAgICAgICAgICAgICAgICA8aXNzZXQgcHJvcGVydHk9Il90ZXN0T25lXyIvPgorICAgICAgICAgICAgPC9ub3Q+CisgICAgICAgIDwvYW5kPgorICAgIDwvY29uZGl0aW9uPgorCisgICAgPHRhcmdldCBuYW1lPSItY29sbGVjdDE0dGVzdHMiIHVubGVzcz0iZ3Jvb3Z5LmJ1aWxkLnZtNSI+CisgICAgICAgIDxmaWxlc2V0IGlkPSJ1YmVydGVzdHMuZmlsZXNldCIgZGlyPSIke3Rlc3RDbGFzc2VzRGlyZWN0b3J5fSIgaW5jbHVkZXM9IlViZXJUZXN0Ki5jbGFzcyIgZXhjbHVkZXM9IlViZXIqVk01LmNsYXNzIi8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9Ii1jb2xsZWN0MTV0ZXN0cyIgaWY9Imdyb292eS5idWlsZC52bTUiPgorICAgICAgICA8ZmlsZXNldCBpZD0idWJlcnRlc3RzLmZpbGVzZXQiIGRpcj0iJHt0ZXN0Q2xhc3Nlc0RpcmVjdG9yeX0iIGluY2x1ZGVzPSJVYmVyVGVzdCouY2xhc3MiLz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iLXRlc3RBbGwiIGlmPSJfdGVzdEFsbF8iIGRlcGVuZHM9Ii1jb2xsZWN0MTR0ZXN0cywtY29sbGVjdDE1dGVzdHMiPgorICAgICAgICA8bWtkaXIgZGlyPSIke2p1bml0UmF3RGlyZWN0b3J5fSIvPgorICAgICAgICA8anVuaXQgcHJpbnRzdW1tYXJ5PSJ0cnVlIiBmb3JrPSJ0cnVlIiBpbmNsdWRlYW50cnVudGltZT0iZmFsc2UiIGZhaWx1cmVwcm9wZXJ0eT0idGVzdEZhaWxlZCIKKyAgICAgICAgICAgICAgIG1heG1lbW9yeT0iJHtncm9vdnlKVW5pdF9teH0iIGRpcj0iJHtiYXNlZGlyfSI+CisgICAgICAgICAgICA8anZtYXJnIGxpbmU9IiR7anVuaXRKdm1BcmdzfSIvPgorICAgICAgICAgICAgPGZvcm1hdHRlciB0eXBlPSJ4bWwiLz4KKyAgICAgICAgICAgIDxmb3JtYXR0ZXIgdHlwZT0icGxhaW4iIHVubGVzcz0ibm9UZXh0UmVwb3J0cyIvPgorICAgICAgICAgICAgPGJhdGNodGVzdCB0b2Rpcj0iJHtqdW5pdFJhd0RpcmVjdG9yeX0iPgorICAgICAgICAgICAgICAgIDxmaWxlc2V0IHJlZmlkPSJ1YmVydGVzdHMuZmlsZXNldCIvPgorICAgICAgICAgICAgPC9iYXRjaHRlc3Q+CisgICAgICAgICAgICA8Y2xhc3NwYXRoPgorICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJ0ZXN0UGF0aCIvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2luc3RydW1lbnRlZENsYXNzZXNEaXJlY3Rvcnl9Ii8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7bWFpbkNsYXNzZXNEaXJlY3Rvcnl9Ii8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7dGVzdENsYXNzZXNEaXJlY3Rvcnl9Ii8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9InNyYy90ZXN0Ii8+CisgICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9ImNvYmVydHVyYVBhdGgiLz4KKyAgICAgICAgICAgIDwvY2xhc3NwYXRoPgorICAgICAgICA8L2p1bml0PgorICAgICAgICA8bWtkaXIgZGlyPSIke2p1bml0UmVwb3J0c0RpcmVjdG9yeX0iLz4KKyAgICAgICAgPGp1bml0cmVwb3J0IHRvZmlsZT0iJHtqdW5pdFJhd0RpcmVjdG9yeX0vUmVzdWx0cy54bWwiPgorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2p1bml0UmF3RGlyZWN0b3J5fSIgaW5jbHVkZXM9IlRFU1QtKi54bWwiLz4KKyAgICAgICAgICAgIDxyZXBvcnQgZm9ybWF0PSJmcmFtZXMiIHRvZGlyPSIke2p1bml0UmVwb3J0c0RpcmVjdG9yeX0iLz4KKyAgICAgICAgPC9qdW5pdHJlcG9ydD4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iLXJlcG9ydFRlc3RGYWlsZWQiIGRlcGVuZHM9InRlc3QsLWNvdmVyYWdlUmVwb3J0IiBpZj0idGVzdEZhaWxlZCI+CisgICAgICAgIDxmYWlsIG1lc3NhZ2U9IlRlc3QgZmFpbGVkLCBub3QgcHJvY2Vzc2luZyBmdXJ0aGVyIHRhcmdldHMuIi8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9Ii1jb3ZlcmFnZUluc3RydW1lbnQiIGRlcGVuZHM9Ii1pbml0Q292ZXJhZ2UsLWNvYmVydHVyYUluaXQiIGlmPSJfZm9yY2VDb3ZlcmFnZV8iPgorICAgICAgICA8bWtkaXIgZGlyPSIke2luc3RydW1lbnRlZENsYXNzZXNEaXJlY3Rvcnl9Ii8+CisgICAgICAgIDxjb2JlcnR1cmFJbnN0cnVtZW50IGNsYXNzZXNEaXJlY3Rvcnk9IiR7bWFpbkNsYXNzZXNEaXJlY3Rvcnl9Ii8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9Ii1jb3ZlcmFnZVJlcG9ydCIgZGVwZW5kcz0iLWluaXRDb3ZlcmFnZSIgaWY9Il9mb3JjZUNvdmVyYWdlXyI+CisgICAgICAgIDxjb2JlcnR1cmFSZXBvcnQgcmVwb3J0RGlyZWN0b3J5PSIke3JlcG9ydHNEaXJlY3Rvcnl9L2NvYmVydHVyYSIgc291cmNlRGlyZWN0b3J5PSIke21haW5Tb3VyY2VEaXJlY3Rvcnl9Ii8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9Ii1hY3R1YWxseUNyZWF0ZUphcnMiCisgICAgICAgICAgICBkZXBlbmRzPSItbWFrZU1hbmlmZXN0LC1pbml0aWFsaXplSmFycywtY3JlYXRlQmFzZUphciwtY3JlYXRlRW1iZWRkYWJsZUphciIKKyAgICAgICAgICAgIHVubGVzcz0idGVzdEZhaWxlZCIvPgorCisgICAgPHRhcmdldCBuYW1lPSItbWFrZU1hbmlmZXN0Ij4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHttYWluQ2xhc3Nlc0RpcmVjdG9yeX0vTUVUQS1JTkYiLz4KKyAgICAgICAgPGNvcHkgdG9kaXI9IiR7bWFpbkNsYXNzZXNEaXJlY3Rvcnl9L01FVEEtSU5GIiBmaWxlPSJMSUNFTlNFLnR4dCIvPgorICAgICAgICA8bWFuaWZlc3QgZmlsZT0iJHttYWluQ2xhc3Nlc0RpcmVjdG9yeX0vTUVUQS1JTkYvTUFOSUZFU1QuTUYiPgorICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJCdWlsdC1CeSIgdmFsdWU9IiR7dXNlci5uYW1lfSIvPgorICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJFeHRlbnNpb24tTmFtZSIgdmFsdWU9Imdyb292eSIvPgorICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJTcGVjaWZpY2F0aW9uLVRpdGxlIiB2YWx1ZT0iR3Jvb3Z5OiBhIHBvd2VyZnVsLCBkeW5hbWljIGxhbmd1YWdlIGZvciB0aGUgSlZNIi8+CisgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IlNwZWNpZmljYXRpb24tVmVyc2lvbiIgdmFsdWU9IiR7Z3Jvb3Z5VmVyc2lvbn0iLz4KKyAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iU3BlY2lmaWNhdGlvbi1WZW5kb3IiIHZhbHVlPSJUaGUgQ29kZWhhdXMiLz4KKyAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iSW1wbGVtZW50YXRpb24tVGl0bGUiIHZhbHVlPSJHcm9vdnk6IGEgcG93ZXJmdWwsIGR5bmFtaWMgbGFuZ3VhZ2UgZm9yIHRoZSBKVk0iLz4KKyAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iSW1wbGVtZW50YXRpb24tVmVyc2lvbiIgdmFsdWU9IiR7Z3Jvb3Z5VmVyc2lvbn0iLz4KKyAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iSW1wbGVtZW50YXRpb24tVmVuZG9yIiB2YWx1ZT0iVGhlIENvZGVoYXVzIi8+CisgICAgICAgIDwvbWFuaWZlc3Q+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9Ii1pbmNsdWRlUmVzb3VyY2VzIiBkZXBlbmRzPSItaW5jbHVkZUdyb292eURvY1RlbXBsYXRlcyI+CisgICAgICAgIDxjb3B5IHRvZGlyPSIke21haW5DbGFzc2VzRGlyZWN0b3J5fSI+CisgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7bWFpblNvdXJjZURpcmVjdG9yeX0iPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Imdyb292eS91aS8qLnByb3BlcnRpZXMiLz4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJncm9vdnkvdWkvKiovKi5wbmciLz4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsLyoqLyoucHJvcGVydGllcyIvPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvKiovKi54bWwiLz4KKyAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgPC9jb3B5PgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSItaW5jbHVkZUdyb292eURvY1RlbXBsYXRlcyI+CisgICAgICAgIDxjb3B5IHRvZGlyPSIke21haW5DbGFzc2VzRGlyZWN0b3J5fSI+CisgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7bWFpblNvdXJjZURpcmVjdG9yeX0iPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvZ3Jvb3Z5ZG9jL2dzdHJpbmctdGVtcGxhdGVzLyoqLyouKiIvPgorICAgICAgICAgICAgPC9maWxlc2V0PgorICAgICAgICA8L2NvcHk+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9Ii1pbml0aWFsaXplSmFycyIgZGVwZW5kcz0idGVzdCI+CisgICAgICAgIDxta2RpciBkaXI9IiR7dGFyZ2V0RGlzdERpcmVjdG9yeX0iLz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iLWNyZWF0ZUJhc2VKYXIiIHVubGVzcz0idGVzdEZhaWxlZCI+CisgICAgICAgIDxqYXIgZGVzdGZpbGU9IiR7dGFyZ2V0RGlzdERpcmVjdG9yeX0vZ3Jvb3Z5LSR7Z3Jvb3Z5VmVyc2lvbn0uamFyIiBiYXNlZGlyPSIke21haW5DbGFzc2VzRGlyZWN0b3J5fSIKKyAgICAgICAgICAgICBleGNsdWRlcz0iKi5ncm9vdnkiIG1hbmlmZXN0PSIke21haW5DbGFzc2VzRGlyZWN0b3J5fS9NRVRBLUlORi9NQU5JRkVTVC5NRiIvPgorICAgICAgICA8amFyIGRlc3RmaWxlPSIke3RhcmdldERpc3REaXJlY3Rvcnl9L2dyb292eS0ke2dyb292eVZlcnNpb259LXNvdXJjZXMuamFyIiBiYXNlZGlyPSIke21haW5Tb3VyY2VEaXJlY3Rvcnl9Ii8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9Ii1qYXJqYXJJbml0Ij4KKyAgICAgICAgPHRhc2tkZWYgbmFtZT0iamFyamFyIiBjbGFzc25hbWU9ImNvbS50b25pY3N5c3RlbXMuamFyamFyLkphckphclRhc2siIGNsYXNzcGF0aHJlZj0idG9vbHNQYXRoIi8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9Ii1jcmVhdGVFbWJlZGRhYmxlSmFyIiBkZXBlbmRzPSItamFyamFySW5pdCIgdW5sZXNzPSJ0ZXN0RmFpbGVkIj4KKyAgICAgICAgPGRlbGV0ZSBkaXI9IiR7c3RhZ2luZ0RpcmVjdG9yeX0iIHF1aWV0PSJ0cnVlIi8+CisgICAgICAgIDxta2RpciBkaXI9IiR7c3RhZ2luZ0RpcmVjdG9yeX0iLz4KKyAgICAgICAgPHVuemlwIGRlc3Q9IiR7c3RhZ2luZ0RpcmVjdG9yeX0iPgorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3J1bnRpbWVMaWJEaXJlY3Rvcnl9Ij4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJhbnRsciouamFyIi8+CisgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iYXNtKi5qYXIiLz4KKyAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJhc20tYXR0ciouamFyIi8+CisgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iYXNtLXV0aWwqLmphciIvPgorICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9ImFzbS1hbmFseXNpcyouamFyIi8+CisgICAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgIDwvdW56aXA+CisgICAgICAgIDx1bnppcCBkZXN0PSIke3N0YWdpbmdEaXJlY3Rvcnl9Ij4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHt0YXJnZXREaXN0RGlyZWN0b3J5fSI+CisgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iZ3Jvb3Z5LSR7Z3Jvb3Z5VmVyc2lvbn0uamFyIi8+CisgICAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgIDwvdW56aXA+CisgICAgICAgIDxjb3B5IHRvRGlyPSIke3N0YWdpbmdEaXJlY3Rvcnl9L01FVEEtSU5GIj4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfSI+CisgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iQVNNLUxJQ0VOU0UudHh0Ii8+CisgICAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgIDwvY29weT4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHt0YXJnZXREaXN0RGlyZWN0b3J5fSIvPgorICAgICAgICA8amFyamFyIGphcmZpbGU9IiR7dGFyZ2V0RGlzdERpcmVjdG9yeX0vZ3Jvb3Z5LWFsbC1taW5pbWFsLSR7Z3Jvb3Z5VmVyc2lvbn0uamFyIgorICAgICAgICAgICAgICAgIG1hbmlmZXN0PSIke3N0YWdpbmdEaXJlY3Rvcnl9L01FVEEtSU5GL01BTklGRVNULk1GIj4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzdGFnaW5nRGlyZWN0b3J5fSIvPgorICAgICAgICAgICAgPHJ1bGUgcGF0dGVybj0iYW50bHIuKioiIHJlc3VsdD0iZ3Jvb3Z5amFyamFyYW50bHIuQDEiLz4KKyAgICAgICAgICAgIDxydWxlIHBhdHRlcm49Im9yZy5vYmplY3R3ZWIuKioiIHJlc3VsdD0iZ3Jvb3Z5amFyamFyYXNtLkAxIi8+CisgICAgICAgIDwvamFyamFyPgorICAgICAgICA8IS0tIGFkZCBjb21tb25zLWNsaSAtLT4KKyAgICAgICAgPHVuemlwIGRlc3Q9IiR7c3RhZ2luZ0RpcmVjdG9yeX0iPgorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3J1bnRpbWVMaWJEaXJlY3Rvcnl9Ij4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb21tb25zLWNsaS0qLmphciIvPgorICAgICAgICAgICAgPC9maWxlc2V0PgorICAgICAgICA8L3VuemlwPgorICAgICAgICA8amFyamFyIGphcmZpbGU9IiR7dGFyZ2V0RGlzdERpcmVjdG9yeX0vZ3Jvb3Z5LWFsbC0ke2dyb292eVZlcnNpb259LmphciIKKyAgICAgICAgICAgICAgICBtYW5pZmVzdD0iJHtzdGFnaW5nRGlyZWN0b3J5fS9NRVRBLUlORi9NQU5JRkVTVC5NRiI+CisgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7c3RhZ2luZ0RpcmVjdG9yeX0iIGV4Y2x1ZGVzPSJncm9vdnkvdXRpbC9DbGlCdWlsZGVyKi5jbGFzcyxncm9vdnkvdXRpbC9PcHRpb25BY2Nlc3NvciouY2xhc3MiLz4KKyAgICAgICAgICAgIDxydWxlIHBhdHRlcm49ImFudGxyLioqIiByZXN1bHQ9Imdyb292eWphcmphcmFudGxyLkAxIi8+CisgICAgICAgICAgICA8cnVsZSBwYXR0ZXJuPSJvcmcub2JqZWN0d2ViLioqIiByZXN1bHQ9Imdyb292eWphcmphcmFzbS5AMSIvPgorICAgICAgICAgICAgPHJ1bGUgcGF0dGVybj0ib3JnLmFwYWNoZS5jb21tb25zLmNsaS4qKiIgcmVzdWx0PSJncm9vdnlqYXJqYXJjb21tb25zY2xpLkAxIi8+CisgICAgICAgIDwvamFyamFyPgorICAgICAgICA8amFyIGRlc3RmaWxlPSIke3RhcmdldERpc3REaXJlY3Rvcnl9L2dyb292eS1hbGwtJHtncm9vdnlWZXJzaW9ufS5qYXIiIHVwZGF0ZT0idHJ1ZSIKKyAgICAgICAgICAgICBiYXNlZGlyPSIke3N0YWdpbmdEaXJlY3Rvcnl9IiBpbmNsdWRlcz0iZ3Jvb3Z5L3V0aWwvQ2xpQnVpbGRlciouY2xhc3MsZ3Jvb3Z5L3V0aWwvT3B0aW9uQWNjZXNzb3IqLmNsYXNzIi8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7dGFyZ2V0RGlzdERpcmVjdG9yeX0vZ3Jvb3Z5LSR7Z3Jvb3Z5VmVyc2lvbn0tc291cmNlcy5qYXIiCisgICAgICAgICAgICAgIHRvZmlsZT0iJHt0YXJnZXREaXN0RGlyZWN0b3J5fS9ncm9vdnktYWxsLSR7Z3Jvb3Z5VmVyc2lvbn0tc291cmNlcy5qYXIiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHt0YXJnZXREaXN0RGlyZWN0b3J5fS9ncm9vdnktYWxsLSR7Z3Jvb3Z5VmVyc2lvbn0tc291cmNlcy5qYXIiCisgICAgICAgICAgICAgIHRvZmlsZT0iJHt0YXJnZXREaXN0RGlyZWN0b3J5fS9ncm9vdnktYWxsLW1pbmltYWwtJHtncm9vdnlWZXJzaW9ufS1zb3VyY2VzLmphciIvPgorICAgICAgICA8ZGVsZXRlIGRpcj0iJHtzdGFnaW5nRGlyZWN0b3J5fSIgcXVpZXQ9InRydWUiLz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iY3JlYXRlSmFycyIgZGVwZW5kcz0iLWNoZWNrQW50VmVyc2lvbiwtcmVwb3J0VGVzdEZhaWxlZCwtYWN0dWFsbHlDcmVhdGVKYXJzIgorICAgICAgICAgICAgZGVzY3JpcHRpb249IkJ1aWxkIEdyb292eSBhbmQgY3JlYXRlIHRoZSBqYXJmaWxlcy4iLz4KKworICAgIDx0YXJnZXQgbmFtZT0iaW5zdGFsbCIgZGVwZW5kcz0iY3JlYXRlSmFycyIgdW5sZXNzPSJ0ZXN0RmFpbGVkIgorICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBhbiBpbnN0YWxsYXRpb24gaGllcmFyY2h5IGluIHRhcmdldC9pbnN0YWxsLiI+CisKKyAgICAgICAgPCEtLQorICAgICAgICBGSVhNRTogSXRzIG5vdCByZWFsbHkgYSBnb29kIGlkZWEgdG8gZGVsZXRlIHN0dWZmLCBhcyBpdCB0ZW5kcyB0byBuZWdhdGUgQW50J3MgKG9yIG90aGVyIHRvb2xzKQorICAgICAgICAgICAgICAgYWJpbGl0eSB0byBydW4gZmFzdGVyIGluY3JlbWVudGFsIGJ1aWxkcy4KKyAgICAgICAgLS0+CisgICAgICAgIDxkZWxldGUgZGlyPSIke2luc3RhbGxEaXJlY3Rvcnl9IiBxdWlldD0idHJ1ZSIvPgorICAgICAgICA8bWtkaXIgZGlyPSIke2luc3RhbGxEaXJlY3Rvcnl9Ii8+CisKKyAgICAgICAgPCEtLSBJbnN0YWxsIGxpY2Vuc2UgZmlsZXMgLS0+CisgICAgICAgIDxjb3B5IHRvZGlyPSIke2luc3RhbGxEaXJlY3Rvcnl9Ij4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfSI+CisgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTElDRU5TRS50eHQiLz4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJBU00tTElDRU5TRS50eHQiLz4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJOT1RJQ0UudHh0Ii8+CisgICAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgIDwvY29weT4KKyAgICAgICAgPGZpeGNybGYgc3JjZGlyPSIke2luc3RhbGxEaXJlY3Rvcnl9IiBlb2w9ImNybGYiIGluY2x1ZGVzPSIqLnR4dCIvPgorCisgICAgICAgIDwhLS0gSW5zdGFsbCBnZW5lcmF0ZWQgYXJ0aWZhY3RzIGFuZCBydW50aW1lIGRlcGVuZGVuY2llcyAtLT4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtpbnN0YWxsRGlyZWN0b3J5fS9saWIiLz4KKyAgICAgICAgPGNvcHkgdG9kaXI9IiR7aW5zdGFsbERpcmVjdG9yeX0vbGliIj4KKyAgICAgICAgICAgIDxmaWxlc2V0IGZpbGU9IiR7dGFyZ2V0RGlzdERpcmVjdG9yeX0vZ3Jvb3Z5LSR7Z3Jvb3Z5VmVyc2lvbn0uamFyIi8+CisgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7cnVudGltZUxpYkRpcmVjdG9yeX0iIGluY2x1ZGVzPSIqLmphciIvPgorICAgICAgICA8L2NvcHk+CisKKyAgICAgICAgPCEtLSBJbnN0YWxsIHRoZSBlbWJlZGRhYmxlIGJpdHMgLS0+CisgICAgICAgIDxta2RpciBkaXI9IiR7aW5zdGFsbERpcmVjdG9yeX0vZW1iZWRkYWJsZSIvPgorICAgICAgICA8Y29weSB0b2Rpcj0iJHtpbnN0YWxsRGlyZWN0b3J5fS9lbWJlZGRhYmxlIj4KKyAgICAgICAgICAgIDxmaWxlc2V0IGZpbGU9IiR7dGFyZ2V0RGlzdERpcmVjdG9yeX0vZ3Jvb3Z5LWFsbC0ke2dyb292eVZlcnNpb259LmphciIvPgorICAgICAgICA8L2NvcHk+CisKKyAgICAgICAgPCEtLSBJbnN0YWxsIGNvbmZpZ3VyYXRpb24gZmlsZXMgLS0+CisgICAgICAgIDxta2RpciBkaXI9IiR7aW5zdGFsbERpcmVjdG9yeX0vY29uZiIvPgorICAgICAgICA8Y29weSB0b0Rpcj0iJHtpbnN0YWxsRGlyZWN0b3J5fS9jb25mIj4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzb3VyY2VEaXJlY3Rvcnl9L2NvbmYiIGluY2x1ZGVzPSIqIi8+CisgICAgICAgIDwvY29weT4KKworICAgICAgICA8IS0tIEluc3RhbGwgc2NyaXB0cyAtLT4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtpbnN0YWxsRGlyZWN0b3J5fS9iaW4iLz4KKyAgICAgICAgPGNvcHkgdG9EaXI9IiR7aW5zdGFsbERpcmVjdG9yeX0vYmluIj4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzb3VyY2VEaXJlY3Rvcnl9L2JpbiIgaW5jbHVkZXM9IioiLz4KKyAgICAgICAgICAgIDxmaWx0ZXJzZXQ+CisgICAgICAgICAgICAgICAgPGZpbHRlciB0b2tlbj0iR1JPT1ZZSkFSIiB2YWx1ZT0iZ3Jvb3Z5LSR7Z3Jvb3Z5VmVyc2lvbn0uamFyIi8+CisgICAgICAgICAgICA8L2ZpbHRlcnNldD4KKyAgICAgICAgPC9jb3B5PgorCisgICAgICAgIDwhLS0gVHdlYWsgc2NyaXB0cyBmb3IgcGxhdGZvcm0gY29tcGF0aWJpbGl0eSAtLT4KKyAgICAgICAgPGZpeGNybGYgc3JjZGlyPSIke2luc3RhbGxEaXJlY3Rvcnl9L2JpbiIgZW9sPSJsZiIgZXhjbHVkZXM9IiouYmF0Ii8+CisgICAgICAgIDxmaXhjcmxmIHNyY2Rpcj0iJHtpbnN0YWxsRGlyZWN0b3J5fS9iaW4iIGVvbD0iY3JsZiIgaW5jbHVkZXM9IiouYmF0Ii8+CisgICAgICAgIDxjaG1vZCBwZXJtPSJ1Z28reCI+CisgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7aW5zdGFsbERpcmVjdG9yeX0vYmluIiBpbmNsdWRlcz0iKiwqLioiLz4KKyAgICAgICAgPC9jaG1vZD4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iY2hlY2tzdHlsZSIgZGVwZW5kcz0iLWluaXQsLWluaXRpYWxpemVSZXBvcnRzLC1jaGVja3N0eWxlSW5pdCIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgdGhlIGNvZGUgc3R5bGUgcmVwb3J0cy4iPgorICAgICAgICA8Y2hlY2tBbmRSZXBvcnQKKyAgICAgICAgICAgICAgICByZXBvcnREaXJlY3Rvcnk9IiR7cmVwb3J0c0RpcmVjdG9yeX0vY2hlY2tzdHlsZSIKKyAgICAgICAgICAgICAgICBzb3VyY2VEaXJlY3Rvcnk9IiR7bWFpblNvdXJjZURpcmVjdG9yeX0iCisgICAgICAgICAgICAgICAgZXhjbHVkZXM9Im9yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvcGFyc2VyLyosb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci9qYXZhLyosb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvVHlwZXMuamF2YSI+CisgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHttYWluQ2xhc3Nlc0RpcmVjdG9yeX0iLz4KKyAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0idGVzdFBhdGgiLz4KKyAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgPC9jaGVja0FuZFJlcG9ydD4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iLWNvbXBpbGVUb29scyIgZGVwZW5kcz0iY29tcGlsZU1haW4iPgorICAgICAgICA8ZWNobyBtZXNzYWdlPSJHcm9vdnljIG9mIHRvb2xzIGNvZGUuIi8+CisgICAgICAgIDxqYXZhIGNsYXNzbmFtZT0ib3JnLmNvZGVoYXVzLmdyb292eS5hbnQuR3Jvb3Z5YyIgZm9yaz0idHJ1ZSI+CisgICAgICAgICAgICA8Y2xhc3NwYXRoPgorICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJ0b29sc1BhdGgiLz4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHttYWluQ2xhc3Nlc0RpcmVjdG9yeX0iLz4KKyAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0iY29tcGlsZVBhdGgiLz4KKyAgICAgICAgICAgIDwvY2xhc3NwYXRoPgorICAgICAgICAgICAgPGFyZyB2YWx1ZT0iJHt0b29sc0NsYXNzZXNEaXJlY3Rvcnl9Ii8+CisgICAgICAgICAgICA8YXJnIHZhbHVlPSIke3Rvb2xzU291cmNlRGlyZWN0b3J5fSIvPgorICAgICAgICA8L2phdmE+CisgICAgICAgIDxjb3B5IHRvZGlyPSIke3Rvb2xzQ2xhc3Nlc0RpcmVjdG9yeX0iPgorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3Rvb2xzU291cmNlRGlyZWN0b3J5fSI+CisgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5odG1sIi8+CisgICAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgIDwvY29weT4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iYnVpbGRpbmZvIj4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtjcnVpc2VSZXBvcnRSb290RGlyZWN0b3J5fSIvPgorICAgICAgICA8Y29weSB0b2Rpcj0iJHtjcnVpc2VSZXBvcnRSb290RGlyZWN0b3J5fSI+CisgICAgICAgICAgICA8ZmlsZXNldCBkaXI9ImNvbmZpZy9idWlsZCIvPgorICAgICAgICA8L2NvcHk+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImNydWlzZUluaXQiPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ibm9UZXh0UmVwb3J0cyIgdmFsdWU9InRydWUiLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImZvcmNlQ292ZXJhZ2UiIHZhbHVlPSJ0cnVlIi8+CisgICAgICAgIDxkZWxldGUgZGlyPSIke3JlcG9ydHNEaXJlY3Rvcnl9IiBxdWlldD0idHJ1ZSIgZmFpbG9uZXJyb3I9ImZhbHNlIi8+CisgICAgICAgIDxkZWxldGUgZGlyPSIke2p1bml0UmF3RGlyZWN0b3J5fSIgcXVpZXQ9InRydWUiIGZhaWxvbmVycm9yPSJmYWxzZSIvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJjcnVpc2UiIGRlcGVuZHM9ImNydWlzZUluaXQsZGlzdHJpYnV0aW9uLGNvbXBpbGVFeGFtcGxlcyxjaGVja3N0eWxlLGJ1aWxkaW5mbyIvPgorCisgICAgPHRhcmdldCBuYW1lPSItZG9jSW5pdCI+CisgICAgICAgIDxta2RpciBkaXI9IiR7ZG9jc0RpcmVjdG9yeX0iLz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iZG9jIiBkZXBlbmRzPSJqYXZhZG9jLCBncm9vdnlkb2MiIGRlc2NyaXB0aW9uPSJDcmVhdGUgdGhlIGRvY3VtZW50YXRpb24uIi8+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImphdmFkb2MiIGRlcGVuZHM9Ii1mZXRjaERlcGVuZGVuY2llcywtZG9jSW5pdCIgZGVzY3JpcHRpb249IkNyZWF0ZSB0aGUgamF2YWRvYyBkb2N1bWVudGF0aW9uLiI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0aXRsZSIgdmFsdWU9Ikdyb292eSIvPgorICAgICAgICA8amF2YWRvYyBkZXN0ZGlyPSIke2RvY3NEaXJlY3Rvcnl9L2FwaSIgYXV0aG9yPSJ0cnVlIiB2ZXJzaW9uPSJ0cnVlIgorICAgICAgICAgICAgICAgICB3aW5kb3d0aXRsZT0iJHt0aXRsZX0gKCR7Z3Jvb3Z5VmVyc2lvbn0pIiBkb2N0aXRsZT0iJHt0aXRsZX0gKCR7Z3Jvb3Z5VmVyc2lvbn0pIgorICAgICAgICAgICAgICAgICBlbmNvZGluZz0iSVNPLTg4NTktMSIgdXNlZXh0ZXJuYWxmaWxlPSJ0cnVlIiBzb3VyY2U9IjEuNCIKKyAgICAgICAgICAgICAgICAgZm9vdGVyPSJDb3B5cmlnaHQgJmFtcDtjb3B5OyAyMDAzLTIwMDcgVGhlIENvZGVoYXVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiI+CisgICAgICAgICAgICA8Y2xhc3NwYXRoPgorICAgICAgICAgICAgICAgIDxwYXRoIHBhdGg9IiR7bWFpbkNsYXNzZXNEaXJlY3Rvcnl9Ii8+CisgICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9ImNvbXBpbGVQYXRoIi8+CisgICAgICAgICAgICA8L2NsYXNzcGF0aD4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHttYWluU291cmNlRGlyZWN0b3J5fSIgaW5jbHVkZXM9IioqLyouamF2YSIvPgorICAgICAgICAgICAgPGxpbmsgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNC4yL2RvY3MvYXBpIi8+CisgICAgICAgICAgICA8bGluayBocmVmPSJodHRwOi8vd3d3LmRwbWwubmV0L2FwaS9hbnQvMS43LjAiLz4KKyAgICAgICAgICAgIDxsaW5rIGhyZWY9Imh0dHA6Ly9qdW5pdC5zb3VyY2Vmb3JnZS5uZXQvanVuaXQzLjguMS9qYXZhZG9jLyIvPgorICAgICAgICAgICAgPGxpbmsgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMmVlLzEuNC9kb2NzL2FwaSIvPgorICAgICAgICAgICAgPGxpbmsgaHJlZj0iaHR0cDovL3d3dy5hbnRscjIub3JnL2phdmFkb2MiLz4KKyAgICAgICAgPC9qYXZhZG9jPgorICAgICAgICA8amFyIGJhc2VkaXI9IiR7ZG9jc0RpcmVjdG9yeX0vYXBpIiBkZXN0ZmlsZT0iJHt0YXJnZXREaXN0RGlyZWN0b3J5fS9ncm9vdnktJHtncm9vdnlWZXJzaW9ufS1qYXZhZG9jLmphciIvPgorICAgICAgICA8Y29weSB0b0ZpbGU9IiR7dGFyZ2V0RGlzdERpcmVjdG9yeX0vZ3Jvb3Z5LWFsbC0ke2dyb292eVZlcnNpb259LWphdmFkb2MuamFyIj4KKyAgICAgICAgICAgIDxmaWxlc2V0IGZpbGU9IiR7dGFyZ2V0RGlzdERpcmVjdG9yeX0vZ3Jvb3Z5LSR7Z3Jvb3Z5VmVyc2lvbn0tamF2YWRvYy5qYXIiLz4KKyAgICAgICAgPC9jb3B5PgorICAgICAgICA8Y29weSB0b0ZpbGU9IiR7dGFyZ2V0RGlzdERpcmVjdG9yeX0vZ3Jvb3Z5LWFsbC1taW5pbWFsLSR7Z3Jvb3Z5VmVyc2lvbn0tamF2YWRvYy5qYXIiPgorICAgICAgICAgICAgPGZpbGVzZXQgZmlsZT0iJHt0YXJnZXREaXN0RGlyZWN0b3J5fS9ncm9vdnktJHtncm9vdnlWZXJzaW9ufS1qYXZhZG9jLmphciIvPgorICAgICAgICA8L2NvcHk+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9Imdyb292eWRvYyIgZGVwZW5kcz0iLWNvbXBpbGVUb29scywtZG9jSW5pdCwtaW5jbHVkZUdyb292eURvY1RlbXBsYXRlcyIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgdGhlIGdyb292eWRvYyBkb2N1bWVudGF0aW9uLiI+CisgICAgICAgIDxqYXZhIGNsYXNzbmFtZT0ib3JnLmNvZGVoYXVzLmdyb292eS50b29scy5Eb2NHZW5lcmF0b3IiIGZvcms9InRydWUiPgorICAgICAgICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHt0b29sc0NsYXNzZXNEaXJlY3Rvcnl9Ii8+CisgICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9InRvb2xzUGF0aCIvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke21haW5DbGFzc2VzRGlyZWN0b3J5fSIvPgorICAgICAgICAgICAgPC9jbGFzc3BhdGg+CisgICAgICAgIDwvamF2YT4KKwkJPGNvcHkgdG9kaXI9InRhcmdldC9odG1sL2dyb292eS1qZGsiIGZpbGU9InNyYy90b29scy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2dyb292eS5pY28iLz4KKyAgICAgICAgPHRhc2tkZWYgbmFtZT0iZ3Jvb3Z5ZG9jIiBjbGFzc25hbWU9Im9yZy5jb2RlaGF1cy5ncm9vdnkuYW50Lkdyb292eWRvYyI+CisgICAgICAgICAgICA8Y2xhc3NwYXRoPgorICAgICAgICAgICAgICAgIDxwYXRoIHBhdGg9IiR7bWFpbkNsYXNzZXNEaXJlY3Rvcnl9Ii8+CisgICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9ImNvbXBpbGVQYXRoIi8+CisgICAgICAgICAgICA8L2NsYXNzcGF0aD4KKyAgICAgICAgPC90YXNrZGVmPgorICAgICAgICA8Z3Jvb3Z5ZG9jCisgICAgICAgICAgICAgICAgZGVzdGRpcj0iJHtkb2NzRGlyZWN0b3J5fS9nYXBpIgorICAgICAgICAgICAgICAgIHNvdXJjZXBhdGg9IiR7bWFpblNvdXJjZURpcmVjdG9yeX0iCisgICAgICAgICAgICAgICAgcGFja2FnZW5hbWVzPSIqKi4qIgorICAgICAgICAgICAgICAgIHVzZT0idHJ1ZSIKKyAgICAgICAgICAgICAgICB3aW5kb3d0aXRsZT0iZ3Jvb3Z5ZG9jIgorICAgICAgICAgICAgICAgIHByaXZhdGU9ImZhbHNlIi8+CisgICAgPC90YXJnZXQ+CisKKwk8dGFyZ2V0IG5hbWU9ImRvY0dESyIgZGVwZW5kcz0iLWNvbXBpbGVUb29scyIgZGVzY3JpcHRpb249IkNyZWF0ZSB0aGUgR0RLIGRvY3VtZW50YXRpb24iPgorICAgICAgICA8amF2YSBjbGFzc25hbWU9Im9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuRG9jR2VuZXJhdG9yIiBmb3JrPSJ5ZXMiIGZhaWxvbmVycm9yPSJ0cnVlIj4KKyAgICAgICAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7dG9vbHNDbGFzc2VzRGlyZWN0b3J5fSIvPgorICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJ0b29sc1BhdGgiLz4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHttYWluQ2xhc3Nlc0RpcmVjdG9yeX0iLz4KKyAgICAgICAgICAgIDwvY2xhc3NwYXRoPgorICAgICAgICA8L2phdmE+CisJCTxjb3B5IHRvZGlyPSJ0YXJnZXQvaHRtbC9ncm9vdnktamRrIiBmaWxlPSJzcmMvdG9vbHMvb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9ncm9vdnkuaWNvIi8+CisJPC90YXJnZXQ+CisKKwk8dGFyZ2V0IG5hbWU9ImNsZWFuIiBkZXNjcmlwdGlvbj0iQ2xlYW4gb3V0IHRoZSBidWlsdCBtYXRlcmlhbHMuIj4KKyAgICAgICAgPGRlbGV0ZSBkaXI9IiR7dGFyZ2V0RGlyZWN0b3J5fSIgcXVpZXQ9InRydWUiLz4KKyAgICAgICAgPGRlbGV0ZSBxdWlldD0idHJ1ZSI+CisgICAgICAgICAgICA8ZmlsZXNldCBkaXI9Ii4iIGluY2x1ZGVzPSIqKi8qfiIvPgorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2dyb292eVBhcnNlckRpcmVjdG9yeX0iIGluY2x1ZGVzPSJHcm9vdnkqLioiLz4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtqYXZhUGFyc2VyRGlyZWN0b3J5fSIKKyAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVzPSJKYXZhTGV4ZXIuamF2YSxKYXZhUmVjb2duaXplci5qYXZhLEphdmFUb2tlblR5cGVzLmphdmEsSmF2YVRva2VuVHlwZXMudHh0LCouc21hcCIvPgorICAgICAgICA8L2RlbGV0ZT4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iZGVwbG95IiBkZXBlbmRzPSItbWF2ZW5EZXBsb3lJbml0LGluc3RhbGwsZG9jIgorICAgICAgICAgICAgZGVzY3JpcHRpb249IkRlcGxveSBqYXJzIHRvIG1hdmVuIHJlcG9zaXRvcnkuIj4KKyAgICAgICAgPG1hdmVuRGVwbG95IHZlcnNpb249IiR7Z3Jvb3Z5VmVyc2lvbn0iIGFydGlmYWN0PSJncm9vdnkiLz4KKyAgICAgICAgPG1hdmVuRGVwbG95IHZlcnNpb249IiR7Z3Jvb3Z5VmVyc2lvbn0iIGFydGlmYWN0PSJncm9vdnktYWxsIi8+CisgICAgICAgIDxtYXZlbkRlcGxveSB2ZXJzaW9uPSIke2dyb292eVZlcnNpb259IiBhcnRpZmFjdD0iZ3Jvb3Z5LWFsbC1taW5pbWFsIi8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9Imluc3RhbGxSZXBvIiBkZXBlbmRzPSItbWF2ZW5Jbml0LGluc3RhbGwsZG9jIgorICAgICAgICAgICAgZGVzY3JpcHRpb249IkRlcGxveSBhcnRpZmFjdHMgdG8gbG9jYWwgbWF2ZW4gcmVwb3NpdG9yeS4iPgorICAgICAgICA8bWF2ZW5JbnN0YWxsUmVwbyB2ZXJzaW9uPSIke2dyb292eVZlcnNpb259IiBhcnRpZmFjdD0iZ3Jvb3Z5Ii8+CisgICAgICAgIDxtYXZlbkluc3RhbGxSZXBvIHZlcnNpb249IiR7Z3Jvb3Z5VmVyc2lvbn0iIGFydGlmYWN0PSJncm9vdnktYWxsIi8+CisgICAgICAgIDxtYXZlbkluc3RhbGxSZXBvIHZlcnNpb249IiR7Z3Jvb3Z5VmVyc2lvbn0iIGFydGlmYWN0PSJncm9vdnktYWxsLW1pbmltYWwiLz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iZGlzdHJpYnV0aW9uIiBkZXBlbmRzPSJpbnN0YWxsLGRvYyIgZGVzY3JpcHRpb249IkNyZWF0ZSBldmVyeXRoaW5nIG5lZWRlZCBmb3IgYSBkaXN0cmlidXRpb24uIj4KKyAgICAgICAgPHppcCBkZXN0ZmlsZT0iJHt0YXJnZXREaXN0RGlyZWN0b3J5fS9ncm9vdnktYmluYXJ5LSR7Z3Jvb3Z5VmVyc2lvbn0uemlwIgorICAgICAgICAgICAgIGNvbW1lbnQ9IlRoZSBHcm9vdnkgJHtncm9vdnlWZXJzaW9ufSBiaW5hcnkgZGlzdHJpYnV0aW9uLiI+CisKKyAgICAgICAgICAgIDwhLS0gTWFrZSB1bml4IHNjcmlwdHMgZXhlY3V0YWJsZSAtLT4KKyAgICAgICAgICAgIDx6aXBmaWxlc2V0IGRpcj0iJHtpbnN0YWxsRGlyZWN0b3J5fSIgcHJlZml4PSJncm9vdnktJHtncm9vdnlWZXJzaW9ufSIgZmlsZW1vZGU9Ijc3NSI+CisgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iYmluLyoiLz4KKyAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJiaW4vKi4qIi8+CisgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iYmluL3N0YXJ0R3Jvb3Z5KiIvPgorICAgICAgICAgICAgPC96aXBmaWxlc2V0PgorCisgICAgICAgICAgICA8IS0tIEluY2x1ZGUgdGhlIG90aGVyIHNjcmlwdHMgYXNpcyAtLT4KKyAgICAgICAgICAgIDx6aXBmaWxlc2V0IGRpcj0iJHtpbnN0YWxsRGlyZWN0b3J5fSIgcHJlZml4PSJncm9vdnktJHtncm9vdnlWZXJzaW9ufSI+CisgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iYmluLyouKiIvPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImJpbi9zdGFydEdyb292eSoiLz4KKyAgICAgICAgICAgIDwvemlwZmlsZXNldD4KKworICAgICAgICAgICAgPCEtLSBJbmNsdWRlIGV2ZXJ5dGhpbmcgZWxzZSBhc2lzIHRvbyAtLT4KKyAgICAgICAgICAgIDx6aXBmaWxlc2V0IGRpcj0iJHtpbnN0YWxsRGlyZWN0b3J5fSIgcHJlZml4PSJncm9vdnktJHtncm9vdnlWZXJzaW9ufSI+CisgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iYmluLyoqIi8+CisgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKioiLz4KKyAgICAgICAgICAgIDwvemlwZmlsZXNldD4KKyAgICAgICAgPC96aXA+CisKKyAgICAgICAgPHppcCBkZXN0ZmlsZT0iJHt0YXJnZXREaXN0RGlyZWN0b3J5fS9ncm9vdnktZG9jcy0ke2dyb292eVZlcnNpb259LnppcCIKKyAgICAgICAgICAgICBjb21tZW50PSJUaGUgR3Jvb3Z5ICR7Z3Jvb3Z5VmVyc2lvbn0gZG9jdW1lbnRhdGlvbiBkaXN0cmlidXRpb24uIj4KKyAgICAgICAgICAgIDx6aXBmaWxlc2V0IGRpcj0iJHt3aWtpUGRmRGlyZWN0b3J5fSIgaW5jbHVkZXM9Indpa2ktc25hcHNob3QucGRmIiBwcmVmaXg9Imdyb292eS0ke2dyb292eVZlcnNpb259L3BkZiIvPgorICAgICAgICAgICAgPHppcGZpbGVzZXQgZGlyPSIke2RvY3NEaXJlY3Rvcnl9IiBwcmVmaXg9Imdyb292eS0ke2dyb292eVZlcnNpb259L2h0bWwiLz4KKyAgICAgICAgPC96aXA+CisKKyAgICAgICAgPHppcCBkZXN0ZmlsZT0iJHt0YXJnZXREaXN0RGlyZWN0b3J5fS9ncm9vdnktc3JjLSR7Z3Jvb3Z5VmVyc2lvbn0uemlwIgorICAgICAgICAgICAgIGNvbW1lbnQ9IlRoZSBHcm9vdnkgJHtncm9vdnlWZXJzaW9ufSBzb3VyY2UgZGlzdHJpYnV0aW9uLiI+CisgICAgICAgICAgICA8emlwZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0iIHByZWZpeD0iZ3Jvb3Z5LSR7Z3Jvb3Z5VmVyc2lvbn0iPgorICAgICAgICAgICAgICAgIDwhLS0gRXhjbHVkZSBnZW5lcmF0ZWQgYml0cyBhcyB3ZWxsIGFzIGFueSBvdGhlciBiaXRzIHRoYXQgc2hvdWxkbid0IG1ha2UgaXQgaW4gLS0+CisgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iJHt0YXJnZXREaXJlY3Rvcnl9LyoqIi8+CisgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iY2xhc3Nlcy8qKiIvPgorICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9ImNydWlzZS8qKiIvPgorICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9Ii5jbG92ZXIvKiIvPgorICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9ImxvY2FsLmJ1aWxkLnByb3BlcnRpZXMiLz4KKyAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJjb2JlcnR1cmEuc2VyIi8+CisgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ianVuaXR2bXdhdGNoZXIqLnByb3BlcnRpZXMiLz4KKyAgICAgICAgICAgIDwvemlwZmlsZXNldD4KKyAgICAgICAgPC96aXA+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImRpc3QiIGRlcGVuZHM9ImRpc3RyaWJ1dGlvbiIgZGVzY3JpcHRpb249IkFsaWFzIHRvIGRpc3RyaWJ1dGlvbiBmb3IgdGhlIGxhenkuIi8+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2dyb292eS9jb25maWcvYW50L2J1aWxkLWNoZWNrc3R5bGUueG1sIGIvZ3Jvb3Z5L2NvbmZpZy9hbnQvYnVpbGQtY2hlY2tzdHlsZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q4NzkyNQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9jb25maWcvYW50L2J1aWxkLWNoZWNrc3R5bGUueG1sCkBAIC0wLDAgKzEsNTMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorCis8IS0tCitMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4KK2NvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzCitkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKK2ltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK1RoaXMgd29yayBpcyBjb3B5cmlnaHQgYnkgdGhlIGF1dGhvcihzKSBhbmQgaXMgcGFydCBvZiBhIGdyZWF0ZXIgd29yayBjb2xsZWN0aXZlbHkgY29weXJpZ2h0IGJ5IHRoZQorR3Jvb3Z5IGNvbW11bml0eS4gU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uCisKK0F1dGhvciA6IFBhdWwgS2luZworJFJldmlzaW9uOiA1NTE5ICQgKCRMYXN0Q2hhbmdlZEJ5OiBwYXVsayAkKQorJERhdGU6IDIwMDctMDMtMTEgMTk6MTQ6MDcgKzEwMDAgKFN1biwgMTEgTWFyIDIwMDcpICQKKy0tPgorCis8cHJvamVjdCBuYW1lPSJidWlsZC1jaGVja3N0eWxlIiBkZWZhdWx0PSIiIHhtbG5zOmNzPSJhbnRsaWI6Y29tLnB1cHB5Y3Jhd2wudG9vbHMuY2hlY2tzdHlsZSIgYmFzZWRpcj0iLi4vLi4iPgorCisgICAgPGltcG9ydCBmaWxlPSJidWlsZC1zZXR1cC54bWwiLz4KKworICAgIDx0YXJnZXQgbmFtZT0iLWNoZWNrc3R5bGVJbml0Ij4KKyAgICAgICAgPHRhc2tkZWYgcmVzb3VyY2U9ImNoZWNrc3R5bGV0YXNrLnByb3BlcnRpZXMiIHVyaT0iYW50bGliOmNvbS5wdXBweWNyYXdsLnRvb2xzLmNoZWNrc3R5bGUiIGNsYXNzcGF0aHJlZj0idG9vbHNQYXRoIi8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8bWFjcm9kZWYgbmFtZT0iY2hlY2tBbmRSZXBvcnQiPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9InJlcG9ydERpcmVjdG9yeSIvPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9InNvdXJjZURpcmVjdG9yeSIvPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImV4Y2x1ZGVzIi8+CisgICAgICAgIDxlbGVtZW50IG5hbWU9InBhdGgiLz4KKyAgICAgICAgPHNlcXVlbnRpYWw+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iY2hlY2tzdHlsZS5iYXNlZGlyIiB2YWx1ZT0iQHtzb3VyY2VEaXJlY3Rvcnl9Ii8+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iY2hlY2tzdHlsZVJlcG9ydERpciIgbG9jYXRpb249IkB7cmVwb3J0RGlyZWN0b3J5fSIvPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImNoZWNrc3R5bGVSZXN1bHRQcmVmaXgiIGxvY2F0aW9uPSJAe3JlcG9ydERpcmVjdG9yeX0vcmVzdWx0Ii8+CisgICAgICAgICAgICA8bWtkaXIgZGlyPSJAe3JlcG9ydERpcmVjdG9yeX0iLz4KKyAgICAgICAgICAgIDxjczpjaGVja3N0eWxlIGNvbmZpZz0iY29uZmlnL2NoZWNrc3R5bGUvY29uZmlnLnhtbCIgZmFpbHVyZVByb3BlcnR5PSJjaGVja3N0eWxlLmZhaWx1cmUiCisgICAgICAgICAgICAgICAgICBmYWlsT25WaW9sYXRpb249ImZhbHNlIj4KKyAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoPgorICAgICAgICAgICAgICAgICAgICA8cGF0aC8+CisgICAgICAgICAgICAgICAgPC9jbGFzc3BhdGg+CisgICAgICAgICAgICAgICAgPGZvcm1hdHRlciB0eXBlPSJ4bWwiIHRvZmlsZT0iJHtjaGVja3N0eWxlUmVzdWx0UHJlZml4fS54bWwiLz4KKyAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IkB7c291cmNlRGlyZWN0b3J5fSIgZXhjbHVkZXM9IkB7ZXhjbHVkZXN9Ii8+CisgICAgICAgICAgICA8L2NzOmNoZWNrc3R5bGU+CisgICAgICAgICAgICA8eHNsdCBpbj0iJHtjaGVja3N0eWxlUmVzdWx0UHJlZml4fS54bWwiIG91dD0iJHtjaGVja3N0eWxlUmVzdWx0UHJlZml4fS5odG1sIiBzdHlsZT0iY29uZmlnL2NoZWNrc3R5bGUvY2hlY2tzdHlsZS1mcmFtZXMueHNsIj4KKyAgICAgICAgICAgICAgICA8cGFyYW0gbmFtZT0ib3V0cHV0LmRpciIgZXhwcmVzc2lvbj0iJHtjaGVja3N0eWxlUmVwb3J0RGlyfSIvPgorICAgICAgICAgICAgPC94c2x0PgorICAgICAgICA8L3NlcXVlbnRpYWw+CisgICAgPC9tYWNyb2RlZj4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L2NvbmZpZy9hbnQvYnVpbGQtY29iZXJ0dXJhLnhtbCBiL2dyb292eS9jb25maWcvYW50L2J1aWxkLWNvYmVydHVyYS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YwMmUzZAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9jb25maWcvYW50L2J1aWxkLWNvYmVydHVyYS54bWwKQEAgLTAsMCArMSw1MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+CisKKzwhLS0KK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbgorY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMKK2Rpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgoraW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworVGhpcyB3b3JrIGlzIGNvcHlyaWdodCBieSB0aGUgYXV0aG9yKHMpIGFuZCBpcyBwYXJ0IG9mIGEgZ3JlYXRlciB3b3JrIGNvbGxlY3RpdmVseSBjb3B5cmlnaHQgYnkgQ29kZWhhdXMgb24KK2JlaGFsZiBvZiB0aGUgR3Jvb3Z5IGNvbW11bml0eS4gU2VlIHRoZSBOT1RJQ0UudHh0IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uCisKK0F1dGhvciA6IFBhdWwgS2luZworJFJldmlzaW9uOiA1NTE5ICQgKCRMYXN0Q2hhbmdlZEJ5OiBwYXVsayAkKQorJERhdGU6IDIwMDctMDMtMTEgMTk6MTQ6MDcgKzEwMDAgKFN1biwgMTEgTWFyIDIwMDcpICQKKy0tPgorCis8cHJvamVjdCBuYW1lPSJidWlsZC1jb2JlcnR1cmEiIGRlZmF1bHQ9IiIgYmFzZWRpcj0iLi4vLi4iPgorCisgICAgPGltcG9ydCBmaWxlPSJidWlsZC1zZXR1cC54bWwiLz4KKworICAgIDx0YXJnZXQgbmFtZT0iLWNvYmVydHVyYUluaXQiPgorICAgICAgICA8dGFza2RlZiByZXNvdXJjZT0idGFza3MucHJvcGVydGllcyIgY2xhc3NwYXRocmVmPSJ0b29sc1BhdGgiLz4KKyAgICAgICAgPHBhdGggaWQ9ImNvYmVydHVyYVBhdGgiPgorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3Rvb2xzTGliRGlyZWN0b3J5fSIgaW5jbHVkZXM9ImNvYmVydHVyYS0qLmphcixhc20qLmphciIvPgorICAgICAgICA8L3BhdGg+CisgICAgICAgIDxkZWxldGUgZGlyPSIke2luc3RydW1lbnRlZENsYXNzZXNEaXJlY3Rvcnl9IiBxdWlldD0idHJ1ZSIgZmFpbG9uZXJyb3I9ImZhbHNlIi8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8bWFjcm9kZWYgbmFtZT0iY29iZXJ0dXJhSW5zdHJ1bWVudCI+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3Nlc0RpcmVjdG9yeSIvPgorICAgICAgICA8c2VxdWVudGlhbD4KKyAgICAgICAgICAgIDxta2RpciBkaXI9IiR7aW5zdHJ1bWVudGVkQ2xhc3Nlc0RpcmVjdG9yeX0iLz4KKyAgICAgICAgICAgIDxjb2JlcnR1cmEtaW5zdHJ1bWVudCB0b2Rpcj0iJHtpbnN0cnVtZW50ZWRDbGFzc2VzRGlyZWN0b3J5fSI+CisgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJAe2NsYXNzZXNEaXJlY3Rvcnl9IiBpbmNsdWRlcz0iKiovKi5jbGFzcyIvPgorICAgICAgICAgICAgPC9jb2JlcnR1cmEtaW5zdHJ1bWVudD4KKyAgICAgICAgPC9zZXF1ZW50aWFsPgorICAgIDwvbWFjcm9kZWY+CisKKyAgICA8bWFjcm9kZWYgbmFtZT0iY29iZXJ0dXJhUmVwb3J0Ij4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZXBvcnREaXJlY3RvcnkiLz4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzb3VyY2VEaXJlY3RvcnkiLz4KKyAgICAgICAgPHNlcXVlbnRpYWw+CisgICAgICAgICAgICA8Y29iZXJ0dXJhLXJlcG9ydCBkZXN0ZGlyPSIke3JlcG9ydHNEaXJlY3Rvcnl9L2NvYmVydHVyYSI+CisgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke21haW5Tb3VyY2VEaXJlY3Rvcnl9Ii8+CisgICAgICAgICAgICA8L2NvYmVydHVyYS1yZXBvcnQ+CisgICAgICAgIDwvc2VxdWVudGlhbD4KKyAgICA8L21hY3JvZGVmPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9ncm9vdnkvY29uZmlnL2FudC9idWlsZC1tYXZlbi54bWwgYi9ncm9vdnkvY29uZmlnL2FudC9idWlsZC1tYXZlbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YzYmEwYwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9jb25maWcvYW50L2J1aWxkLW1hdmVuLnhtbApAQCAtMCwwICsxLDE5MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+CisKKzwhLS0KK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbgorY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMKK2Rpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgoraW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworVGhpcyB3b3JrIGlzIGNvcHlyaWdodCBieSB0aGUgYXV0aG9yKHMpIGFuZCBpcyBwYXJ0IG9mIGEgZ3JlYXRlciB3b3JrIGNvbGxlY3RpdmVseSBjb3B5cmlnaHQgYnkgdGhlCitHcm9vdnkgY29tbXVuaXR5LiBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4KKworQXV0aG9yIDogUGF1bCBLaW5nCiskUmV2aXNpb24kICgkTGFzdENoYW5nZWRCeSQpCiskRGF0ZSQKKy0tPgorCis8cHJvamVjdCBuYW1lPSJidWlsZC1tYXZlbiIgZGVmYXVsdD0iIiBiYXNlZGlyPSIuLi8uLiIgeG1sbnM6YXJ0aWZhY3Q9InVybjptYXZlbi1hcnRpZmFjdC1hbnQiPgorCisgICAgPGltcG9ydCBmaWxlPSJidWlsZC1zZXR1cC54bWwiLz4KKworICAgIDxtYWNyb2RlZiBuYW1lPSJtYXZlbi5kZXBlbmRlbmNpZXMiPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9InVzZVNjb3BlIi8+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsZXNldElkIi8+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9tUmVmSWQiLz4KKyAgICAgICAgPHNlcXVlbnRpYWw+CisgICAgICAgICAgICA8YXJ0aWZhY3Q6ZGVwZW5kZW5jaWVzIHVzZVNjb3BlPSJAe3VzZVNjb3BlfSIgZmlsZXNldElkPSJAe2ZpbGVzZXRJZH0iPgorICAgICAgICAgICAgICAgIDxyZW1vdGVSZXBvc2l0b3J5IHJlZmlkPSJpYmlibGlvLnJlbW90ZS5yZXBvc2l0b3J5Ii8+CisgICAgICAgICAgICAgICAgPHJlbW90ZVJlcG9zaXRvcnkgcmVmaWQ9InJlcG8xLnJlbW90ZS5yZXBvc2l0b3J5Ii8+CisgICAgICAgICAgICAgICAgPHBvbSByZWZpZD0iQHtwb21SZWZJZH0iLz4KKyAgICAgICAgICAgIDwvYXJ0aWZhY3Q6ZGVwZW5kZW5jaWVzPgorICAgICAgICA8L3NlcXVlbnRpYWw+CisgICAgPC9tYWNyb2RlZj4KKworICAgIDxtYWNyb2RlZiBuYW1lPSJmZXRjaC5tYXZlbiI+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2NvcGUiLz4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJtb2R1bGUiLz4KKyAgICAgICAgPHNlcXVlbnRpYWw+CisgICAgICAgICAgICA8bWF2ZW4uZGVwZW5kZW5jaWVzIHVzZVNjb3BlPSJAe3Njb3BlfSIgZmlsZXNldElkPSJmcy5Ae3Njb3BlfS5Ae21vZHVsZX0iIHBvbVJlZklkPSJAe21vZHVsZX0ucG9tIi8+CisgICAgICAgIDwvc2VxdWVudGlhbD4KKyAgICA8L21hY3JvZGVmPgorCisgICAgPG1hY3JvZGVmIG5hbWU9Im1hdmVuLnBvbSI+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsZSIvPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIi8+CisgICAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICAgICAgPGFydGlmYWN0OnBvbSBmaWxlPSJAe2ZpbGV9IiBpZD0iQHtpZH0iLz4KKyAgICAgICAgPC9zZXF1ZW50aWFsPgorICAgIDwvbWFjcm9kZWY+CisKKyAgICA8bWFjcm9kZWYgbmFtZT0iZmV0Y2gubWF2ZW4uYWxsLnNjb3BlcyI+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibW9kdWxlIi8+CisgICAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICAgICAgPGZldGNoLm1hdmVuIHNjb3BlPSJjb21waWxlIiBtb2R1bGU9IkB7bW9kdWxlfSIvPgorICAgICAgICAgICAgPGZldGNoLm1hdmVuIHNjb3BlPSJydW50aW1lIiBtb2R1bGU9IkB7bW9kdWxlfSIvPgorICAgICAgICAgICAgPGZldGNoLm1hdmVuIHNjb3BlPSJ0ZXN0IiBtb2R1bGU9IkB7bW9kdWxlfSIvPgorICAgICAgICA8L3NlcXVlbnRpYWw+CisgICAgPC9tYWNyb2RlZj4KKworICAgIDxtYWNyb2RlZiBuYW1lPSJmZXRjaC5tYXZlbi5hbGwubW9kdWxlcyI+CisgICAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICAgICAgPGZldGNoLm1hdmVuLmFsbC5zY29wZXMgbW9kdWxlPSJncm9vdnkiLz4KKyAgICAgICAgICAgIDxmZXRjaC5tYXZlbiBzY29wZT0icnVudGltZSIgbW9kdWxlPSJncm9vdnktdG9vbHMiLz4KKyAgICAgICAgICAgIDxmZXRjaC5tYXZlbiBzY29wZT0icnVudGltZSIgbW9kdWxlPSJncm9vdnktZXhhbXBsZXMiLz4KKyAgICAgICAgPC9zZXF1ZW50aWFsPgorICAgIDwvbWFjcm9kZWY+CisKKyAgICA8bWFjcm9kZWYgbmFtZT0ibWF2ZW4ucmVtb3RlLnJlcG9zaXRvcnkiPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIi8+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXJsIi8+CisgICAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICAgICAgPGFydGlmYWN0OnJlbW90ZVJlcG9zaXRvcnkgaWQ9IkB7aWR9IiB1cmw9IkB7dXJsfSIvPgorICAgICAgICA8L3NlcXVlbnRpYWw+CisgICAgPC9tYWNyb2RlZj4KKworICAgIDx0YXJnZXQgbmFtZT0iLW1hdmVuSW5pdCIgZGVwZW5kcz0iLW1hdmVuVGFza2RlZiwtbWF2ZW5Qb21EZWZpbml0aW9ucywtbWF2ZW5SZXBvc2l0b3J5RGVmaW5pdGlvbnMiLz4KKworICAgIDx0YXJnZXQgbmFtZT0iLW1hdmVuVGFza2RlZiI+CisgICAgICAgIDx0eXBlZGVmIHJlc291cmNlPSJvcmcvYXBhY2hlL21hdmVuL2FydGlmYWN0L2FudC9hbnRsaWIueG1sIiB1cmk9InVybjptYXZlbi1hcnRpZmFjdC1hbnQiPgorICAgICAgICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7Ym9vdHN0cmFwRGlyZWN0b3J5fSIgaW5jbHVkZXM9Im1hdmVuLWFudC10YXNrcy0qLmphciIvPgorICAgICAgICAgICAgPC9jbGFzc3BhdGg+CisgICAgICAgIDwvdHlwZWRlZj4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iLW1hdmVuUG9tRGVmaW5pdGlvbnMiPgorICAgICAgICA8bWF2ZW4ucG9tIGZpbGU9InBvbS54bWwiIGlkPSJncm9vdnkucG9tIi8+CisgICAgICAgIAorICAgICAgICA8eHNsdCBpbj0icG9tLnhtbCIgb3V0PSIke3RhcmdldERpcmVjdG9yeX0vZ3Jvb3Z5LWFsbC5wb20iIHN0eWxlPSJjb25maWcvbWF2ZW4vZ3Jvb3Z5LWFsbC54c2wiLz4KKyAgICAgICAgPG1hdmVuLnBvbSBmaWxlPSIke3RhcmdldERpcmVjdG9yeX0vZ3Jvb3Z5LWFsbC5wb20iIGlkPSJncm9vdnktYWxsLnBvbSIvPgorICAgICAgICAKKyAgICAgICAgPHhzbHQgaW49InBvbS54bWwiIG91dD0iJHt0YXJnZXREaXJlY3Rvcnl9L2dyb292eS1hbGwtbWluaW1hbC5wb20iIHN0eWxlPSJjb25maWcvbWF2ZW4vZ3Jvb3Z5LWFsbC1taW5pbWFsLnhzbCIvPgorICAgICAgICA8bWF2ZW4ucG9tIGZpbGU9IiR7dGFyZ2V0RGlyZWN0b3J5fS9ncm9vdnktYWxsLW1pbmltYWwucG9tIiBpZD0iZ3Jvb3Z5LWFsbC1taW5pbWFsLnBvbSIvPgorICAgICAgICAKKyAgICAgICAgPG1hdmVuLnBvbSBmaWxlPSJjb25maWcvbWF2ZW4vZ3Jvb3Z5LXRvb2xzLnBvbSIgaWQ9Imdyb292eS10b29scy5wb20iLz4KKyAgICAgICAgPG1hdmVuLnBvbSBmaWxlPSJjb25maWcvbWF2ZW4vZ3Jvb3Z5LWV4YW1wbGVzLnBvbSIgaWQ9Imdyb292eS1leGFtcGxlcy5wb20iLz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iLW1hdmVuUmVwb3NpdG9yeURlZmluaXRpb25zIj4KKyAgICAgICAgPG1hdmVuLnJlbW90ZS5yZXBvc2l0b3J5IGlkPSJyZXBvMS5yZW1vdGUucmVwb3NpdG9yeSIgdXJsPSJodHRwOi8vcmVwbzEubWF2ZW4ub3JnL21hdmVuMi8iLz4KKyAgICAgICAgPG1hdmVuLnJlbW90ZS5yZXBvc2l0b3J5IGlkPSJpYmlibGlvLnJlbW90ZS5yZXBvc2l0b3J5IiB1cmw9Imh0dHA6Ly9pYmlibGlvLm9yZy9tYXZlbjIvIi8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9Ii1tYXZlbkZldGNoQWxsTW9kdWxlcyIgZGVwZW5kcz0iLW1hdmVuSW5pdCI+CisgICAgICAgIDxmZXRjaC5tYXZlbi5hbGwubW9kdWxlcy8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9Ii1mZXRjaERlcGVuZGVuY2llcyIgZGVwZW5kcz0iLW1hdmVuRmV0Y2hBbGxNb2R1bGVzLC1jb3B5TGlicmFyaWVzIi8+CisKKyAgICA8dGFyZ2V0IG5hbWU9Ii1jb3B5TGlicmFyaWVzIj4KKyAgICAgICAgPGRlbGV0ZSBkaXI9IiR7Y29tcGlsZUxpYkRpcmVjdG9yeX0iLz4KKyAgICAgICAgPGRlbGV0ZSBkaXI9IiR7dGVzdExpYkRpcmVjdG9yeX0iLz4KKyAgICAgICAgPGRlbGV0ZSBkaXI9IiR7cnVudGltZUxpYkRpcmVjdG9yeX0iLz4KKyAgICAgICAgPGRlbGV0ZSBkaXI9IiR7dG9vbHNMaWJEaXJlY3Rvcnl9Ii8+CisgICAgICAgIDxkZWxldGUgZGlyPSIke2V4YW1wbGVzTGliRGlyZWN0b3J5fSIvPgorCisgICAgICAgIDxta2RpciBkaXI9IiR7Y29tcGlsZUxpYkRpcmVjdG9yeX0iLz4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHt0ZXN0TGliRGlyZWN0b3J5fSIvPgorICAgICAgICA8bWtkaXIgZGlyPSIke3J1bnRpbWVMaWJEaXJlY3Rvcnl9Ii8+CisgICAgICAgIDxta2RpciBkaXI9IiR7dG9vbHNMaWJEaXJlY3Rvcnl9Ii8+CisgICAgICAgIDxta2RpciBkaXI9IiR7ZXhhbXBsZXNMaWJEaXJlY3Rvcnl9Ii8+CisKKyAgICAgICAgPGNvcHkgdG9kaXI9IiR7Y29tcGlsZUxpYkRpcmVjdG9yeX0iPgorICAgICAgICAgICAgPG1hcHBlciB0eXBlPSJmbGF0dGVuIi8+CisgICAgICAgICAgICA8ZmlsZXNldCByZWZpZD0iZnMuY29tcGlsZS5ncm9vdnkiLz4KKyAgICAgICAgPC9jb3B5PgorICAgICAgICA8cGF0aCBpZD0iY29tcGlsZVBhdGgiPgorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2NvbXBpbGVMaWJEaXJlY3Rvcnl9IiBpbmNsdWRlcz0iKiovKi5qYXIiLz4KKyAgICAgICAgPC9wYXRoPgorICAgICAgICA8Y29weSB0b2Rpcj0iJHt0ZXN0TGliRGlyZWN0b3J5fSI+CisgICAgICAgICAgICA8bWFwcGVyIHR5cGU9ImZsYXR0ZW4iLz4KKyAgICAgICAgICAgIDxmaWxlc2V0IHJlZmlkPSJmcy50ZXN0Lmdyb292eSIvPgorICAgICAgICA8L2NvcHk+CisgICAgICAgIDxwYXRoIGlkPSJ0ZXN0UGF0aCI+CisgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7dGVzdExpYkRpcmVjdG9yeX0iIGluY2x1ZGVzPSIqKi8qLmphciIvPgorICAgICAgICA8L3BhdGg+CisgICAgICAgIDxjb3B5IHRvZGlyPSIke3J1bnRpbWVMaWJEaXJlY3Rvcnl9Ij4KKyAgICAgICAgICAgIDxtYXBwZXIgdHlwZT0iZmxhdHRlbiIvPgorICAgICAgICAgICAgPGZpbGVzZXQgcmVmaWQ9ImZzLnJ1bnRpbWUuZ3Jvb3Z5Ii8+CisgICAgICAgIDwvY29weT4KKyAgICAgICAgPHBhdGggaWQ9InJ1bnRpbWVQYXRoIj4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtydW50aW1lTGliRGlyZWN0b3J5fSIgaW5jbHVkZXM9IioqLyouamFyIi8+CisgICAgICAgIDwvcGF0aD4KKyAgICAgICAgPGNvcHkgdG9kaXI9IiR7dG9vbHNMaWJEaXJlY3Rvcnl9Ij4KKyAgICAgICAgICAgIDxtYXBwZXIgdHlwZT0iZmxhdHRlbiIvPgorICAgICAgICAgICAgPGZpbGVzZXQgcmVmaWQ9ImZzLnJ1bnRpbWUuZ3Jvb3Z5LXRvb2xzIi8+CisgICAgICAgIDwvY29weT4KKyAgICAgICAgPHBhdGggaWQ9InRvb2xzUGF0aCI+CisgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7dG9vbHNMaWJEaXJlY3Rvcnl9IiBpbmNsdWRlcz0iKiovKi5qYXIiLz4KKyAgICAgICAgPC9wYXRoPgorICAgICAgICA8Y29weSB0b2Rpcj0iJHtleGFtcGxlc0xpYkRpcmVjdG9yeX0iPgorICAgICAgICAgICAgPG1hcHBlciB0eXBlPSJmbGF0dGVuIi8+CisgICAgICAgICAgICA8ZmlsZXNldCByZWZpZD0iZnMucnVudGltZS5ncm9vdnktZXhhbXBsZXMiLz4KKyAgICAgICAgPC9jb3B5PgorICAgICAgICA8cGF0aCBpZD0iZXhhbXBsZXNQYXRoIj4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtleGFtcGxlc0xpYkRpcmVjdG9yeX0iIGluY2x1ZGVzPSIqKi8qLmphciIvPgorICAgICAgICA8L3BhdGg+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9Ii1tYXZlbkRlcGxveUluaXQiIGRlcGVuZHM9Ii1tYXZlbkluaXQiPgorICAgICAgICA8YXJ0aWZhY3Q6aW5zdGFsbC1wcm92aWRlciBhcnRpZmFjdElkPSJ3YWdvbi13ZWJkYXYiIHZlcnNpb249IjEuMC1iZXRhLTIiLz4KKyAgICA8L3RhcmdldD4KKworICAgIDxtYWNyb2RlZiBuYW1lPSJtYXZlbkRlcGxveSI+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIvPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImFydGlmYWN0Ii8+CisgICAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICAgICAgPGFydGlmYWN0OmRlcGxveSBmaWxlPSIke3RhcmdldERpc3REaXJlY3Rvcnl9L0B7YXJ0aWZhY3R9LUB7dmVyc2lvbn0uamFyIj4KKyAgICAgICAgICAgICAgICA8cG9tIHJlZmlkPSJAe2FydGlmYWN0fS5wb20iLz4KKyAgICAgICAgICAgICAgICA8YXR0YWNoIGZpbGU9IiR7dGFyZ2V0RGlzdERpcmVjdG9yeX0vQHthcnRpZmFjdH0tQHt2ZXJzaW9ufS1zb3VyY2VzLmphciIgY2xhc3NpZmllcj0ic291cmNlcyIvPgorICAgICAgICAgICAgICAgIDxhdHRhY2ggZmlsZT0iJHt0YXJnZXREaXN0RGlyZWN0b3J5fS9Ae2FydGlmYWN0fS1Ae3ZlcnNpb259LWphdmFkb2MuamFyIiBjbGFzc2lmaWVyPSJqYXZhZG9jIi8+CisgICAgICAgICAgICA8L2FydGlmYWN0OmRlcGxveT4KKyAgICAgICAgPC9zZXF1ZW50aWFsPgorICAgIDwvbWFjcm9kZWY+CisKKyAgICA8bWFjcm9kZWYgbmFtZT0ibWF2ZW5JbnN0YWxsUmVwbyI+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIvPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImFydGlmYWN0Ii8+CisgICAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICAgICAgPGFydGlmYWN0Omluc3RhbGwgZmlsZT0iJHt0YXJnZXREaXN0RGlyZWN0b3J5fS9Ae2FydGlmYWN0fS1Ae3ZlcnNpb259LmphciI+CisgICAgICAgICAgICAgICAgPHBvbSByZWZpZD0iQHthcnRpZmFjdH0ucG9tIi8+CisgICAgICAgICAgICAgICAgPGF0dGFjaCBmaWxlPSIke3RhcmdldERpc3REaXJlY3Rvcnl9L0B7YXJ0aWZhY3R9LUB7dmVyc2lvbn0tc291cmNlcy5qYXIiIGNsYXNzaWZpZXI9InNvdXJjZXMiLz4KKyAgICAgICAgICAgICAgICA8YXR0YWNoIGZpbGU9IiR7dGFyZ2V0RGlzdERpcmVjdG9yeX0vQHthcnRpZmFjdH0tQHt2ZXJzaW9ufS1qYXZhZG9jLmphciIgY2xhc3NpZmllcj0iamF2YWRvYyIvPgorICAgICAgICAgICAgPC9hcnRpZmFjdDppbnN0YWxsPgorICAgICAgICA8L3NlcXVlbnRpYWw+CisgICAgPC9tYWNyb2RlZj4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L2NvbmZpZy9hbnQvYnVpbGQtc2V0dXAueG1sIGIvZ3Jvb3Z5L2NvbmZpZy9hbnQvYnVpbGQtc2V0dXAueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzZWUyYjIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvY29uZmlnL2FudC9idWlsZC1zZXR1cC54bWwKQEAgLTAsMCArMSw3MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+CisKKzwhLS0KK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbgorY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMKK2Rpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgoraW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworVGhpcyB3b3JrIGlzIGNvcHlyaWdodCBieSB0aGUgYXV0aG9yKHMpIGFuZCBpcyBwYXJ0IG9mIGEgZ3JlYXRlciB3b3JrIGNvbGxlY3RpdmVseSBjb3B5cmlnaHQgYnkgdGhlCitHcm9vdnkgY29tbXVuaXR5LiBTZWUgdGhlIE5PVElDRS50eHQgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4KKworQXV0aG9yIDogUGF1bCBLaW5nCiskUmV2aXNpb246IDU1MTkgJCAoJExhc3RDaGFuZ2VkQnk6IHBhdWxrICQpCiskRGF0ZTogMjAwNy0wMy0xMSAxOToxNDowNyArMTAwMCAoU3VuLCAxMSBNYXIgMjAwNykgJAorLS0+CisKKzxwcm9qZWN0IG5hbWU9ImJ1aWxkLXNldHVwIiBkZWZhdWx0PSIiIGJhc2VkaXI9Ii4uLy4uIj4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJib290c3RyYXBEaXJlY3RvcnkiIGxvY2F0aW9uPSJib290c3RyYXAiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic291cmNlRGlyZWN0b3J5IiB2YWx1ZT0ic3JjIi8+CisgICAgPHByb3BlcnR5IG5hbWU9Indpa2lQZGZEaXJlY3RvcnkiIHZhbHVlPSJzcmMiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibWFpblNvdXJjZURpcmVjdG9yeSIgbG9jYXRpb249IiR7c291cmNlRGlyZWN0b3J5fS9tYWluIi8+CisgICAgPHByb3BlcnR5IG5hbWU9InRlc3RTb3VyY2VEaXJlY3RvcnkiIHZhbHVlPSIke3NvdXJjZURpcmVjdG9yeX0vdGVzdCIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b29sc1NvdXJjZURpcmVjdG9yeSIgbG9jYXRpb249IiR7c291cmNlRGlyZWN0b3J5fS90b29scyIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJleGFtcGxlc1NvdXJjZURpcmVjdG9yeSIgbG9jYXRpb249IiR7c291cmNlRGlyZWN0b3J5fS9leGFtcGxlcyIvPgorICAgIAorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YXJnZXREaXJlY3RvcnkiIHZhbHVlPSJ0YXJnZXQiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaW5zdGFsbERpcmVjdG9yeSIgdmFsdWU9IiR7dGFyZ2V0RGlyZWN0b3J5fS9pbnN0YWxsIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImNydWlzZVJlcG9ydFJvb3REaXJlY3RvcnkiIHZhbHVlPSIke3RhcmdldERpcmVjdG9yeX0vcm9vdCIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzdGFnaW5nRGlyZWN0b3J5IiB2YWx1ZT0iJHt0YXJnZXREaXJlY3Rvcnl9L3N0YWdpbmciLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZG9jc0RpcmVjdG9yeSIgdmFsdWU9IiR7dGFyZ2V0RGlyZWN0b3J5fS9odG1sIi8+CisgICAgPHByb3BlcnR5IG5hbWU9Im1haW5DbGFzc2VzRGlyZWN0b3J5IiB2YWx1ZT0iJHt0YXJnZXREaXJlY3Rvcnl9L2NsYXNzZXMiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0idGVzdENsYXNzZXNEaXJlY3RvcnkiIHZhbHVlPSIke3RhcmdldERpcmVjdG9yeX0vdGVzdC1jbGFzc2VzIi8+CisgICAgPHByb3BlcnR5IG5hbWU9InRvb2xzQ2xhc3Nlc0RpcmVjdG9yeSIgdmFsdWU9IiR7dGFyZ2V0RGlyZWN0b3J5fS90b29scy1jbGFzc2VzIi8+CisgICAgPHByb3BlcnR5IG5hbWU9Im1haW5TdHVic0RpcmVjdG9yeSIgdmFsdWU9IiR7dGFyZ2V0RGlyZWN0b3J5fS9zdHVicyIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0U3R1YnNEaXJlY3RvcnkiIHZhbHVlPSIke3RhcmdldERpcmVjdG9yeX0vdGVzdC1zdHVicyIvPgorICAgIAorICAgIDxwcm9wZXJ0eSBuYW1lPSJleGFtcGxlc0NsYXNzZXNEaXJlY3RvcnkiIHZhbHVlPSIke3RhcmdldERpcmVjdG9yeX0vZXhhbXBsZXMtY2xhc3NlcyIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJpbnN0cnVtZW50ZWRDbGFzc2VzRGlyZWN0b3J5IiB2YWx1ZT0iJHt0YXJnZXREaXJlY3Rvcnl9L2luc3RydW1lbnRlZC1jbGFzc2VzIi8+CisgICAgPHByb3BlcnR5IG5hbWU9InJlcG9ydHNEaXJlY3RvcnkiIHZhbHVlPSIke3RhcmdldERpcmVjdG9yeX0vcmVwb3J0cyIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YXJnZXRMaWJEaXJlY3RvcnkiIHZhbHVlPSIke3RhcmdldERpcmVjdG9yeX0vbGliIi8+CisgICAgPHByb3BlcnR5IG5hbWU9InRhcmdldERpc3REaXJlY3RvcnkiIHZhbHVlPSIke3RhcmdldERpcmVjdG9yeX0vZGlzdCIvPgorICAgIAorICAgIDxwcm9wZXJ0eSBuYW1lPSJhbnRsckRpcmVjdG9yeSIgdmFsdWU9IiR7bWFpblNvdXJjZURpcmVjdG9yeX0vb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsciIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJncm9vdnlQYXJzZXJEaXJlY3RvcnkiIHZhbHVlPSIke2FudGxyRGlyZWN0b3J5fS9wYXJzZXIiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iamF2YVBhcnNlckRpcmVjdG9yeSIgdmFsdWU9IiR7YW50bHJEaXJlY3Rvcnl9L2phdmEiLz4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJjb21waWxlTGliRGlyZWN0b3J5IiB2YWx1ZT0iJHt0YXJnZXRMaWJEaXJlY3Rvcnl9L2NvbXBpbGUiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0idGVzdExpYkRpcmVjdG9yeSIgdmFsdWU9IiR7dGFyZ2V0TGliRGlyZWN0b3J5fS90ZXN0Ii8+CisgICAgPHByb3BlcnR5IG5hbWU9InJ1bnRpbWVMaWJEaXJlY3RvcnkiIHZhbHVlPSIke3RhcmdldExpYkRpcmVjdG9yeX0vcnVudGltZSIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b29sc0xpYkRpcmVjdG9yeSIgdmFsdWU9IiR7dGFyZ2V0TGliRGlyZWN0b3J5fS90b29scyIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJleGFtcGxlc0xpYkRpcmVjdG9yeSIgdmFsdWU9IiR7dGFyZ2V0TGliRGlyZWN0b3J5fS9leGFtcGxlcyIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJqdW5pdFJhd0RpcmVjdG9yeSIgdmFsdWU9IiR7dGFyZ2V0RGlyZWN0b3J5fS90ZXN0LXJlcG9ydHMiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ianVuaXRSZXBvcnRzRGlyZWN0b3J5IiB2YWx1ZT0iJHtyZXBvcnRzRGlyZWN0b3J5fS9qdW5pdCIvPgorCisgICAgPG1hY3JvZGVmIG5hbWU9ImFudGZvcmtlZCI+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFyZ2V0Ii8+CisgICAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC5sYXVuY2guTGF1bmNoZXIiIGZvcms9InRydWUiIG1heG1lbW9yeT0iMjU2bSIgZmFpbG9uZXJyb3I9InRydWUiPgorICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InJ1bnRpbWVQYXRoIi8+CisgICAgICAgICAgICAgICAgPGFyZyB2YWx1ZT0iQHt0YXJnZXR9Ii8+CisgICAgICAgICAgICA8L2phdmE+CisgICAgICAgIDwvc2VxdWVudGlhbD4KKyAgICA8L21hY3JvZGVmPgorICAgIAorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L2NvbmZpZy9idWlsZC9pbmRleC5odG1sIGIvZ3Jvb3Z5L2NvbmZpZy9idWlsZC9pbmRleC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1Yzg0NjQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvY29uZmlnL2J1aWxkL2luZGV4Lmh0bWwKQEAgLTAsMCArMSwxNiBAQAorPGh0bWw+Cis8Ym9keT4KKzxoMT5CdWlsZCBSZXN1bHRzPC9oMT4KKzxpbWcgc3JjPSIuLi8uLi9pbWFnZXMvRHVrZUdyb292eUNoYWlyLmpwZyIgYWxpZ249InJpZ2h0IiBhbHQ9Imdyb292eSBidWlsZCBwaWN0dXJlIiAvPgorPGgzPlJlcG9ydHM8L2gzPgorPHVsPgorICAgIDxsaT48YSBocmVmPSJyZXBvcnRzL2p1bml0L2luZGV4Lmh0bWwiPkpVbml0PC9hPjwvbGk+CisgICAgPGxpPjxhIGhyZWY9InJlcG9ydHMvY2hlY2tzdHlsZS9pbmRleC5odG1sIj5DaGVja3N0eWxlPC9hPjwvbGk+CisgICAgPGxpPjxhIGhyZWY9InJlcG9ydHMvY29iZXJ0dXJhL2luZGV4Lmh0bWwiPkNvdmVyYWdlPC9hPjwvbGk+Cis8L3VsPgorPGgzPkRlbGl2ZXJhYmxlczwvaDM+Cis8dWw+CisgICAgPGxpPjxhIGhyZWY9ImRpc3QiPkRlbGl2ZXJhYmxlczwvYT48L2xpPgorPC91bD4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvY29uZmlnL2NoZWNrc3R5bGUvY2hlY2tzdHlsZS1mcmFtZXMueHNsIGIvZ3Jvb3Z5L2NvbmZpZy9jaGVja3N0eWxlL2NoZWNrc3R5bGUtZnJhbWVzLnhzbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDMwZjA4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L2NvbmZpZy9jaGVja3N0eWxlL2NoZWNrc3R5bGUtZnJhbWVzLnhzbApAQCAtMCwwICsxLDM5NCBAQAorPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB2ZXJzaW9uPSIxLjAiCisgICAgeG1sbnM6bHhzbHQ9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0IgorICAgIHhtbG5zOnJlZGlyZWN0PSJodHRwOi8veG1sLmFwYWNoZS5vcmcveGFsYW4vcmVkaXJlY3QiCisgICAgZXh0ZW5zaW9uLWVsZW1lbnQtcHJlZml4ZXM9InJlZGlyZWN0Ij4KKworPCEtLQorIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKKworIENvcHlyaWdodCAoYykgMjAwMiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCisgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyBhcmUgbWV0OgorCisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAgICBkaXN0cmlidXRpb24uCisKKyAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwgaWYKKyAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZ2VtZW50OgorICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQorICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgorICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZ2VtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKKyAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWdlbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorCisgNC4gVGhlIG5hbWVzICJUaGUgSmFrYXJ0YSBQcm9qZWN0IiwgIkFudCIsIGFuZCAiQXBhY2hlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KKworIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCisgICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgorCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAorIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCisgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorIFNVQ0ggREFNQUdFLgorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQorIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQorIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQorIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KKyAtLT4KKworICAgIDx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgaW5kZW50PSJ5ZXMiIGVuY29kaW5nPSJVUy1BU0NJSSIvPgorICAgIDx4c2w6ZGVjaW1hbC1mb3JtYXQgZGVjaW1hbC1zZXBhcmF0b3I9Ii4iIGdyb3VwaW5nLXNlcGFyYXRvcj0iLCIgLz4KKworICAgIDx4c2w6a2V5IG5hbWU9ImZpbGVzIiBtYXRjaD0iZmlsZSIgdXNlPSJAbmFtZSIvPgorICAgIDx4c2w6a2V5IG5hbWU9ImVycm9yZmlsZXMiIG1hdGNoPSJmaWxlW2NvdW50KGVycm9yKT4wXSIgdXNlPSJAbmFtZSIvPgorICAgIDx4c2w6a2V5IG5hbWU9InZpb2xhdGlvbnMiIG1hdGNoPSJmaWxlL2Vycm9yIiB1c2U9IkBzb3VyY2UiLz4KKworICAgIDx4c2w6cGFyYW0gbmFtZT0ib3V0cHV0LmRpciIgc2VsZWN0PSInLiciLz4KKworCTx4c2w6dmFyaWFibGUgbmFtZT0iYWxsRmlsZXMiIHNlbGVjdD0iL2NoZWNrc3R5bGUvZmlsZVtAbmFtZSBhbmQgZ2VuZXJhdGUtaWQoLikgPSBnZW5lcmF0ZS1pZChrZXkoJ2ZpbGVzJywgQG5hbWUpKV0iLz4KKwk8eHNsOnZhcmlhYmxlIG5hbWU9ImFsbEZpbGVzV2l0aEVycm9yIiBzZWxlY3Q9Ii9jaGVja3N0eWxlL2ZpbGVbQG5hbWUgYW5kIGdlbmVyYXRlLWlkKC4pID0gZ2VuZXJhdGUtaWQoa2V5KCdlcnJvcmZpbGVzJywgQG5hbWUpKV0iLz4KKworICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImNoZWNrc3R5bGUiPgorICAgICAgICA8IS0tIGNyZWF0ZSB0aGUgaW5kZXguaHRtbCAtLT4KKyAgICAgICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0vaW5kZXguaHRtbCI+CisgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iaW5kZXguaHRtbCIvPgorICAgICAgICA8L3JlZGlyZWN0OndyaXRlPgorCisgICAgICAgIDwhLS0gY3JlYXRlIHRoZSBzdHlsZXNoZWV0LmNzcyAtLT4KKyAgICAgICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0vc3R5bGVzaGVldC5jc3MiPgorICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InN0eWxlc2hlZXQuY3NzIi8+CisgICAgICAgIDwvcmVkaXJlY3Q6d3JpdGU+CisKKyAgICAgICAgPCEtLSBjcmVhdGUgdGhlIG92ZXJ2aWV3LXN1bW1hcnkuaHRtbCBhdCB0aGUgcm9vdCAtLT4KKyAgICAgICAgPHJlZGlyZWN0OndyaXRlIGZpbGU9Inskb3V0cHV0LmRpcn0vb3ZlcnZpZXctZnJhbWUuaHRtbCI+CisgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9Im92ZXJ2aWV3Ii8+CisgICAgICAgIDwvcmVkaXJlY3Q6d3JpdGU+CisKKyAgICAgICAgPCEtLSBjcmVhdGUgdGhlIGFsbC1jbGFzc2VzLmh0bWwgYXQgdGhlIHJvb3QgLS0+CisgICAgICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L2FsbGNsYXNzZXMtZnJhbWUuaHRtbCI+CisgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9ImFsbC5jbGFzc2VzIi8+CisgICAgICAgIDwvcmVkaXJlY3Q6d3JpdGU+CisKKyAgICAgICAgPCEtLSBwcm9jZXNzIGFsbCBmaWxlcyAtLT4KKyAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIkYWxsRmlsZXNXaXRoRXJyb3IiLz4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDx4c2w6dGVtcGxhdGUgbmFtZT0iaW5kZXguaHRtbCI+CisgICAgICAgIDxodG1sPgorICAgICAgICAgICAgPGhlYWQ+CisgICAgICAgICAgICAgICAgPHRpdGxlPkNoZWNrU3R5bGUgQXVkaXQ8L3RpdGxlPgorICAgICAgICAgICAgPC9oZWFkPgorICAgICAgICAgICAgPGZyYW1lc2V0IGNvbHM9IjIwJSw4MCUiPgorICAgICAgICAgICAgICAgIDxmcmFtZSBzcmM9ImFsbGNsYXNzZXMtZnJhbWUuaHRtbCIgbmFtZT0iZmlsZUxpc3RGcmFtZSIvPgorICAgICAgICAgICAgICAgIDxmcmFtZSBzcmM9Im92ZXJ2aWV3LWZyYW1lLmh0bWwiIG5hbWU9ImZpbGVGcmFtZSIvPgorICAgICAgICAgICAgPC9mcmFtZXNldD4KKyAgICAgICAgICAgIDxub2ZyYW1lcz4KKyAgICAgICAgICAgICAgICA8aDI+RnJhbWUgQWxlcnQ8L2gyPgorICAgICAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgICAgICBUaGlzIGRvY3VtZW50IGlzIGRlc2lnbmVkIHRvIGJlIHZpZXdlZCB1c2luZyB0aGUgZnJhbWVzIGZlYXR1cmUuIElmIHlvdSBzZWUgdGhpcyBtZXNzYWdlLCB5b3UgYXJlIHVzaW5nIGEgbm9uLWZyYW1lLWNhcGFibGUgd2ViIGNsaWVudC4KKyAgICAgICAgICAgICAgICA8L3A+CisgICAgICAgICAgICA8L25vZnJhbWVzPgorICAgICAgICA8L2h0bWw+CisgICAgPC94c2w6dGVtcGxhdGU+CisKKyAgICA8eHNsOnRlbXBsYXRlIG5hbWU9InBhZ2VIZWFkZXIiPgorICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIj4KKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InRleHQtYWxpZ246cmlnaHQiPjxoMj5DaGVja1N0eWxlIEF1ZGl0PC9oMj48L3RkPgorICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InRleHQtYWxpZ246cmlnaHQiPkRlc2lnbmVkIGZvciB1c2Ugd2l0aCA8YSBocmVmPSdodHRwOi8vY2hlY2tzdHlsZS5zb3VyY2Vmb3JnZS5uZXQvJz5DaGVja1N0eWxlPC9hPiBhbmQgPGEgaHJlZj0naHR0cDovL2pha2FydGEuYXBhY2hlLm9yZyc+QW50PC9hPi48L3RkPgorICAgICAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgICAgPGhyIHNpemU9IjEiLz4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImNoZWNrc3R5bGUiIG1vZGU9Im92ZXJ2aWV3Ij4KKyAgICAgICAgPGh0bWw+CisgICAgICAgICAgICA8aGVhZD4KKyAgICAgICAgICAgICAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJzdHlsZXNoZWV0LmNzcyIvPgorICAgICAgICAgICAgPC9oZWFkPgorICAgICAgICAgICAgPGJvZHk+CisgICAgICAgICAgICAgICAgPCEtLSBwYWdlIGhlYWRlciAtLT4KKyAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFnZUhlYWRlciIvPgorCisgICAgICAgICAgICAgICAgPCEtLSBTdW1tYXJ5IHBhcnQgLS0+CisgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJzdW1tYXJ5Ii8+CisgICAgICAgICAgICAgICAgPGhyIHNpemU9IjEiIHdpZHRoPSIxMDAlIiBhbGlnbj0ibGVmdCIvPgorCisgICAgICAgICAgICAgICAgPCEtLSBGaWxlIGxpc3QgcGFydCAtLT4KKyAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9ImZpbGVsaXN0Ii8+CisgICAgICAgICAgICA8L2JvZHk+CisgICAgICAgIDwvaHRtbD4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDx4c2w6dGVtcGxhdGUgbmFtZT0ic3R5bGVzaGVldC5jc3MiPgorICAgICAgICAuYmFubmVyY2VsbCB7CisgICAgICAgIGJvcmRlcjogMHB4OworICAgICAgICBwYWRkaW5nOiAwcHg7CisgICAgICAgIH0KKyAgICAgICAgYm9keSB7CisgICAgICAgIG1hcmdpbi1sZWZ0OiAxMDsKKyAgICAgICAgbWFyZ2luLXJpZ2h0OiAxMDsKKyAgICAgICAgZm9udDpub3JtYWwgODAlIGFyaWFsLGhlbHZldGljYSxzYW5zZXJpZjsKKyAgICAgICAgYmFja2dyb3VuZC1jb2xvcjojRkZGRkZGOworICAgICAgICBjb2xvcjojMDAwMDAwOworICAgICAgICB9CisgICAgICAgIC5hIHRkIHsKKyAgICAgICAgYmFja2dyb3VuZDogI2VmZWZlZjsKKyAgICAgICAgfQorICAgICAgICAuYiB0ZCB7CisgICAgICAgIGJhY2tncm91bmQ6ICNmZmY7CisgICAgICAgIH0KKyAgICAgICAgdGgsIHRkIHsKKyAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKKyAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgICAgICAgfQorICAgICAgICB0aCB7CisgICAgICAgIGZvbnQtd2VpZ2h0OmJvbGQ7CisgICAgICAgIGJhY2tncm91bmQ6ICNjY2M7CisgICAgICAgIGNvbG9yOiBibGFjazsKKyAgICAgICAgfQorICAgICAgICB0YWJsZSwgdGgsIHRkIHsKKyAgICAgICAgZm9udC1zaXplOjEwMCU7CisgICAgICAgIGJvcmRlcjogbm9uZQorICAgICAgICB9CisgICAgICAgIHRhYmxlLmxvZyB0ciB0ZCwgdHIgdGggeworCisgICAgICAgIH0KKyAgICAgICAgaDIgeworICAgICAgICBmb250LXdlaWdodDpib2xkOworICAgICAgICBmb250LXNpemU6MTQwJTsKKyAgICAgICAgbWFyZ2luLWJvdHRvbTogNTsKKyAgICAgICAgfQorICAgICAgICBoMyB7CisgICAgICAgIGZvbnQtc2l6ZToxMDAlOworICAgICAgICBmb250LXdlaWdodDpib2xkOworICAgICAgICBiYWNrZ3JvdW5kOiAjNTI1RDc2OworICAgICAgICBjb2xvcjogd2hpdGU7CisgICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAgICAgICAgcGFkZGluZzogNXB4OworICAgICAgICBtYXJnaW4tcmlnaHQ6IDJweDsKKyAgICAgICAgbWFyZ2luLWxlZnQ6IDJweDsKKyAgICAgICAgbWFyZ2luLWJvdHRvbTogMDsKKyAgICAgICAgfQorICAgIDwveHNsOnRlbXBsYXRlPgorCisgICAgPCEtLQorICAgIFJlcGxhY2UgRE9TIGNoYXJhY3RlcnMgaW4gYSBwYXRoLgorICAgIFJlcGxhY2UgJ1wnIHdpdGggJy8nLCAnOicgd2l0aCAnXycuCisgICAgLS0+CisgICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJmcm9tLWRvcyI+CisgICAgICAgIDx4c2w6cGFyYW0gbmFtZT0icGF0aCIvPgorICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idHJhbnNsYXRlKCRwYXRoLCAnXDonLCAnL18nKSIvPgorICAgIDwveHNsOnRlbXBsYXRlPgorCisgICAgPCEtLQorICAgIENyZWF0ZXMgYW4gYWxsLWNsYXNzZXMuaHRtbCBmaWxlIHRoYXQgY29udGFpbnMgYSBsaW5rIHRvIGFsbCBmaWxlcy4KKyAgICAtLT4KKyAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJjaGVja3N0eWxlIiBtb2RlPSJhbGwuY2xhc3NlcyI+CisgICAgICAgIDxodG1sPgorICAgICAgICAgICAgPGhlYWQ+CisgICAgICAgICAgICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0ic3R5bGVzaGVldC5jc3MiLz4KKyAgICAgICAgICAgIDwvaGVhZD4KKyAgICAgICAgICAgIDxib2R5PgorICAgICAgICAgICAgICAgIDxoMj5GaWxlczwvaDI+CisgICAgICAgICAgICAgICAgPHA+PGEgaHJlZj0ib3ZlcnZpZXctZnJhbWUuaHRtbCIgdGFyZ2V0PSJmaWxlRnJhbWUiPlN1bW1hcnk8L2E+PC9wPgorICAgICAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiPgorICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBGb3IgZWFjaCBmaWxlIGNyZWF0ZSBpdHMgcGFydCAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iJGFsbEZpbGVzV2l0aEVycm9yIiBtb2RlPSJhbGwuY2xhc3NlcyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iQG5hbWUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmFwcGx5LXRlbXBsYXRlcz4KKyAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICA8L3A+CisgICAgICAgICAgICA8L2JvZHk+CisgICAgICAgIDwvaHRtbD4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImNoZWNrc3R5bGUiIG1vZGU9ImZpbGVsaXN0Ij4KKyAgICAgICAgPGgzPkZpbGVzPC9oMz4KKyAgICAgICAgPHRhYmxlIGNsYXNzPSJsb2ciIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIyIiB3aWR0aD0iMTAwJSI+CisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgPHRoPk5hbWU8L3RoPgorICAgICAgICAgICAgICAgIDx0aD5FcnJvcnM8L3RoPgorICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iJGFsbEZpbGVzV2l0aEVycm9yIiBtb2RlPSJmaWxlbGlzdCI+CisgICAgICAgICAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iQG5hbWUiLz4KKyAgICAgICAgICAgIDwveHNsOmFwcGx5LXRlbXBsYXRlcz4KKyAgICAgICAgPC90YWJsZT4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImZpbGUiIG1vZGU9ImZpbGVsaXN0Ij4KKyAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJuYW1lIiBzZWxlY3Q9IkBuYW1lIiAvPgorCisgICAgICAgIDwhLS08eHNsOmlmIHRlc3Q9IiRmaXJzdCA9ICd0cnVlJyI+LS0+CisgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im5ldy1uYW1lIj4KKyAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZnJvbS1kb3MiPgorICAgICAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0icGF0aCIgc2VsZWN0PSJAbmFtZSIvPgorICAgICAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICAgICAgICA8L3hzbDp2YXJpYWJsZT4KKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWx0ZXJuYXRlZC1yb3ciIC8+CisgICAgICAgICAgICAgICAgPHRkIG5vd3JhcD0ibm93cmFwIj4KKyAgICAgICAgICAgICAgICAgICAgPGE+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnRleHQ+ZmlsZXMvPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5ldy1uYW1lIi8+PHhzbDp0ZXh0Pi5odG1sPC94c2w6dGV4dD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgorICAgICAgICAgICAgICAgICAgICA8L2E+CisgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvdW50KC4uL2ZpbGVbQG5hbWUgPSAkbmFtZV0vZXJyb3IpIi8+PC90ZD4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgIDwhLS08L3hzbDppZj4tLT4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImZpbGUiIG1vZGU9ImFsbC5jbGFzc2VzIj4KKworICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im5ldy1uYW1lIj4KKyAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJmcm9tLWRvcyI+CisgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhdGgiIHNlbGVjdD0iQG5hbWUiLz4KKyAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICAgIDwveHNsOnZhcmlhYmxlPgorICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGQgbm93cmFwPSJub3dyYXAiPgorICAgICAgICAgICAgICAgIDxhIHRhcmdldD0iZmlsZUZyYW1lIj4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnRleHQ+ZmlsZXMvPC94c2w6dGV4dD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmV3LW5hbWUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dGV4dD4uaHRtbDwveHNsOnRleHQ+CisgICAgICAgICAgICAgICAgICAgIDwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+CisgICAgICAgICAgICAgICAgPC9hPgorICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgPC90cj4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDwhLS0KKyAgICB0cmFuc2Zvcm0gc3RyaW5nIGxpa2UgYS9iL2MgdG8gLi4vLi4vLi4vCisgICAgQHBhcmFtIHBhdGggdGhlIHBhdGggdG8gdHJhbnNmb3JtIGludG8gYSBkZXNjZW5kaW5nIGRpcmVjdG9yeSBwYXRoCisgICAgLS0+CisgICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwYXRoIj4KKyAgICAgICAgPHhzbDpwYXJhbSBuYW1lPSJwYXRoIi8+CisgICAgICAgIDx4c2w6aWYgdGVzdD0iY29udGFpbnMoJHBhdGgsJy8nKSI+CisgICAgICAgICAgICA8eHNsOnRleHQ+Li4vPC94c2w6dGV4dD4KKyAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYXRoIj4KKyAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0icGF0aCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1hZnRlcigkcGF0aCwnLycpIi8+PC94c2w6d2l0aC1wYXJhbT4KKyAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICAgIDwveHNsOmlmPgorICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChjb250YWlucygkcGF0aCwnLycpKSBhbmQgbm90KCRwYXRoID0gJycpIj4KKyAgICAgICAgICAgIDx4c2w6dGV4dD4uLi88L3hzbDp0ZXh0PgorICAgICAgICA8L3hzbDppZj4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImZpbGUiPgorICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im5hbWUiIHNlbGVjdD0iQG5hbWUiLz4KKworICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im5ldy1uYW1lIj4KKyAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJmcm9tLWRvcyI+CisgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhdGgiIHNlbGVjdD0iQG5hbWUiLz4KKyAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICAgIDwveHNsOnZhcmlhYmxlPgorICAgICAgICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS9maWxlcy97JG5ldy1uYW1lfS5odG1sIj4KKyAgICAgICAgICAgIDxodG1sPgorICAgICAgICAgICAgICAgIDxoZWFkPgorICAgICAgICAgICAgICAgICAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYXRoIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhdGgiIHNlbGVjdD0iJG5ldy1uYW1lIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnRleHQ+c3R5bGVzaGVldC5jc3M8L3hzbDp0ZXh0PgorICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgICAgICAgICA8L2xpbms+CisgICAgICAgICAgICAgICAgPC9oZWFkPgorICAgICAgICAgICAgICAgIDxib2R5PgorICAgICAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFnZUhlYWRlciIvPgorICAgICAgICAgICAgICAgICAgICA8aDM+RmlsZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4gPC9oMz4KKyAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJsb2ciIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIyIiB3aWR0aD0iMTAwJSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPkVycm9yIERlc2NyaXB0aW9uPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+TGluZTwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Ii4uL2ZpbGVbQG5hbWUgPSAkbmFtZV0vZXJyb3IiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFsdGVybmF0ZWQtcm93Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbWVzc2FnZSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxpbmUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+CisgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgPC9ib2R5PgorICAgICAgICAgICAgPC9odG1sPgorICAgICAgICA8L3JlZGlyZWN0OndyaXRlPgorICAgIDwveHNsOnRlbXBsYXRlPgorCisgICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY2hlY2tzdHlsZSIgbW9kZT0ic3VtbWFyeSI+CisgICAgICAgIDxoMz5TdW1tYXJ5PC9oMz4KKyAgICAgICAgPHRhYmxlIGNsYXNzPSJsb2ciIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIyIiB3aWR0aD0iMTAwJSI+CisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgPHRoPkZpbGVzPC90aD4KKyAgICAgICAgICAgICAgICA8dGg+RmlsZXMgd2l0aCBFcnJvcnM8L3RoPgorICAgICAgICAgICAgICAgIDx0aD5FcnJvcnM8L3RoPgorICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWx0ZXJuYXRlZC1yb3ciLz4KKyAgICAgICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvdW50KCRhbGxGaWxlcykiLz48L3RkPgorICAgICAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iY291bnQoJGFsbEZpbGVzV2l0aEVycm9yKSIvPjwvdGQ+CisgICAgICAgICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb3VudChmaWxlL2Vycm9yKSIvPjwvdGQ+CisgICAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgICA8dGFibGUgY2xhc3M9ImxvZyIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSIxMDAlIj4KKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICA8dGg+Q2hlY2s8L3RoPgorICAgICAgICAgICAgICAgIDx0aD5OdW1iZXIgb2YgVmlvbGF0aW9uczwvdGg+CisgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImZpbGUvZXJyb3JbQHNvdXJjZSBhbmQgZ2VuZXJhdGUtaWQoLikgPSBnZW5lcmF0ZS1pZChrZXkoJ3Zpb2xhdGlvbnMnLCBAc291cmNlKSldIj4KKyAgICAgICAgICAgICAgICA8eHNsOnNvcnQgc2VsZWN0PSJAc291cmNlIi8+CisgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzb3VyY2UiIHNlbGVjdD0iQHNvdXJjZSIvPgorICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFsdGVybmF0ZWQtcm93Ii8+CisgICAgICAgICAgICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc291cmNlIi8+CisgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb3VudCgvY2hlY2tzdHlsZS9maWxlL2Vycm9yW0Bzb3VyY2U9JHNvdXJjZV0pIi8+CisgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgorICAgICAgICA8L3RhYmxlPgorICAgIDwveHNsOnRlbXBsYXRlPgorCisgICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJhbHRlcm5hdGVkLXJvdyI+CisgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj4KKyAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSBtb2QgMiA9IDEiPmE8L3hzbDppZj4KKyAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSBtb2QgMiA9IDAiPmI8L3hzbDppZj4KKyAgICAgICAgPC94c2w6YXR0cmlidXRlPgorICAgIDwveHNsOnRlbXBsYXRlPgorCis8L3hzbDpzdHlsZXNoZWV0PgorCmRpZmYgLS1naXQgYS9ncm9vdnkvY29uZmlnL2NoZWNrc3R5bGUvY29uZmlnLnhtbCBiL2dyb292eS9jb25maWcvY2hlY2tzdHlsZS9jb25maWcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNmIxOWQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvY29uZmlnL2NoZWNrc3R5bGUvY29uZmlnLnhtbApAQCAtMCwwICsxLDE2MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IURPQ1RZUEUgbW9kdWxlIFBVQkxJQworICAgICAgICAiLS8vUHVwcHkgQ3Jhd2wvL0RURCBDaGVjayBDb25maWd1cmF0aW9uIDEuMS8vRU4iCisgICAgICAgICJodHRwOi8vd3d3LnB1cHB5Y3Jhd2wuY29tL2R0ZHMvY29uZmlndXJhdGlvbl8xXzEuZHRkIj4KKzwhLS0KKworICBBIENoZWNrc3R5bGUgY29uZmlndXJhdGlvbiB0aGF0IGNoZWNrcyBhZ2FpbnN0IHRoZSByZWNvbW1lbmRhdGlvbnMKKyAgaW4gSm9zaHVhIEJsb2NoLCBFZmZlY3RpdmUgSmF2YSAoaGlnaGx5IHJlY29tbWVuZGVkIHJlYWQhKQorCisgIFRoaXMgZmlsZSBkb2VzIE5PVCBkdXBsaWNhdGUgdGhlIGNoZWNrcyBmb3Igd2hpdGVzcGFjZSBzZXR0aW5ncywKKyAgcGxhY2VtZW50IG9mIGN1cmx5IGJyYWNlcywgZXRjLiAgT25seSB0aGUgcnVsZXMgdGhhdCBhcmUgZXhwbGljaXRseQorICBtZW50aW9uZWQgaW4gdGhlIGJvb2sgYXJlIGVuZm9yY2VkLgorCisgIEN1cnJlbnRseSB0aGUgYW1vdW50IG9mIHJ1bGVzIHRoYXQgY2FuIGJlIGF1dG9tYXRpY2FsbHkgY2hlY2tlZCBieQorICBDaGVja3N0eWxlIGlzIG5vdCB2ZXJ5IGxhcmdlLCBidXQgYWRkaW5nIG1vcmUgY2hlY2tzIG9mIHRoaXMgcXVhbGl0eQorICBpcyBhIGhpZ2ggcHJpb3JpdHkgZ29hbCBmb3IgdGhlIGRldmVsb3BtZW50IHRlYW0uCisKKy0tPgorCis8bW9kdWxlIG5hbWU9IkNoZWNrZXIiPgorICAgIDwhLS0gY2hlY2tzdHlsZS5iYXNlZGlyIGlzIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIHNvdXJjZXMsIHNldCBpbiBhbnQncyBidWlsZC54bWwgLS0+CisgICAgPHByb3BlcnR5IG5hbWU9ImJhc2VkaXIiIHZhbHVlPSIke2NoZWNrc3R5bGUuYmFzZWRpcn0iLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9jYWxlQ291bnRyeSIgdmFsdWU9ImVuIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvY2FsZUxhbmd1YWdlIiB2YWx1ZT0iZW4iLz4KKworICAgIDxtb2R1bGUgbmFtZT0iVHJlZVdhbGtlciI+CisKKyAgICAgICAgPCEtLSBJdGVtIDQgLSBBdm9pZCBjcmVhdGluZyBkdXBsaWNhdGUgb2JqZWN0cyAtLT4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJJbGxlZ2FsSW5zdGFudGlhdGlvbiI+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NlcyIgdmFsdWU9ImphdmEubGFuZy5Cb29sZWFuLCBqYXZhLmxhbmcuU3RyaW5nIi8+CisgICAgICAgIDwvbW9kdWxlPgorCisgICAgICAgIDwhLS0gSXRlbSA2IC0gQXZvaWQgZmluYWxpemVycyAtLT4KKyAgICAgICAgPCEtLSB0aGlzIHdpbGwgbm90IGZpbmQgdmlvbGF0aW9ucyB0aGF0IGNvbnRhaW4gbGluZWJyZWFrcyAtLT4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJHZW5lcmljSWxsZWdhbFJlZ2V4cCI+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZm9ybWF0IgorICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSIoKHB1YmxpYyl8KHByb3RlY3RlZCkpXHMrdm9pZFxzK2ZpbmFsaXplXChccypcKSIvPgorICAgICAgICA8L21vZHVsZT4KKworICAgICAgICA8IS0tIEl0ZW0gOCAtIEFsd2F5cyBvdmVycmlkZSBoYXNoQ29kZSB3aGVuIHlvdSBvdmVycmlkZSBlcXVhbHMgLS0+CisgICAgICAgIDxtb2R1bGUgbmFtZT0iRXF1YWxzSGFzaENvZGUiLz4KKworICAgICAgICA8IS0tIEl0ZW0gMTIgLSBNYWtlIGFsbCBmaWVsZHMgcHJpdmF0ZSAtLT4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJWaXNpYmlsaXR5TW9kaWZpZXIiPgorICAgICAgICAgICAgPCEtLSBUT0RPOiBhZGQgb25lIG9yIGJvdGggb2YgdGhlc2UgYmFjayBpbj8gLS0+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icHJvdGVjdGVkQWxsb3dlZCIgdmFsdWU9InRydWUiLz4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwYWNrYWdlQWxsb3dlZCIgdmFsdWU9InRydWUiLz4KKyAgICAgICAgPC9tb2R1bGU+CisKKyAgICAgICAgPCEtLSBJdGVtIDE1IC0gRGVzaWduIGFuZCBkb2N1bWVudCBmb3IgaW5oZXJpdGFuY2Ugb3IgZWxzZSBwcm9oaWJpdCBpdCAtLT4KKyAgICAgICAgPCEtLSB0aGUgbW9kdWxlIGFjdHVhbGx5IGltcGxlbWVudHMgYSB2ZXJ5IHN0cmljdCBydWxlLCBpdCB3b3VsZCBiZQorICAgICAgICAgICAgIGludGVyZXN0aW5nIHRvIGtub3cgd2hldGhlciBKb3NodWEgbWVhbnQgd2hhdCBjaGVja3N0eWxlIGltcGxlbWVudHMuCisgICAgICAgICAgICAgV2UgZmVlbCB0aGlzIGltcGxlbWVudGF0aW9uIGlzIHdlbGwgc3VpdGVkIGFzIGEgd2FybmluZywKKyAgICAgICAgICAgICBpLmUuIGlmIHlvdSBnZXQgZXJyb3IgbWVzc2FnZXMgZnJvbSB0aGlzIGNoZWNrIHlvdSBzaG91bGQgYmUKKyAgICAgICAgICAgICBhYmxlIHRvIG5hbWUgYSBnb29kIHJlYXNvbiB0byBpbXBsZW1lbnQgeW91ciBjb2RlIHRoZSB3YXkgeW91IGRvIGl0LAorICAgICAgICAgICAgIGVzcGVjaWFsbHkgaWYgeW91IGFyZSBkZXNpZ25pbmcgYSBsaWJyYXJ5IGFuZCBub3QgYW4gYXBwbGljYXRpb24uCisKKyAgICAgICAgPG1vZHVsZSBuYW1lPSJEZXNpZ25Gb3JFeHRlbnNpb24iPgorICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzZXZlcml0eSIgdmFsdWU9Indhcm5pbmciLz4KKyAgICAgICAgPC9tb2R1bGU+CisgICAgICAgICAgLS0+CisKKyAgICAgICAgPCEtLSBJdGVtIDE3IC0gVXNlIGludGVyZmFjZXMgb25seSB0byBkZWZpbmUgdHlwZXMgLS0+CisgICAgICAgIDxtb2R1bGUgbmFtZT0iSW50ZXJmYWNlSXNUeXBlIi8+CisKKyAgICAgICAgPCEtLSBJdGVtIDI1IC0gRGVzaWduIG1ldGhvZCBzaWduYXR1cmVzIGNhcmVmdWxseSAtLT4KKyAgICAgICAgPCEtLSBBdm9pZCBsb25nIHBhcmFtZXRlciBsaXN0cyAtLT4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJQYXJhbWV0ZXJOdW1iZXIiPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1heCIgdmFsdWU9IjYiLz4KKyAgICAgICAgPC9tb2R1bGU+CisKKyAgICAgICAgPCEtLSBJdGVtIDI4IC0gV3JpdGUgZG9jIGNvbW1lbnRzIGZvciBhbGwgZXhwb3NlZCBBUEkgZWxlbWVudHMKKworICAgICAgICA8bW9kdWxlIG5hbWU9IkphdmFkb2NUeXBlIj4KKyAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2NvcGUiIHZhbHVlPSJwcm90ZWN0ZWQiLz4KKyAgICAgICAgPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGUgbmFtZT0iSmF2YWRvY01ldGhvZCI+CisgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNjb3BlIiB2YWx1ZT0icHJvdGVjdGVkIi8+CisgICAgICAgIDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlIG5hbWU9IkphdmFkb2NWYXJpYWJsZSI+CisgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNjb3BlIiB2YWx1ZT0icHJvdGVjdGVkIi8+CisgICAgICAgIDwvbW9kdWxlPgorICAgICAgICAtLT4KKworCisgICAgICAgIDwhLS0gSXRlbSAzOCAtIEFkaGVyZSB0byBnZW5lcmFsbHkgYWNjZXB0ZWQgbmFtaW5nIGNvbnZlbnRpb25zIC0tPgorICAgICAgICA8bW9kdWxlIG5hbWU9IlBhY2thZ2VOYW1lIj4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb3JtYXQiIHZhbHVlPSJeW2Etel0rKFwuW2Etel1bYS16MC05XXsxLDIyfSkqJCIvPgorICAgICAgICA8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJUeXBlTmFtZSIvPgorICAgICAgICA8bW9kdWxlIG5hbWU9IkNvbnN0YW50TmFtZSIvPgorICAgICAgICA8bW9kdWxlIG5hbWU9IkxvY2FsRmluYWxWYXJpYWJsZU5hbWUiLz4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJMb2NhbFZhcmlhYmxlTmFtZSIvPgorICAgICAgICA8bW9kdWxlIG5hbWU9Ik1lbWJlck5hbWUiLz4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJNZXRob2ROYW1lIi8+CisgICAgICAgIDxtb2R1bGUgbmFtZT0iUGFyYW1ldGVyTmFtZSIvPgorICAgICAgICA8bW9kdWxlIG5hbWU9IlN0YXRpY1ZhcmlhYmxlTmFtZSIvPgorCisgICAgICAgIDwhLS0gSXRlbSA0NyAtIERvbid0IGlnbm9yZSBleGNlcHRpb25zIC0tPgorICAgICAgICA8bW9kdWxlIG5hbWU9IkVtcHR5QmxvY2siPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRva2VucyIgdmFsdWU9IkxJVEVSQUxfQ0FUQ0giLz4KKyAgICAgICAgICAgIDwhLS0gcmVxdWlyZSBhIGNvbW1lbnQsIGNoYW5nZSB0byBzdG10IHRvIHJlcXVpcmUgYSBzdGF0ZW1lbnQgLS0+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ib3B0aW9uIiB2YWx1ZT0idGV4dCIvPgorICAgICAgICA8L21vZHVsZT4KKworICAgICAgICA8IS0tIG90aGVyIHN1biBjaGVja3MgLS0+CisgICAgICAgIDxtb2R1bGUgbmFtZT0iUmVkdW5kYW50SW1wb3J0Ii8+CisgICAgICAgIDxtb2R1bGUgbmFtZT0iVW51c2VkSW1wb3J0cyIvPgorICAgICAgICA8bW9kdWxlIG5hbWU9Ik1vZGlmaWVyT3JkZXIiLz4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJSZWR1bmRhbnRNb2RpZmllciIvPgorICAgICAgICA8IS0tIGN1cnJlbnQgc3R5bGUgaGFzIGxvdHMgb2Ygb2NjdXJyZW5jZXMgb2YgdGhpcywgb2ZmIGZvciBub3cgLS0+CisgICAgICAgIDwhLS08bW9kdWxlIG5hbWU9IkhpZGRlbkZpZWxkIi8+LS0+CisgICAgICAgIDxtb2R1bGUgbmFtZT0iTWlzc2luZ1N3aXRjaERlZmF1bHQiLz4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJEZWZhdWx0Q29tZXNMYXN0Ii8+CisgICAgICAgIDwhLS0gdmVyeSBsaWJlcmFsIHZhbHVlcyBmb3IgbWV0cmljcywgcGVyaGFwcyB0aWdodGVuIHNvbWUgbGF0ZXIgLS0+CisgICAgICAgIDxtb2R1bGUgbmFtZT0iSmF2YU5DU1MiPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1ldGhvZE1heGltdW0iIHZhbHVlPSI4MCIvPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzTWF4aW11bSIgdmFsdWU9IjMwMCIvPgorICAgICAgICA8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJDbGFzc0Zhbk91dENvbXBsZXhpdHkiPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1heCIgdmFsdWU9IjIyIi8+CisgICAgICAgIDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlIG5hbWU9IkNsYXNzRGF0YUFic3RyYWN0aW9uQ291cGxpbmciPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1heCIgdmFsdWU9IjE0Ii8+CisgICAgICAgIDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlIG5hbWU9IkN5Y2xvbWF0aWNDb21wbGV4aXR5Ij4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtYXgiIHZhbHVlPSIxNCIvPgorICAgICAgICA8L21vZHVsZT4KKyAgICAgICAgPCEtLSBUT0RPOiB0dXJuIHRoaXMgYmFjayBvbj8gLS0+CisgICAgICAgIDwhLS08bW9kdWxlIG5hbWU9IkV4cGxpY2l0SW5pdGlhbGl6YXRpb24iLz4tLT4KKyAgICAgICAgPCEtLSB0dXJuZWQgb2ZmIC0gaW5zdGVhZCwga2VlcCBtZXRob2RzIHNob3J0IGFuZCBtYWtlCisgICAgICAgICAgICAgcGFyYW1ldGVycyBmaW5hbCBpbiBjYXNlcyB3aGVyZSBjb25mdXNpb24gaXMgcG9zc2libGUgLS0+CisgICAgICAgIDwhLS08bW9kdWxlIG5hbWU9IlBhcmFtZXRlckFzc2lnbm1lbnQiLz4tLT4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJJbGxlZ2FsVHlwZSI+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZm9ybWF0IiB2YWx1ZT0iXiQiLz4KKyAgICAgICAgICAgIDwhLS0gb3RoZXJ3aXNlIGRlZmF1bHQgb2YgJypBYnN0cmFjdCcgaXMgaWxsZWdhbCAtLT4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpbGxlZ2FsQ2xhc3NOYW1lcyIgdmFsdWU9ImphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhciwgamF2YS51dGlsLkhhc2h0YWJsZSwgamF2YS51dGlsLkhhc2hTZXQsIGphdmEudXRpbC5IYXNoTWFwLCBqYXZhLnV0aWwuQXJyYXlMaXN0LCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcCwgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQsIGphdmEudXRpbC5UcmVlU2V0LCBqYXZhLnV0aWwuVHJlZU1hcCwgamF2YS51dGlsLlZlY3RvciIvPgorICAgICAgICA8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJVcHBlckVsbCIvPgorICAgICAgICA8IS0tIG9mZiBmb3Igbm93IC0gdG8gYWxsb3cgcGFyZW50ZXNlcyB3aGljaCBhZGQgY2xhcml0eSAtLT4KKyAgICAgICAgPCEtLTxtb2R1bGUgbmFtZT0iVW5uZWNlc3NhcnlQYXJlbnRoZXNlcyIvPi0tPgorICAgICAgICA8bW9kdWxlIG5hbWU9IkpVbml0VGVzdENhc2UiLz4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJGaW5hbENsYXNzIi8+CisgICAgICAgIDwhLS0gZ29vZCB0byBoYXZlIGJ1dCBwb2xsdXRlcyBjb3ZlcmFnZSAtLT4KKyAgICAgICAgPCEtLTxtb2R1bGUgbmFtZT0iSGlkZVV0aWxpdHlDbGFzc0NvbnN0cnVjdG9yIi8+LS0+CisgICAgICAgIDxtb2R1bGUgbmFtZT0iTXV0YWJsZUV4Y2VwdGlvbiIvPgorICAgICAgICA8IS0tIGFkZCBiZWxvdyBpbiBldmVudHVhbGx5PyAtLT4KKyAgICAgICAgPCEtLTxtb2R1bGUgbmFtZT0iTGVmdEN1cmx5Ij4tLT4KKyAgICAgICAgPCEtLTxwcm9wZXJ0eSBuYW1lPSJvcHRpb24iIHZhbHVlPSJubCIvPi0tPgorICAgICAgICA8IS0tPHByb3BlcnR5IG5hbWU9InRva2VucyIgdmFsdWU9IkNMQVNTX0RFRixJTlRFUkZBQ0VfREVGIi8+LS0+CisgICAgICAgIDwhLS08L21vZHVsZT4tLT4KKyAgICAgICAgPCEtLSBhZGQgYmVsb3cgaW4gZXZlbnR1YWxseSBmb3IgY29uc2lzdGVuY3kgLS0+CisgICAgICAgIDwhLS08bW9kdWxlIG5hbWU9IkFycmF5VHlwZVN0eWxlIi8+LS0+CisgICAgPC9tb2R1bGU+CisgICAgPG1vZHVsZSBuYW1lPSJQYWNrYWdlSHRtbCIvPgorICAgIDxtb2R1bGUgbmFtZT0iYXUuY29tLnJlZGhpbGxjb25zdWx0aW5nLnNpbWlhbi5TaW1pYW5DaGVjayI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0aHJlc2hvbGQiIHZhbHVlPSI4Ii8+CisgICAgICAgIDwhLS0gcmVtb3ZlIGxhbmd1YWdlIG9uY2UgU2ltaWFuIHVuZGVyc3RhbmRzIEdyb292eSAtLT4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9Imxhbmd1YWdlIiB2YWx1ZT0iamF2YSIvPgorICAgIDwvbW9kdWxlPgorPC9tb2R1bGU+CmRpZmYgLS1naXQgYS9ncm9vdnkvY29uZmlnL21hdmVuL2dyb292eS1hbGwtbWluaW1hbC54c2wgYi9ncm9vdnkvY29uZmlnL21hdmVuL2dyb292eS1hbGwtbWluaW1hbC54c2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VhNzMzNgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9jb25maWcvbWF2ZW4vZ3Jvb3Z5LWFsbC1taW5pbWFsLnhzbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgorICAgIHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCisgICAgZXhjbHVkZS1yZXN1bHQtcHJlZml4ZXM9IiNkZWZhdWx0IiB2ZXJzaW9uPSIxLjAiPgorCisgICAgPCEtLSByZW5hbWUgYXJ0aWZhY3RJZCAtLT4KKyAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvKltsb2NhbC1uYW1lKCkgPSAncHJvamVjdCddLypbbG9jYWwtbmFtZSgpID0gJ2FydGlmYWN0SWQnXSI+CisgICAgICAgIDxhcnRpZmFjdElkPmdyb292eS1hbGwtbWluaW1hbDwvYXJ0aWZhY3RJZD4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDwhLS0gcmVtb3ZlIGRlcGVuZGVuY2llcyAgLS0+CisgICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLypbbG9jYWwtbmFtZSgpID0gJ3Byb2plY3QnXS8qW2xvY2FsLW5hbWUoKSA9ICdkZXBlbmRlbmNpZXMnXSIvPgorCisgICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQCp8bm9kZSgpIj4KKyAgICAgICAgPHhzbDpjb3B5PgorICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAKnxub2RlKCkiLz4KKyAgICAgICAgPC94c2w6Y29weT4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL2dyb292eS9jb25maWcvbWF2ZW4vZ3Jvb3Z5LWFsbC54c2wgYi9ncm9vdnkvY29uZmlnL21hdmVuL2dyb292eS1hbGwueHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NWI4ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvY29uZmlnL21hdmVuL2dyb292eS1hbGwueHNsCkBAIC0wLDAgKzEsMjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCisgICAgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKKyAgICBleGNsdWRlLXJlc3VsdC1wcmVmaXhlcz0iI2RlZmF1bHQiIHZlcnNpb249IjEuMCI+CisKKyAgICA8IS0tIHJlbmFtZSBhcnRpZmFjdElkIC0tPgorICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8qW2xvY2FsLW5hbWUoKSA9ICdwcm9qZWN0J10vKltsb2NhbC1uYW1lKCkgPSAnYXJ0aWZhY3RJZCddIj4KKyAgICAgICAgPGFydGlmYWN0SWQ+Z3Jvb3Z5LWFsbDwvYXJ0aWZhY3RJZD4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDwhLS0gcmVtb3ZlIGVtYmVkZGVkIGFudGxyIGFuZCBhc20gZGVwZW5kZW5jaWVzICAtLT4KKyAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvKltsb2NhbC1uYW1lKCkgPSAncHJvamVjdCddLypbbG9jYWwtbmFtZSgpID0gJ2RlcGVuZGVuY2llcyddLypbbG9jYWwtbmFtZSgpID0gJ2RlcGVuZGVuY3knXVsqL3RleHQoKSA9ICdhbnRsciddIi8+CisgICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLypbbG9jYWwtbmFtZSgpID0gJ3Byb2plY3QnXS8qW2xvY2FsLW5hbWUoKSA9ICdkZXBlbmRlbmNpZXMnXS8qW2xvY2FsLW5hbWUoKSA9ICdkZXBlbmRlbmN5J11bKi90ZXh0KCkgPSAnYXNtJ10iLz4KKworICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9IkAqfG5vZGUoKSI+CisgICAgICAgIDx4c2w6Y29weT4KKyAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCp8bm9kZSgpIi8+CisgICAgICAgIDwveHNsOmNvcHk+CisgICAgPC94c2w6dGVtcGxhdGU+CisKKzwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS9ncm9vdnkvY29uZmlnL21hdmVuL2dyb292eS1leGFtcGxlcy5wb20gYi9ncm9vdnkvY29uZmlnL21hdmVuL2dyb292eS1leGFtcGxlcy5wb20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRhOTM4NwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9jb25maWcvbWF2ZW4vZ3Jvb3Z5LWV4YW1wbGVzLnBvbQpAQCAtMCwwICsxLDczIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQorICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KKyAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCisgICAgPGdyb3VwSWQ+Z3Jvb3Z5PC9ncm91cElkPg0KKyAgICA8YXJ0aWZhY3RJZD5ncm9vdnktZXhhbXBsZXM8L2FydGlmYWN0SWQ+DQorICAgIDx2ZXJzaW9uPmludGVybmFsPC92ZXJzaW9uPg0KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPg0KKyAgICA8IS0tIGludGVudGlvbmFsbHkgbGVhdmluZyBvZmYgc2NvcGUgaGVyZSBhcyBzY29wZSBpcyBwcm9iYWJseSBvdmVya2lsbCBmb3IgZXhhbXBsZXMgLS0+DQorICAgIDxkZXBlbmRlbmNpZXM+DQorICAgICAgICA8ZGVwZW5kZW5jeT4NCisgICAgICAgICAgICA8Z3JvdXBJZD5sdWNlbmU8L2dyb3VwSWQ+DQorICAgICAgICAgICAgPGFydGlmYWN0SWQ+bHVjZW5lPC9hcnRpZmFjdElkPg0KKyAgICAgICAgICAgIDx2ZXJzaW9uPjEuNC4zPC92ZXJzaW9uPg0KKyAgICAgICAgPC9kZXBlbmRlbmN5Pg0KKyAgICAgICAgPGRlcGVuZGVuY3k+DQorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1odHRwY2xpZW50PC9ncm91cElkPg0KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtaHR0cGNsaWVudDwvYXJ0aWZhY3RJZD4NCisgICAgICAgICAgICA8dmVyc2lvbj4zLjAuMTwvdmVyc2lvbj4NCisgICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+DQorICAgICAgICAgICAgPCEtLSBleGNsdWRlIG5vbi1jb21waWxlIHNjb3BlZCBkZXBlbmRlbmNpZXMgbWFudWFsbHkgZm9yIG5vdyAtLT4NCisgICAgICAgICAgICA8ZXhjbHVzaW9ucz4NCisgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4NCisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPg0KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+DQorICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPg0KKyAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPg0KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1sb2dnaW5nPC9ncm91cElkPg0KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1sb2dnaW5nPC9hcnRpZmFjdElkPg0KKyAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4NCisgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4NCisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtY29kZWM8L2dyb3VwSWQ+DQorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWNvZGVjPC9hcnRpZmFjdElkPg0KKyAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4NCisgICAgICAgICAgICA8L2V4Y2x1c2lvbnM+DQorICAgICAgICA8L2RlcGVuZGVuY3k+DQorICAgICAgICA8ZGVwZW5kZW5jeT4NCisgICAgICAgICAgICA8Z3JvdXBJZD5vcGVuZWpiPC9ncm91cElkPg0KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm9wZW5lamItbG9hZGVyPC9hcnRpZmFjdElkPg0KKyAgICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4NCisgICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+DQorICAgICAgICAgICAgPCEtLSBleGNsdWRlIHVubmVlZGVkIGxpYnJhcmllcyBhbmQgc3BlY3MgLS0+DQorICAgICAgICAgICAgPGV4Y2x1c2lvbnM+DQorICAgICAgICAgICAgICAgIDxleGNsdXNpb24+DQorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5sb2c0ajwvZ3JvdXBJZD4NCisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmxvZzRqPC9hcnRpZmFjdElkPg0KKyAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4NCisgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4NCisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9wZW5lamI8L2dyb3VwSWQ+DQorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcGVuZWpiLWNvcmU8L2FydGlmYWN0SWQ+DQorICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPg0KKyAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPg0KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4NCisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmdlcm9uaW1vLWp0YV8xLjAuMUJfc3BlYzwvYXJ0aWZhY3RJZD4NCisgICAgICAgICAgICAgICAgPC9leGNsdXNpb24+DQorICAgICAgICAgICAgICAgIDxleGNsdXNpb24+DQorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPg0KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tc2VydmxldF8yLjRfc3BlYzwvYXJ0aWZhY3RJZD4NCisgICAgICAgICAgICAgICAgPC9leGNsdXNpb24+DQorICAgICAgICAgICAgICAgIDxleGNsdXNpb24+DQorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPg0KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tZWpiXzIuMV9zcGVjPC9hcnRpZmFjdElkPg0KKyAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4NCisgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4NCisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+DQorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1qMmVlLWNvbm5lY3Rvcl8xLjVfc3BlYzwvYXJ0aWZhY3RJZD4NCisgICAgICAgICAgICAgICAgPC9leGNsdXNpb24+DQorICAgICAgICAgICAgPC9leGNsdXNpb25zPg0KKyAgICAgICAgPC9kZXBlbmRlbmN5Pg0KKw0KKyAgICA8L2RlcGVuZGVuY2llcz4NCis8L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L2NvbmZpZy9tYXZlbi9ncm9vdnktdG9vbHMucG9tIGIvZ3Jvb3Z5L2NvbmZpZy9tYXZlbi9ncm9vdnktdG9vbHMucG9tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjYmRjMjIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvY29uZmlnL21hdmVuL2dyb292eS10b29scy5wb20KQEAgLTAsMCArMSw0NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KKyAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCisgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQorICAgIDxncm91cElkPmdyb292eTwvZ3JvdXBJZD4NCisgICAgPGFydGlmYWN0SWQ+Z3Jvb3Z5LXRvb2xzPC9hcnRpZmFjdElkPg0KKyAgICA8dmVyc2lvbj5pbnRlcm5hbDwvdmVyc2lvbj4NCisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4NCisgICAgPCEtLSBpbnRlbnRpb25hbGx5IGxlYXZpbmcgb2ZmIHNjb3BlIGhlcmUgYXMgc2NvcGUgaXMgcHJvYmFibHkgb3ZlcmtpbGwgZm9yIHRvb2xzIC0tPg0KKyAgICA8ZGVwZW5kZW5jaWVzPg0KKyAgICAgICAgPGRlcGVuZGVuY3k+DQorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnRvbmljc3lzdGVtczwvZ3JvdXBJZD4NCisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXJqYXI8L2FydGlmYWN0SWQ+DQorICAgICAgICAgICAgPHZlcnNpb24+MC42PC92ZXJzaW9uPg0KKyAgICAgICAgPC9kZXBlbmRlbmN5Pg0KKyAgICAgICAgPGRlcGVuZGVuY3k+DQorICAgICAgICAgICAgPGdyb3VwSWQ+Y2hlY2tzdHlsZTwvZ3JvdXBJZD4NCisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jaGVja3N0eWxlPC9hcnRpZmFjdElkPg0KKyAgICAgICAgICAgIDx2ZXJzaW9uPjQuMzwvdmVyc2lvbj4NCisgICAgICAgICAgICA8ZXhjbHVzaW9ucz4NCisgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4NCisgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4NCisgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4NCisgICAgICAgICAgICAgICAgPC9leGNsdXNpb24+DQorICAgICAgICAgICAgPC9leGNsdXNpb25zPg0KKyAgICAgICAgPC9kZXBlbmRlbmN5Pg0KKyAgICAgICAgPGRlcGVuZGVuY3k+DQorICAgICAgICAgICAgPGdyb3VwSWQ+cmVkaGlsbDwvZ3JvdXBJZD4NCisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zaW1pYW48L2FydGlmYWN0SWQ+DQorICAgICAgICAgICAgPHZlcnNpb24+Mi4yLjQ8L3ZlcnNpb24+DQorICAgICAgICA8L2RlcGVuZGVuY3k+DQorICAgICAgICA8ZGVwZW5kZW5jeT4NCisgICAgICAgICAgICA8Z3JvdXBJZD5jb2JlcnR1cmE8L2dyb3VwSWQ+DQorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29iZXJ0dXJhPC9hcnRpZmFjdElkPg0KKyAgICAgICAgICAgIDx2ZXJzaW9uPjEuODwvdmVyc2lvbj4NCisgICAgICAgIDwvZGVwZW5kZW5jeT4NCisgICAgICAgIDwhLS0gdXNlZCBmb3IgdGhlIEphdmFEb2MgZ2VuZXJhdG9yIHNjcmlwdCAtLT4NCisgICAgICAgIDxkZXBlbmRlbmN5Pg0KKyAgICAgICAgICAgIDxncm91cElkPnFkb3g8L2dyb3VwSWQ+DQorICAgICAgICAgICAgPGFydGlmYWN0SWQ+cWRveDwvYXJ0aWZhY3RJZD4NCisgICAgICAgICAgICA8dmVyc2lvbj4xLjU8L3ZlcnNpb24+DQorICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KKyAgICAgICAgPC9kZXBlbmRlbmN5Pg0KKyAgICA8L2RlcGVuZGVuY2llcz4NCis8L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L2NydWlzZS9idWlsZC54bWwgYi9ncm9vdnkvY3J1aXNlL2J1aWxkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGUxZDJiCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L2NydWlzZS9idWlsZC54bWwKQEAgLTAsMCArMSw1NyBAQAorPHByb2plY3QgbmFtZT0iZ3Jvb3Z5LWNydWlzZWNvbnRyb2wtc3RhcnRlciIgZGVmYXVsdD0iY3J1aXNlIj4gCisgIAorICA8cHJvcGVydHkgbmFtZT0ic3ZuLnRhZyIgdmFsdWU9Imh0dHBzOi8vc3ZuLmNvZGVoYXVzLm9yZy9ncm9vdnkvdGFncy9jYyIvPgorICA8cHJvcGVydHkgbmFtZT0iZGlyLmNoZWNrb3V0IiB2YWx1ZT0iLi4iLz4KKyAgPHByb3BlcnR5IG5hbWU9InN2bi51c2VyIiB2YWx1ZT0iZGllcmsiLz4KKyAgCisgIDwhLS10YXJnZXQgbmFtZT0iY3J1aXNlIiBkZXBlbmRzPSJ1cGRhdGUsIGNvcHktcmVwb3J0aW5nLWFwcCwgZGVsZWdhdGUiLy0tPgorICA8dGFyZ2V0IG5hbWU9ImNydWlzZSIgZGVwZW5kcz0idXBkYXRlLCBjb3B5LXJlcG9ydGluZy1hcHAsIGRlbGVnYXRlLCB0YWdMYXN0QnVpbGQiLz4KKyAgCisgIDwhLS0gbGFiZWwgaXMgZ2l2ZW4gYnkgQ3J1aXNlQ29udHJvbCwgcHJvdmlkZXMgYSBkZWZhdWx0IHZhbHVlIGhlcmUgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZSBhZG1pbiBzdGFydHMKKyAgdGhpcyBzY3JpcHQgbWFudWFsbHkuIC0tPgorCisgIDxwcm9wZXJ0eSBuYW1lPSJsYWJlbCIgdmFsdWU9Im1hbnVhbEJ1aWxkIi8+CisgIAorICA8dGFyZ2V0IG5hbWU9InVwZGF0ZSI+CisgICAgPGVjaG8gbWVzc2FnZT0iKioqIGdldHRpbmcgdGhlIGRldGVjdGVkIG1vZGlmaWNhdGlvbnMgKioqIi8+CisgICAgPGV4ZWMgZXhlY3V0YWJsZT0ic3ZuIiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICA8YXJnIGxpbmU9Ii0tdXNlcm5hbWUgJHtzdm4udXNlcn0gLS1ub24taW50ZXJhY3RpdmUiLz4KKyAgICAgIDxhcmcgbGluZT0idXBkYXRlICR7ZGlyLmNoZWNrb3V0fSIvPgorICAgIDwvZXhlYz4KKyAgPC90YXJnZXQ+CisgIAorICA8dGFyZ2V0IG5hbWU9ImRlbGVnYXRlIiBkZXNjcmlwdGlvbj0iR3Jvb3Z5LXNwZWNpZmljIGJ1aWxkIHBhcnRzIj4KKyAgPCEtLSBkaXNhYmxlZCBkazogbm8gbWF2ZW4gZm9yIEdyb292eSBidWlsZAorICAgIDxlY2hvIG1lc3NhZ2U9IioqKiBTdGFydGluZyB0aGUgZ3Jvb3Z5LXNwZWNpZmljIE1hdmVuIDEgYnVpbGQgcGFydHMgKioqIi8+CisgICAgPGV4ZWMgZGlyPSIuLiIgZXhlY3V0YWJsZT0ibWF2ZW4iIGZhaWxvbmVycm9yPSJ0cnVlIi8+CisgICAgPGVjaG8gbWVzc2FnZT0iKioqIGdyb292eSBidWlsZCBNYXZlbiAxIHN1Y2Nlc3NmdWxseSBlbmRlZCAgICAgICAgICAqKioiLz4KKyAgICAtLT4KKyAgICA8YW50IGRpcj0iLi4iIGFudGZpbGU9ImJ1aWxkLnhtbCIgdGFyZ2V0PSJjbGVhbiIvPgorCTxhbnQgZGlyPSIuLiIgYW50ZmlsZT0iYnVpbGQueG1sIiB0YXJnZXQ9ImNydWlzZSI+CisJCTxwcm9wZXJ0eSBuYW1lPSJidWlsZG51bWJlciIgdmFsdWU9IiR7bGFiZWx9Ii8+CisJPC9hbnQ+CisgICAgPGVjaG8gbWVzc2FnZT0iKioqIGdyb292eSAoJHtsYWJlbH0pIEFudCBidWlsZCBzdWNjZXNzZnVsbHkgZW5kZWQgKioqIi8+CisgIDwvdGFyZ2V0PgorICAKKyAgPHRhcmdldCBuYW1lPSJ0YWdMYXN0QnVpbGQiPgorICAgIDxleGVjIGV4ZWN1dGFibGU9InN2biIgZmFpbG9uZXJyb3I9InRydWUiPgorICAgICAgPGFyZyBsaW5lPSItLXVzZXJuYW1lICR7c3ZuLnVzZXJ9IC0tbm9uLWludGVyYWN0aXZlIi8+CisgICAgICA8YXJnIGxpbmU9ImNvcHkgLW0gJycgJHtkaXIuY2hlY2tvdXR9ICR7c3ZuLnRhZ30vJHtsYWJlbH0iLz4KKyAgICA8L2V4ZWM+CisgICAgPGV4ZWMgZXhlY3V0YWJsZT0ic3ZuIiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICA8YXJnIGxpbmU9Ii0tdXNlcm5hbWUgJHtzdm4udXNlcn0gLS1ub24taW50ZXJhY3RpdmUiLz4KKyAgICAgIDxhcmcgbGluZT0icm0gLW0gJycgJHtzdm4udGFnfS9MQVNUX0JVSUxEIi8+CisgICAgPC9leGVjPgorICAgIDxleGVjIGV4ZWN1dGFibGU9InN2biIgZmFpbG9uZXJyb3I9InRydWUiPgorICAgICAgPGFyZyBsaW5lPSItLXVzZXJuYW1lICR7c3ZuLnVzZXJ9IC0tbm9uLWludGVyYWN0aXZlIi8+CisgICAgICA8YXJnIGxpbmU9ImNvcHkgLW0gJycgJHtzdm4udGFnfS8ke2xhYmVsfSAke3N2bi50YWd9L0xBU1RfQlVJTEQiLz4KKyAgICA8L2V4ZWM+CisgIDwvdGFyZ2V0PgorICAKKyAgPHRhcmdldCBuYW1lPSJjb3B5LXJlcG9ydGluZy1hcHAiPgorICAgIDxmYWlsIHVubGVzcz0icmVwb3J0aW5nLWFwcC1kaXIiIG1lc3NhZ2U9IlRoZSBwcm9wZXJ0eSByZXBvcnRpbmctYXBwLWRpciBtdXN0IGJlIHNldCBmcm9tIG91dHNpZGUhIiAvPgorICAgIDxjb3B5IHRvZGlyPSIke3JlcG9ydGluZy1hcHAtZGlyfSIgPiAgPCEtLSBvdmVyd3JpdGU9InRydWUiIGNhbiBiZSBuZWVkZWQgb2NjYXNpb25hbGx5IC0tPgorICAgICAgPGZpbGVzZXQgZGlyPSJyZXBvcnRpbmctYXBwIiAvPiAgIDwhLS0gb25seSBjaGFuZ2VzIHRvIHdlYi54bWwgbmVlZCBjb250ZXh0IHJlbG9hZCAtLT4KKyAgICA8L2NvcHk+CisgIDwvdGFyZ2V0PgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L2NydWlzZS9idWlsZHN0YXR1cy54c2wgYi9ncm9vdnkvY3J1aXNlL2J1aWxkc3RhdHVzLnhzbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDc0ODNjCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L2NydWlzZS9idWlsZHN0YXR1cy54c2wKQEAgLTAsMCArMSwxMDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InVzLWFzY2lpIiA/PgorPCEtLQorICBFeGNlcnB0ZWQgZnJvbSB0aGUgYm9vaywgIlByYWdtYXRpYyBQcm9qZWN0IEF1dG9tYXRpb24iCisgIElTQk4gMC05NzQ1MTQwLTMtOQorICBDb3B5cmlnaHQgMjAwNCBUaGUgUHJhZ21hdGljIFByb2dyYW1tZXJzLCBMTEMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICBWaXNpdCB3d3cuUHJhZ21hdGljUHJvZ3JhbW1lci5jb20KKyAtLT4KKworCis8eHNsOnN0eWxlc2hlZXQKKwl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKKwl2ZXJzaW9uPSIxLjAiPgorCisJPHhzbDpvdXRwdXQgbWV0aG9kPSJ4bWwiIGluZGVudD0ieWVzIi8+CisKKwk8eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KKworCQk8cnNzIHZlcnNpb249IjIuMCI+CisJCQk8Y2hhbm5lbD4KKworCQkJCTx0aXRsZT5ncm9vdnkgQnVpbGQgU3RhdHVzPC90aXRsZT4KKworCQkJCTxsaW5rPmh0dHA6Ly9idWlsZC5jYW5vb28uY29tL2dyb292eS88L2xpbms+CisKKwkJCQk8ZGVzY3JpcHRpb24+Q3J1aXNlQ29udHJvbCBidWlsZCBzdGF0dXMgZmVlZCBmb3IgdGhlIGdyb292eSBwcm9qZWN0LjwvZGVzY3JpcHRpb24+CisKKwkJCQk8aXRlbT4KKworCQkJCQk8eHNsOnZhcmlhYmxlIG5hbWU9InByb2plY3QubmFtZSIKKwkJCQkJCXNlbGVjdD0iY3J1aXNlY29udHJvbC9pbmZvL3Byb3BlcnR5W0BuYW1lPSdwcm9qZWN0bmFtZSddL0B2YWx1ZSIvPgorCQkJCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJ1aWxkLmRhdGUiCisJCQkJCQlzZWxlY3Q9ImNydWlzZWNvbnRyb2wvaW5mby9wcm9wZXJ0eVtAbmFtZT0nYnVpbGRkYXRlJ10vQHZhbHVlIi8+CisJCQkJCTx4c2w6dmFyaWFibGUgbmFtZT0iYnVpbGQudGltZSIKKwkJCQkJCXNlbGVjdD0iY3J1aXNlY29udHJvbC9idWlsZC9AdGltZSIvPgorCQkJCQk8eHNsOnZhcmlhYmxlIG5hbWU9Im1vZGlmaWNhdGlvbi5saXN0IgorCQkJCQkJc2VsZWN0PSJjcnVpc2Vjb250cm9sL21vZGlmaWNhdGlvbnMvbW9kaWZpY2F0aW9uIi8+CisKKwkJCQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ0ZXN0c3VpdGUubGlzdCIgc2VsZWN0PSIvL3Rlc3RzdWl0ZXMvdGVzdHN1aXRlIi8+CisJCQkJCTx4c2w6dmFyaWFibGUgbmFtZT0idGVzdGNhc2UubGlzdCIgc2VsZWN0PSIkdGVzdHN1aXRlLmxpc3QvdGVzdGNhc2UiLz4KKwkJCQkJPHRpdGxlPgorCQkJCQkJPHhzbDpjaG9vc2U+CisJCQkJCQkJPHhzbDp3aGVuIHRlc3Q9ImNydWlzZWNvbnRyb2wvYnVpbGQvQGVycm9yIj5CVUlMRCBGQUlMRUQ8L3hzbDp3aGVuPgorCQkJCQkJCTx4c2w6b3RoZXJ3aXNlPkJ1aWxkIFN1Y2NlZWRlZDwveHNsOm90aGVyd2lzZT4KKwkJCQkJCTwveHNsOmNob29zZT4KKwkJCQkJPC90aXRsZT4KKwkJCQkJPGxpbms+aHR0cDovL2J1aWxkLmNhbm9vLmNvbS9ncm9vdnkvPC9saW5rPgorCQkJCQk8ZGVzY3JpcHRpb24+CisJCQkJCQk8eHNsOmNob29zZT4KKwkJCQkJCQk8eHNsOndoZW4gdGVzdD0iY3J1aXNlY29udHJvbC9idWlsZC9AZXJyb3IiPgorCQkJCQkJCQk8eHNsOnRleHQ+Jmx0O2ImZ3Q7QW50IEVycm9yIE1lc3NhZ2U6Jmx0Oy9iJmd0OyZsdDtici8mZ3Q7PC94c2w6dGV4dD4KKwkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNydWlzZWNvbnRyb2wvYnVpbGQvQGVycm9yIi8+CisJCQkJCQkJPC94c2w6d2hlbj4KKwkJCQkJCQk8eHNsOm90aGVyd2lzZT4KKwkJCQkJCQkJPHhzbDp0ZXh0PiZsdDtiJmd0O0J1aWxkOiZsdDsvYiZndDs8L3hzbDp0ZXh0PgorCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY3J1aXNlY29udHJvbC9pbmZvL3Byb3BlcnR5W0BuYW1lPSdsYWJlbCddL0B2YWx1ZSIvPgorCQkJCQkJCTwveHNsOm90aGVyd2lzZT4KKwkJCQkJCTwveHNsOmNob29zZT4KKworCQkJCQkJJmx0O2JyLyZndDsKKwkJCQkJCSZsdDtici8mZ3Q7CisKKwkJCQkJCSZsdDtiJmd0O0RhdGUgb2YgYnVpbGQ6Jmx0Oy9iJmd0OworCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRidWlsZC5kYXRlIi8+Jmx0O2JyLyZndDsKKworCQkJCQkJJmx0O2ImZ3Q7VGltZSB0byBidWlsZDombHQ7L2ImZ3Q7CisJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJ1aWxkLnRpbWUiLz4mbHQ7YnIvJmd0OworCisJCQkJCQk8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IiRtb2RpZmljYXRpb24ubGlzdCI+CisJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iZGF0ZSIgb3JkZXI9ImRlc2NlbmRpbmciIGRhdGEtdHlwZT0idGV4dCIvPgorCQkJCQkJPC94c2w6YXBwbHktdGVtcGxhdGVzPgorCisJCQkJCQkmbHQ7YnIvJmd0OworCisJCQkJCQkmbHQ7YiZndDtVbml0IFRlc3RzOiZsdDsvYiZndDsKKwkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb3VudCgkdGVzdGNhc2UubGlzdCkiLz4KKworCQkJCQk8L2Rlc2NyaXB0aW9uPgorCQkJCTwvaXRlbT4KKwkJCTwvY2hhbm5lbD4KKwkJPC9yc3M+CisJPC94c2w6dGVtcGxhdGU+CisKKwk8eHNsOnRlbXBsYXRlIG1hdGNoPSJtb2RpZmljYXRpb24iPgorCQk8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkgPSAxIj4KKworCQkJJmx0O2JyLyZndDsKKworCQkJJmx0O2ImZ3Q7TGFzdCBjaGFuZ2VkOiZsdDsvYiZndDsKKwkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJkYXRlIi8+Jmx0O2JyLyZndDsKKworCQkJJmx0O2ImZ3Q7TGFzdCBjaGFuZ2VkIGJ5OiZsdDsvYiZndDsKKwkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ1c2VyIi8+Jmx0O2JyLyZndDsKKworCQkJJmx0O2ImZ3Q7TGFzdCBsb2cgZW50cnk6Jmx0Oy9iJmd0OworCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvbW1lbnQiLz4mbHQ7YnIvJmd0OworCisJCTwveHNsOmlmPgorCTwveHNsOnRlbXBsYXRlPgorCis8L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L2NydWlzZS9jYy54c2wgYi9ncm9vdnkvY3J1aXNlL2NjLnhzbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTlkNDAyCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L2NydWlzZS9jYy54c2wKQEAgLTAsMCArMSwzODAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCFET0NUWVBFIHhzbDpzdHlsZXNoZWV0IFsKKwk8IUVOVElUWSBzcGFjZSAiJiMzMjsiPgorCTwhRU5USVRZIG5ic3AgIiYjMTYwOyI+CisJPCFFTlRJVFkgYnVsbGV0ICImIzgyMjY7Ij5dPgorCis8eHNsOnN0eWxlc2hlZXQKKwl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIgorICAgeG1sbnM6eHNsdD0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHQiCisJPgorCTx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIvPgorCisJPCEtLSBjb2xsZWN0cyBhbGwgdGFzayBub2RlcyB3aXRoIHBhcmVudCB0YXJnZXQgaW50byB0aGUgdmFyaWFibGUgJHRhc2tsaXN0IC0tPgorCTx4c2w6dmFyaWFibGUgbmFtZT0idGFza2xpc3QiIHNlbGVjdD0iLy90YXNrIi8+CisKKwk8IS0tIGNvbGxlY3RzIGFsbCB0YXNrIG5vZGVzIGZyb20gJHRhc2tsaXN0IHdpdGggYXR0cmlidXRlIG5hbWU9IkphdmFjIiBldGMuIC0tPgorCTx4c2w6dmFyaWFibGUgbmFtZT0iamF2YWMudGFza2xpc3QiIHNlbGVjdD0iJHRhc2tsaXN0W0BuYW1lPSdqYXZhYyddIi8+CisJPHhzbDp2YXJpYWJsZSBuYW1lPSJlamJqYXIudGFza2xpc3QiIHNlbGVjdD0iJHRhc2tsaXN0W0BuYW1lPSdlamJqYXInXSIvPgorCTx4c2w6dmFyaWFibGUgbmFtZT0iamFyLnRhc2tsaXN0IiBzZWxlY3Q9IiR0YXNrbGlzdFtAbmFtZT0namFyJ10iLz4KKwk8eHNsOnZhcmlhYmxlIG5hbWU9Indhci50YXNrbGlzdCIgc2VsZWN0PSIkdGFza2xpc3RbQG5hbWU9J3dhciddIi8+CisKKwk8IS0tIGNvdW50IGVsZW1lbnRzIGluIHN1Ymxpc3RzIC0tPgorCTx4c2w6dmFyaWFibGUgbmFtZT0iZGlzdC5jb3VudCIgc2VsZWN0PSJjb3VudCgkamFyLnRhc2tsaXN0KSArIGNvdW50KCR3YXIudGFza2xpc3QpIi8+CisKKwk8IS0tIGNvbGxlY3QgYWxsIHRlc3RzdWl0ZSBub2RlcyBpbiBidWlsZCwgcmVnYXJkbGVzcyBvZiBkZXB0aCAtLT4KKwk8eHNsOnZhcmlhYmxlIG5hbWU9InRlc3RzdWl0ZS5saXN0IiBzZWxlY3Q9Ii8vdGVzdHN1aXRlcy90ZXN0c3VpdGUiLz4KKwk8IS0tIGNvdW50IGVycm9yIG5vZGVzIGRpcmVjdGx5IHVuZGVyIHRlc3RzdWl0ZSAtLT4KKwk8eHNsOnZhcmlhYmxlIG5hbWU9InRlc3RzdWl0ZS5lcnJvci5jb3VudCIgc2VsZWN0PSJjb3VudCgkdGVzdHN1aXRlLmxpc3QvZXJyb3IpIi8+CisKKwk8eHNsOnZhcmlhYmxlIG5hbWU9InRlc3RjYXNlLmxpc3QiIHNlbGVjdD0iJHRlc3RzdWl0ZS5saXN0L3Rlc3RjYXNlIi8+CisJPHhzbDp2YXJpYWJsZSBuYW1lPSJ0ZXN0Y2FzZS5lcnJvci5saXN0IiBzZWxlY3Q9IiR0ZXN0Y2FzZS5saXN0L2Vycm9yIi8+CisJPHhzbDp2YXJpYWJsZSBuYW1lPSJ0ZXN0Y2FzZS5mYWlsdXJlLmxpc3QiIHNlbGVjdD0iJHRlc3RjYXNlLmxpc3QvZmFpbHVyZSIvPgorCTx4c2w6dmFyaWFibGUgbmFtZT0idG90YWxFcnJvcnNBbmRGYWlsdXJlcyIgc2VsZWN0PSJjb3VudCgkdGVzdGNhc2UuZXJyb3IubGlzdCkgKyBjb3VudCgkdGVzdGNhc2UuZmFpbHVyZS5saXN0KSIvPgorCisJPCEtLSAxOiAvYnVpbGQvbW9kaWZpY2F0aW9ucywgMjogL2NydWlzZWNvbnRyb2wvbW9kaWZpY2F0aW9ucyAtLT4KKwk8eHNsOnZhcmlhYmxlIG5hbWU9Im1vZGlmaWNhdGlvbi5saXN0IiBzZWxlY3Q9Ii8vbW9kaWZpY2F0aW9ucy9tb2RpZmljYXRpb24iLz4KKwk8IS0tIGNvbGxlY3RzIGFsbCB0aGUgbW9kaWZpY2F0aW9uIHNldHMgLS0+CisJPHhzbDprZXkgbmFtZT0ibW9kaWZpY2F0aW9uU2V0IiBtYXRjaD0iLy9tb2RpZmljYXRpb25zL21vZGlmaWNhdGlvbiIgdXNlPSJjb25jYXQodXNlciwnOicsY29tbWVudCkiLz4KKworCTwhLS0gbG9uZyB0ZW1wbGF0ZSBmb3IgdGhlIHdob2xlIHBhZ2UsIHRoaXMgZW5zdXJlcyBzZXF1ZW5jZSAtLT4KKwk8eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KKwkJPCEtLSBIZWFkZXIgUGFydCAtLT4KKworCQk8eHNsOmNob29zZT4KKwkJCTx4c2w6d2hlbiB0ZXN0PSIvL2J1aWxkL0BlcnJvciI+IDwhLS0gYnVpbGQgdGFnIGNvbnRhaW5zIGF0dHJpYnV0ZSBlcnJvciAtLT4KKwkJCQk8aDE+QlVJTEQgRkFJTEVEPC9oMT4KKwkJCTwveHNsOndoZW4+CisJCQk8eHNsOm90aGVyd2lzZT4KKwkJCQk8aDE+CisJCQkJCTx4c2w6dGV4dD5CVUlMRCBDT01QTEVURSAtJnNwYWNlOzwveHNsOnRleHQ+CisJCQkJCTwhLS0gc3VwcG9ydCBDcnVpc2VDb250cm9sIDEuMCBhbmQgMi4wIC0tPgorCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iYnVpbGQvbGFiZWwgfCAvL2luZm8vcHJvcGVydHlbQG5hbWU9J2xhYmVsJ10vQHZhbHVlIi8+CisJCQkJPC9oMT4KKwkJCTwveHNsOm90aGVyd2lzZT4KKwkJPC94c2w6Y2hvb3NlPgorCisJCTx0YWJsZT4KKwkJCTx0cj4KKwkJCQk8dGg+RGF0ZSBvZiBidWlsZDwvdGg+CisJCQkJPHRkPgorCQkJCQk8IS0tIHN1cHBvcnQgQ3J1aXNlQ29udHJvbCAxLjAgYW5kIDIuMCAtLT4KKwkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImJ1aWxkL3RvZGF5IHwgLy9pbmZvL3Byb3BlcnR5W0BuYW1lPSdidWlsZGRhdGUnXS9AdmFsdWUiLz4KKwkJCQk8L3RkPgorCQkJPC90cj4KKwkJCTx0cj4KKwkJCQk8dGg+VGltZSB0byBidWlsZDwvdGg+CisJCQkJPHRkPgorCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLy9idWlsZC9AdGltZSIvPgorCQkJCTwvdGQ+CisJCQk8L3RyPgorCQkJPHRyPgorCQkJCTx0aD5MYXN0IGNoYW5nZWQ8L3RoPgorCQkJCTx0ZD4KKwkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii8vbW9kaWZpY2F0aW9ucy9tb2RpZmljYXRpb24vZGF0ZSIvPgorCQkJCTwvdGQ+CisJCQk8L3RyPgorCQkJPHRyPgorCQkJCTx0aD5MYXN0IGxvZyBlbnRyeTwvdGg+CisJCQkJPHRkPgorCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLy9tb2RpZmljYXRpb25zL21vZGlmaWNhdGlvbi9jb21tZW50Ii8+CisJCQkJPC90ZD4KKwkJCTwvdHI+CisJCTwvdGFibGU+CisKKwkJPHhzbDppZiB0ZXN0PSIvL2J1aWxkL0BlcnJvciI+CisJCQk8aDI+QW50IEVycm9yIE1lc3NhZ2U8L2gyPgorCQkJPHByZT4KKwkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLy9idWlsZC9AZXJyb3IiLz4KKwkJCTwvcHJlPgorCQkJPHByZT4KKwkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLy9zdGFja3RyYWNlIi8+CisJCQk8L3ByZT4KKwkJPC94c2w6aWY+CisKKwkJPCEtLSBDb21waWxhdGlvbiBNZXNzYWdlcyAtLT4KKworCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImphdmFjLndhcm4ubWVzc2FnZXMiIHNlbGVjdD0iJGphdmFjLnRhc2tsaXN0L21lc3NhZ2VbQHByaW9yaXR5PSd3YXJuJ10iLz4KKwkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlamJqYXIud2Fybi5tZXNzYWdlcyIgc2VsZWN0PSIkZWpiamFyLnRhc2tsaXN0L21lc3NhZ2VbQHByaW9yaXR5PSd3YXJuJ10iLz4KKwkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ0b3RhbC5lcnJvck1lc3NhZ2UuY291bnQiCisJCSAgICAgICAgICAgICAgc2VsZWN0PSJjb3VudCgkamF2YWMud2Fybi5tZXNzYWdlcykgKyBjb3VudCgkZWpiamFyLndhcm4ubWVzc2FnZXMpIi8+CisKKwkJPCEtLSBOT1RFOiB0b3RhbC5lcnJvck1lc3NhZ2UuY291bnQgaXMgYWN0dWFsbHkgdGhlIG51bWJlciBvZiBsaW5lcyBvZiBlcnJvcgorCQkJCQkJCQkJICBtZXNzYWdlcy4gVGhpcyBhY2N1cmF0ZWx5IHJlcHJlc2VudHMgdGhlIG51bWJlciBvZiBlcnJvcnMgT05MWSBpZiB0aGUgQW50IHByb3BlcnR5CisJCQkJCQkJCQkgIGJ1aWxkLmNvbXBpbGVyLmVtYWNzIGlzIHNldCB0byAidHJ1ZSIgLS0+CisJCTx4c2w6aWYgdGVzdD0iJHRvdGFsLmVycm9yTWVzc2FnZS5jb3VudCA+IDAiPgorCQkJPGgyPgorCQkJCTx4c2w6dGV4dD5FcnJvci0vV2FybmluZy0gTGluZXM6JnNwYWNlOzwveHNsOnRleHQ+CisJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0b3RhbC5lcnJvck1lc3NhZ2UuY291bnQiLz4KKwkJCTwvaDI+CisKKwkJCTxwcmU+CisJCQkJPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIkamF2YWMud2Fybi5tZXNzYWdlcyIvPgorCQkJPC9wcmU+CisJCTwveHNsOmlmPgorCisJCTwhLS0gVW5pdCBUZXN0cyAtLT4KKwkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ1bml0LnBhc3NlZCIgc2VsZWN0PSJjb3VudCgkdGVzdGNhc2UubGlzdCktJHRvdGFsRXJyb3JzQW5kRmFpbHVyZXMiLz4KKworCQk8aDI+VW5pdCBUZXN0czwvaDI+CisJCTxwPgorCQkJPHhzbDp0ZXh0PlRlc3QgY2FzZXM6JnNwYWNlOzwveHNsOnRleHQ+CisJCQk8Yj4KKwkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY291bnQoJHRlc3RjYXNlLmxpc3QpIi8+CisJCQk8L2I+CisJCQk8eHNsOnRleHQ+LCBwYXNzZWQ6JnNwYWNlOzwveHNsOnRleHQ+CisJCQk8Yj4KKwkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHVuaXQucGFzc2VkIi8+CisJCQk8L2I+CisJCQk8eHNsOnRleHQ+LCBmYWlsdXJlczomc3BhY2U7PC94c2w6dGV4dD4KKwkJCTxiPgorCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb3VudCgkdGVzdGNhc2UuZmFpbHVyZS5saXN0KSIvPgorCQkJPC9iPgorCQkJPHhzbDp0ZXh0PiwgZXJyb3JzOiZzcGFjZTs8L3hzbDp0ZXh0PgorCQkJPGI+CisJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvdW50KCR0ZXN0Y2FzZS5lcnJvci5saXN0KSIvPgorCQkJPC9iPgorCQkJPHhzbDp0ZXh0Pi48L3hzbDp0ZXh0PgorCQk8L3A+CisKKwkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNvbG9yQmFyIj4KKwkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzdWNjZXNzLmNvdW50IiBzZWxlY3Q9IiR1bml0LnBhc3NlZCIvPgorCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZhaWxlZC5jb3VudCIgc2VsZWN0PSIkdG90YWxFcnJvcnNBbmRGYWlsdXJlcyIvPgorCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InRvdGFsLmNvdW50IiBzZWxlY3Q9ImNvdW50KCR0ZXN0Y2FzZS5saXN0KSIvPgorCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InRhYmxlSUQiPnV0ZXN0czwveHNsOndpdGgtcGFyYW0+CisJCTwveHNsOmNhbGwtdGVtcGxhdGU+CisKKwkJPHhzbDppZiB0ZXN0PSJjb3VudCgkdGVzdGNhc2UuZXJyb3IubGlzdCkgPiAwIj4KKwkJCTxoMz5FcnJvcnM8L2gzPgorCQkJPHVsPgorCQkJCTx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iJHRlc3RjYXNlLmVycm9yLmxpc3QiLz4KKwkJCTwvdWw+CisJCTwveHNsOmlmPgorCisJCTx4c2w6aWYgdGVzdD0iY291bnQoJHRlc3RjYXNlLmZhaWx1cmUubGlzdCkgPiAwIj4KKwkJCTxoMz5GYWlsdXJlczwvaDM+CisJCQk8dWw+CisJCQkJPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIkdGVzdGNhc2UuZmFpbHVyZS5saXN0Ii8+CisJCQk8L3VsPgorCQk8L3hzbDppZj4KKworCQk8eHNsOmlmIHRlc3Q9IiR0b3RhbEVycm9yc0FuZEZhaWx1cmVzID4gMCI+CisJCQk8aDM+CisJCQkJPHhzbDp0ZXh0PlVuaXQgVGVzdCBFcnJvciBEZXRhaWxzOiZzcGFjZTsoPC94c2w6dGV4dD4KKwkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRvdGFsRXJyb3JzQW5kRmFpbHVyZXMiLz4KKwkJCQk8eHNsOnRleHQ+KTwveHNsOnRleHQ+CisJCQk8L2gzPgorCQkJPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIvL3Rlc3RzdWl0ZS90ZXN0Y2FzZVsuLy9lcnJvcl0iLz4KKwkJCTx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLy90ZXN0c3VpdGUvdGVzdGNhc2VbLi8vZmFpbHVyZV0iLz4KKwkJPC94c2w6aWY+CisKKwkJPCEtLSBGdW5jdGlvbmFsIFRlc3RzIC0tPgorCisJCTwhLS0gZnVuY3Rpb25hbCB0ZXN0aW5nIHZhcnMgLS0+CisJCTx4c2w6dmFyaWFibGUgbmFtZT0iY2FzZXMiIHNlbGVjdD0iLy9zdW1tYXJ5L3Rlc3RyZXN1bHQiLz4KKwkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzdGVwcyIgc2VsZWN0PSIvL3N1bW1hcnkvdGVzdHJlc3VsdC9yZXN1bHRzL3N0ZXAiLz4KKwkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwYXNzZWQiIHNlbGVjdD0iJGNhc2VzW0BzdWNjZXNzZnVsPSd5ZXMnXSIvPgorCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImZhaWxlZCIgc2VsZWN0PSIkY2FzZXNbQHN1Y2Nlc3NmdWw9J25vJ10iLz4KKworCQk8aDI+RnVuY3Rpb25hbCBUZXN0czwvaDI+CisJCTxwPgorCQkJPHhzbDp0ZXh0PlN6ZW5hcmlvczomc3BhY2U7PC94c2w6dGV4dD4KKwkJCTxiPgorCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb3VudCgkY2FzZXMpIi8+CisJCQk8L2I+CisJCQk8eHNsOnRleHQ+LCBwYXNzZWQ6JnNwYWNlOzwveHNsOnRleHQ+CisJCQk8Yj4KKwkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY291bnQoJHBhc3NlZCkiLz4KKwkJCTwvYj4KKwkJCTx4c2w6dGV4dD4sIGZhaWxlZDomc3BhY2U7PC94c2w6dGV4dD4KKwkJCTxiPgorCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb3VudCgkZmFpbGVkKSIvPgorCQkJPC9iPgorCQkJPHhzbDp0ZXh0PiwgaW5jbHVkaW5nJnNwYWNlOzwveHNsOnRleHQ+CisJCQk8Yj4KKwkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY291bnQoJHN0ZXBzKSIvPgorCQkJPC9iPgorCQkJPHhzbDp0ZXh0PiZzcGFjZTtzaW5nbGUgc3RlcHMuPC94c2w6dGV4dD4KKwkJPC9wPgorCisJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjb2xvckJhciI+CisJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic3VjY2Vzcy5jb3VudCIgc2VsZWN0PSJjb3VudCgkcGFzc2VkKSIvPgorCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZhaWxlZC5jb3VudCIgc2VsZWN0PSJjb3VudCgkZmFpbGVkKSIvPgorCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InRvdGFsLmNvdW50IiBzZWxlY3Q9ImNvdW50KCRjYXNlcykiLz4KKwkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ0YWJsZUlEIj5mdGVzdHM8L3hzbDp3aXRoLXBhcmFtPgorCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgorCisJCTxoMj5Nb2RpZmljYXRpb25zPC9oMj4KKwkJPHA+CisJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY291bnQoJG1vZGlmaWNhdGlvbi5saXN0KSIvPgorCQkJPHhzbDp0ZXh0PiZzcGFjZTttb2RpZmljYXRpb25zIHNpbmNlIGxhc3QgYnVpbGQuPC94c2w6dGV4dD4KKwkJPC9wPgorCisJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkbW9kaWZpY2F0aW9uLmxpc3RbY291bnQoLnxrZXkoJ21vZGlmaWNhdGlvblNldCcsY29uY2F0KHVzZXIsJzonLGNvbW1lbnQpKVsxXSk9MV0iPgorCQkJPGgzPgorCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ1c2VyIi8+CisJCQkJPHhzbDp0ZXh0Pjomc3BhY2U7PC94c2w6dGV4dD4KKwkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY29tbWVudCIvPgorCQkJCTx4c2w6dGV4dD4mc3BhY2U7KDwveHNsOnRleHQ+CisJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImRhdGUiLz4KKwkJCQk8eHNsOnRleHQ+KTwveHNsOnRleHQ+CisJCQk8L2gzPgorCQkJPHVsPgorCQkJCTx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0ia2V5KCdtb2RpZmljYXRpb25TZXQnLGNvbmNhdCh1c2VyLCc6Jyxjb21tZW50KSkiLz4KKwkJCTwvdWw+CisJCTwveHNsOmZvci1lYWNoPgorCisKKwkJPHhzbDppZiB0ZXN0PSIkZGlzdC5jb3VudCA+IDAiPgorCQkJPGgyPkRlcGxveW1lbnRzPC9oMj4KKwkJCTxwPgorCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZGlzdC5jb3VudCIvPgorCQkJCTx4c2w6dGV4dD4mc3BhY2U7ZmlsZXMgZGVwbG95ZWQgYnkgdGhpcyBidWlsZC48L3hzbDp0ZXh0PgorCQkJPC9wPgorCisJCQk8dWw+CisJCQkJPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIkamFyLnRhc2tsaXN0IHwgJHdhci50YXNrbGlzdCIvPgorCQkJPC91bD4KKwkJPC94c2w6aWY+CisKKwk8L3hzbDp0ZW1wbGF0ZT4KKworCTx4c2w6dGVtcGxhdGUgbmFtZT0iY29sb3JCYXIiPgorCQk8eHNsOnBhcmFtIG5hbWU9InN1Y2Nlc3MuY291bnQiLz4KKwkJPHhzbDpwYXJhbSBuYW1lPSJmYWlsZWQuY291bnQiLz4KKwkJPHhzbDpwYXJhbSBuYW1lPSJ0b3RhbC5jb3VudCIvPgorCQk8eHNsOnBhcmFtIG5hbWU9InRhYmxlSUQiLz4KKworCQk8dGFibGUgYmdjb2xvcj0id2hpdGUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CisJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJpZCI+CisJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0YWJsZUlEIi8+CisJCQk8L3hzbDphdHRyaWJ1dGU+CisJCQk8dHI+CisJCQkJPHhzbDppZiB0ZXN0PSIkc3VjY2Vzcy5jb3VudCA+IDAiPgorCQkJCQk8dGQgYmdjb2xvcj0iZ3JlZW4iPgorCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0id2lkdGgiPgorCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb25jYXQoJHN1Y2Nlc3MuY291bnQgKiAxMDAgZGl2ICR0b3RhbC5jb3VudCwgJyUnKSIvPgorCQkJCQkJPC94c2w6YXR0cmlidXRlPgorCQkJCQkJJm5ic3A7CisJCQkJCTwvdGQ+CisJCQkJPC94c2w6aWY+CisKKwkJCQk8eHNsOmlmIHRlc3Q9IiRmYWlsZWQuY291bnQgPiAwIj4KKwkJCQkJPHRkIGJnY29sb3I9IiNGRkZGQTAiPgorCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0id2lkdGgiPgorCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb25jYXQoJGZhaWxlZC5jb3VudCAqIDEwMCBkaXYgJHRvdGFsLmNvdW50LCAnJScpIi8+CisJCQkJCQk8L3hzbDphdHRyaWJ1dGU+CisJCQkJCQkmbmJzcDsKKwkJCQkJPC90ZD4KKwkJCQk8L3hzbDppZj4KKworCQkJCTx4c2w6aWYgdGVzdD0iKCR0b3RhbC5jb3VudCA9IDApIG9yICgkdG90YWwuY291bnQgPiAoJHN1Y2Nlc3MuY291bnQgKyAkZmFpbGVkLmNvdW50KSkiPgorCQkJCQk8dGQ+Jm5ic3A7PC90ZD4KKwkJCQk8L3hzbDppZj4KKwkJCTwvdHI+CisJCTwvdGFibGU+CisJPC94c2w6dGVtcGxhdGU+CisKKworCTwhLS0gVW5pdFRlc3QgRXJyb3JzL0ZhaWx1cmVzIC0tPgorCTx4c2w6dGVtcGxhdGUgbWF0Y2g9ImVycm9yfGZhaWx1cmUiPgorCQk8bGk+CisJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY29sb3JPZGRFdmVuUm93Ii8+CisJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLi4vQG5hbWUiLz4KKwkJPC9saT4KKwk8L3hzbDp0ZW1wbGF0ZT4KKworCTwhLS0gVW5pdFRlc3QgRXJyb3JzIEFuZCBGYWlsdXJlcyBEZXRhaWwgVGVtcGxhdGUgLS0+CisJPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy90ZXN0c3VpdGUvdGVzdGNhc2UiPgorCQk8aDQ+CisJCQk8eHNsOnRleHQ+VGVzdDomc3BhY2U7PC94c2w6dGV4dD4KKwkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgorCQk8L2g0PgorCisJCTxwPgorCQkJPHhzbDp0ZXh0PlR5cGU6PC94c2w6dGV4dD4KKwkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJub2RlKCkvQHR5cGUiLz4KKwkJPC9wPgorCQk8cD4KKwkJCTx4c2w6dGV4dD5NZXNzYWdlOjwveHNsOnRleHQ+CisJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0ibm9kZSgpL0BtZXNzYWdlIi8+CisJCTwvcD4KKworCQk8UFJFPgorCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5vZGUoKSIvPgorCQk8L1BSRT4KKwk8L3hzbDp0ZW1wbGF0ZT4KKworCTwhLS0gQ29tcGlsYXRpb24gRXJyb3IgRGV0YWlscyAtLT4KKwk8eHNsOnRlbXBsYXRlIG1hdGNoPSJtZXNzYWdlW0Bwcmlvcml0eT0nd2FybiddIj4KKwkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIvPgorCQk8YnIvPgorCTwveHNsOnRlbXBsYXRlPgorCTwhLS0gVGVzdCBFeGVjdXRpb24gU3RhY2t0cmFjZSAtLT4KKwk8eHNsOnRlbXBsYXRlIG1hdGNoPSJzdGFja3RyYWNlIj4KKwkJPHByZT4KKwkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiLz4KKwkJPC9wcmU+CisJPC94c2w6dGVtcGxhdGU+CisKKwk8IS0tIE1vZGlmaWNhdGlvbnMgdGVtcGxhdGUgLS0+CisJPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibW9kaWZpY2F0aW9uW2ZpbGUvZmlsZW5hbWVdIj4KKwkJPCEtLSBDQyAyLjAgLS0+CisJCTxsaT4KKwkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjb2xvck9kZEV2ZW5Sb3ciLz4KKwkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtb2RpZmljYXRpb25UeXBlIj4KKwkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0idHlwZSIgc2VsZWN0PSJmaWxlL0BhY3Rpb24iLz4KKwkJCTwveHNsOmNhbGwtdGVtcGxhdGU+CisKKwkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJmaWxlL3Byb2plY3QiLz4KKwkJCTx4c2w6aWYgdGVzdD0ic3RyaW5nLWxlbmd0aChub3JtYWxpemUtc3BhY2UoZmlsZS9wcm9qZWN0KSkiPgorCQkJCTx4c2w6dGV4dD4vPC94c2w6dGV4dD4KKwkJCTwveHNsOmlmPgorCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImZpbGUvZmlsZW5hbWUiLz4KKwkJPC9saT4KKwk8L3hzbDp0ZW1wbGF0ZT4KKworCTx4c2w6dGVtcGxhdGUgbWF0Y2g9Im1vZGlmaWNhdGlvbiI+CisJCTwhLS0gQ0MgMS4wIC0tPgorCQk8bGk+CisJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY29sb3JPZGRFdmVuUm93Ii8+CisJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibW9kaWZpY2F0aW9uVHlwZSI+CisJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InR5cGUiIHNlbGVjdD0iQHR5cGUiLz4KKwkJCTwveHNsOmNhbGwtdGVtcGxhdGU+CisKKwkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJmaWxlbmFtZSIvPgorCQk8L2xpPgorCTwveHNsOnRlbXBsYXRlPgorCisJPHhzbDp0ZW1wbGF0ZSBuYW1lPSJtb2RpZmljYXRpb25UeXBlIj4KKwkJPHhzbDpwYXJhbSBuYW1lPSJ0eXBlIi8+CisKKwkJPHNwYW4gY2xhc3M9Im1vZGlmaWZpY2F0aW9uVHlwZSI+CisJCQk8eHNsOmNob29zZT4KKwkJCQk8eHNsOndoZW4gdGVzdD0iJHR5cGU9J21vZGlmaWVkJyI+Jmd0OzwveHNsOndoZW4+CisJCQkJPHhzbDp3aGVuIHRlc3Q9IiR0eXBlPSdhZGRlZCciPis8L3hzbDp3aGVuPgorCQkJCTx4c2w6d2hlbiB0ZXN0PSIkdHlwZT0nZGVsZXRlZCciPi08L3hzbDp3aGVuPgorCQkJCTx4c2w6b3RoZXJ3aXNlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdHlwZSIvPjwveHNsOm90aGVyd2lzZT4KKwkJCTwveHNsOmNob29zZT4KKwkJPC9zcGFuPgorCisJCSZuYnNwOworCTwveHNsOnRlbXBsYXRlPgorCisJPCEtLSBqYXIgYW5kIHdhciB0ZW1wbGF0ZSAtLT4KKwk8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0YXNrW3RyYW5zbGF0ZShzdHJpbmcoQG5hbWUpLCdqSndXJywnJyk9J2FyJ10iPgorCQk8bGk+CisJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY29sb3JPZGRFdmVuUm93Ii8+CisJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0ibWVzc2FnZSIvPgorCQk8L2xpPgorCTwveHNsOnRlbXBsYXRlPgorCisJPHhzbDp0ZW1wbGF0ZSBuYW1lPSJjb2xvck9kZEV2ZW5Sb3ciPgorCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyI+CisJCQk8eHNsOmNob29zZT4KKwkJCQk8eHNsOndoZW4gdGVzdD0icG9zaXRpb24oKSBtb2QgMiA9IDAiPmV2ZW5yb3c8L3hzbDp3aGVuPgorCQkJCTx4c2w6b3RoZXJ3aXNlPm9kZHJvdzwveHNsOm90aGVyd2lzZT4KKwkJCTwveHNsOmNob29zZT4KKwkJPC94c2w6YXR0cmlidXRlPgorCTwveHNsOnRlbXBsYXRlPgorPC94c2w6c3R5bGVzaGVldD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvY3J1aXNlL2VtYWlsbWFwLnByb3BlcnRpZXMgYi9ncm9vdnkvY3J1aXNlL2VtYWlsbWFwLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MwNGFiNgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9jcnVpc2UvZW1haWxtYXAucHJvcGVydGllcwpAQCAtMCwwICsxLDEyIEBACisjCisjIE1hcHMgU1ZOIHVzZXIgaWQgdG8gZS1tYWlsIGFkcmVzcy4KKyMKKyMgdGhlc2UgdGVhbSBtZW1iZXJzIGdldCBub3RpZmllZCBvbiBidWlsZHMKKyMgb2Ygd2hhdCB0aGV5IGhhdmUgY29tbWl0ZWQgdG8gdGhlIFNWTgorCisKK2RpZXJrPWRpZXJrLmtvZW5pZ0BjYW5vby5jb20KK2dyYWVtZT1ncmFlbWVyb2NoZXJAeWFob28uY28udWsKK21ndWlsbGVtPW1ndWlsbGVtb3RAeWFob28uZnIKK3BhdWxrPXBhdWxrQGFzZXJ0LmNvbS5hdQoramJhdW1hbm49am9hY2hpbS5iYXVtYW5uQHhpbmFyaXMuZGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvY3J1aXNlL2h0bWxtYWlsLnhzbCBiL2dyb292eS9jcnVpc2UvaHRtbG1haWwueHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNGZiMjcKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvY3J1aXNlL2h0bWxtYWlsLnhzbApAQCAtMCwwICsxLDE2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1cy1hc2NpaSIgPz4KKzx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIj4KKwk8eHNsOmltcG9ydCBocmVmPSJjYy54c2wiLz4KKwk8eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiLz4KKworCTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPgorCQk8aHRtbD4KKwkJCTxoZWFkPgorCQkJCTx0aXRsZT5DcnVpc2VDb250cm9sIEJ1aWxkIFJlc3VsdDwvdGl0bGU+CisJCQk8L2hlYWQ+CisJCQk8Ym9keT4KKwkJCQk8eHNsOmFwcGx5LWltcG9ydHMvPgorCQkJPC9ib2R5PgorCQk8L2h0bWw+CisJPC94c2w6dGVtcGxhdGU+Cis8L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L2NydWlzZS9wcm9qZWN0LnhtbCBiL2dyb292eS9jcnVpc2UvcHJvamVjdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIxZTEwNQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9jcnVpc2UvcHJvamVjdC54bWwKQEAgLTAsMCArMSw2MSBAQAorPCEtLSAKK1RoaXMgZmlsZSBpcyByZWZlcmVuY2VkIGZyb20gY3J1aXNlY29udHJvbCdzIGNvbmZpZy54bWwgYW5kIGNvbnRhaW5zIHRoZSBwcm9qZWN0IGRlZmluaXRpb24uCisKK0F2YWlsYWJsZSBlbnRpdGllcyBhcmU6CitiYXNlZGlyCitob3N0bmFtZQorZGVmYXVsdG1haWxob3N0CistLT4KKworPHByb2plY3QgbmFtZT0iZ3Jvb3Z5IiBidWlsZGFmdGVyZmFpbGVkPSJmYWxzZSI+CisJCTxtb2RpZmljYXRpb25zZXQgcXVpZXRwZXJpb2Q9IjEyMCI+CisJCQk8c3ZuIGxvY2Fsd29ya2luZ2NvcHk9IiZiYXNlZGlyOy9ncm9vdnkvY3J1aXNlY29udHJvbC9jaGVja291dCIvPgorCQk8L21vZGlmaWNhdGlvbnNldD4KKwkJPHNjaGVkdWxlPgorCQkJPCEtLSBidWlsZGZpbGUgaXMgcmVsYXRpdmUgdG8gY2hlY2tvdXQgZGlyIC0tPgorCQkJPGFudCAgICBhbnRzY3JpcHQ9Ii91c3IvbG9jYWwvamF2YS9hcGFjaGUtYW50LTEuNy4wL2Jpbi9hbnQiCisJCQkJYnVpbGRmaWxlPSImYmFzZWRpcjsvZ3Jvb3Z5L2NydWlzZWNvbnRyb2wvY2hlY2tvdXQvY3J1aXNlL2J1aWxkLnhtbCIKKwkJCQlhbnRXb3JraW5nRGlyPSImYmFzZWRpcjsvZ3Jvb3Z5L2NydWlzZWNvbnRyb2wvY2hlY2tvdXQiCisJCQkJdXNlZGVidWc9ImZhbHNlIgorCQkJCXVzZWxvZ2dlcj0idHJ1ZSIKKwkJCQk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InJlcG9ydGluZy1hcHAtZGlyIiB2YWx1ZT0iJmJhc2VkaXI7L2dyb292eS8maG9zdG5hbWU7L2dyb292eS8iLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvYW50PgorCQk8L3NjaGVkdWxlPgorCQk8bGlzdGVuZXJzPgorCQkJPGN1cnJlbnRidWlsZHN0YXR1c2xpc3RlbmVyIGZpbGU9IiZiYXNlZGlyOy9ncm9vdnkvY3J1aXNlY29udHJvbC9sb2dzL3N0YXR1cy50eHQiLz4KKwkJPC9saXN0ZW5lcnM+CisJCTxsb2cgZGlyPSImYmFzZWRpcjsvZ3Jvb3Z5L2NydWlzZWNvbnRyb2wvbG9ncyI+CisJCQk8bWVyZ2UgZGlyPSImYmFzZWRpcjsvZ3Jvb3Z5L2NydWlzZWNvbnRyb2wvY2hlY2tvdXQvdGFyZ2V0L3Rlc3QtcmVwb3J0cy8iLz4KKwkJPC9sb2c+CisKKwkJPHB1Ymxpc2hlcnM+CisgICAgICAgICAgICA8YXJ0aWZhY3RzcHVibGlzaGVyIGRpcj0iJmJhc2VkaXI7L2dyb292eS9jcnVpc2Vjb250cm9sL2NoZWNrb3V0L3RhcmdldC9yZXBvcnRzIgorICAgICAgICAgICAgZGVzdD0iJmJhc2VkaXI7L2dyb292eS9jcnVpc2Vjb250cm9sL2FydGlmYWN0cyIgc3ViZGlyZWN0b3J5PSJyZXBvcnRzIi8+CisgICAgICAgICAgICA8YXJ0aWZhY3RzcHVibGlzaGVyIGRpcj0iJmJhc2VkaXI7L2dyb292eS9jcnVpc2Vjb250cm9sL2NoZWNrb3V0L3RhcmdldC9kaXN0IgorICAgICAgICAgICAgZGVzdD0iJmJhc2VkaXI7L2dyb292eS9jcnVpc2Vjb250cm9sL2FydGlmYWN0cyIgc3ViZGlyZWN0b3J5PSJkaXN0Ii8+CisgICAgICAgICAgICA8YXJ0aWZhY3RzcHVibGlzaGVyIGRpcj0iJmJhc2VkaXI7L2dyb292eS9jcnVpc2Vjb250cm9sL2NoZWNrb3V0L3RhcmdldC9yb290IgorICAgICAgICAgICAgZGVzdD0iJmJhc2VkaXI7L2dyb292eS9jcnVpc2Vjb250cm9sL2FydGlmYWN0cyIvPgorICAgICAgICAgICAgPCEtLSBodG1sZW1haWwgaXMgdXNlZCBvbmx5IGZvciBleHBsaWNpdCBzdWJzY3JpYmVycyAtLT4KKyAgICAgICAgICAgIDxodG1sZW1haWwKKwkJCQlidWlsZHJlc3VsdHN1cmw9Imh0dHA6Ly8maG9zdG5hbWU7L2dyb292eS8iCisJCQkJbWFpbGhvc3Q9IiZkZWZhdWx0bWFpbGhvc3Q7IgorCQkJCWRlZmF1bHRzdWZmaXg9IkBjb2RlaGF1cy5vcmciCisJCQkJcmV0dXJuYWRkcmVzcz0iYnVpbGQtc3VwcG9ydEBjYW5vby5jb20iCisJCQkJc3BhbXdoaWxlYnJva2VuPSJmYWxzZSIKKwkJCQlza2lwdXNlcnM9InRydWUiCisJCQkJbG9nZGlyPSImYmFzZWRpcjsvZ3Jvb3Z5L2NydWlzZWNvbnRyb2wvbG9ncyIKKwkJCQl4c2xmaWxlPSImYmFzZWRpcjsvZ3Jvb3Z5L2NydWlzZWNvbnRyb2wvY2hlY2tvdXQvY3J1aXNlL2h0bWxtYWlsLnhzbCIKKwkJCQk+CisJCQkJPGFsd2F5cyBhZGRyZXNzPSJzY21AZ3Jvb3Z5LmNvZGVoYXVzLm9yZyIvPgorCQkJCTxhbHdheXMgYWRkcmVzcz0iZGllcmsua29lbmlnQGNhbm9vLmNvbSIvPgorCQkJCTxhbHdheXMgYWRkcmVzcz0ibWd1aWxsZW1vdEB5YWhvby5mciIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YWx3YXlzIGFkZHJlc3M9ImJ1aWxkLXN1cHBvcnRAY2Fub28uY29tIi8+CisJCQk8L2h0bWxlbWFpbD4KKwkJCTxYU0xUTG9nUHVibGlzaGVyCisJCQkJZGlyZWN0b3J5PSImYmFzZWRpcjsvZ3Jvb3Z5LyZob3N0bmFtZTsvZ3Jvb3Z5LyIKKwkJCQlvdXRmaWxlbmFtZT0iYnVpbGRzdGF0dXMucnNzIgorCQkJCXhzbHRmaWxlPSImYmFzZWRpcjsvZ3Jvb3Z5L2NydWlzZWNvbnRyb2wvY2hlY2tvdXQvY3J1aXNlL2J1aWxkc3RhdHVzLnhzbCIKKwkJCQkvPgorCQk8L3B1Ymxpc2hlcnM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jbGFzc2VzL25ldC9zb3VyY2Vmb3JnZS9jcnVpc2Vjb250cm9sL0J1aWxkSW5mby5jbGFzcyBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9XRUItSU5GL2NsYXNzZXMvbmV0L3NvdXJjZWZvcmdlL2NydWlzZWNvbnRyb2wvQnVpbGRJbmZvLmNsYXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkYTMwOWEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jbGFzc2VzL25ldC9zb3VyY2Vmb3JnZS9jcnVpc2Vjb250cm9sL0J1aWxkSW5mby5jbGFzcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jbGFzc2VzL25ldC9zb3VyY2Vmb3JnZS9jcnVpc2Vjb250cm9sL0J1aWxkSW5mb1N1bW1hcnkuY2xhc3MgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jbGFzc2VzL25ldC9zb3VyY2Vmb3JnZS9jcnVpc2Vjb250cm9sL0J1aWxkSW5mb1N1bW1hcnkuY2xhc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY4ZDUzYgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9XRUItSU5GL2NsYXNzZXMvbmV0L3NvdXJjZWZvcmdlL2NydWlzZWNvbnRyb2wvQnVpbGRJbmZvU3VtbWFyeS5jbGFzcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jbGFzc2VzL25ldC9zb3VyY2Vmb3JnZS9jcnVpc2Vjb250cm9sL0NydWlzZUNvbnRyb2xXZWJBcHBFeGNlcHRpb24uY2xhc3MgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jbGFzc2VzL25ldC9zb3VyY2Vmb3JnZS9jcnVpc2Vjb250cm9sL0NydWlzZUNvbnRyb2xXZWJBcHBFeGNlcHRpb24uY2xhc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZmNTY1ZAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9XRUItSU5GL2NsYXNzZXMvbmV0L3NvdXJjZWZvcmdlL2NydWlzZWNvbnRyb2wvQ3J1aXNlQ29udHJvbFdlYkFwcEV4Y2VwdGlvbi5jbGFzcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jbGFzc2VzL25ldC9zb3VyY2Vmb3JnZS9jcnVpc2Vjb250cm9sL1N0YXR1c0hlbHBlci5jbGFzcyBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9XRUItSU5GL2NsYXNzZXMvbmV0L3NvdXJjZWZvcmdlL2NydWlzZWNvbnRyb2wvU3RhdHVzSGVscGVyLmNsYXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYzk2YzUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jbGFzc2VzL25ldC9zb3VyY2Vmb3JnZS9jcnVpc2Vjb250cm9sL1N0YXR1c0hlbHBlci5jbGFzcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jbGFzc2VzL25ldC9zb3VyY2Vmb3JnZS9jcnVpc2Vjb250cm9sL2NoYXJ0L0Fic3RyYWN0Q3J1aXNlQ29udHJvbENoYXJ0RGF0YS5jbGFzcyBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9XRUItSU5GL2NsYXNzZXMvbmV0L3NvdXJjZWZvcmdlL2NydWlzZWNvbnRyb2wvY2hhcnQvQWJzdHJhY3RDcnVpc2VDb250cm9sQ2hhcnREYXRhLmNsYXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNmEzYTAKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jbGFzc2VzL25ldC9zb3VyY2Vmb3JnZS9jcnVpc2Vjb250cm9sL2NoYXJ0L0Fic3RyYWN0Q3J1aXNlQ29udHJvbENoYXJ0RGF0YS5jbGFzcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jbGFzc2VzL25ldC9zb3VyY2Vmb3JnZS9jcnVpc2Vjb250cm9sL2NoYXJ0L1BpZUNoYXJ0RGF0YS5jbGFzcyBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9XRUItSU5GL2NsYXNzZXMvbmV0L3NvdXJjZWZvcmdlL2NydWlzZWNvbnRyb2wvY2hhcnQvUGllQ2hhcnREYXRhLmNsYXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMGJhMGUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jbGFzc2VzL25ldC9zb3VyY2Vmb3JnZS9jcnVpc2Vjb250cm9sL2NoYXJ0L1BpZUNoYXJ0RGF0YS5jbGFzcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jbGFzc2VzL25ldC9zb3VyY2Vmb3JnZS9jcnVpc2Vjb250cm9sL2NoYXJ0L1RpbWVDaGFydERhdGEuY2xhc3MgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jbGFzc2VzL25ldC9zb3VyY2Vmb3JnZS9jcnVpc2Vjb250cm9sL2NoYXJ0L1RpbWVDaGFydERhdGEuY2xhc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjczMjlhYgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9XRUItSU5GL2NsYXNzZXMvbmV0L3NvdXJjZWZvcmdlL2NydWlzZWNvbnRyb2wvY2hhcnQvVGltZUNoYXJ0RGF0YS5jbGFzcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jbGFzc2VzL25ldC9zb3VyY2Vmb3JnZS9jcnVpc2Vjb250cm9sL3NlcnZsZXQvRmlsZVNlcnZsZXQuY2xhc3MgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jbGFzc2VzL25ldC9zb3VyY2Vmb3JnZS9jcnVpc2Vjb250cm9sL3NlcnZsZXQvRmlsZVNlcnZsZXQuY2xhc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJhNDNkYQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9XRUItSU5GL2NsYXNzZXMvbmV0L3NvdXJjZWZvcmdlL2NydWlzZWNvbnRyb2wvc2VydmxldC9GaWxlU2VydmxldC5jbGFzcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jbGFzc2VzL25ldC9zb3VyY2Vmb3JnZS9jcnVpc2Vjb250cm9sL3NlcnZsZXQvV2ViRmlsZS5jbGFzcyBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9XRUItSU5GL2NsYXNzZXMvbmV0L3NvdXJjZWZvcmdlL2NydWlzZWNvbnRyb2wvc2VydmxldC9XZWJGaWxlLmNsYXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5YThjODYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jbGFzc2VzL25ldC9zb3VyY2Vmb3JnZS9jcnVpc2Vjb250cm9sL3NlcnZsZXQvV2ViRmlsZS5jbGFzcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jbGFzc2VzL25ldC9zb3VyY2Vmb3JnZS9jcnVpc2Vjb250cm9sL3RhZ2xpYi9BcnRpZmFjdHNMaW5rVGFnLmNsYXNzIGIvZ3Jvb3Z5L2NydWlzZS9yZXBvcnRpbmctYXBwL1dFQi1JTkYvY2xhc3Nlcy9uZXQvc291cmNlZm9yZ2UvY3J1aXNlY29udHJvbC90YWdsaWIvQXJ0aWZhY3RzTGlua1RhZy5jbGFzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzRkZjM1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L2NydWlzZS9yZXBvcnRpbmctYXBwL1dFQi1JTkYvY2xhc3Nlcy9uZXQvc291cmNlZm9yZ2UvY3J1aXNlY29udHJvbC90YWdsaWIvQXJ0aWZhY3RzTGlua1RhZy5jbGFzcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jbGFzc2VzL25ldC9zb3VyY2Vmb3JnZS9jcnVpc2Vjb250cm9sL3RhZ2xpYi9BcnRpZmFjdHNMaW5rVGFnRXh0cmFJbmZvLmNsYXNzIGIvZ3Jvb3Z5L2NydWlzZS9yZXBvcnRpbmctYXBwL1dFQi1JTkYvY2xhc3Nlcy9uZXQvc291cmNlZm9yZ2UvY3J1aXNlY29udHJvbC90YWdsaWIvQXJ0aWZhY3RzTGlua1RhZ0V4dHJhSW5mby5jbGFzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTRkZGE3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L2NydWlzZS9yZXBvcnRpbmctYXBwL1dFQi1JTkYvY2xhc3Nlcy9uZXQvc291cmNlZm9yZ2UvY3J1aXNlY29udHJvbC90YWdsaWIvQXJ0aWZhY3RzTGlua1RhZ0V4dHJhSW5mby5jbGFzcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jbGFzc2VzL25ldC9zb3VyY2Vmb3JnZS9jcnVpc2Vjb250cm9sL3RhZ2xpYi9CdWlsZEluZm9UYWcuY2xhc3MgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jbGFzc2VzL25ldC9zb3VyY2Vmb3JnZS9jcnVpc2Vjb250cm9sL3RhZ2xpYi9CdWlsZEluZm9UYWcuY2xhc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ0YjQwMgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9XRUItSU5GL2NsYXNzZXMvbmV0L3NvdXJjZWZvcmdlL2NydWlzZWNvbnRyb2wvdGFnbGliL0J1aWxkSW5mb1RhZy5jbGFzcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jbGFzc2VzL25ldC9zb3VyY2Vmb3JnZS9jcnVpc2Vjb250cm9sL3RhZ2xpYi9CdWlsZEluZm9UYWdFeHRyYUluZm8uY2xhc3MgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jbGFzc2VzL25ldC9zb3VyY2Vmb3JnZS9jcnVpc2Vjb250cm9sL3RhZ2xpYi9CdWlsZEluZm9UYWdFeHRyYUluZm8uY2xhc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY0OTVhZAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9XRUItSU5GL2NsYXNzZXMvbmV0L3NvdXJjZWZvcmdlL2NydWlzZWNvbnRyb2wvdGFnbGliL0J1aWxkSW5mb1RhZ0V4dHJhSW5mby5jbGFzcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jbGFzc2VzL25ldC9zb3VyY2Vmb3JnZS9jcnVpc2Vjb250cm9sL3RhZ2xpYi9DcnVpc2VDb250cm9sQm9keVRhZ1N1cHBvcnQuY2xhc3MgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jbGFzc2VzL25ldC9zb3VyY2Vmb3JnZS9jcnVpc2Vjb250cm9sL3RhZ2xpYi9DcnVpc2VDb250cm9sQm9keVRhZ1N1cHBvcnQuY2xhc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZiNzg2MQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9XRUItSU5GL2NsYXNzZXMvbmV0L3NvdXJjZWZvcmdlL2NydWlzZWNvbnRyb2wvdGFnbGliL0NydWlzZUNvbnRyb2xCb2R5VGFnU3VwcG9ydC5jbGFzcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jbGFzc2VzL25ldC9zb3VyY2Vmb3JnZS9jcnVpc2Vjb250cm9sL3RhZ2xpYi9DcnVpc2VDb250cm9sTG9nRmlsZUZpbHRlci5jbGFzcyBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9XRUItSU5GL2NsYXNzZXMvbmV0L3NvdXJjZWZvcmdlL2NydWlzZWNvbnRyb2wvdGFnbGliL0NydWlzZUNvbnRyb2xMb2dGaWxlRmlsdGVyLmNsYXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MjUzOTIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jbGFzc2VzL25ldC9zb3VyY2Vmb3JnZS9jcnVpc2Vjb250cm9sL3RhZ2xpYi9DcnVpc2VDb250cm9sTG9nRmlsZUZpbHRlci5jbGFzcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jbGFzc2VzL25ldC9zb3VyY2Vmb3JnZS9jcnVpc2Vjb250cm9sL3RhZ2xpYi9DcnVpc2VDb250cm9sVGFnU3VwcG9ydCQxLmNsYXNzIGIvZ3Jvb3Z5L2NydWlzZS9yZXBvcnRpbmctYXBwL1dFQi1JTkYvY2xhc3Nlcy9uZXQvc291cmNlZm9yZ2UvY3J1aXNlY29udHJvbC90YWdsaWIvQ3J1aXNlQ29udHJvbFRhZ1N1cHBvcnQkMS5jbGFzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzM4ZmY1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L2NydWlzZS9yZXBvcnRpbmctYXBwL1dFQi1JTkYvY2xhc3Nlcy9uZXQvc291cmNlZm9yZ2UvY3J1aXNlY29udHJvbC90YWdsaWIvQ3J1aXNlQ29udHJvbFRhZ1N1cHBvcnQkMS5jbGFzcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jbGFzc2VzL25ldC9zb3VyY2Vmb3JnZS9jcnVpc2Vjb250cm9sL3RhZ2xpYi9DcnVpc2VDb250cm9sVGFnU3VwcG9ydC5jbGFzcyBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9XRUItSU5GL2NsYXNzZXMvbmV0L3NvdXJjZWZvcmdlL2NydWlzZWNvbnRyb2wvdGFnbGliL0NydWlzZUNvbnRyb2xUYWdTdXBwb3J0LmNsYXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMzExMGYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jbGFzc2VzL25ldC9zb3VyY2Vmb3JnZS9jcnVpc2Vjb250cm9sL3RhZ2xpYi9DcnVpc2VDb250cm9sVGFnU3VwcG9ydC5jbGFzcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jbGFzc2VzL25ldC9zb3VyY2Vmb3JnZS9jcnVpc2Vjb250cm9sL3RhZ2xpYi9DdXJyZW50QnVpbGRTdGF0dXNUYWcuY2xhc3MgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jbGFzc2VzL25ldC9zb3VyY2Vmb3JnZS9jcnVpc2Vjb250cm9sL3RhZ2xpYi9DdXJyZW50QnVpbGRTdGF0dXNUYWcuY2xhc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZlYjgxNQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9XRUItSU5GL2NsYXNzZXMvbmV0L3NvdXJjZWZvcmdlL2NydWlzZWNvbnRyb2wvdGFnbGliL0N1cnJlbnRCdWlsZFN0YXR1c1RhZy5jbGFzcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jbGFzc2VzL25ldC9zb3VyY2Vmb3JnZS9jcnVpc2Vjb250cm9sL3RhZ2xpYi9MaW5rVGFnLmNsYXNzIGIvZ3Jvb3Z5L2NydWlzZS9yZXBvcnRpbmctYXBwL1dFQi1JTkYvY2xhc3Nlcy9uZXQvc291cmNlZm9yZ2UvY3J1aXNlY29udHJvbC90YWdsaWIvTGlua1RhZy5jbGFzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTc0YmU5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L2NydWlzZS9yZXBvcnRpbmctYXBwL1dFQi1JTkYvY2xhc3Nlcy9uZXQvc291cmNlZm9yZ2UvY3J1aXNlY29udHJvbC90YWdsaWIvTGlua1RhZy5jbGFzcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jbGFzc2VzL25ldC9zb3VyY2Vmb3JnZS9jcnVpc2Vjb250cm9sL3RhZ2xpYi9MaW5rVGFnRXh0cmFJbmZvLmNsYXNzIGIvZ3Jvb3Z5L2NydWlzZS9yZXBvcnRpbmctYXBwL1dFQi1JTkYvY2xhc3Nlcy9uZXQvc291cmNlZm9yZ2UvY3J1aXNlY29udHJvbC90YWdsaWIvTGlua1RhZ0V4dHJhSW5mby5jbGFzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDUxNTYyCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L2NydWlzZS9yZXBvcnRpbmctYXBwL1dFQi1JTkYvY2xhc3Nlcy9uZXQvc291cmNlZm9yZ2UvY3J1aXNlY29udHJvbC90YWdsaWIvTGlua1RhZ0V4dHJhSW5mby5jbGFzcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jbGFzc2VzL25ldC9zb3VyY2Vmb3JnZS9jcnVpc2Vjb250cm9sL3RhZ2xpYi9OYXZpZ2F0aW9uVGFnLmNsYXNzIGIvZ3Jvb3Z5L2NydWlzZS9yZXBvcnRpbmctYXBwL1dFQi1JTkYvY2xhc3Nlcy9uZXQvc291cmNlZm9yZ2UvY3J1aXNlY29udHJvbC90YWdsaWIvTmF2aWdhdGlvblRhZy5jbGFzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2RhYzg1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L2NydWlzZS9yZXBvcnRpbmctYXBwL1dFQi1JTkYvY2xhc3Nlcy9uZXQvc291cmNlZm9yZ2UvY3J1aXNlY29udHJvbC90YWdsaWIvTmF2aWdhdGlvblRhZy5jbGFzcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jbGFzc2VzL25ldC9zb3VyY2Vmb3JnZS9jcnVpc2Vjb250cm9sL3RhZ2xpYi9OYXZpZ2F0aW9uVGFnRXh0cmFJbmZvLmNsYXNzIGIvZ3Jvb3Z5L2NydWlzZS9yZXBvcnRpbmctYXBwL1dFQi1JTkYvY2xhc3Nlcy9uZXQvc291cmNlZm9yZ2UvY3J1aXNlY29udHJvbC90YWdsaWIvTmF2aWdhdGlvblRhZ0V4dHJhSW5mby5jbGFzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWE2MmVmCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L2NydWlzZS9yZXBvcnRpbmctYXBwL1dFQi1JTkYvY2xhc3Nlcy9uZXQvc291cmNlZm9yZ2UvY3J1aXNlY29udHJvbC90YWdsaWIvTmF2aWdhdGlvblRhZ0V4dHJhSW5mby5jbGFzcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jbGFzc2VzL25ldC9zb3VyY2Vmb3JnZS9jcnVpc2Vjb250cm9sL3RhZ2xpYi9SZXZlcnNlZENvbXBhcmF0b3IuY2xhc3MgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jbGFzc2VzL25ldC9zb3VyY2Vmb3JnZS9jcnVpc2Vjb250cm9sL3RhZ2xpYi9SZXZlcnNlZENvbXBhcmF0b3IuY2xhc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdiY2MyZAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9XRUItSU5GL2NsYXNzZXMvbmV0L3NvdXJjZWZvcmdlL2NydWlzZWNvbnRyb2wvdGFnbGliL1JldmVyc2VkQ29tcGFyYXRvci5jbGFzcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jbGFzc2VzL25ldC9zb3VyY2Vmb3JnZS9jcnVpc2Vjb250cm9sL3RhZ2xpYi9UYWIuY2xhc3MgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jbGFzc2VzL25ldC9zb3VyY2Vmb3JnZS9jcnVpc2Vjb250cm9sL3RhZ2xpYi9UYWIuY2xhc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ3MGExYQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9XRUItSU5GL2NsYXNzZXMvbmV0L3NvdXJjZWZvcmdlL2NydWlzZWNvbnRyb2wvdGFnbGliL1RhYi5jbGFzcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jbGFzc2VzL25ldC9zb3VyY2Vmb3JnZS9jcnVpc2Vjb250cm9sL3RhZ2xpYi9UYWJTaGVldFRhZy5jbGFzcyBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9XRUItSU5GL2NsYXNzZXMvbmV0L3NvdXJjZWZvcmdlL2NydWlzZWNvbnRyb2wvdGFnbGliL1RhYlNoZWV0VGFnLmNsYXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ZGQ1MWUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jbGFzc2VzL25ldC9zb3VyY2Vmb3JnZS9jcnVpc2Vjb250cm9sL3RhZ2xpYi9UYWJTaGVldFRhZy5jbGFzcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jbGFzc2VzL25ldC9zb3VyY2Vmb3JnZS9jcnVpc2Vjb250cm9sL3RhZ2xpYi9UYWJUYWcuY2xhc3MgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jbGFzc2VzL25ldC9zb3VyY2Vmb3JnZS9jcnVpc2Vjb250cm9sL3RhZ2xpYi9UYWJUYWcuY2xhc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RkOTA2ZgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9XRUItSU5GL2NsYXNzZXMvbmV0L3NvdXJjZWZvcmdlL2NydWlzZWNvbnRyb2wvdGFnbGliL1RhYlRhZy5jbGFzcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jbGFzc2VzL25ldC9zb3VyY2Vmb3JnZS9jcnVpc2Vjb250cm9sL3RhZ2xpYi9YU0xUYWckMS5jbGFzcyBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9XRUItSU5GL2NsYXNzZXMvbmV0L3NvdXJjZWZvcmdlL2NydWlzZWNvbnRyb2wvdGFnbGliL1hTTFRhZyQxLmNsYXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MTU2MmUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jbGFzc2VzL25ldC9zb3VyY2Vmb3JnZS9jcnVpc2Vjb250cm9sL3RhZ2xpYi9YU0xUYWckMS5jbGFzcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jbGFzc2VzL25ldC9zb3VyY2Vmb3JnZS9jcnVpc2Vjb250cm9sL3RhZ2xpYi9YU0xUYWcuY2xhc3MgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jbGFzc2VzL25ldC9zb3VyY2Vmb3JnZS9jcnVpc2Vjb250cm9sL3RhZ2xpYi9YU0xUYWcuY2xhc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc4ZDQyYQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9XRUItSU5GL2NsYXNzZXMvbmV0L3NvdXJjZWZvcmdlL2NydWlzZWNvbnRyb2wvdGFnbGliL1hTTFRhZy5jbGFzcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jbGFzc2VzL25ldC9zb3VyY2Vmb3JnZS9jcnVpc2Vjb250cm9sL3V0aWwvRGF0ZVV0aWwuY2xhc3MgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jbGFzc2VzL25ldC9zb3VyY2Vmb3JnZS9jcnVpc2Vjb250cm9sL3V0aWwvRGF0ZVV0aWwuY2xhc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ0YTRlMgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9XRUItSU5GL2NsYXNzZXMvbmV0L3NvdXJjZWZvcmdlL2NydWlzZWNvbnRyb2wvdXRpbC9EYXRlVXRpbC5jbGFzcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jbGFzc2VzL25ldC9zb3VyY2Vmb3JnZS9jcnVpc2Vjb250cm9sL3V0aWwvVGltZU51bWJlckZvcm1hdC5jbGFzcyBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9XRUItSU5GL2NsYXNzZXMvbmV0L3NvdXJjZWZvcmdlL2NydWlzZWNvbnRyb2wvdXRpbC9UaW1lTnVtYmVyRm9ybWF0LmNsYXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyZWEyNTcKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jbGFzc2VzL25ldC9zb3VyY2Vmb3JnZS9jcnVpc2Vjb250cm9sL3V0aWwvVGltZU51bWJlckZvcm1hdC5jbGFzcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jcnVpc2Vjb250cm9sLWpzcDExLnRsZCBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9XRUItSU5GL2NydWlzZWNvbnRyb2wtanNwMTEudGxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlYTJkMTEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9jcnVpc2Vjb250cm9sLWpzcDExLnRsZApAQCAtMCwwICsxLDE1MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSIgPz4NCis8IURPQ1RZUEUgdGFnbGliDQorICAgICAgICBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKU1AgVGFnIExpYnJhcnkgMS4xLy9FTiINCisJImh0dHA6Ly9qYXZhLnN1bi5jb20vajJlZS9kdGRzL3dlYi1qc3B0YWdsaWJyYXJ5XzFfMS5kdGQiPg0KKw0KKzwhLS0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENydWlzZUNvbnRyb2wsIGEgQ29udGludW91cyBJbnRlZ3JhdGlvbiBUb29sa2l0DQorICogQ29weXJpZ2h0IChjKSAyMDAxLCBUaG91Z2h0V29ya3MsIEluYy4NCisgKiA2NTEgVyBXYXNoaW5ndG9uIEF2ZS4gU3VpdGUgNjAwDQorICogQ2hpY2FnbywgSUwgNjA2NjEgVVNBDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisgKg0KKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucw0KKyAqIGFyZSBtZXQ6DQorICoNCisgKiAgICAgKyBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisgKg0KKyAqICAgICArIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZw0KKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZA0KKyAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4NCisgKg0KKyAqICAgICArIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhvdWdodFdvcmtzLCBJbmMuLCBDcnVpc2VDb250cm9sLCBub3IgdGhlDQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUNCisgKiAgICAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yDQorICogICAgICAgd3JpdHRlbiBwZXJtaXNzaW9uLg0KKyAqDQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SDQorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsDQorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLA0KKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUg0KKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YNCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORw0KKyAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUw0KKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi0tPg0KKzx0YWdsaWI+DQorICAgIDx0bGlidmVyc2lvbj4xLjA8L3RsaWJ2ZXJzaW9uPg0KKyAgICA8anNwdmVyc2lvbj4xLjE8L2pzcHZlcnNpb24+DQorICAgIDxzaG9ydG5hbWU+c2ltcGxlPC9zaG9ydG5hbWU+DQorICAgIDx1cmk+PC91cmk+DQorICAgIDxpbmZvPg0KKyAgICAgICAgQSBzaW1wbGUgdGFiIGxpYnJhcnkgZm9yIHRoZSBleGFtcGxlcw0KKyAgICA8L2luZm8+DQorICAgIDx0YWc+DQorICAgICAgICA8bmFtZT54c2w8L25hbWU+DQorICAgICAgICA8dGFnY2xhc3M+bmV0LnNvdXJjZWZvcmdlLmNydWlzZWNvbnRyb2wudGFnbGliLlhTTFRhZzwvdGFnY2xhc3M+DQorICAgICAgICA8Ym9keWNvbnRlbnQ+SlNQPC9ib2R5Y29udGVudD4NCisgICAgICAgIDxpbmZvPg0KKyAgICAgICAgICAgIFRyYW5zZm9ybXMgdGhlIHhtbCBidWlsZCBsb2cgdXNpbmcgWFNMLg0KKyAgICAgICAgPC9pbmZvPg0KKyAgICAgICAgPGF0dHJpYnV0ZT4NCisgICAgICAgICAgICA8bmFtZT54c2xGaWxlPC9uYW1lPg0KKyAgICAgICAgICAgIDxyZXF1aXJlZD50cnVlPC9yZXF1aXJlZD4NCisgICAgICAgIDwvYXR0cmlidXRlPg0KKyAgICAgICAgPGF0dHJpYnV0ZT4NCisgICAgICAgICAgICA8bmFtZT54c2xSb290Q29udGV4dDwvbmFtZT4NCisgICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPg0KKyAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgIDwvdGFnPg0KKyAgICA8dGFnPg0KKyAgICAgICAgPG5hbWU+Y3VycmVudGJ1aWxkc3RhdHVzPC9uYW1lPg0KKyAgICAgICAgPHRhZ2NsYXNzPm5ldC5zb3VyY2Vmb3JnZS5jcnVpc2Vjb250cm9sLnRhZ2xpYi5DdXJyZW50QnVpbGRTdGF0dXNUYWc8L3RhZ2NsYXNzPg0KKyAgICAgICAgPGJvZHljb250ZW50PmVtcHR5PC9ib2R5Y29udGVudD4NCisgICAgICAgIDxpbmZvPg0KKyAgICAgICAgICAgIFJlcG9ydCB3aGVuIHRoZSBidWlsZCBzdGFydGVkLCBvciB3aGVuIGl0IHdpbGwgc3RhcnQgYWdhaW4uDQorICAgICAgICA8L2luZm8+DQorICAgIDwvdGFnPg0KKyAgICA8dGFnPg0KKyAgICAgICAgPG5hbWU+bmF2PC9uYW1lPg0KKyAgICAgICAgPHRhZ2NsYXNzPm5ldC5zb3VyY2Vmb3JnZS5jcnVpc2Vjb250cm9sLnRhZ2xpYi5OYXZpZ2F0aW9uVGFnPC90YWdjbGFzcz4NCisgICAgICAgIDx0ZWljbGFzcz5uZXQuc291cmNlZm9yZ2UuY3J1aXNlY29udHJvbC50YWdsaWIuTmF2aWdhdGlvblRhZ0V4dHJhSW5mbzwvdGVpY2xhc3M+DQorICAgICAgICA8Ym9keWNvbnRlbnQ+SlNQPC9ib2R5Y29udGVudD4NCisgICAgICAgIDxpbmZvPg0KKyAgICAgICAgICAgIEJ1aWxkcyB0aGUgbmF2aWdhdGlvbg0KKyAgICAgICAgPC9pbmZvPg0KKyAgICAgICAgPGF0dHJpYnV0ZT4NCisgICAgICAgICAgICA8bmFtZT5kYXRlRm9ybWF0PC9uYW1lPg0KKyAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQorICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgICAgIDxhdHRyaWJ1dGU+DQorICAgICAgICAgICAgPG5hbWU+c3RhcnRpbmdCdWlsZE51bWJlcjwvbmFtZT4NCisgICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPg0KKyAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgICA8YXR0cmlidXRlPg0KKyAgICAgICAgICAgIDxuYW1lPmZpbmFsQnVpbGROdW1iZXI8L25hbWU+DQorICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4NCisgICAgICAgIDwvYXR0cmlidXRlPg0KKyAgICA8L3RhZz4NCisgICAgPHRhZz4NCisgICAgICAgIDxuYW1lPmFydGlmYWN0c0xpbms8L25hbWU+DQorICAgICAgICA8dGFnY2xhc3M+bmV0LnNvdXJjZWZvcmdlLmNydWlzZWNvbnRyb2wudGFnbGliLkFydGlmYWN0c0xpbmtUYWc8L3RhZ2NsYXNzPg0KKyAgICAgICAgPHRlaWNsYXNzPm5ldC5zb3VyY2Vmb3JnZS5jcnVpc2Vjb250cm9sLnRhZ2xpYi5BcnRpZmFjdHNMaW5rVGFnRXh0cmFJbmZvPC90ZWljbGFzcz4NCisgICAgICAgIDxib2R5Y29udGVudD5KU1A8L2JvZHljb250ZW50Pg0KKyAgICAgICAgPGluZm8+DQorICAgICAgICAgICAgSW5zZXJ0cyBsaW5rIHRvIHRoZSBhcnRpZmFjdHMgRmlsZVNlcnZsZXQNCisgICAgICAgIDwvaW5mbz4NCisgICAgPC90YWc+DQorICAgIDx0YWc+DQorICAgICAgICA8bmFtZT5idWlsZEluZm88L25hbWU+DQorICAgICAgICA8dGFnY2xhc3M+bmV0LnNvdXJjZWZvcmdlLmNydWlzZWNvbnRyb2wudGFnbGliLkJ1aWxkSW5mb1RhZzwvdGFnY2xhc3M+DQorICAgICAgICA8dGVpY2xhc3M+bmV0LnNvdXJjZWZvcmdlLmNydWlzZWNvbnRyb2wudGFnbGliLkJ1aWxkSW5mb1RhZ0V4dHJhSW5mbzwvdGVpY2xhc3M+DQorICAgICAgICA8Ym9keWNvbnRlbnQ+ZW1wdHk8L2JvZHljb250ZW50Pg0KKyAgICAgICAgPGluZm8+DQorICAgICAgICAgICAgSW5zZXJ0cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmFyaW91cyBidWlsZHMgaW50byB0aGUgcGFnZSBzY29wZS4NCisgICAgICAgIDwvaW5mbz4NCisgICAgPC90YWc+DQorICAgIDx0YWc+DQorICAgICAgICA8bmFtZT50YWJzaGVldDwvbmFtZT4NCisgICAgICAgIDx0YWdjbGFzcz5uZXQuc291cmNlZm9yZ2UuY3J1aXNlY29udHJvbC50YWdsaWIuVGFiU2hlZXRUYWc8L3RhZ2NsYXNzPg0KKyAgICAgICAgPGJvZHljb250ZW50PkpTUDwvYm9keWNvbnRlbnQ+DQorICAgICAgICA8aW5mbz4NCisgICAgICAgICAgICBDcmVhdGVzIGEgdGFiIHNoZWV0IHRoYXQgdGFicyBjYW4gYmUgcGxhY2VkIGludG8uDQorICAgICAgICA8L2luZm8+DQorICAgIDwvdGFnPg0KKyAgICA8dGFnPg0KKyAgICAgICAgPG5hbWU+dGFiPC9uYW1lPg0KKyAgICAgICAgPHRhZ2NsYXNzPm5ldC5zb3VyY2Vmb3JnZS5jcnVpc2Vjb250cm9sLnRhZ2xpYi5UYWJUYWc8L3RhZ2NsYXNzPg0KKyAgICAgICAgPGJvZHljb250ZW50PkpTUDwvYm9keWNvbnRlbnQ+DQorICAgICAgICA8aW5mbz5DcmVhdGVzIGEgdGFiIHRoYXQgc2VsZWN0ZWQgY29udGVudCBnZXRzIHB1dCBpbnRvLjwvaW5mbz4NCisgICAgICAgIDxhdHRyaWJ1dGU+DQorICAgICAgICAgICAgPG5hbWU+bmFtZTwvbmFtZT4NCisgICAgICAgICAgICA8cmVxdWlyZWQ+dHJ1ZTwvcmVxdWlyZWQ+DQorICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgICAgIDxhdHRyaWJ1dGU+DQorICAgICAgICAgICAgPG5hbWU+bGFiZWw8L25hbWU+DQorICAgICAgICAgICAgPHJlcXVpcmVkPnRydWU8L3JlcXVpcmVkPg0KKyAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgIDwvdGFnPg0KKyAgICA8dGFnPg0KKyAgICAgICAgPG5hbWU+bGluazwvbmFtZT4NCisgICAgICAgIDx0YWdjbGFzcz5uZXQuc291cmNlZm9yZ2UuY3J1aXNlY29udHJvbC50YWdsaWIuTGlua1RhZzwvdGFnY2xhc3M+DQorICAgICAgICA8dGVpY2xhc3M+bmV0LnNvdXJjZWZvcmdlLmNydWlzZWNvbnRyb2wudGFnbGliLkxpbmtUYWdFeHRyYUluZm88L3RlaWNsYXNzPg0KKyAgICAgICAgPGJvZHljb250ZW50PmVtcHR5PC9ib2R5Y29udGVudD4NCisgICAgICAgIDxpbmZvPkJ1aWxkcyB1cCBhIGxpbmsgVVJMPC9pbmZvPg0KKyAgICAgICAgPGF0dHJpYnV0ZT4NCisgICAgICAgICAgICA8bmFtZT5pZDwvbmFtZT4NCisgICAgICAgICAgICA8cmVxdWlyZWQ+dHJ1ZTwvcmVxdWlyZWQ+DQorICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgICAgIDxhdHRyaWJ1dGU+DQorICAgICAgICAgICAgPG5hbWU+ZXhjbHVkZTwvbmFtZT4NCisgICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPg0KKyAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgIDwvdGFnPg0KKzwvdGFnbGliPg0KZGlmZiAtLWdpdCBhL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9XRUItSU5GL2NydWlzZWNvbnRyb2wtanNwMTIudGxkIGIvZ3Jvb3Z5L2NydWlzZS9yZXBvcnRpbmctYXBwL1dFQi1JTkYvY3J1aXNlY29udHJvbC1qc3AxMi50bGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NhMjBkNgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9XRUItSU5GL2NydWlzZWNvbnRyb2wtanNwMTIudGxkCkBAIC0wLDAgKzEsMTQ1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/Pg0KKzwhRE9DVFlQRSB0YWdsaWINCisgIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEpTUCBUYWcgTGlicmFyeSAxLjIvL0VOIg0KKyAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1qc3B0YWdsaWJyYXJ5XzFfMi5kdGQiPg0KKw0KKzwhLS0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENydWlzZUNvbnRyb2wsIGEgQ29udGludW91cyBJbnRlZ3JhdGlvbiBUb29sa2l0DQorICogQ29weXJpZ2h0IChjKSAyMDAxLCBUaG91Z2h0V29ya3MsIEluYy4NCisgKiA2NTEgVyBXYXNoaW5ndG9uIEF2ZS4gU3VpdGUgNjAwDQorICogQ2hpY2FnbywgSUwgNjA2NjEgVVNBDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisgKg0KKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucw0KKyAqIGFyZSBtZXQ6DQorICoNCisgKiAgICAgKyBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisgKg0KKyAqICAgICArIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUNCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZw0KKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZA0KKyAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4NCisgKg0KKyAqICAgICArIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhvdWdodFdvcmtzLCBJbmMuLCBDcnVpc2VDb250cm9sLCBub3IgdGhlDQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUNCisgKiAgICAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yDQorICogICAgICAgd3JpdHRlbiBwZXJtaXNzaW9uLg0KKyAqDQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UDQorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SDQorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsDQorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLA0KKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUg0KKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YNCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORw0KKyAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUw0KKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi0tPg0KKzx0YWdsaWI+DQorICAgIDx0bGliLXZlcnNpb24+MS4wPC90bGliLXZlcnNpb24+DQorICAgIDxqc3AtdmVyc2lvbj4xLjI8L2pzcC12ZXJzaW9uPg0KKyAgICA8c2hvcnQtbmFtZT5jcnVpc2Vjb250cm9sPC9zaG9ydC1uYW1lPg0KKyAgICA8dXJpPmh0dHA6Ly9jcnVpc2Vjb250cm9sLnNvdXJjZWZvcmdlLm5ldC90YWdsaWJzL2NydWlzZWNvbnRyb2wtMS4wPC91cmk+DQorICAgIDx0YWc+DQorICAgICAgICA8bmFtZT54c2w8L25hbWU+DQorICAgICAgICA8dGFnLWNsYXNzPm5ldC5zb3VyY2Vmb3JnZS5jcnVpc2Vjb250cm9sLnRhZ2xpYi5YU0xUYWc8L3RhZy1jbGFzcz4NCisgICAgICAgIDxib2R5LWNvbnRlbnQ+SlNQPC9ib2R5LWNvbnRlbnQ+DQorICAgICAgICA8ZGVzY3JpcHRpb24+DQorICAgICAgICAgICAgVHJhbnNmb3JtcyB0aGUgeG1sIGJ1aWxkIGxvZyB1c2luZyBYU0wuDQorICAgICAgICA8L2Rlc2NyaXB0aW9uPg0KKyAgICAgICAgPGF0dHJpYnV0ZT4NCisgICAgICAgICAgICA8bmFtZT54c2xGaWxlPC9uYW1lPg0KKyAgICAgICAgICAgIDxyZXF1aXJlZD50cnVlPC9yZXF1aXJlZD4NCisgICAgICAgIDwvYXR0cmlidXRlPg0KKyAgICAgICAgPGF0dHJpYnV0ZT4NCisgICAgICAgICAgICA8bmFtZT54c2xSb290Q29udGV4dDwvbmFtZT4NCisgICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPg0KKyAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgIDwvdGFnPg0KKyAgICA8dGFnPg0KKyAgICAgICAgPG5hbWU+Y3VycmVudGJ1aWxkc3RhdHVzPC9uYW1lPg0KKyAgICAgICAgPHRhZy1jbGFzcz5uZXQuc291cmNlZm9yZ2UuY3J1aXNlY29udHJvbC50YWdsaWIuQ3VycmVudEJ1aWxkU3RhdHVzVGFnPC90YWctY2xhc3M+DQorICAgICAgICA8Ym9keS1jb250ZW50PmVtcHR5PC9ib2R5LWNvbnRlbnQ+DQorICAgICAgICA8ZGVzY3JpcHRpb24+DQorICAgICAgICAgICAgUmVwb3J0IHdoZW4gdGhlIGJ1aWxkIHN0YXJ0ZWQsIG9yIHdoZW4gaXQgd2lsbCBzdGFydCBhZ2Fpbi4NCisgICAgICAgIDwvZGVzY3JpcHRpb24+DQorICAgIDwvdGFnPg0KKyAgICA8dGFnPg0KKyAgICAgICAgPG5hbWU+bmF2PC9uYW1lPg0KKyAgICAgICAgPHRhZy1jbGFzcz5uZXQuc291cmNlZm9yZ2UuY3J1aXNlY29udHJvbC50YWdsaWIuTmF2aWdhdGlvblRhZzwvdGFnLWNsYXNzPg0KKyAgICAgICAgPHRlaS1jbGFzcz5uZXQuc291cmNlZm9yZ2UuY3J1aXNlY29udHJvbC50YWdsaWIuTmF2aWdhdGlvblRhZ0V4dHJhSW5mbzwvdGVpLWNsYXNzPg0KKyAgICAgICAgPGJvZHktY29udGVudD5KU1A8L2JvZHktY29udGVudD4NCisgICAgICAgIDxkZXNjcmlwdGlvbj4NCisgICAgICAgICAgICBCdWlsZHMgdGhlIG5hdmlnYXRpb24NCisgICAgICAgIDwvZGVzY3JpcHRpb24+DQorICAgICAgICA8YXR0cmlidXRlPg0KKyAgICAgICAgICAgIDxuYW1lPmRhdGVGb3JtYXQ8L25hbWU+DQorICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4NCisgICAgICAgIDwvYXR0cmlidXRlPg0KKyAgICAgICAgPGF0dHJpYnV0ZT4NCisgICAgICAgICAgICA8bmFtZT5zdGFydGluZ0J1aWxkTnVtYmVyPC9uYW1lPg0KKyAgICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+DQorICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgICAgIDxhdHRyaWJ1dGU+DQorICAgICAgICAgICAgPG5hbWU+ZmluYWxCdWlsZE51bWJlcjwvbmFtZT4NCisgICAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPg0KKyAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgIDwvdGFnPg0KKyAgICA8dGFnPg0KKyAgICAgICAgPG5hbWU+YXJ0aWZhY3RzTGluazwvbmFtZT4NCisgICAgICAgIDx0YWctY2xhc3M+bmV0LnNvdXJjZWZvcmdlLmNydWlzZWNvbnRyb2wudGFnbGliLkFydGlmYWN0c0xpbmtUYWc8L3RhZy1jbGFzcz4NCisgICAgICAgIDx0ZWktY2xhc3M+bmV0LnNvdXJjZWZvcmdlLmNydWlzZWNvbnRyb2wudGFnbGliLkFydGlmYWN0c0xpbmtUYWdFeHRyYUluZm88L3RlaS1jbGFzcz4NCisgICAgICAgIDxib2R5LWNvbnRlbnQ+SlNQPC9ib2R5LWNvbnRlbnQ+DQorICAgICAgICA8ZGVzY3JpcHRpb24+DQorICAgICAgICAgICAgSW5zZXJ0cyBsaW5rIHRvIHRoZSBhcnRpZmFjdHMgRmlsZVNlcnZsZXQNCisgICAgICAgIDwvZGVzY3JpcHRpb24+DQorICAgIDwvdGFnPg0KKyAgICAgPHRhZz4NCisgICAgICAgIDxuYW1lPmJ1aWxkSW5mbzwvbmFtZT4NCisgICAgICAgIDx0YWctY2xhc3M+bmV0LnNvdXJjZWZvcmdlLmNydWlzZWNvbnRyb2wudGFnbGliLkJ1aWxkSW5mb1RhZzwvdGFnLWNsYXNzPg0KKyAgICAgICAgPHRlaS1jbGFzcz5uZXQuc291cmNlZm9yZ2UuY3J1aXNlY29udHJvbC50YWdsaWIuQnVpbGRJbmZvVGFnRXh0cmFJbmZvPC90ZWktY2xhc3M+DQorICAgICAgICA8Ym9keS1jb250ZW50PmVtcHR5PC9ib2R5LWNvbnRlbnQ+DQorICAgICAgICA8ZGVzY3JpcHRpb24+DQorICAgICAgICAgICAgSW5zZXJ0cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmFyaW91cyBidWlsZHMgaW50byB0aGUgcGFnZSBzY29wZS4NCisgICAgICAgIDwvZGVzY3JpcHRpb24+DQorICAgIDwvdGFnPg0KKyAgICA8dGFnPg0KKyAgICAgICAgPG5hbWU+dGFic2hlZXQ8L25hbWU+DQorICAgICAgICA8dGFnLWNsYXNzPm5ldC5zb3VyY2Vmb3JnZS5jcnVpc2Vjb250cm9sLnRhZ2xpYi5UYWJTaGVldFRhZzwvdGFnLWNsYXNzPg0KKyAgICAgICAgPGJvZHktY29udGVudD5KU1A8L2JvZHktY29udGVudD4NCisgICAgICAgIDxkZXNjcmlwdGlvbj5DcmVhdGVzIGEgdGFiIHNoZWV0IHRoYXQgdGFicyBjYW4gYmUgcGxhY2VkIGludG8uPC9kZXNjcmlwdGlvbj4NCisgICAgPC90YWc+DQorICAgIDx0YWc+DQorICAgICAgICA8bmFtZT50YWI8L25hbWU+DQorICAgICAgICA8dGFnLWNsYXNzPm5ldC5zb3VyY2Vmb3JnZS5jcnVpc2Vjb250cm9sLnRhZ2xpYi5UYWJUYWc8L3RhZy1jbGFzcz4NCisgICAgICAgIDxib2R5LWNvbnRlbnQ+SlNQPC9ib2R5LWNvbnRlbnQ+DQorICAgICAgICA8ZGVzY3JpcHRpb24+Q3JlYXRlcyBhIHRhYiB0aGF0IHNlbGVjdGVkIGNvbnRlbnQgZ2V0cyBwdXQgaW50by48L2Rlc2NyaXB0aW9uPg0KKyAgICAgICAgPGF0dHJpYnV0ZT4NCisgICAgICAgICAgICA8bmFtZT5uYW1lPC9uYW1lPg0KKyAgICAgICAgICAgIDxyZXF1aXJlZD50cnVlPC9yZXF1aXJlZD4NCisgICAgICAgIDwvYXR0cmlidXRlPg0KKyAgICAgICAgPGF0dHJpYnV0ZT4NCisgICAgICAgICAgICA8bmFtZT5sYWJlbDwvbmFtZT4NCisgICAgICAgICAgICA8cmVxdWlyZWQ+dHJ1ZTwvcmVxdWlyZWQ+DQorICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgPC90YWc+DQorICAgIDx0YWc+DQorICAgICAgICA8bmFtZT5saW5rPC9uYW1lPg0KKyAgICAgICAgPHRhZy1jbGFzcz5uZXQuc291cmNlZm9yZ2UuY3J1aXNlY29udHJvbC50YWdsaWIuTGlua1RhZzwvdGFnLWNsYXNzPg0KKyAgICAgICAgPHRlaS1jbGFzcz5uZXQuc291cmNlZm9yZ2UuY3J1aXNlY29udHJvbC50YWdsaWIuTGlua1RhZ0V4dHJhSW5mbzwvdGVpLWNsYXNzPg0KKyAgICAgICAgPGJvZHktY29udGVudD5lbXB0eTwvYm9keS1jb250ZW50Pg0KKyAgICAgICAgPGRlc2NyaXB0aW9uPkJ1aWxkcyB1cCBhIGxpbmsgVVJMPC9kZXNjcmlwdGlvbj4NCisgICAgICAgIDxhdHRyaWJ1dGU+DQorICAgICAgICAgICAgPG5hbWU+aWQ8L25hbWU+DQorICAgICAgICAgICAgPHJlcXVpcmVkPnRydWU8L3JlcXVpcmVkPg0KKyAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgICA8YXR0cmlidXRlPg0KKyAgICAgICAgICAgIDxuYW1lPmV4Y2x1ZGU8L25hbWU+DQorICAgICAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4NCisgICAgICAgIDwvYXR0cmlidXRlPg0KKyAgICA8L3RhZz4NCis8L3RhZ2xpYj4NCmRpZmYgLS1naXQgYS9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9saWIvYmF0aWstYXd0LXV0aWwuamFyIGIvZ3Jvb3Z5L2NydWlzZS9yZXBvcnRpbmctYXBwL1dFQi1JTkYvbGliL2JhdGlrLWF3dC11dGlsLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDNhNTM2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L2NydWlzZS9yZXBvcnRpbmctYXBwL1dFQi1JTkYvbGliL2JhdGlrLWF3dC11dGlsLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9saWIvYmF0aWstc3ZnZ2VuLmphciBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9XRUItSU5GL2xpYi9iYXRpay1zdmdnZW4uamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMWU4NmMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9saWIvYmF0aWstc3ZnZ2VuLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9saWIvYmF0aWstdXRpbC5qYXIgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9saWIvYmF0aWstdXRpbC5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYzZDgxYgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9XRUItSU5GL2xpYi9iYXRpay11dGlsLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9saWIvY2V3b2xmLmphciBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9XRUItSU5GL2xpYi9jZXdvbGYuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkYTVhOWUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9saWIvY2V3b2xmLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9saWIvY29tbW9ucy1sb2dnaW5nLmphciBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9XRUItSU5GL2xpYi9jb21tb25zLWxvZ2dpbmcuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZDU1NjMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9saWIvY29tbW9ucy1sb2dnaW5nLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9saWIvamNvbW1vbi0wLjguMC5qYXIgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9saWIvamNvbW1vbi0wLjguMC5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBiYmIzMAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9XRUItSU5GL2xpYi9qY29tbW9uLTAuOC4wLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9saWIvamZyZWVjaGFydC0wLjkuOC5qYXIgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi9saWIvamZyZWVjaGFydC0wLjkuOC5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTllNjA4MQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9XRUItSU5GL2xpYi9qZnJlZWNoYXJ0LTAuOS44LmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvV0VCLUlORi93ZWIueG1sIGIvZ3Jvb3Z5L2NydWlzZS9yZXBvcnRpbmctYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWFhMzhiCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L2NydWlzZS9yZXBvcnRpbmctYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDEzOSBAQAorPCFET0NUWVBFIHdlYi1hcHAKKyAgICBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBXZWIgQXBwbGljYXRpb24gMi4yLy9FTiIKKyAgICAiaHR0cDovL2phdmEuc3VuLmNvbS9qMmVlL2R0ZHMvd2ViLWFwcF8yXzIuZHRkIj4KKworPCEtLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDcnVpc2VDb250cm9sLCBhIENvbnRpbnVvdXMgSW50ZWdyYXRpb24gVG9vbGtpdAorICogQ29weXJpZ2h0IChjKSAyMDAxLCBUaG91Z2h0V29ya3MsIEluYy4KKyAqIDY1MSBXIFdhc2hpbmd0b24gQXZlLiBTdWl0ZSA2MDAKKyAqIENoaWNhZ28sIElMIDYwNjYxIFVTQQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICAgKyBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqICAgICArIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKKyAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAgICAgKyBOZWl0aGVyIHRoZSBuYW1lIG9mIFRob3VnaHRXb3JrcywgSW5jLiwgQ3J1aXNlQ29udHJvbCwgbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAqICAgICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqICAgICAgIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi0tPgorPHdlYi1hcHA+CisgICAgPGRpc3BsYXktbmFtZT5ncm9vdnkgQ3J1aXNlQ29udHJvbCBSZXBvcnRpbmcgQXBwPC9kaXNwbGF5LW5hbWU+CisgICAgPGRlc2NyaXB0aW9uPlRoZSByZXBvcnRpbmcgYXBwbGljYXRpb24gZm9yIENydWlzZUNvbnRyb2wuIFByb3ZpZGVzIGEgc2ltcGxlIGJ1dCByaWNoCisgICAgICAgIGludGVyZmFjZSBmb3Igdmlld2luZyBDcnVpc2VDb250cm9sIGJ1aWxkIHJlcG9ydHMuCisgICAgPC9kZXNjcmlwdGlvbj4KKworICAgIDxjb250ZXh0LXBhcmFtPgorICAgICAgICA8cGFyYW0tbmFtZT5zaW5nbGVQcm9qZWN0PC9wYXJhbS1uYW1lPgorICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+CisgICAgICAgIDxkZXNjcmlwdGlvbj5JbmRpY2F0ZXMgaWYgdGhlIENydWlzZUNvbnRyb2wgaW5zdGFuY2UgaXMgdG8gcmVwb3J0IG9uIG9ubHkgb25lIHByb2plY3QuCisgICAgICAgICAgICBJZiBpdCBpcywgdGhlbiB5b3Ugc2hvdWxkIHNldCB0aGlzIHRvIHRydWUuCisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgPC9jb250ZXh0LXBhcmFtPgorCisgICAgPGNvbnRleHQtcGFyYW0+CisgICAgICA8IS0tIFlvdSBjYW4gc2V0IHRoaXMgdmFsdWUgdmlhIHRoZSB1c2VyLmxvZy5kaXIgcHJvcGVydHkgaW4gQW50LCB3aGVuIGJ1aWxkaW5nIHRoZSBXQVIgZmlsZS4gLS0+CisgICAgICA8cGFyYW0tbmFtZT5sb2dEaXI8L3BhcmFtLW5hbWU+CisgICAgICA8cGFyYW0tdmFsdWU+L29wdC9ncm9vdnkvY3J1aXNlY29udHJvbC9sb2dzLzwvcGFyYW0tdmFsdWU+CisgICAgICA8ZGVzY3JpcHRpb24+IFRoaXMgc2hvdWxkIGJlIHRoZSBmdWxsIHBhdGggdG8geW91ciBDcnVpc2VDb250cm9sIGxvZyBkaXJlY3RvcnkuIElmIHlvdQorICAgICAgICAgIGFyZSBpbiBzaW5nbGUgcHJvamVjdCBtb2RlLCB0aGlzIHdpbGwgY29udGFpbiBvbmx5IHRoZSBsb2dzIGZvciB5b3VyIHByb2plY3QuIElmIHlvdQorICAgICAgICAgIGFyZSBpbiBtdWx0aS1wcm9qZWN0IG1vZGUsIGl0IGlzIGV4cGVjdGVkIHRoYXQgeW91IHdpbGwgaGF2ZSBtdWx0aXBsZSBzdWItZGlyZWN0b3JpZXMKKyAgICAgICAgICBpbnNpZGUgdGhpcyBsb2cgZGlyZWN0b3J5LCBvbmUgZm9yIGVhY2ggcHJvamVjdC4KKyAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgPC9jb250ZXh0LXBhcmFtPgorCisgICAgPGNvbnRleHQtcGFyYW0+CisgICAgICA8IS0tIFlvdSBjYW4gc2V0IHRoaXMgdmFsdWUgdmlhIHRoZSB1c2VyLmJ1aWxkLnN0YXR1cy5maWxlIHByb3BlcnR5IGluIEFudCwgd2hlbiBidWlsZGluZyB0aGUgV0FSIGZpbGUuIC0tPgorICAgICAgPHBhcmFtLW5hbWU+Y3VycmVudEJ1aWxkU3RhdHVzRmlsZTwvcGFyYW0tbmFtZT4KKyAgICAgIDxwYXJhbS12YWx1ZT5zdGF0dXMudHh0PC9wYXJhbS12YWx1ZT4KKyAgICAgIDxkZXNjcmlwdGlvbj5UaGlzIHNob3VsZCBiZSB0aGUgcGF0aCB0byB5b3VyIGN1cnJlbnQgYnVpbGQgc3RhdHVzIGZpbGUsIHdoaWNoIGlzIHJlbGF0aXZlCisgICAgICAgICAgdG8gdGhlIGxvZyBkaXJlY3RvcnkgKG9yLCBpbiBzaW5nbGUtcHJvamVjdCBtb2RlLCByZWxhdGl2ZSB0byB0aGUgcHJvamVjdCdzIGxvZworICAgICAgICAgIGRpcmVjdG9yeSkKKyAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgPC9jb250ZXh0LXBhcmFtPgorCisgICAgPHNlcnZsZXQ+CisgICAgICA8c2VydmxldC1uYW1lPmJ1aWxkcmVzdWx0czwvc2VydmxldC1uYW1lPgorICAgICAgPGRpc3BsYXktbmFtZT5CdWlsZCBSZXN1bHQgUmVwb3J0ZXI8L2Rpc3BsYXktbmFtZT4KKyAgICAgIDxkZXNjcmlwdGlvbj5QcmVzZW50cyBidWlsZCByZXN1bHRzIGluIGEgaHVtYW4tcmVhZGFibGUgYW5kIGludHVpdGl2ZSBmb3JtYXQuPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxqc3AtZmlsZT4vbWFpbi5qc3A8L2pzcC1maWxlPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPmluZGV4PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxkaXNwbGF5LW5hbWU+SW5kZXgvU3VtbWFyeSBwYWdlPC9kaXNwbGF5LW5hbWU+CisgICAgICAgIDxkZXNjcmlwdGlvbj5QcmVzZW50cyBhIHN1bW1hcnkgb2YgYWxsIHByb2plY3RzLCBhbGxvd2luZyBlYXN5IG5hdmlnYXRpb24gdG8gZWFjaC48L2Rlc2NyaXB0aW9uPgorICAgICAgICA8anNwLWZpbGU+L2luZGV4LmpzcDwvanNwLWZpbGU+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+QXJ0aWZhY3RTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm5ldC5zb3VyY2Vmb3JnZS5jcnVpc2Vjb250cm9sLnNlcnZsZXQuRmlsZVNlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+cm9vdERpcjwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT4vb3B0L2dyb292eS9jcnVpc2Vjb250cm9sL2FydGlmYWN0cy88L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+TG9nU2VydmxldDwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5uZXQuc291cmNlZm9yZ2UuY3J1aXNlY29udHJvbC5zZXJ2bGV0LkZpbGVTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDwhLS0gVXNlZCBmb3IgY2hhcnRpbmcuLi4gLS0+CisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+Q2V3b2xmU2VydmxldDwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5kZS5sYXVyZXMuY2V3b2xmLkNld29sZlJlbmRlcmVyPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+Q2V3b2xmU2VydmxldDwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L2Nld29sZi8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+TG9nU2VydmxldDwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L2xvZ3MvKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkFydGlmYWN0U2VydmxldDwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L2FydGlmYWN0cy8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICA8c2VydmxldC1uYW1lPmJ1aWxkcmVzdWx0czwvc2VydmxldC1uYW1lPgorICAgICAgPCEtLSBTdHJpY3RseSBzcGVha2luZywgdGhpcyBzaG91bGQgYmUgL2J1aWxkcmVzdWx0cyBmb3Igc2luZ2xlLXByb2plY3QgbW9kZS4gQnV0IGl0IHdvcmtzIGFueXdheS4gLS0+CisgICAgICA8dXJsLXBhdHRlcm4+L2J1aWxkcmVzdWx0cy8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+aW5kZXg8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9pbmRleDwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8d2VsY29tZS1maWxlLWxpc3Q+CisgICAgCTx3ZWxjb21lLWZpbGU+aW5kZXguanNwPC93ZWxjb21lLWZpbGU+CisgICAgPC93ZWxjb21lLWZpbGUtbGlzdD4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9idWlsZHJlc3VsdHMuanNwIGIvZ3Jvb3Z5L2NydWlzZS9yZXBvcnRpbmctYXBwL2J1aWxkcmVzdWx0cy5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ0MTRkMAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9idWlsZHJlc3VsdHMuanNwCkBAIC0wLDAgKzEsNjAgQEAKKzwlLS0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDcnVpc2VDb250cm9sLCBhIENvbnRpbnVvdXMgSW50ZWdyYXRpb24gVG9vbGtpdAorKiBDb3B5cmlnaHQgKGMpIDIwMDEsIFRob3VnaHRXb3JrcywgSW5jLgorKiA2NTEgVyBXYXNoaW5ndG9uIEF2ZS4gU3VpdGUgNjAwCisqIENoaWNhZ28sIElMIDYwNjYxIFVTQQorKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisqIGFyZSBtZXQ6CisqCisqICAgICArIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyoKKyogICAgICsgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKKyogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorKgorKiAgICAgKyBOZWl0aGVyIHRoZSBuYW1lIG9mIFRob3VnaHRXb3JrcywgSW5jLiwgQ3J1aXNlQ29udHJvbCwgbm9yIHRoZQorKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorKiAgICAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisqICAgICAgIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SCisqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLS0lPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL2NydWlzZWNvbnRyb2wtanNwMTEudGxkIiBwcmVmaXg9ImNydWlzZWNvbnRyb2wiJT4KKzxjcnVpc2Vjb250cm9sOnhzbCB4c2xGaWxlPSIveHNsL2hlYWRlci54c2wiLz4KKworPGNydWlzZWNvbnRyb2w6YXJ0aWZhY3RzTGluaz4KKyAgPHRhYmxlIHdpZHRoPSI5OCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiBhbGlnbj0iY2VudGVyIj4KKyAgICA8dHI+PHRkIGNsYXNzPSJoZWFkZXItbGFiZWwiPjxhIGhyZWY9IjwlPSBhcnRpZmFjdHNfdXJsICU+L2luZGV4Lmh0bWwiPkJ1aWxkIEFydGlmYWN0czwvYT48L3RkPjwvdHI+CisgIDwvdGFibGU+Cis8L2NydWlzZWNvbnRyb2w6YXJ0aWZhY3RzTGluaz4KKworPGNydWlzZWNvbnRyb2w6eHNsIHhzbEZpbGU9Ii94c2wvbWF2ZW4ueHNsIi8+Cis8cD4KKzxjcnVpc2Vjb250cm9sOnhzbCB4c2xGaWxlPSIveHNsL2NoZWNrc3R5bGUueHNsIi8+Cis8cD4KKzxjcnVpc2Vjb250cm9sOnhzbCB4c2xGaWxlPSIveHNsL2NvbXBpbGUueHNsIi8+Cis8cD4KKzxjcnVpc2Vjb250cm9sOnhzbCB4c2xGaWxlPSIveHNsL2phdmFkb2MueHNsIi8+Cis8cD4KKzxjcnVpc2Vjb250cm9sOnhzbCB4c2xGaWxlPSIveHNsL3VuaXR0ZXN0cy54c2wiLz4KKzxwPgorPGNydWlzZWNvbnRyb2w6eHNsIHhzbEZpbGU9Ii94c2wvbW9kaWZpY2F0aW9ucy54c2wiLz4KKzxwPgorPGNydWlzZWNvbnRyb2w6eHNsIHhzbEZpbGU9Ii94c2wvZGlzdHJpYnV0YWJsZXMueHNsIi8+Cis8cD4KKzxjcnVpc2Vjb250cm9sOnhzbCB4c2xGaWxlPSIveHNsL2JyZWFrZG93bi54c2wiLz4KZGlmZiAtLWdpdCBhL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9jaGVja3N0eWxlLnhtbCBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9jaGVja3N0eWxlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDNiYzY5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L2NydWlzZS9yZXBvcnRpbmctYXBwL2NoZWNrc3R5bGUueG1sCkBAIC0wLDAgKzEsODYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCFET0NUWVBFIG1vZHVsZSBQVUJMSUMKKyAgICAiLS8vUHVwcHkgQ3Jhd2wvL0RURCBDaGVjayBDb25maWd1cmF0aW9uIDEuMS8vRU4iCisgICAgImh0dHA6Ly93d3cucHVwcHljcmF3bC5jb20vZHRkcy9jb25maWd1cmF0aW9uXzFfMS5kdGQiPgorCis8bW9kdWxlIG5hbWU9IkNoZWNrZXIiPgorICAgIDxtb2R1bGUgbmFtZT0iVHJhbnNsYXRpb24iLz4gICAKKyAgICA8bW9kdWxlIG5hbWU9IlRyZWVXYWxrZXIiPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iY2FjaGVGaWxlIiB2YWx1ZT0idGFyZ2V0L2NoZWNrc3R5bGUuY2FjaGUiLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhYldpZHRoIiB2YWx1ZT0iNCIvPgorCisgICAgICAgIDwhLS0gTmFtaW5nIGNvbnZlbnRpb25zIC0tPgorICAgICAgICA8bW9kdWxlIG5hbWU9IkNvbnN0YW50TmFtZSIvPgorICAgICAgICA8bW9kdWxlIG5hbWU9IkxvY2FsRmluYWxWYXJpYWJsZU5hbWUiLz4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJMb2NhbFZhcmlhYmxlTmFtZSIvPgorICAgICAgICA8bW9kdWxlIG5hbWU9Ik1lbWJlck5hbWUiLz4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJNZXRob2ROYW1lIi8+CisgICAgICAgIDxtb2R1bGUgbmFtZT0iUGFja2FnZU5hbWUiPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImZvcm1hdCIgdmFsdWU9Il5bYS16XSsoXC5bYS16XVthLXowLTldKikqJCIvPgorICAgICAgICA8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJQYXJhbWV0ZXJOYW1lIi8+CisgICAgICAgIDxtb2R1bGUgbmFtZT0iU3RhdGljVmFyaWFibGVOYW1lIi8+CisgICAgICAgIDxtb2R1bGUgbmFtZT0iVHlwZU5hbWUiLz4KKworICAgICAgICA8IS0tIEltcG9ydHMgLS0+CisgICAgICAgIDxtb2R1bGUgbmFtZT0iQXZvaWRTdGFySW1wb3J0Ii8+CisgICAgICAgIDxtb2R1bGUgbmFtZT0iSWxsZWdhbEltcG9ydCIvPgorICAgICAgICA8bW9kdWxlIG5hbWU9IlJlZHVuZGFudEltcG9ydCIvPgorICAgICAgICA8bW9kdWxlIG5hbWU9IlVudXNlZEltcG9ydHMiLz4KKworICAgICAgICA8IS0tIFNpemUgdmlvbGF0aW9ucyAtLT4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJGaWxlTGVuZ3RoIi8+CisgICAgICAgIDxtb2R1bGUgbmFtZT0iTGluZUxlbmd0aCI+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWF4IiB2YWx1ZT0iMTIwIi8+CisgICAgICAgIDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlIG5hbWU9Ik1ldGhvZExlbmd0aCIvPgorICAgICAgICA8bW9kdWxlIG5hbWU9IlBhcmFtZXRlck51bWJlciIvPgorCisgICAgICAgIDwhLS0gV2hpdGVzcGFjZSAtLT4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJOb1doaXRlc3BhY2VBZnRlciI+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idG9rZW5zIgorICAgICAgICAgICAgICAgIHZhbHVlPSJCTk9ULCBERUMsIERPVCwgSU5DLCBMTk9ULCBVTkFSWV9NSU5VUywgVU5BUllfUExVUyIvPgorICAgICAgICA8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJOb1doaXRlc3BhY2VCZWZvcmUiLz4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJPcGVyYXRvcldyYXAiLz4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJQYXJlblBhZCIvPgorICAgICAgICA8bW9kdWxlIG5hbWU9IlRhYkNoYXJhY3RlciIvPgorICAgICAgICA8bW9kdWxlIG5hbWU9IldoaXRlc3BhY2VBZnRlciIvPgorICAgICAgICA8bW9kdWxlIG5hbWU9IldoaXRlc3BhY2VBcm91bmQiLz4KKworICAgICAgICA8IS0tIE1vZGlmaWVycyAtLT4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJNb2RpZmllck9yZGVyIi8+CisKKyAgICAgICAgPCEtLSBCbG9ja3MgLS0+CisgICAgICAgIDxtb2R1bGUgbmFtZT0iRW1wdHlCbG9jayI+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idG9rZW5zIgorICAgICAgICAgICAgICAgIHZhbHVlPSJMSVRFUkFMX0RPLCBMSVRFUkFMX0VMU0UsIExJVEVSQUxfRklOQUxMWSwgTElURVJBTF9GT1IsIExJVEVSQUxfVFJZLCBMSVRFUkFMX1dISUxFLCBTVEFUSUNfSU5JVCIvPgorICAgICAgICA8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJMZWZ0Q3VybHkiLz4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJOZWVkQnJhY2VzIi8+CisgICAgICAgIDxtb2R1bGUgbmFtZT0iUmlnaHRDdXJseSIvPgorICAgICAgICA8bW9kdWxlIG5hbWU9IkF2b2lkTmVzdGVkQmxvY2tzIi8+CisKKyAgICAgICAgPCEtLSBDaGVja3MgZm9yIGNvZGluZyBwcm9ibGVtcyAtLT4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJEb3VibGVDaGVja2VkTG9ja2luZyIvPgorICAgICAgICA8bW9kdWxlIG5hbWU9IkhpZGRlbkZpZWxkIj4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b2tlbnMiIHZhbHVlPSJWQVJJQUJMRV9ERUYiLz4KKyAgICAgICAgPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGUgbmFtZT0iSW5uZXJBc3NpZ25tZW50Ii8+CisgICAgICAgIDxtb2R1bGUgbmFtZT0iTWlzc2luZ1N3aXRjaERlZmF1bHQiLz4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJTaW1wbGlmeUJvb2xlYW5FeHByZXNzaW9uIi8+CisgICAgICAgIDxtb2R1bGUgbmFtZT0iU2ltcGxpZnlCb29sZWFuUmV0dXJuIi8+CisgICAgICAgIAorICAgICAgICA8IS0tIERlc2lnbiBjaGVja3MgLS0+CisgICAgICAgIDxtb2R1bGUgbmFtZT0iVmlzaWJpbGl0eU1vZGlmaWVyIj4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwdWJsaWNNZW1iZXJQYXR0ZXJuIiB2YWx1ZT0iXlthLXpBLVowLTldKiQiLz4KKyAgICAgICAgPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGUgbmFtZT0iRmluYWxDbGFzcyIvPgorICAgICAgICA8bW9kdWxlIG5hbWU9IkludGVyZmFjZUlzVHlwZSIvPgorICAgICAgICA8bW9kdWxlIG5hbWU9IkhpZGVVdGlsaXR5Q2xhc3NDb25zdHJ1Y3RvciIvPgorCisgICAgICAgIDwhLS0gTWlzY2VsbGFuZW91cyAtLT4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJVcHBlckVsbCIvPgorICAgICAgICA8bW9kdWxlIG5hbWU9IkFycmF5VHlwZVN0eWxlIi8+ICAgICAgICAKKyAgICA8L21vZHVsZT4KKzwvbW9kdWxlPgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L2NydWlzZS9yZXBvcnRpbmctYXBwL2NvbnRyb2xwYW5lbC5qc3AgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvY29udHJvbHBhbmVsLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGM3ODM2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L2NydWlzZS9yZXBvcnRpbmctYXBwL2NvbnRyb2xwYW5lbC5qc3AKQEAgLTAsMCArMSw2MyBAQAorPCUtLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDcnVpc2VDb250cm9sLCBhIENvbnRpbnVvdXMgSW50ZWdyYXRpb24gVG9vbGtpdAorICogQ29weXJpZ2h0IChjKSAyMDAxLCBUaG91Z2h0V29ya3MsIEluYy4KKyAqIDY1MSBXIFdhc2hpbmd0b24gQXZlLiBTdWl0ZSA2MDAKKyAqIENoaWNhZ28sIElMIDYwNjYxIFVTQQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICAgKyBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqICAgICArIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKKyAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAgICAgKyBOZWl0aGVyIHRoZSBuYW1lIG9mIFRob3VnaHRXb3JrcywgSW5jLiwgQ3J1aXNlQ29udHJvbCwgbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAqICAgICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqICAgICAgIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi0tJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9jcnVpc2Vjb250cm9sLWpzcDExLnRsZCIgcHJlZml4PSJjcnVpc2Vjb250cm9sIiU+Cis8JUBwYWdlIGltcG9ydD0iamF2YS5uZXQuKixqYXZhLmlvLioiJT4KKzwlCisgICAgU3RyaW5nIGhvc3RuYW1lID0gIiI7CisgICAgdHJ5CisgICAgeworICAgICAgICBob3N0bmFtZSA9IEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLmdldEhvc3ROYW1lKCk7CisgICAgfQorICAgIGNhdGNoKElPRXhjZXB0aW9uIGUpCisgICAgeworICAgICAgICBob3N0bmFtZSA9ICJsb2NhbGhvc3QiOworICAgIH0KKyU+Cis8cD4KKzx0YWJsZSB3aWR0aD0iNjAwIiBhbGlnbj0iY2VudGVyIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgorICAgIDx0cj4KKyAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiPgorICAgICAgICAgICAgPGgyPkpNWCBDb250cm9sIFBhbmVsPC9oMj4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPgorICAgICAgICAgICAgPGlmcmFtZSBuYW1lPSJjb250cm9sUGFuZWxGcmFtZSIgaWQ9ImNvbnRyb2xQYW5lbEZyYW1lIiBoZWlnaHQ9IjUyMCIgbWFyZ2luaGVpZ2h0PSIwIiBmcmFtZWJvcmRlcj0iMSIgbWFyZ2lud2lkdGg9IjAiIHNyYz0iaHR0cDovL2J1aWxkLmNhbm9vLmNvbTozNzk4MCIgd2lkdGg9IjYwNSI+PC9pZnJhbWU+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKzwvdGFibGU+Cis8L3A+CmRpZmYgLS1naXQgYS9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvY3J1aXNlY29udHJvbC5oZWFkZXIgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvY3J1aXNlY29udHJvbC5oZWFkZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgyMDVjOQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9jcnVpc2Vjb250cm9sLmhlYWRlcgpAQCAtMCwwICsxLDM2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENydWlzZUNvbnRyb2wsIGEgQ29udGludW91cyBJbnRlZ3JhdGlvbiBUb29sa2l0CisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIFRob3VnaHRXb3JrcywgSW5jLgorICogNjUxIFcgV2FzaGluZ3RvbiBBdmUuIFN1aXRlIDYwMAorICogQ2hpY2FnbywgSUwgNjA2NjEgVVNBCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgICArIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogICAgICsgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqICAgICArIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhvdWdodFdvcmtzLCBJbmMuLCBDcnVpc2VDb250cm9sLCBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICogICAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogICAgICAgd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L2NydWlzZS9yZXBvcnRpbmctYXBwL2Nzcy9jcnVpc2Vjb250cm9sLmNzcyBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9jc3MvY3J1aXNlY29udHJvbC5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA3YTlmNQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9jc3MvY3J1aXNlY29udHJvbC5jc3MKQEAgLTAsMCArMSwxNTMgQEAKKy5ob3N0IHsKKwlCQUNLR1JPVU5ELVBPU0lUSU9OOiAwcHggLTI1cHg7IEZPTlQtU0laRTogODAlOyBCQUNLR1JPVU5ELUlNQUdFOiB1cmwoL2dyb292eS9pbWFnZXMveWVsbG93R3JlZW5CYWNrLnBuZyk7IEJBQ0tHUk9VTkQtUkVQRUFUOiByZXBlYXQteDsgRk9OVC1GQU1JTFk6IHZlcmRhbmEsIGhlbHZldGljYSwgYXJpYWwsIHNhbnMtc2VyaWY7IEhFSUdIVDogNzVweDsgQkFDS0dST1VORC1DT0xPUjogI2ZmZmZhYTsgVEVYVC1BTElHTjogcmlnaHQKK30KKy5jYW5vbyB7CisJUklHSFQ6IDIwcHg7IFBPU0lUSU9OOiBhYnNvbHV0ZTsgVE9QOiA0cHgKK30KKy5sb2dvIHsKKyAgICBMRUZUOiAyMHB4OyBQT1NJVElPTjogcmVsYXRpdmU7IFRPUDogLTg0cHgKK30KKworLndoaXRlIHsKKwlDT0xPUjogI2ZmZmZmZgorfQorLm5hdmlnYXRpb24geworICAgIHBhZGRpbmctdG9wOiAyMHB4OworICAgIHBhZGRpbmctbGVmdDogMTBweDsKKwlCQUNLR1JPVU5ELUNPTE9SOiAjZmZmZmFhCit9CisuaW5kZXggeworCUJBQ0tHUk9VTkQtQ09MT1I6ICNmZmZmZmYKK30KKy5pbmRleC1wYXNzZWQgeworCUNPTE9SOiAjMDA0NDAwCit9CisuaW5kZXgtZmFpbGVkIHsKKwlGT05ULVdFSUdIVDogYm9sZDsgQ09MT1I6ICNmZjAwMDAKK30KKy5pbmRleC1oZWFkZXIgeworCUZPTlQtV0VJR0hUOiBib2xkCit9CisubGluayB7CisJRk9OVC1TSVpFOiAxMHB0OyBDT0xPUjogIzMzNjY5OTsgRk9OVC1GQU1JTFk6IGFyaWFsLGhlbHZldGljYSxzYW5zLXNlcmlmOyBURVhULURFQ09SQVRJT046IG5vbmUKK30KKy50YWItdGFibGUgeworCU1BUkdJTjogMGVtIDBlbSAwLjVlbQorfQorLnRhYnMgeworCVBBRERJTkctUklHSFQ6IDJlbTsgUEFERElORy1MRUZUOiAyZW07IEZPTlQtV0VJR0hUOiBib2xkOyBGT05ULVNJWkU6IDhwdDsgUEFERElORy1CT1RUT006IDBlbTsgQ09MT1I6ICMwMDAwMDA7IFBBRERJTkctVE9QOiAwZW07IEZPTlQtRkFNSUxZOiBhcmlhbCxoZWx2ZXRpY2Esc2Fucy1zZXJpZjsgQkFDS0dST1VORC1DT0xPUjogI2NjY2NmZgorfQorLnRhYnMtbGluayB7CisJQ09MT1I6ICMwMDAwMDA7IFRFWFQtREVDT1JBVElPTjogbm9uZQorfQorLnRhYnMtbGluazp2aXNpdGVkIHsKKwlDT0xPUjogIzAwMDAwMDsgVEVYVC1ERUNPUkFUSU9OOiBub25lCit9CisudGFicy1zZWxlY3RlZCB7CisJUEFERElORy1SSUdIVDogMmVtOyBQQURESU5HLUxFRlQ6IDJlbTsgRk9OVC1XRUlHSFQ6IGJvbGQ7IEZPTlQtU0laRTogOHB0OyBQQURESU5HLUJPVFRPTTogMGVtOyBDT0xPUjogIzAwMDAwMDsgUEFERElORy1UT1A6IDBlbTsgRk9OVC1GQU1JTFk6IGFyaWFsLGhlbHZldGljYSxzYW5zLXNlcmlmCit9CisudGFicy1zZWxlY3RlZCB7CisJQk9SREVSLVJJR0hUOiBpbnNldDsgQk9SREVSLVRPUDogaW5zZXQ7IEJPUkRFUi1MRUZUOiBpbnNldDsgQk9SREVSLUJPVFRPTTogaW5zZXQKK30KKy5oZWFkZXItdGl0bGUgeworCUZPTlQtV0VJR0hUOiBib2xkOyBGT05ULVNJWkU6IDEycHQ7IENPTE9SOiAjMzM2Njk5OyBGT05ULUZBTUlMWTogYXJpYWwsaGVsdmV0aWNhLHNhbnMtc2VyaWYKK30KKy5oZWFkZXItbGFiZWwgeworCUZPTlQtV0VJR0hUOiBib2xkCit9CisuaGVhZGVyLWRhdGEgeworCUZPTlQtU0laRTogMTBwdDsgQ09MT1I6ICMzMzY2OTk7IEZPTlQtRkFNSUxZOiBhcmlhbCxoZWx2ZXRpY2Esc2Fucy1zZXJpZgorfQorLm1vZGlmaWNhdGlvbnMtZGF0YSB7CisJRk9OVC1TSVpFOiA4cHQ7IENPTE9SOiAjMDAwMDAwOyBGT05ULUZBTUlMWTogYXJpYWwsaGVsdmV0aWNhLHNhbnMtc2VyaWYKK30KKy5tb2RpZmljYXRpb25zLXNlY3Rpb25oZWFkZXIgeworCUZPTlQtU0laRTogMTBwdDsgQ09MT1I6ICMzMzY2OTk7IEZPTlQtRkFNSUxZOiBhcmlhbCxoZWx2ZXRpY2Esc2Fucy1zZXJpZjsgQkFDS0dST1VORC1DT0xPUjogI2ZmZmZhYQorfQorLm1vZGlmaWNhdGlvbnMtb2Rkcm93IHsKKwlCQUNLR1JPVU5ELUNPTE9SOiAjY2NjY2ZmCit9CisubW9kaWZpY2F0aW9ucy1ldmVucm93IHsKKwlCQUNLR1JPVU5ELUNPTE9SOiAjZmZmZmNjCit9CisuYnJlYWtkb3duLXNlY3Rpb25oZWFkZXIgeworCUZPTlQtU0laRTogMTBwdDsgQ09MT1I6ICMzMzY2OTk7IEZPTlQtRkFNSUxZOiBhcmlhbCxoZWx2ZXRpY2Esc2Fucy1zZXJpZjsgQkFDS0dST1VORC1DT0xPUjogI2ZmZmZhYQorfQorLmJyZWFrZG93bi1kYXRhIHsKKwlGT05ULVNJWkU6IDhwdDsgQ09MT1I6ICMwMDAwMDA7IEZPTlQtRkFNSUxZOiBhcmlhbCxoZWx2ZXRpY2Esc2Fucy1zZXJpZgorfQorLmJyZWFrZG93bi1vZGRyb3cgeworCUJBQ0tHUk9VTkQtQ09MT1I6ICNjY2NjZmYKK30KKy5icmVha2Rvd24tZXZlbnJvdyB7CisJQkFDS0dST1VORC1DT0xPUjogI2ZmZmZjYworfQorLmNoYW5nZWxpc3RzLW9kZHJvdyB7CisJQkFDS0dST1VORC1DT0xPUjogI2NjY2NmZgorfQorLmNoYW5nZWxpc3RzLWV2ZW5yb3cgeworCUJBQ0tHUk9VTkQtQ09MT1I6ICNmZmZmY2MKK30KKy5jaGFuZ2VsaXN0cy1maWxlLXNwYWNlciB7CisJQkFDS0dST1VORC1DT0xPUjogI2ZmZmZmZgorfQorLmNoYW5nZWxpc3RzLWZpbGUtZXZlbnJvdyB7CisJQkFDS0dST1VORC1DT0xPUjogI2VlZWVlZQorfQorLmNoYW5nZWxpc3RzLWZpbGUtb2Rkcm93IHsKKwlCQUNLR1JPVU5ELUNPTE9SOiAjZmZmZmVlCit9CisuY2hhbmdlbGlzdHMtZmlsZS1oZWFkZXIgeworCUZPTlQtU0laRTogOHB0OyBDT0xPUjogI2ZmZmZmZjsgRk9OVC1GQU1JTFk6IGFyaWFsLGhlbHZldGljYSxzYW5zLXNlcmlmOyBCQUNLR1JPVU5ELUNPTE9SOiAjNjY2NjY2Cit9CisuY29tcGlsZS1kYXRhIHsKKwlGT05ULVNJWkU6IDhwdDsgQ09MT1I6ICMwMDAwMDA7IEZPTlQtRkFNSUxZOiBhcmlhbCxoZWx2ZXRpY2Esc2Fucy1zZXJpZgorfQorLmNvbXBpbGUtZXJyb3ItZGF0YSB7CisJRk9OVC1TSVpFOiA4cHQ7IENPTE9SOiAjZmYwMDAwOyBGT05ULUZBTUlMWTogYXJpYWwsaGVsdmV0aWNhLHNhbnMtc2VyaWYKK30KKy5jb21waWxlLXdhcm4tZGF0YSB7CisJRk9OVC1TSVpFOiA4cHQ7IENPTE9SOiAjY2M5OTAwOyBGT05ULUZBTUlMWTogYXJpYWwsaGVsdmV0aWNhLHNhbnMtc2VyaWYKK30KKy5jb21waWxlLXNlY3Rpb25oZWFkZXIgeworCUZPTlQtU0laRTogMTBwdDsgQ09MT1I6ICMzMzY2OTk7IEZPTlQtRkFNSUxZOiBhcmlhbCxoZWx2ZXRpY2Esc2Fucy1zZXJpZjsgQkFDS0dST1VORC1DT0xPUjogI2ZmZmZhYQorfQorLmRpc3RyaWJ1dGFibGVzLWRhdGEgeworCUZPTlQtU0laRTogOHB0OyBDT0xPUjogIzAwMDAwMDsgRk9OVC1GQU1JTFk6IGFyaWFsLGhlbHZldGljYSxzYW5zLXNlcmlmCit9CisuZGlzdHJpYnV0YWJsZXMtc2VjdGlvbmhlYWRlciB7CisJRk9OVC1TSVpFOiAxMHB0OyBDT0xPUjogIzMzNjY5OTsgRk9OVC1GQU1JTFk6IGFyaWFsLGhlbHZldGljYSxzYW5zLXNlcmlmOyBCQUNLR1JPVU5ELUNPTE9SOiAjZmZmZmFhCit9CisuZGlzdHJpYnV0YWJsZXMtb2Rkcm93IHsKKwlCQUNLR1JPVU5ELUNPTE9SOiAjY2NjY2ZmCit9CisuZGlzdHJpYnV0YWJsZXMtZXZlbnJvdyB7CisJQkFDS0dST1VORC1DT0xPUjogI2ZmZmZjYworfQorLnVuaXR0ZXN0cy1zZWN0aW9uaGVhZGVyIHsKKwlGT05ULVNJWkU6IDEwcHQ7IENPTE9SOiAjMzM2Njk5OyBGT05ULUZBTUlMWTogYXJpYWwsaGVsdmV0aWNhLHNhbnMtc2VyaWY7IEJBQ0tHUk9VTkQtQ09MT1I6ICNmZmZmYWEKK30KKy51bml0dGVzdHMtb2Rkcm93IHsKKwlCQUNLR1JPVU5ELUNPTE9SOiAjY2NjY2ZmCit9CisudW5pdHRlc3RzLWV2ZW5yb3cgeworCUJBQ0tHUk9VTkQtQ09MT1I6ICNmZmZmY2MKK30KKy51bml0dGVzdHMtZGF0YSB7CisJRk9OVC1TSVpFOiA4cHQ7IENPTE9SOiAjMDAwMDAwOyBGT05ULUZBTUlMWTogYXJpYWwsaGVsdmV0aWNhLHNhbnMtc2VyaWYKK30KKy51bml0dGVzdHMtZXJyb3IgeworCUZPTlQtU0laRTogOHB0OyBDT0xPUjogIzkwMTA5MDsgRk9OVC1GQU1JTFk6IGFyaWFsLGhlbHZldGljYSxzYW5zLXNlcmlmCit9CisudW5pdHRlc3RzLWZhaWx1cmUgeworCUZPTlQtU0laRTogOHB0OyBDT0xPUjogI2ZmMDAwMDsgRk9OVC1GQU1JTFk6IGFyaWFsLGhlbHZldGljYSxzYW5zLXNlcmlmCit9CisuY2hlY2tzdHlsZS1vZGRyb3cgeworCUJBQ0tHUk9VTkQtQ09MT1I6ICNjY2NjZmYKK30KKy5jaGVja3N0eWxlLWRhdGEgeworCUZPTlQtU0laRTogOHB0OyBDT0xPUjogIzAwMDAwMDsgRk9OVC1GQU1JTFk6IGFyaWFsLGhlbHZldGljYSxzYW5zLXNlcmlmCit9CisuY2hlY2tzdHlsZS1zZWN0aW9uaGVhZGVyIHsKKwlGT05ULVNJWkU6IDEwcHQ7IENPTE9SOiAjMzM2Njk5OyBGT05ULUZBTUlMWTogYXJpYWwsaGVsdmV0aWNhLHNhbnMtc2VyaWY7IEJBQ0tHUk9VTkQtQ09MT1I6ICNmZmZmYWEKK30KZGlmZiAtLWdpdCBhL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9pbWFnZXMvRHVrZUdyb292eUNoYWlyLmpwZyBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9pbWFnZXMvRHVrZUdyb292eUNoYWlyLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTBjMmM1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L2NydWlzZS9yZXBvcnRpbmctYXBwL2ltYWdlcy9EdWtlR3Jvb3Z5Q2hhaXIuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9pbWFnZXMvYmFja2hlYWQyLnBuZyBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9pbWFnZXMvYmFja2hlYWQyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGUwNmViCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L2NydWlzZS9yZXBvcnRpbmctYXBwL2ltYWdlcy9iYWNraGVhZDIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9pbWFnZXMvYmxhbmszNS5naWYgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvaW1hZ2VzL2JsYW5rMzUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2MGRkMmUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvaW1hZ2VzL2JsYW5rMzUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9pbWFnZXMvYmxhbms4LmdpZiBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9pbWFnZXMvYmxhbms4LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2JmMzcxCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L2NydWlzZS9yZXBvcnRpbmctYXBwL2ltYWdlcy9ibGFuazguZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9pbWFnZXMvYmx1ZWJnLmdpZiBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9pbWFnZXMvYmx1ZWJnLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjcxMWNlCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L2NydWlzZS9yZXBvcnRpbmctYXBwL2ltYWdlcy9ibHVlYmcuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9pbWFnZXMvYmx1ZXN0cmlwZXNib3R0b20uZ2lmIGIvZ3Jvb3Z5L2NydWlzZS9yZXBvcnRpbmctYXBwL2ltYWdlcy9ibHVlc3RyaXBlc2JvdHRvbS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJiZWExYwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9pbWFnZXMvYmx1ZXN0cmlwZXNib3R0b20uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9pbWFnZXMvYmx1ZXN0cmlwZXN0b3AuZ2lmIGIvZ3Jvb3Z5L2NydWlzZS9yZXBvcnRpbmctYXBwL2ltYWdlcy9ibHVlc3RyaXBlc3RvcC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJiZWExYwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9pbWFnZXMvYmx1ZXN0cmlwZXN0b3AuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9pbWFnZXMvYnVpbGRSZXN1bHRzVGFiLW9mZi5naWYgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvaW1hZ2VzL2J1aWxkUmVzdWx0c1RhYi1vZmYuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3YWE3NzcKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvaW1hZ2VzL2J1aWxkUmVzdWx0c1RhYi1vZmYuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9pbWFnZXMvYnVpbGRSZXN1bHRzVGFiLW9uLmdpZiBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9pbWFnZXMvYnVpbGRSZXN1bHRzVGFiLW9uLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzIyZjc4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L2NydWlzZS9yZXBvcnRpbmctYXBwL2ltYWdlcy9idWlsZFJlc3VsdHNUYWItb24uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9pbWFnZXMvY2Fub29fcmdiX3Bvcy5naWYgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvaW1hZ2VzL2Nhbm9vX3JnYl9wb3MuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MDRmMjgKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvaW1hZ2VzL2Nhbm9vX3JnYl9wb3MuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9pbWFnZXMvY29udGludW91c2ludGVncmF0aW9uLmdpZiBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9pbWFnZXMvY29udGludW91c2ludGVncmF0aW9uLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDQwZTVlCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L2NydWlzZS9yZXBvcnRpbmctYXBwL2ltYWdlcy9jb250aW51b3VzaW50ZWdyYXRpb24uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9pbWFnZXMvY29udHJvbFBhbmVsVGFiLW9mZi5naWYgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvaW1hZ2VzL2NvbnRyb2xQYW5lbFRhYi1vZmYuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMDFkMTgKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvaW1hZ2VzL2NvbnRyb2xQYW5lbFRhYi1vZmYuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9pbWFnZXMvY29udHJvbFBhbmVsVGFiLW9uLmdpZiBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9pbWFnZXMvY29udHJvbFBhbmVsVGFiLW9uLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWFjZDUyCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L2NydWlzZS9yZXBvcnRpbmctYXBwL2ltYWdlcy9jb250cm9sUGFuZWxUYWItb24uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9pbWFnZXMvbG9nby5naWYgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvaW1hZ2VzL2xvZ28uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5YWJlMjAKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvaW1hZ2VzL2xvZ28uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9pbWFnZXMvdGVzdFJlc3VsdHNUYWItb2ZmLmdpZiBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9pbWFnZXMvdGVzdFJlc3VsdHNUYWItb2ZmLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzdiMGRhCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L2NydWlzZS9yZXBvcnRpbmctYXBwL2ltYWdlcy90ZXN0UmVzdWx0c1RhYi1vZmYuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9pbWFnZXMvdGVzdFJlc3VsdHNUYWItb24uZ2lmIGIvZ3Jvb3Z5L2NydWlzZS9yZXBvcnRpbmctYXBwL2ltYWdlcy90ZXN0UmVzdWx0c1RhYi1vbi5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYzMTQwZQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9pbWFnZXMvdGVzdFJlc3VsdHNUYWItb24uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9pbWFnZXMveG1sTG9nRmlsZVRhYi1vZmYuZ2lmIGIvZ3Jvb3Z5L2NydWlzZS9yZXBvcnRpbmctYXBwL2ltYWdlcy94bWxMb2dGaWxlVGFiLW9mZi5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE0YzhlZAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9pbWFnZXMveG1sTG9nRmlsZVRhYi1vZmYuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9pbWFnZXMveG1sTG9nRmlsZVRhYi1vbi5naWYgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvaW1hZ2VzL3htbExvZ0ZpbGVUYWItb24uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlYzkxMDQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvaW1hZ2VzL3htbExvZ0ZpbGVUYWItb24uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9pbWFnZXMveWVsbG93R3JlZW5CYWNrLnBuZyBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9pbWFnZXMveWVsbG93R3JlZW5CYWNrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjIzOTViCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L2NydWlzZS9yZXBvcnRpbmctYXBwL2ltYWdlcy95ZWxsb3dHcmVlbkJhY2sucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9pbmRleC5qc3AgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvaW5kZXguanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyY2FlYWIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvaW5kZXguanNwCkBAIC0wLDAgKzEsMTU1IEBACis8JUAgcGFnZSBpbXBvcnQ9ImphdmEuaW8uRmlsZSwKKyAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5cywKKyAgICAgICAgICAgICAgICAgamF2YS51dGlsLkNhbGVuZGFyIiU+CisgPCUtLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDcnVpc2VDb250cm9sLCBhIENvbnRpbnVvdXMgSW50ZWdyYXRpb24gVG9vbGtpdAorICogQ29weXJpZ2h0IChjKSAyMDAxLCBUaG91Z2h0V29ya3MsIEluYy4KKyAqIDY1MSBXIFdhc2hpbmd0b24gQXZlLiBTdWl0ZSA2MDAKKyAqIENoaWNhZ28sIElMIDYwNjYxIFVTQQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICAgKyBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqICAgICArIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKKyAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAgICAgKyBOZWl0aGVyIHRoZSBuYW1lIG9mIFRob3VnaHRXb3JrcywgSW5jLiwgQ3J1aXNlQ29udHJvbCwgbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAqICAgICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqICAgICAgIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi0tJT4KKzxqc3A6dXNlQmVhbiBpZD0ic3RhdHVzSGVscGVyIiBzY29wZT0icGFnZSIgY2xhc3M9Im5ldC5zb3VyY2Vmb3JnZS5jcnVpc2Vjb250cm9sLlN0YXR1c0hlbHBlciIgLz4KKzwlCisgICAgU3RyaW5nIHNpbmdsZVByb2plY3RNb2RlID0gYXBwbGljYXRpb24uZ2V0SW5pdFBhcmFtZXRlcigic2luZ2xlUHJvamVjdCIpOworICAgIGlmIChCb29sZWFuLnZhbHVlT2Yoc2luZ2xlUHJvamVjdE1vZGUpLmJvb2xlYW5WYWx1ZSgpKSB7CisgICAgICAgJT48anNwOmZvcndhcmQgcGFnZT0iYnVpbGRyZXN1bHRzIiAvPjwlCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBTdHJpbmdCdWZmZXIgcmVwb3J0VGltZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICBDYWxlbmRhciBub3cgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOworICAgIHJlcG9ydFRpbWUuYXBwZW5kKG5vdy5nZXQoQ2FsZW5kYXIuSE9VUl9PRl9EQVkpKTsKKyAgICByZXBvcnRUaW1lLmFwcGVuZCgiOiIpOworICAgIFN0cmluZyBtaW51dGVzID0gU3RyaW5nLnZhbHVlT2Yobm93LmdldChDYWxlbmRhci5NSU5VVEUpKTsKKyAgICBpZiAobWludXRlcy5sZW5ndGgoKSA9PSAxKSB7CisgICAgICAgIG1pbnV0ZXMgPSAwICsgbWludXRlczsKKyAgICB9CisgICAgcmVwb3J0VGltZS5hcHBlbmQobWludXRlcyk7CisKKyAgICBib29sZWFuIGF1dG9SZWZyZXNoID0gInRydWUiLmVxdWFscyhyZXF1ZXN0LmdldFBhcmFtZXRlcigiYXV0b19yZWZyZXNoIikpOworJT4KKzxodG1sPgorPGhlYWQ+CisgIDx0aXRsZT5DcnVpc2VDb250cm9sIFN0YXR1cyBQYWdlPC90aXRsZT4KKyAgPGJhc2UgaHJlZj0iPCU9cmVxdWVzdC5nZXRTY2hlbWUoKSU+Oi8vPCU9cmVxdWVzdC5nZXRTZXJ2ZXJOYW1lKCklPjo8JT1yZXF1ZXN0LmdldFNlcnZlclBvcnQoKSU+PCU9cmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpJT4vIiAvPgorICA8bGluayB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJjc3MvY3J1aXNlY29udHJvbC5jc3MiLz4KKyAgPCUKKyAgICAgaWYgKGF1dG9SZWZyZXNoKSB7IAorICAlPgorICA8TUVUQSBIVFRQLUVRVUlWPSJSZWZyZXNoIiBDT05URU5UPSIxMCI+CisgIDwlCisgICAgIH0KKyAgJT4KKzwvaGVhZD4KKzxib2R5IGJhY2tncm91bmQ9ImltYWdlcy9ibHVlYmcuZ2lmIiB0b3BtYXJnaW49IjAiIGxlZnRtYXJnaW49IjAiIG1hcmdpbmhlaWdodD0iMCIgbWFyZ2lud2lkdGg9IjAiPgorPHA+Jm5ic3A7PC9wPgorCis8aDEgY2xhc3M9IndoaXRlIiBhbGlnbj0iY2VudGVyIj5DcnVpc2VDb250cm9sIFN0YXR1cyBQYWdlPC9oMT4KKworPHRhYmxlIGFsaWduPSJjZW50ZXIiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iNzAlIj4KKzx0Zm9vdD4KKyAgPHRyPjx0ZCBjbGFzcz0ibGluayI+bGlzdGluZyBnZW5lcmF0ZWQgYXQgPCU9cmVwb3J0VGltZS50b1N0cmluZygpJT48L3RkPjwvdHI+Cis8L3Rmb290PgorPHRib2R5PgorPHRyPjx0ZCBhbGlnbj0icmlnaHQiPgorICA8JQorICAgICBpZiAoYXV0b1JlZnJlc2gpIHsKKyAgJT4KKyAgICA8YSBjbGFzcz0id2hpdGUiIGhyZWY9Ij9hdXRvX3JlZnJlc2g9ZmFsc2UiPlR1cm4gYXV0b3JlZnJlc2ggb2ZmPC9hPgorICA8JQorICAgICB9IGVsc2UgeworICAlPgorICAgIDxhIGNsYXNzPSJ3aGl0ZSIgaHJlZj0iP2F1dG9fcmVmcmVzaD10cnVlIj5UdXJuIGF1dG9yZWZyZXNoIG9uPC9hPgorICA8JQorICAgICB9CisgICU+CisgIDwvdGQ+PC90cj4KKyAgPHRyPjx0ZD4mbmJzcDs8L3RkPjwvdHI+CisgIDx0cj48dGQgYmdjb2xvcj0iI0ZGRkZGRiI+PGltZyBib3JkZXI9IjAiIHNyYz0iaW1hZ2VzL2JsdWVzdHJpcGVzdG9wLmdpZiI+PC90ZD48L3RyPgorICA8dHI+PHRkPjx0YWJsZSBjbGFzcz0iaW5kZXgiIHdpZHRoPSIxMDAlIj4KKzwlCisgICBTdHJpbmcgbG9nRGlyUGF0aCA9IGFwcGxpY2F0aW9uLmdldEluaXRQYXJhbWV0ZXIoImxvZ0RpciIpOworICAgaWYgKGxvZ0RpclBhdGggPT0gbnVsbCkgeworICAgICAgICU+PHRyPjx0ZD5Zb3UgbmVlZCB0byBwcm92aWRlIGEgdmFsdWUgZm9yIHRoZSBjb250ZXh0IHBhcmFtZXRlciA8Y29kZT4mcXVvdDtsb2dEaXImcXVvdDs8L2NvZGU+PC90ZD48L3RyPjwlCisgICB9IGVsc2UgeworICAgICAgIGphdmEuaW8uRmlsZSBsb2dEaXIgPSBuZXcgamF2YS5pby5GaWxlKGxvZ0RpclBhdGgpOworICAgICAgIGlmIChsb2dEaXIuaXNEaXJlY3RvcnkoKSA9PSBmYWxzZSkgeworICAgICAgICAgICAlPjx0cj48dGQ+Q29udGV4dCBwYXJhbWV0ZXIgbG9nRGlyIG5lZWRzIHRvIGJlIHNldCB0byBhIGRpcmVjdG9yeS4gQ3VycmVudGx5IHNldCB0byAmcXVvdDs8JT1sb2dEaXJQYXRoJT4mcXVvdDs8L3RkPjwvdHI+PCUKKyAgICAgICB9IGVsc2UgeworICAgICAgICAgICBTdHJpbmdbXSBwcm9qZWN0RGlycyA9IGxvZ0Rpci5saXN0KG5ldyBqYXZhLmlvLkZpbGVuYW1lRmlsdGVyKCkgeworICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZGlyLCBTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgICAgICAgIHJldHVybiAobmV3IEZpbGUoZGlyLCBuYW1lKS5pc0RpcmVjdG9yeSgpKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgaWYgKHByb2plY3REaXJzLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAlPjx0cj48dGQ+bm8gcHJvamVjdCBkaXJlY3RvcmllcyBmb3VuZCB1bmRlciA8JT1sb2dEaXJQYXRoJT48L3RkPjwvdHI+PCUKKyAgICAgICAgICAgfQorICAgICAgICAgICBlbHNlIHsKKyU+ICAgIDx0aGVhZCBjbGFzcz0iaW5kZXgtaGVhZGVyIj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPlByb2plY3Q8L3RkPgorICAgICAgICA8dGQgYWxpZ249ImNlbnRlciI+TGFzdCBidWlsZCByZXN1bHQ8L3RkPgorICAgICAgICA8dGQgYWxpZ249ImNlbnRlciI+TGFzdCBidWlsZCB0aW1lPC90ZD4KKyAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiPkxhc3Qgc3VjY2Vzc2Z1bCBidWlsZCB0aW1lPC90ZD4KKyAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiPkxhc3QgbGFiZWw8L3RkPgorICAgIDwvdHI+CisgICAgPC90aGVhZD4KKyAgICA8dGJvZHk+CisgPCUKKyAgICAgICAgICAgICAgIEFycmF5cy5zb3J0KHByb2plY3REaXJzKTsKKyAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3REaXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb2plY3QgPSBwcm9qZWN0RGlyc1tpXTsKKyAgICAgICAgICAgICAgICAgICBGaWxlIHByb2plY3REaXIgPSBuZXcgRmlsZShsb2dEaXIsIHByb2plY3QpOworICAgICAgICAgICAgICAgICAgIHN0YXR1c0hlbHBlci5zZXRQcm9qZWN0RGlyZWN0b3J5KHByb2plY3REaXIpOworICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmVzdWx0ID0gc3RhdHVzSGVscGVyLmdldExhc3RCdWlsZFJlc3VsdCgpOworICAgICAgICAgJT4gICAgICAgIDx0cj48dGQ+PGEgaHJlZj0iYnVpbGRyZXN1bHRzLzwlPXByb2plY3QlPiI+PCU9cHJvamVjdCU+PC9hPjwvdGQ+PCUKKyAgICAgICAgICAgICAgICAgJT48dGQgY2xhc3M9ImluZGV4LTwlPXJlc3VsdCU+IiBhbGlnbj0iY2VudGVyIj48JT1yZXN1bHQlPjwvdGQ+PCUKKyAgICAgICAgICAgICAgICAgJT48dGQgYWxpZ249ImNlbnRlciI+PCU9c3RhdHVzSGVscGVyLmdldExhc3RCdWlsZFRpbWVTdHJpbmcocmVxdWVzdC5nZXRMb2NhbGUoKSklPjwvdGQ+PCUKKyAgICAgICAgICAgICAgICAgJT48dGQgYWxpZ249ImNlbnRlciI+PCU9c3RhdHVzSGVscGVyLmdldExhc3RTdWNjZXNzZnVsQnVpbGRUaW1lU3RyaW5nKHJlcXVlc3QuZ2V0TG9jYWxlKCkpJT48L3RkPjwlCisgICAgICAgICAgICAgICAgICU+PHRkPjwlPXN0YXR1c0hlbHBlci5nZXRMYXN0U3VjY2Vzc2Z1bEJ1aWxkTGFiZWwoKSU+PC90ZD4KKyAgICAgICAgICAgICAgICAgICA8L3RyPgorIDwlCisgICAgICAgICAgICAgICB9CisgICAgICAgICAlPiAgICA8L3Rib2R5PgorPCUKKyAgICAgICAgICAgfQorICAgICAgIH0KKyAgIH0KKyU+PC90YWJsZT48L3RkPjwvdHI+CisgIDx0cj48dGQgYmdjb2xvcj0iI0ZGRkZGRiI+PGltZyBib3JkZXI9IjAiIHNyYz0iaW1hZ2VzL2JsdWVzdHJpcGVzYm90dG9tLmdpZiI+PC90ZD48L3RyPgorICA8dHI+PHRkPiZuYnNwOzwvdGQ+PC90cj4KKzwvdGJvZHk+Cis8L3RhYmxlPgorPC9ib2R5PgorPC9odG1sPgorCmRpZmYgLS1naXQgYS9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvbWFpbi5qc3AgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvbWFpbi5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNkYmRkZQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9tYWluLmpzcApAQCAtMCwwICsxLDg1IEBACis8JS0tKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENydWlzZUNvbnRyb2wsIGEgQ29udGludW91cyBJbnRlZ3JhdGlvbiBUb29sa2l0CisgKiBDb3B5cmlnaHQgKGMpIDIwMDEsIFRob3VnaHRXb3JrcywgSW5jLgorICogNjUxIFcgV2FzaGluZ3RvbiBBdmUuIFN1aXRlIDYwMAorICogQ2hpY2FnbywgSUwgNjA2NjEgVVNBCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgICArIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogICAgICsgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqICAgICArIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhvdWdodFdvcmtzLCBJbmMuLCBDcnVpc2VDb250cm9sLCBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICogICAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogICAgICAgd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLS0lPgorPCVAcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sIiU+Cis8JUAgdGFnbGliIHVyaT0iL1dFQi1JTkYvY3J1aXNlY29udHJvbC1qc3AxMS50bGQiIHByZWZpeD0iY3J1aXNlY29udHJvbCIlPgorPGh0bWw+Cis8aGVhZD4KKyAgPHRpdGxlPmdyb292eTogQ3J1aXNlQ29udHJvbCBCdWlsZCBSZXN1bHRzPC90aXRsZT4KKyAgPGJhc2UgaHJlZj0iPCU9cmVxdWVzdC5nZXRTY2hlbWUoKSU+Oi8vPCU9cmVxdWVzdC5nZXRTZXJ2ZXJOYW1lKCklPjo8JT1yZXF1ZXN0LmdldFNlcnZlclBvcnQoKSU+PCU9cmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpJT4vIiAvPgorICA8bGluayB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJjc3MvY3J1aXNlY29udHJvbC5jc3MiLz4KKzwvaGVhZD4KKzxib2R5IHRvcG1hcmdpbj0iMCIgbGVmdG1hcmdpbj0iMCIgbWFyZ2luaGVpZ2h0PSIwIiBtYXJnaW53aWR0aD0iMCI+CisgIDx0YWJsZSBib3JkZXI9IjAiIGFsaWduPSJjZW50ZXIiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiPgorICAgIDx0cj48dGQgY29sc3Bhbj0iMiIgY2xhc3M9Imhvc3QiPgorICAgICAgICA8ZGl2IGNsYXNzPSJjYW5vbyI+aG9zdGVkIGJ5PGJyPjxhIGhyZWY9Imh0dHA6Ly93d3cuY2Fub28uY29tIj48aW1nIGJvcmRlcj0iMCIgaGVpZ2h0PSIyMCIgd2lkdGg9IjExMiIgc3JjPSJpbWFnZXMvY2Fub29fcmdiX3Bvcy5naWYiPjwvYT4KKyAgICAgICAgPC9kaXY+PC90ZD48L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCIgY2xhc3M9Im5hdmlnYXRpb24iPgorICAgICAgICA8JUAgaW5jbHVkZSBmaWxlPSJuYXZpZ2F0aW9uLmpzcCIgJT4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPgorICAgICAgICAmbmJzcDs8YnI+CisgICAgICAgIDxjcnVpc2Vjb250cm9sOnRhYnNoZWV0PgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0ZCBiZ2NvbG9yPSJ3aGl0ZSIgPgorICAgICAgICAgICAgICA8Y3J1aXNlY29udHJvbDp0YWIgbmFtZT0iYnVpbGRSZXN1bHRzIiBsYWJlbD0iQnVpbGQgUmVzdWx0cyIgPgorICAgICAgICAgICAgICAgIDwlQCBpbmNsdWRlIGZpbGU9ImJ1aWxkcmVzdWx0cy5qc3AiICU+CisgICAgICAgICAgICAgIDwvY3J1aXNlY29udHJvbDp0YWI+CisKKyAgICAgICAgICAgICAgPGNydWlzZWNvbnRyb2w6dGFiIG5hbWU9InRlc3RSZXN1bHRzIiBsYWJlbD0iVGVzdCBSZXN1bHRzIiA+CisgICAgICAgICAgICAgICAgPCVAIGluY2x1ZGUgZmlsZT0idGVzdGRldGFpbHMuanNwIiAlPgorICAgICAgICAgICAgICA8L2NydWlzZWNvbnRyb2w6dGFiPgorCisgICAgICAgICAgICAgIDxjcnVpc2Vjb250cm9sOnRhYiBuYW1lPSJ4bWxMb2dGaWxlIiBsYWJlbD0iWE1MIExvZyBGaWxlIiA+CisgICAgICAgICAgICAgICAgPCVAIGluY2x1ZGUgZmlsZT0ieG1sbG9nLmpzcCIgJT4KKyAgICAgICAgICAgICAgPC9jcnVpc2Vjb250cm9sOnRhYj4KKworICAgICAgICAgICAgICA8Y3J1aXNlY29udHJvbDp0YWIgbmFtZT0ibWV0cmljcyIgbGFiZWw9Ik1ldHJpY3MiID4KKyAgICAgICAgICAgICAgICA8JUAgaW5jbHVkZSBmaWxlPSJtZXRyaWNzLmpzcCIgJT4KKyAgICAgICAgICAgICAgPC9jcnVpc2Vjb250cm9sOnRhYj4KKworICAgICAgICAgICAgICA8Y3J1aXNlY29udHJvbDp0YWIgbmFtZT0iY29udHJvbFBhbmVsIiBsYWJlbD0iQ29udHJvbCBQYW5lbCIgPgorICAgICAgICAgICAgICAgIDwlQCBpbmNsdWRlIGZpbGU9ImNvbnRyb2xwYW5lbC5qc3AiICU+CisgICAgICAgICAgICAgIDwvY3J1aXNlY29udHJvbDp0YWI+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgIDwvY3J1aXNlY29udHJvbDp0YWJzaGVldD4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9tZXRyaWNzLmpzcCBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC9tZXRyaWNzLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWY1MzFmCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L2NydWlzZS9yZXBvcnRpbmctYXBwL21ldHJpY3MuanNwCkBAIC0wLDAgKzEsMzUgQEAKKzwlQHBhZ2UgaW1wb3J0PSJuZXQuc291cmNlZm9yZ2UuY3J1aXNlY29udHJvbC4qLCBuZXQuc291cmNlZm9yZ2UuY3J1aXNlY29udHJvbC5jaGFydC4qIiU+Cis8JUB0YWdsaWIgdXJpPSdXRUItSU5GL2xpYi9jZXdvbGYuamFyJyBwcmVmaXg9J2Nld29sZicgJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9jcnVpc2Vjb250cm9sLWpzcDExLnRsZCIgcHJlZml4PSJjcnVpc2Vjb250cm9sIiU+CisKKzxjcnVpc2Vjb250cm9sOmJ1aWxkSW5mbyAvPgorCis8dGFibGU+CisgIDx0cj48dGQ+TnVtYmVyIG9mIEJ1aWxkIEF0dGVtcHRzPC90ZD48dGQ+PCU9YnVpbGRfaW5mby5zaXplKCkgJT48L3RkPjwvdHI+CisgIDx0cj48dGQ+TnVtYmVyIG9mIEJyb2tlbiBCdWlsZHM8L3RkPjx0ZD48JT1idWlsZF9pbmZvLmdldE51bUJyb2tlbkJ1aWxkcygpICU+PC90ZD48L3RyPgorICA8dHI+PHRkPk51bWJlciBvZiBTdWNjZXNzZnVsIEJ1aWxkczwvdGQ+PHRkPjwlPWJ1aWxkX2luZm8uZ2V0TnVtU3VjY2Vzc2Z1bEJ1aWxkcygpICU+PC90ZD48L3RyPgorPC90YWJsZT4KKworPGhyIC8+Cis8anNwOnVzZUJlYW4gaWQ9InBpZURhdGEiIGNsYXNzPSJuZXQuc291cmNlZm9yZ2UuY3J1aXNlY29udHJvbC5jaGFydC5QaWVDaGFydERhdGEiIC8+Cis8Y2V3b2xmOmNoYXJ0IGlkPSJwaWUiIHRpdGxlPSJCcmVha2Rvd24gb2YgYnVpbGQgdHlwZXMiIHR5cGU9InBpZSIgPgorICAgIDxjZXdvbGY6ZGF0YT4KKyAgICAgICAgPGNld29sZjpwcm9kdWNlciBpZD0icGllRGF0YSI+CisgICAgICAgICAgPGNld29sZjpwYXJhbSBuYW1lPSJidWlsZEluZm8iIHZhbHVlPSI8JT1idWlsZF9pbmZvJT4iIC8+CisgICAgICAgIDwvY2V3b2xmOnByb2R1Y2VyPgorICAgIDwvY2V3b2xmOmRhdGE+Cis8L2Nld29sZjpjaGFydD4KKzxjZXdvbGY6aW1nIGNoYXJ0aWQ9InBpZSIgcmVuZGVyZXI9ImNld29sZiIgd2lkdGg9IjQwMCIgaGVpZ2h0PSIzMDAiLz4KKworPGhyIC8+Cis8anNwOnVzZUJlYW4gaWQ9ImNoYXJ0RGF0YSIgY2xhc3M9Im5ldC5zb3VyY2Vmb3JnZS5jcnVpc2Vjb250cm9sLmNoYXJ0LlRpbWVDaGFydERhdGEiIC8+Cis8Y2V3b2xmOmNoYXJ0IGlkPSJjaGFydCIgdGl0bGU9IkJyZWFrZG93biBvZiBidWlsZCB0eXBlcyIgdHlwZT0idGltZXNlcmllcyIgIHhheGlzbGFiZWw9ImRhdGUiIHlheGlzbGFiZWw9InRpbWUiPgorICAgIDxjZXdvbGY6ZGF0YT4KKyAgICAgICAgPGNld29sZjpwcm9kdWNlciBpZD0iY2hhcnREYXRhIj4KKyAgICAgICAgICA8Y2V3b2xmOnBhcmFtIG5hbWU9ImJ1aWxkSW5mbyIgdmFsdWU9IjwlPWJ1aWxkX2luZm8lPiIgLz4KKyAgICAgICAgPC9jZXdvbGY6cHJvZHVjZXI+CisgICAgPC9jZXdvbGY6ZGF0YT4KKyAgICA8Y2V3b2xmOmNoYXJ0cG9zdHByb2Nlc3NvciBpZD0iY2hhcnREYXRhIiAvPgorPC9jZXdvbGY6Y2hhcnQ+Cis8Y2V3b2xmOmltZyBjaGFydGlkPSJjaGFydCIgcmVuZGVyZXI9ImNld29sZiIgd2lkdGg9IjQwMCIgaGVpZ2h0PSIzMDAiLz4KKwpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L2NydWlzZS9yZXBvcnRpbmctYXBwL25hdmlnYXRpb24uanNwIGIvZ3Jvb3Z5L2NydWlzZS9yZXBvcnRpbmctYXBwL25hdmlnYXRpb24uanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ODE3YTEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvbmF2aWdhdGlvbi5qc3AKQEAgLTAsMCArMSw1NyBAQAorPCUtLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDcnVpc2VDb250cm9sLCBhIENvbnRpbnVvdXMgSW50ZWdyYXRpb24gVG9vbGtpdAorICogQ29weXJpZ2h0IChjKSAyMDAxLCBUaG91Z2h0V29ya3MsIEluYy4KKyAqIDY1MSBXIFdhc2hpbmd0b24gQXZlLiBTdWl0ZSA2MDAKKyAqIENoaWNhZ28sIElMIDYwNjYxIFVTQQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICAgKyBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqICAgICArIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKKyAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAgICAgKyBOZWl0aGVyIHRoZSBuYW1lIG9mIFRob3VnaHRXb3JrcywgSW5jLiwgQ3J1aXNlQ29udHJvbCwgbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAqICAgICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqICAgICAgIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi0tJT4KKzwlQCB0YWdsaWIgdXJpPSIvV0VCLUlORi9jcnVpc2Vjb250cm9sLWpzcDExLnRsZCIgcHJlZml4PSJjcnVpc2Vjb250cm9sIiU+CisgICAgICAgIAorICAgICAgICA8RElWIGNsYXNzPWxvZ28+PGgxPjxhIGhyZWY9Imh0dHA6Ly9idWlsZC5jYW5vby5jb20vZ3Jvb3Z5IiBib3JkZXI9IjAiPmdyb292eTwvYT48L2gxPjxkaXY+PHA+CisgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGFsaWduPSJjZW50ZXIiIHdpZHRoPSI5OCUiPgorICAgICAgICAgICAgPHRyPjx0ZD48Y3J1aXNlY29udHJvbDpjdXJyZW50YnVpbGRzdGF0dXMvPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQ+Jm5ic3A7PC90ZD48L3RyPgorICAgICAgICAgICAgPGNydWlzZWNvbnRyb2w6bGluayBpZD0iYmFzZVVybCIgLz4KKyAgICAgICAgICAgIDx0cj48dGQ+PGEgY2xhc3M9ImxpbmsiIGhyZWY9IjwlPWJhc2VVcmwlPiI+TGF0ZXN0IEJ1aWxkPC9hPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDxjcnVpc2Vjb250cm9sOm5hdiBzdGFydGluZ0J1aWxkTnVtYmVyPSIwIiBmaW5hbEJ1aWxkTnVtYmVyPSIxMCIgPgorICAgICAgICAgICAgICAgIDx0cj48dGQ+PGEgY2xhc3M9ImxpbmsiIGhyZWY9IjwlPSB1cmwgJT4iPjwlPSBsaW5rdGV4dCAlPjwvYT48L3RkPjwvdHI+CisgICAgICAgICAgICA8L2NydWlzZWNvbnRyb2w6bmF2PgorICAgICAgICAgICAgPHRyPjx0ZD4KKyAgICAgICAgICAgICAgPGZvcm0gbWV0aG9kPSJHRVQiIGFjdGlvbj0iPCU9YmFzZVVybCU+IiA+CisgICAgICAgICAgICAgICAgPHNlbGVjdCBuYW1lPSJsb2ciIG9uY2hhbmdlPSJmb3JtLnN1Ym1pdCgpIj4KKyAgICAgICAgICAgICAgICAgIDxjcnVpc2Vjb250cm9sOm5hdiBzdGFydGluZ0J1aWxkTnVtYmVyPSIxMCI+CisgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjwlPWxvZ2ZpbGUlPiI+PCU9IGxpbmt0ZXh0ICU+PC9vcHRpb24+CisgICAgICAgICAgICAgICAgICA8L2NydWlzZWNvbnRyb2w6bmF2PgorICAgICAgICAgICAgICAgIDwvc2VsZWN0PgorICAgICAgICAgICAgICA8L2Zvcm0+CisgICAgICAgICAgICA8L3RkPjwvdHI+CisgICAgICAgIDwvdGFibGU+CmRpZmYgLS1naXQgYS9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAvdGVzdGRldGFpbHMuanNwIGIvZ3Jvb3Z5L2NydWlzZS9yZXBvcnRpbmctYXBwL3Rlc3RkZXRhaWxzLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTY4YWY2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L2NydWlzZS9yZXBvcnRpbmctYXBwL3Rlc3RkZXRhaWxzLmpzcApAQCAtMCwwICsxLDM5IEBACis8JS0tKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENydWlzZUNvbnRyb2wsIGEgQ29udGludW91cyBJbnRlZ3JhdGlvbiBUb29sa2l0CisgKiBDb3B5cmlnaHQgKGMpIDIwMDEsIFRob3VnaHRXb3JrcywgSW5jLgorICogNjUxIFcgV2FzaGluZ3RvbiBBdmUuIFN1aXRlIDYwMAorICogQ2hpY2FnbywgSUwgNjA2NjEgVVNBCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgICArIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogICAgICsgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqICAgICArIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhvdWdodFdvcmtzLCBJbmMuLCBDcnVpc2VDb250cm9sLCBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICogICAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogICAgICAgd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLS0lPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL2NydWlzZWNvbnRyb2wtanNwMTEudGxkIiBwcmVmaXg9ImNydWlzZWNvbnRyb2wiJT4KKworPGNydWlzZWNvbnRyb2w6eHNsIHhzbEZpbGU9Ii94c2wvdGVzdGRldGFpbHMueHNsIi8+CmRpZmYgLS1naXQgYS9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAveG1sbG9nLmpzcCBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC94bWxsb2cuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNmZlOTEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAveG1sbG9nLmpzcApAQCAtMCwwICsxLDM4IEBACis8JS0tKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENydWlzZUNvbnRyb2wsIGEgQ29udGludW91cyBJbnRlZ3JhdGlvbiBUb29sa2l0CisgKiBDb3B5cmlnaHQgKGMpIDIwMDEsIFRob3VnaHRXb3JrcywgSW5jLgorICogNjUxIFcgV2FzaGluZ3RvbiBBdmUuIFN1aXRlIDYwMAorICogQ2hpY2FnbywgSUwgNjA2NjEgVVNBCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgICArIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogICAgICsgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqICAgICArIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhvdWdodFdvcmtzLCBJbmMuLCBDcnVpc2VDb250cm9sLCBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICogICAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogICAgICAgd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLS0lPgorPCVAIHRhZ2xpYiB1cmk9Ii9XRUItSU5GL2NydWlzZWNvbnRyb2wtanNwMTEudGxkIiBwcmVmaXg9ImNydWlzZWNvbnRyb2wiJT4KKzxwcmUgY2xhc3M9Im1vZGlmaWNhdGlvbnMtZGF0YSI+PGNydWlzZWNvbnRyb2w6eHNsIHhzbEZpbGU9Ii94c2wvbG9nZmlsZS54c2wiLz48L3ByZT4KZGlmZiAtLWdpdCBhL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC94c2wvYnJlYWtkb3duLnhzbCBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC94c2wvYnJlYWtkb3duLnhzbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWRhYWY0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L2NydWlzZS9yZXBvcnRpbmctYXBwL3hzbC9icmVha2Rvd24ueHNsCkBAIC0wLDAgKzEsNjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICogQ29weXJpZ2h0IChjKSAyMDA3LCBBU0VSVCBDb25zdWx0aW5nIFB0eSBMdGQKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICAgICsgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgKyBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisgKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogICAgICsgTmVpdGhlciB0aGUgbmFtZSBvZiBBU0VSVCBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICogICAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogICAgICAgd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICotLT4KKzx4c2w6c3R5bGVzaGVldAorICAgIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB2ZXJzaW9uPSIxLjAiCisgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9zdHJpY3QuZHRkIj4KKworICAgIDx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIvPgorCisgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJsb25ndGFza3MiIHNlbGVjdD0iL2NydWlzZWNvbnRyb2wvYnVpbGQvL3RhcmdldFtjb250YWlucyhAdGltZSwnbWludXRlJykgb3IgbnVtYmVyKHN1YnN0cmluZy1iZWZvcmUoQHRpbWUsJyAnKSkgPiAzMF0iLz4KKworICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPgorICAgICAgICA8dGFibGUgYWxpZ249ImNlbnRlciIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiIHdpZHRoPSI5OCUiPgorICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iYnJlYWtkb3duLXNlY3Rpb25oZWFkZXIiPgorICAgICAgICAgICAgICAgICAgICAmIzE2MDtUYXJnZXQgVGltZSBCcmVha2Rvd24KKyAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImJyZWFrZG93bi1kYXRhIj4KKyAgICAgICAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkbG9uZ3Rhc2tzIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBzdHlsZT0icGFkZGluZy1sZWZ0Ontjb3VudChhbmNlc3Rvcjo6dGFyZ2V0KSoyMH1weDsiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb25jYXQoQG5hbWUsICcgKCcsIEB0aW1lLCAnKScpIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgorICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KKyAgICAgICAgICAgICAgICA8L3VsPgorICAgICAgICAgICAgPC90ZD48L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgIDwveHNsOnRlbXBsYXRlPgorCis8L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L2NydWlzZS9yZXBvcnRpbmctYXBwL3hzbC9jaGFuZ2VsaXN0cy9oZWFkZXIueHNsIGIvZ3Jvb3Z5L2NydWlzZS9yZXBvcnRpbmctYXBwL3hzbC9jaGFuZ2VsaXN0cy9oZWFkZXIueHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmYjYxYjUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAveHNsL2NoYW5nZWxpc3RzL2hlYWRlci54c2wKQEAgLTAsMCArMSw4NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENydWlzZUNvbnRyb2wsIGEgQ29udGludW91cyBJbnRlZ3JhdGlvbiBUb29sa2l0CisgKiBDb3B5cmlnaHQgKGMpIDIwMDEsIFRob3VnaHRXb3JrcywgSW5jLgorICogNjUxIFcgV2FzaGluZ3RvbiBBdmUuIFN1aXRlIDYwMAorICogQ2hpY2FnbywgSUwgNjA2NjEgVVNBCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgICArIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogICAgICsgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqICAgICArIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhvdWdodFdvcmtzLCBJbmMuLCBDcnVpc2VDb250cm9sLCBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICogICAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogICAgICAgd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLS0+Cis8eHNsOnN0eWxlc2hlZXQKKyAgICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIgorICAgIHhtbG5zOmx4c2x0PSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdCI+CisKKyAgICA8eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiLz4KKworICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPgorICAgICAgICA8dGFibGUgYWxpZ249ImNlbnRlciIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiIHdpZHRoPSI5OCUiPgorCisgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImNydWlzZWNvbnRyb2wvYnVpbGQvQGVycm9yIj4KKyAgICAgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJoZWFkZXItdGl0bGUiPkJVSUxEIEZBSUxFRDwvdGQ+PC90cj4KKyAgICAgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJoZWFkZXItZGF0YSI+CisgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJoZWFkZXItbGFiZWwiPkVycm9yIE1lc3NhZ2U6JiMxNjA7PC9zcGFuPgorICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY3J1aXNlY29udHJvbC9idWlsZC9AZXJyb3IiLz4KKyAgICAgICAgICAgICAgICA8L3RkPjwvdHI+CisgICAgICAgICAgICA8L3hzbDppZj4KKworICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QgKGNydWlzZWNvbnRyb2wvYnVpbGQvQGVycm9yKSI+CisgICAgICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iaGVhZGVyLXRpdGxlIj5CVUlMRCBDT01QTEVURSYjMTYwOy0mIzE2MDsKKyAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNydWlzZWNvbnRyb2wvaW5mby9wcm9wZXJ0eVtAbmFtZT0nbGFiZWwnXS9AdmFsdWUiLz4KKyAgICAgICAgICAgICAgICA8L3RkPjwvdHI+CisgICAgICAgICAgICA8L3hzbDppZj4KKworICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iaGVhZGVyLWRhdGEiPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJoZWFkZXItbGFiZWwiPkRhdGUgb2YgYnVpbGQ6JiMxNjA7PC9zcGFuPgorICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjcnVpc2Vjb250cm9sL2luZm8vcHJvcGVydHlbQG5hbWU9J2xhc3RidWlsZCddL0B2YWx1ZSIvPgorICAgICAgICAgICAgPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iaGVhZGVyLWRhdGEiPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJoZWFkZXItbGFiZWwiPlRpbWUgdG8gYnVpbGQ6JiMxNjA7PC9zcGFuPgorICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjcnVpc2Vjb250cm9sL2J1aWxkL0B0aW1lIi8+CisgICAgICAgICAgICA8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJoZWFkZXItZGF0YSI+CisgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJoZWFkZXItbGFiZWwiPkxhc3QgY2hhbmdlZDomIzE2MDs8L3NwYW4+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjcnVpc2Vjb250cm9sL21vZGlmaWNhdGlvbnMvY2hhbmdlbGlzdC9AZGF0ZU9mU3VibWlzc2lvbiIvPgorICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iaGVhZGVyLWRhdGEiPgorICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaGVhZGVyLWxhYmVsIj5MYXN0IGxvZyBlbnRyeTomIzE2MDs8L3NwYW4+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjcnVpc2Vjb250cm9sL21vZGlmaWNhdGlvbnMvY2hhbmdlbGlzdC9kZXNjcmlwdGlvbiIvPgorICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgIDwveHNsOnRlbXBsYXRlPgorCis8L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L2NydWlzZS9yZXBvcnRpbmctYXBwL3hzbC9jaGVja3N0eWxlLnhzbCBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC94c2wvY2hlY2tzdHlsZS54c2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBkYWM0YgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC94c2wvY2hlY2tzdHlsZS54c2wKQEAgLTAsMCArMSw2OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENydWlzZUNvbnRyb2wsIGEgQ29udGludW91cyBJbnRlZ3JhdGlvbiBUb29sa2l0CisgKiBDb3B5cmlnaHQgKGMpIDIwMDEsIFRob3VnaHRXb3JrcywgSW5jLgorICogNjUxIFcgV2FzaGluZ3RvbiBBdmUuIFN1aXRlIDYwMAorICogQ2hpY2FnbywgSUwgNjA2NjEgVVNBCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgICArIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogICAgICsgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqICAgICArIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhvdWdodFdvcmtzLCBJbmMuLCBDcnVpc2VDb250cm9sLCBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICogICAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogICAgICAgd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLS0+Cis8eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHZlcnNpb249IjEuMCI+CisgICAgPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIi8+CisKKyAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KKyAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJjcnVpc2Vjb250cm9sL2NoZWNrc3R5bGUiLz4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImNoZWNrc3R5bGVbZmlsZS9lcnJvcl0iPgorICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImZpbGUuZXJyb3IuY291bnQiIHNlbGVjdD0iY291bnQoZmlsZVtlcnJvcl0pIiAvPgorICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InRvdGFsLmVycm9yLmNvdW50IiBzZWxlY3Q9ImNvdW50KGZpbGUvZXJyb3IpIiAvPgorICAgICAgICA8dGFibGUgYWxpZ249ImNlbnRlciIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiIHdpZHRoPSI5OCUiPgorICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0ZCBjbGFzcz0iY2hlY2tzdHlsZS1zZWN0aW9uaGVhZGVyIiBjb2xzcGFuPSIzIj4KKyAgICAgICAgICAgICAgICBDaGVja3N0eWxlIGVycm9ycyAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0b3RhbC5lcnJvci5jb3VudCIgLz4pCisgICAgICAgICAgICA8L3RkPgorICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImZpbGUvZXJyb3IiID4KKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpIG1vZCAyID0gMSI+CisgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPmNoZWNrc3R5bGUtb2Rkcm93PC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjaGVja3N0eWxlLWRhdGEiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuLi9AbmFtZSIgLz48L3RkPgorICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNoZWNrc3R5bGUtZGF0YSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsaW5lIiAvPjwvdGQ+CisgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY2hlY2tzdHlsZS1kYXRhIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG1lc3NhZ2UiIC8+PC90ZD4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+CisgICAgICAgIDwvdGFibGU+CisgICAgPC94c2w6dGVtcGxhdGU+CisKKzwhLS0gICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iKnxAKnx0ZXh0KCkiIC8+LS0+Cis8L3hzbDpzdHlsZXNoZWV0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC94c2wvY29tcGlsZS54c2wgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAveHNsL2NvbXBpbGUueHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MDJhMGUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAveHNsL2NvbXBpbGUueHNsCkBAIC0wLDAgKzEsMTE5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ3J1aXNlQ29udHJvbCwgYSBDb250aW51b3VzIEludGVncmF0aW9uIFRvb2xraXQKKyAqIENvcHlyaWdodCAoYykgMjAwMSwgVGhvdWdodFdvcmtzLCBJbmMuCisgKiA2NTEgVyBXYXNoaW5ndG9uIEF2ZS4gU3VpdGUgNjAwCisgKiBDaGljYWdvLCBJTCA2MDY2MSBVU0EKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICAgICsgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgKyBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisgKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogICAgICsgTmVpdGhlciB0aGUgbmFtZSBvZiBUaG91Z2h0V29ya3MsIEluYy4sIENydWlzZUNvbnRyb2wsIG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgKiAgICAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiAgICAgICB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiotLT4KKzx4c2w6c3R5bGVzaGVldAorICAgIHZlcnNpb249IjEuMCIKKyAgICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKKyAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvc3RyaWN0LmR0ZCIgPgorCisgICAgPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIi8+CisKKyAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InRhc2tsaXN0IiBzZWxlY3Q9Ii9jcnVpc2Vjb250cm9sL2J1aWxkLy90YXJnZXQvdGFzayIvPgorICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iamF2YWMudGFza2xpc3QiIHNlbGVjdD0iJHRhc2tsaXN0W0BuYW1lPSdKYXZhYyddIHwgJHRhc2tsaXN0W0BuYW1lPSdqYXZhYyddIHwgJHRhc2tsaXN0W0BuYW1lPSdjb21waWxld2l0aHdhbGxzJ10iLz4KKyAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImVqYmphci50YXNrbGlzdCIgc2VsZWN0PSIkdGFza2xpc3RbQG5hbWU9J0VqYkphciddIHwgJHRhc2tsaXN0W0BuYW1lPSdlamJqYXInXSIvPgorCisgICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+CisKKyAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJqYXZhYy5lcnJvci5tZXNzYWdlcyIgc2VsZWN0PSIkamF2YWMudGFza2xpc3QvbWVzc2FnZVtAcHJpb3JpdHk9J2Vycm9yJ11bdGV4dCgpICE9ICcnXSIvPgorICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImphdmFjLndhcm4ubWVzc2FnZXMiIHNlbGVjdD0iJGphdmFjLnRhc2tsaXN0L21lc3NhZ2VbQHByaW9yaXR5PSd3YXJuJ11bdGV4dCgpICE9ICcnXSIvPgorICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImVqYmphci5lcnJvci5tZXNzYWdlcyIgc2VsZWN0PSIkZWpiamFyLnRhc2tsaXN0L21lc3NhZ2VbQHByaW9yaXR5PSdlcnJvciddW3RleHQoKSAhPSAnJ10iLz4KKyAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJlamJqYXIud2Fybi5tZXNzYWdlcyIgc2VsZWN0PSIkZWpiamFyLnRhc2tsaXN0L21lc3NhZ2VbQHByaW9yaXR5PSd3YXJuJ11bdGV4dCgpICE9ICcnXSIvPgorICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InRvdGFsLmVycm9yTWVzc2FnZS5jb3VudCIgc2VsZWN0PSJjb3VudCgkamF2YWMud2Fybi5tZXNzYWdlcykgKyBjb3VudCgkZWpiamFyLndhcm4ubWVzc2FnZXMpICsgY291bnQoJGphdmFjLmVycm9yLm1lc3NhZ2VzKSArIGNvdW50KCRlamJqYXIuZXJyb3IubWVzc2FnZXMpIi8+CisKKyAgICAgICAgPHhzbDppZiB0ZXN0PSIkdG90YWwuZXJyb3JNZXNzYWdlLmNvdW50ID4gMCI+CisgICAgICAgICAgICA8dGFibGUgYWxpZ249ImNlbnRlciIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiIHdpZHRoPSI5OCUiPgorICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgPCEtLSBOT1RFOiB0b3RhbC5lcnJvck1lc3NhZ2UuY291bnQgaXMgYWN0dWFsbHkgdGhlIG51bWJlciBvZiBsaW5lcyBvZiBlcnJvcgorICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXMuIFRoaXMgYWNjdXJhdGVseSByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YgZXJyb3JzIE9OTFkgaWYgdGhlIEFudCBwcm9wZXJ0eQorICAgICAgICAgICAgICAgICAgICAgYnVpbGQuY29tcGlsZXIuZW1hY3MgaXMgc2V0IHRvICJ0cnVlIiAtLT4KKyAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb21waWxlLXNlY3Rpb25oZWFkZXIiPgorICAgICAgICAgICAgICAgICAgICAgICAgJiMxNjA7RXJyb3JzL1dhcm5pbmdzOiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0b3RhbC5lcnJvck1lc3NhZ2UuY291bnQiLz4pCisgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KCRqYXZhYy5lcnJvci5tZXNzYWdlcykgPiAwIj4KKyAgICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByZSBjbGFzcz0iY29tcGlsZS1lcnJvci1kYXRhIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IiRqYXZhYy5lcnJvci5tZXNzYWdlcyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmU+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iY291bnQoJGphdmFjLndhcm4ubWVzc2FnZXMpID4gMCI+CisgICAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcmUgY2xhc3M9ImNvbXBpbGUtZGF0YSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIkamF2YWMud2Fybi5tZXNzYWdlcyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmU+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iY291bnQoJGVqYmphci5lcnJvci5tZXNzYWdlcykgPiAwIj4KKyAgICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByZSBjbGFzcz0iY29tcGlsZS1lcnJvci1kYXRhIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IiRlamJqYXIuZXJyb3IubWVzc2FnZXMiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJlPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KCRlamJqYXIud2Fybi5tZXNzYWdlcykgPiAwIj4KKyAgICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByZSBjbGFzcz0iY29tcGlsZS13YXJuLWRhdGEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iJGVqYmphci53YXJuLm1lc3NhZ2VzIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3ByZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgPC94c2w6aWY+CisgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICA8L3hzbDppZj4KKworICAgIDwveHNsOnRlbXBsYXRlPgorCisgICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibWVzc2FnZVtAcHJpb3JpdHk9J2Vycm9yJ10iPgorICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIi8+CisgICAgICAgIDx4c2w6aWYgdGVzdD0iY291bnQoLi8uLi9tZXNzYWdlW0Bwcmlvcml0eT0nZXJyb3InXSkgIT0gcG9zaXRpb24oKSI+CisgICAgICAgICAgICA8YnIgY2xhc3M9Im5vbmUiLz4KKyAgICAgICAgPC94c2w6aWY+CisgICAgPC94c2w6dGVtcGxhdGU+CisKKyAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJtZXNzYWdlW0Bwcmlvcml0eT0nd2FybiddIj4KKyAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIvPjxiciBjbGFzcz0ibm9uZSIvPgorICAgIDwveHNsOnRlbXBsYXRlPgorCis8L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L2NydWlzZS9yZXBvcnRpbmctYXBwL3hzbC9kaXN0cmlidXRhYmxlcy54c2wgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAveHNsL2Rpc3RyaWJ1dGFibGVzLnhzbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmM5OThjCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L2NydWlzZS9yZXBvcnRpbmctYXBwL3hzbC9kaXN0cmlidXRhYmxlcy54c2wKQEAgLTAsMCArMSw4MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENydWlzZUNvbnRyb2wsIGEgQ29udGludW91cyBJbnRlZ3JhdGlvbiBUb29sa2l0CisgKiBDb3B5cmlnaHQgKGMpIDIwMDEsIFRob3VnaHRXb3JrcywgSW5jLgorICogNjUxIFcgV2FzaGluZ3RvbiBBdmUuIFN1aXRlIDYwMAorICogQ2hpY2FnbywgSUwgNjA2NjEgVVNBCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgICArIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogICAgICsgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqICAgICArIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhvdWdodFdvcmtzLCBJbmMuLCBDcnVpc2VDb250cm9sLCBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICogICAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogICAgICAgd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLS0+CisKKzx4c2w6c3R5bGVzaGVldAorICAgIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB2ZXJzaW9uPSIxLjAiCisgICAgeG1sbnM6bHhzbHQ9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0Ij4KKworICAgIDx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIvPgorICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idGFza2xpc3QiIHNlbGVjdD0iL2NydWlzZWNvbnRyb2wvYnVpbGQvL3RhcmdldC90YXNrIi8+CisgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJqYXIudGFza2xpc3QiIHNlbGVjdD0iJHRhc2tsaXN0W0BuYW1lPSdKYXInXS9tZXNzYWdlW0Bwcmlvcml0eT0naW5mbyddIHwgJHRhc2tsaXN0W0BuYW1lPSdqYXInXS9tZXNzYWdlW0Bwcmlvcml0eT0naW5mbyddIHwgJHRhc2tsaXN0W0BuYW1lPSd6aXAnXS9tZXNzYWdlW0Bwcmlvcml0eT0naW5mbyddIHwgJHRhc2tsaXN0W0BuYW1lPSdqYXJqYXInXS9tZXNzYWdlW0Bwcmlvcml0eT0naW5mbyddIi8+CisgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ3YXIudGFza2xpc3QiIHNlbGVjdD0iJHRhc2tsaXN0W0BuYW1lPSdXYXInXS9tZXNzYWdlW0Bwcmlvcml0eT0naW5mbyddIHwgJHRhc2tsaXN0W0BuYW1lPSd3YXInXS9tZXNzYWdlW0Bwcmlvcml0eT0naW5mbyddIi8+CisgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJlamJqYXIudGFza2xpc3QiIHNlbGVjdD0iJHRhc2tsaXN0W0BuYW1lPSdlamJqYXInXS9tZXNzYWdlW0Bwcmlvcml0eT0naW5mbyddIi8+CisgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJlYXIudGFza2xpc3QiIHNlbGVjdD0iJHRhc2tsaXN0W0BuYW1lPSdlYXInXS9tZXNzYWdlW0Bwcmlvcml0eT0naW5mbyddIi8+CisgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJkaXN0LmNvdW50IiBzZWxlY3Q9ImNvdW50KCRqYXIudGFza2xpc3QpICsgY291bnQoJHdhci50YXNrbGlzdCkgKyBjb3VudCgkZWpiamFyLnRhc2tsaXN0KSArIGNvdW50KCRlYXIudGFza2xpc3QpIi8+CisKKyAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KKyAgICAgICAgPHRhYmxlIGFsaWduPSJjZW50ZXIiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIiB3aWR0aD0iOTglIj4KKworICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkZGlzdC5jb3VudCA+IDAiPgorICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJkaXN0cmlidXRhYmxlcy1zZWN0aW9uaGVhZGVyIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICYjMTYwO0RlcGxveW1lbnRzIGJ5IHRoaXMgYnVpbGQ6JiMxNjA7KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZGlzdC5jb3VudCIvPikKKyAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iJGphci50YXNrbGlzdCB8ICR3YXIudGFza2xpc3QgfCAkZWpiamFyLnRhc2tsaXN0IHwgJGVhci50YXNrbGlzdCIgLz4KKyAgICAgICAgICAgIDwveHNsOmlmPgorCisgICAgICAgIDwvdGFibGU+CisgICAgPC94c2w6dGVtcGxhdGU+CisKKyAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0YXNrW0BuYW1lPSdKYXInXS9tZXNzYWdlW0Bwcmlvcml0eT0naW5mbyddIHwgdGFza1tAbmFtZT0nV2FyJ10vbWVzc2FnZVtAcHJpb3JpdHk9J2luZm8nXSB8IHRhc2tbQG5hbWU9J2phciddL21lc3NhZ2VbQHByaW9yaXR5PSdpbmZvJ10gfCB0YXNrW0BuYW1lPSd6aXAnXS9tZXNzYWdlW0Bwcmlvcml0eT0naW5mbyddIHwgdGFza1tAbmFtZT0namFyamFyJ10vbWVzc2FnZVtAcHJpb3JpdHk9J2luZm8nXSB8IHRhc2tbQG5hbWU9J3dhciddL21lc3NhZ2VbQHByaW9yaXR5PSdpbmZvJ10gfCB0YXNrW0BuYW1lPSdlamJqYXInXS9tZXNzYWdlW0Bwcmlvcml0eT0naW5mbyddIHwgdGFza1tAbmFtZT0nZWFyJ10vbWVzc2FnZVtAcHJpb3JpdHk9J2luZm8nXSI+CisgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSBtb2QgMiA9IDAiPgorICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj5kaXN0cmlidXRhYmxlcy1ldmVucm93PC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgPC94c2w6aWY+CisgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkgbW9kIDIgIT0gMCI+CisgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPmRpc3RyaWJ1dGFibGVzLW9kZHJvdzwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICAgICAgPHRkIGNsYXNzPSJkaXN0cmlidXRhYmxlcy1kYXRhIj4KKyAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIi8+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICA8L3RyPgorICAgIDwveHNsOnRlbXBsYXRlPgorCis8L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L2NydWlzZS9yZXBvcnRpbmctYXBwL3hzbC9oZWFkZXIueHNsIGIvZ3Jvb3Z5L2NydWlzZS9yZXBvcnRpbmctYXBwL3hzbC9oZWFkZXIueHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NWEwYjgKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAveHNsL2hlYWRlci54c2wKQEAgLTAsMCArMSw5MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENydWlzZUNvbnRyb2wsIGEgQ29udGludW91cyBJbnRlZ3JhdGlvbiBUb29sa2l0CisgKiBDb3B5cmlnaHQgKGMpIDIwMDEsIFRob3VnaHRXb3JrcywgSW5jLgorICogNjUxIFcgV2FzaGluZ3RvbiBBdmUuIFN1aXRlIDYwMAorICogQ2hpY2FnbywgSUwgNjA2NjEgVVNBCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgICArIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogICAgICsgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqICAgICArIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhvdWdodFdvcmtzLCBJbmMuLCBDcnVpc2VDb250cm9sLCBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICogICAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogICAgICAgd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLS0+Cis8eHNsOnN0eWxlc2hlZXQKKyAgICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIgorICAgIHhtbG5zOmx4c2x0PSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdCI+CisKKyAgICA8eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiLz4KKworICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPgorICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im1vZGlmaWNhdGlvbi5saXN0IiBzZWxlY3Q9ImNydWlzZWNvbnRyb2wvbW9kaWZpY2F0aW9ucy9tb2RpZmljYXRpb24iLz4KKworICAgICAgICA8dGFibGUgYWxpZ249ImNlbnRlciIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiIHdpZHRoPSI5OCUiPgorCisgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImNydWlzZWNvbnRyb2wvYnVpbGQvQGVycm9yIj4KKyAgICAgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJoZWFkZXItdGl0bGUiPkJVSUxEIEZBSUxFRDwvdGQ+PC90cj4KKyAgICAgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJoZWFkZXItZGF0YSI+CisgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJoZWFkZXItbGFiZWwiPkFudCBFcnJvciBNZXNzYWdlOiYjMTYwOzwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNydWlzZWNvbnRyb2wvYnVpbGQvQGVycm9yIi8+CisgICAgICAgICAgICAgICAgPC90ZD48L3RyPgorICAgICAgICAgICAgPC94c2w6aWY+CisKKyAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90IChjcnVpc2Vjb250cm9sL2J1aWxkL0BlcnJvcikiPgorICAgICAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImhlYWRlci10aXRsZSI+QlVJTEQgQ09NUExFVEUmIzE2MDstJiMxNjA7CisgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjcnVpc2Vjb250cm9sL2luZm8vcHJvcGVydHlbQG5hbWU9J2xhYmVsJ10vQHZhbHVlIi8+CisgICAgICAgICAgICAgICAgPC90ZD48L3RyPgorICAgICAgICAgICAgPC94c2w6aWY+CisKKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImhlYWRlci1kYXRhIj4KKyAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaGVhZGVyLWxhYmVsIj5EYXRlIG9mIGJ1aWxkOiYjMTYwOzwvc3Bhbj4KKyAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY3J1aXNlY29udHJvbC9pbmZvL3Byb3BlcnR5W0BuYW1lPSdidWlsZGRhdGUnXS9AdmFsdWUiLz4KKyAgICAgICAgICAgIDwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImhlYWRlci1kYXRhIj4KKyAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaGVhZGVyLWxhYmVsIj5UaW1lIHRvIGJ1aWxkOiYjMTYwOzwvc3Bhbj4KKyAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY3J1aXNlY29udHJvbC9idWlsZC9AdGltZSIvPgorICAgICAgICAgICAgPC90ZD48L3RyPgorICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIkbW9kaWZpY2F0aW9uLmxpc3QiPgorICAgICAgICAgICAgICAgIDx4c2w6c29ydCBzZWxlY3Q9ImRhdGUiIG9yZGVyPSJkZXNjZW5kaW5nIiBkYXRhLXR5cGU9InRleHQiIC8+CisgICAgICAgICAgICA8L3hzbDphcHBseS10ZW1wbGF0ZXM+CisgICAgICAgIDwvdGFibGU+CisgICAgPC94c2w6dGVtcGxhdGU+CisKKyAgICA8IS0tIExhc3QgTW9kaWZpY2F0aW9uIHRlbXBsYXRlIC0tPgorICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Im1vZGlmaWNhdGlvbiI+CisgICAgICAgIDx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSA9IDEiPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iaGVhZGVyLWRhdGEiPgorICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJoZWFkZXItbGFiZWwiPkxhc3QgY2hhbmdlZDomIzE2MDs8L3NwYW4+CisgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImRhdGUiLz4KKyAgICAgICAgICAgIDwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImhlYWRlci1kYXRhIj4KKyAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaGVhZGVyLWxhYmVsIj5MYXN0IGxvZyBlbnRyeTomIzE2MDs8L3NwYW4+CisgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvbW1lbnQiLz4KKyAgICAgICAgICAgIDwvdGQ+PC90cj4KKyAgICAgICAgPC94c2w6aWY+CisgICAgPC94c2w6dGVtcGxhdGU+Cis8L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L2NydWlzZS9yZXBvcnRpbmctYXBwL3hzbC9qYXZhZG9jLnhzbCBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC94c2wvamF2YWRvYy54c2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEwNGFmOQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC94c2wvamF2YWRvYy54c2wKQEAgLTAsMCArMSw5OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENydWlzZUNvbnRyb2wsIGEgQ29udGludW91cyBJbnRlZ3JhdGlvbiBUb29sa2l0CisgKiBDb3B5cmlnaHQgKGMpIDIwMDEsIFRob3VnaHRXb3JrcywgSW5jLgorICogNjUxIFcgV2FzaGluZ3RvbiBBdmUuIFN1aXRlIDYwMAorICogQ2hpY2FnbywgSUwgNjA2NjEgVVNBCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgICArIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogICAgICsgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqICAgICArIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhvdWdodFdvcmtzLCBJbmMuLCBDcnVpc2VDb250cm9sLCBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICogICAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogICAgICAgd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLS0+Cis8eHNsOnN0eWxlc2hlZXQKKyAgICB2ZXJzaW9uPSIxLjAiCisgICAgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCisgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L3N0cmljdC5kdGQiID4KKworICAgIDx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIvPgorCisgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ0YXNrbGlzdCIgc2VsZWN0PSIvY3J1aXNlY29udHJvbC9idWlsZC8vdGFyZ2V0L3Rhc2siLz4KKyAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImphdmFkb2MudGFza2xpc3QiIHNlbGVjdD0iJHRhc2tsaXN0W0BuYW1lPSdKYXZhZG9jJ10gfCAkdGFza2xpc3RbQG5hbWU9J2phdmFkb2MnXSIvPgorCisgICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+CisKKyAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJqYXZhZG9jLmVycm9yLm1lc3NhZ2VzIiBzZWxlY3Q9IiRqYXZhZG9jLnRhc2tsaXN0L21lc3NhZ2VbQHByaW9yaXR5PSdlcnJvciddIi8+CisgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iamF2YWRvYy53YXJuLm1lc3NhZ2VzIiBzZWxlY3Q9IiRqYXZhZG9jLnRhc2tsaXN0L21lc3NhZ2VbQHByaW9yaXR5PSd3YXJuJ11bbm90KGNvbnRhaW5zKHRleHQoKSwgJ1RoZSBmaXJzdCBzZW50ZW5jZSBpcyBpbnRlcnByZXRlZCB0byBiZTonKSldIi8+CisgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idG90YWwuZXJyb3JNZXNzYWdlLmNvdW50IiBzZWxlY3Q9ImNvdW50KCRqYXZhZG9jLndhcm4ubWVzc2FnZXMpICArIGNvdW50KCRqYXZhZG9jLmVycm9yLm1lc3NhZ2VzKSIvPgorCisgICAgICAgIDx4c2w6aWYgdGVzdD0iJHRvdGFsLmVycm9yTWVzc2FnZS5jb3VudCA+IDAiPgorICAgICAgICAgICAgPHRhYmxlIGFsaWduPSJjZW50ZXIiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIiB3aWR0aD0iOTglIj4KKyAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgIDwhLS0gTk9URTogdG90YWwuZXJyb3JNZXNzYWdlLmNvdW50IGlzIGFjdHVhbGx5IHRoZSBudW1iZXIgb2YgbGluZXMgb2YgZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzLiBUaGlzIGFjY3VyYXRlbHkgcmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mIGVycm9ycyBPTkxZIGlmIHRoZSBBbnQgcHJvcGVydHkKKyAgICAgICAgICAgICAgICAgICAgIGJ1aWxkLmNvbXBpbGVyLmVtYWNzIGlzIHNldCB0byAidHJ1ZSIgLS0+CisgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29tcGlsZS1zZWN0aW9uaGVhZGVyIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICYjMTYwO0phdmFkb2MgRXJyb3JzL1dhcm5pbmdzOiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0b3RhbC5lcnJvck1lc3NhZ2UuY291bnQiLz4pCisgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KCRqYXZhZG9jLmVycm9yLm1lc3NhZ2VzKSA+IDAiPgorICAgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJlIGNsYXNzPSJjb21waWxlLWVycm9yLWRhdGEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iJGphdmFkb2MuZXJyb3IubWVzc2FnZXMiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJlPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KCRqYXZhZG9jLndhcm4ubWVzc2FnZXMpID4gMCI+CisgICAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcmUgY2xhc3M9ImNvbXBpbGUtZGF0YSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIkamF2YWRvYy53YXJuLm1lc3NhZ2VzIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3ByZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgPC94c2w6aWY+CisgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICA8L3hzbDppZj4KKworICAgIDwveHNsOnRlbXBsYXRlPgorCisgICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibWVzc2FnZVtAcHJpb3JpdHk9J2Vycm9yJ10iPgorICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIi8+CisgICAgICAgIDx4c2w6aWYgdGVzdD0iY291bnQoLi8uLi9tZXNzYWdlW0Bwcmlvcml0eT0nZXJyb3InXSkgIT0gcG9zaXRpb24oKSI+CisgICAgICAgICAgICA8YnIvPgorICAgICAgICA8L3hzbDppZj4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Im1lc3NhZ2VbQHByaW9yaXR5PSd3YXJuJ10iPgorICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIi8+PGJyLz4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC94c2wvbG9nZmlsZS54c2wgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAveHNsL2xvZ2ZpbGUueHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NzcwOGIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAveHNsL2xvZ2ZpbGUueHNsCkBAIC0wLDAgKzEsMzEzIEBACis8IS0tKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENydWlzZUNvbnRyb2wsIGEgQ29udGludW91cyBJbnRlZ3JhdGlvbiBUb29sa2l0CisgKiBDb3B5cmlnaHQgKGMpIDIwMDEsIFRob3VnaHRXb3JrcywgSW5jLgorICogNjUxIFcgV2FzaGluZ3RvbiBBdmUuIFN1aXRlIDYwMAorICogQ2hpY2FnbywgSUwgNjA2NjEgVVNBCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgICArIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogICAgICsgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqICAgICArIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhvdWdodFdvcmtzLCBJbmMuLCBDcnVpc2VDb250cm9sLCBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICogICAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogICAgICAgd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLS0+Cis8eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgorICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSI+CisKKyAgPHhzbDpvdXRwdXQgb21pdC14bWwtZGVjbGFyYXRpb249InllcyIgbWV0aG9kPSJodG1sIi8+CisKKyAgPHhzbDpwYXJhbSBuYW1lPSJ1c2UtZW1wdHktc3ludGF4IiBzZWxlY3Q9InRydWUoKSIvPgorICA8eHNsOnBhcmFtIG5hbWU9ImV4Y2x1ZGUtdW51c2VkLXByZWZpeGVzIiBzZWxlY3Q9InRydWUoKSIvPgorCisgIDx4c2w6cGFyYW0gbmFtZT0ic3RhcnQtdGFnLXN0YXJ0IiAgICAgc2VsZWN0PSInJmx0OyciLz4KKyAgPHhzbDpwYXJhbSBuYW1lPSJzdGFydC10YWctZW5kIiAgICAgICBzZWxlY3Q9Iic+JyIvPgorICA8eHNsOnBhcmFtIG5hbWU9ImVtcHR5LXRhZy1lbmQiICAgICAgIHNlbGVjdD0iJy8+JyIvPgorICA8eHNsOnBhcmFtIG5hbWU9ImVuZC10YWctc3RhcnQiICAgICAgIHNlbGVjdD0iJyZsdDsvJyIvPgorICA8eHNsOnBhcmFtIG5hbWU9ImVuZC10YWctZW5kIiAgICAgICAgIHNlbGVjdD0iJz4nIi8+CisgIDx4c2w6cGFyYW0gbmFtZT0ic3BhY2UiICAgICAgICAgICAgICAgc2VsZWN0PSInICciLz4KKyAgPHhzbDpwYXJhbSBuYW1lPSJucy1kZWNsIiAgICAgICAgICAgICBzZWxlY3Q9Iid4bWxucyciLz4KKyAgPHhzbDpwYXJhbSBuYW1lPSJjb2xvbiIgICAgICAgICAgICAgICBzZWxlY3Q9Iic6JyIvPgorICA8eHNsOnBhcmFtIG5hbWU9ImVxdWFscyIgICAgICAgICAgICAgIHNlbGVjdD0iJz0nIi8+CisgIDx4c2w6cGFyYW0gbmFtZT0iYXR0cmlidXRlLWRlbGltaXRlciIgc2VsZWN0PSInJnF1b3Q7JyIvPgorICA8eHNsOnBhcmFtIG5hbWU9ImNvbW1lbnQtc3RhcnQiICAgICAgIHNlbGVjdD0iJyZsdDshLS0nIi8+CisgIDx4c2w6cGFyYW0gbmFtZT0iY29tbWVudC1lbmQiICAgICAgICAgc2VsZWN0PSInLS0+JyIvPgorICA8eHNsOnBhcmFtIG5hbWU9InBpLXN0YXJ0IiAgICAgICAgICAgIHNlbGVjdD0iJyZsdDs/JyIvPgorICA8eHNsOnBhcmFtIG5hbWU9InBpLWVuZCIgICAgICAgICAgICAgIHNlbGVjdD0iJz8+JyIvPgorCisgIDx4c2w6dGVtcGxhdGUgbmFtZT0ieG1sLXRvLXN0cmluZyI+CisgICAgPHhzbDpwYXJhbSBuYW1lPSJub2RlLXNldCIgc2VsZWN0PSIuIi8+CisgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIkbm9kZS1zZXQiIG1vZGU9InhtbC10by1zdHJpbmciPgorICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlcHRoIiBzZWxlY3Q9IjEiLz4KKyAgICA8L3hzbDphcHBseS10ZW1wbGF0ZXM+CisgIDwveHNsOnRlbXBsYXRlPgorCisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iIG5hbWU9InhtbC10by1zdHJpbmctcm9vdC1ydWxlIj4KKyAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ieG1sLXRvLXN0cmluZyIvPgorICA8L3hzbDp0ZW1wbGF0ZT4KKworICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvIiBtb2RlPSJ4bWwtdG8tc3RyaW5nIj4KKyAgICA8eHNsOnBhcmFtIG5hbWU9ImRlcHRoIi8+CisgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgbW9kZT0ieG1sLXRvLXN0cmluZyI+CisgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVwdGgiIHNlbGVjdD0iJGRlcHRoIi8+CisgICAgPC94c2w6YXBwbHktdGVtcGxhdGVzPgorICA8L3hzbDp0ZW1wbGF0ZT4KKworICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIqIiBtb2RlPSJ4bWwtdG8tc3RyaW5nIj4KKyAgICA8eHNsOnBhcmFtIG5hbWU9ImRlcHRoIi8+CisgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KKyAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHN0YXJ0LXRhZy1zdGFydCIvPgorICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJlbGVtZW50LW5hbWUiPgorICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InRleHQiIHNlbGVjdD0ibmFtZSgpIi8+CisgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqIiBtb2RlPSJ4bWwtdG8tc3RyaW5nIi8+CisgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im5hbWVzcGFjZTo6KiI+CisgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvY2Vzcy1uYW1lc3BhY2Utbm9kZSI+CisgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9IiRlbGVtZW50Ii8+CisgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXB0aCIgc2VsZWN0PSIkZGVwdGgiLz4KKyAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgPC94c2w6Zm9yLWVhY2g+CisgICAgPHhzbDpjaG9vc2U+CisgICAgICA8eHNsOndoZW4gdGVzdD0ibm9kZSgpIG9yIG5vdCgkdXNlLWVtcHR5LXN5bnRheCkiPgorICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHN0YXJ0LXRhZy1lbmQiLz4KKyAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgbW9kZT0ieG1sLXRvLXN0cmluZyI+CisgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlcHRoIiBzZWxlY3Q9IiRkZXB0aCArIDEiLz4KKyAgICAgICAgPC94c2w6YXBwbHktdGVtcGxhdGVzPgorICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVuZC10YWctc3RhcnQiLz4KKyAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImVsZW1lbnQtbmFtZSI+CisgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InRleHQiIHNlbGVjdD0ibmFtZSgpIi8+CisgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZW5kLXRhZy1lbmQiLz4KKyAgICAgIDwveHNsOndoZW4+CisgICAgICA8eHNsOm90aGVyd2lzZT4KKyAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbXB0eS10YWctZW5kIi8+CisgICAgICA8L3hzbDpvdGhlcndpc2U+CisgICAgPC94c2w6Y2hvb3NlPgorICA8L3hzbDp0ZW1wbGF0ZT4KKworICA8eHNsOnRlbXBsYXRlIG5hbWU9InByb2Nlc3MtbmFtZXNwYWNlLW5vZGUiPgorICAgIDx4c2w6cGFyYW0gbmFtZT0iZWxlbWVudCIvPgorICAgIDx4c2w6cGFyYW0gbmFtZT0iZGVwdGgiLz4KKyAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImRlY2xhcmVkQWJvdmUiPgorICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImlzRGVjbGFyZWRBYm92ZSI+CisgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXB0aCIgc2VsZWN0PSIkZGVwdGggLSAxIi8+CisgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9IiRlbGVtZW50Ly4uIi8+CisgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgIDwveHNsOnZhcmlhYmxlPgorICAgIDx4c2w6aWYgdGVzdD0iKG5vdCgkZXhjbHVkZS11bnVzZWQtcHJlZml4ZXMpIG9yICgkZWxlbWVudCB8ICRlbGVtZW50Ly9AKiB8ICRlbGVtZW50Ly8qKVtuYW1lc3BhY2UtdXJpKCk9Y3VycmVudCgpXSkgYW5kIG5vdChzdHJpbmcoJGRlY2xhcmVkQWJvdmUpKSBhbmQgbmFtZSgpIT0neG1sJyI+CisgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNwYWNlIi8+CisgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5zLWRlY2wiLz4KKyAgICAgIDx4c2w6aWYgdGVzdD0ibmFtZSgpIj4KKyAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xvbiIvPgorICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibnMtcHJlZml4Ij4KKyAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idGV4dCIgc2VsZWN0PSJuYW1lKCkiLz4KKyAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgIDwveHNsOmlmPgorICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlcXVhbHMiLz4KKyAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXR0cmlidXRlLWRlbGltaXRlciIvPgorICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im5zLXVyaSI+CisgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ0ZXh0IiBzZWxlY3Q9InN0cmluZyguKSIvPgorICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXR0cmlidXRlLWRlbGltaXRlciIvPgorICAgIDwveHNsOmlmPgorICA8L3hzbDp0ZW1wbGF0ZT4KKworICA8eHNsOnRlbXBsYXRlIG5hbWU9ImlzRGVjbGFyZWRBYm92ZSI+CisgICAgPHhzbDpwYXJhbSBuYW1lPSJlbGVtZW50Ii8+CisgICAgPHhzbDpwYXJhbSBuYW1lPSJkZXB0aCIvPgorICAgIDx4c2w6aWYgdGVzdD0iJGRlcHRoID4gMCI+CisgICAgICA8eHNsOmNob29zZT4KKyAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50L25hbWVzcGFjZTo6KltuYW1lKC4pPW5hbWUoY3VycmVudCgpKSBhbmQgLj1jdXJyZW50KCldIj4xPC94c2w6d2hlbj4KKyAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50L25hbWVzcGFjZTo6KltuYW1lKC4pPW5hbWUoY3VycmVudCgpKV0iLz4KKyAgICAgICAgPHhzbDpvdGhlcndpc2U+CisgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImlzRGVjbGFyZWRBYm92ZSI+CisgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVwdGgiIHNlbGVjdD0iJGRlcHRoIC0gMSIvPgorICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iJGVsZW1lbnQvLi4iLz4KKyAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgICAgICA8L3hzbDpvdGhlcndpc2U+CisgICAgICA8L3hzbDpjaG9vc2U+CisgICAgPC94c2w6aWY+CisgIDwveHNsOnRlbXBsYXRlPgorCisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9IkAqIiBtb2RlPSJ4bWwtdG8tc3RyaW5nIj4KKyAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNwYWNlIi8+CisgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImF0dHJpYnV0ZS1uYW1lIj4KKyAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ0ZXh0IiBzZWxlY3Q9Im5hbWUoKSIvPgorICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlcXVhbHMiLz4KKyAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF0dHJpYnV0ZS1kZWxpbWl0ZXIiLz4KKyAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYXR0cmlidXRlLXZhbHVlIj4KKyAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ0ZXh0IiBzZWxlY3Q9InN0cmluZyguKSIvPgorICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRhdHRyaWJ1dGUtZGVsaW1pdGVyIi8+CisgIDwveHNsOnRlbXBsYXRlPgorCisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImNvbW1lbnQoKSIgbW9kZT0ieG1sLXRvLXN0cmluZyI+CisgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb21tZW50LXN0YXJ0Ii8+CisgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNvbW1lbnQtdGV4dCI+CisgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idGV4dCIgc2VsZWN0PSJzdHJpbmcoLikiLz4KKyAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29tbWVudC1lbmQiLz4KKyAgPC94c2w6dGVtcGxhdGU+CisKKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0icHJvY2Vzc2luZy1pbnN0cnVjdGlvbigpIiBtb2RlPSJ4bWwtdG8tc3RyaW5nIj4KKyAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBpLXN0YXJ0Ii8+CisgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBpLXRhcmdldCI+CisgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idGV4dCIgc2VsZWN0PSJuYW1lKCkiLz4KKyAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3BhY2UiLz4KKyAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGktdGV4dCI+CisgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idGV4dCIgc2VsZWN0PSJzdHJpbmcoLikiLz4KKyAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGktZW5kIi8+CisgIDwveHNsOnRlbXBsYXRlPgorCisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InRleHQoKSIgbW9kZT0ieG1sLXRvLXN0cmluZyI+CisgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRleHQtY29udGVudCI+CisgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idGV4dCIgc2VsZWN0PSJzdHJpbmcoLikiLz4KKyAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICA8L3hzbDp0ZW1wbGF0ZT4KKworICA8eHNsOnRlbXBsYXRlIG5hbWU9ImVsZW1lbnQtbmFtZSI+CisgICAgPHhzbDpwYXJhbSBuYW1lPSJ0ZXh0Ii8+CisgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0ZXh0Ii8+CisgIDwveHNsOnRlbXBsYXRlPgorCisgIDx4c2w6dGVtcGxhdGUgbmFtZT0iYXR0cmlidXRlLW5hbWUiPgorICAgIDx4c2w6cGFyYW0gbmFtZT0idGV4dCIvPgorICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGV4dCIvPgorICA8L3hzbDp0ZW1wbGF0ZT4KKworICA8eHNsOnRlbXBsYXRlIG5hbWU9ImF0dHJpYnV0ZS12YWx1ZSI+CisgICAgPHhzbDpwYXJhbSBuYW1lPSJ0ZXh0Ii8+CisgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJlc2NhcGVkLW1hcmt1cCI+CisgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZXNjYXBlLW1hcmt1cC1jaGFyYWN0ZXJzIj4KKyAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InRleHQiIHNlbGVjdD0iJHRleHQiLz4KKyAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgPC94c2w6dmFyaWFibGU+CisgICAgPHhzbDpjaG9vc2U+CisgICAgICA8eHNsOndoZW4gdGVzdD0iJGF0dHJpYnV0ZS1kZWxpbWl0ZXIgPSAmcXVvdDsnJnF1b3Q7Ij4KKyAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InJlcGxhY2Utc3RyaW5nIj4KKyAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idGV4dCIgc2VsZWN0PSIkZXNjYXBlZC1tYXJrdXAiLz4KKyAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVwbGFjZSIgc2VsZWN0PSImcXVvdDsnJnF1b3Q7Ii8+CisgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9IndpdGgiIHNlbGVjdD0iJyZhbXA7YXBvczsnIi8+CisgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICA8L3hzbDp3aGVuPgorICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRhdHRyaWJ1dGUtZGVsaW1pdGVyID0gJyZxdW90OyciPgorICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icmVwbGFjZS1zdHJpbmciPgorICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ0ZXh0IiBzZWxlY3Q9IiRlc2NhcGVkLW1hcmt1cCIvPgorICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZXBsYWNlIiBzZWxlY3Q9IicmcXVvdDsnIi8+CisgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9IndpdGgiIHNlbGVjdD0iJyZhbXA7cXVvdDsnIi8+CisgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICA8L3hzbDp3aGVuPgorICAgICAgPHhzbDpvdGhlcndpc2U+CisgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJyZXBsYWNlLXN0cmluZyI+CisgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InRleHQiIHNlbGVjdD0iJGVzY2FwZWQtbWFya3VwIi8+CisgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlcGxhY2UiIHNlbGVjdD0iJGF0dHJpYnV0ZS1kZWxpbWl0ZXIiLz4KKyAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0id2l0aCIgc2VsZWN0PSInJyIvPgorICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgICAgPC94c2w6b3RoZXJ3aXNlPgorICAgIDwveHNsOmNob29zZT4KKyAgPC94c2w6dGVtcGxhdGU+CisKKyAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJucy1wcmVmaXgiPgorICAgIDx4c2w6cGFyYW0gbmFtZT0idGV4dCIvPgorICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGV4dCIvPgorICA8L3hzbDp0ZW1wbGF0ZT4KKworICA8eHNsOnRlbXBsYXRlIG5hbWU9Im5zLXVyaSI+CisgICAgPHhzbDpwYXJhbSBuYW1lPSJ0ZXh0Ii8+CisgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImF0dHJpYnV0ZS12YWx1ZSI+CisgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idGV4dCIgc2VsZWN0PSIkdGV4dCIvPgorICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgIDwveHNsOnRlbXBsYXRlPgorCisgIDx4c2w6dGVtcGxhdGUgbmFtZT0idGV4dC1jb250ZW50Ij4KKyAgICA8eHNsOnBhcmFtIG5hbWU9InRleHQiLz4KKyAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZXNjYXBlLW1hcmt1cC1jaGFyYWN0ZXJzIj4KKyAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ0ZXh0IiBzZWxlY3Q9IiR0ZXh0Ii8+CisgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgPC94c2w6dGVtcGxhdGU+CisKKyAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwaS10YXJnZXQiPgorICAgIDx4c2w6cGFyYW0gbmFtZT0idGV4dCIvPgorICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGV4dCIvPgorICA8L3hzbDp0ZW1wbGF0ZT4KKworICA8eHNsOnRlbXBsYXRlIG5hbWU9InBpLXRleHQiPgorICAgIDx4c2w6cGFyYW0gbmFtZT0idGV4dCIvPgorICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGV4dCIvPgorICA8L3hzbDp0ZW1wbGF0ZT4KKworICA8eHNsOnRlbXBsYXRlIG5hbWU9ImNvbW1lbnQtdGV4dCI+CisgICAgPHhzbDpwYXJhbSBuYW1lPSJ0ZXh0Ii8+CisgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0ZXh0Ii8+CisgIDwveHNsOnRlbXBsYXRlPgorCisgIDx4c2w6dGVtcGxhdGUgbmFtZT0iZXNjYXBlLW1hcmt1cC1jaGFyYWN0ZXJzIj4KKyAgICA8eHNsOnBhcmFtIG5hbWU9InRleHQiLz4KKyAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImFtcEVzY2FwZWQiPgorICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InJlcGxhY2Utc3RyaW5nIj4KKyAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InRleHQiIHNlbGVjdD0iJHRleHQiLz4KKyAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlcGxhY2UiIHNlbGVjdD0iJyZhbXA7JyIvPgorICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0id2l0aCIgc2VsZWN0PSInJmFtcDthbXA7JyIvPgorICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICA8L3hzbDp2YXJpYWJsZT4KKyAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Imx0RXNjYXBlZCI+CisgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icmVwbGFjZS1zdHJpbmciPgorICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idGV4dCIgc2VsZWN0PSIkYW1wRXNjYXBlZCIvPgorICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVwbGFjZSIgc2VsZWN0PSInJmx0OyciLz4KKyAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9IndpdGgiIHNlbGVjdD0iJyZhbXA7bHQ7JyIvPgorICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICA8L3hzbDp2YXJpYWJsZT4KKyAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icmVwbGFjZS1zdHJpbmciPgorICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InRleHQiIHNlbGVjdD0iJGx0RXNjYXBlZCIvPgorICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlcGxhY2UiIHNlbGVjdD0iJ11dPiciLz4KKyAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ3aXRoIiBzZWxlY3Q9IiddXSZhbXA7Z3Q7JyIvPgorICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgIDwveHNsOnRlbXBsYXRlPgorCisgIDx4c2w6dGVtcGxhdGUgbmFtZT0icmVwbGFjZS1zdHJpbmciPgorICAgIDx4c2w6cGFyYW0gbmFtZT0idGV4dCIvPgorICAgIDx4c2w6cGFyYW0gbmFtZT0icmVwbGFjZSIvPgorICAgIDx4c2w6cGFyYW0gbmFtZT0id2l0aCIvPgorICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic3RyaW5nVGV4dCIgc2VsZWN0PSJzdHJpbmcoJHRleHQpIi8+CisgICAgPHhzbDpjaG9vc2U+CisgICAgICA8eHNsOndoZW4gdGVzdD0iY29udGFpbnMoJHN0cmluZ1RleHQsJHJlcGxhY2UpIj4KKyAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoJHN0cmluZ1RleHQsJHJlcGxhY2UpIi8+CisgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd2l0aCIvPgorICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icmVwbGFjZS1zdHJpbmciPgorICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ0ZXh0IiBzZWxlY3Q9InN1YnN0cmluZy1hZnRlcigkc3RyaW5nVGV4dCwkcmVwbGFjZSkiLz4KKyAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVwbGFjZSIgc2VsZWN0PSIkcmVwbGFjZSIvPgorICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ3aXRoIiBzZWxlY3Q9IiR3aXRoIi8+CisgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICA8L3hzbDp3aGVuPgorICAgICAgPHhzbDpvdGhlcndpc2U+CisgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3RyaW5nVGV4dCIvPgorICAgICAgPC94c2w6b3RoZXJ3aXNlPgorICAgIDwveHNsOmNob29zZT4KKyAgPC94c2w6dGVtcGxhdGU+CisKKzwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAveHNsL21hdmVuLnhzbCBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC94c2wvbWF2ZW4ueHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMzgwOTIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAveHNsL21hdmVuLnhzbApAQCAtMCwwICsxLDEwMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENydWlzZUNvbnRyb2wsIGEgQ29udGludW91cyBJbnRlZ3JhdGlvbiBUb29sa2l0CisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIFRob3VnaHRXb3JrcywgSW5jLgorICogNjUxIFcgV2FzaGluZ3RvbiBBdmUuIFN1aXRlIDYwMAorICogQ2hpY2FnbywgSUwgNjA2NjEgVVNBCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgICArIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogICAgICsgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqICAgICArIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhvdWdodFdvcmtzLCBJbmMuLCBDcnVpc2VDb250cm9sLCBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICogICAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogICAgICAgd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLS0+Cis8eHNsOnN0eWxlc2hlZXQKKyAgICB2ZXJzaW9uPSIxLjAiCisgICAgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCisgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L3N0cmljdC5kdGQiID4KKworICAgIDx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIvPgorCisgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJtYXZlbmdvYWwiIHNlbGVjdD0iL2NydWlzZWNvbnRyb2wvYnVpbGQvL21hdmVuZ29hbCIvPgorCisgICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+CisKKyAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJtYXZlbi5tZXNzYWdlcyIgc2VsZWN0PSIkbWF2ZW5nb2FsL21lc3NhZ2UiLz4KKyAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJtYXZlbi5lcnJvci5tZXNzYWdlcyIgc2VsZWN0PSIkbWF2ZW5nb2FsL21lc3NhZ2VbQHByaW9yaXR5PSdlcnJvciddIi8+CisgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibWF2ZW4ud2Fybi5tZXNzYWdlcyIgc2VsZWN0PSIkbWF2ZW5nb2FsL21lc3NhZ2VbQHByaW9yaXR5PSd3YXJuJ10iLz4KKyAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJtYXZlbi5pbmZvLm1lc3NhZ2VzIiBzZWxlY3Q9IiRtYXZlbmdvYWwvbWVzc2FnZVtAcHJpb3JpdHk9J2luZm8nXSIvPgorCisgICAgICAgIDx4c2w6aWYgdGVzdD0iY291bnQoJG1hdmVuLm1lc3NhZ2VzKSA+IDAiPgorICAgICAgICAgICAgPHRhYmxlIGFsaWduPSJjZW50ZXIiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCIgYm9yZGVyPSIwIiB3aWR0aD0iOTglIj4KKyAgICAgICAgICAgICAgICAgPCEtLSBTdHlsZSBkb3dubG9hZCBub3RpZmljYXRpb25zIGZpcnN0IC0tPgorICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9ImNvbXBpbGUtc2VjdGlvbmhlYWRlciI+CisgICAgICAgICAgICAgICAgICAgICA8dGQ+SW5pdGlhbCBNZXNzYWdlczwvdGQ+CisgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImNydWlzZWNvbnRyb2wvYnVpbGQvbWVzc2FnZSIvPgorICAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIkbWF2ZW5nb2FsIi8+CisgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICA8L3hzbDppZj4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Im1hdmVuZ29hbCI+CisgICAgICAgPHRyIGNsYXNzPSJjb21waWxlLXNlY3Rpb25oZWFkZXIiPgorICAgICAgIAkJPHRkPgorICAgICAgICAgICAgCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgorICAgICAgICAgICAgPC90ZD4KKyAgICAgICA8L3RyPgorICAgICAgIDx0cj4KKyAgICAgICAJCTx0ZD4KKyAgICAgICAgICAgIAk8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4vbWVzc2FnZSIvPgorICAgICAgICAgICAgPC90ZD4KKyAgICAgICA8L3RyPgorICAgIDwveHNsOnRlbXBsYXRlPgorCisgICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibWVzc2FnZVtAcHJpb3JpdHk9J2Vycm9yJ10iPgorICAgIAkgIDxzcGFuIGNsYXNzPSJjb21waWxlLWVycm9yLWRhdGEiPgorICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIi8+PHhzbDp0ZXh0IGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiPjwhW0NEQVRBWzxici8+XV0+PC94c2w6dGV4dD4KKyAgICAgICAgPC9zcGFuPgorICAgIDwveHNsOnRlbXBsYXRlPgorCisgICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibWVzc2FnZVtAcHJpb3JpdHk9J3dhcm4nXSI+CisgICAgCSAgPHNwYW4gY2xhc3M9ImNvbXBpbGUtZGF0YSI+CisgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiLz48eHNsOnRleHQgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyI+PCFbQ0RBVEFbPGJyLz5dXT48L3hzbDp0ZXh0PgorICAgICAgICA8L3NwYW4+CisgICAgPC94c2w6dGVtcGxhdGU+CisKKyAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJtZXNzYWdlW0Bwcmlvcml0eT0naW5mbyddIj4KKyAgICAJICA8c3BhbiBjbGFzcz0iY29tcGlsZS1kYXRhIj4KKyAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIvPjx4c2w6dGV4dCBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIj48IVtDREFUQVs8YnIvPl1dPjwveHNsOnRleHQ+CisgICAgICAgIDwvc3Bhbj4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC94c2wvbW9kaWZpY2F0aW9ucy54c2wgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAveHNsL21vZGlmaWNhdGlvbnMueHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNGJiNDUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAveHNsL21vZGlmaWNhdGlvbnMueHNsCkBAIC0wLDAgKzEsMjA1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ3J1aXNlQ29udHJvbCwgYSBDb250aW51b3VzIEludGVncmF0aW9uIFRvb2xraXQKKyAqIENvcHlyaWdodCAoYykgMjAwMSwgVGhvdWdodFdvcmtzLCBJbmMuCisgKiA2NTEgVyBXYXNoaW5ndG9uIEF2ZS4gU3VpdGUgNjAwCisgKiBDaGljYWdvLCBJTCA2MDY2MSBVU0EKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICAgICsgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgKyBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisgKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogICAgICsgTmVpdGhlciB0aGUgbmFtZSBvZiBUaG91Z2h0V29ya3MsIEluYy4sIENydWlzZUNvbnRyb2wsIG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgKiAgICAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiAgICAgICB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiotLT4KKzx4c2w6c3R5bGVzaGVldAorICAgIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB2ZXJzaW9uPSIxLjAiPgorCisgICAgPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIi8+CisgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJtb2RpZmljYXRpb24ubGlzdCIgc2VsZWN0PSJjcnVpc2Vjb250cm9sL21vZGlmaWNhdGlvbnMvbW9kaWZpY2F0aW9uIi8+CisKKyAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KKyAgICAgICAgPHRhYmxlIGFsaWduPSJjZW50ZXIiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMSIgYm9yZGVyPSIwIiB3aWR0aD0iOTglIj4KKyAgICAgICAgICAgIDwhLS0gTW9kaWZpY2F0aW9ucyAtLT4KKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICA8dGQgY2xhc3M9Im1vZGlmaWNhdGlvbnMtc2VjdGlvbmhlYWRlciIgY29sc3Bhbj0iNiI+CisgICAgICAgICAgICAgICAgICAgICYjMTYwO01vZGlmaWNhdGlvbnMgc2luY2UgbGFzdCBidWlsZDomIzE2MDsKKyAgICAgICAgICAgICAgICAgICAgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb3VudCgkbW9kaWZpY2F0aW9uLmxpc3QpIi8+KQorICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICA8L3RyPgorCisgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IiRtb2RpZmljYXRpb24ubGlzdCI+CisgICAgICAgICAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iZGF0ZSIgb3JkZXI9ImRlc2NlbmRpbmciIGRhdGEtdHlwZT0idGV4dCIgLz4KKyAgICAgICAgICAgIDwveHNsOmFwcGx5LXRlbXBsYXRlcz4KKworICAgICAgICA8L3RhYmxlPgorICAgIDwveHNsOnRlbXBsYXRlPgorCisgICAgPCEtLSBQNCBjaGFuZ2VsaXN0IHRlbXBsYXRlCisgICAgPG1vZGlmaWNhdGlvbiB0eXBlPSJwNCIgcmV2aXNpb249IjE1Ij4KKyAgICAgICA8cmV2aXNpb24+MTU8L3JldmlzaW9uPgorICAgICAgIDx1c2VyPm5vbjwvdXNlcj4KKyAgICAgICA8Y2xpZW50Pm5vbjphbGw8L2NsaWVudD4KKyAgICAgICA8ZGF0ZT4yMDAyLzA1LzAyIDEwOjEwOjEwPC9kYXRlPgorICAgICAgIDxmaWxlIGFjdGlvbj0iYWRkIj4KKyAgICAgICAgICA8ZmlsZW5hbWU+bXlmaWxlPC9maWxlbmFtZT4KKyAgICAgICAgICA8cmV2aXNpb24+MTA8L3JldmlzaW9uPgorICAgICAgIDwvZmlsZT4KKyAgICA8L21vZGlmaWNhdGlvbj4KKyAgICAtLT4KKyAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJtb2RpZmljYXRpb25bQHR5cGU9J3A0J10iPgorICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgorICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpIG1vZCAyPTAiPgorICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj5jaGFuZ2VsaXN0cy1ldmVucm93PC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgPC94c2w6aWY+CisgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkgbW9kIDIhPTAiPgorICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj5jaGFuZ2VsaXN0cy1vZGRyb3c8L3hzbDphdHRyaWJ1dGU+CisgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgICAgIDx0ZCBjbGFzcz0ibW9kaWZpY2F0aW9ucy1kYXRhIj4KKyAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0icmV2aXNpb24iLz4KKyAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICA8dGQgY2xhc3M9Im1vZGlmaWNhdGlvbnMtZGF0YSI+CisgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InVzZXIiLz4KKyAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICA8dGQgY2xhc3M9Im1vZGlmaWNhdGlvbnMtZGF0YSI+CisgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNsaWVudCIvPgorICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgIDx0ZCBjbGFzcz0ibW9kaWZpY2F0aW9ucy1kYXRhIj4KKyAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iZGF0ZSIvPgorICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgIDx0ZCBjbGFzcz0ibW9kaWZpY2F0aW9ucy1kYXRhIj4KKyAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY29tbWVudCIvPgorICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPHhzbDppZiB0ZXN0PSJjb3VudChmaWxlKSA+IDAiPgorICAgICAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkgbW9kIDI9MCI+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj5jaGFuZ2VsaXN0cy1ldmVucm93PC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSBtb2QgMiE9MCI+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj5jaGFuZ2VsaXN0cy1vZGRyb3c8L3hzbDphdHRyaWJ1dGU+CisgICAgICAgICAgICAgICAgPC94c2w6aWY+CisgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJtb2RpZmljYXRpb25zLWRhdGEiIGNvbHNwYW49IjYiPgorICAgICAgICAgICAgICAgICAgICA8dGFibGUgYWxpZ249InJpZ2h0IiBjZWxscGFkZGluZz0iMSIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCIgd2lkdGg9Ijk1JSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjaGFuZ2VsaXN0cy1maWxlLWhlYWRlciIgY29sc3Bhbj0iMyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYjMTYwO0ZpbGVzIGFmZmVjdGVkIGJ5IHRoaXMgY2hhbmdlbGlzdDomIzE2MDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb3VudChmaWxlKSIvPikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iZmlsZSIvPgorICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICA8L3RyPgorICAgICAgICA8L3hzbDppZj4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDwhLS0gdXNlZCBieSBQNCAtLT4KKyAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJmaWxlIj4KKyAgICAgICAgPHRyIHZhbGlnbj0idG9wIiA+CisgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkgbW9kIDI9MCI+CisgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPmNoYW5nZWxpc3RzLWZpbGUtZXZlbnJvdzwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpIG1vZCAyIT0wIj4KKyAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyI+Y2hhbmdlbGlzdHMtZmlsZS1vZGRyb3c8L3hzbDphdHRyaWJ1dGU+CisgICAgICAgICAgICA8L3hzbDppZj4KKworICAgICAgICAgICAgPHRkIGNsYXNzPSJjaGFuZ2VsaXN0cy1maWxlLXNwYWNlciI+CisgICAgICAgICAgICAgICAgJiMxNjA7CisgICAgICAgICAgICA8L3RkPgorCisgICAgICAgICAgICA8dGQgY2xhc3M9Im1vZGlmaWNhdGlvbnMtZGF0YSI+CisgICAgICAgICAgICAgICAgPGI+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAYWN0aW9uIi8+CisgICAgICAgICAgICAgICAgPC9iPgorICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgIDx0ZCBjbGFzcz0ibW9kaWZpY2F0aW9ucy1kYXRhIiB3aWR0aD0iMTAwJSI+CisgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImZpbGVuYW1lIi8+JiMxNjA7CisgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InJldmlzaW9uIi8+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICA8L3RyPgorICAgIDwveHNsOnRlbXBsYXRlPgorCisgICAgPCEtLSBNb2RpZmljYXRpb25zIHRlbXBsYXRlIC0tPgorICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Im1vZGlmaWNhdGlvbltmaWxlXSI+CisgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSBtb2QgMj0wIj4KKyAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyI+bW9kaWZpY2F0aW9ucy1ldmVucm93PC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgPC94c2w6aWY+CisgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkgbW9kIDIhPTAiPgorICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj5tb2RpZmljYXRpb25zLW9kZHJvdzwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDwveHNsOmlmPgorCisgICAgICAgICAgICA8dGQgY2xhc3M9Im1vZGlmaWNhdGlvbnMtZGF0YSI+CisgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImZpbGUvQGFjdGlvbiIvPgorICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgIDx0ZCBjbGFzcz0ibW9kaWZpY2F0aW9ucy1kYXRhIj4KKyAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idXNlciIvPgorICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgIDx0ZCBjbGFzcz0ibW9kaWZpY2F0aW9ucy1kYXRhIj4KKyAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImZpbGUvcHJvamVjdCI+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJmaWxlL3Byb2plY3QiLz4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN5c3RlbS1wcm9wZXJ0eSgnZmlsZS5zZXBhcmF0b3InKSIvPgorICAgICAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJmaWxlL2ZpbGVuYW1lIi8+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgPHRkIGNsYXNzPSJtb2RpZmljYXRpb25zLWRhdGEiPgorICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb21tZW50Ii8+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICA8L3RyPgorICAgIDwveHNsOnRlbXBsYXRlPgorCisgICAgPCEtLSBVcCB0byB2ZXJzaW9uIDIuMS42IHRoZSBtb2RpZmljYXRpb24gc2V0IGZvcm1hdCBkaWQgbm90CisgICAgICAgICBpbmNsdWRlIHRoZSBmaWxlIG5vZGUgLS0+CisgICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibW9kaWZpY2F0aW9uIj4KKyAgICAgICAgPHRyPgorICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpIG1vZCAyPTAiPgorICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj5tb2RpZmljYXRpb25zLWV2ZW5yb3c8L3hzbDphdHRyaWJ1dGU+CisgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSBtb2QgMiE9MCI+CisgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPm1vZGlmaWNhdGlvbnMtb2Rkcm93PC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgPC94c2w6aWY+CisKKyAgICAgICAgICAgIDx0ZCBjbGFzcz0ibW9kaWZpY2F0aW9ucy1kYXRhIj4KKyAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz4KKyAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICA8dGQgY2xhc3M9Im1vZGlmaWNhdGlvbnMtZGF0YSI+CisgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InVzZXIiLz4KKyAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICA8dGQgY2xhc3M9Im1vZGlmaWNhdGlvbnMtZGF0YSI+CisgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJwcm9qZWN0Ij4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InByb2plY3QiLz4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN5c3RlbS1wcm9wZXJ0eSgnZmlsZS5zZXBhcmF0b3InKSIvPgorICAgICAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJmaWxlbmFtZSIvPgorICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgIDx0ZCBjbGFzcz0ibW9kaWZpY2F0aW9ucy1kYXRhIj4KKyAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY29tbWVudCIvPgorICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgPC90cj4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC94c2wvdGVzdGRldGFpbHMueHNsIGIvZ3Jvb3Z5L2NydWlzZS9yZXBvcnRpbmctYXBwL3hzbC90ZXN0ZGV0YWlscy54c2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlmNzAwOAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC94c2wvdGVzdGRldGFpbHMueHNsCkBAIC0wLDAgKzEsMzEzIEBACis8eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHZlcnNpb249IjEuMCI+Cis8IS0tKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENydWlzZUNvbnRyb2wsIGEgQ29udGludW91cyBJbnRlZ3JhdGlvbiBUb29sa2l0CisgKiBDb3B5cmlnaHQgKGMpIDIwMDEsIFRob3VnaHRXb3JrcywgSW5jLgorICogNjUxIFcgV2FzaGluZ3RvbiBBdmUuIFN1aXRlIDYwMAorICogQ2hpY2FnbywgSUwgNjA2NjEgVVNBCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgICArIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogICAgICsgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqICAgICArIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhvdWdodFdvcmtzLCBJbmMuLCBDcnVpc2VDb250cm9sLCBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICogICAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogICAgICAgd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLS0+Cis8eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiLz4KKzx4c2w6ZGVjaW1hbC1mb3JtYXQgZGVjaW1hbC1zZXBhcmF0b3I9Ii4iIGdyb3VwaW5nLXNlcGFyYXRvcj0iLCIgLz4KKworPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Cis8IS0tIFdyaXRlIGEgcGFja2FnZSBsZXZlbCByZXBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKzwhLS0gSXQgY3JlYXRlcyBhIHRhYmxlIHdpdGggdmFsdWVzIGZyb20gdGhlIGRvY3VtZW50OiAgICAgICAgICAgICAgICAgIC0tPgorPCEtLSBOYW1lIHwgVGVzdHMgfCBFcnJvcnMgfCBGYWlsdXJlcyB8IFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Cis8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKzx4c2w6dGVtcGxhdGUgbWF0Y2g9ImNydWlzZWNvbnRyb2wiIHByaW9yaXR5PSIxIj4KKyAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgorICAgICAgICB2YXIgVGVzdENhc2VzID0gbmV3IEFycmF5KCk7CisgICAgICAgIHZhciBTeXN0ZW1PdXQgPSBuZXcgQXJyYXkoKTsKKyAgICAgICAgdmFyIFN5c3RlbUVyciA9IG5ldyBBcnJheSgpOworICAgICAgICB2YXIgUHJvYmxlbSA9IG5ldyBBcnJheSgpOworICAgICAgICB2YXIgY3VyOworICAgICAgPCEtLXhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIvL3Rlc3RzdWl0ZSIgbW9kZT0ianMucHJvcHMiIC8tLT4KKyAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLy90ZXN0c3VpdGUiIG1vZGU9ImpzLnByb3BzIiAvPgorICAgIDwvc2NyaXB0PgorICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PCFbQ0RBVEFbCisgICAgICAgIGZ1bmN0aW9uIGRpc3BsYXlQcm9wZXJ0aWVzIChuYW1lKSB7CisgICAgICAgICAgdmFyIHdpbiA9IHdpbmRvdy5vcGVuKCcnLCdKVW5pdFN5c3RlbVByb3BlcnRpZXMnLCdzY3JvbGxiYXJzPTEscmVzaXphYmxlPTEnKTsKKyAgICAgICAgICB2YXIgZG9jID0gd2luLmRvY3VtZW50Lm9wZW4oKTsKKyAgICAgICAgICBkb2Mud3JpdGUoIjxodG1sPjxoZWFkPjx0aXRsZT5Qcm9wZXJ0aWVzIG9mICIgKyBuYW1lICsgIjwvdGl0bGU+Iik7CisgICAgICAgICAgZG9jLndyaXRlKCI8c3R5bGU+IikKKyAgICAgICAgICBkb2Mud3JpdGUoImJvZHkge2ZvbnQ6bm9ybWFsIDY4JSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYTsgY29sb3I6IzAwMDAwMDsgfSIpOworICAgICAgICAgIGRvYy53cml0ZSgidGFibGUgdHIgdGQsIHRhYmxlIHRyIHRoIHsgZm9udC1zaXplOiA2OCU7IH0iKTsKKyAgICAgICAgICBkb2Mud3JpdGUoInRhYmxlLnByb3BlcnRpZXMgeyBib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7IGJvcmRlci1sZWZ0OnNvbGlkIDEgI2NjY2NjYzsgYm9yZGVyLXRvcDpzb2xpZCAxICNjY2NjY2M7IHBhZGRpbmc6NXB4OyB9Iik7CisgICAgICAgICAgZG9jLndyaXRlKCJ0YWJsZS5wcm9wZXJ0aWVzIHRoIHsgdGV4dC1hbGlnbjpsZWZ0OyBib3JkZXItcmlnaHQ6c29saWQgMSAjY2NjY2NjOyBib3JkZXItYm90dG9tOnNvbGlkIDEgI2NjY2NjYzsgYmFja2dyb3VuZC1jb2xvcjojZWVlZWVlOyB9Iik7CisgICAgICAgICAgZG9jLndyaXRlKCJ0YWJsZS5wcm9wZXJ0aWVzIHRkIHsgZm9udDpub3JtYWw7IHRleHQtYWxpZ246bGVmdDsgYm9yZGVyLXJpZ2h0OnNvbGlkIDEgI2NjY2NjYzsgYm9yZGVyLWJvdHRvbTpzb2xpZCAxICNjY2NjY2M7IGJhY2tncm91bmQtY29sb3I6I2ZmZmZmZmY7IH0iKTsKKyAgICAgICAgICBkb2Mud3JpdGUoImgzIHsgbWFyZ2luLWJvdHRvbTogMC41ZW07IGZvbnQ6IGJvbGQgMTE1JSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYSB9Iik7CisgICAgICAgICAgZG9jLndyaXRlKCI8L3N0eWxlPiIpOworICAgICAgICAgIGRvYy53cml0ZSgiPC9oZWFkPjxib2R5PiIpOworICAgICAgICAgIGRvYy53cml0ZSgiPGgzPlByb3BlcnRpZXMgb2YgIiArIG5hbWUgKyAiPC9oMz4iKTsKKyAgICAgICAgICBkb2Mud3JpdGUoIjxkaXYgYWxpZ249XCJyaWdodFwiPjxhIGhyZWY9XCJqYXZhc2NyaXB0OndpbmRvdy5jbG9zZSgpO1wiPkNsb3NlPC9hPjwvZGl2PiIpOworICAgICAgICAgIGRvYy53cml0ZSgiPHRhYmxlIGNsYXNzPSdwcm9wZXJ0aWVzJz4iKTsKKyAgICAgICAgICBkb2Mud3JpdGUoIjx0cj48dGg+TmFtZTwvdGg+PHRoPlZhbHVlPC90aD48L3RyPiIpOworICAgICAgICAgIGZvciAocHJvcCBpbiBUZXN0Q2FzZXNbbmFtZV0pIHsKKyAgICAgICAgICAgIGRvYy53cml0ZSgiPHRyPjx0aD4iICsgcHJvcCArICI8L3RoPjx0ZD4iICsgVGVzdENhc2VzW25hbWVdW3Byb3BdICsgIjwvdGQ+PC90cj4iKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZG9jLndyaXRlKCI8L3RhYmxlPiIpOworICAgICAgICAgIGRvYy53cml0ZSgiPC9ib2R5PjwvaHRtbD4iKTsKKyAgICAgICAgICBkb2MuY2xvc2UoKTsKKyAgICAgICAgICB3aW4uZm9jdXMoKTsKKyAgICAgICAgfQorICAgIF1dPiAgCisgICAgPC9zY3JpcHQ+CisgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48IVtDREFUQVsKKyAgICBmdW5jdGlvbiBkaXNwbGF5TWVzc2FnZShuYW1lKSB7CisgICAgICAgIHZhciB3aW4gPSB3aW5kb3cub3BlbignJywnTWVzc2FnZScsJ3Njcm9sbGJhcnM9MSxyZXNpemFibGU9MScpOworICAgICAgICB2YXIgZG9jID0gd2luLmRvY3VtZW50Lm9wZW4oKTsKKyAgICAgICAgZG9jLndyaXRlKCI8aHRtbD48aGVhZD48dGl0bGU+TWVzc2FnZTwvdGl0bGU+PC9oZWFkPiIpOworICAgICAgICBkb2Mud3JpdGUoIjxib2R5PjxwcmU+Iik7CisgICAgICAgIGRvYy53cml0ZShQcm9ibGVtW25hbWVdKTsKKyAgICAgICAgZG9jLndyaXRlKCI8L3ByZT48L2JvZHk+PC9odG1sPiIpOworICAgICAgICBkb2MuY2xvc2UoKTsKKyAgICAgICAgd2luLmZvY3VzKCk7CisgICAgfQorICAgIF1dPgorICAgIDwvc2NyaXB0PgorICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PCFbQ0RBVEFbCisgICAgZnVuY3Rpb24gZGlzcGxheU91dChuYW1lKSB7CisgICAgICAgIHZhciB3aW4gPSB3aW5kb3cub3BlbignJywnT3V0Jywnc2Nyb2xsYmFycz0xLHJlc2l6YWJsZT0xJyk7CisgICAgICAgIHZhciBkb2MgPSB3aW4uZG9jdW1lbnQub3BlbigpOworICAgICAgICBkb2Mud3JpdGUoIjxodG1sPjxoZWFkPjx0aXRsZT5PdXQ8L3RpdGxlPjwvaGVhZD4iKTsKKyAgICAgICAgZG9jLndyaXRlKCI8Ym9keT48cHJlPiIpOworICAgICAgICBkb2Mud3JpdGUoU3lzdGVtT3V0W25hbWVdKTsKKyAgICAgICAgZG9jLndyaXRlKCI8L3ByZT48L2JvZHk+PC9odG1sPiIpOworICAgICAgICBkb2MuY2xvc2UoKTsKKyAgICAgICAgd2luLmZvY3VzKCk7CisgICAgfQorICAgIF1dPgorICAgIDwvc2NyaXB0PgorICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PCFbQ0RBVEFbCisgICAgZnVuY3Rpb24gZGlzcGxheUVycihuYW1lKSB7CisgICAgICAgIHZhciB3aW4gPSB3aW5kb3cub3BlbignJywnRXJyJywnc2Nyb2xsYmFycz0xLHJlc2l6YWJsZT0xJyk7CisgICAgICAgIHZhciBkb2MgPSB3aW4uZG9jdW1lbnQub3BlbigpOworICAgICAgICBkb2Mud3JpdGUoIjxodG1sPjxoZWFkPjx0aXRsZT5FcnI8L3RpdGxlPjwvaGVhZD4iKTsKKyAgICAgICAgZG9jLndyaXRlKCI8Ym9keT48cHJlPiIpOworICAgICAgICBkb2Mud3JpdGUoU3lzdGVtRXJyW25hbWVdKTsKKyAgICAgICAgZG9jLndyaXRlKCI8L3ByZT48L2JvZHk+PC9odG1sPiIpOworICAgICAgICBkb2MuY2xvc2UoKTsKKyAgICAgICAgd2luLmZvY3VzKCk7CisgICAgfQorICAgIF1dPgorICAgIDwvc2NyaXB0PgorICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+CisgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRhYmxlLmhlYWRlciIgLz4KKyAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iLy90ZXN0c3VpdGUiPgorICAgICAgICA8eHNsOnNvcnQgc2VsZWN0PSJjb3VudCh0ZXN0Y2FzZS9lcnJvcikiIGRhdGEtdHlwZT0ibnVtYmVyIiBvcmRlcj0iZGVzY2VuZGluZyIgLz4KKyAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iY291bnQodGVzdGNhc2UvZmFpbHVyZSkiIGRhdGEtdHlwZT0ibnVtYmVyIiBvcmRlcj0iZGVzY2VuZGluZyIgLz4KKyAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iQHBhY2thZ2UiLz4KKyAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iQG5hbWUiLz4KKworICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJpbnQuY2xhc3MiIC8+CisgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0icHJpbnQudGVzdCIgLz4KKyAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByaW50LnByb3BlcnRpZXMiIC8+CisgICAgPC94c2w6Zm9yLWVhY2g+CisgICAgPC90YWJsZT4KKzwveHNsOnRlbXBsYXRlPgorICAgIAorPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ic3lzdGVtLW91dHxzeXN0ZW0tZXJyIiBtb2RlPSJwcmludC50ZXN0Ii8+CisKKzx4c2w6dGVtcGxhdGUgbWF0Y2g9InRlc3RjYXNlIiBtb2RlPSJwcmludC50ZXN0Ij4KKyAgICA8dHI+CisgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj4KKyAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgorICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJlcnJvciI+dW5pdHRlc3RzLWVycm9yPC94c2w6d2hlbj4KKyAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iZmFpbHVyZSI+dW5pdHRlc3RzLWVycm9yPC94c2w6d2hlbj4KKyAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT51bml0dGVzdHMtZGF0YTwveHNsOm90aGVyd2lzZT4KKyAgICAgICAgICAgIDwveHNsOmNob29zZT4KKyAgICAgICAgPC94c2w6YXR0cmlidXRlPgorICAgICAgICA8dGQgLz4KKyAgICAgICAgPHRkIGNvbHNwYW49IjIiPgorICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZD4KKyAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgorICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJlcnJvciI+CisgICAgICAgICAgICAgICAgICAgIDxhPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+amF2YXNjcmlwdDpkaXNwbGF5TWVzc2FnZSgnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4uL0BwYWNrYWdlIi8+Ljx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuLi9AbmFtZSIvPi48eHNsOnZhbHVlLW9mIHNlbGVjdD0nQG5hbWUnLz4nKTs8L3hzbDphdHRyaWJ1dGU+CisgICAgICAgICAgICAgICAgICAgICAgICBFcnJvciAmIzE4NzsKKyAgICAgICAgICAgICAgICAgICAgPC9hPgorICAgICAgICAgICAgICAgIDwveHNsOndoZW4+CisgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9ImZhaWx1cmUiPgorICAgICAgICAgICAgICAgICAgICA8YT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPmphdmFzY3JpcHQ6ZGlzcGxheU1lc3NhZ2UoJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuLi9AcGFja2FnZSIvPi48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLi4vQG5hbWUiLz4uPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J0BuYW1lJy8+Jyk7PC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgICAgICAgICAgICAgRmFpbHVyZSAmIzE4NzsKKyAgICAgICAgICAgICAgICAgICAgPC9hPgorICAgICAgICAgICAgICAgIDwveHNsOndoZW4+CisgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+U3VjY2VzczwveHNsOm90aGVyd2lzZT4KKyAgICAgICAgICAgIDwveHNsOmNob29zZT4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoZmFpbHVyZXxlcnJvcikiPgorICAgICAgICAgICAgPHRkPgorICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJmb3JtYXQtbnVtYmVyKEB0aW1lLCcwLjAwMCcpIi8+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICA8L3hzbDppZj4KKyAgICA8L3RyPgorPC94c2w6dGVtcGxhdGU+CisKKzx4c2w6dGVtcGxhdGUgbmFtZT0idGFibGUuaGVhZGVyIiA+CisgICAgPGNvbGdyb3VwPgorICAgICAgICA8Y29sIHdpZHRoPSIxMCUiPjwvY29sPgorICAgICAgICA8Y29sIHdpZHRoPSI0NSUiPjwvY29sPgorICAgICAgICA8Y29sIHdpZHRoPSIyNSUiPjwvY29sPgorICAgICAgICA8Y29sIHdpZHRoPSIxMCUiPjwvY29sPgorICAgICAgICA8Y29sIHdpZHRoPSIxMCUiPjwvY29sPgorICAgIDwvY29sZ3JvdXA+CisgICAgPHRyIHZhbGlnbj0idG9wIiBjbGFzcz0idW5pdHRlc3RzLXNlY3Rpb25oZWFkZXIiIGFsaWduPSJsZWZ0IiA+CisgICAgICAgIDx0aCBjb2xzcGFuPSIzIj5OYW1lPC90aD4KKyAgICAgICAgPHRoPlN0YXR1czwvdGg+CisgICAgICAgIDx0aCBub3dyYXA9Im5vd3JhcCI+VGltZShzKTwvdGg+CisgICAgPC90cj4KKzwveHNsOnRlbXBsYXRlPgorCis8eHNsOnRlbXBsYXRlIG5hbWU9InByaW50LnByb3BlcnRpZXMiID4KKyAgICA8dHIgY2xhc3M9InVuaXR0ZXN0cy1kYXRhIj4KKyAgICAgICAgPHRkIGNvbHNwYW49IjIiPgorICAgICAgICAgICAgPGE+CisgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+amF2YXNjcmlwdDpkaXNwbGF5UHJvcGVydGllcygnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwYWNrYWdlIi8+Ljx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPicpOzwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzICYjMTg3OworICAgICAgICAgICAgPC9hPgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQ+CisgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InN5c3RlbS1vdXQvdGV4dCgpIj4KKyAgICAgICAgICAgICAgPGEgc3R5bGU9ImZsb2F0OmNlbnRlciIgPgorICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPmphdmFzY3JpcHQ6ZGlzcGxheU91dCgnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwYWNrYWdlIi8+Ljx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPicpOzwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0ICYjMTg3OworICAgICAgICAgICAgICA8L2E+CisgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkPgorICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJzeXN0ZW0tZXJyL3RleHQoKSI+CisgICAgICAgICAgICAgIDxhPgorICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPmphdmFzY3JpcHQ6ZGlzcGxheUVycignPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwYWNrYWdlIi8+Ljx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPicpOzwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyICYjMTg3OworICAgICAgICAgICAgICA8L2E+CisgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorPC94c2w6dGVtcGxhdGU+CisKKzx4c2w6dGVtcGxhdGUgbmFtZT0icHJpbnQuY2xhc3MiID4KKyAgICA8dHI+CisgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj4KKyAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgorICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJ0ZXN0Y2FzZS9lcnJvciI+dW5pdHRlc3RzLWVycm9yPC94c2w6d2hlbj4KKyAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0idGVzdGNhc2UvZmFpbHVyZSI+dW5pdHRlc3RzLWVycm9yPC94c2w6d2hlbj4KKyAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT51bml0dGVzdHMtZGF0YTwveHNsOm90aGVyd2lzZT4KKyAgICAgICAgICAgIDwveHNsOmNob29zZT4KKyAgICAgICAgPC94c2w6YXR0cmlidXRlPgorICAgICAgICA8dGQgY29sc3Bhbj0iNSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwYWNrYWdlIi8+Ljx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvdGQ+CisgICAgPC90cj4KKzwveHNsOnRlbXBsYXRlPgorCis8IS0tCisgIFdyaXRlIG91dHB1dCBhbmQgZXJyIGludG8gYSBKYXZhU2NyaXB0IGRhdGEgc3RydWN0dXJlLgorICBUaGlzIGlzIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCBpZGVhIGJ5IEVyaWsgSGF0Y2hlciAoZWhhdGNoZXJAYXBhY2hlLm9yZykKKy0tPgorPCEtLXhzbDp0ZW1wbGF0ZSBtYXRjaD0ic3lzdGVtLW91dCIgbW9kZT0ianMucHJvcHMiID4KKyAgICBTeXN0ZW1PdXRbJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuLi9AcGFja2FnZSIvPi48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLi4vQG5hbWUiLz4nXSA9ICc8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iSlMtZXNjYXBlIj48eHNsOndpdGgtcGFyYW0gc2VsZWN0PSIuIiBuYW1lPSJzdHJpbmciLz48L3hzbDpjYWxsLXRlbXBsYXRlPic7Cis8L3hzbDp0ZW1wbGF0ZT4KKworPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ic3lzdGVtLWVyciIgbW9kZT0ianMucHJvcHMiID4KKyAgICBTeXN0ZW1FcnJbJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuLi9AcGFja2FnZSIvPi48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLi4vQG5hbWUiLz4nXSA9ICc8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iSlMtZXNjYXBlIj48eHNsOndpdGgtcGFyYW0gc2VsZWN0PSIuIiBuYW1lPSJzdHJpbmciLz48L3hzbDpjYWxsLXRlbXBsYXRlPic7Cis8L3hzbDp0ZW1wbGF0ZS0tPgorCis8eHNsOnRlbXBsYXRlIG1hdGNoPSJlcnJvcnxmYWlsdXJlIiBtb2RlPSJqcy5wcm9wcyIgPgorICAgIFByb2JsZW1bJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuLi8uLi9AcGFja2FnZSIvPi48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLi4vLi4vQG5hbWUiLz4uPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4uL0BuYW1lIi8+J10gPSAnPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9IkpTLWVzY2FwZSI+PHhzbDp3aXRoLXBhcmFtIHNlbGVjdD0iLiIgbmFtZT0ic3RyaW5nIi8+PC94c2w6Y2FsbC10ZW1wbGF0ZT4nOworPC94c2w6dGVtcGxhdGU+CisKKzwhLS0KKyAgV3JpdGUgcHJvcGVydGllcyBpbnRvIGEgSmF2YVNjcmlwdCBkYXRhIHN0cnVjdHVyZS4KKyAgVGhpcyBpcyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgaWRlYSBieSBFcmlrIEhhdGNoZXIgKGVoYXRjaGVyQGFwYWNoZS5vcmcpCistLT4KKzx4c2w6dGVtcGxhdGUgbWF0Y2g9InByb3BlcnRpZXMiIG1vZGU9ImpzLnByb3BzIiA+CisgICAgY3VyID0gVGVzdENhc2VzWyc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLi4vQHBhY2thZ2UiLz4uPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4uL0BuYW1lIi8+J10gPSBuZXcgQXJyYXkoKTsKKyAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0icHJvcGVydHkiPgorICAgICAgICA8eHNsOnNvcnQgc2VsZWN0PSJAbmFtZSIvPgorICAgICAgICBjdXJbJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiddID0gJzx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJKUy1lc2NhcGUiPjx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzdHJpbmciIHNlbGVjdD0iQHZhbHVlIi8+PC94c2w6Y2FsbC10ZW1wbGF0ZT4nOworICAgIDwveHNsOmZvci1lYWNoPgorPC94c2w6dGVtcGxhdGU+CisgICAgCis8eHNsOnRlbXBsYXRlIG5hbWU9IkpTLWVzY2FwZSI+CisgICAgPHhzbDpwYXJhbSBuYW1lPSJzdHJpbmciLz4JCQorICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iQ1IiIHNlbGVjdD0iJyYjeEQ7JyIvPgkJCQkJCisgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJMRiIgc2VsZWN0PSInJiN4QTsnIi8+CisgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJDUkxGIiBzZWxlY3Q9ImNvbmNhdCgkQ1IsICRMRikiLz4JCQkKKyAgICA8eHNsOmNob29zZT4KKyAgICAgICAgPCEtLSBjcmxmIC0tPgorICAgICAgICA8eHNsOndoZW4gdGVzdD0iY29udGFpbnMoJHN0cmluZywkQ1JMRikiPgorICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9IkpTLWVzY2FwZSI+CisgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InN0cmluZyIgc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKCRzdHJpbmcsJENSTEYpIi8+CisgICAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPjxici8+PHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9IkpTLWVzY2FwZSI+CisgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InN0cmluZyIgc2VsZWN0PSJzdWJzdHJpbmctYWZ0ZXIoJHN0cmluZywkQ1JMRikiLz4KKyAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICAgIDwveHNsOndoZW4+CisgICAgICAgIDwhLS0gY2FycmlhZ2UgcmV0dXJuIC0tPgorICAgICAgICA8eHNsOndoZW4gdGVzdD0iY29udGFpbnMoJHN0cmluZywkQ1IpIj4KKyAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJKUy1lc2NhcGUiPgorICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzdHJpbmciIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZSgkc3RyaW5nLCRDUikiLz4KKyAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+PGJyLz48eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iSlMtZXNjYXBlIj4KKyAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ic3RyaW5nIiBzZWxlY3Q9InN1YnN0cmluZy1hZnRlcigkc3RyaW5nLCRDUikiLz4KKyAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICAgIDwveHNsOndoZW4+CisgICAgICAgIDwhLS0gbGluZSBmZWVkIC0tPgorICAgICAgICA8eHNsOndoZW4gdGVzdD0iY29udGFpbnMoJHN0cmluZywkTEYpIj4KKyAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJKUy1lc2NhcGUiPgorICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzdHJpbmciIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZSgkc3RyaW5nLCRMRikiLz4KKyAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+PGJyLz48eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iSlMtZXNjYXBlIj4KKyAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ic3RyaW5nIiBzZWxlY3Q9InN1YnN0cmluZy1hZnRlcigkc3RyaW5nLCRMRikiLz4KKyAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICAgIDwveHNsOndoZW4+CisgICAgICAgIDwhLS0gc2luZ2xlIHF1b3RlIC0tPgorICAgICAgICA8eHNsOndoZW4gdGVzdD0iY29udGFpbnMoJHN0cmluZywmcXVvdDsnJnF1b3Q7KSI+CisgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iSlMtZXNjYXBlIj4KKyAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ic3RyaW5nIiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoJHN0cmluZywmcXVvdDsnJnF1b3Q7KSIvPgorICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT5cJmFwb3M7PHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9IkpTLWVzY2FwZSI+CisgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InN0cmluZyIgc2VsZWN0PSJzdWJzdHJpbmctYWZ0ZXIoJHN0cmluZywmcXVvdDsnJnF1b3Q7KSIvPgorICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgICAgPC94c2w6d2hlbj4KKyAgICAgICAgPCEtLSBlc2NhcGUgLS0+CisgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJjb250YWlucygkc3RyaW5nLCdcJykiPgorICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9IkpTLWVzY2FwZSI+CisgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InN0cmluZyIgc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKCRzdHJpbmcsJ1wnKSIvPgorICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT5cXDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJKUy1lc2NhcGUiPgorICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzdHJpbmciIHNlbGVjdD0ic3Vic3RyaW5nLWFmdGVyKCRzdHJpbmcsJ1wnKSIvPgorICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgICAgPC94c2w6d2hlbj4KKyAgICAgICAgPHhzbDpvdGhlcndpc2U+CisgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHN0cmluZyIvPgorICAgICAgICA8L3hzbDpvdGhlcndpc2U+CisgICAgPC94c2w6Y2hvb3NlPgorPC94c2w6dGVtcGxhdGU+CisKKzwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAveHNsL3VuaXR0ZXN0cy54c2wgYi9ncm9vdnkvY3J1aXNlL3JlcG9ydGluZy1hcHAveHNsL3VuaXR0ZXN0cy54c2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNiMDI0OQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9jcnVpc2UvcmVwb3J0aW5nLWFwcC94c2wvdW5pdHRlc3RzLnhzbApAQCAtMCwwICsxLDI2NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENydWlzZUNvbnRyb2wsIGEgQ29udGludW91cyBJbnRlZ3JhdGlvbiBUb29sa2l0CisgKiBDb3B5cmlnaHQgKGMpIDIwMDEsIFRob3VnaHRXb3JrcywgSW5jLgorICogNjUxIFcgV2FzaGluZ3RvbiBBdmUuIFN1aXRlIDYwMAorICogQ2hpY2FnbywgSUwgNjA2NjEgVVNBCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgICArIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogICAgICsgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqICAgICArIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhvdWdodFdvcmtzLCBJbmMuLCBDcnVpc2VDb250cm9sLCBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICogICAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogICAgICAgd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLS0+Cis8eHNsOnN0eWxlc2hlZXQKKyAgICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIgorICAgIHhtbG5zOmx4c2x0PSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdCI+CisKKyAgICA8eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiLz4KKworICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idGVzdHN1aXRlLmxpc3QiIHNlbGVjdD0iLy90ZXN0c3VpdGVzL3Rlc3RzdWl0ZSIvPgorICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idGVzdHN1aXRlLmVycm9yLmNvdW50IiBzZWxlY3Q9ImNvdW50KCR0ZXN0c3VpdGUubGlzdC9lcnJvcikiLz4KKyAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InRlc3RjYXNlLmxpc3QiIHNlbGVjdD0iJHRlc3RzdWl0ZS5saXN0L3Rlc3RjYXNlIi8+CisgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ0ZXN0Y2FzZS5lcnJvci5saXN0IiBzZWxlY3Q9IiR0ZXN0Y2FzZS5saXN0L2Vycm9yIi8+CisgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ0ZXN0Y2FzZS5mYWlsdXJlLmxpc3QiIHNlbGVjdD0iJHRlc3RjYXNlLmxpc3QvZmFpbHVyZSIvPgorICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idG90YWxFcnJvcnNBbmRGYWlsdXJlcyIgc2VsZWN0PSJjb3VudCgkdGVzdGNhc2UuZXJyb3IubGlzdCkgKyBjb3VudCgkdGVzdGNhc2UuZmFpbHVyZS5saXN0KSArICR0ZXN0c3VpdGUuZXJyb3IuY291bnQiLz4KKworICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPgorICAgICAgICA8dGFibGUgYWxpZ249ImNlbnRlciIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiIHdpZHRoPSI5OCUiPgorCisgICAgICAgICAgICA8IS0tIFVuaXQgVGVzdHMgLS0+CisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ1bml0dGVzdHMtc2VjdGlvbmhlYWRlciIgY29sc3Bhbj0iNCI+CisgICAgICAgICAgICAgICAgICAgJiMxNjA7VW5pdCBUZXN0czogKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb3VudCgkdGVzdGNhc2UubGlzdCkiLz4pCisgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgIDwvdHI+CisKKyAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgorICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJjb3VudCgkdGVzdHN1aXRlLmxpc3QpID0gMCI+CisgICAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0idW5pdHRlc3RzLWRhdGEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vIFRlc3RzIFJ1bgorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJ1bml0dGVzdHMtZXJyb3IiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcHJvamVjdCBkb2Vzbid0IGhhdmUgYW55IHRlc3RzCisgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgIDwveHNsOndoZW4+CisKKyAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHRvdGFsRXJyb3JzQW5kRmFpbHVyZXMgPSAwIj4KKyAgICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJ1bml0dGVzdHMtZGF0YSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIFRlc3RzIFBhc3NlZAorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjx0YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiR0ZXN0c3VpdGUubGlzdCI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpIG1vZCAyID0gMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj51bml0dGVzdHMtZXZlbnJvdzwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkgbW9kIDIgIT0gMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj51bml0dGVzdHMtb2Rkcm93PC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0idW5pdHRlc3RzLWRhdGEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb25jYXQoJ1N1aXRlOiAnLCBAbmFtZSkiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0idW5pdHRlc3RzLWRhdGEiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb25jYXQoJ1Rlc3RzOiAnLCBAdGVzdHMpIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9InVuaXR0ZXN0cy1kYXRhIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY29uY2F0KCdUaW1lOiAnLCBAdGltZSkiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+CisgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+PC90ZD4KKyAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgorICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgorICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICA8dGQ+CisgICAgICAgICAgICAgICAgIDx0YWJsZSBhbGlnbj0iY2VudGVyIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiIGJvcmRlcj0iMCIgd2lkdGg9Ijk4JSI+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iJHRlc3RjYXNlLmVycm9yLmxpc3QiLz4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIkdGVzdGNhc2UuZmFpbHVyZS5saXN0Ii8+CisgICAgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgPHRyLz4KKyAgICAgICAgICAgIDx0cj48dGQgY29sc3Bhbj0iMiI+JiMxNjA7PC90ZD48L3RyPgorCisgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiR0b3RhbEVycm9yc0FuZEZhaWx1cmVzID4gMCI+CisKKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0idW5pdHRlc3RzLXNlY3Rpb25oZWFkZXIiIGNvbHNwYW49IjQiPgorICAgICAgICAgICAgICAgICAgICAmIzE2MDtVbml0IFRlc3QgRXJyb3IgRGV0YWlsczomIzE2MDsoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0b3RhbEVycm9yc0FuZEZhaWx1cmVzIi8+KQorICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgIDwvdHI+CisKKyAgICAgICAgICAgICAgPCEtLSAoUEVORElORykgV2h5IGRvZXNuJ3QgdGhpcyB3b3JrIGlmIHNldCB1cCBhcyB2YXJpYWJsZXMgdXAgdG9wPyAtLT4KKyAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRlc3RkZXRhaWwiPgorICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXRhaWxub2RlcyIgc2VsZWN0PSIvL3Rlc3RzdWl0ZXMvdGVzdHN1aXRlL3Rlc3RjYXNlWy4vL2Vycm9yXSIvPgorICAgICAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorCisgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ0ZXN0ZGV0YWlsIj4KKyAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGV0YWlsbm9kZXMiIHNlbGVjdD0iLy90ZXN0c3VpdGVzL3Rlc3RzdWl0ZS90ZXN0Y2FzZVsuLy9mYWlsdXJlXSIvPgorICAgICAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorCisKKyAgICAgICAgICAgICAgPHRyPjx0ZCBjb2xzcGFuPSIyIj4mIzE2MDs8L3RkPjwvdHI+CisgICAgICAgICAgICA8L3hzbDppZj4KKworCisgICAgICAgIDwvdGFibGU+CisgICAgPC94c2w6dGVtcGxhdGU+CisKKyAgICA8IS0tIFVuaXRUZXN0IEVycm9ycyAtLT4KKyAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJlcnJvciI+CisgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSBtb2QgMiA9IDAiPgorICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj51bml0dGVzdHMtb2Rkcm93PC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgPC94c2w6aWY+CisKKyAgICAgICAgICAgIDx0ZCBjbGFzcz0idW5pdHRlc3RzLWRhdGEiPgorICAgICAgICAgICAgICAgIGVycm9yCisgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgPHRkIGNsYXNzPSJ1bml0dGVzdHMtZGF0YSIgd2lkdGg9IjQwJSI+CisgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4uL0BuYW1lIi8+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgPHRkIGNsYXNzPSJ1bml0dGVzdHMtZGF0YSIgd2lkdGg9IjQwJSI+CisgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4uLy8uLi8vQG5hbWUiLz4KKyAgICAgICAgICAgIDwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgPC94c2w6dGVtcGxhdGU+CisKKyAgICA8IS0tIFVuaXRUZXN0IEZhaWx1cmVzIC0tPgorICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImZhaWx1cmUiPgorICAgICAgICA8dHI+CisgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IigkdGVzdHN1aXRlLmVycm9yLmNvdW50ICsgcG9zaXRpb24oKSkgbW9kIDIgPSAwIj4KKyAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyI+dW5pdHRlc3RzLW9kZHJvdzwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDwveHNsOmlmPgorCisgICAgICAgICAgICA8dGQgY2xhc3M9InVuaXR0ZXN0cy1kYXRhIj4KKyAgICAgICAgICAgICAgICBmYWlsdXJlCisgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgPHRkIGNsYXNzPSJ1bml0dGVzdHMtZGF0YSIgd2lkdGg9IjQwJSI+CisgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4uL0BuYW1lIi8+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgPHRkIGNsYXNzPSJ1bml0dGVzdHMtZGF0YSIgd2lkdGg9IjQwJSI+CisgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4uLy8uLi8vQG5hbWUiLz4KKyAgICAgICAgICAgIDwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgPC94c2w6dGVtcGxhdGU+CisKKyAgICA8IS0tIFVuaXRUZXN0IEVycm9ycyBBbmQgRmFpbHVyZXMgRGV0YWlsIFRlbXBsYXRlIC0tPgorICAgIDx4c2w6dGVtcGxhdGUgbmFtZT0idGVzdGRldGFpbCI+CisgICAgICA8eHNsOnBhcmFtIG5hbWU9ImRldGFpbG5vZGVzIi8+CisKKyAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZGV0YWlsbm9kZXMiPgorCisgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0idW5pdHRlc3RzLWRhdGEiPgorICAgICAgICAgICAgICAgIFRlc3Q6JiMxNjA7PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9InVuaXR0ZXN0cy1kYXRhIj4KKyAgICAgICAgICAgICAgICBDbGFzczomIzE2MDs8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLi4vL0BuYW1lIi8+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICA8L3RyPgorCisgICAgICAgIDx4c2w6aWYgdGVzdD0iZXJyb3IiPgorICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0idW5pdHRlc3RzLWRhdGEiPgorICAgICAgICAgICAgICAgICAgICBUeXBlOiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iZXJyb3IvQHR5cGUiIC8+CisgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0idW5pdHRlc3RzLWRhdGEiPgorICAgICAgICAgICAgICAgIE1lc3NhZ2U6IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJlcnJvci9AbWVzc2FnZSIgLz4KKyAgICAgICAgICAgIDwvdGQ+CisgICAgICAgIDwvdHI+CisKKyAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJ1bml0dGVzdHMtZXJyb3IiPgorICAgICAgICAgICAgICAgIDxQUkU+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJici1yZXBsYWNlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ3b3JkIiBzZWxlY3Q9ImVycm9yIiAvPgorICAgICAgICAgICAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgICAgICAgICAgICAgIDwvUFJFPgorICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPC94c2w6aWY+CisKKyAgICAgICAgPHhzbDppZiB0ZXN0PSJmYWlsdXJlIj4KKyAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJ1bml0dGVzdHMtZGF0YSI+CisgICAgICAgICAgICAgICAgVHlwZTogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImZhaWx1cmUvQHR5cGUiIC8+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9InVuaXR0ZXN0cy1kYXRhIj4KKyAgICAgICAgICAgICAgICBNZXNzYWdlOiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iZmFpbHVyZS9AbWVzc2FnZSIgLz4KKyAgICAgICAgICAgIDwvdGQ+CisgICAgICAgIDwvdHI+CisKKyAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJ1bml0dGVzdHMtZmFpbHVyZSI+CisgICAgICAgICAgICAgICAgPHByZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImJyLXJlcGxhY2UiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9IndvcmQiIHNlbGVjdD0iZmFpbHVyZSIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgICAgICAgICAgICAgIDwvcHJlPgorICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPC94c2w6aWY+CisKKyAgICAgIDwveHNsOmZvci1lYWNoPgorICAgIDwveHNsOnRlbXBsYXRlPgorCisgICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJici1yZXBsYWNlIj4KKyAgICAgICAgPHhzbDpwYXJhbSBuYW1lPSJ3b3JkIi8+Cis8IS0tIDwveHNsOnRleHQ+IG9uIG5leHQgbGluZSBvbiBwdXJwb3NlIHRvIGdldCBuZXdsaW5lIC0tPgorPHhzbDp2YXJpYWJsZSBuYW1lPSJjciI+PHhzbDp0ZXh0PgorPC94c2w6dGV4dD48L3hzbDp2YXJpYWJsZT4KKyAgICAgICAgPHhzbDpjaG9vc2U+CisgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iY29udGFpbnMoJHdvcmQsJGNyKSI+CisgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoJHdvcmQsJGNyKSIvPgorICAgICAgICAgICAgICAgIDxici8+CisgICAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImJyLXJlcGxhY2UiPgorICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ3b3JkIiBzZWxlY3Q9InN1YnN0cmluZy1hZnRlcigkd29yZCwkY3IpIi8+CisgICAgICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgICAgICAgIDwveHNsOndoZW4+CisgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KKyAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHdvcmQiLz4KKyAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KKyAgICAgICAgPC94c2w6Y2hvb3NlPgorICAgIDwveHNsOnRlbXBsYXRlPgorCisKKzwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS9ncm9vdnkvZXhwZXJpbWVudGFsL1Rlc3RNZXRhLmphdmEgYi9ncm9vdnkvZXhwZXJpbWVudGFsL1Rlc3RNZXRhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg3NGQ5OQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9leHBlcmltZW50YWwvVGVzdE1ldGEuamF2YQpAQCAtMCwwICsxLDgwIEBACitpbXBvcnQgZ3Jvb3Z5LmxhbmcuTWV0YUNsYXNzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5JbnZva2VySGVscGVyOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5NZXRhQ2xhc3NBY3Rpb25zOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5NZXRhQ2xhc3NBY3Rpb25zR2VuZXJhdG9yOworCisvKgorICogQ29weXJpZ2h0IDIwMDUgSm9obiBHLiBXaWxzb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworLyoqCisgKiBAYXV0aG9yIEpvaG4gV2lsc29uCisgKgorICovCisKK3B1YmxpYyBjbGFzcyBUZXN0TWV0YSB7CisgIAorICAvKioKKyAgICogQHBhcmFtIGFyZ3MKKyAgICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geyAgIAorICAgIGZpbmFsIE1ldGFDbGFzc0FjdGlvbnMgYTEgPSBNZXRhQ2xhc3NBY3Rpb25zR2VuZXJhdG9yLmdldEFjdGlvbnMoQXJyYXlMaXN0LmNsYXNzKTsKKyAgICBmaW5hbCBNZXRhQ2xhc3NBY3Rpb25zIGEyID0gTWV0YUNsYXNzQWN0aW9uc0dlbmVyYXRvci5nZXRBY3Rpb25zKEhhc2hNYXAuY2xhc3MpOworICAgIGZpbmFsIE1ldGFDbGFzcyBtMSA9IEludm9rZXJIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRNZXRhUmVnaXN0cnkoKS5nZXRNZXRhQ2xhc3MoQXJyYXlMaXN0LmNsYXNzKTsKKyAgICBmaW5hbCBNZXRhQ2xhc3MgbTIgPSBJbnZva2VySGVscGVyLmdldEluc3RhbmNlKCkuZ2V0TWV0YVJlZ2lzdHJ5KCkuZ2V0TWV0YUNsYXNzKEhhc2hNYXAuY2xhc3MpOworICAgIGZpbmFsIEFycmF5TGlzdCBpMSA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICBmaW5hbCBIYXNoTWFwIGkyID0gbmV3IEhhc2hNYXAoKTsKKyAgICBmaW5hbCBJbnRlZ2VyIHplcm8gPSBuZXcgSW50ZWdlcigwKTsKKyAgICAKKyAgICBpMS5hZGQobmV3IEludGVnZXIoMCkpOworICAgIGkxLmFkZChuZXcgSW50ZWdlcigxKSk7CisgICAgaTEuYWRkKG5ldyBJbnRlZ2VyKDApKTsKKyAgICBpMS5hZGQobmV3IEludGVnZXIoMykpOworICAgIAorICAgIFN5c3RlbS5vdXQucHJpbnRsbihtMS5pbnZva2VNZXRob2QoaTEsICJjb3VudCIsIG5ldyBPYmplY3RbXXt6ZXJvfSkpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbihhMS5kb0ludm9rZU1ldGhvZChpMSwgImNvdW50IiwgbmV3IE9iamVjdFtde3plcm99KSk7CisgICAgCisgICAgZmluYWwgU3RyaW5nIG1ldGhvZCA9ICJ0b0FycmF5IjsKKyAgICAKKyAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgCisgICAgZm9yIChpbnQgaSA9IDA7IGkgIT0gMTAwMDAwMDA7IGkrKykgeworICAgICAgbTEuaW52b2tlTWV0aG9kKGkxLCBtZXRob2QsIG5ldyBPYmplY3RbXXt9KTsKKyAgICB9CisgICAgCisgICAgU3lzdGVtLm91dC5wcmludGxuKCJUaW1lIHRha2VuIHZpYSBNZXRhQ2xhc3M6ICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydCkpOworICAgIAorICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgCisgICAgZm9yIChpbnQgaSA9IDA7IGkgIT0gMTAwMDAwMDA7IGkrKykgeworICAgICAgYTEuZG9JbnZva2VNZXRob2QoaTEsIG1ldGhvZCwgbmV3IE9iamVjdFtde30pOworICAgIH0KKyAgICAKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRpbWUgdGFrZW4gdmlhIE1ldGFDbGFzc0FjdGlvbnM6ICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydCkpOworICAgIAorICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgCisgICAgZm9yIChpbnQgaSA9IDA7IGkgIT0gMTAwMDAwMDA7IGkrKykgeworICAgICAgaTEudG9BcnJheSgpOworICAgIH0KKyAgICAKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRpbWUgdGFrZW4gdmlhIGRpcmVjdCBjYWxsOiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQpKTsKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9leHBlcmltZW50YWwvZ3Jvb3Z5L2xhbmcvTU9QLmphdmEgYi9ncm9vdnkvZXhwZXJpbWVudGFsL2dyb292eS9sYW5nL01PUC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiOGUxZGIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvZXhwZXJpbWVudGFsL2dyb292eS9sYW5nL01PUC5qYXZhCkBAIC0wLDAgKzEsMTY2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDUgSm9obiBHLiBXaWxzb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBncm9vdnkubGFuZzsKKworLyoqCisgKiBAYXV0aG9yIEpvaG4gV2lsc29uCisgKgorICovCisKKy8qKgorICogVGhpcyBpbnRlZmFjZSBkZWZpbmVzIHRoZXcgTWV0YSBPYmplY3QgUHJvdG9jb2wgaW1wbGVtZW50ZWQgYnkgdGhlIE1ldGFDbGFzcworICogTm90ZSB0aGF0IHRoaXMgaW50ZWZhY2UgaXMgcHVyZWx5IGZvciBkb2N1bWFudGF0aW9uIHB1cnBvc2VzCisgKiBBbiBvYmplY3QgaW1wbGVtZW50aW5nIHRoaXMgaW50ZXJmYWNlIGlzIG5vdCBuZWNjZXNhcmlseSBhIHZhaWxkIE1ldGFDbGFzcworICogQSBNZXRhQ2xhc3MgbmVlZHMgdG8gaW1wbGVtZW50IG1heSBtb3JlIG1ldGhvZHMKKyAqCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTU9QIHsKKyAgICBzdGF0aWMgZmluYWwgT2JqZWN0IE5PVF9DQUxMRUQgPSBuZXcgT2JqZWN0KCk7CisgICAgc3RhdGljIGZpbmFsIE9iamVjdCBOT19QUk9QRVJUWSA9IG5ldyBPYmplY3QoKTsKKyAgICBzdGF0aWMgZmluYWwgT2JqZWN0IE5PX0FUVFJJQlVURSA9IG5ldyBPYmplY3QoKTsKKworICAgIC8qKgorICAgICAqIEludm9rZSBhIHB1YmxpYyBtZXRob2Qgb24gYW4gb2JqZWN0LgorICAgICAqIFB1YmxpYyBtZXRob2RzIGFyZSB0aG9zZSBkZWNsYXJlZCBwdWJsaWMgaW4gdGhlIGNsYXNzIGFuZCB0aG9zZSBhZGRlZCB2aWEgbWVjaGFuaXNtcyBsaWtlIERlZmF1bHRHcm9vdnlNZXRob2RzLgorICAgICAqIElmIG5vIHN1aXRhYmxlIG1ldGhvZCBpcyBmb3VuZCBhIGdyb292eS5sYW5nLk1pc3NpbmdNZXRob2RFeGNlcHRpb24gaXMgdGhyb3duLgorICAgICAqIEBwYXJhbSBvYmplY3QKKyAgICAgKiBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBjYWxsIGlzIHRvIGJlIG1hZGUKKyAgICAgKiBAcGFyYW0gb2JqZWN0VHlwZQorICAgICAqIElmIG9iamVjdFR5cGUgaXMgbm90IG51bGwgdGhlbiBtZXRob2QgdG8gYmUgY2FsbGVkIGlzIHNlbGVjdGVkIGFzIHRob3VnaCB0aGUgb2JqZWN0IHdhcyBjYXN0IHRvIHRoaXMgdHlwZSBiZWZvcmUgbWFraW5nIHRoZSBjYWxsLgorICAgICAqIEBwYXJhbSBtZXRob2ROYW1lCisgICAgICogVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0byBiZSBjYWxsZWQKKyAgICAgKiBAcGFyYW0gYXJndW1lbnRzCisgICAgICogVGhlIGFyZ3VtZW50cyB0byB0aGUgY2FsbC4KKyAgICAgKiBJZiBOT1RfQ0FMTEVEIGlzIHJldHVybmVkIGFuZCB0aGVyZSBpcyBhIHByaXZhdGUgb3IgcHJvdGVjdGVkIG1ldGhvZCB3aGljaAorICAgICAqIHNob3VsZCBiZSBjYWxsZWQgdGhlbiB0aGlzIGFycmF5IHdpbGwgY29udGFpbiB0aGUgcGFyYW1ldGVycyB0byB0aGF0IG1ldGhvZC4gVGhlIE1ldGFDbGFzcyB3aWxsIGhhdmUgZG9uZSBhbnkgY29udmVyc2lvbnMKKyAgICAgKiAoZS5nLiBHU3RyaW5nIHRvIFN0cmluZykgbmVlZGVkIHRvIGFsbG93IHRoZSBjYWxsIHRvIHN1Y2VlZC4KKyAgICAgKiBJZiBhbnkgb3RoZXIgdmFsdWUgaXMgcmV0dXJuZWQgdGhlbiB0aGUgdmFsdWVzIGluIHRoaXMgYXJyYXkgYXJlIHVuZGVmaW5lZC4gSW4gdGhpcyBjYXNlIHRoZSBNZXRhQ2xhc3MgbWF5IG9yIG1heSBub3QKKyAgICAgKiBjaGFuZ2UgdGhlc2UgdmFsdWVzLiBETyBOT1QgdXNlIHRoZXNlIHZhbHVlcyB1bmxlc3MgTk9UX0NBTExFRCBpcyByZXR1cm5lZC4KKyAgICAgKiBAcGFyYW0gYXJndW1lbnRUeXBlcworICAgICAqIFRoaXMgYXJyYXkgbXVzdCBiZSB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIGFyZ3VtZW50cyBhcmd1bWVudHMgYXJyYXkuCisgICAgICogSXQgY29udGFpbnMgdGhlIHR5cGUgb2YgZWFjaCBwYXJhbWV0ZXIgaWYga25vd24gb3IgbnVsbCBpZiB1bmtub3duLgorICAgICAqIFRoZSBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgbWV0aG9kcyB3aXRoIHRoZSBzYW1lIG5hbWUgYW5kIG51bWJlciBvZiBwYXJhbWV0ZXJzIHRoZW4gdGhpcyBpbmZvcm1hdGlvbgorICAgICAqIGNvbnRyaWJ1dGVzIHRvIHRoZSBzZWxlY3Rpb24gb2YgdGhlIGNvcnJlY3QgbWV0aG9kIHRvIGNhbGwuCisgICAgICogSWYgTk9UX0NBTExFRCBpcyByZXR1cm5lZCBhbmQgdGhlcmUgaXMgYSBwcml2YXRlIG9yIHByb3RlY3RlZCBtZXRob2Qgd2hpY2gKKyAgICAgKiBzaG91bGQgYmUgY2FsbGVkIHRoZW4gdGhpcyBhcnJheSB3aWxsIGNvbnRhaW4gdGhlIGNsYXNzZXMgd2hpY2ggcmVwcmVzZW50IHRoZSB0eXBlcyBvZiB0aGUgcGFyYW1ldGVycyB0byB0aGF0IG1ldGhvZC4KKyAgICAgKiBJZiBhbnkgb3RoZXIgdmFsdWUgaXMgcmV0dXJuZWQgdGhlbiB0aGUgdmFsdWVzIGluIHRoaXMgYXJyYXkgYXJlIHVuZGVmaW5lZC4gSW4gdGhpcyBjYXNlIHRoZSBNZXRhQ2xhc3MgbWF5IG9yIG1heSBub3QKKyAgICAgKiBjaGFuZ2UgdGhlc2UgdmFsdWVzLiBETyBOT1QgdXNlIHRoZXNlIHZhbHVlcyB1bmxlc3MgTk9UX0NBTExFRCBpcyByZXR1cm5lZC4KKyAgICAgKiBAcmV0dXJuCisgICAgICogVGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSBtZXRob2QgKG51bGwgaXMgcmV0dXJuZWQgaWYgdGhlIG1ldGhvZCByZXR1cm5zIHZvaWQpLgorICAgICAqLworICAgIE9iamVjdCBpbnZva2VNZXRob2QoIE9iamVjdCBvYmplY3QsICBDbGFzcyBvYmplY3RUeXBlLCAgU3RyaW5nIG1ldGhvZE5hbWUsICBPYmplY3RbXSBhcmd1bWVudHMsICBDbGFzc1tdIGFyZ3VtZW50VHlwZXMpOworICAgIAorICAgIE9iamVjdCBnZXRQcm9wZXJ0eSggT2JqZWN0IG9iamVjdCwgIENsYXNzIG9iamVjdFR5cGUsICBTdHJpbmcgcHJvcGVydHkpOworICAgIAorICAgIHZvaWQgc2V0UHJvcGVydHkoIE9iamVjdCBvYmplY3QsICBDbGFzcyBvYmplY3RUeXBlLCAgU3RyaW5nIHByb3BlcnR5LCAgT2JqZWN0IG5ld1ZhbHVlLCAgQ2xhc3MgbmV3VmFsdWVUeXBlKTsKKyAgICAKKyAgICBPYmplY3QgZ2V0QXR0cmlidXRlKCBPYmplY3Qgb2JqZWN0LCAgQ2xhc3Mgb2JqZWN0VHlwZSwgIFN0cmluZyBhdHRyaWJ1dGUpOworICAgIAorICAgIHZvaWQgc2V0QXR0cmlidXRlKCBPYmplY3Qgb2JqZWN0LCAgQ2xhc3Mgb2JqZWN0VHlwZSwgIFN0cmluZyBhdHRyaWJ1dGUsICBPYmplY3QgbmV3VmFsdWUsICBDbGFzcyBuZXdWYWx1ZVR5cGUpOworICAgIAorICAgIC8qKgorICAgICAqIEludm9rZSBhIHB1YmxpYyBtZXRob2Qgb24gYW4gb2JqZWN0LgorICAgICAqIFRoZXNlIHB1YmxpYyBtZXRob2RzIGFyZSB0aG9zZSBkZWNsYXJlZCBwdWJsaWMgaW4gdGhlIGNsYXNzIGFuZCB0aG9zZSBhZGRlZCB2aWEgbWVjaGFuaXNtcyBsaWtlIERlZmF1bHRHcm9vdnlNZXRob2RzLgorICAgICAqIElmIG5vIHB1YmxpYyBtZXRob2QgY2FuIGJlIGZvdW5kIGJ1dCB0aGVyZSBleGlzdHMgcHJvdGVjdGVkIG9yIHByaXZhdGUgbWV0aG9kcyB3aGljaCB3b3VsZCBtYXRjaCB0aGUgbmFtZSwgbnVtYmVyIGFuZCB0eXBlCisgICAgICogb2YgdGhlIHBhcmFtZXRlcnMgdGhlbiB0aGUgdmFsdWUgTk9UX0NBTExFRCBpcyByZXR1cm5lZC4KKyAgICAgKiBPaGVyd2lzZSBhIGdyb292eS5sYW5nLk1pc3NpbmdNZXRob2RFeGNlcHRpb24gaXMgdGhyb3duLgorICAgICAqIEBwYXJhbSBvYmplY3QKKyAgICAgKiBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBjYWxsIGlzIHRvIGJlIG1hZGUKKyAgICAgKiBAcGFyYW0gdGhpc1R5cGUKKyAgICAgKiBUaGUgdHlwZSBvZiB0aGUgY2xhc3MgaW4gd2hpY2ggdGhpcyBjYWxsIHdhcyBtYWRlLiBUaGlzIG11c3QgbmV2ZXIgYmUgbnVsbC4KKyAgICAgKiBOb3RlIHRoaXMgdHlwZSB2YWxpZSBtYXkgbm90IGJlIHRoZSBzYW1lIGFzIG9iamVjdC5nZXRDbGFzcygpIGFzIGl0IG15IGJlIGEgc3VwZXJjbGFzcyBvZiB0aGF0IGNsYXNzLgorICAgICAqIEBwYXJhbSBtZXRob2ROYW1lCisgICAgICogVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0byBiZSBjYWxsZWQKKyAgICAgKiBAcGFyYW0gYXJndW1lbnRzCisgICAgICogVGhlIGFyZ3VtZW50cyB0byB0aGUgY2FsbC4KKyAgICAgKiBJZiBOT1RfQ0FMTEVEIGlzIHJldHVybmVkIGFuZCB0aGVyZSBpcyBhIHByaXZhdGUgb3IgcHJvdGVjdGVkIG1ldGhvZCB3aGljaAorICAgICAqIHNob3VsZCBiZSBjYWxsZWQgdGhlbiB0aGlzIGFycmF5IHdpbGwgY29udGFpbiB0aGUgcGFyYW1ldGVycyB0byB0aGF0IG1ldGhvZC4gVGhlIE1ldGFDbGFzcyB3aWxsIGhhdmUgZG9uZSBhbnkgY29udmVyc2lvbnMKKyAgICAgKiAoZS5nLiBHU3RyaW5nIHRvIFN0cmluZykgbmVlZGVkIHRvIGFsbG93IHRoZSBjYWxsIHRvIHN1Y2NlZWQuCisgICAgICogSWYgYW55IG90aGVyIHZhbHVlIGlzIHJldHVybmVkIHRoZW4gdGhlIHZhbHVlcyBpbiB0aGlzIGFycmF5IGFyZSB1bmRlZmluZWQuIEluIHRoaXMgY2FzZSB0aGUgTWV0YUNsYXNzIG1heSBvciBtYXkgbm90CisgICAgICogY2hhbmdlIHRoZXNlIHZhbHVlcy4gRE8gTk9UIHVzZSB0aGVzZSB2YWx1ZXMgdW5sZXNzIE5PVF9DQUxMRUQgaXMgcmV0dXJuZWQuCisgICAgICogQHBhcmFtIGFyZ3VtZW50VHlwZXMKKyAgICAgKiBUaGlzIGFycmF5IG11c3QgYmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBhcmd1bWVudHMgYXJndW1lbnRzIGFycmF5LgorICAgICAqIEl0IGNvbnRhaW5zIHRoZSB0eXBlIG9mIGVhY2ggcGFyYW1ldGVyIGlmIGtub3duIG9yIG51bGwgaWYgdW5rbm93bi4KKyAgICAgKiBUaGUgaWYgdGhlcmUgYXJlIG11bHRpcGxlIG1ldGhvZHMgd2l0aCB0aGUgc2FtZSBuYW1lIGFuZCBudW1iZXIgb2YgcGFyYW1ldGVycyB0aGVuIHRoaXMgaW5mb3JtYXRpb24KKyAgICAgKiBjb250cmlidXRlcyB0byB0aGUgc2VsZWN0aW9uIG9mIHRoZSBjb3JyZWN0IG1ldGhvZCB0byBjYWxsLgorICAgICAqIElmIE5PVF9DQUxMRUQgaXMgcmV0dXJuZWQgYW5kIHRoZXJlIGlzIGEgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgbWV0aG9kIHdoaWNoCisgICAgICogc2hvdWxkIGJlIGNhbGxlZCB0aGVuIHRoaXMgYXJyYXkgd2lsbCBjb250YWluIHRoZSBjbGFzc2VzIHdoaWNoIHJlcHJlc2VudCB0aGUgdHlwZXMgb2YgdGhlIHBhcmFtZXRlcnMgdG8gdGhhdCBtZXRob2QuCisgICAgICogSWYgYW55IG90aGVyIHZhbHVlIGlzIHJldHVybmVkIHRoZW4gdGhlIHZhbHVlcyBpbiB0aGlzIGFycmF5IGFyZSB1bmRlZmluZWQuIEluIHRoaXMgY2FzZSB0aGUgTWV0YUNsYXNzIG1heSBvciBtYXkgbm90CisgICAgICogY2hhbmdlIHRoZXNlIHZhbHVlcy4gRE8gTk9UIHVzZSB0aGVzZSB2YWx1ZXMgdW5sZXNzIE5PVF9DQUxMRUQgaXMgcmV0dXJuZWQuCisgICAgICogQHJldHVybgorICAgICAqIEVpdGhlciB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhlIG1ldGhvZCAobnVsbCBpcyByZXR1cm5lZCBpZiB0aGUgbWV0aG9kIHJldHVybnMgdm9pZCkgb3IgdGhlIHZhbHVlIE5PVF9DQUxMRUQuCisgICAgICogTk9UX0NBTExFRCBpcyByZXR1cm5lZCBpZiBhIHN1aXRhYmxlIG1ldGhvZCBleGlzdHMgYnV0IHRoZSBNZXRhQ2xhc3MgZGlkIG5vdCBjYWxsIGl0IGJlY2F1c2UgaXQgaXMgbm90IHB1YmxpYy4KKyAgICAgKiBJbiB0aGlzIGNhc2UgdGhlIGNhbGxlciBpcyBmcmVlIHRvIHRyeSB0byBpbnZva2UgdGhlIG1ldGhvZCBpdHNlbGYgKGUuZy4gYnkgZXhlY3V0aW5nIGdlbmVyYXRlZCBieXRlY29kZSkuCisgICAgICogSWYgdGhlcmUgYXJlIG11bHRpcGxlIG1ldGhvZHMgd2l0aCB0aGUgc2FtZSBuYW1lIGFuZCBudW1iZXIgb2YgcGFyYW1ldGVycyB0aGVuIHRoZSB2YWx1ZXMgb24gdGhlIGFycmF5IHBhc3NlZAorICAgICAqIGFzIGFyZ3VtZW50VHlwZXMgc2hvdWxkIGJlIHVzZWQgdG8gY2hvb3NlIHRoZSBjb3JyZWN0IG9uZSB0byBjYWxsLgorICAgICAqLworICAgIE9iamVjdCBpbnZva2VUaGlzTWV0aG9kKCBPYmplY3Qgb2JqZWN0LCAgQ2xhc3MgdGhpc1R5cGUsICBTdHJpbmcgbWV0aG9kTmFtZSwgIE9iamVjdFtdIGFyZ3VtZW50cywgIENsYXNzW10gYXJndW1lbnRUeXBlcyk7CisgICAgCisgICAgT2JqZWN0IGdldFRoaXNQcm9wZXJ0eSggT2JqZWN0IG9iamVjdCwgIENsYXNzIHRoaXNUeXBlLCAgU3RyaW5nIHByb3BlcnR5KTsKKyAgICAKKyAgICBib29sZWFuIHNldFRoaXNQcm9wZXJ0eSggT2JqZWN0IG9iamVjdCwgIENsYXNzIHRoaXNUeXBlLCAgU3RyaW5nIHByb3BlcnR5LCAgT2JqZWN0IG5ld1ZhbHVlLCAgQ2xhc3MgbmV3VmFsdWVUeXBlKTsKKyAgICAKKyAgICBPYmplY3QgZ2V0VGhpc0F0dHJpYnV0ZSggT2JqZWN0IG9iamVjdCwgIENsYXNzIHRoaXNUeXBlLCAgU3RyaW5nIGF0dHJpYnV0ZSk7CisgICAgCisgICAgYm9vbGVhbiBzZXRUaGlzQXR0cmlidXRlKCBPYmplY3Qgb2JqZWN0LCAgQ2xhc3MgdGhpc1R5cGUsICBTdHJpbmcgYXR0cmlidXRlLCAgT2JqZWN0IG5ld1ZhbHVlLCAgQ2xhc3MgbmV3VmFsdWVUeXBlKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBJbnZva2UgYW4gYWRkZWQgbWV0aG9kIG9uIGFuIG9iamVjdC4gTWV0aG9kcyBhcmUgYWRkZWQgdmlhIG1lY2hhbmlzbXMgbGlrZSBEZWZhdWx0R3Jvb3Z5TWV0aG9kcy4KKyAgICAgKiBJZiBubyBhZGRlZCBtZXRob2QgY2FuIGJlIGZvdW5kIGJ1dCB0aGVyZSBleGlzdHMgcHVibGljLCBwcm90ZWN0ZWQgb3IgcHJpdmF0ZSBtZXRob2RzIG9uIHRoZSBzcGVjaWZpZWQgc3VwZXJjbGFzcworICAgICAqIHdoaWNoIHdvdWxkIG1hdGNoIHRoZSBuYW1lLCBudW1iZXIgYW5kIHR5cGUgb2YgdGhlIHBhcmFtZXRlcnMgdGhlbiB0aGUgdmFsdWUgTk9UX0NBTExFRCBpcyByZXR1cm5lZC4KKyAgICAgKiBPaGVyd2lzZSBhIGdyb292eS5sYW5nLk1pc3NpbmdNZXRob2RFeGNlcHRpb24gaXMgdGhyb3duLgorICAgICAqIEBwYXJhbSBvYmplY3QKKyAgICAgKiBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBjYWxsIGlzIHRvIGJlIG1hZGUKKyAgICAgKiBAcGFyYW0gc3VwZXJjbGFzc1R5cGUKKyAgICAgKiBUaGUgdHlwZSBvZiB0aGUgc3VwZXJjbGFzcy4gVGhpcyBtdXN0IG5ldmVyIGJlIG51bGwuCisgICAgICogQHBhcmFtIG1ldGhvZE5hbWUKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kIHRvIGJlIGNhbGxlZAorICAgICAqIEBwYXJhbSBhcmd1bWVudHMKKyAgICAgKiBUaGUgYXJndW1lbnRzIHRvIHRoZSBjYWxsLgorICAgICAqIElmIE5PVF9DQUxMRUQgaXMgcmV0dXJuZWQgYW5kIHRoZXJlIGlzIGEgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgbWV0aG9kIHdoaWNoCisgICAgICogc2hvdWxkIGJlIGNhbGxlZCB0aGVuIHRoaXMgYXJyYXkgd2lsbCBjb250YWluIHRoZSBwYXJhbWV0ZXJzIHRvIHRoYXQgbWV0aG9kLiBUaGUgTWV0YUNsYXNzIHdpbGwgaGF2ZSBkb25lIGFueSBjb252ZXJzaW9ucworICAgICAqIChlLmcuIEdTdHJpbmcgdG8gU3RyaW5nKSBuZWVkZWQgdG8gYWxsb3cgdGhlIGNhbGwgdG8gc3VjY2VlZC4KKyAgICAgKiBJZiBhbnkgb3RoZXIgdmFsdWUgaXMgcmV0dXJuZWQgdGhlbiB0aGUgdmFsdWVzIGluIHRoaXMgYXJyYXkgYXJlIHVuZGVmaW5lZC4gSW4gdGhpcyBjYXNlIHRoZSBNZXRhQ2xhc3MgbWF5IG9yIG1heSBub3QKKyAgICAgKiBjaGFuZ2UgdGhlc2UgdmFsdWVzLiBETyBOT1QgdXNlIHRoZXNlIHZhbHVlcyB1bmxlc3MgTk9UX0NBTExFRCBpcyByZXR1cm5lZC4KKyAgICAgKiBAcGFyYW0gYXJndW1lbnRUeXBlcworICAgICAqIFRoaXMgYXJyYXkgbXVzdCBiZSB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIGFyZ3VtZW50cyBhcmd1bWVudHMgYXJyYXkuCisgICAgICogSXQgY29udGFpbnMgdGhlIHR5cGUgb2YgZWFjaCBwYXJhbWV0ZXIgaWYga25vd24gb3IgbnVsbCBpZiB1bmtub3duLgorICAgICAqIFRoZSBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgbWV0aG9kcyB3aXRoIHRoZSBzYW1lIG5hbWUgYW5kIG51bWJlciBvZiBwYXJhbWV0ZXJzIHRoZW4gdGhpcyBpbmZvcm1hdGlvbgorICAgICAqIGNvbnRyaWJ1dGVzIHRvIHRoZSBzZWxlY3Rpb24gb2YgdGhlIGNvcnJlY3QgbWV0aG9kIHRvIGNhbGwuCisgICAgICogSWYgTk9UX0NBTExFRCBpcyByZXR1cm5lZCBhbmQgdGhlcmUgaXMgYSBtZXRob2Qgd2hpY2gKKyAgICAgKiBzaG91bGQgYmUgY2FsbGVkIHRoZW4gdGhpcyBhcnJheSB3aWxsIGNvbnRhaW4gdGhlIGNsYXNzZXMgd2hpY2ggcmVwcmVzZW50IHRoZSB0eXBlcyBvZiB0aGUgcGFyYW1ldGVycyB0byB0aGF0IG1ldGhvZC4KKyAgICAgKiBJZiBhbnkgb3RoZXIgdmFsdWUgaXMgcmV0dXJuZWQgdGhlbiB0aGUgdmFsdWVzIGluIHRoaXMgYXJyYXkgYXJlIHVuZGVmaW5lZC4gSW4gdGhpcyBjYXNlIHRoZSBNZXRhQ2xhc3MgbWF5IG9yIG1heSBub3QKKyAgICAgKiBjaGFuZ2UgdGhlc2UgdmFsdWVzLiBETyBOT1QgdXNlIHRoZXNlIHZhbHVlcyB1bmxlc3MgTk9UX0NBTExFRCBpcyByZXR1cm5lZC4KKyAgICAgKiBAcmV0dXJuCisgICAgICogRWl0aGVyIHRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGUgbWV0aG9kIChudWxsIGlzIHJldHVybmVkIGlmIHRoZSBtZXRob2QgcmV0dXJucyB2b2lkKSBvciB0aGUgdmFsdWUgTk9UX0NBTExFRC4KKyAgICAgKiBOT1RfQ0FMTEVEIGlzIHJldHVybmVkIGlmIGEgc3VpdGFibGUgbWV0aG9kIGV4aXN0cyBidXQgdGhlIE1ldGFDbGFzcyBkaWQgbm90IGNhbGwgaXQgYmVjYXVzZSBpdCBpcyBub3QgYWRkZWQuCisgICAgICogSW4gdGhpcyBjYXNlIHRoZSBjYWxsZXIgaXMgZnJlZSB0byB0cnkgdG8gaW52b2tlIHRoZSBtZXRob2QgaXRzZWxmIChlLmcuIGJ5IGV4ZWN1dGluZyBnZW5lcmF0ZWQgYnl0ZWNvZGUpLgorICAgICAqIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBtZXRob2RzIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQgbnVtYmVyIG9mIHBhcmFtZXRlcnMgdGhlbiB0aGUgdmFsdWVzIG9uIHRoZSBhcnJheSBwYXNzZWQKKyAgICAgKiBhcyBhcmd1bWVudFR5cGVzIHNob3VsZCBiZSB1c2VkIHRvIGNob29zZSB0aGUgY29ycmVjdCBvbmUgdG8gY2FsbC4KKyAgICAgKi8gIAorICAgIE9iamVjdCBpbnZva2VTdXBlck1ldGhvZCggT2JqZWN0IG9iamVjdCwgIENsYXNzIHN1cGVyY2xhc3NUeXBlLCAgU3RyaW5nIG1ldGhvZE5hbWUsICBPYmplY3RbXSBhcmd1bWVudHMsICBDbGFzc1tdIGFyZ3VtZW50VHlwZXMpOworICAgIAorICAgIE9iamVjdCBnZXRTdXBlclByb3BlcnR5KCBPYmplY3Qgb2JqZWN0LCAgQ2xhc3Mgc3VwZXJjbGFzc1R5cGUsICBTdHJpbmcgcHJvcGVydHkpOworICAgIAorICAgIGJvb2xlYW4gc2V0U3VwZXJQcm9wZXJ0eSggT2JqZWN0IG9iamVjdCwgIENsYXNzIHN1cGVyY2xhc3NUeXBlLCAgU3RyaW5nIHByb3BlcnR5LCAgT2JqZWN0IG5ld1ZhbHVlLCAgQ2xhc3MgbmV3VmFsdWVUeXBlKTsKKyAgICAKKyAgICBPYmplY3QgZ2V0U3VwZXJBdHRyaWJ1dGUoIE9iamVjdCBvYmplY3QsICBDbGFzcyBzdXBlcmNsYXNzVHlwZSwgIFN0cmluZyBhdHRyaWJ1dGUpOworICAgIAorICAgIGJvb2xlYW4gc2V0U3VwZXJBdHRyaWJ1dGUoIE9iamVjdCBvYmplY3QsICBDbGFzcyBzdXBlcmNsYXNzVHlwZSwgIFN0cmluZyBhdHRyaWJ1dGUsICBPYmplY3QgbmV3VmFsdWUsICBDbGFzcyBuZXdWYWx1ZVR5cGUpOworCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvZXhwZXJpbWVudGFsL2dyb292eS9sYW5nL05ld01ldGFDbGFzcy5qYXZhIGIvZ3Jvb3Z5L2V4cGVyaW1lbnRhbC9ncm9vdnkvbGFuZy9OZXdNZXRhQ2xhc3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmEzZjEzCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L2V4cGVyaW1lbnRhbC9ncm9vdnkvbGFuZy9OZXdNZXRhQ2xhc3MuamF2YQpAQCAtMCwwICsxLDM0MSBAQAorcGFja2FnZSBncm9vdnkubGFuZzsKKworCisvKgorICogQ29weXJpZ2h0IDIwMDUgSm9obiBHLiBXaWxzb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworLyoqCisgKiBAYXV0aG9yIEpvaG4gV2lsc29uCisgKgorICovCisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBOZXdNZXRhQ2xhc3MgaW1wbGVtZW50cyBNT1AgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IE5PVF9DT05TVFJVQ1RFRCA9IG5ldyBPYmplY3QoKTsKKyAgICAKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdFtdIE5PX1BBUkFNRVRFUlMgPSBuZXcgT2JqZWN0WzBdOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3NbXSBOT19QQVJBTUVURVJfVFlQRVMgPSBuZXcgQ2xhc3NbMF07CisgICAgCisgICAgLy8KKyAgICAvLyBUaGUgbWV0aG9kcyBmb3JtaW5nIHRoZSBNZXRhIE9iamVjdCBQcm90b2NvbAorICAgIAorICAgIC8vCisgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAqIEBzZWUgZ3Jvb3Z5LmxhbmcuTU9QI2ludm9rZU1ldGhvZChqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuQ2xhc3MsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3RbXSwgamF2YS5sYW5nLkNsYXNzW10pCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IE9iamVjdCBpbnZva2VNZXRob2QoZmluYWwgT2JqZWN0IG9iamVjdCwgZmluYWwgQ2xhc3Mgb2JqZWN0VHlwZSwgZmluYWwgU3RyaW5nIG1ldGhvZE5hbWUsIGZpbmFsIE9iamVjdFtdIGFyZ3VtZW50cywgZmluYWwgQ2xhc3NbXSBhcmd1bWVudFR5cGVzKTsKKyAgICAKKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICogQHNlZSBncm9vdnkubGFuZy5NT1AjZ2V0UHJvcGVydHkoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLkNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBPYmplY3QgZ2V0UHJvcGVydHkoZmluYWwgT2JqZWN0IG9iamVjdCwgZmluYWwgQ2xhc3Mgb2JqZWN0VHlwZSwgZmluYWwgU3RyaW5nIHByb3BlcnR5KTsKKyAgICAKKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICogQHNlZSBncm9vdnkubGFuZy5NT1Ajc2V0UHJvcGVydHkoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLkNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuQ2xhc3MpCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0UHJvcGVydHkoZmluYWwgT2JqZWN0IG9iamVjdCwgZmluYWwgQ2xhc3Mgb2JqZWN0VHlwZSwgZmluYWwgU3RyaW5nIHByb3BlcnR5LCBmaW5hbCBPYmplY3QgbmV3VmFsdWUsIGZpbmFsIENsYXNzIG5ld1ZhbHVlVHlwZSk7CisgICAgCisgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAqIEBzZWUgZ3Jvb3Z5LmxhbmcuTU9QI2dldEF0dHJpYnV0ZShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuQ2xhc3MsIGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IE9iamVjdCBnZXRBdHRyaWJ1dGUoZmluYWwgT2JqZWN0IG9iamVjdCwgZmluYWwgQ2xhc3Mgb2JqZWN0VHlwZSwgZmluYWwgU3RyaW5nIGF0dHJpYnV0ZSk7CisgICAgCisgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAqIEBzZWUgZ3Jvb3Z5LmxhbmcuTU9QI3NldEF0dHJpYnV0ZShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuQ2xhc3MsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5DbGFzcykKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRBdHRyaWJ1dGUoZmluYWwgT2JqZWN0IG9iamVjdCwgZmluYWwgQ2xhc3Mgb2JqZWN0VHlwZSwgZmluYWwgU3RyaW5nIGF0dHJpYnV0ZSwgZmluYWwgT2JqZWN0IG5ld1ZhbHVlLCBmaW5hbCBDbGFzcyBuZXdWYWx1ZVR5cGUpOworICAgIAorICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIGdyb292eS5sYW5nLk1PUCNpbnZva2VUaGlzTWV0aG9kKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5DbGFzcywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdFtdLCBqYXZhLmxhbmcuQ2xhc3NbXSkKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGludm9rZVRoaXNNZXRob2QoZmluYWwgT2JqZWN0IG9iamVjdCwgZmluYWwgQ2xhc3MgdGhpc1R5cGUsIGZpbmFsIFN0cmluZyBtZXRob2ROYW1lLCBmaW5hbCBPYmplY3RbXSBhcmd1bWVudHMsIGZpbmFsIENsYXNzW10gYXJndW1lbnRUeXBlcyk7CisgICAgCisgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAqIEBzZWUgZ3Jvb3Z5LmxhbmcuTU9QI2dldFRoaXNQcm9wZXJ0eShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuQ2xhc3MsIGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IE9iamVjdCBnZXRUaGlzUHJvcGVydHkoZmluYWwgT2JqZWN0IG9iamVjdCwgZmluYWwgQ2xhc3MgdGhpc1R5cGUsIGZpbmFsIFN0cmluZyBwcm9wZXJ0eSk7CisgICAgCisgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAqIEBzZWUgZ3Jvb3Z5LmxhbmcuTU9QI3NldFRoaXNQcm9wZXJ0eShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuQ2xhc3MsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5DbGFzcykKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzZXRUaGlzUHJvcGVydHkoZmluYWwgT2JqZWN0IG9iamVjdCwgZmluYWwgQ2xhc3MgdGhpc1R5cGUsIGZpbmFsIFN0cmluZyBwcm9wZXJ0eSwgZmluYWwgT2JqZWN0IG5ld1ZhbHVlLCBmaW5hbCBDbGFzcyBuZXdWYWx1ZVR5cGUpOworICAgIAorICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIGdyb292eS5sYW5nLk1PUCNnZXRUaGlzQXR0cmlidXRlKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5DbGFzcywgamF2YS5sYW5nLlN0cmluZykKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGdldFRoaXNBdHRyaWJ1dGUoZmluYWwgT2JqZWN0IG9iamVjdCwgZmluYWwgQ2xhc3MgdGhpc1R5cGUsIGZpbmFsIFN0cmluZyBhdHRyaWJ1dGUpOworICAgIAorICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIGdyb292eS5sYW5nLk1PUCNzZXRUaGlzQXR0cmlidXRlKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5DbGFzcywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLkNsYXNzKQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHNldFRoaXNBdHRyaWJ1dGUoZmluYWwgT2JqZWN0IG9iamVjdCwgZmluYWwgQ2xhc3MgdGhpc1R5cGUsIGZpbmFsIFN0cmluZyBhdHRyaWJ1dGUsIGZpbmFsIE9iamVjdCBuZXdWYWx1ZSwgZmluYWwgQ2xhc3MgbmV3VmFsdWVUeXBlKTsKKworICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIGdyb292eS5sYW5nLk1PUCNpbnZva2VTdXBlck1ldGhvZChqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuQ2xhc3MsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3RbXSwgamF2YS5sYW5nLkNsYXNzW10pCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IE9iamVjdCBpbnZva2VTdXBlck1ldGhvZChmaW5hbCBPYmplY3Qgb2JqZWN0LCBmaW5hbCBDbGFzcyBzdXBlcmNsYXNzVHlwZSwgZmluYWwgU3RyaW5nIG1ldGhvZE5hbWUsIGZpbmFsIE9iamVjdFtdIGFyZ3VtZW50cywgZmluYWwgQ2xhc3NbXSBhcmd1bWVudFR5cGVzKTsKKyAgICAKKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICogQHNlZSBncm9vdnkubGFuZy5NT1AjZ2V0U3VwZXJQcm9wZXJ0eShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuQ2xhc3MsIGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IE9iamVjdCBnZXRTdXBlclByb3BlcnR5KGZpbmFsIE9iamVjdCBvYmplY3QsIGZpbmFsIENsYXNzIHN1cGVyY2xhc3NUeXBlLCBmaW5hbCBTdHJpbmcgcHJvcGVydHkpOworICAgIAorICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIGdyb292eS5sYW5nLk1PUCNzZXRTdXBlclByb3BlcnR5KGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5DbGFzcywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLkNsYXNzKQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHNldFN1cGVyUHJvcGVydHkoZmluYWwgT2JqZWN0IG9iamVjdCwgZmluYWwgQ2xhc3Mgc3VwZXJjbGFzc1R5cGUsIGZpbmFsIFN0cmluZyBwcm9wZXJ0eSwgZmluYWwgT2JqZWN0IG5ld1ZhbHVlLCBmaW5hbCBDbGFzcyBuZXdWYWx1ZVR5cGUpOworICAgIAorICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIGdyb292eS5sYW5nLk1PUCNnZXRTdXBlckF0dHJpYnV0ZShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuQ2xhc3MsIGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IE9iamVjdCBnZXRTdXBlckF0dHJpYnV0ZShmaW5hbCBPYmplY3Qgb2JqZWN0LCBmaW5hbCBDbGFzcyBzdXBlcmNsYXNzVHlwZSwgZmluYWwgU3RyaW5nIGF0dHJpYnV0ZSk7CisgICAgCisgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAqIEBzZWUgZ3Jvb3Z5LmxhbmcuTU9QI3NldFN1cGVyQXR0cmlidXRlKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5DbGFzcywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLkNsYXNzKQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHNldFN1cGVyQXR0cmlidXRlKGZpbmFsIE9iamVjdCBvYmplY3QsIGZpbmFsIENsYXNzIHN1cGVyY2xhc3NUeXBlLCBmaW5hbCBTdHJpbmcgYXR0cmlidXRlLCBmaW5hbCBPYmplY3QgbmV3VmFsdWUsIGZpbmFsIENsYXNzIG5ld1ZhbHVlVHlwZSk7CisKKyAgICAvLworICAgIC8vIE1ldGhvZHMgd2hpY2ggbWF5IG1pZ3JhdGUgdG8gdGhlIE1PUCBhdCBzb21lIHRpbWUgaW4gdGhlIGZ1dHVyZQorICAgIC8vCisgICAgCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyByZXByZXNlbnRlZCBieSB0aGlzIGluc3RhbmNlIG9mIHRoZSBNZXRhQ2xhc3MuCisgICAgICogT25seSBwdWJsaWMgY29uc3RydWN0b3JzIG1heSBiZSBjYWxsZWQuIFRoZXJlIGlzIGN1cnJlbnRseSBubyB3YXkgb2YgZHluYW1pY2FsbHkgYWRkaW5nIGNvbnN0cnVjdG9ycyBidXQKKyAgICAgKiBpZiBvbmUgaXMgaW50cm9kdWNlZCB0aGVuIHRoaXMgbWV0aG9kIHdpbGwgdXNlIHRoZW0uCisgICAgICogSWYgbm8gc3VpdGFibGUgY29uc3R1Y3RvciBpcyBmb3VuZCB0aGVuIGEgZ3Jvb3Z5LmxhbmcuTWlzc2luZ0NvbnN0cnVjdG9yRXhjZXB0aW9uIGlzIHRocm93bgorICAgICAqIEBwYXJhbSBhcmd1bWVudHMKKyAgICAgKiBUaGUgYXJndW1lbnRzIHRvIHRoZSBjb25zdHJ1Y3RvciBjYWxsLiBUaGUgdmFsdWVzIGluIHRoaXMgYXJyYXkgYXJlIHVuZGVmaW5lZCBhZnRlciB0aGUgY2FsbCBpcyBtYWRlLgorICAgICAqIFRoZSBNZXRhQ2xhc3MgbWF5IG9yIG1heSBub3QgY2hhbmdlIHRoZXNlIHZhdWVzLiBETyBOT1QgdXNlIHRoZXNlIHZhdWxlcyBhZnRlciB0aGUgY2FsbC4KKyAgICAgKiBAcGFyYW0gYXJndW1lbnRUeXBlcworICAgICAqIFRoaXMgYXJyYXkgbXVzdCBiZSB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIGFyZ3VtZW50cyBhcnJheS4KKyAgICAgKiBJdCBjb250YWlucyB0aGUgdHlwZSBvZiBlYWNoIHBhcmFtZXRlciBpZiBrbm93biBvciBudWxsIGlmIHVua25vd24uCisgICAgICogVGhlIGlmIHRoZXJlIGFyZSBvdmVybG9hZGVkIGNvbnN0cnVjdG9ycyB0aGVuIHRoaXMgaW5mb3JtYXRpb24gY29udHJpYnV0ZXMgdG8gdGhlIHNlbGVjdGlvbiBvZiB0aGUgY29ycmVjdCBjb25zdHJ1Y3RvciB0byBjYWxsLgorICAgICAqIFRoZSBNZXRhQ2xhc3MgbWF5IG9yIG1heSBub3QgY2hhbmdlIHRoZXNlIHZhdWVzLiBETyBOT1QgdXNlIHRoZXNlIHZhbHVlcyBhZnRlciB0aGUgY2FsbC4KKyAgICAgKiBAcmV0dXJuCisgICAgICogQSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIHJlcHJlc2VudGVkIGJ5IHRoaXMgaW5zdGFuY2Ugb2YgTWV0YUNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBPYmplY3QgaW52b2tlQ29uc3RydWN0b3IoZmluYWwgT2JqZWN0W10gYXJndW1lbnRzLCBmaW5hbCBDbGFzc1tdIGFyZ3VtZW50VHlwZXMpOworICAgIAorICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3MgcmVwcmVzZW50ZWQgYnkgdGhpcyBpbnN0YW5jZSBvZiB0aGUgTWV0YUNsYXNzLgorICAgICAqIE9ubHkgcHVibGljIGNvbnN0cnVjdG9ycyB3aWxsIGJlIGNhbGxlZCBkaXJlY3RseS4gVGhlcmUgaXMgY3VycmVudGx5IG5vIHdheSBvZiBkeW5hbWljYWxseSBhZGRpbmcgY29uc3RydWN0b3JzIGJ1dAorICAgICAqIGlmIG9uZSBpcyBpbnRyb2R1Y2VkIHRoZW4gdGhpcyBtZXRob2Qgd2lsbCB1c2UgdGhlbS4KKyAgICAgKiBJZiBhIHByb3RlY3RlZCBvciBwcml2YXRlIGNvbnN0cnVjdG9yIGlzIHRoZSBiZXN0IG1hdGNoIGZvciB0aGUgcGFyYW1ldGVycyB0aGVuIE5PVF9DT05TVFJVQ1RFRCBpcyByZXR1cm5lZAorICAgICAqIG90aGVyd2lzZSBhIGdyb292eS5sYW5nLk1pc3NpbmdDb25zdHJ1Y3RvckV4Y2VwdGlvbiBpcyB0aHJvd24KKyAgICAgKiBAcGFyYW0gYXJndW1lbnRzCisgICAgICogVGhlIGFyZ3VtZW50cyB0byB0aGUgY29uc3RydWN0b3IuCisgICAgICogSWYgTk9UX0NPTlNUVUNURUQgaXMgcmV0dXJuZWQgYW5kIHRoZXJlIGlzIGEgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgY29uc3R1Y3RvciB3aGljaAorICAgICAqIHNob3VsZCBiZSBjYWxsZWQgdGhlbiB0aGlzIGFycmF5IHdpbGwgY29udGFpbiB0aGUgcGFyYW1ldGVycyB0byB0aGF0IGNvbnN0cnVjdG9yLiBUaGUgTWV0YUNsYXNzIHdpbGwgaGF2ZSBkb25lIGFueSBjb252ZXJzaW9ucworICAgICAqIChlLmcuIEdTdHJpbmcgdG8gU3RyaW5nKSBuZWVkZWQgdG8gYWxsb3cgdGhlIGNvbnN0dWN0b3IgY2FsbCB0byBzdWNlZWQuCisgICAgICogSWYgYW55IG90aGVyIHZhbHVlIGlzIHJldHVybmVkIHRoZW4gdGhlIHZhbHVlcyBpbiB0aGlzIGFycmF5IGFyZSB1bmRlZmluZWQuIEluIHRoaXMgY2FzZSB0aGUgTWV0YUNsYXNzIG1heSBvciBtYXkgbm90CisgICAgICogY2hhbmdlIHRoZXNlIHZhbHVlcy4gRE8gTk9UIHVzZSB0aGVzZSB2YWx1ZXMgdW5sZXNzIE5PVF9DT05TVFVDVEVEIGlzIHJldHVybmVkLgorICAgICAqIEBwYXJhbSBhcmd1bWVudFR5cGVzCisgICAgICogVGhpcyBhcnJheSBtdXN0IGJlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgYXJndW1lbnRzIGFyZ3VtZW50cyBhcnJheS4KKyAgICAgKiBJdCBjb250YWlucyB0aGUgdHlwZSBvZiBlYWNoIHBhcmFtZXRlciBpZiBrbm93biBvciBudWxsIGlmIHVua25vd24uCisgICAgICogVGhlIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBjb25zdHJ1Y3RvcnMgd2l0aCB0aGUgc2FtZSBuYW1lIGFuZCBudW1iZXIgb2YgcGFyYW1ldGVycyB0aGVuIHRoaXMgaW5mb3JtYXRpb24KKyAgICAgKiBjb250cmlidXRlcyB0byB0aGUgc2VsZWN0aW9uIG9mIHRoZSBjb3JyZWN0IG1ldGhvZCB0byBjYWxsLgorICAgICAqIElmIE5PVF9DT05TVFVDVEVEIGlzIHJldHVybmVkIGFuZCB0aGVyZSBpcyBhIHByaXZhdGUgb3IgcHJvdGVjdGVkIGNvbnN0dWN0b3Igd2hpY2gKKyAgICAgKiBzaG91bGQgYmUgY2FsbGVkIHRoZW4gdGhpcyBhcnJheSB3aWxsIGNvbnRhaW4gdGhlIGNsYXNzZXMgd2hpY2ggcmVwcmVzZW50IHRoZSB0eXBlcyBvZiB0aGUgcGFyYW1ldGVycyB0byB0aGF0IGNvbnN0cnVjdG9yLgorICAgICAqIElmIGFueSBvdGhlciB2YWx1ZSBpcyByZXR1cm5lZCB0aGVuIHRoZSB2YWx1ZXMgaW4gdGhpcyBhcnJheSBhcmUgdW5kZWZpbmVkLiBJbiB0aGlzIGNhc2UgdGhlIE1ldGFDbGFzcyBtYXkgb3IgbWF5IG5vdAorICAgICAqIGNoYW5nZSB0aGVzZSB2YWx1ZXMuIERPIE5PVCB1c2UgdGhlc2UgdmFsdWVzIHVubGVzcyBOT1RfQ0FMTEVEIGlzIHJldHVybmVkLgorICAgICAqIEByZXR1cm4KKyAgICAgKiBFaXRoZXIgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIHJlcHJlc2VudGVkIGJ5IHRoaXMgaW5zdGFuY2Ugb2YgTWV0YUNsYXNzIG9yIE5PVF9DT05TVFJVQ1RFRC4KKyAgICAgKiBOT1RfQ09OU1RSVUNURUQgaXMgcmV0dXJuZWQgaWYgYSBzdWl0YWJsZSBjb25zdHJ1Y3RvciBleGlzdHMgYnV0IHRoZSBNZXRhQ2xhc3MgZGlkIG5vdCBjYWxsIGl0IGJlY2F1c2UgaXQgaXMgbm90IHB1YmxpYy4KKyAgICAgKiBJbiB0aGlzIGNhc2UgdGhlIGNhbGxlciBpcyBmcmVlIHRvIHRyeSB0byBpbnZva2UgdGhlIGNvbnN0dWN0b3IgaXRzZWxmIChlLmcuIGJ5IGV4ZWN1dGluZyBnZW5lcmF0ZWQgYnl0ZWNvZGUpLiAKKyAgICAgKiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgY29uc3R1Y3RvcnMgd2l0aCB0aGUgc2FtZSBuYW1lIGFuZCBudW1iZXIgb2YgcGFyYW1ldGVycyB0aGVuIHRoZSB2YWx1ZXMgb24gdGhlIGFycmF5IHBhc3NlZAorICAgICAqIGFzIGFyZ3VtZW50VHlwZXMgc2hvdWxkIGJlIHVzZWQgdG8gY2hvb3NlIHRoZSBjb3JyZWN0IG9uZSB0byBjYWxsLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBPYmplY3QgaW52b2tlVGhpc0NvbnN0cnVjdG9yKGZpbmFsIE9iamVjdFtdIGFyZ3VtZW50cywgZmluYWwgQ2xhc3NbXSBhcmd1bWVudFR5cGVzKTsKKyAgICAKKyAgICAvLworICAgIC8vIEFkZGl0aW9uYWwgbWV0aG9kcyBmb3IgdXNlIHdoZW4gc29tZSBvciBhbGwgb2YgdGhlIHR5cGUgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZQorICAgIC8vIFdlIGRvbid0IGJvdGhlciBkb2luZyB0aGlzIHdpdGggc3VwZXIgY2FsbHMgcHJvcGVyZXR5IGFuZCBhdHRyaWJ1dGUgYWNlc3MgYXMgdGhleSBhcmUgZmFyIGxlc3MgY29tbW9uCisgICAgLy8KKyAgICAKKyAgICBwdWJsaWMgT2JqZWN0IGludm9rZUNvbnN0cnVjdG9yKGZpbmFsIE9iamVjdFtdIGFyZ3VtZW50cykgeworICAgICAgICByZXR1cm4gaW52b2tlQ29uc3RydWN0b3IoYXJndW1lbnRzLCBuZXcgQ2xhc3NbYXJndW1lbnRzLmxlbmd0aF0pOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgT2JqZWN0IGludm9rZU1ldGhvZChmaW5hbCBPYmplY3Qgb2JqZWN0LCBmaW5hbCBDbGFzcyBvYmplY3RUeXBlLCBmaW5hbCBTdHJpbmcgbWV0aG9kTmFtZSwgZmluYWwgT2JqZWN0W10gYXJndW1lbnRzKSB7CisgICAgICAgIHJldHVybiBpbnZva2VNZXRob2Qob2JqZWN0LCBvYmplY3RUeXBlLCBtZXRob2ROYW1lLCBhcmd1bWVudHMsIG5ldyBDbGFzc1thcmd1bWVudHMubGVuZ3RoXSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBPYmplY3QgaW52b2tlTWV0aG9kKGZpbmFsIE9iamVjdCBvYmplY3QsIGZpbmFsIFN0cmluZyBtZXRob2ROYW1lLCBmaW5hbCBPYmplY3RbXSBhcmd1bWVudHMsIGZpbmFsIENsYXNzW10gYXJndW1lbnRUeXBlcykgeworICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kKG9iamVjdCwgKENsYXNzKW51bGwsIG1ldGhvZE5hbWUsIGFyZ3VtZW50cywgYXJndW1lbnRUeXBlcyk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBPYmplY3QgaW52b2tlTWV0aG9kKGZpbmFsIE9iamVjdCBvYmplY3QsIGZpbmFsIFN0cmluZyBtZXRob2ROYW1lLCBmaW5hbCBPYmplY3RbXSBhcmd1bWVudHMpIHsKKyAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZChvYmplY3QsIChDbGFzcyludWxsLCBtZXRob2ROYW1lLCBhcmd1bWVudHMsIG5ldyBDbGFzc1thcmd1bWVudHMubGVuZ3RoXSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoZmluYWwgT2JqZWN0IG9iamVjdCwgZmluYWwgU3RyaW5nIHByb3BlcnR5KSB7CisgICAgICAgIHJldHVybiBnZXRQcm9wZXJ0eShvYmplY3QsIChDbGFzcyludWxsLCBwcm9wZXJ0eSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KGZpbmFsIE9iamVjdCBvYmplY3QsIGZpbmFsIENsYXNzIG9iamVjdFR5cGUsIGZpbmFsIFN0cmluZyBwcm9wZXJ0eSwgZmluYWwgT2JqZWN0IG5ld1ZhbHVlKSB7CisgICAgICAgIHNldFByb3BlcnR5KG9iamVjdCwgb2JqZWN0VHlwZSwgcHJvcGVydHksIG5ld1ZhbHVlLCAoQ2xhc3MpbnVsbCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KGZpbmFsIE9iamVjdCBvYmplY3QsIGZpbmFsIFN0cmluZyBwcm9wZXJ0eSwgZmluYWwgT2JqZWN0IG5ld1ZhbHVlLCBmaW5hbCBDbGFzcyBuZXdWYWx1ZVR5cGUpIHsKKyAgICAgICAgc2V0UHJvcGVydHkob2JqZWN0LCAoQ2xhc3MpbnVsbCwgcHJvcGVydHksIG5ld1ZhbHVlLCBuZXdWYWx1ZVR5cGUpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShmaW5hbCBPYmplY3Qgb2JqZWN0LCBmaW5hbCBTdHJpbmcgcHJvcGVydHksIGZpbmFsIE9iamVjdCBuZXdWYWx1ZSkgeworICAgICAgICBzZXRQcm9wZXJ0eShvYmplY3QsIChDbGFzcyludWxsLCBwcm9wZXJ0eSwgbmV3VmFsdWUsIChDbGFzcyludWxsKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGUoZmluYWwgT2JqZWN0IG9iamVjdCwgZmluYWwgU3RyaW5nIGF0dHJpYnV0ZSkgeworICAgICAgICByZXR1cm4gZ2V0QXR0cmlidXRlKG9iamVjdCwgKENsYXNzKW51bGwsIGF0dHJpYnV0ZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShmaW5hbCBPYmplY3Qgb2JqZWN0LCBmaW5hbCBDbGFzcyBvYmplY3RUeXBlLCBmaW5hbCBTdHJpbmcgYXR0cmlidXRlLCBmaW5hbCBPYmplY3QgbmV3VmFsdWUpIHsKKyAgICAgICAgc2V0QXR0cmlidXRlKG9iamVjdCwgb2JqZWN0VHlwZSwgYXR0cmlidXRlLCBuZXdWYWx1ZSwgKENsYXNzKW51bGwpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoZmluYWwgT2JqZWN0IG9iamVjdCwgZmluYWwgU3RyaW5nIGF0dHJpYnV0ZSwgZmluYWwgT2JqZWN0IG5ld1ZhbHVlLCBmaW5hbCBDbGFzcyBuZXdWYWx1ZVR5cGUpIHsKKyAgICAgICAgc2V0QXR0cmlidXRlKG9iamVjdCwgKENsYXNzKW51bGwsIGF0dHJpYnV0ZSwgbmV3VmFsdWUsIG5ld1ZhbHVlVHlwZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShmaW5hbCBPYmplY3Qgb2JqZWN0LCBmaW5hbCBTdHJpbmcgYXR0cmlidXRlLCBmaW5hbCBPYmplY3QgbmV3VmFsdWUpIHsKKyAgICAgICAgc2V0QXR0cmlidXRlKG9iamVjdCwgKENsYXNzKW51bGwsIGF0dHJpYnV0ZSwgbmV3VmFsdWUsIChDbGFzcyludWxsKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIE9iamVjdCBpbnZva2VUaGlzTWV0aG9kKGZpbmFsIE9iamVjdCBvYmplY3QsIGZpbmFsIENsYXNzIHRoaXNUeXBlLCBmaW5hbCBTdHJpbmcgbWV0aG9kTmFtZSwgZmluYWwgT2JqZWN0W10gYXJndW1lbnRzKSB7CisgICAgICAgIHJldHVybiBpbnZva2VUaGlzTWV0aG9kKG9iamVjdCwgdGhpc1R5cGUsIG1ldGhvZE5hbWUsIGFyZ3VtZW50cywgbmV3IENsYXNzW2FyZ3VtZW50cy5sZW5ndGhdKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gc2V0VGhpc1Byb3BlcnR5KGZpbmFsIE9iamVjdCBvYmplY3QsIGZpbmFsIENsYXNzIHRoaXNUeXBlLCBmaW5hbCBTdHJpbmcgcHJvcGVydHksIGZpbmFsIE9iamVjdCBuZXdWYWx1ZSkgeworICAgICAgICByZXR1cm4gc2V0VGhpc1Byb3BlcnR5KG9iamVjdCwgdGhpc1R5cGUsIHByb3BlcnR5LCBuZXdWYWx1ZSwgKENsYXNzKW51bGwpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBzZXRUaGlzUHJvcGVydHkoZmluYWwgT2JqZWN0IG9iamVjdCwgZmluYWwgU3RyaW5nIHByb3BlcnR5LCBmaW5hbCBPYmplY3QgbmV3VmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIHNldFRoaXNQcm9wZXJ0eShvYmplY3QsIChDbGFzcyludWxsLCBwcm9wZXJ0eSwgbmV3VmFsdWUsIChDbGFzcyludWxsKTsKKyAgICB9CisgICAgCisgICAgLy8KKyAgICAvLyBNZXRob2RzIHVzZWQgdG8gb3B0aW1pc2UgbWV0aG9kIGNhbGxpbmcgd2hlbiB0aGVyZSBhcmUgMCwgMSwgMiwgMyBvciA0IHBhcmFtZXRlcnMKKyAgICAvLyBXZSBkb24ndCBib3RoZXIgZG9pbmcgdGhpcyB3aXRoIHN1cGVyIGNhbGxzIGFzIHRoZXkgYXJlIGZhciBsZXNzIGNvbW1vbgorICAgIC8vCisgICAgICAgCisgICAgcHVibGljIE9iamVjdCBpbnZva2VNZXRob2QoZmluYWwgT2JqZWN0IG9iamVjdCwgZmluYWwgU3RyaW5nIG1ldGhvZE5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZChvYmplY3QsIChDbGFzcyludWxsLCBtZXRob2ROYW1lLCBOT19QQVJBTUVURVJTLCBOT19QQVJBTUVURVJfVFlQRVMpOworICAgIH0KKyAgICAgICAKKyAgICBwdWJsaWMgT2JqZWN0IGludm9rZU1ldGhvZChmaW5hbCBPYmplY3Qgb2JqZWN0LCBmaW5hbCBDbGFzcyBvYmplY3RUeXBlLCBmaW5hbCBTdHJpbmcgbWV0aG9kTmFtZSkgeworICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kKG9iamVjdCwgb2JqZWN0VHlwZSwgbWV0aG9kTmFtZSwgTk9fUEFSQU1FVEVSUywgTk9fUEFSQU1FVEVSX1RZUEVTKTsKKyAgICB9CisgICAgICAgCisgICAgcHVibGljIE9iamVjdCBpbnZva2VNZXRob2QoZmluYWwgT2JqZWN0IG9iamVjdCwgZmluYWwgU3RyaW5nIG1ldGhvZE5hbWUsIGZpbmFsIE9iamVjdCBwMSwgZmluYWwgQ2xhc3MgYzEpIHsKKyAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZChvYmplY3QsIChDbGFzcyludWxsLCBtZXRob2ROYW1lLCBuZXcgT2JqZWN0W10ge3AxfSwgbmV3IENsYXNzW10ge2MxfSk7CisgICAgfQorICAgICAgIAorICAgIHB1YmxpYyBPYmplY3QgaW52b2tlTWV0aG9kKGZpbmFsIE9iamVjdCBvYmplY3QsIGZpbmFsIENsYXNzIG9iamVjdFR5cGUsIGZpbmFsIFN0cmluZyBtZXRob2ROYW1lLCBmaW5hbCBPYmplY3QgcDEsIGZpbmFsIENsYXNzIGMxKSB7CisgICAgICAgIHJldHVybiBpbnZva2VNZXRob2Qob2JqZWN0LCBvYmplY3RUeXBlLCBtZXRob2ROYW1lLCBuZXcgT2JqZWN0W10ge3AxfSwgbmV3IENsYXNzW10ge2MxfSk7CisgICAgfQorICAgICAgIAorICAgIHB1YmxpYyBPYmplY3QgaW52b2tlTWV0aG9kKGZpbmFsIE9iamVjdCBvYmplY3QsIGZpbmFsIFN0cmluZyBtZXRob2ROYW1lLCBmaW5hbCBPYmplY3QgcDEpIHsKKyAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZChvYmplY3QsIChDbGFzcyludWxsLCBtZXRob2ROYW1lLCBuZXcgT2JqZWN0W10ge3AxfSwgbmV3IENsYXNzWzFdKTsKKyAgICB9CisgICAgICAgCisgICAgcHVibGljIE9iamVjdCBpbnZva2VNZXRob2QoZmluYWwgT2JqZWN0IG9iamVjdCwgZmluYWwgQ2xhc3Mgb2JqZWN0VHlwZSwgZmluYWwgU3RyaW5nIG1ldGhvZE5hbWUsIGZpbmFsIE9iamVjdCBwMSkgeworICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kKG9iamVjdCwgb2JqZWN0VHlwZSwgbWV0aG9kTmFtZSwgbmV3IE9iamVjdFtdIHtwMX0sIG5ldyBDbGFzc1sxXSk7CisgICAgfQorICAgICAgIAorICAgIHB1YmxpYyBPYmplY3QgaW52b2tlTWV0aG9kKGZpbmFsIE9iamVjdCBvYmplY3QsIGZpbmFsIFN0cmluZyBtZXRob2ROYW1lLCBmaW5hbCBPYmplY3QgcDEsIGZpbmFsIE9iamVjdCBwMiwgZmluYWwgQ2xhc3MgYzEsIGZpbmFsIENsYXNzIGMyKSB7CisgICAgICAgIHJldHVybiBpbnZva2VNZXRob2Qob2JqZWN0LCAoQ2xhc3MpbnVsbCwgbWV0aG9kTmFtZSwgbmV3IE9iamVjdFtdIHtwMSwgcDJ9LCBuZXcgQ2xhc3NbXSB7YzEsIGMyfSk7CisgICAgfQorICAgICAgIAorICAgIHB1YmxpYyBPYmplY3QgaW52b2tlTWV0aG9kKGZpbmFsIE9iamVjdCBvYmplY3QsIGZpbmFsIENsYXNzIG9iamVjdFR5cGUsIGZpbmFsIFN0cmluZyBtZXRob2ROYW1lLCBmaW5hbCBPYmplY3QgcDEsIGZpbmFsIE9iamVjdCBwMiwgZmluYWwgQ2xhc3MgYzEsIGZpbmFsIENsYXNzIGMyKSB7CisgICAgICAgIHJldHVybiBpbnZva2VNZXRob2Qob2JqZWN0LCBvYmplY3RUeXBlLCBtZXRob2ROYW1lLCBuZXcgT2JqZWN0W10ge3AxLCBwMn0sIG5ldyBDbGFzc1tdIHtjMSwgYzJ9KTsKKyAgICB9CisgICAgICAgCisgICAgcHVibGljIE9iamVjdCBpbnZva2VNZXRob2QoZmluYWwgT2JqZWN0IG9iamVjdCwgZmluYWwgU3RyaW5nIG1ldGhvZE5hbWUsIGZpbmFsIE9iamVjdCBwMSwgZmluYWwgT2JqZWN0IHAyKSB7CisgICAgICAgIHJldHVybiBpbnZva2VNZXRob2Qob2JqZWN0LCAoQ2xhc3MpbnVsbCwgbWV0aG9kTmFtZSwgbmV3IE9iamVjdFtdIHtwMSwgcDJ9LCBuZXcgQ2xhc3NbMl0pOworICAgIH0KKyAgICAgICAKKyAgICBwdWJsaWMgT2JqZWN0IGludm9rZU1ldGhvZChmaW5hbCBPYmplY3Qgb2JqZWN0LCBmaW5hbCBDbGFzcyBvYmplY3RUeXBlLCBmaW5hbCBTdHJpbmcgbWV0aG9kTmFtZSwgZmluYWwgT2JqZWN0IHAxLCBmaW5hbCBPYmplY3QgcDIpIHsKKyAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZChvYmplY3QsIG9iamVjdFR5cGUsIG1ldGhvZE5hbWUsIG5ldyBPYmplY3RbXSB7cDEsIHAyfSwgbmV3IENsYXNzWzJdKTsKKyAgICB9CisgICAgICAgCisgICAgcHVibGljIE9iamVjdCBpbnZva2VNZXRob2QoZmluYWwgT2JqZWN0IG9iamVjdCwgZmluYWwgU3RyaW5nIG1ldGhvZE5hbWUsIGZpbmFsIE9iamVjdCBwMSwgZmluYWwgT2JqZWN0IHAyLCBmaW5hbCBPYmplY3QgcDMsIGZpbmFsIENsYXNzIGMxLCBmaW5hbCBDbGFzcyBjMiwgZmluYWwgQ2xhc3MgYzMpIHsKKyAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZChvYmplY3QsIChDbGFzcyludWxsLCBtZXRob2ROYW1lLCBuZXcgT2JqZWN0W10ge3AxLCBwMiwgcDN9LCBuZXcgQ2xhc3NbXSB7YzEsIGMyLCBjM30pOworICAgIH0KKyAgICAgICAKKyAgICBwdWJsaWMgT2JqZWN0IGludm9rZU1ldGhvZChmaW5hbCBPYmplY3Qgb2JqZWN0LCBmaW5hbCBDbGFzcyBvYmplY3RUeXBlLCBmaW5hbCBTdHJpbmcgbWV0aG9kTmFtZSwgZmluYWwgT2JqZWN0IHAxLCBmaW5hbCBPYmplY3QgcDIsIGZpbmFsIE9iamVjdCBwMywgZmluYWwgQ2xhc3MgYzEsIGZpbmFsIENsYXNzIGMyLCBmaW5hbCBDbGFzcyBjMykgeworICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kKG9iamVjdCwgb2JqZWN0VHlwZSwgbWV0aG9kTmFtZSwgbmV3IE9iamVjdFtdIHtwMSwgcDIsIHAzfSwgbmV3IENsYXNzW10ge2MxLCBjMiwgYzN9KTsKKyAgICB9CisgICAgICAgCisgICAgcHVibGljIE9iamVjdCBpbnZva2VNZXRob2QoZmluYWwgT2JqZWN0IG9iamVjdCwgZmluYWwgU3RyaW5nIG1ldGhvZE5hbWUsIGZpbmFsIE9iamVjdCBwMSwgZmluYWwgT2JqZWN0IHAyLCBmaW5hbCBPYmplY3QgcDMpIHsKKyAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZChvYmplY3QsIChDbGFzcyludWxsLCBtZXRob2ROYW1lLCBuZXcgT2JqZWN0W10ge3AxLCBwMiwgcDN9LCBuZXcgQ2xhc3NbM10pOworICAgIH0KKyAgICAgICAKKyAgICBwdWJsaWMgT2JqZWN0IGludm9rZU1ldGhvZChmaW5hbCBPYmplY3Qgb2JqZWN0LCBmaW5hbCBDbGFzcyBvYmplY3RUeXBlLCBmaW5hbCBTdHJpbmcgbWV0aG9kTmFtZSwgZmluYWwgT2JqZWN0IHAxLCBmaW5hbCBPYmplY3QgcDIsIGZpbmFsIE9iamVjdCBwMykgeworICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kKG9iamVjdCwgb2JqZWN0VHlwZSwgbWV0aG9kTmFtZSwgbmV3IE9iamVjdFtdIHtwMSwgcDIsIHAzfSwgbmV3IENsYXNzWzNdKTsKKyAgICB9CisgICAgICAgCisgICAgcHVibGljIE9iamVjdCBpbnZva2VNZXRob2QoZmluYWwgT2JqZWN0IG9iamVjdCwgZmluYWwgU3RyaW5nIG1ldGhvZE5hbWUsIGZpbmFsIE9iamVjdCBwMSwgZmluYWwgT2JqZWN0IHAyLCBmaW5hbCBPYmplY3QgcDMsIGZpbmFsIE9iamVjdCBwNCwgZmluYWwgQ2xhc3MgYzEsIGZpbmFsIENsYXNzIGMyLCBmaW5hbCBDbGFzcyBjMywgZmluYWwgQ2xhc3MgYzQpIHsKKyAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZChvYmplY3QsIChDbGFzcyludWxsLCBtZXRob2ROYW1lLCBuZXcgT2JqZWN0W10ge3AxLCBwMiwgcDMsIHA0fSwgbmV3IENsYXNzW10ge2MxLCBjMiwgYzMsIGM0fSk7CisgICAgfQorICAgICAgIAorICAgIHB1YmxpYyBPYmplY3QgaW52b2tlTWV0aG9kKGZpbmFsIE9iamVjdCBvYmplY3QsIGZpbmFsIENsYXNzIG9iamVjdFR5cGUsIGZpbmFsIFN0cmluZyBtZXRob2ROYW1lLCBmaW5hbCBPYmplY3QgcDEsIGZpbmFsIE9iamVjdCBwMiwgZmluYWwgT2JqZWN0IHAzLCBmaW5hbCBPYmplY3QgcDQsIGZpbmFsIENsYXNzIGMxLCBmaW5hbCBDbGFzcyBjMiwgZmluYWwgQ2xhc3MgYzMsIGZpbmFsIENsYXNzIGM0KSB7CisgICAgICAgIHJldHVybiBpbnZva2VNZXRob2Qob2JqZWN0LCBvYmplY3RUeXBlLCBtZXRob2ROYW1lLCBuZXcgT2JqZWN0W10ge3AxLCBwMiwgcDMsIHA0fSwgbmV3IENsYXNzW10ge2MxLCBjMiwgYzMsIGM0fSk7CisgICAgfQorICAgICAgIAorICAgIHB1YmxpYyBPYmplY3QgaW52b2tlTWV0aG9kKGZpbmFsIE9iamVjdCBvYmplY3QsIGZpbmFsIFN0cmluZyBtZXRob2ROYW1lLCBmaW5hbCBPYmplY3QgcDEsIGZpbmFsIE9iamVjdCBwMiwgZmluYWwgT2JqZWN0IHAzLCBmaW5hbCBPYmplY3QgcDQpIHsKKyAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZChvYmplY3QsIChDbGFzcyludWxsLCBtZXRob2ROYW1lLCBuZXcgT2JqZWN0W10ge3AxLCBwMiwgcDMsIHA0fSwgbmV3IENsYXNzWzRdKTsKKyAgICB9CisgICAgICAgCisgICAgcHVibGljIE9iamVjdCBpbnZva2VNZXRob2QoZmluYWwgT2JqZWN0IG9iamVjdCwgZmluYWwgQ2xhc3Mgb2JqZWN0VHlwZSwgZmluYWwgU3RyaW5nIG1ldGhvZE5hbWUsIGZpbmFsIE9iamVjdCBwMSwgZmluYWwgT2JqZWN0IHAyLCBmaW5hbCBPYmplY3QgcDMsIGZpbmFsIE9iamVjdCBwNCkgeworICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kKG9iamVjdCwgb2JqZWN0VHlwZSwgbWV0aG9kTmFtZSwgbmV3IE9iamVjdFtdIHtwMSwgcDIsIHAzLCBwNH0sIG5ldyBDbGFzc1s0XSk7CisgICAgfQorICAgICAgIAorICAgIHB1YmxpYyBPYmplY3QgaW52b2tlVGhpc01ldGhvZChmaW5hbCBPYmplY3Qgb2JqZWN0LCBmaW5hbCBDbGFzcyB0aGlzVHlwZSwgZmluYWwgU3RyaW5nIG1ldGhvZE5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGludm9rZVRoaXNNZXRob2Qob2JqZWN0LCB0aGlzVHlwZSwgbWV0aG9kTmFtZSwgTk9fUEFSQU1FVEVSUywgTk9fUEFSQU1FVEVSX1RZUEVTKTsKKyAgICB9CisgICAgICAgCisgICAgcHVibGljIE9iamVjdCBpbnZva2VUaGlzTWV0aG9kKGZpbmFsIE9iamVjdCBvYmplY3QsIGZpbmFsIENsYXNzIHRoaXNUeXBlLCBmaW5hbCBTdHJpbmcgbWV0aG9kTmFtZSwgZmluYWwgT2JqZWN0IHAxLCBmaW5hbCBDbGFzcyBjMSkgeworICAgICAgICByZXR1cm4gaW52b2tlVGhpc01ldGhvZChvYmplY3QsIHRoaXNUeXBlLCBtZXRob2ROYW1lLCBuZXcgT2JqZWN0W10ge3AxfSwgbmV3IENsYXNzW10ge2MxfSk7CisgICAgfQorICAgICAgIAorICAgIHB1YmxpYyBPYmplY3QgaW52b2tlVGhpc01ldGhvZChmaW5hbCBPYmplY3Qgb2JqZWN0LCBmaW5hbCBDbGFzcyB0aGlzVHlwZSwgZmluYWwgU3RyaW5nIG1ldGhvZE5hbWUsIGZpbmFsIE9iamVjdCBwMSkgeworICAgICAgICByZXR1cm4gaW52b2tlVGhpc01ldGhvZChvYmplY3QsIHRoaXNUeXBlLCBtZXRob2ROYW1lLCBuZXcgT2JqZWN0W10ge3AxfSwgbmV3IENsYXNzWzFdKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGludm9rZVRoaXNNZXRob2QoZmluYWwgT2JqZWN0IG9iamVjdCwgZmluYWwgQ2xhc3MgdGhpc1R5cGUsIGZpbmFsIFN0cmluZyBtZXRob2ROYW1lLCBmaW5hbCBPYmplY3QgcDEsIGZpbmFsIE9iamVjdCBwMiwgZmluYWwgQ2xhc3MgYzEsIGZpbmFsIENsYXNzIGMyKSB7CisgICAgICAgIHJldHVybiBpbnZva2VUaGlzTWV0aG9kKG9iamVjdCwgdGhpc1R5cGUsIG1ldGhvZE5hbWUsIG5ldyBPYmplY3RbXSB7cDEsIHAyfSwgbmV3IENsYXNzW10ge2MxLCBjMn0pOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgaW52b2tlVGhpc01ldGhvZChmaW5hbCBPYmplY3Qgb2JqZWN0LCBmaW5hbCBDbGFzcyB0aGlzVHlwZSwgZmluYWwgU3RyaW5nIG1ldGhvZE5hbWUsIGZpbmFsIE9iamVjdCBwMSwgZmluYWwgT2JqZWN0IHAyKSB7CisgICAgICAgIHJldHVybiBpbnZva2VUaGlzTWV0aG9kKG9iamVjdCwgdGhpc1R5cGUsIG1ldGhvZE5hbWUsIG5ldyBPYmplY3RbXSB7cDEsIHAyfSwgbmV3IENsYXNzWzJdKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGludm9rZVRoaXNNZXRob2QoZmluYWwgT2JqZWN0IG9iamVjdCwgZmluYWwgQ2xhc3MgdGhpc1R5cGUsIGZpbmFsIFN0cmluZyBtZXRob2ROYW1lLCBmaW5hbCBPYmplY3QgcDEsIGZpbmFsIE9iamVjdCBwMiwgZmluYWwgT2JqZWN0IHAzLCBmaW5hbCBDbGFzcyBjMSwgZmluYWwgQ2xhc3MgYzIsIGZpbmFsIENsYXNzIGMzKSB7CisgICAgICAgIHJldHVybiBpbnZva2VUaGlzTWV0aG9kKG9iamVjdCwgdGhpc1R5cGUsIG1ldGhvZE5hbWUsIG5ldyBPYmplY3RbXSB7cDEsIHAyLCBwM30sIG5ldyBDbGFzc1tdIHtjMSwgYzIsIGMzfSk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBpbnZva2VUaGlzTWV0aG9kKGZpbmFsIE9iamVjdCBvYmplY3QsIGZpbmFsIENsYXNzIHRoaXNUeXBlLCBmaW5hbCBTdHJpbmcgbWV0aG9kTmFtZSwgZmluYWwgT2JqZWN0IHAxLCBmaW5hbCBPYmplY3QgcDIsIGZpbmFsIE9iamVjdCBwMykgeworICAgICAgICByZXR1cm4gaW52b2tlVGhpc01ldGhvZChvYmplY3QsIHRoaXNUeXBlLCBtZXRob2ROYW1lLCBuZXcgT2JqZWN0W10ge3AxLCBwMiwgcDN9LCBuZXcgQ2xhc3NbM10pOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgaW52b2tlVGhpc01ldGhvZChmaW5hbCBPYmplY3Qgb2JqZWN0LCBmaW5hbCBDbGFzcyB0aGlzVHlwZSwgZmluYWwgU3RyaW5nIG1ldGhvZE5hbWUsIGZpbmFsIE9iamVjdCBwMSwgZmluYWwgT2JqZWN0IHAyLCBmaW5hbCBPYmplY3QgcDMsIGZpbmFsIE9iamVjdCBwNCwgZmluYWwgQ2xhc3MgYzEsIGZpbmFsIENsYXNzIGMyLCBmaW5hbCBDbGFzcyBjMywgZmluYWwgQ2xhc3MgYzQpIHsKKyAgICAgICAgcmV0dXJuIGludm9rZVRoaXNNZXRob2Qob2JqZWN0LCB0aGlzVHlwZSwgbWV0aG9kTmFtZSwgbmV3IE9iamVjdFtdIHtwMSwgcDIsIHAzLCBwNH0sIG5ldyBDbGFzc1tdIHtjMSwgYzIsIGMzLCBjNH0pOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgaW52b2tlVGhpc01ldGhvZChmaW5hbCBPYmplY3Qgb2JqZWN0LCBmaW5hbCBDbGFzcyB0aGlzVHlwZSwgZmluYWwgU3RyaW5nIG1ldGhvZE5hbWUsIGZpbmFsIE9iamVjdCBwMSwgZmluYWwgT2JqZWN0IHAyLCBmaW5hbCBPYmplY3QgcDMsIGZpbmFsIE9iamVjdCBwNCkgeworICAgICAgICByZXR1cm4gaW52b2tlVGhpc01ldGhvZChvYmplY3QsIHRoaXNUeXBlLCBtZXRob2ROYW1lLCBuZXcgT2JqZWN0W10ge3AxLCBwMiwgcDMsIHA0fSwgbmV3IENsYXNzWzRdKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvZXhwZXJpbWVudGFsL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9NZXRhQ2xhc3NBY3Rpb25zLmphdmEgYi9ncm9vdnkvZXhwZXJpbWVudGFsL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9NZXRhQ2xhc3NBY3Rpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IyYmQ5YQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9leHBlcmltZW50YWwvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL01ldGFDbGFzc0FjdGlvbnMuamF2YQpAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUgSm9obiBHLiBXaWxzb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWU7CisKKworLyoqCisgKiBAYXV0aG9yIEpvaG4gV2lsc29uCisgKgorICovCisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBNZXRhQ2xhc3NBY3Rpb25zIHsKKyAgcHJvdGVjdGVkIGludCBjaG9vc2VNZXRob2QoZmluYWwgQ2xhc3NbXVtdIGZvcm1hbFBhcmFtZXRlckxpc3RzLCBmaW5hbCBPYmplY3RbXSBhY3R1YWxQYXJhbWV0ZXJzKSB7CisgICAgcmV0dXJuIDA7IC8vIFRPRE86IGltcGxlbWVudCBwYXJhbWV0ZXIgY2hvb3NpbmcgY29kZQorICB9CisgIAorICBwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGRvSW52b2tlTWV0aG9kKE9iamVjdCB0YXJnZXQsIFN0cmluZyBuYW1lLCBPYmplY3RbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L2V4cGVyaW1lbnRhbC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvTWV0YUNsYXNzQWN0aW9uc0dlbmVyYXRvci5qYXZhIGIvZ3Jvb3Z5L2V4cGVyaW1lbnRhbC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvTWV0YUNsYXNzQWN0aW9uc0dlbmVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NjU0NGMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvZXhwZXJpbWVudGFsL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9NZXRhQ2xhc3NBY3Rpb25zR2VuZXJhdG9yLmphdmEKQEAgLTAsMCArMSwzODIgQEAKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lOworaW1wb3J0IGdyb292eS5sYW5nLk1ldGFNZXRob2Q7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5XZWFrSGFzaE1hcDsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZW1ldGFjbGFzc2FjdGlvbnNzdXBwb3J0LkRlZmF1bHRHcm9vdnlJbnN0YW5jZU1ldGhvZEdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWVtZXRhY2xhc3NhY3Rpb25zc3VwcG9ydC5EZWZhdWx0R3Jvb3Z5U3RhdGljTWV0aG9kR2VuZXJhdG9yOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZW1ldGFjbGFzc2FjdGlvbnNzdXBwb3J0Lkluc3RhbmNlTWV0aG9kR2VuZXJhdG9yOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZW1ldGFjbGFzc2FjdGlvbnNzdXBwb3J0Lk1ldGhvZEdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWVtZXRhY2xhc3NhY3Rpb25zc3VwcG9ydC5SZWZsZWN0aW9uTWV0aG9kR2VuZXJhdG9yOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZW1ldGFjbGFzc2FjdGlvbnNzdXBwb3J0LlN0YXRpY01ldGhvZEdlbmVyYXRvcjsKKworLyoKKyAqIENvcHlyaWdodCAyMDA1IEpvaG4gRy4gV2lsc29uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKKy8qKgorICogQGF1dGhvciBKb2huIFdpbHNvbgorICoKKyAqLworCitwdWJsaWMgY2xhc3MgTWV0YUNsYXNzQWN0aW9uc0dlbmVyYXRvciB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBhY3Rpb25zSW5mb01hcCA9IG5ldyBXZWFrSGFzaE1hcCgpOworICAKKyAgc3RhdGljIHsKKyAgICBhY3Rpb25zSW5mb01hcC5wdXQoT2JqZWN0LmNsYXNzLCBuZXcgQWN0aW9uc0luZm8oT2JqZWN0LmNsYXNzKSk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIE1ldGFDbGFzc0FjdGlvbnMgZ2V0QWN0aW9ucyhmaW5hbCBDbGFzcyBjbGF6KSB7CisgICAgcmV0dXJuIGdldEFjdGlvbnNJbmZvKGNsYXopLmdldEFjdGlvbnMoKTsKKyAgfQorICAKKyAgcHJvdGVjdGVkIHN0YXRpYyBBY3Rpb25zSW5mbyBnZXRBY3Rpb25zSW5mbyhmaW5hbCBDbGFzcyBjbGF6KSB7CisgIEFjdGlvbnNJbmZvIGNsYXNzSW5mbyA9IChBY3Rpb25zSW5mbylhY3Rpb25zSW5mb01hcC5nZXQoY2xheik7CisgIAorICAgIGlmIChjbGFzc0luZm8gPT0gbnVsbCkgeworICAgIGZpbmFsIENsYXNzIHN1cGVyQ2xhc3MgPSBjbGF6LmdldFN1cGVyY2xhc3MoKTsKKyAgICAKKyAgICAgIGlmIChzdXBlckNsYXNzICE9IG51bGwpIHsKKyAgICAgICAgZ2V0QWN0aW9uc0luZm8oc3VwZXJDbGFzcyk7IC8vIGVuc3VyZSB0aGF0IHRoZSBzdXBlcmNsYXNzIGluZm9ybWF0aW9uIGhhcyBiZWVuIGNyZWF0ZWQKKyAgICAgIH0KKyAgICAgIAorICAgICAgY2xhc3NJbmZvID0gbmV3IEFjdGlvbnNJbmZvKGNsYXopOworICAgICAgYWN0aW9uc0luZm9NYXAucHV0KGNsYXosIGNsYXNzSW5mbyk7CisgICAgfQorICAgIAorICAgIHJldHVybiBjbGFzc0luZm87CisgIH0KK30KKworY2xhc3MgQWN0aW9uc0luZm8geworICBwcml2YXRlIHN0YXRpYyBNYXAgZGVmYXVsdEdyb292eU1ldGhvZHNNYXAgPSBuZXcgSGFzaE1hcCgpOworICBzdGF0aWMgeworICAgIHRyeSB7CisgICAgICBmaW5hbCBNZXRob2RbXSBkZWZhdWx0R3Jvb3Z5TWV0aG9kcyA9IENsYXNzLmZvck5hbWUoIm9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5EZWZhdWx0R3Jvb3Z5TWV0aG9kcyIpLmdldERlY2xhcmVkTWV0aG9kcygpOworICAgICAgCisgICAgICBmb3IgKGludCBpID0gMDsgaSAhPSBkZWZhdWx0R3Jvb3Z5TWV0aG9kcy5sZW5ndGg7IGkrKykgeworICAgICAgICBmaW5hbCBNZXRob2QgbWV0aG9kID0gZGVmYXVsdEdyb292eU1ldGhvZHNbaV07CisgICAgICAgIAorICAgICAgICBpZiAoKG1ldGhvZC5nZXRNb2RpZmllcnMoKSAmIChNb2RpZmllci5QVUJMSUMgfCBNb2RpZmllci5TVEFUSUMpKSA9PSAoTW9kaWZpZXIuUFVCTElDIHwgTW9kaWZpZXIuU1RBVElDKSkgeworICAgICAgICBmaW5hbCBDbGFzc1tdIHBhcmFtZXRlclR5cGVzID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7CisgICAgICAgIAorICAgICAgICAgIGlmIChwYXJhbWV0ZXJUeXBlcy5sZW5ndGggIT0gMCkgeworICAgICAgICAgIExpc3QgbWV0aG9kTGlzdCA9IChMaXN0KWRlZmF1bHRHcm9vdnlNZXRob2RzTWFwLmdldChwYXJhbWV0ZXJUeXBlc1swXSk7CisgICAgICAgICAgCisgICAgICAgICAgICBpZiAobWV0aG9kTGlzdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgIG1ldGhvZExpc3QgPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICAgICAgICBkZWZhdWx0R3Jvb3Z5TWV0aG9kc01hcC5wdXQocGFyYW1ldGVyVHlwZXNbMF0sIG1ldGhvZExpc3QpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtZXRob2RMaXN0LmFkZChuZXcgRGVmYXVsdEdyb292eUluc3RhbmNlTWV0aG9kR2VuZXJhdG9yKG1ldGhvZCkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgIH0KKyAgfQorICAKKyAgcHJpdmF0ZSBzdGF0aWMgTWFwIGRlZmF1bHRHcm9vdnlTdGF0aWNNZXRob2RzTWFwID0gbmV3IEhhc2hNYXAoKTsKKyAgc3RhdGljIHsKKyAgICB0cnkgeworICAgICAgZmluYWwgTWV0aG9kW10gZGVmYXVsdEdyb292eVN0YXRpY01ldGhvZHMgPSBDbGFzcy5mb3JOYW1lKCJvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuRGVmYXVsdEdyb292eVN0YXRpY01ldGhvZHMiKS5nZXREZWNsYXJlZE1ldGhvZHMoKTsKKyAgICAgIAorICAgICAgZm9yIChpbnQgaSA9IDA7IGkgIT0gZGVmYXVsdEdyb292eVN0YXRpY01ldGhvZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgZmluYWwgTWV0aG9kIG1ldGhvZCA9IGRlZmF1bHRHcm9vdnlTdGF0aWNNZXRob2RzW2ldOworICAgICAgICAKKyAgICAgICAgaWYgKChtZXRob2QuZ2V0TW9kaWZpZXJzKCkgJiAoTW9kaWZpZXIuUFVCTElDIHwgTW9kaWZpZXIuU1RBVElDKSkgPT0gKE1vZGlmaWVyLlBVQkxJQyB8IE1vZGlmaWVyLlNUQVRJQykpIHsKKyAgICAgICAgZmluYWwgQ2xhc3NbXSBwYXJhbWV0ZXJUeXBlcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOworICAgICAgICAKKyAgICAgICAgICBpZiAocGFyYW1ldGVyVHlwZXMubGVuZ3RoICE9IDApIHsKKyAgICAgICAgICBMaXN0IG1ldGhvZExpc3QgPSAoTGlzdClkZWZhdWx0R3Jvb3Z5U3RhdGljTWV0aG9kc01hcC5nZXQocGFyYW1ldGVyVHlwZXNbMF0pOworICAgICAgICAgIAorICAgICAgICAgICAgaWYgKG1ldGhvZExpc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICBtZXRob2RMaXN0ID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICAgICAgICAgICAgZGVmYXVsdEdyb292eVN0YXRpY01ldGhvZHNNYXAucHV0KHBhcmFtZXRlclR5cGVzWzBdLCBtZXRob2RMaXN0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbWV0aG9kTGlzdC5hZGQobmV3IERlZmF1bHRHcm9vdnlTdGF0aWNNZXRob2RHZW5lcmF0b3IobWV0aG9kKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgfQorICB9CisgIAorICBwcml2YXRlIE1ldGFDbGFzc0FjdGlvbnMgYWN0aW9ucyA9IG51bGw7CisgIHByaXZhdGUgZmluYWwgTGlzdCBnZW5lcmF0b3JzID0gbmV3IExpbmtlZExpc3QoKTsKKworICBwdWJsaWMgQWN0aW9uc0luZm8oZmluYWwgQ2xhc3MgY2xheikgeworICBmaW5hbCBQYWNrYWdlIHBhY2sgPSBjbGF6LmdldFBhY2thZ2UoKTsKKyAgZmluYWwgU3RyaW5nIHBhY2thZ2VOYW1lID0gImdyb292eS5ydW50aW1lLm1ldGFjbGFzc2FjdGlvbnMuIiArICgocGFjayA9PSBudWxsKSA/ICIiIDogcGFjay5nZXROYW1lKCkgKyAiLiIpOworICAKKyAgICBzZXRVcEdlbmVyYXRvcnMoY2xheik7ICAvLyBOZWVkIHRvIGRvIHRoaXMgZXZlbiBpZiB0aGUgY2xhc3MgaXMgYWxyZWFkeSBnZW5lcmF0ZWQKKyAgCisgICAgdHJ5IHsKKyAgICBmaW5hbCBDbGFzcyBhY3Rpb25zQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKHBhY2thZ2VOYW1lICsgY2xhei5nZXRTaW1wbGVOYW1lKCkgKyAiTWV0YUNsYXNzQWN0aW9ucyIpOworICAgIAorICAgICAgdGhpcy5hY3Rpb25zID0gKE1ldGFDbGFzc0FjdGlvbnMpYWN0aW9uc0NsYXNzLm5ld0luc3RhbmNlKCk7CisgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUxKSB7CisgICAgZmluYWwgRmlsZSBnZW5lcmF0ZWRGaWxlID0gbmV3IEZpbGUoImdlbmVyYXRlZC8iICsgcGFja2FnZU5hbWUucmVwbGFjZSgnLicsICcvJykpOworICAgICAgCisgICAgICBnZW5lcmF0ZWRGaWxlLm1rZGlycygpOworICAgICAgCisgICAgICB0cnkgeworICAgICAgZmluYWwgV3JpdGVyIG91dCA9IG5ldyBGaWxlV3JpdGVyKG5ldyBGaWxlKGdlbmVyYXRlZEZpbGUsICBjbGF6LmdldFNpbXBsZU5hbWUoKSArICJNZXRhQ2xhc3NBY3Rpb25zLmphdmEiKSk7CisgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBvdXQud3JpdGUoZ2VuZXJhdGVKYXZhRmlsZShjbGF6KSk7CisgICAgICAgIH0gZmluYWxseSB7ICAgIAorICAgICAgICAgIG91dC5jbG9zZSgpOworICAgICAgICB9CisgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgfQorICAgIH0gIAorICB9CisgIAorICBwdWJsaWMgTWV0YUNsYXNzQWN0aW9ucyBnZXRBY3Rpb25zKCkgeworICAgIHJldHVybiB0aGlzLmFjdGlvbnM7CisgIH0KKyAgCisgIHByaXZhdGUgdm9pZCBzZXRVcEdlbmVyYXRvcnMoZmluYWwgQ2xhc3MgY2xheikgeworICBmaW5hbCBNZXRob2RbXSBtZXRob2RzID0gY2xhei5nZXREZWNsYXJlZE1ldGhvZHMoKTsKKyAgZmluYWwgTGlzdCBkZWZhdWx0TWV0aG9kcyA9IChMaXN0KWRlZmF1bHRHcm9vdnlNZXRob2RzTWFwLmdldChjbGF6KTsKKyAgZmluYWwgTGlzdCBkZWZhdWx0U3RhdGljTWV0aG9kcyA9IChMaXN0KWRlZmF1bHRHcm9vdnlTdGF0aWNNZXRob2RzTWFwLmdldChjbGF6KTsKKyAgCisgICAgaWYgKGRlZmF1bHRNZXRob2RzICE9IG51bGwpIHsKKyAgICAgIHRoaXMuZ2VuZXJhdG9ycy5hZGRBbGwoZGVmYXVsdE1ldGhvZHMpOworICAgIH0KKyAgICAKKyAgICBpZiAoZGVmYXVsdFN0YXRpY01ldGhvZHMgIT0gbnVsbCkgeworICAgICAgdGhpcy5nZW5lcmF0b3JzLmFkZEFsbChkZWZhdWx0U3RhdGljTWV0aG9kcyk7CisgICAgfQorICAgIAorICAgIGZvciAoaW50IGkgPSAwOyBpICE9IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKKyAgICBmaW5hbCBNZXRob2QgbWV0aG9kID0gbWV0aG9kc1tpXTsKKyAgICBmaW5hbCBpbnQgbWV0aG9kTW9kaWZpZXJzID0gbWV0aG9kLmdldE1vZGlmaWVycygpOworICAgIAorICAgICAgaWYgKChtZXRob2RNb2RpZmllcnMgJiBNb2RpZmllci5QVUJMSUMpICE9IDApIHsgICAgICAgIAorICAgICAgICBpZiAoKG1ldGhvZE1vZGlmaWVycyAmIE1vZGlmaWVyLlNUQVRJQykgIT0gMCkgeworICAgICAgICAgIHRoaXMuZ2VuZXJhdG9ycy5hZGQobmV3IFN0YXRpY01ldGhvZEdlbmVyYXRvcihtZXRob2QpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aGlzLmdlbmVyYXRvcnMuYWRkKG5ldyBJbnN0YW5jZU1ldGhvZEdlbmVyYXRvcihtZXRob2QpKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmICgobWV0aG9kTW9kaWZpZXJzICYgTW9kaWZpZXIuUFJPVEVDVEVEKSAhPSAwKSB7CisgICAgICAgIHRoaXMuZ2VuZXJhdG9ycy5hZGQobmV3IFJlZmxlY3Rpb25NZXRob2RHZW5lcmF0b3IobWV0aG9kKSk7CisgICAgICB9CisgICAgfQorICAgIAorICAgIGlmIChjbGF6ICE9IE9iamVjdC5jbGFzcykgeworICAgIGZpbmFsIENsYXNzIHN1cGVyQ2xhc3MgPSBjbGF6LmdldFN1cGVyY2xhc3MoKTsKKyAgICAKKyAgICAgIGlmIChzdXBlckNsYXNzICE9IG51bGwpIHsKKyAgICAgICAgdGhpcy5nZW5lcmF0b3JzLmFkZEFsbChNZXRhQ2xhc3NBY3Rpb25zR2VuZXJhdG9yLmdldEFjdGlvbnNJbmZvKHN1cGVyQ2xhc3MpLmdlbmVyYXRvcnMpOworICAgICAgfQorICAgICAgCisgICAgICBmaW5hbCBDbGFzc1tdIGludGVyZmFjZXMgPSBjbGF6LmdldEludGVyZmFjZXMoKTsKKyAgICAgIAorICAgICAgZm9yIChpbnQgaSA9IDA7IGkgIT0gaW50ZXJmYWNlcy5sZW5ndGg7IGkrKykgeworICAgICAgICB0aGlzLmdlbmVyYXRvcnMuYWRkQWxsKE1ldGFDbGFzc0FjdGlvbnNHZW5lcmF0b3IuZ2V0QWN0aW9uc0luZm8oaW50ZXJmYWNlc1tpXSkuZ2VuZXJhdG9ycyk7CisgICAgICB9CisgICAgfQorICAgIAorICAgIENvbGxlY3Rpb25zLnNvcnQodGhpcy5nZW5lcmF0b3JzLCBuZXcgQ29tcGFyYXRvcigpIHsKKyAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShmaW5hbCBPYmplY3QgbGhzLCBmaW5hbCBPYmplY3QgcmhzKSB7CisgICAgICBmaW5hbCBpbnQgbGhzTnVtYmVyT2ZQYXJhbWV0ZXJzID0gKChNZXRob2RHZW5lcmF0b3IpbGhzKS5nZXROdW1iZXJPZlBhcmFtZXRlcnMoKTsKKyAgICAgIGZpbmFsIGludCByaHNOdW1iZXJPZlBhcmFtZXRlcnMgPSAoKE1ldGhvZEdlbmVyYXRvcilyaHMpLmdldE51bWJlck9mUGFyYW1ldGVycygpOworICAgICAgCisgICAgICAgIGlmIChsaHNOdW1iZXJPZlBhcmFtZXRlcnMgID09IHJoc051bWJlck9mUGFyYW1ldGVycykgeworICAgICAgICBmaW5hbCBTdHJpbmcgbGhzTmFtZSA9ICgoTWV0aG9kR2VuZXJhdG9yKWxocykuZ2V0TmFtZSgpOworICAgICAgICBmaW5hbCBTdHJpbmcgcmhzTmFtZSA9ICgoTWV0aG9kR2VuZXJhdG9yKXJocykuZ2V0TmFtZSgpOworICAgICAgICAKKyAgICAgICAgICByZXR1cm4gbGhzTmFtZS5jb21wYXJlVG8ocmhzTmFtZSk7CisgICAgICAgIH0gZWxzZSBpZiAobGhzTnVtYmVyT2ZQYXJhbWV0ZXJzICA8IHJoc051bWJlck9mUGFyYW1ldGVycykgeworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0pOworICAgIAorICAgIGlmICh0aGlzLmdlbmVyYXRvcnMuc2l6ZSgpID4gMSkgeworICAgIE1ldGhvZEdlbmVyYXRvciBnMSA9IChNZXRob2RHZW5lcmF0b3IpdGhpcy5nZW5lcmF0b3JzLmdldCh0aGlzLmdlbmVyYXRvcnMuc2l6ZSgpIC0gMSk7CisgICAgICAKKyAgICAgIGZvciAoaW50IGkgPSB0aGlzLmdlbmVyYXRvcnMuc2l6ZSgpIC0gMjsgaSA+IC0xIDsgaS0tKSB7CisgICAgICBmaW5hbCBNZXRob2RHZW5lcmF0b3IgZzIgPSAoTWV0aG9kR2VuZXJhdG9yKXRoaXMuZ2VuZXJhdG9ycy5nZXQoaSk7CisgICAgICAKKyAgICAgICAgaWYgKGcxLmlzT3ZlcmxvYWRlZChnMikpIHsKKyAgICAgICAgICB0aGlzLmdlbmVyYXRvcnMucmVtb3ZlKGkgKyAxKTsKKyAgICAgICAgICBnMSA9IGcxLnByb2Nlc3NPdmVybG9hZGVkKGNsYXosIGcyKTsKKyAgICAgICAgICB0aGlzLmdlbmVyYXRvcnMuc2V0KGksIGcxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnMSA9IGcyOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIAorICBwcml2YXRlIFN0cmluZyBnZW5lcmF0ZUphdmFGaWxlKGZpbmFsIENsYXNzIGNsYXopIHsKKyAgZmluYWwgU3RyaW5nQnVmZmVyIGNvZGUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgCisgICAgZ2VuZXJhdGVTdGFydE9mRmlsZShjbGF6LCBjb2RlKTsKKyAgICAKKyAgICBmaW5hbCBJdGVyYXRvciBpdGVyID0gdGhpcy5nZW5lcmF0b3JzLml0ZXJhdG9yKCk7CisgICAgaW50IG1ldGhvZEluZGV4ID0gMDsKKyAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICBmaW5hbCBNZXRob2RHZW5lcmF0b3IgZ2VuID0gKE1ldGhvZEdlbmVyYXRvcilpdGVyLm5leHQoKTsKKyAgICAKKyAgICAgIGNvZGUuYXBwZW5kKGdlbi5nZW5lcmF0ZURlY2xhcmF0aW9uKG1ldGhvZEluZGV4KyspKTsKKyAgICB9CisgICAgCisgICAgZ2VuZXJhdGVJbnZva2VtZXRob2QoY2xheiwgY29kZSk7CisgICAgCisgICAgZ2VuZXJhdGVFbmRPZkZpbGUoY2xheiwgY29kZSk7CisgICAgCisgICAgcmV0dXJuIGNvZGUudG9TdHJpbmcoKTsKKyAgfQorICAKKyAgcHJpdmF0ZSB2b2lkIGFkZE1ldGhvZChmaW5hbCBTZXQgbWV0aG9kU2V0LCBmaW5hbCBNYXAgbWV0aG9kTWFwLCBmaW5hbCBMaXN0IG1ldGhvZHMpIHsKKyAgZmluYWwgSXRlcmF0b3IgbWV0aG9kSXRlcmF0b3IgPSBtZXRob2RzLml0ZXJhdG9yKCk7CisgICAgCisgICAgd2hpbGUgKG1ldGhvZEl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgZmluYWwgTWV0YU1ldGhvZCBtZXRob2QgPSAoTWV0YU1ldGhvZCltZXRob2RJdGVyYXRvci5uZXh0KCk7CisgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IG1ldGhvZC5nZXROYW1lKCk7CisgICAgICAKKyAgICAgIG1ldGhvZFNldC5hZGQobmFtZSk7CisgICAgICAKKyAgICAgIExpc3QgbWV0aG9kTGlzdCA9IChMaXN0KW1ldGhvZE1hcC5nZXQobmFtZSk7CisgICAgICBpZiAobWV0aG9kTGlzdCA9PSBudWxsKSB7CisgICAgICAgIG1ldGhvZExpc3QgPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICAKKyAgICAgICAgbWV0aG9kTWFwLnB1dChuYW1lLCBtZXRob2RMaXN0KTsKKyAgICAgIH0KKyAgICAgIG1ldGhvZExpc3QuYWRkKG1ldGhvZCk7CisgICAgfQorICB9CisgIAorICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVTdGFydE9mRmlsZShmaW5hbCBDbGFzcyBjbGF6LCBmaW5hbCBTdHJpbmdCdWZmZXIgY29kZSkgeworICBmaW5hbCBQYWNrYWdlIHBhY2sgPSBjbGF6LmdldFBhY2thZ2UoKTsKKyAgZmluYWwgU3RyaW5nIHBhY2thZ2VOYW1lID0gKHBhY2sgPT0gbnVsbCkgPyAiIiA6ICIuIiArIHBhY2suZ2V0TmFtZSgpOworICAKKyAgICBjb2RlLmFwcGVuZCgicGFja2FnZSBncm9vdnkucnVudGltZS5tZXRhY2xhc3NhY3Rpb25zIikuYXBwZW5kKHBhY2thZ2VOYW1lKS5hcHBlbmQoIjtcbiIpOworICAgIGNvZGUuYXBwZW5kKCJpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kO1xuIik7CisgICAgY29kZS5hcHBlbmQoImltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7XG4iKTsKKyAgICBjb2RlLmFwcGVuZCgiaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjtcbiIpOworICAgIGNvZGUuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKGNsYXouZ2V0U2ltcGxlTmFtZSgpKS5hcHBlbmQoIk1ldGFDbGFzc0FjdGlvbnMgZXh0ZW5kcyBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuTWV0YUNsYXNzQWN0aW9ucyB7XG4iKTsKKyAgfQorICAKKyAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlSW52b2tlbWV0aG9kKGZpbmFsIENsYXNzIGNsYXosIGZpbmFsIFN0cmluZ0J1ZmZlciBjb2RlKSB7CisgICAgCisgICAgY29kZS5hcHBlbmQoInB1YmxpYyBPYmplY3QgZG9JbnZva2VNZXRob2QoZmluYWwgT2JqZWN0IHRhcmdldCwgZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIE9iamVjdFtdIGFyZ3MpICIpOworICAgIGNvZGUuYXBwZW5kKCJ0aHJvd3MgRXhjZXB0aW9uIHtcbiIpOworICAgIAorICAgIGlmICh0aGlzLmdlbmVyYXRvcnMuc2l6ZSgpICE9IDApIHsKKyAgICBmaW5hbCBMaXN0IGdlbmVyYXRvclN1YnNldCA9IG5ldyBMaW5rZWRMaXN0KCk7CisgICAgTWV0aG9kR2VuZXJhdG9yIGZpcnN0R2VuZXJhdG9yID0gKE1ldGhvZEdlbmVyYXRvcil0aGlzLmdlbmVyYXRvcnMuZ2V0KDApOworICAgIGludCBjdXJyZW50QXJnc0xlbmd0aCA9IGZpcnN0R2VuZXJhdG9yLmdldE51bWJlck9mUGFyYW1ldGVycygpOworICAgIGNoYXIgZmlyc3RDaGFyID0gZmlyc3RHZW5lcmF0b3IuZ2V0TmFtZSgpLmNoYXJBdCgwKTsKKyAgICBmaW5hbCBJdGVyYXRvciBpdGVyID0gdGhpcy5nZW5lcmF0b3JzLml0ZXJhdG9yKCk7CisgICAgCisgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgIGZpbmFsIE1ldGhvZEdlbmVyYXRvciBnZW5lcmF0b3IgPSAoTWV0aG9kR2VuZXJhdG9yKWl0ZXIubmV4dCgpOworICAgICAgCisgICAgICAgIGlmIChjdXJyZW50QXJnc0xlbmd0aCA9PSBnZW5lcmF0b3IuZ2V0TnVtYmVyT2ZQYXJhbWV0ZXJzKCkpIHsKKyAgICAgICAgICBnZW5lcmF0b3JTdWJzZXQuYWRkKGdlbmVyYXRvcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ2VuZXJhdGVDYWxscyhjbGF6LCBjb2RlLCBjdXJyZW50QXJnc0xlbmd0aCwgZ2VuZXJhdG9yU3Vic2V0KTsKKyAgICAgICAgICBjdXJyZW50QXJnc0xlbmd0aCA9IGdlbmVyYXRvci5nZXROdW1iZXJPZlBhcmFtZXRlcnMoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgCisgICAgICBnZW5lcmF0ZUNhbGxzKGNsYXosIGNvZGUsIGN1cnJlbnRBcmdzTGVuZ3RoLCBnZW5lcmF0b3JTdWJzZXQpOworICAgICAgCisgICAgICBjb2RlLnNldExlbmd0aChjb2RlLmxlbmd0aCgpIC0gNik7ICAvLyBjaG9wIHRoZSB0cmFpbGluZyAiIGVsc2UgIiAgICAgCisgICAgfQorICAgIAorICAgIGNvZGUuYXBwZW5kKCJcbnJldHVybiBncm9vdnkubGFuZy5NZXRhQ2xhc3MuTk9fTUVUSE9EX0ZPVU5EOyIpOworICAgIGNvZGUuYXBwZW5kKCJcbn1cbiIpOworICB9CisgIAorICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVDYWxscyhmaW5hbCBDbGFzcyBjbGF6LCBmaW5hbCBTdHJpbmdCdWZmZXIgY29kZSwgZmluYWwgaW50IGN1cnJlbnRBcmdzTGVuZ3RoLCBmaW5hbCBMaXN0IGdlbmVyYXRvclN1YnNldCkgeworICAgIGlmIChnZW5lcmF0b3JTdWJzZXQuc2l6ZSgpICE9IDApIHsKKyAgICAgIGNvZGUuYXBwZW5kKCJpZiAoYXJncy5sZW5ndGggPT0gIikuYXBwZW5kKGN1cnJlbnRBcmdzTGVuZ3RoKS5hcHBlbmQoIikge1xuIik7CisgICAgICBjb2RlLmFwcGVuZCgic3dpdGNoKG5hbWUuY2hhckF0KDApKSB7Iik7CisgICAgICAKKyAgICAgIGJvb2xlYW4gZmlyc3RDYXNlID0gdHJ1ZTsKKyAgICAgIGZpbmFsIEl0ZXJhdG9yIGl0ZXIxID0gZ2VuZXJhdG9yU3Vic2V0Lml0ZXJhdG9yKCk7CisgICAgICBjaGFyIGZjID0gMDsKKyAgICAgIAorICAgICAgd2hpbGUgKGl0ZXIxLmhhc05leHQoKSkgeworICAgICAgZmluYWwgTWV0aG9kR2VuZXJhdG9yIGdlbmVyYXRvcjEgPSAoTWV0aG9kR2VuZXJhdG9yKWl0ZXIxLm5leHQoKTsKKyAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gZ2VuZXJhdG9yMS5nZXROYW1lKCk7CisgICAgICAKKyAgICAgICAgaWYgKGZjICE9IG5hbWUuY2hhckF0KDApKSB7CisgICAgICAgICAgaWYgKGZpcnN0Q2FzZSkgeworICAgICAgICAgICAgZmlyc3RDYXNlID0gZmFsc2U7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvZGUuYXBwZW5kKCIgZWxzZSB7XG4iKTsKKyAgICAgICAgICAgIGNvZGUuYXBwZW5kKCJyZXR1cm4gZ3Jvb3Z5LmxhbmcuTWV0YUNsYXNzLk5PX01FVEhPRF9GT1VORDtcbiIpOworICAgICAgICAgICAgY29kZS5hcHBlbmQoIn0iKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZmMgPSBuYW1lLmNoYXJBdCgwKTsKKyAgICAgICAgICBjb2RlLmFwcGVuZCgiXG5jYXNlICciKS5hcHBlbmQoZmMpLmFwcGVuZCgiJyA6XG4iKTsKKyAgICAgICAgICBjb2RlLmFwcGVuZCgiaWYgKFwiIikuYXBwZW5kKGdlbmVyYXRvcjEuZ2V0TmFtZSgpKS5hcHBlbmQoIlwiLmVxdWFscyhuYW1lKSkge1xuIik7CisgICAgICAgICAgY29kZS5hcHBlbmQoZ2VuZXJhdG9yMS5nZW5lcmF0ZUNhbGwoY2xheikpOworICAgICAgICAgIGNvZGUuYXBwZW5kKCJ9Iik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY29kZS5hcHBlbmQoIiBlbHNlIGlmIChcIiIpLmFwcGVuZChnZW5lcmF0b3IxLmdldE5hbWUoKSkuYXBwZW5kKCJcIi5lcXVhbHMobmFtZSkpIHtcbiIpOworICAgICAgICAgIGNvZGUuYXBwZW5kKGdlbmVyYXRvcjEuZ2VuZXJhdGVDYWxsKGNsYXopKTsKKyAgICAgICAgICBjb2RlLmFwcGVuZCgifSIpOworICAgICAgICB9CisgICAgICB9CisgICAgICAKKyAgICAgIGNvZGUuYXBwZW5kKCIgZWxzZSB7XG4iKTsKKyAgICAgIGNvZGUuYXBwZW5kKCJyZXR1cm4gZ3Jvb3Z5LmxhbmcuTWV0YUNsYXNzLk5PX01FVEhPRF9GT1VORDtcbiIpOworICAgICAgY29kZS5hcHBlbmQoIn1cbiIpOworICAgICAgY29kZS5hcHBlbmQoImRlZmF1bHQ6XG4iKTsKKyAgICAgIGNvZGUuYXBwZW5kKCJyZXR1cm4gZ3Jvb3Z5LmxhbmcuTWV0YUNsYXNzLk5PX01FVEhPRF9GT1VORDtcbiIpOworICAgICAgY29kZS5hcHBlbmQoIn1cbiIpOworICAgICAgY29kZS5hcHBlbmQoIn0gZWxzZSAiKTsKKyAgICAgIAorICAgICAgZ2VuZXJhdG9yU3Vic2V0LmNsZWFyKCk7CisgICAgfQorICB9CisgIAorICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVFbmRPZkZpbGUoZmluYWwgQ2xhc3MgY2xheiwgZmluYWwgU3RyaW5nQnVmZmVyIGNvZGUpIHsKKyAgICBjb2RlLmFwcGVuZCgifVxuIik7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9leHBlcmltZW50YWwvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lbWV0YWNsYXNzYWN0aW9uc3N1cHBvcnQvRGVmYXVsdEdyb292eUluc3RhbmNlTWV0aG9kR2VuZXJhdG9yLmphdmEgYi9ncm9vdnkvZXhwZXJpbWVudGFsL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZW1ldGFjbGFzc2FjdGlvbnNzdXBwb3J0L0RlZmF1bHRHcm9vdnlJbnN0YW5jZU1ldGhvZEdlbmVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYjQ2NjYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvZXhwZXJpbWVudGFsL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZW1ldGFjbGFzc2FjdGlvbnNzdXBwb3J0L0RlZmF1bHRHcm9vdnlJbnN0YW5jZU1ldGhvZEdlbmVyYXRvci5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lbWV0YWNsYXNzYWN0aW9uc3N1cHBvcnQ7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworCisvKgorICogQ29weXJpZ2h0IDIwMDUgSm9obiBHLiBXaWxzb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworLyoqCisgKiBAYXV0aG9yIEpvaG4gV2lsc29uCisgKgorICovCisKK3B1YmxpYyBjbGFzcyBEZWZhdWx0R3Jvb3Z5SW5zdGFuY2VNZXRob2RHZW5lcmF0b3IgZXh0ZW5kcyBNZXRob2RHZW5lcmF0b3IgeworCisgIC8qKgorICAgKiBAcGFyYW0gbWV0aG9kCisgICAqLworICBwdWJsaWMgRGVmYXVsdEdyb292eUluc3RhbmNlTWV0aG9kR2VuZXJhdG9yKE1ldGhvZCBtZXRob2QpIHsKKyAgICBzdXBlcihtZXRob2QpOworICB9CisgIAorICBwdWJsaWMgaW50IGdldE51bWJlck9mUGFyYW1ldGVycygpIHsKKyAgICByZXR1cm4gdGhpcy5tZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKS5sZW5ndGggLSAxOworICB9CisgIAorICAvKiAobm9uLUphdmFkb2MpCisgICAqIEBzZWUgTWV0aG9kR2VuZXJhdG9yI2dldFBhcmFtZXRlclR5cGVzKCkKKyAgICovCisgIHB1YmxpYyBDbGFzc1tdIGdldFBhcmFtZXRlclR5cGVzKCkgeworICBmaW5hbCBDbGFzc1tdIHBhcmFtZXRlclR5cGVzID0gdGhpcy5tZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKKyAgZmluYWwgQ2xhc3NbXSByZXN1bHQgPSBuZXcgQ2xhc3NbcGFyYW1ldGVyVHlwZXMubGVuZ3RoIC0gMV07CisgIAorICAgIFN5c3RlbS5hcnJheWNvcHkocGFyYW1ldGVyVHlwZXMsIDEsIHJlc3VsdCwgMCwgcmVzdWx0Lmxlbmd0aCk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHByb3RlY3RlZCB2b2lkIHN0YXJ0Q2FsbChmaW5hbCBTdHJpbmdCdWZmZXIgY29kZSkgeworICAgIGNvZGUuYXBwZW5kKERFRkFVTFRfR1JPT1ZZX01FVEhPRFMpLmFwcGVuZCgnLicpLmFwcGVuZCh0aGlzLm1ldGhvZC5nZXROYW1lKCkpLmFwcGVuZCgnKCcpOworICB9CisgIAorICBwcm90ZWN0ZWQgU3RyaW5nQnVmZmVyIGFkZFBhcmFtZXRlcnMoZmluYWwgU3RyaW5nQnVmZmVyIGNvZGUsIGZpbmFsIENsYXNzW10gcGFyYW1ldGVyVHlwZXMpIHsgICAKKyAgZmluYWwgQ2xhc3NbXSBuZXdQYXJhbWV0ZXJUeXBlcyA9IG5ldyBDbGFzc1twYXJhbWV0ZXJUeXBlcy5sZW5ndGggLSAxXTsKKyAgICAKKyAgICBTeXN0ZW0uYXJyYXljb3B5KHBhcmFtZXRlclR5cGVzLCAxLCBuZXdQYXJhbWV0ZXJUeXBlcywgMCwgbmV3UGFyYW1ldGVyVHlwZXMubGVuZ3RoKTsKKyAgICAKKyAgICBjb2RlLmFwcGVuZCgnKCcpOworICAgIGdldEZ1bGxOYW1lKHBhcmFtZXRlclR5cGVzWzBdLCBjb2RlKTsKKyAgICAKKyAgICBpZiAobmV3UGFyYW1ldGVyVHlwZXMubGVuZ3RoID09IDApIHsKKyAgICAgIGNvZGUuYXBwZW5kKCIpdGFyZ2V0Iik7CisgICAgfSBlbHNlIHsKKyAgICAgIGNvZGUuYXBwZW5kKCIpdGFyZ2V0LCAiKTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHN1cGVyLmFkZFBhcmFtZXRlcnMoY29kZSwgbmV3UGFyYW1ldGVyVHlwZXMpOworICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvZXhwZXJpbWVudGFsL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZW1ldGFjbGFzc2FjdGlvbnNzdXBwb3J0L0RlZmF1bHRHcm9vdnlTdGF0aWNNZXRob2RHZW5lcmF0b3IuamF2YSBiL2dyb292eS9leHBlcmltZW50YWwvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lbWV0YWNsYXNzYWN0aW9uc3N1cHBvcnQvRGVmYXVsdEdyb292eVN0YXRpY01ldGhvZEdlbmVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMTU2YzYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvZXhwZXJpbWVudGFsL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZW1ldGFjbGFzc2FjdGlvbnNzdXBwb3J0L0RlZmF1bHRHcm9vdnlTdGF0aWNNZXRob2RHZW5lcmF0b3IuamF2YQpAQCAtMCwwICsxLDQxIEBACitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZW1ldGFjbGFzc2FjdGlvbnNzdXBwb3J0OworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKKworLyoKKyAqIENvcHlyaWdodCAyMDA1IEpvaG4gRy4gV2lsc29uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKKy8qKgorICogQGF1dGhvciBKb2huIFdpbHNvbgorICoKKyAqLworCitwdWJsaWMgY2xhc3MgRGVmYXVsdEdyb292eVN0YXRpY01ldGhvZEdlbmVyYXRvciBleHRlbmRzIE1ldGhvZEdlbmVyYXRvciB7CisKKyAgLyoqCisgICAqIEBwYXJhbSBtZXRob2QKKyAgICovCisgIHB1YmxpYyBEZWZhdWx0R3Jvb3Z5U3RhdGljTWV0aG9kR2VuZXJhdG9yKE1ldGhvZCBtZXRob2QpIHsKKyAgICBzdXBlcihtZXRob2QpOworICB9CisKKyAgLyogKG5vbi1KYXZhZG9jKQorICAgKiBAc2VlIE1ldGhvZEdlbmVyYXRvciNzdGFydENhbGwoamF2YS5sYW5nLlN0cmluZ0J1ZmZlcikKKyAgICovCisgIHByb3RlY3RlZCB2b2lkIHN0YXJ0Q2FsbChTdHJpbmdCdWZmZXIgY29kZSkgeworICAgIGNvZGUuYXBwZW5kKERFRkFVTFRfU1RBVElDX0dST09WWV9NRVRIT0RTKS5hcHBlbmQoJy4nKS5hcHBlbmQodGhpcy5tZXRob2QuZ2V0TmFtZSgpKS5hcHBlbmQoJygnKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L2V4cGVyaW1lbnRhbC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWVtZXRhY2xhc3NhY3Rpb25zc3VwcG9ydC9JbnN0YW5jZU1ldGhvZEdlbmVyYXRvci5qYXZhIGIvZ3Jvb3Z5L2V4cGVyaW1lbnRhbC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWVtZXRhY2xhc3NhY3Rpb25zc3VwcG9ydC9JbnN0YW5jZU1ldGhvZEdlbmVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2M2Q5NzAKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvZXhwZXJpbWVudGFsL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZW1ldGFjbGFzc2FjdGlvbnNzdXBwb3J0L0luc3RhbmNlTWV0aG9kR2VuZXJhdG9yLmphdmEKQEAgLTAsMCArMSwzNSBAQAorcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWVtZXRhY2xhc3NhY3Rpb25zc3VwcG9ydDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKKworLyoKKyAqIENvcHlyaWdodCAyMDA1IEpvaG4gRy4gV2lsc29uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKKy8qKgorICogQGF1dGhvciBKb2huIFdpbHNvbgorICoKKyAqLworCitwdWJsaWMgY2xhc3MgSW5zdGFuY2VNZXRob2RHZW5lcmF0b3IgZXh0ZW5kcyBNZXRob2RHZW5lcmF0b3IgeworICBwdWJsaWMgSW5zdGFuY2VNZXRob2RHZW5lcmF0b3IoZmluYWwgTWV0aG9kIG1ldGhvZCkgeworICAgIHN1cGVyKG1ldGhvZCk7CisgIH0KKyAgCisgIHByb3RlY3RlZCB2b2lkIHN0YXJ0Q2FsbChmaW5hbCBTdHJpbmdCdWZmZXIgY29kZSkgeworICAgIGNvZGUuYXBwZW5kKCIoKCIpLmFwcGVuZCh0aGlzLm1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpLmdldE5hbWUoKSkuYXBwZW5kKCIpdGFyZ2V0KS4iKS5hcHBlbmQodGhpcy5tZXRob2QuZ2V0TmFtZSgpKS5hcHBlbmQoJygnKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L2V4cGVyaW1lbnRhbC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWVtZXRhY2xhc3NhY3Rpb25zc3VwcG9ydC9NZXRob2RHZW5lcmF0b3IuamF2YSBiL2dyb292eS9leHBlcmltZW50YWwvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lbWV0YWNsYXNzYWN0aW9uc3N1cHBvcnQvTWV0aG9kR2VuZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q2NzQ0NAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9leHBlcmltZW50YWwvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lbWV0YWNsYXNzYWN0aW9uc3N1cHBvcnQvTWV0aG9kR2VuZXJhdG9yLmphdmEKQEAgLTAsMCArMSwxOTMgQEAKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lbWV0YWNsYXNzYWN0aW9uc3N1cHBvcnQ7CitpbXBvcnQgZ3Jvb3Z5LmxhbmcuR1N0cmluZzsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKKworLyoKKyAqIENvcHlyaWdodCAyMDA1IEpvaG4gRy4gV2lsc29uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKKy8qKgorICogQGF1dGhvciBKb2huIFdpbHNvbgorICoKKyAqLworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWV0aG9kR2VuZXJhdG9yIHsKKyAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9HUk9PVllfTUVUSE9EUyA9ICJvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuRGVmYXVsdEdyb292eU1ldGhvZHMiOworICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBERUZBVUxUX1NUQVRJQ19HUk9PVllfTUVUSE9EUyA9ICJvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuRGVmYXVsdEdyb292eVN0YXRpY01ldGhvZHMiOworICAKKyAgcHJvdGVjdGVkIGZpbmFsIE1ldGhvZCBtZXRob2Q7CisgICAgCisgIC8qKgorICAgKiBAcGFyYW0gbWV0aG9kCisgICAqLworICBwdWJsaWMgTWV0aG9kR2VuZXJhdG9yKE1ldGhvZCBtZXRob2QpIHsKKyAgICB0aGlzLm1ldGhvZCA9IG1ldGhvZDsKKyAgfQorICAKKyAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgIHJldHVybiB0aGlzLm1ldGhvZC5nZXROYW1lKCk7CisgIH0KKyAgCisgIHB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZQYXJhbWV0ZXJzKCkgeworICAgIHJldHVybiB0aGlzLm1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aDsKKyAgfQorICAKKyAgcHVibGljIENsYXNzW10gZ2V0UGFyYW1ldGVyVHlwZXMoKSB7CisgICAgcmV0dXJuIHRoaXMubWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7CisgIH0KKyAgCisgIHB1YmxpYyBib29sZWFuIGlzT3ZlcmxvYWRlZChmaW5hbCBNZXRob2RHZW5lcmF0b3Igb3RoZXIpIHsKKyAgICByZXR1cm4gZ2V0TmFtZSgpLmVxdWFscyhvdGhlci5nZXROYW1lKCkpICYmIGdldE51bWJlck9mUGFyYW1ldGVycygpID09IG90aGVyLmdldE51bWJlck9mUGFyYW1ldGVycygpOworICB9CisgIAorICBwdWJsaWMgTWV0aG9kR2VuZXJhdG9yIHByb2Nlc3NPdmVybG9hZGVkKGZpbmFsIENsYXNzIGNsYXosIGZpbmFsIE1ldGhvZEdlbmVyYXRvciBvdGhlcikgeworICBmaW5hbCBDbGFzc1tdIHAxID0gZ2V0UGFyYW1ldGVyVHlwZXMoKTsKKyAgZmluYWwgQ2xhc3NbXSBwMiA9IG90aGVyLmdldFBhcmFtZXRlclR5cGVzKCk7CisgIAorICAgIGZvciAoaW50IGkgPSAwOyBpICE9IHAxLmxlbmd0aDsgaSsrKSB7CisgICAgICBpZiAocDFbaV0gIT0gcDJbaV0pIHsKKyAgICAgICAgcmV0dXJuIG5ldyBPdmVybG9hZGVkTWV0aG9kc0dlbmVyYXRvcih0aGlzLCBvdGhlcik7IC8vIFdlIGhhdmUgYW4gb3ZlcmxvYWRlZCBtZXRob2QgCisgICAgICB9CisgICAgfQorICAgIAorICAgIC8vIFdlIGhhdmUgYSBkdXBsaWNhdGUgLSByZXR1cm4gdGhlIG9uZSB3aGljaCBoYXMgaXRzIGRlY2xhcmluZyBjbGFzcyBhcyB0aGUgY3VycmVudCBjbGFzcworICAgIAorICAgIGlmICh0aGlzLm1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpID09IGNsYXopIHsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gb3RoZXI7CisgICAgfQorICB9CisgICAKKyAgcHVibGljIFN0cmluZyBnZW5lcmF0ZURlY2xhcmF0aW9uKGludCBtZXRob2RJbmRleCkgeworICAgIHJldHVybiAiIjsKKyAgfQorICAKKyAgcHVibGljIFN0cmluZyBnZW5lcmF0ZUNhbGwoZmluYWwgQ2xhc3MgY2xheikgeworICBmaW5hbCBTdHJpbmdCdWZmZXIgY29kZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgZmluYWwgQ2xhc3MgcmV0dXJuVHlwZSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7CisgICAgCisgICAgaWYgKHJldHVyblR5cGUuaXNQcmltaXRpdmUoKSkgeworICAgICAgaWYgKHJldHVyblR5cGUgPT0gdm9pZC5jbGFzcykgeworICAgICAgICBtYWtlQ2FsbChjb2RlKS5hcHBlbmQoIjtcbnJldHVybiBudWxsO1xuIik7CisgICAgICB9IGVsc2UgaWYgKHJldHVyblR5cGUgPT0gaW50LmNsYXNzKSB7CisgICAgICAgIGNvZGUuYXBwZW5kKCJyZXR1cm4gbmV3IEludGVnZXIoIik7CisgICAgICAgIG1ha2VDYWxsKGNvZGUpLmFwcGVuZCgiKTtcbiIpOyAgCisgICAgICB9IGVsc2UgaWYgKHJldHVyblR5cGUgPT0gbG9uZy5jbGFzcykgeworICAgICAgICBjb2RlLmFwcGVuZCgicmV0dXJuIG5ldyBMb25nKCIpOworICAgICAgICBtYWtlQ2FsbChjb2RlKS5hcHBlbmQoIik7XG4iKTsgIAorICAgICAgfSBlbHNlIGlmIChyZXR1cm5UeXBlID09IHNob3J0LmNsYXNzKSB7CisgICAgICAgIGNvZGUuYXBwZW5kKCJyZXR1cm4gbmV3IFNob3J0KCIpOworICAgICAgICBtYWtlQ2FsbChjb2RlKS5hcHBlbmQoIik7XG4iKTsgIAorICAgICAgfSBlbHNlIGlmIChyZXR1cm5UeXBlID09IGNoYXIuY2xhc3MpIHsKKyAgICAgICAgY29kZS5hcHBlbmQoInJldHVybiBuZXcgQ2hhcigiKTsKKyAgICAgICAgbWFrZUNhbGwoY29kZSkuYXBwZW5kKCIpO1xuIik7ICAKKyAgICAgIH0gZWxzZSBpZiAocmV0dXJuVHlwZSA9PSBieXRlLmNsYXNzKSB7CisgICAgICAgIGNvZGUuYXBwZW5kKCJyZXR1cm4gbmV3IEJ5dGUoIik7CisgICAgICAgIG1ha2VDYWxsKGNvZGUpLmFwcGVuZCgiKTtcbiIpOyAgCisgICAgICB9IGVsc2UgaWYgKHJldHVyblR5cGUgPT0gYm9vbGVhbi5jbGFzcykgeworICAgICAgICBjb2RlLmFwcGVuZCgicmV0dXJuIG5ldyBCb29sZWFuKCIpOworICAgICAgICBtYWtlQ2FsbChjb2RlKS5hcHBlbmQoIik7XG4iKTsgIAorICAgICAgfSBlbHNlIGlmIChyZXR1cm5UeXBlID09IGZsb2F0LmNsYXNzKSB7CisgICAgICAgIGNvZGUuYXBwZW5kKCJyZXR1cm4gbmV3IEZsb2F0KCIpOworICAgICAgICBtYWtlQ2FsbChjb2RlKS5hcHBlbmQoIik7XG4iKTsgIAorICAgICAgfSBlbHNlIGlmIChyZXR1cm5UeXBlID09IGRvdWJsZS5jbGFzcykgeworICAgICAgICBjb2RlLmFwcGVuZCgicmV0dXJuIG5ldyBEb3VibGUoIik7CisgICAgICAgIG1ha2VDYWxsKGNvZGUpLmFwcGVuZCgiKTtcbiIpOyAgCisgICAgICB9IGVsc2UgeworICAgICAgICBjb2RlLmFwcGVuZCgiKioqKiBFUlJPUiAqKioqKiBmb3VuZCBwcmltaXRpdmUgcmV0dXJuIHR5cGU6ICIgKyByZXR1cm5UeXBlLmdldE5hbWUoKSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGNvZGUuYXBwZW5kKCJyZXR1cm4gIik7CisgICAgICBtYWtlQ2FsbChjb2RlKS5hcHBlbmQoIjtcbiIpOyAgCisgICAgfQorICAgIAorICAgIHJldHVybiBjb2RlLnRvU3RyaW5nKCk7CisgIH0KKyAgCisgIHByaXZhdGUgU3RyaW5nQnVmZmVyIG1ha2VDYWxsKGZpbmFsIFN0cmluZ0J1ZmZlciBjb2RlKSB7CisgICAgc3RhcnRDYWxsKGNvZGUpOworICAgIGFkZFBhcmFtZXRlcnMoY29kZSwgdGhpcy5tZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKSkuYXBwZW5kKCcpJyk7CisgICAgCisgICAgcmV0dXJuIGNvZGU7CisgIH0KKyAgCisgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHN0YXJ0Q2FsbChTdHJpbmdCdWZmZXIgY29kZSk7CisgIAorICBwcm90ZWN0ZWQgU3RyaW5nQnVmZmVyIGFkZFBhcmFtZXRlcnMoZmluYWwgU3RyaW5nQnVmZmVyIGNvZGUsIGZpbmFsIENsYXNzW10gcGFyYW1ldGVyVHlwZXMpIHsKKyAgICBpZiAocGFyYW1ldGVyVHlwZXMubGVuZ3RoICE9IDApIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpICE9IHBhcmFtZXRlclR5cGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICBmaW5hbCBDbGFzcyBwYXJhbWV0ZXJUeXBlID0gcGFyYW1ldGVyVHlwZXNbaV07IAorICAgICAgICAKKyAgICAgICAgaWYgKHBhcmFtZXRlclR5cGUuaXNQcmltaXRpdmUoKSkgeworICAgICAgICAgIGlmIChwYXJhbWV0ZXJUeXBlID09IGludC5jbGFzcykgeworICAgICAgICAgICAgY29kZS5hcHBlbmQoIigoTnVtYmVyKSIpLmFwcGVuZCgiYXJnc1siKTsKKyAgICAgICAgICAgIGNvZGUuYXBwZW5kKGkpLmFwcGVuZCgiXSkuaW50VmFsdWUoKSwgIik7CisgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbWV0ZXJUeXBlID09IGxvbmcuY2xhc3MpIHsKKyAgICAgICAgICAgIGNvZGUuYXBwZW5kKCIoKE51bWJlcikiKS5hcHBlbmQoImFyZ3NbIik7CisgICAgICAgICAgICBjb2RlLmFwcGVuZChpKS5hcHBlbmQoIl0pLmxvbmdWYWx1ZSgpLCAiKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtZXRlclR5cGUgPT0gc2hvcnQuY2xhc3MpIHsKKyAgICAgICAgICAgIGNvZGUuYXBwZW5kKCIoKE51bWJlcikiKS5hcHBlbmQoImFyZ3NbIik7CisgICAgICAgICAgICBjb2RlLmFwcGVuZChpKS5hcHBlbmQoIl0pLnNob3J0VmFsdWUoKSwgIik7CisgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbWV0ZXJUeXBlID09IGNoYXIuY2xhc3MpIHsKKyAgICAgICAgICAgIGNvZGUuYXBwZW5kKCIoKENoYXJhY3RlcikiKS5hcHBlbmQoImFyZ3NbIik7CisgICAgICAgICAgICBjb2RlLmFwcGVuZChpKS5hcHBlbmQoIl0pLmNoYXJWYWx1ZSgpLCAiKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtZXRlclR5cGUgPT0gYnl0ZS5jbGFzcykgeworICAgICAgICAgICAgY29kZS5hcHBlbmQoIigoTnVtYmVyKSIpLmFwcGVuZCgiYXJnc1siKTsKKyAgICAgICAgICAgIGNvZGUuYXBwZW5kKGkpLmFwcGVuZCgiXSkuYnl0ZVZhbHVlKCksICIpOworICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1ldGVyVHlwZSA9PSBib29sZWFuLmNsYXNzKSB7CisgICAgICAgICAgICBjb2RlLmFwcGVuZCgiKChCb29sZWFuKSIpLmFwcGVuZCgiYXJnc1siKTsKKyAgICAgICAgICAgIGNvZGUuYXBwZW5kKGkpLmFwcGVuZCgiXSkuYm9vbGVhblZhbHVlKCksICIpOworICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1ldGVyVHlwZSA9PSBmbG9hdC5jbGFzcykgeworICAgICAgICAgICAgY29kZS5hcHBlbmQoIigoTnVtYmVyKSIpLmFwcGVuZCgiYXJnc1siKTsKKyAgICAgICAgICAgIGNvZGUuYXBwZW5kKGkpLmFwcGVuZCgiXSkuZmxvYXRWYWx1ZSgpLCAiKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtZXRlclR5cGUgPT0gZG91YmxlLmNsYXNzKSB7CisgICAgICAgICAgICBjb2RlLmFwcGVuZCgiKChOdW1iZXIpIikuYXBwZW5kKCJhcmdzWyIpOworICAgICAgICAgICAgY29kZS5hcHBlbmQoaSkuYXBwZW5kKCJdKS5kb3VibGVWYWx1ZSgpLCAiKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29kZS5hcHBlbmQoIioqKiogRVJST1IgKioqKiogZm91bmQgcHJpbWF0aXZlIHBhcmFtZXRlciB0eXBlOiAiICsgcGFyYW1ldGVyVHlwZS5nZXROYW1lKCkpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChwYXJhbWV0ZXJUeXBlID09IFN0cmluZy5jbGFzcykgeworICAgICAgICAgIGNvZGUuYXBwZW5kKCJhcmdzWyIpLmFwcGVuZChpKS5hcHBlbmQoIl0udG9TdHJpbmcoKSwgIik7CisgICAgICAgIH0gZWxzZSBpZiAocGFyYW1ldGVyVHlwZSA9PSBHU3RyaW5nLmNsYXNzKSB7CisgICAgICAgICAgY29kZS5hcHBlbmQoIihncm9vdnkubGFuZy5HU3RyaW5nKSgoYXJnc1siKS5hcHBlbmQoaSkuYXBwZW5kKCJdIGluc3RhbmNlb2YgZ3Jvb3Z5LmxhbmcuR1N0cmluZykgPyAiKTsKKyAgICAgICAgICBjb2RlLmFwcGVuZCgiYXJnc1siKS5hcHBlbmQoaSkuYXBwZW5kKCJdIDogIik7CisgICAgICAgICAgY29kZS5hcHBlbmQoIm5ldyBncm9vdnkubGFuZy5HU3RyaW5nKGFyZ3NbIikuYXBwZW5kKGkpLmFwcGVuZCgiXS50b1N0cmluZygpKXtwdWJsaWMgU3RyaW5nW10gZ2V0U3RyaW5ncygpIHtyZXR1cm4gKFN0cmluZyBbXSl0aGlzLmdldFZhbHVlcygpO319KSwgIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY29kZS5hcHBlbmQoJygnKTsKKyAgICAgICAgICBnZXRGdWxsTmFtZShwYXJhbWV0ZXJUeXBlLCBjb2RlKTsKKyAgICAgICAgICBjb2RlLmFwcGVuZCgiKWFyZ3NbIikuYXBwZW5kKGkpLmFwcGVuZCgiXSwgIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIAorICAgICAgY29kZS5zZXRMZW5ndGgoY29kZS5sZW5ndGgoKSAtIDIpOyAgLy8gdHJpbSB0aGUgbGFzdCAiJyAiIG9mZgorICAgIH0KKyAgICAKKyAgICByZXR1cm4gY29kZTsKKyAgfQorICAKKyAgcHJvdGVjdGVkIFN0cmluZ0J1ZmZlciBnZXRGdWxsTmFtZShmaW5hbCBDbGFzcyBjbGF6LCBmaW5hbCBTdHJpbmdCdWZmZXIgY29kZSkgeworICBmaW5hbCBQYWNrYWdlIGNsYXNzUGFja2FnZSA9IChjbGF6LmlzQXJyYXkoKSkgPyBjbGF6LmdldENvbXBvbmVudFR5cGUoKS5nZXRQYWNrYWdlKCkgOiBjbGF6LmdldFBhY2thZ2UoKTsgCisgIAorICAgIGlmIChjbGFzc1BhY2thZ2UgIT0gbnVsbCkgeworICAgICAgY29kZS5hcHBlbmQoY2xhc3NQYWNrYWdlLmdldE5hbWUoKSkuYXBwZW5kKCcuJykgOworICAgIH0KKworICAgIHJldHVybiBjb2RlLmFwcGVuZChjbGF6LmdldFNpbXBsZU5hbWUoKSk7CisgIH0KK30KKwpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L2V4cGVyaW1lbnRhbC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWVtZXRhY2xhc3NhY3Rpb25zc3VwcG9ydC9PdmVybG9hZGVkTWV0aG9kc0dlbmVyYXRvci5qYXZhIGIvZ3Jvb3Z5L2V4cGVyaW1lbnRhbC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWVtZXRhY2xhc3NhY3Rpb25zc3VwcG9ydC9PdmVybG9hZGVkTWV0aG9kc0dlbmVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3YzBhNjAKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvZXhwZXJpbWVudGFsL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZW1ldGFjbGFzc2FjdGlvbnNzdXBwb3J0L092ZXJsb2FkZWRNZXRob2RzR2VuZXJhdG9yLmphdmEKQEAgLTAsMCArMSwxOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNSBKb2huIEcuIFdpbHNvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZW1ldGFjbGFzc2FjdGlvbnNzdXBwb3J0OworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisKKy8qKgorICogQGF1dGhvciBKb2huIFdpbHNvbgorICoKKyAqLworCitwdWJsaWMgY2xhc3MgT3ZlcmxvYWRlZE1ldGhvZHNHZW5lcmF0b3IgZXh0ZW5kcyBNZXRob2RHZW5lcmF0b3IgeworICBwcml2YXRlIGZpbmFsIE1ldGhvZEdlbmVyYXRvciBmaXJzdE1ldGhvZDsKKyAgcHJpdmF0ZSBmaW5hbCBMaXN0IGdlbmVyYXRvckxpc3QgPSBuZXcgTGlua2VkTGlzdCgpOworICBwcml2YXRlIGludCBtZXRob2RJbmRleCA9IDA7CisgIAorICBwdWJsaWMgT3ZlcmxvYWRlZE1ldGhvZHNHZW5lcmF0b3IoZmluYWwgTWV0aG9kR2VuZXJhdG9yIGZpcnN0TWV0aG9kLCBmaW5hbCBNZXRob2RHZW5lcmF0b3Igc2Vjb25kTWV0aG9kKSB7CisgICAgc3VwZXIobnVsbCk7CisgICAgCisgICAgdGhpcy5maXJzdE1ldGhvZCA9IGZpcnN0TWV0aG9kOworICAgIHRoaXMuZ2VuZXJhdG9yTGlzdC5hZGQoZmlyc3RNZXRob2QpOworICAgIHRoaXMuZ2VuZXJhdG9yTGlzdC5hZGQoc2Vjb25kTWV0aG9kKTsKKyAgfQorCisgIC8qIChub24tSmF2YWRvYykKKyAgICogQHNlZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWVtZXRhY2xhc3NhY3Rpb25zc3VwcG9ydC5NZXRob2RHZW5lcmF0b3IjZ2VuZXJhdGVDYWxsKGphdmEubGFuZy5DbGFzcykKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVDYWxsKGZpbmFsIENsYXNzIGNsYXopIHsKKyAgZmluYWwgU3RyaW5nQnVmZmVyIGNvZGUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgIGZpbmFsIEl0ZXJhdG9yIGl0ZXIgPSB0aGlzLmdlbmVyYXRvckxpc3QuaXRlcmF0b3IoKTsKKyAgaW50IGkgPSAwOworICAKKyAgICBjb2RlLmFwcGVuZCgic3dpdGNoKGNob29zZU1ldGhvZChwb3NzaWJsZSIpLmFwcGVuZChnZXROYW1lKCkpLmFwcGVuZCgiUGFyYW1ldGVycyIpLmFwcGVuZCh0aGlzLm1ldGhvZEluZGV4KS5hcHBlbmQoIiwgYXJncykpIHtcbiIpOworICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgIGZpbmFsIE1ldGhvZEdlbmVyYXRvciBnZW5lcmF0b3IgPSAoTWV0aG9kR2VuZXJhdG9yKWl0ZXIubmV4dCgpOworICAgICAgCisgICAgICBjb2RlLmFwcGVuZCgiY2FzZSAiKS5hcHBlbmQoaSsrKS5hcHBlbmQoIjogXG4iKTsKKyAgICAgIGNvZGUuYXBwZW5kKGdlbmVyYXRvci5nZW5lcmF0ZUNhbGwoY2xheikpOworICAgIH0KKyAgICBjb2RlLmFwcGVuZCgiZGVmYXVsdDpcbiIpOworICAgIGNvZGUuYXBwZW5kKCJyZXR1cm4gZ3Jvb3Z5LmxhbmcuTWV0YUNsYXNzLk5PX01FVEhPRF9GT1VORDtcbiIpOworICAgIGNvZGUuYXBwZW5kKCJ9XG4iKTsKKworICAgIHJldHVybiBjb2RlLnRvU3RyaW5nKCk7CisgIH0KKyAgCisgIC8qIChub24tSmF2YWRvYykKKyAgICogQHNlZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWVtZXRhY2xhc3NhY3Rpb25zc3VwcG9ydC5NZXRob2RHZW5lcmF0b3Ijc3RhcnRDYWxsKGphdmEubGFuZy5TdHJpbmdCdWZmZXIpCisgICAqLworICBwcm90ZWN0ZWQgdm9pZCBzdGFydENhbGwoZmluYWwgU3RyaW5nQnVmZmVyIGNvZGUpIHsKKworICB9CisKKyAgLyogKG5vbi1KYXZhZG9jKQorICAgKiBAc2VlIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZW1ldGFjbGFzc2FjdGlvbnNzdXBwb3J0Lk1ldGhvZEdlbmVyYXRvciNnZW5lcmF0ZURlY2xhcmF0aW9uKGludCkKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVEZWNsYXJhdGlvbihmaW5hbCBpbnQgbWV0aG9kSW5kZXgpIHsKKyAgZmluYWwgU3RyaW5nQnVmZmVyIGNvZGUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgIGZpbmFsIEl0ZXJhdG9yIGl0ZXIgPSB0aGlzLmdlbmVyYXRvckxpc3QuaXRlcmF0b3IoKTsKKyAgaW50IGkgPSAxOworICAKKyAgICB0aGlzLm1ldGhvZEluZGV4ID0gbWV0aG9kSW5kZXg7CisgIAorICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgIGZpbmFsIE1ldGhvZEdlbmVyYXRvciBnZW5lcmF0b3IgPSAoTWV0aG9kR2VuZXJhdG9yKWl0ZXIubmV4dCgpOworICAgIAorICAgICAgY29kZS5hcHBlbmQoZ2VuZXJhdG9yLmdlbmVyYXRlRGVjbGFyYXRpb24oKG1ldGhvZEluZGV4IDw8IDE2KSB8IGkgKSk7IC8vIFRPRE86IGZpbmQgYSBiZXR0ZXIgd2F5IG9mIGdldHRpbmcgdW5pcXVlIGluZGV4ZXMKKyAgICB9CisgICAgCisgICAgY29kZS5hcHBlbmQoInByaXZhdGUgZmluYWwgQ2xhc3NbXVtdIHBvc3NpYmxlIikuYXBwZW5kKGdldE5hbWUoKSkuYXBwZW5kKCJQYXJhbWV0ZXJzIikuYXBwZW5kKG1ldGhvZEluZGV4KS5hcHBlbmQoIiA9IG5ldyBDbGFzc1tdW117XG4iKTsKKyAgICBmaW5hbCBJdGVyYXRvciBpdGVyMSA9IHRoaXMuZ2VuZXJhdG9yTGlzdC5pdGVyYXRvcigpOworCisgICAgd2hpbGUgKGl0ZXIxLmhhc05leHQoKSkgeworICAgIGZpbmFsIE1ldGhvZEdlbmVyYXRvciBnZW5lcmF0b3IgPSAoTWV0aG9kR2VuZXJhdG9yKWl0ZXIxLm5leHQoKTsKKyAgICBmaW5hbCBDbGFzc1tdIHBhcmFtZXRlclR5cGVzID0gZ2VuZXJhdG9yLmdldFBhcmFtZXRlclR5cGVzKCk7CisgICAgCisgICAgICBjb2RlLmFwcGVuZCgibmV3IENsYXNzW10geyIpOworICAgICAgCisgICAgICBmb3IgKGludCBqID0gMDsgaiAhPSBwYXJhbWV0ZXJUeXBlcy5sZW5ndGg7IGorKykgeworICAgICAgZmluYWwgQ2xhc3MgcGFyYW1ldGVyVHlwZSA9IHBhcmFtZXRlclR5cGVzW2pdOworICAgICAgCisgICAgICAgIGlmIChwYXJhbWV0ZXJUeXBlLmlzUHJpbWl0aXZlKCkpIHsKKyAgICAgICAgICBpZiAocGFyYW1ldGVyVHlwZSA9PSBpbnQuY2xhc3MpIHsKKyAgICAgICAgICAgIGNvZGUuYXBwZW5kKCJpbnQiKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtZXRlclR5cGUgPT0gbG9uZy5jbGFzcykgeworICAgICAgICAgICAgY29kZS5hcHBlbmQoImxvbmciKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtZXRlclR5cGUgPT0gc2hvcnQuY2xhc3MpIHsKKyAgICAgICAgICAgIGNvZGUuYXBwZW5kKCJzaG9ydCIpOworICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1ldGVyVHlwZSA9PSBjaGFyLmNsYXNzKSB7CisgICAgICAgICAgICBjb2RlLmFwcGVuZCgiY2hhciIpOworICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1ldGVyVHlwZSA9PSBieXRlLmNsYXNzKSB7CisgICAgICAgICAgICBjb2RlLmFwcGVuZCgiYnl0ZSIpOworICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1ldGVyVHlwZSA9PSBib29sZWFuLmNsYXNzKSB7CisgICAgICAgICAgICBjb2RlLmFwcGVuZCgiYm9vbGVhbiIpOworICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1ldGVyVHlwZSA9PSBmbG9hdC5jbGFzcykgeworICAgICAgICAgICAgY29kZS5hcHBlbmQoImZsb2F0Iik7CisgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbWV0ZXJUeXBlID09IGRvdWJsZS5jbGFzcykgeworICAgICAgICAgICAgY29kZS5hcHBlbmQoImRvdWJsZSIpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb2RlLmFwcGVuZCgiKioqKiBFUlJPUiAqKioqKiBmb3VuZCBwcmltYXRpdmUgcGFyYW1ldGVyIHR5cGU6ICIgKyBwYXJhbWV0ZXJUeXBlLmdldE5hbWUoKSk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdldEZ1bGxOYW1lKHBhcmFtZXRlclR5cGUsIGNvZGUpOworICAgICAgICB9CisgICAgICAgIGNvZGUuYXBwZW5kKCIuY2xhc3MsICIpOworICAgICAgfQorICAgICAgCisgICAgICBjb2RlLnNldExlbmd0aChjb2RlLmxlbmd0aCgpIC0gMik7ICAvLyBUcmltIHRoZSB0cmFpbGluZyAiLCAiCisgICAgICBjb2RlLmFwcGVuZCgifSxcbiAiKTsKKyAgICB9CisgICAgCisgICAgY29kZS5zZXRMZW5ndGgoY29kZS5sZW5ndGgoKSAtIDMpOyAgLy8gVHJpbSB0aGUgdHJhaWxpbmcgIixcbiAiCisgICAgY29kZS5hcHBlbmQoIlxufTtcbiIpOworICAgIHJldHVybiBjb2RlLnRvU3RyaW5nKCk7CisgIH0KKworICAvKiAobm9uLUphdmFkb2MpCisgICAqIEBzZWUgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lbWV0YWNsYXNzYWN0aW9uc3N1cHBvcnQuTWV0aG9kR2VuZXJhdG9yI2dldE5hbWUoKQorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgIHJldHVybiBmaXJzdE1ldGhvZC5nZXROYW1lKCk7CisgIH0KKworICAvKiAobm9uLUphdmFkb2MpCisgICAqIEBzZWUgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lbWV0YWNsYXNzYWN0aW9uc3N1cHBvcnQuTWV0aG9kR2VuZXJhdG9yI2dldE51bWJlck9mUGFyYW1ldGVycygpCisgICAqLworICBwdWJsaWMgaW50IGdldE51bWJlck9mUGFyYW1ldGVycygpIHsKKyAgICByZXR1cm4gZmlyc3RNZXRob2QuZ2V0TnVtYmVyT2ZQYXJhbWV0ZXJzKCk7CisgIH0KKworICAvKiAobm9uLUphdmFkb2MpCisgICAqIEBzZWUgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lbWV0YWNsYXNzYWN0aW9uc3N1cHBvcnQuTWV0aG9kR2VuZXJhdG9yI2dldFBhcmFtZXRlclR5cGVzKCkKKyAgICovCisgIHB1YmxpYyBDbGFzc1tdIGdldFBhcmFtZXRlclR5cGVzKCkgeworICAgIHJldHVybiBmaXJzdE1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOworICB9CisKKyAgLyogKG5vbi1KYXZhZG9jKQorICAgKiBAc2VlIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZW1ldGFjbGFzc2FjdGlvbnNzdXBwb3J0Lk1ldGhvZEdlbmVyYXRvciNpc092ZXJsb2FkZWQob3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lbWV0YWNsYXNzYWN0aW9uc3N1cHBvcnQuTWV0aG9kR2VuZXJhdG9yKQorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNPdmVybG9hZGVkKGZpbmFsIE1ldGhvZEdlbmVyYXRvciBvdGhlcikgeworICAgICByZXR1cm4gZmlyc3RNZXRob2QuaXNPdmVybG9hZGVkKG90aGVyKTsKKyAgfQorCisgIC8qIChub24tSmF2YWRvYykKKyAgICogQHNlZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWVtZXRhY2xhc3NhY3Rpb25zc3VwcG9ydC5NZXRob2RHZW5lcmF0b3IjcHJvY2Vzc092ZXJsb2FkZWQoamF2YS5sYW5nLkNsYXNzLCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWVtZXRhY2xhc3NhY3Rpb25zc3VwcG9ydC5NZXRob2RHZW5lcmF0b3IpCisgICAqLworICBwdWJsaWMgTWV0aG9kR2VuZXJhdG9yIHByb2Nlc3NPdmVybG9hZGVkKGZpbmFsIENsYXNzIGNsYXosIGZpbmFsIE1ldGhvZEdlbmVyYXRvciBvdGhlcikgeworICAgIGlmIChvdGhlciBpbnN0YW5jZW9mIE92ZXJsb2FkZWRNZXRob2RzR2VuZXJhdG9yKSB7CisgICAgZmluYWwgSXRlcmF0b3IgaXRlciA9ICgoT3ZlcmxvYWRlZE1ldGhvZHNHZW5lcmF0b3Ipb3RoZXIpLmdlbmVyYXRvckxpc3QuaXRlcmF0b3IoKTsKKyAgICAKKyAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICBwcm9jZXNzT3ZlcmxvYWRlZChjbGF6LCAoTWV0aG9kR2VuZXJhdG9yKWl0ZXIubmV4dCgpKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgIGZpbmFsIENsYXNzW10gcDEgPSBvdGhlci5nZXRQYXJhbWV0ZXJUeXBlcygpOworICAKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpICE9IHRoaXMuZ2VuZXJhdG9yTGlzdC5zaXplKCk7IGkrKykgeworICAgICAgZmluYWwgTWV0aG9kR2VuZXJhdG9yIGdlbmVyYXRvciA9IChNZXRob2RHZW5lcmF0b3IpdGhpcy5nZW5lcmF0b3JMaXN0LmdldChpKTsKKyAgICAgIGZpbmFsIENsYXNzW10gcDIgPSBnZW5lcmF0b3IuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKKyAgICAgIGludCBqID0gMDsKKyAgICAgIAorICAgICAgICB3aGlsZSAocDFbal0gPT0gcDJbal0gJiYgKytqICE9IHAxLmxlbmd0aCk7CisgICAgICAgIAorICAgICAgICBpZiAoaiA9PSBwMS5sZW5ndGgpIHsKKyAgICAgICAgICAvLyBvdGhlciBpcyBhIGR1cGxpY2F0ZSBvZiB0aGlzIG1ldGhvZAorICAgICAgICAgIGlmIChvdGhlci5tZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKSA9PSBjbGF6KSB7CisgICAgICAgICAgICB0aGlzLmdlbmVyYXRvckxpc3QuYWRkKGksIG90aGVyKTsKKyAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIAorICAgICAgdGhpcy5nZW5lcmF0b3JMaXN0LmFkZChvdGhlcik7CisgICAgfQorICAgIAorICAgIHJldHVybiB0aGlzOworICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvZXhwZXJpbWVudGFsL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZW1ldGFjbGFzc2FjdGlvbnNzdXBwb3J0L1JlZmxlY3Rpb25NZXRob2RHZW5lcmF0b3IuamF2YSBiL2dyb292eS9leHBlcmltZW50YWwvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lbWV0YWNsYXNzYWN0aW9uc3N1cHBvcnQvUmVmbGVjdGlvbk1ldGhvZEdlbmVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3NTFjMWEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvZXhwZXJpbWVudGFsL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZW1ldGFjbGFzc2FjdGlvbnNzdXBwb3J0L1JlZmxlY3Rpb25NZXRob2RHZW5lcmF0b3IuamF2YQpAQCAtMCwwICsxLDEwNiBAQAorcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWVtZXRhY2xhc3NhY3Rpb25zc3VwcG9ydDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisKKy8qCisgKiBDb3B5cmlnaHQgMjAwNSBKb2huIEcuIFdpbHNvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCisvKioKKyAqIEBhdXRob3IgSm9obiBXaWxzb24KKyAqCisgKi8KKworcHVibGljIGNsYXNzIFJlZmxlY3Rpb25NZXRob2RHZW5lcmF0b3IgZXh0ZW5kcyBNZXRob2RHZW5lcmF0b3IgeworICBwcml2YXRlIGludCBtZXRob2RJbmRleDsKKyAgCisgIC8qKgorICAgKiBAcGFyYW0gbWV0aG9kCisgICAqLworICBwdWJsaWMgUmVmbGVjdGlvbk1ldGhvZEdlbmVyYXRvcihNZXRob2QgbWV0aG9kKSB7CisgICAgc3VwZXIobWV0aG9kKTsKKyAgfQorCisgIC8qIChub24tSmF2YWRvYykKKyAgICogQHNlZSBNZXRob2RHZW5lcmF0b3IjZ2VuZXJhdGVDYWxsKCkKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVDYWxsKGZpbmFsIENsYXNzIGNsYXopIHsKKyAgZmluYWwgU3RyaW5nQnVmZmVyIGNvZGUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgCisgICAgY29kZS5hcHBlbmQoInJldHVybiAiKS5hcHBlbmQodGhpcy5tZXRob2QuZ2V0TmFtZSgpICsgdGhpcy5tZXRob2RJbmRleCkuYXBwZW5kKCJNZXRob2QuaW52b2tlKHRhcmdldCwgYXJncyk7XG4iKTsKKworICAgIHJldHVybiBjb2RlLnRvU3RyaW5nKCk7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdlbmVyYXRlRGVjbGFyYXRpb24oZmluYWwgaW50IG1ldGhvZEluZGV4KSB7CisgIGZpbmFsIFN0cmluZ0J1ZmZlciBjb2RlID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgIAorICAgIHRoaXMubWV0aG9kSW5kZXggPSBtZXRob2RJbmRleDsKKyAgICAKKyAgICBjb2RlLmFwcGVuZCgicHJpdmF0ZSBNZXRob2QgIikuYXBwZW5kKHRoaXMubWV0aG9kLmdldE5hbWUoKSArIHRoaXMubWV0aG9kSW5kZXgpLmFwcGVuZCgiTWV0aG9kO1xuIik7CisgICAgY29kZS5hcHBlbmQoIntcbnRyeSB7XG4iKS5hcHBlbmQodGhpcy5tZXRob2QuZ2V0TmFtZSgpICsgdGhpcy5tZXRob2RJbmRleCkuYXBwZW5kKCJNZXRob2QgPSAiKTsKKyAgICBjb2RlLmFwcGVuZCh0aGlzLm1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpLmdldE5hbWUoKSkuYXBwZW5kKCIuY2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoXCIiKS5hcHBlbmQodGhpcy5tZXRob2QuZ2V0TmFtZSgpKS5hcHBlbmQoIlwiLCBuZXcgQ2xhc3NbXSB7Iik7CisgICAgCisgICAgZmluYWwgQ2xhc3NbXSBwYXJhbWV0ZXJUeXBlcyA9IHRoaXMubWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7CisgICAgaWYgKHBhcmFtZXRlclR5cGVzLmxlbmd0aCAhPSAwKXsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpICE9IHBhcmFtZXRlclR5cGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICBmaW5hbCBDbGFzcyBwYXJhbWV0ZXJUeXBlID0gcGFyYW1ldGVyVHlwZXNbaV07CisgICAgICAKKyAgICAgICAgaWYgKHBhcmFtZXRlclR5cGUuaXNQcmltaXRpdmUoKSkgeworICAgICAgICAgIGlmIChwYXJhbWV0ZXJUeXBlID09IHZvaWQuY2xhc3MpIHsKKyAgICAgICAgICAgIGNvZGUuYXBwZW5kKCJ2b2lkLmNsYXNzLCAiKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtZXRlclR5cGUgPT0gaW50LmNsYXNzKSB7CisgICAgICAgICAgICBjb2RlLmFwcGVuZCgidm9pZC5jbGFzcywgIik7CisgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbWV0ZXJUeXBlID09IGxvbmcuY2xhc3MpIHsKKyAgICAgICAgICAgIGNvZGUuYXBwZW5kKCJ2b2lkLmNsYXNzLCAiKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtZXRlclR5cGUgPT0gc2hvcnQuY2xhc3MpIHsKKyAgICAgICAgICAgIGNvZGUuYXBwZW5kKCJ2b2lkLmNsYXNzLCAiKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtZXRlclR5cGUgPT0gY2hhci5jbGFzcykgeworICAgICAgICAgICAgY29kZS5hcHBlbmQoInZvaWQuY2xhc3MsICIpOworICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1ldGVyVHlwZSA9PSBieXRlLmNsYXNzKSB7CisgICAgICAgICAgICBjb2RlLmFwcGVuZCgidm9pZC5jbGFzcywgIik7CisgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbWV0ZXJUeXBlID09IGJvb2xlYW4uY2xhc3MpIHsKKyAgICAgICAgICAgIGNvZGUuYXBwZW5kKCJ2b2lkLmNsYXNzLCAiKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtZXRlclR5cGUgPT0gZmxvYXQuY2xhc3MpIHsKKyAgICAgICAgICAgIGNvZGUuYXBwZW5kKCJ2b2lkLmNsYXNzLCAiKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtZXRlclR5cGUgPT0gZG91YmxlLmNsYXNzKSB7CisgICAgICAgICAgICBjb2RlLmFwcGVuZCgidm9pZC5jbGFzcywgIik7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvZGUuYXBwZW5kKCIqKioqIEVSUk9SICoqKioqIGZvdW5kIHByaW1hdGl2ZSByZXR1cm4gdHlwZTogIiArIHBhcmFtZXRlclR5cGUuZ2V0TmFtZSgpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ2V0RnVsbE5hbWUocGFyYW1ldGVyVHlwZSwgY29kZSk7CisgICAgICAgICAgY29kZS5hcHBlbmQoIi5jbGFzcywgIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIAorICAgICAgY29kZS5zZXRMZW5ndGgoY29kZS5sZW5ndGgoKSAtIDIpOyAgIC8vIHRyaW0gdGhlIGxhc3QgIiwgIiBvZmYKKyAgICB9CisgICAgCisgICAgY29kZS5hcHBlbmQoIn0pO1xuIik7CisgICAgY29kZS5hcHBlbmQoIkFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkge1xucHVibGljIE9iamVjdCBydW4oKSB7XG4iKTsKKyAgICBjb2RlLmFwcGVuZCh0aGlzLm1ldGhvZC5nZXROYW1lKCkgKyB0aGlzLm1ldGhvZEluZGV4KS5hcHBlbmQoIk1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpO1xucmV0dXJuIG51bGw7XG59XG59KTtcbiIpOworICAgIGNvZGUuYXBwZW5kKCJ9IGNhdGNoIChmaW5hbCBOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkge31cbn1cbiIpOworICAgIAorICAgIHJldHVybiBjb2RlLnRvU3RyaW5nKCk7CisgIH0KKyAgCisgIC8qIChub24tSmF2YWRvYykKKyAgICogQHNlZSBNZXRob2RHZW5lcmF0b3Ijc3RhcnRDYWxsKGphdmEubGFuZy5TdHJpbmdCdWZmZXIpCisgICAqLworICBwcm90ZWN0ZWQgdm9pZCBzdGFydENhbGwoU3RyaW5nQnVmZmVyIGNvZGUpIHsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvZXhwZXJpbWVudGFsL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZW1ldGFjbGFzc2FjdGlvbnNzdXBwb3J0L1N0YXRpY01ldGhvZEdlbmVyYXRvci5qYXZhIGIvZ3Jvb3Z5L2V4cGVyaW1lbnRhbC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWVtZXRhY2xhc3NhY3Rpb25zc3VwcG9ydC9TdGF0aWNNZXRob2RHZW5lcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2FlM2NlCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L2V4cGVyaW1lbnRhbC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWVtZXRhY2xhc3NhY3Rpb25zc3VwcG9ydC9TdGF0aWNNZXRob2RHZW5lcmF0b3IuamF2YQpAQCAtMCwwICsxLDM4IEBACitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZW1ldGFjbGFzc2FjdGlvbnNzdXBwb3J0OworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKKworLyoKKyAqIENvcHlyaWdodCAyMDA1IEpvaG4gRy4gV2lsc29uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKKy8qKgorICogQGF1dGhvciBKb2huIFdpbHNvbgorICoKKyAqLworCitwdWJsaWMgY2xhc3MgU3RhdGljTWV0aG9kR2VuZXJhdG9yIGV4dGVuZHMgTWV0aG9kR2VuZXJhdG9yIHsKKworICAvKioKKyAgICogQHBhcmFtIG1ldGhvZAorICAgKi8KKyAgcHVibGljIFN0YXRpY01ldGhvZEdlbmVyYXRvcihmaW5hbCBNZXRob2QgbWV0aG9kKSB7CisgICAgc3VwZXIobWV0aG9kKTsKKyAgfQorCisgIHByb3RlY3RlZCB2b2lkIHN0YXJ0Q2FsbChmaW5hbCBTdHJpbmdCdWZmZXIgY29kZSkgeworICAgIGNvZGUuYXBwZW5kKHRoaXMubWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCkuZ2V0TmFtZSgpKS5hcHBlbmQoJy4nKS5hcHBlbmQodGhpcy5tZXRob2QuZ2V0TmFtZSgpKS5hcHBlbmQoJygnKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3BvbS54bWwgYi9ncm9vdnkvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjZjOWE2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3BvbS54bWwKQEAgLTAsMCArMSw3NzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKworICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgICAKKyAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMuZ3Jvb3Z5PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmdyb292eTwvYXJ0aWZhY3RJZD4KKyAgICA8bmFtZT5Hcm9vdnk8L25hbWU+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgICAKKyAgICA8dmVyc2lvbj4xLjUuMDwvdmVyc2lvbj4KKyAgICAKKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIEdyb292eTogQSBwb3dlcmZ1bCwgZHluYW1pYyBsYW5ndWFnZSBmb3IgdGhlIEpWTQorICAgIDwvZGVzY3JpcHRpb24+CisgICAgCisgICAgPHVybD5odHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy88L3VybD4KKyAgICAKKyAgICA8b3JnYW5pemF0aW9uPgorICAgICAgICA8bmFtZT5UaGUgQ29kZWhhdXM8L25hbWU+CisgICAgICAgIDx1cmw+aHR0cDovL2NvZGVoYXVzLm9yZzwvdXJsPgorICAgIDwvb3JnYW5pemF0aW9uPgorICAgIAorICAgIDxpbmNlcHRpb25ZZWFyPjIwMDM8L2luY2VwdGlvblllYXI+CisgICAgCisgICAgPHNjbT4KKyAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmdyb292eS5jb2RlaGF1cy5vcmcvYnJvd3NlL2dyb292eS90cnVuay9ncm9vdnkvZ3Jvb3Z5LWNvcmU8L2Nvbm5lY3Rpb24+CisgICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly8ke21hdmVuLnVzZXJuYW1lfUBzdm4uZ3Jvb3Z5LmNvZGVoYXVzLm9yZy9icm93c2UvZ3Jvb3Z5L3RydW5rL2dyb292eS9ncm9vdnktY29yZTwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KKyAgICAgICAgPHVybD5odHRwOi8vc3ZuLmdyb292eS5jb2RlaGF1cy5vcmcvYnJvd3NlL2dyb292eS90cnVuay9ncm9vdnkvZ3Jvb3Z5LWNvcmU8L3VybD4KKyAgICA8L3NjbT4KKworICAgIDxtYWlsaW5nTGlzdHM+CisgICAgICAgIDxtYWlsaW5nTGlzdD4KKyAgICAgICAgICAgIDxuYW1lPkdyb292eSBKU1IgRGlzY3Vzc2lvbiBMaXN0PC9uYW1lPgorICAgICAgICAgICAgPGFyY2hpdmU+aHR0cDovL2Rpci5nbWFuZS5vcmcvZ21hbmUuY29tcC5sYW5nLmdyb292eS5qc3I8L2FyY2hpdmU+CisgICAgICAgIDwvbWFpbGluZ0xpc3Q+CisgICAgICAgIDxtYWlsaW5nTGlzdD4KKyAgICAgICAgICAgIDxuYW1lPkdyb292eSBEZXZlbG9wZXIgTGlzdDwvbmFtZT4KKyAgICAgICAgICAgIDxhcmNoaXZlPmh0dHA6Ly9kaXIuZ21hbmUub3JnL2dtYW5lLmNvbXAubGFuZy5ncm9vdnkuZGV2ZWw8L2FyY2hpdmU+CisgICAgICAgIDwvbWFpbGluZ0xpc3Q+CisgICAgICAgIDxtYWlsaW5nTGlzdD4KKyAgICAgICAgICAgIDxuYW1lPkdyb292eSBVc2VyIExpc3Q8L25hbWU+CisgICAgICAgICAgICA8YXJjaGl2ZT5odHRwOi8vZGlyLmdtYW5lLm9yZy9nbWFuZS5jb21wLmxhbmcuZ3Jvb3Z5LnVzZXI8L2FyY2hpdmU+CisgICAgICAgIDwvbWFpbGluZ0xpc3Q+CisgICAgPC9tYWlsaW5nTGlzdHM+CisKKyAgICA8ZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KKyAgICAgICAgPHJlcG9zaXRvcnk+CisgICAgICAgICAgICA8aWQ+Y29kZWhhdXMub3JnPC9pZD4KKyAgICAgICAgICAgIDxuYW1lPkdyb292eSBDZW50cmFsIFJlcG9zaXRvcnk8L25hbWU+CisgICAgICAgICAgICA8dXJsPmRhdjpodHRwczovL2Rhdi5jb2RlaGF1cy5vcmcvcmVwb3NpdG9yeS9ncm9vdnkvPC91cmw+CisgICAgICAgIDwvcmVwb3NpdG9yeT4KKyAgICAgICAgPHNuYXBzaG90UmVwb3NpdG9yeT4KKyAgICAgICAgICAgIDxpZD5jb2RlaGF1cy5vcmc8L2lkPgorICAgICAgICAgICAgPG5hbWU+R3Jvb3Z5IENlbnRyYWwgRGV2ZWxvcG1lbnQgUmVwb3NpdG9yeTwvbmFtZT4KKyAgICAgICAgICAgIDx1cmw+ZGF2Omh0dHBzOi8vZGF2LmNvZGVoYXVzLm9yZy9zbmFwc2hvdHMucmVwb3NpdG9yeS9ncm9vdnkvPC91cmw+CisgICAgICAgIDwvc25hcHNob3RSZXBvc2l0b3J5PgorICAgICAgICA8IS0tIG5vdCBjdXJyZW50bHkgdXNlZCAtLT4KKyAgICAgICAgPHNpdGU+CisgICAgICAgICAgICA8aWQ+Y29kZWhhdXMub3JnPC9pZD4KKyAgICAgICAgICAgIDxuYW1lPkdyb292eSBXZWIgU2l0ZTwvbmFtZT4KKyAgICAgICAgICAgIDx1cmw+ZGF2Omh0dHBzOi8vZGF2LmNvZGVoYXVzLm9yZy9ncm9vdnk8L3VybD4KKyAgICAgICAgPC9zaXRlPgorICAgIDwvZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KKworICAgIDxkZXZlbG9wZXJzPgorICAgICAgICA8ZGV2ZWxvcGVyPgorICAgICAgICAgICAgPG5hbWU+R3VpbGxhdW1lIExhZm9yZ2U8L25hbWU+CisgICAgICAgICAgICA8aWQ+Z2xhZm9yZ2U8L2lkPgorICAgICAgICAgICAgPGVtYWlsPjwvZW1haWw+CisgICAgICAgICAgICA8b3JnYW5pemF0aW9uPk9jdG8gVGVjaG5vbG9neTwvb3JnYW5pemF0aW9uPgorICAgICAgICAgICAgPHJvbGVzPgorICAgICAgICAgICAgICAgIDxyb2xlPlByb2plY3QgTWFuYWdlcjwvcm9sZT4KKyAgICAgICAgICAgICAgICA8cm9sZT5EZXZlbG9wZXI8L3JvbGU+CisgICAgICAgICAgICA8L3JvbGVzPgorICAgICAgICA8L2RldmVsb3Blcj4KKyAgICAgICAgPGRldmVsb3Blcj4KKyAgICAgICAgICAgIDxuYW1lPmJvYiBtY3doaXJ0ZXI8L25hbWU+CisgICAgICAgICAgICA8aWQ+Ym9iPC9pZD4KKyAgICAgICAgICAgIDxlbWFpbD5ib2JAd2Vya2VuLmNvbTwvZW1haWw+CisgICAgICAgICAgICA8b3JnYW5pemF0aW9uPlRoZSBXZXJrZW4gQ29tcGFueTwvb3JnYW5pemF0aW9uPgorICAgICAgICAgICAgPHJvbGVzPgorICAgICAgICAgICAgICAgIDxyb2xlPkZvdW5kZXI8L3JvbGU+CisgICAgICAgICAgICA8L3JvbGVzPgorICAgICAgICA8L2RldmVsb3Blcj4KKyAgICAgICAgPGRldmVsb3Blcj4KKyAgICAgICAgICAgIDxuYW1lPkphbWVzIFN0cmFjaGFuPC9uYW1lPgorICAgICAgICAgICAgPGlkPmpzdHJhY2hhbjwvaWQ+CisgICAgICAgICAgICA8ZW1haWw+amFtZXNAY29yZWRldmVsb3BlcnMuY29tPC9lbWFpbD4KKyAgICAgICAgICAgIDxvcmdhbml6YXRpb24+Q29yZSBEZXZlbG9wZXJzIE5ldHdvcms8L29yZ2FuaXphdGlvbj4KKyAgICAgICAgICAgIDxyb2xlcz4KKyAgICAgICAgICAgICAgICA8cm9sZT5Gb3VuZGVyPC9yb2xlPgorICAgICAgICAgICAgPC9yb2xlcz4KKyAgICAgICAgPC9kZXZlbG9wZXI+CisgICAgICAgIDxkZXZlbG9wZXI+CisgICAgICAgICAgICA8bmFtZT5Kb2UgV2FsbmVzPC9uYW1lPgorICAgICAgICAgICAgPGlkPmpvZTwvaWQ+CisgICAgICAgICAgICA8ZW1haWw+PC9lbWFpbD4KKyAgICAgICAgICAgIDxvcmdhbml6YXRpb24+VGhvdWdodFdvcmtzPC9vcmdhbml6YXRpb24+CisgICAgICAgICAgICA8cm9sZXM+CisgICAgICAgICAgICAgICAgPHJvbGU+RGV2ZWxvcGVyIEVtZXJpdHVzPC9yb2xlPgorICAgICAgICAgICAgPC9yb2xlcz4KKyAgICAgICAgPC9kZXZlbG9wZXI+CisgICAgICAgIDxkZXZlbG9wZXI+CisgICAgICAgICAgICA8bmFtZT5DaHJpcyBTdGV2ZW5zb248L25hbWU+CisgICAgICAgICAgICA8aWQ+c2tpeno8L2lkPgorICAgICAgICAgICAgPGVtYWlsPjwvZW1haWw+CisgICAgICAgICAgICA8b3JnYW5pemF0aW9uPlRob3VnaHRXb3Jrczwvb3JnYW5pemF0aW9uPgorICAgICAgICAgICAgPHJvbGVzPgorICAgICAgICAgICAgICAgIDxyb2xlPkRldmVsb3BlciBFbWVyaXR1czwvcm9sZT4KKyAgICAgICAgICAgIDwvcm9sZXM+CisgICAgICAgIDwvZGV2ZWxvcGVyPgorICAgICAgICA8ZGV2ZWxvcGVyPgorICAgICAgICAgICAgPG5hbWU+SmFtaWUgTWNDcmluZGxlPC9uYW1lPgorICAgICAgICAgICAgPGlkPmphbWllbWM8L2lkPgorICAgICAgICAgICAgPGVtYWlsPjwvZW1haWw+CisgICAgICAgICAgICA8b3JnYW5pemF0aW9uPlRocmVlPC9vcmdhbml6YXRpb24+CisgICAgICAgICAgICA8cm9sZXM+CisgICAgICAgICAgICAgICAgPHJvbGU+RGV2ZWxvcGVyIEVtZXJpdHVzPC9yb2xlPgorICAgICAgICAgICAgPC9yb2xlcz4KKyAgICAgICAgPC9kZXZlbG9wZXI+CisgICAgICAgIDxkZXZlbG9wZXI+CisgICAgICAgICAgICA8bmFtZT5NYXR0IEZvZW1tZWw8L25hbWU+CisgICAgICAgICAgICA8aWQ+bWF0dGY8L2lkPgorICAgICAgICAgICAgPGVtYWlsPjwvZW1haWw+CisgICAgICAgICAgICA8b3JnYW5pemF0aW9uPlRob3VnaHRXb3Jrczwvb3JnYW5pemF0aW9uPgorICAgICAgICAgICAgPHJvbGVzPgorICAgICAgICAgICAgICAgIDxyb2xlPkRldmVsb3BlciBFbWVyaXR1czwvcm9sZT4KKyAgICAgICAgICAgIDwvcm9sZXM+CisgICAgICAgIDwvZGV2ZWxvcGVyPgorICAgICAgICA8ZGV2ZWxvcGVyPgorICAgICAgICAgICAgPG5hbWU+U2FtIFB1bGxhcmE8L25hbWU+CisgICAgICAgICAgICA8aWQ+c3B1bGxhcmE8L2lkPgorICAgICAgICAgICAgPGVtYWlsPnNhbUBzYW1wdWxsYXJhLmNvbTwvZW1haWw+CisgICAgICAgICAgICA8b3JnYW5pemF0aW9uPjwvb3JnYW5pemF0aW9uPgorICAgICAgICAgICAgPHJvbGVzPgorICAgICAgICAgICAgICAgIDxyb2xlPkRldmVsb3BlciBFbWVyaXR1czwvcm9sZT4KKyAgICAgICAgICAgIDwvcm9sZXM+CisgICAgICAgIDwvZGV2ZWxvcGVyPgorICAgICAgICA8ZGV2ZWxvcGVyPgorICAgICAgICAgICAgPG5hbWU+S2FzcGVyIE5pZWxzZW48L25hbWU+CisgICAgICAgICAgICA8aWQ+a2FzcGVyPC9pZD4KKyAgICAgICAgICAgIDxlbWFpbD48L2VtYWlsPgorICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj48L29yZ2FuaXphdGlvbj4KKyAgICAgICAgICAgIDxyb2xlcz4KKyAgICAgICAgICAgICAgICA8cm9sZT5EZXZlbG9wZXIgRW1lcml0dXM8L3JvbGU+CisgICAgICAgICAgICA8L3JvbGVzPgorICAgICAgICA8L2RldmVsb3Blcj4KKyAgICAgICAgPGRldmVsb3Blcj4KKyAgICAgICAgICAgIDxuYW1lPlRyYXZpcyBLYXk8L25hbWU+CisgICAgICAgICAgICA8aWQ+dHJhdmlzPC9pZD4KKyAgICAgICAgICAgIDxlbWFpbD48L2VtYWlsPgorICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj48L29yZ2FuaXphdGlvbj4KKyAgICAgICAgICAgIDxyb2xlcz4KKyAgICAgICAgICAgICAgICA8cm9sZT5EZXZlbG9wZXIgRW1lcml0dXM8L3JvbGU+CisgICAgICAgICAgICA8L3JvbGVzPgorICAgICAgICA8L2RldmVsb3Blcj4KKyAgICAgICAgPGRldmVsb3Blcj4KKyAgICAgICAgICAgIDxuYW1lPlpvaGFyIE1lbGFtZWQ8L25hbWU+CisgICAgICAgICAgICA8aWQ+em9oYXI8L2lkPgorICAgICAgICAgICAgPGVtYWlsPjwvZW1haWw+CisgICAgICAgICAgICA8b3JnYW5pemF0aW9uPjwvb3JnYW5pemF0aW9uPgorICAgICAgICAgICAgPHJvbGVzPgorICAgICAgICAgICAgICAgIDxyb2xlPkRldmVsb3BlciBFbWVyaXR1czwvcm9sZT4KKyAgICAgICAgICAgIDwvcm9sZXM+CisgICAgICAgIDwvZGV2ZWxvcGVyPgorICAgICAgICA8ZGV2ZWxvcGVyPgorICAgICAgICAgICAgPG5hbWU+Sm9obiBXaWxzb248L25hbWU+CisgICAgICAgICAgICA8aWQ+andpbHNvbjwvaWQ+CisgICAgICAgICAgICA8ZW1haWw+dHVnQHdpbHNvbi5jby51azwvZW1haWw+CisgICAgICAgICAgICA8b3JnYW5pemF0aW9uPlRoZSBXaWxzb24gUGFydG5lcnNoaXA8L29yZ2FuaXphdGlvbj4KKyAgICAgICAgICAgIDxyb2xlcz4KKyAgICAgICAgICAgICAgICA8cm9sZT5EZXZlbG9wZXIgRW1lcml0dXM8L3JvbGU+CisgICAgICAgICAgICA8L3JvbGVzPgorICAgICAgICA8L2RldmVsb3Blcj4KKyAgICAgICAgPGRldmVsb3Blcj4KKyAgICAgICAgICAgIDxuYW1lPkNocmlzIFBvaXJpZXI8L25hbWU+CisgICAgICAgICAgICA8aWQ+Y3BvaXJpZXI8L2lkPgorICAgICAgICAgICAgPGVtYWlsPmNwb2lyaWVyQGRyZWFtaW5nLm9yZzwvZW1haWw+CisgICAgICAgICAgICA8b3JnYW5pemF0aW9uPjwvb3JnYW5pemF0aW9uPgorICAgICAgICAgICAgPHJvbGVzPgorICAgICAgICAgICAgICAgIDxyb2xlPkRldmVsb3BlciBFbWVyaXR1czwvcm9sZT4KKyAgICAgICAgICAgIDwvcm9sZXM+CisgICAgICAgIDwvZGV2ZWxvcGVyPgorICAgICAgICA8ZGV2ZWxvcGVyPgorICAgICAgICAgICAgPG5hbWU+Q2hyaXN0aWFhbiB0ZW4gS2xvb3N0ZXI8L25hbWU+CisgICAgICAgICAgICA8aWQ+Y2tsPC9pZD4KKyAgICAgICAgICAgIDxlbWFpbD5ja2xAZGFjZWxvLm5sPC9lbWFpbD4KKyAgICAgICAgICAgIDxvcmdhbml6YXRpb24+RGFjZWxvIFdlYkRldmVsb3BtZW50PC9vcmdhbml6YXRpb24+CisgICAgICAgICAgICA8cm9sZXM+CisgICAgICAgICAgICAgICAgPHJvbGU+RGV2ZWxvcGVyIEVtZXJpdHVzPC9yb2xlPgorICAgICAgICAgICAgPC9yb2xlcz4KKyAgICAgICAgPC9kZXZlbG9wZXI+CisgICAgICAgIDxkZXZlbG9wZXI+CisgICAgICAgICAgICA8bmFtZT5TdGV2ZSBHb2V0emU8L25hbWU+CisgICAgICAgICAgICA8aWQ+Z29ldHplPC9pZD4KKyAgICAgICAgICAgIDxlbWFpbD5nb2V0emVAZG92ZXRhaWwuY29tPC9lbWFpbD4KKyAgICAgICAgICAgIDxvcmdhbml6YXRpb24+RG92ZXRhaWxlZCBUZWNobm9sb2dpZXMsIExMQzwvb3JnYW5pemF0aW9uPgorICAgICAgICAgICAgPHJvbGVzPgorICAgICAgICAgICAgICAgIDxyb2xlPkRldmVsb3BlciBFbWVyaXR1czwvcm9sZT4KKyAgICAgICAgICAgIDwvcm9sZXM+CisgICAgICAgIDwvZGV2ZWxvcGVyPgorICAgICAgICA8ZGV2ZWxvcGVyPgorICAgICAgICAgICAgPG5hbWU+QmluZyBSYW48L25hbWU+CisgICAgICAgICAgICA8aWQ+YnJhbjwvaWQ+CisgICAgICAgICAgICA8ZW1haWw+YjU1ckBzaW5hLmNvbTwvZW1haWw+CisgICAgICAgICAgICA8b3JnYW5pemF0aW9uPkxlYWRpbmdjYXJlPC9vcmdhbml6YXRpb24+CisgICAgICAgICAgICA8cm9sZXM+CisgICAgICAgICAgICAgICAgPHJvbGU+RGV2ZWxvcGVyIEVtZXJpdHVzPC9yb2xlPgorICAgICAgICAgICAgPC9yb2xlcz4KKyAgICAgICAgPC9kZXZlbG9wZXI+CisgICAgICAgIDxkZXZlbG9wZXI+CisgICAgICAgICAgICA8bmFtZT5KZXJlbXkgUmF5bmVyPC9uYW1lPgorICAgICAgICAgICAgPGlkPmplejwvaWQ+CisgICAgICAgICAgICA8ZW1haWw+amVyZW15LnJheW5lckBnbWFpbC5jb208L2VtYWlsPgorICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5qYXZhbmljdXM8L29yZ2FuaXphdGlvbj4KKyAgICAgICAgICAgIDxyb2xlcz4KKyAgICAgICAgICAgICAgICA8cm9sZT5EZXZlbG9wZXI8L3JvbGU+CisgICAgICAgICAgICA8L3JvbGVzPgorICAgICAgICA8L2RldmVsb3Blcj4KKyAgICAgICAgPGRldmVsb3Blcj4KKyAgICAgICAgICAgIDxuYW1lPkpvaG4gU3R1bXA8L25hbWU+CisgICAgICAgICAgICA8aWQ+anN0dW1wPC9pZD4KKyAgICAgICAgICAgIDxlbWFpbD5qb2huc3R1bXAyQHlhaG9vLmNvbTwvZW1haWw+CisgICAgICAgICAgICA8b3JnYW5pemF0aW9uPjwvb3JnYW5pemF0aW9uPgorICAgICAgICAgICAgPHJvbGVzPgorICAgICAgICAgICAgICAgIDxyb2xlPkRldmVsb3BlciBFbWVyaXR1czwvcm9sZT4KKyAgICAgICAgICAgIDwvcm9sZXM+CisgICAgICAgIDwvZGV2ZWxvcGVyPgorICAgICAgICA8ZGV2ZWxvcGVyPgorICAgICAgICAgICAgPG5hbWU+Sm9jaGVuIFRoZW9kb3JvdTwvbmFtZT4KKyAgICAgICAgICAgIDxpZD5ibGFja2RyYWc8L2lkPgorICAgICAgICAgICAgPGVtYWlsPmJsYWNrZHJhZ0BnbXgub3JnPC9lbWFpbD4KKyAgICAgICAgICAgIDxvcmdhbml6YXRpb24+PC9vcmdhbml6YXRpb24+CisgICAgICAgICAgICA8cm9sZXM+CisgICAgICAgICAgICAgICAgPHJvbGU+RGV2ZWxvcGVyPC9yb2xlPgorICAgICAgICAgICAgPC9yb2xlcz4KKyAgICAgICAgPC9kZXZlbG9wZXI+CisgICAgICAgIDxkZXZlbG9wZXI+CisgICAgICAgICAgICA8bmFtZT5SdXNzZWwgV2luZGVyPC9uYW1lPgorICAgICAgICAgICAgPGlkPnJ1c3NlbDwvaWQ+CisgICAgICAgICAgICA8ZW1haWw+cnVzc2VsQHJ1c3NlbC5vcmcudWs8L2VtYWlsPgorICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5Db25jZXJ0YW50IExMUCAmYW1wOyBJdCd6IEludGVyYWN0aXZlIEx0ZDwvb3JnYW5pemF0aW9uPgorICAgICAgICAgICAgPHJvbGVzPgorICAgICAgICAgICAgICAgIDxyb2xlPkRldmVsb3Blcjwvcm9sZT4KKyAgICAgICAgICAgICAgICA8cm9sZT5Gb3VuZGVyIG9mIEdhbnQ8L3JvbGU+CisgICAgICAgICAgICA8L3JvbGVzPgorICAgICAgICA8L2RldmVsb3Blcj4KKyAgICAgICAgPGRldmVsb3Blcj4KKyAgICAgICAgICAgIDxuYW1lPlBpbGhvIEtpbTwvbmFtZT4KKyAgICAgICAgICAgIDxpZD5waGs8L2lkPgorICAgICAgICAgICAgPGVtYWlsPnBoa2ltQGNsdWVjb20uY28ua3I8L2VtYWlsPgorICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj48L29yZ2FuaXphdGlvbj4KKyAgICAgICAgICAgIDxyb2xlcz4KKyAgICAgICAgICAgICAgICA8cm9sZT5EZXZlbG9wZXIgRW1lcml0dXM8L3JvbGU+CisgICAgICAgICAgICA8L3JvbGVzPgorICAgICAgICA8L2RldmVsb3Blcj4KKyAgICAgICAgPGRldmVsb3Blcj4KKyAgICAgICAgICAgIDxuYW1lPkNocmlzdGlhbiBTdGVpbjwvbmFtZT4KKyAgICAgICAgICAgIDxpZD5jc3RlaW48L2lkPgorICAgICAgICAgICAgPGVtYWlsPnNvcm11cmFzQGdteC5kZTwvZW1haWw+CisgICAgICAgICAgICA8b3JnYW5pemF0aW9uPkNUU1IuZGU8L29yZ2FuaXphdGlvbj4KKyAgICAgICAgICAgIDxyb2xlcz4KKyAgICAgICAgICAgICAgICA8cm9sZT5EZXZlbG9wZXIgRW1lcml0dXM8L3JvbGU+CisgICAgICAgICAgICA8L3JvbGVzPgorICAgICAgICA8L2RldmVsb3Blcj4KKyAgICAgICAgPGRldmVsb3Blcj4KKyAgICAgICAgICAgIDxuYW1lPkRpZXJrIEtvZW5pZzwvbmFtZT4KKyAgICAgICAgICAgIDxpZD5taXR0aWU8L2lkPgorICAgICAgICAgICAgPGVtYWlsPmRpZXJrLmtvZW5pZ0BjYW5vby5jb208L2VtYWlsPgorICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5DYW5vbyBFbmdpbmVlcmluZyBBRzwvb3JnYW5pemF0aW9uPgorICAgICAgICAgICAgPHJvbGVzPgorICAgICAgICAgICAgICAgIDxyb2xlPkRldmVsb3Blcjwvcm9sZT4KKyAgICAgICAgICAgIDwvcm9sZXM+CisgICAgICAgIDwvZGV2ZWxvcGVyPgorICAgICAgICA8ZGV2ZWxvcGVyPgorICAgICAgICAgICAgPG5hbWU+UGF1bCBLaW5nPC9uYW1lPgorICAgICAgICAgICAgPGlkPnBhdWxrPC9pZD4KKyAgICAgICAgICAgIDxlbWFpbD5wYXVsa0Bhc2VydC5jb20uYXU8L2VtYWlsPgorICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5BU0VSVCwgQXVzdHJhbGlhPC9vcmdhbml6YXRpb24+CisgICAgICAgICAgICA8cm9sZXM+CisgICAgICAgICAgICAgICAgPHJvbGU+RGV2ZWxvcGVyPC9yb2xlPgorICAgICAgICAgICAgPC9yb2xlcz4KKyAgICAgICAgPC9kZXZlbG9wZXI+CisgICAgICAgIDxkZXZlbG9wZXI+CisgICAgICAgICAgICA8bmFtZT5HdWlsbGF1bWUgQWxsZW9uPC9uYW1lPgorICAgICAgICAgICAgPGlkPmdhbGxlb248L2lkPgorICAgICAgICAgICAgPGVtYWlsPmd1aWxsYXVtZS5hbGxlb25AZ21haWwuY29tPC9lbWFpbD4KKyAgICAgICAgICAgIDxvcmdhbml6YXRpb24+PC9vcmdhbml6YXRpb24+CisgICAgICAgICAgICA8cm9sZXM+CisgICAgICAgICAgICAgICAgPHJvbGU+RGV2ZWxvcGVyPC9yb2xlPgorICAgICAgICAgICAgPC9yb2xlcz4KKyAgICAgICAgPC9kZXZlbG9wZXI+CisgICAgICAgIDxkZXZlbG9wZXI+CisgICAgICAgICAgICA8bmFtZT5KYXNvbiBEaWxsb248L25hbWU+CisgICAgICAgICAgICA8aWQ+dXNlcjU3PC9pZD4KKyAgICAgICAgICAgIDxlbWFpbD5qYXNvbkBwbGFuZXQ1Ny5jb208L2VtYWlsPgorICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj48L29yZ2FuaXphdGlvbj4KKyAgICAgICAgICAgIDxyb2xlcz4KKyAgICAgICAgICAgICAgICA8cm9sZT5EZXZlbG9wZXI8L3JvbGU+CisgICAgICAgICAgICA8L3JvbGVzPgorICAgICAgICA8L2RldmVsb3Blcj4KKyAgICAgICAgPGRldmVsb3Blcj4KKyAgICAgICAgICAgIDxuYW1lPkRhbm5vIEZlcnJpbjwvbmFtZT4KKyAgICAgICAgICAgIDxpZD5zaGVtbm9uPC9pZD4KKyAgICAgICAgICAgIDxlbWFpbD48L2VtYWlsPgorICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj48L29yZ2FuaXphdGlvbj4KKyAgICAgICAgICAgIDxyb2xlcz4KKyAgICAgICAgICAgICAgICA8cm9sZT5EZXZlbG9wZXI8L3JvbGU+CisgICAgICAgICAgICA8L3JvbGVzPgorICAgICAgICA8L2RldmVsb3Blcj4KKyAgICAgICAgPGRldmVsb3Blcj4KKyAgICAgICAgICAgIDxuYW1lPkphbWVzIFdpbGxpYW1zPC9uYW1lPgorICAgICAgICAgICAgPGlkPmp3aWxsPC9pZD4KKyAgICAgICAgICAgIDxlbWFpbD48L2VtYWlsPgorICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj48L29yZ2FuaXphdGlvbj4KKyAgICAgICAgICAgIDxyb2xlcz4KKyAgICAgICAgICAgICAgICA8cm9sZT5EZXZlbG9wZXI8L3JvbGU+CisgICAgICAgICAgICA8L3JvbGVzPgorICAgICAgICA8L2RldmVsb3Blcj4KKyAgICAgICAgPGRldmVsb3Blcj4KKyAgICAgICAgICAgIDxuYW1lPkFuZHJlcyBBbG1pcmF5PC9uYW1lPgorICAgICAgICAgICAgPGlkPmFhbG1pcmF5PC9pZD4KKyAgICAgICAgICAgIDxlbWFpbD5hYWxtaXJheUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ8L2VtYWlsPgorICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj48L29yZ2FuaXphdGlvbj4KKyAgICAgICAgICAgIDxyb2xlcz4KKyAgICAgICAgICAgICAgICA8cm9sZT5EZXZlbG9wZXI8L3JvbGU+CisgICAgICAgICAgICA8L3JvbGVzPgorICAgICAgICA8L2RldmVsb3Blcj4KKyAgICAgICAgPGRldmVsb3Blcj4KKyAgICAgICAgICAgIDxuYW1lPk1hcmMgR3VpbGxlbW90PC9uYW1lPgorICAgICAgICAgICAgPGlkPm1ndWlsbGVtPC9pZD4KKyAgICAgICAgICAgIDxlbWFpbD5tZ3VpbGxlbW90QHlhaG9vLmZyPC9lbWFpbD4KKyAgICAgICAgICAgIDxvcmdhbml6YXRpb24+PC9vcmdhbml6YXRpb24+CisgICAgICAgICAgICA8cm9sZXM+CisgICAgICAgICAgICAgICAgPHJvbGU+RGV2ZWxvcGVyPC9yb2xlPgorICAgICAgICAgICAgPC9yb2xlcz4KKyAgICAgICAgPC9kZXZlbG9wZXI+CisgICAgPC9kZXZlbG9wZXJzPgorCisgICAgPGNvbnRyaWJ1dG9ycz4KKyAgICAgICAgPGNvbnRyaWJ1dG9yPgorICAgICAgICAgICAgPG5hbWU+Sm9lcm4gRXlyaWNoPC9uYW1lPgorICAgICAgICAgICAgPGVtYWlsPjwvZW1haWw+CisgICAgICAgIDwvY29udHJpYnV0b3I+CisgICAgICAgIDxjb250cmlidXRvcj4KKyAgICAgICAgICAgIDxuYW1lPlJvYmVydCBLdXplbGo8L25hbWU+CisgICAgICAgICAgICA8ZW1haWw+PC9lbWFpbD4KKyAgICAgICAgPC9jb250cmlidXRvcj4KKyAgICAgICAgPGNvbnRyaWJ1dG9yPgorICAgICAgICAgICAgPG5hbWU+Um9kIENvcGU8L25hbWU+CisgICAgICAgICAgICA8ZW1haWw+PC9lbWFpbD4KKyAgICAgICAgPC9jb250cmlidXRvcj4KKyAgICAgICAgPGNvbnRyaWJ1dG9yPgorICAgICAgICAgICAgPG5hbWU+WXVyaSBTY2hpbWtlPC9uYW1lPgorICAgICAgICAgICAgPGVtYWlsPjwvZW1haWw+CisgICAgICAgIDwvY29udHJpYnV0b3I+CisgICAgICAgIDxjb250cmlidXRvcj4KKyAgICAgICAgICAgIDxuYW1lPkphbWVzIEJpcmNoZmllbGQ8L25hbWU+CisgICAgICAgICAgICA8ZW1haWw+PC9lbWFpbD4KKyAgICAgICAgPC9jb250cmlidXRvcj4KKyAgICAgICAgPGNvbnRyaWJ1dG9yPgorICAgICAgICAgICAgPG5hbWU+Um9iZXJ0IEZ1bGxlcjwvbmFtZT4KKyAgICAgICAgICAgIDxlbWFpbD48L2VtYWlsPgorICAgICAgICA8L2NvbnRyaWJ1dG9yPgorICAgICAgICA8Y29udHJpYnV0b3I+CisgICAgICAgICAgICA8bmFtZT5TZXJnZXkgVWRvdmVua288L25hbWU+CisgICAgICAgICAgICA8ZW1haWw+PC9lbWFpbD4KKyAgICAgICAgPC9jb250cmlidXRvcj4KKyAgICAgICAgPGNvbnRyaWJ1dG9yPgorICAgICAgICAgICAgPG5hbWU+SGFsbHZhcmQgVHJhZXR0ZWJlcmc8L25hbWU+CisgICAgICAgICAgICA8ZW1haWw+PC9lbWFpbD4KKyAgICAgICAgPC9jb250cmlidXRvcj4KKyAgICAgICAgPGNvbnRyaWJ1dG9yPgorICAgICAgICAgICAgPG5hbWU+UGV0ZXIgUmVpbGx5PC9uYW1lPgorICAgICAgICAgICAgPGVtYWlsPjwvZW1haWw+CisgICAgICAgIDwvY29udHJpYnV0b3I+CisgICAgICAgIDxjb250cmlidXRvcj4KKyAgICAgICAgICAgIDxuYW1lPkJyaWFuIE1jQ2FsbGlzdGVyPC9uYW1lPgorICAgICAgICAgICAgPGVtYWlsPjwvZW1haWw+CisgICAgICAgIDwvY29udHJpYnV0b3I+CisgICAgICAgIDxjb250cmlidXRvcj4KKyAgICAgICAgICAgIDxuYW1lPlJpY2hhcmQgTW9uc29uLUhhZWZlbDwvbmFtZT4KKyAgICAgICAgICAgIDxlbWFpbD48L2VtYWlsPgorICAgICAgICA8L2NvbnRyaWJ1dG9yPgorICAgICAgICA8Y29udHJpYnV0b3I+CisgICAgICAgICAgICA8bmFtZT5CcmlhbiBMYXJzb248L25hbWU+CisgICAgICAgICAgICA8ZW1haWw+PC9lbWFpbD4KKyAgICAgICAgPC9jb250cmlidXRvcj4KKyAgICAgICAgPGNvbnRyaWJ1dG9yPgorICAgICAgICAgICAgPG5hbWU+QXJ0dXIgQmllc2lhZG93c2tpPC9uYW1lPgorICAgICAgICAgICAgPGVtYWlsPmFiaWVzQHBnLmdkYS5wbDwvZW1haWw+CisgICAgICAgIDwvY29udHJpYnV0b3I+CisgICAgICAgIDxjb250cmlidXRvcj4KKyAgICAgICAgICAgIDxuYW1lPkl2YW4gWi4gR2FuemE8L25hbWU+CisgICAgICAgICAgICA8ZW1haWw+PC9lbWFpbD4KKyAgICAgICAgPC9jb250cmlidXRvcj4KKyAgICAgICAgPGNvbnRyaWJ1dG9yPgorICAgICAgICAgICAgPG5hbWU+QXJqdW4gTmF5eWFyPC9uYW1lPgorICAgICAgICAgICAgPGVtYWlsPjwvZW1haWw+CisgICAgICAgIDwvY29udHJpYnV0b3I+CisgICAgICAgIDxjb250cmlidXRvcj4KKyAgICAgICAgICAgIDxuYW1lPk1hcmsgQ2h1LUNhcnJvbGw8L25hbWU+CisgICAgICAgICAgICA8ZW1haWw+PC9lbWFpbD4KKyAgICAgICAgPC9jb250cmlidXRvcj4KKyAgICAgICAgPGNvbnRyaWJ1dG9yPgorICAgICAgICAgICAgPG5hbWU+TWFyayBUdXJhbnNreTwvbmFtZT4KKyAgICAgICAgICAgIDxlbWFpbD48L2VtYWlsPgorICAgICAgICA8L2NvbnRyaWJ1dG9yPgorICAgICAgICA8Y29udHJpYnV0b3I+CisgICAgICAgICAgICA8bmFtZT5KZWFuLUxvdWlzIEJlcmxpZXQ8L25hbWU+CisgICAgICAgICAgICA8ZW1haWw+PC9lbWFpbD4KKyAgICAgICAgPC9jb250cmlidXRvcj4KKyAgICAgICAgPGNvbnRyaWJ1dG9yPgorICAgICAgICAgICAgPG5hbWU+R3JhaGFtIE1pbGxlcjwvbmFtZT4KKyAgICAgICAgICAgIDxlbWFpbD48L2VtYWlsPgorICAgICAgICA8L2NvbnRyaWJ1dG9yPgorICAgICAgICA8Y29udHJpYnV0b3I+CisgICAgICAgICAgICA8bmFtZT5NYXJjIFBhbG1lcjwvbmFtZT4KKyAgICAgICAgICAgIDxlbWFpbD48L2VtYWlsPgorICAgICAgICA8L2NvbnRyaWJ1dG9yPgorICAgICAgICA8Y29udHJpYnV0b3I+CisgICAgICAgICAgICA8bmFtZT5UdWdkdWFsIEdyYWxsPC9uYW1lPgorICAgICAgICAgICAgPGVtYWlsPjwvZW1haWw+CisgICAgICAgIDwvY29udHJpYnV0b3I+CisgICAgICAgIDxjb250cmlidXRvcj4KKyAgICAgICAgICAgIDxuYW1lPkVkd2luIFRlbGxtYW48L25hbWU+CisgICAgICAgICAgICA8ZW1haWw+PC9lbWFpbD4KKyAgICAgICAgPC9jb250cmlidXRvcj4KKyAgICAgICAgPGNvbnRyaWJ1dG9yPgorICAgICAgICAgICAgPG5hbWU+RXZhbiBBIFNsYXRpczwvbmFtZT4KKyAgICAgICAgICAgIDxlbWFpbD48L2VtYWlsPgorICAgICAgICA8L2NvbnRyaWJ1dG9yPgorICAgICAgICA8Y29udHJpYnV0b3I+CisgICAgICAgICAgICA8bmFtZT5IYW1sZXQgRCdBcmN5PC9uYW1lPgorICAgICAgICAgICAgPGVtYWlsPjwvZW1haWw+CisgICAgICAgIDwvY29udHJpYnV0b3I+CisgICAgPC9jb250cmlidXRvcnM+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorCisgICAgICAgIDwhLS0gY29yZSBkZXBlbmRlbmNpZXMgLS0+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+YW50bHI8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5hbnRscjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjIuNy42PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+YXNtPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXNtPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjMuOC4yPC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPCEtLSBkZXBlbmRlbmNpZXMgdXNlZCBieSBvcHRpb25hbCBmZWF0dXJlcyAtLT4KKworICAgICAgICA8IS0tIG9ubHkgdXNlZCBmb3IgY29tbWFuZCBsaW5lIHRvb2xzIChhbmQgQ2xpQnVpbGRlcikgLS0+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1jbGk8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWNsaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KKyAgICAgICAgICAgIDxvcHRpb25hbD50cnVlPC9vcHRpb25hbD4KKyAgICAgICAgICAgIDxleGNsdXNpb25zPgorICAgICAgICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtbGFuZzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1sYW5nPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtbG9nZ2luZzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1sb2dnaW5nPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICAgICAgPC9leGNsdXNpb25zPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPCEtLSBvbmx5IHVzZWQgZm9yIEFudCB0YXNrcyAmIHNjcmlwdGluZyB0b29scyAtLT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmFudDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjEuNy4wPC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5hbnQtanVuaXQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4xLjcuMDwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KKyAgICAgICAgICAgIDxvcHRpb25hbD50cnVlPC9vcHRpb25hbD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+YW50LWxhdW5jaGVyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+MS43LjA8L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8IS0tIG9ubHkgdXNlZCBmb3IgdGVzdGluZyBoZWxwZXIgY2xhc3NlcyAtLT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qbW9jazwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmptb2NrPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qbW9jazwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmptb2NrLWNnbGliPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgICAgICA8IS0tIGV4Y2x1ZGUgaW5jb21wYXRpYmxlIHZlcnNpb24gb2YgQVNNIC0tPgorICAgICAgICAgICAgPGV4Y2x1c2lvbnM+CisgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y2dsaWI8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmNnbGliLWZ1bGw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgICA8L2V4Y2x1c2lvbnM+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jZ2xpYjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmNnbGliLW5vZGVwPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+Mi4xXzM8L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmFzbTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmFzbS11dGlsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+YXNtPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXNtLWF0dHJzPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+YXNtPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXNtLWFuYWx5c2lzPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+YXNtPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXNtLXRyZWU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8IS0tIG9ubHkgdXNlZCBmb3IgQlNGIGFkYXB0ZXItLT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmJzZjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmJzZjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjIuNC4wPC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorICAgICAgICAgICAgPG9wdGlvbmFsPnRydWU8L29wdGlvbmFsPgorICAgICAgICAgICAgPGV4Y2x1c2lvbnM+CisgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1sb2dnaW5nPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxvZ2dpbmc8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgICA8L2V4Y2x1c2lvbnM+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWxvZ2dpbmc8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxvZ2dpbmc8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4xLjE8L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+CisgICAgICAgICAgICA8b3B0aW9uYWw+dHJ1ZTwvb3B0aW9uYWw+CisgICAgICAgICAgICA8ZXhjbHVzaW9ucz4KKyAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5sb2c0ajwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bG9nNGo8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+bG9na2l0PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5sb2draXQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+YXZhbG9uLWZyYW1ld29yazwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXZhbG9uLWZyYW1ld29yazwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDwhLS0gb25seSB1c2VkIGZvciBKTVggdXRpbGl0aWVzIC0tPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm14NGo8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teDRqPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+My4wLjI8L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisgICAgICAgICAgICA8b3B0aW9uYWw+dHJ1ZTwvb3B0aW9uYWw+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm1vY2tvYmplY3RzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+bW9ja29iamVjdHMtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjAuMDk8L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisgICAgICAgICAgICA8b3B0aW9uYWw+dHJ1ZTwvb3B0aW9uYWw+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPnhtbHVuaXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD54bWx1bml0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+MS4xPC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPCEtLSB1c2VkIGZvciBTUUwgbGlicmFyeSAtLT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5oc3FsZGI8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5oc3FsZGI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4xLjguMC43PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPCEtLSB1c2VkIGZvciBzZXJ2bGV0IC8gZ3NwIC0tPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjIuNDwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KKyAgICAgICAgICAgIDxvcHRpb25hbD50cnVlPC9vcHRpb25hbD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc3AtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+Mi4wPC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorICAgICAgICAgICAgPG9wdGlvbmFsPnRydWU8L29wdGlvbmFsPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPCEtLSB1c2VkIHRvIGR1bXAgb3V0IHRoZSBBU1QgLS0+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnRob3VnaHR3b3Jrcy54c3RyZWFtPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+eHN0cmVhbTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjEuMi4yPC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorICAgICAgICAgICAgPG9wdGlvbmFsPnRydWU8L29wdGlvbmFsPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIAorICAgICAgICA8IS0tIFVzZWQgZm9yIHJpY2hlciBpbnRlcmFjdGl2ZSBncm9vdnlzaCBzdXBwb3J0IC0tPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmpsaW5lPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amxpbmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4wLjkuOTM8L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKyAgICAKKyAgICA8IS0tCisgICAgTk9URTogVGhlIGZvbGxvd2luZyBidWlsZCBjb25maWd1cmF0aW9uIGlzIHByaW1hcmlseSBpbnRlbmRlZCB0byBzdXBwb3J0CisgICAgICAgICAgZ2VuZXJhdGUgb2YgSURFIGNvbmZpZ3VyYXRpb24gZmlsZXMuICBCYXNpYyBzdXBwb3J0IHRvIGJ1aWxkIGlzIGFsc28KKyAgICAgICAgICBpbmNsdWRlZCBieSBpbnZva2luZyAnYW50JyB0byBkbyB0aGUgcmVhbCB3b3JrLgorICAgIC0tPgorICAgIAorICAgIDxidWlsZD4KKyAgICAgICAgPHNvdXJjZURpcmVjdG9yeT5zcmMvbWFpbjwvc291cmNlRGlyZWN0b3J5PgorICAgICAgICA8dGVzdFNvdXJjZURpcmVjdG9yeT5zcmMvdGVzdDwvdGVzdFNvdXJjZURpcmVjdG9yeT4KKyAgICAgICAgCisgICAgICAgIDxkZWZhdWx0R29hbD5pbnN0YWxsPC9kZWZhdWx0R29hbD4KKyAgICAgICAgCisgICAgICAgIDxwbHVnaW5NYW5hZ2VtZW50PgorICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hbnRydW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjE8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1pZGVhLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4xPC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxqZGtOYW1lPjEuNDwvamRrTmFtZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxqZGtMZXZlbD4xLjQ8L2pka0xldmVsPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpbmtNb2R1bGVzPnRydWU8L2xpbmtNb2R1bGVzPgorICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgPCEtLQorICAgICAgICAgICAgICAgIE5PVEU6IFRlbGwgdGhlIGNvbXBpbGVyIGFuZCBzdXJlZmlyZSB0byBub3QgZG8gYW55dGhpbmcsIGFsbCBoYW5kbGVkIGJ5IEFudC4KKyAgICAgICAgICAgICAgICAtLT4KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4wLjI8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqPC9leGNsdWRlPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxza2lwPnRydWU8L3NraXA+CisgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4zPC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxza2lwPnRydWU8L3NraXA+CisgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgPC9wbHVnaW5NYW5hZ2VtZW50PgorICAgICAgICAKKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hbnRydW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPmluc3RhbGw8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFza3M+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjIGV4ZWN1dGFibGU9ImFudCIgZGlyPSIke3BvbS5iYXNlZGlyfSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJnIHZhbHVlPSJpbnN0YWxsUmVwbyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YXNrcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorICAgIAorICAgIDxwcm9maWxlcz4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+aWRlYTwvaWQ+CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8ZGVmYXVsdEdvYWw+dmFsaWRhdGU8L2RlZmF1bHRHb2FsPgorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4taWRlYS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3ZlcndyaXRlPnRydWU8L292ZXJ3cml0ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZG93bmxvYWRTb3VyY2VzPnRydWU8L2Rvd25sb2FkU291cmNlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZG93bmxvYWRKYXZhZG9jcz50cnVlPC9kb3dubG9hZEphdmFkb2NzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnZhbGlkYXRlPC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y2xlYW48L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5pZGVhPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgICAgIAorICAgICAgICA8IS0tCisgICAgICAgIFRPRE86IEFkZCBhbiBlY2xpcHNlIHByb2ZpbGUgdG8gaGVscCBmb2xrcyB0aGF0IHVzZSB0aGF0IElERSBzZXR1cCBjb25maWd1cmF0aW9uIGZpbGVzID8KKyAgICAgICAgLS0+CisgICAgPC9wcm9maWxlcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NlY3VyaXR5L0dyb292eUphclRlc3QuamFyIGIvZ3Jvb3Z5L3NlY3VyaXR5L0dyb292eUphclRlc3QuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViNTljN2QKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc2VjdXJpdHkvR3Jvb3Z5SmFyVGVzdC5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NlY3VyaXR5L2dyb292eS5wb2xpY3kgYi9ncm9vdnkvc2VjdXJpdHkvZ3Jvb3Z5LnBvbGljeQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzkwOTVhCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NlY3VyaXR5L2dyb292eS5wb2xpY3kKQEAgLTAsMCArMSwyNDkgQEAKKy8qIE5vdGVzIG9uIHRoZSBjb250ZW50cyBvZiB0aGlzIHBvbGljeSBmaWxlOgorICoKKyAqIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBpbiBncm9vdnkgaGF2ZSBwcml2aWxlZ2VkIG9wZXJhdGlvbnMgd3JhcHBpbmcKKyAqIHNldEFjY2Vzc2libGUuICBJZiB0aGVzZSB3cmFwcGVycyBhcmUgbm90IHByb3ZpZGVkLCBtb3N0IGNvZGViYXNlcyBiZWxvdworICogbXVzdCBoYXZlIHRoZSBmb2xsb3dpbmcgZ3JhbnQ6IAorICogcGVybWlzc2lvbiBqYXZhLmxhbmcucmVmbGVjdC5SZWZsZWN0UGVybWlzc2lvbiAic3VwcHJlc3NBY2Nlc3NDaGVja3MiOworICogIE1ldGFNZXRob2QuY3JlYXRlTWV0YU1ldGhvZAorICogIE1ldGFNZXRob2QuaW52b2tlKE9iamVjdCBPYmplY3RbXSkKKyAqICBSZWZsZWN0aW9uTWV0YU1ldGhvZC5pbnZva2UoT2JqZWN0IE9iamVjdFtdKQorICogIERlZmF1bHRHb292eU1ldGhvZHMuZHVtcChPYmplY3QpCisgKi8KKworLyoKKyAqIFRoaXMga2V5c3RvcmUgY29udGFpbnMgdGhlIHB1YmxpYyBrZXkgb2YgdGhlIHBhaXIgdXNlZCB0byBzaWduIEdyb292eVRlc3RKYXIuamFyCisgKiBTZWUgU2VjdXJpdHlUZXN0LnRlc3RSZWFkU2lnbmVkSmFyKCkKKyAqLwora2V5c3RvcmUgImZpbGU6JHt1c2VyLmRpcn0vc2VjdXJpdHkvZ3Jvb3Z5a2V5cyI7CisKKy8qCisgKiA9PT09PT09PT09PT09PT09PSBDb2RlYmFzZXMgcmVxdWlyaW5nIGphdmEuc2VjdXJpdHkuQWxsUGVybWlzc2lvbiA9PT09PT09PT09PT09PT0KKyAqIFRoZSBmb2xsb3dpbmcgY29kZWJhc2VzIHJlcXVpcmUgamF2YS5zZWN1cml0eS5BbGxQZXJtaXNzaW9uLiAgVGhleSBhcmUgY29uc2lkZXJlZCB0cnVzdGVkCisgKiBmb3IgcHVycG9zZXMgb2YgZ3Jvb3Z5IHNlY3VyaXR5IGVuZm9yY2VtZW50LiAgSW4gYSBkZXBsb3llZCBncm9vdnkgZW52aXJvbm1lbnQsIHRoZXNlIGNsYXNzZXMKKyAqIHdvdWxkIGFsbCBiZSBpbiBhIHNldCBvZiBqYXJzLiAgSWYgdGhlc2UgamFycyBhcmUgc2lnbmVkLCB0aGUgZ3JhbnRzIGNvdWxkIGJlIHN0cmVuZ3RoZW5lZCB0bworICogYnkgYWRkaW5nIGEgc2lnbmVkQnkgY2xhdXNlIHRvIHRoZSBncmFudC4KKyAqLworIAorLy9zcGc6ICBMb29rcyBsaWtlIGphbWVzIHN3aXRjaGVkIHRoZSBvdXRwdXQgZGVzdGluYXRpb24gdG8gYmluIGZyb20gdGFyZ2V0L2NsYXNzZXMKKy8vaW4gaGlzIDcvMTMvMDQgdXBkYXRlIHRvIHRoZSBlY2xpcHNlIC5jbGFzc3BhdGguICBUaGlzIHBlcm1pc3Npb24gYWxsb3dzIHRoZSAKKy8vU2VjdXJpdHkgdGVzdHMgdG8gcnVuIHByb3Blcmx5IGluIGVjbGlwc2UgKHRoZXkgd2VyZSB1bmFmZmVjdGVkIHdoZW4gcnVubmluZyBmcm9tIG1hdmVuKQorZ3JhbnQgY29kZUJhc2UgImZpbGU6JHt1c2VyLmRpcn0vYmluLy0iIHsKKwlwZXJtaXNzaW9uIGphdmEuc2VjdXJpdHkuQWxsUGVybWlzc2lvbjsKK307CisKK2dyYW50IGNvZGVCYXNlICJmaWxlOiR7dXNlci5kaXJ9L3RhcmdldC9jbGFzc2VzLy0iIHsKKwlwZXJtaXNzaW9uIGphdmEuc2VjdXJpdHkuQWxsUGVybWlzc2lvbjsKK307CisKK2dyYW50IGNvZGVCYXNlICJmaWxlOiR7dXNlci5kaXJ9L3RhcmdldC9pbnN0cnVtZW50ZWQtY2xhc3Nlcy8tIiB7CisJcGVybWlzc2lvbiBqYXZhLnNlY3VyaXR5LkFsbFBlcm1pc3Npb247Cit9OworCitncmFudCBjb2RlQmFzZSAiZmlsZToke3VzZXIuZGlyfS90YXJnZXQvdGVzdC1jbGFzc2VzLy0iIHsKKwlwZXJtaXNzaW9uIGphdmEuc2VjdXJpdHkuQWxsUGVybWlzc2lvbjsKK307CisKK2dyYW50IGNvZGVCYXNlICJmaWxlOiR7Z3Jvb3Z5LmxpYn0vLSIgeworCXBlcm1pc3Npb24gamF2YS5zZWN1cml0eS5BbGxQZXJtaXNzaW9uOworfTsKKworLyoKKyAqIFdoZW4gcnVubmluZyBmcm9tIG1hdmVuLCB0aGlzIGNvZGViYXNlIGlzIHJlcXVpcmVkLgorICogSWYgbm90IHJ1bm5pbmcgZnJvbSBtYXZlbiwgdGhlIGNvZGVzb3VyY2Ugd2lsbCBub3QgYmUgZm91bmQsIGJ1dCB3aWxsIG5vdCBjYXVzZSBhbiBlcnJvci4KKyAqLworZ3JhbnQgY29kZUJhc2UgImZpbGU6JHttYXZlbi5ob21lfS8tIiB7CisJcGVybWlzc2lvbiBqYXZhLnNlY3VyaXR5LkFsbFBlcm1pc3Npb247Cit9OworCisvKgorICogV2hlbiBydW5uaW5nIGZyb20gYW50LCB0aGlzIGNvZGViYXNlIGlzIHJlcXVpcmVkLgorICogSWYgbm90IHJ1bm5pbmcgZnJvbSBhbnQsIHRoZSBjb2Rlc291cmNlIHdpbGwgbm90IGJlIGZvdW5kLCBidXQgd2lsbCBub3QgY2F1c2UgYW4gZXJyb3IuCisgKiBUT0RPOiBuYXJyb3cgdGhpcyBkb3duIHRvIHNwZWNpZmljIGphcnMKKyAqLworZ3JhbnQgY29kZUJhc2UgImZpbGU6JHt1c2VyLmRpcn0vdGFyZ2V0L2xpYi8tIiB7CisJcGVybWlzc2lvbiBqYXZhLnNlY3VyaXR5LkFsbFBlcm1pc3Npb247Cit9OworCisvKgorICogV2hlbiBydW5uaW5nIHRoZSBqdW5pdCBwbHVnaW4gZnJvbSB3aXRoaW4gZWNsaXBzZSwgdGhpcyBjb2RlYmFzZSBpcyByZXF1aXJlZC4KKyAqIElmIG5vdCBydW5uaW5nIGZyb20gZWNsaXBzZSwgdGhlIGNvZGVzb3VyY2Ugd2lsbCBub3QgYmUgZm91bmQsIGJ1dCB3aWxsIG5vdCBjYXVzZSBhbiBlcnJvci4KKyAqLworZ3JhbnQgY29kZUJhc2UgImZpbGU6JHt1c2VyLmRpcn0vLi4vLi4vcGx1Z2lucy8tIiB7CisJcGVybWlzc2lvbiBqYXZhLnNlY3VyaXR5LkFsbFBlcm1pc3Npb247Cit9OworCisvKgorICogPT09PT09PT09PT09PT09PT0gRGVmYXVsdCBjb2RlYmFzZXMgY3JlYXRlZCBieSBncm9vdnkuID09PT09PT09PT09PT09PQorICogVGhlIGZvbGxvd2luZyBjb2RlYmFzZXMgYXJlIGFzc2lnbmVkIHdoZW4gZ3Jvb3Z5IHBhcnNlcyBhIGdyb292eSBzY3JpcHQKKyAqLworCisvKiAKKyAqIEdyb292eVNoZWxsLnBhcnNlKElucHV0U3RyZWFtLC4uLikgaXMgZ2l2ZW4gYSBjb2RlYmFzZSBvZiAiZ3Jvb3Z5LnNoZWxsIiBiZWNhdXNlIG5vIGFjdHVhbAorICogY29kZWJhc2UgY2FuIGJlIGRldGVybWluZWQuICBUaGUgb3RoZXIgZm9ybXMgb2YgcGFyc2UoRmlsZSkgYW5kIHBhcnNlKEdyb292eUNvZGVTb3VyY2UpIGFsbG93CisgKiBmb3IgbW9yZSBjb250cm9sLiAgVGhlc2UgcGVybWlzc2lvbiBzaG91bGQgYmUgc2V0IHRvIGNvbnRyb2wgc2NyaXB0cyB0aGF0IGFyZSBwYXNzZWQgaW50bworICogdGhlIHNoZWxsIGluIHRoZSBmb3JtIG9mIGEgc3RyaW5nIG9yIG90aGVyIGdyb292eSBjb2RlIG9mIHVua25vd24gcHJvdmVuYW5jZS4KKyAqLworZ3JhbnQgY29kZUJhc2UgImZpbGU6L2dyb292eS9zaGVsbCIgeworCXBlcm1pc3Npb24gamF2YS5sYW5nLlJ1bnRpbWVQZXJtaXNzaW9uICJhY2Nlc3NEZWNsYXJlZE1lbWJlcnMiOworfTsKKworLyoKKyAqIFNpbWlsYXIgdG8gImZpbGU6L2dyb292eS9zaGVsbCIsIGJ1dCBpbXBseWluZyBhIGRpcmVjdCBjYWxsIHRvIEdyb292eUNsYXNzTG9hZGVyLnBhcnNlKCkgd2l0aG91dAorICogcGFzc2luZyB0aHJvdWdoIEdyb292eVNoZWxsLgorICovCitncmFudCBjb2RlQmFzZSAiZmlsZTovZ3Jvb3Z5L3NjcmlwdCIgeworCXBlcm1pc3Npb24gamF2YS5sYW5nLlJ1bnRpbWVQZXJtaXNzaW9uICJhY2Nlc3NEZWNsYXJlZE1lbWJlcnMiOworCS8vcGVybWlzc2lvbiBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uICJncm9vdnkub3V0cHV0LmRpciIsICJyZWFkIjsKK307CisKKy8qCisgKiBUaGUgVGVzdFN1cHBvcnQgY2xhc3MgaGFzIGEgbG9hZENsYXNzIG1ldGhvZCB0aGF0IHRha2VzIGEgQ2xhc3NOb2RlIGFuZCBydW5zIGl0CisgKiB0aHJvdWdoIGRlZmluZUNsYXNzKCkgb2YgdGhlIGNsYXNzIGxvYWRlci4gIFRoZSBjb2RlYmFzZSBmb3IgdGhpcyBvcGVyYXRpb24gaXMKKyAqIHNldCB0byAiL2dyb292eS90ZXN0U3VwcG9ydCIuCisgKi8KK2dyYW50IGNvZGVCYXNlICJmaWxlOi9ncm9vdnkvdGVzdFN1cHBvcnQiIHsKKwlwZXJtaXNzaW9uIGphdmEubGFuZy5SdW50aW1lUGVybWlzc2lvbiAiYWNjZXNzRGVjbGFyZWRNZW1iZXJzIjsKK307CisKKy8qCisgKiA9PT09PT09PT09PT09PT09PSBTZWN1cml0eVRlc3QgY29kZWJhc2VzICA9PT09PT09PT09PT09PT0KKyAqIFRoZSBmb2xsb3dpbmcgZ3JhbnRzIGFyZSBmb3IgaW5kaXZpZHVhbCBzZWN1cml0eSB0ZXN0IGNhc2VzIHdoZXJlIHRoZQorICogY29kZWJhc2UgaXMgZXhwbGljaXR5IHNwZWNpZmllZCAoZS5nLiB0aGUgc2NyaXB0IGlzIGEgcmF3IHN0cmluZyByYXRoZXIKKyAqIHRoYW4gcmVhZCBmcm9tIGEgZmlsZSkuICBOb3RlIHRoYXQgZXZlbiB0aG91Z2ggdGhlIGNvZGViYXNlcyBjb25mb3JtIHRvCisgKiB0aGUgZmlsZSBVUkwgc3ludGF4LCB0aGV5IGFyZSBub3QgcGh5c2ljYWwgZmlsZXM6IHRoZXkgcmVwcmVzZW50IHZpcnR1YWwKKyAqIGNvZGViYXNlcy4KKyAqIFRoZSBwZXJtaXNzaW9uIGdyYW50IHRoYXQgaXMgY29tbWVudGVkIG91dCBpcyB0aGUgcGVybWlzc2lvbiB0aGF0IGlzIAorICogZXhwZWN0ZWQgdG8gYmUgbWlzc2luZyBieSB0aGUgdGVzdCBjYXNlLiAgSXQgaXMgaGVyZSBhcyBhIGNvbW1lbnQgZm9yCisgKiBpbmZvcm1hdGlvbi4KKyAqLworIAorLy9TaW5jZSBhIGNvZGViYXNlIGlzIGEgVVJMLCB3ZSBjYW4gbWFrZSB1c2Ugb2YgdGhlIG5hdHVyYWwgaGllcmFyY2h5IHBlcm1pc3Npb24gaW1wbGljYXRpb25zCisvL3RvIGdyYW50IGEgJ2dsb2JhbCcgYWNjZXNzRGVjbGFyZWRQZXJtaXNzaW9uIGhlcmUuCitncmFudCBjb2RlQmFzZSAiZmlsZTovZ3Jvb3Z5L3NlY3VyaXR5Ly0iIHsKKwlwZXJtaXNzaW9uIGphdmEubGFuZy5SdW50aW1lUGVybWlzc2lvbiAiYWNjZXNzRGVjbGFyZWRNZW1iZXJzIjsKK307CisKK2dyYW50IGNvZGVCYXNlICJmaWxlOi9ncm9vdnkvc2VjdXJpdHkvdGVzdEZvcmJpZGRlblBhY2thZ2UiIHsKKwkvL3Blcm1pc3Npb24gamF2YS5sYW5nLlJ1bnRpbWVQZXJtaXNzaW9uICJhY2Nlc3NDbGFzc0luUGFja2FnZS5zdW4uKiI7Cit9OworCitncmFudCBjb2RlQmFzZSAiZmlsZTovZ3Jvb3Z5L3NlY3VyaXR5L2phdmF4L3ByaW50L2RlbnkiIHsKKwkvL3Blcm1pc3Npb24gamF2YS5sYW5nLlJ1bnRpbWVQZXJtaXNzaW9uICJhY2Nlc3NDbGFzc0luUGFja2FnZS5qYXZheC5wcmludCI7Cit9OworCitncmFudCBjb2RlQmFzZSAiZmlsZTovZ3Jvb3Z5L3NlY3VyaXR5L2phdmF4L3ByaW50L2FsbG93IiB7CisJcGVybWlzc2lvbiBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gImFjY2Vzc0NsYXNzSW5QYWNrYWdlLmphdmF4LnByaW50IjsKK307CisKKy8qCisgKiA9PT09PT09PT09PT09PT09PSAuZ3Jvb3Z5IHNjcmlwdCBmaWxlIGNvZGViYXNlcyAgPT09PT09PT09PT09PT09CisgKiBUaGUgZm9sbG93aW5nIGdyYW50cyBhcmUgZm9yIGluZGl2aWR1YWwgc2VjdXJpdHkgdGVzdCBjYXNlcy4KKyAqIFRoZSBwZXJtaXNzaW9uIGdyYW50IHRoYXQgaXMgY29tbWVudGVkIG91dCBpcyB0aGUgcGVybWlzc2lvbiB0aGF0IGlzIAorICogZXhwZWN0ZWQgdG8gYmUgbWlzc2luZyBieSB0aGUgdGVzdCBjYXNlLiAgSXQgaXMgaGVyZSBhcyBhIGNvbW1lbnQgZm9yCisgKiBpbmZvcm1hdGlvbi4KKyAqLworZ3JhbnQgY29kZUJhc2UgImZpbGU6JHt1c2VyLmRpcn0vc3JjL3Rlc3QvLSIgeworCS8vIFJlcXVpcmVkIGJ5IG1vc3QgZ3Jvb3Z5IHNjcmlwdHMgZHVyaW5nIGV4ZWN1dGlvbiBiZWNhdXNlIG9mIHRoZSBoZWF2eSB1c2Ugb2YgcmVmbGVjdGlvbi8KKyAJLy8gaW50cm9zcGVjdGlvbi4gIFRoZSBncm9vdnkgY29kZSBjb3VsZCBwb3RlbnRpYWxseSBiZSBjaGFuZ2VkIHRvIGVsaW1pbmF0ZSB0aGlzIHJlcXVpcmVtZW50CisgCS8vIGJ5IGFkZGluZyBwcml2aWxlZ2VkIG9wZXJhdGlvbnMgaW4gbWFueSBwbGFjZXMuCisJcGVybWlzc2lvbiBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gImFjY2Vzc0RlY2xhcmVkTWVtYmVycyI7CisKKwkvLyBTSE9VTEQgTk9UIEhBVkUgVE8gRE8gVEhJUyEgLSBMZXZlbC5nZXRMb2NhbGl6ZWROYW1lKCkgc2hvdWxkIGhhdmUgYSBkb1ByaXZpbGVnZWQgYmxvY2suCisJLy8gQW55IHRlc3QgdGhhdCBsb2dzLCB3aWxsIGVuY291bnRlciB0aGlzIChhbHRob3VnaCBpdCB3aWxsIGJlIG1hc2tlZCBieSB0aGUgbWV0aG9kCisJcGVybWlzc2lvbiBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gImFjY2Vzc0NsYXNzSW5QYWNrYWdlLnN1bi51dGlsLmxvZ2dpbmcucmVzb3VyY2VzIjsKK307CisKK2dyYW50IGNvZGVCYXNlICJmaWxlOiR7dXNlci5kaXJ9L3NyYy90ZXN0L2dyb292eS9zZWN1cml0eS9mb3JiaWRkZW5Db2RlQmFzZS5ndnkiIHsKKwkvL1RoZSBmb2xsb3dpbmcgZ3JhbnQgaXMgY29tbWVudGVkIG91dCBzbyB0aGF0IHRoZSB0ZXN0IGNhc2Ugd2lsbCB0aHJvdyBhbiBBY2Nlc3NDb250cm9sRXhjZXB0aW9uCisJcGVybWlzc2lvbiBncm9vdnkuc2VjdXJpdHkuR3Jvb3Z5Q29kZVNvdXJjZVBlcm1pc3Npb24gImdyb292eS9zZWN1cml0eS9mb3JiaWRkZW5Db2RlQmFzZSI7Cit9OworCisvLyBHcmFudCBwZXJtaXNzaW9uIHRvIC5ncm9vdnkgZmlsZXMgZXh0cmFjdGVkIGZyb20gYSBzaWduZWQgamFyIHRoYXQgaGFzIGJlZW4gc2lnbmVkQnkgIkdyb292eSIKK2dyYW50IHNpZ25lZEJ5ICJHcm9vdnkiIHsKKwlwZXJtaXNzaW9uIGphdmEubGFuZy5SdW50aW1lUGVybWlzc2lvbiAiYWNjZXNzRGVjbGFyZWRNZW1iZXJzIjsKKwlwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gInVzZXIuaG9tZSIsICJyZWFkIjsKK307CisKK2dyYW50IGNvZGVCYXNlICJmaWxlOiR7dXNlci5kaXJ9L3NyYy90ZXN0L2dyb292eS9idWdzL0JhZFNjcmlwdE5hbWVCdWcuZ3Jvb3Z5IiB7CisJcGVybWlzc2lvbiBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uICJqYXZhLmNsYXNzLnBhdGgiLCAicmVhZCI7CisJcGVybWlzc2lvbiBqYXZhLmlvLkZpbGVQZXJtaXNzaW9uICI8PEFMTCBGSUxFUz4+IiwgInJlYWQiOworCXBlcm1pc3Npb24gamF2YS5sYW5nLlJ1bnRpbWVQZXJtaXNzaW9uICJjcmVhdGVDbGFzc0xvYWRlciI7Cit9OworCitncmFudCBjb2RlQmFzZSAiZmlsZToke3VzZXIuZGlyfS9zcmMvdGVzdC9ncm9vdnkvQ2xvc3VyZUxpc3RlbmVyVGVzdC5ncm9vdnkiIHsKKwlwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gImphdmEuYXd0LmhlYWRsZXNzIiwgInJlYWQiOworCS8vIGJlbG93IHNlZW1zIGxpa2UgYSBuZXcgcmVxdWlyZW1lbnQgaW4gamRrIDEuNi8xLjcKKwlwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gIm9zLnZlcnNpb24iLCAicmVhZCI7Cit9OworCitncmFudCBjb2RlQmFzZSAiZmlsZToke3VzZXIuZGlyfS9zcmMvdGVzdC9ncm9vdnkvQ2xvc3VyZU1ldGhvZFRlc3QuZ3Jvb3Z5IiB7CisJcGVybWlzc2lvbiBqYXZhLmlvLkZpbGVQZXJtaXNzaW9uICIke3VzZXIuZGlyfSR7L31zcmMkey99dGVzdCR7L30tIiwgInJlYWQiOworCXBlcm1pc3Npb24gamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiAiZmlsZS5lbmNvZGluZyIsICJyZWFkIjsKK307CisKK2dyYW50IGNvZGVCYXNlICJmaWxlOiR7dXNlci5kaXJ9L3NyYy90ZXN0L2dyb292eS9Hcm9vdnlNZXRob2RzVGVzdC5ncm9vdnkiIHsKKwlwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gIioiLCAicmVhZCx3cml0ZSI7CisJLy9zcGcgMjAwNi0wMi0wOSBhZGRlZCBBTEwgRklMRVMgZXhlY3V0ZSBiZWNhdXNlIGEgdGVzdCBjYXNlIAorCS8vaW52b2tlcyBSdW50aW1lLmV4ZWMoKS4gIFRoaXMgaXMgT0sgYW5kIHBlcm1pc3Npb24gc2hvdWxkIGJlIGdyYW50ZWQgaGVyZS4KKwlwZXJtaXNzaW9uIGphdmEuaW8uRmlsZVBlcm1pc3Npb24gIjw8QUxMIEZJTEVTPj4iLCAiZXhlY3V0ZSI7Cit9OworCitncmFudCBjb2RlQmFzZSAiZmlsZToke3VzZXIuZGlyfS9zcmMvdGVzdC9ncm9vdnkvQ2xvc3VyZVdpdGhEZWZhdWx0UGFyYW1UZXN0Lmdyb292eSIgeworCXBlcm1pc3Npb24gamF2YS5pby5GaWxlUGVybWlzc2lvbiAic3JjJHsvfXRlc3Qkey99LSIsICJyZWFkIjsKKwlwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gImZpbGUuZW5jb2RpbmciLCAicmVhZCI7Cit9OworCitncmFudCBjb2RlQmFzZSAiZmlsZToke3VzZXIuZGlyfS9zcmMvdGVzdC9ncm9vdnkvYnVncy9Db25zdHJ1Y3RvckJ1Zy5ncm9vdnkiIHsKKwlwZXJtaXNzaW9uIGphdmEubGFuZy5SdW50aW1lUGVybWlzc2lvbiAiY3JlYXRlQ2xhc3NMb2FkZXIiOworCXBlcm1pc3Npb24gamF2YS5pby5GaWxlUGVybWlzc2lvbiAic3JjJHsvfXRlc3Qkey99Z3Jvb3Z5JHsvfWJ1Z3Mkey99VGVzdEJhc2UuZ3Jvb3Z5IiwgInJlYWQiOworCXBlcm1pc3Npb24gamF2YS5pby5GaWxlUGVybWlzc2lvbiAic3JjJHsvfXRlc3Qkey99Z3Jvb3Z5JHsvfWJ1Z3Mkey99VGVzdERlcml2ZWQuZ3Jvb3Z5IiwgInJlYWQiOworfTsKKworZ3JhbnQgY29kZUJhc2UgImZpbGU6JHt1c2VyLmRpcn0vc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvRm9yQW5kU3FsQnVnLmdyb292eSIgeworCXBlcm1pc3Npb24gamF2YS5pby5GaWxlUGVybWlzc2lvbiAidGFyZ2V0JHsvfXRlc3QtY2xhc3NlcyR7L30qIiwgInJlYWQsIHdyaXRlIjsKK307CisKK2dyYW50IGNvZGVCYXNlICJmaWxlOiR7dXNlci5kaXJ9L3NyYy90ZXN0L2dyb292eS9idWdzL0Zvckxvb3BCdWcuZ3Jvb3Z5IiB7CisJcGVybWlzc2lvbiBqYXZhLmlvLkZpbGVQZXJtaXNzaW9uICJ0YXJnZXQkey99dGVzdC1jbGFzc2VzJHsvfSoiLCAicmVhZCwgd3JpdGUiOworCXBlcm1pc3Npb24gamF2YS5pby5GaWxlUGVybWlzc2lvbiAidGFyZ2V0JHsvfXRlc3QtY2xhc3NlcyR7L30qIiwgInJlYWQsIHdyaXRlIjsKK307CisKK2dyYW50IGNvZGVCYXNlICJmaWxlOiR7dXNlci5kaXJ9L3NyYy90ZXN0L2dyb292eS9idWdzL0dyb292eTMwM19CdWcuZ3Jvb3Z5IiB7CisJcGVybWlzc2lvbiBqYXZhLmF3dC5BV1RQZXJtaXNzaW9uICJzaG93V2luZG93V2l0aG91dFdhcm5pbmdCYW5uZXIiOworCS8vIGJlbG93IHNlZW1zIGxpa2UgYSBuZXcgcmVxdWlyZW1lbnQgaW4gamRrIDEuNQorCXBlcm1pc3Npb24gamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiAib3MudmVyc2lvbiIsICJyZWFkIjsKK307CisKK2dyYW50IGNvZGVCYXNlICJmaWxlOiR7dXNlci5kaXJ9L3NyYy90ZXN0L2dyb292eS9zY3JpcHQvU2NyaXB0VGVzdC5ncm9vdnkiIHsKKwlwZXJtaXNzaW9uIGphdmEuaW8uRmlsZVBlcm1pc3Npb24gInNyYyR7L310ZXN0JHsvfWdyb292eSR7L30tIiwgInJlYWQiOworfTsKKworZ3JhbnQgY29kZUJhc2UgImZpbGU6JHt1c2VyLmRpcn0vc3JjL3Rlc3QvZ3Jvb3Z5L3NjcmlwdC9FdmFsSW5TY3JpcHQuZ3Jvb3Z5IiB7CisJcGVybWlzc2lvbiBqYXZhLmlvLkZpbGVQZXJtaXNzaW9uICJzcmMkey99dGVzdCR7L31ncm9vdnkkey99c2NyaXB0JHsvfUhlbGxvV29ybGQuZ3Jvb3Z5IiwgInJlYWQiOworfTsKKworZ3JhbnQgY29kZUJhc2UgImZpbGU6JHt1c2VyLmRpcn0vc3JjL3Rlc3QvZ3Jvb3Z5L3NxbC9QZXJzb25UZXN0Lmdyb292eSIgeworCXBlcm1pc3Npb24gamF2YS5pby5GaWxlUGVybWlzc2lvbiAidGFyZ2V0JHsvfXRlc3QtY2xhc3NlcyR7L31ncm9vdnkkey99c3FsJHsvfS0iLCAicmVhZCI7Cit9OworCitncmFudCBjb2RlQmFzZSAiZmlsZToke3VzZXIuZGlyfS9zcmMvdGVzdC9ncm9vdnkvc3FsL1NxbENvbXBsZXRlVGVzdC5ncm9vdnkiIHsKKwlwZXJtaXNzaW9uIGphdmEuaW8uRmlsZVBlcm1pc3Npb24gInRhcmdldCR7L310ZXN0LWNsYXNzZXMkey99Z3Jvb3Z5JHsvfXNxbCR7L30tIiwgInJlYWQiOworfTsKKworZ3JhbnQgY29kZUJhc2UgImZpbGU6JHt1c2VyLmRpcn0vc3JjL3Rlc3QvZ3Jvb3Z5L3NxbC9TcWxDb21wbGV0ZVdpdGhvdXREYXRhU291cmNlVGVzdC5ncm9vdnkiIHsKKyAgICAvL1RPRE86IHdoYXQgc2hvdWxkIHRoaXMgYmUgc2VlIG90aGVyIFRPRE8gYWJvdXQgbmFycm93aW5nIGRvd24gbWFpbiBkaXJlY3RvcmllcworCS8vcGVybWlzc2lvbiBqYXZhLmlvLkZpbGVQZXJtaXNzaW9uICIke2dyb292eS5saWJ9JHsvfWF4aW9uJHsvfWphcnMkey99YXhpb24tMS4wLU0zLWRldi5qYXIiLCAicmVhZCI7Cit9OworCitncmFudCBjb2RlQmFzZSAiZmlsZToke3VzZXIuZGlyfS9zcmMvdGVzdC9ncm9vdnkvc3FsL1NxbFRlc3QuZ3Jvb3Z5IiB7CisJcGVybWlzc2lvbiBqYXZhLmlvLkZpbGVQZXJtaXNzaW9uICJ0YXJnZXQkey99dGVzdC1jbGFzc2VzJHsvfWdyb292eSR7L31zcWwkey99LSIsICJyZWFkIjsKK307CisKK2dyYW50IGNvZGVCYXNlICJmaWxlOiR7dXNlci5kaXJ9L3NyYy90ZXN0L2dyb292eS91dGlsL0FudFRlc3QuZ3Jvb3Z5IiB7CisJcGVybWlzc2lvbiBqYXZhLnNlY3VyaXR5LkFsbFBlcm1pc3Npb247Cit9OworCitncmFudCBjb2RlQmFzZSAiZmlsZToke3VzZXIuZGlyfS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL01ldGFDbGFzc1Rlc3QuZ3Jvb3Z5IiB7CisJcGVybWlzc2lvbiBqYXZhLmlvLkZpbGVQZXJtaXNzaW9uICJ0YXJnZXQkey99dGVzdC1jbGFzc2VzJHsvfS0iLCAicmVhZCI7Cit9OworCmRpZmYgLS1naXQgYS9ncm9vdnkvc2VjdXJpdHkvZ3Jvb3Z5a2V5cyBiL2dyb292eS9zZWN1cml0eS9ncm9vdnlrZXlzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmYzI0ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc2VjdXJpdHkvZ3Jvb3Z5a2V5cwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL2Jpbi9ncm9vdnkgYi9ncm9vdnkvc3JjL2Jpbi9ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkzOGNiZAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvYmluL2dyb292eQpAQCAtMCwwICsxLDIyIEBACisjIS9iaW4vc2gKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMKKyMjICBHcm9vdnkgSlZNIEJvb3RzdHJhcCBmb3IgVU4qWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIworIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjCisjIyAgdXNlIC1jcCBvciAtY2xhc3NwYXRoIGp1c3QgYXMgaW4gamF2YSB0byB1c2UgYSBjdXN0b20gY2xhc3NwYXRoICAgICAgICAgIyMKKyMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMjCisjIyAkUmV2aXNpb24kCisjIyAkRGF0ZSQKKyMjCisKK0dST09WWV9BUFBfTkFNRT1Hcm9vdnkKK0RJUk5BTUU9YGRpcm5hbWUgIiQwImAKK0pBVkFfT1BUUz0iJEpBVkFfT1BUUyAtRHNjcmlwdC5uYW1lPSQwIgorZXhwb3J0IEpBVkFfT1BUUworLiAiJERJUk5BTUUvc3RhcnRHcm9vdnkiCisKK3N0YXJ0R3Jvb3Z5IGdyb292eS51aS5Hcm9vdnlNYWluICIkQCIKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvYmluL2dyb292eS5iYXQgYi9ncm9vdnkvc3JjL2Jpbi9ncm9vdnkuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNDgwYWYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL2Jpbi9ncm9vdnkuYmF0CkBAIC0wLDAgKzEsMTggQEAKK0BpZiAiJURFQlVHJSIgPT0gIiIgQGVjaG8gb2ZmCisKK0ByZW0gCitAcmVtICRSZXZpc2lvbiQgJERhdGUkCitAcmVtIAorCitAcmVtIFNldCBsb2NhbCBzY29wZSBmb3IgdGhlIHZhcmlhYmxlcyB3aXRoIHdpbmRvd3MgTlQgc2hlbGwKK2lmICIlT1MlIj09IldpbmRvd3NfTlQiIHNldGxvY2FsCisKKzpiZWdpbgorQHJlbSBEZXRlcm1pbmUgd2hhdCBkaXJlY3RvcnkgaXQgaXMgaW4uCitzZXQgRElSTkFNRT0lfmRwMAoraWYgIiVESVJOQU1FJSIgPT0gIiIgc2V0IERJUk5BTUU9LlwKKworIiVESVJOQU1FJVxzdGFydEdyb292eS5iYXQiICIlRElSTkFNRSUiIGdyb292eS51aS5Hcm9vdnlNYWluICUqCisKK0ByZW0gRW5kIGxvY2FsIHNjb3BlIGZvciB0aGUgdmFyaWFibGVzIHdpdGggd2luZG93cyBOVCBzaGVsbAoraWYgIiVPUyUiPT0iV2luZG93c19OVCIgZW5kbG9jYWwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL2Jpbi9ncm9vdnlDb25zb2xlIGIvZ3Jvb3Z5L3NyYy9iaW4vZ3Jvb3Z5Q29uc29sZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGE5ZWJmCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9iaW4vZ3Jvb3Z5Q29uc29sZQpAQCAtMCwwICsxLDE4IEBACisjIS9iaW4vc2gKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMKKyMjICBHcm9vdnkgQ29uc29sZSBzY3JpcHQgZm9yIFVOKlggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIworIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyMKKyMjICRSZXZpc2lvbiQKKyMjICREYXRlJAorIyMKKworR1JPT1ZZX0FQUF9OQU1FPUdyb292eUNvbnNvbGUKK0RJUk5BTUU9YGRpcm5hbWUgIiQwImAKKy4gIiRESVJOQU1FL3N0YXJ0R3Jvb3Z5IgorCitzdGFydEdyb292eSBncm9vdnkudWkuQ29uc29sZSAiJEAiCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL2Jpbi9ncm9vdnlDb25zb2xlLmJhdCBiL2dyb292eS9zcmMvYmluL2dyb292eUNvbnNvbGUuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0YTA5ODkKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL2Jpbi9ncm9vdnlDb25zb2xlLmJhdApAQCAtMCwwICsxLDE4IEBACitAaWYgIiVERUJVRyUiID09ICIiIEBlY2hvIG9mZgorCitAcmVtIAorQHJlbSAkUmV2aXNpb24kICREYXRlJAorQHJlbSAKKworQHJlbSBTZXQgbG9jYWwgc2NvcGUgZm9yIHRoZSB2YXJpYWJsZXMgd2l0aCB3aW5kb3dzIE5UIHNoZWxsCitpZiAiJU9TJSI9PSJXaW5kb3dzX05UIiBzZXRsb2NhbAorCis6YmVnaW4KK0ByZW0gRGV0ZXJtaW5lIHdoYXQgZGlyZWN0b3J5IGl0IGlzIGluLgorc2V0IERJUk5BTUU9JX5kcDAKK2lmICIlRElSTkFNRSUiID09ICIiIHNldCBESVJOQU1FPS5cCisKKyIlRElSTkFNRSVcc3RhcnRHcm9vdnkuYmF0IiAiJURJUk5BTUUlIiBncm9vdnkudWkuQ29uc29sZSAlKgorCitAcmVtIEVuZCBsb2NhbCBzY29wZSBmb3IgdGhlIHZhcmlhYmxlcyB3aXRoIHdpbmRvd3MgTlQgc2hlbGwKK2lmICIlT1MlIj09IldpbmRvd3NfTlQiIGVuZGxvY2FsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9iaW4vZ3Jvb3Z5YyBiL2dyb292eS9zcmMvYmluL2dyb292eWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVkZjMwNgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvYmluL2dyb292eWMKQEAgLTAsMCArMSwxOCBAQAorIyEvYmluL3NoCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjCisjIyAgR3Jvb3Z5IEpWTSBCb290c3RyYXAgZm9yIFVOKlggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMKKyMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMjCisjIyAkUmV2aXNpb24kCisjIyAkRGF0ZSQKKyMjCisKK0dST09WWV9BUFBfTkFNRT1Hcm9vdnlDCitESVJOQU1FPWBkaXJuYW1lICIkMCJgCisuICIkRElSTkFNRS9zdGFydEdyb292eSIKKworc3RhcnRHcm9vdnkgb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5GaWxlU3lzdGVtQ29tcGlsZXIgIiRAIgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9iaW4vZ3Jvb3Z5Yy5iYXQgYi9ncm9vdnkvc3JjL2Jpbi9ncm9vdnljLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmZjMDQxCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9iaW4vZ3Jvb3Z5Yy5iYXQKQEAgLTAsMCArMSwxOCBAQAorQGlmICIlREVCVUclIiA9PSAiIiBAZWNobyBvZmYKKworQHJlbSAKK0ByZW0gJFJldmlzaW9uJCAkRGF0ZSQKK0ByZW0gCisKK0ByZW0gU2V0IGxvY2FsIHNjb3BlIGZvciB0aGUgdmFyaWFibGVzIHdpdGggd2luZG93cyBOVCBzaGVsbAoraWYgIiVPUyUiPT0iV2luZG93c19OVCIgc2V0bG9jYWwKKworOmJlZ2luCitAcmVtIERldGVybWluZSB3aGF0IGRpcmVjdG9yeSBpdCBpcyBpbi4KK3NldCBESVJOQU1FPSV+ZHAwCitpZiAiJURJUk5BTUUlIiA9PSAiIiBzZXQgRElSTkFNRT0uXAorCisiJURJUk5BTUUlXHN0YXJ0R3Jvb3Z5LmJhdCIgIiVESVJOQU1FJSIgb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5GaWxlU3lzdGVtQ29tcGlsZXIgJSoKKworQHJlbSBFbmQgbG9jYWwgc2NvcGUgZm9yIHRoZSB2YXJpYWJsZXMgd2l0aCB3aW5kb3dzIE5UIHNoZWxsCitpZiAiJU9TJSI9PSJXaW5kb3dzX05UIiBlbmRsb2NhbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvYmluL2dyb292eXNoIGIvZ3Jvb3Z5L3NyYy9iaW4vZ3Jvb3Z5c2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ5ZmNmMgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvYmluL2dyb292eXNoCkBAIC0wLDAgKzEsMjMgQEAKKyMhL2Jpbi9zaAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIworIyMgIEdyb292eSBTaGVsbCBzY3JpcHQgZm9yIFVOKlggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjCisjIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIworIyMgJFJldmlzaW9uJAorIyMgJElkJAorIyMKKworR1JPT1ZZX0FQUF9OQU1FPUdyb292eVNoZWxsCitESVJOQU1FPWBkaXJuYW1lICIkMCJgCisuICIkRElSTkFNRS9zdGFydEdyb292eSIKKworaWYgWyAieCRPTERTSEVMTCIgIT0gIngiIF07IHRoZW4KKyAgICBzdGFydEdyb292eSBncm9vdnkudWkuSW50ZXJhY3RpdmVTaGVsbCAiJEAiCitlbHNlCisgICAgc3RhcnRHcm9vdnkgb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5NYWluICIkQCIKK2ZpCisKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvYmluL2dyb292eXNoLmJhdCBiL2dyb292eS9zcmMvYmluL2dyb292eXNoLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGFjNzUxCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9iaW4vZ3Jvb3Z5c2guYmF0CkBAIC0wLDAgKzEsMjEgQEAKK0BpZiAiJURFQlVHJSIgPT0gIiIgQGVjaG8gb2ZmCisKK0ByZW0gCitAcmVtICRSZXZpc2lvbiQgJERhdGUkCitAcmVtCisKK0ByZW0gU2V0IGxvY2FsIHNjb3BlIGZvciB0aGUgdmFyaWFibGVzIHdpdGggd2luZG93cyBOVCBzaGVsbAoraWYgIiVPUyUiPT0iV2luZG93c19OVCIgc2V0bG9jYWwKKworOmJlZ2luCitAcmVtIERldGVybWluZSB3aGF0IGRpcmVjdG9yeSBpdCBpcyBpbi4KK3NldCBESVJOQU1FPSV+ZHAwCitpZiAiJURJUk5BTUUlIiA9PSAiIiBzZXQgRElSTkFNRT0uXAorCitzZXQgQ0xBU1NOQU1FPWdyb292eS51aS5JbnRlcmFjdGl2ZVNoZWxsCitpZiAiJU9MRFNIRUxMJSIgPT0gIiIgc2V0IENMQVNTTkFNRT1vcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLk1haW4KKworIiVESVJOQU1FJVxzdGFydEdyb292eS5iYXQiICIlRElSTkFNRSUiICVDTEFTU05BTUUlICUqCisKK0ByZW0gRW5kIGxvY2FsIHNjb3BlIGZvciB0aGUgdmFyaWFibGVzIHdpdGggd2luZG93cyBOVCBzaGVsbAoraWYgIiVPUyUiPT0iV2luZG93c19OVCIgZW5kbG9jYWwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL2Jpbi9qYXZhMmdyb292eSBiL2dyb292eS9zcmMvYmluL2phdmEyZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZDJkZTIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL2Jpbi9qYXZhMmdyb292eQpAQCAtMCwwICsxLDE4IEBACisjIS9iaW4vc2gKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMKKyMjICBHcm9vdnkgSlZNIEJvb3RzdHJhcCBmb3IgVU4qWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIworIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyMKKyMjICRSZXZpc2lvbjogNDI0MSAkCisjIyAkRGF0ZTogMjAwNi0xMS0xNiAxNzozMDo0MCArMDAwMCAoVGh1LCAxNiBOb3YgMjAwNikgJAorIyMKKworR1JPT1ZZX0FQUF9OQU1FPUphdmEyR3Jvb3Z5CitESVJOQU1FPWBkaXJuYW1lICIkMCJgCisuICIkRElSTkFNRS9zdGFydEdyb292eSIKKworc3RhcnRHcm9vdnkgb3JnLmNvZGVoYXVzLmdyb292eS5hbnRsci5qYXZhLkphdmEyR3Jvb3Z5TWFpbiAiJEAiCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL2Jpbi9qYXZhMmdyb292eS5iYXQgYi9ncm9vdnkvc3JjL2Jpbi9qYXZhMmdyb292eS5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE4NWFiNQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvYmluL2phdmEyZ3Jvb3Z5LmJhdApAQCAtMCwwICsxLDE4IEBACitAaWYgIiVERUJVRyUiID09ICIiIEBlY2hvIG9mZgorCitAcmVtIAorQHJlbSAkUmV2aXNpb246IDI3NzAgJCAkRGF0ZTogMjAwNS0wOC0yOSAxMTo0OTo0MiArMDEwMCAoTW9uLCAyOSBBdWcgMjAwNSkgJAorQHJlbSAKKworQHJlbSBTZXQgbG9jYWwgc2NvcGUgZm9yIHRoZSB2YXJpYWJsZXMgd2l0aCB3aW5kb3dzIE5UIHNoZWxsCitpZiAiJU9TJSI9PSJXaW5kb3dzX05UIiBzZXRsb2NhbAorCis6YmVnaW4KK0ByZW0gRGV0ZXJtaW5lIHdoYXQgZGlyZWN0b3J5IGl0IGlzIGluLgorc2V0IERJUk5BTUU9JX5kcDAKK2lmICIlRElSTkFNRSUiID09ICIiIHNldCBESVJOQU1FPS5cCisKKyIlRElSTkFNRSVcc3RhcnRHcm9vdnkuYmF0IiAiJURJUk5BTUUlIiBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudGxyLmphdmEuSmF2YTJHcm9vdnlNYWluICUqCisKK0ByZW0gRW5kIGxvY2FsIHNjb3BlIGZvciB0aGUgdmFyaWFibGVzIHdpdGggd2luZG93cyBOVCBzaGVsbAoraWYgIiVPUyUiPT0iV2luZG93c19OVCIgZW5kbG9jYWwKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvYmluL3N0YXJ0R3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy9iaW4vc3RhcnRHcm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM4NmM0MwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvYmluL3N0YXJ0R3Jvb3Z5CkBAIC0wLDAgKzEsMjY1IEBACisjIC0qLSBtb2RlOnNoIC0qLQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIworIyMgIEdyb292eSBKVk0gQm9vdHN0cmFwIGZvciBVTipYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjCisjIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIworIyMgJFJldmlzaW9uJAorIyMgJERhdGUkCisjIworCitQUk9HTkFNRT1gYmFzZW5hbWUgIiQwImAKKworI0RJUk5BTUU9YGRpcm5hbWUgIiQwImAKKworIyBVc2UgdGhlIG1heGltdW0gYXZhaWxhYmxlLCBvciBzZXQgTUFYX0ZEICE9IC0xIHRvIHVzZSB0aGF0IHZhbHVlLgorTUFYX0ZEPSJtYXhpbXVtIgorCit3YXJuICggKSB7CisgICAgZWNobyAiJHtQUk9HTkFNRX06ICQqIgorfQorCitkaWUgKCApIHsKKyAgICB3YXJuICIkKiIKKyAgICBleGl0IDEKK30KKworZWFybHlJbml0ICggKSB7CisgICAgcmV0dXJuCit9CisKK2xhdGVJbml0ICggKSB7CisgICAgcmV0dXJuCit9CisKK0dST09WWV9TVEFSVFVQPSIkSE9NRS8uZ3Jvb3Z5L3N0YXJ0dXAiCitpZiBbIC1yICIkR1JPT1ZZX1NUQVJUVVAiIF0gOyB0aGVuCisgICAgLiAiJEdST09WWV9TVEFSVFVQIgorZmkKKworZWFybHlJbml0CisKKyMgT1Mgc3BlY2lmaWMgc3VwcG9ydCAobXVzdCBiZSAndHJ1ZScgb3IgJ2ZhbHNlJykuCitjeWd3aW49ZmFsc2UKK21zeXM9ZmFsc2UKK2Rhcndpbj1mYWxzZQorY2FzZSAiYHVuYW1lYCIgaW4KKyAgQ1lHV0lOKiApCisgICAgY3lnd2luPXRydWUKKyAgICA7OyAKKyAgRGFyd2luKiApCisgICAgZGFyd2luPXRydWUKKyAgICA7OworICBNSU5HVyogKQorICAgIG1zeXM9dHJ1ZQorICAgIDs7Citlc2FjCisKK2lmIFsgIiQxIiA9ICItY3AiIC1vICIkMSIgPSAiLWNsYXNzcGF0aCIgXSA7IHRoZW4KKyAgICBDUD0kMgorICAgIHNoaWZ0IDIKK2ZpCisKKyMgQXR0ZW1wdCB0byBzZXQgSkFWQV9IT01FIGlmIGl0J3Mgbm90IGFscmVhZHkgc2V0LgoraWYgWyAteiAiJEpBVkFfSE9NRSIgXSA7IHRoZW4KKyAgICBpZiAkZGFyd2luIDsgdGhlbiAKKyAgICAgICAgWyAteiAiJEpBVkFfSE9NRSIgLWEgLWQgIi9MaWJyYXJ5L0phdmEvSG9tZSIgXSAmJiBleHBvcnQgSkFWQV9IT01FPSIvTGlicmFyeS9KYXZhL0hvbWUiCisgICAgICAgIFsgLXogIiRKQVZBX0hPTUUiIC1hIC1kICIvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9KYXZhVk0uZnJhbWV3b3JrL0hvbWUiIF0gJiYgZXhwb3J0IEpBVkFfSE9NRT0iL1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvSmF2YVZNLmZyYW1ld29yay9Ib21lIgorICAgIGVsc2UKKyAgICAgICAgamF2YUV4ZWN1dGFibGU9ImB3aGljaCBqYXZhY2AiCisgICAgICAgIFsgLXogIiRqYXZhRXhlY3V0YWJsZSIgLW8gImBleHByIFwiJGphdmFFeGVjdXRhYmxlXCIgOiAnXChbXiBdKlwpJ2AiID0gIm5vIiBdICYmIGRpZSAiSkFWQV9IT01FIG5vdCBzZXQgYW5kIGNhbm5vdCBmaW5kIGphdmFjIHRvIGRlZHVjZSBsb2NhdGlvbiwgcGxlYXNlIHNldCBKQVZBX0hPTUUuIgorICAgICAgICAjIHJlYWRsaW5rKDEpIGlzIG5vdCBhdmFpbGFibGUgYXMgc3RhbmRhcmQgb24gU29sYXJpcyAxMC4KKyAgICAgICAgcmVhZExpbms9YHdoaWNoIHJlYWRsaW5rYAorICAgICAgICBbIGBleHByICIkcmVhZExpbmsiIDogJ1woW14gXSpcKSdgID0gIm5vIiBdICYmIGRpZSAiSkFWQV9IT01FIG5vdCBzZXQgYW5kIHJlYWRsaW5rIG5vdCBhdmFpbGFibGUsIHBsZWFzZSBzZXQgSkFWQV9IT01FLiIKKyAgICAgICAgamF2YUV4ZWN1dGFibGU9ImByZWFkbGluayAtZiBcIiRqYXZhRXhlY3V0YWJsZVwiYCIKKyAgICAgICAgamF2YUhvbWU9ImBkaXJuYW1lIFwiJGphdmFFeGVjdXRhYmxlXCJgIgorICAgICAgICBqYXZhSG9tZT1gZXhwciAiJGphdmFIb21lIiA6ICdcKC4qXCkvYmluJ2AKKyAgICAgICAgZXhwb3J0IEpBVkFfSE9NRT0iJGphdmFIb21lIgorICAgIGZpCitmaQorCisjIEZvciBDeWd3aW4sIGVuc3VyZSBwYXRocyBhcmUgaW4gVU5JWCBmb3JtYXQgYmVmb3JlIGFueXRoaW5nIGlzIHRvdWNoZWQuCitpZiAkY3lnd2luIDsgdGhlbgorICAgIFsgLW4gIiRHUk9PVllfSE9NRSIgXSAmJiBHUk9PVllfSE9NRT1gY3lncGF0aCAtLXVuaXggIiRHUk9PVllfSE9NRSJgCisgICAgWyAtbiAiJEpBVkFDTUQiIF0gJiYgSkFWQUNNRD1gY3lncGF0aCAtLXVuaXggIiRKQVZBQ01EImAKKyAgICBbIC1uICIkSkFWQV9IT01FIiBdICYmIEpBVkFfSE9NRT1gY3lncGF0aCAtLXVuaXggIiRKQVZBX0hPTUUiYAorICAgIFsgLW4gIiRDUCIgXSAmJiBDUD1gY3lncGF0aCAtLXBhdGggLS11bml4ICIkQ1AiYAorZmkKKworIyBBdHRlbXB0IHRvIHNldCBHUk9PVllfSE9NRSBpZiBpdCBpcyBub3QgYWxyZWFkeSBzZXQuCitpZiBbIC16ICIkR1JPT1ZZX0hPTUUiIC1vICEgLWQgIiRHUk9PVllfSE9NRSIgXSA7IHRoZW4KKyAgICAjIFJlc29sdmUgbGlua3M6ICQwIG1heSBiZSBhIGxpbmsgdG8gZ3Jvb3Z5J3MgaG9tZS4KKyAgICBQUkc9IiQwIgorICAgICMgTmVlZCB0aGlzIGZvciByZWxhdGl2ZSBzeW1saW5rcy4KKyAgICB3aGlsZSBbIC1oICIkUFJHIiBdIDsgZG8KKyAgICAgICAgbHM9YGxzIC1sZCAiJFBSRyJgCisgICAgICAgIGxpbms9YGV4cHIgIiRscyIgOiAnLiotPiBcKC4qXCkkJ2AKKyAgICAgICAgaWYgZXhwciAiJGxpbmsiIDogJy8uKicgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgICAgICAgIFBSRz0iJGxpbmsiCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFBSRz1gZGlybmFtZSAiJFBSRyJgIi8kbGluayIKKyAgICAgICAgZmkKKyAgICBkb25lCisgICAgU0FWRUQ9ImBwd2RgIgorICAgIGNkICJgZGlybmFtZSBcIiRQUkdcImAvLi4iCisgICAgR1JPT1ZZX0hPTUU9ImBwd2QgLVBgIgorICAgIGNkICIkU0FWRUQiCitmaQorCisjIFNldCB0aGUgZGVmYXVsdCBHcm9vdnkgY29uZmlnIGlmIG5vIHNwZWNpZmljIG9uZSBpcyBtZW50aW9uZWQuCitpZiBbIC16ICIkR1JPT1ZZX0NPTkYiIF0gOyB0aGVuCisgICAgR1JPT1ZZX0NPTkY9IiRHUk9PVllfSE9NRS9jb25mL2dyb292eS1zdGFydGVyLmNvbmYiCitmaQorU1RBUlRFUl9DTEFTU1BBVEg9IiRHUk9PVllfSE9NRS9saWIvQEdST09WWUpBUkAiCisKKyMgQ3JlYXRlIHRoZSBmaW5hbCBjbGFzc3BhdGguIFNldHRpbmcgYSBjbGFzc3BhdGggdXNpbmcgdGhlIC1jcCBvciAtY2xhc3NwYXRoIG9wdGlvbiBtZWFucyBub3QgdG8gdXNlIHRoZQorIyBnbG9iYWwgY2xhc3NwYXRoLiBHcm9vdnkgYmVoYXZlcyB0aGVuIHRoZSBzYW1lIGFzIHRoZSBqYXZhIGludGVycHJldGVyCitpZiBbIC1uICIkQ1AiIF0gOyB0aGVuCisgICAgQ1A9IiRDUCI6LgorZWxpZiBbIC1uICIkQ0xBU1NQQVRIIiBdIDsgdGhlbgorICAgIENQPSIkQ0xBU1NQQVRIIjouCitlbHNlCisgICAgQ1A9LgorZmkKKworIyBEZXRlcm1pbmUgdGhlIEphdmEgY29tbWFuZCB0byB1c2UgdG8gc3RhcnQgdGhlIEpWTS4KK2lmIFsgLXogIiRKQVZBQ01EIiBdIDsgdGhlbgorICAgIGlmIFsgLW4gIiRKQVZBX0hPTUUiIF0gOyB0aGVuCisgICAgICAgIGlmIFsgLXggIiRKQVZBX0hPTUUvanJlL3NoL2phdmEiIF0gOyB0aGVuCisgICAgICAgICAgICAjIElCTSdzIEpESyBvbiBBSVggdXNlcyBzdHJhbmdlIGxvY2F0aW9ucyBmb3IgdGhlIGV4ZWN1dGFibGVzCisgICAgICAgICAgICBKQVZBQ01EPSIkSkFWQV9IT01FL2pyZS9zaC9qYXZhIgorICAgICAgICBlbHNlCisgICAgICAgICAgICBKQVZBQ01EPSIkSkFWQV9IT01FL2Jpbi9qYXZhIgorICAgICAgICBmaQorICAgIGVsc2UKKyAgICAgICAgSkFWQUNNRD0iamF2YSIKKyAgICBmaQorZmkKK2lmIFsgISAteCAiJEpBVkFDTUQiIF0gOyB0aGVuCisgICAgZGllICJKQVZBX0hPTUUgaXMgbm90IGRlZmluZWQgY29ycmVjdGx5LCBjYW4gbm90IGV4ZWN1dGU6ICRKQVZBQ01EIgorZmkKK2lmIFsgLXogIiRKQVZBX0hPTUUiIF0gOyB0aGVuCisgICAgd2FybiAiSkFWQV9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBzZXQiCitmaQorCisjIEluY3JlYXNlIHRoZSBtYXhpbXVtIGZpbGUgZGVzY3JpcHRvcnMgaWYgd2UgY2FuLgoraWYgWyAiJGN5Z3dpbiIgPSAiZmFsc2UiIC1hICIkZGFyd2luIiA9ICJmYWxzZSIgXSA7IHRoZW4KKyAgICBNQVhfRkRfTElNSVQ9YHVsaW1pdCAtSCAtbmAKKyAgICBpZiBbICQ/IC1lcSAwIF0gOyB0aGVuCisgICAgICAgIGlmIFsgIiRNQVhfRkQiID0gIm1heGltdW0iIC1vICIkTUFYX0ZEIiA9ICJtYXgiIF0gOyB0aGVuCisgICAgICAgICAgICBNQVhfRkQ9IiRNQVhfRkRfTElNSVQiCisgICAgICAgIGZpCisgICAgICAgIHVsaW1pdCAtbiAkTUFYX0ZECisgICAgICAgIGlmIFsgJD8gLW5lIDAgXSA7IHRoZW4KKyAgICAgICAgICAgIHdhcm4gIkNvdWxkIG5vdCBzZXQgbWF4aW11bSBmaWxlIGRlc2NyaXB0b3IgbGltaXQ6ICRNQVhfRkQiCisgICAgICAgIGZpCisgICAgZWxzZQorICAgICAgICB3YXJuICJDb3VsZCBub3QgcXVlcnkgYnVzaW5lc3NTeXN0ZW0gbWF4aW11bSBmaWxlIGRlc2NyaXB0b3IgbGltaXQ6ICRNQVhfRkRfTElNSVQiCisgICAgZmkKK2ZpCisKKyMgU2V0dXAgUHJvZmlsZXIKK3VzZXByb2ZpbGVyPWZhbHNlCitpZiBbICIkUFJPRklMRVIiICE9ICIiIF0gOyB0aGVuCisgICAgaWYgWyAtciAiJFBST0ZJTEVSIiBdIDsgdGhlbgorICAgICAgICAuICRQUk9GSUxFUgorICAgICAgICB1c2Vwcm9maWxlcj10cnVlCisgICAgZWxzZQorICAgICAgICBkaWUgIlByb2ZpbGVyIGZpbGUgbm90IGZvdW5kOiAkUFJPRklMRVIiCisgICAgZmkKK2ZpCisKKyMgRm9yIERhcndpbiwgdXNlIGNsYXNzZXMuamFyIGZvciBUT09MU19KQVIKK1RPT0xTX0pBUj0iJEpBVkFfSE9NRS9saWIvdG9vbHMuamFyIgorI2lmICRkYXJ3aW47IHRoZW4KKyMgICAgVE9PTFNfSkFSPSIvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9KYXZhVk0uZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnRKREsvQ2xhc3Nlcy9jbGFzc2VzLmphciIKKyNmaQorCisjIEZvciBEYXJ3aW4sIGFkZCBHUk9PVllfQVBQX05BTUUgdG8gdGhlIEpBVkFfT1BUUyBhcyAtWGRvY2s6bmFtZQoraWYgJGRhcndpbjsgdGhlbgorICAgIEpBVkFfT1BUUz0iJEpBVkFfT1BUUyAtWGRvY2s6bmFtZT0kR1JPT1ZZX0FQUF9OQU1FIgorIyB3ZSBtYXkgYWxzbyB3YW50IHRvIHNldCAtWGRvY2s6aW1hZ2UgICAgCitmaQorCisjIEZvciBDeWd3aW4sIHN3aXRjaCBwYXRocyB0byBXaW5kb3dzIGZvcm1hdCBiZWZvcmUgcnVubmluZyBqYXZhCitpZiAkY3lnd2luIDsgdGhlbgorICAgIEdST09WWV9IT01FPWBjeWdwYXRoIC0tcGF0aCAtLW1peGVkICIkR1JPT1ZZX0hPTUUiYAorICAgIEpBVkFfSE9NRT1gY3lncGF0aCAtLXBhdGggLS1taXhlZCAiJEpBVkFfSE9NRSJgCisgICAgR1JPT1ZZX0NPTkY9YGN5Z3BhdGggLS1wYXRoIC0tbWl4ZWQgIiRHUk9PVllfQ09ORiJgCisgICAgQ1A9YGN5Z3BhdGggLS1wYXRoIC0tbWl4ZWQgIiRDUCJgICAgIAorICAgIFRPT0xTX0pBUj1gY3lncGF0aCAtLXBhdGggLS1taXhlZCAiJFRPT0xTX0pBUiJgCisgICAgU1RBUlRFUl9DTEFTU1BBVEg9YGN5Z3BhdGggLS1wYXRoIC0tbWl4ZWQgIiRTVEFSVEVSX0NMQVNTUEFUSCJgCisKKyAgICAjIFdlIGJ1aWxkIHRoZSBwYXR0ZXJuIGZvciBhcmd1bWVudHMgdG8gYmUgY29udmVydGVkIHZpYSBjeWdwYXRoCisgICAgUk9PVERJUlNSQVc9YGZpbmQgLUwgLyAtbWF4ZGVwdGggMSAtbWluZGVwdGggMSAtdHlwZSBkIDI+L2Rldi9udWxsYAorICAgIFNFUD0iIgorICAgIGZvciBkaXIgaW4gJFJPT1RESVJTUkFXIDsgZG8KKyAgICAgICAgUk9PVERJUlM9IiRST09URElSUyRTRVAkZGlyIgorICAgICAgICBTRVA9InwiCisgICAgZG9uZQorICAgIE9VUkNZR1BBVFRFUk49IiheKCRST09URElSUykpIgorICAgICMgQWRkIGEgdXNlci1kZWZpbmVkIHBhdHRlcm4gdG8gdGhlIGN5Z3BhdGggYXJndW1lbnRzCisgICAgaWYgWyAiJEdST09WWV9DWUdQQVRURVJOIiAhPSAiIiBdIDsgdGhlbgorICAgICAgICBPVVJDWUdQQVRURVJOPSIkT1VSQ1lHUEFUVEVSTnwoJEdST09WWV9DWUdQQVRURVJOKSIKKyAgICBmaQorICAgICMgTm93IGNvbnZlcnQgdGhlIGFyZ3VtZW50cworICAgIGZvciBhcmcgaW4gIiRAIiA7IGRvCisgICAgICAgIENIRUNLPWBlY2hvICIkYXJnInxlZ3JlcCAtYyAiJE9VUkNZR1BBVFRFUk4iIC1gCisgICAgICAgIGlmIFsgJENIRUNLIC1uZSAwIF0gOyB0aGVuCisgICAgICAgICAgICBjb252QXJnPWBjeWdwYXRoIC0tcGF0aCAtLWlnbm9yZSAtLW1peGVkICIkYXJnImAKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY29udkFyZz0kYXJnCisgICAgICAgIGZpCisgICAgICAgIEFSR1VNRU5UUz0iJEFSR1VNRU5UUyAkY29udkFyZyIKKyAgICBkb25lCisKKyAgICBzdGFydEdyb292eSAoICkgeworICAgICAgICBDTEFTUz0kMQorICAgICAgICBzaGlmdAorICAgICAgICAjIFN0YXJ0IHRoZSBQcm9maWxlciBvciB0aGUgSlZNCisgICAgICAgIGlmICR1c2Vwcm9maWxlciA7IHRoZW4KKyAgICAgICAgICAgIHJ1blByb2ZpbGVyCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGV4ZWMgIiRKQVZBQ01EIiAkSkFWQV9PUFRTIFwKKyAgICAgICAgICAgICAgICAtY2xhc3NwYXRoICIkU1RBUlRFUl9DTEFTU1BBVEgiIFwKKyAgICAgICAgICAgICAgICAtRHByb2dyYW0ubmFtZT0iJFBST0dOQU1FIiBcCisgICAgICAgICAgICAgICAgLURncm9vdnkuc3RhcnRlci5jb25mPSIkR1JPT1ZZX0NPTkYiIFwKKyAgICAgICAgICAgICAgICAtRGdyb292eS5ob21lPSIkR1JPT1ZZX0hPTUUiIFwKKyAgICAgICAgICAgICAgICAtRHRvb2xzLmphcj0iJFRPT0xTX0pBUiIgXAorICAgICAgICAgICAgICAgICRTVEFSVEVSX01BSU5fQ0xBU1MgXAorICAgICAgICAgICAgICAgIC0tbWFpbiAkQ0xBU1MgXAorICAgICAgICAgICAgICAgIC0tY29uZiAiJEdST09WWV9DT05GIiBcCisgICAgICAgICAgICAgICAgLS1jbGFzc3BhdGggIiRDUCIgXAorICAgICAgICAgICAgICAgICRBUkdVTUVOVFMKKyAgICAgICAgZmkKKyAgICB9CisgICAgICAgICAgICAgICAgCitlbHNlCisgICAgc3RhcnRHcm9vdnkgKCApIHsKKyAgICAgICAgQ0xBU1M9JDEKKyAgICAgICAgc2hpZnQKKyAgICAgICAgIyBTdGFydCB0aGUgUHJvZmlsZXIgb3IgdGhlIEpWTQorICAgICAgICBpZiAkdXNlcHJvZmlsZXIgOyB0aGVuCisgICAgICAgICAgICBydW5Qcm9maWxlcgorICAgICAgICBlbHNlCisgICAgICAgICAgICBleGVjICIkSkFWQUNNRCIgJEpBVkFfT1BUUyBcCisgICAgICAgICAgICAgICAgLWNsYXNzcGF0aCAiJFNUQVJURVJfQ0xBU1NQQVRIIiBcCisgICAgICAgICAgICAgICAgLURwcm9ncmFtLm5hbWU9IiRQUk9HTkFNRSIgXAorICAgICAgICAgICAgICAgIC1EZ3Jvb3Z5LnN0YXJ0ZXIuY29uZj0iJEdST09WWV9DT05GIiBcCisgICAgICAgICAgICAgICAgLURncm9vdnkuaG9tZT0iJEdST09WWV9IT01FIiBcCisgICAgICAgICAgICAgICAgLUR0b29scy5qYXI9IiRUT09MU19KQVIiIFwKKyAgICAgICAgICAgICAgICAkU1RBUlRFUl9NQUlOX0NMQVNTIFwKKyAgICAgICAgICAgICAgICAtLW1haW4gJENMQVNTIFwKKyAgICAgICAgICAgICAgICAtLWNvbmYgIiRHUk9PVllfQ09ORiIgXAorICAgICAgICAgICAgICAgIC0tY2xhc3NwYXRoICIkQ1AiIFwKKyAgICAgICAgICAgICAgICAiJEAiCisgICAgICAgIGZpCisgICAgfSAgICAKK2ZpCisKK1NUQVJURVJfTUFJTl9DTEFTUz1vcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLkdyb292eVN0YXJ0ZXIKKworbGF0ZUluaXQKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvYmluL3N0YXJ0R3Jvb3Z5LmJhdCBiL2dyb292eS9zcmMvYmluL3N0YXJ0R3Jvb3Z5LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGM1YzBjCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9iaW4vc3RhcnRHcm9vdnkuYmF0CkBAIC0wLDAgKzEsMTM0IEBACitAaWYgIiVERUJVRyUiID09ICIiIEBlY2hvIG9mZgorQHJlbSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworQHJlbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIworQHJlbSAgR3Jvb3Z5IEpWTSBCb290c3RyYXAgZm9yIFdpbmRvd3ogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIworQHJlbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIworQHJlbSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitAcmVtIAorQHJlbSAkUmV2aXNpb24kICREYXRlJAorQHJlbSAKKworQHJlbSBTZXQgbG9jYWwgc2NvcGUgZm9yIHRoZSB2YXJpYWJsZXMgd2l0aCB3aW5kb3dzIE5UIHNoZWxsCitpZiAiJU9TJSI9PSJXaW5kb3dzX05UIiBzZXRsb2NhbAorCitzZXQgRElSTkFNRT0lfjEKK3NoaWZ0CisKK3NldCBDTEFTUz0lfjEKK3NoaWZ0CisKK2lmIGV4aXN0ICIlVVNFUlBST0ZJTEUlLy5ncm9vdnkvcHJlaW5pdC5iYXQiIGNhbGwgIiVVU0VSUFJPRklMRSUvLmdyb292eS9wcmVpbml0LmJhdCIKKworQHJlbSBEZXRlcm1pbmUgdGhlIGNvbW1hbmQgaW50ZXJwcmV0ZXIgdG8gZXhlY3V0ZSB0aGUgIkNEIiBsYXRlcgorc2V0IENPTU1BTkRfQ09NPSJjbWQuZXhlIgoraWYgZXhpc3QgIiVTeXN0ZW1Sb290JVxzeXN0ZW0zMlxjbWQuZXhlIiBzZXQgQ09NTUFORF9DT009IiVTeXN0ZW1Sb290JVxzeXN0ZW0zMlxjbWQuZXhlIgoraWYgZXhpc3QgIiVTeXN0ZW1Sb290JVxjb21tYW5kLmNvbSIgc2V0IENPTU1BTkRfQ09NPSIlU3lzdGVtUm9vdCVcY29tbWFuZC5jb20iCisKK0ByZW0gVXNlIGV4cGxpY2l0IGZpbmQuZXhlIHRvIHByZXZlbnQgY3lnd2luIGFuZCBvdGhlcnMgZmluZC5leGUgZnJvbSBiZWluZyB1c2VkCitzZXQgRklORF9FWEU9ImZpbmQuZXhlIgoraWYgZXhpc3QgIiVTeXN0ZW1Sb290JVxzeXN0ZW0zMlxmaW5kLmV4ZSIgc2V0IEZJTkRfRVhFPSIlU3lzdGVtUm9vdCVcc3lzdGVtMzJcZmluZC5leGUiCitpZiBleGlzdCAiJVN5c3RlbVJvb3QlXGNvbW1hbmRcZmluZC5leGUiIHNldCBGSU5EX0VYRT0iJVN5c3RlbVJvb3QlXGNvbW1hbmRcZmluZC5leGUiCisKKzpjaGVja19KQVZBX0hPTUUKK0ByZW0gTWFrZSBzdXJlIHdlIGhhdmUgYSB2YWxpZCBKQVZBX0hPTUUKK2lmIG5vdCAiJUpBVkFfSE9NRSUiID09ICIiIGdvdG8gaGF2ZV9KQVZBX0hPTUUKKworZWNoby4KK2VjaG8gRVJST1I6IEVudmlyb25tZW50IHZhcmlhYmxlIEpBVkFfSE9NRSBoYXMgbm90IGJlZW4gc2V0LgorZWNoby4KK2VjaG8gUGxlYXNlIHNldCB0aGUgSkFWQV9IT01FIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gbWF0Y2ggdGhlCitlY2hvIGxvY2F0aW9uIG9mIHlvdXIgSmF2YSBpbnN0YWxsYXRpb24uCitlY2hvLgorZ290byBlbmQKKworOmhhdmVfSkFWQV9IT01FCitAcmVtIFZhbGlkYXRlIEpBVkFfSE9NRQorJUNPTU1BTkRfQ09NJSAvQyBESVIgIiVKQVZBX0hPTUUlIiAyPiYxIHwgJUZJTkRfRVhFJSAvSSAvQyAiJUpBVkFfSE9NRSUiID5udWwKK2lmIG5vdCBlcnJvcmxldmVsIDEgZ290byBjaGVja19HUk9PVllfSE9NRQorCitlY2hvLgorZWNobyBFUlJPUjogSkFWQV9IT01FIGlzIHNldCB0byBhbiBpbnZhbGlkIGRpcmVjdG9yeTogJUpBVkFfSE9NRSUKK2VjaG8uCitlY2hvIFBsZWFzZSBzZXQgdGhlIEpBVkFfSE9NRSB2YXJpYWJsZSBpbiB5b3VyIGVudmlyb25tZW50IHRvIG1hdGNoIHRoZQorZWNobyBsb2NhdGlvbiBvZiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLgorZWNoby4KK2dvdG8gZW5kCisKKzpjaGVja19HUk9PVllfSE9NRQorQHJlbSBEZWZpbmUgR1JPT1ZZX0hPTUUgaWYgbm90IHNldAoraWYgIiVHUk9PVllfSE9NRSUiID09ICIiIHNldCBHUk9PVllfSE9NRT0lRElSTkFNRSUuLgorCitAcmVtIGNsYXNzcGF0aCBoYW5kbGluZworc2V0IENQPQoraWYgInglfjEiID09ICJ4LWNwIiBzZXQgQ1A9JX4yCitpZiAieCV+MSIgPT0gIngtY2xhc3NwYXRoIiBzZXQgQ1A9JX4yCitpZiAieCIgPT0gInglQ1AlIiBnb3RvIGluaXQKK3NoaWZ0IAorc2hpZnQKKyAKKzppbml0CitAcmVtIGdldCBuYW1lIG9mIHNjcmlwdCB0byBsYXVuY2ggd2l0aCBmdWxsIHBhdGgKK3NldCBHUk9PVllfU0NSSVBUX05BTUU9JX5mMQorQHJlbSBHZXQgY29tbWFuZC1saW5lIGFyZ3VtZW50cywgaGFuZGxpbmcgV2luZG93eiB2YXJpYW50cworaWYgbm90ICIlT1MlIiA9PSAiV2luZG93c19OVCIgZ290byB3aW45eE1FX2FyZ3MKK2lmICIlZXZhbFsyKzJdIiA9PSAiNCIgZ290byA0TlRfYXJncworCis6d2luOXhNRV9hcmdzCitAcmVtIFNsdXJwIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzLiAgCitzZXQgQ01EX0xJTkVfQVJHUz0KKworOndpbjl4TUVfYXJnc19zbHVycAoraWYgInglfjEiID09ICJ4IiBnb3RvIGV4ZWN1dGUKK3NldCBDTURfTElORV9BUkdTPSVDTURfTElORV9BUkdTJSAlMQorc2hpZnQKK2dvdG8gd2luOXhNRV9hcmdzX3NsdXJwCisKKzo0TlRfYXJncworQHJlbSBHZXQgYXJndW1lbnRzIGZyb20gdGhlIDROVCBTaGVsbCBmcm9tIEpQIFNvZnR3YXJlCitzZXQgQ01EX0xJTkVfQVJHUz0lJAorCis6ZXhlY3V0ZQorQHJlbSBTZXR1cCB0aGUgY29tbWFuZCBsaW5lCitzZXQgU1RBUlRFUl9DTEFTU1BBVEg9JUdST09WWV9IT01FJVxsaWJcQEdST09WWUpBUkAKKworaWYgZXhpc3QgIiVVU0VSUFJPRklMRSUvLmdyb292eS9pbml0LmJhdCIgY2FsbCAiJVVTRVJQUk9GSUxFJS8uZ3Jvb3Z5L2luaXQuYmF0IgorCitAcmVtIFNldHRpbmcgYSBjbGFzc3BhdGggdXNpbmcgdGhlIC1jcCBvciAtY2xhc3NwYXRoIG9wdGlvbiBtZWFucyBub3QgdG8gdXNlCitAcmVtIHRoZSBnbG9iYWwgY2xhc3NwYXRoLiBHcm9vdnkgYmVoYXZlcyB0aGVuIHRoZSBzYW1lIGFzIHRoZSBqYXZhIAorQHJlbSBpbnRlcnByZXRlcgoraWYgIngiID09ICJ4JUNQJSIgZ290byBlbXB0eV9jcAorOm5vbl9lbXB0eV9jcAorc2V0IENQPSVDUCU7LgorZ290byBhZnRlcl9jcAorOmVtcHR5X2NwCitzZXQgQ1A9LgoraWYgIngiID09ICJ4JUNMQVNTUEFUSCUiIGdvdG8gYWZ0ZXJfY3AKK3NldCBTVEFSVEVSX0NMQVNTUEFUSD0lU1RBUlRFUl9DTEFTU1BBVEglOyVDTEFTU1BBVEglCis6YWZ0ZXJfY3AKKworc2V0IFNUQVJURVJfTUFJTl9DTEFTUz1vcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLkdyb292eVN0YXJ0ZXIKK3NldCBTVEFSVEVSX0NPTkY9JUdST09WWV9IT01FJVxjb25mXGdyb292eS1zdGFydGVyLmNvbmYKKworc2V0IEpBVkFfRVhFPSVKQVZBX0hPTUUlXGJpblxqYXZhLmV4ZQorc2V0IFRPT0xTX0pBUj0lSkFWQV9IT01FJVxsaWJcdG9vbHMuamFyCisKK2lmICIlSkFWQV9PUFRTJSIgPT0gIiIgc2V0IEpBVkFfT1BUUz0iLVhteDEyOG0iCitzZXQgSkFWQV9PUFRTPSVKQVZBX09QVFMlIC1EcHJvZ3JhbS5uYW1lPSIlUFJPR05BTUUlIgorc2V0IEpBVkFfT1BUUz0lSkFWQV9PUFRTJSAtRGdyb292eS5ob21lPSIlR1JPT1ZZX0hPTUUlIgorc2V0IEpBVkFfT1BUUz0lSkFWQV9PUFRTJSAtRHRvb2xzLmphcj0iJVRPT0xTX0pBUiUiCitzZXQgSkFWQV9PUFRTPSVKQVZBX09QVFMlIC1EZ3Jvb3Z5LnN0YXJ0ZXIuY29uZj0iJVNUQVJURVJfQ09ORiUiCitzZXQgSkFWQV9PUFRTPSVKQVZBX09QVFMlIC1Ec2NyaXB0Lm5hbWU9IiVHUk9PVllfU0NSSVBUX05BTUUlIgorCitpZiBleGlzdCAiJVVTRVJQUk9GSUxFJS8uZ3Jvb3Z5L3Bvc3Rpbml0LmJhdCIgY2FsbCAiJVVTRVJQUk9GSUxFJS8uZ3Jvb3Z5L3Bvc3Rpbml0LmJhdCIKKworQHJlbSBFeGVjdXRlIEdyb292eQorIiVKQVZBX0VYRSUiICVKQVZBX09QVFMlIC1jbGFzc3BhdGggIiVTVEFSVEVSX0NMQVNTUEFUSCUiICVTVEFSVEVSX01BSU5fQ0xBU1MlIC0tbWFpbiAlQ0xBU1MlIC0tY29uZiAiJVNUQVJURVJfQ09ORiUiIC0tY2xhc3NwYXRoICIlQ1AlIiAlQ01EX0xJTkVfQVJHUyUKKworOmVuZAorQHJlbSBFbmQgbG9jYWwgc2NvcGUgZm9yIHRoZSB2YXJpYWJsZXMgd2l0aCB3aW5kb3dzIE5UIHNoZWxsCitpZiAiJU9TJSI9PSJXaW5kb3dzX05UIiBlbmRsb2NhbAorCitAcmVtIE9wdGlvbmFsIHBhdXNlIHRoZSBiYXRjaCBmaWxlCitpZiAiJUdST09WWV9CQVRDSF9QQVVTRSUiID09ICJvbiIgcGF1c2UKKwpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9jb25mL2dyb292eS1zdGFydGVyLmNvbmYgYi9ncm9vdnkvc3JjL2NvbmYvZ3Jvb3Z5LXN0YXJ0ZXIuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzJhYjU5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9jb25mL2dyb292eS1zdGFydGVyLmNvbmYKQEAgLTAsMCArMSwyMyBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMKKyMjICBHcm9vdnkgQ2xhc3Nsb2FkaW5nIENvbmZpZ3VyYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIworIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyMKKyMjICRSZXZpc2lvbiQgJERhdGUkCisjIworIyMgTm90ZTogZG8gbm90IGFkZCBjbGFzc2VzIGZyb20gamF2YS5sYW5nIGhlcmUuIE5vIHJ0LmphciBhbmQgb24gc29tZQorIyMgICAgICAgcGxhdGZvcm1zIG5vIHRvb2xzLmphcgorIyMKKyMjIFNlZSBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy9hcGkvb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9Mb2FkZXJDb25maWd1cmF0aW9uLmh0bWwKKyMjIGZvciB0aGUgZmlsZSBmb3JtYXQKKworICAgICMgbG9hZCByZXF1aXJlZCBsaWJyYXJpZXMKKyAgICBsb2FkICF7Z3Jvb3Z5LmhvbWV9L2xpYi8qLmphcgorCisgICAgIyBsb2FkIHVzZXIgc3BlY2lmaWMgbGlicmFyaWVzCisgICAgbG9hZCAhe3VzZXIuaG9tZX0vLmdyb292eS9saWIvKi5qYXIKKyAgICAKKyAgICAjIHRvb2xzLmphciBmb3IgYW50IHRhc2tzCisgICAgbG9hZCAke3Rvb2xzLmphcn0KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvZXhhbXBsZXMvY29tbWFuZExpbmVUb29scy9BbnRNYXAuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy9leGFtcGxlcy9jb21tYW5kTGluZVRvb2xzL0FudE1hcC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRjYzAyZgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvZXhhbXBsZXMvY29tbWFuZExpbmVUb29scy9BbnRNYXAuZ3Jvb3Z5CkBAIC0wLDAgKzEsNjcgQEAKKyMhL2Jpbi9lbnYgZ3Jvb3Z5CisvLyAKKy8vIGNvbnZlcnQgYW4gYW50IGJ1aWxkIGZpbGUgaW50byBhIGZvcm1hdCBzdWl0YWJsZSBmb3IgaHR0cDovL3NmLm5ldC9wcm9qZWN0cy9mcmVlbWluZAorLy8KKy8vIGJ5IEplcmVteSBSYXluZXIgLSAyIERlYyAyMDA0CisvLyBpbnNwaXJlZCBieSBTYW0gTmV3bWFuICggaHR0cDovL3d3dy5tYWdwaWVicmFpbi5jb20vYXJjaGl2ZXMvMjAwNC8xMi8wMi9hbnRndWkgKQorLy8KKy8vIHVzYWdlOiAgIGdyb292eSBBbnRNYXAgPiBidWlsZC5tbQorCitpbXBvcnQgZ3Jvb3Z5LnV0aWwuWG1sUGFyc2VyCisKK2J1aWxkRmlsZU5hbWUgPSAiYnVpbGQueG1sIiAgLy8gZGVmYXVsdAorCisvLyBoYW5kbGUgY29tbWFuZCBsaW5lIHBhcmFtcworaWYgKGFyZ3MubGVuZ3RoID4gMCkgeworCWJ1aWxkRmlsZU5hbWUgPSBhcmdzWzBdCit9CisKKy8vIGhlYWRlcgorcHJpbnRsbiAiPG1hcCB2ZXJzaW9uPScwLjcuMSc+IgorcHJvamVjdCA9IG5ldyBYbWxQYXJzZXIoKS5wYXJzZShidWlsZEZpbGVOYW1lKQorbmFtZSA9IHByb2plY3RbJ0BuYW1lJ10KK3ByaW50bG4gIjxub2RlIFRFWFQ9JyR7bmFtZX0nPiIKK2xldmVsID0gMAorCitwcmludENoaWxkcmVuKHByb2plY3QsbGV2ZWwpCisKKworCitkZWYgdm9pZCBwcmludENoaWxkcmVuKG5vZGUsbGV2ZWwpIHsKKwlsZXZlbCsrCisJbm9kZS5lYWNoIHsKKwkJbmFtZSA9IGh1bnRGb3JOYW1lKGl0KQorCQlpZiAobmFtZSAhPSBudWxsKSB7CisJCQlpZiAobGV2ZWwgPiAxKSB7CisJCQkJcHJpbnRsbiAiPG5vZGUgVEVYVD0nJHtuYW1lfScgUE9TSVRJT049J3JpZ2h0Jz4iCisJCQl9IGVsc2UgaWYgKGl0Lm5hbWUoKSA9PSAncHJvcGVydHknIHx8IGl0Lm5hbWUoKSA9PSAncGF0aCcgKSB7CisJCQkJaWYgKGl0LmNoaWxkcmVuKCkuc2l6ZSgpID4gMCkgeworCQkJCQlwcmludGxuICI8bm9kZSBURVhUPScke25hbWV9JyBQT1NJVElPTj0nbGVmdCcgRk9MREVEPSd0cnVlJz4iCisJCQkJfSBlbHNlIHsKKwkJCQkJcHJpbnRsbiAiPG5vZGUgVEVYVD0nJHtuYW1lfScgUE9TSVRJT049J2xlZnQnPiIKKwkJCQl9CisJCQl9IGVsc2UgaWYgKGl0LmNoaWxkcmVuKCkuc2l6ZSgpID4gMCkgeworCQkJCXByaW50bG4gIjxub2RlIFRFWFQ9JyR7bmFtZX0nIFBPU0lUSU9OPSdyaWdodCcgRk9MREVEPSd0cnVlJz4iCisJCQl9IGVsc2UgeworCQkJCXByaW50bG4gIjxub2RlIFRFWFQ9JyR7bmFtZX0nIFBPU0lUSU9OPSdyaWdodCc+IgorCQkJfQorCQl9CisJCWlmIChpdC5jaGlsZHJlbigpLnNpemUoKSA+IDApIHByaW50Q2hpbGRyZW4oaXQsbGV2ZWwpCisJCWlmIChuYW1lIT1udWxsKQlwcmludGxuICI8L25vZGU+IgorCX0KK30KKworLy8gZm9vdGVyCitwcmludGxuICI8L25vZGU+PC9tYXA+IgorCisKK2RlZiBTdHJpbmcgaHVudEZvck5hbWUobm9kZSkgeworCXByZWZlck5vZGVOYW1lcyA9IFsianVuaXRyZXBvcnQiXQorCWlmIChub2RlID09IG51bGwpIHJldHVybiBudWxsCisJaWYgKHByZWZlck5vZGVOYW1lcy5jb250YWlucyhub2RlLm5hbWUoKSkpIHJldHVybiBub2RlLm5hbWUoKQorCWlmIChub2RlWydAbmFtZSddICE9IG51bGwpIHJldHVybiBub2RlWydAbmFtZSddCisJaWYgKG5vZGVbJ0B0b2RpciddICE9IG51bGwpIHJldHVybiBub2RlWydAdG9kaXInXQorCWlmIChub2RlWydAZGlyJ10gIT0gbnVsbCkgcmV0dXJuIG5vZGVbJ0BkaXInXQorCWlmIChub2RlWydAcmVmaWQnXSAhPSBudWxsKSByZXR1cm4gbm9kZVsnQHJlZmlkJ10KKwlyZXR1cm4gbm9kZS5uYW1lKCkKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvZXhhbXBsZXMvY29tbWFuZExpbmVUb29scy9CaWdUZXN0cy5ncm9vdnkgYi9ncm9vdnkvc3JjL2V4YW1wbGVzL2NvbW1hbmRMaW5lVG9vbHMvQmlnVGVzdHMuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzN2M5NDMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL2V4YW1wbGVzL2NvbW1hbmRMaW5lVG9vbHMvQmlnVGVzdHMuZ3Jvb3Z5CkBAIC0wLDAgKzEsMzYgQEAKKyMhL2Jpbi9lbnYgZ3Jvb3Z5CisvLyAKKy8vIG91dHB1dCB0ZXN0cyBpbiBhIGp1bml0IHhtbCByZXBvcnQgdGhhdCB0b29rIGdyZWF0ZXIgdGhhbiBzcGVjaWZpZWQgdGltZQorLy8KKy8vIGJ5IEplcmVteSBSYXluZXIgLSAxNSBEZWMgMjAwNAorLy8KKy8vIHVzYWdlOiAgIGdyb292eSBCaWdUZXN0cy5ncm9vdnkgPFRFU1QueG1sPiA8dGltZSBpbiBzZWNzPgorCitpbXBvcnQgZ3Jvb3Z5LnV0aWwuWG1sUGFyc2VyCitpbXBvcnQgamF2YS5pby5GaWxlCisKK2ZpbGVOYW1lID0gIiIgIC8vIGRlZmF1bHQKK3RpbWVDdXRPZmYgPSBuZXcgRmxvYXQoIjEuMCIpCisKK2lmIChhcmdzLmxlbmd0aCA+IDEpIHsKKwlmaWxlTmFtZSA9IGFyZ3NbMF0KKyAgICAgICAgdGltZUN1dE9mZiA9IG5ldyBGbG9hdChhcmdzWzFdKQorfSBlbHNlIHsKKyAgICBwcmludGxuICJ1c2FnZTogZ3Jvb3Z5IEJpZ1Rlc3RzLmdyb292eSA8VEVTVC54bWw+IDx0aW1lIGluIHNlY3M+IgorfQorCit0ZXN0U3VpdGUgPSBuZXcgWG1sUGFyc2VyKCkucGFyc2UoZmlsZU5hbWUpCituYW1lID0gdGVzdFN1aXRlWydAbmFtZSddCitwcmludGxuICJUZXN0U3VpdGU6ICR7bmFtZX0iCitiaWdUZXN0cyA9IFs6XQordGVzdFN1aXRlLmVhY2ggeworICAgIGlmICgidGVzdGNhc2UiID09IGl0Lm5hbWUoKSkgeworICAgICAgICBjbGFzc25hbWUgPSBpdFsnQGNsYXNzbmFtZSddCisgICAgICAgIG5hbWUgPSBpdFsnQG5hbWUnXQorICAgICAgICB0aW1lID0gbmV3IEZsb2F0KGl0WydAdGltZSddKQorICAgICAgICBpZiAodGltZSA+IHRpbWVDdXRPZmYpIHsKKyAgICAgICAgICAgIHByaW50bG4gIiAgJHt0aW1lfSAtICR7Y2xhc3NuYW1lfS4ke25hbWV9KCkiCisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvZXhhbXBsZXMvY29tbWFuZExpbmVUb29scy9MaXN0RmlsZXMuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy9leGFtcGxlcy9jb21tYW5kTGluZVRvb2xzL0xpc3RGaWxlcy5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI5YTk4MQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvZXhhbXBsZXMvY29tbWFuZExpbmVUb29scy9MaXN0RmlsZXMuZ3Jvb3Z5CkBAIC0wLDAgKzEsMjcgQEAKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzCisKK3B1YmxpYyBjbGFzcyBMaXN0RmlsZXNNYW51YWxUZXN0IHsgCisKKyAgICBzdGF0aWMgdm9pZCBtYWluKGFyZ3MpIHsKKyAgICAgICAgcHJpbnRsbigiQ2FsbGVkIG1haW4gd2l0aCAke2FyZ3N9IikKKyAgICAgICAgbGlzdEZpbGVzKEFycmF5cy5hc0xpc3QoYXJncykpCisgICAgfQorICAgIAorICAgIHN0YXRpYyBTdHJpbmcgZ2V0UGF0aChmaWxlKSB7CisgICAgICAgIHJldHVybiBmaWxlLmFic29sdXRlUGF0aAorICAgIH0KKworICAgIHN0YXRpYyB2b2lkIGxpc3RGaWxlcyhkaXJzKSB7CisgICAgICAgIHByaW50bG4oImNhbGxlZCB3aXRoICR7ZGlyc30iKQorICAgICAgICAKKyAgICAgICAgZm9yKGRpciBpbiBkaXJzKSB7CisgICAgICAgICAgICBwcmludGxuKCJkaXI6ICR7ZGlyfSIpCisgICAgICAgICAgICAKKwkgICAgICAgIGRlZiBmaWxlcyA9IG5ldyBqYXZhLmlvLkZpbGUoZGlyKS5saXN0RmlsZXMoKQorCisgICAgCSAgICBmb3IgKGYgaW4gZmlsZXMpIHsKKyAgICAgICAgCSAgICBwcmludGxuKGdldFBhdGgoZikpCisgICAgICAgIAl9IAorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvZXhhbXBsZXMvY29tbWFuZExpbmVUb29scy9SZWZsZWN0aW9ucy5ncm9vdnkgYi9ncm9vdnkvc3JjL2V4YW1wbGVzL2NvbW1hbmRMaW5lVG9vbHMvUmVmbGVjdGlvbnMuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZWVlZjkKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL2V4YW1wbGVzL2NvbW1hbmRMaW5lVG9vbHMvUmVmbGVjdGlvbnMuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTggQEAKKy8qKgorICogRWNob2VzIGJhY2sgd2hhdGV2ZXIgaXMgdGhyb3duIGF0IGl0ICh3aXRoIGEgPGJyPiBhdCBlbmQgZm9yIGJyb3dzZXJzKSAuLi4KKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmplcmVteS5yYXluZXJAZ21haWwuY29tIj5KZXJlbXkgUmF5bmVyPC9hPgorICogCisgKiBpbnZva2UgdXNpbmcKKyAqICAgIGdyb292eSAtbCA4MCBSZWZsZWN0aW9ucy5ncm9vdnkKKyAqIAorICogICAgICAgKHdoZXJlIDgwIGlzIHRoZSBwb3J0IHRvIGxpc3RlbiBmb3IgcmVxdWVzdHMgdXBvbikKKyAqLworCisvLyBlY2hvLCBlY2hvLCBlY2hvLi4uCitwcmludGxuICIke2xpbmV9IDxicj4iCisKKy8vYXNzdW1lIG5vIGlucHV0IG1lYW5zIHdlJ3ZlIGZpbmlzaGVkLi4uCitpZiAobGluZSA9PSAiIikgeworICAgIC8vIGNsZWFuIHVwIGdyYWNlZnVsbHksIGNsb3Npbmcgc29ja2V0cyBldGMKKyAgICByZXR1cm4gInN1Y2Nlc3MiCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL2V4YW1wbGVzL2NvbW1hbmRMaW5lVG9vbHMvU2ltcGxlV2ViU2VydmVyLmdyb292eSBiL2dyb292eS9zcmMvZXhhbXBsZXMvY29tbWFuZExpbmVUb29scy9TaW1wbGVXZWJTZXJ2ZXIuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MTUxMDgKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL2V4YW1wbGVzL2NvbW1hbmRMaW5lVG9vbHMvU2ltcGxlV2ViU2VydmVyLmdyb292eQpAQCAtMCwwICsxLDc0IEBACisvKioKKyAqIFNpbXBsZSB3ZWIgc2VydmVyCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqZXJlbXkucmF5bmVyQGdtYWlsLmNvbSI+SmVyZW15IFJheW5lcjwvYT4KKyAqIAorICogaW52b2tlIHVzaW5nCisgKiAgICBncm9vdnkgLWwgODAgU2ltcGxlV2ViU2VydmVyLmdyb292eQorICogCisgKiAgICAgICAod2hlcmUgODAgaXMgdGhlIHBvcnQgdG8gbGlzdGVuIGZvciByZXF1ZXN0cyB1cG9uKQorICovCitpbXBvcnQgamF2YS5pby5GaWxlCisKK2lmIChpbml0KSB7IAorICAgIGhlYWRlcnMgPSBbOl0gCisgICAgYmluYXJ5VHlwZXMgPSBbImdpZiIsImpwZyIsInBuZyJdICAgICAgICAgIAorICAgIG1pbWVUeXBlcyA9IFsKKyAgICAgICAgImNzcyIgOiAidGV4dC9jc3MiLCAgICAgICAgIAorICAgICAgICAiZ2lmIiA6ICJpbWFnZS9naWYiLAorICAgICAgICAiaHRtIiA6ICJ0ZXh0L2h0bWwiLCAgICAgICAgIAorICAgICAgICAiaHRtbCI6ICJ0ZXh0L2h0bWwiLCAgICAgICAgIAorICAgICAgICAianBnIiA6ICJpbWFnZS9qcGVnIiwgICAgICAgICAKKyAgICAgICAgInBuZyIgOiAiaW1hZ2UvcG5nIgorICAgIF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK30KKworLy8gcGFyc2UgdGhlIHJlcXVlc3QKK2lmIChsaW5lLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgiZ2V0IikpIHsKKyAgICBjb250ZW50ID0gbGluZS50b2tlbml6ZSgpWzFdCit9IGVsc2UgeworICAgIGggPSBsaW5lLnRva2VuaXplKCI6IikKKyAgICBoZWFkZXJzW2hbMF1dID0gaFsxXQorfQorCisvLyBhbGwgZG9uZSwgbm93IHByb2Nlc3MgcmVxdWVzdAoraWYgKGxpbmUuc2l6ZSgpID09IDApIHsKKyAgICBwcm9jZXNzUmVxdWVzdCgpCisgICAgcmV0dXJuICJzdWNjZXNzIgorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZGVmIHByb2Nlc3NSZXF1ZXN0KCkgeworICAgIGlmIChjb250ZW50LmluZGV4T2YoIi4uIikgPCAwKSB7IC8vc2ltcGxpc3RpYyBzZWN1cml0eQorICAgICAgICAvLyBzaW1wbGUgZmlsZSBicm93c2VyIHJvb3RlZCBmcm9tIGN1cnJlbnQgZGlyCisgICAgICAgIGYgPSBuZXcgRmlsZSgiLiIgKyBjb250ZW50KQorICAgICAgICBpZiAoZi5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICBwcmludERpcmVjdG9yeUxpc3RpbmcoZikKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGV4dGVuc2lvbiA9IGNvbnRlbnQuc3Vic3RyaW5nKGNvbnRlbnQubGFzdEluZGV4T2YoIi4iKSArIDEpCisgICAgICAgICAgICBwcmludEhlYWRlcnMobWltZVR5cGVzLmdldChleHRlbnNpb24sInRleHQvcGxhaW4iKSkgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoYmluYXJ5VHlwZXMuY29udGFpbnMoZXh0ZW5zaW9uKSkgeworICAgICAgICAgICAgICAgIHNvY2tldC5vdXRwdXRTdHJlYW0ud3JpdGUoZi5yZWFkQnl0ZXMoKSkKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJpbnRsbihmLnRleHQpCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK2RlZiBwcmludERpcmVjdG9yeUxpc3RpbmcoZikgeworICAgIHByaW50SGVhZGVycygidGV4dC9odG1sIikgICAgICAgICAgCisgICAgcHJpbnRsbiAiPGh0bWw+PGhlYWQ+PC9oZWFkPjxib2R5PiIKKyAgICBmb3IgKGkgaW4gZi5saXN0KCkudG9MaXN0KCkuc29ydCgpKSB7CisgICAgICAgIGlmICgiLyIgPT0gY29udGVudCkgeyBjb250ZW50ID0gIiIgfSAvLyBzcGVjaWFsIGNhc2UgZm9yIHJvb3QgZG9jdW1lbnQKKyAgICAgICAgcHJpbnRsbiAiPGEgaHJlZj0nJHtjb250ZW50fS8ke2l9Jz4ke2l9PC9hPjxicj4iCisgICAgfQorICAgIHByaW50bG4gIjwvYm9keT48L2h0bWw+IgorfQorCitkZWYgcHJpbnRIZWFkZXJzKG1pbWVUeXBlKSB7CisgICAgcHJpbnRsbiAiSFRUUC8xLjAgMjAwIE9LIgorICAgIHByaW50bG4gIkNvbnRlbnQtVHlwZTogJHttaW1lVHlwZX0iCisgICAgcHJpbnRsbiAiIiAgICAgICAgICAKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvZXhhbXBsZXMvY29uc29sZS9Nb3J0Z2FnZUNhbGN1bGF0b3IuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy9leGFtcGxlcy9jb25zb2xlL01vcnRnYWdlQ2FsY3VsYXRvci5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBjNjljNgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvZXhhbXBsZXMvY29uc29sZS9Nb3J0Z2FnZUNhbGN1bGF0b3IuZ3Jvb3Z5CkBAIC0wLDAgKzEsNzcgQEAKKy8qKiAKKyAqIE1vcnRnYWdlIENhbGN1bGF0b3IKKyAqIEBhdXRob3I6IEplcmVteSBSYXluZXIKKyAqIGJhc2VkIG9uIGFsZ29yaXRobXMgYnkgSmVmZiBMb3VpZSwgRHIgVyBDYXJsaW5pIGFuZCBOZXd0b24KKyAqLworCitwcmludGxuICJfXy4uOjp+ficnJ35+OjouLl9fIgorcHJpbnRsbiAiTW9ydGdhZ2UgQ2FsY3VsYXRvciIKK3ByaW50bG4gIn5+fn5+fn5+fn5+fn5+fn5+fn4iCitwcmludGxuICJQbGVhc2UgaW5wdXQgMyBvZiB0aGUgNCB2YWx1ZXMgaW4geW91ciBtb3J0Z2FnZSBjYWxjdWxhdGlvbiIKK3ByaW50bG4gIlRoaXMgcHJvZ3JhbSB3aWxsIHRoZW4gY2FsY3VsYXRlIHRoZSB2YWx1ZSB5b3UgbGVhdmUgYmxhbmsiCitwcmludGxuICIiCisKK2RlZiB2YXJpYWJsZXMgPSBbCisgICAgIkFtb3VudCBvZiBtb3J0Z2FnZSIgOiAwLjAsIAorICAgICJBbm51YWwgaW50ZXJlc3QgcmF0ZSAoJSkiIDogMC4wLCAKKyAgICAiTG9hbiBkdXJhdGlvbiAobW9udGhzKSIgOiAwLjAsIAorICAgICJNb250aGx5IHBheW1lbnRzIiA6IDAuMAorXQorCitmb3IgKGVudHJ5IGluIHZhcmlhYmxlcy5lbnRyeVNldCgpKSB7CisgICAgcHJpbnQoIiR7ZW50cnkua2V5fToiKQorICAgIGRlZiB1c2VySW5wdXQgPSBTeXN0ZW0uaW4ucmVhZExpbmUoKQorICAgIGlmICgiIiA9PSB1c2VySW5wdXQpIHsKKyAgICAgICAgdmFsdWVUb0NhbGN1bGF0ZSA9IGVudHJ5LmtleQorICAgIH0gZWxzZSB7CisgICAgICAgIGVudHJ5LnZhbHVlID0gdXNlcklucHV0LnRvRG91YmxlKCkKKyAgICB9Cit9CisKK3ByaW50bG4gIiR2YWx1ZVRvQ2FsY3VsYXRlID0gJHtjYWxjdWxhdGVWYWx1ZU9mKHZhbHVlVG9DYWxjdWxhdGUpfSIKKworCisKKworCitkZWYgY2FsY3VsYXRlVmFsdWVPZih2YWx1ZVRvQ2FsY3VsYXRlKSB7CisgICAgZGVmIHJlc3VsdCA9IDAKKyAgICBkZWYgcHJpbmNpcGFsID0gdmFyaWFibGVzWyJBbW91bnQgb2YgbW9ydGdhZ2UiXQorICAgIGRlZiBpbnRlcmVzdCA9IHZhcmlhYmxlc1siQW5udWFsIGludGVyZXN0IHJhdGUgKCUpIl0gLyAxMjAwCisgICAgZGVmIG1vbnRocyA9IHZhcmlhYmxlc1siTG9hbiBkdXJhdGlvbiAobW9udGhzKSJdCisgICAgZGVmIHBheW1lbnQgPSB2YXJpYWJsZXNbIk1vbnRobHkgcGF5bWVudHMiXQorCisgICAgc3dpdGNoICh2YWx1ZVRvQ2FsY3VsYXRlKSB7CisgICAgY2FzZSAiQW1vdW50IG9mIG1vcnRnYWdlIjoKKyAgICAgICAgcmVzdWx0ID0gMSArIGludGVyZXN0CisgICAgICAgIHJlc3VsdCA9IDEvTWF0aC5wb3cocmVzdWx0LG1vbnRocykKKyAgICAgICAgcmVzdWx0ID0gKCgxLXJlc3VsdCkvaW50ZXJlc3QpICogcGF5bWVudAorICAgICAgICBicmVhayAgICAgICAgICAgCisgICAgY2FzZSAiTG9hbiBkdXJhdGlvbiAobW9udGhzKSI6CisgICAgICAgIHJlc3VsdCA9ICgxIC0gKHByaW5jaXBhbCAqIGludGVyZXN0IC8gcGF5bWVudCkpCisgICAgICAgIHJlc3VsdCA9IE1hdGgubG9nKHJlc3VsdCkKKyAgICAgICAgcmVzdWx0ID0gLSByZXN1bHQgLyBNYXRoLmxvZygxICsgaW50ZXJlc3QpICAKKyAgICAgICAgYnJlYWsKKyAgICBjYXNlICJNb250aGx5IHBheW1lbnRzIjoKKyAgICAgICAgcmVzdWx0ID0gMSArIGludGVyZXN0CisgICAgICAgIHJlc3VsdCA9IDEgLyBNYXRoLnBvdyhyZXN1bHQsbW9udGhzKQorICAgICAgICByZXN1bHQgPSAocHJpbmNpcGFsICogaW50ZXJlc3QpIC8gKDEgLSByZXN1bHQpCisgICAgICAgIGJyZWFrICAgICAgICAgIAorICAgIGNhc2UgIkFubnVhbCBpbnRlcmVzdCByYXRlICglKSI6CisgICAgICAgIHJlc3VsdCA9IHBheW1lbnQgLyBwcmluY2lwYWwKKyAgICAgICAgZGVmIGRpZmYgPSAxMDA7IGRlZiBhY2N1cmFjeSA9IDAuMDAwMDE7IGRlZiBtYXhJdGVyYXRpb25zID0gMTAwMAorICAgICAgICBkZWYgaW5kZXggPSAwCisgICAgICAgIHdoaWxlICgoZGlmZiA+IGFjY3VyYWN5KSAmJiAoaW5kZXggPCBtYXhJdGVyYXRpb25zKSkgeworICAgICAgICAgICAgZGVmIHRlbXAgPSByZXN1bHQKKyAgICAgICAgICAgIGRlZiBudW1lcmF0b3IgPSAocHJpbmNpcGFsICogdGVtcCAvIHBheW1lbnQpICsgTWF0aC5wb3coKDEgKyB0ZW1wKSwgLW1vbnRocykgLSAxCisgICAgICAgICAgICBkZWYgZGVub21pbmF0b3I9IChwcmluY2lwYWwgLyBwYXltZW50KSAtIG1vbnRocyAqIE1hdGgucG93KCgxICsgdGVtcCksICgtbW9udGhzIC0gMSkpCisgICAgICAgICAgICByZXN1bHQgPSB0ZW1wIC0gKG51bWVyYXRvciAvIGRlbm9taW5hdG9yKQorICAgICAgICAgICAgZGlmZiA9IHJlc3VsdCAtIHRlbXAKKyAgICAgICAgICAgIGRpZmYgPSBNYXRoLmFicyhkaWZmKQorICAgICAgICAgICAgaW5kZXgrKworICAgICAgICB9CisgICAgICAgIHJlc3VsdCAqPSAxMjAwCisgICAgICAgIGJyZWFrICAgICAgICAgICAKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdAorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9leGFtcGxlcy9jb25zb2xlL2tub3dZb3VyVGFibGVzLmdyb292eSBiL2dyb292eS9zcmMvZXhhbXBsZXMvY29uc29sZS9rbm93WW91clRhYmxlcy5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJiYTE1YgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvZXhhbXBsZXMvY29uc29sZS9rbm93WW91clRhYmxlcy5ncm9vdnkKQEAgLTAsMCArMSwxNiBAQAorLyoqIAorICogU2ltcGxlIG1hdGhlbWF0aWNzIHF1aXoKKyAqIEBhdXRob3I6IEplcmVteSBSYXluZXIKKyAqIGJhc2VkIG9uIGFsZ29yaXRobXMgZnJvbSBJTlBVVC9NYXJzaGFsbCBDYXZlbmRpc2gvMTk4NAorICovCit3aGlsZSAodHJ1ZSkgeworICAgIHRyeSB7CisgICAgICAgIGRlZiBuID0gKGludCkoTWF0aC5yYW5kb20oKSAqIDEyKSArIDEKKyAgICAgICAgcHJpbnRsbiAiV2hhdCBpcyAkbiB0aW1lcyA5PyIKKyAgICAgICAgZGVmIGEgPSBTeXN0ZW0uaW4ucmVhZExpbmUoKS50b0ludGVnZXIoKQorICAgICAgICBpZiAoYSA9PSBuICogOSkgcHJpbnRsbiAiQ29ycmVjdCIKKyAgICAgICAgICAgICAgCisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgcHJpbnRsbiAiVGhlIGNvbXB1dGVyIGRpZG4ndCB1bmRlcnN0YW5kIHlvdXIgaW5wdXQiCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9leGFtcGxlcy9jb25zb2xlL3RoaW5rT2ZBTnVtYmVyLmdyb292eSBiL2dyb292eS9zcmMvZXhhbXBsZXMvY29uc29sZS90aGlua09mQU51bWJlci5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYyYzllYwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvZXhhbXBsZXMvY29uc29sZS90aGlua09mQU51bWJlci5ncm9vdnkKQEAgLTAsMCArMSwyMSBAQAorLyoqIAorICogU2ltcGxlIGdhbWUKKyAqIEBhdXRob3I6IEplcmVteSBSYXluZXIKKyAqIGJhc2VkIG9uIGFsZ29yaXRobXMgZnJvbSBJTlBVVC9NYXJzaGFsbCBDYXZlbmRpc2gvMTk4NAorICovCit3aGlsZSAodHJ1ZSkgeworICAgIHRyeSB7CisgICAgICAgIGludCB4ID0gTWF0aC5yYW5kb20oKSAqIDYKKyAgICAgICAgcHJpbnQgIlRoZSBjb21wdXRlciBoYXMgY2hvc2VuIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgNS4gQ2FuIHlvdSBndWVzcyBpdD8iCisgICAgICAgICAgICAgIAorICAgICAgICBkZWYgbGluZSA9IFN5c3RlbS5pbi5yZWFkTGluZSgpCisgICAgICAgIGludCBnID0gbGluZS50b0ludGVnZXIoKQorICAgICAgICBpZiAoZyA9PSB4KSB7CisgICAgICAgICAgIHByaW50bG4gIldlbGwgZG9uZSIgCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgIHByaW50bG4gIlRvdWdoIGx1Y2sgLSB5b3UncmUgd3JvbmciCisgICAgICAgIH0KKyAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgIHByaW50bG4gIlRoZSBjb21wdXRlciBkaWRuJ3QgdW5kZXJzdGFuZCAnJGxpbmUnIgorICAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL2V4YW1wbGVzL2dyb292eS9qMmVlL0NyZWF0ZURhdGEuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy9leGFtcGxlcy9ncm9vdnkvajJlZS9DcmVhdGVEYXRhLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTI3MDQxCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9leGFtcGxlcy9ncm9vdnkvajJlZS9DcmVhdGVEYXRhLmdyb292eQpAQCAtMCwwICsxLDIxIEBACitwcmludGxuKCJDYWxsZWQgd2l0aCBjb250ZXh0OiAiICsgY29udGV4dCkKKworZGIgPSBjb250ZXh0Lmxvb2t1cCgiL2NsaWVudC90b29scy9EYXRhYmFzZUhvbWUiKS5jcmVhdGUoKQorCitwcmludGxuKCJBYm91dCB0byBkbyBxdWVyaWVzIG9uOiAiICsgZGIpIAorCitxdWVyaWVzID0gWyAgIkNSRUFURSBUQUJMRSBhY2NvdW50ICggc3NuIENIQVIoMTEpIFBSSU1BUlkgS0VZLCBmaXJzdF9uYW1lIENIQVIoMjApLCBsYXN0X25hbWUgQ0hBUigyMCksIGJhbGFuY2UgSU5UKSIsCQkJIAorIkNSRUFURSBUQUJMRSBlbnRpdHkgKCBpZCBJTlQgUFJJTUFSWSBLRVkgQVVUTyBJTkNSRU1FTlQsIGZpcnN0X25hbWUgQ0hBUigyMCksIGxhc3RfbmFtZSBDSEFSKDIwKSApIl0KKworZm9yIChzcWwgaW4gcXVlcmllcykgeworICAgIHByaW50bG4oImV2YWx1YXRpbmc6ICIgKyBzcWwpCisJZGIuZXhlY3V0ZShzcWwpCit9CisKK3ByaW50bG4oImNyZWF0aW5nIGVudGl0eSBiZWFuIikKKworY29udGV4dC5sb29rdXAoIi9jbGllbnQvdGVzdHMvZW50aXR5L2JtcC9CYXNpY0JtcEhvbWUiKS5jcmVhdGUoIkdyb292eSBEYWluIikKKworcHJpbnRsbigiRG9uZSIpCisKKyJPSyIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL2V4YW1wbGVzL2dyb292eS9qMmVlL0oyZWVDb25zb2xlLmphdmEgYi9ncm9vdnkvc3JjL2V4YW1wbGVzL2dyb292eS9qMmVlL0oyZWVDb25zb2xlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM4NDFhOQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvZXhhbXBsZXMvZ3Jvb3Z5L2oyZWUvSjJlZUNvbnNvbGUuamF2YQpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAkSWQkCisKKyBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAorIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0CisgICAgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhCisgICAgY29weSBvZiB0aGlzIGRvY3VtZW50LgorCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQorICAgIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKKyAgICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKKyAgICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCisgICAgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCisKKyA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IgorICAgIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQKKyAgICB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgorCisgNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KKyAgICBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMKKyBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKKyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCisgVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICovCisKK3BhY2thZ2UgZ3Jvb3Z5LmoyZWU7CisKK2ltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlPYmplY3Q7CitpbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5U2hlbGw7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLkludm9rZXJIZWxwZXI7CisKK2ltcG9ydCBqYXZheC5uYW1pbmcuQ29udGV4dDsKK2ltcG9ydCBqYXZheC5uYW1pbmcuSW5pdGlhbENvbnRleHQ7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKKy8qKgorICogQSBKMkVFIGNvbnNvbGUKKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgSjJlZUNvbnNvbGUgeworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBpZiAoYXJncy5sZW5ndGggPD0gMCkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZTogaG9tZSBbY29uZmlndWFyYXRpb25dIFtsb2NhbGNvcHldIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgaG9tZSA9IGFyZ3NbMF07CisKKyAgICAgICAgUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJvcGVuZWpiLmhvbWUiLCBob21lKTsKKyAgICAgICAgcC5wdXQoQ29udGV4dC5JTklUSUFMX0NPTlRFWFRfRkFDVE9SWSwgIm9yZy5vcGVuZWpiLmNsaWVudC5Mb2NhbEluaXRpYWxDb250ZXh0RmFjdG9yeSIpOworICAgICAgICBwLnB1dCgib3BlbmVqYi5sb2FkZXIiLCAiZW1iZWQiKTsKKyAgICAgICAgcC5wdXQoIm9wZW5lamIuaG9tZSIsIGhvbWUpOworCisgICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDEpIHsKKyAgICAgICAgICAgIFN0cmluZyBjb25mID0gYXJnc1sxXTsKKyAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgib3BlbmVqYi5jb25maWd1cmF0aW9uIiwgY29uZik7CisgICAgICAgICAgICBwLnB1dCgib3BlbmVqYi5jb25maWd1cmF0aW9uIiwgY29uZik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMikgeworICAgICAgICAgICAgU3RyaW5nIGNvcHkgPSBhcmdzWzJdOworICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJvcGVuZWpiLmxvY2FsY29weSIsIGNvcHkpOworICAgICAgICAgICAgcC5wdXQoIm9wZW5lamIubG9jYWxjb3B5IiwgY29weSk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEluaXRpYWxDb250ZXh0IGN0eCA9IG5ldyBJbml0aWFsQ29udGV4dChwKTsKKworICAgICAgICAgICAgR3Jvb3Z5U2hlbGwgc2hlbGwgPSBuZXcgR3Jvb3Z5U2hlbGwoKTsKKyAgICAgICAgICAgIHNoZWxsLnNldFZhcmlhYmxlKCJjb250ZXh0IiwgY3R4KTsKKyAgICAgICAgICAgIC8vc2hlbGwuZXZhbHVhdGUoInNyYy90ZXN0L2dyb292eS9qMmVlL0NyZWF0ZURhdGEuZ3Jvb3Z5Iik7CisKKyAgICAgICAgICAgIC8vc2hlbGwuZXZhbHVhdGUoInNyYy9tYWluL2dyb292eS91aS9Db25zb2xlLmdyb292eSIpOworICAgICAgICAgICAgR3Jvb3Z5T2JqZWN0IGNvbnNvbGUgPSAoR3Jvb3Z5T2JqZWN0KSBJbnZva2VySGVscGVyLmludm9rZUNvbnN0cnVjdG9yT2YoImdyb292eS51aS5Db25zb2xlIiwgbnVsbCk7CisgICAgICAgICAgICBjb25zb2xlLnNldFByb3BlcnR5KCJzaGVsbCIsIHNoZWxsKTsKKyAgICAgICAgICAgIGNvbnNvbGUuaW52b2tlTWV0aG9kKCJydW4iLCBudWxsKTsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAqLworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDYXVnaHQ6ICIgKyBlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvZXhhbXBsZXMvZ3Jvb3Z5L21vZGVsL012Y0RlbW8uZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy9leGFtcGxlcy9ncm9vdnkvbW9kZWwvTXZjRGVtby5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhiYmU1NwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvZXhhbXBsZXMvZ3Jvb3Z5L21vZGVsL012Y0RlbW8uZ3Jvb3Z5CkBAIC0wLDAgKzEsNDQgQEAKK3BhY2thZ2UgZ3Jvb3Z5Lm1vZGVsCisKK2ltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQKK2ltcG9ydCBqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5CitpbXBvcnQgZ3Jvb3Z5LnN3aW5nLlN3aW5nQnVpbGRlcgorLyoqCisgKiAKKyAqLworY2xhc3MgTXZjRGVtbyB7CisgICAgCisgICAgZGVmIGZyYW1lCisgICAgZGVmIHN3aW5nCisgICAgCisgICAgdm9pZCBydW4oKSB7CisgICAgICAgIGRlZiBzd2luZyA9IG5ldyBTd2luZ0J1aWxkZXIoKQorICAgICAgICAKKyAgICAgICAgZGVmIGZyYW1lID0gc3dpbmcuZnJhbWUodGl0bGU6J01WQyBEZW1vJywgbG9jYXRpb246WzIwMCwyMDBdLCBzaXplOlszMDAsMjAwXSkgeworICAgICAgICAgICAgbWVudUJhciB7CisJCSAgICAgICAgbWVudSh0ZXh0OidIZWxwJykgeworCQkgICAgICAgICAgICBtZW51SXRlbSgpIHsKKwkJICAgICAgICAgICAgICAgIGFjdGlvbihuYW1lOidBYm91dCcsIGNsb3N1cmU6eyBzaG93QWJvdXQoKSB9KQorCQkgICAgICAgICAgICB9CisJCSAgICAgICAgfQorCQkgICAgfQorCQkgICAgcGFuZWwobGF5b3V0Om5ldyBCb3JkZXJMYXlvdXQoKSkgeworICAgIAkgICAgICAgIHNjcm9sbFBhbmUoY29uc3RyYWludHM6Qm9yZGVyTGF5b3V0LkNFTlRFUikgeworICAgIAkgICAgICAgICAgICB0YWJsZSgpIHsKKyAgICAJICAgICAgICAgICAgICAgIHRhYmxlTW9kZWwobGlzdDpbIFsnbmFtZSc6J0phbWVzJywgJ2xvY2F0aW9uJzonTG9uZG9uJ10sIFsnbmFtZSc6J0JvYicsICdsb2NhdGlvbic6J0F0bGFudGEnXSBdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlDb2x1bW4oaGVhZGVyOidOYW1lJywgcHJvcGVydHlOYW1lOiduYW1lJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eUNvbHVtbihoZWFkZXI6J0xvY2F0aW9uJywgcHJvcGVydHlOYW1lOidsb2NhdGlvbicpCisgICAgCSAgICAgICAgICAgICAgICB9CisgICAgCSAgICAgICAgICAgIH0KKyAgICAJICAgICAgICB9CisJCSAgICB9CisJCX0gICAgICAgIAorCQlmcmFtZS5zaG93KCkKKyAgICB9CisgCisgICAgdm9pZCBzaG93QWJvdXQoKSB7CisgCQlkZWYgcGFuZSA9IHN3aW5nLm9wdGlvblBhbmUobWVzc2FnZTonVGhpcyBkZW1vIHNob3dzIGhvdyB5b3UgY2FuIGNyZWF0ZSBVSSBtb2RlbHMgZnJvbSBzaW1wbGUgTVZDIG1vZGVscycpCisgCQlkZWYgZGlhbG9nID0gcGFuZS5jcmVhdGVEaWFsb2coZnJhbWUsICdBYm91dCBNVkMgRGVtbycpCisgCQlkaWFsb2cuc2hvdygpCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9leGFtcGxlcy9ncm9vdnkvc3dpbmcvRGVtby5qYXZhIGIvZ3Jvb3Z5L3NyYy9leGFtcGxlcy9ncm9vdnkvc3dpbmcvRGVtby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMGZmZmYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL2V4YW1wbGVzL2dyb292eS9zd2luZy9EZW1vLmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAkSWQkCisKKyBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAorIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0CisgICAgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhCisgICAgY29weSBvZiB0aGlzIGRvY3VtZW50LgorCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQorICAgIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKKyAgICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKKyAgICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCisgICAgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCisKKyA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IgorICAgIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQKKyAgICB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgorCisgNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KKyAgICBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMKKyBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKKyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCisgVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICovCisKK3BhY2thZ2UgZ3Jvb3Z5LnN3aW5nOworCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0OworaW1wb3J0IGdyb292eS5sYW5nLkdyb292eUNvZGVTb3VyY2U7CitpbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5Q2xhc3NMb2FkZXI7CitpbXBvcnQgZ3Jvb3Z5LnV0aWwuR3Jvb3Z5VGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKKworLyoqCisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBEZW1vIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworICAgIENsYXNzTG9hZGVyIHBhcmVudExvYWRlciA9IGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKKyAgICBwcm90ZWN0ZWQgR3Jvb3Z5Q2xhc3NMb2FkZXIgbG9hZGVyID0KKyAgICAJKEdyb292eUNsYXNzTG9hZGVyKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKKyAgICAJCXB1YmxpYyBPYmplY3QgcnVuKCkgeworICAgIAkJCXJldHVybiBuZXcgR3Jvb3Z5Q2xhc3NMb2FkZXIocGFyZW50TG9hZGVyKTsKKyAgICAJCX0KKyAgICAJfSk7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRGVtbyBkZW1vID0gbmV3IERlbW8oKTsKKyAgICAgICAgR3Jvb3Z5T2JqZWN0IG9iamVjdCA9IGRlbW8uY29tcGlsZSgic3JjL2V4YW1wbGVzL2dyb292eS9zd2luZy9Td2luZ0RlbW8uZ3Jvb3Z5Iik7CisgICAgICAgIG9iamVjdC5pbnZva2VNZXRob2QoInJ1biIsIG51bGwpOworICAgIH0KKworICAgIHByb3RlY3RlZCBHcm9vdnlPYmplY3QgY29tcGlsZShTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDbGFzcyBncm9vdnlDbGFzcyA9IGxvYWRlci5wYXJzZUNsYXNzKG5ldyBHcm9vdnlDb2RlU291cmNlKG5ldyBGaWxlKGZpbGVOYW1lKSkpOworICAgICAgICBHcm9vdnlPYmplY3Qgb2JqZWN0ID0gKEdyb292eU9iamVjdCkgZ3Jvb3Z5Q2xhc3MubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShvYmplY3QgIT0gbnVsbCk7CisgICAgICAgIHJldHVybiBvYmplY3Q7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9leGFtcGxlcy9ncm9vdnkvc3dpbmcvTXlUYWJsZU1vZGVsLmphdmEgYi9ncm9vdnkvc3JjL2V4YW1wbGVzL2dyb292eS9zd2luZy9NeVRhYmxlTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGFlMDUwCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9leGFtcGxlcy9ncm9vdnkvc3dpbmcvTXlUYWJsZU1vZGVsLmphdmEKQEAgLTAsMCArMSwxMDYgQEAKK3BhY2thZ2UgZ3Jvb3Z5LnN3aW5nOworCitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXguc3dpbmcudGFibGUuQWJzdHJhY3RUYWJsZU1vZGVsOworCisvKiogCisgKiBBIHNhbXBsZSB0YWJsZSBtb2RlbAorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBNeVRhYmxlTW9kZWwgZXh0ZW5kcyBBYnN0cmFjdFRhYmxlTW9kZWwgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlci5nZXRMb2dnZXIoTXlUYWJsZU1vZGVsLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBwdWJsaWMgTXlUYWJsZU1vZGVsKCkgeworICAgIH0KKworICAgIGZpbmFsIFN0cmluZ1tdIGNvbHVtbk5hbWVzID0geyAiRmlyc3QgTmFtZSIsICJMYXN0IE5hbWUiLCAiU3BvcnQiLCAiIyBvZiBZZWFycyIsICJWZWdldGFyaWFuIiB9OworICAgIGZpbmFsIE9iamVjdFtdW10gZGF0YSA9IHsgeyAiTWFyeSIsICJDYW1waW9uZSIsICJTbm93Ym9hcmRpbmciLCBuZXcgSW50ZWdlcig1KSwgbmV3IEJvb2xlYW4oZmFsc2UpfSwgeworICAgICAgICAgICAgIkFsaXNvbiIsICJIdW1sIiwgIlJvd2luZyIsIG5ldyBJbnRlZ2VyKDMpLCBuZXcgQm9vbGVhbih0cnVlKQorICAgICAgICAgICAgfSwgeworICAgICAgICAgICAgIkthdGh5IiwgIldhbHJhdGgiLCAiQ2hhc2luZyB0b2RkbGVycyIsIG5ldyBJbnRlZ2VyKDIpLCBuZXcgQm9vbGVhbihmYWxzZSkKKyAgICAgICAgICAgIH0sIHsKKyAgICAgICAgICAgICJNYXJrIiwgIkFuZHJld3MiLCAiU3BlZWQgcmVhZGluZyIsIG5ldyBJbnRlZ2VyKDIwKSwgbmV3IEJvb2xlYW4odHJ1ZSkKKyAgICAgICAgICAgIH0sIHsKKyAgICAgICAgICAgICJBbmdlbGEiLCAiTGloIiwgIlRlYWNoaW5nIGhpZ2ggc2Nob29sIiwgbmV3IEludGVnZXIoNCksIG5ldyBCb29sZWFuKGZhbHNlKQorICAgICAgICAgICAgfQorICAgIH07CisKKyAgICBwdWJsaWMgaW50IGdldENvbHVtbkNvdW50KCkgeworICAgICAgICByZXR1cm4gY29sdW1uTmFtZXMubGVuZ3RoOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0Um93Q291bnQoKSB7CisgICAgICAgIHJldHVybiBkYXRhLmxlbmd0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbHVtbk5hbWUoaW50IGNvbCkgeworICAgICAgICByZXR1cm4gY29sdW1uTmFtZXNbY29sXTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlQXQoaW50IHJvdywgaW50IGNvbCkgeworICAgICAgICByZXR1cm4gZGF0YVtyb3ddW2NvbF07CisgICAgfQorCisgICAgLyoKKyAgICAgKiBKVGFibGUgdXNlcyB0aGlzIG1ldGhvZCB0byBkZXRlcm1pbmUgdGhlIGRlZmF1bHQgcmVuZGVyZXIvCisgICAgICogZWRpdG9yIGZvciBlYWNoIGNlbGwuICBJZiB3ZSBkaWRuJ3QgaW1wbGVtZW50IHRoaXMgbWV0aG9kLAorICAgICAqIHRoZW4gdGhlIGxhc3QgY29sdW1uIHdvdWxkIGNvbnRhaW4gdGV4dCAoInRydWUiLyJmYWxzZSIpLAorICAgICAqIHJhdGhlciB0aGFuIGEgY2hlY2sgYm94LgorICAgICAqLworICAgIHB1YmxpYyBDbGFzcyBnZXRDb2x1bW5DbGFzcyhpbnQgYykgeworICAgICAgICByZXR1cm4gZ2V0VmFsdWVBdCgwLCBjKS5nZXRDbGFzcygpOworICAgIH0KKworICAgIC8qCisgICAgICogRG9uJ3QgbmVlZCB0byBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdW5sZXNzIHlvdXIgdGFibGUncworICAgICAqIGVkaXRhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQ2VsbEVkaXRhYmxlKGludCByb3csIGludCBjb2wpIHsKKyAgICAgICAgLy9Ob3RlIHRoYXQgdGhlIGRhdGEvY2VsbCBhZGRyZXNzIGlzIGNvbnN0YW50LAorICAgICAgICAvL25vIG1hdHRlciB3aGVyZSB0aGUgY2VsbCBhcHBlYXJzIG9uc2NyZWVuLgorICAgICAgICBpZiAoY29sIDwgMikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIERvbid0IG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kIHVubGVzcyB5b3VyIHRhYmxlJ3MKKyAgICAgKiBkYXRhIGNhbiBjaGFuZ2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmFsdWVBdChPYmplY3QgdmFsdWUsIGludCByb3csIGludCBjb2wpIHsKKyAgICAgICAgaWYgKGxvZy5pc0xvZ2dhYmxlKExldmVsLkZJTkUpKSB7CisgICAgICAgICAgICBsb2cuZmluZSgKKyAgICAgICAgICAgICAgICAiU2V0dGluZyB2YWx1ZSBhdCAiICsgcm93ICsgIiwiICsgY29sICsgIiB0byAiICsgdmFsdWUgKyAiIChhbiBpbnN0YW5jZSBvZiAiICsgdmFsdWUuZ2V0Q2xhc3MoKSArICIpIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGF0YVswXVtjb2xdIGluc3RhbmNlb2YgSW50ZWdlciAmJiAhKHZhbHVlIGluc3RhbmNlb2YgSW50ZWdlcikpIHsKKyAgICAgICAgICAgIC8vV2l0aCBKRkMvU3dpbmcgMS4xIGFuZCBKREsgMS4yLCB3ZSBuZWVkIHRvIGNyZWF0ZSAgICAKKyAgICAgICAgICAgIC8vYW4gSW50ZWdlciBmcm9tIHRoZSB2YWx1ZTsgb3RoZXJ3aXNlLCB0aGUgY29sdW1uICAgICAKKyAgICAgICAgICAgIC8vc3dpdGNoZXMgdG8gY29udGFpbiBTdHJpbmdzLiAgU3RhcnRpbmcgd2l0aCB2IDEuMywgICAKKyAgICAgICAgICAgIC8vdGhlIHRhYmxlIGF1dG9tYXRpY2FsbHkgY29udmVydHMgdmFsdWUgdG8gYW4gSW50ZWdlciwKKyAgICAgICAgICAgIC8vc28geW91IG9ubHkgbmVlZCB0aGUgY29kZSBpbiB0aGUgJ2Vsc2UnIHBhcnQgb2YgdGhpcyAKKyAgICAgICAgICAgIC8vJ2lmJyBibG9jay4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vWFhYOiBTZWUgVGFibGVFZGl0RGVtby5qYXZhIGZvciBhIGJldHRlciBzb2x1dGlvbiEhIQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBkYXRhW3Jvd11bY29sXSA9IG5ldyBJbnRlZ2VyKHZhbHVlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIGZpcmVUYWJsZUNlbGxVcGRhdGVkKHJvdywgY29sKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy5sb2coTGV2ZWwuU0VWRVJFLCAiVGhlIFwiIiArIGdldENvbHVtbk5hbWUoY29sKSArICJcIiBjb2x1bW4gYWNjZXB0cyBvbmx5IGludGVnZXIgdmFsdWVzLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZGF0YVtyb3ddW2NvbF0gPSB2YWx1ZTsKKyAgICAgICAgICAgIGZpcmVUYWJsZUNlbGxVcGRhdGVkKHJvdywgY29sKTsKKyAgICAgICAgfQorICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvZXhhbXBsZXMvZ3Jvb3Z5L3N3aW5nL1N3aW5nRGVtby5ncm9vdnkgYi9ncm9vdnkvc3JjL2V4YW1wbGVzL2dyb292eS9zd2luZy9Td2luZ0RlbW8uZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4OTU1MzkKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL2V4YW1wbGVzL2dyb292eS9zd2luZy9Td2luZ0RlbW8uZ3Jvb3Z5CkBAIC0wLDAgKzEsMTA1IEBACitwYWNrYWdlIGdyb292eS5zd2luZworCitpbXBvcnQgamF2YS5hd3QuQm9yZGVyTGF5b3V0CitpbXBvcnQgamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeQoraW1wb3J0IGdyb292eS5tb2RlbC5NdmNEZW1vCisKK2NsYXNzIFN3aW5nRGVtbyB7CisKKyAgICBkZWYgc3dpbmcgPSBuZXcgU3dpbmdCdWlsZGVyKCkKKyAgICBkZWYgZnJhbWUKKyAgICAKKyAgICBzdGF0aWMgdm9pZCBtYWluKGFyZ3MpIHsKKyAgICAgICAgZGVmIGRlbW8gPSBuZXcgU3dpbmdEZW1vKCkKKyAgICAgICAgZGVtby5ydW4oKQorICAgIH0KKworICAgIHZvaWQgcnVuKCkgeworICAgICAgICBkZWYgZnJhbWUgPSBzd2luZy5mcmFtZSgKKyAgICAgICAgICAgIHRpdGxlOidUaGlzIGlzIGEgRnJhbWUnLAorICAgICAgICAgICAgbG9jYXRpb246WzEwMCwxMDBdLAorICAgICAgICAgICAgc2l6ZTpbODAwLDQwMF0sCisgICAgICAgICAgICBkZWZhdWx0Q2xvc2VPcGVyYXRpb246amF2YXguc3dpbmcuV2luZG93Q29uc3RhbnRzLkVYSVRfT05fQ0xPU0UpIHsKKworICAgICAgICAgICAgbWVudUJhciB7CisgICAgICAgICAgICAgICAgbWVudSh0ZXh0OidGaWxlJykgeworICAgICAgICAgICAgICAgICAgICBtZW51SXRlbSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbihuYW1lOidOZXcnLCBjbG9zdXJlOnsgcHJpbnRsbigiY2xpY2tlZCBvbiB0aGUgbmV3IG1lbnUgaXRlbSEiKSB9KQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1lbnVJdGVtKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uKG5hbWU6J09wZW4nLCBjbG9zdXJlOnsgcHJpbnRsbigiY2xpY2tlZCBvbiB0aGUgb3BlbiBtZW51IGl0ZW0hIikgfSkKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzZXBhcmF0b3IoKQorICAgICAgICAgICAgICAgICAgICBtZW51SXRlbSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbihuYW1lOidTYXZlJywgZW5hYmxlZDpmYWxzZSwgY2xvc3VyZTp7IHByaW50bG4oImNsaWNrZWQgb24gdGhlIFNhdmUgbWVudSBpdGVtISIpIH0pCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWVudSh0ZXh0OidEZW1vcycpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVudUl0ZW0oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24obmFtZTonU2ltcGxlIFRhYmxlTW9kZWwgRGVtbycsIGNsb3N1cmU6eyBzaG93R3Jvb3Z5VGFibGVEZW1vKCkgfSkKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtZW51SXRlbSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbihuYW1lOidNVkMgRGVtbycsIGNsb3N1cmU6eyBzaG93TVZDRGVtbygpIH0pCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbWVudUl0ZW0oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24obmFtZTonVGFibGVMYXlvdXQgRGVtbycsIGNsb3N1cmU6eyBzaG93VGFibGVMYXlvdXREZW1vKCkgfSkKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtZW51KHRleHQ6J0hlbHAnKSB7CisgICAgICAgICAgICAgICAgICAgIG1lbnVJdGVtKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uKG5hbWU6J0Fib3V0JywgY2xvc3VyZTp7IHNob3dBYm91dCgpIH0pCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcGxpdFBhbmUgeworICAgICAgICAgICAgICAgIHBhbmVsKGxheW91dDpuZXcgQm9yZGVyTGF5b3V0KCksIGJvcmRlcjpCb3JkZXJGYWN0b3J5LmNyZWF0ZVRpdGxlZEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZUxvd2VyZWRCZXZlbEJvcmRlcigpLCAndGl0bGVkIGJvcmRlcicpKSB7CisgICAgICAgICAgICAgICAgICAgIHZib3goY29uc3RyYWludHM6Qm9yZGVyTGF5b3V0Lk5PUlRIKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbChsYXlvdXQ6bmV3IEJvcmRlckxheW91dCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwodGV4dDonTmFtZScsIGNvbnN0cmFpbnRzOkJvcmRlckxheW91dC5XRVNULCB0b29sVGlwVGV4dDonVGhpcyBpcyB0aGUgbmFtZSBmaWVsZCcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEZpZWxkKHRleHQ6J0phbWVzJywgY29uc3RyYWludHM6Qm9yZGVyTGF5b3V0LkNFTlRFUiwgdG9vbFRpcFRleHQ6J0VudGVyIHRoZSBuYW1lIGludG8gdGhpcyBmaWVsZCcpCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbChsYXlvdXQ6bmV3IEJvcmRlckxheW91dCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwodGV4dDonTG9jYXRpb24nLCBjb25zdHJhaW50czpCb3JkZXJMYXlvdXQuV0VTVCwgdG9vbFRpcFRleHQ6J1RoaXMgaXMgdGhlIGxvY2F0aW9uIGZpZWxkJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21ib0JveChpdGVtczpbJ0F0bGFudGEnLCAnTG9uZG9uJywgJ05ldyBZb3JrJ10sIGNvbnN0cmFpbnRzOkJvcmRlckxheW91dC5DRU5URVIsIHRvb2xUaXBUZXh0OidDaG9vc2UgdGhlIGxvY2F0aW9uIGludG8gdGhpcyBmaWVsZCcpCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBidXR0b24odGV4dDonQ2xpY2sgTWUnLCBhY3Rpb25QZXJmb3JtZWQ6e2V2ZW50IC0+IHByaW50bG4oImNsb3N1cmUgZmlyZWQgd2l0aCBldmVudDogIiArIGV2ZW50KSB9KQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNjcm9sbFBhbmUoY29uc3RyYWludHM6Qm9yZGVyTGF5b3V0LkNFTlRFUiwgYm9yZGVyOkJvcmRlckZhY3RvcnkuY3JlYXRlUmFpc2VkQmV2ZWxCb3JkZXIoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEFyZWEodGV4dDonU29tZSB0ZXh0IGdvZXMgaGVyZScsIHRvb2xUaXBUZXh0OidUaGlzIGlzIGEgbGFyZ2UgdGV4dCBhcmVhIHRvIHR5cGUgaW4gdGV4dCcpCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2Nyb2xsUGFuZSB7CisgICAgICAgICAgICAgICAgICAgIHRhYmxlKG1vZGVsOm5ldyBNeVRhYmxlTW9kZWwoKSkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZnJhbWUuc2hvdygpCisgICAgfQorICAgIAorICAgIHZvaWQgc2hvd0Fib3V0KCkgeworICAgICAgICAvLyB0aGlzIHZlcnNpb24gZG9lc24ndCBhdXRvLXNpemUgJiBwb3NpdGlvbiB0aGUgZGlhbG9nCisgICAgICAgIC8qCisgICAgICAgIGRlZiBkaWFsb2cgPSBzd2luZy5kaWFsb2cob3duZXI6ZnJhbWUsIHRpdGxlOidBYm91dCBHcm9vdnlTd2luZycpIHsKKyAgICAgICAgICAgIG9wdGlvblBhbmUobWVzc2FnZTonV2VsY29tZSB0byB0aGUgd29uZGVyZnVsIHdvcmxkIG9mIEdyb292eVN3aW5nJykKKyAgICAgICAgfQorICAgICAgICAqLworICAgICAgICAgZGVmIHBhbmUgPSBzd2luZy5vcHRpb25QYW5lKG1lc3NhZ2U6J1dlbGNvbWUgdG8gdGhlIHdvbmRlcmZ1bCB3b3JsZCBvZiBHcm9vdnlTd2luZycpCisgICAgICAgICBkZWYgZGlhbG9nID0gcGFuZS5jcmVhdGVEaWFsb2coZnJhbWUsICdBYm91dCBHcm9vdnlTd2luZycpCisgICAgICAgICBkaWFsb2cuc2hvdygpCisgICAgfQorICAgIAorICAgIHZvaWQgc2hvd0dyb292eVRhYmxlRGVtbygpIHsKKyAgICAgICAgZGVmIGRlbW8gPSBuZXcgVGFibGVEZW1vKCkKKyAgICAgICAgZGVtby5ydW4oKQorICAgIH0KKworICAgIHZvaWQgc2hvd01WQ0RlbW8oKSB7CisgICAgICAgIGRlZiBkZW1vID0gbmV3IE12Y0RlbW8oKQorICAgICAgICBkZW1vLnJ1bigpCisgICAgfQorCisgICAgdm9pZCBzaG93VGFibGVMYXlvdXREZW1vKCkgeworICAgICAgICBkZWYgZGVtbyA9IG5ldyBUYWJsZUxheW91dERlbW8oKQorICAgICAgICBkZW1vLnJ1bigpCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9leGFtcGxlcy9ncm9vdnkvc3dpbmcvVGFibGVEZW1vLmdyb292eSBiL2dyb292eS9zcmMvZXhhbXBsZXMvZ3Jvb3Z5L3N3aW5nL1RhYmxlRGVtby5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQxZjY4MwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvZXhhbXBsZXMvZ3Jvb3Z5L3N3aW5nL1RhYmxlRGVtby5ncm9vdnkKQEAgLTAsMCArMSw1MiBAQAorcGFja2FnZSBncm9vdnkuc3dpbmcKKworaW1wb3J0IGphdmEuYXd0LkJvcmRlckxheW91dAoraW1wb3J0IGphdmF4LnN3aW5nLkJvcmRlckZhY3RvcnkKKworLyoqCisgKiBEZW1vbnN0cmF0ZXMgdGhlIHVzZSBvZiB0aGUgR3Jvb3Z5IFRhYmxlTW9kZWxzIGZvciB2aWV3aW5nIHRhYmxlcyBvZiBhbnkgTGlzdCBvZiBvYmplY3RzCisgKi8KK2NsYXNzIFRhYmxlRGVtbyB7CisgICAgCisgICAgLy8gcHJvcGVydGllcworICAgIGRlZiBmcmFtZQorICAgIGRlZiBzd2luZworICAgIAorICAgIHN0YXRpYyB2b2lkIG1haW4oYXJncykgeworICAgICAgICBkZWYgZGVtbyA9IG5ldyBUYWJsZURlbW8oKQorICAgICAgICBkZW1vLnJ1bigpCisgICAgfQorICAgIAorICAgIHZvaWQgcnVuKCkgeworICAgICAgICBzd2luZyA9IG5ldyBTd2luZ0J1aWxkZXIoKQorICAgICAgICAKKyAgICAgICAgZnJhbWUgPSBzd2luZy5mcmFtZSh0aXRsZTonR3Jvb3Z5IFRhYmxlTW9kZWwgRGVtbycsIGxvY2F0aW9uOlsyMDAsMjAwXSwgc2l6ZTpbMzAwLDIwMF0pIHsKKyAgICAgICAgICAgIG1lbnVCYXIgeworICAgICAgICAgICAgICAgIG1lbnUodGV4dDonSGVscCcpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVudUl0ZW0oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24obmFtZTonQWJvdXQnLCBjbG9zdXJlOnsgc2hvd0Fib3V0KCkgfSkKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhbmVsKGxheW91dDpuZXcgQm9yZGVyTGF5b3V0KCkpIHsKKyAgICAgICAgICAgICAgICBzY3JvbGxQYW5lKGNvbnN0cmFpbnRzOkJvcmRlckxheW91dC5DRU5URVIpIHsKKyAgICAgICAgICAgICAgICAgICAgdGFibGUoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWYgbW9kZWwgPSBbWyduYW1lJzonSmFtZXMnLCAnbG9jYXRpb24nOidMb25kb24nXSwgWyduYW1lJzonQm9iJywgJ2xvY2F0aW9uJzonQXRsYW50YSddLCBbJ25hbWUnOidHZWlyJywgJ2xvY2F0aW9uJzonTmV3IFlvcmsnXV0KKworICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVNb2RlbChsaXN0Om1vZGVsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc3VyZUNvbHVtbihoZWFkZXI6J05hbWUnLCByZWFkOntyb3cgLT4gcmV0dXJuIHJvdy5uYW1lfSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zdXJlQ29sdW1uKGhlYWRlcjonTG9jYXRpb24nLCByZWFkOntyb3cgLT4gcmV0dXJuIHJvdy5sb2NhdGlvbn0pCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZnJhbWUuc2hvdygpCisgICAgfQorICAgIAorICAgIHZvaWQgc2hvd0Fib3V0KCkgeworICAgICAgICAgZGVmIHBhbmUgPSBzd2luZy5vcHRpb25QYW5lKG1lc3NhZ2U6J1RoaXMgZGVtbyBzaG93cyBob3cgR3Jvb3Z5U3dpbmcgY2FuIHVzZSBHcm9vdnkgY2xvc3VyZXMgdG8gY3JlYXRlIHNpbXBsZSB0YWJsZSBtb2RlbHMnKQorICAgICAgICAgZGVmIGRpYWxvZyA9IHBhbmUuY3JlYXRlRGlhbG9nKGZyYW1lLCAnQWJvdXQgR3Jvb3Z5U3dpbmcnKQorICAgICAgICAgZGlhbG9nLnNob3coKQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvZXhhbXBsZXMvZ3Jvb3Z5L3N3aW5nL1RhYmxlTGF5b3V0RGVtby5ncm9vdnkgYi9ncm9vdnkvc3JjL2V4YW1wbGVzL2dyb292eS9zd2luZy9UYWJsZUxheW91dERlbW8uZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2M2NjZjYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL2V4YW1wbGVzL2dyb292eS9zd2luZy9UYWJsZUxheW91dERlbW8uZ3Jvb3Z5CkBAIC0wLDAgKzEsNTcgQEAKK3BhY2thZ2UgZ3Jvb3Z5LnN3aW5nCisKK2ltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQKK2ltcG9ydCBqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5CisKKy8qKgorICogRGVtb25zdHJhdGVzIHRoZSB1c2Ugb2YgdGhlIHRhYmxlIGxheW91dAorICovCitjbGFzcyBUYWJsZUxheW91dERlbW8geworICAgIAorICAgIGRlZiBmcmFtZQorICAgIGRlZiBzd2luZworICAgIAorICAgIHZvaWQgcnVuKCkgeworICAgICAgICBzd2luZyA9IG5ldyBTd2luZ0J1aWxkZXIoKQorICAgICAgICAKKyAgICAgICAgZnJhbWUgPSBzd2luZy5mcmFtZSh0aXRsZTonVGFibGVMYXlvdXQgRGVtbycsIGxvY2F0aW9uOlsyMDAsMjAwXSwgc2l6ZTpbMzAwLDIwMF0pIHsKKyAgICAgICAgICAgIG1lbnVCYXIgeworICAgICAgICAgICAgICAgIG1lbnUodGV4dDonSGVscCcpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVudUl0ZW0oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24obmFtZTonQWJvdXQnLCBjbG9zdXJlOnsgc2hvd0Fib3V0KCkgfSkKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRhYmxlTGF5b3V0IHsKKyAgICAgICAgICAgICAgICB0ciB7CisgICAgICAgICAgICAgICAgICAgIHRkIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsKHRleHQ6J25hbWUnKQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRkKGNvbGZpbGw6dHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEZpZWxkKHRleHQ6J0phbWVzJykKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0ciB7CisgICAgICAgICAgICAgICAgICAgIHRkIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsKHRleHQ6J2xvY2F0aW9uJykKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0ZChjb2xmaWxsOnRydWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRleHRGaWVsZCh0ZXh0OidMb25kb24nKQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyIHsKKyAgICAgICAgICAgICAgICAgICAgdGQoY29sc3BhbjoyLCBhbGlnbjonY2VudGVyJykgeworICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uKHRleHQ6J09LJykKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmcmFtZS5zaG93KCkKKyAgICB9CisgICAgCisgICAgdm9pZCBzaG93QWJvdXQoKSB7CisgICAgICAgICBkZWYgcGFuZSA9IHN3aW5nLm9wdGlvblBhbmUobWVzc2FnZTonVGhpcyBkZW1vIHNob3dzIGhvdyB5b3UgY2FuIHVzZSBIVE1MIHN0eWxlIHRhYmxlIGxheW91dHMgd2l0aCBTd2luZyBjb21wb25lbnRzJykKKyAgICAgICAgIGRlZiBkaWFsb2cgPSBwYW5lLmNyZWF0ZURpYWxvZyhmcmFtZSwgJ0Fib3V0IFRhYmxlTGF5b3V0IERlbW8nKQorICAgICAgICAgZGlhbG9nLnNob3coKQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvZXhhbXBsZXMvZ3Jvb3Z5MmQvcGFpbnRpbmdCeU51bWJlcnMuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy9leGFtcGxlcy9ncm9vdnkyZC9wYWludGluZ0J5TnVtYmVycy5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTExMmVmNQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvZXhhbXBsZXMvZ3Jvb3Z5MmQvcGFpbnRpbmdCeU51bWJlcnMuZ3Jvb3Z5CkBAIC0wLDAgKzEsNDggQEAKKy8qKiAKKyAqIFNpbXBsZSBwYXRjaHdvcmsgZ3JhcGhpY3MgZGVtbworICogQGF1dGhvcjogSmVyZW15IFJheW5lciwgY2hhbmdlcyBieSBEaWVyayBLb2VuaWcKKyAqLworaW1wb3J0IGphdmF4LnN3aW5nLldpbmRvd0NvbnN0YW50cyBhcyBXQworaW1wb3J0IGdyb292eS5zd2luZy5Td2luZ0J1aWxkZXIKKworZGVmIHdpZHRoID0gNTAwLCBoZWlnaHQgPSA0MDAsIGJsb2NrU2l6ZSA9IDEwCitkZWYgZyA9IGNyZWF0ZUdyYXBoaWNzKHdpZHRoLCBoZWlnaHQpCisKKy8vIG1haW4gbG9vcAord2hpbGUgKHRydWUpIHsKKyAgICBkcmF3QmxvY2sod2lkdGgsIGhlaWdodCwgYmxvY2tTaXplLCBnKQorfQorCisvLyByYW5kb20gaW50ZWdlcgorZGVmIHJuZCh1cHBlckJvdW5kKXsKKyAgICAoaW50KShNYXRoLnJhbmRvbSgpICogdXBwZXJCb3VuZCkKK30KKworLy8gZHJhdyBhIHJhbmRvbSBjb2xvdXJlZCBzcXVhcmUgd2l0aGluIGJvdW5kcworZGVmIGRyYXdCbG9jayh3LCBoLCBiLCBnKSB7CisgICAgZGVmIHJvdyAgICA9IHJuZChoIC8gYikKKyAgICBkZWYgY29sdW1uID0gcm5kKHcgLyBiKQorICAgIGRlZiBjb2xvdXIgPSBuZXcgamF2YS5hd3QuQ29sb3Iocm5kKDI1NSkscm5kKDI1NSkscm5kKDI1NSkpCisgICAgZy5jb2xvciA9IGNvbG91cgorICAgIGcuZmlsbFJlY3QoY29sdW1uICogYiwgcm93ICogYiwgYiwgYikKK30KKworLy8gY3JlYXRlIGEgbmV3IGZyYW1lIGFuZCBjbGVhciBzY3JlZW4KK2RlZiBjcmVhdGVHcmFwaGljcyh3LCBoKSB7CisgICAgZGVmIGZyYW1lID0gbmV3IFN3aW5nQnVpbGRlcigpLmZyYW1lKAorICAgICAgICB0aXRsZTonUGFpbnRpbmcgYnkgbnVtYmVycycsCisgICAgICAgIGxvY2F0aW9uOlsyMCwyMF0sCisgICAgICAgIHNpemU6W3csIGhdLAorICAgICAgICBkZWZhdWx0Q2xvc2VPcGVyYXRpb246V0MuRVhJVF9PTl9DTE9TRQorICAgICkKKyAgICBmcmFtZS5zaG93KCkKKyAgICAgICAgICAgICAgCisgICAgLy8gb2J0YWluIGdyYXBoaWNzIGNvbnRleHQKKyAgICBkZWYgZ2Z4ID0gZnJhbWUuZ3JhcGhpY3MKKyAgICAgICAgICAgICAgCisgICAgLy8gY2xlYXIgc2NyZWVuCisgICAgZ2Z4LmNvbG9yID0gamF2YS5hd3QuQ29sb3IuQkxBQ0sKKyAgICBnZnguZmlsbFJlY3QoMCwgMCwgdywgaCkKKworICAgIHJldHVybiBnZngKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvZXhhbXBsZXMvc2VhcmNoRW5naW5lL0luZGV4ZXIuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy9leGFtcGxlcy9zZWFyY2hFbmdpbmUvSW5kZXhlci5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE0MTRiYwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvZXhhbXBsZXMvc2VhcmNoRW5naW5lL0luZGV4ZXIuZ3Jvb3Z5CkBAIC0wLDAgKzEsNTkgQEAKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5zdGFuZGFyZC5TdGFuZGFyZEFuYWx5emVyCitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuRG9jdW1lbnQKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudC5GaWVsZAoraW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LkluZGV4V3JpdGVyCisKKy8qKgorICogSW5kZXhlcjogdHJhdmVyc2VzIGEgZmlsZSBzeXN0ZW0gYW5kIGluZGV4ZXMgLnR4dCBmaWxlcworICoKKyAqIEBhdXRob3IgSmVyZW15IFJheW5lciA8Z3Jvb3Z5QHJvc3MtcmF5bmVyLmNvbT4KKyAqIGJhc2VkIG9uIGV4YW1wbGVzIGluIHRoZSB3b25kZXJmdWwgJ0x1Y2VuZSBpbiBBY3Rpb24nIGJvb2sKKyAqIGJ5IEVyaWsgSGF0Y2hlciBhbmQgT3RpcyBHb3Nwb2RuZXRpYyAoIGh0dHA6Ly93d3cubHVjZW5lYm9vay5jb20gKQorICoKKyAqIHJlcXVpcmVzIGEgbHVjZW5lLTEueC54LmphciBmcm9tIGh0dHA6Ly9sdWNlbmUuYXBhY2hlLm9yZworICovCisKK2lmIChhcmdzLnNpemUoKSAhPSAyICkgeworICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlVzYWdlOiBncm9vdnkgLWNwIGx1Y2VuZS0xLjQuMy5qYXIgSW5kZXhlciA8aW5kZXggZGlyPiA8ZGF0YSBkaXI+IikKK30KK2RlZiBpbmRleERpciA9IG5ldyBGaWxlKGFyZ3NbMF0pIC8vIENyZWF0ZSBMdWNlbmUgaW5kZXggaW4gdGhpcyBkaXJlY3RvcnkKK2RlZiBkYXRhRGlyID0gbmV3IEZpbGUoYXJnc1sxXSkgLy8gSW5kZXggZmlsZXMgaW4gdGhpcyBkaXJlY3RvcnkKKworZGVmIHN0YXJ0ID0gbmV3IERhdGUoKS50aW1lCitkZWYgbnVtSW5kZXhlZCA9IGluZGV4KGluZGV4RGlyLCBkYXRhRGlyKQorZGVmIGVuZCA9IG5ldyBEYXRlKCkudGltZQorCitwcmludGxuICJJbmRleGluZyAkbnVtSW5kZXhlZCBmaWxlcyB0b29rICR7ZW5kIC0gc3RhcnR9IG1pbGxpc2Vjb25kcyIKKworZGVmIGluZGV4KGluZGV4RGlyLCBkYXRhRGlyKSB7CisgICAgaWYgKCFkYXRhRGlyLmV4aXN0cygpIHx8ICFkYXRhRGlyLmRpcmVjdG9yeSkgeworICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIiRkYXRhRGlyIGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBhIGRpcmVjdG9yeSIpCisgICAgfQorICAgIGRlZiB3cml0ZXIgPSBuZXcgSW5kZXhXcml0ZXIoaW5kZXhEaXIsIG5ldyBTdGFuZGFyZEFuYWx5emVyKCksIHRydWUpIC8vIENyZWF0ZSBMdWNlbmUgaW5kZXgKKyAgICB3cml0ZXIudXNlQ29tcG91bmRGaWxlID0gZmFsc2UKKworICAgIGRhdGFEaXIuZWFjaEZpbGVSZWN1cnNlIHsKKyAgICAgICAgaWYgKGl0Lm5hbWUgPX4gLy50eHQkLykgeyAvLyBJbmRleCAudHh0IGZpbGVzIG9ubHkKKyAgICAgICAgICAgIGluZGV4RmlsZSh3cml0ZXIsaXQpCisgICAgICAgIH0KKyAgICB9CisgICAgZGVmIG51bUluZGV4ZWQgPSB3cml0ZXIuZG9jQ291bnQoKQorICAgIHdyaXRlci5vcHRpbWl6ZSgpCisgICAgd3JpdGVyLmNsb3NlKCkgLy8gQ2xvc2UgaW5kZXgKKyAgICByZXR1cm4gbnVtSW5kZXhlZAorfQorCit2b2lkIGluZGV4RmlsZSh3cml0ZXIsIGYpIHsKKyAgICBpZiAoZi5oaWRkZW4gfHwgIWYuZXhpc3RzKCkgfHwgIWYuY2FuUmVhZCgpIHx8IGYuZGlyZWN0b3J5KSB7IHJldHVybiB9CisKKyAgICBwcmludGxuICJJbmRleGluZyAkZi5jYW5vbmljYWxQYXRoIgorICAgIGRlZiBkb2MgPSBuZXcgRG9jdW1lbnQoKQorCisgICAgLy8gQ29uc3RydWN0IGEgRmllbGQgdGhhdCBpcyB0b2tlbml6ZWQgYW5kIGluZGV4ZWQsIGJ1dCBpcyBub3Qgc3RvcmVkIGluIHRoZSBpbmRleCB2ZXJiYXRpbS4KKyAgICBkb2MuYWRkKEZpZWxkLlRleHQoImNvbnRlbnRzIiwgbmV3IEZpbGVSZWFkZXIoZikpKQorCisgICAgLy8gQ29uc3RydWN0IGEgRmllbGQgdGhhdCBpcyBub3QgdG9rZW5pemVkLCBidXQgaXMgaW5kZXhlZCBhbmQgc3RvcmVkLgorICAgIGRvYy5hZGQoRmllbGQuS2V5d29yZCgiZmlsZW5hbWUiLGYuY2Fub25pY2FsUGF0aCkpCisKKyAgICB3cml0ZXIuYWRkRG9jdW1lbnQoZG9jKSAvLyBBZGQgZG9jdW1lbnQgdG8gTHVjZW5lIGluZGV4Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9leGFtcGxlcy9zZWFyY2hFbmdpbmUvU2VhcmNoZXIuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy9leGFtcGxlcy9zZWFyY2hFbmdpbmUvU2VhcmNoZXIuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxZjZhODIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL2V4YW1wbGVzL3NlYXJjaEVuZ2luZS9TZWFyY2hlci5ncm9vdnkKQEAgLTAsMCArMSwzOCBAQAoraW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLnN0YW5kYXJkLlN0YW5kYXJkQW5hbHl6ZXIKK2ltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5xdWVyeVBhcnNlci5RdWVyeVBhcnNlcgoraW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5JbmRleFNlYXJjaGVyCitpbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc3RvcmUuRlNEaXJlY3RvcnkKKworLyoqCisgKiBTZWFyY2hlcjogc2VhcmNoZXMgYSBMdWNlbmUgaW5kZXggZm9yIGEgcXVlcnkgcGFzc2VkIGFzIGFuIGFyZ3VtZW50CisgKgorICogQGF1dGhvciBKZXJlbXkgUmF5bmVyIDxncm9vdnlAcm9zcy1yYXluZXIuY29tPgorICogYmFzZWQgb24gZXhhbXBsZXMgaW4gdGhlIHdvbmRlcmZ1bCAnTHVjZW5lIGluIEFjdGlvbicgYm9vaworICogYnkgRXJpayBIYXRjaGVyIGFuZCBPdGlzIEdvc3BvZG5ldGljICggaHR0cDovL3d3dy5sdWNlbmVib29rLmNvbSApCisgKgorICogcmVxdWlyZXMgYSBsdWNlbmUtMS54LnguamFyIGZyb20gaHR0cDovL2x1Y2VuZS5hcGFjaGUub3JnCisgKi8KKworaWYgKGFyZ3Muc2l6ZSgpICE9IDIpIHsKKyAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJVc2FnZTogZ3Jvb3Z5IC1jcCBsdWNlbmUtMS40LjMuamFyIFNlYXJjaGVyIDxpbmRleCBkaXI+IDxxdWVyeT4iKQorfQorZGVmIGluZGV4RGlyID0gbmV3IEZpbGUoYXJnc1swXSkgLy8gSW5kZXggZGlyZWN0b3J5IGNyZWF0ZSBieSBJbmRleGVyCitkZWYgcSA9IGFyZ3NbMV0gLy8gUXVlcnkgc3RyaW5nCisKK2lmICghaW5kZXhEaXIuZXhpc3RzKCkgfHwgIWluZGV4RGlyLmRpcmVjdG9yeSkgeworICAgIHRocm93IG5ldyBFeGNlcHRpb24oIiRpbmRleERpciBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgYSBkaXJlY3RvcnkiKQorfQorCitkZWYgZnNEaXIgPSBGU0RpcmVjdG9yeS5nZXREaXJlY3RvcnkoaW5kZXhEaXIsIGZhbHNlKQorZGVmIGlzID0gbmV3IEluZGV4U2VhcmNoZXIoZnNEaXIpIC8vIE9wZW4gaW5kZXgKKworZGVmIHF1ZXJ5ID0gUXVlcnlQYXJzZXIucGFyc2UocSwgImNvbnRlbnRzIiwgbmV3IFN0YW5kYXJkQW5hbHl6ZXIoKSkgLy8gUGFyc2UgcXVlcnkKK2RlZiBzdGFydCA9IG5ldyBEYXRlKCkudGltZQorZGVmIGhpdHMgPSBpcy5zZWFyY2gocXVlcnkpIC8vIFNlYXJjaCBpbmRleAorZGVmIGVuZCA9IG5ldyBEYXRlKCkudGltZQorCitwcmludGxuICJGb3VuZCAke2hpdHMubGVuZ3RoKCl9IGRvY3VtZW50KHMpIChpbiAke2VuZCAtIHN0YXJ0fSBtaWxsaXNlY29uZHMpIHRoYXQgbWF0Y2hlZCBxdWVyeSAnJHEnOiIKKworZm9yICggaSBpbiAwIC4uPCBoaXRzLmxlbmd0aCgpICkgeworICAgIHByaW50bG4oaGl0cy5kb2MoaSlbImZpbGVuYW1lIl0pIC8vIFJldHJpZXZlIG1hdGNoaW5nIGRvY3VtZW50IGFuZCBkaXNwbGF5IGZpbGVuYW1lCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL2V4YW1wbGVzL3N3aW5nL0JpbmRpbmdFeGFtcGxlLmdyb292eSBiL2dyb292eS9zcmMvZXhhbXBsZXMvc3dpbmcvQmluZGluZ0V4YW1wbGUuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNjYxMmUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL2V4YW1wbGVzL3N3aW5nL0JpbmRpbmdFeGFtcGxlLmdyb292eQpAQCAtMCwwICsxLDYxIEBACisvKg0KKyAqIENvcHlyaWdodCAyMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4NCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisvKioNCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzaGVtbm9uQHlhaG9vLmNvbSI+RGFubm8gRmVycmluPC9hPg0KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQNCisgKiBAc2luY2UgR3Jvb3Z5IDEuMQ0KKyAqDQorICogVGhlIHJlYWwgaW50ZXJlc3RpbmcgcGFydCBvZiB0aGlzIGV4YW1wbGUgYXJlIGluIHRoZSB0aHJlZSBwcm9wZXJ0aWVzIG9mIGJ1dHRvbjoNCisgKg0KKyAqICAgICAgICAgICB0ZXh0OiBiaW5kKHNvdXJjZTp0ZXh0RmllbGQsIHNvdXJjZVByb3BlcnR5Oid0ZXh0JyksDQorICogICAgICAgICAgIG1hcmdpbjogYmluZChzb3VyY2U6c2xpZGVyLCBzb3VyY2VQcm9wZXJ0eTondmFsdWUnLCBjb252ZXJ0ZXI6e1tpdCwgaXQsIGl0LCBpdF0gYXMgSW5zZXRzfSksDQorICogICAgICAgICAgIGVuYWJsZWQ6IGJpbmQoc291cmNlOmNoZWNrQm94LCBzb3VyY2VQcm9wZXJ0eTonc2VsZWN0ZWQnKQ0KKyAqDQorICogVGhpcyBpcyB3aGVyZSB0aGUgcmVhbCBtYWdpYyBnb2VzIG9uLCBjYXVzaW5nIHRoZSBidXR0b24gdG8gcmVhY3QgdG8gdGhlIGNoYW5nZXMNCisgKiBpbiB0aGUgc291cmNlIHdpZGdldHMgdmFsdWVzLg0KKyAqLw0KKw0KK2ltcG9ydCBncm9vdnkuc3dpbmcuU3dpbmdCdWlsZGVyDQoraW1wb3J0IGphdmEuYXd0LkdyaWRCYWdDb25zdHJhaW50cyBhcyBnYg0KK2ltcG9ydCBqYXZhLmF3dC5JbnNldHMNCisNCitzYiA9IFN3aW5nQnVpbGRlci5idWlsZCgpIHsNCisgICAgZnJhbWUoaWQ6J2ZyYW1lJywgZGVmYXVsdENsb3NlT3BlcmF0aW9uOmphdmF4LnN3aW5nLkpGcmFtZS5ESVNQT1NFX09OX0NMT1NFKSB7DQorICAgICAgICBncmlkQmFnTGF5b3V0KCkNCisNCisgICAgICAgIGxhYmVsKCJUZXh0OiIsIGNvbnN0cmFpbnRzOmdiYyhhbmNob3I6Z2IuV0VTVCwgaW5zZXRzOls2LDYsMywzXSBhcyBJbnNldHMpKQ0KKyAgICAgICAgdGV4dEZpZWxkKCJDaGFuZ2UgTWUhIiwgaWQ6J3RleHRGaWVsZCcsIGNvbnN0cmFpbnRzOmdiYyhmaWxsOmdiLkhPUklaT05UQUwsIGdyaWR3aWR0aDpnYi5SRU1BSU5ERVIsIGluc2V0czpbNiwzLDMsNl0gYXMgSW5zZXRzKSkNCisNCisgICAgICAgIGxhYmVsKCJNYXJnaW46IiwgY29uc3RyYWludHM6Z2JjKGFuY2hvcjpnYi5XRVNULCBpbnNldHM6WzMsNiwzLDNdIGFzIEluc2V0cykpDQorICAgICAgICBzbGlkZXIoaWQ6J3NsaWRlcicsIHZhbHVlOjUsIGNvbnN0cmFpbnRzOmdiYyhmaWxsOmdiLkhPUklaT05UQUwsIGdyaWR3aWR0aDpnYi5SRU1BSU5ERVIsIGluc2V0czpbMywzLDMsNl0gYXMgSW5zZXRzKSkNCisNCisgICAgICAgIHBhbmVsKCkNCisgICAgICAgIGNoZWNrQm94KCJFbmJsZWQiLCBpZDonY2hlY2tCb3gnLCBjb25zdHJhaW50czpnYmMoYW5jaG9yOmdiLldFU1QsIGdyaWR3aWR0aDpnYi5SRU1BSU5ERVIsIGluc2V0czpbMywzLDMsNl0gYXMgSW5zZXRzKSkNCisNCisgICAgICAgIHNlcGFyYXRvcihjb25zdHJhaW50czpnYmMoZmlsbDpnYi5IT1JJWk9OVEFMLCBncmlkd2lkdGg6Z2IuUkVNQUlOREVSKSkNCisNCisgICAgICAgIGJ1dHRvbihjb25zdHJhaW50czpnYmMoYW5jaG9yOmdiLkNFTlRFUiwgZ3JpZHdpZHRoOmdiLlJFTUFJTkRFUiwgZ3JpZGhlaWdodDpnYi5SRU1BSU5ERVIsIHdlaWdodHg6MS4wLCB3ZWlnaHR5OjEuMCwgaW5zZXRzOlszLDYsNiw2XSBhcyBJbnNldHMpLA0KKyAgICAgICAgICAgIHRleHQ6IGJpbmQoc291cmNlOnRleHRGaWVsZCwgc291cmNlUHJvcGVydHk6J3RleHQnKSwNCisgICAgICAgICAgICBtYXJnaW46IGJpbmQoc291cmNlOnNsaWRlciwgc291cmNlUHJvcGVydHk6J3ZhbHVlJywgY29udmVydGVyOntbaXQsIGl0LCBpdCwgaXRdIGFzIEluc2V0c30pLA0KKyAgICAgICAgICAgIGVuYWJsZWQ6IGJpbmQoc291cmNlOmNoZWNrQm94LCBzb3VyY2VQcm9wZXJ0eTonc2VsZWN0ZWQnKQ0KKyAgICAgICAgKQ0KKyAgICB9DQorfQ0KK2ZyYW1lID0gc2IuZnJhbWUNCitmcmFtZS5wYWNrKCkNCitmcmFtZS5zZXRTaXplKGZyYW1lLndpZHRoICsgMTAwLCBmcmFtZS5oZWlnaHQgKyAyMDApDQorZnJhbWUuc2hvdygpDQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9leGFtcGxlcy9zd2luZy9CbG9nbGluZXNDbGllbnQuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy9leGFtcGxlcy9zd2luZy9CbG9nbGluZXNDbGllbnQuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxODMyNDAKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL2V4YW1wbGVzL3N3aW5nL0Jsb2dsaW5lc0NsaWVudC5ncm9vdnkKQEAgLTAsMCArMSwxNjQgQEAKKy8qCisgKiBCbG9nbGluZXNDbGllbnQuZ3Jvb3Z5IC0gYW4gZXhhbXBsZSBvZiB0aGUgQmxvZ2xpbmVzIFdlYiBTZXJ2aWNlcworICoKKyAqIFdyaXR0ZW4gYnkgTWFyYyBIZWRsdW5kIDxtYXJjQHByZWNpcGljZS5vcmc+LCBTZXB0ZW1iZXIgMjAwNC4KKyAqIAorICogTWFuZ2xlZCBieSBKb2huIFdpbHNvbiBTZXB0ZW1iZXIgMjAwNAorICoKKyAqIFNtYWxsIGFkYXB0aW9ucyB0byBKU1IgVmVyc2lvbiBieSBEaWVyayBLb2VuaWcsIEp1bmUgMjAwNQorICoKKyAqIFVzZWQgaW4gTWFyYydzIGFydGljbGUgYXQ6CisgKiAgICBodHRwOi8vd3d3Lm9yZWlsbHluZXQuY29tL3B1Yi9hL25ldHdvcmsvMjAwNC8wOS8yOC9ibG9nbGluZXMuaHRtbAorICoKKyAqIFJlcXVpcmVtZW50czoKKyAqICAgLSBpbnN0YWxsIEdyb292eSBhcyBkZXRhaWxlZCBhdCA8aHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvPi4KKyAqICAgLSBwdXQgY29tbW9ucy1odHRwY2xpZW50LTMuMC1yYzMuamFyIGludG8gR1JPT1ZZX0hPTUUvbGliCisgKiAgICAgICBzZWUgPGh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvY29tbW9ucy9odHRwY2xpZW50Lz4uCisgKiAgICAgICBub3RlOiB0aGlzIGlzIGN1cnJlbnRseSBkZXNpZ25lZCBmb3IgSHR0cENsaWVudDIueCBhbmQgbm90IEh0dHBDbGllbnQzLngKKyAqCisgKiBUbyBMYXVuY2g6CisgKiAgIGdyb292eSBCbG9nbGluZXNDbGllbnQuZ3Jvb3Z5CisgKgorICogVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uCisgKiBMaWNlbnNlLiBUbyB2aWV3IGEgY29weSBvZiB0aGlzIGxpY2Vuc2UsIHZpc2l0CisgKiA8aHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMi4wLz4gb3Igc2VuZCBhIGxldHRlciB0bworICogQ3JlYXRpdmUgQ29tbW9ucywgNTU5IE5hdGhhbiBBYmJvdHQgV2F5LCBTdGFuZm9yZCwgQ2FsaWZvcm5pYSA5NDMwNSwgVVNBLgorICovCisKK2ltcG9ydCBncm9vdnkuc3dpbmcuU3dpbmdCdWlsZGVyCitpbXBvcnQgamF2YS5hd3QuQm9yZGVyTGF5b3V0CitpbXBvcnQgamF2YXguc3dpbmcuSk9wdGlvblBhbmUKK2ltcG9ydCBqYXZheC5zd2luZy5KU3BsaXRQYW5lCitpbXBvcnQgamF2YXguc3dpbmcuSlRyZWUKK2ltcG9ydCBqYXZheC5zd2luZy5MaXN0U2VsZWN0aW9uTW9kZWwKK2ltcG9ydCBqYXZheC5zd2luZy5XaW5kb3dDb25zdGFudHMKK2ltcG9ydCBqYXZheC5zd2luZy50cmVlLkRlZmF1bHRNdXRhYmxlVHJlZU5vZGUKK2ltcG9ydCBqYXZheC5zd2luZy50cmVlLlRyZWVTZWxlY3Rpb25Nb2RlbAoraW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lkh0dHBDbGllbnQKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5Vc2VybmFtZVBhc3N3b3JkQ3JlZGVudGlhbHMKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5tZXRob2RzLkdldE1ldGhvZAorCisvL1NldCB1cCBnbG9iYWwgdmFyaWFibGVzIGFuZCBkYXRhIHR5cGVzCitzZXJ2ZXIgPSAncnBjLmJsb2dsaW5lcy5jb20nCisKK2NsYXNzIEZlZWQgeyBkZWYgbmFtZTsgZGVmIGlkOyBkZWYgdW5yZWFkOyBTdHJpbmcgdG9TdHJpbmcoKSB7ICh1bnJlYWQgPT0gIjAiID8gbmFtZSA6ICIke25hbWV9ICgke3VucmVhZH0pIikgfSB9CisKK2NsYXNzIEl0ZW0geyBkZWYgdGl0bGU7IGRlZiBkZXNjcmlwdGlvbjsgU3RyaW5nIHRvU3RyaW5nKCkgeyB0aXRsZSB9IH0KKworLy9Bc2sgdGhlIHVzZXIgZm9yIGFjY291bnQgaW5mb3JtYXRpb24gKHVzaW5nIHNpbXBsZSBkaWFsb2dzKQorZW1haWwgPSAKK0pPcHRpb25QYW5lLnNob3dJbnB1dERpYWxvZyhudWxsLCAiRW1haWwgYWRkcmVzczoiLCAiTG9nIGluIHRvIEJsb2dsaW5lcyIsIAorCQkJICAgICAgSk9wdGlvblBhbmUuUVVFU1RJT05fTUVTU0FHRSkKK3Bhc3N3b3JkID0gCitKT3B0aW9uUGFuZS5zaG93SW5wdXREaWFsb2cobnVsbCwgIlBhc3N3b3JkOiIsICJMb2cgaW4gdG8gQmxvZ2xpbmVzIiwgCisJCQkgICAgICBKT3B0aW9uUGFuZS5RVUVTVElPTl9NRVNTQUdFKQorCisvL1VzZSBIVFRQQ2xpZW50IGZvciB3ZWIgcmVxdWVzdHMgc2luY2UgdGhlIHNlcnZlciByZXF1aXJlcyBhdXRoZW50aWNhdGlvbgorY2xpZW50ID0gbmV3IEh0dHBDbGllbnQoKQorY3JlZGVudGlhbHMgPSBuZXcgVXNlcm5hbWVQYXNzd29yZENyZWRlbnRpYWxzKGVtYWlsLCBwYXNzd29yZCkKK2NsaWVudC5zdGF0ZS5zZXRDcmVkZW50aWFscygiQmxvZ2xpbmVzIFJQQyIsIHNlcnZlciwgY3JlZGVudGlhbHMpCisKK2Fic3RyYWN0Q2FsbEJsb2dsaW5lcyA9IHsgbWV0aG9kLCBwYXJhbWV0ZXJzIC0+CisgIHVybCA9ICJodHRwOi8vJHtzZXJ2ZXJ9LyR7bWV0aG9kfSR7cGFyYW1ldGVyc30iCisgIHRyeSB7CisgICAgZ2V0ID0gbmV3IEdldE1ldGhvZCh1cmwpCisgICAgZ2V0LmRvQXV0aGVudGljYXRpb24gPSB0cnVlCisgICAgY2xpZW50LmV4ZWN1dGVNZXRob2QoZ2V0KQorICAgIHJldHVybiBnZXQucmVzcG9uc2VCb2R5QXNTdHJlYW0KKyAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICBwcmludGxuICJFcnJvciByZXRyaWV2aW5nIDwke3VybH0+OiAke2V9IgorICB9Cit9CisKK2NhbGxCbG9nbGluZXNMaXN0c3ViID0gYWJzdHJhY3RDYWxsQmxvZ2xpbmVzLmN1cnJ5KCdsaXN0c3VicycsICcnKQorY2FsbEJsb2dsaW5lc0dldEl0ZW1zID0gYWJzdHJhY3RDYWxsQmxvZ2xpbmVzLmN1cnJ5KCdnZXRpdGVtcycpCisKKy8vR2V0IHRoZSBsaXN0IG9mIHN1YnNjcmlwdGlvbnMgYW5kIHBhcnNlIGl0IGludG8gYSBHUGF0aCBzdHJ1Y3R1cmUKK29wbWwgPSBuZXcgWG1sU2x1cnBlcigpLnBhcnNlKGNhbGxCbG9nbGluZXNMaXN0c3ViKCkpCisKKy8vRGVzY2VuZCBpbnRvIHRoZSBzdWJzY3JpcHRpb24gb3V0bGluZSwgYWRkaW5nIHRvIHRoZSBmZWVkIHRyZWUgYXMgd2UgZ28KK3RyZWVUb3AgPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZSgiTXkgRmVlZHMiKQorcGFyc2VPdXRsaW5lKG9wbWwuYm9keS5vdXRsaW5lLm91dGxpbmUsIHRyZWVUb3ApCisKK2RlZiBwYXJzZU91dGxpbmUocGFyc2VkWG1sLCB0cmVlTGV2ZWwpIHsKKyAgcGFyc2VkWG1sLmVhY2h7IG91dGxpbmUgLT4KKyAgICBpZiAob3V0bGluZVsnQHhtbFVybCddICE9IG51bGwpIHsgIC8vIHRoaXMgaXMgYW4gaW5kaXZpZHVhbCBmZWVkCisgICAgICBmZWVkID0gbmV3IEZlZWQobmFtZTpvdXRsaW5lWydAdGl0bGUnXSwgaWQ6b3V0bGluZVsnQEJsb2dsaW5lc1N1YklkJ10sIAorICAgICAgICAgICAgICAgICAgICAgIHVucmVhZDpvdXRsaW5lWydAQmxvZ2xpbmVzVW5yZWFkJ10pCisgICAgICB0cmVlTGV2ZWwuYWRkKG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKGZlZWQpKQorICAgIH0gZWxzZSB7ICAvLyB0aGlzIGlzIGEgZm9sZGVyIG9mIGZlZWRzCisgICAgICBmb2xkZXIgPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZShvdXRsaW5lWydAdGl0bGUnXSkKKyAgICAgIHBhcnNlT3V0bGluZShvdXRsaW5lLm91dGxpbmUsIGZvbGRlcikKKyAgICAgIHRyZWVMZXZlbC5hZGQoZm9sZGVyKQorICAgIH0KKyAgfQorfQorCisvL0J1aWxkIHRoZSBiYXNlIHVzZXIgaW50ZXJmYWNlIG9iamVjdHMgYW5kIGNvbmZpZ3VyZSB0aGVtCitzd2luZyA9IG5ldyBTd2luZ0J1aWxkZXIoKQorZmVlZFRyZWUgPSBuZXcgSlRyZWUodHJlZVRvcCkKK2l0ZW1MaXN0ID0gc3dpbmcubGlzdCgpCitpdGVtVGV4dCA9IHN3aW5nLnRleHRQYW5lKGNvbnRlbnRUeXBlOid0ZXh0L2h0bWwnLCBlZGl0YWJsZTpmYWxzZSkKK21vZGVsID0gZmVlZFRyZWUuc2VsZWN0aW9uTW9kZWwKK21vZGVsLnNlbGVjdGlvbk1vZGUgPSBUcmVlU2VsZWN0aW9uTW9kZWwuU0lOR0xFX1RSRUVfU0VMRUNUSU9OCitpdGVtTGlzdC5zZWxlY3Rpb25Nb2RlID0gTGlzdFNlbGVjdGlvbk1vZGVsLlNJTkdMRV9TRUxFQ1RJT04KKworLy9TZXQgdXAgdGhlIGFjdGlvbiBjbG9zdXJlcyB0aGF0IHdpbGwgcmVhY3QgdG8gdXNlciBzZWxlY3Rpb25zCitsaXN0SXRlbXMgPSB7IGZlZWQgLT4KKyAgcnNzU3RyZWFtID0gY2FsbEJsb2dsaW5lc0dldEl0ZW1zKCI/cz0ke2ZlZWQuaWR9Jm49MCIpICAKKyAgaWYgKHJzc1N0cmVhbSAhPSBudWxsKSB7CisgICAgdHJ5IHsKKyAgICAgIHJzcyA9IG5ldyBYbWxTbHVycGVyKCkucGFyc2UocnNzU3RyZWFtKQorICAgICAgaXRlbUxpc3QubGlzdERhdGEgPSAgcnNzLmNoYW5uZWwuaXRlbS5jb2xsZWN0KG5ldyBWZWN0b3IoKSkgeworCQluZXcgSXRlbSh0aXRsZTppdC50aXRsZSwgZGVzY3JpcHRpb246aXQuZGVzY3JpcHRpb24pCisgICAgICAgfQorICAgICAgIGZlZWQudW5yZWFkID0gIjAiICAvLyB1cGRhdGUgdGhlIHVucmVhZCBpdGVtIGNvdW50IGluIHRoZSBmZWVkIGxpc3QKKyAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICBwcmludGxuICJFcnJvciBkdXJpbmcgPCR7ZmVlZC5uYW1lfT4gUlNTIHBhcnNlOiAke2V9IgorICAgIH0KKyAgfQorfQorCitmZWVkVHJlZS52YWx1ZUNoYW5nZWQgPSB7IGV2ZW50IC0+CisgIGl0ZW1UZXh0LnRleHQgPSAiIiAgLy8gY2xlYXIgYW55IG9sZCBpdGVtIHRleHQKKyAgbm9kZSA9IChEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKSBmZWVkVHJlZS5nZXRMYXN0U2VsZWN0ZWRQYXRoQ29tcG9uZW50KCkKKyAgaWYgKG5vZGUgIT0gbnVsbCkgeworICAgIGZlZWQgPSBub2RlLnVzZXJPYmplY3QKKyAgICAgaWYgKGZlZWQgaW5zdGFuY2VvZiBGZWVkICYmIGZlZWQudW5yZWFkICE9ICIwIikgeworICAgICAgIGxpc3RJdGVtcyhmZWVkKQorICAgICB9CisgIH0KK30KKworaXRlbUxpc3QudmFsdWVDaGFuZ2VkID0geyBldmVudCAtPgorICBpdGVtID0gZXZlbnQuc291cmNlLnNlbGVjdGVkVmFsdWUKKyAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBJdGVtICYmIGl0ZW0/LmRlc2NyaXB0aW9uICE9IG51bGwpIHsKKyAgICBpdGVtVGV4dC50ZXh0ID0gIjxodG1sPjxib2R5PiR7aXRlbS5kZXNjcmlwdGlvbn08L2JvZHk+PC9odG1sPiIKKyAgfQorfQorCisvL1B1dCB0aGUgdXNlciBpbnRlcmZhY2UgdG9nZXRoZXIgYW5kIGRpc3BsYXkgaXQKK2d1aSA9IAorc3dpbmcuZnJhbWUodGl0bGU6J0Jsb2dsaW5lcyBDbGllbnQnLCBsb2NhdGlvbjpbMTAwLDEwMF0sIHNpemU6WzgwMCw2MDBdLCAKKwkgICAgICBkZWZhdWx0Q2xvc2VPcGVyYXRpb246V2luZG93Q29uc3RhbnRzLkVYSVRfT05fQ0xPU0UpIHsKKworIHBhbmVsKGxheW91dDpuZXcgQm9yZGVyTGF5b3V0KCkpIHsKKyAgIHNwbGl0UGFuZShvcmllbnRhdGlvbjpKU3BsaXRQYW5lLkhPUklaT05UQUxfU1BMSVQsIGRpdmlkZXJMb2NhdGlvbjoyMDApIHsKKyAgICAgc2Nyb2xsUGFuZSB7CisJCSAgd2lkZ2V0KGZlZWRUcmVlKQorCSB9CisKKyAgICAgIHNwbGl0UGFuZShvcmllbnRhdGlvbjpKU3BsaXRQYW5lLlZFUlRJQ0FMX1NQTElULCBkaXZpZGVyTG9jYXRpb246MTUwKSB7CisgICAgICAgIHNjcm9sbFBhbmUoY29uc3RyYWludHM6Qm9yZGVyTGF5b3V0LkNFTlRFUikgeworCSAgICAgICAgd2lkZ2V0KGl0ZW1MaXN0KQorCSAgICB9CisKKwkgICAgc2Nyb2xsUGFuZShjb25zdHJhaW50czpCb3JkZXJMYXlvdXQuQ0VOVEVSKSB7CisJICAgICAgd2lkZ2V0KGl0ZW1UZXh0KQorCSAgICB9CisgICAgICB9CisgICAgfQorICB9Cit9CisKK2d1aS5zaG93KCkKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvZXhhbXBsZXMvc3dpbmcvTW9kZWxOb2RlRXhhbXBsZS5ncm9vdnkgYi9ncm9vdnkvc3JjL2V4YW1wbGVzL3N3aW5nL01vZGVsTm9kZUV4YW1wbGUuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZWIyMTEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL2V4YW1wbGVzL3N3aW5nL01vZGVsTm9kZUV4YW1wbGUuZ3Jvb3Z5CkBAIC0wLDAgKzEsNzEgQEAKK2ltcG9ydCBncm9vdnkuc3dpbmcuU3dpbmdCdWlsZGVyDQoraW1wb3J0IHN0YXRpYyBqYXZheC5zd2luZy5XaW5kb3dDb25zdGFudHMuKg0KK2ltcG9ydCBzdGF0aWMgamF2YS5hd3QuR3JpZEJhZ0NvbnN0cmFpbnRzLioNCisNCitkZWYgYmVhbiA9IG5ldyBPYnNlcnZhYmxlTWFwKFtuYW1lOidBbGljZScsIHBob25lOic3MTktNTU1LTEyMTInLCBhZGRyOic0MiBPdGhlciBXYXknXSkNCisNCitkZWYgc3dpbmcgPSBTd2luZ0J1aWxkZXIuYnVpbGQgew0KKyBmcmFtZShpZDonZnJhbWUnLCANCisgICAgICAgcGFjazp0cnVlLCANCisgICAgICAgc2hvdzp0cnVlLA0KKyAgICAgICBkZWZhdWx0Q2xvc2VPcGVyYXRpb246RElTUE9TRV9PTl9DTE9TRSkNCisgew0KKyAgbW9kZWwoYmVhbiwgaWQ6J2JlYW5Nb2RlbCcsIGJpbmQ6ZmFsc2UpDQorDQorICBncmlkQmFnTGF5b3V0KCkNCisNCisgIGxhYmVsKCdOYW1lOicsIGNvbnN0cmFpbnRzOmdiYyhpbnNldHM6WzYsNiwzLDNdKSkNCisgIHRleHRGaWVsZCh0ZXh0OmJlYW5Nb2RlbC5uYW1lLA0KKyAgICAgICAgICAgIGlkOiduYW1lJywNCisgICAgICAgICAgICBjb2x1bW5zOjIwLA0KKyAgICAgICAgICAgIGNvbnN0cmFpbnRzOmdiYyhncmlkd2lkdGg6UkVNQUlOREVSLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsOkhPUklaT05UQUwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodHg6MSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXRzOls2LDMsMyw2XSkpDQorDQorICBsYWJlbCgnUGhvbmU6JywgY29uc3RyYWludHM6Z2JjKGluc2V0czpbMyw2LDMsM10pKQ0KKyAgdGV4dEZpZWxkKHRleHQ6YmVhbk1vZGVsLnBob25lLCANCisgICAgICAgICAgICBpZDoncGhvbmUnLCANCisgICAgICAgICAgICBjb2x1bW5zOjIwLCANCisgICAgICAgICAgICBjb25zdHJhaW50czpnYmMoZ3JpZHdpZHRoOlJFTUFJTkRFUiwgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw6SE9SSVpPTlRBTCwgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodHg6MSwgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2V0czpbMywzLDMsNl0pKQ0KKw0KKyAgbGFiZWwoJ0FkZHJlc3M6JywgY29uc3RyYWludHM6Z2JjKGluc2V0czpbMyw2LDMsM10pKQ0KKyAgdGV4dEZpZWxkKHRleHQ6YmVhbk1vZGVsLmFkZHIsIA0KKyAgICAgICAgICAgIGlkOidhZGRyJywgDQorICAgICAgICAgICAgY29sdW1uczoyMCwgDQorICAgICAgICAgICAgY29uc3RyYWludHM6Z2JjKGdyaWR3aWR0aDpSRU1BSU5ERVIsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsOkhPUklaT05UQUwsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHR4OjEsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNldHM6WzMsMywzLDZdKSkNCisNCisgIGJ1dHRvbignUmVzZXQnLCBhY3Rpb25QZXJmb3JtZWQ6e2JlYW5Nb2RlbC51cGRhdGUoKX0sIA0KKyAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRzOmdiYyhncmlkd2lkdGg6MiwgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvcjpFQVNULCANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0eDoxLCANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXRzOls5LDAsMCw2XSkpDQorICBidXR0b24oJ1N1Ym1pdCcsIA0KKyAgICAgICAgIGNvbnN0cmFpbnRzOmdiYyhpbnNldHM6WzksMCwwLDBdKSwNCisgICAgICAgICBhY3Rpb25QZXJmb3JtZWQ6IHsgDQorICAgICAgICAgICAgIGJlYW5Nb2RlbC5yZXZlcnNlVXBkYXRlKCkNCisgICAgICAgICAgICAgb3V0cHV0LnRleHQgPSAoIm5hbWUgPSAnJGJlYW4ubmFtZSdcbnBob25lID0gJyRiZWFuLnBob25lJ1xuYWRkciA9ICckYmVhbi5hZGRyJ1xuXG4iKQ0KKyAgICAgICAgIH0pDQorDQorICBzZXBhcmF0b3IoY29uc3RyYWludHM6Z2JjKGdyaWR3aWR0aDpSRU1BSU5ERVIsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsOkhPUklaT05UQUwsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNldHM6WzMsNiwzLDZdKSkNCisgIGxhYmVsKCdPdXRwdXQ6JywgY29uc3RyYWludHM6Z2JjKGdyaWR3aWR0aDpSRU1BSU5ERVIsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yOldFU1QsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXRzOlszLDYsMyw2XSkpDQorICBzY3JvbGxQYW5lKHByZWZlcnJlZFNpemU6WzEwMCwgMTAwXSwgDQorICAgICAgICAgICAgIGNvbnN0cmFpbnRzOmdiYyhncmlkd2lkdGg6UkVNQUlOREVSLCANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw6Qk9USCwgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHR5OjEsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXRzOlszLDYsNiw2XSkpIA0KKyAgew0KKyAgIHRleHRBcmVhKGlkOidvdXRwdXQnKQ0KKyAgfQ0KKyB9DQorfQ0KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvZXhhbXBsZXMvc3dpbmcvUmVnZXhDb2FjaC5ncm9vdnkgYi9ncm9vdnkvc3JjL2V4YW1wbGVzL3N3aW5nL1JlZ2V4Q29hY2guZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MjNiMjcKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL2V4YW1wbGVzL3N3aW5nL1JlZ2V4Q29hY2guZ3Jvb3Z5CkBAIC0wLDAgKzEsMTA0IEBACisvLyBHcm9vdnkgUmVnZXggQ29hY2ggLSBDb3B5cmlnaHQgMjAwNyBKZXJlbXkgUmF5bmVyCisvLyBpbnNwaXJlZCBieSBodHRwOi8vd2VpdHouZGUvcmVnZXgtY29hY2gvCitpbXBvcnQgamF2YS5hd3QuKgoraW1wb3J0IGphdmEuYXd0LmV2ZW50LioKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguKgoraW1wb3J0IGphdmF4LnN3aW5nLioKK2ltcG9ydCBqYXZheC5zd2luZy50ZXh0LkRlZmF1bHRIaWdobGlnaHRlcgoraW1wb3J0IGdyb292eS5zd2luZy5Td2luZ0J1aWxkZXIKKworLy8gZGVmaW5lIHRoZSB2aWV3CitkZWYgc3dpbmcgPSBuZXcgU3dpbmdCdWlsZGVyKCkKK2RlZiBndWkgPSBzd2luZy5mcmFtZSh0aXRsZTonVGhlIEdyb292eSBSZWdleCBDb2FjaCcsIGxvY2F0aW9uOlsyMCw0MF0sIHNpemU6WzYwMCw1MDBdLCBkZWZhdWx0Q2xvc2VPcGVyYXRpb246V2luZG93Q29uc3RhbnRzLkVYSVRfT05fQ0xPU0UpIHsKKyAgcGFuZWwobGF5b3V0Om5ldyBCb3JkZXJMYXlvdXQoKSkgeworICAgIHNwbGl0UGFuZShvcmllbnRhdGlvbjpKU3BsaXRQYW5lLlZFUlRJQ0FMX1NQTElULCBkaXZpZGVyTG9jYXRpb246MTUwKSB7CisgICAgICBwYW5lbChsYXlvdXQ6bmV3IEJvcmRlckxheW91dCgpKSB7CisJbGFiZWwoY29uc3RyYWludHM6Qm9yZGVyTGF5b3V0Lk5PUlRILCB0ZXh0OidSZWd1bGFyIGV4cHJlc3Npb246JykKKwlzY3JvbGxQYW5lKGNvbnN0cmFpbnRzOkJvcmRlckxheW91dC5DRU5URVIpIHt0ZXh0UGFuZShpZDoncmVnZXhQYW5lJyl9CisJbGFiZWwoY29uc3RyYWludHM6Qm9yZGVyTGF5b3V0LlNPVVRILCBpZDoncmVnZXhTdGF0dXMnLCB0ZXh0OicgJykKKyAgICAgIH0KKyAgICAgIHBhbmVsKGxheW91dDpuZXcgQm9yZGVyTGF5b3V0KCkpIHsKKwlsYWJlbChjb25zdHJhaW50czpCb3JkZXJMYXlvdXQuTk9SVEgsIHRleHQ6J1RhcmdldCBzdHJpbmc6JykKKwlzY3JvbGxQYW5lKGNvbnN0cmFpbnRzOkJvcmRlckxheW91dC5DRU5URVIpIHt0ZXh0UGFuZShpZDondGFyZ2V0UGFuZScpfQorCXBhbmVsKGNvbnN0cmFpbnRzOkJvcmRlckxheW91dC5TT1VUSCwgbGF5b3V0Om5ldyBCb3JkZXJMYXlvdXQoKSkgeworCSAgbGFiZWwoY29uc3RyYWludHM6Qm9yZGVyTGF5b3V0Lk5PUlRILCBpZDondGFyZ2V0U3RhdHVzJywgdGV4dDonICcpCisJICBwYW5lbChjb25zdHJhaW50czpCb3JkZXJMYXlvdXQuU09VVEgsIGxheW91dDpuZXcgRmxvd0xheW91dCgpKSB7CisJICAgIGJ1dHRvbignPDwtJywgaWQ6J3NjYW5MZWZ0JykKKwkgICAgYnV0dG9uKCctPj4nLCBpZDonc2NhblJpZ2h0JykKKwkgIH0KKwl9CisgICAgICB9CisgICAgfQorICB9Cit9CitkZWYgaGlnaGxpZ2h0ZXIgPSBuZXcgUmVnZXhIaWdobGlnaHRlcihzd2luZzpzd2luZykKK3N3aW5nLnJlZ2V4UGFuZS5hZGRLZXlMaXN0ZW5lcihoaWdobGlnaHRlcikKK3N3aW5nLnRhcmdldFBhbmUuYWRkS2V5TGlzdGVuZXIoaGlnaGxpZ2h0ZXIpCitzd2luZy5zY2FuTGVmdC5hZGRBY3Rpb25MaXN0ZW5lcihoaWdobGlnaHRlcikKK3N3aW5nLnNjYW5SaWdodC5hZGRBY3Rpb25MaXN0ZW5lcihoaWdobGlnaHRlcikKK2d1aS5zaG93KCkKKworY2xhc3MgUmVnZXhIaWdobGlnaHRlciBleHRlbmRzIEtleUFkYXB0ZXIgaW1wbGVtZW50cyBBY3Rpb25MaXN0ZW5lciB7CisgIGRlZiBzd2luZyAvLyByZWZlcmVuY2UgdG8gdGhlIHZpZXcKKyAgaW50IHNjYW5JbmRleCAvLyBob3cgbWFueSB0aW1lcyB0byBleGVjdXRlIG1hdGNoZXIuZmluZCgpCisgIGRlZiBvcmFuZ2UgPSBuZXcgRGVmYXVsdEhpZ2hsaWdodGVyLkRlZmF1bHRIaWdobGlnaHRQYWludGVyKENvbG9yLk9SQU5HRSkKKyAgZGVmIHllbGxvdyA9IG5ldyBEZWZhdWx0SGlnaGxpZ2h0ZXIuRGVmYXVsdEhpZ2hsaWdodFBhaW50ZXIoQ29sb3IuWUVMTE9XKQorICBkZWYgcmVkID0gbmV3IERlZmF1bHRIaWdobGlnaHRlci5EZWZhdWx0SGlnaGxpZ2h0UGFpbnRlcihDb2xvci5SRUQpCisKKyAgLy8gcmVhY3QgdG8gdXNlciBhY3Rpb25zCisgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgeworICAgIGlmIChldmVudC5hY3Rpb25Db21tYW5kID09ICc8PC0nKSB7c2NhbkluZGV4ID0gTWF0aC5tYXgoc2NhbkluZGV4IC0gMSwgMCl9CisgICAgaWYgKGV2ZW50LmFjdGlvbkNvbW1hbmQgPT0gJy0+PicpIHtzY2FuSW5kZXgrK30KKyAgICBkb0hpZ2hsaWdodHMoKQorICB9CisgIHB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGV2ZW50KSB7CisgICAgc2NhbkluZGV4ID0gMAorICAgIGRvSGlnaGxpZ2h0cygpCisgIH0KKworICBwcml2YXRlIHJlc2V0VmlldygpIHsKKyAgICAgIHN3aW5nLnJlZ2V4UGFuZS5oaWdobGlnaHRlci5yZW1vdmVBbGxIaWdobGlnaHRzKCkKKyAgICAgIHN3aW5nLnRhcmdldFBhbmUuaGlnaGxpZ2h0ZXIucmVtb3ZlQWxsSGlnaGxpZ2h0cygpCisgICAgICBzd2luZy5yZWdleFN0YXR1cy50ZXh0ID0gJyAnCisgICAgICBzd2luZy50YXJnZXRTdGF0dXMudGV4dCA9ICcgJworICB9CisKKyAgLy8gdGhlIG1haW4gcmVnZXggbG9naWMKKyAgcHJpdmF0ZSBkb0hpZ2hsaWdodHMoKSB7CisgICAgdHJ5IHsKKyAgICAgIHJlc2V0VmlldygpCisgICAgICAvLyBub3RlOiBnZXQgdGhlIHRleHQgZnJvbSB0aGUgdW5kZXJseWluZyBkb2N1bWVudCwKKyAgICAgIC8vIG90aGVyd2lzZSBjYXJyaWFnZSByZXR1cm4vbGluZSBmZWVkcyBkaWZmZXJlbnQgd2hlbiB1c2luZyB0aGUgSlRleHRQYW5lIHRleHQKKyAgICAgIGRlZiByZWdleCA9IHN3aW5nLnJlZ2V4UGFuZS5kb2N1bWVudC5nZXRUZXh0KDAsc3dpbmcucmVnZXhQYW5lLmRvY3VtZW50Lmxlbmd0aCkKKyAgICAgIGRlZiB0YXJnZXQgPSBzd2luZy50YXJnZXRQYW5lLmRvY3VtZW50LmdldFRleHQoMCxzd2luZy50YXJnZXRQYW5lLmRvY3VtZW50Lmxlbmd0aCkKKworICAgICAgZGVmIG1hdGNoZXIgPSAodGFyZ2V0ID1+IHJlZ2V4KQorCisgICAgICAvLyBzY2FuIHBhc3QgdGhlIG1hdGNoZXMgYmVmb3JlIHRoZSBtYXRjaCB3ZSB3YW50CisgICAgICBpbnQgc2NhbiA9IDAKKyAgICAgIHdoaWxlIChzY2FuIDwgc2NhbkluZGV4KSB7CisJbWF0Y2hlci5maW5kKCkKKwlzY2FuKysKKyAgICAgIH0KKyAgICAgIGlmIChtYXRjaGVyLmZpbmQoKSkgeworCS8vIGhpZ2hsaWdodCBhbnkgY2FwdHVyZWQgZ3JvdXBzCisgICAgICAJaW50IGkgPSAwCisJd2hpbGUgKGkrKyA8IG1hdGNoZXIuZ3JvdXBDb3VudCgpKSB7CisJICBzd2luZy50YXJnZXRQYW5lLmhpZ2hsaWdodGVyLmFkZEhpZ2hsaWdodChtYXRjaGVyLnN0YXJ0KGkpLCBtYXRjaGVyLmVuZChpKSwgb3JhbmdlKQorCX0KKyAgICAgICAJLy8gaGlnaGxpZ2h0IHdob2xlIG1hdGNoCisJc3dpbmcudGFyZ2V0UGFuZS5oaWdobGlnaHRlci5hZGRIaWdobGlnaHQobWF0Y2hlci5zdGFydCgpLCBtYXRjaGVyLmVuZCgpLCB5ZWxsb3cpCisJaWYgKHJlZ2V4Lmxlbmd0aCgpICE9IDApIHsKKwkgIHN3aW5nLnRhcmdldFN0YXR1cy50ZXh0ID0gIk1hdGNoICMke3NjYW5JbmRleCArIDF9IGZyb20gJHttYXRjaGVyLnN0YXJ0KCl9IHRvICR7bWF0Y2hlci5lbmQoKX0uIgorCX0KKyAgICAgIH0gZWxzZSB7IC8vIG5vdCBmb3VuZAorCXNjYW5JbmRleCA9IE1hdGgubWF4KHNjYW4gLSAxLCAwKQorCWlmIChzY2FuSW5kZXggPiAwKSB7ZG9IaWdobGlnaHRzKCl9CisJc3dpbmcudGFyZ2V0U3RhdHVzLnRleHQgPSAiTm8gbWF0Y2guIgorICAgICAgfQorICAgIH0gY2F0Y2ggKFBhdHRlcm5TeW50YXhFeGNlcHRpb24gZSkgeworICAgICAgc3dpbmcucmVnZXhQYW5lLmhpZ2hsaWdodGVyLmFkZEhpZ2hsaWdodChlLmluZGV4LCBlLmluZGV4ICsgMiwgcmVkKQorICAgICAgc3dpbmcucmVnZXhTdGF0dXMudGV4dCA9IGUuZGVzY3JpcHRpb24KKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvZXhhbXBsZXMvc3dpbmcvUmVnZXhDb2FjaENvbnRyb2xsZXIuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy9leGFtcGxlcy9zd2luZy9SZWdleENvYWNoQ29udHJvbGxlci5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE2MjhlZgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvZXhhbXBsZXMvc3dpbmcvUmVnZXhDb2FjaENvbnRyb2xsZXIuZ3Jvb3Z5CkBAIC0wLDAgKzEsODkgQEAKKy8vIEdyb292eSBSZWdleCBDb2FjaCAtIENvcHlyaWdodCAyMDA3IEplcmVteSBSYXluZXINCisNCitpbXBvcnQgZ3Jvb3Z5LnN3aW5nLlN3aW5nQnVpbGRlcg0KK2ltcG9ydCBqYXZhLmF3dC5Db2xvcg0KK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudA0KK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcg0KK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5LZXlBZGFwdGVyDQoraW1wb3J0IGphdmEuYXd0LmV2ZW50LktleUV2ZW50DQoraW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuU3ludGF4RXhjZXB0aW9uDQoraW1wb3J0IGphdmF4LnN3aW5nLnRleHQuRGVmYXVsdEhpZ2hsaWdodGVyLkRlZmF1bHRIaWdobGlnaHRQYWludGVyDQorDQorLy8gaW5zcGlyZWQgYnkgaHR0cDovL3dlaXR6LmRlL3JlZ2V4LWNvYWNoLw0KKw0KKy8vIGRlZmluZSB0aGUgdmlldw0KK2RlZiBzd2luZyA9IG5ldyBTd2luZ0J1aWxkZXIoKQ0KKw0KK2RlZiBndWkgPSBzd2luZy5idWlsZChSZWdleENvYWNoVmlldykNCisNCitkZWYgaGlnaGxpZ2h0ZXIgPSBuZXcgUmVnZXhIaWdobGl0ZXIoc3dpbmc6IHN3aW5nKQ0KK3N3aW5nLnJlZ2V4UGFuZS5hZGRLZXlMaXN0ZW5lcihoaWdobGlnaHRlcikNCitzd2luZy50YXJnZXRQYW5lLmFkZEtleUxpc3RlbmVyKGhpZ2hsaWdodGVyKQ0KK3N3aW5nLnNjYW5MZWZ0LmFkZEFjdGlvbkxpc3RlbmVyKGhpZ2hsaWdodGVyKQ0KK3N3aW5nLnNjYW5SaWdodC5hZGRBY3Rpb25MaXN0ZW5lcihoaWdobGlnaHRlcikNCitndWkuc2hvdygpDQorDQorY2xhc3MgUmVnZXhIaWdobGl0ZXIgZXh0ZW5kcyBLZXlBZGFwdGVyIGltcGxlbWVudHMgQWN0aW9uTGlzdGVuZXIgew0KKyAgICBkZWYgc3dpbmcgLy8gcmVmZXJlbmNlIHRvIHRoZSB2aWV3DQorICAgIGludCBzY2FuSW5kZXggLy8gaG93IG1hbnkgdGltZXMgdG8gZXhlY3V0ZSBtYXRjaGVyLmZpbmQoKQ0KKyAgICBkZWYgb3JhbmdlID0gbmV3IERlZmF1bHRIaWdobGlnaHRQYWludGVyKENvbG9yLk9SQU5HRSkNCisgICAgZGVmIHllbGxvdyA9IG5ldyBEZWZhdWx0SGlnaGxpZ2h0UGFpbnRlcihDb2xvci5ZRUxMT1cpDQorICAgIGRlZiByZWQgPSBuZXcgRGVmYXVsdEhpZ2hsaWdodFBhaW50ZXIoQ29sb3IuUkVEKQ0KKw0KKyAgICAvLyByZWFjdCB0byB1c2VyIGFjdGlvbnMNCisgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7DQorICAgICAgICBpZiAoZXZlbnQuYWN0aW9uQ29tbWFuZCA9PSAnPDwtJykge3NjYW5JbmRleCA9IE1hdGgubWF4KHNjYW5JbmRleCAtIDEsIDApfQ0KKyAgICAgICAgaWYgKGV2ZW50LmFjdGlvbkNvbW1hbmQgPT0gJy0+PicpIHtzY2FuSW5kZXgrK30NCisgICAgICAgIGRvSGlnaGxpZ2h0cygpDQorICAgIH0NCisgICAgcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZXZlbnQpIHsNCisgICAgICAgIHNjYW5JbmRleCA9IDANCisgICAgICAgIGRvSGlnaGxpZ2h0cygpDQorICAgIH0NCisNCisgICAgcHJpdmF0ZSByZXNldFZpZXcoKSB7DQorICAgICAgICBzd2luZy5yZWdleFBhbmUuaGlnaGxpZ2h0ZXIucmVtb3ZlQWxsSGlnaGxpZ2h0cygpDQorICAgICAgICBzd2luZy50YXJnZXRQYW5lLmhpZ2hsaWdodGVyLnJlbW92ZUFsbEhpZ2hsaWdodHMoKQ0KKyAgICAgICAgc3dpbmcucmVnZXhTdGF0dXMudGV4dCA9ICcgJw0KKyAgICAgICAgc3dpbmcudGFyZ2V0U3RhdHVzLnRleHQgPSAnICcNCisgICAgfQ0KKw0KKyAgICAvLyB0aGUgbWFpbiByZWdleCBsb2dpYw0KKyAgICBwcml2YXRlIGRvSGlnaGxpZ2h0cygpIHsNCisgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgcmVzZXRWaWV3KCkNCisgICAgICAgICAgICAvLyBub3RlOiBnZXQgdGhlIHRleHQgZnJvbSB0aGUgdW5kZXJseWluZyBkb2N1bWVudCwNCisgICAgICAgICAgICAvLyBvdGhlcndpc2UgY2FycmlhZ2UgcmV0dXJuL2xpbmUgZmVlZHMgZGlmZmVyZW50IHdoZW4gdXNpbmcgdGhlIEpUZXh0UGFuZSB0ZXh0DQorICAgICAgICAgICAgZGVmIHJlZ2V4ID0gc3dpbmcucmVnZXhQYW5lLmRvY3VtZW50LmdldFRleHQoMCwgc3dpbmcucmVnZXhQYW5lLmRvY3VtZW50Lmxlbmd0aCkNCisgICAgICAgICAgICBkZWYgdGFyZ2V0ID0gc3dpbmcudGFyZ2V0UGFuZS5kb2N1bWVudC5nZXRUZXh0KDAsIHN3aW5nLnRhcmdldFBhbmUuZG9jdW1lbnQubGVuZ3RoKQ0KKw0KKyAgICAgICAgICAgIGRlZiBtYXRjaGVyID0gKHRhcmdldCA9fiByZWdleCkNCisNCisgICAgICAgICAgICAvLyBzY2FuIHBhc3QgdGhlIG1hdGNoZXMgYmVmb3JlIHRoZSBtYXRjaCB3ZSB3YW50DQorICAgICAgICAgICAgaW50IHNjYW4gPSAwDQorICAgICAgICAgICAgd2hpbGUgKHNjYW4gPCBzY2FuSW5kZXgpIHsNCisgICAgICAgICAgICAgICAgbWF0Y2hlci5maW5kKCkNCisgICAgICAgICAgICAgICAgc2NhbisrDQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChtYXRjaGVyLmZpbmQoKSkgew0KKyAgICAgICAgICAgICAgICAvLyBoaWdobGlnaHQgYW55IGNhcHR1cmVkIGdyb3Vwcw0KKyAgICAgICAgICAgICAgICBpbnQgaSA9IDANCisgICAgICAgICAgICAgICAgd2hpbGUgKGkrKyA8IG1hdGNoZXIuZ3JvdXBDb3VudCgpKSB7DQorICAgICAgICAgICAgICAgICAgICBzd2luZy50YXJnZXRQYW5lLmhpZ2hsaWdodGVyLmFkZEhpZ2hsaWdodChtYXRjaGVyLnN0YXJ0KGkpLCBtYXRjaGVyLmVuZChpKSwgb3JhbmdlKQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIC8vIGhpZ2hsaWdodCB3aG9sZSBtYXRjaA0KKyAgICAgICAgICAgICAgICBzd2luZy50YXJnZXRQYW5lLmhpZ2hsaWdodGVyLmFkZEhpZ2hsaWdodChtYXRjaGVyLnN0YXJ0KCksIG1hdGNoZXIuZW5kKCksIHllbGxvdykNCisgICAgICAgICAgICAgICAgaWYgKHJlZ2V4Lmxlbmd0aCgpICE9IDApIHsNCisgICAgICAgICAgICAgICAgICAgIHN3aW5nLnRhcmdldFN0YXR1cy50ZXh0ID0gIk1hdGNoICMke3NjYW5JbmRleCArIDF9IGZyb20gJHttYXRjaGVyLnN0YXJ0KCl9IHRvICR7bWF0Y2hlci5lbmQoKX0uIg0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfSBlbHNlIHsvLyBub3QgZm91bmQNCisgICAgICAgICAgICAgICAgc2NhbkluZGV4ID0gTWF0aC5tYXgoc2NhbiAtIDEsIDApDQorICAgICAgICAgICAgICAgIGlmIChzY2FuSW5kZXggPiAwKSB7ZG9IaWdobGlnaHRzKCl9DQorICAgICAgICAgICAgICAgIHN3aW5nLnRhcmdldFN0YXR1cy50ZXh0ID0gIk5vIG1hdGNoLiINCisgICAgICAgICAgICB9DQorICAgICAgICB9IGNhdGNoIChQYXR0ZXJuU3ludGF4RXhjZXB0aW9uIGUpIHsNCisgICAgICAgICAgICBzd2luZy5yZWdleFBhbmUuaGlnaGxpZ2h0ZXIuYWRkSGlnaGxpZ2h0KGUuaW5kZXgsIGUuaW5kZXggKyAyLCByZWQpDQorICAgICAgICAgICAgc3dpbmcucmVnZXhTdGF0dXMudGV4dCA9IGUuZGVzY3JpcHRpb24NCisgICAgICAgIH0NCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL2V4YW1wbGVzL3N3aW5nL1JlZ2V4Q29hY2hWaWV3Lmdyb292eSBiL2dyb292eS9zcmMvZXhhbXBsZXMvc3dpbmcvUmVnZXhDb2FjaFZpZXcuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZDYxYjgKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL2V4YW1wbGVzL3N3aW5nL1JlZ2V4Q29hY2hWaWV3Lmdyb292eQpAQCAtMCwwICsxLDM1IEBACitpbXBvcnQgc3RhdGljIGphdmEuYXd0LkJvcmRlckxheW91dC4qDQoraW1wb3J0IHN0YXRpYyBqYXZheC5zd2luZy5KU3BsaXRQYW5lLlZFUlRJQ0FMX1NQTElUDQoraW1wb3J0IHN0YXRpYyBqYXZheC5zd2luZy5XaW5kb3dDb25zdGFudHMuRVhJVF9PTl9DTE9TRQ0KKw0KK2ZyYW1lKHRpdGxlOiAnVGhlIEdyb292eSBSZWdleCBDb2FjaCcsIGxvY2F0aW9uOiBbMjAsIDQwXSwgc2l6ZTogWzYwMCwgNTAwXSwgZGVmYXVsdENsb3NlT3BlcmF0aW9uOiBFWElUX09OX0NMT1NFKSB7DQorICAgIHBhbmVsIHsNCisgICAgICAgIGJvcmRlckxheW91dCgpDQorICAgICAgICBzcGxpdFBhbmUob3JpZW50YXRpb246IFZFUlRJQ0FMX1NQTElULCBkaXZpZGVyTG9jYXRpb246IDE1MCkgew0KKyAgICAgICAgICAgIHBhbmVsIHsNCisgICAgICAgICAgICAgICAgYm9yZGVyTGF5b3V0KCkNCisgICAgICAgICAgICAgICAgbGFiZWwoY29uc3RyYWludHM6IE5PUlRILCB0ZXh0OiAnUmVndWxhciBleHByZXNzaW9uOicpDQorICAgICAgICAgICAgICAgIHNjcm9sbFBhbmUoY29uc3RyYWludHM6IENFTlRFUikgew0KKyAgICAgICAgICAgICAgICAgICAgdGV4dFBhbmUoaWQ6ICdyZWdleFBhbmUnKQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGxhYmVsKGNvbnN0cmFpbnRzOiBTT1VUSCwgaWQ6ICdyZWdleFN0YXR1cycsIHRleHQ6ICcgJykNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcGFuZWwgew0KKyAgICAgICAgICAgICAgICBib3JkZXJMYXlvdXQoKQ0KKyAgICAgICAgICAgICAgICBsYWJlbChjb25zdHJhaW50czogTk9SVEgsIHRleHQ6ICdUYXJnZXQgc3RyaW5nOicpDQorICAgICAgICAgICAgICAgIHNjcm9sbFBhbmUoY29uc3RyYWludHM6IENFTlRFUikgew0KKyAgICAgICAgICAgICAgICAgICAgdGV4dFBhbmUoaWQ6ICd0YXJnZXRQYW5lJykNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBwYW5lbChjb25zdHJhaW50czogU09VVEgpIHsNCisgICAgICAgICAgICAgICAgICAgIGJvcmRlckxheW91dCgpDQorICAgICAgICAgICAgICAgICAgICBsYWJlbChjb25zdHJhaW50czogTk9SVEgsIGlkOiAndGFyZ2V0U3RhdHVzJywgdGV4dDogJyAnKQ0KKyAgICAgICAgICAgICAgICAgICAgcGFuZWwoY29uc3RyYWludHM6IFNPVVRIKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgZmxvd0xheW91dCgpDQorICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uKCc8PC0nLCBpZDogJ3NjYW5MZWZ0JykNCisgICAgICAgICAgICAgICAgICAgICAgICBidXR0b24oJy0+PicsIGlkOiAnc2NhblJpZ2h0JykNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL2V4YW1wbGVzL3N3aW5nL1dpZGdldHMuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy9leGFtcGxlcy9zd2luZy9XaWRnZXRzLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2ExNWM5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9leGFtcGxlcy9zd2luZy9XaWRnZXRzLmdyb292eQpAQCAtMCwwICsxLDIwNCBAQAorcGFja2FnZSBzd2luZworCitpbXBvcnQgamF2YS5hd3QuQm9yZGVyTGF5b3V0CitpbXBvcnQgamF2YS5hd3QuQ29sb3IKK2ltcG9ydCBqYXZhLmF3dC5HcmlkQmFnQ29uc3RyYWludHMKK2ltcG9ydCBqYXZheC5zd2luZy5Td2luZ0NvbnN0YW50cworaW1wb3J0IGphdmF4LnN3aW5nLldpbmRvd0NvbnN0YW50cworaW1wb3J0IGdyb292eS5zd2luZy5Td2luZ0J1aWxkZXIKKworY2xhc3MgV2lkZ2V0cyB7CisKKyAgICBkZWYgc3dpbmcgPSBuZXcgU3dpbmdCdWlsZGVyKCkKKyAgICBkZWYgdW5vd25lZERpYWxvZworICAgIGRlZiBvd25lZERpYWxvZworICAgIAorCisgICAgc3RhdGljIHZvaWQgbWFpbihhcmdzKSB7CisgICAgICAgIGRlZiBkZW1vID0gbmV3IFdpZGdldHMoKQorICAgICAgICBkZW1vLnJ1bigpCisgICAgfQorCisgICAgZGVmIHNob3dVbm93bmVkRGlhbG9nKGV2ZW50KSB7CisgICAgICAgIHVub3duZWREaWFsb2cuc2hvdygpOworICAgIH0KKyAgICAKKyAgICBkZWYgc2hvd093bmVkRGlhbG9nKGV2ZW50KSB7CisgICAgICAgIG93bmVkRGlhbG9nLnNob3coKTsKKyAgICB9CisKKyAgICB2b2lkIHJ1bigpIHsKKyAgICAgICAgdW5vd25lZERpYWxvZyA9IHN3aW5nLmRpYWxvZygKKyAgICAgICAgICAgIHRpdGxlOid1bnJvb3RlZCBkaWFsb2cnLAorICAgICAgICAgICAgbG9jYXRpb246IFsyMDAsIDIwMF0sCisgICAgICAgICAgICBwYWNrOnRydWUsCisgICAgICAgICAgICBkZWZhdWx0Q2xvc2VPcGVyYXRpb246V2luZG93Q29uc3RhbnRzLkRJU1BPU0VfT05fQ0xPU0UKKyAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgIGxhYmVsKCJJIGFtIHVub3duZWQsIGJ1dCBub3QgdW53YW50ZWQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBkZWYgZnJhbWUgPSBzd2luZy5mcmFtZSgKKyAgICAgICAgICAgIHRpdGxlOidGcmFtZVRpdGxlJywKKyAgICAgICAgICAgIGxvY2F0aW9uOlsxMDAsMTAwXSwKKyAgICAgICAgICAgIHNpemU6WzgwMCw0MDBdLAorICAgICAgICAgICAgZGVmYXVsdENsb3NlT3BlcmF0aW9uOldpbmRvd0NvbnN0YW50cy5FWElUX09OX0NMT1NFKSB7CisKKyAgICAgICAgICAgIG1lbnVCYXIgeworICAgICAgICAgICAgICAgIG1lbnUodGV4dDonRmlsZScpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVudUl0ZW0oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24obmFtZTonTmV3JywgY2xvc3VyZTp7IHByaW50bG4oImNsaWNrZWQgb24gdGhlIG5ldyBtZW51IGl0ZW0hIikgfSkKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtZW51SXRlbSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbihuYW1lOidPcGVuJywgY2xvc3VyZTp7IHByaW50bG4oImNsaWNrZWQgb24gdGhlIG9wZW4gbWVudSBpdGVtISIpIH0pCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc2VwYXJhdG9yKCkKKyAgICAgICAgICAgICAgICAgICAgbWVudUl0ZW0oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24obmFtZTonU2F2ZScsIGVuYWJsZWQ6ZmFsc2UsIGNsb3N1cmU6eyBwcmludGxuKCJjbGlja2VkIG9uIHRoZSBTYXZlIG1lbnUgaXRlbSEiKSB9KQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1lbnUodGV4dDonRGlhbG9ncycpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVudUl0ZW0oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24obmFtZTonT3duZWQgRGlhbG9nJywgY2xvc3VyZTogdGhpcy4mc2hvd093bmVkRGlhbG9nKQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1lbnVJdGVtKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uKG5hbWU6J1Vub3duZWQgRGlhbG9nJywgY2xvc3VyZTogdGhpcy4mc2hvd1Vub3duZWREaWFsb2cpCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZGVmIGRlZXBseU93bmVkRGlhbG9nID0gc3dpbmcuZGlhbG9nKAorICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6J3Jvb3RlZCBkaWFsb2cgIzInLAorICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb246IFsyMDAsIDIwMF0sCisgICAgICAgICAgICAgICAgICAgICAgICBwYWNrOnRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Q2xvc2VPcGVyYXRpb246V2luZG93Q29uc3RhbnRzLkRJU1BPU0VfT05fQ0xPU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwoIm93bmVyc2hpcCBpcyBkZWVwIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbWVudUl0ZW0oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24obmFtZTonRGVlcGx5IE93bmVkIERpYWxvZycsIGNsb3N1cmU6IHtkZWVwbHlPd25lZERpYWxvZy5zaG93KCl9ICkKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGFiYmVkUGFuZSgpIHsKKworICAgICAgICAgICAgICAgIC8vY29sb3JDaG9vc2VyKAorICAgICAgICAgICAgICAgIC8vICAgIG5hbWU6IkNvbG9yIENob29zZXIiLAorICAgICAgICAgICAgICAgIC8vICAgIGNvbG9yOiAweGZlZWQ0MikKKworICAgICAgICAgICAgICAgIHBhbmVsKG5hbWU6IkZvcm1hdHRlZCBUZXh0IEZpZWxkcyIpIHsKKyAgICAgICAgICAgICAgICAgICAgZ3JpZExheW91dChjb2x1bW5zOiAyLCByb3dzOiAwKQorICAgICAgICAgICAgICAgICAgICBsYWJlbCgiU2ltcGxlIENvbnN0cnVjdG9yOiIpCisgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZFRleHRGaWVsZCgpCisgICAgICAgICAgICAgICAgICAgIGxhYmVsKCJEYXRlIFZhbHVlIikKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkVGV4dEZpZWxkKHZhbHVlOiBuZXcgamF2YS51dGlsLkRhdGUoKSkKKyAgICAgICAgICAgICAgICAgICAgbGFiZWwoIkludGVnZXIgVmFsdWUiKQorICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWRUZXh0RmllbGQodmFsdWU6IG5ldyBqYXZhLmxhbmcuSW50ZWdlcig0MikpCisgICAgICAgICAgICAgICAgICAgIGxhYmVsKCJEYXRlIEZvcm1hdCIpCisgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZFRleHRGaWVsZChmb3JtYXQ6IGphdmEudGV4dC5EYXRlRm9ybWF0LmdldERhdGVJbnN0YW5jZSgpKQorICAgICAgICAgICAgICAgICAgICBsYWJlbCgiQ3VycmVuY3kgRm9ybWF0ICIpCisgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZFRleHRGaWVsZChmb3JtYXQ6IG5ldyBqYXZhLnRleHQuRGVjaW1hbEZvcm1hdCgiwqQjIyMuMDA7KMKkIyMjLjAwKSIpKQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHBhbmVsKG5hbWU6IlNsaWRlcnMiKSB7CisgICAgICAgICAgICAgICAgICAgIGZsb3dMYXlvdXQoKQorICAgICAgICAgICAgICAgICAgICBzbGlkZXIobWluaW11bTotMTAwLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heGltdW06MTAwLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ham9yVGlja1NwYWNpbmc6IDUwLAorICAgICAgICAgICAgICAgICAgICAgICAgb3JpZW50YXRpb246IFN3aW5nQ29uc3RhbnRzLlZFUlRJQ0FMLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50TGFiZWxzOnRydWUpCisgICAgICAgICAgICAgICAgICAgIHNsaWRlcihtaW5pbXVtOi0xMDAsIAorICAgICAgICAgICAgICAgICAgICAgICAgbWF4aW11bToxMDAsIAorICAgICAgICAgICAgICAgICAgICAgICAgb3JpZW50YXRpb246IFN3aW5nQ29uc3RhbnRzLlZFUlRJQ0FMLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50TGFiZWxzOnRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICBwYWludFRpY2tzOnRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICBtYWpvclRpY2tTcGFjaW5nOiA1MCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbm9yVGlja1NwYWNpbmc6IDEwLAorICAgICAgICAgICAgICAgICAgICAgICAgc25hcFRvVGlja3M6dHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50VHJhY2s6dHJ1ZSkKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwYW5lbChuYW1lOiJTcGlubmVycyIpIHsKKyAgICAgICAgICAgICAgICAgICAgZ3JpZEJhZ0xheW91dCgpCisgICAgICAgICAgICAgICAgICAgIGxhYmVsKAorICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDoiVGVtcHVhdHVyZSBpbiBMb25kb246IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRzOiBnYmMoaW5zZXRzOlsxMiwgMTIsIDIsIDJdLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNob3I6IEdyaWRCYWdDb25zdHJhaW50cy5FQVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyaWR4OiAwKSkKKyAgICAgICAgICAgICAgICAgICAgc3Bpbm5lcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsOnNwaW5uZXJOdW1iZXJNb2RlbChtaW5pbXVtOi0xMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4aW11bTogNDAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOjIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBTaXplOjUpLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludHM6IGdiYyhpbnNldHM6WzEyLCAzLCAyLCAxMl0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvcjogR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JpZHg6IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbDogR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwpKQorICAgICAgICAgICAgICAgICAgICBsYWJlbCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IkJhc2ViYWxsIExlYWd1ZXM6IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRzOiBnYmMoaW5zZXRzOlszLCAxMiwgMiwgMl0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvcjogR3JpZEJhZ0NvbnN0cmFpbnRzLkVBU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JpZHg6IDApKQorICAgICAgICAgICAgICAgICAgICBzcGlubmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWw6c3Bpbm5lckxpc3RNb2RlbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0OiBbIk1ham9yIExlYWd1ZSIsICJBQUEiLCAiQUEiLCAiQSIsICJSb29raWUiLCAiU2VtaS1Qcm8iLCAiUmVjIEEiLCAiUmVjIEIiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogIkFBIiksCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50czogZ2JjKGluc2V0czpbMywgMywgMiwgMTJdLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNob3I6IEdyaWRCYWdDb25zdHJhaW50cy5XRVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyaWR4OiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw6IEdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMKSkKKyAgICAgICAgICAgICAgICAgICAgbGFiZWwoCisgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiJUb2RheSdzIERhdGU6IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRzOiBnYmMoaW5zZXRzOlszLCAxMiwgMiwgMl0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvcjogR3JpZEJhZ0NvbnN0cmFpbnRzLkVBU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JpZHg6IDApKQorICAgICAgICAgICAgICAgICAgICBzcGlubmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWw6c3Bpbm5lckRhdGVNb2RlbChjYWxlbmRhckZpZWxkOiBDYWxlbmRhci5IT1VSX09GX0RBWSksCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50czogZ2JjKGluc2V0czpbMywgMywgMiwgMTJdLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNob3I6IEdyaWRCYWdDb25zdHJhaW50cy5XRVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyaWR4OiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw6IEdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMKSkKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwYW5lbChuYW1lOiJCb3JkZXIgTGF5b3V0IikgeworICAgICAgICAgICAgICAgICAgICBib3JkZXJMYXlvdXQoKQorICAgICAgICAgICAgICAgICAgICBsYWJlbCh0ZXh0OiJCb3JkZXIgTGF5b3V0IiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRzOkJvcmRlckxheW91dC5OT1JUSCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhvcml6b250YWxBbGlnbm1lbnQ6U3dpbmdDb25zdGFudHMuQ0VOVEVSKQorICAgICAgICAgICAgICAgICAgICBsYWJlbCh0ZXh0OiJTb3V0aCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50czpCb3JkZXJMYXlvdXQuU09VVEgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOkNvbG9yLllFTExPVywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3BhcXVlOnRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhvcml6b250YWxBbGlnbm1lbnQ6U3dpbmdDb25zdGFudHMuQ0VOVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sVGlwVGV4dDoiVG9vbHRpcCBvbiBzb3V0aCIpCisgICAgICAgICAgICAgICAgICAgIGxhYmVsKHRleHQ6Ildlc3QiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludHM6Qm9yZGVyTGF5b3V0LldFU1QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOkNvbG9yLk9SQU5HRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3BhcXVlOnRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhvcml6b250YWxBbGlnbm1lbnQ6U3dpbmdDb25zdGFudHMuQ0VOVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sVGlwVGV4dDoiVG9vbHRpcCBvbiB3ZXN0IikKKyAgICAgICAgICAgICAgICAgICAgbGFiZWwodGV4dDoiRWFzdCIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50czpCb3JkZXJMYXlvdXQuRUFTVCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6Q29sb3IuR1JFRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIG9wYXF1ZTp0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBob3Jpem9udGFsQWxpZ25tZW50OlN3aW5nQ29uc3RhbnRzLkNFTlRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbFRpcFRleHQ6IlRvb2x0aXAgb24gZWFzdCIpCisgICAgICAgICAgICAgICAgICAgIGxhYmVsKHRleHQ6IkNlbnRlciIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50czpCb3JkZXJMYXlvdXQuQ0VOVEVSLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDpDb2xvci5XSElURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3BhcXVlOnRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhvcml6b250YWxBbGlnbm1lbnQ6U3dpbmdDb25zdGFudHMuQ0VOVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sVGlwVGV4dDoiPGh0bWw+VGhpcyBpcyBub3QgdGhlIHRvb2x0aXAgeW91IGFyZSBsb29raW5nIGZvci48YnI+PGk+KndhdmVzIGhhbmQqPC9pPiIpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvd25lZERpYWxvZyA9IHN3aW5nLmRpYWxvZygKKyAgICAgICAgICAgICAgICB0aXRsZToncm9vdGVkIGRpYWxvZycsCisgICAgICAgICAgICAgICAgbG9jYXRpb246IFsyMDAsIDIwMF0sCisgICAgICAgICAgICAgICAgcGFjazp0cnVlLAorICAgICAgICAgICAgICAgIGRlZmF1bHRDbG9zZU9wZXJhdGlvbjpXaW5kb3dDb25zdGFudHMuRElTUE9TRV9PTl9DTE9TRQorICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgIGxhYmVsKCJqMDAgaDR2MyBiMzNuIDB3bjN4ZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAgICAgICAgCisgICAgICAgIGZyYW1lLnNob3coKQorICAgIH0KKyAgICAKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvZXhhbXBsZXMvd2ViYXBwcy9ncm9vdmxldC1leGFtcGxlcy9XRUItSU5GL2dyb292eS9BbmltYWwuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy9leGFtcGxlcy93ZWJhcHBzL2dyb292bGV0LWV4YW1wbGVzL1dFQi1JTkYvZ3Jvb3Z5L0FuaW1hbC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NkYWExNwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvZXhhbXBsZXMvd2ViYXBwcy9ncm9vdmxldC1leGFtcGxlcy9XRUItSU5GL2dyb292eS9BbmltYWwuZ3Jvb3Z5CkBAIC0wLDAgKzEsNSBAQAoraW50ZXJmYWNlIEFuaW1hbCB7CisKKyAgU3RyaW5nIHNheVNvbWV0aGluZyhTdHJpbmcgc29tZXRoaW5nKTsKKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9leGFtcGxlcy93ZWJhcHBzL2dyb292bGV0LWV4YW1wbGVzL1dFQi1JTkYvZ3Jvb3Z5L3pvby9GaXNoLmdyb292eSBiL2dyb292eS9zcmMvZXhhbXBsZXMvd2ViYXBwcy9ncm9vdmxldC1leGFtcGxlcy9XRUItSU5GL2dyb292eS96b28vRmlzaC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk0ZDVhOAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvZXhhbXBsZXMvd2ViYXBwcy9ncm9vdmxldC1leGFtcGxlcy9XRUItSU5GL2dyb292eS96b28vRmlzaC5ncm9vdnkKQEAgLTAsMCArMSw5IEBACitwYWNrYWdlIHpvbworCithYnN0cmFjdCBjbGFzcyBGaXNoIGltcGxlbWVudHMgQW5pbWFsIHsKKworICBTdHJpbmcgc2F5U29tZXRoaW5nKFN0cmluZyBzb21ldGhpbmcpIHsKKyAgICByZXR1cm4gIkJsdWJisDogIiArIHNvbWV0aGluZyArICIuLi4iCisgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9leGFtcGxlcy93ZWJhcHBzL2dyb292bGV0LWV4YW1wbGVzL1dFQi1JTkYvZ3Jvb3Z5L3pvby9maXNoL1NoYXJrLmdyb292eSBiL2dyb292eS9zcmMvZXhhbXBsZXMvd2ViYXBwcy9ncm9vdmxldC1leGFtcGxlcy9XRUItSU5GL2dyb292eS96b28vZmlzaC9TaGFyay5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZkZjEwYwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvZXhhbXBsZXMvd2ViYXBwcy9ncm9vdmxldC1leGFtcGxlcy9XRUItSU5GL2dyb292eS96b28vZmlzaC9TaGFyay5ncm9vdnkKQEAgLTAsMCArMSwxMSBAQAorcGFja2FnZSB6b28uZmlzaAorCitpbXBvcnQgem9vLkZpc2gKKworY2xhc3MgU2hhcmsgZXh0ZW5kcyBGaXNoIHsKKworICBTdHJpbmcgc2F5U29tZXRoaW5nKFN0cmluZyBzb21ldGhpbmcpIHsKKyAgICByZXR1cm4gIlNoYXJrIGJpdGVzICIgKyBzb21ldGhpbmcgKyAiLi4uUk9PT0FSsCEiCisgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9leGFtcGxlcy93ZWJhcHBzL2dyb292bGV0LWV4YW1wbGVzL1dFQi1JTkYvZ3Jvb3Z5L3pvby9maXNoL1Ryb3V0Lmdyb292eSBiL2dyb292eS9zcmMvZXhhbXBsZXMvd2ViYXBwcy9ncm9vdmxldC1leGFtcGxlcy9XRUItSU5GL2dyb292eS96b28vZmlzaC9Ucm91dC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFhOGYwMwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvZXhhbXBsZXMvd2ViYXBwcy9ncm9vdmxldC1leGFtcGxlcy9XRUItSU5GL2dyb292eS96b28vZmlzaC9Ucm91dC5ncm9vdnkKQEAgLTAsMCArMSw5IEBACitwYWNrYWdlIHpvby5maXNoCisKK2NsYXNzIFRyb3V0IGV4dGVuZHMgem9vLkZpc2ggeworCisgIFN0cmluZyBzYXlTb21ldGhpbmcoU3RyaW5nIHNvbWV0aGluZykgeworICAgIHJldHVybiAiVHJvdXQgc2F5cyAiICsgc29tZXRoaW5nICsgIi4uLmJsdWJisCEiCisgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9leGFtcGxlcy93ZWJhcHBzL2dyb292bGV0LWV4YW1wbGVzL1dFQi1JTkYvd2ViLnhtbCBiL2dyb292eS9zcmMvZXhhbXBsZXMvd2ViYXBwcy9ncm9vdmxldC1leGFtcGxlcy9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE4NjI2YQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvZXhhbXBsZXMvd2ViYXBwcy9ncm9vdmxldC1leGFtcGxlcy9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSw2OSBAQAorPHdlYi1hcHAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCisgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS93ZWItYXBwXzJfMy54c2QiCisgICAgdmVyc2lvbj0iMi4zIj4KKworICA8c2VydmxldD4KKyAgICA8c2VydmxldC1uYW1lPkdyb292bGV0PC9zZXJ2bGV0LW5hbWU+CisgICAgPHNlcnZsZXQtY2xhc3M+Z3Jvb3Z5LnNlcnZsZXQuR3Jvb3Z5U2VydmxldDwvc2VydmxldC1jbGFzcz4KKyAgICA8aW5pdC1wYXJhbT4KKyAgICAgIDxwYXJhbS1uYW1lPnZlcmJvc2U8L3BhcmFtLW5hbWU+CisgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+CisgICAgPC9pbml0LXBhcmFtPgorICAgIDxpbml0LXBhcmFtPgorICAgICAgPHBhcmFtLW5hbWU+cmVzb3VyY2UubmFtZS5yZWdleDwvcGFyYW0tbmFtZT4KKyAgICAgIDxwYXJhbS12YWx1ZT5ub25lPC9wYXJhbS12YWx1ZT4KKyAgICA8L2luaXQtcGFyYW0+CisgICAgPGluaXQtcGFyYW0+CisgICAgICA8cGFyYW0tbmFtZT5yZXNvdXJjZS5uYW1lLnJlcGxhY2VtZW50PC9wYXJhbS1uYW1lPgorICAgICAgPHBhcmFtLXZhbHVlPm5vbmU8L3BhcmFtLXZhbHVlPgorICAgIDwvaW5pdC1wYXJhbT4KKyAgPC9zZXJ2bGV0PgorICAgIAorICA8c2VydmxldD4KKyAgICA8c2VydmxldC1uYW1lPlRlbXBsYXRlfEdTUDwvc2VydmxldC1uYW1lPgorICAgIDxzZXJ2bGV0LWNsYXNzPmdyb292eS5zZXJ2bGV0LlRlbXBsYXRlU2VydmxldDwvc2VydmxldC1jbGFzcz4KKyAgPC9zZXJ2bGV0PgorICAKKyAgPHNlcnZsZXQ+CisgICAgPHNlcnZsZXQtbmFtZT5UZW1wbGF0ZXxHU3RyaW5nPC9zZXJ2bGV0LW5hbWU+CisgICAgPHNlcnZsZXQtY2xhc3M+Z3Jvb3Z5LnNlcnZsZXQuVGVtcGxhdGVTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgorICAgIDxpbml0LXBhcmFtPgorICAgICAgPHBhcmFtLW5hbWU+dGVtcGxhdGUuZW5naW5lPC9wYXJhbS1uYW1lPgorICAgICAgPHBhcmFtLXZhbHVlPmdyb292eS50ZXh0LkdTdHJpbmdUZW1wbGF0ZUVuZ2luZTwvcGFyYW0tdmFsdWU+CisgICAgPC9pbml0LXBhcmFtPgorICA8L3NlcnZsZXQ+CisgIAorICA8c2VydmxldD4KKyAgICA8c2VydmxldC1uYW1lPlRlbXBsYXRlfFhNTDwvc2VydmxldC1uYW1lPgorICAgIDxzZXJ2bGV0LWNsYXNzPmdyb292eS5zZXJ2bGV0LlRlbXBsYXRlU2VydmxldDwvc2VydmxldC1jbGFzcz4KKyAgICA8aW5pdC1wYXJhbT4KKyAgICAgIDxwYXJhbS1uYW1lPnRlbXBsYXRlLmVuZ2luZTwvcGFyYW0tbmFtZT4KKyAgICAgIDxwYXJhbS12YWx1ZT5ncm9vdnkudGV4dC5YbWxUZW1wbGF0ZUVuZ2luZTwvcGFyYW0tdmFsdWU+CisgICAgPC9pbml0LXBhcmFtPgorICA8L3NlcnZsZXQ+CisgIAorICA8c2VydmxldC1tYXBwaW5nPgorICAgIDxzZXJ2bGV0LW5hbWU+VGVtcGxhdGV8R1NQPC9zZXJ2bGV0LW5hbWU+CisgICAgPHVybC1wYXR0ZXJuPiouaHRtbDwvdXJsLXBhdHRlcm4+CisgIDwvc2VydmxldC1tYXBwaW5nPgorICAKKyAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICA8c2VydmxldC1uYW1lPlRlbXBsYXRlfFhNTDwvc2VydmxldC1uYW1lPgorICAgIDx1cmwtcGF0dGVybj4qLnhodG1sPC91cmwtcGF0dGVybj4KKyAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICA8c2VydmxldC1uYW1lPkdyb292bGV0PC9zZXJ2bGV0LW5hbWU+CisgICAgPHVybC1wYXR0ZXJuPiouZ3Jvb3Z5PC91cmwtcGF0dGVybj4KKyAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgPHdlbGNvbWUtZmlsZS1saXN0PgorICAgIDx3ZWxjb21lLWZpbGU+aW5kZXgueGh0bWw8L3dlbGNvbWUtZmlsZT4KKyAgICA8d2VsY29tZS1maWxlPmluZGV4Lmh0bWw8L3dlbGNvbWUtZmlsZT4KKyAgICA8d2VsY29tZS1maWxlPmluZGV4LmpzcDwvd2VsY29tZS1maWxlPgorICAgIDx3ZWxjb21lLWZpbGU+aW5kZXguanNweDwvd2VsY29tZS1maWxlPgorICAgIDx3ZWxjb21lLWZpbGU+aW5kZXguZ3Jvb3Z5PC93ZWxjb21lLWZpbGU+CisgIDwvd2VsY29tZS1maWxlLWxpc3Q+CisKKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvZXhhbXBsZXMvd2ViYXBwcy9ncm9vdmxldC1leGFtcGxlcy9jb2RlaGF1cy1zdHlsZS5jc3MgYi9ncm9vdnkvc3JjL2V4YW1wbGVzL3dlYmFwcHMvZ3Jvb3ZsZXQtZXhhbXBsZXMvY29kZWhhdXMtc3R5bGUuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1Y2YwZGQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL2V4YW1wbGVzL3dlYmFwcHMvZ3Jvb3ZsZXQtZXhhbXBsZXMvY29kZWhhdXMtc3R5bGUuY3NzCkBAIC0wLDAgKzEsNjA5IEBACisKK2JvZHkgeworICBmb250LWZhbWlseTogVmVyZGFuYSwgSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjsKKyAgZm9udC1zaXplOiBzbWFsbDsKKyAgbWFyZ2luOiAwOworfQorCitkaXYgeworICAvKiBsaW5lLWhlaWdodDogMS41ZW07ICovCit9CisKK2EgeworICBjb2xvcjogIzAwODgwMDsKKyAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworICBmb250LXdlaWdodDogYm9sZDsKK30KKworLm5hdkxpbmsgYSB7CisgIGZvbnQtd2VpZ2h0OiBub3JtYWw7Cit9CisKKy5uYXZMaW5rIHsKKyAgbWFyZ2luLWxlZnQ6IDVweDsKK30KKworLm5hdkxpbms6Zmlyc3QtbGluZSB7CisgIG1hcmdpbi1sZWZ0OiAtNXB4OworfQorCisKK2E6bGluay5zZWxmcmVmLCBhOnZpc2l0ZWQuc2VsZnJlZiB7Cit9CisKK2E6bGluaywgYTp2aXNpdGVkIHsKK30KKworYTphY3RpdmUsIGE6aG92ZXIgeworICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKK30KKworYS5wbGFpbjphY3RpdmUsIGEucGxhaW46aG92ZXIgeworICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cit9CisKKy5zZWN0aW9uVGl0bGUgYSB7CisgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOworfQorLnN1YnNlY3Rpb25UaXRsZSBhIHsKKyAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Cit9CisKK3NwYW4uaGlnaGxpZ2h0IHsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgIGNvbG9yOiAjOTkwMDAwOworfQorCisjbGF5b3V0IHsKKyAgbWFyZ2luOiAwcHg7CisgIHBhZGRpbmc6IDBweDsKK30KKworI2Jhbm5lciB7CisgIHBhZGRpbmc6IDhweDsKK30KKworI2JyZWFkY3J1bWJzIHsKKyAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICMwMDk5MDA7CisgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjMDA5OTAwOworICBwYWRkaW5nLWxlZnQ6IDEycHg7CisgIHBhZGRpbmctcmlnaHQ6IDEycHg7CisgIHBhZGRpbmctdG9wOiAycHg7CisgIHBhZGRpbmctYm90dG9tOiAycHg7CisgIGZvbnQtc2l6ZTogeC1zbWFsbDsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2RkZGRkZDsKK30KKworI2JyZWFkY3J1bWJzIHRkIHsKKyAgZm9udC1zaXplOiB4LXNtYWxsOworfQorCisjYnJlYWRjcnVtYnMgYSB7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworfQorCisjbGF5b3V0IHsKKyAgLypib3JkZXItdG9wOiAxcHggc29saWQgIzAwOTkwMDsqLworICBwYWRkaW5nOiAwcHg7CisgIG1hcmdpbjogMHB4OworCit9CisKKy5uYXZTZWN0aW9uIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKKyAgYm9yZGVyOiAxcHggc29saWQgIzk5OTk5OTsKKyAgYm9yZGVyLXRvcDogbm9uZTsKKyAgcGFkZGluZzogMHB4OworICBtYXJnaW4tYm90dG9tOiA4cHg7CisgIGZvbnQtc2l6ZTogc21hbGw7Cit9CisKKy5uYXZTZWN0aW9uIGEgeworICBmb250LXdlaWdodDogbm9ybWFsOworfQorCisubmF2U2VjdGlvbkhlYWQgeworICBib3JkZXItdG9wOiAxcHggc29saWQgIzk5OTk5OTsKKyAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICM5OTk5OTk7CisgIGNvbG9yOiAjNTU1NTU1OworICBwYWRkaW5nOiA0cHg7CisgIG1hcmdpbi1sZWZ0OiAwcHg7CisgIG1hcmdpbi1yaWdodDogMHB4OworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlZWVlOworICBmb250LXdlaWdodDogYm9sZDsKKyAgZm9udC1zaXplOiB4LXNtYWxsOworfQorCisubmF2TGluayB7CisgIHBhZGRpbmctdG9wOiAycHg7CisgIHBhZGRpbmctYm90dG9tOiAycHg7CisgIHBhZGRpbmctbGVmdDogMTRweDsKKyAgZm9udC1zaXplOiBzbWFsbDsKK30KKworLnNlY3Rpb24geworICBwYWRkaW5nLWJvdHRvbTogMTZweDsKK30KKworKiArIGgxIHsKKyAgbWFyZ2luLXRvcDogMS41ZW07Cit9CisKKyogKyBoMiB7CisgIG1hcmdpbi10b3A6IDEuNWVtOworfQorCisuc2VjdGlvblRpdGxlLCBoMSB7CisgIHBhZGRpbmc6IDRweDsKKyAgYm9yZGVyOiAxcHggc29saWQgI2FhYWFhYTsKKyAgY29sb3I6ICMwMDc3MDA7CisgIGZvbnQtc2l6ZTogbGFyZ2VyOworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlOworICBjb2xvcjogIzAwNzcwMDsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgIG1hcmdpbi1ib3R0b206IC41ZW07CisgIC8qIG1hcmdpbi10b3A6IDFlbTsgKi8KK30KKworLnN1YnNlY3Rpb24geworICBwYWRkaW5nLWxlZnQ6IDIwcHg7CisgIG1hcmdpbi10b3A6IDEwcHg7CisgIG1hcmdpbi1ib3R0b206IDEwcHg7Cit9CisKK2JvZHk6Zmlyc3QtY2hpbGQgeworICBwYWRkaW5nLXRvcDogMHB4OworfQorCisuc3Vic2VjdGlvblRpdGxlLCBoMiB7CisgIHBhZGRpbmctbGVmdDogLjJlbTsKKyAgLyogbWFyZ2luLXRvcDogMWVtOyAqLworICBtYXJnaW4tYm90dG9tOiAuNWVtOworICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzk5OTsKKyAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjOTk5OworICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgIGZvbnQtc2l6ZTogbGFyZ2VyOworfQorCisuc2VjdGlvblRpdGxlIGEgeworICBmb250LXdlaWdodDogbm9ybWFsOworfQorCisuc3Vic2VjdGlvblRpdGxlIGEgeworICBmb250LXdlaWdodDogbm9ybWFsOworfQorCisuc3Vic3Vic2VjdGlvbiB7CisgIHBhZGRpbmctbGVmdDogMzBweDsKK30KKworLnN1YnN1YnNlY3Rpb25UaXRsZSwgaDMsIC5ibG9naGVhZGluZyB7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2JiYjsKKyAgcGFkZGluZzogLjFlbTsKKyAgY29sb3I6ICM1NTU7CisgIG1hcmdpbi1ib3R0b206IC41ZW07Cit9CisKK2g0IHsKKyAgbWFyZ2luLWJvdHRvbTogLjVlbTsKKyAgcGFkZGluZzogLjFlbTsKKyAgYm9yZGVyOiAxcHggc29saWQgI2RkZDsKKworfQorCitpbnMuaW5zZXJ0ZWQgeworICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworfQorCisjbGVmdENvbHVtbiB7CisgIHdpZHRoOiAxMmVtOworfQorCisjbGVmdENvbHVtbiBoMyB7CisgIGJhY2tncm91bmQtY29sb3I6ICNkZGQ7CisgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7CisgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjMDcwOworICBtYXJnaW4tYm90dG9tOiAuNWVtOworfQorCisjbGVmdENvbHVtbiBhIHsKKyAgZm9udC13ZWlnaHQ6IGluaGVyaXQ7Cit9CisKKyNicmVhZGNydW1icyBhIHsKKyAgZm9udC13ZWlnaHQ6IGluaGVyaXQ7Cit9CisKKworcCB7CisgIG1hcmdpbjogMHB4OworICBtYXJnaW4tYm90dG9tOiAuNWVtOworICBsaW5lLWhlaWdodDogMS4yZW07CisgIHBhZGRpbmctcmlnaHQ6IDIwcHg7CisgIHBhZGRpbmctbGVmdDogMHB4OworfQorCitibG9ja3F1b3RlIHAgeworICBwYWRkaW5nLWxlZnQ6IDBweDsKKyAgcGFkZGluZy1yaWdodDogMHB4OworfQorCit1bCB7CisgIG1hcmdpbi10b3A6IDFlbTsKKyAgbWFyZ2luLWJvdHRvbTogMWVtOworICBwYWRkaW5nLWxlZnQ6IDEuNWVtOworfQorCit1bCB1bCB7CisgIG1hcmdpbjogMHB4OworICBwYWRkaW5nLWxlZnQ6IDFlbTsKK30KKworbGkgeworICBtYXJnaW46IDBweDsKKyAgbWFyZ2luLXJpZ2h0OiAxNSU7CisgIGxpbmUtaGVpZ2h0OiAxLjJlbTsKK30KKworI2xlZnRDb2x1bW4geworICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjY2NjY2NjOworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlZWVlOworICBwYWRkaW5nOiAxMnB4OworICBmb250LXNpemU6IHNtYWxsOworfQorCisjbGVmdENvbHVtbiBhIHsKKyAgZm9udC1zaXplOiBzbWFsbGVyOworfQorCisjbGVmdENvbHVtbiB0dCBhIHsKKyAgZm9udC1zaXplOiBpbmhlcml0OworfQorCisjbGVmdENvbHVtbiBoMyBhIHsKKyAgZm9udC1zaXplOiBpbmhlcml0OworfQorCit0dCB7CisgIGZvbnQtc2l6ZTogbGFyZ2VyOworfQorCisKKyNleHRyYUNvbHVtbiB7CisgIHBhZGRpbmc6IDEycHg7Cit9CisKKyNuYXZCb3ggeworfQorCisjcmlnaHRDb2x1bW4geworICBwYWRkaW5nOiAxMnB4OworICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjY2NjY2NjOworICBmb250LXNpemU6IHNtYWxsOworICBwYWRkaW5nLWxlZnQ6IDE2cHg7CisgIHBhZGRpbmctcmlnaHQ6IDE2cHg7Cit9CisKKyNjb250ZW50Qm94IHsKKworfQorCit0YWJsZS5ib2R5VGFibGUsIHRhYmxlLndpa2l0YWJsZSB7CisgIG1hcmdpbjogMTBweDsKKyAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKKyAgYm9yZGVyLXNwYWNpbmc6IDBwdDsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2VlZWVlZTsKK30KKworI0NvbnRlbnQgdGFibGUuZ3JpZCB7CisgIGJvcmRlcjogMXB4IHNvbGlkICNiYmJiYmI7Cit9CisKK3RhYmxlLmdyaWQgeworICBwYWRkaW5nOiAwcHg7CisgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7CisgIGJvcmRlci1zcGFjaW5nOiAwcHQ7CisgIG1hcmdpbi1sZWZ0OiAxZW07CisgIG1hcmdpbi1yaWdodDogMWVtOworfQorCit0YWJsZS5ncmlkIHRoIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2VlZWVlZTsKKyAgZm9udC1zaXplOiBzbWFsbGVyOworICBwYWRkaW5nOiA0cHg7CisgIGJvcmRlcjogMXB4IHNvbGlkICNiYmJiYmI7Cit9CisKK3RhYmxlLmdyaWQgdGQgeworICBmb250LXNpemU6IHgtc21hbGw7CisgIGJvcmRlcjogMXB4IHNvbGlkICNiYmJiYmI7CisgIHBhZGRpbmc6IDNweDsKK30KKwordGFibGUuYm9keVRhYmxlIHRoLCB0YWJsZS5ib2R5VGFibGUgdGQsIHRhYmxlLndpa2l0YWJsZSB0aCwgdGFibGUud2lraXRhYmxlIHRkIHsKKyAgYm9yZGVyOiAxcHggc29saWQgIzk5OTk5OTsKKyAgZm9udC1zaXplOiBzbWFsbGVyOworICBwYWRkaW5nOiA0cHg7Cit9CisKKwordGFibGUuYm9keVRhYmxlIHRoLCB0YWJsZS53aWtpdGFibGUgdGggeworICB0ZXh0LWFsaWduOiBsZWZ0OworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkZGRkOworICBib3JkZXI6IDJweCBzb2xpZCAjOTk5OTk5OworICBwYWRkaW5nOiA0cHg7Cit9CisKKy5ub2JyCisgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cit9CisKK3RhYmxlLmJvZHlUYWJsZSB0ZCB7CisgIHBhZGRpbmc6IDRweDsKK30KKworLyoKK3RhYmxlLmJvZHlUYWJsZSB0aCwgdGFibGUud2lraXRhYmxlIHRoIHsKKyAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkICM5OTk5OTk7Cit9CisKK3RhYmxlLmJvZHlUYWJsZSB0ci5hIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2RlZGVkZTsKK30KKwordGFibGUuYm9keVRhYmxlIHRyLmIgeworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOworfQorKi8KKworLnNvdXJjZSwgLmNvZGUgeworICBwYWRkaW5nOiAxMnB4OworICBtYXJnaW46IDFlbTsKKyAgYm9yZGVyOiAxcHggc29saWQgIzAwNzcwMDsKKyAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjMDA3NzAwOworICBib3JkZXItcmlnaHQ6IDJweCBzb2xpZCAjMDA3NzAwOworICBjb2xvcjogIzU1NTU1NTsKK30KKworcHJlIHsKKyAgcGFkZGluZzogMTJweDsKKyAgZm9udC1zaXplOiBsYXJnZXI7Cit9CisKKy5qYXZhLWtleXdvcmQgeworICBjb2xvcjogIzAwOTkwMDsKK30KKworLmphdmEtb2JqZWN0IHsKKyAgY29sb3I6ICMwMDAwOTk7Cit9CisKKy5qYXZhLXF1b3RlIHsKKyAgY29sb3I6ICM5OTAwMDA7Cit9CisKKworLnNvdXJjZSwgLmNvZGUgcHJlIHsKKyAgbWFyZ2luOiAwcHg7CisgIG1hcmdpbi1sZWZ0OiA4cHg7CisgIHBhZGRpbmc6IDBweDsKK30KKworI2Zvb3RlciB7CisgIHBhZGRpbmctbGVmdDogNHB4OworICBib3JkZXItdG9wOiAxcHggc29saWQgIzAwOTkwMDsKKyAgY29sb3I6ICM4ODg4ODg7CisgIGZvbnQtc2l6ZTogeC1zbWFsbDsKK30KKworYmxvY2txdW90ZSB7CisgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjYmJiYmJiOworICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2JiYmJiYjsKKyAgYm9yZGVyLWxlZnQ6IDNweCBzb2xpZCAjYmJiYmJiOworICBib3JkZXItcmlnaHQ6IDNweCBzb2xpZCAjYmJiYmJiOworICBwYWRkaW5nOiAxMnB4OworICBtYXJnaW4tbGVmdDogM2VtOworICBtYXJnaW4tcmlnaHQ6IDNlbTsKKyAgY29sb3I6ICM2NjY2NjY7CisgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOworICBsaW5lLWhlaWdodDogMS41ZW07Cit9CisKK2lucHV0W3R5cGU9InRleHQiXSB7CisgIG1hcmdpbjogMHB4OworICBib3JkZXI6IDFweCBzb2xpZCAjOTk5OTk5OworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkZGRkOworfQorCitpbnB1dC5yZXF1aXJlZCB7CisgIG1hcmdpbjogMHB4OworICBib3JkZXI6IDFweCBzb2xpZCAjOTkwMDAwOworfQorCitpbnB1dCB7CisgIGJvcmRlcjogMXB4IHNvbGlkICM5OTk5OTk7Cit9CisKK3RleHRhcmVhIHsKKyAgYm9yZGVyOiAxcHggc29saWQgIzk5OTk5OTsKK30KKwordGV4dGFyZWEucmVxdWlyZWQgeworICBib3JkZXI6IDFweCBzb2xpZCAjOTkwMDAwOworfQorCitsYWJlbCB7CisgIGZvbnQtc2l6ZTogc21hbGxlcjsKK30KKworbGFiZWwucmVxdWlyZWQgeworICBjb2xvcjogIzk5MDAwMDsKK30KKworLnNlYXJjaFJlc3VsdHMgeworICBjb2xvcjogYmxhY2s7Cit9CisKKy5zZWFyY2hSZXN1bHRzIGIgeworICBjb2xvcjogIzAwNzcwMDsKK30KKworCisubGluZWNvbW1lbnQgeyBjb2xvcjogI2JiYmJiYmI7IH0KKy5ibG9ja2NvbW1lbnQgeyBjb2xvcjogI2JiYmJiYmI7IH0KKy5wcmVwcm8geyBjb2xvcjogIzAwMDBCQjsgfQorLnNlbGVjdCB7fQorLnF1b3RlIHsgY29sb3I6ICM3NzAwMDA7IH0KKy5jYXRlZ29yeTEgeyBjb2xvcjogIzAwNzcwMDsgfQorLmNhdGVnb3J5MiB7IGNvbG9yOiAjMDAwMEJCOyB9CisuY2F0ZWdvcnkzIHsgY29sb3I6ICMwMDAwQkI7IH0KKworI3BhZ2VfdGl0bGUgeworICBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworICBmb250LXNpemU6IHgtbGFyZ2U7CisgIG1hcmdpbi1ib3R0b206IC41ZW07Cit9CisKKy5ncmVlbmJhciB7CisgIGJhY2tncm91bmQtY29sb3I6IGdyZWVuOworfQorCisucmVkYmFyIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogcmVkOworfQorCit0ci50ZXN0cGFzc2VkIHRkIHsKKyAgcGFkZGluZzogMHB4OworICBwYWRkaW5nLWxlZnQ6IDFweDsKKyAgcGFkZGluZy1yaWdodDogMXB4OworICBtYXJnaW46IDBweDsKK30KKwordHIgdGQubm9mb3JtYXR0aW5nIHsKKyAgYm9yZGVyOiBub25lOworICBwYWRkaW5nOiAwcHg7CisgIHBhZGRpbmctbGVmdDogNHB4OworICBwYWRkaW5nLXJpZ2h0OiA0cHg7CisgIG1hcmdpbjogMHB4OworfQorCisuZ3JleWJveCB7CisgIGZvbnQtc3R5bGU6IGl0YWxpYzsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgIG1hcmdpbi10b3A6IC41ZW07CisgIG1hcmdpbi1ib3R0b206IC41ZW07CisgIGJhY2tncm91bmQtY29sb3I6ICNkZGQ7CisgIGJvcmRlcjogMXB4IHNvbGlkICNiYmI7CisgIHBhZGRpbmc6IC4zZW07Cit9CisKKy5wYW5lbENvbnRlbnQgeworICBib3JkZXI6IDFweCBzb2xpZCAjOTk5OworICBwYWRkaW5nOiAxZW07CisgIG1hcmdpbjogMWVtOworfQorCisuaGVhZGVyX25hbWUgeworCWZvbnQtc2l6ZTogc21hbGxlcjsKKwlwYWRkaW5nOiAycHg7CisJcGFkZGluZy1yaWdodDogMWV4OworCWJvcmRlci1yaWdodDogMXB4IHNvbGlkICM1NTU7CisJYmFja2dyb3VuZC1jb2xvcjogI2NjYzsKK30KKworLmhlYWRlcl92YWx1ZSB7CisJZm9udC1zaXplOiBzbWFsbGVyOworCWJhY2tncm91bmQtY29sb3I6ICNkZGQ7CisJcGFkZGluZzogMnB4OworfQorCisuaGVhZGVyX2ZpZWxkcyB7CisJd2lkdGg6IDEwMCU7CisJYm9yZGVyOiAxcHggc29saWQgIzk5OTsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOworfQorCisuZW1haWxfYm9keSB7CisJbWFyZ2luOiAyZXg7CisJcGFkZGluZzogMWV4OworCXBhZGRpbmctbGVmdDogMmV4OworCXBhZGRpbmctcmlnaHQ6IDJleDsKKwlib3JkZXI6IDFweCBzb2xpZCAjOTk5OworCWZvbnQtc2l6ZTogc21hbGxlcjsKK30KKworLmVtYWlsX2JvZHkgcHJlIHsKKwlwYWRkaW5nOiAwcHg7CisJbWFyZ2luOiAwcHg7Cit9CisKKy5lbWFpbF9ib2R5IGJsb2NrcXVvdGUgeworCXBhZGRpbmc6IDBweDsKKwltYXJnaW46IDBweDsKKwlib3JkZXI6IDFweCBzb2xpZCAjY2NjOworfQorCisubXNnX25hdmJsb2NrIHsKKwltYXJnaW4tYm90dG9tOiAyZXg7CisJYm9yZGVyOiAxcHggc29saWQgIzk5OTsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOworfQorCisubXNnX25hdmJsb2NrIHRoIHsKKwlib3JkZXI6IDFweCBzb2xpZCAjY2NjOworCWZvbnQtc2l6ZTogc21hbGxlcjsKK30KKworLm1zZ19uYXZibG9jayB0ZCB7CisJYm9yZGVyOiAxcHggc29saWQgI2NjYzsKKwlmb250LXNpemU6IHNtYWxsZXI7Cit9CisKKy5zaW5nbGVfZW50cnkgeworCWJvcmRlcjogMXB4IHNvbGlkICNhYWE7CisJcGFkZGluZzogLjVleDsKKwlwYWRkaW5nLWxlZnQ6IDFleDsKKwlib3JkZXItbGVmdDogMXB4IHNvbGlkICMwOTA7CisJbWFyZ2luOiAycHg7CisJYmFja2dyb3VuZC1jb2xvcjogI2VlZTsKK30KKworLnJvb3RfZW50cnkgeworCWJvcmRlcjogMXB4IHNvbGlkICNhYWE7CisJcGFkZGluZzogLjVleDsKKwlwYWRkaW5nLWxlZnQ6IDFleDsKKwlib3JkZXItbGVmdDogMXB4IHNvbGlkICMwOTA7CisJbWFyZ2luLXRvcDogOHB4OworCW1hcmdpbi1ib3R0b206IDhweDsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjZWVlOworfQorCisucm9vdF9lbnRyeSAuc3ViX2VudHJ5IHsKKwlwYWRkaW5nOiAuNWV4OworCXBhZGRpbmctbGVmdDogMWV4OworCW1hcmdpbjogMnB4OworCW1hcmdpbi1sZWZ0OiAxZXg7CisJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjOTk5OworfQorCisubGlzdF9lbnRyeSB7CisJYm9yZGVyOiAxcHggc29saWQgI2FhYTsKKwlwYWRkaW5nOiAxZXg7CisJbWFyZ2luLXRvcDogMWV4OworCW1hcmdpbi1ib3R0b206IDFleDsKK30KKworLmxpc3RfZW50cnkgdGQgeworCWJvcmRlcjogMXB4IHNvbGlkICM5OTk7Cit9CisKKy5wcm9qZWN0X2VudHJ5IHsKKwlib3JkZXI6IDFweCBzb2xpZCAjYWFhOworCXBhZGRpbmc6IDFleDsKKwltYXJnaW4tdG9wOiAxZXg7CisJbWFyZ2luLWJvdHRvbTogMWV4OworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9leGFtcGxlcy93ZWJhcHBzL2dyb292bGV0LWV4YW1wbGVzL2hlbGxvL2hlbGxvLmdyb292eSBiL2dyb292eS9zcmMvZXhhbXBsZXMvd2ViYXBwcy9ncm9vdmxldC1leGFtcGxlcy9oZWxsby9oZWxsby5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRlOTdjZAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvZXhhbXBsZXMvd2ViYXBwcy9ncm9vdmxldC1leGFtcGxlcy9oZWxsby9oZWxsby5ncm9vdnkKQEAgLTAsMCArMSwzMyBAQAorcHJpbnRsbiAiIiIKKzxodG1sPgorICAgIDxoZWFkPgorICAgICAgICA8dGl0bGU+R3Jvb3Z5IFNlcnZsZXQgRXhhbXBsZSAtIGhlbGxvPC90aXRsZT4KKyAgICA8L2hlYWQ+CisgICAgPGJvZHk+CisgICAgPGEgaHJlZj0iLi4vIj48aW1nIHNyYz0iLi4vaW1hZ2VzL3JldHVybi5naWYiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgYm9yZGVyPSIwIj48L2E+PGEgaHJlZj0iLi4vIj5SZXR1cm48L2E+CisgICAgPHA+CisiIiIKKworc2Vzc2lvbiA9IHJlcXVlc3QuZ2V0U2Vzc2lvbih0cnVlKTsKKworaWYgKHNlc3Npb24uY291bnRlciA9PSBudWxsKSB7CisgIHNlc3Npb24uY291bnRlciA9IDEKK30KKworCitwcmludGxuICIiIkhlbGxvLCAke3JlcXVlc3QucmVtb3RlSG9zdH0hICR7bmV3IGphdmEudXRpbC5EYXRlKCl9IiIiCisKK3ByaW50bG4gIiIiCis8ZGw+CisgPGR0PjxiPnJlcXVlc3RVUkk8L2I+PC9kdD48ZGQ+JHtyZXF1ZXN0LnJlcXVlc3RVUkl9PC9kZD4KKyA8ZHQ+PGI+c2VydmxldFBhdGg8L2I+PC9kdD48ZGQ+JHtyZXF1ZXN0LnNlcnZsZXRQYXRofTwvZGQ+CisgPGR0PjxiPnNlc3Npb24uY291bnRlcjwvYj48L2R0PjxkZD4ke3Nlc3Npb24uY291bnRlcn08L2RkPgorPC9kbD4KKyIiIgorCitwcmludGxuICIiIgorICAgIDwvYm9keT4KKzwvaHRtbD4KKyIiIgorCitzZXNzaW9uLmNvdW50ZXIgPSBzZXNzaW9uLmNvdW50ZXIgKyAxCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL2V4YW1wbGVzL3dlYmFwcHMvZ3Jvb3ZsZXQtZXhhbXBsZXMvaW1hZ2VzL2NvZGUuZ2lmIGIvZ3Jvb3Z5L3NyYy9leGFtcGxlcy93ZWJhcHBzL2dyb292bGV0LWV4YW1wbGVzL2ltYWdlcy9jb2RlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2FmMmNkCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9leGFtcGxlcy93ZWJhcHBzL2dyb292bGV0LWV4YW1wbGVzL2ltYWdlcy9jb2RlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL2V4YW1wbGVzL3dlYmFwcHMvZ3Jvb3ZsZXQtZXhhbXBsZXMvaW1hZ2VzL2V4ZWN1dGUuZ2lmIGIvZ3Jvb3Z5L3NyYy9leGFtcGxlcy93ZWJhcHBzL2dyb292bGV0LWV4YW1wbGVzL2ltYWdlcy9leGVjdXRlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjRkNzBmCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9leGFtcGxlcy93ZWJhcHBzL2dyb292bGV0LWV4YW1wbGVzL2ltYWdlcy9leGVjdXRlLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL2V4YW1wbGVzL3dlYmFwcHMvZ3Jvb3ZsZXQtZXhhbXBsZXMvaW1hZ2VzL2dyb292eS5wbmcgYi9ncm9vdnkvc3JjL2V4YW1wbGVzL3dlYmFwcHMvZ3Jvb3ZsZXQtZXhhbXBsZXMvaW1hZ2VzL2dyb292eS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRhZjRjMQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvZXhhbXBsZXMvd2ViYXBwcy9ncm9vdmxldC1leGFtcGxlcy9pbWFnZXMvZ3Jvb3Z5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL2V4YW1wbGVzL3dlYmFwcHMvZ3Jvb3ZsZXQtZXhhbXBsZXMvaW1hZ2VzL3JldHVybi5naWYgYi9ncm9vdnkvc3JjL2V4YW1wbGVzL3dlYmFwcHMvZ3Jvb3ZsZXQtZXhhbXBsZXMvaW1hZ2VzL3JldHVybi5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY0ZjY4ZgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvZXhhbXBsZXMvd2ViYXBwcy9ncm9vdmxldC1leGFtcGxlcy9pbWFnZXMvcmV0dXJuLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL2V4YW1wbGVzL3dlYmFwcHMvZ3Jvb3ZsZXQtZXhhbXBsZXMvaW5kZXguZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy9leGFtcGxlcy93ZWJhcHBzL2dyb292bGV0LWV4YW1wbGVzL2luZGV4Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzQyMDFiCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9leGFtcGxlcy93ZWJhcHBzL2dyb292bGV0LWV4YW1wbGVzL2luZGV4Lmdyb292eQpAQCAtMCwwICsxLDg5IEBACitwcmludGxuICIiIgorCis8IS0tIEdyb292eSBHcm9vdmxldCBFeGFtcGxlcy4gLS0+CisKKzwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Cis8aHRtbD4KKzxoZWFkPgorICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+CisgICA8bWV0YSBuYW1lPSJBdXRob3IiIGNvbnRlbnQ9Ikdyb292eSBEZXZlbG9wZXJzIj4KKyAgIDx0aXRsZT5Hcm9vdnkgLSBHcm9vdmxldCBFeGFtcGxlczwvdGl0bGU+CisgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImNvZGVoYXVzLXN0eWxlLmNzcyIgdHlwZT0idGV4dC9jc3MiPgorPC9oZWFkPgorCis8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIj4KKworPGEgaHJlZj0iaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmciPjxpbWcgc3JjPSJpbWFnZXMvZ3Jvb3Z5LnBuZyIgYm9yZGVyPSIwIj48L2E+CisKKzxoMT5Hcm9vdmxldCBleGFtcGxlcyBzaG93aW5nIEdyb292eVNlcnZsZXQgaW4gYWN0aW9uPC9oMT4KKzxwPgorVGhlc2UgZXhhbXBsZXMgd2lsbCBvbmx5IHdvcmsgd2hlbiB2aWV3ZWQgdmlhIGFuIGh0dHAgVVJMLiBUaGV5IHdpbGwgbm90IHdvcmsKK2lmIHlvdSBhcmUgdmlld2luZyB0aGVzZSBwYWdlcyB2aWEgYSA8dHQ+ZmlsZTovLy4uLjwvdHQ+IFVSTC4gWW91IG5lZWQgdG8KK2RlcGxveSB0aGUgPHR0PndhcjwvdHQ+IGFyY2hpdmUgaW50byBhIHNlcnZsZXQgY29udGFpbmVyIGxpa2UgVG9tY2F0LCBKZXR0eSBvcgorYW55IG90aGVyIHdpbGwgZG8gYXMgd2VsbC4KKzwvcD4KKworPHA+CitUbyBuYXZpZ2F0ZSB5b3VyIHdheSB0aHJvdWdoIHRoZSBleGFtcGxlcywgdGhlIGZvbGxvd2luZyBpY29ucyB3aWxsIGhlbHA6CisKKzx0YWJsZSBib3JkZXI9MD4KKyA8dHI+CisgIDx0ZCB3aWR0aD0iMzAiPjxpbWcgc3JjPSJpbWFnZXMvZXhlY3V0ZS5naWYiID48L3RkPgorICA8dGQ+RXhlY3V0ZXMgdGhlIGV4YW1wbGU8L3RkPgorPC90cj4KKzx0cj4KKyAgPHRkIHdpZHRoPSIzMCI+PGltZyBzcmM9ImltYWdlcy9jb2RlLmdpZiI+PC90ZD4KKyAgPHRkPkxvb2sgYXQgdGhlIHNvdXJjZSBjb2RlIGZvciB0aGUgZXhhbXBsZTwvdGQ+Cis8L3RyPgorPHRyPgorICA8dGQgd2lkdGg9IjMwIj48aW1nIHNyYz0iaW1hZ2VzL3JldHVybi5naWYiPjwvdGQ+CisgIDx0ZD5SZXR1cm4gdG8gdGhpcyBzY3JlZW48L3RkPgorPC90cj4KKzwvdGFibGU+Cis8L3A+CisKKzxwPlRpcDogVG8gc2VlIHRoZSBjb29raWUgaW50ZXJhY3Rpb25zIHdpdGggeW91ciBicm93c2VyLCB0cnkgdHVybmluZyBvbgordGhlICJub3RpZnkgd2hlbiBzZXR0aW5nIGEgY29va2llIiBvcHRpb24gaW4geW91ciBicm93c2VyIHByZWZlcmVuY2VzLgorVGhpcyB3aWxsIGxldCB5b3Ugc2VlIHdoZW4gYSBzZXNzaW9uIGlzIGNyZWF0ZWQgYW5kIGdpdmUgc29tZSBmZWVkYmFjaword2hlbiBsb29raW5nIGF0IHRoZSBjb29raWUgZGVtby4KKzwvcD4KKworPGgyPlRhYmxlIG9mIGNvbnRlbnQ8L2gyPgorCisiIiIKKworcHJpbnRsbiAiIiIKKworPHRhYmxlIEJPUkRFUj0wIENFTExTUEFDSU5HPTUgV0lEVEg9Ijg1JSIgPgorCis8IS0tIEJlZ2luIEdyb292bGV0IC0tPgorPHRyIFZBTElHTj1UT1A+Cis8dGQ+SGVsbG8gV29ybGQ8L3RkPgorCis8dGQgVkFMSUdOPVRPUCBXSURUSD0iMzAlIj48aW1nIFNSQz0iaW1hZ2VzL2V4ZWN1dGUuZ2lmIiBIU1BBQ0U9NCBCT1JERVI9MCBhbGlnbj1UT1A+PGEgaHJlZj0iaGVsbG8vaGVsbG8uZ3Jvb3Z5Ij5FeGVjdXRlPC9hPjwvdGQ+CisKKzx0ZCBXSURUSD0iMzAlIj48aW1nIFNSQz0iaW1hZ2VzL2NvZGUuZ2lmIiBIU1BBQ0U9NCBCT1JERVI9MCBoZWlnaHQ9MjQgd2lkdGg9MjQgYWxpZ249VE9QPlNvdXJjZTwvdGQ+Cis8L3RyPgorPCEtLSBFbmQgR3Jvb3ZsZXQgLS0+CisKKworPCEtLSBCZWdpbiBHcm9vdmxldCAtLT4KKzx0ciBWQUxJR049VE9QPgorPHRkPlpvbzwvdGQ+CisKKzx0ZCBWQUxJR049VE9QIFdJRFRIPSIzMCUiPjxpbWcgU1JDPSJpbWFnZXMvZXhlY3V0ZS5naWYiIEhTUEFDRT00IEJPUkRFUj0wIGFsaWduPVRPUD48YSBocmVmPSJ6b28vem9vLmdyb292eSI+RXhlY3V0ZTwvYT48L3RkPgorCis8dGQgV0lEVEg9IjMwJSI+PGltZyBTUkM9ImltYWdlcy9jb2RlLmdpZiIgSFNQQUNFPTQgQk9SREVSPTAgaGVpZ2h0PTI0IHdpZHRoPTI0IGFsaWduPVRPUD5Tb3VyY2U8L3RkPgorPC90cj4KKzwhLS0gRW5kIEdyb292bGV0IC0tPgorPC90YWJsZT4KKworPGgyPk5vdGU8L2gyPgorCis8cD5UaGUgc291cmNlIGNvZGUgZm9yIHRoZXNlIGV4YW1wbGVzIGRvZXMgbm90IGNvbnRhaW4gYWxsIG9mIHRoZQorc291cmNlIGNvZGUgdGhhdCBpcyBhY3R1YWxseSBpbiB0aGUgZXhhbXBsZSwgb25seSB0aGUgaW1wb3J0YW50IHNlY3Rpb25zCitvZiBjb2RlLiBDb2RlIG5vdCBpbXBvcnRhbnQgdG8gdW5kZXJzdGFuZCB0aGUgZXhhbXBsZSBoYXMgYmVlbiByZW1vdmVkCitmb3IgY2xhcml0eS4KKzwvYm9keT4KKzwvaHRtbD4KKyIiIgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvZXhhbXBsZXMvd2ViYXBwcy9ncm9vdmxldC1leGFtcGxlcy9yZWFkbWUudHh0IGIvZ3Jvb3Z5L3NyYy9leGFtcGxlcy93ZWJhcHBzL2dyb292bGV0LWV4YW1wbGVzL3JlYWRtZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA0MTI4MAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvZXhhbXBsZXMvd2ViYXBwcy9ncm9vdmxldC1leGFtcGxlcy9yZWFkbWUudHh0CkBAIC0wLDAgKzEsMTMgQEAKKworR3Jvb3Z5U2VydmxldCBleGFtcGxlcworCitbIC8gXQorT25seSBjb250YWlucyB0aGUgImluZGV4Lmdyb292eSIsICJjb2RlaGF1cy1zdHlsZS5jc3MiIGFuZCAicmVhZG1lLnR4dCIgZmlsZXMuCisKK1sgL2hlbGxvIF0KK0NvbnRhaW5zIGEgc2luZ2xlIHdlbGNvbWUgZmlsZSBuYW1lZCAiaGVsbG8uZ3Jvb3Z5IiBzaG93aW5nIGEgc2ltcGxlIGdyb292bGV0LgorCitbIC96b28gXQorVGhlIHpvbyBkZW1vbnN0cmF0ZXMgYSBncm9vdnkgc2V0dXAgb2Ygc2NyaXB0cywgdGhhdCBhcmUgcGFydGx5IDxpPmhpZGRlbjwvaT4KK2JlbmVhdGggdGhlICJXRUItSU5GL2dyb292eSIgZGlyZWN0b3J5LiBOb3RlIHRoZSBkaWZmZXJlbnQgcGFja2FnZSBuYW1lcyBpbiB0aGUKK3NjcmlwdCBmaWxlcy4KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvZXhhbXBsZXMvd2ViYXBwcy9ncm9vdmxldC1leGFtcGxlcy94bWwvaW5kZXgueGh0bWwgYi9ncm9vdnkvc3JjL2V4YW1wbGVzL3dlYmFwcHMvZ3Jvb3ZsZXQtZXhhbXBsZXMveG1sL2luZGV4LnhodG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmYzRlODkKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL2V4YW1wbGVzL3dlYmFwcHMvZ3Jvb3ZsZXQtZXhhbXBsZXMveG1sL2luZGV4LnhodG1sCkBAIC0wLDAgKzEsMzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLSBET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKKyAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCIgLS0+CisKKzxodG1sIHhtbG5zOmdzcD0iaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvMjAwNS9nc3AiPgorCisgIDxoZWFkPgorICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vY29kZWhhdXMtc3R5bGUuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KKyAgPC9oZWFkPgorCisgIDxib2R5PgorCisgIE5hbWUgPSAke3JlcXVlc3QuZ2V0UGFyYW1ldGVyKCJuYW1lIil9IDxici8+CisgIE5hbWUgPSA8Z3NwOmV4cHJlc3Npb24+cGFyYW1zLmdldCgibmFtZSIpPC9nc3A6ZXhwcmVzc2lvbj4KKworICA8aHIgY29sb3I9IiMxMjMzNCIgbm9zaGFkZT0ibm9zaGFkZSIgLz4KKworICBCRUdJTgorCisgICAgPGJyLz4KKworICA8Z3NwOnNjcmlwdGxldD4KKyAgIDwhW0NEQVRBWworICAgIDMudGltZXMgeworICAgXV0+CisgIDwvZ3NwOnNjcmlwdGxldD4KKyogSGVsbG8gV29ybGQhICoKKyAgPGdzcDpzY3JpcHRsZXQ+CisgICA8IVtDREFUQVsgIH0gLy8gMy50aW1lcyBdXT4KKyAgPC9nc3A6c2NyaXB0bGV0PiAgCisKKyAgICA8YnIvPgorCisgICAgRU5ECisKKyAgPC9ib2R5PgorCis8L2h0bWw+CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL2V4YW1wbGVzL3dlYmFwcHMvZ3Jvb3ZsZXQtZXhhbXBsZXMvem9vL0hvbW1pbmdiZXJnZXJHZXBhcmRlbmZvcmVsbGUuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy9leGFtcGxlcy93ZWJhcHBzL2dyb292bGV0LWV4YW1wbGVzL3pvby9Ib21taW5nYmVyZ2VyR2VwYXJkZW5mb3JlbGxlLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjBlNTVmCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9leGFtcGxlcy93ZWJhcHBzL2dyb292bGV0LWV4YW1wbGVzL3pvby9Ib21taW5nYmVyZ2VyR2VwYXJkZW5mb3JlbGxlLmdyb292eQpAQCAtMCwwICsxLDkgQEAKK3BhY2thZ2Ugem9vCisKK2NsYXNzIEhvbW1pbmdiZXJnZXJHZXBhcmRlbmZvcmVsbGUgZXh0ZW5kcyB6b28uZmlzaC5Ucm91dCB7CisKKyAgU3RyaW5nIHNheVNvbWV0aGluZyhTdHJpbmcgc29tZXRoaW5nKSB7CisgICAgcmV0dXJuIHNvbWV0aGluZzsKKyAgfQorICAKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL2V4YW1wbGVzL3dlYmFwcHMvZ3Jvb3ZsZXQtZXhhbXBsZXMvem9vL3Zpc2l0Lmdyb292eSBiL2dyb292eS9zcmMvZXhhbXBsZXMvd2ViYXBwcy9ncm9vdmxldC1leGFtcGxlcy96b28vdmlzaXQuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxYWJlODcKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL2V4YW1wbGVzL3dlYmFwcHMvZ3Jvb3ZsZXQtZXhhbXBsZXMvem9vL3Zpc2l0Lmdyb292eQpAQCAtMCwwICsxLDE5IEBACitBbmltYWwgc2hhcmsgPSBuZXcgem9vLmZpc2guU2hhcmsoKQorQW5pbWFsIHRyb3V0ID0gbmV3IHpvby5maXNoLlRyb3V0KCkKK0FuaW1hbCBmb3JlbGxlID0gbmV3IHpvby5Ib21taW5nYmVyZ2VyR2VwYXJkZW5mb3JlbGxlKCkKKworcHJpbnRsbiAiIiIKKzxodG1sPgorICAgIDxoZWFkPgorICAgICAgICA8dGl0bGU+R3Jvb3Z5IFNlcnZsZXQgRXhhbXBsZSAtIFZpc2l0aW5nIHRoZSB6b288L3RpdGxlPgorICAgIDwvaGVhZD4KKyAgICA8Ym9keT4KKyAgICAgPHA+U2hhcms8YnI+IAorICAgICAke3NoYXJrLnNheVNvbWV0aGluZygiXCJXaGVyZSBpcyB0aGUgdHJvdXQ/XCIiKX0KKyAgICAgPHA+VHJvdXQ8YnI+IAorICAgICAke3Ryb3V0LnNheVNvbWV0aGluZygiSGVyZSBpcyB0aGUgdHJvdXQhIil9CisgICAgIDxwPkZvcmVsbGU8YnI+IAorICAgICAke2ZvcmVsbGUuc2F5U29tZXRoaW5nKCJcIjxhIGhyZWY9XCJodHRwOi8vd3d3LmhvbW1pbmdiZXJnZXItZm9yZWxsZS5kZVwiPlRoZXJlIGlzIG5vIHNwb29uLjwvYT5cIiIpfQorICAgIDwvYm9keT4KKzwvaHRtbD4KKyIiIgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvZXhhbXBsZXMvd2ViYXBwcy9ncm9vdmxldC1leGFtcGxlcy96b28vem9vLmdyb292eSBiL2dyb292eS9zcmMvZXhhbXBsZXMvd2ViYXBwcy9ncm9vdmxldC1leGFtcGxlcy96b28vem9vLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzExOGRiCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9leGFtcGxlcy93ZWJhcHBzL2dyb292bGV0LWV4YW1wbGVzL3pvby96b28uZ3Jvb3Z5CkBAIC0wLDAgKzEsMzAgQEAKK3ByaW50bG4gIiIiCis8aHRtbD4KKyAgICA8aGVhZD4KKyAgICAgICAgPHRpdGxlPkdyb292eSBTZXJ2bGV0IEV4YW1wbGUgLSBWaXNpdGluZyB0aGUgem9vPC90aXRsZT4KKyAgICA8L2hlYWQ+CisgICAgPGJvZHk+CisgICAgPGEgaHJlZj0iLi4vIj48aW1nIHNyYz0iLi4vaW1hZ2VzL3JldHVybi5naWYiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgYm9yZGVyPSIwIj48L2E+PGEgaHJlZj0iLi4vIj5SZXR1cm48L2E+CisgICAgPHA+CisiIiIKKworQW5pbWFsIHNoYXJrID0gbmV3IHpvby5maXNoLlNoYXJrKCkKK0FuaW1hbCB0cm91dCA9IG5ldyB6b28uZmlzaC5Ucm91dCgpCitBbmltYWwgZm9yZWxsZSA9IG5ldyB6b28uSG9tbWluZ2JlcmdlckdlcGFyZGVuZm9yZWxsZSgpCisKK3ByaW50bG4gIiIiCisgICAgIDxwPlNoYXJrPGJyPgorICAgICAke3NoYXJrLnNheVNvbWV0aGluZygiXCJXaGVyZSBpcyB0aGUgdHJvdXQ/XCIiKX0KKworICAgICA8cD5Ucm91dDxicj4KKyAgICAgJHt0cm91dC5zYXlTb21ldGhpbmcoIkhlcmUgaXMgdGhlIHRyb3V0ISIpfQorCisgICAgIDxwPkZvcmVsbGU8YnI+CisgICAgICR7Zm9yZWxsZS5zYXlTb21ldGhpbmcoIlwiPGEgaHJlZj1cImh0dHA6Ly93d3cuaG9tbWluZ2Jlcmdlci1mb3JlbGxlLmRlXCI+VGhlcmUgaXMgbm8gc3Bvb24uPC9hPlwiIil9CisgICAgIDwhLS0gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9OaWdyaXR1ZGVfdWx0cmFtYXJpbmUgLS0+CisiIiIKKworcHJpbnRsbiAiIiIKKyAgICA8L2JvZHk+Cis8L2h0bWw+CisiIiIKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvZXhhbXBsZXMvd2ViYXBwcy9nc3AtZXhhbXBsZXMvcmVhZG1lLnR4dCBiL2dyb292eS9zcmMvZXhhbXBsZXMvd2ViYXBwcy9nc3AtZXhhbXBsZXMvcmVhZG1lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDBiMDFlCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9leGFtcGxlcy93ZWJhcHBzL2dzcC1leGFtcGxlcy9yZWFkbWUudHh0CkBAIC0wLDAgKzEsMiBAQAorVE9ETyBGaXJzdCwgaW1wbGVtZW50IGh0dHA6Ly9qaXJhLmNvZGVoYXVzLm9yZy9icm93c2UvR1JPT1ZZLTgzOQorVE9ETyBTZWNvbmQsIHNldHVwIFdFQi1JTkYgYW5kIGV4YW1wbGVzIGdzcCBmaWxlcy4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL2V4YW1wbGVzL3dlYmFwcHMvdGVtcGxhdGUtZXhhbXBsZXMvMy50aW1lcy5IZWxsb1dvcmxkLmh0bWwgYi9ncm9vdnkvc3JjL2V4YW1wbGVzL3dlYmFwcHMvdGVtcGxhdGUtZXhhbXBsZXMvMy50aW1lcy5IZWxsb1dvcmxkLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzllZWM3MAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvZXhhbXBsZXMvd2ViYXBwcy90ZW1wbGF0ZS1leGFtcGxlcy8zLnRpbWVzLkhlbGxvV29ybGQuaHRtbApAQCAtMCwwICsxLDEzIEBACis8aHRtbD4KKyAgPGJvZHk+CisKKyAgICA8JSAzLnRpbWVzIHsgJT4KKyAgICAgIEhlbGxvIFdvcmxkIQorICAgIDwlIH0gJT4KKworICAgIDxicj4KKworICAgIHNlc3Npb24gaWQgPSAke3Nlc3Npb24uaWR9CisKKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9leGFtcGxlcy93ZWJhcHBzL3RlbXBsYXRlLWV4YW1wbGVzL1dFQi1JTkYvbGliL2dyb292eS1hbGwteHl6Lmphci5wbGFjZWhvbGRlciBiL2dyb292eS9zcmMvZXhhbXBsZXMvd2ViYXBwcy90ZW1wbGF0ZS1leGFtcGxlcy9XRUItSU5GL2xpYi9ncm9vdnktYWxsLXh5ei5qYXIucGxhY2Vob2xkZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvZXhhbXBsZXMvd2ViYXBwcy90ZW1wbGF0ZS1leGFtcGxlcy9XRUItSU5GL2xpYi9ncm9vdnktYWxsLXh5ei5qYXIucGxhY2Vob2xkZXIKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvZXhhbXBsZXMvd2ViYXBwcy90ZW1wbGF0ZS1leGFtcGxlcy9XRUItSU5GL3dlYi54bWwgYi9ncm9vdnkvc3JjL2V4YW1wbGVzL3dlYmFwcHMvdGVtcGxhdGUtZXhhbXBsZXMvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmYTdlYWIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL2V4YW1wbGVzL3dlYmFwcHMvdGVtcGxhdGUtZXhhbXBsZXMvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMjYgQEAKKzx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgorICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvd2ViLWFwcF8yXzQueHNkIgorICAgIHZlcnNpb249IjIuNCI+CisKKzxzZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW5hbWU+dGVtcGxhdGU8L3NlcnZsZXQtbmFtZT4KKyAgICA8c2VydmxldC1jbGFzcz5ncm9vdnkuc2VydmxldC5UZW1wbGF0ZVNlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+CisgIDwvc2VydmxldD4KKworICA8c2VydmxldC1tYXBwaW5nPgorICAgIDxzZXJ2bGV0LW5hbWU+dGVtcGxhdGU8L3NlcnZsZXQtbmFtZT4KKyAgICA8dXJsLXBhdHRlcm4+Ki5odG08L3VybC1wYXR0ZXJuPgorICA8L3NlcnZsZXQtbWFwcGluZz4KKyAgCisgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgPHNlcnZsZXQtbmFtZT50ZW1wbGF0ZTwvc2VydmxldC1uYW1lPgorICAgIDx1cmwtcGF0dGVybj4qLmh0bWw8L3VybC1wYXR0ZXJuPgorICA8L3NlcnZsZXQtbWFwcGluZz4KKworICA8c2VydmxldC1tYXBwaW5nPgorICAgIDxzZXJ2bGV0LW5hbWU+dGVtcGxhdGU8L3NlcnZsZXQtbmFtZT4KKyAgICA8dXJsLXBhdHRlcm4+Ki50ZW1wbGF0ZTwvdXJsLXBhdHRlcm4+CisgIDwvc2VydmxldC1tYXBwaW5nPgorCis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL2V4YW1wbGVzL3dlYmFwcHMvdGVtcGxhdGUtZXhhbXBsZXMvamF2YXN5c3RlbXByb3BlcnRpZXMuaHRtIGIvZ3Jvb3Z5L3NyYy9leGFtcGxlcy93ZWJhcHBzL3RlbXBsYXRlLWV4YW1wbGVzL2phdmFzeXN0ZW1wcm9wZXJ0aWVzLmh0bQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODBkODRjCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9leGFtcGxlcy93ZWJhcHBzL3RlbXBsYXRlLWV4YW1wbGVzL2phdmFzeXN0ZW1wcm9wZXJ0aWVzLmh0bQpAQCAtMCwwICsxLDIyIEBACis8aHRtbD4KKzxoZWFkPgorPHRpdGxlPlN5c3RlbSBwcm9wZXJ0aWVzPC90aXRsZT4KKzwvaGVhZD4KKzxib2R5PgorCis8aDE+U3lzdGVtIHByb3BlcnRpZXM8L2gxPgorPCUga2V5cyA9IFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkua2V5U2V0KCk7CisgICBpZiAoa2V5cy5pc0VtcHR5KCkpIHsKKyAgICAgb3V0LnByaW50bG4oJ05vIGtleXMuJyk7CisgICB9CisgICBlbHNlIHsKKyAgJT4KKzxkbD4KKyAgICA8JSBmb3IgKGtleSBpbiBrZXlzKSB7ICU+CisgICAgPGR0PiA8Yj4gJHtrZXl9IDwvYj4gPC9kdD4gCisgICAgPGRkPiA8dHQ+ICR7U3lzdGVtLmdldFByb3BlcnR5KGtleSl9IDwvdHQ+IDwvZGQ+CisgICAgPCUgfSAlPgorPC9kbD4KKzwlIH0gJT4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvZXhhbXBsZXMvd2ViYXBwcy90ZW1wbGF0ZS1leGFtcGxlcy9yZWFkbWUudHh0IGIvZ3Jvb3Z5L3NyYy9leGFtcGxlcy93ZWJhcHBzL3RlbXBsYXRlLWV4YW1wbGVzL3JlYWRtZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI2NDdhMAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvZXhhbXBsZXMvd2ViYXBwcy90ZW1wbGF0ZS1leGFtcGxlcy9yZWFkbWUudHh0CkBAIC0wLDAgKzEsMTMgQEAKKworVGVtcGxhdGVTZXJ2bGV0IGV4YW1wbGVzCisKK1sgL3JlYWRtZS50eHQgXQorVGhpcyByZWFkbWUgZmlsZS4gRm9yIGNsYXJpdHkgc2FrZSwgaXQgZG9lcyBub3QgY29udGFpbiBhIHdlbGNvbWUgZmlsZSBhbmQKK3RoZXJlZm9yZSB0aGUgc2VydmxldCBjb250YWluZXIgc2hvdWxkIGxpc3QgYWxsIGZpbGVzIGFuZCBzdWJkaXJlY3RvcmllcyBsaXN0ZWQKK2JlbG93LgorCitbIC8zLnRpbWVzLkhlbGxvV29ybGQuaHRtbCBdCitQcmludHMgdGhyZWUgdGltZXMgIkhlbGxvIFdvcmxkISIgYW5kIHRoZSBzZXNzaW9uIGlkLgorCitbIC9qYXZhc3lzdGVtcHJvcGVydGllcy5odG0gXQorTGlzdHMgSmF2YSBydW50aW1lIHN5c3RlbSBwcm9wZXJ0aWVzLgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9sYXRleC9yZWYvUkVBRE1FLnR4dCBiL2dyb292eS9zcmMvbGF0ZXgvcmVmL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQxNThiMQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbGF0ZXgvcmVmL1JFQURNRS50eHQKQEAgLTAsMCArMSwxNiBAQAorIyBwdXJwb3NlOgorIyAgdG8gY3JlYXRlIGEgUERGIGZpbGUgZnJvbSBsYXRleCBzb3VyY2UKKworbGF0ZXggZ3Jvb3Z5LXJlZmVyZW5jZS1jYXJkLnRleAorZHZpcHMgLVBwZGYgLXQgbGFuZHNjYXBlIGdyb292eS1yZWZlcmVuY2UtY2FyZC5kdmkKK3BzMnBkZiBncm9vdnktcmVmZXJlbmNlLWNhcmQucHMKKworIyBvcgorCitwZGZsYXRleCBncm9vdnktcmVmZXJlbmNlLWNhcmQudGV4CisKKworIyBwLnMuIGJlc3QgZm9yIGRlYnVnZ2luZyB1c2UuLi4KKyMgICBsYXRleCAkMS50ZXg7IHhkdmkgJDEuZHZpCisjIG9yCisjICBodHRwOi8vd3d3LnVvcmVnb24uZWR1L35rb2NoL3RleHNob3AvdGV4c2hvcC5odG1sCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL2xhdGV4L3JlZi9ncm9vdnktcmVmZXJlbmNlLWNhcmQudGV4IGIvZ3Jvb3Z5L3NyYy9sYXRleC9yZWYvZ3Jvb3Z5LXJlZmVyZW5jZS1jYXJkLnRleApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjFlMTk1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9sYXRleC9yZWYvZ3Jvb3Z5LXJlZmVyZW5jZS1jYXJkLnRleApAQCAtMCwwICsxLDUyNiBAQAorXGRvY3VtZW50Y2xhc3NbMTBwdCwgbGFuZHNjYXBlXXthcnRpY2xlfQorXHVzZXBhY2thZ2V7bXVsdGljb2x9CitcdXNlcGFja2FnZXtncmFwaGljc30KKworJSB0dXJuIG9mZiBoZWFkZXIgYW5kIGZvb3RlcgorXHBhZ2VzdHlsZXtlbXB0eX0KKworXHNldGxlbmd0aHtcdGV4dGhlaWdodH17Ny41IGlufQorXHNldGxlbmd0aHtcdGV4dHdpZHRofXsxMS4yIGlufQorJVxzZXRsZW5ndGh7XGhvZmZzZXR9ey0yIGlufQorJVxzZXRsZW5ndGh7XHZvZmZzZXR9ey0xIGlufQorJVxzZXRsZW5ndGh7XGZvb3Rza2lwfXsxMiBwdH0KK1xzZXRsZW5ndGh7XG9kZHNpZGVtYXJnaW59ey0wLjc0IGlufQorXHNldGxlbmd0aHtcZXZlbnNpZGVtYXJnaW59ezAuNSBpbn0KK1xzZXRsZW5ndGh7XHRvcG1hcmdpbn17LTAuNzUgaW59Citcc2V0bGVuZ3Roe1xoZWFkaGVpZ2h0fXswIGlufQorXHNldGxlbmd0aHtcaGVhZHNlcH17MCBpbn0KKworCitcbWFrZWF0bGV0dGVyCitccmVuZXdjb21tYW5ke1xzZWN0aW9ufXtcQHN0YXJ0c2VjdGlvbntzZWN0aW9ufXsxfXswbW19JQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTFleCBwbHVzIC0uNWV4IG1pbnVzIC0uMmV4fSUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezAuNWV4IHBsdXMgLjJleH0leAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG5vcm1hbGZvbnRcbGFyZ2VcYmZzZXJpZXN9fQorXHJlbmV3Y29tbWFuZHtcc3Vic2VjdGlvbn17XEBzdGFydHNlY3Rpb257c3Vic2VjdGlvbn17Mn17MG1tfSUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0xZXhwbHVzIC0uNWV4IG1pbnVzIC0uMmV4fSUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezAuNWV4IHBsdXMgLjJleH0lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbm9ybWFsZm9udFxub3JtYWxzaXplXGJmc2VyaWVzfX0KK1xyZW5ld2NvbW1hbmRcc3Vic3Vic2VjdGlvbntcQHN0YXJ0c2VjdGlvbntzdWJzdWJzZWN0aW9ufXszfXswbW19JQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTFleCBwbHVzIC0uNWV4IG1pbnVzIC0uMmV4fSUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezFleCBwbHVzIC4yZXh9JQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG5vcm1hbGZvbnRcc21hbGxcYmZzZXJpZXN9fQorXG1ha2VhdG90aGVyCisKKyUgRG9uJ3QgcHJpbnQgc2VjdGlvbiBudW1iZXJzCitcc2V0Y291bnRlcntzZWNudW1kZXB0aH17MH0KKworCitcc2V0bGVuZ3Roe1xjb2x1bW5zZXB9ezAuNSBpbn0KKyVcc2V0bGVuZ3Roe1xjb2x1bW5zZXBydWxlfXswLjQgcHR9Citcc2V0bGVuZ3Roe1xwYXJpbmRlbnR9ezBwdH0KK1xzZXRsZW5ndGh7XHBhcnNraXB9ezBwdCBwbHVzIDAuNWV4fQorCisKKyUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitcYmVnaW57ZG9jdW1lbnR9CitccmFnZ2VkcmlnaHQKK1xmb290bm90ZXNpemUKKworCisKKyUgLS0gdGFidWxhciwgZ29vZCBmb3IgaHRtbCBvdXRwdXQKK1xuZXdjb21tYW5ke1xrZXl3b3JkU3VtbWFyeUhlYWRlcn1bMV17XGJlZ2lue3RhYnVsYXJ9e2xsfSAjMSBcZW5ke3RhYnVsYXJ9fQorXG5ld2NvbW1hbmR7XGtleXdvcmRTdW1tYXJ5fVsyXXt7XGJmICMxfSAmICMyIFxcfQorCitcbmV3Y29tbWFuZHtcb3BlcmF0b3JTdW1tYXJ5SGVhZGVyfVsxXXtcYmVnaW57dGFidWxhcn17bGx9ICMxIFxlbmR7dGFidWxhcn19CitcbmV3Y29tbWFuZHtcb3BlcmF0b3JTdW1tYXJ5fVsyXXsgIzEgJiB7XGJmICMyfSBcXH0KKyVcbmV3Y29tbWFuZHtcbWV0aG9kRGV0YWlsSGVhZGVyfVsxXXtcYmVnaW57dGFidWxhcn17cmxsfSAjMSBcZW5ke3RhYnVsYXJ9fQorJVxuZXdjb21tYW5ke1xtZXRob2REZXRhaWx9WzNdeyMxICYgIzIgJiAjMyBcXH0KKworJSAtLSB0YWJiaW5nLCBnb29kIGZvciBwZGYgb3V0cHV0CislXG5ld2NvbW1hbmR7XGtleXdvcmRTdW1tYXJ5SGVhZGVyfVsxXXtcYmVnaW57dGFiYmluZ30gamV6IFw9IGplei1yZXBlYXRlZC1mb3ItdGFiLXNldHRpbmdzLW9ubHkgXGtpbGwgIzEgXGVuZHt0YWJiaW5nfX0KKyVcbmV3Y29tbWFuZHtca2V5d29yZFN1bW1hcnl9WzJdeyMxIFxcIFw+ICMyIFxcfQorCitcbmV3Y29tbWFuZHtcbWV0aG9kRGV0YWlsSGVhZGVyfVsxXXtcYmVnaW57dGFiYmluZ30gamV6amUgXD0gamV6LXJlcGVhdGVkLWZvci10YWItc2V0dGluZ3Mtb25seSBca2lsbCAjMSBcZW5ke3RhYmJpbmd9fQorXG5ld2NvbW1hbmR7XG1ldGhvZERldGFpbH1bNF17IzFcPntcYmYgIzJ9IzNcXHtcc2NyaXB0c2l6ZSAjNH1cXH0KKworXG5ld2NvbW1hbmR7XG1ldGhvZFN1bW1hcnlIZWFkZXJ9WzFde1xiZWdpbnt0YWJiaW5nfSBqZXpqIFw9IGplei1yZXBlYXRlZC1mb3ItdGFiLXNldHRpbmdzLW9ubHkgXGtpbGwgIzEgXGVuZHt0YWJiaW5nfX0KK1xuZXdjb21tYW5ke1xtZXRob2RTdW1tYXJ5fVs0XXsjMVw+e1xiZiAjMn0jM1xcfQorCitcbmV3Y29tbWFuZHtcdG9vbERldGFpbEhlYWRlcn1bMV17XGJlZ2lue3RhYmJpbmd9IGplIFw9IGplei1yZXBlYXRlZC1mb3ItdGFiLXNldHRpbmdzLW9ubHkgXGtpbGwgIzEgXGVuZHt0YWJiaW5nfX0KK1xuZXdjb21tYW5ke1x0b29sRGV0YWlsfVs0XXsjMVw+e1xiZiAjMn0jM1xce1xzY3JpcHRzaXplICM0fVxcfQorCisKKworCitcbmV3Y29tbWFuZHtcaGVhZH1bMV17e1xsYXJnZVx0ZXh0YmZ7IzF9fVxcfQorCitcYmVnaW57bXVsdGljb2xzfXszfQorXHNldGxlbmd0aHtccHJlbXVsdGljb2xzfXsxcHR9Citcc2V0bGVuZ3Roe1xwb3N0bXVsdGljb2xzfXsxcHR9Citcc2V0bGVuZ3Roe1xtdWx0aWNvbHNlcH17MXB0fQorXHNldGxlbmd0aHtcY29sdW1uc2VwfXsycHR9CisKKworXGJlZ2lue3RhYnVsYXJ9e2xsfQorXHNjYWxlYm94ezAuMzV9e1xpbmNsdWRlZ3JhcGhpY3N7b25lLWdyb292eS1sb2dvLm1wc319ICAmICAge1xsYXJnZVx0ZXh0YmZ7R3Jvb3Z5fX0gICAgICBcXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmICAge1xsYXJnZVx0ZXh0YmZ7UmVmZXJlbmNlfX0gICBcXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmICAge1xsYXJnZVx0ZXh0YmZ7U3VtbWFyeX19CitcZW5ke3RhYnVsYXJ9CisKK0dST09WWS0xLjAKKwore1xlbSBGb3VydGggRWRpdGlvblwvfSAoTWF5IDIwMDcpCisKK1x2c2tpcCAwLjA1IGluCitJdGFsaWNzIGFyZSB1c2VkLCB3aGVyZSBwb3NzaWJsZSwgdG8gc2hvdyBkaWZmZXJlbmNlcyB0byBKYXZhCitcdnNraXAgMC4xNSBpbgorCitcc2VjdGlvbntLZXl3b3Jkc30KK1xzdWJzZWN0aW9ue0dyYW1tYXJ9Citca2V5d29yZFN1bW1hcnlIZWFkZXJ7Citca2V5d29yZFN1bW1hcnl7e1xlbSBhc30gICAgICAgIH17ICAgaW1wb3J0IHtcZW0gdHlwZVwvfSBhcyB7XGVtIGlkXC99fQorXGtleXdvcmRTdW1tYXJ5eyAgICAgICAgICAgICAgICB9eyAgIHtcZW0gZXhwclwvfSBhcyB7XGVtIHR5cGVcL319Citca2V5d29yZFN1bW1hcnl7YXNzZXJ0ICAgICAgICAgIH17ICAgYXNzZXJ0IHtcZW0gZXhwciBleHByP1wvfX0KK1xrZXl3b3JkU3VtbWFyeXticmVhayAgICAgICAgICAgfXsgICBicmVha30KK1xrZXl3b3JkU3VtbWFyeXtjYXNlICAgICAgICAgICAgfXsgICBzd2l0Y2gge1xlbSBleHByXC99IGNhc2Uge1xlbSBleHByIHN0bXQqXC99fQorXGtleXdvcmRTdW1tYXJ5e2NhdGNoICAgICAgICAgICB9eyAgIHRyeSB7XGVtIHN0bXQqXC99IGNhdGNoIHtcZW0gdHlwZSBpZCBzdG10KlwvfX0KK1xrZXl3b3JkU3VtbWFyeXtjbGFzcyAgICAgICAgICAgfXsgICB7XGVtIG1vZCpcL30gY2xhc3Mge1xlbSBpZFwvfX0KK1xrZXl3b3JkU3VtbWFyeXtjb250aW51ZSAgICAgICAgfXsgICBjb250aW51ZX0KK1xrZXl3b3JkU3VtbWFyeXt7XGVtIGRlZn0gICAgICAgfXsgICBkZWYge1xlbSBtZXRob2REZWNsYXJhdGlvblwvfX0KK1xrZXl3b3JkU3VtbWFyeXsgICAgICAgICAgICAgICAgfXsgICBkZWYge1xlbSB2YXJpYWJsZURlY2xhcmF0aW9uXC99fQorXGtleXdvcmRTdW1tYXJ5e2RlZmF1bHQgICAgICAgICB9eyAgIHN3aXRjaCB7XGVtIGV4cHJcL30gY2FzZSBkZWZhdWx0e1xlbSBzdG10KlwvfSB9Citca2V5d29yZFN1bW1hcnl7ZWxzZSAgICAgICAgICAgIH17ICAgaWYge1xlbSBleHByIHN0bXQqXC99IGVsc2UgaWYge1xlbSBleHByIHN0bXQqXC99fQorJSB0b2RvIC0gZW51bQorXGtleXdvcmRTdW1tYXJ5e2V4dGVuZHMgICAgICAgICB9eyAgIHtcZW0gbW9kKlwvfSBjbGFzcyB7XGVtIGlkXC99IGV4dGVuZHMge1xlbSB0eXBlXC99fQorJSB0b2RvIC0gc3ludGF4IHN1cHBvcnRzICJnZW5lcmljIiBleHRlbmRzLCBidXQgaGFzIG5vIGVmZmVjdCBpbiBncm9vdnkgMS4wCitca2V5d29yZFN1bW1hcnl7ZmluYWxseSAgICAgICAgIH17ICAgdHJ5IHtcZW0gc3RtdCp9IGZpbmFsbHkge1xlbSBzdG10Kn19CislXGtleXdvcmRTdW1tYXJ5e2ZvciAgICAgICAgICAgICB9eyAgIGZvciB7XGVtIGV4cHIqfTt7XGVtIGV4cHJ9O3tcZW0gZXhwcn0ge1xlbSBzdG10KlwvfX0KK1xrZXl3b3JkU3VtbWFyeXt7XGVtIGZvcn0gICAgICAgfXsgICBmb3Ige1xlbSBpZFwvfSBpbiB7XGVtIGlkIHN0bXQqXC99fQorXGtleXdvcmRTdW1tYXJ5e2lmICAgICAgICAgICAgICB9eyAgIGlmIHtcZW0gZXhwciBzdG10KlwvfSBlbHNlIGlmIHtcZW0gZXhwciBzdG10KlwvfX0KK1xrZXl3b3JkU3VtbWFyeXt7XGVtIGlufSAgICAgICAgfXsgICBmb3Ige1xlbSBpZFwvfSBpbiB7XGVtIGlkIHN0bXQqXC99fQorXGtleXdvcmRTdW1tYXJ5eyAgICAgICAgICAgICAgICB9eyAgIGlmIHtcZW0gaWRcL30gaW4ge1xlbSBjb2xsZWN0aW9uIHN0bXQqXC99fQorXGtleXdvcmRTdW1tYXJ5e2ltcGxlbWVudHMgICAgICB9eyAgIHtcZW0gbW9kKlwvfSBjbGFzcyB7XGVtIGlkXC99IGltcGxlbWVudHMge1xlbSB0eXBlKn19Citca2V5d29yZFN1bW1hcnl7aW1wb3J0ICAgICAgICAgIH17ICAgaW1wb3J0IHtcZW0gdHlwZVwvfX0KK1xrZXl3b3JkU3VtbWFyeXtpbnN0YW5jZW9mICAgICAgfXsgICB7XGVtIGV4cHJcL30gaW5zdGFuY2VvZiB7XGVtIHR5cGV9fQorXGtleXdvcmRTdW1tYXJ5e2ludGVyZmFjZSAgICAgICB9eyAgIHtcZW0gbW9kKlwvfSBpbnRlcmZhY2Uge1xlbSBpZFwvfX0KKyVca2V5d29yZFN1bW1hcnl7e1xlbSBtaXhpbn0gICAgIH17ICAge1xlbSBtb2QqXC99IG1peGluIHtcZW0gaWRcL319Citca2V5d29yZFN1bW1hcnl7bmV3ICAgICAgICAgICAgIH17ICAgbmV3IHtcZW0gdHlwZVwvfSB9Citca2V5d29yZFN1bW1hcnl7cGFja2FnZSAgICAgICAgIH17ICAgcGFja2FnZSB7XGVtIGlkXC99fQorXGtleXdvcmRTdW1tYXJ5e3JldHVybiAgICAgICAgICB9eyAgIHJldHVybiB7XGVtIGV4cHI/L30gfQorJSBub3Qgc3VyZSBpZiAnc3VwZXInIGFuZCAndGhpcycgYXJlIHdvcnRoIGluY2x1ZGluZyBoZXJlPworXGtleXdvcmRTdW1tYXJ5e3N3aXRjaCAgICAgICAgICB9eyAgIHN3aXRjaCB7XGVtIGV4cHJcL30gY2FzZSB7XGVtIGV4cHIgc3RtdCpcL30gfQorXGtleXdvcmRTdW1tYXJ5e3Rocm93ICAgICAgICAgICB9eyAgIHRocm93IHtcZW0gZXhwclwvfSB9Citca2V5d29yZFN1bW1hcnl7dGhyb3dzICAgICAgICAgIH17ICAge1xlbSBtZXRob2REZWNsYXJhdGlvbn0gdGhyb3dzIHtcZW0gdHlwZVwvfSB9Citca2V5d29yZFN1bW1hcnl7dHJ5ICAgICAgICAgICAgIH17ICAgdHJ5IHtcZW0gc3RtdCpcL30gY2F0Y2gge1xlbSB0eXBlIGlkIHN0bXQqXC99fQorXGtleXdvcmRTdW1tYXJ5e3doaWxlICAgICAgICAgICB9eyAgIHdoaWxlIHtcZW0gZXhwclwvfSB7XGVtIHN0bXQqXC99fQorJSBxdWlldCBvbiBzdGF0aWNzLCBzdGF0aWMgaW1wb3J0cyBldGMgKGlmIHRoZXkgd2FudCB0byB1c2Ugc3RhdGljcywgbWFrZSBlbSBsb29rISBid2hhIGhhIGhhKQorfQorCisKK1xzdWJzZWN0aW9ue01vZGlmaWVyc30KK1xrZXl3b3JkU3VtbWFyeUhlYWRlcnsKK1xrZXl3b3JkU3VtbWFyeXthYnN0cmFjdCAgICAgICAgfXsgICBhYnN0cmFjdCBjbGFzcyB7XGVtIGlkXC99fQorXGtleXdvcmRTdW1tYXJ5e0Fubm90YXRpb25zICAgICB9eyAgIEBBbm5vdGF0aW9ufQorXGtleXdvcmRTdW1tYXJ5e0Fubm90YXRpb25zICAgICB9eyAgIEBBbm5vdGF0aW9uKHggPSAzLCB5ID0gNSl9Citca2V5d29yZFN1bW1hcnl7ZmluYWwgICAgICAgICAgIH17ICAgZmluYWwgaW50IHtcZW0gaWRcL30gPSA0Mn0KKyV0b2RvIC0gbmF0aXZlCitca2V5d29yZFN1bW1hcnl7cHJpdmF0ZSAgICAgICAgIH17ICAgcHJpdmF0ZSBTdHJpbmcgbXlTZWNyZXR9Citca2V5d29yZFN1bW1hcnl7cHJvdGVjdGVkICAgICAgIH17ICAgcHJvdGVjdGVkIExpc3QgZm9vfQorXGtleXdvcmRTdW1tYXJ5e3B1YmxpYyAgICAgICAgICB9eyAgIHB1YmxpYyBEYXRlIG5ld1llYXJ9Citca2V5d29yZFN1bW1hcnl7c3RhdGljICAgICAgICAgIH17ICAgc3RhdGljIGludCB7XGVtIGlkXC99fQorXGtleXdvcmRTdW1tYXJ5e3N0cmljdGZwICAgICAgICB9eyAgIHN0cmljdGZwIGZsb2F0IHtcZW0gaWRcL319Citca2V5d29yZFN1bW1hcnl7c3luY2hyb25pemVkICAgIH17ICAgc3luY2hyb25pemVkIG15TWV0aG9kKCl9Citca2V5d29yZFN1bW1hcnl7dHJhbnNpZW50ICAgICAgIH17ICAgdHJhbnNpZW50IGxvbmcgZGlzdGFuY2V9Citca2V5d29yZFN1bW1hcnl7dm9sYXRpbGUgICAgICAgIH17ICAgdm9sYXRpbGUgaW50IGRpYW1vbmR9Cit9CisKK1xzdWJzZWN0aW9ue0xpc3RzIGFuZCBNYXBzfQorXGtleXdvcmRTdW1tYXJ5SGVhZGVyeworXGtleXdvcmRTdW1tYXJ5eyAgICAgICAgICAgICAgICB9eyAgIHtcZW0gdHlwZVwvfVtdIHtcZW0gaWRcL30gPSBuZXcge1xlbSB0eXBlXC99W3tcZW0gc2l6ZVwvfV19Citca2V5d29yZFN1bW1hcnl7ICAgICAgICAgICAgICAgIH17ICAgTGlzdCBwZW9wbGUgPSBbZnJlZCwgYmFybmV5XSB9Citca2V5d29yZFN1bW1hcnl7ICAgICAgICAgICAgICAgIH17ICAgTWFwIHdpbG1hID0gW2ZyaWVuZDpiZXR0eSwgYWdlOnVua25vd25dIH0KK30KK1xzdWJzZWN0aW9ue09wZXJhdG9yc30KK1xvcGVyYXRvclN1bW1hcnlIZWFkZXJ7Citcb3BlcmF0b3JTdW1tYXJ5eyB7XGVtIGlkXC99ICAgICAgICAgICAgICAgID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XGVtIGV4cHJcL30gfXsgYXNzaWdufQorXG9wZXJhdG9yU3VtbWFyeXsge1xlbSBleHByXC99ICAgICAgICAgICAgICBcJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xlbSBleHByXC99IH17IGJpdHdpc2UtYW5kfQorXG9wZXJhdG9yU3VtbWFyeXsge1xlbSBpZFwvfSAgICAgICAgICAgICAgICBcJj0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xlbSBleHByXC99IH17IGJpdHdpc2UtYW5kIGFzc2lnbn0KK1xvcGVyYXRvclN1bW1hcnl7IHtcZW0gaWRcL30gPSAgICAgICAgICAgICAgfiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcZW0gZXhwclwvfSB9eyBiaXR3aXNlLW5vdH0gJXRvZG8gLSBkb2Vzbid0IHJlbmRlcgorXG9wZXJhdG9yU3VtbWFyeXsge1xlbSBleHByXC99ICAgICAgICAgICAgICBcdGV4dGJhclwvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xlbSBleHByXC99IH17IGJpdHdpc2Utb3J9Citcb3BlcmF0b3JTdW1tYXJ5eyB7XGVtIGlkXC99ICAgICAgICAgICAgICAgIFx0ZXh0YmFyXC89ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XGVtIGV4cHJcL30gfXsgYml0d2lzZS1vciBhc3NpZ259Citcb3BlcmF0b3JTdW1tYXJ5eyB7XGVtIGV4cHJcL30gICAgICAgICAgICAgIFx0ZXh0Z3JlYXRlclx0ZXh0Z3JlYXRlclx0ZXh0Z3JlYXRlclwvICB7XGVtIGV4cHJcL30gfXsgYml0d2lzZS1zaGlmdC1yaWdodH0KK1xvcGVyYXRvclN1bW1hcnl7IHtcZW0gaWRcL30gICAgICAgICAgICAgICAgXHRleHRncmVhdGVyXHRleHRncmVhdGVyXHRleHRncmVhdGVyPVwvIHtcZW0gZXhwclwvfSB9eyBiaXR3aXNlLXNoaWZ0LXJpZ2h0IGFzc2lnbn0KKyVcb3BlcmF0b3JTdW1tYXJ5eyB7XGVtIGV4cHJcL30gICAgICAgICAgICAgIFx3ZWRnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XGVtIGV4cHJcL30gfXsgYml0d2lzZS1leGNsdXNpdmUtb3J9CislXG9wZXJhdG9yU3VtbWFyeXsge1xlbSBleHByXC99ICAgICAgICAgICAgICBcd2VkZ2VcLz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xlbSBleHByXC99IH17IGJpdHdpc2UtZXhjbHVzaXZlLW9yIGFzc2lnbn0KK1xvcGVyYXRvclN1bW1hcnl7IHtcZW0gZXhwclwvfSAgICAgICAgICAgICAgXHRleHRsZXNzPVx0ZXh0Z3JlYXRlclwvICAgICAgICAgICAgICAgIHtcZW0gZXhwclwvfSB9eyB7XGVtIGNvbXBhcmUgdG9cL319Citcb3BlcmF0b3JTdW1tYXJ5eyAgICAgICAgICAgICAgICAgICAgICAgICAgICQtLSQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XGVtIGlkXC99ICAgfXsgcHJlLWRlY3JlbWVudH0KK1xvcGVyYXRvclN1bW1hcnl7IHtcZW0gZXhwclwvfSAgICAgICAgICAgICAgJC8kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcZW0gZXhwclwvfSB9eyBkaXZpc2lvbn0KK1xvcGVyYXRvclN1bW1hcnl7IHtcZW0gaWRcL30gICAgICAgICAgICAgICAgJC89JCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcZW0gZXhwclwvfSB9eyBkaXZpc2lvbiBhc3NpZ259Citcb3BlcmF0b3JTdW1tYXJ5eyB7XGVtIGV4cHJcL30gICAgICAgICAgICAgID09ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XGVtIGV4cHJcL30gfXsgZXF1YWx9Citcb3BlcmF0b3JTdW1tYXJ5eyB7XGVtIGV4cHJcL30gICAgICAgICAgICAgICQ+PSQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XGVtIGV4cHJcL30gfXsgZ3JlYXRlciBvciBlcXVhbH0KK1xvcGVyYXRvclN1bW1hcnl7IHtcZW0gZXhwclwvfSAgICAgICAgICAgICAgJD4kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcZW0gZXhwclwvfSB9eyBncmVhdGVyIHRoYW59Citcb3BlcmF0b3JTdW1tYXJ5eyAgICAgICAgICAgICAgICAgICAgICAgICAgICQrKyQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XGVtIGlkXC99ICAgfXsgcHJlLWluY3JlbWVudH0KK1xvcGVyYXRvclN1bW1hcnl7IHtcZW0gZXhwclwvfSAgICAgICAgICAgICAgXCZcJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcZW0gZXhwclwvfSB9eyBsb2dpY2FsLWFuZH0KK1xvcGVyYXRvclN1bW1hcnl7IHtcZW0gZXhwclwvfSAgICAgICAgICAgICAgJDw9JCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcZW0gZXhwclwvfSB9eyBsZXNzIG9yIGVxdWFsfQorXG9wZXJhdG9yU3VtbWFyeXsgICAgICAgICAgICAgICAgICAgICAgICAgICAhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xlbSBleHByXC99IH17IGxvZ2ljYWwtbm90fQorXG9wZXJhdG9yU3VtbWFyeXsge1xlbSBleHByXC99ICAgICAgICAgICAgICBcdGV4dGJhclx0ZXh0YmFyXC8gICAgICAgICAgICAgICAgICAgICAge1xlbSBleHByXC99IH17IGxvZ2ljYWwtb3J9Citcb3BlcmF0b3JTdW1tYXJ5eyB7XGVtIGV4cHJcL30gICAgICAgICAgICAgIFx0ZXh0bGVzc1wvICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XGVtIGV4cHJcL30gfXsgbGVzc30KK1xvcGVyYXRvclN1bW1hcnl7IHtcZW0gZXhwclwvfSAgICAgICAgICAgICAgLlwmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcZW0gZXhwclwvfSB9eyB7XGVtIG1lbWJlci1wb2ludGVyXC99fQorXG9wZXJhdG9yU3VtbWFyeXsge1xlbSBleHByXC99ICAgICAgICAgICAgICAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xlbSBleHByXC99IH17IG1pbnVzfQorXG9wZXJhdG9yU3VtbWFyeXsge1xlbSBpZFwvfSAgICAgICAgICAgICAgICAtPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xlbSBleHByXC99IH17IG1pbnVzIGFzc2lnbn0KK1xvcGVyYXRvclN1bW1hcnl7IHtcZW0gZXhwclwvfSAgICAgICAgICAgICAgXCUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcZW0gZXhwclwvfSB9eyBtb2R1bHVzfQorXG9wZXJhdG9yU3VtbWFyeXsge1xlbSBpZFwvfSAgICAgICAgICAgICAgICBcJT0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xlbSBleHByXC99IH17IG1vZHVsdXMgYXNzaWdufQorXG9wZXJhdG9yU3VtbWFyeXsge1xlbSBleHByXC99ICAgICAgICAgICAgICAhPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xlbSBleHByXC99IH17IG5vdCBlcXVhbH0KK1xvcGVyYXRvclN1bW1hcnl7IHtcZW0gZXhwclwvfSAgICAgICAgICAgICAgPy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcZW0gZXhwclwvfSB9eyB7XGVtIG9wdGlvbmFsIGRvdFwvfX0KK1xvcGVyYXRvclN1bW1hcnl7IHtcZW0gZXhwclwvfSAgICAgICAgICAgICAgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcZW0gZXhwclwvfSB9eyBwbHVzfQorXG9wZXJhdG9yU3VtbWFyeXsge1xlbSBpZFwvfSAgICAgICAgICAgICAgICArPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xlbSBleHByXC99IH17IHBsdXMgYXNzaWdufQorXG9wZXJhdG9yU3VtbWFyeXsge1xlbSBpZFwvfSAgICAgICAgICAgICAgICAkKyskICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH17IHBvc3QtZGVjcmVtZW50fQorXG9wZXJhdG9yU3VtbWFyeXsge1xlbSBpZFwvfSAgICAgICAgICAgICAgICAkKyskICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH17IHBvc3QtaW5jcmVtZW50fQorfQorXHN1YnNlY3Rpb257T3BlcmF0b3JzMn0KK1xvcGVyYXRvclN1bW1hcnlIZWFkZXJ7Citcb3BlcmF0b3JTdW1tYXJ5eyB7XGVtIGV4cHJcL30gICAgICAgICAgICAgID8gICAgICAgICAgICAgICAgICAgICAgICB7XGVtIGV4cHJcL30gOiB7XGVtIGV4cHJcL30gfXsgdGVybmFyeSBpZi9lbHNlfQorXG9wZXJhdG9yU3VtbWFyeXsge1xlbSBleHByXC99ICAgICAgICAgICAgICAuLlx0ZXh0bGVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xlbSBleHByXC99IH17IHtcZW0gcmFuZ2UgZXhjbHVzaXZlXC99fQorXG9wZXJhdG9yU3VtbWFyeXsge1xlbSBleHByXC99ICAgICAgICAgICAgICAuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xlbSBleHByXC99IH17IHtcZW0gcmFuZ2UgaW5jbHVzaXZlXC99fQorXG9wZXJhdG9yU3VtbWFyeXsgICAgICAgICAgICAgICAgICAgICAgICAgICAve1xlbSByZWdleFwvfS8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH17IHtcZW0gcmVnZXggbGl0ZXJhbFwvfX0KK1xvcGVyYXRvclN1bW1hcnl7IHtcZW0gaWRcL30gICAgICAgICAgICAgICAgPX4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAve1xlbSByZWdleFwvfS99eyB7XGVtIHJlZ2V4IGZpbmRcL319ICV0b2RvIC0gdGlsZGUgZG9lc24ndCByZW5kZXIKK1xvcGVyYXRvclN1bW1hcnl7IHtcZW0gaWRcL30gICAgICAgICAgICAgICAgPT1+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAve1xlbSByZWdleFwvfS99eyB7XGVtIHJlZ2V4IG1hdGNoXC99fSAldG9kbyAtIHRpbGRlIGRvZXNuJ3QgcmVuZGVyCitcb3BlcmF0b3JTdW1tYXJ5eyB7XGVtIGV4cHJcL30gICAgICAgICAgICAgIC5AICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcZW0gZXhwclwvfSB9eyB7XGVtIHNlbGVjdCBzbG90XC99fQorXG9wZXJhdG9yU3VtbWFyeXsge1xlbSBleHByXC99ICAgICAgICAgICAgICBcdGV4dGxlc3NcdGV4dGxlc3NcLyAgICAgICAgICAgICAgICAgICB7XGVtIGV4cHJcL30gfXsgc2hpZnQtbGVmdH0KK1xvcGVyYXRvclN1bW1hcnl7IHtcZW0gZXhwclwvfSAgICAgICAgICAgICAgXHRleHRsZXNzXHRleHRsZXNzPVwvICAgICAgICAgICAgICAgICAge1xlbSBleHByXC99IH17IHNoaWZ0LWxlZnQtYXNzaWdufQorXG9wZXJhdG9yU3VtbWFyeXsgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XGVtIGNsdG5cL30gfXsge1xlbSBzcHJlYWQgYXJnXC99fQorXG9wZXJhdG9yU3VtbWFyeXsge1xlbSBjbHRuXC99ICAgICAgICAgICAgICAqLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XGVtIGV4cHJcL30gfXsge1xlbSBzcHJlYWQgZG90XC99fQorXG9wZXJhdG9yU3VtbWFyeXsgICAgICAgICAgICAgICAgICAgICAgICAgICAqOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XGVtIG1hcCBcL30gfXsge1xlbSBzcHJlYWQtbWFwIGFyZ1wvfX0KK1xvcGVyYXRvclN1bW1hcnl7IHtcZW0gZXhwclwvfSAgICAgICAgICAgICAgXHRleHRncmVhdGVyXHRleHRncmVhdGVyXC8gICAgICAgICAgICAge1xlbSBleHByXC99IH17IHNoaWZ0LXJpZ2h0fQorXG9wZXJhdG9yU3VtbWFyeXsge1xlbSBleHByXC99ICAgICAgICAgICAgICBcdGV4dGdyZWF0ZXJcdGV4dGdyZWF0ZXI9XC8gICAgICAgICAgICB7XGVtIGV4cHJcL30gfXsgc2hpZnQtcmlnaHQtYXNzaWdufQorXG9wZXJhdG9yU3VtbWFyeXsge1xlbSBleHByXC99ICAgICAgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XGVtIGV4cHJcL30gfXsgbXVsdGlwbHl9Citcb3BlcmF0b3JTdW1tYXJ5eyB7XGVtIGlkXC99ICAgICAgICAgICAgICAgICo9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcZW0gZXhwclwvfSB9eyBtdWx0aXBseSBhc3NpZ259Citcb3BlcmF0b3JTdW1tYXJ5eyB7XGVtIGV4cHJcL30gICAgICAgICAgICAgICoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcZW0gZXhwclwvfSB9eyB0by10aGUtcG93ZXItb2Z9Citcb3BlcmF0b3JTdW1tYXJ5eyB7XGVtIGlkXC99ICAgICAgICAgICAgICAgICoqPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcZW0gZXhwclwvfSB9eyB0by10aGUtcG93ZXItb2YgYXNzaWdufQorXG9wZXJhdG9yU3VtbWFyeXsgICAgICAgICAgICAgICAgICAgICAgICAgICBge1xlbSBzdHJpbmdcL30nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfXsge1xlbSBzdHJpbmcgbGl0ZXJhbFwvfX0KK1xvcGVyYXRvclN1bW1hcnl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgYGB7XGVtIHN0cmluZ1wvfSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH17IHN0cmluZyBsaXRlcmFsfQorXG9wZXJhdG9yU3VtbWFyeXsgICAgICAgICAgICAgICAgICAgICAgICAgICBgIGAgYHtcZW0gc3RyaW5nXC99JyAnICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgfXsge1xlbSBtdWx0aS1saW5lLXN0cmluZyBsaXRlcmFsXC99fQorXG9wZXJhdG9yU3VtbWFyeXsgICAgICAgICAgICAgICAgICAgICAgICAgICBgYGBgYGB7XGVtIHN0cmluZ1wvfSIiIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfXsge1xlbSBtdWx0aS1saW5lLXN0cmluZyBsaXRlcmFsXC99fSAKK1xvcGVyYXRvclN1bW1hcnl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgJC0kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xlbSBpZFwvfSAgIH17IHVuYXJ5LW1pbnVzfQorXG9wZXJhdG9yU3VtbWFyeXsgICAgICAgICAgICAgICAgICAgICAgICAgICAkKyQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XGVtIGlkXC99ICAgfXsgdW5hcnktcGx1c30KK1xvcGVyYXRvclN1bW1hcnl7IHtcZW0gdHlwZVwvfSAgICAgICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xlbSBpZFwvfSAgIH17IHZhcmlhYmxlIHBhcmFtZXRlcnN9CisKKyV0b2RvIC0gcGVyaGFwcyBwdXQgaW5kZXggb3BlcmF0b3JzIGhlcmUsIGkuZS4gZm9vWzFdCisKK30KKyUgbm90IHN1cHBvcnRlZCBpbiBncm9vdnkgeWV0CislICJwdWJsaWMgQGludGVyZmFjZSBGb297fSIKKyUgInB1YmxpYyBAaW50ZXJmYWNlIEZvb3tpbnQgYmFyKCkgZGVmYXVsdCAxMjN9IgorCisKKyUgXHN1YnNlY3Rpb257VHlwZXN9CislIFxrZXl3b3JkU3VtbWFyeUhlYWRlcnsKKyUgXGtleXdvcmRTdW1tYXJ5e2Jvb2xlYW4gICAgICAgICB9eyAgIHRydWUge1xlbSBvclwvfSBmYWxzZX0KKyUgXGtleXdvcmRTdW1tYXJ5e2J5dGUgICAgICAgICAgICB9eyAgIC0xMjggdG8gMTI3fQorJSBca2V5d29yZFN1bW1hcnl7Y2hhciAgICAgICAgICAgIH17ICAgdTAwMDAgdG8gdUZGRkYgfQorJSBca2V5d29yZFN1bW1hcnl7ZG91YmxlICAgICAgICAgIH17ICAgJFxwbSA0LjlFXnstMzI0fSQgdG8gJFxwbSAxLjhFXnsrMzA4fSR9CislIFxrZXl3b3JkU3VtbWFyeXtmbG9hdCAgICAgICAgICAgfXsgICAkXHBtIDEuNEVeey00NX0kIHRvICRccG0gMy40RV57KzM4fSR9CislIFxrZXl3b3JkU3VtbWFyeXtpbnQgICAgICAgICAgICAgfXsgICAtMiwxNDcsNDgzLDY0OCB0byAyLDE0Nyw0ODMsNjQ3fQorJSBca2V5d29yZFN1bW1hcnl7bG9uZyAgICAgICAgICAgIH17ICAgLTksMjIzLDM3MiwwMzYsODU0LDc3NSw4MDggfQorJSBca2V5d29yZFN1bW1hcnl7ICAgICAgICAgICAgICAgIH17ICAgdG8gOSwyMjMsMzcyLDAzNiw4NTQsNzc1LDgwN30KKyUgXGtleXdvcmRTdW1tYXJ5e3Nob3J0ICAgICAgICAgICB9eyAgIC0zMiw3NjggdG8gMzIsNzY3fQorJSBca2V5d29yZFN1bW1hcnl7dm9pZCAgICAgICAgICAgIH17ICAgfQorJSB0b2RvIC0gZXhwb25lbnRzIGUuZy4gMS4yZS0xMAorJSB0b2RvIC0gaGV4IGRpZ2l0cyBlLmcuIDB4Q2FGZQorJSB0b2RvIC0gYmlnIGRlY2ltYWwvaW50IGxpdGVyYWxzIGUuZy4gOS44ZyBhbmQgOWcKKyUgdG9kbyAtIGZsb2F0IGFuZCBkb3VibGUgbGl0ZXJhbHMgZS5nLiAzNC40ZiBhbmQgNTMuNWQKKyUgdG9kbyAtIGxvbmcgbGl0ZXJhbHMgZS5nLiAxMmwKKyUgfQorCitcdnNraXAgMC41IGluCisKK1xzZWN0aW9ue0dyb292eSBKREt9CislIGJhc2VkIHVwb24gRGVmYXVsdEdyb292eU1ldGhvZHMgcjEuMTE0Citcc3Vic2VjdGlvbntDb2xsZWN0aW9ucyBhbmQgcHJvcGVydGllc30KK3tcc2NyaXB0c2l6ZSB7XGVtIE5vdGU6IGNsdG4gaW4gdGhpcyBzZW5zZSB7XGVtIGNhblwvfSBpbmNsdWRlIGxpc3RzLCBzZXRzLCBtYXRjaGVycywgc3RyaW5ncywgY2hhclNlcXMgYW5kIGFycmF5c1wvfX0KKworXG1ldGhvZERldGFpbEhlYWRlcnsKKyUgYS5nZXRBdChiKSBhbmQgYS5wdXRBdChiLGMpIGFyZSBlcXVpdiB0byBhW2JdIGFuZCBhW2JdID0gYyByZXNwZWN0aXYuIAorJVxtZXRob2REZXRhaWx7IGNsdG4uIH17IGdldEF0fXsoaW5kZXhcdGV4dGJhciBpbmRpY2VzXHRleHRiYXIgcmFuZ2UpIH17IG9idGFpbnMgb2JqZWN0cyBhdCBzcGVjaWZpZWQge1xlbSBpbmRpY2llc1wvfSBvciBpbiB7XGVtIHJhbmdlXC99fQorJVxtZXRob2REZXRhaWx7IGNsdG4uIH17IGdldEF0fXsocHJvcGVydHkpICAgICAgICAgICAgICAgICAgICAgICAgIH17IG9idGFpbnMge1xlbSBwcm9wZXJ0eVwvfSBmcm9tIGVhY2ggb2JqZWN0IGluIGNvbGxlY3Rpb259CislXG1ldGhvZERldGFpbHsgIG9iai4gfXsgcHV0QXR9eyhpZHgsIHZhbHVlKSAgICAgICAgICAgICAgICAgICAgICAgfXsgcHV0IHtcZW0gdmFsdWVcL30gYXQgcG9zaXRpb24ge1xlbSBpZHhcL30gfSAKKyVcbWV0aG9kRGV0YWlseyAgb2JqLiB9eyBwdXRBdH17KHByb3BlcnR5TmFtZSwgdmFsdWUpICAgICAgICAgICAgICB9eyBwdXQge1xlbSB2YWx1ZVwvfSBpbiB0aGUge1xlbSBwcm9wZXJ0eU5hbWVcL30gfQorXG1ldGhvZERldGFpbHsgIGNsdG4gfXtbfXtpbmRleFx0ZXh0YmFyIGluZGljZXNcdGV4dGJhciByYW5nZVx0ZXh0YmFyIHByb3BlcnR5IHtcYmYgXX19eyBvYnRhaW5zIG9iamVjdHMgYXQgc3BlY2lmaWVkIGxvY2F0aW9ufQorXG1ldGhvZERldGFpbHsgICBvYmogfXtbfXtpbmRleFx0ZXh0YmFyIHByb3BlcnR5e1xiZiBdID19IHZhbHVlICAgIH17IHB1dCB7XGVtIHZhbHVlXC99IGF0IGxvY2F0aW9uIH0gCitcbWV0aG9kRGV0YWlseyAgY2x0biB9eyBcdGV4dGxlc3NcdGV4dGxlc3N9eyBvYmogICAgICAgICAgICAgICAgICB9eyBhcHBlbmQgb2JqIHRvIGNvbGxlY3Rpb259CitcbWV0aG9kU3VtbWFyeXsgIGNsdG4gfXsgJCskfXsgb2JqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9eyBhcHBlbmQgb2JqIHRvIGNvbGxlY3Rpb259CislXG1ldGhvZERldGFpbHsgIGNsdG4gfXsgJCskfXsgY2x0biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9eyBhcHBlbmQgY29sbGVjdGlvbiB0byBjb2xsZWN0aW9ufQorXG1ldGhvZFN1bW1hcnl7ICBsaXN0IH17ICQtJH17IGNsdG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfXsgcmVtb3ZlIGl0ZW1zIGZyb20gbGlzdH0KK1xtZXRob2REZXRhaWx7ICBjbHRuIH17ICQqJH17IG51bSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfXsgcmVwZWF0IGl0ZW1zIGluIGNvbGxlY3Rpb24gYSBudW1iZXIgb2YgdGltZXN9CitcbWV0aG9kRGV0YWlseyAgICAgICB9eyAgfXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9eyB9CislIG5vIGNvdW50KCkgb3IgZ2V0QXQocmFuZ2UpIGZvciBtYXRjaGVycyEKK1xtZXRob2REZXRhaWx7ICBvYmouIH17IGdldFByb3BlcnRpZXN9eygpICAgICAgICAgICAgICAgICAgICAgICAgIH17IG9idGFpbiBNYXAgb2YgcHJvcGVydGllcyBvbiB7XGVtIG9ialwvfX0KK1xtZXRob2REZXRhaWx7ICBvYmouIH17IGdldE1ldGFQcm9wZXJ0eVZhbHVlc317KCkgICAgICAgICAgICAgICAgIH17IG9idGFpbiBMaXN0IG9mIG1ldGEgcHJvcGVydGllcyBvbiB7XGVtIG9ialwvfX0KK1xtZXRob2REZXRhaWx7IGNsdG4uIH17IGNvdW50fXsob2JqKSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIH17IGNvdW50cyBudW1iZXIgb2Ygb2NjdXJhbmNlcyBvZiB7XGVtIG9ialwvfSBpbiBjb2xsZWN0aW9ufQorXG1ldGhvZFN1bW1hcnl7ICBtYXAuIH17IGdldH17KGtleSwgZGVmYXVsdFZhbHVlKSAqICAgICAgICAgICAgICAgIH17IHRyeSB0byBnZXQge1xlbSBrZXkgXC99IGZyb20gbWFwLCBvdGhlcndpc2UgcHV0IHtcZW0gZGVmYXVsdFZhbHVlXC99IGluIG1hcCBhbmQgcmV0dXJuIH0KK1xtZXRob2RTdW1tYXJ5eyBjbHRuLiB9eyBzaXplfXsoKSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9eyByZXR1cm5zIHNpemUgb2YgYW4gYXJyYXkgb3Igc3RyaW5nIH0KK1xtZXRob2REZXRhaWx7ICAgICAgIH17ICAgfXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH17IH0KK1xtZXRob2REZXRhaWx7IGNsdG4uIH17IGNvbGxlY3R9eygpIFx7Y2xvc3VyZVx9ICogICAgICAgICAgICAgICAgIH17IG5ldyBjb2xsZWN0aW9uIG9mIHtcZW0gY2xvc3VyZSBcL30gdHJhbnNmb3JtZWQgaXRlbXMgfQorXG1ldGhvZERldGFpbHsgIG9iai4gfXsgZWFjaH17KCkgXHtjbG9zdXJlXH0gKiAgICAgICAgICAgICAgICAgICAgfXsgaXRlcmF0ZSB0aHJvdWdoIG9iamVjdCBhcHBseWluZyB7XGVtIGNsb3N1cmVcL30gfQorXG1ldGhvZERldGFpbHsgIG9iai4gfXsgZWFjaFdpdGhJbmRleH17KCkgXHtjbG9zdXJlXH0gICAgICAgICAgICAgfXsgaXRlcmF0ZSB0aHJvdWdoIG9iamVjdCB3aXRoIGEgY291bnRlciBhcHBseWluZyB7XGVtIGNsb3N1cmVcL30gfQorXG1ldGhvZERldGFpbHsgIG9iai4gfXsgZmluZH17KCkgXHtjbG9zdXJlXH0gKiAgICAgICAgICAgICAgICAgICAgfXsgZmluZCBmaXJzdCBpdGVtIHBpY2tlZCBieSB7XGVtIGNsb3N1cmUgXC99IGNvbmRpdGlvbiB9CitcbWV0aG9kRGV0YWlseyAgb2JqLiB9eyBmaW5kQWxsfXsoKSBce2Nsb3N1cmVcfSAqICAgICAgICAgICAgICAgICB9eyByZXR1cm5zIGFsbCBpdGVtcyBwaWNrZWQgYnkge1xlbSBjbG9zdXJlXC99IGNvbmRpdGlvbiB9CitcbWV0aG9kRGV0YWlseyAgb2JqLiB9eyBmaW5kSW5kZXhPZn17KCkgXHtjbG9zdXJlXH0gICAgICAgICAgICAgICB9eyByZXR1cm4gZmlyc3QgaW5kZXggdGhhdCBtYXRjaGVzIGNvbmRpdGlvbiB7XGVtIGNsb3N1cmVcL30gfQorXG1ldGhvZFN1bW1hcnl7ICBvYmouIH17IGdyZXB9eyhyZWdleFx0ZXh0YmFyIHJhbmdlXHRleHRiYXIgZXRjLi4pICogICAgICAgICAgICAgICB9eyByZXR1cm5zIGFsbCBtYXRjaGluZyBpdGVtcyB9CitcbWV0aG9kRGV0YWlseyBjbHRuLiB9eyBpbmplY3R9eyh2YWx1ZSkgXHtjbG9zdXJlXH0gICAgICAgICAgICAgICB9eyByZXR1cm5zIGNsb3N1cmUoIGNsb3N1cmUoIGNsb3N1cmUodmFsdWUsaXRlbTApICxpdGVtMSkgLGl0ZW0yKSAuLi4gfQorXG1ldGhvZERldGFpbHsgY2x0bi4gfXsgbWF4fXsoW2NvbXBhcmF0b3JdKSBce2Nsb3N1cmVcfSAqICAgICAgICAgfXsgcmV0dXJucyB0aGUgbWF4aW11bSB2YWx1ZSBmb3VuZCBpbiB0aGUgY29sbGVjdGlvbiB9CitcbWV0aG9kRGV0YWlseyBjbHRuLiB9eyBtaW59eyhbY29tcGFyYXRvcl0pIFx7Y2xvc3VyZVx9ICogICAgICAgICB9eyByZXR1cm5zIHRoZSBtaW5pbXVtIHZhbHVlIGZvdW5kIGluIHRoZSBjb2xsZWN0aW9uIH0KK1xtZXRob2REZXRhaWx7IGxpc3QuIH17IHJldmVyc2VFYWNofXsoKSBce2Nsb3N1cmVcfSAgICAgICAgICAgICAgIH17IGl0ZXJhdGUgYmFja3dhcmRzIHRocm91Z2ggbGlzdCBhcHBseWluZyB7XGVtIGNsb3N1cmVcL319CitcbWV0aG9kRGV0YWlseyBjbHRuLiB9eyBzb3J0fXsoW2NvbXBhcmF0b3JdKSAqICAgICAgICAgICAgICAgICAgICB9eyBzb3J0cyBjb2xsZWN0aW9uIGludG8gYSBsaXN0LCBvcHRpb25hbGx5IHVzaW5nIGEge1xlbSBjb21wYXJhdG9yXC99fQorXG1ldGhvZERldGFpbHsgY2x0bi4gfXsgc29ydH17KCkgXHtjbG9zdXJlXH0gKiAgICAgICAgICAgICAgICAgICAgfXsgc29ydHMgY29sbGVjdGlvbiBpbnRvIGEgbGlzdCB1c2luZyBjbG9zdXJlIGFzIGNvbXBhcmF0b3J9CitcbWV0aG9kRGV0YWlseyAgICAgICB9eyAgICAgfXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9eyB9CitcbWV0aG9kU3VtbWFyeXsgY2x0bi4gfXsgYXNJbW11dGFibGV9eygpICAgICAgICAgICAgICAgICAgICAgICAgICAgfXsgY3JlYXRlIGFuIGltbXV0YWJsZSBjb2xsZWN0aW9uIH0KK1xtZXRob2RTdW1tYXJ5eyBjbHRuLiB9eyBhc1N5bmNocm9uaXplZH17KCkgICAgICAgICAgICAgICAgICAgICAgICB9eyBjcmVhdGUgYSBzeW5jaHJvbml6ZWQgY29sbGVjdGlvbiB9CitcbWV0aG9kU3VtbWFyeXsgbGlzdC4gfXsgZmxhdHRlbn17KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfXsgZmxhdHRlbnMgbGlzdCB9CitcbWV0aG9kRGV0YWlseyBsaXN0LiB9eyBpbnRlcnNlY3R9eyhjbHRuKSAgICAgICAgICAgICAgICAgICAgICAgICB9eyByZXR1cm5zIGludGVyc2VjdGlvbiBvZiBsaXN0IGFuZCBjb2xsZWN0aW9uIH0KK1xtZXRob2REZXRhaWx7IGNsdG4uIH17IGpvaW59eyhzZXBhcmF0b3IpICogICAgICAgICAgICAgICAgICAgICAgIH17IGNvbmNhdGVuYXRlIGFsbCB0aGUgZWxlbWVudHMgb2Yge1xlbSBjbHRuXC99IGludG8gYSBzdHJpbmcgfQorXG1ldGhvZERldGFpbHsgbGlzdC4gfXsgcG9wfXsoKSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9eyByZW1vdmUgYW5kIHJldHVybiBsYXN0IGl0ZW0gZnJvbSBsaXN0IH0KKyV0b2RvOiB3aGF0IGhhcHBlbmVkIHRvIHB1c2goKSA6LSkKK1xtZXRob2RTdW1tYXJ5eyBjbHRuLiB9eyByZXZlcnNlfXsoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9eyByZXZlcnNlcyBvcmRlciBvZiBjb2xsZWN0aW9uIG9yIHN0cmluZyB9CitcbWV0aG9kRGV0YWlseyAgbWFwLiB9eyBzdWJNYXB9eyhrZXlzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9eyByZXR1cm5zIGEgbWFwIG9mIHRoZSBnaXZlbiBrZXlzIH0KK1xtZXRob2RTdW1tYXJ5eyBjbHRuLiB9eyB0b0xpc3R9eygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9eyB0dXJucyBhbnkgY29sbGVjdGlvbiBpbnRvIGEgbGlzdCB9Cit9CisKK1x2c2tpcCAwLjc1IGluCisKK1xzdWJzZWN0aW9ue1N0cmluZ3N9CitcbWV0aG9kRGV0YWlsSGVhZGVyeworXG1ldGhvZERldGFpbHsgIHN0ciB9eyAkKyskfXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH17IGluY3JlbWVudCB0aGUgbnVtYmVyIGF0IGVuZCBvZiBzdHJpbmd9CitcbWV0aG9kRGV0YWlseyAgc3RyIH17ICQtLSR9eyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfXsgcmVkdWNlIHRoZSBudW1iZXIgYXQgZW5kIG9mIHN0cmluZ30KK1xtZXRob2RTdW1tYXJ5eyAgc3RyIH17ICQrJH17IG9iaiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9eyBjb25jYXRlbmF0ZSB7XGVtIHN0clwvfSBhbmQge1xlbSBvYmpcL30gdG9nZXRoZXJ9CitcbWV0aG9kRGV0YWlseyAgc3RyIH17ICQtJH17IG9iaiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfXsgcmVtb3ZlIHRoZSBmaXJzdCB7XGVtIG9ialwvfSBmcm9tIHtcZW0gc3RyXC99fQorJVxtZXRob2REZXRhaWxIZWFkZXJ7ICBudW0gfXsgKyBzdHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH17IGNvbmNhdGVuYXRlIHN0ciB0byB0aGUgZW5kIG9mIG51bSB9CitcbWV0aG9kU3VtbWFyeXsgIHN0ciB9eyBcdGV4dGxlc3NcdGV4dGxlc3N9eyB2YWx1ZSAgICAgICAgICAgICAgICB9eyB9CislXG1ldGhvZERldGFpbHsgIHN0ckJ1ZmYgfXsgXHRleHRsZXNzXHRleHRsZXNzfXsgdmFsdWUgICAgICAgICAgICB9eyB9CislY2VudGVyIGFuZCBjZW50cmUgOi0pICEhISEKK1xtZXRob2REZXRhaWx7IHN0ci4gfXsgcGFkUmlnaHR9eyhzaXplLFtwYWRkaW5nXSkgICAgICAgICAgICAgICAgfXsgbGVmdCBqdXN0aWZpZXMgc3RyaW5nIHBhZGRlZCBvdXQgdG8ge1xlbSBzaXplXC99fSAKK1xtZXRob2REZXRhaWx7IHN0ci4gfXsgY2VudGVyfXsoc2l6ZSwgW3BhZGRpbmddKSAgICAgICAgICAgICAgICAgfXsgY2VudGVycyBhIHN0cmluZyBwYWRkZWQgb3V0IHRvIHtcZW0gc2l6ZVwvfX0KKyUgbmFtZSBjaGFuZ2UgZm9yIHBhZExlZnQ/CitcbWV0aG9kRGV0YWlseyBzdHIuIH17IHBhZExlZnR9eyhzaXplLFtwYWRkaW5nXSkgICAgICAgICAgICAgICAgIH17IHJpZ2h0IGp1c3RpZmllcyBzdHJpbmcgcGFkZGVkIG91dCB0byB7XGVtIHNpemVcL319IAorXG1ldGhvZERldGFpbHsgc3RyLiB9eyBjb250YWluc317KHN0cjIpICogICAgICAgICAgICAgICAgICAgICAgICB9eyB0cnVlIGlmIHtcZW0gc3RyfSBjb250YWlucyB7XGVtIHN0cjJ9fQorXG1ldGhvZERldGFpbHsgc3RyLiB9eyBlYWNoTWF0Y2h9eyhyZWdleCkgXHtjbG9zdXJlXH0gKiAgICAgICAgICB9eyBhcHBseSB7XGVtIGNsb3N1cmVcL30gdG8gZWFjaCBtYXRjaCBvZiB0aGUgc3BlY2lmaWVkIHtcZW0gcmVnZXhcL30gfQorJWxlZnRzaGlmdAorXG1ldGhvZFN1bW1hcnl7IHN0ci4gfXsgdG9DaGFyYWN0ZXJ9eygpICAgICAgICAgICAgICAgICAgICAgICAgICAgfXsgfQorXG1ldGhvZFN1bW1hcnl7IHN0ci4gfXsgdG9MaXN0fXsoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfXsgfQorXG1ldGhvZFN1bW1hcnl7IHN0ci4gfXsgdG9Mb25nfXsoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfXsgfQorXG1ldGhvZFN1bW1hcnl7IHN0ci4gfXsgdG9VUkx9eygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfXsgfQorXG1ldGhvZFN1bW1hcnl7IHN0ci4gfXsgdG9rZW5pemV9eyhbdG9rZW5dKSAqICAgICAgICAgICAgICAgICAgICAgfXsgfQorfQorCisKK1xzdWJzZWN0aW9ue0lucHV0L291dHB1dH0KKyV0b2RvOiB1bmlmeSBtZXRob2QgbmFtZXMKK3tcc2NyaXB0c2l6ZSB7XGVtIE5vdGU6IHVybCBpbiB0aGlzIHNlbnNlIHtcZW0gY2FuXC99IGluY2x1ZGUgdXJscywgZmlsZXMsIHN0cmVhbXMgYW5kIHJlYWRlcnNcL319CitcbWV0aG9kRGV0YWlsSGVhZGVyeworXG1ldGhvZERldGFpbHsgICBkaXIuIH17IGVhY2hGaWxlfXsoKSBce2Nsb3N1cmVcfSAgICAgICAgICAgICAgICAgfXsgYXBwbHkge1xlbSBjbG9zdXJlXC99IHRvIGVhY2ggZmlsZSBpbiB7XGVtIGRpclwvfX0KK1xtZXRob2REZXRhaWx7ICAgZGlyLiB9eyBlYWNoRmlsZVJlY3Vyc2V9eygpIFx7Y2xvc3VyZVx9ICAgICAgICAgIH17IGFwcGx5IHtcZW0gY2xvc3VyZVwvfSB0byBlYWNoIGZpbGUgaW4ge1xlbSBkaXJcL30gcmVjdXJzaXZlbHl9CitcbWV0aG9kRGV0YWlseyB9eyB9eyB9eyB9CitcbWV0aG9kU3VtbWFyeXsgICB1cmwuIH17IGVhY2hCeXRlfXsoKSBce2Nsb3N1cmVcfSAgICAgICAgICAgICAgICAgfXsgYXBwbHkge1xlbSBjbG9zdXJlXC99IHRvIGVhY2ggYnl0ZSBpbiB7XGVtIGZpbGVcL319CitcbWV0aG9kRGV0YWlseyAgICB1cmwuIH17IGVhY2hMaW5lfXsoKSBce2Nsb3N1cmVcfSAgICAgICAgICAgICAgICAgfXsgYXBwbHkge1xlbSBjbG9zdXJlXC99IHRvIGVhY2ggbGluZSBvZiBpbnB1dH0KKyVcbWV0aG9kRGV0YWlseyAgZmlsZS4gfXsgbmV3SW5wdXRTdHJlYW19eygpICAgICAgICAgICAgICAgICAgICAgICB9eyBvYnRhaW4gU3RyZWFtIHRvIHJlYWQgZnJvbSB7XGVtIGZpbGVcL319CislXG1ldGhvZERldGFpbHsgIGZpbGUuIH17IG5ld1JlYWRlcn17KFtjaGFyc2V0XSkgICAgICAgICAgICAgICAgICAgfXsgb2J0YWluIFJlYWRlciBmcm9tIHtcZW0gZmlsZX19CitcbWV0aG9kU3VtbWFyeXsgIGZpbGUuIH17IHJlYWRCeXRlc317KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgfXsgcmVhZCBieXRlcyBmcm9tIHtcZW0gZmlsZVwvfX0KK1xtZXRob2REZXRhaWx7ICAgIGluLiB9eyByZWFkTGluZX17KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH17IHJlYWQgYSBzaW5nbGUsIHdob2xlIGxpbmUgZnJvbSB7XGVtIGluXC99fQorXG1ldGhvZERldGFpbHsgIGZpbGUuIH17IHJlYWRMaW5lc317KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgfXsgb2J0YWluIExpc3Qgb2YgbGluZXMgZnJvbSB7XGVtIGZpbGV9fQorXG1ldGhvZERldGFpbHsgICB1cmwuIH17IGdldFRleHR9eyhbY2hhcnNldF0pICAgICAgICAgICAgICAgICAgICAgfXsgZmV0Y2ggYWxsIGF2YWlsYWJsZSB0ZXh0IGZyb20gcmVzb3VyY2UgfQorXG1ldGhvZERldGFpbHsgIGZpbGUuIH17IHNwbGl0RWFjaExpbmV9eyhyZWdFeCkgXHtjbG9zdXJlXH0gICAgICAgfXsgcmVhZCBpbiBlYWNoIGxpbmUgb2Yge1xlbSBmaWxlXC99LCBhcHBseSB7XGVtIGNsb3N1cmVcL30gdG8gZGF0YSBkZWxpbWl0ZWQgYnkge1xlbSByZWdFeFwvfX0KKyVcbWV0aG9kRGV0YWlseyAgZmlsZS4gfXsgd2l0aElucHV0U3RyZWFtfXsoKSBce2Nsb3N1cmVcfSAgICAgICAgICB9eyBhcHBseSB7XGVtIGNsb3N1cmVcL30gdG8gYSBuZXcgSW5wdXRTdHJlYW0gb24ge1xlbSBmaWxlXC99LCB0aGVuIGNsb3NlfQorXG1ldGhvZERldGFpbHsgICB1cmwuIH17IHdpdGhSZWFkZXJ9eygpIFx7Y2xvc3VyZVx9ICAgICAgICAgICAgICAgfXsgYXBwbHkge1xlbSBjbG9zdXJlXC99IHRvIHtcZW0gaW5cL30sIHRoZW4gY2xvc2Uge1xlbSBpblwvfX0KKyVcbWV0aG9kRGV0YWlseyAgICBpbi4gfXsgd2l0aFN0cmVhbX17KCkgXHtjbG9zdXJlXH0gICAgICAgICAgICAgICB9eyBhcHBseSB7XGVtIGNsb3N1cmVcL30gdG8ge1xlbSBpblwvfSwgdGhlbiBjbG9zZSB7XGVtIGluXC99fQorXG1ldGhvZERldGFpbHsgfXsgfXsgfXsgfQorXG1ldGhvZERldGFpbHsgICAgb3V0IH17IFx0ZXh0bGVzc1x0ZXh0bGVzc317IG9iaiAgICAgICAgICAgICAgICAgfXsgYXBwZW5kIHtcZW0gb2JqXC99IHRvIHN0cmVhbSwgcHJvY2VzcyBvciBzb2NrZXR9CitcbWV0aG9kU3VtbWFyeXsgIGZpbGUuIH17IGFwcGVuZH17KHRleHQsIFtjaGFyc2V0XSkgICAgICAgICAgICAgICAgfXsgYXBwZW5kIHtcZW0gdGV4dFwvfSBhdCBlbmQgb2Yge1xlbSBmaWxlXC99IHdpdGgge1xlbSBjaGFyc2V0XC99IGVuY29kaW5nfQorJVxtZXRob2RTdW1tYXJ5eyAgZmlsZS4gfXsgYXNXcml0YWJsZX17KFtjaGFyc2V0XSkgKiAgICAgICAgICAgICAgICB9eyB3cmFwIHtcZW0gZmlsZVwvfSBhcyBXcml0YWJsZSB9CitcbWV0aG9kU3VtbWFyeXsgYnl0ZXMuIH17IGVuY29kZUJhc2U2NH17KCkgICAgICAgICAgICAgICAgICAgICAgICAgfXsgd3JhcHMge1xlbSBmaWxlXC99IGluIFdyaXRhYmxlIHdpdGggY29udGVudHMgZW5jb2RlZCBhcyBCYXNlNjR9CitcbWV0aG9kU3VtbWFyeXsgICBzdHIuIH17IGRlY29kZUJhc2U2NH17KCkgICAgICAgICAgICAgICAgICAgICAgICAgfXsgdW53cmFwcyBieXRlcyBmcm9tIEJhc2U2NCBlbmNvZGVkIHtcZW0gc3RyXC99fQorXG1ldGhvZERldGFpbHsgICAgIGluLiB9eyBmaWx0ZXJMaW5lfXsoW291dF0pIFx7Y2xvc3VyZVx9ICAgICAgICAgICAgfXsgcmVhZCBmcm9tIHtcZW0gaW5cL30gYW5kIHdyaXRlIGVhY2ggbGluZSB0byB7XGVtIG91dFwvfSBvbmx5IGlmIHtcZW0gY2xvc3VyZVwvfX0KKyVcbWV0aG9kRGV0YWlseyAgZmlsZS4gfXsgbmV3T3V0cHV0U3RyZWFtfXsoKSAgICAgICAgICAgICAgICAgICAgICB9eyBvYnRhaW4gU3RyZWFtIHRvIHdyaXRlIHRvIHtcZW0gZmlsZVwvfX0KKyVcbWV0aG9kRGV0YWlseyAgZmlsZS4gfXsgbmV3UHJpbnRXcml0ZXJ9eyhbY2hhcnNldF0pICAgICAgICAgICAgICB9eyBvYnRhaW4gUHJpbnRXcml0ZXIgdG8ge1xlbSBmaWxlXC99fQorJVxtZXRob2REZXRhaWx7ICBmaWxlLiB9eyBuZXdXcml0ZXJ9eyhbY2hhcnNldF0sW2FwcGVuZF0pICAgICAgICAgIH17IG9idGFpbiBXcml0ZXIgdG8ge1xlbSBmaWxlXC99fQorJSB0b2RvOiB0cmFuc2Zvcm1DaGFyKG91dCkgY291bGQgYmUgbW9yZSBpbiBsaW5lIHdpdGggZWFjaEJ5dGU/CitcbWV0aG9kU3VtbWFyeXsgICBpbi4gfXsgdHJhbnNmb3JtQ2hhcn17KG91dCkgXHtjbG9zdXJlXH0gICAgICAgICAgIH17IHJlYWQge1xlbSBpblwvfSBhbmQgYXBwbHkge1xlbSBjbG9zdXJlXC99IHRvIGVhY2ggY2hhcmFjdGVyIGJlaW5nIHdyaXR0ZW4ge1xlbSBvdXRcL319ICAKK1xtZXRob2REZXRhaWx7ICAgaW4uIH17IHRyYW5zZm9ybUxpbmV9eyhvdXQpIFx7Y2xvc3VyZVx9ICAgICAgICAgIH17IHJlYWQge1xlbSBpblwvfSBhbmQgYXBwbHkge1xlbSBjbG9zdXJlXC99IHRvIGVhY2ggbGluZSBiZWluZyB3cml0dGVuIHtcZW0gb3V0XC99fSAgCitcbWV0aG9kU3VtbWFyeXsgIGZpbGUuIH17IHdpdGhPdXRwdXRTdHJlYW19eygpIFx7Y2xvc3VyZVx9ICAgICAgICAgfXsgYXBwbHkge1xlbSBjbG9zdXJlXC99IHRvIGEgbmV3IE91dHB1dFN0cmVhbSBvbiB7XGVtIGZpbGVcL30sIHRoZW4gY2xvc2V9CitcbWV0aG9kU3VtbWFyeXsgIGZpbGUuIH17IHdpdGhQcmludFdyaXRlcn17KCkgXHtjbG9zdXJlXH0gICAgICAgICAgfXsgYXBwbHkge1xlbSBjbG9zdXJlXC99IHRvIGEgbmV3IFByaW50V3JpdGVyIG9uIHtcZW0gZmlsZVwvfSwgdGhlbiBjbG9zZX0KK1xtZXRob2RTdW1tYXJ5eyAgIG91dC4gfXsgd2l0aFN0cmVhbX17KCkgXHtjbG9zdXJlXH0gICAgICAgICAgICAgICB9eyBhcHBseSB7XGVtIGNsb3N1cmVcL30gdG8ge1xlbSBvdXRcL30sIHRoZW4gY2xvc2Uge1xlbSBvdXRcL319CitcbWV0aG9kU3VtbWFyeXsgICBza3QuIH17IHdpdGhTdHJlYW1zfXsoKSBce2Nsb3N1cmVcfSAgICAgICAgICAgICAgfXsgYXBwbHkge1xlbSBjbG9zdXJlXC99IHRvIFtpbixvdXRdLCB0aGVuIGNsb3NlIHRoZW19CitcbWV0aG9kU3VtbWFyeXsgICBvdXQuIH17IHdpdGhXcml0ZXJ9eyhbY2hhcnNldF0pIFx7Y2xvc3VyZVx9ICAgICAgfXsgYXBwbHkge1xlbSBjbG9zdXJlXC99IHRvIHtcZW0gb3V0XC99IHVzaW5nIHtcZW0gY2hhcnNldFwvfSwgdGhlbiBjbG9zZSB7XGVtIG91dFwvfX0KK1xtZXRob2REZXRhaWx7ICBmaWxlLiB9eyB3aXRoV3JpdGVyQXBwZW5kfXsoY2hhcnNldCkgXHtjbG9zdXJlXH0gIH17IGFwcGx5IHtcZW0gY2xvc3VyZVwvfSB0byBhIG5ldyBhcHBlbmRpbmcgV3JpdGVyIG9uIHtcZW0gZmlsZVwvfSwgdGhlbiBjbG9zZX0KK1xtZXRob2RTdW1tYXJ5eyAgZmlsZS4gfXsgd3JpdGV9eyh0ZXh0LCBbY2hhcnNldF0pICogICAgICAgICAgICAgICB9eyB3cml0ZSB7XGVtIHRleHRcL30gdG8ge1xlbSBmaWxlXC99IHVzaW5nIHtcZW0gY2hhcnNldFwvfX0KK1xtZXRob2RTdW1tYXJ5eyAgIG91dC4gfXsgd3JpdGVMaW5lfXsobGluZSkgICAgICAgICAgICAgICAgICAgICAgICB9eyB3cml0ZSB7XGVtIGxpbmVcL30gYW5kIGFwcGVuZCBhIG5ld2xpbmV9Cit9CisKK1xzdWJzZWN0aW9ue01pc2N9CitcbWV0aG9kRGV0YWlsSGVhZGVyeworXG1ldGhvZFN1bW1hcnl7ICAgZGF0ZSB9eyAkKyskfXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9eyBhZGQgb25lIGRheSB0byB0aGUgZGF0ZSB9CitcbWV0aG9kU3VtbWFyeXsgICBkYXRlIH17ICQtLSR9eyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH17IHN1YnRyYWN0IG9uZSBkYXkgZnJvbSB0aGUgZGF0ZSB9CitcbWV0aG9kU3VtbWFyeXsgICBkYXRlIH17ICQrJH17IGRheXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH17IGFkZCB7XGVtIGRheXNcL30gdG8gdGhlIGRhdGUgfQorXG1ldGhvZFN1bW1hcnl7ICAgZGF0ZSB9eyAkLSR9eyBkYXlzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9eyBzdWJ0cmFjdCB7XGVtIGRheXNcL30gZnJvbSB0aGUgZGF0ZSB9CitcbWV0aG9kRGV0YWlseyAgIG9iai4gfXsgZHVtcH17KCkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfXsgcmV0dXJucyBhIGRldGFpbGVkIGR1bXAgc3RyaW5nIG9mIHtcZW0gb2JqXC99fQorXG1ldGhvZERldGFpbHsgICBvYmouIH17IGluc3BlY3R9eygpICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH17IHJldHVybnMgdGhlIGdyb292eSBleHByZXNzaW9uIHVzZWQgdG8gY3JlYXRlIHRoaXMgaW5zdGFuY2Ugb2Yge1xlbSBvYmp9fQorXG1ldGhvZFN1bW1hcnl7ICAgb2JqLiB9eyBpbnZva2VNZXRob2R9eyhtZXRob2QsIGFyZ3MpICogICAgICAgICAgICAgfXsgaW52b2tlcyB7XGVtIG1ldGhvZFwvfSBvbiB7XGVtIG9ialwvfSB9CitcbWV0aG9kU3VtbWFyeXsgICBvYmouIH17IHByaW50fXsob2JqKSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9eyBwcmludCBhbiBvYmplY3QgfQorXG1ldGhvZFN1bW1hcnl7ICAgb2JqLiB9eyBwcmludH17KG91dCkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfXsgcHJpbnQgdGhpcyBvYmplY3QgdG8ge1xlbSBvdXR9IH0KK1xtZXRob2RTdW1tYXJ5eyAgIG9iai4gfXsgcHJpbnRsbn17KG9iamVjdCkgKiAgICAgICAgICAgICAgICAgICAgICAgIH17IHByaW50IGFuIG9iamVjdCBhbmQgdGhlbiB0ZXJtaW5hdGUgbGluZSB9CitcbWV0aG9kU3VtbWFyeXsgICBvYmouIH17IHByaW50bG59eyhvdXQpICogICAgICAgICAgICAgICAgICAgICAgICAgICB9eyBwcmludCB0aGlzIG9iamVjdCB0byB7XGVtIG91dH0gYW5kIHRoZW4gdGVybWluYXRlIGxpbmUgfQorXG1ldGhvZERldGFpbHsgICBudW0uIH17IHN0ZXB9eyhlbmROdW0sIHN0ZXBOdW0pIFx7Y2xvc3VyZVx9ICAgICAgICB9eyBpdGVyYXRlcyB7XGVtIGNsb3N1cmVcL30gc3RhcnRpbmcgYXQgdGhpcyBudW1iZXIsIHN0ZXBwaW5nIHVwIHRvIHtcZW0gZW5kTnVtfSB9CitcbWV0aG9kRGV0YWlseyAgIG51bS4gfXsgdGltZXN9eygpIFx7Y2xvc3VyZVx9ICogICAgICAgICAgICAgICAgICAgIH17IGl0ZXJhdGVzIHtcZW0gY2xvc3VyZVwvfSBudW0gdGltZXMgfQorJXRvZG86IHVwVG8oKSBpbnN0ZWFkIG9mIHVwdG8oKQorXG1ldGhvZERldGFpbHsgICBudW0uIH17IHVwdG99eyhlbmROdW0pIFx7Y2xvc3VyZVx9ICAgICAgICAgICAgICAgICB9eyBpdGVyYXRlcyB7XGVtIGNsb3N1cmVcL30gc3RhcnRpbmcgYXQgdGhpcyBudW1iZXIsIHVwIHRvIHtcZW0gZW5kTnVtfSB9CitcbWV0aG9kRGV0YWlseyAgIG9iai4gfXsgdXNlfXsoY2F0ZWdvcnlDbGFzcykgXHtjbG9zdXJlXH0gKiAgICAgICAgIH17IGF0dGFjaCB7XGVtIGNsb3N1cmVcL30gdG8gc3BlY2lmaWVkIGNsYXNzIH0KK1xtZXRob2REZXRhaWx7ICAgb2JqLiB9eyB1c2V9eyhjYXRlZ29yeUNsYXNzTGlzdCkgXHtjbG9zdXJlXH0gKiAgICAgfXsgYXR0YWNoIHtcZW0gY2xvc3VyZVwvfSB0byBzcGVjaWZpZWQgY2xhc3NlcyB9CitcbWV0aG9kU3VtbWFyeXsgICAgcHMuIH17IHdhaXRGb3JPcktpbGx9eyhtaWxsaVNlY3MpICAgICAgICAgICAgICAgICB9eyB3YWl0IGZvciBwcm9jZXNzIHRvIGZpbmlzaCwgb3Igc3RvcCBhZnRlciBzcGVjaWZpZWQge1xlbSBtaWxsaVNlY3N9IH0KK1xtZXRob2RTdW1tYXJ5eyAgICBwcy4gfXsgZ2V0VGV4dH17KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH17IH0KKyVTdGF0aWMgbWV0aG9kcyBzaG93biB3aXRoIFxlbQorXG1ldGhvZFN1bW1hcnl7ICAgIFRoZC59eyB7XGVtIHN0YXJ0fX17KCkgXHtjbG9zdXJlXH0gICAgICAgICAgICAgICAgICAgICAgfXsgfQorXG1ldGhvZFN1bW1hcnl7ICAgIFRoZC59eyB7XGVtIHN0YXJ0RGFlbW9ufX17KCkgXHtjbG9zdXJlXH0gICAgICAgICAgICAgICAgfXsgfQorXG1ldGhvZFN1bW1hcnl7ICAgIE10ci59eyB7XGVtIGdldExhc3RNYXRjaGVyfX17KCkgICAgICAgICAgICAgICAgICAgICAgICAgfXsgfQorfQorCisKK1xzZWN0aW9ue0dyb292eSBEZXZlbG9wZXJzIEtpdH0KK1xzdWJzZWN0aW9ue0dyb292eSBTUUx9CislU1RBUlQKKyUgc3FsID0gU3FsLm5ld0luc3RhbmNlKAorJUVORAorXG1ldGhvZFN1bW1hcnlIZWFkZXJ7CislXG1ldGhvZFN1bW1hcnl7ICAgICAgfXsgbmV3SW5zdGFuY2V9eyh1cmwsW3Byb3BzXSxbZHJpdmVyXSkgfQorXG1ldGhvZFN1bW1hcnl7ICAgICAgfXsgU3FsfXsoZGF0YXNvdXJjZVx0ZXh0YmFyIGNvbm5lY3Rpb25cdGV4dGJhciBzcWwpfXsgfQorXG1ldGhvZFN1bW1hcnl7ICAgICAgfXsgbmV3SW5zdGFuY2V9eyh1cmwsW3VzZXJdLFtwYXNzXSxbZHJpdmVyXSkgfXsgfQorXG1ldGhvZFN1bW1hcnl7IHNxbC4gfXsgY2FsbH17KHN0cixbcGFyYW1zXSkgfXsgfQorXG1ldGhvZFN1bW1hcnl7IHNxbC4gfXsgZWFjaFJvd317KHN0cixbcGFyYW1zXSkgXHtjbG9zdXJlXH19eyB9CitcbWV0aG9kU3VtbWFyeXsgc3FsLiB9eyBleGVjdXRlfXsoc3RyLFtwYXJhbXNdKSB9eyB9CitcbWV0aG9kU3VtbWFyeXsgc3FsLiB9eyBleGVjdXRlVXBkYXRlfXsoc3RyLFtwYXJhbXNdKSB9eyB9CitcbWV0aG9kU3VtbWFyeXsgc3FsLiB9eyBjbG9zZX17KCkgfXsgfQorfQorCitcc2VjdGlvbntTbmlwcGV0c30KK1xiZWdpbnt0YWJiaW5nfSBqZXpqZXpqZXpqZXpqZXogXD0gamV6LXJlcGVhdGVkLWZvci10YWItc2V0dGluZ3Mtb25seSBca2lsbCAKK3tcYmYgQ2xvc3VyZXN9XD4KK3tcc2NyaXB0c2l6ZSBpbXBsaWNpdC9leHBsaWNpdH1cXAorXHZlcmIrIHsgcHJpbnRsbiBpdCB9K1xcCitcdmVyYisgeyB4LCB5IC0+IHByaW50bG4oeCAqIHkpIH0rXFwKK3tcYmYgRHluYW1pYyBNZW1iZXJzfVw+Cit7XHNjcmlwdHNpemUgfVxcCitcdmVyYisgZm9vLmJhci5tb29reS4iJHJhbmRvbVByb3BlcnR5IitcXAore1xiZiBDb25zdHJ1Y3QgYW5kIGNhbGwgc2V0dGVyc31cPgore1xzY3JpcHRzaXplIH1cXAorXHZlcmIrIG5ldyBGb28oYmFyOjEyMywgbW9va3k6J3JlZCcpK1xcCit7XGJmIEJ1aWxkZXJ9XD4KK3tcc2NyaXB0c2l6ZSBNYXJrdXAsIE5vZGUsIFN0cmVhbWluZ01hcmt1cCwgRE9NLCB9XFwKK3tcc2NyaXB0c2l6ZSBBbnQsIEphdmFEb2MsIFN3dCwgSkZhY2UsIFN3aW5nfVxcCitcdmVyYitmYXJtID0gbmV3IE5vZGVCdWlsZGVyKCkuZmFybSgpe2FuaW1hbCh0eXBlOidwaWcnKX0rXFwKK3tcYmYgR1BhdGh9ICBcPgore1xzY3JpcHRzaXplIHdhbGtzIHRoZSB0cmVlfVxcCitcdmVyYitmYXJtLmFuaW1hbC5jb2xsZWN0e2l0WydAdHlwZSddfS5jb250YWlucygncGlnJykrXFwKK1xlbmR7dGFiYmluZ30KKyVcc2VjdGlvbntTYW1wbGUgR3Jvb3Z5IEJ1aWxkZXJ9Cisle1xzY3JpcHRzaXplIEJ1aWxkZXJzIGFyZSBwcm92aWRlZCB0byBjb25zdHJ1Y3QgdGhlc2UgdHJlZSBzdHJ1Y3R1cmVzOiB7XGVtIE1hcmt1cCwgTm9kZSwgU3RyZWFtaW5nTWFya3VwLCBET00sIEFudCwgSmF2YURvYywgU3d0LCBKRmFjZSwgU3dpbmd9fQorJVxiZWdpbnt2ZXJiYXRpbX0KKyVidWlsZGVyID0gbmV3IE5vZGVCdWlsZGVyKCkKKyUKKyVmYXJtID0gYnVpbGRlci5mYXJtKHR5cGU6J2xpdmVzdG9jaycsIGFjcmVzOjMwKSB7CislICAgICAgICAgICAgICAgICBhbmltYWwodHlwZToncGlnJykKKyUgICAgICAgICAgICAgICAgIGFuaW1hbCh0eXBlOidzaGVlcCcpCislICAgICAgICAgICAgICAgICB0cmFjdG9yKHdoZWVsYmFzZTo5MCkKKyV9CislCislYXNzZXJ0IGZhcm0uYW5pbWFsLmNvbGxlY3R7aXRbJ0B0eXBlJ119LmNvbnRhaW5zKCdwaWcnKQorJQorJVxlbmR7dmVyYmF0aW19CisKKyVcc2VjdGlvbntTYW1wbGUgR3Jvb3Z5IGNvZGV9CislXGJlZ2lue3ZlcmJhdGltfQorJXBhY2thZ2UgY29tLmV4YW1wbGUKKyUKKyVpbXBvcnQgb3JnLmV4YW1wbGUuQ293CislCislLyoqCislICogVGhpcyBpcyBhIHNhbXBsZSBvZiBHcm9vdnkKKyUgKi8KKyVjbGFzcyBIaWdobGFuZENvdyBleHRlbmRzIENvdyB7CislICAKKyUgIHZvaWQgbW9vQXRQZW9wbGUoKSB7CislICAgIHNxbCA9IFNxbC5uZXdJbnN0YW5jZSgiamRiYzpmb286YmFyIikKKyUgICAgc3FsLmVhY2hSb3coInNlbGVjdCAqIGZyb20gUEVSU09OIikgeworJSAgICAgIHByaW50bG4oIk9jaC1BeWUgJHtpdC5maXJzdG5hbWV9IikKKyUgICAgfQorJSAgfQorJX0gICAgICAgIAorJVxlbmR7dmVyYmF0aW19CisKK1xzZWN0aW9ue1Rvb2xzfQorXHN1YnNlY3Rpb257QW50IHRhc2tzfQorXGJlZ2lue3ZlcmJhdGltfQorPHRhc2tkZWYKKyAgICBuYW1lPSJncm9vdnkiIAorICAgIGNsYXNzbmFtZT0ib3JnLmNvZGVoYXVzLmdyb292eS5hbnQuR3Jvb3Z5Ii8+Cis8Z3Jvb3Z5PmFudC5ta2RpcihkaXI6Im15RGlyIik8L2dyb292eT4KKworPHRhc2tkZWYKKyAgICBuYW1lPSJncm9vdnljIiAKKyAgICBjbGFzc25hbWU9Im9yZy5jb2RlaGF1cy5ncm9vdnkuYW50Lkdyb292eWMiLz4KKzxncm9vdnljIAorICAgIGRlc3RkaXI9IiR7YnVpbGQuY2xhc3Nlcy5kaXJ9IiAKKyAgICBzcmNkaXI9IiR7c3JjLmRpcn0iLz4KKworPHRhc2tkZWYKKyAgICBuYW1lPSJncm9vdnlkb2MiCisgICAgY2xhc3NuYW1lPSJvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudC5Hcm9vdnlkb2MiLz4KKzxncm9vdnlkb2MKKyAgICBzb3VyY2VwYXRoPSIke3NyYy5kaXJ9IiAKKyAgICBkZXN0ZGlyPSIke2phdmFkb2MuZGlyfSIgCisgICAgcGFja2FnZW5hbWVzPSIke2phdmFkb2MucGFja2FnZXN9Ii8+CitcZW5ke3ZlcmJhdGltfQorXHN1YnNlY3Rpb257Q29tbWFuZCBMaW5lIFRvb2xzfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitcdG9vbERldGFpbEhlYWRlcnsKK1x0b29sRGV0YWlseyBcdGV4dGdyZWF0ZXIgfXsgZ3Jvb3Z5ICAgICAgICB9eyBbb3B0aW9uc10gVGVsc29uLmdyb292eSBbYXJnc10gfXsgaW50ZXJwcmV0IGFuZCBleGVjdXRlIHNwZWNpZmllZCBncm9vdnkgc2NyaXB0IH0KK1x0b29sRGV0YWlseyBcdGV4dGdyZWF0ZXIgfXsgZ3Jvb3Z5YyAgICAgICB9eyBbb3B0aW9uc10gRGFydi5ncm9vdnkgICAgICAgICAgfXsgY29tcGlsZXMgc3BlY2lmaWVkIGdyb292eSBzY3JpcHQgfQorXHRvb2xEZXRhaWx7IFx0ZXh0Z3JlYXRlciB9eyBncm9vdnlzaCAgICAgIH17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9eyBiZWdpbnMgYW4gaW50ZXJhY3RpdmUgZ3Jvb3Z5IHNlc3Npb24gfQorXHRvb2xEZXRhaWx7IFx0ZXh0Z3JlYXRlciB9eyBncm9vdnlDb25zb2xlIH17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9eyBiZWdpbnMgYSBHVUkgYmFzZWQgZ3Jvb3Z5IHNlc3Npb24gfQorXHRvb2xEZXRhaWx7IFx0ZXh0Z3JlYXRlciB9eyBqYXZhMmdyb292eSAgIH17IEFzdHJhLmphdmEgICAgICAgICAgICAgICAgICAgICB9eyByb3VnaCBzb3VyY2UgY29kZSB0cmFuc2xhdGlvbiBvZiBKYXZhIGludG8gR3Jvb3Z5fQorCislXHRvb2xEZXRhaWx7IFx0ZXh0Z3JlYXRlciB9eyBncm9rICAgfXsgICAgICAgICAgICAgICAgICB9eyBncm9vdnkgamF2YWRvYyB9Cit9CisKK1xydWxlezAuM1xsaW5ld2lkdGh9ezAuMjVwdH0KK1xzY3JpcHRzaXplCisKK0NvcHlyaWdodCBcY29weXJpZ2h0XCAyMDA0LCAyMDA3IEplcmVteSBSYXluZXIgCitcdGV4dGxlc3NcL2dyb292eUByb3NzLXJheW5lci5jb21cdGV4dGdyZWF0ZXJcL1wvaHR0cDovL2phdmFuaWN1cy5jb20vYmxvZzIKKworJFJldmlzaW9uJAorJERhdGUkCisKKworCitcZW5ke211bHRpY29sc30KK1xlbmR7ZG9jdW1lbnR9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL2xhdGV4L3JlZi9vbmUtZ3Jvb3Z5LWxvZ28uZXBzIGIvZ3Jvb3Z5L3NyYy9sYXRleC9yZWYvb25lLWdyb292eS1sb2dvLmVwcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTZhMDEwCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9sYXRleC9yZWYvb25lLWdyb292eS1sb2dvLmVwcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL2xhdGV4L3JlZi9vbmUtZ3Jvb3Z5LWxvZ28ubXBzIGIvZ3Jvb3Z5L3NyYy9sYXRleC9yZWYvb25lLWdyb292eS1sb2dvLm1wcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzBiYjYwCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9sYXRleC9yZWYvb25lLWdyb292eS1sb2dvLm1wcwpAQCAtMCwwICsxLDE2NjYgQEAKKyUhUFMtQWRvYmUtMy4wIEVQU0YtMy4wCislJUJvdW5kaW5nQm94OiAxOTcgMzQwIDQxNSA0NTAgCislJUNyZWF0b3I6IE1ldGFQb3N0CislJUNyZWF0aW9uRGF0ZTogMjAwNS4wNC4xNzoxMTI3CislJVBhZ2VzOiAxCislJUVuZFByb2xvZworJSVQYWdlOiAxIDEKK25ld3BhdGggMzcyLjc5MyAzNDAuNjk5IG1vdmV0bworMzA1LjY0NSAzNjYuOTg4IGxpbmV0bworMjM4LjUgMzQwLjcwNyBsaW5ldG8KKzI2NS4wMTIgMzgyLjYwMiBsaW5ldG8KKzE5NyA0MDguMjU4IGxpbmV0bworMjgwLjUzMSA0MDcuODYzIGxpbmV0bworMzA1LjY0MSA0NTAgbGluZXRvCiszMzAuNzU0IDQwNy44NTkgbGluZXRvCis0MTQuMjg5IDQwOC4yNDYgbGluZXRvCiszNDYuMjc3IDM4Mi41OTggbGluZXRvCiszNzIuNzkzIDM0MC42OTkgbGluZXRvCisgY2xvc2VwYXRoIGZpbGwKKyAwLjM1ODMyIDAuNzA0OTYgMC43NDkgc2V0cmdiY29sb3IKK25ld3BhdGggMzYzLjcwNyAzNDguMTk1IG1vdmV0bworMzA1LjcwMyAzNzAuOTAyIGxpbmV0bworMjQ3LjY5OSAzNDguMTk5IGxpbmV0bworMjcwLjYwMiAzODQuMzkxIGxpbmV0bworMjExLjg0OCA0MDYuNTUxIGxpbmV0bworMjg0LjAwOCA0MDYuMjExIGxpbmV0bworMzA1LjY5OSA0NDIuNjA5IGxpbmV0bworMzI3LjM5NSA0MDYuMjExIGxpbmV0bworMzk5LjU1OSA0MDYuNTQzIGxpbmV0bworMzQwLjgwNSAzODQuMzg3IGxpbmV0bworMzYzLjcwNyAzNDguMTk1IGxpbmV0bworIGNsb3NlcGF0aCBmaWxsCisgMCBzZXRncmF5CituZXdwYXRoIDI2MS4xNzYgNDI4LjQ2OSBtb3ZldG8KKzI2Ni45NjkgNDI4LjQ2OSAyNjMuNTk0IDQxMy44NDggMjYxLjUzMSA0MDkuNDM4IGN1cnZldG8KKzI1OS43NyA0MDUuNjY0IDI1NS43OTcgNDAwLjIxOSAyNTEuMDg2IDQwMC4yMTkgY3VydmV0bworMjQ1LjQ0MSA0MDAuMjE5IDI0NS42MDkgNDA2LjYwNSAyNDcuODU1IDQxMS40MTggY3VydmV0bworMjQ5LjA3NCA0MTQuMDIgMjUwLjk0NSA0MTYuOTQxIDI1My41MiA0MTkuMDg2IGN1cnZldG8KKzI1Mi44NjMgNDE2Ljg0OCAyNTUuMDk0IDQxNS4zMTYgMjU0LjE5MSA0MTMuMzg3IGN1cnZldG8KKzI1My41NzQgNDEyLjA2NiAyNTIuMzAxIDQxMC42MjkgMjUxLjYzNyA0MDkuMjExIGN1cnZldG8KKzI1MC41NjYgNDA2LjkxOCAyNTAuOTczIDQwMi44NTIgMjUzLjU2MiA0MDIuODUyIGN1cnZldG8KKzI1NS44NzkgNDAyLjg1MiAyNTcuOTM4IDQwNS43NSAyNTguNzg1IDQwNy41NTUgY3VydmV0bworMjYwLjUxMiA0MTEuMjU0IDI2NC44MzYgNDI3LjA0MyAyNjAuMDA0IDQyNy4wNDMgY3VydmV0bworMjU0LjQzOCA0MjcuMDQzIDI0NC44NDQgNDEzLjM0NCAyNDIuODM2IDQwOS4wNDcgY3VydmV0bworMjM5LjI1IDQwMS4zNzUgMjQxLjg1MiAzOTEuOTMgMjUwLjAyIDM5MS45MyBjdXJ2ZXRvCisyNTUuNTM5IDM5MS45MyAyNjAuMDc4IDM5Ny4yODkgMjYyLjI3IDQwMS45OCBjdXJ2ZXRvCisyNjMuNTc4IDQwNC43NzMgMjY0LjI4OSA0MDcuNTU1IDI2NC41NyA0MTAuMTc2IGN1cnZldG8KKzI2NS42NDEgNDEwLjM3NSBsaW5ldG8KKzI2NS44NzkgNDAzLjE1NiAyNzMuNDM4IDM5MS4yMDcgMjcwLjIxOSAzODQuMzIgY3VydmV0bworMjY2LjEwMiAzNzUuNTA4IDI1My43ODUgMzc1LjU4NiAyNDYuNzU0IDM3Mi40NjEgY3VydmV0bworMjQ1LjI3MyAzNzUuOTUzIDI0My4yNzMgMzc5LjE5OSAyNDAuNDUzIDM4MS42OCBjdXJ2ZXRvCisyNDYuNzI3IDM4My44MDkgMjYyLjEzNyAzODcuMzg3IDI2NS40OTIgMzk0LjU1OSBjdXJ2ZXRvCisyNjYuODk4IDM5Ny41NyAyNjUuOTQxIDQwMi41NjYgMjY0LjMxMiA0MDQuMjU4IGN1cnZldG8KKzI2NC4wMzUgNDAzLjE5NSAyNjMuNjUyIDQwMi4xMDkgMjYzLjE0NSA0MDEuMDIgY3VydmV0bworMjYwLjI3MyAzOTQuODgzIDI1NC4xMjkgMzkwLjEyMSAyNDcuNzkzIDM5MC4xMjEgY3VydmV0bworMjM4Ljk3NyAzOTAuMTIxIDIzNS4yMzggMzk2LjUyIDIzOS4zODcgNDA1LjM5OCBjdXJ2ZXRvCisyNDEuODc5IDQxMC43MyAyNTQuNTk4IDQyOC40NjkgMjYxLjE3NiA0MjguNDY5IGN1cnZldG8KKyBjbG9zZXBhdGggZmlsbAorIDAgOS43NTM0IGR0cmFuc2Zvcm0gdHJ1bmNhdGUgaWR0cmFuc2Zvcm0gc2V0bGluZXdpZHRoIHBvcCBbXSAwIHNldGRhc2gKKyAxIHNldGxpbmVqb2luIDEwIHNldG1pdGVybGltaXQKK25ld3BhdGggMjYxLjE3NiA0MjguNDY5IG1vdmV0bworMjY2Ljk2OSA0MjguNDY5IDI2My41OTQgNDEzLjg0OCAyNjEuNTMxIDQwOS40MzggY3VydmV0bworMjU5Ljc3IDQwNS42NjQgMjU1Ljc5NyA0MDAuMjE5IDI1MS4wODYgNDAwLjIxOSBjdXJ2ZXRvCisyNDUuNDQxIDQwMC4yMTkgMjQ1LjYwOSA0MDYuNjA1IDI0Ny44NTUgNDExLjQxOCBjdXJ2ZXRvCisyNDkuMDc0IDQxNC4wMiAyNTAuOTQ1IDQxNi45NDEgMjUzLjUyIDQxOS4wODYgY3VydmV0bworMjUyLjg2MyA0MTYuODQ4IDI1NS4wOTQgNDE1LjMxNiAyNTQuMTkxIDQxMy4zODcgY3VydmV0bworMjUzLjU3NCA0MTIuMDY2IDI1Mi4zMDEgNDEwLjYyOSAyNTEuNjM3IDQwOS4yMTEgY3VydmV0bworMjUwLjU2NiA0MDYuOTE4IDI1MC45NzMgNDAyLjg1MiAyNTMuNTYyIDQwMi44NTIgY3VydmV0bworMjU1Ljg3OSA0MDIuODUyIDI1Ny45MzggNDA1Ljc1IDI1OC43ODUgNDA3LjU1NSBjdXJ2ZXRvCisyNjAuNTEyIDQxMS4yNTQgMjY0LjgzNiA0MjcuMDQzIDI2MC4wMDQgNDI3LjA0MyBjdXJ2ZXRvCisyNTQuNDM4IDQyNy4wNDMgMjQ0Ljg0NCA0MTMuMzQ0IDI0Mi44MzYgNDA5LjA0NyBjdXJ2ZXRvCisyMzkuMjUgNDAxLjM3NSAyNDEuODUyIDM5MS45MyAyNTAuMDIgMzkxLjkzIGN1cnZldG8KKzI1NS41MzkgMzkxLjkzIDI2MC4wNzggMzk3LjI4OSAyNjIuMjcgNDAxLjk4IGN1cnZldG8KKzI2My41NzggNDA0Ljc3MyAyNjQuMjg5IDQwNy41NTUgMjY0LjU3IDQxMC4xNzYgY3VydmV0bworMjY1LjY0MSA0MTAuMzc1IGxpbmV0bworMjY1Ljg3OSA0MDMuMTU2IDI3My40MzggMzkxLjIwNyAyNzAuMjE5IDM4NC4zMiBjdXJ2ZXRvCisyNjYuMTAyIDM3NS41MDggMjUzLjc4NSAzNzUuNTg2IDI0Ni43NTQgMzcyLjQ2MSBjdXJ2ZXRvCisyNDUuMjczIDM3NS45NTMgMjQzLjI3MyAzNzkuMTk5IDI0MC40NTMgMzgxLjY4IGN1cnZldG8KKzI0Ni43MjcgMzgzLjgwOSAyNjIuMTM3IDM4Ny4zODcgMjY1LjQ5MiAzOTQuNTU5IGN1cnZldG8KKzI2Ni44OTggMzk3LjU3IDI2NS45NDEgNDAyLjU2NiAyNjQuMzEyIDQwNC4yNTggY3VydmV0bworMjY0LjAzNSA0MDMuMTk1IDI2My42NTIgNDAyLjEwOSAyNjMuMTQ1IDQwMS4wMiBjdXJ2ZXRvCisyNjAuMjczIDM5NC44ODMgMjU0LjEyOSAzOTAuMTIxIDI0Ny43OTMgMzkwLjEyMSBjdXJ2ZXRvCisyMzguOTc3IDM5MC4xMjEgMjM1LjIzOCAzOTYuNTIgMjM5LjM4NyA0MDUuMzk4IGN1cnZldG8KKzI0MS44NzkgNDEwLjczIDI1NC41OTggNDI4LjQ2OSAyNjEuMTc2IDQyOC40NjkgY3VydmV0bworIGNsb3NlcGF0aCBzdHJva2UKK25ld3BhdGggMjc2LjI0MiA0MDcuMzA1IG1vdmV0bworMjc2LjU5NCA0MDYuNDM0IDI3Ny42MDkgNDAxLjUxMiAyNzguMzc5IDQwMS41MTIgY3VydmV0bworMjgwLjAzOSA0MDEuNTEyIDI4My4wMzkgNDA2LjA3OCAyODMuODQ4IDQwNy4yNjIgY3VydmV0bworMjg1LjMyNCA0MDYuMjg1IDI4NC41MDQgNDA0LjIzNCAyODcuMjQyIDQwNC4yMzQgY3VydmV0bworMjg4LjQ4IDQwNC4yMzQgMjg5LjEwNSA0MDYuOTMgMjkwLjM5NSA0MDYuOTczIGN1cnZldG8KKzI5MC40NDEgNDA1Ljg4MyAyOTAuNTA4IDQwNC44OTggMjg5LjkyMiA0MDMuNjQxIGN1cnZldG8KKzI4OS4wMTIgNDAxLjY5OSAyODYuNzE5IDM5OS4wNjYgMjg0LjQ2MSAzOTkuMDY2IGN1cnZldG8KKzI4Mi44NDQgMzk5LjA2NiAyODAuNTk0IDQwMS4wMzEgMjgwLjE1MiA0MDEuMDMxIGN1cnZldG8KKzI3OS42NzIgNDAxLjAzMSAyNzguNzg5IDQwMC44MDUgMjc4LjUwOCA0MDAuMjAzIGN1cnZldG8KKzI3Ny4zMzIgMzk3LjY5MSAyODAuNDc3IDM4OS4yOTcgMjgzLjYyNSAzODkuMjk3IGN1cnZldG8KKzI4NS4zMDkgMzg5LjI5NyAyODcuMzE2IDM5MC41NDMgMjg5LjA3OCAzOTEuMzEyIGN1cnZldG8KKzI4OC42MjEgMzg4LjI4OSAyODguNTU5IDM4NS43MzggMjg5LjE2NCAzODMuMTMzIGN1cnZldG8KKzI4Ny41NTkgMzgyLjEwOSAyODUuNjggMzgxLjY3NiAyODQuMTcyIDM4MS42NzYgY3VydmV0bworMjc2LjQzIDM4MS42NzYgMjgwLjY5OSAzOTkuODU5IDI3My41NTkgNDAzLjczNCBjdXJ2ZXRvCisyNzYuMjQyIDQwNy4zMDUgbGluZXRvCisgY2xvc2VwYXRoIGZpbGwKK25ld3BhdGggMjc2LjI0MiA0MDcuMzA1IG1vdmV0bworMjc2LjU5NCA0MDYuNDM0IDI3Ny42MDkgNDAxLjUxMiAyNzguMzc5IDQwMS41MTIgY3VydmV0bworMjgwLjAzOSA0MDEuNTEyIDI4My4wMzkgNDA2LjA3OCAyODMuODQ4IDQwNy4yNjIgY3VydmV0bworMjg1LjMyNCA0MDYuMjg1IDI4NC41MDQgNDA0LjIzNCAyODcuMjQyIDQwNC4yMzQgY3VydmV0bworMjg4LjQ4IDQwNC4yMzQgMjg5LjEwNSA0MDYuOTMgMjkwLjM5NSA0MDYuOTczIGN1cnZldG8KKzI5MC40NDEgNDA1Ljg4MyAyOTAuNTA4IDQwNC44OTggMjg5LjkyMiA0MDMuNjQxIGN1cnZldG8KKzI4OS4wMTIgNDAxLjY5OSAyODYuNzE5IDM5OS4wNjYgMjg0LjQ2MSAzOTkuMDY2IGN1cnZldG8KKzI4Mi44NDQgMzk5LjA2NiAyODAuNTk0IDQwMS4wMzEgMjgwLjE1MiA0MDEuMDMxIGN1cnZldG8KKzI3OS42NzIgNDAxLjAzMSAyNzguNzg5IDQwMC44MDUgMjc4LjUwOCA0MDAuMjAzIGN1cnZldG8KKzI3Ny4zMzIgMzk3LjY5MSAyODAuNDc3IDM4OS4yOTcgMjgzLjYyNSAzODkuMjk3IGN1cnZldG8KKzI4NS4zMDkgMzg5LjI5NyAyODcuMzE2IDM5MC41NDMgMjg5LjA3OCAzOTEuMzEyIGN1cnZldG8KKzI4OC42MjEgMzg4LjI4OSAyODguNTU5IDM4NS43MzggMjg5LjE2NCAzODMuMTMzIGN1cnZldG8KKzI4Ny41NTkgMzgyLjEwOSAyODUuNjggMzgxLjY3NiAyODQuMTcyIDM4MS42NzYgY3VydmV0bworMjc2LjQzIDM4MS42NzYgMjgwLjY5OSAzOTkuODU5IDI3My41NTkgNDAzLjczNCBjdXJ2ZXRvCisyNzYuMjQyIDQwNy4zMDUgbGluZXRvCisgY2xvc2VwYXRoIHN0cm9rZQorbmV3cGF0aCAzMDYgNDA4Ljc2MiBtb3ZldG8KKzMxMS44NTIgNDA4Ljc2MiAzMTQuMTYgMzk4LjEzMyAzMTEuNTM1IDM5Mi41MTYgY3VydmV0bworMzA5LjUgMzg4LjE2IDMwNS44ODcgMzg1IDMwMS4yNjIgMzg1IGN1cnZldG8KKzI5My4wOSAzODUgMjk0LjExMyAzOTYuMjQ2IDI5Ny4zMDEgNDAzLjA2NiBjdXJ2ZXRvCisyOTguMTggNDA0Ljk0NSAzMDEuMTg0IDQwOS4wMzkgMzAzLjUzMSA0MDkuMDM5IGN1cnZldG8KKzMwNC4zOTUgNDA5LjAzOSAzMDUuMTEzIDQwOC43NjIgMzA2IDQwOC43NjIgY3VydmV0bworIGNsb3NlcGF0aCBmaWxsCituZXdwYXRoIDMwNS44MTYgNDA3Ljc3IG1vdmV0bworMzA0Ljg5OCA0MDcuNzcgMzA0LjA4NiA0MDcuMzA5IDMwMy42NiA0MDYuMzk1IGN1cnZldG8KKzMwMi43NjIgNDA0LjQ3NyAzMDcuMjM0IDQwMi41MzUgMzA2LjU5NCA0MDEuMTY0IGN1cnZldG8KKzMwNi4xODggNDAwLjMwMSAzMDQuNjUyIDM5OS40OTIgMzAzLjg3NSAzOTkuNDkyIGN1cnZldG8KKzI5OS45OTYgMzk5LjQ5MiAzMDAuMDMxIDQwNC41ODYgMzAyLjM0IDQwNy45MDYgY3VydmV0bworMzAwLjkwNiA0MDYuOTggMjk5Ljk2MSA0MDUuNTcgMjk5LjM1MiA0MDQuMjU4IGN1cnZldG8KKzI5Ny4wNzggMzk5LjM5OCAyOTguODgzIDM5Mi43MTEgMzA0LjA2NiAzOTIuNzExIGN1cnZldG8KKzMwNi45MzQgMzkyLjcxMSAzMTAuMjMgMzk1LjMxMiAzMTEuNTEyIDM5OC4wNTUgY3VydmV0bworMzEzLjA5NCA0MDEuNDMgMzA5LjA1OSA0MDcuNzcgMzA1LjgxNiA0MDcuNzcgY3VydmV0bworIGNsb3NlcGF0aCBmaWxsCituZXdwYXRoIDMwNiA0MDguNzYyIG1vdmV0bworMzExLjg1MiA0MDguNzYyIDMxNC4xNiAzOTguMTMzIDMxMS41MzUgMzkyLjUxNiBjdXJ2ZXRvCiszMDkuNSAzODguMTYgMzA1Ljg4NyAzODUgMzAxLjI2MiAzODUgY3VydmV0bworMjkzLjA5IDM4NSAyOTQuMTEzIDM5Ni4yNDYgMjk3LjMwMSA0MDMuMDY2IGN1cnZldG8KKzI5OC4xOCA0MDQuOTQ1IDMwMS4xODQgNDA5LjAzOSAzMDMuNTMxIDQwOS4wMzkgY3VydmV0bworMzA0LjM5NSA0MDkuMDM5IDMwNS4xMTMgNDA4Ljc2MiAzMDYgNDA4Ljc2MiBjdXJ2ZXRvCisgY2xvc2VwYXRoIHN0cm9rZQorbmV3cGF0aCAzMDUuODE2IDQwNy43NyBtb3ZldG8KKzMwNC44OTggNDA3Ljc3IDMwNC4wODYgNDA3LjMwOSAzMDMuNjYgNDA2LjM5NSBjdXJ2ZXRvCiszMDIuNzYyIDQwNC40NzcgMzA3LjIzNCA0MDIuNTM1IDMwNi41OTQgNDAxLjE2NCBjdXJ2ZXRvCiszMDYuMTg4IDQwMC4zMDEgMzA0LjY1MiAzOTkuNDkyIDMwMy44NzUgMzk5LjQ5MiBjdXJ2ZXRvCisyOTkuOTk2IDM5OS40OTIgMzAwLjAzMSA0MDQuNTg2IDMwMi4zNCA0MDcuOTA2IGN1cnZldG8KKzMwMC45MDYgNDA2Ljk4IDI5OS45NjEgNDA1LjU3IDI5OS4zNTIgNDA0LjI1OCBjdXJ2ZXRvCisyOTcuMDc4IDM5OS4zOTggMjk4Ljg4MyAzOTIuNzExIDMwNC4wNjYgMzkyLjcxMSBjdXJ2ZXRvCiszMDYuOTM0IDM5Mi43MTEgMzEwLjIzIDM5NS4zMTIgMzExLjUxMiAzOTguMDU1IGN1cnZldG8KKzMxMy4wOTQgNDAxLjQzIDMwOS4wNTkgNDA3Ljc3IDMwNS44MTYgNDA3Ljc3IGN1cnZldG8KKyBjbG9zZXBhdGggc3Ryb2tlCituZXdwYXRoIDMzMi41OSAzOTEuMjYyIG1vdmV0bworMzMxLjA2MiAzODcuOTkyIDMyOC4yMTEgMzg2LjE5NSAzMjUuMDA0IDM4Ni4xOTUgY3VydmV0bworMzE0LjgyNCAzODYuMTk1IDMxMi44MDUgMzk1LjU3IDMxNy4yMTUgNDA1LjAxMiBjdXJ2ZXRvCiszMTguMjU4IDQwNy4yMzggMzE5Ljk2OSA0MDkuNzAzIDMyMi41NzggNDA5LjcwMyBjdXJ2ZXRvCiszMzAuNzU4IDQwOS43MDMgMzM2LjQ1MyAzOTkuNTMxIDMzMi41OSAzOTEuMjYyIGN1cnZldG8KKyBjbG9zZXBhdGggZmlsbAorbmV3cGF0aCAzMjQuNDY5IDQwOC41MiBtb3ZldG8KKzMyMy43MTUgNDA4LjUyIDMyMy4wNTkgNDA4LjI0NiAzMjIuNjk1IDQwNy40NzcgY3VydmV0bworMzIxLjkwNiA0MDUuNzgxIDMyNi4yMTEgNDA0LjI3IDMyNi4yMTkgNDAyLjUxNiBjdXJ2ZXRvCiszMjUuNzcgNDAxLjk4IDMyNC41MDggNDAxLjM3OSAzMjMuOTYxIDQwMS4zNzkgY3VydmV0bworMzIwLjg1OSA0MDEuMzc5IDMxOC41MTYgNDA1LjYyNSAzMjEuMTY0IDQwOC43ODEgY3VydmV0bworMzIwLjA5IDQwOC4wOTQgMzE5LjQ0OSA0MDcuMDYyIDMxOSA0MDYuMDkgY3VydmV0bworMzE2LjMxMiA0MDAuMzQ0IDMyMC4xNDEgMzk0LjUzNSAzMjUuNzE5IDM5NC41MzUgY3VydmV0bworMzI4LjA0MyAzOTQuNTM1IDMzMS4wMzUgMzk1Ljg0IDMzMi4yNDIgMzk4LjQyMiBjdXJ2ZXRvCiszMzMuOTQ5IDQwMi4wNzQgMzI3Ljg2NyA0MDguNTIgMzI0LjQ2OSA0MDguNTIgY3VydmV0bworIGNsb3NlcGF0aCBmaWxsCituZXdwYXRoIDMzMi41OSAzOTEuMjYyIG1vdmV0bworMzMxLjA2MiAzODcuOTkyIDMyOC4yMTEgMzg2LjE5NSAzMjUuMDA0IDM4Ni4xOTUgY3VydmV0bworMzE0LjgyNCAzODYuMTk1IDMxMi44MDUgMzk1LjU3IDMxNy4yMTUgNDA1LjAxMiBjdXJ2ZXRvCiszMTguMjU4IDQwNy4yMzggMzE5Ljk2OSA0MDkuNzAzIDMyMi41NzggNDA5LjcwMyBjdXJ2ZXRvCiszMzAuNzU4IDQwOS43MDMgMzM2LjQ1MyAzOTkuNTMxIDMzMi41OSAzOTEuMjYyIGN1cnZldG8KKyBjbG9zZXBhdGggc3Ryb2tlCituZXdwYXRoIDMyNC40NjkgNDA4LjUyIG1vdmV0bworMzIzLjcxNSA0MDguNTIgMzIzLjA1OSA0MDguMjQ2IDMyMi42OTUgNDA3LjQ3NyBjdXJ2ZXRvCiszMjEuOTA2IDQwNS43ODEgMzI2LjIxMSA0MDQuMjcgMzI2LjIxOSA0MDIuNTE2IGN1cnZldG8KKzMyNS43NyA0MDEuOTggMzI0LjUwOCA0MDEuMzc5IDMyMy45NjEgNDAxLjM3OSBjdXJ2ZXRvCiszMjAuODU5IDQwMS4zNzkgMzE4LjUxNiA0MDUuNjI1IDMyMS4xNjQgNDA4Ljc4MSBjdXJ2ZXRvCiszMjAuMDkgNDA4LjA5NCAzMTkuNDQ5IDQwNy4wNjIgMzE5IDQwNi4wOSBjdXJ2ZXRvCiszMTYuMzEyIDQwMC4zNDQgMzIwLjE0MSAzOTQuNTM1IDMyNS43MTkgMzk0LjUzNSBjdXJ2ZXRvCiszMjguMDQzIDM5NC41MzUgMzMxLjAzNSAzOTUuODQgMzMyLjI0MiAzOTguNDIyIGN1cnZldG8KKzMzMy45NDkgNDAyLjA3NCAzMjcuODY3IDQwOC41MiAzMjQuNDY5IDQwOC41MiBjdXJ2ZXRvCisgY2xvc2VwYXRoIHN0cm9rZQorbmV3cGF0aCAzNDMuMTIxIDQwOC41NzQgbW92ZXRvCiszNTEuODkxIDQwOC41NzQgMzU2LjM1MiAzOTIuMzE2IDM1Mi40MyAzODMuOTMgY3VydmV0bworMzUxLjY4IDM4Mi4zMjQgMzUwLjI4NSAzODAuNzIzIDM0OC40NDEgMzgwLjcyMyBjdXJ2ZXRvCiszMzguNDE4IDM4MC43MjMgMzQwLjk3NyA0MDAuODQ4IDMzNS4zMzIgNDA2LjU2MiBjdXJ2ZXRvCiszMzUuODUyIDQwNy4xMTcgMzM2LjM0NCA0MDcuNjk1IDMzNi43OTcgNDA4LjI3NyBjdXJ2ZXRvCiszNDAuNjA5IDQwMy43NTggMzM4LjcxNSAzOTEuODY3IDM0Ni44NTkgMzkxLjg2NyBjdXJ2ZXRvCiszNDguNzM0IDM5MS44NjcgMzUwLjE1NiAzOTMuNTIzIDM1MC45MSAzOTUuMTQ1IGN1cnZldG8KKzM1Mi45MzQgMzk5LjQ3MyAzNDkuMTkxIDQwNi45ODQgMzQ1LjA5OCA0MDYuOTg0IGN1cnZldG8KKzM0NS4wNTUgNDA2Ljk4NCAzNDQuNDY1IDQwNi45NjEgMzQ0LjQ4IDQwNi43MTkgY3VydmV0bworMzQ0LjYyOSA0MDMuOTU3IDM0Ni43ODEgNDA1LjY4IDM0NC42MTcgNDAwLjk4IGN1cnZldG8KKzM0Mi40MDIgNDAxLjQyNiAzNDAuMDU5IDQwNS4wMTYgMzQxLjI2NiA0MDcuNjA1IGN1cnZldG8KKzM0MS42MjUgNDA4LjM2MyAzNDIuNTE2IDQwOC41NzQgMzQzLjEyMSA0MDguNTc0IGN1cnZldG8KKyBjbG9zZXBhdGggZmlsbAorbmV3cGF0aCAzNDMuMTIxIDQwOC41NzQgbW92ZXRvCiszNTEuODkxIDQwOC41NzQgMzU2LjM1MiAzOTIuMzE2IDM1Mi40MyAzODMuOTMgY3VydmV0bworMzUxLjY4IDM4Mi4zMjQgMzUwLjI4NSAzODAuNzIzIDM0OC40NDEgMzgwLjcyMyBjdXJ2ZXRvCiszMzguNDE4IDM4MC43MjMgMzQwLjk3NyA0MDAuODQ4IDMzNS4zMzIgNDA2LjU2MiBjdXJ2ZXRvCiszMzUuODUyIDQwNy4xMTcgMzM2LjM0NCA0MDcuNjk1IDMzNi43OTcgNDA4LjI3NyBjdXJ2ZXRvCiszNDAuNjA5IDQwMy43NTggMzM4LjcxNSAzOTEuODY3IDM0Ni44NTkgMzkxLjg2NyBjdXJ2ZXRvCiszNDguNzM0IDM5MS44NjcgMzUwLjE1NiAzOTMuNTIzIDM1MC45MSAzOTUuMTQ1IGN1cnZldG8KKzM1Mi45MzQgMzk5LjQ3MyAzNDkuMTkxIDQwNi45ODQgMzQ1LjA5OCA0MDYuOTg0IGN1cnZldG8KKzM0NS4wNTUgNDA2Ljk4NCAzNDQuNDY1IDQwNi45NjEgMzQ0LjQ4IDQwNi43MTkgY3VydmV0bworMzQ0LjYyOSA0MDMuOTU3IDM0Ni43ODEgNDA1LjY4IDM0NC42MTcgNDAwLjk4IGN1cnZldG8KKzM0Mi40MDIgNDAxLjQyNiAzNDAuMDU5IDQwNS4wMTYgMzQxLjI2NiA0MDcuNjA1IGN1cnZldG8KKzM0MS42MjUgNDA4LjM2MyAzNDIuNTE2IDQwOC41NzQgMzQzLjEyMSA0MDguNTc0IGN1cnZldG8KKyBjbG9zZXBhdGggc3Ryb2tlCituZXdwYXRoIDM2NC45MzggNDA4Ljc1OCBtb3ZldG8KKzM2NS43NjIgNDA4LjY4IDM2Ny4wMDQgNDA4Ljc1NCAzNjcuNzExIDQwOC41MzUgY3VydmV0bworMzY3Ljg0OCA0MDguNDk2IDM2Ny43NDYgNDA4LjMyOCAzNjcuNzY2IDQwOC4xOTUgY3VydmV0bworMzY3Ljk4NCA0MDYuOTY1IDM2OC4zMiA0MDUuODAxIDM2OC42MTcgNDA0LjYxMyBjdXJ2ZXRvCiszNjkuNzU4IDM5OS45ODggMzcwLjQ0NSAzOTUuMjM4IDM3MS43NTggMzkwLjY1MiBjdXJ2ZXRvCiszNzMuMTg0IDM4NS42NiAzNzQuNjcyIDM4MC4wMzUgMzcyLjk0NSAzNzMuNzcgY3VydmV0bworMzcyLjc3NyAzNzMuMTU2IDM3Mi41NTEgMzcyLjUzNSAzNzIuMjU4IDM3MS45MSBjdXJ2ZXRvCiszNzAuMzAxIDM2Ny43MTkgMzUzLjQzIDM2Mi44ODcgMzQ5LjAyMyAzNjIuODg3IGN1cnZldG8KKzM0OC40OTIgMzYyLjg4NyAzNDcuOTE0IDM2My4wNDMgMzQ3LjY1NiAzNjMuMzkxIGN1cnZldG8KKzM0OS41MTYgMzY0LjU4NiAzNTAuNjggMzY1LjgxMiAzNTEuNTA4IDM2Ny41ODYgY3VydmV0bworMzUyLjUwNCAzNjkuNzE5IDM1Mi40OTIgMzcxLjcxMSAzNTIuMzU5IDM3My41NTEgY3VydmV0bworMzUyLjcxMSAzNzMuMzQ0IDM2NS42NzIgMzczLjY2NCAzNjYuMTQxIDM3My42NjQgY3VydmV0bworMzY4LjA0NyAzNzMuNjY0IDM2OS42ODQgMzc1LjUyMyAzNzAuNDQ1IDM3Ny4xNiBjdXJ2ZXRvCiszNzEuODUyIDM4MC4xNjQgMzcxLjYxMyAzODMuMjMgMzcxLjM2NyAzODUuNzg5IGN1cnZldG8KKzM3MS4yNDYgMzg3LjA2NiAzNzEuMDc0IDM4OC4zMjggMzcwLjg0IDM4OS41NTkgY3VydmV0bworMzcwLjQ4IDM5MS4zMzIgbGluZXRvCiszNzAuNDM4IDM5MS41MzEgbGluZXRvCiszNzAuMzkxIDM5MS43MjMgbGluZXRvCiszNzAuNjA1IDM5MS43MjMgMzcwLjQxNCAzOTEuMzQ4IDM3MC40MjIgMzkxLjE1NiBjdXJ2ZXRvCiszNzAuNTU1IDM4OC4wNTkgMzcwLjUgMzgzLjczOCAzNjguODUyIDM4MC4yMTEgY3VydmV0bworMzY4LjA4NiAzNzguNTc0IDM2Ni44MzIgMzc2Ljg4NyAzNjQuOTEgMzc2Ljg4NyBjdXJ2ZXRvCiszNTYuNDg4IDM3Ni44ODcgMzYwLjcyMyA0MDEuMDE2IDM1My45NzMgNDA2Ljc1IGN1cnZldG8KKzM1NC4zNDggNDA3LjM3NSAzNTQuNjggNDA4LjAxNiAzNTQuOTYxIDQwOC42NDUgY3VydmV0bworMzU4Ljk1MyA0MDMuNzczIDM1OS4xNjQgMzkwLjM0IDM2NS4wNDcgMzkwLjM0IGN1cnZldG8KKzM2Ni40NzMgMzkwLjM0IDM2Ny45NDUgMzkxLjY5MSAzNjguNTU1IDM5Mi45ODggY3VydmV0bworMzcxLjE2OCAzOTguNTc4IDM2Ni44MjQgNDA1LjA4NiAzNjQuOTM4IDQwOC43NTggY3VydmV0bworIGNsb3NlcGF0aCBmaWxsCituZXdwYXRoIDM2NC45MzggNDA4Ljc1OCBtb3ZldG8KKzM2NS43NjIgNDA4LjY4IDM2Ny4wMDQgNDA4Ljc1NCAzNjcuNzExIDQwOC41MzUgY3VydmV0bworMzY3Ljg0OCA0MDguNDk2IDM2Ny43NDYgNDA4LjMyOCAzNjcuNzY2IDQwOC4xOTUgY3VydmV0bworMzY3Ljk4NCA0MDYuOTY1IDM2OC4zMiA0MDUuODAxIDM2OC42MTcgNDA0LjYxMyBjdXJ2ZXRvCiszNjkuNzU4IDM5OS45ODggMzcwLjQ0NSAzOTUuMjM4IDM3MS43NTggMzkwLjY1MiBjdXJ2ZXRvCiszNzMuMTg0IDM4NS42NiAzNzQuNjcyIDM4MC4wMzUgMzcyLjk0NSAzNzMuNzcgY3VydmV0bworMzcyLjc3NyAzNzMuMTU2IDM3Mi41NTEgMzcyLjUzNSAzNzIuMjU4IDM3MS45MSBjdXJ2ZXRvCiszNzAuMzAxIDM2Ny43MTkgMzUzLjQzIDM2Mi44ODcgMzQ5LjAyMyAzNjIuODg3IGN1cnZldG8KKzM0OC40OTIgMzYyLjg4NyAzNDcuOTE0IDM2My4wNDMgMzQ3LjY1NiAzNjMuMzkxIGN1cnZldG8KKzM0OS41MTYgMzY0LjU4NiAzNTAuNjggMzY1LjgxMiAzNTEuNTA4IDM2Ny41ODYgY3VydmV0bworMzUyLjUwNCAzNjkuNzE5IDM1Mi40OTIgMzcxLjcxMSAzNTIuMzU5IDM3My41NTEgY3VydmV0bworMzUyLjcxMSAzNzMuMzQ0IDM2NS42NzIgMzczLjY2NCAzNjYuMTQxIDM3My42NjQgY3VydmV0bworMzY4LjA0NyAzNzMuNjY0IDM2OS42ODQgMzc1LjUyMyAzNzAuNDQ1IDM3Ny4xNiBjdXJ2ZXRvCiszNzEuODUyIDM4MC4xNjQgMzcxLjYxMyAzODMuMjMgMzcxLjM2NyAzODUuNzg5IGN1cnZldG8KKzM3MS4yNDYgMzg3LjA2NiAzNzEuMDc0IDM4OC4zMjggMzcwLjg0IDM4OS41NTkgY3VydmV0bworMzcwLjQ4IDM5MS4zMzIgbGluZXRvCiszNzAuNDM4IDM5MS41MzEgbGluZXRvCiszNzAuMzkxIDM5MS43MjMgbGluZXRvCiszNzAuNjA1IDM5MS43MjMgMzcwLjQxNCAzOTEuMzQ4IDM3MC40MjIgMzkxLjE1NiBjdXJ2ZXRvCiszNzAuNTU1IDM4OC4wNTkgMzcwLjUgMzgzLjczOCAzNjguODUyIDM4MC4yMTEgY3VydmV0bworMzY4LjA4NiAzNzguNTc0IDM2Ni44MzIgMzc2Ljg4NyAzNjQuOTEgMzc2Ljg4NyBjdXJ2ZXRvCiszNTYuNDg4IDM3Ni44ODcgMzYwLjcyMyA0MDEuMDE2IDM1My45NzMgNDA2Ljc1IGN1cnZldG8KKzM1NC4zNDggNDA3LjM3NSAzNTQuNjggNDA4LjAxNiAzNTQuOTYxIDQwOC42NDUgY3VydmV0bworMzU4Ljk1MyA0MDMuNzczIDM1OS4xNjQgMzkwLjM0IDM2NS4wNDcgMzkwLjM0IGN1cnZldG8KKzM2Ni40NzMgMzkwLjM0IDM2Ny45NDUgMzkxLjY5MSAzNjguNTU1IDM5Mi45ODggY3VydmV0bworMzcxLjE2OCAzOTguNTc4IDM2Ni44MjQgNDA1LjA4NiAzNjQuOTM4IDQwOC43NTggY3VydmV0bworIGNsb3NlcGF0aCBzdHJva2UKK25ld3BhdGggMjYxLjE3NiA0MjguNDY5IG1vdmV0bworMjY2Ljk2OSA0MjguNDY5IDI2My41OTQgNDEzLjg0OCAyNjEuNTMxIDQwOS40MzggY3VydmV0bworMjU5Ljc3IDQwNS42NjQgMjU1Ljc5NyA0MDAuMjE5IDI1MS4wODYgNDAwLjIxOSBjdXJ2ZXRvCisyNDUuNDQxIDQwMC4yMTkgMjQ1LjYwOSA0MDYuNjA1IDI0Ny44NTUgNDExLjQxOCBjdXJ2ZXRvCisyNDkuMDc0IDQxNC4wMiAyNTAuOTQ1IDQxNi45NDEgMjUzLjUyIDQxOS4wODYgY3VydmV0bworMjUyLjg2MyA0MTYuODQ4IDI1NS4wOTQgNDE1LjMxNiAyNTQuMTkxIDQxMy4zODcgY3VydmV0bworMjUzLjU3NCA0MTIuMDY2IDI1Mi4zMDEgNDEwLjYyOSAyNTEuNjM3IDQwOS4yMTEgY3VydmV0bworMjUwLjU2NiA0MDYuOTE4IDI1MC45NzMgNDAyLjg1MiAyNTMuNTYyIDQwMi44NTIgY3VydmV0bworMjU1Ljg3OSA0MDIuODUyIDI1Ny45MzggNDA1Ljc1IDI1OC43ODUgNDA3LjU1NSBjdXJ2ZXRvCisyNjAuNTEyIDQxMS4yNTQgMjY0LjgzNiA0MjcuMDQzIDI2MC4wMDQgNDI3LjA0MyBjdXJ2ZXRvCisyNTQuNDM4IDQyNy4wNDMgMjQ0Ljg0NCA0MTMuMzQ0IDI0Mi44MzYgNDA5LjA0NyBjdXJ2ZXRvCisyMzkuMjUgNDAxLjM3NSAyNDEuODUyIDM5MS45MyAyNTAuMDIgMzkxLjkzIGN1cnZldG8KKzI1NS41MzkgMzkxLjkzIDI2MC4wNzggMzk3LjI4OSAyNjIuMjcgNDAxLjk4IGN1cnZldG8KKzI2My41NzggNDA0Ljc3MyAyNjQuMjg5IDQwNy41NTUgMjY0LjU3IDQxMC4xNzYgY3VydmV0bworMjY1LjY0MSA0MTAuMzc1IGxpbmV0bworMjY1Ljg3OSA0MDMuMTU2IDI3My40MzggMzkxLjIwNyAyNzAuMjE5IDM4NC4zMiBjdXJ2ZXRvCisyNjYuMTAyIDM3NS41MDggMjUzLjc4NSAzNzUuNTg2IDI0Ni43NTQgMzcyLjQ2MSBjdXJ2ZXRvCisyNDUuMjczIDM3NS45NTMgMjQzLjI3MyAzNzkuMTk5IDI0MC40NTMgMzgxLjY4IGN1cnZldG8KKzI0Ni43MjcgMzgzLjgwOSAyNjIuMTM3IDM4Ny4zODcgMjY1LjQ5MiAzOTQuNTU5IGN1cnZldG8KKzI2Ni44OTggMzk3LjU3IDI2NS45NDEgNDAyLjU2NiAyNjQuMzEyIDQwNC4yNTggY3VydmV0bworMjY0LjAzNSA0MDMuMTk1IDI2My42NTIgNDAyLjEwOSAyNjMuMTQ1IDQwMS4wMiBjdXJ2ZXRvCisyNjAuMjczIDM5NC44ODMgMjU0LjEyOSAzOTAuMTIxIDI0Ny43OTMgMzkwLjEyMSBjdXJ2ZXRvCisyMzguOTc3IDM5MC4xMjEgMjM1LjIzOCAzOTYuNTIgMjM5LjM4NyA0MDUuMzk4IGN1cnZldG8KKzI0MS44NzkgNDEwLjczIDI1NC41OTggNDI4LjQ2OSAyNjEuMTc2IDQyOC40NjkgY3VydmV0bworIGNsb3NlcGF0aCBmaWxsCisgMCAwLjgxMjggZHRyYW5zZm9ybSB0cnVuY2F0ZSBpZHRyYW5zZm9ybSBzZXRsaW5ld2lkdGggcG9wIDAgc2V0bGluZWpvaW4KK25ld3BhdGggMjYxLjE3NiA0MjguNDY5IG1vdmV0bworMjY2Ljk2OSA0MjguNDY5IDI2My41OTQgNDEzLjg0OCAyNjEuNTMxIDQwOS40MzggY3VydmV0bworMjU5Ljc3IDQwNS42NjQgMjU1Ljc5NyA0MDAuMjE5IDI1MS4wODYgNDAwLjIxOSBjdXJ2ZXRvCisyNDUuNDQxIDQwMC4yMTkgMjQ1LjYwOSA0MDYuNjA1IDI0Ny44NTUgNDExLjQxOCBjdXJ2ZXRvCisyNDkuMDc0IDQxNC4wMiAyNTAuOTQ1IDQxNi45NDEgMjUzLjUyIDQxOS4wODYgY3VydmV0bworMjUyLjg2MyA0MTYuODQ4IDI1NS4wOTQgNDE1LjMxNiAyNTQuMTkxIDQxMy4zODcgY3VydmV0bworMjUzLjU3NCA0MTIuMDY2IDI1Mi4zMDEgNDEwLjYyOSAyNTEuNjM3IDQwOS4yMTEgY3VydmV0bworMjUwLjU2NiA0MDYuOTE4IDI1MC45NzMgNDAyLjg1MiAyNTMuNTYyIDQwMi44NTIgY3VydmV0bworMjU1Ljg3OSA0MDIuODUyIDI1Ny45MzggNDA1Ljc1IDI1OC43ODUgNDA3LjU1NSBjdXJ2ZXRvCisyNjAuNTEyIDQxMS4yNTQgMjY0LjgzNiA0MjcuMDQzIDI2MC4wMDQgNDI3LjA0MyBjdXJ2ZXRvCisyNTQuNDM4IDQyNy4wNDMgMjQ0Ljg0NCA0MTMuMzQ0IDI0Mi44MzYgNDA5LjA0NyBjdXJ2ZXRvCisyMzkuMjUgNDAxLjM3NSAyNDEuODUyIDM5MS45MyAyNTAuMDIgMzkxLjkzIGN1cnZldG8KKzI1NS41MzkgMzkxLjkzIDI2MC4wNzggMzk3LjI4OSAyNjIuMjcgNDAxLjk4IGN1cnZldG8KKzI2My41NzggNDA0Ljc3MyAyNjQuMjg5IDQwNy41NTUgMjY0LjU3IDQxMC4xNzYgY3VydmV0bworMjY1LjY0MSA0MTAuMzc1IGxpbmV0bworMjY1Ljg3OSA0MDMuMTU2IDI3My40MzggMzkxLjIwNyAyNzAuMjE5IDM4NC4zMiBjdXJ2ZXRvCisyNjYuMTAyIDM3NS41MDggMjUzLjc4NSAzNzUuNTg2IDI0Ni43NTQgMzcyLjQ2MSBjdXJ2ZXRvCisyNDUuMjczIDM3NS45NTMgMjQzLjI3MyAzNzkuMTk5IDI0MC40NTMgMzgxLjY4IGN1cnZldG8KKzI0Ni43MjcgMzgzLjgwOSAyNjIuMTM3IDM4Ny4zODcgMjY1LjQ5MiAzOTQuNTU5IGN1cnZldG8KKzI2Ni44OTggMzk3LjU3IDI2NS45NDEgNDAyLjU2NiAyNjQuMzEyIDQwNC4yNTggY3VydmV0bworMjY0LjAzNSA0MDMuMTk1IDI2My42NTIgNDAyLjEwOSAyNjMuMTQ1IDQwMS4wMiBjdXJ2ZXRvCisyNjAuMjczIDM5NC44ODMgMjU0LjEyOSAzOTAuMTIxIDI0Ny43OTMgMzkwLjEyMSBjdXJ2ZXRvCisyMzguOTc3IDM5MC4xMjEgMjM1LjIzOCAzOTYuNTIgMjM5LjM4NyA0MDUuMzk4IGN1cnZldG8KKzI0MS44NzkgNDEwLjczIDI1NC41OTggNDI4LjQ2OSAyNjEuMTc2IDQyOC40NjkgY3VydmV0bworIGNsb3NlcGF0aCBzdHJva2UKK25ld3BhdGggMjc2LjI0MiA0MDcuMzA1IG1vdmV0bworMjc2LjU5NCA0MDYuNDM0IDI3Ny42MDkgNDAxLjUxMiAyNzguMzc5IDQwMS41MTIgY3VydmV0bworMjgwLjAzOSA0MDEuNTEyIDI4My4wMzkgNDA2LjA3OCAyODMuODQ4IDQwNy4yNjIgY3VydmV0bworMjg1LjMyNCA0MDYuMjg1IDI4NC41MDQgNDA0LjIzNCAyODcuMjQyIDQwNC4yMzQgY3VydmV0bworMjg4LjQ4IDQwNC4yMzQgMjg5LjEwNSA0MDYuOTMgMjkwLjM5NSA0MDYuOTczIGN1cnZldG8KKzI5MC40NDEgNDA1Ljg4MyAyOTAuNTA4IDQwNC44OTggMjg5LjkyMiA0MDMuNjQxIGN1cnZldG8KKzI4OS4wMTIgNDAxLjY5OSAyODYuNzE5IDM5OS4wNjYgMjg0LjQ2MSAzOTkuMDY2IGN1cnZldG8KKzI4Mi44NDQgMzk5LjA2NiAyODAuNTk0IDQwMS4wMzEgMjgwLjE1MiA0MDEuMDMxIGN1cnZldG8KKzI3OS42NzIgNDAxLjAzMSAyNzguNzg5IDQwMC44MDUgMjc4LjUwOCA0MDAuMjAzIGN1cnZldG8KKzI3Ny4zMzIgMzk3LjY5MSAyODAuNDc3IDM4OS4yOTcgMjgzLjYyNSAzODkuMjk3IGN1cnZldG8KKzI4NS4zMDkgMzg5LjI5NyAyODcuMzE2IDM5MC41NDMgMjg5LjA3OCAzOTEuMzEyIGN1cnZldG8KKzI4OC42MjEgMzg4LjI4OSAyODguNTU5IDM4NS43MzggMjg5LjE2NCAzODMuMTMzIGN1cnZldG8KKzI4Ny41NTkgMzgyLjEwOSAyODUuNjggMzgxLjY3NiAyODQuMTcyIDM4MS42NzYgY3VydmV0bworMjc2LjQzIDM4MS42NzYgMjgwLjY5OSAzOTkuODU5IDI3My41NTkgNDAzLjczNCBjdXJ2ZXRvCisyNzYuMjQyIDQwNy4zMDUgbGluZXRvCisgY2xvc2VwYXRoIGZpbGwKK25ld3BhdGggMjc2LjI0MiA0MDcuMzA1IG1vdmV0bworMjc2LjU5NCA0MDYuNDM0IDI3Ny42MDkgNDAxLjUxMiAyNzguMzc5IDQwMS41MTIgY3VydmV0bworMjgwLjAzOSA0MDEuNTEyIDI4My4wMzkgNDA2LjA3OCAyODMuODQ4IDQwNy4yNjIgY3VydmV0bworMjg1LjMyNCA0MDYuMjg1IDI4NC41MDQgNDA0LjIzNCAyODcuMjQyIDQwNC4yMzQgY3VydmV0bworMjg4LjQ4IDQwNC4yMzQgMjg5LjEwNSA0MDYuOTMgMjkwLjM5NSA0MDYuOTczIGN1cnZldG8KKzI5MC40NDEgNDA1Ljg4MyAyOTAuNTA4IDQwNC44OTggMjg5LjkyMiA0MDMuNjQxIGN1cnZldG8KKzI4OS4wMTIgNDAxLjY5OSAyODYuNzE5IDM5OS4wNjYgMjg0LjQ2MSAzOTkuMDY2IGN1cnZldG8KKzI4Mi44NDQgMzk5LjA2NiAyODAuNTk0IDQwMS4wMzEgMjgwLjE1MiA0MDEuMDMxIGN1cnZldG8KKzI3OS42NzIgNDAxLjAzMSAyNzguNzg5IDQwMC44MDUgMjc4LjUwOCA0MDAuMjAzIGN1cnZldG8KKzI3Ny4zMzIgMzk3LjY5MSAyODAuNDc3IDM4OS4yOTcgMjgzLjYyNSAzODkuMjk3IGN1cnZldG8KKzI4NS4zMDkgMzg5LjI5NyAyODcuMzE2IDM5MC41NDMgMjg5LjA3OCAzOTEuMzEyIGN1cnZldG8KKzI4OC42MjEgMzg4LjI4OSAyODguNTU5IDM4NS43MzggMjg5LjE2NCAzODMuMTMzIGN1cnZldG8KKzI4Ny41NTkgMzgyLjEwOSAyODUuNjggMzgxLjY3NiAyODQuMTcyIDM4MS42NzYgY3VydmV0bworMjc2LjQzIDM4MS42NzYgMjgwLjY5OSAzOTkuODU5IDI3My41NTkgNDAzLjczNCBjdXJ2ZXRvCisyNzYuMjQyIDQwNy4zMDUgbGluZXRvCisgY2xvc2VwYXRoIHN0cm9rZQorbmV3cGF0aCAzMDYgNDA4Ljc2MiBtb3ZldG8KKzMxMS44NTIgNDA4Ljc2MiAzMTQuMTYgMzk4LjEzMyAzMTEuNTM1IDM5Mi41MTYgY3VydmV0bworMzA5LjUgMzg4LjE2IDMwNS44ODcgMzg1IDMwMS4yNjIgMzg1IGN1cnZldG8KKzI5My4wOSAzODUgMjk0LjExMyAzOTYuMjQ2IDI5Ny4zMDEgNDAzLjA2NiBjdXJ2ZXRvCisyOTguMTggNDA0Ljk0NSAzMDEuMTg0IDQwOS4wMzkgMzAzLjUzMSA0MDkuMDM5IGN1cnZldG8KKzMwNC4zOTUgNDA5LjAzOSAzMDUuMTEzIDQwOC43NjIgMzA2IDQwOC43NjIgY3VydmV0bworIGNsb3NlcGF0aCBmaWxsCituZXdwYXRoIDMwNS44MTYgNDA3Ljc3IG1vdmV0bworMzA0Ljg5OCA0MDcuNzcgMzA0LjA4NiA0MDcuMzA5IDMwMy42NiA0MDYuMzk1IGN1cnZldG8KKzMwMi43NjIgNDA0LjQ3NyAzMDcuMjM0IDQwMi41MzUgMzA2LjU5NCA0MDEuMTY0IGN1cnZldG8KKzMwNi4xODggNDAwLjMwMSAzMDQuNjUyIDM5OS40OTIgMzAzLjg3NSAzOTkuNDkyIGN1cnZldG8KKzI5OS45OTYgMzk5LjQ5MiAzMDAuMDMxIDQwNC41ODYgMzAyLjM0IDQwNy45MDYgY3VydmV0bworMzAwLjkwNiA0MDYuOTggMjk5Ljk2MSA0MDUuNTcgMjk5LjM1MiA0MDQuMjU4IGN1cnZldG8KKzI5Ny4wNzggMzk5LjM5OCAyOTguODgzIDM5Mi43MTEgMzA0LjA2NiAzOTIuNzExIGN1cnZldG8KKzMwNi45MzQgMzkyLjcxMSAzMTAuMjMgMzk1LjMxMiAzMTEuNTEyIDM5OC4wNTUgY3VydmV0bworMzEzLjA5NCA0MDEuNDMgMzA5LjA1OSA0MDcuNzcgMzA1LjgxNiA0MDcuNzcgY3VydmV0bworIGNsb3NlcGF0aCBmaWxsCituZXdwYXRoIDMwNiA0MDguNzYyIG1vdmV0bworMzExLjg1MiA0MDguNzYyIDMxNC4xNiAzOTguMTMzIDMxMS41MzUgMzkyLjUxNiBjdXJ2ZXRvCiszMDkuNSAzODguMTYgMzA1Ljg4NyAzODUgMzAxLjI2MiAzODUgY3VydmV0bworMjkzLjA5IDM4NSAyOTQuMTEzIDM5Ni4yNDYgMjk3LjMwMSA0MDMuMDY2IGN1cnZldG8KKzI5OC4xOCA0MDQuOTQ1IDMwMS4xODQgNDA5LjAzOSAzMDMuNTMxIDQwOS4wMzkgY3VydmV0bworMzA0LjM5NSA0MDkuMDM5IDMwNS4xMTMgNDA4Ljc2MiAzMDYgNDA4Ljc2MiBjdXJ2ZXRvCisgY2xvc2VwYXRoIHN0cm9rZQorbmV3cGF0aCAzMDUuODE2IDQwNy43NyBtb3ZldG8KKzMwNC44OTggNDA3Ljc3IDMwNC4wODYgNDA3LjMwOSAzMDMuNjYgNDA2LjM5NSBjdXJ2ZXRvCiszMDIuNzYyIDQwNC40NzcgMzA3LjIzNCA0MDIuNTM1IDMwNi41OTQgNDAxLjE2NCBjdXJ2ZXRvCiszMDYuMTg4IDQwMC4zMDEgMzA0LjY1MiAzOTkuNDkyIDMwMy44NzUgMzk5LjQ5MiBjdXJ2ZXRvCisyOTkuOTk2IDM5OS40OTIgMzAwLjAzMSA0MDQuNTg2IDMwMi4zNCA0MDcuOTA2IGN1cnZldG8KKzMwMC45MDYgNDA2Ljk4IDI5OS45NjEgNDA1LjU3IDI5OS4zNTIgNDA0LjI1OCBjdXJ2ZXRvCisyOTcuMDc4IDM5OS4zOTggMjk4Ljg4MyAzOTIuNzExIDMwNC4wNjYgMzkyLjcxMSBjdXJ2ZXRvCiszMDYuOTM0IDM5Mi43MTEgMzEwLjIzIDM5NS4zMTIgMzExLjUxMiAzOTguMDU1IGN1cnZldG8KKzMxMy4wOTQgNDAxLjQzIDMwOS4wNTkgNDA3Ljc3IDMwNS44MTYgNDA3Ljc3IGN1cnZldG8KKyBjbG9zZXBhdGggc3Ryb2tlCituZXdwYXRoIDMzMi41OSAzOTEuMjYyIG1vdmV0bworMzMxLjA2MiAzODcuOTkyIDMyOC4yMTEgMzg2LjE5NSAzMjUuMDA0IDM4Ni4xOTUgY3VydmV0bworMzE0LjgyNCAzODYuMTk1IDMxMi44MDUgMzk1LjU3IDMxNy4yMTUgNDA1LjAxMiBjdXJ2ZXRvCiszMTguMjU4IDQwNy4yMzggMzE5Ljk2OSA0MDkuNzAzIDMyMi41NzggNDA5LjcwMyBjdXJ2ZXRvCiszMzAuNzU4IDQwOS43MDMgMzM2LjQ1MyAzOTkuNTMxIDMzMi41OSAzOTEuMjYyIGN1cnZldG8KKyBjbG9zZXBhdGggZmlsbAorbmV3cGF0aCAzMjQuNDY5IDQwOC41MiBtb3ZldG8KKzMyMy43MTUgNDA4LjUyIDMyMy4wNTkgNDA4LjI0NiAzMjIuNjk1IDQwNy40NzcgY3VydmV0bworMzIxLjkwNiA0MDUuNzgxIDMyNi4yMTEgNDA0LjI3IDMyNi4yMTkgNDAyLjUxNiBjdXJ2ZXRvCiszMjUuNzcgNDAxLjk4IDMyNC41MDggNDAxLjM3OSAzMjMuOTYxIDQwMS4zNzkgY3VydmV0bworMzIwLjg1OSA0MDEuMzc5IDMxOC41MTYgNDA1LjYyNSAzMjEuMTY0IDQwOC43ODEgY3VydmV0bworMzIwLjA5IDQwOC4wOTQgMzE5LjQ0OSA0MDcuMDYyIDMxOSA0MDYuMDkgY3VydmV0bworMzE2LjMxMiA0MDAuMzQ0IDMyMC4xNDEgMzk0LjUzNSAzMjUuNzE5IDM5NC41MzUgY3VydmV0bworMzI4LjA0MyAzOTQuNTM1IDMzMS4wMzUgMzk1Ljg0IDMzMi4yNDIgMzk4LjQyMiBjdXJ2ZXRvCiszMzMuOTQ5IDQwMi4wNzQgMzI3Ljg2NyA0MDguNTIgMzI0LjQ2OSA0MDguNTIgY3VydmV0bworIGNsb3NlcGF0aCBmaWxsCituZXdwYXRoIDMzMi41OSAzOTEuMjYyIG1vdmV0bworMzMxLjA2MiAzODcuOTkyIDMyOC4yMTEgMzg2LjE5NSAzMjUuMDA0IDM4Ni4xOTUgY3VydmV0bworMzE0LjgyNCAzODYuMTk1IDMxMi44MDUgMzk1LjU3IDMxNy4yMTUgNDA1LjAxMiBjdXJ2ZXRvCiszMTguMjU4IDQwNy4yMzggMzE5Ljk2OSA0MDkuNzAzIDMyMi41NzggNDA5LjcwMyBjdXJ2ZXRvCiszMzAuNzU4IDQwOS43MDMgMzM2LjQ1MyAzOTkuNTMxIDMzMi41OSAzOTEuMjYyIGN1cnZldG8KKyBjbG9zZXBhdGggc3Ryb2tlCituZXdwYXRoIDMyNC40NjkgNDA4LjUyIG1vdmV0bworMzIzLjcxNSA0MDguNTIgMzIzLjA1OSA0MDguMjQ2IDMyMi42OTUgNDA3LjQ3NyBjdXJ2ZXRvCiszMjEuOTA2IDQwNS43ODEgMzI2LjIxMSA0MDQuMjcgMzI2LjIxOSA0MDIuNTE2IGN1cnZldG8KKzMyNS43NyA0MDEuOTggMzI0LjUwOCA0MDEuMzc5IDMyMy45NjEgNDAxLjM3OSBjdXJ2ZXRvCiszMjAuODU5IDQwMS4zNzkgMzE4LjUxNiA0MDUuNjI1IDMyMS4xNjQgNDA4Ljc4MSBjdXJ2ZXRvCiszMjAuMDkgNDA4LjA5NCAzMTkuNDQ5IDQwNy4wNjIgMzE5IDQwNi4wOSBjdXJ2ZXRvCiszMTYuMzEyIDQwMC4zNDQgMzIwLjE0MSAzOTQuNTM1IDMyNS43MTkgMzk0LjUzNSBjdXJ2ZXRvCiszMjguMDQzIDM5NC41MzUgMzMxLjAzNSAzOTUuODQgMzMyLjI0MiAzOTguNDIyIGN1cnZldG8KKzMzMy45NDkgNDAyLjA3NCAzMjcuODY3IDQwOC41MiAzMjQuNDY5IDQwOC41MiBjdXJ2ZXRvCisgY2xvc2VwYXRoIHN0cm9rZQorbmV3cGF0aCAzNDMuMTIxIDQwOC41NzQgbW92ZXRvCiszNTEuODkxIDQwOC41NzQgMzU2LjM1MiAzOTIuMzE2IDM1Mi40MyAzODMuOTMgY3VydmV0bworMzUxLjY4IDM4Mi4zMjQgMzUwLjI4NSAzODAuNzIzIDM0OC40NDEgMzgwLjcyMyBjdXJ2ZXRvCiszMzguNDE4IDM4MC43MjMgMzQwLjk3NyA0MDAuODQ4IDMzNS4zMzIgNDA2LjU2MiBjdXJ2ZXRvCiszMzUuODUyIDQwNy4xMTcgMzM2LjM0NCA0MDcuNjk1IDMzNi43OTcgNDA4LjI3NyBjdXJ2ZXRvCiszNDAuNjA5IDQwMy43NTggMzM4LjcxNSAzOTEuODY3IDM0Ni44NTkgMzkxLjg2NyBjdXJ2ZXRvCiszNDguNzM0IDM5MS44NjcgMzUwLjE1NiAzOTMuNTIzIDM1MC45MSAzOTUuMTQ1IGN1cnZldG8KKzM1Mi45MzQgMzk5LjQ3MyAzNDkuMTkxIDQwNi45ODQgMzQ1LjA5OCA0MDYuOTg0IGN1cnZldG8KKzM0NS4wNTUgNDA2Ljk4NCAzNDQuNDY1IDQwNi45NjEgMzQ0LjQ4IDQwNi43MTkgY3VydmV0bworMzQ0LjYyOSA0MDMuOTU3IDM0Ni43ODEgNDA1LjY4IDM0NC42MTcgNDAwLjk4IGN1cnZldG8KKzM0Mi40MDIgNDAxLjQyNiAzNDAuMDU5IDQwNS4wMTYgMzQxLjI2NiA0MDcuNjA1IGN1cnZldG8KKzM0MS42MjUgNDA4LjM2MyAzNDIuNTE2IDQwOC41NzQgMzQzLjEyMSA0MDguNTc0IGN1cnZldG8KKyBjbG9zZXBhdGggZmlsbAorbmV3cGF0aCAzNDMuMTIxIDQwOC41NzQgbW92ZXRvCiszNTEuODkxIDQwOC41NzQgMzU2LjM1MiAzOTIuMzE2IDM1Mi40MyAzODMuOTMgY3VydmV0bworMzUxLjY4IDM4Mi4zMjQgMzUwLjI4NSAzODAuNzIzIDM0OC40NDEgMzgwLjcyMyBjdXJ2ZXRvCiszMzguNDE4IDM4MC43MjMgMzQwLjk3NyA0MDAuODQ4IDMzNS4zMzIgNDA2LjU2MiBjdXJ2ZXRvCiszMzUuODUyIDQwNy4xMTcgMzM2LjM0NCA0MDcuNjk1IDMzNi43OTcgNDA4LjI3NyBjdXJ2ZXRvCiszNDAuNjA5IDQwMy43NTggMzM4LjcxNSAzOTEuODY3IDM0Ni44NTkgMzkxLjg2NyBjdXJ2ZXRvCiszNDguNzM0IDM5MS44NjcgMzUwLjE1NiAzOTMuNTIzIDM1MC45MSAzOTUuMTQ1IGN1cnZldG8KKzM1Mi45MzQgMzk5LjQ3MyAzNDkuMTkxIDQwNi45ODQgMzQ1LjA5OCA0MDYuOTg0IGN1cnZldG8KKzM0NS4wNTUgNDA2Ljk4NCAzNDQuNDY1IDQwNi45NjEgMzQ0LjQ4IDQwNi43MTkgY3VydmV0bworMzQ0LjYyOSA0MDMuOTU3IDM0Ni43ODEgNDA1LjY4IDM0NC42MTcgNDAwLjk4IGN1cnZldG8KKzM0Mi40MDIgNDAxLjQyNiAzNDAuMDU5IDQwNS4wMTYgMzQxLjI2NiA0MDcuNjA1IGN1cnZldG8KKzM0MS42MjUgNDA4LjM2MyAzNDIuNTE2IDQwOC41NzQgMzQzLjEyMSA0MDguNTc0IGN1cnZldG8KKyBjbG9zZXBhdGggc3Ryb2tlCituZXdwYXRoIDM2NC45MzggNDA4Ljc1OCBtb3ZldG8KKzM2NS43NjIgNDA4LjY4IDM2Ny4wMDQgNDA4Ljc1NCAzNjcuNzExIDQwOC41MzUgY3VydmV0bworMzY3Ljg0OCA0MDguNDk2IDM2Ny43NDYgNDA4LjMyOCAzNjcuNzY2IDQwOC4xOTUgY3VydmV0bworMzY3Ljk4NCA0MDYuOTY1IDM2OC4zMiA0MDUuODAxIDM2OC42MTcgNDA0LjYxMyBjdXJ2ZXRvCiszNjkuNzU4IDM5OS45ODggMzcwLjQ0NSAzOTUuMjM4IDM3MS43NTggMzkwLjY1MiBjdXJ2ZXRvCiszNzMuMTg0IDM4NS42NiAzNzQuNjcyIDM4MC4wMzUgMzcyLjk0NSAzNzMuNzcgY3VydmV0bworMzcyLjc3NyAzNzMuMTU2IDM3Mi41NTEgMzcyLjUzNSAzNzIuMjU4IDM3MS45MSBjdXJ2ZXRvCiszNzAuMzAxIDM2Ny43MTkgMzY1LjI2MiAzNjMuNzMgMzYwLjg1OSAzNjMuNzMgY3VydmV0bworMzYwLjMyIDM2My43MyAzNTkuNzQ2IDM2My44ODMgMzU5LjQ4OCAzNjQuMjM0IGN1cnZldG8KKzM2MS4zNDggMzY1LjQyNiAzNjIuNTEyIDM2Ni42NDggMzYzLjM0NCAzNjguNDI2IGN1cnZldG8KKzM2NC4zMzYgMzcwLjU1OSAzNjQuMzIgMzcyLjU1MSAzNjQuMTkxIDM3NC4zODcgY3VydmV0bworMzY0LjU0MyAzNzQuMTg0IDM2NS42NzIgMzczLjY2NCAzNjYuMTQxIDM3My42NjQgY3VydmV0bworMzY4LjA0NyAzNzMuNjY0IDM2OS42ODQgMzc1LjUyMyAzNzAuNDQ1IDM3Ny4xNiBjdXJ2ZXRvCiszNzEuODUyIDM4MC4xNjQgMzcxLjYxMyAzODMuMjMgMzcxLjM2NyAzODUuNzg5IGN1cnZldG8KKzM3MS4yNDYgMzg3LjA2NiAzNzEuMDc0IDM4OC4zMjggMzcwLjg0IDM4OS41NTkgY3VydmV0bworMzcwLjQ4IDM5MS4zMzIgbGluZXRvCiszNzAuNDM4IDM5MS41MzEgbGluZXRvCiszNzAuMzkxIDM5MS43MjMgbGluZXRvCiszNzAuNjA1IDM5MS43MjMgMzcwLjQxNCAzOTEuMzQ4IDM3MC40MjIgMzkxLjE1NiBjdXJ2ZXRvCiszNzAuNTU1IDM4OC4wNTkgMzcwLjUgMzgzLjczOCAzNjguODUyIDM4MC4yMTEgY3VydmV0bworMzY4LjA4NiAzNzguNTc0IDM2Ni44MzIgMzc2Ljg4NyAzNjQuOTEgMzc2Ljg4NyBjdXJ2ZXRvCiszNTYuNDg4IDM3Ni44ODcgMzYwLjcyMyA0MDEuMDE2IDM1My45NzMgNDA2Ljc1IGN1cnZldG8KKzM1NC4zNDggNDA3LjM3NSAzNTQuNjggNDA4LjAxNiAzNTQuOTYxIDQwOC42NDUgY3VydmV0bworMzU4Ljk1MyA0MDMuNzczIDM1OS4xNjQgMzkwLjM0IDM2NS4wNDcgMzkwLjM0IGN1cnZldG8KKzM2Ni40NzMgMzkwLjM0IDM2Ny45NDUgMzkxLjY5MSAzNjguNTU1IDM5Mi45ODggY3VydmV0bworMzcxLjE2OCAzOTguNTc4IDM2Ni44MjQgNDA1LjA4NiAzNjQuOTM4IDQwOC43NTggY3VydmV0bworIGNsb3NlcGF0aCBmaWxsCituZXdwYXRoIDM2NC45MzggNDA4Ljc1OCBtb3ZldG8KKzM2NS43NjIgNDA4LjY4IDM2Ny4wMDQgNDA4Ljc1NCAzNjcuNzExIDQwOC41MzUgY3VydmV0bworMzY3Ljg0OCA0MDguNDk2IDM2Ny43NDYgNDA4LjMyOCAzNjcuNzY2IDQwOC4xOTUgY3VydmV0bworMzY3Ljk4NCA0MDYuOTY1IDM2OC4zMiA0MDUuODAxIDM2OC42MTcgNDA0LjYxMyBjdXJ2ZXRvCiszNjkuNzU4IDM5OS45ODggMzcwLjQ0NSAzOTUuMjM4IDM3MS43NTggMzkwLjY1MiBjdXJ2ZXRvCiszNzMuMTg0IDM4NS42NiAzNzQuNjcyIDM4MC4wMzUgMzcyLjk0NSAzNzMuNzcgY3VydmV0bworMzcyLjc3NyAzNzMuMTU2IDM3Mi41NTEgMzcyLjUzNSAzNzIuMjU4IDM3MS45MSBjdXJ2ZXRvCiszNzAuMzAxIDM2Ny43MTkgMzY1LjI2MiAzNjMuNzMgMzYwLjg1OSAzNjMuNzMgY3VydmV0bworMzYwLjMyIDM2My43MyAzNTkuNzQ2IDM2My44ODMgMzU5LjQ4OCAzNjQuMjM0IGN1cnZldG8KKzM2MS4zNDggMzY1LjQyNiAzNjIuNTEyIDM2Ni42NDggMzYzLjM0NCAzNjguNDI2IGN1cnZldG8KKzM2NC4zMzYgMzcwLjU1OSAzNjQuMzIgMzcyLjU1MSAzNjQuMTkxIDM3NC4zODcgY3VydmV0bworMzY0LjU0MyAzNzQuMTg0IDM2NS42NzIgMzczLjY2NCAzNjYuMTQxIDM3My42NjQgY3VydmV0bworMzY4LjA0NyAzNzMuNjY0IDM2OS42ODQgMzc1LjUyMyAzNzAuNDQ1IDM3Ny4xNiBjdXJ2ZXRvCiszNzEuODUyIDM4MC4xNjQgMzcxLjYxMyAzODMuMjMgMzcxLjM2NyAzODUuNzg5IGN1cnZldG8KKzM3MS4yNDYgMzg3LjA2NiAzNzEuMDc0IDM4OC4zMjggMzcwLjg0IDM4OS41NTkgY3VydmV0bworMzcwLjQ4IDM5MS4zMzIgbGluZXRvCiszNzAuNDM4IDM5MS41MzEgbGluZXRvCiszNzAuMzkxIDM5MS43MjMgbGluZXRvCiszNzAuNjA1IDM5MS43MjMgMzcwLjQxNCAzOTEuMzQ4IDM3MC40MjIgMzkxLjE1NiBjdXJ2ZXRvCiszNzAuNTU1IDM4OC4wNTkgMzcwLjUgMzgzLjczOCAzNjguODUyIDM4MC4yMTEgY3VydmV0bworMzY4LjA4NiAzNzguNTc0IDM2Ni44MzIgMzc2Ljg4NyAzNjQuOTEgMzc2Ljg4NyBjdXJ2ZXRvCiszNTYuNDg4IDM3Ni44ODcgMzYwLjcyMyA0MDEuMDE2IDM1My45NzMgNDA2Ljc1IGN1cnZldG8KKzM1NC4zNDggNDA3LjM3NSAzNTQuNjggNDA4LjAxNiAzNTQuOTYxIDQwOC42NDUgY3VydmV0bworMzU4Ljk1MyA0MDMuNzczIDM1OS4xNjQgMzkwLjM0IDM2NS4wNDcgMzkwLjM0IGN1cnZldG8KKzM2Ni40NzMgMzkwLjM0IDM2Ny45NDUgMzkxLjY5MSAzNjguNTU1IDM5Mi45ODggY3VydmV0bworMzcxLjE2OCAzOTguNTc4IDM2Ni44MjQgNDA1LjA4NiAzNjQuOTM4IDQwOC43NTggY3VydmV0bworIGNsb3NlcGF0aCBzdHJva2UKK25ld3BhdGggMjYxLjE3NiA0MjguNDY5IG1vdmV0bworMjY2Ljk2OSA0MjguNDY5IDI2My41OTQgNDEzLjg0OCAyNjEuNTMxIDQwOS40MzggY3VydmV0bworMjU5Ljc3IDQwNS42NjQgMjU1Ljc5NyA0MDAuMjE5IDI1MS4wODYgNDAwLjIxOSBjdXJ2ZXRvCisyNDUuNDQxIDQwMC4yMTkgMjQ1LjYwOSA0MDYuNjA1IDI0Ny44NTUgNDExLjQxOCBjdXJ2ZXRvCisyNDkuMDc0IDQxNC4wMiAyNTAuOTQ1IDQxNi45NDEgMjUzLjUyIDQxOS4wODYgY3VydmV0bworMjUyLjg2MyA0MTYuODQ4IDI1NS4wOTQgNDE1LjMxNiAyNTQuMTkxIDQxMy4zODcgY3VydmV0bworMjUzLjU3NCA0MTIuMDY2IDI1Mi4zMDEgNDEwLjYyOSAyNTEuNjM3IDQwOS4yMTEgY3VydmV0bworMjUwLjU2NiA0MDYuOTE4IDI1MC45NzMgNDAyLjg1MiAyNTMuNTYyIDQwMi44NTIgY3VydmV0bworMjU1Ljg3OSA0MDIuODUyIDI1Ny45MzggNDA1Ljc1IDI1OC43ODUgNDA3LjU1NSBjdXJ2ZXRvCisyNjAuNTEyIDQxMS4yNTQgMjY0LjgzNiA0MjcuMDQzIDI2MC4wMDQgNDI3LjA0MyBjdXJ2ZXRvCisyNTQuNDM4IDQyNy4wNDMgMjQ0Ljg0NCA0MTMuMzQ0IDI0Mi44MzYgNDA5LjA0NyBjdXJ2ZXRvCisyMzkuMjUgNDAxLjM3NSAyNDEuODUyIDM5MS45MyAyNTAuMDIgMzkxLjkzIGN1cnZldG8KKzI1NS41MzkgMzkxLjkzIDI2MC4wNzggMzk3LjI4OSAyNjIuMjcgNDAxLjk4IGN1cnZldG8KKzI2My41NzggNDA0Ljc3MyAyNjQuMjg5IDQwNy41NTUgMjY0LjU3IDQxMC4xNzYgY3VydmV0bworMjY1LjY0MSA0MTAuMzc1IGxpbmV0bworMjY1Ljg3OSA0MDMuMTU2IDI3My40MzggMzkxLjIwNyAyNzAuMjE5IDM4NC4zMiBjdXJ2ZXRvCisyNjYuMTAyIDM3NS41MDggMjUzLjc4NSAzNzUuNTg2IDI0Ni43NTQgMzcyLjQ2MSBjdXJ2ZXRvCisyNDUuMjczIDM3NS45NTMgMjQzLjI3MyAzNzkuMTk5IDI0MC40NTMgMzgxLjY4IGN1cnZldG8KKzI0Ni43MjcgMzgzLjgwOSAyNjIuMTM3IDM4Ny4zODcgMjY1LjQ5MiAzOTQuNTU5IGN1cnZldG8KKzI2Ni44OTggMzk3LjU3IDI2NS45NDEgNDAyLjU2NiAyNjQuMzEyIDQwNC4yNTggY3VydmV0bworMjY0LjAzNSA0MDMuMTk1IDI2My42NTIgNDAyLjEwOSAyNjMuMTQ1IDQwMS4wMiBjdXJ2ZXRvCisyNjAuMjczIDM5NC44ODMgMjU0LjEyOSAzOTAuMTIxIDI0Ny43OTMgMzkwLjEyMSBjdXJ2ZXRvCisyMzguOTc3IDM5MC4xMjEgMjM1LjIzOCAzOTYuNTIgMjM5LjM4NyA0MDUuMzk4IGN1cnZldG8KKzI0MS44NzkgNDEwLjczIDI1NC41OTggNDI4LjQ2OSAyNjEuMTc2IDQyOC40NjkgY3VydmV0bworIGNsb3NlcGF0aCBmaWxsCisgMCA5Ljc1MzQgZHRyYW5zZm9ybSB0cnVuY2F0ZSBpZHRyYW5zZm9ybSBzZXRsaW5ld2lkdGggcG9wIDEgc2V0bGluZWpvaW4KK25ld3BhdGggMjYxLjE3NiA0MjguNDY5IG1vdmV0bworMjY2Ljk2OSA0MjguNDY5IDI2My41OTQgNDEzLjg0OCAyNjEuNTMxIDQwOS40MzggY3VydmV0bworMjU5Ljc3IDQwNS42NjQgMjU1Ljc5NyA0MDAuMjE5IDI1MS4wODYgNDAwLjIxOSBjdXJ2ZXRvCisyNDUuNDQxIDQwMC4yMTkgMjQ1LjYwOSA0MDYuNjA1IDI0Ny44NTUgNDExLjQxOCBjdXJ2ZXRvCisyNDkuMDc0IDQxNC4wMiAyNTAuOTQ1IDQxNi45NDEgMjUzLjUyIDQxOS4wODYgY3VydmV0bworMjUyLjg2MyA0MTYuODQ4IDI1NS4wOTQgNDE1LjMxNiAyNTQuMTkxIDQxMy4zODcgY3VydmV0bworMjUzLjU3NCA0MTIuMDY2IDI1Mi4zMDEgNDEwLjYyOSAyNTEuNjM3IDQwOS4yMTEgY3VydmV0bworMjUwLjU2NiA0MDYuOTE4IDI1MC45NzMgNDAyLjg1MiAyNTMuNTYyIDQwMi44NTIgY3VydmV0bworMjU1Ljg3OSA0MDIuODUyIDI1Ny45MzggNDA1Ljc1IDI1OC43ODUgNDA3LjU1NSBjdXJ2ZXRvCisyNjAuNTEyIDQxMS4yNTQgMjY0LjgzNiA0MjcuMDQzIDI2MC4wMDQgNDI3LjA0MyBjdXJ2ZXRvCisyNTQuNDM4IDQyNy4wNDMgMjQ0Ljg0NCA0MTMuMzQ0IDI0Mi44MzYgNDA5LjA0NyBjdXJ2ZXRvCisyMzkuMjUgNDAxLjM3NSAyNDEuODUyIDM5MS45MyAyNTAuMDIgMzkxLjkzIGN1cnZldG8KKzI1NS41MzkgMzkxLjkzIDI2MC4wNzggMzk3LjI4OSAyNjIuMjcgNDAxLjk4IGN1cnZldG8KKzI2My41NzggNDA0Ljc3MyAyNjQuMjg5IDQwNy41NTUgMjY0LjU3IDQxMC4xNzYgY3VydmV0bworMjY1LjY0MSA0MTAuMzc1IGxpbmV0bworMjY1Ljg3OSA0MDMuMTU2IDI3My40MzggMzkxLjIwNyAyNzAuMjE5IDM4NC4zMiBjdXJ2ZXRvCisyNjYuMTAyIDM3NS41MDggMjUzLjc4NSAzNzUuNTg2IDI0Ni43NTQgMzcyLjQ2MSBjdXJ2ZXRvCisyNDUuMjczIDM3NS45NTMgMjQzLjI3MyAzNzkuMTk5IDI0MC40NTMgMzgxLjY4IGN1cnZldG8KKzI0Ni43MjcgMzgzLjgwOSAyNjIuMTM3IDM4Ny4zODcgMjY1LjQ5MiAzOTQuNTU5IGN1cnZldG8KKzI2Ni44OTggMzk3LjU3IDI2NS45NDEgNDAyLjU2NiAyNjQuMzEyIDQwNC4yNTggY3VydmV0bworMjY0LjAzNSA0MDMuMTk1IDI2My42NTIgNDAyLjEwOSAyNjMuMTQ1IDQwMS4wMiBjdXJ2ZXRvCisyNjAuMjczIDM5NC44ODMgMjU0LjEyOSAzOTAuMTIxIDI0Ny43OTMgMzkwLjEyMSBjdXJ2ZXRvCisyMzguOTc3IDM5MC4xMjEgMjM1LjIzOCAzOTYuNTIgMjM5LjM4NyA0MDUuMzk4IGN1cnZldG8KKzI0MS44NzkgNDEwLjczIDI1NC41OTggNDI4LjQ2OSAyNjEuMTc2IDQyOC40NjkgY3VydmV0bworIGNsb3NlcGF0aCBzdHJva2UKK25ld3BhdGggMjc2LjI0MiA0MDcuMzA1IG1vdmV0bworMjc2LjU5NCA0MDYuNDM0IDI3Ny42MDkgNDAxLjUxMiAyNzguMzc5IDQwMS41MTIgY3VydmV0bworMjgwLjAzOSA0MDEuNTEyIDI4My4wMzkgNDA2LjA3OCAyODMuODQ4IDQwNy4yNjIgY3VydmV0bworMjg1LjMyNCA0MDYuMjg1IDI4NC41MDQgNDA0LjIzNCAyODcuMjQyIDQwNC4yMzQgY3VydmV0bworMjg4LjQ4IDQwNC4yMzQgMjg5LjEwNSA0MDYuOTMgMjkwLjM5NSA0MDYuOTczIGN1cnZldG8KKzI5MC40NDEgNDA1Ljg4MyAyOTAuNTA4IDQwNC44OTggMjg5LjkyMiA0MDMuNjQxIGN1cnZldG8KKzI4OS4wMTIgNDAxLjY5OSAyODYuNzE5IDM5OS4wNjYgMjg0LjQ2MSAzOTkuMDY2IGN1cnZldG8KKzI4Mi44NDQgMzk5LjA2NiAyODAuNTk0IDQwMS4wMzEgMjgwLjE1MiA0MDEuMDMxIGN1cnZldG8KKzI3OS42NzIgNDAxLjAzMSAyNzguNzg5IDQwMC44MDUgMjc4LjUwOCA0MDAuMjAzIGN1cnZldG8KKzI3Ny4zMzIgMzk3LjY5MSAyODAuNDc3IDM4OS4yOTcgMjgzLjYyNSAzODkuMjk3IGN1cnZldG8KKzI4NS4zMDkgMzg5LjI5NyAyODcuMzE2IDM5MC41NDMgMjg5LjA3OCAzOTEuMzEyIGN1cnZldG8KKzI4OC42MjEgMzg4LjI4OSAyODguNTU5IDM4NS43MzggMjg5LjE2NCAzODMuMTMzIGN1cnZldG8KKzI4Ny41NTkgMzgyLjEwOSAyODUuNjggMzgxLjY3NiAyODQuMTcyIDM4MS42NzYgY3VydmV0bworMjc2LjQzIDM4MS42NzYgMjgwLjY5OSAzOTkuODU5IDI3My41NTkgNDAzLjczNCBjdXJ2ZXRvCisyNzYuMjQyIDQwNy4zMDUgbGluZXRvCisgY2xvc2VwYXRoIGZpbGwKK25ld3BhdGggMjc2LjI0MiA0MDcuMzA1IG1vdmV0bworMjc2LjU5NCA0MDYuNDM0IDI3Ny42MDkgNDAxLjUxMiAyNzguMzc5IDQwMS41MTIgY3VydmV0bworMjgwLjAzOSA0MDEuNTEyIDI4My4wMzkgNDA2LjA3OCAyODMuODQ4IDQwNy4yNjIgY3VydmV0bworMjg1LjMyNCA0MDYuMjg1IDI4NC41MDQgNDA0LjIzNCAyODcuMjQyIDQwNC4yMzQgY3VydmV0bworMjg4LjQ4IDQwNC4yMzQgMjg5LjEwNSA0MDYuOTMgMjkwLjM5NSA0MDYuOTczIGN1cnZldG8KKzI5MC40NDEgNDA1Ljg4MyAyOTAuNTA4IDQwNC44OTggMjg5LjkyMiA0MDMuNjQxIGN1cnZldG8KKzI4OS4wMTIgNDAxLjY5OSAyODYuNzE5IDM5OS4wNjYgMjg0LjQ2MSAzOTkuMDY2IGN1cnZldG8KKzI4Mi44NDQgMzk5LjA2NiAyODAuNTk0IDQwMS4wMzEgMjgwLjE1MiA0MDEuMDMxIGN1cnZldG8KKzI3OS42NzIgNDAxLjAzMSAyNzguNzg5IDQwMC44MDUgMjc4LjUwOCA0MDAuMjAzIGN1cnZldG8KKzI3Ny4zMzIgMzk3LjY5MSAyODAuNDc3IDM4OS4yOTcgMjgzLjYyNSAzODkuMjk3IGN1cnZldG8KKzI4NS4zMDkgMzg5LjI5NyAyODcuMzE2IDM5MC41NDMgMjg5LjA3OCAzOTEuMzEyIGN1cnZldG8KKzI4OC42MjEgMzg4LjI4OSAyODguNTU5IDM4NS43MzggMjg5LjE2NCAzODMuMTMzIGN1cnZldG8KKzI4Ny41NTkgMzgyLjEwOSAyODUuNjggMzgxLjY3NiAyODQuMTcyIDM4MS42NzYgY3VydmV0bworMjc2LjQzIDM4MS42NzYgMjgwLjY5OSAzOTkuODU5IDI3My41NTkgNDAzLjczNCBjdXJ2ZXRvCisyNzYuMjQyIDQwNy4zMDUgbGluZXRvCisgY2xvc2VwYXRoIHN0cm9rZQorbmV3cGF0aCAzMDYgNDA4Ljc2MiBtb3ZldG8KKzMxMS44NTIgNDA4Ljc2MiAzMTQuMTYgMzk4LjEzMyAzMTEuNTM1IDM5Mi41MTYgY3VydmV0bworMzA5LjUgMzg4LjE2IDMwNS44ODcgMzg1IDMwMS4yNjIgMzg1IGN1cnZldG8KKzI5My4wOSAzODUgMjk0LjExMyAzOTYuMjQ2IDI5Ny4zMDEgNDAzLjA2NiBjdXJ2ZXRvCisyOTguMTggNDA0Ljk0NSAzMDEuMTg0IDQwOS4wMzkgMzAzLjUzMSA0MDkuMDM5IGN1cnZldG8KKzMwNC4zOTUgNDA5LjAzOSAzMDUuMTEzIDQwOC43NjIgMzA2IDQwOC43NjIgY3VydmV0bworIGNsb3NlcGF0aCBmaWxsCituZXdwYXRoIDMwNS44MTYgNDA3Ljc3IG1vdmV0bworMzA0Ljg5OCA0MDcuNzcgMzA0LjA4NiA0MDcuMzA5IDMwMy42NiA0MDYuMzk1IGN1cnZldG8KKzMwMi43NjIgNDA0LjQ3NyAzMDcuMjM0IDQwMi41MzUgMzA2LjU5NCA0MDEuMTY0IGN1cnZldG8KKzMwNi4xODggNDAwLjMwMSAzMDQuNjUyIDM5OS40OTIgMzAzLjg3NSAzOTkuNDkyIGN1cnZldG8KKzI5OS45OTYgMzk5LjQ5MiAzMDAuMDMxIDQwNC41ODYgMzAyLjM0IDQwNy45MDYgY3VydmV0bworMzAwLjkwNiA0MDYuOTggMjk5Ljk2MSA0MDUuNTcgMjk5LjM1MiA0MDQuMjU4IGN1cnZldG8KKzI5Ny4wNzggMzk5LjM5OCAyOTguODgzIDM5Mi43MTEgMzA0LjA2NiAzOTIuNzExIGN1cnZldG8KKzMwNi45MzQgMzkyLjcxMSAzMTAuMjMgMzk1LjMxMiAzMTEuNTEyIDM5OC4wNTUgY3VydmV0bworMzEzLjA5NCA0MDEuNDMgMzA5LjA1OSA0MDcuNzcgMzA1LjgxNiA0MDcuNzcgY3VydmV0bworIGNsb3NlcGF0aCBmaWxsCituZXdwYXRoIDMwNiA0MDguNzYyIG1vdmV0bworMzExLjg1MiA0MDguNzYyIDMxNC4xNiAzOTguMTMzIDMxMS41MzUgMzkyLjUxNiBjdXJ2ZXRvCiszMDkuNSAzODguMTYgMzA1Ljg4NyAzODUgMzAxLjI2MiAzODUgY3VydmV0bworMjkzLjA5IDM4NSAyOTQuMTEzIDM5Ni4yNDYgMjk3LjMwMSA0MDMuMDY2IGN1cnZldG8KKzI5OC4xOCA0MDQuOTQ1IDMwMS4xODQgNDA5LjAzOSAzMDMuNTMxIDQwOS4wMzkgY3VydmV0bworMzA0LjM5NSA0MDkuMDM5IDMwNS4xMTMgNDA4Ljc2MiAzMDYgNDA4Ljc2MiBjdXJ2ZXRvCisgY2xvc2VwYXRoIHN0cm9rZQorbmV3cGF0aCAzMDUuODE2IDQwNy43NyBtb3ZldG8KKzMwNC44OTggNDA3Ljc3IDMwNC4wODYgNDA3LjMwOSAzMDMuNjYgNDA2LjM5NSBjdXJ2ZXRvCiszMDIuNzYyIDQwNC40NzcgMzA3LjIzNCA0MDIuNTM1IDMwNi41OTQgNDAxLjE2NCBjdXJ2ZXRvCiszMDYuMTg4IDQwMC4zMDEgMzA0LjY1MiAzOTkuNDkyIDMwMy44NzUgMzk5LjQ5MiBjdXJ2ZXRvCisyOTkuOTk2IDM5OS40OTIgMzAwLjAzMSA0MDQuNTg2IDMwMi4zNCA0MDcuOTA2IGN1cnZldG8KKzMwMC45MDYgNDA2Ljk4IDI5OS45NjEgNDA1LjU3IDI5OS4zNTIgNDA0LjI1OCBjdXJ2ZXRvCisyOTcuMDc4IDM5OS4zOTggMjk4Ljg4MyAzOTIuNzExIDMwNC4wNjYgMzkyLjcxMSBjdXJ2ZXRvCiszMDYuOTM0IDM5Mi43MTEgMzEwLjIzIDM5NS4zMTIgMzExLjUxMiAzOTguMDU1IGN1cnZldG8KKzMxMy4wOTQgNDAxLjQzIDMwOS4wNTkgNDA3Ljc3IDMwNS44MTYgNDA3Ljc3IGN1cnZldG8KKyBjbG9zZXBhdGggc3Ryb2tlCituZXdwYXRoIDMzMi41OSAzOTEuMjYyIG1vdmV0bworMzMxLjA2MiAzODcuOTkyIDMyOC4yMTEgMzg2LjE5NSAzMjUuMDA0IDM4Ni4xOTUgY3VydmV0bworMzE0LjgyNCAzODYuMTk1IDMxMi44MDUgMzk1LjU3IDMxNy4yMTUgNDA1LjAxMiBjdXJ2ZXRvCiszMTguMjU4IDQwNy4yMzggMzE5Ljk2OSA0MDkuNzAzIDMyMi41NzggNDA5LjcwMyBjdXJ2ZXRvCiszMzAuNzU4IDQwOS43MDMgMzM2LjQ1MyAzOTkuNTMxIDMzMi41OSAzOTEuMjYyIGN1cnZldG8KKyBjbG9zZXBhdGggZmlsbAorbmV3cGF0aCAzMjQuNDY5IDQwOC41MiBtb3ZldG8KKzMyMy43MTUgNDA4LjUyIDMyMy4wNTkgNDA4LjI0NiAzMjIuNjk1IDQwNy40NzcgY3VydmV0bworMzIxLjkwNiA0MDUuNzgxIDMyNi4yMTEgNDA0LjI3IDMyNi4yMTkgNDAyLjUxNiBjdXJ2ZXRvCiszMjUuNzcgNDAxLjk4IDMyNC41MDggNDAxLjM3OSAzMjMuOTYxIDQwMS4zNzkgY3VydmV0bworMzIwLjg1OSA0MDEuMzc5IDMxOC41MTYgNDA1LjYyNSAzMjEuMTY0IDQwOC43ODEgY3VydmV0bworMzIwLjA5IDQwOC4wOTQgMzE5LjQ0OSA0MDcuMDYyIDMxOSA0MDYuMDkgY3VydmV0bworMzE2LjMxMiA0MDAuMzQ0IDMyMC4xNDEgMzk0LjUzNSAzMjUuNzE5IDM5NC41MzUgY3VydmV0bworMzI4LjA0MyAzOTQuNTM1IDMzMS4wMzUgMzk1Ljg0IDMzMi4yNDIgMzk4LjQyMiBjdXJ2ZXRvCiszMzMuOTQ5IDQwMi4wNzQgMzI3Ljg2NyA0MDguNTIgMzI0LjQ2OSA0MDguNTIgY3VydmV0bworIGNsb3NlcGF0aCBmaWxsCituZXdwYXRoIDMzMi41OSAzOTEuMjYyIG1vdmV0bworMzMxLjA2MiAzODcuOTkyIDMyOC4yMTEgMzg2LjE5NSAzMjUuMDA0IDM4Ni4xOTUgY3VydmV0bworMzE0LjgyNCAzODYuMTk1IDMxMi44MDUgMzk1LjU3IDMxNy4yMTUgNDA1LjAxMiBjdXJ2ZXRvCiszMTguMjU4IDQwNy4yMzggMzE5Ljk2OSA0MDkuNzAzIDMyMi41NzggNDA5LjcwMyBjdXJ2ZXRvCiszMzAuNzU4IDQwOS43MDMgMzM2LjQ1MyAzOTkuNTMxIDMzMi41OSAzOTEuMjYyIGN1cnZldG8KKyBjbG9zZXBhdGggc3Ryb2tlCituZXdwYXRoIDMyNC40NjkgNDA4LjUyIG1vdmV0bworMzIzLjcxNSA0MDguNTIgMzIzLjA1OSA0MDguMjQ2IDMyMi42OTUgNDA3LjQ3NyBjdXJ2ZXRvCiszMjEuOTA2IDQwNS43ODEgMzI2LjIxMSA0MDQuMjcgMzI2LjIxOSA0MDIuNTE2IGN1cnZldG8KKzMyNS43NyA0MDEuOTggMzI0LjUwOCA0MDEuMzc5IDMyMy45NjEgNDAxLjM3OSBjdXJ2ZXRvCiszMjAuODU5IDQwMS4zNzkgMzE4LjUxNiA0MDUuNjI1IDMyMS4xNjQgNDA4Ljc4MSBjdXJ2ZXRvCiszMjAuMDkgNDA4LjA5NCAzMTkuNDQ5IDQwNy4wNjIgMzE5IDQwNi4wOSBjdXJ2ZXRvCiszMTYuMzEyIDQwMC4zNDQgMzIwLjE0MSAzOTQuNTM1IDMyNS43MTkgMzk0LjUzNSBjdXJ2ZXRvCiszMjguMDQzIDM5NC41MzUgMzMxLjAzNSAzOTUuODQgMzMyLjI0MiAzOTguNDIyIGN1cnZldG8KKzMzMy45NDkgNDAyLjA3NCAzMjcuODY3IDQwOC41MiAzMjQuNDY5IDQwOC41MiBjdXJ2ZXRvCisgY2xvc2VwYXRoIHN0cm9rZQorbmV3cGF0aCAzNDMuMTIxIDQwOC41NzQgbW92ZXRvCiszNTEuODkxIDQwOC41NzQgMzU2LjM1MiAzOTIuMzE2IDM1Mi40MyAzODMuOTMgY3VydmV0bworMzUxLjY4IDM4Mi4zMjQgMzUwLjI4NSAzODAuNzIzIDM0OC40NDEgMzgwLjcyMyBjdXJ2ZXRvCiszMzguNDE4IDM4MC43MjMgMzQwLjk3NyA0MDAuODQ4IDMzNS4zMzIgNDA2LjU2MiBjdXJ2ZXRvCiszMzUuODUyIDQwNy4xMTcgMzM2LjM0NCA0MDcuNjk1IDMzNi43OTcgNDA4LjI3NyBjdXJ2ZXRvCiszNDAuNjA5IDQwMy43NTggMzM4LjcxNSAzOTEuODY3IDM0Ni44NTkgMzkxLjg2NyBjdXJ2ZXRvCiszNDguNzM0IDM5MS44NjcgMzUwLjE1NiAzOTMuNTIzIDM1MC45MSAzOTUuMTQ1IGN1cnZldG8KKzM1Mi45MzQgMzk5LjQ3MyAzNDkuMTkxIDQwNi45ODQgMzQ1LjA5OCA0MDYuOTg0IGN1cnZldG8KKzM0NS4wNTUgNDA2Ljk4NCAzNDQuNDY1IDQwNi45NjEgMzQ0LjQ4IDQwNi43MTkgY3VydmV0bworMzQ0LjYyOSA0MDMuOTU3IDM0Ni43ODEgNDA1LjY4IDM0NC42MTcgNDAwLjk4IGN1cnZldG8KKzM0Mi40MDIgNDAxLjQyNiAzNDAuMDU5IDQwNS4wMTYgMzQxLjI2NiA0MDcuNjA1IGN1cnZldG8KKzM0MS42MjUgNDA4LjM2MyAzNDIuNTE2IDQwOC41NzQgMzQzLjEyMSA0MDguNTc0IGN1cnZldG8KKyBjbG9zZXBhdGggZmlsbAorbmV3cGF0aCAzNDMuMTIxIDQwOC41NzQgbW92ZXRvCiszNTEuODkxIDQwOC41NzQgMzU2LjM1MiAzOTIuMzE2IDM1Mi40MyAzODMuOTMgY3VydmV0bworMzUxLjY4IDM4Mi4zMjQgMzUwLjI4NSAzODAuNzIzIDM0OC40NDEgMzgwLjcyMyBjdXJ2ZXRvCiszMzguNDE4IDM4MC43MjMgMzQwLjk3NyA0MDAuODQ4IDMzNS4zMzIgNDA2LjU2MiBjdXJ2ZXRvCiszMzUuODUyIDQwNy4xMTcgMzM2LjM0NCA0MDcuNjk1IDMzNi43OTcgNDA4LjI3NyBjdXJ2ZXRvCiszNDAuNjA5IDQwMy43NTggMzM4LjcxNSAzOTEuODY3IDM0Ni44NTkgMzkxLjg2NyBjdXJ2ZXRvCiszNDguNzM0IDM5MS44NjcgMzUwLjE1NiAzOTMuNTIzIDM1MC45MSAzOTUuMTQ1IGN1cnZldG8KKzM1Mi45MzQgMzk5LjQ3MyAzNDkuMTkxIDQwNi45ODQgMzQ1LjA5OCA0MDYuOTg0IGN1cnZldG8KKzM0NS4wNTUgNDA2Ljk4NCAzNDQuNDY1IDQwNi45NjEgMzQ0LjQ4IDQwNi43MTkgY3VydmV0bworMzQ0LjYyOSA0MDMuOTU3IDM0Ni43ODEgNDA1LjY4IDM0NC42MTcgNDAwLjk4IGN1cnZldG8KKzM0Mi40MDIgNDAxLjQyNiAzNDAuMDU5IDQwNS4wMTYgMzQxLjI2NiA0MDcuNjA1IGN1cnZldG8KKzM0MS42MjUgNDA4LjM2MyAzNDIuNTE2IDQwOC41NzQgMzQzLjEyMSA0MDguNTc0IGN1cnZldG8KKyBjbG9zZXBhdGggc3Ryb2tlCituZXdwYXRoIDM2NC45MzggNDA4Ljc1OCBtb3ZldG8KKzM2NS43NjIgNDA4LjY4IDM2Ny4wMDQgNDA4Ljc1NCAzNjcuNzExIDQwOC41MzUgY3VydmV0bworMzY3Ljg0OCA0MDguNDk2IDM2Ny43NDYgNDA4LjMyOCAzNjcuNzY2IDQwOC4xOTUgY3VydmV0bworMzY3Ljk4NCA0MDYuOTY1IDM2OC4zMiA0MDUuODAxIDM2OC42MTcgNDA0LjYxMyBjdXJ2ZXRvCiszNjkuNzU4IDM5OS45ODggMzcwLjQ0NSAzOTUuMjM4IDM3MS43NTggMzkwLjY1MiBjdXJ2ZXRvCiszNzMuMTg0IDM4NS42NiAzNzQuNjcyIDM4MC4wMzUgMzcyLjk0NSAzNzMuNzcgY3VydmV0bworMzcyLjc3NyAzNzMuMTU2IDM3Mi41NTEgMzcyLjUzNSAzNzIuMjU4IDM3MS45MSBjdXJ2ZXRvCiszNzAuMzAxIDM2Ny43MTkgMzY1LjI2MiAzNjMuNzMgMzYwLjg1OSAzNjMuNzMgY3VydmV0bworMzYwLjMyIDM2My43MyAzNTkuNzQ2IDM2My44ODMgMzU5LjQ4OCAzNjQuMjM0IGN1cnZldG8KKzM2MS4zNDggMzY1LjQyNiAzNjIuNTEyIDM2Ni42NDggMzYzLjM0NCAzNjguNDI2IGN1cnZldG8KKzM2NC4zMzYgMzcwLjU1OSAzNjQuMzIgMzcyLjU1MSAzNjQuMTkxIDM3NC4zODcgY3VydmV0bworMzY0LjU0MyAzNzQuMTg0IDM2NS42NzIgMzczLjY2NCAzNjYuMTQxIDM3My42NjQgY3VydmV0bworMzY4LjA0NyAzNzMuNjY0IDM2OS42ODQgMzc1LjUyMyAzNzAuNDQ1IDM3Ny4xNiBjdXJ2ZXRvCiszNzEuODUyIDM4MC4xNjQgMzcxLjYxMyAzODMuMjMgMzcxLjM2NyAzODUuNzg5IGN1cnZldG8KKzM3MS4yNDYgMzg3LjA2NiAzNzEuMDc0IDM4OC4zMjggMzcwLjg0IDM4OS41NTkgY3VydmV0bworMzcwLjQ4IDM5MS4zMzIgbGluZXRvCiszNzAuNDM4IDM5MS41MzEgbGluZXRvCiszNzAuMzkxIDM5MS43MjMgbGluZXRvCiszNzAuNjA1IDM5MS43MjMgMzcwLjQxNCAzOTEuMzQ4IDM3MC40MjIgMzkxLjE1NiBjdXJ2ZXRvCiszNzAuNTU1IDM4OC4wNTkgMzcwLjUgMzgzLjczOCAzNjguODUyIDM4MC4yMTEgY3VydmV0bworMzY4LjA4NiAzNzguNTc0IDM2Ni44MzIgMzc2Ljg4NyAzNjQuOTEgMzc2Ljg4NyBjdXJ2ZXRvCiszNTYuNDg4IDM3Ni44ODcgMzYwLjcyMyA0MDEuMDE2IDM1My45NzMgNDA2Ljc1IGN1cnZldG8KKzM1NC4zNDggNDA3LjM3NSAzNTQuNjggNDA4LjAxNiAzNTQuOTYxIDQwOC42NDUgY3VydmV0bworMzU4Ljk1MyA0MDMuNzczIDM1OS4xNjQgMzkwLjM0IDM2NS4wNDcgMzkwLjM0IGN1cnZldG8KKzM2Ni40NzMgMzkwLjM0IDM2Ny45NDUgMzkxLjY5MSAzNjguNTU1IDM5Mi45ODggY3VydmV0bworMzcxLjE2OCAzOTguNTc4IDM2Ni44MjQgNDA1LjA4NiAzNjQuOTM4IDQwOC43NTggY3VydmV0bworIGNsb3NlcGF0aCBmaWxsCituZXdwYXRoIDM2NC45MzggNDA4Ljc1OCBtb3ZldG8KKzM2NS43NjIgNDA4LjY4IDM2Ny4wMDQgNDA4Ljc1NCAzNjcuNzExIDQwOC41MzUgY3VydmV0bworMzY3Ljg0OCA0MDguNDk2IDM2Ny43NDYgNDA4LjMyOCAzNjcuNzY2IDQwOC4xOTUgY3VydmV0bworMzY3Ljk4NCA0MDYuOTY1IDM2OC4zMiA0MDUuODAxIDM2OC42MTcgNDA0LjYxMyBjdXJ2ZXRvCiszNjkuNzU4IDM5OS45ODggMzcwLjQ0NSAzOTUuMjM4IDM3MS43NTggMzkwLjY1MiBjdXJ2ZXRvCiszNzMuMTg0IDM4NS42NiAzNzQuNjcyIDM4MC4wMzUgMzcyLjk0NSAzNzMuNzcgY3VydmV0bworMzcyLjc3NyAzNzMuMTU2IDM3Mi41NTEgMzcyLjUzNSAzNzIuMjU4IDM3MS45MSBjdXJ2ZXRvCiszNzAuMzAxIDM2Ny43MTkgMzY1LjI2MiAzNjMuNzMgMzYwLjg1OSAzNjMuNzMgY3VydmV0bworMzYwLjMyIDM2My43MyAzNTkuNzQ2IDM2My44ODMgMzU5LjQ4OCAzNjQuMjM0IGN1cnZldG8KKzM2MS4zNDggMzY1LjQyNiAzNjIuNTEyIDM2Ni42NDggMzYzLjM0NCAzNjguNDI2IGN1cnZldG8KKzM2NC4zMzYgMzcwLjU1OSAzNjQuMzIgMzcyLjU1MSAzNjQuMTkxIDM3NC4zODcgY3VydmV0bworMzY0LjU0MyAzNzQuMTg0IDM2NS42NzIgMzczLjY2NCAzNjYuMTQxIDM3My42NjQgY3VydmV0bworMzY4LjA0NyAzNzMuNjY0IDM2OS42ODQgMzc1LjUyMyAzNzAuNDQ1IDM3Ny4xNiBjdXJ2ZXRvCiszNzEuODUyIDM4MC4xNjQgMzcxLjYxMyAzODMuMjMgMzcxLjM2NyAzODUuNzg5IGN1cnZldG8KKzM3MS4yNDYgMzg3LjA2NiAzNzEuMDc0IDM4OC4zMjggMzcwLjg0IDM4OS41NTkgY3VydmV0bworMzcwLjQ4IDM5MS4zMzIgbGluZXRvCiszNzAuNDM4IDM5MS41MzEgbGluZXRvCiszNzAuMzkxIDM5MS43MjMgbGluZXRvCiszNzAuNjA1IDM5MS43MjMgMzcwLjQxNCAzOTEuMzQ4IDM3MC40MjIgMzkxLjE1NiBjdXJ2ZXRvCiszNzAuNTU1IDM4OC4wNTkgMzcwLjUgMzgzLjczOCAzNjguODUyIDM4MC4yMTEgY3VydmV0bworMzY4LjA4NiAzNzguNTc0IDM2Ni44MzIgMzc2Ljg4NyAzNjQuOTEgMzc2Ljg4NyBjdXJ2ZXRvCiszNTYuNDg4IDM3Ni44ODcgMzYwLjcyMyA0MDEuMDE2IDM1My45NzMgNDA2Ljc1IGN1cnZldG8KKzM1NC4zNDggNDA3LjM3NSAzNTQuNjggNDA4LjAxNiAzNTQuOTYxIDQwOC42NDUgY3VydmV0bworMzU4Ljk1MyA0MDMuNzczIDM1OS4xNjQgMzkwLjM0IDM2NS4wNDcgMzkwLjM0IGN1cnZldG8KKzM2Ni40NzMgMzkwLjM0IDM2Ny45NDUgMzkxLjY5MSAzNjguNTU1IDM5Mi45ODggY3VydmV0bworMzcxLjE2OCAzOTguNTc4IDM2Ni44MjQgNDA1LjA4NiAzNjQuOTM4IDQwOC43NTggY3VydmV0bworIGNsb3NlcGF0aCBzdHJva2UKKyAxIHNldGdyYXkKK25ld3BhdGggMjYxLjE3NiA0MjguNDY5IG1vdmV0bworMjY2Ljk2OSA0MjguNDY5IDI2My41OTQgNDEzLjg0OCAyNjEuNTMxIDQwOS40MzggY3VydmV0bworMjU5Ljc3IDQwNS42NjQgMjU1Ljc5NyA0MDAuMjE5IDI1MS4wODYgNDAwLjIxOSBjdXJ2ZXRvCisyNDUuNDQxIDQwMC4yMTkgMjQ1LjYwOSA0MDYuNjA1IDI0Ny44NTUgNDExLjQxOCBjdXJ2ZXRvCisyNDkuMDc0IDQxNC4wMiAyNTAuOTQ1IDQxNi45NDEgMjUzLjUyIDQxOS4wODYgY3VydmV0bworMjUyLjg2MyA0MTYuODQ4IDI1NS4wOTQgNDE1LjMxNiAyNTQuMTkxIDQxMy4zODcgY3VydmV0bworMjUzLjU3NCA0MTIuMDY2IDI1Mi4zMDEgNDEwLjYyOSAyNTEuNjM3IDQwOS4yMTEgY3VydmV0bworMjUwLjU2NiA0MDYuOTE4IDI1MC45NzMgNDAyLjg1MiAyNTMuNTYyIDQwMi44NTIgY3VydmV0bworMjU1Ljg3OSA0MDIuODUyIDI1Ny45MzggNDA1Ljc1IDI1OC43ODUgNDA3LjU1NSBjdXJ2ZXRvCisyNjAuNTEyIDQxMS4yNTQgMjY0LjgzNiA0MjcuMDQzIDI2MC4wMDQgNDI3LjA0MyBjdXJ2ZXRvCisyNTQuNDM4IDQyNy4wNDMgMjQ0Ljg0NCA0MTMuMzQ0IDI0Mi44MzYgNDA5LjA0NyBjdXJ2ZXRvCisyMzkuMjUgNDAxLjM3NSAyNDEuODUyIDM5MS45MyAyNTAuMDIgMzkxLjkzIGN1cnZldG8KKzI1NS41MzkgMzkxLjkzIDI2MC4wNzggMzk3LjI4OSAyNjIuMjcgNDAxLjk4IGN1cnZldG8KKzI2My41NzggNDA0Ljc3MyAyNjQuMjg5IDQwNy41NTUgMjY0LjU3IDQxMC4xNzYgY3VydmV0bworMjY1LjY0MSA0MTAuMzc1IGxpbmV0bworMjY1Ljg3OSA0MDMuMTU2IDI3My40MzggMzkxLjIwNyAyNzAuMjE5IDM4NC4zMiBjdXJ2ZXRvCisyNjYuMTAyIDM3NS41MDggMjUzLjc4NSAzNzUuNTg2IDI0Ni43NTQgMzcyLjQ2MSBjdXJ2ZXRvCisyNDUuMjczIDM3NS45NTMgMjQzLjI3MyAzNzkuMTk5IDI0MC40NTMgMzgxLjY4IGN1cnZldG8KKzI0Ni43MjcgMzgzLjgwOSAyNjIuMTM3IDM4Ny4zODcgMjY1LjQ5MiAzOTQuNTU5IGN1cnZldG8KKzI2Ni44OTggMzk3LjU3IDI2NS45NDEgNDAyLjU2NiAyNjQuMzEyIDQwNC4yNTggY3VydmV0bworMjY0LjAzNSA0MDMuMTk1IDI2My42NTIgNDAyLjEwOSAyNjMuMTQ1IDQwMS4wMiBjdXJ2ZXRvCisyNjAuMjczIDM5NC44ODMgMjU0LjEyOSAzOTAuMTIxIDI0Ny43OTMgMzkwLjEyMSBjdXJ2ZXRvCisyMzguOTc3IDM5MC4xMjEgMjM1LjIzOCAzOTYuNTIgMjM5LjM4NyA0MDUuMzk4IGN1cnZldG8KKzI0MS44NzkgNDEwLjczIDI1NC41OTggNDI4LjQ2OSAyNjEuMTc2IDQyOC40NjkgY3VydmV0bworIGNsb3NlcGF0aCBmaWxsCituZXdwYXRoIDI3Ni4yNDIgNDA3LjMwNSBtb3ZldG8KKzI3Ni41OTQgNDA2LjQzNCAyNzcuNjA5IDQwMS41MTIgMjc4LjM3OSA0MDEuNTEyIGN1cnZldG8KKzI4MC4wMzkgNDAxLjUxMiAyODMuMDM5IDQwNi4wNzggMjgzLjg0OCA0MDcuMjYyIGN1cnZldG8KKzI4NS4zMjQgNDA2LjI4NSAyODQuNTA0IDQwNC4yMzQgMjg3LjI0MiA0MDQuMjM0IGN1cnZldG8KKzI4OC40OCA0MDQuMjM0IDI4OS4xMDUgNDA2LjkzIDI5MC4zOTUgNDA2Ljk3MyBjdXJ2ZXRvCisyOTAuNDQxIDQwNS44ODMgMjkwLjUwOCA0MDQuODk4IDI4OS45MjIgNDAzLjY0MSBjdXJ2ZXRvCisyODkuMDEyIDQwMS42OTkgMjg2LjcxOSAzOTkuMDY2IDI4NC40NjEgMzk5LjA2NiBjdXJ2ZXRvCisyODIuODQ0IDM5OS4wNjYgMjgwLjU5NCA0MDEuMDMxIDI4MC4xNTIgNDAxLjAzMSBjdXJ2ZXRvCisyNzkuNjcyIDQwMS4wMzEgMjc4Ljc4OSA0MDAuODA1IDI3OC41MDggNDAwLjIwMyBjdXJ2ZXRvCisyNzcuMzMyIDM5Ny42OTEgMjgwLjQ3NyAzODkuMjk3IDI4My42MjUgMzg5LjI5NyBjdXJ2ZXRvCisyODUuMzA5IDM4OS4yOTcgMjg3LjMxNiAzOTAuNTQzIDI4OS4wNzggMzkxLjMxMiBjdXJ2ZXRvCisyODguNjIxIDM4OC4yODkgMjg4LjU1OSAzODUuNzM4IDI4OS4xNjQgMzgzLjEzMyBjdXJ2ZXRvCisyODcuNTU5IDM4Mi4xMDkgMjg1LjY4IDM4MS42NzYgMjg0LjE3MiAzODEuNjc2IGN1cnZldG8KKzI3Ni40MyAzODEuNjc2IDI4MC42OTkgMzk5Ljg1OSAyNzMuNTU5IDQwMy43MzQgY3VydmV0bworMjc2LjI0MiA0MDcuMzA1IGxpbmV0bworIGNsb3NlcGF0aCBmaWxsCituZXdwYXRoIDMwNiA0MDguNzYyIG1vdmV0bworMzExLjg1MiA0MDguNzYyIDMxNC4xNiAzOTguMTMzIDMxMS41MzUgMzkyLjUxNiBjdXJ2ZXRvCiszMDkuNSAzODguMTYgMzA1Ljg4NyAzODUgMzAxLjI2MiAzODUgY3VydmV0bworMjkzLjA5IDM4NSAyOTQuMTEzIDM5Ni4yNDYgMjk3LjMwMSA0MDMuMDY2IGN1cnZldG8KKzI5OC4xOCA0MDQuOTQ1IDMwMS4xODQgNDA5LjAzOSAzMDMuNTMxIDQwOS4wMzkgY3VydmV0bworMzA0LjM5NSA0MDkuMDM5IDMwNS4xMTMgNDA4Ljc2MiAzMDYgNDA4Ljc2MiBjdXJ2ZXRvCisgY2xvc2VwYXRoIGZpbGwKK25ld3BhdGggMzA1LjgxNiA0MDcuNzcgbW92ZXRvCiszMDQuODk4IDQwNy43NyAzMDQuMDg2IDQwNy4zMDkgMzAzLjY2IDQwNi4zOTUgY3VydmV0bworMzAyLjc2MiA0MDQuNDc3IDMwNy4yMzQgNDAyLjUzNSAzMDYuNTk0IDQwMS4xNjQgY3VydmV0bworMzA2LjE4OCA0MDAuMzAxIDMwNC42NTIgMzk5LjQ5MiAzMDMuODc1IDM5OS40OTIgY3VydmV0bworMjk5Ljk5NiAzOTkuNDkyIDMwMC4wMzEgNDA0LjU4NiAzMDIuMzQgNDA3LjkwNiBjdXJ2ZXRvCiszMDAuOTA2IDQwNi45OCAyOTkuOTYxIDQwNS41NyAyOTkuMzUyIDQwNC4yNTggY3VydmV0bworMjk3LjA3OCAzOTkuMzk4IDI5OC44ODMgMzkyLjcxMSAzMDQuMDY2IDM5Mi43MTEgY3VydmV0bworMzA2LjkzNCAzOTIuNzExIDMxMC4yMyAzOTUuMzEyIDMxMS41MTIgMzk4LjA1NSBjdXJ2ZXRvCiszMTMuMDk0IDQwMS40MyAzMDkuMDU5IDQwNy43NyAzMDUuODE2IDQwNy43NyBjdXJ2ZXRvCisgY2xvc2VwYXRoIGZpbGwKK25ld3BhdGggMzMyLjU5IDM5MS4yNjIgbW92ZXRvCiszMzEuMDYyIDM4Ny45OTIgMzI4LjIxMSAzODYuMTk1IDMyNS4wMDQgMzg2LjE5NSBjdXJ2ZXRvCiszMTQuODI0IDM4Ni4xOTUgMzEyLjgwNSAzOTUuNTcgMzE3LjIxNSA0MDUuMDEyIGN1cnZldG8KKzMxOC4yNTggNDA3LjIzOCAzMTkuOTY5IDQwOS43MDMgMzIyLjU3OCA0MDkuNzAzIGN1cnZldG8KKzMzMC43NTggNDA5LjcwMyAzMzYuNDUzIDM5OS41MzEgMzMyLjU5IDM5MS4yNjIgY3VydmV0bworIGNsb3NlcGF0aCBmaWxsCituZXdwYXRoIDMyNC40NjkgNDA4LjUyIG1vdmV0bworMzIzLjcxNSA0MDguNTIgMzIzLjA1OSA0MDguMjQ2IDMyMi42OTUgNDA3LjQ3NyBjdXJ2ZXRvCiszMjEuOTA2IDQwNS43ODEgMzI2LjIxMSA0MDQuMjcgMzI2LjIxOSA0MDIuNTE2IGN1cnZldG8KKzMyNS43NyA0MDEuOTggMzI0LjUwOCA0MDEuMzc5IDMyMy45NjEgNDAxLjM3OSBjdXJ2ZXRvCiszMjAuODU5IDQwMS4zNzkgMzE4LjUxNiA0MDUuNjI1IDMyMS4xNjQgNDA4Ljc4MSBjdXJ2ZXRvCiszMjAuMDkgNDA4LjA5NCAzMTkuNDQ5IDQwNy4wNjIgMzE5IDQwNi4wOSBjdXJ2ZXRvCiszMTYuMzEyIDQwMC4zNDQgMzIwLjE0MSAzOTQuNTM1IDMyNS43MTkgMzk0LjUzNSBjdXJ2ZXRvCiszMjguMDQzIDM5NC41MzUgMzMxLjAzNSAzOTUuODQgMzMyLjI0MiAzOTguNDIyIGN1cnZldG8KKzMzMy45NDkgNDAyLjA3NCAzMjcuODY3IDQwOC41MiAzMjQuNDY5IDQwOC41MiBjdXJ2ZXRvCisgY2xvc2VwYXRoIGZpbGwKK25ld3BhdGggMzQzLjEyMSA0MDguNTc0IG1vdmV0bworMzUxLjg5MSA0MDguNTc0IDM1Ni4zNTIgMzkyLjMxNiAzNTIuNDMgMzgzLjkzIGN1cnZldG8KKzM1MS42OCAzODIuMzI0IDM1MC4yODUgMzgwLjcyMyAzNDguNDQxIDM4MC43MjMgY3VydmV0bworMzM4LjQxOCAzODAuNzIzIDM0MC45NzcgNDAwLjg0OCAzMzUuMzMyIDQwNi41NjIgY3VydmV0bworMzM1Ljg1MiA0MDcuMTE3IDMzNi4zNDQgNDA3LjY5NSAzMzYuNzk3IDQwOC4yNzcgY3VydmV0bworMzQwLjYwOSA0MDMuNzU4IDMzOC43MTUgMzkxLjg2NyAzNDYuODU5IDM5MS44NjcgY3VydmV0bworMzQ4LjczNCAzOTEuODY3IDM1MC4xNTYgMzkzLjUyMyAzNTAuOTEgMzk1LjE0NSBjdXJ2ZXRvCiszNTIuOTM0IDM5OS40NzMgMzQ5LjE5MSA0MDYuOTg0IDM0NS4wOTggNDA2Ljk4NCBjdXJ2ZXRvCiszNDUuMDU1IDQwNi45ODQgMzQ0LjQ2NSA0MDYuOTYxIDM0NC40OCA0MDYuNzE5IGN1cnZldG8KKzM0NC42MjkgNDAzLjk1NyAzNDYuNzgxIDQwNS42OCAzNDQuNjE3IDQwMC45OCBjdXJ2ZXRvCiszNDIuNDAyIDQwMS40MjYgMzQwLjA1OSA0MDUuMDE2IDM0MS4yNjYgNDA3LjYwNSBjdXJ2ZXRvCiszNDEuNjI1IDQwOC4zNjMgMzQyLjUxNiA0MDguNTc0IDM0My4xMjEgNDA4LjU3NCBjdXJ2ZXRvCisgY2xvc2VwYXRoIGZpbGwKK25ld3BhdGggMzY0LjkzOCA0MDguNzU4IG1vdmV0bworMzY1Ljc2MiA0MDguNjggMzY3LjAwNCA0MDguNzU0IDM2Ny43MTEgNDA4LjUzNSBjdXJ2ZXRvCiszNjcuODQ4IDQwOC40OTYgMzY3Ljc0NiA0MDguMzI4IDM2Ny43NjYgNDA4LjE5NSBjdXJ2ZXRvCiszNjcuOTg0IDQwNi45NjUgMzY4LjMyIDQwNS44MDEgMzY4LjYxNyA0MDQuNjEzIGN1cnZldG8KKzM2OS43NTggMzk5Ljk4OCAzNzAuNDQ1IDM5NS4yMzggMzcxLjc1OCAzOTAuNjUyIGN1cnZldG8KKzM3My4xODQgMzg1LjY2IDM3NC42NzIgMzgwLjAzNSAzNzIuOTQ1IDM3My43NyBjdXJ2ZXRvCiszNzIuNzc3IDM3My4xNTYgMzcyLjU1MSAzNzIuNTM1IDM3Mi4yNTggMzcxLjkxIGN1cnZldG8KKzM2NS42OTEgMzU5LjE2OCAzNTEuNjI5IDM2Mi42MDIgMzQ3LjIyNyAzNjIuNjAyIGN1cnZldG8KKzM0Ni42OTEgMzYyLjYwMiAzNDYuMTEzIDM2Mi43NTQgMzQ1Ljg1OSAzNjMuMTA1IGN1cnZldG8KKzM0Ny43MTUgMzY0LjMwMSAzNDguODc5IDM2NS41MjMgMzQ5LjcxMSAzNjcuMzAxIGN1cnZldG8KKzM1MC43MDMgMzY5LjQzIDM1MC42OTEgMzcxLjQyNiAzNTAuNTU5IDM3My4yNjIgY3VydmV0bworMzUwLjkxNCAzNzMuMDU1IDM1Mi4wNDMgMzcyLjUzOSAzNTIuNTA4IDM3Mi41MzkgY3VydmV0bworMzU0LjQxNCAzNzIuNTM5IDM2NS4wMzUgMzY3LjAyNyAzNzAuNDQ1IDM3Ny4xNiBjdXJ2ZXRvCiszNzEuODUyIDM4MC4xNjQgMzcxLjYxMyAzODMuMjMgMzcxLjM2NyAzODUuNzg5IGN1cnZldG8KKzM3MS4yNDYgMzg3LjA2NiAzNzEuMDc0IDM4OC4zMjggMzcwLjg0IDM4OS41NTkgY3VydmV0bworMzcwLjQ4IDM5MS4zMzIgbGluZXRvCiszNzAuNDM4IDM5MS41MzEgbGluZXRvCiszNzAuMzkxIDM5MS43MjMgbGluZXRvCiszNzAuNjA1IDM5MS43MjMgMzcwLjQxNCAzOTEuMzQ4IDM3MC40MjIgMzkxLjE1NiBjdXJ2ZXRvCiszNzAuNTU1IDM4OC4wNTkgMzcwLjUgMzgzLjczOCAzNjguODUyIDM4MC4yMTEgY3VydmV0bworMzY4LjA4NiAzNzguNTc0IDM2Ni44MzIgMzc2Ljg4NyAzNjQuOTEgMzc2Ljg4NyBjdXJ2ZXRvCiszNTYuNDg4IDM3Ni44ODcgMzYwLjcyMyA0MDEuMDE2IDM1My45NzMgNDA2Ljc1IGN1cnZldG8KKzM1NC4zNDggNDA3LjM3NSAzNTQuNjggNDA4LjAxNiAzNTQuOTYxIDQwOC42NDUgY3VydmV0bworMzU4Ljk1MyA0MDMuNzczIDM1OS4xNjQgMzkwLjM0IDM2NS4wNDcgMzkwLjM0IGN1cnZldG8KKzM2Ni40NzMgMzkwLjM0IDM2Ny45NDUgMzkxLjY5MSAzNjguNTU1IDM5Mi45ODggY3VydmV0bworMzcxLjE2OCAzOTguNTc4IDM2Ni44MjQgNDA1LjA4NiAzNjQuOTM4IDQwOC43NTggY3VydmV0bworIGNsb3NlcGF0aCBmaWxsCisgMCBzZXRncmF5CituZXdwYXRoIDM3Mi43OTMgMzQwLjY5OSBtb3ZldG8KKzMwNS42NDUgMzY2Ljk4OCBsaW5ldG8KKzIzOC41IDM0MC43MDcgbGluZXRvCisyNjUuMDEyIDM4Mi42MDIgbGluZXRvCisxOTcgNDA4LjI1OCBsaW5ldG8KKzI4MC41MzEgNDA3Ljg2MyBsaW5ldG8KKzMwNS42NDEgNDUwIGxpbmV0bworMzMwLjc1NCA0MDcuODU5IGxpbmV0bworNDE0LjI4OSA0MDguMjQ2IGxpbmV0bworMzQ2LjI3NyAzODIuNTk4IGxpbmV0bworMzcyLjc5MyAzNDAuNjk5IGxpbmV0bworIGNsb3NlcGF0aCBmaWxsCisgMC4zNTgzMiAwLjcwNDk2IDAuNzQ5IHNldHJnYmNvbG9yCituZXdwYXRoIDM2My43MDcgMzQ4LjE5NSBtb3ZldG8KKzMwNS43MDMgMzcwLjkwMiBsaW5ldG8KKzI0Ny42OTkgMzQ4LjE5OSBsaW5ldG8KKzI3MC42MDIgMzg0LjM5MSBsaW5ldG8KKzIxMS44NDggNDA2LjU1MSBsaW5ldG8KKzI4NC4wMDggNDA2LjIxMSBsaW5ldG8KKzMwNS42OTkgNDQyLjYwOSBsaW5ldG8KKzMyNy4zOTUgNDA2LjIxMSBsaW5ldG8KKzM5OS41NTkgNDA2LjU0MyBsaW5ldG8KKzM0MC44MDUgMzg0LjM4NyBsaW5ldG8KKzM2My43MDcgMzQ4LjE5NSBsaW5ldG8KKyBjbG9zZXBhdGggZmlsbAorIDAgc2V0Z3JheQorbmV3cGF0aCAyNjEuMTc2IDQyOC40NjkgbW92ZXRvCisyNjYuOTY5IDQyOC40NjkgMjYzLjU5NCA0MTMuODQ4IDI2MS41MzEgNDA5LjQzOCBjdXJ2ZXRvCisyNTkuNzcgNDA1LjY2NCAyNTUuNzk3IDQwMC4yMTkgMjUxLjA4NiA0MDAuMjE5IGN1cnZldG8KKzI0NS40NDEgNDAwLjIxOSAyNDUuNjA5IDQwNi42MDUgMjQ3Ljg1NSA0MTEuNDE4IGN1cnZldG8KKzI0OS4wNzQgNDE0LjAyIDI1MC45NDUgNDE2Ljk0MSAyNTMuNTIgNDE5LjA4NiBjdXJ2ZXRvCisyNTIuODYzIDQxNi44NDggMjU1LjA5NCA0MTUuMzE2IDI1NC4xOTEgNDEzLjM4NyBjdXJ2ZXRvCisyNTMuNTc0IDQxMi4wNjYgMjUyLjMwMSA0MTAuNjI5IDI1MS42MzcgNDA5LjIxMSBjdXJ2ZXRvCisyNTAuNTY2IDQwNi45MTggMjUwLjk3MyA0MDIuODUyIDI1My41NjIgNDAyLjg1MiBjdXJ2ZXRvCisyNTUuODc5IDQwMi44NTIgMjU3LjkzOCA0MDUuNzUgMjU4Ljc4NSA0MDcuNTU1IGN1cnZldG8KKzI2MC41MTIgNDExLjI1NCAyNjQuODM2IDQyNy4wNDMgMjYwLjAwNCA0MjcuMDQzIGN1cnZldG8KKzI1NC40MzggNDI3LjA0MyAyNDQuODQ0IDQxMy4zNDQgMjQyLjgzNiA0MDkuMDQ3IGN1cnZldG8KKzIzOS4yNSA0MDEuMzc1IDI0MS44NTIgMzkxLjkzIDI1MC4wMiAzOTEuOTMgY3VydmV0bworMjU1LjUzOSAzOTEuOTMgMjYwLjA3OCAzOTcuMjg5IDI2Mi4yNyA0MDEuOTggY3VydmV0bworMjYzLjU3OCA0MDQuNzczIDI2NC4yODkgNDA3LjU1NSAyNjQuNTcgNDEwLjE3NiBjdXJ2ZXRvCisyNjUuNjQxIDQxMC4zNzUgbGluZXRvCisyNjUuODc5IDQwMy4xNTYgMjczLjQzOCAzOTEuMjA3IDI3MC4yMTkgMzg0LjMyIGN1cnZldG8KKzI2Ni4xMDIgMzc1LjUwOCAyNTMuNzg1IDM3NS41ODYgMjQ2Ljc1NCAzNzIuNDYxIGN1cnZldG8KKzI0NS4yNzMgMzc1Ljk1MyAyNDMuMjczIDM3OS4xOTkgMjQwLjQ1MyAzODEuNjggY3VydmV0bworMjQ2LjcyNyAzODMuODA5IDI2Mi4xMzcgMzg3LjM4NyAyNjUuNDkyIDM5NC41NTkgY3VydmV0bworMjY2Ljg5OCAzOTcuNTcgMjY1Ljk0MSA0MDIuNTY2IDI2NC4zMTIgNDA0LjI1OCBjdXJ2ZXRvCisyNjQuMDM1IDQwMy4xOTUgMjYzLjY1MiA0MDIuMTA5IDI2My4xNDUgNDAxLjAyIGN1cnZldG8KKzI2MC4yNzMgMzk0Ljg4MyAyNTQuMTI5IDM5MC4xMjEgMjQ3Ljc5MyAzOTAuMTIxIGN1cnZldG8KKzIzOC45NzcgMzkwLjEyMSAyMzUuMjM4IDM5Ni41MiAyMzkuMzg3IDQwNS4zOTggY3VydmV0bworMjQxLjg3OSA0MTAuNzMgMjU0LjU5OCA0MjguNDY5IDI2MS4xNzYgNDI4LjQ2OSBjdXJ2ZXRvCisgY2xvc2VwYXRoIGZpbGwKK25ld3BhdGggMjYxLjE3NiA0MjguNDY5IG1vdmV0bworMjY2Ljk2OSA0MjguNDY5IDI2My41OTQgNDEzLjg0OCAyNjEuNTMxIDQwOS40MzggY3VydmV0bworMjU5Ljc3IDQwNS42NjQgMjU1Ljc5NyA0MDAuMjE5IDI1MS4wODYgNDAwLjIxOSBjdXJ2ZXRvCisyNDUuNDQxIDQwMC4yMTkgMjQ1LjYwOSA0MDYuNjA1IDI0Ny44NTUgNDExLjQxOCBjdXJ2ZXRvCisyNDkuMDc0IDQxNC4wMiAyNTAuOTQ1IDQxNi45NDEgMjUzLjUyIDQxOS4wODYgY3VydmV0bworMjUyLjg2MyA0MTYuODQ4IDI1NS4wOTQgNDE1LjMxNiAyNTQuMTkxIDQxMy4zODcgY3VydmV0bworMjUzLjU3NCA0MTIuMDY2IDI1Mi4zMDEgNDEwLjYyOSAyNTEuNjM3IDQwOS4yMTEgY3VydmV0bworMjUwLjU2NiA0MDYuOTE4IDI1MC45NzMgNDAyLjg1MiAyNTMuNTYyIDQwMi44NTIgY3VydmV0bworMjU1Ljg3OSA0MDIuODUyIDI1Ny45MzggNDA1Ljc1IDI1OC43ODUgNDA3LjU1NSBjdXJ2ZXRvCisyNjAuNTEyIDQxMS4yNTQgMjY0LjgzNiA0MjcuMDQzIDI2MC4wMDQgNDI3LjA0MyBjdXJ2ZXRvCisyNTQuNDM4IDQyNy4wNDMgMjQ0Ljg0NCA0MTMuMzQ0IDI0Mi44MzYgNDA5LjA0NyBjdXJ2ZXRvCisyMzkuMjUgNDAxLjM3NSAyNDEuODUyIDM5MS45MyAyNTAuMDIgMzkxLjkzIGN1cnZldG8KKzI1NS41MzkgMzkxLjkzIDI2MC4wNzggMzk3LjI4OSAyNjIuMjcgNDAxLjk4IGN1cnZldG8KKzI2My41NzggNDA0Ljc3MyAyNjQuMjg5IDQwNy41NTUgMjY0LjU3IDQxMC4xNzYgY3VydmV0bworMjY1LjY0MSA0MTAuMzc1IGxpbmV0bworMjY1Ljg3OSA0MDMuMTU2IDI3My40MzggMzkxLjIwNyAyNzAuMjE5IDM4NC4zMiBjdXJ2ZXRvCisyNjYuMTAyIDM3NS41MDggMjUzLjc4NSAzNzUuNTg2IDI0Ni43NTQgMzcyLjQ2MSBjdXJ2ZXRvCisyNDUuMjczIDM3NS45NTMgMjQzLjI3MyAzNzkuMTk5IDI0MC40NTMgMzgxLjY4IGN1cnZldG8KKzI0Ni43MjcgMzgzLjgwOSAyNjIuMTM3IDM4Ny4zODcgMjY1LjQ5MiAzOTQuNTU5IGN1cnZldG8KKzI2Ni44OTggMzk3LjU3IDI2NS45NDEgNDAyLjU2NiAyNjQuMzEyIDQwNC4yNTggY3VydmV0bworMjY0LjAzNSA0MDMuMTk1IDI2My42NTIgNDAyLjEwOSAyNjMuMTQ1IDQwMS4wMiBjdXJ2ZXRvCisyNjAuMjczIDM5NC44ODMgMjU0LjEyOSAzOTAuMTIxIDI0Ny43OTMgMzkwLjEyMSBjdXJ2ZXRvCisyMzguOTc3IDM5MC4xMjEgMjM1LjIzOCAzOTYuNTIgMjM5LjM4NyA0MDUuMzk4IGN1cnZldG8KKzI0MS44NzkgNDEwLjczIDI1NC41OTggNDI4LjQ2OSAyNjEuMTc2IDQyOC40NjkgY3VydmV0bworIGNsb3NlcGF0aCBzdHJva2UKK25ld3BhdGggMjc2LjI0MiA0MDcuMzA1IG1vdmV0bworMjc2LjU5NCA0MDYuNDM0IDI3Ny42MDkgNDAxLjUxMiAyNzguMzc5IDQwMS41MTIgY3VydmV0bworMjgwLjAzOSA0MDEuNTEyIDI4My4wMzkgNDA2LjA3OCAyODMuODQ4IDQwNy4yNjIgY3VydmV0bworMjg1LjMyNCA0MDYuMjg1IDI4NC41MDQgNDA0LjIzNCAyODcuMjQyIDQwNC4yMzQgY3VydmV0bworMjg4LjQ4IDQwNC4yMzQgMjg5LjEwNSA0MDYuOTMgMjkwLjM5NSA0MDYuOTczIGN1cnZldG8KKzI5MC40NDEgNDA1Ljg4MyAyOTAuNTA4IDQwNC44OTggMjg5LjkyMiA0MDMuNjQxIGN1cnZldG8KKzI4OS4wMTIgNDAxLjY5OSAyODYuNzE5IDM5OS4wNjYgMjg0LjQ2MSAzOTkuMDY2IGN1cnZldG8KKzI4Mi44NDQgMzk5LjA2NiAyODAuNTk0IDQwMS4wMzEgMjgwLjE1MiA0MDEuMDMxIGN1cnZldG8KKzI3OS42NzIgNDAxLjAzMSAyNzguNzg5IDQwMC44MDUgMjc4LjUwOCA0MDAuMjAzIGN1cnZldG8KKzI3Ny4zMzIgMzk3LjY5MSAyODAuNDc3IDM4OS4yOTcgMjgzLjYyNSAzODkuMjk3IGN1cnZldG8KKzI4NS4zMDkgMzg5LjI5NyAyODcuMzE2IDM5MC41NDMgMjg5LjA3OCAzOTEuMzEyIGN1cnZldG8KKzI4OC42MjEgMzg4LjI4OSAyODguNTU5IDM4NS43MzggMjg5LjE2NCAzODMuMTMzIGN1cnZldG8KKzI4Ny41NTkgMzgyLjEwOSAyODUuNjggMzgxLjY3NiAyODQuMTcyIDM4MS42NzYgY3VydmV0bworMjc2LjQzIDM4MS42NzYgMjgwLjY5OSAzOTkuODU5IDI3My41NTkgNDAzLjczNCBjdXJ2ZXRvCisyNzYuMjQyIDQwNy4zMDUgbGluZXRvCisgY2xvc2VwYXRoIGZpbGwKK25ld3BhdGggMjc2LjI0MiA0MDcuMzA1IG1vdmV0bworMjc2LjU5NCA0MDYuNDM0IDI3Ny42MDkgNDAxLjUxMiAyNzguMzc5IDQwMS41MTIgY3VydmV0bworMjgwLjAzOSA0MDEuNTEyIDI4My4wMzkgNDA2LjA3OCAyODMuODQ4IDQwNy4yNjIgY3VydmV0bworMjg1LjMyNCA0MDYuMjg1IDI4NC41MDQgNDA0LjIzNCAyODcuMjQyIDQwNC4yMzQgY3VydmV0bworMjg4LjQ4IDQwNC4yMzQgMjg5LjEwNSA0MDYuOTMgMjkwLjM5NSA0MDYuOTczIGN1cnZldG8KKzI5MC40NDEgNDA1Ljg4MyAyOTAuNTA4IDQwNC44OTggMjg5LjkyMiA0MDMuNjQxIGN1cnZldG8KKzI4OS4wMTIgNDAxLjY5OSAyODYuNzE5IDM5OS4wNjYgMjg0LjQ2MSAzOTkuMDY2IGN1cnZldG8KKzI4Mi44NDQgMzk5LjA2NiAyODAuNTk0IDQwMS4wMzEgMjgwLjE1MiA0MDEuMDMxIGN1cnZldG8KKzI3OS42NzIgNDAxLjAzMSAyNzguNzg5IDQwMC44MDUgMjc4LjUwOCA0MDAuMjAzIGN1cnZldG8KKzI3Ny4zMzIgMzk3LjY5MSAyODAuNDc3IDM4OS4yOTcgMjgzLjYyNSAzODkuMjk3IGN1cnZldG8KKzI4NS4zMDkgMzg5LjI5NyAyODcuMzE2IDM5MC41NDMgMjg5LjA3OCAzOTEuMzEyIGN1cnZldG8KKzI4OC42MjEgMzg4LjI4OSAyODguNTU5IDM4NS43MzggMjg5LjE2NCAzODMuMTMzIGN1cnZldG8KKzI4Ny41NTkgMzgyLjEwOSAyODUuNjggMzgxLjY3NiAyODQuMTcyIDM4MS42NzYgY3VydmV0bworMjc2LjQzIDM4MS42NzYgMjgwLjY5OSAzOTkuODU5IDI3My41NTkgNDAzLjczNCBjdXJ2ZXRvCisyNzYuMjQyIDQwNy4zMDUgbGluZXRvCisgY2xvc2VwYXRoIHN0cm9rZQorbmV3cGF0aCAzMDYgNDA4Ljc2MiBtb3ZldG8KKzMxMS44NTIgNDA4Ljc2MiAzMTQuMTYgMzk4LjEzMyAzMTEuNTM1IDM5Mi41MTYgY3VydmV0bworMzA5LjUgMzg4LjE2IDMwNS44ODcgMzg1IDMwMS4yNjIgMzg1IGN1cnZldG8KKzI5My4wOSAzODUgMjk0LjExMyAzOTYuMjQ2IDI5Ny4zMDEgNDAzLjA2NiBjdXJ2ZXRvCisyOTguMTggNDA0Ljk0NSAzMDEuMTg0IDQwOS4wMzkgMzAzLjUzMSA0MDkuMDM5IGN1cnZldG8KKzMwNC4zOTUgNDA5LjAzOSAzMDUuMTEzIDQwOC43NjIgMzA2IDQwOC43NjIgY3VydmV0bworIGNsb3NlcGF0aCBmaWxsCituZXdwYXRoIDMwNS44MTYgNDA3Ljc3IG1vdmV0bworMzA0Ljg5OCA0MDcuNzcgMzA0LjA4NiA0MDcuMzA5IDMwMy42NiA0MDYuMzk1IGN1cnZldG8KKzMwMi43NjIgNDA0LjQ3NyAzMDcuMjM0IDQwMi41MzUgMzA2LjU5NCA0MDEuMTY0IGN1cnZldG8KKzMwNi4xODggNDAwLjMwMSAzMDQuNjUyIDM5OS40OTIgMzAzLjg3NSAzOTkuNDkyIGN1cnZldG8KKzI5OS45OTYgMzk5LjQ5MiAzMDAuMDMxIDQwNC41ODYgMzAyLjM0IDQwNy45MDYgY3VydmV0bworMzAwLjkwNiA0MDYuOTggMjk5Ljk2MSA0MDUuNTcgMjk5LjM1MiA0MDQuMjU4IGN1cnZldG8KKzI5Ny4wNzggMzk5LjM5OCAyOTguODgzIDM5Mi43MTEgMzA0LjA2NiAzOTIuNzExIGN1cnZldG8KKzMwNi45MzQgMzkyLjcxMSAzMTAuMjMgMzk1LjMxMiAzMTEuNTEyIDM5OC4wNTUgY3VydmV0bworMzEzLjA5NCA0MDEuNDMgMzA5LjA1OSA0MDcuNzcgMzA1LjgxNiA0MDcuNzcgY3VydmV0bworIGNsb3NlcGF0aCBmaWxsCituZXdwYXRoIDMwNiA0MDguNzYyIG1vdmV0bworMzExLjg1MiA0MDguNzYyIDMxNC4xNiAzOTguMTMzIDMxMS41MzUgMzkyLjUxNiBjdXJ2ZXRvCiszMDkuNSAzODguMTYgMzA1Ljg4NyAzODUgMzAxLjI2MiAzODUgY3VydmV0bworMjkzLjA5IDM4NSAyOTQuMTEzIDM5Ni4yNDYgMjk3LjMwMSA0MDMuMDY2IGN1cnZldG8KKzI5OC4xOCA0MDQuOTQ1IDMwMS4xODQgNDA5LjAzOSAzMDMuNTMxIDQwOS4wMzkgY3VydmV0bworMzA0LjM5NSA0MDkuMDM5IDMwNS4xMTMgNDA4Ljc2MiAzMDYgNDA4Ljc2MiBjdXJ2ZXRvCisgY2xvc2VwYXRoIHN0cm9rZQorbmV3cGF0aCAzMDUuODE2IDQwNy43NyBtb3ZldG8KKzMwNC44OTggNDA3Ljc3IDMwNC4wODYgNDA3LjMwOSAzMDMuNjYgNDA2LjM5NSBjdXJ2ZXRvCiszMDIuNzYyIDQwNC40NzcgMzA3LjIzNCA0MDIuNTM1IDMwNi41OTQgNDAxLjE2NCBjdXJ2ZXRvCiszMDYuMTg4IDQwMC4zMDEgMzA0LjY1MiAzOTkuNDkyIDMwMy44NzUgMzk5LjQ5MiBjdXJ2ZXRvCisyOTkuOTk2IDM5OS40OTIgMzAwLjAzMSA0MDQuNTg2IDMwMi4zNCA0MDcuOTA2IGN1cnZldG8KKzMwMC45MDYgNDA2Ljk4IDI5OS45NjEgNDA1LjU3IDI5OS4zNTIgNDA0LjI1OCBjdXJ2ZXRvCisyOTcuMDc4IDM5OS4zOTggMjk4Ljg4MyAzOTIuNzExIDMwNC4wNjYgMzkyLjcxMSBjdXJ2ZXRvCiszMDYuOTM0IDM5Mi43MTEgMzEwLjIzIDM5NS4zMTIgMzExLjUxMiAzOTguMDU1IGN1cnZldG8KKzMxMy4wOTQgNDAxLjQzIDMwOS4wNTkgNDA3Ljc3IDMwNS44MTYgNDA3Ljc3IGN1cnZldG8KKyBjbG9zZXBhdGggc3Ryb2tlCituZXdwYXRoIDMzMi41OSAzOTEuMjYyIG1vdmV0bworMzMxLjA2MiAzODcuOTkyIDMyOC4yMTEgMzg2LjE5NSAzMjUuMDA0IDM4Ni4xOTUgY3VydmV0bworMzE0LjgyNCAzODYuMTk1IDMxMi44MDUgMzk1LjU3IDMxNy4yMTUgNDA1LjAxMiBjdXJ2ZXRvCiszMTguMjU4IDQwNy4yMzggMzE5Ljk2OSA0MDkuNzAzIDMyMi41NzggNDA5LjcwMyBjdXJ2ZXRvCiszMzAuNzU4IDQwOS43MDMgMzM2LjQ1MyAzOTkuNTMxIDMzMi41OSAzOTEuMjYyIGN1cnZldG8KKyBjbG9zZXBhdGggZmlsbAorbmV3cGF0aCAzMjQuNDY5IDQwOC41MiBtb3ZldG8KKzMyMy43MTUgNDA4LjUyIDMyMy4wNTkgNDA4LjI0NiAzMjIuNjk1IDQwNy40NzcgY3VydmV0bworMzIxLjkwNiA0MDUuNzgxIDMyNi4yMTEgNDA0LjI3IDMyNi4yMTkgNDAyLjUxNiBjdXJ2ZXRvCiszMjUuNzcgNDAxLjk4IDMyNC41MDggNDAxLjM3OSAzMjMuOTYxIDQwMS4zNzkgY3VydmV0bworMzIwLjg1OSA0MDEuMzc5IDMxOC41MTYgNDA1LjYyNSAzMjEuMTY0IDQwOC43ODEgY3VydmV0bworMzIwLjA5IDQwOC4wOTQgMzE5LjQ0OSA0MDcuMDYyIDMxOSA0MDYuMDkgY3VydmV0bworMzE2LjMxMiA0MDAuMzQ0IDMyMC4xNDEgMzk0LjUzNSAzMjUuNzE5IDM5NC41MzUgY3VydmV0bworMzI4LjA0MyAzOTQuNTM1IDMzMS4wMzUgMzk1Ljg0IDMzMi4yNDIgMzk4LjQyMiBjdXJ2ZXRvCiszMzMuOTQ5IDQwMi4wNzQgMzI3Ljg2NyA0MDguNTIgMzI0LjQ2OSA0MDguNTIgY3VydmV0bworIGNsb3NlcGF0aCBmaWxsCituZXdwYXRoIDMzMi41OSAzOTEuMjYyIG1vdmV0bworMzMxLjA2MiAzODcuOTkyIDMyOC4yMTEgMzg2LjE5NSAzMjUuMDA0IDM4Ni4xOTUgY3VydmV0bworMzE0LjgyNCAzODYuMTk1IDMxMi44MDUgMzk1LjU3IDMxNy4yMTUgNDA1LjAxMiBjdXJ2ZXRvCiszMTguMjU4IDQwNy4yMzggMzE5Ljk2OSA0MDkuNzAzIDMyMi41NzggNDA5LjcwMyBjdXJ2ZXRvCiszMzAuNzU4IDQwOS43MDMgMzM2LjQ1MyAzOTkuNTMxIDMzMi41OSAzOTEuMjYyIGN1cnZldG8KKyBjbG9zZXBhdGggc3Ryb2tlCituZXdwYXRoIDMyNC40NjkgNDA4LjUyIG1vdmV0bworMzIzLjcxNSA0MDguNTIgMzIzLjA1OSA0MDguMjQ2IDMyMi42OTUgNDA3LjQ3NyBjdXJ2ZXRvCiszMjEuOTA2IDQwNS43ODEgMzI2LjIxMSA0MDQuMjcgMzI2LjIxOSA0MDIuNTE2IGN1cnZldG8KKzMyNS43NyA0MDEuOTggMzI0LjUwOCA0MDEuMzc5IDMyMy45NjEgNDAxLjM3OSBjdXJ2ZXRvCiszMjAuODU5IDQwMS4zNzkgMzE4LjUxNiA0MDUuNjI1IDMyMS4xNjQgNDA4Ljc4MSBjdXJ2ZXRvCiszMjAuMDkgNDA4LjA5NCAzMTkuNDQ5IDQwNy4wNjIgMzE5IDQwNi4wOSBjdXJ2ZXRvCiszMTYuMzEyIDQwMC4zNDQgMzIwLjE0MSAzOTQuNTM1IDMyNS43MTkgMzk0LjUzNSBjdXJ2ZXRvCiszMjguMDQzIDM5NC41MzUgMzMxLjAzNSAzOTUuODQgMzMyLjI0MiAzOTguNDIyIGN1cnZldG8KKzMzMy45NDkgNDAyLjA3NCAzMjcuODY3IDQwOC41MiAzMjQuNDY5IDQwOC41MiBjdXJ2ZXRvCisgY2xvc2VwYXRoIHN0cm9rZQorbmV3cGF0aCAzNDMuMTIxIDQwOC41NzQgbW92ZXRvCiszNTEuODkxIDQwOC41NzQgMzU2LjM1MiAzOTIuMzE2IDM1Mi40MyAzODMuOTMgY3VydmV0bworMzUxLjY4IDM4Mi4zMjQgMzUwLjI4NSAzODAuNzIzIDM0OC40NDEgMzgwLjcyMyBjdXJ2ZXRvCiszMzguNDE4IDM4MC43MjMgMzQwLjk3NyA0MDAuODQ4IDMzNS4zMzIgNDA2LjU2MiBjdXJ2ZXRvCiszMzUuODUyIDQwNy4xMTcgMzM2LjM0NCA0MDcuNjk1IDMzNi43OTcgNDA4LjI3NyBjdXJ2ZXRvCiszNDAuNjA5IDQwMy43NTggMzM4LjcxNSAzOTEuODY3IDM0Ni44NTkgMzkxLjg2NyBjdXJ2ZXRvCiszNDguNzM0IDM5MS44NjcgMzUwLjE1NiAzOTMuNTIzIDM1MC45MSAzOTUuMTQ1IGN1cnZldG8KKzM1Mi45MzQgMzk5LjQ3MyAzNDkuMTkxIDQwNi45ODQgMzQ1LjA5OCA0MDYuOTg0IGN1cnZldG8KKzM0NS4wNTUgNDA2Ljk4NCAzNDQuNDY1IDQwNi45NjEgMzQ0LjQ4IDQwNi43MTkgY3VydmV0bworMzQ0LjYyOSA0MDMuOTU3IDM0Ni43ODEgNDA1LjY4IDM0NC42MTcgNDAwLjk4IGN1cnZldG8KKzM0Mi40MDIgNDAxLjQyNiAzNDAuMDU5IDQwNS4wMTYgMzQxLjI2NiA0MDcuNjA1IGN1cnZldG8KKzM0MS42MjUgNDA4LjM2MyAzNDIuNTE2IDQwOC41NzQgMzQzLjEyMSA0MDguNTc0IGN1cnZldG8KKyBjbG9zZXBhdGggZmlsbAorbmV3cGF0aCAzNDMuMTIxIDQwOC41NzQgbW92ZXRvCiszNTEuODkxIDQwOC41NzQgMzU2LjM1MiAzOTIuMzE2IDM1Mi40MyAzODMuOTMgY3VydmV0bworMzUxLjY4IDM4Mi4zMjQgMzUwLjI4NSAzODAuNzIzIDM0OC40NDEgMzgwLjcyMyBjdXJ2ZXRvCiszMzguNDE4IDM4MC43MjMgMzQwLjk3NyA0MDAuODQ4IDMzNS4zMzIgNDA2LjU2MiBjdXJ2ZXRvCiszMzUuODUyIDQwNy4xMTcgMzM2LjM0NCA0MDcuNjk1IDMzNi43OTcgNDA4LjI3NyBjdXJ2ZXRvCiszNDAuNjA5IDQwMy43NTggMzM4LjcxNSAzOTEuODY3IDM0Ni44NTkgMzkxLjg2NyBjdXJ2ZXRvCiszNDguNzM0IDM5MS44NjcgMzUwLjE1NiAzOTMuNTIzIDM1MC45MSAzOTUuMTQ1IGN1cnZldG8KKzM1Mi45MzQgMzk5LjQ3MyAzNDkuMTkxIDQwNi45ODQgMzQ1LjA5OCA0MDYuOTg0IGN1cnZldG8KKzM0NS4wNTUgNDA2Ljk4NCAzNDQuNDY1IDQwNi45NjEgMzQ0LjQ4IDQwNi43MTkgY3VydmV0bworMzQ0LjYyOSA0MDMuOTU3IDM0Ni43ODEgNDA1LjY4IDM0NC42MTcgNDAwLjk4IGN1cnZldG8KKzM0Mi40MDIgNDAxLjQyNiAzNDAuMDU5IDQwNS4wMTYgMzQxLjI2NiA0MDcuNjA1IGN1cnZldG8KKzM0MS42MjUgNDA4LjM2MyAzNDIuNTE2IDQwOC41NzQgMzQzLjEyMSA0MDguNTc0IGN1cnZldG8KKyBjbG9zZXBhdGggc3Ryb2tlCituZXdwYXRoIDM2NC45MzggNDA4Ljc1OCBtb3ZldG8KKzM2NS43NjIgNDA4LjY4IDM2Ny4wMDQgNDA4Ljc1NCAzNjcuNzExIDQwOC41MzUgY3VydmV0bworMzY3Ljg0OCA0MDguNDk2IDM2Ny43NDYgNDA4LjMyOCAzNjcuNzY2IDQwOC4xOTUgY3VydmV0bworMzY3Ljk4NCA0MDYuOTY1IDM2OC4zMiA0MDUuODAxIDM2OC42MTcgNDA0LjYxMyBjdXJ2ZXRvCiszNjkuNzU4IDM5OS45ODggMzcwLjQ0NSAzOTUuMjM4IDM3MS43NTggMzkwLjY1MiBjdXJ2ZXRvCiszNzMuMTg0IDM4NS42NiAzNzQuNjcyIDM4MC4wMzUgMzcyLjk0NSAzNzMuNzcgY3VydmV0bworMzcyLjc3NyAzNzMuMTU2IDM3Mi41NTEgMzcyLjUzNSAzNzIuMjU4IDM3MS45MSBjdXJ2ZXRvCiszNzAuMzAxIDM2Ny43MTkgMzUzLjQzIDM2Mi44ODcgMzQ5LjAyMyAzNjIuODg3IGN1cnZldG8KKzM0OC40OTIgMzYyLjg4NyAzNDcuOTE0IDM2My4wNDMgMzQ3LjY1NiAzNjMuMzkxIGN1cnZldG8KKzM0OS41MTYgMzY0LjU4NiAzNTAuNjggMzY1LjgxMiAzNTEuNTA4IDM2Ny41ODYgY3VydmV0bworMzUyLjUwNCAzNjkuNzE5IDM1Mi40OTIgMzcxLjcxMSAzNTIuMzU5IDM3My41NTEgY3VydmV0bworMzUyLjcxMSAzNzMuMzQ0IDM2NS42NzIgMzczLjY2NCAzNjYuMTQxIDM3My42NjQgY3VydmV0bworMzY4LjA0NyAzNzMuNjY0IDM2OS42ODQgMzc1LjUyMyAzNzAuNDQ1IDM3Ny4xNiBjdXJ2ZXRvCiszNzEuODUyIDM4MC4xNjQgMzcxLjYxMyAzODMuMjMgMzcxLjM2NyAzODUuNzg5IGN1cnZldG8KKzM3MS4yNDYgMzg3LjA2NiAzNzEuMDc0IDM4OC4zMjggMzcwLjg0IDM4OS41NTkgY3VydmV0bworMzcwLjQ4IDM5MS4zMzIgbGluZXRvCiszNzAuNDM4IDM5MS41MzEgbGluZXRvCiszNzAuMzkxIDM5MS43MjMgbGluZXRvCiszNzAuNjA1IDM5MS43MjMgMzcwLjQxNCAzOTEuMzQ4IDM3MC40MjIgMzkxLjE1NiBjdXJ2ZXRvCiszNzAuNTU1IDM4OC4wNTkgMzcwLjUgMzgzLjczOCAzNjguODUyIDM4MC4yMTEgY3VydmV0bworMzY4LjA4NiAzNzguNTc0IDM2Ni44MzIgMzc2Ljg4NyAzNjQuOTEgMzc2Ljg4NyBjdXJ2ZXRvCiszNTYuNDg4IDM3Ni44ODcgMzYwLjcyMyA0MDEuMDE2IDM1My45NzMgNDA2Ljc1IGN1cnZldG8KKzM1NC4zNDggNDA3LjM3NSAzNTQuNjggNDA4LjAxNiAzNTQuOTYxIDQwOC42NDUgY3VydmV0bworMzU4Ljk1MyA0MDMuNzczIDM1OS4xNjQgMzkwLjM0IDM2NS4wNDcgMzkwLjM0IGN1cnZldG8KKzM2Ni40NzMgMzkwLjM0IDM2Ny45NDUgMzkxLjY5MSAzNjguNTU1IDM5Mi45ODggY3VydmV0bworMzcxLjE2OCAzOTguNTc4IDM2Ni44MjQgNDA1LjA4NiAzNjQuOTM4IDQwOC43NTggY3VydmV0bworIGNsb3NlcGF0aCBmaWxsCituZXdwYXRoIDM2NC45MzggNDA4Ljc1OCBtb3ZldG8KKzM2NS43NjIgNDA4LjY4IDM2Ny4wMDQgNDA4Ljc1NCAzNjcuNzExIDQwOC41MzUgY3VydmV0bworMzY3Ljg0OCA0MDguNDk2IDM2Ny43NDYgNDA4LjMyOCAzNjcuNzY2IDQwOC4xOTUgY3VydmV0bworMzY3Ljk4NCA0MDYuOTY1IDM2OC4zMiA0MDUuODAxIDM2OC42MTcgNDA0LjYxMyBjdXJ2ZXRvCiszNjkuNzU4IDM5OS45ODggMzcwLjQ0NSAzOTUuMjM4IDM3MS43NTggMzkwLjY1MiBjdXJ2ZXRvCiszNzMuMTg0IDM4NS42NiAzNzQuNjcyIDM4MC4wMzUgMzcyLjk0NSAzNzMuNzcgY3VydmV0bworMzcyLjc3NyAzNzMuMTU2IDM3Mi41NTEgMzcyLjUzNSAzNzIuMjU4IDM3MS45MSBjdXJ2ZXRvCiszNzAuMzAxIDM2Ny43MTkgMzUzLjQzIDM2Mi44ODcgMzQ5LjAyMyAzNjIuODg3IGN1cnZldG8KKzM0OC40OTIgMzYyLjg4NyAzNDcuOTE0IDM2My4wNDMgMzQ3LjY1NiAzNjMuMzkxIGN1cnZldG8KKzM0OS41MTYgMzY0LjU4NiAzNTAuNjggMzY1LjgxMiAzNTEuNTA4IDM2Ny41ODYgY3VydmV0bworMzUyLjUwNCAzNjkuNzE5IDM1Mi40OTIgMzcxLjcxMSAzNTIuMzU5IDM3My41NTEgY3VydmV0bworMzUyLjcxMSAzNzMuMzQ0IDM2NS42NzIgMzczLjY2NCAzNjYuMTQxIDM3My42NjQgY3VydmV0bworMzY4LjA0NyAzNzMuNjY0IDM2OS42ODQgMzc1LjUyMyAzNzAuNDQ1IDM3Ny4xNiBjdXJ2ZXRvCiszNzEuODUyIDM4MC4xNjQgMzcxLjYxMyAzODMuMjMgMzcxLjM2NyAzODUuNzg5IGN1cnZldG8KKzM3MS4yNDYgMzg3LjA2NiAzNzEuMDc0IDM4OC4zMjggMzcwLjg0IDM4OS41NTkgY3VydmV0bworMzcwLjQ4IDM5MS4zMzIgbGluZXRvCiszNzAuNDM4IDM5MS41MzEgbGluZXRvCiszNzAuMzkxIDM5MS43MjMgbGluZXRvCiszNzAuNjA1IDM5MS43MjMgMzcwLjQxNCAzOTEuMzQ4IDM3MC40MjIgMzkxLjE1NiBjdXJ2ZXRvCiszNzAuNTU1IDM4OC4wNTkgMzcwLjUgMzgzLjczOCAzNjguODUyIDM4MC4yMTEgY3VydmV0bworMzY4LjA4NiAzNzguNTc0IDM2Ni44MzIgMzc2Ljg4NyAzNjQuOTEgMzc2Ljg4NyBjdXJ2ZXRvCiszNTYuNDg4IDM3Ni44ODcgMzYwLjcyMyA0MDEuMDE2IDM1My45NzMgNDA2Ljc1IGN1cnZldG8KKzM1NC4zNDggNDA3LjM3NSAzNTQuNjggNDA4LjAxNiAzNTQuOTYxIDQwOC42NDUgY3VydmV0bworMzU4Ljk1MyA0MDMuNzczIDM1OS4xNjQgMzkwLjM0IDM2NS4wNDcgMzkwLjM0IGN1cnZldG8KKzM2Ni40NzMgMzkwLjM0IDM2Ny45NDUgMzkxLjY5MSAzNjguNTU1IDM5Mi45ODggY3VydmV0bworMzcxLjE2OCAzOTguNTc4IDM2Ni44MjQgNDA1LjA4NiAzNjQuOTM4IDQwOC43NTggY3VydmV0bworIGNsb3NlcGF0aCBzdHJva2UKK25ld3BhdGggMjYxLjE3NiA0MjguNDY5IG1vdmV0bworMjY2Ljk2OSA0MjguNDY5IDI2My41OTQgNDEzLjg0OCAyNjEuNTMxIDQwOS40MzggY3VydmV0bworMjU5Ljc3IDQwNS42NjQgMjU1Ljc5NyA0MDAuMjE5IDI1MS4wODYgNDAwLjIxOSBjdXJ2ZXRvCisyNDUuNDQxIDQwMC4yMTkgMjQ1LjYwOSA0MDYuNjA1IDI0Ny44NTUgNDExLjQxOCBjdXJ2ZXRvCisyNDkuMDc0IDQxNC4wMiAyNTAuOTQ1IDQxNi45NDEgMjUzLjUyIDQxOS4wODYgY3VydmV0bworMjUyLjg2MyA0MTYuODQ4IDI1NS4wOTQgNDE1LjMxNiAyNTQuMTkxIDQxMy4zODcgY3VydmV0bworMjUzLjU3NCA0MTIuMDY2IDI1Mi4zMDEgNDEwLjYyOSAyNTEuNjM3IDQwOS4yMTEgY3VydmV0bworMjUwLjU2NiA0MDYuOTE4IDI1MC45NzMgNDAyLjg1MiAyNTMuNTYyIDQwMi44NTIgY3VydmV0bworMjU1Ljg3OSA0MDIuODUyIDI1Ny45MzggNDA1Ljc1IDI1OC43ODUgNDA3LjU1NSBjdXJ2ZXRvCisyNjAuNTEyIDQxMS4yNTQgMjY0LjgzNiA0MjcuMDQzIDI2MC4wMDQgNDI3LjA0MyBjdXJ2ZXRvCisyNTQuNDM4IDQyNy4wNDMgMjQ0Ljg0NCA0MTMuMzQ0IDI0Mi44MzYgNDA5LjA0NyBjdXJ2ZXRvCisyMzkuMjUgNDAxLjM3NSAyNDEuODUyIDM5MS45MyAyNTAuMDIgMzkxLjkzIGN1cnZldG8KKzI1NS41MzkgMzkxLjkzIDI2MC4wNzggMzk3LjI4OSAyNjIuMjcgNDAxLjk4IGN1cnZldG8KKzI2My41NzggNDA0Ljc3MyAyNjQuMjg5IDQwNy41NTUgMjY0LjU3IDQxMC4xNzYgY3VydmV0bworMjY1LjY0MSA0MTAuMzc1IGxpbmV0bworMjY1Ljg3OSA0MDMuMTU2IDI3My40MzggMzkxLjIwNyAyNzAuMjE5IDM4NC4zMiBjdXJ2ZXRvCisyNjYuMTAyIDM3NS41MDggMjUzLjc4NSAzNzUuNTg2IDI0Ni43NTQgMzcyLjQ2MSBjdXJ2ZXRvCisyNDUuMjczIDM3NS45NTMgMjQzLjI3MyAzNzkuMTk5IDI0MC40NTMgMzgxLjY4IGN1cnZldG8KKzI0Ni43MjcgMzgzLjgwOSAyNjIuMTM3IDM4Ny4zODcgMjY1LjQ5MiAzOTQuNTU5IGN1cnZldG8KKzI2Ni44OTggMzk3LjU3IDI2NS45NDEgNDAyLjU2NiAyNjQuMzEyIDQwNC4yNTggY3VydmV0bworMjY0LjAzNSA0MDMuMTk1IDI2My42NTIgNDAyLjEwOSAyNjMuMTQ1IDQwMS4wMiBjdXJ2ZXRvCisyNjAuMjczIDM5NC44ODMgMjU0LjEyOSAzOTAuMTIxIDI0Ny43OTMgMzkwLjEyMSBjdXJ2ZXRvCisyMzguOTc3IDM5MC4xMjEgMjM1LjIzOCAzOTYuNTIgMjM5LjM4NyA0MDUuMzk4IGN1cnZldG8KKzI0MS44NzkgNDEwLjczIDI1NC41OTggNDI4LjQ2OSAyNjEuMTc2IDQyOC40NjkgY3VydmV0bworIGNsb3NlcGF0aCBmaWxsCisgMCAwLjgxMjggZHRyYW5zZm9ybSB0cnVuY2F0ZSBpZHRyYW5zZm9ybSBzZXRsaW5ld2lkdGggcG9wIDAgc2V0bGluZWpvaW4KK25ld3BhdGggMjYxLjE3NiA0MjguNDY5IG1vdmV0bworMjY2Ljk2OSA0MjguNDY5IDI2My41OTQgNDEzLjg0OCAyNjEuNTMxIDQwOS40MzggY3VydmV0bworMjU5Ljc3IDQwNS42NjQgMjU1Ljc5NyA0MDAuMjE5IDI1MS4wODYgNDAwLjIxOSBjdXJ2ZXRvCisyNDUuNDQxIDQwMC4yMTkgMjQ1LjYwOSA0MDYuNjA1IDI0Ny44NTUgNDExLjQxOCBjdXJ2ZXRvCisyNDkuMDc0IDQxNC4wMiAyNTAuOTQ1IDQxNi45NDEgMjUzLjUyIDQxOS4wODYgY3VydmV0bworMjUyLjg2MyA0MTYuODQ4IDI1NS4wOTQgNDE1LjMxNiAyNTQuMTkxIDQxMy4zODcgY3VydmV0bworMjUzLjU3NCA0MTIuMDY2IDI1Mi4zMDEgNDEwLjYyOSAyNTEuNjM3IDQwOS4yMTEgY3VydmV0bworMjUwLjU2NiA0MDYuOTE4IDI1MC45NzMgNDAyLjg1MiAyNTMuNTYyIDQwMi44NTIgY3VydmV0bworMjU1Ljg3OSA0MDIuODUyIDI1Ny45MzggNDA1Ljc1IDI1OC43ODUgNDA3LjU1NSBjdXJ2ZXRvCisyNjAuNTEyIDQxMS4yNTQgMjY0LjgzNiA0MjcuMDQzIDI2MC4wMDQgNDI3LjA0MyBjdXJ2ZXRvCisyNTQuNDM4IDQyNy4wNDMgMjQ0Ljg0NCA0MTMuMzQ0IDI0Mi44MzYgNDA5LjA0NyBjdXJ2ZXRvCisyMzkuMjUgNDAxLjM3NSAyNDEuODUyIDM5MS45MyAyNTAuMDIgMzkxLjkzIGN1cnZldG8KKzI1NS41MzkgMzkxLjkzIDI2MC4wNzggMzk3LjI4OSAyNjIuMjcgNDAxLjk4IGN1cnZldG8KKzI2My41NzggNDA0Ljc3MyAyNjQuMjg5IDQwNy41NTUgMjY0LjU3IDQxMC4xNzYgY3VydmV0bworMjY1LjY0MSA0MTAuMzc1IGxpbmV0bworMjY1Ljg3OSA0MDMuMTU2IDI3My40MzggMzkxLjIwNyAyNzAuMjE5IDM4NC4zMiBjdXJ2ZXRvCisyNjYuMTAyIDM3NS41MDggMjUzLjc4NSAzNzUuNTg2IDI0Ni43NTQgMzcyLjQ2MSBjdXJ2ZXRvCisyNDUuMjczIDM3NS45NTMgMjQzLjI3MyAzNzkuMTk5IDI0MC40NTMgMzgxLjY4IGN1cnZldG8KKzI0Ni43MjcgMzgzLjgwOSAyNjIuMTM3IDM4Ny4zODcgMjY1LjQ5MiAzOTQuNTU5IGN1cnZldG8KKzI2Ni44OTggMzk3LjU3IDI2NS45NDEgNDAyLjU2NiAyNjQuMzEyIDQwNC4yNTggY3VydmV0bworMjY0LjAzNSA0MDMuMTk1IDI2My42NTIgNDAyLjEwOSAyNjMuMTQ1IDQwMS4wMiBjdXJ2ZXRvCisyNjAuMjczIDM5NC44ODMgMjU0LjEyOSAzOTAuMTIxIDI0Ny43OTMgMzkwLjEyMSBjdXJ2ZXRvCisyMzguOTc3IDM5MC4xMjEgMjM1LjIzOCAzOTYuNTIgMjM5LjM4NyA0MDUuMzk4IGN1cnZldG8KKzI0MS44NzkgNDEwLjczIDI1NC41OTggNDI4LjQ2OSAyNjEuMTc2IDQyOC40NjkgY3VydmV0bworIGNsb3NlcGF0aCBzdHJva2UKK25ld3BhdGggMjc2LjI0MiA0MDcuMzA1IG1vdmV0bworMjc2LjU5NCA0MDYuNDM0IDI3Ny42MDkgNDAxLjUxMiAyNzguMzc5IDQwMS41MTIgY3VydmV0bworMjgwLjAzOSA0MDEuNTEyIDI4My4wMzkgNDA2LjA3OCAyODMuODQ4IDQwNy4yNjIgY3VydmV0bworMjg1LjMyNCA0MDYuMjg1IDI4NC41MDQgNDA0LjIzNCAyODcuMjQyIDQwNC4yMzQgY3VydmV0bworMjg4LjQ4IDQwNC4yMzQgMjg5LjEwNSA0MDYuOTMgMjkwLjM5NSA0MDYuOTczIGN1cnZldG8KKzI5MC40NDEgNDA1Ljg4MyAyOTAuNTA4IDQwNC44OTggMjg5LjkyMiA0MDMuNjQxIGN1cnZldG8KKzI4OS4wMTIgNDAxLjY5OSAyODYuNzE5IDM5OS4wNjYgMjg0LjQ2MSAzOTkuMDY2IGN1cnZldG8KKzI4Mi44NDQgMzk5LjA2NiAyODAuNTk0IDQwMS4wMzEgMjgwLjE1MiA0MDEuMDMxIGN1cnZldG8KKzI3OS42NzIgNDAxLjAzMSAyNzguNzg5IDQwMC44MDUgMjc4LjUwOCA0MDAuMjAzIGN1cnZldG8KKzI3Ny4zMzIgMzk3LjY5MSAyODAuNDc3IDM4OS4yOTcgMjgzLjYyNSAzODkuMjk3IGN1cnZldG8KKzI4NS4zMDkgMzg5LjI5NyAyODcuMzE2IDM5MC41NDMgMjg5LjA3OCAzOTEuMzEyIGN1cnZldG8KKzI4OC42MjEgMzg4LjI4OSAyODguNTU5IDM4NS43MzggMjg5LjE2NCAzODMuMTMzIGN1cnZldG8KKzI4Ny41NTkgMzgyLjEwOSAyODUuNjggMzgxLjY3NiAyODQuMTcyIDM4MS42NzYgY3VydmV0bworMjc2LjQzIDM4MS42NzYgMjgwLjY5OSAzOTkuODU5IDI3My41NTkgNDAzLjczNCBjdXJ2ZXRvCisyNzYuMjQyIDQwNy4zMDUgbGluZXRvCisgY2xvc2VwYXRoIGZpbGwKK25ld3BhdGggMjc2LjI0MiA0MDcuMzA1IG1vdmV0bworMjc2LjU5NCA0MDYuNDM0IDI3Ny42MDkgNDAxLjUxMiAyNzguMzc5IDQwMS41MTIgY3VydmV0bworMjgwLjAzOSA0MDEuNTEyIDI4My4wMzkgNDA2LjA3OCAyODMuODQ4IDQwNy4yNjIgY3VydmV0bworMjg1LjMyNCA0MDYuMjg1IDI4NC41MDQgNDA0LjIzNCAyODcuMjQyIDQwNC4yMzQgY3VydmV0bworMjg4LjQ4IDQwNC4yMzQgMjg5LjEwNSA0MDYuOTMgMjkwLjM5NSA0MDYuOTczIGN1cnZldG8KKzI5MC40NDEgNDA1Ljg4MyAyOTAuNTA4IDQwNC44OTggMjg5LjkyMiA0MDMuNjQxIGN1cnZldG8KKzI4OS4wMTIgNDAxLjY5OSAyODYuNzE5IDM5OS4wNjYgMjg0LjQ2MSAzOTkuMDY2IGN1cnZldG8KKzI4Mi44NDQgMzk5LjA2NiAyODAuNTk0IDQwMS4wMzEgMjgwLjE1MiA0MDEuMDMxIGN1cnZldG8KKzI3OS42NzIgNDAxLjAzMSAyNzguNzg5IDQwMC44MDUgMjc4LjUwOCA0MDAuMjAzIGN1cnZldG8KKzI3Ny4zMzIgMzk3LjY5MSAyODAuNDc3IDM4OS4yOTcgMjgzLjYyNSAzODkuMjk3IGN1cnZldG8KKzI4NS4zMDkgMzg5LjI5NyAyODcuMzE2IDM5MC41NDMgMjg5LjA3OCAzOTEuMzEyIGN1cnZldG8KKzI4OC42MjEgMzg4LjI4OSAyODguNTU5IDM4NS43MzggMjg5LjE2NCAzODMuMTMzIGN1cnZldG8KKzI4Ny41NTkgMzgyLjEwOSAyODUuNjggMzgxLjY3NiAyODQuMTcyIDM4MS42NzYgY3VydmV0bworMjc2LjQzIDM4MS42NzYgMjgwLjY5OSAzOTkuODU5IDI3My41NTkgNDAzLjczNCBjdXJ2ZXRvCisyNzYuMjQyIDQwNy4zMDUgbGluZXRvCisgY2xvc2VwYXRoIHN0cm9rZQorbmV3cGF0aCAzMDYgNDA4Ljc2MiBtb3ZldG8KKzMxMS44NTIgNDA4Ljc2MiAzMTQuMTYgMzk4LjEzMyAzMTEuNTM1IDM5Mi41MTYgY3VydmV0bworMzA5LjUgMzg4LjE2IDMwNS44ODcgMzg1IDMwMS4yNjIgMzg1IGN1cnZldG8KKzI5My4wOSAzODUgMjk0LjExMyAzOTYuMjQ2IDI5Ny4zMDEgNDAzLjA2NiBjdXJ2ZXRvCisyOTguMTggNDA0Ljk0NSAzMDEuMTg0IDQwOS4wMzkgMzAzLjUzMSA0MDkuMDM5IGN1cnZldG8KKzMwNC4zOTUgNDA5LjAzOSAzMDUuMTEzIDQwOC43NjIgMzA2IDQwOC43NjIgY3VydmV0bworIGNsb3NlcGF0aCBmaWxsCituZXdwYXRoIDMwNS44MTYgNDA3Ljc3IG1vdmV0bworMzA0Ljg5OCA0MDcuNzcgMzA0LjA4NiA0MDcuMzA5IDMwMy42NiA0MDYuMzk1IGN1cnZldG8KKzMwMi43NjIgNDA0LjQ3NyAzMDcuMjM0IDQwMi41MzUgMzA2LjU5NCA0MDEuMTY0IGN1cnZldG8KKzMwNi4xODggNDAwLjMwMSAzMDQuNjUyIDM5OS40OTIgMzAzLjg3NSAzOTkuNDkyIGN1cnZldG8KKzI5OS45OTYgMzk5LjQ5MiAzMDAuMDMxIDQwNC41ODYgMzAyLjM0IDQwNy45MDYgY3VydmV0bworMzAwLjkwNiA0MDYuOTggMjk5Ljk2MSA0MDUuNTcgMjk5LjM1MiA0MDQuMjU4IGN1cnZldG8KKzI5Ny4wNzggMzk5LjM5OCAyOTguODgzIDM5Mi43MTEgMzA0LjA2NiAzOTIuNzExIGN1cnZldG8KKzMwNi45MzQgMzkyLjcxMSAzMTAuMjMgMzk1LjMxMiAzMTEuNTEyIDM5OC4wNTUgY3VydmV0bworMzEzLjA5NCA0MDEuNDMgMzA5LjA1OSA0MDcuNzcgMzA1LjgxNiA0MDcuNzcgY3VydmV0bworIGNsb3NlcGF0aCBmaWxsCituZXdwYXRoIDMwNiA0MDguNzYyIG1vdmV0bworMzExLjg1MiA0MDguNzYyIDMxNC4xNiAzOTguMTMzIDMxMS41MzUgMzkyLjUxNiBjdXJ2ZXRvCiszMDkuNSAzODguMTYgMzA1Ljg4NyAzODUgMzAxLjI2MiAzODUgY3VydmV0bworMjkzLjA5IDM4NSAyOTQuMTEzIDM5Ni4yNDYgMjk3LjMwMSA0MDMuMDY2IGN1cnZldG8KKzI5OC4xOCA0MDQuOTQ1IDMwMS4xODQgNDA5LjAzOSAzMDMuNTMxIDQwOS4wMzkgY3VydmV0bworMzA0LjM5NSA0MDkuMDM5IDMwNS4xMTMgNDA4Ljc2MiAzMDYgNDA4Ljc2MiBjdXJ2ZXRvCisgY2xvc2VwYXRoIHN0cm9rZQorbmV3cGF0aCAzMDUuODE2IDQwNy43NyBtb3ZldG8KKzMwNC44OTggNDA3Ljc3IDMwNC4wODYgNDA3LjMwOSAzMDMuNjYgNDA2LjM5NSBjdXJ2ZXRvCiszMDIuNzYyIDQwNC40NzcgMzA3LjIzNCA0MDIuNTM1IDMwNi41OTQgNDAxLjE2NCBjdXJ2ZXRvCiszMDYuMTg4IDQwMC4zMDEgMzA0LjY1MiAzOTkuNDkyIDMwMy44NzUgMzk5LjQ5MiBjdXJ2ZXRvCisyOTkuOTk2IDM5OS40OTIgMzAwLjAzMSA0MDQuNTg2IDMwMi4zNCA0MDcuOTA2IGN1cnZldG8KKzMwMC45MDYgNDA2Ljk4IDI5OS45NjEgNDA1LjU3IDI5OS4zNTIgNDA0LjI1OCBjdXJ2ZXRvCisyOTcuMDc4IDM5OS4zOTggMjk4Ljg4MyAzOTIuNzExIDMwNC4wNjYgMzkyLjcxMSBjdXJ2ZXRvCiszMDYuOTM0IDM5Mi43MTEgMzEwLjIzIDM5NS4zMTIgMzExLjUxMiAzOTguMDU1IGN1cnZldG8KKzMxMy4wOTQgNDAxLjQzIDMwOS4wNTkgNDA3Ljc3IDMwNS44MTYgNDA3Ljc3IGN1cnZldG8KKyBjbG9zZXBhdGggc3Ryb2tlCituZXdwYXRoIDMzMi41OSAzOTEuMjYyIG1vdmV0bworMzMxLjA2MiAzODcuOTkyIDMyOC4yMTEgMzg2LjE5NSAzMjUuMDA0IDM4Ni4xOTUgY3VydmV0bworMzE0LjgyNCAzODYuMTk1IDMxMi44MDUgMzk1LjU3IDMxNy4yMTUgNDA1LjAxMiBjdXJ2ZXRvCiszMTguMjU4IDQwNy4yMzggMzE5Ljk2OSA0MDkuNzAzIDMyMi41NzggNDA5LjcwMyBjdXJ2ZXRvCiszMzAuNzU4IDQwOS43MDMgMzM2LjQ1MyAzOTkuNTMxIDMzMi41OSAzOTEuMjYyIGN1cnZldG8KKyBjbG9zZXBhdGggZmlsbAorbmV3cGF0aCAzMjQuNDY5IDQwOC41MiBtb3ZldG8KKzMyMy43MTUgNDA4LjUyIDMyMy4wNTkgNDA4LjI0NiAzMjIuNjk1IDQwNy40NzcgY3VydmV0bworMzIxLjkwNiA0MDUuNzgxIDMyNi4yMTEgNDA0LjI3IDMyNi4yMTkgNDAyLjUxNiBjdXJ2ZXRvCiszMjUuNzcgNDAxLjk4IDMyNC41MDggNDAxLjM3OSAzMjMuOTYxIDQwMS4zNzkgY3VydmV0bworMzIwLjg1OSA0MDEuMzc5IDMxOC41MTYgNDA1LjYyNSAzMjEuMTY0IDQwOC43ODEgY3VydmV0bworMzIwLjA5IDQwOC4wOTQgMzE5LjQ0OSA0MDcuMDYyIDMxOSA0MDYuMDkgY3VydmV0bworMzE2LjMxMiA0MDAuMzQ0IDMyMC4xNDEgMzk0LjUzNSAzMjUuNzE5IDM5NC41MzUgY3VydmV0bworMzI4LjA0MyAzOTQuNTM1IDMzMS4wMzUgMzk1Ljg0IDMzMi4yNDIgMzk4LjQyMiBjdXJ2ZXRvCiszMzMuOTQ5IDQwMi4wNzQgMzI3Ljg2NyA0MDguNTIgMzI0LjQ2OSA0MDguNTIgY3VydmV0bworIGNsb3NlcGF0aCBmaWxsCituZXdwYXRoIDMzMi41OSAzOTEuMjYyIG1vdmV0bworMzMxLjA2MiAzODcuOTkyIDMyOC4yMTEgMzg2LjE5NSAzMjUuMDA0IDM4Ni4xOTUgY3VydmV0bworMzE0LjgyNCAzODYuMTk1IDMxMi44MDUgMzk1LjU3IDMxNy4yMTUgNDA1LjAxMiBjdXJ2ZXRvCiszMTguMjU4IDQwNy4yMzggMzE5Ljk2OSA0MDkuNzAzIDMyMi41NzggNDA5LjcwMyBjdXJ2ZXRvCiszMzAuNzU4IDQwOS43MDMgMzM2LjQ1MyAzOTkuNTMxIDMzMi41OSAzOTEuMjYyIGN1cnZldG8KKyBjbG9zZXBhdGggc3Ryb2tlCituZXdwYXRoIDMyNC40NjkgNDA4LjUyIG1vdmV0bworMzIzLjcxNSA0MDguNTIgMzIzLjA1OSA0MDguMjQ2IDMyMi42OTUgNDA3LjQ3NyBjdXJ2ZXRvCiszMjEuOTA2IDQwNS43ODEgMzI2LjIxMSA0MDQuMjcgMzI2LjIxOSA0MDIuNTE2IGN1cnZldG8KKzMyNS43NyA0MDEuOTggMzI0LjUwOCA0MDEuMzc5IDMyMy45NjEgNDAxLjM3OSBjdXJ2ZXRvCiszMjAuODU5IDQwMS4zNzkgMzE4LjUxNiA0MDUuNjI1IDMyMS4xNjQgNDA4Ljc4MSBjdXJ2ZXRvCiszMjAuMDkgNDA4LjA5NCAzMTkuNDQ5IDQwNy4wNjIgMzE5IDQwNi4wOSBjdXJ2ZXRvCiszMTYuMzEyIDQwMC4zNDQgMzIwLjE0MSAzOTQuNTM1IDMyNS43MTkgMzk0LjUzNSBjdXJ2ZXRvCiszMjguMDQzIDM5NC41MzUgMzMxLjAzNSAzOTUuODQgMzMyLjI0MiAzOTguNDIyIGN1cnZldG8KKzMzMy45NDkgNDAyLjA3NCAzMjcuODY3IDQwOC41MiAzMjQuNDY5IDQwOC41MiBjdXJ2ZXRvCisgY2xvc2VwYXRoIHN0cm9rZQorbmV3cGF0aCAzNDMuMTIxIDQwOC41NzQgbW92ZXRvCiszNTEuODkxIDQwOC41NzQgMzU2LjM1MiAzOTIuMzE2IDM1Mi40MyAzODMuOTMgY3VydmV0bworMzUxLjY4IDM4Mi4zMjQgMzUwLjI4NSAzODAuNzIzIDM0OC40NDEgMzgwLjcyMyBjdXJ2ZXRvCiszMzguNDE4IDM4MC43MjMgMzQwLjk3NyA0MDAuODQ4IDMzNS4zMzIgNDA2LjU2MiBjdXJ2ZXRvCiszMzUuODUyIDQwNy4xMTcgMzM2LjM0NCA0MDcuNjk1IDMzNi43OTcgNDA4LjI3NyBjdXJ2ZXRvCiszNDAuNjA5IDQwMy43NTggMzM4LjcxNSAzOTEuODY3IDM0Ni44NTkgMzkxLjg2NyBjdXJ2ZXRvCiszNDguNzM0IDM5MS44NjcgMzUwLjE1NiAzOTMuNTIzIDM1MC45MSAzOTUuMTQ1IGN1cnZldG8KKzM1Mi45MzQgMzk5LjQ3MyAzNDkuMTkxIDQwNi45ODQgMzQ1LjA5OCA0MDYuOTg0IGN1cnZldG8KKzM0NS4wNTUgNDA2Ljk4NCAzNDQuNDY1IDQwNi45NjEgMzQ0LjQ4IDQwNi43MTkgY3VydmV0bworMzQ0LjYyOSA0MDMuOTU3IDM0Ni43ODEgNDA1LjY4IDM0NC42MTcgNDAwLjk4IGN1cnZldG8KKzM0Mi40MDIgNDAxLjQyNiAzNDAuMDU5IDQwNS4wMTYgMzQxLjI2NiA0MDcuNjA1IGN1cnZldG8KKzM0MS42MjUgNDA4LjM2MyAzNDIuNTE2IDQwOC41NzQgMzQzLjEyMSA0MDguNTc0IGN1cnZldG8KKyBjbG9zZXBhdGggZmlsbAorbmV3cGF0aCAzNDMuMTIxIDQwOC41NzQgbW92ZXRvCiszNTEuODkxIDQwOC41NzQgMzU2LjM1MiAzOTIuMzE2IDM1Mi40MyAzODMuOTMgY3VydmV0bworMzUxLjY4IDM4Mi4zMjQgMzUwLjI4NSAzODAuNzIzIDM0OC40NDEgMzgwLjcyMyBjdXJ2ZXRvCiszMzguNDE4IDM4MC43MjMgMzQwLjk3NyA0MDAuODQ4IDMzNS4zMzIgNDA2LjU2MiBjdXJ2ZXRvCiszMzUuODUyIDQwNy4xMTcgMzM2LjM0NCA0MDcuNjk1IDMzNi43OTcgNDA4LjI3NyBjdXJ2ZXRvCiszNDAuNjA5IDQwMy43NTggMzM4LjcxNSAzOTEuODY3IDM0Ni44NTkgMzkxLjg2NyBjdXJ2ZXRvCiszNDguNzM0IDM5MS44NjcgMzUwLjE1NiAzOTMuNTIzIDM1MC45MSAzOTUuMTQ1IGN1cnZldG8KKzM1Mi45MzQgMzk5LjQ3MyAzNDkuMTkxIDQwNi45ODQgMzQ1LjA5OCA0MDYuOTg0IGN1cnZldG8KKzM0NS4wNTUgNDA2Ljk4NCAzNDQuNDY1IDQwNi45NjEgMzQ0LjQ4IDQwNi43MTkgY3VydmV0bworMzQ0LjYyOSA0MDMuOTU3IDM0Ni43ODEgNDA1LjY4IDM0NC42MTcgNDAwLjk4IGN1cnZldG8KKzM0Mi40MDIgNDAxLjQyNiAzNDAuMDU5IDQwNS4wMTYgMzQxLjI2NiA0MDcuNjA1IGN1cnZldG8KKzM0MS42MjUgNDA4LjM2MyAzNDIuNTE2IDQwOC41NzQgMzQzLjEyMSA0MDguNTc0IGN1cnZldG8KKyBjbG9zZXBhdGggc3Ryb2tlCituZXdwYXRoIDM2NC45MzggNDA4Ljc1OCBtb3ZldG8KKzM2NS43NjIgNDA4LjY4IDM2Ny4wMDQgNDA4Ljc1NCAzNjcuNzExIDQwOC41MzUgY3VydmV0bworMzY3Ljg0OCA0MDguNDk2IDM2Ny43NDYgNDA4LjMyOCAzNjcuNzY2IDQwOC4xOTUgY3VydmV0bworMzY3Ljk4NCA0MDYuOTY1IDM2OC4zMiA0MDUuODAxIDM2OC42MTcgNDA0LjYxMyBjdXJ2ZXRvCiszNjkuNzU4IDM5OS45ODggMzcwLjQ0NSAzOTUuMjM4IDM3MS43NTggMzkwLjY1MiBjdXJ2ZXRvCiszNzMuMTg0IDM4NS42NiAzNzQuNjcyIDM4MC4wMzUgMzcyLjk0NSAzNzMuNzcgY3VydmV0bworMzcyLjc3NyAzNzMuMTU2IDM3Mi41NTEgMzcyLjUzNSAzNzIuMjU4IDM3MS45MSBjdXJ2ZXRvCiszNzAuMzAxIDM2Ny43MTkgMzY1LjI2MiAzNjMuNzMgMzYwLjg1OSAzNjMuNzMgY3VydmV0bworMzYwLjMyIDM2My43MyAzNTkuNzQ2IDM2My44ODMgMzU5LjQ4OCAzNjQuMjM0IGN1cnZldG8KKzM2MS4zNDggMzY1LjQyNiAzNjIuNTEyIDM2Ni42NDggMzYzLjM0NCAzNjguNDI2IGN1cnZldG8KKzM2NC4zMzYgMzcwLjU1OSAzNjQuMzIgMzcyLjU1MSAzNjQuMTkxIDM3NC4zODcgY3VydmV0bworMzY0LjU0MyAzNzQuMTg0IDM2NS42NzIgMzczLjY2NCAzNjYuMTQxIDM3My42NjQgY3VydmV0bworMzY4LjA0NyAzNzMuNjY0IDM2OS42ODQgMzc1LjUyMyAzNzAuNDQ1IDM3Ny4xNiBjdXJ2ZXRvCiszNzEuODUyIDM4MC4xNjQgMzcxLjYxMyAzODMuMjMgMzcxLjM2NyAzODUuNzg5IGN1cnZldG8KKzM3MS4yNDYgMzg3LjA2NiAzNzEuMDc0IDM4OC4zMjggMzcwLjg0IDM4OS41NTkgY3VydmV0bworMzcwLjQ4IDM5MS4zMzIgbGluZXRvCiszNzAuNDM4IDM5MS41MzEgbGluZXRvCiszNzAuMzkxIDM5MS43MjMgbGluZXRvCiszNzAuNjA1IDM5MS43MjMgMzcwLjQxNCAzOTEuMzQ4IDM3MC40MjIgMzkxLjE1NiBjdXJ2ZXRvCiszNzAuNTU1IDM4OC4wNTkgMzcwLjUgMzgzLjczOCAzNjguODUyIDM4MC4yMTEgY3VydmV0bworMzY4LjA4NiAzNzguNTc0IDM2Ni44MzIgMzc2Ljg4NyAzNjQuOTEgMzc2Ljg4NyBjdXJ2ZXRvCiszNTYuNDg4IDM3Ni44ODcgMzYwLjcyMyA0MDEuMDE2IDM1My45NzMgNDA2Ljc1IGN1cnZldG8KKzM1NC4zNDggNDA3LjM3NSAzNTQuNjggNDA4LjAxNiAzNTQuOTYxIDQwOC42NDUgY3VydmV0bworMzU4Ljk1MyA0MDMuNzczIDM1OS4xNjQgMzkwLjM0IDM2NS4wNDcgMzkwLjM0IGN1cnZldG8KKzM2Ni40NzMgMzkwLjM0IDM2Ny45NDUgMzkxLjY5MSAzNjguNTU1IDM5Mi45ODggY3VydmV0bworMzcxLjE2OCAzOTguNTc4IDM2Ni44MjQgNDA1LjA4NiAzNjQuOTM4IDQwOC43NTggY3VydmV0bworIGNsb3NlcGF0aCBmaWxsCituZXdwYXRoIDM2NC45MzggNDA4Ljc1OCBtb3ZldG8KKzM2NS43NjIgNDA4LjY4IDM2Ny4wMDQgNDA4Ljc1NCAzNjcuNzExIDQwOC41MzUgY3VydmV0bworMzY3Ljg0OCA0MDguNDk2IDM2Ny43NDYgNDA4LjMyOCAzNjcuNzY2IDQwOC4xOTUgY3VydmV0bworMzY3Ljk4NCA0MDYuOTY1IDM2OC4zMiA0MDUuODAxIDM2OC42MTcgNDA0LjYxMyBjdXJ2ZXRvCiszNjkuNzU4IDM5OS45ODggMzcwLjQ0NSAzOTUuMjM4IDM3MS43NTggMzkwLjY1MiBjdXJ2ZXRvCiszNzMuMTg0IDM4NS42NiAzNzQuNjcyIDM4MC4wMzUgMzcyLjk0NSAzNzMuNzcgY3VydmV0bworMzcyLjc3NyAzNzMuMTU2IDM3Mi41NTEgMzcyLjUzNSAzNzIuMjU4IDM3MS45MSBjdXJ2ZXRvCiszNzAuMzAxIDM2Ny43MTkgMzY1LjI2MiAzNjMuNzMgMzYwLjg1OSAzNjMuNzMgY3VydmV0bworMzYwLjMyIDM2My43MyAzNTkuNzQ2IDM2My44ODMgMzU5LjQ4OCAzNjQuMjM0IGN1cnZldG8KKzM2MS4zNDggMzY1LjQyNiAzNjIuNTEyIDM2Ni42NDggMzYzLjM0NCAzNjguNDI2IGN1cnZldG8KKzM2NC4zMzYgMzcwLjU1OSAzNjQuMzIgMzcyLjU1MSAzNjQuMTkxIDM3NC4zODcgY3VydmV0bworMzY0LjU0MyAzNzQuMTg0IDM2NS42NzIgMzczLjY2NCAzNjYuMTQxIDM3My42NjQgY3VydmV0bworMzY4LjA0NyAzNzMuNjY0IDM2OS42ODQgMzc1LjUyMyAzNzAuNDQ1IDM3Ny4xNiBjdXJ2ZXRvCiszNzEuODUyIDM4MC4xNjQgMzcxLjYxMyAzODMuMjMgMzcxLjM2NyAzODUuNzg5IGN1cnZldG8KKzM3MS4yNDYgMzg3LjA2NiAzNzEuMDc0IDM4OC4zMjggMzcwLjg0IDM4OS41NTkgY3VydmV0bworMzcwLjQ4IDM5MS4zMzIgbGluZXRvCiszNzAuNDM4IDM5MS41MzEgbGluZXRvCiszNzAuMzkxIDM5MS43MjMgbGluZXRvCiszNzAuNjA1IDM5MS43MjMgMzcwLjQxNCAzOTEuMzQ4IDM3MC40MjIgMzkxLjE1NiBjdXJ2ZXRvCiszNzAuNTU1IDM4OC4wNTkgMzcwLjUgMzgzLjczOCAzNjguODUyIDM4MC4yMTEgY3VydmV0bworMzY4LjA4NiAzNzguNTc0IDM2Ni44MzIgMzc2Ljg4NyAzNjQuOTEgMzc2Ljg4NyBjdXJ2ZXRvCiszNTYuNDg4IDM3Ni44ODcgMzYwLjcyMyA0MDEuMDE2IDM1My45NzMgNDA2Ljc1IGN1cnZldG8KKzM1NC4zNDggNDA3LjM3NSAzNTQuNjggNDA4LjAxNiAzNTQuOTYxIDQwOC42NDUgY3VydmV0bworMzU4Ljk1MyA0MDMuNzczIDM1OS4xNjQgMzkwLjM0IDM2NS4wNDcgMzkwLjM0IGN1cnZldG8KKzM2Ni40NzMgMzkwLjM0IDM2Ny45NDUgMzkxLjY5MSAzNjguNTU1IDM5Mi45ODggY3VydmV0bworMzcxLjE2OCAzOTguNTc4IDM2Ni44MjQgNDA1LjA4NiAzNjQuOTM4IDQwOC43NTggY3VydmV0bworIGNsb3NlcGF0aCBzdHJva2UKK25ld3BhdGggMjYxLjE3NiA0MjguNDY5IG1vdmV0bworMjY2Ljk2OSA0MjguNDY5IDI2My41OTQgNDEzLjg0OCAyNjEuNTMxIDQwOS40MzggY3VydmV0bworMjU5Ljc3IDQwNS42NjQgMjU1Ljc5NyA0MDAuMjE5IDI1MS4wODYgNDAwLjIxOSBjdXJ2ZXRvCisyNDUuNDQxIDQwMC4yMTkgMjQ1LjYwOSA0MDYuNjA1IDI0Ny44NTUgNDExLjQxOCBjdXJ2ZXRvCisyNDkuMDc0IDQxNC4wMiAyNTAuOTQ1IDQxNi45NDEgMjUzLjUyIDQxOS4wODYgY3VydmV0bworMjUyLjg2MyA0MTYuODQ4IDI1NS4wOTQgNDE1LjMxNiAyNTQuMTkxIDQxMy4zODcgY3VydmV0bworMjUzLjU3NCA0MTIuMDY2IDI1Mi4zMDEgNDEwLjYyOSAyNTEuNjM3IDQwOS4yMTEgY3VydmV0bworMjUwLjU2NiA0MDYuOTE4IDI1MC45NzMgNDAyLjg1MiAyNTMuNTYyIDQwMi44NTIgY3VydmV0bworMjU1Ljg3OSA0MDIuODUyIDI1Ny45MzggNDA1Ljc1IDI1OC43ODUgNDA3LjU1NSBjdXJ2ZXRvCisyNjAuNTEyIDQxMS4yNTQgMjY0LjgzNiA0MjcuMDQzIDI2MC4wMDQgNDI3LjA0MyBjdXJ2ZXRvCisyNTQuNDM4IDQyNy4wNDMgMjQ0Ljg0NCA0MTMuMzQ0IDI0Mi44MzYgNDA5LjA0NyBjdXJ2ZXRvCisyMzkuMjUgNDAxLjM3NSAyNDEuODUyIDM5MS45MyAyNTAuMDIgMzkxLjkzIGN1cnZldG8KKzI1NS41MzkgMzkxLjkzIDI2MC4wNzggMzk3LjI4OSAyNjIuMjcgNDAxLjk4IGN1cnZldG8KKzI2My41NzggNDA0Ljc3MyAyNjQuMjg5IDQwNy41NTUgMjY0LjU3IDQxMC4xNzYgY3VydmV0bworMjY1LjY0MSA0MTAuMzc1IGxpbmV0bworMjY1Ljg3OSA0MDMuMTU2IDI3My40MzggMzkxLjIwNyAyNzAuMjE5IDM4NC4zMiBjdXJ2ZXRvCisyNjYuMTAyIDM3NS41MDggMjUzLjc4NSAzNzUuNTg2IDI0Ni43NTQgMzcyLjQ2MSBjdXJ2ZXRvCisyNDUuMjczIDM3NS45NTMgMjQzLjI3MyAzNzkuMTk5IDI0MC40NTMgMzgxLjY4IGN1cnZldG8KKzI0Ni43MjcgMzgzLjgwOSAyNjIuMTM3IDM4Ny4zODcgMjY1LjQ5MiAzOTQuNTU5IGN1cnZldG8KKzI2Ni44OTggMzk3LjU3IDI2NS45NDEgNDAyLjU2NiAyNjQuMzEyIDQwNC4yNTggY3VydmV0bworMjY0LjAzNSA0MDMuMTk1IDI2My42NTIgNDAyLjEwOSAyNjMuMTQ1IDQwMS4wMiBjdXJ2ZXRvCisyNjAuMjczIDM5NC44ODMgMjU0LjEyOSAzOTAuMTIxIDI0Ny43OTMgMzkwLjEyMSBjdXJ2ZXRvCisyMzguOTc3IDM5MC4xMjEgMjM1LjIzOCAzOTYuNTIgMjM5LjM4NyA0MDUuMzk4IGN1cnZldG8KKzI0MS44NzkgNDEwLjczIDI1NC41OTggNDI4LjQ2OSAyNjEuMTc2IDQyOC40NjkgY3VydmV0bworIGNsb3NlcGF0aCBmaWxsCisgMCA5Ljc1MzQgZHRyYW5zZm9ybSB0cnVuY2F0ZSBpZHRyYW5zZm9ybSBzZXRsaW5ld2lkdGggcG9wIDEgc2V0bGluZWpvaW4KK25ld3BhdGggMjYxLjE3NiA0MjguNDY5IG1vdmV0bworMjY2Ljk2OSA0MjguNDY5IDI2My41OTQgNDEzLjg0OCAyNjEuNTMxIDQwOS40MzggY3VydmV0bworMjU5Ljc3IDQwNS42NjQgMjU1Ljc5NyA0MDAuMjE5IDI1MS4wODYgNDAwLjIxOSBjdXJ2ZXRvCisyNDUuNDQxIDQwMC4yMTkgMjQ1LjYwOSA0MDYuNjA1IDI0Ny44NTUgNDExLjQxOCBjdXJ2ZXRvCisyNDkuMDc0IDQxNC4wMiAyNTAuOTQ1IDQxNi45NDEgMjUzLjUyIDQxOS4wODYgY3VydmV0bworMjUyLjg2MyA0MTYuODQ4IDI1NS4wOTQgNDE1LjMxNiAyNTQuMTkxIDQxMy4zODcgY3VydmV0bworMjUzLjU3NCA0MTIuMDY2IDI1Mi4zMDEgNDEwLjYyOSAyNTEuNjM3IDQwOS4yMTEgY3VydmV0bworMjUwLjU2NiA0MDYuOTE4IDI1MC45NzMgNDAyLjg1MiAyNTMuNTYyIDQwMi44NTIgY3VydmV0bworMjU1Ljg3OSA0MDIuODUyIDI1Ny45MzggNDA1Ljc1IDI1OC43ODUgNDA3LjU1NSBjdXJ2ZXRvCisyNjAuNTEyIDQxMS4yNTQgMjY0LjgzNiA0MjcuMDQzIDI2MC4wMDQgNDI3LjA0MyBjdXJ2ZXRvCisyNTQuNDM4IDQyNy4wNDMgMjQ0Ljg0NCA0MTMuMzQ0IDI0Mi44MzYgNDA5LjA0NyBjdXJ2ZXRvCisyMzkuMjUgNDAxLjM3NSAyNDEuODUyIDM5MS45MyAyNTAuMDIgMzkxLjkzIGN1cnZldG8KKzI1NS41MzkgMzkxLjkzIDI2MC4wNzggMzk3LjI4OSAyNjIuMjcgNDAxLjk4IGN1cnZldG8KKzI2My41NzggNDA0Ljc3MyAyNjQuMjg5IDQwNy41NTUgMjY0LjU3IDQxMC4xNzYgY3VydmV0bworMjY1LjY0MSA0MTAuMzc1IGxpbmV0bworMjY1Ljg3OSA0MDMuMTU2IDI3My40MzggMzkxLjIwNyAyNzAuMjE5IDM4NC4zMiBjdXJ2ZXRvCisyNjYuMTAyIDM3NS41MDggMjUzLjc4NSAzNzUuNTg2IDI0Ni43NTQgMzcyLjQ2MSBjdXJ2ZXRvCisyNDUuMjczIDM3NS45NTMgMjQzLjI3MyAzNzkuMTk5IDI0MC40NTMgMzgxLjY4IGN1cnZldG8KKzI0Ni43MjcgMzgzLjgwOSAyNjIuMTM3IDM4Ny4zODcgMjY1LjQ5MiAzOTQuNTU5IGN1cnZldG8KKzI2Ni44OTggMzk3LjU3IDI2NS45NDEgNDAyLjU2NiAyNjQuMzEyIDQwNC4yNTggY3VydmV0bworMjY0LjAzNSA0MDMuMTk1IDI2My42NTIgNDAyLjEwOSAyNjMuMTQ1IDQwMS4wMiBjdXJ2ZXRvCisyNjAuMjczIDM5NC44ODMgMjU0LjEyOSAzOTAuMTIxIDI0Ny43OTMgMzkwLjEyMSBjdXJ2ZXRvCisyMzguOTc3IDM5MC4xMjEgMjM1LjIzOCAzOTYuNTIgMjM5LjM4NyA0MDUuMzk4IGN1cnZldG8KKzI0MS44NzkgNDEwLjczIDI1NC41OTggNDI4LjQ2OSAyNjEuMTc2IDQyOC40NjkgY3VydmV0bworIGNsb3NlcGF0aCBzdHJva2UKK25ld3BhdGggMjc2LjI0MiA0MDcuMzA1IG1vdmV0bworMjc2LjU5NCA0MDYuNDM0IDI3Ny42MDkgNDAxLjUxMiAyNzguMzc5IDQwMS41MTIgY3VydmV0bworMjgwLjAzOSA0MDEuNTEyIDI4My4wMzkgNDA2LjA3OCAyODMuODQ4IDQwNy4yNjIgY3VydmV0bworMjg1LjMyNCA0MDYuMjg1IDI4NC41MDQgNDA0LjIzNCAyODcuMjQyIDQwNC4yMzQgY3VydmV0bworMjg4LjQ4IDQwNC4yMzQgMjg5LjEwNSA0MDYuOTMgMjkwLjM5NSA0MDYuOTczIGN1cnZldG8KKzI5MC40NDEgNDA1Ljg4MyAyOTAuNTA4IDQwNC44OTggMjg5LjkyMiA0MDMuNjQxIGN1cnZldG8KKzI4OS4wMTIgNDAxLjY5OSAyODYuNzE5IDM5OS4wNjYgMjg0LjQ2MSAzOTkuMDY2IGN1cnZldG8KKzI4Mi44NDQgMzk5LjA2NiAyODAuNTk0IDQwMS4wMzEgMjgwLjE1MiA0MDEuMDMxIGN1cnZldG8KKzI3OS42NzIgNDAxLjAzMSAyNzguNzg5IDQwMC44MDUgMjc4LjUwOCA0MDAuMjAzIGN1cnZldG8KKzI3Ny4zMzIgMzk3LjY5MSAyODAuNDc3IDM4OS4yOTcgMjgzLjYyNSAzODkuMjk3IGN1cnZldG8KKzI4NS4zMDkgMzg5LjI5NyAyODcuMzE2IDM5MC41NDMgMjg5LjA3OCAzOTEuMzEyIGN1cnZldG8KKzI4OC42MjEgMzg4LjI4OSAyODguNTU5IDM4NS43MzggMjg5LjE2NCAzODMuMTMzIGN1cnZldG8KKzI4Ny41NTkgMzgyLjEwOSAyODUuNjggMzgxLjY3NiAyODQuMTcyIDM4MS42NzYgY3VydmV0bworMjc2LjQzIDM4MS42NzYgMjgwLjY5OSAzOTkuODU5IDI3My41NTkgNDAzLjczNCBjdXJ2ZXRvCisyNzYuMjQyIDQwNy4zMDUgbGluZXRvCisgY2xvc2VwYXRoIGZpbGwKK25ld3BhdGggMjc2LjI0MiA0MDcuMzA1IG1vdmV0bworMjc2LjU5NCA0MDYuNDM0IDI3Ny42MDkgNDAxLjUxMiAyNzguMzc5IDQwMS41MTIgY3VydmV0bworMjgwLjAzOSA0MDEuNTEyIDI4My4wMzkgNDA2LjA3OCAyODMuODQ4IDQwNy4yNjIgY3VydmV0bworMjg1LjMyNCA0MDYuMjg1IDI4NC41MDQgNDA0LjIzNCAyODcuMjQyIDQwNC4yMzQgY3VydmV0bworMjg4LjQ4IDQwNC4yMzQgMjg5LjEwNSA0MDYuOTMgMjkwLjM5NSA0MDYuOTczIGN1cnZldG8KKzI5MC40NDEgNDA1Ljg4MyAyOTAuNTA4IDQwNC44OTggMjg5LjkyMiA0MDMuNjQxIGN1cnZldG8KKzI4OS4wMTIgNDAxLjY5OSAyODYuNzE5IDM5OS4wNjYgMjg0LjQ2MSAzOTkuMDY2IGN1cnZldG8KKzI4Mi44NDQgMzk5LjA2NiAyODAuNTk0IDQwMS4wMzEgMjgwLjE1MiA0MDEuMDMxIGN1cnZldG8KKzI3OS42NzIgNDAxLjAzMSAyNzguNzg5IDQwMC44MDUgMjc4LjUwOCA0MDAuMjAzIGN1cnZldG8KKzI3Ny4zMzIgMzk3LjY5MSAyODAuNDc3IDM4OS4yOTcgMjgzLjYyNSAzODkuMjk3IGN1cnZldG8KKzI4NS4zMDkgMzg5LjI5NyAyODcuMzE2IDM5MC41NDMgMjg5LjA3OCAzOTEuMzEyIGN1cnZldG8KKzI4OC42MjEgMzg4LjI4OSAyODguNTU5IDM4NS43MzggMjg5LjE2NCAzODMuMTMzIGN1cnZldG8KKzI4Ny41NTkgMzgyLjEwOSAyODUuNjggMzgxLjY3NiAyODQuMTcyIDM4MS42NzYgY3VydmV0bworMjc2LjQzIDM4MS42NzYgMjgwLjY5OSAzOTkuODU5IDI3My41NTkgNDAzLjczNCBjdXJ2ZXRvCisyNzYuMjQyIDQwNy4zMDUgbGluZXRvCisgY2xvc2VwYXRoIHN0cm9rZQorbmV3cGF0aCAzMDYgNDA4Ljc2MiBtb3ZldG8KKzMxMS44NTIgNDA4Ljc2MiAzMTQuMTYgMzk4LjEzMyAzMTEuNTM1IDM5Mi41MTYgY3VydmV0bworMzA5LjUgMzg4LjE2IDMwNS44ODcgMzg1IDMwMS4yNjIgMzg1IGN1cnZldG8KKzI5My4wOSAzODUgMjk0LjExMyAzOTYuMjQ2IDI5Ny4zMDEgNDAzLjA2NiBjdXJ2ZXRvCisyOTguMTggNDA0Ljk0NSAzMDEuMTg0IDQwOS4wMzkgMzAzLjUzMSA0MDkuMDM5IGN1cnZldG8KKzMwNC4zOTUgNDA5LjAzOSAzMDUuMTEzIDQwOC43NjIgMzA2IDQwOC43NjIgY3VydmV0bworIGNsb3NlcGF0aCBmaWxsCituZXdwYXRoIDMwNS44MTYgNDA3Ljc3IG1vdmV0bworMzA0Ljg5OCA0MDcuNzcgMzA0LjA4NiA0MDcuMzA5IDMwMy42NiA0MDYuMzk1IGN1cnZldG8KKzMwMi43NjIgNDA0LjQ3NyAzMDcuMjM0IDQwMi41MzUgMzA2LjU5NCA0MDEuMTY0IGN1cnZldG8KKzMwNi4xODggNDAwLjMwMSAzMDQuNjUyIDM5OS40OTIgMzAzLjg3NSAzOTkuNDkyIGN1cnZldG8KKzI5OS45OTYgMzk5LjQ5MiAzMDAuMDMxIDQwNC41ODYgMzAyLjM0IDQwNy45MDYgY3VydmV0bworMzAwLjkwNiA0MDYuOTggMjk5Ljk2MSA0MDUuNTcgMjk5LjM1MiA0MDQuMjU4IGN1cnZldG8KKzI5Ny4wNzggMzk5LjM5OCAyOTguODgzIDM5Mi43MTEgMzA0LjA2NiAzOTIuNzExIGN1cnZldG8KKzMwNi45MzQgMzkyLjcxMSAzMTAuMjMgMzk1LjMxMiAzMTEuNTEyIDM5OC4wNTUgY3VydmV0bworMzEzLjA5NCA0MDEuNDMgMzA5LjA1OSA0MDcuNzcgMzA1LjgxNiA0MDcuNzcgY3VydmV0bworIGNsb3NlcGF0aCBmaWxsCituZXdwYXRoIDMwNiA0MDguNzYyIG1vdmV0bworMzExLjg1MiA0MDguNzYyIDMxNC4xNiAzOTguMTMzIDMxMS41MzUgMzkyLjUxNiBjdXJ2ZXRvCiszMDkuNSAzODguMTYgMzA1Ljg4NyAzODUgMzAxLjI2MiAzODUgY3VydmV0bworMjkzLjA5IDM4NSAyOTQuMTEzIDM5Ni4yNDYgMjk3LjMwMSA0MDMuMDY2IGN1cnZldG8KKzI5OC4xOCA0MDQuOTQ1IDMwMS4xODQgNDA5LjAzOSAzMDMuNTMxIDQwOS4wMzkgY3VydmV0bworMzA0LjM5NSA0MDkuMDM5IDMwNS4xMTMgNDA4Ljc2MiAzMDYgNDA4Ljc2MiBjdXJ2ZXRvCisgY2xvc2VwYXRoIHN0cm9rZQorbmV3cGF0aCAzMDUuODE2IDQwNy43NyBtb3ZldG8KKzMwNC44OTggNDA3Ljc3IDMwNC4wODYgNDA3LjMwOSAzMDMuNjYgNDA2LjM5NSBjdXJ2ZXRvCiszMDIuNzYyIDQwNC40NzcgMzA3LjIzNCA0MDIuNTM1IDMwNi41OTQgNDAxLjE2NCBjdXJ2ZXRvCiszMDYuMTg4IDQwMC4zMDEgMzA0LjY1MiAzOTkuNDkyIDMwMy44NzUgMzk5LjQ5MiBjdXJ2ZXRvCisyOTkuOTk2IDM5OS40OTIgMzAwLjAzMSA0MDQuNTg2IDMwMi4zNCA0MDcuOTA2IGN1cnZldG8KKzMwMC45MDYgNDA2Ljk4IDI5OS45NjEgNDA1LjU3IDI5OS4zNTIgNDA0LjI1OCBjdXJ2ZXRvCisyOTcuMDc4IDM5OS4zOTggMjk4Ljg4MyAzOTIuNzExIDMwNC4wNjYgMzkyLjcxMSBjdXJ2ZXRvCiszMDYuOTM0IDM5Mi43MTEgMzEwLjIzIDM5NS4zMTIgMzExLjUxMiAzOTguMDU1IGN1cnZldG8KKzMxMy4wOTQgNDAxLjQzIDMwOS4wNTkgNDA3Ljc3IDMwNS44MTYgNDA3Ljc3IGN1cnZldG8KKyBjbG9zZXBhdGggc3Ryb2tlCituZXdwYXRoIDMzMi41OSAzOTEuMjYyIG1vdmV0bworMzMxLjA2MiAzODcuOTkyIDMyOC4yMTEgMzg2LjE5NSAzMjUuMDA0IDM4Ni4xOTUgY3VydmV0bworMzE0LjgyNCAzODYuMTk1IDMxMi44MDUgMzk1LjU3IDMxNy4yMTUgNDA1LjAxMiBjdXJ2ZXRvCiszMTguMjU4IDQwNy4yMzggMzE5Ljk2OSA0MDkuNzAzIDMyMi41NzggNDA5LjcwMyBjdXJ2ZXRvCiszMzAuNzU4IDQwOS43MDMgMzM2LjQ1MyAzOTkuNTMxIDMzMi41OSAzOTEuMjYyIGN1cnZldG8KKyBjbG9zZXBhdGggZmlsbAorbmV3cGF0aCAzMjQuNDY5IDQwOC41MiBtb3ZldG8KKzMyMy43MTUgNDA4LjUyIDMyMy4wNTkgNDA4LjI0NiAzMjIuNjk1IDQwNy40NzcgY3VydmV0bworMzIxLjkwNiA0MDUuNzgxIDMyNi4yMTEgNDA0LjI3IDMyNi4yMTkgNDAyLjUxNiBjdXJ2ZXRvCiszMjUuNzcgNDAxLjk4IDMyNC41MDggNDAxLjM3OSAzMjMuOTYxIDQwMS4zNzkgY3VydmV0bworMzIwLjg1OSA0MDEuMzc5IDMxOC41MTYgNDA1LjYyNSAzMjEuMTY0IDQwOC43ODEgY3VydmV0bworMzIwLjA5IDQwOC4wOTQgMzE5LjQ0OSA0MDcuMDYyIDMxOSA0MDYuMDkgY3VydmV0bworMzE2LjMxMiA0MDAuMzQ0IDMyMC4xNDEgMzk0LjUzNSAzMjUuNzE5IDM5NC41MzUgY3VydmV0bworMzI4LjA0MyAzOTQuNTM1IDMzMS4wMzUgMzk1Ljg0IDMzMi4yNDIgMzk4LjQyMiBjdXJ2ZXRvCiszMzMuOTQ5IDQwMi4wNzQgMzI3Ljg2NyA0MDguNTIgMzI0LjQ2OSA0MDguNTIgY3VydmV0bworIGNsb3NlcGF0aCBmaWxsCituZXdwYXRoIDMzMi41OSAzOTEuMjYyIG1vdmV0bworMzMxLjA2MiAzODcuOTkyIDMyOC4yMTEgMzg2LjE5NSAzMjUuMDA0IDM4Ni4xOTUgY3VydmV0bworMzE0LjgyNCAzODYuMTk1IDMxMi44MDUgMzk1LjU3IDMxNy4yMTUgNDA1LjAxMiBjdXJ2ZXRvCiszMTguMjU4IDQwNy4yMzggMzE5Ljk2OSA0MDkuNzAzIDMyMi41NzggNDA5LjcwMyBjdXJ2ZXRvCiszMzAuNzU4IDQwOS43MDMgMzM2LjQ1MyAzOTkuNTMxIDMzMi41OSAzOTEuMjYyIGN1cnZldG8KKyBjbG9zZXBhdGggc3Ryb2tlCituZXdwYXRoIDMyNC40NjkgNDA4LjUyIG1vdmV0bworMzIzLjcxNSA0MDguNTIgMzIzLjA1OSA0MDguMjQ2IDMyMi42OTUgNDA3LjQ3NyBjdXJ2ZXRvCiszMjEuOTA2IDQwNS43ODEgMzI2LjIxMSA0MDQuMjcgMzI2LjIxOSA0MDIuNTE2IGN1cnZldG8KKzMyNS43NyA0MDEuOTggMzI0LjUwOCA0MDEuMzc5IDMyMy45NjEgNDAxLjM3OSBjdXJ2ZXRvCiszMjAuODU5IDQwMS4zNzkgMzE4LjUxNiA0MDUuNjI1IDMyMS4xNjQgNDA4Ljc4MSBjdXJ2ZXRvCiszMjAuMDkgNDA4LjA5NCAzMTkuNDQ5IDQwNy4wNjIgMzE5IDQwNi4wOSBjdXJ2ZXRvCiszMTYuMzEyIDQwMC4zNDQgMzIwLjE0MSAzOTQuNTM1IDMyNS43MTkgMzk0LjUzNSBjdXJ2ZXRvCiszMjguMDQzIDM5NC41MzUgMzMxLjAzNSAzOTUuODQgMzMyLjI0MiAzOTguNDIyIGN1cnZldG8KKzMzMy45NDkgNDAyLjA3NCAzMjcuODY3IDQwOC41MiAzMjQuNDY5IDQwOC41MiBjdXJ2ZXRvCisgY2xvc2VwYXRoIHN0cm9rZQorbmV3cGF0aCAzNDMuMTIxIDQwOC41NzQgbW92ZXRvCiszNTEuODkxIDQwOC41NzQgMzU2LjM1MiAzOTIuMzE2IDM1Mi40MyAzODMuOTMgY3VydmV0bworMzUxLjY4IDM4Mi4zMjQgMzUwLjI4NSAzODAuNzIzIDM0OC40NDEgMzgwLjcyMyBjdXJ2ZXRvCiszMzguNDE4IDM4MC43MjMgMzQwLjk3NyA0MDAuODQ4IDMzNS4zMzIgNDA2LjU2MiBjdXJ2ZXRvCiszMzUuODUyIDQwNy4xMTcgMzM2LjM0NCA0MDcuNjk1IDMzNi43OTcgNDA4LjI3NyBjdXJ2ZXRvCiszNDAuNjA5IDQwMy43NTggMzM4LjcxNSAzOTEuODY3IDM0Ni44NTkgMzkxLjg2NyBjdXJ2ZXRvCiszNDguNzM0IDM5MS44NjcgMzUwLjE1NiAzOTMuNTIzIDM1MC45MSAzOTUuMTQ1IGN1cnZldG8KKzM1Mi45MzQgMzk5LjQ3MyAzNDkuMTkxIDQwNi45ODQgMzQ1LjA5OCA0MDYuOTg0IGN1cnZldG8KKzM0NS4wNTUgNDA2Ljk4NCAzNDQuNDY1IDQwNi45NjEgMzQ0LjQ4IDQwNi43MTkgY3VydmV0bworMzQ0LjYyOSA0MDMuOTU3IDM0Ni43ODEgNDA1LjY4IDM0NC42MTcgNDAwLjk4IGN1cnZldG8KKzM0Mi40MDIgNDAxLjQyNiAzNDAuMDU5IDQwNS4wMTYgMzQxLjI2NiA0MDcuNjA1IGN1cnZldG8KKzM0MS42MjUgNDA4LjM2MyAzNDIuNTE2IDQwOC41NzQgMzQzLjEyMSA0MDguNTc0IGN1cnZldG8KKyBjbG9zZXBhdGggZmlsbAorbmV3cGF0aCAzNDMuMTIxIDQwOC41NzQgbW92ZXRvCiszNTEuODkxIDQwOC41NzQgMzU2LjM1MiAzOTIuMzE2IDM1Mi40MyAzODMuOTMgY3VydmV0bworMzUxLjY4IDM4Mi4zMjQgMzUwLjI4NSAzODAuNzIzIDM0OC40NDEgMzgwLjcyMyBjdXJ2ZXRvCiszMzguNDE4IDM4MC43MjMgMzQwLjk3NyA0MDAuODQ4IDMzNS4zMzIgNDA2LjU2MiBjdXJ2ZXRvCiszMzUuODUyIDQwNy4xMTcgMzM2LjM0NCA0MDcuNjk1IDMzNi43OTcgNDA4LjI3NyBjdXJ2ZXRvCiszNDAuNjA5IDQwMy43NTggMzM4LjcxNSAzOTEuODY3IDM0Ni44NTkgMzkxLjg2NyBjdXJ2ZXRvCiszNDguNzM0IDM5MS44NjcgMzUwLjE1NiAzOTMuNTIzIDM1MC45MSAzOTUuMTQ1IGN1cnZldG8KKzM1Mi45MzQgMzk5LjQ3MyAzNDkuMTkxIDQwNi45ODQgMzQ1LjA5OCA0MDYuOTg0IGN1cnZldG8KKzM0NS4wNTUgNDA2Ljk4NCAzNDQuNDY1IDQwNi45NjEgMzQ0LjQ4IDQwNi43MTkgY3VydmV0bworMzQ0LjYyOSA0MDMuOTU3IDM0Ni43ODEgNDA1LjY4IDM0NC42MTcgNDAwLjk4IGN1cnZldG8KKzM0Mi40MDIgNDAxLjQyNiAzNDAuMDU5IDQwNS4wMTYgMzQxLjI2NiA0MDcuNjA1IGN1cnZldG8KKzM0MS42MjUgNDA4LjM2MyAzNDIuNTE2IDQwOC41NzQgMzQzLjEyMSA0MDguNTc0IGN1cnZldG8KKyBjbG9zZXBhdGggc3Ryb2tlCituZXdwYXRoIDM2NC45MzggNDA4Ljc1OCBtb3ZldG8KKzM2NS43NjIgNDA4LjY4IDM2Ny4wMDQgNDA4Ljc1NCAzNjcuNzExIDQwOC41MzUgY3VydmV0bworMzY3Ljg0OCA0MDguNDk2IDM2Ny43NDYgNDA4LjMyOCAzNjcuNzY2IDQwOC4xOTUgY3VydmV0bworMzY3Ljk4NCA0MDYuOTY1IDM2OC4zMiA0MDUuODAxIDM2OC42MTcgNDA0LjYxMyBjdXJ2ZXRvCiszNjkuNzU4IDM5OS45ODggMzcwLjQ0NSAzOTUuMjM4IDM3MS43NTggMzkwLjY1MiBjdXJ2ZXRvCiszNzMuMTg0IDM4NS42NiAzNzQuNjcyIDM4MC4wMzUgMzcyLjk0NSAzNzMuNzcgY3VydmV0bworMzcyLjc3NyAzNzMuMTU2IDM3Mi41NTEgMzcyLjUzNSAzNzIuMjU4IDM3MS45MSBjdXJ2ZXRvCiszNzAuMzAxIDM2Ny43MTkgMzY1LjI2MiAzNjMuNzMgMzYwLjg1OSAzNjMuNzMgY3VydmV0bworMzYwLjMyIDM2My43MyAzNTkuNzQ2IDM2My44ODMgMzU5LjQ4OCAzNjQuMjM0IGN1cnZldG8KKzM2MS4zNDggMzY1LjQyNiAzNjIuNTEyIDM2Ni42NDggMzYzLjM0NCAzNjguNDI2IGN1cnZldG8KKzM2NC4zMzYgMzcwLjU1OSAzNjQuMzIgMzcyLjU1MSAzNjQuMTkxIDM3NC4zODcgY3VydmV0bworMzY0LjU0MyAzNzQuMTg0IDM2NS42NzIgMzczLjY2NCAzNjYuMTQxIDM3My42NjQgY3VydmV0bworMzY4LjA0NyAzNzMuNjY0IDM2OS42ODQgMzc1LjUyMyAzNzAuNDQ1IDM3Ny4xNiBjdXJ2ZXRvCiszNzEuODUyIDM4MC4xNjQgMzcxLjYxMyAzODMuMjMgMzcxLjM2NyAzODUuNzg5IGN1cnZldG8KKzM3MS4yNDYgMzg3LjA2NiAzNzEuMDc0IDM4OC4zMjggMzcwLjg0IDM4OS41NTkgY3VydmV0bworMzcwLjQ4IDM5MS4zMzIgbGluZXRvCiszNzAuNDM4IDM5MS41MzEgbGluZXRvCiszNzAuMzkxIDM5MS43MjMgbGluZXRvCiszNzAuNjA1IDM5MS43MjMgMzcwLjQxNCAzOTEuMzQ4IDM3MC40MjIgMzkxLjE1NiBjdXJ2ZXRvCiszNzAuNTU1IDM4OC4wNTkgMzcwLjUgMzgzLjczOCAzNjguODUyIDM4MC4yMTEgY3VydmV0bworMzY4LjA4NiAzNzguNTc0IDM2Ni44MzIgMzc2Ljg4NyAzNjQuOTEgMzc2Ljg4NyBjdXJ2ZXRvCiszNTYuNDg4IDM3Ni44ODcgMzYwLjcyMyA0MDEuMDE2IDM1My45NzMgNDA2Ljc1IGN1cnZldG8KKzM1NC4zNDggNDA3LjM3NSAzNTQuNjggNDA4LjAxNiAzNTQuOTYxIDQwOC42NDUgY3VydmV0bworMzU4Ljk1MyA0MDMuNzczIDM1OS4xNjQgMzkwLjM0IDM2NS4wNDcgMzkwLjM0IGN1cnZldG8KKzM2Ni40NzMgMzkwLjM0IDM2Ny45NDUgMzkxLjY5MSAzNjguNTU1IDM5Mi45ODggY3VydmV0bworMzcxLjE2OCAzOTguNTc4IDM2Ni44MjQgNDA1LjA4NiAzNjQuOTM4IDQwOC43NTggY3VydmV0bworIGNsb3NlcGF0aCBmaWxsCituZXdwYXRoIDM2NC45MzggNDA4Ljc1OCBtb3ZldG8KKzM2NS43NjIgNDA4LjY4IDM2Ny4wMDQgNDA4Ljc1NCAzNjcuNzExIDQwOC41MzUgY3VydmV0bworMzY3Ljg0OCA0MDguNDk2IDM2Ny43NDYgNDA4LjMyOCAzNjcuNzY2IDQwOC4xOTUgY3VydmV0bworMzY3Ljk4NCA0MDYuOTY1IDM2OC4zMiA0MDUuODAxIDM2OC42MTcgNDA0LjYxMyBjdXJ2ZXRvCiszNjkuNzU4IDM5OS45ODggMzcwLjQ0NSAzOTUuMjM4IDM3MS43NTggMzkwLjY1MiBjdXJ2ZXRvCiszNzMuMTg0IDM4NS42NiAzNzQuNjcyIDM4MC4wMzUgMzcyLjk0NSAzNzMuNzcgY3VydmV0bworMzcyLjc3NyAzNzMuMTU2IDM3Mi41NTEgMzcyLjUzNSAzNzIuMjU4IDM3MS45MSBjdXJ2ZXRvCiszNzAuMzAxIDM2Ny43MTkgMzY1LjI2MiAzNjMuNzMgMzYwLjg1OSAzNjMuNzMgY3VydmV0bworMzYwLjMyIDM2My43MyAzNTkuNzQ2IDM2My44ODMgMzU5LjQ4OCAzNjQuMjM0IGN1cnZldG8KKzM2MS4zNDggMzY1LjQyNiAzNjIuNTEyIDM2Ni42NDggMzYzLjM0NCAzNjguNDI2IGN1cnZldG8KKzM2NC4zMzYgMzcwLjU1OSAzNjQuMzIgMzcyLjU1MSAzNjQuMTkxIDM3NC4zODcgY3VydmV0bworMzY0LjU0MyAzNzQuMTg0IDM2NS42NzIgMzczLjY2NCAzNjYuMTQxIDM3My42NjQgY3VydmV0bworMzY4LjA0NyAzNzMuNjY0IDM2OS42ODQgMzc1LjUyMyAzNzAuNDQ1IDM3Ny4xNiBjdXJ2ZXRvCiszNzEuODUyIDM4MC4xNjQgMzcxLjYxMyAzODMuMjMgMzcxLjM2NyAzODUuNzg5IGN1cnZldG8KKzM3MS4yNDYgMzg3LjA2NiAzNzEuMDc0IDM4OC4zMjggMzcwLjg0IDM4OS41NTkgY3VydmV0bworMzcwLjQ4IDM5MS4zMzIgbGluZXRvCiszNzAuNDM4IDM5MS41MzEgbGluZXRvCiszNzAuMzkxIDM5MS43MjMgbGluZXRvCiszNzAuNjA1IDM5MS43MjMgMzcwLjQxNCAzOTEuMzQ4IDM3MC40MjIgMzkxLjE1NiBjdXJ2ZXRvCiszNzAuNTU1IDM4OC4wNTkgMzcwLjUgMzgzLjczOCAzNjguODUyIDM4MC4yMTEgY3VydmV0bworMzY4LjA4NiAzNzguNTc0IDM2Ni44MzIgMzc2Ljg4NyAzNjQuOTEgMzc2Ljg4NyBjdXJ2ZXRvCiszNTYuNDg4IDM3Ni44ODcgMzYwLjcyMyA0MDEuMDE2IDM1My45NzMgNDA2Ljc1IGN1cnZldG8KKzM1NC4zNDggNDA3LjM3NSAzNTQuNjggNDA4LjAxNiAzNTQuOTYxIDQwOC42NDUgY3VydmV0bworMzU4Ljk1MyA0MDMuNzczIDM1OS4xNjQgMzkwLjM0IDM2NS4wNDcgMzkwLjM0IGN1cnZldG8KKzM2Ni40NzMgMzkwLjM0IDM2Ny45NDUgMzkxLjY5MSAzNjguNTU1IDM5Mi45ODggY3VydmV0bworMzcxLjE2OCAzOTguNTc4IDM2Ni44MjQgNDA1LjA4NiAzNjQuOTM4IDQwOC43NTggY3VydmV0bworIGNsb3NlcGF0aCBzdHJva2UKKyAxIHNldGdyYXkKK25ld3BhdGggMjYxLjE3NiA0MjguNDY5IG1vdmV0bworMjY2Ljk2OSA0MjguNDY5IDI2My41OTQgNDEzLjg0OCAyNjEuNTMxIDQwOS40MzggY3VydmV0bworMjU5Ljc3IDQwNS42NjQgMjU1Ljc5NyA0MDAuMjE5IDI1MS4wODYgNDAwLjIxOSBjdXJ2ZXRvCisyNDUuNDQxIDQwMC4yMTkgMjQ1LjYwOSA0MDYuNjA1IDI0Ny44NTUgNDExLjQxOCBjdXJ2ZXRvCisyNDkuMDc0IDQxNC4wMiAyNTAuOTQ1IDQxNi45NDEgMjUzLjUyIDQxOS4wODYgY3VydmV0bworMjUyLjg2MyA0MTYuODQ4IDI1NS4wOTQgNDE1LjMxNiAyNTQuMTkxIDQxMy4zODcgY3VydmV0bworMjUzLjU3NCA0MTIuMDY2IDI1Mi4zMDEgNDEwLjYyOSAyNTEuNjM3IDQwOS4yMTEgY3VydmV0bworMjUwLjU2NiA0MDYuOTE4IDI1MC45NzMgNDAyLjg1MiAyNTMuNTYyIDQwMi44NTIgY3VydmV0bworMjU1Ljg3OSA0MDIuODUyIDI1Ny45MzggNDA1Ljc1IDI1OC43ODUgNDA3LjU1NSBjdXJ2ZXRvCisyNjAuNTEyIDQxMS4yNTQgMjY0LjgzNiA0MjcuMDQzIDI2MC4wMDQgNDI3LjA0MyBjdXJ2ZXRvCisyNTQuNDM4IDQyNy4wNDMgMjQ0Ljg0NCA0MTMuMzQ0IDI0Mi44MzYgNDA5LjA0NyBjdXJ2ZXRvCisyMzkuMjUgNDAxLjM3NSAyNDEuODUyIDM5MS45MyAyNTAuMDIgMzkxLjkzIGN1cnZldG8KKzI1NS41MzkgMzkxLjkzIDI2MC4wNzggMzk3LjI4OSAyNjIuMjcgNDAxLjk4IGN1cnZldG8KKzI2My41NzggNDA0Ljc3MyAyNjQuMjg5IDQwNy41NTUgMjY0LjU3IDQxMC4xNzYgY3VydmV0bworMjY1LjY0MSA0MTAuMzc1IGxpbmV0bworMjY1Ljg3OSA0MDMuMTU2IDI3My40MzggMzkxLjIwNyAyNzAuMjE5IDM4NC4zMiBjdXJ2ZXRvCisyNjYuMTAyIDM3NS41MDggMjUzLjc4NSAzNzUuNTg2IDI0Ni43NTQgMzcyLjQ2MSBjdXJ2ZXRvCisyNDUuMjczIDM3NS45NTMgMjQzLjI3MyAzNzkuMTk5IDI0MC40NTMgMzgxLjY4IGN1cnZldG8KKzI0Ni43MjcgMzgzLjgwOSAyNjIuMTM3IDM4Ny4zODcgMjY1LjQ5MiAzOTQuNTU5IGN1cnZldG8KKzI2Ni44OTggMzk3LjU3IDI2NS45NDEgNDAyLjU2NiAyNjQuMzEyIDQwNC4yNTggY3VydmV0bworMjY0LjAzNSA0MDMuMTk1IDI2My42NTIgNDAyLjEwOSAyNjMuMTQ1IDQwMS4wMiBjdXJ2ZXRvCisyNjAuMjczIDM5NC44ODMgMjU0LjEyOSAzOTAuMTIxIDI0Ny43OTMgMzkwLjEyMSBjdXJ2ZXRvCisyMzguOTc3IDM5MC4xMjEgMjM1LjIzOCAzOTYuNTIgMjM5LjM4NyA0MDUuMzk4IGN1cnZldG8KKzI0MS44NzkgNDEwLjczIDI1NC41OTggNDI4LjQ2OSAyNjEuMTc2IDQyOC40NjkgY3VydmV0bworIGNsb3NlcGF0aCBmaWxsCituZXdwYXRoIDI3Ni4yNDIgNDA3LjMwNSBtb3ZldG8KKzI3Ni41OTQgNDA2LjQzNCAyNzcuNjA5IDQwMS41MTIgMjc4LjM3OSA0MDEuNTEyIGN1cnZldG8KKzI4MC4wMzkgNDAxLjUxMiAyODMuMDM5IDQwNi4wNzggMjgzLjg0OCA0MDcuMjYyIGN1cnZldG8KKzI4NS4zMjQgNDA2LjI4NSAyODQuNTA0IDQwNC4yMzQgMjg3LjI0MiA0MDQuMjM0IGN1cnZldG8KKzI4OC40OCA0MDQuMjM0IDI4OS4xMDUgNDA2LjkzIDI5MC4zOTUgNDA2Ljk3MyBjdXJ2ZXRvCisyOTAuNDQxIDQwNS44ODMgMjkwLjUwOCA0MDQuODk4IDI4OS45MjIgNDAzLjY0MSBjdXJ2ZXRvCisyODkuMDEyIDQwMS42OTkgMjg2LjcxOSAzOTkuMDY2IDI4NC40NjEgMzk5LjA2NiBjdXJ2ZXRvCisyODIuODQ0IDM5OS4wNjYgMjgwLjU5NCA0MDEuMDMxIDI4MC4xNTIgNDAxLjAzMSBjdXJ2ZXRvCisyNzkuNjcyIDQwMS4wMzEgMjc4Ljc4OSA0MDAuODA1IDI3OC41MDggNDAwLjIwMyBjdXJ2ZXRvCisyNzcuMzMyIDM5Ny42OTEgMjgwLjQ3NyAzODkuMjk3IDI4My42MjUgMzg5LjI5NyBjdXJ2ZXRvCisyODUuMzA5IDM4OS4yOTcgMjg3LjMxNiAzOTAuNTQzIDI4OS4wNzggMzkxLjMxMiBjdXJ2ZXRvCisyODguNjIxIDM4OC4yODkgMjg4LjU1OSAzODUuNzM4IDI4OS4xNjQgMzgzLjEzMyBjdXJ2ZXRvCisyODcuNTU5IDM4Mi4xMDkgMjg1LjY4IDM4MS42NzYgMjg0LjE3MiAzODEuNjc2IGN1cnZldG8KKzI3Ni40MyAzODEuNjc2IDI4MC42OTkgMzk5Ljg1OSAyNzMuNTU5IDQwMy43MzQgY3VydmV0bworMjc2LjI0MiA0MDcuMzA1IGxpbmV0bworIGNsb3NlcGF0aCBmaWxsCituZXdwYXRoIDMwNiA0MDguNzYyIG1vdmV0bworMzExLjg1MiA0MDguNzYyIDMxNC4xNiAzOTguMTMzIDMxMS41MzUgMzkyLjUxNiBjdXJ2ZXRvCiszMDkuNSAzODguMTYgMzA1Ljg4NyAzODUgMzAxLjI2MiAzODUgY3VydmV0bworMjkzLjA5IDM4NSAyOTQuMTEzIDM5Ni4yNDYgMjk3LjMwMSA0MDMuMDY2IGN1cnZldG8KKzI5OC4xOCA0MDQuOTQ1IDMwMS4xODQgNDA5LjAzOSAzMDMuNTMxIDQwOS4wMzkgY3VydmV0bworMzA0LjM5NSA0MDkuMDM5IDMwNS4xMTMgNDA4Ljc2MiAzMDYgNDA4Ljc2MiBjdXJ2ZXRvCisgY2xvc2VwYXRoIGZpbGwKK25ld3BhdGggMzA1LjgxNiA0MDcuNzcgbW92ZXRvCiszMDQuODk4IDQwNy43NyAzMDQuMDg2IDQwNy4zMDkgMzAzLjY2IDQwNi4zOTUgY3VydmV0bworMzAyLjc2MiA0MDQuNDc3IDMwNy4yMzQgNDAyLjUzNSAzMDYuNTk0IDQwMS4xNjQgY3VydmV0bworMzA2LjE4OCA0MDAuMzAxIDMwNC42NTIgMzk5LjQ5MiAzMDMuODc1IDM5OS40OTIgY3VydmV0bworMjk5Ljk5NiAzOTkuNDkyIDMwMC4wMzEgNDA0LjU4NiAzMDIuMzQgNDA3LjkwNiBjdXJ2ZXRvCiszMDAuOTA2IDQwNi45OCAyOTkuOTYxIDQwNS41NyAyOTkuMzUyIDQwNC4yNTggY3VydmV0bworMjk3LjA3OCAzOTkuMzk4IDI5OC44ODMgMzkyLjcxMSAzMDQuMDY2IDM5Mi43MTEgY3VydmV0bworMzA2LjkzNCAzOTIuNzExIDMxMC4yMyAzOTUuMzEyIDMxMS41MTIgMzk4LjA1NSBjdXJ2ZXRvCiszMTMuMDk0IDQwMS40MyAzMDkuMDU5IDQwNy43NyAzMDUuODE2IDQwNy43NyBjdXJ2ZXRvCisgY2xvc2VwYXRoIGZpbGwKK25ld3BhdGggMzMyLjU5IDM5MS4yNjIgbW92ZXRvCiszMzEuMDYyIDM4Ny45OTIgMzI4LjIxMSAzODYuMTk1IDMyNS4wMDQgMzg2LjE5NSBjdXJ2ZXRvCiszMTQuODI0IDM4Ni4xOTUgMzEyLjgwNSAzOTUuNTcgMzE3LjIxNSA0MDUuMDEyIGN1cnZldG8KKzMxOC4yNTggNDA3LjIzOCAzMTkuOTY5IDQwOS43MDMgMzIyLjU3OCA0MDkuNzAzIGN1cnZldG8KKzMzMC43NTggNDA5LjcwMyAzMzYuNDUzIDM5OS41MzEgMzMyLjU5IDM5MS4yNjIgY3VydmV0bworIGNsb3NlcGF0aCBmaWxsCituZXdwYXRoIDMyNC40NjkgNDA4LjUyIG1vdmV0bworMzIzLjcxNSA0MDguNTIgMzIzLjA1OSA0MDguMjQ2IDMyMi42OTUgNDA3LjQ3NyBjdXJ2ZXRvCiszMjEuOTA2IDQwNS43ODEgMzI2LjIxMSA0MDQuMjcgMzI2LjIxOSA0MDIuNTE2IGN1cnZldG8KKzMyNS43NyA0MDEuOTggMzI0LjUwOCA0MDEuMzc5IDMyMy45NjEgNDAxLjM3OSBjdXJ2ZXRvCiszMjAuODU5IDQwMS4zNzkgMzE4LjUxNiA0MDUuNjI1IDMyMS4xNjQgNDA4Ljc4MSBjdXJ2ZXRvCiszMjAuMDkgNDA4LjA5NCAzMTkuNDQ5IDQwNy4wNjIgMzE5IDQwNi4wOSBjdXJ2ZXRvCiszMTYuMzEyIDQwMC4zNDQgMzIwLjE0MSAzOTQuNTM1IDMyNS43MTkgMzk0LjUzNSBjdXJ2ZXRvCiszMjguMDQzIDM5NC41MzUgMzMxLjAzNSAzOTUuODQgMzMyLjI0MiAzOTguNDIyIGN1cnZldG8KKzMzMy45NDkgNDAyLjA3NCAzMjcuODY3IDQwOC41MiAzMjQuNDY5IDQwOC41MiBjdXJ2ZXRvCisgY2xvc2VwYXRoIGZpbGwKK25ld3BhdGggMzQzLjEyMSA0MDguNTc0IG1vdmV0bworMzUxLjg5MSA0MDguNTc0IDM1Ni4zNTIgMzkyLjMxNiAzNTIuNDMgMzgzLjkzIGN1cnZldG8KKzM1MS42OCAzODIuMzI0IDM1MC4yODUgMzgwLjcyMyAzNDguNDQxIDM4MC43MjMgY3VydmV0bworMzM4LjQxOCAzODAuNzIzIDM0MC45NzcgNDAwLjg0OCAzMzUuMzMyIDQwNi41NjIgY3VydmV0bworMzM1Ljg1MiA0MDcuMTE3IDMzNi4zNDQgNDA3LjY5NSAzMzYuNzk3IDQwOC4yNzcgY3VydmV0bworMzQwLjYwOSA0MDMuNzU4IDMzOC43MTUgMzkxLjg2NyAzNDYuODU5IDM5MS44NjcgY3VydmV0bworMzQ4LjczNCAzOTEuODY3IDM1MC4xNTYgMzkzLjUyMyAzNTAuOTEgMzk1LjE0NSBjdXJ2ZXRvCiszNTIuOTM0IDM5OS40NzMgMzQ5LjE5MSA0MDYuOTg0IDM0NS4wOTggNDA2Ljk4NCBjdXJ2ZXRvCiszNDUuMDU1IDQwNi45ODQgMzQ0LjQ2NSA0MDYuOTYxIDM0NC40OCA0MDYuNzE5IGN1cnZldG8KKzM0NC42MjkgNDAzLjk1NyAzNDYuNzgxIDQwNS42OCAzNDQuNjE3IDQwMC45OCBjdXJ2ZXRvCiszNDIuNDAyIDQwMS40MjYgMzQwLjA1OSA0MDUuMDE2IDM0MS4yNjYgNDA3LjYwNSBjdXJ2ZXRvCiszNDEuNjI1IDQwOC4zNjMgMzQyLjUxNiA0MDguNTc0IDM0My4xMjEgNDA4LjU3NCBjdXJ2ZXRvCisgY2xvc2VwYXRoIGZpbGwKK25ld3BhdGggMzY0LjkzOCA0MDguNzU4IG1vdmV0bworMzY1Ljc2MiA0MDguNjggMzY3LjAwNCA0MDguNzU0IDM2Ny43MTEgNDA4LjUzNSBjdXJ2ZXRvCiszNjcuODQ4IDQwOC40OTYgMzY3Ljc0NiA0MDguMzI4IDM2Ny43NjYgNDA4LjE5NSBjdXJ2ZXRvCiszNjcuOTg0IDQwNi45NjUgMzY4LjMyIDQwNS44MDEgMzY4LjYxNyA0MDQuNjEzIGN1cnZldG8KKzM2OS43NTggMzk5Ljk4OCAzNzAuNDQ1IDM5NS4yMzggMzcxLjc1OCAzOTAuNjUyIGN1cnZldG8KKzM3My4xODQgMzg1LjY2IDM3NC42NzIgMzgwLjAzNSAzNzIuOTQ1IDM3My43NyBjdXJ2ZXRvCiszNzIuNzc3IDM3My4xNTYgMzcyLjU1MSAzNzIuNTM1IDM3Mi4yNTggMzcxLjkxIGN1cnZldG8KKzM2NS42OTEgMzU5LjE2OCAzNTEuNjI5IDM2Mi42MDIgMzQ3LjIyNyAzNjIuNjAyIGN1cnZldG8KKzM0Ni42OTEgMzYyLjYwMiAzNDYuMTEzIDM2Mi43NTQgMzQ1Ljg1OSAzNjMuMTA1IGN1cnZldG8KKzM0Ny43MTUgMzY0LjMwMSAzNDguODc5IDM2NS41MjMgMzQ5LjcxMSAzNjcuMzAxIGN1cnZldG8KKzM1MC43MDMgMzY5LjQzIDM1MC42OTEgMzcxLjQyNiAzNTAuNTU5IDM3My4yNjIgY3VydmV0bworMzUwLjkxNCAzNzMuMDU1IDM1Mi4wNDMgMzcyLjUzOSAzNTIuNTA4IDM3Mi41MzkgY3VydmV0bworMzU0LjQxNCAzNzIuNTM5IDM2NS4wMzUgMzY3LjAyNyAzNzAuNDQ1IDM3Ny4xNiBjdXJ2ZXRvCiszNzEuODUyIDM4MC4xNjQgMzcxLjYxMyAzODMuMjMgMzcxLjM2NyAzODUuNzg5IGN1cnZldG8KKzM3MS4yNDYgMzg3LjA2NiAzNzEuMDc0IDM4OC4zMjggMzcwLjg0IDM4OS41NTkgY3VydmV0bworMzcwLjQ4IDM5MS4zMzIgbGluZXRvCiszNzAuNDM4IDM5MS41MzEgbGluZXRvCiszNzAuMzkxIDM5MS43MjMgbGluZXRvCiszNzAuNjA1IDM5MS43MjMgMzcwLjQxNCAzOTEuMzQ4IDM3MC40MjIgMzkxLjE1NiBjdXJ2ZXRvCiszNzAuNTU1IDM4OC4wNTkgMzcwLjUgMzgzLjczOCAzNjguODUyIDM4MC4yMTEgY3VydmV0bworMzY4LjA4NiAzNzguNTc0IDM2Ni44MzIgMzc2Ljg4NyAzNjQuOTEgMzc2Ljg4NyBjdXJ2ZXRvCiszNTYuNDg4IDM3Ni44ODcgMzYwLjcyMyA0MDEuMDE2IDM1My45NzMgNDA2Ljc1IGN1cnZldG8KKzM1NC4zNDggNDA3LjM3NSAzNTQuNjggNDA4LjAxNiAzNTQuOTYxIDQwOC42NDUgY3VydmV0bworMzU4Ljk1MyA0MDMuNzczIDM1OS4xNjQgMzkwLjM0IDM2NS4wNDcgMzkwLjM0IGN1cnZldG8KKzM2Ni40NzMgMzkwLjM0IDM2Ny45NDUgMzkxLjY5MSAzNjguNTU1IDM5Mi45ODggY3VydmV0bworMzcxLjE2OCAzOTguNTc4IDM2Ni44MjQgNDA1LjA4NiAzNjQuOTM4IDQwOC43NTggY3VydmV0bworIGNsb3NlcGF0aCBmaWxsCitzaG93cGFnZQorJSVFT0YKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbGF0ZXgvc3BlYy9jb2xvcGhvbi50ZXggYi9ncm9vdnkvc3JjL2xhdGV4L3NwZWMvY29sb3Bob24udGV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhYmQwNTEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL2xhdGV4L3NwZWMvY29sb3Bob24udGV4CkBAIC0wLDAgKzEsMTEgQEAKK1xjaGFwdGVye0NvbG9waG9ufQorCitUaGlzIG1hbnVhbCB3YXMgcHJvZHVjZWQgd2l0aG91dCB0aGUgYWlkIG9mIE1pY3Jvc29mdCBwcm9kdWN0cy4KK0l0IHdhcyBhdXRob3JlZCBvbiBhIExpbnV4IGxhcHRvcCB1c2luZyBYRW1hY3NcaW5kZXh7WEVtYWNzfSwgXExhVGVYXGluZGV4e0xhdGV4QFxMYVRlWH0sCitcdGV4dHR0e21ha2VpbmRleH0sIFx0ZXh0dHR7eGR2aX0sIFx0ZXh0dHR7ZGlhfSwgYW5kIFx0ZXh0dHR7ZXBzdG9wZGZ9LgorCitccnVsZXswcHR9ezE3ZW19CisKK1xiZWdpbntmbHVzaHJpZ2h0fQorUGhpc2hcaW5kZXh7UGhpc2h8dGV4dGJmfSByb2Nrcy4KK1xlbmR7Zmx1c2hyaWdodH0KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbGF0ZXgvc3BlYy9leHByZXNzaW9ucy50ZXggYi9ncm9vdnkvc3JjL2xhdGV4L3NwZWMvZXhwcmVzc2lvbnMudGV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMTJjMmUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL2xhdGV4L3NwZWMvZXhwcmVzc2lvbnMudGV4CkBAIC0wLDAgKzEsMiBAQAorXGNoYXB0ZXJ7RXhwcmVzc2lvbnN9CisKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbGF0ZXgvc3BlYy9ncm9vdnktbGFuZy1zcGVjLnRleCBiL2dyb292eS9zcmMvbGF0ZXgvc3BlYy9ncm9vdnktbGFuZy1zcGVjLnRleApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGE0ZjJmCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9sYXRleC9zcGVjL2dyb292eS1sYW5nLXNwZWMudGV4CkBAIC0wLDAgKzEsMTYyIEBACisKKyUlCislJQorJSUgdGhlIGdyb292eSBsYW5ndWFnZSBzcGVjCislJQorJSUKKworXGRvY3VtZW50Y2xhc3NbMTBwdCxsZXR0ZXJwYXBlcl17Ym9va30KKworCislJQorJSUgUGFja2FnZSBJbXBvcnRzCislJQorCitcdXNlcGFja2FnZXthbGx0dH0KKyVcdXNlcGFja2FnZXtjaXRlfQorJVx1c2VwYWNrYWdle3BsYWlufQorXHVzZXBhY2thZ2V7Z3JhcGhpY3h9CitcdXNlcGFja2FnZXtoeXBlcnJlZn0KK1x1c2VwYWNrYWdle3ZhcmlvcmVmfQorXHVzZXBhY2thZ2V7dGFidWxhcnh9CislXHVzZXBhY2thZ2V7YXJyYXl9CislXHVzZXBhY2thZ2V7Y29sb3J9CitcdXNlcGFja2FnZXttYWtlaWR4fQorJVx1c2VwYWNrYWdle3Nob3dpZHh9CisKKyUlCislJSBFeHRyYSBDb21tYW5kcyBhbmQgRXZpcm9ubWVudHMKKyUlCisKK1xuZXdlbnZpcm9ubWVudHtjb2RlbGlzdGluZ30lCisJe1xiaWdza2lwXGJlZ2lue21pbmlwYWdlfXsyNTBwdH1cZm9vdG5vdGVzaXplXGJlZ2lue2FsbHR0fX0lCisJe1xlbmR7YWxsdHR9XGVuZHttaW5pcGFnZX1cYmlnc2tpcH0KKworXG5ld2Vudmlyb25tZW50e2Jhc2Vub3RlfVsxXQorCXsKKwkJXGJlZ2lue2ZsdXNocmlnaHR9CisJCVx2bGluZSBcaHNwYWNlezFlbX0KKwkJXGJlZ2lue21pbmlwYWdlfXswLjdcbGluZXdpZHRofQorCQlcaHNwYWNley0xZW19XHRleHRzZntcdGV4dGJmeyMxfX1cXCAgCisJCVxydWxlezBlbX17MS40ZW19CisJCVxzbAorCX0geworCQlcZW5ke21pbmlwYWdlfQorCQlcZW5ke2ZsdXNocmlnaHR9CisJfQorCitcbmV3ZW52aXJvbm1lbnR7aW5kbm90ZX1bMV0KKwl7CisJCVxiZWdpbntmbHVzaHJpZ2h0fQorCQlcdmxpbmUgXGhzcGFjZXsxZW19CisJCVxiZWdpbnttaW5pcGFnZX17MC45XGxpbmV3aWR0aH0KKwkJXGhzcGFjZXstMWVtfVx0ZXh0c2Z7XHRleHRiZnsjMSdzIG5vdGV9fVxcICAKKwkJXHJ1bGV7MGVtfXsxLjRlbX0KKwkJXHNsCisJfSB7CisJCVxlbmR7bWluaXBhZ2V9CisJCVxlbmR7Zmx1c2hyaWdodH0KKwl9CisKK1xuZXdlbnZpcm9ubWVudHtub3RlfQorCXsKKwkJXGJlZ2lue2Jhc2Vub3RlfXtOb3RlfQorCX0geworCQlcZW5ke2Jhc2Vub3RlfQorCX0KKworXG5ld2Vudmlyb25tZW50e2Vkbm90ZX0KKwl7CisJCVxiZWdpbntiYXNlbm90ZX17RWRpdG9yJ3MgTm90ZX0KKwl9IHsKKwkJXGVuZHtiYXNlbm90ZX0KKwl9CisKK1xuZXdlbnZpcm9ubWVudHtpbXBsbm90ZX0KKwl7CisJCVxiZWdpbntiYXNlbm90ZX17SW1wbGVtZW50b3IncyBOb3RlfQorCX0geworCQlcZW5ke2Jhc2Vub3RlfQorCX0KKworXG5ld2NvbW1hbmR7XGRpYWdyYW19WzJdeworICBcYmlnc2tpcAorICBcYmVnaW57ZmlndXJlfVtoXQorICAgIFxiZWdpbntjZW50ZXJ9CisgICAgICBcaW5jbHVkZWdyYXBoaWNzW3NjYWxlPTAuNV17IzF9CisgICAgXGVuZHtjZW50ZXJ9CisgICAgXGNhcHRpb257IzJ9CisgIFxlbmR7ZmlndXJlfSAKKyAgXG1lZHNraXAKK30KKworXG5ld2NvbW1hbmR7XGluZGV4ZmlsZX1bMV17XHRleHR0dHsjMX1caW5kZXh7IzFAXHRleHR0dHsjMX0gZmlsZX19CitcbmV3Y29tbWFuZHtcaW5kZXhjbGFzc31bMV17XHRleHR0dHsjMX1caW5kZXh7IzFAXHRleHR0dHsjMX0gY2xhc3N9fQorXG5ld2NvbW1hbmR7XGluZGV4Y2xhc3NleH1bMV17XGluZGV4eyMxQFx0ZXh0dHR7IzF9IWV4YW1wbGV9fQorXG5ld2NvbW1hbmR7XGluZGV4bWV0aG9kfVsyXXtcdGV4dHR0eyMyfVxpbmRleHsjMUBcdGV4dHR0eyMxfSBjbGFzcyEjMkBcdGV4dHR0eyMyfSBtZXRob2R9fQorCitcbmV3Y29tbWFuZHtcaW5kZXhrZXl3b3JkfVsxXXtcdGV4dHR0eyMxfVxpbmRleHsjMUBcdGV4dHR0eyMxfSBrZXl3b3JkfX0KK1xuZXdjb21tYW5ke1xpbmRleG9wZXJhdG9yfVsxXXtcdGV4dHR0eyMxfVxpbmRleHsjMUBcdGV4dHR0eyMxfSBvcGVyYXRvcn19CisKK1xuZXdjb21tYW5ke1xmaWxlfVsxXXtcdGV4dHR0eyMxfSBmaWxlfQorXG5ld2NvbW1hbmR7XGNsYXNzfVsxXXtcdGV4dHR0eyMxfX0KK1xuZXdjb21tYW5ke1xtZXRob2R9WzFde1x0ZXh0dHR7IzF9fQorCitccmFnZ2VkYm90dG9tCisKK1xjbHVicGVuYWx0eSA9IDEwMDAwCitcd2lkb3dwZW5hbHR5ID0gMTAwMDAgCitcbWFrZWluZGV4CisKK1xiZWdpbntkb2N1bWVudH0KKworXGxldFxmb290bm90ZXJ1bGVcaHJ1bGUKKworXG1ha2VhdGxldHRlcgorXHJlbmV3Y29tbWFuZHtcQG1ha2VmbnRleHR9WzFdJQorCXtcbm9pbmRlbnRcbWFrZWJveFsxLjhlbV1bcl17XEBtYWtlZm5tYXJrfSMxfQorXG1ha2VhdG90aGVyCisKK1x0aXRsZXsKKwlHcm9vdnkgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbgorfQorCitcYXV0aG9yeworCVx0ZXh0c2Z7VGhlIENvZGVoYXVzfVxcCisJXHRleHRzZnt3d3cuY29kZWhhdXMub3JnfVxcCit9CisKKworXGZyb250bWF0dGVyCisKK1xtYWtldGl0bGUKKworXHRhYmxlb2Zjb250ZW50cworCitcbGlzdG9mZmlndXJlcyAKKworXGluY2x1ZGV7cHJlZmFjZX0KKworXG1haW5tYXR0ZXIKKworXGluY2x1ZGV7a2V5d29yZHN9CitcaW5jbHVkZXtvcGVyYXRvcnN9CitcaW5jbHVkZXtleHByZXNzaW9uc30KK1xpbmNsdWRle3N0YXRlbWVudHN9CisKK1xpbmRleHtCZXR0eXxzZWV7YmV0dHl9fQorXGluZGV4e2JldHR5fHNlZXtCZXR0eX19CisKK1xhcHBlbmRpeAorCitcaW5jbHVkZXtmYXF9CitcaW5jbHVkZXtsaWNlbnNlfQorCitcYmFja21hdHRlcgorCitcaW5jbHVkZXtjb2xvcGhvbn0KKworXHNtYWxsCitccHJpbnRpbmRleAorCitcZW5ke2RvY3VtZW50fQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9sYXRleC9zcGVjL2tleXdvcmRzLnRleCBiL2dyb292eS9zcmMvbGF0ZXgvc3BlYy9rZXl3b3Jkcy50ZXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkyMjQ1MgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbGF0ZXgvc3BlYy9rZXl3b3Jkcy50ZXgKQEAgLTAsMCArMSwzIEBACitcY2hhcHRlcntLZXl3b3Jkc30KKworXHNlY3Rpb257XGluZGV4a2V5d29yZHtjbGFzc319CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL2xhdGV4L3NwZWMvb3BlcmF0b3JzLnRleCBiL2dyb292eS9zcmMvbGF0ZXgvc3BlYy9vcGVyYXRvcnMudGV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlZmYyMjAKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL2xhdGV4L3NwZWMvb3BlcmF0b3JzLnRleApAQCAtMCwwICsxLDcgQEAKK1xjaGFwdGVye09wZXJhdG9yc30KKworXHNlY3Rpb257XGluZGV4b3BlcmF0b3J7Ln0gLS0gcHJvcGVydHkgYWNjZXNzfQorXHNlY3Rpb257XGluZGV4b3BlcmF0b3J7W119IC0tIGNvbGxlY3Rpb24gbWVtYmVyIGFjY2Vzc30KK1xzZWN0aW9ue1xpbmRleG9wZXJhdG9yeygpfSAtLSBtZXRob2QgaW52b2NhdGlvbn0KK1xzZWN0aW9ue1xpbmRleG9wZXJhdG9yez09fSAtLSBpZGVudGl0eSBlcXVhbGl0eSB0ZXN0aW5nfQorXHNlY3Rpb257XGluZGV4b3BlcmF0b3J7IT19IC0tIGlkZW50aXR5IGVxdWFsaXR5IHRlc3Rpbmd9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL2xhdGV4L3NwZWMvcHJlZmFjZS50ZXggYi9ncm9vdnkvc3JjL2xhdGV4L3NwZWMvcHJlZmFjZS50ZXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY1ZDFjMQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbGF0ZXgvc3BlYy9wcmVmYWNlLnRleApAQCAtMCwwICsxLDMgQEAKK1xjaGFwdGVye1ByZWZhY2V9CisKK1lhZGRhIGZvby4KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbGF0ZXgvc3BlYy9zdGF0ZW1lbnRzLnRleCBiL2dyb292eS9zcmMvbGF0ZXgvc3BlYy9zdGF0ZW1lbnRzLnRleApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWZhYzMxCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9sYXRleC9zcGVjL3N0YXRlbWVudHMudGV4CkBAIC0wLDAgKzEsMiBAQAorXGNoYXB0ZXJ7U3RhdGVtZW50c30KKwpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9pbnNwZWN0L0luc3BlY3Rvci5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9pbnNwZWN0L0luc3BlY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMzgyZmQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2luc3BlY3QvSW5zcGVjdG9yLmphdmEKQEAgLTAsMCArMSwzMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBncm9vdnkuaW5zcGVjdDsKKworaW1wb3J0IGdyb292eS5sYW5nLkdyb292eU9iamVjdDsKK2ltcG9ydCBncm9vdnkubGFuZy5NZXRhQ2xhc3M7CitpbXBvcnQgZ3Jvb3Z5LmxhbmcuTWV0YU1ldGhvZDsKK2ltcG9ydCBncm9vdnkubGFuZy5Qcm9wZXJ0eVZhbHVlOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucmVmbGVjdGlvbi5DYWNoZWRDbGFzczsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuRGVmYXVsdEdyb292eU1ldGhvZHM7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLkludm9rZXJIZWxwZXI7CisKK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworLyoqCisgKiBUaGUgSW5zcGVjdG9yIHByb3ZpZGVzIGEgdW5pZmllZCBhY2Nlc3MgdG8gYW4gb2JqZWN0J3MKKyAqIGluZm9ybWF0aW9uIHRoYXQgY2FuIGJlIGRldGVybWluZWQgYnkgaW50cm9zcGVjdGlvbi4KKyAqCisgKiBAYXV0aG9yIERpZXJrIEtvZW5pZworICovCitwdWJsaWMgY2xhc3MgSW5zcGVjdG9yIHsKKyAgICBwcm90ZWN0ZWQgT2JqZWN0IG9iamVjdFVuZGVySW5zcGVjdGlvbjsKKworICAgIC8vIEluZGV4ZXMgdG8gcmV0cmlldmUgQ2xhc3MgUHJvcGVydHkgaW5mb3JtYXRpb24KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTEFTU19QQUNLQUdFX0lEWCAgICAgICA9IDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xBU1NfQ0xBU1NfSURYICAgICAgICAgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMQVNTX0lOVEVSRkFDRV9JRFggICAgID0gMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTEFTU19TVVBFUkNMQVNTX0lEWCAgICA9IDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xBU1NfT1RIRVJfSURYICAgICAgICAgPSA0OworCisgICAgLy8gSW5kZXhlcyB0byByZXRyaWV2ZSBmaWVsZCBhbmQgbWV0aG9kIGluZm9ybWF0aW9uCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVNQkVSX09SSUdJTl9JRFggPSAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FTUJFUl9NT0RJRklFUl9JRFggPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FTUJFUl9ERUNMQVJFUl9JRFggPSAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FTUJFUl9UWVBFX0lEWCA9IDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVNQkVSX05BTUVfSURYID0gNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRU1CRVJfUEFSQU1TX0lEWCA9IDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVNQkVSX1ZBTFVFX0lEWCA9IDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVNQkVSX0VYQ0VQVElPTlNfSURYID0gNjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVF9BUFBMSUNBQkxFID0gIm4vYSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JPT1ZZID0gIkdST09WWSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQSA9ICJKQVZBIjsKKworICAgIC8qKgorICAgICAqIEBwYXJhbSBvYmplY3RVbmRlckluc3BlY3Rpb24gbXVzdCBub3QgYmUgbnVsbAorICAgICAqLworICAgIHB1YmxpYyBJbnNwZWN0b3IoT2JqZWN0IG9iamVjdFVuZGVySW5zcGVjdGlvbikgeworICAgICAgICBpZiAobnVsbCA9PSBvYmplY3RVbmRlckluc3BlY3Rpb24peworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYXJndW1lbnQgbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIHRoaXMub2JqZWN0VW5kZXJJbnNwZWN0aW9uID0gb2JqZWN0VW5kZXJJbnNwZWN0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgQ2xhc3MgUHJvcGVydGllcyBvZiB0aGUgb2JqZWN0IHVuZGVyIGluc3BlY3Rpb24uCisgICAgICogQHJldHVybiBTdHJpbmcgYXJyYXkgdG8gYmUgaW5kZXhlZCBieSB0aGUgQ0xBU1NfeHh4X0lEWCBjb25zdGFudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q2xhc3NQcm9wcygpIHsKKyAgICAgICAgU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1tDTEFTU19PVEhFUl9JRFgrMV07CisgICAgICAgIFBhY2thZ2UgcGFjayA9IGdldENsYXNzVW5kZXJJbnNwZWN0aW9uKCkuZ2V0UGFja2FnZSgpOworICAgICAgICByZXN1bHRbQ0xBU1NfUEFDS0FHRV9JRFhdID0gInBhY2thZ2UgIisgKChwYWNrID09IG51bGwpID8gTk9UX0FQUExJQ0FCTEUgOiBwYWNrLmdldE5hbWUoKSk7CisgICAgICAgIFN0cmluZyBtb2RpZmllcnMgPSBNb2RpZmllci50b1N0cmluZyhnZXRDbGFzc1VuZGVySW5zcGVjdGlvbigpLmdldE1vZGlmaWVycygpKTsKKyAgICAgICAgcmVzdWx0W0NMQVNTX0NMQVNTX0lEWF0gPSBtb2RpZmllcnMgKyAiIGNsYXNzICIrIHNob3J0TmFtZShnZXRDbGFzc1VuZGVySW5zcGVjdGlvbigpKTsKKyAgICAgICAgcmVzdWx0W0NMQVNTX0lOVEVSRkFDRV9JRFhdID0gImltcGxlbWVudHMgIjsKKyAgICAgICAgQ2xhc3NbXSBpbnRlcmZhY2VzID0gZ2V0Q2xhc3NVbmRlckluc3BlY3Rpb24oKS5nZXRJbnRlcmZhY2VzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJmYWNlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgcmVzdWx0W0NMQVNTX0lOVEVSRkFDRV9JRFhdICs9IHNob3J0TmFtZShpbnRlcmZhY2VzW2ldKSsgIiAiOworICAgICAgICB9CisgICAgICAgIHJlc3VsdFtDTEFTU19TVVBFUkNMQVNTX0lEWF0gPSAiZXh0ZW5kcyAiICsgc2hvcnROYW1lKGdldENsYXNzVW5kZXJJbnNwZWN0aW9uKCkuZ2V0U3VwZXJjbGFzcygpKTsKKyAgICAgICAgcmVzdWx0W0NMQVNTX09USEVSX0lEWF0gPSAiaXMgUHJpbWl0aXZlOiAiK2dldENsYXNzVW5kZXJJbnNwZWN0aW9uKCkuaXNQcmltaXRpdmUoKQorICAgICAgICAgICAgICAgICAgKyIsIGlzIEFycmF5OiAiICAgK2dldENsYXNzVW5kZXJJbnNwZWN0aW9uKCkuaXNBcnJheSgpCisgICAgICAgICAgICAgICAgICArIiwgaXMgR3Jvb3Z5OiAiICArIGlzR3Jvb3Z5KCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNHcm9vdnkoKSB7CisgICAgICAgIHJldHVybiBHcm9vdnlPYmplY3QuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShnZXRDbGFzc1VuZGVySW5zcGVjdGlvbigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBvYmplY3QgYmVpbmcgaW5zcGVjdGVkLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KCkgeworICAgIAlyZXR1cm4gb2JqZWN0VW5kZXJJbnNwZWN0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBpbmZvIGFib3V0IHVzdWFsIEphdmEgaW5zdGFuY2UgYW5kIGNsYXNzIE1ldGhvZHMgYXMgd2VsbCBhcyBDb25zdHJ1Y3RvcnMuCisgICAgICogQHJldHVybiAgQXJyYXkgb2YgU3RyaW5nQXJyYXlzIHRoYXQgY2FuIGJlIGluZGV4ZWQgd2l0aCB0aGUgTUVNQkVSX3h4eF9JRFggY29uc3RhbnRzCisgICAgICovCisgICAgcHVibGljIE9iamVjdFtdIGdldE1ldGhvZHMoKXsKKyAgICAgICAgTWV0aG9kW10gbWV0aG9kcyA9IGdldENsYXNzVW5kZXJJbnNwZWN0aW9uKCkuZ2V0TWV0aG9kcygpOworICAgICAgICBDb25zdHJ1Y3RvcltdIGN0b3JzID0gZ2V0Q2xhc3NVbmRlckluc3BlY3Rpb24oKS5nZXRDb25zdHJ1Y3RvcnMoKTsKKyAgICAgICAgT2JqZWN0W10gcmVzdWx0ID0gbmV3IE9iamVjdFttZXRob2RzLmxlbmd0aCArIGN0b3JzLmxlbmd0aF07CisgICAgICAgIGludCByZXN1bHRJbmRleCA9IDA7CisgICAgICAgIGZvciAoOyByZXN1bHRJbmRleCA8IG1ldGhvZHMubGVuZ3RoOyByZXN1bHRJbmRleCsrKSB7CisgICAgICAgICAgICBNZXRob2QgbWV0aG9kID0gbWV0aG9kc1tyZXN1bHRJbmRleF07CisgICAgICAgICAgICByZXN1bHRbcmVzdWx0SW5kZXhdID0gbWV0aG9kSW5mbyhtZXRob2QpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY3RvcnMubGVuZ3RoOyBpKyssIHJlc3VsdEluZGV4KyspIHsKKyAgICAgICAgICAgIENvbnN0cnVjdG9yIGN0b3IgPSBjdG9yc1tpXTsKKyAgICAgICAgICAgIHJlc3VsdFtyZXN1bHRJbmRleF0gPSBtZXRob2RJbmZvKGN0b3IpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgICAvKioKKyAgICAgKiBHZXQgaW5mbyBhYm91dCBpbnN0YW5jZSBhbmQgY2xhc3MgTWV0aG9kcyB0aGF0IGFyZSBkeW5hbWljYWxseSBhZGRlZCB0aHJvdWdoIEdyb292eS4KKyAgICAgKiBAcmV0dXJuICBBcnJheSBvZiBTdHJpbmdBcnJheXMgdGhhdCBjYW4gYmUgaW5kZXhlZCB3aXRoIHRoZSBNRU1CRVJfeHh4X0lEWCBjb25zdGFudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0W10gZ2V0TWV0YU1ldGhvZHMoKXsKKyAgICAgICAgTWV0YUNsYXNzIG1ldGFDbGFzcyA9IEludm9rZXJIZWxwZXIuZ2V0TWV0YUNsYXNzKG9iamVjdFVuZGVySW5zcGVjdGlvbik7CisgICAgICAgIExpc3QgbWV0YU1ldGhvZHMgPSBtZXRhQ2xhc3MuZ2V0TWV0YU1ldGhvZHMoKTsKKyAgICAgICAgT2JqZWN0W10gcmVzdWx0ID0gbmV3IE9iamVjdFttZXRhTWV0aG9kcy5zaXplKCldOworICAgICAgICBpbnQgaT0wOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtZXRhTWV0aG9kcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgaSsrKSB7CisgICAgICAgICAgICBNZXRhTWV0aG9kIG1ldGFNZXRob2QgPSAoTWV0YU1ldGhvZCkgaXRlci5uZXh0KCk7CisgICAgICAgICAgICByZXN1bHRbaV0gPSBtZXRob2RJbmZvKG1ldGFNZXRob2QpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGluZm8gYWJvdXQgdXN1YWwgSmF2YSBwdWJsaWMgZmllbGRzIGluY2wuIGNvbnN0YW50cy4KKyAgICAgKiBAcmV0dXJuICBBcnJheSBvZiBTdHJpbmdBcnJheXMgdGhhdCBjYW4gYmUgaW5kZXhlZCB3aXRoIHRoZSBNRU1CRVJfeHh4X0lEWCBjb25zdGFudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0W10gZ2V0UHVibGljRmllbGRzKCl7CisgICAgICAgIEZpZWxkW10gZmllbGRzID0gZ2V0Q2xhc3NVbmRlckluc3BlY3Rpb24oKS5nZXRGaWVsZHMoKTsKKyAgICAgICAgT2JqZWN0W10gcmVzdWx0ID0gbmV3IE9iamVjdFtmaWVsZHMubGVuZ3RoXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIEZpZWxkIGZpZWxkID0gZmllbGRzW2ldOworICAgICAgICAgICAgcmVzdWx0W2ldID0gZmllbGRJbmZvKGZpZWxkKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAvKioKKyAgICAgKiBHZXQgaW5mbyBhYm91dCBQcm9wZXJ0aWVzIChKYXZhIGFuZCBHcm9vdnkgYWxpa2UpLgorICAgICAqIEByZXR1cm4gIEFycmF5IG9mIFN0cmluZ0FycmF5cyB0aGF0IGNhbiBiZSBpbmRleGVkIHdpdGggdGhlIE1FTUJFUl94eHhfSURYIGNvbnN0YW50cworICAgICAqLworICAgIHB1YmxpYyBPYmplY3RbXSBnZXRQcm9wZXJ0eUluZm8oKXsKKyAgICAgICAgTGlzdCBwcm9wcyA9IERlZmF1bHRHcm9vdnlNZXRob2RzLmdldE1ldGFQcm9wZXJ0eVZhbHVlcyhvYmplY3RVbmRlckluc3BlY3Rpb24pOworICAgICAgICBPYmplY3RbXSByZXN1bHQgPSBuZXcgT2JqZWN0W3Byb3BzLnNpemUoKV07CisgICAgICAgIGludCBpPTA7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHByb3BzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyBpKyspIHsKKyAgICAgICAgICAgIFByb3BlcnR5VmFsdWUgcHYgPSAoUHJvcGVydHlWYWx1ZSkgaXRlci5uZXh0KCk7CisgICAgICAgICAgICByZXN1bHRbaV0gPSBmaWVsZEluZm8ocHYpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFN0cmluZ1tdIGZpZWxkSW5mbyhGaWVsZCBmaWVsZCkgeworICAgICAgICBTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW01FTUJFUl9WQUxVRV9JRFgrMV07CisgICAgICAgIHJlc3VsdFtNRU1CRVJfT1JJR0lOX0lEWF0gPSBKQVZBOworICAgICAgICByZXN1bHRbTUVNQkVSX01PRElGSUVSX0lEWF0gPSBNb2RpZmllci50b1N0cmluZyhmaWVsZC5nZXRNb2RpZmllcnMoKSk7CisgICAgICAgIHJlc3VsdFtNRU1CRVJfREVDTEFSRVJfSURYXSA9IHNob3J0TmFtZShmaWVsZC5nZXREZWNsYXJpbmdDbGFzcygpKTsKKyAgICAgICAgcmVzdWx0W01FTUJFUl9UWVBFX0lEWF0gPSBzaG9ydE5hbWUoZmllbGQuZ2V0VHlwZSgpKTsKKyAgICAgICAgcmVzdWx0W01FTUJFUl9OQU1FX0lEWF0gPSBmaWVsZC5nZXROYW1lKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXN1bHRbTUVNQkVSX1ZBTFVFX0lEWF0gPSBJbnZva2VySGVscGVyLmluc3BlY3QoZmllbGQuZ2V0KG9iamVjdFVuZGVySW5zcGVjdGlvbikpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJlc3VsdFtNRU1CRVJfVkFMVUVfSURYXSA9IE5PVF9BUFBMSUNBQkxFOworICAgICAgICB9CisgICAgICAgIHJldHVybiB3aXRob3V0TnVsbHMocmVzdWx0KTsKKyAgICB9CisgICAgcHJvdGVjdGVkIFN0cmluZ1tdIGZpZWxkSW5mbyhQcm9wZXJ0eVZhbHVlIHB2KSB7CisgICAgICAgIFN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbTUVNQkVSX1ZBTFVFX0lEWCsxXTsKKyAgICAgICAgcmVzdWx0W01FTUJFUl9PUklHSU5fSURYXSA9IEdST09WWTsKKyAgICAgICAgcmVzdWx0W01FTUJFUl9NT0RJRklFUl9JRFhdID0gInB1YmxpYyI7CisgICAgICAgIHJlc3VsdFtNRU1CRVJfREVDTEFSRVJfSURYXSA9IE5PVF9BUFBMSUNBQkxFOworICAgICAgICByZXN1bHRbTUVNQkVSX1RZUEVfSURYXSA9IHNob3J0TmFtZShwdi5nZXRUeXBlKCkpOworICAgICAgICByZXN1bHRbTUVNQkVSX05BTUVfSURYXSA9IHB2LmdldE5hbWUoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlc3VsdFtNRU1CRVJfVkFMVUVfSURYXSA9IEludm9rZXJIZWxwZXIuaW5zcGVjdChwdi5nZXRWYWx1ZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJlc3VsdFtNRU1CRVJfVkFMVUVfSURYXSA9IE5PVF9BUFBMSUNBQkxFOworICAgICAgICB9CisgICAgICAgIHJldHVybiB3aXRob3V0TnVsbHMocmVzdWx0KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQ2xhc3MgZ2V0Q2xhc3NVbmRlckluc3BlY3Rpb24oKSB7CisgICAgICAgIHJldHVybiBvYmplY3RVbmRlckluc3BlY3Rpb24uZ2V0Q2xhc3MoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBzaG9ydE5hbWUoQ2xhc3MgY2xhenopeworICAgICAgICBpZiAobnVsbCA9PSBjbGF6eikgcmV0dXJuIE5PVF9BUFBMSUNBQkxFOworICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gY2xhenouZ2V0TmFtZSgpOworICAgICAgICBpZiAobnVsbCA9PSBjbGF6ei5nZXRQYWNrYWdlKCkpIHJldHVybiBjbGFzc05hbWU7CisgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IGNsYXp6LmdldFBhY2thZ2UoKS5nZXROYW1lKCk7CisgICAgICAgIGludCBvZmZzZXQgPSBwYWNrYWdlTmFtZS5sZW5ndGgoKTsKKyAgICAgICAgaWYgKG9mZnNldCA+IDApIG9mZnNldCsrOworICAgICAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKG9mZnNldCk7CisgICAgICAgIHJldHVybiBjbGFzc05hbWU7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFN0cmluZ1tdIG1ldGhvZEluZm8oTWV0aG9kIG1ldGhvZCl7CisgICAgICAgIFN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbTUVNQkVSX0VYQ0VQVElPTlNfSURYKzFdOworCSAgICBpbnQgbW9kID0gbWV0aG9kLmdldE1vZGlmaWVycygpOworICAgICAgICByZXN1bHRbTUVNQkVSX09SSUdJTl9JRFhdID0gSkFWQTsKKyAgICAgICAgcmVzdWx0W01FTUJFUl9ERUNMQVJFUl9JRFhdID0gc2hvcnROYW1lKG1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpKTsKKyAgICAgICAgcmVzdWx0W01FTUJFUl9NT0RJRklFUl9JRFhdID0gTW9kaWZpZXIudG9TdHJpbmcobW9kKTsKKyAgICAgICAgcmVzdWx0W01FTUJFUl9OQU1FX0lEWF0gPSBtZXRob2QuZ2V0TmFtZSgpOworICAgICAgICByZXN1bHRbTUVNQkVSX1RZUEVfSURYXSA9IHNob3J0TmFtZShtZXRob2QuZ2V0UmV0dXJuVHlwZSgpKTsKKwkgICAgQ2xhc3NbXSBwYXJhbXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCSAgICBmb3IgKGludCBqID0gMDsgaiA8IHBhcmFtcy5sZW5ndGg7IGorKykgeworCQkgICAgc2IuYXBwZW5kKHNob3J0TmFtZShwYXJhbXNbal0pKTsKKwkJICAgIGlmIChqIDwgKHBhcmFtcy5sZW5ndGggLSAxKSkgc2IuYXBwZW5kKCIsICIpOworCSAgICB9CisgICAgICAgIHJlc3VsdFtNRU1CRVJfUEFSQU1TX0lEWF0gPSBzYi50b1N0cmluZygpOworCSAgICBzYi5zZXRMZW5ndGgoMCk7CisJICAgIENsYXNzW10gZXhjZXB0aW9ucyA9IG1ldGhvZC5nZXRFeGNlcHRpb25UeXBlcygpOworCQlmb3IgKGludCBrID0gMDsgayA8IGV4Y2VwdGlvbnMubGVuZ3RoOyBrKyspIHsKKwkJICAgIHNiLmFwcGVuZChzaG9ydE5hbWUoZXhjZXB0aW9uc1trXSkpOworCQkgICAgaWYgKGsgPCAoZXhjZXB0aW9ucy5sZW5ndGggLSAxKSkgc2IuYXBwZW5kKCIsICIpOworCSAgICB9CisgICAgICAgIHJlc3VsdFtNRU1CRVJfRVhDRVBUSU9OU19JRFhdID0gc2IudG9TdHJpbmcoKTsKKwkgICAgcmV0dXJuIHdpdGhvdXROdWxscyhyZXN1bHQpOworICAgIH0KKworICAgIHByb3RlY3RlZCBTdHJpbmdbXSBtZXRob2RJbmZvKENvbnN0cnVjdG9yIGN0b3IpeworICAgICAgICBTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW01FTUJFUl9FWENFUFRJT05TX0lEWCsxXTsKKwkgICAgaW50IG1vZCA9IGN0b3IuZ2V0TW9kaWZpZXJzKCk7CisgICAgICAgIHJlc3VsdFtNRU1CRVJfT1JJR0lOX0lEWF0gPSBKQVZBOworICAgICAgICByZXN1bHRbTUVNQkVSX01PRElGSUVSX0lEWF0gPSBNb2RpZmllci50b1N0cmluZyhtb2QpOworICAgICAgICByZXN1bHRbTUVNQkVSX0RFQ0xBUkVSX0lEWF0gPSBzaG9ydE5hbWUoY3Rvci5nZXREZWNsYXJpbmdDbGFzcygpKTsKKyAgICAgICAgcmVzdWx0W01FTUJFUl9UWVBFX0lEWF0gPSBzaG9ydE5hbWUoY3Rvci5nZXREZWNsYXJpbmdDbGFzcygpKTsKKyAgICAgICAgcmVzdWx0W01FTUJFUl9OQU1FX0lEWF0gPSBjdG9yLmdldE5hbWUoKTsKKwkgICAgQ2xhc3NbXSBwYXJhbXMgPSBjdG9yLmdldFBhcmFtZXRlclR5cGVzKCk7CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwYXJhbXMubGVuZ3RoOyBqKyspIHsKKwkJICAgIHNiLmFwcGVuZChzaG9ydE5hbWUocGFyYW1zW2pdKSk7CisJCSAgICBpZiAoaiA8IChwYXJhbXMubGVuZ3RoIC0gMSkpIHNiLmFwcGVuZCgiLCAiKTsKKwkgICAgfQorICAgICAgICByZXN1bHRbTUVNQkVSX1BBUkFNU19JRFhdID0gc2IudG9TdHJpbmcoKTsKKwkgICAgc2Iuc2V0TGVuZ3RoKDApOworCSAgICBDbGFzc1tdIGV4Y2VwdGlvbnMgPSBjdG9yLmdldEV4Y2VwdGlvblR5cGVzKCk7CisJCWZvciAoaW50IGsgPSAwOyBrIDwgZXhjZXB0aW9ucy5sZW5ndGg7IGsrKykgeworCQkgICAgc2IuYXBwZW5kKHNob3J0TmFtZShleGNlcHRpb25zW2tdKSk7CisJCSAgICBpZiAoayA8IChleGNlcHRpb25zLmxlbmd0aCAtIDEpKSBzYi5hcHBlbmQoIiwgIik7CisJICAgIH0KKyAgICAgICAgcmVzdWx0W01FTUJFUl9FWENFUFRJT05TX0lEWF0gPSBzYi50b1N0cmluZygpOworCSAgICByZXR1cm4gd2l0aG91dE51bGxzKHJlc3VsdCk7CisgICAgfQorICAgIHByb3RlY3RlZCBTdHJpbmdbXSBtZXRob2RJbmZvKE1ldGFNZXRob2QgbWV0aG9kKXsKKyAgICAgICAgU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1tNRU1CRVJfRVhDRVBUSU9OU19JRFgrMV07CisJICAgIGludCBtb2QgPSBtZXRob2QuZ2V0TW9kaWZpZXJzKCk7CisgICAgICAgIHJlc3VsdFtNRU1CRVJfT1JJR0lOX0lEWF0gPSBHUk9PVlk7CisgICAgICAgIHJlc3VsdFtNRU1CRVJfTU9ESUZJRVJfSURYXSA9IE1vZGlmaWVyLnRvU3RyaW5nKG1vZCk7CisgICAgICAgIHJlc3VsdFtNRU1CRVJfREVDTEFSRVJfSURYXSA9IHNob3J0TmFtZShtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXRDYWNoZWRDbGFzcygpKTsKKyAgICAgICAgcmVzdWx0W01FTUJFUl9UWVBFX0lEWF0gPSBzaG9ydE5hbWUobWV0aG9kLmdldFJldHVyblR5cGUoKSk7CisgICAgICAgIHJlc3VsdFtNRU1CRVJfTkFNRV9JRFhdID0gbWV0aG9kLmdldE5hbWUoKTsKKwkgICAgQ2FjaGVkQ2xhc3NbXSBwYXJhbXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCSAgICBmb3IgKGludCBqID0gMDsgaiA8IHBhcmFtcy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgc2IuYXBwZW5kKHNob3J0TmFtZShwYXJhbXNbal0uZ2V0Q2FjaGVkQ2xhc3MoKSkpOworCQkgICAgaWYgKGogPCAocGFyYW1zLmxlbmd0aCAtIDEpKSBzYi5hcHBlbmQoIiwgIik7CisJICAgIH0KKyAgICAgICAgcmVzdWx0W01FTUJFUl9QQVJBTVNfSURYXSA9IHNiLnRvU3RyaW5nKCk7CisgICAgICAgIHJlc3VsdFtNRU1CRVJfRVhDRVBUSU9OU19JRFhdID0gTk9UX0FQUExJQ0FCTEU7IC8vIG5vIGV4Y2VwdGlvbiBpbmZvIGZvciBHcm9vdnkgTWV0YU1ldGhvZHMKKyAgICAgICAgcmV0dXJuIHdpdGhvdXROdWxscyhyZXN1bHQpOworICAgIH0KKworICAgIHByb3RlY3RlZCBTdHJpbmdbXSB3aXRob3V0TnVsbHMoU3RyaW5nW10gdG9Ob3JtYWxpemUpeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRvTm9ybWFsaXplLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgcyA9IHRvTm9ybWFsaXplW2ldOworICAgICAgICAgICAgaWYgKG51bGwgPT0gcykgdG9Ob3JtYWxpemVbaV0gPSBOT1RfQVBQTElDQUJMRTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdG9Ob3JtYWxpemU7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHByaW50KE9iamVjdFtdIG1lbWJlckluZm8pIHsKKyAgICAgICAgcHJpbnQoU3lzdGVtLm91dCwgbWVtYmVySW5mbyk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgcHJpbnQoZmluYWwgUHJpbnRTdHJlYW0gb3V0LCBPYmplY3RbXSBtZW1iZXJJbmZvKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVySW5mby5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nW10gbWV0YU1ldGhvZCA9IChTdHJpbmdbXSkgbWVtYmVySW5mb1tpXTsKKyAgICAgICAgICAgIG91dC5wcmludChpKyI6XHQiKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbWV0YU1ldGhvZC5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgIFN0cmluZyBzID0gbWV0YU1ldGhvZFtqXTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQocysiICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0LnByaW50bG4oIiIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uIHNvcnQoTGlzdCBtZW1iZXJJbmZvKSB7CisgICAgICAgIENvbGxlY3Rpb25zLnNvcnQobWVtYmVySW5mbywgbmV3IE1lbWJlckNvbXBhcmF0b3IoKSk7CisgICAgICAgIHJldHVybiBtZW1iZXJJbmZvOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWVtYmVyQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IgeworICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGEsIE9iamVjdCBiKSB7CisgICAgICAgICAgICBTdHJpbmdbXSBhU3RyID0gKFN0cmluZ1tdKSBhOworICAgICAgICAgICAgU3RyaW5nW10gYlN0ciA9IChTdHJpbmdbXSkgYjsKKyAgICAgICAgICAgIGludCByZXN1bHQgPSBhU3RyW0luc3BlY3Rvci5NRU1CRVJfTkFNRV9JRFhdLmNvbXBhcmVUbyhiU3RyW0luc3BlY3Rvci5NRU1CRVJfTkFNRV9JRFhdKTsKKyAgICAgICAgICAgIGlmICgwICE9IHJlc3VsdCkgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIHJlc3VsdCA9IGFTdHJbSW5zcGVjdG9yLk1FTUJFUl9UWVBFX0lEWF0uY29tcGFyZVRvKGJTdHJbSW5zcGVjdG9yLk1FTUJFUl9UWVBFX0lEWF0pOworICAgICAgICAgICAgaWYgKDAgIT0gcmVzdWx0KSByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgcmVzdWx0ID0gYVN0cltJbnNwZWN0b3IuTUVNQkVSX1BBUkFNU19JRFhdLmNvbXBhcmVUbyhiU3RyW0luc3BlY3Rvci5NRU1CRVJfUEFSQU1TX0lEWF0pOworICAgICAgICAgICAgaWYgKDAgIT0gcmVzdWx0KSByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgcmVzdWx0ID0gYVN0cltJbnNwZWN0b3IuTUVNQkVSX0RFQ0xBUkVSX0lEWF0uY29tcGFyZVRvKGJTdHJbSW5zcGVjdG9yLk1FTUJFUl9ERUNMQVJFUl9JRFhdKTsKKyAgICAgICAgICAgIGlmICgwICE9IHJlc3VsdCkgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIHJlc3VsdCA9IGFTdHJbSW5zcGVjdG9yLk1FTUJFUl9NT0RJRklFUl9JRFhdLmNvbXBhcmVUbyhiU3RyW0luc3BlY3Rvci5NRU1CRVJfTU9ESUZJRVJfSURYXSk7CisgICAgICAgICAgICBpZiAoMCAhPSByZXN1bHQpIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICByZXN1bHQgPSBhU3RyW0luc3BlY3Rvci5NRU1CRVJfT1JJR0lOX0lEWF0uY29tcGFyZVRvKGJTdHJbSW5zcGVjdG9yLk1FTUJFUl9PUklHSU5fSURYXSk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9pbnNwZWN0L3BhY2thZ2UuaHRtbCBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvaW5zcGVjdC9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjExNzQ0YgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvaW5zcGVjdC9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSw4IEBACis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPHRpdGxlPnBhY2thZ2UgZ3Jvb3Z5Lmluc3BlY3QuKjwvdGl0bGU+CisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgPHA+Q2xhc3NlcyBmb3IgaW5zcGVjdGluZyBvYmplY3QgcHJvcGVydGllcyB0aHJvdWdoIGludHJvc3BlY3Rpb24uPC9wPgorICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2luc3BlY3Qvc3dpbmd1aS9PYmplY3RCcm93c2VyLmdyb292eSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvaW5zcGVjdC9zd2luZ3VpL09iamVjdEJyb3dzZXIuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNDkwNWQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2luc3BlY3Qvc3dpbmd1aS9PYmplY3RCcm93c2VyLmdyb292eQpAQCAtMCwwICsxLDE1NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgZ3Jvb3Z5Lmluc3BlY3Quc3dpbmd1aQorCitpbXBvcnQgamF2YS5hd3QuKgoraW1wb3J0IGphdmF4LnN3aW5nLioKK2ltcG9ydCBncm9vdnkuc3dpbmcuU3dpbmdCdWlsZGVyCitpbXBvcnQgZ3Jvb3Z5Lmluc3BlY3QuSW5zcGVjdG9yCisKKy8qKgorQSBsaXR0bGUgR1VJIHRvIHNob3cgc29tZSBvZiB0aGUgSW5zcGVjdG9yIGNhcGFiaWxpdGllcy4KK1N0YXJ0aW5nIHRoaXMgc2NyaXB0IG9wZW5zIHRoZSBPYmplY3RCcm93c2VyIG9uICJzb21lIFN0cmluZyIuCitVc2UgaXQgaW4gZ3Jvb3Z5c2ggb3IgZ3Jvb3Z5Q29uc29sZSB0byBpbnNwZWN0IHlvdXIgb2JqZWN0IG9mCitpbnRlcmVzdCB3aXRoCis8Y29kZT4KK09iamVjdEJyb3dzZXIuaW5zcGVjdChteU9iamVjdCkKKzwvY29kZT4uCisKK0BhdXRob3IgRGllcmsgS29lbmlnCisqKi8KK2NsYXNzIE9iamVjdEJyb3dzZXIgeworICAgIAorICAgIGRlZiBpbnNwZWN0b3IKKyAgICBkZWYgc3dpbmcsIGZyYW1lLCBmaWVsZFRhYmxlLCBtZXRob2RUYWJsZSwgaXRlbVRhYmxlLCBtYXBUYWJsZQorCisgICAgc3RhdGljIHZvaWQgbWFpbihhcmdzKSB7CisgICAgICAgIGluc3BlY3QoInNvbWUgU3RyaW5nIikKKyAgICB9CisgICAgc3RhdGljIHZvaWQgaW5zcGVjdChvYmplY3RVbmRlckluc3BlY3Rpb24peworICAgICAgICBkZWYgYnJvd3NlciA9IG5ldyBPYmplY3RCcm93c2VyKCkKKyAgICAgICAgYnJvd3Nlci5pbnNwZWN0b3IgPSBuZXcgSW5zcGVjdG9yKG9iamVjdFVuZGVySW5zcGVjdGlvbikKKyAgICAgICAgYnJvd3Nlci5ydW4oKQorICAgIH0KKyAgICAKKyAgICB2b2lkIHJ1bigpIHsKKyAgICAgICAgVUlNYW5hZ2VyLnNldExvb2tBbmRGZWVsKFVJTWFuYWdlci5nZXRTeXN0ZW1Mb29rQW5kRmVlbENsYXNzTmFtZSgpKQorICAgICAgICBzd2luZyA9IG5ldyBTd2luZ0J1aWxkZXIoKQorICAgICAgICAKKyAgICAgICAgZnJhbWUgPSBzd2luZy5mcmFtZSh0aXRsZTonR3Jvb3Z5IE9iamVjdCBCcm93c2VyJywgbG9jYXRpb246WzIwMCwyMDBdLAorICAgICAgICAgICAgICAgIHNpemU6WzgwMCw2MDBdLCBwYWNrOiB0cnVlLCBzaG93OnRydWUsCisgICAgICAgICAgICAgICAgaWNvbkltYWdlOiBzd2luZy5pbWFnZUljb24oZ3Jvb3Z5LnVpLkNvbnNvbGUuSUNPTl9QQVRIKS5pbWFnZSwKKyAgICAgICAgICAgICAgICBkZWZhdWx0Q2xvc2VPcGVyYXRpb246V2luZG93Q29uc3RhbnRzLkRJU1BPU0VfT05fQ0xPU0UpIHsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIG1lbnVCYXIgeworICAgICAgICAgICAgICAgIG1lbnUodGV4dDonSGVscCcpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVudUl0ZW0oKSB7YWN0aW9uKG5hbWU6J0Fib3V0JywgY2xvc3VyZTogdGhpcy4mc2hvd0Fib3V0KX0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYW5lbCgpIHsKKyAgICAgICAgICAgICAgICBib3JkZXJMYXlvdXQoKQorICAgICAgICAgICAgICAgIHBhbmVsKCAgbmFtZToiQ2xhc3MgSW5mbyIsCisgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXI6IGVtcHR5Qm9yZGVyKFs1LDEwLDUsMTBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRzOkJvcmRlckxheW91dC5OT1JUSCkgeworICAgICAgICAgICAgICAgICAgICBmbG93TGF5b3V0KGFsaWdubWVudDpGbG93TGF5b3V0LkxFRlQpCisgICAgICAgICAgICAgICAgICAgIGRlZiBwcm9wcyA9IGluc3BlY3Rvci5jbGFzc1Byb3BzCisgICAgICAgICAgICAgICAgICAgIGRlZiBjbGFzc0xhYmVsID0gJzxodG1sPicgKyBwcm9wcy5qb2luKCc8YnI+JykKKyAgICAgICAgICAgICAgICAgICAgbGFiZWwoY2xhc3NMYWJlbCkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGFiYmVkUGFuZShjb25zdHJhaW50czpCb3JkZXJMYXlvdXQuQ0VOVEVSKXsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluc3BlY3Rvci5vYmplY3QgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSB7CisJICAgICAgICAgICAgICAgICAgICBzY3JvbGxQYW5lKG5hbWU6ICcgQ29sbGVjdGlvbiBkYXRhICcpIHsKKwkgICAgICAgICAgICAgICAgICAgICAgICBpdGVtVGFibGUgPSB0YWJsZSgpIHsKKwkgICAgICAgICAgICAgICAgICAgICAgICAJaW50IGkgPSAwCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZiBkYXRhID0gaW5zcGVjdG9yLm9iamVjdC5jb2xsZWN0IHsgdmFsIC0+IFtpKyssIHZhbF0gfQorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZU1vZGVsKGxpc3Q6ZGF0YSkgeworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc3VyZUNvbHVtbihoZWFkZXI6J0luZGV4JywgcmVhZDp7aXRbMF19KQorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc3VyZUNvbHVtbihoZWFkZXI6J1ZhbHVlJywgcmVhZDp7aXRbMV19KQorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisJICAgICAgICAgICAgICAgICAgICAgICAgfQorCSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChpbnNwZWN0b3Iub2JqZWN0IGluc3RhbmNlb2YgTWFwKSB7CisJICAgICAgICAgICAgICAgICAgICBzY3JvbGxQYW5lKG5hbWU6ICcgTWFwIGRhdGEgJykgeworCSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1UYWJsZSA9IHRhYmxlKCkgeworCSAgICAgICAgICAgICAgICAgICAgICAgIAlpbnQgaSA9IDAKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmIGRhdGEgPSBpbnNwZWN0b3Iub2JqZWN0LmNvbGxlY3QgeyBrZXksIHZhbCAtPiBbaSsrLCBrZXksIHZhbF0gfQorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZU1vZGVsKGxpc3Q6ZGF0YSkgeworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc3VyZUNvbHVtbihoZWFkZXI6J0luZGV4JywgcmVhZDp7aXRbMF19KQorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc3VyZUNvbHVtbihoZWFkZXI6J0tleScsICAgcmVhZDp7aXRbMV19KQorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc3VyZUNvbHVtbihoZWFkZXI6J1ZhbHVlJywgcmVhZDp7aXRbMl19KQorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisJICAgICAgICAgICAgICAgICAgICAgICAgfQorCSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNjcm9sbFBhbmUobmFtZTogJyBQdWJsaWMgRmllbGRzIGFuZCBQcm9wZXJ0aWVzICcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkVGFibGUgPSB0YWJsZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWYgZGF0YSA9IEluc3BlY3Rvci5zb3J0KGluc3BlY3Rvci5wdWJsaWNGaWVsZHMudG9MaXN0KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5hZGRBbGwoSW5zcGVjdG9yLnNvcnQoaW5zcGVjdG9yLnByb3BlcnR5SW5mby50b0xpc3QoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVNb2RlbChsaXN0OmRhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc3VyZUNvbHVtbihoZWFkZXI6J05hbWUnLCAgICAgICAgcmVhZDp7aXRbSW5zcGVjdG9yLk1FTUJFUl9OQU1FX0lEWF19KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zdXJlQ29sdW1uKGhlYWRlcjonVmFsdWUnLCAgICAgICByZWFkOntpdFtJbnNwZWN0b3IuTUVNQkVSX1ZBTFVFX0lEWF19KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zdXJlQ29sdW1uKGhlYWRlcjonVHlwZScsICAgICAgICByZWFkOntpdFtJbnNwZWN0b3IuTUVNQkVSX1RZUEVfSURYXX0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3N1cmVDb2x1bW4oaGVhZGVyOidPcmlnaW4nLCAgICAgIHJlYWQ6e2l0W0luc3BlY3Rvci5NRU1CRVJfT1JJR0lOX0lEWF19KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zdXJlQ29sdW1uKGhlYWRlcjonTW9kaWZpZXInLCAgICByZWFkOntpdFtJbnNwZWN0b3IuTUVNQkVSX01PRElGSUVSX0lEWF19KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zdXJlQ29sdW1uKGhlYWRlcjonRGVjbGFyZXInLCAgICByZWFkOntpdFtJbnNwZWN0b3IuTUVNQkVSX0RFQ0xBUkVSX0lEWF19KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzY3JvbGxQYW5lKG5hbWU6JyAoTWV0YSkgTWV0aG9kcyAnICkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kVGFibGUgPSB0YWJsZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWYgZGF0YSA9IEluc3BlY3Rvci5zb3J0KGluc3BlY3Rvci5tZXRob2RzLnRvTGlzdCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuYWRkQWxsKEluc3BlY3Rvci5zb3J0KGluc3BlY3Rvci5tZXRhTWV0aG9kcy50b0xpc3QoKSkpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZU1vZGVsKGxpc3Q6ZGF0YSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zdXJlQ29sdW1uKGhlYWRlcjonTmFtZScsICAgICAgICByZWFkOntpdFtJbnNwZWN0b3IuTUVNQkVSX05BTUVfSURYXX0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3N1cmVDb2x1bW4oaGVhZGVyOidQYXJhbXMnLCAgICAgIHJlYWQ6e2l0W0luc3BlY3Rvci5NRU1CRVJfUEFSQU1TX0lEWF19KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zdXJlQ29sdW1uKGhlYWRlcjonVHlwZScsICAgICAgICByZWFkOntpdFtJbnNwZWN0b3IuTUVNQkVSX1RZUEVfSURYXX0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3N1cmVDb2x1bW4oaGVhZGVyOidPcmlnaW4nLCAgICAgIHJlYWQ6e2l0W0luc3BlY3Rvci5NRU1CRVJfT1JJR0lOX0lEWF19KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zdXJlQ29sdW1uKGhlYWRlcjonTW9kaWZpZXInLCAgICByZWFkOntpdFtJbnNwZWN0b3IuTUVNQkVSX01PRElGSUVSX0lEWF19KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zdXJlQ29sdW1uKGhlYWRlcjonRGVjbGFyZXInLCAgICByZWFkOntpdFtJbnNwZWN0b3IuTUVNQkVSX0RFQ0xBUkVSX0lEWF19KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zdXJlQ29sdW1uKGhlYWRlcjonRXhjZXB0aW9ucycsICByZWFkOntpdFtJbnNwZWN0b3IuTUVNQkVSX0VYQ0VQVElPTlNfSURYXX0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBBZGQgYSBiaXQgb2YgZm9ybWF0dGluZworICAgICAgICBhZGRTb3J0ZXIoaXRlbVRhYmxlKQorICAgICAgICBhZGRTb3J0ZXIobWFwVGFibGUpCisgICAgICAgIGFkZFNvcnRlcihmaWVsZFRhYmxlKQorICAgICAgICBhZGRTb3J0ZXIobWV0aG9kVGFibGUpCisgICAgICAgIAorICAgICAgICBmcmFtZS50b0Zyb250KCkKKyAgICB9CisgICAgCisgICAgdm9pZCBhZGRTb3J0ZXIodGFibGUpIHsKKyAgICAJaWYgKHRhYmxlICE9IG51bGwpIHsKKwkgICAgCWRlZiBzb3J0ZXIgPSBuZXcgVGFibGVTb3J0ZXIodGFibGUubW9kZWwpCisgICAgCQl0YWJsZS5tb2RlbCA9IHNvcnRlcgorICAgIAkJc29ydGVyLmFkZE1vdXNlTGlzdGVuZXJUb0hlYWRlckluVGFibGUodGFibGUpCisgICAgCX0KKyAgICB9CisgICAgCisgICAgdm9pZCBzaG93QWJvdXQoRXZlbnRPYmplY3QgZXZ0KSB7CisgICAgICAgICBkZWYgcGFuZSA9IHN3aW5nLm9wdGlvblBhbmUoKQorICAgICAgICAgLy8gd29yayBhcm91bmQgR1JPT1ZZLTEwNDgKKyAgICAgICAgIHBhbmUuc2V0TWVzc2FnZSgnQW4gaW50ZXJhY3RpdmUgR1VJIHRvIGV4cGxvcmUgb2JqZWN0IGNhcGFiaWxpdGllcy4nKQorICAgICAgICAgZGVmIGRpYWxvZyA9IHBhbmUuY3JlYXRlRGlhbG9nKGZyYW1lLCAnQWJvdXQgR3Jvb3Z5IE9iamVjdCBCcm93c2VyJykKKyAgICAgICAgIGRpYWxvZy5zaG93KCkKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2luc3BlY3Qvc3dpbmd1aS9UYWJsZU1hcC5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9pbnNwZWN0L3N3aW5ndWkvVGFibGVNYXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Yzg0YTRhCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9pbnNwZWN0L3N3aW5ndWkvVGFibGVNYXAuamF2YQpAQCAtMCwwICsxLDg4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIGdyb292eS5pbnNwZWN0LnN3aW5ndWk7CisKKy8qKgorICogSW4gYSBjaGFpbiBvZiBkYXRhIG1hbmlwdWxhdG9ycyBzb21lIGJlaGF2aW91ciBpcyBjb21tb24uIFRhYmxlTWFwCisgKiBwcm92aWRlcyBtb3N0IG9mIHRoaXMgYmVoYXZvdXIgYW5kIGNhbiBiZSBzdWJjbGFzc2VkIGJ5IGZpbHRlcnMKKyAqIHRoYXQgb25seSBuZWVkIHRvIG92ZXJyaWRlIGEgaGFuZGZ1bCBvZiBzcGVjaWZpYyBtZXRob2RzLiBUYWJsZU1hcAorICogaW1wbGVtZW50cyBUYWJsZU1vZGVsIGJ5IHJvdXRpbmcgYWxsIHJlcXVlc3RzIHRvIGl0cyBtb2RlbCwgYW5kCisgKiBUYWJsZU1vZGVsTGlzdGVuZXIgYnkgcm91dGluZyBhbGwgZXZlbnRzIHRvIGl0cyBsaXN0ZW5lcnMuIEluc2VydGluZworICogYSBUYWJsZU1hcCB3aGljaCBoYXMgbm90IGJlZW4gc3ViY2xhc3NlZCBpbnRvIGEgY2hhaW4gb2YgdGFibGUgZmlsdGVycworICogc2hvdWxkIGhhdmUgbm8gZWZmZWN0LgorICoKKyAqIEB2ZXJzaW9uIDEuMTEgMDEvMjMvMDMKKyAqIEBhdXRob3IgUGhpbGlwIE1pbG5lICovCisKK2ltcG9ydCBqYXZheC5zd2luZy50YWJsZS4qOworaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LlRhYmxlTW9kZWxMaXN0ZW5lcjsKK2ltcG9ydCBqYXZheC5zd2luZy5ldmVudC5UYWJsZU1vZGVsRXZlbnQ7CisKK3B1YmxpYyBjbGFzcyBUYWJsZU1hcCBleHRlbmRzIEFic3RyYWN0VGFibGVNb2RlbCBpbXBsZW1lbnRzIFRhYmxlTW9kZWxMaXN0ZW5lcgoreworICAgIHByb3RlY3RlZCBUYWJsZU1vZGVsIG1vZGVsOworCisgICAgcHVibGljIFRhYmxlTW9kZWwgIGdldE1vZGVsKCkgeworICAgICAgICByZXR1cm4gbW9kZWw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgIHNldE1vZGVsKFRhYmxlTW9kZWwgbW9kZWwpIHsKKyAgICAgICAgdGhpcy5tb2RlbCA9IG1vZGVsOworICAgICAgICBtb2RlbC5hZGRUYWJsZU1vZGVsTGlzdGVuZXIodGhpcyk7CisgICAgfQorCisgICAgLy8gQnkgZGVmYXVsdCwgSW1wbGVtZW50IFRhYmxlTW9kZWwgYnkgZm9yd2FyZGluZyBhbGwgbWVzc2FnZXMKKyAgICAvLyB0byB0aGUgbW9kZWwuCisKKyAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlQXQoaW50IGFSb3csIGludCBhQ29sdW1uKSB7CisgICAgICAgIHJldHVybiBtb2RlbC5nZXRWYWx1ZUF0KGFSb3csIGFDb2x1bW4pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlQXQoT2JqZWN0IGFWYWx1ZSwgaW50IGFSb3csIGludCBhQ29sdW1uKSB7CisgICAgICAgIG1vZGVsLnNldFZhbHVlQXQoYVZhbHVlLCBhUm93LCBhQ29sdW1uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFJvd0NvdW50KCkgeworICAgICAgICByZXR1cm4gKG1vZGVsID09IG51bGwpID8gMCA6IG1vZGVsLmdldFJvd0NvdW50KCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRDb2x1bW5Db3VudCgpIHsKKyAgICAgICAgcmV0dXJuIChtb2RlbCA9PSBudWxsKSA/IDAgOiBtb2RlbC5nZXRDb2x1bW5Db3VudCgpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uTmFtZShpbnQgYUNvbHVtbikgeworICAgICAgICByZXR1cm4gbW9kZWwuZ2V0Q29sdW1uTmFtZShhQ29sdW1uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3MgZ2V0Q29sdW1uQ2xhc3MoaW50IGFDb2x1bW4pIHsKKyAgICAgICAgcmV0dXJuIG1vZGVsLmdldENvbHVtbkNsYXNzKGFDb2x1bW4pOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzQ2VsbEVkaXRhYmxlKGludCByb3csIGludCBjb2x1bW4pIHsKKyAgICAgICAgIHJldHVybiBtb2RlbC5pc0NlbGxFZGl0YWJsZShyb3csIGNvbHVtbik7CisgICAgfQorLy8KKy8vIEltcGxlbWVudGF0aW9uIG9mIHRoZSBUYWJsZU1vZGVsTGlzdGVuZXIgaW50ZXJmYWNlLAorLy8KKworICAgIC8vIEJ5IGRlZmF1bHQgZm9yd2FyZCBhbGwgZXZlbnRzIHRvIGFsbCB0aGUgbGlzdGVuZXJzLgorICAgIHB1YmxpYyB2b2lkIHRhYmxlQ2hhbmdlZChUYWJsZU1vZGVsRXZlbnQgZSkgeworICAgICAgICBmaXJlVGFibGVDaGFuZ2VkKGUpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9pbnNwZWN0L3N3aW5ndWkvVGFibGVTb3J0ZXIuamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvaW5zcGVjdC9zd2luZ3VpL1RhYmxlU29ydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU0ZjEyNwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvaW5zcGVjdC9zd2luZ3VpL1RhYmxlU29ydGVyLmphdmEKQEAgLTAsMCArMSwzMzEgQEAKKy8qCisgKiAkSWQkCisgKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBncm9vdnkuaW5zcGVjdC5zd2luZ3VpOworCisvKioKKyAqIEEgc29ydGVyIGZvciBUYWJsZU1vZGVscy4gVGhlIHNvcnRlciBoYXMgYSBtb2RlbCAoY29uZm9ybWluZyB0byBUYWJsZU1vZGVsKQorICogYW5kIGl0c2VsZiBpbXBsZW1lbnRzIFRhYmxlTW9kZWwuIFRhYmxlU29ydGVyIGRvZXMgbm90IHN0b3JlIG9yIGNvcHkKKyAqIHRoZSBkYXRhIGluIHRoZSBUYWJsZU1vZGVsLCBpbnN0ZWFkIGl0IG1haW50YWlucyBhbiBhcnJheSBvZgorICogaW50ZWdlcnMgd2hpY2ggaXQga2VlcHMgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgbnVtYmVyIG9mIHJvd3MgaW4gaXRzCisgKiBtb2RlbC4gV2hlbiB0aGUgbW9kZWwgY2hhbmdlcyBpdCBub3RpZmllcyB0aGUgc29ydGVyIHRoYXQgc29tZXRoaW5nCisgKiBoYXMgY2hhbmdlZCBlZy4gInJvd3NBZGRlZCIgc28gdGhhdCBpdHMgaW50ZXJuYWwgYXJyYXkgb2YgaW50ZWdlcnMKKyAqIGNhbiBiZSByZWFsbG9jYXRlZC4gQXMgcmVxdWVzdHMgYXJlIG1hZGUgb2YgdGhlIHNvcnRlciAobGlrZQorICogZ2V0VmFsdWVBdChyb3csIGNvbCkgaXQgcmVkaXJlY3RzIHRoZW0gdG8gaXRzIG1vZGVsIHZpYSB0aGUgbWFwcGluZworICogYXJyYXkuIFRoYXQgd2F5IHRoZSBUYWJsZVNvcnRlciBhcHBlYXJzIHRvIGhvbGQgYW5vdGhlciBjb3B5IG9mIHRoZSB0YWJsZQorICogd2l0aCB0aGUgcm93cyBpbiBhIGRpZmZlcmVudCBvcmRlci4gVGhlIHNvcnRpbmcgYWxnb3J0aG0gdXNlZCBpcyBzdGFibGUKKyAqIHdoaWNoIG1lYW5zIHRoYXQgaXQgZG9lcyBub3QgbW92ZSBhcm91bmQgcm93cyB3aGVuIGl0cyBjb21wYXJpc29uCisgKiBmdW5jdGlvbiByZXR1cm5zIDAgdG8gZGVub3RlIHRoYXQgdGhleSBhcmUgZXF1aXZhbGVudC4KKyAqCisgKiBAdmVyc2lvbiAxLjEyIDAxLzIzLzAzCisgKiBAYXV0aG9yIFBoaWxpcCBNaWxuZQorICogQGF1dGhvciBNaW5pbWFsIGFkanVzdG1lbnRzIGJ5IERpZXJrIEtvZW5pZywgSnVuZSAyMDA1CisgKi8KKworaW1wb3J0IGphdmF4LnN3aW5nLio7CitpbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuVGFibGVNb2RlbEV2ZW50OworaW1wb3J0IGphdmF4LnN3aW5nLnRhYmxlLkpUYWJsZUhlYWRlcjsKK2ltcG9ydCBqYXZheC5zd2luZy50YWJsZS5UYWJsZUNvbHVtbk1vZGVsOworaW1wb3J0IGphdmF4LnN3aW5nLnRhYmxlLlRhYmxlTW9kZWw7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuTW91c2VBZGFwdGVyOworaW1wb3J0IGphdmEuYXd0LmV2ZW50Lk1vdXNlRXZlbnQ7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworcHVibGljIGNsYXNzIFRhYmxlU29ydGVyIGV4dGVuZHMgVGFibGVNYXAgeworICAgIGludCBpbmRleGVzW107CisgICAgVmVjdG9yIHNvcnRpbmdDb2x1bW5zID0gbmV3IFZlY3RvcigpOworICAgIGJvb2xlYW4gYXNjZW5kaW5nID0gdHJ1ZTsKKyAgICBpbnQgbGFzdFNvcnRlZENvbHVtbiA9IC0xOworCisgICAgcHVibGljIFRhYmxlU29ydGVyKCkgeworICAgICAgICBpbmRleGVzID0gbmV3IGludFswXTsgLy8gRm9yIGNvbnNpc3RlbmN5LgorICAgIH0KKworICAgIHB1YmxpYyBUYWJsZVNvcnRlcihUYWJsZU1vZGVsIG1vZGVsKSB7CisgICAgICAgIHNldE1vZGVsKG1vZGVsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNb2RlbChUYWJsZU1vZGVsIG1vZGVsKSB7CisgICAgICAgIHN1cGVyLnNldE1vZGVsKG1vZGVsKTsKKyAgICAgICAgcmVhbGxvY2F0ZUluZGV4ZXMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGNvbXBhcmVSb3dzQnlDb2x1bW4oaW50IHJvdzEsIGludCByb3cyLCBpbnQgY29sdW1uKSB7CisgICAgICAgIENsYXNzIHR5cGUgPSBtb2RlbC5nZXRDb2x1bW5DbGFzcyhjb2x1bW4pOworICAgICAgICBUYWJsZU1vZGVsIGRhdGEgPSBtb2RlbDsKKworICAgICAgICAvLyBDaGVjayBmb3IgbnVsbHMKKworICAgICAgICBPYmplY3QgbzEgPSBkYXRhLmdldFZhbHVlQXQocm93MSwgY29sdW1uKTsKKyAgICAgICAgT2JqZWN0IG8yID0gZGF0YS5nZXRWYWx1ZUF0KHJvdzIsIGNvbHVtbik7CisKKyAgICAgICAgLy8gSWYgYm90aCB2YWx1ZXMgYXJlIG51bGwgcmV0dXJuIDAKKyAgICAgICAgaWYgKG8xID09IG51bGwgJiYgbzIgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0gZWxzZSBpZiAobzEgPT0gbnVsbCkgeyAvLyBEZWZpbmUgbnVsbCBsZXNzIHRoYW4gZXZlcnl0aGluZy4KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfSBlbHNlIGlmIChvMiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorCisvKiBXZSBjb3B5IGFsbCByZXR1cm5lZCB2YWx1ZXMgZnJvbSB0aGUgZ2V0VmFsdWUgY2FsbCBpbiBjYXNlCithbiBvcHRpbWlzZWQgbW9kZWwgaXMgcmV1c2luZyBvbmUgb2JqZWN0IHRvIHJldHVybiBtYW55IHZhbHVlcy4KK1RoZSBOdW1iZXIgc3ViY2xhc3NlcyBpbiB0aGUgSkRLIGFyZSBpbW11dGFibGUgYW5kIHNvIHdpbGwgbm90IGJlIHVzZWQgaW4KK3RoaXMgd2F5IGJ1dCBvdGhlciBzdWJjbGFzc2VzIG9mIE51bWJlciBtaWdodCB3YW50IHRvIGRvIHRoaXMgdG8gc2F2ZQorc3BhY2UgYW5kIGF2b2lkIHVubmVjZXNzYXJ5IGhlYXAgYWxsb2NhdGlvbi4KKyovCisgICAgICAgIGlmICh0eXBlLmdldFN1cGVyY2xhc3MoKSA9PSBqYXZhLmxhbmcuTnVtYmVyLmNsYXNzKSB7CisgICAgICAgICAgICByZXR1cm4gY29tcGFyZU51bWJlcnMoZGF0YSwgcm93MSwgY29sdW1uLCByb3cyKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0eXBlID09IGphdmEudXRpbC5EYXRlLmNsYXNzKSB7CisgICAgICAgICAgICByZXR1cm4gY29tcGFyZURhdGVzKGRhdGEsIHJvdzEsIGNvbHVtbiwgcm93Mik7CisgICAgICAgIH0KKworICAgICAgICBpZiAodHlwZSA9PSBTdHJpbmcuY2xhc3MpIHsKKyAgICAgICAgICAgIHJldHVybiBjb21wYXJlU3RyaW5ncyhkYXRhLCByb3cxLCBjb2x1bW4sIHJvdzIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHR5cGUgPT0gQm9vbGVhbi5jbGFzcykgeworICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmVCb29sZWFucyhkYXRhLCByb3cxLCBjb2x1bW4sIHJvdzIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjb21wYXJlT2JqZWN0cyhkYXRhLCByb3cxLCBjb2x1bW4sIHJvdzIpOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGNvbXBhcmVPYmplY3RzKFRhYmxlTW9kZWwgZGF0YSwgaW50IHJvdzEsIGludCBjb2x1bW4sIGludCByb3cyKSB7CisgICAgICAgIE9iamVjdCB2MSA9IGRhdGEuZ2V0VmFsdWVBdChyb3cxLCBjb2x1bW4pOworICAgICAgICBTdHJpbmcgczEgPSB2MS50b1N0cmluZygpOworICAgICAgICBPYmplY3QgdjIgPSBkYXRhLmdldFZhbHVlQXQocm93MiwgY29sdW1uKTsKKyAgICAgICAgU3RyaW5nIHMyID0gdjIudG9TdHJpbmcoKTsKKyAgICAgICAgaW50IHJlc3VsdCA9IHMxLmNvbXBhcmVUbyhzMik7CisKKyAgICAgICAgaWYgKHJlc3VsdCA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChyZXN1bHQgPiAwKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGNvbXBhcmVCb29sZWFucyhUYWJsZU1vZGVsIGRhdGEsIGludCByb3cxLCBpbnQgY29sdW1uLCBpbnQgcm93MikgeworICAgICAgICBCb29sZWFuIGJvb2wxID0gKEJvb2xlYW4pIGRhdGEuZ2V0VmFsdWVBdChyb3cxLCBjb2x1bW4pOworICAgICAgICBib29sZWFuIGIxID0gYm9vbDEuYm9vbGVhblZhbHVlKCk7CisgICAgICAgIEJvb2xlYW4gYm9vbDIgPSAoQm9vbGVhbikgZGF0YS5nZXRWYWx1ZUF0KHJvdzIsIGNvbHVtbik7CisgICAgICAgIGJvb2xlYW4gYjIgPSBib29sMi5ib29sZWFuVmFsdWUoKTsKKworICAgICAgICBpZiAoYjEgPT0gYjIpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKGIxKSAvLyBEZWZpbmUgZmFsc2UgPCB0cnVlCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGNvbXBhcmVTdHJpbmdzKFRhYmxlTW9kZWwgZGF0YSwgaW50IHJvdzEsIGludCBjb2x1bW4sIGludCByb3cyKSB7CisgICAgICAgIFN0cmluZyBzMSA9IChTdHJpbmcpIGRhdGEuZ2V0VmFsdWVBdChyb3cxLCBjb2x1bW4pOworICAgICAgICBTdHJpbmcgczIgPSAoU3RyaW5nKSBkYXRhLmdldFZhbHVlQXQocm93MiwgY29sdW1uKTsKKyAgICAgICAgaW50IHJlc3VsdCA9IHMxLmNvbXBhcmVUbyhzMik7CisKKyAgICAgICAgaWYgKHJlc3VsdCA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChyZXN1bHQgPiAwKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGNvbXBhcmVEYXRlcyhUYWJsZU1vZGVsIGRhdGEsIGludCByb3cxLCBpbnQgY29sdW1uLCBpbnQgcm93MikgeworICAgICAgICBEYXRlIGQxID0gKERhdGUpIGRhdGEuZ2V0VmFsdWVBdChyb3cxLCBjb2x1bW4pOworICAgICAgICBsb25nIG4xID0gZDEuZ2V0VGltZSgpOworICAgICAgICBEYXRlIGQyID0gKERhdGUpIGRhdGEuZ2V0VmFsdWVBdChyb3cyLCBjb2x1bW4pOworICAgICAgICBsb25nIG4yID0gZDIuZ2V0VGltZSgpOworCisgICAgICAgIGlmIChuMSA8IG4yKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAobjEgPiBuMikKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBjb21wYXJlTnVtYmVycyhUYWJsZU1vZGVsIGRhdGEsIGludCByb3cxLCBpbnQgY29sdW1uLCBpbnQgcm93MikgeworICAgICAgICBOdW1iZXIgbjEgPSAoTnVtYmVyKSBkYXRhLmdldFZhbHVlQXQocm93MSwgY29sdW1uKTsKKyAgICAgICAgZG91YmxlIGQxID0gbjEuZG91YmxlVmFsdWUoKTsKKyAgICAgICAgTnVtYmVyIG4yID0gKE51bWJlcikgZGF0YS5nZXRWYWx1ZUF0KHJvdzIsIGNvbHVtbik7CisgICAgICAgIGRvdWJsZSBkMiA9IG4yLmRvdWJsZVZhbHVlKCk7CisKKyAgICAgICAgaWYgKGQxIDwgZDIpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChkMSA+IGQyKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgY29tcGFyZShpbnQgcm93MSwgaW50IHJvdzIpIHsKKyAgICAgICAgZm9yIChpbnQgbGV2ZWwgPSAwOyBsZXZlbCA8IHNvcnRpbmdDb2x1bW5zLnNpemUoKTsgbGV2ZWwrKykgeworICAgICAgICAgICAgSW50ZWdlciBjb2x1bW4gPSAoSW50ZWdlcikgc29ydGluZ0NvbHVtbnMuZWxlbWVudEF0KGxldmVsKTsKKyAgICAgICAgICAgIGludCByZXN1bHQgPSBjb21wYXJlUm93c0J5Q29sdW1uKHJvdzEsIHJvdzIsIGNvbHVtbi5pbnRWYWx1ZSgpKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gYXNjZW5kaW5nID8gcmVzdWx0IDogLXJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZWFsbG9jYXRlSW5kZXhlcygpIHsKKyAgICAgICAgaW50IHJvd0NvdW50ID0gbW9kZWwuZ2V0Um93Q291bnQoKTsKKworICAgICAgICAvLyBTZXQgdXAgYSBuZXcgYXJyYXkgb2YgaW5kZXhlcyB3aXRoIHRoZSByaWdodCBudW1iZXIgb2YgZWxlbWVudHMKKyAgICAgICAgLy8gZm9yIHRoZSBuZXcgZGF0YSBtb2RlbC4KKyAgICAgICAgaW5kZXhlcyA9IG5ldyBpbnRbcm93Q291bnRdOworCisgICAgICAgIC8vIEluaXRpYWxpc2Ugd2l0aCB0aGUgaWRlbnRpdHkgbWFwcGluZy4KKyAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgcm93Q291bnQ7IHJvdysrKQorICAgICAgICAgICAgaW5kZXhlc1tyb3ddID0gcm93OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRhYmxlQ2hhbmdlZChUYWJsZU1vZGVsRXZlbnQgZSkgeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNvcnRlcjogdGFibGVDaGFuZ2VkIik7CisgICAgICAgIHJlYWxsb2NhdGVJbmRleGVzKCk7CisKKyAgICAgICAgc3VwZXIudGFibGVDaGFuZ2VkKGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNoZWNrTW9kZWwoKSB7CisgICAgICAgIGlmIChpbmRleGVzLmxlbmd0aCAhPSBtb2RlbC5nZXRSb3dDb3VudCgpKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlNvcnRlciBub3QgaW5mb3JtZWQgb2YgYSBjaGFuZ2UgaW4gbW9kZWwuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzb3J0KE9iamVjdCBzZW5kZXIpIHsKKyAgICAgICAgY2hlY2tNb2RlbCgpOworICAgICAgICBzaHV0dGxlc29ydCgoaW50W10pIGluZGV4ZXMuY2xvbmUoKSwgaW5kZXhlcywgMCwgaW5kZXhlcy5sZW5ndGgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG4yc29ydCgpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBnZXRSb3dDb3VudCgpOyBpKyspIHsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSBpICsgMTsgaiA8IGdldFJvd0NvdW50KCk7IGorKykgeworICAgICAgICAgICAgICAgIGlmIChjb21wYXJlKGluZGV4ZXNbaV0sIGluZGV4ZXNbal0pID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIHN3YXAoaSwgaik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gVGhpcyBpcyBhIGhvbWUtZ3Jvd24gaW1wbGVtZW50YXRpb24gd2hpY2ggd2UgaGF2ZSBub3QgaGFkIHRpbWUKKyAgICAvLyB0byByZXNlYXJjaCAtIGl0IG1heSBwZXJmb3JtIHBvb3JseSBpbiBzb21lIGNpcmN1bXN0YW5jZXMuIEl0CisgICAgLy8gcmVxdWlyZXMgdHdpY2UgdGhlIHNwYWNlIG9mIGFuIGluLXBsYWNlIGFsZ29yaXRobSBhbmQgbWFrZXMKKyAgICAvLyBObG9nTiBhc3NpZ21lbnRzIHNodXR0bGluZyB0aGUgdmFsdWVzIGJldHdlZW4gdGhlIHR3bworICAgIC8vIGFycmF5cy4gVGhlIG51bWJlciBvZiBjb21wYXJlcyBhcHBlYXJzIHRvIHZhcnkgYmV0d2VlbiBOLTEgYW5kCisgICAgLy8gTmxvZ04gZGVwZW5kaW5nIG9uIHRoZSBpbml0aWFsIG9yZGVyIGJ1dCB0aGUgbWFpbiByZWFzb24gZm9yCisgICAgLy8gdXNpbmcgaXQgaGVyZSBpcyB0aGF0LCB1bmxpa2UgcXNvcnQsIGl0IGlzIHN0YWJsZS4KKyAgICBwdWJsaWMgdm9pZCBzaHV0dGxlc29ydChpbnQgZnJvbVtdLCBpbnQgdG9bXSwgaW50IGxvdywgaW50IGhpZ2gpIHsKKyAgICAgICAgaWYgKGhpZ2ggLSBsb3cgPCAyKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaW50IG1pZGRsZSA9IChsb3cgKyBoaWdoKSAvIDI7CisgICAgICAgIHNodXR0bGVzb3J0KHRvLCBmcm9tLCBsb3csIG1pZGRsZSk7CisgICAgICAgIHNodXR0bGVzb3J0KHRvLCBmcm9tLCBtaWRkbGUsIGhpZ2gpOworCisgICAgICAgIGludCBwID0gbG93OworICAgICAgICBpbnQgcSA9IG1pZGRsZTsKKworICAgICAgICAvKiBUaGlzIGlzIGFuIG9wdGlvbmFsIHNob3J0LWN1dDsgYXQgZWFjaCByZWN1cnNpdmUgY2FsbCwKKyAgICAgICAgY2hlY2sgdG8gc2VlIGlmIHRoZSBlbGVtZW50cyBpbiB0aGlzIHN1YnNldCBhcmUgYWxyZWFkeQorICAgICAgICBvcmRlcmVkLiAgSWYgc28sIG5vIGZ1cnRoZXIgY29tcGFyaXNvbnMgYXJlIG5lZWRlZDsgdGhlCisgICAgICAgIHN1Yi1hcnJheSBjYW4ganVzdCBiZSBjb3BpZWQuICBUaGUgYXJyYXkgbXVzdCBiZSBjb3BpZWQgcmF0aGVyCisgICAgICAgIHRoYW4gYXNzaWduZWQgb3RoZXJ3aXNlIHNpc3RlciBjYWxscyBpbiB0aGUgcmVjdXJzaW9uIG1pZ2h0CisgICAgICAgIGdldCBvdXQgb2Ygc2luYy4gIFdoZW4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpcyB0aHJlZSB0aGV5CisgICAgICAgIGFyZSBwYXJ0aXRpb25lZCBzbyB0aGF0IHRoZSBmaXJzdCBzZXQsIFtsb3csIG1pZCksIGhhcyBvbmUKKyAgICAgICAgZWxlbWVudCBhbmQgYW5kIHRoZSBzZWNvbmQsIFttaWQsIGhpZ2gpLCBoYXMgdHdvLiBXZSBza2lwIHRoZQorICAgICAgICBvcHRpbWlzYXRpb24gd2hlbiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGlzIHRocmVlIG9yIGxlc3MgYXMKKyAgICAgICAgdGhlIGZpcnN0IGNvbXBhcmUgaW4gdGhlIG5vcm1hbCBtZXJnZSB3aWxsIHByb2R1Y2UgdGhlIHNhbWUKKyAgICAgICAgc2VxdWVuY2Ugb2Ygc3RlcHMuIFRoaXMgb3B0aW1pc2F0aW9uIHNlZW1zIHRvIGJlIHdvcnRod2hpbGUKKyAgICAgICAgZm9yIHBhcnRpYWxseSBvcmRlcmVkIGxpc3RzIGJ1dCBzb21lIGFuYWx5c2lzIGlzIG5lZWRlZCB0bworICAgICAgICBmaW5kIG91dCBob3cgdGhlIHBlcmZvcm1hbmNlIGRyb3BzIHRvIE5sb2coTikgYXMgdGhlIGluaXRpYWwKKyAgICAgICAgb3JkZXIgZGltaW5pc2hlcyAtIGl0IG1heSBkcm9wIHZlcnkgcXVpY2tseS4gICovCisKKyAgICAgICAgaWYgKGhpZ2ggLSBsb3cgPj0gNCAmJiBjb21wYXJlKGZyb21bbWlkZGxlIC0gMV0sIGZyb21bbWlkZGxlXSkgPD0gMCkgeworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShmcm9tLCBsb3csIHRvLCBsb3csIGhpZ2ggLSBsb3cpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gQSBub3JtYWwgbWVyZ2UuCisKKyAgICAgICAgZm9yIChpbnQgaSA9IGxvdzsgaSA8IGhpZ2g7IGkrKykgeworICAgICAgICAgICAgaWYgKHEgPj0gaGlnaCB8fCAocCA8IG1pZGRsZSAmJiBjb21wYXJlKGZyb21bcF0sIGZyb21bcV0pIDw9IDApKSB7CisgICAgICAgICAgICAgICAgdG9baV0gPSBmcm9tW3ArK107CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRvW2ldID0gZnJvbVtxKytdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3dhcChpbnQgaSwgaW50IGopIHsKKyAgICAgICAgaW50IHRtcCA9IGluZGV4ZXNbaV07CisgICAgICAgIGluZGV4ZXNbaV0gPSBpbmRleGVzW2pdOworICAgICAgICBpbmRleGVzW2pdID0gdG1wOworICAgIH0KKworICAgIC8vIFRoZSBtYXBwaW5nIG9ubHkgYWZmZWN0cyB0aGUgY29udGVudHMgb2YgdGhlIGRhdGEgcm93cy4KKyAgICAvLyBQYXNzIGFsbCByZXF1ZXN0cyB0byB0aGVzZSByb3dzIHRocm91Z2ggdGhlIG1hcHBpbmcgYXJyYXk6ICJpbmRleGVzIi4KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWVBdChpbnQgYVJvdywgaW50IGFDb2x1bW4pIHsKKyAgICAgICAgY2hlY2tNb2RlbCgpOworICAgICAgICByZXR1cm4gbW9kZWwuZ2V0VmFsdWVBdChpbmRleGVzW2FSb3ddLCBhQ29sdW1uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZUF0KE9iamVjdCBhVmFsdWUsIGludCBhUm93LCBpbnQgYUNvbHVtbikgeworICAgICAgICBjaGVja01vZGVsKCk7CisgICAgICAgIG1vZGVsLnNldFZhbHVlQXQoYVZhbHVlLCBpbmRleGVzW2FSb3ddLCBhQ29sdW1uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzb3J0QnlDb2x1bW4oaW50IGNvbHVtbikgeworICAgICAgICBzb3J0QnlDb2x1bW4oY29sdW1uLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzb3J0QnlDb2x1bW4oaW50IGNvbHVtbiwgYm9vbGVhbiBhc2NlbmRpbmcpIHsKKyAgICAgICAgdGhpcy5hc2NlbmRpbmcgPSBhc2NlbmRpbmc7CisgICAgICAgIHNvcnRpbmdDb2x1bW5zLnJlbW92ZUFsbEVsZW1lbnRzKCk7CisgICAgICAgIHNvcnRpbmdDb2x1bW5zLmFkZEVsZW1lbnQobmV3IEludGVnZXIoY29sdW1uKSk7CisgICAgICAgIHNvcnQodGhpcyk7CisgICAgICAgIHN1cGVyLnRhYmxlQ2hhbmdlZChuZXcgVGFibGVNb2RlbEV2ZW50KHRoaXMpKTsKKyAgICB9CisKKyAgICAvLyBUaGVyZSBpcyBuby13aGVyZSBlbHNlIHRvIHB1dCB0aGlzLgorICAgIC8vIEFkZCBhIG1vdXNlIGxpc3RlbmVyIHRvIHRoZSBUYWJsZSB0byB0cmlnZ2VyIGEgdGFibGUgc29ydAorICAgIC8vIHdoZW4gYSBjb2x1bW4gaGVhZGluZyBpcyBjbGlja2VkIGluIHRoZSBKVGFibGUuCisgICAgcHVibGljIHZvaWQgYWRkTW91c2VMaXN0ZW5lclRvSGVhZGVySW5UYWJsZShKVGFibGUgdGFibGUpIHsKKyAgICAgICAgZmluYWwgVGFibGVTb3J0ZXIgc29ydGVyID0gdGhpczsKKyAgICAgICAgZmluYWwgSlRhYmxlIHRhYmxlVmlldyA9IHRhYmxlOworICAgICAgICB0YWJsZVZpZXcuc2V0Q29sdW1uU2VsZWN0aW9uQWxsb3dlZChmYWxzZSk7CisgICAgICAgIE1vdXNlQWRhcHRlciBsaXN0TW91c2VMaXN0ZW5lciA9IG5ldyBNb3VzZUFkYXB0ZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZUNsaWNrZWQoTW91c2VFdmVudCBlKSB7CisgICAgICAgICAgICAgICAgVGFibGVDb2x1bW5Nb2RlbCBjb2x1bW5Nb2RlbCA9IHRhYmxlVmlldy5nZXRDb2x1bW5Nb2RlbCgpOworICAgICAgICAgICAgICAgIGludCB2aWV3Q29sdW1uID0gY29sdW1uTW9kZWwuZ2V0Q29sdW1uSW5kZXhBdFgoZS5nZXRYKCkpOworICAgICAgICAgICAgICAgIGludCBjb2x1bW4gPSB0YWJsZVZpZXcuY29udmVydENvbHVtbkluZGV4VG9Nb2RlbCh2aWV3Q29sdW1uKTsKKyAgICAgICAgICAgICAgICBpZiAoZS5nZXRDbGlja0NvdW50KCkgPT0gMSAmJiBjb2x1bW4gIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RTb3J0ZWRDb2x1bW4gPT0gY29sdW1uKSBhc2NlbmRpbmcgPSAhYXNjZW5kaW5nOworICAgICAgICAgICAgICAgICAgICBzb3J0ZXIuc29ydEJ5Q29sdW1uKGNvbHVtbiwgYXNjZW5kaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgbGFzdFNvcnRlZENvbHVtbiA9IGNvbHVtbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIEpUYWJsZUhlYWRlciB0aCA9IHRhYmxlVmlldy5nZXRUYWJsZUhlYWRlcigpOworICAgICAgICB0aC5hZGRNb3VzZUxpc3RlbmVyKGxpc3RNb3VzZUxpc3RlbmVyKTsKKyAgICB9CisKKworfQorCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2luc3BlY3Qvc3dpbmd1aS9wYWNrYWdlLmh0bWwgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2luc3BlY3Qvc3dpbmd1aS9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQxYTk2ZQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvaW5zcGVjdC9zd2luZ3VpL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDggQEAKKzxodG1sPgorICA8aGVhZD4KKyAgICA8dGl0bGU+cGFja2FnZSBncm9vdnkuaW5zcGVjdC5zd2luZ3VpLio8L3RpdGxlPgorICA8L2hlYWQ+CisgIDxib2R5PgorICAgIDxwPkNsYXNzZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBTd2luZyBHVUkgZm9yIGluc3BlY3Rpbmcgb2JqZWN0cy48L3A+CisgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvaW8vUGxhdGZvcm1MaW5lV3JpdGVyLmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2lvL1BsYXRmb3JtTGluZVdyaXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZTRjNDgKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2lvL1BsYXRmb3JtTGluZVdyaXRlci5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKK3BhY2thZ2UgZ3Jvb3Z5LmlvOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisvKioKKyAqIEEgYnVmZmVyZWQgd3JpdGVyIHRoYXQgZ29iYmxlcyBhbnkgXHIgY2hhcmFjdGVycworICogYW5kIHJlcGxhY2VzIGV2ZXJ5IFxuIHdpdGggYSBwbGF0Zm9ybSBzcGVjaWZpYyBuZXdsaW5lLgorICogSW4gbWFueSBwbGFjZXMgR3Jvb3Z5IG5vcm1hbGlzZXMgc3RyZWFtcyB0byBvbmx5IGhhdmUgXG4KKyAqIGNoYXJhY3RlcnMgYnV0IHdoZW4gY3JlYXRpbmcgZmlsZXMgdGhhdCBtdXN0IGJlIHVzZWQKKyAqIGJ5IG90aGVyIHBsYXRmb3JtLWF3YXJlIHRvb2xzLCB5b3Ugc29tZXRpbWVzIHdhbnQgdGhlCisgKiBuZXdsaW5lcyB0byBtYXRjaCB3aGF0IHRoZSBwbGF0Zm9ybSBleHBlY3RzLgorICoKKyAqIEBhdXRob3IgUGF1bCBLaW5nCisgKi8KK3B1YmxpYyBjbGFzcyBQbGF0Zm9ybUxpbmVXcml0ZXIgZXh0ZW5kcyBXcml0ZXIgeworICAgIHByaXZhdGUgQnVmZmVyZWRXcml0ZXIgd3JpdGVyOworCisgICAgcHVibGljIFBsYXRmb3JtTGluZVdyaXRlcihXcml0ZXIgb3V0KSB7CisgICAgICAgIHdyaXRlciA9IG5ldyBCdWZmZXJlZFdyaXRlcihvdXQpOworICAgIH0KKworICAgIHB1YmxpYyBQbGF0Zm9ybUxpbmVXcml0ZXIoV3JpdGVyIG91dCwgaW50IHN6KSB7CisgICAgICAgIHdyaXRlciA9IG5ldyBCdWZmZXJlZFdyaXRlcihvdXQsIHN6KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShjaGFyIGNidWZbXSwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yICg7IGxlbiA+IDA7IGxlbi0tKSB7CisgICAgICAgICAgICBjaGFyIGMgPSBjYnVmW29mZisrXTsKKyAgICAgICAgICAgIGlmIChjID09ICdcbicpIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIubmV3TGluZSgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjICE9ICdccicpIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHdyaXRlci5mbHVzaCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGVyLmNsb3NlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9pby9wYWNrYWdlLmh0bWwgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2lvL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjcwZjM3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9pby9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSw4IEBACis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPHRpdGxlPnBhY2thZ2UgZ3Jvb3Z5LmlvLio8L3RpdGxlPgorICA8L2hlYWQ+CisgIDxib2R5PgorICAgIDxwPkNsYXNzZXMgZm9yIEdyb292aWVyIElucHV0L091dHB1dC48L3A+CisgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbGFuZy9BZGFwdGluZ01ldGFDbGFzcy5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL0FkYXB0aW5nTWV0YUNsYXNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZlYzU0MwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbGFuZy9BZGFwdGluZ01ldGFDbGFzcy5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBncm9vdnkubGFuZzsKKworLyoqCisgKiBBbiBpbnRlcmZhY2UgZm9yIE1ldGFDbGFzcyBpbnN0YW5jZXMgdGhhdCAiYWRhcHQiIG90aGVyIE1ldGFDbGFzcyBpbnN0YW5jZXMgc3VjaCBhcyBhIHByb3h5IG9yCisgKiBkZWxlZ2F0aW5nIE1ldGFDbGFzcworICoKKyAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgorICogQHNpbmNlIDEuMQorICoKKyAqICAgICAgICA8cC8+CisgKiAgICAgICAgQ3JlYXRlZDogQXByIDE2LCAyMDA3CisgKiAgICAgICAgVGltZTogOTozNTo0MiBQTQorICovCitwdWJsaWMgaW50ZXJmYWNlIEFkYXB0aW5nTWV0YUNsYXNzIGV4dGVuZHMgTWV0YUNsYXNzIHsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIE1ldGFDbGFzcyB0aGF0IHRoaXMgYWRhcHRlciBhZGFwdHMKKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIE1ldGFDbGFzcyBpbnN0YW5jZQorICAgICAqLworICAgIE1ldGFDbGFzcyBnZXRBZGFwdGVlKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBNZXRhQ2xhc3MgYWRhcHRlZCBieSB0aGlzIE1ldGFDbGFzcworICAgICAqCisgICAgICogQHBhcmFtIG1ldGFDbGFzcyBUaGUgTWV0YUNsYXNzIHRvIGFkYXB0CisgICAgICovCisgICAgdm9pZCBzZXRBZGFwdGVlKE1ldGFDbGFzcyBtZXRhQ2xhc3MpOworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL0JlbmNobWFya0ludGVyY2VwdG9yLmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvQmVuY2htYXJrSW50ZXJjZXB0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWNhMjZjCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL0JlbmNobWFya0ludGVyY2VwdG9yLmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgZ3Jvb3Z5Lmxhbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworLyoqCisgKiBJbnRlcmNlcHRvciB0aGF0IHJlZ2lzdGVycyB0aGUgdGltZXN0YW1wIG9mIGVhY2ggbWV0aG9kIGNhbGwKKyAqIGJlZm9yZSBhbmQgYWZ0ZXIgaW52b2NhdGlvbi4KKyAqLworcHVibGljIGNsYXNzIEJlbmNobWFya0ludGVyY2VwdG9yIGltcGxlbWVudHMgSW50ZXJjZXB0b3IgeworCisgICAgcHJvdGVjdGVkIE1hcCBjYWxscyA9IG5ldyBIYXNoTWFwKCk7IC8vIGtleXMgdG8gbGlzdCBvZiBpbnZvY2F0aW9uIHRpbWVzIGFuZCBiZWZvcmUgYW5kIGFmdGVyCisKKworICAgIHB1YmxpYyBNYXAgZ2V0Q2FsbHMoKSB7CisgICAgICAgIHJldHVybiBjYWxsczsKKyAgICB9CisgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7CisgICAgICAgIGNhbGxzID0gbmV3IEhhc2hNYXAoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGJlZm9yZUludm9rZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbWV0aG9kTmFtZSwgT2JqZWN0W10gYXJndW1lbnRzKSB7CisgICAgICAgIGlmICghY2FsbHMuY29udGFpbnNLZXkobWV0aG9kTmFtZSkpIGNhbGxzLnB1dChtZXRob2ROYW1lLCBuZXcgTGlua2VkTGlzdCgpKTsKKyAgICAgICAgKChMaXN0KSBjYWxscy5nZXQobWV0aG9kTmFtZSkpLmFkZChuZXcgTG9uZyhTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkpOworCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgYWZ0ZXJJbnZva2UoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1ldGhvZE5hbWUsIE9iamVjdFtdIGFyZ3VtZW50cywgT2JqZWN0IHJlc3VsdCkgeworICAgICAgICAoKExpc3QpIGNhbGxzLmdldChtZXRob2ROYW1lKSkuYWRkKG5ldyBMb25nKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZG9JbnZva2UoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIGxpbmVzLCBlYWNoIGl0ZW0gaXMgW21ldGhvZG5hbWUsIG51bWJlck9mQ2FsbHMsIGFjY3VtdWxhdGVkVGltZV0KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdCBzdGF0aXN0aWMoKSB7CisgICAgICAgIExpc3QgcmVzdWx0ID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gY2FsbHMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBPYmplY3RbXSBsaW5lID0gbmV3IE9iamVjdFszXTsKKyAgICAgICAgICAgIHJlc3VsdC5hZGQobGluZSk7CisgICAgICAgICAgICBsaW5lWzBdID0gaXRlci5uZXh0KCk7CisgICAgICAgICAgICBMaXN0IHRpbWVzID0gKExpc3QpIGNhbGxzLmdldChsaW5lWzBdKTsKKyAgICAgICAgICAgIGxpbmVbMV0gPSBuZXcgSW50ZWdlcih0aW1lcy5zaXplKCkgLyAyKTsKKyAgICAgICAgICAgIGludCBhY2NUaW1lID0gMDsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSB0aW1lcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgTG9uZyBzdGFydCA9IChMb25nKSBpdC5uZXh0KCk7CisgICAgICAgICAgICAgICAgTG9uZyBlbmQgPSAoTG9uZykgaXQubmV4dCgpOworICAgICAgICAgICAgICAgIGFjY1RpbWUgKz0gZW5kLmxvbmdWYWx1ZSgpIC0gc3RhcnQubG9uZ1ZhbHVlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsaW5lWzJdID0gbmV3IExvbmcoYWNjVGltZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvQmluZGluZy5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL0JpbmRpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTU0NThiCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL0JpbmRpbmcuamF2YQpAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGdyb292eS5sYW5nOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBSZXByZXNlbnRzIHRoZSB2YXJpYWJsZSBiaW5kaW5ncyBvZiBhIHNjcmlwdCB3aGljaCBjYW4gYmUgYWx0ZXJlZAorICogZnJvbSBvdXRzaWRlIHRoZSBzY3JpcHQgb2JqZWN0IG9yIGNyZWF0ZWQgb3V0c2lkZSBvZiBhIHNjcmlwdCBhbmQgcGFzc2VkCisgKiBpbnRvIGl0LgorICogCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgQmluZGluZyBleHRlbmRzIEdyb292eU9iamVjdFN1cHBvcnQgeworICAgIHByaXZhdGUgZmluYWwgTWFwIHZhcmlhYmxlczsKKyAgICAKKyAgICBwdWJsaWMgQmluZGluZygpIHsKKyAgICAgICAgdmFyaWFibGVzID0gbmV3IEhhc2hNYXAoKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIEJpbmRpbmcoTWFwIHZhcmlhYmxlcykgeworICAgICAgICB0aGlzLnZhcmlhYmxlcyA9IHZhcmlhYmxlczsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQSBoZWxwZXIgY29uc3RydWN0b3IgdXNlZCBpbiBtYWluKFN0cmluZ1tdKSBtZXRob2QgY2FsbHMKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYXJncyBhcmUgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgZnJvbSBhIG1haW4oKQorICAgICAqLworICAgIHB1YmxpYyBCaW5kaW5nKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgdGhpcygpOworICAgICAgICBzZXRWYXJpYWJsZSgiYXJncyIsIGFyZ3MpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gbG9va3VwCisgICAgICogQHJldHVybiB0aGUgdmFyaWFibGUgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldFZhcmlhYmxlKFN0cmluZyBuYW1lKSB7CisgICAgICAgIE9iamVjdCByZXN1bHQgPSB2YXJpYWJsZXMuZ2V0KG5hbWUpOworICAgICAgICAKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsICYmICF2YXJpYWJsZXMuY29udGFpbnNLZXkobmFtZSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nUHJvcGVydHlFeGNlcHRpb24obmFtZSwgQmluZGluZy5jbGFzcyk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiB2YXJpYWJsZQorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB0byBzZXQKKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIGdpdmVuIHZhcmlhYmxlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmFyaWFibGUoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICB2YXJpYWJsZXMucHV0KG5hbWUsIHZhbHVlKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIE1hcCBnZXRWYXJpYWJsZXMoKSB7CisgICAgICAgIHJldHVybiB2YXJpYWJsZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3ZlcmxvYWRlZCB0byBtYWtlIHZhcmlhYmxlcyBhcHBlYXIgYXMgYmVhbiBwcm9wZXJ0aWVzIG9yIHZpYSB0aGUgc3Vic2NyaXB0IG9wZXJhdG9yCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHkpIHsKKyAgICAgICAgLyoqIEB0b2RvIHdlIHNob3VsZCBjaGVjayBpZiB3ZSBoYXZlIHRoZSBwcm9wZXJ0eSB3aXRoIHRoZSBtZXRhQ2xhc3MgaW5zdGVhZCBvZiB0cnkvY2F0Y2ggICovCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0UHJvcGVydHkocHJvcGVydHkpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChNaXNzaW5nUHJvcGVydHlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIGdldFZhcmlhYmxlKHByb3BlcnR5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE92ZXJsb2FkZWQgdG8gbWFrZSB2YXJpYWJsZXMgYXBwZWFyIGFzIGJlYW4gcHJvcGVydGllcyBvciB2aWEgdGhlIHN1YnNjcmlwdCBvcGVyYXRvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IG5ld1ZhbHVlKSB7CisgICAgICAgIC8qKiBAdG9kbyB3ZSBzaG91bGQgY2hlY2sgaWYgd2UgaGF2ZSB0aGUgcHJvcGVydHkgd2l0aCB0aGUgbWV0YUNsYXNzIGluc3RlYWQgb2YgdHJ5L2NhdGNoICAqLworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3VwZXIuc2V0UHJvcGVydHkocHJvcGVydHksIG5ld1ZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoTWlzc2luZ1Byb3BlcnR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHNldFZhcmlhYmxlKHByb3BlcnR5LCBuZXdWYWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbGFuZy9CdWlsZGFibGUuamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbGFuZy9CdWlsZGFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmE0MTVkCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL0J1aWxkYWJsZS5qYXZhCkBAIC0wLDAgKzEsMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGdyb292eS5sYW5nOworCisKK3B1YmxpYyBpbnRlcmZhY2UgQnVpbGRhYmxlIHsKKwl2b2lkIGJ1aWxkKEdyb292eU9iamVjdCBidWlsZGVyKTsKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbGFuZy9DbG9zdXJlLmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvQ2xvc3VyZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMjgzYTQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvQ2xvc3VyZS5qYXZhCkBAIC0wLDAgKzEsNTcyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgZ3Jvb3Z5Lmxhbmc7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJlZmxlY3Rpb24uQ2FjaGVkTWV0aG9kOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucmVmbGVjdGlvbi5SZWZsZWN0aW9uQ2FjaGU7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLkN1cnJpZWRDbG9zdXJlOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5JbnZva2VySGVscGVyOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS50eXBlaGFuZGxpbmcuRGVmYXVsdFR5cGVUcmFuc2Zvcm1hdGlvbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CisKKy8qKgorICogUmVwcmVzZW50cyBhbnkgY2xvc3VyZSBvYmplY3QgaW4gR3Jvb3Z5LgorICogPHAvPgorICogR3Jvb3Z5IGFsbG93cyBpbnN0YW5jZXMgb2YgQ2xvc3VyZXMgdG8gYmUgY2FsbGVkIGluIGEKKyAqIHNob3J0IGZvcm0uIEZvciBleGFtcGxlOgorICogPHByZT4KKyAqICAgZGVmIGEgPSAxCisgKiAgIGRlZiBjID0ge2F9CisgKiAgIGFzc2VydCBjKCkgPT0gMQorICogPC9wcmU+CisgKiBUbyBiZSBhYmxlIHRvIHVzZSBhIENsb3N1cmUgaW4gdGhpcyB3YXkgd2l0aCB5b3VyIG93bgorICogc3ViY2xhc3MsIHlvdSBuZWVkIHRvIHByb3ZpZGUgYSBkb0NhbGwgbWV0aG9kIHdpdGggYW55CisgKiBzaWduYXR1cmUgeW91IHdhbnQgdG8uIFRoaXMgZW5zdXJlcyB0aGF0IAorICoge0BsaW5rICNnZXRNYXhpbXVtTnVtYmVyT2ZQYXJhbWV0ZXJzKCl9IGFuZCAKKyAqIHtAbGluayAjZ2V0UGFyYW1ldGVyVHlwZXMoKX0gd2lsbCB3b3JrIHRvbyB3aXRob3V0IGFueSAKKyAqIGFkZGl0aW9uYWwgY29kZS4gSWYgbm8gZG9DYWxsIG1ldGhvZCBpcyBwcm92aWRlZCBhCisgKiBjbG9zdXJlIG11c3QgYmUgdXNlZCBpbiBpdHMgbG9uZyBmb3JtIGxpa2UKKyAqIDxwcmU+CisgKiAgIGRlZiBhID0gMQorICogICBkZWYgYyA9IHthfQorICogICBhc3NlcnQgYy5jYWxsKCkgPT0gMQorICogPC9wcmU+CisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnR1Z0B3aWxzb24uY28udWsiPkpvaG4gV2lsc29uPC9hPgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86YmxhY2tkcmFnQGdteC5vcmciPkpvY2hlbiBUaGVvZG9yb3U8L2E+CisgKiBAYXV0aG9yIEdyYWVtZSBSb2NoZXIKKyAqCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBDbG9zdXJlIGV4dGVuZHMgR3Jvb3Z5T2JqZWN0U3VwcG9ydCBpbXBsZW1lbnRzIENsb25lYWJsZSwgUnVubmFibGUgeworCisgICAgLyoqCisgICAgICogV2l0aCB0aGlzIHJlc29sdmVTdHJhdGVneSBzZXQgdGhlIGNsb3N1cmUgd2lsbCBhdHRlbXB0IHRvIHJlc29sdmUgcHJvcGVydHkgcmVmZXJlbmNlcyB0byB0aGUKKyAgICAgKiBvd25lciBmaXJzdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9XTkVSX0ZJUlNUID0gMDsKKyAgICAvKioKKyAgICAgKiBXaXRoIHRoaXMgcmVzb2x2ZVN0cmF0ZWd5IHNldCB0aGUgY2xvc3VyZSB3aWxsIGF0dGVtcHQgdG8gcmVzb2x2ZSBwcm9wZXJ0eSByZWZlcmVuY2VzIHRvIHRoZQorICAgICAqIGRlbGVnYXRlIGZpcnN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVMRUdBVEVfRklSU1QgPSAxOworICAgIC8qKgorICAgICAqIFdpdGggdGhpcyByZXNvbHZlU3RyYXRlZ3kgc2V0IHRoZSBjbG9zdXJlIHdpbGwgcmVzb2x2ZSBwcm9wZXJ0eSByZWZlcmVuY2VzIHRvIHRoZSBvd25lciBvbmx5CisgICAgICogYW5kIG5vdCBjYWxsIHRoZSBkZWxlZ2F0ZSBhdCBhbGwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPV05FUl9PTkxZID0gMjsKKyAgICAvKioKKyAgICAgKiBXaXRoIHRoaXMgcmVzb2x2ZVN0cmF0ZWd5IHNldCB0aGUgY2xvc3VyZSB3aWxsIHJlc29sdmUgcHJvcGVydHkgcmVmZXJlbmNlcyB0byB0aGUgZGVsZWdhdGUKKyAgICAgKiBvbmx5IGFuZCBlbnRpcmVseSBieXBhc3MgdGhlIG93bmVyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVMRUdBVEVfT05MWSA9IDM7CisgICAgLyoqCisgICAgICogV2l0aCB0aGlzIHJlc29sdmVTdHJhdGVneSBzZXQgdGhlIGNsb3N1cmUgd2lsbCByZXNvbHZlIHByb3BlcnR5IHJlZmVyZW5jZXMgdG8gaXRzZWxmIGFuZCBnbworICAgICAqIHRocm91Z2ggdGhlIHVzdWFsIE1ldGFDbGFzcyBsb29rLXVwIHByb2Nlc3MuIFRoaXMgYWxsb3dzIHRoZSBkZXZlbG9wZXIgdG8gb3ZlcnJpZGUgZ2V0UHJvcGVydHkKKyAgICAgKiB1c2luZyBFeHBhbmRvTWV0YUNsYXNzIG9mIHRoZSBjbG9zdXJlIGl0c2VsZgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPX1NFTEYgPSA0OworCisgICAgcHJpdmF0ZSBPYmplY3QgZGVsZWdhdGU7CisgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3Qgb3duZXI7CisgICAgcHJvdGVjdGVkIENsYXNzW10gcGFyYW1ldGVyVHlwZXM7CisgICAgcHJvdGVjdGVkIGludCBtYXhpbXVtTnVtYmVyT2ZQYXJhbWV0ZXJzOworICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IHRoaXNPYmplY3Q7CisgICAgcHJpdmF0ZSBpbnQgcmVzb2x2ZVN0cmF0ZWd5ID0gT1dORVJfRklSU1Q7CisKKworICAgIHByaXZhdGUgaW50IGRpcmVjdGl2ZTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBET05FID0gMSwgU0tJUCA9IDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gRU1QVFlfT0JKRUNUX0FSUkFZID0ge307CisKKyAgICBwdWJsaWMgQ2xvc3VyZShPYmplY3Qgb3duZXIsIE9iamVjdCB0aGlzT2JqZWN0KSB7CisgICAgICAgIHRoaXMub3duZXIgPSBvd25lcjsKKyAgICAgICAgdGhpcy5kZWxlZ2F0ZSA9IG93bmVyOworICAgICAgICB0aGlzLnRoaXNPYmplY3QgPSB0aGlzT2JqZWN0OworCisgICAgICAgIGZpbmFsIENsYXNzIGNsYXp6ID0gdGhpcy5nZXRDbGFzcygpOworICAgICAgICBmaW5hbCBDYWNoZWRNZXRob2RbXSBtZXRob2RzID0gUmVmbGVjdGlvbkNhY2hlLmdldENhY2hlZENsYXNzKGNsYXp6KS5nZXRNZXRob2RzKCk7CisKKyAgICAgICAgLy8gc2V0IGl0IHRvIC0xIGZvciBzdGFydGVycyBzbyBwYXJhbWV0ZXJUeXBlcyB3aWxsIGFsd2F5cyBnZXQgYSB0eXBlCisgICAgICAgIG1heGltdW1OdW1iZXJPZlBhcmFtZXRlcnMgPSAtMTsKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBtZXRob2RzLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICBpZiAoImRvQ2FsbCIuZXF1YWxzKG1ldGhvZHNbal0uZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzW10gcHQgPSBtZXRob2RzW2pdLmdldE5hdGl2ZVBhcmFtZXRlclR5cGVzKCk7CisgICAgICAgICAgICAgICAgaWYgKHB0Lmxlbmd0aCA+IG1heGltdW1OdW1iZXJPZlBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyVHlwZXMgPSBwdDsKKyAgICAgICAgICAgICAgICAgICAgbWF4aW11bU51bWJlck9mUGFyYW1ldGVycyA9IHBhcmFtZXRlclR5cGVzLmxlbmd0aDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gdGhpcyBsaW5lIHNob3VsZCBiZSB1c2VsZXNzLCBidXQgd2VsbCwganVzdCBpbiBjYXNlCisgICAgICAgIG1heGltdW1OdW1iZXJPZlBhcmFtZXRlcnMgPSBNYXRoLm1heChtYXhpbXVtTnVtYmVyT2ZQYXJhbWV0ZXJzLDApOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgQ2xvc3VyZShPYmplY3Qgb3duZXIpIHsKKyAgICAgICAgdGhpcyhvd25lcixudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBzdHJhdGVneSB3aGljaCB0aGUgY2xvc3VyZSB1c2VzIHRvIHJlc29sdmUgcHJvcGVydHkgcmVmZXJlbmNlcy4gVGhlIGRlZmF1bHQgaXMgQ2xvc3VyZS5PV05FUl9GSVJTVAorICAgICAqCisgICAgICogQHBhcmFtIHJlc29sdmVTdHJhdGVneSBUaGUgcmVzb2x2ZSBzdHJhdGVneSB0byBzZXQKKyAgICAgKgorICAgICAqIEBzZWUgZ3Jvb3Z5LmxhbmcuQ2xvc3VyZSNERUxFR0FURV9GSVJTVAorICAgICAqIEBzZWUgZ3Jvb3Z5LmxhbmcuQ2xvc3VyZSNERUxFR0FURV9PTkxZCisgICAgICogQHNlZSBncm9vdnkubGFuZy5DbG9zdXJlI09XTkVSX0ZJUlNUCisgICAgICogQHNlZSBncm9vdnkubGFuZy5DbG9zdXJlI09XTkVSX09OTFkKKyAgICAgKiBAc2VlIGdyb292eS5sYW5nLkNsb3N1cmUjVE9fU0VMRgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlc29sdmVTdHJhdGVneShpbnQgcmVzb2x2ZVN0cmF0ZWd5KSB7CisgICAgICAgIHRoaXMucmVzb2x2ZVN0cmF0ZWd5ID0gcmVzb2x2ZVN0cmF0ZWd5OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHN0cmF0ZWd5IHdoaWNoIHRoZSBjbG9zdXJlIHVzZXJzIHRvIHJlc29sdmUgbWV0aG9kcyBhbmQgcHJvcGVydGllcworICAgICAqCisgICAgICogQHJldHVybiBUaGUgcmVzb2x2ZSBzdHJhdGVneQorICAgICAqIAorICAgICAqIEBzZWUgZ3Jvb3Z5LmxhbmcuQ2xvc3VyZSNERUxFR0FURV9GSVJTVAorICAgICAqIEBzZWUgZ3Jvb3Z5LmxhbmcuQ2xvc3VyZSNERUxFR0FURV9PTkxZCisgICAgICogQHNlZSBncm9vdnkubGFuZy5DbG9zdXJlI09XTkVSX0ZJUlNUCisgICAgICogQHNlZSBncm9vdnkubGFuZy5DbG9zdXJlI09XTkVSX09OTFkKKyAgICAgKiBAc2VlIGdyb292eS5sYW5nLkNsb3N1cmUjVE9fU0VMRgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UmVzb2x2ZVN0cmF0ZWd5KCkgeworICAgICAgICByZXR1cm4gcmVzb2x2ZVN0cmF0ZWd5OworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0VGhpc09iamVjdCgpeworICAgICAgICByZXR1cm4gdGhpc09iamVjdDsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KGZpbmFsIFN0cmluZyBwcm9wZXJ0eSkgeworICAgICAgICBpZiAoImRlbGVnYXRlIi5lcXVhbHMocHJvcGVydHkpKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0RGVsZWdhdGUoKTsKKyAgICAgICAgfSBlbHNlIGlmICgib3duZXIiLmVxdWFscyhwcm9wZXJ0eSkpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRPd25lcigpOworICAgICAgICB9IGVsc2UgaWYgKCJtYXhpbXVtTnVtYmVyT2ZQYXJhbWV0ZXJzIi5lcXVhbHMocHJvcGVydHkpKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEludGVnZXIoZ2V0TWF4aW11bU51bWJlck9mUGFyYW1ldGVycygpKTsKKyAgICAgICAgfSBlbHNlIGlmICgicGFyYW1ldGVyVHlwZXMiLmVxdWFscyhwcm9wZXJ0eSkpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRQYXJhbWV0ZXJUeXBlcygpOworICAgICAgICB9IGVsc2UgaWYgKCJtZXRhQ2xhc3MiLmVxdWFscyhwcm9wZXJ0eSkpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRNZXRhQ2xhc3MoKTsKKyAgICAgICAgfSBlbHNlIGlmICgiY2xhc3MiLmVxdWFscyhwcm9wZXJ0eSkpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRDbGFzcygpOworICAgICAgICB9IGVsc2UgaWYgKCJkaXJlY3RpdmUiLmVxdWFscyhwcm9wZXJ0eSkpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSW50ZWdlcihnZXREaXJlY3RpdmUoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzd2l0Y2gocmVzb2x2ZVN0cmF0ZWd5KSB7CisgICAgICAgICAgICAgICAgY2FzZSBERUxFR0FURV9GSVJTVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldFByb3BlcnR5RGVsZWdhdGVGaXJzdChwcm9wZXJ0eSk7CisgICAgICAgICAgICAgICAgY2FzZSBERUxFR0FURV9PTkxZOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gSW52b2tlckhlbHBlci5nZXRQcm9wZXJ0eSh0aGlzLmRlbGVnYXRlLCBwcm9wZXJ0eSk7CisgICAgICAgICAgICAgICAgY2FzZSBPV05FUl9PTkxZOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gSW52b2tlckhlbHBlci5nZXRQcm9wZXJ0eSh0aGlzLm93bmVyLCBwcm9wZXJ0eSk7CisgICAgICAgICAgICAgICAgY2FzZSBUT19TRUxGOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0UHJvcGVydHkocHJvcGVydHkpOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRQcm9wZXJ0eU93bmVyRmlyc3QocHJvcGVydHkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBPYmplY3QgZ2V0UHJvcGVydHlEZWxlZ2F0ZUZpcnN0KFN0cmluZyBwcm9wZXJ0eSkgeworICAgICAgICBpZihkZWxlZ2F0ZSA9PSBudWxsKSByZXR1cm4gZ2V0UHJvcGVydHlPd25lckZpcnN0KHByb3BlcnR5KTsKKyAgICAgICAgcmV0dXJuIGdldFByb3BlcnR5VHJ5VGhlc2UocHJvcGVydHksIHRoaXMuZGVsZWdhdGUsIHRoaXMub3duZXIpOworCisgICAgfQorCisgICAgcHJpdmF0ZSBPYmplY3QgZ2V0UHJvcGVydHlUcnlUaGVzZShTdHJpbmcgcHJvcGVydHksIE9iamVjdCBmaXJzdFRyeSwgT2JqZWN0IHNlY29uZFRyeSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gbGV0cyB0cnkgZ2V0dGluZyB0aGUgcHJvcGVydHkgb24gdGhlIG93bmVyCisgICAgICAgICAgICByZXR1cm4gSW52b2tlckhlbHBlci5nZXRQcm9wZXJ0eShmaXJzdFRyeSwgcHJvcGVydHkpOworICAgICAgICB9IGNhdGNoIChNaXNzaW5nUHJvcGVydHlFeGNlcHRpb24gZTEpIHsKKyAgICAgICAgICAgIGlmIChzZWNvbmRUcnkgIT0gbnVsbCAmJiBmaXJzdFRyeSAhPSB0aGlzICYmIGZpcnN0VHJ5ICE9IHNlY29uZFRyeSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGxldHMgdHJ5IGdldHRpbmcgdGhlIHByb3BlcnR5IG9uIHRoZSBkZWxlZ2F0ZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gSW52b2tlckhlbHBlci5nZXRQcm9wZXJ0eShzZWNvbmRUcnksIHByb3BlcnR5KTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChHcm9vdnlSdW50aW1lRXhjZXB0aW9uIGUyKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSwgd2UnbGwgdGhyb3cgZTEKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRocm93IGUxOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBPYmplY3QgZ2V0UHJvcGVydHlPd25lckZpcnN0KFN0cmluZyBwcm9wZXJ0eSkgeworICAgICAgICByZXR1cm4gZ2V0UHJvcGVydHlUcnlUaGVzZShwcm9wZXJ0eSwgdGhpcy5vd25lciwgdGhpcy5kZWxlZ2F0ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgbmV3VmFsdWUpIHsKKyAgICAgICAgaWYgKCJkZWxlZ2F0ZSIuZXF1YWxzKHByb3BlcnR5KSkgeworICAgICAgICAgICAgc2V0RGVsZWdhdGUobmV3VmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKCJtZXRhQ2xhc3MiLmVxdWFscyhwcm9wZXJ0eSkpIHsKKyAgICAgICAgICAgIHNldE1ldGFDbGFzcygoTWV0YUNsYXNzKSBuZXdWYWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoInJlc29sdmVTdHJhdGVneSIuZXF1YWxzKHByb3BlcnR5KSkgeworICAgICAgICAgICAgc2V0UmVzb2x2ZVN0cmF0ZWd5KCgoTnVtYmVyKW5ld1ZhbHVlKS5pbnRWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHN3aXRjaChyZXNvbHZlU3RyYXRlZ3kpIHsKKyAgICAgICAgICAgICAgICBjYXNlIERFTEVHQVRFX0ZJUlNUOgorICAgICAgICAgICAgICAgICAgICBzZXRQcm9wZXJ0eURlbGVnYXRlRmlyc3QocHJvcGVydHksIG5ld1ZhbHVlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIERFTEVHQVRFX09OTFk6CisgICAgICAgICAgICAgICAgICAgIEludm9rZXJIZWxwZXIuc2V0UHJvcGVydHkodGhpcy5kZWxlZ2F0ZSwgcHJvcGVydHksIG5ld1ZhbHVlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE9XTkVSX09OTFk6CisgICAgICAgICAgICAgICAgICAgIEludm9rZXJIZWxwZXIuc2V0UHJvcGVydHkodGhpcy5vd25lciwgcHJvcGVydHksIG5ld1ZhbHVlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFRPX1NFTEY6CisgICAgICAgICAgICAgICAgICAgIHN1cGVyLnNldFByb3BlcnR5KHByb3BlcnR5LCBuZXdWYWx1ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgc2V0UHJvcGVydHlPd25lckZpcnN0KHByb3BlcnR5LCBuZXdWYWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0UHJvcGVydHlEZWxlZ2F0ZUZpcnN0KFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IG5ld1ZhbHVlKSB7CisgICAgICAgIGlmKGRlbGVnYXRlID09IG51bGwpIHNldFByb3BlcnR5T3duZXJGaXJzdChwcm9wZXJ0eSwgbmV3VmFsdWUpOyAKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2V0UHJvcGVydHlUcnlUaGVzZShwcm9wZXJ0eSwgbmV3VmFsdWUsIHRoaXMuZGVsZWdhdGUsIHRoaXMub3duZXIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRQcm9wZXJ0eVRyeVRoZXNlKFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IG5ld1ZhbHVlLCBPYmplY3QgZmlyc3RUcnksIE9iamVjdCBzZWNvbmRUcnkpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIGxldHMgdHJ5IHNldHRpbmcgdGhlIHByb3BlcnR5IG9uIHRoZSBvd25lcgorICAgICAgICAgICAgSW52b2tlckhlbHBlci5zZXRQcm9wZXJ0eShmaXJzdFRyeSwgcHJvcGVydHksIG5ld1ZhbHVlKTsKKyAgICAgICAgfSBjYXRjaCAoR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbiBlMSkgeworICAgICAgICAgICAgaWYgKGZpcnN0VHJ5ICE9IG51bGwgJiYgZmlyc3RUcnkgIT0gdGhpcyAmJiBmaXJzdFRyeSAhPSBzZWNvbmRUcnkpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAvLyBsZXRzIHRyeSBzZXR0aW5nIHRoZSBwcm9wZXJ0eSBvbiB0aGUgZGVsZWdhdGUKKyAgICAgICAgICAgICAgICAgICAgSW52b2tlckhlbHBlci5zZXRQcm9wZXJ0eShzZWNvbmRUcnksIHByb3BlcnR5LCBuZXdWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChHcm9vdnlSdW50aW1lRXhjZXB0aW9uIGUyKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSwgd2UnbGwgdGhyb3cgZTEKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRocm93IGUxOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldFByb3BlcnR5T3duZXJGaXJzdChTdHJpbmcgcHJvcGVydHksIE9iamVjdCBuZXdWYWx1ZSkgeworICAgICAgICBzZXRQcm9wZXJ0eVRyeVRoZXNlKHByb3BlcnR5LCBuZXdWYWx1ZSwgdGhpcy5vd25lciwgdGhpcy5kZWxlZ2F0ZSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNDYXNlKE9iamVjdCBjYW5kaWRhdGUpeworICAgICAgICByZXR1cm4gRGVmYXVsdFR5cGVUcmFuc2Zvcm1hdGlvbi5jYXN0VG9Cb29sZWFuKGNhbGwoY2FuZGlkYXRlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW52b2tlcyB0aGUgY2xvc3VyZSB3aXRob3V0IGFueSBwYXJhbWV0ZXJzLCByZXR1cm5pbmcgYW55IHZhbHVlIGlmIGFwcGxpY2FibGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBpZiBhcHBsaWNhYmxlIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8gcmV0dXJuIHN0YXRlbWVudCBpbiB0aGUgY2xvc3VyZQorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgY2FsbCgpIHsKKyAgICAgICAgZmluYWwgT2JqZWN0W10gTk9BUkdTID0gRU1QVFlfT0JKRUNUX0FSUkFZOworICAgICAgICByZXR1cm4gY2FsbChOT0FSR1MpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgT2JqZWN0IGNhbGwoT2JqZWN0W10gYXJncykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGdldE1ldGFDbGFzcygpLmludm9rZU1ldGhvZCh0aGlzLCJkb0NhbGwiLGFyZ3MpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIHRocm93UnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBJbnZva2VzIHRoZSBjbG9zdXJlLCByZXR1cm5pbmcgYW55IHZhbHVlIGlmIGFwcGxpY2FibGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXJndW1lbnRzIGNvdWxkIGJlIGEgc2luZ2xlIHZhbHVlIG9yIGEgTGlzdCBvZiB2YWx1ZXMKKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBpZiBhcHBsaWNhYmxlIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8gcmV0dXJuIHN0YXRlbWVudCBpbiB0aGUgY2xvc3VyZQorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgY2FsbChmaW5hbCBPYmplY3QgYXJndW1lbnRzKSB7CisgICAgICAgIHJldHVybiBjYWxsKG5ldyBPYmplY3RbXXthcmd1bWVudHN9KTsKKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIHN0YXRpYyBPYmplY3QgdGhyb3dSdW50aW1lRXhjZXB0aW9uKFRocm93YWJsZSB0aHJvd2FibGUpIHsKKyAgICAgICAgaWYgKHRocm93YWJsZSBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKKyAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKSB0aHJvd2FibGU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbih0aHJvd2FibGUuZ2V0TWVzc2FnZSgpLCB0aHJvd2FibGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgb3duZXIgT2JqZWN0IHRvIHdoaWNoIG1ldGhvZCBjYWxscyB3aWxsIGdvIHdoaWNoIGlzCisgICAgICogICAgICAgICB0eXBpY2FsbHkgdGhlIG91dGVyIGNsYXNzIHdoZW4gdGhlIGNsb3N1cmUgaXMgY29uc3RydWN0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldE93bmVyKCkgeworICAgICAgICByZXR1cm4gdGhpcy5vd25lcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBkZWxlZ2F0ZSBPYmplY3QgdG8gd2hpY2ggbWV0aG9kIGNhbGxzIHdpbGwgZ28gd2hpY2ggaXMKKyAgICAgKiAgICAgICAgIHR5cGljYWxseSB0aGUgb3V0ZXIgY2xhc3Mgd2hlbiB0aGUgY2xvc3VyZSBpcyBjb25zdHJ1Y3RlZAorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0RGVsZWdhdGUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmRlbGVnYXRlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFsbG93cyB0aGUgZGVsZWdhdGUgdG8gYmUgY2hhbmdlZCBzdWNoIGFzIHdoZW4gcGVyZm9ybWluZyBtYXJrdXAgYnVpbGRpbmcKKyAgICAgKgorICAgICAqIEBwYXJhbSBkZWxlZ2F0ZSB0aGUgbmV3IGRlbGVnYXRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVsZWdhdGUoT2JqZWN0IGRlbGVnYXRlKSB7CisgICAgICAgIHRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgcGFyYW1ldGVyIHR5cGVzIG9mIHRoZSBsb25nZXN0IGRvQ2FsbCBtZXRob2QKKyAgICAgKiBvZiB0aGlzIGNsb3N1cmUKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NbXSBnZXRQYXJhbWV0ZXJUeXBlcygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucGFyYW1ldGVyVHlwZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgbWF4aW11bSBudW1iZXIgb2YgcGFyYW1ldGVycyBhIGRvQ2FsbCBtZXRob3MKKyAgICAgKiBvZiB0aGlzIGNsb3N1cmUgY2FuIHRha2UKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE1heGltdW1OdW1iZXJPZlBhcmFtZXRlcnMoKSB7CisgICAgICAgIHJldHVybiB0aGlzLm1heGltdW1OdW1iZXJPZlBhcmFtZXRlcnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBhIHZlcnNpb24gb2YgdGhpcyBjbG9zdXJlIHdoaWNoIGltcGxlbWVudHMgV3JpdGFibGUKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xvc3VyZSBhc1dyaXRhYmxlKCkgeworICAgICAgICByZXR1cm4gbmV3IFdyaXRhYmxlQ2xvc3VyZSgpOworICAgIH0KKworICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIGphdmEubGFuZy5SdW5uYWJsZSNydW4oKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgY2FsbCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN1cHBvcnQgZm9yIGNsb3N1cmUgY3VycnlpbmcKKyAgICAgKgorICAgICAqIEBwYXJhbSBhcmd1bWVudHMgdGhlIGFyZ3VtZW50cyB0byBiaW5kCisgICAgICogQHJldHVybiB0aGUgbmV3IGNsb3N1cmUgd2l0aCBpdHMgYXJndW1lbnRzIGJvdW5kCisgICAgICovCisgICAgcHVibGljIENsb3N1cmUgY3VycnkoZmluYWwgT2JqZWN0IGFyZ3VtZW50c1tdKSB7CisgICAgICAgIHJldHVybiBuZXcgQ3VycmllZENsb3N1cmUodGhpcyxhcmd1bWVudHMpOworICAgIH0KKworICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjY2xvbmUoKQorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuY2xvbmUoKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogSW1wbGVtZW50YXRpb24gbm90ZTogCisgICAgICogICBUaGlzIGhhcyB0byBiZSBhbiBpbm5lciBjbGFzcyEKKyAgICAgKiAKKyAgICAgKiBSZWFzb246IAorICAgICAqICAgQ2xvc3VyZS50aGlzLmNhbGwgd2lsbCBjYWxsIHRoZSBvdXRlciBjYWxsIG1ldGhvZCwgYnV0CisgICAgICogd2l0aCB0aGUgaW5uZXIgY2xhc3MgYXMgZXhlY3V0aW5nIG9iamVjdC4gVGhpcyBtZWFucyBhbnkKKyAgICAgKiBpbnZva2VNZXRob2Qgb3IgZ2V0UHJvcGVydHkgY2FsbCB3aWxsIGJlIGNhbGxlZCBvbiB0aGlzIAorICAgICAqIGlubmVyIGNsYXNzIGluc3RlYWQgb2YgdGhlIG91dGVyIQorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgV3JpdGFibGVDbG9zdXJlIGV4dGVuZHMgQ2xvc3VyZSBpbXBsZW1lbnRzIFdyaXRhYmxlIHsKKyAgICAgICAgcHVibGljIFdyaXRhYmxlQ2xvc3VyZSgpIHsKKyAgICAgICAgICAgIHN1cGVyKENsb3N1cmUudGhpcyk7CisgICAgICAgIH0KKworICAgICAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICAgICAqIEBzZWUgZ3Jvb3Z5LmxhbmcuV3JpdGFibGUjd3JpdGVUbyhqYXZhLmlvLldyaXRlcikKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBXcml0ZXIgd3JpdGVUbyhXcml0ZXIgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgQ2xvc3VyZS50aGlzLmNhbGwobmV3IE9iamVjdFtde291dH0pOworCisgICAgICAgICAgICByZXR1cm4gb3V0OworICAgICAgICB9CisKKyAgICAgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAgICAgKiBAc2VlIGdyb292eS5sYW5nLkdyb292eU9iamVjdCNpbnZva2VNZXRob2QoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBPYmplY3QgaW52b2tlTWV0aG9kKFN0cmluZyBtZXRob2QsIE9iamVjdCBhcmd1bWVudHMpIHsKKyAgICAgICAgICAgIGlmICgiY2xvbmUiLmVxdWFscyhtZXRob2QpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNsb25lKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCJjdXJyeSIuZXF1YWxzKG1ldGhvZCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY3VycnkoKE9iamVjdFtdKSBhcmd1bWVudHMpOworICAgICAgICAgICAgfSBlbHNlIGlmICgiYXNXcml0YWJsZSIuZXF1YWxzKG1ldGhvZCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXNXcml0YWJsZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ2xvc3VyZS50aGlzLmludm9rZU1ldGhvZChtZXRob2QsIGFyZ3VtZW50cyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICAgICAqIEBzZWUgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0I2dldFByb3BlcnR5KGphdmEubGFuZy5TdHJpbmcpCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSkgeworICAgICAgICAgICAgcmV0dXJuIENsb3N1cmUudGhpcy5nZXRQcm9wZXJ0eShwcm9wZXJ0eSk7CisgICAgICAgIH0KKworICAgICAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICAgICAqIEBzZWUgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0I3NldFByb3BlcnR5KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHksIE9iamVjdCBuZXdWYWx1ZSkgeworICAgICAgICAgICAgQ2xvc3VyZS50aGlzLnNldFByb3BlcnR5KHByb3BlcnR5LCBuZXdWYWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICAgICAqIEBzZWUgZ3Jvb3Z5LmxhbmcuQ2xvc3VyZSNjYWxsKCkKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBPYmplY3QgY2FsbCgpIHsKKyAgICAgICAgICAgIHJldHVybiAoKENsb3N1cmUpIGdldE93bmVyKCkpLmNhbGwoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgICAgICogQHNlZSBncm9vdnkubGFuZy5DbG9zdXJlI2NhbGwoamF2YS5sYW5nLk9iamVjdCkKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBPYmplY3QgY2FsbChPYmplY3QgYXJndW1lbnRzKSB7CisgICAgICAgICAgICByZXR1cm4gKChDbG9zdXJlKSBnZXRPd25lcigpKS5jYWxsKGFyZ3VtZW50cyk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBPYmplY3QgY2FsbChPYmplY3RbXSBhcmdzKSB7CisgICAgICAgICAgICByZXR1cm4gKChDbG9zdXJlKSBnZXRPd25lcigpKS5jYWxsKGFyZ3MpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBkb0NhbGwoT2JqZWN0W10gYXJncykgeworICAgICAgICAgICAgcmV0dXJuIGNhbGwoYXJncyk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgICAgICogQHNlZSBncm9vdnkubGFuZy5DbG9zdXJlI2dldERlbGVnYXRlKCkKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0RGVsZWdhdGUoKSB7CisgICAgICAgICAgICByZXR1cm4gQ2xvc3VyZS50aGlzLmdldERlbGVnYXRlKCk7CisgICAgICAgIH0KKworICAgICAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICAgICAqIEBzZWUgZ3Jvb3Z5LmxhbmcuQ2xvc3VyZSNzZXREZWxlZ2F0ZShqYXZhLmxhbmcuT2JqZWN0KQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0RGVsZWdhdGUoT2JqZWN0IGRlbGVnYXRlKSB7CisgICAgICAgICAgICBDbG9zdXJlLnRoaXMuc2V0RGVsZWdhdGUoZGVsZWdhdGUpOworICAgICAgICB9CisKKyAgICAgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAgICAgKiBAc2VlIGdyb292eS5sYW5nLkNsb3N1cmUjZ2V0UGFyYW1ldGVyVHlwZXMoKQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIENsYXNzW10gZ2V0UGFyYW1ldGVyVHlwZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gQ2xvc3VyZS50aGlzLmdldFBhcmFtZXRlclR5cGVzKCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgICAgICogQHNlZSBncm9vdnkubGFuZy5DbG9zdXJlI2dldFBhcmFtZXRlclR5cGVzKCkKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0TWF4aW11bU51bWJlck9mUGFyYW1ldGVycygpIHsKKyAgICAgICAgICAgIHJldHVybiBDbG9zdXJlLnRoaXMuZ2V0TWF4aW11bU51bWJlck9mUGFyYW1ldGVycygpOworICAgICAgICB9CisKKyAgICAgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAgICAgKiBAc2VlIGdyb292eS5sYW5nLkNsb3N1cmUjYXNXcml0YWJsZSgpCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQ2xvc3VyZSBhc1dyaXRhYmxlKCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICAgICAqIEBzZWUgamF2YS5sYW5nLlJ1bm5hYmxlI3J1bigpCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBDbG9zdXJlLnRoaXMucnVuKCk7CisgICAgICAgIH0KKworICAgICAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICAgICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNjbG9uZSgpCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgeworICAgICAgICAgICAgcmV0dXJuICgoQ2xvc3VyZSkgQ2xvc3VyZS50aGlzLmNsb25lKCkpLmFzV3JpdGFibGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgICAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICByZXR1cm4gQ2xvc3VyZS50aGlzLmhhc2hDb2RlKCk7CisgICAgICAgIH0KKworICAgICAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICAgICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgYXJnMCkgeworICAgICAgICAgICAgcmV0dXJuIENsb3N1cmUudGhpcy5lcXVhbHMoYXJnMCk7CisgICAgICAgIH0KKworICAgICAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICAgICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB3cml0ZVRvKHdyaXRlcik7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiB3cml0ZXIudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIENsb3N1cmUgY3VycnkoZmluYWwgT2JqZWN0IGFyZ3VtZW50c1tdKSB7CisgICAgICAgICAgICByZXR1cm4gKG5ldyBDdXJyaWVkQ2xvc3VyZSh0aGlzLGFyZ3VtZW50cykpLmFzV3JpdGFibGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFJlc29sdmVTdHJhdGVneShpbnQgcmVzb2x2ZVN0cmF0ZWd5KSB7CisgICAgICAgICAgICBDbG9zdXJlLnRoaXMuc2V0UmVzb2x2ZVN0cmF0ZWd5KHJlc29sdmVTdHJhdGVneSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0UmVzb2x2ZVN0cmF0ZWd5KCkgeworICAgICAgICAgICAgcmV0dXJuIENsb3N1cmUudGhpcy5nZXRSZXNvbHZlU3RyYXRlZ3koKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZGlyZWN0aXZlLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0RGlyZWN0aXZlKCkgeworICAgICAgICByZXR1cm4gZGlyZWN0aXZlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBkaXJlY3RpdmUgVGhlIGRpcmVjdGl2ZSB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGlyZWN0aXZlKGludCBkaXJlY3RpdmUpIHsKKyAgICAgICAgdGhpcy5kaXJlY3RpdmUgPSBkaXJlY3RpdmU7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvQ2xvc3VyZUV4Y2VwdGlvbi5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL0Nsb3N1cmVFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTBiYjY1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL0Nsb3N1cmVFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgZ3Jvb3Z5Lmxhbmc7CisKKy8qKgorICogQW4gZXhjZXB0aW9uIHRocm93biBieSBhIGNsb3N1cmUgaW52b2NhdGlvbgorICogCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgQ2xvc3VyZUV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24geworCisgICAgcHJpdmF0ZSBmaW5hbCBDbG9zdXJlIGNsb3N1cmU7CisgICAgCisgICAgcHVibGljIENsb3N1cmVFeGNlcHRpb24oQ2xvc3VyZSBjbG9zdXJlLCBUaHJvd2FibGUgY2F1c2UpIHsKKyAgICAgICAgc3VwZXIoIkV4Y2VwdGlvbiB0aHJvd24gYnkgY2FsbCB0byBjbG9zdXJlOiAiICsgY2xvc3VyZSArICIgcmVhYXNvbjogIiArIGNhdXNlLCBjYXVzZSk7CisgICAgICAgIHRoaXMuY2xvc3VyZSA9IGNsb3N1cmU7CisgICAgfQorCisgICAgcHVibGljIENsb3N1cmUgZ2V0Q2xvc3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIGNsb3N1cmU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL0Nsb3N1cmVJbnZva2luZ01ldGhvZC5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL0Nsb3N1cmVJbnZva2luZ01ldGhvZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMDJjYjgKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvQ2xvc3VyZUludm9raW5nTWV0aG9kLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGdyb292eS5sYW5nOworCisvKioKKyAqIEFuIGludGVyZmFjZSBmb3IgTWV0YU1ldGhvZHMgdGhhdCBpbnZva2UgY2xvc3VyZXMgdG8gaW1wbGVtZW50cy4gVXNlZCBieSBFeHBhbmRvTWV0YUNsYXNzCisgKgorICogQHNlZSBncm9vdnkubGFuZy5FeHBhbmRvTWV0YUNsYXNzCisgKiAKKyAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgorICogQHNpbmNlIDEuMQorICovCitwdWJsaWMgaW50ZXJmYWNlIENsb3N1cmVJbnZva2luZ01ldGhvZCB7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBjbG9zdXJlIHRoYXQgdGhpcyBtZXRob2QgaW52b2tlcworCSAqIEByZXR1cm4gVGhlIGNsb3N1cmUKKwkgKi8KKwlDbG9zdXJlIGdldENsb3N1cmUoKTsKKworCS8qKgorCSAqIElzIGl0IGEgc3RhdGljIG1ldGhvZD8KKwkgKiBAcmV0dXJuIFRydWUgaWYgaXQgaXMKKwkgKi8KKwlib29sZWFuIGlzU3RhdGljKCk7CisKKwkvKioKKwkgKiBUaGUgbWV0aG9kIG5hbWUKKwkgKiBAcmV0dXJuIFRoZSBtZXRob2QgbmFtZQorCSAqLworCVN0cmluZyBnZXROYW1lKCk7Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvRGVsZWdhdGluZ01ldGFDbGFzcy5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL0RlbGVnYXRpbmdNZXRhQ2xhc3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2I0M2QyCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL0RlbGVnYXRpbmdNZXRhQ2xhc3MuamF2YQpAQCAtMCwwICsxLDI5OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgZ3Jvb3Z5Lmxhbmc7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5DbGFzc05vZGU7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLkludm9rZXJIZWxwZXI7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQGF1dGhvciBKb2huIFdpbHNvbgorICoKKyAqLworCitwdWJsaWMgY2xhc3MgRGVsZWdhdGluZ01ldGFDbGFzcyBpbXBsZW1lbnRzIE1ldGFDbGFzcywgTXV0YWJsZU1ldGFDbGFzcywgR3Jvb3Z5T2JqZWN0IHsKKyAgICBwcm90ZWN0ZWQgTWV0YUNsYXNzIGRlbGVnYXRlOworICAgIAorICAgIHB1YmxpYyBEZWxlZ2F0aW5nTWV0YUNsYXNzKGZpbmFsIE1ldGFDbGFzcyBkZWxlZ2F0ZSkgeworICAgICAgICB0aGlzLmRlbGVnYXRlID0gZGVsZWdhdGU7CisgICAgfQorICAgCisgICAgcHVibGljIERlbGVnYXRpbmdNZXRhQ2xhc3MoZmluYWwgQ2xhc3MgdGhlQ2xhc3MpIHsKKyAgICAgICAgdGhpcyhHcm9vdnlTeXN0ZW0uZ2V0TWV0YUNsYXNzUmVnaXN0cnkoKS5nZXRNZXRhQ2xhc3ModGhlQ2xhc3MpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc01vZGlmaWVkKCkgeworICAgICAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZSBpbnN0YW5jZW9mIE11dGFibGVNZXRhQ2xhc3MgJiYgKChNdXRhYmxlTWV0YUNsYXNzKSB0aGlzLmRlbGVnYXRlKS5pc01vZGlmaWVkKCk7CisgICAgfQorICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIGdyb292eS5sYW5nLk1ldGFDbGFzcyNhZGROZXdJbnN0YW5jZU1ldGhvZChqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QpCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkTmV3SW5zdGFuY2VNZXRob2QoTWV0aG9kIG1ldGhvZCkgeworICAgICAgICBpZihkZWxlZ2F0ZSBpbnN0YW5jZW9mIE11dGFibGVNZXRhQ2xhc3MpCisgICAgICAgICAgICAoKE11dGFibGVNZXRhQ2xhc3MpZGVsZWdhdGUpLmFkZE5ld0luc3RhbmNlTWV0aG9kKG1ldGhvZCk7CisgICAgfQorICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIGdyb292eS5sYW5nLk1ldGFDbGFzcyNhZGROZXdTdGF0aWNNZXRob2QoamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZE5ld1N0YXRpY01ldGhvZChNZXRob2QgbWV0aG9kKSB7CisgICAgICAgIGlmKGRlbGVnYXRlIGluc3RhbmNlb2YgTXV0YWJsZU1ldGFDbGFzcykKKyAgICAgICAgICAgICgoTXV0YWJsZU1ldGFDbGFzcylkZWxlZ2F0ZSkuYWRkTmV3U3RhdGljTWV0aG9kKG1ldGhvZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkTWV0YU1ldGhvZChNZXRhTWV0aG9kIG1ldGFNZXRob2QpIHsKKyAgICAgICAgaWYoZGVsZWdhdGUgaW5zdGFuY2VvZiBNdXRhYmxlTWV0YUNsYXNzKQorICAgICAgICAgICAgKChNdXRhYmxlTWV0YUNsYXNzKWRlbGVnYXRlKS5hZGRNZXRhTWV0aG9kKG1ldGFNZXRob2QpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZE1ldGFCZWFuUHJvcGVydHkoTWV0YUJlYW5Qcm9wZXJ0eSBtZXRhQmVhblByb3BlcnR5KSB7CisgICAgICAgIGlmKGRlbGVnYXRlIGluc3RhbmNlb2YgTXV0YWJsZU1ldGFDbGFzcykKKyAgICAgICAgICAgICgoTXV0YWJsZU1ldGFDbGFzcylkZWxlZ2F0ZSkuYWRkTWV0YUJlYW5Qcm9wZXJ0eShtZXRhQmVhblByb3BlcnR5KTsKKyAgICB9CisKKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgKiBAc2VlIGdyb292eS5sYW5nLk1ldGFDbGFzcyNpbml0aWFsaXplKCkKKyAgICAqLworICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7CisgICAgICAgIGRlbGVnYXRlLmluaXRpYWxpemUoKTsKKyAgICB9CisKKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICogQHNlZSBncm9vdnkubGFuZy5NZXRhQ2xhc3MjZ2V0QXR0cmlidXRlKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGF0dHJpYnV0ZSkgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0QXR0cmlidXRlKG9iamVjdCwgYXR0cmlidXRlKTsKKyAgICB9CisgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAqIEBzZWUgZ3Jvb3Z5LmxhbmcuTWV0YUNsYXNzI2dldENsYXNzTm9kZSgpCisgICAgICovCisgICAgcHVibGljIENsYXNzTm9kZSBnZXRDbGFzc05vZGUoKSB7CisgICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0Q2xhc3NOb2RlKCk7CisgICAgfQorICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIGdyb292eS5sYW5nLk1ldGFDbGFzcyNnZXRNZXRhTWV0aG9kcygpCisgICAgICovCisgICAgcHVibGljIExpc3QgZ2V0TWV0YU1ldGhvZHMoKSB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRNZXRhTWV0aG9kcygpOworICAgIH0KKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICogQHNlZSBncm9vdnkubGFuZy5NZXRhQ2xhc3MjZ2V0TWV0aG9kcygpCisgICAgICovCisgICAgcHVibGljIExpc3QgZ2V0TWV0aG9kcygpIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldE1ldGhvZHMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdCByZXNwb25kc1RvKE9iamVjdCBvYmosIFN0cmluZyBuYW1lLCBPYmplY3RbXSBhcmdUeXBlcykgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUucmVzcG9uZHNUbyhvYmosIG5hbWUsIGFyZ1R5cGVzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdCByZXNwb25kc1RvKE9iamVjdCBvYmosIFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5yZXNwb25kc1RvKG9iaiwgbmFtZSk7CisgICAgfQorCisgICAgcHVibGljIE1ldGFQcm9wZXJ0eSBoYXNQcm9wZXJ0eShPYmplY3Qgb2JqLCBTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUuaGFzUHJvcGVydHkob2JqLCBuYW1lKTsKKyAgICB9CisKKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgKiBAc2VlIGdyb292eS5sYW5nLk1ldGFDbGFzcyNnZXRQcm9wZXJ0aWVzKCkKKyAgICAqLworICAgIHB1YmxpYyBMaXN0IGdldFByb3BlcnRpZXMoKSB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRQcm9wZXJ0aWVzKCk7CisgICAgfQorICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIGdyb292eS5sYW5nLk1ldGFDbGFzcyNnZXRQcm9wZXJ0eShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRQcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5KTsKKyAgICB9CisgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAqIEBzZWUgZ3Jvb3Z5LmxhbmcuTWV0YUNsYXNzI2ludm9rZUNvbnN0cnVjdG9yKGphdmEubGFuZy5PYmplY3RbXSkKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGludm9rZUNvbnN0cnVjdG9yKE9iamVjdFtdIGFyZ3VtZW50cykgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUuaW52b2tlQ29uc3RydWN0b3IoYXJndW1lbnRzKTsKKyAgICB9CisKKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICogQHNlZSBncm9vdnkubGFuZy5NZXRhQ2xhc3MjaW52b2tlTWV0aG9kKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBpbnZva2VNZXRob2QoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1ldGhvZE5hbWUsIE9iamVjdCBhcmd1bWVudHMpIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmludm9rZU1ldGhvZChvYmplY3QsIG1ldGhvZE5hbWUsIGFyZ3VtZW50cyk7CisgICAgfQorICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIGdyb292eS5sYW5nLk1ldGFDbGFzcyNpbnZva2VNZXRob2QoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdFtdKQorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgaW52b2tlTWV0aG9kKE9iamVjdCBvYmplY3QsIFN0cmluZyBtZXRob2ROYW1lLCBPYmplY3RbXSBhcmd1bWVudHMpIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmludm9rZU1ldGhvZChvYmplY3QsIG1ldGhvZE5hbWUsIGFyZ3VtZW50cyk7CisgICAgfQorICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIGdyb292eS5sYW5nLk1ldGFDbGFzcyNpbnZva2VTdGF0aWNNZXRob2QoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdFtdKQorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgaW52b2tlU3RhdGljTWV0aG9kKE9iamVjdCBvYmplY3QsIFN0cmluZyBtZXRob2ROYW1lLCBPYmplY3RbXSBhcmd1bWVudHMpIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmludm9rZVN0YXRpY01ldGhvZChvYmplY3QsIG1ldGhvZE5hbWUsIGFyZ3VtZW50cyk7CisgICAgfQorCisgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAqIEBzZWUgZ3Jvb3Z5LmxhbmcuTWV0YUNsYXNzI3NldEF0dHJpYnV0ZShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgYXR0cmlidXRlLCBPYmplY3QgbmV3VmFsdWUpIHsKKyAgICAgICAgZGVsZWdhdGUuc2V0QXR0cmlidXRlKG9iamVjdCwgYXR0cmlidXRlLCBuZXdWYWx1ZSk7CisgICAgfQorICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIGdyb292eS5sYW5nLk1ldGFDbGFzcyNzZXRQcm9wZXJ0eShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IG5ld1ZhbHVlKSB7CisgICAgICAgIGRlbGVnYXRlLnNldFByb3BlcnR5KG9iamVjdCwgcHJvcGVydHksIG5ld1ZhbHVlKTsKKyAgICB9CisgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUuZXF1YWxzKG9iaik7CisgICAgfQorICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKQorICAgICAqLworICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5oYXNoQ29kZSgpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7IAorICAgICAgICByZXR1cm4gc3VwZXIudG9TdHJpbmcoKSArICJbIiArIGRlbGVnYXRlLnRvU3RyaW5nKCkrICJdIjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZAorICAgICAqLworICAgIHB1YmxpYyBNZXRhTWV0aG9kIHBpY2tNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzW10gYXJndW1lbnRzKSB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5waWNrTWV0aG9kKG1ldGhvZE5hbWUsYXJndW1lbnRzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZShDbGFzcyBzZW5kZXIsIE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1lc3NhZ2VOYW1lLCBib29sZWFuIHVzZVN1cGVyKSB7CisgICAgICAgIHJldHVybiB0aGlzLmRlbGVnYXRlLmdldEF0dHJpYnV0ZShzZW5kZXIsIHJlY2VpdmVyLCBtZXNzYWdlTmFtZSwgdXNlU3VwZXIpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoQ2xhc3Mgc2VuZGVyLCBPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXNzYWdlTmFtZSwgYm9vbGVhbiB1c2VTdXBlciwgYm9vbGVhbiBmcm9tSW5zaWRlQ2xhc3MpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZGVsZWdhdGUuZ2V0UHJvcGVydHkoc2VuZGVyLCByZWNlaXZlciwgbWVzc2FnZU5hbWUsIHVzZVN1cGVyLCBmcm9tSW5zaWRlQ2xhc3MpOworICAgIH0KKworICAgIHB1YmxpYyBNZXRhUHJvcGVydHkgZ2V0TWV0YVByb3BlcnR5KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiB0aGlzLmRlbGVnYXRlLmdldE1ldGFQcm9wZXJ0eShuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWV0YU1ldGhvZCBnZXRTdGF0aWNNZXRhTWV0aG9kKFN0cmluZyBuYW1lLCBPYmplY3RbXSBhcmdzKSB7CisgICAgICAgIHJldHVybiB0aGlzLmRlbGVnYXRlLmdldFN0YXRpY01ldGFNZXRob2QobmFtZSwgYXJncyk7CisgICAgfQorCisgICAgcHVibGljIE1ldGFNZXRob2QgZ2V0U3RhdGljTWV0YU1ldGhvZChTdHJpbmcgbmFtZSwgQ2xhc3NbXSBhcmdUeXBlcykgeworICAgICAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZS5nZXRTdGF0aWNNZXRhTWV0aG9kKG5hbWUsIGFyZ1R5cGVzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWV0YU1ldGhvZCBnZXRNZXRhTWV0aG9kKFN0cmluZyBuYW1lLCBPYmplY3RbXSBhcmdzKSB7CisgICAgICAgIHJldHVybiB0aGlzLmRlbGVnYXRlLmdldE1ldGFNZXRob2QobmFtZSwgYXJncyk7CisgICAgfQorCisgICAgcHVibGljIE1ldGFNZXRob2QgZ2V0TWV0YU1ldGhvZChTdHJpbmcgbmFtZSwgQ2xhc3NbXSBhcmdUeXBlcykgeworICAgICAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZS5nZXRNZXRhTWV0aG9kKG5hbWUsIGFyZ1R5cGVzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3MgZ2V0VGhlQ2xhc3MoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmRlbGVnYXRlLmdldFRoZUNsYXNzKCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBpbnZva2VNZXRob2QoQ2xhc3Mgc2VuZGVyLCBPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXRob2ROYW1lLCBPYmplY3RbXSBhcmd1bWVudHMsIGJvb2xlYW4gaXNDYWxsVG9TdXBlciwgYm9vbGVhbiBmcm9tSW5zaWRlQ2xhc3MpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZGVsZWdhdGUuaW52b2tlTWV0aG9kKHNlbmRlciwgcmVjZWl2ZXIsIG1ldGhvZE5hbWUsIGFyZ3VtZW50cywgaXNDYWxsVG9TdXBlciwgZnJvbUluc2lkZUNsYXNzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGludm9rZU1pc3NpbmdNZXRob2QoT2JqZWN0IGluc3RhbmNlLCBTdHJpbmcgbWV0aG9kTmFtZSwgT2JqZWN0W10gYXJndW1lbnRzKSB7CisgICAgICAgIHJldHVybiB0aGlzLmRlbGVnYXRlLmludm9rZU1pc3NpbmdNZXRob2QoaW5zdGFuY2UsIG1ldGhvZE5hbWUsIGFyZ3VtZW50cyk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBpbnZva2VNaXNzaW5nUHJvcGVydHkoT2JqZWN0IGluc3RhbmNlLCBTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3Qgb3B0aW9uYWxWYWx1ZSwgYm9vbGVhbiBpc0dldHRlcikgeworICAgICAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZS5pbnZva2VNaXNzaW5nUHJvcGVydHkoaW5zdGFuY2UsIHByb3BlcnR5TmFtZSwgb3B0aW9uYWxWYWx1ZSwgaXNHZXR0ZXIpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzR3Jvb3Z5T2JqZWN0KCkgeworICAgICAgICByZXR1cm4gR3Jvb3Z5T2JqZWN0LmNsYXNzLmlzQXNzaWduYWJsZUZyb20odGhpcy5kZWxlZ2F0ZS5nZXRUaGVDbGFzcygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoQ2xhc3Mgc2VuZGVyLCBPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXNzYWdlTmFtZSwgT2JqZWN0IG1lc3NhZ2VWYWx1ZSwgYm9vbGVhbiB1c2VTdXBlciwgYm9vbGVhbiBmcm9tSW5zaWRlQ2xhc3MpIHsKKyAgICAgICAgdGhpcy5kZWxlZ2F0ZS5zZXRBdHRyaWJ1dGUoc2VuZGVyLCByZWNlaXZlciwgbWVzc2FnZU5hbWUsIG1lc3NhZ2VWYWx1ZSwgdXNlU3VwZXIsIGZyb21JbnNpZGVDbGFzcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoQ2xhc3Mgc2VuZGVyLCBPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXNzYWdlTmFtZSwgT2JqZWN0IG1lc3NhZ2VWYWx1ZSwgYm9vbGVhbiB1c2VTdXBlciwgYm9vbGVhbiBmcm9tSW5zaWRlQ2xhc3MpIHsKKyAgICAgICAgdGhpcy5kZWxlZ2F0ZS5zZXRQcm9wZXJ0eShzZW5kZXIsIHJlY2VpdmVyLCBtZXNzYWdlTmFtZSwgbWVzc2FnZVZhbHVlLCB1c2VTdXBlciwgZnJvbUluc2lkZUNsYXNzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHNlbGVjdENvbnN0cnVjdG9yQW5kVHJhbnNmb3JtQXJndW1lbnRzKGludCBudW1iZXJPZkNvc250cnVjdG9ycywgT2JqZWN0W10gYXJndW1lbnRzKSB7CisgICAgICAgIHJldHVybiB0aGlzLmRlbGVnYXRlLnNlbGVjdENvbnN0cnVjdG9yQW5kVHJhbnNmb3JtQXJndW1lbnRzKG51bWJlck9mQ29zbnRydWN0b3JzLCBhcmd1bWVudHMpOworICAgIH0KKworCXB1YmxpYyB2b2lkIHNldEFkYXB0ZWUoTWV0YUNsYXNzIGFkYXB0ZWUpIHsKKwkJdGhpcy5kZWxlZ2F0ZSA9IGFkYXB0ZWU7IAorCX0KKworICAgIHB1YmxpYyBNZXRhQ2xhc3MgZ2V0QWRhcHRlZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZGVsZWdhdGU7IAorICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgaW52b2tlTWV0aG9kKFN0cmluZyBuYW1lLCBPYmplY3QgYXJncykgeworICAgICAgdHJ5IHsKKyAgICAgICAgcmV0dXJuIGdldE1ldGFDbGFzcygpLmludm9rZU1ldGhvZCh0aGlzLCBuYW1lLCBhcmdzKTsKKyAgICAgIH0KKyAgICAgIGNhdGNoIChNaXNzaW5nTWV0aG9kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgaWYgKGRlbGVnYXRlIGluc3RhbmNlb2YgR3Jvb3Z5T2JqZWN0KQorICAgICAgICAgIHJldHVybiAoKEdyb292eU9iamVjdClkZWxlZ2F0ZSkuaW52b2tlTWV0aG9kKG5hbWUsIGFyZ3MpOworICAgICAgICBlbHNlCisgICAgICAgICAgdGhyb3cgZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSkgeworICAgICAgdHJ5IHsKKyAgICAgICAgcmV0dXJuIGdldE1ldGFDbGFzcygpLmdldFByb3BlcnR5KHRoaXMsIHByb3BlcnR5KTsKKyAgICAgIH0KKyAgICAgIGNhdGNoIChNaXNzaW5nUHJvcGVydHlFeGNlcHRpb24gZSkgeworICAgICAgICBpZiAoZGVsZWdhdGUgaW5zdGFuY2VvZiBHcm9vdnlPYmplY3QpCisgICAgICAgICAgcmV0dXJuICgoR3Jvb3Z5T2JqZWN0KWRlbGVnYXRlKS5nZXRQcm9wZXJ0eShwcm9wZXJ0eSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICB0aHJvdyBlOworICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IG5ld1ZhbHVlKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgZ2V0TWV0YUNsYXNzKCkuc2V0UHJvcGVydHkodGhpcywgcHJvcGVydHksIG5ld1ZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoTWlzc2luZ1Byb3BlcnR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBpZiAoZGVsZWdhdGUgaW5zdGFuY2VvZiBHcm9vdnlPYmplY3QpCisgICAgICAgICAgICAoKEdyb292eU9iamVjdClkZWxlZ2F0ZSkuc2V0UHJvcGVydHkocHJvcGVydHksIG5ld1ZhbHVlKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIE1ldGFDbGFzcyBnZXRNZXRhQ2xhc3MoKSB7CisgICAgICAgIHJldHVybiBJbnZva2VySGVscGVyLmdldE1ldGFDbGFzcyh0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNZXRhQ2xhc3MoTWV0YUNsYXNzIG1ldGFDbGFzcykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvRGVwcmVjYXRpb25FeGNlcHRpb24uamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbGFuZy9EZXByZWNhdGlvbkV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxYmU1ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvRGVwcmVjYXRpb25FeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBncm9vdnkubGFuZzsKKworLyoqCisgKiBVc2UgdGhpcyBleGNlcHRpb24gdG8gbWFyayBhIG1ldGhvZCBpbXBsZW1lbnRhdGlvbiBhcyBiZWluZyBkZXByZWNhdGVkLgorICoKKyAqIFVzZSB0aGUgbWVzc2FnZSB0byBpbmRpY2F0ZSB0aGUgcmVjb21tZW5kZWQgd2F5IG9mIGNhbGxpbmcgdGhlIGRlc2lyZWQgZnVuY3Rpb25hbGl0eS4KKyAqIE1ha2UgdGhyb3dpbmcgdGhpcyBleGNlcHRpb24gdGhlIG9ubHkgbGluZSBpbiB0aGUgbWV0aG9kIGltcGxlbWVudGF0aW9uLCBpLmUuIHVubGlrZQorICogdGhlIEphdmFEb2MgZGVwcmVjYXRlZCBmZWF0dXJlIHRoZXJlIGlzIG5vIHJlbGF5IHRvIHRoZSBuZXcgaW1wbGVtZW50YXRpb24gYnV0IGFuIGVhcmx5CisgKiBhbmQgZGVsaWJlcmF0ZSBoYWx0IG9mIGV4ZWN1dGlvbiAoImZhaWwgZWFybHkiKS4KKyAqCisgKiBUaGlzIGV4Y2VwdGlvbiBpcyBzdXBwb3NlZCB0byBiZSB1c2VkIGluIHRoZSBTTkFQU0hPVCByZWxlYXNlcyBvbmx5LiBCZWZvcmUgcmVsZWFzZSwgYWxsCisgKiByZWZlcmVuY2VzIHRvIHRoaXMgZXhjZXB0aW9uIHNob3VsZCBiZSByZXNvbHZlZCBhbmQgdGhlIGFjY29yZGluZyBtZXRob2RzIHJlbW92ZWQuCisgKgorICogQGF1dGhvciBEaWVyayBLb2VuaWcKKyAqLworcHVibGljIGNsYXNzIERlcHJlY2F0aW9uRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CisKKyAgICBwdWJsaWMgRGVwcmVjYXRpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgc3VwZXIobWVzc2FnZSk7CisgICAgfQorCisgICAgcHVibGljIERlcHJlY2F0aW9uRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKKyAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbGFuZy9FbXB0eVJhbmdlLmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvRW1wdHlSYW5nZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZjk0MTMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvRW1wdHlSYW5nZS5qYXZhCkBAIC0wLDAgKzEsMTk0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBncm9vdnkubGFuZzsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5JbnZva2VySGVscGVyOworCitpbXBvcnQgamF2YS51dGlsLio7CisKKy8qKgorICogQ29uc3RydWN0aW5nIFJhbmdlcyBsaWtlIDAuLjwwCisgKiBAYXV0aG9yIERpZXJrIEtvZW5pZworICogQGF1dGhvciBFZHdpbiBUZWxsbWFuCisgKi8KK3B1YmxpYyBjbGFzcyBFbXB0eVJhbmdlIGV4dGVuZHMgQWJzdHJhY3RMaXN0IGltcGxlbWVudHMgUmFuZ2UgeworICAgIAorICAgIC8qKgorICAgICAqIFRoZSB2YWx1ZSBhdCB3aGljaCB0aGUgcmFuZ2Ugb3JpZ2luYXRlcyAobWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+KS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29tcGFyYWJsZSBhdDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIEVtcHR5UmFuZ2V9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBhdCB0aGUgdmFsdWUgYXQgd2hpY2ggdGhlIHJhbmdlIHN0YXJ0cyAobWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+KS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRW1wdHlSYW5nZShDb21wYXJhYmxlIGF0KSB7CisgICAgICAgdGhpcy5hdCA9IGF0OworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29tcGFyYWJsZSBnZXRGcm9tKCkgeworICAgICAgICByZXR1cm4gYXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHB1YmxpYyBDb21wYXJhYmxlIGdldFRvKCkgeworICAgICAgICByZXR1cm4gYXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogTmV2ZXIgdHJ1ZSBmb3IgYW4gZW1wdHkgcmFuZ2UuCisgICAgICogCisgICAgICogQHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JldmVyc2UoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOZXZlciB0cnVlIGZvciBhbiBlbXB0eSByYW5nZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNXaXRoaW5Cb3VuZHMoT2JqZWN0IG8pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGluc3BlY3QoKSB7CisgICAgICAgIHJldHVybiBJbnZva2VySGVscGVyLmluc3BlY3QoYXQpICsgIi4uPCIgKyBJbnZva2VySGVscGVyLmluc3BlY3QoYXQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gKG51bGwgPT0gYXQpIAorICAgICAgICAgICAgPyAibnVsbC4uPG51bGwiCisgICAgICAgICAgICA6IGF0LnRvU3RyaW5nKCkgKyAiLi48IiArIGF0LnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWx3YXlzIDAgZm9yIGFuIGVtcHR5IHJhbmdlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gMAorICAgICAqLworICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWx3YXlzIHRocm93cyA8Y29kZT5JbmRleE91dE9mQm91bmRzRXhjZXB0aW9uPC9jb2RlPiBmb3IgYW4gZW1wdHkgcmFuZ2UuCisgICAgICogCisgICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGFsd2F5cworICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0KGludCBpbmRleCkgeworICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiY2FuJ3QgZ2V0IHZhbHVlcyBmcm9tIEVtcHR5IFJhbmdlcyIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFsd2F5cyB0aHJvd3MgPGNvZGU+VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb248L2NvZGU+IGZvciBhbiBlbXB0eSByYW5nZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gYWx3YXlzCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gYWRkKE9iamVjdCBvKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IGFkZCB0byBFbXB0eSBSYW5nZXMiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbHdheXMgdGhyb3dzIDxjb2RlPlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uPC9jb2RlPiBmb3IgYW4gZW1wdHkgcmFuZ2UuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gYWRkQWxsKGludCBpbmRleCwgQ29sbGVjdGlvbiBjKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2Fubm90IGFkZCB0byBFbXB0eSBSYW5nZXMiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbHdheXMgdGhyb3dzIDxjb2RlPlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uPC9jb2RlPiBmb3IgYW4gZW1wdHkgcmFuZ2UuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb24gYykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCBhZGQgdG8gRW1wdHkgUmFuZ2VzIik7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEFsd2F5cyB0aHJvd3MgPGNvZGU+VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb248L2NvZGU+IGZvciBhbiBlbXB0eSByYW5nZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3QgcmVtb3ZlIGZyb20gRW1wdHkgUmFuZ2VzIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWx3YXlzIHRocm93cyA8Y29kZT5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbjwvY29kZT4gZm9yIGFuIGVtcHR5IHJhbmdlLgorICAgICAqCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlKGludCBpbmRleCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCByZW1vdmUgZnJvbSBFbXB0eSBSYW5nZXMiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbHdheXMgdGhyb3dzIDxjb2RlPlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uPC9jb2RlPiBmb3IgYW4gZW1wdHkgcmFuZ2UuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb24gYykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCByZW1vdmUgZnJvbSBFbXB0eSBSYW5nZXMiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbHdheXMgdGhyb3dzIDxjb2RlPlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uPC9jb2RlPiBmb3IgYW4gZW1wdHkgcmFuZ2UuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb24gYykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbm5vdCByZXRhaW5BbGwgaW4gRW1wdHkgUmFuZ2VzIik7CisgICAgfQorCisgICAgIC8qKgorICAgICAgKiBBbHdheXMgdGhyb3dzIDxjb2RlPlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uPC9jb2RlPiBmb3IgYW4gZW1wdHkgcmFuZ2UuCisgICAgICAqCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3Qgc2V0KGludCBpbmRleCwgT2JqZWN0IGVsZW1lbnQpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjYW5ub3Qgc2V0IGluIEVtcHR5IFJhbmdlcyIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFsd2F5cyBkb2VzIG5vdGhpbmcgZm9yIGFuIGVtcHR5IHJhbmdlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0ZXAoaW50IHN0ZXAsIENsb3N1cmUgY2xvc3VyZSkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEFsd2F5cyByZXR1cm5zIGFuIGVtcHR5IGxpc3QgZm9yIGFuIGVtcHR5IHJhbmdlLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0IHN0ZXAoaW50IHN0ZXApIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3QoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvRXhwYW5kb01ldGFDbGFzcy5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL0V4cGFuZG9NZXRhQ2xhc3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGRlMGU3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL0V4cGFuZG9NZXRhQ2xhc3MuamF2YQpAQCAtMCwwICsxLDExMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBncm9vdnkubGFuZzsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucmVmbGVjdGlvbi5DYWNoZWRDbGFzczsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJlZmxlY3Rpb24uUmVmbGVjdGlvbkNhY2hlOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS4qOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5tZXRhY2xhc3MuQ2xvc3VyZU1ldGFNZXRob2Q7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLm1ldGFjbGFzcy5DbG9zdXJlU3RhdGljTWV0YU1ldGhvZDsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUubWV0YWNsYXNzLkNvbmN1cnJlbnRSZWFkZXJIYXNoTWFwOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5tZXRhY2xhc3MuVGhyZWFkTWFuYWdlZE1ldGFCZWFuUHJvcGVydHk7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7CitpbXBvcnQgamF2YS51dGlsLio7CisKKy8qKgorICogQSBNZXRhQ2xhc3MgdGhhdCBpbXBsZW1lbnRzIEdyb292eU9iamVjdCBhbmQgYmVoYXZlcyBsaWtlIGFuIEV4cGFuZG8sIGFsbG93aW5nIHRoZSBhZGRpdGlvbiBvZiBuZXcgbWV0aG9kcyBvbiB0aGUgZmx5CisgKgorICogPGNvZGU+PHByZT4KKyAqIC8vIGRlZmluZXMgb3IgcmVwbGFjZXMgaW5zdGFuY2UgbWV0aG9kOgorICogbWV0YUNsYXNzLm15TWV0aG9kID0geyBhcmdzIC0+IH0KKyAqCisgKiAvLyBkZWZpbmVzIGEgbmV3IGluc3RhbmNlIG1ldGhvZAorICogbWV0YUNsYXNzLm15TWV0aG9kIDw8IHsgYXJncyAtPiB9CisgKgorICogLy8gY3JlYXRlcyBtdWx0aXBsZSBvdmVybG9hZGVkIG1ldGhvZHMgb2YgdGhlIHNhbWUgbmFtZQorICogbWV0YUNsYXNzLm15TWV0aG9kIDw8IHsgU3RyaW5nIHMgLT4gfSA8PCB7IEludGVnZXIgaSAtPiB9CisgKgorICogLy8gZGVmaW5lcyBvciByZXBsYWNlcyBhIHN0YXRpYyBtZXRob2Qgd2l0aCB0aGUgJ3N0YXRpYycgcXVhbGlmaWVyCisgKiBtZXRhQ2xhc3MuJ3N0YXRpYycubXlNZXRob2QgPSB7IGFyZ3MgLT4gIH0KKyAqCisgKiAvLyBkZWZpbmVzIGEgbmV3IHN0YXRpYyBtZXRob2Qgd2l0aCB0aGUgJ3N0YXRpYycgcXVhbGlmaWVyCisgKiBtZXRhQ2xhc3MuJ3N0YXRpYycubXlNZXRob2QgPDwgeyBhcmdzIC0+ICB9CisgKgorICogLy8gZGVmaW5lcyBhIG5ldyBjb25zdHJ1Y3RvcgorICogbWV0YUNsYXNzLmNvbnN0cnVjdG9yIDw8IHsgU3RyaW5nIGFyZyAtPiB9CisgKgorICogLy8gZGVmaW5lcyBvciByZXBsYWNlcyBhIGNvbnN0cnVjdG9yCisgKiBtZXRhQ2xhc3MuY29uc3RydWN0b3IgPSB7IFN0cmluZyBhcmcgLT4gfQorICoKKyAqIC8vIGRlZmluZXMgYSBuZXcgcHJvcGVydHkgd2l0aCBhbiBpbml0aWFsIHZhbHVlIG9mICJibGFoIgorICogbWV0YUNsYXNzLm15UHJvcGVydHkgPSAiYmxhaCIKKyAqCisgKiA8L2NvZGU+PC9wcmU+CisgKgorICogQnkgZGVmYXVsdCBtZXRob2RzIGFyZSBvbmx5IGFsbG93ZWQgdG8gYmUgYWRkZWQgYmVmb3JlIGluaXRpYWxpemUoKSBpcyBjYWxsZWQuIEluIG90aGVyIHdvcmRzIHlvdSBjcmVhdGUgYSBuZXcKKyAqIEV4cGFuZG9NZXRhQ2xhc3MsIGFkZCBzb21lIG1ldGhvZHMgYW5kIHRoZW4gY2FsbCBpbml0aWFsaXplKCkuIElmIHlvdSBhdHRlbXB0IHRvIGFkZCBuZXcgbWV0aG9kcyBhZnRlciBpbml0aWFsaXplKCkKKyAqIGhhcyBiZWVuIGNhbGxlZCBhbiBlcnJvciB3aWxsIGJlIHRocm93bi4KKyAqCisgKiBUaGlzIGlzIHRvIGVuc3VyZSB0aGF0IHRoZSBNZXRhQ2xhc3MgY2FuIG9wZXJhdGUgYXBwcm9wcmlhdGVseSBpbiBtdWx0aSB0aHJlYWRlZCBlbnZpcm9ubWVudHMgYXMgaXQgZm9yY2VzIHlvdQorICogdG8gZG8gYWxsIG1ldGhvZCBhZGRpdGlvbnMgYXQgdGhlIGJlZ2lubmluZywgYmVmb3JlIHVzaW5nIHRoZSBNZXRhQ2xhc3MuCisgKgorICogSWYgeW91IG5lZWQgbW9yZSBmaW5lIGdyYWluZWQgY29udHJvbCBvZiBob3cgYSBtZXRob2QgaXMgbWF0Y2hlZCB5b3UgY2FuIHVzZSBEeW5hbWljTWV0aG9kc01ldGFDbGFzcworICoKKyAqIFdBUk5JTkc6IFRoaXMgTWV0YUNsYXNzIHVzZXMgYSB0aHJlYWQtYm91bmQgVGhyZWFkTG9jYWwgaW5zdGFuY2UgdG8gc3RvcmUgYW5kIHJldHJpZXZlIHByb3BlcnRpZXMuCisgKiBJbiBhZGRpdGlvbiBwcm9wZXJ0aWVzIHN0b3JlZCB1c2Ugc29mdCByZWZlcmVuY2VzIHNvIHRoZXkgYXJlIGJvdGggYm91bmQgYnkgdGhlIGxpZmUgb2YgdGhlIFRocmVhZCBhbmQgYnkgdGhlIHNvZnQKKyAqIHJlZmVyZW5jZXMuIFRoZSBpbXBsaWNhdGlvbiBoZXJlIGlzIHlvdSBzaG91bGQgTkVWRVIgdXNlIGR5bmFtaWMgcHJvcGVydGllcyBpZiB5b3Ugd2FudCB0aGVpciB2YWx1ZXMgdG8gc3RpY2sgYXJvdW5kCisgKiBmb3IgbG9uZyBwZXJpb2RzIGJlY2F1c2UgYXMgc29vbiBhcyB0aGUgSlZNIGlzIHJ1bm5pbmcgbG93IG9uIG1lbW9yeSBvciB0aGUgdGhyZWFkIGRpZXMgdGhleSB3aWxsIGJlIGdhcmJhZ2UgY29sbGVjdGVkLgorICoKKyAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgorICogQHNpbmNlIDEuMQorICovCitwdWJsaWMgY2xhc3MgRXhwYW5kb01ldGFDbGFzcyBleHRlbmRzIE1ldGFDbGFzc0ltcGwgaW1wbGVtZW50cyBHcm9vdnlPYmplY3QgeworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFfQ0xBU1MgPSAibWV0YUNsYXNzIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1MgPSAiY2xhc3MiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBX01FVEhPRFMgPSAibWV0YU1ldGhvZHMiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RTID0gIm1ldGhvZHMiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUSUVTID0gInByb3BlcnRpZXMiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRJQ19RVUFMSUZJRVIgPSAic3RhdGljIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1tdIFpFUk9fQVJHVU1FTlRTID0gbmV3IENsYXNzWzBdOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05TVFJVQ1RPUiA9ICJjb25zdHJ1Y3RvciI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdFVF9QUk9QRVJUWV9NRVRIT0QgPSAiZ2V0UHJvcGVydHkiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRfUFJPUEVSVFlfTUVUSE9EID0gInNldFByb3BlcnR5IjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlZPS0VfTUVUSE9EX01FVEhPRCA9ICJpbnZva2VNZXRob2QiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19QUk9QRVJUWSA9ICJjbGFzcyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFfQ0xBU1NfUFJPUEVSVFkgPSAibWV0YUNsYXNzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JPT1ZZX0NPTlNUUlVDVE9SID0gIjxpbml0PiI7CisKKyAgICAvLyBUaGVzZSB0d28gcHJvcGVydGllcyBhcmUgdXNlZCB3aGVuIG5vIEV4cGFuZG9NZXRhQ2xhc3NDcmVhdGlvbkhhbmRsZSBpcyBwcmVzZW50CisKKyAgICBwcml2YXRlIE1ldGFDbGFzcyBteU1ldGFDbGFzczsKKyAgICBwcml2YXRlIGJvb2xlYW4gYWxsb3dDaGFuZ2VzQWZ0ZXJJbml0OworCisgICAgcHJpdmF0ZSBib29sZWFuIGluaXRpYWxpemVkOworICAgIHByaXZhdGUgYm9vbGVhbiBpbml0Q2FsbGVkOworICAgIHByaXZhdGUgYm9vbGVhbiBtb2RpZmllZDsKKyAgICBwcml2YXRlIGJvb2xlYW4gaW5SZWdpc3RyeTsKKyAgICBwcml2YXRlIGZpbmFsIFNldCBpbmhlcml0ZWRNZXRhTWV0aG9kcyA9IG5ldyBIYXNoU2V0KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXAgYmVhblByb3BlcnR5Q2FjaGUgPSBuZXcgQ29uY3VycmVudFJlYWRlckhhc2hNYXAoKTsKKyAgICBwcml2YXRlIGZpbmFsIE1hcCBzdGF0aWNCZWFuUHJvcGVydHlDYWNoZSA9IG5ldyBDb25jdXJyZW50UmVhZGVySGFzaE1hcCgpOworICAgIHByaXZhdGUgZmluYWwgTWFwIGV4cGFuZG9NZXRob2RzID0gbmV3IENvbmN1cnJlbnRSZWFkZXJIYXNoTWFwKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXAgZXhwYW5kb1Byb3BlcnRpZXMgPSBuZXcgQ29uY3VycmVudFJlYWRlckhhc2hNYXAoKTsKKyAgICBwcml2YXRlIENsb3N1cmVNZXRhTWV0aG9kIGdldFByb3BlcnR5TWV0aG9kOworICAgIHByaXZhdGUgQ2xvc3VyZU1ldGFNZXRob2QgaW52b2tlTWV0aG9kTWV0aG9kOworICAgIHByaXZhdGUgQ2xvc3VyZU1ldGFNZXRob2Qgc2V0UHJvcGVydHlNZXRob2Q7CisgICAgcHJpdmF0ZSBDbG9zdXJlU3RhdGljTWV0YU1ldGhvZCBpbnZva2VTdGF0aWNNZXRob2RNZXRob2Q7CisKKyAgICAvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IEV4cGFuZG9NZXRhQ2xhc3MgaW5zdGFuY2UgZm9yIHRoZSBnaXZlbiBjbGFzcworCSAqCisJICogQHBhcmFtIHRoZUNsYXNzIFRoZSBjbGFzcyB0aGF0IHRoZSBNZXRhQ2xhc3MgYXBwbGllcyB0bworCSAqLworCXB1YmxpYyBFeHBhbmRvTWV0YUNsYXNzKENsYXNzIHRoZUNsYXNzKSB7CisJCXN1cGVyKEdyb292eVN5c3RlbS5nZXRNZXRhQ2xhc3NSZWdpc3RyeSgpLCB0aGVDbGFzcyk7CisJCXRoaXMubXlNZXRhQ2xhc3MgPSBJbnZva2VySGVscGVyLmdldE1ldGFDbGFzcyh0aGlzKTsKKworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBuZXcgRXhwYW5kb01ldGFDbGFzcyBpbnN0YW5jZSBmb3IgdGhlIGdpdmVuIGNsYXNzIG9wdGlvbmFsbHkgcGxhY2luZyB0aGUgTWV0YUNsYXNzCisJICogaW4gdGhlIE1ldGFDbGFzc1JlZ2lzdHJ5IGF1dG9tYXRpY2FsbHkKKwkgKgorCSAqIEBwYXJhbSB0aGVDbGFzcyBUaGUgY2xhc3MgdGhhdCB0aGUgTWV0YUNsYXNzIGFwcGxpZXMgdG8KKwkgKiBAcGFyYW0gcmVnaXN0ZXIgVHJ1ZSBpZiB0aGUgTWV0YUNsYXNzIHNob3VsZCBiZSByZWdpc3RlcmVkIGluc2lkZSB0aGUgTWV0YUNsYXNzUmVnaXN0cnkuIFRoaXMgZGVmYXVsdHMgdG8gdHJ1ZSBhbmQgRXhwYW5kb01ldGFDbGFzcyB3aWxsIGVmZmVjdCBhbGwgaW5zdGFuY2VzIGlmIGNoYW5nZWQKKwkgKi8KKwlwdWJsaWMgRXhwYW5kb01ldGFDbGFzcyhDbGFzcyB0aGVDbGFzcywgYm9vbGVhbiByZWdpc3RlcikgeworCQl0aGlzKHRoZUNsYXNzKTsKKwkgICAgdGhpcy5pblJlZ2lzdHJ5ID0gcmVnaXN0ZXI7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0cyBhIG5ldyBFeHBhbmRvTWV0YUNsYXNzIGluc3RhbmNlIGZvciB0aGUgZ2l2ZW4gY2xhc3Mgb3B0aW9uYWxseSBwbGFjaW5nIHRoZSBNZXRhQ2xhc3MKKwkgKiBpbiB0aGUgTWV0YUNsYXNzUmVnaXN0cnkgYXV0b21hdGljYWxseQorCSAqCisJICogQHBhcmFtIHRoZUNsYXNzIFRoZSBjbGFzcyB0aGF0IHRoZSBNZXRhQ2xhc3MgYXBwbGllcyB0bworCSAqIEBwYXJhbSByZWdpc3RlciBUcnVlIGlmIHRoZSBNZXRhQ2xhc3Mgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgaW5zaWRlIHRoZSBNZXRhQ2xhc3NSZWdpc3RyeS4gVGhpcyBkZWZhdWx0cyB0byB0cnVlIGFuZCBFeHBhbmRvTWV0YUNsYXNzIHdpbGwgZWZmZWN0IGFsbCBpbnN0YW5jZXMgaWYgY2hhbmdlZAorICAgICAqIEBwYXJhbSBhbGxvd0NoYW5nZXNBZnRlckluaXQgU2hvdWxkIHRoZSBtZXRhIGNsYXNzIGJlIG1vZGlmaWFibGUgYWZ0ZXIgaW5pdGlhbGl6YXRpb24uIERlZmF1bHQgaXMgZmFsc2UuCisJICovCisJcHVibGljIEV4cGFuZG9NZXRhQ2xhc3MoQ2xhc3MgdGhlQ2xhc3MsIGJvb2xlYW4gcmVnaXN0ZXIsIGJvb2xlYW4gYWxsb3dDaGFuZ2VzQWZ0ZXJJbml0KSB7CisJCXRoaXModGhlQ2xhc3MpOworCSAgICB0aGlzLmluUmVnaXN0cnkgPSByZWdpc3RlcjsKKyAgICAgICAgdGhpcy5hbGxvd0NoYW5nZXNBZnRlckluaXQgPSBhbGxvd0NoYW5nZXNBZnRlckluaXQ7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZXMgdGhlIGRlZmF1bHQgbWlzc2luZyBtZXRob2QgYmVoYXZpb3VyIGFuZCBhZGRzIHRoZSBjYXBhYmlsaXR5IHRvIGxvb2sgdXAgYSBtZXRob2QgZnJvbSBzdXBlciBjbGFzcworICAgICAqCisgICAgICogQHNlZSBNZXRhQ2xhc3NJbXBsI2ludm9rZU1pc3NpbmdNZXRob2QoT2JqZWN0LCBTdHJpbmcsIE9iamVjdFtdKQorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgaW52b2tlTWlzc2luZ01ldGhvZChPYmplY3QgaW5zdGFuY2UsIFN0cmluZyBtZXRob2ROYW1lLCBPYmplY3RbXSBhcmd1bWVudHMpIHsKKyAgICAgICAgQ2xhc3Mgc3VwZXJDbGFzcyA9IGluc3RhbmNlIGluc3RhbmNlb2YgQ2xhc3MgPyAoQ2xhc3MpaW5zdGFuY2UgOiBpbnN0YW5jZS5nZXRDbGFzcygpOworICAgICAgICB3aGlsZShzdXBlckNsYXNzICE9IE9iamVjdC5jbGFzcykgeworICAgICAgICAgICAgZmluYWwgTWV0YU1ldGhvZCBtZXRob2QgPSBmaW5kTWV0aG9kSW5DbGFzc0hlaXJhcmNoeShtZXRob2ROYW1lLCBhcmd1bWVudHMsIHN1cGVyQ2xhc3MpOworICAgICAgICAgICAgaWYobWV0aG9kICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhZGRTdXBlck1ldGhvZElmTm90T3ZlcnJpZGVuKG1ldGhvZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZC5pbnZva2UoaW5zdGFuY2UsIGFyZ3VtZW50cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdXBlckNsYXNzID0gc3VwZXJDbGFzcy5nZXRTdXBlcmNsYXNzKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gc3RpbGwgbm90IG1ldGhvZCBoZXJlLCBzbyBzZWUgaWYgdGhlcmUgaXMgYW4gaW52b2tlTWV0aG9kIG1ldGhvZCB1cCB0aGUgaGVpcmFyY2h5CisgICAgICAgIGZpbmFsIE9iamVjdFtdIGludm9rZU1ldGhvZEFyZ3MgPSB7bWV0aG9kTmFtZSwgYXJndW1lbnRzfTsKKyAgICAgICAgZmluYWwgTWV0YU1ldGhvZCBtZXRob2QgPSBmaW5kTWV0aG9kSW5DbGFzc0hlaXJhcmNoeShJTlZPS0VfTUVUSE9EX01FVEhPRCwgaW52b2tlTWV0aG9kQXJncywgdGhlQ2xhc3MgKTsKKyAgICAgICAgaWYobWV0aG9kIT1udWxsICYmIG1ldGhvZCBpbnN0YW5jZW9mIENsb3N1cmVNZXRhTWV0aG9kKSB7CisgICAgICAgICAgICB0aGlzLmludm9rZU1ldGhvZE1ldGhvZCA9IChDbG9zdXJlTWV0YU1ldGhvZCltZXRob2Q7CisgICAgICAgICAgICByZXR1cm4gbWV0aG9kLmludm9rZShpbnN0YW5jZSwgaW52b2tlTWV0aG9kQXJncyk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc3VwZXIuaW52b2tlTWlzc2luZ01ldGhvZChpbnN0YW5jZSwgbWV0aG9kTmFtZSwgYXJndW1lbnRzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZXMgdGhlIGRlZmF1bHQgbWlzc2luZyBtZXRob2QgYmVoYXZpb3VyIGFuZCBhZGRzIHRoZSBjYXBhYmlsaXR5IHRvIGxvb2sgdXAgYSBtZXRob2QgZnJvbSB0aGUgc3VwZXIgY2xhc3MgaW4gdGhlIGNhc2UKKyAgICAgKiB3aGVyZSBpdCBoYXMgYmVlbiBvdmVycmlkZW4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnN0YW5jZSBUaGUgaW5zdGFuY2Ugb2YgdGhlIG9iamVjdAorICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgVGhlIHByb3BlcnR5IG5hbWUKKyAgICAgKiBAcGFyYW0gb3B0aW9uYWxWYWx1ZSBUaGUgcHJvcGVydHkgdmFsdWUgaW4gdGhlIGNhc2Ugb2YgYSBzZXR0ZXIKKyAgICAgKiBAcGFyYW0gaXNHZXR0ZXIgVHJ1ZSBpZiBpdCBpcyBhIGdldHRlcgorICAgICAqIEByZXR1cm4gVGhlIHJldHVybiB2YWx1ZSBpZiBvZiBhIGdldFByb3BlcnR5IGNhbGwgb3IgYSBNaXNzaW5nUHJvcGVydHlFeGNlcHRpb24gaXMgdGhyb3duCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBpbnZva2VNaXNzaW5nUHJvcGVydHkoT2JqZWN0IGluc3RhbmNlLCBTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3Qgb3B0aW9uYWxWYWx1ZSwgYm9vbGVhbiBpc0dldHRlcikgeworICAgICAgICBDbGFzcyB0aGVDbGFzcyA9IGluc3RhbmNlIGluc3RhbmNlb2YgQ2xhc3MgPyAoQ2xhc3MpaW5zdGFuY2UgOiBpbnN0YW5jZS5nZXRDbGFzcygpOworICAgICAgICBDYWNoZWRDbGFzcyBzdXBlckNsYXNzID0gdGhlQ2FjaGVkQ2xhc3M7CisgICAgICAgIHdoaWxlKHN1cGVyQ2xhc3MgIT0gUmVmbGVjdGlvbkNhY2hlLk9CSkVDVF9DTEFTUykgeworICAgICAgICAgICAgZmluYWwgTWV0YUJlYW5Qcm9wZXJ0eSBwcm9wZXJ0eSA9IGZpbmRQcm9wZXJ0eUluQ2xhc3NIaWVyYXJjaHkocHJvcGVydHlOYW1lLCBzdXBlckNsYXNzKTsKKyAgICAgICAgICAgIGlmKHByb3BlcnR5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhZGRNZXRhQmVhblByb3BlcnR5KHByb3BlcnR5KTsKKyAgICAgICAgICAgICAgICBpZighaXNHZXR0ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkuc2V0UHJvcGVydHkoaW5zdGFuY2UsIG9wdGlvbmFsVmFsdWUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eS5nZXRQcm9wZXJ0eShpbnN0YW5jZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3VwZXJDbGFzcyA9IHN1cGVyQ2xhc3MuZ2V0Q2FjaGVkU3VwZXJDbGFzcygpOworICAgICAgICB9CisgICAgICAgIC8vIGdvdCBoZXJlIHRvIHByb3BlcnR5IG5vdCBmb3VuZCwgbG9vayBmb3IgZ2V0UHJvcGVydHkgb3Igc2V0UHJvcGVydHkgb3ZlcnJpZGVzCisgICAgICAgIGlmKGlzR2V0dGVyKSB7CisgICAgICAgICAgICBmaW5hbCBPYmplY3RbXSBnZXRQcm9wZXJ0eUFyZ3MgPSB7cHJvcGVydHlOYW1lfTsKKyAgICAgICAgICAgIGZpbmFsIE1ldGFNZXRob2QgbWV0aG9kID0gZmluZE1ldGhvZEluQ2xhc3NIZWlyYXJjaHkoR0VUX1BST1BFUlRZX01FVEhPRCwgZ2V0UHJvcGVydHlBcmdzLCB0aGVDbGFzcyk7CisgICAgICAgICAgICBpZihtZXRob2QgIT0gbnVsbCAmJiBtZXRob2QgaW5zdGFuY2VvZiBDbG9zdXJlTWV0YU1ldGhvZCkgeworICAgICAgICAgICAgICAgIHRoaXMuZ2V0UHJvcGVydHlNZXRob2QgPSAoQ2xvc3VyZU1ldGFNZXRob2QpbWV0aG9kOworICAgICAgICAgICAgICAgIHJldHVybiBtZXRob2QuaW52b2tlKGluc3RhbmNlLGdldFByb3BlcnR5QXJncyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBmaW5hbCBPYmplY3RbXSBzZXRQcm9wZXJ0eUFyZ3MgPSB7cHJvcGVydHlOYW1lLCBvcHRpb25hbFZhbHVlfTsKKyAgICAgICAgICAgIGZpbmFsIE1ldGFNZXRob2QgbWV0aG9kID0gZmluZE1ldGhvZEluQ2xhc3NIZWlyYXJjaHkoU0VUX1BST1BFUlRZX01FVEhPRCwgc2V0UHJvcGVydHlBcmdzLCB0aGVDbGFzcyk7CisgICAgICAgICAgICBpZihtZXRob2QgIT0gbnVsbCAmJiBtZXRob2QgaW5zdGFuY2VvZiBDbG9zdXJlTWV0YU1ldGhvZCkgeworICAgICAgICAgICAgICAgIHRoaXMuc2V0UHJvcGVydHlNZXRob2QgPSAoQ2xvc3VyZU1ldGFNZXRob2QpbWV0aG9kOworICAgICAgICAgICAgICAgIHJldHVybiBtZXRob2QuaW52b2tlKGluc3RhbmNlLCBzZXRQcm9wZXJ0eUFyZ3MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5pbnZva2VNaXNzaW5nUHJvcGVydHkoaW5zdGFuY2UsIHByb3BlcnR5TmFtZSwgb3B0aW9uYWxWYWx1ZSwgaXNHZXR0ZXIpOworICAgIH0KKworICAgIHByaXZhdGUgTWV0YUJlYW5Qcm9wZXJ0eSBmaW5kUHJvcGVydHlJbkNsYXNzSGllcmFyY2h5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIENhY2hlZENsYXNzIHRoZUNsYXNzKSB7CisgICAgICAgIE1ldGFCZWFuUHJvcGVydHkgcHJvcGVydHk9IG51bGw7CisgICAgICAgIGZpbmFsIENhY2hlZENsYXNzIHN1cGVyQ2xhc3MgPSB0aGVDbGFzcy5nZXRDYWNoZWRTdXBlckNsYXNzKCk7CisgICAgICAgIE1ldGFDbGFzcyBtZXRhQ2xhc3MgPSB0aGlzLnJlZ2lzdHJ5LmdldE1ldGFDbGFzcyhzdXBlckNsYXNzLmdldENhY2hlZENsYXNzKCkpOworICAgICAgICBpZihtZXRhQ2xhc3MgaW5zdGFuY2VvZiBNdXRhYmxlTWV0YUNsYXNzKSB7CisgICAgICAgICAgICBwcm9wZXJ0eSA9IGdldE1ldGFQcm9wZXJ0eUZyb21NdXRhYmxlTWV0YUNsYXNzKHByb3BlcnR5TmFtZSxtZXRhQ2xhc3MpOworICAgICAgICAgICAgaWYocHJvcGVydHkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmKHN1cGVyQ2xhc3MgIT0gUmVmbGVjdGlvbkNhY2hlLk9CSkVDVF9DTEFTUykgeworICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSA9IGZpbmRQcm9wZXJ0eUluQ2xhc3NIaWVyYXJjaHkocHJvcGVydHlOYW1lLCBzdXBlckNsYXNzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYocHJvcGVydHkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzc1tdIGludGVyZmFjZXMgPSB0aGVDbGFzcy5nZXRDYWNoZWRDbGFzcygpLmdldEludGVyZmFjZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkgPSBzZWFyY2hJbnRlcmZhY2VzRm9yTWV0YVByb3BlcnR5KHByb3BlcnR5TmFtZSwgaW50ZXJmYWNlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBwcm9wZXJ0eTsKKworICAgIH0KKworICAgIHByaXZhdGUgTWV0YUJlYW5Qcm9wZXJ0eSBzZWFyY2hJbnRlcmZhY2VzRm9yTWV0YVByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIENsYXNzW10gaW50ZXJmYWNlcykgeworICAgICAgICBNZXRhQmVhblByb3BlcnR5IHByb3BlcnR5ID0gbnVsbDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcmZhY2VzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBDbGFzcyBhbkludGVyZmFjZSA9IGludGVyZmFjZXNbaV07CisgICAgICAgICAgICBNZXRhQ2xhc3MgbWV0YUNsYXNzID0gdGhpcy5yZWdpc3RyeS5nZXRNZXRhQ2xhc3MoYW5JbnRlcmZhY2UpOworICAgICAgICAgICAgaWYobWV0YUNsYXNzIGluc3RhbmNlb2YgTXV0YWJsZU1ldGFDbGFzcykgeworICAgICAgICAgICAgICAgIHByb3BlcnR5ID0gZ2V0TWV0YVByb3BlcnR5RnJvbU11dGFibGVNZXRhQ2xhc3MocHJvcGVydHlOYW1lLG1ldGFDbGFzcyk7CisgICAgICAgICAgICAgICAgaWYocHJvcGVydHkgIT0gbnVsbCkgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDbGFzc1tdIHN1cGVySW50ZXJmYWNlcyA9IGFuSW50ZXJmYWNlLmdldEludGVyZmFjZXMoKTsKKyAgICAgICAgICAgIGlmKHN1cGVySW50ZXJmYWNlcy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgcHJvcGVydHkgPSBzZWFyY2hJbnRlcmZhY2VzRm9yTWV0YVByb3BlcnR5KHByb3BlcnR5TmFtZSwgc3VwZXJJbnRlcmZhY2VzKTsKKyAgICAgICAgICAgICAgICBpZihwcm9wZXJ0eSE9bnVsbCkgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcHJvcGVydHk7CisgICAgfQorCisgICAgcHJpdmF0ZSBNZXRhQmVhblByb3BlcnR5IGdldE1ldGFQcm9wZXJ0eUZyb21NdXRhYmxlTWV0YUNsYXNzKFN0cmluZyBwcm9wZXJ0eU5hbWUsIE1ldGFDbGFzcyBtZXRhQ2xhc3MpIHsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBpc01vZGlmaWVkID0gKChNdXRhYmxlTWV0YUNsYXNzKSBtZXRhQ2xhc3MpLmlzTW9kaWZpZWQoKTsKKyAgICAgICAgZmluYWwgTWV0YVByb3BlcnR5IG1ldGFQcm9wZXJ0eSA9IG1ldGFDbGFzcy5nZXRNZXRhUHJvcGVydHkocHJvcGVydHlOYW1lKTsKKyAgICAgICAgaWYobWV0YVByb3BlcnR5IGluc3RhbmNlb2YgTWV0YUJlYW5Qcm9wZXJ0eSkKKyAgICAgICAgICAgIHJldHVybiBpc01vZGlmaWVkID8gKE1ldGFCZWFuUHJvcGVydHkpbWV0YVByb3BlcnR5IDogbnVsbDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICB9CisKKyAgICBwcml2YXRlIE1ldGFNZXRob2QgZmluZE1ldGhvZEluQ2xhc3NIZWlyYXJjaHkoU3RyaW5nIG1ldGhvZE5hbWUsIE9iamVjdFtdIGFyZ3VtZW50cywgQ2xhc3MgdGhlQ2xhc3MpIHsKKyAgICAgICAgTWV0YU1ldGhvZCBtZXRob2QgPSBudWxsOworICAgICAgICBmaW5hbCBDbGFzcyBzdXBlckNsYXNzID0gdGhlQ2xhc3MuZ2V0U3VwZXJjbGFzcygpOworICAgICAgICBpZiAoc3VwZXJDbGFzcyA9PSBudWxsKQorICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAKKyAgICAgICAgTWV0YUNsYXNzIG1ldGFDbGFzcyA9IHRoaXMucmVnaXN0cnkuZ2V0TWV0YUNsYXNzKHN1cGVyQ2xhc3MpOworICAgICAgICBpZihtZXRhQ2xhc3MgaW5zdGFuY2VvZiBNdXRhYmxlTWV0YUNsYXNzKSB7CisgICAgICAgICAgICBtZXRob2QgPSBnZXRNZXRhTWV0aG9kRnJvbU11dGFibGVNZXRhQ2xhc3MobWV0aG9kTmFtZSwgYXJndW1lbnRzLCBtZXRhQ2xhc3MpOworICAgICAgICAgICAgaWYobWV0aG9kID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZihzdXBlckNsYXNzICE9IE9iamVjdC5jbGFzcykgeworICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSBmaW5kTWV0aG9kSW5DbGFzc0hlaXJhcmNoeShtZXRob2ROYW1lLCBhcmd1bWVudHMsIHN1cGVyQ2xhc3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZihtZXRob2QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzc1tdIGludGVyZmFjZXMgPSB0aGVDbGFzcy5nZXRJbnRlcmZhY2VzKCk7CisgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9IHNlYXJjaEludGVyZmFjZXNGb3JNZXRhTWV0aG9kKG1ldGhvZE5hbWUsIGFyZ3VtZW50cywgaW50ZXJmYWNlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBtZXRob2Q7CisgICAgfQorCisgICAgcHJpdmF0ZSBNZXRhTWV0aG9kIHNlYXJjaEludGVyZmFjZXNGb3JNZXRhTWV0aG9kKFN0cmluZyBtZXRob2ROYW1lLCBPYmplY3RbXSBhcmd1bWVudHMsIENsYXNzW10gaW50ZXJmYWNlcykgeworICAgICAgICBNZXRhTWV0aG9kIG1ldGhvZCA9IG51bGw7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJmYWNlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgQ2xhc3MgYW5JbnRlcmZhY2UgPSBpbnRlcmZhY2VzW2ldOworICAgICAgICAgICAgTWV0YUNsYXNzIG1ldGFDbGFzcyA9IHRoaXMucmVnaXN0cnkuZ2V0TWV0YUNsYXNzKGFuSW50ZXJmYWNlKTsKKyAgICAgICAgICAgIGlmKG1ldGFDbGFzcyBpbnN0YW5jZW9mIE11dGFibGVNZXRhQ2xhc3MpIHsKKyAgICAgICAgICAgICAgICBtZXRob2QgPSBnZXRNZXRhTWV0aG9kRnJvbU11dGFibGVNZXRhQ2xhc3MobWV0aG9kTmFtZSwgYXJndW1lbnRzLCBtZXRhQ2xhc3MpOworICAgICAgICAgICAgICAgIGlmKG1ldGhvZCAhPSBudWxsKSBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENsYXNzW10gc3VwZXJJbnRlcmZhY2VzID0gYW5JbnRlcmZhY2UuZ2V0SW50ZXJmYWNlcygpOworICAgICAgICAgICAgaWYoc3VwZXJJbnRlcmZhY2VzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICBtZXRob2QgPSBzZWFyY2hJbnRlcmZhY2VzRm9yTWV0YU1ldGhvZChtZXRob2ROYW1lLGFyZ3VtZW50cywgc3VwZXJJbnRlcmZhY2VzKTsKKyAgICAgICAgICAgICAgICBpZihtZXRob2QhPW51bGwpIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1ldGhvZDsKKyAgICB9CisKKyAgICBwcml2YXRlIE1ldGFNZXRob2QgZ2V0TWV0YU1ldGhvZEZyb21NdXRhYmxlTWV0YUNsYXNzKFN0cmluZyBtZXRob2ROYW1lLCBPYmplY3RbXSBhcmd1bWVudHMsIE1ldGFDbGFzcyBtZXRhQ2xhc3MpIHsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBpc01vZGlmaWVkID0gKChNdXRhYmxlTWV0YUNsYXNzKSBtZXRhQ2xhc3MpLmlzTW9kaWZpZWQoKTsKKyAgICAgICAgcmV0dXJuIGlzTW9kaWZpZWQgPyBtZXRhQ2xhc3MuZ2V0TWV0YU1ldGhvZChtZXRob2ROYW1lLCBhcmd1bWVudHMpIDogbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNNb2RpZmllZCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubW9kaWZpZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogRm9yIHNpbXVsYXRpbmcgY2xvc3VyZXMgaW4gSmF2YQorICAgICAqLworICAgIHByaXZhdGUgaW50ZXJmYWNlIENhbGxhYmxlIHsKKwkJdm9pZCBjYWxsKCk7CisJfQorCisgICAgLyoqCisgICAgICogQ2FsbCB0byBlbmFibGUgZ2xvYmFsIHVzZSBvZiBnbG9iYWwgdXNlIG9mIEV4cGFuZG9NZXRhQ2xhc3Mgd2l0aGluIHRoZSByZWdpc3RyeS4gVGhpcyBoYXMgdGhlIGFkdmFudGFnZSB0aGF0CisgICAgICogaW5oZXJpdGFuY2Ugd2lsbCBmdW5jdGlvbiBjb3JyZWN0bHksIGJ1dCBoYXMgYSBoaWdoZXIgbWVtb3J5IHVzYWdlIG9uIHRoZSBKVk0gdGhhbiBub3JtYWwgR3Jvb3Z5CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGVuYWJsZUdsb2JhbGx5KCkgeworICAgICAgICBFeHBhbmRvTWV0YUNsYXNzQ3JlYXRpb25IYW5kbGUuZW5hYmxlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbCB0byBkaXNhYmxlIHRoZSBnbG9iYWwgdXNlIG9mIEV4cGFuZG9NZXRhQ2xhc3MKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGlzYWJsZUdsb2JhbGx5KCkgeworICAgICAgICBFeHBhbmRvTWV0YUNsYXNzQ3JlYXRpb25IYW5kbGUuZGlzYWJsZSgpOworICAgIH0KKworCisKKyAgICAvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBncm9vdnkubGFuZy5NZXRhQ2xhc3NJbXBsI2luaXRpYWxpemUoKQorCSAqLworCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBpbml0aWFsaXplKCkgeworICAgICAgICBpZiAoIWlzSW5pdGlhbGl6ZWQoKSkgeworICAgICAgICAgICAgc3VwZXIuaW5pdGlhbGl6ZSgpOworICAgICAgICAgICAgc2V0SW5pdGlhbGl6ZWQodHJ1ZSk7CisgICAgICAgICAgICB0aGlzLmluaXRDYWxsZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBncm9vdnkubGFuZy5NZXRhQ2xhc3NJbXBsI2lzSW5pdGlhbGl6ZWQoKQorCSAqLworCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0luaXRpYWxpemVkKCkgeworCQlyZXR1cm4gdGhpcy5pbml0aWFsaXplZDsKKwl9CisKKyAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgc2V0SW5pdGlhbGl6ZWQoYm9vbGVhbiBiKSB7CisgICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSBiOworICAgIH0KKworCisgICAgcHJpdmF0ZSB2b2lkIGFkZFN1cGVyTWV0aG9kSWZOb3RPdmVycmlkZW4oZmluYWwgTWV0YU1ldGhvZCBtZXRhTWV0aG9kRnJvbVN1cGVyKSB7CisJCXBlcmZvcm1PcGVyYXRpb25Pbk1ldGFDbGFzcyhuZXcgQ2FsbGFibGUoKSB7CisJCQlwdWJsaWMgdm9pZCBjYWxsKCkgeworCisgICAgICAgICAgICAgICAgTWV0YU1ldGhvZCBleGlzdGluZyA9IG51bGw7CisJCQkJdHJ5IHsKKwkJCQkJZXhpc3RpbmcgPSBwaWNrTWV0aG9kKG1ldGFNZXRob2RGcm9tU3VwZXIuZ2V0TmFtZSgpLCBtZXRhTWV0aG9kRnJvbVN1cGVyLmdldE5hdGl2ZVBhcmFtZXRlclR5cGVzKCkpO30KKwkJCQljYXRjaCAoIEdyb292eVJ1bnRpbWVFeGNlcHRpb24gZSkgeworCQkJCQkvLyBpZ25vcmUsIHRoaXMgaGFwcGVucyB3aXRoIG92ZXJsYXBwaW5nIG1ldGhvZCBkZWZpbml0aW9ucworCQkJCX0KKworCQkJCWlmKGV4aXN0aW5nID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZE1ldGhvZFdpdGhLZXkobWV0YU1ldGhvZEZyb21TdXBlcik7CisJCQkJfQorCQkJCWVsc2UgeworICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzR3Jvb3Z5TWV0aG9kID0gZ2V0TWV0YU1ldGhvZHMoKS5jb250YWlucyhleGlzdGluZyk7CisKKworICAgICAgICAgICAgICAgICAgICBpZihpc0dyb292eU1ldGhvZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWRkTWV0aG9kV2l0aEtleShtZXRhTWV0aG9kRnJvbVN1cGVyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKGluaGVyaXRlZE1ldGFNZXRob2RzLmNvbnRhaW5zKGV4aXN0aW5nKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5oZXJpdGVkTWV0YU1ldGhvZHMucmVtb3ZlKGV4aXN0aW5nKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgYWRkTWV0aG9kV2l0aEtleShtZXRhTWV0aG9kRnJvbVN1cGVyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworCQkJfQorCisJCQlwcml2YXRlIHZvaWQgYWRkTWV0aG9kV2l0aEtleShmaW5hbCBNZXRhTWV0aG9kIG1ldGFNZXRob2RGcm9tU3VwZXIpIHsKKyAgICAgICAgICAgICAgICBpbmhlcml0ZWRNZXRhTWV0aG9kcy5hZGQobWV0YU1ldGhvZEZyb21TdXBlcik7CisgICAgICAgICAgICAgICAgaWYobWV0YU1ldGhvZEZyb21TdXBlciBpbnN0YW5jZW9mIENsb3N1cmVNZXRhTWV0aG9kKSB7CisgICAgICAgICAgICAgICAgICAgIENsb3N1cmVNZXRhTWV0aG9kIGNsb3N1cmVNZXRob2QgPSAoQ2xvc3VyZU1ldGFNZXRob2QpbWV0YU1ldGhvZEZyb21TdXBlcjsKKyAgICAgICAgICAgICAgICAgICAgQ2xvc3VyZSBjbG9uZWQgPSAoQ2xvc3VyZSljbG9zdXJlTWV0aG9kLmdldENsb3N1cmUoKS5jbG9uZSgpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IG1ldGFNZXRob2RGcm9tU3VwZXIuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgICAgICBDbG9zdXJlTWV0YU1ldGhvZCBsb2NhbE1ldGhvZCA9IG5ldyBDbG9zdXJlTWV0YU1ldGhvZChuYW1lLCBnZXRKYXZhQ2xhc3MoKSwgY2xvbmVkKTsKKyAgICAgICAgICAgICAgICAgICAgYWRkTWV0YU1ldGhvZChsb2NhbE1ldGhvZCk7CisgICAgICAgICAgICAgICAgICAgIE1ldGhvZEtleSBrZXkgPSBuZXcgRGVmYXVsdENhY2hlZE1ldGhvZEtleShnZXRKYXZhQ2xhc3MoKSxuYW1lLCBsb2NhbE1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpLGZhbHNlICk7CisgICAgICAgICAgICAgICAgICAgIGNhY2hlSW5zdGFuY2VNZXRob2Qoa2V5LCBsb2NhbE1ldGhvZCk7CisKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tJZkdyb292eU9iamVjdE1ldGhvZChsb2NhbE1ldGhvZCwgbmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGV4cGFuZG9NZXRob2RzLnB1dChrZXksbG9jYWxNZXRob2QpOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCQl9KTsKKwl9CisKKworCisJLyoqCisJICogSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgYXJlIHJldHVybmVkIHdoZW4gdXNpbmcgdGhlIDw8IGxlZnQgc2hpZnQgb3BlcmF0b3IuCisJICoKKwkgKiBFeGFtcGxlOgorCSAqCisJICogbWV0YUNsYXNzLm15TWV0aG9kIDw8IHsgU3RyaW5nIGFyZ3MgLT4gfQorCSAqCisJICogVGhpcyBhbGxvd3MgY2FsbGJhY2tzIHRvIHRoZSBFeHBhbmRvTWV0YUNsYXNzIGZvciByZWdpc3RlcmluZyBhcHBlbmRpbmcgbWV0aG9kcworCSAqCisJICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCisJICoKKwkgKi8KKwlwcm90ZWN0ZWQgY2xhc3MgRXhwYW5kb01ldGFQcm9wZXJ0eSBleHRlbmRzIEdyb292eU9iamVjdFN1cHBvcnQgeworCisJCXByb3RlY3RlZCBTdHJpbmcgcHJvcGVydHlOYW1lOworCQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1N0YXRpYzsKKworCisgICAgICAgIHByb3RlY3RlZCBFeHBhbmRvTWV0YVByb3BlcnR5KFN0cmluZyBuYW1lKSB7CisJCQl0aGlzKG5hbWUsIGZhbHNlKTsKKwkJfQorCQlwcm90ZWN0ZWQgRXhwYW5kb01ldGFQcm9wZXJ0eShTdHJpbmcgbmFtZSwgYm9vbGVhbiBpc1N0YXRpYykgeworCQkJdGhpcy5wcm9wZXJ0eU5hbWUgPSBuYW1lOworCQkJdGhpcy5pc1N0YXRpYyA9IGlzU3RhdGljOworCQl9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoKSB7IHJldHVybiB0aGlzLnByb3BlcnR5TmFtZTsgfQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YXRpYygpIHsgcmV0dXJuIHRoaXMuaXNTdGF0aWM7IH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IGxlZnRTaGlmdChPYmplY3QgYXJnKSB7CisJCQlyZWdpc3RlcklmQ2xvc3VyZShhcmcsIGZhbHNlKTsKKwkJCXJldHVybiB0aGlzOworCQl9CisJCXByaXZhdGUgdm9pZCByZWdpc3RlcklmQ2xvc3VyZShPYmplY3QgYXJnLCBib29sZWFuIHJlcGxhY2UpIHsKKwkJCWlmKGFyZyBpbnN0YW5jZW9mIENsb3N1cmUpIHsKKwkJCQlDbG9zdXJlIGNhbGxhYmxlID0gKENsb3N1cmUpYXJnOworCQkJCUNsYXNzW10gcGFyYW1UeXBlcyA9IGNhbGxhYmxlLmdldFBhcmFtZXRlclR5cGVzKCk7CisJCQkJaWYocGFyYW1UeXBlcyA9PSBudWxsKXBhcmFtVHlwZXMgPSBaRVJPX0FSR1VNRU5UUzsKKwkJCQlpZighdGhpcy5pc1N0YXRpYykgeworCQkJCQlNZXRob2QgZm91bmRNZXRob2QgPSBjaGVja0lmTWV0aG9kRXhpc3RzKHRoZUNsYXNzLCBwcm9wZXJ0eU5hbWUsIHBhcmFtVHlwZXMsIGZhbHNlKTsKKworCQkJCQlpZihmb3VuZE1ldGhvZCAhPSBudWxsICYmICFyZXBsYWNlKSB0aHJvdyBuZXcgR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbigiQ2Fubm90IGFkZCBuZXcgbWV0aG9kIFsiK3Byb3BlcnR5TmFtZSsiXSBmb3IgYXJndW1lbnRzIFsiK0RlZmF1bHRHcm9vdnlNZXRob2RzLmluc3BlY3QocGFyYW1UeXBlcykrIl0uIEl0IGFscmVhZHkgZXhpc3RzISIpOworCisJCQkJCXJlZ2lzdGVySW5zdGFuY2VNZXRob2QocHJvcGVydHlOYW1lLCBjYWxsYWJsZSk7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlNZXRob2QgZm91bmRNZXRob2QgPSBjaGVja0lmTWV0aG9kRXhpc3RzKHRoZUNsYXNzLCBwcm9wZXJ0eU5hbWUsIHBhcmFtVHlwZXMsIHRydWUpOworCQkJCQlpZihmb3VuZE1ldGhvZCAhPSBudWxsICYmICFyZXBsYWNlKSB0aHJvdyBuZXcgR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbigiQ2Fubm90IGFkZCBuZXcgc3RhdGljIG1ldGhvZCBbIitwcm9wZXJ0eU5hbWUrIl0gZm9yIGFyZ3VtZW50cyBbIitEZWZhdWx0R3Jvb3Z5TWV0aG9kcy5pbnNwZWN0KHBhcmFtVHlwZXMpKyJdLiBJdCBhbHJlYWR5IGV4aXN0cyEiKTsKKworCQkJCQlyZWdpc3RlclN0YXRpY01ldGhvZChwcm9wZXJ0eU5hbWUsIGNhbGxhYmxlKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcHJpdmF0ZSBNZXRob2QgY2hlY2tJZk1ldGhvZEV4aXN0cyhDbGFzcyBtZXRob2RDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzW10gcGFyYW1UeXBlcywgYm9vbGVhbiBzdGF0aWNNZXRob2QpIHsKKwkJCU1ldGhvZCBmb3VuZE1ldGhvZCA9IG51bGw7CisJCQlNZXRob2RbXSBtZXRob2RzID0gbWV0aG9kQ2xhc3MuZ2V0TWV0aG9kcygpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7CisJCQkJaWYobWV0aG9kc1tpXS5nZXROYW1lKCkuZXF1YWxzKG1ldGhvZE5hbWUpICYmIE1vZGlmaWVyLmlzU3RhdGljKG1ldGhvZHNbaV0uZ2V0TW9kaWZpZXJzKCkpID09IHN0YXRpY01ldGhvZCkgeworCQkJCQlpZihNZXRhQ2xhc3NIZWxwZXIucGFyYW1ldGVyc0FyZUNvbXBhdGlibGUoIHBhcmFtVHlwZXMsIG1ldGhvZHNbaV0uZ2V0UGFyYW1ldGVyVHlwZXMoKSApKSB7CisJCQkJCQlmb3VuZE1ldGhvZCA9IG1ldGhvZHNbaV07CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCXJldHVybiBmb3VuZE1ldGhvZDsKKwkJfQorCQkvKiAobm9uLUphdmFkb2MpCisJCSAqIEBzZWUgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0U3VwcG9ydCNnZXRQcm9wZXJ0eShqYXZhLmxhbmcuU3RyaW5nKQorCQkgKi8KKwkJcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHkpIHsKKwkJCXRoaXMucHJvcGVydHlOYW1lID0gcHJvcGVydHk7CisJCQlyZXR1cm4gdGhpczsKKwkJfQorCQkvKiAobm9uLUphdmFkb2MpCisJCSAqIEBzZWUgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0U3VwcG9ydCNzZXRQcm9wZXJ0eShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KQorCQkgKi8KKwkJcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJCXRoaXMucHJvcGVydHlOYW1lID0gcHJvcGVydHk7CisJCQlyZWdpc3RlcklmQ2xvc3VyZShuZXdWYWx1ZSwgdHJ1ZSk7CisJCX0KKworCisJfQorCisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBncm9vdnkubGFuZy5NZXRhQ2xhc3NJbXBsI2ludm9rZUNvbnN0cnVjdG9yKGphdmEubGFuZy5PYmplY3RbXSkKKwkgKi8KKwlwdWJsaWMgT2JqZWN0IGludm9rZUNvbnN0cnVjdG9yKE9iamVjdFtdIGFyZ3VtZW50cykgeworCisJCS8vIFRPRE8gVGhpcyBpcyB0aGUgb25seSBhcmVhIHdoZXJlIHRoaXMgTWV0YUNsYXNzIG5lZWRzIHRvIGRvIHNvbWUgaW50ZXJjZXB0aW9uIGJlY2F1c2UgR3Jvb3Z5J3MgY3VycmVudAorCQkvLyBNZXRhQ2xhc3MgdXNlcyBoYXJkIGNvZGVkIHJlZmVyZW5jZXMgdG8gdGhlIGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yIGNsYXNzIHNvIHlvdSBjYW4ndCBzaW1wbHkKKwkJLy8gaW5qZWN0IENvbnN0cnVjdG9yIGxpa2UgeW91IGNhbiBkbyBwcm9wZXJ0aWVzLCBtZXRob2RzIGFuZCBmaWVsZHMuIFdoZW4gR3Jvb3Z5J3MgTWV0YUNsYXNzSW1wbCBpcworCQkvLyByZWZhY3RvcmVkIHdlIGNhbiBmaXggdGhpcworCQlDbGFzc1tdIGFyZ0NsYXNzZXMgPSBNZXRhQ2xhc3NIZWxwZXIuY29udmVydFRvVHlwZUFycmF5KGFyZ3VtZW50cyk7CisJCU1ldGFNZXRob2QgbWV0aG9kID0gcGlja01ldGhvZChHUk9PVllfQ09OU1RSVUNUT1IsIGFyZ0NsYXNzZXMpOworCQlpZihtZXRob2QhPW51bGwgJiYgbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoID09IGFyZ3VtZW50cy5sZW5ndGgpIHsKKwkJCXJldHVybiBtZXRob2QuaW52b2tlKHRoZUNsYXNzLCBhcmd1bWVudHMpOworCQl9CisJCXJldHVybiBzdXBlci5pbnZva2VDb25zdHJ1Y3Rvcihhcmd1bWVudHMpOworCX0KKworCisJLyoqCisJICogUmV0cmlldmVzIGEgbGlzdCBvZiBzdXBlciBjbGFzc2VzLiBUYWtlbiBmcm9tIE1ldGFDbGFzc0ltcGwuIElkZWFsbHkgdGhpcyBtZXRob2Qgc2hvdWxkIGJlIHByb3RlY3RlZAorCSAqCisJICogQHJldHVybiBBIGxpc3Qgb2Ygc3VwZXIgY2xhc3NlcworCSAqLworICAgcHJvdGVjdGVkIExpbmtlZExpc3QgZ2V0U3VwZXJDbGFzc2VzKCkgeworICAgICAgIExpbmtlZExpc3Qgc3VwZXJDbGFzc2VzID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICAgICBmb3IgKENsYXNzIGMgPSB0aGVDbGFzczsgYyE9IG51bGw7IGMgPSBjLmdldFN1cGVyY2xhc3MoKSkgeworICAgICAgICAgICBzdXBlckNsYXNzZXMuYWRkRmlyc3QoYyk7CisgICAgICAgfQorICAgICAgIGlmIChnZXRKYXZhQ2xhc3MoKS5pc0FycmF5KCkgJiYgZ2V0SmF2YUNsYXNzKCkhPU9iamVjdFtdLmNsYXNzICYmICFnZXRKYXZhQ2xhc3MoKS5nZXRDb21wb25lbnRUeXBlKCkuaXNQcmltaXRpdmUoKSkgeworICAgICAgICAgICBzdXBlckNsYXNzZXMuYWRkRmlyc3QoT2JqZWN0W10uY2xhc3MpOworICAgICAgIH0KKyAgICAgICByZXR1cm4gc3VwZXJDbGFzc2VzOworICAgfQorCS8qKgorCSAqIEhhbmRsZXMgdGhlIGFiaWxpdHkgdG8gdXNlIHRoZSBsZWZ0IHNoaWZ0IG9wZXJhdG9yIHRvIGFwcGVuZCBuZXcgY29uc3RydWN0b3JzCisJICoKKwkgKiBAYXV0aG9yIEdyYWVtZSBSb2NoZXIKKwkgKgorCSAqLworCXByb3RlY3RlZCBjbGFzcyBFeHBhbmRvTWV0YUNvbnN0cnVjdG9yIGV4dGVuZHMgR3Jvb3Z5T2JqZWN0U3VwcG9ydCB7CisJCXB1YmxpYyBPYmplY3QgbGVmdFNoaWZ0KENsb3N1cmUgYykgeworCQkJaWYoYyAhPSBudWxsKSB7CisJCQkJQ2xhc3NbXSBwYXJhbVR5cGVzID0gYy5nZXRQYXJhbWV0ZXJUeXBlcygpOworCQkJCWlmKHBhcmFtVHlwZXMgPT0gbnVsbClwYXJhbVR5cGVzID0gWkVST19BUkdVTUVOVFM7CisKKwkJCQlDb25zdHJ1Y3RvciBjdG9yID0gcmV0cmlldmVDb25zdHJ1Y3RvcihwYXJhbVR5cGVzKTsKKwkJCQlpZihjdG9yICE9IG51bGwpIHRocm93IG5ldyBHcm9vdnlSdW50aW1lRXhjZXB0aW9uKCJDYW5ub3QgYWRkIG5ldyBjb25zdHJ1Y3RvciBmb3IgYXJndW1lbnRzIFsiK0RlZmF1bHRHcm9vdnlNZXRob2RzLmluc3BlY3QocGFyYW1UeXBlcykrIl0uIEl0IGFscmVhZHkgZXhpc3RzISIpOworCisJCQkJcmVnaXN0ZXJJbnN0YW5jZU1ldGhvZChHUk9PVllfQ09OU1RSVUNUT1IsIGMpOworCQkJfQorCisJCQlyZXR1cm4gdGhpczsKKwkJfQorCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGdyb292eS5sYW5nLkdyb292eU9iamVjdCNnZXRNZXRhQ2xhc3MoKQorCSAqLworCXB1YmxpYyBNZXRhQ2xhc3MgZ2V0TWV0YUNsYXNzKCkgeworCQlyZXR1cm4gbXlNZXRhQ2xhc3M7CisJfQorCisKKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGdyb292eS5sYW5nLkdyb292eU9iamVjdCNnZXRQcm9wZXJ0eShqYXZhLmxhbmcuU3RyaW5nKQorCSAqLworCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5KSB7CisJCWlmKGlzVmFsaWRFeHBhbmRvUHJvcGVydHkocHJvcGVydHkpKSB7CisJCQlpZihwcm9wZXJ0eS5lcXVhbHMoU1RBVElDX1FVQUxJRklFUikpIHsKKwkJCQlyZXR1cm4gbmV3IEV4cGFuZG9NZXRhUHJvcGVydHkocHJvcGVydHksIHRydWUpOworCQkJfQorCQkJZWxzZSBpZihwcm9wZXJ0eS5lcXVhbHMoQ09OU1RSVUNUT1IpKSB7CisJCQkJcmV0dXJuIG5ldyBFeHBhbmRvTWV0YUNvbnN0cnVjdG9yKCk7CisJCQl9CisJCQllbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAobXlNZXRhQ2xhc3MuaGFzUHJvcGVydHkodGhpcywgcHJvcGVydHkpID09IG51bGwpCisgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4cGFuZG9NZXRhUHJvcGVydHkocHJvcGVydHkpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIHJldHVybiBteU1ldGFDbGFzcy5nZXRQcm9wZXJ0eSh0aGlzLCBwcm9wZXJ0eSk7CisgICAgICAgICAgICB9CisJCX0KKwkJZWxzZSB7CisJCQlyZXR1cm4gbXlNZXRhQ2xhc3MuZ2V0UHJvcGVydHkodGhpcywgcHJvcGVydHkpOworCQl9CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRFeHBhbmRvUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5KSB7CisgICAgICAgIHJldHVybiAhcHJvcGVydHkuZXF1YWxzKE1FVEFfQ0xBU1MpICYmCisgICAgICAgICAgICAgICAgIXByb3BlcnR5LmVxdWFscyhDTEFTUykgJiYKKyAgICAgICAgICAgICAgICAhcHJvcGVydHkuZXF1YWxzKE1FVEFfTUVUSE9EUykgJiYKKyAgICAgICAgICAgICAgICAhcHJvcGVydHkuZXF1YWxzKE1FVEhPRFMpICYmCisgICAgICAgICAgICAgICAgIXByb3BlcnR5LmVxdWFscyhQUk9QRVJUSUVTKTsKKyAgICB9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBncm9vdnkubGFuZy5Hcm9vdnlPYmplY3QjaW52b2tlTWV0aG9kKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpCisJICovCisJcHVibGljIE9iamVjdCBpbnZva2VNZXRob2QoU3RyaW5nIG5hbWUsIE9iamVjdCBhcmdzKSB7CisJCXJldHVybiBteU1ldGFDbGFzcy5pbnZva2VNZXRob2QodGhpcywgbmFtZSwgYXJncyk7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0I3NldE1ldGFDbGFzcyhncm9vdnkubGFuZy5NZXRhQ2xhc3MpCisJICovCisJcHVibGljIHZvaWQgc2V0TWV0YUNsYXNzKE1ldGFDbGFzcyBtZXRhQ2xhc3MpIHsKKwkJdGhpcy5teU1ldGFDbGFzcyA9IG1ldGFDbGFzczsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBncm9vdnkubGFuZy5Hcm9vdnlPYmplY3Qjc2V0UHJvcGVydHkoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHksIE9iamVjdCBuZXdWYWx1ZSkgeworCQlpZihuZXdWYWx1ZSBpbnN0YW5jZW9mIENsb3N1cmUpIHsKKwkJCWlmKHByb3BlcnR5LmVxdWFscyhDT05TVFJVQ1RPUikpIHsKKwkJCQlwcm9wZXJ0eSA9IEdST09WWV9DT05TVFJVQ1RPUjsKKwkJCX0KKwkJCUNsb3N1cmUgY2FsbGFibGUgPSAoQ2xvc3VyZSluZXdWYWx1ZTsKKwkJCS8vIGhlcmUgd2UgZG9uJ3QgY2FyZSBpZiB0aGUgbWV0aG9kIGV4aXN0cyBvciBub3Qgd2UgYXNzdW1lIHRoZQorCQkJLy8gZGV2ZWxvcGVyIGlzIHJlc3BvbnNpYmxlIGFuZCB3YW50cyB0byBvdmVycmlkZSBtZXRob2RzIHdoZXJlIG5lY2Vzc2FyeQorCQkJcmVnaXN0ZXJJbnN0YW5jZU1ldGhvZChwcm9wZXJ0eSwgY2FsbGFibGUpOworCisJCX0KKwkJZWxzZSB7CisJCQlyZWdpc3RlckJlYW5Qcm9wZXJ0eShwcm9wZXJ0eSwgbmV3VmFsdWUpOworCQl9CisJfQorCisKKyAgICAKKyAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgcGVyZm9ybU9wZXJhdGlvbk9uTWV0YUNsYXNzKENhbGxhYmxlIGMpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYoYWxsb3dDaGFuZ2VzQWZ0ZXJJbml0KSB7CisgICAgICAgICAgICAgICAgICAgIHNldEluaXRpYWxpemVkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjLmNhbGwoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlmKGluaXRDYWxsZWQpeworICAgICAgICAgICAgICAgICAgICBzZXRJbml0aWFsaXplZCh0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisJfQorCisJLyoqCisJICogUmVnaXN0ZXJzIGEgbmV3IGJlYW4gcHJvcGVydHkKKwkgKgorCSAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgbmFtZQorCSAqIEBwYXJhbSBuZXdWYWx1ZSBUaGUgcHJvcGVydGllcyBpbml0aWFsIHZhbHVlCisJICovCisJcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJCZWFuUHJvcGVydHkoZmluYWwgU3RyaW5nIHByb3BlcnR5LCBmaW5hbCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJCXBlcmZvcm1PcGVyYXRpb25Pbk1ldGFDbGFzcyhuZXcgQ2FsbGFibGUoKSB7CisJCQkJcHVibGljIHZvaWQgY2FsbCgpIHsKKwkJCQkJQ2xhc3MgdHlwZSA9IG5ld1ZhbHVlID09IG51bGwgPyBPYmplY3QuY2xhc3MgOiBuZXdWYWx1ZS5nZXRDbGFzcygpOworCisJCQkJCU1ldGFCZWFuUHJvcGVydHkgbWJwID0gbmV3VmFsdWUgaW5zdGFuY2VvZiBNZXRhQmVhblByb3BlcnR5ID8gKE1ldGFCZWFuUHJvcGVydHkpbmV3VmFsdWUgOiBuZXcgVGhyZWFkTWFuYWdlZE1ldGFCZWFuUHJvcGVydHkodGhlQ2xhc3MscHJvcGVydHksdHlwZSxuZXdWYWx1ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgTWV0YU1ldGhvZCBnZXR0ZXIgPSBtYnAuZ2V0R2V0dGVyKCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1ldGhvZEtleSBnZXR0ZXJLZXkgPSBuZXcgRGVmYXVsdENhY2hlZE1ldGhvZEtleSh0aGVDbGFzcyxnZXR0ZXIuZ2V0TmFtZSgpLCBDYWNoZWRDbGFzcy5FTVBUWV9BUlJBWSxmYWxzZSApOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZXRhTWV0aG9kIHNldHRlciA9IG1icC5nZXRTZXR0ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgTWV0aG9kS2V5IHNldHRlcktleSA9IG5ldyBEZWZhdWx0Q2FjaGVkTWV0aG9kS2V5KHRoZUNsYXNzLHNldHRlci5nZXROYW1lKCksIHNldHRlci5nZXRQYXJhbWV0ZXJUeXBlcygpLGZhbHNlICk7CisgICAgICAgICAgICAgICAgICAgIGFkZE1ldGFNZXRob2QoZ2V0dGVyKTsKKyAgICAgICAgICAgICAgICAgICAgYWRkTWV0YU1ldGhvZChzZXR0ZXIpOworCisgICAgICAgICAgICAgICAgICAgIGV4cGFuZG9NZXRob2RzLnB1dChzZXR0ZXJLZXksc2V0dGVyKTsKKyAgICAgICAgICAgICAgICAgICAgZXhwYW5kb01ldGhvZHMucHV0KGdldHRlcktleSxnZXR0ZXIpOworICAgICAgICAgICAgICAgICAgICBleHBhbmRvUHJvcGVydGllcy5wdXQobWJwLmdldE5hbWUoKSxtYnApOworCisJCQkJCWFkZE1ldGFCZWFuUHJvcGVydHkobWJwKTsKKyAgICAgICAgICAgICAgICAgICAgcGVyZm9ybVJlZ2lzdHJ5Q2FsbGJhY2tzKCk7CisgICAgICAgICAgICAgICAgfQorCisJCQl9KTsKKwl9CisKKwkvKioKKwkgKiBSZWdpc3RlcnMgYSBuZXcgaW5zdGFuY2UgbWV0aG9kIGZvciB0aGUgZ2l2ZW4gbWV0aG9kIG5hbWUgYW5kIGNsb3N1cmUgb24gdGhpcyBNZXRhQ2xhc3MKKwkgKgorCSAqIEBwYXJhbSBtZXRob2ROYW1lIFRoZSBtZXRob2QgbmFtZQorCSAqIEBwYXJhbSBjYWxsYWJsZSBUaGUgY2FsbGFibGUgQ2xvc3VyZQorCSAqLworCXByb3RlY3RlZCB2b2lkIHJlZ2lzdGVySW5zdGFuY2VNZXRob2QoZmluYWwgU3RyaW5nIG1ldGhvZE5hbWUsIGZpbmFsIENsb3N1cmUgY2FsbGFibGUpIHsKKwkJCWZpbmFsIGJvb2xlYW4gaW5pdGVkID0gdGhpcy5pbml0Q2FsbGVkOworCQkJcGVyZm9ybU9wZXJhdGlvbk9uTWV0YUNsYXNzKG5ldyBDYWxsYWJsZSgpIHsKKwkJCQlwdWJsaWMgdm9pZCBjYWxsKCkgeworCQkJCQlDbG9zdXJlTWV0YU1ldGhvZCBtZXRhTWV0aG9kID0gbmV3IENsb3N1cmVNZXRhTWV0aG9kKG1ldGhvZE5hbWUsIHRoZUNsYXNzLGNhbGxhYmxlKTsKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tJZkdyb292eU9iamVjdE1ldGhvZChtZXRhTWV0aG9kLCBtZXRob2ROYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgTWV0aG9kS2V5IGtleSA9IG5ldyBEZWZhdWx0Q2FjaGVkTWV0aG9kS2V5KHRoZUNsYXNzLG1ldGhvZE5hbWUsIG1ldGFNZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKSxmYWxzZSApOworCisKKwkJCQkJYWRkTWV0YU1ldGhvZChtZXRhTWV0aG9kKTsKKyAgICAgICAgICAgICAgICAgICAgZHJvcE1ldGhvZENhY2hlKG1ldGhvZE5hbWUpOworICAgICAgICAgICAgICAgICAgICBleHBhbmRvTWV0aG9kcy5wdXQoa2V5LG1ldGFNZXRob2QpOworCisJCQkJCWlmKGluaXRlZCAmJiBpc0dldHRlcihtZXRob2ROYW1lLCBtZXRhTWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCkpKSB7CisJCQkJCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gZ2V0UHJvcGVydHlGb3JHZXR0ZXIobWV0aG9kTmFtZSk7CisJCQkJCQlyZWdpc3RlckJlYW5Qcm9wZXJ0eUZvck1ldGhvZChtZXRhTWV0aG9kLCBwcm9wZXJ0eU5hbWUsIHRydWUsIGZhbHNlKTsKKworCQkJCQl9CisJCQkJCWVsc2UgaWYoaW5pdGVkICYmIGlzU2V0dGVyKG1ldGhvZE5hbWUsIG1ldGFNZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKSkpIHsKKwkJCQkJCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSBnZXRQcm9wZXJ0eUZvclNldHRlcihtZXRob2ROYW1lKTsKKwkJCQkJCXJlZ2lzdGVyQmVhblByb3BlcnR5Rm9yTWV0aG9kKG1ldGFNZXRob2QsIHByb3BlcnR5TmFtZSwgZmFsc2UsIGZhbHNlKTsKKwkJCQkJfQorCQkJCQlwZXJmb3JtUmVnaXN0cnlDYWxsYmFja3MoKTsKKwkJCQl9CisKKwkJCX0pOworCX0KKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlcyB0aGUgYmVoYXZpb3VyIG9mIHBhcmVudCBnZXRNZXRob2RzKCkgbWV0aG9kIHRvIG1ha2UgTWV0YUNsYXNzIGF3YXJlIG9mIGFkZGVkIEV4cGFuZG8gbWV0aG9kcworICAgICAqCisgICAgICogQHNlZSBNZXRhT2JqZWN0UHJvdG9jb2wjZ2V0TWV0aG9kcygpCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEEgbGlzdCBvZiBNZXRhTWV0aG9kcworICAgICAqLworICAgIHB1YmxpYyBMaXN0IGdldE1ldGhvZHMoKSB7CisgICAgICAgIExpc3QgbWV0aG9kTGlzdCA9ICBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIG1ldGhvZExpc3QuYWRkQWxsKHRoaXMuZXhwYW5kb01ldGhvZHMudmFsdWVzKCkpOworICAgICAgICBtZXRob2RMaXN0LmFkZEFsbChzdXBlci5nZXRNZXRob2RzKCkpOworICAgICAgICByZXR1cm4gbWV0aG9kTGlzdDsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0aWVzKCkgeworICAgICAgICBMaXN0IHByb3BlcnR5TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgcHJvcGVydHlMaXN0LmFkZEFsbChleHBhbmRvUHJvcGVydGllcy52YWx1ZXMoKSk7CisgICAgICAgIHByb3BlcnR5TGlzdC5hZGRBbGwoc3VwZXIuZ2V0UHJvcGVydGllcygpKTsKKyAgICAgICAgcmV0dXJuIHByb3BlcnR5TGlzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgdGhlIG1ldGFNZXRob2QgaXMgYSBtZXRob2QgZnJvbSB0aGUgR3Jvb3Z5T2JqZWN0IGludGVyZmFjZSBzdWNoIGFzIHNldFByb3BlcnR5LCBnZXRQcm9wZXJ0eSBhbmQgaW52b2tlTWV0aG9kCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWV0YU1ldGhvZCBUaGUgbWV0YU1ldGhvZCBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBtZXRob2ROYW1lIFRoZSBtZXRob2QgbmFtZQorICAgICAqCisgICAgICogQHNlZSBncm9vdnkubGFuZy5Hcm9vdnlPYmplY3QKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY2hlY2tJZkdyb292eU9iamVjdE1ldGhvZChDbG9zdXJlTWV0YU1ldGhvZCBtZXRhTWV0aG9kLCBTdHJpbmcgbWV0aG9kTmFtZSkgeworICAgICAgICBpZihpc0dldFByb3BlcnR5TWV0aG9kKG1ldGhvZE5hbWUpKSB7CisgICAgICAgICAgICBnZXRQcm9wZXJ0eU1ldGhvZCA9IG1ldGFNZXRob2Q7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZihpc0ludm9rZU1ldGhvZChtZXRob2ROYW1lLCBtZXRhTWV0aG9kKSkgeworICAgICAgICAgICAgaW52b2tlTWV0aG9kTWV0aG9kID0gbWV0YU1ldGhvZDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKGlzU2V0UHJvcGVydHlNZXRob2QobWV0aG9kTmFtZSwgbWV0YU1ldGhvZCkpIHsKKyAgICAgICAgICAgIHNldFByb3BlcnR5TWV0aG9kID0gbWV0YU1ldGhvZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc1NldFByb3BlcnR5TWV0aG9kKFN0cmluZyBtZXRob2ROYW1lLCBDbG9zdXJlTWV0YU1ldGhvZCBtZXRhTWV0aG9kKSB7CisgICAgICAgIHJldHVybiBTRVRfUFJPUEVSVFlfTUVUSE9ELmVxdWFscyhtZXRob2ROYW1lKSAgJiYgbWV0YU1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aCA9PSAyOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc0dldFByb3BlcnR5TWV0aG9kKFN0cmluZyBtZXRob2ROYW1lKSB7CisgICAgICAgIHJldHVybiBHRVRfUFJPUEVSVFlfTUVUSE9ELmVxdWFscyhtZXRob2ROYW1lKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNJbnZva2VNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUsIENsb3N1cmVNZXRhTWV0aG9kIG1ldGFNZXRob2QpIHsKKyAgICAgICAgcmV0dXJuIElOVk9LRV9NRVRIT0RfTUVUSE9ELmVxdWFscyhtZXRob2ROYW1lKSAmJiBtZXRhTWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoID09IDI7CisgICAgfQorCisKKyAgICBwcml2YXRlIHZvaWQgcGVyZm9ybVJlZ2lzdHJ5Q2FsbGJhY2tzKCkgeworCQlNZXRhQ2xhc3NSZWdpc3RyeSByZWdpc3RyeSA9ICBHcm9vdnlTeXN0ZW0uZ2V0TWV0YUNsYXNzUmVnaXN0cnkoKTsKKwkJaWYoIW1vZGlmaWVkKSB7CisJCQltb2RpZmllZCA9IHRydWU7CisgICAgICAgICAgICAvLyBJbXBsZW1lbnRhdGlvbiBub3RlOiBCeSBkZWZhdWx0IEdyb292eSB1c2VzIHNvZnQgcmVmZXJlbmNlcyB0byBzdG9yZSBNZXRhQ2xhc3MKKyAgICAgICAgICAgIC8vIHRoaXMgaW5zdXJlcyB0aGUgcmVnaXN0cnkgZG9lc24ndCBncm93IGFuZCBnZXQgb3V0IG9mIGhhbmQuIEJ5IGRvaW5nIHRoaXMgd2UncmUKKyAgICAgICAgICAgIC8vIHNheWluZyB0aGlzIHRoaXMgRU1DIHdpbGwgYmUgYSBoYXJkIHJlZmVyZW5jZSBpbiB0aGUgcmVnaXN0cnkuIEFzIHdlJ3JlIG9ubHkKKyAgICAgICAgICAgIC8vIGdvaW5nIGhhdmUgYSBzbWFsbCBudW1iZXIgb2YgY2xhc3NlcyB0aGF0IGhhdmUgbW9kaWZpZWQgRU1DIHRoaXMgaXMgb2sKKyAgICAgICAgICAgIGlmKGluUmVnaXN0cnkpIHsKKyAgICAgICAgICAgICAgICBNZXRhQ2xhc3MgY3Vyck1ldGFDbGFzcyA9IHJlZ2lzdHJ5LmdldE1ldGFDbGFzcyh0aGVDbGFzcyk7CisgICAgICAgICAgICAgICAgaWYoIShjdXJyTWV0YUNsYXNzIGluc3RhbmNlb2YgRXhwYW5kb01ldGFDbGFzcykgJiYgY3Vyck1ldGFDbGFzcyBpbnN0YW5jZW9mIEFkYXB0aW5nTWV0YUNsYXNzKSB7CisgICAgICAgICAgICAgICAgICAgICgoQWRhcHRpbmdNZXRhQ2xhc3MpY3Vyck1ldGFDbGFzcykuc2V0QWRhcHRlZSh0aGlzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZWdpc3RyeS5zZXRNZXRhQ2xhc3ModGhlQ2xhc3MsIHRoaXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworCQl9CisJCS8vIEltcGxlbWVudGF0aW9uIG5vdGU6IEVNQyBoYW5kbGVzIG1vc3QgY2FzZXMgYnkgaXRzZWxmIGV4Y2VwdCBmb3IgdGhlIGNhc2Ugd2hlcmUgeXVvdQorCQkvLyB3YW50IHRvIGNhbGwgYSBkeW5hbWljYWxseSBpbmplY3RlZCBtZXRob2QgcmVnaXN0ZXJlZCB3aXRoIGEgcGFyZW50IG9uIGEgY2hpbGQgY2xhc3MKKwkJLy8gRm9yIHRoaXMgdG8gd29yayB0aGUgTWV0YUNsYXNzUmVnaXN0cnkgbmVlZHMgdG8gaGF2ZSBhbiBFeHBhbmRvTWV0YUNsYXNzQ3JlYXRpb25IYW5kbGUKKwkJLy8gV2hhdCB0aGlzIGRvZXMgaXMgZW5zdXJlIHRoYXQgRVZFUlkgY2xhc3MgY3JlYXRlZCBpbiB0aGUgcmVnaXN0cnkgdXNlcyBhbiBFTUMKKwkJLy8gVGhlbiB3aGVuIGFuIEVNQyBjaGFuZ2VzIGl0IHJlcG9ydHMgYmFjayB0byB0aGUgRU1DQ3JlYXRpb25IYW5kbGUgd2hpY2ggd2lsbAorCQkvLyB0ZWxsIGNoaWxkIGNsYXNzZXMgb2YgdGhpcyBjbGFzcyB0byByZS1pbmhlcml0IHRoZWlyIG1ldGhvZHMKKwkJaWYocmVnaXN0cnkuZ2V0TWV0YUNsYXNzQ3JlYXRpb25IYW5kbGVyKCkgaW5zdGFuY2VvZiBFeHBhbmRvTWV0YUNsYXNzQ3JlYXRpb25IYW5kbGUpIHsKKwkJCUV4cGFuZG9NZXRhQ2xhc3NDcmVhdGlvbkhhbmRsZSBjcmVhdGlvbkhhbmRsZXIgPSAoRXhwYW5kb01ldGFDbGFzc0NyZWF0aW9uSGFuZGxlKXJlZ2lzdHJ5LmdldE1ldGFDbGFzc0NyZWF0aW9uSGFuZGxlcigpOworCQkJaWYoIWNyZWF0aW9uSGFuZGxlci5oYXNNb2RpZmllZE1ldGFDbGFzcyh0aGlzKSkKKwkJCQljcmVhdGlvbkhhbmRsZXIucmVnaXN0ZXJNb2RpZmllZE1ldGFDbGFzcyh0aGlzKTsKKworICAgICAgICB9CisJfQorCisKKwlwcml2YXRlIHZvaWQgcmVnaXN0ZXJCZWFuUHJvcGVydHlGb3JNZXRob2QoTWV0YU1ldGhvZCBtZXRhTWV0aG9kLCBTdHJpbmcgcHJvcGVydHlOYW1lLCBib29sZWFuIGdldHRlciwgYm9vbGVhbiBpc1N0YXRpYykgeworICAgICAgICBNYXAgcHJvcGVydHlDYWNoZSA9IGlzU3RhdGljID8gc3RhdGljQmVhblByb3BlcnR5Q2FjaGUgOiBiZWFuUHJvcGVydHlDYWNoZTsKKyAgICAgICAgTWV0YUJlYW5Qcm9wZXJ0eSBiZWFuUHJvcGVydHkgPSAoTWV0YUJlYW5Qcm9wZXJ0eSlwcm9wZXJ0eUNhY2hlLmdldChwcm9wZXJ0eU5hbWUpOworICAgICAgICBpZihiZWFuUHJvcGVydHkgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYoZ2V0dGVyKQorICAgICAgICAgICAgICAgIGJlYW5Qcm9wZXJ0eSA9IG5ldyBNZXRhQmVhblByb3BlcnR5KHByb3BlcnR5TmFtZSxPYmplY3QuY2xhc3MsbWV0YU1ldGhvZCxudWxsKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBiZWFuUHJvcGVydHkgPSBuZXcgTWV0YUJlYW5Qcm9wZXJ0eShwcm9wZXJ0eU5hbWUsT2JqZWN0LmNsYXNzLG51bGwsbWV0YU1ldGhvZCk7CisKKyAgICAgICAgICAgIHByb3BlcnR5Q2FjaGUucHV0KHByb3BlcnR5TmFtZSwgYmVhblByb3BlcnR5KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmKGdldHRlcikgeworICAgICAgICAgICAgICAgIE1ldGFNZXRob2Qgc2V0dGVyTWV0aG9kID0gYmVhblByb3BlcnR5LmdldFNldHRlcigpOworICAgICAgICAgICAgICAgIENsYXNzIHR5cGUgPSBzZXR0ZXJNZXRob2QgIT0gbnVsbCA/IHNldHRlck1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpWzBdLmdldENhY2hlZENsYXNzKCkgOiBPYmplY3QuY2xhc3M7CisgICAgICAgICAgICAgICAgYmVhblByb3BlcnR5ID0gbmV3IE1ldGFCZWFuUHJvcGVydHkocHJvcGVydHlOYW1lLHR5cGUsbWV0YU1ldGhvZCxzZXR0ZXJNZXRob2QpOworICAgICAgICAgICAgICAgIHByb3BlcnR5Q2FjaGUucHV0KHByb3BlcnR5TmFtZSwgYmVhblByb3BlcnR5KTsKKyAgICAgICAgICAgIH1lbHNlIHsKKyAgICAgICAgICAgICAgICBNZXRhTWV0aG9kIGdldHRlck1ldGhvZCA9IGJlYW5Qcm9wZXJ0eS5nZXRHZXR0ZXIoKTsKKyAgICAgICAgICAgICAgICBiZWFuUHJvcGVydHkgPSBuZXcgTWV0YUJlYW5Qcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIG1ldGFNZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKVswXS5nZXRDYWNoZWRDbGFzcygpLGdldHRlck1ldGhvZCxtZXRhTWV0aG9kKTsKKyAgICAgICAgICAgICAgICBwcm9wZXJ0eUNhY2hlIC5wdXQocHJvcGVydHlOYW1lLCBiZWFuUHJvcGVydHkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICBleHBhbmRvUHJvcGVydGllcy5wdXQoYmVhblByb3BlcnR5LmdldE5hbWUoKSxiZWFuUHJvcGVydHkpOworICAgICAgICBhZGRNZXRhQmVhblByb3BlcnR5KGJlYW5Qcm9wZXJ0eSk7CisJfQorCisJLyoqCisJICogUmVnaXN0ZXJzIGEgbmV3IHN0YXRpYyBtZXRob2QgZm9yIHRoZSBnaXZlbiBtZXRob2QgbmFtZSBhbmQgY2xvc3VyZSBvbiB0aGlzIE1ldGFDbGFzcworCSAqCisJICogQHBhcmFtIG5hbWUgVGhlIG1ldGhvZCBuYW1lCisJICogQHBhcmFtIGNhbGxhYmxlIFRoZSBjYWxsYWJsZSBDbG9zdXJlCisJICovCisJcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJTdGF0aWNNZXRob2QoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIENsb3N1cmUgY2FsbGFibGUpIHsKKwkJcGVyZm9ybU9wZXJhdGlvbk9uTWV0YUNsYXNzKG5ldyBDYWxsYWJsZSgpIHsKKwkJCXB1YmxpYyB2b2lkIGNhbGwoKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWU7CisgICAgICAgICAgICAgICAgaWYobmFtZS5lcXVhbHMoTUVUSE9EX01JU1NJTkcpKQorICAgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gU1RBVElDX01FVEhPRF9NSVNTSU5HOworICAgICAgICAgICAgICAgIGVsc2UgaWYobmFtZS5lcXVhbHMoUFJPUEVSVFlfTUlTU0lORykpCisgICAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSBTVEFUSUNfUFJPUEVSVFlfTUlTU0lORzsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSBuYW1lOworCisgICAgICAgICAgICAgICAgQ2xvc3VyZVN0YXRpY01ldGFNZXRob2QgbWV0YU1ldGhvZCA9IG5ldyBDbG9zdXJlU3RhdGljTWV0YU1ldGhvZChtZXRob2ROYW1lLCB0aGVDbGFzcyxjYWxsYWJsZSk7CisgICAgICAgICAgICAgICAgaWYobWV0aG9kTmFtZS5lcXVhbHMoSU5WT0tFX01FVEhPRF9NRVRIT0QpICYmIGNhbGxhYmxlLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoID09IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgaW52b2tlU3RhdGljTWV0aG9kTWV0aG9kID0gbWV0YU1ldGhvZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmKG1ldGhvZE5hbWUuZXF1YWxzKE1FVEhPRF9NSVNTSU5HKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9IFNUQVRJQ19NRVRIT0RfTUlTU0lORzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBNZXRob2RLZXkga2V5ID0gbmV3IERlZmF1bHRDYWNoZWRNZXRob2RLZXkodGhlQ2xhc3MsbWV0aG9kTmFtZSwgbWV0YU1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpLCBmYWxzZSApOworCisgICAgICAgICAgICAgICAgICAgIGFkZE1ldGFNZXRob2QobWV0YU1ldGhvZCk7CisgICAgICAgICAgICAgICAgICAgIGRyb3BTdGF0aWNNZXRob2RDYWNoZSAobWV0aG9kTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGNhY2hlU3RhdGljTWV0aG9kKGtleSxtZXRhTWV0aG9kKTsKKworICAgICAgICAgICAgICAgICAgICBpZihpc0dldHRlcihtZXRob2ROYW1lLCBtZXRhTWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1lID0gZ2V0UHJvcGVydHlGb3JHZXR0ZXIobWV0aG9kTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlckJlYW5Qcm9wZXJ0eUZvck1ldGhvZChtZXRhTWV0aG9kLCBwcm9wZXJ0eU5hbWUsIHRydWUsIHRydWUpOworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihpc1NldHRlcihtZXRob2ROYW1lLCBtZXRhTWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1lID0gZ2V0UHJvcGVydHlGb3JTZXR0ZXIobWV0aG9kTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlckJlYW5Qcm9wZXJ0eUZvck1ldGhvZChtZXRhTWV0aG9kLCBwcm9wZXJ0eU5hbWUsIGZhbHNlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwZXJmb3JtUmVnaXN0cnlDYWxsYmFja3MoKTsKKyAgICAgICAgICAgICAgICAgICAgZXhwYW5kb01ldGhvZHMucHV0KGtleSxtZXRhTWV0aG9kKTsKKyAgICAgICAgICAgICAgICB9CisJCQl9CisKKwkJfSk7CisJfQorCisgICAgLyoqCisJICogQHJldHVybiBUaGUgSmF2YSBjbGFzcyBlbmhhbmNlZCBieSB0aGlzIE1ldGFDbGFzcworCSAqLworCXB1YmxpYyBDbGFzcyBnZXRKYXZhQ2xhc3MoKSB7CisJCXJldHVybiB0aGVDbGFzczsKKwl9CisKKwkvKioKKwkgKiBDYWxsZWQgZnJvbSBFeHBhbmRvTWV0YUNsYXNzQ3JlYXRpb25IYW5kbGUgaW4gdGhlIHJlZ2lzdHJ5IGlmIGl0IGV4aXN0cyB0byBzZXR1cCBpbmhlcml0YW5jZQorCSAqIGhhbmRsaW5nCisJICoKKwkgKiBAcGFyYW0gbW9kaWZpZWRTdXBlckV4cGFuZG9zIEEgbGlzdCBvZiBtb2RpZmllZCBzdXBlciBFeHBhbmRvTWV0YUNsYXNzCisJICovCisJcHVibGljIHZvaWQgcmVmcmVzaEluaGVyaXRlZE1ldGhvZHMoU2V0IG1vZGlmaWVkU3VwZXJFeHBhbmRvcykgeworCQlmb3IgKEl0ZXJhdG9yIGkgPSBtb2RpZmllZFN1cGVyRXhwYW5kb3MuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisKKwkJCUV4cGFuZG9NZXRhQ2xhc3Mgc3VwZXJFeHBhbmRvID0gKEV4cGFuZG9NZXRhQ2xhc3MpIGkubmV4dCgpOworICAgICAgICAgICAgaWYoc3VwZXJFeHBhbmRvICE9IHRoaXMpIHsKKyAgICAgICAgICAgICAgICBMaXN0IG1ldGFNZXRob2RzID0gc3VwZXJFeHBhbmRvLmdldEV4cGFuZG9NZXRob2RzKCk7CisgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBqID0gbWV0YU1ldGhvZHMuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgICAgIE1ldGFNZXRob2QgbWV0YU1ldGhvZCA9IChNZXRhTWV0aG9kKSBqLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYobWV0YU1ldGhvZC5pc1N0YXRpYygpKSBjb250aW51ZTsgLy8gZG9uJ3QgaW5oZXJpdCBzdGF0aWMgbWV0aG9kc3cKKworICAgICAgICAgICAgICAgICAgICBhZGRTdXBlck1ldGhvZElmTm90T3ZlcnJpZGVuKG1ldGFNZXRob2QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb2xsZWN0aW9uIG1ldGFQcm9wZXJ0aWVzID0gc3VwZXJFeHBhbmRvLmdldEV4cGFuZG9Qcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBqID0gbWV0YVByb3BlcnRpZXMuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgICAgIE1ldGFCZWFuUHJvcGVydHkgcHJvcGVydHkgPSAoTWV0YUJlYW5Qcm9wZXJ0eSkgai5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIGV4cGFuZG9Qcm9wZXJ0aWVzLnB1dChwcm9wZXJ0eS5nZXROYW1lKCkscHJvcGVydHkpOworICAgICAgICAgICAgICAgICAgICBhZGRNZXRhQmVhblByb3BlcnR5KHByb3BlcnR5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCX0KKworCisJLyoqCisJICogUmV0dXJucyBhIGxpc3Qgb2YgZXhwYW5kbyBNZXRhTWV0aG9kIGluc3RhbmNlcyBhZGRlZCB0byB0aGlzIEV4cGFuZG9NZXRhQ2xhc3MKKwkgKgorCSAqIEByZXR1cm4gdGhlIGV4cGFuZG9NZXRob2RzCisJICovCisJcHVibGljIExpc3QgZ2V0RXhwYW5kb01ldGhvZHMoKSB7CisgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoRGVmYXVsdEdyb292eU1ldGhvZHMudG9MaXN0KGV4cGFuZG9NZXRob2RzLnZhbHVlcygpKSk7CisgICAgfQorCisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbGlzdCBvZiBNZXRhQmVhblByb3BlcnR5IGluc3RhbmNlcyBhZGRlZCB0byB0aGlzIEV4cGFuZG9NZXRhQ2xhc3MKKwkgKgorCSAqIEByZXR1cm4gdGhlIGV4cGFuZG9Qcm9wZXJ0aWVzCisJICovCisJcHVibGljIENvbGxlY3Rpb24gZ2V0RXhwYW5kb1Byb3BlcnRpZXMoKSB7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVDb2xsZWN0aW9uKGV4cGFuZG9Qcm9wZXJ0aWVzLnZhbHVlcygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBqdXN0IGluIGNhc2UgaW52b2tlTWV0aG9kIGhhcyBiZWVuIG92ZXJyaWRlbiBieSBFeHBhbmRvTWV0YUNsYXNzCisgICAgICoKKyAgICAgKiBAc2VlIGdyb292eS5sYW5nLk1ldGFDbGFzc0ltcGwjaW52b2tlTWV0aG9kKENsYXNzLCBPYmplY3QsIFN0cmluZywgT2JqZWN0W10sIGJvb2xlYW4sIGJvb2xlYW4pCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBpbnZva2VNZXRob2QoQ2xhc3Mgc2VuZGVyLCBPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbWV0aG9kTmFtZSwgT2JqZWN0W10gb3JpZ2luYWxBcmd1bWVudHMsIGJvb2xlYW4gaXNDYWxsVG9TdXBlciwgYm9vbGVhbiBmcm9tSW5zaWRlQ2xhc3MpIHsKKyAgICAgICAgaWYoaW52b2tlTWV0aG9kTWV0aG9kIT1udWxsKSB7CisgICAgICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kTWV0aG9kLmludm9rZShvYmplY3QsIG5ldyBPYmplY3RbXXttZXRob2ROYW1lLCBvcmlnaW5hbEFyZ3VtZW50c30pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5pbnZva2VNZXRob2Qoc2VuZGVyLCBvYmplY3QsIG1ldGhvZE5hbWUsIG9yaWdpbmFsQXJndW1lbnRzLCBpc0NhbGxUb1N1cGVyLCBmcm9tSW5zaWRlQ2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGp1c3QgaW4gY2FzZSBhIHN0YXRpYyBpbnZva2UgbWV0aG9kIGhhcyBiZWVuIHNldCBvbiBFeHBhbmRvTWV0YUNsYXNzCisgICAgICogQHNlZSBNZXRhQ2xhc3NJbXBsI2ludm9rZVN0YXRpY01ldGhvZChPYmplY3QsIFN0cmluZywgT2JqZWN0W10pCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBpbnZva2VTdGF0aWNNZXRob2QoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1ldGhvZE5hbWUsIE9iamVjdFtdIGFyZ3VtZW50cykgeworICAgICAgICBpZihpbnZva2VTdGF0aWNNZXRob2RNZXRob2QgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGludm9rZVN0YXRpY01ldGhvZE1ldGhvZC5pbnZva2Uob2JqZWN0LCBuZXcgT2JqZWN0W117bWV0aG9kTmFtZSwgYXJndW1lbnRzfSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLmludm9rZVN0YXRpY01ldGhvZChvYmplY3QsIG1ldGhvZE5hbWUsIGFyZ3VtZW50cyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3ZlcnJpZGVzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24ganVzdCBpbiBjYXNlIGdldFByb3BlcnR5IG1ldGhvZCBoYXMgYmVlbiBvdmVycmlkZW4gYnkgRXhwYW5kb01ldGFDbGFzcworICAgICAqCisgICAgICogQHNlZSBNZXRhQ2xhc3NJbXBsI2dldFByb3BlcnR5KENsYXNzLCBPYmplY3QsIFN0cmluZywgYm9vbGVhbiwgYm9vbGVhbikKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KENsYXNzIHNlbmRlciwgT2JqZWN0IG9iamVjdCwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gdXNlU3VwZXIsIGJvb2xlYW4gZnJvbUluc2lkZUNsYXNzKSB7CisgICAgICAgIGlmKGhhc092ZXJyaWRlR2V0UHJvcGVydHkobmFtZSkgJiYgZ2V0SmF2YUNsYXNzKCkuaXNJbnN0YW5jZShvYmplY3QpKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0UHJvcGVydHlNZXRob2QuaW52b2tlKG9iamVjdCwgbmV3IE9iamVjdFtde25hbWV9KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIuZ2V0UHJvcGVydHkoc2VuZGVyLCBvYmplY3QsIG5hbWUsIHVzZVN1cGVyLCBmcm9tSW5zaWRlQ2xhc3MpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogT3ZlcnJpZGVzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24ganVzdCBpbiBjYXNlIGdldFByb3BlcnR5IG1ldGhvZCBoYXMgYmVlbiBvdmVycmlkZW4gYnkgRXhwYW5kb01ldGFDbGFzcworICAgICAqCisgICAgICogQHNlZSBNZXRhQ2xhc3NJbXBsI2dldFByb3BlcnR5KE9iamVjdCwgU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgaWYoaGFzT3ZlcnJpZGVHZXRQcm9wZXJ0eShuYW1lKSAmJiBnZXRKYXZhQ2xhc3MoKS5pc0luc3RhbmNlKG9iamVjdCkpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRQcm9wZXJ0eU1ldGhvZC5pbnZva2Uob2JqZWN0LCBuZXcgT2JqZWN0W117bmFtZX0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5nZXRQcm9wZXJ0eShvYmplY3QsbmFtZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGhhc092ZXJyaWRlR2V0UHJvcGVydHkoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGdldFByb3BlcnR5TWV0aG9kICE9IG51bGwgJiYgIW5hbWUuZXF1YWxzKE1FVEFfQ0xBU1NfUFJPUEVSVFkpJiYgIW5hbWUuZXF1YWxzKENMQVNTX1BST1BFUlRZKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBqdXN0IGluIGNhc2Ugc2V0UHJvcGVydHkgbWV0aG9kIGhhcyBiZWVuIG92ZXJyaWRlbiBieSBFeHBhbmRvTWV0YUNsYXNzCisgICAgICoKKyAgICAgKiBAc2VlIE1ldGFDbGFzc0ltcGwjc2V0UHJvcGVydHkoQ2xhc3MsIE9iamVjdCwgU3RyaW5nLCBPYmplY3QsIGJvb2xlYW4sIGJvb2xlYW4pCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShDbGFzcyBzZW5kZXIsIE9iamVjdCBvYmplY3QsIFN0cmluZyBuYW1lLCBPYmplY3QgbmV3VmFsdWUsIGJvb2xlYW4gdXNlU3VwZXIsIGJvb2xlYW4gZnJvbUluc2lkZUNsYXNzKSB7CisgICAgICAgIGlmKHNldFByb3BlcnR5TWV0aG9kIT1udWxsICAmJiAhbmFtZS5lcXVhbHMoTUVUQV9DTEFTU19QUk9QRVJUWSkgJiYgZ2V0SmF2YUNsYXNzKCkuaXNJbnN0YW5jZShvYmplY3QpKSB7CisgICAgICAgICAgICBzZXRQcm9wZXJ0eU1ldGhvZC5pbnZva2Uob2JqZWN0LCBuZXcgT2JqZWN0W117bmFtZSwgbmV3VmFsdWV9KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzdXBlci5zZXRQcm9wZXJ0eShzZW5kZXIsIG9iamVjdCwgbmFtZSwgbmV3VmFsdWUsIHVzZVN1cGVyLCBmcm9tSW5zaWRlQ2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvb2tzIHVwIGFuIGV4aXN0aW5nIE1ldGFQcm9wZXJ0eSBieSBuYW1lCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgTWV0YVByb3BlcnR5CisgICAgICogQHJldHVybiBUaGUgTWV0YVByb3BlcnR5IG9yIG51bGwgaWYgaXQgZG9lc24ndCBleGlzdAorICAgICAqLworICAgIHB1YmxpYyBNZXRhUHJvcGVydHkgZ2V0TWV0YVByb3BlcnR5KFN0cmluZyBuYW1lKSB7CisgICAgICAgIE1ldGFQcm9wZXJ0eSBtcCA9IChNZXRhUHJvcGVydHkpIHRoaXMuZXhwYW5kb1Byb3BlcnRpZXMuZ2V0KG5hbWUpOworICAgICAgICBpZiAobXAgIT0gbnVsbCkgcmV0dXJuIG1wOworICAgICAgICByZXR1cm4gc3VwZXIuZ2V0TWV0YVByb3BlcnR5KG5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgTWV0YUNsYXNzIGhhcyB0aGUgZ2l2ZW4gcHJvcGVydHkKKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBNZXRhUHJvcGVydHkKKyAgICAgKiBAcmV0dXJuIFRydWUgaXQgZXhpc3RzIGFzIGEgTWV0YVByb3BlcnR5CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzTWV0YVByb3BlcnR5KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiBnZXRNZXRhUHJvcGVydHkobmFtZSkgIT0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3Mgd2hldGhlciBhIE1ldGFNZXRob2QgZm9yIHRoZSBnaXZlbiBuYW1lIGFuZCBhcmd1bWVudHMgZXhpc3RzCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgTWV0YU1ldGhvZAorICAgICAqIEBwYXJhbSBhcmdzIFRoZSBhcmd1bWVudHMgdG8gdGhlIG1ldGEgbWV0aG9kCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBtZXRob2QgZXhpc3RzIG90aGVyd2lzZSBudWxsCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzTWV0YU1ldGhvZChTdHJpbmcgbmFtZSwgQ2xhc3NbXSBhcmdzKSB7CisgICAgICAgIHJldHVybiBzdXBlci5waWNrTWV0aG9kKG5hbWUsIGFyZ3MpICE9IG51bGw7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBzcGVjaWZpZWQgYW5kIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIG1ha2UgaXQgYSBqYXZhYmVhbiBwcm9wZXJ0eQorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgVHJ1ZSBpZiBpdHMgYSBKYXZhYmVhbiBwcm9wZXJ0eQorICAgICAqIEBwYXJhbSBhcmdzIFRoZSBhcmd1bWVudHMKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgaXQgaXMgYSBqYXZhYmVhbiBwcm9wZXJ0eSBtZXRob2QKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNHZXR0ZXIoU3RyaW5nIG5hbWUsIENhY2hlZENsYXNzW10gYXJncykgeworICAgICAgICBpZihuYW1lID09IG51bGwgfHwgbmFtZS5sZW5ndGgoKSA9PSAwIHx8IGFyZ3MgPT0gbnVsbClyZXR1cm4gZmFsc2U7CisgICAgICAgIGlmKGFyZ3MubGVuZ3RoICE9IDApcmV0dXJuIGZhbHNlOworCisgICAgICAgIGlmKG5hbWUuc3RhcnRzV2l0aCgiZ2V0IikpIHsKKyAgICAgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZygzKTsKKyAgICAgICAgICAgIGlmKG5hbWUubGVuZ3RoKCkgPiAwICYmIENoYXJhY3Rlci5pc1VwcGVyQ2FzZShuYW1lLmNoYXJBdCgwKSkpIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYobmFtZS5zdGFydHNXaXRoKCJpcyIpKSB7CisgICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMik7CisgICAgICAgICAgICBpZihuYW1lLmxlbmd0aCgpID4gMCAmJiBDaGFyYWN0ZXIuaXNVcHBlckNhc2UobmFtZS5jaGFyQXQoMCkpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHByb3BlcnR5IG5hbWUgZXF1aXZhbGVudCBmb3IgdGhlIGdpdmVuIGdldHRlciBuYW1lIG9yIG51bGwgaWYgaXQgaXMgbm90IGEgZ2V0dGVyCisgICAgICoKKyAgICAgKiBAcGFyYW0gZ2V0dGVyTmFtZSBUaGUgZ2V0dGVyIG5hbWUKKyAgICAgKiBAcmV0dXJuIFRoZSBwcm9wZXJ0eSBuYW1lIGVxdWl2YWxlbnQKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBnZXRQcm9wZXJ0eUZvckdldHRlcihTdHJpbmcgZ2V0dGVyTmFtZSkgeworICAgICAgICBpZihnZXR0ZXJOYW1lID09IG51bGwgfHwgZ2V0dGVyTmFtZS5sZW5ndGgoKSA9PSAwKXJldHVybiBudWxsOworCisgICAgICAgIGlmKGdldHRlck5hbWUuc3RhcnRzV2l0aCgiZ2V0IikpIHsKKyAgICAgICAgICAgIFN0cmluZyBwcm9wID0gZ2V0dGVyTmFtZS5zdWJzdHJpbmcoMyk7CisgICAgICAgICAgICByZXR1cm4gY29udmVydFByb3BlcnR5TmFtZShwcm9wKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKGdldHRlck5hbWUuc3RhcnRzV2l0aCgiaXMiKSkgeworICAgICAgICAgICAgU3RyaW5nIHByb3AgPSBnZXR0ZXJOYW1lLnN1YnN0cmluZygyKTsKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0UHJvcGVydHlOYW1lKHByb3ApOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworCXByaXZhdGUgU3RyaW5nIGNvbnZlcnRQcm9wZXJ0eU5hbWUoU3RyaW5nIHByb3ApIHsKKwkJaWYoQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHByb3AuY2hhckF0KDApKSAmJiAocHJvcC5sZW5ndGgoKSA+IDEgJiYgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHByb3AuY2hhckF0KDEpKSkpIHsKKwkJCXJldHVybiBwcm9wOworCQl9CisJCWVsc2UgaWYoQ2hhcmFjdGVyLmlzRGlnaXQocHJvcC5jaGFyQXQoMCkpKSB7CisJCQlyZXR1cm4gcHJvcDsKKwkJfQorCQllbHNlIHsKKwkJCXJldHVybiBDaGFyYWN0ZXIudG9Mb3dlckNhc2UocHJvcC5jaGFyQXQoMCkpICsgKHByb3AubGVuZ3RoKCkgPiAxID8gcHJvcC5zdWJzdHJpbmcoMSkgOiAiIik7CisJCX0KKwl9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgcHJvcGVydHkgbmFtZSBlcXVpdmFsZW50IGZvciB0aGUgZ2l2ZW4gc2V0dGVyIG5hbWUgb3IgbnVsbCBpZiBpdCBpcyBub3QgYSBnZXR0ZXIKKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXR0ZXJOYW1lIFRoZSBzZXR0ZXIgbmFtZQorICAgICAqIEByZXR1cm4gVGhlIHByb3BlcnR5IG5hbWUgZXF1aXZhbGVudAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlGb3JTZXR0ZXIoU3RyaW5nIHNldHRlck5hbWUpIHsKKyAgICAgICAgaWYoc2V0dGVyTmFtZSA9PSBudWxsIHx8IHNldHRlck5hbWUubGVuZ3RoKCkgPT0gMClyZXR1cm4gbnVsbDsKKworICAgICAgICBpZihzZXR0ZXJOYW1lLnN0YXJ0c1dpdGgoInNldCIpKSB7CisgICAgICAgICAgICBTdHJpbmcgcHJvcCA9IHNldHRlck5hbWUuc3Vic3RyaW5nKDMpOworICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRQcm9wZXJ0eU5hbWUocHJvcCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNTZXR0ZXIoU3RyaW5nIG5hbWUsIENhY2hlZENsYXNzW10gYXJncykgeworICAgICAgICBpZihuYW1lID09IG51bGwgfHwgbmFtZS5sZW5ndGgoKSA9PSAwIHx8IGFyZ3MgPT0gbnVsbClyZXR1cm4gZmFsc2U7CisKKyAgICAgICAgaWYobmFtZS5zdGFydHNXaXRoKCJzZXQiKSkgeworICAgICAgICAgICAgaWYoYXJncy5sZW5ndGggIT0gMSkgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDMpOworICAgICAgICAgICAgaWYobmFtZS5sZW5ndGgoKSA+IDAgJiYgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKG5hbWUuY2hhckF0KDApKSkgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisKK30KKwpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL0V4cGFuZG9NZXRhQ2xhc3NDcmVhdGlvbkhhbmRsZS5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL0V4cGFuZG9NZXRhQ2xhc3NDcmVhdGlvbkhhbmRsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkM2FlMzYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvRXhwYW5kb01ldGFDbGFzc0NyZWF0aW9uSGFuZGxlLmphdmEKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBncm9vdnkubGFuZzsKKworaW1wb3J0IGdyb292eS5sYW5nLk1ldGFDbGFzc1JlZ2lzdHJ5Lk1ldGFDbGFzc0NyZWF0aW9uSGFuZGxlOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5tZXRhY2xhc3MuQ29uY3VycmVudFJlYWRlckhhc2hNYXA7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworLyoqCisgKiA8cD5BIGhhbmRsZSBmb3IgdGhlIE1ldGFDbGFzc1JlZ2lzdHJ5IHRoYXQgY2hhbmdlcyBhbGwgY2xhc3NlcyBsb2FkZWQgaW50byB0aGUgR3JhaWxzIFZNCisgKiB0byB1c2UgRXhwYW5kb01ldGFDbGFzcyBpbnN0YW5jZXMKKyAqCisgKiA8cD5UaGUgaGFuZGxlIHNob3VsZCBiZSByZWdpc3RlcmVkIHdpdGggdGhlIEdyb292eSBydW50aW1lIDxzdHJvbmc+YmVmb3JlPC9iZWZvcmU+IEdyb292eSBsb2FkcywgZm9yIGV4YW1wbGUKKyAqIGluIHlvdXIgbWFpbiBtZXRob2QuCisgKgorICogPGNvZGU+R3Jvb3Z5U3lzdGVtLm1ldGFDbGFzc1JlZ2lzdHJ5Lm1ldGFDbGFzc0NyZWF0aW9uSGFuZGxlID0gbmV3IEV4cGFuZG9NZXRhQ2xhc3NDcmVhdGlvbkhhbmRsZSgpPC9jb2RlPgorICoKKyAqIEBzZWUgZ3Jvb3Z5LmxhbmcuTWV0YUNsYXNzUmVnaXN0cnkKKyAqIEBzZWUgZ3Jvb3Z5LmxhbmcuTWV0YUNsYXNzUmVnaXN0cnkuTWV0YUNsYXNzQ3JlYXRpb25IYW5kbGUKKyAqIEBzZWUgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLm1ldGFjbGFzcy5NZXRhQ2xhc3NSZWdpc3RyeUltcGwjc2V0TWV0YUNsYXNzQ3JlYXRpb25IYW5kbGUoZ3Jvb3Z5LmxhbmcuTWV0YUNsYXNzUmVnaXN0cnkuTWV0YUNsYXNzQ3JlYXRpb25IYW5kbGUpCisgKgorICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCisgKiBAc2luY2UgMS4xCisgKi8KK3B1YmxpYyBjbGFzcyBFeHBhbmRvTWV0YUNsYXNzQ3JlYXRpb25IYW5kbGUgZXh0ZW5kcyBNZXRhQ2xhc3NDcmVhdGlvbkhhbmRsZSB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEV4cGFuZG9NZXRhQ2xhc3NDcmVhdGlvbkhhbmRsZSBpbnN0YW5jZSA9IG5ldyBFeHBhbmRvTWV0YUNsYXNzQ3JlYXRpb25IYW5kbGUoKTsKKworCXByaXZhdGUgZmluYWwgTWFwIG1vZGlmaWVkRXhwYW5kb3MgPSBuZXcgQ29uY3VycmVudFJlYWRlckhhc2hNYXAoKTsKKworCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgZ3Jvb3Z5LmxhbmcuTWV0YUNsYXNzUmVnaXN0cnkuTWV0YUNsYXNzQ3JlYXRpb25IYW5kbGUjY3JlYXRlKGphdmEubGFuZy5DbGFzcywgZ3Jvb3Z5LmxhbmcuTWV0YUNsYXNzUmVnaXN0cnkpCisJICovCisJcHJvdGVjdGVkIE1ldGFDbGFzcyBjcmVhdGVOb3JtYWxNZXRhQ2xhc3MoQ2xhc3MgdGhlQ2xhc3MsIE1ldGFDbGFzc1JlZ2lzdHJ5IHJlZ2lzdHJ5KSB7CisJCWlmKHRoZUNsYXNzICE9IEV4cGFuZG9NZXRhQ2xhc3MuY2xhc3MpIHsKKwkJCUV4cGFuZG9NZXRhQ2xhc3MgZW1jID0gbmV3IEV4cGFuZG9NZXRhQ2xhc3ModGhlQ2xhc3MsIGZhbHNlICx0cnVlKTsKKwkJCVNldCBtb2RpZmllZFN1cGVyRXhwYW5kb3MgPSByZXRyaWV2ZU1vZGlmaWVkU3VwZXJFeHBhbmRvcyhlbWMpOworICAgICAgICAgICAgZW1jLnJlZnJlc2hJbmhlcml0ZWRNZXRob2RzKG1vZGlmaWVkU3VwZXJFeHBhbmRvcyk7CisJCQlyZXR1cm4gZW1jOworCQl9CisJCWVsc2UgeworCQkJcmV0dXJuIHN1cGVyLmNyZWF0ZSh0aGVDbGFzcywgcmVnaXN0cnkpOworCQl9CisJfQorCisgICAgLyoKKyAgICAgKiBMb29rcyBmb3IgbW9kaWZpZWQgc3VwZXIgY2xhc3MgRXhwYW5kb01ldGFDbGFzcyBpbnN0YW5jZXMgZm9yIHRoZSBnaXZlbiBjaGlsZCBFeHBhbmRvTWV0YUNsYXNzCisgICAgICovCisgICAgcHJpdmF0ZSBTZXQgcmV0cmlldmVNb2RpZmllZFN1cGVyRXhwYW5kb3MoRXhwYW5kb01ldGFDbGFzcyBjaGlsZCkgeworCQlTZXQgbW9kaWZpZWRTdXBlcnMgPSBuZXcgSGFzaFNldCgpOworCQlMaXN0IHN1cGVyQ2xhc3NlcyA9IGNoaWxkLmdldFN1cGVyQ2xhc3NlcygpOworCQlmb3IgKEl0ZXJhdG9yIGkgPSBzdXBlckNsYXNzZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisJCQlDbGFzcyBjID0gKENsYXNzKSBpLm5leHQoKTsKKyAgICAgICAgICAgIENsYXNzW10gaW50ZXJmYWNlcyA9IGMuZ2V0SW50ZXJmYWNlcygpOworICAgICAgICAgICAgcG9wdWxhdGVTdXBlcnNGcm9tSW50ZXJmYWNlcyhtb2RpZmllZFN1cGVycywgaW50ZXJmYWNlcyk7CisgICAgICAgICAgICBpZihtb2RpZmllZEV4cGFuZG9zLmNvbnRhaW5zS2V5KGMpKSB7CisJCQkJbW9kaWZpZWRTdXBlcnMuYWRkKG1vZGlmaWVkRXhwYW5kb3MuZ2V0KGMpKTsKKwkJCX0KKwkJfQorICAgICAgICBDbGFzc1tdIGludGVyZmFjZXMgPSBjaGlsZC5nZXRKYXZhQ2xhc3MoKS5nZXRJbnRlcmZhY2VzKCk7CisgICAgICAgIHBvcHVsYXRlU3VwZXJzRnJvbUludGVyZmFjZXMobW9kaWZpZWRTdXBlcnMsIGludGVyZmFjZXMpOworICAgICAgICByZXR1cm4gbW9kaWZpZWRTdXBlcnM7CisJfQorCisgICAgLyoKKyAgICAgKiBTZWFyY2hlcyB0aHJvdWdoIGEgZ2l2ZW4gYXJyYXkgb2YgaW50ZXJmYWNlcyBmb3IgbW9kaWZpZWQgRXhwYW5kb01ldGFDbGFzcyBpbnN0YW5jZXMgZm9yIGVhY2ggaW50ZXJmYWNlCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlU3VwZXJzRnJvbUludGVyZmFjZXMoU2V0IG1vZGlmaWVkU3VwZXJzLCBDbGFzc1tdIGludGVyZmFjZXMpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcmZhY2VzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBDbGFzcyBhbkludGVyZmFjZSA9IGludGVyZmFjZXNbaV07CisgICAgICAgICAgICBmaW5hbCBDbGFzc1tdIHN1cGVySW50ZXJmYWNlcyA9IGFuSW50ZXJmYWNlLmdldEludGVyZmFjZXMoKTsKKyAgICAgICAgICAgIGlmKG1vZGlmaWVkRXhwYW5kb3MuY29udGFpbnNLZXkoYW5JbnRlcmZhY2UpKSB7CisgICAgICAgICAgICAgICAgbW9kaWZpZWRTdXBlcnMuYWRkKG1vZGlmaWVkRXhwYW5kb3MuZ2V0KGFuSW50ZXJmYWNlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihzdXBlckludGVyZmFjZXMubGVuZ3RoID4gMCkKKyAgICAgICAgICAgICAgICBwb3B1bGF0ZVN1cGVyc0Zyb21JbnRlcmZhY2VzKG1vZGlmaWVkU3VwZXJzLCBzdXBlckludGVyZmFjZXMpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlcnMgYSBtb2RpZmllZCBFeHBhbmRvTWV0YUNsYXNzIHdpdGggdGhlIGNyZWF0aW9uIGhhbmRsZQorICAgICAqCisgICAgICogQHBhcmFtIGVtYyBUaGUgRU1DCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJNb2RpZmllZE1ldGFDbGFzcyhFeHBhbmRvTWV0YUNsYXNzIGVtYykgeworICAgICAgICBtb2RpZmllZEV4cGFuZG9zLnB1dChlbWMuZ2V0SmF2YUNsYXNzKCksIGVtYyk7CisJfQorCisJcHVibGljIGJvb2xlYW4gaGFzTW9kaWZpZWRNZXRhQ2xhc3MoRXhwYW5kb01ldGFDbGFzcyBlbWMpIHsKKwkJcmV0dXJuIG1vZGlmaWVkRXhwYW5kb3MuY29udGFpbnNLZXkoZW1jLmdldEphdmFDbGFzcygpKTsKKwl9CisKKyAgICAvKioKKyAgICAgKiA8cD5FbmFibGVzIHRoZSBFeHBhbmRvTWV0YUNsYXNzQ3JlYXRpb25IYW5kbGUgd2l0aCB0aGUgcmVnaXN0cnkKKyAgICAgKgorICAgICAqIDxjb2RlPkV4cGFuZG9NZXRhQ2xhc3NDcmVhdGlvbkhhbmRsZS5lbmFibGUoKTs8L2NvZGU+CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZW5hYmxlKCkgeworICAgICAgICBmaW5hbCBNZXRhQ2xhc3NSZWdpc3RyeSBtZXRhQ2xhc3NSZWdpc3RyeSA9IEdyb292eVN5c3RlbS5nZXRNZXRhQ2xhc3NSZWdpc3RyeSgpOworICAgICAgICBpZiAobWV0YUNsYXNzUmVnaXN0cnkuZ2V0TWV0YUNsYXNzQ3JlYXRpb25IYW5kbGVyKCkgIT0gaW5zdGFuY2UpIHsKKyAgICAgICAgICAgaW5zdGFuY2UubW9kaWZpZWRFeHBhbmRvcy5jbGVhcigpOworICAgICAgICAgICBtZXRhQ2xhc3NSZWdpc3RyeS5zZXRNZXRhQ2xhc3NDcmVhdGlvbkhhbmRsZShpbnN0YW5jZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGlzYWJsZSgpIHsKKyAgICAgICAgZmluYWwgTWV0YUNsYXNzUmVnaXN0cnkgbWV0YUNsYXNzUmVnaXN0cnkgPSBHcm9vdnlTeXN0ZW0uZ2V0TWV0YUNsYXNzUmVnaXN0cnkoKTsKKyAgICAgICAgaWYgKG1ldGFDbGFzc1JlZ2lzdHJ5LmdldE1ldGFDbGFzc0NyZWF0aW9uSGFuZGxlcigpID09IGluc3RhbmNlKSB7CisgICAgICAgICAgICBpbnN0YW5jZS5tb2RpZmllZEV4cGFuZG9zLmNsZWFyKCk7CisgICAgICAgICAgICBtZXRhQ2xhc3NSZWdpc3RyeS5zZXRNZXRhQ2xhc3NDcmVhdGlvbkhhbmRsZShuZXcgTWV0YUNsYXNzQ3JlYXRpb25IYW5kbGUoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvR1N0cmluZy5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL0dTdHJpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzhlOGUyCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL0dTdHJpbmcuamF2YQpAQCAtMCwwICsxLDIyNCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGdyb292eS5sYW5nOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuRGVmYXVsdEdyb292eU1ldGhvZHM7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLkludm9rZXJIZWxwZXI7CisKKy8qKgorICogUmVwcmVzZW50cyBhIFN0cmluZyB3aGljaCBjb250YWlucyBlbWJlZGRlZCB2YWx1ZXMgc3VjaCBhcyAiaGVsbG8gdGhlcmUKKyAqICR7dXNlcn0gaG93IGFyZSB5b3U/IiB3aGljaCBjYW4gYmUgZXZhbHVhdGVkIGxhemlseS4gQWR2YW5jZWQgdXNlcnMgY2FuCisgKiBpdGVyYXRlIG92ZXIgdGhlIHRleHQgYW5kIHZhbHVlcyB0byBwZXJmb3JtIHNwZWNpYWwgcHJvY2Vzc2luZywgc3VjaCBhcyBmb3IKKyAqIHBlcmZvcm1pbmcgU1FMIG9wZXJhdGlvbnMsIHRoZSB2YWx1ZXMgY2FuIGJlIHN1YnN0aXR1dGVkIGZvciA/IGFuZCB0aGUKKyAqIGFjdHVhbCB2YWx1ZSBvYmplY3RzIGNhbiBiZSBib3VuZCB0byBhIEpEQkMgc3RhdGVtZW50LiBUaGUgbG92ZWx5IG5hbWUgb2YKKyAqIHRoaXMgY2xhc3Mgd2FzIHN1Z2dlc3RlZCBieSBKdWxlcyBHb3NuZWxsIGFuZCB3YXMgc3VjaCBhIGdvb2QgaWRlYSwgSQorICogY291bGRuJ3QgcmVzaXN0IDopCisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBHU3RyaW5nIGV4dGVuZHMgR3Jvb3Z5T2JqZWN0U3VwcG9ydCBpbXBsZW1lbnRzIENvbXBhcmFibGUsIENoYXJTZXF1ZW5jZSwgV3JpdGFibGUsIEJ1aWxkYWJsZSB7CisKKyAgICBwcml2YXRlIE9iamVjdFtdIHZhbHVlczsKKworICAgIHB1YmxpYyBHU3RyaW5nKE9iamVjdCB2YWx1ZXMpIHsKKyAgICAgICAgdGhpcy52YWx1ZXMgPSAoT2JqZWN0W10pIHZhbHVlczsKKyAgICB9CisKKyAgICBwdWJsaWMgR1N0cmluZyhPYmplY3RbXSB2YWx1ZXMpIHsKKyAgICAgICAgdGhpcy52YWx1ZXMgPSB2YWx1ZXM7CisgICAgfQorCisgICAgLy8gd2lsbCBiZSBzdGF0aWMgaW4gYW4gaW5zdGFuY2UKKyAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nW10gZ2V0U3RyaW5ncygpOworCisgICAgLyoqCisgICAgICogT3ZlcmxvYWRlZCB0byBpbXBsZW1lbnQgZHVjayB0eXBpbmcgZm9yIFN0cmluZ3MgCisgICAgICogc28gdGhhdCBhbnkgbWV0aG9kIHRoYXQgY2FuJ3QgYmUgZXZhbHVhdGVkIG9uIHRoaXMKKyAgICAgKiBvYmplY3Qgd2lsbCBiZSBmb3J3YXJkZWQgdG8gdGhlIHRvU3RyaW5nKCkgb2JqZWN0IGluc3RlYWQuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBpbnZva2VNZXRob2QoU3RyaW5nIG5hbWUsIE9iamVjdCBhcmdzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuaW52b2tlTWV0aG9kKG5hbWUsIGFyZ3MpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChNaXNzaW5nTWV0aG9kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGxldHMgdHJ5IGludm9rZSB0aGUgbWV0aG9kIG9uIHRoZSByZWFsIFN0cmluZworICAgICAgICAgICAgcmV0dXJuIEludm9rZXJIZWxwZXIuaW52b2tlTWV0aG9kKHRvU3RyaW5nKCksIG5hbWUsIGFyZ3MpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIE9iamVjdFtdIGdldFZhbHVlcygpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlczsKKyAgICB9CisKKyAgICBwdWJsaWMgR1N0cmluZyBwbHVzKEdTdHJpbmcgdGhhdCkgeworICAgICAgICBMaXN0IHN0cmluZ0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIExpc3QgdmFsdWVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOworCisgICAgICAgIHN0cmluZ0xpc3QuYWRkQWxsKEFycmF5cy5hc0xpc3QoZ2V0U3RyaW5ncygpKSk7CisgICAgICAgIHZhbHVlTGlzdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChnZXRWYWx1ZXMoKSkpOworCisgICAgICAgIGlmIChzdHJpbmdMaXN0LnNpemUoKSA+IHZhbHVlTGlzdC5zaXplKCkpIHsKKyAgICAgICAgICAgIHZhbHVlTGlzdC5hZGQoIiIpOworICAgICAgICB9CisKKyAgICAgICAgc3RyaW5nTGlzdC5hZGRBbGwoQXJyYXlzLmFzTGlzdCh0aGF0LmdldFN0cmluZ3MoKSkpOworICAgICAgICB2YWx1ZUxpc3QuYWRkQWxsKEFycmF5cy5hc0xpc3QodGhhdC5nZXRWYWx1ZXMoKSkpOworCisgICAgICAgIGZpbmFsIFN0cmluZ1tdIG5ld1N0cmluZ3MgPSBuZXcgU3RyaW5nW3N0cmluZ0xpc3Quc2l6ZSgpXTsKKyAgICAgICAgc3RyaW5nTGlzdC50b0FycmF5KG5ld1N0cmluZ3MpOworICAgICAgICBPYmplY3RbXSBuZXdWYWx1ZXMgPSB2YWx1ZUxpc3QudG9BcnJheSgpOworCisgICAgICAgIHJldHVybiBuZXcgR1N0cmluZyhuZXdWYWx1ZXMpIHsKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRTdHJpbmdzKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXdTdHJpbmdzOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIHB1YmxpYyBHU3RyaW5nIHBsdXMoU3RyaW5nIHRoYXQpIHsKKyAgICAgICAgU3RyaW5nW10gY3VycmVudFN0cmluZ3MgPSBnZXRTdHJpbmdzKCk7CisgICAgICAgIFN0cmluZ1tdIG5ld1N0cmluZ3MgPSBudWxsOworICAgICAgICBPYmplY3RbXSBuZXdWYWx1ZXMgPSBudWxsOworCisgICAgICAgIG5ld1N0cmluZ3MgPSBuZXcgU3RyaW5nW2N1cnJlbnRTdHJpbmdzLmxlbmd0aCArIDFdOworICAgICAgICBuZXdWYWx1ZXMgPSBuZXcgT2JqZWN0W2dldFZhbHVlcygpLmxlbmd0aCArIDFdOworICAgICAgICBpbnQgbGFzdEluZGV4ID0gY3VycmVudFN0cmluZ3MubGVuZ3RoOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGN1cnJlbnRTdHJpbmdzLCAwLCBuZXdTdHJpbmdzLCAwLCBsYXN0SW5kZXgpOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGdldFZhbHVlcygpLCAwLCBuZXdWYWx1ZXMsIDAsIGdldFZhbHVlcygpLmxlbmd0aCk7CisgICAgICAgIG5ld1N0cmluZ3NbbGFzdEluZGV4XSA9IHRoYXQ7CisgICAgICAgIG5ld1ZhbHVlc1tnZXRWYWx1ZXMoKS5sZW5ndGhdID0gIiI7CisKKyAgICAgICAgZmluYWwgU3RyaW5nW10gZmluYWxTdHJpbmdzID0gbmV3U3RyaW5nczsKKyAgICAgICAgcmV0dXJuIG5ldyBHU3RyaW5nKG5ld1ZhbHVlcykgeworCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0U3RyaW5ncygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmluYWxTdHJpbmdzOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0VmFsdWVDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlcy5sZW5ndGg7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZShpbnQgaWR4KSB7CisgICAgICAgIHJldHVybiB2YWx1ZXNbaWR4XTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdXcml0ZXIgYnVmZmVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgd3JpdGVUbyhidWZmZXIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU3RyaW5nV3JpdGVySU9FeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBXcml0ZXIgd3JpdGVUbyhXcml0ZXIgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIAlTdHJpbmdbXSBzID0gZ2V0U3RyaW5ncygpOworICAgIAlpbnQgbnVtYmVyT2ZWYWx1ZXMgPSB2YWx1ZXMubGVuZ3RoOworICAgIAlmb3IgKGludCBpID0gMCwgc2l6ZSA9IHMubGVuZ3RoOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgCQlvdXQud3JpdGUoc1tpXSk7CisgICAgCQlpZiAoaSA8IG51bWJlck9mVmFsdWVzKSB7CisgICAgCQkJZmluYWwgT2JqZWN0IHZhbHVlID0gdmFsdWVzW2ldOworCisgICAgCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgQ2xvc3VyZSkgeworICAgIAkJCQlmaW5hbCBDbG9zdXJlIGMgPSAoQ2xvc3VyZSl2YWx1ZTsKKworICAgIAkJCQlpZiAoYy5nZXRNYXhpbXVtTnVtYmVyT2ZQYXJhbWV0ZXJzKCkgPT0gMCkgeworICAgIAkJCQkJSW52b2tlckhlbHBlci53cml0ZShvdXQsIGMuY2FsbChudWxsKSk7CisgICAgCQkJCX0gZWxzZSBpZiAoYy5nZXRNYXhpbXVtTnVtYmVyT2ZQYXJhbWV0ZXJzKCkgPT0gMSkgeworICAgIAkJCQkJYy5jYWxsKG5ldyBPYmplY3RbXXtvdXR9KTsKKyAgICAJCQkJfSBlbHNlIHsKKyAgICAJCQkJCXRocm93IG5ldyBHcm9vdnlSdW50aW1lRXhjZXB0aW9uKCJUcnlpbmcgdG8gZXZhbHVhdGUgYSBHU3RyaW5nIGNvbnRhaW5pbmcgYSBDbG9zdXJlIHRha2luZyAiCisgICAgCQkJCQkJCSsgYy5nZXRNYXhpbXVtTnVtYmVyT2ZQYXJhbWV0ZXJzKCkgKyAiIHBhcmFtZXRlcnMiKTsKKyAgICAJCQkJfQorICAgIAkJCX0gZWxzZSB7CisgICAgCQkJCUludm9rZXJIZWxwZXIud3JpdGUob3V0LCB2YWx1ZSk7CisgICAgCQkJfQorICAgIAkJfQorICAgIAl9CisgICAgCXJldHVybiBvdXQ7CisgICAgfQorCisgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAqIEBzZWUgZ3Jvb3Z5LmxhbmcuQnVpbGRhYmxlI2J1aWxkKGdyb292eS5sYW5nLkdyb292eU9iamVjdCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBidWlsZChmaW5hbCBHcm9vdnlPYmplY3QgYnVpbGRlcikgeworICAgIGZpbmFsIFN0cmluZ1tdIHMgPSBnZXRTdHJpbmdzKCk7CisgICAgZmluYWwgaW50IG51bWJlck9mVmFsdWVzID0gdmFsdWVzLmxlbmd0aDsKKyAgICAgICAgCisgICAgICAgIGZvciAoaW50IGkgPSAwLCBzaXplID0gcy5sZW5ndGg7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIGJ1aWxkZXIuZ2V0UHJvcGVydHkoIm1rcCIpOworICAgICAgICAgICAgYnVpbGRlci5pbnZva2VNZXRob2QoInlpZWxkIiwgbmV3IE9iamVjdFtde3NbaV19KTsKKyAgICAgICAgICAgIGlmIChpIDwgbnVtYmVyT2ZWYWx1ZXMpIHsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmdldFByb3BlcnR5KCJta3AiKTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmludm9rZU1ldGhvZCgieWllbGQiLCBuZXcgT2JqZWN0W117dmFsdWVzW2ldfSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHRoYXQpIHsKKyAgICAgICAgaWYgKHRoYXQgaW5zdGFuY2VvZiBHU3RyaW5nKSB7CisgICAgICAgICAgICByZXR1cm4gZXF1YWxzKChHU3RyaW5nKSB0aGF0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKEdTdHJpbmcgdGhhdCkgeworICAgICAgICByZXR1cm4gdG9TdHJpbmcoKS5lcXVhbHModGhhdC50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gMzcgKyB0b1N0cmluZygpLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IHRoYXQpIHsKKyAgICAgICAgcmV0dXJuIHRvU3RyaW5nKCkuY29tcGFyZVRvKHRoYXQudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIGNoYXIgY2hhckF0KGludCBpbmRleCkgeworICAgICAgICByZXR1cm4gdG9TdHJpbmcoKS5jaGFyQXQoaW5kZXgpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgbGVuZ3RoKCkgeworICAgICAgICByZXR1cm4gdG9TdHJpbmcoKS5sZW5ndGgoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIHN1YlNlcXVlbmNlKGludCBzdGFydCwgaW50IGVuZCkgeworICAgICAgICByZXR1cm4gdG9TdHJpbmcoKS5zdWJTZXF1ZW5jZShzdGFydCwgZW5kKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUdXJucyBhIFN0cmluZyBpbnRvIGEgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuCisgICAgICovCisgICAgcHVibGljIFBhdHRlcm4gbmVnYXRlKCkgeworICAgICAgICByZXR1cm4gRGVmYXVsdEdyb292eU1ldGhvZHMuYml0d2lzZU5lZ2F0ZSh0b1N0cmluZygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvR3Jvb3Z5Q2xhc3NMb2FkZXIuamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbGFuZy9Hcm9vdnlDbGFzc0xvYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhZGY3YjcKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvR3Jvb3Z5Q2xhc3NMb2FkZXIuamF2YQpAQCAtMCwwICsxLDg0OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogQFRPRE86IG11bHRpIHRocmVhZGVkIGNvbXBpbGluZyBvZiB0aGUgc2FtZSBjbGFzcyBidXQgd2l0aCBkaWZmZXJlbnQgcm9vdHMKKyAqIGZvciBjb21waWxhdGlvbi4uLiBUMSBjb21waWxlcyBBLCB3aGljaCB1c2VzIEIsIFQyIGNvbXBpbGVzIEIuLi4gbWFyayBBIGFuZCBCCisgKiBhcyBwYXJzZWQgYW5kIHRoZW4gc3luY2hyb25pemUgY29tcGlsYXRpb24uIFByb2JsZW1zOiBIb3cgdG8gc3luY2hyb25pemU/IAorICogSG93IHRvIGdldCBlcnJvciBtZXNzYWdlcz8gICAKKyAqCisgKi8KK3BhY2thZ2UgZ3Jvb3Z5Lmxhbmc7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5DbGFzc05vZGU7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuTW9kdWxlTm9kZTsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuLlZlcmlmaWVyOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC4qOworaW1wb3J0IG9yZy5vYmplY3R3ZWIuYXNtLkNsYXNzVmlzaXRvcjsKK2ltcG9ydCBvcmcub2JqZWN0d2ViLmFzbS5DbGFzc1dyaXRlcjsKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLm5ldC4qOworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkNvZGVTb3VyY2U7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJvdGVjdGlvbkRvbWFpbjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworLyoqCisgKiBBIENsYXNzTG9hZGVyIHdoaWNoIGNhbiBsb2FkIEdyb292eSBjbGFzc2VzLiBUaGUgbG9hZGVkIGNsYXNzZXMgYXJlIGNhY2hlZCwKKyAqIGNsYXNzZXMgZnJvbSBvdGhlciBjbGFzc2xhb2RlcnMgc2hvdWxkIG5vdCBiZSBjYWNoZWQuIFRvIGJlIGFibGUgdG8gbG9hZCBhCisgKiBzY3JpcHQgdGhhdCB3YXMgYXNrZWQgZm9yIGVhcmxpZXIgYnV0IHdhcyBjcmVhdGVkIGxhdGVyIGl0IGlzIGVzc2VudGlhbCBub3QKKyAqIHRvIGtlZXAgYW55dGhpbmcgbGlrZSBhICJjbGFzcyBub3QgZm91bmQiIGluZm9ybWF0aW9uIGZvciB0aGF0IGNsYXNzIG5hbWUuCisgKiBUaGlzIGluY2x1ZGVzIHBvc3NpYmxlIHBhcmVudCBsb2FkZXJzLiBDbGFzc2VzIHRoYXQgYXJlIG5vdCBjaGFjaGVkIGFyZSBhbHdheXMKKyAqIHJlbG9hZGVkLgorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAYXV0aG9yIEd1aWxsYXVtZSBMYWZvcmdlCisgKiBAYXV0aG9yIFN0ZXZlIEdvZXR6ZQorICogQGF1dGhvciBCaW5nIFJhbgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86c2NvdHRzdGlybGluZ0ByY24uY29tIj5TY290dCBTdGlybGluZzwvYT4KKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmJsYWNrZHJhZ0BnbXgub3JnIj5Kb2NoZW4gVGhlb2Rvcm91PC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgR3Jvb3Z5Q2xhc3NMb2FkZXIgZXh0ZW5kcyBVUkxDbGFzc0xvYWRlciB7CisKKyAgICAvKioKKyAgICAgKiB0aGlzIGNhY2hlIGNvbnRhaW5zIHRoZSBsb2FkZWQgY2xhc3NlcyBvciBQQVJTSU5HLCBpZiB0aGUgY2xhc3MgaXMgY3VycmVudGx5IHBhcnNlZAorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCBNYXAgY2xhc3NDYWNoZSA9IG5ldyBIYXNoTWFwKCk7CisgICAgcHJvdGVjdGVkIGZpbmFsIE1hcCBzb3VyY2VDYWNoZSA9IG5ldyBIYXNoTWFwKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBDb21waWxlckNvbmZpZ3VyYXRpb24gY29uZmlnOworICAgIHByaXZhdGUgQm9vbGVhbiByZWNvbXBpbGU7CisgICAgLy8gdXNlIDEwMDAwMDAgYXMgb2Zmc2V0IHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIG5hbWVzIGZvcm0gdGhlIEdyb292eVNoZWxsIAorICAgIHByaXZhdGUgc3RhdGljIGludCBzY3JpcHROYW1lQ291bnRlciA9IDEwMDAwMDA7CisKKyAgICBwcml2YXRlIEdyb292eVJlc291cmNlTG9hZGVyIHJlc291cmNlTG9hZGVyID0gbmV3IEdyb292eVJlc291cmNlTG9hZGVyKCkgeworICAgICAgICBwdWJsaWMgVVJMIGxvYWRHcm9vdnlTb3VyY2UoZmluYWwgU3RyaW5nIGZpbGVuYW1lKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFVSTCBmaWxlID0gKFVSTCkgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRTb3VyY2VGaWxlKGZpbGVuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHJldHVybiBmaWxlOworICAgICAgICB9CisgICAgfTsKKworICAgIC8qKgorICAgICAqIGNyZWF0ZXMgYSBHcm9vdnlDbGFzc0xvYWRlciB1c2luZyB0aGUgY3VycmVudCBUaHJlYWQncyBjb250ZXh0CisgICAgICogQ2xhc3MgbG9hZGVyIGFzIHBhcmVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgR3Jvb3Z5Q2xhc3NMb2FkZXIoKSB7CisgICAgICAgIHRoaXMoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogY3JlYXRlcyBhIEdyb292eUNsYXNzTG9hZGVyIHVzaW5nIHRoZSBnaXZlbiBDbGFzc0xvYWRlciBhcyBwYXJlbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgR3Jvb3Z5Q2xhc3NMb2FkZXIoQ2xhc3NMb2FkZXIgbG9hZGVyKSB7CisgICAgICAgIHRoaXMobG9hZGVyLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjcmVhdGVzIGEgR3Jvb3Z5Q2xhc3NMb2FkZXIgdXNpbmcgdGhlIGdpdmVuIEdyb292eUNsYXNzTG9hZGVyIGFzIHBhcmVudC4KKyAgICAgKiBUaGlzIGxvYWRlciB3aWxsIGdldCB0aGUgcGFyZW50J3MgQ29tcGlsZXJDb25maWd1cmF0aW9uCisgICAgICovCisgICAgcHVibGljIEdyb292eUNsYXNzTG9hZGVyKEdyb292eUNsYXNzTG9hZGVyIHBhcmVudCkgeworICAgICAgICB0aGlzKHBhcmVudCwgcGFyZW50LmNvbmZpZywgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGNyZWF0ZXMgYSBHcm9vdnlDbGFzc0xhb2Rlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnQgICAgICAgICAgICAgICAgICAgIHRoZSBwYXJ0ZW4gY2xhc3MgbG9hZGVyCisgICAgICogQHBhcmFtIGNvbmZpZyAgICAgICAgICAgICAgICAgICAgdGhlIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24KKyAgICAgKiBAcGFyYW0gdXNlQ29uZmlndXJhdGlvbkNsYXNzcGF0aCBkZXRlcm1pbmVzIGlmIHRoZSBjb25maWd1cmF0aW9ucyBjbGFzc3BhdGggc2hvdWxkIGJlIGFkZGVkCisgICAgICovCisgICAgcHVibGljIEdyb292eUNsYXNzTG9hZGVyKENsYXNzTG9hZGVyIHBhcmVudCwgQ29tcGlsZXJDb25maWd1cmF0aW9uIGNvbmZpZywgYm9vbGVhbiB1c2VDb25maWd1cmF0aW9uQ2xhc3NwYXRoKSB7CisgICAgICAgIHN1cGVyKG5ldyBVUkxbMF0sIHBhcmVudCk7CisgICAgICAgIGlmIChjb25maWcgPT0gbnVsbCkgY29uZmlnID0gQ29tcGlsZXJDb25maWd1cmF0aW9uLkRFRkFVTFQ7CisgICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnOworICAgICAgICBpZiAodXNlQ29uZmlndXJhdGlvbkNsYXNzcGF0aCkgeworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGNvbmZpZy5nZXRDbGFzc3BhdGgoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSAoU3RyaW5nKSBpdC5uZXh0KCk7CisgICAgICAgICAgICAgICAgdGhpcy5hZGRDbGFzc3BhdGgocGF0aCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjcmVhdGVzIGEgR3Jvb3Z5Q2xhc3NMb2FkZXIgdXNpbmcgdGhlIGdpdmVuIENsYXNzTG9hZGVyIGFzIHBhcmVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgR3Jvb3Z5Q2xhc3NMb2FkZXIoQ2xhc3NMb2FkZXIgbG9hZGVyLCBDb21waWxlckNvbmZpZ3VyYXRpb24gY29uZmlnKSB7CisgICAgICAgIHRoaXMobG9hZGVyLCBjb25maWcsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJlc291cmNlTG9hZGVyKEdyb292eVJlc291cmNlTG9hZGVyIHJlc291cmNlTG9hZGVyKSB7CisgICAgICAgIGlmIChyZXNvdXJjZUxvYWRlciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZXNvdXJjZSBsb2FkZXIgbXVzdCBub3QgYmUgbnVsbCEiKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnJlc291cmNlTG9hZGVyID0gcmVzb3VyY2VMb2FkZXI7CisgICAgfQorCisgICAgcHVibGljIEdyb292eVJlc291cmNlTG9hZGVyIGdldFJlc291cmNlTG9hZGVyKCkgeworICAgICAgICByZXR1cm4gcmVzb3VyY2VMb2FkZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9hZHMgdGhlIGdpdmVuIGNsYXNzIG5vZGUgcmV0dXJuaW5nIHRoZSBpbXBsZW1lbnRhdGlvbiBDbGFzcworICAgICAqCisgICAgICogQHBhcmFtIGNsYXNzTm9kZQorICAgICAqIEByZXR1cm4gYSBjbGFzcworICAgICAqIEBkZXByZWNhdGVkCisgICAgICovCisgICAgcHVibGljIENsYXNzIGRlZmluZUNsYXNzKENsYXNzTm9kZSBjbGFzc05vZGUsIFN0cmluZyBmaWxlKSB7CisgICAgICAgIC8vcmV0dXJuIGRlZmluZUNsYXNzKGNsYXNzTm9kZSwgZmlsZSwgIi9ncm9vdnkvZGVmaW5lQ2xhc3MiKTsKKyAgICAgICAgdGhyb3cgbmV3IERlcHJlY2F0aW9uRXhjZXB0aW9uKCJ0aGUgbWV0aG9kIEdyb292eUNsYXNzTG9hZGVyI2RlZmluZUNsYXNzKENsYXNzTm9kZSwgU3RyaW5nKSBpcyBubyBsb25nZXIgdXNlZCBhbmQgcmVtb3ZlZCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvYWRzIHRoZSBnaXZlbiBjbGFzcyBub2RlIHJldHVybmluZyB0aGUgaW1wbGVtZW50YXRpb24gQ2xhc3MuCisgICAgICogPHAvPgorICAgICAqIFdBUk5JTkc6IHRoaXMgY29tcGlsYXRpb24gaXMgbm90IHN5bmNocm9uaXplZAorICAgICAqCisgICAgICogQHBhcmFtIGNsYXNzTm9kZQorICAgICAqIEByZXR1cm4gYSBjbGFzcworICAgICAqLworICAgIHB1YmxpYyBDbGFzcyBkZWZpbmVDbGFzcyhDbGFzc05vZGUgY2xhc3NOb2RlLCBTdHJpbmcgZmlsZSwgU3RyaW5nIG5ld0NvZGVCYXNlKSB7CisgICAgICAgIENvZGVTb3VyY2UgY29kZVNvdXJjZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb2RlU291cmNlID0gbmV3IENvZGVTb3VyY2UobmV3IFVSTCgiZmlsZSIsICIiLCBuZXdDb2RlQmFzZSksIChqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVbXSkgbnVsbCk7CisgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvL3N3YWxsb3cKKyAgICAgICAgfQorCisgICAgICAgIENvbXBpbGF0aW9uVW5pdCB1bml0ID0gY3JlYXRlQ29tcGlsYXRpb25Vbml0KGNvbmZpZywgY29kZVNvdXJjZSk7CisgICAgICAgIENsYXNzQ29sbGVjdG9yIGNvbGxlY3RvciA9IGNyZWF0ZUNvbGxlY3Rvcih1bml0LCBjbGFzc05vZGUuZ2V0TW9kdWxlKCkuZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHVuaXQuYWRkQ2xhc3NOb2RlKGNsYXNzTm9kZSk7CisgICAgICAgICAgICB1bml0LnNldENsYXNzZ2VuQ2FsbGJhY2soY29sbGVjdG9yKTsKKyAgICAgICAgICAgIHVuaXQuY29tcGlsZShQaGFzZXMuQ0xBU1NfR0VORVJBVElPTik7CisKKyAgICAgICAgICAgIHJldHVybiBjb2xsZWN0b3IuZ2VuZXJhdGVkQ2xhc3M7CisgICAgICAgIH0gY2F0Y2ggKENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2VzIHRoZSBnaXZlbiBmaWxlIGludG8gYSBKYXZhIGNsYXNzIGNhcGFibGUgb2YgYmVpbmcgcnVuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZSB0aGUgZmlsZSBuYW1lIHRvIHBhcnNlCisgICAgICogQHJldHVybiB0aGUgbWFpbiBjbGFzcyBkZWZpbmVkIGluIHRoZSBnaXZlbiBzY3JpcHQKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3MgcGFyc2VDbGFzcyhGaWxlIGZpbGUpIHRocm93cyBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gcGFyc2VDbGFzcyhuZXcgR3Jvb3Z5Q29kZVNvdXJjZShmaWxlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2VzIHRoZSBnaXZlbiB0ZXh0IGludG8gYSBKYXZhIGNsYXNzIGNhcGFibGUgb2YgYmVpbmcgcnVuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGV4dCAgICAgdGhlIHRleHQgb2YgdGhlIHNjcmlwdC9jbGFzcyB0byBwYXJzZQorICAgICAqIEBwYXJhbSBmaWxlTmFtZSB0aGUgZmlsZSBuYW1lIHRvIHVzZSBhcyB0aGUgbmFtZSBvZiB0aGUgY2xhc3MKKyAgICAgKiBAcmV0dXJuIHRoZSBtYWluIGNsYXNzIGRlZmluZWQgaW4gdGhlIGdpdmVuIHNjcmlwdAorICAgICAqLworICAgIHB1YmxpYyBDbGFzcyBwYXJzZUNsYXNzKFN0cmluZyB0ZXh0LCBTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBwYXJzZUNsYXNzKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh0ZXh0LmdldEJ5dGVzKCkpLCBmaWxlTmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2VzIHRoZSBnaXZlbiB0ZXh0IGludG8gYSBKYXZhIGNsYXNzIGNhcGFibGUgb2YgYmVpbmcgcnVuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGV4dCB0aGUgdGV4dCBvZiB0aGUgc2NyaXB0L2NsYXNzIHRvIHBhcnNlCisgICAgICogQHJldHVybiB0aGUgbWFpbiBjbGFzcyBkZWZpbmVkIGluIHRoZSBnaXZlbiBzY3JpcHQKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3MgcGFyc2VDbGFzcyhTdHJpbmcgdGV4dCkgdGhyb3dzIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlQ2xhc3MobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHRleHQuZ2V0Qnl0ZXMoKSksICJzY3JpcHQiICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyAiLmdyb292eSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlcyB0aGUgZ2l2ZW4gY2hhcmFjdGVyIHN0cmVhbSBpbnRvIGEgSmF2YSBjbGFzcyBjYXBhYmxlIG9mIGJlaW5nIHJ1bgorICAgICAqCisgICAgICogQHBhcmFtIGluIGFuIElucHV0U3RyZWFtCisgICAgICogQHJldHVybiB0aGUgbWFpbiBjbGFzcyBkZWZpbmVkIGluIHRoZSBnaXZlbiBzY3JpcHQKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3MgcGFyc2VDbGFzcyhJbnB1dFN0cmVhbSBpbikgdGhyb3dzIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlQ2xhc3MoaW4sIGdlbmVyYXRlU2NyaXB0TmFtZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyBnZW5lcmF0ZVNjcmlwdE5hbWUoKSB7CisgICAgICAgIHNjcmlwdE5hbWVDb3VudGVyKys7CisgICAgICAgIHJldHVybiAic2NyaXB0IiArIHNjcmlwdE5hbWVDb3VudGVyICsgIi5ncm9vdnkiOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzcyBwYXJzZUNsYXNzKGZpbmFsIElucHV0U3RyZWFtIGluLCBmaW5hbCBTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIEZvciBnZW5lcmljIGlucHV0IHN0cmVhbXMsIHByb3ZpZGUgYSBjYXRjaC1hbGwgY29kZWJhc2Ugb2YKKyAgICAgICAgLy8gR3Jvb3Z5U2NyaXB0CisgICAgICAgIC8vIFNlY3VyaXR5IGZvciB0aGVzZSBjbGFzc2VzIGNhbiBiZSBhZG1pbmlzdGVyZWQgdmlhIHBvbGljeSBncmFudHMgd2l0aAorICAgICAgICAvLyBhIGNvZGViYXNlIG9mIGZpbGU6Z3Jvb3Z5LnNjcmlwdAorICAgICAgICBHcm9vdnlDb2RlU291cmNlIGdjcyA9IChHcm9vdnlDb2RlU291cmNlKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgR3Jvb3Z5Q29kZVNvdXJjZShpbiwgZmlsZU5hbWUsICIvZ3Jvb3Z5L3NjcmlwdCIpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIHBhcnNlQ2xhc3MoZ2NzKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBDbGFzcyBwYXJzZUNsYXNzKEdyb292eUNvZGVTb3VyY2UgY29kZVNvdXJjZSkgdGhyb3dzIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlQ2xhc3MoY29kZVNvdXJjZSwgY29kZVNvdXJjZS5pc0NhY2hhYmxlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlcyB0aGUgZ2l2ZW4gY29kZSBzb3VyY2UgaW50byBhIEphdmEgY2xhc3MuIElmIHRoZXJlIGlzIGEgY2xhc3MgZmlsZQorICAgICAqIGZvciB0aGUgZ2l2ZW4gY29kZSBzb3VyY2UsIHRoZW4gbm8gcGFyc2luZyBpcyBkb25lLCBpbnN0ZWFkIHRoZSBjYWNoZWQgY2xhc3MgaXMgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2hvdWxkQ2FjaGVTb3VyY2UgaWYgdHJ1ZSB0aGVuIHRoZSBnZW5lcmF0ZWQgY2xhc3Mgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIHNvdXJjZSBjYWNoZQorICAgICAqIEByZXR1cm4gdGhlIG1haW4gY2xhc3MgZGVmaW5lZCBpbiB0aGUgZ2l2ZW4gc2NyaXB0CisgICAgICovCisgICAgcHVibGljIENsYXNzIHBhcnNlQ2xhc3MoR3Jvb3Z5Q29kZVNvdXJjZSBjb2RlU291cmNlLCBib29sZWFuIHNob3VsZENhY2hlU291cmNlKSB0aHJvd3MgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24geworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIENsYXNzIGFuc3dlciA9IChDbGFzcykgc291cmNlQ2FjaGUuZ2V0KGNvZGVTb3VyY2UuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIGlmIChhbnN3ZXIgIT0gbnVsbCkgcmV0dXJuIGFuc3dlcjsKKworICAgICAgICAgICAgLy8gV2FzIG5laXRoZXIgYWxyZWFkeSBsb2FkZWQgbm9yIGNvbXBpbGluZywgc28gY29tcGlsZSBhbmQgYWRkIHRvCisgICAgICAgICAgICAvLyBjYWNoZS4KKyAgICAgICAgICAgIENvbXBpbGF0aW9uVW5pdCB1bml0ID0gY3JlYXRlQ29tcGlsYXRpb25Vbml0KGNvbmZpZywgY29kZVNvdXJjZS5nZXRDb2RlU291cmNlKCkpOworICAgICAgICAgICAgU291cmNlVW5pdCBzdSA9IG51bGw7CisgICAgICAgICAgICBpZiAoY29kZVNvdXJjZS5nZXRGaWxlKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHN1ID0gdW5pdC5hZGRTb3VyY2UoY29kZVNvdXJjZS5nZXROYW1lKCksIGNvZGVTb3VyY2UuZ2V0SW5wdXRTdHJlYW0oKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN1ID0gdW5pdC5hZGRTb3VyY2UoY29kZVNvdXJjZS5nZXRGaWxlKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDbGFzc0NvbGxlY3RvciBjb2xsZWN0b3IgPSBjcmVhdGVDb2xsZWN0b3IodW5pdCwgc3UpOworICAgICAgICAgICAgdW5pdC5zZXRDbGFzc2dlbkNhbGxiYWNrKGNvbGxlY3Rvcik7CisgICAgICAgICAgICBpbnQgZ29hbFBoYXNlID0gUGhhc2VzLkNMQVNTX0dFTkVSQVRJT047CisgICAgICAgICAgICBpZiAoY29uZmlnICE9IG51bGwgJiYgY29uZmlnLmdldFRhcmdldERpcmVjdG9yeSgpICE9IG51bGwpIGdvYWxQaGFzZSA9IFBoYXNlcy5PVVRQVVQ7CisgICAgICAgICAgICB1bml0LmNvbXBpbGUoZ29hbFBoYXNlKTsKKworICAgICAgICAgICAgYW5zd2VyID0gY29sbGVjdG9yLmdlbmVyYXRlZENsYXNzOworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdG9yLmdldExvYWRlZENsYXNzZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBDbGFzcyBjbGF6eiA9IChDbGFzcykgaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgc2V0Q2xhc3NDYWNoZUVudHJ5KGNsYXp6KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzaG91bGRDYWNoZVNvdXJjZSkgc291cmNlQ2FjaGUucHV0KGNvZGVTb3VyY2UuZ2V0TmFtZSgpLCBhbnN3ZXIpOworICAgICAgICAgICAgcmV0dXJuIGFuc3dlcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGdldHMgdGhlIGN1cnJlbnRseSB1c2VkIGNsYXNzcGF0aC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBTdHJpbmdbXSBjb250YWluaW5nIHRoZSBmaWxlIGluZm9ybWF0aW9uIG9mIHRoZSB1cmxzCisgICAgICogQHNlZSAjZ2V0VVJMcygpCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZ1tdIGdldENsYXNzUGF0aCgpIHsKKyAgICAgICAgLy93b3JrYXJvdW5kIGZvciBHcm9vdnktODM1CisgICAgICAgIFVSTFtdIHVybHMgPSBnZXRVUkxzKCk7CisgICAgICAgIFN0cmluZ1tdIHJldCA9IG5ldyBTdHJpbmdbdXJscy5sZW5ndGhdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJldC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgcmV0W2ldID0gdXJsc1tpXS5nZXRGaWxlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBleHBhbmRzIHRoZSBjbGFzc3BhdGgKKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoTGlzdCAgYW4gZW1wdHkgbGlzdCB0aGF0IHdpbGwgY29udGFpbiB0aGUgZWxlbWVudHMgb2YgdGhlIGNsYXNzcGF0aAorICAgICAqIEBwYXJhbSBjbGFzc3BhdGggdGhlIGNsYXNzcGF0aCBzcGVjaWZpZWQgYXMgYSBzaW5nbGUgc3RyaW5nCisgICAgICogQGRlcHJlY2F0ZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBleHBhbmRDbGFzc1BhdGgoTGlzdCBwYXRoTGlzdCwgU3RyaW5nIGJhc2UsIFN0cmluZyBjbGFzc3BhdGgsIGJvb2xlYW4gaXNNYW5pZmVzdENsYXNzcGF0aCkgeworICAgICAgICB0aHJvdyBuZXcgRGVwcmVjYXRpb25FeGNlcHRpb24oInRoZSBtZXRob2QgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5Q2xhc3NMb2FkZXIjZXhwYW5kQ2xhc3NQYXRoKExpc3QsU3RyaW5nLFN0cmluZyxib29sZWFuKSBpcyBubyBsb25nZXIgdXNlZCBpbnRlcm5hbGx5IGFuZCByZW1vdmVkIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBoZWxwZXIgbWV0aG9kIHRvIGFsbG93IGJ5dGVjb2RlIHRvIGJlIGxvYWRlZC4gc3BnIGNoYW5nZWQgbmFtZSB0bworICAgICAqIGRlZmluZUNsYXNzIHRvIG1ha2UgaXQgbW9yZSBjb25zaXN0ZW50IHdpdGggb3RoZXIgQ2xhc3NMb2FkZXIgbWV0aG9kcworICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ2xhc3MgZGVmaW5lQ2xhc3MoU3RyaW5nIG5hbWUsIGJ5dGVbXSBieXRlY29kZSwgUHJvdGVjdGlvbkRvbWFpbiBkb21haW4pIHsKKyAgICAgICAgdGhyb3cgbmV3IERlcHJlY2F0aW9uRXhjZXB0aW9uKCJ0aGUgbWV0aG9kIGdyb292eS5sYW5nLkdyb292eUNsYXNzTG9hZGVyI2RlZmluZUNsYXNzKFN0cmluZyxieXRlW10sUHJvdGVjdGlvbkRvbWFpbikgaXMgbm8gbG9uZ2VyIHVzZWQgaW50ZXJuYWxseSBhbmQgcmVtb3ZlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW5uZXJMb2FkZXIgZXh0ZW5kcyBHcm9vdnlDbGFzc0xvYWRlciB7CisgICAgICAgIHByaXZhdGUgZmluYWwgR3Jvb3Z5Q2xhc3NMb2FkZXIgZGVsZWdhdGU7CisKKyAgICAgICAgcHVibGljIElubmVyTG9hZGVyKEdyb292eUNsYXNzTG9hZGVyIGRlbGVnYXRlKSB7CisgICAgICAgICAgICBzdXBlcihkZWxlZ2F0ZSk7CisgICAgICAgICAgICB0aGlzLmRlbGVnYXRlID0gZGVsZWdhdGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBhZGRDbGFzc3BhdGgoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgICAgIGRlbGVnYXRlLmFkZENsYXNzcGF0aChwYXRoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyQ2FjaGUoKSB7CisgICAgICAgICAgICBkZWxlZ2F0ZS5jbGVhckNhY2hlKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVVJMIGZpbmRSZXNvdXJjZShTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmZpbmRSZXNvdXJjZShuYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBmaW5kUmVzb3VyY2VzKFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmZpbmRSZXNvdXJjZXMobmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ2xhc3NbXSBnZXRMb2FkZWRDbGFzc2VzKCkgeworICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldExvYWRlZENsYXNzZXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBVUkwgZ2V0UmVzb3VyY2UoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRSZXNvdXJjZShuYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRSZXNvdXJjZUFzU3RyZWFtKFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0UmVzb3VyY2VBc1N0cmVhbShuYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBHcm9vdnlSZXNvdXJjZUxvYWRlciBnZXRSZXNvdXJjZUxvYWRlcigpIHsKKyAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRSZXNvdXJjZUxvYWRlcigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFVSTFtdIGdldFVSTHMoKSB7CisgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0VVJMcygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENsYXNzIGxvYWRDbGFzcyhTdHJpbmcgbmFtZSwgYm9vbGVhbiBsb29rdXBTY3JpcHRGaWxlcywgYm9vbGVhbiBwcmVmZXJDbGFzc092ZXJTY3JpcHQsIGJvb2xlYW4gcmVzb2x2ZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIENsYXNzIGMgPSBmaW5kTG9hZGVkQ2xhc3MobmFtZSk7CisgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSByZXR1cm4gYzsKKyAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5sb2FkQ2xhc3MobmFtZSwgbG9va3VwU2NyaXB0RmlsZXMsIHByZWZlckNsYXNzT3ZlclNjcmlwdCwgcmVzb2x2ZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ2xhc3MgcGFyc2VDbGFzcyhHcm9vdnlDb2RlU291cmNlIGNvZGVTb3VyY2UsIGJvb2xlYW4gc2hvdWxkQ2FjaGUpIHRocm93cyBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUucGFyc2VDbGFzcyhjb2RlU291cmNlLCBzaG91bGRDYWNoZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUxvYWRlcihHcm9vdnlSZXNvdXJjZUxvYWRlciByZXNvdXJjZUxvYWRlcikgeworICAgICAgICAgICAgZGVsZWdhdGUuc2V0UmVzb3VyY2VMb2FkZXIocmVzb3VyY2VMb2FkZXIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYWRkVVJMKFVSTCB1cmwpIHsKKyAgICAgICAgICAgIGRlbGVnYXRlLmFkZFVSTCh1cmwpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogY3JlYXRlcyBhIG5ldyBDb21waWxhdGlvblVuaXQuIElmIHlvdSB3YW50IHRvIGFkZCBhZGRpdGlvbmFsCisgICAgICogcGhhc2Ugb3BlcmF0aW9ucyB0byB0aGUgQ29tcGlsYXRpb25Vbml0IChmb3IgZXhhbXBsZSB0byBpbmplY3QKKyAgICAgKiBhZGRpdGlvbmFsIG1ldGhvZHMsIHZhcmlhYmxlcywgZmllbGRzKSwgdGhlbiB5b3Ugc2hvdWxkIG92ZXJ3cml0ZQorICAgICAqIHRoaXMgbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbmZpZyB0aGUgY29tcGlsZXIgY29uZmlndXJhdGlvbiwgdXN1YWxseSB0aGUgc2FtZSBhcyBmb3IgdGhpcyBjbGFzcyBsb2FkZXIKKyAgICAgKiBAcGFyYW0gc291cmNlIHRoZSBzb3VyY2UgY29udGFpbmluZyB0aGUgaW5pdGlhbCBmaWxlIHRvIGNvbXBpbGUsIG1vcmUgZmlsZXMgbWF5IGZvbGxvdyBkdXJpbmcgY29tcGlsYXRpb24KKyAgICAgKiBAcmV0dXJuIHRoZSBDb21waWxhdGlvblVuaXQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29tcGlsYXRpb25Vbml0IGNyZWF0ZUNvbXBpbGF0aW9uVW5pdChDb21waWxlckNvbmZpZ3VyYXRpb24gY29uZmlnLCBDb2RlU291cmNlIHNvdXJjZSkgeworICAgICAgICByZXR1cm4gbmV3IENvbXBpbGF0aW9uVW5pdChjb25maWcsIHNvdXJjZSwgdGhpcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogY3JlYXRlcyBhIENsYXNzQ29sbGVjdG9yIGZvciBhIG5ldyBjb21waWxhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1bml0IHRoZSBjb21waWxhdGlvblVuaXQKKyAgICAgKiBAcGFyYW0gc3UgICB0aGUgU29ydWNlVW5pdAorICAgICAqIEByZXR1cm4gdGhlIENsYXNzQ29sbGVjdG9yCisgICAgICovCisgICAgcHJvdGVjdGVkIENsYXNzQ29sbGVjdG9yIGNyZWF0ZUNvbGxlY3RvcihDb21waWxhdGlvblVuaXQgdW5pdCwgU291cmNlVW5pdCBzdSkgeworICAgICAgICBJbm5lckxvYWRlciBsb2FkZXIgPSAoSW5uZXJMb2FkZXIpIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgeworICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbm5lckxvYWRlcihHcm9vdnlDbGFzc0xvYWRlci50aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBuZXcgQ2xhc3NDb2xsZWN0b3IobG9hZGVyLCB1bml0LCBzdSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDbGFzc0NvbGxlY3RvciBleHRlbmRzIENvbXBpbGF0aW9uVW5pdC5DbGFzc2dlbkNhbGxiYWNrIHsKKyAgICAgICAgcHJpdmF0ZSBDbGFzcyBnZW5lcmF0ZWRDbGFzczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBHcm9vdnlDbGFzc0xvYWRlciBjbDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTb3VyY2VVbml0IHN1OworICAgICAgICBwcml2YXRlIGZpbmFsIENvbXBpbGF0aW9uVW5pdCB1bml0OworICAgICAgICBwcml2YXRlIGZpbmFsIENvbGxlY3Rpb24gbG9hZGVkQ2xhc3NlczsKKworICAgICAgICBwcm90ZWN0ZWQgQ2xhc3NDb2xsZWN0b3IoSW5uZXJMb2FkZXIgY2wsIENvbXBpbGF0aW9uVW5pdCB1bml0LCBTb3VyY2VVbml0IHN1KSB7CisgICAgICAgICAgICB0aGlzLmNsID0gY2w7CisgICAgICAgICAgICB0aGlzLnVuaXQgPSB1bml0OworICAgICAgICAgICAgdGhpcy5sb2FkZWRDbGFzc2VzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgdGhpcy5zdSA9IHN1OworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIEdyb292eUNsYXNzTG9hZGVyIGdldERlZmluaW5nQ2xhc3NMb2FkZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gY2w7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgQ2xhc3MgY3JlYXRlQ2xhc3MoYnl0ZVtdIGNvZGUsIENsYXNzTm9kZSBjbGFzc05vZGUpIHsKKyAgICAgICAgICAgIEdyb292eUNsYXNzTG9hZGVyIGNsID0gZ2V0RGVmaW5pbmdDbGFzc0xvYWRlcigpOworICAgICAgICAgICAgQ2xhc3MgdGhlQ2xhc3MgPSBjbC5kZWZpbmVDbGFzcyhjbGFzc05vZGUuZ2V0TmFtZSgpLCBjb2RlLCAwLCBjb2RlLmxlbmd0aCwgdW5pdC5nZXRBU1QoKS5nZXRDb2RlU291cmNlKCkpOworICAgICAgICAgICAgLy9jbC5yZXNvbHZlQ2xhc3ModGhlQ2xhc3MpOworICAgICAgICAgICAgdGhpcy5sb2FkZWRDbGFzc2VzLmFkZCh0aGVDbGFzcyk7CisKKyAgICAgICAgICAgIGlmIChnZW5lcmF0ZWRDbGFzcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgTW9kdWxlTm9kZSBtbiA9IGNsYXNzTm9kZS5nZXRNb2R1bGUoKTsKKyAgICAgICAgICAgICAgICBTb3VyY2VVbml0IG1zdSA9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKG1uICE9IG51bGwpIG1zdSA9IG1uLmdldENvbnRleHQoKTsKKyAgICAgICAgICAgICAgICBDbGFzc05vZGUgbWFpbiA9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKG1uICE9IG51bGwpIG1haW4gPSAoQ2xhc3NOb2RlKSBtbi5nZXRDbGFzc2VzKCkuZ2V0KDApOworICAgICAgICAgICAgICAgIGlmIChtc3UgPT0gc3UgJiYgbWFpbiA9PSBjbGFzc05vZGUpIGdlbmVyYXRlZENsYXNzID0gdGhlQ2xhc3M7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiB0aGVDbGFzczsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBDbGFzcyBvbkNsYXNzTm9kZShDbGFzc1dyaXRlciBjbGFzc1dyaXRlciwgQ2xhc3NOb2RlIGNsYXNzTm9kZSkgeworICAgICAgICAgICAgYnl0ZVtdIGNvZGUgPSBjbGFzc1dyaXRlci50b0J5dGVBcnJheSgpOworICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUNsYXNzKGNvZGUsIGNsYXNzTm9kZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjYWxsKENsYXNzVmlzaXRvciBjbGFzc1dyaXRlciwgQ2xhc3NOb2RlIGNsYXNzTm9kZSkgeworICAgICAgICAgICAgb25DbGFzc05vZGUoKENsYXNzV3JpdGVyKSBjbGFzc1dyaXRlciwgY2xhc3NOb2RlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldExvYWRlZENsYXNzZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkZWRDbGFzc2VzOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogb3BlbiB1cCB0aGUgc3VwZXIgY2xhc3MgZGVmaW5lIHRoYXQgdGFrZXMgcmF3IGJ5dGVzCisgICAgICovCisgICAgcHVibGljIENsYXNzIGRlZmluZUNsYXNzKFN0cmluZyBuYW1lLCBieXRlW10gYikgeworICAgICAgICByZXR1cm4gc3VwZXIuZGVmaW5lQ2xhc3MobmFtZSwgYiwgMCwgYi5sZW5ndGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGxvYWRzIGEgY2xhc3MgZnJvbSBhIGZpbGUgb3IgYSBwYXJlbnQgY2xhc3Nsb2FkZXIuCisgICAgICogVGhpcyBtZXRob2QgZG9lcyBjYWxsIGxvYWRDbGFzcyhTdHJpbmcsIGJvb2xlYW4sIGJvb2xlYW4sIGJvb2xlYW4pCisgICAgICogd2l0aCB0aGUgbGFzdCBwYXJhbWV0ZXIgc2V0IHRvIGZhbHNlLgorICAgICAqCisgICAgICogQHRocm93cyBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbiBpZiBjb21waWxhdGlvbiB3YXMgbm90IHN1Y2Nlc3NmdWwKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3MgbG9hZENsYXNzKGZpbmFsIFN0cmluZyBuYW1lLCBib29sZWFuIGxvb2t1cFNjcmlwdEZpbGVzLCBib29sZWFuIHByZWZlckNsYXNzT3ZlclNjcmlwdCkKKyAgICAgICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBsb2FkQ2xhc3MobmFtZSwgbG9va3VwU2NyaXB0RmlsZXMsIHByZWZlckNsYXNzT3ZlclNjcmlwdCwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldHMgYSBjbGFzcyBmcm9tIHRoZSBjbGFzcyBjYWNoZS4gVGhpcyBjYWNoZSBjb250YWlucyBvbmx5IGNsYXNzZXMgbG9hZGVkIHRocm91Z2gKKyAgICAgKiB0aGlzIGNsYXNzIGxvYWRlciBvciBhbiBJbm5lckxvYWRlciBpbnN0YW5jZS4gSWYgbm8gY2xhc3MgaXMgc3RvcmVkIGZvciBhCisgICAgICogc3BlY2lmaWMgbmFtZSwgdGhlbiB0aGUgbWV0aG9kIHNob3VsZCByZXR1cm4gbnVsbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIG9mIHRoZSBjbGFzcworICAgICAqIEByZXR1cm4gdGhlIGNsYXNzIHN0b3JlZCBmb3IgdGhlIGdpdmVuIG5hbWUKKyAgICAgKiBAc2VlICNyZW1vdmVDbGFzc0NhY2hlRW50cnkoU3RyaW5nKQorICAgICAqIEBzZWUgI3NldENsYXNzQ2FjaGVFbnRyeShDbGFzcykKKyAgICAgKiBAc2VlICNjbGVhckNhY2hlKCkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ2xhc3MgZ2V0Q2xhc3NDYWNoZUVudHJ5KFN0cmluZyBuYW1lKSB7CisgICAgICAgIGlmIChuYW1lID09IG51bGwpIHJldHVybiBudWxsOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIHJldHVybiAoQ2xhc3MpIGNsYXNzQ2FjaGUuZ2V0KG5hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogc2V0cyBhbiBlbnRyeSBpbiB0aGUgY2xhc3MgY2FjaGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xzIHRoZSBjbGFzcworICAgICAqIEBzZWUgI3JlbW92ZUNsYXNzQ2FjaGVFbnRyeShTdHJpbmcpCisgICAgICogQHNlZSAjZ2V0Q2xhc3NDYWNoZUVudHJ5KFN0cmluZykKKyAgICAgKiBAc2VlICNjbGVhckNhY2hlKCkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRDbGFzc0NhY2hlRW50cnkoQ2xhc3MgY2xzKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgY2xhc3NDYWNoZS5wdXQoY2xzLmdldE5hbWUoKSwgY2xzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHJlbW92ZXMgYSBjbGFzcyBmcm9tIHRoZSBjbGFzcyBjYWNoZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIG9mIHRoZSBjbGFzcworICAgICAqIEBzZWUgI2dldENsYXNzQ2FjaGVFbnRyeShTdHJpbmcpCisgICAgICogQHNlZSAjc2V0Q2xhc3NDYWNoZUVudHJ5KENsYXNzKQorICAgICAqIEBzZWUgI2NsZWFyQ2FjaGUoKQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHJlbW92ZUNsYXNzQ2FjaGVFbnRyeShTdHJpbmcgbmFtZSkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGNsYXNzQ2FjaGUucmVtb3ZlKG5hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkcyBhIFVSTCB0byB0aGUgY2xhc3Nsb2FkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJsIHRoZSBuZXcgY2xhc3NwYXRoIGVsZW1lbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRVUkwoVVJMIHVybCkgeworICAgICAgICBzdXBlci5hZGRVUkwodXJsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgaWYgYSBjbGFzcyBpcyByZWNvbXBpbGFibGUuIFJlY29tcGlsZWFibGUgbWVhbnMsIHRoYXQgdGhlIGNsYXNzbG9hZGVyCisgICAgICogd2lsbCB0cnkgdG8gbG9jYXRlIGEgZ3Jvb3Z5IHNvdXJjZSBmaWxlIGZvciB0aGlzIGNsYXNzIGFuZCB0aGVuIGNvbXBpbGUgaXQgYWdhaW4sCisgICAgICogYWRkaW5nIHRoZSByZXN1bHRpbmcgY2xhc3MgYXMgZW50cnkgdG8gdGhlIGNhY2hlLiBHaXZpbmcgbnVsbCBhcyBjbGFzcyBpcyBsaWtlIGEKKyAgICAgKiByZWNvbXBpbGF0aW9uLCBzbyB0aGUgbWV0aG9kIHNob3VsZCBhbHdheXMgcmV0dXJuIHRydWUgaGVyZS4gT25seSBjbGFzc2VzIHRoYXQgYXJlCisgICAgICogaW1wbGVtZW50aW5nIEdyb292eU9iamVjdCBhcmUgY29tcGlsZWFibGUgYW5kIG9ubHkgaWYgdGhlIHRpbWVzdGFtcCBpbiB0aGUgY2xhc3MKKyAgICAgKiBpcyBsb3dlciB0aGFuIExvbmcuTUFYX1ZBTFVFLgorICAgICAqIDxwLz4KKyAgICAgKiBOT1RFOiBGaXJzdCB0aGUgcGFyZW50IGxvYWRlcnMgd2lsbCBiZSBhc2tlZCBhbmQgb25seSBpZiB0aGV5IGRvbid0IHJldHVybiBhCisgICAgICogY2xhc3MgdGhlIHJlY29tcGlsYXRpb24gd2lsbCBoYXBwZW4uIFJlY29tcGlsYXRpb24gYWxzbyBvbmx5IGhhcHBlbiBpZiB0aGUgc291cmNlCisgICAgICogZmlsZSBpcyBuZXdlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbHMgdGhlIGNsYXNzIHRvIGJlIHRlc3RlZC4gSWYgbnVsbCB0aGUgbWV0aG9kIHNob3VsZCByZXR1cm4gdHJ1ZQorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY2xhc3Mgc2hvdWxkIGJlIGNvbXBpbGVkIGFnYWluCisgICAgICogQHNlZSAjaXNTb3VyY2VOZXdlcihVUkwsIENsYXNzKQorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGlzUmVjb21waWxhYmxlKENsYXNzIGNscykgeworICAgICAgICBpZiAoY2xzID09IG51bGwpIHJldHVybiB0cnVlOworICAgICAgICBpZiAocmVjb21waWxlID09IG51bGwgJiYgIWNvbmZpZy5nZXRSZWNvbXBpbGVHcm9vdnlTb3VyY2UoKSkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAocmVjb21waWxlICE9IG51bGwgJiYgIXJlY29tcGlsZS5ib29sZWFuVmFsdWUoKSkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIUdyb292eU9iamVjdC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNscykpIHJldHVybiBmYWxzZTsKKyAgICAgICAgbG9uZyB0aW1lc3RhbXAgPSBnZXRUaW1lU3RhbXAoY2xzKTsKKyAgICAgICAgaWYgKHRpbWVzdGFtcCA9PSBMb25nLk1BWF9WQUxVRSkgcmV0dXJuIGZhbHNlOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIHNldHMgaWYgdGhlIHJlY29tcGlsYXRpb24gc2hvdWxkIGJlIGVuYWJsZS4gVGhlcmUgYXJlIDMgcG9zc2libGUKKyAgICAgKiB2YWx1ZXMgZm9yIHRoaXMuIEFueSB2YWx1ZSBkaWZmZXJlbnQgdGhhbiBudWxsIG92ZXJyaWRlcyB0aGUKKyAgICAgKiB2YWx1ZSBmcm9tIHRoZSBjb21waWxlciBjb25maWd1cmF0aW9uLiB0cnVlIG1lYW5zIHRvIHJlY29tcGlsZSBpZiBuZWVkZWQKKyAgICAgKiBmYWxzZSBtZWFucyB0byBuZXZlciByZWNvbXBpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbW9kZSB0aGUgcmVjb21waWxhdGlvbiBtb2RlCisgICAgICogQHNlZSBDb21waWxlckNvbmZpZ3VyYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTaG91bGRSZWNvbXBpbGUoQm9vbGVhbiBtb2RlKSB7CisgICAgICAgIHJlY29tcGlsZSA9IG1vZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0cyB0aGUgY3VycmVudGx5IHNldCByZWNvbXBpbGF0aW9uIG1vZGUuIG51bGwgbWVhbnMsIHRoZQorICAgICAqIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gaXMgdXNlZC4gRmFsc2UgbWVhbnMgbm8gcmVjb21waWxhdGlvbiBhbmQKKyAgICAgKiB0cnVlIG1lYW5zIHRoYXQgcmVjb21waWxhdGlvbiB3aWxsIGJlIGRvbmUgaWYgbmVlZGVkLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgcmVjb21waWxhdGlvbiBtb2RlCisgICAgICovCisgICAgcHVibGljIEJvb2xlYW4gaXNTaG91bGRSZWNvbXBpbGUoKSB7CisgICAgICAgIHJldHVybiByZWNvbXBpbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogbG9hZHMgYSBjbGFzcyBmcm9tIGEgZmlsZSBvciBhIHBhcmVudCBjbGFzc2xvYWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lICAgICAgICAgICAgICAgICAgb2YgdGhlIGNsYXNzIHRvIGJlIGxvYWRlZAorICAgICAqIEBwYXJhbSBsb29rdXBTY3JpcHRGaWxlcyAgICAgaWYgZmFsc2Ugbm8gbG9va3VwIGF0IGZpbGVzIGlzIGRvbmUgYXQgYWxsCisgICAgICogQHBhcmFtIHByZWZlckNsYXNzT3ZlclNjcmlwdCBpZiB0cnVlIHRoZSBmaWxlIGxvb2t1cCBpcyBvbmx5IGRvbmUgaWYgdGhlcmUgaXMgbm8gY2xhc3MKKyAgICAgKiBAcGFyYW0gcmVzb2x2ZSAgICAgICAgICAgICAgIEBzZWUgQ2xhc3NMb2FkZXIjbG9hZENsYXNzKGphdmEubGFuZy5TdHJpbmcsIGJvb2xlYW4pCisgICAgICogQHJldHVybiB0aGUgY2xhc3MgZm91bmQgb3IgdGhlIGNsYXNzIGNyZWF0ZWQgZnJvbSBhIGZpbGUgbG9va3VwCisgICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uICAgICBpZiB0aGUgY2xhc3MgY291bGQgbm90IGJlIGZvdW5kCisgICAgICogQHRocm93cyBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbiBpZiB0aGUgc291cmNlIGZpbGUgY291bGQgbm90IGJlIGNvbXBpbGVkCisgICAgICovCisgICAgcHVibGljIENsYXNzIGxvYWRDbGFzcyhmaW5hbCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBsb29rdXBTY3JpcHRGaWxlcywgYm9vbGVhbiBwcmVmZXJDbGFzc092ZXJTY3JpcHQsIGJvb2xlYW4gcmVzb2x2ZSkKKyAgICAgICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGxvb2sgaW50byBjYWNoZQorICAgICAgICBDbGFzcyBjbHMgPSBnZXRDbGFzc0NhY2hlRW50cnkobmFtZSk7CisKKyAgICAgICAgLy8gZW5hYmxlIHJlY29tcGlsYXRpb24/CisgICAgICAgIGJvb2xlYW4gcmVjb21waWxlID0gaXNSZWNvbXBpbGFibGUoY2xzKTsKKyAgICAgICAgaWYgKCFyZWNvbXBpbGUpIHJldHVybiBjbHM7CisKKyAgICAgICAgLy8gY2hlY2sgc2VjdXJpdHkgbWFuYWdlcgorICAgICAgICBTZWN1cml0eU1hbmFnZXIgc20gPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7CisgICAgICAgIGlmIChzbSAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gbmFtZS5yZXBsYWNlKCcvJywgJy4nKTsKKyAgICAgICAgICAgIGludCBpID0gY2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJyk7CisgICAgICAgICAgICBpZiAoaSAhPSAtMSkgeworICAgICAgICAgICAgICAgIHNtLmNoZWNrUGFja2FnZUFjY2VzcyhjbGFzc05hbWUuc3Vic3RyaW5nKDAsIGkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHRyeSBwYXJlbnQgbG9hZGVyCisgICAgICAgIENsYXNzTm90Rm91bmRFeGNlcHRpb24gbGFzdCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDbGFzcyBwYXJlbnRDbGFzc0xvYWRlckNsYXNzID0gc3VwZXIubG9hZENsYXNzKG5hbWUsIHJlc29sdmUpOworICAgICAgICAgICAgLy8gYWx3YXlzIHJldHVybiBpZiB0aGUgcGFyZW50IGxvYWRlciB3YXMgc3VjY2Vzc2Z1bAorICAgICAgICAgICAgaWYgKGNscyAhPSBwYXJlbnRDbGFzc0xvYWRlckNsYXNzKSByZXR1cm4gcGFyZW50Q2xhc3NMb2FkZXJDbGFzczsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjbmZlKSB7CisgICAgICAgICAgICBsYXN0ID0gY25mZTsKKyAgICAgICAgfSBjYXRjaCAoTm9DbGFzc0RlZkZvdW5kRXJyb3IgbmNkZmUpIHsKKyAgICAgICAgICAgIGlmIChuY2RmZS5nZXRNZXNzYWdlKCkuaW5kZXhPZigid3JvbmcgbmFtZSIpID4gMCkgeworICAgICAgICAgICAgICAgIGxhc3QgPSBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbihuYW1lKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmNkZmU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2xzICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIHByZWZlciBjbGFzcyBpZiBubyByZWNvbXBpbGF0aW9uCisgICAgICAgICAgICBwcmVmZXJDbGFzc092ZXJTY3JpcHQgfD0gIXJlY29tcGlsZTsKKyAgICAgICAgICAgIGlmIChwcmVmZXJDbGFzc092ZXJTY3JpcHQpIHJldHVybiBjbHM7CisgICAgICAgIH0KKworICAgICAgICAvLyBhdCB0aGlzIHBvaW50IHRoZSBsb2FkaW5nIGZyb20gYSBwYXJlbnQgbG9hZGVyIGZhaWxlZAorICAgICAgICAvLyBhbmQgd2Ugd2FudCB0byByZWNvbXBpbGUgaWYgbmVlZGVkLgorICAgICAgICBpZiAobG9va3VwU2NyaXB0RmlsZXMpIHsKKyAgICAgICAgICAgIC8vIHN5bmNocm9uaXplIG9uIGNhY2hlLCBhcyB3ZSB3YW50IG9ubHkgb25lIGNvbXBpbGF0aW9uIGF0IHRoZSBzYW1lIHRpbWUKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgICAgIC8vIHRyeSBncm9vdnkgZmlsZQorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHJlY29tcGlsYXRpb24gYWxyZWFkeSBoYXBwZW5lZC4KKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldENsYXNzQ2FjaGVFbnRyeShuYW1lKSAhPSBjbHMpIHJldHVybiBnZXRDbGFzc0NhY2hlRW50cnkobmFtZSk7CisgICAgICAgICAgICAgICAgICAgIFVSTCBzb3VyY2UgPSByZXNvdXJjZUxvYWRlci5sb2FkR3Jvb3Z5U291cmNlKG5hbWUpOworICAgICAgICAgICAgICAgICAgICBjbHMgPSByZWNvbXBpbGUoc291cmNlLCBuYW1lLCBjbHMpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgICAgICBsYXN0ID0gbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24oIklPRXhjZXB0aW9uIHdoaWxlIG9wZW5pbmcgZ3Jvb3Z5IHNvdXJjZTogIiArIG5hbWUsIGlvZSk7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNscyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVDbGFzc0NhY2hlRW50cnkobmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRDbGFzc0NhY2hlRW50cnkoY2xzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChjbHMgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gbm8gY2xhc3MgZm91bmQsIHRoZXJlIHNob3VsZCBoYXZlIGJlZW4gYW4gZXhjZXB0aW9uIGJlZm9yZSBub3cKKyAgICAgICAgICAgIGlmIChsYXN0ID09IG51bGwpIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcih0cnVlKTsKKyAgICAgICAgICAgIHRocm93IGxhc3Q7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNsczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAoUmUpQ29tcGlsZXMgdGhlIGdpdmVuIHNvdXJjZS4KKyAgICAgKiBUaGlzIG1ldGhvZCBzdGFydHMgdGhlIGNvbXBpbGF0aW9uIG9mIGEgZ2l2ZW4gc291cmNlLCBpZgorICAgICAqIHRoZSBzb3VyY2UgaGFzIGNoYW5nZWQgc2luY2UgdGhlIGNsYXNzIHdhcyBjcmVhdGVkLiBGb3IKKyAgICAgKiB0aGlzIGlzU291cmNlTmV3ZXIgaXMgY2FsbGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHNvdXJjZSAgICB0aGUgc291cmNlIHBvaW50ZXIgZm9yIHRoZSBjb21waWxhdGlvbgorICAgICAqIEBwYXJhbSBjbGFzc05hbWUgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRvIGJlIGdlbmVyYXRlZAorICAgICAqIEBwYXJhbSBvbGRDbGFzcyAgYSBwb3NzaWJsZSBmb3JtZXIgY2xhc3MKKyAgICAgKiBAcmV0dXJuIHRoZSBvbGQgY2xhc3MgaWYgdGhlIHNvdXJjZSB3YXNuJ3QgbmV3IGVub3VnaCwgdGhlIG5ldyBjbGFzcyBlbHNlCisgICAgICogQHRocm93cyBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbiBpZiB0aGUgY29tcGlsYXRpb24gZmFpbGVkCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAgICAgICAgICAgICAgICBpZiB0aGUgc291cmNlIGlzIG5vdCByZWFkYWJsZQorICAgICAqIEBzZWUgI2lzU291cmNlTmV3ZXIoVVJMLCBDbGFzcykKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ2xhc3MgcmVjb21waWxlKFVSTCBzb3VyY2UsIFN0cmluZyBjbGFzc05hbWUsIENsYXNzIG9sZENsYXNzKSB0aHJvd3MgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBmb3VuZCBhIHNvdXJjZSwgY29tcGlsZSBpdCBpZiBuZXdlcgorICAgICAgICAgICAgaWYgKChvbGRDbGFzcyAhPSBudWxsICYmIGlzU291cmNlTmV3ZXIoc291cmNlLCBvbGRDbGFzcykpIHx8IChvbGRDbGFzcyA9PSBudWxsKSkgeworICAgICAgICAgICAgICAgIHNvdXJjZUNhY2hlLnJlbW92ZShjbGFzc05hbWUpOworICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUNsYXNzKHNvdXJjZS5vcGVuU3RyZWFtKCksIGNsYXNzTmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG9sZENsYXNzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudGVkIGhlcmUgdG8gY2hlY2sgcGFja2FnZSBhY2Nlc3MgcHJpb3IgdG8gcmV0dXJuaW5nIGFuCisgICAgICogYWxyZWFkeSBsb2FkZWQgY2xhc3MuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uIGlmIHRoZSBjb21waWxhdGlvbiBmYWlsZWQKKyAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gICAgIGlmIHRoZSBjbGFzcyB3YXMgbm90IGZvdW5kCisgICAgICogQHNlZSBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIjbG9hZENsYXNzKGphdmEubGFuZy5TdHJpbmcsIGJvb2xlYW4pCisgICAgICovCisgICAgcHJvdGVjdGVkIENsYXNzIGxvYWRDbGFzcyhmaW5hbCBTdHJpbmcgbmFtZSwgYm9vbGVhbiByZXNvbHZlKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBsb2FkQ2xhc3MobmFtZSwgdHJ1ZSwgZmFsc2UsIHJlc29sdmUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGdldHMgdGhlIHRpbWUgc3RhbXAgb2YgYSBnaXZlbiBjbGFzcy4gRm9yIGdyb292eQorICAgICAqIGdlbmVyYXRlZCBjbGFzc2VzIHRoaXMgdXN1YWxseSBtZWFucyB0byByZXR1cm4gdGhlIHZhbHVlCisgICAgICogb2YgdGhlIHN0YXRpYyBmaWVsZCBfX3RpbWVTdGFtcC4gSWYgdGhlIHBhcmFtZXRlciBkb2Vzbid0CisgICAgICogaGF2ZSBzdWNoIGEgZmllbGQsIHRoZW4gTG9uZy5NQVhfVkFMVUUgaXMgcmV0dXJuZWQKKyAgICAgKgorICAgICAqIEBwYXJhbSBjbHMgdGhlIGNsYXNzCisgICAgICogQHJldHVybiB0aGUgdGltZSBzdGFtcAorICAgICAqLworICAgIHByb3RlY3RlZCBsb25nIGdldFRpbWVTdGFtcChDbGFzcyBjbHMpIHsKKyAgICAgICAgcmV0dXJuIFZlcmlmaWVyLmdldFRpbWVzdGFtcChjbHMpOworICAgIH0KKworICAgIC8qCisgICAgKiBUaGlzIG1ldGhvZCB3aWxsIHRha2UgYSBmaWxlIG5hbWUgYW5kIHRyeSB0byAiZGVjb2RlIiBhbnkgVVJMIGVuY29kZWQgY2hhcmFjdGVycy4gIEZvciBleGFtcGxlCisgICAgKiBpZiB0aGUgZmlsZSBuYW1lIGNvbnRhaW5zIGFueSBzcGFjZXMgdGhpcyBtZXRob2QgY2FsbCB3aWxsIHRha2UgdGhlIHJlc3VsdGluZyAlMjAgZW5jb2RlZCB2YWx1ZXMKKyAgICAqIGFuZCBjb252ZXJ0IHRoZW0gdG8gc3BhY2VzLgorICAgICoKKyAgICAqIFRoaXMgbWV0aG9kIHdhcyBhZGRlZCBzcGVjaWZpY2FsbHkgdG8gZml4IGRlZmVjdDogIEdyb292eS0xNzg3LiAgVGhlIGRlZmVjdCBpbnZvbHZlZCBhIHNpdHVhdGlvbgorICAgICogd2hlcmUgdHdvIHNjcmlwdHMgd2VyZSBzaXR0aW5nIGluIGEgZGlyZWN0b3J5IHdpdGggc3BhY2VzIGluIGl0cyBuYW1lLiAgVGhlIGNvZGUgd291bGQgZmFpbAorICAgICogd2hlbiB0aGUgY2xhc3MgbG9hZGVyIHRyaWVkIHRvIHJlc29sdmUgdGhlIGZpbGUgbmFtZSBhbmQgd291bGQgY2hva2Ugb24gdGhlIFVSTEVuY29kZWQgc3BhY2UgdmFsdWVzLgorICAgICoKKyAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGRlY29kZUZpbGVOYW1lKFN0cmluZyBmaWxlTmFtZSkgeworICAgICAgICBTdHJpbmcgZGVjb2RlZEZpbGUgPSBmaWxlTmFtZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGRlY29kZWRGaWxlID0gVVJMRGVjb2Rlci5kZWNvZGUoZmlsZU5hbWUsICJVVEYtOCIpOworICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRW5jb3VudGVkIGFuIGludmFsaWQgZW5jb2Rpbmcgc2NoZW1lIHdoZW4gdHJ5aW5nIHRvIHVzZSBVUkxEZWNvZGVyLmRlY29kZSgpIGluc2lkZSBvZiB0aGUgR3Jvb3Z5Q2xhc3NMb2FkZXIuZGVjb2RlRmlsZU5hbWUoKSBtZXRob2QuICBSZXR1cm5pbmcgdGhlIHVuZW5jb2RlZCBVUkwuIik7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlBsZWFzZSBub3RlIHRoYXQgaWYgeW91IGVuY291bnRlciB0aGlzIGVycm9yIGFuZCB5b3UgaGF2ZSBzcGFjZXMgaW4geW91ciBkaXJlY3RvcnkgeW91IHdpbGwgcnVuIGludG8gaXNzdWVzLiAgUmVmZXIgdG8gR1JPT1ZZLTE3ODcgZm9yIGRlc2NyaXB0aW9uIG9mIHRoaXMgYnVnLiIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGRlY29kZWRGaWxlOworICAgIH0KKworICAgIHByaXZhdGUgVVJMIGdldFNvdXJjZUZpbGUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gbmFtZS5yZXBsYWNlKCcuJywgJy8nKSArIGNvbmZpZy5nZXREZWZhdWx0U2NyaXB0RXh0ZW5zaW9uKCk7CisgICAgICAgIFVSTCByZXQgPSBnZXRSZXNvdXJjZShmaWxlbmFtZSk7CisgICAgICAgIGlmIChyZXQgIT0gbnVsbCAmJiByZXQuZ2V0UHJvdG9jb2woKS5lcXVhbHMoImZpbGUiKSkgeworICAgICAgICAgICAgU3RyaW5nIGZpbGVXaXRob3V0UGFja2FnZSA9IGZpbGVuYW1lOworICAgICAgICAgICAgaWYgKGZpbGVXaXRob3V0UGFja2FnZS5pbmRleE9mKCcvJykgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBmaWxlV2l0aG91dFBhY2thZ2UubGFzdEluZGV4T2YoJy8nKTsKKyAgICAgICAgICAgICAgICBmaWxlV2l0aG91dFBhY2thZ2UgPSBmaWxlV2l0aG91dFBhY2thZ2Uuc3Vic3RyaW5nKGluZGV4ICsgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGaWxlIHBhdGggPSBuZXcgRmlsZShkZWNvZGVGaWxlTmFtZShyZXQuZ2V0RmlsZSgpKSkuZ2V0UGFyZW50RmlsZSgpOworICAgICAgICAgICAgaWYgKHBhdGguZXhpc3RzKCkgJiYgcGF0aC5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUocGF0aCwgZmlsZVdpdGhvdXRQYWNrYWdlKTsKKyAgICAgICAgICAgICAgICBpZiAoZmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBmaWxlLmV4aXN0cygpIG1pZ2h0IGJlIGNhc2UgaW5zZW5zaXRpdmUuIExldCdzIGRvCisgICAgICAgICAgICAgICAgICAgIC8vIGNhc2Ugc2Vuc2l0aXZlIG1hdGNoIGZvciB0aGUgZmlsZW5hbWUKKyAgICAgICAgICAgICAgICAgICAgRmlsZSBwYXJlbnQgPSBmaWxlLmdldFBhcmVudEZpbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gZmlsZXMgPSBwYXJlbnQubGlzdCgpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGZpbGVzLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZXNbal0uZXF1YWxzKGZpbGVXaXRob3V0UGFja2FnZSkpIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL2ZpbGUgZG9lcyBub3QgZXhpc3QhCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8qKgorICAgICAqIERlY2lkZXMgaWYgdGhlIGdpdmVuIHNvdXJjZSBpcyBuZXdlciB0aGFuIGEgY2xhc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc291cmNlIHRoZSBzb3VyY2Ugd2UgbWF5IHdhbnQgdG8gY29tcGlsZQorICAgICAqIEBwYXJhbSBjbHMgICAgdGhlIGZvcm1lciBjbGFzcworICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc291cmNlIGlzIG5ld2VyLCBmYWxzZSBlbHNlCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBpdCBpcyBub3QgcG9zc2libGUgdG8gb3BlbiBhbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiBmb3IgdGhlIGdpdmVuIHNvdXJjZQorICAgICAqIEBzZWUgI2dldFRpbWVTdGFtcChDbGFzcykKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1NvdXJjZU5ld2VyKFVSTCBzb3VyY2UsIENsYXNzIGNscykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgbG9uZyBsYXN0TW9kOworCisgICAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGZpbGU6Ly8gcHJvdG9jb2wsIGFzIGdldExhc3RNb2RpZmllZCgpIG9mdGVuIHJlcG9ydHMKKyAgICAgICAgLy8gaW5jb3JyZWN0IHJlc3VsdHMgKC0xKQorICAgICAgICBpZiAoc291cmNlLmdldFByb3RvY29sKCkuZXF1YWxzKCJmaWxlIikpIHsKKyAgICAgICAgICAgIC8vIENvZXJjZSB0aGUgZmlsZSBVUkwgdG8gYSBGaWxlCisgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IHNvdXJjZS5nZXRQYXRoKCkucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcikucmVwbGFjZSgnfCcsICc6Jyk7CisgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXRoKTsKKyAgICAgICAgICAgIGxhc3RNb2QgPSBmaWxlLmxhc3RNb2RpZmllZCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgVVJMQ29ubmVjdGlvbiBjb25uID0gc291cmNlLm9wZW5Db25uZWN0aW9uKCk7CisgICAgICAgICAgICBsYXN0TW9kID0gY29ubi5nZXRMYXN0TW9kaWZpZWQoKTsKKyAgICAgICAgICAgIGNvbm4uZ2V0SW5wdXRTdHJlYW0oKS5jbG9zZSgpOworICAgICAgICB9CisgICAgICAgIGxvbmcgY2xhc3NUaW1lID0gZ2V0VGltZVN0YW1wKGNscyk7CisgICAgICAgIHJldHVybiBjbGFzc1RpbWUgKyBjb25maWcuZ2V0TWluaW11bVJlY29tcGlsYXRpb25JbnRlcnZhbCgpIDwgbGFzdE1vZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGRzIGEgY2xhc3NwYXRoIHRvIHRoaXMgY2xhc3Nsb2FkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCBpcyBhIGphciBmaWxlIG9yIGEgZGlyZWN0b3J5LgorICAgICAqIEBzZWUgI2FkZFVSTChVUkwpCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ2xhc3NwYXRoKGZpbmFsIFN0cmluZyBwYXRoKSB7CisgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgeworICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUocGF0aCk7CisgICAgICAgICAgICAgICAgICAgIFVSTCBuZXdVUkwgPSBmLnRvVVJJKCkudG9VUkwoKTsKKyAgICAgICAgICAgICAgICAgICAgVVJMW10gdXJscyA9IGdldFVSTHMoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1cmxzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXJsc1tpXS5lcXVhbHMobmV3VVJMKSkgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYWRkVVJMKG5ld1VSTCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy9UT0RPOiBmYWlsIHRocm91Z2ggPworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+UmV0dXJucyBhbGwgR3Jvb3Z5IGNsYXNzZXMgbG9hZGVkIGJ5IHRoaXMgY2xhc3MgbG9hZGVyLgorICAgICAqCisgICAgICogQHJldHVybiBhbGwgY2xhc3NlcyBsb2FkZWQgYnkgdGhpcyBjbGFzcyBsb2FkZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NbXSBnZXRMb2FkZWRDbGFzc2VzKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGZpbmFsIENvbGxlY3Rpb24gdmFsdWVzID0gY2xhc3NDYWNoZS52YWx1ZXMoKTsKKyAgICAgICAgICAgIHJldHVybiAoQ2xhc3NbXSkgdmFsdWVzLnRvQXJyYXkobmV3IENsYXNzW3ZhbHVlcy5zaXplKCldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHJlbW92ZXMgYWxsIGNsYXNzZXMgZnJvbSB0aGUgY2xhc3MgY2FjaGUuCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRDbGFzc0NhY2hlRW50cnkoU3RyaW5nKQorICAgICAqIEBzZWUgI3NldENsYXNzQ2FjaGVFbnRyeShDbGFzcykKKyAgICAgKiBAc2VlICNyZW1vdmVDbGFzc0NhY2hlRW50cnkoU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsZWFyQ2FjaGUoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgY2xhc3NDYWNoZS5jbGVhcigpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL0dyb292eUNvZGVTb3VyY2UuamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbGFuZy9Hcm9vdnlDb2RlU291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDljMWYzOAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbGFuZy9Hcm9vdnlDb2RlU291cmNlLmphdmEKQEAgLTAsMCArMSwxNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGdyb292eS5sYW5nOworCitpbXBvcnQgZ3Jvb3Z5LnNlY3VyaXR5Lkdyb292eUNvZGVTb3VyY2VQZXJtaXNzaW9uOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuQ29kZVNvdXJjZTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZTsKKworLyoqCisgKiBDb2RlU291cmNlIHdyYXBwZXIgY2xhc3MgdGhhdCBhbGxvd3Mgc3BlY2lmaWMgc2VjdXJpdHkgcG9saWNpZXMgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIGEgY2xhc3MKKyAqIGNvbXBpbGVkIGZyb20gZ3Jvb3Z5IHNvdXJjZS4KKyAqIAorICogQGF1dGhvciBTdGV2ZSBHb2V0emUKKyAqLworcHVibGljIGNsYXNzIEdyb292eUNvZGVTb3VyY2UgeworCQorCS8qKiAKKwkgKiBUaGUgY29kZVNvdXJjZSB0byBiZSBnaXZlbiB0aGUgZ2VuZXJhdGVkIGNsYXNzLiAgVGhpcyBjYW4gYmUgdXNlZCBieSBwb2xpY3kgZmlsZQorCSAqIGdyYW50cyB0byBhZG1pbmlzdGVyIHNlY3VyaXR5LgorCSAqLworCXByaXZhdGUgQ29kZVNvdXJjZSBjb2RlU291cmNlOworCS8qKiBUaGUgbmFtZSBnaXZlbiB0byB0aGUgZ2VuZXJhdGVkIGNsYXNzICovCisJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKwkvKiogVGhlIGdyb292eSBzb3VyY2UgdG8gYmUgY29tcGlsZWQgYW5kIHR1cm5lZCBpbnRvIGEgY2xhc3MgKi8KKwlwcml2YXRlIElucHV0U3RyZWFtIGlucHV0U3RyZWFtOworCS8qKiBUaGUgY2VydGlmaWNhdGVzIHVzZWQgdG8gc2lnbiB0aGUgaXRlbXMgZnJvbSB0aGUgY29kZXNvdXJjZSAqLworCUNlcnRpZmljYXRlW10gY2VydHM7CisgICAgcHJpdmF0ZSBib29sZWFuIGNhY2hhYmxlOworICAgIAorCXByaXZhdGUgRmlsZSBmaWxlOworCQorCXB1YmxpYyBHcm9vdnlDb2RlU291cmNlKFN0cmluZyBzY3JpcHQsIFN0cmluZyBuYW1lLCBTdHJpbmcgY29kZUJhc2UpIHsKKwkJdGhpcyhuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oc2NyaXB0LmdldEJ5dGVzKCkpLCBuYW1lLCBjb2RlQmFzZSk7CisJfQorCQorCS8qKgorCSAqIENvbnN0cnVjdCBhIEdyb292eUNvZGVTb3VyY2UgZm9yIGFuIGlucHV0U3RyZWFtIG9mIGdyb292eUNvZGUgdGhhdCBoYXMgYW4KKwkgKiB1bmtub3duIHByb3ZlbmFuY2UgLS0gbWVhbmluZyBpdCBkaWRuJ3QgY29tZSBmcm9tIGEgRmlsZSBvciBhIFVSTCAoZS5nLiBhIFN0cmluZykuCisJICogVGhlIHN1cHBsaWVkIGNvZGVCYXNlIHdpbGwgYmUgdXNlZCB0byBjb25zdHJ1Y3QgYSBGaWxlIFVSTCB0aGF0IHNob3VsZCBtYXRjaCB1cAorCSAqIHdpdGggYSBqYXZhIFBvbGljeSBlbnRyeSB0aGF0IGRldGVybWluZXMgdGhlIGdyYW50cyB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlCisJICogY2xhc3MgdGhhdCB3aWxsIGJlIGJ1aWx0IGZyb20gdGhlIElucHV0U3RyZWFtLgorCSAqIAorCSAqIFRoZSBwZXJtaXNzaW9uIGdyb292eS5zZWN1cml0eS5Hcm9vdnlDb2RlU291cmNlUGVybWlzc2lvbiB3aWxsIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBnaXZlbiBjb2RlQmFzZQorCSAqIG1heSBiZSBzcGVjaWZpZWQuICBUaGF0IGlzLCB0aGUgY3VycmVudCBQb2xpY3kgc2V0IG11c3QgaGF2ZSBhIEdyb292eUNvZGVTb3VyY2VQZXJtaXNzaW9uIHRoYXQgaW1wbGllcworCSAqIHRoZSBjb2RlQmFzZSwgb3IgYW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLiAgVGhpcyBpcyB0byBwcmV2ZW50IGNhbGxlcnMgZnJvbSBoaWphY2tpbmcKKwkgKiBleGlzdGluZyBjb2RlQmFzZSBwb2xpY3kgZW50cmllcyB1bmxlc3MgZXhwbGljaXRseSBhdXRob3JpemVkIGJ5IHRoZSB1c2VyLgorCSAqLworCXB1YmxpYyBHcm9vdnlDb2RlU291cmNlKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGNvZGVCYXNlKSB7CisJCXRoaXMuaW5wdXRTdHJlYW0gPSBpbnB1dFN0cmVhbTsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJU2VjdXJpdHlNYW5hZ2VyIHNtID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOworCQlpZiAoc20gIT0gbnVsbCkgeworCQkgICAgc20uY2hlY2tQZXJtaXNzaW9uKG5ldyBHcm9vdnlDb2RlU291cmNlUGVybWlzc2lvbihjb2RlQmFzZSkpOworCQl9CisJCXRyeSB7CisJCQl0aGlzLmNvZGVTb3VyY2UgPSBuZXcgQ29kZVNvdXJjZShuZXcgVVJMKCJmaWxlIiwgIiIsIGNvZGVCYXNlKSwgKGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZVtdKW51bGwpOworCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVybGUpIHsKKwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJBIENvZGVTb3VyY2UgZmlsZSBVUkwgY2Fubm90IGJlIGNvbnN0cnVjdGVkIGZyb20gdGhlIHN1cHBsaWVkIGNvZGVCYXNlOiAiICsgY29kZUJhc2UpOworCQl9CisJfQorCQorCXB1YmxpYyBHcm9vdnlDb2RlU291cmNlKGZpbmFsIEZpbGUgZmlsZSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisJCWlmICghZmlsZS5leGlzdHMoKSkKKwkJICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oZmlsZS50b1N0cmluZygpICsgIiAoIiArICBmaWxlLmdldEFic29sdXRlUGF0aCgpICsgICIpIik7CisJCWVsc2UgeworCQkgICB0cnkgeworCQkgICAgICAgaWYgKCFmaWxlLmNhblJlYWQoKSkKKwkJICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihmaWxlLnRvU3RyaW5nKCkgKyAiIGNhbiBub3QgYmUgcmVhZC4gQ2hlY2sgdGhlIHJlYWQgcGVybWlzc29uIG9mIHRoZSBmaWxlIFwiIiArIGZpbGUudG9TdHJpbmcoKSArICJcIiAoIiArICBmaWxlLmdldEFic29sdXRlUGF0aCgpICsgICIpLiIpOworCQkgICB9CisJCSAgIGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisJCSAgICAgICAgdGhyb3cgZTsKKwkJICAgIH0KKwkJfQorCisJCS8vdGhpcy5pbnB1dFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7CisJCXRoaXMuZmlsZSA9IGZpbGU7CisJCXRoaXMuaW5wdXRTdHJlYW0gPSBudWxsOworICAgICAgICB0aGlzLmNhY2hhYmxlID0gdHJ1ZTsKKwkJLy9UaGUgY2FsbHMgYmVsb3cgcmVxdWlyZSBhY2Nlc3MgdG8gdXNlci5kaXIgLSBhbGxvdyBoZXJlIHNpbmNlIGdldE5hbWUoKSBhbmQgZ2V0Q29kZVNvdXJjZSgpIGFyZQorCQkvL3BhY2thZ2UgcHJpdmF0ZSBhbmQgdXNlZCBvbmx5IGJ5IHRoZSBHcm9vdnlDbGFzc0xvYWRlci4KKwkJdHJ5IHsKKyAgICAgICAgICAgIE9iamVjdFtdIGluZm8gPSAoT2JqZWN0W10pIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKCBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKKwkJCQlwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSBpbmZvID0gbmV3IE9iamVjdFsyXTsKKyAgICAgICAgICAgICAgICAgICAgVVJMIHVybCA9IGZpbGUudG9VUkkoKS50b1VSTCgpOworICAgICAgICAgICAgICAgICAgICBpbmZvWzBdID0gdXJsLnRvRXh0ZXJuYWxGb3JtKCk7CisJCQkJCS8vdG9VUkkoKS50b1VSTCgpIHdpbGwgZW5jb2RlLCBidXQgdG9VUkwoKSB3aWxsIG5vdC4KKwkJCQkJaW5mb1sxXSA9IG5ldyBDb2RlU291cmNlKHVybCwgKENlcnRpZmljYXRlW10pIG51bGwpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5mbzsKKwkJCQl9CisJCQl9KTsKKwkJCXRoaXMubmFtZSA9IChTdHJpbmcpIGluZm9bMF07CisgICAgICAgICAgICB0aGlzLmNvZGVTb3VyY2UgPSAoQ29kZVNvdXJjZSkgaW5mb1sxXTsKKwkJfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBwYWUpIHsKKwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDb3VsZCBub3QgY29uc3RydWN0IGEgVVJMIGZyb206ICIgKyBmaWxlKTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgR3Jvb3Z5Q29kZVNvdXJjZShVUkwgdXJsKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpZiAodXJsID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDb3VsZCBub3QgY29uc3RydWN0IGEgR3Jvb3Z5Q29kZVNvdXJjZSBmcm9tIGEgbnVsbCBVUkwiKTsKKwkJfQorCQl0aGlzLmlucHV0U3RyZWFtID0gdXJsLm9wZW5TdHJlYW0oKTsKKwkJdGhpcy5uYW1lID0gdXJsLnRvRXh0ZXJuYWxGb3JtKCk7CisJCXRoaXMuY29kZVNvdXJjZSA9IG5ldyBDb2RlU291cmNlKHVybCwgKGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZVtdKW51bGwpOworCX0KKwkKKwlDb2RlU291cmNlIGdldENvZGVTb3VyY2UoKSB7CisJCXJldHVybiBjb2RlU291cmNlOworCX0KKworCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHsKKyAgICAgICAgaWYodGhpcy5pbnB1dFN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5pbnB1dFN0cmVhbTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKGZpbGUhPW51bGwpIHJldHVybiBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOworICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZuZmUpIHsKKyAgICAgICAgICAgICAgICAvLyBJR05PUkUKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBpbnB1dFN0cmVhbTsgICAgICAgICAgICAKKyAgICAgICAgfQorCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIG5hbWU7CisJfQorICAgIAorICAgIHB1YmxpYyBGaWxlIGdldEZpbGUoKSB7CisgICAgICAgIHJldHVybiBmaWxlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRDYWNoYWJsZShib29sZWFuIGIpIHsKKyAgICAgICAgY2FjaGFibGUgPSBiOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzQ2FjaGFibGUoKSB7CisgICAgICAgIHJldHVybiBjYWNoYWJsZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvR3Jvb3Z5SW50ZXJjZXB0YWJsZS5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL0dyb292eUludGVyY2VwdGFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjA1ZWI1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL0dyb292eUludGVyY2VwdGFibGUuamF2YQpAQCAtMCwwICsxLDI1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgZ3Jvb3Z5Lmxhbmc7CisKKy8qKgorICogTWFya2VyIGludGVyZmFjZSB1c2VkIHRvIG5vdGlmeSB0aGF0IGFsbCBtZXRob2RzIHNob3VsZCBiZSBpbnRlcmNlcHRlZCB0aHJvdWdoIHRoZSA8Y29kZT5pbnZva2VNZXRob2Q8L2NvZGU+IG1lY2hhbmlzbQorICogb2YgPGNvZGU+R3Jvb3Z5T2JqZWN0PC9jb2RlPi4KKyAqCisgKiBAYXV0aG9yIEd1aWxsYXVtZSBMYWZvcmdlCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgR3Jvb3Z5SW50ZXJjZXB0YWJsZSBleHRlbmRzIEdyb292eU9iamVjdCB7Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvR3Jvb3Z5TG9nVGVzdENhc2UuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL0dyb292eUxvZ1Rlc3RDYXNlLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTczNDVkCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL0dyb292eUxvZ1Rlc3RDYXNlLmdyb292eQpAQCAtMCwwICsxLDgyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBncm9vdnkubGFuZworCitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuKgorCisvKioKK0hlbHBlciBjbGFzcyB0byBzcG9vZiBsb2cgZW50cmllcyBhcyBwcm9kdWNlZCBieSBjYWxsaW5nIGFyYml0cmFyeSBjb2RlLgorVGhpcyBhbGxvd3Mgbm9uLWludHJ1c2l2ZSB0ZXN0aW5nIG9mIGRlcGVuZGVudCBvYmplY3RzIHdpdGhvdXQKK2V4cGxpY2l0bHkgdXNpbmcgTW9jayBvYmplY3RzIGFzIGxvbmcgYXMgdGhvc2UgZGVwZW5kZW50IG9iamVjdHMKK2RvIHNvbWUgcHJvcGVyIGxvZ2dpbmcuCitBcyBhIG1lYXN1cmUgb2YgbGFzdCByZXNvcnQsIGl0IGNhbiBiZSB1c2VkIG9uIE1ldGFDbGFzcyB0byBzcG9vZgoraXQncyBsb2cgZW50cmllcyBvbiAnaW52b2tlTWV0aG9kJy4KKworQGF1dGhvciBEaWVyayBLb2VuaWcKK0BzZWUgR3Jvb3Z5TG9nVGVzdENhc2VUZXN0CisqKi8KKworY2xhc3MgR3Jvb3Z5TG9nVGVzdENhc2UgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICAvKioKKyAgICAgRXhlY3V0ZSB0aGUgZ2l2ZW4gQ2xvc3VyZSB3aXRoIHRoZSBhY2NvcmRpbmcgbGV2ZWwgZm9yIHRoZSBMb2dnZXIgdGhhdAorICAgICBpcyBxdWFsaWZpZWQgYnkgdGhlIHF1YWxpZmllciBhbmQgcmV0dXJuIHRoZSBsb2cgb3V0cHV0IGFzIGEgU3RyaW5nLgorICAgICBRdWFsaWZpZXJzIGFyZSB1c3VhbGx5IHBhY2thZ2Ugb3IgY2xhc3MgbmFtZXMuCisgICAgIEV4aXN0aW5nIGxvZyBsZXZlbCBhbmQgaGFuZGxlcnMgYXJlIHJlc3RvcmVkIGFmdGVyIGV4ZWN1dGlvbi4KKyAgICAqKi8KKyAgICBzdGF0aWMgU3RyaW5nIHN0cmluZ0xvZyAoTGV2ZWwgbGV2ZWwsIFN0cmluZyBxdWFsaWZpZXIsIENsb3N1cmUgeWllbGQpeworICAgICAgICAvLyBzdG9yZSBvbGQgdmFsdWVzCisgICAgICAgIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKHF1YWxpZmllcikKKyAgICAgICAgZGVmIHVzZXNQYXJlbnRIYW5kbGVycyA9IGxvZ2dlci51c2VQYXJlbnRIYW5kbGVycworICAgICAgICAvLyBzZXQgbmV3IHZhbHVlcworICAgICAgICBsb2dnZXIudXNlUGFyZW50SGFuZGxlcnMgPSBmYWxzZQorICAgICAgICBkZWYgb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgxMDI0KQorICAgICAgICBIYW5kbGVyIHN0cmluZ0hhbmRsZXIgPSBuZXcgU3RyZWFtSGFuZGxlcihvdXQsIG5ldyBTaW1wbGVGb3JtYXR0ZXIoKSkKKyAgICAgICAgc3RyaW5nSGFuZGxlci5sZXZlbCA9IExldmVsLkFMTAorICAgICAgICBsb2dnZXIuYWRkSGFuZGxlcihzdHJpbmdIYW5kbGVyKSAvLyBhbnkgb2xkIGhhbmRsZXJzIHJlbWFpbgorCisgICAgICAgIHdpdGhMZXZlbChsZXZlbCwgcXVhbGlmaWVyLCB5aWVsZCkKKworICAgICAgICAvLyByZXN0b3JlIG9sZCB2YWx1ZXMKKyAgICAgICAgbG9nZ2VyLmxldmVsID0gTGV2ZWwuT0ZGICAgIC8vIHRlbXBvcmFyaWx5LCB0byBhdm9pZCBsb2dnaW5nIHRoZSAzIHN0bXRzIGJlbG93CisgICAgICAgIHN0cmluZ0hhbmRsZXIuZmx1c2goKQorICAgICAgICBvdXQuY2xvc2UoKQorICAgICAgICBsb2dnZXIucmVtb3ZlSGFuZGxlcihzdHJpbmdIYW5kbGVyKQorICAgICAgICBsb2dnZXIudXNlUGFyZW50SGFuZGxlcnMgPSB1c2VzUGFyZW50SGFuZGxlcnMKKyAgICAgICAgcmV0dXJuIG91dC50b1N0cmluZygpCisgICAgfQorCisgICAgLyoqCisgICAgIEV4ZWN1dGUgdGhlIGdpdmVuIENsb3N1cmUgd2l0aCB0aGUgYWNjb3JkaW5nIGxldmVsIGZvciB0aGUgTG9nZ2VyIHRoYXQKKyAgICAgaXMgcXVhbGlmaWVkIGJ5IHRoZSBxdWFsaWZpZXIuIFF1YWxpZmllcnMgYXJlIHVzdWFsbHkgcGFja2FnZSBvciBjbGFzcworICAgICBuYW1lcy4KKyAgICAgVGhlIGxvZyBsZXZlbCBpcyByZXN0b3JlZCBhZnRlciBleGVjdXRpb24uCisgICAgKiovCisgICAgc3RhdGljIGRlZiB3aXRoTGV2ZWwoTGV2ZWwgbGV2ZWwsIFN0cmluZyBxdWFsaWZpZXIsIENsb3N1cmUgeWllbGQpeworICAgICAgICAvLyBzdG9yZSBvbGQgdmFsdWVzCisgICAgICAgIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKHF1YWxpZmllcikKKyAgICAgICAgZGVmIGxvZ2xldmVsID0gbG9nZ2VyLmxldmVsCisgICAgICAgIC8vIHNldCBuZXcgdmFsdWVzCisgICAgICAgIGlmICghbG9nZ2VyLmlzTG9nZ2FibGUobGV2ZWwpKSBsb2dnZXIubGV2ZWwgPSBsZXZlbCAvLyB1c2UgbWluIHZhbHVlCisKKyAgICAgICAgZGVmIHJlc3VsdCA9IHlpZWxkKCkKKworICAgICAgICAvLyByZXN0b3JlIG9sZCB2YWx1ZXMKKyAgICAgICAgbG9nZ2VyLmxldmVsID0gbG9nbGV2ZWwKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvR3Jvb3Z5T2JqZWN0LmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvR3Jvb3Z5T2JqZWN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMxZjUxMQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbGFuZy9Hcm9vdnlPYmplY3QuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBncm9vdnkubGFuZzsKKworLyoqCisgKiBUaGUgaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IGFsbCBHcm9vdnkgb2JqZWN0cy4KKyAqCisgKiBFc3BlY2lhbGx5IGhhbmR5IGZvciB1c2luZyBHcm9vdnkgb2JqZWN0cyB3aGVuIGluIHRoZSBKYXZhIHdvcmxkLgorICogCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgaW50ZXJmYWNlIEdyb292eU9iamVjdCB7CisKKyAgICAvKiogCisgICAgICogSW52b2tlcyB0aGUgZ2l2ZW4gbWV0aG9kCisgICAgICovCisgICAgT2JqZWN0IGludm9rZU1ldGhvZChTdHJpbmcgbmFtZSwgT2JqZWN0IGFyZ3MpOworICAgIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGdpdmVuIHByb3BlcnR5CisgICAgICovCisgICAgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSk7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBnaXZlbiBwcm9wZXJ0eSB0byB0aGUgbmV3IHZhbHVlCisgICAgICovCisgICAgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHksIE9iamVjdCBuZXdWYWx1ZSk7CisgICAgICAgIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIG1ldGFDbGFzcyBvZiB0aGlzIGluc3RhbmNlCisgICAgICovCisgICAgTWV0YUNsYXNzIGdldE1ldGFDbGFzcygpOworICAgIAorICAgIC8qKgorICAgICAqIEFsbG93cyB0aGUgTWV0YUNsYXNzIHRvIGJlIHJlcGxhY2VkIHdpdGggYSBkZXJpdmVkIGltcGxlbWVudGF0aW9uCisgICAgICovCisgICAgdm9pZCBzZXRNZXRhQ2xhc3MoTWV0YUNsYXNzIG1ldGFDbGFzcyk7Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvR3Jvb3Z5T2JqZWN0U3VwcG9ydC5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL0dyb292eU9iamVjdFN1cHBvcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDQ4YmYwCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL0dyb292eU9iamVjdFN1cHBvcnQuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgZ3Jvb3Z5Lmxhbmc7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuSW52b2tlckhlbHBlcjsKKworLyoqCisgKiBBIHVzZWZ1bCBiYXNlIGNsYXNzIGZvciBKYXZhIG9iamVjdHMgd2lzaGluZyB0byBiZSBHcm9vdnkgb2JqZWN0cworICogCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgR3Jvb3Z5T2JqZWN0U3VwcG9ydCBpbXBsZW1lbnRzIEdyb292eU9iamVjdCB7CisKKwkvLyBuZXZlciBwZXJzaXN0IHRoZSBNZXRhQ2xhc3MKKyAgICBwcml2YXRlIHRyYW5zaWVudCBNZXRhQ2xhc3MgbWV0YUNsYXNzOworCisgICAgcHVibGljIEdyb292eU9iamVjdFN1cHBvcnQoKSB7CisgICAgICAgIHRoaXMubWV0YUNsYXNzID0gSW52b2tlckhlbHBlci5nZXRNZXRhQ2xhc3ModGhpcyk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5KSB7CisgICAgICAgIHJldHVybiBtZXRhQ2xhc3MuZ2V0UHJvcGVydHkodGhpcywgcHJvcGVydHkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IG5ld1ZhbHVlKSB7CisgICAgICAgICBtZXRhQ2xhc3Muc2V0UHJvcGVydHkodGhpcywgcHJvcGVydHksIG5ld1ZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGludm9rZU1ldGhvZChTdHJpbmcgbmFtZSwgT2JqZWN0IGFyZ3MpIHsKKyAgICAgICAgcmV0dXJuIG1ldGFDbGFzcy5pbnZva2VNZXRob2QodGhpcywgbmFtZSwgYXJncyk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBNZXRhQ2xhc3MgZ2V0TWV0YUNsYXNzKCkgeworICAgICAgICByZXR1cm4gbWV0YUNsYXNzOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRNZXRhQ2xhc3MoTWV0YUNsYXNzIG1ldGFDbGFzcykgeworICAgICAgICB0aGlzLm1ldGFDbGFzcyA9IG1ldGFDbGFzczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvR3Jvb3Z5UmVzb3VyY2VMb2FkZXIuamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbGFuZy9Hcm9vdnlSZXNvdXJjZUxvYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MTJlMzkKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvR3Jvb3Z5UmVzb3VyY2VMb2FkZXIuamF2YQpAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgZ3Jvb3Z5Lmxhbmc7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworCisvKioKKyAqIEFsbG93cyBmcmFtZXdvcmtzIHRoYXQgaW50ZWdyYXRlIHdpdGggR3Jvb3Z5IHRvIGRldGVybWluZSBob3cgR3Jvb3Z5IGZpbGVzIGFyZSByZXNvbHZlZC4KKyAqIAorICogQGF1dGhvciBTdGV2ZW4gRGV2aWp2ZXIKKyAqLworcHVibGljIGludGVyZmFjZSBHcm9vdnlSZXNvdXJjZUxvYWRlciB7CisKKyAgICAvKioKKyAgICAgKiBMb2FkcyBhIEdyb292eSBzb3VyY2UgZmlsZSBnaXZlbiBpdHMgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlbmFtZSBuYW1lIG9mIHRoZSBmaWxlCisgICAgICogQHJldHVybiBhIFVSTAorICAgICAqIEB0aHJvd3MgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGlmIHRoZSBVUkwgaXMgaW52YWxpZAorICAgICAqLworICAgIFVSTCBsb2FkR3Jvb3Z5U291cmNlKFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbGFuZy9Hcm9vdnlSdW50aW1lRXhjZXB0aW9uLmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZDMyNjkKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBncm9vdnkubGFuZzsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LkFTVE5vZGU7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuTW9kdWxlTm9kZTsKKworLyoqCisgKiBBbiBleGNlcHRpb24gdGhyb3duIGJ5IHRoZSBpbnRlcnByZXRlcgorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBHcm9vdnlSdW50aW1lRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CisKKyAgICBwcml2YXRlIE1vZHVsZU5vZGUgbW9kdWxlOworICAgIHByaXZhdGUgQVNUTm9kZSBub2RlOworCisgICAgcHVibGljIEdyb292eVJ1bnRpbWVFeGNlcHRpb24oKSB7CisgICAgfQorCisgICAgcHVibGljIEdyb292eVJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgc3VwZXIobWVzc2FnZSk7CisgICAgfQorCisgICAgcHVibGljIEdyb292eVJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIEFTVE5vZGUgbm9kZSkgeworICAgICAgICBzdXBlcihtZXNzYWdlKTsKKyAgICAgICAgdGhpcy5ub2RlID0gbm9kZTsKKyAgICB9CisKKyAgICBwdWJsaWMgR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbihUaHJvd2FibGUgdCkgeworICAgICAgICBzdXBlcigpOworICAgICAgICBpbml0Q2F1c2UodCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TW9kdWxlKE1vZHVsZU5vZGUgbW9kdWxlKSB7CisgICAgICAgIHRoaXMubW9kdWxlID0gbW9kdWxlOworICAgIH0KKworICAgIHB1YmxpYyBNb2R1bGVOb2RlIGdldE1vZHVsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1vZHVsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7CisgICAgICAgIHJldHVybiBnZXRNZXNzYWdlV2l0aG91dExvY2F0aW9uVGV4dCgpICsgZ2V0TG9jYXRpb25UZXh0KCk7CisgICAgfQorCisgICAgcHVibGljIEFTVE5vZGUgZ2V0Tm9kZSgpIHsKKyAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlV2l0aG91dExvY2F0aW9uVGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmdldE1lc3NhZ2UoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldExvY2F0aW9uVGV4dCgpIHsKKyAgICAgICAgU3RyaW5nIGFuc3dlciA9ICIuICI7CisgICAgICAgIGlmIChub2RlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFuc3dlciArPSAiQXQgWyIgKyBub2RlLmdldExpbmVOdW1iZXIoKSArICI6IiArIG5vZGUuZ2V0Q29sdW1uTnVtYmVyKCkgKyAiXSAiOworICAgICAgICB9CisgICAgICAgIGlmIChtb2R1bGUgIT0gbnVsbCkgeworICAgICAgICAgICAgYW5zd2VyICs9IG1vZHVsZS5nZXREZXNjcmlwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGlmIChhbnN3ZXIuZXF1YWxzKCIuICIpKSB7CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFuc3dlcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvR3Jvb3Z5U2hlbGwuamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbGFuZy9Hcm9vdnlTaGVsbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMjdkMWQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvR3Jvb3Z5U2hlbGwuamF2YQpAQCAtMCwwICsxLDU0NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGdyb292eS5sYW5nOworCitpbXBvcnQgZ3Jvb3Z5LnVpLkdyb292eU1haW47CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLkNvbXBpbGVyQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuSW52b2tlckhlbHBlcjsKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgZ3Jvb3Z5IHNoZWxsIGNhcGFibGUgb2YgcnVubmluZyBhcmJpdHJhcnkgZ3Jvb3Z5IHNjcmlwdHMKKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQGF1dGhvciBHdWlsbGF1bWUgTGFmb3JnZQorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgR3Jvb3Z5U2hlbGwgZXh0ZW5kcyBHcm9vdnlPYmplY3RTdXBwb3J0IHsKKyAgICAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVNUFRZX0FSR1MgPSB7fTsKKworICAgIAorICAgIHByaXZhdGUgQmluZGluZyBjb250ZXh0OworICAgIHByaXZhdGUgaW50IGNvdW50ZXI7CisgICAgcHJpdmF0ZSBDb21waWxlckNvbmZpZ3VyYXRpb24gY29uZmlnOworICAgIHByaXZhdGUgR3Jvb3Z5Q2xhc3NMb2FkZXIgbG9hZGVyOworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBHcm9vdnlNYWluLm1haW4oYXJncyk7CisgICAgfQorCisgICAgcHVibGljIEdyb292eVNoZWxsKCkgeworICAgICAgICB0aGlzKG51bGwsIG5ldyBCaW5kaW5nKCkpOworICAgIH0KKworICAgIHB1YmxpYyBHcm9vdnlTaGVsbChCaW5kaW5nIGJpbmRpbmcpIHsKKyAgICAgICAgdGhpcyhudWxsLCBiaW5kaW5nKTsKKyAgICB9CisKKyAgICBwdWJsaWMgR3Jvb3Z5U2hlbGwoQ29tcGlsZXJDb25maWd1cmF0aW9uIGNvbmZpZykgeworICAgICAgICB0aGlzKG5ldyBCaW5kaW5nKCksIGNvbmZpZyk7CisgICAgfQorCisgICAgcHVibGljIEdyb292eVNoZWxsKEJpbmRpbmcgYmluZGluZywgQ29tcGlsZXJDb25maWd1cmF0aW9uIGNvbmZpZykgeworICAgICAgICB0aGlzKG51bGwsIGJpbmRpbmcsIGNvbmZpZyk7CisgICAgfQorCisgICAgcHVibGljIEdyb292eVNoZWxsKENsYXNzTG9hZGVyIHBhcmVudCwgQmluZGluZyBiaW5kaW5nKSB7CisgICAgICAgIHRoaXMocGFyZW50LCBiaW5kaW5nLCBDb21waWxlckNvbmZpZ3VyYXRpb24uREVGQVVMVCk7CisgICAgfQorCisgICAgcHVibGljIEdyb292eVNoZWxsKENsYXNzTG9hZGVyIHBhcmVudCkgeworICAgICAgICB0aGlzKHBhcmVudCwgbmV3IEJpbmRpbmcoKSwgQ29tcGlsZXJDb25maWd1cmF0aW9uLkRFRkFVTFQpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgR3Jvb3Z5U2hlbGwoQ2xhc3NMb2FkZXIgcGFyZW50LCBCaW5kaW5nIGJpbmRpbmcsIGZpbmFsIENvbXBpbGVyQ29uZmlndXJhdGlvbiBjb25maWcpIHsKKyAgICAgICAgaWYgKGJpbmRpbmcgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQmluZGluZyBtdXN0IG5vdCBiZSBudWxsLiIpOworICAgICAgICB9CisgICAgICAgIGlmIChjb25maWcgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ29tcGlsZXIgY29uZmlndXJhdGlvbiBtdXN0IG5vdCBiZSBudWxsLiIpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIENsYXNzTG9hZGVyIHBhcmVudExvYWRlciA9IChwYXJlbnQhPW51bGwpP3BhcmVudDpHcm9vdnlTaGVsbC5jbGFzcy5nZXRDbGFzc0xvYWRlcigpOworICAgICAgICB0aGlzLmxvYWRlciA9IChHcm9vdnlDbGFzc0xvYWRlcikgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7CisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEdyb292eUNsYXNzTG9hZGVyKHBhcmVudExvYWRlcixjb25maWcpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgdGhpcy5jb250ZXh0ID0gYmluZGluZzsgICAgICAgIAorICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZzsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZUJpbmRpbmcoKSB7CisgICAgICAgIE1hcCBtYXAgPSBjb250ZXh0LmdldFZhcmlhYmxlcygpOworICAgICAgICBpZiAobWFwLmdldCgic2hlbGwiKT09bnVsbCkgbWFwLnB1dCgic2hlbGwiLHRoaXMpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCByZXNldExvYWRlZENsYXNzZXMoKSB7CisgICAgICAgIGxvYWRlci5jbGVhckNhY2hlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGNoaWxkIHNoZWxsIHVzaW5nIGEgbmV3IENsYXNzTG9hZGVyIHdoaWNoIHVzZXMgdGhlIHBhcmVudCBzaGVsbCdzCisgICAgICogY2xhc3MgbG9hZGVyIGFzIGl0cyBwYXJlbnQKKyAgICAgKgorICAgICAqIEBwYXJhbSBzaGVsbCBpcyB0aGUgcGFyZW50IHNoZWxsIHVzZWQgZm9yIHRoZSB2YXJpYWJsZSBiaW5kaW5ncyBhbmQgdGhlIHBhcmVudCBjbGFzcyBsb2FkZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgR3Jvb3Z5U2hlbGwoR3Jvb3Z5U2hlbGwgc2hlbGwpIHsKKyAgICAgICAgdGhpcyhzaGVsbC5sb2FkZXIsIHNoZWxsLmNvbnRleHQpOworICAgIH0KKworICAgIHB1YmxpYyBCaW5kaW5nIGdldENvbnRleHQoKSB7CisgICAgICAgIHJldHVybiBjb250ZXh0OworICAgIH0KKworICAgIHB1YmxpYyBHcm9vdnlDbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlcigpIHsKKyAgICAgICAgcmV0dXJuIGxvYWRlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSkgeworICAgICAgICBPYmplY3QgYW5zd2VyID0gZ2V0VmFyaWFibGUocHJvcGVydHkpOworICAgICAgICBpZiAoYW5zd2VyID09IG51bGwpIHsKKyAgICAgICAgICAgIGFuc3dlciA9IHN1cGVyLmdldFByb3BlcnR5KHByb3BlcnR5KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYW5zd2VyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IG5ld1ZhbHVlKSB7CisgICAgICAgIHNldFZhcmlhYmxlKHByb3BlcnR5LCBuZXdWYWx1ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdXBlci5zZXRQcm9wZXJ0eShwcm9wZXJ0eSwgbmV3VmFsdWUpOworICAgICAgICB9IGNhdGNoIChHcm9vdnlSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGlnbm9yZSwgd2FzIHByb2JhYmx5IGEgZHluYW1pYyBwcm9wZXJ0eQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBoZWxwZXIgbWV0aG9kIHdoaWNoIHJ1bnMgdGhlIGdpdmVuIHNjcmlwdCBmaWxlIHdpdGggdGhlIGdpdmVuIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKKyAgICAgKgorICAgICAqIEBwYXJhbSBzY3JpcHRGaWxlIHRoZSBmaWxlIG9mIHRoZSBzY3JpcHQgdG8gcnVuCisgICAgICogQHBhcmFtIGxpc3QgICAgICAgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgdG8gcGFzcyBpbgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgcnVuKEZpbGUgc2NyaXB0RmlsZSwgTGlzdCBsaXN0KSB0aHJvd3MgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nW10gYXJncyA9IG5ldyBTdHJpbmdbbGlzdC5zaXplKCldOworICAgICAgICByZXR1cm4gcnVuKHNjcmlwdEZpbGUsIChTdHJpbmdbXSkgbGlzdC50b0FycmF5KGFyZ3MpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGhlbHBlciBtZXRob2Qgd2hpY2ggcnVucyB0aGUgZ2l2ZW4gY2wgc2NyaXB0IHdpdGggdGhlIGdpdmVuIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKKyAgICAgKgorICAgICAqIEBwYXJhbSBzY3JpcHRUZXh0IGlzIHRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIHNjcmlwdAorICAgICAqIEBwYXJhbSBmaWxlTmFtZSAgIGlzIHRoZSBsb2dpY2FsIGZpbGUgbmFtZSBvZiB0aGUgc2NyaXB0ICh3aGljaCBpcyB1c2VkIHRvIGNyZWF0ZSB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgc2NyaXB0KQorICAgICAqIEBwYXJhbSBsaXN0ICAgICAgIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIHRvIHBhc3MgaW4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IHJ1bihTdHJpbmcgc2NyaXB0VGV4dCwgU3RyaW5nIGZpbGVOYW1lLCBMaXN0IGxpc3QpIHRocm93cyBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1tdIGFyZ3MgPSBuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXTsKKyAgICAgICAgbGlzdC50b0FycmF5KGFyZ3MpOworICAgICAgICByZXR1cm4gcnVuKHNjcmlwdFRleHQsIGZpbGVOYW1lLCBhcmdzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSdW5zIHRoZSBnaXZlbiBzY3JpcHQgZmlsZSBuYW1lIHdpdGggdGhlIGdpdmVuIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKKyAgICAgKgorICAgICAqIEBwYXJhbSBzY3JpcHRGaWxlIHRoZSBmaWxlIG5hbWUgb2YgdGhlIHNjcmlwdCB0byBydW4KKyAgICAgKiBAcGFyYW0gYXJncyAgICAgICB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyB0byBwYXNzIGluCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBydW4oZmluYWwgRmlsZSBzY3JpcHRGaWxlLCBTdHJpbmdbXSBhcmdzKSB0aHJvd3MgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHNjcmlwdE5hbWUgPSBzY3JpcHRGaWxlLmdldE5hbWUoKTsKKyAgICAgICAgaW50IHAgPSBzY3JpcHROYW1lLmxhc3RJbmRleE9mKCIuIik7CisgICAgICAgIGlmIChwKysgPj0gMCkgeworICAgICAgICAgICAgaWYgKHNjcmlwdE5hbWUuc3Vic3RyaW5nKHApLmVxdWFscygiamF2YSIpKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJlcnJvcjogY2Fubm90IGNvbXBpbGUgZmlsZSB3aXRoIC5qYXZhIGV4dGVuc2lvbjogIiArIHNjcmlwdE5hbWUpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbigwLCBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEdldCB0aGUgY3VycmVudCBjb250ZXh0IGNsYXNzbG9hZGVyIGFuZCBzYXZlIGl0IG9uIHRoZSBzdGFjaworICAgICAgICBmaW5hbCBUaHJlYWQgdGhyZWFkID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsKKyAgICAgICAgLy9DbGFzc0xvYWRlciBjdXJyZW50Q2xhc3NMb2FkZXIgPSB0aHJlYWQuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7CisKKyAgICAgICAgY2xhc3MgRG9TZXRDb250ZXh0IGltcGxlbWVudHMgUHJpdmlsZWdlZEFjdGlvbiB7CisgICAgICAgICAgICBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcjsKKworICAgICAgICAgICAgcHVibGljIERvU2V0Q29udGV4dChDbGFzc0xvYWRlciBsb2FkZXIpIHsKKyAgICAgICAgICAgICAgICBjbGFzc0xvYWRlciA9IGxvYWRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7CisgICAgICAgICAgICAgICAgdGhyZWFkLnNldENvbnRleHRDbGFzc0xvYWRlcihjbGFzc0xvYWRlcik7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgRG9TZXRDb250ZXh0KGxvYWRlcikpOworCisgICAgICAgIC8vIFBhcnNlIHRoZSBzY3JpcHQsIGdlbmVyYXRlIHRoZSBjbGFzcywgYW5kIGludm9rZSB0aGUgbWFpbiBtZXRob2QuICBUaGlzIGlzIGEgbGl0dGxlIGxvb3NlciB0aGFuCisgICAgICAgIC8vIGlmIHlvdSBhcmUgY29tcGlsaW5nIHRoZSBzY3JpcHQgYmVjYXVzZSB0aGUgSlZNIGlzbid0IGV4ZWN1dGluZyB0aGUgbWFpbiBtZXRob2QuCisgICAgICAgIENsYXNzIHNjcmlwdENsYXNzOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2NyaXB0Q2xhc3MgPSAoQ2xhc3MpIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2FkZXIucGFyc2VDbGFzcyhzY3JpcHRGaWxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBwYWUpIHsKKyAgICAgICAgICAgIEV4Y2VwdGlvbiBlID0gcGFlLmdldEV4Y2VwdGlvbigpOworICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgIHRocm93IChDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbikgZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgKElPRXhjZXB0aW9uKSBlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbikgcGFlLmdldEV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJ1bk1haW5PclRlc3RPclJ1bm5hYmxlKHNjcmlwdENsYXNzLCBhcmdzKTsKKworICAgICAgICAvLyBTZXQgdGhlIGNvbnRleHQgY2xhc3Nsb2FkZXIgYmFjayB0byB3aGF0IGl0IHdhcy4KKyAgICAgICAgLy9BY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgRG9TZXRDb250ZXh0KGN1cnJlbnRDbGFzc0xvYWRlcikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGlmICh0aGVDbGFzcyBoYXMgYSBtYWluIG1ldGhvZCkgeworICAgICAqIHJ1biB0aGUgbWFpbiBtZXRob2QKKyAgICAgKiB9IGVsc2UgaWYgKHRoZUNsYXNzIGluc3RhbmNlb2YgR3Jvb3Z5VGVzdENhc2UpIHsKKyAgICAgKiB1c2UgdGhlIHRlc3QgcnVubmVyIHRvIHJ1biBpdAorICAgICAqIH0gZWxzZSBpZiAodGhlQ2xhc3MgaW1wbGVtZW50cyBSdW5uYWJsZSkgeworICAgICAqIGlmICh0aGVDbGFzcyBoYXMgYSBjb25zdHJ1Y3RvciB3aXRoIFN0cmluZ1tdIHBhcmFtcykKKyAgICAgKiBpbnN0YW5jaWF0ZSB0aGVDbGFzcyB3aXRoIHRoaXMgY29uc3RydWN0b3IgYW5kIHJ1bgorICAgICAqIGVsc2UgaWYgKHRoZUNsYXNzIGhhcyBhIG5vLWFyZ3MgY29uc3RydWN0b3IpCisgICAgICogaW5zdGFuY2lhdGUgdGhlQ2xhc3Mgd2l0aCB0aGUgbm8tYXJncyBjb25zdHJ1Y3RvciBhbmQgcnVuCisgICAgICogfQorICAgICAqLworICAgIHByaXZhdGUgT2JqZWN0IHJ1bk1haW5PclRlc3RPclJ1bm5hYmxlKENsYXNzIHNjcmlwdENsYXNzLCBTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIGlmIChzY3JpcHRDbGFzcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gbGV0J3MgZmluZCBhIG1haW4gbWV0aG9kCisgICAgICAgICAgICBzY3JpcHRDbGFzcy5nZXRNZXRob2QoIm1haW4iLCBuZXcgQ2xhc3NbXXtTdHJpbmdbXS5jbGFzc30pOworICAgICAgICAgICAgLy8gaWYgdGhhdCBtYWluIG1ldGhvZCBleGlzdCwgaW52b2tlIGl0CisgICAgICAgICAgICByZXR1cm4gSW52b2tlckhlbHBlci5pbnZva2VNZXRob2Qoc2NyaXB0Q2xhc3MsICJtYWluIiwgbmV3IE9iamVjdFtde2FyZ3N9KTsKKyAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGlmIGl0IGltcGxlbWVudHMgUnVubmFibGUsIHRyeSB0byBpbnN0YW50aWF0ZSBpdAorICAgICAgICAgICAgaWYgKFJ1bm5hYmxlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oc2NyaXB0Q2xhc3MpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJ1blJ1bm5hYmxlKHNjcmlwdENsYXNzLCBhcmdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGlmIGl0J3MgYSB1bml0IHRlc3QgZXh0ZW5kaW5nIEdyb292eVRlc3RDYXNlLCBydW4gaXQgd2l0aCBKVW5pdCdzIFRleHRSdW5uZXIKKyAgICAgICAgICAgIGlmIChpc1VuaXRUZXN0Q2FzZShzY3JpcHRDbGFzcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcnVuVGVzdChzY3JpcHRDbGFzcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbigiVGhpcyBzY3JpcHQgb3IgY2xhc3MgY291bGQgbm90IGJlIHJ1bi5cbiIgKworICAgICAgICAgICAgICAgICAgICAiSXQgc2hvdWxkIGVpdGhlcjogXG4iICsKKyAgICAgICAgICAgICAgICAgICAgIi0gaGF2ZSBhIG1haW4gbWV0aG9kLCBcbiIgKworICAgICAgICAgICAgICAgICAgICAiLSBiZSBhIGNsYXNzIGV4dGVuZGluZyBHcm9vdnlUZXN0Q2FzZSwgXG4iICsKKyAgICAgICAgICAgICAgICAgICAgIi0gb3IgaW1wbGVtZW50IHRoZSBSdW5uYWJsZSBpbnRlcmZhY2UuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIE9iamVjdCBydW5SdW5uYWJsZShDbGFzcyBzY3JpcHRDbGFzcywgU3RyaW5nW10gYXJncykgeworICAgICAgICBDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IG51bGw7CisgICAgICAgIFJ1bm5hYmxlIHJ1bm5hYmxlID0gbnVsbDsKKyAgICAgICAgVGhyb3dhYmxlIHJlYXNvbiA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBmaXJzdCwgZmV0Y2ggdGhlIGNvbnN0cnVjdG9yIHRha2luZyBTdHJpbmdbXSBhcyBwYXJhbWV0ZXIKKyAgICAgICAgICAgIGNvbnN0cnVjdG9yID0gc2NyaXB0Q2xhc3MuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW117KG5ldyBTdHJpbmdbXXt9KS5nZXRDbGFzcygpfSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vIGluc3RhbmNpYXRlIGEgcnVubmFibGUgYW5kIHJ1biBpdAorICAgICAgICAgICAgICAgIHJ1bm5hYmxlID0gKFJ1bm5hYmxlKSBjb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShuZXcgT2JqZWN0W117YXJnc30pOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICByZWFzb24gPSB0OworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZTEpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCBmaW5kIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yCisgICAgICAgICAgICAgICAgY29uc3RydWN0b3IgPSBzY3JpcHRDbGFzcy5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXXt9KTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAvLyBpbnN0YW5jaWF0ZSBhIHJ1bm5hYmxlIGFuZCBydW4gaXQKKyAgICAgICAgICAgICAgICAgICAgcnVubmFibGUgPSAoUnVubmFibGUpIGNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKG5ldyBPYmplY3RbXXt9KTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICByZWFzb24gPSB0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBuc21lKSB7CisgICAgICAgICAgICAgICAgcmVhc29uID0gbnNtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoY29uc3RydWN0b3IgIT0gbnVsbCAmJiBydW5uYWJsZSAhPSBudWxsKSB7CisgICAgICAgICAgICBydW5uYWJsZS5ydW4oKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBHcm9vdnlSdW50aW1lRXhjZXB0aW9uKCJUaGlzIHNjcmlwdCBvciBjbGFzcyB3YXMgcnVubmFibGUgYnV0IGNvdWxkIG5vdCBiZSBydW4uICIsIHJlYXNvbik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUnVuIHRoZSBzcGVjaWZpZWQgY2xhc3MgZXh0ZW5kaW5nIEdyb292eVRlc3RDYXNlIGFzIGEgdW5pdCB0ZXN0LgorICAgICAqIFRoaXMgaXMgZG9uZSB0aHJvdWdoIHJlZmxlY3Rpb24sIHRvIGF2b2lkIGFkZGluZyBhIGRlcGVuZGVuY3kgdG8gdGhlIEpVbml0IGZyYW1ld29yay4KKyAgICAgKiBPdGhlcndpc2UsIGRldmVsb3BlcnMgZW1iZWRkaW5nIEdyb292eSBhbmQgdXNpbmcgR3Jvb3Z5U2hlbGwgdG8gbG9hZC9wYXJzZS9jb21waWxlCisgICAgICogZ3Jvb3Z5IHNjcmlwdHMgYW5kIGNsYXNzZXMgd291bGQgaGF2ZSB0byBhZGQgYW5vdGhlciBkZXBlbmRlbmN5IG9uIHRoZWlyIGNsYXNzcGF0aC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzY3JpcHRDbGFzcyB0aGUgY2xhc3MgdG8gYmUgcnVuIGFzIGEgdW5pdCB0ZXN0CisgICAgICovCisgICAgcHJpdmF0ZSBPYmplY3QgcnVuVGVzdChDbGFzcyBzY3JpcHRDbGFzcykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgT2JqZWN0IHRlc3RTdWl0ZSA9IEludm9rZXJIZWxwZXIuaW52b2tlQ29uc3RydWN0b3JPZigianVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZSIsbmV3IE9iamVjdFtde3NjcmlwdENsYXNzfSk7CisgICAgICAgICAgICByZXR1cm4gSW52b2tlckhlbHBlci5pbnZva2VTdGF0aWNNZXRob2QoImp1bml0LnRleHR1aS5UZXN0UnVubmVyIiwgInJ1biIsIG5ldyBPYmplY3RbXXt0ZXN0U3VpdGV9KTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbigiRmFpbGVkIHRvIHJ1biB0aGUgdW5pdCB0ZXN0LiBKVW5pdCBpcyBub3Qgb24gdGhlIENsYXNzcGF0aC4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgbWV0aG9kIHRvIGNoZWNrIHRocm91Z2ggcmVmbGVjdGlvbiBpZiB0aGUgcGFyc2VkIGNsYXNzIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2NyaXB0Q2xhc3MgdGhlIGNsYXNzIHdlIHdhbnQgdG8ga25vdyBpZiBpdCBleHRlbmRzIEdyb292eVRlc3RDYXNlCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjbGFzcyBleHRlbmRzIGdyb292eS51dGlsLkdyb292eVRlc3RDYXNlCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGlzVW5pdFRlc3RDYXNlKENsYXNzIHNjcmlwdENsYXNzKSB7CisgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBwYXJzZWQgY2xhc3MgaXMgYSBHcm9vdnlUZXN0Q2FzZSwKKyAgICAgICAgLy8gc28gdGhhdCBpdCBpcyBwb3NzaWJsZSB0byBydW4gaXQgYXMgYSBKVW5pdCB0ZXN0CisgICAgICAgIGJvb2xlYW4gaXNVbml0VGVzdENhc2UgPSBmYWxzZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQ2xhc3MgdGVzdENhc2VDbGFzcyA9IHRoaXMubG9hZGVyLmxvYWRDbGFzcygiZ3Jvb3Z5LnV0aWwuR3Jvb3Z5VGVzdENhc2UiKTsKKyAgICAgICAgICAgICAgICAvLyBpZiBzY3JpcHRDbGFzcyBleHRlbmRzIHRlc3RDYXNlQ2xhc3MKKyAgICAgICAgICAgICAgICBpZiAodGVzdENhc2VDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHNjcmlwdENsYXNzKSkgeworICAgICAgICAgICAgICAgICAgICBpc1VuaXRUZXN0Q2FzZSA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaXNVbml0VGVzdENhc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUnVucyB0aGUgZ2l2ZW4gc2NyaXB0IHRleHQgd2l0aCBjb21tYW5kIGxpbmUgYXJndW1lbnRzCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2NyaXB0VGV4dCBpcyB0aGUgdGV4dCBjb250ZW50IG9mIHRoZSBzY3JpcHQKKyAgICAgKiBAcGFyYW0gZmlsZU5hbWUgICBpcyB0aGUgbG9naWNhbCBmaWxlIG5hbWUgb2YgdGhlIHNjcmlwdCAod2hpY2ggaXMgdXNlZCB0byBjcmVhdGUgdGhlIGNsYXNzIG5hbWUgb2YgdGhlIHNjcmlwdCkKKyAgICAgKiBAcGFyYW0gYXJncyAgICAgICB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyB0byBwYXNzIGluCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBydW4oU3RyaW5nIHNjcmlwdFRleHQsIFN0cmluZyBmaWxlTmFtZSwgU3RyaW5nW10gYXJncykgdGhyb3dzIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBydW4obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHNjcmlwdFRleHQuZ2V0Qnl0ZXMoY29uZmlnLmdldFNvdXJjZUVuY29kaW5nKCkpKSwgZmlsZU5hbWUsIGFyZ3MpOworICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbigwLCBudWxsLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJ1bnMgdGhlIGdpdmVuIHNjcmlwdCB3aXRoIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKKyAgICAgKgorICAgICAqIEBwYXJhbSBpbiAgICAgICB0aGUgc3RyZWFtIHJlYWRpbmcgdGhlIHNjcmlwdAorICAgICAqIEBwYXJhbSBmaWxlTmFtZSBpcyB0aGUgbG9naWNhbCBmaWxlIG5hbWUgb2YgdGhlIHNjcmlwdCAod2hpY2ggaXMgdXNlZCB0byBjcmVhdGUgdGhlIGNsYXNzIG5hbWUgb2YgdGhlIHNjcmlwdCkKKyAgICAgKiBAcGFyYW0gYXJncyAgICAgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgdG8gcGFzcyBpbgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgcnVuKGZpbmFsIElucHV0U3RyZWFtIGluLCBmaW5hbCBTdHJpbmcgZmlsZU5hbWUsIFN0cmluZ1tdIGFyZ3MpIHRocm93cyBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbiB7CisgICAgICAgIEdyb292eUNvZGVTb3VyY2UgZ2NzID0gKEdyb292eUNvZGVTb3VyY2UpIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgeworICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBHcm9vdnlDb2RlU291cmNlKGluLCBmaWxlTmFtZSwgIi9ncm9vdnkvc2hlbGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIENsYXNzIHNjcmlwdENsYXNzID0gcGFyc2VDbGFzcyhnY3MpOworICAgICAgICByZXR1cm4gcnVuTWFpbk9yVGVzdE9yUnVubmFibGUoc2NyaXB0Q2xhc3MsIGFyZ3MpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFyaWFibGUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0VmFyaWFibGVzKCkuZ2V0KG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFZhcmlhYmxlKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgY29udGV4dC5zZXRWYXJpYWJsZShuYW1lLCB2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXZhbHVhdGVzIHNvbWUgc2NyaXB0IGFnYWluc3QgdGhlIGN1cnJlbnQgQmluZGluZyBhbmQgcmV0dXJucyB0aGUgcmVzdWx0CisgICAgICoKKyAgICAgKiBAcGFyYW0gY29kZVNvdXJjZQorICAgICAqIEB0aHJvd3MgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBldmFsdWF0ZShHcm9vdnlDb2RlU291cmNlIGNvZGVTb3VyY2UpIHRocm93cyBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbiB7CisgICAgICAgIFNjcmlwdCBzY3JpcHQgPSBwYXJzZShjb2RlU291cmNlKTsKKyAgICAgICAgcmV0dXJuIHNjcmlwdC5ydW4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFdmFsdWF0ZXMgc29tZSBzY3JpcHQgYWdhaW5zdCB0aGUgY3VycmVudCBCaW5kaW5nIGFuZCByZXR1cm5zIHRoZSByZXN1bHQKKyAgICAgKgorICAgICAqIEBwYXJhbSBzY3JpcHRUZXh0IHRoZSB0ZXh0IG9mIHRoZSBzY3JpcHQKKyAgICAgKiBAcGFyYW0gZmlsZU5hbWUgICBpcyB0aGUgbG9naWNhbCBmaWxlIG5hbWUgb2YgdGhlIHNjcmlwdCAod2hpY2ggaXMgdXNlZCB0byBjcmVhdGUgdGhlIGNsYXNzIG5hbWUgb2YgdGhlIHNjcmlwdCkKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGV2YWx1YXRlKFN0cmluZyBzY3JpcHRUZXh0LCBTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gZXZhbHVhdGUobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHNjcmlwdFRleHQuZ2V0Qnl0ZXMoY29uZmlnLmdldFNvdXJjZUVuY29kaW5nKCkpKSwgZmlsZU5hbWUpOworICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbigwLCBudWxsLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEV2YWx1YXRlcyBzb21lIHNjcmlwdCBhZ2FpbnN0IHRoZSBjdXJyZW50IEJpbmRpbmcgYW5kIHJldHVybnMgdGhlIHJlc3VsdC4KKyAgICAgKiBUaGUgLmNsYXNzIGZpbGUgY3JlYXRlZCBmcm9tIHRoZSBzY3JpcHQgaXMgZ2l2ZW4gdGhlIHN1cHBsaWVkIGNvZGVCYXNlCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBldmFsdWF0ZShTdHJpbmcgc2NyaXB0VGV4dCwgU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgY29kZUJhc2UpIHRocm93cyBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gZXZhbHVhdGUobmV3IEdyb292eUNvZGVTb3VyY2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHNjcmlwdFRleHQuZ2V0Qnl0ZXMoY29uZmlnLmdldFNvdXJjZUVuY29kaW5nKCkpKSwgZmlsZU5hbWUsIGNvZGVCYXNlKSk7CisgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uKDAsIG51bGwsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRXZhbHVhdGVzIHNvbWUgc2NyaXB0IGFnYWluc3QgdGhlIGN1cnJlbnQgQmluZGluZyBhbmQgcmV0dXJucyB0aGUgcmVzdWx0CisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZSBpcyB0aGUgZmlsZSBvZiB0aGUgc2NyaXB0ICh3aGljaCBpcyB1c2VkIHRvIGNyZWF0ZSB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgc2NyaXB0KQorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZXZhbHVhdGUoRmlsZSBmaWxlKSB0aHJvd3MgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGV2YWx1YXRlKG5ldyBHcm9vdnlDb2RlU291cmNlKGZpbGUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFdmFsdWF0ZXMgc29tZSBzY3JpcHQgYWdhaW5zdCB0aGUgY3VycmVudCBCaW5kaW5nIGFuZCByZXR1cm5zIHRoZSByZXN1bHQKKyAgICAgKgorICAgICAqIEBwYXJhbSBzY3JpcHRUZXh0IHRoZSB0ZXh0IG9mIHRoZSBzY3JpcHQKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGV2YWx1YXRlKFN0cmluZyBzY3JpcHRUZXh0KSB0aHJvd3MgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGV2YWx1YXRlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzY3JpcHRUZXh0LmdldEJ5dGVzKGNvbmZpZy5nZXRTb3VyY2VFbmNvZGluZygpKSksIGdlbmVyYXRlU2NyaXB0TmFtZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24oMCwgbnVsbCwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFdmFsdWF0ZXMgc29tZSBzY3JpcHQgYWdhaW5zdCB0aGUgY3VycmVudCBCaW5kaW5nIGFuZCByZXR1cm5zIHRoZSByZXN1bHQKKyAgICAgKgorICAgICAqIEBwYXJhbSBpbiB0aGUgc3RyZWFtIHJlYWRpbmcgdGhlIHNjcmlwdAorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZXZhbHVhdGUoSW5wdXRTdHJlYW0gaW4pIHRocm93cyBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBldmFsdWF0ZShpbiwgZ2VuZXJhdGVTY3JpcHROYW1lKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV2YWx1YXRlcyBzb21lIHNjcmlwdCBhZ2FpbnN0IHRoZSBjdXJyZW50IEJpbmRpbmcgYW5kIHJldHVybnMgdGhlIHJlc3VsdAorICAgICAqCisgICAgICogQHBhcmFtIGluICAgICAgIHRoZSBzdHJlYW0gcmVhZGluZyB0aGUgc2NyaXB0CisgICAgICogQHBhcmFtIGZpbGVOYW1lIGlzIHRoZSBsb2dpY2FsIGZpbGUgbmFtZSBvZiB0aGUgc2NyaXB0ICh3aGljaCBpcyB1c2VkIHRvIGNyZWF0ZSB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgc2NyaXB0KQorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZXZhbHVhdGUoSW5wdXRTdHJlYW0gaW4sIFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uIHsKKyAgICAgICAgU2NyaXB0IHNjcmlwdCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzY3JpcHQgPSBwYXJzZShpbiwgZmlsZU5hbWUpOworICAgICAgICAgICAgcmV0dXJuIHNjcmlwdC5ydW4oKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChzY3JpcHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEludm9rZXJIZWxwZXIucmVtb3ZlQ2xhc3Moc2NyaXB0LmdldENsYXNzKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2VzIHRoZSBnaXZlbiBzY3JpcHQgYW5kIHJldHVybnMgaXQgcmVhZHkgdG8gYmUgcnVuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW4gICAgICAgdGhlIHN0cmVhbSByZWFkaW5nIHRoZSBzY3JpcHQKKyAgICAgKiBAcGFyYW0gZmlsZU5hbWUgaXMgdGhlIGxvZ2ljYWwgZmlsZSBuYW1lIG9mIHRoZSBzY3JpcHQgKHdoaWNoIGlzIHVzZWQgdG8gY3JlYXRlIHRoZSBjbGFzcyBuYW1lIG9mIHRoZSBzY3JpcHQpCisgICAgICogQHJldHVybiB0aGUgcGFyc2VkIHNjcmlwdCB3aGljaCBpcyByZWFkeSB0byBiZSBydW4gdmlhIEBsaW5rIFNjcmlwdC5ydW4oKQorICAgICAqLworICAgIHB1YmxpYyBTY3JpcHQgcGFyc2UoZmluYWwgSW5wdXRTdHJlYW0gaW4sIGZpbmFsIFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uIHsKKyAgICAgICAgR3Jvb3Z5Q29kZVNvdXJjZSBnY3MgPSAoR3Jvb3Z5Q29kZVNvdXJjZSkgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7CisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEdyb292eUNvZGVTb3VyY2UoaW4sIGZpbGVOYW1lLCAiL2dyb292eS9zaGVsbCIpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIHBhcnNlKGdjcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2VzIHRoZSBncm9vdnkgY29kZSBjb250YWluZWQgaW4gY29kZVNvdXJjZSBhbmQgcmV0dXJucyBhIGphdmEgY2xhc3MuCisgICAgICovCisgICAgcHJpdmF0ZSBDbGFzcyBwYXJzZUNsYXNzKGZpbmFsIEdyb292eUNvZGVTb3VyY2UgY29kZVNvdXJjZSkgdGhyb3dzIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gRG9uJ3QgY2FjaGUgc2NyaXB0cworICAgICAgICByZXR1cm4gbG9hZGVyLnBhcnNlQ2xhc3MoY29kZVNvdXJjZSwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlcyB0aGUgZ2l2ZW4gc2NyaXB0IGFuZCByZXR1cm5zIGl0IHJlYWR5IHRvIGJlIHJ1bi4gIFdoZW4gcnVubmluZyBpbiBhIHNlY3VyZSBlbnZpcm9ubWVudAorICAgICAqICgtRGphdmEuc2VjdXJpdHkubWFuYWdlcikgY29kZVNvdXJjZS5nZXRDb2RlU291cmNlKCkgZGV0ZXJtaW5lcyB3aGF0IHBvbGljeSBncmFudHMgc2hvdWxkIGJlCisgICAgICogZ2l2ZW4gdG8gdGhlIHNjcmlwdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb2RlU291cmNlCisgICAgICogQHJldHVybiByZWFkeSB0byBydW4gc2NyaXB0CisgICAgICovCisgICAgcHVibGljIFNjcmlwdCBwYXJzZShmaW5hbCBHcm9vdnlDb2RlU291cmNlIGNvZGVTb3VyY2UpIHRocm93cyBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBJbnZva2VySGVscGVyLmNyZWF0ZVNjcmlwdChwYXJzZUNsYXNzKGNvZGVTb3VyY2UpLCBjb250ZXh0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgdGhlIGdpdmVuIHNjcmlwdCBhbmQgcmV0dXJucyBpdCByZWFkeSB0byBiZSBydW4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlIGlzIHRoZSBmaWxlIG9mIHRoZSBzY3JpcHQgKHdoaWNoIGlzIHVzZWQgdG8gY3JlYXRlIHRoZSBjbGFzcyBuYW1lIG9mIHRoZSBzY3JpcHQpCisgICAgICovCisgICAgcHVibGljIFNjcmlwdCBwYXJzZShGaWxlIGZpbGUpIHRocm93cyBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gcGFyc2UobmV3IEdyb292eUNvZGVTb3VyY2UoZmlsZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlcyB0aGUgZ2l2ZW4gc2NyaXB0IGFuZCByZXR1cm5zIGl0IHJlYWR5IHRvIGJlIHJ1bgorICAgICAqCisgICAgICogQHBhcmFtIHNjcmlwdFRleHQgdGhlIHRleHQgb2YgdGhlIHNjcmlwdAorICAgICAqLworICAgIHB1YmxpYyBTY3JpcHQgcGFyc2UoU3RyaW5nIHNjcmlwdFRleHQpIHRocm93cyBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gcGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHNjcmlwdFRleHQuZ2V0Qnl0ZXMoY29uZmlnLmdldFNvdXJjZUVuY29kaW5nKCkpKSwgZ2VuZXJhdGVTY3JpcHROYW1lKCkpOworICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbigwLCBudWxsLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBTY3JpcHQgcGFyc2UoU3RyaW5nIHNjcmlwdFRleHQsIFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBwYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oc2NyaXB0VGV4dC5nZXRCeXRlcyhjb25maWcuZ2V0U291cmNlRW5jb2RpbmcoKSkpLCBmaWxlTmFtZSk7CisgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uKDAsIG51bGwsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2VzIHRoZSBnaXZlbiBzY3JpcHQgYW5kIHJldHVybnMgaXQgcmVhZHkgdG8gYmUgcnVuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW4gdGhlIHN0cmVhbSByZWFkaW5nIHRoZSBzY3JpcHQKKyAgICAgKi8KKyAgICBwdWJsaWMgU2NyaXB0IHBhcnNlKElucHV0U3RyZWFtIGluKSB0aHJvd3MgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gcGFyc2UoaW4sIGdlbmVyYXRlU2NyaXB0TmFtZSgpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIFN0cmluZyBnZW5lcmF0ZVNjcmlwdE5hbWUoKSB7CisgICAgICAgIHJldHVybiAiU2NyaXB0IiArICgrK2NvdW50ZXIpICsgIi5ncm9vdnkiOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbGFuZy9Hcm9vdnlTeXN0ZW0uamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbGFuZy9Hcm9vdnlTeXN0ZW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGNmOGU3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL0dyb292eVN5c3RlbS5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBncm9vdnkubGFuZzsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5tZXRhY2xhc3MuTWV0YUNsYXNzUmVnaXN0cnlJbXBsOworCitwdWJsaWMgZmluYWwgY2xhc3MgR3Jvb3Z5U3lzdGVtIHsKKyAgICAvLworICAgIC8vICBUT0RPOiBtYWtlIHRoaXMgaW5pdGlhbGlzYXRpb24gYWJsZSB0byBzZXQgdXNlUmVmbGVjdGlvbiB0cnVlCisgICAgLy8gIFRPRE86IGhhdmUgc29tZSB3YXkgb2Ygc3BlY2lmeWluZyBhbm90aGVyIE1ldGFDbGFzcyBSZWdpc3RyeSBpbXBsZW1lbnRhdGlvbgorICAgIC8vCisgICAgc3RhdGljIHsKKyAgICAgICAgVVNFX1JFRkxFQ1RJT04gPSB0cnVlOworICAgICAgICBNRVRBX0NMQVNTX1JFR0lTVFJZID0gbmV3IE1ldGFDbGFzc1JlZ2lzdHJ5SW1wbCgpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGUgTWV0YUNsYXNzIGZvciBqYXZhLmxhbmcuT2JqZWN0CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgTWV0YUNsYXNzIG9iamVjdE1ldGFDbGFzczsKKyAgICAvKioKKyAgICAgKiBJZiB0cnVlIHRoZW4gdGhlIE1ldGFDbGFzcyB3aWxsIG9ubHkgdXNlIHJlZmxlY3Rpb24gZm9yIG1ldGhvZCBkaXNwYXRjaCwgcHJvcGVydHkgYWNlc3MsIGV0Yy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFVTRV9SRUZMRUNUSU9OOworICAgIC8qKgorICAgICAqIFJlZmVyZW5jZSB0byB0aGUgTWV0YUNsYXNzIFJlZ2lzdHJ5IHRvIGJlIHVzZWQgYnkgdGhlIEdyb292eSBydW4gdGltZSBzeXN0ZW0gdG8gbWFwIGNsYXNzZXMgdG8gTWV0YUNsYXNzZXMKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZXRhQ2xhc3NSZWdpc3RyeSBNRVRBX0NMQVNTX1JFR0lTVFJZOworCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBrZWVwSmF2YU1ldGFDbGFzc2VzPWZhbHNlOworICAgIAorICAgIHByaXZhdGUgR3Jvb3Z5U3lzdGVtKCkgeworICAgICAgICAvLyBEbyBub3QgYWxsb3cgdGhpcyBjbGFzcyB0byBiZSBpbnN0YW50aWF0ZWQKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNVc2VSZWZsZWN0aW9uKCkgeworICAgICAgICByZXR1cm4gVVNFX1JFRkxFQ1RJT047CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBNZXRhQ2xhc3NSZWdpc3RyeSBnZXRNZXRhQ2xhc3NSZWdpc3RyeSgpIHsKKyAgICAgICAgcmV0dXJuIE1FVEFfQ0xBU1NfUkVHSVNUUlk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRLZWVwSmF2YU1ldGFDbGFzc2VzKGJvb2xlYW4ga2VlcEphdmFNZXRhQ2xhc3NlcykgeworICAgICAgICBHcm9vdnlTeXN0ZW0ua2VlcEphdmFNZXRhQ2xhc3NlcyA9IGtlZXBKYXZhTWV0YUNsYXNzZXM7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0tlZXBKYXZhTWV0YUNsYXNzZXMoKSB7CisgICAgICAgIHJldHVybiBrZWVwSmF2YU1ldGFDbGFzc2VzOworICAgIH0KKyAgICAKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbGFuZy9JbGxlZ2FsUHJvcGVydHlBY2Nlc3NFeGNlcHRpb24uamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbGFuZy9JbGxlZ2FsUHJvcGVydHlBY2Nlc3NFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmY0OTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL0lsbGVnYWxQcm9wZXJ0eUFjY2Vzc0V4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBncm9vdnkubGFuZzsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOworCisvKioKKyAqIEFuIGV4Y2VwdGlvbiBvY2N1cnJlZCBpZiBhIGR5bmFtaWMgcHJvcGVydHkgZGlzcGF0Y2ggZmFpbHMgd2l0aCBhIAorICogZmllbGQgbm90IGFjY2Vzc2libGUuCisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmJsYWNrZHJhZ0B1bmkuZGUiPkpvY2hlbiBUaGVvZG9yb3U8L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBJbGxlZ2FsUHJvcGVydHlBY2Nlc3NFeGNlcHRpb24gZXh0ZW5kcyBNaXNzaW5nUHJvcGVydHlFeGNlcHRpb24geworICAgIAorICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBtYWtlTWVzc2FnZShTdHJpbmcgcHJvcGVydHlOYW1lLCBDbGFzcyBjbGF6eiwgaW50IG1vZGlmaWVycywgYm9vbGVhbiBpc0ZpZWxkKSB7CisgICAgICAgIFN0cmluZyBhY2Nlc3MgPSAicHJpdmF0ZSI7CisgICAgICAgIGlmIChNb2RpZmllci5pc1Byb3RlY3RlZChtb2RpZmllcnMpKSBhY2Nlc3MgPSAicHJvdGVjdGVkIjsKKyAgICAgICAgaWYgKE1vZGlmaWVyLmlzUHVibGljKG1vZGlmaWVycykpIGFjY2VzcyA9ICJwdWJsaWMiOworICAgICAgICBTdHJpbmcgcHJvcGVydHlUeXBlID0gInByb3BlcnR5IjsKKyAgICAgICAgaWYgKGlzRmllbGQpIHByb3BlcnR5VHlwZSA9ICJmaWVsZCI7CisgICAgICAgIHJldHVybiAgIkNhbiBub3QgYWNjZXNzIHRoZSAiK2FjY2VzcysiICIrcHJvcGVydHlUeXBlKyIgIitwcm9wZXJ0eU5hbWUrIiBpbiBjbGFzcyAiK2NsYXp6LmdldE5hbWUoKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIElsbGVnYWxQcm9wZXJ0eUFjY2Vzc0V4Y2VwdGlvbihTdHJpbmcgcHJvcGVydHlOYW1lLCBDbGFzcyBjbGF6eiwgaW50IG1vZGlmaWVycykgeworICAgICAgICBzdXBlcihtYWtlTWVzc2FnZShwcm9wZXJ0eU5hbWUsY2xhenosbW9kaWZpZXJzLGZhbHNlKSxwcm9wZXJ0eU5hbWUsY2xhenopOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgSWxsZWdhbFByb3BlcnR5QWNjZXNzRXhjZXB0aW9uKEZpZWxkIGZpZWxkLCBDbGFzcyBjbGF6eikgeworICAgICAgICBzdXBlcihtYWtlTWVzc2FnZShmaWVsZC5nZXROYW1lKCksY2xhenosZmllbGQuZ2V0TW9kaWZpZXJzKCksdHJ1ZSksZmllbGQuZ2V0TmFtZSgpLGNsYXp6KTsKKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvSW5jb3JyZWN0Q2xvc3VyZUFyZ3VtZW50c0V4Y2VwdGlvbi5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL0luY29ycmVjdENsb3N1cmVBcmd1bWVudHNFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2NkZWI2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL0luY29ycmVjdENsb3N1cmVBcmd1bWVudHNFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgZ3Jvb3Z5Lmxhbmc7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuSW52b2tlckhlbHBlcjsKKworLyoqCisgKiBBbiBleGNlcHRpb24gb2NjdXJyZWQgd2hlbiBpbnZva2luZyBhIENsb3N1cmUgd2l0aCB0aGUgd3JvbmcgbnVtYmVyIGFuZC9vcgorICogdHlwZXMgb2YgYXJndW1lbnRzCisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBJbmNvcnJlY3RDbG9zdXJlQXJndW1lbnRzRXhjZXB0aW9uIGV4dGVuZHMgR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbiB7CisKKyAgICBwcml2YXRlIGZpbmFsIENsb3N1cmUgY2xvc3VyZTsKKyAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBhcmd1bWVudHM7CisgICAgcHJpdmF0ZSBmaW5hbCBDbGFzc1tdIGV4cGVjdGVkOworCisgICAgcHVibGljIEluY29ycmVjdENsb3N1cmVBcmd1bWVudHNFeGNlcHRpb24oQ2xvc3VyZSBjbG9zdXJlLCBPYmplY3QgYXJndW1lbnRzLCBDbGFzc1tdIGV4cGVjdGVkKSB7CisgICAgICAgIHN1cGVyKAorICAgICAgICAgICAgIkluY29ycmVjdCBhcmd1bWVudHMgdG8gY2xvc3VyZTogIgorICAgICAgICAgICAgICAgICsgY2xvc3VyZQorICAgICAgICAgICAgICAgICsgIi4gRXhwZWN0ZWQ6ICIKKyAgICAgICAgICAgICAgICArIEludm9rZXJIZWxwZXIudG9TdHJpbmcoZXhwZWN0ZWQpCisgICAgICAgICAgICAgICAgKyAiLCBhY3R1YWw6ICIKKyAgICAgICAgICAgICAgICArIEludm9rZXJIZWxwZXIudG9TdHJpbmcoYXJndW1lbnRzKSk7CisgICAgICAgIHRoaXMuY2xvc3VyZSA9IGNsb3N1cmU7CisgICAgICAgIHRoaXMuYXJndW1lbnRzID0gYXJndW1lbnRzOworICAgICAgICB0aGlzLmV4cGVjdGVkID0gZXhwZWN0ZWQ7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRBcmd1bWVudHMoKSB7CisgICAgICAgIHJldHVybiBhcmd1bWVudHM7CisgICAgfQorCisgICAgcHVibGljIENsb3N1cmUgZ2V0Q2xvc3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIGNsb3N1cmU7CisgICAgfQorCisgICAgcHVibGljIENsYXNzW10gZ2V0RXhwZWN0ZWQoKSB7CisgICAgICAgIHJldHVybiBleHBlY3RlZDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbGFuZy9JbnRSYW5nZS5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL0ludFJhbmdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZkMDIyMQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbGFuZy9JbnRSYW5nZS5qYXZhCkBAIC0wLDAgKzEsMzQ3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBncm9vdnkubGFuZzsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5JdGVyYXRvckNsb3N1cmVBZGFwdGVyOworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CitpbXBvcnQgamF2YS51dGlsLkFic3RyYWN0TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogUmVwcmVzZW50cyBhIGxpc3Qgb2YgSW50ZWdlciBvYmplY3RzIGZyb20gYSBzcGVjaWZpZWQgaW50IHVwIChvciBkb3duKSB0byBhbmQgaW5jbHVkaW5nCisgKiBhIGdpdmVuIHRvLjxwPgorICogPHAvPgorICogVGhpcyBjbGFzcyBpcyBhIGNvcHkgb2Yge0BsaW5rIE9iamVjdFJhbmdlfSBvcHRpbWl6ZWQgZm9yIDxjb2RlPmludDwvY29kZT4uICBJZiB5b3UgbWFrZSBhbnkKKyAqIGNoYW5nZXMgdG8gdGhpcyBjbGFzcywgeW91IG1pZ2h0IGNvbnNpZGVyIG1ha2luZyBwYXJhbGxlbCBjaGFuZ2VzIHRvIHtAbGluayBPYmplY3RSYW5nZX0uCisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIEludFJhbmdlIGV4dGVuZHMgQWJzdHJhY3RMaXN0IGltcGxlbWVudHMgUmFuZ2UgeworCisgICAgLyoqCisgICAgICogSXRlcmF0ZXMgdGhyb3VnaCBlYWNoIG51bWJlciBpbiBhbiA8Y29kZT5JbnRSYW5nZTwvY29kZT4uCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBJbnRSYW5nZUl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3IgeworICAgICAgICAvKioKKyAgICAgICAgICogQ291bnRzIGZyb20gMCB1cCB0byBzaXplIC0gMS4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgaW50IGluZGV4OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbnVtYmVyIG9mIHZhbHVlcyBpbiB0aGUgcmFuZ2UuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGludCBzaXplID0gc2l6ZSgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbmV4dCB2YWx1ZSB0byByZXR1cm4uCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGludCB2YWx1ZSA9IHJldmVyc2UgPyB0byA6IGZyb207CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisgICAgICAgICAgICByZXR1cm4gaW5kZXggPCBzaXplOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsKKyAgICAgICAgICAgIGlmIChpbmRleCsrID4gMCkgeworICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IHNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldmVyc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC0tdmFsdWU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICArK3ZhbHVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnRlZ2VyKHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBOb3Qgc3VwcG9ydGVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAdGhyb3dzIGphdmF4Lm5hbWluZy5PcGVyYXRpb25Ob3RTdXBwb3J0ZWRFeGNlcHRpb24gYWx3YXlzCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7CisgICAgICAgICAgICBJbnRSYW5nZS50aGlzLnJlbW92ZShpbmRleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZmlyc3QgbnVtYmVyIGluIHRoZSByYW5nZS4gIDxjb2RlPmZyb20gPC9jb2RlPiBpcyBhbHdheXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDxjb2RlPnRvPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBmcm9tOworCisgICAgLyoqCisgICAgICogVGhlIGxhc3QgbnVtYmVyIGluIHRoZSByYW5nZS4gPGNvZGU+dG88L2NvZGU+IGlzIGFsd2F5cyBncmVhdGVyIHRoYW4gb3IgZXFhdWwgdG8gPGNvZGU+ZnJvbTwvY29kZT4uCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgdG87CisKKyAgICAvKioKKyAgICAgKiBJZiA8Y29kZT5mYWxzZTwvY29kZT4sIGNvdW50cyB1cCBmcm9tIDxjb2RlPmZyb208L2NvZGU+IHRvIDxjb2RlPnRvPC9jb2RlPi4gIE90aGVyd2lzZSwgY291bnRzIGRvd24KKyAgICAgKiBmcm9tIDxjb2RlPnRvPC9jb2RlPiB0byA8Y29kZT5mcm9tPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gcmV2ZXJzZTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SW50UmFuZ2U8L2NvZGU+LiBJZiA8Y29kZT5mcm9tPC9jb2RlPiBpcyBncmVhdGVyCisgICAgICogdGhhbiA8Y29kZT50bzwvY29kZT4sIGEgcmV2ZXJzZSByYW5nZSBpcyBjcmVhdGVkIHdpdGgKKyAgICAgKiA8Y29kZT5mcm9tPC9jb2RlPiBhbmQgPGNvZGU+dG88L2NvZGU+IHN3YXBwZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJvbSB0aGUgZmlyc3QgbnVtYmVyIGluIHRoZSByYW5nZS4KKyAgICAgKiBAcGFyYW0gdG8gICB0aGUgbGFzdCBudW1iZXIgaW4gdGhlIHJhbmdlLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSByYW5nZSB3b3VsZCBjb250YWluIG1vcmUgdGhhbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAbGluayBJbnRlZ2VyI01BWF9WQUxVRX0gdmFsdWVzLgorICAgICAqLworICAgIHB1YmxpYyBJbnRSYW5nZShpbnQgZnJvbSwgaW50IHRvKSB7CisgICAgICAgIGlmIChmcm9tID4gdG8pIHsKKyAgICAgICAgICAgIHRoaXMuZnJvbSA9IHRvOworICAgICAgICAgICAgdGhpcy50byA9IGZyb207CisgICAgICAgICAgICB0aGlzLnJldmVyc2UgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy5mcm9tID0gZnJvbTsKKyAgICAgICAgICAgIHRoaXMudG8gPSB0bzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHNpemUoKSBhbiBpbnRlZ2VyIHNvIHJhbmdlcyBjYW4gaGF2ZSBubyBtb3JlIHRoYW4gSW50ZWdlci5NQVhfVkFMVUUgZWxlbWVudHMKKyAgICAgICAgaWYgKHRoaXMudG8gLSB0aGlzLmZyb20gPj0gSW50ZWdlci5NQVhfVkFMVUUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJhbmdlIG11c3QgaGF2ZSBubyBtb3JlIHRoYW4gIiArIEludGVnZXIuTUFYX1ZBTFVFICsgIiBlbGVtZW50cyIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5JbnRSYW5nZTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJvbSAgICB0aGUgZmlyc3QgdmFsdWUgaW4gdGhlIHJhbmdlLgorICAgICAqIEBwYXJhbSB0byAgICAgIHRoZSBsYXN0IHZhbHVlIGluIHRoZSByYW5nZS4KKyAgICAgKiBAcGFyYW0gcmV2ZXJzZSA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcmFuZ2Ugc2hvdWxkIGNvdW50IGZyb20KKyAgICAgKiAgICAgICAgICAgICAgICA8Y29kZT50bzwvY29kZT4gdG8gPGNvZGU+ZnJvbTwvY29kZT4uCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgPGNvZGU+ZnJvbTwvY29kZT4gaXMgZ3JlYXRlciB0aGFuIDxjb2RlPnRvPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSW50UmFuZ2UoaW50IGZyb20sIGludCB0bywgYm9vbGVhbiByZXZlcnNlKSB7CisgICAgICAgIGlmIChmcm9tID4gdG8pIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIidmcm9tJyBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAndG8nIik7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLmZyb20gPSBmcm9tOworICAgICAgICB0aGlzLnRvID0gdG87CisgICAgICAgIHRoaXMucmV2ZXJzZSA9IHJldmVyc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lcyBpZiB0aGlzIG9iamVjdCBpcyBlcXVhbCB0byBhbm90aGVyIG9iamVjdC4gRGVsZWdhdGVzIHRvCisgICAgICoge0BsaW5rIEFic3RyYWN0TGlzdCNlcXVhbHMoT2JqZWN0KX0gaWYgPGNvZGU+dGhhdDwvY29kZT4gaXMgYW50aGluZworICAgICAqIG90aGVyIHRoYW4gYW4ge0BsaW5rIEludFJhbmdlfS4KKyAgICAgKiA8cC8+CisgICAgICogPHAvPgorICAgICAqIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gb3ZlcnJpZGUgPGNvZGU+aGFzaENvZGU8L2NvZGU+LCBhcworICAgICAqIHtAbGluayBBYnN0cmFjdExpc3QjaGFzaENvZGUoKX0gcHJvdmlkZXMgYSBzdWl0YWJsZSBoYXNoIGNvZGUuPHA+CisgICAgICogPHAvPgorICAgICAqIE5vdGUgdGhhdCBlcXVhbHMgaXMgZ2VuZXJhbGx5IGhhbmRsZWQgYnkge0BsaW5rIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5EZWZhdWx0R3Jvb3Z5TWV0aG9kcyNlcXVhbHMoTGlzdCxMaXN0KX0KKyAgICAgKiBpbnN0ZWFkIG9mIHRoaXMgbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIHRoYXQgdGhlIG9iamVjdCB0byBjb21wYXJlCisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0cyBhcmUgZXF1YWwKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHRoYXQpIHsKKyAgICAgICAgcmV0dXJuIHRoYXQgaW5zdGFuY2VvZiBJbnRSYW5nZSA/IGVxdWFscygoSW50UmFuZ2UpIHRoYXQpIDogc3VwZXIuZXF1YWxzKHRoYXQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbXBhcmVzIGFuIHtAbGluayBJbnRSYW5nZX0gdG8gYW5vdGhlciB7QGxpbmsgSW50UmFuZ2V9LgorICAgICAqCisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcmFuZ2VzIGFyZSBlcXVhbAorICAgICAqIEBwYXJhbSB0aGF0IHRoZSBvYmplY3QgdG8gY29tcGFyZSBmb3IgZXF1YWxpdHkKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoSW50UmFuZ2UgdGhhdCkgeworICAgICAgICByZXR1cm4gdGhhdCAhPSBudWxsICYmIHRoaXMucmV2ZXJzZSA9PSB0aGF0LnJldmVyc2UgJiYgdGhpcy5mcm9tID09IHRoYXQuZnJvbSAmJiB0aGlzLnRvID09IHRoYXQudG87CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHB1YmxpYyBDb21wYXJhYmxlIGdldEZyb20oKSB7CisgICAgICAgIHJldHVybiBuZXcgSW50ZWdlcihmcm9tKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIENvbXBhcmFibGUgZ2V0VG8oKSB7CisgICAgICAgIHJldHVybiBuZXcgSW50ZWdlcih0byk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgJ2Zyb20nIHZhbHVlIGFzIGFuIGludGVnZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSAnZnJvbScgdmFsdWUgYXMgYW4gaW50ZWdlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEZyb21JbnQoKSB7CisgICAgICAgIHJldHVybiBmcm9tOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlICd0bycgdmFsdWUgYXMgYW4gaW50ZWdlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlICd0bycgdmFsdWUgYXMgYW4gaW50ZWdlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFRvSW50KCkgeworICAgICAgICByZXR1cm4gdG87CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUmV2ZXJzZSgpIHsKKyAgICAgICAgcmV0dXJuIHJldmVyc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNXaXRoaW5Cb3VuZHMoT2JqZWN0IG8pIHsKKyAgICAgICAgcmV0dXJuIGNvbnRhaW5zKG8pOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldChpbnQgaW5kZXgpIHsKKyAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oIkluZGV4OiAiICsgaW5kZXggKyAiIHNob3VsZCBub3QgYmUgbmVnYXRpdmUiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5kZXggPj0gc2l6ZSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiSW5kZXg6ICIgKyBpbmRleCArICIgdG9vIGJpZyBmb3IgcmFuZ2U6ICIgKyB0aGlzKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgdmFsdWUgPSByZXZlcnNlID8gdG8gLSBpbmRleCA6IGluZGV4ICsgZnJvbTsKKyAgICAgICAgcmV0dXJuIG5ldyBJbnRlZ2VyKHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICByZXR1cm4gdG8gLSBmcm9tICsgMTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgeworICAgICAgICByZXR1cm4gbmV3IEludFJhbmdlSXRlcmF0b3IoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIExpc3Qgc3ViTGlzdChpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkgeworICAgICAgICBpZiAoZnJvbUluZGV4IDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oImZyb21JbmRleCA9ICIgKyBmcm9tSW5kZXgpOworICAgICAgICB9CisgICAgICAgIGlmICh0b0luZGV4ID4gc2l6ZSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigidG9JbmRleCA9ICIgKyB0b0luZGV4KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZnJvbUluZGV4ID4gdG9JbmRleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZnJvbUluZGV4KCIgKyBmcm9tSW5kZXggKyAiKSA+IHRvSW5kZXgoIiArIHRvSW5kZXggKyAiKSIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZyb21JbmRleCA9PSB0b0luZGV4KSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEVtcHR5UmFuZ2UobmV3IEludGVnZXIoZnJvbSkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5ldyBJbnRSYW5nZShmcm9tSW5kZXggKyB0aGlzLmZyb20sIHRvSW5kZXggKyB0aGlzLmZyb20gLSAxLCByZXZlcnNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIHJldmVyc2UgPyAiIiArIHRvICsgIi4uIiArIGZyb20gOiAiIiArIGZyb20gKyAiLi4iICsgdG87CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgaW5zcGVjdCgpIHsKKyAgICAgICAgcmV0dXJuIHRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCB2YWx1ZSkgeworICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBJbnRlZ2VyKSB7CisgICAgICAgICAgICBJbnRlZ2VyIGludGVnZXIgPSAoSW50ZWdlcikgdmFsdWU7CisgICAgICAgICAgICBpbnQgaSA9IGludGVnZXIuaW50VmFsdWUoKTsKKyAgICAgICAgICAgIHJldHVybiBpID49IGZyb20gJiYgaSA8PSB0bzsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBCaWdJbnRlZ2VyKSB7CisgICAgICAgICAgICBCaWdJbnRlZ2VyIGJpZ2ludCA9IChCaWdJbnRlZ2VyKSB2YWx1ZTsKKyAgICAgICAgICAgIHJldHVybiBiaWdpbnQuY29tcGFyZVRvKEJpZ0ludGVnZXIudmFsdWVPZihmcm9tKSkgPj0gMCAmJgorICAgICAgICAgICAgICAgICAgICBiaWdpbnQuY29tcGFyZVRvKEJpZ0ludGVnZXIudmFsdWVPZih0bykpIDw9IDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbChDb2xsZWN0aW9uIG90aGVyKSB7CisgICAgICAgIGlmIChvdGhlciBpbnN0YW5jZW9mIEludFJhbmdlKSB7CisgICAgICAgICAgICBmaW5hbCBJbnRSYW5nZSByYW5nZSA9IChJbnRSYW5nZSkgb3RoZXI7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5mcm9tIDw9IHJhbmdlLmZyb20gJiYgcmFuZ2UudG8gPD0gdGhpcy50bzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIuY29udGFpbnNBbGwob3RoZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGVwKGludCBzdGVwLCBDbG9zdXJlIGNsb3N1cmUpIHsKKyAgICAgICAgaWYgKHJldmVyc2UpIHsKKyAgICAgICAgICAgIHN0ZXAgPSAtc3RlcDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RlcCA+PSAwKSB7CisgICAgICAgICAgICBpbnQgdmFsdWUgPSBmcm9tOworICAgICAgICAgICAgd2hpbGUgKHZhbHVlIDw9IHRvKSB7CisgICAgICAgICAgICAgICAgY2xvc3VyZS5jYWxsKG5ldyBJbnRlZ2VyKHZhbHVlKSk7CisgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSArIHN0ZXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgdmFsdWUgPSB0bzsKKyAgICAgICAgICAgIHdoaWxlICh2YWx1ZSA+PSBmcm9tKSB7CisgICAgICAgICAgICAgICAgY2xvc3VyZS5jYWxsKG5ldyBJbnRlZ2VyKHZhbHVlKSk7CisgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSArIHN0ZXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIExpc3Qgc3RlcChpbnQgc3RlcCkgeworICAgICAgICBJdGVyYXRvckNsb3N1cmVBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgSXRlcmF0b3JDbG9zdXJlQWRhcHRlcih0aGlzKTsKKyAgICAgICAgc3RlcChzdGVwLCBhZGFwdGVyKTsKKyAgICAgICAgcmV0dXJuIGFkYXB0ZXIuYXNMaXN0KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL0ludGVyY2VwdG9yLmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvSW50ZXJjZXB0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGEyMjg0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL0ludGVyY2VwdG9yLmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGdyb292eS5sYW5nOworCisvKioKKyAqIEltcGxlbWVudGVycyBvZiB0aGlzIGludGVyZmFjZSBjYW4gYmUgcmVnaXN0ZXJlZCBpbiB0aGUgUHJveHlNZXRhQ2xhc3MgZm9yCisgKiBub3RpZmljYXRpb25zIGFib3V0IG1ldGhvZCBjYWxscyBmb3Igb2JqZWN0cyBtYW5hZ2VkIGJ5IHRoZSBQcm94eU1ldGFDbGFzcy4KKyAqIFNlZSBncm9vdnkvbGFuZy9JbnRlcmNlcHRvclRlc3QuZ3Jvb3Z5IGZvciBkZXRhaWxzLgorICogQGF1dGhvciBEaWVyayBLb2VuaWcKKyAqLworcHVibGljIGludGVyZmFjZSBJbnRlcmNlcHRvciB7CisgICAgLyoqCisgICAgICogVGhpcyBjb2RlIGlzIGV4ZWN1dGVkIGJlZm9yZSB0aGUgbWV0aG9kIGlzIG9wdGlvbmFsbHkgY2FsbGVkLgorICAgICAqIEBwYXJhbSBvYmplY3QgICAgICAgIHJlY2VpdmVyIG9iamVjdCBmb3IgdGhlIG1ldGhvZCBjYWxsCisgICAgICogQHBhcmFtIG1ldGhvZE5hbWUgICAgbmFtZSBvZiB0aGUgbWV0aG9kIHRvIGNhbGwKKyAgICAgKiBAcGFyYW0gYXJndW1lbnRzICAgICBhcmd1bWVudHMgdG8gdGhlIG1ldGhvZCBjYWxsCisgICAgICogQHJldHVybiBhbnkgYXJiaXRyYXJ5IHJlc3VsdCB0aGF0IHJlcGxhY2VzIHRoZSByZXN1bHQgb2YgdGhlCisgICAgICogb3JpZ2luYWwgbWV0aG9kIGNhbGwgb25seSBpZiBkb0ludm9rZSgpIHJldHVybnMgZmFsc2UgYW5kIGFmdGVySW52b2tlKCkKKyAgICAgKiByZWxheXMgdGhpcyByZXN1bHQuCisgICAgICovCisgICAgT2JqZWN0IGJlZm9yZUludm9rZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbWV0aG9kTmFtZSwgT2JqZWN0W10gYXJndW1lbnRzKTsKKyAgICAvKioKKyAgICAgKiBUaGlzIGNvZGUgaXMgZXhlY3V0ZWQgYWZ0ZXIgdGhlIG1ldGhvZCBpcyBvcHRpb25hbGx5IGNhbGxlZC4KKyAgICAgKiBAcGFyYW0gb2JqZWN0ICAgICAgICByZWNlaXZlciBvYmplY3QgZm9yIHRoZSBjYWxsZWQgbWV0aG9kCisgICAgICogQHBhcmFtIG1ldGhvZE5hbWUgICAgbmFtZSBvZiB0aGUgY2FsbGVkIG1ldGhvZAorICAgICAqIEBwYXJhbSBhcmd1bWVudHMgICAgIGFyZ3VtZW50cyB0byB0aGUgY2FsbGVkIG1ldGhvZAorICAgICAqIEBwYXJhbSByZXN1bHQgICAgICAgIHJlc3VsdCBvZiB0aGUgZXhlY3V0ZWQgbWV0aG9kIGNhbGwgb3IgcmVzdWx0IG9mIGJlZm9yZUludm9rZSBpZiBtZXRob2Qgd2FzIG5vdCBjYWxsZWQKKyAgICAgKiBAcmV0dXJuIGFueSBhcmJpdHJhcnkgcmVzdWx0IHRoYXQgY2FuIHJlcGxhY2UgdGhlIHJlc3VsdCBvZiB0aGUKKyAgICAgKiBvcmlnaW5hbCBtZXRob2QgY2FsbC4gVHlwaWNhbGx5LCB0aGUgcmVzdWx0IHBhcmFtZXRlciBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBPYmplY3QgYWZ0ZXJJbnZva2UoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1ldGhvZE5hbWUsIE9iamVjdFtdIGFyZ3VtZW50cywgT2JqZWN0IHJlc3VsdCk7CisgICAgLyoqCisgICAgICogQHJldHVybiB3aGV0aGVyIHRoZSB0YXJnZXQgbWV0aG9kIHNob3VsZCBiZSBpbnZva2VkIGF0IGFsbC4KKyAgICAgKi8KKyAgICBib29sZWFuIGRvSW52b2tlKCk7Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvTWV0YUFycmF5TGVuZ3RoUHJvcGVydHkuamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbGFuZy9NZXRhQXJyYXlMZW5ndGhQcm9wZXJ0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyYTk3MzIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvTWV0YUFycmF5TGVuZ3RoUHJvcGVydHkuamF2YQpAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBncm9vdnkubGFuZzsKKworCisvKioKKyAqIFJlcHJlc2VudHMgYSBwcm9wZXJ0eSBvbiBhIGJlYW4gd2hpY2ggbWF5IGhhdmUgYSBnZXR0ZXIgYW5kL29yIGEgc2V0dGVyCisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBNZXRhQXJyYXlMZW5ndGhQcm9wZXJ0eSBleHRlbmRzIE1ldGFQcm9wZXJ0eSB7CisKKyAgICBwdWJsaWMgTWV0YUFycmF5TGVuZ3RoUHJvcGVydHkoKSB7CisJCXN1cGVyKCJsZW5ndGgiLCBpbnQuY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHByb3BlcnR5IG9mIHRoZSBnaXZlbiBvYmplY3QKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpZiB0aGUgcHJvcGVydHkgY291bGQgbm90IGJlIGV2YWx1YXRlZAorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoT2JqZWN0IG9iamVjdCkgeworICAgICAgICByZXR1cm4gbmV3IEludGVnZXIoamF2YS5sYW5nLnJlZmxlY3QuQXJyYXkuZ2V0TGVuZ3RoKG9iamVjdCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHByb3BlcnR5IG9uIHRoZSBnaXZlbiBvYmplY3QgdG8gdGhlIG5ldyB2YWx1ZQorICAgICAqIAorICAgICAqIEBwYXJhbSBvYmplY3Qgb24gd2hpY2ggdG8gc2V0IHRoZSBwcm9wZXJ0eQorICAgICAqIEBwYXJhbSBuZXdWYWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eQorICAgICAqIEB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiBpZiB0aGUgcHJvcGVydHkgY291bGQgbm90IGJlIHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KE9iamVjdCBvYmplY3QsIE9iamVjdCBuZXdWYWx1ZSkgeworCQl0aHJvdyBuZXcgUmVhZE9ubHlQcm9wZXJ0eUV4Y2VwdGlvbigibGVuZ3RoIiwgb2JqZWN0LmdldENsYXNzKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbGFuZy9NZXRhQmVhblByb3BlcnR5LmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvTWV0YUJlYW5Qcm9wZXJ0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMWQ0NzEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvTWV0YUJlYW5Qcm9wZXJ0eS5qYXZhCkBAIC0wLDAgKzEsMTIxIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgZ3Jvb3Z5Lmxhbmc7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS50eXBlaGFuZGxpbmcuRGVmYXVsdFR5cGVUcmFuc2Zvcm1hdGlvbjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuTWV0YUNsYXNzSGVscGVyOworCisvKioKKyAqIFJlcHJlc2VudHMgYSBwcm9wZXJ0eSBvbiBhIGJlYW4gd2hpY2ggbWF5IGhhdmUgYSBnZXR0ZXIgYW5kL29yIGEgc2V0dGVyCisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEBhdXRob3IgUGlsaG8gS2ltCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBNZXRhQmVhblByb3BlcnR5IGV4dGVuZHMgTWV0YVByb3BlcnR5IHsKKworICAgIHByaXZhdGUgTWV0YU1ldGhvZCBnZXR0ZXI7CisgICAgcHJpdmF0ZSBNZXRhTWV0aG9kIHNldHRlcjsKKyAgICBwcml2YXRlIE1ldGFGaWVsZFByb3BlcnR5IGZpZWxkOworCisgICAgcHVibGljIE1ldGFCZWFuUHJvcGVydHkoU3RyaW5nIG5hbWUsIENsYXNzIHR5cGUsIE1ldGFNZXRob2QgZ2V0dGVyLCBNZXRhTWV0aG9kIHNldHRlcikgeworICAgICAgICBzdXBlcihuYW1lLCB0eXBlKTsKKyAgICAgICAgdGhpcy5nZXR0ZXIgPSBnZXR0ZXI7CisgICAgICAgIHRoaXMuc2V0dGVyID0gc2V0dGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcHJvcGVydHkgb2YgdGhlIGdpdmVuIG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvYmplY3Qgd2hpY2ggdG8gYmUgZ290CisgICAgICogQHJldHVybiB0aGUgcHJvcGVydHkgb2YgdGhlIGdpdmVuIG9iamVjdAorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGlmIHRoZSBwcm9wZXJ0eSBjb3VsZCBub3QgYmUgZXZhbHVhdGVkCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShPYmplY3Qgb2JqZWN0KSB7CisgICAgICAgIGlmIChnZXR0ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgLy9UT0RPOiB3ZSBwcm9iYWJseSBuZWVkIGEgV3JpdGVPbmx5RXhjZXB0aW9uIGNsYXNzCisgICAgICAgICAgICB0aHJvdyBuZXcgR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbigiQ2Fubm90IHJlYWQgd3JpdGUtb25seSBwcm9wZXJ0eTogIiArIG5hbWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBnZXR0ZXIuaW52b2tlKG9iamVjdCwgTWV0YUNsYXNzSGVscGVyLkVNUFRZX0FSUkFZKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHByb3BlcnR5IG9uIHRoZSBnaXZlbiBvYmplY3QgdG8gdGhlIG5ldyB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvYmplY3QgICBvbiB3aGljaCB0byBzZXQgdGhlIHByb3BlcnR5CisgICAgICogQHBhcmFtIG5ld1ZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlIHByb3BlcnR5CisgICAgICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uIGlmIHRoZSBwcm9wZXJ0eSBjb3VsZCBub3QgYmUgc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoT2JqZWN0IG9iamVjdCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisgICAgICAgIGlmIChzZXR0ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEdyb292eVJ1bnRpbWVFeGNlcHRpb24oIkNhbm5vdCBzZXQgcmVhZC1vbmx5IHByb3BlcnR5OiAiICsgbmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgbmV3VmFsdWUgPSBEZWZhdWx0VHlwZVRyYW5zZm9ybWF0aW9uLmNhc3RUb1R5cGUobmV3VmFsdWUsIGdldFR5cGUoKSk7CisgICAgICAgIHNldHRlci5pbnZva2Uob2JqZWN0LCBuZXcgT2JqZWN0W117bmV3VmFsdWV9KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGdldHRlciBtZXRob2QuCisgICAgICovCisgICAgcHVibGljIE1ldGFNZXRob2QgZ2V0R2V0dGVyKCkgeworICAgICAgICByZXR1cm4gZ2V0dGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgc2V0dGVyIG1ldGhvZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0YU1ldGhvZCBnZXRTZXR0ZXIoKSB7CisgICAgICAgIHJldHVybiBzZXR0ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBpcyBmb3IgTWV0YUNsYXNzIHRvIHBhdGNoIHVwIHRoZSBvYmplY3QgbGF0ZXIgd2hlbiBsb29raW5nIGZvciBnZXQqKCkgbWV0aG9kcy4KKyAgICAgKi8KKyAgICB2b2lkIHNldEdldHRlcihNZXRhTWV0aG9kIGdldHRlcikgeworICAgICAgICB0aGlzLmdldHRlciA9IGdldHRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIGZvciBNZXRhQ2xhc3MgdG8gcGF0Y2ggdXAgdGhlIG9iamVjdCBsYXRlciB3aGVuIGxvb2tpbmcgZm9yIHNldCooKSBtZXRob2RzLgorICAgICAqLworICAgIHZvaWQgc2V0U2V0dGVyKE1ldGFNZXRob2Qgc2V0dGVyKSB7CisgICAgICAgIHRoaXMuc2V0dGVyID0gc2V0dGVyOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0TW9kaWZpZXJzKCkgeworICAgICAgICBpZiAoc2V0dGVyICE9IG51bGwgJiYgZ2V0dGVyID09IG51bGwpIHJldHVybiBzZXR0ZXIuZ2V0TW9kaWZpZXJzKCk7CisgICAgICAgIGlmIChnZXR0ZXIgIT0gbnVsbCAmJiBzZXR0ZXIgPT0gbnVsbCkgcmV0dXJuIGdldHRlci5nZXRNb2RpZmllcnMoKTsKKyAgICAgICAgaW50IG1vZGlmaWVycyA9IGdldHRlci5nZXRNb2RpZmllcnMoKSB8IHNldHRlci5nZXRNb2RpZmllcnMoKTsKKyAgICAgICAgaW50IHZpc2liaWxpdHkgPSAwOworICAgICAgICBpZiAoTW9kaWZpZXIuaXNQdWJsaWMobW9kaWZpZXJzKSkgdmlzaWJpbGl0eSA9IE1vZGlmaWVyLlBVQkxJQzsKKyAgICAgICAgaWYgKE1vZGlmaWVyLmlzUHJvdGVjdGVkKG1vZGlmaWVycykpIHZpc2liaWxpdHkgPSBNb2RpZmllci5QUk9URUNURUQ7CisgICAgICAgIGlmIChNb2RpZmllci5pc1ByaXZhdGUobW9kaWZpZXJzKSkgdmlzaWJpbGl0eSA9IE1vZGlmaWVyLlBSSVZBVEU7CisgICAgICAgIGludCBzdGF0ZXMgPSBnZXR0ZXIuZ2V0TW9kaWZpZXJzKCkgJiBzZXR0ZXIuZ2V0TW9kaWZpZXJzKCk7CisgICAgICAgIHN0YXRlcyAmPSB+KE1vZGlmaWVyLlBVQkxJQyB8IE1vZGlmaWVyLlBST1RFQ1RFRCB8IE1vZGlmaWVyLlBSSVZBVEUpOworICAgICAgICBzdGF0ZXMgfD0gdmlzaWJpbGl0eTsKKyAgICAgICAgcmV0dXJuIHN0YXRlczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGaWVsZChNZXRhRmllbGRQcm9wZXJ0eSBmKSB7CisgICAgICAgIHRoaXMuZmllbGQgPSBmOworICAgIH0KKworICAgIHB1YmxpYyBNZXRhRmllbGRQcm9wZXJ0eSBnZXRGaWVsZCgpIHsKKyAgICAgICAgcmV0dXJuIGZpZWxkOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbGFuZy9NZXRhQ2xhc3MuamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbGFuZy9NZXRhQ2xhc3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODgzNzdjCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL01ldGFDbGFzcy5qYXZhCkBAIC0wLDAgKzEsMjE0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBncm9vdnkubGFuZzsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LkNsYXNzTm9kZTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEEgTWV0YUNsYXNzIHdpdGhpbiBHcm9vdnkgZGVmaW5lcyB0aGUgYmVoYXZpb3VyIG9mIGFueSBnaXZlbiBHcm9vdnkgb3IgSmF2YSBjbGFzcy4gVGhlIE1ldGFDbGFzcworICogaW50ZXJmYWNlIGRlZmluZXMgdHdvIHBhcnRzLiBUaGUgY2xpZW50IEFQSSwgd2hpY2ggaXMgZGVmaW5lZCB2aWEgdGhlIGV4dGVuZCBNZXRhT2JqZWN0UHJvdG9jb2wgaW50ZXJmYWNlCisgKiBhbmQgdGhlIGNvbnRyYWN0IHdpdGggdGhlIEdyb292eSBydW50aW1lIHN5c3RlbS4KKyAqCisgKiBJbiBnZW5lcmFsIHRoZSBjb21waWxlciBhbmQgR3Jvb3Z5IHJ1bnRpbWUgZW5naW5lIGludGVyYWN0IHdpdGggbWV0aG9kcyBvbiB0aGlzIGNsYXNzIHdoaWxzdCBNZXRhQ2xhc3MKKyAqIGNsaWVudHMgaW50ZXJhY3Qgd2l0aCB0aGUgbWV0aG9kIGRlZmluZWQgYnkgdGhlIE1ldGFPYmplY3RQcm90b2NvbCBpbnRlcmZhY2UKKyAqCisgKgorICogQHNlZSBNZXRhQ2xhc3NJbXBsCisgKiBAc2VlIGdyb292eS5sYW5nLk1ldGFPYmplY3RQcm90b2NvbAorICogCisgKiBAYXV0aG9yIEpvaG4gV2lsc29uCisgKiBAYXV0aG9yIEdyYWVtZSBSb2NoZXIKKyAqLworcHVibGljIGludGVyZmFjZSBNZXRhQ2xhc3MgZXh0ZW5kcyBNZXRhT2JqZWN0UHJvdG9jb2wgeworCisKKyAgICAvKioKKyAgICAgKiA8cD5JbnZva2VzIGEgbWV0aG9kIG9uIHRoZSBnaXZlbiByZWNlaXZlciBmb3IgdGhlIHNwZWNpZmllZCBhcmd1bWVudHMuIFRoZSBzZW5kZXIgaXMgdGhlIGNsYXNzIHRoYXQgaW52b2tlZCB0aGUgbWV0aG9kIG9uIHRoZSBvYmplY3QuCisgICAgICogVGhlIE1ldGFDbGFzcyB3aWxsIGF0dGVtcHQgdG8gZXN0YWJsaXNoIHRoZSBtZXRob2QgdG8gaW52b2tlIGJhc2VkIG9uIHRoZSBuYW1lIGFuZCBhcmd1bWVudHMgcHJvdmlkZWQuCisgICAgICoKKyAgICAgKiA8cD5UaGUgaXNDYWxsVG9TdXBlciBhbmQgZnJvbUluc2lkZUNsYXNzIGhlbHAgdGhlIEdyb292eSBydW50aW1lIHBlcmZvcm0gb3B0aW1pc2F0aW9ucyBvbiB0aGUgY2FsbCB0byBnbyBkaXJlY3RseQorICAgICAqIHRvIHRoZSBzdXBlciBjbGFzcyBpZiBuZWNlc3NhcnkKKyAgICAgKgorICAgICAqIEBwYXJhbSBzZW5kZXIgVGhlIGphdmEubGFuZy5DbGFzcyBpbnN0YW5jZSB0aGF0IGludm9rZWQgdGhlIG1ldGhvZAorICAgICAqIEBwYXJhbSByZWNlaXZlciBUaGUgb2JqZWN0IHdoaWNoIHRoZSBtZXRob2Qgd2FzIGludm9rZWQgb24KKyAgICAgKiBAcGFyYW0gbWV0aG9kTmFtZSBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kCisgICAgICogQHBhcmFtIGFyZ3VtZW50cyBUaGUgYXJndW1lbnRzIHRvIHRoZSBtZXRob2QKKyAgICAgKiBAcGFyYW0gaXNDYWxsVG9TdXBlciBXaGV0aGVyIHRoZSBtZXRob2QgaXMgYSBjYWxsIHRvIGEgc3VwZXIgY2xhc3MgbWV0aG9kCisgICAgICogQHBhcmFtIGZyb21JbnNpZGVDbGFzcyBXaGV0aGVyIHRoZSBjYWxsIHdhcyBpbnZva2VkIGZyb20gdGhlIGluc2lkZSBvciB0aGUgb3V0c2lkZSBvZiB0aGUgY2xhc3MKKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgbWV0aG9kCisgICAgICovCisgICAgIE9iamVjdCBpbnZva2VNZXRob2QoQ2xhc3Mgc2VuZGVyLCBPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXRob2ROYW1lLCBPYmplY3RbXSBhcmd1bWVudHMsIGJvb2xlYW4gaXNDYWxsVG9TdXBlciwgYm9vbGVhbiBmcm9tSW5zaWRlQ2xhc3MpOworCisKKyAgICAvKioKKyAgICAgKiA8cD5SZXRyaWV2ZXMgYSBwcm9wZXJ0eSBvbiB0aGUgZ2l2ZW4gcmVjZWl2ZXIgZm9yIHRoZSBzcGVjaWZpZWQgYXJndW1lbnRzLiBUaGUgc2VuZGVyIGlzIHRoZSBjbGFzcyB0aGF0IGlzIHJlcXVlc3RpbmcgdGhlIHByb3BlcnR5IGZyb20gdGhlIG9iamVjdC4KKyAgICAgKiBUaGUgTWV0YUNsYXNzIHdpbGwgYXR0ZW1wdCB0byBlc3RhYmxpc2ggdGhlIG1ldGhvZCB0byBpbnZva2UgYmFzZWQgb24gdGhlIG5hbWUgYW5kIGFyZ3VtZW50cyBwcm92aWRlZC4KKyAgICAgKgorICAgICAqIDxwPlRoZSBpc0NhbGxUb1N1cGVyIGFuZCBmcm9tSW5zaWRlQ2xhc3MgaGVscCB0aGUgR3Jvb3Z5IHJ1bnRpbWUgcGVyZm9ybSBvcHRpbWlzYXRpb25zIG9uIHRoZSBjYWxsIHRvIGdvIGRpcmVjdGx5CisgICAgICogdG8gdGhlIHN1cGVyIGNsYXNzIGlmIG5lY2Vzc2FyeQorICAgICAqCisgICAgICogQHBhcmFtIHNlbmRlciBUaGUgamF2YS5sYW5nLkNsYXNzIGluc3RhbmNlIHRoYXQgcmVxdWVzdGVkIHRoZSBwcm9wZXJ0eQorICAgICAqIEBwYXJhbSByZWNlaXZlciBUaGUgT2JqZWN0IHdoaWNoIHRoZSBwcm9wZXJ0eSBpcyBiZWluZyByZXRyaWV2ZWQgZnJvbQorICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkKKyAgICAgKiBAcGFyYW0gaXNDYWxsVG9TdXBlciBXaGV0aGVyIHRoZSBjYWxsIGlzIHRvIGEgc3VwZXIgY2xhc3MgcHJvcGVydHkKKyAgICAgKiBAcGFyYW0gZnJvbUluc2lkZUNsYXNzID8/CisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBwcm9wZXJ0aWVzIHZhbHVlCisgICAgICovCisgICAgIE9iamVjdCBnZXRQcm9wZXJ0eShDbGFzcyBzZW5kZXIsIE9iamVjdCByZWNlaXZlciwgU3RyaW5nIHByb3BlcnR5LCBib29sZWFuIGlzQ2FsbFRvU3VwZXIsIGJvb2xlYW4gZnJvbUluc2lkZUNsYXNzKTsKKworICAgIC8qKgorICAgICAqIDxwPlJldHJpZXZlcyBhIHByb3BlcnR5IG9uIHRoZSBnaXZlbiByZWNlaXZlciBmb3IgdGhlIHNwZWNpZmllZCBhcmd1bWVudHMuIFRoZSBzZW5kZXIgaXMgdGhlIGNsYXNzIHRoYXQgaXMgcmVxdWVzdGluZyB0aGUgcHJvcGVydHkgZnJvbSB0aGUgb2JqZWN0LgorICAgICAqIFRoZSBNZXRhQ2xhc3Mgd2lsbCBhdHRlbXB0IHRvIGVzdGFibGlzaCB0aGUgbWV0aG9kIHRvIGludm9rZSBiYXNlZCBvbiB0aGUgbmFtZSBhbmQgYXJndW1lbnRzIHByb3ZpZGVkLgorICAgICAqCisgICAgICogPHA+VGhlIGlzQ2FsbFRvU3VwZXIgYW5kIGZyb21JbnNpZGVDbGFzcyBoZWxwIHRoZSBHcm9vdnkgcnVudGltZSBwZXJmb3JtIG9wdGltaXNhdGlvbnMgb24gdGhlIGNhbGwgdG8gZ28gZGlyZWN0bHkKKyAgICAgKiB0byB0aGUgc3VwZXIgY2xhc3MgaWYgbmVjZXNzYXJ5CisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VuZGVyIFRoZSBqYXZhLmxhbmcuQ2xhc3MgaW5zdGFuY2UgdGhhdCBpcyBtdXRhdGluZyB0aGUgcHJvcGVydHkKKyAgICAgKiBAcGFyYW0gcmVjZWl2ZXIgVGhlIE9iamVjdCB3aGljaCB0aGUgcHJvcGVydHkgaXMgYmVpbmcgc2V0IG9uCisgICAgICogQHBhcmFtIHByb3BlcnR5IFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQorICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQKKyAgICAgKiBAcGFyYW0gaXNDYWxsVG9TdXBlciBXaGV0aGVyIHRoZSBjYWxsIGlzIHRvIGEgc3VwZXIgY2xhc3MgcHJvcGVydHkKKyAgICAgKiBAcGFyYW0gZnJvbUluc2lkZUNsYXNzID8/CisgICAgICoKKyAgICAgKi8KKyAgICAgdm9pZCBzZXRQcm9wZXJ0eShDbGFzcyBzZW5kZXIsIE9iamVjdCByZWNlaXZlciwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgdmFsdWUsIGJvb2xlYW4gaXNDYWxsVG9TdXBlciwgYm9vbGVhbiBmcm9tSW5zaWRlQ2xhc3MpOworCisgICAgLyoqCisgICAgICoKKyAgICAgKiA8cD5BdHRlbXB0cyB0byBpbnZva2UgdGhlIG1ldGhvZE1pc3NpbmcgbWV0aG9kIG90aGVyd2lzZSB0aHJvd3MgYSBNaXNzaW5nTWV0aG9kRXhjZXB0aW9uCisgICAgICoKKyAgICAgKiBAc2VlIGdyb292eS5sYW5nLk1pc3NpbmdNZXRob2RFeGNlcHRpb24KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnN0YW5jZSBUaGUgaW5zdGFuY2UgdG8gaW52b2tlIG1ldGhvZE1pc3Npbmcgb24KKyAgICAgKiBAcGFyYW0gbWV0aG9kTmFtZSBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kCisgICAgICogQHBhcmFtIGFyZ3VtZW50cyBUaGUgYXJndW1lbnRzIHRvIHRoZSBtZXRob2QKKyAgICAgKiBAcmV0dXJuIFRoZSByZXN1bHRzIG9mIG1ldGhvZE1pc3Npbmcgb3IgdGhyb3dzIE1pc3NpbmdNZXRob2RFeGNlcHRpb24KKyAgICAgKi8KKyAgICAgT2JqZWN0IGludm9rZU1pc3NpbmdNZXRob2QoT2JqZWN0IGluc3RhbmNlLCBTdHJpbmcgbWV0aG9kTmFtZSwgT2JqZWN0W10gYXJndW1lbnRzKTsKKworICAgIC8qKgorICAgICAqIEludm9rZXMgdGhlIHByb3BlcnR5TWlzc2luZyBtZXRob2Qgb3RoZXJ3aXNlIHRocm93cyBhIE1pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbgorICAgICAqCisgICAgICogQHBhcmFtIGluc3RhbmNlIFRoZSBpbnN0YW5jZSBvZiB0aGUgY2xhc3MKKyAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQorICAgICAqIEBwYXJhbSBvcHRpb25hbFZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgd2hpY2ggY291bGQgYmUgbnVsbCBpbiB0aGUgY2FzZSBvZiBhIGdldHRlcgorICAgICAqIEBwYXJhbSBpc0dldHRlciBXaGV0aGVyIHRoZSBtaXNzaW5nIHByb3BlcnR5IGV2ZW50IHdhcyB0aGUgcmVzdWx0IG9mIGEgZ2V0dGVyIG9yIGEgc2V0dGVyCisgICAgICogCisgICAgICogQHJldHVybiBUaGUgcmVzdWx0IG9mIHRoZSBwcm9wZXJ0eU1pc3NpbmcgbWV0aG9kIG9yIHRocm93cyBNaXNzaW5nUHJvcGVydHlFeGNlcHRpb24KKyAgICAgKi8KKyAgICAgT2JqZWN0IGludm9rZU1pc3NpbmdQcm9wZXJ0eShPYmplY3QgaW5zdGFuY2UsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBvcHRpb25hbFZhbHVlLCBib29sZWFuIGlzR2V0dGVyKTsKKworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSB2YWx1ZSBvZiBhbiBhdHRyaWJ1dGUgKGZpZWxkKS4gVGhpcyBtZXRob2QgaXMgdG8gc3VwcG9ydCB0aGUgR3Jvb3Z5IHJ1bnRpbWUgYW5kIG5vdCBmb3IgZ2VuZXJhbCBjbGllbnQgQVBJIHVzYWdlLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbmRlciBUaGUgY2xhc3Mgb2YgdGhlIG9iamVjdCB0aGF0IHJlcXVlc3RlZCB0aGUgYXR0cmlidXRlCisgICAgICogQHBhcmFtIHJlY2VpdmVyIFRoZSBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBtZXNzYWdlTmFtZSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlCisgICAgICogQHBhcmFtIHVzZVN1cGVyIFdoZXRoZXIgdG8gbG9vay11cCBvbiB0aGUgc3VwZXIgY2xhc3Mgb3Igbm90CisgICAgICogQHJldHVybiBUaGUgYXR0cmlidXRlIHZhbHVlCisgICAgICovCisgICAgIE9iamVjdCBnZXRBdHRyaWJ1dGUoQ2xhc3Mgc2VuZGVyLCBPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXNzYWdlTmFtZSwgYm9vbGVhbiB1c2VTdXBlcik7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhbiBhdHRyaWJ1dGUgKGZpZWxkKS4gVGhpcyBtZXRob2QgaXMgdG8gc3VwcG9ydCB0aGUgR3Jvb3Z5IHJ1bnRpbWUgYW5kIG5vdCBmb3IgZ2VuZXJhbCBjbGllbnQgQVBJIHVzYWdlLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbmRlciBUaGUgY2xhc3Mgb2YgdGhlIG9iamVjdCB0aGF0IHJlcXVlc3RlZCB0aGUgYXR0cmlidXRlCisgICAgICogQHBhcmFtIHJlY2VpdmVyIFRoZSBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBtZXNzYWdlTmFtZSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlCisgICAgICogQHBhcmFtIG1lc3NhZ2VWYWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZQorICAgICAqIEBwYXJhbSB1c2VTdXBlciBXaGV0aGVyIHRvIGxvb2stdXAgb24gdGhlIHN1cGVyIGNsYXNzIG9yIG5vdAorICAgICAqIEBwYXJhbSBmcm9tSW5zaWRlQ2xhc3MgV2hldGhlciB0aGUgY2FsbCBoYXBwZW5lZCBmcm9tIHRoZSBpbnNpZGUgb3IgdGhlIG91dHNpZGUgb2YgYSBjbGFzcworICAgICAqLworICAgICB2b2lkIHNldEF0dHJpYnV0ZShDbGFzcyBzZW5kZXIsIE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1lc3NhZ2VOYW1lLCBPYmplY3QgbWVzc2FnZVZhbHVlLCBib29sZWFuIHVzZVN1cGVyLCBib29sZWFuIGZyb21JbnNpZGVDbGFzcyk7CisgICAgCisKKyAgICAvKioKKyAgICAgKiBjb21wbGV0ZSB0aGUgaW5pdGxpYWxpc2F0aW9uIHByb2Nlc3MuIEFmdGVyIHRoaXMgbWV0aG9kCisgICAgICogaXMgY2FsbGVkIG5vIG1ldGhvZHMgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBtZXRhIGNsYXNzLgorICAgICAqIEludm9jYXRpb24gb2YgbWV0aG9kcyBvciBhY2Nlc3MgdG8gZmllbGRzL3Byb2VwcnRpZXMgaXMKKyAgICAgKiBmb3JiaWRkZW4gdW5sZXNzIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4gVGhpcyBtZXRob2QgCisgICAgICogc2hvdWxkIGNvbnRhaW4gYW55IGluaXRpYWxpc2F0aW9uIGNvZGUsIHRha2luZyBhIGxvbmdlcgorICAgICAqIHRpbWUgdG8gY29tcGxldGUuIEFuIGV4YW1wbGUgaXMgdGhlIGNyZWF0aW9uIG9mIHRoZSAKKyAgICAgKiBSZWZsZWN0b3IuIEl0IGlzIHN1Z2dlc3RlZCB0byBzeW5jaHJvbml6ZSB0aGlzIAorICAgICAqIG1ldGhvZC4KKyAgICAgKi8KKyAgICAgdm9pZCBpbml0aWFsaXplKCk7CisKKworICAgIC8qKgorICAgICAqIFJldHJpdmVzIGEgbGlzdCBvZiBNZXRhUHJvcGVydHkgaW5zdGFuY2VzIHRoYXQgdGhlIE1ldGFDbGFzcyBoYXMKKyAgICAgKgorICAgICAqIEBzZWUgTWV0YVByb3BlcnR5CisgICAgICoKKyAgICAgKiBAcmV0dXJuIEEgbGlzdCBvZiBNZXRhUHJvcGVydHkgaW5zdGFuY2VzCisgICAgICovCisgICAgIExpc3QgZ2V0UHJvcGVydGllcygpOworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIGEgbGlzdCBvZiBNZXRhTWV0aG9kcyBoZWxkIGJ5IHRoZSBjbGFzcworICAgICAqCisgICAgICogQHJldHVybiBBIGxpc3Qgb2YgTWV0YU1ldGhvZHMKKyAgICAgKgorICAgICAqLworICAgICBMaXN0IGdldE1ldGhvZHMoKTsKKyAgICAgCisgICAgIC8qKgorICAgICAgKiBPYnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSBvcmlnaW5hbCBBU1QgZm9yIHRoZSBNZXRhQ2xhc3MgaWYgaXQgaXMgYXZhaWxhYmxlIGF0IHJ1bnRpbWUKKyAgICAgICoKKyAgICAgICogQHJldHVybiBUaGUgb3JpZ2luYWwgQVNUIG9yIG51bGwgaWYgaXQgY2Fubm90IGJlIHJldHVybmVkCisgICAgICAqLworICAgICBDbGFzc05vZGUgZ2V0Q2xhc3NOb2RlKCk7CisgICAgIAorICAgICAKKyAgICAgLyoqCisgICAgICAqIFJldHJpZXZlcyBhIGxpc3Qgb2YgTWV0YU1ldGhvZCBpbnN0YW5jZXMgaGVsZCBieSB0aGlzIGNsYXNzCisgICAgICAqIEByZXR1cm4gQSBsaXN0IG9mIE1ldGFNZXRob2QgaW5zdGFuY2VzCisgICAgICAqLworICAgICBMaXN0IGdldE1ldGFNZXRob2RzKCk7CisgICAgCisKKyAgICAgLyoqCisgICAgICAqCisgICAgICAqIEludGVybmFsIG1ldGhvZCB0byBzdXBwb3J0IEdyb292eSBydW50aW1lLiBOb3QgZm9yIGNsaWVudCB1c2FnZS4KKyAgICAgICoKKyAgICAgICogQHBhcmFtIG51bWJlck9mQ29uc3RydWN0b3JzIFRoZSBudW1iZXIgb2YgY29uc3RydWN0b3JzCisgICAgICAqIEBwYXJhbSBhcmd1bWVudHMgVGhlIGFyZ3VtZW50cworICAgICAgKgorICAgICAgKiBAcmV0dXJuIHNlbGVjdGVkIGluZGV4CisgICAgICAqLworICAgICBpbnQgc2VsZWN0Q29uc3RydWN0b3JBbmRUcmFuc2Zvcm1Bcmd1bWVudHMoaW50IG51bWJlck9mQ29uc3RydWN0b3JzLCBPYmplY3RbXSBhcmd1bWVudHMpOworCisgICAgLyoqCisgICAgICogU2VsZWN0cyBhIG1ldGhvZCBieSBuYW1lIGFuZCBhcmd1bWVudCBjbGFzc2VzLiBUaGlzIG1ldGhvZAorICAgICAqIGRvZXMgbm90IHNlYXJjaCBmb3IgYW4gZXhhY3QgbWF0Y2gsIGl0IHNlYXJjaGVzIGZvciBhIGNvbXBhdGlibGUKKyAgICAgKiBtZXRob2QuIEZvciB0aGlzIHRoZSBtZXRob2Qgc2VsZWN0aW9uIG1lY2hhbmlzbSBpcyB1c2VkIGFzIHByb3ZpZGVkCisgICAgICogYnllIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIE1ldGFDbGFzcy4gcGlja01ldGhvZCBtYXkgb3IgbWF5CisgICAgICogbm90IHVzZWQgZHVyaW5nIHRoZSBtZXRob2Qgc2VsZWN0aW9uIHByb2Nlc3Mgd2hlbiBpbnZva2luZyBhIG1ldGhvZAorICAgICAqIHRoZXJlaXMgbm8gd2FycmFudHkgZm9yIHRoYXQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgbWF0Y2hpbmcgTWV0YU1ldGhvZCBvciBudWxsCisgICAgICogQHRocm93cyBHcm9vdnlSdW50aW1lRXhjZXB0aW9uIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgbWF0Y2hpbmcgbWV0aG9kCisgICAgICogQHBhcmFtIG1ldGhvZE5hbWUgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0byBwaWNrCisgICAgICogQHBhcmFtIGFyZ3VtZW50cyB0aGUgbWV0aG9kIGFyZ3VtZW50cworICAgICAqLworICAgICBNZXRhTWV0aG9kIHBpY2tNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzW10gYXJndW1lbnRzKTsKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbGFuZy9NZXRhQ2xhc3NJbXBsLmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvTWV0YUNsYXNzSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZGNjZmUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvTWV0YUNsYXNzSW1wbC5qYXZhCkBAIC0wLDAgKzEsMjYyOCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGdyb292eS5sYW5nOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5Hcm9vdnlCdWdFcnJvcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5DbGFzc05vZGU7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbi5CeXRlY29kZUhlbHBlcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5QaGFzZXM7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5yZWZsZWN0aW9uLio7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLio7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLm1ldGFjbGFzcy4qOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS50eXBlaGFuZGxpbmcuRGVmYXVsdFR5cGVUcmFuc2Zvcm1hdGlvbjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUud3JhcHBlcnMuV3JhcHBlcjsKK2ltcG9ydCBvcmcub2JqZWN0d2ViLmFzbS5DbGFzc1Zpc2l0b3I7CisKK2ltcG9ydCBqYXZhLmJlYW5zLio7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlByb3h5OworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb247CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvKioKKyAqIEFsbG93cyBtZXRob2RzIHRvIGJlIGR5bmFtaWNhbGx5IGFkZGVkIHRvIGV4aXN0aW5nIGNsYXNzZXMgYXQgcnVudGltZQorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAYXV0aG9yIEd1aWxsYXVtZSBMYWZvcmdlCisgKiBAYXV0aG9yIEpvY2hlbiBUaGVvZG9yb3UKKyAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgorICogQGF1dGhvciBBbGV4IFRrYWNobWFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKiBAc2VlIGdyb292eS5sYW5nLk1ldGFDbGFzcworICovCitwdWJsaWMgY2xhc3MgTWV0YUNsYXNzSW1wbCBpbXBsZW1lbnRzIE1ldGFDbGFzcywgTXV0YWJsZU1ldGFDbGFzcyB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xPU1VSRV9DQUxMX01FVEhPRCA9ICJjYWxsIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xPU1VSRV9ET19DQUxMX01FVEhPRCA9ICJkb0NhbGwiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTE9TVVJFX0NVUlJZX01FVEhPRCA9ICJjdXJyeSI7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVElDX01FVEhPRF9NSVNTSU5HID0gIiRzdGF0aWNfbWV0aG9kTWlzc2luZyI7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVElDX1BST1BFUlRZX01JU1NJTkcgPSAiJHN0YXRpY19wcm9wZXJ0eU1pc3NpbmciOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9NSVNTSU5HID0gIm1ldGhvZE1pc3NpbmciOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX01JU1NJTkcgPSAicHJvcGVydHlNaXNzaW5nIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzW10gTUVUSE9EX01JU1NJTkdfQVJHUyA9IG5ldyBDbGFzc1tde1N0cmluZy5jbGFzcywgT2JqZWN0LmNsYXNzfTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1tdIEdFVFRFUl9NSVNTSU5HX0FSR1MgPSBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzW10gU0VUVEVSX01JU1NJTkdfQVJHUyA9IE1FVEhPRF9NSVNTSU5HX0FSR1M7CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKE1ldGFDbGFzcy5jbGFzcy5nZXROYW1lKCkpOworICAgIHByb3RlY3RlZCBmaW5hbCBDbGFzcyB0aGVDbGFzczsKKyAgICBwcm90ZWN0ZWQgZmluYWwgQ2FjaGVkQ2xhc3MgdGhlQ2FjaGVkQ2xhc3M7CisKKyAgICBwcm90ZWN0ZWQgTWV0YUNsYXNzUmVnaXN0cnkgcmVnaXN0cnk7CisgICAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaXNHcm9vdnlPYmplY3Q7CisgICAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaXNNYXA7CisgICAgcHJpdmF0ZSBDbGFzc05vZGUgY2xhc3NOb2RlOworCisgICAgcHJpdmF0ZSBmaW5hbCBJbmRleCBjbGFzc1Byb3BlcnR5SW5kZXggPSBuZXcgTWV0aG9kSW5kZXgoKTsKKyAgICBwcml2YXRlIEluZGV4IGNsYXNzUHJvcGVydHlJbmRleEZvclN1cGVyID0gbmV3IE1ldGhvZEluZGV4KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBTaW5nbGVLZXlIYXNoTWFwIHN0YXRpY1Byb3BlcnR5SW5kZXggPSBuZXcgU2luZ2xlS2V5SGFzaE1hcCgpOworCisgICAgcHJpdmF0ZSBmaW5hbCBNYXAgbGlzdGVuZXJzID0gbmV3IEhhc2hNYXAoKTsKKyAgICBwcml2YXRlIGZpbmFsIE1hcCBtZXRob2RDYWNoZSA9IG5ldyBDb25jdXJyZW50UmVhZGVySGFzaE1hcCgpOworICAgIHByaXZhdGUgZmluYWwgTWFwIHN0YXRpY01ldGhvZENhY2hlID0gbmV3IENvbmN1cnJlbnRSZWFkZXJIYXNoTWFwKCk7CisgICAgcHJpdmF0ZSBGYXN0QXJyYXkgY29uc3RydWN0b3JzOworICAgIHByaXZhdGUgZmluYWwgTGlzdCBhbGxNZXRob2RzID0gbmV3IEFycmF5TGlzdCgpOworICAgIHByaXZhdGUgTGlzdCBpbnRlcmZhY2VNZXRob2RzOworICAgIHByaXZhdGUgYm9vbGVhbiBpbml0aWFsaXplZDsKKyAgICAvLyB3ZSBvbmx5IG5lZWQgb25lIG9mIHRoZXNlIHRoYXQgY2FuIGJlIHJldXNlZCBvdmVyIGFuZCBvdmVyLgorICAgIHByaXZhdGUgZmluYWwgTWV0YVByb3BlcnR5IGFycmF5TGVuZ3RoUHJvcGVydHkgPSBuZXcgTWV0YUFycmF5TGVuZ3RoUHJvcGVydHkoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZXRhTWV0aG9kIEFNQklHT1VTX0xJU1RFTkVSX01FVEhPRCA9IG5ldyBEdW1teU1ldGFNZXRob2QoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9BUkdVTUVOVFMgPSB7fTsKKyAgICBwcml2YXRlIGZpbmFsIFNldCBuZXdHcm9vdnlNZXRob2RzU2V0ID0gbmV3IEhhc2hTZXQoKTsKKworICAgIHByaXZhdGUgTWV0YU1ldGhvZCBnZW5lcmljR2V0TWV0aG9kOworICAgIHByaXZhdGUgTWV0YU1ldGhvZCBnZW5lcmljU2V0TWV0aG9kOworICAgIHByaXZhdGUgTWV0YU1ldGhvZCBwcm9wZXJ0eU1pc3NpbmdHZXQ7CisgICAgcHJpdmF0ZSBNZXRhTWV0aG9kIHByb3BlcnR5TWlzc2luZ1NldDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZXRhTWV0aG9kIE5VTExfTUVUSE9EID0gbmV3IER1bW15TWV0YU1ldGhvZCgpOworICAgIHByaXZhdGUgTWV0YU1ldGhvZCBtZXRob2RNaXNzaW5nOworICAgIHByaXZhdGUgTWV0YU1ldGhvZEluZGV4LkhlYWRlciBtYWluQ2xhc3NNZXRob2RIZWFkZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBNZXRhTWV0aG9kSW5kZXggbWV0YU1ldGhvZEluZGV4OworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3NbXSBFTVBUWV9DTEFTU19BUlJBWSA9IG5ldyBDbGFzc1swXTsKKworCisgICAgcHVibGljIE1ldGFDbGFzc0ltcGwoZmluYWwgQ2xhc3MgdGhlQ2xhc3MpIHsKKyAgICAgICAgdGhpcy50aGVDbGFzcyA9IHRoZUNsYXNzOworICAgICAgICB0aGVDYWNoZWRDbGFzcyA9IFJlZmxlY3Rpb25DYWNoZS5nZXRDYWNoZWRDbGFzcyh0aGVDbGFzcyk7CisgICAgICAgIHRoaXMuaXNHcm9vdnlPYmplY3QgPSBHcm9vdnlPYmplY3QuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0aGVDbGFzcyk7CisgICAgICAgIHRoaXMuaXNNYXAgPSBNYXAuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0aGVDbGFzcyk7CisgICAgICAgIHRoaXMucmVnaXN0cnkgPSBHcm9vdnlTeXN0ZW0uZ2V0TWV0YUNsYXNzUmVnaXN0cnkoKTsKKyAgICAgICAgbWV0YU1ldGhvZEluZGV4ID0gbmV3IE1ldGFNZXRob2RJbmRleCh0aGVDYWNoZWRDbGFzcyk7CisgICAgfQorCisgICAgcHVibGljIE1ldGFDbGFzc0ltcGwoTWV0YUNsYXNzUmVnaXN0cnkgcmVnaXN0cnksIGZpbmFsIENsYXNzIHRoZUNsYXNzKSB7CisgICAgICAgIHRoaXModGhlQ2xhc3MpOworICAgICAgICB0aGlzLnJlZ2lzdHJ5ID0gcmVnaXN0cnk7CisgICAgICAgIHRoaXMuY29uc3RydWN0b3JzID0gbmV3IEZhc3RBcnJheSh0aGVDYWNoZWRDbGFzcy5nZXRDb25zdHJ1Y3RvcnMoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBNZXRhT2JqZWN0UHJvdG9jb2wjcmVzcG9uZHNUbyhPYmplY3QsU3RyaW5nLCBPYmplY3RbXSkKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdCByZXNwb25kc1RvKE9iamVjdCBvYmosIFN0cmluZyBuYW1lLCBPYmplY3RbXSBhcmdUeXBlcykgeworICAgICAgICBDbGFzc1tdIGNsYXNzZXMgPSBjYXN0QXJndW1lbnRzVG9DbGFzc0FycmF5KGFyZ1R5cGVzKTsKKyAgICAgICAgTWV0YU1ldGhvZCBtID0gZ2V0TWV0YU1ldGhvZChuYW1lLCBjbGFzc2VzKTsKKyAgICAgICAgTGlzdCBtZXRob2RzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBpZiAobSAhPSBudWxsKSB7CisgICAgICAgICAgICBtZXRob2RzLmFkZChtKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbWV0aG9kczsKKyAgICB9CisKKyAgICBwcml2YXRlIENsYXNzW10gY2FzdEFyZ3VtZW50c1RvQ2xhc3NBcnJheShPYmplY3RbXSBhcmdUeXBlcykgeworICAgICAgICBpZiAoYXJnVHlwZXMgPT0gbnVsbCkgcmV0dXJuIEVNUFRZX0NMQVNTX0FSUkFZOworICAgICAgICBDbGFzc1tdIGNsYXNzZXMgPSBuZXcgQ2xhc3NbYXJnVHlwZXMubGVuZ3RoXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdUeXBlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgT2JqZWN0IGFyZ1R5cGUgPSBhcmdUeXBlc1tpXTsKKyAgICAgICAgICAgIGlmIChhcmdUeXBlIGluc3RhbmNlb2YgQ2xhc3MpIHsKKyAgICAgICAgICAgICAgICBjbGFzc2VzW2ldID0gKENsYXNzKSBhcmdUeXBlOworICAgICAgICAgICAgfSBlbHNlIGlmIChhcmdUeXBlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjbGFzc2VzW2ldID0gbnVsbDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisvLyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBcmd1bWVudHMgdG8gbWV0aG9kIFtyZXNwb25kc1RvXSBtdXN0IGJlIG9mIHR5cGUgamF2YS5sYW5nLkNsYXNzISIpOworICAgICAgICAgICAgICAgIGNsYXNzZXNbaV0gPSBhcmdUeXBlLmdldENsYXNzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNsYXNzZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBNZXRhT2JqZWN0UHJvdG9jb2wjcmVzcG9uZHNUbyhPYmplY3QsU3RyaW5nLCBPYmplY3RbXSkKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdCByZXNwb25kc1RvKGZpbmFsIE9iamVjdCBvYmosIGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIGZpbmFsIE9iamVjdCBvID0gZ2V0TWV0aG9kcyhnZXRUaGVDbGFzcygpLCBuYW1lLCBmYWxzZSk7CisgICAgICAgIGlmIChvIGluc3RhbmNlb2YgRmFzdEFycmF5KQorICAgICAgICAgIHJldHVybiAoKEZhc3RBcnJheSlvKS50b0xpc3QoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG8pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgTWV0YU9iamVjdFByb3RvY29sI2hhc1Byb3BlcnR5KE9iamVjdCxTdHJpbmcpCisgICAgICovCisgICAgcHVibGljIE1ldGFQcm9wZXJ0eSBoYXNQcm9wZXJ0eShPYmplY3Qgb2JqLCBTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gZ2V0TWV0YVByb3BlcnR5KG5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgTWV0YU9iamVjdFByb3RvY29sI2dldE1ldGFQcm9wZXJ0eShTdHJpbmcpCisgICAgICovCisgICAgcHVibGljIE1ldGFQcm9wZXJ0eSBnZXRNZXRhUHJvcGVydHkoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgU2luZ2xlS2V5SGFzaE1hcCBwcm9wZXJ0eU1hcCA9IGNsYXNzUHJvcGVydHlJbmRleC5nZXROb3ROdWxsKHRoZUNhY2hlZENsYXNzKTsKKyAgICAgICAgaWYgKHByb3BlcnR5TWFwLmNvbnRhaW5zS2V5KG5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gKE1ldGFQcm9wZXJ0eSkgcHJvcGVydHlNYXAuZ2V0KG5hbWUpOworICAgICAgICB9IGVsc2UgaWYgKHN0YXRpY1Byb3BlcnR5SW5kZXguY29udGFpbnNLZXkobmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAoTWV0YVByb3BlcnR5KSBzdGF0aWNQcm9wZXJ0eUluZGV4LmdldChuYW1lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByb3BlcnR5TWFwID0gY2xhc3NQcm9wZXJ0eUluZGV4Rm9yU3VwZXIuZ2V0Tm90TnVsbCh0aGVDYWNoZWRDbGFzcyk7CisgICAgICAgICAgICByZXR1cm4gKE1ldGFQcm9wZXJ0eSkgcHJvcGVydHlNYXAuZ2V0KG5hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBNZXRhT2JqZWN0UHJvdG9jb2wjZ2V0U3RhdGljTWV0YU1ldGhvZChTdHJpbmcsIE9iamVjdFtdKQorICAgICAqLworICAgIHB1YmxpYyBNZXRhTWV0aG9kIGdldFN0YXRpY01ldGFNZXRob2QoU3RyaW5nIG5hbWUsIE9iamVjdFtdIGFyZ1R5cGVzKSB7CisgICAgICAgIENsYXNzW10gY2xhc3NlcyA9IGNhc3RBcmd1bWVudHNUb0NsYXNzQXJyYXkoYXJnVHlwZXMpOworICAgICAgICByZXR1cm4gcmV0cmlldmVTdGF0aWNNZXRob2QobmFtZSwgY2xhc3Nlcyk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBAc2VlIE1ldGFPYmplY3RQcm90b2NvbCNnZXRNZXRhTWV0aG9kKFN0cmluZywgT2JqZWN0W10pCisgICAgICovCisgICAgcHVibGljIE1ldGFNZXRob2QgZ2V0TWV0YU1ldGhvZChTdHJpbmcgbmFtZSwgT2JqZWN0W10gYXJnVHlwZXMpIHsKKyAgICAgICAgQ2xhc3NbXSBjbGFzc2VzID0gY2FzdEFyZ3VtZW50c1RvQ2xhc3NBcnJheShhcmdUeXBlcyk7CisgICAgICAgIHJldHVybiBwaWNrTWV0aG9kKG5hbWUsIGNsYXNzZXMpOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzcyBnZXRUaGVDbGFzcygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudGhlQ2xhc3M7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNHcm9vdnlPYmplY3QoKSB7CisgICAgICAgIHJldHVybiBpc0dyb292eU9iamVjdDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZmlsbE1ldGhvZEluZGV4KCkgeworICAgICAgICBtYWluQ2xhc3NNZXRob2RIZWFkZXIgPSBtZXRhTWV0aG9kSW5kZXguZ2V0SGVhZGVyKHRoZUNsYXNzKTsKKyAgICAgICAgTGlua2VkTGlzdCBzdXBlckNsYXNzZXMgPSBnZXRTdXBlckNsYXNzZXMoKTsKKyAgICAgICAgQ2FjaGVkQ2xhc3MgZmlyc3RHcm9vdnlTdXBlciA9IGNhbGNGaXJzdEdyb292eVN1cGVyQ2xhc3Moc3VwZXJDbGFzc2VzKTsKKworICAgICAgICBTZXQgaW50ZXJmYWNlcyA9IHRoZUNhY2hlZENsYXNzLmdldEludGVyZmFjZXMoKTsKKyAgICAgICAgYWRkSW50ZXJmYWNlTWV0aG9kcyhpbnRlcmZhY2VzKTsKKworICAgICAgICBwb3B1bGF0ZU1ldGhvZHMoc3VwZXJDbGFzc2VzLCBmaXJzdEdyb292eVN1cGVyKTsKKworICAgICAgICBpbmhlcml0SW50ZXJmYWNlTmV3TWV0YU1ldGhvZHMoaW50ZXJmYWNlcyk7CisgICAgICAgIGlmIChpc0dyb292eU9iamVjdCkgeworICAgICAgICAgIG1ldGFNZXRob2RJbmRleC5jb3B5TWV0aG9kc1RvU3VwZXIoKTsKKworICAgICAgICAgIGNvbm5lY3RNdWx0aW1ldGhvZHMoc3VwZXJDbGFzc2VzLCBmaXJzdEdyb292eVN1cGVyKTsKKyAgICAgICAgICByZW1vdmVNdWx0aW1ldGhvZHNPdmVybG9hZGVkV2l0aFByaXZhdGVNZXRob2RzKCk7CisKKyAgICAgICAgICByZXBsYWNlV2l0aE1PUENhbGxzKHRoZUNhY2hlZENsYXNzLm1vcE1ldGhvZHMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlTWV0aG9kcyhMaW5rZWRMaXN0IHN1cGVyQ2xhc3NlcywgQ2FjaGVkQ2xhc3MgZmlyc3RHcm9vdnlTdXBlcikgeworICAgICAgICBJdGVyYXRvciBpdGVyID0gc3VwZXJDbGFzc2VzLml0ZXJhdG9yKCk7CisKKyAgICAgICAgTWV0YU1ldGhvZEluZGV4LkhlYWRlciBoZWFkZXIgPSBtZXRhTWV0aG9kSW5kZXguZ2V0SGVhZGVyKGZpcnN0R3Jvb3Z5U3VwZXIuZ2V0Q2FjaGVkQ2xhc3MoKSk7CisgICAgICAgIENhY2hlZENsYXNzIGM7CisgICAgICAgIGZvciAoOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIGMgPSAoQ2FjaGVkQ2xhc3MpIGl0ZXIubmV4dCgpOworCisgICAgICAgICAgICBDYWNoZWRNZXRob2RbXSBjYWNoZWRNZXRob2RzID0gYy5nZXRNZXRob2RzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhY2hlZE1ldGhvZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBNZXRhTWV0aG9kIG1ldGFNZXRob2QgPSBjYWNoZWRNZXRob2RzW2ldLmdldFJlZmxlY3Rpb25NZXRhTWV0aG9kKCk7CisgICAgICAgICAgICAgICAgYWRkVG9BbGxNZXRob2RzSWZQdWJsaWMobWV0YU1ldGhvZCk7CisgICAgICAgICAgICAgICAgaWYgKCFtZXRhTWV0aG9kLmlzUHJpdmF0ZSgpIHx8IGMgPT0gZmlyc3RHcm9vdnlTdXBlcikKKyAgICAgICAgICAgICAgICAgIGFkZE1ldGFNZXRob2RUb0luZGV4KG1ldGFNZXRob2QsIGhlYWRlcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE1ldGFNZXRob2RbXSBjYWNoZWRNZXRob2RzMSA9IGMuZ2V0TmV3TWV0YU1ldGhvZHMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FjaGVkTWV0aG9kczEubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBNZXRhTWV0aG9kIG1ldGhvZCA9IGNhY2hlZE1ldGhvZHMxW2ldOworCisgICAgICAgICAgICAgICAgaWYgKCFuZXdHcm9vdnlNZXRob2RzU2V0LmNvbnRhaW5zKG1ldGhvZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbmV3R3Jvb3Z5TWV0aG9kc1NldC5hZGQobWV0aG9kKTsKKyAgICAgICAgICAgICAgICAgICAgYWRkTWV0YU1ldGhvZFRvSW5kZXgobWV0aG9kLCBoZWFkZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGMgPT0gZmlyc3RHcm9vdnlTdXBlcikKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBNZXRhTWV0aG9kSW5kZXguSGVhZGVyIGxhc3QgPSBoZWFkZXI7CisgICAgICAgIGZvciAoO2l0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgYyA9IChDYWNoZWRDbGFzcykgaXRlci5uZXh0KCk7CisgICAgICAgICAgICBoZWFkZXIgPSBtZXRhTWV0aG9kSW5kZXguZ2V0SGVhZGVyKGMuZ2V0Q2FjaGVkQ2xhc3MoKSk7CisKKyAgICAgICAgICAgIGlmIChsYXN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtZXRhTWV0aG9kSW5kZXguY29weU5vblByaXZhdGVNZXRob2RzKGxhc3QsIGhlYWRlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsYXN0ID0gaGVhZGVyOworCisgICAgICAgICAgICBDYWNoZWRNZXRob2RbXSBjYWNoZWRNZXRob2RzID0gYy5nZXRNZXRob2RzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhY2hlZE1ldGhvZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBNZXRhTWV0aG9kIG1ldGFNZXRob2QgPSBjYWNoZWRNZXRob2RzW2ldLmdldFJlZmxlY3Rpb25NZXRhTWV0aG9kKCk7CisgICAgICAgICAgICAgICAgYWRkVG9BbGxNZXRob2RzSWZQdWJsaWMobWV0YU1ldGhvZCk7CisgICAgICAgICAgICAgICAgYWRkTWV0YU1ldGhvZFRvSW5kZXgobWV0YU1ldGhvZCwgaGVhZGVyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTWV0YU1ldGhvZFtdIGNhY2hlZE1ldGhvZHMxID0gYy5nZXROZXdNZXRhTWV0aG9kcygpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjYWNoZWRNZXRob2RzMS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGZpbmFsIE1ldGFNZXRob2QgbWV0aG9kID0gY2FjaGVkTWV0aG9kczFbaV07CisKKyAgICAgICAgICAgICAgICBpZiAoIW5ld0dyb292eU1ldGhvZHNTZXQuY29udGFpbnMobWV0aG9kKSkgeworICAgICAgICAgICAgICAgICAgICBuZXdHcm9vdnlNZXRob2RzU2V0LmFkZChtZXRob2QpOworICAgICAgICAgICAgICAgICAgICBhZGRNZXRhTWV0aG9kVG9JbmRleChtZXRob2QsIGhlYWRlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFkZEludGVyZmFjZU1ldGhvZHMoU2V0IGludGVyZmFjZXMpIHsKKyAgICAgICAgTWV0YU1ldGhvZEluZGV4LkhlYWRlciBoZWFkZXIgPSBtZXRhTWV0aG9kSW5kZXguZ2V0SGVhZGVyKHRoZUNsYXNzKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gaW50ZXJmYWNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIENhY2hlZENsYXNzIGMgPSAoQ2FjaGVkQ2xhc3MpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgZmluYWwgQ2FjaGVkTWV0aG9kW10gbSA9IGMuZ2V0TWV0aG9kcygpOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpICE9IG0ubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgICBNZXRhTWV0aG9kIG1ldGhvZCA9IG0gW2ldLmdldFJlZmxlY3Rpb25NZXRhTWV0aG9kKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBtZXRob2QuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIE1ldGFNZXRob2RJbmRleC5FbnRyeSBlID0gbWV0YU1ldGhvZEluZGV4LmdldE9yUHV0TWV0aG9kcyhuYW1lLCBoZWFkZXIpOworICAgICAgICAgICAgICAgIGUubWV0aG9kcyA9IG1ldGFNZXRob2RJbmRleC5hZGRNZXRob2RUb0xpc3QoZS5tZXRob2RzLCBtZXRob2QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBMaW5rZWRMaXN0IGdldFN1cGVyQ2xhc3NlcygpIHsKKyAgICAgICAgTGlua2VkTGlzdCBzdXBlckNsYXNzZXMgPSBuZXcgTGlua2VkTGlzdCgpOworCisgICAgICAgIGlmICh0aGVDbGFzcy5pc0ludGVyZmFjZSgpKSB7CisgICAgICAgICAgICBzdXBlckNsYXNzZXMuYWRkRmlyc3QoUmVmbGVjdGlvbkNhY2hlLk9CSkVDVF9DTEFTUyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKENhY2hlZENsYXNzIGMgPSB0aGVDYWNoZWRDbGFzczsgYyAhPSBudWxsOyBjID0gYy5nZXRDYWNoZWRTdXBlckNsYXNzKCkpIHsKKyAgICAgICAgICAgICAgICBzdXBlckNsYXNzZXMuYWRkRmlyc3QoYyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodGhlQ2FjaGVkQ2xhc3MuaXNBcnJheSAmJiB0aGVDbGFzcyAhPSBPYmplY3RbXS5jbGFzcyAmJiAhdGhlQ2xhc3MuZ2V0Q29tcG9uZW50VHlwZSgpLmlzUHJpbWl0aXZlKCkpIHsKKyAgICAgICAgICAgICAgICBzdXBlckNsYXNzZXMuYWRkRmlyc3QoUmVmbGVjdGlvbkNhY2hlLk9CSkVDVF9BUlJBWV9DTEFTUyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyQ2xhc3NlczsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVtb3ZlTXVsdGltZXRob2RzT3ZlcmxvYWRlZFdpdGhQcml2YXRlTWV0aG9kcygpIHsKKyAgICAgICAgTWV0aG9kSW5kZXhBY3Rpb24gbWlhID0gbmV3IE1ldGhvZEluZGV4QWN0aW9uKCkgeworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gc2tpcENsYXNzKENsYXNzIGNsYXp6KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNsYXp6ID09IHRoZUNsYXNzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBtZXRob2ROYW1lQWN0aW9uKENsYXNzIGNsYXp6LCBNZXRhTWV0aG9kSW5kZXguRW50cnkgZSkgeworICAgICAgICAgICAgICAgIGlmIChlLm1ldGhvZHMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBib29sZWFuIGhhc1ByaXZhdGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpZiAoZS5tZXRob2RzIGluc3RhbmNlb2YgRmFzdEFycmF5KSB7CisgICAgICAgICAgICAgICAgICAgIEZhc3RBcnJheSBtZXRob2RzID0gKEZhc3RBcnJheSkgZS5tZXRob2RzOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbGVuID0gbWV0aG9kcy5zaXplKCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdFtdIGRhdGEgPSBtZXRob2RzLmdldEFycmF5KCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpICE9IGxlbjsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBNZXRhTWV0aG9kIG1ldGhvZCA9IChNZXRhTWV0aG9kKSBkYXRhW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZC5pc1ByaXZhdGUoKSAmJiBjbGF6eiA9PSBtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXRDYWNoZWRDbGFzcygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzUHJpdmF0ZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIE1ldGFNZXRob2QgbWV0aG9kID0gKE1ldGFNZXRob2QpIGUubWV0aG9kczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZC5pc1ByaXZhdGUoKSAmJiBjbGF6eiA9PSBtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXRDYWNoZWRDbGFzcygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGhhc1ByaXZhdGUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFoYXNQcml2YXRlKSByZXR1cm47CisKKyAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIHByaXZhdGUgbWV0aG9kcyBmb3IgdGhhdCBuYW1lLCBzbyByZW1vdmUgdGhlCisgICAgICAgICAgICAgICAgLy8gbXVsdGltZXRob2RzLiBUaGF0IGlzIHRoZSBzYW1lIGFzIGluIG91ciBpbmRleCBmb3IKKyAgICAgICAgICAgICAgICAvLyBzdXBlciwgc28ganVzdCBjb3B5IHRoZSBsaXN0IGZyb20gdGhlcmUuIEl0IGlzIG5vdAorICAgICAgICAgICAgICAgIC8vIHBvc3NpYmxlIHRvIHVzZSBhIHBvaW50ZXIgaGVyZSwgYmVjYXVzZSB0aGUgbWV0aG9kcworICAgICAgICAgICAgICAgIC8vIGluIHRoZSBpbmRleCBmb3Igc3VwZXIgYXJlIHJlcGxhY2VkIGxhdGVyIGJ5IE1PUAorICAgICAgICAgICAgICAgIC8vIG1ldGhvZHMgbGlrZSBzdXBlciQ1JGZvbworICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBvID0gZS5tZXRob2RzRm9yU3VwZXI7CisgICAgICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBGYXN0QXJyYXkpCisgICAgICAgICAgICAgICAgICBlLm1ldGhvZHMgPSAoKEZhc3RBcnJheSkgbykuY29weSgpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIGUubWV0aG9kcyA9IG87CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIG1pYS5pdGVyYXRlKCk7CisgICAgfQorCisKKyAgICBwcml2YXRlIHZvaWQgcmVwbGFjZVdpdGhNT1BDYWxscyhmaW5hbCBDYWNoZWRNZXRob2RbXSBtb3BNZXRob2RzKSB7CisgICAgICAgIC8vIG5vIE1PUCBtZXRob2RzIGlmIG5vdCBhIGNoaWxkIG9mIEdyb292eU9iamVjdAorICAgICAgICBpZiAoIWlzR3Jvb3Z5T2JqZWN0KSByZXR1cm47CisKKyAgICAgICAgY2xhc3MgTU9QSXRlciBleHRlbmRzIE1ldGhvZEluZGV4QWN0aW9uIHsKKyAgICAgICAgICAgIGJvb2xlYW4gdXNlVGhpczsKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHNraXBDbGFzcyhDYWNoZWRDbGFzcyBjbGF6eikgeworICAgICAgICAgICAgICAgIHJldHVybiAhdXNlVGhpcyAmJiBjbGF6eiA9PSB0aGVDYWNoZWRDbGFzczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgbWV0aG9kTmFtZUFjdGlvbihDbGFzcyBjbGF6eiwgTWV0YU1ldGhvZEluZGV4LkVudHJ5IGUpIHsKKyAgICAgICAgICAgICAgICBpZiAodXNlVGhpcykgeworICAgICAgICAgICAgICAgICAgICBpZiAoZS5tZXRob2RzID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICAgICAgICAgIGlmIChlLm1ldGhvZHMgaW5zdGFuY2VvZiBGYXN0QXJyYXkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZhc3RBcnJheSBtZXRob2RzID0gKEZhc3RBcnJheSkgZS5tZXRob2RzOworICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0Zhc3RBcnJheShtZXRob2RzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFNZXRob2QgbWV0aG9kID0gKE1ldGFNZXRob2QpIGUubWV0aG9kczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXRob2QgaW5zdGFuY2VvZiBOZXdNZXRhTWV0aG9kKQorICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlVGhpcyBeIChtZXRob2QuZ2V0TW9kaWZpZXJzKCkgJiAoTW9kaWZpZXIuUFVCTElDIHwgTW9kaWZpZXIuUFJPVEVDVEVEKSkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1vcE5hbWUgPSBtZXRob2QuZ2V0TW9wTmFtZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gQXJyYXlzLmJpbmFyeVNlYXJjaChtb3BNZXRob2RzLCBtb3BOYW1lLCBDYWNoZWRDbGFzcy5DYWNoZWRNZXRob2RDb21wYXJhdG9yV2l0aFN0cmluZy5JTlNUQU5DRSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcm9tID0gaW5kZXg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGZyb20gPiAwICYmIG1vcE1ldGhvZHNbZnJvbS0xXS5nZXROYW1lKCkuZXF1YWxzKG1vcE5hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbS0tOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0byA9IGluZGV4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0byA8IG1vcE1ldGhvZHMubGVuZ3RoLTEgJiYgbW9wTWV0aG9kc1t0bysxXS5nZXROYW1lKCkuZXF1YWxzKG1vcE5hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8rKzsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXRjaGluZ01ldGhvZCA9IGZpbmRNYXRjaGluZ01ldGhvZChtb3BNZXRob2RzLCBmcm9tLCB0bywgbWV0aG9kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hpbmdNZXRob2QgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5tZXRob2RzID0gbW9wTWV0aG9kc1ttYXRjaGluZ01ldGhvZF0uZ2V0UmVmbGVjdGlvbk1ldGFNZXRob2QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChlLm1ldGhvZHNGb3JTdXBlciA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgICAgICAgICBpZiAoZS5tZXRob2RzRm9yU3VwZXIgaW5zdGFuY2VvZiBGYXN0QXJyYXkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZhc3RBcnJheSBtZXRob2RzID0gKEZhc3RBcnJheSkgZS5tZXRob2RzRm9yU3VwZXI7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRmFzdEFycmF5KG1ldGhvZHMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgTWV0YU1ldGhvZCBtZXRob2QgPSAoTWV0YU1ldGhvZCkgZS5tZXRob2RzRm9yU3VwZXI7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kIGluc3RhbmNlb2YgTmV3TWV0YU1ldGhvZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVzZVRoaXMgXiAobWV0aG9kLmdldE1vZGlmaWVycygpICYgKE1vZGlmaWVyLlBVQkxJQyB8IE1vZGlmaWVyLlBST1RFQ1RFRCkpID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtb3BOYW1lID0gbWV0aG9kLmdldE1vcE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IEFycmF5cy5iaW5hcnlTZWFyY2gobW9wTWV0aG9kcywgbW9wTmFtZSwgQ2FjaGVkQ2xhc3MuQ2FjaGVkTWV0aG9kQ29tcGFyYXRvcldpdGhTdHJpbmcuSU5TVEFOQ0UpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJvbSA9IGluZGV4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChmcm9tID4gMCAmJiBtb3BNZXRob2RzW2Zyb20tMV0uZ2V0TmFtZSgpLmVxdWFscyhtb3BOYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20tLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG8gPSBpbmRleDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAodG8gPCBtb3BNZXRob2RzLmxlbmd0aC0xICYmIG1vcE1ldGhvZHNbdG8rMV0uZ2V0TmFtZSgpLmVxdWFscyhtb3BOYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvKys7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF0Y2hpbmdNZXRob2QgPSBmaW5kTWF0Y2hpbmdNZXRob2QobW9wTWV0aG9kcywgZnJvbSwgdG8sIG1ldGhvZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoaW5nTWV0aG9kICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUubWV0aG9kc0ZvclN1cGVyID0gbW9wTWV0aG9kc1ttYXRjaGluZ01ldGhvZF0uZ2V0UmVmbGVjdGlvbk1ldGFNZXRob2QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzRmFzdEFycmF5KEZhc3RBcnJheSBtZXRob2RzKSB7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGxlbiA9IG1ldGhvZHMuc2l6ZSgpOworICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdFtdIGRhdGEgPSBtZXRob2RzLmdldEFycmF5KCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgIT0gbGVuOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgTWV0YU1ldGhvZCBtZXRob2QgPSAoTWV0YU1ldGhvZCkgZGF0YVtpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZCBpbnN0YW5jZW9mIE5ld01ldGFNZXRob2QpCisgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIGlmICh1c2VUaGlzIF4gKG1ldGhvZC5nZXRNb2RpZmllcnMoKSAmIChNb2RpZmllci5QVUJMSUMgfCBNb2RpZmllci5QUk9URUNURUQpKSA9PSAwKSBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1vcE5hbWUgPSBtZXRob2QuZ2V0TW9wTmFtZSgpOworICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBBcnJheXMuYmluYXJ5U2VhcmNoKG1vcE1ldGhvZHMsIG1vcE5hbWUsIENhY2hlZENsYXNzLkNhY2hlZE1ldGhvZENvbXBhcmF0b3JXaXRoU3RyaW5nLklOU1RBTkNFKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcm9tID0gaW5kZXg7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZnJvbSA+IDAgJiYgbW9wTWV0aG9kc1tmcm9tLTFdLmdldE5hbWUoKS5lcXVhbHMobW9wTmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20tLTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB0byA9IGluZGV4OworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRvIDwgbW9wTWV0aG9kcy5sZW5ndGgtMSAmJiBtb3BNZXRob2RzW3RvKzFdLmdldE5hbWUoKS5lcXVhbHMobW9wTmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRvKys7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXRjaGluZ01ldGhvZCA9IGZpbmRNYXRjaGluZ01ldGhvZChtb3BNZXRob2RzLCBmcm9tLCB0bywgbWV0aG9kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaGluZ01ldGhvZCAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZHMuc2V0KGksIG1vcE1ldGhvZHNbbWF0Y2hpbmdNZXRob2RdLmdldFJlZmxlY3Rpb25NZXRhTWV0aG9kKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIE1PUEl0ZXIgaXRlciA9IG5ldyBNT1BJdGVyKCk7CisKKyAgICAgICAgLy8gcmVwbGFjZSBhbGwgY2FsbHMgZm9yIHN1cGVyIHdpdGggdGhlIGNvcnJlY3QgTU9QIG1ldGhvZAorICAgICAgICBpdGVyLnVzZVRoaXMgPSBmYWxzZTsKKyAgICAgICAgaXRlci5pdGVyYXRlKCk7CisgICAgICAgIC8vIHJlcGxhY2UgYWxsIGNhbGxzIGZvciB0aGlzIHdpdGggdGhlIGNvcnJlY3QgTU9QIG1ldGhvZAorICAgICAgICBpdGVyLnVzZVRoaXMgPSB0cnVlOworICAgICAgICBpdGVyLml0ZXJhdGUoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5oZXJpdEludGVyZmFjZU5ld01ldGFNZXRob2RzKFNldCBpbnRlcmZhY2VzKSB7CisgICAgICAgIC8vIGFkZCBtZXRob2RzIGRlY2xhcmVkIGJ5IERHTSBmb3IgaW50ZXJmYWNlcworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gaW50ZXJmYWNlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgeworICAgICAgICAgICAgQ2FjaGVkQ2xhc3MgY2xzID0gKENhY2hlZENsYXNzKSBpdC5uZXh0KCk7CisgICAgICAgICAgICBNZXRhTWV0aG9kIG1ldGhvZHMgW10gPSBjbHMuZ2V0TmV3TWV0YU1ldGhvZHMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIE1ldGFNZXRob2QgbWV0aG9kID0gbWV0aG9kc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAoIW5ld0dyb292eU1ldGhvZHNTZXQuY29udGFpbnMobWV0aG9kKSkgeworICAgICAgICAgICAgICAgICAgICBuZXdHcm9vdnlNZXRob2RzU2V0LmFkZChtZXRob2QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBNZXRhTWV0aG9kSW5kZXguRW50cnkgZSA9IG1ldGFNZXRob2RJbmRleC5nZXRPclB1dE1ldGhvZHMobWV0aG9kLmdldE5hbWUoKSwgbWFpbkNsYXNzTWV0aG9kSGVhZGVyKTsKKyAgICAgICAgICAgICAgICBlLm1ldGhvZHMgPSBtZXRhTWV0aG9kSW5kZXguYWRkTWV0aG9kVG9MaXN0KGUubWV0aG9kcywgbWV0aG9kKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwb3B1bGF0ZUludGVyZmFjZXMoU2V0IGludGVyZmFjZXMpIHsKKy8vICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBpbnRlcmZhY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworLy8gICAgICAgICAgICBDYWNoZWRDbGFzcyBpQ2xhc3MgPSAoQ2FjaGVkQ2xhc3MpIGl0ZXIubmV4dCgpOworLy8gICAgICAgICAgICBjbGFzc0luZGV4LmNvcHlOb25Qcml2YXRlTWV0aG9kcyhtYWluQ2xhc3NNZXRob2RIZWFkZXIsIGNsYXNzSW5kZXguZ2V0SGVhZGVyKGlDbGFzcy5nZXRDYWNoZWRDbGFzcygpKSk7CisvLyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjb25uZWN0TXVsdGltZXRob2RzKExpc3Qgc3VwZXJDbGFzc2VzLCBDYWNoZWRDbGFzcyBmaXJzdEdyb292eUNsYXNzKSB7CisgICAgICAgIHN1cGVyQ2xhc3NlcyA9IERlZmF1bHRHcm9vdnlNZXRob2RzLnJldmVyc2Uoc3VwZXJDbGFzc2VzKTsKKyAgICAgICAgTWV0YU1ldGhvZEluZGV4LkhlYWRlciBsYXN0ID0gbnVsbDsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gc3VwZXJDbGFzc2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgQ2FjaGVkQ2xhc3MgYyA9IChDYWNoZWRDbGFzcykgaXRlci5uZXh0KCk7CisgICAgICAgICAgICBNZXRhTWV0aG9kSW5kZXguSGVhZGVyIG1ldGhvZEluZGV4ID0gbWV0YU1ldGhvZEluZGV4LmdldEhlYWRlcihjLmdldENhY2hlZENsYXNzKCkpOworICAgICAgICAgICAgLy8gV2UgZG9uJ3QgY29weSBER00gbWV0aG9kcyB0byBzdXBlcmNsYXNzZXMnIGluZGV4ZXMKKyAgICAgICAgICAgIC8vIFRoZSByZWFzb24gd2UgY2FuIGRvIHRoYXQgaXMgcGFydGljdWxhciBzZXQgb2YgREdNIG1ldGhvZHMgaW4gdXNlLAorICAgICAgICAgICAgLy8gaWYgYXQgc29tZSBwb2ludCB3ZSB3aWxsIGRlZmluZSBER00gbWV0aG9kIGZvciBzb21lIEdyb292eSBjbGFzcyBvcgorICAgICAgICAgICAgLy8gZm9yIGEgY2xhc3MgZGVyaXZlZCBmcm9tIHN1Y2gsIHdlIHdpbGwgbmVlZCB0byByZXZpc2UgdGhpcyBjb25kaXRpb24uCisgICAgICAgICAgICAvLyBJdCBzYXZlcyB1cyBhIGxvdCBvZiBzcGFjZSBhbmQgc29tZSBub3RpY2FibGUgdGltZQorICAgICAgICAgICAgaWYgKGxhc3QgIT0gbnVsbCkgbWV0YU1ldGhvZEluZGV4LmNvcHlOb25Qcml2YXRlTm9uTmV3TWV0YU1ldGhvZHMobGFzdCwgbWV0aG9kSW5kZXgpOworICAgICAgICAgICAgbGFzdCA9IG1ldGhvZEluZGV4OworCisgICAgICAgICAgICBpZiAoYyA9PSBmaXJzdEdyb292eUNsYXNzKQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbmhlcml0TWV0aG9kcyhDb2xsZWN0aW9uIHN1cGVyQ2xhc3NlcywgQ2FjaGVkQ2xhc3MgZmlyc3RHcm9vdnlTdXBlcikgeworICAgICAgICBJdGVyYXRvciBpdGVyID0gc3VwZXJDbGFzc2VzLml0ZXJhdG9yKCk7CisgICAgICAgIGZvciAoOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIENhY2hlZENsYXNzIGMgPSAoQ2FjaGVkQ2xhc3MpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgaWYgKGMgPT0gZmlyc3RHcm9vdnlTdXBlci5nZXRDYWNoZWRTdXBlckNsYXNzKCkpCisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgTWV0YU1ldGhvZEluZGV4LkhlYWRlciBsYXN0ID0gbnVsbDsKKyAgICAgICAgZm9yICg7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgQ2FjaGVkQ2xhc3MgYyA9IChDYWNoZWRDbGFzcykgaXRlci5uZXh0KCk7CisgICAgICAgICAgICBNZXRhTWV0aG9kSW5kZXguSGVhZGVyIG1ldGhvZEluZGV4ID0gbWV0YU1ldGhvZEluZGV4LmdldEhlYWRlcihjLmdldENhY2hlZENsYXNzKCkpOworICAgICAgICAgICAgaWYgKGxhc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1ldGFNZXRob2RJbmRleC5jb3B5Tm9uUHJpdmF0ZU1ldGhvZHMobGFzdCwgbWV0aG9kSW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGFzdCA9IG1ldGhvZEluZGV4OworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBDYWNoZWRDbGFzcyBjYWxjRmlyc3RHcm9vdnlTdXBlckNsYXNzKENvbGxlY3Rpb24gc3VwZXJDbGFzc2VzKSB7CisgICAgICAgIGlmICh0aGVDYWNoZWRDbGFzcy5pc0ludGVyZmFjZSkKKyAgICAgICAgICByZXR1cm4gUmVmbGVjdGlvbkNhY2hlLk9CSkVDVF9DTEFTUzsKKyAgICAgICAgCisgICAgICAgIENhY2hlZENsYXNzIGZpcnN0R3Jvb3Z5ID0gbnVsbDsKKyAgICAgICAgSXRlcmF0b3IgaXRlciA9IHN1cGVyQ2xhc3Nlcy5pdGVyYXRvcigpOworICAgICAgICBmb3IgKDsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBDYWNoZWRDbGFzcyBjID0gKENhY2hlZENsYXNzKSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChHcm9vdnlPYmplY3QuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjLmdldENhY2hlZENsYXNzKCkpKSB7CisgICAgICAgICAgICAgIGZpcnN0R3Jvb3Z5ID0gYzsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZmlyc3RHcm9vdnkgPT0gbnVsbCkKKyAgICAgICAgICBmaXJzdEdyb292eSA9IHRoZUNhY2hlZENsYXNzOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChmaXJzdEdyb292eS5nZXRDYWNoZWRDbGFzcygpID09IEdyb292eU9iamVjdFN1cHBvcnQuY2xhc3MgJiYgaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBmaXJzdEdyb292eSA9IChDYWNoZWRDbGFzcykgaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0R3Jvb3Z5LmdldENhY2hlZENsYXNzKCkgPT0gQ2xvc3VyZS5jbGFzcyAmJiBpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICBmaXJzdEdyb292eSA9IChDYWNoZWRDbGFzcykgaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIEdyb292eU9iamVjdC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGZpcnN0R3Jvb3Z5LmdldENhY2hlZENsYXNzKCkpID8gZmlyc3RHcm9vdnkuZ2V0Q2FjaGVkU3VwZXJDbGFzcygpIDogZmlyc3RHcm9vdnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBhbGwgdGhlIG5vcm1hbCBpbnN0YW5jZSBtZXRob2RzIGF2YWlhYmxlIG9uIHRoaXMgY2xhc3MgZm9yIHRoZQorICAgICAqICAgICAgICAgZ2l2ZW4gbmFtZQorICAgICAqLworICAgIHByaXZhdGUgT2JqZWN0IGdldE1ldGhvZHMoQ2xhc3Mgc2VuZGVyLCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBpc0NhbGxUb1N1cGVyKSB7CisgICAgICAgIE9iamVjdCBhbnN3ZXI7CisKKyAgICAgICAgZmluYWwgTWV0YU1ldGhvZEluZGV4LkVudHJ5IGVudHJ5ID0gbWV0YU1ldGhvZEluZGV4LmdldE1ldGhvZHMoc2VuZGVyLCBuYW1lKTsKKyAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpCisgICAgICAgICAgICBhbnN3ZXIgPSBGYXN0QXJyYXkuRU1QVFlfTElTVDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaWYgKGlzQ2FsbFRvU3VwZXIpIHsKKyAgICAgICAgICAgICAgICBhbnN3ZXIgPSBlbnRyeS5tZXRob2RzRm9yU3VwZXI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFuc3dlciA9IGVudHJ5Lm1ldGhvZHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgaWYgKGFuc3dlciA9PSBudWxsKSBhbnN3ZXIgPSBGYXN0QXJyYXkuRU1QVFlfTElTVDsKKworICAgICAgICBpZiAoIWlzQ2FsbFRvU3VwZXIgJiYgR3Jvb3Z5Q2F0ZWdvcnlTdXBwb3J0Lmhhc0NhdGVnb3J5SW5BbnlUaHJlYWQoKSkgeworICAgICAgICAgICAgTGlzdCB1c2VkID0gR3Jvb3Z5Q2F0ZWdvcnlTdXBwb3J0LmdldENhdGVnb3J5TWV0aG9kcyhzZW5kZXIsIG5hbWUpOworICAgICAgICAgICAgaWYgKHVzZWQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEZhc3RBcnJheSBhcnI7CisgICAgICAgICAgICAgICAgaWYgKGFuc3dlciBpbnN0YW5jZW9mIE1ldGFNZXRob2QpIHsKKyAgICAgICAgICAgICAgICAgICAgYXJyID0gbmV3IEZhc3RBcnJheSgpOworICAgICAgICAgICAgICAgICAgICBhcnIuYWRkKGFuc3dlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIGFyciA9ICgoRmFzdEFycmF5KSBhbnN3ZXIpLmNvcHkoKTsKKworICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHVzZWQuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgICAgIE1ldGFNZXRob2QgZWxlbWVudCA9IChNZXRhTWV0aG9kKSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyTWF0Y2hpbmdNZXRob2RGb3JDYXRlZ29yeShhcnIsIGVsZW1lbnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhbnN3ZXIgPSBhcnI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFuc3dlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIGFsbCB0aGUgbm9ybWFsIHN0YXRpYyBtZXRob2RzIGF2YWlhYmxlIG9uIHRoaXMgY2xhc3MgZm9yIHRoZQorICAgICAqICAgICAgICAgZ2l2ZW4gbmFtZQorICAgICAqLworICAgIHByaXZhdGUgT2JqZWN0IGdldFN0YXRpY01ldGhvZHMoQ2xhc3Mgc2VuZGVyLCBTdHJpbmcgbmFtZSkgeworICAgICAgICBmaW5hbCBNZXRhTWV0aG9kSW5kZXguRW50cnkgZW50cnkgPSBtZXRhTWV0aG9kSW5kZXguZ2V0TWV0aG9kcyhzZW5kZXIsIG5hbWUpOworICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBGYXN0QXJyYXkuRU1QVFlfTElTVDsKKyAgICAgICAgT2JqZWN0IGFuc3dlciA9IGVudHJ5LnN0YXRpY01ldGhvZHM7CisgICAgICAgIGlmIChhbnN3ZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBGYXN0QXJyYXkuRU1QVFlfTElTVDsKKyAgICAgICAgcmV0dXJuIGFuc3dlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc01vZGlmaWVkKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7ICAvLyBNZXRhQ2xhc3NJbXBsIG5vdCBkZXNpZ25lZCBmb3IgbW9kaWZpY2F0aW9uLCBqdXN0IHJldHVybiBmYWxzZQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZE5ld0luc3RhbmNlTWV0aG9kKE1ldGhvZCBtZXRob2QpIHsKKyAgICAgICAgZmluYWwgQ2FjaGVkTWV0aG9kIGNhY2hlZE1ldGhvZCA9IENhY2hlZE1ldGhvZC5maW5kKG1ldGhvZCk7CisgICAgICAgIE5ld0luc3RhbmNlTWV0YU1ldGhvZCBuZXdNZXRob2QgPSBuZXcgTmV3SW5zdGFuY2VNZXRhTWV0aG9kKGNhY2hlZE1ldGhvZCk7CisgICAgICAgIGZpbmFsIENhY2hlZENsYXNzIGRlY2xhcmluZ0NsYXNzID0gbmV3TWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCk7CisgICAgICAgIGFkZE5ld0luc3RhbmNlTWV0aG9kVG9JbmRleChuZXdNZXRob2QsIG1ldGFNZXRob2RJbmRleC5nZXRIZWFkZXIoZGVjbGFyaW5nQ2xhc3MuZ2V0Q2FjaGVkQ2xhc3MoKSkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhZGROZXdJbnN0YW5jZU1ldGhvZFRvSW5kZXgoTWV0YU1ldGhvZCBuZXdNZXRob2QsIE1ldGFNZXRob2RJbmRleC5IZWFkZXIgaGVhZGVyKSB7CisgICAgICAgIGlmICghbmV3R3Jvb3Z5TWV0aG9kc1NldC5jb250YWlucyhuZXdNZXRob2QpKSB7CisgICAgICAgICAgICBuZXdHcm9vdnlNZXRob2RzU2V0LmFkZChuZXdNZXRob2QpOworICAgICAgICAgICAgYWRkTWV0YU1ldGhvZFRvSW5kZXgobmV3TWV0aG9kLCBoZWFkZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkTmV3U3RhdGljTWV0aG9kKE1ldGhvZCBtZXRob2QpIHsKKyAgICAgICAgZmluYWwgQ2FjaGVkTWV0aG9kIGNhY2hlZE1ldGhvZCA9IENhY2hlZE1ldGhvZC5maW5kKG1ldGhvZCk7CisgICAgICAgIE5ld1N0YXRpY01ldGFNZXRob2QgbmV3TWV0aG9kID0gbmV3IE5ld1N0YXRpY01ldGFNZXRob2QoY2FjaGVkTWV0aG9kKTsKKyAgICAgICAgZmluYWwgQ2FjaGVkQ2xhc3MgZGVjbGFyaW5nQ2xhc3MgPSBuZXdNZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKTsKKyAgICAgICAgYWRkTmV3U3RhdGljTWV0aG9kVG9JbmRleChuZXdNZXRob2QsIG1ldGFNZXRob2RJbmRleC5nZXRIZWFkZXIoZGVjbGFyaW5nQ2xhc3MuZ2V0Q2FjaGVkQ2xhc3MoKSkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhZGROZXdTdGF0aWNNZXRob2RUb0luZGV4KE1ldGFNZXRob2QgbmV3TWV0aG9kLCBNZXRhTWV0aG9kSW5kZXguSGVhZGVyIGhlYWRlcikgeworICAgICAgICBpZiAoIW5ld0dyb292eU1ldGhvZHNTZXQuY29udGFpbnMobmV3TWV0aG9kKSkgeworICAgICAgICAgICAgbmV3R3Jvb3Z5TWV0aG9kc1NldC5hZGQobmV3TWV0aG9kKTsKKyAgICAgICAgICAgIGFkZE1ldGFNZXRob2RUb0luZGV4KG5ld01ldGhvZCwgaGVhZGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1bndyYXAoT2JqZWN0W10gYXJndW1lbnRzKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIFRlbXAgY29kZSB0byBpZ25vcmUgd3JhcHBlZCBwYXJhbWV0ZXJzCisgICAgICAgIC8vIFRoZSBOZXcgTU9QIHdpbGwgZGVhbCB3aXRoIHRoZXNlIHByb3Blcmx5CisgICAgICAgIC8vCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpICE9IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGFyZ3VtZW50c1tpXSBpbnN0YW5jZW9mIFdyYXBwZXIpIHsKKyAgICAgICAgICAgICAgICBhcmd1bWVudHNbaV0gPSAoKFdyYXBwZXIpIGFyZ3VtZW50c1tpXSkudW53cmFwKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGludm9rZU1ldGhvZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbWV0aG9kTmFtZSwgT2JqZWN0IGFyZ3VtZW50cykgeworICAgICAgICBpZiAoYXJndW1lbnRzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBpbnZva2VNZXRob2Qob2JqZWN0LCBtZXRob2ROYW1lLCBNZXRhQ2xhc3NIZWxwZXIuRU1QVFlfQVJSQVkpOworICAgICAgICB9CisgICAgICAgIGlmIChhcmd1bWVudHMgaW5zdGFuY2VvZiBUdXBsZSkgeworICAgICAgICAgICAgVHVwbGUgdHVwbGUgPSAoVHVwbGUpIGFyZ3VtZW50czsKKyAgICAgICAgICAgIHJldHVybiBpbnZva2VNZXRob2Qob2JqZWN0LCBtZXRob2ROYW1lLCB0dXBsZS50b0FycmF5KCkpOworICAgICAgICB9CisgICAgICAgIGlmIChhcmd1bWVudHMgaW5zdGFuY2VvZiBPYmplY3RbXSkgeworICAgICAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZChvYmplY3QsIG1ldGhvZE5hbWUsIChPYmplY3RbXSkgYXJndW1lbnRzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBpbnZva2VNZXRob2Qob2JqZWN0LCBtZXRob2ROYW1lLCBuZXcgT2JqZWN0W117YXJndW1lbnRzfSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGludm9rZU1pc3NpbmdNZXRob2QoT2JqZWN0IGluc3RhbmNlLCBTdHJpbmcgbWV0aG9kTmFtZSwgT2JqZWN0W10gYXJndW1lbnRzKSB7CisgICAgICAgIHJldHVybiBpbnZva2VNaXNzaW5nTWV0aG9kKGluc3RhbmNlLCBtZXRob2ROYW1lLCBhcmd1bWVudHMsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgaW52b2tlTWlzc2luZ1Byb3BlcnR5KE9iamVjdCBpbnN0YW5jZSwgU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG9wdGlvbmFsVmFsdWUsIGJvb2xlYW4gaXNHZXR0ZXIpIHsKKworICAgICAgICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENsYXNzKSkgeworICAgICAgICAgICAgaWYgKGlzR2V0dGVyICYmIHByb3BlcnR5TWlzc2luZ0dldCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5TWlzc2luZ0dldC5pbnZva2UoaW5zdGFuY2UsIG5ldyBPYmplY3RbXXtwcm9wZXJ0eU5hbWV9KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5TWlzc2luZ1NldCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvcGVydHlNaXNzaW5nU2V0Lmludm9rZShpbnN0YW5jZSwgbmV3IE9iamVjdFtde3Byb3BlcnR5TmFtZSwgb3B0aW9uYWxWYWx1ZX0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbk5vU3RhY2socHJvcGVydHlOYW1lLCB0aGVDbGFzcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBPYmplY3QgaW52b2tlTWlzc2luZ01ldGhvZChPYmplY3QgaW5zdGFuY2UsIFN0cmluZyBtZXRob2ROYW1lLCBPYmplY3RbXSBhcmd1bWVudHMsIFJ1bnRpbWVFeGNlcHRpb24gb3JpZ2luYWwpIHsKKyAgICAgICAgaWYgKG1ldGhvZE1pc3NpbmcgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1ldGhvZE1pc3NpbmcuaW52b2tlKGluc3RhbmNlLCBuZXcgT2JqZWN0W117bWV0aG9kTmFtZSwgYXJndW1lbnRzfSk7CisgICAgICAgIH0gZWxzZSBpZiAob3JpZ2luYWwgIT0gbnVsbCkgdGhyb3cgb3JpZ2luYWw7CisgICAgICAgIGVsc2UgdGhyb3cgbmV3IE1pc3NpbmdNZXRob2RFeGNlcHRpb25Ob1N0YWNrKG1ldGhvZE5hbWUsIHRoZUNsYXNzLCBhcmd1bWVudHMsIGZhbHNlKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEhvb2sgdG8gZGVhbCB3aXRoIHRoZSBjYXNlIG9mIE1pc3NpbmdQcm9wZXJ0eSBmb3Igc3RhdGljIHByb3BlcnRpZXMuIFRoZSBtZXRob2Qgd2lsbCBsb29rIGF0dGVtcHQgdG8gbG9vayB1cAorICAgICAqICJwcm9wZXJ0eU1pc3NpbmciIGhhbmRsZXJzIGFuZCBpbnZva2UgdGhlbSBvdGhlcndpc2UgdGhyb3duIGEgTWlzc2luZ1Byb3BlcnR5RXhjZXB0aW9uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5zdGFuY2UgICAgICBUaGUgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lICBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkKKyAgICAgKiBAcGFyYW0gb3B0aW9uYWxWYWx1ZSBUaGUgdmFsdWUgaW4gdGhlIGNhc2Ugb2YgYSBzZXR0ZXIKKyAgICAgKiBAcGFyYW0gaXNHZXR0ZXIgICAgICBUcnVlIGlmIGl0cyBhIGdldHRlcgorICAgICAqIEByZXR1cm4gVGhlIHZhbHVlIGluIHRoZSBjYXNlIG9mIGEgZ2V0dGVyIG9yIGEgTWlzc2luZ1Byb3BlcnR5RXhjZXB0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIE9iamVjdCBpbnZva2VTdGF0aWNNaXNzaW5nUHJvcGVydHkoT2JqZWN0IGluc3RhbmNlLCBTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3Qgb3B0aW9uYWxWYWx1ZSwgYm9vbGVhbiBpc0dldHRlcikgeworICAgICAgICBNZXRhQ2xhc3MgbWMgPSBpbnN0YW5jZSBpbnN0YW5jZW9mIENsYXNzID8gcmVnaXN0cnkuZ2V0TWV0YUNsYXNzKChDbGFzcykgaW5zdGFuY2UpIDogdGhpczsKKyAgICAgICAgaWYgKGlzR2V0dGVyKSB7CisgICAgICAgICAgICBNZXRhTWV0aG9kIHByb3BlcnR5TWlzc2luZyA9IG1jLmdldE1ldGFNZXRob2QoU1RBVElDX1BST1BFUlRZX01JU1NJTkcsIEdFVFRFUl9NSVNTSU5HX0FSR1MpOworICAgICAgICAgICAgaWYgKHByb3BlcnR5TWlzc2luZyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5TWlzc2luZy5pbnZva2UoaW5zdGFuY2UsIG5ldyBPYmplY3RbXXtwcm9wZXJ0eU5hbWV9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE1ldGFNZXRob2QgcHJvcGVydHlNaXNzaW5nID0gbWMuZ2V0TWV0YU1ldGhvZChTVEFUSUNfUFJPUEVSVFlfTUlTU0lORywgU0VUVEVSX01JU1NJTkdfQVJHUyk7CisgICAgICAgICAgICBpZiAocHJvcGVydHlNaXNzaW5nICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcHJvcGVydHlNaXNzaW5nLmludm9rZShpbnN0YW5jZSwgbmV3IE9iamVjdFtde3Byb3BlcnR5TmFtZSwgb3B0aW9uYWxWYWx1ZX0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGluc3RhbmNlIGluc3RhbmNlb2YgQ2xhc3MpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nUHJvcGVydHlFeGNlcHRpb24ocHJvcGVydHlOYW1lLCAoQ2xhc3MpIGluc3RhbmNlKTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ1Byb3BlcnR5RXhjZXB0aW9uKHByb3BlcnR5TmFtZSwgdGhlQ2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludm9rZXMgdGhlIGdpdmVuIG1ldGhvZCBvbiB0aGUgb2JqZWN0LgorICAgICAqIFRPRE86IHNob3VsZCB0aGlzIGJlIGRlcHJlY2F0ZWQ/IElmIHNvLCB3ZSBoYXZlIHRvIHByb3BvZ2F0ZSB0byBtYW55IHBsYWNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGludm9rZU1ldGhvZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbWV0aG9kTmFtZSwgT2JqZWN0W10gb3JpZ2luYWxBcmd1bWVudHMpIHsKKyAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZCh0aGVDbGFzcywgb2JqZWN0LCBtZXRob2ROYW1lLCBvcmlnaW5hbEFyZ3VtZW50cywgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEludm9rZXMgdGhlIGdpdmVuIG1ldGhvZCBvbiB0aGUgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgaW52b2tlTWV0aG9kKENsYXNzIHNlbmRlciwgT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1ldGhvZE5hbWUsIE9iamVjdFtdIG9yaWdpbmFsQXJndW1lbnRzLCBib29sZWFuIGlzQ2FsbFRvU3VwZXIsIGJvb2xlYW4gZnJvbUluc2lkZUNsYXNzKSB7CisgICAgICAgIGNoZWNrSW5pdGFsaXNlZCgpOworICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiQ2Fubm90IGludm9rZSBtZXRob2Q6ICIgKyBtZXRob2ROYW1lICsgIiBvbiBudWxsIG9iamVjdCIpOworICAgICAgICB9CisgICAgICAgIGlmIChMT0cuaXNMb2dnYWJsZShMZXZlbC5GSU5FUikpIHsKKyAgICAgICAgICAgIE1ldGFDbGFzc0hlbHBlci5sb2dNZXRob2RDYWxsKG9iamVjdCwgbWV0aG9kTmFtZSwgb3JpZ2luYWxBcmd1bWVudHMpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIE9iamVjdFtdIGFyZ3VtZW50cyA9IG9yaWdpbmFsQXJndW1lbnRzID09IG51bGwgPyBFTVBUWV9BUkdVTUVOVFMgOiBvcmlnaW5hbEFyZ3VtZW50czsKKyAgICAgICAgZmluYWwgQ2xhc3NbXSBhcmdDbGFzc2VzID0gTWV0YUNsYXNzSGVscGVyLmNvbnZlcnRUb1R5cGVBcnJheShhcmd1bWVudHMpOworCisgICAgICAgIHVud3JhcChhcmd1bWVudHMpOworCisgICAgICAgIE1ldGFNZXRob2QgbWV0aG9kID0gZ2V0TWV0aG9kV2l0aENhY2hpbmcoc2VuZGVyLCBtZXRob2ROYW1lLCBhcmdDbGFzc2VzLCBpc0NhbGxUb1N1cGVyKTsKKworICAgICAgICBpZiAobWV0aG9kID09IG51bGwgJiYgYXJndW1lbnRzLmxlbmd0aCA9PSAxICYmIGFyZ3VtZW50c1swXSBpbnN0YW5jZW9mIExpc3QpIHsKKyAgICAgICAgICAgIE9iamVjdFtdIG5ld0FyZ3VtZW50cyA9ICgoTGlzdCkgYXJndW1lbnRzWzBdKS50b0FycmF5KCk7CisgICAgICAgICAgICBDbGFzc1tdIG5ld0FyZ0NsYXNzZXMgPSBNZXRhQ2xhc3NIZWxwZXIuY29udmVydFRvVHlwZUFycmF5KG5ld0FyZ3VtZW50cyk7CisgICAgICAgICAgICBtZXRob2QgPSBnZXRNZXRob2RXaXRoQ2FjaGluZyhzZW5kZXIsIG1ldGhvZE5hbWUsIG5ld0FyZ0NsYXNzZXMsIGlzQ2FsbFRvU3VwZXIpOworICAgICAgICAgICAgaWYgKG1ldGhvZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbWV0aG9kID0gbmV3IFRyYW5zZm9ybU1ldGFNZXRob2QobWV0aG9kKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgaW52b2tlKE9iamVjdCBvYmplY3QsIE9iamVjdFtdIGFyZ3VtZW50cykgeworICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGZpcnN0QXJndW1lbnQgPSBhcmd1bWVudHNbMF07CisgICAgICAgICAgICAgICAgICAgICAgICBMaXN0IGxpc3QgPSAoTGlzdCkgZmlyc3RBcmd1bWVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50cyA9IGxpc3QudG9BcnJheSgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmludm9rZShvYmplY3QsIGFyZ3VtZW50cyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZmluYWwgYm9vbGVhbiBpc0Nsb3N1cmUgPSBvYmplY3QgaW5zdGFuY2VvZiBDbG9zdXJlOworICAgICAgICBpZiAoaXNDbG9zdXJlKSB7CisgICAgICAgICAgICBmaW5hbCBDbG9zdXJlIGNsb3N1cmUgPSAoQ2xvc3VyZSkgb2JqZWN0OworCisgICAgICAgICAgICBmaW5hbCBPYmplY3Qgb3duZXIgPSBjbG9zdXJlLmdldE93bmVyKCk7CisKKyAgICAgICAgICAgIGlmIChDTE9TVVJFX0NBTExfTUVUSE9ELmVxdWFscyhtZXRob2ROYW1lKSB8fCBDTE9TVVJFX0RPX0NBTExfTUVUSE9ELmVxdWFscyhtZXRob2ROYW1lKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzIG9iamVjdENsYXNzID0gb2JqZWN0LmdldENsYXNzKCk7CisgICAgICAgICAgICAgICAgaWYgKG9iamVjdENsYXNzID09IE1ldGhvZENsb3N1cmUuY2xhc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgTWV0aG9kQ2xvc3VyZSBtYyA9IChNZXRob2RDbG9zdXJlKSBvYmplY3Q7CisgICAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSBtYy5nZXRNZXRob2QoKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3Mgb3duZXJDbGFzcyA9IG93bmVyIGluc3RhbmNlb2YgQ2xhc3MgPyAoQ2xhc3MpIG93bmVyIDogb3duZXIuZ2V0Q2xhc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgTWV0YUNsYXNzIG93bmVyTWV0YUNsYXNzID0gcmVnaXN0cnkuZ2V0TWV0YUNsYXNzKG93bmVyQ2xhc3MpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3duZXJNZXRhQ2xhc3MuaW52b2tlTWV0aG9kKG93bmVyQ2xhc3MsIG93bmVyLCBtZXRob2ROYW1lLCBhcmd1bWVudHMsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvYmplY3RDbGFzcyA9PSBDdXJyaWVkQ2xvc3VyZS5jbGFzcykgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBDdXJyaWVkQ2xvc3VyZSBjYyA9IChDdXJyaWVkQ2xvc3VyZSkgb2JqZWN0OworICAgICAgICAgICAgICAgICAgICAvLyBjaGFuZ2UgdGhlIGFyZ3VtZW50cyBmb3IgYW4gdW5jdXJyaWVkIGNhbGwKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0W10gY3VycmllZEFyZ3VtZW50cyA9IGNjLmdldFVuY3VycmllZEFyZ3VtZW50cyhhcmd1bWVudHMpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzcyBvd25lckNsYXNzID0gb3duZXIgaW5zdGFuY2VvZiBDbGFzcyA/IChDbGFzcykgb3duZXIgOiBvd25lci5nZXRDbGFzcygpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZXRhQ2xhc3Mgb3duZXJNZXRhQ2xhc3MgPSByZWdpc3RyeS5nZXRNZXRhQ2xhc3Mob3duZXJDbGFzcyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBvd25lck1ldGFDbGFzcy5pbnZva2VNZXRob2Qob3duZXIsIG1ldGhvZE5hbWUsIGN1cnJpZWRBcmd1bWVudHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobWV0aG9kPT1udWxsKSBpbnZva2VNaXNzaW5nTWV0aG9kKG9iamVjdCxtZXRob2ROYW1lLGFyZ3VtZW50cyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKENMT1NVUkVfQ1VSUllfTUVUSE9ELmVxdWFscyhtZXRob2ROYW1lKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBjbG9zdXJlLmN1cnJ5KGFyZ3VtZW50cyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIE9iamVjdCBkZWxlZ2F0ZSA9IGNsb3N1cmUuZ2V0RGVsZWdhdGUoKTsKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNDbG9zdXJlTm90T3duZXIgPSBvd25lciAhPSBjbG9zdXJlOworICAgICAgICAgICAgZmluYWwgaW50IHJlc29sdmVTdHJhdGVneSA9IGNsb3N1cmUuZ2V0UmVzb2x2ZVN0cmF0ZWd5KCk7CisKKyAgICAgICAgICAgIHN3aXRjaCAocmVzb2x2ZVN0cmF0ZWd5KSB7CisgICAgICAgICAgICAgICAgY2FzZSBDbG9zdXJlLlRPX1NFTEY6CisgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9IGNsb3N1cmUuZ2V0TWV0YUNsYXNzKCkucGlja01ldGhvZChtZXRob2ROYW1lLCBhcmdDbGFzc2VzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZCAhPSBudWxsKSByZXR1cm4gbWV0aG9kLmludm9rZShjbG9zdXJlLCBhcmd1bWVudHMpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENsb3N1cmUuREVMRUdBVEVfT05MWToKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZCA9PSBudWxsICYmIGRlbGVnYXRlICE9IGNsb3N1cmUgJiYgZGVsZWdhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgTWV0YUNsYXNzIGRlbGVnYXRlTWV0YUNsYXNzID0gbG9va3VwT2JqZWN0TWV0YUNsYXNzKGRlbGVnYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9IGRlbGVnYXRlTWV0YUNsYXNzLnBpY2tNZXRob2QobWV0aG9kTmFtZSwgYXJnQ2xhc3Nlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlTWV0YUNsYXNzLmludm9rZU1ldGhvZChkZWxlZ2F0ZSwgbWV0aG9kTmFtZSwgb3JpZ2luYWxBcmd1bWVudHMpOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVsZWdhdGUgIT0gY2xvc3VyZSAmJiAoZGVsZWdhdGUgaW5zdGFuY2VvZiBHcm9vdnlPYmplY3QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZE9uR3Jvb3Z5T2JqZWN0KG1ldGhvZE5hbWUsIG9yaWdpbmFsQXJndW1lbnRzLCBkZWxlZ2F0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDbG9zdXJlLk9XTkVSX09OTFk6CisgICAgICAgICAgICAgICAgICAgIGlmIChtZXRob2QgPT0gbnVsbCAmJiBvd25lciAhPSBjbG9zdXJlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBNZXRhQ2xhc3Mgb3duZXJNZXRhQ2xhc3MgPSBsb29rdXBPYmplY3RNZXRhQ2xhc3Mob3duZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG93bmVyTWV0YUNsYXNzLmludm9rZU1ldGhvZChvd25lciwgbWV0aG9kTmFtZSwgb3JpZ2luYWxBcmd1bWVudHMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ2xvc3VyZS5ERUxFR0FURV9GSVJTVDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZCA9PSBudWxsICYmIGRlbGVnYXRlICE9IGNsb3N1cmUgJiYgZGVsZWdhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgTWV0YUNsYXNzIGRlbGVnYXRlTWV0YUNsYXNzID0gbG9va3VwT2JqZWN0TWV0YUNsYXNzKGRlbGVnYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9IGRlbGVnYXRlTWV0YUNsYXNzLnBpY2tNZXRob2QobWV0aG9kTmFtZSwgYXJnQ2xhc3Nlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlTWV0YUNsYXNzLmludm9rZU1ldGhvZChkZWxlZ2F0ZSwgbWV0aG9kTmFtZSwgb3JpZ2luYWxBcmd1bWVudHMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChtZXRob2QgPT0gbnVsbCAmJiBvd25lciAhPSBjbG9zdXJlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBNZXRhQ2xhc3Mgb3duZXJNZXRhQ2xhc3MgPSBsb29rdXBPYmplY3RNZXRhQ2xhc3Mob3duZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gb3duZXJNZXRhQ2xhc3MucGlja01ldGhvZChtZXRob2ROYW1lLCBhcmdDbGFzc2VzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXRob2QgIT0gbnVsbCkgcmV0dXJuIG93bmVyTWV0YUNsYXNzLmludm9rZU1ldGhvZChvd25lciwgbWV0aG9kTmFtZSwgb3JpZ2luYWxBcmd1bWVudHMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChtZXRob2QgPT0gbnVsbCAmJiByZXNvbHZlU3RyYXRlZ3kgIT0gQ2xvc3VyZS5UT19TRUxGKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGlsbCBubyBtZXRob2RzIGZvdW5kLCB0ZXN0IGlmIGRlbGVnYXRlIG9yIG93bmVyIGFyZSBHcm9vdnlPYmplY3RzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgaW52b2tlIHRoZSBtZXRob2Qgb24gdGhlbSBpZiBzby4KKyAgICAgICAgICAgICAgICAgICAgICAgIE1pc3NpbmdNZXRob2RFeGNlcHRpb24gbGFzdCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsZWdhdGUgIT0gY2xvc3VyZSAmJiAoZGVsZWdhdGUgaW5zdGFuY2VvZiBHcm9vdnlPYmplY3QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZE9uR3Jvb3Z5T2JqZWN0KG1ldGhvZE5hbWUsIG9yaWdpbmFsQXJndW1lbnRzLCBkZWxlZ2F0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTWlzc2luZ01ldGhvZEV4Y2VwdGlvbiBtbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3QgPT0gbnVsbCkgbGFzdCA9IG1tZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNDbG9zdXJlTm90T3duZXIgJiYgKG93bmVyIGluc3RhbmNlb2YgR3Jvb3Z5T2JqZWN0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnZva2VNZXRob2RPbkdyb292eU9iamVjdChtZXRob2ROYW1lLCBvcmlnaW5hbEFyZ3VtZW50cywgb3duZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE1pc3NpbmdNZXRob2RFeGNlcHRpb24gbW1lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgPSBtbWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3QgIT0gbnVsbCkgcmV0dXJuIGludm9rZU1pc3NpbmdNZXRob2Qob2JqZWN0LCBtZXRob2ROYW1lLCBvcmlnaW5hbEFyZ3VtZW50cywgbGFzdCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kID09IG51bGwgJiYgb3duZXIgIT0gY2xvc3VyZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTWV0YUNsYXNzIG93bmVyTWV0YUNsYXNzID0gbG9va3VwT2JqZWN0TWV0YUNsYXNzKG93bmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9IG93bmVyTWV0YUNsYXNzLnBpY2tNZXRob2QobWV0aG9kTmFtZSwgYXJnQ2xhc3Nlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kICE9IG51bGwpIHJldHVybiBvd25lck1ldGFDbGFzcy5pbnZva2VNZXRob2Qob3duZXIsIG1ldGhvZE5hbWUsIG9yaWdpbmFsQXJndW1lbnRzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kID09IG51bGwgJiYgZGVsZWdhdGUgIT0gY2xvc3VyZSAmJiBkZWxlZ2F0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBNZXRhQ2xhc3MgZGVsZWdhdGVNZXRhQ2xhc3MgPSBsb29rdXBPYmplY3RNZXRhQ2xhc3MoZGVsZWdhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gZGVsZWdhdGVNZXRhQ2xhc3MucGlja01ldGhvZChtZXRob2ROYW1lLCBhcmdDbGFzc2VzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXRob2QgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGVNZXRhQ2xhc3MuaW52b2tlTWV0aG9kKGRlbGVnYXRlLCBtZXRob2ROYW1lLCBvcmlnaW5hbEFyZ3VtZW50cyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZCA9PSBudWxsICYmIHJlc29sdmVTdHJhdGVneSAhPSBDbG9zdXJlLlRPX1NFTEYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0aWxsIG5vIG1ldGhvZHMgZm91bmQsIHRlc3QgaWYgZGVsZWdhdGUgb3Igb3duZXIgYXJlIEdyb292eU9iamVjdHMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBpbnZva2UgdGhlIG1ldGhvZCBvbiB0aGVtIGlmIHNvLgorICAgICAgICAgICAgICAgICAgICAgICAgTWlzc2luZ01ldGhvZEV4Y2VwdGlvbiBsYXN0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0Nsb3N1cmVOb3RPd25lciAmJiAob3duZXIgaW5zdGFuY2VvZiBHcm9vdnlPYmplY3QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZE9uR3Jvb3Z5T2JqZWN0KG1ldGhvZE5hbWUsIG9yaWdpbmFsQXJndW1lbnRzLCBvd25lcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTWlzc2luZ01ldGhvZEV4Y2VwdGlvbiBtbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3QgPT0gbnVsbCkgbGFzdCA9IG1tZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsZWdhdGUgIT0gY2xvc3VyZSAmJiAoZGVsZWdhdGUgaW5zdGFuY2VvZiBHcm9vdnlPYmplY3QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZE9uR3Jvb3Z5T2JqZWN0KG1ldGhvZE5hbWUsIG9yaWdpbmFsQXJndW1lbnRzLCBkZWxlZ2F0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTWlzc2luZ01ldGhvZEV4Y2VwdGlvbiBtbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCA9IG1tZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdCAhPSBudWxsKSByZXR1cm4gaW52b2tlTWlzc2luZ01ldGhvZChvYmplY3QsIG1ldGhvZE5hbWUsIG9yaWdpbmFsQXJndW1lbnRzLCBsYXN0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG1ldGhvZCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gTWV0YUNsYXNzSGVscGVyLmRvTWV0aG9kSW52b2tlKG9iamVjdCwgbWV0aG9kLCBhcmd1bWVudHMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gaWYgbm8gbWV0aG9kIHdhcyBmb3VuZCwgdHJ5IHRvIGZpbmQgYSBjbG9zdXJlIGRlZmluZWQgYXMgYSBmaWVsZCBvZiB0aGUgY2xhc3MgYW5kIHJ1biBpdAorICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gbnVsbDsKKyAgICAgICAgICAgIGZpbmFsIE1ldGFQcm9wZXJ0eSBtZXRhUHJvcGVydHkgPSB0aGlzLmdldE1ldGFQcm9wZXJ0eSh0aGVDYWNoZWRDbGFzcywgbWV0aG9kTmFtZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgICAgIGlmIChtZXRhUHJvcGVydHkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgdmFsdWUgPSBtZXRhUHJvcGVydHkuZ2V0UHJvcGVydHkob2JqZWN0KTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBNYXApCisgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICgoTWFwKW9iamVjdCkuZ2V0KG1ldGhvZE5hbWUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBDbG9zdXJlKSB7ICAvLyBUaGlzIHRlc3QgZW5zdXJlcyB0aGF0IHZhbHVlICE9IHRoaXMgSWYgeW91IGV2ZXIgY2hhbmdlIHRoaXMgZW5zdXJlIHRoYXQgdmFsdWUgIT0gdGhpcworICAgICAgICAgICAgICAgIENsb3N1cmUgY2xvc3VyZSA9IChDbG9zdXJlKSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBNZXRhQ2xhc3MgZGVsZWdhdGVNZXRhQ2xhc3MgPSBjbG9zdXJlLmdldE1ldGFDbGFzcygpOworICAgICAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZU1ldGFDbGFzcy5pbnZva2VNZXRob2QoY2xvc3VyZS5nZXRDbGFzcygpLCBjbG9zdXJlLCBDTE9TVVJFX0RPX0NBTExfTUVUSE9ELCBvcmlnaW5hbEFyZ3VtZW50cywgZmFsc2UsIGZyb21JbnNpZGVDbGFzcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBpbnZva2VNaXNzaW5nTWV0aG9kKG9iamVjdCwgbWV0aG9kTmFtZSwgb3JpZ2luYWxBcmd1bWVudHMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBNZXRhQ2xhc3MgbG9va3VwT2JqZWN0TWV0YUNsYXNzKE9iamVjdCBvYmplY3QpIHsKKyAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEdyb292eU9iamVjdCkgeworICAgICAgICAgICAgR3Jvb3Z5T2JqZWN0IGdvID0gKEdyb292eU9iamVjdCkgb2JqZWN0OworICAgICAgICAgICAgcmV0dXJuIGdvLmdldE1ldGFDbGFzcygpOworICAgICAgICB9CisgICAgICAgIENsYXNzIG93bmVyQ2xhc3MgPSBvYmplY3QuZ2V0Q2xhc3MoKTsKKyAgICAgICAgaWYgKG93bmVyQ2xhc3MgPT0gQ2xhc3MuY2xhc3MpIG93bmVyQ2xhc3MgPSAoQ2xhc3MpIG9iamVjdDsKKyAgICAgICAgTWV0YUNsYXNzIG1ldGFDbGFzcyA9IHJlZ2lzdHJ5LmdldE1ldGFDbGFzcyhvd25lckNsYXNzKTsKKyAgICAgICAgcmV0dXJuIG1ldGFDbGFzczsKKyAgICB9CisKKyAgICBwcml2YXRlIE9iamVjdCBpbnZva2VNZXRob2RPbkdyb292eU9iamVjdChTdHJpbmcgbWV0aG9kTmFtZSwgT2JqZWN0W10gb3JpZ2luYWxBcmd1bWVudHMsIE9iamVjdCBvd25lcikgeworICAgICAgICBHcm9vdnlPYmplY3QgZ28gPSAoR3Jvb3Z5T2JqZWN0KSBvd25lcjsKKyAgICAgICAgcmV0dXJuIGdvLmludm9rZU1ldGhvZChtZXRob2ROYW1lLCBvcmlnaW5hbEFyZ3VtZW50cyk7CisgICAgfQorCisgICAgcHVibGljIE1ldGFNZXRob2QgZ2V0TWV0aG9kV2l0aENhY2hpbmcoQ2xhc3Mgc2VuZGVyLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3NbXSBhcmd1bWVudHMsIGJvb2xlYW4gaXNDYWxsVG9TdXBlcikgeworICAgICAgICAvLyBsZXRzIHRyeSB1c2UgdGhlIGNhY2hlIHRvIGZpbmQgdGhlIG1ldGhvZAorICAgICAgICBpZiAoR3Jvb3Z5Q2F0ZWdvcnlTdXBwb3J0Lmhhc0NhdGVnb3J5SW5BbnlUaHJlYWQoKSAmJiAhaXNDYWxsVG9TdXBlcikgeworICAgICAgICAgICAgcmV0dXJuIGdldE1ldGhvZFdpdGhvdXRDYWNoaW5nKHNlbmRlciwgbWV0aG9kTmFtZSwgYXJndW1lbnRzLCBpc0NhbGxUb1N1cGVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE1ldGhvZEtleSBtZXRob2RLZXkgPSBuZXcgRGVmYXVsdE1ldGhvZEtleShzZW5kZXIsIG1ldGhvZE5hbWUsIGFyZ3VtZW50cywgaXNDYWxsVG9TdXBlcik7CisgICAgICAgICAgICBNZXRhTWV0aG9kIG1ldGhvZCA9IChNZXRhTWV0aG9kKSBtZXRob2RDYWNoZS5nZXQobWV0aG9kS2V5KTsKKyAgICAgICAgICAgIGlmIChtZXRob2QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1ldGhvZCA9IGdldE1ldGhvZFdpdGhvdXRDYWNoaW5nKHNlbmRlciwgbWV0aG9kTmFtZSwgYXJndW1lbnRzLCBpc0NhbGxUb1N1cGVyKTsKKyAgICAgICAgICAgICAgICBpZiAobWV0aG9kID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9IE5VTExfTUVUSE9EOworICAgICAgICAgICAgICAgIGNhY2hlSW5zdGFuY2VNZXRob2QobWV0aG9kS2V5LCBtZXRob2QpOworICAgICAgICAgICAgICAgIGlmIChtZXRob2QgPT0gTlVMTF9NRVRIT0QpCisgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9IG51bGw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChtZXRob2QgPT0gTlVMTF9NRVRIT0QpCisgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbWV0aG9kOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgY2FjaGVJbnN0YW5jZU1ldGhvZChNZXRob2RLZXkga2V5LCBNZXRhTWV0aG9kIG1ldGhvZCkgeworICAgICAgICBpZiAobWV0aG9kICE9IG51bGwgJiYgbWV0aG9kLmlzQ2FjaGVhYmxlKCkpIHsKKyAgICAgICAgICAgIG1ldGhvZENhY2hlLnB1dChrZXksIG1ldGhvZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBjYWNoZVN0YXRpY01ldGhvZChNZXRob2RLZXkga2V5LCBNZXRhTWV0aG9kIG1ldGhvZCkgeworICAgICAgICBpZiAobWV0aG9kICE9IG51bGwgJiYgbWV0aG9kLmlzQ2FjaGVhYmxlKCkpIHsKKyAgICAgICAgICAgIHN0YXRpY01ldGhvZENhY2hlLnB1dChrZXksIG1ldGhvZCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHB1YmxpYyBDb25zdHJ1Y3RvciByZXRyaWV2ZUNvbnN0cnVjdG9yKENsYXNzW10gYXJndW1lbnRzKSB7CisgICAgICAgIENhY2hlZENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gKENhY2hlZENvbnN0cnVjdG9yKSBjaG9vc2VNZXRob2QoIjxpbml0PiIsIGNvbnN0cnVjdG9ycywgYXJndW1lbnRzLCBmYWxzZSk7CisgICAgICAgIGlmIChjb25zdHJ1Y3RvciAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gY29uc3RydWN0b3IuY2FjaGVkQ29uc3RydWN0b3I7CisgICAgICAgIH0KKyAgICAgICAgY29uc3RydWN0b3IgPSAoQ2FjaGVkQ29uc3RydWN0b3IpIGNob29zZU1ldGhvZCgiPGluaXQ+IiwgY29uc3RydWN0b3JzLCBhcmd1bWVudHMsIHRydWUpOworICAgICAgICBpZiAoY29uc3RydWN0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yLmNhY2hlZENvbnN0cnVjdG9yOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBNZXRhTWV0aG9kIHJldHJpZXZlU3RhdGljTWV0aG9kKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzc1tdIGFyZ3VtZW50cykgeworICAgICAgICBNZXRob2RLZXkgbWV0aG9kS2V5ID0gbmV3IERlZmF1bHRNZXRob2RLZXkodGhlQ2xhc3MsIG1ldGhvZE5hbWUsIGFyZ3VtZW50cywgZmFsc2UpOworICAgICAgICBNZXRhTWV0aG9kIG1ldGhvZCA9IChNZXRhTWV0aG9kKSBzdGF0aWNNZXRob2RDYWNoZS5nZXQobWV0aG9kS2V5KTsKKyAgICAgICAgaWYgKG1ldGhvZCA9PSBudWxsKSB7CisgICAgICAgICAgICBtZXRob2QgPSBwaWNrU3RhdGljTWV0aG9kKG1ldGhvZE5hbWUsIGFyZ3VtZW50cyk7CisgICAgICAgICAgICBjYWNoZVN0YXRpY01ldGhvZChtZXRob2RLZXkuY3JlYXRlQ29weSgpLCBtZXRob2QpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtZXRob2Q7CisgICAgfQorCisgICAgcHVibGljIE1ldGFNZXRob2QgZ2V0TWV0aG9kV2l0aG91dENhY2hpbmcoQ2xhc3Mgc2VuZGVyLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3NbXSBhcmd1bWVudHMsIGJvb2xlYW4gaXNDYWxsVG9TdXBlcikgeworICAgICAgICBNZXRhTWV0aG9kIG1ldGhvZCA9IG51bGw7CisgICAgICAgIE9iamVjdCBtZXRob2RzID0gZ2V0TWV0aG9kcyhzZW5kZXIsIG1ldGhvZE5hbWUsIGlzQ2FsbFRvU3VwZXIpOworICAgICAgICBpZiAobWV0aG9kcyAhPSBudWxsKSB7CisgICAgICAgICAgICBtZXRob2QgPSAoTWV0YU1ldGhvZCkgY2hvb3NlTWV0aG9kKG1ldGhvZE5hbWUsIG1ldGhvZHMsIGFyZ3VtZW50cywgZmFsc2UpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtZXRob2Q7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBpbnZva2VTdGF0aWNNZXRob2QoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1ldGhvZE5hbWUsIE9iamVjdFtdIGFyZ3VtZW50cykgeworICAgICAgICBjaGVja0luaXRhbGlzZWQoKTsKKyAgICAgICAgaWYgKExPRy5pc0xvZ2dhYmxlKExldmVsLkZJTkVSKSkgeworICAgICAgICAgICAgTWV0YUNsYXNzSGVscGVyLmxvZ01ldGhvZENhbGwob2JqZWN0LCBtZXRob2ROYW1lLCBhcmd1bWVudHMpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgQ2xhc3Mgc2VuZGVyID0gb2JqZWN0IGluc3RhbmNlb2YgQ2xhc3MgPyAoQ2xhc3MpIG9iamVjdCA6IG9iamVjdC5nZXRDbGFzcygpOworICAgICAgICBpZiAoc2VuZGVyICE9IHRoZUNsYXNzKSB7CisgICAgICAgICAgICBNZXRhQ2xhc3MgbWMgPSByZWdpc3RyeS5nZXRNZXRhQ2xhc3Moc2VuZGVyKTsKKyAgICAgICAgICAgIHJldHVybiBtYy5pbnZva2VTdGF0aWNNZXRob2Qoc2VuZGVyLCBtZXRob2ROYW1lLCBhcmd1bWVudHMpOworICAgICAgICB9CisgICAgICAgIGlmIChzZW5kZXIgPT0gQ2xhc3MuY2xhc3MpIHsKKyAgICAgICAgICAgIHJldHVybiBpbnZva2VNZXRob2Qob2JqZWN0LCBtZXRob2ROYW1lLCBhcmd1bWVudHMpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGFyZ3VtZW50cyA9PSBudWxsKSBhcmd1bWVudHMgPSBFTVBUWV9BUkdVTUVOVFM7CisgICAgICAgIENsYXNzW10gYXJnQ2xhc3NlcyA9IE1ldGFDbGFzc0hlbHBlci5jb252ZXJ0VG9UeXBlQXJyYXkoYXJndW1lbnRzKTsKKworICAgICAgICBNZXRhTWV0aG9kIG1ldGhvZCA9IHJldHJpZXZlU3RhdGljTWV0aG9kKG1ldGhvZE5hbWUsIGFyZ0NsYXNzZXMpOworICAgICAgICAvLyBsZXRzIHRyeSB1c2UgdGhlIGNhY2hlIHRvIGZpbmQgdGhlIG1ldGhvZAorCisgICAgICAgIGlmIChtZXRob2QgIT0gbnVsbCkgeworICAgICAgICAgICAgdW53cmFwKGFyZ3VtZW50cyk7CisgICAgICAgICAgICByZXR1cm4gTWV0YUNsYXNzSGVscGVyLmRvTWV0aG9kSW52b2tlKG9iamVjdCwgbWV0aG9kLCBhcmd1bWVudHMpOworICAgICAgICB9CisgICAgICAgIE9iamVjdCBwcm9wID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByb3AgPSBnZXRQcm9wZXJ0eSh0aGVDbGFzcywgdGhlQ2xhc3MsIG1ldGhvZE5hbWUsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIH0gY2F0Y2ggKE1pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbiBtcGUpIHsKKyAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHByb3AgaW5zdGFuY2VvZiBDbG9zdXJlKSB7CisgICAgICAgICAgICByZXR1cm4gaW52b2tlU3RhdGljQ2xvc3VyZVByb3BlcnR5KGFyZ3VtZW50cywgcHJvcCk7CisgICAgICAgIH0KKworICAgICAgICBPYmplY3RbXSBvcmlnaW5hbEFyZ3VtZW50cyA9IChPYmplY3RbXSkgYXJndW1lbnRzLmNsb25lKCk7CisgICAgICAgIHVud3JhcChhcmd1bWVudHMpOworCisgICAgICAgIENsYXNzIHN1cGVyQ2xhc3MgPSBzZW5kZXIuZ2V0U3VwZXJjbGFzcygpOworICAgICAgICB3aGlsZSAoc3VwZXJDbGFzcyAhPSBPYmplY3QuY2xhc3MgJiYgc3VwZXJDbGFzcyAhPSBudWxsKSB7CisgICAgICAgICAgICBNZXRhQ2xhc3MgbWMgPSByZWdpc3RyeS5nZXRNZXRhQ2xhc3Moc3VwZXJDbGFzcyk7CisgICAgICAgICAgICBtZXRob2QgPSBtYy5nZXRTdGF0aWNNZXRhTWV0aG9kKG1ldGhvZE5hbWUsIGFyZ0NsYXNzZXMpOworICAgICAgICAgICAgaWYgKG1ldGhvZCAhPSBudWxsKSByZXR1cm4gTWV0YUNsYXNzSGVscGVyLmRvTWV0aG9kSW52b2tlKG9iamVjdCwgbWV0aG9kLCBhcmd1bWVudHMpOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHByb3AgPSBtYy5nZXRQcm9wZXJ0eShzdXBlckNsYXNzLCBzdXBlckNsYXNzLCBtZXRob2ROYW1lLCBmYWxzZSwgZmFsc2UpOworICAgICAgICAgICAgfSBjYXRjaCAoTWlzc2luZ1Byb3BlcnR5RXhjZXB0aW9uIG1wZSkgeworICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocHJvcCBpbnN0YW5jZW9mIENsb3N1cmUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW52b2tlU3RhdGljQ2xvc3VyZVByb3BlcnR5KG9yaWdpbmFsQXJndW1lbnRzLCBwcm9wKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3VwZXJDbGFzcyA9IHN1cGVyQ2xhc3MuZ2V0U3VwZXJjbGFzcygpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGludm9rZVN0YXRpY01pc3NpbmdNZXRob2Qoc2VuZGVyLCBtZXRob2ROYW1lLCBhcmd1bWVudHMpOworICAgIH0KKworICAgIHByaXZhdGUgT2JqZWN0IGludm9rZVN0YXRpY0Nsb3N1cmVQcm9wZXJ0eShPYmplY3RbXSBvcmlnaW5hbEFyZ3VtZW50cywgT2JqZWN0IHByb3ApIHsKKyAgICAgICAgQ2xvc3VyZSBjbG9zdXJlID0gKENsb3N1cmUpIHByb3A7CisgICAgICAgIE1ldGFDbGFzcyBkZWxlZ2F0ZU1ldGFDbGFzcyA9IGNsb3N1cmUuZ2V0TWV0YUNsYXNzKCk7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZU1ldGFDbGFzcy5pbnZva2VNZXRob2QoY2xvc3VyZS5nZXRDbGFzcygpLCBjbG9zdXJlLCBDTE9TVVJFX0RPX0NBTExfTUVUSE9ELCBvcmlnaW5hbEFyZ3VtZW50cywgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIE9iamVjdCBpbnZva2VTdGF0aWNNaXNzaW5nTWV0aG9kKENsYXNzIHNlbmRlciwgU3RyaW5nIG1ldGhvZE5hbWUsIE9iamVjdFtdIGFyZ3VtZW50cykgeworICAgICAgICBNZXRhTWV0aG9kIG1ldGFNZXRob2QgPSBnZXRTdGF0aWNNZXRhTWV0aG9kKFNUQVRJQ19NRVRIT0RfTUlTU0lORywgTUVUSE9EX01JU1NJTkdfQVJHUyk7CisgICAgICAgIGlmIChtZXRhTWV0aG9kICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtZXRhTWV0aG9kLmludm9rZShzZW5kZXIsIG5ldyBPYmplY3RbXXttZXRob2ROYW1lLCBhcmd1bWVudHN9KTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ01ldGhvZEV4Y2VwdGlvbihtZXRob2ROYW1lLCBzZW5kZXIsIGFyZ3VtZW50cywgdHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBNZXRhTWV0aG9kIHBpY2tTdGF0aWNNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzW10gYXJndW1lbnRzKSB7CisgICAgICAgIE1ldGFNZXRob2QgbWV0aG9kID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IG1ldGhvZHMgPSBnZXRTdGF0aWNNZXRob2RzKHRoZUNsYXNzLCBtZXRob2ROYW1lKTsKKworICAgICAgICBpZiAoIShtZXRob2RzIGluc3RhbmNlb2YgRmFzdEFycmF5KSB8fCAhKChGYXN0QXJyYXkpbWV0aG9kcykuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBtZXRob2QgPSAoTWV0YU1ldGhvZCkgY2hvb3NlTWV0aG9kKG1ldGhvZE5hbWUsIG1ldGhvZHMsIGFyZ3VtZW50cywgZmFsc2UpOworICAgICAgICB9CisgICAgICAgIGlmIChtZXRob2QgPT0gbnVsbCAmJiB0aGVDbGFzcyAhPSBDbGFzcy5jbGFzcykgeworICAgICAgICAgICAgTWV0YUNsYXNzIGNsYXNzTWV0YUNsYXNzID0gcmVnaXN0cnkuZ2V0TWV0YUNsYXNzKENsYXNzLmNsYXNzKTsKKyAgICAgICAgICAgIG1ldGhvZCA9IGNsYXNzTWV0YUNsYXNzLnBpY2tNZXRob2QobWV0aG9kTmFtZSwgYXJndW1lbnRzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobWV0aG9kID09IG51bGwpIHsKKyAgICAgICAgICAgIG1ldGhvZCA9IChNZXRhTWV0aG9kKSBjaG9vc2VNZXRob2QobWV0aG9kTmFtZSwgbWV0aG9kcywgTWV0YUNsYXNzSGVscGVyLmNvbnZlcnRUb1R5cGVBcnJheShhcmd1bWVudHMpLCB0cnVlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbWV0aG9kOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdhcm5pbmcsIHRoaXMgbWV0aG9kIHdpbGwgYmUgcmVtb3ZlZAorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgdXNlIGludm9rZUNvbnN0cnVjdG9yIGluc3RlYWQKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGludm9rZUNvbnN0cnVjdG9yQXQoQ2xhc3MgYXQsIE9iamVjdFtdIGFyZ3VtZW50cykgeworICAgICAgICByZXR1cm4gaW52b2tlQ29uc3RydWN0b3IoYXJndW1lbnRzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGludm9rZUNvbnN0cnVjdG9yKE9iamVjdFtdIGFyZ3VtZW50cykgeworICAgICAgICByZXR1cm4gaW52b2tlQ29uc3RydWN0b3IodGhlQ2xhc3MsIGFyZ3VtZW50cyk7CisgICAgfQorCisgICAgcHVibGljIGludCBzZWxlY3RDb25zdHJ1Y3RvckFuZFRyYW5zZm9ybUFyZ3VtZW50cyhpbnQgbnVtYmVyT2ZDb3NudHJ1Y3RvcnMsIE9iamVjdFtdIGFyZ3VtZW50cykgeworICAgICAgICAvL1RPRE86IHRoYXQgaXMganVzdCBhIHF1aWNrIHByb3RvdHlwZSwgbm90IHRoZSByZWFsIHRoaW5nIQorICAgICAgICBpZiAobnVtYmVyT2ZDb3NudHJ1Y3RvcnMgIT0gY29uc3RydWN0b3JzLnNpemUoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEluY29tcGF0aWJsZUNsYXNzQ2hhbmdlRXJyb3IoInRoZSBudW1iZXIgb2YgY29uc3RydWN0b3JzIGR1cmluZyBydW50aW1lIGFuZCBjb21waWxlIHRpbWUgZm9yICIgKworICAgICAgICAgICAgICAgICAgICB0aGlzLnRoZUNsYXNzLmdldE5hbWUoKSArICIgZG8gbm90IG1hdGNoLiBFeHBlY3RlZCAiICsgbnVtYmVyT2ZDb3NudHJ1Y3RvcnMgKyAiIGJ1dCBnb3QgIiArIGNvbnN0cnVjdG9ycy5zaXplKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGFyZ3VtZW50cyA9PSBudWxsKSBhcmd1bWVudHMgPSBFTVBUWV9BUkdVTUVOVFM7CisgICAgICAgIENsYXNzW10gYXJnQ2xhc3NlcyA9IE1ldGFDbGFzc0hlbHBlci5jb252ZXJ0VG9UeXBlQXJyYXkoYXJndW1lbnRzKTsKKyAgICAgICAgdW53cmFwKGFyZ3VtZW50cyk7CisgICAgICAgIENhY2hlZENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gKENhY2hlZENvbnN0cnVjdG9yKSBjaG9vc2VNZXRob2QoIjxpbml0PiIsIGNvbnN0cnVjdG9ycywgYXJnQ2xhc3NlcywgZmFsc2UpOworICAgICAgICBpZiAoY29uc3RydWN0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgY29uc3RydWN0b3IgPSAoQ2FjaGVkQ29uc3RydWN0b3IpIGNob29zZU1ldGhvZCgiPGluaXQ+IiwgY29uc3RydWN0b3JzLCBhcmdDbGFzc2VzLCB0cnVlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29uc3RydWN0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEdyb292eVJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZmluZCBtYXRjaGluZyBjb25zdHJ1Y3RvciBmb3I6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRoZUNsYXNzLmdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIigiICsgSW52b2tlckhlbHBlci50b1R5cGVTdHJpbmcoYXJndW1lbnRzKSArICIpIik7CisgICAgICAgIH0KKyAgICAgICAgTGlzdCBsID0gbmV3IEFycmF5TGlzdChjb25zdHJ1Y3RvcnMudG9MaXN0KCkpOworICAgICAgICBDb21wYXJhdG9yIGNvbXAgPSBuZXcgQ29tcGFyYXRvcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgICAgICAgICBDYWNoZWRDb25zdHJ1Y3RvciBjMCA9IChDYWNoZWRDb25zdHJ1Y3RvcikgYXJnMDsKKyAgICAgICAgICAgICAgICBDYWNoZWRDb25zdHJ1Y3RvciBjMSA9IChDYWNoZWRDb25zdHJ1Y3RvcikgYXJnMTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZGVzY3JpcHRvcjAgPSBCeXRlY29kZUhlbHBlci5nZXRNZXRob2REZXNjcmlwdG9yKFZvaWQuVFlQRSwgYzAuZ2V0TmF0aXZlUGFyYW1ldGVyVHlwZXMoKSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGRlc2NyaXB0b3IxID0gQnl0ZWNvZGVIZWxwZXIuZ2V0TWV0aG9kRGVzY3JpcHRvcihWb2lkLlRZUEUsIGMxLmdldE5hdGl2ZVBhcmFtZXRlclR5cGVzKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdG9yMC5jb21wYXJlVG8oZGVzY3JpcHRvcjEpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGwsIGNvbXApOworICAgICAgICBpbnQgZm91bmQgPSAtMTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAobC5nZXQoaSkgIT0gY29uc3RydWN0b3IpIGNvbnRpbnVlOworICAgICAgICAgICAgZm91bmQgPSBpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLy8gTk9URTogbXVzdCBiZSBjaGFuZ2VkIHRvICIxIHwiIGlmIGNvbnN0cnVjdG9yIHdhcyB2YXJncworICAgICAgICByZXR1cm4gMCB8IChmb3VuZCA8PCA4KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjaGVja3MgaWYgdGhlIGluaXRpYWxpc2F0aW9uIG9mIHRoZSBjbGFzcyBpZCBjb21wbGV0ZS4KKyAgICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGFzIGEgZm9ybSBvZiBhc3NlcnQsIGl0IGlzIG5vCisgICAgICogd2F5IHRvIHRlc3QgaWYgdGhlcmUgaXMgc3RpbGwgaW5pdGlhbGlzYXRpb24gd29yayB0byBiZSBkb25lLgorICAgICAqIFN1Y2ggbG9naWMgbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiBhIGRpZmZlcmVudCB3YXkuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgaW5pdGlhbGlzYXRpb24gaXMgaW5jb21wbGV0ZSB5ZXQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja0luaXRhbGlzZWQoKSB7CisgICAgICAgIGlmICghaXNJbml0aWFsaXplZCgpKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgImluaXRpYWxpemUgbXVzdCBiZSBjYWxsZWQgZm9yIG1ldGEgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsYXNzIG9mICIgKyB0aGVDbGFzcyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIigiICsgdGhpcy5nZXRDbGFzcygpICsgIikgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvIGNvbXBsZXRlIGluaXRpYWxpc2F0aW9uIHByb2Nlc3MgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlZm9yZSBhbnkgaW52b2NhdGlvbiBvciBmaWVsZC9wcm9wZXJ0eSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWNjZXNzIGNhbiBiZSBkb25lIik7CisgICAgfQorCisgICAgcHJpdmF0ZSBPYmplY3QgaW52b2tlQ29uc3RydWN0b3IoQ2xhc3MgYXQsIE9iamVjdFtdIGFyZ3VtZW50cykgeworICAgICAgICBjaGVja0luaXRhbGlzZWQoKTsKKyAgICAgICAgaWYgKGFyZ3VtZW50cyA9PSBudWxsKSBhcmd1bWVudHMgPSBFTVBUWV9BUkdVTUVOVFM7CisgICAgICAgIENsYXNzW10gYXJnQ2xhc3NlcyA9IE1ldGFDbGFzc0hlbHBlci5jb252ZXJ0VG9UeXBlQXJyYXkoYXJndW1lbnRzKTsKKyAgICAgICAgdW53cmFwKGFyZ3VtZW50cyk7CisgICAgICAgIENhY2hlZENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gKENhY2hlZENvbnN0cnVjdG9yKSBjaG9vc2VNZXRob2QoIjxpbml0PiIsIGNvbnN0cnVjdG9ycywgYXJnQ2xhc3NlcywgZmFsc2UpOworICAgICAgICBpZiAoY29uc3RydWN0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGRvQ29uc3RydWN0b3JJbnZva2UoYXQsIGNvbnN0cnVjdG9yLCBhcmd1bWVudHMsIHRydWUpOworICAgICAgICB9CisgICAgICAgIGNvbnN0cnVjdG9yID0gKENhY2hlZENvbnN0cnVjdG9yKSBjaG9vc2VNZXRob2QoIjxpbml0PiIsIGNvbnN0cnVjdG9ycywgYXJnQ2xhc3NlcywgdHJ1ZSk7CisgICAgICAgIGlmIChjb25zdHJ1Y3RvciAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZG9Db25zdHJ1Y3Rvckludm9rZShhdCwgY29uc3RydWN0b3IsIGFyZ3VtZW50cywgdHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7CisgICAgICAgICAgICBPYmplY3QgZmlyc3RBcmd1bWVudCA9IGFyZ3VtZW50c1swXTsKKyAgICAgICAgICAgIGlmIChmaXJzdEFyZ3VtZW50IGluc3RhbmNlb2YgTWFwKSB7CisgICAgICAgICAgICAgICAgY29uc3RydWN0b3IgPSAoQ2FjaGVkQ29uc3RydWN0b3IpIGNob29zZU1ldGhvZCgiPGluaXQ+IiwgY29uc3RydWN0b3JzLCBNZXRhQ2xhc3NIZWxwZXIuRU1QVFlfVFlQRV9BUlJBWSwgZmFsc2UpOworICAgICAgICAgICAgICAgIGlmIChjb25zdHJ1Y3RvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIE9iamVjdCBiZWFuID0gZG9Db25zdHJ1Y3Rvckludm9rZShhdCwgY29uc3RydWN0b3IsIE1ldGFDbGFzc0hlbHBlci5FTVBUWV9BUlJBWSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIHNldFByb3BlcnRpZXMoYmVhbiwgKChNYXApIGZpcnN0QXJndW1lbnQpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJlYW47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBHcm9vdnlSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZmluZCBtYXRjaGluZyBjb25zdHJ1Y3RvciBmb3I6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgdGhlQ2xhc3MuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICArICIoIiArIEludm9rZXJIZWxwZXIudG9UeXBlU3RyaW5nKGFyZ3VtZW50cykgKyAiKSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYSBudW1iZXIgb2YgYmVhbiBwcm9wZXJ0aWVzIGZyb20gdGhlIGdpdmVuIE1hcCB3aGVyZSB0aGUga2V5cyBhcmUKKyAgICAgKiB0aGUgU3RyaW5nIG5hbWVzIG9mIHByb3BlcnRpZXMgYW5kIHRoZSB2YWx1ZXMgYXJlIHRoZSB2YWx1ZXMgb2YgdGhlCisgICAgICogcHJvcGVydGllcyB0byBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0aWVzKE9iamVjdCBiZWFuLCBNYXAgbWFwKSB7CisgICAgICAgIGNoZWNrSW5pdGFsaXNlZCgpOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgU3RyaW5nIGtleSA9IGVudHJ5LmdldEtleSgpLnRvU3RyaW5nKCk7CisKKyAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7CisgICAgICAgICAgICBzZXRQcm9wZXJ0eShiZWFuLCBrZXksIHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGdpdmVuIHByb3BlcnR5J3MgdmFsdWUgb24gdGhlIG9iamVjdAorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoQ2xhc3Mgc2VuZGVyLCBPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbmFtZSwgYm9vbGVhbiB1c2VTdXBlciwgYm9vbGVhbiBmcm9tSW5zaWRlQ2xhc3MpIHsKKworICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgLy8gaGFuZGxpbmcgb2Ygc3RhdGljCisgICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBib29sZWFuIGlzU3RhdGljID0gdGhlQ2xhc3MgIT0gQ2xhc3MuY2xhc3MgJiYgb2JqZWN0IGluc3RhbmNlb2YgQ2xhc3M7CisgICAgICAgIGlmIChpc1N0YXRpYyAmJiBvYmplY3QgIT0gdGhlQ2xhc3MpIHsKKyAgICAgICAgICAgIE1ldGFDbGFzcyBtYyA9IHJlZ2lzdHJ5LmdldE1ldGFDbGFzcygoQ2xhc3MpIG9iamVjdCk7CisgICAgICAgICAgICByZXR1cm4gbWMuZ2V0UHJvcGVydHkoc2VuZGVyLCBvYmplY3QsIG5hbWUsIHVzZVN1cGVyLCBmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICBjaGVja0luaXRhbGlzZWQoKTsKKworICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgLy8gdHVybiBnZXRQcm9wZXJ0eSBvbiBhIE1hcCB0byBnZXQgb24gdGhlIE1hcCBpdHNlbGYKKyAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIGlmICghaXNTdGF0aWMgJiYgdGhpcy5pc01hcCkgeworICAgICAgICAgICAgcmV0dXJuICgoTWFwKSBvYmplY3QpLmdldChuYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIE1ldGFNZXRob2QgbWV0aG9kID0gbnVsbDsKKyAgICAgICAgT2JqZWN0W10gYXJndW1lbnRzID0gRU1QVFlfQVJHVU1FTlRTOworCisgICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAvLyBnZXR0ZXIKKyAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIE1ldGFQcm9wZXJ0eSBtcCA9IGdldE1ldGFQcm9wZXJ0eShSZWZsZWN0aW9uQ2FjaGUuZ2V0Q2FjaGVkQ2xhc3Moc2VuZGVyKSwgbmFtZSwgdXNlU3VwZXIsIGlzU3RhdGljKTsKKyAgICAgICAgaWYgKG1wICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChtcCBpbnN0YW5jZW9mIE1ldGFCZWFuUHJvcGVydHkpIHsKKyAgICAgICAgICAgICAgICBNZXRhQmVhblByb3BlcnR5IG1icCA9IChNZXRhQmVhblByb3BlcnR5KSBtcDsKKyAgICAgICAgICAgICAgICBtZXRob2QgPSBtYnAuZ2V0R2V0dGVyKCk7CisgICAgICAgICAgICAgICAgbXAgPSBtYnAuZ2V0RmllbGQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGNoZWNrIGZvciBhIGNhdGVnb3J5IG1ldGhvZCBuYW1lZCBsaWtlIGEgZ2V0dGVyCisgICAgICAgIGlmICghdXNlU3VwZXIgJiYgIWlzU3RhdGljICYmIEdyb292eUNhdGVnb3J5U3VwcG9ydC5oYXNDYXRlZ29yeUluQW55VGhyZWFkKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBnZXR0ZXJOYW1lID0gImdldCIgKyBNZXRhQ2xhc3NIZWxwZXIuY2FwaXRhbGl6ZShuYW1lKTsKKyAgICAgICAgICAgIE1ldGFNZXRob2QgY2F0ZWdvcnlNZXRob2QgPSBnZXRDYXRlZ29yeU1ldGhvZEdldHRlcihzZW5kZXIsIGdldHRlck5hbWUsIGZhbHNlKTsKKyAgICAgICAgICAgIGlmIChjYXRlZ29yeU1ldGhvZCAhPSBudWxsKSBtZXRob2QgPSBjYXRlZ29yeU1ldGhvZDsKKyAgICAgICAgfQorCisgICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAvLyBmaWVsZAorICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgaWYgKG1ldGhvZCA9PSBudWxsICYmIG1wICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1wLmdldFByb3BlcnR5KG9iamVjdCk7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIGNhbid0IGFjY2VzcyB0aGUgZmllbGQgZGlyZWN0bHkgYnV0IHRoZXJlIG1heSBiZSBhIGdldHRlcgorICAgICAgICAgICAgICAgIG1wID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAvLyBnZW5lcmljIGdldCBtZXRob2QKKyAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIC8vIGNoZWNrIGZvciBhIGdlbmVyaWMgZ2V0IG1ldGhvZCBwcm92aWRlZCB0aHJvdWdoIGEgY2F0ZWdvcnkKKyAgICAgICAgaWYgKG1ldGhvZCA9PSBudWxsICYmICF1c2VTdXBlciAmJiAhaXNTdGF0aWMgJiYgR3Jvb3Z5Q2F0ZWdvcnlTdXBwb3J0Lmhhc0NhdGVnb3J5SW5BbnlUaHJlYWQoKSkgeworICAgICAgICAgICAgbWV0aG9kID0gZ2V0Q2F0ZWdvcnlNZXRob2RHZXR0ZXIoc2VuZGVyLCAiZ2V0IiwgdHJ1ZSk7CisgICAgICAgICAgICBpZiAobWV0aG9kICE9IG51bGwpIGFyZ3VtZW50cyA9IG5ldyBPYmplY3RbXXtuYW1lfTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRoZSBnZW5lcmljIG1ldGhvZCBpcyB2YWxpZCwgaWYgYXZhaWxhYmxlICghPW51bGwpLCBpZiBzdGF0aWMgb3IKKyAgICAgICAgLy8gaWYgaXQgaXMgbm90IHN0YXRpYyBhbmQgd2UgZG8gbm8gc3RhdGljIGFjY2VzcworICAgICAgICBpZiAobWV0aG9kID09IG51bGwgJiYgZ2VuZXJpY0dldE1ldGhvZCAhPSBudWxsICYmICEoIWdlbmVyaWNHZXRNZXRob2QuaXNTdGF0aWMoKSAmJiBpc1N0YXRpYykpIHsKKyAgICAgICAgICAgIGFyZ3VtZW50cyA9IG5ldyBPYmplY3RbXXtuYW1lfTsKKyAgICAgICAgICAgIG1ldGhvZCA9IGdlbmVyaWNHZXRNZXRob2Q7CisgICAgICAgIH0KKworICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgLy8gc3BlY2lhbCBjYXNlcworICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgaWYgKG1ldGhvZCA9PSBudWxsKSB7CisgICAgICAgICAgICAvKiogdG9kbyB0aGVzZSBzcGVjaWFsIGNhc2VzIHNob3VsZCBiZSBzcGVjaWFsIE1ldGFDbGFzc2VzIG1heWJlICovCisgICAgICAgICAgICBpZiAodGhlQ2xhc3MgIT0gQ2xhc3MuY2xhc3MgJiYgb2JqZWN0IGluc3RhbmNlb2YgQ2xhc3MpIHsKKyAgICAgICAgICAgICAgICBNZXRhQ2xhc3MgbWMgPSByZWdpc3RyeS5nZXRNZXRhQ2xhc3MoQ2xhc3MuY2xhc3MpOworICAgICAgICAgICAgICAgIHJldHVybiBtYy5nZXRQcm9wZXJ0eShDbGFzcy5jbGFzcywgb2JqZWN0LCBuYW1lLCB1c2VTdXBlciwgZmFsc2UpOworICAgICAgICAgICAgfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIERlZmF1bHRHcm9vdnlNZXRob2RzLmdldEF0KChDb2xsZWN0aW9uKSBvYmplY3QsIG5hbWUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBPYmplY3RbXSkgeworICAgICAgICAgICAgICAgIHJldHVybiBEZWZhdWx0R3Jvb3Z5TWV0aG9kcy5nZXRBdChBcnJheXMuYXNMaXN0KChPYmplY3RbXSkgb2JqZWN0KSwgbmFtZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIE1ldGFNZXRob2QgYWRkTGlzdGVuZXJNZXRob2QgPSAoTWV0YU1ldGhvZCkgbGlzdGVuZXJzLmdldChuYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoYWRkTGlzdGVuZXJNZXRob2QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvL1RPRE86IG9uZSBkYXkgd2UgY291bGQgdHJ5IHJldHVybiB0aGUgcHJldmlvdXNseSByZWdpc3RlcmVkIENsb3N1cmUgbGlzdGVuZXIgZm9yIGVhc3kgcmVtb3ZhbAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgLy8gZXhlY3V0aW5nIHRoZSBnZXR0ZXIgbWV0aG9kCisgICAgICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIHJldHVybiBNZXRhQ2xhc3NIZWxwZXIuZG9NZXRob2RJbnZva2Uob2JqZWN0LCBtZXRob2QsIGFyZ3VtZW50cyk7CisgICAgICAgIH0KKworICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgLy8gZXJyb3IgZHVlIHRvIG1pc3NpbmcgbWV0aG9kL2ZpZWxkCisgICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBpZiAoaXNTdGF0aWMgfHwgb2JqZWN0IGluc3RhbmNlb2YgQ2xhc3MpCisgICAgICAgICAgICByZXR1cm4gaW52b2tlU3RhdGljTWlzc2luZ1Byb3BlcnR5KG9iamVjdCwgbmFtZSwgbnVsbCwgdHJ1ZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBpbnZva2VNaXNzaW5nUHJvcGVydHkob2JqZWN0LCBuYW1lLCBudWxsLCB0cnVlKTsKKyAgICB9CisKKworICAgIHByaXZhdGUgTWV0YU1ldGhvZCBnZXRDYXRlZ29yeU1ldGhvZEdldHRlcihDbGFzcyBzZW5kZXIsIFN0cmluZyBuYW1lLCBib29sZWFuIHVzZUxvbmdWZXJzaW9uKSB7CisgICAgICAgIExpc3QgcG9zc2libGVHZW5lcmljTWV0aG9kcyA9IEdyb292eUNhdGVnb3J5U3VwcG9ydC5nZXRDYXRlZ29yeU1ldGhvZHMoc2VuZGVyLCBuYW1lKTsKKyAgICAgICAgaWYgKHBvc3NpYmxlR2VuZXJpY01ldGhvZHMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gcG9zc2libGVHZW5lcmljTWV0aG9kcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBNZXRhTWV0aG9kIG1tZXRob2QgPSAoTWV0YU1ldGhvZCkgaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgQ2FjaGVkQ2xhc3NbXSBwYXJhbVR5cGVzID0gbW1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOworICAgICAgICAgICAgICAgIGlmICh1c2VMb25nVmVyc2lvbikgeworICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1UeXBlcy5sZW5ndGggPT0gMSAmJiBwYXJhbVR5cGVzWzBdLmdldENhY2hlZENsYXNzKCkgPT0gU3RyaW5nLmNsYXNzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW1ldGhvZDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbVR5cGVzLmxlbmd0aCA9PSAwKSByZXR1cm4gbW1ldGhvZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSBNZXRhTWV0aG9kIGdldENhdGVnb3J5TWV0aG9kU2V0dGVyKENsYXNzIHNlbmRlciwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gdXNlTG9uZ1ZlcnNpb24pIHsKKyAgICAgICAgTGlzdCBwb3NzaWJsZUdlbmVyaWNNZXRob2RzID0gR3Jvb3Z5Q2F0ZWdvcnlTdXBwb3J0LmdldENhdGVnb3J5TWV0aG9kcyhzZW5kZXIsIG5hbWUpOworICAgICAgICBpZiAocG9zc2libGVHZW5lcmljTWV0aG9kcyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwb3NzaWJsZUdlbmVyaWNNZXRob2RzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIE1ldGFNZXRob2QgbW1ldGhvZCA9IChNZXRhTWV0aG9kKSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICBDYWNoZWRDbGFzc1tdIHBhcmFtVHlwZXMgPSBtbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7CisgICAgICAgICAgICAgICAgaWYgKHVzZUxvbmdWZXJzaW9uKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbVR5cGVzLmxlbmd0aCA9PSAyICYmIHBhcmFtVHlwZXNbMF0uZ2V0Q2FjaGVkQ2xhc3MoKSA9PSBTdHJpbmcuY2xhc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtbWV0aG9kOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtVHlwZXMubGVuZ3RoID09IDEpIHJldHVybiBtbWV0aG9kOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYWxsIHRoZSBwcm9wZXJ0aWVzIGRlZmluZWQgZm9yIHRoaXMgdHlwZQorICAgICAqCisgICAgICogQHJldHVybiBhIGxpc3Qgb2YgTWV0YVByb3BlcnR5IG9iamVjdHMKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0aWVzKCkgeworICAgICAgICBjaGVja0luaXRhbGlzZWQoKTsKKyAgICAgICAgU2luZ2xlS2V5SGFzaE1hcCBwcm9wZXJ0eU1hcCA9IGNsYXNzUHJvcGVydHlJbmRleC5nZXROdWxsYWJsZSh0aGVDYWNoZWRDbGFzcyk7CisgICAgICAgIC8vIHNpbXBseSByZXR1cm4gdGhlIHZhbHVlcyBvZiB0aGUgbWV0YXByb3BlcnR5IG1hcCBhcyBhIExpc3QKKyAgICAgICAgTGlzdCByZXQgPSBuZXcgQXJyYXlMaXN0KHByb3BlcnR5TWFwLnNpemUoKSk7CisgICAgICAgIGZvciAoQ29tcGxleEtleUhhc2hNYXAuRW50cnlJdGVyYXRvciBpdGVyID0gcHJvcGVydHlNYXAuZ2V0RW50cnlTZXRJdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIE1ldGFQcm9wZXJ0eSBlbGVtZW50ID0gKE1ldGFQcm9wZXJ0eSkgKChTaW5nbGVLZXlIYXNoTWFwLkVudHJ5KSBpdGVyLm5leHQoKSkudmFsdWU7CisgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGFGaWVsZFByb3BlcnR5KSBjb250aW51ZTsKKyAgICAgICAgICAgIC8vIGZpbHRlciBvdXQgREdNIGJlYW5zCisgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGFCZWFuUHJvcGVydHkpIHsKKyAgICAgICAgICAgICAgICBNZXRhQmVhblByb3BlcnR5IG1wID0gKE1ldGFCZWFuUHJvcGVydHkpIGVsZW1lbnQ7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXR0ZXIgPSB0cnVlOworICAgICAgICAgICAgICAgIGJvb2xlYW4gZ2V0dGVyID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpZiAobXAuZ2V0R2V0dGVyKCkgPT0gbnVsbCB8fCBtcC5nZXRHZXR0ZXIoKSBpbnN0YW5jZW9mIE5ld0luc3RhbmNlTWV0YU1ldGhvZCkgeworICAgICAgICAgICAgICAgICAgICBnZXR0ZXIgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1wLmdldFNldHRlcigpID09IG51bGwgfHwgbXAuZ2V0U2V0dGVyKCkgaW5zdGFuY2VvZiBOZXdJbnN0YW5jZU1ldGFNZXRob2QpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0dGVyID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghc2V0dGVyICYmICFnZXR0ZXIpIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGlmICghc2V0dGVyICYmIG1wLmdldFNldHRlcigpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IG5ldyBNZXRhQmVhblByb3BlcnR5KG1wLmdldE5hbWUoKSwgbXAuZ2V0VHlwZSgpLCBtcC5nZXRHZXR0ZXIoKSwgbnVsbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghZ2V0dGVyICYmIG1wLmdldEdldHRlcigpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IG5ldyBNZXRhQmVhblByb3BlcnR5KG1wLmdldE5hbWUoKSwgbXAuZ2V0VHlwZSgpLCBudWxsLCBtcC5nZXRTZXR0ZXIoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0LmFkZChlbGVtZW50KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHByaXZhdGUgTWV0YU1ldGhvZCBmaW5kUHJvcGVydHlNZXRob2QoT2JqZWN0IG1ldGhvZE9yTGlzdCwgYm9vbGVhbiBpc0dldHRlcikgeworICAgICAgICBpZiAobWV0aG9kT3JMaXN0ID09IG51bGwpCisgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgT2JqZWN0IHJldCA9IG51bGw7CisgICAgICAgIGlmIChtZXRob2RPckxpc3QgaW5zdGFuY2VvZiBNZXRhTWV0aG9kKSB7CisgICAgICAgICAgICBNZXRhTWV0aG9kIGVsZW1lbnQgPSAoTWV0YU1ldGhvZCltZXRob2RPckxpc3Q7CisgICAgICAgICAgICBpZiAoIWlzR2V0dGVyICYmCisgICAgICAgICAgICAgICAgICAgIC8vKGVsZW1lbnQuZ2V0UmV0dXJuVHlwZSgpID09IFZvaWQuY2xhc3MgfHwgZWxlbWVudC5nZXRSZXR1cm5UeXBlKCkgPT0gVm9pZC5UWVBFKSAmJgorICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoID09IDEpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBhZGRFbGVtZW50VG9MaXN0KHJldCwgZWxlbWVudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaXNHZXR0ZXIgJiYKKyAgICAgICAgICAgICAgICAgICAgIShlbGVtZW50LmdldFJldHVyblR5cGUoKSA9PSBWb2lkLmNsYXNzIHx8IGVsZW1lbnQuZ2V0UmV0dXJuVHlwZSgpID09IFZvaWQuVFlQRSkgJiYKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gYWRkRWxlbWVudFRvTGlzdChyZXQsIGVsZW1lbnQpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBGYXN0QXJyYXkgbWV0aG9kcyA9IChGYXN0QXJyYXkpIG1ldGhvZE9yTGlzdDsKKyAgICAgICAgICAgIGZpbmFsIGludCBsZW4gPSBtZXRob2RzLnNpemUoKTsKKyAgICAgICAgICAgIGZpbmFsIE9iamVjdFtdIGRhdGEgPSBtZXRob2RzLmdldEFycmF5KCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSAhPSBsZW47ICsraSkgeworICAgICAgICAgICAgICAgIE1ldGFNZXRob2QgZWxlbWVudCA9IChNZXRhTWV0aG9kKSBkYXRhW2ldOworICAgICAgICAgICAgICAgIGlmICghaXNHZXR0ZXIgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vKGVsZW1lbnQuZ2V0UmV0dXJuVHlwZSgpID09IFZvaWQuY2xhc3MgfHwgZWxlbWVudC5nZXRSZXR1cm5UeXBlKCkgPT0gVm9pZC5UWVBFKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aCA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IGFkZEVsZW1lbnRUb0xpc3QocmV0LCBlbGVtZW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGlzR2V0dGVyICYmCisgICAgICAgICAgICAgICAgICAgICAgICAhKGVsZW1lbnQuZ2V0UmV0dXJuVHlwZSgpID09IFZvaWQuY2xhc3MgfHwgZWxlbWVudC5nZXRSZXR1cm5UeXBlKCkgPT0gVm9pZC5UWVBFKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IGFkZEVsZW1lbnRUb0xpc3QocmV0LCBlbGVtZW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocmV0ID09IG51bGwpIHJldHVybiBudWxsOworICAgICAgICBpZiAocmV0IGluc3RhbmNlb2YgTWV0YU1ldGhvZCkgcmV0dXJuIChNZXRhTWV0aG9kKSByZXQ7CisKKyAgICAgICAgLy8gd2UgZm91bmQgbXVsdGlwbGUgbWF0Y2hpbmcgbWV0aG9kcworICAgICAgICAvLyB0aGlzIGlzIGEgcHJvYmxlbSwgYmVjYXVzZSB3ZSBjYW4gdXNlIG9ubHkgb25lCisgICAgICAgIC8vIGlmIGl0IGlzIGEgZ2V0dGVyLCB0aGVuIHVzZSB0aGUgbW9zdCBnZW5lcmFsIHJldHVybgorICAgICAgICAvLyB0eXBlIHRvIGRlY2lkZSB3aGljaCBtZXRob2QgdG8gdXNlLiBJZiBpdCBpcyBhIHNldHRlcgorICAgICAgICAvLyB3ZSB1c2UgdGhlIHR5cGUgb2YgdGhlIGZpcnN0IHBhcmFtZXRlcgorICAgICAgICBNZXRhTWV0aG9kIG1ldGhvZCA9IG51bGw7CisgICAgICAgIGludCBkaXN0YW5jZSA9IC0xOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKExpc3QpIHJldCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBNZXRhTWV0aG9kIGVsZW1lbnQgPSAoTWV0YU1ldGhvZCkgaXRlci5uZXh0KCk7CisgICAgICAgICAgICBDbGFzcyBjOworICAgICAgICAgICAgaWYgKGlzR2V0dGVyKSB7CisgICAgICAgICAgICAgICAgYyA9IGVsZW1lbnQuZ2V0UmV0dXJuVHlwZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjID0gZWxlbWVudC5nZXRQYXJhbWV0ZXJUeXBlcygpWzBdLmdldENhY2hlZENsYXNzKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgbG9jYWxEaXN0YW5jZSA9IGRpc3RhbmNlVG9PYmplY3QoYyk7CisgICAgICAgICAgICAvL1RPRE86IG1heWJlIGltcGxlbWVudCB0aGUgY2FzZSBsb2NhbERpc3RhbmNlPT1kaXN0YW5jZQorICAgICAgICAgICAgaWYgKGRpc3RhbmNlID09IC0xIHx8IGRpc3RhbmNlID4gbG9jYWxEaXN0YW5jZSkgeworICAgICAgICAgICAgICAgIGRpc3RhbmNlID0gbG9jYWxEaXN0YW5jZTsKKyAgICAgICAgICAgICAgICBtZXRob2QgPSBlbGVtZW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBtZXRob2Q7CisgICAgfQorCisgICAgcHJpdmF0ZSBPYmplY3QgYWRkRWxlbWVudFRvTGlzdChPYmplY3QgcmV0LCBNZXRhTWV0aG9kIGVsZW1lbnQpIHsKKyAgICAgICAgaWYgKHJldCA9PSBudWxsKQorICAgICAgICAgICAgcmV0ID0gZWxlbWVudDsKKyAgICAgICAgZWxzZSBpZiAocmV0IGluc3RhbmNlb2YgTGlzdCkKKyAgICAgICAgICAgICgoTGlzdCkgcmV0KS5hZGQoZWxlbWVudCk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgTGlzdCBsaXN0ID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICAgICAgICAgIGxpc3QuYWRkKHJldCk7CisgICAgICAgICAgICBsaXN0LmFkZChlbGVtZW50KTsKKyAgICAgICAgICAgIHJldCA9IGxpc3Q7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgZGlzdGFuY2VUb09iamVjdChDbGFzcyBjKSB7CisgICAgICAgIGludCBjb3VudDsKKyAgICAgICAgZm9yIChjb3VudCA9IDA7IGMgIT0gbnVsbDsgY291bnQrKykgeworICAgICAgICAgICAgYyA9IGMuZ2V0U3VwZXJjbGFzcygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjb3VudDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoaXMgd2lsbCBidWlsZCB1cCB0aGUgcHJvcGVydHkgbWFwIChNYXAgb2YgTWV0YVByb3BlcnR5IG9iamVjdHMsIGtleWVkIG9uCisgICAgICogcHJvcGVydHkgbmFtZSkuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldHVwUHJvcGVydGllcyhQcm9wZXJ0eURlc2NyaXB0b3JbXSBwcm9wZXJ0eURlc2NyaXB0b3JzKSB7CisgICAgICAgIGlmICh0aGVDYWNoZWRDbGFzcy5pc0ludGVyZmFjZSkgeworICAgICAgICAgICAgTGlua2VkTGlzdCBzdXBlckNsYXNzZXMgPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICAgICAgc3VwZXJDbGFzc2VzLmFkZChSZWZsZWN0aW9uQ2FjaGUuT0JKRUNUX0NMQVNTKTsKKyAgICAgICAgICAgIFNldCBpbnRlcmZhY2VzID0gdGhlQ2FjaGVkQ2xhc3MuZ2V0SW50ZXJmYWNlcygpOworCisgICAgICAgICAgICBjbGFzc1Byb3BlcnR5SW5kZXhGb3JTdXBlciA9IGNsYXNzUHJvcGVydHlJbmRleDsKKyAgICAgICAgICAgIGZpbmFsIFNpbmdsZUtleUhhc2hNYXAgY1BJID0gY2xhc3NQcm9wZXJ0eUluZGV4LmdldE5vdE51bGwodGhlQ2FjaGVkQ2xhc3MpOworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpbnRlcmZhY2VJdGVyID0gaW50ZXJmYWNlcy5pdGVyYXRvcigpOyBpbnRlcmZhY2VJdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBDYWNoZWRDbGFzcyBpY2xhc3MgPSAoQ2FjaGVkQ2xhc3MpIGludGVyZmFjZUl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIFNpbmdsZUtleUhhc2hNYXAgaVByb3BlcnR5SW5kZXggPSBjUEk7CisgICAgICAgICAgICAgICAgYWRkRmllbGRzKGljbGFzcywgaVByb3BlcnR5SW5kZXgpOworICAgICAgICAgICAgICAgIGNsYXNzUHJvcGVydHlJbmRleC5wdXQoaWNsYXNzLCBpUHJvcGVydHlJbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjbGFzc1Byb3BlcnR5SW5kZXgucHV0KFJlZmxlY3Rpb25DYWNoZS5PQkpFQ1RfQ0xBU1MsIGNQSSk7CisKKyAgICAgICAgICAgIGFwcGx5UHJvcGVydHlEZXNjcmlwdG9ycyhwcm9wZXJ0eURlc2NyaXB0b3JzKTsKKyAgICAgICAgICAgIGFwcGx5U3RyYXlQcm9wZXJ0eU1ldGhvZHMoc3VwZXJDbGFzc2VzLCBjbGFzc1Byb3BlcnR5SW5kZXgsIHRydWUpOworCisgICAgICAgICAgICBtYWtlU3RhdGljUHJvcGVydHlJbmRleCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTGlua2VkTGlzdCBzdXBlckNsYXNzZXMgPSBnZXRTdXBlckNsYXNzZXMoKTsKKyAgICAgICAgICAgIFNldCBpbnRlcmZhY2VzID0gdGhlQ2FjaGVkQ2xhc3MuZ2V0SW50ZXJmYWNlcygpOworCisgICAgICAgICAgICAvLyBpZiB0aGlzIGFuIEFycmF5LCB0aGVuIGFkZCB0aGUgc3BlY2lhbCByZWFkLW9ubHkgImxlbmd0aCIgcHJvcGVydHkKKyAgICAgICAgICAgIGlmICh0aGVDYWNoZWRDbGFzcy5pc0FycmF5KSB7CisgICAgICAgICAgICAgICAgU2luZ2xlS2V5SGFzaE1hcCBtYXAgPSBuZXcgU2luZ2xlS2V5SGFzaE1hcCgpOworICAgICAgICAgICAgICAgIG1hcC5wdXQoImxlbmd0aCIsIGFycmF5TGVuZ3RoUHJvcGVydHkpOworICAgICAgICAgICAgICAgIGNsYXNzUHJvcGVydHlJbmRleC5wdXQodGhlQ2FjaGVkQ2xhc3MsIG1hcCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGluaGVyaXRTdGF0aWNJbnRlcmZhY2VGaWVsZHMoc3VwZXJDbGFzc2VzLCBpbnRlcmZhY2VzKTsKKyAgICAgICAgICAgIGluaGVyaXRGaWVsZHMoc3VwZXJDbGFzc2VzKTsKKworICAgICAgICAgICAgYXBwbHlQcm9wZXJ0eURlc2NyaXB0b3JzKHByb3BlcnR5RGVzY3JpcHRvcnMpOworCisgICAgICAgICAgICBhcHBseVN0cmF5UHJvcGVydHlNZXRob2RzKHN1cGVyQ2xhc3NlcywgY2xhc3NQcm9wZXJ0eUluZGV4LCB0cnVlKTsKKyAgICAgICAgICAgIGFwcGx5U3RyYXlQcm9wZXJ0eU1ldGhvZHMoc3VwZXJDbGFzc2VzLCBjbGFzc1Byb3BlcnR5SW5kZXhGb3JTdXBlciwgZmFsc2UpOworCisgICAgICAgICAgICBjb3B5Q2xhc3NQcm9wZXJ0eUluZGV4Rm9yU3VwZXIoY2xhc3NQcm9wZXJ0eUluZGV4Rm9yU3VwZXIpOworICAgICAgICAgICAgbWFrZVN0YXRpY1Byb3BlcnR5SW5kZXgoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBtYWtlU3RhdGljUHJvcGVydHlJbmRleCgpIHsKKyAgICAgICAgU2luZ2xlS2V5SGFzaE1hcCBwcm9wZXJ0eU1hcCA9IGNsYXNzUHJvcGVydHlJbmRleC5nZXROb3ROdWxsKHRoZUNhY2hlZENsYXNzKTsKKyAgICAgICAgZm9yIChDb21wbGV4S2V5SGFzaE1hcC5FbnRyeUl0ZXJhdG9yIGl0ZXIgPSBwcm9wZXJ0eU1hcC5nZXRFbnRyeVNldEl0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgU2luZ2xlS2V5SGFzaE1hcC5FbnRyeSBlbnRyeSA9ICgoU2luZ2xlS2V5SGFzaE1hcC5FbnRyeSkgaXRlci5uZXh0KCkpOworCisgICAgICAgICAgICBNZXRhUHJvcGVydHkgbXAgPSAoTWV0YVByb3BlcnR5KSBlbnRyeS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgaWYgKG1wIGluc3RhbmNlb2YgTWV0YUZpZWxkUHJvcGVydHkpIHsKKyAgICAgICAgICAgICAgICBNZXRhRmllbGRQcm9wZXJ0eSBtZnAgPSAoTWV0YUZpZWxkUHJvcGVydHkpIG1wOworICAgICAgICAgICAgICAgIGlmICghbWZwLmlzU3RhdGljKCkpIGNvbnRpbnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChtcCBpbnN0YW5jZW9mIE1ldGFCZWFuUHJvcGVydHkpIHsKKyAgICAgICAgICAgICAgICBNZXRhUHJvcGVydHkgcmVzdWx0ID0gZXN0YWJsaXNoU3RhdGljTWV0YVByb3BlcnR5KG1wKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtcCA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBpZ25vcmUgYWxsIG90aGVyIHR5cGVzCisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0aWNQcm9wZXJ0eUluZGV4LnB1dChlbnRyeS5nZXRLZXkoKSwgbXApOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwcml2YXRlIE1ldGFQcm9wZXJ0eSBlc3RhYmxpc2hTdGF0aWNNZXRhUHJvcGVydHkoTWV0YVByb3BlcnR5IG1wKSB7CisgICAgICAgIE1ldGFCZWFuUHJvcGVydHkgbWJwID0gKE1ldGFCZWFuUHJvcGVydHkpIG1wOworICAgICAgICBNZXRhUHJvcGVydHkgcmVzdWx0ID0gbnVsbDsKKyAgICAgICAgZmluYWwgTWV0YU1ldGhvZCBnZXR0ZXJNZXRob2QgPSBtYnAuZ2V0R2V0dGVyKCk7CisgICAgICAgIGZpbmFsIE1ldGFNZXRob2Qgc2V0dGVyTWV0aG9kID0gbWJwLmdldFNldHRlcigpOworICAgICAgICBmaW5hbCBNZXRhRmllbGRQcm9wZXJ0eSBtZXRhRmllbGQgPSBtYnAuZ2V0RmllbGQoKTsKKworICAgICAgICBib29sZWFuIGdldHRlciA9IGdldHRlck1ldGhvZCA9PSBudWxsIHx8IGdldHRlck1ldGhvZC5pc1N0YXRpYygpOworICAgICAgICBib29sZWFuIHNldHRlciA9IHNldHRlck1ldGhvZCA9PSBudWxsIHx8IHNldHRlck1ldGhvZC5pc1N0YXRpYygpOworICAgICAgICBib29sZWFuIGZpZWxkID0gbWV0YUZpZWxkID09IG51bGwgfHwgbWV0YUZpZWxkLmlzU3RhdGljKCk7CisKKyAgICAgICAgaWYgKCFnZXR0ZXIgJiYgIXNldHRlciAmJiAhZmllbGQpIHsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lID0gbWJwLmdldE5hbWUoKTsKKyAgICAgICAgICAgIGZpbmFsIENsYXNzIHByb3BlcnR5VHlwZSA9IG1icC5nZXRUeXBlKCk7CisKKyAgICAgICAgICAgIGlmIChzZXR0ZXIgJiYgZ2V0dGVyKSB7CisgICAgICAgICAgICAgICAgaWYgKGZpZWxkKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG1icDsgLy8gbm90aGluZyB0byBkbworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBNZXRhQmVhblByb3BlcnR5KHByb3BlcnR5TmFtZSwgcHJvcGVydHlUeXBlLCBnZXR0ZXJNZXRob2QsIHNldHRlck1ldGhvZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChnZXR0ZXIgJiYgIXNldHRlcikgeworICAgICAgICAgICAgICAgIGlmIChnZXR0ZXJNZXRob2QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBtZXRhRmllbGQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgTWV0YUJlYW5Qcm9wZXJ0eSBuZXdtcCA9IG5ldyBNZXRhQmVhblByb3BlcnR5KHByb3BlcnR5TmFtZSwgcHJvcGVydHlUeXBlLCBnZXR0ZXJNZXRob2QsIG51bGwpOworICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQpIG5ld21wLnNldEZpZWxkKG1ldGFGaWVsZCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ld21wOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc2V0dGVyICYmICFnZXR0ZXIpIHsKKyAgICAgICAgICAgICAgICBpZiAoc2V0dGVyTWV0aG9kID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbWV0YUZpZWxkOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIE1ldGFCZWFuUHJvcGVydHkgbmV3bXAgPSBuZXcgTWV0YUJlYW5Qcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VHlwZSwgbnVsbCwgc2V0dGVyTWV0aG9kKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkKSBuZXdtcC5zZXRGaWVsZChtZXRhRmllbGQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXdtcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBtZXRhRmllbGQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY29weUNsYXNzUHJvcGVydHlJbmRleEZvclN1cGVyKEluZGV4IGRlc3QpIHsKKyAgICAgICAgZm9yIChDb21wbGV4S2V5SGFzaE1hcC5FbnRyeUl0ZXJhdG9yIGl0ZXIgPSBjbGFzc1Byb3BlcnR5SW5kZXguZ2V0RW50cnlTZXRJdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIFNpbmdsZUtleUhhc2hNYXAuRW50cnkgZW50cnkgPSAoU2luZ2xlS2V5SGFzaE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7CisgICAgICAgICAgICBTaW5nbGVLZXlIYXNoTWFwIG5ld1ZhbCA9IG5ldyBTaW5nbGVLZXlIYXNoTWFwKCk7CisgICAgICAgICAgICBkZXN0LnB1dCgoQ2FjaGVkQ2xhc3MpIGVudHJ5LmdldEtleSgpLCBuZXdWYWwpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaGVyaXRTdGF0aWNJbnRlcmZhY2VGaWVsZHMoTGlua2VkTGlzdCBzdXBlckNsYXNzZXMsIFNldCBpbnRlcmZhY2VzKSB7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaW50ZXJmYWNlSXRlciA9IGludGVyZmFjZXMuaXRlcmF0b3IoKTsgaW50ZXJmYWNlSXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBDYWNoZWRDbGFzcyBpY2xhc3MgPSAoQ2FjaGVkQ2xhc3MpIGludGVyZmFjZUl0ZXIubmV4dCgpOworICAgICAgICAgICAgU2luZ2xlS2V5SGFzaE1hcCBpUHJvcGVydHlJbmRleCA9IGNsYXNzUHJvcGVydHlJbmRleC5nZXROb3ROdWxsKGljbGFzcyk7CisgICAgICAgICAgICBhZGRGaWVsZHMoaWNsYXNzLCBpUHJvcGVydHlJbmRleCk7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGNsYXNzSXRlciA9IHN1cGVyQ2xhc3Nlcy5pdGVyYXRvcigpOyBjbGFzc0l0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIENhY2hlZENsYXNzIHNjbGFzcyA9IChDYWNoZWRDbGFzcykgY2xhc3NJdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoIWljbGFzcy5nZXRDYWNoZWRDbGFzcygpLmlzQXNzaWduYWJsZUZyb20oc2NsYXNzLmdldENhY2hlZENsYXNzKCkpKSBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBTaW5nbGVLZXlIYXNoTWFwIHNQcm9wZXJ0eUluZGV4ID0gY2xhc3NQcm9wZXJ0eUluZGV4LmdldE5vdE51bGwoc2NsYXNzKTsKKyAgICAgICAgICAgICAgICBjb3B5Tm9uUHJpdmF0ZUZpZWxkcyhpUHJvcGVydHlJbmRleCwgc1Byb3BlcnR5SW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaGVyaXRGaWVsZHMoTGlua2VkTGlzdCBzdXBlckNsYXNzZXMpIHsKKyAgICAgICAgU2luZ2xlS2V5SGFzaE1hcCBsYXN0ID0gbnVsbDsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gc3VwZXJDbGFzc2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgQ2FjaGVkQ2xhc3Mga2xhc3MgPSAoQ2FjaGVkQ2xhc3MpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgU2luZ2xlS2V5SGFzaE1hcCBwcm9wZXJ0eUluZGV4ID0gY2xhc3NQcm9wZXJ0eUluZGV4LmdldE5vdE51bGwoa2xhc3MpOworICAgICAgICAgICAgaWYgKGxhc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNvcHlOb25Qcml2YXRlRmllbGRzKGxhc3QsIHByb3BlcnR5SW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGFzdCA9IHByb3BlcnR5SW5kZXg7CisgICAgICAgICAgICBhZGRGaWVsZHMoa2xhc3MsIHByb3BlcnR5SW5kZXgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFkZEZpZWxkcyhmaW5hbCBDYWNoZWRDbGFzcyBrbGFzcywgU2luZ2xlS2V5SGFzaE1hcCBwcm9wZXJ0eUluZGV4KSB7CisgICAgICAgIENhY2hlZEZpZWxkW10gZmllbGRzID0ga2xhc3MuZ2V0RmllbGRzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBNZXRhRmllbGRQcm9wZXJ0eSBtZnAgPSBNZXRhRmllbGRQcm9wZXJ0eS5jcmVhdGUoZmllbGRzW2ldKTsKKyAgICAgICAgICAgIHByb3BlcnR5SW5kZXgucHV0KGZpZWxkc1tpXS5nZXROYW1lKCksIG1mcCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY29weU5vblByaXZhdGVGaWVsZHMoU2luZ2xlS2V5SGFzaE1hcCBmcm9tLCBTaW5nbGVLZXlIYXNoTWFwIHRvKSB7CisgICAgICAgIGZvciAoQ29tcGxleEtleUhhc2hNYXAuRW50cnlJdGVyYXRvciBpdGVyID0gZnJvbS5nZXRFbnRyeVNldEl0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgU2luZ2xlS2V5SGFzaE1hcC5FbnRyeSBlbnRyeSA9IChTaW5nbGVLZXlIYXNoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIE1ldGFGaWVsZFByb3BlcnR5IG1mcCA9IChNZXRhRmllbGRQcm9wZXJ0eSkgZW50cnkuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgIGlmICghTW9kaWZpZXIuaXNQdWJsaWMobWZwLmdldE1vZGlmaWVycygpKSAmJiAhTW9kaWZpZXIuaXNQcm90ZWN0ZWQobWZwLmdldE1vZGlmaWVycygpKSkgY29udGludWU7CisgICAgICAgICAgICB0by5wdXQoZW50cnkuZ2V0S2V5KCksIG1mcCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXBwbHlTdHJheVByb3BlcnR5TWV0aG9kcyhMaW5rZWRMaXN0IHN1cGVyQ2xhc3NlcywgSW5kZXggY2xhc3NQcm9wZXJ0eUluZGV4LCBib29sZWFuIGlzVGhpcykgeworICAgICAgICAvLyBub3cgbG9vayBmb3IgYW55IHN0cmF5IGdldHRlcnMgdGhhdCBtYXkgYmUgdXNlZCB0byBkZWZpbmUgYSBwcm9wZXJ0eQorICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzdXBlckNsYXNzZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBDYWNoZWRDbGFzcyBrbGFzcyA9IChDYWNoZWRDbGFzcykgaXRlci5uZXh0KCk7CisgICAgICAgICAgICBNZXRhTWV0aG9kSW5kZXguSGVhZGVyIGhlYWRlciA9IG1ldGFNZXRob2RJbmRleC5nZXRIZWFkZXIoa2xhc3MuZ2V0Q2FjaGVkQ2xhc3MoKSk7CisgICAgICAgICAgICBTaW5nbGVLZXlIYXNoTWFwIHByb3BlcnR5SW5kZXggPSBjbGFzc1Byb3BlcnR5SW5kZXguZ2V0Tm90TnVsbChrbGFzcyk7CisgICAgICAgICAgICBmb3IgKE1ldGFNZXRob2RJbmRleC5FbnRyeSBlID0gaGVhZGVyLmhlYWQ7IGUgIT0gbnVsbDsgZSA9IGUubmV4dENsYXNzRW50cnkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSBlLm5hbWU7CisgICAgICAgICAgICAgICAgLy8gbmFtZSB0b28gc2hvcnQ/CisgICAgICAgICAgICAgICAgaWYgKG1ldGhvZE5hbWUubGVuZ3RoKCkgPCA0KSBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAvLyBwb3NzaWJsZSBnZXR0ZXIvc2V0dGVyPworICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNHZXR0ZXIgPSBtZXRob2ROYW1lLnN0YXJ0c1dpdGgoImdldCIpOworICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNTZXR0ZXIgPSBtZXRob2ROYW1lLnN0YXJ0c1dpdGgoInNldCIpOworICAgICAgICAgICAgICAgIGlmICghaXNHZXR0ZXIgJiYgIWlzU2V0dGVyKSBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIE1ldGFNZXRob2QgcHJvcGVydHlNZXRob2QgPSBmaW5kUHJvcGVydHlNZXRob2QoaXNUaGlzID8gZS5tZXRob2RzIDogZS5tZXRob2RzRm9yU3VwZXIsIGlzR2V0dGVyKTsKKyAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlNZXRob2QgPT0gbnVsbCkgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcE5hbWUgPSBnZXRQcm9wTmFtZShtZXRob2ROYW1lKTsKKyAgICAgICAgICAgICAgICBjcmVhdGVNZXRhQmVhblByb3BlcnR5KHByb3BlcnR5SW5kZXgsIHByb3BOYW1lLCBpc0dldHRlciwgcHJvcGVydHlNZXRob2QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaE1hcCBwcm9wTmFtZXMgPSBuZXcgSGFzaE1hcCgxMDI0KTsKKworICAgIHByaXZhdGUgU3RyaW5nIGdldFByb3BOYW1lKFN0cmluZyBtZXRob2ROYW1lKSB7CisgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgcHJvcE5hbWVzLmdldChtZXRob2ROYW1lKTsKKyAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBuYW1lOworCisgICAgICAgIHN5bmNocm9uaXplZCAocHJvcE5hbWVzKSB7CisgICAgICAgICAgICAvLyBnZXQgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5CisgICAgICAgICAgICBmaW5hbCBpbnQgbGVuID0gbWV0aG9kTmFtZS5sZW5ndGgoKSAtIDM7CisgICAgICAgICAgICBjaGFyW10gcG4gPSBuZXcgY2hhcltsZW5dOworICAgICAgICAgICAgbWV0aG9kTmFtZS5nZXRDaGFycygzLCAzICsgbGVuLCBwbiwgMCk7CisgICAgICAgICAgICBwblswXSA9IENoYXJhY3Rlci50b0xvd2VyQ2FzZShwblswXSk7CisgICAgICAgICAgICBTdHJpbmcgcHJvcE5hbWUgPSBuZXcgU3RyaW5nKHBuKTsKKyAgICAgICAgICAgIHByb3BOYW1lcy5wdXQobWV0aG9kTmFtZSwgcHJvcE5hbWUpOworICAgICAgICAgICAgcmV0dXJuIHByb3BOYW1lOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZU1ldGFCZWFuUHJvcGVydHkoU2luZ2xlS2V5SGFzaE1hcCBwcm9wZXJ0eUluZGV4LCBTdHJpbmcgcHJvcE5hbWUsIGJvb2xlYW4gaXNHZXR0ZXIsIE1ldGFNZXRob2QgcHJvcGVydHlNZXRob2QpIHsKKyAgICAgICAgLy8gaXMgdGhpcyBwcm9wZXJ0eSBhbHJlYWR5IGFjY291bnRlZCBmb3I/CisgICAgICAgIE1ldGFQcm9wZXJ0eSBtcCA9IChNZXRhUHJvcGVydHkpIHByb3BlcnR5SW5kZXguZ2V0KHByb3BOYW1lKTsKKyAgICAgICAgaWYgKG1wID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChpc0dldHRlcikgeworICAgICAgICAgICAgICAgIG1wID0gbmV3IE1ldGFCZWFuUHJvcGVydHkocHJvcE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU1ldGhvZC5nZXRSZXR1cm5UeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU1ldGhvZCwgbnVsbCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vaXNTZXR0ZXIKKyAgICAgICAgICAgICAgICBtcCA9IG5ldyBNZXRhQmVhblByb3BlcnR5KHByb3BOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlNZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKVswXS5nZXRDYWNoZWRDbGFzcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgcHJvcGVydHlNZXRob2QpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTWV0YUJlYW5Qcm9wZXJ0eSBtYnA7CisgICAgICAgICAgICBNZXRhRmllbGRQcm9wZXJ0eSBtZnA7CisgICAgICAgICAgICBpZiAobXAgaW5zdGFuY2VvZiBNZXRhQmVhblByb3BlcnR5KSB7CisgICAgICAgICAgICAgICAgbWJwID0gKE1ldGFCZWFuUHJvcGVydHkpIG1wOworICAgICAgICAgICAgICAgIG1mcCA9IG1icC5nZXRGaWVsZCgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChtcCBpbnN0YW5jZW9mIE1ldGFGaWVsZFByb3BlcnR5KSB7CisgICAgICAgICAgICAgICAgbWZwID0gKE1ldGFGaWVsZFByb3BlcnR5KSBtcDsKKyAgICAgICAgICAgICAgICBtYnAgPSBuZXcgTWV0YUJlYW5Qcm9wZXJ0eShwcm9wTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1mcC5nZXRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEdyb292eUJ1Z0Vycm9yKCJ1bmtub3duIE1ldGFQcm9wZXJ0eSBjbGFzcyB1c2VkLiBDbGFzcyBpcyAiICsgbXAuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyB3ZSBtYXkgaGF2ZSBhbHJlYWR5IGZvdW5kIG9uZSBmb3IgdGhpcyBuYW1lCisgICAgICAgICAgICBpZiAoaXNHZXR0ZXIgJiYgbWJwLmdldEdldHRlcigpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtYnAuc2V0R2V0dGVyKHByb3BlcnR5TWV0aG9kKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzR2V0dGVyICYmIG1icC5nZXRTZXR0ZXIoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbWJwLnNldFNldHRlcihwcm9wZXJ0eU1ldGhvZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYnAuc2V0RmllbGQobWZwKTsKKyAgICAgICAgICAgIG1wID0gbWJwOworICAgICAgICB9CisgICAgICAgIHByb3BlcnR5SW5kZXgucHV0KHByb3BOYW1lLCBtcCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFwcGx5UHJvcGVydHlEZXNjcmlwdG9ycyhQcm9wZXJ0eURlc2NyaXB0b3JbXSBwcm9wZXJ0eURlc2NyaXB0b3JzKSB7CisgICAgICAgIC8vIG5vdyBpdGVyYXRlIG92ZXIgdGhlIG1hcCBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBhbmQgZ2VuZXJhdGUKKyAgICAgICAgLy8gTWV0YUJlYW5Qcm9wZXJ0eSBvYmplY3RzCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvcGVydHlEZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yIHBkID0gcHJvcGVydHlEZXNjcmlwdG9yc1tpXTsKKworICAgICAgICAgICAgLy8gc2tpcCBpZiB0aGUgcHJvcGVydHkgdHlwZSBpcyB1bmtub3duICh0aGlzIHNlZW1zIHRvIGJlIHRoZSBjYXNlIGlmIHRoZQorICAgICAgICAgICAgLy8gcHJvcGVydHkgZGVzY3JpcHRvciBpcyBiYXNlZCBvbiBhIHNldFgoKSBtZXRob2QgdGhhdCBoYXMgdHdvIHBhcmFtZXRlcnMsCisgICAgICAgICAgICAvLyB3aGljaCBpcyBub3QgYSB2YWxpZCBwcm9wZXJ0eSkKKyAgICAgICAgICAgIGlmIChwZC5nZXRQcm9wZXJ0eVR5cGUoKSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAvLyBnZXQgdGhlIGdldHRlciBtZXRob2QKKyAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSBwZC5nZXRSZWFkTWV0aG9kKCk7CisgICAgICAgICAgICBNZXRhTWV0aG9kIGdldHRlcjsKKyAgICAgICAgICAgIGlmIChtZXRob2QgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBnZXR0ZXIgPSBmaW5kTWV0aG9kKENhY2hlZE1ldGhvZC5maW5kKG1ldGhvZCkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGdldHRlciA9IG51bGw7CisKKyAgICAgICAgICAgIC8vIGdldCB0aGUgc2V0dGVyIG1ldGhvZAorICAgICAgICAgICAgTWV0YU1ldGhvZCBzZXR0ZXI7CisgICAgICAgICAgICBtZXRob2QgPSBwZC5nZXRXcml0ZU1ldGhvZCgpOworICAgICAgICAgICAgaWYgKG1ldGhvZCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHNldHRlciA9IGZpbmRNZXRob2QoQ2FjaGVkTWV0aG9kLmZpbmQobWV0aG9kKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc2V0dGVyID0gbnVsbDsKKworICAgICAgICAgICAgLy8gbm93IGNyZWF0ZSB0aGUgTWV0YVByb3BlcnR5IG9iamVjdAorICAgICAgICAgICAgTWV0YUJlYW5Qcm9wZXJ0eSBtcCA9IG5ldyBNZXRhQmVhblByb3BlcnR5KHBkLmdldE5hbWUoKSwgcGQuZ2V0UHJvcGVydHlUeXBlKCksIGdldHRlciwgc2V0dGVyKTsKKyAgICAgICAgICAgIGFkZE1ldGFCZWFuUHJvcGVydHkobXApOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIG5ldyBNZXRhQmVhblByb3BlcnR5IHRvIHRoaXMgTWV0YUNsYXNzCisgICAgICoKKyAgICAgKiBAcGFyYW0gbXAgVGhlIE1ldGFCZWFuUHJvcGVydHkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRNZXRhQmVhblByb3BlcnR5KE1ldGFCZWFuUHJvcGVydHkgbXApIHsKKworICAgICAgICBNZXRhUHJvcGVydHkgc3RhdGljUHJvcGVydHkgPSBlc3RhYmxpc2hTdGF0aWNNZXRhUHJvcGVydHkobXApOworICAgICAgICBpZiAoc3RhdGljUHJvcGVydHkgIT0gbnVsbCkgeworICAgICAgICAgICAgc3RhdGljUHJvcGVydHlJbmRleC5wdXQobXAuZ2V0TmFtZSgpLCBtcCk7CisgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgIFNpbmdsZUtleUhhc2hNYXAgcHJvcGVydHlNYXAgPSBjbGFzc1Byb3BlcnR5SW5kZXguZ2V0Tm90TnVsbCh0aGVDYWNoZWRDbGFzcyk7CisgICAgICAgICAgICAvL2tlZXAgZmllbGQKKyAgICAgICAgICAgIE1ldGFGaWVsZFByb3BlcnR5IGZpZWxkOworICAgICAgICAgICAgTWV0YVByb3BlcnR5IG9sZCA9IChNZXRhUHJvcGVydHkpIHByb3BlcnR5TWFwLmdldChtcC5nZXROYW1lKCkpOworICAgICAgICAgICAgaWYgKG9sZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKG9sZCBpbnN0YW5jZW9mIE1ldGFCZWFuUHJvcGVydHkpIHsKKyAgICAgICAgICAgICAgICAgICAgZmllbGQgPSAoKE1ldGFCZWFuUHJvcGVydHkpIG9sZCkuZ2V0RmllbGQoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmaWVsZCA9IChNZXRhRmllbGRQcm9wZXJ0eSkgb2xkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtcC5zZXRGaWVsZChmaWVsZCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHB1dCBpdCBpbiB0aGUgbGlzdAorICAgICAgICAgICAgLy8gdGhpcyB3aWxsIG92ZXJ3cml0ZSBhIHBvc3NpYmxlIGZpZWxkIHByb3BlcnR5CisgICAgICAgICAgICBwcm9wZXJ0eU1hcC5wdXQobXAuZ2V0TmFtZSgpLCBtcCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHByb3BlcnR5IHZhbHVlIG9uIGFuIG9iamVjdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KENsYXNzIHNlbmRlciwgT2JqZWN0IG9iamVjdCwgU3RyaW5nIG5hbWUsIE9iamVjdCBuZXdWYWx1ZSwgYm9vbGVhbiB1c2VTdXBlciwgYm9vbGVhbiBmcm9tSW5zaWRlQ2xhc3MpIHsKKyAgICAgICAgY2hlY2tJbml0YWxpc2VkKCk7CisKKyAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIC8vIGhhbmRsaW5nIG9mIHN0YXRpYworICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgYm9vbGVhbiBpc1N0YXRpYyA9IHRoZUNsYXNzICE9IENsYXNzLmNsYXNzICYmIG9iamVjdCBpbnN0YW5jZW9mIENsYXNzOworICAgICAgICBpZiAoaXNTdGF0aWMgJiYgb2JqZWN0ICE9IHRoZUNsYXNzKSB7CisgICAgICAgICAgICBNZXRhQ2xhc3MgbWMgPSByZWdpc3RyeS5nZXRNZXRhQ2xhc3MoKENsYXNzKSBvYmplY3QpOworICAgICAgICAgICAgbWMuZ2V0UHJvcGVydHkoc2VuZGVyLCBvYmplY3QsIG5hbWUsIHVzZVN1cGVyLCBmcm9tSW5zaWRlQ2xhc3MpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIC8vIFVud3JhcCB3cmFwcGVkIHZhbHVlcyBmbyBub3cgLSB0aGUgbmV3IE1PUCB3aWxsIGhhbmRsZSB0aGVtIHByb3Blcmx5CisgICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBpZiAobmV3VmFsdWUgaW5zdGFuY2VvZiBXcmFwcGVyKSBuZXdWYWx1ZSA9ICgoV3JhcHBlcikgbmV3VmFsdWUpLnVud3JhcCgpOworCisgICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAvLyB0dXJuIHNldFByb3BlcnR5IG9uIGEgTWFwIHRvIHB1dCBvbiB0aGUgTWFwIGl0c2VsZgorICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgaWYgKCFpc1N0YXRpYyAmJiB0aGlzLmlzTWFwKSB7CisgICAgICAgICAgICAoKE1hcCkgb2JqZWN0KS5wdXQobmFtZSwgbmV3VmFsdWUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKworICAgICAgICBNZXRhTWV0aG9kIG1ldGhvZCA9IG51bGw7CisgICAgICAgIE9iamVjdFtdIGFyZ3VtZW50cyA9IG51bGw7CisKKyAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIC8vIHNldHRlcgorICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgTWV0YVByb3BlcnR5IG1wID0gZ2V0TWV0YVByb3BlcnR5KFJlZmxlY3Rpb25DYWNoZS5nZXRDYWNoZWRDbGFzcyhzZW5kZXIpLCBuYW1lLCB1c2VTdXBlciwgaXNTdGF0aWMpOworICAgICAgICBNZXRhUHJvcGVydHkgZmllbGQgPSBudWxsOworICAgICAgICBpZiAobXAgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG1wIGluc3RhbmNlb2YgTWV0YUJlYW5Qcm9wZXJ0eSkgeworICAgICAgICAgICAgICAgIE1ldGFCZWFuUHJvcGVydHkgbWJwID0gKE1ldGFCZWFuUHJvcGVydHkpIG1wOworICAgICAgICAgICAgICAgIG1ldGhvZCA9IG1icC5nZXRTZXR0ZXIoKTsKKyAgICAgICAgICAgICAgICBNZXRhUHJvcGVydHkgZiA9IG1icC5nZXRGaWVsZCgpOworICAgICAgICAgICAgICAgIGlmIChtZXRob2QgIT0gbnVsbCB8fCAoZiAhPSBudWxsICYmICFNb2RpZmllci5pc0ZpbmFsKGYuZ2V0TW9kaWZpZXJzKCkpKSkgeworICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHMgPSBuZXcgT2JqZWN0W117bmV3VmFsdWV9OworICAgICAgICAgICAgICAgICAgICBmaWVsZCA9IGY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmaWVsZCA9IG1wOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gY2hlY2sgZm9yIGEgY2F0ZWdvcnkgbWV0aG9kIG5hbWVkIGxpa2UgYSBzZXR0ZXIKKyAgICAgICAgaWYgKCF1c2VTdXBlciAmJiAhaXNTdGF0aWMgJiYgR3Jvb3Z5Q2F0ZWdvcnlTdXBwb3J0Lmhhc0NhdGVnb3J5SW5BbnlUaHJlYWQoKSkgeworICAgICAgICAgICAgU3RyaW5nIGdldHRlck5hbWUgPSAic2V0IiArIE1ldGFDbGFzc0hlbHBlci5jYXBpdGFsaXplKG5hbWUpOworICAgICAgICAgICAgTWV0YU1ldGhvZCBjYXRlZ29yeU1ldGhvZCA9IGdldENhdGVnb3J5TWV0aG9kU2V0dGVyKHNlbmRlciwgZ2V0dGVyTmFtZSwgZmFsc2UpOworICAgICAgICAgICAgaWYgKGNhdGVnb3J5TWV0aG9kICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtZXRob2QgPSBjYXRlZ29yeU1ldGhvZDsKKyAgICAgICAgICAgICAgICBhcmd1bWVudHMgPSBuZXcgT2JqZWN0W117bmV3VmFsdWV9OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIC8vIGxpc3RlbmVyIG1ldGhvZAorICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgYm9vbGVhbiBhbWJpZ291c0xpc3RlbmVyID0gZmFsc2U7CisgICAgICAgIGlmIChtZXRob2QgPT0gbnVsbCkgeworICAgICAgICAgICAgbWV0aG9kID0gKE1ldGFNZXRob2QpIGxpc3RlbmVycy5nZXQobmFtZSk7CisgICAgICAgICAgICBhbWJpZ291c0xpc3RlbmVyID0gbWV0aG9kID09IEFNQklHT1VTX0xJU1RFTkVSX01FVEhPRDsKKyAgICAgICAgICAgIGlmIChtZXRob2QgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICAhYW1iaWdvdXNMaXN0ZW5lciAmJgorICAgICAgICAgICAgICAgICAgICBuZXdWYWx1ZSBpbnN0YW5jZW9mIENsb3N1cmUpIHsKKyAgICAgICAgICAgICAgICAvLyBsZXRzIGNyZWF0ZSBhIGR5bmFtaWMgcHJveHkKKyAgICAgICAgICAgICAgICBPYmplY3QgcHJveHkgPSBQcm94eS5uZXdQcm94eUluc3RhbmNlKAorICAgICAgICAgICAgICAgICAgICAgICAgdGhlQ2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tde21ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpWzBdLmdldENhY2hlZENsYXNzKCl9LAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENvbnZlcnRlZENsb3N1cmUoKENsb3N1cmUpIG5ld1ZhbHVlLCBuYW1lKSk7CisgICAgICAgICAgICAgICAgYXJndW1lbnRzID0gbmV3IE9iamVjdFtde3Byb3h5fTsKKyAgICAgICAgICAgICAgICBuZXdWYWx1ZSA9IHByb3h5OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtZXRob2QgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIC8vIGZpZWxkCisgICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBpZiAobWV0aG9kID09IG51bGwgJiYgZmllbGQgIT0gbnVsbCkgeworICAgICAgICAgICAgZmllbGQuc2V0UHJvcGVydHkob2JqZWN0LCBuZXdWYWx1ZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgLy8gZ2VuZXJpYyBzZXQgbWV0aG9kCisgICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAvLyBjaGVjayBmb3IgYSBnZW5lcmljIGdldCBtZXRob2QgcHJvdmlkZWQgdGhyb3VnaCBhIGNhdGVnb3J5CisgICAgICAgIGlmIChtZXRob2QgPT0gbnVsbCAmJiAhdXNlU3VwZXIgJiYgIWlzU3RhdGljICYmIEdyb292eUNhdGVnb3J5U3VwcG9ydC5oYXNDYXRlZ29yeUluQW55VGhyZWFkKCkpIHsKKyAgICAgICAgICAgIG1ldGhvZCA9IGdldENhdGVnb3J5TWV0aG9kU2V0dGVyKHNlbmRlciwgInNldCIsIHRydWUpOworICAgICAgICAgICAgaWYgKG1ldGhvZCAhPSBudWxsKSBhcmd1bWVudHMgPSBuZXcgT2JqZWN0W117bmFtZSwgbmV3VmFsdWV9OworICAgICAgICB9CisKKyAgICAgICAgLy8gdGhlIGdlbmVyaWMgbWV0aG9kIGlzIHZhbGlkLCBpZiBhdmFpbGFibGUgKCE9bnVsbCksIGlmIHN0YXRpYyBvcgorICAgICAgICAvLyBpZiBpdCBpcyBub3Qgc3RhdGljIGFuZCB3ZSBkbyBubyBzdGF0aWMgYWNjZXNzCisgICAgICAgIGlmIChtZXRob2QgPT0gbnVsbCAmJiBnZW5lcmljU2V0TWV0aG9kICE9IG51bGwgJiYgISghZ2VuZXJpY1NldE1ldGhvZC5pc1N0YXRpYygpICYmIGlzU3RhdGljKSkgeworICAgICAgICAgICAgYXJndW1lbnRzID0gbmV3IE9iamVjdFtde25hbWUsIG5ld1ZhbHVlfTsKKyAgICAgICAgICAgIG1ldGhvZCA9IGdlbmVyaWNTZXRNZXRob2Q7CisgICAgICAgIH0KKworICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgLy8gZXhlY3V0aW5nIHRoZSBnZXR0ZXIgbWV0aG9kCisgICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBpZiAobWV0aG9kICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKKyAgICAgICAgICAgICAgICBuZXdWYWx1ZSA9IERlZmF1bHRUeXBlVHJhbnNmb3JtYXRpb24uY2FzdFRvVHlwZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKClbMF0uZ2V0Q2FjaGVkQ2xhc3MoKSk7CisgICAgICAgICAgICAgICAgYXJndW1lbnRzWzBdID0gbmV3VmFsdWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0gRGVmYXVsdFR5cGVUcmFuc2Zvcm1hdGlvbi5jYXN0VG9UeXBlKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3VmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKVsxXS5nZXRDYWNoZWRDbGFzcygpKTsKKyAgICAgICAgICAgICAgICBhcmd1bWVudHNbMV0gPSBuZXdWYWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE1ldGFDbGFzc0hlbHBlci5kb01ldGhvZEludm9rZShvYmplY3QsIG1ldGhvZCwgYXJndW1lbnRzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAvLyBlcnJvciBkdWUgdG8gbWlzc2luZyBtZXRob2QvZmllbGQKKyAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIGlmIChhbWJpZ291c0xpc3RlbmVyKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbigiVGhlcmUgYXJlIG11bHRpcGxlIGxpc3RlbmVycyBmb3IgdGhlIHByb3BlcnR5ICIgKyBuYW1lICsgIi4gUGxlYXNlIGRvIG5vdCB1c2UgdGhlIGJlYW4gc2hvcnQgZm9ybSB0byBhY2Nlc3MgdGhpcyBsaXN0ZW5lci4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobXAgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJlYWRPbmx5UHJvcGVydHlFeGNlcHRpb24obmFtZSwgdGhlQ2xhc3MpOworICAgICAgICB9CisKKyAgICAgICAgaW52b2tlTWlzc2luZ1Byb3BlcnR5KG9iamVjdCwgbmFtZSwgbmV3VmFsdWUsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIE1ldGFQcm9wZXJ0eSBnZXRNZXRhUHJvcGVydHkoQ2FjaGVkQ2xhc3MgY2xhenosIFN0cmluZyBuYW1lLCBib29sZWFuIHVzZVN1cGVyLCBib29sZWFuIHVzZVN0YXRpYykgeworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgU2luZ2xlS2V5SGFzaE1hcCBwcm9wZXJ0eU1hcDsKKyAgICAgICAgICAgIGlmICh1c2VTdGF0aWMpIHsKKyAgICAgICAgICAgICAgICBwcm9wZXJ0eU1hcCA9IHN0YXRpY1Byb3BlcnR5SW5kZXg7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHVzZVN1cGVyKSB7CisgICAgICAgICAgICAgICAgcHJvcGVydHlNYXAgPSBjbGFzc1Byb3BlcnR5SW5kZXhGb3JTdXBlci5nZXROdWxsYWJsZShjbGF6eik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByb3BlcnR5TWFwID0gY2xhc3NQcm9wZXJ0eUluZGV4LmdldE51bGxhYmxlKGNsYXp6KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwcm9wZXJ0eU1hcCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGNsYXp6ICE9IHRoZUNhY2hlZENsYXNzKSB7CisgICAgICAgICAgICAgICAgICAgIGNsYXp6ID0gdGhlQ2FjaGVkQ2xhc3M7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAoTWV0YVByb3BlcnR5KSBwcm9wZXJ0eU1hcC5nZXQobmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHB1YmxpYyBPYmplY3QgZ2V0QXR0cmlidXRlKENsYXNzIHNlbmRlciwgT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWVzc2FnZU5hbWUsIGJvb2xlYW4gdXNlU3VwZXIpIHsKKyAgICAgICAgcmV0dXJuIGdldEF0dHJpYnV0ZShyZWNlaXZlciwgbWVzc2FnZU5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvb2tzIHVwIHRoZSBnaXZlbiBhdHRyaWJ1dGUgKGZpZWxkKSBvbiB0aGUgZ2l2ZW4gb2JqZWN0CisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGUoQ2xhc3Mgc2VuZGVyLCBPYmplY3Qgb2JqZWN0LCBTdHJpbmcgYXR0cmlidXRlLCBib29sZWFuIHVzZVN1cGVyLCBib29sZWFuIGZyb21JbnNpZGVDbGFzcykgeworICAgICAgICBjaGVja0luaXRhbGlzZWQoKTsKKworICAgICAgICBib29sZWFuIGlzU3RhdGljID0gdGhlQ2xhc3MgIT0gQ2xhc3MuY2xhc3MgJiYgb2JqZWN0IGluc3RhbmNlb2YgQ2xhc3M7CisgICAgICAgIGlmIChpc1N0YXRpYyAmJiBvYmplY3QgIT0gdGhlQ2xhc3MpIHsKKyAgICAgICAgICAgIE1ldGFDbGFzcyBtYyA9IHJlZ2lzdHJ5LmdldE1ldGFDbGFzcygoQ2xhc3MpIG9iamVjdCk7CisgICAgICAgICAgICByZXR1cm4gbWMuZ2V0QXR0cmlidXRlKHNlbmRlciwgb2JqZWN0LCBhdHRyaWJ1dGUsIHVzZVN1cGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIE1ldGFQcm9wZXJ0eSBtcCA9IGdldE1ldGFQcm9wZXJ0eShSZWZsZWN0aW9uQ2FjaGUuZ2V0Q2FjaGVkQ2xhc3Moc2VuZGVyKSwgYXR0cmlidXRlLCB1c2VTdXBlciwgaXNTdGF0aWMpOworCisgICAgICAgIGlmIChtcCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobXAgaW5zdGFuY2VvZiBNZXRhQmVhblByb3BlcnR5KSB7CisgICAgICAgICAgICAgICAgTWV0YUJlYW5Qcm9wZXJ0eSBtYnAgPSAoTWV0YUJlYW5Qcm9wZXJ0eSkgbXA7CisgICAgICAgICAgICAgICAgbXAgPSBtYnAuZ2V0RmllbGQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gZGVsZWdhdGUgdGhlIGdldCBvcGVyYXRpb24gdG8gdGhlIG1ldGFwcm9wZXJ0eQorICAgICAgICAgICAgICAgIGlmIChtcCAhPSBudWxsKSByZXR1cm4gbXAuZ2V0UHJvcGVydHkob2JqZWN0KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEdyb292eVJ1bnRpbWVFeGNlcHRpb24oIkNhbm5vdCByZWFkIGZpZWxkOiAiICsgYXR0cmlidXRlLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRocm93IG5ldyBNaXNzaW5nRmllbGRFeGNlcHRpb24oYXR0cmlidXRlLCB0aGVDbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZ2l2ZW4gYXR0cmlidXRlIChmaWVsZCkgb24gdGhlIGdpdmVuIG9iamVjdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShDbGFzcyBzZW5kZXIsIE9iamVjdCBvYmplY3QsIFN0cmluZyBhdHRyaWJ1dGUsIE9iamVjdCBuZXdWYWx1ZSwgYm9vbGVhbiB1c2VTdXBlciwgYm9vbGVhbiBmcm9tSW5zaWRlQ2xhc3MpIHsKKyAgICAgICAgY2hlY2tJbml0YWxpc2VkKCk7CisKKyAgICAgICAgYm9vbGVhbiBpc1N0YXRpYyA9IHRoZUNsYXNzICE9IENsYXNzLmNsYXNzICYmIG9iamVjdCBpbnN0YW5jZW9mIENsYXNzOworICAgICAgICBpZiAoaXNTdGF0aWMgJiYgb2JqZWN0ICE9IHRoZUNsYXNzKSB7CisgICAgICAgICAgICBNZXRhQ2xhc3MgbWMgPSByZWdpc3RyeS5nZXRNZXRhQ2xhc3MoKENsYXNzKSBvYmplY3QpOworICAgICAgICAgICAgbWMuc2V0QXR0cmlidXRlKHNlbmRlciwgb2JqZWN0LCBhdHRyaWJ1dGUsIG5ld1ZhbHVlLCB1c2VTdXBlciwgZnJvbUluc2lkZUNsYXNzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIE1ldGFQcm9wZXJ0eSBtcCA9IGdldE1ldGFQcm9wZXJ0eShSZWZsZWN0aW9uQ2FjaGUuZ2V0Q2FjaGVkQ2xhc3Moc2VuZGVyKSwgYXR0cmlidXRlLCB1c2VTdXBlciwgaXNTdGF0aWMpOworCisgICAgICAgIGlmIChtcCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobXAgaW5zdGFuY2VvZiBNZXRhQmVhblByb3BlcnR5KSB7CisgICAgICAgICAgICAgICAgTWV0YUJlYW5Qcm9wZXJ0eSBtYnAgPSAoTWV0YUJlYW5Qcm9wZXJ0eSkgbXA7CisgICAgICAgICAgICAgICAgbXAgPSBtYnAuZ2V0RmllbGQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtcCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbXAuc2V0UHJvcGVydHkob2JqZWN0LCBuZXdWYWx1ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdGaWVsZEV4Y2VwdGlvbihhdHRyaWJ1dGUsIHRoZUNsYXNzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3NOb2RlIGdldENsYXNzTm9kZSgpIHsKKyAgICAgICAgaWYgKGNsYXNzTm9kZSA9PSBudWxsICYmIEdyb292eU9iamVjdC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHRoZUNsYXNzKSkgeworICAgICAgICAgICAgLy8gbGV0cyB0cnkgbG9hZCBpdCBmcm9tIHRoZSBjbGFzc3BhdGgKKyAgICAgICAgICAgIFN0cmluZyBncm9vdnlGaWxlID0gdGhlQ2xhc3MuZ2V0TmFtZSgpOworICAgICAgICAgICAgaW50IGlkeCA9IGdyb292eUZpbGUuaW5kZXhPZignJCcpOworICAgICAgICAgICAgaWYgKGlkeCA+IDApIHsKKyAgICAgICAgICAgICAgICBncm9vdnlGaWxlID0gZ3Jvb3Z5RmlsZS5zdWJzdHJpbmcoMCwgaWR4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdyb292eUZpbGUgPSBncm9vdnlGaWxlLnJlcGxhY2UoJy4nLCAnLycpICsgIi5ncm9vdnkiOworCisgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiQXR0ZW1wdGluZyB0byBsb2FkOiAiICsgZ3Jvb3Z5RmlsZSk7CisgICAgICAgICAgICBVUkwgdXJsID0gdGhlQ2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKS5nZXRSZXNvdXJjZShncm9vdnlGaWxlKTsKKyAgICAgICAgICAgIGlmICh1cmwgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHVybCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2UoZ3Jvb3Z5RmlsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodXJsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworCisgICAgICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAgICAgKiB0b2RvIHRoZXJlIGlzIG5vIENvbXBpbGVVbml0IGluIHNjb3BlIHNvIGNsYXNzIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICogY2hlY2tpbmcgd29uJ3Qgd29yayBidXQgdGhhdCBtb3N0bHkgYWZmZWN0cyB0aGUgYnl0ZWNvZGUKKyAgICAgICAgICAgICAgICAgICAgICogZ2VuZXJhdGlvbiByYXRoZXIgdGhhbiB2aWV3aW5nIHRoZSBBU1QKKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIENvbXBpbGF0aW9uVW5pdC5DbGFzc2dlbkNhbGxiYWNrIHNlYXJjaCA9IG5ldyBDb21waWxhdGlvblVuaXQuQ2xhc3NnZW5DYWxsYmFjaygpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNhbGwoQ2xhc3NWaXNpdG9yIHdyaXRlciwgQ2xhc3NOb2RlIG5vZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5nZXROYW1lKCkuZXF1YWxzKHRoZUNsYXNzLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YUNsYXNzSW1wbC50aGlzLmNsYXNzTm9kZSA9IG5vZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzTG9hZGVyIHBhcmVudCA9IHRoZUNsYXNzLmdldENsYXNzTG9hZGVyKCk7CisgICAgICAgICAgICAgICAgICAgIEdyb292eUNsYXNzTG9hZGVyIGdjbCA9IChHcm9vdnlDbGFzc0xvYWRlcikgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEdyb292eUNsYXNzTG9hZGVyKHBhcmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICBDb21waWxhdGlvblVuaXQgdW5pdCA9IG5ldyBDb21waWxhdGlvblVuaXQoKTsKKyAgICAgICAgICAgICAgICAgICAgdW5pdC5zZXRDbGFzc2dlbkNhbGxiYWNrKHNlYXJjaCk7CisgICAgICAgICAgICAgICAgICAgIHVuaXQuYWRkU291cmNlKHVybCk7CisgICAgICAgICAgICAgICAgICAgIHVuaXQuY29tcGlsZShQaGFzZXMuQ0xBU1NfR0VORVJBVElPTik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbigiRXhjZXB0aW9uIHRocm93biBwYXJzaW5nOiAiICsgZ3Jvb3Z5RmlsZSArICIuIFJlYXNvbjogIiArIGUsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIHJldHVybiBjbGFzc05vZGU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCkgKyAiWyIgKyB0aGVDbGFzcyArICJdIjsKKyAgICB9CisKKyAgICAvLyBJbXBsZW1lbnRhdGlvbiBtZXRob2RzCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworICAgIC8qKgorICAgICAqIGFkZHMgYSBNZXRhTWV0aG9kIHRvIHRoaXMgY2xhc3MuIFdBUk5JTkc6IHRoaXMgbWV0aG9kIHdpbGwgbm90CisgICAgICogZG8gdGhlIG5lY2Nlc3Nhcnkgc3RlcHMgZm9yIG11bHRpbWV0aG9kIGxvZ2ljIGFuZCB1c2luZyB0aGlzCisgICAgICogbWV0aG9kIGRvZXNuJ3QgbWVhbiwgdGhhdCBhIG1ldGhvZCBhZGRlZCBoZXJlIGlzIHJlcGxhY2luZyBhbm90aGVyCisgICAgICogbWV0aG9kIGZyb20gYSBwYXJlbnQgY2xhc3MgY29tcGxldGVseS4gVGhlc2Ugc3RlcHMgYXJlIHVzdWFsbHkgZG9uZQorICAgICAqIGJ5IGluaXRhbGl6ZSwgd2hpY2ggbWVhbnMgaWYgeW91IG5lZWQgdGhlc2Ugc3RlcHMsIHlvdSBoYXZlIHRvIGFkZAorICAgICAqIHRoZSBtZXRob2QgYmVmb3JlIHJ1bm5pbmcgaW5pdGlhbGl6ZSB0aGUgZmlyc3QgdGltZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXRob2QgdGhlIE1ldGFNZXRob2QKKyAgICAgKiBAc2VlICNpbml0aWFsaXplKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRNZXRhTWV0aG9kKE1ldGFNZXRob2QgbWV0aG9kKSB7CisgICAgICAgIGlmIChpc0luaXRpYWxpemVkKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJBbHJlYWR5IGluaXRpYWxpemVkLCBjYW5ub3QgYWRkIG5ldyBtZXRob2Q6ICIgKyBtZXRob2QpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgQ2FjaGVkQ2xhc3MgZGVjbGFyaW5nQ2xhc3MgPSBtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKTsKKyAgICAgICAgYWRkTWV0YU1ldGhvZFRvSW5kZXgobWV0aG9kLCBtZXRhTWV0aG9kSW5kZXguZ2V0SGVhZGVyKGRlY2xhcmluZ0NsYXNzLmdldENhY2hlZENsYXNzKCkpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWRkTWV0YU1ldGhvZFRvSW5kZXgoTWV0YU1ldGhvZCBtZXRob2QsIE1ldGFNZXRob2RJbmRleC5IZWFkZXIgaGVhZGVyKSB7CisgICAgICAgIGNoZWNrSWZTdGRNZXRob2QobWV0aG9kKTsKKworICAgICAgICBTdHJpbmcgbmFtZSA9IG1ldGhvZC5nZXROYW1lKCk7CisgICAgICAgIE1ldGFNZXRob2RJbmRleC5FbnRyeSBlID0gbWV0YU1ldGhvZEluZGV4LmdldE9yUHV0TWV0aG9kcyhuYW1lLCBoZWFkZXIpOworICAgICAgICBpZiAobWV0aG9kLmlzU3RhdGljKCkpIHsKKyAgICAgICAgICAgIGUuc3RhdGljTWV0aG9kcyA9IG1ldGFNZXRob2RJbmRleC5hZGRNZXRob2RUb0xpc3QoZS5zdGF0aWNNZXRob2RzLCBtZXRob2QpOworICAgICAgICB9CisgICAgICAgIGUubWV0aG9kcyA9IG1ldGFNZXRob2RJbmRleC5hZGRNZXRob2RUb0xpc3QoZS5tZXRob2RzLCBtZXRob2QpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhZGRNZXRhTWV0aG9kVG9TdXBlckluZGV4KE1ldGFNZXRob2QgbWV0aG9kLCBNZXRhTWV0aG9kSW5kZXguSGVhZGVyIGhlYWRlcikgeworICAgICAgICBjaGVja0lmU3RkTWV0aG9kKG1ldGhvZCk7CisKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBtZXRob2QuZ2V0TmFtZSgpOworICAgICAgICBNZXRhTWV0aG9kSW5kZXguRW50cnkgZSA9IG1ldGFNZXRob2RJbmRleC5nZXRPclB1dE1ldGhvZHMobmFtZSwgaGVhZGVyKTsKKyAgICAgICAgaWYgKG1ldGhvZC5pc1N0YXRpYygpKSB7CisgICAgICAgICAgICBlLnN0YXRpY01ldGhvZHMgPSBtZXRhTWV0aG9kSW5kZXguYWRkTWV0aG9kVG9MaXN0KGUuc3RhdGljTWV0aG9kcywgbWV0aG9kKTsKKyAgICAgICAgfQorICAgICAgICBlLm1ldGhvZHNGb3JTdXBlciA9IG1ldGFNZXRob2RJbmRleC5hZGRNZXRob2RUb0xpc3QoZS5tZXRob2RzRm9yU3VwZXIsIG1ldGhvZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrSWZTdGRNZXRob2QoTWV0YU1ldGhvZCBtZXRob2QpIHsKKyAgICAgICAgaWYgKGlzR2VuZXJpY0dldE1ldGhvZChtZXRob2QpICYmIGdlbmVyaWNHZXRNZXRob2QgPT0gbnVsbCkgeworICAgICAgICAgICAgZ2VuZXJpY0dldE1ldGhvZCA9IG1ldGhvZDsKKyAgICAgICAgfSBlbHNlIGlmIChNZXRhQ2xhc3NIZWxwZXIuaXNHZW5lcmljU2V0TWV0aG9kKG1ldGhvZCkgJiYgZ2VuZXJpY1NldE1ldGhvZCA9PSBudWxsKSB7CisgICAgICAgICAgICBnZW5lcmljU2V0TWV0aG9kID0gbWV0aG9kOworICAgICAgICB9CisgICAgICAgIGlmIChwcm9wZXJ0eU1pc3NpbmdHZXQgPT0gbnVsbCAmJiBtZXRob2QuZ2V0TmFtZSgpLmVxdWFscyhQUk9QRVJUWV9NSVNTSU5HKSkgeworICAgICAgICAgICAgQ2FjaGVkQ2xhc3NbXSBwYXJhbWV0ZXJUeXBlcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOworICAgICAgICAgICAgaWYgKHBhcmFtZXRlclR5cGVzLmxlbmd0aCA9PSAxKSB7CisgICAgICAgICAgICAgICAgcHJvcGVydHlNaXNzaW5nR2V0ID0gbWV0aG9kOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChwcm9wZXJ0eU1pc3NpbmdTZXQgPT0gbnVsbCAmJiBtZXRob2QuZ2V0TmFtZSgpLmVxdWFscyhQUk9QRVJUWV9NSVNTSU5HKSkgeworICAgICAgICAgICAgQ2FjaGVkQ2xhc3NbXSBwYXJhbWV0ZXJUeXBlcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOworICAgICAgICAgICAgaWYgKHBhcmFtZXRlclR5cGVzLmxlbmd0aCA9PSAyKSB7CisgICAgICAgICAgICAgICAgcHJvcGVydHlNaXNzaW5nU2V0ID0gbWV0aG9kOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscyhNRVRIT0RfTUlTU0lORykpIHsKKyAgICAgICAgICAgIENhY2hlZENsYXNzW10gcGFyYW1ldGVyVHlwZXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKKyAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJUeXBlcy5sZW5ndGggPT0gMgorICAgICAgICAgICAgICAgICAgICAmJiBwYXJhbWV0ZXJUeXBlc1swXS5nZXRDYWNoZWRDbGFzcygpID09IFN0cmluZy5jbGFzcworICAgICAgICAgICAgICAgICAgICAmJiBwYXJhbWV0ZXJUeXBlc1sxXS5nZXRDYWNoZWRDbGFzcygpID09IE9iamVjdC5jbGFzcykgeworICAgICAgICAgICAgICAgIG1ldGhvZE1pc3NpbmcgPSBtZXRob2Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0luaXRpYWxpemVkKCkgeworICAgICAgICByZXR1cm4gaW5pdGlhbGl6ZWQ7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIHJldHVybiBmYWxzZTogYWRkIG1ldGhvZAorICAgICAqICAgICAgICBudWxsOiAgaWdub3JlIG1ldGhvZAorICAgICAqICAgICAgICB0cnVlOiAgcmVwbGFjZQorICAgICAqLworICAgIHByaXZhdGUgQm9vbGVhbiBnZXRNYXRjaEtpbmRGb3JDYXRlZ29yeShNZXRhTWV0aG9kIGFNZXRob2QsIE1ldGFNZXRob2QgY2F0ZWdvcnlNZXRob2QpIHsKKyAgICAgICAgQ2FjaGVkQ2xhc3NbXSBwYXJhbXMxID0gYU1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOworICAgICAgICBDYWNoZWRDbGFzc1tdIHBhcmFtczIgPSBjYXRlZ29yeU1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOworICAgICAgICBpZiAocGFyYW1zMS5sZW5ndGggIT0gcGFyYW1zMi5sZW5ndGgpIHJldHVybiBCb29sZWFuLkZBTFNFOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1zMS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKHBhcmFtczFbaV0gIT0gcGFyYW1zMltpXSkgcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIENsYXNzIGFNZXRob2RDbGFzcyA9IGFNZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXRDYWNoZWRDbGFzcygpOworICAgICAgICBDbGFzcyBjYXRlZ29yeU1ldGhvZENsYXNzID0gY2F0ZWdvcnlNZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXRDYWNoZWRDbGFzcygpOworICAgICAgICAKKyAgICAgICAgaWYgKGFNZXRob2RDbGFzcz09Y2F0ZWdvcnlNZXRob2RDbGFzcykgcmV0dXJuIEJvb2xlYW4uVFJVRTsKKyAgICAgICAgYm9vbGVhbiBtYXRjaCA9IGFNZXRob2RDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNhdGVnb3J5TWV0aG9kQ2xhc3MpOworICAgICAgICBpZiAobWF0Y2gpIHJldHVybiBCb29sZWFuLlRSVUU7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBmaWx0ZXJNYXRjaGluZ01ldGhvZEZvckNhdGVnb3J5KEZhc3RBcnJheSBsaXN0LCBNZXRhTWV0aG9kIG1ldGhvZCkgeworICAgICAgICBpbnQgbGVuID0gbGlzdC5zaXplKCk7CisgICAgICAgIGlmIChsZW49PTApIHsKKyAgICAgICAgICAgIGxpc3QuYWRkKG1ldGhvZCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIE9iamVjdCBkYXRhW10gPSBsaXN0LmdldEFycmF5KCk7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqICE9IGxlbjsgKytqKSB7CisgICAgICAgICAgICBNZXRhTWV0aG9kIGFNZXRob2QgPSAoTWV0YU1ldGhvZCkgZGF0YVtqXTsKKyAgICAgICAgICAgIEJvb2xlYW4gbWF0Y2ggPSBnZXRNYXRjaEtpbmRGb3JDYXRlZ29yeShhTWV0aG9kLCBtZXRob2QpOworICAgICAgICAgICAgLy8gdHJ1ZSA9PSByZXBsYWNlCisgICAgICAgICAgICBpZiAobWF0Y2g9PUJvb2xlYW4uVFJVRSkgeworICAgICAgICAgICAgICAgIGxpc3Quc2V0KGosIG1ldGhvZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgLy8gbnVsbCA9PSBpZ25vcmUgKHdlIGhhdmUgYSBiZXR0ZXIgbWV0aG9kIGFscmVhZHkpICAgIAorICAgICAgICAgICAgfSBlbHNlIGlmIChtYXRjaD09bnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyB0aGUgY2FzZXNlIHRydWUgYW5kIG51bGwgZm9yIGEgbWF0Y2ggYXJlIHRocm91Z2gsIHRoZSAKKyAgICAgICAgLy8gcmVtYWluaW5nIGNhc2UgaXMgZmFsc2UgYW5kIHRoYXQgbWVhbnMgYWRkaW5nIHRoZSBtZXRob2QKKyAgICAgICAgLy8gdG8gb3VyIGxpc3QKKyAgICAgICAgbGlzdC5hZGQobWV0aG9kKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBmaW5kTWF0Y2hpbmdNZXRob2QoQ2FjaGVkTWV0aG9kW10gZGF0YSwgaW50IGZyb20sIGludCB0bywgTWV0YU1ldGhvZCBtZXRob2QpIHsKKyAgICAgICAgZm9yIChpbnQgaiA9IGZyb207IGogPD0gdG87ICsraikgeworICAgICAgICAgICAgQ2FjaGVkTWV0aG9kIGFNZXRob2QgPSBkYXRhW2pdOworICAgICAgICAgICAgQ2FjaGVkQ2xhc3NbXSBwYXJhbXMxID0gYU1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOworICAgICAgICAgICAgQ2FjaGVkQ2xhc3NbXSBwYXJhbXMyID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7CisgICAgICAgICAgICBpZiAocGFyYW1zMS5sZW5ndGggPT0gcGFyYW1zMi5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBib29sZWFuIG1hdGNoZXMgPSB0cnVlOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1zMS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1zMVtpXSAhPSBwYXJhbXMyW2ldKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobWF0Y2hlcykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gajsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIG1hdGNoaW5nIG1ldGhvZCB3aGljaCBzaG91bGQgYmUgZm91bmQKKyAgICAgKi8KKyAgICBwcml2YXRlIE1ldGFNZXRob2QgZmluZE1ldGhvZChDYWNoZWRNZXRob2QgYU1ldGhvZCkgeworICAgICAgICBPYmplY3QgbWV0aG9kcyA9IGdldE1ldGhvZHModGhlQ2xhc3MsIGFNZXRob2QuZ2V0TmFtZSgpLCBmYWxzZSk7CisgICAgICAgIGlmIChtZXRob2RzIGluc3RhbmNlb2YgRmFzdEFycmF5KSB7CisgICAgICAgICAgICBGYXN0QXJyYXkgbSAgPSAoRmFzdEFycmF5KSBtZXRob2RzOworICAgICAgICAgICAgZmluYWwgaW50IGxlbiA9IG0uc2l6ZTsKKyAgICAgICAgICAgIGZpbmFsIE9iamVjdCBkYXRhW10gPSBtLmdldEFycmF5KCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSAhPSBsZW47ICsraSkgeworICAgICAgICAgICAgICAgIE1ldGFNZXRob2QgbWV0aG9kID0gKE1ldGFNZXRob2QpIGRhdGFbaV07CisgICAgICAgICAgICAgICAgaWYgKG1ldGhvZC5pc01ldGhvZChhTWV0aG9kLmNhY2hlZE1ldGhvZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBNZXRhTWV0aG9kIG1ldGhvZCA9IChNZXRhTWV0aG9kKSBtZXRob2RzOworICAgICAgICAgICAgaWYgKG1ldGhvZC5pc01ldGhvZChhTWV0aG9kLmNhY2hlZE1ldGhvZCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbWV0aG9kOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vbG9nLndhcm5pbmcoIkNyZWF0aW5nIHJlZmxlY3Rpb24gYmFzZWQgZGlzcGF0Y2hlciBmb3I6ICIgKyBhTWV0aG9kKTsKKyAgICAgICAgc3luY2hyb25pemVkIChhTWV0aG9kLmNhY2hlZENsYXNzKSB7CisgICAgICAgICAgcmV0dXJuIGFNZXRob2QuZ2V0UmVmbGVjdGlvbk1ldGFNZXRob2QoKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGRvQ29uc3RydWN0b3JJbnZva2UoZmluYWwgQ2xhc3MgYXQsIENhY2hlZENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yLCBPYmplY3RbXSBhcmd1bWVudEFycmF5LCBib29sZWFuIHNldEFjY2Vzc2libGUpIHsKKyAgICAgICAgaWYgKExPRy5pc0xvZ2dhYmxlKExldmVsLkZJTkVSKSkgeworICAgICAgICAgICAgTWV0YUNsYXNzSGVscGVyLmxvZ01ldGhvZENhbGwoY29uc3RydWN0b3IuY2FjaGVkQ29uc3RydWN0b3IuZ2V0RGVjbGFyaW5nQ2xhc3MoKSwgY29uc3RydWN0b3IuY2FjaGVkQ29uc3RydWN0b3IuZ2V0TmFtZSgpLCBhcmd1bWVudEFycmF5KTsKKyAgICAgICAgfQorCisvLyAgICAgICBpZiAoc2V0QWNjZXNzaWJsZSkgeworLy8gICAgICAgICAgIC8vIFRvIGZpeCBKSVJBIDQzNQorLy8gICAgICAgICAgIC8vIEV2ZXJ5IGNvbnN0cnVjdG9yIHNob3VsZCBiZSBvcGVuZWQgdG8gdGhlIGFjY2Vzc2libGUgY2xhc3Nlcy4KKy8vICAgICAgICAgICBmaW5hbCBib29sZWFuIGFjY2Vzc2libGUgPSBNZXRhQ2xhc3NIZWxwZXIuYWNjZXNzaWJsZVRvQ29uc3RydWN0b3IoYXQsIGNvbnN0cnVjdG9yKTsKKy8vICAgICAgICAgICBmaW5hbCBDb25zdHJ1Y3RvciBjdG9yID0gY29uc3RydWN0b3I7CisvLyAgICAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7CisvLyAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgeworLy8gICAgICAgICAgICAgICAgICAgY3Rvci5zZXRBY2Nlc3NpYmxlKGFjY2Vzc2libGUpOworLy8gICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisvLyAgICAgICAgICAgICAgIH0KKy8vICAgICAgICAgICB9KTsKKy8vICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE1ldGFDbGFzc0hlbHBlci5kb0NvbnN0cnVjdG9ySW52b2tlKGNvbnN0cnVjdG9yLCBhcmd1bWVudEFycmF5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaG9vc2VzIHRoZSBjb3JyZWN0IG1ldGhvZCB0byB1c2UgZnJvbSBhIGxpc3Qgb2YgbWV0aG9kcyB3aGljaCBtYXRjaCBieQorICAgICAqIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWV0aG9kT3JMaXN0ICAgdGhlIHBvc3NpYmxlIG1ldGhvZHMgdG8gY2hvb3NlIGZyb20KKyAgICAgKiBAcGFyYW0gYXJndW1lbnRzCisgICAgICovCisgICAgcHJpdmF0ZSBPYmplY3QgY2hvb3NlTWV0aG9kKFN0cmluZyBtZXRob2ROYW1lLCBPYmplY3QgbWV0aG9kT3JMaXN0LCBDbGFzc1tdIGFyZ3VtZW50cywgYm9vbGVhbiBjb2VyY2UpIHsKKyAgICAgICAgaWYgKG1ldGhvZE9yTGlzdCBpbnN0YW5jZW9mIE1ldGFNZXRob2QpIHsKKyAgICAgICAgICAgIGlmIChNZXRhQ2xhc3NIZWxwZXIuaXNWYWxpZE1ldGhvZChtZXRob2RPckxpc3QsIGFyZ3VtZW50cywgY29lcmNlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBtZXRob2RPckxpc3Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEZhc3RBcnJheSBtZXRob2RzID0gKEZhc3RBcnJheSkgbWV0aG9kT3JMaXN0OworICAgICAgICBpbnQgbWV0aG9kQ291bnQgPSBtZXRob2RzLnNpemUoKTsKKyAgICAgICAgaWYgKG1ldGhvZENvdW50IDw9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZENvdW50ID09IDEpIHsKKyAgICAgICAgICAgIE9iamVjdCBtZXRob2QgPSBtZXRob2RzLmdldCgwKTsKKyAgICAgICAgICAgIGlmIChNZXRhQ2xhc3NIZWxwZXIuaXNWYWxpZE1ldGhvZChtZXRob2QsIGFyZ3VtZW50cywgY29lcmNlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBtZXRob2Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBPYmplY3QgYW5zd2VyOworICAgICAgICBpZiAoYXJndW1lbnRzID09IG51bGwgfHwgYXJndW1lbnRzLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICBhbnN3ZXIgPSBNZXRhQ2xhc3NIZWxwZXIuY2hvb3NlRW1wdHlNZXRob2RQYXJhbXMobWV0aG9kcyk7CisgICAgICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxICYmIGFyZ3VtZW50c1swXSA9PSBudWxsKSB7CisgICAgICAgICAgICBhbnN3ZXIgPSBNZXRhQ2xhc3NIZWxwZXIuY2hvb3NlTW9zdEdlbmVyYWxNZXRob2RXaXRoMU51bGxQYXJhbShtZXRob2RzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExpc3QgbWF0Y2hpbmdNZXRob2RzID0gbmV3IEFycmF5TGlzdChtZXRob2RzLnNpemUoKSk7CisKKyAgICAgICAgICAgIGZpbmFsIGludCBsZW4gPSBtZXRob2RzLnNpemU7CisgICAgICAgICAgICBPYmplY3QgZGF0YVtdID0gbWV0aG9kcy5nZXRBcnJheSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgIT0gbGVuOyArK2kpIHsKKyAgICAgICAgICAgICAgICBPYmplY3QgbWV0aG9kID0gZGF0YVtpXTsKKworICAgICAgICAgICAgICAgIC8vIG1ha2luZyB0aGlzIGZhbHNlIGhlbHBzIGZpbmQgbWF0Y2hlcworICAgICAgICAgICAgICAgIGlmIChNZXRhQ2xhc3NIZWxwZXIuaXNWYWxpZE1ldGhvZChtZXRob2QsIGFyZ3VtZW50cywgY29lcmNlKSkgeworICAgICAgICAgICAgICAgICAgICBtYXRjaGluZ01ldGhvZHMuYWRkKG1ldGhvZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1hdGNoaW5nTWV0aG9kcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobWF0Y2hpbmdNZXRob2RzLnNpemUoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoaW5nTWV0aG9kcy5nZXQoMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY2hvb3NlTW9zdFNwZWNpZmljUGFyYW1zKG1ldGhvZE5hbWUsIG1hdGNoaW5nTWV0aG9kcywgYXJndW1lbnRzKTsKKworICAgICAgICB9CisgICAgICAgIGlmIChhbnN3ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGFuc3dlcjsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgTWV0aG9kU2VsZWN0aW9uRXhjZXB0aW9uKG1ldGhvZE5hbWUsIG1ldGhvZHMsIGFyZ3VtZW50cyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBPYmplY3QgY2hvb3NlTW9zdFNwZWNpZmljUGFyYW1zKFN0cmluZyBuYW1lLCBMaXN0IG1hdGNoaW5nTWV0aG9kcywgQ2xhc3NbXSBhcmd1bWVudHMpIHsKKworICAgICAgICBsb25nIG1hdGNoZXNEaXN0YW5jZSA9IC0xOworICAgICAgICBMaW5rZWRMaXN0IG1hdGNoZXMgPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtYXRjaGluZ01ldGhvZHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBPYmplY3QgbWV0aG9kID0gaXRlci5uZXh0KCk7CisgICAgICAgICAgICBDbGFzc1tdIHBhcmFtVHlwZXMgPSBNZXRhQ2xhc3NIZWxwZXIuZ2V0UGFyYW1ldGVyVHlwZXMobWV0aG9kKS5nZXROYXRpdmVQYXJhbWV0ZXJUeXBlcygpOworICAgICAgICAgICAgbG9uZyBkaXN0ID0gTWV0YUNsYXNzSGVscGVyLmNhbGN1bGF0ZVBhcmFtZXRlckRpc3RhbmNlKGFyZ3VtZW50cywgcGFyYW1UeXBlcyk7CisgICAgICAgICAgICBpZiAoZGlzdCA9PSAwKSByZXR1cm4gbWV0aG9kOworICAgICAgICAgICAgaWYgKG1hdGNoZXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICBtYXRjaGVzLmFkZChtZXRob2QpOworICAgICAgICAgICAgICAgIG1hdGNoZXNEaXN0YW5jZSA9IGRpc3Q7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGRpc3QgPCBtYXRjaGVzRGlzdGFuY2UpIHsKKyAgICAgICAgICAgICAgICBtYXRjaGVzRGlzdGFuY2UgPSBkaXN0OworICAgICAgICAgICAgICAgIG1hdGNoZXMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtYXRjaGVzLmFkZChtZXRob2QpOworICAgICAgICAgICAgfSBlbHNlIGlmIChkaXN0ID09IG1hdGNoZXNEaXN0YW5jZSkgeworICAgICAgICAgICAgICAgIG1hdGNoZXMuYWRkKG1ldGhvZCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBpZiAobWF0Y2hlcy5zaXplKCkgPT0gMSkgeworICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXMuZ2V0Rmlyc3QoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobWF0Y2hlcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICAvL21vcmUgdGhhbiBvbmUgbWF0Y2hpbmcgbWV0aG9kIGZvdW5kIC0tPiBhbWJpZ291cyEKKyAgICAgICAgU3RyaW5nIG1zZyA9ICJBbWJpZ3VvdXMgbWV0aG9kIG92ZXJsb2FkaW5nIGZvciBtZXRob2QgIjsKKyAgICAgICAgbXNnICs9IHRoZUNsYXNzLmdldE5hbWUoKSArICIjIiArIG5hbWU7CisgICAgICAgIG1zZyArPSAiLlxuQ2Fubm90IHJlc29sdmUgd2hpY2ggbWV0aG9kIHRvIGludm9rZSBmb3IgIjsKKyAgICAgICAgbXNnICs9IEludm9rZXJIZWxwZXIudG9TdHJpbmcoYXJndW1lbnRzKTsKKyAgICAgICAgbXNnICs9ICIgZHVlIHRvIG92ZXJsYXBwaW5nIHByb3RvdHlwZXMgYmV0d2VlbjoiOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtYXRjaGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgQ2xhc3NbXSB0eXBlcyA9IE1ldGFDbGFzc0hlbHBlci5nZXRQYXJhbWV0ZXJUeXBlcyhpdGVyLm5leHQoKSkuZ2V0TmF0aXZlUGFyYW1ldGVyVHlwZXMoKTsKKyAgICAgICAgICAgIG1zZyArPSAiXG5cdCIgKyBJbnZva2VySGVscGVyLnRvU3RyaW5nKHR5cGVzKTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbihtc2cpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc0dlbmVyaWNHZXRNZXRob2QoTWV0YU1ldGhvZCBtZXRob2QpIHsKKyAgICAgICAgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJnZXQiKSkgeworICAgICAgICAgICAgQ2FjaGVkQ2xhc3NbXSBwYXJhbWV0ZXJUeXBlcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOworICAgICAgICAgICAgcmV0dXJuIHBhcmFtZXRlclR5cGVzLmxlbmd0aCA9PSAxICYmIHBhcmFtZXRlclR5cGVzWzBdLmdldENhY2hlZENsYXNzKCkgPT0gU3RyaW5nLmNsYXNzOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBpbml0aWFsaXplKCkgeworICAgICAgICBpZiAoIWlzSW5pdGlhbGl6ZWQoKSkgeworICAgICAgICAgICAgZmlsbE1ldGhvZEluZGV4KCk7CisgICAgICAgICAgICBhZGRQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICBpbml0aWFsaXplZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWRkUHJvcGVydGllcygpIHsKKyAgICAgICAgQmVhbkluZm8gaW5mbzsKKyAgICAgICAgLy8gICAgIGludHJvc3BlY3QKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGluZm8gPSAoQmVhbkluZm8pIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIEludHJvc3BlY3Rpb25FeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICByZXR1cm4gSW50cm9zcGVjdG9yLmdldEJlYW5JbmZvKHRoZUNsYXNzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBwYWUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBHcm9vdnlSdW50aW1lRXhjZXB0aW9uKCJleGNlcHRpb24gd2hpbGUgYmVhbiBpbnRyb3NwZWN0aW9uIiwgcGFlLmdldEV4Y2VwdGlvbigpKTsKKyAgICAgICAgfQorICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IGluZm8uZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpOworICAgICAgICAvLyBidWlsZCB1cCB0aGUgbWV0YXByb3BlcnRpZXMgYmFzZWQgb24gdGhlIHB1YmxpYyBmaWVsZHMsIHByb3BlcnR5IGRlc2NyaXB0b3JzLAorICAgICAgICAvLyBhbmQgdGhlIGdldHRlcnMgYW5kIHNldHRlcnMKKyAgICAgICAgc2V0dXBQcm9wZXJ0aWVzKGRlc2NyaXB0b3JzKTsKKworICAgICAgICBFdmVudFNldERlc2NyaXB0b3JbXSBldmVudERlc2NyaXB0b3JzID0gaW5mby5nZXRFdmVudFNldERlc2NyaXB0b3JzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXZlbnREZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgRXZlbnRTZXREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBldmVudERlc2NyaXB0b3JzW2ldOworICAgICAgICAgICAgTWV0aG9kW10gbGlzdGVuZXJNZXRob2RzID0gZGVzY3JpcHRvci5nZXRMaXN0ZW5lck1ldGhvZHMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbGlzdGVuZXJNZXRob2RzLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgTWV0aG9kIGxpc3RlbmVyTWV0aG9kID0gbGlzdGVuZXJNZXRob2RzW2pdOworICAgICAgICAgICAgICAgIGZpbmFsIFJlZmxlY3Rpb25NZXRhTWV0aG9kIG1ldGFNZXRob2QgPSBuZXcgUmVmbGVjdGlvbk1ldGFNZXRob2QoQ2FjaGVkTWV0aG9kLmZpbmQoZGVzY3JpcHRvci5nZXRBZGRMaXN0ZW5lck1ldGhvZCgpKSk7CisgICAgICAgICAgICAgICAgYWRkVG9BbGxNZXRob2RzSWZQdWJsaWMobWV0YU1ldGhvZCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBsaXN0ZW5lck1ldGhvZC5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVycy5jb250YWluc0tleShuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnMucHV0KG5hbWUsIEFNQklHT1VTX0xJU1RFTkVSX01FVEhPRCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzLnB1dChuYW1lLCBtZXRhTWV0aG9kKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWRkVG9BbGxNZXRob2RzSWZQdWJsaWMoTWV0YU1ldGhvZCBtZXRhTWV0aG9kKSB7CisgICAgICAgIGlmIChNb2RpZmllci5pc1B1YmxpYyhtZXRhTWV0aG9kLmdldE1vZGlmaWVycygpKSkKKyAgICAgICAgICAgIGFsbE1ldGhvZHMuYWRkKG1ldGFNZXRob2QpOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0IGdldE1ldGhvZHMoKSB7CisgICAgICAgIHJldHVybiBhbGxNZXRob2RzOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0IGdldE1ldGFNZXRob2RzKCkgeworICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdChuZXdHcm9vdnlNZXRob2RzU2V0KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBkcm9wU3RhdGljTWV0aG9kQ2FjaGUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IHN0YXRpY01ldGhvZENhY2hlLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIE1ldGhvZEtleSBrID0gKE1ldGhvZEtleSkgaXQubmV4dCgpOworICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKGsuZ2V0TmFtZSgpKSkKKyAgICAgICAgICAgICAgICBpdC5yZW1vdmUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGRyb3BNZXRob2RDYWNoZShTdHJpbmcgbmFtZSkgeworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gbWV0aG9kQ2FjaGUua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgTWV0aG9kS2V5IGsgPSAoTWV0aG9kS2V5KSBpdC5uZXh0KCk7CisgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoay5nZXROYW1lKCkpKQorICAgICAgICAgICAgICAgIGl0LnJlbW92ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBhYnN0cmFjdCBjbGFzcyBNZXRob2RJbmRleEFjdGlvbiB7CisgICAgICAgIHB1YmxpYyB2b2lkIGl0ZXJhdGUoKSB7CisgICAgICAgICAgICBmaW5hbCBDb21wbGV4S2V5SGFzaE1hcC5FbnRyeVtdIHRhYmxlID0gbWV0YU1ldGhvZEluZGV4Lm1ldGhvZEhlYWRlcnMuZ2V0VGFibGUoKTsKKyAgICAgICAgICAgIGludCBsZW4gPSB0YWJsZS5sZW5ndGg7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSAhPSBsZW47ICsraSkgeworICAgICAgICAgICAgICAgIGZvciAoU2luZ2xlS2V5SGFzaE1hcC5FbnRyeSBjbGFzc0VudHJ5ID0gKFNpbmdsZUtleUhhc2hNYXAuRW50cnkpIHRhYmxlW2ldOworICAgICAgICAgICAgICAgICAgICAgY2xhc3NFbnRyeSAhPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgY2xhc3NFbnRyeSA9IChTaW5nbGVLZXlIYXNoTWFwLkVudHJ5KSBjbGFzc0VudHJ5Lm5leHQpIHsKKworICAgICAgICAgICAgICAgICAgICBDbGFzcyBjbGF6eiA9IChDbGFzcykgY2xhc3NFbnRyeS5nZXRLZXkoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoc2tpcENsYXNzKGNsYXp6KSkgY29udGludWU7CisKKyAgICAgICAgICAgICAgICAgICAgTWV0YU1ldGhvZEluZGV4LkhlYWRlciBoZWFkZXIgPSAoTWV0YU1ldGhvZEluZGV4LkhlYWRlcikgY2xhc3NFbnRyeS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICBmb3IgKE1ldGFNZXRob2RJbmRleC5FbnRyeSBuYW1lRW50cnkgPSBoZWFkZXIuaGVhZDsgbmFtZUVudHJ5ICE9IG51bGw7IG5hbWVFbnRyeSA9IG5hbWVFbnRyeS5uZXh0Q2xhc3NFbnRyeSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZUFjdGlvbihjbGF6eiwgbmFtZUVudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIG1ldGhvZE5hbWVBY3Rpb24oQ2xhc3MgY2xhenosIE1ldGFNZXRob2RJbmRleC5FbnRyeSBtZXRob2RzKTsKKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBza2lwQ2xhc3MoQ2xhc3MgY2xhenopIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7CisgICAgICAgIHJldHVybiBnZXRQcm9wZXJ0eSh0aGVDbGFzcywgb2JqZWN0LCBwcm9wZXJ0eSwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHksIE9iamVjdCBuZXdWYWx1ZSkgeworICAgICAgICBzZXRQcm9wZXJ0eSh0aGVDbGFzcywgb2JqZWN0LCBwcm9wZXJ0eSwgbmV3VmFsdWUsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGF0dHJpYnV0ZSkgeworICAgICAgICByZXR1cm4gZ2V0QXR0cmlidXRlKHRoZUNsYXNzLCBvYmplY3QsIGF0dHJpYnV0ZSwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGF0dHJpYnV0ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7CisgICAgICAgIHNldEF0dHJpYnV0ZSh0aGVDbGFzcywgb2JqZWN0LCBhdHRyaWJ1dGUsIG5ld1ZhbHVlLCBmYWxzZSwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBNZXRhTWV0aG9kIHBpY2tNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzW10gYXJndW1lbnRzKSB7CisgICAgICAgIHJldHVybiBnZXRNZXRob2RXaXRob3V0Q2FjaGluZyh0aGVDbGFzcywgbWV0aG9kTmFtZSwgYXJndW1lbnRzLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQgdXNlIHBpY2tNZXRob2QgaW5zdGVhZAorICAgICAqLworICAgIHByb3RlY3RlZCBNZXRhTWV0aG9kIHJldHJpZXZlTWV0aG9kKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzc1tdIGFyZ3VtZW50cykgeworICAgICAgICByZXR1cm4gcGlja01ldGhvZChtZXRob2ROYW1lLCBhcmd1bWVudHMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHJlbW92ZSBhbGwgbWV0aG9kIGNhbGwgY2FjaGUgZW50cmllcy4gVGhpcyBzaG91bGQgYmUgZG9uZSBpZiBhCisgICAgICogbWV0aG9kIGlzIGFkZGVkIGR1cmluZyBydW50aW1lLCBidXQgbm90IGJ5IHVzaW5nIGEgY2F0ZWdvcnkuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY2xlYXJJbnZvY2F0aW9uQ2FjaGVzKCkgeworICAgICAgICBzdGF0aWNNZXRob2RDYWNoZS5jbGVhcigpOworICAgICAgICBtZXRob2RDYWNoZS5jbGVhcigpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNpbmdsZUtleUhhc2hNYXAuQ29waWVyIE5BTUVfSU5ERVhfQ09QSUVSID0gbmV3IFNpbmdsZUtleUhhc2hNYXAuQ29waWVyKCkgeworICAgICAgICBwdWJsaWMgT2JqZWN0IGNvcHkoT2JqZWN0IHZhbHVlKSB7CisgICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGYXN0QXJyYXkpCisgICAgICAgICAgICAgIHJldHVybiAoKEZhc3RBcnJheSkgdmFsdWUpLmNvcHkoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNpbmdsZUtleUhhc2hNYXAuQ29waWVyIE1FVEhPRF9JTkRFWF9DT1BJRVIgPSBuZXcgU2luZ2xlS2V5SGFzaE1hcC5Db3BpZXIoKSB7CisgICAgICAgIHB1YmxpYyBPYmplY3QgY29weShPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgICAgIHJldHVybiBTaW5nbGVLZXlIYXNoTWFwLmNvcHkobmV3IFNpbmdsZUtleUhhc2hNYXAoZmFsc2UpLCAoU2luZ2xlS2V5SGFzaE1hcCkgdmFsdWUsIE5BTUVfSU5ERVhfQ09QSUVSKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBjbGFzcyBNZXRob2RJbmRleCBleHRlbmRzIEluZGV4IHsKKyAgICAgICAgcHVibGljIE1ldGhvZEluZGV4KGJvb2xlYW4gYikgeworICAgICAgICAgICAgc3VwZXIoZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE1ldGhvZEluZGV4KGludCBzaXplKSB7CisgICAgICAgICAgICBzdXBlcihzaXplKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNZXRob2RJbmRleCgpIHsKKyAgICAgICAgICAgIHN1cGVyKCk7CisgICAgICAgIH0KKworICAgICAgICBNZXRob2RJbmRleCBjb3B5KCkgeworICAgICAgICAgICAgcmV0dXJuIChNZXRob2RJbmRleCkgU2luZ2xlS2V5SGFzaE1hcC5jb3B5KG5ldyBNZXRob2RJbmRleChmYWxzZSksIHRoaXMsIE1FVEhPRF9JTkRFWF9DT1BJRVIpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBjbG9uZSgpIHRocm93cyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuY2xvbmUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW5kZXggZXh0ZW5kcyBTaW5nbGVLZXlIYXNoTWFwIHsKKworICAgICAgICBwdWJsaWMgSW5kZXgoaW50IHNpemUpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJbmRleCgpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJbmRleChib29sZWFuIHNpemUpIHsKKyAgICAgICAgICAgIHN1cGVyKGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTaW5nbGVLZXlIYXNoTWFwIGdldE5vdE51bGwoQ2FjaGVkQ2xhc3Mga2V5KSB7CisgICAgICAgICAgICBFbnRyeSByZXMgPSBnZXRPclB1dChrZXkpOworICAgICAgICAgICAgaWYgKHJlcy52YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmVzLnZhbHVlID0gbmV3IFNpbmdsZUtleUhhc2hNYXAoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAoU2luZ2xlS2V5SGFzaE1hcCkgcmVzLnZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcHV0KENhY2hlZENsYXNzIGtleSwgU2luZ2xlS2V5SGFzaE1hcCB2YWx1ZSkgeworICAgICAgICAgICAgKChFbnRyeSkgZ2V0T3JQdXQoa2V5KSkudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTaW5nbGVLZXlIYXNoTWFwIGdldE51bGxhYmxlKENhY2hlZENsYXNzIGNsYXp6KSB7CisgICAgICAgICAgICByZXR1cm4gKFNpbmdsZUtleUhhc2hNYXApIGdldChjbGF6eik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBjaGVja0VxdWFscyhDb21wbGV4S2V5SGFzaE1hcC5FbnRyeSBlLCBPYmplY3Qga2V5KSB7CisgICAgICAgICAgICByZXR1cm4gKChFbnRyeSkgZSkua2V5LmVxdWFscyhrZXkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRHVtbXlNZXRhTWV0aG9kIGV4dGVuZHMgTWV0YU1ldGhvZCB7CisKKyAgICAgICAgcHVibGljIGludCBnZXRNb2RpZmllcnMoKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENsYXNzIGdldFJldHVyblR5cGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDYWNoZWRDbGFzcyBnZXREZWNsYXJpbmdDbGFzcygpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFBhcmFtZXRlclR5cGVzIGdldFBhcmFtVHlwZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgaW52b2tlKE9iamVjdCBvYmplY3QsIE9iamVjdFtdIGFyZ3VtZW50cykgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbGFuZy9NZXRhQ2xhc3NSZWdpc3RyeS5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL01ldGFDbGFzc1JlZ2lzdHJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVhMjg0ZAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbGFuZy9NZXRhQ2xhc3NSZWdpc3RyeS5qYXZhCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgZ3Jvb3Z5Lmxhbmc7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuR2VuZXJhdGVkQ2xvc3VyZTsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUubWV0YWNsYXNzLkNsb3N1cmVNZXRhQ2xhc3M7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKKworLyoqCisgKiBBIE1ldGFDbGFzc1JlZ2lzdHJ5IGlzIGFuIG9iamVjdCB0aGF0IGlzIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyB0aGUgYSBjYWNoZSBvZiBNZXRhQ2xhc3MgaW5zdGFuY2VzLiBFYWNoCisgKiBqYXZhLmxhbmcuQ2xhc3MgaW5zdGFuY2UgaGFzIGFuIGFzc29jaWF0ZWQgTWV0YUNsYXNzIGFuZCBjbGllbnQgY29kZSBjYW4gcXVlcnkgdGhpcyBpbnRlcmZhY2UgZm9yIHRoZSBNZXRhQ2xhc3MgZm9yCisgKiBhIGdpdmVuIGFzc29jaWF0ZWQgamF2YS5sYW5nLkNsYXNzCisgKgorICogQHNlZSBncm9vdnkubGFuZy5NZXRhQ2xhc3MKKyAqCisgKiBAYXV0aG9yIEpvaG4gV2lsc29uCisgKiBAYXV0aG9yIEdyYWVtZSBSb2NoZXIKKyAqCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTWV0YUNsYXNzUmVnaXN0cnkgeworICAgIC8qCisgICAgICogVGhlIG1haW4gZnVuY3Rpb24gb2YgdGhlIFJlZ2lzdHJ5CisgICAgICogSWYgYSBNZXRhY2xhc3MgZXhpc3RzIHRoZW4gcmV0dXJuIGl0CisgICAgICogb3RoZXJ3aXNlIGNyZWF0ZSBvbmUsIHB1dCBpdCBpbiB0aGUgUmVnaXN0cnkgYW5kIHJldHVybiBpdAorICAgICAqLworICAgIE1ldGFDbGFzcyBnZXRNZXRhQ2xhc3MoQ2xhc3MgdGhlQ2xhc3MpOworICAgIAorICAgIC8qCisgICAgICogRG8gd2UgcmVhbGx5IHdhbnQgdGhlc2UgdHdvPworICAgICAqLworICAgIHZvaWQgc2V0TWV0YUNsYXNzKENsYXNzIHRoZUNsYXNzLCBNZXRhQ2xhc3MgdGhlTWV0YUNsYXNzKTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYSBjYWNoZWQgTWV0YUNsYXNzIGZyb20gdGhlIHJlZ2lzdHJ5CisgICAgICogQHBhcmFtIHRoZUNsYXNzIFRoZSBKYXZhIGNsYXNzIG9mIHRoZSBNZXRhQ2xhc3MgdG8gcmVtb3ZlCisgICAgICovCisgICAgdm9pZCByZW1vdmVNZXRhQ2xhc3MoQ2xhc3MgdGhlQ2xhc3MpOworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBNZXRhQ2xhc3NDcmVhdGlvbkhhbmRsZSB0aGF0IGlzIHJlc3BvbnNpYmxlIGZvciBjb25zdHJ1Y3RpbmcgTWV0YUNsYXNzIGluc3RhbmNlcworICAgICAqCisgICAgICogQHJldHVybiBUaGUgTWV0YUNsYXNzQ3JlYXRpb25IYW5kbGUgaW5zdGFuY2UKKyAgICAgKi8KKyAgICBNZXRhQ2xhc3NDcmVhdGlvbkhhbmRsZSBnZXRNZXRhQ2xhc3NDcmVhdGlvbkhhbmRsZXIoKTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIE1ldGFDbGFzc0NyZWF0aW9uSGFuZGxlIGluc3RhbmNlIHRoYXQgaXMgcmVzcG9uc2libGUgZm9yIGNvbnN0cnVjdGluZyBpbnN0YW5jZXMKKyAgICAgKgorICAgICAqIEBwYXJhbSBoYW5kbGUgVGhlIGhhbmRlIGluc3RhbmNlCisgICAgICovCisgICAgdm9pZCBzZXRNZXRhQ2xhc3NDcmVhdGlvbkhhbmRsZShNZXRhQ2xhc3NDcmVhdGlvbkhhbmRsZSBoYW5kbGUpOworCisgICAgLyoqCisgICAgICogQ2xhc3MgdXNlZCBhcyBiYXNlIGZvciB0aGUgY3JlYXRpb24gb2YgTWV0YUNsYXNzIGltcGxlbWVudGF0aW9ucy4KKyAgICAgKiBUaGUgQ2xhc3MgZGVmYXVsdHMgdG8gTWV0YUNsYXNzSW1wbCwgaWYgdGhlIGNsYXNzIGxvYWRpbmcgZmFpbHMgdG8KKyAgICAgKiBmaW5kIGEgc3BlY2lhbCBtZXRhIGNsYXNzLiBUaGUgbmFtZSBmb3Igc3VjaCBhIG1ldGEgY2xhc3Mgd291bGQgYmUKKyAgICAgKiB0aGUgY2xhc3MgbmFtZSBpdCBpcyBjcmVhdGVkIGZvciB3aXRoIHRoZSBwcmVmaXgKKyAgICAgKiAiZ3Jvb3Z5LnJ1bnRpbWUubWV0YWNsYXNzLiIgQnkgcmVwbGFjaW5nIHRoZSBoYW5kbGUgaW4gdGhlIHJlZ2lzdHJ5CisgICAgICogeW91IGNhbiBoYXZlIGFueSBjb250cm9sIG92ZXIgdGhlIGNyZWF0aW9uIG9mIHdoYXQgTWV0YUNsYXNzIGlzIHVzZWQKKyAgICAgKiBmb3IgYSBjbGFzcyB0aGF0IHlvdSB3YW50IHRvIGhhdmUuIAorICAgICAqIFdBUk5JTkc6IGV4cGVyaW1lbnRhbCBjb2RlLCBsaWtlbHkgdG8gY2hhbmdlIHNvb24KKyAgICAgKiBAYXV0aG9yIEpvY2hlbiBUaGVvZG9yb3UKKyAgICAgKi8KKyAgICBjbGFzcyBNZXRhQ2xhc3NDcmVhdGlvbkhhbmRsZSB7CisgICAgICAgIHB1YmxpYyBmaW5hbCBNZXRhQ2xhc3MgY3JlYXRlKENsYXNzIHRoZUNsYXNzLCBNZXRhQ2xhc3NSZWdpc3RyeSByZWdpc3RyeSkgeworCSAgICAgICB0cnkgeworCSAgICAgICAgICAgZmluYWwgQ2xhc3MgY3VzdG9tTWV0YUNsYXNzID0gQ2xhc3MuZm9yTmFtZSgiZ3Jvb3Z5LnJ1bnRpbWUubWV0YWNsYXNzLiIgKyB0aGVDbGFzcy5nZXROYW1lKCkgKyAiTWV0YUNsYXNzIik7CisgICAgICAgICAgICAgICBpZiAoRGVsZWdhdGluZ01ldGFDbGFzcy5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGN1c3RvbU1ldGFDbGFzcykpIHsKKyAgICAgICAgICAgICAgICAgICBmaW5hbCBDb25zdHJ1Y3RvciBjdXN0b21NZXRhQ2xhc3NDb25zdHJ1Y3RvciA9IGN1c3RvbU1ldGFDbGFzcy5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXXtNZXRhQ2xhc3MuY2xhc3N9KTsKKyAgICAgICAgICAgICAgICAgICBNZXRhQ2xhc3Mgbm9ybWFsTWV0YUNsYXNzID0gY3JlYXRlTm9ybWFsTWV0YUNsYXNzKHRoZUNsYXNzLCByZWdpc3RyeSk7CisgICAgICAgICAgICAgICAgICAgcmV0dXJuIChNZXRhQ2xhc3MpY3VzdG9tTWV0YUNsYXNzQ29uc3RydWN0b3IubmV3SW5zdGFuY2UobmV3IE9iamVjdFtde25vcm1hbE1ldGFDbGFzc30pOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgZmluYWwgQ29uc3RydWN0b3IgY3VzdG9tTWV0YUNsYXNzQ29uc3RydWN0b3IgPSBjdXN0b21NZXRhQ2xhc3MuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW117TWV0YUNsYXNzUmVnaXN0cnkuY2xhc3MsIENsYXNzLmNsYXNzfSk7CisgICAgICAgICAgICAgICAgICAgcmV0dXJuIChNZXRhQ2xhc3MpY3VzdG9tTWV0YUNsYXNzQ29uc3RydWN0b3IubmV3SW5zdGFuY2UobmV3IE9iamVjdFtde3JlZ2lzdHJ5LCB0aGVDbGFzc30pOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVOb3JtYWxNZXRhQ2xhc3ModGhlQ2xhc3MsIHJlZ2lzdHJ5KTsKKwkgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsKKwkgICAgICAgICAgIHRocm93IG5ldyBHcm9vdnlSdW50aW1lRXhjZXB0aW9uKCJDb3VsZCBub3QgaW5zdGFudGlhdGUgY3VzdG9tIE1ldGFjbGFzcyBmb3IgY2xhc3M6ICIgKyB0aGVDbGFzcy5nZXROYW1lKCkgKyAiLiBSZWFzb246ICIgKyBlLCBlKTsKKwkgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIE1ldGFDbGFzcyBjcmVhdGVOb3JtYWxNZXRhQ2xhc3MoQ2xhc3MgdGhlQ2xhc3MsTWV0YUNsYXNzUmVnaXN0cnkgcmVnaXN0cnkpIHsKKyAgICAgICAgICAgIGlmIChHZW5lcmF0ZWRDbG9zdXJlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odGhlQ2xhc3MpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDbG9zdXJlTWV0YUNsYXNzKHJlZ2lzdHJ5LHRoZUNsYXNzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNZXRhQ2xhc3NJbXBsKHJlZ2lzdHJ5LCB0aGVDbGFzcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyB9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvTWV0YUV4cGFuZG9Qcm9wZXJ0eS5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL01ldGFFeHBhbmRvUHJvcGVydHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDJjZjlkCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL01ldGFFeHBhbmRvUHJvcGVydHkuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBncm9vdnkubGFuZzsKKworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CisKKy8qKgorICogUmVwcmVzZW50cyBhIHByb3BlcnR5IGluIGFuIEV4cGFuZG8gb2JqZWN0CisgKiAKKyAqIEBhdXRob3IgSm9obiBTdHVtcAorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgTWV0YUV4cGFuZG9Qcm9wZXJ0eSBleHRlbmRzIE1ldGFQcm9wZXJ0eSB7CisKKwlPYmplY3QgdmFsdWUgPSBudWxsOworCQorICAgIHB1YmxpYyBNZXRhRXhwYW5kb1Byb3BlcnR5KEVudHJ5IGVudHJ5KSB7CisJCXN1cGVyKChTdHJpbmcpIGVudHJ5LmdldEtleSgpLCBPYmplY3QuY2xhc3MpOworCQkKKwkJdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHByb3BlcnR5IG9mIHRoZSBnaXZlbiBvYmplY3QKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpZiB0aGUgcHJvcGVydHkgY291bGQgbm90IGJlIGV2YWx1YXRlZAorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gdmFsdWU7CisJfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgcHJvcGVydHkgb24gdGhlIGdpdmVuIG9iamVjdCB0byB0aGUgbmV3IHZhbHVlCisgICAgICogCisgICAgICogQHBhcmFtIG9iamVjdCBvbiB3aGljaCB0byBzZXQgdGhlIHByb3BlcnR5CisgICAgICogQHBhcmFtIG5ld1ZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlIHByb3BlcnR5CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoT2JqZWN0IG9iamVjdCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXZhbHVlID0gbmV3VmFsdWU7CisJfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL01ldGFGaWVsZFByb3BlcnR5LmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvTWV0YUZpZWxkUHJvcGVydHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjg4NTg0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL01ldGFGaWVsZFByb3BlcnR5LmphdmEKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGdyb292eS5sYW5nOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLnR5cGVoYW5kbGluZy5EZWZhdWx0VHlwZVRyYW5zZm9ybWF0aW9uOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucmVmbGVjdGlvbi5DYWNoZWRGaWVsZDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247CisKKy8qKgorICogUmVwcmVzZW50cyBhIHByb3BlcnR5IG9uIGEgYmVhbiB3aGljaCBtYXkgaGF2ZSBhIGdldHRlciBhbmQvb3IgYSBzZXR0ZXIKKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgTWV0YUZpZWxkUHJvcGVydHkgZXh0ZW5kcyBNZXRhUHJvcGVydHkgeworCisgICAgYm9vbGVhbiBhbHJlYWR5U2V0QWNjZXNzaWJsZTsKKyAgICBwcml2YXRlIEZpZWxkIGZpZWxkOworCisgICAgcHVibGljIHN0YXRpYyBNZXRhRmllbGRQcm9wZXJ0eSBjcmVhdGUoQ2FjaGVkRmllbGQgZmllbGQpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNZXRhRmllbGRQcm9wZXJ0eShmaWVsZC5maWVsZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBNZXRhRmllbGRQcm9wZXJ0eShGaWVsZCBmaWVsZCkgeworICAgICAgICBzdXBlcihmaWVsZC5nZXROYW1lKCksIGZpZWxkLmdldFR5cGUoKSk7CisgICAgICAgIHRoaXMuZmllbGQgPSBmaWVsZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSBvZiB0aGUgZ2l2ZW4gb2JqZWN0CisgICAgICogQHRocm93cyBFeGNlcHRpb24gaWYgdGhlIHByb3BlcnR5IGNvdWxkIG5vdCBiZSBldmFsdWF0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KGZpbmFsIE9iamVjdCBvYmplY3QpIHsKKyAgICAgICAgaWYgKCAhYWxyZWFkeVNldEFjY2Vzc2libGUgKSB7CisgICAgICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgZmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBhbHJlYWR5U2V0QWNjZXNzaWJsZSA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGZpZWxkLmdldChvYmplY3QpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBHcm9vdnlSdW50aW1lRXhjZXB0aW9uKCJDYW5ub3QgZ2V0IHRoZSBwcm9wZXJ0eSAnIiArIG5hbWUgKyAiJy4iLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHByb3BlcnR5IG9uIHRoZSBnaXZlbiBvYmplY3QgdG8gdGhlIG5ldyB2YWx1ZQorICAgICAqCisgICAgICogQHBhcmFtIG9iamVjdCBvbiB3aGljaCB0byBzZXQgdGhlIHByb3BlcnR5CisgICAgICogQHBhcmFtIG5ld1ZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlIHByb3BlcnR5CisgICAgICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uIGlmIHRoZSBwcm9wZXJ0eSBjb3VsZCBub3QgYmUgc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoZmluYWwgT2JqZWN0IG9iamVjdCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisgICAgICAgIGZpbmFsIE9iamVjdCBnb2FsVmFsdWUgPSBEZWZhdWx0VHlwZVRyYW5zZm9ybWF0aW9uLmNhc3RUb1R5cGUobmV3VmFsdWUsIGZpZWxkLmdldFR5cGUoKSk7CisKKyAgICAgICAgaWYgKCAhYWxyZWFkeVNldEFjY2Vzc2libGUgKSB7CisgICAgICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgZmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBhbHJlYWR5U2V0QWNjZXNzaWJsZSA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmllbGQuc2V0KG9iamVjdCwgZ29hbFZhbHVlKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEdyb292eVJ1bnRpbWVFeGNlcHRpb24oIkNhbm5vdCBzZXQgdGhlIHByb3BlcnR5ICciICsgbmFtZSArICInLiIsIGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIHRvTmFtZShDbGFzcyBjKSB7CisgICAgICAgIFN0cmluZyBzID0gYy50b1N0cmluZygpOworICAgICAgICBpZiAocy5zdGFydHNXaXRoKCJjbGFzcyAiKSAmJiBzLmxlbmd0aCgpID4gNikKKyAgICAgICAgICAgIHJldHVybiBzLnN1YnN0cmluZyg2KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIHM7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRNb2RpZmllcnMoKSB7CisgICAgICAgIHJldHVybiBmaWVsZC5nZXRNb2RpZmllcnMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YXRpYygpIHsKKyAgICAgICAgcmV0dXJuIE1vZGlmaWVyLmlzU3RhdGljKGZpZWxkLmdldE1vZGlmaWVycygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvTWV0YU1ldGhvZC5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL01ldGFNZXRob2QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDEyYjJmCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL01ldGFNZXRob2QuamF2YQpAQCAtMCwwICsxLDIwNyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgZ3Jvb3Z5Lmxhbmc7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuLkJ5dGVjb2RlSGVscGVyOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucmVmbGVjdGlvbi5DYWNoZWRDbGFzczsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJlZmxlY3Rpb24uUGFyYW1ldGVyVHlwZXM7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLkludm9rZXJIZWxwZXI7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLk1ldGFDbGFzc0hlbHBlcjsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgTWV0aG9kIG9uIGEgSmF2YSBvYmplY3QgYSBsaXR0bGUgbGlrZSB7QGxpbmsgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kfQorICogZXhjZXB0IHdpdGhvdXQgdXNpbmcgcmVmbGVjdGlvbiB0byBpbnZva2UgdGhlIG1ldGhvZAorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBNZXRhTWV0aG9kIGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKKyAgICBwcml2YXRlIFN0cmluZyBzaWduYXR1cmU7CisgICAgcHJpdmF0ZSBTdHJpbmcgbW9wTmFtZTsKKworICAgIHB1YmxpYyBNZXRhTWV0aG9kKCkgeworICAgIH0KKworICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0TW9kaWZpZXJzKCk7CisKKyAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldE5hbWUoKTsKKworICAgIHB1YmxpYyBhYnN0cmFjdCBDbGFzcyBnZXRSZXR1cm5UeXBlKCk7CisKKyAgICBwdWJsaWMgYWJzdHJhY3QgQ2FjaGVkQ2xhc3MgZ2V0RGVjbGFyaW5nQ2xhc3MoKTsKKworICAgIHB1YmxpYyBhYnN0cmFjdCBQYXJhbWV0ZXJUeXBlcyBnZXRQYXJhbVR5cGVzKCk7CisKKyAgICBwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGludm9rZShPYmplY3Qgb2JqZWN0LCBPYmplY3RbXSBhcmd1bWVudHMpOworCisgICAgcHVibGljIGZpbmFsIENhY2hlZENsYXNzIFtdIGdldFBhcmFtZXRlclR5cGVzKCkgeworICAgICAgICByZXR1cm4gZ2V0UGFyYW1UeXBlcygpLmdldFBhcmFtZXRlclR5cGVzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIHRoYXQgdGhlIGdpdmVuIHBhcmFtZXRlcnMgYXJlIHZhbGlkIHRvIGNhbGwgdGhpcyBtZXRob2QKKyAgICAgKgorICAgICAqIEBwYXJhbSBhcmd1bWVudHMgdGhlIGFyZ3VtZW50cyB0byBjaGVjaworICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBwYXJhbWV0ZXJzIGFyZSBub3QgdmFsaWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjaGVja1BhcmFtZXRlcnMoQ2xhc3NbXSBhcmd1bWVudHMpIHsKKyAgICAgICAgLy8gbGV0cyBjaGVjayB0aGF0IHRoZSBhcmd1bWVudCB0eXBlcyBhcmUgdmFsaWQKKyAgICAgICAgaWYgKCFNZXRhQ2xhc3NIZWxwZXIuaXNWYWxpZE1ldGhvZChnZXRQYXJhbWV0ZXJUeXBlcygpLCBhcmd1bWVudHMsIGZhbHNlKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIlBhcmFtZXRlcnMgdG8gbWV0aG9kOiAiCisgICAgICAgICAgICAgICAgICAgICsgZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICsgIiBkbyBub3QgbWF0Y2ggdHlwZXM6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBJbnZva2VySGVscGVyLnRvU3RyaW5nKGdldFBhcmFtZXRlclR5cGVzKCkpCisgICAgICAgICAgICAgICAgICAgICsgIiBmb3IgYXJndW1lbnRzOiAiCisgICAgICAgICAgICAgICAgICAgICsgSW52b2tlckhlbHBlci50b1N0cmluZyhhcmd1bWVudHMpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc01ldGhvZChNZXRob2QgbWV0aG9kKSB7CisgICAgICAgIHJldHVybiBnZXROYW1lKCkuZXF1YWxzKG1ldGhvZC5nZXROYW1lKCkpCisgICAgICAgICAgICAmJiBnZXRNb2RpZmllcnMoKSA9PSBtZXRob2QuZ2V0TW9kaWZpZXJzKCkKKyAgICAgICAgICAgICYmIGdldFJldHVyblR5cGUoKS5lcXVhbHMobWV0aG9kLmdldFJldHVyblR5cGUoKSkKKyAgICAgICAgICAgICYmIGVxdWFsKGdldFBhcmFtZXRlclR5cGVzKCksIG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gZXF1YWwoQ2FjaGVkQ2xhc3NbXSBhLCBDbGFzc1tdIGIpIHsKKyAgICAgICAgaWYgKGEubGVuZ3RoID09IGIubGVuZ3RoKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgc2l6ZSA9IGEubGVuZ3RoOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKCFhW2ldLmdldENhY2hlZENsYXNzKCkuZXF1YWxzKGJbaV0pKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGVxdWFsKENhY2hlZENsYXNzW10gYSwgQ2FjaGVkQ2xhc3NbXSBiKSB7CisgICAgICAgIGlmIChhLmxlbmd0aCA9PSBiLmxlbmd0aCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIHNpemUgPSBhLmxlbmd0aDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChhW2ldICE9IGJbaV0pIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gc3VwZXIudG9TdHJpbmcoKQorICAgICAgICAgICAgKyAiW25hbWU6ICIKKyAgICAgICAgICAgICsgZ2V0TmFtZSgpCisgICAgICAgICAgICArICIgcGFyYW1zOiAiCisgICAgICAgICAgICArIEludm9rZXJIZWxwZXIudG9TdHJpbmcoZ2V0UGFyYW1ldGVyVHlwZXMoKSkKKyAgICAgICAgICAgICsgIiByZXR1cm5zOiAiCisgICAgICAgICAgICArIGdldFJldHVyblR5cGUoKQorICAgICAgICAgICAgKyAiIG93bmVyOiAiCisgICAgICAgICAgICArIGdldERlY2xhcmluZ0NsYXNzKCkKKyAgICAgICAgICAgICsgIl0iOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuY2xvbmUoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEdyb292eVJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNTdGF0aWMoKSB7CisgICAgICAgIHJldHVybiAoZ2V0TW9kaWZpZXJzKCkgJiBNb2RpZmllci5TVEFUSUMpICE9IDA7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNQcml2YXRlKCkgeworICAgICAgICByZXR1cm4gKGdldE1vZGlmaWVycygpICYgTW9kaWZpZXIuUFJJVkFURSkgIT0gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1Byb3RlY3RlZCgpIHsKKyAgICAgICAgcmV0dXJuIChnZXRNb2RpZmllcnMoKSAmIE1vZGlmaWVyLlBST1RFQ1RFRCkgIT0gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1B1YmxpYygpIHsKKyAgICAgICAgcmV0dXJuIChnZXRNb2RpZmllcnMoKSAmIE1vZGlmaWVyLlBVQkxJQykgIT0gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gbWV0aG9kIHRoZSBtZXRob2QgdG8gY29tcGFyZSBhZ2FpbnN0CisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBtZXRob2QgaGFzIHRoZSBzYW1lIG5hbWUsIHBhcmFtZXRlcnMsIHJldHVybiB0eXBlCisgICAgICogYW5kIG1vZGlmaWVycyBidXQgbWF5IGJlIGRlZmluZWQgb24gYW5vdGhlciB0eXBlCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNTYW1lKE1ldGFNZXRob2QgbWV0aG9kKSB7CisgICAgICAgIHJldHVybiBnZXROYW1lKCkuZXF1YWxzKG1ldGhvZC5nZXROYW1lKCkpCisgICAgICAgICAgICAmJiBjb21wYXRpYmxlTW9kaWZpZXJzKGdldE1vZGlmaWVycygpLCBtZXRob2QuZ2V0TW9kaWZpZXJzKCkpCisgICAgICAgICAgICAmJiBnZXRSZXR1cm5UeXBlKCkuZXF1YWxzKG1ldGhvZC5nZXRSZXR1cm5UeXBlKCkpCisgICAgICAgICAgICAmJiBlcXVhbChnZXRQYXJhbWV0ZXJUeXBlcygpLCBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb21wYXRpYmxlTW9kaWZpZXJzKGludCBtb2RpZmllcnNBLCBpbnQgbW9kaWZpZXJzQikgeworICAgICAgICBpbnQgbWFzayA9IE1vZGlmaWVyLlBSSVZBVEUgfCBNb2RpZmllci5QUk9URUNURUQgfCBNb2RpZmllci5QVUJMSUMgfCBNb2RpZmllci5TVEFUSUM7CisgICAgICAgIHJldHVybiAobW9kaWZpZXJzQSAmIG1hc2spID09IChtb2RpZmllcnNCICYgbWFzayk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNDYWNoZWFibGUoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBDbGFzc1tdIGdldE5hdGl2ZVBhcmFtZXRlclR5cGVzKCkgeworICAgICAgICByZXR1cm4gZ2V0UGFyYW1UeXBlcygpLmdldE5hdGl2ZVBhcmFtZXRlclR5cGVzKCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdG9yKCkgeworICAgICAgICByZXR1cm4gQnl0ZWNvZGVIZWxwZXIuZ2V0TWV0aG9kRGVzY3JpcHRvcihnZXRSZXR1cm5UeXBlKCksIGdldE5hdGl2ZVBhcmFtZXRlclR5cGVzKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIGdldFNpZ25hdHVyZSgpIHsKKyAgICAgICAgaWYgKHNpZ25hdHVyZSA9PSBudWxsKSB7CisgICAgICAgICAgICBDYWNoZWRDbGFzcyBbXSBwYXJhbWV0ZXJzID0gZ2V0UGFyYW1ldGVyVHlwZXMoKTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gZ2V0TmFtZSgpOworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIobmFtZS5sZW5ndGgoKStwYXJhbWV0ZXJzLmxlbmd0aCoxMCk7CisgICAgICAgICAgICBidWYuYXBwZW5kKGdldFJldHVyblR5cGUoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoJyAnKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQobmFtZSk7CisgICAgICAgICAgICBidWYuYXBwZW5kKCcoJyk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChwYXJhbWV0ZXJzW2ldLmdldE5hbWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWYuYXBwZW5kKCcpJyk7CisgICAgICAgICAgICBzaWduYXR1cmUgPSBidWYudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2lnbmF0dXJlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TW9wTmFtZSgpIHsKKyAgICAgICAgaWYgKG1vcE5hbWUgPT0gbnVsbCkgeworICAgICAgICAgIFN0cmluZyBuYW1lID0gZ2V0TmFtZSgpOworICAgICAgICAgIENhY2hlZENsYXNzIGRlY2xhcmluZ0NsYXNzID0gZ2V0RGVjbGFyaW5nQ2xhc3MoKTsKKyAgICAgICAgICBpZiAoKGdldE1vZGlmaWVycygpICYgKE1vZGlmaWVyLlBVQkxJQ3wgTW9kaWZpZXIuUFJPVEVDVEVEKSkgPT0gMCkKKyAgICAgICAgICAgIG1vcE5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKCkuYXBwZW5kKCJ0aGlzJCIpLmFwcGVuZChkZWNsYXJpbmdDbGFzcy5nZXRTdXBlckNsYXNzRGlzdGFuY2UoKSkuYXBwZW5kKCIkIikuYXBwZW5kKG5hbWUpLnRvU3RyaW5nKCk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgbW9wTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoKS5hcHBlbmQoInN1cGVyJCIpLmFwcGVuZChkZWNsYXJpbmdDbGFzcy5nZXRTdXBlckNsYXNzRGlzdGFuY2UoKSkuYXBwZW5kKCIkIikuYXBwZW5kKG5hbWUpLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1vcE5hbWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL01ldGFPYmplY3RQcm90b2NvbC5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL01ldGFPYmplY3RQcm90b2NvbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMTRiOTYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvTWV0YU9iamVjdFByb3RvY29sLmphdmEKQEAgLTAsMCArMSwyMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBncm9vdnkubGFuZzsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIDxwPkFuIGludGVyZmFjZSB0aGF0IGRlZmluZXMgdGhlIEFQSSB1c2FibGUgYnkgY2xpZW50cyBvZiBHcm9vdnkncyBNZXRhIE9iamVjdCBQcm90b2NvbCAoTU9QKS4gVGhlc2UgbWV0aG9kcyBhcmUKKyAqIGltcGxlbWVudGVkIGJ5IHRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gb2YgdGhlIEBsaW5rIGdyb292eS5sYW5nLk1ldGFDbGFzcyBpbnRlcmZhY2UuPC9wPgorICoKKyAqIEBzZWUgTWV0YUNsYXNzSW1wbAorICoKKyAqIEBhdXRob3IgSm9obiBXaWxzb24KKyAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgorICovCitwdWJsaWMgaW50ZXJmYWNlIE1ldGFPYmplY3RQcm90b2NvbCB7CisKKyAgICAvKioKKyAgICAgKiBPYnRhaW4gYSBsaXN0IG9mIGFsbCBtZXRhIHByb3BlcnRpZXMgYXZhaWxhYmxlIG9uIHRoaXMgbWV0YSBjbGFzcworICAgICAqCisgICAgICogQHNlZSBncm9vdnkubGFuZy5NZXRhQmVhblByb3BlcnR5CisgICAgICogQHJldHVybiBBIGxpc3Qgb2YgTWV0YUJlYW5Qcm9wZXJ0eSBpbnN0YW5jZXMKKyAgICAgKi8KKyAgICBMaXN0IGdldFByb3BlcnRpZXMoKTsKKyAgICAvKioKKyAgICAgKiBPYnRhaW4gYSBsaXN0IG9mIGFsbCB0aGUgbWV0YSBtZXRob2RzIGF2YWlsYWJsZSBvbiB0aGlzIG1ldGEgY2xhc3MKKyAgICAgKgorICAgICAqIEBzZWUgZ3Jvb3Z5LmxhbmcuTWV0YU1ldGhvZAorICAgICAqIEByZXR1cm4gQSBsaXN0IG9mIE1ldGFNZXRob2QgaW5zdGFuY2VzCisgICAgICovCisgICAgTGlzdCBnZXRNZXRob2RzKCk7CisgICAgCisgICAgLyoqCisgICAgICogPHA+UmV0dXJucyB0cnVlIGlmIHRoZSBpbXBsZW1lbnRpbmcgTWV0YUNsYXNzIHJlc3BvbmRzIGEgbWV0aG9kIHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIGFyZ3VtZW50cyB0eXBlcworICAgICAqCisgICAgICogPHA+Tm90ZSB0aGF0IHRoaXMgbWV0aG9kIHdpbGwgb25seSByZXR1cm4gdHJ1ZSBmb3IgcmVhbGlzZWQgbWV0aG9kcyBhbmQgZG9lcyBub3QgdGFrZSBpbnRvIGFjY291bnQKKyAgICAgKiBvYmplY3RzIG9yIGNsYXNzZXMgdGhhdCBpbXBsZW1lbnQgaW52b2tlTWV0aG9kIG9yIG1ldGhvZE1pc3NpbmcKKyAgICAgKgorICAgICAqIDxwPlRoaXMgbWV0aG9kIGlzICJzYWZlIiBhbmQgd2lsbCBhbHdheXMgcmV0dXJuIGEgYm9vbGVhbiBhbmQgbmV2ZXIgdGhyb3cgYW4gZXhjZXB0aW9uCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2JqIFRoZSBvYmplY3QgdG8gaW5zcGVjdAorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBtZXRob2QKKyAgICAgKiBAcGFyYW0gYXJnVHlwZXMgVGhlIGFyZ3VtZW50IHR5cGVzCisgICAgICogQHJldHVybiBBIExpc3Qgb2YgTWV0YU1ldGhvZHMgd2hpY2ggaXMgZW1wdHkgaWYgbm9uIGV4aXN0CisgICAgICovCisgICAgTGlzdCByZXNwb25kc1RvKE9iamVjdCBvYmosU3RyaW5nIG5hbWUsIE9iamVjdFtdIGFyZ1R5cGVzKTsKKworICAgIC8qKgorICAgICAqIDxwPlJldHVybnMgdHJ1ZSBpZiB0aGUgaW1wbGVtZW50aW5nIE1ldGFDbGFzcyByZXNwb25kcyBhIG1ldGhvZCB3aXRoIHRoZSBnaXZlbiBuYW1lIHJlZ2FyZGxlc3Mgb2YKKyAgICAgKiBhcmd1bWVudHMuIEluIG90aGVyIHdvcmRzIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGZvciBmb28oKSBhbmQgZm9vKFN0cmluZykKKyAgICAgKgorICAgICAqIDxwPk5vdGUgdGhhdCB0aGlzIG1ldGhvZCB3aWxsIG9ubHkgcmV0dXJuIHRydWUgZm9yIHJlYWxpc2VkIG1ldGhvZHMgYW5kIGRvZXMgbm90IHRha2UgaW50byBhY2NvdW50CisgICAgICogb2JqZWN0cyBvciBjbGFzc2VzIHRoYXQgaW1wbGVtZW50IGludm9rZU1ldGhvZCBvciBtZXRob2RNaXNzaW5nCisgICAgICoKKyAgICAgKiA8cD5UaGlzIG1ldGhvZCBpcyAic2FmZSIgYW5kIHdpbGwgYWx3YXlzIHJldHVybiBhIGJvb2xlYW4gYW5kIG5ldmVyIHRocm93IGFuIGV4Y2VwdGlvbgorICAgICAqCisgICAgICogQHBhcmFtIG9iaiBUaGUgb2JqZWN0IHRvIGluc3BlY3QKKyAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kCisgICAgICogQHJldHVybiBBIExpc3Qgb2YgTWV0YU1ldGhvZHMgd2hpY2ggaXMgZW1wdHkgaWYgbm9uIGV4aXN0CisgICAgICovCisgICAgTGlzdCByZXNwb25kc1RvKE9iamVjdCBvYmosU3RyaW5nIG5hbWUpOworCisgICAgLyoqCisgICAgICogPHA+UmV0dXJucyB0cnVlIG9mIHRoZSBpbXBsZW1lbnRpbmcgTWV0YUNsYXNzIGhhcyBhIHByb3BlcnR5IG9mIHRoZSBnaXZlbiBuYW1lCisgICAgICoKKyAgICAgKiA8cD5Ob3RlIHRoYXQgdGhpcyBtZXRob2Qgd2lsbCBvbmx5IHJldHVybiB0cnVlIGZvciByZWFsaXNlZCBwcm9wZXJ0aWVzIGFuZCBkb2VzIG5vdCB0YWtlIGludG8KKyAgICAgKiBhY2NvdW50IGltcGxlbWVudGF0aW9uIG9mIGdldFByb3BlcnR5IG9yIHByb3BlcnR5TWlzc2luZworICAgICAqCisgICAgICogQHBhcmFtIG9iaiBUaGUgb2JqZWN0IHRvIGluc3BlY3QKKyAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkKKyAgICAgKiBAcmV0dXJuIFRoZSBNZXRhUHJvcGVydHkgb3IgbnVsbCBpZiBpdCBkb2Vzbid0IGV4aXN0CisgICAgICovCisgICAgTWV0YVByb3BlcnR5IGhhc1Byb3BlcnR5KE9iamVjdCBvYmosIFN0cmluZyBuYW1lKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBNZXRhUHJvcGVydHkgZm9yIHRoZSBnaXZlbiBuYW1lIG9yIG51bGwgaWYgaXQgZG9lc24ndCBleGlzdAorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIE1ldGFQcm9wZXJ0eQorICAgICAqIEByZXR1cm4gQSBNZXRhUHJvcGVydHkgb3IgbnVsbAorICAgICAqLworICAgIE1ldGFQcm9wZXJ0eSBnZXRNZXRhUHJvcGVydHkoU3RyaW5nIG5hbWUpOworCisgICAgLyoqCisgICAgICogUmV0cmVpdmVzIGEgc3RhdGljIE1ldGFNZXRob2QgZm9yIHRoZSBnaXZlbiBuYW1lIGFuZCBhcmd1bWVudCB2YWx1ZXMsIHVzaW5nIHRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzCisgICAgICogdG8gZXN0YWJsaXNoIHRoZSBjaG9zZW4gTWV0YU1ldGhvZAorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIE1ldGFNZXRob2QKKyAgICAgKiBAcGFyYW0gYXJncyBUaGUgYXJndW1lbnQgdHlwZXMKKyAgICAgKiBAcmV0dXJuIEEgTWV0YU1ldGhvZCBvciBudWxsIGlmIGl0IGRvZXNuJ3QgZXhpc3QKKyAgICAgKi8KKyAgICBNZXRhTWV0aG9kIGdldFN0YXRpY01ldGFNZXRob2QoU3RyaW5nIG5hbWUsIE9iamVjdFtdIGFyZ3MpOworCisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgYW4gaW5zdGFuY2UgTWV0YU1ldGhvZCBmb3IgdGhlIGdpdmVuIG5hbWUgYW5kIGFyZ3VtZW50IHZhbHVlcywgdXNpbmcgdGhlIHR5cGVzIG9mIHRoZQorICAgICAqIGFyZ3VtZW50IHZhbHVlcyB0byBlc3RhYmxpc2ggdGhlIGNob3NlbiBNZXRhTWV0aG9kCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgTWV0YU1ldGhvZAorICAgICAqIEBwYXJhbSBhcmdzIFRoZSBhcmd1bWVudCB0eXBlcworICAgICAqIEByZXR1cm4gQSBNZXRhTWV0aG9kIG9yIG51bGwgaWYgaXQgZG9lc24ndCBleGlzdAorICAgICAqLworICAgIE1ldGFNZXRob2QgZ2V0TWV0YU1ldGhvZChTdHJpbmcgbmFtZSwgT2JqZWN0W10gYXJncyk7CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhhdCBKYXZhIENsYXNzIHRoYXQgdGhlIGF0dGFjaGVkIE1ldGEgYmVoYXZpb3VycyBhcHBseSB0bworICAgICAqCisgICAgICogQHJldHVybiBUaGUgamF2YS5sYW5nLkNsYXNzIGluc3RhbmNlCisgICAgICovCisgICAgQ2xhc3MgZ2V0VGhlQ2xhc3MoKTsKKworICAgIC8qKgorICAgICAqIEludm9rZXMgYSBjb25zdHJ1Y3RvciBmb3IgdGhlIGdpdmVuIGFyZ3VtZW50cy4gVGhlIE1ldGFDbGFzcyB3aWxsIGF0dGVtcHQgdG8gcGljayB0aGUgYmVzdCBhcmd1bWVudCB3aGljaAorICAgICAqIG1hdGNoZXMgdGhlIHR5cGVzIG9mIHRoZSBvYmplY3RzIHBhc3NlZCB3aXRoaW4gdGhlIGFyZ3VtZW50cyBhcnJheQorICAgICAqCisgICAgICogQHBhcmFtIGFyZ3VtZW50cyBUaGUgYXJndW1lbnRzIHRvIHRoZSBjb25zdHJ1Y3RvcgorICAgICAqIEByZXR1cm4gQW4gaW5zdGFuY2Ugb2YgdGhlIGphdmEubGFuZy5DbGFzcyB0aGF0IHRoaXMgTWV0YU9iamVjdFByb3RvY29sIG9iamVjdCBhcHBsaWVzIHRvCisgICAgICovCisgICAgT2JqZWN0IGludm9rZUNvbnN0cnVjdG9yKE9iamVjdFtdIGFyZ3VtZW50cyk7CisKKyAgICAvKioKKyAgICAgKiA8cD5JbnZva2VzIGEgbWV0aG9kIG9uIHRoZSBnaXZlbiBPYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgYXJndW1lbnRzLiBUaGUgTWV0YUNsYXNzIHdpbGwgYXR0ZW1wdCB0byBwaWNrCisgICAgICogdGhlIGJlc3QgbWV0aG9kIGZvciB0aGUgZ2l2ZW4gbmFtZSBhbmQgYXJndW1lbnRzLiBJZiBhIG1ldGhvZCBjYW5ub3QgYmUgaW52b2tlZCBhIE1pc3NpbmdNZXRob2RFeGNlcHRpb24gd2lsbCBiZQorICAgICAqIHRocm93bi48L3A+CisgICAgICoKKyAgICAgKgorICAgICAqIEBzZWUgZ3Jvb3Z5LmxhbmcuTWlzc2luZ01ldGhvZEV4Y2VwdGlvbgorICAgICAqCisgICAgICogQHBhcmFtIG9iamVjdCBUaGUgaW5zdGFuY2Ugd2hpY2ggdGhlIG1ldGhvZCBpcyBpbnZva2VkIG9uCisgICAgICogQHBhcmFtIG1ldGhvZE5hbWUgVGhlIG5hbWUgb2YgdGhlIG1ldGhvZAorICAgICAqIEBwYXJhbSBhcmd1bWVudHMgVGhlIGFyZ3VtZW50cyB0byB0aGUgbWV0aG9kCisgICAgICogQHJldHVybiBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBtZXRob2Qgd2hpY2ggaXMgbnVsbCBpZiB0aGUgcmV0dXJuIHR5cGUgaXMgdm9pZAorICAgICAqLworICAgIE9iamVjdCBpbnZva2VNZXRob2QoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1ldGhvZE5hbWUsIE9iamVjdFtdIGFyZ3VtZW50cyk7CisKKyAgICAvKioKKyAgICAgKiA8cD5JbnZva2VzIGEgbWV0aG9kIG9uIHRoZSBnaXZlbiBvYmplY3QsIHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIHNpbmdsZSBhcmd1bWVudC48L3A+CisgICAgICoKKyAgICAgKiBAc2VlICNpbnZva2VNZXRob2QoT2JqZWN0LCBTdHJpbmcsIE9iamVjdFtdKQorICAgICAqCisgICAgICogQHBhcmFtIG9iamVjdCBUaGUgT2JqZWN0IHRvIGludm9rZSB0aGUgbWV0aG9kIG9uCisgICAgICogQHBhcmFtIG1ldGhvZE5hbWUgVGhlIG5hbWUgb2YgdGhlIG1ldGhvZAorICAgICAqIEBwYXJhbSBhcmd1bWVudHMgVGhlIGFyZ3VtZW50IHRvIHRoZSBtZXRob2QKKyAgICAgKiBAcmV0dXJuIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIG1ldGhvZCB3aGljaCBpcyBudWxsIGlmIHRoZSByZXR1cm4gdHlwZSBpcyB2b2lkCisgICAgICovCisgICAgIE9iamVjdCBpbnZva2VNZXRob2QoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1ldGhvZE5hbWUsIE9iamVjdCBhcmd1bWVudHMpOworCisgICAgLyoqCisgICAgICogPHA+SW52b2tlcyBhIHN0YXRpYyBtZXRob2Qgb24gdGhlIGdpdmVuIE9iamVjdCB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCBhcmd1bWVudHMuPC9wPgorICAgICAqCisgICAgICogPHA+IFRoZSBPYmplY3QgY2FuIGVpdGhlciBiZSBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3MgdGhhdCB0aGlzCisgICAgICogTWV0YU9iamVjdFByb3RvY29sIGluc3RhbmNlIGFwcGxpZXMgdG8gb3IgdGhlIGphdmEubGFuZy5DbGFzcyBpbnN0YW5jZSBpdHNlbGYuIElmIGEgbWV0aG9kIGNhbm5vdCBiZSBpbnZva2VkCisgICAgICogYSBNaXNzaW5nTWV0aG9kRXhjZXB0aW9uIGlzIHdpbGwgYmUgdGhyb3duPC9wPgorICAgICAqCisgICAgICogQHNlZSBncm9vdnkubGFuZy5NaXNzaW5nTWV0aG9kRXhjZXB0aW9uCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2JqZWN0IEFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyByZXR1cm5lZCBieSB0aGUgZ2V0VGhlQ2xhc3MoKSBtZXRob2Qgb3IgdGhlIGNsYXNzIGl0c2VsZgorICAgICAqIEBwYXJhbSBtZXRob2ROYW1lIFRoZSBuYW1lIG9mIHRoZSBtZXRob2QKKyAgICAgKiBAcGFyYW0gYXJndW1lbnRzIFRoZSBhcmd1bWVudHMgdG8gdGhlIG1ldGhvZAorICAgICAqIEByZXR1cm4gVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgbWV0aG9kIHdoaWNoIGlzIG51bGwgaWYgdGhlIHJldHVybiB0eXBlIGlzIHZvaWQKKyAgICAgKi8KKyAgICBPYmplY3QgaW52b2tlU3RhdGljTWV0aG9kKE9iamVjdCBvYmplY3QsIFN0cmluZyBtZXRob2ROYW1lLCBPYmplY3RbXSBhcmd1bWVudHMpOworCisgICAgLyoqCisgICAgICogPHA+UmV0cmlldmVzIGEgcHJvcGVydHkgb2YgYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIHJldHVybmVkIGJ5IHRoZSBnZXRUaGVDbGFzcygpIG1ldGhvZC4gPC9wPgorICAgICAqCisgICAgICogPHA+V2hhdCB0aGlzIG1lYW5zIGlzIGxhcmdlbHkgZG93biB0byB0aGUgTWV0YUNsYXNzIGltcGxlbWVudGF0aW9uLCBob3dldmVyIHRoZSBkZWZhdWx0IGNhc2Ugd291bGQgcmVzdWx0CisgICAgICogaW4gYW4gYXR0ZW1wdCB0byBpbnZva2UgYSBKYXZhQmVhbiBnZXR0ZXIsIG9yIGlmIG5vIHN1Y2ggZ2V0dGVyIGV4aXN0cyBhIHB1YmxpYyBmaWVsZCBvZiB0aGUgaW5zdGFuY2UuPC9wPgorICAgICAqCisgICAgICogQHNlZSBNZXRhQ2xhc3NJbXBsCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2JqZWN0IEFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyByZXR1cm5lZCBieSB0aGUgZ2V0VGhlQ2xhc3MoKSBtZXRob2QKKyAgICAgKiBAcGFyYW0gcHJvcGVydHkgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHJldHJpZXZlIHRoZSB2YWx1ZSBmb3IKKyAgICAgKiBAcmV0dXJuIFRoZSBwcm9wZXJ0aWVzIHZhbHVlCisgICAgICovCisgICAgT2JqZWN0IGdldFByb3BlcnR5KE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSk7CisKKyAgICAvKioKKyAgICAgKiA8cD5TZXRzIGEgcHJvcGVydHkgb2YgYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIHJldHVybmVkIGJ5IHRoZSBnZXRUaGVDbGFzcygpIG1ldGhvZC48L3A+CisgICAgICoKKyAgICAgKiA8cD5XaGF0IHRoaXMgbWVhbnMgaXMgbGFyZ2VseSBkb3duIHRvIHRoZSBNZXRhQ2xhc3MgaW1wbGVtZW50YXRpb24sIGhvd2V2ZXIgdGhlIGRlZmF1bHQgY2FzZSB3b3VsZCByZXN1bHQKKyAgICAgKiBpbiBhbiBhdHRlbXB0IHRvIGludm9rZSBhIEphdmFCZWFuIHNldHRlciwgb3IgaWYgbm8gc3VjaCBzZXR0ZXIgZXhpc3RzIHRvIHNldCBhIHB1YmxpYyBmaWVsZCBvZiB0aGUgaW5zdGFuY2UuPC9wPgorICAgICAqCisgICAgICogQHNlZSBNZXRhQ2xhc3NJbXBsCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2JqZWN0IEFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyByZXR1cm5lZCBieSB0aGUgZ2V0VGhlQ2xhc3MoKSBtZXRob2QKKyAgICAgKiBAcGFyYW0gcHJvcGVydHkgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHNldAorICAgICAqIEBwYXJhbSBuZXdWYWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eQorICAgICAqLworICAgIHZvaWQgc2V0UHJvcGVydHkoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgbmV3VmFsdWUpOworCisgICAgLyoqCisgICAgICogPHA+UmV0cmlldmVzIGFuIGF0dHJpYnV0ZSBvZiBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3MgcmV0dXJuZWQgYnkgdGhlIGdldFRoZUNsYXNzKCkgbWV0aG9kLiA8L3A+CisgICAgICoKKyAgICAgKiA8cD5XaGF0IHRoaXMgbWVhbnMgaXMgbGFyZ2VseSBkb3duIHRvIHRoZSBNZXRhQ2xhc3MgaW1wbGVtZW50YXRpb24sIGhvd2V2ZXIgdGhlIGRlZmF1bHQgY2FzZSB3b3VsZCByZXN1bHQKKyAgICAgKiBpbiBhdHRlbXB0IHRvIHJlYWQgYSBmaWVsZCBvZiB0aGUgaW5zdGFuY2UuPC9wPgorICAgICAqCisgICAgICogQHNlZSBNZXRhQ2xhc3NJbXBsCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2JqZWN0IEFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyByZXR1cm5lZCBieSB0aGUgZ2V0VGhlQ2xhc3MoKSBtZXRob2QKKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gcmV0cmlldmUgdGhlIHZhbHVlIGZvcgorICAgICAqIEByZXR1cm4gVGhlIGF0dHJpYnV0ZSB2YWx1ZQorICAgICAqLworICAgIE9iamVjdCBnZXRBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGF0dHJpYnV0ZSk7CisKKyAgICAvKioKKyAgICAgKiA8cD5TZXRzIGFuIGF0dHJpYnV0ZSBvZiBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3MgcmV0dXJuZWQgYnkgdGhlIGdldFRoZUNsYXNzKCkgbWV0aG9kLjwvcD4KKyAgICAgKgorICAgICAqIDxwPldoYXQgdGhpcyBtZWFucyBpcyBsYXJnZWx5IGRvd24gdG8gdGhlIE1ldGFDbGFzcyBpbXBsZW1lbnRhdGlvbiwgaG93ZXZlciB0aGUgZGVmYXVsdCBjYXNlIHdvdWxkIHJlc3VsdAorICAgICAqIGluIGFuIGF0dGVtcHQgdG8gc2V0IGEgZmllbGQgb2YgdGhlIGluc3RhbmNlLjwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgTWV0YUNsYXNzSW1wbAorICAgICAqCisgICAgICogQHBhcmFtIG9iamVjdCBBbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3MgcmV0dXJuZWQgYnkgdGhlIGdldFRoZUNsYXNzKCkgbWV0aG9kCisgICAgICogQHBhcmFtIGF0dHJpYnV0ZSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvIHNldAorICAgICAqIEBwYXJhbSBuZXdWYWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUKKyAgICAgKi8KKyAgICB2b2lkIHNldEF0dHJpYnV0ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgYXR0cmlidXRlLCBPYmplY3QgbmV3VmFsdWUpOworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL01ldGFQcm9wZXJ0eS5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL01ldGFQcm9wZXJ0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NzM0ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvTWV0YVByb3BlcnR5LmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGdyb292eS5sYW5nOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7CisKKy8qKgorICogUmVwcmVzZW50cyBhIHByb3BlcnR5IG9uIGEgYmVhbiB3aGljaCBtYXkgaGF2ZSBhIGdldHRlciBhbmQvb3IgYSBzZXR0ZXIKKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIE1ldGFQcm9wZXJ0eSB7CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIG5hbWU7CisgICAgcHJvdGVjdGVkIENsYXNzIHR5cGU7CisKKyAgICBwdWJsaWMgTWV0YVByb3BlcnR5KFN0cmluZyBuYW1lLCBDbGFzcyB0eXBlKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgcHJvcGVydHkgb2YgdGhlIGdpdmVuIG9iamVjdAorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGlmIHRoZSBwcm9wZXJ0eSBjb3VsZCBub3QgYmUgZXZhbHVhdGVkCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IE9iamVjdCBnZXRQcm9wZXJ0eShPYmplY3Qgb2JqZWN0KTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHByb3BlcnR5IG9uIHRoZSBnaXZlbiBvYmplY3QgdG8gdGhlIG5ldyB2YWx1ZQorICAgICAqIAorICAgICAqIEBwYXJhbSBvYmplY3Qgb24gd2hpY2ggdG8gc2V0IHRoZSBwcm9wZXJ0eQorICAgICAqIEBwYXJhbSBuZXdWYWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eQorICAgICAqIEB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiBpZiB0aGUgcHJvcGVydHkgY291bGQgbm90IGJlIHNldAorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFByb3BlcnR5KE9iamVjdCBvYmplY3QsIE9iamVjdCBuZXdWYWx1ZSk7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhlIHByb3BlcnR5CisgICAgICovCisgICAgcHVibGljIENsYXNzIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiB0eXBlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgaW50IGdldE1vZGlmaWVycygpIHsKKyAgICAgICAgcmV0dXJuIE1vZGlmaWVyLlBVQkxJQzsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbGFuZy9NaXNzaW5nQ2xhc3NFeGNlcHRpb24uamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbGFuZy9NaXNzaW5nQ2xhc3NFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjcyY2YwCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL01pc3NpbmdDbGFzc0V4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBncm9vdnkubGFuZzsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LkFTVE5vZGU7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuQ2xhc3NOb2RlOworCisvKioKKyAqIEFuIGV4Y2VwdGlvbiBvY2N1cnJlZCBpZiBhIGR5bmFtaWMgbWV0aG9kIGRpc3BhdGNoIGZhaWxzIHdpdGggYW4gdW5rbm93biBjbGFzcy4KKyAqIAorICogTm90ZSB0aGF0IHRoZSBNaXNzaW5nKkV4Y2VwdGlvbiBjbGFzc2VzIHdlcmUgbmFtZWQgZm9yIGNvbnNpc3RlbmN5IGFuZAorICogdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggSkRLIGV4Y2VwdGlvbnMgb2YgdGhlIHNhbWUgbmFtZS4KKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIE1pc3NpbmdDbGFzc0V4Y2VwdGlvbiBleHRlbmRzIEdyb292eVJ1bnRpbWVFeGNlcHRpb24geworCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdHlwZTsKKworICAgIHB1YmxpYyBNaXNzaW5nQ2xhc3NFeGNlcHRpb24oU3RyaW5nIHR5cGUsIEFTVE5vZGUgbm9kZSwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgc3VwZXIoIk5vIHN1Y2ggY2xhc3M6ICIgKyB0eXBlICsgIiAiICsgbWVzc2FnZSwgbm9kZSk7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBNaXNzaW5nQ2xhc3NFeGNlcHRpb24oQ2xhc3NOb2RlIHR5cGUsIFN0cmluZyBtZXNzYWdlKXsKKyAgICAgICAgc3VwZXIoIk5vIHN1Y2ggY2xhc3M6ICIgKyB0eXBlLmdldE5hbWUoKSArICIgIiArIG1lc3NhZ2UpOworICAgICAgICB0aGlzLnR5cGUgPSB0eXBlLmdldE5hbWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRoZSB0eXBlIHRoYXQgY291bGQgbm90IGJlIHJlc29sdmVkCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gdHlwZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvTWlzc2luZ0ZpZWxkRXhjZXB0aW9uLmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvTWlzc2luZ0ZpZWxkRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY1NDIzMQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbGFuZy9NaXNzaW5nRmllbGRFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBncm9vdnkubGFuZzsKKworCisvKioKKyAqIEFuIGV4Y2VwdGlvbiBvY2N1cnJlZCBpZiBhIGR5bmFtaWMgZmllbGQgZGlzcGF0Y2ggZmFpbHMgd2l0aCBhbiB1bmtub3duIGZpZWxkLgorICogCisgKiBOb3RlIHRoYXQgdGhlIE1pc3NpbmcqRXhjZXB0aW9uIGNsYXNzZXMgd2VyZSBuYW1lZCBmb3IgY29uc2lzdGVuY3kgYW5kCisgKiB0byBhdm9pZCBjb25mbGljdHMgd2l0aCBKREsgZXhjZXB0aW9ucyBvZiB0aGUgc2FtZSBuYW1lLgorICogCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AcHJvdGlxdWUuY29tIj5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIE1pc3NpbmdGaWVsZEV4Y2VwdGlvbiBleHRlbmRzIEdyb292eVJ1bnRpbWVFeGNlcHRpb24geworCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZmllbGQ7CisgICAgcHJpdmF0ZSBmaW5hbCBDbGFzcyB0eXBlOworCisgICAgcHVibGljIE1pc3NpbmdGaWVsZEV4Y2VwdGlvbihTdHJpbmcgZmllbGQsIENsYXNzIHR5cGUpIHsKKyAgICAgICAgc3VwZXIoIk5vIHN1Y2ggZmllbGQ6ICIgKyBmaWVsZCArICIgZm9yIGNsYXNzOiAiICsgdHlwZS5nZXROYW1lKCkpOworICAgICAgICB0aGlzLmZpZWxkID0gZmllbGQ7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgfQorCisgICAgcHVibGljIE1pc3NpbmdGaWVsZEV4Y2VwdGlvbihTdHJpbmcgZmllbGQsIENsYXNzIHR5cGUsIFRocm93YWJsZSBlKSB7CisgICAgICAgIHN1cGVyKCJObyBzdWNoIGZpZWxkOiAiICsgZmllbGQgKyAiIGZvciBjbGFzczogIiArIHR5cGUuZ2V0TmFtZSgpICsgIi4gUmVhc29uOiAiICsgZSwgZSk7CisgICAgICAgIHRoaXMuZmllbGQgPSBmaWVsZDsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWlzc2luZ0ZpZWxkRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgZmllbGQsIENsYXNzIHR5cGUpIHsKKyAgICAgICAgc3VwZXIobWVzc2FnZSk7CisgICAgICAgIHRoaXMuZmllbGQgPSBmaWVsZDsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCB0aGF0IGNvdWxkIG5vdCBiZSBmb3VuZAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmllbGQoKSB7CisgICAgICAgIHJldHVybiBmaWVsZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRoZSB0eXBlIG9uIHdoaWNoIHRoZSBmaWVsZCB3YXMgYXR0ZW1wdGVkIHRvIGJlIGNhbGxlZAorICAgICAqLworICAgIHB1YmxpYyBDbGFzcyBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gdHlwZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvTWlzc2luZ01ldGhvZEV4Y2VwdGlvbi5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL01pc3NpbmdNZXRob2RFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzJkNWU4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL01pc3NpbmdNZXRob2RFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDg2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgZ3Jvb3Z5Lmxhbmc7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuSW52b2tlckhlbHBlcjsKKworLyoqCisgKiBBbiBleGNlcHRpb24gb2NjdXJyZWQgaWYgYSBkeW5hbWljIG1ldGhvZCBkaXNwYXRjaCBmYWlscyB3aXRoIGFuIHVua25vd24gbWV0aG9kLgorICogCisgKiBOb3RlIHRoYXQgdGhlIE1pc3NpbmcqRXhjZXB0aW9uIGNsYXNzZXMgd2VyZSBuYW1lZCBmb3IgY29uc2lzdGVuY3kgYW5kCisgKiB0byBhdm9pZCBjb25mbGljdHMgd2l0aCBKREsgZXhjZXB0aW9ucyBvZiB0aGUgc2FtZSBuYW1lLgorICogCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgTWlzc2luZ01ldGhvZEV4Y2VwdGlvbiBleHRlbmRzIEdyb292eVJ1bnRpbWVFeGNlcHRpb24geworCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbWV0aG9kOworICAgIHByaXZhdGUgZmluYWwgQ2xhc3MgdHlwZTsKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNTdGF0aWM7CisKKyAgICBwdWJsaWMgT2JqZWN0W10gZ2V0QXJndW1lbnRzKCkgeworICAgICAgICByZXR1cm4gYXJndW1lbnRzOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IGFyZ3VtZW50cyBbXTsKKworICAgIHB1YmxpYyBNaXNzaW5nTWV0aG9kRXhjZXB0aW9uKFN0cmluZyBtZXRob2QsIENsYXNzIHR5cGUsIE9iamVjdFtdIGFyZ3VtZW50cykgeworICAgICAgICB0aGlzKG1ldGhvZCx0eXBlLGFyZ3VtZW50cyxmYWxzZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBNaXNzaW5nTWV0aG9kRXhjZXB0aW9uKFN0cmluZyBtZXRob2QsIENsYXNzIHR5cGUsIE9iamVjdFtdIGFyZ3VtZW50cywgYm9vbGVhbiBpc1N0YXRpYykgeworCSAgICBzdXBlcigpOworCSAgICB0aGlzLm1ldGhvZCA9IG1ldGhvZDsKKwkgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgdGhpcy5pc1N0YXRpYyA9IGlzU3RhdGljOworICAgICAgICB0aGlzLmFyZ3VtZW50cyA9IGFyZ3VtZW50czsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7CisgICAgICAgIHJldHVybiAiTm8gc2lnbmF0dXJlIG9mIG1ldGhvZDogIgorICAgICAgICAgICAgICAgICAgICArIChpc1N0YXRpYyA/ICJzdGF0aWMgIiA6ICIiKQorICAgICAgICAgICAgICAgICAgICArIHR5cGUuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICsgIi4iCisgICAgICAgICAgICAgICAgICAgICsgbWV0aG9kCisgICAgICAgICAgICAgICAgICAgICsgIigpIGlzIGFwcGxpY2FibGUgZm9yIGFyZ3VtZW50IHR5cGVzOiAoIgorICAgICAgICAgICAgICAgICAgICArIEludm9rZXJIZWxwZXIudG9UeXBlU3RyaW5nKGFyZ3VtZW50cykKKyAgICAgICAgICAgICAgICAgICAgKyAiKSB2YWx1ZXM6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBJbnZva2VySGVscGVyLnRvU3RyaW5nKGFyZ3VtZW50cyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIHRoYXQgY291bGQgbm90IGJlIGZvdW5kCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRNZXRob2QoKSB7CisgICAgICAgIHJldHVybiBtZXRob2Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgdHlwZSBvbiB3aGljaCB0aGUgbWV0aG9kIHdhcyBhdHRlbXB0ZWQgdG8gYmUgY2FsbGVkCisgICAgICovCisgICAgcHVibGljIENsYXNzIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiB0eXBlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFdoZXRoZXIgdGhlIG1ldGhvZCB3YXMgY2FsbGVkIGluIGEgc3RhdGljIHdheSwgCisgICAgICogaS5lLiBvbiBhIGNsYXNzIHJhdGhlciB0aGFuIGFuIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YXRpYygpIHsKKyAgICAgICAgcmV0dXJuIGlzU3RhdGljOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbGFuZy9NaXNzaW5nUHJvcGVydHlFeGNlcHRpb24uamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbGFuZy9NaXNzaW5nUHJvcGVydHlFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGIwYTk5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL01pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBncm9vdnkubGFuZzsKKworCisvKioKKyAqIEFuIGV4Y2VwdGlvbiBvY2N1cnJlZCBpZiBhIGR5bmFtaWMgcHJvcGVydHkgZGlzcGF0Y2ggZmFpbHMgd2l0aCBhbiB1bmtub3duIHByb3BlcnR5LgorICogCisgKiBOb3RlIHRoYXQgdGhlIE1pc3NpbmcqRXhjZXB0aW9uIGNsYXNzZXMgd2VyZSBuYW1lZCBmb3IgY29uc2lzdGVuY3kgYW5kCisgKiB0byBhdm9pZCBjb25mbGljdHMgd2l0aCBKREsgZXhjZXB0aW9ucyBvZiB0aGUgc2FtZSBuYW1lLgorICogCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgTWlzc2luZ1Byb3BlcnR5RXhjZXB0aW9uIGV4dGVuZHMgR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbiB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBNUEUgPSBuZXcgT2JqZWN0KCk7CisKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBwcm9wZXJ0eTsKKyAgICBwcml2YXRlIGZpbmFsIENsYXNzIHR5cGU7CisKKyAgICBwdWJsaWMgTWlzc2luZ1Byb3BlcnR5RXhjZXB0aW9uKFN0cmluZyBwcm9wZXJ0eSwgQ2xhc3MgdHlwZSkgeworICAgICAgICB0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgfQorCisgICAgcHVibGljIE1pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbihTdHJpbmcgcHJvcGVydHksIENsYXNzIHR5cGUsIFRocm93YWJsZSB0KSB7CisgICAgICAgIHN1cGVyKHQpOworICAgICAgICB0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgfQorCisgICAgcHVibGljIE1pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICBzdXBlcihtZXNzYWdlKTsKKyAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IG51bGw7CisgICAgICAgIHRoaXMudHlwZSA9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIE1pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIHByb3BlcnR5LCBDbGFzcyB0eXBlKSB7CisgICAgICAgIHN1cGVyKG1lc3NhZ2UpOworICAgICAgICB0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlV2l0aG91dExvY2F0aW9uVGV4dCgpIHsKKyAgICAgICAgZmluYWwgVGhyb3dhYmxlIGNhdXNlID0gZ2V0Q2F1c2UoKTsKKyAgICAgICAgaWYgKGNhdXNlID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChzdXBlci5nZXRNZXNzYWdlV2l0aG91dExvY2F0aW9uVGV4dCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0TWVzc2FnZVdpdGhvdXRMb2NhdGlvblRleHQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAiTm8gc3VjaCBwcm9wZXJ0eTogIiArIHByb3BlcnR5ICsgIiBmb3IgY2xhc3M6ICIgKyB0eXBlLmdldE5hbWUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gIk5vIHN1Y2ggcHJvcGVydHk6ICIgKyBwcm9wZXJ0eSArICIgZm9yIGNsYXNzOiAiICsgdHlwZS5nZXROYW1lKCkgKyAiLiBSZWFzb246ICIgKyBjYXVzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IGNvdWxkIG5vdCBiZSBmb3VuZAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoKSB7CisgICAgICAgIHJldHVybiBwcm9wZXJ0eTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRoZSB0eXBlIG9uIHdoaWNoIHRoZSBwcm9wZXJ0eSB3YXMgYXR0ZW1wdGVkIHRvIGJlIGNhbGxlZAorICAgICAqLworICAgIHB1YmxpYyBDbGFzcyBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gdHlwZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvTXV0YWJsZU1ldGFDbGFzcy5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL011dGFibGVNZXRhQ2xhc3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjNkODEwCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL011dGFibGVNZXRhQ2xhc3MuamF2YQpAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBncm9vdnkubGFuZzsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKKworLyoqCisgKiA8cD5BbiBpbnRlcmZhY2UgdGhhdCBkZWZpbmVzIG1ldGhvZHMgdGhhdCBpbXBsZW1lbnRvcnMgb2YgbXV0YWJsZSBNZXRhIGNsYXNzZXMgc2hvdWxkIHNwZWNpZml5LiBJdCBwcm92aWRlcyBvcGVyYXRpb25zIHRvIHBlcmZvcm0gbXV0YXRpb25zCisgKiBvbiB0aGUgTWV0YUNsYXNzIGluc3RhbmNlLjwvcD4KKyAqCisgKiA8cD5XaGV0aGVyIGEgTWV0YUNsYXNzIGFsbG93cyBtdXRhdGlvbiBpcyB1cCB0byB0aGUgTWV0YUNsYXNzIGl0c2VsZiBhbmQgY29uc2lkZXJhdGlvbnMgb2YgVGhyZWFkIHNhZmV0eQorICogbmVlZCB0byBiZSB0YWtlbiBpbnRvIGFjY291bnQgd2hlbiBtYWtpbmcgYSBNZXRhQ2xhc3MgbXV0YWJsZTwvcD4KKyAqCisgKiA8cD5UaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBhbGxvd3MgbXV0YXRpb24gb2YgTWV0YUNsYXNzIGluc3RhbmNlcyBiZWZvcmUgaW5pdGlhbGlzYXRpb24gKGJlZm9yZSB0aGUgaW5pdGlhbGl6ZSgpIG1ldGhvZCBpcyBjYWxsZWQpCisgKiBidXQgbm90IGFmdGVyLCB0aHVzIGVuc3VyaW5nIFRocmVhZCBzYWZldHkgb25jZSBhIE1ldGFDbGFzcyBoYXMgYmVlbiBjb25zdHJ1Y3RlZCBhbmQgcGxhY2VkIGluIHRoZSByZWdpc3RyeTwvcD4KKyAqCisgKgorICogQHNlZSBNZXRhQ2xhc3NJbXBsCisgKiBAc2VlIE1ldGFDbGFzcworICoKKyAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgorICogQHNpbmNlIDEuMQorICoKKyAqICAgICAgICA8cC8+CisgKiAgICAgICAgQ3JlYXRlZDogRmViIDI0LCAyMDA3CisgKiAgICAgICAgVGltZTogNDowNTo0NCBQTQorICovCitwdWJsaWMgaW50ZXJmYWNlIE11dGFibGVNZXRhQ2xhc3MgZXh0ZW5kcyBNZXRhQ2xhc3MgeworCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgdGhlIE1ldGFDbGFzcyBoYXMgYmVlbiBtb2RpZmllZCBvciBub3QKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgaXQgaGFzCisgICAgICovCisgICAgYm9vbGVhbiBpc01vZGlmaWVkKCk7CisKKyAgICAvKioKKyAgICAgKiBhZGRzIGEgbmV3IGluc3RhbmNlIG1ldGhvZCB0byB0aGlzIE1ldGFDbGFzcy4gSW5zdGFuY2UKKyAgICAgKiBtZXRob2RzIGFyZSBhYmxlIHRvIG92ZXJ3cml0ZSB0aGUgb3JpZ2luYWwgbWV0aG9kcyBvZiB0aGUKKyAgICAgKiBjbGFzcy4gQ2FsbGluZyB0aGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGRvbmUgYWZ0ZXIKKyAgICAgKiBpbml0bGlzZSB3YXMgY2FsbGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1ldGhvZCB0aGUgbWV0aG9kIHRvIGJlIGFkZGVkCisgICAgICovCisgICAgIHZvaWQgYWRkTmV3SW5zdGFuY2VNZXRob2QoTWV0aG9kIG1ldGhvZCk7CisKKyAgICAvKioKKyAgICAgKiBhZGRzIGEgbmV3IHN0YXRpYyBtZXRob2QgdG8gdGhpcyBNZXRhQ2xhc3MuIFRoaXMgaXMgb25seQorICAgICAqIHBvc3NpYmxlIGFzIGxvbmcgYXMgaW5pdGlsaXNlIHdhcyBub3QgY2FsbGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG1ldGhvZCB0aGUgbWV0aG9kIHRvIGJlIGFkZGVkCisgICAgICovCisgICAgIHZvaWQgYWRkTmV3U3RhdGljTWV0aG9kKE1ldGhvZCBtZXRob2QpOworCisgICAgLyoqCisgICAgICogQWRkcyBhIG5ldyBNZXRhTWV0aG9kIHRvIHRoZSBNZXRhQ2xhc3MKKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXRhTWV0aG9kIFRoZSBNZXRhTWV0aG9kIHRvIGFkZAorICAgICAqLworICAgIHZvaWQgYWRkTWV0YU1ldGhvZChNZXRhTWV0aG9kIG1ldGFNZXRob2QpOworCisgICAgLyoqCisgICAgICogQWRkcyBhIG5ldyBNZXRhQmVhblByb3BlcnR5IHRvIHRoZSBNZXRhQ2xhc3MKKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXRhQmVhblByb3BlcnR5IFRoZSBNZXRhQmVhblByb3BlcnR5IGluc3RhbmNlCisgICAgICovCisgICAgdm9pZCBhZGRNZXRhQmVhblByb3BlcnR5KE1ldGFCZWFuUHJvcGVydHkgbWV0YUJlYW5Qcm9wZXJ0eSk7CisgICAgCisgICAgLy8gVE9ETzogQWRkIG1ldGhvZHMgbGlrZSBhZGRNZXRhQ29uc3RydWN0b3IsIGFkZE1ldGFBdHRyaWJ1dGUsIGFkZE1ldGFBbm5vdGF0aW9uIGV0Yy4KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbGFuZy9Ob25FbXB0eVNlcXVlbmNlLmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvTm9uRW1wdHlTZXF1ZW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYjMyMzYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvTm9uRW1wdHlTZXF1ZW5jZS5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBncm9vdnkubGFuZzsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFJlcHJlc2VudHMgYSBzZXF1ZW5jZSBvZiBvYmplY3RzIHdoaWNoIHJlcHJlc2VudHMgb25lIG9yIG1hbnkgaW5zdGFuY2VzIG9mCisgKiBvZiBvYmplY3RzIG9mIGEgZ2l2ZW4gdHlwZS4gVGhlIHR5cGUgY2FuIGJlIG9tbWl0dGVkIGluIHdoaWNoIGNhc2UgYW55IHR5cGUgb2YKKyAqIG9iamVjdCBjYW4gYmUgYWRkZWQuCisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIE5vbkVtcHR5U2VxdWVuY2UgZXh0ZW5kcyBTZXF1ZW5jZSB7CisKKyAgICBwdWJsaWMgTm9uRW1wdHlTZXF1ZW5jZSgpIHsKKyAgICAgICAgc3VwZXIobnVsbCk7CisgICAgfQorCisgICAgcHVibGljIE5vbkVtcHR5U2VxdWVuY2UoQ2xhc3MgdHlwZSkgeworICAgICAgICBzdXBlcih0eXBlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTm9uRW1wdHlTZXF1ZW5jZShDbGFzcyB0eXBlLCBMaXN0IGNvbnRlbnQpIHsKKyAgICAgICAgc3VwZXIodHlwZSwgY29udGVudCk7CisgICAgfQorCisgICAgcHVibGljIGludCBtaW5pbXVtU2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbGFuZy9PYmplY3RSYW5nZS5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL09iamVjdFJhbmdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IxMjY5NQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbGFuZy9PYmplY3RSYW5nZS5qYXZhCkBAIC0wLDAgKzEsNDAzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgZ3Jvb3Z5Lmxhbmc7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuSW52b2tlckhlbHBlcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuSXRlcmF0b3JDbG9zdXJlQWRhcHRlcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuU2NyaXB0Qnl0ZWNvZGVBZGFwdGVyOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS50eXBlaGFuZGxpbmcuRGVmYXVsdFR5cGVUcmFuc2Zvcm1hdGlvbjsKKworaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFJlcHJlc2VudHMgYW4gaW5jbHVzaXZlIGxpc3Qgb2Ygb2JqZWN0cyBmcm9tIGEgdmFsdWUgdG8gYSB2YWx1ZSB1c2luZworICogY29tcGFyYXRvcnMuCisgKiA8cC8+CisgKiBUaGlzIGNsYXNzIGlzIHNpbWlsYXIgdG8ge0BsaW5rIEludFJhbmdlfS4gSWYgeW91IG1ha2UgYW55IGNoYW5nZXMgdG8gdGhpcworICogY2xhc3MsIHlvdSBtaWdodCBjb25zaWRlciBtYWtpbmcgcGFyYWxsZWwgY2hhbmdlcyB0byB7QGxpbmsgSW50UmFuZ2V9LgorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBPYmplY3RSYW5nZSBleHRlbmRzIEFic3RyYWN0TGlzdCBpbXBsZW1lbnRzIFJhbmdlIHsKKworICAgIC8qKgorICAgICAqIFRoZSBmaXJzdCB2YWx1ZSBpbiB0aGUgcmFuZ2UuCisgICAgICovCisgICAgcHJpdmF0ZSBDb21wYXJhYmxlIGZyb207CisKKyAgICAvKioKKyAgICAgKiBUaGUgbGFzdCB2YWx1ZSBpbiB0aGUgcmFuZ2UuCisgICAgICovCisgICAgcHJpdmF0ZSBDb21wYXJhYmxlIHRvOworCisgICAgLyoqCisgICAgICogVGhlIGNhY2hlZCBzaXplLCBvciAtMSBpZiBub3QgeWV0IGNvbXB1dGVkCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgc2l6ZSA9IC0xOworCisgICAgLyoqCisgICAgICogPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHJhbmdlIGNvdW50cyBiYWNrd2FyZHMgZnJvbSA8Y29kZT50bzwvY29kZT4gdG8gPGNvZGU+ZnJvbTwvY29kZT4uCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHJldmVyc2U7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBPYmplY3RSYW5nZX0uIENyZWF0ZXMgYSByZXZlcnNlZCByYW5nZSBpZgorICAgICAqIDxjb2RlPmZyb208L2NvZGU+IDwgPGNvZGU+dG88L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGZyb20gdGhlIGZpcnN0IHZhbHVlIGluIHRoZSByYW5nZS4KKyAgICAgKiBAcGFyYW0gdG8gICB0aGUgbGFzdCB2YWx1ZSBpbiB0aGUgcmFuZ2UuCisgICAgICovCisgICAgcHVibGljIE9iamVjdFJhbmdlKENvbXBhcmFibGUgZnJvbSwgQ29tcGFyYWJsZSB0bykgeworICAgICAgICBpZiAoZnJvbSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNdXN0IHNwZWNpZnkgYSBub24tbnVsbCB2YWx1ZSBmb3IgdGhlICdmcm9tJyBpbmRleCBpbiBhIFJhbmdlIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRvID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk11c3Qgc3BlY2lmeSBhIG5vbi1udWxsIHZhbHVlIGZvciB0aGUgJ3RvJyBpbmRleCBpbiBhIFJhbmdlIik7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLnJldmVyc2UgPSBTY3JpcHRCeXRlY29kZUFkYXB0ZXIuY29tcGFyZUdyZWF0ZXJUaGFuKGZyb20sIHRvKTsKKyAgICAgICAgaWYgKHRoaXMucmV2ZXJzZSkgeworICAgICAgICAgICAgY29uc3RydWN0b3JIZWxwZXIodG8sIGZyb20pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29uc3RydWN0b3JIZWxwZXIoZnJvbSwgdG8pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIE9iamVjdFJhbmdlKENvbXBhcmFibGUgZnJvbSwgQ29tcGFyYWJsZSB0bywgYm9vbGVhbiByZXZlcnNlKSB7CisgICAgICAgIGNvbnN0cnVjdG9ySGVscGVyKGZyb20sIHRvKTsKKworICAgICAgICB0aGlzLnJldmVyc2UgPSByZXZlcnNlOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjb25zdHJ1Y3RvckhlbHBlcihDb21wYXJhYmxlIGZyb20sIENvbXBhcmFibGUgdG8pIHsKKyAgICAgICAgaWYgKGZyb20gaW5zdGFuY2VvZiBTaG9ydCkgeworICAgICAgICAgICAgZnJvbSA9IG5ldyBJbnRlZ2VyKCgoU2hvcnQpIGZyb20pLmludFZhbHVlKCkpOworICAgICAgICB9CisgICAgICAgIGlmICh0byBpbnN0YW5jZW9mIFNob3J0KSB7CisgICAgICAgICAgICB0byA9IG5ldyBJbnRlZ2VyKCgoU2hvcnQpIHRvKS5pbnRWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZnJvbSBpbnN0YW5jZW9mIEZsb2F0KSB7CisgICAgICAgICAgICBmcm9tID0gbmV3IERvdWJsZSgoKEZsb2F0KSBmcm9tKS5kb3VibGVWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodG8gaW5zdGFuY2VvZiBGbG9hdCkgeworICAgICAgICAgICAgdG8gPSBuZXcgRG91YmxlKCgoRmxvYXQpIHRvKS5kb3VibGVWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgICAgICAvLyBUT0RPOiBzaG91bGQgd2UgY2FyZSBhYm91dCBkaWZmZXJlbnQgdHlwZXMgaGVyZT8KKyAgICAgICAgaWYgKGZyb20uZ2V0Q2xhc3MoKSA9PSB0by5nZXRDbGFzcygpKSB7CisgICAgICAgICAgICB0aGlzLmZyb20gPSBmcm9tOworICAgICAgICAgICAgdGhpcy50byA9IHRvOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy5mcm9tID0gbm9ybWFsaXNlU3RyaW5nVHlwZShmcm9tKTsKKyAgICAgICAgICAgIHRoaXMudG8gPSBub3JtYWxpc2VTdHJpbmdUeXBlKHRvKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZnJvbSBpbnN0YW5jZW9mIFN0cmluZyB8fCB0byBpbnN0YW5jZW9mIFN0cmluZykgeworICAgICAgICAgICAgLy8gdGhpcyB0ZXN0IGRlcGVuZHMgZGVlcGx5IG9uIHRoZSBTdHJpbmcubmV4dCBpbXBsZW1lbnRhdGlvbgorICAgICAgICAgICAgLy8gMDA5Lm5leHQgaXMgMDA6LCBub3QgMDEwIAorICAgICAgICAgICAgU3RyaW5nIHN0YXJ0ID0gZnJvbS50b1N0cmluZygpOworICAgICAgICAgICAgU3RyaW5nIGVuZCA9IHRvLnRvU3RyaW5nKCk7CisgICAgICAgICAgICBpZiAoc3RhcnQubGVuZ3RoKCkgPiBlbmQubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbmNvbXBhdGlibGUgU3RyaW5ncyBmb3IgUmFuZ2U6IHN0YXJ0aW5nIFN0cmluZyBpcyBsb25nZXIgdGhhbiBlbmRpbmcgc3RyaW5nIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gTWF0aC5taW4oc3RhcnQubGVuZ3RoKCksIGVuZC5sZW5ndGgoKSk7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChzdGFydC5jaGFyQXQoaSkgIT0gZW5kLmNoYXJBdChpKSkgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaSA8IGxlbmd0aCAtIDEpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbmNvbXBhdGlibGUgU3RyaW5ncyBmb3IgUmFuZ2U6IFN0cmluZyNuZXh0KCkgd2lsbCBub3QgcmVhY2ggdGhlIGV4cGVjdGVkIHZhbHVlIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHRoYXQpIHsKKyAgICAgICAgcmV0dXJuICh0aGF0IGluc3RhbmNlb2YgT2JqZWN0UmFuZ2UpID8gZXF1YWxzKChPYmplY3RSYW5nZSkgdGhhdCkgOiBzdXBlci5lcXVhbHModGhhdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGFyZXMgYW4ge0BsaW5rIE9iamVjdFJhbmdlfSB0byBhbm90aGVyIHtAbGluayBPYmplY3RSYW5nZX0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSByYW5nZXMgYXJlIGVxdWFsCisgICAgICogQHBhcmFtIHRoYXQgdGhlIG9iamVjdCB0byBjaGVjayBlcXVhbGl0eSB3aXRoCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdFJhbmdlIHRoYXQpIHsKKyAgICAgICAgcmV0dXJuIHRoYXQgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIHRoaXMucmV2ZXJzZSA9PSB0aGF0LnJldmVyc2UKKyAgICAgICAgICAgICAgICAmJiBEZWZhdWx0VHlwZVRyYW5zZm9ybWF0aW9uLmNvbXBhcmVFcXVhbCh0aGlzLmZyb20sIHRoYXQuZnJvbSkKKyAgICAgICAgICAgICAgICAmJiBEZWZhdWx0VHlwZVRyYW5zZm9ybWF0aW9uLmNvbXBhcmVFcXVhbCh0aGlzLnRvLCB0aGF0LnRvKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIENvbXBhcmFibGUgZ2V0RnJvbSgpIHsKKyAgICAgICAgcmV0dXJuIGZyb207CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHB1YmxpYyBDb21wYXJhYmxlIGdldFRvKCkgeworICAgICAgICByZXR1cm4gdG87CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUmV2ZXJzZSgpIHsKKyAgICAgICAgcmV0dXJuIHJldmVyc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0KGludCBpbmRleCkgeworICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiSW5kZXg6ICIgKyBpbmRleCArICIgc2hvdWxkIG5vdCBiZSBuZWdhdGl2ZSIpOworICAgICAgICB9CisgICAgICAgIGlmIChpbmRleCA+PSBzaXplKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJJbmRleDogIiArIGluZGV4ICsgIiBpcyB0b28gYmlnIGZvciByYW5nZTogIiArIHRoaXMpOworICAgICAgICB9CisgICAgICAgIE9iamVjdCB2YWx1ZTsKKyAgICAgICAgaWYgKHJldmVyc2UpIHsKKyAgICAgICAgICAgIHZhbHVlID0gdG87CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5kZXg7IGkrKykgeworICAgICAgICAgICAgICAgIHZhbHVlID0gZGVjcmVtZW50KHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZhbHVlID0gZnJvbTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5kZXg7IGkrKykgeworICAgICAgICAgICAgICAgIHZhbHVlID0gaW5jcmVtZW50KHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigpIHsKKyAgICAgICAgICAgIHByaXZhdGUgaW50IGluZGV4OworICAgICAgICAgICAgcHJpdmF0ZSBPYmplY3QgdmFsdWUgPSByZXZlcnNlID8gdG8gOiBmcm9tOworCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworICAgICAgICAgICAgICAgIHJldHVybiBpbmRleCA8IHNpemUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIE9iamVjdCBuZXh0KCkgeworICAgICAgICAgICAgICAgIGlmIChpbmRleCsrID4gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiBzaXplKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXZlcnNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBkZWNyZW1lbnQodmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGluY3JlbWVudCh2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0UmFuZ2UudGhpcy5yZW1vdmUoaW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyB3aGV0aGVyIGEgdmFsdWUgaXMgYmV0d2VlbiB0aGUgZnJvbSBhbmQgdG8gdmFsdWVzIG9mIGEgUmFuZ2UKKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgb2YgaW50ZXJlc3QKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIGlzIHdpdGhpbiB0aGUgYm91bmRzCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNXaXRoaW5Cb3VuZHMoT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIENvbXBhcmFibGUpIHsKKyAgICAgICAgICAgIGludCByZXN1bHQgPSBmcm9tLmNvbXBhcmVUbyh2YWx1ZSk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0ID09IDAgfHwgcmVzdWx0IDwgMCAmJiB0by5jb21wYXJlVG8odmFsdWUpID49IDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvbnRhaW5zKHZhbHVlKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgICAgIGlmIChzaXplID09IC0xKSB7CisgICAgICAgICAgICBpZiAoZnJvbSBpbnN0YW5jZW9mIEludGVnZXIgJiYgdG8gaW5zdGFuY2VvZiBJbnRlZ2VyCisgICAgICAgICAgICAgICAgICAgIHx8IGZyb20gaW5zdGFuY2VvZiBMb25nICYmIHRvIGluc3RhbmNlb2YgTG9uZykgeworICAgICAgICAgICAgICAgIC8vIGxldCdzIGZhc3QgY2FsY3VsYXRlIHRoZSBzaXplCisgICAgICAgICAgICAgICAgc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgaW50IGZyb21OdW0gPSAoKE51bWJlcikgZnJvbSkuaW50VmFsdWUoKTsKKyAgICAgICAgICAgICAgICBpbnQgdG9OdW0gPSAoKE51bWJlcikgdG8pLmludFZhbHVlKCk7CisgICAgICAgICAgICAgICAgc2l6ZSA9IHRvTnVtIC0gZnJvbU51bSArIDE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGZyb20gaW5zdGFuY2VvZiBDaGFyYWN0ZXIgJiYgdG8gaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsKKyAgICAgICAgICAgICAgICAvLyBsZXQncyBmYXN0IGNhbGN1bGF0ZSB0aGUgc2l6ZQorICAgICAgICAgICAgICAgIHNpemUgPSAwOworICAgICAgICAgICAgICAgIGNoYXIgZnJvbU51bSA9ICgoQ2hhcmFjdGVyKSBmcm9tKS5jaGFyVmFsdWUoKTsKKyAgICAgICAgICAgICAgICBjaGFyIHRvTnVtID0gKChDaGFyYWN0ZXIpIHRvKS5jaGFyVmFsdWUoKTsKKyAgICAgICAgICAgICAgICBzaXplID0gdG9OdW0gLSBmcm9tTnVtICsgMTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZnJvbSBpbnN0YW5jZW9mIEJpZ0RlY2ltYWwgfHwgdG8gaW5zdGFuY2VvZiBCaWdEZWNpbWFsKSB7CisgICAgICAgICAgICAgICAgLy8gbGV0J3MgZmFzdCBjYWxjdWxhdGUgdGhlIHNpemUKKyAgICAgICAgICAgICAgICBzaXplID0gMDsKKyAgICAgICAgICAgICAgICBCaWdEZWNpbWFsIGZyb21OdW0gPSBuZXcgQmlnRGVjaW1hbCgiIiArIGZyb20pOworICAgICAgICAgICAgICAgIEJpZ0RlY2ltYWwgdG9OdW0gPSBuZXcgQmlnRGVjaW1hbCgiIiArIHRvKTsKKyAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIHNpemVOdW0gPSB0b051bS5zdWJ0cmFjdChmcm9tTnVtKS5hZGQobmV3IEJpZ0RlY2ltYWwoMS4wKSkudG9CaWdJbnRlZ2VyKCk7CisgICAgICAgICAgICAgICAgc2l6ZSA9IHNpemVOdW0uaW50VmFsdWUoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gbGV0J3MgbGF6aWx5IGNhbGN1bGF0ZSB0aGUgc2l6ZQorICAgICAgICAgICAgICAgIHNpemUgPSAwOworICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGZyb207CisgICAgICAgICAgICAgICAgd2hpbGUgKHRvLmNvbXBhcmVUbyh2YWx1ZSkgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGluY3JlbWVudCh2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIHNpemUrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNpemU7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHB1YmxpYyBMaXN0IHN1Ykxpc3QoaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgpIHsKKyAgICAgICAgaWYgKGZyb21JbmRleCA8IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJmcm9tSW5kZXggPSAiICsgZnJvbUluZGV4KTsKKyAgICAgICAgfQorICAgICAgICBpZiAodG9JbmRleCA+IHNpemUoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oInRvSW5kZXggPSAiICsgdG9JbmRleCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZyb21JbmRleCA+IHRvSW5kZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImZyb21JbmRleCgiICsgZnJvbUluZGV4ICsgIikgPiB0b0luZGV4KCIgKyB0b0luZGV4ICsgIikiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZnJvbUluZGV4ID09IHRvSW5kZXgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRW1wdHlSYW5nZShmcm9tKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXcgT2JqZWN0UmFuZ2UoKENvbXBhcmFibGUpIGdldChmcm9tSW5kZXgpLCAoQ29tcGFyYWJsZSkgZ2V0KC0tdG9JbmRleCksIHJldmVyc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gcmV2ZXJzZSA/ICIiICsgdG8gKyAiLi4iICsgZnJvbSA6ICIiICsgZnJvbSArICIuLiIgKyB0bzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBpbnNwZWN0KCkgeworICAgICAgICBTdHJpbmcgdG9UZXh0ID0gSW52b2tlckhlbHBlci5pbnNwZWN0KHRvKTsKKyAgICAgICAgU3RyaW5nIGZyb21UZXh0ID0gSW52b2tlckhlbHBlci5pbnNwZWN0KGZyb20pOworICAgICAgICByZXR1cm4gcmV2ZXJzZSA/ICIiICsgdG9UZXh0ICsgIi4uIiArIGZyb21UZXh0IDogIiIgKyBmcm9tVGV4dCArICIuLiIgKyB0b1RleHQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ID0gaXRlcmF0b3IoKTsKKyAgICAgICAgaWYgKHZhbHVlPT1udWxsKSByZXR1cm4gZmFsc2U7CisgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKERlZmF1bHRUeXBlVHJhbnNmb3JtYXRpb24uY29tcGFyZUVxdWFsKHZhbHVlLCBpdC5uZXh0KCkpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RlcChpbnQgc3RlcCwgQ2xvc3VyZSBjbG9zdXJlKSB7CisgICAgICAgIGlmIChyZXZlcnNlKSB7CisgICAgICAgICAgICBzdGVwID0gLXN0ZXA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0ZXAgPj0gMCkgeworICAgICAgICAgICAgQ29tcGFyYWJsZSB2YWx1ZSA9IGZyb207CisgICAgICAgICAgICB3aGlsZSAodmFsdWUuY29tcGFyZVRvKHRvKSA8PSAwKSB7CisgICAgICAgICAgICAgICAgY2xvc3VyZS5jYWxsKHZhbHVlKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0ZXA7IGkrKykgeworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IChDb21wYXJhYmxlKSBpbmNyZW1lbnQodmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0ZXAgPSAtc3RlcDsKKyAgICAgICAgICAgIENvbXBhcmFibGUgdmFsdWUgPSB0bzsKKyAgICAgICAgICAgIHdoaWxlICh2YWx1ZS5jb21wYXJlVG8oZnJvbSkgPj0gMCkgeworICAgICAgICAgICAgICAgIGNsb3N1cmUuY2FsbCh2YWx1ZSk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdGVwOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAoQ29tcGFyYWJsZSkgZGVjcmVtZW50KHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIExpc3Qgc3RlcChpbnQgc3RlcCkgeworICAgICAgICBJdGVyYXRvckNsb3N1cmVBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgSXRlcmF0b3JDbG9zdXJlQWRhcHRlcih0aGlzKTsKKyAgICAgICAgc3RlcChzdGVwLCBhZGFwdGVyKTsKKyAgICAgICAgcmV0dXJuIGFkYXB0ZXIuYXNMaXN0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5jcmVtZW50cyBieSBvbmUKKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gaW5jcmVtZW50CisgICAgICogQHJldHVybiB0aGUgaW5jcmVtZW50ZWQgdmFsdWUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgT2JqZWN0IGluY3JlbWVudChPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIEludm9rZXJIZWxwZXIuaW52b2tlTWV0aG9kKHZhbHVlLCAibmV4dCIsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlY3JlbWVudHMgYnkgb25lCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIGRlY3JlbWVudAorICAgICAqIEByZXR1cm4gdGhlIGRlY3JlbWVudGVkIHZhbHVlCisgICAgICovCisgICAgcHJvdGVjdGVkIE9iamVjdCBkZWNyZW1lbnQoT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIHJldHVybiBJbnZva2VySGVscGVyLmludm9rZU1ldGhvZCh2YWx1ZSwgInByZXZpb3VzIiwgbnVsbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgQ29tcGFyYWJsZSBub3JtYWxpc2VTdHJpbmdUeXBlKGZpbmFsIENvbXBhcmFibGUgb3BlcmFuZCkgeworICAgICAgICBpZiAob3BlcmFuZCBpbnN0YW5jZW9mIENoYXJhY3RlcikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnRlZ2VyKCgoQ2hhcmFjdGVyKSBvcGVyYW5kKS5jaGFyVmFsdWUoKSk7CisgICAgICAgIH0gZWxzZSBpZiAob3BlcmFuZCBpbnN0YW5jZW9mIFN0cmluZykgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHN0cmluZyA9IChTdHJpbmcpIG9wZXJhbmQ7CisKKyAgICAgICAgICAgIGlmIChzdHJpbmcubGVuZ3RoKCkgPT0gMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEludGVnZXIoc3RyaW5nLmNoYXJBdCgwKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIHN0cmluZzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBvcGVyYW5kOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL1BhcmFtZXRlckFycmF5LmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvUGFyYW1ldGVyQXJyYXkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTYyZjVkCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL1BhcmFtZXRlckFycmF5LmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGdyb292eS5sYW5nOworCisvKioKKyAqIERpc3Rpbmd1aXNoIGEgcGFyYW1ldGVyIGFycmF5IGZyb20gT2JqZWN0W10uCisgKgorICogQGF1dGhvciBQaWxobyBLaW0KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIFBhcmFtZXRlckFycmF5IHsKKworICAgIHByaXZhdGUgT2JqZWN0IHBhcmFtZXRlcnM7CisKKyAgICBwdWJsaWMgUGFyYW1ldGVyQXJyYXkoT2JqZWN0IGRhdGEpIHsKKyAgICAgICAgcGFyYW1ldGVycyA9IHBhY2tBcnJheShkYXRhKTsKKyAgICB9CisKKyAgICBwcml2YXRlIE9iamVjdCBwYWNrQXJyYXkoT2JqZWN0IG9iamVjdCkgeworICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgT2JqZWN0W10pCisgICAgICAgICAgICByZXR1cm4gKE9iamVjdFtdKSBvYmplY3Q7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBvYmplY3Q7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXQoKSB7CisgICAgICAgIHJldHVybiBwYXJhbWV0ZXJzOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIGlmIChwYXJhbWV0ZXJzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gIjxudWxsIHBhcmFtZXRlcj4iOworICAgICAgICByZXR1cm4gcGFyYW1ldGVycy50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbGFuZy9Qcm9wZXJ0eUFjY2Vzc0ludGVyY2VwdG9yLmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvUHJvcGVydHlBY2Nlc3NJbnRlcmNlcHRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMjM3OGUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvUHJvcGVydHlBY2Nlc3NJbnRlcmNlcHRvci5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBncm9vdnkubGFuZzsKKworLyoqCisgKiA8cD5BbiBpbnRlcmZhY2UgdGhhdCBhZGRzIHRoZSBhYmlsaXR5IHRvIGludGVyY2VwdAorICogcHJvcGVydHkgZ2V0dGVycy9zZXR0ZXJzCisgKgorICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCisgKiBAc2luY2UgT2N0IDI0LCAyMDA1CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlBY2Nlc3NJbnRlcmNlcHRvciBleHRlbmRzIEludGVyY2VwdG9yICB7CisKKwkvKioKKwkgKiBJbnRlcmNlcHRzIGEgZ2V0WFhYIGNhbGwgYW5kIHJldHVybnMgYSByZXN1bHQuIFRoZSByZXN1bHQgaXMgcmVwbGFjZWQgYnkgdGhlCisJICogcmVhbCB2YWx1ZSBpZiBkb0dldCgpIHJldHVybiBmYWxzZQorCSAqCisJICogQHBhcmFtIG9iamVjdCBUaGUgdGFyZ2V0IG9iamVjdAorCSAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgdG8gZ2V0CisJICoKKwkgKiBAcmV0dXJuIEEgdmFsdWUgc3VwcGxpZWQgYnkgdGhlIGludGVyY2VwdG9yCisJICovCisJT2JqZWN0IGJlZm9yZUdldChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpOworCisJLyoqCisJICogSW50ZXJjZXB0cyBhIHNldFhYWCBjYWxsCisJICoKKwkgKiBAcGFyYW0gb2JqZWN0IFRoZSB0YXJnZXQgb2JqZWN0CisJICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSB0byBzZXQKKwkgKiBAcGFyYW0gbmV3VmFsdWUgVGhlIG5ldyB2YWx1ZQorCSAqCisJICovCisJdm9pZCBiZWZvcmVTZXQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgbmV3VmFsdWUpOworCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvUHJvcGVydHlWYWx1ZS5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL1Byb3BlcnR5VmFsdWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzM2YmM2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL1Byb3BlcnR5VmFsdWUuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBncm9vdnkubGFuZzsKKworcHVibGljIGNsYXNzIFByb3BlcnR5VmFsdWUgeworCS8vIHRoZSBvd25lciBvZiB0aGUgcHJvcGVydHkKKwlwcml2YXRlIE9iamVjdCBiZWFuOworCQorCS8vIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvcGVydHkKKwlwcml2YXRlIE1ldGFQcm9wZXJ0eSBtcDsKKwkKKwlwdWJsaWMgUHJvcGVydHlWYWx1ZShPYmplY3QgYmVhbiwgTWV0YVByb3BlcnR5IG1wKSB7CisJCXRoaXMuYmVhbiA9IGJlYW47CisJCXRoaXMubXAgPSBtcDsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gbXAuZ2V0TmFtZSgpOworCX0KKwkKKwlwdWJsaWMgQ2xhc3MgZ2V0VHlwZSgpIHsKKwkJcmV0dXJuIG1wLmdldFR5cGUoKTsKKwl9CisJCisJcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKKwkJcmV0dXJuIG1wLmdldFByb3BlcnR5KGJlYW4pOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpICB7CisJCW1wLnNldFByb3BlcnR5KGJlYW4sIHZhbHVlKTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbGFuZy9Qcm94eU1ldGFDbGFzcy5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL1Byb3h5TWV0YUNsYXNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYxZTA5NgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbGFuZy9Qcm94eU1ldGFDbGFzcy5qYXZhCkBAIC0wLDAgKzEsMjI2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgZ3Jvb3Z5Lmxhbmc7CisKK2ltcG9ydCBqYXZhLmJlYW5zLkludHJvc3BlY3Rpb25FeGNlcHRpb247CisKKy8qKgorICogQXMgc3ViY2xhc3Mgb2YgTWV0YUNsYXNzLCBQcm94eU1ldGFDbGFzcyBtYW5hZ2VzIGNhbGxzIGZyb20gR3Jvb3Z5IE9iamVjdHMgdG8gUE9KT3MuCisgKiBJdCBlbnJpY2hlcyBNZXRhQ2xhc3Mgd2l0aCB0aGUgZmVhdHVyZSBvZiBtYWtpbmcgbWV0aG9kIGludm9rYXRpb25zIGludGVyY2VwdGFibGUgYnkKKyAqIGFuIEludGVyY2VwdG9yLiBUbyB0aGlzIGVuZCwgaXQgYWN0cyBhcyBhIGRlY29yYXRvciAoZGVjb3JhdG9yIHBhdHRlcm4pIGFsbG93aW5nCisgKiB0byBhZGQgb3Igd2l0aGRyYXcgdGhpcyBmZWF0dXJlIGF0IHJ1bnRpbWUuCisgKiBTZWUgZ3Jvb3Z5L2xhbmcvSW50ZXJjZXB0b3JUZXN0Lmdyb292eSBmb3IgZGV0YWlscy4KKyAqIDxwLz4KKyAqIDxwPldBUk5JTkc6IFRoaXMgaW1wbGVtZW50YXRpb24gb2YgUHJveHlNZXRhQ2xhc3MgaXMgTk9UIHRocmVhZHNhZmUgYW5kIGhlbmNlIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yCisgKiBhcyBhIHBlci1pbnN0YW5jZSBNZXRhQ2xhc3MgcnVubmluZyBpbiBhIHNpbmdsZSB0aHJlYWQuIERvIG5vdCBwbGFjZSB0aGlzIE1ldGFDbGFzcyBpbiB0aGUgTWV0YUNsYXNzUmVnaXN0cnkKKyAqIGFzIGl0IHdpbGwgcmVzdWx0IGluIHVucHJlZGljdGFibGUgYmVoYXZpb3VyCisgKgorICogQGF1dGhvciBEaWVyayBLb2VuaWcKKyAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgorICogQHNlZSBncm9vdnkubGFuZy5NZXRhQ2xhc3NSZWdpc3RyeQorICovCitwdWJsaWMgY2xhc3MgUHJveHlNZXRhQ2xhc3MgZXh0ZW5kcyBNZXRhQ2xhc3NJbXBsIGltcGxlbWVudHMgQWRhcHRpbmdNZXRhQ2xhc3MgeworCisgICAgcHJvdGVjdGVkIE1ldGFDbGFzcyBhZGFwdGVlID0gbnVsbDsKKyAgICBwcm90ZWN0ZWQgSW50ZXJjZXB0b3IgaW50ZXJjZXB0b3IgPSBudWxsOworCisKKyAgICAvKioKKyAgICAgKiBjb252ZW5pZW5jZSBmYWN0b3J5IG1ldGhvZCBmb3IgdGhlIG1vc3QgdXN1YWwgY2FzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFByb3h5TWV0YUNsYXNzIGdldEluc3RhbmNlKENsYXNzIHRoZUNsYXNzKSB0aHJvd3MgSW50cm9zcGVjdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIE1ldGFDbGFzc1JlZ2lzdHJ5IG1ldGFSZWdpc3RyeSA9IEdyb292eVN5c3RlbS5nZXRNZXRhQ2xhc3NSZWdpc3RyeSgpOworICAgICAgICBNZXRhQ2xhc3MgbWV0YSA9IG1ldGFSZWdpc3RyeS5nZXRNZXRhQ2xhc3ModGhlQ2xhc3MpOworICAgICAgICByZXR1cm4gbmV3IFByb3h5TWV0YUNsYXNzKG1ldGFSZWdpc3RyeSwgdGhlQ2xhc3MsIG1ldGEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBhZGFwdGVlIHRoZSBNZXRhQ2xhc3MgdG8gZGVjb3JhdGUgd2l0aCBpbnRlcmNlcHRhYmlsaXR5CisgICAgICovCisgICAgcHVibGljIFByb3h5TWV0YUNsYXNzKE1ldGFDbGFzc1JlZ2lzdHJ5IHJlZ2lzdHJ5LCBDbGFzcyB0aGVDbGFzcywgTWV0YUNsYXNzIGFkYXB0ZWUpIHRocm93cyBJbnRyb3NwZWN0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIocmVnaXN0cnksIHRoZUNsYXNzKTsKKyAgICAgICAgdGhpcy5hZGFwdGVlID0gYWRhcHRlZTsKKyAgICAgICAgaWYgKG51bGwgPT0gYWRhcHRlZSkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYWRhcHRlZSBtdXN0IG5vdCBiZSBudWxsIik7CisgICAgICAgIHN1cGVyLmluaXRpYWxpemUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKKyAgICAgICAgdGhpcy5hZGFwdGVlLmluaXRpYWxpemUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVc2UgdGhlIFByb3h5TWV0YUNsYXNzIGZvciB0aGUgZ2l2ZW4gQ2xvc3VyZS4KKyAgICAgKiBDYXJlcyBmb3IgYmFsYW5jZWQgcmVnaXN0ZXIvdW5yZWdpc3Rlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbG9zdXJlIHBpZWNlIG9mIGNvZGUgdG8gYmUgZXhlY3V0ZWQgd2l0aCByZWdpc3RlcmVkIFByb3h5TWV0YUNsYXNzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdXNlKENsb3N1cmUgY2xvc3VyZSkgeworICAgICAgICAvLyBncmFiIGV4aXN0aW5nIG1ldGEgKHVzdWFsbHkgYWRhcHRlZSBidXQgd2UgbWF5IGhhdmUgbmVzdGVkIHVzZSBjYWxscykKKyAgICAgICAgTWV0YUNsYXNzIG9yaWdNZXRhQ2xhc3MgPSByZWdpc3RyeS5nZXRNZXRhQ2xhc3ModGhlQ2xhc3MpOworICAgICAgICByZWdpc3RyeS5zZXRNZXRhQ2xhc3ModGhlQ2xhc3MsIHRoaXMpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2xvc3VyZS5jYWxsKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICByZWdpc3RyeS5zZXRNZXRhQ2xhc3ModGhlQ2xhc3MsIG9yaWdNZXRhQ2xhc3MpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlIHRoZSBQcm94eU1ldGFDbGFzcyBmb3IgdGhlIGdpdmVuIENsb3N1cmUuCisgICAgICogQ2FyZXMgZm9yIGJhbGFuY2VkIHNldHRpbmcvdW5zZXR0aW5nIFByb3h5TWV0YUNsYXNzLgorICAgICAqCisgICAgICogQHBhcmFtIGNsb3N1cmUgcGllY2Ugb2YgY29kZSB0byBiZSBleGVjdXRlZCB3aXRoIFByb3h5TWV0YUNsYXNzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdXNlKEdyb292eU9iamVjdCBvYmplY3QsIENsb3N1cmUgY2xvc3VyZSkgeworICAgICAgICAvLyBncmFiIGV4aXN0aW5nIG1ldGEgKHVzdWFsbHkgYWRhcHRlZSBidXQgd2UgbWF5IGhhdmUgbmVzdGVkIHVzZSBjYWxscykKKyAgICAgICAgTWV0YUNsYXNzIG9yaWdNZXRhQ2xhc3MgPSBvYmplY3QuZ2V0TWV0YUNsYXNzKCk7CisgICAgICAgIG9iamVjdC5zZXRNZXRhQ2xhc3ModGhpcyk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjbG9zdXJlLmNhbGwoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIG9iamVjdC5zZXRNZXRhQ2xhc3Mob3JpZ01ldGFDbGFzcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBpbnRlcmNlcHRvciBpbiB1c2Ugb3IgbnVsbCBpZiBubyBpbnRlcmNlcHRvciBpcyB1c2VkCisgICAgICovCisgICAgcHVibGljIEludGVyY2VwdG9yIGdldEludGVyY2VwdG9yKCkgeworICAgICAgICByZXR1cm4gaW50ZXJjZXB0b3I7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGludGVyY2VwdG9yIG1heSBiZSBudWxsIHRvIHJlc2V0IGFueSBpbnRlcmNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbnRlcmNlcHRvcihJbnRlcmNlcHRvciBpbnRlcmNlcHRvcikgeworICAgICAgICB0aGlzLmludGVyY2VwdG9yID0gaW50ZXJjZXB0b3I7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbCBpbnZva2VNZXRob2Qgb24gYWRhcHRlZSB3aXRoIGxvZ2ljIGxpa2UgaW4gTWV0YUNsYXNzIHVubGVzcyB3ZSBoYXZlIGFuIEludGVyY2VwdG9yLgorICAgICAqIFdpdGggSW50ZXJjZXB0b3IgdGhlIGNhbGwgaXMgbmVzdGVkIGluIGl0cyBiZWZvcmVJbnZva2UgYW5kIGFmdGVySW52b2tlIG1ldGhvZHMuCisgICAgICogVGhlIG1ldGhvZCBjYWxsIGlzIHN1cHByZXNzZWQgaWYgSW50ZXJjZXB0b3IuZG9JbnZva2UoKSByZXR1cm5zIGZhbHNlLgorICAgICAqIFNlZSBJbnRlcmNlcHRvciBmb3IgZGV0YWlscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGludm9rZU1ldGhvZChmaW5hbCBPYmplY3Qgb2JqZWN0LCBmaW5hbCBTdHJpbmcgbWV0aG9kTmFtZSwgZmluYWwgT2JqZWN0W10gYXJndW1lbnRzKSB7CisgICAgICAgIHJldHVybiBkb0NhbGwob2JqZWN0LCBtZXRob2ROYW1lLCBhcmd1bWVudHMsIGludGVyY2VwdG9yLCBuZXcgQ2FsbGFibGUoKSB7CisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGNhbGwoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFkYXB0ZWUuaW52b2tlTWV0aG9kKG9iamVjdCwgbWV0aG9kTmFtZSwgYXJndW1lbnRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbCBpbnZva2VTdGF0aWNNZXRob2Qgb24gYWRhcHRlZSB3aXRoIGxvZ2ljIGxpa2UgaW4gTWV0YUNsYXNzIHVubGVzcyB3ZSBoYXZlIGFuIEludGVyY2VwdG9yLgorICAgICAqIFdpdGggSW50ZXJjZXB0b3IgdGhlIGNhbGwgaXMgbmVzdGVkIGluIGl0cyBiZWZvcmVJbnZva2UgYW5kIGFmdGVySW52b2tlIG1ldGhvZHMuCisgICAgICogVGhlIG1ldGhvZCBjYWxsIGlzIHN1cHByZXNzZWQgaWYgSW50ZXJjZXB0b3IuZG9JbnZva2UoKSByZXR1cm5zIGZhbHNlLgorICAgICAqIFNlZSBJbnRlcmNlcHRvciBmb3IgZGV0YWlscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGludm9rZVN0YXRpY01ldGhvZChmaW5hbCBPYmplY3Qgb2JqZWN0LCBmaW5hbCBTdHJpbmcgbWV0aG9kTmFtZSwgZmluYWwgT2JqZWN0W10gYXJndW1lbnRzKSB7CisgICAgICAgIHJldHVybiBkb0NhbGwob2JqZWN0LCBtZXRob2ROYW1lLCBhcmd1bWVudHMsIGludGVyY2VwdG9yLCBuZXcgQ2FsbGFibGUoKSB7CisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGNhbGwoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFkYXB0ZWUuaW52b2tlU3RhdGljTWV0aG9kKG9iamVjdCwgbWV0aG9kTmFtZSwgYXJndW1lbnRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbCBpbnZva2VDb25zdHJ1Y3RvciBvbiBhZGFwdGVlIHdpdGggbG9naWMgbGlrZSBpbiBNZXRhQ2xhc3MgdW5sZXNzIHdlIGhhdmUgYW4gSW50ZXJjZXB0b3IuCisgICAgICogV2l0aCBJbnRlcmNlcHRvciB0aGUgY2FsbCBpcyBuZXN0ZWQgaW4gaXRzIGJlZm9yZUludm9rZSBhbmQgYWZ0ZXJJbnZva2UgbWV0aG9kcy4KKyAgICAgKiBUaGUgbWV0aG9kIGNhbGwgaXMgc3VwcHJlc3NlZCBpZiBJbnRlcmNlcHRvci5kb0ludm9rZSgpIHJldHVybnMgZmFsc2UuCisgICAgICogU2VlIEludGVyY2VwdG9yIGZvciBkZXRhaWxzLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgaW52b2tlQ29uc3RydWN0b3IoZmluYWwgT2JqZWN0W10gYXJndW1lbnRzKSB7CisgICAgICAgIHJldHVybiBkb0NhbGwodGhlQ2xhc3MsICJjdG9yIiwgYXJndW1lbnRzLCBpbnRlcmNlcHRvciwgbmV3IENhbGxhYmxlKCkgeworICAgICAgICAgICAgcHVibGljIE9iamVjdCBjYWxsKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBhZGFwdGVlLmludm9rZUNvbnN0cnVjdG9yKGFyZ3VtZW50cyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludGVyY2VwdG9ycyB0aGUgY2FsbCB0byBnZXRQcm9wZXJ0eSBpZiBhIFByb3BlcnR5QWNjZXNzSW50ZXJjZXB0b3IgaXMKKyAgICAgKiBhdmFpbGFibGUKKyAgICAgKgorICAgICAqIEBwYXJhbSBvYmplY3QgICB0aGUgb2JqZWN0IHRvIGludm9rZSB0aGUgZ2V0dGVyIG9uCisgICAgICogQHBhcmFtIHByb3BlcnR5IHRoZSBwcm9wZXJ0eSBuYW1lCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5CisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShDbGFzcyBhQ2xhc3MsIE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSwgYm9vbGVhbiBiLCBib29sZWFuIGIxKSB7CisgICAgICAgIGlmIChudWxsID09IGludGVyY2VwdG9yKSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0UHJvcGVydHkoYUNsYXNzLCBvYmplY3QsIHByb3BlcnR5LCBiLCBiMSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGludGVyY2VwdG9yIGluc3RhbmNlb2YgUHJvcGVydHlBY2Nlc3NJbnRlcmNlcHRvcikgeworICAgICAgICAgICAgUHJvcGVydHlBY2Nlc3NJbnRlcmNlcHRvciBwYWUgPSAoUHJvcGVydHlBY2Nlc3NJbnRlcmNlcHRvcikgaW50ZXJjZXB0b3I7CisKKyAgICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBwYWUuYmVmb3JlR2V0KG9iamVjdCwgcHJvcGVydHkpOworICAgICAgICAgICAgaWYgKGludGVyY2VwdG9yLmRvSW52b2tlKCkpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBzdXBlci5nZXRQcm9wZXJ0eShhQ2xhc3MsIG9iamVjdCwgcHJvcGVydHksIGIsIGIxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLmdldFByb3BlcnR5KGFDbGFzcywgb2JqZWN0LCBwcm9wZXJ0eSwgYiwgYjEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludGVyY2VwdG9ycyB0aGUgY2FsbCB0byBhIHByb3BlcnR5IHNldHRlciBpZiBhIFByb3BlcnR5QWNjZXNzSW50ZXJjZXB0b3IKKyAgICAgKiBpcyBhdmFpbGFibGUKKyAgICAgKgorICAgICAqIEBwYXJhbSBvYmplY3QgICBUaGUgb2JqZWN0IHRvIGludm9rZSB0aGUgc2V0dGVyIG9uCisgICAgICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSBuYW1lIHRvIHNldAorICAgICAqIEBwYXJhbSBuZXdWYWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KENsYXNzIGFDbGFzcywgT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgbmV3VmFsdWUsIGJvb2xlYW4gYiwgYm9vbGVhbiBiMSkgeworICAgICAgICBpZiAobnVsbCA9PSBpbnRlcmNlcHRvcikgeworICAgICAgICAgICAgc3VwZXIuc2V0UHJvcGVydHkoYUNsYXNzLCBvYmplY3QsIHByb3BlcnR5LCBuZXdWYWx1ZSwgYiwgYjEpOworICAgICAgICB9CisgICAgICAgIGlmIChpbnRlcmNlcHRvciBpbnN0YW5jZW9mIFByb3BlcnR5QWNjZXNzSW50ZXJjZXB0b3IpIHsKKyAgICAgICAgICAgIFByb3BlcnR5QWNjZXNzSW50ZXJjZXB0b3IgcGFlID0gKFByb3BlcnR5QWNjZXNzSW50ZXJjZXB0b3IpIGludGVyY2VwdG9yOworCisgICAgICAgICAgICBwYWUuYmVmb3JlU2V0KG9iamVjdCwgcHJvcGVydHksIG5ld1ZhbHVlKTsKKyAgICAgICAgICAgIGlmIChpbnRlcmNlcHRvci5kb0ludm9rZSgpKSB7CisgICAgICAgICAgICAgICAgc3VwZXIuc2V0UHJvcGVydHkoYUNsYXNzLCBvYmplY3QsIHByb3BlcnR5LCBuZXdWYWx1ZSwgYiwgYjEpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3VwZXIuc2V0UHJvcGVydHkoYUNsYXNzLCBvYmplY3QsIHByb3BlcnR5LCBuZXdWYWx1ZSwgYiwgYjEpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIE1ldGFDbGFzcyBnZXRBZGFwdGVlKCkgeworICAgICAgICByZXR1cm4gdGhpcy5hZGFwdGVlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEFkYXB0ZWUoTWV0YUNsYXNzIG1ldGFDbGFzcykgeworICAgICAgICB0aGlzLmFkYXB0ZWUgPSBtZXRhQ2xhc3M7CisgICAgfQorCisgICAgLy8gc2luY2UgSmF2YSBoYXMgbm8gQ2xvc3VyZXMuLi4KKyAgICBwcml2YXRlIGludGVyZmFjZSBDYWxsYWJsZSB7CisgICAgICAgIE9iamVjdCBjYWxsKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBPYmplY3QgZG9DYWxsKE9iamVjdCBvYmplY3QsIFN0cmluZyBtZXRob2ROYW1lLCBPYmplY3RbXSBhcmd1bWVudHMsIEludGVyY2VwdG9yIGludGVyY2VwdG9yLCBDYWxsYWJsZSBob3dUb0ludm9rZSkgeworICAgICAgICBpZiAobnVsbCA9PSBpbnRlcmNlcHRvcikgeworICAgICAgICAgICAgcmV0dXJuIGhvd1RvSW52b2tlLmNhbGwoKTsKKyAgICAgICAgfQorICAgICAgICBPYmplY3QgcmVzdWx0ID0gaW50ZXJjZXB0b3IuYmVmb3JlSW52b2tlKG9iamVjdCwgbWV0aG9kTmFtZSwgYXJndW1lbnRzKTsKKyAgICAgICAgaWYgKGludGVyY2VwdG9yLmRvSW52b2tlKCkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGhvd1RvSW52b2tlLmNhbGwoKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgPSBpbnRlcmNlcHRvci5hZnRlckludm9rZShvYmplY3QsIG1ldGhvZE5hbWUsIGFyZ3VtZW50cywgcmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvUmFuZ2UuamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbGFuZy9SYW5nZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3YzM5NDEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvUmFuZ2UuamF2YQpAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgZ3Jvb3Z5Lmxhbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBSZXByZXNlbnRzIHRoZSBpbnRlcmZhY2Ugb2YgYSBSYW5nZSBpbXBsZW1lbnRhdGlvbiB3aGljaCBpbmNsdWRlcyB0aGUKKyAqIGZyb20gYW5kIHRvIHZhbHVlcy4KKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgaW50ZXJmYWNlIFJhbmdlIGV4dGVuZHMgTGlzdCB7CisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbG93ZXIgdmFsdWUgaW4gdGhlIHJhbmdlLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbG93ZXIgdmFsdWUgaW4gdGhlIHJhbmdlLgorICAgICAqLworICAgIENvbXBhcmFibGUgZ2V0RnJvbSgpOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbG93ZXIgdmFsdWUgaW4gdGhlIHJhbmdlLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgdXBwZXIgdmFsdWUgaW4gdGhlIHJhbmdlCisgICAgICovCisgICAgQ29tcGFyYWJsZSBnZXRUbygpOworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBpcyBhIHJldmVyc2UgcmFuZ2Ugd2hpY2ggaXRlcmF0ZXMgYmFja3dhcmRzCisgICAgICogc3RhcnRpbmcgZnJvbSB0aGUgdG8gdmFsdWUgYW5kIGVuZGluZyBvbiB0aGUgZnJvbSB2YWx1ZQorICAgICAqCisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgcmV2ZXJzZSByYW5nZQorICAgICAqLworICAgIGJvb2xlYW4gaXNSZXZlcnNlKCk7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIGlzIGEgcmV2ZXJzZSByYW5nZSB3aGljaCBpdGVyYXRlcyBiYWNrd2FyZHMKKyAgICAgKiBzdGFydGluZyBmcm9tIHRoZSB0byB2YWx1ZSBhbmQgZW5kaW5nIG9uIHRoZSBmcm9tIHZhbHVlCisgICAgICoKKyAgICAgKiBAcGFyYW0gbyB0aGUgb2JqZWN0IHRvIGNoZWNrIGFnYWluc3QgdGhlIGJvdW5kYXJpZXMgb2YgdGhlIHJhbmdlCisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGJldHdlZW4gdGhlIGZyb20gYW5kIHRvIHZhbHVlcworICAgICAqLworICAgIGJvb2xlYW4gY29udGFpbnNXaXRoaW5Cb3VuZHMoT2JqZWN0IG8pOworCisgICAgLyoqCisgICAgICogU3RlcHMgdGhyb3VnaCB0aGUgcmFuZ2UsIGNhbGxpbmcgYSBjbG9zdXJlIGZvciBlYWNoIG51bWJlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdGVwICAgIHRoZSBhbW91bnQgYnkgd2hpY2ggdG8gc3RlcC4gSWYgbmVnYXRpdmUsIHN0ZXBzIHRocm91Z2ggdGhlCisgICAgICogICAgICAgICAgICAgICAgcmFuZ2UgYmFja3dhcmRzLgorICAgICAqIEBwYXJhbSBjbG9zdXJlIHRoZSB7QGxpbmsgQ2xvc3VyZX0gdG8gY2FsbAorICAgICAqLworICAgIHZvaWQgc3RlcChpbnQgc3RlcCwgQ2xvc3VyZSBjbG9zdXJlKTsKKworICAgIC8qKgorICAgICAqIEZvcm1zIGEgbGlzdCBieSBzdGVwcGluZyB0aHJvdWdoIHRoZSByYW5nZSBieSB0aGUgaW5kaWNhdGVkIGludGVydmFsLgorICAgICAqCisgICAgICogQHBhcmFtIHN0ZXAgdGhlIGFtb3VudCBieSB3aGljaCB0byBzdGVwLiBJZiBuZWdhdGl2ZSwgc3RlcHMgdGhyb3VnaCB0aGUKKyAgICAgKiAgICAgICAgICAgICByYW5nZSBiYWNrd2FyZHMuCisgICAgICogQHJldHVybiB0aGUgbGlzdCBmb3JtZWQgYnkgc3RlcHBpbmcgdGhyb3VnaCB0aGUgcmFuZ2UgYnkgdGhlIGluZGljYXRlZAorICAgICAqICAgICAgICAgaW50ZXJ2YWwuCisgICAgICovCisgICAgTGlzdCBzdGVwKGludCBzdGVwKTsKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHZlcmJvc2Uge0BsaW5rIFN0cmluZ30gcmVwcmVzZW50YXRpb24gb2YgdGhpcyB7QGxpbmsgUmFuZ2V9IGFzIHdvdWxkIGJlIHR5cGVkIGludG8gYSBjb25zb2xlCisgICAgICogICAgICAgICB0byBjcmVhdGUgdGhlIHtAbGluayBSYW5nZX0gaW5zdGFuY2UKKyAgICAgKi8KKyAgICBTdHJpbmcgaW5zcGVjdCgpOworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL1JlYWRPbmx5UHJvcGVydHlFeGNlcHRpb24uamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbGFuZy9SZWFkT25seVByb3BlcnR5RXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY0ZDZlZQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbGFuZy9SZWFkT25seVByb3BlcnR5RXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGdyb292eS5sYW5nOworCisKKy8qKgorICogVGhpcyBleGNlcHRpb24gaXMgdGhyb3duIGlmIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBzZXQgYSByZWFkIG9ubHkgcHJvcGVydHkKKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIFJlYWRPbmx5UHJvcGVydHlFeGNlcHRpb24gZXh0ZW5kcyBNaXNzaW5nUHJvcGVydHlFeGNlcHRpb24geworCisgICAgcHVibGljIFJlYWRPbmx5UHJvcGVydHlFeGNlcHRpb24oU3RyaW5nIHByb3BlcnR5LCBDbGFzcyB0eXBlKSB7CisgICAgICAgIHN1cGVyKCJDYW5ub3Qgc2V0IHJlYWRvbmx5IHByb3BlcnR5OiAiICsgcHJvcGVydHkgKyAiIGZvciBjbGFzczogIiArIHR5cGUuZ2V0TmFtZSgpLCBwcm9wZXJ0eSwgdHlwZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL1JlZmVyZW5jZS5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL1JlZmVyZW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ODg1MjIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvUmVmZXJlbmNlLmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGdyb292eS5sYW5nOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLkludm9rZXJIZWxwZXI7CisKKy8qKgorICogUmVwcmVzZW50cyBhIHJlZmVyZW5jZSB0byBhIHZhbHVlCisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBSZWZlcmVuY2UgZXh0ZW5kcyBHcm9vdnlPYmplY3RTdXBwb3J0IHsKKworICAgIHByaXZhdGUgT2JqZWN0IHZhbHVlOworCisgICAgcHVibGljIFJlZmVyZW5jZSgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVmZXJlbmNlKE9iamVjdCB2YWx1ZSkgeworICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHkpIHsKKyAgICAgICAgT2JqZWN0IHZhbHVlID0gZ2V0KCk7CisgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gSW52b2tlckhlbHBlci5nZXRQcm9wZXJ0eSh2YWx1ZSwgcHJvcGVydHkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5nZXRQcm9wZXJ0eShwcm9wZXJ0eSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgbmV3VmFsdWUpIHsKKyAgICAgICAgT2JqZWN0IHZhbHVlID0gZ2V0KCk7CisgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBJbnZva2VySGVscGVyLnNldFByb3BlcnR5KHZhbHVlLCBwcm9wZXJ0eSwgbmV3VmFsdWUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgc3VwZXIuc2V0UHJvcGVydHkocHJvcGVydHksIG5ld1ZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgaW52b2tlTWV0aG9kKFN0cmluZyBuYW1lLCBPYmplY3QgYXJncykgeworICAgICAgICBPYmplY3QgdmFsdWUgPSBnZXQoKTsKKyAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEludm9rZXJIZWxwZXIuaW52b2tlTWV0aG9kKHZhbHVlLCBuYW1lLCBhcmdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5pbnZva2VNZXRob2QobmFtZSwgYXJncyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuaW52b2tlTWV0aG9kKG5hbWUsIGFyZ3MpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXQoKSB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXQoT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvU2NyaXB0LmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvU2NyaXB0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIzMmU1OAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbGFuZy9TY3JpcHQuamF2YQpAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGdyb292eS5sYW5nOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuZXhwci5Bcmd1bWVudExpc3RFeHByZXNzaW9uOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5Db21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuRGVmYXVsdEdyb292eU1ldGhvZHM7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLkludm9rZXJIZWxwZXI7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBUaGlzIG9iamVjdCByZXByZXNlbnRzIGEgR3Jvb3Z5IHNjcmlwdAorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAYXV0aG9yIEd1aWxsYXVtZSBMYWZvcmdlCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBTY3JpcHQgZXh0ZW5kcyBHcm9vdnlPYmplY3RTdXBwb3J0IHsKKyAgICBwcml2YXRlIEJpbmRpbmcgYmluZGluZzsKKworICAgIHByb3RlY3RlZCBTY3JpcHQoKSB7CisgICAgICAgIHRoaXMobmV3IEJpbmRpbmcoKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFNjcmlwdChCaW5kaW5nIGJpbmRpbmcpIHsKKyAgICAgICAgdGhpcy5iaW5kaW5nID0gYmluZGluZzsKKyAgICB9CisKKyAgICBwdWJsaWMgQmluZGluZyBnZXRCaW5kaW5nKCkgeworICAgICAgICByZXR1cm4gYmluZGluZzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRCaW5kaW5nKEJpbmRpbmcgYmluZGluZykgeworICAgICAgICB0aGlzLmJpbmRpbmcgPSBiaW5kaW5nOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gYmluZGluZy5nZXRWYXJpYWJsZShwcm9wZXJ0eSk7CisgICAgICAgIH0gY2F0Y2ggKE1pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0UHJvcGVydHkocHJvcGVydHkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgbmV3VmFsdWUpIHsKKyAgICAgICAgaWYgKCJiaW5kaW5nIi5lcXVhbHMocHJvcGVydHkpKQorICAgICAgICAgICAgc2V0QmluZGluZygoQmluZGluZykgbmV3VmFsdWUpOworICAgICAgICBlbHNlIGlmKCJtZXRhQ2xhc3MiLmVxdWFscyhwcm9wZXJ0eSkpCisgICAgICAgICAgICBzZXRNZXRhQ2xhc3MoKE1ldGFDbGFzcyluZXdWYWx1ZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJpbmRpbmcuc2V0VmFyaWFibGUocHJvcGVydHksIG5ld1ZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnZva2UgYSBtZXRob2QgKG9yIGNsb3N1cmUgaW4gdGhlIGJpbmRpbmcpIGRlZmluZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBtZXRob2QgdG8gY2FsbAorICAgICAqIEBwYXJhbSBhcmdzIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBtZXRob2QKKyAgICAgKiBAcmV0dXJuIHZhbHVlCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBpbnZva2VNZXRob2QoU3RyaW5nIG5hbWUsIE9iamVjdCBhcmdzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuaW52b2tlTWV0aG9kKG5hbWUsIGFyZ3MpOworICAgICAgICB9CisgICAgICAgIC8vIGlmIHRoZSBtZXRob2Qgd2FzIG5vdCBmb3VuZCBpbiB0aGUgY3VycmVudCBzY29wZSAodGhlIHNjcmlwdCdzIG1ldGhvZHMpCisgICAgICAgIC8vIGxldCdzIHRyeSB0byBzZWUgaWYgdGhlcmUncyBhIG1ldGhvZCBjbG9zdXJlIHdpdGggdGhlIHNhbWUgbmFtZSBpbiB0aGUgYmluZGluZworICAgICAgICBjYXRjaCAoTWlzc2luZ01ldGhvZEV4Y2VwdGlvbiBtbWUpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKG1tZS5nZXRNZXRob2QoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGJvdW5kQ2xvc3VyZSA9IGJpbmRpbmcuZ2V0VmFyaWFibGUobmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChib3VuZENsb3N1cmUgIT0gbnVsbCAmJiBib3VuZENsb3N1cmUgaW5zdGFuY2VvZiBDbG9zdXJlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChDbG9zdXJlKSBib3VuZENsb3N1cmUpLmNhbGwoKE9iamVjdFtdKWFyZ3MpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbW1lOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbW1lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKE1pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbiBtcGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBtbWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWFpbiBpbnN0YW5jZSBtZXRob2Qgb2YgYSBzY3JpcHQgd2hpY2ggaGFzIHZhcmlhYmxlcyBpbiBzY29wZQorICAgICAqIGFzIGRlZmluZWQgYnkgdGhlIGN1cnJlbnQge0BsaW5rIEJpbmRpbmd9IGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBPYmplY3QgcnVuKCk7CisKKyAgICAvLyBwcmludGxuIGhlbHBlciBtZXRob2RzCisKKyAgICAvKioKKyAgICAgKiBQcmludHMgYSBuZXdsaW5lIHRvIHRoZSBjdXJyZW50ICdvdXQnIHZhcmlhYmxlIHdoaWNoIHNob3VsZCBiZSBhIFByaW50V3JpdGVyCisgICAgICogb3IgYXQgbGVhc3QgaGF2ZSBhIHByaW50bG4oKSBtZXRob2QgZGVmaW5lZCBvbiBpdC4KKyAgICAgKiBJZiB0aGVyZSBpcyBubyAnb3V0JyBwcm9wZXJ0eSB0aGVuIHByaW50IHRvIHN0YW5kYXJkIG91dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcmludGxuKCkgeworICAgICAgICBPYmplY3Qgb2JqZWN0OworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvYmplY3QgPSBnZXRQcm9wZXJ0eSgib3V0Iik7CisgICAgICAgIH0gY2F0Y2ggKE1pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIEludm9rZXJIZWxwZXIuaW52b2tlTWV0aG9kKG9iamVjdCwgInByaW50bG4iLCBBcmd1bWVudExpc3RFeHByZXNzaW9uLkVNUFRZX0FSUkFZKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmludHMgdGhlIHZhbHVlIHRvIHRoZSBjdXJyZW50ICdvdXQnIHZhcmlhYmxlIHdoaWNoIHNob3VsZCBiZSBhIFByaW50V3JpdGVyCisgICAgICogb3IgYXQgbGVhc3QgaGF2ZSBhIHByaW50KCkgbWV0aG9kIGRlZmluZWQgb24gaXQuCisgICAgICogSWYgdGhlcmUgaXMgbm8gJ291dCcgcHJvcGVydHkgdGhlbiBwcmludCB0byBzdGFuZGFyZCBvdXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJpbnQoT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIE9iamVjdCBvYmplY3Q7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9iamVjdCA9IGdldFByb3BlcnR5KCJvdXQiKTsKKyAgICAgICAgfSBjYXRjaCAoTWlzc2luZ1Byb3BlcnR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIERlZmF1bHRHcm9vdnlNZXRob2RzLnByaW50KFN5c3RlbS5vdXQsdmFsdWUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgSW52b2tlckhlbHBlci5pbnZva2VNZXRob2Qob2JqZWN0LCAicHJpbnQiLCBuZXcgT2JqZWN0W117dmFsdWV9KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmludHMgdGhlIHZhbHVlIGFuZCBhIG5ld2xpbmUgdG8gdGhlIGN1cnJlbnQgJ291dCcgdmFyaWFibGUgd2hpY2ggc2hvdWxkIGJlIGEgUHJpbnRXcml0ZXIKKyAgICAgKiBvciBhdCBsZWFzdCBoYXZlIGEgcHJpbnRsbigpIG1ldGhvZCBkZWZpbmVkIG9uIGl0LgorICAgICAqIElmIHRoZXJlIGlzIG5vICdvdXQnIHByb3BlcnR5IHRoZW4gcHJpbnQgdG8gc3RhbmRhcmQgb3V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByaW50bG4oT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIE9iamVjdCBvYmplY3Q7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9iamVjdCA9IGdldFByb3BlcnR5KCJvdXQiKTsKKyAgICAgICAgfSBjYXRjaCAoTWlzc2luZ1Byb3BlcnR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIERlZmF1bHRHcm9vdnlNZXRob2RzLnByaW50bG4oU3lzdGVtLm91dCx2YWx1ZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBJbnZva2VySGVscGVyLmludm9rZU1ldGhvZChvYmplY3QsICJwcmludGxuIiwgbmV3IE9iamVjdFtde3ZhbHVlfSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBoZWxwZXIgbWV0aG9kIHRvIGFsbG93IHRoZSBkeW5hbWljIGV2YWx1YXRpb24gb2YgZ3Jvb3Z5IGV4cHJlc3Npb25zIHVzaW5nIHRoaXMKKyAgICAgKiBzY3JpcHRzIGJpbmRpbmcgYXMgdGhlIHZhcmlhYmxlIHNjb3BlCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXhwcmVzc2lvbiBpcyB0aGUgR3Jvb3Z5IHNjcmlwdCBleHByZXNzaW9uIHRvIGV2YWx1YXRlCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBldmFsdWF0ZShTdHJpbmcgZXhwcmVzc2lvbikgdGhyb3dzIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEdyb292eVNoZWxsIHNoZWxsID0gbmV3IEdyb292eVNoZWxsKGJpbmRpbmcpOworICAgICAgICByZXR1cm4gc2hlbGwuZXZhbHVhdGUoZXhwcmVzc2lvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBoZWxwZXIgbWV0aG9kIHRvIGFsbG93IHRoZSBkeW5hbWljIGV2YWx1YXRpb24gb2YgZ3Jvb3Z5IGV4cHJlc3Npb25zIHVzaW5nIHRoaXMKKyAgICAgKiBzY3JpcHRzIGJpbmRpbmcgYXMgdGhlIHZhcmlhYmxlIHNjb3BlCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZSBpcyB0aGUgR3Jvb3Z5IHNjcmlwdCB0byBldmFsdWF0ZQorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZXZhbHVhdGUoRmlsZSBmaWxlKSB0aHJvd3MgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgR3Jvb3Z5U2hlbGwgc2hlbGwgPSBuZXcgR3Jvb3Z5U2hlbGwoYmluZGluZyk7CisgICAgICAgIHJldHVybiBzaGVsbC5ldmFsdWF0ZShmaWxlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGhlbHBlciBtZXRob2QgdG8gYWxsb3cgc2NyaXB0cyB0byBiZSBydW4gdGFraW5nIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBydW4oRmlsZSBmaWxlLCBTdHJpbmdbXSBhcmd1bWVudHMpIHRocm93cyBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBHcm9vdnlTaGVsbCBzaGVsbCA9IG5ldyBHcm9vdnlTaGVsbChiaW5kaW5nKTsKKyAgICAgICAgc2hlbGwucnVuKGZpbGUsIGFyZ3VtZW50cyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL1NlcXVlbmNlLmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvU2VxdWVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjBjMzY1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL1NlcXVlbmNlLmphdmEKQEAgLTAsMCArMSwyMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBncm9vdnkubGFuZzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLkludm9rZXJIZWxwZXI7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLnR5cGVoYW5kbGluZy5EZWZhdWx0VHlwZVRyYW5zZm9ybWF0aW9uOworCisvKioKKyAqIFJlcHJlc2VudHMgYSBzZXF1ZW5jZSBvZiBvYmplY3RzIHdoaWNoIHJlcHJlc2VudHMgemVybyBvciBtYW55IGluc3RhbmNlcyBvZgorICogb2Ygb2JqZWN0cyBvZiBhIGdpdmVuIHR5cGUuIFRoZSB0eXBlIGNhbiBiZSBvbW1pdHRlZCBpbiB3aGljaCBjYXNlIGFueSB0eXBlIG9mCisgKiBvYmplY3QgY2FuIGJlIGFkZGVkLgorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBTZXF1ZW5jZSBleHRlbmRzIEFycmF5TGlzdCBpbXBsZW1lbnRzIEdyb292eU9iamVjdCB7CisKKyAgICBwcml2YXRlIE1ldGFDbGFzcyBtZXRhQ2xhc3MgPSBJbnZva2VySGVscGVyLmdldE1ldGFDbGFzcyh0aGlzKTsKKyAgICBwcml2YXRlIENsYXNzIHR5cGU7CisgICAgcHJpdmF0ZSBpbnQgaGFzaENvZGU7CisKKyAgICBwdWJsaWMgU2VxdWVuY2UoKSB7CisgICAgICAgIHRoaXMobnVsbCk7CisgICAgfQorCisgICAgcHVibGljIFNlcXVlbmNlKENsYXNzIHR5cGUpIHsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2VxdWVuY2UoQ2xhc3MgdHlwZSwgTGlzdCBjb250ZW50KSB7CisgICAgICAgIHN1cGVyKGNvbnRlbnQuc2l6ZSgpKTsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgYWRkQWxsKGNvbnRlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgc2VxdWVuY2UgdG8gdGhhdAorICAgICAqIG9mIHRoZSBnaXZlbiBjb2xsZWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldChDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKKyAgICAgICAgY2hlY2tDb2xsZWN0aW9uVHlwZShjb2xsZWN0aW9uKTsKKyAgICAgICAgY2xlYXIoKTsKKyAgICAgICAgYWRkQWxsKGNvbGxlY3Rpb24pOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHRoYXQpIHsKKyAgICAgICAgaWYgKHRoYXQgaW5zdGFuY2VvZiBTZXF1ZW5jZSkgeworICAgICAgICAgICAgcmV0dXJuIGVxdWFscygoU2VxdWVuY2UpIHRoYXQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoU2VxdWVuY2UgdGhhdCkgeworICAgICAgICBpZiAoc2l6ZSgpID09IHRoYXQuc2l6ZSgpKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKCFEZWZhdWx0VHlwZVRyYW5zZm9ybWF0aW9uLmNvbXBhcmVFcXVhbCh0aGlzLmdldChpKSwgdGhhdC5nZXQoaSkpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaWYgKGhhc2hDb2RlID09IDApIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBnZXQoaSk7CisgICAgICAgICAgICAgICAgaW50IGhhc2ggPSAodmFsdWUgIT0gbnVsbCkgPyB2YWx1ZS5oYXNoQ29kZSgpIDogMHhiYWJlOworICAgICAgICAgICAgICAgIGhhc2hDb2RlIF49IGhhc2g7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaGFzaENvZGUgPT0gMCkgeworICAgICAgICAgICAgICAgIGhhc2hDb2RlID0gMHhiYWJlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBoYXNoQ29kZTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IG1pbmltdW1TaXplKCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUgc2VxdWVuY2Ugb3IgbnVsbCBpZiB0aGVyZSBpcyBubworICAgICAqIHR5cGUgY29uc3RyYWludCBvbiB0aGlzIHNlcXVlbmNlCisgICAgICovCisgICAgcHVibGljIENsYXNzIHR5cGUoKSB7CisgICAgICAgIHJldHVybiB0eXBlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBhZGQoaW50IGluZGV4LCBPYmplY3QgZWxlbWVudCkgeworICAgICAgICBjaGVja1R5cGUoZWxlbWVudCk7CisgICAgICAgIGhhc2hDb2RlID0gMDsKKyAgICAgICAgc3VwZXIuYWRkKGluZGV4LCBlbGVtZW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBhZGQoT2JqZWN0IGVsZW1lbnQpIHsKKyAgICAgICAgY2hlY2tUeXBlKGVsZW1lbnQpOworICAgICAgICBoYXNoQ29kZSA9IDA7CisgICAgICAgIHJldHVybiBzdXBlci5hZGQoZWxlbWVudCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb24gYykgeworICAgICAgICBjaGVja0NvbGxlY3Rpb25UeXBlKGMpOworICAgICAgICBoYXNoQ29kZSA9IDA7CisgICAgICAgIHJldHVybiBzdXBlci5hZGRBbGwoYyk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gYWRkQWxsKGludCBpbmRleCwgQ29sbGVjdGlvbiBjKSB7CisgICAgICAgIGNoZWNrQ29sbGVjdGlvblR5cGUoYyk7CisgICAgICAgIGhhc2hDb2RlID0gMDsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmFkZEFsbChpbmRleCwgYyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIGhhc2hDb2RlID0gMDsKKyAgICAgICAgc3VwZXIuY2xlYXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZShpbnQgaW5kZXgpIHsKKyAgICAgICAgaGFzaENvZGUgPSAwOworICAgICAgICByZXR1cm4gc3VwZXIucmVtb3ZlKGluZGV4KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVSYW5nZShpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkgeworICAgICAgICBoYXNoQ29kZSA9IDA7CisgICAgICAgIHN1cGVyLnJlbW92ZVJhbmdlKGZyb21JbmRleCwgdG9JbmRleCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBzZXQoaW50IGluZGV4LCBPYmplY3QgZWxlbWVudCkgeworICAgICAgICBoYXNoQ29kZSA9IDA7CisgICAgICAgIHJldHVybiBzdXBlci5zZXQoaW5kZXgsIGVsZW1lbnQpOworICAgIH0KKworICAgIC8vIEdyb292eU9iamVjdCBpbnRlcmZhY2UKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBwdWJsaWMgT2JqZWN0IGludm9rZU1ldGhvZChTdHJpbmcgbmFtZSwgT2JqZWN0IGFyZ3MpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgcmV0dXJuIGdldE1ldGFDbGFzcygpLmludm9rZU1ldGhvZCh0aGlzLCBuYW1lLCBhcmdzKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoTWlzc2luZ01ldGhvZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBsZXRzIGFwcGx5IHRoZSBtZXRob2QgdG8gZWFjaCBpdGVtIGluIHRoZSBjb2xsZWN0aW9uCisgICAgICAgICAgICBMaXN0IGFuc3dlciA9IG5ldyBBcnJheUxpc3Qoc2l6ZSgpKTsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApIHsKKyAgICAgICAgICAgICAgICBPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IEludm9rZXJIZWxwZXIuaW52b2tlTWV0aG9kKGVsZW1lbnQsIG5hbWUsIGFyZ3MpOworICAgICAgICAgICAgICAgIGFuc3dlci5hZGQodmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGFuc3dlcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5KSB7CisgICAgICAgIHJldHVybiBnZXRNZXRhQ2xhc3MoKS5nZXRQcm9wZXJ0eSh0aGlzLCBwcm9wZXJ0eSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgbmV3VmFsdWUpIHsKKyAgICAgICAgZ2V0TWV0YUNsYXNzKCkuc2V0UHJvcGVydHkodGhpcywgcHJvcGVydHksIG5ld1ZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWV0YUNsYXNzIGdldE1ldGFDbGFzcygpIHsKKyAgICAgICAgcmV0dXJuIG1ldGFDbGFzczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNZXRhQ2xhc3MoTWV0YUNsYXNzIG1ldGFDbGFzcykgeworICAgICAgICB0aGlzLm1ldGFDbGFzcyA9IG1ldGFDbGFzczsKKyAgICB9CisKKyAgICAvLyBJbXBsZW1lbnRhdGlvbiBtZXRob2RzCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgCisgICAgLyoqCisgICAgICogQ2hlY2tzIHRoYXQgZWFjaCBtZW1iZXIgb2YgdGhlIGdpdmVuIGNvbGxlY3Rpb24gYXJlIG9mIHRoZSBjb3JyZWN0CisgICAgICogdHlwZQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrQ29sbGVjdGlvblR5cGUoQ29sbGVjdGlvbiBjKSB7CisgICAgICAgIGlmICh0eXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkgeworICAgICAgICAgICAgICAgIE9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgY2hlY2tUeXBlKGVsZW1lbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICAvKiogCisgICAgICogQ2hlY2tzIHRoYXQgdGhlIGdpdmVuIG9iamVjdCBpbnN0YW5jZSBpcyBvZiB0aGUgY29ycmVjdCB0eXBlCisgICAgICogb3RoZXJ3aXNlIGEgcnVudGltZSBleGNlcHRpb24gaXMgdGhyb3duCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tUeXBlKE9iamVjdCBvYmplY3QpIHsKKyAgICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIlNlcXVlbmNlcyBjYW5ub3QgY29udGFpbiBudWxsLCB1c2UgYSBMaXN0IGluc3RlYWQiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoIXR5cGUuaXNJbnN0YW5jZShvYmplY3QpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgdHlwZSBvZiBhcmd1bWVudCBmb3Igc2VxdWVuY2Ugb2YgdHlwZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgKyB0eXBlLmdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGNhbm5vdCBhZGQgb2JqZWN0OiAiCisgICAgICAgICAgICAgICAgICAgICAgICArIG9iamVjdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL1NwcmVhZExpc3RFdmFsdWF0aW5nRXhjZXB0aW9uLmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvU3ByZWFkTGlzdEV2YWx1YXRpbmdFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjkzMWRmCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL1NwcmVhZExpc3RFdmFsdWF0aW5nRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGdyb292eS5sYW5nOworCitwdWJsaWMgY2xhc3MgU3ByZWFkTGlzdEV2YWx1YXRpbmdFeGNlcHRpb24gZXh0ZW5kcyBHcm9vdnlSdW50aW1lRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgU3ByZWFkTGlzdEV2YWx1YXRpbmdFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgc3VwZXIobWVzc2FnZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL1NwcmVhZE1hcC5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL1NwcmVhZE1hcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZjllMTUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvU3ByZWFkTWFwLmphdmEKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBncm9vdnkubGFuZzsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLnR5cGVoYW5kbGluZy5EZWZhdWx0VHlwZVRyYW5zZm9ybWF0aW9uOworCisvKioKKyAqIFJlcHJlc2VudHMgYSBzcHJlYWRhYmxlIG1hcCB3aGljaCBleHRlbmRzIGphdmEudXRpbC5IYXNoTWFwLgorICogCisgKiBAYXV0aG9yIFBpbGhvIEtpbQorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgU3ByZWFkTWFwIGV4dGVuZHMgSGFzaE1hcCB7CisKKyAgICBwcml2YXRlIE1hcCBtYXBEYXRhOworICAgIHByaXZhdGUgaW50IGhhc2hDb2RlOworCisgICAgcHVibGljIFNwcmVhZE1hcChPYmplY3RbXSB2YWx1ZXMpIHsKKyAgICAgICAgbWFwRGF0YSA9IG5ldyBIYXNoTWFwKHZhbHVlcy5sZW5ndGggLyAyKTsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICB3aGlsZSAoaSA8IHZhbHVlcy5sZW5ndGgpIHsKKyAgICAgICAgICAgbWFwRGF0YS5wdXQodmFsdWVzW2krK10sIHZhbHVlc1tpKytdKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBTcHJlYWRNYXAoTWFwIG1hcCkgeworICAgICAgICB0aGlzLm1hcERhdGEgPSBtYXA7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXQoT2JqZWN0IG9iaikgeworICAgICAgICByZXR1cm4gbWFwRGF0YS5nZXQob2JqKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IHB1dChPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlNwcmVhZE1hcDogIiArIHRoaXMgKyAiIGlzIGFuIGltbXV0YWJsZSBtYXAsIGFuZCBzbyAoIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGtleSArICI6ICIgKyB2YWx1ZSArICIpIGNhbm5vdCBiZSBhZGRlZC4iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZShPYmplY3Qga2V5KSB7CisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJTcHJlYWRNYXA6ICIgKyB0aGlzICsgIiBpcyBhbiBpbW11dGFibGUgbWFwLCBhbmQgc28gdGhlIGtleSAoIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGtleSArICIpIGNhbm5vdCBiZSBkZWxldGVkZWQuIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHV0QWxsKE1hcCB0KSB7CisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJTcHJlYWRNYXA6ICIgKyB0aGlzICsgIiBpcyBhbiBpbW11dGFibGUgbWFwLCBhbmQgc28gdGhlIG1hcCAoIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHQgKyAiKSBjYW5ub3QgYmUgcHV0IGluIHRoaXMgc3ByZWFkTWFwLiIpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1hcERhdGEua2V5U2V0KCkuc2l6ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgdGhhdCkgeworICAgICAgICBpZiAodGhhdCBpbnN0YW5jZW9mIFNwcmVhZE1hcCkgeworICAgICAgICAgICAgcmV0dXJuIGVxdWFscygoU3ByZWFkTWFwKSB0aGF0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKFNwcmVhZE1hcCB0aGF0KSB7CisgICAgICAgIGlmICh0aGF0ID09IG51bGwpIHJldHVybiBmYWxzZTsgICAgICAgIAorCisgICAgICAgIGlmIChzaXplKCkgPT0gdGhhdC5zaXplKCkpIHsKKyAgICAgICAgICAgIFNwcmVhZE1hcCBvdGhlciA9IChTcHJlYWRNYXApIHRoYXQ7CisgICAgICAgICAgICBJdGVyYXRvciBpdGVyID0gbWFwRGF0YS5rZXlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICAgICAgZm9yICg7IGl0ZXIuaGFzTmV4dCgpOyApIHsKKyAgICAgICAgICAgICAgICBPYmplY3Qga2V5ID0gaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKCEgRGVmYXVsdFR5cGVUcmFuc2Zvcm1hdGlvbi5jb21wYXJlRXF1YWwoZ2V0KGtleSksIG90aGVyLmdldChrZXkpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKworICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGlmIChoYXNoQ29kZSA9PSAwKSB7CisgICAgICAgICAgICBJdGVyYXRvciBpdGVyID0gbWFwRGF0YS5rZXlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICAgICAgZm9yICg7IGl0ZXIuaGFzTmV4dCgpOyApIHsKKyAgICAgICAgICAgICAgICBPYmplY3Qga2V5ID0gaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgaW50IGhhc2ggPSAoa2V5ICE9IG51bGwpID8ga2V5Lmhhc2hDb2RlKCkgOiAweGJhYmU7CisgICAgICAgICAgICAgICAgaGFzaENvZGUgXj0gaGFzaDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaGFzaENvZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc3RyaW5nIGV4cHJlc3Npb24gb2YgPGNvZGU+dGhpczwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgZXhwcmVzc2lvbiBvZiA8Y29kZT50aGlzPC9jb2RlPgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIGlmIChtYXBEYXRhLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuICIqOls6XSI7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmYgPSBuZXcgU3RyaW5nQnVmZmVyKCIqOlsiKTsKKyAgICAgICAgSXRlcmF0b3IgaXRlciA9IG1hcERhdGEua2V5U2V0KCkuaXRlcmF0b3IoKTsKKyAgICAgICAgZm9yICg7IGl0ZXIuaGFzTmV4dCgpOyApIHsKKyAgICAgICAgICAgIE9iamVjdCBrZXkgPSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKGtleSArICI6IiArIG1hcERhdGEuZ2V0KGtleSkpOworICAgICAgICAgICAgaWYgKGl0ZXIuaGFzTmV4dCgpKQorICAgICAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKCIsICIpOworICAgICAgICB9CisgICAgICAgIGJ1ZmYuYXBwZW5kKCJdIik7CisgICAgICAgIHJldHVybiBidWZmLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL1NwcmVhZE1hcEV2YWx1YXRpbmdFeGNlcHRpb24uamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbGFuZy9TcHJlYWRNYXBFdmFsdWF0aW5nRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjcyOTlhNAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbGFuZy9TcHJlYWRNYXBFdmFsdWF0aW5nRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGdyb292eS5sYW5nOworCitwdWJsaWMgY2xhc3MgU3ByZWFkTWFwRXZhbHVhdGluZ0V4Y2VwdGlvbiBleHRlbmRzIEdyb292eVJ1bnRpbWVFeGNlcHRpb24geworICAgIHB1YmxpYyBTcHJlYWRNYXBFdmFsdWF0aW5nRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIHN1cGVyKG1lc3NhZ2UpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbGFuZy9TdHJpbmdXcml0ZXJJT0V4Y2VwdGlvbi5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL1N0cmluZ1dyaXRlcklPRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRjZmMyZAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbGFuZy9TdHJpbmdXcml0ZXJJT0V4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBncm9vdnkubGFuZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKy8qKgorICogQW4gSU8gZXhjZXB0aW9uIG9jY3VycmVkIHRyeWluZyB0byBhcHBlbmQgdG8gYSBTdHJpbmdXcml0ZXIgd2hpY2ggc2hvdWxkIG5ldmVyIGhhcHBlbi4KKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIFN0cmluZ1dyaXRlcklPRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CisKKyAgICBwdWJsaWMgU3RyaW5nV3JpdGVySU9FeGNlcHRpb24oSU9FeGNlcHRpb24gZSkgeworICAgICAgICBzdXBlcihlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSU9FeGNlcHRpb24gZ2V0SU9FeGNlcHRpb24oKSB7CisgICAgICAgIHJldHVybiAoSU9FeGNlcHRpb24pIGdldENhdXNlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL1RyYWNpbmdJbnRlcmNlcHRvci5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL1RyYWNpbmdJbnRlcmNlcHRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyYWIwYWQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvVHJhY2luZ0ludGVyY2VwdG9yLmphdmEKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgZ3Jvb3Z5Lmxhbmc7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CisKK3B1YmxpYyBjbGFzcyBUcmFjaW5nSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBJbnRlcmNlcHRvciB7CisKKyAgICBwcm90ZWN0ZWQgV3JpdGVyIHdyaXRlciA9IG5ldyBQcmludFdyaXRlcihTeXN0ZW0ub3V0KTsKKyAgICBwcml2YXRlIGludCBpbmRlbnQgPSAwOworCisgICAgcHVibGljIFdyaXRlciBnZXRXcml0ZXIoKSB7CisgICAgICAgIHJldHVybiB3cml0ZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0V3JpdGVyKFdyaXRlciB3cml0ZXIpIHsKKyAgICAgICAgdGhpcy53cml0ZXIgPSB3cml0ZXI7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBiZWZvcmVJbnZva2UoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1ldGhvZE5hbWUsIE9iamVjdFtdIGFyZ3VtZW50cykgeworICAgICAgICB3cml0ZShvYmplY3QsIG1ldGhvZE5hbWUsIGFyZ3VtZW50cywgImJlZm9yZSIpOworICAgICAgICBpbmRlbnQrKyA7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgYWZ0ZXJJbnZva2UoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1ldGhvZE5hbWUsIE9iamVjdFtdIGFyZ3VtZW50cywgT2JqZWN0IHJlc3VsdCkgeworICAgICAgICBpbmRlbnQtLTsKKyAgICAgICAgd3JpdGUob2JqZWN0LCBtZXRob2ROYW1lLCBhcmd1bWVudHMsICJhZnRlciAiKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBkb0ludm9rZSgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHByaXZhdGUgU3RyaW5nIGluZGVudCgpeworICAgICAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBmb3IgKGludCBpPTA7IGk8aW5kZW50O2krKyl7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIgICIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbWV0aG9kTmFtZSwgT2JqZWN0W10gYXJndW1lbnRzLCBmaW5hbCBTdHJpbmcgb3JpZ2luKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3cml0ZXIud3JpdGUoaW5kZW50KCkpOworICAgICAgICAgICAgd3JpdGVyLndyaXRlKG9yaWdpbik7CisgICAgICAgICAgICB3cml0ZXIud3JpdGUoIiAiKTsKKyAgICAgICAgICAgIENsYXNzIHRoZUNsYXNzID0gb2JqZWN0IGluc3RhbmNlb2YgQ2xhc3MgPyAoQ2xhc3MpIG9iamVjdDogb2JqZWN0LmdldENsYXNzKCk7CisgICAgICAgICAgICB3cml0ZUluZm8odGhlQ2xhc3MsIG1ldGhvZE5hbWUsIGFyZ3VtZW50cyk7CisgICAgICAgICAgICB3cml0ZXIud3JpdGUoIlxuIik7CisgICAgICAgICAgICB3cml0ZXIuZmx1c2goKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlSW5mbyhmaW5hbCBDbGFzcyBhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBPYmplY3RbXSBhcmd1bWVudHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHdyaXRlci53cml0ZShhQ2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAgICAgd3JpdGVyLndyaXRlKCIuIik7CisgICAgICAgIHdyaXRlci53cml0ZShtZXRob2ROYW1lKTsKKyAgICAgICAgd3JpdGVyLndyaXRlKCIoIik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaSA+IDApIHdyaXRlci53cml0ZSgiLCAiKTsKKyAgICAgICAgICAgIE9iamVjdCBhcmd1bWVudCA9IGFyZ3VtZW50c1tpXTsKKyAgICAgICAgICAgIHdyaXRlci53cml0ZShhcmd1bWVudC5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgd3JpdGVyLndyaXRlKCIpIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL1R1cGxlLmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvVHVwbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzBlNWM1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL1R1cGxlLmphdmEKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGdyb292eS5sYW5nOworCitpbXBvcnQgamF2YS51dGlsLkFic3RyYWN0TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS50eXBlaGFuZGxpbmcuRGVmYXVsdFR5cGVUcmFuc2Zvcm1hdGlvbjsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgbGlzdCBvZiBJbnRlZ2VyIG9iamVjdHMgZnJvbSBhIHNwZWNpZmllZCBpbnQgdXAgdG8gYnV0IG5vdCBpbmNsdWRpbmcKKyAqIGEgZ2l2ZW4gYW5kIHRvLgorICogCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgVHVwbGUgZXh0ZW5kcyBBYnN0cmFjdExpc3QgeworCisgICAgcHJpdmF0ZSBPYmplY3RbXSBjb250ZW50czsKKyAgICBwcml2YXRlIGludCBoYXNoQ29kZTsKKworICAgIHB1YmxpYyBUdXBsZShPYmplY3RbXSBjb250ZW50cykgeworICAgICAgICB0aGlzLmNvbnRlbnRzID0gY29udGVudHM7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXQoaW50IGluZGV4KSB7CisgICAgICAgIHJldHVybiBjb250ZW50c1tpbmRleF07CisgICAgfQorCisgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICByZXR1cm4gY29udGVudHMubGVuZ3RoOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgdGhhdCkgeworICAgICAgICBpZiAodGhhdCBpbnN0YW5jZW9mIFR1cGxlKSB7CisgICAgICAgICAgICByZXR1cm4gZXF1YWxzKChUdXBsZSkgdGhhdCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhUdXBsZSB0aGF0KSB7CisgICAgICAgIGlmIChjb250ZW50cy5sZW5ndGggPT0gdGhhdC5jb250ZW50cy5sZW5ndGgpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udGVudHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoISBEZWZhdWx0VHlwZVRyYW5zZm9ybWF0aW9uLmNvbXBhcmVFcXVhbCh0aGlzLmNvbnRlbnRzW2ldLCB0aGF0LmNvbnRlbnRzW2ldKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaWYgKGhhc2hDb2RlID09IDApIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udGVudHMubGVuZ3RoOyBpKysgKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gY29udGVudHNbaV07CisgICAgICAgICAgICAgICAgaW50IGhhc2ggPSAodmFsdWUgIT0gbnVsbCkgPyB2YWx1ZS5oYXNoQ29kZSgpIDogMHhiYWJlOworICAgICAgICAgICAgICAgIGhhc2hDb2RlIF49IGhhc2g7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaGFzaENvZGUgPT0gMCkgeworICAgICAgICAgICAgICAgIGhhc2hDb2RlID0gMHhiYWJlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBoYXNoQ29kZTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdCBzdWJMaXN0KGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KSB7CisgICAgICAgIGludCBzaXplID0gdG9JbmRleCAtIGZyb21JbmRleDsKKyAgICAgICAgT2JqZWN0W10gbmV3Q29udGVudCA9IG5ldyBPYmplY3Rbc2l6ZV07CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoY29udGVudHMsIGZyb21JbmRleCwgbmV3Q29udGVudCwgMCwgc2l6ZSk7CisgICAgICAgIHJldHVybiBuZXcgVHVwbGUobmV3Q29udGVudCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL1dyaXRhYmxlLmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvV3JpdGFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTdjMGRiCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL1dyaXRhYmxlLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGdyb292eS5sYW5nOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKKworCisvKioKKyAqIFJlcHJlc2VudHMgYW4gb2JqZWN0IHdoaWNoIGlzIGNhcGFibGUgb2Ygd3JpdGluZyBpdHNlbGYgdG8gYSB0ZXh0IHN0cmVhbQorICogaW4gYSBtb3JlIGVmZmljaWVudCBmb3JtYXQgdGhhbiBqdXN0IGNyZWF0aW5nIGEgdG9TdHJpbmcoKSByZXByZXNlbnRhdGlvbgorICogb2YgaXRzZWxmLiBUaGlzIG1lY2hhbmlzbSBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGZvciB0ZW1wbGF0ZXMgYW5kIHN1Y2ggbGlrZS4KKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGludGVyZmFjZSBXcml0YWJsZSB7CisKKyAgICAvKioKKyAgICAgKiB3cml0ZXMgdGhpcyBvYmplY3QgdG8gdGhlIGdpdmVuIHN0cmVhbQorICAgICAqLworICAgIFdyaXRlciB3cml0ZVRvKFdyaXRlciBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbjsKKyAgICAgICAgCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L2xhbmcvcGFja2FnZS5odG1sIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODhmYzMzCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9sYW5nL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDggQEAKKzxodG1sPgorICA8aGVhZD4KKyAgICA8dGl0bGU+cGFja2FnZSBncm9vdnkubGFuZy4qPC90aXRsZT4KKyAgPC9oZWFkPgorICA8Ym9keT4KKyAgICA8cD5Db3JlIEdyb292eSBsYW5ndWFnZSBjbGFzc2VzIGZvciBpbXBsZW1lbnRpbmcgZGF0YSBzdHJ1Y3R1cmVzLCBjbG9zdXJlcywgbWV0YWRhdGEgYW5kIHNvIGZvcnRoLjwvcD4KKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9tb2NrL0Nsb3N1cmVDb25zdHJhaW50TWF0Y2hlci5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9tb2NrL0Nsb3N1cmVDb25zdHJhaW50TWF0Y2hlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxOTJlZjkKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L21vY2svQ2xvc3VyZUNvbnN0cmFpbnRNYXRjaGVyLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgZ3Jvb3Z5Lm1vY2s7CisKK2ltcG9ydCBncm9vdnkubGFuZy5DbG9zdXJlOworaW1wb3J0IGNvbS5tb2Nrb2JqZWN0cy5jb25zdHJhaW50LkNvbnN0cmFpbnQ7CisKKy8qKgorICogCisgKiBAYXV0aG9yIEpvZSBXYWxuZXMKKyAqIEBhdXRob3IgQ2hyaXMgU3RldmVuc29uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBDbG9zdXJlQ29uc3RyYWludE1hdGNoZXIgaW1wbGVtZW50cyBDb25zdHJhaW50IHsKKyAgICBwcml2YXRlIGZpbmFsIENsb3N1cmUgY2xvc3VyZTsKKyAgICBwcml2YXRlIFN0cmluZyBtZXNzYWdlID0gImNsb3N1cmUiOworCisgICAgcHVibGljIENsb3N1cmVDb25zdHJhaW50TWF0Y2hlcihDbG9zdXJlIGNsb3N1cmUpIHsKKyAgICAgICAgdGhpcy5jbG9zdXJlID0gY2xvc3VyZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBldmFsKE9iamVjdCBvYmplY3QpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNsb3N1cmUuY2FsbCgoT2JqZWN0W10pb2JqZWN0KTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChBc3NlcnRpb25FcnJvciBlKSB7CisgICAgICAgICAgICBtZXNzYWdlID0gZS5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbW9jay9Hcm9vdnlNb2NrLmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L21vY2svR3Jvb3Z5TW9jay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNWZjN2QKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L21vY2svR3Jvb3Z5TW9jay5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGdyb292eS5tb2NrOworCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0OworaW1wb3J0IGdyb292eS5sYW5nLkNsb3N1cmU7CitpbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0U3VwcG9ydDsKKworaW1wb3J0IGNvbS5tb2Nrb2JqZWN0cy5WZXJpZmlhYmxlOworaW1wb3J0IGNvbS5tb2Nrb2JqZWN0cy5keW5hbWljLio7CisKKy8qKgorICogCisgKiBAYXV0aG9yIEpvZSBXYWxuZXMKKyAqIEBhdXRob3IgQ2hyaXMgU3RldmVuc29uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBHcm9vdnlNb2NrIGV4dGVuZHMgR3Jvb3Z5T2JqZWN0U3VwcG9ydCBpbXBsZW1lbnRzIFZlcmlmaWFibGUgeworCisgICAgcHJpdmF0ZSBDYWxsQmFnIGNhbGxzID0gbmV3IENhbGxCYWcoKTsKKyAgICBwcml2YXRlIENhbGxGYWN0b3J5IGNhbGxGYWN0b3J5ID0gbmV3IERlZmF1bHRDYWxsRmFjdG9yeSgpOworICAgIHByaXZhdGUgTW9jayBtb2NrID0gbmV3IE1vY2soSS5jbGFzcyk7CisKKyAgICBpbnRlcmZhY2UgSSB7CisgICAgfQorCisgICAgcHJpdmF0ZSBHcm9vdnlPYmplY3QgaW5zdGFuY2UgPSBuZXcgR3Jvb3Z5T2JqZWN0U3VwcG9ydCgpIHsKKyAgICAgICAgcHVibGljIE9iamVjdCBpbnZva2VNZXRob2QoU3RyaW5nIG5hbWUsIE9iamVjdCBhcmdzKSB7CisgICAgICAgICAgICByZXR1cm4gY2FsbE1ldGhvZChuYW1lLCBhcmdzKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwdWJsaWMgT2JqZWN0IGludm9rZU1ldGhvZChTdHJpbmcgbmFtZSwgT2JqZWN0IGFyZ3MpIHsKKyAgICAgICAgaWYgKG5hbWUuZXF1YWxzKCJ2ZXJpZnkiKSkgeworICAgICAgICAgICAgdmVyaWZ5KCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBleHBlY3RNZXRob2QobmFtZSwgYXJncyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIEdyb292eU9iamVjdCBnZXRJbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIGluc3RhbmNlOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgR3Jvb3Z5TW9jayBuZXdJbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBHcm9vdnlNb2NrKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGV4cGVjdE1ldGhvZChTdHJpbmcgbmFtZSwgT2JqZWN0IGFyZ3MpIHsKKyAgICAgICAgQ29uc3RyYWludE1hdGNoZXIgY29uc3RyYWludE1hdGNoZXIgPSBjcmVhdGVNYXRjaGVyKGFyZ3MpOworICAgICAgICBjYWxscy5hZGRFeHBlY3QoCisgICAgICAgICAgICBjYWxsRmFjdG9yeS5jcmVhdGVDYWxsRXhwZWN0YXRpb24oCisgICAgICAgICAgICAgICAgY2FsbEZhY3RvcnkuY3JlYXRlQ2FsbFNpZ25hdHVyZShuYW1lLCBjb25zdHJhaW50TWF0Y2hlciwgY2FsbEZhY3RvcnkuY3JlYXRlVm9pZFN0dWIoKSkpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIENvbnN0cmFpbnRNYXRjaGVyIGNyZWF0ZU1hdGNoZXIoT2JqZWN0IGFyZ3MpIHsKKyAgICAgICAgaWYoYXJncy5nZXRDbGFzcygpLmlzQXJyYXkoKSkgeworICAgICAgICAgICAgT2JqZWN0IGFyZ0FycmF5W10gPSAoT2JqZWN0W10pIGFyZ3M7CisgICAgICAgICAgICBpZiAoYXJnQXJyYXlbMF0gaW5zdGFuY2VvZiBDbG9zdXJlKSB7CisgICAgICAgICAgICAgICAgQ2xvc3VyZSBjbG9zdXJlID0gKENsb3N1cmUpIGFyZ0FycmF5WzBdOworICAgICAgICAgICAgICAgIHJldHVybiBDLmFyZ3MobmV3IENsb3N1cmVDb25zdHJhaW50TWF0Y2hlcihjbG9zdXJlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMuYXJncyhDLmVxKGFyZ3MpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIE9iamVjdCBjYWxsTWV0aG9kKFN0cmluZyBuYW1lLCBPYmplY3QgYXJncykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGNhbGxzLmNhbGwobW9jaywgbmFtZSwgbmV3IE9iamVjdFtdIHsgYXJncyB9KTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHRocm93YWJsZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24odGhyb3dhYmxlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZlcmlmeSgpIHsKKyAgICAgICAgY2FsbHMudmVyaWZ5KCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L21vY2svaW50ZXJjZXB0b3IvRGVtYW5kLmdyb292eSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbW9jay9pbnRlcmNlcHRvci9EZW1hbmQuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3MmViYzQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L21vY2svaW50ZXJjZXB0b3IvRGVtYW5kLmdyb292eQpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBncm9vdnkubW9jay5pbnRlcmNlcHRvcgorCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yCisKKy8qKgorICAgIFRoZSBvYmplY3QgdGhhdCByZWdpc3RlcnMgbWV0aG9kIGNhbGxzIG9uIGl0IGZvciB0aGUgdXNlIHdpdGggTW9ja3MgYW5kIFN0dWJzLgorICAgIEZvciBlYWNoIGNhbGwgYSBDYWxsU3BlYyBvYmplY3QgaXMgYWRkZWQgdG8gdGhlIHJlY29yZGVkIGxpc3QuCisgICAgQGF1dGhvciBEaWVyayBLb2VuaWcKKyovCisKK2NsYXNzIERlbWFuZCB7CisKKyAgICBkZWYgTGlzdCByZWNvcmRlZCA9IFtdCisKKyAgICBPYmplY3QgaW52b2tlTWV0aG9kKFN0cmluZyBtZXRob2ROYW1lLCBPYmplY3QgYXJncykgeworICAgICAgICBkZWYgcmFuZ2UgPSAxLi4xCisgICAgICAgIGlmIChhcmdzWzBdIGluc3RhbmNlb2YgSW50UmFuZ2UpIHsKKyAgICAgICAgICAgIHJhbmdlID0gYXJnc1swXQorICAgICAgICAgICAgaWYgKHJhbmdlLnJldmVyc2UpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oJ1JldmVyc2UgcmFuZ2VzIG5vdCBzdXBwb3J0ZWQuJykKKyAgICAgICAgfQorICAgICAgICBpZiAoYXJnc1stMV0gaW5zdGFuY2VvZiBDbG9zdXJlKSB7CisgICAgICAgICAgICByZWNvcmRlZCA8PCBuZXcgQ2FsbFNwZWMobmFtZTptZXRob2ROYW1lLCBiZWhhdmlvcjphcmdzWy0xXSwgcmFuZ2U6cmFuZ2UpCisgICAgICAgIH0KKyAgICB9CisKKyAgICBkZWYgdmVyaWZ5KExpc3QgY2FsbHMpIHsKKyAgICAgICAgZm9yIChpIGluIDAgLi48IHJlY29yZGVkLnNpemUoKSkgeworICAgICAgICAgICAgZGVmIGNhbGwgPSByZWNvcmRlZFtpXQorICAgICAgICAgICAgZGVmIGNhbGxDb3VudGVyID0gY2FsbHNbaV0gPyBjYWxsc1tpXSA6IDAKKyAgICAgICAgICAgIGlmICghIGNhbGwucmFuZ2UuY29udGFpbnMoIGNhbGxDb3VudGVyICkgKSB7CisgICAgICAgICAgICAgICAgZGVmIG1zZyA9ICJ2ZXJpZnlbJGldOiBleHBlY3RlZCAke2NhbGwucmFuZ2UudG9TdHJpbmcoKX0gY2FsbChzKSB0byAnJHtjYWxsLm5hbWV9JyBidXQgd2FzICIKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbGVkRXJyb3IobXNnICsgImNhbGxlZCAkY2FsbENvdW50ZXIgdGltZShzKS4iKQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCit9CisKK2NsYXNzIENhbGxTcGVjIHsKKyAgICBTdHJpbmcgIG5hbWUKKyAgICBDbG9zdXJlIGJlaGF2aW9yCisgICAgUmFuZ2UgICByYW5nZQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9tb2NrL2ludGVyY2VwdG9yL0xvb3NlRXhwZWN0YXRpb24uZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9tb2NrL2ludGVyY2VwdG9yL0xvb3NlRXhwZWN0YXRpb24uZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmN2UzMmIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L21vY2svaW50ZXJjZXB0b3IvTG9vc2VFeHBlY3RhdGlvbi5ncm9vdnkKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgZ3Jvb3Z5Lm1vY2suaW50ZXJjZXB0b3IKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnRpb25GYWlsZWRFcnJvcgorCisvKioKKyAgICBFeHBlY3RzIGRlbWFuZGVkIGNhbGwgY2FyZGluYWxpdGllcyB0byBtYXRjaCBkZW1hbmRlZCByYW5nZXMuCisgICAgVGhlIGNhbGxzIGFyZSBhbGxvd2VkIHRvIGJlIG91dCBvZiB0aGUgcmVjb3JkZWQgc2VxdWVuY2UuCisgICAgSWYgYSBtZXRob2QgaXMgZGVtYW5kZWQgbXVsdGlwbGUgdGltZXMsIHRoZSByYW5nZXMgYXJlIGZpbGxlZCBieSBvcmRlciBvZiByZWNvcmRpbmcuCisgICAgQFNlZSBTdHJpY3RFeHBlY3RhdGlvbgorICAgIEBhdXRob3IgRGllcmsgS29lbmlnCisqLworCitjbGFzcyBMb29zZUV4cGVjdGF0aW9uIHsKKyAgICBEZW1hbmQgZkRlbWFuZCAgPSBudWxsCisgICAgTGlzdCBmQ2FsbHMgICAgICA9IFtdCisKKyAgICBMb29zZUV4cGVjdGF0aW9uKERlbWFuZCBkZW1hbmQpIHsKKyAgICAgICAgZkRlbWFuZCA9IGRlbWFuZAorICAgIH0KKworICAgIC8qKgorICAgICAgICBNYXRjaCB0aGUgcmVxdWVzdGVkIG1ldGhvZCBuYW1lIGFnYWluc3QgZWxpZ2libGUgZGVtYW5kcy4KKyAgICAgICAgRmFpbCBlYXJseSBpZiBubyBtYXRjaCBwb3NzaWJsZS4KKyAgICAgICAgUmV0dXJuIHRoZSBkZW1hbmQncyBiZWhhdmlvciBjbG9zdXJlIG9uIG1hdGNoLgorICAgICovCisgICAgQ2xvc3VyZSBtYXRjaChTdHJpbmcgbmFtZSkgeworICAgICAgICBkZWYgY2FsbEluZGV4ID0gMAorICAgICAgICAvLyBmaW5kIGZpcnN0IGVsaWdpYmxlIGNhbGxTcGVjCisgICAgICAgIHdoaWxlICghIGlzRWxpZ2libGUobmFtZSwgY2FsbEluZGV4KSApIGNhbGxJbmRleCsrCisKKyAgICAgICAgLy8gcmVnaXN0ZXIgdGhlIGNhbGwKKyAgICAgICAgZkNhbGxzW2NhbGxJbmRleF0gKz0gMQorCisgICAgICAgIHJldHVybiBmRGVtYW5kLnJlY29yZGVkW2NhbGxJbmRleF0uYmVoYXZpb3IKKyAgICB9CisKKyAgICBib29sZWFuIGlzRWxpZ2libGUoU3RyaW5nIG5hbWUsIGludCBpKSB7CisgICAgICAgIGRlZiBjYWxscyA9IGZEZW1hbmQucmVjb3JkZWQKKyAgICAgICAgaWYgKGkgPj0gY2FsbHMuc2l6ZSgpKSAgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxlZEVycm9yKCJObyBtb3JlIGNhbGxzIHRvICckbmFtZScgZXhwZWN0ZWQgYXQgdGhpcyBwb2ludC4gRW5kIG9mIGRlbWFuZHMuIikKKyAgICAgICAgfQorICAgICAgICBpZiAoY2FsbHNbaV0ubmFtZSAhPSBuYW1lKSAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlCisgICAgICAgIGlmIChudWxsID09IGZDYWxsc1tpXSkgICAgICAgICAgICAgICAgICBmQ2FsbHNbaV0gPSAwCisgICAgICAgIGlmIChmQ2FsbHNbaV0gPj0gY2FsbHNbaV0ucmFuZ2UudG8pICAgICByZXR1cm4gZmFsc2UKKyAgICAgICAgcmV0dXJuIHRydWUKKyAgICB9CisKKyAgICAvKiogdmVyaWZ5IGFsbCBjYWxscyBhcmUgaW4gZXhwZWN0ZWQgcmFuZ2UgKi8gCisgICAgdm9pZCB2ZXJpZnkoKSB7CisgICAgCWZEZW1hbmQudmVyaWZ5KGZDYWxscykKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9tb2NrL2ludGVyY2VwdG9yL01vY2tGb3IuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9tb2NrL2ludGVyY2VwdG9yL01vY2tGb3IuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNDQzMGMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L21vY2svaW50ZXJjZXB0b3IvTW9ja0Zvci5ncm9vdnkKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGdyb292eS5tb2NrLmludGVyY2VwdG9yCisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcgorCisvKioKKyAgICBGYWNhZGUgb3ZlciB0aGUgTW9ja2luZyBkZXRhaWxzLgorICAgIEEgTW9jaydzIGV4cGVjdGF0aW9uIGlzIGFsd2F5cyBzZXF1ZW5jZSBkZXBlbmRlbnQgYW5kIGl0J3MgdXNlIGFsd2F5cyBlbmRzIHdpdGggYSB2ZXJpZnkoKS4KKyAgICBTZWUgYWxzbyBTdHViRm9yLgorICAgIEBhdXRob3IgRGllcmsgS29lbmlnCisgICAgQGF1dGhvciBQYXVsIEtpbmcKKyovCisKK2NsYXNzIE1vY2tGb3IgeworCisgICAgTW9ja1Byb3h5TWV0YUNsYXNzIHByb3h5CisgICAgRGVtYW5kIGRlbWFuZAorICAgIGRlZiBleHBlY3QKKyAgICBNYXAgaW5zdGFuY2VFeHBlY3RhdGlvbnMgPSBbOl0KKyAgICBDbGFzcyBjbGF6egorCisgICAgTW9ja0ZvcihDbGFzcyBjbGF6eikgeworICAgICAgICB0aGlzLmNsYXp6ID0gY2xhenoKKyAgICAgICAgcHJveHkgPSBNb2NrUHJveHlNZXRhQ2xhc3MubWFrZShjbGF6eikKKyAgICAgICAgZGVtYW5kID0gbmV3IERlbWFuZCgpCisgICAgICAgIGV4cGVjdCA9IG5ldyBTdHJpY3RFeHBlY3RhdGlvbihkZW1hbmQpCisgICAgICAgIHByb3h5LmludGVyY2VwdG9yID0gbmV3IE1vY2tJbnRlcmNlcHRvcihleHBlY3RhdGlvbjogZXhwZWN0KQorICAgIH0KKworICAgIHZvaWQgdXNlKENsb3N1cmUgY2xvc3VyZSkgeworICAgICAgICBwcm94eS51c2UgY2xvc3VyZQorICAgICAgICBleHBlY3QudmVyaWZ5KCkKKyAgICB9CisKKyAgICB2b2lkIHVzZShHcm9vdnlPYmplY3Qgb2JqLCBDbG9zdXJlIGNsb3N1cmUpIHsKKyAgICAgICAgcHJveHkudXNlIG9iaiwgY2xvc3VyZQorICAgICAgICBleHBlY3QudmVyaWZ5KCkKKyAgICB9CisKKyAgICB2b2lkIHZlcmlmeShHcm9vdnlPYmplY3Qgb2JqKSB7CisgICAgICAgIGluc3RhbmNlRXhwZWN0YXRpb25zW29ial0udmVyaWZ5KCkKKyAgICB9CisKKyAgICBPYmplY3QgcHJveHlJbnN0YW5jZSgpIHsKKyAgICAgICAgcHJveHlJbnN0YW5jZShudWxsKQorICAgIH0KKworICAgIE9iamVjdCBwcm94eUluc3RhbmNlKGFyZ3MpIHsKKyAgICAgICAgZGVmIGluc3RhbmNlID0gZ2V0SW5zdGFuY2UoY2xhenosIGFyZ3MpCisgICAgICAgIGRlZiB0aGlzcHJveHkgPSBNb2NrUHJveHlNZXRhQ2xhc3MubWFrZShjbGF6eikKKyAgICAgICAgZGVmIHRoaXNkZW1hbmQgPSBuZXcgRGVtYW5kKHJlY29yZGVkOiBuZXcgQXJyYXlMaXN0KGRlbWFuZC5yZWNvcmRlZCkpCisgICAgICAgIGRlZiB0aGlzZXhwZWN0ID0gbmV3IFN0cmljdEV4cGVjdGF0aW9uKHRoaXNkZW1hbmQpCisgICAgICAgIHRoaXNwcm94eS5pbnRlcmNlcHRvciA9IG5ldyBNb2NrSW50ZXJjZXB0b3IoZXhwZWN0YXRpb246IHRoaXNleHBlY3QpCisgICAgICAgIGluc3RhbmNlLm1ldGFDbGFzcyA9IHRoaXNwcm94eQorICAgICAgICBpbnN0YW5jZUV4cGVjdGF0aW9uc1tpbnN0YW5jZV0gPSB0aGlzZXhwZWN0CisgICAgICAgIHJldHVybiBpbnN0YW5jZQorICAgIH0KKworICAgIE9iamVjdCBwcm94eURlbGVnYXRlSW5zdGFuY2UoKSB7CisgICAgICAgIHByb3h5RGVsZWdhdGVJbnN0YW5jZShudWxsKQorICAgIH0KKworICAgIE9iamVjdCBwcm94eURlbGVnYXRlSW5zdGFuY2UoYXJncykgeworICAgICAgICBkZWYgaW5zdGFuY2UgPSBnZXRJbnN0YW5jZShjbGF6eiwgYXJncykKKyAgICAgICAgZGVmIHRoaXNwcm94eSA9IE1vY2tQcm94eU1ldGFDbGFzcy5tYWtlKGNsYXp6KQorICAgICAgICBkZWYgdGhpc2RlbWFuZCA9IG5ldyBEZW1hbmQocmVjb3JkZWQ6IG5ldyBBcnJheUxpc3QoZGVtYW5kLnJlY29yZGVkKSkKKyAgICAgICAgZGVmIHRoaXNleHBlY3QgPSBuZXcgU3RyaWN0RXhwZWN0YXRpb24odGhpc2RlbWFuZCkKKyAgICAgICAgdGhpc3Byb3h5LmludGVyY2VwdG9yID0gbmV3IE1vY2tJbnRlcmNlcHRvcihleHBlY3RhdGlvbjogdGhpc2V4cGVjdCkKKyAgICAgICAgaW5zdGFuY2UubWV0YUNsYXNzID0gdGhpc3Byb3h5CisgICAgICAgIGRlZiB3cmFwcGVkID0gbnVsbAorICAgICAgICBpZiAoY2xhenouaXNJbnRlcmZhY2UoKSkgeworICAgICAgICAgICAgd3JhcHBlZCA9IFByb3h5R2VuZXJhdG9yLmluc3RhbnRpYXRlRGVsZWdhdGUoW2NsYXp6XSwgaW5zdGFuY2UpCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3cmFwcGVkID0gUHJveHlHZW5lcmF0b3IuaW5zdGFudGlhdGVEZWxlZ2F0ZShpbnN0YW5jZSkKKyAgICAgICAgfQorICAgICAgICBpbnN0YW5jZUV4cGVjdGF0aW9uc1t3cmFwcGVkXSA9IHRoaXNleHBlY3QKKyAgICAgICAgcmV0dXJuIHdyYXBwZWQKKyAgICB9CisKKyAgICBwcml2YXRlIGdldEluc3RhbmNlKENsYXNzIGNsYXp6LCBhcmdzKSB7CisgICAgICAgIGRlZiBpbnN0YW5jZSA9IG51bGwKKyAgICAgICAgaWYgKGNsYXp6LmlzSW50ZXJmYWNlKCkpIHsKKyAgICAgICAgICAgIGluc3RhbmNlID0gUHJveHlHZW5lcmF0b3IuaW5zdGFudGlhdGVBZ2dyZWdhdGVGcm9tSW50ZXJmYWNlKGNsYXp6KQorICAgICAgICB9IGVsc2UgaWYgKE1vZGlmaWVyLmlzQWJzdHJhY3QoY2xhenoubW9kaWZpZXJzKSkgeworICAgICAgICAgICAgaW5zdGFuY2UgPSBQcm94eUdlbmVyYXRvci5pbnN0YW50aWF0ZUFnZ3JlZ2F0ZUZyb21CYXNlQ2xhc3MoY2xhenosIGFyZ3MpCisgICAgICAgIH0gZWxzZSBpZiAoYXJncyAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoY2xhenogaW5zdGFuY2VvZiBHcm9vdnlPYmplY3QpIHsKKyAgICAgICAgICAgICAgICBpbnN0YW5jZSA9IGNsYXp6Lm5ld0luc3RhbmNlKGFyZ3MpCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGluc3RhbmNlID0gUHJveHlHZW5lcmF0b3IuaW5zdGFudGlhdGVEZWxlZ2F0ZShjbGF6ei5uZXdJbnN0YW5jZShhcmdzKSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChjbGF6eiBpbnN0YW5jZW9mIEdyb292eU9iamVjdCkgeworICAgICAgICAgICAgICAgIGluc3RhbmNlID0gY2xhenoubmV3SW5zdGFuY2UoKQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnN0YW5jZSA9IFByb3h5R2VuZXJhdG9yLmluc3RhbnRpYXRlRGVsZWdhdGUoY2xhenoubmV3SW5zdGFuY2UoKSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW5zdGFuY2UKKyAgICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L21vY2svaW50ZXJjZXB0b3IvTW9ja0ludGVyY2VwdG9yLmdyb292eSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbW9jay9pbnRlcmNlcHRvci9Nb2NrSW50ZXJjZXB0b3IuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNmIyNjMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L21vY2svaW50ZXJjZXB0b3IvTW9ja0ludGVyY2VwdG9yLmdyb292eQpAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBncm9vdnkubW9jay5pbnRlcmNlcHRvcgorCisvKioKKyAgICBJbnRlcmNlcHRpbmcgY2FsbHMgdG8gdGhlIGNvbGxhYm9yYXRpbmcgb2JqZWN0IGFuZCBub3RpZnkgdGhlIGV4cGVjdGF0aW9uIG9iamVjdC4KKyAgICBAYXV0aG9yIERpZXJrIEtvZW5pZworKi8KKworY2xhc3MgTW9ja0ludGVyY2VwdG9yIGltcGxlbWVudHMgUHJvcGVydHlBY2Nlc3NJbnRlcmNlcHRvciB7CisKKyAgICBkZWYgZXhwZWN0YXRpb24gPSBudWxsCisKKyAgICBPYmplY3QgYmVmb3JlSW52b2tlKE9iamVjdCBvYmplY3QsIFN0cmluZyBtZXRob2ROYW1lLCBPYmplY3RbXSBhcmd1bWVudHMpIHsKKyAgICAgICAgaWYgKCFleHBlY3RhdGlvbikgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUHJvcGVydHkgJ2V4cGVjdGF0aW9uJyBtdXN0IGJlIHNldCBiZWZvcmUgdXNlLiIpCisgICAgICAgIHJldHVybiBleHBlY3RhdGlvbi5tYXRjaChtZXRob2ROYW1lKS5jYWxsKGFyZ3VtZW50cykKKyAgICB9CisKKyAgICBPYmplY3QgYmVmb3JlR2V0KE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkgeworICAgICAgICBpZiAoIWV4cGVjdGF0aW9uKSB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJQcm9wZXJ0eSAnZXhwZWN0YXRpb24nIG11c3QgYmUgc2V0IGJlZm9yZSB1c2UuIikKKyAgICAgICAgU3RyaW5nIG5hbWUgPSAiZ2V0JHtwcm9wZXJ0eVswXS50b1VwcGVyQ2FzZSgpfSR7cHJvcGVydHlbMS4uLTFdfSIKKyAgICAgICAgcmV0dXJuIGV4cGVjdGF0aW9uLm1hdGNoKG5hbWUpLmNhbGwoKSAgICAgICAgICAgICAgICAgICAgCisgICAgfQorCisgICAgdm9pZCBiZWZvcmVTZXQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgbmV3VmFsdWUpIHsKKyAgICAgICAgaWYgKCFleHBlY3RhdGlvbikgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUHJvcGVydHkgJ2V4cGVjdGF0aW9uJyBtdXN0IGJlIHNldCBiZWZvcmUgdXNlLiIpCisgICAgICAgIFN0cmluZyBuYW1lID0gInNldCR7cHJvcGVydHlbMF0udG9VcHBlckNhc2UoKX0ke3Byb3BlcnR5WzEuLi0xXX0iCisgICAgICAgIGV4cGVjdGF0aW9uLm1hdGNoKG5hbWUpLmNhbGwobmV3VmFsdWUpCisgICAgfQorCisgICAgT2JqZWN0IGFmdGVySW52b2tlKE9iamVjdCBvYmplY3QsIFN0cmluZyBtZXRob2ROYW1lLCBPYmplY3RbXSBhcmd1bWVudHMsIE9iamVjdCByZXN1bHQpIHsKKyAgICAgICAgcmV0dXJuIG51bGwgLy8gbmV2ZXIgdXNlZAorICAgIH0KKworICAgIGJvb2xlYW4gZG9JbnZva2UoKSB7CisgICAgICAgIHJldHVybiBmYWxzZSAvLyBmdXR1cmUgdmVyc2lvbnMgbWF5IGFsbG93IGNvbGxhYm9yYXRvciBtZXRob2QgY2FsbHMgZGVwZW5kaW5nIG9uIHN0YXRlCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbW9jay9pbnRlcmNlcHRvci9Nb2NrUHJveHlNZXRhQ2xhc3MuamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbW9jay9pbnRlcmNlcHRvci9Nb2NrUHJveHlNZXRhQ2xhc3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDVkNDM5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9tb2NrL2ludGVyY2VwdG9yL01vY2tQcm94eU1ldGFDbGFzcy5qYXZhCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGdyb292eS5tb2NrLmludGVyY2VwdG9yOworCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuKjsKKworaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdGlvbkV4Y2VwdGlvbjsKKworLyoqCisgKiBUaGUgUHJveHlNZXRhQ2xhc3MgZm9yIHRoZSBNb2NrSW50ZXJjZXB0b3IuCisgKiBJbnN0YW5jZSBhbmQgY2xhc3MgbWV0aG9kcyBhcmUgaW50ZXJjZXB0ZWQsIGJ1dCBjb25zdHJ1Y3RvcnMgYXJlIG5vdCB0byBhbGxvdyBtb2NraW5nIG9mIGFnZ3JlZ2F0ZWQgb2JqZWN0cy4KKyAqIEBhdXRob3IgRGllcmsgS29lbmlnCisgKi8KKworcHVibGljIGNsYXNzIE1vY2tQcm94eU1ldGFDbGFzcyBleHRlbmRzIFByb3h5TWV0YUNsYXNzIHsKKworICAgIC8qKgorICAgICAqIEBwYXJhbSBhZGFwdGVlIHRoZSBNZXRhQ2xhc3MgdG8gZGVjb3JhdGUgd2l0aCBpbnRlcmNlcHRhYmlsaXR5CisgICAgICovCisgICAgcHVibGljIE1vY2tQcm94eU1ldGFDbGFzcyhNZXRhQ2xhc3NSZWdpc3RyeSByZWdpc3RyeSwgQ2xhc3MgdGhlQ2xhc3MsIE1ldGFDbGFzcyBhZGFwdGVlKSB0aHJvd3MgSW50cm9zcGVjdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyKHJlZ2lzdHJ5LCB0aGVDbGFzcywgYWRhcHRlZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogY29udmVuaWVuY2UgZmFjdG9yeSBtZXRob2QgZm9yIHRoZSBtb3N0IHVzdWFsIGNhc2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBNb2NrUHJveHlNZXRhQ2xhc3MgbWFrZShDbGFzcyB0aGVDbGFzcykgdGhyb3dzIEludHJvc3BlY3Rpb25FeGNlcHRpb24geworICAgICAgICBNZXRhQ2xhc3NSZWdpc3RyeSBtZXRhUmVnaXN0cnkgPSBHcm9vdnlTeXN0ZW0uZ2V0TWV0YUNsYXNzUmVnaXN0cnkoKTsKKyAgICAgICAgTWV0YUNsYXNzIG1ldGEgPSBtZXRhUmVnaXN0cnkuZ2V0TWV0YUNsYXNzKHRoZUNsYXNzKTsKKyAgICAgICAgcmV0dXJuIG5ldyBNb2NrUHJveHlNZXRhQ2xhc3MobWV0YVJlZ2lzdHJ5LCB0aGVDbGFzcywgbWV0YSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgT2JqZWN0IGludm9rZU1ldGhvZChmaW5hbCBPYmplY3Qgb2JqZWN0LCBmaW5hbCBTdHJpbmcgbWV0aG9kTmFtZSwgZmluYWwgT2JqZWN0W10gYXJndW1lbnRzKSB7CisgICAgICAgIGlmIChudWxsID09IGludGVyY2VwdG9yKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiY2Fubm90IGludm9rZSB3aXRob3V0IGludGVyY2VwdG9yIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGludGVyY2VwdG9yLmJlZm9yZUludm9rZShvYmplY3QsIG1ldGhvZE5hbWUsIGFyZ3VtZW50cyk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBpbnZva2VTdGF0aWNNZXRob2QoZmluYWwgT2JqZWN0IG9iamVjdCwgZmluYWwgU3RyaW5nIG1ldGhvZE5hbWUsIGZpbmFsIE9iamVjdFtdIGFyZ3VtZW50cykgeworICAgICAgICBpZiAobnVsbCA9PSBpbnRlcmNlcHRvcikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImNhbm5vdCBpbnZva2Ugd2l0aG91dCBpbnRlcmNlcHRvciIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBpbnRlcmNlcHRvci5iZWZvcmVJbnZva2Uob2JqZWN0LCBtZXRob2ROYW1lLCBhcmd1bWVudHMpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoQ2xhc3MgYUNsYXNzLCBPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHksIGJvb2xlYW4gYiwgYm9vbGVhbiBiMSkgeworICAgICAgICBpZiAobnVsbCA9PSBpbnRlcmNlcHRvcikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImNhbm5vdCBpbnZva2Ugd2l0aG91dCBpbnRlcmNlcHRvciIpOworICAgICAgICB9CisgICAgICAgIGlmKGludGVyY2VwdG9yIGluc3RhbmNlb2YgUHJvcGVydHlBY2Nlc3NJbnRlcmNlcHRvcikgeworICAgICAgICAgICAgcmV0dXJuICgoUHJvcGVydHlBY2Nlc3NJbnRlcmNlcHRvcilpbnRlcmNlcHRvcikuYmVmb3JlR2V0KG9iamVjdCxwcm9wZXJ0eSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0UHJvcGVydHkoYUNsYXNzLG9iamVjdCxwcm9wZXJ0eSxiLGIpOworICAgICAgICB9CisKKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KENsYXNzIGFDbGFzcywgT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgbmV3VmFsdWUsIGJvb2xlYW4gYiwgYm9vbGVhbiBiMSkgeworICAgICAgICBpZiAobnVsbCA9PSBpbnRlcmNlcHRvcikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImNhbm5vdCBpbnZva2Ugd2l0aG91dCBpbnRlcmNlcHRvciIpOworICAgICAgICB9CisKKyAgICAgICAgaWYoaW50ZXJjZXB0b3IgaW5zdGFuY2VvZiBQcm9wZXJ0eUFjY2Vzc0ludGVyY2VwdG9yKSB7CisgICAgICAgICAgICAoKFByb3BlcnR5QWNjZXNzSW50ZXJjZXB0b3IpaW50ZXJjZXB0b3IpLmJlZm9yZVNldChvYmplY3QscHJvcGVydHksIG5ld1ZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHN1cGVyLnNldFByb3BlcnR5KGFDbGFzcyxvYmplY3QscHJvcGVydHksbmV3VmFsdWUsYixiKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogVW5saWtlIGdlbmVyYWwgaW1wbCBpbiBzdXBlcmNsYXNzLCBjdG9ycyBhcmUgbm90IGludGVyY2VwdGVkIGJ1dCByZWxheWVkCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBpbnZva2VDb25zdHJ1Y3RvcihmaW5hbCBPYmplY3RbXSBhcmd1bWVudHMpIHsKKyAgICAgICAgcmV0dXJuIGFkYXB0ZWUuaW52b2tlQ29uc3RydWN0b3IoYXJndW1lbnRzKTsKKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L21vY2svaW50ZXJjZXB0b3IvU3RyaWN0RXhwZWN0YXRpb24uZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9tb2NrL2ludGVyY2VwdG9yL1N0cmljdEV4cGVjdGF0aW9uLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWE1MGE3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9tb2NrL2ludGVyY2VwdG9yL1N0cmljdEV4cGVjdGF0aW9uLmdyb292eQpAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBncm9vdnkubW9jay5pbnRlcmNlcHRvcgorCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yCisKKy8qKgorICAgIEV4cGVjdHMgZGVtYW5kZWQgY2FsbCBjYXJkaW5hbGl0aWVzIHRvIG1hdGNoIGRlbWFuZGVkIHJhbmdlcyBpbiB0aGUgc2VxdWVuY2Ugb2YgcmVjb3JkaW5nLgorICAgIEBTZWUgTG9vc2VFeHBlY3RhdGlvbgorICAgIEBhdXRob3IgRGllcmsgS29lbmlnCisqLworCitjbGFzcyBTdHJpY3RFeHBlY3RhdGlvbiB7CisgICAgRGVtYW5kIGZEZW1hbmQgID0gbnVsbAorICAgIGludCBmQ2FsbFNwZWNJZHggPSAwCisgICAgTGlzdCBmQ2FsbHMgICAgICA9IFtdCisKKyAgICBTdHJpY3RFeHBlY3RhdGlvbihEZW1hbmQgZGVtYW5kKSB7CisgICAgICAgIGZEZW1hbmQgPSBkZW1hbmQKKyAgICB9CisKKyAgICAvKioKKyAgICAgICAgTWF0Y2ggdGhlIHJlcXVlc3RlZCBtZXRob2QgbmFtZSBhZ2FpbnN0IGVsaWdpYmxlIGRlbWFuZHMuCisgICAgICAgIEZhaWwgZWFybHkgaWYgbm8gbWF0Y2ggcG9zc2libGUuCisgICAgICAgIFJldHVybiB0aGUgZGVtYW5kJ3MgYmVoYXZpb3IgY2xvc3VyZSBvbiBtYXRjaC4KKyAgICAqLworICAgIENsb3N1cmUgbWF0Y2goU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgaWYgKCFmQ2FsbHNbZkNhbGxTcGVjSWR4XSkgZkNhbGxzW2ZDYWxsU3BlY0lkeF0gPSAwCisKKyAgICAgICAgaWYgKGZDYWxsU3BlY0lkeCA+PSBmRGVtYW5kLnJlY29yZGVkLnNpemUoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxlZEVycm9yKCJObyBtb3JlIGNhbGxzIHRvICckbmFtZScgZXhwZWN0ZWQgYXQgdGhpcyBwb2ludC4gRW5kIG9mIGRlbWFuZHMuIikKKyAgICAgICAgfQorCisgICAgICAgIGRlZiBjYWxsID0gZkRlbWFuZC5yZWNvcmRlZFtmQ2FsbFNwZWNJZHhdCisgICAgICAgIGlmIChuYW1lICE9IGNhbGwubmFtZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgbmFtZSBkb2VzIG5vdCBtYXRjaC4uLgorICAgICAgICAgICAgZGVmIG9wZW4gPSBjYWxsLnJhbmdlLmZyb20gLSBmQ2FsbHNbZkNhbGxTcGVjSWR4XQorICAgICAgICAgICAgaWYgKCBvcGVuID4gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uLiBpZiB3ZSBoYXZlbid0IHJlYWNoZWQgdGhlIG1pbmltdW0sIHlldCAtPiBFeGNlcHRpb24KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbGVkRXJyb3IoIk5vIGNhbGwgdG8gJyRuYW1lJyBleHBlY3RlZCBhdCB0aGlzIHBvaW50LiAiKworICAgICAgICAgICAgICAgICJTdGlsbCAkb3BlbiBjYWxsKHMpIHRvICcke2NhbGwubmFtZX0nIGV4cGVjdGVkLiIpCisgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4uIHByb2NlZWQgZmluZGluZworICAgICAgICAgICAgICAgIGZDYWxsU3BlY0lkeCsrCisgICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoKG5hbWUpCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyByZWdpc3RlciB0aGUgY2FsbAorICAgICAgICBmQ2FsbHNbZkNhbGxTcGVjSWR4XSArPSAxCisKKyAgICAgICAgLy8gc3RvcmUgdGhlIGJlaGF2aW9yIGZvciByZXR1cm5pbmcKKyAgICAgICAgZGVmIHJlc3VsdCA9IGNhbGwuYmVoYXZpb3IKKworICAgICAgICAvLyBwcm9jZWVkIHRvIG5leHQgY2FsbFNwZWMgaWYgd2UgbmVlZCB0bworICAgICAgICBpZiAoZkNhbGxzW2ZDYWxsU3BlY0lkeF0gPj0gY2FsbC5yYW5nZS50byApIGZDYWxsU3BlY0lkeCsrCisKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgIH0KKworICAgIC8qKiB2ZXJpZnkgYWxsIGNhbGxzIGFyZSBpbiBleHBlY3RlZCByYW5nZSAqLworICAgIHZvaWQgdmVyaWZ5KCkgeworICAgICAgICBmRGVtYW5kLnZlcmlmeShmQ2FsbHMpCisgICAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9tb2NrL2ludGVyY2VwdG9yL1N0dWJGb3IuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9tb2NrL2ludGVyY2VwdG9yL1N0dWJGb3IuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNDE0M2UKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L21vY2svaW50ZXJjZXB0b3IvU3R1YkZvci5ncm9vdnkKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGdyb292eS5tb2NrLmludGVyY2VwdG9yCisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcgorCisvKioKKyAgICBGYWNhZGUgb3ZlciB0aGUgU3R1YmJpbmcgZGV0YWlscy4KKyAgICBBIFN0dWIncyBleHBlY3RhdGlvbiBpcyBzZXF1ZW5jZSBpbmRlcGVuZGVudCBhbmQgdXNlIG9mIHZlcmlmeSgpIGlzIGxlZnQgdG8gdGhlIHVzZXIuCisgICAgQFNlZSBNb2NrRm9yLgorICAgIEBhdXRob3IgRGllcmsgS29lbmlnCisgICAgQGF1dGhvciBQYXVsIEtpbmcKKyovCisKK2NsYXNzIFN0dWJGb3IgeworCisgICAgTW9ja1Byb3h5TWV0YUNsYXNzIHByb3h5CisgICAgRGVtYW5kIGRlbWFuZAorICAgIGRlZiBleHBlY3QKKyAgICBNYXAgaW5zdGFuY2VFeHBlY3RhdGlvbnMgPSBbOl0KKyAgICBDbGFzcyBjbGF6egorCisgICAgU3R1YkZvcihDbGFzcyBjbGF6eikgeworICAgICAgICB0aGlzLmNsYXp6ID0gY2xhenoKKyAgICAgICAgcHJveHkgPSBNb2NrUHJveHlNZXRhQ2xhc3MubWFrZShjbGF6eikKKyAgICAgICAgZGVtYW5kID0gbmV3IERlbWFuZCgpCisgICAgICAgIGV4cGVjdCA9IG5ldyBMb29zZUV4cGVjdGF0aW9uKGRlbWFuZCkKKyAgICAgICAgcHJveHkuaW50ZXJjZXB0b3IgPSBuZXcgTW9ja0ludGVyY2VwdG9yKGV4cGVjdGF0aW9uOiBleHBlY3QpCisgICAgfQorCisgICAgdm9pZCB1c2UoQ2xvc3VyZSBjbG9zdXJlKSB7CisgICAgICAgIHByb3h5LnVzZSBjbG9zdXJlCisgICAgfQorCisgICAgdm9pZCB1c2UoR3Jvb3Z5T2JqZWN0IG9iaiwgQ2xvc3VyZSBjbG9zdXJlKSB7CisgICAgICAgIHByb3h5LnVzZSBvYmosIGNsb3N1cmUKKyAgICB9CisKKyAgICAvLyBUT0RPOiByZW1vdmUgZHVwIHdpdGggTW9ja0ZvcgorICAgIHZvaWQgdmVyaWZ5KEdyb292eU9iamVjdCBvYmopIHsKKyAgICAgICAgaW5zdGFuY2VFeHBlY3RhdGlvbnNbb2JqXS52ZXJpZnkoKQorICAgIH0KKworICAgIE9iamVjdCBwcm94eUluc3RhbmNlKCkgeworICAgICAgICBwcm94eUluc3RhbmNlKG51bGwpCisgICAgfQorCisgICAgT2JqZWN0IHByb3h5SW5zdGFuY2UoYXJncykgeworICAgICAgICBkZWYgaW5zdGFuY2UgPSBnZXRJbnN0YW5jZShjbGF6eiwgYXJncykKKyAgICAgICAgZGVmIHRoaXNwcm94eSA9IE1vY2tQcm94eU1ldGFDbGFzcy5tYWtlKGNsYXp6KQorICAgICAgICBkZWYgdGhpc2RlbWFuZCA9IG5ldyBEZW1hbmQocmVjb3JkZWQ6IG5ldyBBcnJheUxpc3QoZGVtYW5kLnJlY29yZGVkKSkKKyAgICAgICAgZGVmIHRoaXNleHBlY3QgPSBuZXcgTG9vc2VFeHBlY3RhdGlvbih0aGlzZGVtYW5kKQorICAgICAgICB0aGlzcHJveHkuaW50ZXJjZXB0b3IgPSBuZXcgTW9ja0ludGVyY2VwdG9yKGV4cGVjdGF0aW9uOiB0aGlzZXhwZWN0KQorICAgICAgICBpbnN0YW5jZS5tZXRhQ2xhc3MgPSB0aGlzcHJveHkKKyAgICAgICAgaW5zdGFuY2VFeHBlY3RhdGlvbnNbaW5zdGFuY2VdID0gdGhpc2V4cGVjdAorICAgICAgICByZXR1cm4gaW5zdGFuY2UKKyAgICB9CisKKyAgICBPYmplY3QgcHJveHlEZWxlZ2F0ZUluc3RhbmNlKCkgeworICAgICAgICBwcm94eURlbGVnYXRlSW5zdGFuY2UobnVsbCkKKyAgICB9CisKKyAgICBPYmplY3QgcHJveHlEZWxlZ2F0ZUluc3RhbmNlKGFyZ3MpIHsKKyAgICAgICAgZGVmIGluc3RhbmNlID0gZ2V0SW5zdGFuY2UoY2xhenosIGFyZ3MpCisgICAgICAgIGRlZiB0aGlzcHJveHkgPSBNb2NrUHJveHlNZXRhQ2xhc3MubWFrZShjbGF6eikKKyAgICAgICAgZGVmIHRoaXNkZW1hbmQgPSBuZXcgRGVtYW5kKHJlY29yZGVkOiBuZXcgQXJyYXlMaXN0KGRlbWFuZC5yZWNvcmRlZCkpCisgICAgICAgIGRlZiB0aGlzZXhwZWN0ID0gbmV3IExvb3NlRXhwZWN0YXRpb24odGhpc2RlbWFuZCkKKyAgICAgICAgdGhpc3Byb3h5LmludGVyY2VwdG9yID0gbmV3IE1vY2tJbnRlcmNlcHRvcihleHBlY3RhdGlvbjogdGhpc2V4cGVjdCkKKyAgICAgICAgaW5zdGFuY2UubWV0YUNsYXNzID0gdGhpc3Byb3h5CisgICAgICAgIGRlZiB3cmFwcGVkID0gbnVsbAorICAgICAgICBpZiAoY2xhenouaXNJbnRlcmZhY2UoKSkgeworICAgICAgICAgICAgd3JhcHBlZCA9IFByb3h5R2VuZXJhdG9yLmluc3RhbnRpYXRlRGVsZWdhdGUoW2NsYXp6XSwgaW5zdGFuY2UpCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3cmFwcGVkID0gUHJveHlHZW5lcmF0b3IuaW5zdGFudGlhdGVEZWxlZ2F0ZShpbnN0YW5jZSkKKyAgICAgICAgfQorICAgICAgICBpbnN0YW5jZUV4cGVjdGF0aW9uc1t3cmFwcGVkXSA9IHRoaXNleHBlY3QKKyAgICAgICAgcmV0dXJuIHdyYXBwZWQKKyAgICB9CisKKyAgICBwcml2YXRlIGdldEluc3RhbmNlKENsYXNzIGNsYXp6LCBhcmdzKSB7CisgICAgICAgIGRlZiBpbnN0YW5jZSA9IG51bGwKKyAgICAgICAgaWYgKGNsYXp6LmlzSW50ZXJmYWNlKCkpIHsKKyAgICAgICAgICAgIGluc3RhbmNlID0gUHJveHlHZW5lcmF0b3IuaW5zdGFudGlhdGVBZ2dyZWdhdGVGcm9tSW50ZXJmYWNlKGNsYXp6KQorICAgICAgICB9IGVsc2UgaWYgKE1vZGlmaWVyLmlzQWJzdHJhY3QoY2xhenoubW9kaWZpZXJzKSkgeworICAgICAgICAgICAgaW5zdGFuY2UgPSBQcm94eUdlbmVyYXRvci5pbnN0YW50aWF0ZUFnZ3JlZ2F0ZUZyb21CYXNlQ2xhc3MoY2xhenosIGFyZ3MpCisgICAgICAgIH0gZWxzZSBpZiAoYXJncyAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoY2xhenogaW5zdGFuY2VvZiBHcm9vdnlPYmplY3QpIHsKKyAgICAgICAgICAgICAgICBpbnN0YW5jZSA9IGNsYXp6Lm5ld0luc3RhbmNlKGFyZ3MpCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGluc3RhbmNlID0gUHJveHlHZW5lcmF0b3IuaW5zdGFudGlhdGVEZWxlZ2F0ZShjbGF6ei5uZXdJbnN0YW5jZShhcmdzKSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChjbGF6eiBpbnN0YW5jZW9mIEdyb292eU9iamVjdCkgeworICAgICAgICAgICAgICAgIGluc3RhbmNlID0gY2xhenoubmV3SW5zdGFuY2UoKQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnN0YW5jZSA9IFByb3h5R2VuZXJhdG9yLmluc3RhbnRpYXRlRGVsZWdhdGUoY2xhenoubmV3SW5zdGFuY2UoKSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW5zdGFuY2UKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9tb2NrL2ludGVyY2VwdG9yL3BhY2thZ2UuaHRtbCBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbW9jay9pbnRlcmNlcHRvci9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIxOGVkOAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbW9jay9pbnRlcmNlcHRvci9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSw1NSBAQAorPGh0bWw+CisgIDxoZWFkPgorICAgIDx0aXRsZT5wYWNrYWdlIGdyb292eS5tb2NrLmludGVyY2VwdG9yPC90aXRsZT4KKyAgPC9oZWFkPgorICA8Ym9keT4KKyAgICA8cD5UaGUgZ3Jvb3Z5Lm1vY2suaW50ZXJjZXB0b3IgaXMgYW4gYWxsLWdyb292eSBtb2NrIHRlc3RpbmcgbGlicmFyeS48L3A+CisgICAgPHA+VGVybXM6PC9wPgorICAgIDxkbD4KKyAgICAgICAgPGR0PkNhbGxhYm9yYXRvcjwvZHQ+CisgICAgICAgIDxkZD5BbiBvcmRpbmFyeSBHcm9vdnkgb3IgSmF2YSBjbGFzcyB0aGF0J3MgaW5zdGFuY2Ugb3IgY2xhc3MgbWV0aG9kcworICAgICAgICBhcmUgdG8gYmUgY2FsbGVkLiBDYWxsaW5nIHRoZW0gY2FuIGJlIHRpbWUgY29uc3VtaW5nIG9yIHByb2R1Y2Ugc2lkZSBlZmZlY3RzIHRoYXQKKyAgICAgICAgYXJlIHVud2FudGVkIHdoZW4gdGVzdGluZyAoZS5nLiBkYXRhYmFzZSBvcGVyYXRpb25zKS4gPC9kZD4KKworICAgICAgICA8ZHQ+Q2FsbGVyPC9kdD4KKyAgICAgICAgPGRkPkEgR3Jvb3Z5IE9iamVjdCB0aGF0IGNhbGxzIG1ldGhvZHMgb24gdGhlIENvbGxhYm9yYXRvciwgaS5lLgorICAgICAgICBjb2xsYWJvcmF0ZXMgd2l0aCBpdC48L2RkPgorCisgICAgICAgIDxkdD5Nb2NrPC9kdD4KKyAgICAgICAgPGRkPkFuIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIGF1Z21lbnQgdGhlIENvbGxhYm9yYXRvci4KKyAgICAgICAgTWV0aG9kIGNhbGxzIHRvIHRoZSBDb2xsYWJvcmF0b3Igd2lsbCBiZSBoYW5kbGVkIGJ5IHRoZSBNb2NrLCBzaG93aW5nIGEgPGVtPmRlbWFuZGVkPC9lbT4KKyAgICAgICAgPGVtPmJlaGF2aW9yPC9lbT4uIE1ldGhvZCBjYWxscyBhcmUgPGVtPmV4cGVjdGVkPC9lbT4gdG8gb2NjdXIgPGVtPnN0cmljdGx5PC9lbT4gaW4gdGhlIDxlbT5kZW1hbmRlZDwvZW0+CisgICAgICAgIHNlcXVlbmNlIHdpdGggYSBnaXZlbiA8ZW0+cmFuZ2U8L2VtPiBvZiBjYXJkaW5hbGl0eS4gVGhlIDxlbT51c2U8L2VtPiBvZiBhIE1vY2sgaW1wbGljaXRlbHkKKyAgICAgICAgZW5kcyB3aXRoIDxlbT52ZXJpZnlpbmc8L2VtPiB0aGUgPGVtPmV4cGVjdGF0aW9uczwvZW0+LgorICAgICAgICA8L2RkPgorCisgICAgICAgIDxkdD5TdHViPC9kdD4KKyAgICAgICAgPGRkPk11Y2ggbGlrZSBhIE1vY2sgYnV0IHRoZSA8ZW0+ZXhwZWN0YXRpb248L2VtPiBhYm91dCBzZXF1ZW5jZXMgb2YgbWV0aG9kIGNhbGxzIG9uIHRoZSBDb2xsYWJvcmF0b3IgaXMKKyAgICAgICAgPGVtPmxvb3NlPC9lbT4sIGkuZS4gY2FsbHMgbWF5IG9jY3VyIG91dCBvZiB0aGUgZGVtYW5kZWQgb3JkZXIgYXMgbG9uZyBhcyB0aGUgPGVtPnJhbmdlczwvZW0+CisgICAgICAgIG9mIGNhcmRpbmFsaXR5IGFyZSBtZXQuIFRoZSA8ZW0+dXNlPC9lbT4gb2YgYSBTdHViIGRvZXMgPGVtPm5vdDwvZW0+IGVuZCB3aXRoIGFuIGltcGxpY3QKKyAgICAgICAgPGVtPnZlcmlmaWNhdGlvbjwvZW0+IHNpbmNlIHRoZSBzdHViYmluZyBlZmZlY3QgaXMgdHlwaWNhbGx5IGFzc2VydGVkIG9uIHRoZSBDYWxsZXIuCisgICAgICAgIEFuIGV4cGxpY2l0IGNhbGwgdG8gPGVtPnZlcmlmeTwvZW0+IGNhbiBiZSBpc3N1ZWQgdG8gYXNzZXJ0IGFsbCBkZW1hbmRlZCBtZXRob2QgY2FsbAorICAgICAgICBoYXZlIGJlZW4gZWZmZWN0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGNhcmRpbmFsaXR5LjwvZGQ+CisgICAgPC9kbD4KKworICAgIDxwPkZlYXR1cmVzOjwvcD4KKyAgICA8dWw+CisgICAgICAgIDxsaT50eXBpY2FsIG1vY2sgc3R5bGUgb2YgPGVtPmZhaWxpbmcgZWFybHk8L2VtPjwvbGk+CisgICAgICAgIDxsaT5tb2NrcyBpbnN0YW5jZSBhbmQgY2xhc3MgbWV0aG9kczwvbGk+CisgICAgICAgIDxsaT5tb2NrcyBmaW5hbCBtZXRob2RzIGFuZCBmaW5hbCBDb2xsYWJvcmF0b3JzPC9saT4KKyAgICAgICAgPGxpPm1vY2tzIEdyb292eSBhbmQgSmF2YSBDb2xsYWJvcmF0b3JzIChidXQgQ2FsbGVyIG11c3QgYmUgZ3Jvb3Z5KTwvbGk+CisgICAgICAgIDxsaT5jYW4gbW9jayBhbGwgb2JqZWN0cyBvZiBhIGdpdmVuIGNsYXNzIChvciBhIHNpbmdsZSBHcm9vdnkgb2JqZWN0KTwvbGk+CisgICAgICAgIDxsaT5tb2NrcyBldmVuIGlmIENvbGxhYm9yYXRvciBjYW5ub3QgYmUgaW5qZWN0ZWQgaW50byB0aGUgQ2FsbGVyPC9saT4KKyAgICAgICAgPGxpPm1vY2tzIGV2ZW4gaWYgQ29sbGFib3JhdG9yIGlzIG5vdCBhY2Nlc2libGUgb24gdGhlIENhbGxlciAobm8gZ2V0dGVyKTwvbGk+CisgICAgICAgIDxsaT5kZW1hbmRlZCBjYWxscyBzcGVjaWZpZWQgdmlhIHJlY29yZGluZyBjYWxscyBvbiB0aGUgRGVtYW5kIG9iamVjdCAoRWFzeU1vY2sgc3R5bGUpLjwvbGk+CisgICAgICAgIDxsaT5jYXJkaW5hbGl0eSBzcGVjaWZpZWQgYXMgUmFuZ2VzLCBkZWZhdWx0IGlzIDEuLjE7ICdvcHRpb25hbCcgY2FuIGJlIGFjaGlldmVkIHdpdGggMC4uMTwvbGk+CisgICAgICAgIDxsaT5iZWhhdmlvciBzcGVjaWZpZWQgdmlhIENsb3N1cmVzLCBhbGxvd2luZyBzdGF0aWMgb3IgY2FsY3VsYXRlZCByZXR1cm4gdmFsdWVzLCB0aHJvd2luZyBleGNlcHRpb25zLAorICAgICAgICAgICAgYXNzZXJ0aW5nIGFyZ3VtZW50IHZhbHVlcywgZXRjLiAoZXZlbiB0cmlja3kgc2VxdWVuY2UgY29uc3RyYWludHMKKyAgICAgICAgICAgIGJ5IHNoYXJpbmcgc3RhdGUgaW4gdGhlIHRlc3RNZXRob2Qgc2NvcGUgYmV0d2VlbiB0aGUgYmVoYXZpb3IgQ2xvc3VyZXMpPC9saT4KKyAgICAgICAgPGxpPm1hdGNoaW5nIHBhcmFtZXRlciBsaXN0IHNwZWNpZmllZCB2aWEgQ2xvc3VyZSdzIHBhcmFtZXRlciBsaXN0LCBzdXBwb3J0aW5nCisgICAgICAgICAgICB0eXBlZCBvciB1bnR5cGVkIHBhcmFtcywgZGVmYXVsdCBwYXJhbXMsIGFuZCB2YXJhcmdzLjwvbGk+CisgICAgICAgIDxsaT5ub3QgZGVwZW5kZW50IG9uIGFueSBleHRlcm5hbCBtb2NrIGxpYnJhcnk8L2xpPgorICAgIDwvdWw+CisgICA8cD5Gb3IgYW4gZXh0ZW5zaXZlIGxpc3Qgb2YgdXNhZ2VzIHNlZSB0aGUgdW5pdCB0ZXN0cyBpbiB0aGlzIHBhY2thZ2UuPC9wPgorICA8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9tb2NrL3BhY2thZ2UuaHRtbCBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbW9jay9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIyNzk5YQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbW9jay9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSw4IEBACis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPHRpdGxlPnBhY2thZ2UgZ3Jvb3Z5Lm1vY2suKjwvdGl0bGU+CisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgPHA+R3Jvb3Z5TW9jayBpcyBhIG1vY2sgdGVzdGluZyBsaWJyYXJ5IGZvciBHcm9vdnkgb2JqZWN0cy48L3A+CisgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbW9kZWwvQ2xvc3VyZU1vZGVsLmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L21vZGVsL0Nsb3N1cmVNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNWE2NDIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L21vZGVsL0Nsb3N1cmVNb2RlbC5qYXZhCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGdyb292eS5tb2RlbDsKKworaW1wb3J0IGdyb292eS5sYW5nLkNsb3N1cmU7CisKKy8qKgorICogUmVwcmVzZW50cyBhIHZhbHVlIG1vZGVsIHVzaW5nIGEgY2xvc3VyZSB0byBleHRyYWN0CisgKiB0aGUgdmFsdWUgZnJvbSBzb21lIHNvdXJjZSBtb2RlbCBhbmQgYW4gb3B0aW9uYWwgd3JpdGUgY2xvc3VyZQorICogZm9yIHVwZGF0aW5nIHRoZSB2YWx1ZS4KKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIENsb3N1cmVNb2RlbCBpbXBsZW1lbnRzIFZhbHVlTW9kZWwsIE5lc3RlZFZhbHVlTW9kZWwgeworCisgICAgcHJpdmF0ZSBmaW5hbCBWYWx1ZU1vZGVsIHNvdXJjZU1vZGVsOworICAgIHByaXZhdGUgZmluYWwgQ2xvc3VyZSByZWFkQ2xvc3VyZTsKKyAgICBwcml2YXRlIGZpbmFsIENsb3N1cmUgd3JpdGVDbG9zdXJlOworICAgIHByaXZhdGUgZmluYWwgQ2xhc3MgdHlwZTsKKworICAgIHB1YmxpYyBDbG9zdXJlTW9kZWwoVmFsdWVNb2RlbCBzb3VyY2VNb2RlbCwgQ2xvc3VyZSByZWFkQ2xvc3VyZSkgeworICAgICAgICB0aGlzKHNvdXJjZU1vZGVsLCByZWFkQ2xvc3VyZSwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIENsb3N1cmVNb2RlbChWYWx1ZU1vZGVsIHNvdXJjZU1vZGVsLCBDbG9zdXJlIHJlYWRDbG9zdXJlLCBDbG9zdXJlIHdyaXRlQ2xvc3VyZSkgeworICAgICAgICB0aGlzKHNvdXJjZU1vZGVsLCByZWFkQ2xvc3VyZSwgd3JpdGVDbG9zdXJlLCBPYmplY3QuY2xhc3MpOworICAgIH0KKworICAgIHB1YmxpYyBDbG9zdXJlTW9kZWwoVmFsdWVNb2RlbCBzb3VyY2VNb2RlbCwgQ2xvc3VyZSByZWFkQ2xvc3VyZSwgQ2xvc3VyZSB3cml0ZUNsb3N1cmUsIENsYXNzIHR5cGUpIHsKKyAgICAgICAgdGhpcy5zb3VyY2VNb2RlbCA9IHNvdXJjZU1vZGVsOworICAgICAgICB0aGlzLnJlYWRDbG9zdXJlID0gcmVhZENsb3N1cmU7CisgICAgICAgIHRoaXMud3JpdGVDbG9zdXJlID0gd3JpdGVDbG9zdXJlOworICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgIH0KKworICAgIHB1YmxpYyBWYWx1ZU1vZGVsIGdldFNvdXJjZU1vZGVsKCkgeworICAgICAgICByZXR1cm4gc291cmNlTW9kZWw7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKKyAgICAgICAgT2JqZWN0IHNvdXJjZSA9IHNvdXJjZU1vZGVsLmdldFZhbHVlKCk7CisgICAgICAgIGlmIChzb3VyY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHJlYWRDbG9zdXJlLmNhbGwoc291cmNlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgaWYgKHdyaXRlQ2xvc3VyZSAhPSBudWxsKSB7CisgICAgICAgICAgICBPYmplY3Qgc291cmNlID0gc291cmNlTW9kZWwuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgIGlmIChzb3VyY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHdyaXRlQ2xvc3VyZS5jYWxsKG5ldyBPYmplY3RbXSB7IHNvdXJjZSwgdmFsdWUgfSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3MgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIHdyaXRlQ2xvc3VyZSAhPSBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbW9kZWwvRGVmYXVsdFRhYmxlQ29sdW1uLmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L21vZGVsL0RlZmF1bHRUYWJsZUNvbHVtbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkMTNjZDQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L21vZGVsL0RlZmF1bHRUYWJsZUNvbHVtbi5qYXZhCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBncm9vdnkubW9kZWw7CisKK2ltcG9ydCBqYXZheC5zd2luZy50YWJsZS5UYWJsZUNvbHVtbjsKKworLyoqIAorICogUmVwcmVzZW50cyBhIGNvbHVtbiB1c2luZyBhIFZhbHVlTW9kZWwgdG8gZXh0cmFjdCB0aGUgdmFsdWUuCisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQGFwYWNoZS5vcmciPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgRGVmYXVsdFRhYmxlQ29sdW1uIGV4dGVuZHMgVGFibGVDb2x1bW4geworCisgICAgcHJpdmF0ZSBWYWx1ZU1vZGVsIHZhbHVlTW9kZWw7ICAgIAorICAgIAorICAgIHB1YmxpYyBEZWZhdWx0VGFibGVDb2x1bW4oVmFsdWVNb2RlbCB2YWx1ZU1vZGVsKSB7CisgICAgICAgIHRoaXMudmFsdWVNb2RlbCA9IHZhbHVlTW9kZWw7CisgICAgfQorCisgICAgcHVibGljIERlZmF1bHRUYWJsZUNvbHVtbihPYmplY3QgaGVhZGVyLCBWYWx1ZU1vZGVsIHZhbHVlTW9kZWwpIHsKKyAgICAgICAgdGhpcyh2YWx1ZU1vZGVsKTsKKyAgICAgICAgc2V0SGVhZGVyVmFsdWUoaGVhZGVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gc3VwZXIudG9TdHJpbmcoKSArICJbaGVhZGVyOiIgKyBnZXRIZWFkZXJWYWx1ZSgpICsgIiB2YWx1ZU1vZGVsOiIgKyB2YWx1ZU1vZGVsICsgIl0iOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBFdmFsdWF0ZXMgdGhlIHZhbHVlIG9mIGEgY2VsbAorICAgICAqCisgICAgICogQHJldHVybiB0aGUgdmFsdWUKKyAgICAgKiBAcGFyYW0gcm93IHRoZSByb3cgb2YgaW50ZXJlc3QKKyAgICAgKiBAcGFyYW0gcm93SW5kZXggdGhlIGluZGV4IG9mIHRoZSByb3cgb2YgaW50ZXJlc3QKKyAgICAgKiBAcGFyYW0gY29sdW1uSW5kZXggdGhlIGNvbHVtbiBvZiBpbnRlcmVzdAorICAgICAqLyAgICAKKyAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKE9iamVjdCByb3csIGludCByb3dJbmRleCwgaW50IGNvbHVtbkluZGV4KSB7CisgICAgICAgIGlmICh2YWx1ZU1vZGVsIGluc3RhbmNlb2YgTmVzdGVkVmFsdWVNb2RlbCkgeworICAgICAgICAgICAgTmVzdGVkVmFsdWVNb2RlbCBuZXN0ZWRNb2RlbCA9IChOZXN0ZWRWYWx1ZU1vZGVsKSB2YWx1ZU1vZGVsOworICAgICAgICAgICAgbmVzdGVkTW9kZWwuZ2V0U291cmNlTW9kZWwoKS5zZXRWYWx1ZShyb3cpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2YWx1ZU1vZGVsLmdldFZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHJvdywgT2JqZWN0IHZhbHVlLCBpbnQgcm93SW5kZXgsIGludCBjb2x1bW5JbmRleCkgeworICAgICAgICBpZiAodmFsdWVNb2RlbCBpbnN0YW5jZW9mIE5lc3RlZFZhbHVlTW9kZWwpIHsKKyAgICAgICAgICAgIE5lc3RlZFZhbHVlTW9kZWwgbmVzdGVkTW9kZWwgPSAoTmVzdGVkVmFsdWVNb2RlbCkgdmFsdWVNb2RlbDsKKyAgICAgICAgICAgIG5lc3RlZE1vZGVsLmdldFNvdXJjZU1vZGVsKCkuc2V0VmFsdWUocm93KTsKKyAgICAgICAgfQorICAgICAgICB2YWx1ZU1vZGVsLnNldFZhbHVlKHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBjb2x1bW4gdHlwZQorICAgICAqLworICAgIHB1YmxpYyBDbGFzcyBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gdmFsdWVNb2RlbC5nZXRUeXBlKCk7CisgICAgfQorCisgICAgcHVibGljIFZhbHVlTW9kZWwgZ2V0VmFsdWVNb2RlbCgpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlTW9kZWw7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L21vZGVsL0RlZmF1bHRUYWJsZU1vZGVsLmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L21vZGVsL0RlZmF1bHRUYWJsZU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UwYzkxMwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbW9kZWwvRGVmYXVsdFRhYmxlTW9kZWwuamF2YQpAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGdyb292eS5tb2RlbDsKKworaW1wb3J0IGdyb292eS5sYW5nLkNsb3N1cmU7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLkludm9rZXJIZWxwZXI7CisKK2ltcG9ydCBqYXZheC5zd2luZy50YWJsZS5BYnN0cmFjdFRhYmxlTW9kZWw7CitpbXBvcnQgamF2YXguc3dpbmcudGFibGUuRGVmYXVsdFRhYmxlQ29sdW1uTW9kZWw7CitpbXBvcnQgamF2YXguc3dpbmcudGFibGUuVGFibGVDb2x1bW5Nb2RlbDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQSBkZWZhdWx0IHRhYmxlIG1vZGVsIG1hZGUgdXAgb2YgUHJvcGVydHlNb2RlbHMgb24gYSBWYWx1ZSBtb2RlbC4KKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIERlZmF1bHRUYWJsZU1vZGVsIGV4dGVuZHMgQWJzdHJhY3RUYWJsZU1vZGVsIHsKKworICAgIHByaXZhdGUgVmFsdWVNb2RlbCByb3dNb2RlbDsKKyAgICBwcml2YXRlIFZhbHVlTW9kZWwgcm93c01vZGVsOworICAgIHByaXZhdGUgTXlUYWJsZUNvbHVtbk1vZGVsIGNvbHVtbk1vZGVsID0gbmV3IE15VGFibGVDb2x1bW5Nb2RlbCgpOworCisgICAgcHVibGljIERlZmF1bHRUYWJsZU1vZGVsKFZhbHVlTW9kZWwgcm93c01vZGVsKSB7CisgICAgICAgIHRoaXMocm93c01vZGVsLCBuZXcgVmFsdWVIb2xkZXIoKSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBEZWZhdWx0VGFibGVNb2RlbChWYWx1ZU1vZGVsIHJvd3NNb2RlbCwgVmFsdWVNb2RlbCByb3dNb2RlbCkgeworICAgICAgICB0aGlzLnJvd01vZGVsID0gcm93TW9kZWw7CisgICAgICAgIHRoaXMucm93c01vZGVsID0gcm93c01vZGVsOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBjb2x1bW4gZGVmaW5pdGlvbnMuCisgICAgICovCisgICAgcHVibGljIExpc3QgZ2V0Q29sdW1uTGlzdCgpIHsKKyAgICAgICAgcmV0dXJuIGNvbHVtbk1vZGVsLmdldENvbHVtbkxpc3QoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVGFibGVDb2x1bW5Nb2RlbCBnZXRDb2x1bW5Nb2RlbCgpIHsKKyAgICAgICAgcmV0dXJuIGNvbHVtbk1vZGVsOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgcHJvcGVydHkgbW9kZWwgY29sdW1uIHRvIHRoZSB0YWJsZQorICAgICAqLworICAgIHB1YmxpYyBEZWZhdWx0VGFibGVDb2x1bW4gYWRkUHJvcGVydHlDb2x1bW4oT2JqZWN0IGhlYWRlclZhbHVlLCBTdHJpbmcgcHJvcGVydHksIENsYXNzIHR5cGUpIHsKKyAgICAgICAgcmV0dXJuIGFkZENvbHVtbihoZWFkZXJWYWx1ZSwgbmV3IFByb3BlcnR5TW9kZWwocm93TW9kZWwsIHByb3BlcnR5LCB0eXBlKSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEFkZHMgYSBwcm9wZXJ0eSBtb2RlbCBjb2x1bW4gdG8gdGhlIHRhYmxlCisgICAgICovCisgICAgcHVibGljIERlZmF1bHRUYWJsZUNvbHVtbiBhZGRQcm9wZXJ0eUNvbHVtbihPYmplY3QgaGVhZGVyVmFsdWUsIFN0cmluZyBwcm9wZXJ0eSwgQ2xhc3MgdHlwZSwgYm9vbGVhbiBlZGl0YWJsZSkgeworICAgICAgICByZXR1cm4gYWRkQ29sdW1uKGhlYWRlclZhbHVlLCBuZXcgUHJvcGVydHlNb2RlbChyb3dNb2RlbCwgcHJvcGVydHksIHR5cGUsIGVkaXRhYmxlKSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEFkZHMgYSBjbG9zdXJlIGJhc2VkIGNvbHVtbiB0byB0aGUgdGFibGUKKyAgICAgKi8KKyAgICBwdWJsaWMgRGVmYXVsdFRhYmxlQ29sdW1uIGFkZENsb3N1cmVDb2x1bW4oT2JqZWN0IGhlYWRlclZhbHVlLCBDbG9zdXJlIHJlYWRDbG9zdXJlLCBDbG9zdXJlIHdyaXRlQ2xvc3VyZSwgQ2xhc3MgdHlwZSkgeworICAgICAgICByZXR1cm4gYWRkQ29sdW1uKGhlYWRlclZhbHVlLCBuZXcgQ2xvc3VyZU1vZGVsKHJvd01vZGVsLCByZWFkQ2xvc3VyZSwgd3JpdGVDbG9zdXJlLCB0eXBlKSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBEZWZhdWx0VGFibGVDb2x1bW4gYWRkQ29sdW1uKE9iamVjdCBoZWFkZXJWYWx1ZSwgVmFsdWVNb2RlbCBjb2x1bW5WYWx1ZU1vZGVsKSB7CisgICAgICAgIERlZmF1bHRUYWJsZUNvbHVtbiBhbnN3ZXIgPSBuZXcgRGVmYXVsdFRhYmxlQ29sdW1uKGhlYWRlclZhbHVlLCBjb2x1bW5WYWx1ZU1vZGVsKTsKKyAgICAgICAgYWRkQ29sdW1uKGFuc3dlcik7CisgICAgICAgIHJldHVybiBhbnN3ZXI7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEFkZHMgYSBuZXcgY29sdW1uIGRlZmluaXRpb24gdG8gdGhlIHRhYmxlCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ29sdW1uKERlZmF1bHRUYWJsZUNvbHVtbiBjb2x1bW4pIHsKKyAgICAgICAgY29sdW1uLnNldE1vZGVsSW5kZXgoY29sdW1uTW9kZWwuZ2V0Q29sdW1uQ291bnQoKSk7CisgICAgICAgIGNvbHVtbk1vZGVsLmFkZENvbHVtbihjb2x1bW4pOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGEgY29sdW1uIGRlZmluaXRpb24gZnJvbSB0aGUgdGFibGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVDb2x1bW4oRGVmYXVsdFRhYmxlQ29sdW1uIGNvbHVtbikgeworICAgICAgICBjb2x1bW5Nb2RlbC5yZW1vdmVDb2x1bW4oY29sdW1uKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGludCBnZXRSb3dDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIGdldFJvd3MoKS5zaXplKCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRDb2x1bW5Db3VudCgpIHsKKyAgICAgICAgcmV0dXJuIGNvbHVtbk1vZGVsLmdldENvbHVtbkNvdW50KCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uTmFtZShpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgU3RyaW5nIGFuc3dlciA9IG51bGw7CisgICAgICAgIGlmIChjb2x1bW5JbmRleCA8IDAgfHwgY29sdW1uSW5kZXggPj0gY29sdW1uTW9kZWwuZ2V0Q29sdW1uQ291bnQoKSkgeworICAgICAgICAgICAgcmV0dXJuIGFuc3dlcjsKKyAgICAgICAgfQorICAgICAgICBPYmplY3QgdmFsdWUgPSBjb2x1bW5Nb2RlbC5nZXRDb2x1bW4oY29sdW1uSW5kZXgpLmdldEhlYWRlclZhbHVlKCk7CisgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYW5zd2VyOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzcyBnZXRDb2x1bW5DbGFzcyhpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIGdldENvbHVtbk1vZGVsKGNvbHVtbkluZGV4KS5nZXRUeXBlKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNDZWxsRWRpdGFibGUoaW50IHJvd0luZGV4LCBpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIGdldENvbHVtbk1vZGVsKGNvbHVtbkluZGV4KS5pc0VkaXRhYmxlKCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZUF0KGludCByb3dJbmRleCwgaW50IGNvbHVtbkluZGV4KSB7CisgICAgICAgIExpc3Qgcm93cyA9IGdldFJvd3MoKTsKKyAgICAgICAgT2JqZWN0IGFuc3dlciA9IG51bGw7CisgICAgICAgIGlmIChyb3dJbmRleCA8IDAgfHwgcm93SW5kZXggPj0gcm93cy5zaXplKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBhbnN3ZXI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbHVtbkluZGV4IDwgMCB8fCBjb2x1bW5JbmRleCA+PSBjb2x1bW5Nb2RlbC5nZXRDb2x1bW5Db3VudCgpKSB7CisgICAgICAgICAgICByZXR1cm4gYW5zd2VyOworICAgICAgICB9CisgICAgICAgIE9iamVjdCByb3cgPSBnZXRSb3dzKCkuZ2V0KHJvd0luZGV4KTsKKyAgICAgICAgcm93TW9kZWwuc2V0VmFsdWUocm93KTsKKyAgICAgICAgRGVmYXVsdFRhYmxlQ29sdW1uIGNvbHVtbiA9IChEZWZhdWx0VGFibGVDb2x1bW4pIGNvbHVtbk1vZGVsLmdldENvbHVtbihjb2x1bW5JbmRleCk7CisgICAgICAgIGlmIChyb3cgPT0gbnVsbCB8fCBjb2x1bW4gPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGFuc3dlcjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29sdW1uLmdldFZhbHVlKHJvdywgcm93SW5kZXgsIGNvbHVtbkluZGV4KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZUF0KE9iamVjdCB2YWx1ZSwgaW50IHJvd0luZGV4LCBpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgTGlzdCByb3dzID0gZ2V0Um93cygpOworICAgICAgICBpZiAocm93SW5kZXggPCAwIHx8IHJvd0luZGV4ID49IHJvd3Muc2l6ZSgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbHVtbkluZGV4IDwgMCB8fCBjb2x1bW5JbmRleCA+PSBjb2x1bW5Nb2RlbC5nZXRDb2x1bW5Db3VudCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgT2JqZWN0IHJvdyA9IGdldFJvd3MoKS5nZXQocm93SW5kZXgpOworICAgICAgICByb3dNb2RlbC5zZXRWYWx1ZShyb3cpOworICAgICAgICBEZWZhdWx0VGFibGVDb2x1bW4gY29sdW1uID0gKERlZmF1bHRUYWJsZUNvbHVtbikgY29sdW1uTW9kZWwuZ2V0Q29sdW1uKGNvbHVtbkluZGV4KTsKKyAgICAgICAgaWYgKHJvdyA9PSBudWxsIHx8IGNvbHVtbiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgY29sdW1uLnNldFZhbHVlKHJvdywgdmFsdWUsIHJvd0luZGV4LCBjb2x1bW5JbmRleCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFZhbHVlTW9kZWwgZ2V0Q29sdW1uTW9kZWwoaW50IGNvbHVtbkluZGV4KSB7CisgICAgICAgIERlZmF1bHRUYWJsZUNvbHVtbiBjb2x1bW4gPSAoRGVmYXVsdFRhYmxlQ29sdW1uKSBjb2x1bW5Nb2RlbC5nZXRDb2x1bW4oY29sdW1uSW5kZXgpOworICAgICAgICByZXR1cm4gY29sdW1uLmdldFZhbHVlTW9kZWwoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgTGlzdCBnZXRSb3dzKCkgeworICAgICAgICBPYmplY3QgdmFsdWUgPSByb3dzTW9kZWwuZ2V0VmFsdWUoKTsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOworICAgICAgICB9CisgICAgICAgIHJldHVybiBJbnZva2VySGVscGVyLmFzTGlzdCh2YWx1ZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBNeVRhYmxlQ29sdW1uTW9kZWwgZXh0ZW5kcyBEZWZhdWx0VGFibGVDb2x1bW5Nb2RlbCB7CisgICAgICAgIHB1YmxpYyBMaXN0IGdldENvbHVtbkxpc3QoKSB7CisgICAgICAgICAgICByZXR1cm4gdGFibGVDb2x1bW5zOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBWYWx1ZU1vZGVsIGdldFJvd01vZGVsKCkgeworICAgICAgICByZXR1cm4gcm93TW9kZWw7CisgICAgfQorCisgICAgcHVibGljIFZhbHVlTW9kZWwgZ2V0Um93c01vZGVsKCkgeworICAgICAgICByZXR1cm4gcm93c01vZGVsOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9tb2RlbC9Gb3JtTW9kZWwuamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbW9kZWwvRm9ybU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVjODhlYwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbW9kZWwvRm9ybU1vZGVsLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGdyb292eS5tb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogUmVwcmVzZW50cyBhIG51bWJlciBvZiBmaWVsZCBtb2RlbHMgd2hpY2ggY2FuIGJlIFZhbHVlTW9kZWwsIAorICogUHJvcGVydHlNb2RlbCwgVGFibGVNb2RlbCwgVHJlZU1vZGVsIG9yIG5lc3RlZCBGb3JtTW9kZWwgaW5zdGFuY2VzCisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBGb3JtTW9kZWwgeworICAgIHByaXZhdGUgTWFwIGZpZWxkTW9kZWxzOworCisgICAgcHVibGljIEZvcm1Nb2RlbCgpIHsKKyAgICAgICAgdGhpcyhuZXcgSGFzaE1hcCgpKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIEZvcm1Nb2RlbChNYXAgZmllbGRNb2RlbHMpIHsKKyAgICAgICAgdGhpcy5maWVsZE1vZGVscyA9IGZpZWxkTW9kZWxzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZE1vZGVsKFN0cmluZyBuYW1lLCBPYmplY3QgbW9kZWwpIHsKKyAgICAgICAgZmllbGRNb2RlbHMucHV0KG5hbWUsIG1vZGVsKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIE9iamVjdCBnZXRNb2RlbChTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gZmllbGRNb2RlbHMuZ2V0KG5hbWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbW9kZWwvTmVzdGVkVmFsdWVNb2RlbC5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9tb2RlbC9OZXN0ZWRWYWx1ZU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE2ZWMwNQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbW9kZWwvTmVzdGVkVmFsdWVNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBncm9vdnkubW9kZWw7CisKKy8qKgorICogUmVwcmVzZW50cyBhIG5lc3RlZCB2YWx1ZSBtb2RlbCBzdWNoIGFzIGEgUHJvcGVydHlNb2RlbAorICogb3IgYSBDbG9zdXJlTW9kZWwKKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGludGVyZmFjZSBOZXN0ZWRWYWx1ZU1vZGVsIHsKKyAgICBWYWx1ZU1vZGVsIGdldFNvdXJjZU1vZGVsKCk7Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L21vZGVsL1Byb3BlcnR5TW9kZWwuamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbW9kZWwvUHJvcGVydHlNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxNmUwMTAKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L21vZGVsL1Byb3BlcnR5TW9kZWwuamF2YQpAQCAtMCwwICsxLDgwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgZ3Jvb3Z5Lm1vZGVsOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLkludm9rZXJIZWxwZXI7CisKKy8qKgorICogUmVwcmVzZW50cyBhIHByb3BlcnR5IG9mIGEgdmFsdWUgYXMgYSBtb2RlbC4KKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIFByb3BlcnR5TW9kZWwgaW1wbGVtZW50cyBWYWx1ZU1vZGVsLCBOZXN0ZWRWYWx1ZU1vZGVsIHsKKworICAgIHByaXZhdGUgVmFsdWVNb2RlbCBzb3VyY2VNb2RlbDsKKyAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTsKKyAgICBwcml2YXRlIENsYXNzIHR5cGU7CisgICAgYm9vbGVhbiBlZGl0YWJsZTsKKworICAgIHB1YmxpYyBQcm9wZXJ0eU1vZGVsKFZhbHVlTW9kZWwgc291cmNlTW9kZWwsIFN0cmluZyBwcm9wZXJ0eSkgeworICAgICAgICB0aGlzKHNvdXJjZU1vZGVsLCBwcm9wZXJ0eSwgT2JqZWN0LmNsYXNzLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvcGVydHlNb2RlbChWYWx1ZU1vZGVsIHNvdXJjZU1vZGVsLCBTdHJpbmcgcHJvcGVydHksIENsYXNzIHR5cGUpIHsKKyAgICAgICAgdGhpcyhzb3VyY2VNb2RlbCwgcHJvcGVydHksIHR5cGUsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyBQcm9wZXJ0eU1vZGVsKFZhbHVlTW9kZWwgc291cmNlTW9kZWwsIFN0cmluZyBwcm9wZXJ0eSwgQ2xhc3MgdHlwZSwgYm9vbGVhbiBlZGl0YWJsZSkgeworICAgICAgICB0aGlzLnNvdXJjZU1vZGVsID0gc291cmNlTW9kZWw7CisgICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgLy9UT0RPIEFmdGVyIDEuMSB3ZSBzaG91bGQgaW50cm9zcGVjdCB0aGUgbWV0YSBwcm9wZXJ0eSBhbmQgc2V0IGVkaXRhYmxlIHRvIGZhbHNlIGlmIHRoZSBwcm9wZXJ0eSBpcyByZWFkIG9ubHkKKyAgICAgICAgdGhpcy5lZGl0YWJsZSA9IGVkaXRhYmxlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoKSB7CisgICAgICAgIHJldHVybiBwcm9wZXJ0eTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmFsdWVNb2RlbCBnZXRTb3VyY2VNb2RlbCgpIHsKKyAgICAgICAgcmV0dXJuIHNvdXJjZU1vZGVsOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7CisgICAgICAgIE9iamVjdCBzb3VyY2UgPSBzb3VyY2VNb2RlbC5nZXRWYWx1ZSgpOworICAgICAgICBpZiAoc291cmNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBJbnZva2VySGVscGVyLmdldFByb3BlcnR5KHNvdXJjZSwgcHJvcGVydHkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKE9iamVjdCB2YWx1ZSkgeworICAgICAgICBPYmplY3Qgc291cmNlID0gc291cmNlTW9kZWwuZ2V0VmFsdWUoKTsKKyAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxsKSB7CisgICAgICAgICAgICBJbnZva2VySGVscGVyLnNldFByb3BlcnR5KHNvdXJjZSwgcHJvcGVydHksIHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgQ2xhc3MgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIGVkaXRhYmxlOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9tb2RlbC9WYWx1ZUhvbGRlci5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9tb2RlbC9WYWx1ZUhvbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NGRiMGMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L21vZGVsL1ZhbHVlSG9sZGVyLmphdmEKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGdyb292eS5tb2RlbDsKKworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlU3VwcG9ydDsKKworLyoqCisgKiBBIHNpbXBsZSBWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uIHdoaWNoIGlzIGEgaG9sZGVyIG9mIGFuIG9iamVjdCB2YWx1ZS4gCisgKiBVc2VkIHRvIHNoYXJlIGxvY2FsIHZhcmlhYmxlcyB3aXRoIGNsb3N1cmVzCisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBWYWx1ZUhvbGRlciBpbXBsZW1lbnRzIFZhbHVlTW9kZWwgeworICAgIHByaXZhdGUgT2JqZWN0IHZhbHVlOworICAgIHByaXZhdGUgZmluYWwgQ2xhc3MgdHlwZTsKKyAgICBwcml2YXRlIFByb3BlcnR5Q2hhbmdlU3VwcG9ydCBwcm9wZXJ0eUNoYW5nZVN1cHBvcnQ7CisgICAgcHJpdmF0ZSBib29sZWFuIGVkaXRhYmxlID0gdHJ1ZTsKKworICAgIHB1YmxpYyBWYWx1ZUhvbGRlcigpIHsKKyAgICAgICAgdGhpcyhPYmplY3QuY2xhc3MpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgVmFsdWVIb2xkZXIoQ2xhc3MgdHlwZSkgeworICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgVmFsdWVIb2xkZXIoT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgdGhpcy50eXBlID0gKHZhbHVlICE9IG51bGwpID8gdmFsdWUuZ2V0Q2xhc3MoKSA6IE9iamVjdC5jbGFzczsKKyAgICB9CisgICAgCisgICAgLyoqIAorICAgICAqIEFkZCBhIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgdG8gdGhlIGxpc3RlbmVyIGxpc3QuCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byBhZGQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIGlmICggcHJvcGVydHlDaGFuZ2VTdXBwb3J0ID09IG51bGwgKSB7CisgICAgICAgICAgICBwcm9wZXJ0eUNoYW5nZVN1cHBvcnQgPSBuZXcgUHJvcGVydHlDaGFuZ2VTdXBwb3J0KHRoaXMpOworICAgICAgICB9CisgICAgICAgIHByb3BlcnR5Q2hhbmdlU3VwcG9ydC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICB9CisgICAgCisgICAgLyoqIAorICAgICAqIFJlbW92ZXMgYSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGZyb20gdGhlIGxpc3RlbmVyIGxpc3QuCisgICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byByZW1vdmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIGlmICggcHJvcGVydHlDaGFuZ2VTdXBwb3J0ICE9IG51bGwgKSB7CisgICAgICAgICAgICBwcm9wZXJ0eUNoYW5nZVN1cHBvcnQucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgIH0KKyAgICB9CisgICAgCisKKyAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIE9iamVjdCBvbGRWYWx1ZSA9IHRoaXMudmFsdWU7CisgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgaWYgKCBwcm9wZXJ0eUNoYW5nZVN1cHBvcnQgIT0gbnVsbCApIHsKKyAgICAgICAgICAgIHByb3BlcnR5Q2hhbmdlU3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoInZhbHVlIiwgb2xkVmFsdWUsIHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBDbGFzcyBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gdHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VkaXRhYmxlKCkgeworICAgICAgICByZXR1cm4gZWRpdGFibGU7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldEVkaXRhYmxlKGJvb2xlYW4gZWRpdGFibGUpIHsKKyAgICAgICAgdGhpcy5lZGl0YWJsZSA9IGVkaXRhYmxlOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9tb2RlbC9WYWx1ZU1vZGVsLmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L21vZGVsL1ZhbHVlTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzdjNGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9tb2RlbC9WYWx1ZU1vZGVsLmphdmEKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGdyb292eS5tb2RlbDsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgbW9kZWwgb2YgYSB2YWx1ZQorICogCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgaW50ZXJmYWNlIFZhbHVlTW9kZWwgeworICAgIE9iamVjdCBnZXRWYWx1ZSgpOworICAgIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKTsKKyAgICBDbGFzcyBnZXRUeXBlKCk7CisgICAgYm9vbGVhbiBpc0VkaXRhYmxlKCk7Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L21vZGVsL3BhY2thZ2UuaHRtbCBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvbW9kZWwvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxOGNkZmIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L21vZGVsL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDkgQEAKKzxodG1sPgorICA8aGVhZD4KKyAgICA8dGl0bGU+cGFja2FnZSBncm9vdnkubW9kZWwuKjwvdGl0bGU+CisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgPHA+QW4gTVZDIG1vZGVsIHBhY2thZ2UgZm9yIHdvcmtpbmcgd2l0aCB1c2VyIGludGVyZmFjZXMgYW5kIGRhdGEgc3RydWN0dXJlcyBhbmQgYXJiaXRyYXJ5IEphdmEgYW5kIEdyb292eSBvYmplY3RzCisgICAgPC9wPgorICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3NlY3VyaXR5L0dyb292eUNvZGVTb3VyY2VQZXJtaXNzaW9uLmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3NlY3VyaXR5L0dyb292eUNvZGVTb3VyY2VQZXJtaXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY1MGNiMwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc2VjdXJpdHkvR3Jvb3Z5Q29kZVNvdXJjZVBlcm1pc3Npb24uamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBncm9vdnkuc2VjdXJpdHk7CisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkJhc2ljUGVybWlzc2lvbjsKKworLyoqCisgKiBQZXJtaXNzaW9uIHJlcXVpcmVkIHRvIGV4cGxpY2l0bHkgc3BlY2lmeSBhIGNvZGViYXNlIGZvciBhIGdyb292eSBzY3JpcHQgd2hvc2UKKyAqIGNvZGViYXNlIGNhbm5vdCBiZSBkZXRlcm1pbmVkLiAgVHlwaWNhbGx5IHRoaXMgcGVybWlzc2lvbiBpcyBvbmx5CisgKiByZXF1aXJlZCBieSBjbGllbnRzIHRoYXQgd2FudCB0byBhc3NvY2lhdGUgYSBjb2RlIHNvdXJjZSB3aXRoIGEgc2NyaXB0IHdoaWNoCisgKiBpcyBhIFN0cmluZyBvciBhbiBJbnB1dFN0cmVhbS4KKyAqCisgKiBAYXV0aG9yIFN0ZXZlIEdvZXR6ZQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgR3Jvb3Z5Q29kZVNvdXJjZVBlcm1pc3Npb24gZXh0ZW5kcyBCYXNpY1Blcm1pc3Npb24geworCisJcHVibGljIEdyb292eUNvZGVTb3VyY2VQZXJtaXNzaW9uKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCXB1YmxpYyBHcm9vdnlDb2RlU291cmNlUGVybWlzc2lvbihTdHJpbmcgbmFtZSwgU3RyaW5nIGFjdGlvbnMpIHsKKwkJc3VwZXIobmFtZSwgYWN0aW9ucyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zZWN1cml0eS9wYWNrYWdlLmh0bWwgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3NlY3VyaXR5L3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmQwYTEyCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zZWN1cml0eS9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSwxMCBAQAorPGh0bWw+CisgIDxoZWFkPgorICAgIDx0aXRsZT5wYWNrYWdlIGdyb292eS5zZWN1cml0eS4qPC90aXRsZT4KKyAgPC9oZWFkPgorICA8Ym9keT4KKyAgICA8cD4KKyAgICAgIFNlY3VyaXR5LXJlbGF0ZWQgY2xhc3NlcworICAgIDwvcD4KKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zZXJ2bGV0L0Fic3RyYWN0SHR0cFNlcnZsZXQuamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc2VydmxldC9BYnN0cmFjdEh0dHBTZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI1ZmI5OQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc2VydmxldC9BYnN0cmFjdEh0dHBTZXJ2bGV0LmphdmEKQEAgLTAsMCArMSwzNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBncm9vdnkuc2VydmxldDsKKworaW1wb3J0IGdyb292eS51dGlsLlJlc291cmNlQ29ubmVjdG9yOworaW1wb3J0IGdyb292eS51dGlsLlJlc291cmNlRXhjZXB0aW9uOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb25maWc7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CisKKy8qKgorICogQSBjb21tb24gZ3JvdW5kIGRlYWxpbmcgd2l0aCB0aGUgSFRUUCBzZXJ2bGV0IEFQSSB3cmlua2xlcy4KKyAqIAorICogPGg0PlJlc291cmNlIG5hbWUgbWFuZ2xpbmcgKHBhdHRlcm4gcmVwbGFjZW1lbnQpPC9oND4KKyAqIAorICogPHA+IAorICogQWxzbyBpbXBsZW1lbnRzIEdyb292eSdzIHtAbGluayBncm9vdnkudXRpbC5SZXNvdXJjZUNvbm5lY3Rvcn0gaW4gZHluYW1pYworICogbWFubmVyLiBJdCBhbGxvd3MgdG8gbW9kaWZpeSB0aGUgcmVzb3VyY2UgbmFtZSB0aGF0IGlzIHNlYXJjaGVkIGZvciB3aXRoIGEKKyAqIDxpPnJlcGxhY2UgYWxsPC9pPiBvcGVyYXRpb24uIFNlZSB7QGxpbmsgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm59IGFuZAorICoge0BsaW5rIGphdmEudXRpbC5yZWdleC5NYXRjaGVyfSBmb3IgZGV0YWlscy4KKyAqIFRoZSBzZXJ2bGV0IGluaXQgcGFyYW1ldGVyIG5hbWVzIGFyZToKKyAqIDxwcmU+CisgKiByZXNvdXJjZS5uYW1lLnJlZ2V4ID0gZW1wdHkgLSBkZWZhdWx0cyB0byBudWxsCisgKiByZXNvdXJjZS5uYW1lLnJlcGxhY2VtZW50ID0gZW1wdHkgLSBkZWZhdWx0cyB0byBudWxsCisgKiByZXNvdXJjZS5uYW1lLnJlcGxhY2UuYWxsID0gdHJ1ZSAoZGVmYXVsdCkgfCBmYWxzZSBtZWFucyByZXBsYWNlRmlyc3QoKQorICogPC9wcmU+CisgKiBOb3RlOiBJZiB5b3Ugc3BlY2lmeSBhIHJlZ2V4LCB5b3UgaGF2ZSB0byBzcGVjaWZ5IGEgcmVwbGFjZW1lbnQgc3RyaW5nIHRvbyEKKyAqIE90aGVyd2lzZSBhbiBleGNlcHRpb24gZ2V0cyByYWlzZWQuCisgKgorICogPGg0PkxvZ2dpbmcgYW5kIGJ1Zy1odW50aW5nIG9wdGlvbnM8L2g0PgorICoKKyAqIDxwPiAKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gcHJvdmlkZXMgYSB2ZXJib3NpdHkgZmxhZyBzd2l0Y2hpbmcgbG9nIHN0YXRlbWVudHMuCisgKiBUaGUgc2VydmxldCBpbml0IHBhcmFtZXRlciBuYW1lIGlzOgorICogPHByZT4KKyAqIHZlcmJvc2UgPSBmYWxzZShkZWZhdWx0KSB8IHRydWUKKyAqIDwvcHJlPgorICogCisgKiA8cD4gCisgKiBJbiBvcmRlciB0byBzdXBwb3J0IGNsYXNzLWxvYWRpbmctdHJvdWJsZXMtZGVidWdnaW5nIHdpdGggVG9tY2F0IDQgb3IKKyAqIGhpZ2hlciwgeW91IGNhbiBsb2cgdGhlIGNsYXNzIGxvYWRlciByZXNwb25zaWJsZSBmb3IgbG9hZGluZyBzb21lIGNsYXNzZXMuCisgKiBTZWUgPGEgaHJlZj0iaHR0cDovL2ppcmEuY29kZWhhdXMub3JnL2Jyb3dzZS9HUk9PVlktODYxIj5HUk9PVlktODYxPC9hPiBmb3IgZGV0YWlscy4KKyAqIFRoZSBzZXJ2bGV0IGluaXQgcGFyYW1ldGVyIG5hbWUgaXM6CisgKiA8cHJlPgorICogbG9nLkdST09WWTg2MSA9IGZhbHNlKGRlZmF1bHQpIHwgdHJ1ZQorICogPC9wcmU+CisgKiAKKyAqIDxwPiAKKyAqIElmIHlvdSBleHBlcmllbmNlIGNsYXNzLWxvYWRpbmctdHJvdWJsZXMgd2l0aCBUb21jYXQgNCAob3IgaGlnaGVyKSBvciBhbnkKKyAqIG90aGVyIHNlcnZsZXQgY29udGFpbmVyIHVzaW5nIGN1c3RvbSBjbGFzcyBsb2FkZXIgc2V0dXBzLCB5b3UgY2FuIGZhbGxiYWNrCisgKiB0byB1c2UgKHNsb3dlcikgcmVmbGVjdGlvbiBpbiBHcm9vdnkncyBNZXRhQ2xhc3MgaW1wbGVtZW50YXRpb24uIFBsZWFzZQorICogY29udGFjdCB0aGUgZGV2IHRlYW0gd2l0aCB5b3VyIHByb2JsZW0hIFRoYW5rcy4KKyAqIFRoZSBzZXJ2bGV0IGluaXQgcGFyYW1ldGVyIG5hbWUgaXM6CisgKiA8cHJlPgorICogcmVmbGVjdGlvbiA9IGZhbHNlKGRlZmF1bHQpIHwgdHJ1ZQorICogPC9wcmU+CisgKiAKKyAqCisgKiBAYXV0aG9yIENocmlzdGlhbiBTdGVpbgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RIdHRwU2VydmxldCBleHRlbmRzIEh0dHBTZXJ2bGV0IGltcGxlbWVudHMgUmVzb3VyY2VDb25uZWN0b3IgeworCisgICAgLyoqCisgICAgICogQ29udGVudCB0eXBlIG9mIHRoZSBIVFRQIHJlc3BvbnNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfVFlQRV9URVhUX0hUTUwgPSAidGV4dC9odG1sIjsKKworICAgIC8qKgorICAgICAqIFNlcnZsZXQgQVBJIGluY2x1ZGUga2V5IG5hbWU6IHBhdGhfaW5mbworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOQ19QQVRIX0lORk8gPSAiamF2YXguc2VydmxldC5pbmNsdWRlLnBhdGhfaW5mbyI7CisKKyAgICAvKiAqKiogTm90IHVzZWQsIHlldC4gU2VlIGNvbW1lbnRzIGluIGdldFNjcmlwdFVyaShIdHRwU2VydmxldFJlcXVlc3QpLiAqKioKKyAgICAgKiBTZXJ2bGV0IEFQSSBpbmNsdWRlIGtleSBuYW1lOiByZXF1ZXN0X3VyaQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOQ19SRVFVRVNUX1VSSSA9ICJqYXZheC5zZXJ2bGV0LmluY2x1ZGUucmVxdWVzdF91cmkiOworCisgICAgLyoqCisgICAgICogU2VydmxldCBBUEkgaW5jbHVkZSBrZXkgbmFtZTogc2VydmxldF9wYXRoCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5DX1NFUlZMRVRfUEFUSCA9ICJqYXZheC5zZXJ2bGV0LmluY2x1ZGUuc2VydmxldF9wYXRoIjsKKworICAgIC8qKgorICAgICAqIFNlcnZsZXQgKG9yIHRoZSB3ZWIgYXBwbGljYXRpb24pIGNvbnRleHQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFNlcnZsZXRDb250ZXh0IHNlcnZsZXRDb250ZXh0OworCisgICAgLyoqCisgICAgICogPGI+TnVsbDwvYj4gb3IgY29tcGlsZWQgcGF0dGVybiBtYXRjaGVyIHJlYWQgZnJvbSAicmVzb3VyY2UubmFtZS5yZWdleCIKKyAgICAgKiAgYW5kIHVzZWQgaW4ge0BsaW5rIEFic3RyYWN0SHR0cFNlcnZsZXQjZ2V0UmVzb3VyY2VDb25uZWN0aW9uKFN0cmluZyl9LgorICAgICAqLworICAgIHByb3RlY3RlZCBNYXRjaGVyIHJlc291cmNlTmFtZU1hdGNoZXI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVwbGFjZW1lbnQgdXNlZCBieSB0aGUgcmVzb3VyY2UgbmFtZSBtYXRjaGVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgcmVzb3VyY2VOYW1lUmVwbGFjZW1lbnQ7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVwbGFjZSBtZXRob2QgdG8gdXNlIG9uIHRoZSBtYXRjaGVyLgorICAgICAqIDxwcmU+CisgICAgICogdHJ1ZSAtIHJlcGxhY2VBbGwocmVzb3VyY2VOYW1lUmVwbGFjZW1lbnQpOyAoZGVmYXVsdCkKKyAgICAgKiBmYWxzZSAtIHJlcGxhY2VGaXJzdChyZXNvdXJjZU5hbWVSZXBsYWNlbWVudCk7CisgICAgICogPC9wcmU+CisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVzb3VyY2VOYW1lUmVwbGFjZUFsbDsKKworICAgIC8qKgorICAgICAqIENvbnRyb2xzIGFsbW9zdCBhbGwgbG9nIG91dHB1dC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiB2ZXJib3NlOworCisgICAgLyoqCisgICAgICogTWlycm9ycyB0aGUgc3RhdGljIHZhbHVlIG9mIHRoZSByZWZsZWN0aW9uIGZsYWcgaW4gTWV0YUNsYXNzLgorICAgICAqIFNlZSBBYnN0cmFjdEh0dHBTZXJ2bGV0I2xvZ0dST09WWTg2MQorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHJlZmxlY3Rpb247CisKKyAgICAvKioKKyAgICAgKiBEZWJ1ZyBmbGFnIGxvZ2dpbmcgdGhlIGNsYXNzIHRoZSBjbGFzcyBsb2FkZXIgb2YgdGhlIHJlcXVlc3QuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGxvZ0dST09WWTg2MTsKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemVzIGFsbCBmaWVsZHMgd2l0aCBkZWZhdWx0IHZhbHVlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQWJzdHJhY3RIdHRwU2VydmxldCgpIHsKKyAgICAgICAgdGhpcy5zZXJ2bGV0Q29udGV4dCA9IG51bGw7CisgICAgICAgIHRoaXMucmVzb3VyY2VOYW1lTWF0Y2hlciA9IG51bGw7CisgICAgICAgIHRoaXMucmVzb3VyY2VOYW1lUmVwbGFjZW1lbnQgPSBudWxsOworICAgICAgICB0aGlzLnJlc291cmNlTmFtZVJlcGxhY2VBbGwgPSB0cnVlOworICAgICAgICB0aGlzLnZlcmJvc2UgPSBmYWxzZTsKKyAgICAgICAgdGhpcy5yZWZsZWN0aW9uID0gZmFsc2U7CisgICAgICAgIHRoaXMubG9nR1JPT1ZZODYxID0gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJmYWNlIG1ldGhvZCBmb3IgUmVzb3VyY2VDb250YWluZXIuIFRoaXMgaXMgdXNlZCBieSB0aGUgR3Jvb3Z5U2NyaXB0RW5naW5lLgorICAgICAqLworICAgIHB1YmxpYyBVUkxDb25uZWN0aW9uIGdldFJlc291cmNlQ29ubmVjdGlvbihTdHJpbmcgbmFtZSkgdGhyb3dzIFJlc291cmNlRXhjZXB0aW9uIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogRmlyc3QsIG1hbmdsZSByZXNvdXJjZSBuYW1lIHdpdGggdGhlIGNvbXBpbGVkIHBhdHRlcm4uCisgICAgICAgICAqLworICAgICAgICBNYXRjaGVyIG1hdGNoZXIgPSByZXNvdXJjZU5hbWVNYXRjaGVyOworICAgICAgICBpZiAobWF0Y2hlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtYXRjaGVyLnJlc2V0KG5hbWUpOworICAgICAgICAgICAgU3RyaW5nIHJlcGxhY2VkOworICAgICAgICAgICAgaWYgKHJlc291cmNlTmFtZVJlcGxhY2VBbGwpIHsKKyAgICAgICAgICAgICAgICByZXBsYWNlZCA9IHJlc291cmNlTmFtZU1hdGNoZXIucmVwbGFjZUFsbChyZXNvdXJjZU5hbWVSZXBsYWNlbWVudCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlcGxhY2VkID0gcmVzb3VyY2VOYW1lTWF0Y2hlci5yZXBsYWNlRmlyc3QocmVzb3VyY2VOYW1lUmVwbGFjZW1lbnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFuYW1lLmVxdWFscyhyZXBsYWNlZCkpIHsKKyAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSkgeworICAgICAgICAgICAgICAgICAgICBsb2coIlJlcGxhY2VkIHJlc291cmNlIG5hbWUgXCIiICsgbmFtZSArICJcIiB3aXRoIFwiIiArIHJlcGxhY2VkICsgIlwiLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBuYW1lID0gcmVwbGFjZWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBUcnkgdG8gbG9jYXRlIHRoZSByZXNvdXJjZSBhbmQgcmV0dXJuIGFuIG9wZW5lZCBjb25uZWN0aW9uIHRvIGl0LgorICAgICAgICAgKi8KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFVSTCB1cmwgPSBzZXJ2bGV0Q29udGV4dC5nZXRSZXNvdXJjZSgiLyIgKyBuYW1lKTsKKyAgICAgICAgICAgIGlmICh1cmwgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHVybCA9IHNlcnZsZXRDb250ZXh0LmdldFJlc291cmNlKCIvV0VCLUlORi9ncm9vdnkvIiArIG5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHVybCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlc291cmNlRXhjZXB0aW9uKCJSZXNvdXJjZSBcIiIgKyBuYW1lICsgIlwiIG5vdCBmb3VuZCEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB1cmwub3BlbkNvbm5lY3Rpb24oKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJlc291cmNlRXhjZXB0aW9uKCJQcm9ibGVtcyBnZXR0aW5nIHJlc291cmNlIG5hbWVkIFwiIiArIG5hbWUgKyAiXCIhIiwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBpbmNsdWRlLWF3YXJlIHVyaSBvZiB0aGUgc2NyaXB0IG9yIHRlbXBsYXRlIGZpbGUuCisgICAgICogCisgICAgICogQHBhcmFtIHJlcXVlc3QKKyAgICAgKiAgdGhlIGh0dHAgcmVxdWVzdCB0byBhbmFseXplCisgICAgICogQHJldHVybiB0aGUgaW5jbHVkZS1hd2FyZSB1cmkgZWl0aGVyIHBhcnNlZCBmcm9tIHJlcXVlc3QgYXR0cmlidXRlcyBvcgorICAgICAqICBoaW50cyBwcm92aWRlZCBieSB0aGUgc2VydmxldCBjb250YWluZXIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFNjcmlwdFVyaShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICAvKgorICAgICAgICAgKiBMb2cgc29tZSBkZWJ1ZyBpbmZvcm1hdGlvbiBmb3IgaHR0cDovL2ppcmEuY29kZWhhdXMub3JnL2Jyb3dzZS9HUk9PVlktODYxCisgICAgICAgICAqLworICAgICAgICBpZiAobG9nR1JPT1ZZODYxKSB7CisgICAgICAgICAgICBsb2coIkxvZ2dpbmcgcmVxdWVzdCBjbGFzcyBhbmQgaXRzIGNsYXNzIGxvYWRlcjoiKTsKKyAgICAgICAgICAgIGxvZygiIGMgPSByZXF1ZXN0LmdldENsYXNzKCkgOlwiIiArIHJlcXVlc3QuZ2V0Q2xhc3MoKSArICJcIiIpOworICAgICAgICAgICAgbG9nKCIgbCA9IGMuZ2V0Q2xhc3NMb2FkZXIoKSA6XCIiICsgcmVxdWVzdC5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkgKyAiXCIiKTsKKyAgICAgICAgICAgIGxvZygiIGwuZ2V0Q2xhc3MoKSAgICAgICAgICAgOlwiIiArIHJlcXVlc3QuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpLmdldENsYXNzKCkgKyAiXCIiKTsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBLZWVwIGxvZ2dpbmcsIGlmIHdlJ3JlIHZlcmJvc2UuIEVsc2UgdHVybiBpdCBvZmYuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGxvZ0dST09WWTg2MSA9IHZlcmJvc2U7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBOT1RFOiBUaGlzIHBpZWNlIG9mIGNvZGUgaXMgaGVhdmlseSBpbnNwaXJlZCBieSBBcGFjaGVzIEphc3BlcjIhCisgICAgICAgIC8vIAorICAgICAgICAvLyBodHRwOi8vY3ZzLmFwYWNoZS5vcmcvdmlld2N2cy5jZ2kvamFrYXJ0YS10b21jYXQtamFzcGVyL2phc3BlcjIvIFwKKyAgICAgICAgLy8gICAgICAgIHNyYy9zaGFyZS9vcmcvYXBhY2hlL2phc3Blci9zZXJ2bGV0L0pzcFNlcnZsZXQuamF2YT92aWV3PW1hcmt1cAorICAgICAgICAvLworICAgICAgICAvLyBXaHkgZG9lc24ndCBpdCB1c2UgcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCkgb3IgSU5DX1JFUVVFU1RfVVJJPworICAgICAgICAvLworCisgICAgICAgIFN0cmluZyB1cmkgPSBudWxsOworICAgICAgICBTdHJpbmcgaW5mbyA9IG51bGw7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSByZXF1ZXN0ZWQgc2NyaXB0L3RlbXBsYXRlIHNvdXJjZSBmaWxlIGhhcyBiZWVuIHRoZQorICAgICAgICAvLyB0YXJnZXQgb2YgYSBSZXF1ZXN0RGlzcGF0Y2hlci5pbmNsdWRlKCkuCisgICAgICAgIC8vCisgICAgICAgIHVyaSA9IChTdHJpbmcpIHJlcXVlc3QuZ2V0QXR0cmlidXRlKElOQ19TRVJWTEVUX1BBVEgpOworICAgICAgICBpZiAodXJpICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBSZXF1ZXN0ZWQgc2NyaXB0L3RlbXBsYXRlIGZpbGUgaGFzIGJlZW4gdGFyZ2V0IG9mIAorICAgICAgICAgICAgLy8gUmVxdWVzdERpc3BhdGNoZXIuaW5jbHVkZSgpLiBJdHMgcGF0aCBpcyBhc3NlbWJsZWQgZnJvbSB0aGUgcmVsZXZhbnQKKyAgICAgICAgICAgIC8vIGphdmF4LnNlcnZsZXQuaW5jbHVkZS4qIHJlcXVlc3QgYXR0cmlidXRlcyBhbmQgcmV0dXJuZWQhCisgICAgICAgICAgICAvLworICAgICAgICAgICAgaW5mbyA9IChTdHJpbmcpIHJlcXVlc3QuZ2V0QXR0cmlidXRlKElOQ19QQVRIX0lORk8pOworICAgICAgICAgICAgaWYgKGluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHVyaSArPSBpbmZvOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHVyaTsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIFJlcXVlc3RlZCBzY3JpcHQvdGVtcGxhdGUgZmlsZSBoYXMgbm90IGJlZW4gdGhlIHRhcmdldCBvZiBhIAorICAgICAgICAvLyBSZXF1ZXN0RGlzcGF0Y2hlci5pbmNsdWRlKCkuIFJlY29uc3RydWN0IGl0cyBwYXRoIGZyb20gdGhlIHJlcXVlc3QncworICAgICAgICAvLyBnZXRTZXJ2bGV0UGF0aCgpIGFuZCBnZXRQYXRoSW5mbygpIHJlc3VsdHMuCisgICAgICAgIC8vCisgICAgICAgIHVyaSA9IHJlcXVlc3QuZ2V0U2VydmxldFBhdGgoKTsKKyAgICAgICAgaW5mbyA9IHJlcXVlc3QuZ2V0UGF0aEluZm8oKTsKKyAgICAgICAgaWYgKGluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgdXJpICs9IGluZm87CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBUT0RPIDogRW5hYmxlIGF1dG8gIi5ncm9vdnkiIGV4dGVuc2lvbiByZXBsYWNpbmcgaGVyZSEKKyAgICAgICAgICogaHR0cDovL2N2cy5ncm9vdnkuY29kZWhhdXMub3JnL3ZpZXdyZXAvZ3Jvb3Z5L2dyb292eS9ncm9vdnktY29yZS9zcmMvbWFpbi9ncm9vdnkvc2VydmxldC9Hcm9vdnlTZXJ2bGV0LmphdmE/cj0xLjEwI2wyNTkgCisgICAgICAgICAqLworCisgICAgICAgIHJldHVybiB1cmk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2VzIHRoZSBodHRwIHJlcXVlc3QgZm9yIHRoZSByZWFsIHNjcmlwdCBvciB0ZW1wbGF0ZSBzb3VyY2UgZmlsZS4KKyAgICAgKiBAcGFyYW0gcmVxdWVzdCB0aGUgaHR0cCByZXF1ZXN0IHRvIGFuYWx5emUKKyAgICAgKiBAcmV0dXJuIGEgZmlsZSBvYmplY3QgdXNpbmcgYW4gYWJzb2x1dGUgZmlsZSBwYXRoIG5hbWUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRmlsZSBnZXRTY3JpcHRVcmlBc0ZpbGUoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgU3RyaW5nIHVyaSA9IGdldFNjcmlwdFVyaShyZXF1ZXN0KTsKKyAgICAgICAgU3RyaW5nIHJlYWwgPSBzZXJ2bGV0Q29udGV4dC5nZXRSZWFsUGF0aCh1cmkpOworICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShyZWFsKS5nZXRBYnNvbHV0ZUZpbGUoKTsKKyAgICAgICAgcmV0dXJuIGZpbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3ZlcnJpZGVzIHRoZSBnZW5lcmljIGluaXQgbWV0aG9kIHRvIHNldCBzb21lIGRlYnVnIGZsYWdzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb25maWcKKyAgICAgKiAgdGhlIHNlcnZsZXQgY29uaWd1cmF0aW9uIHByb3ZpZGVkIGJ5IHRoZSBjb250YWluZXIKKyAgICAgKiBAdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24gaWYgaW5pdCgpIG1ldGhvZCBkZWZpbmVkIGluIHN1cGVyIGNsYXNzIAorICAgICAqICBqYXZheC5zZXJ2bGV0LkdlbmVyaWNTZXJ2bGV0IHRocm93cyBpdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGluaXQoU2VydmxldENvbmZpZyBjb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogTmV2ZXIgZm9yZ2V0IHN1cGVyLmluaXQoKSEKKyAgICAgICAgICovCisgICAgICAgIHN1cGVyLmluaXQoY29uZmlnKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBHcmFiIHRoZSBzZXJ2bGV0IGNvbnRleHQuCisgICAgICAgICAqLworICAgICAgICB0aGlzLnNlcnZsZXRDb250ZXh0ID0gY29uZmlnLmdldFNlcnZsZXRDb250ZXh0KCk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogR2V0IHZlcmJvc2l0eSBoaW50LgorICAgICAgICAgKi8KKyAgICAgICAgU3RyaW5nIHZhbHVlID0gY29uZmlnLmdldEluaXRQYXJhbWV0ZXIoInZlcmJvc2UiKTsKKyAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMudmVyYm9zZSA9IEJvb2xlYW4udmFsdWVPZih2YWx1ZSkuYm9vbGVhblZhbHVlKCk7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBBbmQgbm93IHRoZSByZWFsIGluaXQgd29yay4uLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgICAgIGxvZygiUGFyc2luZyBpbml0IHBhcmFtZXRlcnMuLi4iKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyByZWdleCA9IGNvbmZpZy5nZXRJbml0UGFyYW1ldGVyKCJyZXNvdXJjZS5uYW1lLnJlZ2V4Iik7CisgICAgICAgIGlmIChyZWdleCAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgcmVwbGFjZW1lbnQgPSBjb25maWcuZ2V0SW5pdFBhcmFtZXRlcigicmVzb3VyY2UubmFtZS5yZXBsYWNlbWVudCIpOworICAgICAgICAgICAgaWYgKHJlcGxhY2VtZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBFeGNlcHRpb24gbnBleCA9IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigicmVzb3VyY2UubmFtZS5yZXBsYWNlbWVudCIpOworICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIkluaXQtcGFyYW0gJ3Jlc291cmNlLm5hbWUucmVwbGFjZW1lbnQnIG5vdCBzcGVjaWZpZWQhIjsKKyAgICAgICAgICAgICAgICBsb2cobWVzc2FnZSwgbnBleCk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24obWVzc2FnZSwgbnBleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgZmxhZ3MgPSAwOyAvLyBUT0RPIDogUGFyc2UgcGF0dGVybiBjb21waWxlIGZsYWdzLgorICAgICAgICAgICAgdGhpcy5yZXNvdXJjZU5hbWVNYXRjaGVyID0gUGF0dGVybi5jb21waWxlKHJlZ2V4LCBmbGFncykubWF0Y2hlcigiIik7CisgICAgICAgICAgICB0aGlzLnJlc291cmNlTmFtZVJlcGxhY2VtZW50ID0gcmVwbGFjZW1lbnQ7CisgICAgICAgICAgICBTdHJpbmcgYWxsID0gY29uZmlnLmdldEluaXRQYXJhbWV0ZXIoInJlc291cmNlLm5hbWUucmVwbGFjZS5hbGwiKTsKKyAgICAgICAgICAgIGlmIChhbGwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRoaXMucmVzb3VyY2VOYW1lUmVwbGFjZUFsbCA9IEJvb2xlYW4udmFsdWVPZihhbGwpLmJvb2xlYW5WYWx1ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmFsdWUgPSBjb25maWcuZ2V0SW5pdFBhcmFtZXRlcigibG9nR1JPT1ZZODYxIik7CisgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLmxvZ0dST09WWTg2MSA9IEJvb2xlYW4udmFsdWVPZih2YWx1ZSkuYm9vbGVhblZhbHVlKCk7CisgICAgICAgICAgICAvLyBub3RoaW5nIGVsc2UgdG8gZG8gaGVyZQorICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogSWYgdmVyYm9zZSwgbG9nIHRoZSBwYXJhbWV0ZXIgdmFsdWVzLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgICAgIGxvZygiKEFic3RyYWN0KSBpbml0IGRvbmUuIExpc3Rpbmcgc29tZSBwYXJhbWV0ZXIgbmFtZS92YWx1ZSBwYWlyczoiKTsKKyAgICAgICAgICAgIGxvZygidmVyYm9zZSA9ICIgKyB2ZXJib3NlKTsgLy8gdGhpcyAqaXMqIHZlcmJvc2UhIDspCisgICAgICAgICAgICBsb2coInJlZmxlY3Rpb24gPSAiICsgcmVmbGVjdGlvbik7CisgICAgICAgICAgICBsb2coImxvZ0dST09WWTg2MSA9ICIgKyBsb2dHUk9PVlk4NjEpOworICAgICAgICAgICAgaWYgKHJlc291cmNlTmFtZU1hdGNoZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGxvZygicmVzb3VyY2UubmFtZS5yZWdleCA9ICIgKyByZXNvdXJjZU5hbWVNYXRjaGVyLnBhdHRlcm4oKS5wYXR0ZXJuKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbG9nKCJyZXNvdXJjZS5uYW1lLnJlZ2V4ID0gbnVsbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9nKCJyZXNvdXJjZS5uYW1lLnJlcGxhY2VtZW50ID0gIiArIHJlc291cmNlTmFtZVJlcGxhY2VtZW50KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc2VydmxldC9Hcm9vdnlTZXJ2bGV0LmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3NlcnZsZXQvR3Jvb3Z5U2VydmxldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwODMwYWQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3NlcnZsZXQvR3Jvb3Z5U2VydmxldC5qYXZhCkBAIC0wLDAgKzEsMTgzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgZ3Jvb3Z5LnNlcnZsZXQ7CisKK2ltcG9ydCBncm9vdnkubGFuZy5CaW5kaW5nOworaW1wb3J0IGdyb292eS5sYW5nLkNsb3N1cmU7CitpbXBvcnQgZ3Jvb3Z5LnV0aWwuR3Jvb3Z5U2NyaXB0RW5naW5lOworaW1wb3J0IGdyb292eS51dGlsLlJlc291cmNlRXhjZXB0aW9uOworaW1wb3J0IGdyb292eS51dGlsLlNjcmlwdEV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb25maWc7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuR3Jvb3Z5Q2F0ZWdvcnlTdXBwb3J0OworCisvKioKKyAqIFRoaXMgc2VydmxldCB3aWxsIHJ1biBHcm9vdnkgc2NyaXB0cyBhcyBHcm9vdmxldHMuICBHcm9vdmxldHMgYXJlIHNjcmlwdHMKKyAqIHdpdGggdGhlc2Ugb2JqZWN0cyBpbXBsaWNpdCBpbiB0aGVpciBzY29wZToKKyAqCisgKiA8dWw+CisgKiAJPGxpPnJlcXVlc3QgLSB0aGUgSHR0cFNlcnZsZXRSZXF1ZXN0PC9saT4KKyAqICA8bGk+cmVzcG9uc2UgLSB0aGUgSHR0cFNlcnZsZXRSZXNwb25zZTwvbGk+CisgKiAgPGxpPmFwcGxpY2F0aW9uIC0gdGhlIFNlcnZsZXRDb250ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VydmxldDwvbGk+CisgKiAgPGxpPnNlc3Npb24gLSB0aGUgSHR0cFNlc3Npb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBIdHRwU2VydmxldFJlcXVlc3Q8L2xpPgorICogIDxsaT5vdXQgLSB0aGUgUHJpbnRXcml0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBTZXJ2bGV0UmVxdWVzdDwvbGk+CisgKiA8L3VsPgorICoKKyAqIDxwPllvdXIgc2NyaXB0IHNvdXJjZXMgY2FuIGJlIHBsYWNlZCBlaXRoZXIgaW4geW91ciB3ZWIgYXBwbGljYXRpb24ncyBub3JtYWwKKyAqIHdlYiByb290IChhbGxvd3MgZm9yIHN1YmRpcmVjdG9yaWVzKSBvciBpbiAvV0VCLUlORi9ncm9vdnkvKiAoYWxzbyBhbGxvd3MKKyAqIHN1YmRpcmVjdG9yaWVzKS4KKyAqCisgKiA8cD5UbyBtYWtlIHlvdXIgd2ViIGFwcGxpY2F0aW9uIG1vcmUgZ3Jvb3Z5LCB5b3UgbXVzdCBhZGQgdGhlIEdyb292eVNlcnZsZXQKKyAqIHRvIHlvdXIgYXBwbGljYXRpb24ncyB3ZWIueG1sIGNvbmZpZ3VyYXRpb24gdXNpbmcgYW55IG1hcHBpbmcgeW91IGxpa2UsIHNvCisgKiBsb25nIGFzIGl0IGZvbGxvd3MgdGhlIHBhdHRlcm4gKi4qIChtb3JlIG9uIHRoaXMgYmVsb3cpLiAgSGVyZSBpcyB0aGUKKyAqIHdlYi54bWwgZW50cnk6CisgKgorICogPHByZT4KKyAqICAgIDxzZXJ2bGV0PgorICogICAgICA8c2VydmxldC1uYW1lPkdyb292eTwvc2VydmxldC1uYW1lPgorICogICAgICA8c2VydmxldC1jbGFzcz5ncm9vdnkuc2VydmxldC5Hcm9vdnlTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgorICogICAgPC9zZXJ2bGV0PgorICoKKyAqICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgKiAgICAgIDxzZXJ2bGV0LW5hbWU+R3Jvb3Z5PC9zZXJ2bGV0LW5hbWU+CisgKiAgICAgIDx1cmwtcGF0dGVybj4qLmdyb292eTwvdXJsLXBhdHRlcm4+CisgKiAgICAgIDx1cmwtcGF0dGVybj4qLmdkbzwvdXJsLXBhdHRlcm4+CisgKiAgICA8L3NlcnZsZXQtbWFwcGluZz4KKyAqIDwvcHJlPgorICoKKyAqIDxwPlRoZSBVUkwgcGF0dGVybiBkb2VzIG5vdCByZXF1aXJlIHRoZSAiKi5ncm9vdnkiIG1hcHBpbmcuICBZb3UgY2FuLCBmb3IKKyAqIGV4YW1wbGUsIG1ha2UgaXQgbW9yZSBTdHJ1dHMtbGlrZSBidXQgZ3Jvb3Z5IGJ5IG1ha2luZyB5b3VyIG1hcHBpbmcgIiouZ2RvIi4KKyAqCisgKiBAYXV0aG9yIFNhbSBQdWxsYXJhCisgKiBAYXV0aG9yIE1hcmsgVHVyYW5za3kgKG1hcmt0dXJhbnNreSBhdCBob3RtYWlsLmNvbSkKKyAqIEBhdXRob3IgR3VpbGxhdW1lIExhZm9yZ2UKKyAqIEBhdXRob3IgQ2hyaXN0aWFuIFN0ZWluCisgKiAKKyAqIEBzZWUgZ3Jvb3Z5LnNlcnZsZXQuU2VydmxldEJpbmRpbmcKKyAqLworcHVibGljIGNsYXNzIEdyb292eVNlcnZsZXQgZXh0ZW5kcyBBYnN0cmFjdEh0dHBTZXJ2bGV0IHsKKworICAgIC8qKgorICAgICAqIFRoZSBzY3JpcHQgZW5naW5lIGV4ZWN1dGluZyB0aGUgR3Jvb3Z5IHNjcmlwdHMgZm9yIHRoaXMgc2VydmxldAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIEdyb292eVNjcmlwdEVuZ2luZSBnc2U7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIHRoZSBHcm9vdnlTZXJ2bGV0LgorICAgICAqCisgICAgICogQHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICogIGlmIHRoaXMgbWV0aG9kIGVuY291bnRlcmVkIGRpZmZpY3VsdGllcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGluaXQoU2VydmxldENvbmZpZyBjb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuaW5pdChjb25maWcpOworCisgICAgICAgIC8vIFNldCB1cCB0aGUgc2NyaXB0aW5nIGVuZ2luZQorICAgICAgICBnc2UgPSBuZXcgR3Jvb3Z5U2NyaXB0RW5naW5lKHRoaXMpOworCisgICAgICAgIHNlcnZsZXRDb250ZXh0LmxvZygiR3Jvb3Z5IHNlcnZsZXQgaW5pdGlhbGl6ZWQgb24gIiArIGdzZSArICIuIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogSGFuZGxlIHdlYiByZXF1ZXN0cyB0byB0aGUgR3Jvb3Z5U2VydmxldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlcnZpY2UoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gR2V0IHRoZSBzY3JpcHQgcGF0aCBmcm9tIHRoZSByZXF1ZXN0IC0gaW5jbHVkZSBhd2FyZSAoR1JPT1ZZLTgxNSkKKyAgICAgICAgZmluYWwgU3RyaW5nIHNjcmlwdFVyaSA9IGdldFNjcmlwdFVyaShyZXF1ZXN0KTsKKworICAgICAgICAvLyBTZXQgaXQgdG8gSFRNTCBieSBkZWZhdWx0CisgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L2h0bWwiKTsKKworICAgICAgICAvLyBTZXQgdXAgdGhlIHNjcmlwdCBjb250ZXh0CisgICAgICAgIGZpbmFsIEJpbmRpbmcgYmluZGluZyA9IG5ldyBTZXJ2bGV0QmluZGluZyhyZXF1ZXN0LCByZXNwb25zZSwgc2VydmxldENvbnRleHQpOworCisgICAgICAgIC8vIFJ1biB0aGUgc2NyaXB0CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDbG9zdXJlIGNsb3N1cmUgPSBuZXcgQ2xvc3VyZShnc2UpIHsKKworICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgY2FsbCgpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoKEdyb292eVNjcmlwdEVuZ2luZSkgZ2V0RGVsZWdhdGUoKSkucnVuKHNjcmlwdFVyaSwgYmluZGluZyk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlc291cmNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChTY3JpcHRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBHcm9vdnlDYXRlZ29yeVN1cHBvcnQudXNlKFNlcnZsZXRDYXRlZ29yeS5jbGFzcywgY2xvc3VyZSk7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogU2V0IHJlcG9uc2UgY29kZSAyMDAuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX09LKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBydW50aW1lRXhjZXB0aW9uKSB7CisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgZXJyb3IgPSBuZXcgU3RyaW5nQnVmZmVyKCJHcm9vdnlTZXJ2bGV0IEVycm9yOiAiKTsKKyAgICAgICAgICAgIGVycm9yLmFwcGVuZCgiIHNjcmlwdDogJyIpOworICAgICAgICAgICAgZXJyb3IuYXBwZW5kKHNjcmlwdFVyaSk7CisgICAgICAgICAgICBlcnJvci5hcHBlbmQoIic6ICIpOworICAgICAgICAgICAgVGhyb3dhYmxlIGUgPSBydW50aW1lRXhjZXB0aW9uLmdldENhdXNlKCk7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogTnVsbCBjYXVzZT8hCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBlcnJvci5hcHBlbmQoIiBTY3JpcHQgcHJvY2Vzc2luZyBmYWlsZWQuIik7CisgICAgICAgICAgICAgICAgZXJyb3IuYXBwZW5kKHJ1bnRpbWVFeGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAocnVudGltZUV4Y2VwdGlvbi5nZXRTdGFja1RyYWNlKCkubGVuZ3RoID4gMCkKKyAgICAgICAgICAgICAgICAgICAgZXJyb3IuYXBwZW5kKHJ1bnRpbWVFeGNlcHRpb24uZ2V0U3RhY2tUcmFjZSgpWzBdLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHNlcnZsZXRDb250ZXh0LmxvZyhlcnJvci50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oZXJyb3IudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcnVudGltZUV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7CisgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLCBlcnJvci50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogUmVzb3VyY2Ugbm90IGZvdW5kLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFJlc291cmNlRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgZXJyb3IuYXBwZW5kKCIgU2NyaXB0IG5vdCBmb3VuZCwgc2VuZGluZyA0MDQuIik7CisgICAgICAgICAgICAgICAgc2VydmxldENvbnRleHQubG9nKGVycm9yLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihlcnJvci50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19OT1RfRk9VTkQpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBPdGhlciBpbnRlcm5hbCBlcnJvci4gUGVyaGFwcyBzeW50YXg/ISAKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgc2VydmxldENvbnRleHQubG9nKCJBbiBlcnJvciBvY2N1cnJlZCBwcm9jZXNzaW5nIHRoZSByZXF1ZXN0IiwgcnVudGltZUV4Y2VwdGlvbik7CisgICAgICAgICAgICBlcnJvci5hcHBlbmQoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgaWYgKGUuZ2V0U3RhY2tUcmFjZSgpLmxlbmd0aCA+IDApCisgICAgICAgICAgICAgICAgZXJyb3IuYXBwZW5kKGUuZ2V0U3RhY2tUcmFjZSgpWzBdLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgc2VydmxldENvbnRleHQubG9nKGUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHJ1bnRpbWVFeGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLCBlLnRvU3RyaW5nKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEZpbmFsbHksIGZsdXNoIHRoZSByZXNwb25zZSBidWZmZXIuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHJlc3BvbnNlLmZsdXNoQnVmZmVyKCk7CisgICAgICAgICAgICAvLyBzZXJ2bGV0Q29udGV4dC5sb2coIkZsdXNoZWQgcmVzcG9uc2UgYnVmZmVyLiIpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3NlcnZsZXQvU2VydmxldEJpbmRpbmcuamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc2VydmxldC9TZXJ2bGV0QmluZGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MjI4MGMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3NlcnZsZXQvU2VydmxldEJpbmRpbmcuamF2YQpAQCAtMCwwICsxLDE5OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGdyb292eS5zZXJ2bGV0OworCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuQmluZGluZzsKK2ltcG9ydCBncm9vdnkueG1sLk1hcmt1cEJ1aWxkZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCisvKioKKyAqIFNlcnZsZXQtc3BlY2lmaWMgYmluZGluZyBleHRlbnNpb24gdG8gbGF6eSBsb2FkIHRoZSB3cml0ZXIgb3IgdGhlIG91dHB1dAorICogc3RyZWFtIGZyb20gdGhlIHJlc3BvbnNlLgorICogCisgKiA8cD4KKyAqIDxoMz5EZWZhdWx0IHZhcmlhYmxlcyBib3VuZDwvaDM+CisgKiA8dWw+CisgKiA8bGk+PHR0PiJyZXF1ZXN0IjwvdHQ+IDogdGhlIEh0dHBTZXJ2bGV0UmVxdWVzdCBvYmplY3Q8L2xpPgorICogPGxpPjx0dD4icmVzcG9uc2UiPC90dD4gOiB0aGUgSHR0cFNlcnZsZXRSZXNwb25zZSBvYmplY3Q8L2xpPgorICogPGxpPjx0dD4iY29udGV4dCI8L3R0PiA6IHRoZSBTZXJ2bGV0Q29udGV4dCBvYmplY3QgPC9saT4KKyAqIDxsaT48dHQ+ImFwcGxpY2F0aW9uIjwvdHQ+IDogc2FtZSBhcyBjb250ZXh0PC9saT4KKyAqIDxsaT48dHQ+InNlc3Npb24iPC90dD4gOiBjb252ZW5pZW50IGZvciA8Y29kZT5yZXF1ZXN0LmdldFNlc3Npb24oPGI+ZmFsc2U8L2I+KTwvY29kZT4gLSBjYW4gYmUgbnVsbCE8L2xpPgorICogPGxpPjx0dD4icGFyYW1zIjwvdHQ+IDogbWFwIG9mIGFsbCBmb3JtIHBhcmFtZXRlcnMgLSBjYW4gYmUgZW1wdHk8L2xpPgorICogPGxpPjx0dD4iaGVhZGVycyI8L3R0PiA6IG1hcCBvZiBhbGwgPGI+cmVxdWVzdDwvYj4gaGVhZGVyIGZpZWxkczwvbGk+CisgKiA8L3VsPgorICogCisgKiA8cD4KKyAqIDxoMz5JbXBsaWNpdGUgYm91bmQgdmFyaWFibGVzPC9oMz4KKyAqIDx1bD4KKyAqIDxsaT48dHQ+Im91dCI8L3R0PiA6IHJlc3BvbnNlLmdldFdyaXRlcigpIDwvbGk+CisgKiA8bGk+PHR0PiJzb3V0IjwvdHQ+IDogcmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCkgPC9saT4KKyAqIDxsaT48dHQ+Imh0bWwiPC90dD4gOiBuZXcgTWFya3VwQnVpbGRlcihyZXNwb25zZS5nZXRXcml0ZXIoKSkgPC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKiAKKyAqIEBhdXRob3IgR3VpbGxhdW1lIExhZm9yZ2UKKyAqIEBhdXRob3IgQ2hyaXN0aWFuIFN0ZWluCisgKi8KK3B1YmxpYyBjbGFzcyBTZXJ2bGV0QmluZGluZyBleHRlbmRzIEJpbmRpbmcgeworCisgICAgcHJpdmF0ZSBmaW5hbCBCaW5kaW5nIGJpbmRpbmc7CisKKyAgICBwcml2YXRlIGZpbmFsIFNlcnZsZXRDb250ZXh0IGNvbnRleHQ7CisKKyAgICBwcml2YXRlIGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0OworCisgICAgcHJpdmF0ZSBmaW5hbCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlOworCisgICAgcHJpdmF0ZSBNYXJrdXBCdWlsZGVyIGh0bWw7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplcyBhIHNlcnZsZXQgYmluZGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2VydmxldEJpbmRpbmcoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsIFNlcnZsZXRDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgdGhpcy5iaW5kaW5nID0gbmV3IEJpbmRpbmcoKTsKKyAgICAgICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDsKKyAgICAgICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlOworICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OworCisgICAgICAgIC8qCisgICAgICAgICAqIEJpbmQgdGhlIGRlZmF1bHQgdmFyaWFibGVzLgorICAgICAgICAgKi8KKyAgICAgICAgYmluZGluZy5zZXRWYXJpYWJsZSgicmVxdWVzdCIsIHJlcXVlc3QpOworICAgICAgICBiaW5kaW5nLnNldFZhcmlhYmxlKCJyZXNwb25zZSIsIHJlc3BvbnNlKTsKKyAgICAgICAgYmluZGluZy5zZXRWYXJpYWJsZSgiY29udGV4dCIsIGNvbnRleHQpOworICAgICAgICBiaW5kaW5nLnNldFZhcmlhYmxlKCJhcHBsaWNhdGlvbiIsIGNvbnRleHQpOworCisgICAgICAgIC8qCisgICAgICAgICAqIEJpbmQgdGhlIEhUVFAgc2Vzc2lvbiBvYmplY3QgLSBpZiB0aGVyZSBpcyBvbmUuCisgICAgICAgICAqIE5vdGU6IHdlIGRvbid0IGNyZWF0ZSBvbmUgaGVyZSEKKyAgICAgICAgICovCisgICAgICAgIGJpbmRpbmcuc2V0VmFyaWFibGUoInNlc3Npb24iLCByZXF1ZXN0LmdldFNlc3Npb24oZmFsc2UpKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBCaW5kIGZvcm0gcGFyYW1ldGVyIGtleS12YWx1ZSBoYXNoIG1hcC4KKyAgICAgICAgICoKKyAgICAgICAgICogSWYgdGhlcmUgYXJlIG11bHRpcGxlLCB0aGV5IGFyZSBwYXNzZWQgYXMgYW4gYXJyYXkuCisgICAgICAgICAqLworICAgICAgICBNYXAgcGFyYW1zID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBuYW1lcyA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyTmFtZXMoKTsgbmFtZXMuaGFzTW9yZUVsZW1lbnRzKCk7KSB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIG5hbWVzLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBpZiAoIWJpbmRpbmcuZ2V0VmFyaWFibGVzKCkuY29udGFpbnNLZXkobmFtZSkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSByZXF1ZXN0LmdldFBhcmFtZXRlclZhbHVlcyhuYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5wdXQobmFtZSwgdmFsdWVzWzBdKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwYXJhbXMucHV0KG5hbWUsIHZhbHVlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJpbmRpbmcuc2V0VmFyaWFibGUoInBhcmFtcyIsIHBhcmFtcyk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQmluZCByZXF1ZXN0IGhlYWRlciBrZXktdmFsdWUgaGFzaCBtYXAuCisgICAgICAgICAqLworICAgICAgICBNYXAgaGVhZGVycyA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIGZvciAoRW51bWVyYXRpb24gbmFtZXMgPSByZXF1ZXN0LmdldEhlYWRlck5hbWVzKCk7IG5hbWVzLmhhc01vcmVFbGVtZW50cygpOykgeworICAgICAgICAgICAgU3RyaW5nIGhlYWRlck5hbWUgPSAoU3RyaW5nKSBuYW1lcy5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgU3RyaW5nIGhlYWRlclZhbHVlID0gcmVxdWVzdC5nZXRIZWFkZXIoaGVhZGVyTmFtZSk7CisgICAgICAgICAgICBoZWFkZXJzLnB1dChoZWFkZXJOYW1lLCBoZWFkZXJWYWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgYmluZGluZy5zZXRWYXJpYWJsZSgiaGVhZGVycyIsIGhlYWRlcnMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFZhcmlhYmxlKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQ2hlY2sgc2FuaXR5LgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2FuJ3QgYmluZCB2YXJpYWJsZSB0byBudWxsIGtleS4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobmFtZS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW4ndCBiaW5kIHZhcmlhYmxlIHRvIGJsYW5rIGtleSBuYW1lLiBbbGVuZ3RoPTBdIik7CisgICAgICAgIH0KKyAgICAgICAgLyoKKyAgICAgICAgICogQ2hlY2sgaW1wbGljaXRlIGtleSBuYW1lcy4gU2VlIGdldFZhcmlhYmxlKFN0cmluZykhCisgICAgICAgICAqLworICAgICAgICBpZiAoIm91dCIuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW4ndCBiaW5kIHZhcmlhYmxlIHRvIGtleSBuYW1lZCAnIiArIG5hbWUgKyAiJy4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoInNvdXQiLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2FuJ3QgYmluZCB2YXJpYWJsZSB0byBrZXkgbmFtZWQgJyIgKyBuYW1lICsgIicuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCJodG1sIi5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbid0IGJpbmQgdmFyaWFibGUgdG8ga2V5IG5hbWVkICciICsgbmFtZSArICInLiIpOworICAgICAgICB9CisgICAgICAgIC8qCisgICAgICAgICAqIFRPRE8gQ2hlY2sgZGVmYXVsdCBrZXkgbmFtZXMuIFNlZSBjb25zdHJ1Y3RvcihzKS4KKyAgICAgICAgICovCisgICAgICAgIAorICAgICAgICAvKgorICAgICAgICAgKiBBbGwgY2hlY2tzIHBhc3NlZCwgc2V0IHRoZSB2YXJpYWJsZS4KKyAgICAgICAgICovCisgICAgICAgIGJpbmRpbmcuc2V0VmFyaWFibGUobmFtZSwgdmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBNYXAgZ2V0VmFyaWFibGVzKCkgeworICAgICAgICByZXR1cm4gYmluZGluZy5nZXRWYXJpYWJsZXMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIGEgd3JpdGVyLCBhbiBvdXRwdXQgc3RyZWFtLCBhIG1hcmt1cCBidWlsZGVyIG9yIGFub3RoZXIgcmVxdWVzdGVkIG9iamVjdAorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFyaWFibGUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQ2hlY2sgc2FuaXR5LgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm8gdmFyaWFibGUgd2l0aCBudWxsIGtleSBuYW1lLiIpOworICAgICAgICB9CisgICAgICAgIGlmIChuYW1lLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5vIHZhcmlhYmxlIHdpdGggYmxhbmsga2V5IG5hbWUuIFtsZW5ndGg9MF0iKTsKKyAgICAgICAgfQorICAgICAgICAvKgorICAgICAgICAgKiBDaGVjayBpbXBsaWNpdGUga2V5IG5hbWVzLiBTZWUgc2V0VmFyaWFibGUoU3RyaW5nLCBPYmplY3QpIQorICAgICAgICAgKi8KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICgib3V0Ii5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoInNvdXQiLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgiaHRtbCIuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgaWYgKGh0bWwgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBodG1sID0gbmV3IE1hcmt1cEJ1aWxkZXIocmVzcG9uc2UuZ2V0V3JpdGVyKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gaHRtbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiRmFpbGVkIHRvIGdldCB3cml0ZXIgb3Igb3V0cHV0IHN0cmVhbSBmcm9tIHJlc3BvbnNlLiI7CisgICAgICAgICAgICBjb250ZXh0LmxvZyhtZXNzYWdlLCBlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG1lc3NhZ2UsIGUpOworICAgICAgICB9CisgICAgICAgIC8qCisgICAgICAgICAqIFN0aWxsIGhlcmU/IERlbGVnYXRlIHRvIHRoZSBiaW5kaW5nIG9iamVjdC4KKyAgICAgICAgICovCisgICAgICAgIHJldHVybiBiaW5kaW5nLmdldFZhcmlhYmxlKG5hbWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc2VydmxldC9TZXJ2bGV0Q2F0ZWdvcnkuamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc2VydmxldC9TZXJ2bGV0Q2F0ZWdvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjRhNTA1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zZXJ2bGV0L1NlcnZsZXRDYXRlZ29yeS5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBncm9vdnkuc2VydmxldDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuUGFnZUNvbnRleHQ7CisKKy8qKgorICogU2VydmxldCBzdXBwb3J0LgorICovCitwdWJsaWMgY2xhc3MgU2VydmxldENhdGVnb3J5IHsKKwkKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXQoU2VydmxldENvbnRleHQgY29udGV4dCwgU3RyaW5nIGtleSkgeworICAgICAgICByZXR1cm4gY29udGV4dC5nZXRBdHRyaWJ1dGUoa2V5KTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0KEh0dHBTZXNzaW9uIHNlc3Npb24sIFN0cmluZyBrZXkpIHsKKyAgICAgICAgcmV0dXJuIHNlc3Npb24uZ2V0QXR0cmlidXRlKGtleSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldChTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTdHJpbmcga2V5KSB7CisgICAgICAgIHJldHVybiByZXF1ZXN0LmdldEF0dHJpYnV0ZShrZXkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldChQYWdlQ29udGV4dCBjb250ZXh0LCBTdHJpbmcga2V5KSB7CisgICAgICAgIHJldHVybiBjb250ZXh0LmdldEF0dHJpYnV0ZShrZXkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEF0KFNlcnZsZXRDb250ZXh0IGNvbnRleHQsIFN0cmluZyBrZXkpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0QXR0cmlidXRlKGtleSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0QXQoSHR0cFNlc3Npb24gc2Vzc2lvbiwgU3RyaW5nIGtleSkgeworICAgICAgICByZXR1cm4gc2Vzc2lvbi5nZXRBdHRyaWJ1dGUoa2V5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRBdChTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTdHJpbmcga2V5KSB7CisgICAgICAgIHJldHVybiByZXF1ZXN0LmdldEF0dHJpYnV0ZShrZXkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEF0KFBhZ2VDb250ZXh0IGNvbnRleHQsIFN0cmluZyBrZXkpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0QXR0cmlidXRlKGtleSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldChTZXJ2bGV0Q29udGV4dCBjb250ZXh0LCBTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgY29udGV4dC5zZXRBdHRyaWJ1dGUoa2V5LCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldChIdHRwU2Vzc2lvbiBzZXNzaW9uLCBTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgc2Vzc2lvbi5zZXRBdHRyaWJ1dGUoa2V5LCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldChTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoa2V5LCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldChQYWdlQ29udGV4dCBjb250ZXh0LCBTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgY29udGV4dC5zZXRBdHRyaWJ1dGUoa2V5LCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHB1dEF0KFNlcnZsZXRDb250ZXh0IGNvbnRleHQsIFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBjb250ZXh0LnNldEF0dHJpYnV0ZShrZXksIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHV0QXQoSHR0cFNlc3Npb24gc2Vzc2lvbiwgU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIHNlc3Npb24uc2V0QXR0cmlidXRlKGtleSwgdmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwdXRBdChTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoa2V5LCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHB1dEF0KFBhZ2VDb250ZXh0IGNvbnRleHQsIFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBjb250ZXh0LnNldEF0dHJpYnV0ZShrZXksIHZhbHVlKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc2VydmxldC9UZW1wbGF0ZVNlcnZsZXQuamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc2VydmxldC9UZW1wbGF0ZVNlcnZsZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTk4ZGRiCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zZXJ2bGV0L1RlbXBsYXRlU2VydmxldC5qYXZhCkBAIC0wLDAgKzEsNDg4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgZ3Jvb3Z5LnNlcnZsZXQ7CisKK2ltcG9ydCBncm9vdnkudGV4dC5TaW1wbGVUZW1wbGF0ZUVuZ2luZTsKK2ltcG9ydCBncm9vdnkudGV4dC5UZW1wbGF0ZTsKK2ltcG9ydCBncm9vdnkudGV4dC5UZW1wbGF0ZUVuZ2luZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5XZWFrSGFzaE1hcDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbmZpZzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworLyoqCisgKiBBIGdlbmVyaWMgc2VydmxldCBmb3Igc2VydmluZyAobW9zdGx5IEhUTUwpIHRlbXBsYXRlcy4KKyAqIAorICogPHA+CisgKiBJdCBkZWxlZ2F0ZXMgd29yayB0byBhIDxjb2RlPmdyb292eS50ZXh0LlRlbXBsYXRlRW5naW5lPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiAKKyAqIHByb2Nlc3NpbmcgSFRUUCByZXF1ZXN0cy4KKyAqCisgKiA8aDQ+VXNhZ2U8L2g0PgorICogCisgKiA8Y29kZT5oZWxsb3dvcmxkLmh0bWw8L2NvZGU+IGlzIGEgaGVhZGxlc3MgSFRNTC1saWtlIHRlbXBsYXRlCisgKiA8cHJlPjxjb2RlPgorICogICZsdDtodG1sJmd0OworICogICAgJmx0O2JvZHkmZ3Q7CisgKiAgICAgICZsdDslIDMudGltZXMgeyAlJmd0OworICogICAgICAgIEhlbGxvIFdvcmxkIQorICogICAgICAmbHQ7JSB9ICUmZ3Q7CisgKiAgICAgICZsdDticiZndDsKKyAqICAgICZsdDsvYm9keSZndDsKKyAqICAmbHQ7L2h0bWwmZ3Q7IAorICogPC9jb2RlPjwvcHJlPgorICogCisgKiBNaW5pbWFsIDxjb2RlPndlYi54bWw8L2NvZGU+IGV4YW1wbGUgc2VydmluZyBIVE1MLWxpa2UgdGVtcGxhdGVzCisgKiA8cHJlPjxjb2RlPgorICogJmx0O3dlYi1hcHAmZ3Q7CisgKiAgICZsdDtzZXJ2bGV0Jmd0OworICogICAgICZsdDtzZXJ2bGV0LW5hbWUmZ3Q7dGVtcGxhdGUmbHQ7L3NlcnZsZXQtbmFtZSZndDsKKyAqICAgICAmbHQ7c2VydmxldC1jbGFzcyZndDtncm9vdnkuc2VydmxldC5UZW1wbGF0ZVNlcnZsZXQmbHQ7L3NlcnZsZXQtY2xhc3MmZ3Q7CisgKiAgICZsdDsvc2VydmxldCZndDsKKyAqICAgJmx0O3NlcnZsZXQtbWFwcGluZyZndDsKKyAqICAgICAmbHQ7c2VydmxldC1uYW1lJmd0O3RlbXBsYXRlJmx0Oy9zZXJ2bGV0LW5hbWUmZ3Q7CisgKiAgICAgJmx0O3VybC1wYXR0ZXJuJmd0OyouaHRtbCZsdDsvdXJsLXBhdHRlcm4mZ3Q7CisgKiAgICZsdDsvc2VydmxldC1tYXBwaW5nJmd0OworICogJmx0Oy93ZWItYXBwJmd0OworICogPC9jb2RlPjwvcHJlPgorICogCisgKiA8aDQ+VGVtcGxhdGUgZW5naW5lIGNvbmZpZ3VyYXRpb248L2g0PgorICogCisgKiA8cD4KKyAqIEJ5IGRlZmF1bHQsIHRoZSBUZW1wbGF0ZVNlcnZlciB1c2VzIHRoZSB7QGxpbmsgZ3Jvb3Z5LnRleHQuU2ltcGxlVGVtcGxhdGVFbmdpbmV9CisgKiB3aGljaCBpbnRlcnByZXRzIEpTUC1saWtlIHRlbXBsYXRlcy4gVGhlIGluaXQgcGFyYW1ldGVyIDxjb2RlPnRlbXBsYXRlLmVuZ2luZTwvY29kZT4KKyAqIGRlZmluZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSB0ZW1wbGF0ZSB0byB1c2U6CisgKiA8cHJlPgorICogICB0ZW1wbGF0ZS5lbmdpbmUgPSBbZW1wdHldIC0gZXF1YWxzIGdyb292eS50ZXh0LlNpbXBsZVRlbXBsYXRlRW5naW5lCisgKiAgIHRlbXBsYXRlLmVuZ2luZSA9IGdyb292eS50ZXh0LlNpbXBsZVRlbXBsYXRlRW5naW5lCisgKiAgIHRlbXBsYXRlLmVuZ2luZSA9IGdyb292eS50ZXh0LkdTdHJpbmdUZW1wbGF0ZUVuZ2luZQorICogICB0ZW1wbGF0ZS5lbmdpbmUgPSBncm9vdnkudGV4dC5YbWxUZW1wbGF0ZUVuZ2luZQorICogPC9wcmU+CisgKiAKKyAqIDxoND5Mb2dnaW5nIGFuZCBleHRyYS1vdXRwdXQgb3B0aW9uczwvaDQ+CisgKgorICogPHA+CisgKiBUaGlzIGltcGxlbWVudGF0aW9uIHByb3ZpZGVzIGEgdmVyYm9zaXR5IGZsYWcgc3dpdGNoaW5nIGxvZyBzdGF0ZW1lbnRzLgorICogVGhlIHNlcnZsZXQgaW5pdCBwYXJhbWV0ZXIgbmFtZSBpczoKKyAqIDxwcmU+CisgKiAgIGdlbmVyYXRlLmJ5ID0gdHJ1ZShkZWZhdWx0KSB8IGZhbHNlCisgKiA8L3ByZT4KKyAqIAorICogQHNlZSBUZW1wbGF0ZVNlcnZsZXQjc2V0VmFyaWFibGVzKFNlcnZsZXRCaW5kaW5nKQorICogCisgKiBAYXV0aG9yIENocmlzdGlhbiBTdGVpbgorICogQGF1dGhvciBHdWlsbGF1bWUgTGFmb3JnZQorICogQHZlcnNpb24gMi4wCisgKi8KK3B1YmxpYyBjbGFzcyBUZW1wbGF0ZVNlcnZsZXQgZXh0ZW5kcyBBYnN0cmFjdEh0dHBTZXJ2bGV0IHsKKworICAgIC8qKgorICAgICAqIFNpbXBsZSBjYWNoZSBlbnRyeSB0aGF0IHZhbGlkYXRlcyBhZ2FpbnN0IGxhc3QgbW9kaWZpZWQgYW5kIGxlbmd0aAorICAgICAqIGF0dHJpYnV0ZXMgb2YgdGhlIHNwZWNpZmllZCBmaWxlLiAKKyAgICAgKgorICAgICAqIEBhdXRob3IgQ2hyaXN0aWFuIFN0ZWluCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGVtcGxhdGVDYWNoZUVudHJ5IHsKKworICAgICAgICBEYXRlIGRhdGU7CisgICAgICAgIGxvbmcgaGl0OworICAgICAgICBsb25nIGxhc3RNb2RpZmllZDsKKyAgICAgICAgbG9uZyBsZW5ndGg7CisgICAgICAgIFRlbXBsYXRlIHRlbXBsYXRlOworCisgICAgICAgIHB1YmxpYyBUZW1wbGF0ZUNhY2hlRW50cnkoRmlsZSBmaWxlLCBUZW1wbGF0ZSB0ZW1wbGF0ZSkgeworICAgICAgICAgICAgdGhpcyhmaWxlLCB0ZW1wbGF0ZSwgZmFsc2UpOyAvLyBkb24ndCBnZXQgdGltZSBtaWxsaXMgZm9yIHNha2Ugb2Ygc3BlZWQKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUZW1wbGF0ZUNhY2hlRW50cnkoRmlsZSBmaWxlLCBUZW1wbGF0ZSB0ZW1wbGF0ZSwgYm9vbGVhbiB0aW1lc3RhbXApIHsKKyAgICAgICAgICAgIGlmIChmaWxlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImZpbGUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0ZW1wbGF0ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJ0ZW1wbGF0ZSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRpbWVzdGFtcCkgeworICAgICAgICAgICAgICAgIHRoaXMuZGF0ZSA9IG5ldyBEYXRlKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhpcy5kYXRlID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoaXMuaGl0ID0gMDsKKyAgICAgICAgICAgIHRoaXMubGFzdE1vZGlmaWVkID0gZmlsZS5sYXN0TW9kaWZpZWQoKTsKKyAgICAgICAgICAgIHRoaXMubGVuZ3RoID0gZmlsZS5sZW5ndGgoKTsKKyAgICAgICAgICAgIHRoaXMudGVtcGxhdGUgPSB0ZW1wbGF0ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDaGVja3MgdGhlIHBhc3NlZCBmaWxlIGF0dHJpYnV0ZXMgYWdhaW5zdCB0aG9zZSBjYWNoZWQgb25lcy4gCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBmaWxlCisgICAgICAgICAqICBPdGhlciBmaWxlIGhhbmRsZSB0byBjb21wYXJlIHRvIHRoZSBjYWNoZWQgdmFsdWVzLgorICAgICAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFsbCBtZWFzdXJlZCB2YWx1ZXMgbWF0Y2gsIGVsc2UgPGNvZGU+ZmFsc2U8L2NvZGU+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZShGaWxlIGZpbGUpIHsKKyAgICAgICAgICAgIGlmIChmaWxlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImZpbGUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmaWxlLmxhc3RNb2RpZmllZCgpICE9IHRoaXMubGFzdE1vZGlmaWVkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZpbGUubGVuZ3RoKCkgIT0gdGhpcy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBoaXQrKzsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIGlmIChkYXRlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIkhpdCAjIiArIGhpdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAiSGl0ICMiICsgaGl0ICsgIiBzaW5jZSAiICsgZGF0ZTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogU2ltcGxlIGZpbGUgbmFtZSB0byB0ZW1wbGF0ZSBjYWNoZSBtYXAuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBNYXAgY2FjaGU7CisKKyAgICAvKioKKyAgICAgKiBVbmRlcmx5aW5nIHRlbXBsYXRlIGVuZ2luZSB1c2VkIHRvIGV2YWx1YXRlIHRlbXBsYXRlIHNvdXJjZSBmaWxlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFRlbXBsYXRlRW5naW5lIGVuZ2luZTsKKworICAgIC8qKgorICAgICAqIEZsYWcgdGhhdCBjb250cm9scyB0aGUgYXBwZW5kaW5nIG9mIHRoZSAiR2VuZXJhdGVkIGJ5IC4uLiIgY29tbWVudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZ2VuZXJhdGVCeTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcgVGVtcGxhdGVTZXJsdmV0LgorICAgICAqLworICAgIHB1YmxpYyBUZW1wbGF0ZVNlcnZsZXQoKSB7CisgICAgICAgIHRoaXMuY2FjaGUgPSBuZXcgV2Vha0hhc2hNYXAoKTsKKyAgICAgICAgdGhpcy5lbmdpbmUgPSBudWxsOyAvLyBhc3NpZ25lZCBsYXRlciBieSBpbml0KCkKKyAgICAgICAgdGhpcy5nZW5lcmF0ZUJ5ID0gdHJ1ZTsgLy8gbWF5IGJlIGNoYW5nZWQgYnkgaW5pdCgpCisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdGVtcGxhdGUgY3JlYXRlZCBieSB0aGUgdW5kZXJseWluZyBlbmdpbmUgcGFyc2luZyB0aGUgcmVxdWVzdC4KKyAgICAgKiAKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCBsb29rcyB1cCBhIHNpbXBsZSAod2VhaykgaGFzaCBtYXAgZm9yIGFuIGV4aXN0aW5nIHRlbXBsYXRlCisgICAgICogb2JqZWN0IHRoYXQgbWF0Y2hlcyB0aGUgc291cmNlIGZpbGUuIElmIHRoZSBzb3VyY2UgZmlsZSBkaWRuJ3QgY2hhbmdlIGluCisgICAgICogbGVuZ3RoIGFuZCBpdHMgbGFzdCBtb2RpZmllZCBzdGFtcCBoYXNuJ3QgY2hhbmdlZCBjb21wYXJlZCB0byBhIHByZWNvbXBpbGVkCisgICAgICogdGVtcGxhdGUgb2JqZWN0LCB0aGlzIHRlbXBsYXRlIGlzIHVzZWQuIE90aGVyd2lzZSwgdGhlcmUgaXMgbm8gb3IgYW4KKyAgICAgKiBpbnZhbGlkIHRlbXBsYXRlIG9iamVjdCBjYWNoZSBlbnRyeSwgYSBuZXcgb25lIGlzIGNyZWF0ZWQgYnkgdGhlIHVuZGVybHlpbmcKKyAgICAgKiB0ZW1wbGF0ZSBlbmdpbmUuIFRoaXMgbmV3IGluc3RhbmNlIGlzIHB1dCB0byB0aGUgY2FjaGUgZm9yIGNvbnNlY3V0aXZlCisgICAgICogY2FsbHMuCisgICAgICogPC9wPgorICAgICAqIAorICAgICAqIEByZXR1cm4gVGhlIHRlbXBsYXRlIHRoYXQgd2lsbCBwcm9kdWNlIHRoZSByZXNwb25zZSB0ZXh0LgorICAgICAqIEBwYXJhbSBmaWxlCisgICAgICogICAgICAgICAgICBUaGUgSHR0cFNlcnZsZXRSZXF1ZXN0LgorICAgICAqIEB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgSWYgdGhlIHJlcXVlc3Qgc3BlY2lmaWVkIGFuIGludmFsaWQgdGVtcGxhdGUgc291cmNlIGZpbGUgCisgICAgICovCisgICAgcHJvdGVjdGVkIFRlbXBsYXRlIGdldFRlbXBsYXRlKEZpbGUgZmlsZSkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworCisgICAgICAgIFN0cmluZyBrZXkgPSBmaWxlLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICBUZW1wbGF0ZSB0ZW1wbGF0ZSA9IG51bGw7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVGVzdCBjYWNoZSBmb3IgYSB2YWxpZCB0ZW1wbGF0ZSBib3VuZCB0byB0aGUga2V5LgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgICAgIGxvZygiTG9va2luZyBmb3IgY2FjaGVkIHRlbXBsYXRlIGJ5IGtleSBcIiIgKyBrZXkgKyAiXCIiKTsKKyAgICAgICAgfQorICAgICAgICBUZW1wbGF0ZUNhY2hlRW50cnkgZW50cnkgPSAoVGVtcGxhdGVDYWNoZUVudHJ5KSBjYWNoZS5nZXQoa2V5KTsKKyAgICAgICAgaWYgKGVudHJ5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChlbnRyeS52YWxpZGF0ZShmaWxlKSkgeworICAgICAgICAgICAgICAgIGlmICh2ZXJib3NlKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZygiQ2FjaGUgaGl0ISAiICsgZW50cnkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IGVudHJ5LnRlbXBsYXRlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSkgeworICAgICAgICAgICAgICAgICAgICBsb2coIkNhY2hlZCB0ZW1wbGF0ZSBuZWVkcyByZWNvbXBpbGlhdGlvbiEiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAodmVyYm9zZSkgeworICAgICAgICAgICAgICAgIGxvZygiQ2FjaGUgbWlzcy4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIFRlbXBsYXRlIG5vdCBjYWNoZWQgb3IgdGhlIHNvdXJjZSBmaWxlIGNoYW5nZWQgLSBjb21waWxlIG5ldyB0ZW1wbGF0ZSEKKyAgICAgICAgLy8KKyAgICAgICAgaWYgKHRlbXBsYXRlID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmICh2ZXJib3NlKSB7CisgICAgICAgICAgICAgICAgbG9nKCJDcmVhdGluZyBuZXcgdGVtcGxhdGUgZnJvbSBmaWxlICIgKyBmaWxlICsgIi4uLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRmlsZVJlYWRlciByZWFkZXIgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcihmaWxlKTsKKyAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IGVuZ2luZS5jcmVhdGVUZW1wbGF0ZShyZWFkZXIpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbigiQ3JlYXRpb24gb2YgdGVtcGxhdGUgZmFpbGVkOiAiICsgZSwgZSk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlmIChyZWFkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhY2hlLnB1dChrZXksIG5ldyBUZW1wbGF0ZUNhY2hlRW50cnkoZmlsZSwgdGVtcGxhdGUsIHZlcmJvc2UpKTsKKyAgICAgICAgICAgIGlmICh2ZXJib3NlKSB7CisgICAgICAgICAgICAgICAgbG9nKCJDcmVhdGVkIGFuZCBhZGRlZCB0ZW1wbGF0ZSB0byBjYWNoZS4gW2tleT0iICsga2V5ICsgIl0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIExhc3Qgc2FuaXR5IGNoZWNrLgorICAgICAgICAvLworICAgICAgICBpZiAodGVtcGxhdGUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oIlRlbXBsYXRlIGlzIG51bGw/IFNob3VsZCBub3QgaGFwcGVuIGhlcmUhIik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdGVtcGxhdGU7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplcyB0aGUgc2VydmxldCBmcm9tIGhpbnRzIHRoZSBjb250YWluZXIgcGFzc2VzLgorICAgICAqIDxwPgorICAgICAqIERlbGVnYXRlcyB0byBzdWItaW5pdCBtZXRob2RzIGFuZCBwYXJzZXMgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+IDx0dD4iZ2VuZXJhdGVkQnkiPC90dD4gOiBib29sZWFuLCBhcHBlbmRzICJHZW5lcmF0ZWQgYnkgLi4uIiB0byB0aGUKKyAgICAgKiAgICAgSFRNTCByZXNwb25zZSB0ZXh0IGdlbmVyYXRlZCBieSB0aGlzIHNlcnZsZXQuCisgICAgICogICAgIDwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiBAcGFyYW0gY29uZmlnCisgICAgICogIFBhc3NlZCBieSB0aGUgc2VydmxldCBjb250YWluZXIuCisgICAgICogQHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uCisgICAgICogIGlmIHRoaXMgbWV0aG9kIGVuY291bnRlcmVkIGRpZmZpY3VsdGllcyAKKyAgICAgKiAgCisgICAgICogQHNlZSBUZW1wbGF0ZVNlcnZsZXQjaW5pdFRlbXBsYXRlRW5naW5lKFNlcnZsZXRDb25maWcpCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5pdChTZXJ2bGV0Q29uZmlnIGNvbmZpZykgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICBzdXBlci5pbml0KGNvbmZpZyk7CisgICAgICAgIHRoaXMuZW5naW5lID0gaW5pdFRlbXBsYXRlRW5naW5lKGNvbmZpZyk7CisgICAgICAgIGlmIChlbmdpbmUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oIlRlbXBsYXRlIGVuZ2luZSBub3QgaW5zdGFudGlhdGVkLiIpOworICAgICAgICB9CisgICAgICAgIFN0cmluZyB2YWx1ZSA9IGNvbmZpZy5nZXRJbml0UGFyYW1ldGVyKCJnZW5lcmF0ZWQuYnkiKTsKKyAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVCeSA9IEJvb2xlYW4udmFsdWVPZih2YWx1ZSkuYm9vbGVhblZhbHVlKCk7CisgICAgICAgIH0KKyAgICAgICAgbG9nKCJTZXJ2bGV0ICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaW5pdGlhbGl6ZWQgb24gIiArIGVuZ2luZS5nZXRDbGFzcygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIHRoZSB0ZW1wbGF0ZSBlbmdpbmUuCisgICAgICogCisgICAgICogQ2FsbGVkIGJ5IHtAbGluayBUZW1wbGF0ZVNlcnZsZXQjaW5pdChTZXJ2bGV0Q29uZmlnKX0gYW5kIHJldHVybnMganVzdCAKKyAgICAgKiA8Y29kZT5uZXcgZ3Jvb3Z5LnRleHQuU2ltcGxlVGVtcGxhdGVFbmdpbmUoKTwvY29kZT4gaWYgdGhlIGluaXQgcGFyYW1ldGVyCisgICAgICogPGNvZGU+dGVtcGxhdGUuZW5naW5lPC9jb2RlPiBpcyBub3Qgc2V0IGJ5IHRoZSBjb250YWluZXIgY29uZmlndXJhdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29uZmlnIAorICAgICAqICBDdXJyZW50IHNlcmx2ZXQgY29uZmlndXJhdGlvbiBwYXNzZWQgYnkgdGhlIGNvbnRhaW5lci4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRoZSB1bmRlcmx5aW5nIHRlbXBsYXRlIGVuZ2luZSBvciA8Y29kZT5udWxsPC9jb2RlPiBvbiBlcnJvci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgVGVtcGxhdGVFbmdpbmUgaW5pdFRlbXBsYXRlRW5naW5lKFNlcnZsZXRDb25maWcgY29uZmlnKSB7CisgICAgICAgIFN0cmluZyBuYW1lID0gY29uZmlnLmdldEluaXRQYXJhbWV0ZXIoInRlbXBsYXRlLmVuZ2luZSIpOworICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFNpbXBsZVRlbXBsYXRlRW5naW5lKCk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiAoVGVtcGxhdGVFbmdpbmUpIENsYXNzLmZvck5hbWUobmFtZSkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2coIkNvdWxkIG5vdCBpbnN0YW50aWF0ZSB0ZW1wbGF0ZSBlbmdpbmU6ICIgKyBuYW1lLCBlKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2coIkNvdWxkIG5vdCBhY2Nlc3MgdGVtcGxhdGUgZW5naW5lIGNsYXNzOiAiICsgbmFtZSwgZSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nKCJDb3VsZCBub3QgZmluZCB0ZW1wbGF0ZSBlbmdpbmUgY2xhc3M6ICIgKyBuYW1lLCBlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXJ2aWNlcyB0aGUgcmVxdWVzdCB3aXRoIGEgcmVzcG9uc2UuCisgICAgICogPHA+CisgICAgICogRmlyc3QgdGhlIHJlcXVlc3QgaXMgcGFyc2VkIGZvciB0aGUgc291cmNlIGZpbGUgdXJpLiBJZiB0aGUgc3BlY2lmaWVkIGZpbGUKKyAgICAgKiBjb3VsZCBub3QgYmUgZm91bmQgb3IgY2FuIG5vdCBiZSByZWFkIGFuIGVycm9yIG1lc3NhZ2UgaXMgc2VudCBhcyByZXNwb25zZS4KKyAgICAgKiAKKyAgICAgKiA8L3A+CisgICAgICogQHBhcmFtIHJlcXVlc3QKKyAgICAgKiAgICAgICAgICAgIFRoZSBodHRwIHJlcXVlc3QuCisgICAgICogQHBhcmFtIHJlc3BvbnNlCisgICAgICogICAgICAgICAgICBUaGUgaHR0cCByZXNwb25zZS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIAorICAgICAqICAgICAgICAgICAgaWYgYW4gaW5wdXQgb3Igb3V0cHV0IGVycm9yIG9jY3VycyB3aGlsZSB0aGUgc2VydmxldCBpcworICAgICAqICAgICAgICAgICAgaGFuZGxpbmcgdGhlIEhUVFAgcmVxdWVzdAorICAgICAqIEB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgaWYgdGhlIEhUVFAgcmVxdWVzdCBjYW5ub3QgYmUgaGFuZGxlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlcnZpY2UoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgICAgIGxvZygiQ3JlYXRpbmcvZ2V0dGluZyBjYWNoZWQgdGVtcGxhdGUuLi4iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIEdldCB0aGUgdGVtcGxhdGUgc291cmNlIGZpbGUgaGFuZGxlLgorICAgICAgICAvLworICAgICAgICBGaWxlIGZpbGUgPSBzdXBlci5nZXRTY3JpcHRVcmlBc0ZpbGUocmVxdWVzdCk7CisgICAgICAgIFN0cmluZyBuYW1lID0gZmlsZS5nZXROYW1lKCk7CisgICAgICAgIGlmICghZmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfTk9UX0ZPVU5EKTsKKyAgICAgICAgICAgIHJldHVybjsgLy8gdGhyb3cgbmV3IElPRXhjZXB0aW9uKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICB9CisgICAgICAgIGlmICghZmlsZS5jYW5SZWFkKCkpIHsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX0ZPUkJJRERFTiwgIkNhbiBub3QgcmVhZCBcIiIgKyBuYW1lICsgIlwiISIpOworICAgICAgICAgICAgcmV0dXJuOyAvLyB0aHJvdyBuZXcgSU9FeGNlcHRpb24oZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBHZXQgdGhlIHJlcXVlc3RlZCB0ZW1wbGF0ZS4KKyAgICAgICAgLy8KKyAgICAgICAgbG9uZyBnZXRNaWxsaXMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgVGVtcGxhdGUgdGVtcGxhdGUgPSBnZXRUZW1wbGF0ZShmaWxlKTsKKyAgICAgICAgZ2V0TWlsbGlzID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBnZXRNaWxsaXM7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQ3JlYXRlIG5ldyBiaW5kaW5nIGZvciB0aGUgY3VycmVudCByZXF1ZXN0LgorICAgICAgICAvLworICAgICAgICBTZXJ2bGV0QmluZGluZyBiaW5kaW5nID0gbmV3IFNlcnZsZXRCaW5kaW5nKHJlcXVlc3QsIHJlc3BvbnNlLCBzZXJ2bGV0Q29udGV4dCk7CisgICAgICAgIHNldFZhcmlhYmxlcyhiaW5kaW5nKTsKKworICAgICAgICAvLworICAgICAgICAvLyBQcmVwYXJlIHRoZSByZXNwb25zZSBidWZmZXIgY29udGVudCB0eXBlIF9iZWZvcmVfIGdldHRpbmcgdGhlIHdyaXRlci4KKyAgICAgICAgLy8gYW5kIHNldCBzdGF0dXMgY29kZSB0byBvaworICAgICAgICAvLworICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZShDT05URU5UX1RZUEVfVEVYVF9IVE1MKTsKKyAgICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfT0spOworCisgICAgICAgIC8vCisgICAgICAgIC8vIEdldCB0aGUgb3V0cHV0IHN0cmVhbSB3cml0ZXIgZnJvbSB0aGUgYmluZGluZy4KKyAgICAgICAgLy8KKyAgICAgICAgV3JpdGVyIG91dCA9IChXcml0ZXIpIGJpbmRpbmcuZ2V0VmFyaWFibGUoIm91dCIpOworICAgICAgICBpZiAob3V0ID09IG51bGwpIHsKKyAgICAgICAgICAgIG91dCA9IHJlc3BvbnNlLmdldFdyaXRlcigpOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRXZhbHVhdGUgdGhlIHRlbXBsYXRlLgorICAgICAgICAvLworICAgICAgICBpZiAodmVyYm9zZSkgeworICAgICAgICAgICAgbG9nKCJNYWtpbmcgdGVtcGxhdGUgXCIiICsgbmFtZSArICJcIi4uLiIpOworICAgICAgICB9CisgICAgICAgIC8vIFN0cmluZyBtYWRlID0gdGVtcGxhdGUubWFrZShiaW5kaW5nLmdldFZhcmlhYmxlcygpKS50b1N0cmluZygpOworICAgICAgICAvLyBsb2coIiA9ICIgKyBtYWRlKTsKKyAgICAgICAgbG9uZyBtYWtlTWlsbGlzID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIHRlbXBsYXRlLm1ha2UoYmluZGluZy5nZXRWYXJpYWJsZXMoKSkud3JpdGVUbyhvdXQpOworICAgICAgICBtYWtlTWlsbGlzID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBtYWtlTWlsbGlzOworCisgICAgICAgIGlmIChnZW5lcmF0ZUJ5KSB7CisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKDEwMCk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIlxuPCEtLSBHZW5lcmF0ZWQgYnkgR3Jvb3Z5IFRlbXBsYXRlU2VydmxldCBbY3JlYXRlL2dldD0iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChMb25nLnRvU3RyaW5nKGdldE1pbGxpcykpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIgbXMsIG1ha2U9Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQoTG9uZy50b1N0cmluZyhtYWtlTWlsbGlzKSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiBtc10gLS0+XG4iKTsKKyAgICAgICAgICAgIG91dC53cml0ZShzYi50b1N0cmluZygpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIGZsdXNoIHRoZSByZXNwb25zZSBidWZmZXIuCisgICAgICAgIC8vCisgICAgICAgIHJlc3BvbnNlLmZsdXNoQnVmZmVyKCk7CisKKyAgICAgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgICAgIGxvZygiVGVtcGxhdGUgXCIiICsgbmFtZSArICJcIiByZXF1ZXN0IHJlc3BvbmRlZC4gW2NyZWF0ZS9nZXQ9IiArIGdldE1pbGxpcyArICIgbXMsIG1ha2U9IiArIG1ha2VNaWxsaXMgKyAiIG1zXSIpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZSB0aGlzIG1ldGhvZCB0byBzZXQgeW91ciB2YXJpYWJsZXMgdG8gdGhlIEdyb292eSBiaW5kaW5nLgorICAgICAqIDxwPgorICAgICAqIEFsbCB2YXJpYWJsZXMgYm91bmQgdGhlIGJpbmRpbmcgYXJlIHBhc3NlZCB0byB0aGUgdGVtcGxhdGUgc291cmNlIHRleHQsIAorICAgICAqIGUuZy4gdGhlIEhUTUwgZmlsZSwgd2hlbiB0aGUgdGVtcGxhdGUgaXMgbWVyZ2VkLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgYmluZGluZyBwcm92aWRlZCBieSBUZW1wbGF0ZVNlcnZsZXQgZG9lcyBhbHJlYWR5IGluY2x1ZGUgc29tZSBkZWZhdWx0CisgICAgICogdmFyaWFibGVzLiBBcyBvZiB0aGlzIHdyaXRpbmcsIHRoZXkgYXJlIChjb3BpZWQgZnJvbSAKKyAgICAgKiB7QGxpbmsgZ3Jvb3Z5LnNlcnZsZXQuU2VydmxldEJpbmRpbmd9KToKKyAgICAgKiA8dWw+CisgICAgICogPGxpPjx0dD4icmVxdWVzdCI8L3R0PiA6IEh0dHBTZXJ2bGV0UmVxdWVzdCA8L2xpPgorICAgICAqIDxsaT48dHQ+InJlc3BvbnNlIjwvdHQ+IDogSHR0cFNlcnZsZXRSZXNwb25zZSA8L2xpPgorICAgICAqIDxsaT48dHQ+ImNvbnRleHQiPC90dD4gOiBTZXJ2bGV0Q29udGV4dCA8L2xpPgorICAgICAqIDxsaT48dHQ+ImFwcGxpY2F0aW9uIjwvdHQ+IDogU2VydmxldENvbnRleHQgPC9saT4KKyAgICAgKiA8bGk+PHR0PiJzZXNzaW9uIjwvdHQ+IDogcmVxdWVzdC5nZXRTZXNzaW9uKDxiPmZhbHNlPC9iPikgPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBBbmQgdmlhIGltcGxpY2l0ZSBoYXJkLWNvZGVkIGtleXdvcmRzOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+PHR0PiJvdXQiPC90dD4gOiByZXNwb25zZS5nZXRXcml0ZXIoKSA8L2xpPgorICAgICAqIDxsaT48dHQ+InNvdXQiPC90dD4gOiByZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKSA8L2xpPgorICAgICAqIDxsaT48dHQ+Imh0bWwiPC90dD4gOiBuZXcgTWFya3VwQnVpbGRlcihyZXNwb25zZS5nZXRXcml0ZXIoKSkgPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIDxwPkV4YW1wbGUgYmluZGluZyBhbGwgc2VydmxldCBjb250ZXh0IHZhcmlhYmxlczoKKyAgICAgKiA8cHJlPjxjb2RlPgorICAgICAqIGNsYXNzIE15dGxldCBleHRlbmRzIFRlbXBsYXRlU2VydmxldCB7CisgICAgICogCisgICAgICogICBwcm90ZWN0ZWQgdm9pZCBzZXRWYXJpYWJsZXMoU2VydmxldEJpbmRpbmcgYmluZGluZykgeworICAgICAqICAgICAvLyBCaW5kIGEgc2ltcGxlIHZhcmlhYmxlCisgICAgICogICAgIGJpbmRpbmcuc2V0VmFyaWFibGUoImFuc3dlciIsIG5ldyBMb25nKDQyKSk7CisgICAgICogICAKKyAgICAgKiAgICAgLy8gQmluZCBhbGwgc2VydmxldCBjb250ZXh0IGF0dHJpYnV0ZXMuLi4KKyAgICAgKiAgICAgU2VydmxldENvbnRleHQgY29udGV4dCA9IChTZXJ2bGV0Q29udGV4dCkgYmluZGluZy5nZXRWYXJpYWJsZSgiY29udGV4dCIpOworICAgICAqICAgICBFbnVtZXJhdGlvbiBlbnVtZXJhdGlvbiA9IGNvbnRleHQuZ2V0QXR0cmlidXRlTmFtZXMoKTsKKyAgICAgKiAgICAgd2hpbGUgKGVudW1lcmF0aW9uLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICogICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpOworICAgICAqICAgICAgIGJpbmRpbmcuc2V0VmFyaWFibGUobmFtZSwgY29udGV4dC5nZXRBdHRyaWJ1dGUobmFtZSkpOworICAgICAqICAgICB9CisgICAgICogICB9CisgICAgICogCisgICAgICogfQorICAgICAqIDxjb2RlPjwvcHJlPgorICAgICAqIDwvcD4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYmluZGluZworICAgICAqICB0byBiZSBtb2RpZmllZAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldFZhcmlhYmxlcyhTZXJ2bGV0QmluZGluZyBiaW5kaW5nKSB7CisgICAgICAgIC8vIGVtcHR5CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3NlcnZsZXQvcGFja2FnZS5odG1sIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zZXJ2bGV0L3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzRiYzdjCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zZXJ2bGV0L3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDEwIEBACis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPHRpdGxlPnBhY2thZ2UgZ3Jvb3Z5LnNlcnZsZXQuKjwvdGl0bGU+CisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgPHA+CisgICAgICBTdXBwb3J0IGZvciBHcm9vdmxldHMgd2hpY2ggYXJlIFNlcnZsZXRzIHdyaXR0ZW4gYXMgYSBzaW1wbGUgR3Jvb3Z5IHNjcmlwdC4KKyAgICA8L3A+CisgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3FsL0NhbGxSZXN1bHRTZXQuamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3FsL0NhbGxSZXN1bHRTZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzhhMmZmCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zcWwvQ2FsbFJlc3VsdFNldC5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGdyb292eS5zcWw7CisKKworaW1wb3J0IGphdmEuc3FsLkNhbGxhYmxlU3RhdGVtZW50OworaW1wb3J0IGphdmEuc3FsLlJlc3VsdFNldDsKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CisKKy8qKgorICogQGF1dGhvciByZnVsbGVyCisgKgorICogUmVwcmVzZW50cyBhIFJlc3VsdFNldCByZXRyaWV2ZWQgYXMgYSBjYWxsYWJsZSBzdGF0ZW1lbnQgb3V0IHBhcmFtZXRlci4KKyAqLworY2xhc3MgQ2FsbFJlc3VsdFNldCBleHRlbmRzIEdyb292eVJlc3VsdFNldEV4dGVuc2lvbiB7CisJaW50IGluZHg7CisJQ2FsbGFibGVTdGF0ZW1lbnQgY2FsbDsKKwlSZXN1bHRTZXQgcmVzdWx0U2V0OworCWJvb2xlYW4gZmlyc3RDYWxsID0gdHJ1ZTsKKwkKKwlDYWxsUmVzdWx0U2V0KENhbGxhYmxlU3RhdGVtZW50IGNhbGwsIGludCBpbmR4KXsKKyAgICAgICAgc3VwZXIobnVsbCk7CisJCXRoaXMuY2FsbCA9IGNhbGw7CisJCXRoaXMuaW5keCA9IGluZHg7CisJfQorCQorCXByb3RlY3RlZCBSZXN1bHRTZXQgZ2V0UmVzdWx0U2V0KCkgdGhyb3dzIFNRTEV4Y2VwdGlvbnsKKwkJaWYoZmlyc3RDYWxsKXsKKwkJICAgIHJlc3VsdFNldCA9IChSZXN1bHRTZXQpIGNhbGwuZ2V0T2JqZWN0KGluZHgrMSk7CisJCQlmaXJzdENhbGwgPSBmYWxzZTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0U2V0OworCX0KKyAgICAKKyAgICBwcm90ZWN0ZWQgc3RhdGljIEdyb292eVJlc3VsdFNldCBnZXRJbXBsKENhbGxhYmxlU3RhdGVtZW50IGNhbGwsIGludCBpZHgpIHsKKyAgICAgICAgR3Jvb3Z5UmVzdWx0U2V0UHJveHkgcHJveHkgPSBuZXcgR3Jvb3Z5UmVzdWx0U2V0UHJveHkobmV3IENhbGxSZXN1bHRTZXQoY2FsbCxpZHgpKTsKKyAgICAgICAgcmV0dXJuIHByb3h5LmdldEltcGwoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3NxbC9EYXRhU2V0LmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3NxbC9EYXRhU2V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NiNjM3MgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3FsL0RhdGFTZXQuamF2YQpAQCAtMCwwICsxLDIwNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGdyb292eS5zcWw7CisKK2ltcG9ydCBncm9vdnkubGFuZy5DbG9zdXJlOworaW1wb3J0IGdyb292eS5sYW5nLkdyb292eVJ1bnRpbWVFeGNlcHRpb247CisKK2ltcG9ydCBqYXZhLnNxbC5Db25uZWN0aW9uOworaW1wb3J0IGphdmEuc3FsLlByZXBhcmVkU3RhdGVtZW50OworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuQ2xhc3NOb2RlOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0Lk1ldGhvZE5vZGU7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3Quc3RtdC5TdGF0ZW1lbnQ7CisKKy8qKgorICogUmVwcmVzZW50cyBhbiBleHRlbnQgb2Ygb2JqZWN0cworICogCisgKiBAYXV0aG9yIENocmlzIFN0ZXZlbnNvbgorICogQGF1dGhvciBQYXVsIEtpbmcKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBEYXRhU2V0IGV4dGVuZHMgU3FsIHsKKworICAgIHByaXZhdGUgQ2xvc3VyZSB3aGVyZTsKKyAgICBwcml2YXRlIERhdGFTZXQgcGFyZW50OworICAgIHByaXZhdGUgU3RyaW5nIHRhYmxlOworICAgIHByaXZhdGUgU3FsV2hlcmVWaXNpdG9yIHZpc2l0b3I7CisgICAgcHJpdmF0ZSBTdHJpbmcgc3FsOworICAgIHByaXZhdGUgTGlzdCBwYXJhbXM7CisKKyAgICBwdWJsaWMgRGF0YVNldChTcWwgc3FsLCBDbGFzcyB0eXBlKSB7CisgICAgICAgIHN1cGVyKHNxbCk7CisgICAgICAgIFN0cmluZyB0YWJsZSA9IHR5cGUuZ2V0TmFtZSgpOworICAgICAgICBpbnQgaWR4ID0gdGFibGUubGFzdEluZGV4T2YoJy4nKTsKKyAgICAgICAgaWYgKGlkeCA+IDApIHsKKyAgICAgICAgICAgIHRhYmxlID0gdGFibGUuc3Vic3RyaW5nKGlkeCArIDEpOworICAgICAgICB9CisgICAgICAgIHRoaXMudGFibGUgPSB0YWJsZS50b0xvd2VyQ2FzZSgpOworICAgIH0KKworICAgIHB1YmxpYyBEYXRhU2V0KFNxbCBzcWwsIFN0cmluZyB0YWJsZSkgeworICAgICAgICBzdXBlcihzcWwpOworICAgICAgICB0aGlzLnRhYmxlID0gdGFibGU7CisgICAgfQorCisgICAgcHVibGljIERhdGFTZXQoRGF0YVNldCBwYXJlbnQsIENsb3N1cmUgd2hlcmUpIHsKKyAgICAgICAgc3VwZXIocGFyZW50KTsKKyAgICAgICAgdGhpcy50YWJsZSA9IHBhcmVudC50YWJsZTsKKyAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CisgICAgICAgIHRoaXMud2hlcmUgPSB3aGVyZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGQoTWFwIHZhbHVlcykgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCJpbnNlcnQgaW50byAiKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZCh0YWJsZSk7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiAoIik7CisgICAgICAgIFN0cmluZ0J1ZmZlciBwYXJhbUJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHZhbHVlcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7CisgICAgICAgICAgICBTdHJpbmcgY29sdW1uID0gZW50cnkuZ2V0S2V5KCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcGFyYW1CdWZmZXIuYXBwZW5kKCI/Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgICAgIHBhcmFtQnVmZmVyLmFwcGVuZCgiLCA/Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGNvbHVtbik7CisgICAgICAgIH0KKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiKSB2YWx1ZXMgKCIpOworICAgICAgICBidWZmZXIuYXBwZW5kKHBhcmFtQnVmZmVyLnRvU3RyaW5nKCkpOworICAgICAgICBidWZmZXIuYXBwZW5kKCIpIik7CisKKyAgICAgICAgQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gY3JlYXRlQ29ubmVjdGlvbigpOworICAgICAgICBQcmVwYXJlZFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3RhdGVtZW50ID0gY29ubmVjdGlvbi5wcmVwYXJlU3RhdGVtZW50KGJ1ZmZlci50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGludCBpID0gMTsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHZhbHVlcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIHNldE9iamVjdChzdGF0ZW1lbnQsIGkrKywgZW50cnkuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgYW5zd2VyID0gc3RhdGVtZW50LmV4ZWN1dGVVcGRhdGUoKTsKKyAgICAgICAgICAgIGlmIChhbnN3ZXIgIT0gMSkgeworICAgICAgICAgICAgICAgIGxvZy5sb2coTGV2ZWwuV0FSTklORywgIlNob3VsZCBoYXZlIHVwZGF0ZWQgMSByb3cgbm90ICIgKyBhbnN3ZXIgKyAiIHdoZW4gdHJ5aW5nIHRvIGFkZDogIiArIHZhbHVlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2cubG9nKExldmVsLldBUk5JTkcsICJGYWlsZWQgdG8gYWRkIHJvdyBmb3I6ICIgKyB2YWx1ZXMsIGUpOworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgIGNsb3NlUmVzb3VyY2VzKGNvbm5lY3Rpb24sIHN0YXRlbWVudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgRGF0YVNldCBmaW5kQWxsKENsb3N1cmUgd2hlcmUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEYXRhU2V0KHRoaXMsIHdoZXJlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBlYWNoKENsb3N1cmUgY2xvc3VyZSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGVhY2hSb3coZ2V0U3FsKCksIGdldFBhcmFtZXRlcnMoKSwgY2xvc3VyZSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRTcWwoKSB7CisgICAgICAgIGlmIChzcWwgPT0gbnVsbCkgeworICAgICAgICAgICAgc3FsID0gInNlbGVjdCAqIGZyb20gIiArIHRhYmxlOworICAgICAgICAgICAgaWYgKHdoZXJlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgY2xhdXNlID0gIiI7CisgICAgICAgICAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsICYmIHBhcmVudC53aGVyZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNsYXVzZSArPSBwYXJlbnQuZ2V0U3FsVmlzaXRvcigpLmdldFdoZXJlKCkgKyAiIGFuZCAiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjbGF1c2UgKz0gZ2V0U3FsVmlzaXRvcigpLmdldFdoZXJlKCk7CisgICAgICAgICAgICAgICAgaWYgKGNsYXVzZS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc3FsICs9ICIgd2hlcmUgIiArIGNsYXVzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNxbDsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdCBnZXRQYXJhbWV0ZXJzKCkgeworICAgICAgICBpZiAocGFyYW1zID09IG51bGwpIHsKKyAgICAgICAgICAgIHBhcmFtcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQud2hlcmUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHBhcmFtcy5hZGRBbGwocGFyZW50LmdldFBhcmFtZXRlcnMoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYXJhbXMuYWRkQWxsKGdldFNxbFZpc2l0b3IoKS5nZXRQYXJhbWV0ZXJzKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwYXJhbXM7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFNxbFdoZXJlVmlzaXRvciBnZXRTcWxWaXNpdG9yKCkgeworICAgICAgICBpZiAodmlzaXRvciA9PSBudWxsKSB7CisgICAgICAgICAgICB2aXNpdG9yID0gbmV3IFNxbFdoZXJlVmlzaXRvcigpOworICAgICAgICAgICAgaWYgKHdoZXJlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBDbGFzc05vZGUgY2xhc3NOb2RlID0gd2hlcmUuZ2V0TWV0YUNsYXNzKCkuZ2V0Q2xhc3NOb2RlKCk7CisgICAgICAgICAgICAgICAgaWYgKGNsYXNzTm9kZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBHcm9vdnlSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBmaW5kIHRoZSBDbGFzc05vZGUgZm9yIE1ldGFDbGFzczogIiArIHdoZXJlLmdldE1ldGFDbGFzcygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgTGlzdCBtZXRob2RzID0gY2xhc3NOb2RlLmdldERlY2xhcmVkTWV0aG9kcygiZG9DYWxsIik7CisgICAgICAgICAgICAgICAgaWYgKCFtZXRob2RzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBNZXRob2ROb2RlIG1ldGhvZCA9IChNZXRob2ROb2RlKSBtZXRob2RzLmdldCgwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbWV0aG9kLmdldENvZGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZW1lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudC52aXNpdCh2aXNpdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdmlzaXRvcjsKKyAgICB9CisgICAgLyoKKyAgICAgKiBjcmVhdGUgYSBzdWJzZXQgb2YgdGhlIG9yaWdpbmFsIGRhdGFzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgRGF0YVNldCBjcmVhdGVWaWV3KENsb3N1cmUgY3JpdGVyaWEpIHsKKyAgICAJcmV0dXJuIG5ldyBEYXRhU2V0KHRoaXMsIGNyaXRlcmlhKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIExpc3Qgb2YgYWxsIG9mIHRoZSByb3dzIGZyb20gdGhlIHRhYmxlIGEgRGF0YVNldAorICAgICAqIHJlcHJlc2VudHMKKyAgICAgKiBAcmV0dXJuICBSZXR1cm5zIGEgbGlzdCBvZiBHcm9vdnlSb3dSZXN1bHQgb2JqZWN0cyBmcm9tIHRoZSBkYXRhc2V0CisgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24gaWYgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdCByb3dzKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiByb3dzKGdldFNxbCgpLCBnZXRQYXJhbWV0ZXJzKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGZpcnN0IHJvdyBmcm9tIGEgRGF0YVNldCdzIHVuZGVybHlpbmcgdGFibGUKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuICBSZXR1cm5zIHRoZSBmaXJzdCBHcm9vdnlSb3dSZXN1bHQgb2JqZWN0IGZyb20gdGhlIGRhdGFzZXQKKyAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbiBpZiBhIGRhdGFiYXNlIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZmlyc3RSb3coKSB0aHJvd3MgU1FMRXhjZXB0aW9ueworICAgICAgICBMaXN0IHJvd3MgPSByb3dzKCk7CisgICAgICAgIGlmIChyb3dzLmlzRW1wdHkoKSkgcmV0dXJuIG51bGw7CisgICAgICAgIHJldHVybihyb3dzLmdldCgwKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zcWwvRXhwYW5kZWRWYXJpYWJsZS5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zcWwvRXhwYW5kZWRWYXJpYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NzhiNzMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3NxbC9FeHBhbmRlZFZhcmlhYmxlLmphdmEKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgZ3Jvb3Z5LnNxbDsKKworLyoqCisgKiBJZGVudGlmaWVzIGEgdmFyaWFibGUgdG8gYmUgZXhwYW5kZWQgaW50byB0aGUKKyAqIHNxbCBzdHJpbmcgcmF0aGVyIHRoYW4gcmVwcmVzZW50aW5nIGEgcGxhY2Vob2xkZXIuCisgKgorICogQGF1dGhvciByZnVsbGVyCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRXhwYW5kZWRWYXJpYWJsZSB7CisgICAgT2JqZWN0IGdldE9iamVjdCgpOworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zcWwvR3Jvb3Z5UmVzdWx0U2V0LmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3NxbC9Hcm9vdnlSZXN1bHRTZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWEwOGM3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zcWwvR3Jvb3Z5UmVzdWx0U2V0LmphdmEKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGdyb292eS5zcWw7CisKK2ltcG9ydCBqYXZhLnNxbC5SZXN1bHRTZXQ7CitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBncm9vdnkubGFuZy5DbG9zdXJlOworaW1wb3J0IGdyb292eS5sYW5nLkdyb292eU9iamVjdDsKKworLyoqCisgKiBSZXByZXNlbnRzIGFuIGV4dGVudCBvZiBvYmplY3RzCisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOml2YW5fZ2FuemFAeWFob28uY29tIj5JdmFuIEdhbnphPC9hPgorICogQGF1dGhvciBDaHJpcyBTdGV2ZW5zb24KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGludGVyZmFjZSBHcm9vdnlSZXN1bHRTZXQgZXh0ZW5kcyBHcm9vdnlPYmplY3QsIFJlc3VsdFNldCB7CisgICAgLyoqCisgICAgICogU3VwcG9ydHMgaW50ZWdlciBiYXNlZCBzdWJzY3JpcHQgb3BlcmF0b3JzIGZvciBhY2Nlc3NpbmcgYXQgbnVtYmVyZWQgY29sdW1ucworICAgICAqIHN0YXJ0aW5nIGF0IHplcm8uIE5lZ2F0aXZlIGluZGljZXMgYXJlIHN1cHBvcnRlZCwgdGhleSB3aWxsIGNvdW50IGZyb20gdGhlIGxhc3QgY29sdW1uIGJhY2t3YXJkcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmRleCBpcyB0aGUgbnVtYmVyIG9mIHRoZSBjb2x1bW4gdG8gbG9vayBhdCBzdGFydGluZyBhdCAxCisgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24gaWYgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnMKKyAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3QgZm9yIHRoaXMgaW5kZXggaW4gdGhlIGN1cnJlbnQgcmVzdWx0IHNldAorICAgICAqLworICAgIE9iamVjdCBnZXRBdChpbnQgaW5kZXgpIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBTdXBwb3J0cyBpbnRlZ2VyIGJhc2VkIHN1YnNjcmlwdCBvcGVyYXRvcnMgZm9yIHVwZGF0aW5nIHRoZSB2YWx1ZXMgb2YgbnVtYmVyZWQgY29sdW1ucworICAgICAqIHN0YXJ0aW5nIGF0IHplcm8uIE5lZ2F0aXZlIGluZGljZXMgYXJlIHN1cHBvcnRlZCwgdGhleSB3aWxsIGNvdW50IGZyb20gdGhlIGxhc3QgY29sdW1uIGJhY2t3YXJkcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmRleCBpcyB0aGUgbnVtYmVyIG9mIHRoZSBjb2x1bW4gdG8gbG9vayBhdCBzdGFydGluZyBhdCAxCisgICAgICogQHBhcmFtIG5ld1ZhbHVlIHRoZSBuZXcgdmFsdWUgZm9yIHRoaXMgaW5kZXgKKyAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbiBpZiBhIGRhdGFiYXNlIGVycm9yIG9jY3VycworICAgICAqLworICAgIHZvaWQgcHV0QXQoaW50IGluZGV4LCBPYmplY3QgbmV3VmFsdWUpIHRocm93cyBTUUxFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgbmV3IHJvdyB0byB0aGlzIHJlc3VsdCBzZXQKKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZXMgdGVoIG5ldyB2YWx1ZXMgdG8gYWRkCisgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24gaWYgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICB2b2lkIGFkZChNYXAgdmFsdWVzKSB0aHJvd3MgU1FMRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogQ2FsbCB0aGUgY2xvc3VyZSBvbmNlIGZvciBlYWNoIHJvdyBpbiB0aGUgcmVzdWx0IHNldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbG9zdXJlIHRoZSBjbG9zdXJlIHRvIGNhbGwgZm9yIGVhY2ggcm93CisgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24gaWYgYSBkYXRhYmFzZSBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICB2b2lkIGVhY2hSb3coQ2xvc3VyZSBjbG9zdXJlKSB0aHJvd3MgU1FMRXhjZXB0aW9uOworCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3NxbC9Hcm9vdnlSZXN1bHRTZXRFeHRlbnNpb24uamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3FsL0dyb292eVJlc3VsdFNldEV4dGVuc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwYTgzZWQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3NxbC9Hcm9vdnlSZXN1bHRTZXRFeHRlbnNpb24uamF2YQpAQCAtMCwwICsxLDI1NSBAQAorLyoNCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4NCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCitwYWNrYWdlIGdyb292eS5zcWw7DQorDQoraW1wb3J0IGdyb292eS5sYW5nLkNsb3N1cmU7DQoraW1wb3J0IGdyb292eS5sYW5nLkdyb292eU9iamVjdFN1cHBvcnQ7DQoraW1wb3J0IGdyb292eS5sYW5nLk1pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbjsNCisNCitpbXBvcnQgamF2YS5zcWwuUmVzdWx0U2V0Ow0KK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247DQoraW1wb3J0IGphdmEuc3FsLlJlc3VsdFNldE1ldGFEYXRhOw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5NYXA7DQorDQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5JbnZva2VySGVscGVyOw0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuSW52b2tlckludm9jYXRpb25FeGNlcHRpb247DQorDQorLyoqDQorICogR3Jvb3Z5UmVzdWx0U2V0RXh0ZW5zaW9uIGltcGxlbWVudHMgYWRkaXRpb25hbCBsb2dpYyBmb3IgUmVzdWx0U2V0LiBEdWUgdG8gDQorICogdGhlIHZlcnNpb24gaW5jb21wYXRpYmlsaXR5IGJldHdlZW4gamF2YTYgYW5kIGphdmE1IHRoaXMgbWV0aG9kcyBhcmUgbW92ZWQgDQorICogaGVyZSBmcm9tIHRoZSBvcmlnaW5hbCBHcm9vdnlSZXN1bHRTZXQgY2xhc3MuIFRoZSBtZXRob2RzIGluIHRoaXMgY2xhc3MgYXJlDQorICogdXNlZCBieSB0aGUgcHJveHkgR3Jvb3Z5UmVzdWx0U2V0UHJveHksIHdoaWNoIHdpbGwgdHJ5IHRvIGludm9rZSBtZXRob2RzDQorICogb24gdGhpcyBjbGFzcyBiZWZvcmUgaW52b2tlaW5nIGl0IG9uIFJlc3VsdFNldC4gDQorICogDQorICogPHA+PGI+VGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCBkaXJlY3RseS4gU2hvdWxkIGJlIHVzZWQgdGhyb3VnaA0KKyAqICBHcm9vdnlSZXN1bHRTZXRQcm94eSBvbmx5ITwvYj48L3A+DQorICogDQorICogQHNlZSBHcm9vdnlSZXN1bHRTZXQNCisgKiBAc2VlIEdyb292eVJlc3VsdFNldFByb3h5DQorICogIA0KKyAqIEBhdXRob3IgSm9jaGVuIFRoZW9kb3JvdQ0KKyAqLw0KK3B1YmxpYyBjbGFzcyBHcm9vdnlSZXN1bHRTZXRFeHRlbnNpb24gZXh0ZW5kcyBHcm9vdnlPYmplY3RTdXBwb3J0ew0KKw0KKyAgICBwcml2YXRlIGJvb2xlYW4gdXBkYXRlZDsNCisgICAgcHJpdmF0ZSBmaW5hbCBSZXN1bHRTZXQgcmVzdWx0U2V0Ow0KKyAgICANCisgICAgLyoqDQorICAgICAqIEdldHMgdGhlIGN1cnJlbnQgcmVzdWx0IHNldC4NCisgICAgICogQHJldHVybiB0aGUgcmVzdWx0IHNldA0KKyAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbiBpZiB0aGUgcmVzdWx0IHNldCBjYW4gbm90IGJlIHJldHVybmVkDQorICAgICAqLw0KKyAgICBwcm90ZWN0ZWQgUmVzdWx0U2V0IGdldFJlc3VsdFNldCgpIHRocm93cyBTUUxFeGNlcHRpb257DQorICAgICAgICByZXR1cm4gcmVzdWx0U2V0Ow0KKyAgICB9DQorICAgIA0KKyAgICAvKioNCisgICAgICogQ3JlYXRzIGEgR3Jvb3Z5UmVzdWx0U2V0IGltcGxlbWVudGF0aW9uLQ0KKyAgICAgKiAgDQorICAgICAqIEBwYXJhbSBzZXQgdGhlIHJlc3VsdCBzZXQgDQorICAgICAqLw0KKyAgICBwdWJsaWMgR3Jvb3Z5UmVzdWx0U2V0RXh0ZW5zaW9uKFJlc3VsdFNldCBzZXQpIHsNCisgICAgICAgIHVwZGF0ZWQgPSBmYWxzZTsNCisgICAgICAgIHJlc3VsdFNldCA9IHNldDsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KKyAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJbIik7DQorICAgICAgICAgICAgUmVzdWx0U2V0TWV0YURhdGEgbWV0YURhdGEgPSByZXN1bHRTZXQuZ2V0TWV0YURhdGEoKTsNCisgICAgICAgICAgICBpbnQgY291bnQgPSBtZXRhRGF0YS5nZXRDb2x1bW5Db3VudCgpOw0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IGNvdW50OyBpKyspIHsNCisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKG1ldGFEYXRhLmdldENvbHVtbk5hbWUoaSkpOw0KKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjoiKTsNCisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHJlc3VsdFNldC5nZXRPYmplY3QoaSkudG9TdHJpbmcoKSk7DQorICAgICAgICAgICAgICAgIGlmIChpIDwgY291bnQpIHsNCisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLCAiKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBzYi5hcHBlbmQoIl0iKTsNCisgICAgICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsNCisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7DQorLy8gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImUuZ2V0TWVzc2FnZSgpID0gIiArIGUuZ2V0TWVzc2FnZSgpKTsNCisgICAgICAgICAgICByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgT2JqZWN0IGludm9rZU1ldGhvZChTdHJpbmcgbmFtZSwgT2JqZWN0IGFyZ3MpIHsNCisgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgcmV0dXJuIEludm9rZXJIZWxwZXIuaW52b2tlTWV0aG9kKGdldFJlc3VsdFNldCgpLCBuYW1lLCBhcmdzKTsNCisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBzZSkgew0KKyAgICAgICAgICAgIHRocm93IG5ldyBJbnZva2VySW52b2NhdGlvbkV4Y2VwdGlvbihzZSk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIC8qKg0KKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZGVzaWduYXRlZCBjb2x1bW4gaW4gdGhlIGN1cnJlbnQgcm93IA0KKyAgICAgKiBvZiBhcyBhbiA8Y29kZT5PYmplY3Q8L2NvZGU+Lg0KKyAgICAgKiBAcGFyYW0gY29sdW1uTmFtZSB0aGUgU1FMIG5hbWUgb2YgdGhlIGNvbHVtbg0KKyAgICAgKiBAdGhyb3dzIE1pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbiANCisgICAgICogICBpZiBhbiBTUUxFeGNlcHRpb24gaGFwcGVucyB3aGlsZSBnZXR0aW5nIHRoZSBvYmplY3QNCisgICAgICogQHNlZSBncm9vdnkubGFuZy5Hcm9vdnlPYmplY3QjZ2V0UHJvcGVydHkoamF2YS5sYW5nLlN0cmluZykNCisgICAgICogQHNlZSBSZXN1bHRTZXQjZ2V0T2JqZWN0KGphdmEubGFuZy5TdHJpbmcpDQorICAgICAqLw0KKyAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBjb2x1bW5OYW1lKSB7DQorICAgICAgICB0cnkgew0KKyAgICAgICAgICAgIHJldHVybiBnZXRSZXN1bHRTZXQoKS5nZXRPYmplY3QoY29sdW1uTmFtZSk7DQorICAgICAgICB9DQorICAgICAgICBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsNCisgICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ1Byb3BlcnR5RXhjZXB0aW9uKGNvbHVtbk5hbWUsIEdyb292eVJlc3VsdFNldFByb3h5LmNsYXNzLCBlKTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKw0KKyAgICAvKioNCisgICAgICogVXBkYXRlcyB0aGUgZGVzaWduYXRlZCBjb2x1bW4gd2l0aCBhbiA8Y29kZT5PYmplY3Q8L2NvZGU+IHZhbHVlLg0KKyAgICAgKiBAcGFyYW0gY29sdW1uTmFtZSB0aGUgU1FMIG5hbWUgb2YgdGhlIGNvbHVtbg0KKyAgICAgKiBAdGhyb3dzIE1pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbiANCisgICAgICogICBpZiBhbiBTUUxFeGNlcHRpb24gaGFwcGVucyB3aGlsZSBnZXR0aW5nIHRoZSBvYmplY3QgDQorICAgICAqIEBzZWUgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0I3NldFByb3BlcnR5KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpDQorICAgICAqIEBzZWUgUmVzdWx0U2V0I3VwZGF0ZU9iamVjdChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KQ0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIGNvbHVtbk5hbWUsIE9iamVjdCBuZXdWYWx1ZSkgew0KKyAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICBnZXRSZXN1bHRTZXQoKS51cGRhdGVPYmplY3QoY29sdW1uTmFtZSwgbmV3VmFsdWUpOw0KKyAgICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7DQorICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbihjb2x1bW5OYW1lLCBHcm9vdnlSZXN1bHRTZXRQcm94eS5jbGFzcywgZSk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIC8qKg0KKyAgICAgKiBTdXBwb3J0cyBpbnRlZ2VyIGJhc2VkIHN1YnNjcmlwdCBvcGVyYXRvcnMgZm9yIGFjY2Vzc2luZyBhdCBudW1iZXJlZCBjb2x1bW5zDQorICAgICAqIHN0YXJ0aW5nIGF0IHplcm8uIE5lZ2F0aXZlIGluZGljZXMgYXJlIHN1cHBvcnRlZCwgdGhleSB3aWxsIGNvdW50IGZyb20gdGhlIGxhc3QgY29sdW1uIGJhY2t3YXJkcy4NCisgICAgICoNCisgICAgICogQHBhcmFtIGluZGV4IGlzIHRoZSBudW1iZXIgb2YgdGhlIGNvbHVtbiB0byBsb29rIGF0IHN0YXJ0aW5nIGF0IDENCisgICAgICogQHNlZSBSZXN1bHRTZXQjZ2V0T2JqZWN0KGludCkNCisgICAgICovDQorICAgIHB1YmxpYyBPYmplY3QgZ2V0QXQoaW50IGluZGV4KSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIGluZGV4ID0gbm9ybWFsaXplSW5kZXgoaW5kZXgpOw0KKyAgICAgICAgcmV0dXJuIGdldFJlc3VsdFNldCgpLmdldE9iamVjdChpbmRleCk7DQorICAgIH0NCisgICAgDQorICAgIC8qKg0KKyAgICAgKiBTdXBwb3J0cyBpbnRlZ2VyIGJhc2VkIHN1YnNjcmlwdCBvcGVyYXRvcnMgZm9yIHVwZGF0aW5nIHRoZSB2YWx1ZXMgb2YgbnVtYmVyZWQgY29sdW1ucw0KKyAgICAgKiBzdGFydGluZyBhdCB6ZXJvLiBOZWdhdGl2ZSBpbmRpY2VzIGFyZSBzdXBwb3J0ZWQsIHRoZXkgd2lsbCBjb3VudCBmcm9tIHRoZSBsYXN0IGNvbHVtbiBiYWNrd2FyZHMuDQorICAgICAqDQorICAgICAqIEBwYXJhbSBpbmRleCBpcyB0aGUgbnVtYmVyIG9mIHRoZSBjb2x1bW4gdG8gbG9vayBhdCBzdGFydGluZyBhdCAxDQorICAgICAqIEBzZWUgUmVzdWx0U2V0I3VwZGF0ZU9iamVjdChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KQ0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgcHV0QXQoaW50IGluZGV4LCBPYmplY3QgbmV3VmFsdWUpIHRocm93cyBTUUxFeGNlcHRpb24gew0KKyAgICAgICAgaW5kZXggPSBub3JtYWxpemVJbmRleChpbmRleCk7DQorICAgICAgICBnZXRSZXN1bHRTZXQoKS51cGRhdGVPYmplY3QoaW5kZXgsIG5ld1ZhbHVlKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQWRkcyBhIG5ldyByb3cgdG8gdGhlIHJlc3VsdCBzZXQNCisgICAgICoNCisgICAgICogQHBhcmFtIHZhbHVlcyBhIG1hcCBjb250YWluaW5nIHRoZSBtYXBwaW5ncyBmb3IgY29sdW1uIG5hbWVzIGFuZCB2YWx1ZXMNCisgICAgICogQHNlZSBSZXN1bHRTZXQjaW5zZXJ0Um93KCkNCisgICAgICogQHNlZSBSZXN1bHRTZXQjdXBkYXRlT2JqZWN0KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpDQorICAgICAqIEBzZWUgUmVzdWx0U2V0I21vdmVUb0luc2VydFJvdygpDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBhZGQoTWFwIHZhbHVlcykgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICBnZXRSZXN1bHRTZXQoKS5tb3ZlVG9JbnNlcnRSb3coKTsNCisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHZhbHVlcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgew0KKyAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOw0KKyAgICAgICAgICAgIGdldFJlc3VsdFNldCgpLnVwZGF0ZU9iamVjdChlbnRyeS5nZXRLZXkoKS50b1N0cmluZygpLCBlbnRyeS5nZXRWYWx1ZSgpKTsNCisgICAgICAgIH0NCisgICAgICAgIGdldFJlc3VsdFNldCgpLmluc2VydFJvdygpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBUYWtlcyBhIHplcm8gYmFzZWQgaW5kZXggYW5kIGNvbnZlcnQgaXQgaW50byBhbiBTUUwgYmFzZWQgMSBiYXNlZCBpbmRleC4NCisgICAgICogQSBuZWdhdGl2ZSBpbmRleCB3aWxsIGNvdW50IGJhY2t3YXJkcyBmcm9tIHRoZSBsYXN0IGNvbHVtbi4NCisgICAgICoNCisgICAgICogQHBhcmFtIGluZGV4DQorICAgICAqIEByZXR1cm4gYSBKREJDIGluZGV4DQorICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uIGlmIHNvbWUgZXhjZXB0aW9uIG9jY3VycyBmaW5kaW5nIG91dCB0aGUgY29sdW1uIGNvdW50DQorICAgICAqLw0KKyAgICBwcm90ZWN0ZWQgaW50IG5vcm1hbGl6ZUluZGV4KGludCBpbmRleCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICBpZiAoaW5kZXggPCAwKSB7DQorICAgICAgICAgICAgaW50IGNvbHVtbkNvdW50ID0gZ2V0UmVzdWx0U2V0KCkuZ2V0TWV0YURhdGEoKS5nZXRDb2x1bW5Db3VudCgpOw0KKyAgICAgICAgICAgIGRvIHsNCisgICAgICAgICAgICAgICAgaW5kZXggKz0gY29sdW1uQ291bnQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHdoaWxlIChpbmRleCA8IDApOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIGluZGV4ICsgMTsNCisgICAgfQ0KKw0KKw0KKyAgICAvKioNCisgICAgICogQ2FsbCB0aGUgY2xvc3VyZSBvbmNlIGZvciBlYWNoIHJvdyBpbiB0aGUgcmVzdWx0IHNldC4NCisgICAgICoNCisgICAgICogQHBhcmFtIGNsb3N1cmUNCisgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24NCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIGVhY2hSb3coQ2xvc3VyZSBjbG9zdXJlKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIHdoaWxlIChuZXh0KCkpIHsNCisgICAgICAgICAgICBjbG9zdXJlLmNhbGwodGhpcyk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgLy8gSW1wbGVtZW50YXRpb24gb2YgamF2YS5zcWwuZ2V0UmVzdWx0U2V0KCkNCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorICAgIC8qKg0KKyAgICAgKiBNb3ZlcyB0aGUgY3Vyc29yIGRvd24gb25lIHJvdyBmcm9tIGl0cyBjdXJyZW50IHBvc2l0aW9uLg0KKyAgICAgKiBBIDxjb2RlPmdldFJlc3VsdFNldCgpPC9jb2RlPiBjdXJzb3IgaXMgaW5pdGlhbGx5IHBvc2l0aW9uZWQNCisgICAgICogYmVmb3JlIHRoZSBmaXJzdCByb3c7IHRoZSBmaXJzdCBjYWxsIHRvIHRoZSBtZXRob2QNCisgICAgICogPGNvZGU+bmV4dDwvY29kZT4gbWFrZXMgdGhlIGZpcnN0IHJvdyB0aGUgY3VycmVudCByb3c7IHRoZQ0KKyAgICAgKiBzZWNvbmQgY2FsbCBtYWtlcyB0aGUgc2Vjb25kIHJvdyB0aGUgY3VycmVudCByb3csIGFuZCBzbyBvbi4NCisgICAgICogPHAvPg0KKyAgICAgKiA8UD5JZiBhbiBpbnB1dCBzdHJlYW0gaXMgb3BlbiBmb3IgdGhlIGN1cnJlbnQgcm93LCBhIGNhbGwNCisgICAgICogdG8gdGhlIG1ldGhvZCA8Y29kZT5uZXh0PC9jb2RlPiB3aWxsDQorICAgICAqIGltcGxpY2l0bHkgY2xvc2UgaXQuIEEgPGNvZGU+Z2V0UmVzdWx0U2V0KCk8L2NvZGU+IG9iamVjdCdzDQorICAgICAqIHdhcm5pbmcgY2hhaW4gaXMgY2xlYXJlZCB3aGVuIGEgbmV3IHJvdyBpcyByZWFkLg0KKyAgICAgKg0KKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBuZXcgY3VycmVudCByb3cgaXMgdmFsaWQ7DQorICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZXJlIGFyZSBubyBtb3JlIHJvd3MNCisgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24gaWYgYSBkYXRhYmFzZSBhY2Nlc3MgZXJyb3Igb2NjdXJzDQorICAgICAqLw0KKyAgICBwdWJsaWMgYm9vbGVhbiBuZXh0KCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7DQorICAgICAgICBpZiAodXBkYXRlZCkgew0KKyAgICAgICAgICAgIGdldFJlc3VsdFNldCgpLnVwZGF0ZVJvdygpOw0KKyAgICAgICAgICAgIHVwZGF0ZWQgPSBmYWxzZTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBnZXRSZXN1bHRTZXQoKS5uZXh0KCk7DQorICAgIH0NCisgICAgDQorICAgIC8qKg0KKyAgICAgKiBNb3ZlcyB0aGUgY3Vyc29yIHRvIHRoZSBwcmV2aW91cyByb3cgaW4gdGhpcw0KKyAgICAgKiA8Y29kZT5nZXRSZXN1bHRTZXQoKTwvY29kZT4gb2JqZWN0Lg0KKyAgICAgKg0KKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjdXJzb3IgaXMgb24gYSB2YWxpZCByb3c7DQorICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IGlzIG9mZiB0aGUgcmVzdWx0IHNldA0KKyAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbiBpZiBhIGRhdGFiYXNlIGFjY2VzcyBlcnJvcg0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBvY2N1cnMgb3IgdGhlIHJlc3VsdCBzZXQgdHlwZSBpcyA8Y29kZT5UWVBFX0ZPUldBUkRfT05MWTwvY29kZT4NCisgICAgICogQHNpbmNlIDEuMg0KKyAgICAgKi8NCisgICAgcHVibGljIGJvb2xlYW4gcHJldmlvdXMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsNCisgICAgICAgIGlmICh1cGRhdGVkKSB7DQorICAgICAgICAgICAgZ2V0UmVzdWx0U2V0KCkudXBkYXRlUm93KCk7DQorICAgICAgICAgICAgdXBkYXRlZCA9IGZhbHNlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIGdldFJlc3VsdFNldCgpLnByZXZpb3VzKCk7DQorICAgIH0NCisNCisNCisNCit9DQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zcWwvR3Jvb3Z5UmVzdWx0U2V0UHJveHkuamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3FsL0dyb292eVJlc3VsdFNldFByb3h5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ0OGMyZgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3FsL0dyb292eVJlc3VsdFNldFByb3h5LmphdmEKQEAgLTAsMCArMSwxMjAgQEAKKy8qDQorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorcGFja2FnZSBncm9vdnkuc3FsOw0KKw0KK2ltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlPYmplY3Q7DQoraW1wb3J0IGdyb292eS5sYW5nLkdyb292eVN5c3RlbTsNCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuTWV0YUNsYXNzOw0KKw0KK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uSGFuZGxlcjsNCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOw0KK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Qcm94eTsNCitpbXBvcnQgamF2YS5zcWwuUmVzdWx0U2V0Ow0KKw0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuSW52b2tlckhlbHBlcjsNCisNCisvKioNCisgKiBHcm9vdnlSZXN1bHRTZXRQcm94eSBpcyB1c2VkIHRvIGNyZWF0ZSBhIHByb3h5IGZvciBHcm9vdnlSZXN1bHRTZXQuDQorICogRHVlIHRvIHRoZSB2ZXJzaW9uIGluY29tcGF0aWJpbGl0eSBiZXR3ZWVuIGphdmEgNiBhbmQgb2xkZXIgdmVyc2lvbnMNCisgKiBtZXRob2RzIHdpdGggYWRkaXRpb25hbCBsb2dpYyB3ZXJlIG1vdmVkIGludG8gYW4gZXh0ZW5zaW9uIGNsYXNzLiBXaGVuDQorICogZ2V0dGluZyBwcm9wZXJ0aWVzIG9yIGNhbGxpbmcgbWV0aG9kcywgdGhlIHJ1bnRpbWUgd2lsbCB0cnkgdG8gZmlyc3QNCisgKiBleGVjdXRlIHRoZXNlIG9uIHRoZSBleHRlbnNpb24gYW5kIHRoZW4gb24gdGhlIFJlc3VsdFNldCBpdHNlbGYuDQorICogVGhpcyB3YXkgaXQgaXMgcG9zc2libGUgdG8gcmVwbGFjZSBhbmQgYWRkIG1ldGhvZHMuIFRvIG92ZXJsb2FkIG1ldGhvZHMNCisgKiBmcm9tIFJlc3VsdFNldCBhbGwgbWV0aG9kcyBoYXZlIHRvIGJlIGltcGxlbWVudGVkIG9uIHRoZSBleHRlbnNpb24NCisgKiBjbGFzcy4NCisgKg0KKyAqIEBhdXRob3IgSm9jaGVuIFRoZW9kb3JvdQ0KKyAqLw0KK3B1YmxpYyBmaW5hbCBjbGFzcyBHcm9vdnlSZXN1bHRTZXRQcm94eSBpbXBsZW1lbnRzIEludm9jYXRpb25IYW5kbGVyIHsNCisNCisgICAgcHJpdmF0ZSBHcm9vdnlSZXN1bHRTZXRFeHRlbnNpb24gZXh0ZW5zaW9uOw0KKw0KKyAgICAvKioNCisgICAgICogQ3JlYXRlcyBhIG5ldyBwcm9jeSBpbnN0YW5jZS4NCisgICAgICogVGhpcyB3aWxsIGNyZWF0ZSB0aGUgZXh0ZW5zaW9uIGF1dG9tYXRpY2FsbHkgdXNpbmcNCisgICAgICogR3Jvb3Z5UmVzdWx0U2V0RXh0ZW5zaW9uDQorICAgICAqDQorICAgICAqIEBwYXJhbSBzZXQgdGhlIHJlc3VsdCBzZXQgdG8gZGVsZWdhdGUgdG8NCisgICAgICogQHNlZSBHcm9vdnlSZXN1bHRTZXRFeHRlbnNpb24NCisgICAgICovDQorICAgIHB1YmxpYyBHcm9vdnlSZXN1bHRTZXRQcm94eShSZXN1bHRTZXQgc2V0KSB7DQorICAgICAgICBleHRlbnNpb24gPSBuZXcgR3Jvb3Z5UmVzdWx0U2V0RXh0ZW5zaW9uKHNldCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIENyZWF0ZXMgYSBuZXcgcHJveHkgaW5zdGFuY2Ugd2l0aCBhIGN1c3RvbSBleHRlbnNpb24uDQorICAgICAqDQorICAgICAqIEBwYXJhbSBleHQgdGhlIGV4dGVuc2lvbg0KKyAgICAgKiBAc2VlIEdyb292eVJlc3VsdFNldEV4dGVuc2lvbg0KKyAgICAgKi8NCisgICAgcHVibGljIEdyb292eVJlc3VsdFNldFByb3h5KEdyb292eVJlc3VsdFNldEV4dGVuc2lvbiBleHQpIHsNCisgICAgICAgIGV4dGVuc2lvbiA9IGV4dDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogSW52b2tlcyBhIG1ldGhvZCBmb3IgdGhlIEdyb292eVJlc3VsdFNldC4NCisgICAgICogVGhpcyB3aWxsIHRyeSB0byBpbnZva2UgdGhlIGdpdmVuIG1ldGhvZCBmaXJzdCBvbiB0aGUgZXh0ZW5zaW9uDQorICAgICAqIGFuZCB0aGVuIG9uIHRoZSByZXN1bHQgc2V0IGdpdmVuIGFzIHByb3h5IHBhcmFtZXRlci4NCisgICAgICoNCisgICAgICogQHBhcmFtIHByb3h5ICB0aGUgcmVzdWx0IHNldA0KKyAgICAgKiBAcGFyYW0gbWV0aG9kIHRoZSBtZXRob2QgbmFtZSBvZiB0aGlzIG1ldGhvZCB3aWxsIGJlIHVzZWQNCisgICAgICogICAgICAgICAgICAgICB0byBtYWtlIGEgY2FsbCBvbiB0aGUgZXh0ZW5zaW9uLiBJZiB0aGlzIGZhaWxzIHRoZSBjYWxsIHdpbGwgYmUNCisgICAgICogICAgICAgICAgICAgICBkb25lIG9uIHRoZSBwcm94eSBpbnN0ZWFkDQorICAgICAqIEBwYXJhbSBhcmdzICAgZm9yIHRoZSBjYWxsDQorICAgICAqIEBzZWUgUmVzdWx0U2V0DQorICAgICAqIEBzZWUgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvbkhhbmRsZXIjaW52b2tlKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCwgamF2YS5sYW5nLk9iamVjdFtdKQ0KKyAgICAgKi8NCisgICAgcHVibGljIE9iamVjdCBpbnZva2UoT2JqZWN0IHByb3h5LCBNZXRob2QgbWV0aG9kLCBPYmplY3RbXSBhcmdzKSB0aHJvd3MgVGhyb3dhYmxlIHsNCisgICAgICAgIFN0cmluZyBuYW1lID0gbWV0aG9kLmdldE5hbWUoKTsNCisgICAgICAgIGlmIChtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKSA9PSBHcm9vdnlPYmplY3QuY2xhc3MpIHsNCisgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoImdldE1ldGFDbGFzcyIpKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBnZXRNZXRhQ2xhc3MoKTsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJzZXRNZXRhQ2xhc3MiKSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gc2V0TWV0YUNsYXNzKChNZXRhQ2xhc3MpIGFyZ3NbMF0pOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHJldHVybiBJbnZva2VySGVscGVyLmludm9rZU1ldGhvZChleHRlbnNpb24sIG1ldGhvZC5nZXROYW1lKCksIGFyZ3MpOw0KKyAgICB9DQorDQorICAgIHByaXZhdGUgTWV0YUNsYXNzIG1ldGFDbGFzczsNCisNCisgICAgcHJpdmF0ZSBNZXRhQ2xhc3Mgc2V0TWV0YUNsYXNzKE1ldGFDbGFzcyBtYykgew0KKyAgICAgICAgbWV0YUNsYXNzID0gbWM7DQorICAgICAgICByZXR1cm4gbWM7DQorICAgIH0NCisNCisgICAgcHJpdmF0ZSBNZXRhQ2xhc3MgZ2V0TWV0YUNsYXNzKCkgew0KKyAgICAgICAgaWYgKG1ldGFDbGFzcyA9PSBudWxsKSB7DQorICAgICAgICAgICAgbWV0YUNsYXNzID0gR3Jvb3Z5U3lzdGVtLmdldE1ldGFDbGFzc1JlZ2lzdHJ5KCkuZ2V0TWV0YUNsYXNzKEdyb292eVJlc3VsdFNldC5jbGFzcyk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gbWV0YUNsYXNzOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBHZXRzIGEgcHJveHkgaW5zdGFuY2UgdGhhdCBjYW4gYmUgdXNlZCBhcyBHcm9vdnlSZXN1bHRTZXQuDQorICAgICAqDQorICAgICAqIEByZXR1cm4gdGhlIHByb3h5DQorICAgICAqLw0KKyAgICBwdWJsaWMgR3Jvb3Z5UmVzdWx0U2V0IGdldEltcGwoKSB7DQorICAgICAgICByZXR1cm4gKEdyb292eVJlc3VsdFNldCkNCisgICAgICAgICAgICAgICAgUHJveHkubmV3UHJveHlJbnN0YW5jZSgNCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXXtHcm9vdnlSZXN1bHRTZXQuY2xhc3N9LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMNCisgICAgICAgICAgICAgICAgKTsNCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3NxbC9Hcm9vdnlSb3dSZXN1bHQuamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3FsL0dyb292eVJvd1Jlc3VsdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwY2I2YTEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3NxbC9Hcm9vdnlSb3dSZXN1bHQuamF2YQpAQCAtMCwwICsxLDE2NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGdyb292eS5zcWw7CisKK2ltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlPYmplY3RTdXBwb3J0OworaW1wb3J0IGdyb292eS5sYW5nLk1pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC4qOworCisvKioKKyAqIFJlcHJlc2VudHMgYW4gZXh0ZW50IG9mIG9iamVjdHMuCisgKiBJdCdzIHVzZWQgaW4gdGhlIG9uZVJvdyBtZXRob2QgdG8gYmUgYWJsZSB0byBhY2Nlc3MgdGhlIHJlc3VsdAorICogb2YgYSBTUUwgcXVlcnkgYnkgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiwgb3IgYnkgdGhlIGNvbHVtbiBudW1iZXIuCisgKgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogQGF1dGhvciBKZWFuLUxvdWlzIEJlcmxpZXQKKyAqLworcHVibGljIGNsYXNzIEdyb292eVJvd1Jlc3VsdCBleHRlbmRzIEdyb292eU9iamVjdFN1cHBvcnQgaW1wbGVtZW50cyBNYXAgeworCisgICAgcHJpdmF0ZSBmaW5hbCBMaW5rZWRIYXNoTWFwIHJlc3VsdDsKKworICAgIHB1YmxpYyBHcm9vdnlSb3dSZXN1bHQoTGlua2VkSGFzaE1hcCByZXN1bHQpIHsKKyAgICAgICAgdGhpcy5yZXN1bHQgPSByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmUgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBieSBpdHMgbmFtZSAgICAqCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvcGVydHkgaXMgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGxvb2sgYXQKKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gcmVzdWx0LmdldChwcm9wZXJ0eSk7CisgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgICAgICAvLyBpZiBwcm9wZXJ0eSBleGlzdHMgYW5kIHZhbHVlIGlzIG51bGwsIHJldHVybiBudWxsCisgICAgICAgICAgICBpZiAocmVzdWx0LmNvbnRhaW5zS2V5KHByb3BlcnR5KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIC8vIHdpdGggc29tZSBkYXRhYmFzZXMvZHJpdmVycywgdGhlIGNvbHVtbnMgbmFtZXMgYXJlIHN0b3JlZCB1cHBlcmNhc2UuCisgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHlVcHBlciA9IHByb3BlcnR5LnRvVXBwZXJDYXNlKCk7CisgICAgICAgICAgICB2YWx1ZSA9IHJlc3VsdC5nZXQocHJvcGVydHlVcHBlcik7CisgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgICAgICAvLyBpZiBwcm9wZXJ0eSBleGlzdHMgYW5kIHZhbHVlIGlzIG51bGwsIHJldHVybiBudWxsCisgICAgICAgICAgICBpZiAocmVzdWx0LmNvbnRhaW5zS2V5KHByb3BlcnR5VXBwZXIpKSAKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nUHJvcGVydHlFeGNlcHRpb24ocHJvcGVydHksIEdyb292eVJvd1Jlc3VsdC5jbGFzcyk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ1Byb3BlcnR5RXhjZXB0aW9uKHByb3BlcnR5LCBHcm9vdnlSb3dSZXN1bHQuY2xhc3MsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmUgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBieSBpdHMgaW5kZXguCisgICAgICogQSBuZWdhdGl2ZSBpbmRleCB3aWxsIGNvdW50IGJhY2t3YXJkcyBmcm9tIHRoZSBsYXN0IGNvbHVtbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmRleCBpcyB0aGUgbnVtYmVyIG9mIHRoZSBjb2x1bW4gdG8gbG9vayBhdAorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eQorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0QXQoaW50IGluZGV4KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBhIG5lZ2F0aXZlIGluZGV4IHdpbGwgY291bnQgYmFja3dhcmRzIGZyb20gdGhlIGxhc3QgY29sdW1uLgorICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkKKyAgICAgICAgICAgICAgICBpbmRleCArPSByZXN1bHQuc2l6ZSgpOworICAgICAgICAgICAgSXRlcmF0b3IgaXQgPSByZXN1bHQudmFsdWVzKCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgICAgIE9iamVjdCBvYmogPSBudWxsOworICAgICAgICAgICAgd2hpbGUgKChvYmogPT0gbnVsbCkgJiYgKGl0Lmhhc05leHQoKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoaSA9PSBpbmRleCkKKyAgICAgICAgICAgICAgICAgICAgb2JqID0gaXQubmV4dCgpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgaXQubmV4dCgpOworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAob2JqKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nUHJvcGVydHlFeGNlcHRpb24oSW50ZWdlci50b1N0cmluZyhpbmRleCksIEdyb292eVJvd1Jlc3VsdC5jbGFzcywgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gKHJlc3VsdC50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgbmVlZGVkIGZvciBpbXBsZW1lbnRpbmcgdGhlIE1hcCBpbnRlcmZhY2UuCisgICAgICogVGhleSBhcmUganVzdCBkZWxlZ2F0aW5nIHRoZSByZXF1ZXN0IHRvIHRoZSBpbnRlcm5hbCBMaW5rZWRIYXNoTWFwCisgICAgICovCisgICAgIAorICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICByZXN1bHQuY2xlYXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShPYmplY3Qga2V5KSB7CisgICAgICAgIHJldHVybiByZXN1bHQuY29udGFpbnNLZXkoa2V5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc1ZhbHVlKE9iamVjdCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gcmVzdWx0LmNvbnRhaW5zVmFsdWUodmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBTZXQgZW50cnlTZXQoKSB7CisgICAgICAgIHJldHVybiByZXN1bHQuZW50cnlTZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdC5lcXVhbHMobyk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXQoT2JqZWN0IHByb3BlcnR5KSB7CisgICAgICAgIGlmIChwcm9wZXJ0eSBpbnN0YW5jZW9mIFN0cmluZykKKyAgICAgICAgICAgIHJldHVybiBnZXRQcm9wZXJ0eSgoU3RyaW5nKXByb3BlcnR5KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdC5oYXNoQ29kZSgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CisgICAgICAgIHJldHVybiByZXN1bHQuaXNFbXB0eSgpOworICAgIH0KKworICAgIHB1YmxpYyBTZXQga2V5U2V0KCkgeworICAgICAgICByZXR1cm4gcmVzdWx0LmtleVNldCgpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgcHV0KE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gcmVzdWx0LnB1dChrZXksIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwdXRBbGwoTWFwIHQpIHsKKyAgICAgICAgcmVzdWx0LnB1dEFsbCh0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZShPYmplY3Qga2V5KSB7CisgICAgICAgIHJldHVybiByZXN1bHQucmVtb3ZlKGtleSk7CisgICAgfQorCisgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICByZXR1cm4gcmVzdWx0LnNpemUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29sbGVjdGlvbiB2YWx1ZXMoKSB7CisgICAgICAgIHJldHVybiByZXN1bHQudmFsdWVzKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zcWwvSW5PdXRQYXJhbWV0ZXIuamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3FsL0luT3V0UGFyYW1ldGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE0OWI4NgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3FsL0luT3V0UGFyYW1ldGVyLmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgZ3Jvb3Z5LnNxbDsKKworLyoqCisgKiBAYXV0aG9yIHJmdWxsZXIKKyAqCisgKiBBIHR5cGVkIHBhcmFtZXRlciBwYXNzZWQgdG8sIGFuZCByZXR1cm5lZCBmcm9tIGEgQ2FsbGFibGVTdGF0ZW1lbnQuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSW5PdXRQYXJhbWV0ZXIgZXh0ZW5kcyBJblBhcmFtZXRlciwgT3V0UGFyYW1ldGVyIHsKKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zcWwvSW5QYXJhbWV0ZXIuamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3FsL0luUGFyYW1ldGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JhNjgzMAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3FsL0luUGFyYW1ldGVyLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgZ3Jvb3Z5LnNxbDsKKworLyoqCisgKiBBIHR5cGVkIHBhcmFtZXRlciB0byBwYXNzIHRvIGEgcXVlcnkKKyAqCisgKiBAYXV0aG9yIHJmdWxsZXIKKyAqLworcHVibGljIGludGVyZmFjZSBJblBhcmFtZXRlciB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgSkRCQyBkYXRhIHR5cGUuCisgICAgICogQHJldHVybiB0aGUgdHlwZQorICAgICAqLworICAgIGludCBnZXRUeXBlKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgb2JqZWN0IGhvbGRpbmcgdGhlIGRhdGEgdmFsdWUuCisgICAgICogQHJldHVybiB0aGUgdmFsdWUKKyAgICAgKi8KKyAgICBPYmplY3QgZ2V0VmFsdWUoKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3NxbC9PdXRQYXJhbWV0ZXIuamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3FsL091dFBhcmFtZXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MDBhMGMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3NxbC9PdXRQYXJhbWV0ZXIuamF2YQpAQCAtMCwwICsxLDMwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBncm9vdnkuc3FsOworCisvKioKKyAqIEEgcGFyYW1ldGVyIHRvIGJlIHJldHVybmVkIGZyb20gYSBDYWxsYWJsZVN0YXRlbWVudC4KKyAqCisgKiBAYXV0aG9yIHJmdWxsZXIKKyAqLworcHVibGljIGludGVyZmFjZSBPdXRQYXJhbWV0ZXIgeworICAgIC8qKgorICAgICAqIEdldCB0aGUgSkRCQyBkYXRhdHlwZSBmb3IgdGhpcyBwYXJhbWV0ZXIuCisgICAgICogQHJldHVybiB0aGUgdHlwZQorICAgICAqLworICAgIGludCBnZXRUeXBlKCk7Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3NxbC9SZXN1bHRTZXRPdXRQYXJhbWV0ZXIuamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3FsL1Jlc3VsdFNldE91dFBhcmFtZXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NjRiMWQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3NxbC9SZXN1bHRTZXRPdXRQYXJhbWV0ZXIuamF2YQpAQCAtMCwwICsxLDI2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBncm9vdnkuc3FsOworCisvKioKKyAqIEEgUmVzdWx0U2V0IG91dCBwYXJhbWV0ZXIuCisgKiBAYXV0aG9yIHJmdWxsZXIKKyAqCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUmVzdWx0U2V0T3V0UGFyYW1ldGVyIGV4dGVuZHMgT3V0UGFyYW1ldGVyeworCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3NxbC9TcWwuamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3FsL1NxbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMjAyODEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3NxbC9TcWwuamF2YQpAQCAtMCwwICsxLDEyNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBncm9vdnkuc3FsOworCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuQ2xvc3VyZTsKK2ltcG9ydCBncm9vdnkubGFuZy5HU3RyaW5nOworCitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb247CitpbXBvcnQgamF2YS5zcWwuQ2FsbGFibGVTdGF0ZW1lbnQ7CitpbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLnNxbC5Ecml2ZXJNYW5hZ2VyOworaW1wb3J0IGphdmEuc3FsLlByZXBhcmVkU3RhdGVtZW50OworaW1wb3J0IGphdmEuc3FsLlJlc3VsdFNldDsKK2ltcG9ydCBqYXZhLnNxbC5SZXN1bHRTZXRNZXRhRGF0YTsKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CitpbXBvcnQgamF2YS5zcWwuU3RhdGVtZW50OworaW1wb3J0IGphdmEuc3FsLlR5cGVzOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKK2ltcG9ydCBqYXZheC5zcWwuRGF0YVNvdXJjZTsKKworLyoqCisgKiBSZXByZXNlbnRzIGFuIGV4dGVudCBvZiBvYmplY3RzCisgKgorICogQGF1dGhvciBDaHJpcyBTdGV2ZW5zb24KKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW4gPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgU3FsIHsKKworICAgIHByb3RlY3RlZCBMb2dnZXIgbG9nID0gTG9nZ2VyLmdldExvZ2dlcihnZXRDbGFzcygpLmdldE5hbWUoKSk7CisKKyAgICBwcml2YXRlIERhdGFTb3VyY2UgZGF0YVNvdXJjZTsKKworICAgIHByaXZhdGUgQ29ubmVjdGlvbiB1c2VDb25uZWN0aW9uOworCisgICAgLyoqIGxldHMgb25seSB3YXJuIG9mIHVzaW5nIGRlcHJlY2F0ZWQgbWV0aG9kcyBvbmNlICovCisgICAgcHJpdmF0ZSBib29sZWFuIHdhcm5lZDsKKworICAgIC8vIHN0b3JlIHRoZSBsYXN0IHJvdyBjb3VudCBmb3IgZXhlY3V0ZVVwZGF0ZQorICAgIGludCB1cGRhdGVDb3VudCA9IDA7CisKKyAgICAvKiogYWxsb3dzIGEgY2xvc3VyZSB0byBiZSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgc3RhdGVtZW50IGJlZm9yZSBpdHMgdXNlICovCisgICAgcHJpdmF0ZSBDbG9zdXJlIGNvbmZpZ3VyZVN0YXRlbWVudDsKKworICAgIC8qKgorICAgICAqIEEgaGVscGVyIG1ldGhvZCB3aGljaCBjcmVhdGVzIGEgbmV3IFNxbCBpbnN0YW5jZSBmcm9tIGEgSkRCQyBjb25uZWN0aW9uCisgICAgICogVVJMCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJsCisgICAgICogQHJldHVybiBhIG5ldyBTcWwgaW5zdGFuY2Ugd2l0aCBhIGNvbm5lY3Rpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFNxbCBuZXdJbnN0YW5jZShTdHJpbmcgdXJsKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gRHJpdmVyTWFuYWdlci5nZXRDb25uZWN0aW9uKHVybCk7CisgICAgICAgIHJldHVybiBuZXcgU3FsKGNvbm5lY3Rpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgaGVscGVyIG1ldGhvZCB3aGljaCBjcmVhdGVzIGEgbmV3IFNxbCBpbnN0YW5jZSBmcm9tIGEgSkRCQyBjb25uZWN0aW9uCisgICAgICogVVJMCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJsCisgICAgICogQHJldHVybiBhIG5ldyBTcWwgaW5zdGFuY2Ugd2l0aCBhIGNvbm5lY3Rpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFNxbCBuZXdJbnN0YW5jZShTdHJpbmcgdXJsLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSBEcml2ZXJNYW5hZ2VyLmdldENvbm5lY3Rpb24odXJsLCBwcm9wZXJ0aWVzKTsKKyAgICAgICAgcmV0dXJuIG5ldyBTcWwoY29ubmVjdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBoZWxwZXIgbWV0aG9kIHdoaWNoIGNyZWF0ZXMgYSBuZXcgU3FsIGluc3RhbmNlIGZyb20gYSBKREJDIGNvbm5lY3Rpb24KKyAgICAgKiBVUkwgYW5kIGRyaXZlciBjbGFzcyBuYW1lCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJsCisgICAgICogQHJldHVybiBhIG5ldyBTcWwgaW5zdGFuY2Ugd2l0aCBhIGNvbm5lY3Rpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFNxbCBuZXdJbnN0YW5jZShTdHJpbmcgdXJsLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyBkcml2ZXJDbGFzc05hbWUpIHRocm93cyBTUUxFeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBsb2FkRHJpdmVyKGRyaXZlckNsYXNzTmFtZSk7CisgICAgICAgIHJldHVybiBuZXdJbnN0YW5jZSh1cmwsIHByb3BlcnRpZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgaGVscGVyIG1ldGhvZCB3aGljaCBjcmVhdGVzIGEgbmV3IFNxbCBpbnN0YW5jZSBmcm9tIGEgSkRCQyBjb25uZWN0aW9uCisgICAgICogVVJMLCB1c2VybmFtZSBhbmQgcGFzc3dvcmQKKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmwKKyAgICAgKiBAcmV0dXJuIGEgbmV3IFNxbCBpbnN0YW5jZSB3aXRoIGEgY29ubmVjdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3FsIG5ld0luc3RhbmNlKFN0cmluZyB1cmwsIFN0cmluZyB1c2VyLCBTdHJpbmcgcGFzc3dvcmQpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSBEcml2ZXJNYW5hZ2VyLmdldENvbm5lY3Rpb24odXJsLCB1c2VyLCBwYXNzd29yZCk7CisgICAgICAgIHJldHVybiBuZXcgU3FsKGNvbm5lY3Rpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgaGVscGVyIG1ldGhvZCB3aGljaCBjcmVhdGVzIGEgbmV3IFNxbCBpbnN0YW5jZSBmcm9tIGEgSkRCQyBjb25uZWN0aW9uCisgICAgICogVVJMLCB1c2VybmFtZSwgcGFzc3dvcmQgYW5kIGRyaXZlciBjbGFzcyBuYW1lCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJsCisgICAgICogQHJldHVybiBhIG5ldyBTcWwgaW5zdGFuY2Ugd2l0aCBhIGNvbm5lY3Rpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFNxbCBuZXdJbnN0YW5jZShTdHJpbmcgdXJsLCBTdHJpbmcgdXNlciwgU3RyaW5nIHBhc3N3b3JkLCBTdHJpbmcgZHJpdmVyQ2xhc3NOYW1lKSB0aHJvd3MgU1FMRXhjZXB0aW9uLAorICAgICAgICAgICAgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIGxvYWREcml2ZXIoZHJpdmVyQ2xhc3NOYW1lKTsKKyAgICAgICAgcmV0dXJuIG5ld0luc3RhbmNlKHVybCwgdXNlciwgcGFzc3dvcmQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgaGVscGVyIG1ldGhvZCB3aGljaCBjcmVhdGVzIGEgbmV3IFNxbCBpbnN0YW5jZSBmcm9tIGEgSkRCQyBjb25uZWN0aW9uCisgICAgICogVVJMIGFuZCBkcml2ZXIgY2xhc3MgbmFtZQorICAgICAqCisgICAgICogQHBhcmFtIHVybAorICAgICAqIEBwYXJhbSBkcml2ZXJDbGFzc05hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBjbGFzcyBuYW1lIG9mIHRoZSBkcml2ZXIKKyAgICAgKiBAcmV0dXJuIGEgbmV3IFNxbCBpbnN0YW5jZSB3aXRoIGEgY29ubmVjdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3FsIG5ld0luc3RhbmNlKFN0cmluZyB1cmwsIFN0cmluZyBkcml2ZXJDbGFzc05hbWUpIHRocm93cyBTUUxFeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBsb2FkRHJpdmVyKGRyaXZlckNsYXNzTmFtZSk7CisgICAgICAgIHJldHVybiBuZXdJbnN0YW5jZSh1cmwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEF0dGVtcHRzIHRvIGxvYWQgdGhlIEpEQkMgZHJpdmVyIG9uIHRoZSB0aHJlYWQsIGN1cnJlbnQgb3Igc3lzdGVtIGNsYXNzCisgICAgICogbG9hZGVycworICAgICAqCisgICAgICogQHBhcmFtIGRyaXZlckNsYXNzTmFtZQorICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2FkRHJpdmVyKFN0cmluZyBkcml2ZXJDbGFzc05hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gbGV0cyB0cnkgdGhlIHRocmVhZCBjb250ZXh0IGNsYXNzIGxvYWRlciBmaXJzdAorICAgICAgICAvLyBsZXRzIHRyeSB0byB1c2UgdGhlIHN5c3RlbSBjbGFzcyBsb2FkZXIKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENsYXNzLmZvck5hbWUoZHJpdmVyQ2xhc3NOYW1lKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkubG9hZENsYXNzKGRyaXZlckNsYXNzTmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlMikgeworICAgICAgICAgICAgICAgIC8vIG5vdyBsZXRzIHRyeSB0aGUgY2xhc3Nsb2FkZXIgd2hpY2ggbG9hZGVkIHVzCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgU3FsLmNsYXNzLmdldENsYXNzTG9hZGVyKCkubG9hZENsYXNzKGRyaXZlckNsYXNzTmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUzKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBPdXRQYXJhbWV0ZXIgQVJSQVkgICAgICAgICA9IG5ldyBPdXRQYXJhbWV0ZXIoKXsgcHVibGljIGludCBnZXRUeXBlKCkgeyByZXR1cm4gVHlwZXMuQVJSQVk7IH19OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT3V0UGFyYW1ldGVyIEJJR0lOVCAgICAgICAgPSBuZXcgT3V0UGFyYW1ldGVyKCl7IHB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsgcmV0dXJuIFR5cGVzLkJJR0lOVDsgfX07CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBPdXRQYXJhbWV0ZXIgQklOQVJZICAgICAgICA9IG5ldyBPdXRQYXJhbWV0ZXIoKXsgcHVibGljIGludCBnZXRUeXBlKCkgeyByZXR1cm4gVHlwZXMuQklOQVJZOyB9fTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE91dFBhcmFtZXRlciBCSVQgICAgICAgICAgID0gbmV3IE91dFBhcmFtZXRlcigpeyBwdWJsaWMgaW50IGdldFR5cGUoKSB7IHJldHVybiBUeXBlcy5CSVQ7IH19OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT3V0UGFyYW1ldGVyIEJMT0IgICAgICAgICAgPSBuZXcgT3V0UGFyYW1ldGVyKCl7IHB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsgcmV0dXJuIFR5cGVzLkJMT0I7IH19OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT3V0UGFyYW1ldGVyIEJPT0xFQU4gICAgICAgPSBuZXcgT3V0UGFyYW1ldGVyKCl7IHB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsgcmV0dXJuIFR5cGVzLkJPT0xFQU47IH19OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT3V0UGFyYW1ldGVyIENIQVIgICAgICAgICAgPSBuZXcgT3V0UGFyYW1ldGVyKCl7IHB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsgcmV0dXJuIFR5cGVzLkNIQVI7IH19OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT3V0UGFyYW1ldGVyIENMT0IgICAgICAgICAgPSBuZXcgT3V0UGFyYW1ldGVyKCl7IHB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsgcmV0dXJuIFR5cGVzLkNMT0I7IH19OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT3V0UGFyYW1ldGVyIERBVEFMSU5LICAgICAgPSBuZXcgT3V0UGFyYW1ldGVyKCl7IHB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsgcmV0dXJuIFR5cGVzLkRBVEFMSU5LOyB9fTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE91dFBhcmFtZXRlciBEQVRFICAgICAgICAgID0gbmV3IE91dFBhcmFtZXRlcigpeyBwdWJsaWMgaW50IGdldFR5cGUoKSB7IHJldHVybiBUeXBlcy5EQVRFOyB9fTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE91dFBhcmFtZXRlciBERUNJTUFMICAgICAgID0gbmV3IE91dFBhcmFtZXRlcigpeyBwdWJsaWMgaW50IGdldFR5cGUoKSB7IHJldHVybiBUeXBlcy5ERUNJTUFMOyB9fTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE91dFBhcmFtZXRlciBESVNUSU5DVCAgICAgID0gbmV3IE91dFBhcmFtZXRlcigpeyBwdWJsaWMgaW50IGdldFR5cGUoKSB7IHJldHVybiBUeXBlcy5ESVNUSU5DVDsgfX07CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBPdXRQYXJhbWV0ZXIgRE9VQkxFICAgICAgICA9IG5ldyBPdXRQYXJhbWV0ZXIoKXsgcHVibGljIGludCBnZXRUeXBlKCkgeyByZXR1cm4gVHlwZXMuRE9VQkxFOyB9fTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE91dFBhcmFtZXRlciBGTE9BVCAgICAgICAgID0gbmV3IE91dFBhcmFtZXRlcigpeyBwdWJsaWMgaW50IGdldFR5cGUoKSB7IHJldHVybiBUeXBlcy5GTE9BVDsgfX07CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBPdXRQYXJhbWV0ZXIgSU5URUdFUiAgICAgICA9IG5ldyBPdXRQYXJhbWV0ZXIoKXsgcHVibGljIGludCBnZXRUeXBlKCkgeyByZXR1cm4gVHlwZXMuSU5URUdFUjsgfX07CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBPdXRQYXJhbWV0ZXIgSkFWQV9PQkpFQ1QgICA9IG5ldyBPdXRQYXJhbWV0ZXIoKXsgcHVibGljIGludCBnZXRUeXBlKCkgeyByZXR1cm4gVHlwZXMuSkFWQV9PQkpFQ1Q7IH19OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT3V0UGFyYW1ldGVyIExPTkdWQVJCSU5BUlkgPSBuZXcgT3V0UGFyYW1ldGVyKCl7IHB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsgcmV0dXJuIFR5cGVzLkxPTkdWQVJCSU5BUlk7IH19OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT3V0UGFyYW1ldGVyIExPTkdWQVJDSEFSICAgPSBuZXcgT3V0UGFyYW1ldGVyKCl7IHB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsgcmV0dXJuIFR5cGVzLkxPTkdWQVJDSEFSOyB9fTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE91dFBhcmFtZXRlciBOVUxMICAgICAgICAgID0gbmV3IE91dFBhcmFtZXRlcigpeyBwdWJsaWMgaW50IGdldFR5cGUoKSB7IHJldHVybiBUeXBlcy5OVUxMOyB9fTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE91dFBhcmFtZXRlciBOVU1FUklDICAgICAgID0gbmV3IE91dFBhcmFtZXRlcigpeyBwdWJsaWMgaW50IGdldFR5cGUoKSB7IHJldHVybiBUeXBlcy5OVU1FUklDOyB9fTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE91dFBhcmFtZXRlciBPVEhFUiAgICAgICAgID0gbmV3IE91dFBhcmFtZXRlcigpeyBwdWJsaWMgaW50IGdldFR5cGUoKSB7IHJldHVybiBUeXBlcy5PVEhFUjsgfX07CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBPdXRQYXJhbWV0ZXIgUkVBTCAgICAgICAgICA9IG5ldyBPdXRQYXJhbWV0ZXIoKXsgcHVibGljIGludCBnZXRUeXBlKCkgeyByZXR1cm4gVHlwZXMuUkVBTDsgfX07CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBPdXRQYXJhbWV0ZXIgUkVGICAgICAgICAgICA9IG5ldyBPdXRQYXJhbWV0ZXIoKXsgcHVibGljIGludCBnZXRUeXBlKCkgeyByZXR1cm4gVHlwZXMuUkVGOyB9fTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE91dFBhcmFtZXRlciBTTUFMTElOVCAgICAgID0gbmV3IE91dFBhcmFtZXRlcigpeyBwdWJsaWMgaW50IGdldFR5cGUoKSB7IHJldHVybiBUeXBlcy5TTUFMTElOVDsgfX07CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBPdXRQYXJhbWV0ZXIgU1RSVUNUICAgICAgICA9IG5ldyBPdXRQYXJhbWV0ZXIoKXsgcHVibGljIGludCBnZXRUeXBlKCkgeyByZXR1cm4gVHlwZXMuU1RSVUNUOyB9fTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE91dFBhcmFtZXRlciBUSU1FICAgICAgICAgID0gbmV3IE91dFBhcmFtZXRlcigpeyBwdWJsaWMgaW50IGdldFR5cGUoKSB7IHJldHVybiBUeXBlcy5USU1FOyB9fTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE91dFBhcmFtZXRlciBUSU1FU1RBTVAgICAgID0gbmV3IE91dFBhcmFtZXRlcigpeyBwdWJsaWMgaW50IGdldFR5cGUoKSB7IHJldHVybiBUeXBlcy5USU1FU1RBTVA7IH19OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT3V0UGFyYW1ldGVyIFRJTllJTlQgICAgICAgPSBuZXcgT3V0UGFyYW1ldGVyKCl7IHB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsgcmV0dXJuIFR5cGVzLlRJTllJTlQ7IH19OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT3V0UGFyYW1ldGVyIFZBUkJJTkFSWSAgICAgPSBuZXcgT3V0UGFyYW1ldGVyKCl7IHB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsgcmV0dXJuIFR5cGVzLlZBUkJJTkFSWTsgfX07CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBPdXRQYXJhbWV0ZXIgVkFSQ0hBUiAgICAgICA9IG5ldyBPdXRQYXJhbWV0ZXIoKXsgcHVibGljIGludCBnZXRUeXBlKCkgeyByZXR1cm4gVHlwZXMuVkFSQ0hBUjsgfX07CisKKyAgICBwdWJsaWMgc3RhdGljIEluUGFyYW1ldGVyIEFSUkFZKE9iamVjdCB2YWx1ZSkgeyByZXR1cm4gaW4oVHlwZXMuQVJSQVksIHZhbHVlKTsgfQorICAgIHB1YmxpYyBzdGF0aWMgSW5QYXJhbWV0ZXIgQklHSU5UKE9iamVjdCB2YWx1ZSkgeyByZXR1cm4gaW4oVHlwZXMuQklHSU5ULCB2YWx1ZSk7IH0KKyAgICBwdWJsaWMgc3RhdGljIEluUGFyYW1ldGVyIEJJTkFSWShPYmplY3QgdmFsdWUpIHsgcmV0dXJuIGluKFR5cGVzLkJJTkFSWSwgdmFsdWUpOyB9CisgICAgcHVibGljIHN0YXRpYyBJblBhcmFtZXRlciBCSVQoT2JqZWN0IHZhbHVlKSB7IHJldHVybiBpbihUeXBlcy5CSVQsIHZhbHVlKTsgfQorICAgIHB1YmxpYyBzdGF0aWMgSW5QYXJhbWV0ZXIgQkxPQihPYmplY3QgdmFsdWUpIHsgcmV0dXJuIGluKFR5cGVzLkJMT0IsIHZhbHVlKTsgfQorICAgIHB1YmxpYyBzdGF0aWMgSW5QYXJhbWV0ZXIgQk9PTEVBTihPYmplY3QgdmFsdWUpIHsgcmV0dXJuIGluKFR5cGVzLkJPT0xFQU4sIHZhbHVlKTsgfQorICAgIHB1YmxpYyBzdGF0aWMgSW5QYXJhbWV0ZXIgQ0hBUihPYmplY3QgdmFsdWUpIHsgcmV0dXJuIGluKFR5cGVzLkNIQVIsIHZhbHVlKTsgfQorICAgIHB1YmxpYyBzdGF0aWMgSW5QYXJhbWV0ZXIgQ0xPQihPYmplY3QgdmFsdWUpIHsgcmV0dXJuIGluKFR5cGVzLkNMT0IsIHZhbHVlKTsgfQorICAgIHB1YmxpYyBzdGF0aWMgSW5QYXJhbWV0ZXIgREFUQUxJTksoT2JqZWN0IHZhbHVlKSB7IHJldHVybiBpbihUeXBlcy5EQVRBTElOSywgdmFsdWUpOyB9CisgICAgcHVibGljIHN0YXRpYyBJblBhcmFtZXRlciBEQVRFKE9iamVjdCB2YWx1ZSkgeyByZXR1cm4gaW4oVHlwZXMuREFURSwgdmFsdWUpOyB9CisgICAgcHVibGljIHN0YXRpYyBJblBhcmFtZXRlciBERUNJTUFMKE9iamVjdCB2YWx1ZSkgeyByZXR1cm4gaW4oVHlwZXMuREVDSU1BTCwgdmFsdWUpOyB9CisgICAgcHVibGljIHN0YXRpYyBJblBhcmFtZXRlciBESVNUSU5DVChPYmplY3QgdmFsdWUpIHsgcmV0dXJuIGluKFR5cGVzLkRJU1RJTkNULCB2YWx1ZSk7IH0KKyAgICBwdWJsaWMgc3RhdGljIEluUGFyYW1ldGVyIERPVUJMRShPYmplY3QgdmFsdWUpIHsgcmV0dXJuIGluKFR5cGVzLkRPVUJMRSwgdmFsdWUpOyB9CisgICAgcHVibGljIHN0YXRpYyBJblBhcmFtZXRlciBGTE9BVChPYmplY3QgdmFsdWUpIHsgcmV0dXJuIGluKFR5cGVzLkZMT0FULCB2YWx1ZSk7IH0KKyAgICBwdWJsaWMgc3RhdGljIEluUGFyYW1ldGVyIElOVEVHRVIoT2JqZWN0IHZhbHVlKSB7IHJldHVybiBpbihUeXBlcy5JTlRFR0VSLCB2YWx1ZSk7IH0KKyAgICBwdWJsaWMgc3RhdGljIEluUGFyYW1ldGVyIEpBVkFfT0JKRUNUKE9iamVjdCB2YWx1ZSkgeyByZXR1cm4gaW4oVHlwZXMuSkFWQV9PQkpFQ1QsIHZhbHVlKTsgfQorICAgIHB1YmxpYyBzdGF0aWMgSW5QYXJhbWV0ZXIgTE9OR1ZBUkJJTkFSWShPYmplY3QgdmFsdWUpIHsgcmV0dXJuIGluKFR5cGVzLkxPTkdWQVJCSU5BUlksIHZhbHVlKTsgfQorICAgIHB1YmxpYyBzdGF0aWMgSW5QYXJhbWV0ZXIgTE9OR1ZBUkNIQVIoT2JqZWN0IHZhbHVlKSB7IHJldHVybiBpbihUeXBlcy5MT05HVkFSQ0hBUiwgdmFsdWUpOyB9CisgICAgcHVibGljIHN0YXRpYyBJblBhcmFtZXRlciBOVUxMKE9iamVjdCB2YWx1ZSkgeyByZXR1cm4gaW4oVHlwZXMuTlVMTCwgdmFsdWUpOyB9CisgICAgcHVibGljIHN0YXRpYyBJblBhcmFtZXRlciBOVU1FUklDKE9iamVjdCB2YWx1ZSkgeyByZXR1cm4gaW4oVHlwZXMuTlVNRVJJQywgdmFsdWUpOyB9CisgICAgcHVibGljIHN0YXRpYyBJblBhcmFtZXRlciBPVEhFUihPYmplY3QgdmFsdWUpIHsgcmV0dXJuIGluKFR5cGVzLk9USEVSLCB2YWx1ZSk7IH0KKyAgICBwdWJsaWMgc3RhdGljIEluUGFyYW1ldGVyIFJFQUwoT2JqZWN0IHZhbHVlKSB7IHJldHVybiBpbihUeXBlcy5SRUFMLCB2YWx1ZSk7IH0KKyAgICBwdWJsaWMgc3RhdGljIEluUGFyYW1ldGVyIFJFRihPYmplY3QgdmFsdWUpIHsgcmV0dXJuIGluKFR5cGVzLlJFRiwgdmFsdWUpOyB9CisgICAgcHVibGljIHN0YXRpYyBJblBhcmFtZXRlciBTTUFMTElOVChPYmplY3QgdmFsdWUpIHsgcmV0dXJuIGluKFR5cGVzLlNNQUxMSU5ULCB2YWx1ZSk7IH0KKyAgICBwdWJsaWMgc3RhdGljIEluUGFyYW1ldGVyIFNUUlVDVChPYmplY3QgdmFsdWUpIHsgcmV0dXJuIGluKFR5cGVzLlNUUlVDVCwgdmFsdWUpOyB9CisgICAgcHVibGljIHN0YXRpYyBJblBhcmFtZXRlciBUSU1FKE9iamVjdCB2YWx1ZSkgeyByZXR1cm4gaW4oVHlwZXMuVElNRSwgdmFsdWUpOyB9CisgICAgcHVibGljIHN0YXRpYyBJblBhcmFtZXRlciBUSU1FU1RBTVAoT2JqZWN0IHZhbHVlKSB7IHJldHVybiBpbihUeXBlcy5USU1FU1RBTVAsIHZhbHVlKTsgfQorICAgIHB1YmxpYyBzdGF0aWMgSW5QYXJhbWV0ZXIgVElOWUlOVChPYmplY3QgdmFsdWUpIHsgcmV0dXJuIGluKFR5cGVzLlRJTllJTlQsIHZhbHVlKTsgfQorICAgIHB1YmxpYyBzdGF0aWMgSW5QYXJhbWV0ZXIgVkFSQklOQVJZKE9iamVjdCB2YWx1ZSkgeyByZXR1cm4gaW4oVHlwZXMuVkFSQklOQVJZLCB2YWx1ZSk7IH0KKyAgICBwdWJsaWMgc3RhdGljIEluUGFyYW1ldGVyIFZBUkNIQVIoT2JqZWN0IHZhbHVlKSB7IHJldHVybiBpbihUeXBlcy5WQVJDSEFSLCB2YWx1ZSk7IH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBJblBhcmFtZXRlcgorICAgICAqIEBwYXJhbSB0eXBlIHRoZSBKREJDIGRhdGEgdHlwZQorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgb2JqZWN0IHZhbHVlCisgICAgICogQHJldHVybiBhbiBJblBhcmFtZXRlcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgSW5QYXJhbWV0ZXIgaW4oZmluYWwgaW50IHR5cGUsIGZpbmFsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gbmV3IEluUGFyYW1ldGVyKCkgeworICAgICAgICAgICAgcHVibGljIGludCBnZXRUeXBlKCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0eXBlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBPdXRQYXJhbWV0ZXIKKyAgICAgKiBAcGFyYW0gdHlwZSB0aGUgSkRCQyBkYXRhIHR5cGUuCisgICAgICogQHJldHVybiBhbiBPdXRQYXJhbWV0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE91dFBhcmFtZXRlciBvdXQoZmluYWwgaW50IHR5cGUpeworICAgICAgICByZXR1cm4gbmV3IE91dFBhcmFtZXRlcigpeworICAgICAgICAgICAgcHVibGljIGludCBnZXRUeXBlKCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0eXBlOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gaW5vdXQgcGFyYW1ldGVyIHVzaW5nIHRoaXMgaW4gcGFyYW1ldGVyLgorICAgICAqIEBwYXJhbSBpbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgSW5PdXRQYXJhbWV0ZXIgaW5vdXQoZmluYWwgSW5QYXJhbWV0ZXIgaW4peworICAgICAgICByZXR1cm4gbmV3IEluT3V0UGFyYW1ldGVyKCl7CisgICAgICAgICAgICBwdWJsaWMgaW50IGdldFR5cGUoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGluLmdldFR5cGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGluLmdldFZhbHVlKCk7CisgICAgICAgICAgICB9ICAgICAgICAgICAgCisgICAgICAgIH07CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBSZXN1bHRTZXRPdXRQYXJhbWV0ZXIKKyAgICAgKiBAcGFyYW0gdHlwZSB0aGUgSkRCQyBkYXRhIHR5cGUuCisgICAgICogQHJldHVybiBhIFJlc3VsdFNldE91dFBhcmFtZXRlcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUmVzdWx0U2V0T3V0UGFyYW1ldGVyIHJlc3VsdFNldChmaW5hbCBpbnQgdHlwZSl7CisgICAgICAgIHJldHVybiBuZXcgUmVzdWx0U2V0T3V0UGFyYW1ldGVyKCl7CisgICAgICAgICAgICBwdWJsaWMgaW50IGdldFR5cGUoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorICAgICAgICAKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgdmFyaWFibGUgdG8gYmUgZXhwYW5kZWQgaW4gdGhlIFNxbCBzdHJpbmcgcmF0aGVyCisgICAgICogdGhhbiByZXByZXNlbnRpbmcgYW4gc3FsIHBhcmFtZXRlci4KKyAgICAgKiBAcGFyYW0gb2JqZWN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBFeHBhbmRlZFZhcmlhYmxlIGV4cGFuZChmaW5hbCBPYmplY3Qgb2JqZWN0KXsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHBhbmRlZFZhcmlhYmxlKCl7CisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGdldE9iamVjdCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0OworICAgICAgICAgICAgfX07CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gU1FMIGluc3RhbmNlIHVzaW5nIHRoZSBnaXZlbiBEYXRhU291cmNlLiBFYWNoIG9wZXJhdGlvbgorICAgICAqIHdpbGwgdXNlIGEgQ29ubmVjdGlvbiBmcm9tIHRoZSBEYXRhU291cmNlIHBvb2wgYW5kIGNsb3NlIGl0IHdoZW4gdGhlCisgICAgICogb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCBwdXR0aW5nIGl0IGJhY2sgaW50byB0aGUgcG9vbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYXRhU291cmNlCisgICAgICovCisgICAgcHVibGljIFNxbChEYXRhU291cmNlIGRhdGFTb3VyY2UpIHsKKyAgICAgICAgdGhpcy5kYXRhU291cmNlID0gZGF0YVNvdXJjZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIFNRTCBpbnN0YW5jZSB1c2luZyB0aGUgZ2l2ZW4gQ29ubmVjdGlvbi4gSXQgaXMgdGhlIGNhbGxlcidzCisgICAgICogcmVzcG9uc2liaWxpdHkgdG8gY2xvc2UgdGhlIENvbm5lY3Rpb24gYWZ0ZXIgdGhlIFNxbCBpbnN0YW5jZSBoYXMgYmVlbgorICAgICAqIHVzZWQuIFlvdSBjYW4gZG8gdGhpcyBvbiB0aGUgY29ubmVjdGlvbiBvYmplY3QgZGlyZWN0bHkgb3IgYnkgY2FsbGluZyB0aGUKKyAgICAgKiB7QGxpbmsgamF2YS5zcWwuQ29ubmVjdGlvbiNjbG9zZSgpfSAgbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgU3FsKENvbm5lY3Rpb24gY29ubmVjdGlvbikgeworICAgICAgICBpZiAoY29ubmVjdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIk11c3Qgc3BlY2lmeSBhIG5vbi1udWxsIENvbm5lY3Rpb24iKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnVzZUNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBTcWwoU3FsIHBhcmVudCkgeworICAgICAgICB0aGlzLmRhdGFTb3VyY2UgPSBwYXJlbnQuZGF0YVNvdXJjZTsKKyAgICAgICAgdGhpcy51c2VDb25uZWN0aW9uID0gcGFyZW50LnVzZUNvbm5lY3Rpb247CisgICAgfQorCisgICAgcHVibGljIERhdGFTZXQgZGF0YVNldChTdHJpbmcgdGFibGUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEYXRhU2V0KHRoaXMsIHRhYmxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRGF0YVNldCBkYXRhU2V0KENsYXNzIHR5cGUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEYXRhU2V0KHRoaXMsIHR5cGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm1zIHRoZSBnaXZlbiBTUUwgcXVlcnkgY2FsbGluZyB0aGUgY2xvc3VyZSB3aXRoIHRoZSByZXN1bHQgc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgcXVlcnkoU3RyaW5nIHNxbCwgQ2xvc3VyZSBjbG9zdXJlKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gY3JlYXRlQ29ubmVjdGlvbigpOworICAgICAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gY29ubmVjdGlvbi5jcmVhdGVTdGF0ZW1lbnQoKTsKKyAgICAgICAgY29uZmlndXJlKHN0YXRlbWVudCk7CisgICAgICAgIFJlc3VsdFNldCByZXN1bHRzID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxvZy5maW5lKHNxbCk7CisgICAgICAgICAgICByZXN1bHRzID0gc3RhdGVtZW50LmV4ZWN1dGVRdWVyeShzcWwpOworICAgICAgICAgICAgY2xvc3VyZS5jYWxsKHJlc3VsdHMpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nLmxvZyhMZXZlbC5GSU5FLCAiRmFpbGVkIHRvIGV4ZWN1dGU6ICIgKyBzcWwsIGUpOworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgIGNsb3NlUmVzb3VyY2VzKGNvbm5lY3Rpb24sIHN0YXRlbWVudCwgcmVzdWx0cyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtcyB0aGUgZ2l2ZW4gU1FMIHF1ZXJ5IHdpdGggcGFyYW1ldGVycyBjYWxsaW5nIHRoZSBjbG9zdXJlIHdpdGggdGhlCisgICAgICogcmVzdWx0IHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHF1ZXJ5KFN0cmluZyBzcWwsIExpc3QgcGFyYW1zLCBDbG9zdXJlIGNsb3N1cmUpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSBjcmVhdGVDb25uZWN0aW9uKCk7CisgICAgICAgIFByZXBhcmVkU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7CisgICAgICAgIFJlc3VsdFNldCByZXN1bHRzID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxvZy5maW5lKHNxbCk7CisgICAgICAgICAgICBzdGF0ZW1lbnQgPSBjb25uZWN0aW9uLnByZXBhcmVTdGF0ZW1lbnQoc3FsKTsKKyAgICAgICAgICAgIHNldFBhcmFtZXRlcnMocGFyYW1zLCBzdGF0ZW1lbnQpOworICAgICAgICAgICAgY29uZmlndXJlKHN0YXRlbWVudCk7CisgICAgICAgICAgICByZXN1bHRzID0gc3RhdGVtZW50LmV4ZWN1dGVRdWVyeSgpOworICAgICAgICAgICAgY2xvc3VyZS5jYWxsKHJlc3VsdHMpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nLmxvZyhMZXZlbC5GSU5FLCAiRmFpbGVkIHRvIGV4ZWN1dGU6ICIgKyBzcWwsIGUpOworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgIGNsb3NlUmVzb3VyY2VzKGNvbm5lY3Rpb24sIHN0YXRlbWVudCwgcmVzdWx0cyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtcyB0aGUgZ2l2ZW4gU1FMIHF1ZXJ5IGNhbGxpbmcgdGhlIGNsb3N1cmUgd2l0aCB0aGUgcmVzdWx0IHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHF1ZXJ5KEdTdHJpbmcgZ3N0cmluZywgQ2xvc3VyZSBjbG9zdXJlKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgTGlzdCBwYXJhbXMgPSBnZXRQYXJhbWV0ZXJzKGdzdHJpbmcpOworICAgICAgICBTdHJpbmcgc3FsID0gYXNTcWwoZ3N0cmluZywgcGFyYW1zKTsKKyAgICAgICAgcXVlcnkoc3FsLCBwYXJhbXMsIGNsb3N1cmUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkIHBsZWFzZSB1c2UgZWFjaFJvdyBpbnN0ZWFkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcXVlcnlFYWNoKFN0cmluZyBzcWwsIENsb3N1cmUgY2xvc3VyZSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIHdhcm5EZXByZWNhdGVkKCk7CisgICAgICAgIGVhY2hSb3coc3FsLCBjbG9zdXJlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtcyB0aGUgZ2l2ZW4gU1FMIHF1ZXJ5IGNhbGxpbmcgdGhlIGNsb3N1cmUgd2l0aCBlYWNoIHJvdyBvZiB0aGUKKyAgICAgKiByZXN1bHQgc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgZWFjaFJvdyhTdHJpbmcgc3FsLCBDbG9zdXJlIGNsb3N1cmUpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBlYWNoUm93KHNxbCwoQ2xvc3VyZSkgbnVsbCxjbG9zdXJlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtcyB0aGUgZ2l2ZW4gU1FMIHF1ZXJ5IGNhbGxpbmcgY2xvc3VyZXMgZm9yIG1ldGFkYXRhIGFuZCBlYWNoIHJvdworICAgICAqIEBwYXJhbSBzcWwgdGhlIHNxbCBzdGF0ZW1lbnQKKyAgICAgKiBAcGFyYW0gbWV0YUNsb3N1cmUgY2FsbGVkIGZvciBtZXRhIGRhdGEgKG9ubHkgb25jZSBhZnRlciBzcWwgZXhlY3V0aW9uKQorICAgICAqIEBwYXJhbSByb3dDbG9zdXJlIGNhbGxlZCBmb3IgZWFjaCByb3cgd2l0aCBhIEdyb292eVJlc3VsdFNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGVhY2hSb3coU3RyaW5nIHNxbCwgQ2xvc3VyZSBtZXRhQ2xvc3VyZSwgQ2xvc3VyZSByb3dDbG9zdXJlKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gY3JlYXRlQ29ubmVjdGlvbigpOworICAgICAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gY29ubmVjdGlvbi5jcmVhdGVTdGF0ZW1lbnQoKTsKKyAgICAgICAgY29uZmlndXJlKHN0YXRlbWVudCk7CisgICAgICAgIFJlc3VsdFNldCByZXN1bHRzID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxvZy5maW5lKHNxbCk7CisgICAgICAgICAgICByZXN1bHRzID0gc3RhdGVtZW50LmV4ZWN1dGVRdWVyeShzcWwpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAobWV0YUNsb3N1cmUhPW51bGwpIG1ldGFDbG9zdXJlLmNhbGwoIHJlc3VsdHMuZ2V0TWV0YURhdGEoKSApOworICAgICAgICAgICAgCisgICAgICAgICAgICBHcm9vdnlSZXN1bHRTZXQgZ3Jvb3Z5UlMgPSBuZXcgR3Jvb3Z5UmVzdWx0U2V0UHJveHkocmVzdWx0cykuZ2V0SW1wbCgpOworICAgICAgICAgICAgd2hpbGUgKGdyb292eVJTLm5leHQoKSkgeworICAgICAgICAgICAgICAgIHJvd0Nsb3N1cmUuY2FsbChncm9vdnlSUyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2cubG9nKExldmVsLkZJTkUsICJGYWlsZWQgdG8gZXhlY3V0ZTogIiArIHNxbCwgZSk7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgY2xvc2VSZXNvdXJjZXMoY29ubmVjdGlvbiwgc3RhdGVtZW50LCByZXN1bHRzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkIHBsZWFzZSB1c2UgZWFjaFJvdyBpbnN0ZWFkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcXVlcnlFYWNoKFN0cmluZyBzcWwsIExpc3QgcGFyYW1zLCBDbG9zdXJlIGNsb3N1cmUpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICB3YXJuRGVwcmVjYXRlZCgpOworICAgICAgICBlYWNoUm93KHNxbCwgcGFyYW1zLCBjbG9zdXJlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtcyB0aGUgZ2l2ZW4gU1FMIHF1ZXJ5IGNhbGxpbmcgdGhlIGNsb3N1cmUgd2l0aCB0aGUgcmVzdWx0IHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGVhY2hSb3coU3RyaW5nIHNxbCwgTGlzdCBwYXJhbXMsIENsb3N1cmUgY2xvc3VyZSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IGNyZWF0ZUNvbm5lY3Rpb24oKTsKKyAgICAgICAgUHJlcGFyZWRTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgUmVzdWx0U2V0IHJlc3VsdHMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbG9nLmZpbmUoc3FsKTsKKyAgICAgICAgICAgIHN0YXRlbWVudCA9IGNvbm5lY3Rpb24ucHJlcGFyZVN0YXRlbWVudChzcWwpOworICAgICAgICAgICAgc2V0UGFyYW1ldGVycyhwYXJhbXMsIHN0YXRlbWVudCk7CisgICAgICAgICAgICBjb25maWd1cmUoc3RhdGVtZW50KTsKKyAgICAgICAgICAgIHJlc3VsdHMgPSBzdGF0ZW1lbnQuZXhlY3V0ZVF1ZXJ5KCk7CisKKyAgICAgICAgICAgIEdyb292eVJlc3VsdFNldCBncm9vdnlSUyA9IG5ldyBHcm9vdnlSZXN1bHRTZXRQcm94eShyZXN1bHRzKS5nZXRJbXBsKCk7CisgICAgICAgICAgICB3aGlsZSAoZ3Jvb3Z5UlMubmV4dCgpKSB7CisgICAgICAgICAgICAgICAgY2xvc3VyZS5jYWxsKGdyb292eVJTKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZy5sb2coTGV2ZWwuRklORSwgIkZhaWxlZCB0byBleGVjdXRlOiAiICsgc3FsLCBlKTsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgICBjbG9zZVJlc291cmNlcyhjb25uZWN0aW9uLCBzdGF0ZW1lbnQsIHJlc3VsdHMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVyZm9ybXMgdGhlIGdpdmVuIFNRTCBxdWVyeSBjYWxsaW5nIHRoZSBjbG9zdXJlIHdpdGggdGhlIHJlc3VsdCBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBlYWNoUm93KEdTdHJpbmcgZ3N0cmluZywgQ2xvc3VyZSBjbG9zdXJlKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgTGlzdCBwYXJhbXMgPSBnZXRQYXJhbWV0ZXJzKGdzdHJpbmcpOworICAgICAgICBTdHJpbmcgc3FsID0gYXNTcWwoZ3N0cmluZywgcGFyYW1zKTsKKyAgICAgICAgZWFjaFJvdyhzcWwsIHBhcmFtcywgY2xvc3VyZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQgcGxlYXNlIHVzZSBlYWNoUm93IGluc3RlYWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBxdWVyeUVhY2goR1N0cmluZyBnc3RyaW5nLCBDbG9zdXJlIGNsb3N1cmUpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICB3YXJuRGVwcmVjYXRlZCgpOworICAgICAgICBlYWNoUm93KGdzdHJpbmcsIGNsb3N1cmUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm1zIHRoZSBnaXZlbiBTUUwgcXVlcnkgYW5kIHJldHVybiB0aGUgcm93cyBvZiB0aGUgcmVzdWx0IHNldAorICAgICAqLworICAgICBwdWJsaWMgTGlzdCByb3dzKFN0cmluZyBzcWwpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gcm93cyhzcWwsKENsb3N1cmUpIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm1zIHRoZSBnaXZlbiBTUUwgcXVlcnkgYW5kIHJldHVybiB0aGUgcm93cyBvZiB0aGUgcmVzdWx0IHNldAorICAgICAqIEBwYXJhbSBzcWwgdGhlIFNRTCBzdGF0ZW1lbnQKKyAgICAgKiBAcGFyYW0gbWV0YUNsb3N1cmUgY2FsbGVkIHdpdGggbWV0YSBkYXRhIG9mIHRoZSBSZXN1bHRTZXQKKyAgICAgKi8KKyAgICAgcHVibGljIExpc3Qgcm93cyhTdHJpbmcgc3FsLCBDbG9zdXJlIG1ldGFDbG9zdXJlKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgIExpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgIENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IGNyZWF0ZUNvbm5lY3Rpb24oKTsKKyAgICAgICAgIFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBjb25uZWN0aW9uLmNyZWF0ZVN0YXRlbWVudCgpOworICAgICAgICAgY29uZmlndXJlKHN0YXRlbWVudCk7CisgICAgICAgICBSZXN1bHRTZXQgcnMgPSBudWxsOworICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICBsb2cuZmluZShzcWwpOworICAgICAgICAgICAgIHJzID0gc3RhdGVtZW50LmV4ZWN1dGVRdWVyeShzcWwpOworCisgICAgICAgICAgICAgaWYgKG1ldGFDbG9zdXJlIT1udWxsKSBtZXRhQ2xvc3VyZS5jYWxsKCBycy5nZXRNZXRhRGF0YSgpICk7CisKKyAgICAgICAgICAgICB3aGlsZSAocnMubmV4dCgpKSB7CisgICAgICAgICAgICAgICAgIFJlc3VsdFNldE1ldGFEYXRhIG1ldGFkYXRhID0gcnMuZ2V0TWV0YURhdGEoKTsKKyAgICAgICAgICAgICAgICAgTGlua2VkSGFzaE1hcCBsaG0gPSBuZXcgTGlua2VkSGFzaE1hcChtZXRhZGF0YS5nZXRDb2x1bW5Db3VudCgpLDEsdHJ1ZSk7CisgICAgICAgICAgICAgICAgIGZvcihpbnQgaT0xIDsgaTw9bWV0YWRhdGEuZ2V0Q29sdW1uQ291bnQoKSA7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgbGhtLnB1dChtZXRhZGF0YS5nZXRDb2x1bW5OYW1lKGkpLHJzLmdldE9iamVjdChpKSk7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgR3Jvb3Z5Um93UmVzdWx0IHJvdyA9IG5ldyBHcm9vdnlSb3dSZXN1bHQobGhtKTsKKyAgICAgICAgICAgICAgICAgcmVzdWx0cy5hZGQocm93KTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgcmV0dXJuKHJlc3VsdHMpOworICAgICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICBsb2cubG9nKExldmVsLkZJTkUsICJGYWlsZWQgdG8gZXhlY3V0ZTogIiArIHNxbCwgZSk7CisgICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgY2xvc2VSZXNvdXJjZXMoY29ubmVjdGlvbiwgc3RhdGVtZW50LCBycyk7CisgICAgICAgICB9CisgICAgfQorICAgICAgCisgICAgLyoqCisgICAgICogUGVyZm9ybXMgdGhlIGdpdmVuIFNRTCBxdWVyeSBhbmQgcmV0dXJuIHRoZSBmaXJzdCByb3cgb2YgdGhlIHJlc3VsdCBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGZpcnN0Um93KFN0cmluZyBzcWwpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBMaXN0IHJvd3MgPSByb3dzKHNxbCk7CisgICAgICAgIGlmIChyb3dzLmlzRW1wdHkoKSkgcmV0dXJuIG51bGw7CisgICAgICAgIHJldHVybihyb3dzLmdldCgwKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVyZm9ybXMgdGhlIGdpdmVuIFNRTCBxdWVyeSB3aXRoIHRoZSBsaXN0IG9mIHBhcmFtcyBhbmQgcmV0dXJuCisgICAgICogdGhlIHJvd3Mgb2YgdGhlIHJlc3VsdCBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdCByb3dzKFN0cmluZyBzcWwsIExpc3QgcGFyYW1zKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgTGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSBjcmVhdGVDb25uZWN0aW9uKCk7CisgICAgICAgIFByZXBhcmVkU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7CisgICAgICAgIFJlc3VsdFNldCBycyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsb2cuZmluZShzcWwpOworICAgICAgICAgICAgc3RhdGVtZW50ID0gY29ubmVjdGlvbi5wcmVwYXJlU3RhdGVtZW50KHNxbCk7CisgICAgICAgICAgICBzZXRQYXJhbWV0ZXJzKHBhcmFtcywgc3RhdGVtZW50KTsKKyAgICAgICAgICAgIGNvbmZpZ3VyZShzdGF0ZW1lbnQpOworICAgICAgICAgICAgcnMgPSBzdGF0ZW1lbnQuZXhlY3V0ZVF1ZXJ5KCk7CisgICAgICAgICAgICB3aGlsZSAocnMubmV4dCgpKSB7CisgICAgICAgICAgICAgICAgUmVzdWx0U2V0TWV0YURhdGEgbWV0YWRhdGEgPSBycy5nZXRNZXRhRGF0YSgpOworICAgICAgICAgICAgICAgIExpbmtlZEhhc2hNYXAgbGhtID0gbmV3IExpbmtlZEhhc2hNYXAobWV0YWRhdGEuZ2V0Q29sdW1uQ291bnQoKSwxLHRydWUpOworICAgICAgICAgICAgICAgIGZvcihpbnQgaT0xIDsgaTw9bWV0YWRhdGEuZ2V0Q29sdW1uQ291bnQoKSA7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBsaG0ucHV0KG1ldGFkYXRhLmdldENvbHVtbk5hbWUoaSkscnMuZ2V0T2JqZWN0KGkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgR3Jvb3Z5Um93UmVzdWx0IHJvdyA9IG5ldyBHcm9vdnlSb3dSZXN1bHQobGhtKTsKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFkZChyb3cpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuKHJlc3VsdHMpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nLmxvZyhMZXZlbC5GSU5FLCAiRmFpbGVkIHRvIGV4ZWN1dGU6ICIgKyBzcWwsIGUpOworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgIGNsb3NlUmVzb3VyY2VzKGNvbm5lY3Rpb24sIHN0YXRlbWVudCwgcnMpOworICAgICAgICB9CisgICAgfQorCisgICAgIC8qKgorICAgICAgKiBQZXJmb3JtcyB0aGUgZ2l2ZW4gU1FMIHF1ZXJ5IHdpdGggdGhlIGxpc3Qgb2YgcGFyYW1zIGFuZCByZXR1cm4KKyAgICAgICogdGhlIGZpcnN0IHJvdyBvZiB0aGUgcmVzdWx0IHNldAorICAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGZpcnN0Um93KFN0cmluZyBzcWwsIExpc3QgcGFyYW1zKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgIExpc3Qgcm93cyA9IHJvd3Moc3FsLCBwYXJhbXMpOworICAgICAgICAgaWYgKHJvd3MuaXNFbXB0eSgpKSByZXR1cm4gbnVsbDsKKyAgICAgICAgIHJldHVybiByb3dzLmdldCgwKTsKKyAgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZXMgdGhlIGdpdmVuIHBpZWNlIG9mIFNRTAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGV4ZWN1dGUoU3RyaW5nIHNxbCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IGNyZWF0ZUNvbm5lY3Rpb24oKTsKKyAgICAgICAgU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsb2cuZmluZShzcWwpOworICAgICAgICAgICAgc3RhdGVtZW50ID0gY29ubmVjdGlvbi5jcmVhdGVTdGF0ZW1lbnQoKTsKKyAgICAgICAgICAgIGNvbmZpZ3VyZShzdGF0ZW1lbnQpOworICAgICAgICAgICAgYm9vbGVhbiBpc1Jlc3VsdFNldCA9IHN0YXRlbWVudC5leGVjdXRlKHNxbCk7CisgICAgICAgICAgICB0aGlzLnVwZGF0ZUNvdW50ID0gc3RhdGVtZW50LmdldFVwZGF0ZUNvdW50KCk7CisgICAgICAgICAgICByZXR1cm4gaXNSZXN1bHRTZXQ7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2cubG9nKExldmVsLkZJTkUsICJGYWlsZWQgdG8gZXhlY3V0ZTogIiArIHNxbCwgZSk7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICAgICAgY2xvc2VSZXNvdXJjZXMoY29ubmVjdGlvbiwgc3RhdGVtZW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEV4ZWN1dGVzIHRoZSBnaXZlbiBTUUwgdXBkYXRlCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHJvd3MgdXBkYXRlZAorICAgICAqLworICAgIHB1YmxpYyBpbnQgZXhlY3V0ZVVwZGF0ZShTdHJpbmcgc3FsKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gY3JlYXRlQ29ubmVjdGlvbigpOworICAgICAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxvZy5maW5lKHNxbCk7CisgICAgICAgICAgICBzdGF0ZW1lbnQgPSBjb25uZWN0aW9uLmNyZWF0ZVN0YXRlbWVudCgpOworICAgICAgICAgICAgY29uZmlndXJlKHN0YXRlbWVudCk7CisgICAgICAgICAgICB0aGlzLnVwZGF0ZUNvdW50ID0gc3RhdGVtZW50LmV4ZWN1dGVVcGRhdGUoc3FsKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZUNvdW50OworICAgICAgICB9CisgICAgICAgIGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nLmxvZyhMZXZlbC5GSU5FLCAiRmFpbGVkIHRvIGV4ZWN1dGU6ICIgKyBzcWwsIGUpOworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgIGNsb3NlUmVzb3VyY2VzKGNvbm5lY3Rpb24sIHN0YXRlbWVudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlcyB0aGUgZ2l2ZW4gU1FMIHN0YXRlbWVudC4gU2VlIHtAbGluayAjZXhlY3V0ZUluc2VydChHU3RyaW5nKX0KKyAgICAgKiBmb3IgbW9yZSBkZXRhaWxzLiAKKyAgICAgKiBAcGFyYW0gc3FsIFRoZSBTUUwgc3RhdGVtZW50IHRvIGV4ZWN1dGUuCisgICAgICogQHJldHVybiBBIGxpc3Qgb2YgdGhlIGF1dG8tZ2VuZXJhdGVkIGNvbHVtbiB2YWx1ZXMgZm9yIGVhY2gKKyAgICAgKiBpbnNlcnRlZCByb3cuCisgICAgICovCisgICAgcHVibGljIExpc3QgZXhlY3V0ZUluc2VydChTdHJpbmcgc3FsKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gY3JlYXRlQ29ubmVjdGlvbigpOworICAgICAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxvZy5maW5lKHNxbCk7CisgICAgICAgICAgICBzdGF0ZW1lbnQgPSBjb25uZWN0aW9uLmNyZWF0ZVN0YXRlbWVudCgpOworICAgICAgICAgICAgY29uZmlndXJlKHN0YXRlbWVudCk7CisgICAgICAgICAgICBib29sZWFuIGhhc1Jlc3VsdFNldCA9IHN0YXRlbWVudC5leGVjdXRlKHNxbCwgU3RhdGVtZW50LlJFVFVSTl9HRU5FUkFURURfS0VZUyk7CisKKyAgICAgICAgICAgIC8vIFByZXBhcmUgYSBsaXN0IHRvIGNvbnRhaW4gdGhlIGF1dG8tZ2VuZXJhdGVkIGNvbHVtbgorICAgICAgICAgICAgLy8gdmFsdWVzLCBhbmQgdGhlbiBmZXRjaCB0aGVtIGZyb20gdGhlIHN0YXRlbWVudC4KKyAgICAgICAgICAgIExpc3QgYXV0b0tleXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIAlSZXN1bHRTZXQga2V5cyA9IHN0YXRlbWVudC5nZXRHZW5lcmF0ZWRLZXlzKCk7CisgICAgICAgIAlpbnQgY291bnQgPSBrZXlzLmdldE1ldGFEYXRhKCkuZ2V0Q29sdW1uQ291bnQoKTsKKworICAgICAgICAJLy8gQ29weSB0aGUgY29sdW1uIHZhbHVlcyBpbnRvIGEgbGlzdCBvZiBhIGxpc3QuCisgICAgICAgIAl3aGlsZSAoa2V5cy5uZXh0KCkpIHsKKyAgICAgICAgCQlMaXN0IHJvd0tleXMgPSBuZXcgQXJyYXlMaXN0KGNvdW50KTsKKyAgICAgICAgCQlmb3IgKGludCBpID0gMTsgaSA8PSBjb3VudDsgaSsrKSB7CisgICAgICAgIAkJCXJvd0tleXMuYWRkKGtleXMuZ2V0T2JqZWN0KGkpKTsKKyAgICAgICAgCQl9CisKKyAgICAgICAgCQlhdXRvS2V5cy5hZGQocm93S2V5cyk7CisgICAgICAgIAl9CisKKyAgICAgICAgCS8vIFN0b3JlIHRoZSB1cGRhdGUgY291bnQgc28gdGhhdCBpdCBjYW4gYmUgcmV0cmlldmVkIGJ5CisgICAgICAgIAkvLyBjbGllbnRzLCBhbmQgdGhlbiByZXR1cm4gdGhlIGxpc3Qgb2YgYXV0by1nZW5lcmF0ZWQKKyAgICAgICAgCS8vIHZhbHVlcy4KKyAgICAgICAgCXRoaXMudXBkYXRlQ291bnQgPSBzdGF0ZW1lbnQuZ2V0VXBkYXRlQ291bnQoKTsKKyAgICAgICAgCXJldHVybiBhdXRvS2V5czsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZy5sb2coTGV2ZWwuRklORSwgIkZhaWxlZCB0byBleGVjdXRlOiAiICsgc3FsLCBlKTsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgICBjbG9zZVJlc291cmNlcyhjb25uZWN0aW9uLCBzdGF0ZW1lbnQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZXMgdGhlIGdpdmVuIHBpZWNlIG9mIFNRTCB3aXRoIHBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBleGVjdXRlKFN0cmluZyBzcWwsIExpc3QgcGFyYW1zKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gY3JlYXRlQ29ubmVjdGlvbigpOworICAgICAgICBQcmVwYXJlZFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbG9nLmZpbmUoc3FsKTsKKyAgICAgICAgICAgIHN0YXRlbWVudCA9IGNvbm5lY3Rpb24ucHJlcGFyZVN0YXRlbWVudChzcWwpOworICAgICAgICAgICAgc2V0UGFyYW1ldGVycyhwYXJhbXMsIHN0YXRlbWVudCk7CisgICAgICAgICAgICBjb25maWd1cmUoc3RhdGVtZW50KTsKKyAgICAgICAgICAgIGJvb2xlYW4gaXNSZXN1bHRTZXQgPSBzdGF0ZW1lbnQuZXhlY3V0ZSgpOworICAgICAgICAgICAgdGhpcy51cGRhdGVDb3VudCA9IHN0YXRlbWVudC5nZXRVcGRhdGVDb3VudCgpOworICAgICAgICAgICAgcmV0dXJuIGlzUmVzdWx0U2V0OworICAgICAgICB9CisgICAgICAgIGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nLmxvZyhMZXZlbC5GSU5FLCAiRmFpbGVkIHRvIGV4ZWN1dGU6ICIgKyBzcWwsIGUpOworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgIGNsb3NlUmVzb3VyY2VzKGNvbm5lY3Rpb24sIHN0YXRlbWVudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlcyB0aGUgZ2l2ZW4gU1FMIHVwZGF0ZSB3aXRoIHBhcmFtZXRlcnMKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2Ygcm93cyB1cGRhdGVkCisgICAgICovCisgICAgcHVibGljIGludCBleGVjdXRlVXBkYXRlKFN0cmluZyBzcWwsIExpc3QgcGFyYW1zKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICAgICAgQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gY3JlYXRlQ29ubmVjdGlvbigpOworICAgICAgICBQcmVwYXJlZFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbG9nLmZpbmUoc3FsKTsKKyAgICAgICAgICAgIHN0YXRlbWVudCA9IGNvbm5lY3Rpb24ucHJlcGFyZVN0YXRlbWVudChzcWwpOworICAgICAgICAgICAgc2V0UGFyYW1ldGVycyhwYXJhbXMsIHN0YXRlbWVudCk7CisgICAgICAgICAgICBjb25maWd1cmUoc3RhdGVtZW50KTsKKyAgICAgICAgICAgIHRoaXMudXBkYXRlQ291bnQgPSBzdGF0ZW1lbnQuZXhlY3V0ZVVwZGF0ZSgpOworICAgICAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlQ291bnQ7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2cubG9nKExldmVsLkZJTkUsICJGYWlsZWQgdG8gZXhlY3V0ZTogIiArIHNxbCwgZSk7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICAgICAgY2xvc2VSZXNvdXJjZXMoY29ubmVjdGlvbiwgc3RhdGVtZW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEV4ZWN1dGVzIHRoZSBnaXZlbiBTUUwgc3RhdGVtZW50IHdpdGggYSBwYXJ0aWN1bGFyIGxpc3Qgb2YKKyAgICAgKiBwYXJhbWV0ZXIgdmFsdWVzLiBTZWUge0BsaW5rICNleGVjdXRlSW5zZXJ0KEdTdHJpbmcpfSBmb3IKKyAgICAgKiBtb3JlIGRldGFpbHMuIAorICAgICAqIEBwYXJhbSBzcWwgVGhlIFNRTCBzdGF0ZW1lbnQgdG8gZXhlY3V0ZS4KKyAgICAgKiBAcGFyYW0gcGFyYW1zIFRoZSBwYXJhbWV0ZXIgdmFsdWVzIHRoYXQgd2lsbCBiZSBzdWJzdGl0dXRlZAorICAgICAqIGludG8gdGhlIFNRTCBzdGF0ZW1lbnQncyBwYXJhbWV0ZXIgc2xvdHMuCisgICAgICogQHJldHVybiBBIGxpc3Qgb2YgdGhlIGF1dG8tZ2VuZXJhdGVkIGNvbHVtbiB2YWx1ZXMgZm9yIGVhY2gKKyAgICAgKiBpbnNlcnRlZCByb3cuCisgICAgICovCisgICAgcHVibGljIExpc3QgZXhlY3V0ZUluc2VydChTdHJpbmcgc3FsLCBMaXN0IHBhcmFtcykgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIE5vdyBzZW5kIHRoZSBTUUwgdG8gdGhlIGRhdGFiYXNlLgorICAgICAgICBDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSBjcmVhdGVDb25uZWN0aW9uKCk7CisgICAgICAgIFByZXBhcmVkU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsb2cuZmluZShzcWwpOworCisgICAgICAgICAgICAvLyBQcmVwYXJlIGEgc3RhdGVtZW50IGZvciB0aGUgU1FMIGFuZCB0aGVuIGV4ZWN1dGUgaXQuCisgICAgICAgICAgICBzdGF0ZW1lbnQgPSBjb25uZWN0aW9uLnByZXBhcmVTdGF0ZW1lbnQoc3FsLCBTdGF0ZW1lbnQuUkVUVVJOX0dFTkVSQVRFRF9LRVlTKTsKKyAgICAgICAgICAgIHNldFBhcmFtZXRlcnMocGFyYW1zLCBzdGF0ZW1lbnQpOworICAgICAgICAgICAgY29uZmlndXJlKHN0YXRlbWVudCk7CisgICAgICAgICAgICB0aGlzLnVwZGF0ZUNvdW50ID0gc3RhdGVtZW50LmV4ZWN1dGVVcGRhdGUoKTsKKworICAgICAgICAgICAgLy8gUHJlcGFyZSBhIGxpc3QgdG8gY29udGFpbiB0aGUgYXV0by1nZW5lcmF0ZWQgY29sdW1uCisgICAgICAgICAgICAvLyB2YWx1ZXMsIGFuZCB0aGVuIGZldGNoIHRoZW0gZnJvbSB0aGUgc3RhdGVtZW50LgorICAgICAgICAgICAgTGlzdCBhdXRvS2V5cyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgCVJlc3VsdFNldCBrZXlzID0gc3RhdGVtZW50LmdldEdlbmVyYXRlZEtleXMoKTsKKyAgICAgICAgCWludCBjb3VudCA9IGtleXMuZ2V0TWV0YURhdGEoKS5nZXRDb2x1bW5Db3VudCgpOworCisgICAgICAgIAkvLyBDb3B5IHRoZSBjb2x1bW4gdmFsdWVzIGludG8gYSBsaXN0IG9mIGEgbGlzdC4KKyAgICAgICAgCXdoaWxlIChrZXlzLm5leHQoKSkgeworICAgICAgICAJCUxpc3Qgcm93S2V5cyA9IG5ldyBBcnJheUxpc3QoY291bnQpOworICAgICAgICAJCWZvciAoaW50IGkgPSAxOyBpIDw9IGNvdW50OyBpKyspIHsKKyAgICAgICAgCQkJcm93S2V5cy5hZGQoa2V5cy5nZXRPYmplY3QoaSkpOworICAgICAgICAJCX0KKworICAgICAgICAJCWF1dG9LZXlzLmFkZChyb3dLZXlzKTsKKyAgICAgICAgCX0KKworICAgICAgICAJcmV0dXJuIGF1dG9LZXlzOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nLmxvZyhMZXZlbC5GSU5FLCAiRmFpbGVkIHRvIGV4ZWN1dGU6ICIgKyBzcWwsIGUpOworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgIGNsb3NlUmVzb3VyY2VzKGNvbm5lY3Rpb24sIHN0YXRlbWVudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlcyB0aGUgZ2l2ZW4gU1FMIHdpdGggZW1iZWRkZWQgZXhwcmVzc2lvbnMgaW5zaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXhlY3V0ZShHU3RyaW5nIGdzdHJpbmcpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBMaXN0IHBhcmFtcyA9IGdldFBhcmFtZXRlcnMoZ3N0cmluZyk7CisgICAgICAgIFN0cmluZyBzcWwgPSBhc1NxbChnc3RyaW5nLCBwYXJhbXMpOworICAgICAgICByZXR1cm4gZXhlY3V0ZShzcWwsIHBhcmFtcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZXMgdGhlIGdpdmVuIFNRTCB1cGRhdGUgd2l0aCBlbWJlZGRlZCBleHByZXNzaW9ucyBpbnNpZGUKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2Ygcm93cyB1cGRhdGVkCisgICAgICovCisgICAgcHVibGljIGludCBleGVjdXRlVXBkYXRlKEdTdHJpbmcgZ3N0cmluZykgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIExpc3QgcGFyYW1zID0gZ2V0UGFyYW1ldGVycyhnc3RyaW5nKTsKKyAgICAgICAgU3RyaW5nIHNxbCA9IGFzU3FsKGdzdHJpbmcsIHBhcmFtcyk7CisgICAgICAgIHJldHVybiBleGVjdXRlVXBkYXRlKHNxbCwgcGFyYW1zKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD5FeGVjdXRlcyB0aGUgZ2l2ZW4gU1FMIHdpdGggZW1iZWRkZWQgZXhwcmVzc2lvbnMgaW5zaWRlLCBhbmQKKyAgICAgKiByZXR1cm5zIHRoZSB2YWx1ZXMgb2YgYW55IGF1dG8tZ2VuZXJhdGVkIGNvbHVtcywgc3VjaCBhcyBhbgorICAgICAqIGF1dG9pbmNyZW1lbnQgSUQgZmllbGQuIFRoZXNlIHZhbHVlcyBjYW4gYmUgYWNjZXNzZWQgdXNpbmcKKyAgICAgKiBhcnJheSBub3RhdGlvbi4gRm9yIGV4YW1wbGUsIHRvIHJldHVybiB0aGUgc2Vjb25kIGF1dG8tZ2VuZXJhdGVkCisgICAgICogY29sdW1uIHZhbHVlIG9mIHRoZSB0aGlyZCByb3csIHVzZSA8Y29kZT5rZXlzWzNdWzFdPC9jb2RlPi4gVGhlCisgICAgICogbWV0aG9kIGlzIGRlc2lnbmVkIHRvIGJlIHVzZWQgd2l0aCBTUUwgSU5TRVJUIHN0YXRlbWVudHMsIGJ1dCBpcworICAgICAqIG5vdCBsaW1pdGVkIHRvIHRoZW0uPC9wPgorICAgICAqIDxwPlRoZSBzdGFuZGFyZCB1c2UgZm9yIHRoaXMgbWV0aG9kIGlzIHdoZW4gYSB0YWJsZSBoYXMgYW4KKyAgICAgKiBhdXRvaW5jcmVtZW50IElEIGNvbHVtbiBhbmQgeW91IHdhbnQgdG8ga25vdyB3aGF0IHRoZSBJRCBpcyBmb3IKKyAgICAgKiBhIG5ld2x5IGluc2VydGVkIHJvdy4gSW4gdGhpcyBleGFtcGxlLCB3ZSBpbnNlcnQgYSBzaW5nbGUgcm93CisgICAgICogaW50byBhIHRhYmxlIGluIHdoaWNoIHRoZSBmaXJzdCBjb2x1bW4gY29udGFpbnMgdGhlIGF1dG9pbmNyZW1lbnQKKyAgICAgKiBJRDo8L3A+CisgICAgICogPHByZT4KKyAgICAgKiAgICAgZGVmIHNxbCA9IFNxbC5uZXdJbnN0YW5jZSgiamRiYzpteXNxbDovL2xvY2FsaG9zdDozMzA2L2dyb292eSIsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzZXIiLCAKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFzc3dvcmQiLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb20ubXlzcWwuamRiYy5Ecml2ZXIiKQorICAgICAqCisgICAgICogICAgIGRlZiBrZXlzID0gc3FsLmluc2VydCgiaW5zZXJ0IGludG8gdGVzdF90YWJsZSAoSU5UX0RBVEEsIFNUUklOR19EQVRBKSAiCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICArICJWQUxVRVMgKDEsICdLZXkgTGFyZ28nKSIpCisgICAgICoKKyAgICAgKiAgICAgZGVmIGlkID0ga2V5c1swXVswXQorICAgICAqCisgICAgICogICAgIC8vICdpZCcgbm93IGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiB0aGUgbmV3IHJvdydzIElEIGNvbHVtbi4KKyAgICAgKiAgICAgLy8gSXQgY2FuIGJlIHVzZWQgdG8gdXBkYXRlIGFuIG9iamVjdCByZXByZXNlbnRhdGlvbidzCisgICAgICogICAgIC8vIGlkIGF0dHJpYnV0ZSBmb3IgZXhhbXBsZS4KKyAgICAgKiAgICAgLi4uCisgICAgICogPC9wcmU+CisgICAgICogQHJldHVybiBBIGxpc3Qgb2YgY29sdW1uIHZhbHVlcyByZXByZXNlbnRpbmcgZWFjaCByb3cncworICAgICAqIGF1dG8tZ2VuZXJhdGVkIGtleXMuCisgICAgICovCisgICAgcHVibGljIExpc3QgZXhlY3V0ZUluc2VydChHU3RyaW5nIGdzdHJpbmcpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBMaXN0IHBhcmFtcyA9IGdldFBhcmFtZXRlcnMoZ3N0cmluZyk7CisgICAgICAgIFN0cmluZyBzcWwgPSBhc1NxbChnc3RyaW5nLCBwYXJhbXMpOworICAgICAgICByZXR1cm4gZXhlY3V0ZUluc2VydChzcWwsIHBhcmFtcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVyZm9ybXMgYSBzdG9yZWQgcHJvY2VkdXJlIGNhbGwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGNhbGwoU3RyaW5nIHNxbCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBjYWxsKHNxbCwgQ29sbGVjdGlvbnMuRU1QVFlfTElTVCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVyZm9ybXMgYSBzdG9yZWQgcHJvY2VkdXJlIGNhbGwgd2l0aCB0aGUgZ2l2ZW4gcGFyYW1ldGVycworICAgICAqLworICAgIHB1YmxpYyBpbnQgY2FsbChTdHJpbmcgc3FsLCBMaXN0IHBhcmFtcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IGNyZWF0ZUNvbm5lY3Rpb24oKTsKKyAgICAgICAgQ2FsbGFibGVTdGF0ZW1lbnQgc3RhdGVtZW50ID0gY29ubmVjdGlvbi5wcmVwYXJlQ2FsbChzcWwpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbG9nLmZpbmUoc3FsKTsKKyAgICAgICAgICAgIHNldFBhcmFtZXRlcnMocGFyYW1zLCBzdGF0ZW1lbnQpOworICAgICAgICAgICAgY29uZmlndXJlKHN0YXRlbWVudCk7CisgICAgICAgICAgICByZXR1cm4gc3RhdGVtZW50LmV4ZWN1dGVVcGRhdGUoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZy5sb2coTGV2ZWwuRklORSwgIkZhaWxlZCB0byBleGVjdXRlOiAiICsgc3FsLCBlKTsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgICBjbG9zZVJlc291cmNlcyhjb25uZWN0aW9uLCBzdGF0ZW1lbnQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVyZm9ybXMgYSBzdG9yZWQgcHJvY2VkdXJlIGNhbGwgd2l0aCB0aGUgZ2l2ZW4gcGFyYW1ldGVycy4gIFRoZSBjbG9zdXJlCisgICAgICogaXMgY2FsbGVkIG9uY2Ugd2l0aCBhbGwgdGhlIG91dCBwYXJhbWV0ZXJzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNhbGwoU3RyaW5nIHNxbCwgTGlzdCBwYXJhbXMsIENsb3N1cmUgY2xvc3VyZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IGNyZWF0ZUNvbm5lY3Rpb24oKTsKKyAgICAgICAgQ2FsbGFibGVTdGF0ZW1lbnQgc3RhdGVtZW50ID0gY29ubmVjdGlvbi5wcmVwYXJlQ2FsbChzcWwpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbG9nLmZpbmUoc3FsKTsKKyAgICAgICAgICAgIHNldFBhcmFtZXRlcnMocGFyYW1zLCBzdGF0ZW1lbnQpOworICAgICAgICAgICAgc3RhdGVtZW50LmV4ZWN1dGUoKTsKKyAgICAgICAgICAgIExpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgIGludCBpbmR4ID0gMDsKKyAgICAgICAgICAgIGludCBpbm91dHMgPSAwOworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gcGFyYW1zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIGlmKHZhbHVlIGluc3RhbmNlb2YgT3V0UGFyYW1ldGVyKXsKKyAgICAgICAgICAgICAgICAgICAgaWYodmFsdWUgaW5zdGFuY2VvZiBSZXN1bHRTZXRPdXRQYXJhbWV0ZXIpeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5hZGQoQ2FsbFJlc3VsdFNldC5nZXRJbXBsKHN0YXRlbWVudCxpbmR4KSk7CisgICAgICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG8gPSBzdGF0ZW1lbnQuZ2V0T2JqZWN0KGluZHgrMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihvIGluc3RhbmNlb2YgUmVzdWx0U2V0KXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLmFkZChuZXcgR3Jvb3Z5UmVzdWx0U2V0UHJveHkoKFJlc3VsdFNldClvKS5nZXRJbXBsKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5hZGQobyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW5vdXRzKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGluZHgrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNsb3N1cmUuY2FsbChyZXN1bHRzLnRvQXJyYXkobmV3IE9iamVjdFtpbm91dHNdKSk7CisgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2cubG9nKExldmVsLldBUk5JTkcsICJGYWlsZWQgdG8gZXhlY3V0ZTogIiArIHNxbCwgZSk7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgY2xvc2VSZXNvdXJjZXMoY29ubmVjdGlvbiwgc3RhdGVtZW50KTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtcyBhIHN0b3JlZCBwcm9jZWR1cmUgY2FsbCB3aXRoIHRoZSBnaXZlbiBwYXJhbWV0ZXJzCisgICAgICovCisgICAgcHVibGljIGludCBjYWxsKEdTdHJpbmcgZ3N0cmluZykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIExpc3QgcGFyYW1zID0gZ2V0UGFyYW1ldGVycyhnc3RyaW5nKTsKKyAgICAgICAgU3RyaW5nIHNxbCA9IGFzU3FsKGdzdHJpbmcsIHBhcmFtcyk7CisgICAgICAgIHJldHVybiBjYWxsKHNxbCwgcGFyYW1zKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFBlcmZvcm1zIGEgc3RvcmVkIHByb2NlZHVyZSBjYWxsIHdpdGggdGhlIGdpdmVuIHBhcmFtZXRlcnMsCisgICAgICogY2FsbGluZyB0aGUgY2xvc3VyZSBvbmNlIHdpdGggYWxsIHJlc3VsdCBvYmplY3RzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNhbGwoR1N0cmluZyBnc3RyaW5nLCBDbG9zdXJlIGNsb3N1cmUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBMaXN0IHBhcmFtcyA9IGdldFBhcmFtZXRlcnMoZ3N0cmluZyk7CisgICAgICAgIFN0cmluZyBzcWwgPSBhc1NxbChnc3RyaW5nLHBhcmFtcyk7CisgICAgICAgIGNhbGwoc3FsLCBwYXJhbXMsY2xvc3VyZSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIElmIHRoaXMgU1FMIG9iamVjdCB3YXMgY3JlYXRlZCB3aXRoIGEgQ29ubmVjdGlvbiB0aGVuIHRoaXMgbWV0aG9kIGNsb3NlcworICAgICAqIHRoZSBjb25uZWN0aW9uLiBJZiB0aGlzIFNRTCBvYmplY3Qgd2FzIGNyZWF0ZWQgZnJvbSBhIERhdGFTb3VyY2UgdGhlbgorICAgICAqIHRoaXMgbWV0aG9kIGRvZXMgbm90aGluZy4KKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIFNRTEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICh1c2VDb25uZWN0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIHVzZUNvbm5lY3Rpb24uY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBEYXRhU291cmNlIGdldERhdGFTb3VyY2UoKSB7CisgICAgICAgIHJldHVybiBkYXRhU291cmNlOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgY29tbWl0KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGhpcy51c2VDb25uZWN0aW9uLmNvbW1pdCgpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nLmxvZyhMZXZlbC5TRVZFUkUsICJDYXVnaHQgZXhjZXB0aW9uIGNvbW1pdGluZyBjb25uZWN0aW9uOiAiICsgZSwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByb2xsYmFjaygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRoaXMudXNlQ29ubmVjdGlvbi5yb2xsYmFjaygpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nLmxvZyhMZXZlbC5TRVZFUkUsICJDYXVnaHQgZXhjZXB0aW9uIHJvbGxiYWNraW5nIGNvbm5lY3Rpb246ICIgKyBlLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgdXBkYXRlQ291bnQuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRVcGRhdGVDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIHVwZGF0ZUNvdW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRoaXMgaW5zdGFuY2Ugd2FzIGNyZWF0ZWQgd2l0aCBhIHNpbmdsZSBDb25uZWN0aW9uIHRoZW4gdGhlIGNvbm5lY3Rpb24KKyAgICAgKiBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlIGlmIHRoaXMgaW5zdGFuY2Ugd2FzIGNyZWF0ZWQgd2l0aCBhIERhdGFTb3VyY2UKKyAgICAgKiB0aGVuIHRoaXMgbWV0aG9kIHJldHVybnMgbnVsbAorICAgICAqCisgICAgICogQHJldHVybiB0aGUgY29ubmVjdGlvbiB3aXJlZCBpbnRvIHRoaXMgb2JqZWN0LCBvciBudWxsIGlmIHRoaXMgb2JqZWN0CisgICAgICogICAgICAgICB1c2VzIGEgRGF0YVNvdXJjZQorICAgICAqLworICAgIHB1YmxpYyBDb25uZWN0aW9uIGdldENvbm5lY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB1c2VDb25uZWN0aW9uOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWxsb3dzIGEgY2xvc3VyZSB0byBiZSBwYXNzZWQgaW4gdG8gY29uZmlndXJlIHRoZSBKREJDIHN0YXRlbWVudHMgYmVmb3JlIHRoZXkgYXJlIGV4ZWN1dGVkCisgICAgICogdG8gZG8gdGhpbmdzIGxpa2Ugc2V0IHRoZSBxdWVyeSBzaXplIGV0Yy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25maWd1cmVTdGF0ZW1lbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3aXRoU3RhdGVtZW50KENsb3N1cmUgY29uZmlndXJlU3RhdGVtZW50KSB7CisgICAgICAgIHRoaXMuY29uZmlndXJlU3RhdGVtZW50ID0gY29uZmlndXJlU3RhdGVtZW50OworICAgIH0KKworICAgIC8vIEltcGxlbWVudGF0aW9uIG1ldGhvZHMKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIFNRTCB2ZXJzaW9uIG9mIHRoZSBnaXZlbiBxdWVyeSB1c2luZyA/IGluc3RlYWQgb2YgYW55CisgICAgICogICAgICAgICBwYXJhbWV0ZXIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGFzU3FsKEdTdHJpbmcgZ3N0cmluZywgTGlzdCB2YWx1ZXMpIHsKKyAgICAgICAgU3RyaW5nW10gc3RyaW5ncyA9IGdzdHJpbmcuZ2V0U3RyaW5ncygpOworICAgICAgICBpZiAoc3RyaW5ncy5sZW5ndGggPD0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm8gU1FMIHNwZWNpZmllZCBpbiBHU3RyaW5nOiAiICsgZ3N0cmluZyk7CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiBudWxscyA9IGZhbHNlOworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBib29sZWFuIHdhcm5lZCA9IGZhbHNlOworICAgICAgICBJdGVyYXRvciBpdGVyID0gdmFsdWVzLml0ZXJhdG9yKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyaW5ncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIHRleHQgPSBzdHJpbmdzW2ldOworICAgICAgICAgICAgaWYgKHRleHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQodGV4dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZih2YWx1ZSBpbnN0YW5jZW9mIEV4cGFuZGVkVmFyaWFibGUpeworICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgoKEV4cGFuZGVkVmFyaWFibGUpdmFsdWUpLmdldE9iamVjdCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXIucmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB2YWxpZEJpbmRpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCBzdHJpbmdzLmxlbmd0aCAtIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmV4dFRleHQgPSBzdHJpbmdzW2kgKyAxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHRleHQuZW5kc1dpdGgoIlwiIikgfHwgdGV4dC5lbmRzV2l0aCgiJyIpKSAmJiAobmV4dFRleHQuc3RhcnRzV2l0aCgiJyIpIHx8IG5leHRUZXh0LnN0YXJ0c1dpdGgoIlwiIikpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghd2FybmVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cud2FybmluZygiSW4gR3Jvb3Z5IFNRTCBwbGVhc2UgZG8gbm90IHVzZSBxdW90ZXMgYXJvdW5kIGR5bmFtaWMgZXhwcmVzc2lvbnMgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIod2hpY2ggc3RhcnQgd2l0aCAkKSBhcyB0aGlzIG1lYW5zIHdlIGNhbm5vdCB1c2UgYSBKREJDIFByZXBhcmVkU3RhdGVtZW50ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW5kIHNvIGlzIGEgc2VjdXJpdHkgaG9sZS4gR3Jvb3Z5IGhhcyB3b3JrZWQgYXJvdW5kIHlvdXIgbWlzdGFrZSBidXQgdGhlIHNlY3VyaXR5IGhvbGUgaXMgc3RpbGwgdGhlcmUuICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIGV4cHJlc3Npb24gc28gZmFyIGlzOiAiICsgYnVmZmVyLnRvU3RyaW5nKCkgKyAiPyIgKyBuZXh0VGV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQodmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyLnJlbW92ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZEJpbmRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRCaW5kaW5nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiPyIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBudWxscyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIj8nXCI/Iik7IC8vIHdpbGwgcmVwbGFjZSB0aGVzZSB3aXRoIG51bGxpc2gKKyAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWVzCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFN0cmluZyBzcWwgPSBidWZmZXIudG9TdHJpbmcoKTsKKyAgICAgICAgaWYgKG51bGxzKSB7CisgICAgICAgICAgICBzcWwgPSBudWxsaWZ5KHNxbCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNxbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZXBsYWNlID8nIj8gcmVmZXJlbmNlcyB3aXRoIE5VTExpc2gKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc3FsCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBudWxsaWZ5KFN0cmluZyBzcWwpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogU29tZSBkcml2ZXJzIChPcmFjbGUgY2xhc3NlczEyLnppcCkgaGF2ZSBkaWZmaWN1bHR5IHJlc29sdmluZyBkYXRhCisgICAgICAgICAqIHR5cGUgaWYgc2V0T2JqZWN0KG51bGwpLiBXZSB3aWxsIG1vZGlmeSB0aGUgcXVlcnkgdG8gcGFzcyAnbnVsbCcsICdpcworICAgICAgICAgKiBudWxsJywgYW5kICdpcyBub3QgbnVsbCcKKyAgICAgICAgICovCisgICAgICAgIC8vY291bGQgYmUgbW9yZSBlZmZpY2llbnQgYnkgY29tcGlsaW5nIGV4cHJlc3Npb25zIGluIGFkdmFuY2UuCisgICAgICAgIGludCBmaXJzdFdoZXJlID0gZmluZFdoZXJlS2V5d29yZChzcWwpOworICAgICAgICBpZiAoZmlyc3RXaGVyZSA+PSAwKSB7CisgICAgICAgICAgICBQYXR0ZXJuW10gcGF0dGVybnMgPSB7IFBhdHRlcm4uY29tcGlsZSgiKD9pcyleKC57IiArIGZpcnN0V2hlcmUgKyAifS4qPykhPVxcc3swLDF9KFxccyopXFw/J1wiXFw/KC4qKSIpLAorICAgICAgICAgICAgICAgICAgICBQYXR0ZXJuLmNvbXBpbGUoIig/aXMpXigueyIgKyBmaXJzdFdoZXJlICsgIn0uKj8pPD5cXHN7MCwxfShcXHMqKVxcPydcIlxcPyguKikiKSwKKyAgICAgICAgICAgICAgICAgICAgUGF0dGVybi5jb21waWxlKCIoP2lzKV4oLnsiICsgZmlyc3RXaGVyZSArICJ9Lio/W148Pl0pPVxcc3swLDF9KFxccyopXFw/J1wiXFw/KC4qKSIpLCB9OworICAgICAgICAgICAgU3RyaW5nW10gcmVwbGFjZW1lbnRzID0geyAiJDEgaXMgbm90ICQybnVsbCQzIiwgIiQxIGlzIG5vdCAkMm51bGwkMyIsICIkMSBpcyAkMm51bGwkMyIsIH07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhdHRlcm5zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgTWF0Y2hlciBtYXRjaGVyID0gcGF0dGVybnNbaV0ubWF0Y2hlcihzcWwpOworICAgICAgICAgICAgICAgIHdoaWxlIChtYXRjaGVyLm1hdGNoZXMoKSkgeworICAgICAgICAgICAgICAgICAgICBzcWwgPSBtYXRjaGVyLnJlcGxhY2VBbGwocmVwbGFjZW1lbnRzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2hlciA9IHBhdHRlcm5zW2ldLm1hdGNoZXIoc3FsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNxbC5yZXBsYWNlQWxsKCJcXD8nXCJcXD8iLCAibnVsbCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgdGhlIGZpcnN0ICd3aGVyZScga2V5d29yZCBpbiB0aGUgc3FsLgorICAgICAqIAorICAgICAqIEBwYXJhbSBzcWwKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IGZpbmRXaGVyZUtleXdvcmQoU3RyaW5nIHNxbCkgeworICAgICAgICBjaGFyW10gY2hhcnMgPSBzcWwudG9Mb3dlckNhc2UoKS50b0NoYXJBcnJheSgpOworICAgICAgICBjaGFyW10gd2hlcmVDaGFycyA9ICJ3aGVyZSIudG9DaGFyQXJyYXkoKTsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBib29sZWFuIGluU3RyaW5nID0gZmFsc2U7IC8vVE9ETzogQ2F0ZXIgZm9yIGNvbW1lbnRzPworICAgICAgICBib29sZWFuIG5vV2hlcmUgPSB0cnVlOworICAgICAgICBpbnQgaW5XaGVyZSA9IDA7CisgICAgICAgIHdoaWxlIChpIDwgY2hhcnMubGVuZ3RoICYmIG5vV2hlcmUpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoY2hhcnNbaV0pIHsKKyAgICAgICAgICAgICAgICBjYXNlICdcJyc6CisgICAgICAgICAgICAgICAgICAgIGlmIChpblN0cmluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5TdHJpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluU3RyaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBpZiAoIWluU3RyaW5nICYmIGNoYXJzW2ldID09IHdoZXJlQ2hhcnNbaW5XaGVyZV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluV2hlcmUrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbldoZXJlID09IHdoZXJlQ2hhcnMubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBleHRyYWN0cyB0aGUgcGFyYW1ldGVycyBmcm9tIHRoZSBleHByZXNzaW9uIGFzIGEgTGlzdAorICAgICAqLworICAgIHByb3RlY3RlZCBMaXN0IGdldFBhcmFtZXRlcnMoR1N0cmluZyBnc3RyaW5nKSB7CisgICAgICAgIE9iamVjdFtdIHZhbHVlcyA9IGdzdHJpbmcuZ2V0VmFsdWVzKCk7CisgICAgICAgIExpc3QgYW5zd2VyID0gbmV3IEFycmF5TGlzdCh2YWx1ZXMubGVuZ3RoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmICh2YWx1ZXNbaV0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGFuc3dlci5hZGQodmFsdWVzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYW5zd2VyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFwcGVuZHMgdGhlIHBhcmFtZXRlcnMgdG8gdGhlIGdpdmVuIHN0YXRlbWVudAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldFBhcmFtZXRlcnMoTGlzdCBwYXJhbXMsIFByZXBhcmVkU3RhdGVtZW50IHN0YXRlbWVudCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGludCBpID0gMTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gcGFyYW1zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gaXRlci5uZXh0KCk7CisgICAgICAgICAgICBzZXRPYmplY3Qoc3RhdGVtZW50LCBpKyssIHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFN0cmF0ZWd5IG1ldGhvZCBhbGxvd2luZyBkZXJpdmVkIGNsYXNzZXMgdG8gaGFuZGxlIHR5cGVzIGRpZmZlcmVudGx5CisgICAgICogc3VjaCBhcyBmb3IgQ0xPQnMgZXRjLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldE9iamVjdChQcmVwYXJlZFN0YXRlbWVudCBzdGF0ZW1lbnQsIGludCBpLCBPYmplY3QgdmFsdWUpCisgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBJblBhcmFtZXRlciAgfHwgdmFsdWUgaW5zdGFuY2VvZiBPdXRQYXJhbWV0ZXIpIHsKKyAgICAgICAgICAgIGlmKHZhbHVlIGluc3RhbmNlb2YgSW5QYXJhbWV0ZXIpeworICAgICAgICAgICAgICAgIEluUGFyYW1ldGVyIGluID0gKEluUGFyYW1ldGVyKSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBPYmplY3QgdmFsID0gaW4uZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSB2YWwpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50LnNldE51bGwoaSwgaW4uZ2V0VHlwZSgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQuc2V0T2JqZWN0KGksIHZhbCwgaW4uZ2V0VHlwZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZih2YWx1ZSBpbnN0YW5jZW9mIE91dFBhcmFtZXRlcil7CisgICAgICAgICAgICAgICAgdHJ5eworICAgICAgICAgICAgICAgICAgICBPdXRQYXJhbWV0ZXIgb3V0ID0gKE91dFBhcmFtZXRlcil2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgKChDYWxsYWJsZVN0YXRlbWVudClzdGF0ZW1lbnQpLnJlZ2lzdGVyT3V0UGFyYW1ldGVyKGksb3V0LmdldFR5cGUoKSk7CisgICAgICAgICAgICAgICAgfWNhdGNoKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNRTEV4Y2VwdGlvbigiQ2Fubm90IHJlZ2lzdGVyIG91dCBwYXJhbWV0ZXIuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdGVtZW50LnNldE9iamVjdChpLCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQ29ubmVjdGlvbiBjcmVhdGVDb25uZWN0aW9uKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChkYXRhU291cmNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vVXNlIGEgZG9Qcml2aWxlZ2VkIGhlcmUgYXMgbWFueSBkaWZmZXJlbnQgcHJvcGVydGllcyBuZWVkIHRvIGJlCisgICAgICAgICAgICAvLyByZWFkLCBhbmQgdGhlIHBvbGljeQorICAgICAgICAgICAgLy9zaG91bGRuJ3QgaGF2ZSB0byBsaXN0IHRoZW0gYWxsLgorICAgICAgICAgICAgQ29ubmVjdGlvbiBjb24gPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb24gPSAoQ29ubmVjdGlvbikgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIHBhZSkgeworICAgICAgICAgICAgICAgIEV4Y2VwdGlvbiBlID0gcGFlLmdldEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU1FMRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IChTUUxFeGNlcHRpb24pIGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbikgZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY29uOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImNyZWF0ZUNvbm5lY3Rpb24gcmV0dXJuaW5nOiAiICsKKyAgICAgICAgICAgIC8vIHVzZUNvbm5lY3Rpb24pOworICAgICAgICAgICAgcmV0dXJuIHVzZUNvbm5lY3Rpb247CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBjbG9zZVJlc291cmNlcyhDb25uZWN0aW9uIGNvbm5lY3Rpb24sIFN0YXRlbWVudCBzdGF0ZW1lbnQsIFJlc3VsdFNldCByZXN1bHRzKSB7CisgICAgICAgIGlmIChyZXN1bHRzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmVzdWx0cy5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nLmxvZyhMZXZlbC5TRVZFUkUsICJDYXVnaHQgZXhjZXB0aW9uIGNsb3NpbmcgcmVzdWx0U2V0OiAiICsgZSwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2xvc2VSZXNvdXJjZXMoY29ubmVjdGlvbiwgc3RhdGVtZW50KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBjbG9zZVJlc291cmNlcyhDb25uZWN0aW9uIGNvbm5lY3Rpb24sIFN0YXRlbWVudCBzdGF0ZW1lbnQpIHsKKyAgICAgICAgaWYgKHN0YXRlbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHN0YXRlbWVudC5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nLmxvZyhMZXZlbC5TRVZFUkUsICJDYXVnaHQgZXhjZXB0aW9uIGNsb3Npbmcgc3RhdGVtZW50OiAiICsgZSwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRhdGFTb3VyY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb25uZWN0aW9uLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2cubG9nKExldmVsLlNFVkVSRSwgIkNhdWdodCBleGNlcHRpb24gY2xvc2luZyBjb25uZWN0aW9uOiAiICsgZSwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgd2FybkRlcHJlY2F0ZWQoKSB7CisgICAgICAgIGlmICghd2FybmVkKSB7CisgICAgICAgICAgICB3YXJuZWQgPSB0cnVlOworICAgICAgICAgICAgbG9nLndhcm5pbmcoInF1ZXJ5RWFjaCgpIGlzIGRlcHJlY2F0ZWQsIHBsZWFzZSB1c2UgZWFjaFJvdygpIGluc3RlYWQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFByb3ZpZGVzIGEgaG9vayB0byBiZSBhYmxlIHRvIGNvbmZpZ3VyZSBKREJDIHN0YXRlbWVudHMsIHN1Y2ggYXMgdG8gY29uZmlndXJlCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RhdGVtZW50CisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKFN0YXRlbWVudCBzdGF0ZW1lbnQpIHsKKyAgICAgICAgaWYgKGNvbmZpZ3VyZVN0YXRlbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBjb25maWd1cmVTdGF0ZW1lbnQuY2FsbChzdGF0ZW1lbnQpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zcWwvU3FsV2hlcmVWaXNpdG9yLmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3NxbC9TcWxXaGVyZVZpc2l0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmQ0Y2MwCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zcWwvU3FsV2hlcmVWaXNpdG9yLmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgZ3Jvb3Z5LnNxbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5Db2RlVmlzaXRvclN1cHBvcnQ7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuZXhwci5CaW5hcnlFeHByZXNzaW9uOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHIuQm9vbGVhbkV4cHJlc3Npb247CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuZXhwci5Db25zdGFudEV4cHJlc3Npb247CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuZXhwci5FeHByZXNzaW9uOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHIuUHJvcGVydHlFeHByZXNzaW9uOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuUmV0dXJuU3RhdGVtZW50OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LlRva2VuOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LlR5cGVzOworCisvKioKKyAqIEBhdXRob3IgSmFtZXMgU3RyYWNoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIFNxbFdoZXJlVmlzaXRvciBleHRlbmRzIENvZGVWaXNpdG9yU3VwcG9ydCB7CisKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0IHBhcmFtZXRlcnMgPSBuZXcgQXJyYXlMaXN0KCk7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFdoZXJlKCkgeworICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRSZXR1cm5TdGF0ZW1lbnQoUmV0dXJuU3RhdGVtZW50IHN0YXRlbWVudCkgeworICAgICAgICBzdGF0ZW1lbnQuZ2V0RXhwcmVzc2lvbigpLnZpc2l0KHRoaXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0QmluYXJ5RXhwcmVzc2lvbihCaW5hcnlFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKyAgICAgICAgRXhwcmVzc2lvbiBsZWZ0ID0gZXhwcmVzc2lvbi5nZXRMZWZ0RXhwcmVzc2lvbigpOworICAgICAgICBFeHByZXNzaW9uIHJpZ2h0ID0gZXhwcmVzc2lvbi5nZXRSaWdodEV4cHJlc3Npb24oKTsKKyAgICAgICAgYm9vbGVhbiBsZWFmID0gKHJpZ2h0IGluc3RhbmNlb2YgQ29uc3RhbnRFeHByZXNzaW9uKTsKKworICAgICAgICBpZiAoIWxlYWYpIGJ1ZmZlci5hcHBlbmQoIigiKTsKKyAgICAgICAgbGVmdC52aXNpdCh0aGlzKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiICIpOworCisgICAgICAgIFRva2VuIHRva2VuID0gZXhwcmVzc2lvbi5nZXRPcGVyYXRpb24oKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZCh0b2tlbkFzU3FsKHRva2VuKSk7CisKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiICIpOworICAgICAgICByaWdodC52aXNpdCh0aGlzKTsKKyAgICAgICAgaWYgKCFsZWFmKSBidWZmZXIuYXBwZW5kKCIpIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRCb29sZWFuRXhwcmVzc2lvbihCb29sZWFuRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisgICAgICAgIGV4cHJlc3Npb24uZ2V0RXhwcmVzc2lvbigpLnZpc2l0KHRoaXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0Q29uc3RhbnRFeHByZXNzaW9uKENvbnN0YW50RXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisgICAgICAgIGdldFBhcmFtZXRlcnMoKS5hZGQoZXhwcmVzc2lvbi5nZXRWYWx1ZSgpKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiPyIpOworICAgICAgICAKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFByb3BlcnR5RXhwcmVzc2lvbihQcm9wZXJ0eUV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgICAgICBidWZmZXIuYXBwZW5kKGV4cHJlc3Npb24uZ2V0UHJvcGVydHlBc1N0cmluZygpKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIExpc3QgZ2V0UGFyYW1ldGVycygpIHsKKyAgICAgICAgcmV0dXJuIHBhcmFtZXRlcnM7CisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCBTdHJpbmcgdG9rZW5Bc1NxbChUb2tlbiB0b2tlbikgeworICAgICAgICBzd2l0Y2ggKHRva2VuLmdldFR5cGUoKSkgeworICAgICAgICAgICAgY2FzZSBUeXBlcy5DT01QQVJFX0VRVUFMIDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIj0iOworICAgICAgICAgICAgY2FzZSBUeXBlcy5MT0dJQ0FMX0FORCA6CisgICAgICAgICAgICAgICAgcmV0dXJuICJhbmQiOworICAgICAgICAgICAgY2FzZSBUeXBlcy5MT0dJQ0FMX09SIDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIm9yIjsKKyAgICAgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbi5nZXRUZXh0KCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3NxbC9wYWNrYWdlLmh0bWwgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3NxbC9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZkMzg4NQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3FsL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDEwIEBACis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPHRpdGxlPnBhY2thZ2UgZ3Jvb3Z5LnNxbC4qPC90aXRsZT4KKyAgPC9oZWFkPgorICA8Ym9keT4KKyAgICA8cD4KKyAgICAgIEdyb292eSBoZWxwZXIgY2xhc3NlcyBmb3Igd29ya2luZyB3aXRoIFNRTCBkYXRhIGFzIEdyb292eSBvYmplY3RzCisgICAgPC9wPgorICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3N3aW5nL0xvb2tBbmRGZWVsSGVscGVyLmdyb292eSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvTG9va0FuZEZlZWxIZWxwZXIuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYzFiMjQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3N3aW5nL0xvb2tBbmRGZWVsSGVscGVyLmdyb292eQpAQCAtMCwwICsxLDE0NiBAQAorLyoNCisgKiBDb3B5cmlnaHQgMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorcGFja2FnZSBncm9vdnkuc3dpbmcNCisNCitpbXBvcnQgamF2YXguc3dpbmcuTG9va0FuZEZlZWwNCitpbXBvcnQgamF2YXguc3dpbmcuVUlNYW5hZ2VyDQoraW1wb3J0IGphdmF4LnN3aW5nLnBsYWYubWV0YWwuTWV0YWxMb29rQW5kRmVlbA0KK2ltcG9ydCBqYXZheC5zd2luZy5wbGFmLm1ldGFsLk1ldGFsVGhlbWUNCitpbXBvcnQgamF2YXguc3dpbmcucGxhZi5tZXRhbC5EZWZhdWx0TWV0YWxUaGVtZQ0KKw0KKw0KK2NsYXNzIExvb2tBbmRGZWVsSGVscGVyIHsNCisNCisgICAgLy8gcHJvdGVjdGVkIHNvIHlvdSBjYW4gc3ViY2xhc3MgYW5kIHJlcGxhY2UgdGhlIHNpbmdsZXRvbg0KKyAgICBwcm90ZWN0ZWQgc3RhdGljIExvb2tBbmRGZWVsSGVscGVyIGluc3RhbmNlOw0KKw0KKyAgICBwdWJsaWMgc3RhdGljIExvb2tBbmRGZWVsSGVscGVyIGdldEluc3RhbmNlKCkgew0KKyAgICAgICAgcmV0dXJuIGluc3RhbmNlID86IChpbnN0YW5jZSA9IG5ldyBMb29rQW5kRmVlbEhlbHBlcigpKQ0KKyAgICB9DQorDQorICAgIHByaXZhdGUgTWFwIGxhZkNvZGVOYW1lcyA9IFsNCisgICAgICAgIC8vIHN0dWZmIGJ1aWx0IGludG8gdmFyaW91cyBKREtzDQorICAgICAgICBtZXRhbCAgIDogJ2phdmF4LnN3aW5nLnBsYWYubWV0YWwuTWV0YWxMb29rQW5kRmVlbCcsDQorICAgICAgICBuaW1idXMgIDogJ3N1bi5zd2luZy5wbGFmLm5pbWJ1cy5OaW1idXNMb29rQW5kRmVlbCcsDQorICAgICAgICBtYWMgICAgIDogJ2FwcGxlLmxhZi5BcXVhTG9va0FuZEZlZWwnLA0KKyAgICAgICAgbW90aWYgICA6ICdjb20uc3VuLmphdmEuc3dpbmcucGxhZi5tb3RpZi5Nb3RpZkxvb2tBbmRGZWVsJywNCisgICAgICAgIHdpbmRvd3MgOiAnY29tLnN1bi5qYXZhLnN3aW5nLnBsYWYud2luZG93cy5XaW5kb3dzTG9va0FuZEZlZWwnLA0KKyAgICAgICAgd2luMmsgICA6ICdjb20uc3VuLmphdmEuc3dpbmcucGxhZi53aW5kb3dzLldpbmRvd3NDbGFzc2ljTG9va0FuZEZlZWwnLA0KKyAgICAgICAgZ3RrICAgICA6ICdjb20uc3VuLmphdmEuc3dpbmcucGxhZi5ndGsuR1RLTG9va0FuZEZlZWwnLA0KKyAgICAgICAgc3ludGggICA6ICdqYXZheC5zd2luZy5wbGFmLnN5bnRoLlN5bnRoTG9va0FuZEZlZWwnLA0KKw0KKyAgICAgICAgLy8gZ2VuZXJpYyBhbGlhc2VzIGluIFVJTWFuYWdlcg0KKyAgICAgICAgc3lzdGVtICAgICAgICA6IFVJTWFuYWdlci5nZXRTeXN0ZW1Mb29rQW5kRmVlbENsYXNzTmFtZSgpLA0KKyAgICAgICAgY3Jvc3NQbGF0Zm9ybSA6IFVJTWFuYWdlci5nZXRDcm9zc1BsYXRmb3JtTG9va0FuZEZlZWxDbGFzc05hbWUoKSwNCisNCisgICAgICAgIC8vIGpnb29kaWVzLCByZXF1aXJlcyBleHRlcm5hbCBsaWJyYXJ5DQorICAgICAgICBwbGFzdGljICAgOiAnY29tLmpnb29kaWVzLmxvb2tzLnBsYXN0aWMuUGxhc3RpY0xvb2tBbmRGZWVsJywNCisgICAgICAgIHBsYXN0aWMzRCA6ICdjb20uamdvb2RpZXMubG9va3MucGxhc3RpYy5QbGFzdGljM0RMb29rQW5kRmVlbCcsDQorICAgICAgICBwbGFzdGljWFAgOiAnY29tLmpnb29kaWVzLmxvb2tzLnBsYXN0aWMuUGxhc3RpY1hQTG9va0FuZEZlZWwnLA0KKw0KKyAgICAgICAgLy8gc3Vic3RhbmNlLCByZXF1aXJlcyBleHRlcm5hbCBsaWJyYXJ5DQorICAgICAgICBzdWJzdGFuY2UgOiAnb3JnLmp2bmV0LnN1YnN0YW5jZS5TdWJzdGFuY2VMb29rQW5kRmVlbCcsDQorDQorICAgICAgICAvLyBuYXBraW4sIHJlcXVpcmVzIGV4dGVybmFsIGxpYnJhcnkNCisgICAgICAgIG5hcGtpbiA6ICduZXQuc291cmNlZm9yZ2UubmFwa2lubGFmLk5hcGtpbkxvb2tBbmRGZWVsJw0KKyAgICBdDQorDQorICAgIHB1YmxpYyBTdHJpbmcgYWRkTG9va0FuZEZlZWxBbGlhcyhTdHJpbmcgYWxpYXMsIFN0cmluZyBjbGFzc05hbWUpIHsNCisgICAgICAgIGxhZkNvZGVOYW1lc1thbGlhc10gPSBjbGFzc05hbWUNCisgICAgfQ0KKw0KKyAgICBwcml2YXRlIE1hcCBleHRlbmRlZEF0dHJpYnV0ZXMgPSBbDQorICAgICAgICAnamF2YXguc3dpbmcucGxhZi5tZXRhbC5NZXRhbExvb2tBbmRGZWVsJyA6IFsNCisgICAgICAgICAgICB0aGVtZSA6IHsgbGFmLCB0aGVtZSAtPg0KKyAgICAgICAgICAgICAgICBpZiAoISh0aGVtZSBpbnN0YW5jZW9mIE1ldGFsVGhlbWUpKSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAodGhlbWUgPT0gJ29jZWFuJykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lID0gQ2xhc3MuZm9yTmFtZSgnamF2YXguc3dpbmcucGxhZi5tZXRhbC5PY2VhblRoZW1lJykubmV3SW5zdGFuY2UoKQ0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGVtZSA9PSAnc3RlZWwnKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUgPSBuZXcgRGVmYXVsdE1ldGFsVGhlbWUoKTsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUgPSBDbGFzcy5mb3JOYW1lKHRoZW1lIGFzIFN0cmluZykubmV3SW5zdGFuY2UoKQ0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9Ow0KKyAgICAgICAgICAgICAgICBNZXRhbExvb2tBbmRGZWVsLmN1cnJlbnRUaGVtZSA9IHRoZW1lDQorICAgICAgICAgICAgfSwNCisgICAgICAgICAgICBib2xkRm9udHMgOiB7IGxhZiwgYm9sZCAtPiBVSU1hbmFnZXIucHV0KCdzd2luZy5ib2xkTWV0YWwnLCBib2xkIGFzIEJvb2xlYW4pIH0sDQorICAgICAgICAgICAgbm94cCA6IHsgbGFmLCB4cCAtPiBVSU1hbmFnZXIucHV0KCdzd2luZy5ub3hwJywgYm9sZCBhcyBCb29sZWFuKSB9LA0KKyAgICAgICAgXSwNCisgICAgICAgICdvcmcuanZuZXQuc3Vic3RhbmNlLlN1YnN0YW5jZUxvb2tBbmRGZWVsJyA6IFsNCisgICAgICAgICAgICAvLyB1c2Ugc2V0dGVycyBpbnN0ZWFkIG9mIHByb3BlcnRpZXMgdG8gZ2V0IG11bHRpLWRpc3BhdGNoDQorICAgICAgICAgICAgdGhlbWU6IHsgbGFmLCB0aGVtZSAtPiBsYWYuc2V0Q3VycmVudFRoZW1lKHRoZW1lKSB9LA0KKyAgICAgICAgICAgIHNraW46IHsgbGFmLCBza2luIC0+IGxhZi5zZXRTa2luKHNraW4pIH0sDQorICAgICAgICAgICAgd2F0ZXJtYXJrIDogeyBsYWYsIHdhdGVybWFyayAtPiBsYWYuc2V0Q3VycmVudFdhdGVybWFyayh3YXRlcm1hcmspIH0sDQorICAgICAgICBdLA0KKyAgICBdDQorDQorICAgIHB1YmxpYyBTdHJpbmcgYWRkTG9va0FuZEZlZWxBdHRyaWJ1dGVIYW5kbGVyKFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBhdHRyLCBDbG9zdXJlIGhhbmRsZXIpIHsNCisgICAgICAgIE1hcCBhdHRycyA9IGV4dGVuZGVkQXR0cmlidXRlc1tjbGFzc05hbWVdDQorICAgICAgICBpZiAoYXR0cnMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgIGF0dHJzID0gWzpdDQorICAgICAgICAgICAgZXh0ZW5kZWRBdHRyaWJ1dGVzW2NsYXNzTmFtZV0gPSBhdHRycw0KKyAgICAgICAgfQ0KKyAgICAgICAgYXR0cnNbYXR0cl0gPSBoYW5kbGVyDQorICAgIH0NCisNCisNCisgICAgcHVibGljIGJvb2xlYW4gaXNMZWFmKCkgew0KKyAgICAgICAgcmV0dXJuIHRydWUNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgTG9va0FuZEZlZWwgbG9va0FuZEZlZWwoT2JqZWN0IHZhbHVlLCBNYXAgYXR0cmlidXRlcywgQ2xvc3VyZSBpbml0Q2xvc3VyZSkgew0KKyAgICAgICAgTG9va0FuZEZlZWwgbGFmSW5zdGFuY2UNCisgICAgICAgIFN0cmluZyBsYWZDbGFzc05hbWUNCisNCisgICAgICAgIGlmICgodmFsdWUgaW5zdGFuY2VvZiBDbG9zdXJlKSAmJiAoaW5pdENsb3N1cmUgPT0gbnVsbCkpIHsNCisgICAgICAgICAgICBpbml0Q2xvc3VyZSA9IHZhbHVlDQorICAgICAgICAgICAgdmFsdWUgPSBudWxsDQorICAgICAgICB9DQorICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgew0KKyAgICAgICAgICAgIHZhbHVlID0gYXR0cmlidXRlcy5yZW1vdmUoJ2xvb2tBbmRGZWVsJykNCisgICAgICAgIH0NCisgICAgICAgIGlmIChGYWN0b3J5QnVpbGRlclN1cHBvcnQuY2hlY2tWYWx1ZUlzVHlwZU5vdFN0cmluZyh2YWx1ZSwgJ2xvb2tBbmRGZWVsJywgTG9va0FuZEZlZWwpKSB7DQorICAgICAgICAgICAgbGFmSW5zdGFuY2UgPSB2YWx1ZQ0KKyAgICAgICAgICAgIGxhZkNsYXNzTmFtZSA9IGxhZkluc3RhbmNlLmNsYXNzLm5hbWUNCisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGxhZkNsYXNzTmFtZSA9IGxhZkNvZGVOYW1lc1t2YWx1ZV0gPzogdmFsdWUNCisgICAgICAgICAgICBsYWZJbnN0YW5jZSA9IChsYWZDbGFzc05hbWUgYXMgQ2xhc3MpLm5ld0luc3RhbmNlKCkNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vIGFzc3VtZSBhbGwgY29uZmlndXJhdGlvbiBtdXN0IGJlIGRvbmUgcHJpb3IgdG8gTEFGIGJlaW5nIGluc3RhbGxlZA0KKyAgICAgICAgTWFwIHBvc3NpYmxlQXR0cmlidXRlcyA9IGV4dGVuZGVkQXR0cmlidXRlc1tsYWZDbGFzc05hbWVdID86IFs6XQ0KKw0KKyAgICAgICAgYXR0cmlidXRlcy5lYWNoIHtrLCB2IC0+DQorICAgICAgICAgICAgaWYgKHBvc3NpYmxlQXR0cmlidXRlc1trXSkgew0KKyAgICAgICAgICAgICAgICBwb3NzaWJsZUF0dHJpYnV0ZXNba10obGFmSW5zdGFuY2UsIHYpDQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICAgICAgICAgIGxhZkluc3RhbmNlLiIkayIgPSB2DQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE1pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbiBtcGUpIHsNCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJTd2luZ0J1aWxkZXIgaW5pdGlhbGl6YXRpb24gZm9yIHRoZSBMb29rIGFuZCBGZWVsIENsYXNzICRsYWZDbGFzc05hbWUgZG9lcyBhY2NlcHQgdGhlIGF0dHJpYnV0ZSAkayIpDQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBpZiAoaW5pdENsb3N1cmUpIHsNCisgICAgICAgICAgICBpbml0Q2xvc3VyZS5jYWxsKGxhZkluc3RhbmNlKQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgVUlNYW5hZ2VyLnNldExvb2tBbmRGZWVsKGxhZkluc3RhbmNlKQ0KKw0KKyAgICAgICAgcmV0dXJuIGxhZkluc3RhbmNlDQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zd2luZy9Td2luZ0J1aWxkZXIuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zd2luZy9Td2luZ0J1aWxkZXIuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZDU4OGQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3N3aW5nL1N3aW5nQnVpbGRlci5ncm9vdnkKQEAgLTAsMCArMSwzMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGdyb292eS5zd2luZworCitpbXBvcnQgZ3Jvb3Z5LnN3aW5nLmZhY3RvcnkuKgoraW1wb3J0IGphdmEuYXd0LioKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyCitpbXBvcnQgamF2YXguc3dpbmcuKgoraW1wb3J0IGphdmF4LnN3aW5nLnRhYmxlLlRhYmxlQ29sdW1uCitpbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLkJldmVsQm9yZGVyCitpbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLkV0Y2hlZEJvcmRlcgoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5NZXRob2RDbG9zdXJlCisKKy8qKgorICogQSBoZWxwZXIgY2xhc3MgZm9yIGNyZWF0aW5nIFN3aW5nIHdpZGdldHMgdXNpbmcgR3Jvb3Z5TWFya3VwCisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIFN3aW5nQnVpbGRlciAgZXh0ZW5kcyBGYWN0b3J5QnVpbGRlclN1cHBvcnQgeworCisgICAgLy8gUHJvcGVydGllcworICAgIExpbmtlZExpc3QgY29udGFpbmluZ1dpbmRvd3MgPSBuZXcgTGlua2VkTGlzdCgpCisKKyAgICAvLyBsb2NhbCBmaWVsZHMKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyLmdldExvZ2dlcihTd2luZ0J1aWxkZXIubmFtZSkKKyAgICAvLyB0cmFja3MgYWxsIGNvbnRhaW5pbmcgd2luZG93cywgZm9yIGF1dG8tb3duZWQgZGlhbG9ncworICAgIHByaXZhdGUgYm9vbGVhbiBoZWFkbGVzcyA9IGZhbHNlCisKKyAgICBwdWJsaWMgU3dpbmdCdWlsZGVyKCkgeworICAgICAgICByZWdpc3RlcldpZGdldHMoKQorICAgICAgICBoZWFkbGVzcyA9IEdyYXBoaWNzRW52aXJvbm1lbnQuaXNIZWFkbGVzcygpCisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJXaWRnZXRzKCkgeworICAgICAgICAvLworICAgICAgICAvLyBub24td2lkZ2V0IHN1cHBvcnQgY2xhc3NlcworICAgICAgICAvLworICAgICAgICByZWdpc3RlckZhY3RvcnkoImFjdGlvbiIsIG5ldyBBY3Rpb25GYWN0b3J5KCkpCisgICAgICAgIHJlZ2lzdGVyRmFjdG9yeSgiYWN0aW9ucyIsIG5ldyBDb2xsZWN0aW9uRmFjdG9yeSgpKQorICAgICAgICByZWdpc3RlckZhY3RvcnkoIm1hcCIsIG5ldyBNYXBGYWN0b3J5KCkpCisgICAgICAgIHJlZ2lzdGVyRmFjdG9yeSgiaW1hZ2VJY29uIiwgbmV3IEltYWdlSWNvbkZhY3RvcnkoKSkKKyAgICAgICAgcmVnaXN0ZXJCZWFuRmFjdG9yeSgiYnV0dG9uR3JvdXAiLCBCdXR0b25Hcm91cCkKKyAgICAgICAgYWRkQXR0cmlidXRlRGVsZWdhdGUoU3dpbmdCdWlsZGVyLiZidXR0b25Hcm91cEF0dHJpYnV0ZURlbGVnYXRlKQorCisgICAgICAgIC8vb2JqZWN0IGlkIGRlbGVnYWdlLCBmb3IgcHJvcGVydHlOb3RGb3VuZAorICAgICAgICBhZGRBdHRyaWJ1dGVEZWxlZ2F0ZShTd2luZ0J1aWxkZXIuJm9iamVjdElEQXR0cmlidXRlRGVsZWdhdGUpCisKKyAgICAgICAgLy8gYmluZGluZyByZWxhdGVkIGNsYXNzZXMKKyAgICAgICAgcmVnaXN0ZXJGYWN0b3J5KCJiaW5kIiwgbmV3IEJpbmRGYWN0b3J5KCkpCisgICAgICAgIGFkZEF0dHJpYnV0ZURlbGVnYXRlKEJpbmRGYWN0b3J5LiZiaW5kaW5nQXR0cmlidXRlRGVsZWdhdGUpCisgICAgICAgIHJlZ2lzdGVyRmFjdG9yeSgibW9kZWwiLCBuZXcgTW9kZWxGYWN0b3J5KCkpCisKKyAgICAgICAgLy8gdWxpbWF0ZSBwYXNzIHRocm91Z2ggdHlwZXMKKyAgICAgICAgcmVnaXN0ZXJGYWN0b3J5KCJ3aWRnZXQiLCBuZXcgV2lkZ2V0RmFjdG9yeShDb21wb25lbnQsIHRydWUpKQorICAgICAgICByZWdpc3RlckZhY3RvcnkoImNvbnRhaW5lciIsIG5ldyBXaWRnZXRGYWN0b3J5KENvbXBvbmVudCwgZmFsc2UpKQorICAgICAgICByZWdpc3RlckZhY3RvcnkoImJlYW4iLCBuZXcgV2lkZ2V0RmFjdG9yeShPYmplY3QsIHRydWUpKQorCisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gc3RhbmRhbG9uZSB3aW5kb3cgY2xhc3NlcworICAgICAgICAvLworICAgICAgICByZWdpc3RlckZhY3RvcnkoImRpYWxvZyIsIG5ldyBEaWFsb2dGYWN0b3J5KCkpCisgICAgICAgIHJlZ2lzdGVyQmVhbkZhY3RvcnkoImZpbGVDaG9vc2VyIiwgSkZpbGVDaG9vc2VyKQorICAgICAgICByZWdpc3RlckZhY3RvcnkoImZyYW1lIiwgbmV3IEZyYW1lRmFjdG9yeSgpKQorICAgICAgICByZWdpc3RlckJlYW5GYWN0b3J5KCJvcHRpb25QYW5lIiwgSk9wdGlvblBhbmUpCisgICAgICAgIHJlZ2lzdGVyRmFjdG9yeSgid2luZG93IiwgbmV3IFdpbmRvd0ZhY3RvcnkoKSkKKworCisgICAgICAgIC8vCisgICAgICAgIC8vIHdpZGdldHMKKyAgICAgICAgLy8KKyAgICAgICAgcmVnaXN0ZXJGYWN0b3J5KCJidXR0b24iLCBuZXcgUmljaEFjdGlvbldpZGdldEZhY3RvcnkoSkJ1dHRvbikpCisgICAgICAgIHJlZ2lzdGVyRmFjdG9yeSgiY2hlY2tCb3giLCBuZXcgUmljaEFjdGlvbldpZGdldEZhY3RvcnkoSkNoZWNrQm94KSkKKyAgICAgICAgcmVnaXN0ZXJGYWN0b3J5KCJjaGVja0JveE1lbnVJdGVtIiwgbmV3IFJpY2hBY3Rpb25XaWRnZXRGYWN0b3J5KEpDaGVja0JveE1lbnVJdGVtKSkKKyAgICAgICAgcmVnaXN0ZXJGYWN0b3J5KCJtZW51SXRlbSIsIG5ldyBSaWNoQWN0aW9uV2lkZ2V0RmFjdG9yeShKTWVudUl0ZW0pKQorICAgICAgICByZWdpc3RlckZhY3RvcnkoInJhZGlvQnV0dG9uIiwgbmV3IFJpY2hBY3Rpb25XaWRnZXRGYWN0b3J5KEpSYWRpb0J1dHRvbikpCisgICAgICAgIHJlZ2lzdGVyRmFjdG9yeSgicmFkaW9CdXR0b25NZW51SXRlbSIsIG5ldyBSaWNoQWN0aW9uV2lkZ2V0RmFjdG9yeShKUmFkaW9CdXR0b25NZW51SXRlbSkpCisgICAgICAgIHJlZ2lzdGVyRmFjdG9yeSgidG9nZ2xlQnV0dG9uIiwgbmV3IFJpY2hBY3Rpb25XaWRnZXRGYWN0b3J5KEpUb2dnbGVCdXR0b24pKQorCisgICAgICAgIHJlZ2lzdGVyRmFjdG9yeSgiZWRpdG9yUGFuZSIsIG5ldyBUZXh0QXJnV2lkZ2V0RmFjdG9yeShKRWRpdG9yUGFuZSkpCisgICAgICAgIHJlZ2lzdGVyRmFjdG9yeSgibGFiZWwiLCBuZXcgVGV4dEFyZ1dpZGdldEZhY3RvcnkoSkxhYmVsKSkKKyAgICAgICAgcmVnaXN0ZXJGYWN0b3J5KCJwYXNzd29yZEZpZWxkIiwgbmV3IFRleHRBcmdXaWRnZXRGYWN0b3J5KEpQYXNzd29yZEZpZWxkKSkKKyAgICAgICAgcmVnaXN0ZXJGYWN0b3J5KCJ0ZXh0QXJlYSIsIG5ldyBUZXh0QXJnV2lkZ2V0RmFjdG9yeShKVGV4dEFyZWEpKQorICAgICAgICByZWdpc3RlckZhY3RvcnkoInRleHRGaWVsZCIsIG5ldyBUZXh0QXJnV2lkZ2V0RmFjdG9yeShKVGV4dEZpZWxkKSkKKyAgICAgICAgcmVnaXN0ZXJGYWN0b3J5KCJ0ZXh0UGFuZSIsIG5ldyBUZXh0QXJnV2lkZ2V0RmFjdG9yeShKVGV4dFBhbmUpKQorCisgICAgICAgIHJlZ2lzdGVyQmVhbkZhY3RvcnkoImNvbG9yQ2hvb3NlciIsIEpDb2xvckNob29zZXIpCisgICAgICAgIHJlZ2lzdGVyRmFjdG9yeSgiY29tYm9Cb3giLCBuZXcgQ29tYm9Cb3hGYWN0b3J5KCkpCisgICAgICAgIHJlZ2lzdGVyQmVhbkZhY3RvcnkoImRlc2t0b3BQYW5lIiwgSkRlc2t0b3BQYW5lKQorICAgICAgICByZWdpc3RlckZhY3RvcnkoImZvcm1hdHRlZFRleHRGaWVsZCIsIG5ldyBGb3JtYXR0ZWRUZXh0RmFjdG9yeSgpKQorICAgICAgICByZWdpc3RlckZhY3RvcnkoImludGVybmFsRnJhbWUiLCBuZXcgSW50ZXJuYWxGcmFtZUZhY3RvcnkoKSkKKyAgICAgICAgcmVnaXN0ZXJCZWFuRmFjdG9yeSgibGF5ZXJlZFBhbmUiLCBKTGF5ZXJlZFBhbmUpCisgICAgICAgIHJlZ2lzdGVyQmVhbkZhY3RvcnkoImxpc3QiLCBKTGlzdCkKKyAgICAgICAgcmVnaXN0ZXJCZWFuRmFjdG9yeSgibWVudSIsIEpNZW51KQorICAgICAgICByZWdpc3RlckJlYW5GYWN0b3J5KCJtZW51QmFyIiwgSk1lbnVCYXIpCisgICAgICAgIHJlZ2lzdGVyQmVhbkZhY3RvcnkoInBhbmVsIiwgSlBhbmVsKQorICAgICAgICByZWdpc3RlckJlYW5GYWN0b3J5KCJwb3B1cE1lbnUiLCBKUG9wdXBNZW51KQorICAgICAgICByZWdpc3RlckJlYW5GYWN0b3J5KCJwcm9ncmVzc0JhciIsIEpQcm9ncmVzc0JhcikKKyAgICAgICAgcmVnaXN0ZXJCZWFuRmFjdG9yeSgic2Nyb2xsQmFyIiwgSlNjcm9sbEJhcikKKyAgICAgICAgcmVnaXN0ZXJGYWN0b3J5KCJzY3JvbGxQYW5lIiwgbmV3IFNjcm9sbFBhbmVGYWN0b3J5KCkpCisgICAgICAgIHJlZ2lzdGVyRmFjdG9yeSgic2VwYXJhdG9yIiwgbmV3IFNlcGFyYXRvckZhY3RvcnkoKSkKKyAgICAgICAgcmVnaXN0ZXJCZWFuRmFjdG9yeSgic2xpZGVyIiwgSlNsaWRlcikKKyAgICAgICAgcmVnaXN0ZXJCZWFuRmFjdG9yeSgic3Bpbm5lciIsIEpTcGlubmVyKQorICAgICAgICByZWdpc3RlckZhY3RvcnkoInNwbGl0UGFuZSIsIG5ldyBTcGxpdFBhbmVGYWN0b3J5KCkpCisgICAgICAgIHJlZ2lzdGVyRmFjdG9yeSgidGFiYmVkUGFuZSIsIG5ldyBUYWJiZWRQYW5lRmFjdG9yeShKVGFiYmVkUGFuZSkpCisgICAgICAgIHJlZ2lzdGVyRmFjdG9yeSgidGFibGUiLCBuZXcgVGFibGVGYWN0b3J5KCkpCisgICAgICAgIHJlZ2lzdGVyQmVhbkZhY3RvcnkoInRhYmxlQ29sdW1uIiwgVGFibGVDb2x1bW4pCisgICAgICAgIHJlZ2lzdGVyQmVhbkZhY3RvcnkoInRvb2xCYXIiLCBKVG9vbEJhcikKKyAgICAgICAgLy9yZWdpc3RlckJlYW5GYWN0b3J5KCJ0b29sdGlwIiwgSlRvb2xUaXApIC8vIGRvZXNuJ3Qgd29yaywgdXNlIHRvb2xUaXBUZXh0IHByb3BlcnR5CisgICAgICAgIHJlZ2lzdGVyQmVhbkZhY3RvcnkoInRyZWUiLCBKVHJlZSkKKyAgICAgICAgcmVnaXN0ZXJCZWFuRmFjdG9yeSgidmlld3BvcnQiLCBKVmlld3BvcnQpIC8vIHN1YiBjbGFzcz8KKworCisgICAgICAgIC8vCisgICAgICAgIC8vIE1WQyBtb2RlbHMKKyAgICAgICAgLy8KKyAgICAgICAgcmVnaXN0ZXJCZWFuRmFjdG9yeSgiYm91bmRlZFJhbmdlTW9kZWwiLCBEZWZhdWx0Qm91bmRlZFJhbmdlTW9kZWwpCisKKyAgICAgICAgLy8gc3Bpbm5lciBtb2RlbHMKKyAgICAgICAgcmVnaXN0ZXJCZWFuRmFjdG9yeSgic3Bpbm5lckRhdGVNb2RlbCIsIFNwaW5uZXJEYXRlTW9kZWwpCisgICAgICAgIHJlZ2lzdGVyQmVhbkZhY3RvcnkoInNwaW5uZXJMaXN0TW9kZWwiLCBTcGlubmVyTGlzdE1vZGVsKQorICAgICAgICByZWdpc3RlckJlYW5GYWN0b3J5KCJzcGlubmVyTnVtYmVyTW9kZWwiLCBTcGlubmVyTnVtYmVyTW9kZWwpCisKKyAgICAgICAgLy8gdGFibGUgbW9kZWxzCisgICAgICAgIHJlZ2lzdGVyRmFjdG9yeSgidGFibGVNb2RlbCIsIG5ldyBUYWJsZU1vZGVsRmFjdG9yeSgpKQorICAgICAgICByZWdpc3RlckZhY3RvcnkoInByb3BlcnR5Q29sdW1uIiwgbmV3IFByb3BlcnR5Q29sdW1uRmFjdG9yeSgpKQorICAgICAgICByZWdpc3RlckZhY3RvcnkoImNsb3N1cmVDb2x1bW4iLCBuZXcgQ2xvc3VyZUNvbHVtbkZhY3RvcnkoKSkKKworCisgICAgICAgIC8vCisgICAgICAgIC8vIExheW91dHMKKyAgICAgICAgLy8KKyAgICAgICAgcmVnaXN0ZXJGYWN0b3J5KCJib3JkZXJMYXlvdXQiLCBuZXcgTGF5b3V0RmFjdG9yeShCb3JkZXJMYXlvdXQpKQorICAgICAgICByZWdpc3RlckZhY3RvcnkoImNhcmRMYXlvdXQiLCBuZXcgTGF5b3V0RmFjdG9yeShDYXJkTGF5b3V0KSkKKyAgICAgICAgcmVnaXN0ZXJGYWN0b3J5KCJmbG93TGF5b3V0IiwgbmV3IExheW91dEZhY3RvcnkoRmxvd0xheW91dCkpCisgICAgICAgIHJlZ2lzdGVyRmFjdG9yeSgiZ3JpZEJhZ0xheW91dCIsIG5ldyBMYXlvdXRGYWN0b3J5KEdyaWRCYWdMYXlvdXQpKQorICAgICAgICByZWdpc3RlckZhY3RvcnkoImdyaWRMYXlvdXQiLCBuZXcgTGF5b3V0RmFjdG9yeShHcmlkTGF5b3V0KSkKKyAgICAgICAgcmVnaXN0ZXJGYWN0b3J5KCJvdmVybGF5TGF5b3V0IiwgbmV3IExheW91dEZhY3RvcnkoT3ZlcmxheUxheW91dCkpCisgICAgICAgIHJlZ2lzdGVyRmFjdG9yeSgic3ByaW5nTGF5b3V0IiwgbmV3IExheW91dEZhY3RvcnkoU3ByaW5nTGF5b3V0KSkKKyAgICAgICAgcmVnaXN0ZXJCZWFuRmFjdG9yeSgiZ3JpZEJhZ0NvbnN0cmFpbnRzIiwgR3JpZEJhZ0NvbnN0cmFpbnRzKQorICAgICAgICByZWdpc3RlckJlYW5GYWN0b3J5KCJnYmMiLCBHcmlkQmFnQ29uc3RyYWludHMpIC8vIHNob3J0Y3V0IG5hbWUKKyAgICAgICAgLy8gY29uc3RyYWludHMgZGVsZWdhdGUKKyAgICAgICAgYWRkQXR0cmlidXRlRGVsZWdhdGUoU3dpbmdCdWlsZGVyLiZjb25zdHJhaW50c0F0dHJpYnV0ZURlbGVnYXRlKQorCisKKyAgICAgICAgLy8gQm94IGxheW91dCBhbmQgZnJpZW5kcworICAgICAgICByZWdpc3RlckZhY3RvcnkoImJveExheW91dCIsIG5ldyBCb3hMYXlvdXRGYWN0b3J5KCkpCisgICAgICAgIHJlZ2lzdGVyRmFjdG9yeSgiYm94IiwgbmV3IEJveEZhY3RvcnkoKSkKKyAgICAgICAgcmVnaXN0ZXJGYWN0b3J5KCJoYm94IiwgbmV3IEhCb3hGYWN0b3J5KCkpCisgICAgICAgIHJlZ2lzdGVyRmFjdG9yeSgiaGdsdWUiLCBuZXcgSEdsdWVGYWN0b3J5KCkpCisgICAgICAgIHJlZ2lzdGVyRmFjdG9yeSgiaHN0cnV0IiwgbmV3IEhTdHJ1dEZhY3RvcnkoKSkKKyAgICAgICAgcmVnaXN0ZXJGYWN0b3J5KCJ2Ym94IiwgbmV3IFZCb3hGYWN0b3J5KCkpCisgICAgICAgIHJlZ2lzdGVyRmFjdG9yeSgidmdsdWUiLCBuZXcgVkdsdWVGYWN0b3J5KCkpCisgICAgICAgIHJlZ2lzdGVyRmFjdG9yeSgidnN0cnV0IiwgbmV3IFZTdHJ1dEZhY3RvcnkoKSkKKyAgICAgICAgcmVnaXN0ZXJGYWN0b3J5KCJnbHVlIiwgbmV3IEdsdWVGYWN0b3J5KCkpCisgICAgICAgIHJlZ2lzdGVyRmFjdG9yeSgicmlnaWRBcmVhIiwgbmV3IFJpZ2lkQXJlYUZhY3RvcnkoKSkKKworICAgICAgICAvLyB0YWJsZSBsYXlvdXQKKyAgICAgICAgcmVnaXN0ZXJGYWN0b3J5KCJ0YWJsZUxheW91dCIsIG5ldyBUYWJsZUxheW91dEZhY3RvcnkoKSkKKyAgICAgICAgcmVnaXN0ZXJGYWN0b3J5KCJ0ciIsIG5ldyBUUkZhY3RvcnkoKSkKKyAgICAgICAgcmVnaXN0ZXJGYWN0b3J5KCJ0ZCIsIG5ldyBUREZhY3RvcnkoKSkKKworICAgICAgICAvLworICAgICAgICAvLyBib3JkZXJzCisgICAgICAgIC8vCisgICAgICAgIHJlZ2lzdGVyRmFjdG9yeSgibGluZUJvcmRlciIsIG5ldyBMaW5lQm9yZGVyRmFjdG9yeSgpKQorICAgICAgICByZWdpc3RlckZhY3RvcnkoImxvd2VyZWRCZXZlbEJvcmRlciIsIG5ldyBCZXZlbEJvcmRlckZhY3RvcnkoQmV2ZWxCb3JkZXIuTE9XRVJFRCkpCisgICAgICAgIHJlZ2lzdGVyRmFjdG9yeSgicmFpc2VkQmV2ZWxCb3JkZXIiLCBuZXcgQmV2ZWxCb3JkZXJGYWN0b3J5KEJldmVsQm9yZGVyLlJBSVNFRCkpCisgICAgICAgIHJlZ2lzdGVyRmFjdG9yeSgiZXRjaGVkQm9yZGVyIiwgbmV3IEV0Y2hlZEJvcmRlckZhY3RvcnkoRXRjaGVkQm9yZGVyLkxPV0VSRUQpKQorICAgICAgICByZWdpc3RlckZhY3RvcnkoImxvd2VyZWRFdGNoZWRCb3JkZXIiLCBuZXcgRXRjaGVkQm9yZGVyRmFjdG9yeShFdGNoZWRCb3JkZXIuTE9XRVJFRCkpCisgICAgICAgIHJlZ2lzdGVyRmFjdG9yeSgicmFpc2VkRXRjaGVkQm9yZGVyIiwgbmV3IEV0Y2hlZEJvcmRlckZhY3RvcnkoRXRjaGVkQm9yZGVyLlJBSVNFRCkpCisgICAgICAgIHJlZ2lzdGVyRmFjdG9yeSgidGl0bGVkQm9yZGVyIiwgbmV3IFRpdGxlZEJvcmRlckZhY3RvcnkoKSkKKyAgICAgICAgcmVnaXN0ZXJGYWN0b3J5KCJlbXB0eUJvcmRlciIsIG5ldyBFbXB0eUJvcmRlckZhY3RvcnkoKSkKKyAgICAgICAgcmVnaXN0ZXJGYWN0b3J5KCJjb21wb3VuZEJvcmRlciIsIG5ldyBDb21wb3VuZEJvcmRlckZhY3RvcnkoKSkKKyAgICAgICAgcmVnaXN0ZXJGYWN0b3J5KCJtYXR0ZUJvcmRlciIsIG5ldyBNYXR0ZUJvcmRlckZhY3RvcnkoKSkKKworICAgIH0KKworICAgIC8qKgorICAgICAqIERvIHNvbWUgb3ZlcnJpZGVzIGZvciBzdGFuZGFyZCBjb21wb25lbnQgaGFuZGxlcnMsIGVsc2UgdXNlIHN1cGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJCZWFuRmFjdG9yeShTdHJpbmcgbm9kZU5hbWUsIENsYXNzIGtsYXNzKSB7CisgICAgICAgIC8vIHBva2UgYXQgdGhlIHR5cGUgdG8gc2VlIGlmIHdlIG5lZWQgc3BlY2lhbCBoYW5kbGluZworICAgICAgICBpZiAoTGF5b3V0TWFuYWdlci5pc0Fzc2lnbmFibGVGcm9tKGtsYXNzKSkgeworICAgICAgICAgICAgcmVnaXN0ZXJGYWN0b3J5KG5vZGVOYW1lLCBuZXcgTGF5b3V0RmFjdG9yeShrbGFzcykpCisgICAgICAgIH0gZWxzZSBpZiAoSlNjcm9sbFBhbmUuaXNBc3NpZ25hYmxlRnJvbShrbGFzcykpIHsKKyAgICAgICAgICAgIHJlZ2lzdGVyRmFjdG9yeShub2RlTmFtZSwgbmV3IFNjcm9sbFBhbmVGYWN0b3J5KGtsYXNzKSkKKyAgICAgICAgfSBlbHNlIGlmIChKVGFibGUuaXNBc3NpZ25hYmxlRnJvbShrbGFzcykpIHsKKyAgICAgICAgICAgIHJlZ2lzdGVyRmFjdG9yeShub2RlTmFtZSwgbmV3IFRhYmxlRmFjdG9yeShrbGFzcykpCisgICAgICAgIH0gZWxzZSBpZiAoSkNvbXBvbmVudC5pc0Fzc2lnbmFibGVGcm9tKGtsYXNzKQorICAgICAgICAgICAgfHwgSkFwcGxldC5pc0Fzc2lnbmFibGVGcm9tKGtsYXNzKQorICAgICAgICAgICAgfHwgSkRpYWxvZy5pc0Fzc2lnbmFibGVGcm9tKGtsYXNzKQorICAgICAgICAgICAgfHwgSkZyYW1lLmlzQXNzaWduYWJsZUZyb20oa2xhc3MpCisgICAgICAgICAgICB8fCBKV2luZG93LmlzQXNzaWduYWJsZUZyb20oa2xhc3MpCisgICAgICAgICkgeworICAgICAgICAgICAgcmVnaXN0ZXJGYWN0b3J5KG5vZGVOYW1lLCBuZXcgQ29tcG9uZW50RmFjdG9yeShrbGFzcykpCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdXBlci5yZWdpc3RlckJlYW5GYWN0b3J5KG5vZGVOYW1lLCBrbGFzcykKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIFN3aW5nQnVpbGRlciBlZHQoQ2xvc3VyZSBjKSB7CisgICAgICAgIGMuc2V0RGVsZWdhdGUodGhpcykKKyAgICAgICAgaWYgKGhlYWRsZXNzIHx8IFN3aW5nVXRpbGl0aWVzLmlzRXZlbnREaXNwYXRjaFRocmVhZCgpKSB7CisgICAgICAgICAgICBjLmNhbGwodGhpcykKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKCEoYyBpbnN0YW5jZW9mIE1ldGhvZENsb3N1cmUpKSB7CisgICAgICAgICAgICAgICAgICAgIGMgPSBjLmN1cnJ5KFt0aGlzXSkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU3dpbmdVdGlsaXRpZXMuaW52b2tlQW5kV2FpdChjKQorICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBHcm9vdnlSdW50aW1lRXhjZXB0aW9uKCJpbnRlcnJ1cHRlZCBzd2luZyBpbnRlcmFjdGlvbiIsIGUpCisgICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbigiZXhjZXB0aW9uIGluIGV2ZW50IGRpc3BhdGNoIHRocmVhZCIsIGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXMKKyAgICB9CisKKyAgICBwdWJsaWMgU3dpbmdCdWlsZGVyIGRvTGF0ZXIoQ2xvc3VyZSBjKSB7CisgICAgICAgIGMuc2V0RGVsZWdhdGUodGhpcykKKyAgICAgICAgaWYgKGhlYWRsZXNzKSB7CisgICAgICAgICAgICBjLmNhbGwoKQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCEoYyBpbnN0YW5jZW9mIE1ldGhvZENsb3N1cmUpKSB7CisgICAgICAgICAgICAgICAgYyA9IGMuY3VycnkoW3RoaXNdKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgU3dpbmdVdGlsaXRpZXMuaW52b2tlTGF0ZXIoYykKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpcworICAgIH0KKworICAgIHB1YmxpYyBTd2luZ0J1aWxkZXIgZG9PdXRzaWRlKENsb3N1cmUgYykgeworICAgICAgICBjLnNldERlbGVnYXRlKHRoaXMpCisgICAgICAgIGlmICghKGMgaW5zdGFuY2VvZiBNZXRob2RDbG9zdXJlKSkgeworICAgICAgICAgICAgYyA9IGMuY3VycnkoW3RoaXNdKQorICAgICAgICB9CisgICAgICAgIG5ldyBUaHJlYWQoYykuc3RhcnQoKQorICAgICAgICByZXR1cm4gdGhpcworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3dpbmdCdWlsZGVyIGJ1aWxkKENsb3N1cmUgYykgeworICAgICAgICBTd2luZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTd2luZ0J1aWxkZXIoKQorICAgICAgICByZXR1cm4gYnVpbGRlci5lZHQoYykKKyAgICB9CisKKyAgICBwdWJsaWMgS2V5U3Ryb2tlIHNob3J0Y3V0KGtleSwgbW9kaWZpZXIgPSAwKSB7CisgICAgICAgIHJldHVybiBLZXlTdHJva2UuZ2V0S2V5U3Ryb2tlKGtleSwgVG9vbGtpdC5nZXREZWZhdWx0VG9vbGtpdCgpLmdldE1lbnVTaG9ydGN1dEtleU1hc2soKSB8IG1vZGlmaWVyKQorICAgIH0KKworICAgIHB1YmxpYyBLZXlTdHJva2Ugc2hvcnRjdXQoU3RyaW5nIGtleSwgbW9kaWZpZXIgPSAwKSB7CisgICAgICAgIEtleVN0cm9rZSBrcyA9IEtleVN0cm9rZS5nZXRLZXlTdHJva2Uoa2V5KQorICAgICAgICBpZiAoa3MgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGwKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBLZXlTdHJva2UuZ2V0S2V5U3Ryb2tlKGtzLmdldEtleUNvZGUoKSwga3MuZ2V0TW9kaWZpZXJzKCkgfCBtb2RpZmllciB8IFRvb2xraXQuZ2V0RGVmYXVsdFRvb2xraXQoKS5nZXRNZW51U2hvcnRjdXRLZXlNYXNrKCkpICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIExvb2tBbmRGZWVsIGxvb2tBbmRGZWVsKE9iamVjdCBsb29rQW5kRmVlbCwgQ2xvc3VyZSBpbml0Q29kZSA9IG51bGwpIHsKKyAgICAgICAgbG9va0FuZEZlZWwoWzpdLCBsb29rQW5kRmVlbCwgaW5pdENvZGUpCisgICAgfQorCisgICAgcHVibGljIExvb2tBbmRGZWVsIGxvb2tBbmRGZWVsKE1hcCBhdHRyaWJ1dGVzID0gWzpdLCBPYmplY3QgbG9va0FuZEZlZWwgPSBudWxsLCBDbG9zdXJlIGluaXRDb2RlID0gbnVsbCkgeworICAgICAgICAvLyBpZiB3ZSBnZXQgcmlkIG9mIHRoaXMgd2FybmluZywgd2UgY2FuIG1ha2UgaXQgc3RhdGljLgorICAgICAgICBpZiAoY29udGV4dCkgeworICAgICAgICAgICAgTE9HLndhcm5pbmcgIkZvciBiZXN0IHJlc3VsdCBkbyBub3QgY2FsbCBsb29rQW5kRmVlbCB3aGVuIGl0IGlzIGEgY2hpbGQgb2YgYSBTd2luZ0J1aWRsZXIgbm9kZSwgaW5pdGlhbGl6YWl0b24gb2YgdGhlIExvb2sgYW5kIEZlZWwgbWF5IGJlIGluY29uc2lzdGFudC4iCisgICAgICAgIH0KKworICAgICAgICBMb29rQW5kRmVlbEhlbHBlci5pbnN0YW5jZS5sb29rQW5kRmVlbChsb29rQW5kRmVlbCwgYXR0cmlidXRlcywgaW5pdENvZGUpCisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBidXR0b25Hcm91cEF0dHJpYnV0ZURlbGVnYXRlKGRlZiBidWlsZGVyLCBkZWYgbm9kZSwgZGVmIGF0dHJpYnV0ZXMpIHsKKyAgICAgICAgaWYgKGF0dHJpYnV0ZXMuY29udGFpbnNLZXkoImJ1dHRvbkdyb3VwIikpIHsKKyAgICAgICAgICAgIGRlZiBvID0gYXR0cmlidXRlcy5nZXQoImJ1dHRvbkdyb3VwIikKKyAgICAgICAgICAgIGlmICgobyBpbnN0YW5jZW9mIEJ1dHRvbkdyb3VwKSAmJiAobm9kZSBpbnN0YW5jZW9mIEFic3RyYWN0QnV0dG9uKSkgeworICAgICAgICAgICAgICAgIG5vZGUubW9kZWwuZ3JvdXAgPSBvCisgICAgICAgICAgICAgICAgYXR0cmlidXRlcy5yZW1vdmUoImJ1dHRvbkdyb3VwIikKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgb2JqZWN0SURBdHRyaWJ1dGVEZWxlZ2F0ZShkZWYgYnVpbGRlciwgZGVmIG5vZGUsIGRlZiBhdHRyaWJ1dGVzKSB7CisgICAgICAgIGRlZiB0aGVJRCA9IGF0dHJpYnV0ZXMucmVtb3ZlKCdpZCcpCisgICAgICAgIGlmICh0aGVJRCkgeworICAgICAgICAgICAgYnVpbGRlci5zZXRWYXJpYWJsZSh0aGVJRCwgbm9kZSkKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY29uc3RyYWludHNBdHRyaWJ1dGVEZWxlZ2F0ZShkZWYgYnVpbGRlciwgZGVmIG5vZGUsIGRlZiBhdHRyaWJ1dGVzKSB7CisgICAgICAgIGJ1aWxkZXIuY29udGV4dC5jb25zdHJhaW50cyA9IGF0dHJpYnV0ZXMucmVtb3ZlKCdjb25zdHJhaW50cycpCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zd2luZy9iaW5kaW5nL0Fic3RyYWN0QnV0dG9uUHJvcGVydGllcy5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zd2luZy9iaW5kaW5nL0Fic3RyYWN0QnV0dG9uUHJvcGVydGllcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NzUxNGYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3N3aW5nL2JpbmRpbmcvQWJzdHJhY3RCdXR0b25Qcm9wZXJ0aWVzLmphdmEKQEAgLTAsMCArMSwxMjYgQEAKKy8qDQorICogQ29weXJpZ2h0IDIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLg0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KK3BhY2thZ2UgZ3Jvb3Z5LnN3aW5nLmJpbmRpbmc7DQorDQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYmluZGluZy5BYnN0cmFjdEZ1bGxCaW5kaW5nOw0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmJpbmRpbmcuRnVsbEJpbmRpbmc7DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYmluZGluZy5Qcm9wZXJ0eUJpbmRpbmc7DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYmluZGluZy5Tb3VyY2VCaW5kaW5nOw0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmJpbmRpbmcuVGFyZ2V0QmluZGluZzsNCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5iaW5kaW5nLlRyaWdnZXJCaW5kaW5nOw0KKw0KK2ltcG9ydCBqYXZheC5zd2luZy5BYnN0cmFjdEJ1dHRvbjsNCitpbXBvcnQgamF2YXguc3dpbmcuQnV0dG9uTW9kZWw7DQoraW1wb3J0IGphdmEuYXd0LmV2ZW50Lkl0ZW1FdmVudDsNCitpbXBvcnQgamF2YS5hd3QuZXZlbnQuSXRlbUxpc3RlbmVyOw0KK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlRXZlbnQ7DQoraW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsNCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQoraW1wb3J0IGphdmEudXRpbC5NYXA7DQorDQorLyoqDQorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86c2hlbW5vbkB5YWhvby5jb20iPkRhbm5vIEZlcnJpbjwvYT4NCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kDQorICogQHNpbmNlIEdyb292eSAxLjENCisgKi8NCitwdWJsaWMgY2xhc3MgQWJzdHJhY3RCdXR0b25Qcm9wZXJ0aWVzIHsNCisgICAgcHVibGljIHN0YXRpYyBNYXAvKjxTdHJpbmcsIFRyaWdnZXJCaW5kaW5nPiovIGdldFN5bnRoZXRpY1Byb3BlcnRpZXMoKSB7DQorICAgICAgICBNYXAvKjxTdHJpbmcsIFRyaWdnZXJCaW5kaW5nPiovIHJlc3VsdCA9IG5ldyBIYXNoTWFwLyo8U3RyaW5nLCBUcmlnZ2VyQmluZGluZz4qLygpOw0KKyAgICAgICAgcmVzdWx0LnB1dChBYnN0cmFjdEJ1dHRvbi5jbGFzcy5nZXROYW1lKCkgKyAiI3NlbGVjdGVkIiwNCisgICAgICAgICAgICBuZXcgVHJpZ2dlckJpbmRpbmcoKSB7DQorICAgICAgICAgICAgICAgIHB1YmxpYyBGdWxsQmluZGluZyBjcmVhdGVCaW5kaW5nKFNvdXJjZUJpbmRpbmcgc291cmNlLCBUYXJnZXRCaW5kaW5nIHRhcmdldCkgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBYnN0cmFjdEJ1dHRvblNlbGVjdGVkQmluZGluZygoUHJvcGVydHlCaW5kaW5nKSBzb3VyY2UsIHRhcmdldCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9KTsNCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgIH0NCit9DQorDQorDQorY2xhc3MgQWJzdHJhY3RCdXR0b25TZWxlY3RlZEJpbmRpbmcgZXh0ZW5kcyBBYnN0cmFjdEZ1bGxCaW5kaW5nIGltcGxlbWVudHMgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciwgSXRlbUxpc3RlbmVyIHsNCisgICAgYm9vbGVhbiBib3VuZDsNCisgICAgQWJzdHJhY3RCdXR0b24gYm91bmRCdXR0b247DQorDQorICAgIHB1YmxpYyBBYnN0cmFjdEJ1dHRvblNlbGVjdGVkQmluZGluZyhQcm9wZXJ0eUJpbmRpbmcgc291cmNlLCBUYXJnZXRCaW5kaW5nIHRhcmdldCkgew0KKyAgICAgICAgYm91bmQgPSBmYWxzZTsNCisgICAgICAgIHNldFNvdXJjZUJpbmRpbmcoc291cmNlKTsNCisgICAgICAgIHNldFRhcmdldEJpbmRpbmcodGFyZ2V0KTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYmluZCgpIHsNCisgICAgICAgIGlmICghYm91bmQpIHsNCisgICAgICAgICAgICBib3VuZEJ1dHRvbiA9IChBYnN0cmFjdEJ1dHRvbikgKChQcm9wZXJ0eUJpbmRpbmcpIHNvdXJjZUJpbmRpbmcpLmdldEJlYW4oKTsNCisgICAgICAgICAgICB0cnkgew0KKyAgICAgICAgICAgICAgICBib3VuZEJ1dHRvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCJtb2RlbCIsIHRoaXMpOw0KKyAgICAgICAgICAgICAgICBib3VuZEJ1dHRvbi5nZXRNb2RlbCgpLmFkZEl0ZW1MaXN0ZW5lcih0aGlzKTsNCisgICAgICAgICAgICAgICAgYm91bmQgPSB0cnVlOw0KKyAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsNCisgICAgICAgICAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICAgICAgICAgIGJvdW5kQnV0dG9uLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoIm1vZGVsIiwgdGhpcyk7DQorICAgICAgICAgICAgICAgICAgICBib3VuZEJ1dHRvbi5nZXRNb2RlbCgpLnJlbW92ZUl0ZW1MaXN0ZW5lcih0aGlzKTsNCisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCisgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBhcyB3ZSBhcmUgcmUtdGhyb3dpbmcgdGhlIG9yaWdpbmFsIGNhdXNlDQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgdGhyb3cgcmU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCB1bmJpbmQoKSB7DQorICAgICAgICBpZiAoYm91bmQpIHsNCisgICAgICAgICAgICBib3VuZCA9IGZhbHNlOw0KKyAgICAgICAgICAgIC8vIGZhaWwgZGlydHksIG5vIGNoZWNrcw0KKyAgICAgICAgICAgIGJvdW5kQnV0dG9uLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoIm1vZGVsIiwgdGhpcyk7DQorICAgICAgICAgICAgYm91bmRCdXR0b24uZ2V0TW9kZWwoKS5yZW1vdmVJdGVtTGlzdGVuZXIodGhpcyk7DQorICAgICAgICAgICAgYm91bmRCdXR0b24gPSBudWxsOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHJlYmluZCgpIHsNCisgICAgICAgIGlmIChib3VuZCkgew0KKyAgICAgICAgICAgIHVuYmluZCgpOw0KKyAgICAgICAgICAgIGJpbmQoKTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VCaW5kaW5nKFNvdXJjZUJpbmRpbmcgc291cmNlKSB7DQorICAgICAgICBpZiAoIShzb3VyY2UgaW5zdGFuY2VvZiBQcm9wZXJ0eUJpbmRpbmcpKSB7DQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiT25seSBQcm9wZXJ0eVNvdXJjZUJpbmRpbmdzIGFyZSBhY2NlcHRlZCIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaWYgKCEic2VsZWN0ZWQiLmVxdWFscygoKFByb3BlcnR5QmluZGluZylzb3VyY2UpLmdldFByb3BlcnR5TmFtZSgpKSkgew0KKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlByb3BlcnR5TmFtZSBtdXN0IGJlICdzZWxlY3RlZCciKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmICghKCgoUHJvcGVydHlCaW5kaW5nKXNvdXJjZSkuZ2V0QmVhbigpIGluc3RhbmNlb2YgQWJzdHJhY3RCdXR0b24pKSB7DQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU291cmNlQmVhbiBtdXN0IGJlIGFuIEFic3RyYWN0QnV0dG9uIik7DQorICAgICAgICB9DQorICAgICAgICBzdXBlci5zZXRTb3VyY2VCaW5kaW5nKHNvdXJjZSk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0QmluZGluZyhUYXJnZXRCaW5kaW5nIHRhcmdldCkgew0KKyAgICAgICAgc3VwZXIuc2V0VGFyZ2V0QmluZGluZyh0YXJnZXQpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsNCisgICAgICAgIHVwZGF0ZSgpOw0KKyAgICAgICAgKChCdXR0b25Nb2RlbClldmVudC5nZXRPbGRWYWx1ZSgpKS5yZW1vdmVJdGVtTGlzdGVuZXIodGhpcyk7DQorICAgICAgICAoKEJ1dHRvbk1vZGVsKWV2ZW50LmdldE5ld1ZhbHVlKCkpLmFkZEl0ZW1MaXN0ZW5lcih0aGlzKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBpdGVtU3RhdGVDaGFuZ2VkKEl0ZW1FdmVudCBlKSB7DQorICAgICAgICB1cGRhdGUoKTsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3N3aW5nL2JpbmRpbmcvSlNsaWRlclByb3BlcnRpZXMuamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvYmluZGluZy9KU2xpZGVyUHJvcGVydGllcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlNGZmOGQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3N3aW5nL2JpbmRpbmcvSlNsaWRlclByb3BlcnRpZXMuamF2YQpAQCAtMCwwICsxLDEyNyBAQAorLyoNCisgKiBDb3B5cmlnaHQgMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorcGFja2FnZSBncm9vdnkuc3dpbmcuYmluZGluZzsNCisNCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5iaW5kaW5nLkFic3RyYWN0RnVsbEJpbmRpbmc7DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYmluZGluZy5GdWxsQmluZGluZzsNCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5iaW5kaW5nLlByb3BlcnR5QmluZGluZzsNCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5iaW5kaW5nLlNvdXJjZUJpbmRpbmc7DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYmluZGluZy5UYXJnZXRCaW5kaW5nOw0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmJpbmRpbmcuVHJpZ2dlckJpbmRpbmc7DQorDQoraW1wb3J0IGphdmF4LnN3aW5nLkJvdW5kZWRSYW5nZU1vZGVsOw0KK2ltcG9ydCBqYXZheC5zd2luZy5KU2xpZGVyOw0KK2ltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VFdmVudDsNCitpbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuQ2hhbmdlTGlzdGVuZXI7DQoraW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VFdmVudDsNCitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOw0KK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCitpbXBvcnQgamF2YS51dGlsLk1hcDsNCisNCisvKioNCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzaGVtbm9uQHlhaG9vLmNvbSI+RGFubm8gRmVycmluPC9hPg0KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQNCisgKiBAc2luY2UgR3Jvb3Z5IDEuMQ0KKyAqLw0KK3B1YmxpYyBjbGFzcyBKU2xpZGVyUHJvcGVydGllcyB7DQorICAgIHB1YmxpYyBzdGF0aWMgTWFwLyo8U3RyaW5nLCBUcmlnZ2VyQmluZGluZz4qLyBnZXRTeW50aGV0aWNQcm9wZXJ0aWVzKCkgew0KKyAgICAgICAgTWFwLyo8U3RyaW5nLCBUcmlnZ2VyQmluZGluZz4qLyByZXN1bHQgPSBuZXcgSGFzaE1hcC8qPFN0cmluZywgVHJpZ2dlckJpbmRpbmc+Ki8oKTsNCisgICAgICAgIHJlc3VsdC5wdXQoSlNsaWRlci5jbGFzcy5nZXROYW1lKCkgKyAiI3ZhbHVlIiwNCisgICAgICAgICAgICAgICAgbmV3IFRyaWdnZXJCaW5kaW5nKCkgew0KKyAgICAgICAgICAgICAgICAgICAgcHVibGljIEZ1bGxCaW5kaW5nIGNyZWF0ZUJpbmRpbmcoU291cmNlQmluZGluZyBzb3VyY2UsIFRhcmdldEJpbmRpbmcgdGFyZ2V0KSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBKU2xpZGVyVmFsdWVCaW5kaW5nKChQcm9wZXJ0eUJpbmRpbmcpIHNvdXJjZSwgdGFyZ2V0KTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfSk7DQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICB9DQorfQ0KKw0KKw0KK2NsYXNzIEpTbGlkZXJWYWx1ZUJpbmRpbmcgZXh0ZW5kcyBBYnN0cmFjdEZ1bGxCaW5kaW5nIGltcGxlbWVudHMgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciwgQ2hhbmdlTGlzdGVuZXIgew0KKyAgICBib29sZWFuIGJvdW5kOw0KKyAgICBKU2xpZGVyIGJvdW5kU2xpZGVyOw0KKw0KKw0KKyAgICBwdWJsaWMgSlNsaWRlclZhbHVlQmluZGluZyhQcm9wZXJ0eUJpbmRpbmcgc291cmNlLCBUYXJnZXRCaW5kaW5nIHRhcmdldCkgew0KKyAgICAgICAgYm91bmQgPSBmYWxzZTsNCisgICAgICAgIHNldFNvdXJjZUJpbmRpbmcoc291cmNlKTsNCisgICAgICAgIHNldFRhcmdldEJpbmRpbmcodGFyZ2V0KTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYmluZCgpIHsNCisgICAgICAgIGlmICghYm91bmQpIHsNCisgICAgICAgICAgICBib3VuZFNsaWRlciA9IChKU2xpZGVyKSAoKFByb3BlcnR5QmluZGluZylzb3VyY2VCaW5kaW5nKS5nZXRCZWFuKCk7DQorICAgICAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICAgICAgYm91bmRTbGlkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigibW9kZWwiLCB0aGlzKTsNCisgICAgICAgICAgICAgICAgYm91bmRTbGlkZXIuZ2V0TW9kZWwoKS5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzKTsNCisgICAgICAgICAgICAgICAgYm91bmQgPSB0cnVlOw0KKyAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsNCisgICAgICAgICAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICAgICAgICAgIGJvdW5kU2xpZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoIm1vZGVsIiwgdGhpcyk7DQorICAgICAgICAgICAgICAgICAgICBib3VuZFNsaWRlci5nZXRNb2RlbCgpLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMpOw0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KKyAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGFzIHdlIGFyZSByZS10aHJvd2luZyB0aGUgb3JpZ2luYWwgY2F1c2UNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB0aHJvdyByZTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHVuYmluZCgpIHsNCisgICAgICAgIGlmIChib3VuZCkgew0KKyAgICAgICAgICAgIGJvdW5kID0gZmFsc2U7DQorICAgICAgICAgICAgLy8gZmFpbCBkaXJ0eSwgbm8gY2hlY2tzDQorICAgICAgICAgICAgYm91bmRTbGlkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigibW9kZWwiLCB0aGlzKTsNCisgICAgICAgICAgICBib3VuZFNsaWRlci5nZXRNb2RlbCgpLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMpOw0KKyAgICAgICAgICAgIGJvdW5kU2xpZGVyID0gbnVsbDsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCByZWJpbmQoKSB7DQorICAgICAgICBpZiAoYm91bmQpIHsNCisgICAgICAgICAgICB1bmJpbmQoKTsNCisgICAgICAgICAgICBiaW5kKCk7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgc2V0U291cmNlQmluZGluZyhTb3VyY2VCaW5kaW5nIHNvdXJjZSkgew0KKyAgICAgICAgaWYgKCEoc291cmNlIGluc3RhbmNlb2YgUHJvcGVydHlCaW5kaW5nKSkgew0KKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk9ubHkgUHJvcGVydHlTb3VyY2VCaW5kaW5ncyBhcmUgYWNjZXB0ZWQiKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIGlmICghInZhbHVlIi5lcXVhbHMoKChQcm9wZXJ0eUJpbmRpbmcpIHNvdXJjZSkuZ2V0UHJvcGVydHlOYW1lKCkpKSB7DQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUHJvcGVydHlOYW1lIG11c3QgYmUgJ3ZhbHVlJyIpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKCEoKChQcm9wZXJ0eUJpbmRpbmcpIHNvdXJjZSkuZ2V0QmVhbigpIGluc3RhbmNlb2YgSlNsaWRlcikpIHsNCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTb3VyY2VCZWFuIG11c3QgYmUgYW4gSlNsaWRlciIpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc3VwZXIuc2V0U291cmNlQmluZGluZyhzb3VyY2UpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldEJpbmRpbmcoVGFyZ2V0QmluZGluZyB0YXJnZXQpIHsNCisgICAgICAgIHN1cGVyLnNldFRhcmdldEJpbmRpbmcodGFyZ2V0KTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7DQorICAgICAgICB1cGRhdGUoKTsNCisgICAgICAgICgoQm91bmRlZFJhbmdlTW9kZWwpIGV2ZW50LmdldE9sZFZhbHVlKCkpLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMpOw0KKyAgICAgICAgKChCb3VuZGVkUmFuZ2VNb2RlbCkgZXZlbnQuZ2V0TmV3VmFsdWUoKSkuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcyk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsNCisgICAgICAgIHVwZGF0ZSgpOw0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvYmluZGluZy9KVGV4dENvbXBvbmVudFByb3BlcnRpZXMuamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvYmluZGluZy9KVGV4dENvbXBvbmVudFByb3BlcnRpZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWQ2ZDhkCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zd2luZy9iaW5kaW5nL0pUZXh0Q29tcG9uZW50UHJvcGVydGllcy5qYXZhCkBAIC0wLDAgKzEsMTM3IEBACisvKg0KKyAqIENvcHlyaWdodCAyMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4NCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCitwYWNrYWdlIGdyb292eS5zd2luZy5iaW5kaW5nOw0KKw0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmJpbmRpbmcuRnVsbEJpbmRpbmc7DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYmluZGluZy5Qcm9wZXJ0eUJpbmRpbmc7DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYmluZGluZy5Tb3VyY2VCaW5kaW5nOw0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmJpbmRpbmcuVGFyZ2V0QmluZGluZzsNCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5iaW5kaW5nLlRyaWdnZXJCaW5kaW5nOw0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmJpbmRpbmcuQWJzdHJhY3RGdWxsQmluZGluZzsNCisNCitpbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuRG9jdW1lbnRFdmVudDsNCitpbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuRG9jdW1lbnRMaXN0ZW5lcjsNCitpbXBvcnQgamF2YXguc3dpbmcudGV4dC5Eb2N1bWVudDsNCitpbXBvcnQgamF2YXguc3dpbmcudGV4dC5KVGV4dENvbXBvbmVudDsNCitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUV2ZW50Ow0KK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7DQoraW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KK2ltcG9ydCBqYXZhLnV0aWwuTWFwOw0KKw0KKw0KKy8qKg0KKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnNoZW1ub25AeWFob28uY29tIj5EYW5ubyBGZXJyaW48L2E+DQorICogQHZlcnNpb24gJFJldmlzaW9uJA0KKyAqIEBzaW5jZSBHcm9vdnkgMS4xDQorICovDQorcHVibGljIGNsYXNzIEpUZXh0Q29tcG9uZW50UHJvcGVydGllcyB7DQorDQorICAgIHB1YmxpYyBzdGF0aWMgTWFwLyo8U3RyaW5nLCBUcmlnZ2VyQmluZGluZz4qLyBnZXRTeW50aGV0aWNQcm9wZXJ0aWVzKCkgew0KKyAgICAgICAgTWFwLyo8U3RyaW5nLCBUcmlnZ2VyQmluZGluZz4qLyByZXN1bHQgPSBuZXcgSGFzaE1hcC8qPFN0cmluZywgVHJpZ2dlckJpbmRpbmc+Ki8oKTsNCisgICAgICAgIHJlc3VsdC5wdXQoSlRleHRDb21wb25lbnQuY2xhc3MuZ2V0TmFtZSgpICsgIiN0ZXh0IiwNCisgICAgICAgICAgICBuZXcgVHJpZ2dlckJpbmRpbmcoKSB7DQorICAgICAgICAgICAgICAgIHB1YmxpYyBGdWxsQmluZGluZyBjcmVhdGVCaW5kaW5nKFNvdXJjZUJpbmRpbmcgc291cmNlLCBUYXJnZXRCaW5kaW5nIHRhcmdldCkgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBKVGV4dENvbXBvbmVudFRleHRCaW5kaW5nKChQcm9wZXJ0eUJpbmRpbmcpIHNvdXJjZSwgdGFyZ2V0KTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0pOw0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgfQ0KK30NCisNCisNCitjbGFzcyBKVGV4dENvbXBvbmVudFRleHRCaW5kaW5nIGV4dGVuZHMgQWJzdHJhY3RGdWxsQmluZGluZyBpbXBsZW1lbnRzIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIsIERvY3VtZW50TGlzdGVuZXIgew0KKyAgICBib29sZWFuIGJvdW5kOw0KKyAgICBKVGV4dENvbXBvbmVudCBib3VuZFRleHRDb21wb25lbnQ7DQorDQorICAgIHB1YmxpYyBKVGV4dENvbXBvbmVudFRleHRCaW5kaW5nKFByb3BlcnR5QmluZGluZyBzb3VyY2UsIFRhcmdldEJpbmRpbmcgdGFyZ2V0KSB7DQorICAgICAgICBib3VuZCA9IGZhbHNlOw0KKyAgICAgICAgc2V0U291cmNlQmluZGluZyhzb3VyY2UpOw0KKyAgICAgICAgc2V0VGFyZ2V0QmluZGluZyh0YXJnZXQpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBiaW5kKCkgew0KKyAgICAgICAgaWYgKCFib3VuZCkgew0KKyAgICAgICAgICAgIGJvdW5kVGV4dENvbXBvbmVudCA9IChKVGV4dENvbXBvbmVudCkgKChQcm9wZXJ0eUJpbmRpbmcpc291cmNlQmluZGluZykuZ2V0QmVhbigpOw0KKyAgICAgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgICAgIGJvdW5kVGV4dENvbXBvbmVudC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCJkb2N1bWVudCIsIHRoaXMpOw0KKyAgICAgICAgICAgICAgICBib3VuZFRleHRDb21wb25lbnQuZ2V0RG9jdW1lbnQoKS5hZGREb2N1bWVudExpc3RlbmVyKHRoaXMpOw0KKyAgICAgICAgICAgICAgICBib3VuZCA9IHRydWU7DQorICAgICAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgew0KKyAgICAgICAgICAgICAgICB0cnkgew0KKyAgICAgICAgICAgICAgICAgICAgYm91bmRUZXh0Q29tcG9uZW50LnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoImRvY3VtZW50IiwgdGhpcyk7DQorICAgICAgICAgICAgICAgICAgICBib3VuZFRleHRDb21wb25lbnQuZ2V0RG9jdW1lbnQoKS5yZW1vdmVEb2N1bWVudExpc3RlbmVyKHRoaXMpOw0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KKyAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGFzIHdlIGFyZSByZS10aHJvd2luZyB0aGUgb3JpZ2luYWwgY2F1c2UNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB0aHJvdyByZTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHVuYmluZCgpIHsNCisgICAgICAgIGlmIChib3VuZCkgew0KKyAgICAgICAgICAgIGJvdW5kID0gZmFsc2U7DQorICAgICAgICAgICAgLy8gZmFpbCBkaXJ0eSwgbm8gY2hlY2tzDQorICAgICAgICAgICAgYm91bmRUZXh0Q29tcG9uZW50LnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoImRvY3VtZW50IiwgdGhpcyk7DQorICAgICAgICAgICAgYm91bmRUZXh0Q29tcG9uZW50LmdldERvY3VtZW50KCkucmVtb3ZlRG9jdW1lbnRMaXN0ZW5lcih0aGlzKTsNCisgICAgICAgICAgICBib3VuZFRleHRDb21wb25lbnQgPSBudWxsOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHJlYmluZCgpIHsNCisgICAgICAgIGlmIChib3VuZCkgew0KKyAgICAgICAgICAgIHVuYmluZCgpOw0KKyAgICAgICAgICAgIGJpbmQoKTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VCaW5kaW5nKFNvdXJjZUJpbmRpbmcgc291cmNlKSB7DQorICAgICAgICBpZiAoIShzb3VyY2UgaW5zdGFuY2VvZiBQcm9wZXJ0eUJpbmRpbmcpKSB7DQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiT25seSBQcm9wZXJ0eUJpbmRpbmdzIGFyZSBhY2NlcHRlZCIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaWYgKCEidGV4dCIuZXF1YWxzKCgoUHJvcGVydHlCaW5kaW5nKXNvdXJjZSkuZ2V0UHJvcGVydHlOYW1lKCkpKSB7DQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUHJvcGVydHlOYW1lIG11c3QgYmUgJ3RleHQnIik7DQorICAgICAgICB9DQorICAgICAgICBpZiAoISgoKFByb3BlcnR5QmluZGluZylzb3VyY2UpLmdldEJlYW4oKSBpbnN0YW5jZW9mIEpUZXh0Q29tcG9uZW50KSkgew0KKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlNvdXJjZUJlYW4gbXVzdCBiZSBhIFRleHRDb21wb25lbnQiKTsNCisgICAgICAgIH0NCisgICAgICAgIHN1cGVyLnNldFNvdXJjZUJpbmRpbmcoc291cmNlKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXRCaW5kaW5nKFRhcmdldEJpbmRpbmcgdGFyZ2V0KSB7DQorICAgICAgICBzdXBlci5zZXRUYXJnZXRCaW5kaW5nKHRhcmdldCk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgew0KKyAgICAgICAgdXBkYXRlKCk7DQorICAgICAgICAoKERvY3VtZW50KWV2ZW50LmdldE9sZFZhbHVlKCkpLnJlbW92ZURvY3VtZW50TGlzdGVuZXIodGhpcyk7DQorICAgICAgICAoKERvY3VtZW50KWV2ZW50LmdldE5ld1ZhbHVlKCkpLmFkZERvY3VtZW50TGlzdGVuZXIodGhpcyk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgY2hhbmdlZFVwZGF0ZShEb2N1bWVudEV2ZW50IGV2ZW50KSB7DQorICAgICAgICB1cGRhdGUoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBpbnNlcnRVcGRhdGUoRG9jdW1lbnRFdmVudCBldmVudCkgew0KKyAgICAgICAgdXBkYXRlKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgcmVtb3ZlVXBkYXRlKERvY3VtZW50RXZlbnQgZXZlbnQpIHsNCisgICAgICAgIHVwZGF0ZSgpOw0KKyAgICB9DQorDQorfQ0KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvYmluZGluZy9wYWNrYWdlLmh0bWwgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3N3aW5nL2JpbmRpbmcvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNzI2OTYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3N3aW5nL2JpbmRpbmcvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsMTAgQEAKKzxodG1sPgorICA8aGVhZD4KKyAgICA8dGl0bGU+cGFja2FnZSBncm9vdnkuc3dpbmcuYmluZGluZy4qPC90aXRsZT4KKyAgPC9oZWFkPgorICA8Ym9keT4KKyAgICA8cD4KKyAgICAgIEJpbmRpbmcgY2xhc3NlcyBmb3IgU3dpbmdCdWlsZGVyCisgICAgPC9wPgorICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3N3aW5nL2ZhY3RvcnkvQWN0aW9uRmFjdG9yeS5ncm9vdnkgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3N3aW5nL2ZhY3RvcnkvQWN0aW9uRmFjdG9yeS5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NjMTI4OQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvZmFjdG9yeS9BY3Rpb25GYWN0b3J5Lmdyb292eQpAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgZ3Jvb3Z5LnN3aW5nLmZhY3RvcnkKKworaW1wb3J0IGdyb292eS5zd2luZy5pbXBsLkRlZmF1bHRBY3Rpb24KK2ltcG9ydCBqYXZheC5zd2luZy5BY3Rpb24KK2ltcG9ydCBqYXZheC5zd2luZy5LZXlTdHJva2UKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuSW52b2tlckhlbHBlcgoraW1wb3J0IGphdmF4LnN3aW5nLkpDb21wb25lbnQKKworLyoqCisgKgorICogQGF1dGhvciBEYW5ubyBGZXJyaW4KKyAqLworcHVibGljIGNsYXNzIEFjdGlvbkZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdEZhY3RvcnkgeworICAgIAorICAgIHB1YmxpYyBPYmplY3QgbmV3SW5zdGFuY2UoRmFjdG9yeUJ1aWxkZXJTdXBwb3J0IGJ1aWxkZXIsIE9iamVjdCBuYW1lLCBPYmplY3QgdmFsdWUsIE1hcCBhdHRyaWJ1dGVzKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7CisgICAgICAgIEFjdGlvbiBhY3Rpb24gPSBudWxsOworICAgICAgICBpZiAoRmFjdG9yeUJ1aWxkZXJTdXBwb3J0LmNoZWNrVmFsdWVJc1R5cGVOb3RTdHJpbmcodmFsdWUsIG5hbWUsIEFjdGlvbi5jbGFzcykpIHsKKyAgICAgICAgICAgIGFjdGlvbiA9IChBY3Rpb24pIHZhbHVlOworICAgICAgICB9IGVsc2UgaWYgKGF0dHJpYnV0ZXMuZ2V0KG5hbWUpIGluc3RhbmNlb2YgQWN0aW9uKSB7CisgICAgICAgICAgICBhY3Rpb24gPSAoQWN0aW9uKSBhdHRyaWJ1dGVzLnJlbW92ZShuYW1lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFjdGlvbiA9IG5ldyBEZWZhdWx0QWN0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFjdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBvbkhhbmRsZU5vZGVBdHRyaWJ1dGVzKCBGYWN0b3J5QnVpbGRlclN1cHBvcnQgYnVpbGRlciwgT2JqZWN0IGFjdGlvbiwKKyAgICAgICAgICAgIE1hcCBhdHRyaWJ1dGVzKQorICAgIHsKKyAgICAgICAgaWYgKChhdHRyaWJ1dGVzLmdldCgiY2xvc3VyZSIpIGluc3RhbmNlb2YgQ2xvc3VyZSkgJiYgKGFjdGlvbiBpbnN0YW5jZW9mIERlZmF1bHRBY3Rpb24pKXsKKyAgICAgICAgICAgIENsb3N1cmUgY2xvc3VyZSA9IChDbG9zdXJlKSBhdHRyaWJ1dGVzLnJlbW92ZSgiY2xvc3VyZSIpOworICAgICAgICAgICAgKChEZWZhdWx0QWN0aW9uKWFjdGlvbikuc2V0Q2xvc3VyZShjbG9zdXJlKTsKKyAgICAgICAgfQorCisgICAgICAgIE9iamVjdCBhY2NlbCA9IGF0dHJpYnV0ZXMucmVtb3ZlKCJhY2NlbGVyYXRvciIpOworICAgICAgICBpZiAoYWNjZWwgIT0gbnVsbCkgeworICAgICAgICAgICAgS2V5U3Ryb2tlIHN0cm9rZSA9IG51bGw7CisgICAgICAgICAgICBpZiAoYWNjZWwgaW5zdGFuY2VvZiBLZXlTdHJva2UpIHsKKyAgICAgICAgICAgICAgICBzdHJva2UgPSAoS2V5U3Ryb2tlKSBhY2NlbDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3Ryb2tlID0gS2V5U3Ryb2tlLmdldEtleVN0cm9rZShhY2NlbC50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFjdGlvbi5wdXRWYWx1ZShBY3Rpb24uQUNDRUxFUkFUT1JfS0VZLCBzdHJva2UpOworICAgICAgICB9CisKKyAgICAgICAgT2JqZWN0IG1uZW1vbmljID0gYXR0cmlidXRlcy5yZW1vdmUoIm1uZW1vbmljIik7CisgICAgICAgIGlmIChtbmVtb25pYyAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoIShtbmVtb25pYyBpbnN0YW5jZW9mIE51bWJlcikpIHsKKyAgICAgICAgICAgICAgICBtbmVtb25pYyA9IG1uZW1vbmljLnRvU3RyaW5nKCkuY2hhckF0KDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWN0aW9uLnB1dFZhbHVlKEFjdGlvbi5NTkVNT05JQ19LRVksIG1uZW1vbmljIGFzIEludGVnZXIpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBmb3IgKGVudHJ5IGluIGF0dHJpYnV0ZXMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOworICAgICAgICAgICAgLy8gZmlyc3QgYXR0ZW1wdCB0byBzZXQgYXMgYSBzdHJhaWdodCBwcm9lcHJ0eQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBJbnZva2VySGVscGVyLnNldFByb3BlcnR5KGFjdGlvbiwgcHJvcGVydHlOYW1lLCBlbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE1pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbiBtcGUpIHsKKyAgICAgICAgICAgICAgICAvLyBmYWlsaW5nIHRoYXQgc3RvcmUgdGhlbSBpbiB0aGUgYWN0aW9uIHZhbHVlcyBsaXN0CisgICAgICAgICAgICAgICAgLy8gdHlwaWNhbGx5IHN0YW5kYXJkIEFjdGlvbiBuYW1lcyBzdGFydCB3aXRoIHVwcGVyIGNhc2UsIHNvIGxldHMgdXBwZXIgY2FzZSBpdAorICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZSA9IGNhcGl0YWxpemUocHJvcGVydHlOYW1lKTsKKyAgICAgICAgICAgICAgICBhY3Rpb24ucHV0VmFsdWUocHJvcGVydHlOYW1lLCBlbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlCisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UGFyZW50KEZhY3RvcnlCdWlsZGVyU3VwcG9ydCBidWlsZGVyLCBPYmplY3QgcGFyZW50LCBPYmplY3QgYWN0aW9uKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJbnZva2VySGVscGVyLnNldFByb3BlcnR5KHBhcmVudCwgImFjdGlvbiIsIGFjdGlvbik7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIC8vIG11c3Qgbm90IGhhdmUgYW4gYWN0aW9uIHByb3BlcnR5Li4uCisgICAgICAgICAgICAvLyBzbyB3ZSBpZ25vcmUgaXQgYW5kIGdvIG9uCisgICAgICAgIH0KKyAgICAgICAgT2JqZWN0IGtleVN0cm9rZSA9IGFjdGlvbi5nZXRWYWx1ZSgiS2V5U3Ryb2tlIik7CisgICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBKQ29tcG9uZW50KSB7CisgICAgICAgICAgICBKQ29tcG9uZW50IGNvbXBvbmVudCA9IChKQ29tcG9uZW50KSBwYXJlbnQ7CisgICAgICAgICAgICBLZXlTdHJva2Ugc3Ryb2tlID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChrZXlTdHJva2UgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKyAgICAgICAgICAgICAgICBzdHJva2UgPSBLZXlTdHJva2UuZ2V0S2V5U3Ryb2tlKChTdHJpbmcpIGtleVN0cm9rZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGtleVN0cm9rZSBpbnN0YW5jZW9mIEtleVN0cm9rZSkgeworICAgICAgICAgICAgICAgIHN0cm9rZSA9IChLZXlTdHJva2UpIGtleVN0cm9rZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdHJva2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBhY3Rpb24udG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBjb21wb25lbnQuZ2V0SW5wdXRNYXAoKS5wdXQoc3Ryb2tlLCBrZXkpOworICAgICAgICAgICAgICAgIGNvbXBvbmVudC5nZXRBY3Rpb25NYXAoKS5wdXQoa2V5LCBhY3Rpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICBTdHJpbmcgY2FwaXRhbGl6ZShTdHJpbmcgdGV4dCkgeworICAgICAgICBjaGFyIGNoID0gdGV4dC5jaGFyQXQoMCk7CisgICAgICAgIGlmIChDaGFyYWN0ZXIuaXNVcHBlckNhc2UoY2gpKSB7CisgICAgICAgICAgICByZXR1cm4gdGV4dDsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcih0ZXh0Lmxlbmd0aCgpKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZChDaGFyYWN0ZXIudG9VcHBlckNhc2UoY2gpKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZCh0ZXh0LnN1YnN0cmluZygxKSk7CisgICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvZmFjdG9yeS9CZWFuRmFjdG9yeS5ncm9vdnkgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3N3aW5nL2ZhY3RvcnkvQmVhbkZhY3RvcnkuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNjcyZmUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3N3aW5nL2ZhY3RvcnkvQmVhbkZhY3RvcnkuZ3Jvb3Z5CkBAIC0wLDAgKzEsNTQgQEAKKy8qDQorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorcGFja2FnZSBncm9vdnkuc3dpbmcuZmFjdG9yeQ0KKw0KKy8qKg0KKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnNoZW1ub25AeWFob28uY29tIj5EYW5ubyBGZXJyaW48L2E+DQorICogQHZlcnNpb24gJFJldmlzaW9uOiA3OTUzICQNCisgKiBAc2luY2UgR3Jvb3Z5IDEuMQ0KKyAqLw0KK2NsYXNzIEJlYW5GYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RGYWN0b3J5IHsNCisgICAgZmluYWwgQ2xhc3MgYmVhbkNsYXNzDQorICAgIGZpbmFsIHByb3RlY3RlZCBib29sZWFuIGxlYWYNCisNCisgICAgcHVibGljIEJlYW5GYWN0b3J5KENsYXNzIGJlYW5DbGFzcykgew0KKyAgICAgICAgdGhpcyhiZWFuQ2xhc3MsIGZhbHNlKQ0KKyAgICB9DQorDQorICAgIHB1YmxpYyBCZWFuRmFjdG9yeShDbGFzcyBiZWFuQ2xhc3MsIGJvb2xlYW4gbGVhZikgew0KKyAgICAgICAgdGhpcy5iZWFuQ2xhc3MgPSBiZWFuQ2xhc3MNCisgICAgICAgIHRoaXMubGVhZiA9IGxlYWYNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0xlYWYoKSB7DQorICAgICAgICByZXR1cm4gbGVhZg0KKyAgICB9DQorDQorICAgIHB1YmxpYyBPYmplY3QgbmV3SW5zdGFuY2UoRmFjdG9yeUJ1aWxkZXJTdXBwb3J0IGJ1aWxkZXIsIE9iamVjdCBuYW1lLCBPYmplY3QgdmFsdWUsIE1hcCBhdHRyaWJ1dGVzKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7DQorICAgICAgICBpZiAoRmFjdG9yeUJ1aWxkZXJTdXBwb3J0LmNoZWNrVmFsdWVJc1R5cGVOb3RTdHJpbmcodmFsdWUsIG5hbWUsIGJlYW5DbGFzcykpIHsNCisgICAgICAgICAgICByZXR1cm4gdmFsdWUNCisgICAgICAgIH0NCisgICAgICAgIE9iamVjdCBiZWFuID0gYmVhbkNsYXNzLm5ld0luc3RhbmNlKCkNCisgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgew0KKyAgICAgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgICAgIGJlYW4udGV4dCA9IHZhbHVlDQorICAgICAgICAgICAgfSBjYXRjaCAoTWlzc2luZ1Byb3BlcnR5RXhjZXB0aW9uIG1wZSkgew0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW4gJG5hbWUgdmFsdWUgYXJndW1lbnQgb2YgdHlwZSBTdHJpbmcgY2Fubm90IGJlIGFwcGxpZWQgdG8gcHJvcGVydHkgdGV4dDoiKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gYmVhbg0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvZmFjdG9yeS9CZXZlbEJvcmRlckZhY3RvcnkuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zd2luZy9mYWN0b3J5L0JldmVsQm9yZGVyRmFjdG9yeS5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEyNWVhYQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvZmFjdG9yeS9CZXZlbEJvcmRlckZhY3RvcnkuZ3Jvb3Z5CkBAIC0wLDAgKzEsNjMgQEAKKy8qDQorICogQ29weXJpZ2h0IDIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLg0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KK3BhY2thZ2UgZ3Jvb3Z5LnN3aW5nLmZhY3RvcnkNCisNCitpbXBvcnQgamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeQ0KK2ltcG9ydCBqYXZhLmF3dC5Db2xvcg0KKw0KKy8qKg0KKyAqIGFjY2VwdHMgbm8gdmFsdWUNCisgKiBhY2NlcHRzIGF0dHJpYnV0ZXM6PGJyIC8+DQorICogbm9uZSA8YnIgLz4NCisgKiBoaWdobGlnaHQ6IGphdmEuYXd0LkNvbG9yLCBzaGFkb3c6IGphdmEuYXd0LkNvbG9yPGJyIC8+DQorICogaGlnaGxpZ2h0T3V0ZXI6IGphdmEuYXd0LkNvbG9yLCBoaWdobGlnaHRJbm5lcjogamF2YS5hd3QuQ29sb3IsIHNoYWRvd091dGVyOiBqYXZhLmF3dC5Db2xvciwgc2hhZG93SW5uZXI6IGphdmEuYXd0LkNvbG9yPGJyIC8+DQorICoNCisgKi8NCitjbGFzcyBCZXZlbEJvcmRlckZhY3RvcnkgZXh0ZW5kcyBTd2luZ0JvcmRlckZhY3Rvcnkgew0KKw0KKyAgICBmaW5hbCBpbnQgdHlwZTsNCisNCisgICAgcHVibGljIEJldmVsQm9yZGVyRmFjdG9yeShpbnQgbmV3VHlwZSkgew0KKyAgICAgICAgdHlwZSA9IG5ld1R5cGU7DQorICAgIH0NCisNCisgICAgcHVibGljIE9iamVjdCBuZXdJbnN0YW5jZShGYWN0b3J5QnVpbGRlclN1cHBvcnQgYnVpbGRlciwgT2JqZWN0IG5hbWUsIE9iamVjdCB2YWx1ZSwgTWFwIGF0dHJpYnV0ZXMpIHsNCisgICAgICAgIGJ1aWxkZXIuY29udGV4dC5hcHBseUJvcmRlclRvUGFyZW50ID0gYXR0cmlidXRlcy5yZW1vdmUoJ3BhcmVudCcpDQorDQorICAgICAgICAvLyBubyBpZi1lbHNlLWlmIGNoYWluIHNvIHRoYXQgd2UgY2FuIGhhdmUgb25lIGF0dHJpYnV0ZSBmYWlsdXJlIGJsb2NrDQorICAgICAgICBpZiAoYXR0cmlidXRlcy5jb250YWluc0tleSgiaGlnaGxpZ2h0IikpIHsNCisgICAgICAgICAgICBDb2xvciBoaWdobGlnaHQgPSBhdHRyaWJ1dGVzLnJlbW92ZSgiaGlnaGxpZ2h0IikNCisgICAgICAgICAgICBDb2xvciBzaGFkb3cgPSBhdHRyaWJ1dGVzLnJlbW92ZSgic2hhZG93IikNCisgICAgICAgICAgICBpZiAoaGlnaGxpZ2h0ICYmIHNoYWRvdyAmJiAhYXR0cmlidXRlcykgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gQm9yZGVyRmFjdG9yeS5jcmVhdGVCZXZlbEJvcmRlcih0eXBlLCBoaWdobGlnaHQsIHNoYWRvdyk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGF0dHJpYnV0ZXMuY29udGFpbnNLZXkoImhpZ2hsaWdodE91dGVyIikpIHsNCisgICAgICAgICAgICBDb2xvciBoaWdobGlnaHRPdXRlciA9IGF0dHJpYnV0ZXMucmVtb3ZlKCJoaWdobGlnaHRPdXRlciIpDQorICAgICAgICAgICAgQ29sb3IgaGlnaGxpZ2h0SW5uZXIgPSBhdHRyaWJ1dGVzLnJlbW92ZSgiaGlnaGxpZ2h0SW5uZXIiKQ0KKyAgICAgICAgICAgIENvbG9yIHNoYWRvd091dGVyID0gYXR0cmlidXRlcy5yZW1vdmUoInNoYWRvd091dGVyIikNCisgICAgICAgICAgICBDb2xvciBzaGFkb3dJbm5lciA9IGF0dHJpYnV0ZXMucmVtb3ZlKCJzaGFkb3dJbm5lciIpDQorICAgICAgICAgICAgaWYgKGhpZ2hsaWdodE91dGVyICYmIGhpZ2hsaWdodElubmVyICYmIHNoYWRvd091dGVyICYmIHNoYWRvd0lubmVyICYmICFhdHRyaWJ1dGVzKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBCb3JkZXJGYWN0b3J5LmNyZWF0ZUJldmVsQm9yZGVyKHR5cGUsIGhpZ2hsaWdodE91dGVyLCBoaWdobGlnaHRJbm5lciwgc2hhZG93T3V0ZXIsIHNoYWRvd0lubmVyKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAoYXR0cmlidXRlcykgew0KKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCIkbmFtZSBvbmx5IGFjY2VwdHMgbm8gYXR0cmlidXRlcywgb3IgaGlnaGxpZ2h0OiBhbmQgc2hhZG93OiBhdHRyaWJ1dGVzLCBvciBoaWdobGlnaHRPdXRlcjogYW5kIGhpZ2hsaWdodElubmVyOiBhbmQgc2hhZG93T3V0ZXI6IGFuZCBzaGFkb3dJbm5lcjogYXR0cmlidXRlcyIpDQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gQm9yZGVyRmFjdG9yeS5jcmVhdGVCZXZlbEJvcmRlcih0eXBlKTsNCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3N3aW5nL2ZhY3RvcnkvQmluZEZhY3RvcnkuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zd2luZy9mYWN0b3J5L0JpbmRGYWN0b3J5Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTJjYjllCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zd2luZy9mYWN0b3J5L0JpbmRGYWN0b3J5Lmdyb292eQpAQCAtMCwwICsxLDE3MyBAQAorLyoNCisgKiBDb3B5cmlnaHQgMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorcGFja2FnZSBncm9vdnkuc3dpbmcuZmFjdG9yeQ0KKw0KK2ltcG9ydCBncm9vdnkuc3dpbmcuYmluZGluZy5BYnN0cmFjdEJ1dHRvblByb3BlcnRpZXMNCitpbXBvcnQgZ3Jvb3Z5LnN3aW5nLmJpbmRpbmcuSlNsaWRlclByb3BlcnRpZXMNCitpbXBvcnQgZ3Jvb3Z5LnN3aW5nLmJpbmRpbmcuSlRleHRDb21wb25lbnRQcm9wZXJ0aWVzDQorDQoraW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7DQorDQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYmluZGluZy4qDQorDQorLyoqDQorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86c2hlbW5vbkB5YWhvby5jb20iPkRhbm5vIEZlcnJpbjwvYT4NCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kDQorICogQHNpbmNlIEdyb292eSAxLjENCisgKi8NCitwdWJsaWMgY2xhc3MgQmluZEZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdEZhY3Rvcnkgew0KKw0KKyAgICBmaW5hbCBNYXAvKjxTdHJpbmcsIFRyaWdnZXJCaW5kaW5nKi8gc3ludGhldGljQmluZGluZ3M7DQorDQorICAgIHB1YmxpYyBCaW5kRmFjdG9yeSgpIHsNCisgICAgICAgIHN5bnRoZXRpY0JpbmRpbmdzID0gbmV3IEhhc2hNYXAoKTsNCisNCisgICAgICAgIC8vIGNvdmVycyBKVGV4dEZpZWxkLnRleHQNCisgICAgICAgIC8vIGNvdmVycyBKVGV4dFBhbmUudGV4dA0KKyAgICAgICAgLy8gY292ZXJzIEpUZXh0QXJlYS50ZXh0DQorICAgICAgICAvLyBjb3ZlcnMgSkVkaXRvclBhbmUudGV4dA0KKyAgICAgICAgc3ludGhldGljQmluZGluZ3MucHV0QWxsKEpUZXh0Q29tcG9uZW50UHJvcGVydGllcy5nZXRTeW50aGV0aWNQcm9wZXJ0aWVzKCkpOw0KKw0KKyAgICAgICAgLy8gY292ZXJzIEpDaGVja0JveC5zZWxlY3RlZA0KKyAgICAgICAgLy8gY292ZXJzIEpDaGVjQm94TWVudUl0ZW0uc2VsZWN0ZWQNCisgICAgICAgIC8vIGNvdmVycyBKUmFkaW9CdXR0b24uc2VsZWN0ZWQNCisgICAgICAgIC8vIGNvdmVycyBKUmFkaW9CdXR0b25NZW51SXRlbS5zZWxlY3RlZA0KKyAgICAgICAgLy8gY292ZXJzIEpUb2dnbGVCdXR0b24uc2VsZWN0ZWQNCisgICAgICAgIHN5bnRoZXRpY0JpbmRpbmdzLnB1dEFsbChBYnN0cmFjdEJ1dHRvblByb3BlcnRpZXMuZ2V0U3ludGhldGljUHJvcGVydGllcygpKTsNCisNCisgICAgICAgIC8vIGNvdmVycyBKU2xpZGVyLnZhbHVlDQorICAgICAgICBzeW50aGV0aWNCaW5kaW5ncy5wdXRBbGwoSlNsaWRlclByb3BlcnRpZXMuZ2V0U3ludGhldGljUHJvcGVydGllcygpKTsNCisNCisgICAgICAgIC8vIEpDb21ib0JveC5lbGVtZW50cw0KKyAgICAgICAgLy8gSkNvbWJvQm94LnNlbGVjdGVkRWxlbWVudA0KKyAgICAgICAgLy9zeW50aGV0aWNCaW5kaW5ncy5wdXRBbGwoSkNvbWJvQm94UHJvcGVydGllcy5nZXRTeW50aGV0aWNQcm9wZXJ0aWVzKCkpOw0KKw0KKyAgICAgICAgLy8gSkxpc3QuZWxlbWVudHMNCisgICAgICAgIC8vIEpMaXN0LnNlbGVjdGVkRWxlbWVudA0KKyAgICAgICAgLy8gSkxpc3Quc2VsZWN0ZWRFbGVtZW50cw0KKyAgICAgICAgLy9zeW50aGV0aWNCaW5kaW5ncy5wdXRBbGwoSkxpc3RQcm9wZXJ0aWVzLmdldFN5bnRoZXRpY1Byb3BlcnRpZXMoKSk7DQorDQorICAgICAgICAvLyBKU3Bpbm5lci52YWx1ZQ0KKyAgICAgICAgLy9zeW50aGV0aWNCaW5kaW5ncy5wdXRBbGwoSlNwaW5uZXJQcm9wZXJ0aWVzLmdldFN5bnRoZXRpY1Byb3BlcnRpZXMoKSk7DQorDQorICAgICAgICAvLyBvdGhlciBwcm9wZXJ0aWVzIGhhbmRsZWQgaW4gSlNSLTI5NQ0KKyAgICAgICAgLy8gSlRhYmxlLmVsZW1lbnRzDQorICAgICAgICAvLyBKVGFibGUuc2VsZWN0ZWRFbGVtZW50DQorICAgICAgICAvLyBKVGFibGUuc2VsZWN0ZWRFbGVtZW50cw0KKyAgICAgICAgLy8gSlRyZWUucm9vdA0KKyAgICAgICAgLy8gSlRyZWUuc2VsZWN0ZWRFbGVtZW50DQorICAgICAgICAvLyBKVHJlZS5zZWxlY3RlZEVsZW1lbnRzDQorDQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEFjY2VwdGVkIFByb3BlcnRpZXMuLi4NCisgICAgICoNCisgICAgICogZ3JvdXA/DQorICAgICAqIHNvdXJjZSAoKHNvdXJjZVByb3BlcnR5KSB8IChzb3VyY2VFdmVudCBzb3VyY2VWYWx1ZSkpDQorICAgICAqICh0YXJnZXQgdGFyZ2V0UHJvcGVydHkpPyAoPyB1c2UgZGVmYXVsdCBqYXZhYmVhbnMgcHJvcGVydHkgaWYgdGFyZ2V0UHJvcGVydHkgaXMgbm90IHByZXNlbnQ/KQ0KKyAgICAgKg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gYnVpbGRlcg0KKyAgICAgKiBAcGFyYW0gbmFtZQ0KKyAgICAgKiBAcGFyYW0gdmFsdWUNCisgICAgICogQHBhcmFtIGF0dHJpYnV0ZXMNCisgICAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBpbnN0YW5jZQ0KKyAgICAgKiBAdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24NCisgICAgICogQHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uDQorICAgICAqLw0KKyAgICBwdWJsaWMgT2JqZWN0IG5ld0luc3RhbmNlKEZhY3RvcnlCdWlsZGVyU3VwcG9ydCBidWlsZGVyLCBPYmplY3QgbmFtZSwgT2JqZWN0IHZhbHVlLCBNYXAgYXR0cmlidXRlcykgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gew0KKyAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsNCisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiJG5hbWUgZWxlbWVudHMgZG8gbm90IGFjY2VwdCBhIHZhbHVlIGFyZ3VtZW50LiIpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgT2JqZWN0IHNvdXJjZSA9IGF0dHJpYnV0ZXMucmVtb3ZlKCJzb3VyY2UiKTsNCisgICAgICAgIE9iamVjdCB0YXJnZXQgPSBhdHRyaWJ1dGVzLnJlbW92ZSgidGFyZ2V0Iik7DQorDQorICAgICAgICBUYXJnZXRCaW5kaW5nIHRiID0gbnVsbDsNCisgICAgICAgIGlmICh0YXJnZXQgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIFN0cmluZyB0YXJnZXRQcm9wZXJ0eSA9IChTdHJpbmcpIGF0dHJpYnV0ZXMucmVtb3ZlKCJ0YXJnZXRQcm9wZXJ0eSIpOw0KKyAgICAgICAgICAgIHRiID0gbmV3IFByb3BlcnR5QmluZGluZyh0YXJnZXQsIHRhcmdldFByb3BlcnR5KTsNCisgICAgICAgIH0NCisgICAgICAgIEZ1bGxCaW5kaW5nIGZiOw0KKw0KKyAgICAgICAgaWYgKGF0dHJpYnV0ZXMuY29udGFpbnNLZXkoInNvdXJjZVByb3BlcnR5IikpIHsNCisgICAgICAgICAgICAvLyBmaXJzdCBjaGVjayBmb3Igc3ludGhldGljIHByb3BlcnRpZXMNCisgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHkgPSAoU3RyaW5nKSBhdHRyaWJ1dGVzLnJlbW92ZSgic291cmNlUHJvcGVydHkiKTsNCisgICAgICAgICAgICBQcm9wZXJ0eUJpbmRpbmcgcHNiID0gbmV3IFByb3BlcnR5QmluZGluZyhzb3VyY2UsIHByb3BlcnR5KTsNCisNCisgICAgICAgICAgICBUcmlnZ2VyQmluZGluZyB0cmlnZ2VyID0gbnVsbDsNCisgICAgICAgICAgICBDbGFzcyBjdXJyZW50Q2xhc3MgPSBzb3VyY2UuZ2V0Q2xhc3MoKTsNCisgICAgICAgICAgICB3aGlsZSAoKHRyaWdnZXIgPT0gbnVsbCkgJiYgKGN1cnJlbnRDbGFzcyAhPSBudWxsKSkgew0KKyAgICAgICAgICAgICAgICAvLyBzaG91bGQgd2UgY2hlY2sgaW50ZXJmYWNlcyBhcyB3ZWxsPyAgaWYgc28gYXQgd2hhdCBsZXZlbD8NCisgICAgICAgICAgICAgICAgdHJpZ2dlciA9IChUcmlnZ2VyQmluZGluZykgc3ludGhldGljQmluZGluZ3MuZ2V0KCIkY3VycmVudENsYXNzLm5hbWUjJHByb3BlcnR5IiBhcyBTdHJpbmcpOw0KKyAgICAgICAgICAgICAgICBjdXJyZW50Q2xhc3MgPSBjdXJyZW50Q2xhc3MuZ2V0U3VwZXJjbGFzcygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAodHJpZ2dlciA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIC8vVE9ETyBpbnNwZWN0IHRoZSBiZWFuIGluZm8gYW5kIHRocm93IGFuIGVycm9yIGlmIHRoZSBwcm9wZXJ0eSBpcyBub3Qgb2JzZXJiYWJsZSBhbmQgbm90IGJpbmQ6ZmFsc2U/DQorICAgICAgICAgICAgICAgIHRyaWdnZXIgPSBwc2I7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGZiID0gdHJpZ2dlci5jcmVhdGVCaW5kaW5nKHBzYiwgdGIpOw0KKyAgICAgICAgfSBlbHNlIGlmIChhdHRyaWJ1dGVzLmNvbnRhaW5zS2V5KCJzb3VyY2VFdmVudCIpICYmIGF0dHJpYnV0ZXMuY29udGFpbnNLZXkoInNvdXJjZVZhbHVlIikpIHsNCisgICAgICAgICAgICBDbG9zdXJlIHF1ZXJ5VmFsdWUgPSAoQ2xvc3VyZSkgYXR0cmlidXRlcy5yZW1vdmUoInNvdXJjZVZhbHVlIik7DQorICAgICAgICAgICAgQ2xvc3VyZVNvdXJjZUJpbmRpbmcgcHNiID0gbmV3IENsb3N1cmVTb3VyY2VCaW5kaW5nKHF1ZXJ5VmFsdWUpOw0KKyAgICAgICAgICAgIFN0cmluZyB0cmlnZ2VyID0gKFN0cmluZykgYXR0cmlidXRlcy5yZW1vdmUoInNvdXJjZUV2ZW50Iik7DQorICAgICAgICAgICAgRXZlbnRUcmlnZ2VyQmluZGluZyBldGIgPSBuZXcgRXZlbnRUcmlnZ2VyQmluZGluZyhzb3VyY2UsIHRyaWdnZXIpOw0KKyAgICAgICAgICAgIGZiID0gZXRiLmNyZWF0ZUJpbmRpbmcocHNiLCB0Yik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCIkbmFtZSBkb2VzIG5vdCBoYXZlIHN1ZmZpZW50IGF0dHJpYnV0ZXMgdG8gaW5pdGlhbGl6ZSIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgT2JqZWN0IG8gPSBhdHRyaWJ1dGVzLnJlbW92ZSgiYmluZCIpOw0KKyAgICAgICAgaWYgKCAgICAobyA9PSBudWxsKQ0KKyAgICAgICAgICAgIHx8ICgobyBpbnN0YW5jZW9mIEJvb2xlYW4pICYmICgoQm9vbGVhbilvKS5ib29sZWFuVmFsdWUoKSkpDQorICAgICAgICB7DQorICAgICAgICAgICAgZmIuYmluZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHRhcmdldCAhPSBudWxsKSB7DQorICAgICAgICAgICAgZmIudXBkYXRlKCk7DQorICAgICAgICB9DQorDQorICAgICAgICBidWlsZGVyLmFkZERpc3Bvc2FsQ2xvc3VyZShmYi4mdW5iaW5kKQ0KKyAgICAgICAgcmV0dXJuIGZiOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBzdGF0aWMgYmluZGluZ0F0dHJpYnV0ZURlbGVnYXRlKGRlZiBidWlsZGVyLCBkZWYgbm9kZSwgZGVmIGF0dHJpYnV0ZXMpIHsNCisgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBhdHRyaWJ1dGVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKQ0KKyAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7DQorICAgICAgICAgICAgRW50cnkgZW50cnkgPSAoRW50cnkpIGl0ZXIubmV4dCgpDQorICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5ID0gZW50cnkua2V5LnRvU3RyaW5nKCk7DQorICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gZW50cnkudmFsdWU7DQorICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRnVsbEJpbmRpbmcpIHsNCisgICAgICAgICAgICAgICAgRnVsbEJpbmRpbmcgZmIgPSAoRnVsbEJpbmRpbmcpIHZhbHVlOw0KKyAgICAgICAgICAgICAgICBQcm9wZXJ0eUJpbmRpbmcgcHRiID0gbmV3IFByb3BlcnR5QmluZGluZyhub2RlLCBwcm9wZXJ0eSk7DQorICAgICAgICAgICAgICAgIGZiLnNldFRhcmdldEJpbmRpbmcocHRiKTsNCisgICAgICAgICAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICAgICAgICAgIGZiLnVwZGF0ZSgpOw0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KKyAgICAgICAgICAgICAgICAgICAgLy8ganVzdCBlYXQgaXQ/DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICAgICAgICAgIGZiLnJlYmluZCgpOw0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KKyAgICAgICAgICAgICAgICAgICAgLy8ganVzdCBlYXQgaXQ/DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyB3aHkgd2UgY2Fubm90IHVzZSBlbnRyeVNldCgpLmVhY2ggeyB9DQorICAgICAgICAgICAgICAgIGl0ZXIucmVtb3ZlKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvZmFjdG9yeS9Cb3hGYWN0b3J5Lmdyb292eSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvZmFjdG9yeS9Cb3hGYWN0b3J5Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWYwN2QxCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zd2luZy9mYWN0b3J5L0JveEZhY3RvcnkuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTQwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBncm9vdnkuc3dpbmcuZmFjdG9yeQorCitpbXBvcnQgamF2YS5hd3QuRGltZW5zaW9uCitpbXBvcnQgamF2YXguc3dpbmcuQm94CitpbXBvcnQgamF2YXguc3dpbmcuQm94TGF5b3V0CisKK3B1YmxpYyBjbGFzcyBCb3hGYWN0b3J5IGV4dGVuZHMgQ29tcG9uZW50RmFjdG9yeSB7CisKKyAgICBwdWJsaWMgQm94RmFjdG9yeSgpIHsKKyAgICAgICAgc3VwZXIobnVsbCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBPYmplY3QgbmV3SW5zdGFuY2UoRmFjdG9yeUJ1aWxkZXJTdXBwb3J0IGJ1aWxkZXIsIE9iamVjdCBuYW1lLCBPYmplY3QgdmFsdWUsIE1hcCBhdHRyaWJ1dGVzKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChGYWN0b3J5QnVpbGRlclN1cHBvcnQuY2hlY2tWYWx1ZUlzVHlwZSh2YWx1ZSwgbmFtZSwgQm94LmNsYXNzKSkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgICAgIGludCBheGlzID0gQm94TGF5b3V0LlhfQVhJUzsgLy8gZGVmYXVsdCB0byBYIHNvIGl0IGJlaGF2ZXMgbGlrZSBGbG93TGF5b3V0CisgICAgICAgIGlmIChhdHRyaWJ1dGVzLmNvbnRhaW5zS2V5KCJheGlzIikpIHsKKyAgICAgICAgICAgIE9iamVjdCBvID0gYXR0cmlidXRlcy5yZW1vdmUoImF4aXMiKTsKKyAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgTnVtYmVyKSB7CisgICAgICAgICAgICAgICAgYXhpcyA9ICgoTnVtYmVyKW8pLmludFZhbHVlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBCb3goYXhpcyk7CisgICAgfQorfQorCitwdWJsaWMgY2xhc3MgSEJveEZhY3RvcnkgZXh0ZW5kcyBDb21wb25lbnRGYWN0b3J5IHsKKworICAgIHB1YmxpYyBIQm94RmFjdG9yeSgpIHsKKyAgICAgICAgc3VwZXIobnVsbCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBuZXdJbnN0YW5jZShGYWN0b3J5QnVpbGRlclN1cHBvcnQgYnVpbGRlciwgT2JqZWN0IG5hbWUsIE9iamVjdCB2YWx1ZSwgTWFwIGF0dHJpYnV0ZXMpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKKyAgICAgICAgRmFjdG9yeUJ1aWxkZXJTdXBwb3J0LmNoZWNrVmFsdWVJc051bGwodmFsdWUsIG5hbWUpOworICAgICAgICByZXR1cm4gQm94LmNyZWF0ZUhvcml6b250YWxCb3goKTsKKyAgICB9Cit9CisKK3B1YmxpYyBjbGFzcyBIR2x1ZUZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdEZhY3RvcnkgeworICAgIHB1YmxpYyBPYmplY3QgbmV3SW5zdGFuY2UoRmFjdG9yeUJ1aWxkZXJTdXBwb3J0IGJ1aWxkZXIsIE9iamVjdCBuYW1lLCBPYmplY3QgdmFsdWUsIE1hcCBhdHRyaWJ1dGVzKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7CisgICAgICAgIEZhY3RvcnlCdWlsZGVyU3VwcG9ydC5jaGVja1ZhbHVlSXNOdWxsKHZhbHVlLCBuYW1lKTsKKyAgICAgICAgcmV0dXJuIEJveC5jcmVhdGVIb3Jpem9udGFsR2x1ZSgpOworICAgIH0KK30KKworcHVibGljIGNsYXNzIEhTdHJ1dEZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdEZhY3RvcnkgeworICAgIHB1YmxpYyBPYmplY3QgbmV3SW5zdGFuY2UoRmFjdG9yeUJ1aWxkZXJTdXBwb3J0IGJ1aWxkZXIsIE9iamVjdCBuYW1lLCBPYmplY3QgdmFsdWUsIE1hcCBhdHRyaWJ1dGVzKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7CisgICAgICAgIEZhY3RvcnlCdWlsZGVyU3VwcG9ydC5jaGVja1ZhbHVlSXNUeXBlKHZhbHVlLCBuYW1lLCBOdW1iZXIuY2xhc3MpOworICAgICAgICBPYmplY3QgbnVtOworICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgbnVtID0gdmFsdWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBudW0gPSBhdHRyaWJ1dGVzLnJlbW92ZSgid2lkdGgiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobnVtIGluc3RhbmNlb2YgTnVtYmVyKSB7CisgICAgICAgICAgICByZXR1cm4gQm94LmNyZWF0ZUhvcml6b250YWxTdHJ1dCgoKE51bWJlcikgbnVtKS5pbnRWYWx1ZSgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBCb3guY3JlYXRlSG9yaXpvbnRhbFN0cnV0KDYpOworICAgICAgICB9CisgICAgfQorfQorCitwdWJsaWMgY2xhc3MgVkJveEZhY3RvcnkgZXh0ZW5kcyBDb21wb25lbnRGYWN0b3J5IHsKKworICAgIHB1YmxpYyBWQm94RmFjdG9yeSgpIHsKKyAgICAgICAgc3VwZXIobnVsbCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBuZXdJbnN0YW5jZShGYWN0b3J5QnVpbGRlclN1cHBvcnQgYnVpbGRlciwgT2JqZWN0IG5hbWUsIE9iamVjdCB2YWx1ZSwgTWFwIGF0dHJpYnV0ZXMpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKKyAgICAgICAgRmFjdG9yeUJ1aWxkZXJTdXBwb3J0LmNoZWNrVmFsdWVJc051bGwodmFsdWUsIG5hbWUpOworICAgICAgICByZXR1cm4gQm94LmNyZWF0ZVZlcnRpY2FsQm94KCk7CisgICAgfQorfQorCitwdWJsaWMgY2xhc3MgVkdsdWVGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RGYWN0b3J5IHsKKyAgICBwdWJsaWMgT2JqZWN0IG5ld0luc3RhbmNlKEZhY3RvcnlCdWlsZGVyU3VwcG9ydCBidWlsZGVyLCBPYmplY3QgbmFtZSwgT2JqZWN0IHZhbHVlLCBNYXAgYXR0cmlidXRlcykgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24geworICAgICAgICBGYWN0b3J5QnVpbGRlclN1cHBvcnQuY2hlY2tWYWx1ZUlzTnVsbCh2YWx1ZSwgbmFtZSk7CisgICAgICAgIHJldHVybiBCb3guY3JlYXRlVmVydGljYWxHbHVlKCk7CisgICAgfQorfQorCitwdWJsaWMgY2xhc3MgVlN0cnV0RmFjdG9yeSBleHRlbmRzIEFic3RyYWN0RmFjdG9yeSB7CisgICAgcHVibGljIE9iamVjdCBuZXdJbnN0YW5jZShGYWN0b3J5QnVpbGRlclN1cHBvcnQgYnVpbGRlciwgT2JqZWN0IG5hbWUsIE9iamVjdCB2YWx1ZSwgTWFwIGF0dHJpYnV0ZXMpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKKyAgICAgICAgRmFjdG9yeUJ1aWxkZXJTdXBwb3J0LmNoZWNrVmFsdWVJc1R5cGUodmFsdWUsIG5hbWUsIE51bWJlci5jbGFzcyk7CisgICAgICAgIE9iamVjdCBudW07CisgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBudW0gPSB2YWx1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG51bSA9IGF0dHJpYnV0ZXMucmVtb3ZlKCJoZWlnaHQiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobnVtIGluc3RhbmNlb2YgTnVtYmVyKSB7CisgICAgICAgICAgICByZXR1cm4gQm94LmNyZWF0ZVZlcnRpY2FsU3RydXQoKChOdW1iZXIpIG51bSkuaW50VmFsdWUoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gQm94LmNyZWF0ZVZlcnRpY2FsU3RydXQoNik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3B1YmxpYyBjbGFzcyBHbHVlRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0RmFjdG9yeSB7CisgICAgcHVibGljIE9iamVjdCBuZXdJbnN0YW5jZShGYWN0b3J5QnVpbGRlclN1cHBvcnQgYnVpbGRlciwgT2JqZWN0IG5hbWUsIE9iamVjdCB2YWx1ZSwgTWFwIGF0dHJpYnV0ZXMpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKKyAgICAgICAgRmFjdG9yeUJ1aWxkZXJTdXBwb3J0LmNoZWNrVmFsdWVJc051bGwodmFsdWUsIG5hbWUpOworICAgICAgICByZXR1cm4gQm94LmNyZWF0ZUdsdWUoKTsKKyAgICB9Cit9CisKK3B1YmxpYyBjbGFzcyBSaWdpZEFyZWFGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RGYWN0b3J5IHsKKyAgICBwdWJsaWMgT2JqZWN0IG5ld0luc3RhbmNlKEZhY3RvcnlCdWlsZGVyU3VwcG9ydCBidWlsZGVyLCBPYmplY3QgbmFtZSwgT2JqZWN0IHZhbHVlLCBNYXAgYXR0cmlidXRlcykgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24geworICAgICAgICBGYWN0b3J5QnVpbGRlclN1cHBvcnQuY2hlY2tWYWx1ZUlzTnVsbCh2YWx1ZSwgbmFtZSk7CisgICAgICAgIERpbWVuc2lvbiBkaW07CisgICAgICAgIE9iamVjdCBvID0gYXR0cmlidXRlcy5yZW1vdmUoInNpemUiKTsKKyAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBEaW1lbnNpb24pIHsKKyAgICAgICAgICAgIGRpbSA9IChEaW1lbnNpb24pIG87CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgdywgaDsKKyAgICAgICAgICAgIG8gPSBhdHRyaWJ1dGVzLnJlbW92ZSgid2lkdGgiKTsKKyAgICAgICAgICAgIHcgPSAoKG8gaW5zdGFuY2VvZiBOdW1iZXIpKSA/ICgoTnVtYmVyKSBvKS5pbnRWYWx1ZSgpIDogNjsKKyAgICAgICAgICAgIG8gPSBhdHRyaWJ1dGVzLnJlbW92ZSgiaGVpZ2h0Iik7CisgICAgICAgICAgICBoID0gKChvIGluc3RhbmNlb2YgTnVtYmVyKSkgPyAoKE51bWJlcikgbykuaW50VmFsdWUoKSA6IDY7CisgICAgICAgICAgICBkaW0gPSBuZXcgRGltZW5zaW9uKHcsIGgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBCb3guY3JlYXRlUmlnaWRBcmVhKGRpbSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zd2luZy9mYWN0b3J5L0JveExheW91dEZhY3RvcnkuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zd2luZy9mYWN0b3J5L0JveExheW91dEZhY3RvcnkuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZThmY2MKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3N3aW5nL2ZhY3RvcnkvQm94TGF5b3V0RmFjdG9yeS5ncm9vdnkKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgZ3Jvb3Z5LnN3aW5nLmZhY3RvcnkKKworaW1wb3J0IGphdmEuYXd0LkNvbnRhaW5lcgoraW1wb3J0IGphdmF4LnN3aW5nLkJveExheW91dAoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5JbnZva2VySGVscGVyCisKK3B1YmxpYyBjbGFzcyBCb3hMYXlvdXRGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RGYWN0b3J5IHsKKworICAgIHB1YmxpYyBPYmplY3QgbmV3SW5zdGFuY2UoRmFjdG9yeUJ1aWxkZXJTdXBwb3J0IGJ1aWxkZXIsIE9iamVjdCBuYW1lLCBPYmplY3QgdmFsdWUsIE1hcCBhdHRyaWJ1dGVzKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7CisgICAgICAgIEZhY3RvcnlCdWlsZGVyU3VwcG9ydC5jaGVja1ZhbHVlSXNOdWxsKHZhbHVlLCBuYW1lKTsKKyAgICAgICAgT2JqZWN0IHBhcmVudCA9IGJ1aWxkZXIuZ2V0Q3VycmVudCgpOworICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgQ29udGFpbmVyKSB7CisgICAgICAgICAgICBPYmplY3QgYXhpc09iamVjdCA9IGF0dHJpYnV0ZXMucmVtb3ZlKCJheGlzIik7CisgICAgICAgICAgICBpbnQgYXhpcyA9IEJveExheW91dC5YX0FYSVM7CisgICAgICAgICAgICBpZiAoYXhpc09iamVjdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgSW50ZWdlciBpID0gKEludGVnZXIpIGF4aXNPYmplY3Q7CisgICAgICAgICAgICAgICAgYXhpcyA9IGkuaW50VmFsdWUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29udGFpbmVyIHRhcmdldCA9IExheW91dEZhY3RvcnkuZ2V0TGF5b3V0VGFyZ2V0KHBhcmVudCk7CisgICAgICAgICAgICBCb3hMYXlvdXQgYW5zd2VyID0gbmV3IEJveExheW91dCh0YXJnZXQsIGF4aXMpOworCisgICAgICAgICAgICAvLyBub3cgbGV0J3MgdHJ5IHRvIHNldCB0aGUgbGF5b3V0IHByb3BlcnR5CisgICAgICAgICAgICBJbnZva2VySGVscGVyLnNldFByb3BlcnR5KHRhcmdldCwgImxheW91dCIsIGFuc3dlcik7CisgICAgICAgICAgICByZXR1cm4gYW5zd2VyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk11c3QgYmUgbmVzdGVkIGluc2lkZSBhIENvbnRhaW5lciIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UGFyZW50KEZhY3RvcnlCdWlsZGVyU3VwcG9ydCBidWlsZGVyLCBPYmplY3QgcGFyZW50LCBPYmplY3QgY2hpbGQpIHsKKyAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIENvbnRhaW5lcikgeworICAgICAgICAgICAgQ29udGFpbmVyIHRhcmdldCA9IExheW91dEZhY3RvcnkuZ2V0TGF5b3V0VGFyZ2V0KHBhcmVudCk7CisgICAgICAgICAgICBJbnZva2VySGVscGVyLnNldFByb3BlcnR5KHRhcmdldCwgImxheW91dCIsIGNoaWxkKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zd2luZy9mYWN0b3J5L0NvbGxlY3Rpb25GYWN0b3J5Lmdyb292eSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvZmFjdG9yeS9Db2xsZWN0aW9uRmFjdG9yeS5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQzMTllNQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvZmFjdG9yeS9Db2xsZWN0aW9uRmFjdG9yeS5ncm9vdnkKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgZ3Jvb3Z5LnN3aW5nLmZhY3RvcnkKKworLyoqCisgKiBUaGlzIHJldHVybnMgYSBtdXRhYmxlIGphdmEudXRpbC5Db2xsZWN0aW9uIG9mIHNvbWUgc29ydCwgdG8gd2hpY2ggaXRlbXMgYXJlIGFkZGVkLiAgCisgKi8KK3B1YmxpYyBjbGFzcyBDb2xsZWN0aW9uRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0RmFjdG9yeSB7CisgICAgCisgICAgcHVibGljIE9iamVjdCBuZXdJbnN0YW5jZShGYWN0b3J5QnVpbGRlclN1cHBvcnQgYnVpbGRlciwgT2JqZWN0IG5hbWUsIE9iamVjdCB2YWx1ZSwgTWFwIGF0dHJpYnV0ZXMpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKKyAgICAgICAgRmFjdG9yeUJ1aWxkZXJTdXBwb3J0LmNoZWNrVmFsdWVJc051bGwodmFsdWUsIG5hbWUpOworICAgICAgICBpZiAoYXR0cmlidXRlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZWYgaXRlbSA9IGF0dHJpYnV0ZXMuZW50cnlTZXQoKS5pdGVyYXRvcigpLm5leHQoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nUHJvcGVydHlFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIlRoZSBidWlsZGVyIGVsZW1lbnQgJyRuYW1lJyBpcyBhIGNvbGxlY3Rpb25zIGVsZW1lbnQgYW5kIGFjY2VwdHMgbm8gYXR0cmlidXRlcyIsCisgICAgICAgICAgICAgICAgaXRlbS5rZXkgYXMgU3RyaW5nLCBpdGVtLnZhbHVlIGFzIENsYXNzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENoaWxkKEZhY3RvcnlCdWlsZGVyU3VwcG9ydCBidWlsZGVyLCBPYmplY3QgcGFyZW50LCBPYmplY3QgY2hpbGQpIHsKKyAgICAgICAgcGFyZW50LmFkZChjaGlsZCkKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3N3aW5nL2ZhY3RvcnkvQ29tYm9Cb3hGYWN0b3J5Lmdyb292eSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvZmFjdG9yeS9Db21ib0JveEZhY3RvcnkuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNjI2MTUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3N3aW5nL2ZhY3RvcnkvQ29tYm9Cb3hGYWN0b3J5Lmdyb292eQpAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBncm9vdnkuc3dpbmcuZmFjdG9yeQorCitpbXBvcnQgamF2YXguc3dpbmcuSkNvbWJvQm94CisKK3B1YmxpYyBjbGFzcyBDb21ib0JveEZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdEZhY3RvcnkgeworICAgIAorICAgIHB1YmxpYyBPYmplY3QgbmV3SW5zdGFuY2UoRmFjdG9yeUJ1aWxkZXJTdXBwb3J0IGJ1aWxkZXIsIE9iamVjdCBuYW1lLCBPYmplY3QgdmFsdWUsIE1hcCBhdHRyaWJ1dGVzKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7CisgICAgICAgIEZhY3RvcnlCdWlsZGVyU3VwcG9ydC5jaGVja1ZhbHVlSXNOdWxsKHZhbHVlLCBuYW1lKTsKKyAgICAgICAgLy9UT0RPIGV4cGFuZCB0byBhbGxvdyB0aGUgdmFsdWUgYXJnIHRvIGJlIGl0ZW1zCisgICAgICAgIE9iamVjdCBpdGVtcyA9IGF0dHJpYnV0ZXMucmVtb3ZlKCJpdGVtcyIpOworICAgICAgICBpZiAoaXRlbXMgaW5zdGFuY2VvZiBWZWN0b3IpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSkNvbWJvQm94KChWZWN0b3IpIGl0ZW1zKTsKKyAgICAgICAgfSBlbHNlIGlmIChpdGVtcyBpbnN0YW5jZW9mIExpc3QpIHsKKyAgICAgICAgICAgIExpc3QgbGlzdCA9IChMaXN0KSBpdGVtczsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSkNvbWJvQm94KGxpc3QudG9BcnJheSgpKTsKKyAgICAgICAgfSBlbHNlIGlmIChpdGVtcyBpbnN0YW5jZW9mIE9iamVjdFtdKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEpDb21ib0JveCgoT2JqZWN0W10pIGl0ZW1zKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSkNvbWJvQm94KCk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvZmFjdG9yeS9Db21wb25lbnRGYWN0b3J5Lmdyb292eSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvZmFjdG9yeS9Db21wb25lbnRGYWN0b3J5Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWY1MGE2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zd2luZy9mYWN0b3J5L0NvbXBvbmVudEZhY3RvcnkuZ3Jvb3Z5CkBAIC0wLDAgKzEsNDcgQEAKKy8qDQorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorcGFja2FnZSBncm9vdnkuc3dpbmcuZmFjdG9yeQ0KKw0KK2ltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQNCitpbXBvcnQgamF2YS5hd3QuV2luZG93DQorDQorY2xhc3MgQ29tcG9uZW50RmFjdG9yeSBleHRlbmRzIEJlYW5GYWN0b3J5IHsNCisNCisgICAgcHVibGljIENvbXBvbmVudEZhY3RvcnkoQ2xhc3MgYmVhbkNsYXNzKSB7DQorICAgICAgICBzdXBlcihiZWFuQ2xhc3MpDQorICAgIH0NCisNCisgICAgcHVibGljIENvbXBvbmVudEZhY3RvcnkoQ2xhc3MgYmVhbkNsYXNzLCBib29sZWFuIGxlYWYpIHsNCisgICAgICAgIHN1cGVyKGJlYW5DbGFzcywgbGVhZikNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXRDaGlsZChGYWN0b3J5QnVpbGRlclN1cHBvcnQgYnVpbGRlciwgT2JqZWN0IHBhcmVudCwgT2JqZWN0IGNoaWxkKSB7DQorICAgICAgICBpZiAoIShjaGlsZCBpbnN0YW5jZW9mIENvbXBvbmVudCkgfHwgKGNoaWxkIGluc3RhbmNlb2YgV2luZG93KSkgew0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgZGVmIGNvbnN0cmFpbnRzID0gYnVpbGRlci5jb250ZXh0LmNvbnN0cmFpbnRzDQorICAgICAgICAgICAgaWYgKGNvbnN0cmFpbnRzICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgcGFyZW50LmFkZChjaGlsZCwgY29uc3RyYWludHMpDQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgcGFyZW50LmFkZChjaGlsZCkNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGNhdGNoIChNaXNzaW5nUHJvcGVydHlFeGNlcHRpb24gbXBlKSB7DQorICAgICAgICAgICAgcGFyZW50LmFkZChjaGlsZCkNCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3N3aW5nL2ZhY3RvcnkvQ29tcG91bmRCb3JkZXJGYWN0b3J5Lmdyb292eSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvZmFjdG9yeS9Db21wb3VuZEJvcmRlckZhY3RvcnkuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ODFmZjYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3N3aW5nL2ZhY3RvcnkvQ29tcG91bmRCb3JkZXJGYWN0b3J5Lmdyb292eQpAQCAtMCwwICsxLDYzIEBACisvKg0KKyAqIENvcHlyaWdodCAyMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4NCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCitwYWNrYWdlIGdyb292eS5zd2luZy5mYWN0b3J5DQorDQoraW1wb3J0IGphdmF4LnN3aW5nLmJvcmRlci5Cb3JkZXINCitpbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLkNvbXBvdW5kQm9yZGVyDQorDQorY2xhc3MgQ29tcG91bmRCb3JkZXJGYWN0b3J5IGV4dGVuZHMgU3dpbmdCb3JkZXJGYWN0b3J5IHsNCisNCisgICAgcHVibGljIE9iamVjdCBuZXdJbnN0YW5jZShGYWN0b3J5QnVpbGRlclN1cHBvcnQgYnVpbGRlciwgT2JqZWN0IG5hbWUsIE9iamVjdCB2YWx1ZSwgTWFwIGF0dHJpYnV0ZXMpIHsNCisgICAgICAgIGJ1aWxkZXIuY29udGV4dC5hcHBseUJvcmRlclRvUGFyZW50ID0gYXR0cmlidXRlcy5yZW1vdmUoJ3BhcmVudCcpDQorDQorICAgICAgICBCb3JkZXIgYm9yZGVyICA9IG51bGwNCisgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExpc3QpIHsNCisgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlLnNpemUoKSkgew0KKyAgICAgICAgICAgICAgICBjYXNlIDA6DQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiJG5hbWUgZG9lcyBub3QgYWNjZXB0IGFuIGVtcHR5IGFycmF5IGFzIGFuIHZhbHVlIGFyZ3VtZW50IikNCisgICAgICAgICAgICAgICAgY2FzZSAxOg0KKyAgICAgICAgICAgICAgICAgICAgYm9yZGVyID0gdmFsdWVbMF0NCisgICAgICAgICAgICAgICAgICAgIGJyZWFrDQorICAgICAgICAgICAgICAgIGNhc2UgMjoNCisgICAgICAgICAgICAgICAgICAgIGJvcmRlciA9IG5ldyBDb21wb3VuZEJvcmRlcih2YWx1ZVswXSwgdmFsdWVbMV0pDQorICAgICAgICAgICAgICAgICAgICBicmVhaw0KKyAgICAgICAgICAgICAgICBjYXNlIDM6DQorICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgICAgICBib3JkZXIgPSBuZXcgQ29tcG91bmRCb3JkZXIodmFsdWVbMF0sIHZhbHVlWzFdKQ0KKyAgICAgICAgICAgICAgICAgICAgYm9yZGVyID0gdmFsdWVbMi4uLTFdLmluamVjdChib3JkZXIpIHt0aGF0LCBpdCAtPiBuZXcgQ29tcG91bmRCb3JkZXIodGhhdCwgaXQpIH0NCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIGlmICghYm9yZGVyICYmIGF0dHJpYnV0ZXMpIHsNCisgICAgICAgICAgICBpZiAodmFsdWUpIHsNCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIiRuYW1lIG9ubHkgYWNjZXB0cyBhbiBhcnJheSBvZiBib3JkZXJzIGFzIGEgdmFsdWUgYXJndW1lbnQiKQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWYgaW5uZXIgPSBhdHRyaWJ1dGVzLnJlbW92ZSgiaW5uZXIiKQ0KKyAgICAgICAgICAgIGRlZiBvdXRlciA9IGF0dHJpYnV0ZXMucmVtb3ZlKCJvdXRlciIpDQorICAgICAgICAgICAgaWYgKGlubmVyIGluc3RhbmNlb2YgQm9yZGVyICYmIG91dGVyIGluc3RhbmNlb2YgQm9yZGVyKSB7DQorICAgICAgICAgICAgICAgIGJvcmRlciA9IG5ldyBDb21wb3VuZEJvcmRlcihvdXRlciwgaW5uZXIpDQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaWYgKCFib3JkZXIpIHsNCisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiJG5hbWUgb25seSBhY2NlcHRzIGFuIGFycmF5IG9mIGphdmF4LnN3aW5nLmJvcmRlci5Cb3JkZXIgb3IgYW4gaW5uZXI6IGFuZCBvdXRlcjogYXR0cmlidXRlIikNCisgICAgICAgIH0NCisNCisgICAgICAgIHJldHVybiBib3JkZXINCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3N3aW5nL2ZhY3RvcnkvRGlhbG9nRmFjdG9yeS5ncm9vdnkgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3N3aW5nL2ZhY3RvcnkvRGlhbG9nRmFjdG9yeS5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ5MDc0ZQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvZmFjdG9yeS9EaWFsb2dGYWN0b3J5Lmdyb292eQpAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBncm9vdnkuc3dpbmcuZmFjdG9yeQorCitpbXBvcnQgamF2YS5hd3QuRGlhbG9nCitpbXBvcnQgamF2YS5hd3QuRnJhbWUKK2ltcG9ydCBqYXZheC5zd2luZy5KRGlhbG9nCisKK3B1YmxpYyBjbGFzcyBEaWFsb2dGYWN0b3J5IGV4dGVuZHMgUm9vdFBhbmVDb250YWluZXJGYWN0b3J5IHsKKworICAgIHB1YmxpYyBPYmplY3QgbmV3SW5zdGFuY2UoRmFjdG9yeUJ1aWxkZXJTdXBwb3J0IGJ1aWxkZXIsIE9iamVjdCBuYW1lLCBPYmplY3QgdmFsdWUsIE1hcCBhdHRyaWJ1dGVzKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7CisgICAgICAgIEpEaWFsb2cgZGlhbG9nCisgICAgICAgIGlmIChGYWN0b3J5QnVpbGRlclN1cHBvcnQuY2hlY2tWYWx1ZUlzVHlwZSh2YWx1ZSwgbmFtZSwgSkRpYWxvZy5jbGFzcykpIHsKKyAgICAgICAgICAgIGRpYWxvZyA9IHZhbHVlCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBPYmplY3Qgb3duZXIgPSBhdHRyaWJ1dGVzLnJlbW92ZSgib3duZXIiKQorICAgICAgICAgICAgTGlua2VkTGlzdCBjb250YWluaW5nV2luZG93cyA9IGJ1aWxkZXIuY29udGFpbmluZ1dpbmRvd3MKKyAgICAgICAgICAgIC8vIGlmIG93bmVyIG5vdCBleHBsaWNpdCwgdXNlIHRoZSBsYXN0IHdpbmRvdyB0eXBlIGluIHRoZSBsaXN0CisgICAgICAgICAgICBpZiAoKG93bmVyID09IG51bGwpICYmICFjb250YWluaW5nV2luZG93cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBvd25lciA9IGNvbnRhaW5pbmdXaW5kb3dzLmdldExhc3QoKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG93bmVyIGluc3RhbmNlb2YgRnJhbWUpIHsKKyAgICAgICAgICAgICAgICBkaWFsb2cgPSBuZXcgSkRpYWxvZygoRnJhbWUpIG93bmVyKQorICAgICAgICAgICAgfSBlbHNlIGlmIChvd25lciBpbnN0YW5jZW9mIERpYWxvZykgeworICAgICAgICAgICAgICAgIGRpYWxvZyA9IG5ldyBKRGlhbG9nKChEaWFsb2cpIG93bmVyKQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkaWFsb2cgPSBuZXcgSkRpYWxvZygpCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBoYW5kbGVSb290UGFuZVRhc2tzKGJ1aWxkZXIsIGRpYWxvZywgYXR0cmlidXRlcykKKworICAgICAgICByZXR1cm4gZGlhbG9nCisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvZmFjdG9yeS9FbXB0eUJvcmRlckZhY3RvcnkuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zd2luZy9mYWN0b3J5L0VtcHR5Qm9yZGVyRmFjdG9yeS5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ4NTVmYQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvZmFjdG9yeS9FbXB0eUJvcmRlckZhY3RvcnkuZ3Jvb3Z5CkBAIC0wLDAgKzEsNTkgQEAKKy8qDQorICogQ29weXJpZ2h0IDIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLg0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KK3BhY2thZ2UgZ3Jvb3Z5LnN3aW5nLmZhY3RvcnkNCisNCitpbXBvcnQgamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeQ0KKw0KKy8qKg0KKyAqIGFjY2VwdHMgdmFsdWVzIGluIGxlaXUgb2YgYXR0cmlidXRlczoNCisgKiAgaW50IC0gYWxsIG9mIHRvcCwgbGVmdCwgYm90dG9tLCByaWdodA0KKyAqICBbaW50LCBpbnQsIGludCwgaW50XSAtIHRvcCwgbGVmdCwgYm90dG9tLCByaWdodA0KKyAqIGFjY2VwdHMgYXR0cmlidXRlcyB3aGVuIG5vIHZhbHVlIHByZXNlbnQ6DQorICogIHRvcDogaW50LCBsZWZ0OiBpbnQsIGJvdHRvbTogaW50LCByaWdodDogaW50DQorICoNCisgKi8NCitjbGFzcyBFbXB0eUJvcmRlckZhY3RvcnkgZXh0ZW5kcyBTd2luZ0JvcmRlckZhY3Rvcnkgew0KKw0KKyAgICBwdWJsaWMgT2JqZWN0IG5ld0luc3RhbmNlKEZhY3RvcnlCdWlsZGVyU3VwcG9ydCBidWlsZGVyLCBPYmplY3QgbmFtZSwgT2JqZWN0IHZhbHVlLCBNYXAgYXR0cmlidXRlcykgew0KKyAgICAgICAgYnVpbGRlci5jb250ZXh0LmFwcGx5Qm9yZGVyVG9QYXJlbnQgPSBhdHRyaWJ1dGVzLnJlbW92ZSgncGFyZW50JykNCisgICAgICAgIA0KKyAgICAgICAgaWYgKCFhdHRyaWJ1dGVzKSB7DQorICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgSW50ZWdlcikgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gQm9yZGVyRmFjdG9yeS5jcmVhdGVFbXB0eUJvcmRlcih2YWx1ZSwgdmFsdWUsIHZhbHVlLCB2YWx1ZSkNCisgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTGlzdCAmJiB2YWx1ZS5zaXplKCkgPT0gNCkgew0KKyAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIEdESyBtZXRob2RzIG9uIENvbGxlY3Rpb24gZm9yIGJvb2xlYW4gLmFueXt9IGFuZCBib29sZWFuIC5hbGx7fSA6KA0KKyAgICAgICAgICAgICAgICBib29sZWFuIGludHMgPSB0cnVlDQorICAgICAgICAgICAgICAgIHZhbHVlLmVhY2gge2ludHMgPSBpbnRzICYgaXQgaW5zdGFuY2VvZiBJbnRlZ2VyfQ0KKyAgICAgICAgICAgICAgICBpZiAoaW50cykgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJvcmRlckZhY3RvcnkuY3JlYXRlRW1wdHlCb3JkZXIoKnZhbHVlKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiJG5hbWUgb25seSBhY2NlcHRzIGEgc2luZ2xlIGludGVnZXIgb3IgYW4gYXJyYXkgb2YgZm91ciBpbnRlZ2VycyBhcyBhIHZhbHVlIGFyZ3VtZW50Iik7DQorICAgICAgICB9DQorICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgew0KKyAgICAgICAgICAgIGludCB0b3AgPSBhdHRyaWJ1dGVzLnJlbW92ZSgidG9wIikNCisgICAgICAgICAgICBpbnQgbGVmdCA9IGF0dHJpYnV0ZXMucmVtb3ZlKCJsZWZ0IikNCisgICAgICAgICAgICBpbnQgYm90dG9tID0gYXR0cmlidXRlcy5yZW1vdmUoImJvdHRvbSIpDQorICAgICAgICAgICAgaW50IHJpZ2h0ID0gYXR0cmlidXRlcy5yZW1vdmUoInJpZ2h0IikNCisgICAgICAgICAgICBpZiAoKHRvcCA9PSBudWxsKSB8fCAodG9wID09IG51bGwpIHx8ICh0b3AgPT0gbnVsbCkgfHwgKHRvcCA9PSBudWxsKSB8fCBhdHRyaWJ1dGVzKSB7DQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJXaGVuICRuYW1lIGlzIGNhbGxlZCBpdCBtdXN0IGJlIGNhbGwgd2l0aCB0b3A6LCBsZWZ0OiwgYm90dG9tOiwgcmlnaHQ6LCBhbmQgbm8gb3RoZXIgYXR0cmlidXRlcyIpDQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiBCb3JkZXJGYWN0b3J5LmNyZWF0ZUVtcHR5Qm9yZGVyKHRvcCwgbGVmdCwgYm90dG9tLCByaWdodCk7DQorICAgICAgICB9DQorICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiJG5hbWUgY2Fubm90IGJlIGNhbGxlZCB3aXRoIGJvdGggYW4gYXJndWxlbnQgdmFsdWUgYW5kIGF0dHJpYnV0ZXMiKQ0KKyAgICB9DQorDQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvZmFjdG9yeS9FdGNoZWRCb3JkZXJGYWN0b3J5Lmdyb292eSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvZmFjdG9yeS9FdGNoZWRCb3JkZXJGYWN0b3J5Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTZmMjBhCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zd2luZy9mYWN0b3J5L0V0Y2hlZEJvcmRlckZhY3RvcnkuZ3Jvb3Z5CkBAIC0wLDAgKzEsNDUgQEAKKy8qDQorICogQ29weXJpZ2h0IDIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLg0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KK3BhY2thZ2UgZ3Jvb3Z5LnN3aW5nLmZhY3RvcnkNCisNCitpbXBvcnQgamF2YS5hd3QuQ29sb3INCitpbXBvcnQgamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeQ0KKw0KK2NsYXNzIEV0Y2hlZEJvcmRlckZhY3RvcnkgZXh0ZW5kcyBTd2luZ0JvcmRlckZhY3Rvcnkgew0KKw0KKyAgICBmaW5hbCBpbnQgdHlwZTsNCisNCisgICAgcHVibGljIEV0Y2hlZEJvcmRlckZhY3RvcnkoaW50IG5ld1R5cGUpIHsNCisgICAgICAgIHR5cGUgPSBuZXdUeXBlOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBPYmplY3QgbmV3SW5zdGFuY2UoRmFjdG9yeUJ1aWxkZXJTdXBwb3J0IGJ1aWxkZXIsIE9iamVjdCBuYW1lLCBPYmplY3QgdmFsdWUsIE1hcCBhdHRyaWJ1dGVzKSB7DQorICAgICAgICBidWlsZGVyLmNvbnRleHQuYXBwbHlCb3JkZXJUb1BhcmVudCA9IGF0dHJpYnV0ZXMucmVtb3ZlKCdwYXJlbnQnKQ0KKyAgICAgICAgLy8gbm8gaWYtZWxzZS1pZiBjaGFpbiBzbyB0aGF0IHdlIGNhbiBoYXZlIG9uZSBhdHRyaWJ1dGUgZmFpbHVyZSBibG9jaw0KKyAgICAgICAgaWYgKGF0dHJpYnV0ZXMuY29udGFpbnNLZXkoImhpZ2hsaWdodCIpKSB7DQorICAgICAgICAgICAgQ29sb3IgaGlnaGxpZ2h0ID0gYXR0cmlidXRlcy5yZW1vdmUoImhpZ2hsaWdodCIpDQorICAgICAgICAgICAgQ29sb3Igc2hhZG93ID0gYXR0cmlidXRlcy5yZW1vdmUoInNoYWRvdyIpDQorICAgICAgICAgICAgaWYgKGhpZ2hsaWdodCAmJiBzaGFkb3cgJiYgIWF0dHJpYnV0ZXMpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEJvcmRlckZhY3RvcnkuY3JlYXRlRXRjaGVkQm9yZGVyKHR5cGUsIGhpZ2hsaWdodCwgc2hhZG93KTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAoYXR0cmlidXRlcykgew0KKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCIkbmFtZSBvbmx5IGFjY2VwdHMgbm8gYXR0cmlidXRlcywgb3IgaGlnaGxpZ2h0OiBhbmQgc2hhZG93OiBhdHRyaWJ1dGVzIikNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBCb3JkZXJGYWN0b3J5LmNyZWF0ZUV0Y2hlZEJvcmRlcih0eXBlKTsNCisgICAgfQ0KKw0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3N3aW5nL2ZhY3RvcnkvRm9ybWF0dGVkVGV4dEZhY3RvcnkuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zd2luZy9mYWN0b3J5L0Zvcm1hdHRlZFRleHRGYWN0b3J5Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWQ3NjIyCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zd2luZy9mYWN0b3J5L0Zvcm1hdHRlZFRleHRGYWN0b3J5Lmdyb292eQpAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBncm9vdnkuc3dpbmcuZmFjdG9yeQorCitpbXBvcnQgamF2YS50ZXh0LkZvcm1hdAoraW1wb3J0IGphdmF4LnN3aW5nLkpGb3JtYXR0ZWRUZXh0RmllbGQKKworcHVibGljIGNsYXNzIEZvcm1hdHRlZFRleHRGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RGYWN0b3J5IHsKKyAgICAKKyAgICBwdWJsaWMgT2JqZWN0IG5ld0luc3RhbmNlKEZhY3RvcnlCdWlsZGVyU3VwcG9ydCBidWlsZGVyLCBPYmplY3QgbmFtZSwgT2JqZWN0IHZhbHVlLCBNYXAgYXR0cmlidXRlcykgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24geworICAgICAgICBGYWN0b3J5QnVpbGRlclN1cHBvcnQuY2hlY2tWYWx1ZUlzTnVsbCh2YWx1ZSwgbmFtZSk7CisgICAgICAgIC8vVE9ETyBleHBhbmQgdmFsdWUgYXJnIHRvIHRha2UgZm9ybWF0CisgICAgICAgIEpGb3JtYXR0ZWRUZXh0RmllbGQgZnRmOworICAgICAgICBpZiAoYXR0cmlidXRlcy5jb250YWluc0tleSgiZm9ybWF0IikpIHsKKyAgICAgICAgICAgIGZ0ZiA9IG5ldyBKRm9ybWF0dGVkVGV4dEZpZWxkKChGb3JtYXQpIGF0dHJpYnV0ZXMucmVtb3ZlKCJmb3JtYXQiKSk7CisgICAgICAgIH0gZWxzZSBpZiAoYXR0cmlidXRlcy5jb250YWluc0tleSgidmFsdWUiKSkgeworICAgICAgICAgICAgZnRmID0gbmV3IEpGb3JtYXR0ZWRUZXh0RmllbGQoYXR0cmlidXRlcy5yZW1vdmUoInZhbHVlIikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZnRmID0gbmV3IEpGb3JtYXR0ZWRUZXh0RmllbGQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZnRmOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zd2luZy9mYWN0b3J5L0ZyYW1lRmFjdG9yeS5ncm9vdnkgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3N3aW5nL2ZhY3RvcnkvRnJhbWVGYWN0b3J5Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODVjZTc1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zd2luZy9mYWN0b3J5L0ZyYW1lRmFjdG9yeS5ncm9vdnkKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgZ3Jvb3Z5LnN3aW5nLmZhY3RvcnkKKworaW1wb3J0IGphdmF4LnN3aW5nLkpGcmFtZQoraW1wb3J0IGphdmF4LnN3aW5nLkpNZW51QmFyCisKK3B1YmxpYyBjbGFzcyBGcmFtZUZhY3RvcnkgZXh0ZW5kcyBSb290UGFuZUNvbnRhaW5lckZhY3RvcnkgeworCisgICAgcHVibGljIE9iamVjdCBuZXdJbnN0YW5jZShGYWN0b3J5QnVpbGRlclN1cHBvcnQgYnVpbGRlciwgT2JqZWN0IG5hbWUsIE9iamVjdCB2YWx1ZSwgTWFwIGF0dHJpYnV0ZXMpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKKyAgICAgICAgSkZyYW1lIGZyYW1lCisgICAgICAgIGlmIChGYWN0b3J5QnVpbGRlclN1cHBvcnQuY2hlY2tWYWx1ZUlzVHlwZSh2YWx1ZSwgbmFtZSwgSkZyYW1lLmNsYXNzKSkgeworICAgICAgICAgICAgZnJhbWUgPSB2YWx1ZQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZnJhbWUgPSBuZXcgSkZyYW1lKCkKKyAgICAgICAgfQorCisgICAgICAgIGhhbmRsZVJvb3RQYW5lVGFza3MoYnVpbGRlciwgZnJhbWUsIGF0dHJpYnV0ZXMpCisKKyAgICAgICAgcmV0dXJuIGZyYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENoaWxkKEZhY3RvcnlCdWlsZGVyU3VwcG9ydCBidWlsZCwgT2JqZWN0IHBhcmVudCwgT2JqZWN0IGNoaWxkKSB7CisgICAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIEpNZW51QmFyKSB7CisgICAgICAgICAgICBwYXJlbnQuSk1lbnVCYXIgPSBjaGlsZAorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3VwZXIuc2V0Q2hpbGQoYnVpbGQsIHBhcmVudCwgY2hpbGQpCisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvZmFjdG9yeS9JbWFnZUljb25GYWN0b3J5Lmdyb292eSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvZmFjdG9yeS9JbWFnZUljb25GYWN0b3J5Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWViNjkzCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zd2luZy9mYWN0b3J5L0ltYWdlSWNvbkZhY3RvcnkuZ3Jvb3Z5CkBAIC0wLDAgKzEsODMgQEAKKy8qDQorICogQ29weXJpZ2h0IDIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLg0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KK3BhY2thZ2UgZ3Jvb3Z5LnN3aW5nLmZhY3RvcnkNCisNCitpbXBvcnQgamF2YS5hd3QuSW1hZ2UNCitpbXBvcnQgamF2YXguc3dpbmcuSW1hZ2VJY29uDQorDQorDQorY2xhc3MgSW1hZ2VJY29uRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0RmFjdG9yeSB7DQorDQorICAgIHB1YmxpYyBPYmplY3QgbmV3SW5zdGFuY2UoRmFjdG9yeUJ1aWxkZXJTdXBwb3J0IGJ1aWxkZXIsIE9iamVjdCBuYW1lLCBPYmplY3QgdmFsdWUsIE1hcCBhdHRyaWJ1dGVzKSB7DQorICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgew0KKyAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVzLmNvbnRhaW5zS2V5KCJpbWFnZSIpKSB7DQorICAgICAgICAgICAgICAgIHZhbHVlID0gYXR0cmlidXRlcy5yZW1vdmUoImltYWdlIikNCisgICAgICAgICAgICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBJbWFnZSkpIHsNCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbiAkbmFtZSBpbWFnZTogYXR0cmlidXRlcyBtdXN0IGJlIG9mIHR5cGUgamF2YS5hd3QuSW1hZ2UiKQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfSBlbHNlIGlmIChhdHRyaWJ1dGVzLmNvbnRhaW5zS2V5KCJ1cmwiKSkgew0KKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGF0dHJpYnV0ZXMucmVtb3ZlKCJ1cmwiKQ0KKyAgICAgICAgICAgICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIFVSTCkpIHsNCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbiAkbmFtZSB1cmw6IGF0dHJpYnV0ZXMgbXVzdCBiZSBvZiB0eXBlIGphdmEubmV0LlVSTCIpDQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9IGVsc2UgaWYgKGF0dHJpYnV0ZXMuY29udGFpbnNLZXkoImZpbGUiKSkgew0KKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGF0dHJpYnV0ZXMucmVtb3ZlKCJmaWxlIikNCisgICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRmlsZSkgew0KKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS50b1VSTCgpDQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykpIHsNCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbiAkbmFtZSBmaWxlOiBhdHRyaWJ1dGVzIG11c3QgYmUgb2YgdHlwZSBqYXZhLmlvLkZpbGUgb3IgYSBzdHJpbmciKQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8gbm90IGVsc2UgaWYgc28gd2UgY2FuIGFkanVzdCBmb3IgdGhlIGNhc2Ugb2YgZmlsZSBzdHJpbmcgd2hlcmUgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QNCisgICAgICAgIGRlZiByZXNvdXJjZSA9IG51bGwNCisgICAgICAgIGlmICgodmFsdWUgPT0gbnVsbCkgJiYgKGF0dHJpYnV0ZXMuY29udGFpbnNLZXkoInJlc291cmNlIikpKSB7DQorICAgICAgICAgICAgcmVzb3VyY2UgPSBhdHRyaWJ1dGVzLnJlbW92ZSgncmVzb3VyY2UnKQ0KKyAgICAgICAgfSBlbHNlIGlmICgodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpICYmICEobmV3IEZpbGUodmFsdWUpLmV4aXN0cygpKSkgew0KKyAgICAgICAgICAgIHJlc291cmNlID0gdmFsdWUNCisgICAgICAgIH0NCisgICAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgZGVmIGtsYXNzID0gYnVpbGRlci5jb250ZXh0Lm93bmVyDQorICAgICAgICAgICAgZGVmIG9yaWdWYWx1ZSA9IHZhbHVlDQorICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZXMuY29udGFpbnNLZXkoImNsYXNzIikpIHsNCisgICAgICAgICAgICAgICAga2xhc3MgPSBhdHRyaWJ1dGVzLnJlbW92ZSgiY2xhc3MiKQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoa2xhc3MgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICBrbGFzcyA9IEltYWdlSWNvbkZhY3RvcnkNCisgICAgICAgICAgICB9IGVsc2UgaWYgKCEoa2xhc3MgaW5zdGFuY2VvZiBDbGFzcykpIHsNCisgICAgICAgICAgICAgICAga2xhc3MgPSBrbGFzcy5jbGFzcw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICAvLyBmb3Igbm93IHRyeSBVUkwgYXBwcm9hY2guDQorICAgICAgICAgICAgLy8gd2UgbWF5IG5lZWQgdG8gZXh0cmFjdCB0aGUgYnl0ZVtdIGZvciBzb21lIHBhY2thZ2luZyBjYXNlcw0KKyAgICAgICAgICAgIHZhbHVlID0ga2xhc3MuZ2V0UmVzb3VyY2UocmVzb3VyY2UpDQorICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkluICRuYW1lIHRoZSB2YWx1ZSBhcmd1bWVudCAnJG9yaWdWYWx1ZScgZG9lcyBub3QgcmVmZXIgdG8gYSBmaWxlIG9yIGEgY2xhc3MgcmVzb3VyY2UiKQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7DQorICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIiRuYW1lIGhhcyBuZWl0aGVyIGEgdmFsdWUgYXJndW1lbnQgb3Igb25lIG9mIGltYWdlOiwgdXJsOiwgZmlsZTosIG9yIHJlc291cmNlOiIpDQorICAgICAgICB9DQorICAgICAgICAvLyBleHBsb2l0IG11bHRpLWRpc3BhdGNoIGluIGNvbnN0cnVjdG9yIGNhbGxzDQorICAgICAgICBpZiAoYXR0cmlidXRlcy5jb250YWluc0tleSgiZGVzY3JpcHRpb24iKSkgew0KKyAgICAgICAgICAgIHJldHVybiBuZXcgSW1hZ2VJY29uKHZhbHVlLCBhdHRyaWJ1dGVzLnJlbW92ZSgiZGVzY3JpcHRpb24iKSkNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgcmV0dXJuIG5ldyBJbWFnZUljb24odmFsdWUpDQorICAgICAgICB9DQorICAgIH0NCisNCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zd2luZy9mYWN0b3J5L0ludGVybmFsRnJhbWVGYWN0b3J5Lmdyb292eSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvZmFjdG9yeS9JbnRlcm5hbEZyYW1lRmFjdG9yeS5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWEzODczNAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvZmFjdG9yeS9JbnRlcm5hbEZyYW1lRmFjdG9yeS5ncm9vdnkKQEAgLTAsMCArMSwzMSBAQAorLyoNCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4NCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCitwYWNrYWdlIGdyb292eS5zd2luZy5mYWN0b3J5DQorDQoraW1wb3J0IGphdmF4LnN3aW5nLkpJbnRlcm5hbEZyYW1lDQorDQorY2xhc3MgSW50ZXJuYWxGcmFtZUZhY3RvcnkgZXh0ZW5kcyBSb290UGFuZUNvbnRhaW5lckZhY3Rvcnkgew0KKw0KKyAgICBwdWJsaWMgT2JqZWN0IG5ld0luc3RhbmNlKEZhY3RvcnlCdWlsZGVyU3VwcG9ydCBidWlsZGVyLCBPYmplY3QgbmFtZSwgT2JqZWN0IHZhbHVlLCBNYXAgYXR0cmlidXRlcykgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gew0KKyAgICAgICAgaWYgKEZhY3RvcnlCdWlsZGVyU3VwcG9ydC5jaGVja1ZhbHVlSXNUeXBlKHZhbHVlLCBuYW1lLCBKSW50ZXJuYWxGcmFtZS5jbGFzcykpIHsNCisgICAgICAgICAgICByZXR1cm4gdmFsdWU7DQorICAgICAgICB9DQorICAgICAgICBKSW50ZXJuYWxGcmFtZSBmcmFtZSA9IG5ldyBKSW50ZXJuYWxGcmFtZSgpOw0KKw0KKyAgICAgICAgcmV0dXJuIGZyYW1lOw0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvZmFjdG9yeS9MYXlvdXRGYWN0b3J5Lmdyb292eSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvZmFjdG9yeS9MYXlvdXRGYWN0b3J5Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Mzg1MWZkCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zd2luZy9mYWN0b3J5L0xheW91dEZhY3RvcnkuZ3Jvb3Z5CkBAIC0wLDAgKzEsNDUgQEAKKy8qDQorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorcGFja2FnZSBncm9vdnkuc3dpbmcuZmFjdG9yeQ0KKw0KK2ltcG9ydCBqYXZhLmF3dC5Db250YWluZXINCitpbXBvcnQgamF2YXguc3dpbmcuUm9vdFBhbmVDb250YWluZXINCisNCitjbGFzcyBMYXlvdXRGYWN0b3J5IGV4dGVuZHMgQmVhbkZhY3Rvcnkgew0KKw0KKyAgICBwdWJsaWMgTGF5b3V0RmFjdG9yeShDbGFzcyBrbGFzcykgew0KKyAgICAgICAgc3VwZXIoa2xhc3MpDQorICAgIH0NCisNCisgICAgcHVibGljIExheW91dEZhY3RvcnkoQ2xhc3Mga2xhc3MsIGJvb2xlYW4gbGVhZikgew0KKyAgICAgICAgc3VwZXIoa2xhc3MsIGxlYWYpDQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgc2V0UGFyZW50KEZhY3RvcnlCdWlsZGVyU3VwcG9ydCBidWlsZGVyLCBPYmplY3QgcGFyZW50LCBPYmplY3QgY2hpbGQpIHsNCisgICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBDb250YWluZXIpIHsNCisgICAgICAgICAgICBnZXRMYXlvdXRUYXJnZXQocGFyZW50KS5sYXlvdXQgPSBjaGlsZA0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHB1YmxpYyBzdGF0aWMgQ29udGFpbmVyIGdldExheW91dFRhcmdldChDb250YWluZXIgcGFyZW50KSB7DQorICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgUm9vdFBhbmVDb250YWluZXIpIHsNCisgICAgICAgICAgICBSb290UGFuZUNvbnRhaW5lciBycGMgPSAoUm9vdFBhbmVDb250YWluZXIpIHBhcmVudDsNCisgICAgICAgICAgICBwYXJlbnQgPSBycGMuZ2V0Q29udGVudFBhbmUoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBwYXJlbnQ7DQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zd2luZy9mYWN0b3J5L0xpbmVCb3JkZXJGYWN0b3J5Lmdyb292eSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvZmFjdG9yeS9MaW5lQm9yZGVyRmFjdG9yeS5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc1YTI4ZgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvZmFjdG9yeS9MaW5lQm9yZGVyRmFjdG9yeS5ncm9vdnkKQEAgLTAsMCArMSw1MSBAQAorLyoNCisgKiBDb3B5cmlnaHQgMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorcGFja2FnZSBncm9vdnkuc3dpbmcuZmFjdG9yeQ0KKw0KK2ltcG9ydCBqYXZheC5zd2luZy5ib3JkZXIuTGluZUJvcmRlcg0KKw0KKy8qKg0KKyAqIGFjY2VwdHMgYXR0cmlidXRlczo8YnIgLz4NCisgKiBjb2xvcjogamF2YS5hd3QuQ29sb3IgPGJyLz4NCisgKiBjb2xvcjogamF2YS5hd3QuQ29sb3IsIHRoaWNrbmVzczogaW50IDxici8+DQorICogY29sb3I6IGphdmEuYXd0LkNvbG9yLCB0aGlja25lc3M6IGludCwgcm91bmRlZEJvcmRlcnM6IGJvb2xlYW4gPGJyLz4NCisgKg0KKyAqLw0KK2NsYXNzIExpbmVCb3JkZXJGYWN0b3J5IGV4dGVuZHMgU3dpbmdCb3JkZXJGYWN0b3J5IHsNCisNCisgICAgcHVibGljIE9iamVjdCBuZXdJbnN0YW5jZShGYWN0b3J5QnVpbGRlclN1cHBvcnQgYnVpbGRlciwgT2JqZWN0IG5hbWUsIE9iamVjdCB2YWx1ZSwgTWFwIGF0dHJpYnV0ZXMpIHsNCisgICAgICAgIGJ1aWxkZXIuY29udGV4dC5hcHBseUJvcmRlclRvUGFyZW50ID0gYXR0cmlidXRlcy5yZW1vdmUoJ3BhcmVudCcpDQorICAgICAgICANCisgICAgICAgIGRlZiBjb2xvciA9IGF0dHJpYnV0ZXMucmVtb3ZlKCJjb2xvciIpDQorICAgICAgICBpZiAoY29sb3IgPT0gbnVsbCkgew0KKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJjb2xvcjogaXMgYSByZXF1aXJlZCBhdHRyaWJ1dGUgZm9yICRuYW1lIikNCisgICAgICAgIH0NCisgICAgICAgIGRlZiB0aGlja25lc3MgPSBhdHRyaWJ1dGVzLnJlbW92ZSgidGhpY2tuZXNzIikNCisgICAgICAgIGlmICh0aGlja25lc3MgPT0gbnVsbCkgew0KKyAgICAgICAgICAgIHRoaWNrbmVzcyA9IDENCisgICAgICAgIH0NCisgICAgICAgIGRlZiByb3VuZGVkQ29ybmVycyA9IGF0dHJpYnV0ZXMucmVtb3ZlKCJyb3VuZGVkQ29ybmVycyIpDQorICAgICAgICBpZiAocm91bmRlZENvcm5lcnMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgIHJvdW5kZWRDb3JuZXJzID0gZmFsc2UNCisgICAgICAgIH0NCisgICAgICAgIGlmIChhdHRyaWJ1dGVzKSB7DQorICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIiRuYW1lIGRvZXMgbm90IGtub3cgaG93IHRvIGhhbmRsZSB0aGUgcmVtYWluaW5nIGF0dGlidXRlczogJHthdHRyaWJ1dGVzLmtleVNldCgpfSIpDQorICAgICAgICB9DQorDQorICAgICAgICByZXR1cm4gbmV3IExpbmVCb3JkZXIoY29sb3IsIHRoaWNrbmVzcywgcm91bmRlZENvcm5lcnMpOw0KKyAgICB9DQorDQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvZmFjdG9yeS9NYXBGYWN0b3J5Lmdyb292eSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvZmFjdG9yeS9NYXBGYWN0b3J5Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmE3MmVhCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zd2luZy9mYWN0b3J5L01hcEZhY3RvcnkuZ3Jvb3Z5CkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGdyb292eS5zd2luZy5mYWN0b3J5CisKK3B1YmxpYyBjbGFzcyBNYXBGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RGYWN0b3J5IHsKKyAgICAKKyAgICBwdWJsaWMgT2JqZWN0IG5ld0luc3RhbmNlKEZhY3RvcnlCdWlsZGVyU3VwcG9ydCBidWlsZGVyLCBPYmplY3QgbmFtZSwgT2JqZWN0IHZhbHVlLCBNYXAgYXR0cmlidXRlcykgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24geworICAgICAgICBGYWN0b3J5QnVpbGRlclN1cHBvcnQuY2hlY2tWYWx1ZUlzTnVsbCh2YWx1ZSwgbmFtZSk7CisgICAgICAgIHJldHVybiBhdHRyaWJ1dGVzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvZmFjdG9yeS9NYXR0ZUJvcmRlckZhY3RvcnkuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zd2luZy9mYWN0b3J5L01hdHRlQm9yZGVyRmFjdG9yeS5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc1YTY2NQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvZmFjdG9yeS9NYXR0ZUJvcmRlckZhY3RvcnkuZ3Jvb3Z5CkBAIC0wLDAgKzEsNzYgQEAKKy8qDQorICogQ29weXJpZ2h0IDIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLg0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KK3BhY2thZ2UgZ3Jvb3Z5LnN3aW5nLmZhY3RvcnkNCisNCitpbXBvcnQgamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeQ0KKw0KKy8qKg0KKyAqIG1hdHRlQm9yZGVyIHJlcXVpcmVzIGVzc2VudGlhbGx5IHR3byBwYXJhbWV0ZXIsIGEgbWF0IGRlZmluaXRpb24gYW5kIGENCisgKiBib3JkZXIgc2l6ZSBkZWZpbml0aW9uLiAgVGhlIHZhbHVlIGFyZ3VtZW50IGNhbiBhY2NlcHQgZWl0aGVyIG9mIHRoZXNlOg0KKyAqIGFueSBvZiBhIGphdmEuYXd0LkNvbG9yLCBhIGphdmF4LnN3aW5nLkljb24sIGFuIGludGVnZXIsIG9yIGEgNCBhcmcNCisgKiBpbnRlZ2VyIGFycmF5LiAgVGhlIHJlbWFpbmluZyBwYXJhbWV0ZXIgbXVzdCBiZSBkZWZpbmUgdmlhIGF0dHJpYnV0ZXMsDQorICogZWl0aGVyIGFuIGljb246IG9yIGNvbG9yOiBhdHRyaWJ1dGUgYW5kIGEgc2l6ZTogb3IgdG9wOiwgbGVmdDosIGJvdHRvbTosDQorICogYW5kIHJpZ2h0OiBhdHRyaWJ1dGUuDQorICovDQorY2xhc3MgTWF0dGVCb3JkZXJGYWN0b3J5IGV4dGVuZHMgU3dpbmdCb3JkZXJGYWN0b3J5IHsNCisNCisgICAgcHVibGljIE9iamVjdCBuZXdJbnN0YW5jZShGYWN0b3J5QnVpbGRlclN1cHBvcnQgYnVpbGRlciwgT2JqZWN0IG5hbWUsIE9iamVjdCB2YWx1ZSwgTWFwIGF0dHJpYnV0ZXMpIHsNCisgICAgICAgIGJ1aWxkZXIuY29udGV4dC5hcHBseUJvcmRlclRvUGFyZW50ID0gYXR0cmlidXRlcy5yZW1vdmUoJ3BhcmVudCcpDQorICAgICAgICANCisgICAgICAgIGRlZiBtYXR0ZQ0KKyAgICAgICAgZGVmIGJvcmRlcg0KKyAgICAgICAgaWYgKGF0dHJpYnV0ZXMuY29udGFpbnNLZXkoJ2ljb24nKSkgIHsNCisgICAgICAgICAgICBtYXR0ZSA9IGF0dHJpYnV0ZXMucmVtb3ZlKCdpY29uJykNCisgICAgICAgIH0gZWxzZSBpZiAoYXR0cmlidXRlcy5jb250YWluc0tleSgnY29sb3InKSkgew0KKyAgICAgICAgICAgIG1hdHRlID0gYXR0cmlidXRlcy5yZW1vdmUoJ2NvbG9yJykNCisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIG1hdHRlID0gdmFsdWUNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIiRuYW1lIG11c3QgaGF2ZSBhIG1hdHRlIGRlZmluZWQsIGVpdGhlciBhcyBhIHZhbHVlIGFyZ3VtZW50IG9yIGFzIGEgY29sb3I6IG9yIGljb246IGF0dHJpYnV0ZSIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaWYgKGF0dHJpYnV0ZXMuY29udGFpbnNLZXkoJ3NpemUnKSkgew0KKyAgICAgICAgICAgIGJvcmRlciA9IGF0dHJpYnV0ZXMucmVtb3ZlKCdzaXplJyk7DQorICAgICAgICAgICAgYm9yZGVyID0gW2JvcmRlciwgYm9yZGVyLCBib3JkZXIsIGJvcmRlcl0NCisgICAgICAgIH0gZWxzZSBpZiAoYXR0cmlidXRlcy5jb250YWluc0tleSgndG9wJykpIHsNCisgICAgICAgICAgICBkZWYgdG9wID0gYXR0cmlidXRlcy5yZW1vdmUoJ3RvcCcpDQorICAgICAgICAgICAgZGVmIGxlZnQgPSBhdHRyaWJ1dGVzLnJlbW92ZSgnbGVmdCcpDQorICAgICAgICAgICAgZGVmIGJvdHRvbSA9IGF0dHJpYnV0ZXMucmVtb3ZlKCdib3R0b20nKQ0KKyAgICAgICAgICAgIGRlZiByaWdodCA9IGF0dHJpYnV0ZXMucmVtb3ZlKCdyaWdodCcpDQorICAgICAgICAgICAgaWYgKCh0b3AgPT0gbnVsbCkgfHwgKGxlZnQgPT0gbnVsbCkgfHwgKGJvdHRvbSA9PSBudWxsKSB8fCAocmlnaHQgPT0gbnVsbCkpIHsNCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkluICRuYW1lIGlmIG9uZSBvZiB0b3A6LCBsZWZ0OiwgYm90dG9tOiBvciByaWdodDogaXMgc3BlY2lmaWVkIGFsbCBtdXN0IGJlIHNwZWNpZmllZCIpDQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJvcmRlciA9IFt0b3AsIGxlZnQsIGJvdHRvbSwgcmlnaHRdDQorICAgICAgICB9IGVsc2UgaWYgKHZhbHVlICE9IG51bGwpIHsNCisgICAgICAgICAgICBpZiAobWF0dGUgPT0gdmFsdWUpIHsNCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkluICRuYW1lIHNvbWUgYXR0cmlidXRlcyBhcmUgcmVxdWlyZWQgaW4gYWRkaXRpb24gdG8gdGhlIHZhbHVlIGFyZ3VtZW50IikNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgSW50ZWdlcikgew0KKyAgICAgICAgICAgICAgICBib3JkZXIgPSBbdmFsdWUsIHZhbHVlLCB2YWx1ZSwgdmFsdWVdDQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgYm9yZGVyID0gdmFsdWUNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBpZiAoYXR0cmlidXRlcykgew0KKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCIkbmFtZSBvbmx5IHN1cHBvcnRzIHRoZSBhdHRyaWJ1dGVzIFsgaWNvbjogfCBjb2xvcjpdICBbIHNpemU6IHwgKCB0b3A6IGxlZnQ6IGJvdHRvbTogcmlnaHQ6ICkgfSIpDQorICAgICAgICB9DQorDQorICAgICAgICAvLyBzcHJlYWQgbGlzdCBhbmQgbWlsdGktZGlzcGF0Y2guICBUaGF0J3MgZ3Jvb3Z5IQ0KKyAgICAgICAgcmV0dXJuIEJvcmRlckZhY3RvcnkuY3JlYXRlTWF0dGVCb3JkZXIoKmJvcmRlciwgbWF0dGUpDQorICAgIH0NCisNCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zd2luZy9mYWN0b3J5L01vZGVsRmFjdG9yeS5ncm9vdnkgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3N3aW5nL2ZhY3RvcnkvTW9kZWxGYWN0b3J5Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDYzMjNiCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zd2luZy9mYWN0b3J5L01vZGVsRmFjdG9yeS5ncm9vdnkKQEAgLTAsMCArMSw0OCBAQAorLyoNCisgKiBDb3B5cmlnaHQgMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorcGFja2FnZSBncm9vdnkuc3dpbmcuZmFjdG9yeQ0KKw0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmJpbmRpbmcuTW9kZWxCaW5kaW5nDQorDQorLyoqDQorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86c2hlbW5vbkB5YWhvby5jb20iPkRhbm5vIEZlcnJpbjwvYT4NCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kDQorICogQHNpbmNlIEdyb292eSAxLjENCisgKi8NCitwdWJsaWMgY2xhc3MgTW9kZWxGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RGYWN0b3J5IHsNCisNCisgICAgcHVibGljIGJvb2xlYW4gaXNMZWFmKCkgew0KKyAgICAgICAgcmV0dXJuIHRydWUNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgT2JqZWN0IG5ld0luc3RhbmNlKEZhY3RvcnlCdWlsZGVyU3VwcG9ydCBidWlsZGVyLCBPYmplY3QgbmFtZSwgT2JqZWN0IHZhbHVlLCBNYXAgYXR0cmlidXRlcykgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gew0KKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsNCisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiJG5hbWUgcmVxdWlyZXMgYSB2YWx1ZSBhcmd1bWVudC4iKTsNCisgICAgICAgIH0NCisgICAgICAgIE1vZGVsQmluZGluZyBtYiA9IG5ldyBNb2RlbEJpbmRpbmcodmFsdWUpOw0KKw0KKyAgICAgICAgT2JqZWN0IG8gPSBhdHRyaWJ1dGVzLnJlbW92ZSgiYmluZCIpOw0KKyAgICAgICAgYnVpbGRlci5jb250ZXh0LmJpbmQgPSAobyBpbnN0YW5jZW9mIEJvb2xlYW4pICYmICgoQm9vbGVhbikgbykuYm9vbGVhblZhbHVlKCkNCisgICAgICAgIHJldHVybiBtYjsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBvbk5vZGVDb21wbGV0ZWQoIEZhY3RvcnlCdWlsZGVyU3VwcG9ydCBidWlsZGVyLCBPYmplY3QgcGFyZW50LCBPYmplY3Qgbm9kZSApIHsNCisgICAgICAgIGlmIChidWlsZGVyLmNvbnRleHQuYmluZCkgew0KKyAgICAgICAgICAgIG5vZGUuYmluZCgpDQorICAgICAgICB9DQorICAgIH0NCisNCit9DQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zd2luZy9mYWN0b3J5L1JpY2hBY3Rpb25XaWRnZXRGYWN0b3J5Lmdyb292eSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvZmFjdG9yeS9SaWNoQWN0aW9uV2lkZ2V0RmFjdG9yeS5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDlhNTkyZgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvZmFjdG9yeS9SaWNoQWN0aW9uV2lkZ2V0RmFjdG9yeS5ncm9vdnkKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgZ3Jvb3Z5LnN3aW5nLmZhY3RvcnkKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgoraW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsCitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyCitpbXBvcnQgamF2YXguc3dpbmcuQWN0aW9uCitpbXBvcnQgamF2YXguc3dpbmcuSWNvbgorCisvKioKKyAqCisgKiBAYXV0aG9yIHNoZW1ub24KKyAqLworcHVibGljIGNsYXNzIFJpY2hBY3Rpb25XaWRnZXRGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RGYWN0b3J5IHsKKyAgICBzdGF0aWMgZmluYWwgQ2xhc3NbXSBBQ1RJT05fQVJHUyA9IFtBY3Rpb25dOworICAgIHN0YXRpYyBmaW5hbCBDbGFzc1tdIElDT05fQVJHUyA9IFtJY29uXTsKKyAgICBzdGF0aWMgZmluYWwgQ2xhc3NbXSBTVFJJTkdfQVJHUyA9IFtTdHJpbmddOworICAgIAorICAgIGZpbmFsIENvbnN0cnVjdG9yIGFjdGlvbkN0b3I7CisgICAgZmluYWwgQ29uc3RydWN0b3IgaWNvbkN0b3I7CisgICAgZmluYWwgQ29uc3RydWN0b3Igc3RyaW5nQ3RvcjsKKyAgICBmaW5hbCBDbGFzcyBrbGFzczsKKyAgICAKKyAgICBwdWJsaWMgUmljaEFjdGlvbldpZGdldEZhY3RvcnkoQ2xhc3Mga2xhc3MpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFjdGlvbkN0b3IgPSBrbGFzcy5nZXRDb25zdHJ1Y3RvcihBQ1RJT05fQVJHUyk7CisgICAgICAgICAgICBpY29uQ3RvciA9IGtsYXNzLmdldENvbnN0cnVjdG9yKElDT05fQVJHUyk7CisgICAgICAgICAgICBzdHJpbmdDdG9yID0ga2xhc3MuZ2V0Q29uc3RydWN0b3IoU1RSSU5HX0FSR1MpOworICAgICAgICAgICAgdGhpcy5rbGFzcyA9IGtsYXNzOworICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoImdsb2JhbCIpLmxvZyhMZXZlbC5JTkZPLCBudWxsLCBleCk7CisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKCJnbG9iYWwiKS5sb2coTGV2ZWwuU0VWRVJFLCBudWxsLCBleCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIE9iamVjdCBuZXdJbnN0YW5jZShGYWN0b3J5QnVpbGRlclN1cHBvcnQgYnVpbGRlciwgT2JqZWN0IG5hbWUsIE9iamVjdCB2YWx1ZSwgTWFwIGF0dHJpYnV0ZXMpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGtsYXNzLm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgQWN0aW9uKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFjdGlvbkN0b3IubmV3SW5zdGFuY2UodmFsdWUpOworICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEljb24pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaWNvbkN0b3IubmV3SW5zdGFuY2UodmFsdWUpOworICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgeworICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmdDdG9yLm5ld0luc3RhbmNlKHZhbHVlKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoa2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh2YWx1ZS5nZXRDbGFzcygpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIiRuYW1lIGNhbiBvbmx5IGhhdmUgYSB2YWx1ZSBhcmd1bWVudCBvZiB0eXBlIGphdmF4LnN3aW5nLkFjdGlvbiwgamF2YXguc3dpbmcuSWNvbiwgamF2YS5sYW5nLlN0cmluZywgb3IgJGtsYXNzLm5hbWUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJGYWlsZWQgdG8gY3JlYXRlIGNvbXBvbmVudCBmb3IgJyRuYW1lJyByZWFzb246ICRlIiwgZSk7CisgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkZhaWxlZCB0byBjcmVhdGUgY29tcG9uZW50IGZvciAnJG5hbWUnIHJlYXNvbjogJGUiLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zd2luZy9mYWN0b3J5L1Jvb3RQYW5lQ29udGFpbmVyRmFjdG9yeS5ncm9vdnkgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3N3aW5nL2ZhY3RvcnkvUm9vdFBhbmVDb250YWluZXJGYWN0b3J5Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWVhYWViCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zd2luZy9mYWN0b3J5L1Jvb3RQYW5lQ29udGFpbmVyRmFjdG9yeS5ncm9vdnkKQEAgLTAsMCArMSw3NiBAQAorLyoNCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4NCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCitwYWNrYWdlIGdyb292eS5zd2luZy5mYWN0b3J5DQorDQoraW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudA0KK2ltcG9ydCBqYXZhLmF3dC5XaW5kb3cNCitpbXBvcnQgamF2YXguc3dpbmcuSkJ1dHRvbg0KKw0KK2Fic3RyYWN0IGNsYXNzIFJvb3RQYW5lQ29udGFpbmVyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0RmFjdG9yeSB7DQorDQorICAgIHB1YmxpYyB2b2lkIHNldENoaWxkKEZhY3RvcnlCdWlsZGVyU3VwcG9ydCBidWlsZGVyLCBPYmplY3QgcGFyZW50LCBPYmplY3QgY2hpbGQpIHsNCisgICAgICAgIGlmICghKGNoaWxkIGluc3RhbmNlb2YgQ29tcG9uZW50KSB8fCAoY2hpbGQgaW5zdGFuY2VvZiBXaW5kb3cpKSB7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICBkZWYgY29uc3RyYWludHMgPSBidWlsZGVyLmNvbnRleHQuY29uc3RyYWludHMNCisgICAgICAgICAgICBpZiAoY29uc3RyYWludHMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICBwYXJlbnQuY29udGVudFBhbmUuYWRkKGNoaWxkLCBjb25zdHJhaW50cykNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBwYXJlbnQuY29udGVudFBhbmUuYWRkKGNoaWxkKQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gY2F0Y2ggKE1pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbiBtcGUpIHsNCisgICAgICAgICAgICBwYXJlbnQuY29udGVudFBhbmUuYWRkKGNoaWxkKQ0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIGhhbmRsZVJvb3RQYW5lVGFza3MoRmFjdG9yeUJ1aWxkZXJTdXBwb3J0IGJ1aWxkZXIsIFdpbmRvdyBjb250YWluZXIsIE1hcCBhdHRyaWJ1dGVzKSB7DQorICAgICAgICBidWlsZGVyLmNvbnRleHQuZGVmYXVsdEJ1dHRvbkRlbGVnYXRlID0NCisgICAgICAgICAgICBidWlsZGVyLmFkZEF0dHJpYnV0ZURlbGVnYXRlIHtteUJ1aWxkZXIsIG5vZGUsIG15QXR0cmlidXRlcyAtPg0KKyAgICAgICAgICAgICAgICBpZiAobXlBdHRyaWJ1dGVzLmRlZmF1bHRCdXR0b24gJiYgKG5vZGUgaW5zdGFuY2VvZiBKQnV0dG9uKSkgew0KKyAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLnJvb3RQYW5lLmRlZmF1bHRCdXR0b24gPSBub2RlDQorICAgICAgICAgICAgICAgICAgICBteUF0dHJpYnV0ZXMucmVtb3ZlKCdkZWZhdWx0QnV0dG9uJykNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgIGJ1aWxkZXIuY29udGFpbmluZ1dpbmRvd3MuYWRkKGNvbnRhaW5lcikNCisNCisgICAgICAgIGJ1aWxkZXIuY29udGV4dC5wYWNrID0gYXR0cmlidXRlcy5yZW1vdmUoJ3BhY2snKQ0KKyAgICAgICAgYnVpbGRlci5jb250ZXh0LnNob3cgPSBhdHRyaWJ1dGVzLnJlbW92ZSgnc2hvdycpDQorDQorICAgICAgICBidWlsZGVyLmFkZERpc3Bvc2FsQ2xvc3VyZShjb250YWluZXIuJmRpc3Bvc2UpDQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgb25Ob2RlQ29tcGxldGVkKEZhY3RvcnlCdWlsZGVyU3VwcG9ydCBidWlsZGVyLCBPYmplY3QgcGFyZW50LCBPYmplY3Qgbm9kZSkgew0KKyAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBXaW5kb3cpIHsNCisgICAgICAgICAgICBkZWYgY29udGFpbmluZ1dpbmRvd3MgPSBidWlsZGVyLmNvbnRhaW5pbmdXaW5kb3dzDQorICAgICAgICAgICAgaWYgKCFjb250YWluaW5nV2luZG93cy5lbXB0eSAmJiBjb250YWluaW5nV2luZG93cy5sYXN0ID09IG5vZGUpIHsNCisgICAgICAgICAgICAgICAgY29udGFpbmluZ1dpbmRvd3MucmVtb3ZlTGFzdCgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIGlmIChidWlsZGVyLmNvbnRleHQucGFjaykgew0KKyAgICAgICAgICAgIG5vZGUucGFjaygpDQorICAgICAgICB9DQorICAgICAgICBpZiAoYnVpbGRlci5jb250ZXh0LnNob3cpIHsNCisgICAgICAgICAgICBub2RlLnZpc2libGUgPSB0cnVlDQorICAgICAgICB9DQorDQorICAgICAgICBidWlsZGVyLnJlbW92ZUF0dHJpYnV0ZURlbGVnYXRlKGJ1aWxkZXIuY29udGV4dC5kZWZhdWx0QnV0dG9uRGVsZWdhdGUpDQorICAgIH0NCisNCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zd2luZy9mYWN0b3J5L1Njcm9sbFBhbmVGYWN0b3J5Lmdyb292eSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvZmFjdG9yeS9TY3JvbGxQYW5lRmFjdG9yeS5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIwZTM1OAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvZmFjdG9yeS9TY3JvbGxQYW5lRmFjdG9yeS5ncm9vdnkKQEAgLTAsMCArMSw0NyBAQAorLyoNCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4NCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCitwYWNrYWdlIGdyb292eS5zd2luZy5mYWN0b3J5DQorDQoraW1wb3J0IGphdmF4LnN3aW5nLkpTY3JvbGxQYW5lDQoraW1wb3J0IGphdmF4LnN3aW5nLkpWaWV3cG9ydA0KK2ltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQNCitpbXBvcnQgamF2YS5hd3QuV2luZG93DQorDQorDQorY2xhc3MgU2Nyb2xsUGFuZUZhY3RvcnkgZXh0ZW5kcyBCZWFuRmFjdG9yeSB7DQorDQorICAgIHB1YmxpYyBTY3JvbGxQYW5lRmFjdG9yeSgpIHsNCisgICAgICAgIHRoaXMoSlNjcm9sbFBhbmUpDQorICAgIH0NCisNCisgICAgcHVibGljIFNjcm9sbFBhbmVGYWN0b3J5KENsYXNzIGtsYXNzKSB7DQorICAgICAgICBzdXBlcihrbGFzcywgZmFsc2UpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldENoaWxkKEZhY3RvcnlCdWlsZGVyU3VwcG9ydCBmYWN0b3J5LCBPYmplY3QgcGFyZW50LCBPYmplY3QgY2hpbGQpIHsNCisgICAgICAgIGlmICghKGNoaWxkIGluc3RhbmNlb2YgQ29tcG9uZW50KSB8fCAoY2hpbGQgaW5zdGFuY2VvZiBXaW5kb3cpKSB7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgSlZpZXdwb3J0KSB7DQorICAgICAgICAgICAgcGFyZW50LnNldFZpZXdwb3J0KGNoaWxkKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgcGFyZW50LnNldFZpZXdwb3J0VmlldyhjaGlsZCk7DQorICAgICAgICB9DQorDQorICAgIH0NCisNCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zd2luZy9mYWN0b3J5L1NlcGFyYXRvckZhY3RvcnkuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zd2luZy9mYWN0b3J5L1NlcGFyYXRvckZhY3RvcnkuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ZGUzMTkKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3N3aW5nL2ZhY3RvcnkvU2VwYXJhdG9yRmFjdG9yeS5ncm9vdnkKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgZ3Jvb3Z5LnN3aW5nLmZhY3RvcnkKKworaW1wb3J0IGphdmF4LnN3aW5nLkpNZW51CitpbXBvcnQgamF2YXguc3dpbmcuSlBvcHVwTWVudS5TZXBhcmF0b3IgYXMgSlBvcHVwTWVudV9TZXBhcmF0b3IgLy8gSmV0R3Jvb3Z5IGJ1ZworaW1wb3J0IGphdmF4LnN3aW5nLkpTZXBhcmF0b3IKK2ltcG9ydCBqYXZheC5zd2luZy5KVG9vbEJhcgoraW1wb3J0IGphdmF4LnN3aW5nLkpUb29sQmFyLlNlcGFyYXRvciBhcyBKVG9vbEJhcl9TZXBhcmF0b3IKKworLy8gSmV0R3Jvb3Z5IGJ1ZworCitwdWJsaWMgY2xhc3MgU2VwYXJhdG9yRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0RmFjdG9yeSB7CisgICAgCisgICAgcHVibGljIE9iamVjdCBuZXdJbnN0YW5jZShGYWN0b3J5QnVpbGRlclN1cHBvcnQgYnVpbGRlciwgT2JqZWN0IG5hbWUsIE9iamVjdCB2YWx1ZSwgTWFwIGF0dHJpYnV0ZXMpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKKyAgICAgICAgRmFjdG9yeUJ1aWxkZXJTdXBwb3J0LmNoZWNrVmFsdWVJc051bGwodmFsdWUsIG5hbWUpOworICAgICAgICBPYmplY3QgcGFyZW50ID0gYnVpbGRlci5nZXRDdXJyZW50KCk7CisgICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBKTWVudSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBKUG9wdXBNZW51X1NlcGFyYXRvcigpOworICAgICAgICB9IGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIEpUb29sQmFyKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEpUb29sQmFyX1NlcGFyYXRvcigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBKU2VwYXJhdG9yKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3N3aW5nL2ZhY3RvcnkvU3BsaXRQYW5lRmFjdG9yeS5ncm9vdnkgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3N3aW5nL2ZhY3RvcnkvU3BsaXRQYW5lRmFjdG9yeS5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk3ZjY0YgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvZmFjdG9yeS9TcGxpdFBhbmVGYWN0b3J5Lmdyb292eQpAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBncm9vdnkuc3dpbmcuZmFjdG9yeQorCitpbXBvcnQgamF2YXguc3dpbmcuSlNwbGl0UGFuZQoraW1wb3J0IGphdmEuYXd0LldpbmRvdworaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudAorCitwdWJsaWMgY2xhc3MgU3BsaXRQYW5lRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0RmFjdG9yeSB7CisgICAgCisgICAgcHVibGljIE9iamVjdCBuZXdJbnN0YW5jZShGYWN0b3J5QnVpbGRlclN1cHBvcnQgYnVpbGRlciwgT2JqZWN0IG5hbWUsIE9iamVjdCB2YWx1ZSwgTWFwIGF0dHJpYnV0ZXMpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKEZhY3RvcnlCdWlsZGVyU3VwcG9ydC5jaGVja1ZhbHVlSXNUeXBlKHZhbHVlLCBuYW1lLCBKU3BsaXRQYW5lLmNsYXNzKSkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgICAgIEpTcGxpdFBhbmUgYW5zd2VyID0gbmV3IEpTcGxpdFBhbmUoKTsKKyAgICAgICAgYW5zd2VyLnNldExlZnRDb21wb25lbnQobnVsbCk7CisgICAgICAgIGFuc3dlci5zZXRSaWdodENvbXBvbmVudChudWxsKTsKKyAgICAgICAgYW5zd2VyLnNldFRvcENvbXBvbmVudChudWxsKTsKKyAgICAgICAgYW5zd2VyLnNldEJvdHRvbUNvbXBvbmVudChudWxsKTsKKyAgICAgICAgcmV0dXJuIGFuc3dlcjsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldENoaWxkKEZhY3RvcnlCdWlsZGVyU3VwcG9ydCBmYWN0b3J5LCBPYmplY3QgcGFyZW50LCBPYmplY3QgY2hpbGQpIHsKKyAgICAgICAgaWYgKCEoY2hpbGQgaW5zdGFuY2VvZiBDb21wb25lbnQpIHx8IChjaGlsZCBpbnN0YW5jZW9mIFdpbmRvdykpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAocGFyZW50LmdldE9yaWVudGF0aW9uKCkgPT0gSlNwbGl0UGFuZS5IT1JJWk9OVEFMX1NQTElUKSB7CisgICAgICAgICAgICBpZiAocGFyZW50LmdldFRvcENvbXBvbmVudCgpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBwYXJlbnQuc2V0VG9wQ29tcG9uZW50KGNoaWxkKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcGFyZW50LnNldEJvdHRvbUNvbXBvbmVudChjaGlsZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAocGFyZW50LmdldExlZnRDb21wb25lbnQoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcGFyZW50LnNldExlZnRDb21wb25lbnQoY2hpbGQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwYXJlbnQuc2V0UmlnaHRDb21wb25lbnQoY2hpbGQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zd2luZy9mYWN0b3J5L1N3aW5nQm9yZGVyRmFjdG9yeS5ncm9vdnkgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3N3aW5nL2ZhY3RvcnkvU3dpbmdCb3JkZXJGYWN0b3J5Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGMwOTk1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zd2luZy9mYWN0b3J5L1N3aW5nQm9yZGVyRmFjdG9yeS5ncm9vdnkKQEAgLTAsMCArMSw0NiBAQAorLyoNCisgKiBDb3B5cmlnaHQgMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorcGFja2FnZSBncm9vdnkuc3dpbmcuZmFjdG9yeQ0KKw0KK2ltcG9ydCBqYXZheC5zd2luZy5Sb290UGFuZUNvbnRhaW5lcg0KK2ltcG9ydCBqYXZheC5zd2luZy5KQ29tcG9uZW50DQorDQorYWJzdHJhY3QgY2xhc3MgU3dpbmdCb3JkZXJGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RGYWN0b3J5IHsNCisNCisgICAgcHVibGljIGJvb2xlYW4gaXNMZWFmKCkgew0KKyAgICAgICAgLy8gbm8gY2hpbGRyZW4NCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIG9uSGFuZGxlTm9kZUF0dHJpYnV0ZXMoRmFjdG9yeUJ1aWxkZXJTdXBwb3J0IGJ1aWxkZXIsIE9iamVjdCBub2RlLCBNYXAgYXR0cmlidXRlcykgew0KKyAgICAgICAgLy8gbmV2ZXIgZG8gYmVhbiBhcHBseQ0KKyAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudChGYWN0b3J5QnVpbGRlclN1cHBvcnQgYnVpbGRlciwgT2JqZWN0IHBhcmVudCwgT2JqZWN0IGNoaWxkKSB7DQorICAgICAgICBpZiAoYnVpbGRlci5jb250ZXh0LmFwcGx5Qm9yZGVyVG9QYXJlbnQpIHsNCisgICAgICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgSkNvbXBvbmVudCkgew0KKyAgICAgICAgICAgICAgICBwYXJlbnQuc2V0Qm9yZGVyKGNoaWxkKTsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFJvb3RQYW5lQ29udGFpbmVyKSB7DQorICAgICAgICAgICAgICAgIHNldFBhcmVudChidWlsZGVyLCBwYXJlbnQuY29udGVudFBhbmUsIGNoaWxkKQ0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJCb3JkZXIgY2Fubm90IGJlIGFwcGxpZWQgdG8gcGFyZW50LCBpdCBpcyBuZWl0aGVyIGEgSkNvbXBvbmVudCBvciBhIFJvb3RQYW5lQ29udGFpbmVyIikNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisNCisNCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zd2luZy9mYWN0b3J5L1RhYmJlZFBhbmVGYWN0b3J5Lmdyb292eSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvZmFjdG9yeS9UYWJiZWRQYW5lRmFjdG9yeS5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA5NGM5NgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvZmFjdG9yeS9UYWJiZWRQYW5lRmFjdG9yeS5ncm9vdnkKQEAgLTAsMCArMSwxMDMgQEAKKy8qDQorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorcGFja2FnZSBncm9vdnkuc3dpbmcuZmFjdG9yeQ0KKw0KK2ltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQNCitpbXBvcnQgamF2YS5hd3QuV2luZG93DQoraW1wb3J0IGphdmF4LnN3aW5nLkpUYWJiZWRQYW5lDQorDQorY2xhc3MgVGFiYmVkUGFuZUZhY3RvcnkgZXh0ZW5kcyBCZWFuRmFjdG9yeSB7DQorDQorICAgIHB1YmxpYyBUYWJiZWRQYW5lRmFjdG9yeShDbGFzcyBiZWFuQ2xhc3MpIHsNCisgICAgICAgIHN1cGVyKGJlYW5DbGFzcywgZmFsc2UpDQorICAgIH0NCisNCisgICAgcHVibGljIE9iamVjdCBuZXdJbnN0YW5jZShGYWN0b3J5QnVpbGRlclN1cHBvcnQgYnVpbGRlciwgT2JqZWN0IG5hbWUsIE9iamVjdCB2YWx1ZSwgTWFwIGF0dHJpYnV0ZXMpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsNCisgICAgICAgIGJ1aWxkZXIuY29udGV4dC50YWJiZWRQYW5lRmFjdG9yeUNsb3N1cmUgPSB0aGlzLiZpbnNwZWN0Q2hpbGQNCisgICAgICAgIGJ1aWxkZXIuYWRkQXR0cmlidXRlRGVsZWdhdGUoYnVpbGRlci5jb250ZXh0LnRhYmJlZFBhbmVGYWN0b3J5Q2xvc3VyZSkNCisgICAgICAgIGJ1aWxkZXIuY29udGV4dC5zZWxlY3RlZEluZGV4ID0gYXR0cmlidXRlcy5yZW1vdmUoJ3NlbGVjdGVkSW5kZXgnKQ0KKyAgICAgICAgYnVpbGRlci5jb250ZXh0LnNlbGVjdGVkQ29tcG9uZW50ID0gYXR0cmlidXRlcy5yZW1vdmUoJ3NlbGVjdGVkQ29tcG9uZW50JykNCisgICAgICAgIHJldHVybiBzdXBlci5uZXdJbnN0YW5jZShidWlsZGVyLCBuYW1lLCB2YWx1ZSwgYXR0cmlidXRlcykNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5zcGVjdENoaWxkKEZhY3RvcnlCdWlsZGVyU3VwcG9ydCBidWlsZGVyLCBPYmplY3Qgbm9kZSwgTWFwIGF0dHJpYnV0ZXMpIHsNCisgICAgICAgIGlmIChidWlsZGVyLmN1cnJlbnQgaW5zdGFuY2VvZiBKVGFiYmVkUGFuZSkgew0KKyAgICAgICAgICAgIGRlZiBuYW1lID0gYXR0cmlidXRlcy5yZW1vdmUoJ3RpdGxlJykNCisgICAgICAgICAgICBkZWYgaWNvbiA9IGF0dHJpYnV0ZXMucmVtb3ZlKCd0YWJJY29uJykNCisgICAgICAgICAgICBkZWYgZGlzYWJsZWRJY29uID0gYXR0cmlidXRlcy5yZW1vdmUoJ3RhYkRpc2FibGVkSWNvbicpDQorICAgICAgICAgICAgZGVmIHRvb2xUaXAgPSBhdHRyaWJ1dGVzLnJlbW92ZSgndGFiVG9vbFRpcCcpDQorICAgICAgICAgICAgZGVmIGJhY2tncm91bmQgPSBhdHRyaWJ1dGVzLnJlbW92ZSgndGFiQmFja2dyb3VuZCcpDQorICAgICAgICAgICAgZGVmIGZvcmVncm91bmQgPSBhdHRyaWJ1dGVzLnJlbW92ZSgndGFiRm9yZWdyb3VuZCcpDQorICAgICAgICAgICAgZGVmIGVuYWJsZWQgPSBhdHRyaWJ1dGVzLnJlbW92ZSgndGFiRW5hYmxlZCcpDQorICAgICAgICAgICAgZGVmIG1uZW1vbmljID0gYXR0cmlidXRlcy5yZW1vdmUoJ3RhYk1uZW1vbmljJykNCisgICAgICAgICAgICBkZWYgZGlzcGxheWVkTW5lbW9uaWNJbmRleCA9IGF0dHJpYnV0ZXMucmVtb3ZlKCd0YWJEaXNwbGF5ZWRNbmVtb25pY0luZGV4JykNCisgICAgICAgICAgICBidWlsZGVyLmNvbnRleHQucHV0KG5vZGUsIFtuYW1lLCBpY29uLCBkaXNhYmxlZEljb24sIHRvb2xUaXAsIGJhY2tncm91bmQsIGZvcmVncm91bmQsIGVuYWJsZWQsIG1uZW1vbmljLCBkaXNwbGF5ZWRNbmVtb25pY0luZGV4XSkNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXRDaGlsZChGYWN0b3J5QnVpbGRlclN1cHBvcnQgYnVpbGRlciwgT2JqZWN0IHBhcmVudCwgT2JqZWN0IGNoaWxkKSB7DQorICAgICAgICBpZiAoIShjaGlsZCBpbnN0YW5jZW9mIENvbXBvbmVudCkgfHwgKGNoaWxkIGluc3RhbmNlb2YgV2luZG93KSkgew0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgZGVmIHRpdGxlID0gYnVpbGRlci5jb250ZXh0W2NoaWxkXSA/OiBbbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbF0NCisgICAgICAgICAgICBpZiAodGl0bGVbMF0gPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICB0aXRsZVswXSA9IGNoaWxkLm5hbWUNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcGFyZW50LmFkZFRhYih0aXRsZVswXSwgdGl0bGVbMV0sIGNoaWxkLCB0aXRsZVszXSkNCisgICAgICAgICAgICBpbnQgaW5kZXggPSBwYXJlbnQuaW5kZXhPZkNvbXBvbmVudChjaGlsZCkNCisgICAgICAgICAgICBpZiAodGl0bGVbMl0pIHsNCisgICAgICAgICAgICAgICAgcGFyZW50LnNldERpc2FibGVkSWNvbkF0KGluZGV4LCB0aXRsZVsyXSkNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKHRpdGxlWzRdKSB7DQorICAgICAgICAgICAgICAgIHBhcmVudC5zZXRCYWNrZ3JvdW5kQXQoaW5kZXgsIHRpdGxlWzRdKQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAodGl0bGVbNV0pIHsNCisgICAgICAgICAgICAgICAgcGFyZW50LnNldEZvcmVncm91bmRBdChpbmRleCwgdGl0bGVbNV0pDQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmICh0aXRsZVs2XSAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHBhcmVudC5zZXRFbmFibGVkQXQoaW5kZXgsIHRpdGxlWzZdKQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAodGl0bGVbN10pIHsNCisgICAgICAgICAgICAgICAgZGVmIG1uZW1vbmljID0gdGl0bGVbN10NCisgICAgICAgICAgICAgICAgaWYgKG1uZW1vbmljIGluc3RhbmNlb2YgU3RyaW5nKSB7DQorICAgICAgICAgICAgICAgICAgICBwYXJlbnQuc2V0TW5lbW9uaWNBdChpbmRleCwgbW5lbW9uaWMuY2hhckF0KDApIGFzIGludCkNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIHBhcmVudC5zZXRNbmVtb25pY0F0KGluZGV4LCBtbmVtb25pYyBhcyBpbnQpDQorICAgICAgICAgICAgICAgIH0gDQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmICh0aXRsZVs4XSkgew0KKyAgICAgICAgICAgICAgICBwYXJlbnQuc2V0RGlzcGxheWVkTW5lbW9uaWNJbmRleEF0KGluZGV4LCB0aXRsZVs4XSkNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGNhdGNoIChNaXNzaW5nUHJvcGVydHlFeGNlcHRpb24gbXBlKSB7DQorICAgICAgICAgICAgcGFyZW50LmFkZChjaGlsZCkNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBvbk5vZGVDb21wbGV0ZWQoIEZhY3RvcnlCdWlsZGVyU3VwcG9ydCBidWlsZGVyLCBPYmplY3QgcGFyZW50LCBPYmplY3Qgbm9kZSApIHsNCisgICAgICAgIHN1cGVyLm9uTm9kZUNvbXBsZXRlZCAoYnVpbGRlciwgcGFyZW50LCBub2RlKQ0KKyAgICAgICAgYnVpbGRlci5yZW1vdmVBdHRyaWJ1dGVEZWxlZ2F0ZShidWlsZGVyLmNvbnRleHQudGFiYmVkUGFuZUZhY3RvcnlDbG9zdXJlKQ0KKyAgICAgICAgaWYgKGJ1aWxkZXIuY29udGV4dC5zZWxlY3RlZENvbXBvbmVudCAhPSBudWxsKSB7DQorICAgICAgICAgICAgbm9kZS5zZWxlY3RlZENvbXBvbmVudCA9IGJ1aWxkZXIuY29udGV4dC5zZWxlY3RlZENvbXBvbmVudA0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGJ1aWxkZXIuY29udGV4dC5zZWxlY3RlZEluZGV4ICE9IG51bGwpIHsNCisgICAgICAgICAgICBub2RlLnNlbGVjdGVkSW5kZXggPSBidWlsZGVyLmNvbnRleHQuc2VsZWN0ZWRJbmRleA0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorDQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvZmFjdG9yeS9UYWJsZUZhY3RvcnkuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zd2luZy9mYWN0b3J5L1RhYmxlRmFjdG9yeS5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM5ZTlkMgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvZmFjdG9yeS9UYWJsZUZhY3RvcnkuZ3Jvb3Z5CkBAIC0wLDAgKzEsNDEgQEAKKy8qDQorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorcGFja2FnZSBncm9vdnkuc3dpbmcuZmFjdG9yeQ0KKw0KK2ltcG9ydCBqYXZheC5zd2luZy5KVGFibGUNCitpbXBvcnQgamF2YXguc3dpbmcudGFibGUuVGFibGVDb2x1bW4NCitpbXBvcnQgamF2YXguc3dpbmcudGFibGUuVGFibGVNb2RlbA0KKw0KK2NsYXNzIFRhYmxlRmFjdG9yeSBleHRlbmRzIEJlYW5GYWN0b3J5IHsNCisNCisgICAgcHVibGljIFRhYmxlRmFjdG9yeSgpIHsNCisgICAgICAgIHRoaXMoSlRhYmxlKQ0KKyAgICB9DQorDQorICAgIHB1YmxpYyBUYWJsZUZhY3RvcnkoQ2xhc3Mga2xhc3MpIHsNCisgICAgICAgIHN1cGVyKGtsYXNzLCBmYWxzZSkNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXRDaGlsZChGYWN0b3J5QnVpbGRlclN1cHBvcnQgYnVpbGRlciwgT2JqZWN0IHBhcmVudCwgT2JqZWN0IGNoaWxkKSB7DQorICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBUYWJsZUNvbHVtbikgew0KKyAgICAgICAgICAgIHBhcmVudC5hZGRDb2x1bW4oY2hpbGQpOw0KKyAgICAgICAgfSBlbHNlIGlmIChjaGlsZCBpbnN0YW5jZW9mIFRhYmxlTW9kZWwpIHsNCisgICAgICAgICAgICBwYXJlbnQubW9kZWwgPSBjaGlsZDsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3N3aW5nL2ZhY3RvcnkvVGFibGVMYXlvdXRGYWN0b3J5Lmdyb292eSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvZmFjdG9yeS9UYWJsZUxheW91dEZhY3RvcnkuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMGZhNTMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3N3aW5nL2ZhY3RvcnkvVGFibGVMYXlvdXRGYWN0b3J5Lmdyb292eQpAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBncm9vdnkuc3dpbmcuZmFjdG9yeQorCitpbXBvcnQgZ3Jvb3Z5LnN3aW5nLmltcGwuVGFibGVMYXlvdXQKK2ltcG9ydCBncm9vdnkuc3dpbmcuaW1wbC5UYWJsZUxheW91dENlbGwKK2ltcG9ydCBncm9vdnkuc3dpbmcuaW1wbC5UYWJsZUxheW91dFJvdworaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudAoraW1wb3J0IGphdmEuYXd0LldpbmRvdworCitwdWJsaWMgY2xhc3MgVGFibGVMYXlvdXRGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RGYWN0b3J5IHsKKyAgICAKKyAgICBwdWJsaWMgT2JqZWN0IG5ld0luc3RhbmNlKEZhY3RvcnlCdWlsZGVyU3VwcG9ydCBidWlsZGVyLCBPYmplY3QgbmFtZSwgT2JqZWN0IHZhbHVlLCBNYXAgYXR0cmlidXRlcykgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24geworICAgICAgICBpZiAoRmFjdG9yeUJ1aWxkZXJTdXBwb3J0LmNoZWNrVmFsdWVJc1R5cGUodmFsdWUsIG5hbWUsIFRhYmxlTGF5b3V0LmNsYXNzKSkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgVGFibGVMYXlvdXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnQoRmFjdG9yeUJ1aWxkZXJTdXBwb3J0IGJ1aWxkZXIsIE9iamVjdCBwYXJlbnQsIE9iamVjdCBjaGlsZCkgeworICAgICAgICBpZiAoYnVpbGRlci5nZXRQYXJlbnRGYWN0b3J5KCkpIHsKKyAgICAgICAgICAgIGJ1aWxkZXIuZ2V0UGFyZW50RmFjdG9yeSgpLnNldENoaWxkIChidWlsZGVyLCBwYXJlbnQsIGNoaWxkLmdldENvbXBvbmVudCgpKTsKKyAgICAgICAgfQorICAgIH0KK30KKyAgICAKK3B1YmxpYyBjbGFzcyBUUkZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdEZhY3RvcnkgeworICAgIHB1YmxpYyBPYmplY3QgbmV3SW5zdGFuY2UoRmFjdG9yeUJ1aWxkZXJTdXBwb3J0IGJ1aWxkZXIsIE9iamVjdCBuYW1lLCBPYmplY3QgdmFsdWUsIE1hcCBhdHRyaWJ1dGVzKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7CisgICAgICAgIEZhY3RvcnlCdWlsZGVyU3VwcG9ydC5jaGVja1ZhbHVlSXNOdWxsKHZhbHVlLCBuYW1lKTsKKyAgICAgICAgLy9UT0RPIHdlIGNvdWxkIG1ha2UgdGhlIHZhbHVlIGFyZyB0aGUgcGFyZW50CisgICAgICAgIE9iamVjdCBwYXJlbnQgPSBidWlsZGVyLmdldEN1cnJlbnQoKTsKKyAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFRhYmxlTGF5b3V0KSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFRhYmxlTGF5b3V0Um93KChUYWJsZUxheW91dCkgcGFyZW50KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCIndHInIG11c3QgYmUgd2l0aGluIGEgJ3RhYmxlTGF5b3V0JyIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25Ob2RlQ29tcGxldGVkKEZhY3RvcnlCdWlsZGVyU3VwcG9ydCBidWlsZGVyLCBPYmplY3QgcGFyZW50LCBPYmplY3Qgbm9kZSkgeworICAgICAgICBub2RlLnN0YXJ0KCkKKyAgICB9Cit9CisKK3B1YmxpYyBjbGFzcyBUREZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdEZhY3RvcnkgeworICAgIHB1YmxpYyBPYmplY3QgbmV3SW5zdGFuY2UoRmFjdG9yeUJ1aWxkZXJTdXBwb3J0IGJ1aWxkZXIsIE9iamVjdCBuYW1lLCBPYmplY3QgdmFsdWUsIE1hcCBhdHRyaWJ1dGVzKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7CisgICAgICAgIEZhY3RvcnlCdWlsZGVyU3VwcG9ydC5jaGVja1ZhbHVlSXNOdWxsKHZhbHVlLCBuYW1lKTsKKyAgICAgICAgLy9UT0RPIHdlIGNvdWxkIG1ha2UgdGhlIHZhbHVlIGFyZyB0aGUgVFIKKyAgICAgICAgT2JqZWN0IHBhcmVudCA9IGJ1aWxkZXIuZ2V0Q3VycmVudCgpOworICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgVGFibGVMYXlvdXRSb3cpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVGFibGVMYXlvdXRDZWxsKChUYWJsZUxheW91dFJvdykgcGFyZW50KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCIndGQnIG11c3QgYmUgd2l0aGluIGEgJ3RyJyIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2hpbGQoRmFjdG9yeUJ1aWxkZXJTdXBwb3J0IGJ1aWxkZXIsIE9iamVjdCBwYXJlbnQsIE9iamVjdCBjaGlsZCkgeworICAgICAgICBpZiAoIShjaGlsZCBpbnN0YW5jZW9mIENvbXBvbmVudCkgfHwgKGNoaWxkIGluc3RhbmNlb2YgV2luZG93KSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHBhcmVudC5hZGRDb21wb25lbnQoY2hpbGQpCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zd2luZy9mYWN0b3J5L1RhYmxlTW9kZWxGYWN0b3J5Lmdyb292eSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvZmFjdG9yeS9UYWJsZU1vZGVsRmFjdG9yeS5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ4MmIxMQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvZmFjdG9yeS9UYWJsZU1vZGVsRmFjdG9yeS5ncm9vdnkKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGdyb292eS5zd2luZy5mYWN0b3J5CisKK2ltcG9ydCBncm9vdnkubW9kZWwuRGVmYXVsdFRhYmxlTW9kZWwKK2ltcG9ydCBncm9vdnkubW9kZWwuVmFsdWVIb2xkZXIKK2ltcG9ydCBncm9vdnkubW9kZWwuVmFsdWVNb2RlbAoraW1wb3J0IGphdmF4LnN3aW5nLnRhYmxlLlRhYmxlTW9kZWwKK2ltcG9ydCBqYXZheC5zd2luZy5KVGFibGUKKworcHVibGljIGNsYXNzIFRhYmxlTW9kZWxGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RGYWN0b3J5IHsKKyAgICAKKyAgICBwdWJsaWMgT2JqZWN0IG5ld0luc3RhbmNlKEZhY3RvcnlCdWlsZGVyU3VwcG9ydCBidWlsZGVyLCBPYmplY3QgbmFtZSwgT2JqZWN0IHZhbHVlLCBNYXAgYXR0cmlidXRlcykgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24geworICAgICAgICBpZiAoRmFjdG9yeUJ1aWxkZXJTdXBwb3J0LmNoZWNrVmFsdWVJc1R5cGUodmFsdWUsIG5hbWUsIFRhYmxlTW9kZWwuY2xhc3MpKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0gZWxzZSBpZiAoYXR0cmlidXRlcy5nZXQobmFtZSkgaW5zdGFuY2VvZiBUYWJsZU1vZGVsKSB7CisgICAgICAgICAgICByZXR1cm4gYXR0cmlidXRlcy5yZW1vdmUobmFtZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBWYWx1ZU1vZGVsIG1vZGVsID0gKFZhbHVlTW9kZWwpIGF0dHJpYnV0ZXMucmVtb3ZlKCJtb2RlbCIpOworICAgICAgICAgICAgaWYgKG1vZGVsID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBPYmplY3QgbGlzdCA9IGF0dHJpYnV0ZXMucmVtb3ZlKCJsaXN0Iik7CisgICAgICAgICAgICAgICAgaWYgKGxpc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtb2RlbCA9IG5ldyBWYWx1ZUhvbGRlcihsaXN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXcgRGVmYXVsdFRhYmxlTW9kZWwobW9kZWwpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25Ob2RlQ29tcGxldGVkKEZhY3RvcnlCdWlsZGVyU3VwcG9ydCBidWlsZGVyLCBPYmplY3QgcGFyZW50LCBPYmplY3Qgbm9kZSkgeworICAgICAgICBpZiAoKG5vZGUuY29sdW1uQ291bnQgPiAwKQorICAgICAgICAgICAgJiYgKHBhcmVudCBpbnN0YW5jZW9mIEpUYWJsZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBhcmVudC5jb2x1bW5Nb2RlbCA9IG5vZGUuY29sdW1uTW9kZWwKKyAgICAgICAgICAgIHBhcmVudC5hdXRvQ3JlYXRlQ29sdW1uc0Zyb21Nb2RlbCA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorfQorCitwdWJsaWMgY2xhc3MgUHJvcGVydHlDb2x1bW5GYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RGYWN0b3J5IHsKKworICAgIHB1YmxpYyBPYmplY3QgbmV3SW5zdGFuY2UoRmFjdG9yeUJ1aWxkZXJTdXBwb3J0IGJ1aWxkZXIsIE9iamVjdCBuYW1lLCBPYmplY3QgdmFsdWUsIE1hcCBhdHRyaWJ1dGVzKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7CisgICAgICAgIEZhY3RvcnlCdWlsZGVyU3VwcG9ydC5jaGVja1ZhbHVlSXNOdWxsKHZhbHVlLCBuYW1lKTsKKyAgICAgICAgT2JqZWN0IGN1cnJlbnQgPSBidWlsZGVyLmdldEN1cnJlbnQoKTsKKyAgICAgICAgaWYgKGN1cnJlbnQgaW5zdGFuY2VvZiBEZWZhdWx0VGFibGVNb2RlbCkgeworICAgICAgICAgICAgRGVmYXVsdFRhYmxlTW9kZWwgbW9kZWwgPSAoRGVmYXVsdFRhYmxlTW9kZWwpIGN1cnJlbnQ7CisgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHkgPSAoU3RyaW5nKSBhdHRyaWJ1dGVzLnJlbW92ZSgicHJvcGVydHlOYW1lIik7CisgICAgICAgICAgICBpZiAocHJvcGVydHkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk11c3Qgc3BlY2lmeSBhIHByb3BlcnR5IGZvciBhIHByb3BlcnR5Q29sdW1uIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBPYmplY3QgaGVhZGVyID0gYXR0cmlidXRlcy5yZW1vdmUoImhlYWRlciIpOworICAgICAgICAgICAgaWYgKGhlYWRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaGVhZGVyID0gIiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDbGFzcyB0eXBlID0gKENsYXNzKSBhdHRyaWJ1dGVzLnJlbW92ZSgidHlwZSIpOworICAgICAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHR5cGUgPSBPYmplY3QuY2xhc3M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBCb29sZWFuIGVkaXRhYmxlID0gKEJvb2xlYW4pIGF0dHJpYnV0ZXMucmVtb3ZlKCJlZGl0YWJsZSIpOworICAgICAgICAgICAgaWYgKGVkaXRhYmxlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBlZGl0YWJsZSA9IEJvb2xlYW4uVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtb2RlbC5hZGRQcm9wZXJ0eUNvbHVtbihoZWFkZXIsIHByb3BlcnR5LCB0eXBlLCBlZGl0YWJsZS5ib29sZWFuVmFsdWUoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigicHJvcGVydHlDb2x1bW4gbXVzdCBiZSBhIGNoaWxkIG9mIGEgdGFibGVNb2RlbCIpOworICAgICAgICB9CisgICAgfQorfQorCitwdWJsaWMgY2xhc3MgQ2xvc3VyZUNvbHVtbkZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdEZhY3RvcnkgeworCisgICAgcHVibGljIE9iamVjdCBuZXdJbnN0YW5jZShGYWN0b3J5QnVpbGRlclN1cHBvcnQgYnVpbGRlciwgT2JqZWN0IG5hbWUsIE9iamVjdCB2YWx1ZSwgTWFwIGF0dHJpYnV0ZXMpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKKyAgICAgICAgRmFjdG9yeUJ1aWxkZXJTdXBwb3J0LmNoZWNrVmFsdWVJc051bGwodmFsdWUsIG5hbWUpOworICAgICAgICBPYmplY3QgY3VycmVudCA9IGJ1aWxkZXIuZ2V0Q3VycmVudCgpOworICAgICAgICBpZiAoY3VycmVudCBpbnN0YW5jZW9mIERlZmF1bHRUYWJsZU1vZGVsKSB7CisgICAgICAgICAgICBEZWZhdWx0VGFibGVNb2RlbCBtb2RlbCA9IChEZWZhdWx0VGFibGVNb2RlbCkgY3VycmVudDsKKyAgICAgICAgICAgIE9iamVjdCBoZWFkZXIgPSBhdHRyaWJ1dGVzLnJlbW92ZSgiaGVhZGVyIik7CisgICAgICAgICAgICBpZiAoaGVhZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBoZWFkZXIgPSAiIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENsb3N1cmUgcmVhZENsb3N1cmUgPSAoQ2xvc3VyZSkgYXR0cmlidXRlcy5yZW1vdmUoInJlYWQiKTsKKyAgICAgICAgICAgIGlmIChyZWFkQ2xvc3VyZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTXVzdCBzcGVjaWZ5ICdyZWFkJyBDbG9zdXJlIHByb3BlcnR5IGZvciBhIGNsb3N1cmVDb2x1bW4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENsb3N1cmUgd3JpdGVDbG9zdXJlID0gKENsb3N1cmUpIGF0dHJpYnV0ZXMucmVtb3ZlKCJ3cml0ZSIpOworICAgICAgICAgICAgQ2xhc3MgdHlwZSA9IChDbGFzcykgYXR0cmlidXRlcy5yZW1vdmUoInR5cGUiKTsKKyAgICAgICAgICAgIGlmICh0eXBlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0eXBlID0gT2JqZWN0LmNsYXNzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG1vZGVsLmFkZENsb3N1cmVDb2x1bW4oaGVhZGVyLCByZWFkQ2xvc3VyZSwgd3JpdGVDbG9zdXJlLCB0eXBlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJjbG9zdXJlQ29sdW1uIG11c3QgYmUgYSBjaGlsZCBvZiBhIHRhYmxlTW9kZWwiKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvZmFjdG9yeS9UZXh0QXJnV2lkZ2V0RmFjdG9yeS5ncm9vdnkgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3N3aW5nL2ZhY3RvcnkvVGV4dEFyZ1dpZGdldEZhY3RvcnkuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMDJiNGYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3N3aW5nL2ZhY3RvcnkvVGV4dEFyZ1dpZGdldEZhY3RvcnkuZ3Jvb3Z5CkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGdyb292eS5zd2luZy5mYWN0b3J5CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuSW52b2tlckhlbHBlcgorCisvKioKKyAqCisgKiBAYXV0aG9yIERhbm5vIEZlcnJpbgorICovCitwdWJsaWMgY2xhc3MgVGV4dEFyZ1dpZGdldEZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdEZhY3RvcnkgeworICAgIAorICAgIGZpbmFsIENsYXNzIGtsYXNzOworICAgIAorICAgIHB1YmxpYyBUZXh0QXJnV2lkZ2V0RmFjdG9yeShDbGFzcyBrbGFzcykgeworICAgICAgICB0aGlzLmtsYXNzID0ga2xhc3M7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBPYmplY3QgbmV3SW5zdGFuY2UoRmFjdG9yeUJ1aWxkZXJTdXBwb3J0IGJ1aWxkZXIsIE9iamVjdCBuYW1lLCBPYmplY3QgdmFsdWUsIE1hcCBhdHRyaWJ1dGVzKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChGYWN0b3J5QnVpbGRlclN1cHBvcnQuY2hlY2tWYWx1ZUlzVHlwZU5vdFN0cmluZyh2YWx1ZSwgbmFtZSwga2xhc3MpKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIE9iamVjdCB3aWRnZXQgPSBrbGFzcy5uZXdJbnN0YW5jZSgpOworICAgICAgICAKKyAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7CisgICAgICAgICAgICAvLyB0aGlzIGRvZXMgbm90IGNyZWF0ZSBwcm9wZXJ0eSBzZXR0aW5nIG9yZGVyIGlzc3Vlcywgc2luY2UgdGhlIHZhbHVlIGFyZyBwcmVjZWVkcyBhbGwgYXR0cmlidXRlcyBpbiB0aGUgYnVpbGRlciBlbGVtZW50CisgICAgICAgICAgICBJbnZva2VySGVscGVyLnNldFByb3BlcnR5KHdpZGdldCwgInRleHQiLCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiB3aWRnZXQ7CisgICAgfSAgICAKKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zd2luZy9mYWN0b3J5L1RpdGxlZEJvcmRlckZhY3RvcnkuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zd2luZy9mYWN0b3J5L1RpdGxlZEJvcmRlckZhY3RvcnkuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMzFiZGIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3N3aW5nL2ZhY3RvcnkvVGl0bGVkQm9yZGVyRmFjdG9yeS5ncm9vdnkKQEAgLTAsMCArMSw4OSBAQAorLyoNCisgKiBDb3B5cmlnaHQgMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorcGFja2FnZSBncm9vdnkuc3dpbmcuZmFjdG9yeQ0KKw0KK2ltcG9ydCBqYXZheC5zd2luZy5ib3JkZXIuVGl0bGVkQm9yZGVyDQoraW1wb3J0IGphdmEuYXd0LkNvbG9yDQoraW1wb3J0IGphdmF4LnN3aW5nLmJvcmRlci5Cb3JkZXINCitpbXBvcnQgamF2YS5hd3QuRm9udA0KKw0KKw0KKy8qKg0KKyAqIFRoZSBub2RlIG11c3QgYmUgY2FsbGVkIHdpdGggZWl0aGVyIGEgdmFsdWUgYXJ1Z21lbnQgb3IgYSB0aXRsZTogYXR0cmlidXRlLiA8YnIgLz4NCisgKiBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIG9wdGlvbmFsLiA8YnIgLz4NCisgKiAgICBwb3NpdGlvbjogb25lIG9mICJkZWZhdWx0IiwgImFib3ZlVG9wIiwgInRvcCIsICJiZWxvd1RvcCIsICJhYm92ZUJvdHRvbSIsICJib3R0b20iLCAiYmVsb3dCb3R0b20iLCBvciBhIGNvbnN0YW50IGZyb20gamF2YXguc3dpbmcuYm9yZGVyLlRpdGxlZEJvcmRlcg0KKyAqICAgIGp1c3RpZmljYXRpb246IG9uZSBvZiAiZGVmYXVsdCIsICJsZWZ0IiwgImNlbnRlciIsICJyaWdodCIsICJsZWFkaW5nIiwgInRyYWlsaW5nIiwgb3IgYSBjb25zdGFudCBmcm9tIGphdmF4LnN3aW5nLmJvcmRlci5UaXRsZWRCb3JkZXINCisgKiAgICBib3JkZXI6IGphdmF4LnN3aW5nLkJvcmRlciwgc29tZSBvdGhlciBib3JkZXIsIGlmIHVuc2V0IHRoZSBsb29rIGFuZCBmZWVsIGRlZmF1bHQgd2lsbCBiZSB1c2VkIChyZQ0KKyAqICAgIGNvbG9yOiBqYXZhLmF3dC5Db2xvciB0aGUgY29sb3Igb2YgdGhlIHRleHQgZm9yIHRoZSB0aXRsZQ0KKyAqICAgIGZvbnQ6IGphdmEuYXd0LkZvbnQgdGhlIGZvbnQgb2YgdGhlIHRleHQgZm9yIHRoZSB0aXRsZQ0KKyAqLw0KK2NsYXNzIFRpdGxlZEJvcmRlckZhY3RvcnkgZXh0ZW5kcyBTd2luZ0JvcmRlckZhY3Rvcnkgew0KKw0KKyAgICBzdGF0aWMgZmluYWwgTWFwIHBvc2l0aW9ucyA9IFsNCisgICAgICAgICdkZWZhdWx0JzogICAgVGl0bGVkQm9yZGVyLkRFRkFVTFRfUE9TSVRJT04sDQorICAgICAgICBhYm92ZVRvcDogICAgVGl0bGVkQm9yZGVyLkFCT1ZFX1RPUCwNCisgICAgICAgIHRvcDogICAgICAgICAgVGl0bGVkQm9yZGVyLlRPUCwNCisgICAgICAgIGJlbG93VG9wOiAgICBUaXRsZWRCb3JkZXIuQkVMT1dfVE9QLA0KKyAgICAgICAgYWJvdmVCb3R0b206IFRpdGxlZEJvcmRlci5BQk9WRV9CT1RUT00sDQorICAgICAgICBib3R0b206ICAgICAgIFRpdGxlZEJvcmRlci5CT1RUT00sDQorICAgICAgICBiZWxvd0JvdHRvbTogVGl0bGVkQm9yZGVyLkJFTE9XX0JPVFRPTSwNCisgICAgXQ0KKw0KKyAgICBzdGF0aWMgZmluYWwgTWFwIGp1c3RpZmljYXRpb25zID0gWw0KKyAgICAgICAgJ2RlZmF1bHQnOiBUaXRsZWRCb3JkZXIuREVGQVVMVF9KVVNUSUZJQ0FUSU9OLA0KKyAgICAgICAgbGVmdDogICAgICBUaXRsZWRCb3JkZXIuTEVGVCwNCisgICAgICAgIGNlbnRlcjogICAgVGl0bGVkQm9yZGVyLkNFTlRFUiwNCisgICAgICAgIHJpZ2h0OiAgICAgVGl0bGVkQm9yZGVyLlJJR0hULA0KKyAgICAgICAgbGVhZGluZzogICBUaXRsZWRCb3JkZXIuTEVBRElORywNCisgICAgICAgIHRyYWlsaW5nOiAgVGl0bGVkQm9yZGVyLlRSQUlMSU5HLA0KKyAgICBdDQorDQorDQorICAgIHB1YmxpYyBPYmplY3QgbmV3SW5zdGFuY2UoRmFjdG9yeUJ1aWxkZXJTdXBwb3J0IGJ1aWxkZXIsIE9iamVjdCBuYW1lLCBPYmplY3QgdmFsdWUsIE1hcCBhdHRyaWJ1dGVzKSB7DQorICAgICAgICBidWlsZGVyLmNvbnRleHQuYXBwbHlCb3JkZXJUb1BhcmVudCA9IGF0dHJpYnV0ZXMucmVtb3ZlKCdwYXJlbnQnKQ0KKyAgICAgICAgDQorICAgICAgICBTdHJpbmcgdGl0bGUNCisgICAgICAgIGlmICh2YWx1ZSkgew0KKyAgICAgICAgICAgIHRpdGxlID0gdmFsdWUgYXMgU3RyaW5nDQorICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZXMuY29udGFpbnNLZXkoInRpdGxlIikpIHsNCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIiRuYW1lIGNhbm5vdCBoYXZlIGJvdGggYSB2YWx1ZSBhdHRyaWJ1dGUgYW5kIGFuIGF0dHJpYnV0ZSB0aXRsZToiKQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgdGl0bGUgPSBhdHRyaWJ1dGVzLnJlbW92ZSgidGl0bGUiKSBhcyBTdHJpbmcNCisgICAgICAgIH0NCisgICAgICAgIFRpdGxlZEJvcmRlciBib3JkZXIgPSBuZXcgVGl0bGVkQm9yZGVyKHRpdGxlKQ0KKw0KKyAgICAgICAgZGVmIHBvc2l0aW9uID0gYXR0cmlidXRlcy5yZW1vdmUoInBvc2l0aW9uIikNCisgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25zW3Bvc2l0aW9uXSA/OiBwb3NpdGlvbg0KKyAgICAgICAgaWYgKHBvc2l0aW9uIGluc3RhbmNlb2YgSW50ZWdlcikgeyBib3JkZXIuc2V0VGl0bGVQb3NpdGlvbihwb3NpdGlvbikgfQ0KKw0KKyAgICAgICAgZGVmIGp1c3RpZmljYXRpb24gPSBhdHRyaWJ1dGVzLnJlbW92ZSgianVzdGlmaWNhdGlvbiIpDQorICAgICAgICBqdXN0aWZpY2F0aW9uID0gcG9zaXRpb25zW2p1c3RpZmljYXRpb25dID86IGp1c3RpZmljYXRpb24NCisgICAgICAgIGlmIChqdXN0aWZpY2F0aW9uIGluc3RhbmNlb2YgSW50ZWdlcikgeyBib3JkZXIuc2V0VGl0bGVKdXN0aWZpY2F0aW9uKGp1c3RpZmljYXRpb24pIH0NCisNCisgICAgICAgIEJvcmRlciBvdGhlckJvcmRlciA9IGF0dHJpYnV0ZXMucmVtb3ZlKCJib3JkZXIiKQ0KKyAgICAgICAgaWYgKG90aGVyQm9yZGVyICE9IG51bGwpIHsgYm9yZGVyLnNldEJvcmRlcihvdGhlckJvcmRlcikgfQ0KKw0KKyAgICAgICAgQ29sb3IgY29sb3IgPSBhdHRyaWJ1dGVzLnJlbW92ZSgiY29sb3IiKQ0KKyAgICAgICAgaWYgKGNvbG9yKSB7IGJvcmRlci5zZXRUaXRsZUNvbG9yKGNvbG9yKSB9DQorDQorICAgICAgICBGb250IGZvbnQgPSBhdHRyaWJ1dGVzLnJlbW92ZSgiZm9udCIpDQorICAgICAgICBpZiAoZm9udCkgeyBib3JkZXIuc2V0VGl0bGVGb250KGZvbnQpIH0NCisNCisgICAgICAgIHJldHVybiBib3JkZXINCisgICAgfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3N3aW5nL2ZhY3RvcnkvV2lkZ2V0RmFjdG9yeS5ncm9vdnkgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3N3aW5nL2ZhY3RvcnkvV2lkZ2V0RmFjdG9yeS5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBiZjVlZgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvZmFjdG9yeS9XaWRnZXRGYWN0b3J5Lmdyb292eQpAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBncm9vdnkuc3dpbmcuZmFjdG9yeQorCitpbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50CitpbXBvcnQgamF2YS5hd3QuV2luZG93CisKK3B1YmxpYyBjbGFzcyBXaWRnZXRGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RGYWN0b3J5IHsKKworICAgIGZpbmFsIENsYXNzIHJlc3RyaWN0ZWRUeXBlOworICAgIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIGxlYWYKKworICAgIHB1YmxpYyBXaWRnZXRGYWN0b3J5KENsYXNzIHJlc3RyaWN0ZWRUeXBlLCBib29sZWFuIGxlYWYpIHsKKyAgICAgICAgdGhpcy5yZXN0cmljdGVkVHlwZSA9IHJlc3RyaWN0ZWRUeXBlCisgICAgICAgIHRoaXMubGVhZiA9IGxlYWYKKyAgICB9CisKKyAgICBib29sZWFuIGlzTGVhZigpIHsKKyAgICAgICAgcmV0dXJuIGxlYWYKKyAgICB9CisgICAgCisgICAgcHVibGljIE9iamVjdCBuZXdJbnN0YW5jZShGYWN0b3J5QnVpbGRlclN1cHBvcnQgYnVpbGRlciwgT2JqZWN0IG5hbWUsIE9iamVjdCB2YWx1ZSwgTWFwIGF0dHJpYnV0ZXMpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHZhbHVlID0gYXR0cmlidXRlcy5yZW1vdmUobmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh2YWx1ZSAhPSBudWxsKSAmJiBGYWN0b3J5QnVpbGRlclN1cHBvcnQuY2hlY2tWYWx1ZUlzVHlwZSh2YWx1ZSwgbmFtZSwgcmVzdHJpY3RlZFR5cGUpKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiJG5hbWUgbXVzdCBoYXZlIGVpdGhlciBhIHZhbHVlIGFyZ3VtZW50IG9yIGFuIGF0dHJpYnV0ZSBuYW1lZCAkbmFtZSB0aGF0IG11c3QgYmUgb2YgdHlwZSAkcmVzdHJpY3RlZFR5cGUubmFtZSIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2hpbGQoRmFjdG9yeUJ1aWxkZXJTdXBwb3J0IGJ1aWxkZXIsIE9iamVjdCBwYXJlbnQsIE9iamVjdCBjaGlsZCkgeworICAgICAgICBpZiAoIShjaGlsZCBpbnN0YW5jZW9mIENvbXBvbmVudCkgfHwgKGNoaWxkIGluc3RhbmNlb2YgV2luZG93KSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBkZWYgY29uc3RyYWludHMgPSBidWlsZGVyLmNvbnRleHQuY29uc3RyYWludHMKKyAgICAgICAgICAgIGlmIChjb25zdHJhaW50cyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcGFyZW50LmFkZChjaGlsZCwgY29uc3RyYWludHMpCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBhcmVudC5hZGQoY2hpbGQpCisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKE1pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbiBtcGUpIHsKKyAgICAgICAgICAgIHBhcmVudC5hZGQoY2hpbGQpCisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvZmFjdG9yeS9XaW5kb3dGYWN0b3J5Lmdyb292eSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvZmFjdG9yeS9XaW5kb3dGYWN0b3J5Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTJlMTFkCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zd2luZy9mYWN0b3J5L1dpbmRvd0ZhY3RvcnkuZ3Jvb3Z5CkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGdyb292eS5zd2luZy5mYWN0b3J5CisKK2ltcG9ydCBqYXZhLmF3dC5EaWFsb2cKK2ltcG9ydCBqYXZhLmF3dC5GcmFtZQoraW1wb3J0IGphdmF4LnN3aW5nLkpXaW5kb3cKKworcHVibGljIGNsYXNzIFdpbmRvd0ZhY3RvcnkgZXh0ZW5kcyBSb290UGFuZUNvbnRhaW5lckZhY3RvcnkgeworICAgIAorICAgIHB1YmxpYyBPYmplY3QgbmV3SW5zdGFuY2UoRmFjdG9yeUJ1aWxkZXJTdXBwb3J0IGJ1aWxkZXIsIE9iamVjdCBuYW1lLCBPYmplY3QgdmFsdWUsIE1hcCBhdHRyaWJ1dGVzKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7CisgICAgICAgIEpXaW5kb3cgd2luZG93OworICAgICAgICBpZiAoRmFjdG9yeUJ1aWxkZXJTdXBwb3J0LmNoZWNrVmFsdWVJc1R5cGUodmFsdWUsIG5hbWUsIEpXaW5kb3cuY2xhc3MpKSB7CisgICAgICAgICAgICB3aW5kb3cgPSB2YWx1ZQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTGlua2VkTGlzdCBjb250YWluaW5nV2luZG93cyA9IGJ1aWxkZXIuY29udGFpbmluZ1dpbmRvd3M7CisgICAgICAgICAgICBPYmplY3Qgb3duZXIgPSBhdHRyaWJ1dGVzLnJlbW92ZSgib3duZXIiKTsKKyAgICAgICAgICAgIC8vIGlmIG93bmVyIG5vdCBleHBsaWNpdCwgdXNlIHRoZSBsYXN0IHdpbmRvdyB0eXBlIGluIHRoZSBsaXN0CisgICAgICAgICAgICBpZiAoKG93bmVyID09IG51bGwpICYmICFjb250YWluaW5nV2luZG93cy5lbXB0eSkgeworICAgICAgICAgICAgICAgIG93bmVyID0gY29udGFpbmluZ1dpbmRvd3MubGFzdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvd25lcikgeworICAgICAgICAgICAgICAgIC8vIHRoZSBqb3lzIG9mIHRoZSBNT1AhCisgICAgICAgICAgICAgICAgd2luZG93ID0gbmV3IEpXaW5kb3cob3duZXIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB3aW5kb3cgPSBuZXcgSldpbmRvdygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaGFuZGxlUm9vdFBhbmVUYXNrcyhidWlsZGVyLCB3aW5kb3csIGF0dHJpYnV0ZXMpCisKKyAgICAgICAgcmV0dXJuIHdpbmRvdzsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvZmFjdG9yeS9wYWNrYWdlLmh0bWwgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3N3aW5nL2ZhY3RvcnkvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MTA2ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3N3aW5nL2ZhY3RvcnkvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsMTAgQEAKKzxodG1sPgorICA8aGVhZD4KKyAgICA8dGl0bGU+cGFja2FnZSBncm9vdnkuc3dpbmcuZmFjdG9yeS4qPC90aXRsZT4KKyAgPC9oZWFkPgorICA8Ym9keT4KKyAgICA8cD4KKyAgICAgIFN3aW5nQnVpbGRlciBoZWxwZXIgY2xhc3NlcyBmb3IgY3JlYXRpbmcgY29tcG9uZW50cworICAgIDwvcD4KKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zd2luZy9pbXBsL0NvbXBvbmVudEZhY2FkZS5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zd2luZy9pbXBsL0NvbXBvbmVudEZhY2FkZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNzVhNjkKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3N3aW5nL2ltcGwvQ29tcG9uZW50RmFjYWRlLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGdyb292eS5zd2luZy5pbXBsOworCitpbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OworCisvKiogCisgKiBBIGZhY2FkZSB0byBhbiBvYmplY3Qgd2hpY2ggY29udGFpbnMgYSBjb21wb25lbnQuCisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGludGVyZmFjZSBDb21wb25lbnRGYWNhZGUgeworICAgIENvbXBvbmVudCBnZXRDb21wb25lbnQoKTsKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvaW1wbC9Db250YWluZXJGYWNhZGUuamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvaW1wbC9Db250YWluZXJGYWNhZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2M0NmUxCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zd2luZy9pbXBsL0NvbnRhaW5lckZhY2FkZS5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBncm9vdnkuc3dpbmcuaW1wbDsKKworaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudDsKKworLyoqIAorICogQSBmYWNhZGUgdG8gYW4gb2JqZWN0IHRvIHdoaWNoIGNvbXBvbmVudHMgY2FuIGJlIGFkZGVkLgorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQ29udGFpbmVyRmFjYWRlIHsKKyAgICB2b2lkIGFkZENvbXBvbmVudChDb21wb25lbnQgY29tcG9uZW50KTsKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvaW1wbC9EZWZhdWx0QWN0aW9uLmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3N3aW5nL2ltcGwvRGVmYXVsdEFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NDU0ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3N3aW5nL2ltcGwvRGVmYXVsdEFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBncm9vdnkuc3dpbmcuaW1wbDsKKworaW1wb3J0IGdyb292eS5sYW5nLkNsb3N1cmU7CisKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKKworaW1wb3J0IGphdmF4LnN3aW5nLkFic3RyYWN0QWN0aW9uOworCisvKiogCisgKiBBIGRlZmF1bHQgYWN0aW9uIGltcGxlbWVudGF0aW9uCisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIERlZmF1bHRBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdEFjdGlvbiB7CisKKyAgICBwcml2YXRlIENsb3N1cmUgY2xvc3VyZTsKKworICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgeworICAgICAgICBpZiAoY2xvc3VyZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIk5vIGNsb3N1cmUgaGFzIGJlZW4gY29uZmlndXJlZCBmb3IgdGhpcyBBY3Rpb24iKTsKKyAgICAgICAgfQorICAgICAgICBjbG9zdXJlLmNhbGwoZXZlbnQpOworICAgIH0KKworICAgIHB1YmxpYyBDbG9zdXJlIGdldENsb3N1cmUoKSB7CisgICAgICAgIHJldHVybiBjbG9zdXJlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENsb3N1cmUoQ2xvc3VyZSBjbG9zdXJlKSB7CisgICAgICAgIHRoaXMuY2xvc3VyZSA9IGNsb3N1cmU7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3N3aW5nL2ltcGwvU3RhcnRhYmxlLmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3N3aW5nL2ltcGwvU3RhcnRhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNjOTBhMQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvaW1wbC9TdGFydGFibGUuamF2YQpAQCAtMCwwICsxLDI2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgZ3Jvb3Z5LnN3aW5nLmltcGw7CisKKy8qKiAKKyAqIEEgc2ltcGxlIGxpZmVjeWNsZSBtZXRob2QgY2FsbGVkIHdoZW4gYW4gb2JqZWN0IGlzIGZ1bGx5IGNvbnN0cnVjdGVkLgorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU3RhcnRhYmxlIHsKKyAgICB2b2lkIHN0YXJ0KCk7Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3N3aW5nL2ltcGwvVGFibGVMYXlvdXQuamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvaW1wbC9UYWJsZUxheW91dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NDMwYjIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3N3aW5nL2ltcGwvVGFibGVMYXlvdXQuamF2YQpAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgZ3Jvb3Z5LnN3aW5nLmltcGw7CisKK2ltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7CitpbXBvcnQgamF2YS5hd3QuR3JpZEJhZ0NvbnN0cmFpbnRzOworaW1wb3J0IGphdmEuYXd0LkdyaWRCYWdMYXlvdXQ7CitpbXBvcnQgamF2YS5hd3QuSW5zZXRzOworaW1wb3J0IGphdmEuYXd0LkxheW91dE1hbmFnZXI7CisKK2ltcG9ydCBqYXZheC5zd2luZy5KUGFuZWw7CisKKy8qKiAKKyAqIFJlcHJlc2VudHMgYSBIVE1MIHN0eWxlIHRhYmxlIGxheW91dAorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBUYWJsZUxheW91dCBpbXBsZW1lbnRzIENvbXBvbmVudEZhY2FkZSB7CisKKyAgICBwcml2YXRlIEpQYW5lbCBwYW5lbCA9IG5ldyBKUGFuZWwoKTsKKyAgICBwcml2YXRlIGludCByb3dDb3VudDsKKyAgICBwcml2YXRlIGludCBjZWxscGFkZGluZzsKKworICAgIHB1YmxpYyBUYWJsZUxheW91dCgpIHsKKyAgICAgICAgcGFuZWwuc2V0TGF5b3V0KGNyZWF0ZUxheW91dE1hbmFnZXIoKSk7CisgICAgfQorCisgICAgcHVibGljIENvbXBvbmVudCBnZXRDb21wb25lbnQoKSB7CisgICAgICAgIHJldHVybiBwYW5lbDsKKyAgICB9CisgICAgCisgICAgcHVibGljIGludCBnZXRDZWxscGFkZGluZygpIHsKKyAgICAgICAgcmV0dXJuIGNlbGxwYWRkaW5nOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENlbGxwYWRkaW5nKGludCBjZWxscGFkZGluZykgeworICAgICAgICB0aGlzLmNlbGxwYWRkaW5nID0gY2VsbHBhZGRpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIG5ldyBjZWxsIHRvIHRoZSBjdXJyZW50IGdyaWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDZWxsKFRhYmxlTGF5b3V0Q2VsbCBjZWxsKSB7CisgICAgICAgIEdyaWRCYWdDb25zdHJhaW50cyBjb25zdHJhaW50cyA9IGNlbGwuZ2V0Q29uc3RyYWludHMoKTsKKyAgICAgICAgY29uc3RyYWludHMuaW5zZXRzID0gbmV3IEluc2V0cyhjZWxscGFkZGluZywgY2VsbHBhZGRpbmcsIGNlbGxwYWRkaW5nLCBjZWxscGFkZGluZyk7CisgICAgICAgIHBhbmVsLmFkZChjZWxsLmdldENvbXBvbmVudCgpLCBjb25zdHJhaW50cyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyByb3cgaW5kZXggZm9yIGNoaWxkIDx0cj4gdGFncyAKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IG5leHRSb3dJbmRleCgpIHsKKyAgICAgICAgcmV0dXJuIHJvd0NvdW50Kys7CisgICAgfQorCisgICAgLy8gSW1wbGVtZW50YXRpb24gbWV0aG9kcworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgR3JpZEJhZ0xheW91dAorICAgICAqLworICAgIHByb3RlY3RlZCBMYXlvdXRNYW5hZ2VyIGNyZWF0ZUxheW91dE1hbmFnZXIoKSB7CisgICAgICAgIHJldHVybiBuZXcgR3JpZEJhZ0xheW91dCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvaW1wbC9UYWJsZUxheW91dENlbGwuamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvaW1wbC9UYWJsZUxheW91dENlbGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWM5YWU3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zd2luZy9pbXBsL1RhYmxlTGF5b3V0Q2VsbC5qYXZhCkBAIC0wLDAgKzEsMjEwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgZ3Jvb3Z5LnN3aW5nLmltcGw7CisKK2ltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7CitpbXBvcnQgamF2YS5hd3QuR3JpZEJhZ0NvbnN0cmFpbnRzOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLyoqIAorICogUmVwcmVzZW50cyBhIGNlbGwgaW4gYSB0YWJsZSBsYXlvdXQuCisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIFRhYmxlTGF5b3V0Q2VsbCBpbXBsZW1lbnRzIENvbnRhaW5lckZhY2FkZSB7CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKFRhYmxlTGF5b3V0Q2VsbC5jbGFzcy5nZXROYW1lKCkpOworICAgIAorICAgIHByaXZhdGUgVGFibGVMYXlvdXRSb3cgcGFyZW50OworICAgIHByaXZhdGUgQ29tcG9uZW50IGNvbXBvbmVudDsKKyAgICBwcml2YXRlIEdyaWRCYWdDb25zdHJhaW50cyBjb25zdHJhaW50czsKKyAgICBwcml2YXRlIFN0cmluZyBhbGlnbjsKKyAgICBwcml2YXRlIFN0cmluZyB2YWxpZ247CisKKyAgICBwdWJsaWMgaW50IGdldENvbHNwYW4oKSB7CisgICAgICAgIHJldHVybiBjb2xzcGFuOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0Um93c3BhbigpIHsKKyAgICAgICAgcmV0dXJuIHJvd3NwYW47CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgY29sc3BhbiA9IDE7CisgICAgcHJpdmF0ZSBpbnQgcm93c3BhbiA9IDE7CisgICAgcHJpdmF0ZSBib29sZWFuIGNvbGZpbGw7CisgICAgcHJpdmF0ZSBib29sZWFuIHJvd2ZpbGw7CisKKyAgICAgICAgCisgICAgcHVibGljIFRhYmxlTGF5b3V0Q2VsbChUYWJsZUxheW91dFJvdyBwYXJlbnQpIHsKKyAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkQ29tcG9uZW50KENvbXBvbmVudCBjb21wb25lbnQpICB7CisgICAgICAgIGlmICh0aGlzLmNvbXBvbmVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJUaGlzIHRkIGNlbGwgYWxyZWFkeSBoYXMgYSBjb21wb25lbnQ6ICIgKyBjb21wb25lbnQpOworICAgICAgICB9CisgICAgICAgIHRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50OworICAgICAgICBwYXJlbnQuYWRkQ2VsbCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIENvbXBvbmVudCBnZXRDb21wb25lbnQoKSB7CisgICAgICAgIHJldHVybiBjb21wb25lbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgaG9yaXpvbnRhbCBhbGlnbm1lbnQgdG8gYSBjYXNlIGluc2Vuc2l0aXZlIHZhbHVlIG9mIHtMRUZULCBDRU5URVIsIFJJR0hUfQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFsaWduKFN0cmluZyBhbGlnbikgeworICAgICAgICB0aGlzLmFsaWduID0gYWxpZ247CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdmVydGljYWwgYWxpZ25tZW50IHRvIGEgY2FzZSBpbnNlbnNpdGl2ZSB2YWx1ZSBvZiB7VE9QLCBNSURETEUsIEJPVFRPTX0KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZ24oU3RyaW5nIHZhbGlnbikgeworICAgICAgICB0aGlzLnZhbGlnbiA9IHZhbGlnbjsKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBudW1iZXIgb2YgY29sdW1ucyB0aGF0IHRoaXMgY2VsbCBzaG91bGQgc3Bhbi4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbHNwYW4oaW50IGNvbHNwYW4pIHsKKyAgICAgICAgdGhpcy5jb2xzcGFuID0gY29sc3BhbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBudW1iZXIgb2Ygcm93cyB0aGF0IHRoaXMgY2VsbCBzaG91bGQgc3Bhbi4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJvd3NwYW4oaW50IHJvd3NwYW4pIHsKKyAgICAgICAgdGhpcy5yb3dzcGFuID0gcm93c3BhbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjb2xmaWxsLgorICAgICAqIEByZXR1cm4gYm9vbGVhbgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQ29sZmlsbCgpIHsKKyAgICAgICAgcmV0dXJuIGNvbGZpbGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcm93ZmlsbC4KKyAgICAgKiBAcmV0dXJuIGJvb2xlYW4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Jvd2ZpbGwoKSB7CisgICAgICAgIHJldHVybiByb3dmaWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciBvciBub3QgdGhpcyBjb2x1bW4gc2hvdWxkIGFsbG93IGl0cyBjb21wb25lbnQgdG8gc3RyZXRjaCB0byBmaWxsIHRoZSBzcGFjZSBhdmFpbGFibGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb2xmaWxsKGJvb2xlYW4gY29sZmlsbCkgeworICAgICAgICB0aGlzLmNvbGZpbGwgPSBjb2xmaWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciBvciBub3QgdGhpcyByb3cgc2hvdWxkIGFsbG93IGl0cyBjb21wb25lbnQgdG8gc3RyZXRjaCB0byBmaWxsIHRoZSBzcGFjZSBhdmFpbGFibGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSb3dmaWxsKGJvb2xlYW4gcm93ZmlsbCkgeworICAgICAgICB0aGlzLnJvd2ZpbGwgPSByb3dmaWxsOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgY29uc3RyYWludHMgb2YgdGhpcyBjZWxsCisgICAgICovCisgICAgcHVibGljIEdyaWRCYWdDb25zdHJhaW50cyBnZXRDb25zdHJhaW50cygpIHsKKyAgICAgICAgaWYgKGNvbnN0cmFpbnRzID09IG51bGwpIHsKKyAgICAgICAgICAgIGNvbnN0cmFpbnRzID0gY3JlYXRlQ29uc3RyYWludHMoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29uc3RyYWludHM7CisgICAgfQorICAgIAorICAgIC8vIEltcGxlbWVudGF0aW9uIG1ldGhvZHMKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgIAorICAgIAorICAgIHByb3RlY3RlZCBHcmlkQmFnQ29uc3RyYWludHMgY3JlYXRlQ29uc3RyYWludHMoKSB7CisgICAgICAgIEdyaWRCYWdDb25zdHJhaW50cyBhbnN3ZXIgPSBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKCk7CisgICAgICAgIGFuc3dlci5hbmNob3IgPSBnZXRBbmNob3IoKTsKKyAgICAgICAgaWYgKGNvbHNwYW4gPCAxKSB7CisgICAgICAgICAgICBjb2xzcGFuID0gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAocm93c3BhbiA8IDEpIHsKKyAgICAgICAgICAgIHJvd3NwYW4gPSAxOworICAgICAgICB9CisgICAgICAgIGlmIChpc0NvbGZpbGwoKSkgIHsKKyAgICAgICAgICAgIGFuc3dlci5maWxsID0gaXNSb3dmaWxsKCkKKyAgICAgICAgICAgICAgICA/IEdyaWRCYWdDb25zdHJhaW50cy5CT1RIIAorICAgICAgICAgICAgICAgIDogR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBhbnN3ZXIuZmlsbCA9IGlzUm93ZmlsbCgpCisgICAgICAgICAgICAgICAgPyBHcmlkQmFnQ29uc3RyYWludHMuVkVSVElDQUwgCisgICAgICAgICAgICAgICAgOiBHcmlkQmFnQ29uc3RyYWludHMuTk9ORTsKKyAgICAgICAgfQorICAgICAgICBhbnN3ZXIud2VpZ2h0eCA9IDAuMjsKKyAgICAgICAgYW5zd2VyLndlaWdodHkgPSAwOworICAgICAgICBhbnN3ZXIuZ3JpZHdpZHRoID0gY29sc3BhbjsKKyAgICAgICAgYW5zd2VyLmdyaWRoZWlnaHQgPSByb3dzcGFuOworICAgICAgICByZXR1cm4gYW5zd2VyOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBHcmlkQmFnQ29uc3RyYWludHMgZW51bWVyYXRpb24gZm9yIGFuY2hvcgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgZ2V0QW5jaG9yKCkgeworICAgICAgICBib29sZWFuIGlzVG9wID0gInRvcCIuZXF1YWxzSWdub3JlQ2FzZSh2YWxpZ24pOworICAgICAgICBib29sZWFuIGlzQm90dG9tID0gImJvdHRvbSIuZXF1YWxzSWdub3JlQ2FzZSh2YWxpZ24pOworICAgICAgICAKKyAgICAgICAgaWYgKCJjZW50ZXIiLmVxdWFsc0lnbm9yZUNhc2UoYWxpZ24pKSB7CisgICAgICAgICAgICBpZiAoaXNUb3ApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR3JpZEJhZ0NvbnN0cmFpbnRzLk5PUlRIOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoaXNCb3R0b20pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gR3JpZEJhZ0NvbnN0cmFpbnRzLlNPVVRIOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdyaWRCYWdDb25zdHJhaW50cy5DRU5URVI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoInJpZ2h0Ii5lcXVhbHNJZ25vcmVDYXNlKGFsaWduKSkgeworICAgICAgICAgICAgaWYgKGlzVG9wKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdyaWRCYWdDb25zdHJhaW50cy5OT1JUSEVBU1Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChpc0JvdHRvbSkgeworICAgICAgICAgICAgICAgIHJldHVybiBHcmlkQmFnQ29uc3RyYWludHMuU09VVEhFQVNUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdyaWRCYWdDb25zdHJhaW50cy5FQVNUOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLy8gZGVmYXVsdHMgdG8gbGVmdAorICAgICAgICAgICAgaWYgKGlzVG9wKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdyaWRCYWdDb25zdHJhaW50cy5OT1JUSFdFU1Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChpc0JvdHRvbSkgeworICAgICAgICAgICAgICAgIHJldHVybiBHcmlkQmFnQ29uc3RyYWludHMuU09VVEhXRVNUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zd2luZy9pbXBsL1RhYmxlTGF5b3V0Um93LmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3N3aW5nL2ltcGwvVGFibGVMYXlvdXRSb3cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGNiZjU3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zd2luZy9pbXBsL1RhYmxlTGF5b3V0Um93LmphdmEKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGdyb292eS5zd2luZy5pbXBsOworCitpbXBvcnQgamF2YS5hd3QuR3JpZEJhZ0NvbnN0cmFpbnRzOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKiogCisgKiBSZXByZXNlbnRzIGEgcm93IGluIGEgdGFibGUgbGF5b3V0CisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIFRhYmxlTGF5b3V0Um93IGltcGxlbWVudHMgU3RhcnRhYmxlIHsKKworICAgIHByaXZhdGUgZmluYWwgVGFibGVMYXlvdXQgcGFyZW50OworICAgIHByaXZhdGUgZmluYWwgTGlzdCBjZWxscyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICBwcml2YXRlIGludCByb3dJbmRleDsKKyAgICAKKyAgICBwdWJsaWMgVGFibGVMYXlvdXRSb3coVGFibGVMYXlvdXQgdGFibGVMYXlvdXRUYWcpIHsKKyAgICAgICAgdGhpcy5wYXJlbnQgPSB0YWJsZUxheW91dFRhZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgbmV3IGNlbGwgdG8gdGhpcyByb3cKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDZWxsKFRhYmxlTGF5b3V0Q2VsbCB0YWcpIHsKKyAgICAgICAgaW50IGdyaWR4ID0gMDsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gY2VsbHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkgeworICAgICAgICAgICAgVGFibGVMYXlvdXRDZWxsIGNlbGwgPSAoVGFibGVMYXlvdXRDZWxsKSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIGdyaWR4ICs9IGNlbGwuZ2V0Q29sc3BhbigpOworICAgICAgICB9CisgICAgICAgIHRhZy5nZXRDb25zdHJhaW50cygpLmdyaWR4ID0gZ3JpZHg7CisgICAgICAgIGNlbGxzLmFkZCh0YWcpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKKyAgICAgICAgcm93SW5kZXggPSBwYXJlbnQubmV4dFJvd0luZGV4KCk7CisKKyAgICAgICAgLy8gaXRlcmF0ZSB0aHJvdWdoIHRoZSByb3dzIGFuZCBhZGQgZWFjaCBvbmUgdG8gdGhlIGxheW91dC4uLgorICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjZWxscy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKSB7CisgICAgICAgICAgICBUYWJsZUxheW91dENlbGwgY2VsbCA9IChUYWJsZUxheW91dENlbGwpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgR3JpZEJhZ0NvbnN0cmFpbnRzIGMgPSBjZWxsLmdldENvbnN0cmFpbnRzKCk7CisgICAgICAgICAgICBjLmdyaWR5ID0gcm93SW5kZXg7CisgICAgICAgICAgICAvLyBhZGQgdGhlIGNlbGwgdG8gdGhlIHRhYmxlCisgICAgICAgICAgICBwYXJlbnQuYWRkQ2VsbChjZWxsKTsKKyAgICAgICAgfSAgICAgICAgCisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgcm93IGluZGV4IG9mIHRoaXMgcm93CisgICAgICovCisgICAgcHVibGljIGludCBnZXRSb3dJbmRleCgpIHsKKyAgICAgICAgcmV0dXJuIHJvd0luZGV4OworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9zd2luZy9pbXBsL3BhY2thZ2UuaHRtbCBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvaW1wbC9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk3ZGY3ZgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvaW1wbC9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSwxMCBAQAorPGh0bWw+CisgIDxoZWFkPgorICAgIDx0aXRsZT5wYWNrYWdlIGdyb292eS5zd2luZy5pbXBsLio8L3RpdGxlPgorICA8L2hlYWQ+CisgIDxib2R5PgorICAgIDxwPgorICAgICAgSW1wbGVtZW50YXRpb24gY2xhc3NlcyBmb3IgU3dpbmdCdWlsZGVyCisgICAgPC9wPgorICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3N3aW5nL3BhY2thZ2UuaHRtbCBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvc3dpbmcvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MTc2NmYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3N3aW5nL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDEwIEBACis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPHRpdGxlPnBhY2thZ2UgZ3Jvb3Z5LnN3aW5nLio8L3RpdGxlPgorICA8L2hlYWQ+CisgIDxib2R5PgorICAgIDxwPgorICAgICAgQSBHcm9vdnlNYXJrdXAgYnVpbGRlciBmb3IgY3JlYXRpbmcgU3dpbmcgdXNlciBpbnRlcmZhY2VzCisgICAgPC9wPgorICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3RleHQvR1N0cmluZ1RlbXBsYXRlRW5naW5lLmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3RleHQvR1N0cmluZ1RlbXBsYXRlRW5naW5lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJmNjBlNwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdGV4dC9HU3RyaW5nVGVtcGxhdGVFbmdpbmUuamF2YQpAQCAtMCwwICsxLDIyMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGdyb292eS50ZXh0OworCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuQ2xvc3VyZTsKK2ltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlDbGFzc0xvYWRlcjsKK2ltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlDb2RlU291cmNlOworaW1wb3J0IGdyb292eS5sYW5nLkdyb292eU9iamVjdDsKK2ltcG9ydCBncm9vdnkubGFuZy5Xcml0YWJsZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLkNvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uOworCisvKioKKyAqIEBhdXRob3IgdHVnQHdpbHNvbi5jby51aworICogQGF1dGhvciBQYXVsIEtpbmcKKyAqLworcHVibGljIGNsYXNzIEdTdHJpbmdUZW1wbGF0ZUVuZ2luZSBleHRlbmRzIFRlbXBsYXRlRW5naW5lIHsKKyAgICBwcml2YXRlIGZpbmFsIENsYXNzTG9hZGVyIHBhcmVudExvYWRlcjsKKworICAgIHB1YmxpYyBHU3RyaW5nVGVtcGxhdGVFbmdpbmUoKSB7CisgICAgICAgIHRoaXMoR1N0cmluZ1RlbXBsYXRlLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOworICAgIH0KKworICAgIHB1YmxpYyBHU3RyaW5nVGVtcGxhdGVFbmdpbmUoQ2xhc3NMb2FkZXIgcGFyZW50TG9hZGVyKSB7CisgICAgICAgIHRoaXMucGFyZW50TG9hZGVyID0gcGFyZW50TG9hZGVyOworICAgIH0KKworICAgIC8qIChub24tSmF2YWRvYykKKyAgICAqIEBzZWUgZ3Jvb3Z5LnRleHQuVGVtcGxhdGVFbmdpbmUjY3JlYXRlVGVtcGxhdGUoamF2YS5pby5SZWFkZXIpCisgICAgKi8KKyAgICBwdWJsaWMgVGVtcGxhdGUgY3JlYXRlVGVtcGxhdGUoZmluYWwgUmVhZGVyIHJlYWRlcikgdGhyb3dzIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgR1N0cmluZ1RlbXBsYXRlKHJlYWRlciwgcGFyZW50TG9hZGVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBHU3RyaW5nVGVtcGxhdGUgaW1wbGVtZW50cyBUZW1wbGF0ZSB7CisgICAgICAgIGZpbmFsIENsb3N1cmUgdGVtcGxhdGU7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFR1cm4gdGhlIHRlbXBsYXRlIGludG8gYSB3cml0YWJsZSBDbG9zdXJlCisgICAgICAgICAqIFdoZW4gZXhlY3V0ZWQgdGhlIGNsb3N1cmUgZXZhbHVhdGVzIGFsbCB0aGUgY29kZSBlbWJlZGRlZCBpbiB0aGUKKyAgICAgICAgICogdGVtcGxhdGUgYW5kIHRoZW4gd3JpdGVzIGEgR1N0cmluZyBjb250YWluaW5nIHRoZSBmaXhlZCBhbmQgdmFyaWFibGUgaXRlbXMKKyAgICAgICAgICogdG8gdGhlIHdyaXRlciBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIKKyAgICAgICAgICogPHAvPgorICAgICAgICAgKiBGb3IgZXhhbXBsZToKKyAgICAgICAgICogPHAvPgorICAgICAgICAgKiAnPCU9ICJ0ZXN0IiAlPiBvZiBleHByIGFuZCA8JSB0ZXN0ID0gMSAlPiR7dGVzdH0gc2NyaXB0LicKKyAgICAgICAgICogPHAvPgorICAgICAgICAgKiB3b3VsZCBjb21waWxlIGludG86CisgICAgICAgICAqIDxwLz4KKyAgICAgICAgICogeyBvdXQgLT4gb3V0IDw8ICIkeyJ0ZXN0In0gb2YgZXhwciBhbmQgIjsgdGVzdCA9IDEgOyBvdXQgPDwgIiR7dGVzdH0gc2NyaXB0LiJ9LmFzV3JpdGFibGUoKQorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcmVhZGVyCisgICAgICAgICAqIEBwYXJhbSBwYXJlbnRMb2FkZXIKKyAgICAgICAgICogQHRocm93cyBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbgorICAgICAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KKyAgICAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICAgKi8KKyAgICAgICAgR1N0cmluZ1RlbXBsYXRlKGZpbmFsIFJlYWRlciByZWFkZXIsIGZpbmFsIENsYXNzTG9hZGVyIHBhcmVudExvYWRlcikgdGhyb3dzIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWZmZXIgdGVtcGxhdGVFeHByZXNzaW9ucyA9IG5ldyBTdHJpbmdCdWZmZXIoInBhY2thZ2UgZ3Jvb3Z5LnRtcC50ZW1wbGF0ZXNcbiBkZWYgZ2V0VGVtcGxhdGUoKSB7IHJldHVybiB7IG91dCAtPiBkZWxlZ2F0ZSA9IG5ldyBCaW5kaW5nKGRlbGVnYXRlKTsgb3V0IDw8IFwiXCJcIiIpOworICAgICAgICAgICAgYm9vbGVhbiB3cml0aW5nU3RyaW5nID0gdHJ1ZTsKKworICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICBpbnQgYyA9IHJlYWRlci5yZWFkKCk7CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gLTEpIGJyZWFrOworICAgICAgICAgICAgICAgIGlmIChjID09ICc8JykgeworICAgICAgICAgICAgICAgICAgICBjID0gcmVhZGVyLnJlYWQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gJyUnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gcmVhZGVyLnJlYWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjID09ICc9JykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlRXhwcmVzc2lvbihyZWFkZXIsIHdyaXRpbmdTdHJpbmcsIHRlbXBsYXRlRXhwcmVzc2lvbnMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRpbmdTdHJpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZVNlY3Rpb24oYywgcmVhZGVyLCB3cml0aW5nU3RyaW5nLCB0ZW1wbGF0ZUV4cHJlc3Npb25zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0aW5nU3RyaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRDaGFyYWN0ZXIoJzwnLCB0ZW1wbGF0ZUV4cHJlc3Npb25zLCB3cml0aW5nU3RyaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRpbmdTdHJpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICciJykgeworICAgICAgICAgICAgICAgICAgICBhcHBlbmRDaGFyYWN0ZXIoJ1xcJywgdGVtcGxhdGVFeHByZXNzaW9ucywgd3JpdGluZ1N0cmluZyk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRpbmdTdHJpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhcHBlbmRDaGFyYWN0ZXIoKGNoYXIpIGMsIHRlbXBsYXRlRXhwcmVzc2lvbnMsIHdyaXRpbmdTdHJpbmcpOworICAgICAgICAgICAgICAgIHdyaXRpbmdTdHJpbmcgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAod3JpdGluZ1N0cmluZykgeworICAgICAgICAgICAgICAgIHRlbXBsYXRlRXhwcmVzc2lvbnMuYXBwZW5kKCJcIlwiXCIiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGVtcGxhdGVFeHByZXNzaW9ucy5hcHBlbmQoIn0uYXNXcml0YWJsZSgpfSIpOworCisgICAgICAgICAgICBmaW5hbCBHcm9vdnlDbGFzc0xvYWRlciBsb2FkZXIgPQorICAgICAgICAgICAgICAgICAgICAoR3Jvb3Z5Q2xhc3NMb2FkZXIpIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBHcm9vdnlDbGFzc0xvYWRlcihwYXJlbnRMb2FkZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGZpbmFsIENsYXNzIGdyb292eUNsYXNzID0gbG9hZGVyLnBhcnNlQ2xhc3MobmV3IEdyb292eUNvZGVTb3VyY2UodGVtcGxhdGVFeHByZXNzaW9ucy50b1N0cmluZygpLCAiQyIsICJ4IikpOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZpbmFsIEdyb292eU9iamVjdCBvYmplY3QgPSAoR3Jvb3Z5T2JqZWN0KSBncm9vdnlDbGFzcy5uZXdJbnN0YW5jZSgpOworCisgICAgICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZSA9IChDbG9zdXJlKSBvYmplY3QuaW52b2tlTWV0aG9kKCJnZXRUZW1wbGF0ZSIsIG51bGwpOworICAgICAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhcHBlbmRDaGFyYWN0ZXIoZmluYWwgY2hhciBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWZmZXIgdGVtcGxhdGVFeHByZXNzaW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiB3cml0aW5nU3RyaW5nKSB7CisgICAgICAgICAgICBpZiAoIXdyaXRpbmdTdHJpbmcpIHsKKyAgICAgICAgICAgICAgICB0ZW1wbGF0ZUV4cHJlc3Npb25zLmFwcGVuZCgib3V0IDw8IFwiXCJcIiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGVtcGxhdGVFeHByZXNzaW9ucy5hcHBlbmQoYyk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUGFyc2UgYSA8JSAuLi4uICU+IHNlY3Rpb24KKyAgICAgICAgICogaWYgd2UgYXJlIHdyaXRpbmcgYSBHU3RyaW5nIGNsb3NlIGFuZCBhcHBlbmQgJzsnCisgICAgICAgICAqIHRoZW4gd3JpdGUgdGhlIHNlY3Rpb24gYXMgYSBzdGF0ZW1lbnQKKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHBlbmRpbmdDCisgICAgICAgICAqIEBwYXJhbSByZWFkZXIKKyAgICAgICAgICogQHBhcmFtIHdyaXRpbmdTdHJpbmcKKyAgICAgICAgICogQHBhcmFtIHRlbXBsYXRlRXhwcmVzc2lvbnMKKyAgICAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwYXJzZVNlY3Rpb24oZmluYWwgaW50IHBlbmRpbmdDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZWFkZXIgcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHdyaXRpbmdTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZ0J1ZmZlciB0ZW1wbGF0ZUV4cHJlc3Npb25zKQorICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAod3JpdGluZ1N0cmluZykgeworICAgICAgICAgICAgICAgIHRlbXBsYXRlRXhwcmVzc2lvbnMuYXBwZW5kKCJcIlwiXCI7ICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGVtcGxhdGVFeHByZXNzaW9ucy5hcHBlbmQoKGNoYXIpIHBlbmRpbmdDKTsKKworICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICBpbnQgYyA9IHJlYWRlci5yZWFkKCk7CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gLTEpIGJyZWFrOworICAgICAgICAgICAgICAgIGlmIChjID09ICclJykgeworICAgICAgICAgICAgICAgICAgICBjID0gcmVhZGVyLnJlYWQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gJz4nKSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVFeHByZXNzaW9ucy5hcHBlbmQoJyUnKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGVtcGxhdGVFeHByZXNzaW9ucy5hcHBlbmQoKGNoYXIpIGMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0ZW1wbGF0ZUV4cHJlc3Npb25zLmFwcGVuZCgiO1xuICIpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFBhcnNlIGEgPCU9IC4uLi4gJT4gZXhwcmVzc2lvbgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcmVhZGVyCisgICAgICAgICAqIEBwYXJhbSB3cml0aW5nU3RyaW5nCisgICAgICAgICAqIEBwYXJhbSB0ZW1wbGF0ZUV4cHJlc3Npb25zCisgICAgICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcGFyc2VFeHByZXNzaW9uKGZpbmFsIFJlYWRlciByZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gd3JpdGluZ1N0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVmZmVyIHRlbXBsYXRlRXhwcmVzc2lvbnMpCisgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmICghd3JpdGluZ1N0cmluZykgeworICAgICAgICAgICAgICAgIHRlbXBsYXRlRXhwcmVzc2lvbnMuYXBwZW5kKCJvdXQgPDwgXCJcIlwiIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRlbXBsYXRlRXhwcmVzc2lvbnMuYXBwZW5kKCIkeyIpOworCisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIGludCBjID0gcmVhZGVyLnJlYWQoKTsKKyAgICAgICAgICAgICAgICBpZiAoYyA9PSAtMSkgYnJlYWs7CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gJyUnKSB7CisgICAgICAgICAgICAgICAgICAgIGMgPSByZWFkZXIucmVhZCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSAnPicpIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZUV4cHJlc3Npb25zLmFwcGVuZCgnJScpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0ZW1wbGF0ZUV4cHJlc3Npb25zLmFwcGVuZCgoY2hhcikgYyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRlbXBsYXRlRXhwcmVzc2lvbnMuYXBwZW5kKCd9Jyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgV3JpdGFibGUgbWFrZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtYWtlKG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFdyaXRhYmxlIG1ha2UoZmluYWwgTWFwIG1hcCkgeworICAgICAgICAgICAgZmluYWwgQ2xvc3VyZSB0ZW1wbGF0ZSA9IChDbG9zdXJlKSB0aGlzLnRlbXBsYXRlLmNsb25lKCk7CisgICAgICAgICAgICB0ZW1wbGF0ZS5zZXREZWxlZ2F0ZShtYXApOworICAgICAgICAgICAgcmV0dXJuIChXcml0YWJsZSkgdGVtcGxhdGU7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3RleHQvU2ltcGxlVGVtcGxhdGVFbmdpbmUuamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdGV4dC9TaW1wbGVUZW1wbGF0ZUVuZ2luZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NGRiMzMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3RleHQvU2ltcGxlVGVtcGxhdGVFbmdpbmUuamF2YQpAQCAtMCwwICsxLDI1MCBAQAorLyoKKyAqICRJZCQKKyAqCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBncm9vdnkudGV4dDsKKworaW1wb3J0IGdyb292eS5sYW5nLkJpbmRpbmc7CitpbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5U2hlbGw7CitpbXBvcnQgZ3Jvb3Z5LmxhbmcuU2NyaXB0OworaW1wb3J0IGdyb292eS5sYW5nLldyaXRhYmxlOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5Db21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuSW52b2tlckhlbHBlcjsKKworLyoqCisgKiBUaGlzIHNpbXBsZSB0ZW1wbGF0ZSBlbmdpbmUgdXNlcyBKU1AgPCUgJT4gc2NyaXB0IGFuZCA8JT0gJT4gZXhwcmVzc2lvbiBzeW50YXguICBJdCBhbHNvIGxldHMgeW91IHVzZSBub3JtYWwgZ3Jvb3Z5IGV4cHJlc3Npb25zIGluCisgKiB0aGUgdGVtcGxhdGUgdGV4dCBtdWNoIGxpa2UgdGhlIG5ldyBKU1AgRUwgZnVuY3Rpb25hbGl0eS4gIFRoZSB2YXJpYWJsZSAnb3V0JyBpcyBib3VuZCB0byB0aGUgd3JpdGVyIHRoYXQgdGhlIHRlbXBsYXRlIGlzIGJlaW5nIHdyaXR0ZW4gdG8uCisgKgorICogQGF1dGhvciBzYW0KKyAqIEBhdXRob3IgQ2hyaXN0aWFuIFN0ZWluCisgKiBAYXV0aG9yIFBhdWwgS2luZworICovCitwdWJsaWMgY2xhc3MgU2ltcGxlVGVtcGxhdGVFbmdpbmUgZXh0ZW5kcyBUZW1wbGF0ZUVuZ2luZSB7CisgICAgcHJpdmF0ZSBib29sZWFuIHZlcmJvc2U7CisKKyAgICBwcml2YXRlIEdyb292eVNoZWxsIGdyb292eVNoZWxsOworCisgICAgcHVibGljIFNpbXBsZVRlbXBsYXRlRW5naW5lKCkgeworICAgICAgICB0aGlzKEdyb292eVNoZWxsLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOworICAgIH0KKworICAgIHB1YmxpYyBTaW1wbGVUZW1wbGF0ZUVuZ2luZShib29sZWFuIHZlcmJvc2UpIHsKKyAgICAgICAgdGhpcyhHcm9vdnlTaGVsbC5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgc2V0VmVyYm9zZSh2ZXJib3NlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2ltcGxlVGVtcGxhdGVFbmdpbmUoQ2xhc3NMb2FkZXIgcGFyZW50TG9hZGVyKSB7CisgICAgICAgIHRoaXMobmV3IEdyb292eVNoZWxsKHBhcmVudExvYWRlcikpOworICAgIH0KKworICAgIHB1YmxpYyBTaW1wbGVUZW1wbGF0ZUVuZ2luZShHcm9vdnlTaGVsbCBncm9vdnlTaGVsbCkgeworICAgICAgICB0aGlzLmdyb292eVNoZWxsID0gZ3Jvb3Z5U2hlbGw7CisgICAgfQorCisgICAgcHVibGljIFRlbXBsYXRlIGNyZWF0ZVRlbXBsYXRlKFJlYWRlciByZWFkZXIpIHRocm93cyBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBTaW1wbGVUZW1wbGF0ZSB0ZW1wbGF0ZSA9IG5ldyBTaW1wbGVUZW1wbGF0ZSgpOworICAgICAgICBTdHJpbmcgc2NyaXB0ID0gdGVtcGxhdGUucGFyc2UocmVhZGVyKTsKKyAgICAgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG4tLSBzY3JpcHQgc291cmNlIC0tIik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KHNjcmlwdCk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuLS0gc2NyaXB0IGVuZCAtLVxuIik7CisgICAgICAgIH0KKyAgICAgICAgdGVtcGxhdGUuc2NyaXB0ID0gZ3Jvb3Z5U2hlbGwucGFyc2Uoc2NyaXB0KTsKKyAgICAgICAgcmV0dXJuIHRlbXBsYXRlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFZlcmJvc2UoYm9vbGVhbiB2ZXJib3NlKSB7CisgICAgICAgIHRoaXMudmVyYm9zZSA9IHZlcmJvc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNWZXJib3NlKCkgeworICAgICAgICByZXR1cm4gdmVyYm9zZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTaW1wbGVUZW1wbGF0ZSBpbXBsZW1lbnRzIFRlbXBsYXRlIHsKKworICAgICAgICBwcm90ZWN0ZWQgU2NyaXB0IHNjcmlwdDsKKworICAgICAgICBwdWJsaWMgV3JpdGFibGUgbWFrZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtYWtlKG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFdyaXRhYmxlIG1ha2UoZmluYWwgTWFwIG1hcCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBXcml0YWJsZSgpIHsKKyAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgKiBXcml0ZSB0aGUgdGVtcGxhdGUgZG9jdW1lbnQgd2l0aCB0aGUgc2V0IGJpbmRpbmcgYXBwbGllZCB0byB0aGUgd3JpdGVyLgorICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICogQHNlZSBncm9vdnkubGFuZy5Xcml0YWJsZSN3cml0ZVRvKGphdmEuaW8uV3JpdGVyKQorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHB1YmxpYyBXcml0ZXIgd3JpdGVUbyhXcml0ZXIgd3JpdGVyKSB7CisgICAgICAgICAgICAgICAgICAgIEJpbmRpbmcgYmluZGluZzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1hcCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZyA9IG5ldyBCaW5kaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmcgPSBuZXcgQmluZGluZyhtYXApOworICAgICAgICAgICAgICAgICAgICBTY3JpcHQgc2NyaXB0T2JqZWN0ID0gSW52b2tlckhlbHBlci5jcmVhdGVTY3JpcHQoc2NyaXB0LmdldENsYXNzKCksIGJpbmRpbmcpOworICAgICAgICAgICAgICAgICAgICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcih3cml0ZXIpOworICAgICAgICAgICAgICAgICAgICBzY3JpcHRPYmplY3Quc2V0UHJvcGVydHkoIm91dCIsIHB3KTsKKyAgICAgICAgICAgICAgICAgICAgc2NyaXB0T2JqZWN0LnJ1bigpOworICAgICAgICAgICAgICAgICAgICBwdy5mbHVzaCgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gd3JpdGVyOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAqIENvbnZlcnQgdGhlIHRlbXBsYXRlIGFuZCBiaW5kaW5nIGludG8gYSByZXN1bHQgU3RyaW5nLgorICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlVG8oc3cpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3cudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFBhcnNlIHRoZSB0ZXh0IGRvY3VtZW50IGxvb2tpbmcgZm9yIDwlIG9yIDwlPSBhbmQgdGhlbiBjYWxsIG91dCB0byB0aGUgYXBwcm9wcmlhdGUgaGFuZGxlciwgb3RoZXJ3aXNlIGNvcHkgdGhlIHRleHQgZGlyZWN0bHkKKyAgICAgICAgICogaW50byB0aGUgc2NyaXB0IHdoaWxlIGVzY2FwaW5nIHF1b3Rlcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHJlYWRlciBhIHJlYWRlciBmb3IgdGhlIHRlbXBsYXRlIHRleHQKKyAgICAgICAgICogQHJldHVybiB0aGUgcGFyc2VkIHRleHQKKyAgICAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZworICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBwYXJzZShSZWFkZXIgcmVhZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaWYgKCFyZWFkZXIubWFya1N1cHBvcnRlZCgpKSB7CisgICAgICAgICAgICAgICAgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKHJlYWRlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgICAgICBzdGFydFNjcmlwdChzdyk7CisgICAgICAgICAgICBpbnQgYzsKKyAgICAgICAgICAgIHdoaWxlICgoYyA9IHJlYWRlci5yZWFkKCkpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gJzwnKSB7CisgICAgICAgICAgICAgICAgICAgIHJlYWRlci5tYXJrKDEpOworICAgICAgICAgICAgICAgICAgICBjID0gcmVhZGVyLnJlYWQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGMgIT0gJyUnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdy53cml0ZSgnPCcpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubWFyaygxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMgPSByZWFkZXIucmVhZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gJz0nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3Jvb3Z5RXhwcmVzc2lvbihyZWFkZXIsIHN3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3Jvb3Z5U2VjdGlvbihyZWFkZXIsIHN3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gYXQgbGVhc3QgJzwnIGlzIGNvbnN1bWVkIC4uLiByZWFkIG5leHQgY2hhcnMuCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjID09ICdcIicpIHsKKyAgICAgICAgICAgICAgICAgICAgc3cud3JpdGUoJ1xcJyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogSGFuZGxlIHJhdyBuZXcgbGluZSBjaGFyYWN0ZXJzLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChjID09ICdcbicgfHwgYyA9PSAnXHInKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjID09ICdccicpIHsgLy8gb24gV2luZG93cywgIlxyXG4iIGlzIGEgbmV3IGxpbmUuCisgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubWFyaygxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMgPSByZWFkZXIucmVhZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgIT0gJ1xuJykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5yZXNldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN3LndyaXRlKCJcXG5cIik7XG5vdXQucHJpbnQoXCIiKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN3LndyaXRlKGMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZW5kU2NyaXB0KHN3KTsKKyAgICAgICAgICAgIHJldHVybiBzdy50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0U2NyaXB0KFN0cmluZ1dyaXRlciBzdykgeworICAgICAgICAgICAgc3cud3JpdGUoIi8qIEdlbmVyYXRlZCBieSBTaW1wbGVUZW1wbGF0ZUVuZ2luZSAqL1xuIik7CisgICAgICAgICAgICBzdy53cml0ZSgib3V0LnByaW50KFwiIik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgZW5kU2NyaXB0KFN0cmluZ1dyaXRlciBzdykgeworICAgICAgICAgICAgc3cud3JpdGUoIlwiKTtcbiIpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENsb3NlcyB0aGUgY3VycmVudGx5IG9wZW4gd3JpdGUgYW5kIHdyaXRlcyBvdXQgdGhlIGZvbGxvd2luZyB0ZXh0IGFzIGEgR1N0cmluZyBleHByZXNzaW9uIHVudGlsIGl0IHJlYWNoZXMgYW4gZW5kICU+LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcmVhZGVyIGEgcmVhZGVyIGZvciB0aGUgdGVtcGxhdGUgdGV4dAorICAgICAgICAgKiBAcGFyYW0gc3cgICAgIGEgU3RyaW5nV3JpdGVyIHRvIHdyaXRlIGV4cHJlc3Npb24gY29udGVudAorICAgICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHZvaWQgZ3Jvb3Z5RXhwcmVzc2lvbihSZWFkZXIgcmVhZGVyLCBTdHJpbmdXcml0ZXIgc3cpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBzdy53cml0ZSgiXCIpO291dC5wcmludChcIiR7Iik7CisgICAgICAgICAgICBpbnQgYzsKKyAgICAgICAgICAgIHdoaWxlICgoYyA9IHJlYWRlci5yZWFkKCkpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gJyUnKSB7CisgICAgICAgICAgICAgICAgICAgIGMgPSByZWFkZXIucmVhZCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoYyAhPSAnPicpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3LndyaXRlKCclJyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYyAhPSAnXG4nICYmIGMgIT0gJ1xyJykgeworICAgICAgICAgICAgICAgICAgICBzdy53cml0ZShjKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdy53cml0ZSgifVwiKTtcbm91dC5wcmludChcIiIpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENsb3NlcyB0aGUgY3VycmVudGx5IG9wZW4gd3JpdGUgYW5kIHdyaXRlcyB0aGUgZm9sbG93aW5nIHRleHQgYXMgbm9ybWFsIEdyb292eSBzY3JpcHQgY29kZSB1bnRpbCBpdCByZWFjaGVzIGFuIGVuZCAlPi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHJlYWRlciBhIHJlYWRlciBmb3IgdGhlIHRlbXBsYXRlIHRleHQKKyAgICAgICAgICogQHBhcmFtIHN3ICAgICBhIFN0cmluZ1dyaXRlciB0byB3cml0ZSBleHByZXNzaW9uIGNvbnRlbnQKKyAgICAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZworICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSB2b2lkIGdyb292eVNlY3Rpb24oUmVhZGVyIHJlYWRlciwgU3RyaW5nV3JpdGVyIHN3KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgc3cud3JpdGUoIlwiKTsiKTsKKyAgICAgICAgICAgIGludCBjOworICAgICAgICAgICAgd2hpbGUgKChjID0gcmVhZGVyLnJlYWQoKSkgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBpZiAoYyA9PSAnJScpIHsKKyAgICAgICAgICAgICAgICAgICAgYyA9IHJlYWRlci5yZWFkKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjICE9ICc+JykgeworICAgICAgICAgICAgICAgICAgICAgICAgc3cud3JpdGUoJyUnKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIERvbid0IGVhdCBFT0wgY2hhcnMgaW4gc2VjdGlvbnMgLSBhcyB0aGV5IGFyZSB2YWxpZCBpbnN0cnVjdGlvbiBzZXBhcmF0b3JzLgorICAgICAgICAgICAgICAgICAqIFNlZSBodHRwOi8vamlyYS5jb2RlaGF1cy5vcmcvYnJvd3NlL0dST09WWS05ODAKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAvLyBpZiAoYyAhPSAnXG4nICYmIGMgIT0gJ1xyJykgeworICAgICAgICAgICAgICAgIHN3LndyaXRlKGMpOworICAgICAgICAgICAgICAgIC8vfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3cud3JpdGUoIjtcbm91dC5wcmludChcIiIpOworICAgICAgICB9CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3RleHQvVGVtcGxhdGUuamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdGV4dC9UZW1wbGF0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkOTg4OGUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3RleHQvVGVtcGxhdGUuamF2YQpAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgZ3Jvb3Z5LnRleHQ7CisKK2ltcG9ydCBncm9vdnkubGFuZy5Xcml0YWJsZTsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKworLyoqCisgKiBBIHRlbXBsYXRlIGlzIGEgYmxvY2sgb2YgdGV4dCB3aXRoIGFuIGFzc29jaWF0ZWQgYmluZGluZyB0aGF0IGNhbiBiZSBvdXRwdXQgdG8gYSB3cml0ZXIgb3IgZXZhbHVhdGVkIHRvIGEgc3RyaW5nLgorICogCisgKiBAYXV0aG9yIHNhbQorICovCitwdWJsaWMgaW50ZXJmYWNlIFRlbXBsYXRlIHsKKyAgICBXcml0YWJsZSBtYWtlKCk7CisgICAgV3JpdGFibGUgbWFrZShNYXAgYmluZGluZyk7Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3RleHQvVGVtcGxhdGVFbmdpbmUuamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdGV4dC9UZW1wbGF0ZUVuZ2luZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwYmM2OTcKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3RleHQvVGVtcGxhdGVFbmdpbmUuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgZ3Jvb3Z5LnRleHQ7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb247CisKKy8qKgorICogUmVwcmVzZW50cyBhbiBBUEkgdG8gYW55IHRlbXBsYXRlIGVuZ2luZSB3aGljaCBpcyBiYXNpY2FsbHkgYSBmYWN0b3J5IG9mIFRlbXBsYXRlIGluc3RhbmNlcyBmcm9tIGEgZ2l2ZW4gdGV4dCBpbnB1dC4KKyAqIAorICogQGF1dGhvciBzYW0KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFRlbXBsYXRlRW5naW5lIHsKKyAgICBwdWJsaWMgYWJzdHJhY3QgVGVtcGxhdGUgY3JlYXRlVGVtcGxhdGUoUmVhZGVyIHJlYWRlcikgdGhyb3dzIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbjsKKyAgICAKKyAgICBwdWJsaWMgVGVtcGxhdGUgY3JlYXRlVGVtcGxhdGUoU3RyaW5nIHRlbXBsYXRlVGV4dCkgdGhyb3dzIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZVRlbXBsYXRlKG5ldyBTdHJpbmdSZWFkZXIodGVtcGxhdGVUZXh0KSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBUZW1wbGF0ZSBjcmVhdGVUZW1wbGF0ZShGaWxlIGZpbGUpIHRocm93cyBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBjcmVhdGVUZW1wbGF0ZShuZXcgRmlsZVJlYWRlcihmaWxlKSk7CisgICAgfQorCisgICAgcHVibGljIFRlbXBsYXRlIGNyZWF0ZVRlbXBsYXRlKFVSTCB1cmwpIHRocm93cyBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gY3JlYXRlVGVtcGxhdGUobmV3IElucHV0U3RyZWFtUmVhZGVyKHVybC5vcGVuU3RyZWFtKCkpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3RleHQvWG1sVGVtcGxhdGVFbmdpbmUuamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdGV4dC9YbWxUZW1wbGF0ZUVuZ2luZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMjc1N2QKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3RleHQvWG1sVGVtcGxhdGVFbmdpbmUuamF2YQpAQCAtMCwwICsxLDIyMiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgZ3Jvb3Z5LnRleHQ7CisKK2ltcG9ydCBncm9vdnkubGFuZy5CaW5kaW5nOworaW1wb3J0IGdyb292eS5sYW5nLkdyb292eVNoZWxsOworaW1wb3J0IGdyb292eS5sYW5nLlNjcmlwdDsKK2ltcG9ydCBncm9vdnkubGFuZy5Xcml0YWJsZTsKK2ltcG9ydCBncm9vdnkudXRpbC5JbmRlbnRQcmludGVyOworaW1wb3J0IGdyb292eS51dGlsLk5vZGU7CitpbXBvcnQgZ3Jvb3Z5LnV0aWwuWG1sTm9kZVByaW50ZXI7CitpbXBvcnQgZ3Jvb3Z5LnV0aWwuWG1sUGFyc2VyOworaW1wb3J0IGdyb292eS54bWwuUU5hbWU7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLkNvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5JbnZva2VySGVscGVyOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKKworLyoqCisgKiBUZW1wbGF0ZSBlbmdpbmUgZm9yIHhtbCBkYXRhIGlucHV0LgorICoKKyAqIEBhdXRob3IgQ2hyaXN0aWFuIFN0ZWluCisgKiBAYXV0aG9yIFBhdWwgS2luZworICovCitwdWJsaWMgY2xhc3MgWG1sVGVtcGxhdGVFbmdpbmUgZXh0ZW5kcyBUZW1wbGF0ZUVuZ2luZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBHc3BQcmludGVyIGV4dGVuZHMgWG1sTm9kZVByaW50ZXIgeworCisgICAgICAgIHB1YmxpYyBHc3BQcmludGVyKFByaW50V3JpdGVyIG91dCwgU3RyaW5nIGluZGVudCkgeworICAgICAgICAgICAgdGhpcyhuZXcgSW5kZW50UHJpbnRlcihvdXQsIGluZGVudCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEdzcFByaW50ZXIoSW5kZW50UHJpbnRlciBvdXQpIHsKKyAgICAgICAgICAgIHN1cGVyKG91dCwgIlxcXCIiKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHByaW50R3Jvb3Z5VGFnKFN0cmluZyB0YWcsIFN0cmluZyB0ZXh0KSB7CisgICAgICAgICAgICBpZiAodGFnLmVxdWFscygic2NyaXB0bGV0IikpIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQodGV4dCk7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KCJcbiIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0YWcuZXF1YWxzKCJleHByZXNzaW9uIikpIHsKKyAgICAgICAgICAgICAgICBwcmludExpbmVCZWdpbigpOworICAgICAgICAgICAgICAgIG91dC5wcmludCgiJHsiKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQodGV4dCk7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KCJ9Iik7CisgICAgICAgICAgICAgICAgcHJpbnRMaW5lRW5kKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVuc3VwcG9ydGVkIHRhZyBuYW1lZCBcIiIgKyB0YWcgKyAiXCIuIik7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBwcmludExpbmVCZWdpbigpIHsKKyAgICAgICAgICAgIG91dC5wcmludCgib3V0LnByaW50KFwiIik7CisgICAgICAgICAgICBvdXQucHJpbnRJbmRlbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHByaW50TGluZUVuZChTdHJpbmcgY29tbWVudCkgeworICAgICAgICAgICAgb3V0LnByaW50KCJcXG5cIik7Iik7CisgICAgICAgICAgICBpZiAoY29tbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KCIgLy8gIik7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KGNvbW1lbnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0LnByaW50KCJcbiIpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJpbnRTcGVjaWFsTm9kZShOb2RlIG5vZGUpIHsKKyAgICAgICAgICAgIE9iamVjdCBuYW1lID0gbm9kZS5uYW1lKCk7CisgICAgICAgICAgICBpZiAobmFtZSAhPSBudWxsICYmIG5hbWUgaW5zdGFuY2VvZiBRTmFtZSkgeworICAgICAgICAgICAgICAgIFFOYW1lIHFuID0gKFFOYW1lKSBuYW1lOworICAgICAgICAgICAgICAgIGlmIChxbi5nZXRQcmVmaXgoKS5lcXVhbHMoImdzcCIpKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzID0gcW4uZ2V0TG9jYWxQYXJ0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJObyBsb2NhbCBwYXJ0IGFmdGVyICdnc3A6JyBnaXZlbiBpbiBub2RlICIgKyBub2RlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwcmludEdyb292eVRhZyhzLCBub2RlLnRleHQoKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgWG1sVGVtcGxhdGUgaW1wbGVtZW50cyBUZW1wbGF0ZSB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTY3JpcHQgc2NyaXB0OworCisgICAgICAgIHB1YmxpYyBYbWxUZW1wbGF0ZShTY3JpcHQgc2NyaXB0KSB7CisgICAgICAgICAgICB0aGlzLnNjcmlwdCA9IHNjcmlwdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBXcml0YWJsZSBtYWtlKCkgeworICAgICAgICAgICAgcmV0dXJuIG1ha2UobmV3IEhhc2hNYXAoKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgV3JpdGFibGUgbWFrZShNYXAgbWFwKSB7CisgICAgICAgICAgICBpZiAobWFwID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtYXAgbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxXcml0YWJsZShzY3JpcHQsIG5ldyBCaW5kaW5nKG1hcCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgWG1sV3JpdGFibGUgaW1wbGVtZW50cyBXcml0YWJsZSB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCaW5kaW5nIGJpbmRpbmc7CisgICAgICAgIHByaXZhdGUgZmluYWwgU2NyaXB0IHNjcmlwdDsKKyAgICAgICAgcHJpdmF0ZSBXZWFrUmVmZXJlbmNlIHJlc3VsdDsKKworICAgICAgICBwdWJsaWMgWG1sV3JpdGFibGUoU2NyaXB0IHNjcmlwdCwgQmluZGluZyBiaW5kaW5nKSB7CisgICAgICAgICAgICB0aGlzLnNjcmlwdCA9IHNjcmlwdDsKKyAgICAgICAgICAgIHRoaXMuYmluZGluZyA9IGJpbmRpbmc7CisgICAgICAgICAgICB0aGlzLnJlc3VsdCA9IG5ldyBXZWFrUmVmZXJlbmNlKG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFdyaXRlciB3cml0ZVRvKFdyaXRlciBvdXQpIHsKKyAgICAgICAgICAgIFNjcmlwdCBzY3JpcHRPYmplY3QgPSBJbnZva2VySGVscGVyLmNyZWF0ZVNjcmlwdChzY3JpcHQuZ2V0Q2xhc3MoKSwgYmluZGluZyk7CisgICAgICAgICAgICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihvdXQpOworICAgICAgICAgICAgc2NyaXB0T2JqZWN0LnNldFByb3BlcnR5KCJvdXQiLCBwdyk7CisgICAgICAgICAgICBzY3JpcHRPYmplY3QucnVuKCk7CisgICAgICAgICAgICBwdy5mbHVzaCgpOworICAgICAgICAgICAgcmV0dXJuIG91dDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICBpZiAocmVzdWx0LmdldCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LmdldCgpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcgc3RyaW5nID0gd3JpdGVUbyhuZXcgU3RyaW5nV3JpdGVyKDEwMjQpKS50b1N0cmluZygpOworICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFdlYWtSZWZlcmVuY2Uoc3RyaW5nKTsKKyAgICAgICAgICAgIHJldHVybiBzdHJpbmc7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0lOREVOVEFUSU9OID0gIiAgIjsKKworICAgIHByaXZhdGUgZmluYWwgR3Jvb3Z5U2hlbGwgZ3Jvb3Z5U2hlbGw7CisgICAgcHJpdmF0ZSBmaW5hbCBYbWxQYXJzZXIgeG1sUGFyc2VyOworICAgIHByaXZhdGUgU3RyaW5nIGluZGVudGF0aW9uOworCisgICAgcHVibGljIFhtbFRlbXBsYXRlRW5naW5lKCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiwgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMoREVGQVVMVF9JTkRFTlRBVElPTiwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBYbWxUZW1wbGF0ZUVuZ2luZShTdHJpbmcgaW5kZW50YXRpb24sIGJvb2xlYW4gdmFsaWRhdGluZykgdGhyb3dzIFNBWEV4Y2VwdGlvbiwgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMobmV3IFhtbFBhcnNlcih2YWxpZGF0aW5nLCB0cnVlKSwgbmV3IEdyb292eVNoZWxsKCkpOworICAgICAgICBzZXRJbmRlbnRhdGlvbihpbmRlbnRhdGlvbik7CisgICAgfQorCisgICAgcHVibGljIFhtbFRlbXBsYXRlRW5naW5lKFhtbFBhcnNlciB4bWxQYXJzZXIsIENsYXNzTG9hZGVyIHBhcmVudExvYWRlcikgeworICAgICAgICB0aGlzKHhtbFBhcnNlciwgbmV3IEdyb292eVNoZWxsKHBhcmVudExvYWRlcikpOworICAgIH0KKworICAgIHB1YmxpYyBYbWxUZW1wbGF0ZUVuZ2luZShYbWxQYXJzZXIgeG1sUGFyc2VyLCBHcm9vdnlTaGVsbCBncm9vdnlTaGVsbCkgeworICAgICAgICB0aGlzLmdyb292eVNoZWxsID0gZ3Jvb3Z5U2hlbGw7CisgICAgICAgIHRoaXMueG1sUGFyc2VyID0geG1sUGFyc2VyOworICAgICAgICBzZXRJbmRlbnRhdGlvbihERUZBVUxUX0lOREVOVEFUSU9OKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVGVtcGxhdGUgY3JlYXRlVGVtcGxhdGUoUmVhZGVyIHJlYWRlcikgdGhyb3dzIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIE5vZGUgcm9vdCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByb290ID0geG1sUGFyc2VyLnBhcnNlKHJlYWRlcik7CisgICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiUGFyc2luZyBYTUwgc291cmNlIGZhaWxlZC4iLCBlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyb290ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiUGFyc2luZyBYTUwgc291cmNlIGZhaWxlZDogcm9vdCBub2RlIGlzIG51bGwuIik7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigxMDI0KTsKKyAgICAgICAgd3JpdGVyLndyaXRlKCIvKiBHZW5lcmF0ZWQgYnkgWG1sVGVtcGxhdGVFbmdpbmUgKi9cbiIpOworICAgICAgICBuZXcgR3NwUHJpbnRlcihuZXcgUHJpbnRXcml0ZXIod3JpdGVyKSwgaW5kZW50YXRpb24pLnByaW50KHJvb3QpOworCisgICAgICAgIFNjcmlwdCBzY3JpcHQgPSBncm9vdnlTaGVsbC5wYXJzZSh3cml0ZXIudG9TdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBuZXcgWG1sVGVtcGxhdGUoc2NyaXB0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEluZGVudGF0aW9uKCkgeworICAgICAgICByZXR1cm4gaW5kZW50YXRpb247CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SW5kZW50YXRpb24oU3RyaW5nIGluZGVudGF0aW9uKSB7CisgICAgICAgIGlmIChpbmRlbnRhdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICBpbmRlbnRhdGlvbiA9IERFRkFVTFRfSU5ERU5UQVRJT047CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5pbmRlbnRhdGlvbiA9IGluZGVudGF0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiWG1sVGVtcGxhdGVFbmdpbmUiOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS90ZXh0L3BhY2thZ2UuaHRtbCBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdGV4dC9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ2ODUwNgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdGV4dC9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSw4IEBACis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPHRpdGxlPnBhY2thZ2UgZ3Jvb3Z5LnRleHQuKjwvdGl0bGU+CisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgPHA+Q29udGFpbnMgdGhlIHRleHQgcHJvY2Vzc2luZyB1dGlsaXRpZXMgaW4gcGFydGljdWxhciB0aGUgdGVtcGxhdGUgZW5naW5lIEFQSSBhbmQgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbi48L3A+CisgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdGltZS9CYXNlRHVyYXRpb24uamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdGltZS9CYXNlRHVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjljNDg5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS90aW1lL0Jhc2VEdXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgZ3Jvb3Z5LnRpbWU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlRHVyYXRpb24geworICAgIHByb3RlY3RlZCBmaW5hbCBpbnQgeWVhcnM7CisgICAgcHJvdGVjdGVkIGZpbmFsIGludCBtb250aHM7ICAgIAorICAgIHByb3RlY3RlZCBmaW5hbCBpbnQgZGF5czsKKyAgICBwcm90ZWN0ZWQgZmluYWwgaW50IGhvdXJzOworICAgIHByb3RlY3RlZCBmaW5hbCBpbnQgbWludXRlczsKKyAgICBwcm90ZWN0ZWQgZmluYWwgaW50IHNlY29uZHM7ICAgIAorICAgIHByb3RlY3RlZCBmaW5hbCBpbnQgbWlsbGlzOworCisgICAgcHJvdGVjdGVkIEJhc2VEdXJhdGlvbihmaW5hbCBpbnQgeWVhcnMsIGZpbmFsIGludCBtb250aHMsIGZpbmFsIGludCBkYXlzLCBmaW5hbCBpbnQgaG91cnMsIGZpbmFsIGludCBtaW51dGVzLCBmaW5hbCBpbnQgc2Vjb25kcywgZmluYWwgaW50IG1pbGxpcykgeworICAgICAgICB0aGlzLnllYXJzID0geWVhcnM7CisgICAgICAgIHRoaXMubW9udGhzID0gbW9udGhzOworICAgICAgICB0aGlzLmRheXMgPSBkYXlzOworICAgICAgICB0aGlzLmhvdXJzID0gaG91cnM7CisgICAgICAgIHRoaXMubWludXRlcyA9IG1pbnV0ZXM7CisgICAgICAgIHRoaXMuc2Vjb25kcyA9IHNlY29uZHM7CisgICAgICAgIHRoaXMubWlsbGlzID0gbWlsbGlzOworICAgIH0KKworICAgIHByb3RlY3RlZCBCYXNlRHVyYXRpb24oZmluYWwgaW50IGRheXMsIGZpbmFsIGludCBob3VycywgZmluYWwgaW50IG1pbnV0ZXMsIGZpbmFsIGludCBzZWNvbmRzLCBmaW5hbCBpbnQgbWlsbGlzKSB7CisgICAgICAgIHRoaXMoMCwgMCwgZGF5cywgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIG1pbGxpcyk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgZ2V0WWVhcnMoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnllYXJzOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgaW50IGdldE1vbnRocygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubW9udGhzOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgaW50IGdldERheXMoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmRheXM7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgZ2V0SG91cnMoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmhvdXJzOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgaW50IGdldE1pbnV0ZXMoKSB7CisgICAgICAgIHJldHVybiB0aGlzLm1pbnV0ZXM7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgZ2V0U2Vjb25kcygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuc2Vjb25kczsKKyAgICB9CisgICAgCisgICAgcHVibGljIGludCBnZXRNaWxsaXMoKSB7CisgICAgICAgIHJldHVybiB0aGlzLm1pbGxpczsKKyAgICB9CisgICAgCisgICAgcHVibGljIERhdGUgcGx1cyhmaW5hbCBEYXRlIGRhdGUpIHsKKyAgICBmaW5hbCBDYWxlbmRhciBjYWwgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOworICAgIAorICAgICAgICBjYWwuc2V0VGltZShkYXRlKTsKKyAgICAgICAgY2FsLmFkZChDYWxlbmRhci5ZRUFSLCB0aGlzLnllYXJzKTsKKyAgICAgICAgY2FsLmFkZChDYWxlbmRhci5NT05USCwgdGhpcy5tb250aHMpOworICAgICAgICBjYWwuYWRkKENhbGVuZGFyLkRBWV9PRl9ZRUFSLCB0aGlzLmRheXMpOworICAgICAgICBjYWwuYWRkKENhbGVuZGFyLkhPVVJfT0ZfREFZLCB0aGlzLmhvdXJzKTsKKyAgICAgICAgY2FsLmFkZChDYWxlbmRhci5NSU5VVEUsIHRoaXMubWludXRlcyk7CisgICAgICAgIGNhbC5hZGQoQ2FsZW5kYXIuU0VDT05ELCB0aGlzLnNlY29uZHMpOworICAgICAgICBjYWwuYWRkKENhbGVuZGFyLk1JTExJU0VDT05ELCB0aGlzLm1pbGxpcyk7CisgICAgICAgIAorICAgICAgICByZXR1cm4gY2FsLmdldFRpbWUoKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGFic3RyYWN0IGxvbmcgdG9NaWxsaXNlY29uZHMoKTsKKyAgICAKKyAgICBwdWJsaWMgYWJzdHJhY3QgRGF0ZSBnZXRBZ28oKTsKKyAgICAKKyAgICBwdWJsaWMgYWJzdHJhY3QgRnJvbSBnZXRGcm9tKCk7CisKKyAgICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIEZyb20geworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgRGF0ZSBnZXROb3coKTsKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBEYXRlIGdldFRvZGF5KCkgeworICAgICAgICAgICAgcmV0dXJuIGdldE5vdygpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS90aW1lL0RhdHVtRGVwZW5kZW50RHVyYXRpb24uamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdGltZS9EYXR1bURlcGVuZGVudER1cmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJkNmJhNAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdGltZS9EYXR1bURlcGVuZGVudER1cmF0aW9uLmphdmEKQEAgLTAsMCArMSwxNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBncm9vdnkudGltZTsKKworaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5UaW1lQ2F0ZWdvcnk7CisKKy8qKgorICogQGF1dGhvciBKb2huIFdpbHNvbiB0dWdAd2lsc29uLmNvLnVrCisgKiAgICAgICAgIDxwLz4KKyAqICAgICAgICAgRGF0dW1EZXBlbmRlbnREdXJhdGlvbiByZXByZXNlbnRzIGR1cmF0aW9ucyB3aG9zZSBsZW5ndGggaW4gbWlsbGlzZWNvbmRzIGNhbm5vdCBiZSBkZXRlcm1pbmVkIHdpdGhvdSBrbm93aW5nIHRoZSBkYXR1bSBwb2ludC4KKyAqICAgICAgICAgPHAvPgorICogICAgICAgICBJIGRvbid0IGtub3cgaG93IG1hbnkgZGF5cyBpbiBhIHllYXIgdW5sZXNzIEkga25vdyBpZiBpdCdzIGEgbGVhcCB5ZWFyIG9yIG5vdC4KKyAqICAgICAgICAgPHAvPgorICogICAgICAgICBJIGRvbid0IGtub3cgaG93IG1hbnkgZGF5cyBpbiBhIG1vbnRoIHVubGVzcyBJIGtub3cgdGhlIG5hbWUgb2YgdGhlIG1vbnRoIChhbmQgaWYgaXQncyBhIGxlYXAgeWFlciBpZiB0aGUgbW9udGggaXMgRmVicnVhcnkpCisgKi8KK3B1YmxpYyBjbGFzcyBEYXR1bURlcGVuZGVudER1cmF0aW9uIGV4dGVuZHMgQmFzZUR1cmF0aW9uIHsKKyAgICBwdWJsaWMgRGF0dW1EZXBlbmRlbnREdXJhdGlvbihmaW5hbCBpbnQgeWVhcnMsIGZpbmFsIGludCBtb250aHMsIGZpbmFsIGludCBkYXlzLCBmaW5hbCBpbnQgaG91cnMsIGZpbmFsIGludCBtaW51dGVzLCBmaW5hbCBpbnQgc2Vjb25kcywgZmluYWwgaW50IG1pbGxpcykgeworICAgICAgICBzdXBlcih5ZWFycywgbW9udGhzLCBkYXlzLCBob3VycywgbWludXRlcywgc2Vjb25kcywgbWlsbGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldE1vbnRocygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubW9udGhzOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0WWVhcnMoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnllYXJzOworICAgIH0KKworICAgIHB1YmxpYyBEYXR1bURlcGVuZGVudER1cmF0aW9uIHBsdXMoZmluYWwgRGF0dW1EZXBlbmRlbnREdXJhdGlvbiByaHMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEYXR1bURlcGVuZGVudER1cmF0aW9uKHRoaXMuZ2V0WWVhcnMoKSArIHJocy5nZXRZZWFycygpLCB0aGlzLmdldE1vbnRocygpICsgcmhzLmdldE1vbnRocygpLAorICAgICAgICAgICAgICAgIHRoaXMuZ2V0RGF5cygpICsgcmhzLmdldERheXMoKSwgdGhpcy5nZXRIb3VycygpICsgcmhzLmdldEhvdXJzKCksCisgICAgICAgICAgICAgICAgdGhpcy5nZXRNaW51dGVzKCkgKyByaHMuZ2V0TWludXRlcygpLCB0aGlzLmdldFNlY29uZHMoKSArIHJocy5nZXRTZWNvbmRzKCksCisgICAgICAgICAgICAgICAgdGhpcy5nZXRNaWxsaXMoKSArIHJocy5nZXRNaWxsaXMoKSk7CisgICAgfQorCisgICAgcHVibGljIERhdHVtRGVwZW5kZW50RHVyYXRpb24gcGx1cyhmaW5hbCBUaW1lRGF0dW1EZXBlbmRlbnREdXJhdGlvbiByaHMpIHsKKyAgICAgICAgcmV0dXJuIHJocy5wbHVzKHRoaXMpOworICAgIH0KKworICAgIHB1YmxpYyBEYXR1bURlcGVuZGVudER1cmF0aW9uIHBsdXMoZmluYWwgRHVyYXRpb24gcmhzKSB7CisgICAgICAgIHJldHVybiBuZXcgRGF0dW1EZXBlbmRlbnREdXJhdGlvbih0aGlzLmdldFllYXJzKCksIHRoaXMuZ2V0TW9udGhzKCksCisgICAgICAgICAgICAgICAgdGhpcy5nZXREYXlzKCkgKyByaHMuZ2V0RGF5cygpLCB0aGlzLmdldEhvdXJzKCkgKyByaHMuZ2V0SG91cnMoKSwKKyAgICAgICAgICAgICAgICB0aGlzLmdldE1pbnV0ZXMoKSArIHJocy5nZXRNaW51dGVzKCksIHRoaXMuZ2V0U2Vjb25kcygpICsgcmhzLmdldFNlY29uZHMoKSwKKyAgICAgICAgICAgICAgICB0aGlzLmdldE1pbGxpcygpICsgcmhzLmdldE1pbGxpcygpKTsKKworICAgIH0KKworICAgIHB1YmxpYyBEYXR1bURlcGVuZGVudER1cmF0aW9uIHBsdXMoZmluYWwgVGltZUR1cmF0aW9uIHJocykgeworICAgICAgICByZXR1cm4gcmhzLnBsdXModGhpcyk7CisKKyAgICB9CisKKyAgICBwdWJsaWMgRGF0dW1EZXBlbmRlbnREdXJhdGlvbiBtaW51cyhmaW5hbCBEYXR1bURlcGVuZGVudER1cmF0aW9uIHJocykgeworICAgICAgICByZXR1cm4gbmV3IERhdHVtRGVwZW5kZW50RHVyYXRpb24odGhpcy5nZXRZZWFycygpIC0gcmhzLmdldFllYXJzKCksIHRoaXMuZ2V0TW9udGhzKCkgLSByaHMuZ2V0TW9udGhzKCksCisgICAgICAgICAgICAgICAgdGhpcy5nZXREYXlzKCkgLSByaHMuZ2V0RGF5cygpLCB0aGlzLmdldEhvdXJzKCkgLSByaHMuZ2V0SG91cnMoKSwKKyAgICAgICAgICAgICAgICB0aGlzLmdldE1pbnV0ZXMoKSAtIHJocy5nZXRNaW51dGVzKCksIHRoaXMuZ2V0U2Vjb25kcygpIC0gcmhzLmdldFNlY29uZHMoKSwKKyAgICAgICAgICAgICAgICB0aGlzLmdldE1pbGxpcygpIC0gcmhzLmdldE1pbGxpcygpKTsKKworICAgIH0KKworICAgIHB1YmxpYyBEYXR1bURlcGVuZGVudER1cmF0aW9uIG1pbnVzKGZpbmFsIER1cmF0aW9uIHJocykgeworICAgICAgICByZXR1cm4gbmV3IERhdHVtRGVwZW5kZW50RHVyYXRpb24odGhpcy5nZXRZZWFycygpLCB0aGlzLmdldE1vbnRocygpLAorICAgICAgICAgICAgICAgIHRoaXMuZ2V0RGF5cygpIC0gcmhzLmdldERheXMoKSwgdGhpcy5nZXRIb3VycygpIC0gcmhzLmdldEhvdXJzKCksCisgICAgICAgICAgICAgICAgdGhpcy5nZXRNaW51dGVzKCkgLSByaHMuZ2V0TWludXRlcygpLCB0aGlzLmdldFNlY29uZHMoKSAtIHJocy5nZXRTZWNvbmRzKCksCisgICAgICAgICAgICAgICAgdGhpcy5nZXRNaWxsaXMoKSAtIHJocy5nZXRNaWxsaXMoKSk7CisKKyAgICB9CisKKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgKiBAc2VlIGdyb292eS50aW1lLkJhc2VEdXJhdGlvbiN0b01pbGxpc2Vjb25kcygpCisgICAgKgorICAgICogRG8gb3VyIGJlc3QgdG8gY2hhbmdlIHRoZSBkdXJhdGlvbiBpbnRvIG1pbGxpc2Vjb25kcworICAgICogV2UgY2FsY3VsYXRlIHRoZSBkdXJhdGlvbiByZWxhdGl2ZSB0byBub3cKKyAgICAqLworICAgIHB1YmxpYyBsb25nIHRvTWlsbGlzZWNvbmRzKCkgeworICAgICAgICBmaW5hbCBEYXRlIG5vdyA9IG5ldyBEYXRlKCk7CisgICAgICAgIHJldHVybiBUaW1lQ2F0ZWdvcnkubWludXMocGx1cyhub3cpLCBub3cpLnRvTWlsbGlzZWNvbmRzKCk7CisgICAgfQorCisgICAgcHVibGljIERhdGUgZ2V0QWdvKCkgeworICAgICAgICBmaW5hbCBDYWxlbmRhciBjYWwgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOworCisgICAgICAgIGNhbC5hZGQoQ2FsZW5kYXIuWUVBUiwgLXRoaXMuZ2V0WWVhcnMoKSk7CisgICAgICAgIGNhbC5hZGQoQ2FsZW5kYXIuTU9OVEgsIC10aGlzLmdldE1vbnRocygpKTsKKyAgICAgICAgY2FsLmFkZChDYWxlbmRhci5EQVlfT0ZfWUVBUiwgLXRoaXMuZ2V0RGF5cygpKTsKKyAgICAgICAgY2FsLmFkZChDYWxlbmRhci5IT1VSX09GX0RBWSwgLXRoaXMuZ2V0SG91cnMoKSk7CisgICAgICAgIGNhbC5hZGQoQ2FsZW5kYXIuTUlOVVRFLCAtdGhpcy5nZXRNaW51dGVzKCkpOworICAgICAgICBjYWwuYWRkKENhbGVuZGFyLlNFQ09ORCwgLXRoaXMuZ2V0U2Vjb25kcygpKTsKKyAgICAgICAgY2FsLmFkZChDYWxlbmRhci5NSUxMSVNFQ09ORCwgLXRoaXMuZ2V0TWlsbGlzKCkpOworCisgICAgICAgIC8vCisgICAgICAgIC8vIFNxbERhdGUgc2hvdWxkIG5vdCByZWFsbHkgY2FyZSBhYm91dCB0aGVzZSB2YWx1ZXMgYnV0IGl0IHNlZW1zIHRvICJyZW1lbWJlciIgdGhlbQorICAgICAgICAvLyBzbyB3ZSBjbGVhciB0aGVtLiBXZSBkbyB0aGUgYWRkcyBmaXJzdCBpbiBjYXNlIHdlIGdldCBjYXJyeSBpbnRvIHRoZSBkYXkgZmllbGQuCisgICAgICAgIC8vCisgICAgICAgIGNhbC5zZXQoQ2FsZW5kYXIuSE9VUl9PRl9EQVksIDApOworICAgICAgICBjYWwuc2V0KENhbGVuZGFyLk1JTlVURSwgMCk7CisgICAgICAgIGNhbC5zZXQoQ2FsZW5kYXIuU0VDT05ELCAwKTsKKyAgICAgICAgY2FsLnNldChDYWxlbmRhci5NSUxMSVNFQ09ORCwgMCk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBqYXZhLnNxbC5EYXRlKGNhbC5nZXRUaW1lSW5NaWxsaXMoKSk7CisgICAgfQorCisgICAgcHVibGljIEZyb20gZ2V0RnJvbSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGcm9tKCkgeworICAgICAgICAgICAgcHVibGljIERhdGUgZ2V0Tm93KCkgeworICAgICAgICAgICAgICAgIGZpbmFsIENhbGVuZGFyIGNhbCA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7CisKKyAgICAgICAgICAgICAgICBjYWwuYWRkKENhbGVuZGFyLllFQVIsIERhdHVtRGVwZW5kZW50RHVyYXRpb24udGhpcy5nZXRZZWFycygpKTsKKyAgICAgICAgICAgICAgICBjYWwuYWRkKENhbGVuZGFyLk1PTlRILCBEYXR1bURlcGVuZGVudER1cmF0aW9uLnRoaXMuZ2V0TW9udGhzKCkpOworICAgICAgICAgICAgICAgIGNhbC5hZGQoQ2FsZW5kYXIuREFZX09GX1lFQVIsIERhdHVtRGVwZW5kZW50RHVyYXRpb24udGhpcy5nZXREYXlzKCkpOworICAgICAgICAgICAgICAgIGNhbC5hZGQoQ2FsZW5kYXIuSE9VUl9PRl9EQVksIERhdHVtRGVwZW5kZW50RHVyYXRpb24udGhpcy5nZXRIb3VycygpKTsKKyAgICAgICAgICAgICAgICBjYWwuYWRkKENhbGVuZGFyLk1JTlVURSwgRGF0dW1EZXBlbmRlbnREdXJhdGlvbi50aGlzLmdldE1pbnV0ZXMoKSk7CisgICAgICAgICAgICAgICAgY2FsLmFkZChDYWxlbmRhci5TRUNPTkQsIERhdHVtRGVwZW5kZW50RHVyYXRpb24udGhpcy5nZXRTZWNvbmRzKCkpOworICAgICAgICAgICAgICAgIGNhbC5hZGQoQ2FsZW5kYXIuTUlMTElTRUNPTkQsIERhdHVtRGVwZW5kZW50RHVyYXRpb24udGhpcy5nZXRNaWxsaXMoKSk7CisKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIFNxbERhdGUgc2hvdWxkIG5vdCByZWFsbHkgY2FyZSBhYm91dCB0aGVzZSB2YWx1ZXMgYnV0IGl0IHNlZW1zIHRvICJyZW1lbWJlciIgdGhlbQorICAgICAgICAgICAgICAgIC8vIHNvIHdlIGNsZWFyIHRoZW0uIFdlIGRvIHRoZSBhZGRzIGZpcnN0IGluIGNhc2Ugd2UgZ2V0IGNhcnJ5IGludG8gdGhlIGRheSBmaWVsZC4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIGNhbC5zZXQoQ2FsZW5kYXIuSE9VUl9PRl9EQVksIDApOworICAgICAgICAgICAgICAgIGNhbC5zZXQoQ2FsZW5kYXIuTUlOVVRFLCAwKTsKKyAgICAgICAgICAgICAgICBjYWwuc2V0KENhbGVuZGFyLlNFQ09ORCwgMCk7CisgICAgICAgICAgICAgICAgY2FsLnNldChDYWxlbmRhci5NSUxMSVNFQ09ORCwgMCk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGphdmEuc3FsLkRhdGUoY2FsLmdldFRpbWVJbk1pbGxpcygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3RpbWUvRHVyYXRpb24uamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdGltZS9EdXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmOTU4ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3RpbWUvRHVyYXRpb24uamF2YQpAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGdyb292eS50aW1lOworCitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworCisvKioKKyAqIEBhdXRob3IgSm9obiBXaWxzb24gdHVnQHdpbHNvbi5jby51aworICogCisgKiBEdXJhdGlvbiByZXByZXNlbnRzIHRpbWUgcGVyaW9kcyB3aGljaCBoYXZlIHZhbHVlcyBpbmRlcGVuZGFudCBvZiB0aGUgY29udGV4dC4KKyAqIFNvLCB3aGlsc3Qgd2UgY2FuJ3Qgc2F5IGhvdyBsb25nIGEgbW9udGggaXMgd2l0aG91dCBrbm93aW5nIHRoZSB5ZWFyIGFuZCB0aGUgbmFtZSBvZiB0aGUgbW9udGgsCisgKiB3ZSBrbm93IGhvdyBsb25nIGEgZGF5IGlzIGluZGVwZW5kYW50IG9mIHRoZSBkYXRlLgorICogCisgKiBUaGlzIGlzIG5vdCAxMDAlIHRydWUgZm9yIGRheXMuCisgKiBEYXlzIGNhbiBhY3R1YWxseSBiZSAyMywgMjQgb3IgMjUgaG91cnMgbG9uZyAoZHVlIHRvIGRheWxpZ2h0IHNhdmluZyBhZGp1c3RtZW50cykKKyAqIAorICogSWYgeW91IGFzayBEdXJhdGlvbiB0byBjb252ZXJ0IGl0c2VsZiB0byBtaWxsaXNlY29uZHMgdGhlbiBpdCB3aWxsIHdvcmsgb24gdGhlIGJhc2lzIG9mIDI0IGhvdXJzCisgKiBpbiBhIGRheS4gSWYgeW91IGFkZCBvciBzdWJ0cmFjdCBpdCBmcm9tIGEgZGF0ZSBpdCB3aWxsIHRha2UgZGF5bGlnaHQgc2F2aW5nIGludG8gYWNjb3VudC4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBEdXJhdGlvbiBleHRlbmRzIEJhc2VEdXJhdGlvbiB7CisgICAgcHVibGljIER1cmF0aW9uKGZpbmFsIGludCBkYXlzLCBmaW5hbCBpbnQgaG91cnMsIGZpbmFsIGludCBtaW51dGVzLCBmaW5hbCBpbnQgc2Vjb25kcywgZmluYWwgaW50IG1pbGxpcykgeworICAgICAgICBzdXBlcihkYXlzLCBob3VycywgbWludXRlcywgc2Vjb25kcywgbWlsbGlzKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIER1cmF0aW9uIHBsdXMoZmluYWwgRHVyYXRpb24gcmhzKSB7CisgICAgICAgIHJldHVybiBuZXcgRHVyYXRpb24odGhpcy5nZXREYXlzKCkgKyByaHMuZ2V0RGF5cygpLCB0aGlzLmdldEhvdXJzKCkgKyByaHMuZ2V0SG91cnMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldE1pbnV0ZXMoKSArIHJocy5nZXRNaW51dGVzKCksIHRoaXMuZ2V0U2Vjb25kcygpICsgcmhzLmdldFNlY29uZHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldE1pbGxpcygpICsgcmhzLmdldE1pbGxpcygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRHVyYXRpb24gcGx1cyhmaW5hbCBUaW1lRHVyYXRpb24gcmhzKSB7CisgICAgICAgIHJldHVybiByaHMucGx1cyh0aGlzKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIERhdHVtRGVwZW5kZW50RHVyYXRpb24gcGx1cyhmaW5hbCBEYXR1bURlcGVuZGVudER1cmF0aW9uIHJocykgeworICAgICAgICByZXR1cm4gcmhzLnBsdXModGhpcyk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBEdXJhdGlvbiBtaW51cyhmaW5hbCBEdXJhdGlvbiByaHMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEdXJhdGlvbih0aGlzLmdldERheXMoKSAtIHJocy5nZXREYXlzKCksIHRoaXMuZ2V0SG91cnMoKSAtIHJocy5nZXRIb3VycygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0TWludXRlcygpIC0gcmhzLmdldE1pbnV0ZXMoKSwgdGhpcy5nZXRTZWNvbmRzKCkgLSByaHMuZ2V0U2Vjb25kcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0TWlsbGlzKCkgLSByaHMuZ2V0TWlsbGlzKCkpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgVGltZUR1cmF0aW9uIG1pbnVzKGZpbmFsIFRpbWVEdXJhdGlvbiByaHMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUaW1lRHVyYXRpb24odGhpcy5nZXREYXlzKCkgLSByaHMuZ2V0RGF5cygpLCB0aGlzLmdldEhvdXJzKCkgLSByaHMuZ2V0SG91cnMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRNaW51dGVzKCkgLSByaHMuZ2V0TWludXRlcygpLCB0aGlzLmdldFNlY29uZHMoKSAtIHJocy5nZXRTZWNvbmRzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0TWlsbGlzKCkgLSByaHMuZ2V0TWlsbGlzKCkpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgRGF0dW1EZXBlbmRlbnREdXJhdGlvbiBtaW51cyhmaW5hbCBEYXR1bURlcGVuZGVudER1cmF0aW9uIHJocykgeworICAgICAgICByZXR1cm4gbmV3IERhdHVtRGVwZW5kZW50RHVyYXRpb24oLXJocy5nZXRZZWFycygpLCAtcmhzLmdldE1vbnRocygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXREYXlzKCkgLSByaHMuZ2V0RGF5cygpLCB0aGlzLmdldEhvdXJzKCkgLSByaHMuZ2V0SG91cnMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0TWludXRlcygpIC0gcmhzLmdldE1pbnV0ZXMoKSwgdGhpcy5nZXRTZWNvbmRzKCkgLSByaHMuZ2V0U2Vjb25kcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRNaWxsaXMoKSAtIHJocy5nZXRNaWxsaXMoKSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBUaW1lRGF0dW1EZXBlbmRlbnREdXJhdGlvbiBtaW51cyhmaW5hbCBUaW1lRGF0dW1EZXBlbmRlbnREdXJhdGlvbiByaHMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUaW1lRGF0dW1EZXBlbmRlbnREdXJhdGlvbigtcmhzLmdldFllYXJzKCksIC1yaHMuZ2V0TW9udGhzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXREYXlzKCkgLSByaHMuZ2V0RGF5cygpLCB0aGlzLmdldEhvdXJzKCkgLSByaHMuZ2V0SG91cnMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldE1pbnV0ZXMoKSAtIHJocy5nZXRNaW51dGVzKCksIHRoaXMuZ2V0U2Vjb25kcygpIC0gcmhzLmdldFNlY29uZHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldE1pbGxpcygpIC0gcmhzLmdldE1pbGxpcygpKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGxvbmcgdG9NaWxsaXNlY29uZHMoKSB7CisgICAgICAgIHJldHVybiAoKCgoKChsb25nKSh0aGlzLmdldERheXMoKSAqIDI0ICkgKyB0aGlzLmdldEhvdXJzKCkpICogNjAgKyB0aGlzLmdldE1pbnV0ZXMoKSkgKiA2MCkgKyB0aGlzLmdldFNlY29uZHMoKSkgKiAxMDAwKSArIHRoaXMuZ2V0TWlsbGlzKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBEYXRlIGdldEFnbygpIHsKKyAgICBmaW5hbCBDYWxlbmRhciBjYWwgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOworCisgICAgICAgIGNhbC5hZGQoQ2FsZW5kYXIuREFZX09GX1lFQVIsIC10aGlzLmdldERheXMoKSk7CisgICAgICAgIGNhbC5hZGQoQ2FsZW5kYXIuSE9VUl9PRl9EQVksIC10aGlzLmdldEhvdXJzKCkpOworICAgICAgICBjYWwuYWRkKENhbGVuZGFyLk1JTlVURSwgLXRoaXMuZ2V0TWludXRlcygpKTsKKyAgICAgICAgY2FsLmFkZChDYWxlbmRhci5TRUNPTkQsIC10aGlzLmdldFNlY29uZHMoKSk7CisgICAgICAgIGNhbC5hZGQoQ2FsZW5kYXIuTUlMTElTRUNPTkQsIC10aGlzLmdldE1pbGxpcygpKTsKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAvLworICAgICAgICAvLyBTcWxEYXRlIHNob3VsZCBub3QgcmVhbGx5IGNhcmUgYWJvdXQgdGhlc2UgdmFsdWVzIGJ1dCBpdCBzZWVtcyB0byAicmVtZW1iZXIiIHRoZW0KKyAgICAgICAgLy8gc28gd2UgY2xlYXIgdGhlbS4KKyAgICAgICAgLy8gV2UgZG8gdGhlIGFkZHMgZmlyc3QgaW5jYXNlIHdlIGdldCBjYXJyeSBpbnRvIHRoZSBkYXkgZmllbGQKKyAgICAgICAgLy8KKyAgICAgICAgY2FsLnNldChDYWxlbmRhci5IT1VSX09GX0RBWSwgMCk7CisgICAgICAgIGNhbC5zZXQoQ2FsZW5kYXIuTUlOVVRFLCAwKTsKKyAgICAgICAgY2FsLnNldChDYWxlbmRhci5TRUNPTkQsIDApOworICAgICAgICBjYWwuc2V0KENhbGVuZGFyLk1JTExJU0VDT05ELCAwKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBuZXcgamF2YS5zcWwuRGF0ZShjYWwuZ2V0VGltZUluTWlsbGlzKCkpOworICAgIH0KKyAgICAgCisgICAgcHVibGljIEZyb20gZ2V0RnJvbSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGcm9tKCkgeworICAgICAgICAgICAgcHVibGljIERhdGUgZ2V0Tm93KCkgeworICAgICAgICAgICAgZmluYWwgQ2FsZW5kYXIgY2FsID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKKworICAgICAgICAgICAgICAgIGNhbC5hZGQoQ2FsZW5kYXIuREFZX09GX1lFQVIsIER1cmF0aW9uLnRoaXMuZ2V0RGF5cygpKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIFNxbERhdGUgc2hvdWxkIG5vdCByZWFsbHkgY2FyZSBhYm91dCB0aGVzZSB2YWx1ZXMgYnV0IGl0IHNlZW1zIHRvICJyZW1lbWJlciIgdGhlbQorICAgICAgICAgICAgICAgIC8vIHNvIHdlIGNsZWFyIHRoZW0uCisgICAgICAgICAgICAgICAgLy8gV2UgZG8gdGhlIGFkZHMgZmlyc3QgaW5jYXNlIHdlIGdldCBjYXJyeSBpbnRvIHRoZSBkYXkgZmllbGQKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIGNhbC5zZXQoQ2FsZW5kYXIuSE9VUl9PRl9EQVksIDApOworICAgICAgICAgICAgICAgIGNhbC5zZXQoQ2FsZW5kYXIuTUlOVVRFLCAwKTsKKyAgICAgICAgICAgICAgICBjYWwuc2V0KENhbGVuZGFyLlNFQ09ORCwgMCk7CisgICAgICAgICAgICAgICAgY2FsLnNldChDYWxlbmRhci5NSUxMSVNFQ09ORCwgMCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBqYXZhLnNxbC5EYXRlKGNhbC5nZXRUaW1lSW5NaWxsaXMoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS90aW1lL1RpbWVEYXR1bURlcGVuZGVudER1cmF0aW9uLmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3RpbWUvVGltZURhdHVtRGVwZW5kZW50RHVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OThlMjJhCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS90aW1lL1RpbWVEYXR1bURlcGVuZGVudER1cmF0aW9uLmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGdyb292eS50aW1lOworCitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworCisvKioKKyAqIEBhdXRob3IgSm9obiBXaWxzb24gdHVnQHdpbHNvbi5jby51aworICogCisgKiBUaW1lRGF0dW1EdXJhdGlvbiByZXByZXNlbnRzIGEgdGltZSBwZXJpZCB3aGljaCByZXN1bHRzIGZyb20gYW4KKyAqIGFyaXRobWV0aWMgb3BlcmF0aW9uIGJldHdlZW4gYSBUaW1lRHVyYXRpb24gb2JqZWN0IGFuZCBhIERhdHVtRHVyYXRpb24gb2JqZWN0CisgKiAKKyAqLworcHVibGljIGNsYXNzIFRpbWVEYXR1bURlcGVuZGVudER1cmF0aW9uIGV4dGVuZHMgRGF0dW1EZXBlbmRlbnREdXJhdGlvbiB7CisgICAgcHVibGljIFRpbWVEYXR1bURlcGVuZGVudER1cmF0aW9uKGludCB5ZWFycywgaW50IG1vbnRocywgaW50IGRheXMsIGludCBob3VycywgaW50IG1pbnV0ZXMsIGludCBzZWNvbmRzLCBpbnQgbWlsbGlzKSB7CisgICAgICAgIHN1cGVyKHllYXJzLCBtb250aHMsIGRheXMsIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBtaWxsaXMpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgRGF0dW1EZXBlbmRlbnREdXJhdGlvbiBwbHVzKGZpbmFsIER1cmF0aW9uIHJocykgeworICAgICAgICByZXR1cm4gbmV3IFRpbWVEYXR1bURlcGVuZGVudER1cmF0aW9uKHRoaXMuZ2V0WWVhcnMoKSwgdGhpcy5nZXRNb250aHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldERheXMoKSArIHJocy5nZXREYXlzKCksIHRoaXMuZ2V0SG91cnMoKSArIHJocy5nZXRIb3VycygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0TWludXRlcygpICsgcmhzLmdldE1pbnV0ZXMoKSwgdGhpcy5nZXRTZWNvbmRzKCkgKyByaHMuZ2V0U2Vjb25kcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0TWlsbGlzKCkgKyByaHMuZ2V0TWlsbGlzKCkpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgRGF0dW1EZXBlbmRlbnREdXJhdGlvbiBwbHVzKGZpbmFsIERhdHVtRGVwZW5kZW50RHVyYXRpb24gcmhzKSB7CisgICAgICAgIHJldHVybiBuZXcgVGltZURhdHVtRGVwZW5kZW50RHVyYXRpb24odGhpcy5nZXRZZWFycygpICsgcmhzLmdldFllYXJzKCksIHRoaXMuZ2V0TW9udGhzKCkgKyByaHMuZ2V0TW9udGhzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXREYXlzKCkgKyByaHMuZ2V0RGF5cygpLCB0aGlzLmdldEhvdXJzKCkgKyByaHMuZ2V0SG91cnMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldE1pbnV0ZXMoKSArIHJocy5nZXRNaW51dGVzKCksIHRoaXMuZ2V0U2Vjb25kcygpICsgcmhzLmdldFNlY29uZHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldE1pbGxpcygpICsgcmhzLmdldE1pbGxpcygpKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIERhdHVtRGVwZW5kZW50RHVyYXRpb24gbWludXMoZmluYWwgRHVyYXRpb24gcmhzKSB7CisgICAgICAgIHJldHVybiBuZXcgVGltZURhdHVtRGVwZW5kZW50RHVyYXRpb24odGhpcy5nZXRZZWFycygpLCB0aGlzLmdldE1vbnRocygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0RGF5cygpIC0gcmhzLmdldERheXMoKSwgdGhpcy5nZXRIb3VycygpIC0gcmhzLmdldEhvdXJzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRNaW51dGVzKCkgLSByaHMuZ2V0TWludXRlcygpLCB0aGlzLmdldFNlY29uZHMoKSAtIHJocy5nZXRTZWNvbmRzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRNaWxsaXMoKSAtIHJocy5nZXRNaWxsaXMoKSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBEYXR1bURlcGVuZGVudER1cmF0aW9uIG1pbnVzKGZpbmFsIERhdHVtRGVwZW5kZW50RHVyYXRpb24gcmhzKSB7CisgICAgICAgIHJldHVybiBuZXcgVGltZURhdHVtRGVwZW5kZW50RHVyYXRpb24odGhpcy5nZXRZZWFycygpIC0gcmhzLmdldFllYXJzKCksIHRoaXMuZ2V0TW9udGhzKCkgLSByaHMuZ2V0TW9udGhzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXREYXlzKCkgLSByaHMuZ2V0RGF5cygpLCB0aGlzLmdldEhvdXJzKCkgLSByaHMuZ2V0SG91cnMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldE1pbnV0ZXMoKSAtIHJocy5nZXRNaW51dGVzKCksIHRoaXMuZ2V0U2Vjb25kcygpIC0gcmhzLmdldFNlY29uZHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldE1pbGxpcygpIC0gcmhzLmdldE1pbGxpcygpKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIEZyb20gZ2V0RnJvbSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGcm9tKCkgeworICAgICAgICAgICAgcHVibGljIERhdGUgZ2V0Tm93KCkgeworICAgICAgICAgICAgZmluYWwgQ2FsZW5kYXIgY2FsID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKKworICAgICAgICAgICAgICAgIGNhbC5hZGQoQ2FsZW5kYXIuWUVBUiwgVGltZURhdHVtRGVwZW5kZW50RHVyYXRpb24udGhpcy5nZXRZZWFycygpKTsKKyAgICAgICAgICAgICAgICBjYWwuYWRkKENhbGVuZGFyLk1PTlRILCBUaW1lRGF0dW1EZXBlbmRlbnREdXJhdGlvbi50aGlzLmdldE1vbnRocygpKTsKKyAgICAgICAgICAgICAgICBjYWwuYWRkKENhbGVuZGFyLkRBWV9PRl9ZRUFSLCBUaW1lRGF0dW1EZXBlbmRlbnREdXJhdGlvbi50aGlzLmdldERheXMoKSk7CisgICAgICAgICAgICAgICAgY2FsLmFkZChDYWxlbmRhci5IT1VSX09GX0RBWSwgVGltZURhdHVtRGVwZW5kZW50RHVyYXRpb24udGhpcy5nZXRIb3VycygpKTsKKyAgICAgICAgICAgICAgICBjYWwuYWRkKENhbGVuZGFyLk1JTlVURSwgVGltZURhdHVtRGVwZW5kZW50RHVyYXRpb24udGhpcy5nZXRNaW51dGVzKCkpOworICAgICAgICAgICAgICAgIGNhbC5hZGQoQ2FsZW5kYXIuU0VDT05ELCBUaW1lRGF0dW1EZXBlbmRlbnREdXJhdGlvbi50aGlzLmdldFNlY29uZHMoKSk7CisgICAgICAgICAgICAgICAgY2FsLmFkZChDYWxlbmRhci5NSUxMSVNFQ09ORCwgVGltZURhdHVtRGVwZW5kZW50RHVyYXRpb24udGhpcy5nZXRNaWxsaXMoKSk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgcmV0dXJuIGNhbC5nZXRUaW1lKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3RpbWUvVGltZUR1cmF0aW9uLmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3RpbWUvVGltZUR1cmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY3ZjFlNwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdGltZS9UaW1lRHVyYXRpb24uamF2YQpAQCAtMCwwICsxLDg3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgZ3Jvb3Z5LnRpbWU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CisKKy8qKgorICogQGF1dGhvciBKb2huIFdpbHNvbiB0dWdAd2lsc29uLmNvLnVrCisgKiAKKyAqIFRpbWVEdXJhdGlvbiByZXByZXNlbnRzIHRpbWUgcGVyaW9kcyBleHByZXNzZWQgaW4gdW5pdHMgb2YgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMgYW5kIG1pbGxpc2Vjb25kcy4KKyAqIAorICogV2hpbHN0IHdlIGNhbid0IHNheSBob3cgbG9uZyBhIG1vbnRoIGlzIHdpdGhvdXQga25vd2luZyB0aGUgeWVhciBhbmQgdGhlIG5hbWUgb2YgdGhlIG1vbnRoLAorICogd2Uga25vdyBob3cgbG9uZyBhIHNlY29uZCBpcyBpbmRlcGVuZGFudCBvZiB0aGUgZGF0ZS4KKyAqIAorICogVGhpcyBpcyBub3QgMTAwJSB0cnVlIGZvciBtaW51dGVzLgorICogTWludXRlcyBjYW4gYmUgNTksIDYwIG9yIDYxIHNlY29uZHMgbG9uZyAoZHVlIHRvIGxlYXAgc2Vjb25kcykKKyAqIAorICogSWYgeW91IGFzayBEdXJhdGlvbiB0byBjb252ZXJ0IGl0c2VsZiB0byBtaWxsaXNlY29uZHMgdGhlbiBpdCB3aWxsIHdvcmsgb24gdGhlIGJhc2lzIG9mIDYwIHNlY29uZHMgaW4gYSBtaW51dGUuCisgKiBJZiB5b3UgYWRkIG9yIHN1YnRyYWN0IGl0IGZyb20gYSBkYXRlIGl0IHdpbGwgdGFrZSBsZWFwIHNlY29uZHMgaW50byBhY2NvdW50CisgKgorICovCisKK3B1YmxpYyBjbGFzcyBUaW1lRHVyYXRpb24gZXh0ZW5kcyBEdXJhdGlvbiB7CisgICAgcHVibGljIFRpbWVEdXJhdGlvbihmaW5hbCBpbnQgaG91cnMsIGZpbmFsIGludCBtaW51dGVzLCBmaW5hbCBpbnQgc2Vjb25kcywgZmluYWwgaW50IG1pbGxpcykgeworICAgICAgICBzdXBlcigwLCBob3VycywgbWludXRlcywgc2Vjb25kcywgbWlsbGlzKTsKKyAgICAgfQorICAgIAorICAgIHB1YmxpYyBUaW1lRHVyYXRpb24oZmluYWwgaW50IGRheXMsIGZpbmFsIGludCBob3VycywgZmluYWwgaW50IG1pbnV0ZXMsIGZpbmFsIGludCBzZWNvbmRzLCBmaW5hbCBpbnQgbWlsbGlzKSB7CisgICAgICAgIHN1cGVyKGRheXMsIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBtaWxsaXMpOworICAgICB9CisgICAgCisgICAgcHVibGljIER1cmF0aW9uIHBsdXMoZmluYWwgRHVyYXRpb24gcmhzKSB7CisgICAgICAgIHJldHVybiBuZXcgVGltZUR1cmF0aW9uKHRoaXMuZ2V0RGF5cygpICsgcmhzLmdldERheXMoKSwgdGhpcy5nZXRIb3VycygpICsgcmhzLmdldEhvdXJzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0TWludXRlcygpICsgcmhzLmdldE1pbnV0ZXMoKSwgdGhpcy5nZXRTZWNvbmRzKCkgKyByaHMuZ2V0U2Vjb25kcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldE1pbGxpcygpICsgcmhzLmdldE1pbGxpcygpKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIERhdHVtRGVwZW5kZW50RHVyYXRpb24gcGx1cyhmaW5hbCBEYXR1bURlcGVuZGVudER1cmF0aW9uIHJocykgeworICAgICAgICByZXR1cm4gbmV3IFRpbWVEYXR1bURlcGVuZGVudER1cmF0aW9uKHJocy5nZXRZZWFycygpLCByaHMuZ2V0TW9udGhzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXREYXlzKCkgKyByaHMuZ2V0RGF5cygpLCB0aGlzLmdldEhvdXJzKCkgKyByaHMuZ2V0SG91cnMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldE1pbnV0ZXMoKSArIHJocy5nZXRNaW51dGVzKCksIHRoaXMuZ2V0U2Vjb25kcygpICsgcmhzLmdldFNlY29uZHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldE1pbGxpcygpICsgcmhzLmdldE1pbGxpcygpKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIER1cmF0aW9uIG1pbnVzKGZpbmFsIER1cmF0aW9uIHJocykgeworICAgICAgICByZXR1cm4gbmV3IFRpbWVEdXJhdGlvbih0aGlzLmdldERheXMoKSAtIHJocy5nZXREYXlzKCksIHRoaXMuZ2V0SG91cnMoKSAtIHJocy5nZXRIb3VycygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldE1pbnV0ZXMoKSAtIHJocy5nZXRNaW51dGVzKCksIHRoaXMuZ2V0U2Vjb25kcygpIC0gcmhzLmdldFNlY29uZHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRNaWxsaXMoKSAtIHJocy5nZXRNaWxsaXMoKSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBEYXR1bURlcGVuZGVudER1cmF0aW9uIG1pbnVzKGZpbmFsIERhdHVtRGVwZW5kZW50RHVyYXRpb24gcmhzKSB7CisgICAgICAgIHJldHVybiBuZXcgVGltZURhdHVtRGVwZW5kZW50RHVyYXRpb24oLXJocy5nZXRZZWFycygpLCAtcmhzLmdldE1vbnRocygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0RGF5cygpIC0gcmhzLmdldERheXMoKSwgdGhpcy5nZXRIb3VycygpIC0gcmhzLmdldEhvdXJzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRNaW51dGVzKCkgLSByaHMuZ2V0TWludXRlcygpLCB0aGlzLmdldFNlY29uZHMoKSAtIHJocy5nZXRTZWNvbmRzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRNaWxsaXMoKSAtIHJocy5nZXRNaWxsaXMoKSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBGcm9tIGdldEZyb20oKSB7CisgICAgICAgIHJldHVybiBuZXcgRnJvbSgpIHsKKyAgICAgICAgICAgIHB1YmxpYyBEYXRlIGdldE5vdygpIHsKKyAgICAgICAgICAgIGZpbmFsIENhbGVuZGFyIGNhbCA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7CisKKyAgICAgICAgICAgICAgICBjYWwuYWRkKENhbGVuZGFyLkRBWV9PRl9ZRUFSLCBUaW1lRHVyYXRpb24udGhpcy5nZXREYXlzKCkpOworICAgICAgICAgICAgICAgIGNhbC5hZGQoQ2FsZW5kYXIuSE9VUl9PRl9EQVksIFRpbWVEdXJhdGlvbi50aGlzLmdldEhvdXJzKCkpOworICAgICAgICAgICAgICAgIGNhbC5hZGQoQ2FsZW5kYXIuTUlOVVRFLCBUaW1lRHVyYXRpb24udGhpcy5nZXRNaW51dGVzKCkpOworICAgICAgICAgICAgICAgIGNhbC5hZGQoQ2FsZW5kYXIuU0VDT05ELCBUaW1lRHVyYXRpb24udGhpcy5nZXRTZWNvbmRzKCkpOworICAgICAgICAgICAgICAgIGNhbC5hZGQoQ2FsZW5kYXIuTUlMTElTRUNPTkQsIFRpbWVEdXJhdGlvbi50aGlzLmdldE1pbGxpcygpKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICByZXR1cm4gY2FsLmdldFRpbWUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3RpbWUvcGFja2FnZS5odG1sIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS90aW1lL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGY2OTU4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS90aW1lL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDEwIEBACis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPHRpdGxlPnBhY2thZ2UgZ3Jvb3Z5LnRpbWUuKjwvdGl0bGU+CisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgPHA+CisgICAgICBUaW1lQ2F0ZWdvcnkgcmVsYXRlZCBjbGFzc2VzCisgICAgPC9wPgorICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3VpL0NvbnNvbGUuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS9Db25zb2xlLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmRkMjMzCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS9Db25zb2xlLmdyb292eQpAQCAtMCwwICsxLDY2MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGdyb292eS51aQorCitpbXBvcnQgZ3Jvb3Z5Lmluc3BlY3Quc3dpbmd1aS5PYmplY3RCcm93c2VyCitpbXBvcnQgZ3Jvb3Z5LnN3aW5nLlN3aW5nQnVpbGRlcgoraW1wb3J0IGdyb292eS51aS5Db25zb2xlVGV4dEVkaXRvcgoraW1wb3J0IGdyb292eS51aS5TeXN0ZW1PdXRwdXRJbnRlcmNlcHRvcgoraW1wb3J0IGdyb292eS51aS50ZXh0LkZpbmRSZXBsYWNlVXRpbGl0eQoraW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudAoraW1wb3J0IGphdmEuYXd0LkV2ZW50UXVldWUKK2ltcG9ydCBqYXZhLmF3dC5Gb250CitpbXBvcnQgamF2YS5hd3QuVG9vbGtpdAoraW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50CitpbXBvcnQgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzCitpbXBvcnQgamF2YXguc3dpbmcuKgoraW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNhcmV0RXZlbnQKK2ltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DYXJldExpc3RlbmVyCitpbXBvcnQgamF2YXguc3dpbmcudGV4dC5FbGVtZW50CitpbXBvcnQgamF2YXguc3dpbmcudGV4dC5TdHlsZQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5JbnZva2VySGVscGVyCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLlN0YWNrVHJhY2VVdGlscworCisvKioKKyAqIEdyb292eSBTd2luZyBjb25zb2xlLgorICoKKyAqIEFsbG93cyB1c2VyIHRvIGludGVyYWN0aXZlbHkgZW50ZXIgYW5kIGV4ZWN1dGUgR3Jvb3Z5LgorICoKKyAqIEB2ZXJzaW9uICRJZCQKKyAqIEBhdXRob3IgRGFubm8gRmVycmluCisgKiBAYXV0aG9yIERpZXJrIEtvZW5pZywgY2hhbmdlZCBMYXlvdXQsIGluY2x1ZGVkIFNlbGVjdGlvbiBzZW5zaXRpdml0eSwgaW5jbHVkZWQgT2JqZWN0QnJvd3NlcgorICogQGF1dGhvciBBbGFuIEdyZWVuIG1vcmUgZmVhdHVyZXM6IGhpc3RvcnksIFN5c3RlbS5vdXQgY2FwdHVyZSwgYmluZCByZXN1bHQgdG8gXworICovCitjbGFzcyBDb25zb2xlIGltcGxlbWVudHMgQ2FyZXRMaXN0ZW5lciB7CisKKyAgICBwcml2YXRlIHByZWZzID0gUHJlZmVyZW5jZXMudXNlck5vZGVGb3JQYWNrYWdlKENvbnNvbGUpCisKKyAgICAvLyBXaGV0aGVyIG9yIG5vdCBzdGQgb3V0cHV0IHNob3VsZCBiZSBjYXB0dXJlZCB0byB0aGUgY29uc29sZQorICAgIGJvb2xlYW4gY2FwdHVyZVN0ZE91dCA9IHByZWZzLmdldEJvb2xlYW4oJ2NhcHR1cmVTdGRPdXQnLCB0cnVlKQorCisgICAgYm9vbGVhbiBmdWxsU3RhY2tUcmFjZXMgPSBwcmVmcy5nZXRCb29sZWFuKCdmdWxsU3RhY2tUcmFjZXMnLAorICAgICAgICBCb29sZWFuLnZhbHVlT2YoU3lzdGVtLmdldFByb3BlcnR5KCJncm9vdnkuZnVsbC5zdGFja3RyYWNlIiwgImZhbHNlIikpKQorICAgIEFjdGlvbiBmdWxsU3RhY2tUcmFjZXNBY3Rpb24KKworICAgIGJvb2xlYW4gc2hvd1Rvb2xiYXIgPSBwcmVmcy5nZXRCb29sZWFuKCdzaG93VG9vbGJhcicsIHRydWUpCisgICAgQ29tcG9uZW50IHRvb2xiYXIKKyAgICBBY3Rpb24gc2hvd1Rvb2xiYXJBY3Rpb24KKworICAgIC8vIE1heGltdW0gc2l6ZSBvZiBoaXN0b3J5CisgICAgaW50IG1heEhpc3RvcnkgPSAxMAorCisgICAgLy8gTWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBzaG93IG9uIGNvbnNvbGUgYXQgYW55IHRpbWUKKyAgICBpbnQgbWF4T3V0cHV0Q2hhcnMgPSAyMDAwMAorCisgICAgLy8gVUkKKyAgICBTd2luZ0J1aWxkZXIgc3dpbmcKKyAgICBKRnJhbWUgZnJhbWUKKyAgICBDb25zb2xlVGV4dEVkaXRvciBpbnB1dEVkaXRvcgorICAgIEpUZXh0UGFuZSBpbnB1dEFyZWEKKyAgICBKVGV4dFBhbmUgb3V0cHV0QXJlYQorICAgIEpMYWJlbCBzdGF0dXNMYWJlbAorICAgIEpEaWFsb2cgcnVuV2FpdERpYWxvZworICAgIEpMYWJlbCByb3dOdW1BbmRDb2xOdW0KKworICAgIC8vIHJvdyBpbmZvCisgICAgRWxlbWVudCByb290RWxlbWVudAorICAgIGludCBjdXJzb3JQb3MKKyAgICBpbnQgcm93TnVtCisgICAgaW50IGNvbE51bQorCisgICAgLy8gU3R5bGVzIGZvciBvdXRwdXQgYXJlYQorICAgIFN0eWxlIHByb21wdFN0eWxlCisgICAgU3R5bGUgY29tbWFuZFN0eWxlCisgICAgU3R5bGUgb3V0cHV0U3R5bGUKKyAgICBTdHlsZSByZXN1bHRTdHlsZQorCisgICAgLy8gSW50ZXJuYWwgaGlzdG9yeQorICAgIExpc3QgaGlzdG9yeSA9IFtdCisgICAgaW50IGhpc3RvcnlJbmRleCA9IDEgLy8gdmFsaWQgdmFsdWVzIGFyZSAwLi5oaXN0b3J5Lmxlbmd0aCgpCisgICAgSGlzdG9yeVJlY29yZCBwZW5kaW5nUmVjb3JkID0gbmV3IEhpc3RvcnlSZWNvcmQoIGFsbFRleHQ6ICIiLCBzZWxlY3Rpb25TdGFydDogMCwgc2VsZWN0aW9uRW5kOiAwKQorICAgIEFjdGlvbiBwcmV2SGlzdG9yeUFjdGlvbgorICAgIEFjdGlvbiBuZXh0SGlzdG9yeUFjdGlvbgorCisgICAgLy8gQ3VycmVudCBlZGl0b3Igc3RhdGUKKyAgICBib29sZWFuIGRpcnR5CisgICAgQWN0aW9uIHNhdmVBY3Rpb24KKyAgICBpbnQgdGV4dFNlbGVjdGlvblN0YXJ0ICAvLyBrZWVwIHRyYWNrIG9mIHNlbGVjdGlvbnMgaW4gaW5wdXRBcmVhCisgICAgaW50IHRleHRTZWxlY3Rpb25FbmQKKyAgICBkZWYgc2NyaXB0RmlsZQorICAgIEZpbGUgY3VycmVudEZpbGVDaG9vc2VyRGlyID0gbmV3IEZpbGUoUHJlZmVyZW5jZXMudXNlck5vZGVGb3JQYWNrYWdlKENvbnNvbGUpLmdldCgnY3VycmVudEZpbGVDaG9vc2VyRGlyJywgJy4nKSkKKworICAgIC8vIFJ1bm5pbmcgc2NyaXB0cworICAgIEdyb292eVNoZWxsIHNoZWxsCisgICAgaW50IHNjcmlwdE5hbWVDb3VudGVyID0gMAorICAgIFN5c3RlbU91dHB1dEludGVyY2VwdG9yIHN5c3RlbU91dEludGVyY2VwdG9yCisgICAgZGVmIHJ1blRocmVhZCA9IG51bGwKKyAgICBDbG9zdXJlIGJlZm9yZUV4ZWN1dGlvbgorICAgIENsb3N1cmUgYWZ0ZXJFeGVjdXRpb24KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElDT05fUEFUSCA9ICcvZ3Jvb3Z5L3VpL0NvbnNvbGVJY29uLnBuZycgLy8gdXNlZCBieSBPYmplY3RCcm93c2VyIHRvbworCisgICAgc3RhdGljIHZvaWQgbWFpbihhcmdzKSB7CisgICAgICAgIC8vIGFsbG93IHRoZSBmdWxsIHN0YWNrIHRyYWNlcyB0byBidWJibGUgdXAgdG8gdGhlIHJvb3QgbG9nZ2VyCisgICAgICAgIGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlci5nZXRMb2dnZXIoU3RhY2tUcmFjZVV0aWxzLlNUQUNLX0xPR19OQU1FKS51c2VQYXJlbnRIYW5kbGVycyA9IHRydWUKKworICAgICAgICAvL3doZW4gc3RhcnRpbmcgdmlhIG1haW4gc2V0IHRoZSBsb29rIGFuZCBmZWVsIHRvIHN5c3RlbQorICAgICAgICBVSU1hbmFnZXIuc2V0TG9va0FuZEZlZWwoVUlNYW5hZ2VyLmdldFN5c3RlbUxvb2tBbmRGZWVsQ2xhc3NOYW1lKCkpOyAKKworICAgICAgICBkZWYgY29uc29sZSA9IG5ldyBDb25zb2xlKCkKKyAgICAgICAgY29uc29sZS5ydW4oKQorICAgIH0KKworICAgIENvbnNvbGUoKSB7CisgICAgICAgIHRoaXMobmV3IEJpbmRpbmcoKSkKKyAgICB9CisKKyAgICBDb25zb2xlKEJpbmRpbmcgYmluZGluZykgeworICAgICAgICB0aGlzKG51bGwsIGJpbmRpbmcpCisgICAgfQorCisgICAgQ29uc29sZShDbGFzc0xvYWRlciBwYXJlbnQsIEJpbmRpbmcgYmluZGluZykgeworICAgICAgICBzaGVsbCA9IG5ldyBHcm9vdnlTaGVsbChwYXJlbnQsYmluZGluZykKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiZ3Jvb3Z5LmZ1bGwuc3RhY2t0cmFjZSIsCisgICAgICAgICAgICAgICAgQm9vbGVhbi50b1N0cmluZyhCb29sZWFuLnZhbHVlT2YoU3lzdGVtLmdldFByb3BlcnR5KCJncm9vdnkuZnVsbC5zdGFja3RyYWNlIiwgImZhbHNlIikpKSkKKyAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gc2UpIHsKKyAgICAgICAgICAgIGZ1bGxTdGFja1RyYWNlc0FjdGlvbi5lbmFibGVkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHJ1bigpIHsKKyAgICAgICAgc3dpbmcgPSBuZXcgU3dpbmdCdWlsZGVyKCkKKworICAgICAgICAvLyB0d2VhayB3aGF0IHRoZSBzdGFjayB0cmFjZXMgZmlsdGVyIG91dCB0byBiZSBmYWlybHkgYnJvYWQKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJncm9vdnkuc2FuaXRpemVkLnN0YWNrdHJhY2VzIiwgIiIib3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLgorICAgICAgICAgICAgICAgIG9yZy5jb2RlaGF1cy5ncm9vdnkuCisgICAgICAgICAgICAgICAgZ3Jvb3Z5LmxhbmcuCisgICAgICAgICAgICAgICAgZ2pkay5ncm9vdnkubGFuZy4KKyAgICAgICAgICAgICAgICBzdW4uCisgICAgICAgICAgICAgICAgamF2YS5sYW5nLnJlZmxlY3QuCisgICAgICAgICAgICAgICAgamF2YS5sYW5nLlRocmVhZAorICAgICAgICAgICAgICAgIGdyb292eS51aS5Db25zb2xlIiIiKQorCisKKyAgICAgICAgLy8gYWRkIGNvbnRyb2xsZXIgdG8gdGhlIHN3aW5nQnVpbGRlciBiaW5kaW5ncworICAgICAgICBzd2luZy5jb250cm9sbGVyID0gdGhpcworCisgICAgICAgIC8vIGNyZWF0ZSB0aGUgYWN0aW9ucworICAgICAgICBzd2luZy5idWlsZChDb25zb2xlQWN0aW9ucykKKworICAgICAgICAvLyBjcmVhdGUgdGhlIHZpZXcKKyAgICAgICAgc3dpbmcuYnVpbGQoQ29uc29sZVZpZXcpCisKKyAgICAgICAgYmluZFJlc3VsdHMoKQorCisgICAgICAgIC8vIHN0aXRjaCBzb21lIGFjdGlvbnMgdG9nZWF0aGVyCisgICAgICAgIHN3aW5nLmJpbmQoc291cmNlOnN3aW5nLmlucHV0RWRpdG9yLnVuZG9BY3Rpb24sIHNvdXJjZVByb3BlcnR5OidlbmFibGVkJywgdGFyZ2V0OnN3aW5nLnVuZG9BY3Rpb24sIHRhcmdldFByb3BlcnR5OidlbmFibGVkJykKKyAgICAgICAgc3dpbmcuYmluZChzb3VyY2U6c3dpbmcuaW5wdXRFZGl0b3IucmVkb0FjdGlvbiwgc291cmNlUHJvcGVydHk6J2VuYWJsZWQnLCB0YXJnZXQ6c3dpbmcucmVkb0FjdGlvbiwgdGFyZ2V0UHJvcGVydHk6J2VuYWJsZWQnKQorCisgICAgICAgIHN3aW5nLmNvbnNvbGVGcmFtZS5wYWNrKCkKKyAgICAgICAgc3dpbmcuY29uc29sZUZyYW1lLnNob3coKQorICAgICAgICBpbnN0YWxsSW50ZXJjZXB0b3IoKQorICAgICAgICBzd2luZy5kb0xhdGVyIGlucHV0QXJlYS4mcmVxdWVzdEZvY3VzCisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBpbnN0YWxsSW50ZXJjZXB0b3IoKSB7CisgICAgICAgIHN5c3RlbU91dEludGVyY2VwdG9yID0gbmV3IFN5c3RlbU91dHB1dEludGVyY2VwdG9yKHRoaXMuJm5vdGlmeVN5c3RlbU91dCkKKyAgICAgICAgc3lzdGVtT3V0SW50ZXJjZXB0b3Iuc3RhcnQoKQorICAgIH0KKworICAgIHZvaWQgYWRkVG9IaXN0b3J5KHJlY29yZCkgeworICAgICAgICBoaXN0b3J5LmFkZChyZWNvcmQpCisgICAgICAgIC8vIGhpc3Rvcnkuc2l6ZSBoZXJlIGp1c3QgcmV0cmlldmVzIG1ldGhvZCBjbG9zdXJlCisgICAgICAgIGlmIChoaXN0b3J5LnNpemUoKSA+IG1heEhpc3RvcnkpIHsKKyAgICAgICAgICAgIGhpc3RvcnkucmVtb3ZlKDApCisgICAgICAgIH0KKyAgICAgICAgLy8gaGlzdG9yeS5zaXplIGRvZXNuJ3Qgd29yayBoZXJlIGVpdGhlcgorICAgICAgICBoaXN0b3J5SW5kZXggPSBoaXN0b3J5LnNpemUoKQorICAgICAgICB1cGRhdGVIaXN0b3J5QWN0aW9ucygpCisgICAgfQorCisgICAgLy8gQXBwZW5kIGEgc3RyaW5nIHRvIHRoZSBvdXRwdXQgYXJlYQorICAgIHZvaWQgYXBwZW5kT3V0cHV0KHRleHQsIHN0eWxlKXsKKyAgICAgICAgZGVmIGRvYyA9IG91dHB1dEFyZWEuc3R5bGVkRG9jdW1lbnQKKyAgICAgICAgZG9jLmluc2VydFN0cmluZyhkb2MubGVuZ3RoLCB0ZXh0LCBzdHlsZSkKKworICAgICAgICAvLyBFbnN1cmUgd2UgZG9uJ3QgaGF2ZSB0b28gbXVjaCBpbiBjb25zb2xlICh0YWtlcyB0b28gbXVjaCBtZW1vcnkpCisgICAgICAgIGlmIChkb2MubGVuZ3RoID4gbWF4T3V0cHV0Q2hhcnMpIHsKKyAgICAgICAgICAgIGRvYy5yZW1vdmUoMCwgZG9jLmxlbmd0aCAtIG1heE91dHB1dENoYXJzKQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gQXBwZW5kIGEgc3RyaW5nIHRvIHRoZSBvdXRwdXQgYXJlYSBvbiBhIG5ldyBsaW5lCisgICAgdm9pZCBhcHBlbmRPdXRwdXRObCh0ZXh0LCBzdHlsZSl7CisgICAgICAgIGRlZiBkb2MgPSBvdXRwdXRBcmVhLnN0eWxlZERvY3VtZW50CisgICAgICAgIGRlZiBsZW4gPSBkb2MubGVuZ3RoCisgICAgICAgIGlmIChsZW4gPiAwICYmIGRvYy5nZXRUZXh0KGxlbiAtIDEsIDEpICE9ICJcbiIpIHsKKyAgICAgICAgICAgIGFwcGVuZE91dHB1dCgiXG4iLCBzdHlsZSkKKyAgICAgICAgfQorICAgICAgICBhcHBlbmRPdXRwdXQodGV4dCwgc3R5bGUpCisgICAgfQorCisgICAgLy8gUmV0dXJuIGZhbHNlIGlmIHVzZSBlbGVjdGVkIHRvIGNhbmNlbAorICAgIGJvb2xlYW4gYXNrVG9TYXZlRmlsZSgpIHsKKyAgICAgICAgaWYgKHNjcmlwdEZpbGUgPT0gbnVsbCB8fCAhZGlydHkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlCisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChKT3B0aW9uUGFuZS5zaG93Q29uZmlybURpYWxvZyhmcmFtZSwKKyAgICAgICAgICAgICJTYXZlIGNoYW5nZXMgdG8gIiArIHNjcmlwdEZpbGUubmFtZSArICI/IiwKKyAgICAgICAgICAgICJHcm9vdnlDb25zb2xlIiwgSk9wdGlvblBhbmUuWUVTX05PX0NBTkNFTF9PUFRJT04pKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEpPcHRpb25QYW5lLllFU19PUFRJT046CisgICAgICAgICAgICAgICAgcmV0dXJuIGZpbGVTYXZlKCkKKyAgICAgICAgICAgIGNhc2UgSk9wdGlvblBhbmUuTk9fT1BUSU9OOgorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZQorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBiZWVwKCkgeworICAgICAgICBUb29sa2l0LmRlZmF1bHRUb29sa2l0LmJlZXAoKQorICAgIH0KKworICAgIC8vIEJpbmRzIHRoZSAiXyIgYW5kICJfXyIgdmFyaWFibGVzIGluIHRoZSBzaGVsbAorICAgIHZvaWQgYmluZFJlc3VsdHMoKSB7CisgICAgICAgIHNoZWxsLnNldFZhcmlhYmxlKCJfIiwgZ2V0TGFzdFJlc3VsdCgpKSAvLyBsYXN0UmVzdWx0IGRvZXNuJ3Qgc2VlbSB0byB3b3JrCisgICAgICAgIHNoZWxsLnNldFZhcmlhYmxlKCJfXyIsIGhpc3RvcnkuY29sbGVjdCB7aXQucmVzdWx0fSkKKyAgICB9CisKKyAgICAvLyBIYW5kbGVzIG1lbnUgZXZlbnQKKyAgICB2b2lkIGNhcHR1cmVTdGRPdXQoRXZlbnRPYmplY3QgZXZ0KSB7CisgICAgICAgIGNhcHR1cmVTdGRPdXQgPSBldnQuc291cmNlLnNlbGVjdGVkCisgICAgICAgIHByZWZzLnB1dEJvb2xlYW4oJ2NhcHR1cmVTdGRPdXQnLCBjYXB0dXJlU3RkT3V0KQorICAgIH0KKworICAgIHZvaWQgZnVsbFN0YWNrVHJhY2VzKEV2ZW50T2JqZWN0IGV2dCkgeworICAgICAgICBmdWxsU3RhY2tUcmFjZXMgPSBldnQuc291cmNlLnNlbGVjdGVkCisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiZ3Jvb3Z5LmZ1bGwuc3RhY2t0cmFjZSIsCisgICAgICAgICAgICBCb29sZWFuLnRvU3RyaW5nKGZ1bGxTdGFja1RyYWNlcykpCisgICAgICAgIHByZWZzLnB1dEJvb2xlYW4oJ2Z1bGxTdGFja1RyYWNlcycsIGZ1bGxTdGFja1RyYWNlcykKKyAgICB9CisKKyAgICB2b2lkIHNob3dUb29sYmFyKEV2ZW50T2JqZWN0IGV2dCkgeworICAgICAgICBzaG93VG9vbGJhciA9IGV2dC5zb3VyY2Uuc2VsZWN0ZWQKKyAgICAgICAgcHJlZnMucHV0Qm9vbGVhbignc2hvd1Rvb2xiYXInLCBzaG93VG9vbGJhcikKKyAgICAgICAgdG9vbGJhci52aXNpYmxlID0gc2hvd1Rvb2xiYXIKKyAgICB9CisKKyAgICB2b2lkIGNhcmV0VXBkYXRlKENhcmV0RXZlbnQgZSl7CisgICAgICAgIHRleHRTZWxlY3Rpb25TdGFydCA9IE1hdGgubWluKGUuZG90LGUubWFyaykKKyAgICAgICAgdGV4dFNlbGVjdGlvbkVuZCA9IE1hdGgubWF4KGUuZG90LGUubWFyaykKKworICAgICAgICBzZXRSb3dOdW1BbmRDb2xOdW0oKQorICAgIH0KKworICAgIHZvaWQgY2xlYXJPdXRwdXQoRXZlbnRPYmplY3QgZXZ0ID0gbnVsbCkgeworICAgICAgICBvdXRwdXRBcmVhLnNldFRleHQoJycpCisgICAgfQorCisgICAgLy8gQ29uZmlybSB3aGV0aGVyIHRvIGludGVycnVwdCB0aGUgcnVubmluZyB0aHJlYWQKKyAgICB2b2lkIGNvbmZpcm1SdW5JbnRlcnJ1cHQoRXZlbnRPYmplY3QgZXZ0KSB7CisgICAgICAgIGRlZiByYyA9IEpPcHRpb25QYW5lLnNob3dDb25maXJtRGlhbG9nKGZyYW1lLCAiQXR0ZW1wdCB0byBpbnRlcnJ1cHQgc2NyaXB0PyIsCisgICAgICAgICAgICAiR3Jvb3Z5Q29uc29sZSIsIEpPcHRpb25QYW5lLllFU19OT19PUFRJT04pCisgICAgICAgIGlmIChyYyA9PSBKT3B0aW9uUGFuZS5ZRVNfT1BUSU9OICYmIHJ1blRocmVhZCAhPSBudWxsKSB7CisgICAgICAgICAgICBydW5UaHJlYWQuaW50ZXJydXB0KCkKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgZXhpdChFdmVudE9iamVjdCBldnQgPSBudWxsKSB7CisgICAgICAgIGlmIChhc2tUb1NhdmVGaWxlKCkpIHsKKyAgICAgICAgICAgIGZyYW1lLmhpZGUoKQorICAgICAgICAgICAgZnJhbWUuZGlzcG9zZSgpCisgICAgICAgICAgICBGaW5kUmVwbGFjZVV0aWxpdHkuZGlzcG9zZSgpCisgICAgICAgIH0KKworICAgICAgICBzeXN0ZW1PdXRJbnRlcmNlcHRvci5zdG9wKCkKKyAgICB9CisKKyAgICB2b2lkIGZpbGVOZXdGaWxlKEV2ZW50T2JqZWN0IGV2dCA9IG51bGwpIHsKKyAgICAgICAgaWYgKGFza1RvU2F2ZUZpbGUoKSkgeworICAgICAgICAgICAgc2NyaXB0RmlsZSA9IG51bGwKKyAgICAgICAgICAgIHNldERpcnR5KGZhbHNlKQorICAgICAgICAgICAgaW5wdXRBcmVhLnRleHQgPSAnJworICAgICAgICB9CisgICAgfQorCisgICAgLy8gU3RhcnQgYSBuZXcgd2luZG93IHdpdGggYSBjb3B5IG9mIGN1cnJlbnQgdmFyaWFibGVzCisgICAgdm9pZCBmaWxlTmV3V2luZG93KEV2ZW50T2JqZWN0IGV2dCA9IG51bGwpIHsKKyAgICAgICAgQ29uc29sZSBjb25zb2xlQ29udHJvbGxlciA9IG5ldyBDb25zb2xlKAorICAgICAgICAgICAgbmV3IEJpbmRpbmcoCisgICAgICAgICAgICAgICAgbmV3IEhhc2hNYXAoc2hlbGwuY29udGV4dC52YXJpYWJsZXMpKSkKKyAgICAgICAgY29uc29sZUNvbnRyb2xsZXIuc3lzdGVtT3V0SW50ZXJjZXB0b3IgPSBzeXN0ZW1PdXRJbnRlcmNlcHRvcgorICAgICAgICBTd2luZ0J1aWxkZXIgc3dpbmcgPSBuZXcgU3dpbmdCdWlsZGVyKCkKKyAgICAgICAgc3dpbmcuY29udHJvbGxlciA9IGNvbnNvbGVDb250cm9sbGVyCisgICAgICAgIHN3aW5nLmJ1aWxkKENvbnNvbGVBY3Rpb25zKQorICAgICAgICBzd2luZy5idWlsZChDb25zb2xlVmlldykKKyAgICAgICAgaW5zdGFsbEludGVyY2VwdG9yKCkKKyAgICAgICAgc3dpbmcuY29uc29sZUZyYW1lLnBhY2soKQorICAgICAgICBzd2luZy5jb25zb2xlRnJhbWUuc2hvdygpCisgICAgfQorCisgICAgdm9pZCBmaWxlT3BlbihFdmVudE9iamVjdCBldnQgPSBudWxsKSB7CisgICAgICAgIHNjcmlwdEZpbGUgPSBzZWxlY3RGaWxlbmFtZSgpCisgICAgICAgIGlmIChzY3JpcHRGaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlucHV0QXJlYS50ZXh0ID0gc2NyaXB0RmlsZS5yZWFkTGluZXMoKS5qb2luKCdcbicpCisgICAgICAgICAgICBzZXREaXJ0eShmYWxzZSkKKyAgICAgICAgICAgIGlucHV0QXJlYS5jYXJldFBvc2l0aW9uID0gMAorICAgICAgICB9CisgICAgfQorCisgICAgLy8gU2F2ZSBmaWxlIC0gcmV0dXJuIGZhbHNlIGlmIHVzZXIgY2FuY2VsbGVkIHNhdmUKKyAgICBib29sZWFuIGZpbGVTYXZlKEV2ZW50T2JqZWN0IGV2dCA9IG51bGwpIHsKKyAgICAgICAgaWYgKHNjcmlwdEZpbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZpbGVTYXZlQXMoZXZ0KQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2NyaXB0RmlsZS53cml0ZShpbnB1dEFyZWEudGV4dCkKKyAgICAgICAgICAgIHNldERpcnR5KGZhbHNlKQorICAgICAgICAgICAgcmV0dXJuIHRydWUKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFNhdmUgZmlsZSAtIHJldHVybiBmYWxzZSBpZiB1c2VyIGNhbmNlbGxlZCBzYXZlCisgICAgYm9vbGVhbiBmaWxlU2F2ZUFzKEV2ZW50T2JqZWN0IGV2dCA9IG51bGwpIHsKKyAgICAgICAgc2NyaXB0RmlsZSA9IHNlbGVjdEZpbGVuYW1lKCJTYXZlIikKKyAgICAgICAgaWYgKHNjcmlwdEZpbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgc2NyaXB0RmlsZS53cml0ZShpbnB1dEFyZWEudGV4dCkKKyAgICAgICAgICAgIHNldERpcnR5KGZhbHNlKQorICAgICAgICAgICAgcmV0dXJuIHRydWUKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZQorICAgICAgICB9CisgICAgfQorCisgICAgZGVmIGZpbmlzaEV4Y2VwdGlvbihUaHJvd2FibGUgdCkgeworICAgICAgICBzdGF0dXNMYWJlbC50ZXh0ID0gJ0V4ZWN1dGlvbiB0ZXJtaW5hdGVkIHdpdGggZXhjZXB0aW9uLicKKyAgICAgICAgaGlzdG9yeVstMV0uZXhjZXB0aW9uID0gdAorCisgICAgICAgIGFwcGVuZE91dHB1dE5sKCJFeGNlcHRpb24gdGhyb3duOiAiLCBwcm9tcHRTdHlsZSkKKyAgICAgICAgYXBwZW5kT3V0cHV0KHQudG9TdHJpbmcoKSwgcmVzdWx0U3R5bGUpCisKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpCisgICAgICAgIG5ldyBQcmludFdyaXRlcihzdykud2l0aFdyaXRlciB7IHB3IC0+IFN0YWNrVHJhY2VVdGlscy5kZWVwU2FuaXRpemUodCkucHJpbnRTdGFja1RyYWNlKHB3KSB9CisKKyAgICAgICAgYXBwZW5kT3V0cHV0TmwoIlxuJHtzdy5idWZmZXJ9XG4iLCBvdXRwdXRTdHlsZSkKKyAgICAgICAgYmluZFJlc3VsdHMoKQorICAgIH0KKworICAgIGRlZiBmaW5pc2hOb3JtYWwoT2JqZWN0IHJlc3VsdCkgeworICAgICAgICAvLyBUYWtlIGRvd24gdGhlIHdhaXQvY2FuY2VsIGRpYWxvZworICAgICAgICBoaXN0b3J5Wy0xXS5yZXN1bHQgPSByZXN1bHQKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7CisgICAgICAgICAgICBzdGF0dXNMYWJlbC50ZXh0ID0gJ0V4ZWN1dGlvbiBjb21wbGV0ZS4nCisgICAgICAgICAgICBhcHBlbmRPdXRwdXRObCgiUmVzdWx0OiAiLCBwcm9tcHRTdHlsZSkKKyAgICAgICAgICAgIGFwcGVuZE91dHB1dCgiJHtJbnZva2VySGVscGVyLmluc3BlY3QocmVzdWx0KX0iLCByZXN1bHRTdHlsZSkKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1c0xhYmVsLnRleHQgPSAnRXhlY3V0aW9uIGNvbXBsZXRlLiBSZXN1bHQgd2FzIG51bGwuJworICAgICAgICB9CisgICAgICAgIGJpbmRSZXN1bHRzKCkKKyAgICB9CisKKyAgICAvLyBHZXRzIHRoZSBsYXN0LCBub24tbnVsbCByZXN1bHQKKyAgICBkZWYgZ2V0TGFzdFJlc3VsdCgpIHsKKyAgICAgICAgLy8gcnVudGltZSBidWdzIGluIGhlcmUgaGlzdG9yeS5yZXZlcnNlIHByb2R1Y2VzIG9kZCBsb29rdXAKKyAgICAgICAgLy8gcmV0dXJuIGhpc3RvcnkucmV2ZXJzZS5maW5kIHtpdCAhPSBudWxsfQorICAgICAgICBpZiAoIWhpc3RvcnkpIHsKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB9CisgICAgICAgIGZvciAoaSBpbiAoaGlzdG9yeS5zaXplKCkgLSAxKS4uMCkgeworICAgICAgICAgICAgaWYgKGhpc3RvcnlbaV0ucmVzdWx0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaGlzdG9yeVtpXS5yZXN1bHQKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbAorICAgIH0KKworICAgIC8vIEFsbG93IGFjY2VzcyB0byBzaGVsbCBmcm9tIG91dHNpZGUgY29uc29sZQorICAgIC8vICh1c2VmdWwgZm9yIGNvbmZpZ3VyaW5nIHNoZWxsIGJlZm9yZSBzdGFydHVwKQorICAgIEdyb292eVNoZWxsIGdldFNoZWxsKCkgeworICAgICAgICByZXR1cm4gc2hlbGwKKyAgICB9CisKKyAgICB2b2lkIGhpc3RvcnlOZXh0KEV2ZW50T2JqZWN0IGV2dCA9IG51bGwpIHsKKyAgICAgICAgaWYgKGhpc3RvcnlJbmRleCA8IGhpc3Rvcnkuc2l6ZSgpKSB7CisgICAgICAgICAgICBzZXRJbnB1dFRleHRGcm9tSGlzdG9yeShoaXN0b3J5SW5kZXggKyAxKQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzTGFiZWwudGV4dCA9ICJDYW4ndCBnbyBwYXN0IGVuZCBvZiBoaXN0b3J5ICh0aW1lIHRyYXZlbCBub3QgYWxsb3dlZCkiCisgICAgICAgICAgICBiZWVwKCkKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgaGlzdG9yeVByZXYoRXZlbnRPYmplY3QgZXZ0ID0gbnVsbCkgeworICAgICAgICBpZiAoaGlzdG9yeUluZGV4ID4gMCkgeworICAgICAgICAgICAgc2V0SW5wdXRUZXh0RnJvbUhpc3RvcnkoaGlzdG9yeUluZGV4IC0gMSkKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1c0xhYmVsLnRleHQgPSAiQ2FuJ3QgZ28gcGFzdCBzdGFydCBvZiBoaXN0b3J5IgorICAgICAgICAgICAgYmVlcCgpCisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGluc3BlY3RMYXN0KEV2ZW50T2JqZWN0IGV2dCA9IG51bGwpeworICAgICAgICBpZiAobnVsbCA9PSBsYXN0UmVzdWx0KSB7CisgICAgICAgICAgICBKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyhmcmFtZSwgIlRoZSBsYXN0IHJlc3VsdCBpcyBudWxsLiIsCisgICAgICAgICAgICAgICAgIkNhbm5vdCBJbnNwZWN0IiwgSk9wdGlvblBhbmUuSU5GT1JNQVRJT05fTUVTU0FHRSkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB9CisgICAgICAgIE9iamVjdEJyb3dzZXIuaW5zcGVjdChsYXN0UmVzdWx0KQorICAgIH0KKworICAgIHZvaWQgaW5zcGVjdFZhcmlhYmxlcyhFdmVudE9iamVjdCBldnQgPSBudWxsKSB7CisgICAgICAgIE9iamVjdEJyb3dzZXIuaW5zcGVjdChzaGVsbC5jb250ZXh0LnZhcmlhYmxlcykKKyAgICB9CisKKyAgICB2b2lkIGxhcmdlckZvbnQoRXZlbnRPYmplY3QgZXZ0ID0gbnVsbCkgeworICAgICAgICBpZiAoaW5wdXRBcmVhLmZvbnQuc2l6ZSA+IDQwKSByZXR1cm4KKyAgICAgICAgLy8gZG9uJ3Qgd29ycnksIHRoZSBmb250cyB3b24ndCBiZSBjaGFuZ2VkIHRvIG1vbm9zcGFjZWQgZmFjZSwgdGhlIHN0eWxlcyB3aWxsIG9ubHkgZGVyaXZlIGZyb20gdGhpcworICAgICAgICBkZWYgbmV3Rm9udCA9IG5ldyBGb250KCdNb25vc3BhY2VkJywgRm9udC5QTEFJTiwgaW5wdXRBcmVhLmZvbnQuc2l6ZSArIDIpCisgICAgICAgIGlucHV0QXJlYS5mb250ID0gbmV3Rm9udAorICAgICAgICBvdXRwdXRBcmVhLmZvbnQgPSBuZXdGb250CisgICAgfQorCisgICAgQm9vbGVhbiBub3RpZnlTeXN0ZW1PdXQoU3RyaW5nIHN0cikgeworICAgICAgICBpZiAoIWNhcHR1cmVTdGRPdXQpIHsKKyAgICAgICAgICAgIC8vIE91dHB1dCBhcyBub3JtYWwKKyAgICAgICAgICAgIHJldHVybiB0cnVlCisgICAgICAgIH0KKworICAgICAgICAvLyBQdXQgb250byBHVUkKKyAgICAgICAgaWYgKEV2ZW50UXVldWUuaXNEaXNwYXRjaFRocmVhZCgpKSB7CisgICAgICAgICAgICBhcHBlbmRPdXRwdXQoc3RyLCBvdXRwdXRTdHlsZSkKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFN3aW5nVXRpbGl0aWVzLmludm9rZUxhdGVyIHsKKyAgICAgICAgICAgICAgICBhcHBlbmRPdXRwdXQoc3RyLCBvdXRwdXRTdHlsZSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2UKKyAgICB9CisKKyAgICAvLyBhY3R1YWxseSBydW4gdGhlIHNjcmlwdAorCisgICAgdm9pZCBydW5TY3JpcHQoRXZlbnRPYmplY3QgZXZ0ID0gbnVsbCkgeworICAgICAgICBydW5TY3JpcHRJbXBsKGZhbHNlKQorICAgIH0KKworICAgIHZvaWQgcnVuU2VsZWN0ZWRTY3JpcHQoRXZlbnRPYmplY3QgZXZ0ID0gbnVsbCkgeworICAgICAgICBydW5TY3JpcHRJbXBsKHRydWUpCisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJ1blNjcmlwdEltcGwoYm9vbGVhbiBzZWxlY3RlZCkgeworICAgICAgICBkZWYgZW5kTGluZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgnbGluZS5zZXBhcmF0b3InKQorICAgICAgICBkZWYgcmVjb3JkID0gbmV3IEhpc3RvcnlSZWNvcmQoIGFsbFRleHQ6IGlucHV0QXJlYS5nZXRUZXh0KCkucmVwbGFjZUFsbChlbmRMaW5lLCAnXG4nKSwKKyAgICAgICAgICAgIHNlbGVjdGlvblN0YXJ0OiB0ZXh0U2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZDogdGV4dFNlbGVjdGlvbkVuZCkKKyAgICAgICAgYWRkVG9IaXN0b3J5KHJlY29yZCkKKyAgICAgICAgcGVuZGluZ1JlY29yZCA9IG5ldyBIaXN0b3J5UmVjb3JkKGFsbFRleHQ6JycsIHNlbGVjdGlvblN0YXJ0OjAsIHNlbGVjdGlvbkVuZDowKQorCisgICAgICAgIC8vIFByaW50IHRoZSBpbnB1dCB0ZXh0CisgICAgICAgIGZvciAobGluZSBpbiByZWNvcmQuZ2V0VGV4dFRvUnVuKHNlbGVjdGVkKS50b2tlbml6ZSgiXG4iKSkgeworICAgICAgICAgICAgYXBwZW5kT3V0cHV0TmwoJ2dyb292eT4gJywgcHJvbXB0U3R5bGUpCisgICAgICAgICAgICBhcHBlbmRPdXRwdXQobGluZSwgY29tbWFuZFN0eWxlKQorICAgICAgICB9CisKKyAgICAgICAgLy9hcHBlbmRPdXRwdXRObCgiIikgLSB3aXRoIHdyb25nIG51bWJlciBvZiBhcmdzLCBjYXVzZXMgU3RhY2tPdmVyRmxvd0Vycm9yCisgICAgICAgIGFwcGVuZE91dHB1dE5sKCJcbiIsIHByb21wdFN0eWxlKQorCisgICAgICAgIC8vIEtpY2sgb2ZmIGEgbmV3IHRocmVhZCB0byBkbyB0aGUgZXZhbHVhdGlvbgorICAgICAgICBzdGF0dXNMYWJlbC50ZXh0ID0gJ1J1bm5pbmcgU2NyaXB0Li4uJworCisgICAgICAgIC8vIFJ1biBpbiBzZXBhcmF0ZSB0aHJlYWQsIHNvIHRoYXQgU3lzdGVtLm91dCBjYW4gYmUgY2FwdHVyZWQKKyAgICAgICAgcnVuVGhyZWFkID0gVGhyZWFkLnN0YXJ0IHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgU3dpbmdVdGlsaXRpZXMuaW52b2tlTGF0ZXIgeyBzaG93UnVuV2FpdERpYWxvZygpIH0KKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9ICJTY3JpcHQke3NjcmlwdE5hbWVDb3VudGVyKyt9IgorICAgICAgICAgICAgICAgIGlmKGJlZm9yZUV4ZWN1dGlvbikgeworICAgICAgICAgICAgICAgICAgICBiZWZvcmVFeGVjdXRpb24oKQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZWYgcmVzdWx0ID0gc2hlbGwuZXZhbHVhdGUocmVjb3JkLmdldFRleHRUb1J1bihzZWxlY3RlZCksIG5hbWUpCisgICAgICAgICAgICAgICAgaWYoYWZ0ZXJFeGVjdXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgYWZ0ZXJFeGVjdXRpb24oKQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTd2luZ1V0aWxpdGllcy5pbnZva2VMYXRlciB7IGZpbmlzaE5vcm1hbChyZXN1bHQpIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgU3dpbmdVdGlsaXRpZXMuaW52b2tlTGF0ZXIgeyBmaW5pc2hFeGNlcHRpb24odCkgfQorICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBTd2luZ1V0aWxpdGllcy5pbnZva2VMYXRlciB7CisgICAgICAgICAgICAgICAgICAgIHJ1bldhaXREaWFsb2cuaGlkZSgpCisgICAgICAgICAgICAgICAgICAgIHJ1blRocmVhZCA9IG51bGwKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkZWYgc2VsZWN0RmlsZW5hbWUobmFtZSA9ICJPcGVuIikgeworICAgICAgICBkZWYgZmMgPSBuZXcgSkZpbGVDaG9vc2VyKGN1cnJlbnRGaWxlQ2hvb3NlckRpcikKKyAgICAgICAgZmMuZmlsZVNlbGVjdGlvbk1vZGUgPSBKRmlsZUNob29zZXIuRklMRVNfT05MWQorICAgICAgICBmYy5hY2NlcHRBbGxGaWxlRmlsdGVyVXNlZCA9IHRydWUKKyAgICAgICAgaWYgKGZjLnNob3dEaWFsb2coZnJhbWUsIG5hbWUpID09IEpGaWxlQ2hvb3Nlci5BUFBST1ZFX09QVElPTikgeworICAgICAgICAgICAgY3VycmVudEZpbGVDaG9vc2VyRGlyID0gZmMuY3VycmVudERpcmVjdG9yeQorICAgICAgICAgICAgUHJlZmVyZW5jZXMudXNlck5vZGVGb3JQYWNrYWdlKENvbnNvbGUpLnB1dCgnY3VycmVudEZpbGVDaG9vc2VyRGlyJywgY3VycmVudEZpbGVDaG9vc2VyRGlyLnBhdGgpCisgICAgICAgICAgICByZXR1cm4gZmMuc2VsZWN0ZWRGaWxlCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbAorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBzZXREaXJ0eShib29sZWFuIG5ld0RpcnR5KSB7CisgICAgICAgIC8vVE9ETyB3aGVuIEBCb3VuZFByb3BlcnR5IGlzIGxpdmUsIHRoaXMgc2hvdWxkIGJlIGhhbmRsZWQgdmlhIGxpc3RlbmVycworICAgICAgICBkaXJ0eSA9IG5ld0RpcnR5CisgICAgICAgIHNhdmVBY3Rpb24uZW5hYmxlZCA9IG5ld0RpcnR5CisgICAgICAgIHVwZGF0ZVRpdGxlKCkKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0SW5wdXRUZXh0RnJvbUhpc3RvcnkobmV3SW5kZXgpIHsKKyAgICAgICAgZGVmIGVuZExpbmUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoJ2xpbmUuc2VwYXJhdG9yJykKKyAgICAgICAgaWYgKGhpc3RvcnlJbmRleCA+PSBoaXN0b3J5LnNpemUoKSkgeworICAgICAgICAgICAgcGVuZGluZ1JlY29yZCA9IG5ldyBIaXN0b3J5UmVjb3JkKCBhbGxUZXh0OiBpbnB1dEFyZWEuZ2V0VGV4dCgpLnJlcGxhY2VBbGwoZW5kTGluZSwgJ1xuJyksCisgICAgICAgICAgICAgICAgc2VsZWN0aW9uU3RhcnQ6IHRleHRTZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kOiB0ZXh0U2VsZWN0aW9uRW5kKQorICAgICAgICB9CisgICAgICAgIGhpc3RvcnlJbmRleCA9IG5ld0luZGV4CisgICAgICAgIGRlZiByZWNvcmQKKyAgICAgICAgaWYgKGhpc3RvcnlJbmRleCA8IGhpc3Rvcnkuc2l6ZSgpKSB7CisgICAgICAgICAgICByZWNvcmQgPSBoaXN0b3J5W2hpc3RvcnlJbmRleF0KKyAgICAgICAgICAgIHN0YXR1c0xhYmVsLnRleHQgPSAiY29tbWFuZCBoaXN0b3J5ICR7aGlzdG9yeS5zaXplKCkgLSBoaXN0b3J5SW5kZXh9IgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVjb3JkID0gcGVuZGluZ1JlY29yZAorICAgICAgICAgICAgc3RhdHVzTGFiZWwudGV4dCA9ICdhdCBlbmQgb2YgaGlzdG9yeScKKyAgICAgICAgfQorICAgICAgICBpbnB1dEFyZWEudGV4dCA9IHJlY29yZC5hbGxUZXh0CisgICAgICAgIGlucHV0QXJlYS5zZWxlY3Rpb25TdGFydCA9IHJlY29yZC5zZWxlY3Rpb25TdGFydAorICAgICAgICBpbnB1dEFyZWEuc2VsZWN0aW9uRW5kID0gcmVjb3JkLnNlbGVjdGlvbkVuZAorICAgICAgICBzZXREaXJ0eSh0cnVlKSAvLyBTaG91bGQgY2FsY3VsYXRlIGRpcnR5IGZsYWcgcHJvcGVybHkgKGhhc2ggbGFzdCBzYXZlZC9yZWFkIHRleHQgaW4gZWFjaCBmaWxlKQorICAgICAgICB1cGRhdGVIaXN0b3J5QWN0aW9ucygpCisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUhpc3RvcnlBY3Rpb25zKCkgeworICAgICAgICBuZXh0SGlzdG9yeUFjdGlvbi5lbmFibGVkID0gaGlzdG9yeUluZGV4IDwgaGlzdG9yeS5zaXplKCkKKyAgICAgICAgcHJldkhpc3RvcnlBY3Rpb24uZW5hYmxlZCA9IGhpc3RvcnlJbmRleCA+IDAKKyAgICB9CisKKyAgICAvLyBBZGRzIGEgdmFyaWFibGUgdG8gdGhlIGJpbmRpbmcKKyAgICAvLyBVc2VmdWwgZm9yIGFkZGluZyB2YXJpYWJsZXMgYmVmb3JlIG9wZW5uaW5nIHRoZSBjb25zb2xlCisgICAgdm9pZCBzZXRWYXJpYWJsZShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIHNoZWxsLmNvbnRleHQuc2V0VmFyaWFibGUobmFtZSwgdmFsdWUpCisgICAgfQorCisgICAgdm9pZCBzaG93QWJvdXQoRXZlbnRPYmplY3QgZXZ0ID0gbnVsbCkgeworICAgICAgICBkZWYgdmVyc2lvbiA9IEludm9rZXJIZWxwZXIuZ2V0VmVyc2lvbigpCisgICAgICAgIGRlZiBwYW5lID0gc3dpbmcub3B0aW9uUGFuZSgpCisgICAgICAgICAvLyB3b3JrIGFyb3VuZCBHUk9PVlktMTA0OAorICAgICAgICBwYW5lLnNldE1lc3NhZ2UoJ1dlbGNvbWUgdG8gdGhlIEdyb292eSBDb25zb2xlIGZvciBldmFsdWF0aW5nIEdyb292eSBzY3JpcHRzXG5WZXJzaW9uICcgKyB2ZXJzaW9uKQorICAgICAgICBkZWYgZGlhbG9nID0gcGFuZS5jcmVhdGVEaWFsb2coZnJhbWUsICdBYm91dCBHcm9vdnlDb25zb2xlJykKKyAgICAgICAgZGlhbG9nLnNob3coKQorICAgIH0KKworICAgIHZvaWQgZmluZChFdmVudE9iamVjdCBldnQgPSBudWxsKSB7CisgICAgICAgIEZpbmRSZXBsYWNlVXRpbGl0eS5zaG93RGlhbG9nKCkKKyAgICB9CisKKyAgICB2b2lkIGZpbmROZXh0KEV2ZW50T2JqZWN0IGV2dCA9IG51bGwpIHsKKyAgICAgICAgRmluZFJlcGxhY2VVdGlsaXR5LkZJTkRfQUNUSU9OLmFjdGlvblBlcmZvcm1lZChldnQpCisgICAgfQorCisgICAgdm9pZCBmaW5kUHJldmlvdXMoRXZlbnRPYmplY3QgZXZ0ID0gbnVsbCkgeworICAgICAgICBkZWYgcmV2ZXJzZUV2dCA9IG5ldyBBY3Rpb25FdmVudCgKKyAgICAgICAgICAgIGV2dC5nZXRTb3VyY2UoKSwgZXZ0LmdldElEKCksCisgICAgICAgICAgICBldnQuZ2V0QWN0aW9uQ29tbWFuZCgpLCBldnQuZ2V0V2hlbigpLAorICAgICAgICAgICAgQWN0aW9uRXZlbnQuU0hJRlRfTUFTSykgLy9yZXZlcnNlCisgICAgICAgIEZpbmRSZXBsYWNlVXRpbGl0eS5GSU5EX0FDVElPTi5hY3Rpb25QZXJmb3JtZWQocmV2ZXJzZUV2dCkKKyAgICB9CisKKyAgICB2b2lkIHJlcGxhY2UoRXZlbnRPYmplY3QgZXZ0ID0gbnVsbCkgeworICAgICAgICBGaW5kUmVwbGFjZVV0aWxpdHkuc2hvd0RpYWxvZyh0cnVlKQorICAgIH0KKworCisgICAgLy8gU2hvd3MgdGhlICd3YWl0JyBkaWFsb2cKKyAgICB2b2lkIHNob3dSdW5XYWl0RGlhbG9nKCkgeworICAgICAgICBydW5XYWl0RGlhbG9nLnBhY2soKQorICAgICAgICBpbnQgeCA9IGZyYW1lLnggKyAoZnJhbWUud2lkdGggLSBydW5XYWl0RGlhbG9nLndpZHRoKSAvIDIKKyAgICAgICAgaW50IHkgPSBmcmFtZS55ICsgKGZyYW1lLmhlaWdodCAtIHJ1bldhaXREaWFsb2cuaGVpZ2h0KSAvIDIKKyAgICAgICAgcnVuV2FpdERpYWxvZy5zZXRMb2NhdGlvbih4LCB5KQorICAgICAgICBydW5XYWl0RGlhbG9nLnNob3coKQorICAgIH0KKworICAgIHZvaWQgc21hbGxlckZvbnQoRXZlbnRPYmplY3QgZXZ0ID0gbnVsbCl7CisgICAgICAgIGlmIChpbnB1dEFyZWEuZm9udC5zaXplIDwgNSkgcmV0dXJuCisgICAgICAgIC8vIGRvbid0IHdvcnJ5LCB0aGUgZm9udHMgd29uJ3QgYmUgY2hhbmdlZCB0byBtb25vc3BhY2VkIGZhY2UsIHRoZSBzdHlsZXMgd2lsbCBvbmx5IGRlcml2ZSBmcm9tIHRoaXMKKyAgICAgICAgZGVmIG5ld0ZvbnQgPSBuZXcgRm9udCgnTW9ub3NwYWNlZCcsIEZvbnQuUExBSU4sIGlucHV0QXJlYS5mb250LnNpemUgLSAyKQorICAgICAgICBpbnB1dEFyZWEuZm9udCA9IG5ld0ZvbnQKKyAgICAgICAgb3V0cHV0QXJlYS5mb250ID0gbmV3Rm9udAorICAgIH0KKworICAgIHZvaWQgdXBkYXRlVGl0bGUoKSB7CisgICAgICAgIGlmIChzY3JpcHRGaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZyYW1lLnRpdGxlID0gc2NyaXB0RmlsZS5uYW1lICsgKGRpcnR5PyIgKiAiOiIiKSArICIgLSBHcm9vdnlDb25zb2xlIgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZnJhbWUudGl0bGUgPSAiR3Jvb3Z5Q29uc29sZSIKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgaW52b2tlVGV4dEFjdGlvbihldnQsIGNsb3N1cmUpIHsKKyAgICAgICAgZGVmIHNvdXJjZSA9IGV2dC5nZXRTb3VyY2UoKQorICAgICAgICBpZiAoc291cmNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNsb3N1cmUoaW5wdXRBcmVhKQorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBjdXQoRXZlbnRPYmplY3QgZXZ0ID0gbnVsbCkgeworICAgICAgICBpbnZva2VUZXh0QWN0aW9uKGV2dCwgeyBzb3VyY2UgLT4gc291cmNlLmN1dCgpIH0pCisgICAgfQorCisgICAgdm9pZCBjb3B5KEV2ZW50T2JqZWN0IGV2dCA9IG51bGwpIHsKKyAgICAgICAgaW52b2tlVGV4dEFjdGlvbihldnQsIHsgc291cmNlIC0+IHNvdXJjZS5jb3B5KCkgfSkKKyAgICB9CisKKyAgICB2b2lkIHBhc3RlKEV2ZW50T2JqZWN0IGV2dCA9IG51bGwpIHsKKyAgICAgICAgaW52b2tlVGV4dEFjdGlvbihldnQsIHsgc291cmNlIC0+IHNvdXJjZS5wYXN0ZSgpIH0pCisgICAgfQorCisgICAgdm9pZCBzZWxlY3RBbGwoRXZlbnRPYmplY3QgZXZ0ID0gbnVsbCkgeworICAgICAgICBpbnZva2VUZXh0QWN0aW9uKGV2dCwgeyBzb3VyY2UgLT4gc291cmNlLnNlbGVjdEFsbCgpIH0pCisgICAgfQorCisgICAgdm9pZCBzZXRSb3dOdW1BbmRDb2xOdW0oKSB7CisgICAgICAgIGN1cnNvclBvcyA9IGlucHV0QXJlYS5nZXRDYXJldFBvc2l0aW9uKCkKKyAgICAgICAgcm93TnVtID0gcm9vdEVsZW1lbnQuZ2V0RWxlbWVudEluZGV4KGN1cnNvclBvcykgKyAxCisKKyAgICAgICAgZGVmIHJvd0VsZW1lbnQgPSByb290RWxlbWVudC5nZXRFbGVtZW50KHJvd051bSAtIDEpCisgICAgICAgIGNvbE51bSA9IGN1cnNvclBvcyAtIHJvd0VsZW1lbnQuZ2V0U3RhcnRPZmZzZXQoKSArIDEKKworICAgICAgICByb3dOdW1BbmRDb2xOdW0uc2V0VGV4dCgiJHJvd051bTokY29sTnVtIikKKyAgICB9CisKKyAgICB2b2lkIHByaW50KEV2ZW50T2JqZWN0IGV2dCA9IG51bGwpIHsKKyAgICAgICAgaW5wdXRFZGl0b3IucHJpbnRBY3Rpb24uYWN0aW9uUGVyZm9ybWVkKGV2dCkKKyAgICB9CisKKyAgICB2b2lkIHVuZG8oRXZlbnRPYmplY3QgZXZ0ID0gbnVsbCkgeworICAgICAgICBpbnB1dEVkaXRvci51bmRvQWN0aW9uLmFjdGlvblBlcmZvcm1lZChldnQpCisgICAgfQorCisgICAgdm9pZCByZWRvKEV2ZW50T2JqZWN0IGV2dCA9IG51bGwpIHsKKyAgICAgICAgaW5wdXRFZGl0b3IucmVkb0FjdGlvbi5hY3Rpb25QZXJmb3JtZWQoZXZ0KQorICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdWkvQ29uc29sZUFjdGlvbnMuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS9Db25zb2xlQWN0aW9ucy5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q1NDJiMgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdWkvQ29uc29sZUFjdGlvbnMuZ3Jvb3Z5CkBAIC0wLDAgKzEsMjY1IEBACisvKg0KKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLg0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KK3BhY2thZ2UgZ3Jvb3Z5LnVpDQorDQoraW1wb3J0IGphdmEuYXd0LmV2ZW50LklucHV0RXZlbnQNCitpbXBvcnQgamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQNCitpbXBvcnQgamF2YXguc3dpbmcuS2V5U3Ryb2tlDQorDQorYWN0aW9uKGlkOiAnbmV3RmlsZUFjdGlvbicsDQorICAgIG5hbWU6ICdOZXcgRmlsZScsDQorICAgIGNsb3N1cmU6IGNvbnRyb2xsZXIuJmZpbGVOZXdGaWxlLA0KKyAgICBtbmVtb25pYzogJ04nLA0KKyAgICBhY2NlbGVyYXRvcjogc2hvcnRjdXQoJ04nKSwNCisgICAgc21hbGxJY29uOiBpbWFnZUljb24ocmVzb3VyY2U6Imljb25zL3BhZ2UucG5nIiwgY2xhc3M6dGhpcyksDQorICAgIHNob3J0RGVzY3JpcHRpb246ICdOZXcgR3Jvb3Z5IFNjcmlwdCcNCispDQorDQorYWN0aW9uKGlkOiAnbmV3V2luZG93QWN0aW9uJywNCisgICAgbmFtZTogJ05ldyBXaW5kb3cnLA0KKyAgICBjbG9zdXJlOiBjb250cm9sbGVyLiZmaWxlTmV3V2luZG93LA0KKyAgICBtbmVtb25pYzogJ1cnLA0KKyAgICBhY2NlbGVyYXRvcjogc2hvcnRjdXQoJ3NoaWZ0IE4nKQ0KKykNCisNCithY3Rpb24oaWQ6ICdvcGVuQWN0aW9uJywNCisgICAgbmFtZTogJ09wZW4nLA0KKyAgICBjbG9zdXJlOiBjb250cm9sbGVyLiZmaWxlT3BlbiwNCisgICAgbW5lbW9uaWM6ICdPJywNCisgICAgYWNjZWxlcmF0b3I6IHNob3J0Y3V0KCdPJyksDQorICAgIHNtYWxsSWNvbjogaW1hZ2VJY29uKHJlc291cmNlOiJpY29ucy9mb2xkZXJfcGFnZS5wbmciLCBjbGFzczp0aGlzKSwNCisgICAgc2hvcnREZXNjcmlwdGlvbjogJ09wZW4gR3Jvb3Z5IFNjcmlwdCcNCispDQorDQorYWN0aW9uKGlkOiAnc2F2ZUFjdGlvbicsDQorICAgIG5hbWU6ICdTYXZlJywNCisgICAgY2xvc3VyZTogY29udHJvbGxlci4mZmlsZVNhdmUsDQorICAgIG1uZW1vbmljOiAnUycsDQorICAgIGFjY2VsZXJhdG9yOiBzaG9ydGN1dCgnUycpLA0KKyAgICBzbWFsbEljb246IGltYWdlSWNvbihyZXNvdXJjZToiaWNvbnMvZGlzay5wbmciLCBjbGFzczp0aGlzKSwNCisgICAgc2hvcnREZXNjcmlwdGlvbjogJ1NhdmUgR3Jvb3Z5IFNjcmlwdCcsDQorICAgIGVuYWJsZWQ6IGZhbHNlIC8vIGNvbnRyb2xsZXIgd2lsbCBlbmFibGUgYXMgbmVlZGVkDQorKQ0KKw0KK2FjdGlvbihpZDogJ3NhdmVBc0FjdGlvbicsDQorICAgIG5hbWU6ICdTYXZlIEFzLi4uJywNCisgICAgY2xvc3VyZTogY29udHJvbGxlci4mZmlsZVNhdmVBcywNCisgICAgbW5lbW9uaWM6ICdBJywNCispDQorDQorYWN0aW9uKGlkOiAncHJpbnRBY3Rpb24nLA0KKyAgICBuYW1lOiAnUHJpbnQuLi4nLA0KKyAgICBjbG9zdXJlOiBjb250cm9sbGVyLiZwcmludCwNCisgICAgbW5lbW9uaWM6ICdQJywNCisgICAgYWNjZWxlcmF0b3I6IHNob3J0Y3V0KCdQJykNCispDQorDQorYWN0aW9uKGlkOiAnZXhpdEFjdGlvbicsDQorICAgIG5hbWU6ICdFeGl0JywNCisgICAgY2xvc3VyZTogY29udHJvbGxlci4mZXhpdCwNCisgICAgbW5lbW9uaWM6ICdYJw0KKy8vIHdoZXRoZXIgb3Igbm90IGFwcGxpY2F0aW9uIGV4aXQgc2hvdWxkIGhhdmUgYW4NCisvLyBhY2NlbGxlcmF0b3IgaXMgZGViYXRhYmxlIGluIHVzYWJpbGl0eSBjaXJjbGVzDQorLy8gYXQgdGhlIHZlcnkgbGVhc3QgYSBjb25maXJtIGRpYWxvZyBzaG91bGQgZGhvdyB1cA0KKy8vYWNjZWxlcmF0b3I6IHNob3J0Y3V0KCdRJykNCispDQorDQorYWN0aW9uKGlkOiAndW5kb0FjdGlvbicsDQorICAgIG5hbWU6ICdVbmRvJywNCisgICAgY2xvc3VyZTogY29udHJvbGxlci4mdW5kbywNCisgICAgbW5lbW9uaWM6ICdVJywNCisgICAgYWNjZWxlcmF0b3I6IHNob3J0Y3V0KCdaJyksDQorICAgIHNtYWxsSWNvbjogaW1hZ2VJY29uKHJlc291cmNlOiJpY29ucy9hcnJvd191bmRvLnBuZyIsIGNsYXNzOnRoaXMpLA0KKyAgICBzaG9ydERlc2NyaXB0aW9uOiAnVW5kbycNCispDQorDQorYWN0aW9uKGlkOiAncmVkb0FjdGlvbicsDQorICAgIG5hbWU6ICdSZWRvJywNCisgICAgY2xvc3VyZTogY29udHJvbGxlci4mcmVkbywNCisgICAgbW5lbW9uaWM6ICdSJywNCisgICAgYWNjZWxlcmF0b3I6IHNob3J0Y3V0KCdzaGlmdCBaJyksIC8vIGlzIGNvbnRyb2wtc2hpZnQtWiBvciBjb250cm9sLVkgbW9yZSBjb21tb24/DQorICAgIHNtYWxsSWNvbjogaW1hZ2VJY29uKHJlc291cmNlOiJpY29ucy9hcnJvd19yZWRvLnBuZyIsIGNsYXNzOnRoaXMpLA0KKyAgICBzaG9ydERlc2NyaXB0aW9uOiAnUmVkbycNCispDQorDQorYWN0aW9uKGlkOiAnZmluZEFjdGlvbicsDQorICAgIG5hbWU6ICdGaW5kLi4uJywNCisgICAgY2xvc3VyZTogY29udHJvbGxlci4mZmluZCwNCisgICAgbW5lbW9uaWM6ICdGJywNCisgICAgYWNjZWxlcmF0b3I6IHNob3J0Y3V0KCdGJyksDQorICAgIHNtYWxsSWNvbjogaW1hZ2VJY29uKHJlc291cmNlOiJpY29ucy9maW5kLnBuZyIsIGNsYXNzOnRoaXMpLA0KKyAgICBzaG9ydERlc2NyaXB0aW9uOiAnRmluZCcNCispDQorDQorYWN0aW9uKGlkOiAnZmluZE5leHRBY3Rpb24nLA0KKyAgICBuYW1lOiAnRmluZCBOZXh0JywNCisgICAgY2xvc3VyZTogY29udHJvbGxlci4mZmluZE5leHQsDQorICAgIG1uZW1vbmljOiAnTicsDQorICAgIGFjY2VsZXJhdG9yOiBLZXlTdHJva2UuZ2V0S2V5U3Ryb2tlKEtleUV2ZW50LlZLX0YzLCAwKQ0KKykNCisNCithY3Rpb24oaWQ6ICdmaW5kUHJldmlvdXNBY3Rpb24nLA0KKyAgICBuYW1lOiAnRmluZCBQcmV2aW91cycsDQorICAgIGNsb3N1cmU6IGNvbnRyb2xsZXIuJmZpbmRQcmV2aW91cywNCisgICAgbW5lbW9uaWM6ICdWJywNCisgICAgYWNjZWxlcmF0b3I6IEtleVN0cm9rZS5nZXRLZXlTdHJva2UoS2V5RXZlbnQuVktfRjMsIElucHV0RXZlbnQuU0hJRlRfRE9XTl9NQVNLKQ0KKykNCisNCithY3Rpb24oaWQ6ICdyZXBsYWNlQWN0aW9uJywNCisgICAgbmFtZTogJ1JlcGxhY2UuLi4nLA0KKyAgICBjbG9zdXJlOiBjb250cm9sbGVyLiZyZXBsYWNlLA0KKyAgICBtbmVtb25pYzogJ0UnLA0KKyAgICBhY2NlbGVyYXRvcjogc2hvcnRjdXQoJ0gnKSwNCisgICAgc21hbGxJY29uOiBpbWFnZUljb24ocmVzb3VyY2U6Imljb25zL3RleHRfcmVwbGFjZS5wbmciLCBjbGFzczp0aGlzKSwNCisgICAgc2hvcnREZXNjcmlwdGlvbjogJ1JlcGxhY2UnDQorKQ0KKw0KK2FjdGlvbihpZDogJ2N1dEFjdGlvbicsDQorICAgIG5hbWU6ICdDdXQnLA0KKyAgICBjbG9zdXJlOiBjb250cm9sbGVyLiZjdXQsDQorICAgIG1uZW1vbmljOiAnVCcsDQorICAgIGFjY2VsZXJhdG9yOiBzaG9ydGN1dCgnWCcpLA0KKyAgICBzbWFsbEljb246IGltYWdlSWNvbihyZXNvdXJjZToiaWNvbnMvY3V0LnBuZyIsIGNsYXNzOnRoaXMpLA0KKyAgICBzaG9ydERlc2NyaXB0aW9uOiAnQ3V0Jw0KKykNCisNCithY3Rpb24oaWQ6ICdjb3B5QWN0aW9uJywNCisgICAgbmFtZTogJ0NvcHknLA0KKyAgICBjbG9zdXJlOiBjb250cm9sbGVyLiZjb3B5LA0KKyAgICBtbmVtb25pYzogJ0MnLA0KKyAgICBhY2NlbGVyYXRvcjogc2hvcnRjdXQoJ0MnKSwNCisgICAgc21hbGxJY29uOiBpbWFnZUljb24ocmVzb3VyY2U6Imljb25zL3BhZ2VfY29weS5wbmciLCBjbGFzczp0aGlzKSwNCisgICAgc2hvcnREZXNjcmlwdGlvbjogJ0NvcHknDQorKQ0KKw0KK2FjdGlvbihpZDogJ3Bhc3RlQWN0aW9uJywNCisgICAgbmFtZTogJ1Bhc3RlJywNCisgICAgY2xvc3VyZTogY29udHJvbGxlci4mcGFzdGUsDQorICAgIG1uZW1vbmljOiAnUCcsDQorICAgIGFjY2VsZXJhdG9yOiBzaG9ydGN1dCgnVicpLA0KKyAgICBzbWFsbEljb246IGltYWdlSWNvbihyZXNvdXJjZToiaWNvbnMvcGFnZV9wYXN0ZS5wbmciLCBjbGFzczp0aGlzKSwNCisgICAgc2hvcnREZXNjcmlwdGlvbjogJ1Bhc3RlJw0KKykNCisNCithY3Rpb24oaWQ6ICdzZWxlY3RBbGxBY3Rpb24nLA0KKyAgICBuYW1lOiAnU2VsZWN0IEFsbCcsDQorICAgIGNsb3N1cmU6IGNvbnRyb2xsZXIuJnNlbGVjdEFsbCwNCisgICAgbW5lbW9uaWM6ICdBJywNCisgICAgYWNjZWxlcmF0b3I6IHNob3J0Y3V0KCdBJykNCispDQorDQorYWN0aW9uKGlkOiAnaGlzdG9yeVByZXZBY3Rpb24nLA0KKyAgICBuYW1lOiAnUHJldmlvdXMnLA0KKyAgICBjbG9zdXJlOiBjb250cm9sbGVyLiZoaXN0b3J5UHJldiwNCisgICAgbW5lbW9uaWM6ICdQJywNCisgICAgYWNjZWxlcmF0b3I6IHNob3J0Y3V0KEtleUV2ZW50LlZLX0NPTU1BKSwNCisgICAgc21hbGxJY29uOiBpbWFnZUljb24ocmVzb3VyY2U6Imljb25zL2Jvb2tfcHJldmlvdXMucG5nIiwgY2xhc3M6dGhpcyksDQorICAgIHNob3J0RGVzY3JpcHRpb246ICdQcmV2aW91cyBHcm9vdnkgU2NyaXB0JywNCisgICAgZW5hYmxlZDogZmFsc2UgLy8gY29udHJvbGxlciB3aWxsIGVuYWJsZSBhcyBuZWVkZWQNCispDQorDQorYWN0aW9uKGlkOiAnaGlzdG9yeU5leHRBY3Rpb24nLA0KKyAgICBuYW1lOiAnTmV4dCcsDQorICAgIGNsb3N1cmU6IGNvbnRyb2xsZXIuJmhpc3RvcnlOZXh0LA0KKyAgICBtbmVtb25pYzogJ04nLA0KKyAgICBhY2NlbGVyYXRvcjogc2hvcnRjdXQoS2V5RXZlbnQuVktfUEVSSU9EKSwNCisgICAgc21hbGxJY29uOiBpbWFnZUljb24ocmVzb3VyY2U6Imljb25zL2Jvb2tfbmV4dC5wbmciLCBjbGFzczp0aGlzKSwNCisgICAgc2hvcnREZXNjcmlwdGlvbjogJ05leHQgR3Jvb3Z5IFNjcmlwdCcsDQorICAgIGVuYWJsZWQ6IGZhbHNlIC8vIGNvbnRyb2xsZXIgd2lsbCBlbmFibGUgYXMgbmVlZGVkDQorKQ0KKw0KK2FjdGlvbihpZDogJ2NsZWFyT3V0cHV0QWN0aW9uJywNCisgICAgbmFtZTogJ0NsZWFyIE91dHB1dCcsDQorICAgIGNsb3N1cmU6IGNvbnRyb2xsZXIuJmNsZWFyT3V0cHV0LA0KKyAgICBtbmVtb25pYzogJ08nLA0KKyAgICBhY2NlbGVyYXRvcjogc2hvcnRjdXQoJ1cnKQ0KKykNCisNCithY3Rpb24oaWQ6ICdydW5BY3Rpb24nLA0KKyAgICBuYW1lOiAnUnVuJywNCisgICAgY2xvc3VyZTogY29udHJvbGxlci4mcnVuU2NyaXB0LA0KKyAgICBtbmVtb25pYzogJ1InLA0KKyAgICBrZXlTdHJva2U6IHNob3J0Y3V0KCdFTlRFUicpLA0KKyAgICBhY2NlbGVyYXRvcjogc2hvcnRjdXQoJ1InKSwNCisgICAgc21hbGxJY29uOiBpbWFnZUljb24ocmVzb3VyY2U6Imljb25zL3NjcmlwdF9nby5wbmciLCBjbGFzczp0aGlzKSwNCisgICAgc2hvcnREZXNjcmlwdGlvbjogJ0V4ZWN1dGUgR3Jvb3Z5IFNjcmlwdCcNCispDQorDQorYWN0aW9uKGlkOiAncnVuU2VsZWN0aW9uQWN0aW9uJywNCisgICAgbmFtZTogJ1J1biBTZWxlY3Rpb24nLA0KKyAgICBjbG9zdXJlOiBjb250cm9sbGVyLiZydW5TZWxlY3RlZFNjcmlwdCwNCisgICAgbW5lbW9uaWM6ICdFJywNCisgICAga2V5U3Ryb2tlOiBzaG9ydGN1dCgnc2hpZnQgRU5URVInKSwNCisgICAgYWNjZWxlcmF0b3I6IHNob3J0Y3V0KCdzaGlmdCBSJykNCispDQorDQorYWN0aW9uKGlkOiAnaW5zcGVjdExhc3RBY3Rpb24nLA0KKyAgICBuYW1lOiAnSW5zcGVjdCBMYXN0JywNCisgICAgY2xvc3VyZTogY29udHJvbGxlci4maW5zcGVjdExhc3QsDQorICAgIG1uZW1vbmljOiAnSScsDQorICAgIGFjY2VsZXJhdG9yOiBzaG9ydGN1dCgnSScpDQorKQ0KKw0KK2FjdGlvbihpZDogJ2luc3BlY3RWYXJpYWJsZXNBY3Rpb24nLA0KKyAgICBuYW1lOiAnSW5zcGVjdCBWYXJpYWJsZXMnLA0KKyAgICBjbG9zdXJlOiBjb250cm9sbGVyLiZpbnNwZWN0VmFyaWFibGVzLA0KKyAgICBtbmVtb25pYzogJ1YnLA0KKyAgICBhY2NlbGVyYXRvcjogc2hvcnRjdXQoJ0onKQ0KKykNCisNCithY3Rpb24oaWQ6ICdjYXB0dXJlU3RkT3V0QWN0aW9uJywNCisgICAgbmFtZTogJ0NhcHR1cmUgU3RhbmRhcmQgT3V0cHV0JywNCisgICAgY2xvc3VyZTogY29udHJvbGxlci4mY2FwdHVyZVN0ZE91dCwNCisgICAgbW5lbW9uaWM6ICdDJw0KKykNCisNCithY3Rpb24oaWQ6ICdmdWxsU3RhY2tUcmFjZXNBY3Rpb24nLA0KKyAgICBuYW1lOiAnU2hvdyBGdWxsIFN0YWNrIFRyYWNlcycsDQorICAgIGNsb3N1cmU6IGNvbnRyb2xsZXIuJmZ1bGxTdGFja1RyYWNlcywNCisgICAgbW5lbW9uaWM6ICdGJw0KKykNCisNCithY3Rpb24oaWQ6J3Nob3dUb29sYmFyQWN0aW9uJywNCisgICAgbmFtZTogJ1Nob3cgVG9vbGJhcicsDQorICAgIGNsb3N1cmU6IGNvbnRyb2xsZXIuJnNob3dUb29sYmFyLA0KKyAgICBtbmVtb25pYzogJ1QnDQorKQ0KKw0KK2FjdGlvbihpZDogJ2xhcmdlckZvbnRBY3Rpb24nLA0KKyAgICBuYW1lOiAnTGFyZ2VyIEZvbnQnLA0KKyAgICBjbG9zdXJlOiBjb250cm9sbGVyLiZsYXJnZXJGb250LA0KKyAgICBtbmVtb25pYzogJ0wnLA0KKyAgICBhY2NlbGVyYXRvcjogc2hvcnRjdXQoJ3NoaWZ0IEwnKQ0KKykNCisNCithY3Rpb24oaWQ6ICdzbWFsbGVyRm9udEFjdGlvbicsDQorICAgIG5hbWU6ICdTbWFsbGVyIEZvbnQnLA0KKyAgICBjbG9zdXJlOiBjb250cm9sbGVyLiZzbWFsbGVyRm9udCwNCisgICAgbW5lbW9uaWM6ICdTJywNCisgICAgYWNjZWxlcmF0b3I6IHNob3J0Y3V0KCdzaGlmdCBTJykNCispDQorDQorYWN0aW9uKGlkOiAnYWJvdXRBY3Rpb24nLA0KKyAgICBuYW1lOiAnQWJvdXQnLA0KKyAgICBjbG9zdXJlOiBjb250cm9sbGVyLiZzaG93QWJvdXQsDQorICAgIG1uZW1vbmljOiAnQScNCispDQorDQorYWN0aW9uKGlkOiAnaW50ZXJydXB0QWN0aW9uJywNCisgICAgbmFtZTogJ0ludGVycnVwdCcsDQorICAgIGNsb3N1cmU6IGNvbnRyb2xsZXIuJmNvbmZpcm1SdW5JbnRlcnJ1cHQNCispDQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS9Db25zb2xlSWNvbi5wbmcgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3VpL0NvbnNvbGVJY29uLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWMwN2YwCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS9Db25zb2xlSWNvbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS9Db25zb2xlU3VwcG9ydC5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS9Db25zb2xlU3VwcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NDM5YjUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3VpL0NvbnNvbGVTdXBwb3J0LmphdmEKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGdyb292eS51aTsKKworaW1wb3J0IGdyb292eS5sYW5nLkdyb292eVNoZWxsOworCitpbXBvcnQgamF2YS5hd3QuQ29sb3I7CisKK2ltcG9ydCBqYXZheC5zd2luZy5KVGV4dFBhbmU7CitpbXBvcnQgamF2YXguc3dpbmcudGV4dC5TdHlsZTsKK2ltcG9ydCBqYXZheC5zd2luZy50ZXh0LlN0eWxlQ29uc3RhbnRzOworaW1wb3J0IGphdmF4LnN3aW5nLnRleHQuU3R5bGVDb250ZXh0OworaW1wb3J0IGphdmF4LnN3aW5nLnRleHQuU3R5bGVkRG9jdW1lbnQ7CisKKy8qKgorICogQmFzZSBjbGFzcyBmb3IgY29uc29sZQorICogCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29uc29sZVN1cHBvcnQgeworCisgICAgU3R5bGUgcHJvbXB0U3R5bGU7CisgICAgU3R5bGUgY29tbWFuZFN0eWxlOworICAgIFN0eWxlIG91dHB1dFN0eWxlOworICAgIHByaXZhdGUgR3Jvb3Z5U2hlbGwgc2hlbGw7CisgICAgaW50IGNvdW50ZXI7CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRTdHlsZXNUb0RvY3VtZW50KEpUZXh0UGFuZSBvdXRwdXRBcmVhKSB7CisgICAgICAgIFN0eWxlZERvY3VtZW50IGRvYyA9IG91dHB1dEFyZWEuZ2V0U3R5bGVkRG9jdW1lbnQoKTsKKworICAgICAgICBTdHlsZSBkZWYgPSBTdHlsZUNvbnRleHQuZ2V0RGVmYXVsdFN0eWxlQ29udGV4dCgpLmdldFN0eWxlKFN0eWxlQ29udGV4dC5ERUZBVUxUX1NUWUxFKTsKKworICAgICAgICBTdHlsZSByZWd1bGFyID0gZG9jLmFkZFN0eWxlKCJyZWd1bGFyIiwgZGVmKTsKKyAgICAgICAgU3R5bGVDb25zdGFudHMuc2V0Rm9udEZhbWlseShkZWYsICJNb25vc3BhY2VkIik7CisKKyAgICAgICAgcHJvbXB0U3R5bGUgPSBkb2MuYWRkU3R5bGUoInByb21wdCIsIHJlZ3VsYXIpOworICAgICAgICBTdHlsZUNvbnN0YW50cy5zZXRGb3JlZ3JvdW5kKHByb21wdFN0eWxlLCBDb2xvci5CTFVFKTsKKworICAgICAgICBjb21tYW5kU3R5bGUgPSBkb2MuYWRkU3R5bGUoImNvbW1hbmQiLCByZWd1bGFyKTsKKyAgICAgICAgU3R5bGVDb25zdGFudHMuc2V0Rm9yZWdyb3VuZChjb21tYW5kU3R5bGUsIENvbG9yLk1BR0VOVEEpOworCisgICAgICAgIG91dHB1dFN0eWxlID0gZG9jLmFkZFN0eWxlKCJvdXRwdXQiLCByZWd1bGFyKTsKKyAgICAgICAgU3R5bGVDb25zdGFudHMuc2V0Qm9sZChvdXRwdXRTdHlsZSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIFN0eWxlIGdldENvbW1hbmRTdHlsZSgpIHsKKyAgICAgICAgcmV0dXJuIGNvbW1hbmRTdHlsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3R5bGUgZ2V0T3V0cHV0U3R5bGUoKSB7CisgICAgICAgIHJldHVybiBvdXRwdXRTdHlsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3R5bGUgZ2V0UHJvbXB0U3R5bGUoKSB7CisgICAgICAgIHJldHVybiBwcm9tcHRTdHlsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgR3Jvb3Z5U2hlbGwgZ2V0U2hlbGwoKSB7CisgICAgICAgIGlmIChzaGVsbCA9PSBudWxsKSB7CisgICAgICAgICAgICBzaGVsbCA9IG5ldyBHcm9vdnlTaGVsbCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzaGVsbDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgT2JqZWN0IGV2YWx1YXRlKFN0cmluZyB0ZXh0KSB7CisgICAgICAgIFN0cmluZyBuYW1lID0gIlNjcmlwdCIgKyBjb3VudGVyKys7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0U2hlbGwoKS5ldmFsdWF0ZSh0ZXh0LCBuYW1lKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGhhbmRsZUV4Y2VwdGlvbih0ZXh0LCBlKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGhhbmRsZUV4Y2VwdGlvbihTdHJpbmcgdGV4dCwgRXhjZXB0aW9uIGUpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdWkvQ29uc29sZVRleHRFZGl0b3IuamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdWkvQ29uc29sZVRleHRFZGl0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDhjMTFhCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS9Db25zb2xlVGV4dEVkaXRvci5qYXZhCkBAIC0wLDAgKzEsMjE2IEBACisvKg0KKyAqIFVJUmVzb3VyY2VNZ3IuamF2YQ0KKyAqDQorICogQ29weXJpZ2h0IDIwMDQsIDIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLg0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KK3BhY2thZ2UgZ3Jvb3Z5LnVpOw0KKw0KK2ltcG9ydCBncm9vdnkudWkudGV4dC5Hcm9vdnlGaWx0ZXI7DQoraW1wb3J0IGdyb292eS51aS50ZXh0LlN0cnVjdHVyZWRTeW50YXhSZXNvdXJjZXM7DQoraW1wb3J0IGdyb292eS51aS50ZXh0LlRleHRFZGl0b3I7DQoraW1wb3J0IGdyb292eS51aS50ZXh0LlRleHRVbmRvTWFuYWdlcjsNCisNCitpbXBvcnQgamF2YXguc3dpbmcuQWJzdHJhY3RBY3Rpb247DQoraW1wb3J0IGphdmF4LnN3aW5nLkFjdGlvbjsNCitpbXBvcnQgamF2YXguc3dpbmcuQWN0aW9uTWFwOw0KK2ltcG9ydCBqYXZheC5zd2luZy5JbnB1dE1hcDsNCitpbXBvcnQgamF2YXguc3dpbmcuSkNvbXBvbmVudDsNCitpbXBvcnQgamF2YXguc3dpbmcuSlNjcm9sbFBhbmU7DQoraW1wb3J0IGphdmF4LnN3aW5nLktleVN0cm9rZTsNCitpbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuRG9jdW1lbnRFdmVudDsNCitpbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuRG9jdW1lbnRMaXN0ZW5lcjsNCitpbXBvcnQgamF2YXguc3dpbmcudGV4dC5EZWZhdWx0U3R5bGVkRG9jdW1lbnQ7DQoraW1wb3J0IGphdmEuYXd0LmRhdGF0cmFuc2Zlci5EYXRhRmxhdm9yOw0KK2ltcG9ydCBqYXZhLmF3dC5kYXRhdHJhbnNmZXIuVHJhbnNmZXJhYmxlOw0KK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsNCitpbXBvcnQgamF2YS5hd3QuZXZlbnQuSW5wdXRFdmVudDsNCitpbXBvcnQgamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQ7DQoraW1wb3J0IGphdmEuYXd0LnByaW50LlByaW50ZXJKb2I7DQoraW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VFdmVudDsNCitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOw0KK2ltcG9ydCBqYXZhLmlvLkZpbGU7DQorDQorLyoqDQorICogQ29tcG9uZW50IHdoaWNoIHByb3ZpZGVzIGEgc3R5bGVkIGVkaXRvciBmb3IgdGhlIGNvbnNvbGUuDQorICoNCisgKiBAdmVyc2lvbiAkSWQkDQorICogQGF1dGhvciBoaXBweQ0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb25zb2xlVGV4dEVkaXRvciBleHRlbmRzIEpTY3JvbGxQYW5lIHsNCisNCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUHJpbnRlckpvYiBQUklOVEVSX0pPQiA9IFByaW50ZXJKb2IuZ2V0UHJpbnRlckpvYigpOw0KKyAgICAgICAgDQorICAgIHByaXZhdGUgVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gbmV3IFRleHRFZGl0b3IodHJ1ZSwgdHJ1ZSwgdHJ1ZSk7DQorICAgIA0KKyAgICBwcml2YXRlIFVuZG9BY3Rpb24gdW5kb0FjdGlvbiA9IG5ldyBVbmRvQWN0aW9uKCk7DQorICAgIHByaXZhdGUgUmVkb0FjdGlvbiByZWRvQWN0aW9uID0gbmV3IFJlZG9BY3Rpb24oKTsNCisgICAgcHJpdmF0ZSBQcmludEFjdGlvbiBwcmludEFjdGlvbiA9IG5ldyBQcmludEFjdGlvbigpOw0KKyAgICANCisgICAgcHJpdmF0ZSBib29sZWFuIGVkaXRhYmxlID0gdHJ1ZTsNCisgICAgDQorICAgIHByaXZhdGUgRmlsZSB0ZXh0RmlsZTsNCisgICAgDQorICAgIHByaXZhdGUgVGV4dFVuZG9NYW5hZ2VyIHVuZG9NYW5hZ2VyOw0KKw0KKyAgICAvKioNCisgICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBDb25zb2xlVGV4dEVkaXRvcg0KKyAgICAgKi8NCisgICAgcHVibGljIENvbnNvbGVUZXh0RWRpdG9yKCkgeyAgICAgICAgDQorICAgICAgICB0ZXh0RWRpdG9yLnNldEZvbnQoU3RydWN0dXJlZFN5bnRheFJlc291cmNlcy5FRElUT1JfRk9OVCk7DQorICAgICAgICANCisgICAgICAgIHNldFdoZWVsU2Nyb2xsaW5nRW5hYmxlZCh0cnVlKTsNCisNCisgICAgICAgIHNldFZpZXdwb3J0Vmlldyh0ZXh0RWRpdG9yKTsNCisgICAgICAgIA0KKyAgICAgICAgdGV4dEVkaXRvci5zZXREcmFnRW5hYmxlZChlZGl0YWJsZSk7DQorICAgICAgICANCisgICAgICAgIGluaXRBY3Rpb25zKCk7DQorICAgICAgICANCisgICAgICAgIERlZmF1bHRTdHlsZWREb2N1bWVudCBkb2MgPSBuZXcgRGVmYXVsdFN0eWxlZERvY3VtZW50KCk7DQorICAgICAgICBkb2Muc2V0RG9jdW1lbnRGaWx0ZXIobmV3IEdyb292eUZpbHRlcihkb2MpKTsNCisgICAgICAgIHRleHRFZGl0b3Iuc2V0RG9jdW1lbnQoZG9jKTsNCisNCisgICAgICAgIC8vIGNyZWF0ZSBhbmQgYWRkIHRoZSB1bmRvL3JlZG8gbWFuYWdlcg0KKyAgICAgICAgdGhpcy51bmRvTWFuYWdlciA9IG5ldyBUZXh0VW5kb01hbmFnZXIoKTsNCisgICAgICAgIGRvYy5hZGRVbmRvYWJsZUVkaXRMaXN0ZW5lcih1bmRvTWFuYWdlcik7DQorICAgICAgICANCisgICAgICAgIC8vIGFkZCB0aGUgdW5kbyBhY3Rpb25zDQorICAgICAgICB1bmRvTWFuYWdlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHVuZG9BY3Rpb24pOw0KKyAgICAgICAgdW5kb01hbmFnZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihyZWRvQWN0aW9uKTsNCisNCisgICAgICAgIGRvYy5hZGREb2N1bWVudExpc3RlbmVyKHVuZG9BY3Rpb24pOw0KKyAgICAgICAgZG9jLmFkZERvY3VtZW50TGlzdGVuZXIocmVkb0FjdGlvbik7DQorICAgICAgICANCisgICAgICAgIElucHV0TWFwIGltID0gdGV4dEVkaXRvci5nZXRJbnB1dE1hcChKQ29tcG9uZW50LldIRU5fSU5fRk9DVVNFRF9XSU5ET1cpOw0KKyAgICAgICAgS2V5U3Ryb2tlIGtzID0gS2V5U3Ryb2tlLmdldEtleVN0cm9rZShLZXlFdmVudC5WS19aLCBJbnB1dEV2ZW50LkNUUkxfTUFTSywgZmFsc2UpOw0KKyAgICAgICAgaW0ucHV0KGtzLCBTdHJ1Y3R1cmVkU3ludGF4UmVzb3VyY2VzLlVORE8pOw0KKyAgICAgICAgQWN0aW9uTWFwIGFtID0gdGV4dEVkaXRvci5nZXRBY3Rpb25NYXAoKTsNCisgICAgICAgIGFtLnB1dChTdHJ1Y3R1cmVkU3ludGF4UmVzb3VyY2VzLlVORE8sIHVuZG9BY3Rpb24pOw0KKw0KKyAgICAgICAga3MgPSBLZXlTdHJva2UuZ2V0S2V5U3Ryb2tlKEtleUV2ZW50LlZLX1ksIElucHV0RXZlbnQuQ1RSTF9NQVNLLCBmYWxzZSk7DQorICAgICAgICBpbS5wdXQoa3MsIFN0cnVjdHVyZWRTeW50YXhSZXNvdXJjZXMuUkVETyk7DQorICAgICAgICBhbS5wdXQoU3RydWN0dXJlZFN5bnRheFJlc291cmNlcy5SRURPLCByZWRvQWN0aW9uKTsNCisNCisgICAgICAgIGtzID0gS2V5U3Ryb2tlLmdldEtleVN0cm9rZShLZXlFdmVudC5WS19QLCBJbnB1dEV2ZW50LkNUUkxfTUFTSywgZmFsc2UpOw0KKyAgICAgICAgaW0ucHV0KGtzLCBTdHJ1Y3R1cmVkU3ludGF4UmVzb3VyY2VzLlBSSU5UKTsNCisgICAgICAgIGFtLnB1dChTdHJ1Y3R1cmVkU3ludGF4UmVzb3VyY2VzLlBSSU5ULCBwcmludEFjdGlvbik7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBib29sZWFuIGNsaXBCb2FyZEF2YWlsYWJsZSgpIHsNCisgICAgICAgIFRyYW5zZmVyYWJsZSB0ID0gU3RydWN0dXJlZFN5bnRheFJlc291cmNlcy5TWVNURU1fQ0xJUEJPQVJELmdldENvbnRlbnRzKHRoaXMpOw0KKyAgICAgICAgcmV0dXJuIHQuaXNEYXRhRmxhdm9yU3VwcG9ydGVkKERhdGFGbGF2b3Iuc3RyaW5nRmxhdm9yKTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIFRleHRFZGl0b3IgZ2V0VGV4dEVkaXRvcigpIHsNCisgICAgICAgIHJldHVybiB0ZXh0RWRpdG9yOw0KKyAgICB9DQorDQorICAgIHByb3RlY3RlZCB2b2lkIGluaXRBY3Rpb25zKCkgew0KKyAgICAgICAgQWN0aW9uTWFwIG1hcCA9IGdldEFjdGlvbk1hcCgpOw0KKyAgICAgICAgDQorICAgICAgICBQcmludEFjdGlvbiBwcmludEFjdGlvbiA9IG5ldyBQcmludEFjdGlvbigpOw0KKyAgICAgICAgbWFwLnB1dChTdHJ1Y3R1cmVkU3ludGF4UmVzb3VyY2VzLlBSSU5ULCBwcmludEFjdGlvbik7DQorICAgIH0NCisgICAgICAgIA0KKyAgICBwcml2YXRlIGNsYXNzIFByaW50QWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RBY3Rpb24gew0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgUHJpbnRBY3Rpb24oKSB7DQorICAgICAgICAgICAgc2V0RW5hYmxlZCh0cnVlKTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGFlKSB7DQorICAgICAgICAgICAgUFJJTlRFUl9KT0Iuc2V0UGFnZWFibGUodGV4dEVkaXRvcik7DQorICAgICAgICAgICAgDQorICAgICAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICAgICAgaWYgKFBSSU5URVJfSk9CLnByaW50RGlhbG9nKCkpIHsNCisgICAgICAgICAgICAgICAgICAgIFBSSU5URVJfSk9CLnByaW50KCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQorICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9IC8vIGVuZCBDb25zb2xlVGV4dEVkaXRvci5QcmludEFjdGlvbg0KKyAgICANCisgICAgcHJpdmF0ZSBjbGFzcyBSZWRvQWN0aW9uIGV4dGVuZHMgVXBkYXRlQ2FyZXRMaXN0ZW5lciBpbXBsZW1lbnRzIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgew0KKw0KKyAgICAgICAgcHVibGljIFJlZG9BY3Rpb24oKSB7DQorICAgICAgICAgICAgc2V0RW5hYmxlZChmYWxzZSk7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBhZSkgew0KKyAgICAgICAgICAgIHVuZG9NYW5hZ2VyLnJlZG8oKTsNCisgICAgICAgICAgICBzZXRFbmFibGVkKHVuZG9NYW5hZ2VyLmNhblJlZG8oKSk7DQorICAgICAgICAgICAgdW5kb0FjdGlvbi5zZXRFbmFibGVkKHVuZG9NYW5hZ2VyLmNhblVuZG8oKSk7DQorICAgICAgICAgICAgc3VwZXIuYWN0aW9uUGVyZm9ybWVkKGFlKTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBwY2UpIHsNCisgICAgICAgICAgICBzZXRFbmFibGVkKHVuZG9NYW5hZ2VyLmNhblJlZG8oKSk7DQorICAgICAgICB9DQorICAgIH0gLy8gZW5kIENvbnNvbGVUZXh0RWRpdG9yLlJlZG9BY3Rpb24NCisgICAgDQorICAgIHByaXZhdGUgYWJzdHJhY3QgY2xhc3MgVXBkYXRlQ2FyZXRMaXN0ZW5lciBleHRlbmRzIEFic3RyYWN0QWN0aW9uIGltcGxlbWVudHMgRG9jdW1lbnRMaXN0ZW5lciB7DQorICAgICAgICANCisgICAgICAgIHByb3RlY3RlZCBpbnQgbGFzdFVwZGF0ZTsNCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIHZvaWQgY2hhbmdlZFVwZGF0ZShEb2N1bWVudEV2ZW50IGRlKSB7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyB2b2lkIGluc2VydFVwZGF0ZShEb2N1bWVudEV2ZW50IGRlKSB7DQorICAgICAgICAgICAgbGFzdFVwZGF0ZSA9IGRlLmdldE9mZnNldCgpICsgZGUuZ2V0TGVuZ3RoKCk7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZVVwZGF0ZShEb2N1bWVudEV2ZW50IGRlKSB7DQorICAgICAgICAgICAgbGFzdFVwZGF0ZSA9IGRlLmdldE9mZnNldCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgYWUpIHsNCisgICAgICAgICAgICB0ZXh0RWRpdG9yLnNldENhcmV0UG9zaXRpb24obGFzdFVwZGF0ZSk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgY2xhc3MgVW5kb0FjdGlvbiBleHRlbmRzIFVwZGF0ZUNhcmV0TGlzdGVuZXIgIGltcGxlbWVudHMgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7DQorDQorICAgICAgICBwdWJsaWMgVW5kb0FjdGlvbigpIHsNCisgICAgICAgICAgICBzZXRFbmFibGVkKGZhbHNlKTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGFlKSB7DQorICAgICAgICAgICAgdW5kb01hbmFnZXIudW5kbygpOw0KKyAgICAgICAgICAgIHNldEVuYWJsZWQodW5kb01hbmFnZXIuY2FuVW5kbygpKTsNCisgICAgICAgICAgICByZWRvQWN0aW9uLnNldEVuYWJsZWQodW5kb01hbmFnZXIuY2FuUmVkbygpKTsNCisgICAgICAgICAgICBzdXBlci5hY3Rpb25QZXJmb3JtZWQoYWUpOw0KKyAgICAgICAgfSAgICAgICAgDQorICAgICAgICANCisgICAgICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgcGNlKSB7DQorICAgICAgICAgICAgc2V0RW5hYmxlZCh1bmRvTWFuYWdlci5jYW5VbmRvKCkpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHB1YmxpYyBBY3Rpb24gZ2V0VW5kb0FjdGlvbigpIHsNCisgICAgICAgIHJldHVybiB1bmRvQWN0aW9uOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBBY3Rpb24gZ2V0UmVkb0FjdGlvbigpIHsNCisgICAgICAgIHJldHVybiByZWRvQWN0aW9uOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBBY3Rpb24gZ2V0UHJpbnRBY3Rpb24oKSB7DQorICAgICAgICByZXR1cm4gcHJpbnRBY3Rpb247DQorICAgIH0NCisNCit9DQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS9Db25zb2xlVmlldy5ncm9vdnkgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3VpL0NvbnNvbGVWaWV3Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGU2MTBhCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS9Db25zb2xlVmlldy5ncm9vdnkKQEAgLTAsMCArMSwxMDggQEAKKy8qDQorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorcGFja2FnZSBncm9vdnkudWkNCisNCitpbXBvcnQgZ3Jvb3Z5LnVpLnZpZXcuKg0KK2ltcG9ydCBqYXZheC5zd2luZy5VSU1hbmFnZXINCitpbXBvcnQgc3RhdGljIGphdmF4LnN3aW5nLldpbmRvd0NvbnN0YW50cy5ET19OT1RISU5HX09OX0NMT1NFDQoraW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkRvY3VtZW50TGlzdGVuZXINCisNCitzd2l0Y2ggKFVJTWFuYWdlci5nZXRTeXN0ZW1Mb29rQW5kRmVlbENsYXNzTmFtZSgpKSB7DQorICAgIGNhc2UgJ2NvbS5zdW4uamF2YS5zd2luZy5wbGFmLndpbmRvd3MuV2luZG93c0xvb2tBbmRGZWVsJzoNCisgICAgY2FzZSAnY29tLnN1bi5qYXZhLnN3aW5nLnBsYWYud2luZG93cy5XaW5kb3dzQ2xhc3NpY0xvb2tBbmRGZWVsJzoNCisgICAgICAgIGJ1aWxkKFdpbmRvd3NEZWZhdWx0cykNCisgICAgICAgIGJyZWFrDQorDQorICAgIGNhc2UgJ2FwcGxlLmxhZi5BcXVhTG9va0FuZEZlZWwnOg0KKyAgICAgICAgYnVpbGQoTWFjT1NYRGVmYXVsdHMpDQorICAgICAgICBicmVhaw0KKw0KKyAgICBjYXNlICdjb20uc3VuLmphdmEuc3dpbmcucGxhZi5ndGsuR1RLTG9va0FuZEZlZWwnOg0KKyAgICAgICAgYnVpbGQoR1RLRGVmYXVsdHMpDQorICAgICAgICBicmVhaw0KKw0KKyAgICBkZWZhdWx0Og0KKyAgICAgICAgYnVpbGQoRGVmYXVsdHMpDQorICAgICAgICBicmVhaw0KK30NCisNCitmcmFtZSgNCisgICAgdGl0bGU6ICdHcm9vdnlDb25zb2xlJywNCisgICAgbG9jYXRpb246IFsxMDAsMTAwXSwgLy8gaW4gZ3Jvb3Z5IDIuMCB1c2UgcGxhdGZvcm0gZGVmYXVsdCBsb2NhdGlvbg0KKyAgICBpY29uSW1hZ2U6IGltYWdlSWNvbigiL2dyb292eS91aS9Db25zb2xlSWNvbi5wbmciKS5pbWFnZSwNCisgICAgZGVmYXVsdENsb3NlT3BlcmF0aW9uOiBET19OT1RISU5HX09OX0NMT1NFLA0KKyAgICBpZDonY29uc29sZUZyYW1lJw0KKykgew0KKyAgICBidWlsZChtZW51QmFyQ2xhc3MpDQorDQorICAgIGJ1aWxkKGNvbnRlbnRQYW5lQ2xhc3MpDQorDQorICAgIGJ1aWxkKHRvb2xCYXJDbGFzcykNCisNCisgICAgYnVpbGQoc3RhdHVzQmFyQ2xhc3MpDQorDQorICAgIGRpYWxvZyh0aXRsZTogJ0dyb292eSBleGVjdXRpbmcnLA0KKyAgICAgICAgbW9kYWw6IHRydWUsDQorICAgICAgICBpZDoncnVuV2FpdERpYWxvZycsDQorICAgICAgICBwYWNrOnRydWUNCisgICAgKSB7DQorICAgICAgICB2Ym94KGJvcmRlcjogZW1wdHlCb3JkZXIoNikpIHsNCisgICAgICAgICAgICBsYWJlbCh0ZXh0OiAiR3Jvb3Z5IGlzIG5vdyBleGVjdXRpbmcuIFBsZWFzZSB3YWl0LiIsIGFsaWdubWVudFg6IDAuNWYpDQorICAgICAgICAgICAgdnN0cnV0KCkNCisgICAgICAgICAgICBidXR0b24oaW50ZXJydXB0QWN0aW9uLA0KKyAgICAgICAgICAgICAgICBtYXJnaW46IFsxMCwgMjAsIDEwLCAyMF0sDQorICAgICAgICAgICAgICAgIGFsaWdubWVudFg6IDAuNWYNCisgICAgICAgICAgICApDQorICAgICAgICB9DQorICAgIH0NCit9DQorDQorDQorY29udHJvbGxlci5wcm9tcHRTdHlsZSA9IHByb21wdFN0eWxlDQorY29udHJvbGxlci5jb21tYW5kU3R5bGUgPSBjb21tYW5kU3R5bGUNCitjb250cm9sbGVyLm91dHB1dFN0eWxlID0gb3V0cHV0U3R5bGUNCitjb250cm9sbGVyLnJlc3VsdFN0eWxlID0gcmVzdWx0U3R5bGUNCisNCisvLyBhZGQgdGhlIHdpbmRvdyBjbG9zZSBoYW5kbGVyDQorY29uc29sZUZyYW1lLndpbmRvd0Nsb3NpbmcgPSBjb250cm9sbGVyLiZleGl0DQorDQorLy8gbGluayBpbiByZWZlcmVuY2VzIHRvIHRoZSBjb250cm9sbGVyDQorY29udHJvbGxlci5pbnB1dEVkaXRvciA9IGlucHV0RWRpdG9yDQorY29udHJvbGxlci5pbnB1dEFyZWEgPSBpbnB1dEVkaXRvci50ZXh0RWRpdG9yDQorY29udHJvbGxlci5vdXRwdXRBcmVhID0gb3V0cHV0QXJlYQ0KK2NvbnRyb2xsZXIuc3RhdHVzTGFiZWwgPSBzdGF0dXMNCitjb250cm9sbGVyLmZyYW1lID0gY29uc29sZUZyYW1lDQorY29udHJvbGxlci5ydW5XYWl0RGlhbG9nID0gcnVuV2FpdERpYWxvZw0KK2NvbnRyb2xsZXIucm93TnVtQW5kQ29sTnVtID0gcm93TnVtQW5kQ29sTnVtDQorY29udHJvbGxlci50b29sYmFyID0gdG9vbGJhcg0KKw0KKy8vIGxpbmsgYWN0aW9ucw0KK2NvbnRyb2xsZXIuc2F2ZUFjdGlvbiA9IHNhdmVBY3Rpb24NCitjb250cm9sbGVyLnByZXZIaXN0b3J5QWN0aW9uID0gaGlzdG9yeVByZXZBY3Rpb24NCitjb250cm9sbGVyLm5leHRIaXN0b3J5QWN0aW9uID0gaGlzdG9yeU5leHRBY3Rpb24NCitjb250cm9sbGVyLmZ1bGxTdGFja1RyYWNlc0FjdGlvbiA9IGZ1bGxTdGFja1RyYWNlc0FjdGlvbg0KK2NvbnRyb2xsZXIuc2hvd1Rvb2xiYXJBY3Rpb24gPSBzaG93VG9vbGJhckFjdGlvbg0KKw0KKy8vIHNvbWUgbW9yZSBVSSBsaW5rYWdlDQorY29udHJvbGxlci5pbnB1dEFyZWEuYWRkQ2FyZXRMaXN0ZW5lcihjb250cm9sbGVyKQ0KK2NvbnRyb2xsZXIuaW5wdXRBcmVhLmRvY3VtZW50LmFkZERvY3VtZW50TGlzdGVuZXIoeyBjb250cm9sbGVyLnNldERpcnR5KHRydWUpIH0gYXMgRG9jdW1lbnRMaXN0ZW5lcikNCitjb250cm9sbGVyLnJvb3RFbGVtZW50ID0gaW5wdXRBcmVhLmRvY3VtZW50LmRlZmF1bHRSb290RWxlbWVudA0KKw0KKw0KKw0KKy8vIGRvbid0IHNlbmQgYW55IHJldHVybiB2YWx1ZSBmcm9tIHRoZSB2aWV3LCBhbGwgaXRlbXMgc2hvdWxkIGJlIHJlZmVyZW5jZWQgdmlhIHRoZSBiaW5kaW5ncw0KK3JldHVybiBudWxsDQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS9Hcm9vdnlNYWluLmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3VpL0dyb292eU1haW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGMwMWU3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS9Hcm9vdnlNYWluLmphdmEKQEAgLTAsMCArMSw0OTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBncm9vdnkudWk7CisKK2ltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlTaGVsbDsKK2ltcG9ydCBncm9vdnkubGFuZy5TY3JpcHQ7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNsaS5Db21tYW5kTGluZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY2xpLkNvbW1hbmRMaW5lUGFyc2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jbGkuSGVscEZvcm1hdHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY2xpLk9wdGlvbkJ1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNsaS5PcHRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jbGkuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNsaS5Qb3NpeFBhcnNlcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLkNvbXBpbGVyQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuSW52b2tlckhlbHBlcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuSW52b2tlckludm9jYXRpb25FeGNlcHRpb247CisKKy8qKgorICogQSBDb21tYW5kIGxpbmUgdG8gZXhlY3V0ZSBncm9vdnkuCisgKgorICogQGF1dGhvciBKZXJlbXkgUmF5bmVyCisgKiBAYXV0aG9yIFl1cmkgU2NoaW1rZQorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgR3Jvb3Z5TWFpbiB7CisKKyAgICAvLyBhcmd1bWVudHMgdG8gdGhlIHNjcmlwdAorICAgIHByaXZhdGUgTGlzdCBhcmdzOworCisgICAgLy8gaXMgdGhpcyBhIGZpbGUgb24gZGlzaworICAgIHByaXZhdGUgYm9vbGVhbiBpc1NjcmlwdEZpbGU7CisKKyAgICAvLyBmaWxlbmFtZSBvciBjb250ZW50IG9mIHNjcmlwdAorICAgIHByaXZhdGUgU3RyaW5nIHNjcmlwdDsKKworICAgIC8vIHByb2Nlc3MgYXJncyBhcyBpbnB1dCBmaWxlcworICAgIHByaXZhdGUgYm9vbGVhbiBwcm9jZXNzRmlsZXM7CisKKyAgICAvLyBlZGl0IGlucHV0IGZpbGVzIGluIHBsYWNlCisgICAgcHJpdmF0ZSBib29sZWFuIGVkaXRGaWxlczsKKworICAgIC8vIGF1dG9tYXRpY2FsbHkgb3V0cHV0IHRoZSByZXN1bHQgb2YgZWFjaCBzY3JpcHQKKyAgICBwcml2YXRlIGJvb2xlYW4gYXV0b091dHB1dDsKKworICAgIC8vIGF1dG9tYXRpY2FsbHkgc3BsaXQgZWFjaCBsaW5lIHVzaW5nIHRoZSBzcGxpdHBhdHRlcm4KKyAgICBwcml2YXRlIGJvb2xlYW4gYXV0b1NwbGl0OworCisgICAgLy8gVGhlIHBhdHRlcm4gdXNlZCB0byBzcGxpdCB0aGUgY3VycmVudCBsaW5lCisgICAgcHJpdmF0ZSBTdHJpbmcgc3BsaXRQYXR0ZXJuID0gIiAiOworCisgICAgLy8gcHJvY2VzcyBzb2NrZXRzCisgICAgcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NTb2NrZXRzOworCisgICAgLy8gcG9ydCB0byBsaXN0ZW4gb24gd2hlbiBwcm9jZXNzaW5nIHNvY2tldHMKKyAgICBwcml2YXRlIGludCBwb3J0OworCisgICAgLy8gYmFja3VwIGlucHV0IGZpbGVzIHdpdGggZXh0ZW5zaW9uCisgICAgcHJpdmF0ZSBTdHJpbmcgYmFja3VwRXh0ZW5zaW9uOworCisgICAgLy8gZG8geW91IHdhbnQgZnVsbCBzdGFjayB0cmFjZXMgaW4gc2NyaXB0IGV4Y2VwdGlvbnM/CisgICAgcHJpdmF0ZSBib29sZWFuIGRlYnVnID0gZmFsc2U7CisKKyAgICAvLyBDb21waWxlciBjb25maWd1cmF0aW9uLCB1c2VkIHRvIHNldCB0aGUgZW5jb2RpbmdzIG9mIHRoZSBzY3JpcHRzL2NsYXNzZXMKKyAgICBwcml2YXRlIENvbXBpbGVyQ29uZmlndXJhdGlvbiBjb25mID0gbmV3IENvbXBpbGVyQ29uZmlndXJhdGlvbihTeXN0ZW0uZ2V0UHJvcGVydGllcygpKTsKKworICAgIC8qKgorICAgICAqIE1haW4gQ0xJIGludGVyZmFjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcmdzIGFsbCBjb21tYW5kIGxpbmUgYXJncy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB7CisgICAgICAgIHByb2Nlc3NBcmdzKGFyZ3MsIFN5c3RlbS5vdXQpOworICAgIH0KKworICAgIC8vIHBhY2thZ2UtbGV2ZWwgdmlzaWJpbGl0eSBmb3IgdGVzdGluZyBwdXJwb3NlcyAoanVzdCB1c2FnZS9lcnJvcnMgYXQgdGhpcyBzdGFnZSkKKyAgICAvLyBUT0RPOiBzaG91bGQgd2UgaGF2ZSBhbiAnZXJyJyBwcmludHN0cmVhbSB0b28gZm9yIFBhcnNlRXhjZXB0aW9uPworICAgIHN0YXRpYyB2b2lkIHByb2Nlc3NBcmdzKFN0cmluZ1tdIGFyZ3MsIGZpbmFsIFByaW50U3RyZWFtIG91dCkgeworICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBidWlsZE9wdGlvbnMoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ29tbWFuZExpbmUgY21kID0gcGFyc2VDb21tYW5kTGluZShvcHRpb25zLCBhcmdzKTsKKworICAgICAgICAgICAgaWYgKGNtZC5oYXNPcHRpb24oJ2gnKSkgeworICAgICAgICAgICAgICAgIHByaW50SGVscChvdXQsIG9wdGlvbnMpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjbWQuaGFzT3B0aW9uKCd2JykpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdmVyc2lvbiA9IEludm9rZXJIZWxwZXIuZ2V0VmVyc2lvbigpOworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJHcm9vdnkgVmVyc2lvbjogIiArIHZlcnNpb24gKyAiIEpWTTogIiArIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS52bS52ZXJzaW9uIikpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBJZiB3ZSBmYWlsLCB0aGVuIGV4aXQgd2l0aCBhbiBlcnJvciBzbyBzY3JpcHRpbmcgZnJhbWV3b3JrcyBjYW4gY2F0Y2ggaXQKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBwYXNzIHByaW50c3RyZWFtKHMpIGRvd24gdGhyb3VnaCBwcm9jZXNzCisgICAgICAgICAgICAgICAgaWYgKCFwcm9jZXNzKGNtZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBwZSkgeworICAgICAgICAgICAgb3V0LnByaW50bG4oImVycm9yOiAiICsgcGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIHByaW50SGVscChvdXQsIG9wdGlvbnMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludEhlbHAoUHJpbnRTdHJlYW0gb3V0LCBPcHRpb25zIG9wdGlvbnMpIHsKKyAgICAgICAgSGVscEZvcm1hdHRlciBmb3JtYXR0ZXIgPSBuZXcgSGVscEZvcm1hdHRlcigpOworICAgICAgICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihvdXQpOworCisgICAgICAgIGZvcm1hdHRlci5wcmludEhlbHAoCisgICAgICAgICAgICBwdywKKyAgICAgICAgICAgIDgwLAorICAgICAgICAgICAgImdyb292eSBbb3B0aW9uc10gW2FyZ3NdIiwKKyAgICAgICAgICAgICJvcHRpb25zOiIsCisgICAgICAgICAgICBvcHRpb25zLAorICAgICAgICAgICAgMiwKKyAgICAgICAgICAgIDQsCisgICAgICAgICAgICBudWxsLCAvLyBmb290ZXIKKyAgICAgICAgICAgIGZhbHNlKTsKKyAgICAgICAKKyAgICAgICAgcHcuZmx1c2goKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSB0aGUgY29tbWFuZCBsaW5lLgorICAgICAqCisgICAgICogQHBhcmFtIG9wdGlvbnMgdGhlIG9wdGlvbnMgcGFyc2VyLgorICAgICAqIEBwYXJhbSBhcmdzICAgIHRoZSBjb21tYW5kIGxpbmUgYXJncy4KKyAgICAgKiBAcmV0dXJuIHBhcnNlZCBjb21tYW5kIGxpbmUuCisgICAgICogQHRocm93cyBQYXJzZUV4Y2VwdGlvbiBpZiB0aGVyZSB3YXMgYSBwcm9ibGVtLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIENvbW1hbmRMaW5lIHBhcnNlQ29tbWFuZExpbmUoT3B0aW9ucyBvcHRpb25zLCBTdHJpbmdbXSBhcmdzKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICBDb21tYW5kTGluZVBhcnNlciBwYXJzZXIgPSBuZXcgUG9zaXhQYXJzZXIoKTsKKyAgICAgICAgcmV0dXJuIHBhcnNlci5wYXJzZShvcHRpb25zLCBhcmdzLCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCdWlsZCB0aGUgb3B0aW9ucyBwYXJzZXIuICBIYXMgdG8gYmUgc3luY2hyb25pemVkIGJlY2F1c2Ugb2YgdGhlIHdheSBPcHRpb25zIGFyZSBjb25zdHJ1Y3RlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYW4gb3B0aW9ucyBwYXJzZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIE9wdGlvbnMgYnVpbGRPcHRpb25zKCkgeworICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOworCisgICAgICAgIG9wdGlvbnMuYWRkT3B0aW9uKAorICAgICAgICAgICAgT3B0aW9uQnVpbGRlci53aXRoTG9uZ09wdCgiZGVmaW5lIikuCisgICAgICAgICAgICAgICAgd2l0aERlc2NyaXB0aW9uKCJkZWZpbmUgYSBzeXN0ZW0gcHJvcGVydHkiKS4KKyAgICAgICAgICAgICAgICBoYXNBcmcodHJ1ZSkuCisgICAgICAgICAgICAgICAgd2l0aEFyZ05hbWUoIm5hbWU9dmFsdWUiKS4KKyAgICAgICAgICAgICAgICBjcmVhdGUoJ0QnKQorICAgICAgICApOworICAgICAgICBvcHRpb25zLmFkZE9wdGlvbigKKyAgICAgICAgICAgIE9wdGlvbkJ1aWxkZXIuaGFzQXJnKGZhbHNlKQorICAgICAgICAgICAgLndpdGhEZXNjcmlwdGlvbigidXNhZ2UgaW5mb3JtYXRpb24iKQorICAgICAgICAgICAgLndpdGhMb25nT3B0KCJoZWxwIikKKyAgICAgICAgICAgIC5jcmVhdGUoJ2gnKSk7CisgICAgICAgIG9wdGlvbnMuYWRkT3B0aW9uKAorICAgICAgICAgICAgT3B0aW9uQnVpbGRlci5oYXNBcmcoZmFsc2UpCisgICAgICAgICAgICAud2l0aERlc2NyaXB0aW9uKCJkZWJ1ZyBtb2RlIHdpbGwgcHJpbnQgb3V0IGZ1bGwgc3RhY2sgdHJhY2VzIikKKyAgICAgICAgICAgIC53aXRoTG9uZ09wdCgiZGVidWciKQorICAgICAgICAgICAgLmNyZWF0ZSgnZCcpKTsKKyAgICAgICAgb3B0aW9ucy5hZGRPcHRpb24oCisgICAgICAgICAgICBPcHRpb25CdWlsZGVyLmhhc0FyZyhmYWxzZSkKKyAgICAgICAgICAgIC53aXRoRGVzY3JpcHRpb24oImRpc3BsYXkgdGhlIEdyb292eSBhbmQgSlZNIHZlcnNpb25zIikKKyAgICAgICAgICAgIC53aXRoTG9uZ09wdCgidmVyc2lvbiIpCisgICAgICAgICAgICAuY3JlYXRlKCd2JykpOworICAgICAgICBvcHRpb25zLmFkZE9wdGlvbigKKyAgICAgICAgICAgIE9wdGlvbkJ1aWxkZXIud2l0aEFyZ05hbWUoImNoYXJzZXQiKQorICAgICAgICAgICAgLmhhc0FyZygpCisgICAgICAgICAgICAud2l0aERlc2NyaXB0aW9uKCJzcGVjaWZ5IHRoZSBlbmNvZGluZyBvZiB0aGUgZmlsZXMiKQorICAgICAgICAgICAgLndpdGhMb25nT3B0KCJlbmNvZGluZyIpCisgICAgICAgICAgICAuY3JlYXRlKCdjJykpOworICAgICAgICBvcHRpb25zLmFkZE9wdGlvbigKKyAgICAgICAgICAgIE9wdGlvbkJ1aWxkZXIud2l0aEFyZ05hbWUoInNjcmlwdCIpCisgICAgICAgICAgICAuaGFzQXJnKCkKKyAgICAgICAgICAgIC53aXRoRGVzY3JpcHRpb24oInNwZWNpZnkgYSBjb21tYW5kIGxpbmUgc2NyaXB0IikKKyAgICAgICAgICAgIC5jcmVhdGUoJ2UnKSk7CisgICAgICAgIG9wdGlvbnMuYWRkT3B0aW9uKAorICAgICAgICAgICAgT3B0aW9uQnVpbGRlci53aXRoQXJnTmFtZSgiZXh0ZW5zaW9uIikKKyAgICAgICAgICAgIC5oYXNPcHRpb25hbEFyZygpCisgICAgICAgICAgICAud2l0aERlc2NyaXB0aW9uKCJtb2RpZnkgZmlsZXMgaW4gcGxhY2UsIGNyZWF0ZSBiYWNrdXAgaWYgZXh0ZW5zaW9uIGlzIGdpdmVuIChlLmcuIFwnLmJha1wnKSIpCisgICAgICAgICAgICAuY3JlYXRlKCdpJykpOworICAgICAgICBvcHRpb25zLmFkZE9wdGlvbigKKyAgICAgICAgICAgIE9wdGlvbkJ1aWxkZXIuaGFzQXJnKGZhbHNlKQorICAgICAgICAgICAgLndpdGhEZXNjcmlwdGlvbigicHJvY2VzcyBmaWxlcyBsaW5lIGJ5IGxpbmUiKQorICAgICAgICAgICAgLmNyZWF0ZSgnbicpKTsKKyAgICAgICAgb3B0aW9ucy5hZGRPcHRpb24oCisgICAgICAgICAgICBPcHRpb25CdWlsZGVyLmhhc0FyZyhmYWxzZSkKKyAgICAgICAgICAgIC53aXRoRGVzY3JpcHRpb24oInByb2Nlc3MgZmlsZXMgbGluZSBieSBsaW5lIGFuZCBwcmludCByZXN1bHQiKQorICAgICAgICAgICAgLmNyZWF0ZSgncCcpKTsKKyAgICAgICAgb3B0aW9ucy5hZGRPcHRpb24oCisgICAgICAgICAgICBPcHRpb25CdWlsZGVyLndpdGhBcmdOYW1lKCJwb3J0IikKKyAgICAgICAgICAgIC5oYXNPcHRpb25hbEFyZygpCisgICAgICAgICAgICAud2l0aERlc2NyaXB0aW9uKCJsaXN0ZW4gb24gYSBwb3J0IGFuZCBwcm9jZXNzIGluYm91bmQgbGluZXMiKQorICAgICAgICAgICAgLmNyZWF0ZSgnbCcpKTsKKyAgICAgICAgb3B0aW9ucy5hZGRPcHRpb24oCisgICAgICAgICAgICBPcHRpb25CdWlsZGVyLndpdGhBcmdOYW1lKCJzcGxpdFBhdHRlcm4iKQorICAgICAgICAgICAgLmhhc09wdGlvbmFsQXJnKCkKKyAgICAgICAgICAgIC53aXRoRGVzY3JpcHRpb24oImF1dG9tYXRpY2FsbHkgc3BsaXQgY3VycmVudCBsaW5lIChkZWZhdWx0cyB0byAnXFxzJykiKQorICAgICAgICAgICAgLndpdGhMb25nT3B0KCJhdXRvc3BsaXQiKQorICAgICAgICAgICAgLmNyZWF0ZSgnYScpKTsKKworICAgICAgICByZXR1cm4gb3B0aW9uczsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHNldFN5c3RlbVByb3BlcnR5RnJvbShmaW5hbCBTdHJpbmcgbmFtZVZhbHVlKSB7CisgICAgICAgIGlmKG5hbWVWYWx1ZT09bnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYXJndW1lbnQgc2hvdWxkIG5vdCBiZSBudWxsIik7CisKKyAgICAgICAgU3RyaW5nIG5hbWUsIHZhbHVlOworICAgICAgICBpbnQgaSA9IG5hbWVWYWx1ZS5pbmRleE9mKCI9Iik7CisKKyAgICAgICAgaWYgKGkgPT0gLTEpIHsKKyAgICAgICAgICAgIG5hbWUgPSBuYW1lVmFsdWU7CisgICAgICAgICAgICB2YWx1ZSA9IEJvb2xlYW4uVFJVRS50b1N0cmluZygpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbmFtZSA9IG5hbWVWYWx1ZS5zdWJzdHJpbmcoMCwgaSk7CisgICAgICAgICAgICB2YWx1ZSA9IG5hbWVWYWx1ZS5zdWJzdHJpbmcoaSArIDEsIG5hbWVWYWx1ZS5sZW5ndGgoKSk7CisgICAgICAgIH0KKyAgICAgICAgbmFtZSA9IG5hbWUudHJpbSgpOworCisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eShuYW1lLCB2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgdXNlcnMgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaW5lIHRoZSBwYXJzZWQgY29tbWFuZCBsaW5lLgorICAgICAqIEB0aHJvd3MgUGFyc2VFeGNlcHRpb24gaWYgaW52YWxpZCBvcHRpb25zIGFyZSBjaG9zZW4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHByb2Nlc3MoQ29tbWFuZExpbmUgbGluZSkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgR3Jvb3Z5TWFpbiBtYWluID0gbmV3IEdyb292eU1haW4oKTsKKworICAgICAgICBMaXN0IGFyZ3MgPSBsaW5lLmdldEFyZ0xpc3QoKTsKKyAgICAgICAgCisgICAgICAgIGlmIChsaW5lLmhhc09wdGlvbignRCcpKSB7CisgICAgICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBsaW5lLmdldE9wdGlvblZhbHVlcygnRCcpOworCisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8dmFsdWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgc2V0U3lzdGVtUHJvcGVydHlGcm9tKHZhbHVlc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBhZGQgdGhlIGFiaWxpdHkgdG8gcGFyc2Ugc2NyaXB0cyB3aXRoIGEgc3BlY2lmaWVkIGVuY29kaW5nCisgICAgICAgIG1haW4uY29uZi5zZXRTb3VyY2VFbmNvZGluZyhsaW5lLmdldE9wdGlvblZhbHVlKCdjJyxtYWluLmNvbmYuZ2V0U291cmNlRW5jb2RpbmcoKSkpOworCisgICAgICAgIG1haW4uaXNTY3JpcHRGaWxlID0gIWxpbmUuaGFzT3B0aW9uKCdlJyk7CisgICAgICAgIG1haW4uZGVidWcgPSBsaW5lLmhhc09wdGlvbignZCcpOworICAgICAgICBtYWluLmNvbmYuc2V0RGVidWcobWFpbi5kZWJ1Zyk7CisgICAgICAgIG1haW4ucHJvY2Vzc0ZpbGVzID0gbGluZS5oYXNPcHRpb24oJ3AnKSB8fCBsaW5lLmhhc09wdGlvbignbicpOworICAgICAgICBtYWluLmF1dG9PdXRwdXQgPSBsaW5lLmhhc09wdGlvbigncCcpOworICAgICAgICBtYWluLmVkaXRGaWxlcyA9IGxpbmUuaGFzT3B0aW9uKCdpJyk7CisgICAgICAgIGlmIChtYWluLmVkaXRGaWxlcykgeworICAgICAgICAgICAgbWFpbi5iYWNrdXBFeHRlbnNpb24gPSBsaW5lLmdldE9wdGlvblZhbHVlKCdpJyk7CisgICAgICAgIH0KKyAgICAgICAgbWFpbi5hdXRvU3BsaXQgPSBsaW5lLmhhc09wdGlvbignYScpOworICAgICAgICBTdHJpbmcgc3AgPSBsaW5lLmdldE9wdGlvblZhbHVlKCdhJyk7CisgICAgICAgIGlmIChzcCAhPSBudWxsKQorICAgICAgICAgICAgbWFpbi5zcGxpdFBhdHRlcm4gPSBzcDsKKworICAgICAgICBpZiAobWFpbi5pc1NjcmlwdEZpbGUpIHsKKyAgICAgICAgICAgIGlmIChhcmdzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIm5laXRoZXIgLWUgb3IgZmlsZW5hbWUgcHJvdmlkZWQiKTsKKworICAgICAgICAgICAgbWFpbi5zY3JpcHQgPSAoU3RyaW5nKSBhcmdzLnJlbW92ZSgwKTsKKyAgICAgICAgICAgIGlmIChtYWluLnNjcmlwdC5lbmRzV2l0aCgiLmphdmEiKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oImVycm9yOiBjYW5ub3QgY29tcGlsZSBmaWxlIHdpdGggLmphdmEgZXh0ZW5zaW9uOiAiICsgbWFpbi5zY3JpcHQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWFpbi5zY3JpcHQgPSBsaW5lLmdldE9wdGlvblZhbHVlKCdlJyk7CisgICAgICAgIH0KKworICAgICAgICBtYWluLnByb2Nlc3NTb2NrZXRzID0gbGluZS5oYXNPcHRpb24oJ2wnKTsKKyAgICAgICAgaWYgKG1haW4ucHJvY2Vzc1NvY2tldHMpIHsKKyAgICAgICAgICAgIFN0cmluZyBwID0gbGluZS5nZXRPcHRpb25WYWx1ZSgnbCcsICIxOTYwIik7IC8vIGRlZmF1bHQgcG9ydCB0byBsaXN0ZW4gdG8KKyAgICAgICAgICAgIG1haW4ucG9ydCA9IEludGVnZXIucGFyc2VJbnQocCk7CisgICAgICAgIH0KKyAgICAgICAgbWFpbi5hcmdzID0gYXJnczsKKworICAgICAgICByZXR1cm4gbWFpbi5ydW4oKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJ1biB0aGUgc2NyaXB0LgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBydW4oKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAocHJvY2Vzc1NvY2tldHMpIHsKKyAgICAgICAgICAgICAgICBwcm9jZXNzU29ja2V0cygpOworICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9jZXNzRmlsZXMpIHsKKyAgICAgICAgICAgICAgICBwcm9jZXNzRmlsZXMoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJvY2Vzc09uY2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGNhdGNoIChDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oZSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEludm9rZXJJbnZvY2F0aW9uRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgSW52b2tlckludm9jYXRpb25FeGNlcHRpb24gaWllID0gKEludm9rZXJJbnZvY2F0aW9uRXhjZXB0aW9uKSBlOworICAgICAgICAgICAgICAgIGUgPSBpaWUuZ2V0Q2F1c2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQ2F1Z2h0OiAiICsgZSk7CisgICAgICAgICAgICBpZiAoZGVidWcpIHsKKyAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTdGFja1RyYWNlRWxlbWVudFtdIHN0YWNrVHJhY2UgPSBlLmdldFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0YWNrVHJhY2UubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgU3RhY2tUcmFjZUVsZW1lbnQgZWxlbWVudCA9IHN0YWNrVHJhY2VbaV07CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IGVsZW1lbnQuZ2V0RmlsZU5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVOYW1lIT1udWxsICYmICFmaWxlTmFtZS5lbmRzV2l0aCgiLmphdmEiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJcdGF0ICIgKyBlbGVtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgU29ja2V0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1NvY2tldHMoKSB0aHJvd3MgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgR3Jvb3Z5U2hlbGwgZ3Jvb3Z5ID0gbmV3IEdyb292eVNoZWxsKGNvbmYpOworICAgICAgICAvL2NoZWNrIHRoZSBzY3JpcHQgaXMgY3VycmVudGx5IHZhbGlkIGJlZm9yZSBzdGFydGluZyBhIHNlcnZlciBhZ2FpbnN0IHRoZSBzY3JpcHQKKyAgICAgICAgaWYgKGlzU2NyaXB0RmlsZSkgeworICAgICAgICAgICAgZ3Jvb3Z5LnBhcnNlKG5ldyBGaWxlSW5wdXRTdHJlYW0oaHVudEZvclRoZVNjcmlwdEZpbGUoc2NyaXB0KSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ3Jvb3Z5LnBhcnNlKHNjcmlwdCk7CisgICAgICAgIH0KKyAgICAgICAgbmV3IEdyb292eVNvY2tldFNlcnZlcihncm9vdnksIGlzU2NyaXB0RmlsZSwgc2NyaXB0LCBhdXRvT3V0cHV0LCBwb3J0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIdW50IGZvciB0aGUgc2NyaXB0IGZpbGUsIGRvZXNuJ3QgYm90aGVyIGlmIGl0IGlzIG5hbWVkIHByZWNpc2VseS4KKyAgICAgKgorICAgICAqIFRyaWVzIGluIHRoaXMgb3JkZXI6CisgICAgICogLSBhY3R1YWwgc3VwcGxpZWQgbmFtZQorICAgICAqIC0gbmFtZS5ncm9vdnkKKyAgICAgKiAtIG5hbWUuZ3Z5CisgICAgICogLSBuYW1lLmd5CisgICAgICogLSBuYW1lLmdzaAorICAgICAqLworICAgIHB1YmxpYyBGaWxlIGh1bnRGb3JUaGVTY3JpcHRGaWxlKFN0cmluZyBzY3JpcHRGaWxlTmFtZSkgeworICAgICAgICBGaWxlIHNjcmlwdEZpbGUgPSBuZXcgRmlsZShzY3JpcHRGaWxlTmFtZSk7CisgICAgICAgIFN0cmluZ1tdIHN0YW5kYXJkRXh0ZW5zaW9ucyA9IHsiLmdyb292eSIsIi5ndnkiLCIuZ3kiLCIuZ3NoIn07CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgd2hpbGUgKGkgPCBzdGFuZGFyZEV4dGVuc2lvbnMubGVuZ3RoICYmICFzY3JpcHRGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICBzY3JpcHRGaWxlID0gbmV3IEZpbGUoc2NyaXB0RmlsZU5hbWUgKyBzdGFuZGFyZEV4dGVuc2lvbnNbaV0pOworICAgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgICAgIC8vIGlmIHdlIHN0aWxsIGhhdmVuJ3QgZm91bmQgdGhlIGZpbGUsIHBvaW50IGJhY2sgdG8gdGhlIG9yaWdpbmFsbHkgc3BlY2lmaWVkIGZpbGVuYW1lCisgICAgICAgIGlmICghc2NyaXB0RmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgc2NyaXB0RmlsZSA9IG5ldyBGaWxlKHNjcmlwdEZpbGVOYW1lKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2NyaXB0RmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBpbnB1dCBmaWxlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0ZpbGVzKCkgdGhyb3dzIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEdyb292eVNoZWxsIGdyb292eSA9IG5ldyBHcm9vdnlTaGVsbChjb25mKTsKKworICAgICAgICBTY3JpcHQgczsKKworICAgICAgICBpZiAoaXNTY3JpcHRGaWxlKSB7CisgICAgICAgICAgICBzID0gZ3Jvb3Z5LnBhcnNlKGh1bnRGb3JUaGVTY3JpcHRGaWxlKHNjcmlwdCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcyA9IGdyb292eS5wYXJzZShzY3JpcHQsICJtYWluIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYXJncy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoU3lzdGVtLmluKSk7CisgICAgICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoU3lzdGVtLm91dCk7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcHJvY2Vzc1JlYWRlcihzLCByZWFkZXIsIHdyaXRlcik7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHJlYWRlci5jbG9zZSgpOworICAgICAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBJdGVyYXRvciBpID0gYXJncy5pdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gKFN0cmluZykgaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gaHVudEZvclRoZVNjcmlwdEZpbGUoZmlsZW5hbWUpOworICAgICAgICAgICAgICAgIHByb2Nlc3NGaWxlKHMsIGZpbGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvY2VzcyBhIHNpbmdsZSBpbnB1dCBmaWxlLgorICAgICAqCisgICAgICogQHBhcmFtIHMgICAgdGhlIHNjcmlwdCB0byBleGVjdXRlLgorICAgICAqIEBwYXJhbSBmaWxlIHRoZSBpbnB1dCBmaWxlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzRmlsZShTY3JpcHQgcywgRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoIWZpbGUuZXhpc3RzKCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKGZpbGUuZ2V0TmFtZSgpKTsKKworICAgICAgICBpZiAoIWVkaXRGaWxlcykgeworICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGZpbGUpKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKFN5c3RlbS5vdXQpOworICAgICAgICAgICAgICAgIHByb2Nlc3NSZWFkZXIocywgcmVhZGVyLCB3cml0ZXIpOworICAgICAgICAgICAgICAgIHdyaXRlci5mbHVzaCgpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEZpbGUgYmFja3VwOworICAgICAgICAgICAgaWYgKGJhY2t1cEV4dGVuc2lvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgYmFja3VwID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiZ3Jvb3Z5XyIsICIudG1wIik7CisgICAgICAgICAgICAgICAgYmFja3VwLmRlbGV0ZU9uRXhpdCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBiYWNrdXAgPSBuZXcgRmlsZShmaWxlLmdldFBhdGgoKSArIGJhY2t1cEV4dGVuc2lvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBiYWNrdXAuZGVsZXRlKCk7CisgICAgICAgICAgICBpZiAoIWZpbGUucmVuYW1lVG8oYmFja3VwKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oInVuYWJsZSB0byByZW5hbWUgIiArIGZpbGUgKyAiIHRvICIgKyBiYWNrdXApOworCisgICAgICAgICAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoYmFja3VwKSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IG5ldyBQcmludFdyaXRlcihuZXcgRmlsZVdyaXRlcihmaWxlKSk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1JlYWRlcihzLCByZWFkZXIsIHdyaXRlcik7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgYSBzY3JpcHQgYWdhaW5zdCBhIHNpbmdsZSBpbnB1dCBmaWxlLgorICAgICAqCisgICAgICogQHBhcmFtIHMgICAgICBzY3JpcHQgdG8gZXhlY3V0ZS4KKyAgICAgKiBAcGFyYW0gcmVhZGVyIGlucHV0IGZpbGUuCisgICAgICogQHBhcmFtIHB3ICAgICBvdXRwdXQgc2luay4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1JlYWRlcihTY3JpcHQgcywgQnVmZmVyZWRSZWFkZXIgcmVhZGVyLCBQcmludFdyaXRlciBwdykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGxpbmU7CisgICAgICAgIFN0cmluZyBsaW5lQ291bnROYW1lID0gImNvdW50IjsKKyAgICAgICAgcy5zZXRQcm9wZXJ0eShsaW5lQ291bnROYW1lLCBCaWdJbnRlZ2VyLlpFUk8pOworICAgICAgICBTdHJpbmcgYXV0b1NwbGl0TmFtZSA9ICJzcGxpdCI7CisgICAgICAgIHMuc2V0UHJvcGVydHkoIm91dCIsIHB3KTsKKworICAgICAgICB3aGlsZSAoKGxpbmUgPSByZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgcy5zZXRQcm9wZXJ0eSgibGluZSIsIGxpbmUpOworICAgICAgICAgICAgcy5zZXRQcm9wZXJ0eShsaW5lQ291bnROYW1lLCAoKEJpZ0ludGVnZXIpcy5nZXRQcm9wZXJ0eShsaW5lQ291bnROYW1lKSkuYWRkKEJpZ0ludGVnZXIuT05FKSk7CisKKyAgICAgICAgICAgIGlmKGF1dG9TcGxpdCkgeworICAgICAgICAgICAgICAgIHMuc2V0UHJvcGVydHkoYXV0b1NwbGl0TmFtZSwgbGluZS5zcGxpdChzcGxpdFBhdHRlcm4pKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgT2JqZWN0IG8gPSBzLnJ1bigpOworCisgICAgICAgICAgICBpZiAoYXV0b091dHB1dCAmJiBvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBwdy5wcmludGxuKG8pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHN0YW5kYXJkLCBzaW5nbGUgc2NyaXB0IHdpdGggYXJncy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc09uY2UoKSB0aHJvd3MgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgR3Jvb3Z5U2hlbGwgZ3Jvb3Z5ID0gbmV3IEdyb292eVNoZWxsKGNvbmYpOworCisgICAgICAgIGlmIChpc1NjcmlwdEZpbGUpIHsKKyAgICAgICAgICAgIGdyb292eS5ydW4oaHVudEZvclRoZVNjcmlwdEZpbGUoc2NyaXB0KSwgYXJncyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBncm9vdnkucnVuKHNjcmlwdCwgInNjcmlwdF9mcm9tX2NvbW1hbmRfbGluZSIsIGFyZ3MpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS9Hcm9vdnlTb2NrZXRTZXJ2ZXIuamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdWkvR3Jvb3Z5U29ja2V0U2VydmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJmZWI5YgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdWkvR3Jvb3Z5U29ja2V0U2VydmVyLmphdmEKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBncm9vdnkudWk7CisKK2ltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlTaGVsbDsKK2ltcG9ydCBncm9vdnkubGFuZy5TY3JpcHQ7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlNlcnZlclNvY2tldDsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7CitpbXBvcnQgamF2YS5uZXQuVVJMOworCisvKioKKyAqIFNpbXBsZSBzZXJ2ZXIgdGhhdCBleGVjdXRlcyBzdXBwbGllZCBzY3JpcHQgYWdhaW5zdCBhIHNvY2tldAorICoKKyAqIEB2ZXJzaW9uICRJZCQKKyAqIEBhdXRob3IgSmVyZW15IFJheW5lcgorICovCitwdWJsaWMgY2xhc3MgR3Jvb3Z5U29ja2V0U2VydmVyIGltcGxlbWVudHMgUnVubmFibGUgeworICAgIHByaXZhdGUgVVJMIHVybDsKKyAgICBwcml2YXRlIEdyb292eVNoZWxsIGdyb292eTsKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNTY3JpcHRGaWxlOworICAgIHByaXZhdGUgU3RyaW5nIHNjcmlwdEZpbGVuYW1lT3JUZXh0OworICAgIHByaXZhdGUgYm9vbGVhbiBhdXRvT3V0cHV0OworICAgIAorICAgIHB1YmxpYyBHcm9vdnlTb2NrZXRTZXJ2ZXIoR3Jvb3Z5U2hlbGwgZ3Jvb3Z5LCBib29sZWFuIGlzU2NyaXB0RmlsZSwgU3RyaW5nIHNjcmlwdEZpbGVuYW1lT3JUZXh0LCBib29sZWFuIGF1dG9PdXRwdXQsIGludCBwb3J0KSB7CisgICAgICAgIHRoaXMuZ3Jvb3Z5ID0gZ3Jvb3Z5OworICAgICAgICB0aGlzLmlzU2NyaXB0RmlsZSA9IGlzU2NyaXB0RmlsZTsKKyAgICAgICAgdGhpcy5zY3JpcHRGaWxlbmFtZU9yVGV4dCA9IHNjcmlwdEZpbGVuYW1lT3JUZXh0OworICAgICAgICB0aGlzLmF1dG9PdXRwdXQgPSBhdXRvT3V0cHV0OworICAgICAgICB0cnkgeworICAgICAgICAgICAgdXJsID0gbmV3IFVSTCgiaHR0cCIsIEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLmdldEhvc3RBZGRyZXNzKCksIHBvcnQsICIvIik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImdyb292eSBpcyBsaXN0ZW5pbmcgb24gcG9ydCAiICsgcG9ydCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsgCisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgICAgIG5ldyBUaHJlYWQodGhpcykuc3RhcnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTZXJ2ZXJTb2NrZXQgc2VydmVyU29ja2V0ID0gbmV3IFNlcnZlclNvY2tldCh1cmwuZ2V0UG9ydCgpKTsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIG9uZSBzY3JpcHQgcGVyIHNvY2tldCBjb25uZWN0aW9uLgorICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgcHVycG9zZWZ1bGx5IG5vdCBjYWNoaW5nIHRoZSBTY3JpcHQKKyAgICAgICAgICAgICAgICAvLyBzbyB0aGF0IHRoZSBzY3JpcHQgc291cmNlIGZpbGUgY2FuIGJlIGNoYW5nZWQgb24gdGhlIGZseSwKKyAgICAgICAgICAgICAgICAvLyBhcyBlYWNoIGNvbm5lY3Rpb24gaXMgbWFkZSB0byB0aGUgc2VydmVyLgorICAgICAgICAgICAgICAgIFNjcmlwdCBzY3JpcHQ7CisgICAgICAgICAgICAgICAgaWYgKGlzU2NyaXB0RmlsZSkgeworICAgICAgICAgICAgICAgICAgICBHcm9vdnlNYWluIGdtID0gbmV3IEdyb292eU1haW4oKTsKKyAgICAgICAgICAgICAgICAgICAgc2NyaXB0ID0gZ3Jvb3Z5LnBhcnNlKG5ldyBGaWxlSW5wdXRTdHJlYW0oZ20uaHVudEZvclRoZVNjcmlwdEZpbGUoc2NyaXB0RmlsZW5hbWVPclRleHQpKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2NyaXB0ID0gZ3Jvb3Z5LnBhcnNlKHNjcmlwdEZpbGVuYW1lT3JUZXh0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbmV3IEdyb292eUNsaWVudENvbm5lY3Rpb24oc2NyaXB0LCBhdXRvT3V0cHV0LCBzZXJ2ZXJTb2NrZXQuYWNjZXB0KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBjbGFzcyBHcm9vdnlDbGllbnRDb25uZWN0aW9uIGltcGxlbWVudHMgUnVubmFibGUgeworICAgICAgICBwcml2YXRlIFNjcmlwdCBzY3JpcHQ7CisgICAgICAgIHByaXZhdGUgU29ja2V0IHNvY2tldDsKKyAgICAgICAgcHJpdmF0ZSBCdWZmZXJlZFJlYWRlciByZWFkZXI7CisgICAgICAgIHByaXZhdGUgUHJpbnRXcml0ZXIgd3JpdGVyOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gYXV0b091dHB1dEZsYWc7CisgICAgCisgICAgICAgIEdyb292eUNsaWVudENvbm5lY3Rpb24oU2NyaXB0IHNjcmlwdCwgYm9vbGVhbiBhdXRvT3V0cHV0LFNvY2tldCBzb2NrZXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aGlzLnNjcmlwdCA9IHNjcmlwdDsKKyAgICAgICAgICAgIHRoaXMuYXV0b091dHB1dEZsYWcgPSBhdXRvT3V0cHV0OworICAgICAgICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7CisgICAgICAgICAgICByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKHNvY2tldC5nZXRJbnB1dFN0cmVhbSgpKSk7CisgICAgICAgICAgICB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoc29ja2V0LmdldE91dHB1dFN0cmVhbSgpKTsKKyAgICAgICAgICAgIG5ldyBUaHJlYWQodGhpcywgIkdyb292eSBjbGllbnQgY29ubmVjdGlvbiAtICIgKyBzb2NrZXQuZ2V0SW5ldEFkZHJlc3MoKS5nZXRIb3N0QWRkcmVzcygpKS5zdGFydCgpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBudWxsOworICAgICAgICAgICAgICAgIHNjcmlwdC5zZXRQcm9wZXJ0eSgib3V0Iiwgd3JpdGVyKTsKKyAgICAgICAgICAgICAgICBzY3JpcHQuc2V0UHJvcGVydHkoInNvY2tldCIsIHNvY2tldCk7CisgICAgICAgICAgICAgICAgc2NyaXB0LnNldFByb3BlcnR5KCJpbml0IiwgQm9vbGVhbi5UUlVFKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKGxpbmUgPSByZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4obGluZSk7CisgICAgICAgICAgICAgICAgICAgIHNjcmlwdC5zZXRQcm9wZXJ0eSgibGluZSIsIGxpbmUpOworICAgICAgICAgICAgICAgICAgICBPYmplY3QgbyA9IHNjcmlwdC5ydW4oKTsKKyAgICAgICAgICAgICAgICAgICAgc2NyaXB0LnNldFByb3BlcnR5KCJpbml0IiwgQm9vbGVhbi5GQUxTRSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgic3VjY2VzcyIuZXF1YWxzKG8pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8vIHRvIGNsb3NlIHNvY2tldHMgZ3JhY2VmdWxseSBldGMuLi4KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF1dG9PdXRwdXRGbGFnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG8pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIuZmx1c2goKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLmZsdXNoKCk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZTMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGUzLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS9IaXN0b3J5UmVjb3JkLmdyb292eSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdWkvSGlzdG9yeVJlY29yZC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM2MGVkNQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdWkvSGlzdG9yeVJlY29yZC5ncm9vdnkKQEAgLTAsMCArMSwzNyBAQAorLyoNCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4NCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCitwYWNrYWdlIGdyb292eS51aQ0KKw0KKw0KK2NsYXNzIEhpc3RvcnlSZWNvcmQgew0KKyAgICBTdHJpbmcgYWxsVGV4dA0KKyAgICBpbnQgc2VsZWN0aW9uU3RhcnQNCisgICAgaW50IHNlbGVjdGlvbkVuZA0KKyAgICBTdHJpbmcgc2NyaXB0TmFtZQ0KKyAgICBPYmplY3QgcmVzdWx0DQorICAgIFRocm93YWJsZSBleGNlcHRpb24NCisNCisgICAgcHVibGljIFN0cmluZyBnZXRUZXh0VG9SdW4oYm9vbGVhbiB1c2VTZWxlY3Rpb24pIHsNCisgICAgICAgIGlmICh1c2VTZWxlY3Rpb24gJiYgc2VsZWN0aW9uU3RhcnQgIT0gc2VsZWN0aW9uRW5kKSB7DQorICAgICAgICAgICAgcmV0dXJuIGFsbFRleHRbc2VsZWN0aW9uU3RhcnQgLi48IHNlbGVjdGlvbkVuZF0NCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBhbGxUZXh0DQorICAgIH0NCisNCisgICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsNCisgICAgICAgIHJldHVybiBleGNlcHRpb24gPyBleGNlcHRpb24gOiByZXN1bHQNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3VpL0ludGVyYWN0aXZlU2hlbGwuamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdWkvSW50ZXJhY3RpdmVTaGVsbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZTJkZjQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3VpL0ludGVyYWN0aXZlU2hlbGwuamF2YQpAQCAtMCwwICsxLDg0NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgZ3Jvb3Z5LnVpOworCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuQmluZGluZzsKK2ltcG9ydCBncm9vdnkubGFuZy5DbG9zdXJlOworaW1wb3J0IGdyb292eS5sYW5nLkdyb292eVNoZWxsOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwudXRpbC5NZXNzYWdlU291cmNlOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLkNvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5Tb3VyY2VVbml0OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5JbnZva2VySGVscGVyOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5JbnZva2VySW52b2NhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuRGVmYXVsdEdyb292eU1ldGhvZHM7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5FcnJvclJlcG9ydGVyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jbGkuQ29tbWFuZExpbmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNsaS5Db21tYW5kTGluZVBhcnNlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY2xpLk9wdGlvbkJ1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNsaS5Qb3NpeFBhcnNlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY2xpLk9wdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNsaS5IZWxwRm9ybWF0dGVyOworCitpbXBvcnQgamxpbmUuQ29uc29sZVJlYWRlcjsKK2ltcG9ydCBqbGluZS5TaW1wbGVDb21wbGV0b3I7CisKKy8vCisvLyBUT0RPOiBTZWUgaWYgdGhlcmUgaXMgYW55IHJlYXNvbiB3aHkgdGhpcyBjbGFzcyBpcyBpbXBsZW1lbnRlZCBpbiBKYXZhIGluc3RlYWQgb2YgR3Jvb3Z5LCBhbmQgaWYgdGhlcmUKKy8vICAgICAgIGlzIG5vbmUsIHRoZW4gcG9ydCBpdCBvdmVyIDstKQorLy8KKworLy8KKy8vIE5PVEU6IEFmdGVyIEdTaGVsbCBiZWNvbWVzIGEgbGl0dGxlIG1vcmUgbWF0dXJlLCB0aGlzIHNoZWxsIGNvdWxkIGJlIGVhc2lseSBpbXBsZW1lbnRlZCBhcyBhIHNldCBvZiBHU2hlbGwKKy8vICAgICAgIGNvbW1hbmRzLCBhbmQgd291bGQgaW5oZXJpdCBhIGxvdCBvZiBmdW5jdGlvbmFsaXR5IGFuZCBjb3VsZCBiZSBleHRlbmRlZCBlYXNpbHkgdG8gYWxsb3cgZ3Jvb3Z5c2gKKy8vICAgICAgIHRvIGJlY29tZSB2ZXJ5LCB2ZXJ5IHBvd2VyZnVsCisvLworCisvKioKKyAqIEEgc2ltcGxlIGludGVyYWN0aXZlIHNoZWxsIGZvciBldmFsdWF0aW5nIGdyb292eSBleHByZXNzaW9ucyBvbiB0aGUgY29tbWFuZCBsaW5lIChha2EuIGdyb292eXNoKS4KKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y3BvaXJpZXJAZHJlYW1pbmcub3JnIiAgID5DaHJpcyBQb2lyaWVyPC9hPgorICogQGF1dGhvciBZdXJpIFNjaGlta2UKKyAqIEBhdXRob3IgQnJpYW4gTWNDYWxsaXN0YWlyCisgKiBAYXV0aG9yIEd1aWxsYXVtZSBMYWZvcmdlCisgKiBAYXV0aG9yIERpZXJrIEtvZW5pZywgaW5jbHVkZSB0aGUgaW5zcGVjdCBjb21tYW5kLCBKdW5lIDIwMDUKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphc29uQHBsYW5ldDU3LmNvbSI+SmFzb24gRGlsbG9uPC9hPgorICoKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIEludGVyYWN0aXZlU2hlbGwKKyAgICBpbXBsZW1lbnRzIFJ1bm5hYmxlCit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19MSU5FID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1lc3NhZ2VTb3VyY2UgTUVTU0FHRVMgPSBuZXcgTWVzc2FnZVNvdXJjZShJbnRlcmFjdGl2ZVNoZWxsLmNsYXNzKTsKKworICAgIHByaXZhdGUgZmluYWwgR3Jvb3Z5U2hlbGwgc2hlbGw7CisgICAgcHJpdmF0ZSBmaW5hbCBJbnB1dFN0cmVhbSBpbjsgLy8gRklYTUU6IFRoaXMgZG9lc24ndCByZWFsbHkgbmVlZCB0byBiZSBhIGZpZWxkLCBidXQgaG9sZCBvbiB0byBpdCBmb3Igbm93CisgICAgcHJpdmF0ZSBmaW5hbCBQcmludFN0cmVhbSBvdXQ7CisgICAgcHJpdmF0ZSBmaW5hbCBQcmludFN0cmVhbSBlcnI7CisgICAgcHJpdmF0ZSBmaW5hbCBDb25zb2xlUmVhZGVyIHJlYWRlcjsKKworICAgIHByaXZhdGUgT2JqZWN0IGxhc3RSZXN1bHQ7CisgICAgcHJpdmF0ZSBDbG9zdXJlIGJlZm9yZUV4ZWN1dGlvbjsKKyAgICBwcml2YXRlIENsb3N1cmUgYWZ0ZXJFeGVjdXRpb247CisKKyAgICAvKioKKyAgICAgKiBFbnRyeSBwb2ludCB3aGVuIGNhbGxlZCBkaXJlY3RseS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihmaW5hbCBTdHJpbmcgYXJnc1tdKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcm9jZXNzQ29tbWFuZExpbmVBcmd1bWVudHMoYXJncyk7CisKKyAgICAgICAgICAgIGZpbmFsIEludGVyYWN0aXZlU2hlbGwgZ3Jvb3Z5ID0gbmV3IEludGVyYWN0aXZlU2hlbGwoKTsKKyAgICAgICAgICAgIGdyb292eS5ydW4oKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRkFUQUw6ICIgKyBlKTsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICAgICAgfQorCisgICAgICAgIFN5c3RlbS5leGl0KDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgY2xpIGFyZ3Mgd2hlbiB0aGUgc2hlbGwgaXMgaW52b2tlZCB2aWEgbWFpbigpLgorICAgICAqCisgICAgICogQG5vaW5zcGVjdGlvbiBBY2Nlc3NTdGF0aWNWaWFJbnN0YW5jZQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJvY2Vzc0NvbW1hbmRMaW5lQXJndW1lbnRzKGZpbmFsIFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnQgYXJncyAhPSBudWxsOworCisgICAgICAgIC8vCisgICAgICAgIC8vIFRPRE86IExldCB0aGlzIHRha2UgYSBzaW5nbGUsIG9wdGlvbmFsIGFyZ3VtZW50IHdoaWNoIGlzIGEgZmlsZSBvciBVUkwgdG8gcnVuPworICAgICAgICAvLworICAgICAgICAKKyAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKKworICAgICAgICBvcHRpb25zLmFkZE9wdGlvbihPcHRpb25CdWlsZGVyLndpdGhMb25nT3B0KCJoZWxwIikKKyAgICAgICAgICAgIC53aXRoRGVzY3JpcHRpb24oTUVTU0FHRVMuZ2V0TWVzc2FnZSgiY2xpLm9wdGlvbi5oZWxwLmRlc2NyaXB0aW9uIikpCisgICAgICAgICAgICAuY3JlYXRlKCdoJykpOworCisgICAgICAgIG9wdGlvbnMuYWRkT3B0aW9uKE9wdGlvbkJ1aWxkZXIud2l0aExvbmdPcHQoInZlcnNpb24iKQorICAgICAgICAgICAgLndpdGhEZXNjcmlwdGlvbihNRVNTQUdFUy5nZXRNZXNzYWdlKCJjbGkub3B0aW9uLnZlcnNpb24uZGVzY3JpcHRpb24iKSkKKyAgICAgICAgICAgIC5jcmVhdGUoJ1YnKSk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVE9ETzogQWRkIG1vcmUgb3B0aW9ucywgbWF5YmUgZXZlbiBhZGQgYW4gb3B0aW9uIHRvIHByaW1lIHRoZSBidWZmZXIgZnJvbSBhIFVSTCBvciBGaWxlPworICAgICAgICAvLworICAgICAgICAKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRklYTUU6IFRoaXMgZG9lcyBub3QgY3VycmVudGx5IGJhcmYgb24gdW5zdXBwb3J0ZWQgb3B0aW9ucyBzaG9ydCBvcHRpb25zLCB0aG91Z2ggaXQgZG9lcyBmb3IgbG9uZyBvbmVzLgorICAgICAgICAvLyAgICAgICAgU2FtZSBwcm9ibGVtIHdpdGggY29tbW9ucy1jbGkgMS4wIGFuZCAxLjEKKyAgICAgICAgLy8KKyAgICAgICAgCisgICAgICAgIENvbW1hbmRMaW5lUGFyc2VyIHBhcnNlciA9IG5ldyBQb3NpeFBhcnNlcigpOworICAgICAgICBDb21tYW5kTGluZSBsaW5lID0gcGFyc2VyLnBhcnNlKG9wdGlvbnMsIGFyZ3MsIHRydWUpOworICAgICAgICBTdHJpbmdbXSBsaW5lYXJncyA9IGxpbmUuZ2V0QXJncygpOworCisgICAgICAgIC8vIFB1a2UgaWYgdGhlcmUgd2VyZSBhcmd1bWVudHMsIHdlIGRvbid0IHN1cHBvcnQgYW55IHJpZ2h0IG5vdworICAgICAgICBpZiAobGluZWFyZ3MubGVuZ3RoICE9IDApIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihNRVNTQUdFUy5mb3JtYXQoImNsaS5pbmZvLnVuZXhwZWN0ZWRfYXJncyIsIG5ldyBPYmplY3RbXSB7IERlZmF1bHRHcm9vdnlNZXRob2RzLmpvaW4obGluZWFyZ3MsICIgIikgfSkpOworICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgIH0KKworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoU3lzdGVtLm91dCk7CisKKyAgICAgICAgaWYgKGxpbmUuaGFzT3B0aW9uKCdoJykpIHsKKyAgICAgICAgICAgIEhlbHBGb3JtYXR0ZXIgZm9ybWF0dGVyID0gbmV3IEhlbHBGb3JtYXR0ZXIoKTsKKyAgICAgICAgICAgIGZvcm1hdHRlci5wcmludEhlbHAoCisgICAgICAgICAgICAgICAgd3JpdGVyLAorICAgICAgICAgICAgICAgIDgwLCAvLyB3aWR0aAorICAgICAgICAgICAgICAgICJncm9vdnlzaCBbb3B0aW9uc10iLAorICAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgNCwgLy8gbGVmdCBwYWQKKyAgICAgICAgICAgICAgICA0LCAvLyBkZXNjIHBhZAorICAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgIGZhbHNlKTsgLy8gYXV0byB1c2FnZQorCisgICAgICAgICAgICB3cml0ZXIuZmx1c2goKTsKKyAgICAgICAgICAgIFN5c3RlbS5leGl0KDApOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxpbmUuaGFzT3B0aW9uKCdWJykpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKE1FU1NBR0VTLmZvcm1hdCgiY2xpLmluZm8udmVyc2lvbiIsIG5ldyBPYmplY3RbXSB7IEludm9rZXJIZWxwZXIuZ2V0VmVyc2lvbigpIH0pKTsKKyAgICAgICAgICAgIHdyaXRlci5mbHVzaCgpOworICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLCBpbml0aWFsaXplcyB1c2VzIG5ldyBiaW5kaW5nIGFuZCBzeXN0ZW0gc3RyZWFtcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgSW50ZXJhY3RpdmVTaGVsbCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMoU3lzdGVtLmluLCBTeXN0ZW0ub3V0LCBTeXN0ZW0uZXJyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IEludGVyYWN0aXZlU2hlbGwgaW5zdGFuY2UKKyAgICAgKgorICAgICAqIEBwYXJhbSBpbiBUaGUgaW5wdXQgc3RyZWFtIHRvIHVzZQorICAgICAqIEBwYXJhbSBvdXQgVGhlIG91dHB1dCBzdHJlYW0gdG8gdXNlCisgICAgICogQHBhcmFtIGVyciBUaGUgZXJyb3Igc3RyZWFtIHRvIHVzZQorICAgICAqLworICAgIHB1YmxpYyBJbnRlcmFjdGl2ZVNoZWxsKGZpbmFsIElucHV0U3RyZWFtIGluLCBmaW5hbCBQcmludFN0cmVhbSBvdXQsIGZpbmFsIFByaW50U3RyZWFtIGVycikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcyhudWxsLCBuZXcgQmluZGluZygpLCBpbiwgb3V0LCBlcnIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgSW50ZXJhY3RpdmVTaGVsbCBpbnN0YW5jZQorICAgICAqIAorICAgICAqIEBwYXJhbSBiaW5kaW5nIFRoZSBiaW5kaW5nIGluc3RhbmNlCisgICAgICogQHBhcmFtIGluIFRoZSBpbnB1dCBzdHJlYW0gdG8gdXNlCisgICAgICogQHBhcmFtIG91dCBUaGUgb3V0cHV0IHN0cmVhbSB0byB1c2UKKyAgICAgKiBAcGFyYW0gZXJyIFRoZSBlcnJvciBzdHJlYW0gdG8gdXNlCisgICAgICovICAgIAorICAgIHB1YmxpYyBJbnRlcmFjdGl2ZVNoZWxsKGZpbmFsIEJpbmRpbmcgYmluZGluZywgZmluYWwgSW5wdXRTdHJlYW0gaW4sIGZpbmFsIFByaW50U3RyZWFtIG91dCwgZmluYWwgUHJpbnRTdHJlYW0gZXJyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIAl0aGlzKG51bGwsIGJpbmRpbmcsIGluLCBvdXQsIGVycik7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgSW50ZXJhY3RpdmVTaGVsbCBpbnN0YW5jZQorICAgICAqIAorICAgICAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBDbGFzc0xvYWRlcgorICAgICAqIEBwYXJhbSBiaW5kaW5nIFRoZSBiaW5kaW5nIGluc3RhbmNlCisgICAgICogQHBhcmFtIGluIFRoZSBpbnB1dCBzdHJlYW0gdG8gdXNlCisgICAgICogQHBhcmFtIG91dCBUaGUgb3V0cHV0IHN0cmVhbSB0byB1c2UKKyAgICAgKiBAcGFyYW0gZXJyIFRoZSBlcnJvciBzdHJlYW0gdG8gdXNlCisgICAgICovCisgICAgcHVibGljIEludGVyYWN0aXZlU2hlbGwoZmluYWwgQ2xhc3NMb2FkZXIgcGFyZW50LCBmaW5hbCBCaW5kaW5nIGJpbmRpbmcsIGZpbmFsIElucHV0U3RyZWFtIGluLCBmaW5hbCBQcmludFN0cmVhbSBvdXQsIGZpbmFsIFByaW50U3RyZWFtIGVycikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0IGJpbmRpbmcgIT0gbnVsbDsKKyAgICAgICAgYXNzZXJ0IGluICE9IG51bGw7CisgICAgICAgIGFzc2VydCBvdXQgIT0gbnVsbDsKKyAgICAgICAgYXNzZXJ0IGVyciAhPSBudWxsOworCisgICAgICAgIHRoaXMuaW4gPSBpbjsKKyAgICAgICAgdGhpcy5vdXQgPSBvdXQ7CisgICAgICAgIHRoaXMuZXJyID0gZXJyOworCisgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIEpMaW5lIGNvbnNvbGUgaW5wdXQgcmVhZGVyCisgICAgICAgIFdyaXRlciB3cml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dCk7CisgICAgICAgIHJlYWRlciA9IG5ldyBDb25zb2xlUmVhZGVyKGluLCB3cml0ZXIpOworICAgICAgICByZWFkZXIuc2V0RGVmYXVsdFByb21wdCgiZ3Jvb3Z5PiAiKTsKKworICAgICAgICAvLyBBZGQgc29tZSBjb21wbGV0b3JzIHRvIGZhbmN5IHRoaW5ncyB1cAorICAgICAgICByZWFkZXIuYWRkQ29tcGxldG9yKG5ldyBDb21tYW5kTmFtZUNvbXBsZXRvcigpKTsKKworICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNoZWxsID0gbmV3IEdyb292eVNoZWxsKHBhcmVudCwgYmluZGluZyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzaGVsbCA9IG5ldyBHcm9vdnlTaGVsbChiaW5kaW5nKTsKKyAgICAgICAgfSAgICAgICAgCisKKyAgICAgICAgLy8gQWRkIHNvbWUgZGVmYXVsdCB2YXJpYWJsZXMgdG8gdGhlIHNoZWxsCisgICAgICAgIE1hcCBtYXAgPSBzaGVsbC5nZXRDb250ZXh0KCkuZ2V0VmFyaWFibGVzKCk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRklYTUU6IFVtLCBpcyB0aGlzIHJpZ2h0PyAgT25seSBzZXQgdGhlICJzaGVsbCIgdmFyIGluIHRoZSBjb250ZXh0IGlmIGl0cyBzZXQgYWxyZWFkeT8KKyAgICAgICAgLy8KKyAgICAgICAgCisgICAgICAgIGlmIChtYXAuZ2V0KCJzaGVsbCIpICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1hcC5wdXQoInNoZWxsIiwgc2hlbGwpOworICAgICAgICB9CisgICAgfSAgICAKKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gQ09NTUFORCBMSU5FIFBST0NFU1NJTkcgTE9PUAorCisgICAgLy8KKyAgICAvLyBUT0RPOiBBZGQgYSBnZW5lcmFsIGVycm9yIGRpc3BsYXkgaGFuZGxlciwgYW5kIHByb2JhYmx5IGFkZCBhICJFUlJPUjogIiBwcmVmaXggdG8gdGhlIHJlc3VsdCBmb3IgY2xhcml0eSA/CisgICAgLy8gICAgICAgTWF5YmUgYWRkIG9uZSBmb3IgV0FSTklORydzIHRvbz8KKyAgICAvLworICAgIAorICAgIC8qKgorICAgICAqIFJlYWRzIGNvbW1hbmRzIGFuZCBzdGF0ZW1lbnRzIGZyb20gaW5wdXQgc3RyZWFtIGFuZCBwcm9jZXNzZXMgdGhlbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgIC8vIERpc3BsYXkgdGhlIHN0YXJ0dXAgYmFubmVyCisgICAgICAgIG91dC5wcmludGxuKE1FU1NBR0VTLmZvcm1hdCgic3RhcnR1cF9iYW5uZXIuMCIsIG5ldyBPYmplY3RbXSB7IEludm9rZXJIZWxwZXIuZ2V0VmVyc2lvbigpLCBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEudm0udmVyc2lvbiIpIH0pKTsKKyAgICAgICAgb3V0LnByaW50bG4oTUVTU0FHRVMuZ2V0TWVzc2FnZSgic3RhcnR1cF9iYW5uZXIuMSIpKTsKKworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgLy8gUmVhZCBhIGNvZGUgYmxvY2sgdG8gZXZhbHVhdGU7IHRoaXMgd2lsbCBkZWFsIHdpdGggYmFzaWMgZXJyb3IgaGFuZGxpbmcKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjb2RlID0gcmVhZCgpOworCisgICAgICAgICAgICAvLyBJZiB3ZSBnb3QgYSBudWxsLCB0aGVuIHF1aXQKKyAgICAgICAgICAgIGlmIChjb2RlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmVzZXQoKTsKKworICAgICAgICAgICAgLy8gRXZhbHVhdGUgdGhlIGNvZGUgYmxvY2sgaWYgaXQgd2FzIHBhcnNlZAorICAgICAgICAgICAgaWYgKGNvZGUubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJlZm9yZUV4ZWN1dGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmVFeGVjdXRpb24uY2FsbCgpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgbGFzdFJlc3VsdCA9IHNoZWxsLmV2YWx1YXRlKGNvZGUpOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFmdGVyRXhlY3V0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyRXhlY3V0aW9uLmNhbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIFNob3dzIHRoZSByZXN1bHQgb2YgdGhlIGV2YWx1YXRlZCBjb2RlCisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiPT09PiAiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4obGFzdFJlc3VsdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGVyci5wcmludGxuKGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVW5yb2xsIGludm9rZXIgZXhjZXB0aW9ucworICAgICAgICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEludm9rZXJJbnZvY2F0aW9uRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlID0gZS5nZXRDYXVzZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBmaWx0ZXJBbmRQcmludFN0YWNrVHJhY2UoZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBjbG9zdXJlIHRoYXQgaXMgZXhlY3V0ZWQgYmVmb3JlIHRoZSBleGVjdGlvbiBvZiBhIGdpdmVuIHNjcmlwdAorICAgICAqCisgICAgICogQHBhcmFtIGJlZm9yZUV4ZWN1dGlvbiBUaGUgY2xvc3VyZSB0byBleGVjdXRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QmVmb3JlRXhlY3V0aW9uKGZpbmFsIENsb3N1cmUgYmVmb3JlRXhlY3V0aW9uKSB7CisgICAgICAgIHRoaXMuYmVmb3JlRXhlY3V0aW9uID0gYmVmb3JlRXhlY3V0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgY2xvc3VyZSB0aGF0IGlzIGV4ZWN1dGVkIGFmdGVyIHRoZSBleGVjdXRpb24gb2YgdGhlIGxhc3Qgc2NyaXB0LiBUaGUgcmVzdWx0IG9mIHRoZQorICAgICAqIGV4ZWN1dGlvbiBpcyBwYXNzZWQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSBjbG9zdXJlICh0aGUgdmFsdWUgb2YgJ2l0JykKKyAgICAgKgorICAgICAqIEBwYXJhbSBhZnRlckV4ZWN1dGlvbiBUaGUgY2xvc3VyZSB0byBleGVjdXRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QWZ0ZXJFeGVjdXRpb24oZmluYWwgQ2xvc3VyZSBhZnRlckV4ZWN1dGlvbikgeworICAgICAgICB0aGlzLmFmdGVyRXhlY3V0aW9uID0gYWZ0ZXJFeGVjdXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogRmlsdGVyIHN0YWNrdHJhY2VzIHRvIHNob3cgb25seSByZWxldmFudCBsaW5lcyBvZiB0aGUgZXhjZXB0aW9uIHRocm93bi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjYXVzZSB0aGUgdGhyb3dhYmxlIHdob3NlIHN0YWNrdHJhY2UgbmVlZHMgdG8gYmUgZmlsdGVyZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZmlsdGVyQW5kUHJpbnRTdGFja1RyYWNlKGZpbmFsIFRocm93YWJsZSBjYXVzZSkgeworICAgICAgICBhc3NlcnQgY2F1c2UgIT0gbnVsbDsKKworICAgICAgICAvLworICAgICAgICAvLyBUT0RPOiBVc2UgbWVzc2FnZS4uLgorICAgICAgICAvLworICAgICAgICAKKyAgICAgICAgZXJyLnByaW50KCJFUlJPUjogIik7CisgICAgICAgIGVyci5wcmludGxuKGNhdXNlKTsKKworICAgICAgICBjYXVzZS5wcmludFN0YWNrVHJhY2UoZXJyKTsKKworICAgICAgICAvLworICAgICAgICAvLyBGSVhNRTogV2hhdCBpcyB0aGUgcG9pbnQgb2YgdGhpcz8gIEFGQUlDVCwgdGhpcyBqdXN0IHByb2R1Y2VzIGNyYXBweS9jb3JydXB0IHRyYWNlcyBhbmQgaXMgY29tcGxldGVseSB1c2VsZXNzCisgICAgICAgIC8vCisgICAgICAgIAorLy8gICAgICAgIFN0YWNrVHJhY2VFbGVtZW50W10gc3RhY2tUcmFjZSA9IGUuZ2V0U3RhY2tUcmFjZSgpOworLy8KKy8vICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0YWNrVHJhY2UubGVuZ3RoOyBpKyspIHsKKy8vICAgICAgICAgICAgU3RhY2tUcmFjZUVsZW1lbnQgZWxlbWVudCA9IHN0YWNrVHJhY2VbaV07CisvLyAgICAgICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IGVsZW1lbnQuZ2V0RmlsZU5hbWUoKTsKKy8vCisvLyAgICAgICAgICAgIGlmICgoZmlsZU5hbWU9PW51bGwgfHwgKCFmaWxlTmFtZS5lbmRzV2l0aCgiLmphdmEiKSkgJiYgKCFlbGVtZW50LmdldENsYXNzTmFtZSgpLnN0YXJ0c1dpdGgoImdqZGsiKSkpKSB7CisvLyAgICAgICAgICAgICAgICBlcnIucHJpbnQoIlx0YXQgIik7CisvLyAgICAgICAgICAgICAgICBlcnIucHJpbnRsbihlbGVtZW50KTsKKy8vICAgICAgICAgICAgfQorLy8gICAgICAgIH0KKyAgICB9CisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIENPTU1BTkQgTElORSBQUk9DRVNTSU5HIE1BQ0hJTkVSWQorCisgICAgLyoqIFRoZSBzdGF0ZW1lbnQgdGV4dCBhY2NlcHRlZCB0byBkYXRlICovCisgICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgYWNjZXB0ZWQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICAvKiogQSBsaW5lIG9mIHN0YXRlbWVudCB0ZXh0IG5vdCB5ZXQgYWNjZXB0ZWQgKi8KKyAgICBwcml2YXRlIFN0cmluZyBwZW5kaW5nOworCisgICAgLy8KKyAgICAvLyBGSVhNRTogRG9lc24ndCBsb29rIGxpa2UgJ2xpbmUnIGlzIHJlYWxseSB1c2VkL25lZWRlZCBhbnl3aGVyZS4uLiBjb3VsZCBkcm9wIGl0LCBvciBwZXJoYXBzCisgICAgLy8gICAgICAgIGNvdWxkIHVzZSBpdCB0byB1cGRhdGUgdGhlIHByb21wdCBlciBzb21ldGhpbmcgdG8gc2hvdyB0aGUgYnVmZmVyIHNpemU/CisgICAgLy8KKworICAgIC8qKiBUaGUgY3VycmVudCBsaW5lIG51bWJlciAqLworICAgIHByaXZhdGUgaW50IGxpbmU7CisgICAgCisgICAgLyoqIFNldCB0byBmb3JjZSBjbGVhciBvZiBhY2NlcHRlZCAqLworICAgIHByaXZhdGUgYm9vbGVhbiBzdGFsZSA9IGZhbHNlOworCisgICAgLyoqIEEgU291cmNlVW5pdCB1c2VkIHRvIGNoZWNrIHRoZSBzdGF0ZW1lbnQgKi8KKyAgICBwcml2YXRlIFNvdXJjZVVuaXQgcGFyc2VyOworCisgICAgLyoqIEFueSBhY3R1YWwgc3ludGF4IGVycm9yIGNhdWdodCBkdXJpbmcgcGFyc2luZyAqLworICAgIHByaXZhdGUgRXhjZXB0aW9uIGVycm9yOworCisgICAgLyoqCisgICAgICogUmVzZXRzIHRoZSBjb21tYW5kLWxpbmUgcHJvY2Vzc2luZyBtYWNoaW5lcnkgYWZ0ZXIgdXNlLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHJlc2V0KCkgeworICAgICAgICBzdGFsZSA9IHRydWU7CisgICAgICAgIHBlbmRpbmcgPSBudWxsOworICAgICAgICBsaW5lID0gMTsKKyAgICAgICAgcGFyc2VyID0gbnVsbDsKKyAgICAgICAgZXJyb3IgPSBudWxsOworICAgIH0KKworICAgIC8vCisgICAgLy8gRklYTUU6IFRoaXMgSmF2YWRvYyBpcyBub3QgY29ycmVjdC4uLiByZWFkKCkgd2lsbCByZXR1cm4gdGhlIGZ1bGwgY29kZSBibG9jayByZWFkIHVudGlsICJnbyIKKyAgICAvLworICAgIAorICAgIC8qKgorICAgICAqIFJlYWRzIGEgc2luZ2xlIHN0YXRlbWVudCBmcm9tIHRoZSBjb21tYW5kIGxpbmUuICBBbHNvIGlkZW50aWZpZXMKKyAgICAgKiBhbmQgcHJvY2Vzc2VzIGNvbW1hbmQgc2hlbGwgY29tbWFuZHMuICBSZXR1cm5zIHRoZSBjb21tYW5kIHRleHQKKyAgICAgKiBvbiBzdWNjZXNzLCBvciBudWxsIHdoZW4gY29tbWFuZCBwcm9jZXNzaW5nIGlzIGNvbXBsZXRlLgorICAgICAqIAorICAgICAqIE5PVEU6IENoYW5nZWQsIGZvciBub3csIHRvIHJlYWQgdW50aWwgJ2V4ZWN1dGUnIGlzIGlzc3VlZC4gIEF0CisgICAgICogJ2V4ZWN1dGUnLCB0aGUgc3RhdGVtZW50IG11c3QgYmUgY29tcGxldGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyByZWFkKCkgeworICAgICAgICByZXNldCgpOworICAgICAgICAKKyAgICAgICAgYm9vbGVhbiBjb21wbGV0ZSA9IGZhbHNlOworICAgICAgICBib29sZWFuIGRvbmUgPSBmYWxzZTsKKyAgICAgICAgCisgICAgICAgIHdoaWxlICgvKiAhY29tcGxldGUgJiYgKi8gIWRvbmUpIHsKKyAgICAgICAgICAgIC8vIFJlYWQgYSBsaW5lLiAgSWYgSU9FeGNlcHRpb24gb3IgbnVsbCwgb3IgY29tbWFuZCAiZXhpdCIsIHRlcm1pbmF0ZSBwcm9jZXNzaW5nLgorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBwZW5kaW5nID0gcmVhZGVyLnJlYWRMaW5lKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gRklYTUU6IFNob3VsZG4ndCByZWFsbHkgZWF0IHRoaXMgZXhjZXB0aW9uLCBtYXkgYmUgc29tZXRoaW5nIHdlIG5lZWQgdG8gc2VlLi4uID8KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJZiByZXN1bHQgaXMgbnVsbCB0aGVuIHdlIGFyZSBzaHV0dGluZyBkb3duCisgICAgICAgICAgICBpZiAocGVuZGluZyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEZpcnN0IHVwLCB0cnkgdG8gcHJvY2VzcyB0aGUgbGluZSBhcyBhIGNvbW1hbmQgYW5kIHByb2NlZWQgYWNjb3JkaW5nbHkKKyAgICAgICAgICAgIC8vIFRyaW0gd2hhdCB3ZSBoYXZlIGZvciB1c2UgaW4gY29tbWFuZCBiaXRzLCBzbyB0aGluZ3MgbGlrZSAiaGVscCAiIGFjdHVhbGx5IHNob3cgdGhlIGhlbHAgc2NyZWVuCisgICAgICAgICAgICBTdHJpbmcgY29tbWFuZCA9IHBlbmRpbmcudHJpbSgpOworCisgICAgICAgICAgICBpZiAoQ09NTUFORF9NQVBQSU5HUy5jb250YWluc0tleShjb21tYW5kKSkgeworICAgICAgICAgICAgICAgIGludCBjb2RlID0gKChJbnRlZ2VyKUNPTU1BTkRfTUFQUElOR1MuZ2V0KGNvbW1hbmQpKS5pbnRWYWx1ZSgpOworCisgICAgICAgICAgICAgICAgc3dpdGNoIChjb2RlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09NTUFORF9JRF9FWElUOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBjYXNlIENPTU1BTkRfSURfSEVMUDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlIZWxwKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIENPTU1BTkRfSURfRElTQ0FSRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09NTUFORF9JRF9ESVNQTEFZOgorICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheVN0YXRlbWVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT01NQU5EX0lEX0VYUExBSU46CisgICAgICAgICAgICAgICAgICAgICAgICBleHBsYWluU3RhdGVtZW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIENPTU1BTkRfSURfQklORElORzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlCaW5kaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIENPTU1BTkRfSURfRVhFQ1VURToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wbGV0ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLnByaW50bG4oTUVTU0FHRVMuZ2V0TWVzc2FnZSgiY29tbWFuZC5leGVjdXRlLm5vdF9jb21wbGV0ZSIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09NTUFORF9JRF9ESVNDQVJEX0xPQURFRF9DTEFTU0VTOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXRMb2FkZWRDbGFzc2VzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIENPTU1BTkRfSURfSU5TUEVDVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGluc3BlY3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkJVRzogVW5rbm93biBjb21tYW5kIGZvciBjb2RlOiAiICsgY29kZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gRmluaXNoZWQgcHJvY2Vzc2luZyBjb21tYW5kIGJpdHMsIGNvbnRpbnVlIHJlYWRpbmcsIGRvbid0IG5lZWQgdG8gcHJvY2VzcyBjb2RlCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgaXQncyBwYXJ0IG9mIGEgc3RhdGVtZW50LiAgSWYgaXQncyBqdXN0IHdoaXRlc3BhY2UsCisgICAgICAgICAgICAvLyB3ZSdsbCBqdXN0IGFjY2VwdCBpdCBhbmQgbW92ZSBvbi4gIE90aGVyd2lzZSwgcGFyc2luZyBpcyBhdHRlbXB0ZWQKKyAgICAgICAgICAgIC8vIG9uIHRoZSBjdW11bGF0ZWQgc3RhdGVtZW50IHRleHQsIGFuZCBlcnJvcnMgYXJlIHJlcG9ydGVkLiAgVGhlCisgICAgICAgICAgICAvLyBwZW5kaW5nIGlucHV0IGlzIGFjY2VwdGVkIG9yIHJlamVjdGVkIGJhc2VkIG9uIHRoYXQgcGFyc2luZy4KKworICAgICAgICAgICAgZnJlc2hlbigpOworCisgICAgICAgICAgICBpZiAocGVuZGluZy50cmltKCkubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGFjY2VwdCgpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUcnkgdG8gcGFyc2UgdGhlIGN1cnJlbnQgY29kZSBidWZmZXIKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjb2RlID0gY3VycmVudCgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAocGFyc2UoY29kZSkpIHsKKyAgICAgICAgICAgICAgICAvLyBDb2RlIHBhcnNlZCBmaW5lCisgICAgICAgICAgICAgICAgYWNjZXB0KCk7CisgICAgICAgICAgICAgICAgY29tcGxldGUgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoZXJyb3IgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIFVtLi4uID8/PworICAgICAgICAgICAgICAgIGFjY2VwdCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gUGFyc2UgZmFpbGVkLCBzcGl0IG91dCBzb21ldGhpbmcgdG8gdGhlIHVzZXIKKyAgICAgICAgICAgICAgICByZXBvcnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEdldCBhbmQgcmV0dXJuIHRoZSBzdGF0ZW1lbnQuCisgICAgICAgIHJldHVybiBhY2NlcHRlZChjb21wbGV0ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluc3BlY3QoKSB7CisgICAgICAgIGlmIChsYXN0UmVzdWx0ID09IG51bGwpeworICAgICAgICAgICAgZXJyLnByaW50bG4oTUVTU0FHRVMuZ2V0TWVzc2FnZSgiY29tbWFuZC5pbnNwZWN0Lm5vX3Jlc3VsdCIpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIEZJWE1FOiBVcGRhdGUgdGhpcyBvbmNlIHdlIGhhdmUgam9pbnQgY29tcGlsZSBoYXBweSBpbiB0aGUgY29yZSBidWlsZD8KKyAgICAgICAgLy8KKyAgICAgICAgLy8gdGhpcyBzaG91bGQgcmVhZDogZ3Jvb3Z5Lmluc3BlY3Quc3dpbmd1aS5PYmplY3RCcm93c2VyLmluc3BlY3QobGFzdFJlc3VsdCkKKyAgICAgICAgLy8gYnV0IHRoaXMgZG9lc250IGNvbXBpbGUgc2luY2UgT2JqZWN0QnJvd3Nlci5ncm9vdnkgaXMgY29tcGlsZWQgYWZ0ZXIgdGhpcyBjbGFzcy4KKyAgICAgICAgLy8KKworICAgICAgICAvLworICAgICAgICAvLyBGSVhNRTogV2hlbiBsYXVuY2hpbmcgdGhpcywgaWYgdGhlIHVzZXIgdHJpZXMgdG8gImV4aXQiIGFuZCB0aGUgd2luZG93IGlzIHN0aWxsIG9wZW5lZCwgdGhlIHNoZWxsIHdpbGwKKyAgICAgICAgLy8gICAgICAgIGhhbmcuLi4gbm90IHJlYWxseSBuaWNlIHVzZXIgZXhwZXJlbmNlIElNTy4gIFNob3VsZCB0cnkgdG8gZml4IHRoaXMgaWYgd2UgY2FuLgorICAgICAgICAvLworICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENsYXNzIHR5cGUgPSBDbGFzcy5mb3JOYW1lKCJncm9vdnkuaW5zcGVjdC5zd2luZ3VpLk9iamVjdEJyb3dzZXIiKTsKKyAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSB0eXBlLmdldE1ldGhvZCgiaW5zcGVjdCIsIG5ldyBDbGFzc1tdeyBPYmplY3QuY2xhc3MgfSk7CisgICAgICAgICAgICBtZXRob2QuaW52b2tlKHR5cGUsIG5ldyBPYmplY3RbXXsgbGFzdFJlc3VsdCB9KTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGVyci5wcmludGxuKCJDYW5ub3QgaW52b2tlIE9iamVjdEJyb3dzZXIiKTsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBhY2NlcHRlZCBzdGF0ZW1lbnQgYXMgYSBzdHJpbmcuICBJZiBub3QgY29tcGxldGUsIHJldHVybnMgZW1wdHkgc3RyaW5nLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGFjY2VwdGVkKGZpbmFsIGJvb2xlYW4gY29tcGxldGUpIHsKKyAgICAgICAgaWYgKGNvbXBsZXRlKSB7CisgICAgICAgICAgICByZXR1cm4gYWNjZXB0ZWQudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gIiI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBzdGF0ZW1lbnQsIGluY2x1ZGluZyBwZW5kaW5nIHRleHQuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgY3VycmVudCgpIHsKKyAgICAgICAgcmV0dXJuIGFjY2VwdGVkLnRvU3RyaW5nKCkgKyBwZW5kaW5nICsgTkVXX0xJTkU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWNjZXB0cyB0aGUgcGVuZGluZyB0ZXh0IGludG8gdGhlIHN0YXRlbWVudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYWNjZXB0KCkgeworICAgICAgICBhY2NlcHRlZC5hcHBlbmQocGVuZGluZykuYXBwZW5kKE5FV19MSU5FKTsKKyAgICAgICAgbGluZSArPSAxOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsZWFycyBhY2NlcHRlZCBpZiBzdGFsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZnJlc2hlbigpIHsKKyAgICAgICAgaWYgKHN0YWxlKSB7CisgICAgICAgICAgICBhY2NlcHRlZC5zZXRMZW5ndGgoMCk7CisgICAgICAgICAgICBzdGFsZSA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBTVVBQT1JUIFJPVVRJTkVTCisKKyAgICAvKioKKyAgICAgKiBBdHRlbXB0cyB0byBwYXJzZSB0aGUgc3BlY2lmaWVkIGNvZGUgd2l0aCB0aGUgc3BlY2lmaWVkIHRvbGVyYW5jZS4KKyAgICAgKiBVcGRhdGVzIHRoZSA8Y29kZT5wYXJzZXI8L2NvZGU+IGFuZCA8Y29kZT5lcnJvcjwvY29kZT4gbWVtYmVycworICAgICAqIGFwcHJvcHJpYXRlbHkuICBSZXR1cm5zIHRydWUgaWYgdGhlIHRleHQgcGFyc2VkLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICogVGhlIGF0dGVtcHRzIHRvIGlkZW50aWZ5IGFuZCBzdXBwcmVzcyBlcnJvcnMgcmVzdWx0aW5nIGZyb20gdGhlCisgICAgICogdW5maW5pc2hlZCBzb3VyY2UgdGV4dC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gcGFyc2UoZmluYWwgU3RyaW5nIGNvZGUsIGZpbmFsIGludCB0b2xlcmFuY2UpIHsKKyAgICAgICAgYXNzZXJ0IGNvZGUgIT0gbnVsbDsKKworICAgICAgICBib29sZWFuIHBhcnNlZCA9IGZhbHNlOworICAgICAgICBwYXJzZXIgPSBudWxsOworICAgICAgICBlcnJvciA9IG51bGw7CisKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBwYXJzZXIgYW5kIGF0dGVtcHQgdG8gcGFyc2UgdGhlIHRleHQgYXMgYSB0b3AtbGV2ZWwgc3RhdGVtZW50LgorICAgICAgICB0cnkgeworICAgICAgICAgICAgcGFyc2VyID0gU291cmNlVW5pdC5jcmVhdGUoImdyb292eXNoLXNjcmlwdCIsIGNvZGUsIHRvbGVyYW5jZSk7CisgICAgICAgICAgICBwYXJzZXIucGFyc2UoKTsKKyAgICAgICAgICAgIHBhcnNlZCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBXZSByZXBvcnQgZXJyb3JzIG90aGVyIHRoYW4gdW5leHBlY3RlZCBFT0YgdG8gdGhlIHVzZXIuCisgICAgICAgIGNhdGNoIChDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBpZiAocGFyc2VyLmdldEVycm9yQ29sbGVjdG9yKCkuZ2V0RXJyb3JDb3VudCgpID4gMSB8fCAhcGFyc2VyLmZhaWxlZFdpdGhVbmV4cGVjdGVkRU9GKCkpIHsKKyAgICAgICAgICAgICAgICBlcnJvciA9IGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlcnJvciA9IGU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcGFyc2VkOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBwYXJzZShmaW5hbCBTdHJpbmcgY29kZSkgeworICAgICAgICByZXR1cm4gcGFyc2UoY29kZSwgMSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJlcG9ydHMgdGhlIGxhc3QgcGFyc2luZyBlcnJvciB0byB0aGUgdXNlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVwb3J0KCkgeworICAgICAgICBlcnIucHJpbnRsbigiRGlzY2FyZGluZyBpbnZhbGlkIHRleHQ6Iik7IC8vIFRPRE86IGkxOG4KKyAgICAgICAgbmV3IEVycm9yUmVwb3J0ZXIoZXJyb3IsIGZhbHNlKS53cml0ZShlcnIpOworICAgIH0KKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBDT01NQU5EUworCisgICAgLy8KKyAgICAvLyBUT0RPOiBBZGQgYSBzaW1wbGUgY29tbWFuZCB0byByZWFkIGluIGEgRmlsZS9VUkwgaW50byB0aGUgYnVmZmVyIGZvciBleGVjdXRpb24sIGJ1dCBuZWVkIGJldHRlciBjb21tYW5kCisgICAgLy8gICAgICAgc3VwcG9ydCBmaXJzdCAoYWthIEdTaGVsbCkgc28gd2UgY2FuIGFsbG93IGNvbW1hbmRzIHRvIHRha2UgYXJncywgZXRjLgorICAgIC8vCisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09NTUFORF9JRF9FWElUID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09NTUFORF9JRF9IRUxQID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09NTUFORF9JRF9ESVNDQVJEID0gMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09NTUFORF9JRF9ESVNQTEFZID0gMzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09NTUFORF9JRF9FWFBMQUlOID0gNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09NTUFORF9JRF9FWEVDVVRFID0gNTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09NTUFORF9JRF9CSU5ESU5HID0gNjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09NTUFORF9JRF9ESVNDQVJEX0xPQURFRF9DTEFTU0VTID0gNzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09NTUFORF9JRF9JTlNQRUNUID0gODsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTEFTVF9DT01NQU5EX0lEID0gODsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIENPTU1BTkRTID0geworICAgICAgICAiZXhpdCIsCisgICAgICAgICJoZWxwIiwKKyAgICAgICAgImRpc2NhcmQiLAorICAgICAgICAiZGlzcGxheSIsCisgICAgICAgICJleHBsYWluIiwKKyAgICAgICAgImV4ZWN1dGUiLAorICAgICAgICAiYmluZGluZyIsCisgICAgICAgICJkaXNjYXJkY2xhc3NlcyIsCisgICAgICAgICJpbnNwZWN0IgorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgQ09NTUFORF9NQVBQSU5HUyA9IG5ldyBIYXNoTWFwKCk7CisKKyAgICBzdGF0aWMgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSBMQVNUX0NPTU1BTkRfSUQ7IGkrKykgeworICAgICAgICAgICAgQ09NTUFORF9NQVBQSU5HUy5wdXQoQ09NTUFORFNbaV0sIG5ldyBJbnRlZ2VyKGkpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEEgZmV3IHN5bm9ueW1zCisgICAgICAgIENPTU1BTkRfTUFQUElOR1MucHV0KCJxdWl0IiwgbmV3IEludGVnZXIoQ09NTUFORF9JRF9FWElUKSk7CisgICAgICAgIENPTU1BTkRfTUFQUElOR1MucHV0KCJnbyIsIG5ldyBJbnRlZ2VyKENPTU1BTkRfSURfRVhFQ1VURSkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBDT01NQU5EX0hFTFAgPSBuZXcgSGFzaE1hcCgpOworCisgICAgc3RhdGljIHsKKyAgICAgICAgQ09NTUFORF9IRUxQLnB1dChDT01NQU5EU1tDT01NQU5EX0lEX0VYSVRdLCAgICAiZXhpdC9xdWl0ICAgICAgICAgLSAiICsgTUVTU0FHRVMuZ2V0TWVzc2FnZSgiY29tbWFuZC5leGl0LmRlc2NyaXBpb24iKSk7CisgICAgICAgIENPTU1BTkRfSEVMUC5wdXQoQ09NTUFORFNbQ09NTUFORF9JRF9IRUxQXSwgICAgImhlbHAgICAgICAgICAgICAgIC0gIiArIE1FU1NBR0VTLmdldE1lc3NhZ2UoImNvbW1hbmQuaGVscC5kZXNjcmlwaW9uIikpOworICAgICAgICBDT01NQU5EX0hFTFAucHV0KENPTU1BTkRTW0NPTU1BTkRfSURfRElTQ0FSRF0sICJkaXNjYXJkICAgICAgICAgICAtICIgKyBNRVNTQUdFUy5nZXRNZXNzYWdlKCJjb21tYW5kLmRpc2NhcmQuZGVzY3JpcGlvbiIpKTsKKyAgICAgICAgQ09NTUFORF9IRUxQLnB1dChDT01NQU5EU1tDT01NQU5EX0lEX0RJU1BMQVldLCAiZGlzcGxheSAgICAgICAgICAgLSAiICsgTUVTU0FHRVMuZ2V0TWVzc2FnZSgiY29tbWFuZC5kaXNwbGF5LmRlc2NyaXBpb24iKSk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRklYTUU6IElmIHRoaXMgaXMgZGlzYWJsZWQsIHRoZW4gZXIgY29tbWVudCBpdCBvdXQsIHNvIGl0IGRvZXNuJ3QgY29uZnVzZSB0aGUgdXNlcgorICAgICAgICAvLworICAgICAgICAKKyAgICAgICAgQ09NTUFORF9IRUxQLnB1dChDT01NQU5EU1tDT01NQU5EX0lEX0VYUExBSU5dLCAiZXhwbGFpbiAgICAgICAgICAgLSAiICsgTUVTU0FHRVMuZ2V0TWVzc2FnZSgiY29tbWFuZC5leHBsYWluLmRlc2NyaXBpb24iKSk7CisgICAgICAgIENPTU1BTkRfSEVMUC5wdXQoQ09NTUFORFNbQ09NTUFORF9JRF9FWEVDVVRFXSwgImV4ZWN1dGUvZ28gICAgICAgIC0gIiArIE1FU1NBR0VTLmdldE1lc3NhZ2UoImNvbW1hbmQuZXhlY3V0ZS5kZXNjcmlwaW9uIikpOworICAgICAgICBDT01NQU5EX0hFTFAucHV0KENPTU1BTkRTW0NPTU1BTkRfSURfQklORElOR10sICJiaW5kaW5nICAgICAgICAgICAtICIgKyBNRVNTQUdFUy5nZXRNZXNzYWdlKCJjb21tYW5kLmJpbmRpbmcuZGVzY3JpcGlvbiIpKTsKKyAgICAgICAgQ09NTUFORF9IRUxQLnB1dChDT01NQU5EU1tDT01NQU5EX0lEX0RJU0NBUkRfTE9BREVEX0NMQVNTRVNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkaXNjYXJkY2xhc3NlcyAgICAtICIgKyBNRVNTQUdFUy5nZXRNZXNzYWdlKCJjb21tYW5kLmRpc2NhcmRjbGFzc2VzLmRlc2NyaXBpb24iKSk7CisgICAgICAgIENPTU1BTkRfSEVMUC5wdXQoQ09NTUFORFNbQ09NTUFORF9JRF9JTlNQRUNUXSwgImluc3BlY3QgICAgICAgICAgIC0gIiArIE1FU1NBR0VTLmdldE1lc3NhZ2UoImNvbW1hbmQuaW5zcGVjdC5kZXNjcmlwaW9uIikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERpc3BsYXlzIGhlbHAgdGV4dCBhYm91dCBhdmFpbGFibGUgY29tbWFuZHMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGRpc3BsYXlIZWxwKCkgeworICAgICAgICBvdXQucHJpbnRsbihNRVNTQUdFUy5nZXRNZXNzYWdlKCJjb21tYW5kLmhlbHAuYXZhaWxhYmxlX2NvbW1hbmRzIikpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IExBU1RfQ09NTUFORF9JRDsgaSsrKSB7CisgICAgICAgICAgICBvdXQucHJpbnQoIiAgICAiKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKENPTU1BTkRfSEVMUC5nZXQoQ09NTUFORFNbaV0pKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERpc3BsYXlzIHRoZSBhY2NlcHRlZCBzdGF0ZW1lbnQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGRpc3BsYXlTdGF0ZW1lbnQoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZ1tdIGxpbmVzID0gYWNjZXB0ZWQudG9TdHJpbmcoKS5zcGxpdChORVdfTElORSk7CisKKyAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCA9PSAxICYmIGxpbmVzWzBdLnRyaW0oKS5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICBvdXQucHJpbnRsbihNRVNTQUdFUy5nZXRNZXNzYWdlKCJjb21tYW5kLmRpc3BsYXkuYnVmZmVyX2VtcHR5IikpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLy8gRWgsIHRyeSB0byBwaWNrIGEgZGVjZW50IHBhZCBzaXplLi4uIGJ1dCBkb24ndCB0cnkgdG8gaGFyZAorICAgICAgICAgICAgaW50IHBhZHNpemUgPSAyOworICAgICAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCA+PSAxMCkgcGFkc2l6ZSsrOworICAgICAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCA+PSAxMDApIHBhZHNpemUrKzsKKyAgICAgICAgICAgIGlmIChsaW5lcy5sZW5ndGggPj0gMTAwMCkgcGFkc2l6ZSsrOworCisgICAgICAgICAgICAvLyBEdW1wIHRoZSBjdXJyZW50IGJ1ZmZlciB3aXRoIGEgbGluZSBudW1iZXIgcHJlZml4CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgLy8gTm9ybWFsaXplIHRoZSBmaWVsZCBzaXplIG9mIHRoZSBsaW5lIG51bWJlcgorICAgICAgICAgICAgICAgIFN0cmluZyBsaW5lbm8gPSBEZWZhdWx0R3Jvb3Z5TWV0aG9kcy5wYWRMZWZ0KFN0cmluZy52YWx1ZU9mKGkgKyAxKSwgbmV3IEludGVnZXIocGFkc2l6ZSksICIgIik7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgb3V0LnByaW50KGxpbmVubyk7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KCI+ICIpOworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGxpbmVzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERpc3BsYXlzIHRoZSBjdXJyZW50IGJpbmRpbmcgdXNlZCB3aGVuIGluc3RhbmNpYXRpbmcgdGhlIHNoZWxsLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBkaXNwbGF5QmluZGluZygpIHsKKyAgICAgICAgQmluZGluZyBjb250ZXh0ID0gc2hlbGwuZ2V0Q29udGV4dCgpOworICAgICAgICBNYXAgdmFyaWFibGVzID0gY29udGV4dC5nZXRWYXJpYWJsZXMoKTsKKyAgICAgICAgU2V0IHNldCA9IHZhcmlhYmxlcy5rZXlTZXQoKTsKKworICAgICAgICBpZiAoc2V0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgb3V0LnByaW50bG4oTUVTU0FHRVMuZ2V0TWVzc2FnZSgiY29tbWFuZC5iaW5kaW5nLmJpbmRpbmdfZW1wdHkiKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBvdXQucHJpbnRsbihNRVNTQUdFUy5nZXRNZXNzYWdlKCJjb21tYW5kLmJpbmRpbmcuYXZhaWxhYmxlX3ZhcmlhYmxlcyIpKTsKKworICAgICAgICAgICAgSXRlcmF0b3IgaXRlciA9IHNldC5pdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0IGtleSA9IGl0ZXIubmV4dCgpOworCisgICAgICAgICAgICAgICAgb3V0LnByaW50KCIgICAgIik7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KGtleSk7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KCIgPSAiKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbih2YXJpYWJsZXMuZ2V0KGtleSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQXR0ZW1wdHMgdG8gcGFyc2UgdGhlIGFjY2VwdGVkIHN0YXRlbWVudCBhbmQgZGlzcGxheSB0aGUgcGFyc2UgdHJlZSBmb3IgaXQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGV4cGxhaW5TdGF0ZW1lbnQoKSB7CisgICAgICAgIGlmIChwYXJzZShhY2NlcHRlZCh0cnVlKSwgMTApIHx8IGVycm9yID09IG51bGwpIHsKKyAgICAgICAgICAgIG91dC5wcmludGxuKE1FU1NBR0VTLmdldE1lc3NhZ2UoImNvbW1hbmQuZXhwbGFpbi50cmVlX2hlYWRlciIpKTsKKyAgICAgICAgICAgIC8vb3V0LnByaW50bG4odHJlZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBvdXQucHJpbnRsbihNRVNTQUdFUy5nZXRNZXNzYWdlKCJjb21tYW5kLmV4cGxhaW4udW5wYXJzYWJsZSIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZXNldExvYWRlZENsYXNzZXMoKSB7CisgICAgICAgIHNoZWxsLnJlc2V0TG9hZGVkQ2xhc3NlcygpOworICAgICAgICAKKyAgICAgICAgb3V0LnByaW50bG4oTUVTU0FHRVMuZ2V0TWVzc2FnZSgiY29tbWFuZC5kaXNjYXJkY2xhc3Nlcy5jbGFzc2RlZnNfZGlzY2FyZGVkIikpOworICAgIH0KKworICAgIC8vCisgICAgLy8gQ3VzdG9tIEpMaW5lIENvbXBsZXRvcnMgdG8gZmFuY3kgdXAgdGhlIHVzZXIgZXhwZXJlbmNlIG1vcmUuCisgICAgLy8KKworICAgIHByaXZhdGUgY2xhc3MgQ29tbWFuZE5hbWVDb21wbGV0b3IKKyAgICAgICAgZXh0ZW5kcyBTaW1wbGVDb21wbGV0b3IKKyAgICB7CisgICAgICAgIHB1YmxpYyBDb21tYW5kTmFtZUNvbXBsZXRvcigpIHsKKyAgICAgICAgICAgIHN1cGVyKG5ldyBTdHJpbmdbMF0pOworCisgICAgICAgICAgICAvLyBBZGQgZWFjaCBjb21tYW5kIG5hbWUvYWxpYXMgYXMgYSBjYW5kaWRhdGUKKyAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBDT01NQU5EX01BUFBJTkdTLmtleVNldCgpLml0ZXJhdG9yKCk7CisKKyAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIGFkZENhbmRpZGF0ZVN0cmluZygoU3RyaW5nKWl0ZXIubmV4dCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vCisgICAgLy8gVE9ETzogQWRkIGxvY2FsIHZhcmlhYmxlIGNvbXBsZXRpb24/CisgICAgLy8KKworICAgIC8vCisgICAgLy8gVE9ETzogQWRkIHNoZWxsIG1ldGhvZCBjb21wbGVudGlvbj8KKyAgICAvLworCisgICAgLyoKKyAgICBwcml2YXRlIHZvaWQgZmluZFNoZWxsTWV0aG9kcyhTdHJpbmcgY29tcGxldGUpIHsKKyAgICAgICAgTGlzdCBtZXRob2RzID0gc2hlbGwuZ2V0TWV0YUNsYXNzKCkuZ2V0TWV0YU1ldGhvZHMoKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbWV0aG9kcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIE1ldGFNZXRob2QgbWV0aG9kID0gKE1ldGFNZXRob2QpIGkubmV4dCgpOworICAgICAgICAgICAgaWYgKG1ldGhvZC5nZXROYW1lKCkuc3RhcnRzV2l0aChjb21wbGV0ZSkpIHsKKyAgICAgICAgICAgICAgICBpZiAobWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9ucy5hZGQobWV0aG9kLmdldE5hbWUoKSArICIoIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9ucy5hZGQobWV0aG9kLmdldE5hbWUoKSArICIoKSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBmaW5kTG9jYWxWYXJpYWJsZXMoU3RyaW5nIGNvbXBsZXRlKSB7CisgICAgICAgIFNldCBuYW1lcyA9IHNoZWxsLmdldENvbnRleHQoKS5nZXRWYXJpYWJsZXMoKS5rZXlTZXQoKTsKKworICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBuYW1lcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgaS5uZXh0KCk7CisgICAgICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKGNvbXBsZXRlKSkgeworICAgICAgICAgICAgICAgIGNvbXBsZXRpb25zLmFkZChuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAqLworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS9JbnRlcmFjdGl2ZVNoZWxsLnByb3BlcnRpZXMgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3VpL0ludGVyYWN0aXZlU2hlbGwucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjk0NDE1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS9JbnRlcmFjdGl2ZVNoZWxsLnByb3BlcnRpZXMKQEAgLTAsMCArMSw2NyBAQAorIworIyBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjCisjICRJZCQKKyMKKworIworIyBDTEkgbWVzc2FnZXMKKyMKKworY2xpLm9wdGlvbi5oZWxwLmRlc2NyaXB0aW9uPURpc3BsYXkgdGhpcyBoZWxwIG1lc3NhZ2UKK2NsaS5vcHRpb24udmVyc2lvbi5kZXNjcmlwdGlvbj1EaXNwbGF5IHRoZSB2ZXJzaW9uCisKK2NsaS5pbmZvLnVuZXhwZWN0ZWRfYXJncz1VbmV4cGVjdGVkIGFyZ3VtZW50czogezB9CitjbGkuaW5mby52ZXJzaW9uPUdyb292eSBTaGVsbCB7MH0KKworIworIyBDb21tYW5kIG1lc3NhZ2VzCisjCisKK2NvbW1hbmQuaGVscC5kZXNjcmlwaW9uPURpc3BsYXlzIHRoaXMgaGVscCB0ZXh0Citjb21tYW5kLmhlbHAuYXZhaWxhYmxlX2NvbW1hbmRzPUF2YWlsYWJsZSBjb21tYW5kczoKKworY29tbWFuZC5leGl0LmRlc2NyaXBpb249RXhpdCB0aGUgc2hlbGwKKworY29tbWFuZC5kaXNjYXJkLmRlc2NyaXBpb249RGlzY2FyZHMgdGhlIGN1cnJlbnQgc3RhdGVtZW50IGJ1ZmZlcgorCitjb21tYW5kLmRpc3BsYXkuZGVzY3JpcGlvbj1EaXNwbGF5cyB0aGUgY3VycmVudCBzdGF0ZW1lbnQgYnVmZmVyCitjb21tYW5kLmRpc3BsYXkuYnVmZmVyX2VtcHR5PVRoZSBjdXJyZW50IGJ1ZmZlciBpcyBlbXB0eS4KKworY29tbWFuZC5leHBsYWluLmRlc2NyaXBpb249RXhwbGFpbnMgdGhlIHBhcnNpbmcgb2YgdGhlIGN1cnJlbnQgc3RhdGVtZW50IGJ1ZmZlciAoY3VycmVudGx5IGRpc2FibGVkKQorY29tbWFuZC5leHBsYWluLnRyZWVfaGVhZGVyPVBhcnNlIHRyZWU6Citjb21tYW5kLmV4cGxhaW4udW5wYXJzYWJsZT1UaGUgc3RhdGVtZW50IGRvZXMgbm90IHBhcnNlLgorCitjb21tYW5kLmV4ZWN1dGUuZGVzY3JpcGlvbj1FeGVjdXRlcyB0aGUgY3VycmVudCBzdGF0ZW1lbnQgYnVmZmVyCitjb21tYW5kLmV4ZWN1dGUubm90X2NvbXBsZXRlPVN0YXRlbWVudCBpcyBub3QgY29tcGxldGUuCisKK2NvbW1hbmQuYmluZGluZy5kZXNjcmlwaW9uPVNob3dzIHRoZSBiaW5kaW5nIHVzZWQgYnkgdGhlIHNoZWxsCitjb21tYW5kLmJpbmRpbmcuYmluZGluZ19lbXB0eT1UaGUgY3VycmVudCBiaW5kaW5nIGlzIGVtcHR5LgorY29tbWFuZC5iaW5kaW5nLmF2YWlsYWJsZV92YXJpYWJsZXM9QXZhaWxhYmxlIHZhcmlhYmxlczoKKworY29tbWFuZC5kaXNjYXJkY2xhc3Nlcy5kZXNjcmlwaW9uPURpc2NhcmRzIGFsbCBmb3JtZXIgdW5ib3VuZCBjbGFzcyBkZWZpbml0aW9ucworY29tbWFuZC5kaXNjYXJkY2xhc3Nlcy5jbGFzc2RlZnNfZGlzY2FyZGVkPUFsbCBmb3JtZXIgdW5ib3VuZCBjbGFzcyBkZWZpbml0aW9ucyBhcmUgZGlzY2FyZGVkLgorCitjb21tYW5kLmluc3BlY3QuZGVzY3JpcGlvbj1PcGVucyBhbiBvYmplY3QgYnJvd3NlciBmb3IgdGhlIGV4cHJlc3Npb24gcmV0dXJuZWQgZnJvbSBwcmV2aW91cyAnZ28nCitjb21tYW5kLmluc3BlY3Qubm9fcmVzdWx0PU5vdGhpbmcgdG8gaW5zcGVjdCAocHJlY2VkaW5nICdnbycgbWlzc2luZz8pLgorCisjCisjIE1pc2MgbWVzc2FnZXMKKyMKKworc3RhcnR1cF9iYW5uZXIuMD1Hcm9vdnkgU2hlbGwgKHswfSwgSlZNOiB7MX0pCitzdGFydHVwX2Jhbm5lci4xPVR5cGUgJ2dvJyB0byBleGVjdXRlIHN0YXRlbWVudHM7IFR5cGUgJ2hlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS9TeXN0ZW1PdXRwdXRJbnRlcmNlcHRvci5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS9TeXN0ZW1PdXRwdXRJbnRlcmNlcHRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNTgyYzUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3VpL1N5c3RlbU91dHB1dEludGVyY2VwdG9yLmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgZ3Jvb3Z5LnVpOworCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuQ2xvc3VyZTsKKworaW1wb3J0IGphdmEuaW8uRmlsdGVyT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKKworLyoqCisgKiBJbnRlcmNlcHRzIFN5c3RlbS5vdXQuIEltcGxlbWVudGF0aW9uIGhlbHBlciBmb3IgQ29uc29sZS5ncm9vdnkuCisgKgorICogQHZlcnNpb24gJElkJAorICovCitwdWJsaWMgY2xhc3MgU3lzdGVtT3V0cHV0SW50ZXJjZXB0b3IgZXh0ZW5kcyBGaWx0ZXJPdXRwdXRTdHJlYW0geworCisgICAgcHJpdmF0ZSBDbG9zdXJlIGNhbGxiYWNrOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sKKyAgICAgKiAgICAgICAgICAgIGFjY2VwdHMgYSBzdHJpbmcgdG8gYmUgc2VudCB0byBzdGQgb3V0IGFuZCByZXR1cm5zIGEgQm9vbGVhbi4KKyAgICAgKiAgICAgICAgICAgIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgdHJ1ZSwgb3V0cHV0IHdpbGwgYmUgc2VudCB0bworICAgICAqICAgICAgICAgICAgU3lzdGVtLm91dCwgb3RoZXJ3aXNlIGl0IHdpbGwgbm90LgorICAgICAqLworICAgIHB1YmxpYyBTeXN0ZW1PdXRwdXRJbnRlcmNlcHRvcihmaW5hbCBDbG9zdXJlIGNhbGxiYWNrKSB7CisgICAgICAgIHN1cGVyKFN5c3RlbS5vdXQpOworICAgICAgICAKKyAgICAgICAgYXNzZXJ0IGNhbGxiYWNrICE9IG51bGw7CisgICAgICAgIAorICAgICAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnRzIGludGVyY2VwdGluZyBTeXN0ZW0ub3V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB7CisgICAgICAgIFN5c3RlbS5zZXRPdXQobmV3IFByaW50U3RyZWFtKHRoaXMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9wcyBpbnRlcmNlcHRpbmcgU3lzdGVtLm91dCwgc2VuZGluZyBvdXRwdXQgdG8gd2hlcmVldmVyIGl0IHdhcworICAgICAqIGdvaW5nIHdoZW4gdGhpcyBpbnRlcmNlcHRvciB3YXMgY3JlYXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9wKCkgeworICAgICAgICBTeXN0ZW0uc2V0T3V0KChQcmludFN0cmVhbSkgb3V0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnRlcmNlcHRzIG91dHB1dCAtIG1vcmV0IGNvbW1vbiBjYXNlIG9mIGJ5dGVbXQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBCb29sZWFuIHJlc3VsdCA9IChCb29sZWFuKSBjYWxsYmFjay5jYWxsKG5ldyBTdHJpbmcoYiwgb2ZmLCBsZW4pKTsKKyAgICAgICAgaWYgKHJlc3VsdC5ib29sZWFuVmFsdWUoKSkgeworICAgICAgICAgICAgb3V0LndyaXRlKGIsIG9mZiwgbGVuKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEludGVyY2VwdHMgb3V0cHV0IC0gc2luZ2xlIGNoYXJhY3RlcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQm9vbGVhbiByZXN1bHQgPSAoQm9vbGVhbikgY2FsbGJhY2suY2FsbChTdHJpbmcudmFsdWVPZigoY2hhcikgYikpOworICAgICAgICBpZiAocmVzdWx0LmJvb2xlYW5WYWx1ZSgpKSB7CisgICAgICAgICAgICBvdXQud3JpdGUoYik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3VpL2ljb25zL2Fycm93X3JlZG8ucG5nIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS9pY29ucy9hcnJvd19yZWRvLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGMzOTRjCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS9pY29ucy9hcnJvd19yZWRvLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3VpL2ljb25zL2Fycm93X3VuZG8ucG5nIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS9pY29ucy9hcnJvd191bmRvLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTcyYzVlCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS9pY29ucy9hcnJvd191bmRvLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3VpL2ljb25zL2Jvb2tfbmV4dC5wbmcgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3VpL2ljb25zL2Jvb2tfbmV4dC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYyZWExYQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdWkvaWNvbnMvYm9va19uZXh0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3VpL2ljb25zL2Jvb2tfcHJldmlvdXMucG5nIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS9pY29ucy9ib29rX3ByZXZpb3VzLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTUzYzY5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS9pY29ucy9ib29rX3ByZXZpb3VzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3VpL2ljb25zL2NyZWRpdHMudHh0IGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS9pY29ucy9jcmVkaXRzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTFlMGU0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS9pY29ucy9jcmVkaXRzLnR4dApAQCAtMCwwICsxLDUgQEAKK1RoZXNlIGljb25zIGFyZSBmcm9tIHRoZSBmYW1mYW1mYW0uY29tIHNpbGsgaWNvbnMgc2V0DQoraHR0cDovL3d3dy5mYW1mYW1mYW0uY29tL2xhYi9pY29ucy9zaWxrLw0KKw0KK0xpY2Vuc2VkIHVuZGVyIHRoZSBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIExpY2VuY2UgdjIuNQ0KK2h0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LzIuNS8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3VpL2ljb25zL2N1dC5wbmcgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3VpL2ljb25zL2N1dC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIxNWQ2ZgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdWkvaWNvbnMvY3V0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3VpL2ljb25zL2N1dF9yZWQucG5nIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS9pY29ucy9jdXRfcmVkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWJiMmYwCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS9pY29ucy9jdXRfcmVkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3VpL2ljb25zL2Rpc2sucG5nIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS9pY29ucy9kaXNrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWQ1MzJlCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS9pY29ucy9kaXNrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3VpL2ljb25zL2ZpbmQucG5nIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS9pY29ucy9maW5kLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTQ3NDc5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS9pY29ucy9maW5kLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3VpL2ljb25zL2ZvbGRlcl9wYWdlLnBuZyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdWkvaWNvbnMvZm9sZGVyX3BhZ2UucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlZjZlMTEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3VpL2ljb25zL2ZvbGRlcl9wYWdlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3VpL2ljb25zL3BhZ2UucG5nIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS9pY29ucy9wYWdlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2RkZDc5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS9pY29ucy9wYWdlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3VpL2ljb25zL3BhZ2VfY29weS5wbmcgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3VpL2ljb25zL3BhZ2VfY29weS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk1ZGM2ZAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdWkvaWNvbnMvcGFnZV9jb3B5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3VpL2ljb25zL3BhZ2VfcGFzdGUucG5nIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS9pY29ucy9wYWdlX3Bhc3RlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjhmMDczCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS9pY29ucy9wYWdlX3Bhc3RlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3VpL2ljb25zL3NjcmlwdF9nby5wbmcgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3VpL2ljb25zL3NjcmlwdF9nby5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUxNTRlMgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdWkvaWNvbnMvc2NyaXB0X2dvLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3VpL2ljb25zL3RleHRfcmVwbGFjZS5wbmcgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3VpL2ljb25zL3RleHRfcmVwbGFjZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc3ZjgyZgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdWkvaWNvbnMvdGV4dF9yZXBsYWNlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3VpL3BhY2thZ2UuaHRtbCBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdWkvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MGI5YzkKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3VpL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDggQEAKKzxodG1sPgorICA8aGVhZD4KKyAgICA8dGl0bGU+cGFja2FnZSBncm9vdnkudWkuKjwvdGl0bGU+CisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgPHA+QW4gaW50ZXJhY3RpdmUgY29tbWFuZCBsaW5lIHRlcm1pbmFsIGFsb25nIHdpdGggYSBTd2luZyBjb25zb2xlIGZvciBldmFsdWF0aW5nIEdyb292eSBzY3JpcHRzLjwvcD4KKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS90ZXh0L0ZpbmRSZXBsYWNlVXRpbGl0eS5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS90ZXh0L0ZpbmRSZXBsYWNlVXRpbGl0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNmUwMTEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3VpL3RleHQvRmluZFJlcGxhY2VVdGlsaXR5LmphdmEKQEAgLTAsMCArMSw1NjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGdyb292eS51aS50ZXh0OworCitpbXBvcnQgamF2YS5hd3QuQm9yZGVyTGF5b3V0OworaW1wb3J0IGphdmEuYXd0LkRpbWVuc2lvbjsKK2ltcG9ydCBqYXZhLmF3dC5GbG93TGF5b3V0OworaW1wb3J0IGphdmEuYXd0LkdyaWRMYXlvdXQ7CisKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5Gb2N1c0FkYXB0ZXI7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuRm9jdXNFdmVudDsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5LZXlBZGFwdGVyOworaW1wb3J0IGphdmEuYXd0LmV2ZW50LktleUV2ZW50OworaW1wb3J0IGphdmEuYXd0LmV2ZW50LlRleHRFdmVudDsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5UZXh0TGlzdGVuZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKKworaW1wb3J0IGphdmF4LnN3aW5nLkFjdGlvbjsKK2ltcG9ydCBqYXZheC5zd2luZy5BYnN0cmFjdEFjdGlvbjsKK2ltcG9ydCBqYXZheC5zd2luZy5Cb3hMYXlvdXQ7CitpbXBvcnQgamF2YXguc3dpbmcuSkJ1dHRvbjsKK2ltcG9ydCBqYXZheC5zd2luZy5KQ2hlY2tCb3g7CitpbXBvcnQgamF2YXguc3dpbmcuSkNvbWJvQm94OworaW1wb3J0IGphdmF4LnN3aW5nLkpEaWFsb2c7CitpbXBvcnQgamF2YXguc3dpbmcuSkxhYmVsOworaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKK2ltcG9ydCBqYXZheC5zd2luZy5KUm9vdFBhbmU7CitpbXBvcnQgamF2YXguc3dpbmcuS2V5U3Ryb2tlOworCitpbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuRXZlbnRMaXN0ZW5lckxpc3Q7CisKK2ltcG9ydCBqYXZheC5zd2luZy50ZXh0LkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBqYXZheC5zd2luZy50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnN3aW5nLnRleHQuRG9jdW1lbnQ7CitpbXBvcnQgamF2YXguc3dpbmcudGV4dC5KVGV4dENvbXBvbmVudDsKK2ltcG9ydCBqYXZheC5zd2luZy50ZXh0LlNlZ21lbnQ7CisKKy8qKgorICoKKyAqIEBhdXRob3IgRXZhbiAiSGlwcHkiIFNsYXRpcworICovCitwdWJsaWMgZmluYWwgY2xhc3MgRmluZFJlcGxhY2VVdGlsaXR5IHsKKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSU5EX0FDVElPTl9DT01NQU5EID0gIkZpbmQiOworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUExBQ0VfQUNUSU9OX0NPTU1BTkQgPSAiUmVwbGFjZSI7CisgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQTEFDRV9BTExfQUNUSU9OX0NPTU1BTkQgPSAiUmVwbGFjZSBBbGwiOworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMT1NFX0FDVElPTl9DT01NQU5EID0gIkNsb3NlIjsKKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFjdGlvbiBGSU5EX0FDVElPTiA9IG5ldyBGaW5kQWN0aW9uKCk7CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSkRpYWxvZyBGSU5EX1JFUExBQ0VfRElBTE9HID0gbmV3IEpEaWFsb2coKTsKKyAgICAgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSlBhbmVsIFRFWFRfRklFTERfUEFORUwgPSBuZXcgSlBhbmVsKG5ldyBHcmlkTGF5b3V0KDIsIDEpKTsKKyAgICAgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSlBhbmVsIEVOVFJZX1BBTkVMID0gbmV3IEpQYW5lbCgpOworICAgIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEpQYW5lbCBGSU5EX1BBTkVMID0gbmV3IEpQYW5lbCgpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEpMYWJlbCBGSU5EX0xBQkVMID0gbmV3IEpMYWJlbCgiRmluZCBXaGF0OiAgICAiKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBKQ29tYm9Cb3ggRklORF9GSUVMRCA9IG5ldyBKQ29tYm9Cb3goKTsKKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBKUGFuZWwgUkVQTEFDRV9QQU5FTCA9IG5ldyBKUGFuZWwoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBKTGFiZWwgUkVQTEFDRV9MQUJFTCA9IG5ldyBKTGFiZWwoIlJlcGxhY2UgV2l0aDoiKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBKQ29tYm9Cb3ggUkVQTEFDRV9GSUVMRCA9IG5ldyBKQ29tYm9Cb3goKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEpQYW5lbCBCVVRUT05fUEFORUwgPSBuZXcgSlBhbmVsKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSkJ1dHRvbiBGSU5EX0JVVFRPTiA9IG5ldyBKQnV0dG9uKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSkJ1dHRvbiBSRVBMQUNFX0JVVFRPTiA9IG5ldyBKQnV0dG9uKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSkJ1dHRvbiBSRVBMQUNFX0FMTF9CVVRUT04gPSBuZXcgSkJ1dHRvbigpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEpCdXR0b24gQ0xPU0VfQlVUVE9OID0gbmV3IEpCdXR0b24oKTsKKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBY3Rpb24gQ0xPU0VfQUNUSU9OID0gbmV3IENsb3NlQWN0aW9uKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQWN0aW9uIFJFUExBQ0VfQUNUSU9OID0gbmV3IFJlcGxhY2VBY3Rpb24oKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEpQYW5lbCBDSEVDS19CT1hfUEFORUwgPSBuZXcgSlBhbmVsKG5ldyBHcmlkTGF5b3V0KDMsIDEpKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBKQ2hlY2tCb3ggTUFUQ0hfQ0FTRV9DSEVDS0JPWCA9IG5ldyBKQ2hlY2tCb3goIk1hdGNoIENhc2UgICAgICAiKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBKQ2hlY2tCb3ggSVNfQkFDS1dBUkRTX0NIRUNLQk9YID0gbmV3IEpDaGVja0JveCgiU2VhcmNoIEJhY2t3YXJkcyIpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEpDaGVja0JveCBXUkFQX1NFQVJDSF9DSEVDS0JPWCA9IG5ldyBKQ2hlY2tCb3goIldyYXAgU2VhcmNoICAgICAiKTsKKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBKVGV4dENvbXBvbmVudCB0ZXh0Q29tcG9uZW50OworICAgIHByaXZhdGUgc3RhdGljIEF0dHJpYnV0ZVNldCBhdHRyaWJ1dGVTZXQ7CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGZpbmRSZXBsYWNlQ291bnQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGxhc3RBY3Rpb247CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXZlbnRMaXN0ZW5lckxpc3QgRVZFTlRfTElTVEVORVJfTElTVCA9IG5ldyBFdmVudExpc3RlbmVyTGlzdCgpOworICAgIAorICAgIC8vIHRoZSBkb2N1bWVudCBzZWdtZW50CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2VnbWVudCBTRUdNRU5UID0gbmV3IFNlZ21lbnQoKTsKKyAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGb2N1c0FkYXB0ZXIgVEVYVF9GT0NVU19MSVNURU5FUiA9IG5ldyBGb2N1c0FkYXB0ZXIoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZmUpIHsKKyAgICAgICAgICAgIHRleHRDb21wb25lbnQgPSAoSlRleHRDb21wb25lbnQpZmUuZ2V0U291cmNlKCk7CisgICAgICAgICAgICBhdHRyaWJ1dGVTZXQgPQorICAgICAgICAgICAgICAgIHRleHRDb21wb25lbnQuZ2V0RG9jdW1lbnQoKS5nZXREZWZhdWx0Um9vdEVsZW1lbnQoKS5nZXRBdHRyaWJ1dGVzKCk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgc3RhdGljIHsKKyAgICAgICAgRklORF9SRVBMQUNFX0RJQUxPRy5zZXRSZXNpemFibGUoZmFsc2UpOworICAgICAgICBGSU5EX1JFUExBQ0VfRElBTE9HLnNldERlZmF1bHRDbG9zZU9wZXJhdGlvbihKRGlhbG9nLkRJU1BPU0VfT05fQ0xPU0UpOworICAgICAgICAvLyBpcyBuZXh0IGxpbmUgbmVlZGVkIGF0IGFsbD8KKyAgICAgICAgLyogS2V5U3Ryb2tlIGtleVN0cm9rZSA9ICovIEtleVN0cm9rZS5nZXRLZXlTdHJva2UoImVudGVyIik7CisgICAgICAgIEtleUFkYXB0ZXIga2V5QWRhcHRlciA9IG5ldyBLZXlBZGFwdGVyKCkgeyAgICAgICAgICAgIAorICAgICAgICAgICAgcHVibGljIHZvaWQga2V5VHlwZWQoS2V5RXZlbnQga2UpIHsKKyAgICAgICAgICAgICAgICBpZiAoa2UuZ2V0S2V5Q2hhcigpID09IEtleUV2ZW50LlZLX0VOVEVSKSB7CisgICAgICAgICAgICAgICAgICAgIEZJTkRfQlVUVE9OLmRvQ2xpY2soKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIEZJTkRfUEFORUwuc2V0TGF5b3V0KG5ldyBGbG93TGF5b3V0KEZsb3dMYXlvdXQuUklHSFQpKTsKKyAgICAgICAgRklORF9QQU5FTC5hZGQoRklORF9MQUJFTCk7CisgICAgICAgIEZJTkRfUEFORUwuYWRkKEZJTkRfRklFTEQpOworICAgICAgICBGSU5EX0ZJRUxELmFkZEl0ZW0oIiIpOworICAgICAgICBGSU5EX0ZJRUxELnNldEVkaXRhYmxlKHRydWUpOworICAgICAgICBGSU5EX0ZJRUxELmdldEVkaXRvcigpLmdldEVkaXRvckNvbXBvbmVudCgpLmFkZEtleUxpc3RlbmVyKGtleUFkYXB0ZXIpOworICAgICAgICBEaW1lbnNpb24gZCA9IEZJTkRfRklFTEQuZ2V0UHJlZmVycmVkU2l6ZSgpOworICAgICAgICBkLndpZHRoID0gMjI1OworICAgICAgICBGSU5EX0ZJRUxELnNldFByZWZlcnJlZFNpemUoZCk7CisgICAgICAgIAorICAgICAgICBSRVBMQUNFX1BBTkVMLmFkZChSRVBMQUNFX0xBQkVMKTsKKyAgICAgICAgUkVQTEFDRV9QQU5FTC5hZGQoUkVQTEFDRV9GSUVMRCk7CisgICAgICAgIFJFUExBQ0VfRklFTEQuc2V0RWRpdGFibGUodHJ1ZSk7CisgICAgICAgIFJFUExBQ0VfRklFTEQuZ2V0RWRpdG9yKCkuZ2V0RWRpdG9yQ29tcG9uZW50KCkuYWRkS2V5TGlzdGVuZXIoa2V5QWRhcHRlcik7CisgICAgICAgIFJFUExBQ0VfRklFTEQuc2V0UHJlZmVycmVkU2l6ZShkKTsKKyAgICAgICAgCisgICAgICAgIFRFWFRfRklFTERfUEFORUwuc2V0TGF5b3V0KG5ldyBCb3hMYXlvdXQoVEVYVF9GSUVMRF9QQU5FTCwgQm94TGF5b3V0LllfQVhJUykpOworICAgICAgICBURVhUX0ZJRUxEX1BBTkVMLmFkZChGSU5EX1BBTkVMKTsKKyAgICAgICAgVEVYVF9GSUVMRF9QQU5FTC5hZGQoUkVQTEFDRV9QQU5FTCk7CisgICAgICAgIAorICAgICAgICBFTlRSWV9QQU5FTC5hZGQoVEVYVF9GSUVMRF9QQU5FTCk7CisgICAgICAgIEZJTkRfUkVQTEFDRV9ESUFMT0cuZ2V0Q29udGVudFBhbmUoKS5hZGQoRU5UUllfUEFORUwsIEJvcmRlckxheW91dC5XRVNUKTsKKworICAgICAgICBDSEVDS19CT1hfUEFORUwuYWRkKE1BVENIX0NBU0VfQ0hFQ0tCT1gpOworICAgICAgICAKKyAgICAgICAgQ0hFQ0tfQk9YX1BBTkVMLmFkZChJU19CQUNLV0FSRFNfQ0hFQ0tCT1gpOworICAgICAgICAKKyAgICAgICAgQ0hFQ0tfQk9YX1BBTkVMLmFkZChXUkFQX1NFQVJDSF9DSEVDS0JPWCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgIEVOVFJZX1BBTkVMLmFkZChDSEVDS19CT1hfUEFORUwpOworICAgICAgICBFTlRSWV9QQU5FTC5zZXRMYXlvdXQobmV3IEJveExheW91dChFTlRSWV9QQU5FTCwgQm94TGF5b3V0LllfQVhJUykpOworCisgICAgICAgIFJFUExBQ0VfQUxMX0JVVFRPTi5zZXRBY3Rpb24obmV3IFJlcGxhY2VBbGxBY3Rpb24oKSk7CisgICAgICAgIFJFUExBQ0VfQUxMX0JVVFRPTi5zZXRIb3Jpem9udGFsQWxpZ25tZW50KEpCdXR0b24uQ0VOVEVSKTsKKyAgICAgICAgZCA9IFJFUExBQ0VfQUxMX0JVVFRPTi5nZXRQcmVmZXJyZWRTaXplKCk7CisgICAgICAgIAorICAgICAgICBCVVRUT05fUEFORUwuc2V0TGF5b3V0KG5ldyBCb3hMYXlvdXQoQlVUVE9OX1BBTkVMLCBCb3hMYXlvdXQuWV9BWElTKSk7CisgICAgICAgIEZJTkRfQlVUVE9OLnNldEFjdGlvbihGSU5EX0FDVElPTik7CisgICAgICAgIEZJTkRfQlVUVE9OLnNldFByZWZlcnJlZFNpemUoZCk7CisgICAgICAgIEZJTkRfQlVUVE9OLnNldEhvcml6b250YWxBbGlnbm1lbnQoSkJ1dHRvbi5DRU5URVIpOworICAgICAgICBKUGFuZWwgcGFuZWwgPSBuZXcgSlBhbmVsKCk7CisgICAgICAgIHBhbmVsLmFkZChGSU5EX0JVVFRPTik7CisgICAgICAgIEJVVFRPTl9QQU5FTC5hZGQocGFuZWwpOworICAgICAgICBGSU5EX1JFUExBQ0VfRElBTE9HLmdldFJvb3RQYW5lKCkuc2V0RGVmYXVsdEJ1dHRvbihGSU5EX0JVVFRPTik7CisgICAgICAgIAorICAgICAgICBSRVBMQUNFX0JVVFRPTi5zZXRBY3Rpb24oUkVQTEFDRV9BQ1RJT04pOworICAgICAgICBSRVBMQUNFX0JVVFRPTi5zZXRQcmVmZXJyZWRTaXplKGQpOworICAgICAgICBSRVBMQUNFX0JVVFRPTi5zZXRIb3Jpem9udGFsQWxpZ25tZW50KEpCdXR0b24uQ0VOVEVSKTsKKyAgICAgICAgcGFuZWwgPSBuZXcgSlBhbmVsKCk7CisgICAgICAgIHBhbmVsLmFkZChSRVBMQUNFX0JVVFRPTik7CisgICAgICAgIEJVVFRPTl9QQU5FTC5hZGQocGFuZWwpOworICAgICAgICAKKyAgICAgICAgcGFuZWwgPSBuZXcgSlBhbmVsKCk7CisgICAgICAgIHBhbmVsLmFkZChSRVBMQUNFX0FMTF9CVVRUT04pOworICAgICAgICBCVVRUT05fUEFORUwuYWRkKHBhbmVsKTsKKyAgICAgICAgCisgICAgICAgIENMT1NFX0JVVFRPTi5zZXRBY3Rpb24oQ0xPU0VfQUNUSU9OKTsKKyAgICAgICAgQ0xPU0VfQlVUVE9OLnNldFByZWZlcnJlZFNpemUoZCk7CisgICAgICAgIENMT1NFX0JVVFRPTi5zZXRIb3Jpem9udGFsQWxpZ25tZW50KEpCdXR0b24uQ0VOVEVSKTsKKyAgICAgICAgcGFuZWwgPSBuZXcgSlBhbmVsKCk7CisgICAgICAgIHBhbmVsLmFkZChDTE9TRV9CVVRUT04pOworICAgICAgICBCVVRUT05fUEFORUwuYWRkKHBhbmVsKTsKKyAgICAgICAgRklORF9SRVBMQUNFX0RJQUxPRy5nZXRDb250ZW50UGFuZSgpLmFkZChCVVRUT05fUEFORUwpOworICAgICAgICAKKyAgICAgICAgS2V5U3Ryb2tlIHN0cm9rZSA9IChLZXlTdHJva2UpIENMT1NFX0FDVElPTi5nZXRWYWx1ZShBY3Rpb24uQUNDRUxFUkFUT1JfS0VZKTsKKyAgICAgICAgSlJvb3RQYW5lIHJQYW5lID0gRklORF9SRVBMQUNFX0RJQUxPRy5nZXRSb290UGFuZSgpOworICAgICAgICByUGFuZS5nZXRJbnB1dE1hcChKQnV0dG9uLldIRU5fSU5fRk9DVVNFRF9XSU5ET1cpLnB1dChzdHJva2UsICJleGl0Iik7CisgICAgICAgIHJQYW5lLmdldEFjdGlvbk1hcCgpLnB1dCgiZXhpdCIsIENMT1NFX0FDVElPTik7CisgICAgfQorCisgICAgLy8gU2luZ2xldG9uCisgICAgcHJpdmF0ZSBGaW5kUmVwbGFjZVV0aWxpdHkoKSB7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRUZXh0TGlzdGVuZXIoVGV4dExpc3RlbmVyIHRsKSB7CisgICAgICAgIEVWRU5UX0xJU1RFTkVSX0xJU1QuYWRkKFRleHRMaXN0ZW5lci5jbGFzcywgdGwpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGZpcmVUZXh0RXZlbnQoKSB7CisgICAgICAgIEV2ZW50TGlzdGVuZXJbXSBsc3RycyA9CisgICAgICAgICAgICBFVkVOVF9MSVNURU5FUl9MSVNULmdldExpc3RlbmVycyhUZXh0TGlzdGVuZXIuY2xhc3MpOworICAgICAgICBpZiAobHN0cnMgIT0gbnVsbCAmJiBsc3Rycy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBUZXh0RXZlbnQgdGUgPQorICAgICAgICAgICAgICAgIG5ldyBUZXh0RXZlbnQoRklORF9SRVBMQUNFX0RJQUxPRywgVGV4dEV2ZW50LlRFWFRfVkFMVUVfQ0hBTkdFRCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxzdHJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgKChUZXh0TGlzdGVuZXIpbHN0cnNbaV0pLnRleHRWYWx1ZUNoYW5nZWQodGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGxhc3QgYWN0aW9uCisgICAgICovICAgIAorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExhc3RBY3Rpb24oKSB7CisgICAgICAgIHJldHVybiBsYXN0QWN0aW9uOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSByZXBsYWNlbWVudCBjb3VudAorICAgICAqLyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRSZXBsYWNlbWVudENvdW50KCkgeworICAgICAgICByZXR1cm4gZmluZFJlcGxhY2VDb3VudDsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgc2VhcmNoIHRleHQKKyAgICAgKi8gICAgCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2VhcmNoVGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIChTdHJpbmcpIEZJTkRfRklFTEQuZ2V0U2VsZWN0ZWRJdGVtKCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEBwYXJhbSB0ZXh0Q29tcG9uZW50IHRoZSB0ZXh0IGNvbXBvbmVudCB0byBsaXN0ZW4gdG8KKyAgICAgKi8gICAgCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyVGV4dENvbXBvbmVudChKVGV4dENvbXBvbmVudCB0ZXh0Q29tcG9uZW50KSB7CisgICAgICAgIHRleHRDb21wb25lbnQuYWRkRm9jdXNMaXN0ZW5lcihURVhUX0ZPQ1VTX0xJU1RFTkVSKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZVRleHRMaXN0ZW5lcihUZXh0TGlzdGVuZXIgdGwpIHsKKyAgICAgICAgRVZFTlRfTElTVEVORVJfTElTVC5yZW1vdmUoVGV4dExpc3RlbmVyLmNsYXNzLCB0bCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEZpbmQgYW5kIHNlbGVjdCB0aGUgbmV4dCBzZWFyY2hhYmxlIG1hdGNoaW5nIHRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmV2ZXJzZSBsb29rIGZvcndhcmRzIG9yIGJhY2t3YXJkcworICAgICAqIEBwYXJhbSBwb3MgdGhlIHN0YXJ0aW5nIGluZGV4IHRvIHN0YXJ0IGZpbmRpbmcgZnJvbQorICAgICAqIEByZXR1cm4gdGhlIGxvY2F0aW9uIG9mIHRoZSBuZXh0IHNlbGVjdGVkLCBvciAtMSBpZiBub3QgZm91bmQKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgZmluZE5leHQoYm9vbGVhbiByZXZlcnNlLCBpbnQgcG9zKSB7CisgICAgICAgIGJvb2xlYW4gYmFja3dhcmRzID0gSVNfQkFDS1dBUkRTX0NIRUNLQk9YLmlzU2VsZWN0ZWQoKTsKKyAgICAgICAgYmFja3dhcmRzID0gYmFja3dhcmRzID8gIXJldmVyc2UgOiByZXZlcnNlOworICAgICAgICAKKyAgICAgICAgU3RyaW5nIHBhdHRlcm4gPSAoU3RyaW5nKSBGSU5EX0ZJRUxELmdldFNlbGVjdGVkSXRlbSgpOworICAgICAgICBpZiAocGF0dGVybiAhPSBudWxsICYmIHBhdHRlcm4ubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIERvY3VtZW50IGRvYyA9IHRleHRDb21wb25lbnQuZ2V0RG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICBkb2MuZ2V0VGV4dCgwLCBkb2MuZ2V0TGVuZ3RoKCksIFNFR01FTlQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gc2hvdWxkIE5FVkVSIHJlYWNoIGhlcmUKKyAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwb3MgKz0gdGV4dENvbXBvbmVudC5nZXRTZWxlY3RlZFRleHQoKSA9PSBudWxsID8gCisgICAgICAgICAgICAgICAgKGJhY2t3YXJkcyA/IC0xIDogMSkgOiAwOworCisgICAgICAgICAgICBjaGFyIGZpcnN0ID0gYmFja3dhcmRzID8KKyAgICAgICAgICAgICAgICBwYXR0ZXJuLmNoYXJBdChwYXR0ZXJuLmxlbmd0aCgpIC0gMSkgOiBwYXR0ZXJuLmNoYXJBdCgwKTsKKyAgICAgICAgICAgIGNoYXIgb3BwRmlyc3QgPSBDaGFyYWN0ZXIuaXNVcHBlckNhc2UoZmlyc3QpID8gCisgICAgICAgICAgICAgICAgQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGZpcnN0KSA6IENoYXJhY3Rlci50b1VwcGVyQ2FzZShmaXJzdCk7CisgICAgICAgICAgICBpbnQgc3RhcnQgPSBwb3M7CisgICAgICAgICAgICBib29sZWFuIHdyYXBwZWQgPSBXUkFQX1NFQVJDSF9DSEVDS0JPWC5pc1NlbGVjdGVkKCk7CisgICAgICAgICAgICBpbnQgZW5kID0gYmFja3dhcmRzID8gMCA6IFNFR01FTlQuZ2V0RW5kSW5kZXgoKTsKKyAgICAgICAgICAgIHBvcyArPSBiYWNrd2FyZHMgPyAtMSA6IDE7CisgICAgICAgICAgICAKKyAgICAgICAgCWludCBsZW5ndGggPSB0ZXh0Q29tcG9uZW50LmdldERvY3VtZW50KCkuZ2V0TGVuZ3RoKCk7CisgICAgICAgIAlpZiAocG9zID4gbGVuZ3RoKSB7CisgICAgICAgIAkJcG9zID0gd3JhcHBlZCA/IDAgOiBsZW5ndGg7CisgICAgICAgIAl9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgIHdoaWxlICghZm91bmQgJiYgKGJhY2t3YXJkcyA/IHBvcyA+IGVuZCA6IHBvcyA8IGVuZCkpIHsKKyAgICAgICAgICAgICAgICBmb3VuZCA9ICFNQVRDSF9DQVNFX0NIRUNLQk9YLmlzU2VsZWN0ZWQoKSAmJiBTRUdNRU5ULmFycmF5W3Bvc10gPT0gb3BwRmlyc3Q7CisgICAgICAgICAgICAgICAgZm91bmQgPSBmb3VuZCA/IGZvdW5kIDogU0VHTUVOVC5hcnJheVtwb3NdID09IGZpcnN0OworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICBwb3MgKz0gYmFja3dhcmRzID8gLShwYXR0ZXJuLmxlbmd0aCgpIC0gMSkgOiAwOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgZm91bmQgJiYgaSA8IHBhdHRlcm4ubGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjID0gcGF0dGVybi5jaGFyQXQoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9ICBTRUdNRU5ULmFycmF5W3BvcyArIGldID09IGM7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIU1BVENIX0NBU0VfQ0hFQ0tCT1guaXNTZWxlY3RlZCgpICYmICFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBDaGFyYWN0ZXIuaXNVcHBlckNhc2UoYykgPyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGMpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gIFNFR01FTlQuYXJyYXlbcG9zICsgaV0gPT0gYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgIHBvcyArPSBiYWNrd2FyZHMgPyAtMSA6IDE7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBvcyA9PSBlbmQgJiYgd3JhcHBlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcG9zID0gYmFja3dhcmRzID8gU0VHTUVOVC5nZXRFbmRJbmRleCgpIDogMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZCA9IHN0YXJ0OworICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcG9zID0gZm91bmQgPyBwb3MgOiAtMTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIHBvczsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRMaXN0U3RyaW5ncygpIHsKKyAgICAgICAgT2JqZWN0IGZpbmRPYmplY3QgPSBGSU5EX0ZJRUxELmdldFNlbGVjdGVkSXRlbSgpOworICAgICAgICBPYmplY3QgcmVwbGFjZU9iamVjdCA9IFJFUExBQ0VfRklFTEQuaXNTaG93aW5nKCkgPworICAgICAgICAgICAgKFN0cmluZykgUkVQTEFDRV9GSUVMRC5nZXRTZWxlY3RlZEl0ZW0oKSA6ICIiOworICAgICAgICAgICAgCisgICAgICAgIGlmIChmaW5kT2JqZWN0ICE9IG51bGwgJiYgcmVwbGFjZU9iamVjdCAhPSBudWxsKSB7CisgICAgICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgIWZvdW5kICYmIGkgPCBGSU5EX0ZJRUxELmdldEl0ZW1Db3VudCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBmb3VuZCA9IEZJTkRfRklFTEQuZ2V0SXRlbUF0KGkpLmVxdWFscyhmaW5kT2JqZWN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICBGSU5EX0ZJRUxELmluc2VydEl0ZW1BdChmaW5kT2JqZWN0LCAwKTsKKyAgICAgICAgICAgICAgICBpZiAoRklORF9GSUVMRC5nZXRJdGVtQ291bnQoKSA+IDcpIHsKKyAgICAgICAgICAgICAgICAgICAgRklORF9GSUVMRC5yZW1vdmVJdGVtQXQoNyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoUkVQTEFDRV9GSUVMRC5pc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgICAgIGZvdW5kID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7ICFmb3VuZCAmJiBpIDwgUkVQTEFDRV9GSUVMRC5nZXRJdGVtQ291bnQoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gUkVQTEFDRV9GSUVMRC5nZXRJdGVtQXQoaSkuZXF1YWxzKGZpbmRPYmplY3QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgIFJFUExBQ0VfRklFTEQuaW5zZXJ0SXRlbUF0KHJlcGxhY2VPYmplY3QsIDApOworICAgICAgICAgICAgICAgICAgICBpZiAoUkVQTEFDRV9GSUVMRC5nZXRJdGVtQ291bnQoKSA+IDcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJFUExBQ0VfRklFTEQucmVtb3ZlSXRlbUF0KDcpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNob3dEaWFsb2coKSB7CisgICAgICAgIHNob3dEaWFsb2coZmFsc2UpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gaXNSZXBsYWNlIHNob3cgYSByZXBsYWNlIGRpYWxvZyByYXRoZXIgdGhhbiBhIGZpbmQgZGlhbG9nIGlmIHRydWUKKyAgICAgKi8gICAgCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNob3dEaWFsb2coYm9vbGVhbiBpc1JlcGxhY2UpIHsKKyAgICAgICAgU3RyaW5nIHRpdGxlID0gaXNSZXBsYWNlID8gUkVQTEFDRV9BQ1RJT05fQ09NTUFORCA6IEZJTkRfQUNUSU9OX0NPTU1BTkQ7CisgICAgICAgIEZJTkRfUkVQTEFDRV9ESUFMT0cuc2V0VGl0bGUodGl0bGUpOworICAgICAgICAKKyAgICAgICAgU3RyaW5nIHRleHQgPSB0ZXh0Q29tcG9uZW50LmdldFNlbGVjdGVkVGV4dCgpOworICAgICAgICBpZiAodGV4dCA9PSBudWxsKSB7CisgICAgICAgIAl0ZXh0ID0gIiI7CisgICAgICAgIH0KKyAgICAgICAgRklORF9GSUVMRC5nZXRFZGl0b3IoKS5zZXRJdGVtKHRleHQpOworICAgICAgICBGSU5EX0ZJRUxELmdldEVkaXRvcigpLnNlbGVjdEFsbCgpOworICAgICAgICAgICAgICAgIAorICAgICAgICBSRVBMQUNFX1BBTkVMLnNldFZpc2libGUoaXNSZXBsYWNlKTsKKyAgICAgICAgUkVQTEFDRV9BTExfQlVUVE9OLnNldFZpc2libGUoaXNSZXBsYWNlKTsKKyAgICAgICAgQ0xPU0VfQlVUVE9OLnNldFZpc2libGUoaXNSZXBsYWNlKTsKKworICAgICAgICBBY3Rpb24gYWN0aW9uID0gaXNSZXBsYWNlID8KKyAgICAgICAgICAgICAgICBSRVBMQUNFX0FDVElPTiA6IENMT1NFX0FDVElPTjsKKyAgICAgICAgUkVQTEFDRV9CVVRUT04uc2V0QWN0aW9uKGFjdGlvbik7CisKKyAgICAgICAgUkVQTEFDRV9CVVRUT04uc2V0UHJlZmVycmVkU2l6ZShudWxsKTsKKyAgICAgICAgRGltZW5zaW9uIGQgPSBpc1JlcGxhY2UgPyAKKyAgICAgICAgICAgIFJFUExBQ0VfQUxMX0JVVFRPTi5nZXRQcmVmZXJyZWRTaXplKCkgOgorICAgICAgICAgICAgUkVQTEFDRV9CVVRUT04uZ2V0UHJlZmVycmVkU2l6ZSgpOworICAgICAgICBGSU5EX0JVVFRPTi5zZXRQcmVmZXJyZWRTaXplKGQpOworICAgICAgICBSRVBMQUNFX0JVVFRPTi5zZXRQcmVmZXJyZWRTaXplKGQpOworICAgICAgICBDTE9TRV9CVVRUT04uc2V0UHJlZmVycmVkU2l6ZShkKTsKKworICAgICAgICBGSU5EX1JFUExBQ0VfRElBTE9HLmludmFsaWRhdGUoKTsKKyAgICAgICAgRklORF9SRVBMQUNFX0RJQUxPRy5yZXBhaW50KCk7CisgICAgICAgIEZJTkRfUkVQTEFDRV9ESUFMT0cucGFjaygpOworICAgICAgICAKKyAgICAgICAgamF2YS5hd3QuRnJhbWVbXSBmcmFtZXMgPSBqYXZhLmF3dC5GcmFtZS5nZXRGcmFtZXMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChmcmFtZXNbaV0uaXNGb2N1c2VkKCkpIHsKKyAgICAgICAgICAgICAgICBGSU5EX1JFUExBQ0VfRElBTE9HLnNldExvY2F0aW9uUmVsYXRpdmVUbyhmcmFtZXNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBGSU5EX1JFUExBQ0VfRElBTE9HLnNldFZpc2libGUodHJ1ZSk7CisgICAgICAgIEZJTkRfRklFTEQucmVxdWVzdEZvY3VzSW5XaW5kb3coKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHBhcmFtIHRleHRDb21wb25lbnQgdGhlIHRleHQgY29tcG9uZW50IHRvIHN0b3AgbGlzdGVuaW5nIHRvCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHVucmVnaXN0ZXJUZXh0Q29tcG9uZW50KEpUZXh0Q29tcG9uZW50IHRleHRDb21wb25lbnQpIHsKKyAgICAgICAgdGV4dENvbXBvbmVudC5yZW1vdmVGb2N1c0xpc3RlbmVyKFRFWFRfRk9DVVNfTElTVEVORVIpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBGaW5kQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RBY3Rpb24geworICAgICAgICAKKyAgICAgICAgcHVibGljIEZpbmRBY3Rpb24oKSB7CisgICAgICAgICAgICBwdXRWYWx1ZShBY3Rpb24uTkFNRSwgRklORF9BQ1RJT05fQ09NTUFORCk7CisgICAgICAgICAgICBwdXRWYWx1ZShBY3Rpb24uQUNUSU9OX0NPTU1BTkRfS0VZLCBGSU5EX0FDVElPTl9DT01NQU5EKTsKKyAgICAgICAgICAgIHB1dFZhbHVlKEFjdGlvbi5NTkVNT05JQ19LRVksIG5ldyBJbnRlZ2VyKEtleUV2ZW50LlZLX0YpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGFlKSB7CisgICAgICAgICAgICBsYXN0QWN0aW9uID0gRklORF9BQ1RJT05fQ09NTUFORDsKKyAgICAgICAgICAgIGZpbmRSZXBsYWNlQ291bnQgPSAwOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoRklORF9SRVBMQUNFX0RJQUxPRy5pc1Zpc2libGUoKSAmJgorICAgICAgICAgICAgICAgIEZJTkRfUkVQTEFDRV9ESUFMT0cuZ2V0VGl0bGUoKS5lcXVhbHMoRklORF9BQ1RJT05fQ09NTUFORCkpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IHBvcyA9IHRleHRDb21wb25lbnQuZ2V0U2VsZWN0ZWRUZXh0KCkgPT0gbnVsbCA/IAorICAgICAgICAgICAgICAgIHRleHRDb21wb25lbnQuZ2V0Q2FyZXRQb3NpdGlvbigpIDogCisgICAgICAgICAgICAgICAgdGV4dENvbXBvbmVudC5nZXRTZWxlY3Rpb25TdGFydCgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBib29sZWFuIHJldmVyc2UgPSAoYWUuZ2V0TW9kaWZpZXJzKCkgJiBBY3Rpb25FdmVudC5TSElGVF9NQVNLKSAhPSAwOworICAgICAgICAgICAgcG9zID0gZmluZE5leHQocmV2ZXJzZSwgcG9zKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKHBvcyA+IC0xKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHBhdHRlcm4gPSAoU3RyaW5nKSBGSU5EX0ZJRUxELmdldFNlbGVjdGVkSXRlbSgpOworICAgICAgICAgICAgICAgIHRleHRDb21wb25lbnQuc2VsZWN0KHBvcywgcG9zICsgcGF0dGVybi5sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgZmluZFJlcGxhY2VDb3VudCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHNldExpc3RTdHJpbmdzKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZpcmVUZXh0RXZlbnQoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBSZXBsYWNlQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RBY3Rpb24geworICAgICAgICAKKyAgICAgICAgcHVibGljIFJlcGxhY2VBY3Rpb24oKSB7CisgICAgICAgICAgICBwdXRWYWx1ZShBY3Rpb24uTkFNRSwgUkVQTEFDRV9BQ1RJT05fQ09NTUFORCk7CisgICAgICAgICAgICBwdXRWYWx1ZShBY3Rpb24uQUNUSU9OX0NPTU1BTkRfS0VZLCBSRVBMQUNFX0FDVElPTl9DT01NQU5EKTsKKyAgICAgICAgICAgIHB1dFZhbHVlKEFjdGlvbi5NTkVNT05JQ19LRVksIG5ldyBJbnRlZ2VyKEtleUV2ZW50LlZLX1IpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBhZSkgeworICAgICAgICAgICAgbGFzdEFjdGlvbiA9IGFlLmdldEFjdGlvbkNvbW1hbmQoKTsKKyAgICAgICAgICAgIGZpbmRSZXBsYWNlQ291bnQgPSAwOworICAgICAgICAgICAgCisgICAgICAgICAgICBpbnQgcG9zID0gdGV4dENvbXBvbmVudC5nZXRTZWxlY3RlZFRleHQoKSA9PSBudWxsID8gCisgICAgICAgICAgICAgICAgdGV4dENvbXBvbmVudC5nZXRDYXJldFBvc2l0aW9uKCkgOiAKKyAgICAgICAgICAgICAgICB0ZXh0Q29tcG9uZW50LmdldFNlbGVjdGlvblN0YXJ0KCk7CisKKyAgICAgICAgICAgIHBvcyA9IGZpbmROZXh0KGZhbHNlLCBwb3MgLSAxKTsKKworICAgICAgICAgICAgaWYgKHBvcyA+IC0xKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGZpbmQgPSAoU3RyaW5nKSBGSU5EX0ZJRUxELmdldFNlbGVjdGVkSXRlbSgpOworICAgICAgICAgICAgICAgIFN0cmluZyByZXBsYWNlID0gKFN0cmluZykgUkVQTEFDRV9GSUVMRC5nZXRTZWxlY3RlZEl0ZW0oKTsKKyAgICAgICAgICAgICAgICByZXBsYWNlID0gcmVwbGFjZSA9PSBudWxsID8gIiIgOiByZXBsYWNlOworICAgICAgICAgICAgICAgIERvY3VtZW50IGRvYyA9IHRleHRDb21wb25lbnQuZ2V0RG9jdW1lbnQoKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBkb2MucmVtb3ZlKHBvcywgZmluZC5sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgICAgIGRvYy5pbnNlcnRTdHJpbmcocG9zLCByZXBsYWNlLCBhdHRyaWJ1dGVTZXQpOworCisgICAgICAgICAgICAgICAgICAgIGludCBsYXN0ID0gcG9zOworICAgICAgICAgICAgICAgICAgICBwb3MgPSBmaW5kTmV4dChmYWxzZSwgcG9zKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBvcyA+IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0Q29tcG9uZW50LnNlbGVjdChwb3MsIHBvcyArIGZpbmQubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdGV4dENvbXBvbmVudC5zZXRDYXJldFBvc2l0aW9uKGxhc3QgKyByZXBsYWNlLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gYmxlKSB7CisgICAgICAgICAgICAgICAgICAgIGJsZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmaW5kUmVwbGFjZUNvdW50ID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldExpc3RTdHJpbmdzKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZpcmVUZXh0RXZlbnQoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBSZXBsYWNlQWxsQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RBY3Rpb24geworICAgICAgICAKKyAgICAgICAgcHVibGljIFJlcGxhY2VBbGxBY3Rpb24oKSB7CisgICAgICAgICAgICBwdXRWYWx1ZShBY3Rpb24uTkFNRSwgUkVQTEFDRV9BTExfQUNUSU9OX0NPTU1BTkQpOworICAgICAgICAgICAgcHV0VmFsdWUoQWN0aW9uLkFDVElPTl9DT01NQU5EX0tFWSwgUkVQTEFDRV9BTExfQUNUSU9OX0NPTU1BTkQpOworICAgICAgICAgICAgcHV0VmFsdWUoQWN0aW9uLk1ORU1PTklDX0tFWSwgbmV3IEludGVnZXIoS2V5RXZlbnQuVktfQSkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGFlKSB7CisgICAgICAgICAgICBsYXN0QWN0aW9uID0gYWUuZ2V0QWN0aW9uQ29tbWFuZCgpOworICAgICAgICAgICAgZmluZFJlcGxhY2VDb3VudCA9IDA7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGludCBsYXN0ID0gdGV4dENvbXBvbmVudC5nZXRTZWxlY3RlZFRleHQoKSA9PSBudWxsID8gCisgICAgICAgICAgICAgICAgdGV4dENvbXBvbmVudC5nZXRDYXJldFBvc2l0aW9uKCkgOiAKKyAgICAgICAgICAgICAgICB0ZXh0Q29tcG9uZW50LmdldFNlbGVjdGlvblN0YXJ0KCk7CisKKyAgICAgICAgICAgIGludCBwb3MgPSBmaW5kTmV4dChmYWxzZSwgbGFzdCAtIDEpOworCisgICAgICAgICAgICBTdHJpbmcgZmluZCA9IChTdHJpbmcpIEZJTkRfRklFTEQuZ2V0U2VsZWN0ZWRJdGVtKCk7CisgICAgICAgICAgICBTdHJpbmcgcmVwbGFjZSA9IChTdHJpbmcpIFJFUExBQ0VfRklFTEQuZ2V0U2VsZWN0ZWRJdGVtKCk7CisgICAgICAgICAgICByZXBsYWNlID0gcmVwbGFjZSA9PSBudWxsID8gIiIgOiByZXBsYWNlOworICAgICAgICAgICAgd2hpbGUgKHBvcyA+IC0xKSB7CisgICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gdGV4dENvbXBvbmVudC5nZXREb2N1bWVudCgpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGRvYy5yZW1vdmUocG9zLCBmaW5kLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgZG9jLmluc2VydFN0cmluZyhwb3MsIHJlcGxhY2UsIGF0dHJpYnV0ZVNldCk7CisKKyAgICAgICAgICAgICAgICAgICAgbGFzdCA9IHBvczsKKyAgICAgICAgICAgICAgICAgICAgcG9zID0gZmluZE5leHQoZmFsc2UsIHBvcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgYmxlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZpbmRSZXBsYWNlQ291bnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKHBvcyA+IC0xKSB7CisgICAgICAgICAgICAgICAgdGV4dENvbXBvbmVudC5zZWxlY3QocG9zLCBwb3MgKyBmaW5kLmxlbmd0aCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHRleHRDb21wb25lbnQuc2V0Q2FyZXRQb3NpdGlvbihsYXN0ICsgcmVwbGFjZS5sZW5ndGgoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXRMaXN0U3RyaW5ncygpOworICAgICAgICAgICAgCisgICAgICAgICAgICBmaXJlVGV4dEV2ZW50KCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2xvc2VBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdEFjdGlvbiB7CisgICAgICAgIAorICAgICAgICBwdWJsaWMgQ2xvc2VBY3Rpb24oKSB7CisgICAgICAgICAgICBwdXRWYWx1ZShBY3Rpb24uTkFNRSwgQ0xPU0VfQUNUSU9OX0NPTU1BTkQpOworICAgICAgICAgICAgcHV0VmFsdWUoQWN0aW9uLkFDVElPTl9DT01NQU5EX0tFWSwgQ0xPU0VfQUNUSU9OX0NPTU1BTkQpOworICAgICAgICAgICAgcHV0VmFsdWUoQWN0aW9uLk1ORU1PTklDX0tFWSwgbmV3IEludGVnZXIoS2V5RXZlbnQuVktfQykpOworICAgICAgICAgICAgcHV0VmFsdWUoQWN0aW9uLkFDQ0VMRVJBVE9SX0tFWSwgS2V5U3Ryb2tlLmdldEtleVN0cm9rZSgiRVNDQVBFIikpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGFlKSB7CisgICAgICAgICAgICBGSU5EX1JFUExBQ0VfRElBTE9HLmRpc3Bvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkaXNwb3NlKCkgeworICAgICAgICBGSU5EX1JFUExBQ0VfRElBTE9HLmRpc3Bvc2UoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3VpL3RleHQvR3Jvb3Z5RmlsdGVyLmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3VpL3RleHQvR3Jvb3Z5RmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY2ZTE0MQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdWkvdGV4dC9Hcm9vdnlGaWx0ZXIuamF2YQpAQCAtMCwwICsxLDI1NyBAQAorLyoNCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4NCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCitwYWNrYWdlIGdyb292eS51aS50ZXh0Ow0KKw0KK2ltcG9ydCBqYXZhLmF3dC5Db2xvcjsNCisNCitpbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7DQoraW1wb3J0IGphdmEuYXd0LmV2ZW50LktleUV2ZW50Ow0KKw0KK2ltcG9ydCBqYXZheC5zd2luZy5BYnN0cmFjdEFjdGlvbjsNCitpbXBvcnQgamF2YXguc3dpbmcuQWN0aW9uOw0KK2ltcG9ydCBqYXZheC5zd2luZy5LZXlTdHJva2U7DQorDQoraW1wb3J0IGphdmF4LnN3aW5nLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247DQoraW1wb3J0IGphdmF4LnN3aW5nLnRleHQuRGVmYXVsdFN0eWxlZERvY3VtZW50Ow0KK2ltcG9ydCBqYXZheC5zd2luZy50ZXh0LkVsZW1lbnQ7DQoraW1wb3J0IGphdmF4LnN3aW5nLnRleHQuSlRleHRDb21wb25lbnQ7DQoraW1wb3J0IGphdmF4LnN3aW5nLnRleHQuU2VnbWVudDsNCitpbXBvcnQgamF2YXguc3dpbmcudGV4dC5TdHlsZTsNCitpbXBvcnQgamF2YXguc3dpbmcudGV4dC5TdHlsZUNvbnN0YW50czsNCitpbXBvcnQgamF2YXguc3dpbmcudGV4dC5TdHlsZWREb2N1bWVudDsNCitpbXBvcnQgamF2YXguc3dpbmcudGV4dC5TdHlsZUNvbnRleHQ7DQorDQorDQorLyoqDQorICoNCisgKiBAYXV0aG9yIEV2YW4gIkhpcHB5IiBTbGF0aXMNCisgKi8NCitwdWJsaWMgY2xhc3MgR3Jvb3Z5RmlsdGVyIGV4dGVuZHMgU3RydWN0dXJlZFN5bnRheERvY3VtZW50RmlsdGVyIHsNCisgICAgDQorICAgIC8vIGphdmEgdGFiIHBvbGljeSBhY3Rpb24NCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQWN0aW9uIEFVVE9fVEFCX0FDVElPTiA9IG5ldyBBdXRvVGFiQWN0aW9uKCk7DQorICAgIA0KKyAgICAvLyBTdHlsZSBuYW1lcw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NRU5UID0gImNvbW1lbnQiOw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTTEFTSF9TVEFSX0NPTU1FTlQgPSAiL1xcKig/czouKSo/KD86XFwqL3xcXHopIjsNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0xBU0hfU0xBU0hfQ09NTUVOVCA9ICAiLy8uKiI7DQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVT1RFUyA9DQorICAgIAkiKD9tczpcInszfSg/IVxcXCJ7MSwzfSkuKj8oPzpcInszfXxcXHopKXwoPzpcInsxfSg/IVxcXCIpLio/KD86XCJ8XFxaKSkiOw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSU5HTEVfUVVPVEVTID0NCisgICAgCSIoP21zOid7M30oPyEnezEsM30pLio/KD86J3szfXxcXHopKXwoPzonW14nXS4qPyg/Oid8XFx6KSkiOw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTTEFTSFlfUVVPVEVTID0gIi9bXi8qXS4qPy8iOw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESUdJVCA9ICJcXGQrP1tlZmxkXT8iOw0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURFTlQgPSAiW1xcd1xcJCYmW1xcRF1dW1xcd1xcJF0qIjsNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFUkFUSU9OID0gIltcXHdcXCQmJltcXERdXVtcXHdcXCRdKiAqXFwoIjsNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVGVF9QQVJFTlMgPSAiXFwoIjsNCisgICAgDQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbG9yIENPTU1FTlRfQ09MT1IgPSANCisgICAgICAgIENvbG9yLkxJR0hUX0dSQVkuZGFya2VyKCkuZGFya2VyKCk7DQorICAgIA0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTRVJWRURfV09SRCA9ICJyZXNlcnZlZCI7DQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gUkVTRVJWRURfV09SRFMgPSAgIHsiXFxiYWJzdHJhY3RcXGIiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFxiYXNzZXJ0XFxiIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcYmRlZmF1bHRcXGIiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFxiaWZcXGIiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFxicHJpdmF0ZVxcYiIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcXGJ0aGlzXFxiIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcYmJvb2xlYW5cXGIiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFxiZG9cXGIiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFxiaW1wbGVtZW50c1xcYiIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcXGJwcm90ZWN0ZWRcXGIiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFxidGhyb3dcXGIiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFxiYnJlYWtcXGIiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFxiZG91YmxlXFxiIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcYmltcG9ydFxcYiIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcXGJwdWJsaWNcXGIiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFxidGhyb3dzXFxiIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcYmJ5dGVcXGIiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFxiZWxzZVxcYiIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcXGJpbnN0YW5jZW9mXFxiIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcYnJldHVyblxcYiIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcXGJ0cmFuc2llbnRcXGIiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFxiY2FzZVxcYiIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcXGJleHRlbmRzXFxiIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcYmludFxcYiIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcXGJzaG9ydFxcYiIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcXGJ0cnlcXGIiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFxiY2F0Y2hcXGIiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFxiZmluYWxcXGIiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFxiaW50ZXJmYWNlXFxiIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcYmVudW1cXGIiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFxic3RhdGljXFxiIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcYnZvaWRcXGIiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFxiY2hhclxcYiIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcXGJmaW5hbGx5XFxiIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcYmxvbmdcXGIiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFxic3RyaWN0ZnBcXGIiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFxidm9sYXRpbGVcXGIiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFxiY2xhc3NcXGIiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFxiZmxvYXRcXGIiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFxibmF0aXZlXFxiIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcYnN1cGVyXFxiIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcYndoaWxlXFxiIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcYmNvbnN0XFxiIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcYmZvclxcYiIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcXGJuZXdcXGIiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFxic3dpdGNoXFxiIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcYmNvbnRpbnVlXFxiIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcYmdvdG9cXGIiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFxicGFja2FnZVxcYiIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcXGJkZWZcXGIiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFxiYXNcXGIiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFxiaW5cXGIiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFxic3luY2hyb25pemVkXFxiIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcYm51bGxcXGIifTsNCisgICAgDQorICAgIC8qKg0KKyAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIEdyb292eUZpbHRlcg0KKyAgICAgKi8NCisgICAgcHVibGljIEdyb292eUZpbHRlcihEZWZhdWx0U3R5bGVkRG9jdW1lbnQgZG9jKSB7DQorICAgICAgICBzdXBlcihkb2MpOw0KKyAgICAgICAgaW5pdCgpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIHZvaWQgaW5pdCgpIHsNCisgICAgICAgIFN0eWxlQ29udGV4dCBzdHlsZUNvbnRleHQgPSBTdHlsZUNvbnRleHQuZ2V0RGVmYXVsdFN0eWxlQ29udGV4dCgpOw0KKyAgICAgICAgU3R5bGUgZGVmYXVsdFN0eWxlID0gc3R5bGVDb250ZXh0LmdldFN0eWxlKFN0eWxlQ29udGV4dC5ERUZBVUxUX1NUWUxFKTsNCisgICAgICAgIA0KKyAgICAgICAgU3R5bGUgY29tbWVudCA9IHN0eWxlQ29udGV4dC5hZGRTdHlsZShDT01NRU5ULCBkZWZhdWx0U3R5bGUpOw0KKyAgICAgICAgU3R5bGVDb25zdGFudHMuc2V0Rm9yZWdyb3VuZChjb21tZW50LCBDT01NRU5UX0NPTE9SKTsNCisgICAgICAgIFN0eWxlQ29uc3RhbnRzLnNldEl0YWxpYyhjb21tZW50LCB0cnVlKTsNCisgICAgICAgIA0KKyAgICAgICAgU3R5bGUgcXVvdGVzID0gc3R5bGVDb250ZXh0LmFkZFN0eWxlKFFVT1RFUywgZGVmYXVsdFN0eWxlKTsNCisgICAgICAgIFN0eWxlQ29uc3RhbnRzLnNldEZvcmVncm91bmQocXVvdGVzLCBDb2xvci5NQUdFTlRBLmRhcmtlcigpLmRhcmtlcigpKTsNCisgICAgICAgIA0KKyAgICAgICAgU3R5bGUgY2hhclF1b3RlcyA9IHN0eWxlQ29udGV4dC5hZGRTdHlsZShTSU5HTEVfUVVPVEVTLCBkZWZhdWx0U3R5bGUpOw0KKyAgICAgICAgU3R5bGVDb25zdGFudHMuc2V0Rm9yZWdyb3VuZChjaGFyUXVvdGVzLCBDb2xvci5HUkVFTi5kYXJrZXIoKS5kYXJrZXIoKSk7DQorICAgICAgICANCisgICAgICAgIFN0eWxlIHNsYXNoeVF1b3RlcyA9IHN0eWxlQ29udGV4dC5hZGRTdHlsZShTTEFTSFlfUVVPVEVTLCBkZWZhdWx0U3R5bGUpOw0KKyAgICAgICAgU3R5bGVDb25zdGFudHMuc2V0Rm9yZWdyb3VuZChzbGFzaHlRdW90ZXMsIENvbG9yLk9SQU5HRS5kYXJrZXIoKSk7DQorICAgICAgICANCisgICAgICAgIFN0eWxlIGRpZ2l0ID0gc3R5bGVDb250ZXh0LmFkZFN0eWxlKERJR0lULCBkZWZhdWx0U3R5bGUpOw0KKyAgICAgICAgU3R5bGVDb25zdGFudHMuc2V0Rm9yZWdyb3VuZChkaWdpdCwgQ29sb3IuUkVELmRhcmtlcigpKTsNCisgICAgICAgIA0KKyAgICAgICAgU3R5bGUgb3BlcmF0aW9uID0gc3R5bGVDb250ZXh0LmFkZFN0eWxlKE9QRVJBVElPTiwgZGVmYXVsdFN0eWxlKTsNCisgICAgICAgIFN0eWxlQ29uc3RhbnRzLnNldEJvbGQob3BlcmF0aW9uLCB0cnVlKTsNCisgICAgICAgIA0KKyAgICAgICAgU3R5bGUgaWRlbnQgPSBzdHlsZUNvbnRleHQuYWRkU3R5bGUoSURFTlQsIGRlZmF1bHRTdHlsZSk7DQorICAgICAgICANCisgICAgICAgIFN0eWxlIHJlc2VydmVkV29yZHMgPSBzdHlsZUNvbnRleHQuYWRkU3R5bGUoUkVTRVJWRURfV09SRCwgZGVmYXVsdFN0eWxlKTsNCisgICAgICAgIFN0eWxlQ29uc3RhbnRzLnNldEJvbGQocmVzZXJ2ZWRXb3JkcywgdHJ1ZSk7DQorICAgICAgICBTdHlsZUNvbnN0YW50cy5zZXRGb3JlZ3JvdW5kKHJlc2VydmVkV29yZHMsIENvbG9yLkJMVUUuZGFya2VyKCkuZGFya2VyKCkpOw0KKyAgICAgICAgDQorICAgICAgICBTdHlsZSBsZWZ0UGFyZW5zID0gc3R5bGVDb250ZXh0LmFkZFN0eWxlKElERU5ULCBkZWZhdWx0U3R5bGUpOw0KKyAgICAgICAgDQorICAgICAgICBnZXRSb290Tm9kZSgpLnB1dFN0eWxlKFNMQVNIX1NUQVJfQ09NTUVOVCwgY29tbWVudCk7DQorICAgICAgICBnZXRSb290Tm9kZSgpLnB1dFN0eWxlKFNMQVNIX1NMQVNIX0NPTU1FTlQsIGNvbW1lbnQpOw0KKyAgICAgICAgZ2V0Um9vdE5vZGUoKS5wdXRTdHlsZShRVU9URVMsIHF1b3Rlcyk7DQorICAgICAgICBnZXRSb290Tm9kZSgpLnB1dFN0eWxlKFNJTkdMRV9RVU9URVMsIGNoYXJRdW90ZXMpOw0KKyAgICAgICAgZ2V0Um9vdE5vZGUoKS5wdXRTdHlsZShTTEFTSFlfUVVPVEVTLCBzbGFzaHlRdW90ZXMpOw0KKyAgICAgICAgZ2V0Um9vdE5vZGUoKS5wdXRTdHlsZShESUdJVCwgZGlnaXQpOw0KKyAgICAgICAgDQorICAgICAgICBnZXRSb290Tm9kZSgpLnB1dFN0eWxlKE9QRVJBVElPTiwgb3BlcmF0aW9uKTsNCisgICAgICAgIFN0cnVjdHVyZWRTeW50YXhEb2N1bWVudEZpbHRlci5MZXhlck5vZGUgbm9kZSA9IGNyZWF0ZUxleGVyTm9kZSgpOw0KKyAgICAgICAgbm9kZS5wdXRTdHlsZShSRVNFUlZFRF9XT1JEUywgcmVzZXJ2ZWRXb3Jkcyk7DQorICAgICAgICBub2RlLnB1dFN0eWxlKExFRlRfUEFSRU5TLCBsZWZ0UGFyZW5zKTsNCisgICAgICAgIGdldFJvb3ROb2RlKCkucHV0Q2hpbGQoT1BFUkFUSU9OLCBub2RlKTsNCisgICAgICAgIA0KKyAgICAgICAgZ2V0Um9vdE5vZGUoKS5wdXRTdHlsZShJREVOVCwgaWRlbnQpOw0KKyAgICAgICAgbm9kZSA9IGNyZWF0ZUxleGVyTm9kZSgpOw0KKyAgICAgICAgbm9kZS5wdXRTdHlsZShSRVNFUlZFRF9XT1JEUywgcmVzZXJ2ZWRXb3Jkcyk7DQorICAgICAgICBnZXRSb290Tm9kZSgpLnB1dENoaWxkKElERU5ULCBub2RlKTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGluc3RhbGxBdXRvVGFiQWN0aW9uKEpUZXh0Q29tcG9uZW50IHRDb21wKSB7DQorICAgICAgICB0Q29tcC5nZXRBY3Rpb25NYXAoKS5wdXQoIkdyb292eUZpbHRlci1hdXRvVGFiIiwgQVVUT19UQUJfQUNUSU9OKTsNCisgICAgICAgIEtleVN0cm9rZSBrZXlTdHJva2UgPSBLZXlTdHJva2UuZ2V0S2V5U3Ryb2tlKEtleUV2ZW50LlZLX0VOVEVSLCAwLCBmYWxzZSk7DQorICAgICAgICB0Q29tcC5nZXRJbnB1dE1hcCgpLnB1dChrZXlTdHJva2UsICJHcm9vdnlGaWx0ZXItYXV0b1RhYiIpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBdXRvVGFiQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RBY3Rpb24gew0KKyAgICAgICAgDQorICAgICAgICBwcml2YXRlIFN0eWxlZERvY3VtZW50IGRvYzsNCisgICAgICAgIHByaXZhdGUgZmluYWwgU2VnbWVudCBzZWdtZW50ID0gbmV3IFNlZ21lbnQoKTsNCisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsNCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGFlKSB7DQorICAgICAgICAgICAgSlRleHRDb21wb25lbnQgdENvbXAgPSAoSlRleHRDb21wb25lbnQpYWUuZ2V0U291cmNlKCk7DQorICAgICAgICAgICAgaWYgKHRDb21wLmdldERvY3VtZW50KCkgaW5zdGFuY2VvZiBTdHlsZWREb2N1bWVudCkgew0KKyAgICAgICAgICAgICAgICBkb2MgPSAoU3R5bGVkRG9jdW1lbnQpdENvbXAuZ2V0RG9jdW1lbnQoKTsNCisgICAgICAgICAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICAgICAgICAgIGRvYy5nZXRUZXh0KDAsIGRvYy5nZXRMZW5ndGgoKSwgc2VnbWVudCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQorICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGQgTkVWRVIgcmVhY2ggaGVyZQ0KKyAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gdENvbXAuZ2V0Q2FyZXRQb3NpdGlvbigpOw0KKyAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kVGFiTG9jYXRpb24ob2Zmc2V0KTsNCisgICAgICAgICAgICAgICAgYnVmZmVyLmRlbGV0ZSgwLCBidWZmZXIubGVuZ3RoKCkpOw0KKyAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCdcbicpOw0KKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkgew0KKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRleCArIDQ7IGkrKykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoJyAnKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB0cnkgew0KKyAgICAgICAgICAgICAgICAgICAgZG9jLmluc2VydFN0cmluZyhvZmZzZXQsIGJ1ZmZlci50b1N0cmluZygpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvYy5nZXREZWZhdWx0Um9vdEVsZW1lbnQoKS5nZXRBdHRyaWJ1dGVzKCkpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBibGUpIHsNCisgICAgICAgICAgICAgICAgICAgIGJsZS5wcmludFN0YWNrVHJhY2UoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgDQorICAgICAgICBwdWJsaWMgaW50IGZpbmRUYWJMb2NhdGlvbihpbnQgb2Zmc2V0KSB7ICANCisNCisgICAgICAgICAgICAvLyBmaW5kIGZpcnN0IHsNCisgICAgICAgICAgICBib29sZWFuIGNvbnQgPSB0cnVlOw0KKyAgICAgICAgICAgIHdoaWxlIChvZmZzZXQgPiAtMSAmJiBjb250KSB7DQorICAgICAgICAgICAgICAgIEVsZW1lbnQgZWwgPSBkb2MuZ2V0Q2hhcmFjdGVyRWxlbWVudChvZmZzZXQpOw0KKyAgICAgICAgICAgICAgICBPYmplY3QgY29sb3IgPQ0KKyAgICAgICAgICAgICAgICAgICAgZWwuZ2V0QXR0cmlidXRlcygpLmdldEF0dHJpYnV0ZShTdHlsZUNvbnN0YW50cy5Gb3JlZ3JvdW5kKTsNCisgICAgICAgICAgICAgICAgaWYgKCFDT01NRU5UX0NPTE9SLmVxdWFscyhjb2xvcikpIHsNCisgICAgICAgICAgICAgICAgICAgIGNvbnQgPSBzZWdtZW50LmFycmF5W29mZnNldF0gIT0gJ3snICYmDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudC5hcnJheVtvZmZzZXRdICE9ICd9JzsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBvZmZzZXQgLT0gY29udCA/IDEgOiAwOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBpZiAob2Zmc2V0ID4gLTEgJiYgc2VnbWVudC5hcnJheVtvZmZzZXRdID09ICd7Jykgew0KKyAgICAgICAgICAgICAgICB3aGlsZSAob2Zmc2V0ID4gLTEgJiYNCisgICAgICAgICAgICAgICAgICAgICAgICFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKHNlZ21lbnQuYXJyYXlbb2Zmc2V0LS1dKSl7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgaW50IGluZGV4ID0gb2Zmc2V0IDwgMCB8fCBzZWdtZW50LmFycmF5W29mZnNldF0gPT0gJ30nID8gLTQgOiAwOw0KKyAgICAgICAgICAgIGlmIChvZmZzZXQgPiAtMSkgew0KKyAgICAgICAgICAgICAgICBFbGVtZW50IHRvcCA9IGRvYy5nZXREZWZhdWx0Um9vdEVsZW1lbnQoKTsNCisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gdG9wLmdldEVsZW1lbnQodG9wLmdldEVsZW1lbnRJbmRleChvZmZzZXQpKS5nZXRTdGFydE9mZnNldCgpOw0KKw0KKyAgICAgICAgICAgICAgICB3aGlsZSAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShzZWdtZW50LmFycmF5W29mZnNldCsrXSkpIHsNCisgICAgICAgICAgICAgICAgICAgIGluZGV4Kys7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgcmV0dXJuIGluZGV4Ow0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdWkvdGV4dC9TdHJ1Y3R1cmVkU3ludGF4RG9jdW1lbnRGaWx0ZXIuamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdWkvdGV4dC9TdHJ1Y3R1cmVkU3ludGF4RG9jdW1lbnRGaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTUwMTYyCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS90ZXh0L1N0cnVjdHVyZWRTeW50YXhEb2N1bWVudEZpbHRlci5qYXZhCkBAIC0wLDAgKzEsNTUzIEBACisvKg0KKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLg0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KK3BhY2thZ2UgZ3Jvb3Z5LnVpLnRleHQ7DQorDQoraW1wb3J0IGphdmF4LnN3aW5nLnRleHQuKjsNCitpbXBvcnQgamF2YS5uaW8uQ2hhckJ1ZmZlcjsNCitpbXBvcnQgamF2YS51dGlsLio7DQoraW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOw0KK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsNCisNCisvKioNCisgKg0KKyAqIEBhdXRob3IgRXZhbiAiSGlwcHkiIFNsYXRpcw0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkU3ludGF4RG9jdW1lbnRGaWx0ZXIgZXh0ZW5kcyBEb2N1bWVudEZpbHRlciB7DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJfUkVQTEFDRU1FTlQgPSAiICAgICI7DQorICAgIA0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNTENvbXBhcmF0b3IgTUxfQ09NUEFSQVRPUiA9IG5ldyBNTENvbXBhcmF0b3IoKTsNCisNCisgICAgLyoqDQorICAgICAqIFRoZSByb290IG9mIHRoZSBsZXhpY2FsIHBhcnNpbmcgdHJlZS4NCisgICAgICovDQorICAgIHByb3RlY3RlZCBMZXhlck5vZGUgbGV4ZXIgPSBuZXcgTGV4ZXJOb2RlKHRydWUpOw0KKyAgICANCisgICAgLy8gVGhlIHN0eWxlZCBkb2N1bWVudCB0aGUgZmlsdGVyIHBhcnNlcw0KKyAgICBwcm90ZWN0ZWQgRGVmYXVsdFN0eWxlZERvY3VtZW50IHN0eWxlZERvY3VtZW50OyANCisgICAgDQorICAgIC8vIHRoZSBkb2N1bWVudCBidWZmZXIgYW5kIHNlZ21lbnQNCisgICAgcHJpdmF0ZSBTZWdtZW50IHNlZ21lbnQgPSBuZXcgU2VnbWVudCgpOw0KKyAgICBwcml2YXRlIENoYXJCdWZmZXIgYnVmZmVyOw0KKyAgICANCisgICAgLyoqDQorICAgICAqIFRoZSBwb3NpdGlvbiB0cmVlIG9mIG11bHRpLWxpbmUgY29tbWVudHMuDQorICAgICAqLyANCisgICAgcHJvdGVjdGVkIFRyZWVTZXQgbWxUZXh0UnVuU2V0ID0gbmV3IFRyZWVTZXQoTUxfQ09NUEFSQVRPUik7DQorICAgIA0KKyAgICAvLyBFbnN1cmVzIG5vdCBhZGRpbmcgYW55IHJlZ2V4cCB3aXRoIGNhcHR1cmluZyBncm91cHMNCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja1JlZ2V4cChTdHJpbmcgcmVnZXhwKSB7DQorICAgICAgICBTdHJpbmcgY2hlY2tpbmcgPSByZWdleHAucmVwbGFjZUFsbCgiXFxcXFxcKCIsICJYIikucmVwbGFjZUFsbCgiXFwoXFw/IiwgIlgiKTsNCisgICAgICAgIGludCBjaGVja2VkID0gY2hlY2tpbmcuaW5kZXhPZignKCcpOw0KKyAgICAgICAgaWYgKGNoZWNrZWQgPiAtMSkgew0KKyAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiT25seSBub24tY2FwdHVyaW5nIGdyb3VwcyBhbGxvd2VkOlxyXG4iICsNCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVnZXhwICsgIlxyXG4iOw0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hlY2tlZDsgaSsrKSB7DQorICAgICAgICAgICAgICAgIG1zZyArPSAiICI7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIG1zZyArPSAiXiI7DQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihtc2cpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICAvKioNCisgICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBTdHJ1Y3R1cmVkU3ludGF4RG9jdW1lbnRGaWx0ZXINCisgICAgICogQHBhcmFtIGRvY3VtZW50IHRoZSBzdHlsZWQgZG9jdW1lbnQgdG8gcGFyc2UNCisgICAgICovDQorICAgIHB1YmxpYyBTdHJ1Y3R1cmVkU3ludGF4RG9jdW1lbnRGaWx0ZXIoRGVmYXVsdFN0eWxlZERvY3VtZW50IGRvY3VtZW50KSB7DQorICAgICAgICB0aGlzLnN0eWxlZERvY3VtZW50ID0gZG9jdW1lbnQ7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IGNhbGNCZWdpblBhcnNlKGludCBvZmZzZXQpIHsNCisgICAgICAgIE11bHRpTGluZVJ1biBtbHIgPSBnZXRNdWx0aUxpbmVSdW4ob2Zmc2V0KTsNCisgICAgICAgIGlmIChtbHIgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIC8vIG1lYW5zIHdlJ3JlIGluIG1pZGRsZSBvZiBtbHIsIHNvIHN0YXJ0IGF0IGJlZ2lubmluZyBvZiBtbHINCisgICAgICAgICAgICBvZmZzZXQgPSBtbHIuc3RhcnQoKTsNCisgICAgICAgIH0NCisgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgZWFybGllc3QgcG9zaXRpb24gaW4gbGluZSBub3QgcGFydCBvZiBtbHINCisgICAgICAgICAgICBvZmZzZXQgPSBzdHlsZWREb2N1bWVudC5nZXRQYXJhZ3JhcGhFbGVtZW50KG9mZnNldCkuZ2V0U3RhcnRPZmZzZXQoKTsNCisgICAgICAgICAgICBtbHIgPSBnZXRNdWx0aUxpbmVSdW4ob2Zmc2V0KTsNCisgICAgICAgICAgICBvZmZzZXQgPSBtbHIgPT0gbnVsbCA/IG9mZnNldCA6IG1sci5lbmQoKSArIDE7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHJldHVybiBvZmZzZXQ7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgaW50IGNhbGNFbmRQYXJzZShpbnQgb2Zmc2V0KSB7DQorICAgICAgICBNdWx0aUxpbmVSdW4gbWxyID0gZ2V0TXVsdGlMaW5lUnVuKG9mZnNldCk7DQorICAgICAgICBpZiAobWxyICE9IG51bGwpIHsNCisgICAgICAgICAgICAvLyBtZWFucyB3ZSdyZSBpbiBtaWRkbGUgb2YgbWxyLCBzbyBlbmQgaXMgYXQgZW5kIG9mIG1scg0KKyAgICAgICAgICAgIG9mZnNldCA9IG1sci5lbmQoKTsNCisgICAgICAgIH0NCisgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgbGF0ZXN0IHBvc2l0aW9uIGluIGxpbmUgbm90IHBhcnQgb2YgbWxyDQorICAgICAgICAgICAgb2Zmc2V0ID0gc3R5bGVkRG9jdW1lbnQuZ2V0UGFyYWdyYXBoRWxlbWVudChvZmZzZXQpLmdldEVuZE9mZnNldCgpOw0KKyAgICAgICAgICAgIG1sciA9IGdldE11bHRpTGluZVJ1bihvZmZzZXQpOw0KKyAgICAgICAgICAgIG9mZnNldCA9IG1sciA9PSBudWxsID8gb2Zmc2V0IDogbWxyLmVuZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICByZXR1cm4gb2Zmc2V0Ow0KKyAgICB9DQorICAgIA0KKyAgICAvKioNCisgICAgICogQ3JlYXRlIGEgbmV3IExleGVyTm9kZSBmb3IgYWRkaW5nIHRvIHJvb3QuDQorICAgICAqDQorICAgICAqIEByZXR1cm4gYSBuZXcgTGV4ZXJOb2RlDQorICAgICAqLw0KKyAgICBwdWJsaWMgTGV4ZXJOb2RlIGNyZWF0ZUxleGVyTm9kZSgpIHsNCisgICAgICAgIHJldHVybiBuZXcgTGV4ZXJOb2RlKGZhbHNlKTsNCisgICAgfQ0KKyAgICANCisgICAgLy8gZ2l2ZW4gYW4gb2Zmc2V0LCByZXR1cm4gdGhlIG1sciBpdCByZXNpZGVzIGluDQorICAgIHByaXZhdGUgTXVsdGlMaW5lUnVuIGdldE11bHRpTGluZVJ1bihpbnQgb2Zmc2V0KSB7DQorICAgICAgICBNdWx0aUxpbmVSdW4gbWwgPSBudWxsOw0KKyAgICAgICAgaWYgKG9mZnNldCA+IDApIHsNCisgICAgICAgICAgICBJbnRlZ2VyIG9zID0gbmV3IEludGVnZXIob2Zmc2V0KTsNCisNCisgICAgICAgICAgICBTb3J0ZWRTZXQgc2V0ID0gbWxUZXh0UnVuU2V0LmhlYWRTZXQob3MpOw0KKyAgICAgICAgICAgIGlmICghc2V0LmlzRW1wdHkoKSkgew0KKyAgICAgICAgICAgICAgICBtbCA9IChNdWx0aUxpbmVSdW4pc2V0Lmxhc3QoKTsNCisgICAgICAgICAgICAgICAgbWwgPSBtbC5lbmQoKSA+PSBvZmZzZXQgPyBtbCA6IG51bGw7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcmV0dXJuIG1sOw0KKyAgICB9DQorICAgIA0KKyAgICAvKioNCisgICAgICogR2V0IHRoZSByb290IG5vZGUgZm9yIGxleGluZyB0aGUgZG9jdW1lbnQuICAgQ2hpbGRyZW4gY2FuIGJlIGFkZGVkIHN1Y2gNCisgICAgICogdGhhdCBtYXRjaGluZyBwYXR0ZXJucyBjYW4gYmUgZnVydGhlciBwYXJzZWQgaWYgcmVxdWlyZWQuDQorICAgICAqDQorICAgICAqIEByZXR1cm4gdGhlIHJvb3QgbGV4aW5nIG5vZGUuICANCisgICAgICovDQorICAgIHB1YmxpYyBMZXhlck5vZGUgZ2V0Um9vdE5vZGUoKSB7DQorICAgICAgICByZXR1cm4gbGV4ZXI7DQorICAgIH0NCisgICAgDQorICAgIC8qKg0KKyAgICAgKiBJbnNlcnQgYSBzdHJpbmcgaW50byB0aGUgZG9jdW1lbnQsIGFuZCB0aGVuIHBhcnNlIGl0IGlmIHRoZSBwYXJzZXIgaGFzIGJlZW4NCisgICAgICogc2V0Lg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gZmINCisgICAgICogQHBhcmFtIG9mZnNldA0KKyAgICAgKiBAcGFyYW0gdGV4dA0KKyAgICAgKiBAcGFyYW0gYXR0cnMNCisgICAgICogQHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbg0KKyAgICAgKi8gICAgDQorICAgIHB1YmxpYyB2b2lkIGluc2VydFN0cmluZyhEb2N1bWVudEZpbHRlci5GaWx0ZXJCeXBhc3MgZmIsIGludCBvZmZzZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKQ0KKyAgICAgICAgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsNCisgICAgICAgIC8vIHJlbW92ZSBwcm9ibGVtIG1ldGEgY2hhcmFjdGVycyByZXR1cm5zDQorICAgICAgICB0ZXh0ID0gcmVwbGFjZU1ldGFDaGFyYWN0ZXJzKHRleHQpOw0KKyAgICAgICAgDQorICAgICAgICBmYi5pbnNlcnRTdHJpbmcob2Zmc2V0LCB0ZXh0LCBhdHRycyk7DQorICAgICAgICANCisgICAgICAgIC8vIHN0YXJ0IG9uIHRoZSBzdHJpbmcgdGhhdCB3YXMgaW5zZXJ0ZWQNCisgICAgICAgIHBhcnNlRG9jdW1lbnQob2Zmc2V0LCB0ZXh0Lmxlbmd0aCgpKTsNCisgICAgfQ0KKyAgICANCisgICAgLyoqDQorICAgICAqIFBhcnNlIHRoZSBEb2N1bWVudCB0byB1cGRhdGUgdGhlIGNoYXJhY3RlciBzdHlsZXMgZ2l2ZW4gYW4gaW5pdGlhbCBzdGFydA0KKyAgICAgKiBwb3NpdGlvbi4gIENhbGxlZCBieSB0aGUgZmlsdGVyIGFmdGVyIGl0IGhhcyB1cGRhdGVkIHRoZSB0ZXh0LiANCisgICAgICoNCisgICAgICogQHBhcmFtIG9mZnNldA0KKyAgICAgKiBAcGFyYW0gbGVuZ3RoDQorICAgICAqIEB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24NCisgICAgICovDQorICAgIHByb3RlY3RlZCB2b2lkIHBhcnNlRG9jdW1lbnQoaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsNCisgICAgICAgIC8vIGludGlhbGl6ZSB0aGUgc2VnbWVudCB3aXRoIHRoZSBjb21wbGV0ZSBkb2N1bWVudCBzbyB0aGUgc2VnbWVudCBkb2Vzbid0DQorICAgICAgICAvLyBoYXZlIGFuIHVuZGVybHlpbmcgZ2FwIGluIHRoZSBidWZmZXINCisgICAgICAgIHN0eWxlZERvY3VtZW50LmdldFRleHQoMCwgc3R5bGVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCksIHNlZ21lbnQpOw0KKyAgICAgICAgDQorICAgICAgICBidWZmZXIgPSBDaGFyQnVmZmVyLndyYXAoc2VnbWVudC5hcnJheSkuYXNSZWFkT25seUJ1ZmZlcigpOw0KKyAgICAgICAgDQorICAgICAgICAvLyBpbml0aWFsaXplIHRoZSBsZXhlciBpZiBuZWNlc3NhcnkNCisgICAgICAgIGlmICghbGV4ZXIuaXNJbml0aWFsaXplZCgpKSB7DQorICAgICAgICAgICAgLy8gcHJpbWUgdGhlIHBhcnNlciBhbmQgcmVwYXJzZSB3aG9sZSBkb2N1bWVudA0KKyAgICAgICAgICAgIGxleGVyLmluaXRpYWxpemUoKTsNCisgICAgICAgICAgICBvZmZzZXQgPSAwOw0KKyAgICAgICAgICAgIGxlbmd0aCA9IHN0eWxlZERvY3VtZW50LmdldExlbmd0aCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgaW50IGVuZCA9IG9mZnNldCArIGxlbmd0aDsNCisgICAgICAgICAgICBvZmZzZXQgPSBjYWxjQmVnaW5QYXJzZShvZmZzZXQpOw0KKyAgICAgICAgICAgIGxlbmd0aCA9IGNhbGNFbmRQYXJzZShlbmQpIC0gb2Zmc2V0Ow0KKyAgICAgICAgICAgIA0KKyAgICAgICAgICAgIC8vIGNsZWFuIHRoZSB0cmVlIGJ5IGVuc3VyaW5nIG11bHRpIGxpbmUgc3R5bGVzIGFyZSByZXNldCBpbiBhcmVhDQorICAgICAgICAgICAgLy8gb2YgcGFyc2luZw0KKyAgICAgICAgICAgIFNvcnRlZFNldCBzZXQgPSBtbFRleHRSdW5TZXQuc3ViU2V0KG5ldyBJbnRlZ2VyKG9mZnNldCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIob2Zmc2V0ICsgbGVuZ3RoKSk7DQorICAgICAgICAgICAgaWYgKHNldCAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHNldC5jbGVhcigpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgLy8gcGFyc2UgdGhlIGRvY3VtZW50DQorICAgICAgICBsZXhlci5wYXJzZShidWZmZXIsIG9mZnNldCwgbGVuZ3RoKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogUmVtb3ZlIGEgc3RyaW5nIGZyb20gdGhlIGRvY3VtZW50LCBhbmQgdGhlbiBwYXJzZSBpdCBpZiB0aGUgcGFyc2VyIGhhcyBiZWVuDQorICAgICAqIHNldC4NCisgICAgICoNCisgICAgICogQHBhcmFtIGZiDQorICAgICAqIEBwYXJhbSBvZmZzZXQNCisgICAgICogQHBhcmFtIGxlbmd0aA0KKyAgICAgKiBAdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uDQorICAgICAqLyAgICANCisgICAgcHVibGljIHZvaWQgcmVtb3ZlKERvY3VtZW50RmlsdGVyLkZpbHRlckJ5cGFzcyBmYiwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkNCisgICAgICAgIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7DQorICAgICAgICAvLyBGUklDS0lOJyBIQUNLISEhISEgRm9yIHNvbWUgcmVhc29uLCBkZWxldGluZyBhIHN0cmluZyBhdCBvZmZzZXQgMA0KKyAgICAgICAgLy8gZG9lcyBub3QgZ2V0IGRvbmUgcHJvcGVybHksIHNvIGZpcnN0IHJlcGxhY2UgYW5kIHJlbW92ZSBhZnRlciBwYXJzaW5nDQorICAgICAgICBpZiAob2Zmc2V0ID09IDAgJiYgbGVuZ3RoICE9IGZiLmdldERvY3VtZW50KCkuZ2V0TGVuZ3RoKCkpIHsNCisgICAgICAgICAgICBmYi5yZXBsYWNlKDAsIGxlbmd0aCwgIlxuIiwgbGV4ZXIuZGVmYXVsdFN0eWxlKTsNCisgICAgICAgICAgICANCisgICAgICAgICAgICAvLyBzdGFydCBvbiBlaXRoZXIgc2lkZSBvZiB0aGUgcmVtb3ZlZCB0ZXh0DQorICAgICAgICAgICAgcGFyc2VEb2N1bWVudChvZmZzZXQsIDIpOw0KKyAgICAgICAgICAgIGZiLnJlbW92ZShvZmZzZXQsIDEpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgZmIucmVtb3ZlKG9mZnNldCwgbGVuZ3RoKTsNCisgICAgICAgICAgICANCisgICAgICAgICAgICAvLyBzdGFydCBvbiBlaXRoZXIgc2lkZSBvZiB0aGUgcmVtb3ZlZCB0ZXh0DQorICAgICAgICAgICAgaWYgKG9mZnNldCArIDEgPCBmYi5nZXREb2N1bWVudCgpLmdldExlbmd0aCgpKSB7DQorICAgICAgICAgICAgICAgIHBhcnNlRG9jdW1lbnQob2Zmc2V0LCAxKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZSBpZiAob2Zmc2V0IC0gMSA+IDApIHsNCisgICAgICAgICAgICAgICAgcGFyc2VEb2N1bWVudChvZmZzZXQgLSAxLCAxKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICAgIC8vIGVtcHR5IHRleHQNCisgICAgICAgICAgICAgICAgbWxUZXh0UnVuU2V0LmNsZWFyKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXBsYWNlIGEgc3RyaW5nIGluIHRoZSBkb2N1bWVudCwgYW5kIHRoZW4gcGFyc2UgaXQgaWYgdGhlIHBhcnNlciBoYXMgYmVlbg0KKyAgICAgKiBzZXQuDQorICAgICAqDQorICAgICAqIEBwYXJhbSBmYg0KKyAgICAgKiBAcGFyYW0gb2Zmc2V0DQorICAgICAqIEBwYXJhbSBsZW5ndGgNCisgICAgICogQHBhcmFtIHRleHQNCisgICAgICogQHBhcmFtIGF0dHJzDQorICAgICAqIEB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24NCisgICAgICovICAgIA0KKyAgICBwdWJsaWMgdm9pZCByZXBsYWNlKERvY3VtZW50RmlsdGVyLkZpbHRlckJ5cGFzcyBmYiwgaW50IG9mZnNldCwgDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCwgU3RyaW5nIHRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykNCisgICAgICAgIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7DQorICAgICAgICAvLyByZW1vdmUgcHJvYmxlbSBtZXRhIGNoYXJhY3RlcnMgcmV0dXJucw0KKyAgICAgICAgdGV4dCA9IHJlcGxhY2VNZXRhQ2hhcmFjdGVycyh0ZXh0KTsNCisgICAgICAgIA0KKyAgICAgICAgZmIucmVwbGFjZShvZmZzZXQsIGxlbmd0aCwgdGV4dCwgYXR0cnMpOw0KKyAgICAgICAgDQorICAgICAgICAvLyBzdGFydCBvbiB0aGUgdGV4dCB0aGF0IHdhcyByZXBsYWNlZA0KKyAgICAgICAgcGFyc2VEb2N1bWVudChvZmZzZXQsIHRleHQubGVuZ3RoKCkpOw0KKyAgICB9DQorICAgIA0KKyAgICAvLyB0YWJzIHdpdGggc3BhY2VzIChJIGhhdGUgdGFicykNCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVwbGFjZU1ldGFDaGFyYWN0ZXJzKFN0cmluZyBzdHJpbmcpIHsNCisgICAgICAgIC8vIGp1c3QgaW4gY2FzZSByZW1vdmUgY2FycmlhZ2UgcmV0dXJucw0KKyAgICAgICAgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2VBbGwoIlxcdCIsIFRBQl9SRVBMQUNFTUVOVCk7DQorICAgICAgICByZXR1cm4gc3RyaW5nOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgZmluYWwgY2xhc3MgTGV4ZXJOb2RlIHsNCisgICAgICAgIA0KKyAgICAgICAgcHJpdmF0ZSBTdHlsZSBkZWZhdWx0U3R5bGU7DQorICAgIA0KKyAgICAgICAgcHJpdmF0ZSBNYXAgc3R5bGVNYXAgPSBuZXcgTGlua2VkSGFzaE1hcCgpOw0KKyAgICAgICAgcHJpdmF0ZSBNYXAgY2hpbGRyZW4gPSBuZXcgSGFzaE1hcCgpOw0KKw0KKyAgICAgICAgcHJpdmF0ZSBNYXRjaGVyIG1hdGNoZXI7DQorICAgICAgICBwcml2YXRlIExpc3QgZ3JvdXBMaXN0ID0gbmV3IEFycmF5TGlzdCgpOw0KKyAgICAgICAgDQorICAgICAgICBwcml2YXRlIGJvb2xlYW4gaW5pdGlhbGl6ZWQ7DQorICAgICAgICANCisgICAgICAgIHByaXZhdGUgQ2hhckJ1ZmZlciBsYXN0QnVmZmVyOw0KKw0KKyAgICAgICAgLyoNCisgICAgICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgTGV4ZXJOb2RlIA0KKyAgICAgICAgICovDQorICAgICAgICBMZXhlck5vZGUoYm9vbGVhbiBpc1BhcmVudCkgew0KKyAgICAgICAgICAgIFN0eWxlQ29udGV4dCBzYyA9IFN0eWxlQ29udGV4dC5nZXREZWZhdWx0U3R5bGVDb250ZXh0KCk7DQorICAgICAgICAgICAgZGVmYXVsdFN0eWxlID0gc2MuZ2V0U3R5bGUoU3R5bGVDb250ZXh0LkRFRkFVTFRfU1RZTEUpOw0KKyAgICAgICAgfQ0KKyAgICANCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGJ1aWxkUmVnZXhwKFN0cmluZ1tdIHJlZ2V4cHMpIHsNCisgICAgICAgICAgICBTdHJpbmcgcmVnZXhwID0gIiI7DQorDQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWdleHBzLmxlbmd0aDsgaSsrKSB7DQorICAgICAgICAgICAgICAgIHJlZ2V4cCArPSAifCIgKyByZWdleHBzW2ldOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAvLyBlbnN1cmUgbGVhZGluZyAnfCcgaXMgcmVtb3ZlZA0KKyAgICAgICAgICAgIHJldHVybiByZWdleHAuc3Vic3RyaW5nKDEpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgU3R5bGUgZ2V0RGVmYXVsdFN0eWxlKCkgew0KKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0U3R5bGU7DQorICAgICAgICB9DQorDQorICAgICAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsNCisgICAgICAgICAgICBtYXRjaGVyID0gbnVsbDsNCisgICAgICAgICAgICBncm91cExpc3QuY2xlYXIoKTsNCisgICAgICAgICAgICBncm91cExpc3QuYWRkKG51bGwpOw0KKyAgICAgICAgICAgIA0KKyAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBzdHlsZU1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOw0KKyAgICAgICAgICAgIFN0cmluZyByZWdleHAgPSAiIjsNCisgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsNCisgICAgICAgICAgICAgICAgU3RyaW5nIG5leHRSZWdleHAgPSAoU3RyaW5nKWl0ZXIubmV4dCgpOw0KKyAgICAgICAgICAgICAgICByZWdleHAgKz0gInwoIiArIG5leHRSZWdleHAgKyAiKSI7DQorICAgICAgICAgICAgICAgIC8vIGhhdmUgdG8gY29tcGlsZSByZWdleHAgZmlyc3Qgc28gdGhhdCBpdCB3aWxsIG1hdGNoDQorICAgICAgICAgICAgICAgIGdyb3VwTGlzdC5hZGQoUGF0dGVybi5jb21waWxlKG5leHRSZWdleHApLnBhdHRlcm4oKSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmICghcmVnZXhwLmVxdWFscygiIikpIHsNCisgICAgICAgICAgICAgICAgbWF0Y2hlciA9IFBhdHRlcm4uY29tcGlsZShyZWdleHAuc3Vic3RyaW5nKDEpKS5tYXRjaGVyKCIiKTsNCisgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgIGl0ZXIgPSBjaGlsZHJlbi52YWx1ZXMoKS5pdGVyYXRvcigpOw0KKyAgICAgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsNCisgICAgICAgICAgICAgICAgICAgICgoTGV4ZXJOb2RlKWl0ZXIubmV4dCgpKS5pbml0aWFsaXplKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaW5pdGlhbGl6ZWQgPSB0cnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICAvKioNCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBpbml0aWFsaXNlZA0KKyAgICAgICAgICovICAgICAgICANCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzSW5pdGlhbGl6ZWQoKSB7DQorICAgICAgICAgICAgcmV0dXJuIGluaXRpYWxpemVkOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLyoqDQorICAgICAgICAgKiBAcGFyYW0gYnVmZmVyDQorICAgICAgICAgKiBAcGFyYW0gb2Zmc2V0DQorICAgICAgICAgKiBAcGFyYW0gbGVuZ3RoDQorICAgICAgICAgKiBAdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uDQorICAgICAgICAgKi8gICAgICAgIA0KKyAgICAgICAgcHVibGljIHZvaWQgcGFyc2UoQ2hhckJ1ZmZlciBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpDQorICAgICAgICAgICAgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsNCisgICAgICAgICAgICAvLyBnZXQgdGhlIGluZGV4IG9mIHdoZXJlIHdlIGNhbiBzdGFydCB0byBsb29rIGZvciBhbiBleGl0Og0KKyAgICAgICAgICAgIC8vIGkuZS4gYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgbGVuZ3RoIG9mIHRoZSBzZWdtZW50LCB3aGVuIHdlIGZpbmQgDQorICAgICAgICAgICAgLy8gdGhhdCB0ZXh0IGluIHF1ZXN0aW9uIGFscmVhZHkgaXMgc2V0IHByb3Blcmx5LCB3ZSBjYW4gc3RvcA0KKyAgICAgICAgICAgIC8vIHBhcnNpbmcNCisgICAgICAgICAgICBpbnQgY2hlY2tQb2ludCA9IG9mZnNldCArIGxlbmd0aDsNCisgICAgICAgICAgICANCisgICAgICAgICAgICAvLyByZXNldCB0aGUgbWF0Y2hlciBhbmQgc3RhcnQgcGFyc2luZyBzdHJpbmcNCisgICAgICAgICAgICBpZiAobGFzdEJ1ZmZlciAhPSBidWZmZXIpIHsNCisgICAgICAgICAgICAgICAgbWF0Y2hlci5yZXNldChidWZmZXIpOw0KKyAgICAgICAgICAgICAgICBsYXN0QnVmZmVyID0gYnVmZmVyOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICANCisgICAgICAgICAgICAvLyB0aGUgc3RhcnQgYW5kIGVuZCBpbmRpY2VzIG9mIGEgbWF0Y2ggaW4gdGhlIE1hdGNoZXIgbG9va2luZw0KKyAgICAgICAgICAgIGludCBtYXRjaEVuZCA9IG9mZnNldDsNCisgICAgICAgICAgICBTdHlsZSBzdHlsZSA9IG51bGw7DQorICAgICAgICAgICAgd2hpbGUgKG1hdGNoRW5kIDwgY2hlY2tQb2ludCAmJiBtYXRjaGVyLmZpbmQob2Zmc2V0KSkgew0KKyAgICAgICAgICAgICAgICAvLyB3aGVuIHdlIGdldCBzb21ldGhpbmcgb3RoZXIgdGhhbiAtMSwgd2Uga25vdyB3aGljaCByZWdleHANCisgICAgICAgICAgICAgICAgLy8gbWF0Y2hlZDsgdGhlIDAgZ3JvdXAgaXMgdGhlIGNvbXBsZXRlIGV4cHJlc3Npb24gb2YgdGhlIA0KKyAgICAgICAgICAgICAgICAvLyBtYXRjaGVyLCB3aGljaCB3b3VsZCBhbHdheXMgcmV0dXJuIGEgaGl0IGJhc2VkIG9uIHRoZSBhYm92ZQ0KKyAgICAgICAgICAgICAgICAvLyB3aGlsZSBjb25kaXRpb24NCisgICAgICAgICAgICAgICAgaW50IGdyb3VwTnVtID0gMDsNCisgICAgICAgICAgICAgICAgd2hpbGUgKChvZmZzZXQgPSBtYXRjaGVyLnN0YXJ0KCsrZ3JvdXBOdW0pKSA9PSAtMSl7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBtYXRjaGluZyBvZmZzZXQgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBlbmQgb2YgdGhlIA0KKyAgICAgICAgICAgICAgICAvLyBwcmV2aW91cyBtYXRjaCwgd2UgaGF2ZSBleHRyYSB0ZXh0IG5vdCBtYXRjaGVkLCBzbyBzZXQgdG8gDQorICAgICAgICAgICAgICAgIC8vIHRoZSBkZWZhdWx0IHN0eWxlIG9mIHRoaXMgbGV4ZXIgbm9kZQ0KKyAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ICE9IG1hdGNoRW5kKSB7DQorICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBvZmZzZXQgPiBjaGVja1BvaW50ID8gY2hlY2tQb2ludCA6IG9mZnNldDsgDQorICAgICAgICAgICAgICAgICAgICBzdHlsZWREb2N1bWVudC5zZXRDaGFyYWN0ZXJBdHRyaWJ1dGVzKG1hdGNoRW5kLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgLSBtYXRjaEVuZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFN0eWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPj0gY2hlY2tQb2ludCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICAvLyB0cmFjayB0aGUgZW5kIG9mIHRoZSBtYXRjaGluZyBzdHJpbmcgDQorICAgICAgICAgICAgICAgIG1hdGNoRW5kID0gbWF0Y2hlci5lbmQoZ3JvdXBOdW0pOw0KKw0KKyAgICAgICAgICAgICAgICAvLyByZXRyaWV2ZSB0aGUgcHJvcGVyIHN0eWxlIGZyb20gZ3JvdXBOdW0gb2YgdGhlIGdyb3VwTGlzdCBhbmQNCisgICAgICAgICAgICAgICAgLy8gc3R5bGVNYXAsIHRoZW4gc2V0IHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBtYXRjaGluZyBzdHJpbmcNCisgICAgICAgICAgICAgICAgc3R5bGUgPSAoU3R5bGUpc3R5bGVNYXAuZ2V0KChTdHJpbmcpZ3JvdXBMaXN0LmdldChncm91cE51bSkpOw0KKyAgICAgICAgICAgICAgICBzdHlsZWREb2N1bWVudC5zZXRDaGFyYWN0ZXJBdHRyaWJ1dGVzKG9mZnNldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaEVuZCAtIG9mZnNldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZSwgdHJ1ZSk7DQorDQorICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBtYXRjaCB3YXMgbXVsdGlsaW5lLCB3aGljaCB3ZSdsbCBrbm93IGlmIHRoZXkgc3Bhbg0KKyAgICAgICAgICAgICAgICAvLyBtdWx0aXBsZSBwYXJhZ3JhcGggZWxlbWVudHMsIHRoZSBtYXJrIGl0ICh0aGlzIGxpc3Qgd2FzIGNsZWFuZWQNCisgICAgICAgICAgICAgICAgLy8gYWJvdmUgaW4gcGFyc2VEb2N1bWVudCgpKQ0KKyAgICAgICAgICAgICAgICBpZiAoc3R5bGVkRG9jdW1lbnQuZ2V0UGFyYWdyYXBoRWxlbWVudChvZmZzZXQpLmdldFN0YXJ0T2Zmc2V0KCkgIT0NCisgICAgICAgICAgICAgICAgICAgIHN0eWxlZERvY3VtZW50LmdldFBhcmFncmFwaEVsZW1lbnQobWF0Y2hFbmQpLmdldFN0YXJ0T2Zmc2V0KCkpIHsNCisgICAgICAgICAgICAgICAgICAgIC8vIG1hcmsgYSBtbCBydW4NCisgICAgICAgICAgICAgICAgICAgIE11bHRpTGluZVJ1biBtbHIgPSBuZXcgTXVsdGlMaW5lUnVuKG9mZnNldCwgbWF0Y2hFbmQpOw0KKyAgICAgICAgICAgICAgICAgICAgbWxUZXh0UnVuU2V0LmFkZChtbHIpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgICAvLyBwYXJzZSB0aGUgY2hpbGQgcmVnZXhwcywgaWYgYW55LCB3aXRoaW4gYSBtYXRjaGVkIGJsb2NrDQorICAgICAgICAgICAgICAgIExleGVyTm9kZSBub2RlID0gKExleGVyTm9kZSljaGlsZHJlbi5nZXQoZ3JvdXBMaXN0LmdldChncm91cE51bSkpOw0KKyAgICAgICAgICAgICAgICBpZiAobm9kZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgICBub2RlLnBhcnNlKGJ1ZmZlciwgb2Zmc2V0LCBtYXRjaEVuZCAtIG9mZnNldCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgb2Zmc2V0IHRvIHN0YXJ0IHdoZXJlIHdlIGxlZnQgb2ZmDQorICAgICAgICAgICAgICAgIG9mZnNldCA9IG1hdGNoRW5kOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAobWF0Y2hFbmQgPCBjaGVja1BvaW50KSB7DQorICAgICAgICAgICAgICAgIC8vIGlmIHdlIGZpbmlzaGVkIGJlZm9yZSBoaXR0aW5nIHRoZSBlbmQgb2YgdGhlIGNoZWNrcG9pbnQgZnJvbQ0KKyAgICAgICAgICAgICAgICAvLyBubyBtcm9lIG1hdGNoZXMsIHRoZW4gc2V0IGVuc3VyZSB0aGUgdGV4dCBpcyByZXNldCB0byB0aGUNCisgICAgICAgICAgICAgICAgLy8gZGVmYXVsdFN0eWxlDQorICAgICAgICAgICAgICAgIHN0eWxlZERvY3VtZW50LnNldENoYXJhY3RlckF0dHJpYnV0ZXMobWF0Y2hFbmQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tQb2ludCAtIG1hdGNoRW5kLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRTdHlsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICAvKioNCisgICAgICAgICAqDQorICAgICAgICAgKiBAcGFyYW0gcmVnZXhwDQorICAgICAgICAgKiBAcGFyYW0gbm9kZQ0KKyAgICAgICAgICovICAgICAgICANCisgICAgICAgIHB1YmxpYyB2b2lkIHB1dENoaWxkKFN0cmluZyByZWdleHAsIExleGVyTm9kZSBub2RlKSB7DQorICAgICAgICAgICAgbm9kZS5kZWZhdWx0U3R5bGUgPSAoU3R5bGUpc3R5bGVNYXAuZ2V0KHJlZ2V4cCk7DQorICAgICAgICAgICAgDQorICAgICAgICAgICAgLy8gaGF2ZSB0byBjb21waWxlIHJlZ2V4cCBmaXJzdCBzbyB0aGF0IGl0IHdpbGwgbWF0Y2gNCisgICAgICAgICAgICBjaGlsZHJlbi5wdXQoUGF0dGVybi5jb21waWxlKHJlZ2V4cCkucGF0dGVybigpLCBub2RlKTsNCisgICAgICAgICAgICBpbml0aWFsaXplZCA9IGZhbHNlOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLyoqDQorICAgICAgICAgKiBAcGFyYW0gcmVnZXhwcw0KKyAgICAgICAgICogQHBhcmFtIG5vZGUNCisgICAgICAgICAqLyAgICAgICAgDQorICAgICAgICBwdWJsaWMgdm9pZCBwdXRDaGlsZChTdHJpbmdbXSByZWdleHBzLCBMZXhlck5vZGUgbm9kZSkgew0KKyAgICAgICAgICAgIHB1dENoaWxkKGJ1aWxkUmVnZXhwKHJlZ2V4cHMpLCBub2RlKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8qKg0KKyAgICAgICAgICogQHBhcmFtIHJlZ2V4cA0KKyAgICAgICAgICogQHBhcmFtIHN0eWxlDQorICAgICAgICAgKi8gICAgICAgIA0KKyAgICAgICAgcHVibGljIHZvaWQgcHV0U3R5bGUoU3RyaW5nIHJlZ2V4cCwgU3R5bGUgc3R5bGUpIHsNCisgICAgICAgICAgICBjaGVja1JlZ2V4cChyZWdleHApOw0KKyAgICAgICAgICAgIHN0eWxlTWFwLnB1dChyZWdleHAsIHN0eWxlKTsNCisgICAgICAgICAgICBpbml0aWFsaXplZCA9IGZhbHNlOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLyoqDQorICAgICAgICAgKiBAcGFyYW0gcmVnZXhwcw0KKyAgICAgICAgICogQHBhcmFtIHN0eWxlDQorICAgICAgICAgKi8gICAgICAgIA0KKyAgICAgICAgcHVibGljIHZvaWQgcHV0U3R5bGUoU3RyaW5nIHJlZ2V4cHNbXSwgU3R5bGUgc3R5bGUpIHsNCisgICAgICAgICAgICBwdXRTdHlsZShidWlsZFJlZ2V4cChyZWdleHBzKSwgc3R5bGUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLyoqDQorICAgICAgICAgKiBAcGFyYW0gcmVnZXhwDQorICAgICAgICAgKi8gICAgICAgIA0KKyAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlQ2hpbGQoU3RyaW5nIHJlZ2V4cCkgew0KKyAgICAgICAgICAgIGNoaWxkcmVuLnJlbW92ZShyZWdleHApOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLyoqDQorICAgICAgICAgKiBAcGFyYW0gcmVnZXhwDQorICAgICAgICAgKi8gICAgICAgIA0KKyAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlU3R5bGUoU3RyaW5nIHJlZ2V4cCkgew0KKyAgICAgICAgICAgIHN0eWxlTWFwLnJlbW92ZShyZWdleHApOw0KKyAgICAgICAgICAgIGNoaWxkcmVuLnJlbW92ZShyZWdleHApOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLyoqDQorICAgICAgICAgKiBAcGFyYW0gcmVnZXhwcw0KKyAgICAgICAgICovICAgICAgICANCisgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZVN0eWxlKFN0cmluZyByZWdleHBzW10pIHsNCisgICAgICAgICAgICByZW1vdmVTdHlsZShidWlsZFJlZ2V4cChyZWdleHBzKSk7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRTdHlsZShTdHlsZSBzdHlsZSkgew0KKyAgICAgICAgICAgIGRlZmF1bHRTdHlsZSA9IHN0eWxlOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgY2xhc3MgTXVsdGlMaW5lUnVuIHsNCisgICAgICAgIA0KKyAgICAgICAgcHJpdmF0ZSBQb3NpdGlvbiBzdGFydDsNCisgICAgICAgIHByaXZhdGUgUG9zaXRpb24gZW5kOw0KKyAgICAgICAgcHJpdmF0ZSBpbnQgZGVsaW1ldGVyU2l6ZTsNCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIE11bHRpTGluZVJ1bihpbnQgc3RhcnQsIGludCBlbmQpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7DQorICAgICAgICAgICAgdGhpcyhzdGFydCwgZW5kLCAyKTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIE11bHRpTGluZVJ1bihpbnQgc3RhcnQsIGludCBlbmQsIGludCBkZWxpbWV0ZXJTaXplKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gew0KKyAgICAgICAgICAgIGlmIChzdGFydCA+IGVuZCkgew0KKyAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIlN0YXJ0IG9mZnNldCBpcyBhZnRlciBlbmQ6ICI7DQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBCYWRMb2NhdGlvbkV4Y2VwdGlvbihtc2csIHN0YXJ0KTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKGRlbGltZXRlclNpemUgPCAxKSB7DQorICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRGVsaW1pdGVycyBiZSBhdCBsZWFzdCBzaXplIDE6ICIgKyANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxpbWV0ZXJTaXplOw0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKG1zZyk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHRoaXMuc3RhcnQgPSBzdHlsZWREb2N1bWVudC5jcmVhdGVQb3NpdGlvbihzdGFydCk7DQorICAgICAgICAgICAgdGhpcy5lbmQgPSBzdHlsZWREb2N1bWVudC5jcmVhdGVQb3NpdGlvbihlbmQpOw0KKyAgICAgICAgICAgIHRoaXMuZGVsaW1ldGVyU2l6ZSA9IGRlbGltZXRlclNpemU7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0RGVsaW1ldGVyU2l6ZSgpIHsNCisgICAgICAgICAgICByZXR1cm4gZGVsaW1ldGVyU2l6ZTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIGludCBlbmQoKSB7DQorICAgICAgICAgICAgcmV0dXJuIGVuZC5nZXRPZmZzZXQoKTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIGludCBsZW5ndGgoKSB7DQorICAgICAgICAgICAgcmV0dXJuIGVuZC5nZXRPZmZzZXQoKSAtIHN0YXJ0LmdldE9mZnNldCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwdWJsaWMgaW50IHN0YXJ0KCkgew0KKyAgICAgICAgICAgIHJldHVybiBzdGFydC5nZXRPZmZzZXQoKTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCisgICAgICAgICAgICByZXR1cm4gc3RhcnQudG9TdHJpbmcoKSArICIgIiArIGVuZC50b1N0cmluZygpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgIH0NCisNCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTUxDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7DQorICAgICAgICANCisgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3Qgb2JqLCBPYmplY3Qgb2JqMSkgew0KKyAgICAgICAgICAgIHJldHVybiB2YWx1ZU9mKG9iaikgLSB2YWx1ZU9mKG9iajEpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcml2YXRlIGludCB2YWx1ZU9mKE9iamVjdCBvYmopIHsNCisgICAgICAgICAgICByZXR1cm4gb2JqIGluc3RhbmNlb2YgSW50ZWdlciA/IA0KKyAgICAgICAgICAgICAgICAgICAgKChJbnRlZ2VyKW9iaikuaW50VmFsdWUoKSA6IA0KKyAgICAgICAgICAgICAgICAgICAgKG9iaiBpbnN0YW5jZW9mIE11bHRpTGluZVJ1bikgPw0KKyAgICAgICAgICAgICAgICAgICAgICAgICgoTXVsdGlMaW5lUnVuKW9iaikuc3RhcnQoKSA6DQorICAgICAgICAgICAgICAgICAgICAgICAgKChQb3NpdGlvbilvYmopLmdldE9mZnNldCgpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdWkvdGV4dC9TdHJ1Y3R1cmVkU3ludGF4SGFuZGxlci5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS90ZXh0L1N0cnVjdHVyZWRTeW50YXhIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYzY2U4ZAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdWkvdGV4dC9TdHJ1Y3R1cmVkU3ludGF4SGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsMTQxIEBACisvKg0KKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLg0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KK3BhY2thZ2UgZ3Jvb3Z5LnVpLnRleHQ7DQorDQoraW1wb3J0IGphdmEuYXd0LkZvbnQ7DQorDQoraW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7DQoraW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247DQorDQoraW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7DQorDQorLyoqDQorICoNCisgKiBAYXV0aG9yIEV2YW4gIkhpcHB5IiBTbGF0aXMNCisgKi8NCitwdWJsaWMgY2xhc3MgU3RydWN0dXJlZFN5bnRheEhhbmRsZXIgZXh0ZW5kcyBEZWZhdWx0SGFuZGxlciB7DQorICAgIA0KKyAgICAvL1N0eWxlQ29uc3RhbnRzLg0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUdFWFAgPSAicmVnZXhwIjsNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RZTEUgPSAic3R5bGUiOw0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxJR05fQ0VOVEVSID0gIkFMSUdOX0NFTlRFUiI7DQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMSUdOX0pVU1RJRklFRCA9ICJBTElHTl9KVVNUSUZJRUQiOw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTElHTl9MRUZUID0gIkFMSUdOX0xFRlQiOw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTElHTl9SSUdIVCA9ICJBTElHTl9SSUdIVCI7DQorDQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMSUdOTUVOVCA9ICJhbGlnbm1lbnQiOw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQUNLR1JPVU5EID0gImJhY2tncm91bmQiOw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCSURJX0xFVkVMID0gImJpZGlMZXZlbCI7DQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJPTEQgPSAiYm9sZCI7DQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBPTkVOVF9BVFRSSUJVVEUgPSAiY29tcG9uZW50QXR0cmlidXRlIjsNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUE9ORU5UX0VMRU1FTlRfTkFNRSA9ICJjb21wb25lbnRFbGVtZW50TmFtZSI7DQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBPU0VEX1RFWFRfQVRUUklCVVRFID0gImNvbXBvc2VkVGV4dEF0dHJpYnV0ZSI7DQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJUlNUX0xJTkVfSU5ERU5UID0gImZpcnN0TGluZUluZGVudCI7DQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPTlRfRkFNSUxZID0gImZvbnRGYW1pbHkiOw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT05UX1NJWkUgPSAiZm9udFNpemUiOw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JFR1JPVU5EID0gImZvcmVncm91bmQiOw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX0FUVFJJQlVURSA9ICJpY29uQXR0cmlidXRlIjsNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9FTEVNRU5UX05BTUUgPSAiaWNvbkVsZW1lbnROYW1lIjsNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVRBTElDID0gIml0YWxpYyI7DQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExFRlRfSU5ERU5UID0gImxlZnRJbmRlbnQiOw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX1NQQUNJTkcgPSAibGluZVNwYWNpbmciOw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RFTF9BVFRSSUJVVEUgPSAibW9kZWxBdHRyaWJ1dGUiOw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0FUVFJJQlVURSA9ICJuYW1lQXR0cmlidXRlIjsNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JJRU5UQVRJT04gPSAib3JpZW50YXRpb24iOw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPTFZFX0FUVFJJQlVURSA9ICJyZXNvbHZlQXR0cmlidXRlIjsNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUklHSFRfSU5ERU5UID0gInJpZ2h0SW5kZW50IjsNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1BBQ0VfQUJPVkUgPSAic3BhY2VBYm92ZSI7DQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNQQUNFX0JFTE9XID0gInNwYWNlQmVsb3ciOw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJS0VfVEhST1VHSCA9ICJzdHJpa2VUaHJvdWdoIjsNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VCU0NSSVBUID0gInN1YnNjcmlwdCI7DQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVUEVSU0NSSVBUID0gInN1cGVyc2NyaXB0IjsNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCX1NFVCA9ICJ0YWJTZXQiOw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTkRFUkxJTkUgPSAidW5kZXJsaW5lIjsNCisgICAgDQorICAgIHByaXZhdGUgU3RydWN0dXJlZFN5bnRheERvY3VtZW50RmlsdGVyLkxleGVyTm9kZSBjdXJyZW50Tm9kZTsNCisgICAgcHJpdmF0ZSBTdHJ1Y3R1cmVkU3ludGF4RG9jdW1lbnRGaWx0ZXIuTGV4ZXJOb2RlIHBhcmVudE5vZGU7DQorICAgIA0KKyAgICBwcml2YXRlIGZpbmFsIFN0cnVjdHVyZWRTeW50YXhEb2N1bWVudEZpbHRlciBmaWx0ZXI7DQorICAgIA0KKyAgICBwcml2YXRlIEZvbnQgZm9udDsNCisNCisgICAgLyoqDQorICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgTWFzdGVyRnJhbWVIYW5kbGVyDQorICAgICAqIEBwYXJhbSBmaWx0ZXINCisgICAgICovDQorICAgIHB1YmxpYyBTdHJ1Y3R1cmVkU3ludGF4SGFuZGxlcihTdHJ1Y3R1cmVkU3ludGF4RG9jdW1lbnRGaWx0ZXIgZmlsdGVyKSB7DQorICAgICAgICB0aGlzLmZpbHRlciA9IGZpbHRlcjsNCisgICAgfQ0KKyAgICANCisgICAgLyoqDQorICAgICAqIEBwYXJhbSBjaA0KKyAgICAgKiBAcGFyYW0gc3RhcnQNCisgICAgICogQHBhcmFtIGxlbmd0aA0KKyAgICAgKi8gICAgDQorICAgIHB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoY2hhcltdIGNoLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsNCisgICAgfQ0KKyAgICANCisgICAgLyoqDQorICAgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uDQorICAgICAqLyAgICANCisgICAgcHVibGljIHZvaWQgZW5kRG9jdW1lbnQoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsNCisgICAgICAgIHN1cGVyLmVuZERvY3VtZW50KCk7DQorICAgIH0NCisgICAgDQorICAgIC8qKg0KKyAgICAgKiBAcGFyYW0gdXJpDQorICAgICAqIEBwYXJhbSBsb2NhbE5hbWUNCisgICAgICogQHBhcmFtIHFOYW1lDQorICAgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uDQorICAgICAqLyAgICANCisgICAgcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgdXJpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhbE5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHFOYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsNCisgICAgfQ0KKyAgICANCisgICAgLyoqDQorICAgICAqIEBwYXJhbSBlDQorICAgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uDQorICAgICAqLyAgICANCisgICAgcHVibGljIHZvaWQJZXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7DQorICAgICAgICB0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKCJMaW5lOiAiICsgZS5nZXRMaW5lTnVtYmVyKCkgKyAiIG1lc3NhZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSk7DQorICAgIH0NCisgICAgDQorICAgIC8qKg0KKyAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbg0KKyAgICAgKi8gICAgDQorICAgIHB1YmxpYyB2b2lkIHN0YXJ0RG9jdW1lbnQoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsNCisgICAgICAgIHN1cGVyLnN0YXJ0RG9jdW1lbnQoKTsNCisgICAgICAgIGN1cnJlbnROb2RlID0gZmlsdGVyLmdldFJvb3ROb2RlKCk7DQorICAgIH0NCisgICAgDQorICAgIC8qKg0KKyAgICAgKiBAcGFyYW0gdXJpDQorICAgICAqIEBwYXJhbSBsb2NhbE5hbWUNCisgICAgICogQHBhcmFtIHFOYW1lDQorICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzDQorICAgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uDQorICAgICAqLyAgICANCisgICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWxOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHFOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsNCisgICAgICAgIHN1cGVyLnN0YXJ0RWxlbWVudCh1cmksIGxvY2FsTmFtZSwgcU5hbWUsIGF0dHJpYnV0ZXMpOw0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdWkvdGV4dC9TdHJ1Y3R1cmVkU3ludGF4UmVzb3VyY2VzLmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3VpL3RleHQvU3RydWN0dXJlZFN5bnRheFJlc291cmNlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNThlYTUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3VpL3RleHQvU3RydWN0dXJlZFN5bnRheFJlc291cmNlcy5qYXZhCkBAIC0wLDAgKzEsODIgQEAKKy8qDQorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorcGFja2FnZSBncm9vdnkudWkudGV4dDsNCisNCitpbXBvcnQgamF2YS5hd3QuRm9udDsNCitpbXBvcnQgamF2YS5hd3QuVG9vbGtpdDsNCisNCitpbXBvcnQgamF2YS5hd3QuZGF0YXRyYW5zZmVyLkNsaXBib2FyZDsNCisNCisvKioNCisgKiBDb250YWlucyBhbGwgdGhlIGJhc2ljIHJlc291cmNlcyBhbmQgdmFsdWVzIHVzZWQgYnkgdGhlIHV0aWxpdHkgZnJhbWUgd29yaw0KKyAqIGZyYW1ld29yay4NCisgKg0KKyAqIEBhdXRob3IgRXZhbiAiSGlwcHkiIFNsYXRpcw0KKyAqLw0KK3B1YmxpYyBmaW5hbCBjbGFzcyBTdHJ1Y3R1cmVkU3ludGF4UmVzb3VyY2VzIHsNCisNCisgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisgICAgLy8gQ2xpcEJvYXJkDQorICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENsaXBib2FyZCBTWVNURU1fQ0xJUEJPQVJEOw0KKyAgICBzdGF0aWMgew0KKyAgICAgICAgQ2xpcGJvYXJkIHN5c3RlbUNsaXBib2FyZCA9IG51bGw7DQorICAgICAgICB0cnkgew0KKyAgICAgICAgICAgIC8vIGlmIHdlIGRvbid0IGhhdmUgYWNjZXNzIHRvIHRoZSBzeXN0ZW0gY2xpcGJvYXJkLCB3aWxsIHRocm93DQorICAgICAgICAgICAgLy8gYSBzZWN1cml0eSBleGNlcHRpb24NCisgICAgICAgICAgICBTZWN1cml0eU1hbmFnZXIgbWdyID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOw0KKyAgICAgICAgICAgIGlmIChtZ3IgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICBtZ3IuY2hlY2tTeXN0ZW1DbGlwYm9hcmRBY2Nlc3MoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgc3lzdGVtQ2xpcGJvYXJkID0gVG9vbGtpdC5nZXREZWZhdWx0VG9vbGtpdCgpLmdldFN5c3RlbUNsaXBib2FyZCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsNCisgICAgICAgICAgICAvLyBtZWFucyB3ZSBjYW4ndCBnZXQgdG8gc3lzdGVtIGNsaXBiYXJkLCBzbyBjcmVhdGUgYXBwIGxldmVsIG9uZQ0KKyAgICAgICAgICAgIHN5c3RlbUNsaXBib2FyZCA9IG5ldyBDbGlwYm9hcmQoIlVJUmVzb3VyY2VNZ3IiKTsNCisgICAgICAgIH0NCisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgew0KKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7ICAgICAgICAgICAgICAgDQorICAgICAgICB9DQorICAgICAgICBTWVNURU1fQ0xJUEJPQVJEID0gc3lzdGVtQ2xpcGJvYXJkOw0KKyAgICB9DQorDQorICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorICAgIC8vIFNUQU5EQVJEIEZPTlRTDQorICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorDQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRm9udCBMQVJHRV9GT05UID0gRm9udC5kZWNvZGUoIkFyaWFsLTI0Iik7DQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRm9udCBNRURJVU1fRk9OVCA9IEZvbnQuZGVjb2RlKCJBcmlhbC0xOCIpOw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEZvbnQgU01BTExfRk9OVCA9IEZvbnQuZGVjb2RlKCJBcmlhbC0xMiIpOw0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBGb250IEVESVRPUl9GT05UID0gRm9udC5kZWNvZGUoIk1vbm9zcGFjZWQtMTIiKTsNCisNCisgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisgICAgLy8gVU5ETy9SRURPIE5BTUVTDQorICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorDQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVORE8gPSAiVW5kbyI7DQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRE8gPSAiUmVkbyI7DQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU5UID0gIlByaW50IjsNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklORCA9ICJGaW5kIjsNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklORF9ORVhUID0gIkZpbmQgTmV4dCI7DQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUExBQ0UgPSAiUmVwbGFjZSI7DQorICAgICAgICANCisgICAgLy8gc2luZ2xldG9uDQorICAgIHByaXZhdGUgU3RydWN0dXJlZFN5bnRheFJlc291cmNlcygpIHsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3VpL3RleHQvVGV4dEVkaXRvci5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS90ZXh0L1RleHRFZGl0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzllODU2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS90ZXh0L1RleHRFZGl0b3IuamF2YQpAQCAtMCwwICsxLDU0NiBAQAorLyoNCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4NCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCitwYWNrYWdlIGdyb292eS51aS50ZXh0Ow0KKw0KK2ltcG9ydCBqYXZhLmF3dC5Db2xvcjsNCitpbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50Ow0KK2ltcG9ydCBqYXZhLmF3dC5DdXJzb3I7DQoraW1wb3J0IGphdmEuYXd0LkRpbWVuc2lvbjsNCitpbXBvcnQgamF2YS5hd3QuRm9udDsNCitpbXBvcnQgamF2YS5hd3QuRm9udE1ldHJpY3M7DQoraW1wb3J0IGphdmEuYXd0LkdyYXBoaWNzOw0KK2ltcG9ydCBqYXZhLmF3dC5HcmFwaGljczJEOw0KK2ltcG9ydCBqYXZhLmF3dC5SZWN0YW5nbGU7DQoraW1wb3J0IGphdmEuYXd0LlRvb2xraXQ7DQorDQoraW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50Ow0KK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5LZXlFdmVudDsNCitpbXBvcnQgamF2YS5hd3QuZXZlbnQuTW91c2VBZGFwdGVyOw0KK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5Nb3VzZUV2ZW50Ow0KKw0KK2ltcG9ydCBqYXZhLmF3dC5wcmludC5QYWdlYWJsZTsNCitpbXBvcnQgamF2YS5hd3QucHJpbnQuUGFnZUZvcm1hdDsNCitpbXBvcnQgamF2YS5hd3QucHJpbnQuUGFwZXI7DQoraW1wb3J0IGphdmEuYXd0LnByaW50LlByaW50YWJsZTsNCitpbXBvcnQgamF2YS5hd3QucHJpbnQuUHJpbnRlckV4Y2VwdGlvbjsNCitpbXBvcnQgamF2YS5hd3QucHJpbnQuUHJpbnRlckpvYjsNCisNCitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsNCisNCitpbXBvcnQgamF2YXguc3dpbmcuQWN0aW9uOw0KK2ltcG9ydCBqYXZheC5zd2luZy5BYnN0cmFjdEFjdGlvbjsNCitpbXBvcnQgamF2YXguc3dpbmcuQWN0aW9uTWFwOw0KK2ltcG9ydCBqYXZheC5zd2luZy5JbnB1dE1hcDsNCitpbXBvcnQgamF2YXguc3dpbmcuSlRleHRQYW5lOw0KK2ltcG9ydCBqYXZheC5zd2luZy5LZXlTdHJva2U7DQoraW1wb3J0IGphdmF4LnN3aW5nLlN3aW5nVXRpbGl0aWVzOw0KKw0KK2ltcG9ydCBqYXZheC5zd2luZy5wbGFmLkNvbXBvbmVudFVJOw0KKw0KK2ltcG9ydCBqYXZheC5zd2luZy50ZXh0LkNhcmV0Ow0KK2ltcG9ydCBqYXZheC5zd2luZy50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOw0KK2ltcG9ydCBqYXZheC5zd2luZy50ZXh0LkRlZmF1bHRDYXJldDsNCitpbXBvcnQgamF2YXguc3dpbmcudGV4dC5EZWZhdWx0RWRpdG9yS2l0Ow0KK2ltcG9ydCBqYXZheC5zd2luZy50ZXh0LkRvY3VtZW50Ow0KK2ltcG9ydCBqYXZheC5zd2luZy50ZXh0LkVsZW1lbnQ7DQoraW1wb3J0IGphdmF4LnN3aW5nLnRleHQuSlRleHRDb21wb25lbnQ7DQoraW1wb3J0IGphdmF4LnN3aW5nLnRleHQuU3R5bGVkRG9jdW1lbnQ7DQoraW1wb3J0IGphdmF4LnN3aW5nLnRleHQuVXRpbGl0aWVzOw0KKw0KKy8qKg0KKyAqIEEgc2ltcGxlIHRleHQgcGFuZSB0aGF0IGlzIHByaW50YWJsZSBhbmQgd3JhcHBpbmcgaXMgb3B0aW9uYWwuDQorICoNCisgKiBAYXV0aG9yIEV2YW4gIkhpcHB5IiBTbGF0aXMNCisgKi8NCitwdWJsaWMgY2xhc3MgVGV4dEVkaXRvciBleHRlbmRzIEpUZXh0UGFuZSBpbXBsZW1lbnRzIFBhZ2VhYmxlLCBQcmludGFibGUgew0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklORCA9ICJGaW5kLi4uIjsNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklORF9ORVhUID0gIkZpbmQgTmV4dCI7DQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTkRfUFJFVklPVVMgPSAiRmluZCBQcmV2aW91cyI7DQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUExBQ0UgPSAiUmVwbGFjZS4uLiI7DQorICAgIA0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCQkVEX1NQQUNFUyA9ICIgICAgIjsNCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBUQUJfQkFDS19QQVRURVJOID0gDQorICAgICAgICBQYXR0ZXJuLmNvbXBpbGUoIl4oKFtcdF0pfCggICAgKXwoICAgKXwoICApfCggKSkiLCBQYXR0ZXJuLk1VTFRJTElORSk7DQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gTElORV9TVEFSVCA9IA0KKyAgICAgICAgUGF0dGVybi5jb21waWxlKCJeIiwgUGF0dGVybi5NVUxUSUxJTkUpOw0KKyAgICANCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSlRleHRQYW5lIFBSSU5UX1BBTkUgPSBuZXcgSlRleHRQYW5lKCk7DQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIERpbWVuc2lvbiBQUklOVF9TSVpFID0gbmV3IERpbWVuc2lvbigpOw0KKyAgICANCisgICAgcHJpdmF0ZSBzdGF0aWMgVG9vbGtpdCB0b29sa2l0ID0gVG9vbGtpdC5nZXREZWZhdWx0VG9vbGtpdCgpOw0KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzT3ZlcnR5cGVNb2RlOw0KKw0KKyAgICBwcml2YXRlIENhcmV0IGRlZmF1bHRDYXJldDsNCisgICAgcHJpdmF0ZSBDYXJldCBvdmVydHlwZUNhcmV0Ow0KKyAgICANCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGFnZUZvcm1hdCBQQUdFX0ZPUk1BVDsNCisgICAgc3RhdGljIHsNCisgICAgICAgIFByaW50ZXJKb2Igam9iID0gUHJpbnRlckpvYi5nZXRQcmludGVySm9iKCk7DQorICAgICAgICBQQUdFX0ZPUk1BVCA9IGpvYi5kZWZhdWx0UGFnZSgpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBudW1QYWdlczsNCisgICAgICAgIA0KKyAgICBwcml2YXRlIGludCBsYXN0VXBkYXRlOw0KKyAgICANCisgICAgcHJpdmF0ZSBNb3VzZUFkYXB0ZXIgbW91c2VBZGFwdGVyID0NCisgICAgICAgIG5ldyBNb3VzZUFkYXB0ZXIoKSB7DQorICAgICAgICAgICAgQ3Vyc29yIGN1cnNvcjsNCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZUVudGVyZWQoTW91c2VFdmVudCBtZSkgew0KKyAgICAgICAgICAgICAgICBpZiAoY29udGFpbnMobWUuZ2V0UG9pbnQoKSkpIHsNCisgICAgICAgICAgICAgICAgICAgIGN1cnNvciA9IGdldEN1cnNvcigpOw0KKyAgICAgICAgICAgICAgICAgICAgQ3Vyc29yIGN1cnMgPQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIEN1cnNvci5nZXRQcmVkZWZpbmVkQ3Vyc29yKEN1cnNvci5URVhUX0NVUlNPUik7DQorICAgICAgICAgICAgICAgICAgICBnZXRSb290UGFuZSgpLmdldExheWVyZWRQYW5lKCkuc2V0Q3Vyc29yKGN1cnMpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgZ2V0Um9vdFBhbmUoKS5nZXRMYXllcmVkUGFuZSgpLnNldEN1cnNvcihjdXJzb3IpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRXhpdGVkKE1vdXNlRXZlbnQgbWUpIHsNCisgICAgICAgICAgICAgICAgZ2V0Um9vdFBhbmUoKS5nZXRMYXllcmVkUGFuZSgpLnNldEN1cnNvcihudWxsKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9Ow0KKyAgICAgICAgDQorICAgIC8vIHVud3JhcHBlZCBwcm9wZXJ0eQ0KKyAgICBwcml2YXRlIGJvb2xlYW4gdW53cmFwcGVkOw0KKyAgICANCisgICAgLy8gdGFic0FzU3BhY2VzIHByb3BlcnR5DQorICAgIHByaXZhdGUgYm9vbGVhbiB0YWJzQXNTcGFjZXM7DQorICAgIA0KKyAgICAvLyBtdWx0aUxpbmVUYWIgcHJvcGVydHkNCisgICAgcHJpdmF0ZSBib29sZWFuIG11bHRpTGluZVRhYjsNCisgICAgDQorICAgIC8vIHNlYXJjaGFibGUgcHJvcGVydHkNCisgICAgcHJpdmF0ZSBib29sZWFuIHNlYXJjaGFibGUgPSB0cnVlOw0KKyAgICANCisgICAgLyoqDQorICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgVGV4dEVkaXRvcg0KKyAgICAgKi8NCisgICAgcHVibGljIFRleHRFZGl0b3IoKSB7DQorICAgICAgICB0aGlzKGZhbHNlKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBUZXh0RWRpdG9yDQorICAgICAqLw0KKyAgICBwdWJsaWMgVGV4dEVkaXRvcihib29sZWFuIHRhYnNBc1NwYWNlcykgew0KKyAgICAgICAgdGhpcyh0YWJzQXNTcGFjZXMsIGZhbHNlKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBUZXh0RWRpdG9yDQorICAgICAqLw0KKyAgICBwdWJsaWMgVGV4dEVkaXRvcihib29sZWFuIHRhYnNBc1NwYWNlcywgYm9vbGVhbiBtdWx0aUxpbmVUYWIpIHsNCisgICAgICAgIHRoaXMobXVsdGlMaW5lVGFiLCB0YWJzQXNTcGFjZXMsIGZhbHNlKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBUZXh0RWRpdG9yDQorICAgICAqLw0KKyAgICBwdWJsaWMgVGV4dEVkaXRvcihib29sZWFuIHRhYnNBc1NwYWNlcywgYm9vbGVhbiBtdWx0aUxpbmVUYWIsIGJvb2xlYW4gdW53cmFwcGVkKSB7DQorICAgICAgICB0aGlzLnRhYnNBc1NwYWNlcyA9IHRhYnNBc1NwYWNlczsNCisgICAgICAgIHRoaXMubXVsdGlMaW5lVGFiID0gbXVsdGlMaW5lVGFiOw0KKyAgICAgICAgdGhpcy51bndyYXBwZWQgPSB1bndyYXBwZWQ7DQorICAgICAgICANCisgICAgICAgIC8vIHJlbW92ZSBhbmQgcmVwbGFjZSB0aGUgZGVsZXRlIGFjdGlvbiB0byBhbm90aGVyIHNwb3Qgc28gY3RybCBIIGxhdGVyDQorICAgICAgICAvLyBvbiBpcyBzdHJpY3RseSBmb3Igc2hvd2luZyB0aGUgZmFuZCAmIHJlcGxhY2UgZGlhbG9nDQorICAgICAgICBBY3Rpb25NYXAgYU1hcCA9IGdldEFjdGlvbk1hcCgpOw0KKyAgICAgICAgQWN0aW9uIGFjdGlvbiA9IG51bGw7DQorICAgICAgICBkbyB7DQorICAgICAgICAgICAgYWN0aW9uID0gYWN0aW9uID09IG51bGwgPyANCisgICAgICAgICAgICAgICAgYU1hcC5nZXQoRGVmYXVsdEVkaXRvcktpdC5kZWxldGVQcmV2Q2hhckFjdGlvbikgOiBudWxsOw0KKyAgICAgICAgICAgIGFNYXAucmVtb3ZlKERlZmF1bHRFZGl0b3JLaXQuZGVsZXRlUHJldkNoYXJBY3Rpb24pOw0KKyAgICAgICAgICAgIGFNYXAgPSBhTWFwLmdldFBhcmVudCgpOw0KKyAgICAgICAgfSB3aGlsZSAoYU1hcCAhPSBudWxsKTsNCisgICAgICAgIGFNYXAgPSBnZXRBY3Rpb25NYXAoKTsNCisgICAgICAgIEtleVN0cm9rZSBrZXlTdHJva2UgPQ0KKyAgICAgICAgICAgIEtleVN0cm9rZS5nZXRLZXlTdHJva2UoS2V5RXZlbnQuVktfQkFDS19TUEFDRSwgMCwgZmFsc2UpOw0KKyAgICAgICAgSW5wdXRNYXAgaU1hcCA9IGdldElucHV0TWFwKCk7DQorICAgICAgICBpTWFwLnB1dChrZXlTdHJva2UsICJkZWxldGUiKTsNCisgICAgICAgIGFNYXAucHV0KCJkZWxldGUiLCBhY3Rpb24pOw0KKyAgICANCisgICAgICAgIC8vIHNldCBhbGwgdGhlIGFjdGlvbnMNCisgICAgICAgIGFjdGlvbiA9IG5ldyBGaW5kQWN0aW9uKCk7DQorICAgICAgICBhTWFwLnB1dChGSU5ELCBhY3Rpb24pOw0KKyAgICAgICAga2V5U3Ryb2tlID0gDQorICAgICAgICAgICAgS2V5U3Ryb2tlLmdldEtleVN0cm9rZShLZXlFdmVudC5WS19GLCBLZXlFdmVudC5DVFJMX01BU0ssIGZhbHNlKTsNCisgICAgICAgIGlNYXAucHV0KGtleVN0cm9rZSwgRklORCk7DQorICAgIA0KKyAgICAgICAgYU1hcC5wdXQoRklORF9ORVhULCBGaW5kUmVwbGFjZVV0aWxpdHkuRklORF9BQ1RJT04pOw0KKyAgICAgICAga2V5U3Ryb2tlID0gS2V5U3Ryb2tlLmdldEtleVN0cm9rZShLZXlFdmVudC5WS19GMywgMCwgZmFsc2UpOw0KKyAgICAgICAgaU1hcC5wdXQoa2V5U3Ryb2tlLCBGSU5EX05FWFQpOw0KKyAgICANCisgICAgICAgIGFNYXAucHV0KEZJTkRfUFJFVklPVVMsIEZpbmRSZXBsYWNlVXRpbGl0eS5GSU5EX0FDVElPTik7DQorICAgICAgICBrZXlTdHJva2UgPQ0KKyAgICAgICAgICAgIEtleVN0cm9rZS5nZXRLZXlTdHJva2UoS2V5RXZlbnQuVktfRjMsIEtleUV2ZW50LlNISUZUX01BU0ssIGZhbHNlKTsNCisgICAgICAgIGlNYXAucHV0KGtleVN0cm9rZSwgRklORF9QUkVWSU9VUyk7DQorICAgIA0KKyAgICAgICAgYWN0aW9uID0gbmV3IFRhYkFjdGlvbigpOw0KKyAgICAgICAgYU1hcC5wdXQoIlRleHRFZGl0b3ItdGFiQWN0aW9uIiwgYWN0aW9uKTsNCisgICAgICAgIGtleVN0cm9rZSA9IEtleVN0cm9rZS5nZXRLZXlTdHJva2UoS2V5RXZlbnQuVktfVEFCLCAwLCBmYWxzZSk7DQorICAgICAgICBpTWFwLnB1dChrZXlTdHJva2UsICJUZXh0RWRpdG9yLXRhYkFjdGlvbiIpOw0KKyAgICANCisgICAgICAgIGFjdGlvbiA9IG5ldyBTaGlmdFRhYkFjdGlvbigpOw0KKyAgICAgICAgYU1hcC5wdXQoIlRleHRFZGl0b3Itc2hpZnRUYWJBY3Rpb24iLCBhY3Rpb24pOw0KKyAgICAgICAga2V5U3Ryb2tlID0NCisgICAgICAgICAgICBLZXlTdHJva2UuZ2V0S2V5U3Ryb2tlKEtleUV2ZW50LlZLX1RBQiwgS2V5RXZlbnQuU0hJRlRfTUFTSywgZmFsc2UpOw0KKyAgICAgICAgaU1hcC5wdXQoa2V5U3Ryb2tlLCAiVGV4dEVkaXRvci1zaGlmdFRhYkFjdGlvbiIpOw0KKyAgICANCisgICAgICAgIGFjdGlvbiA9IG5ldyBSZXBsYWNlQWN0aW9uKCk7DQorICAgICAgICBnZXRBY3Rpb25NYXAoKS5wdXQoUkVQTEFDRSwgYWN0aW9uKTsNCisgICAgICAgIGtleVN0cm9rZSA9DQorICAgICAgICAgICAgS2V5U3Ryb2tlLmdldEtleVN0cm9rZShLZXlFdmVudC5WS19ILCBLZXlFdmVudC5DVFJMX01BU0ssIGZhbHNlKTsNCisgICAgICAgIGRvIHsNCisgICAgICAgICAgICBpTWFwLnJlbW92ZShrZXlTdHJva2UpOw0KKyAgICAgICAgICAgIGlNYXAgPSBpTWFwLmdldFBhcmVudCgpOw0KKyAgICAgICAgfSB3aGlsZSAoaU1hcCAhPSBudWxsKTsNCisgICAgICAgIGdldElucHV0TWFwKCkucHV0KGtleVN0cm9rZSwgUkVQTEFDRSk7DQorICAgICAgICANCisgICAgICAgIHNldEF1dG9zY3JvbGxzKHRydWUpOw0KKyAgICAgICAgDQorICAgICAgICBkZWZhdWx0Q2FyZXQgPSBnZXRDYXJldCgpOw0KKyAgICAgICAgb3ZlcnR5cGVDYXJldCA9IG5ldyBPdmVydHlwZUNhcmV0KCk7DQorICAgICAgICBvdmVydHlwZUNhcmV0LnNldEJsaW5rUmF0ZShkZWZhdWx0Q2FyZXQuZ2V0QmxpbmtSYXRlKCkpOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgdm9pZCBhZGROb3RpZnkoKSB7DQorICAgICAgICBzdXBlci5hZGROb3RpZnkoKTsNCisgICAgICAgIGFkZE1vdXNlTGlzdGVuZXIobW91c2VBZGFwdGVyKTsNCisgICAgICAgIA0KKyAgICAgICAgRmluZFJlcGxhY2VVdGlsaXR5LnJlZ2lzdGVyVGV4dENvbXBvbmVudCh0aGlzKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgaW50IGdldE51bWJlck9mUGFnZXMoKSB7DQorICAgICAgICBTdHlsZWREb2N1bWVudCBkb2MgPSAoU3R5bGVkRG9jdW1lbnQpZ2V0RG9jdW1lbnQoKTsNCisgICAgICAgIA0KKyAgICAgICAgUGFwZXIgcGFwZXIgPSBQQUdFX0ZPUk1BVC5nZXRQYXBlcigpOw0KKyAgICAgICAgDQorICAgICAgICBudW1QYWdlcyA9DQorICAgICAgICAgICAgKGludClNYXRoLmNlaWwoZ2V0U2l6ZSgpLmdldEhlaWdodCgpIC8gcGFwZXIuZ2V0SW1hZ2VhYmxlSGVpZ2h0KCkpOw0KKyAgICAgICAgDQorICAgICAgICByZXR1cm4gbnVtUGFnZXM7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBQYWdlRm9ybWF0IGdldFBhZ2VGb3JtYXQoaW50IHBhZ2VJbmRleCkgdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gew0KKyAgICAgICAgcmV0dXJuIFBBR0VfRk9STUFUOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgUHJpbnRhYmxlIGdldFByaW50YWJsZShpbnQgcGFyYW0pIHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiB0aGlzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgaW50IHByaW50KEdyYXBoaWNzIGdyYXBoaWNzLCBQYWdlRm9ybWF0IHBhZ2VGb3JtYXQsIGludCBwYWdlKQ0KKyAgICAgICAgdGhyb3dzIFByaW50ZXJFeGNlcHRpb24gew0KKyAgICAgICAgaWYgKHBhZ2UgPCBudW1QYWdlcykgew0KKyAgICAgICAgICAgIFN0eWxlZERvY3VtZW50IGRvYyA9IChTdHlsZWREb2N1bWVudClnZXREb2N1bWVudCgpOw0KKyAgICAgICAgICAgIFBhcGVyIHBhcGVyID0gcGFnZUZvcm1hdC5nZXRQYXBlcigpOw0KKw0KKyAgICAgICAgICAgIC8vIGluaXRpYWxpemUgdGhlIFBSSU5UX1BBTkUgKG5lZWQgdGhpcyBzbyB0aGF0IHdyYXBwaW5nDQorICAgICAgICAgICAgLy8gY2FuIHRha2UgcGxhY2UpDQorICAgICAgICAgICAgUFJJTlRfUEFORS5zZXREb2N1bWVudChnZXREb2N1bWVudCgpKTsNCisNCisgICAgICAgICAgICBQUklOVF9TSVpFLnNldFNpemUocGFwZXIuZ2V0SW1hZ2VhYmxlV2lkdGgoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2l6ZSgpLmdldEhlaWdodCgpKTsNCisgICAgICAgICAgICBQUklOVF9QQU5FLnNldFNpemUoUFJJTlRfU0laRSk7DQorDQorICAgICAgICAgICAgLy8gdHJhbnNsYXRlIHRoZSBncmFwaGljcyBvcmlnaW4gdXB3YXJkcyBzbyB0aGUgYXJlYSBvZiB0aGUgcGFnZSB3ZQ0KKyAgICAgICAgICAgIC8vIHdhbnQgdG8gcHJpbnQgaXMgaW4gdGhlIG9yaWdpbjsgdGhlIGNsaXBwaW5nIHJlZ2lvbiBhdXRvIHNldA0KKyAgICAgICAgICAgIC8vIHdpbGwgdGFrZSBjYXJlIG9mIHRoZSByZXN0DQorICAgICAgICAgICAgZG91YmxlIHkgPSAtKHBhZ2UgKiBwYXBlci5nZXRJbWFnZWFibGVIZWlnaHQoKSkgKyBwYXBlci5nZXRJbWFnZWFibGVZKCk7DQorICAgICAgICAgICAgDQorICAgICAgICAgICAgKChHcmFwaGljczJEKWdyYXBoaWNzKS50cmFuc2xhdGUocGFwZXIuZ2V0SW1hZ2VhYmxlWCgpLCB5KTsNCisgICAgICAgICAgICANCisgICAgICAgICAgICAvLyBwcmludCB0aGUgdGV4dCB3aXRoIGl0cyBvd24gcm91dGluZXMNCisgICAgICAgICAgICBQUklOVF9QQU5FLnByaW50KGdyYXBoaWNzKTsNCisgICAgICAgICAgICANCisgICAgICAgICAgICAvLyB0cmFuc2xhdGUgdGhlIGdyYXBoaWNzIG9iamVjdCBiYWNrIHRvIHJlYWxpdHkgaW4gdGhlIHkgZGltZW5zaW9uDQorICAgICAgICAgICAgLy8gc28gd2UgY2FuIHByaW50IGEgcGFnZSBudW1iZXINCisgICAgICAgICAgICAoKEdyYXBoaWNzMkQpZ3JhcGhpY3MpLnRyYW5zbGF0ZSgwLCAteSk7DQorICAgICAgICAgICAgUmVjdGFuZ2xlIHJlY3QgPSBncmFwaGljcy5nZXRDbGlwQm91bmRzKCk7DQorICAgICAgICAgICAgZ3JhcGhpY3Muc2V0Q2xpcChyZWN0LngsIDAsIHJlY3Qud2lkdGgsIChpbnQpcGFwZXIuZ2V0SGVpZ2h0KCkgKyAxMDApOw0KKyAgICAgICAgICAgIA0KKyAgICAgICAgICAgIC8vIGdldCB0aGUgbmFtZSBvZiB0aGUgcGFuZSAob3IgdXNlciBuYW1lKSBhbmQgdGhlIHRpbWUgZm9yIHRoZSBoZWFkZXINCisgICAgICAgICAgICBDYWxlbmRhciBjYWwgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOw0KKyAgICAgICAgICAgIFN0cmluZyBoZWFkZXIgPSBjYWwuZ2V0VGltZSgpLnRvU3RyaW5nKCkudHJpbSgpOw0KKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZ2V0TmFtZSgpID09IG51bGwgPyANCisgICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLm5hbWUiKS50cmltKCkgOiBnZXROYW1lKCkudHJpbSgpOw0KKyAgICAgICAgICAgIFN0cmluZyBwYWdlU3RyID0gU3RyaW5nLnZhbHVlT2YocGFnZSArIDEpOw0KKyAgICAgICAgICAgIA0KKyAgICAgICAgICAgIEZvbnQgZm9udCA9IEZvbnQuZGVjb2RlKCJNb25vc3BhY2VkIDgiKTsNCisgICAgICAgICAgICBncmFwaGljcy5zZXRGb250KGZvbnQpOw0KKyAgICAgICAgICAgIEZvbnRNZXRyaWNzIGZtID0gZ3JhcGhpY3MuZ2V0Rm9udE1ldHJpY3MoZm9udCk7DQorICAgICAgICAgICAgaW50IHdpZHRoID0gU3dpbmdVdGlsaXRpZXMuY29tcHV0ZVN0cmluZ1dpZHRoKGZtLCBoZWFkZXIpOw0KKyAgICAgICAgICAgICgoR3JhcGhpY3MyRClncmFwaGljcykuZHJhd1N0cmluZyhoZWFkZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCkocGFwZXIuZ2V0SW1hZ2VhYmxlV2lkdGgoKS8yIC0gd2lkdGgvMiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdClwYXBlci5nZXRJbWFnZWFibGVZKCkvMiArIGZtLmdldEhlaWdodCgpKTsNCisgICAgICAgICAgICANCisgICAgICAgICAgICAoKEdyYXBoaWNzMkQpZ3JhcGhpY3MpLnRyYW5zbGF0ZSgwLCBwYXBlci5nZXRJbWFnZWFibGVZKCkgLSBmbS5nZXRIZWlnaHQoKSk7DQorICAgICAgICAgICAgZG91YmxlIGhlaWdodCA9IHBhcGVyLmdldEltYWdlYWJsZUhlaWdodCgpICsgcGFwZXIuZ2V0SW1hZ2VhYmxlWSgpLzI7DQorICAgICAgICAgICAgd2lkdGggPSBTd2luZ1V0aWxpdGllcy5jb21wdXRlU3RyaW5nV2lkdGgoZm0sIG5hbWUpOw0KKyAgICAgICAgICAgICgoR3JhcGhpY3MyRClncmFwaGljcykuZHJhd1N0cmluZyhuYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQpKHBhcGVyLmdldEltYWdlYWJsZVdpZHRoKCkvMiAtIHdpZHRoLzIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQpaGVpZ2h0IC0gZm0uZ2V0SGVpZ2h0KCkvMik7DQorICAgICAgICAgICAgDQorICAgICAgICAgICAgKChHcmFwaGljczJEKWdyYXBoaWNzKS50cmFuc2xhdGUoMCwgZm0uZ2V0SGVpZ2h0KCkpOw0KKyAgICAgICAgICAgIHdpZHRoID0gU3dpbmdVdGlsaXRpZXMuY29tcHV0ZVN0cmluZ1dpZHRoKGZtLCBwYWdlU3RyKTsNCisgICAgICAgICAgICAoKEdyYXBoaWNzMkQpZ3JhcGhpY3MpLmRyYXdTdHJpbmcocGFnZVN0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0KShwYXBlci5nZXRJbWFnZWFibGVXaWR0aCgpLzIgLSB3aWR0aC8yKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0KWhlaWdodCAtIGZtLmdldEhlaWdodCgpLzIpOw0KKw0KKyAgICAgICAgICAgIHJldHVybiBQcmludGFibGUuUEFHRV9FWElTVFM7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gUHJpbnRhYmxlLk5PX1NVQ0hfUEFHRTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGJvb2xlYW4gZ2V0U2Nyb2xsYWJsZVRyYWNrc1ZpZXdwb3J0V2lkdGgoKXsNCisgICAgICAgIGJvb2xlYW4gYm9vbCA9IHN1cGVyLmdldFNjcm9sbGFibGVUcmFja3NWaWV3cG9ydFdpZHRoKCk7DQorICAgICAgICBpZiAodW53cmFwcGVkKSB7DQorICAgICAgICAgICAgQ29tcG9uZW50IHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50KCk7DQorICAgICAgICAgICAgQ29tcG9uZW50VUkgdWkgPSB0aGlzLmdldFVJKCk7DQorICAgICAgICAgICAgaW50IHVpV2lkdGggPSB1aS5nZXRQcmVmZXJyZWRTaXplKHRoaXMpLndpZHRoOw0KKyAgICAgICAgICAgIGludCBwYXJlbnRXaWR0aCA9IHBhcmVudC5nZXRTaXplKCkud2lkdGg7DQorICAgICAgICAgICAgYm9vbCA9IChwYXJlbnQgIT0gbnVsbCkgPw0KKyAgICAgICAgICAgICAgICAodWkuZ2V0UHJlZmVycmVkU2l6ZSh0aGlzKS53aWR0aCA8IHBhcmVudC5nZXRTaXplKCkud2lkdGgpIDogdHJ1ZTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBib29sOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc011bHRpTGluZVRhYmJlZCgpIHsNCisgICAgICAgIHJldHVybiBtdWx0aUxpbmVUYWI7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc092ZXJ0eXBlTW9kZSgpIHsNCisgICAgICAgIHJldHVybiBpc092ZXJ0eXBlTW9kZTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGJvb2xlYW4gaXNUYWJzQXNTcGFjZXMoKSB7DQorICAgICAgICByZXR1cm4gdGFic0FzU3BhY2VzOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Vud3JhcHBlZCgpIHsNCisgICAgICAgIHJldHVybiB1bndyYXBwZWQ7DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NLZXlFdmVudChLZXlFdmVudCBlKQ0KKyAgICB7DQorICAgICAgICBzdXBlci5wcm9jZXNzS2V5RXZlbnQoZSk7DQorDQorICAgICAgICAvLyAgSGFuZGxlIHJlbGVhc2Ugb2YgSW5zZXJ0IGtleSB0byB0b2dnbGUgb3ZlcnR5cGUvaW5zZXJ0IG1vZGUNCisgICAgICAgIGlmIChlLmdldElEKCkgPT0gS2V5RXZlbnQuS0VZX1JFTEVBU0VEICYmDQorICAgICAgICAgICAgZS5nZXRLZXlDb2RlKCkgPT0gS2V5RXZlbnQuVktfSU5TRVJUKSB7DQorICAgICAgICAgICAgc2V0T3ZlcnR5cGVNb2RlKCFpc092ZXJ0eXBlTW9kZSgpKTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVOb3RpZnkoKSB7DQorICAgICAgICBzdXBlci5yZW1vdmVOb3RpZnkoKTsNCisgICAgICAgIHJlbW92ZU1vdXNlTGlzdGVuZXIobW91c2VBZGFwdGVyKTsNCisgICAgICAgIEZpbmRSZXBsYWNlVXRpbGl0eS51bnJlZ2lzdGVyVGV4dENvbXBvbmVudCh0aGlzKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCByZXBsYWNlU2VsZWN0aW9uKFN0cmluZyB0ZXh0KSB7DQorICAgICAgICAvLyAgSW1wbGVtZW50IG92ZXJ0eXBlIG1vZGUgYnkgc2VsZWN0aW5nIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIGN1cnJlbnQNCisgICAgICAgIC8vICBjYXJldCBwb3NpdGlvbg0KKyAgICAgICAgaWYgKGlzT3ZlcnR5cGVNb2RlKCkpIHsNCisgICAgICAgICAgICBpbnQgcG9zID0gZ2V0Q2FyZXRQb3NpdGlvbigpOw0KKw0KKyAgICAgICAgICAgIGlmIChnZXRTZWxlY3RlZFRleHQoKSA9PSBudWxsICYmIHBvcyA8IGdldERvY3VtZW50KCkuZ2V0TGVuZ3RoKCkpIHsNCisgICAgICAgICAgICAgICAgbW92ZUNhcmV0UG9zaXRpb24ocG9zICsgMSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgc3VwZXIucmVwbGFjZVNlbGVjdGlvbih0ZXh0KTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXRCb3VuZHMoaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsNCisgICAgICAgIGlmICh1bndyYXBwZWQpIHsNCisgICAgICAgICAgICBEaW1lbnNpb24gc2l6ZSA9IHRoaXMuZ2V0UHJlZmVycmVkU2l6ZSgpOw0KKyAgICAgICAgICAgIHN1cGVyLnNldEJvdW5kcyh4LCB5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLm1heChzaXplLndpZHRoLCB3aWR0aCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGgubWF4KHNpemUuaGVpZ2h0LCBoZWlnaHQpKTsNCisgICAgICAgIH0NCisgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgIHN1cGVyLnNldEJvdW5kcyh4LCB5LCB3aWR0aCwgaGVpZ2h0KTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgLyoqDQorICAgICAqIEBwYXJhbSBtdWx0aUxpbmVUYWINCisgICAgICovICAgIA0KKyAgICBwdWJsaWMgdm9pZCBpc011bHRpTGluZVRhYmJlZChib29sZWFuIG11bHRpTGluZVRhYikgew0KKyAgICAgICAgdGhpcy5tdWx0aUxpbmVUYWIgPSBtdWx0aUxpbmVUYWI7DQorICAgIH0NCisgICAgDQorICAgIC8qKg0KKyAgICAgKiBAcGFyYW0gdGFic0FzU3BhY2VzDQorICAgICAqLyAgICANCisgICAgcHVibGljIHZvaWQgaXNUYWJzQXNTcGFjZXMoYm9vbGVhbiB0YWJzQXNTcGFjZXMpIHsNCisgICAgICAgIHRoaXMudGFic0FzU3BhY2VzID0gdGFic0FzU3BhY2VzOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBTZXQgdGhlIGNhcmV0IHRvIHVzZSBkZXBlbmRpbmcgb24gb3ZlcnR5cGUvaW5zZXJ0IG1vZGUNCisgICAgICoNCisgICAgICogQHBhcmFtIGlzT3ZlcnR5cGVNb2RlDQorICAgICAqLyAgICANCisgICAgcHVibGljIHZvaWQgc2V0T3ZlcnR5cGVNb2RlKGJvb2xlYW4gaXNPdmVydHlwZU1vZGUpIHsNCisgICAgICAgIFRleHRFZGl0b3IuaXNPdmVydHlwZU1vZGUgPSBpc092ZXJ0eXBlTW9kZTsNCisgICAgICAgIGludCBwb3MgPSBnZXRDYXJldFBvc2l0aW9uKCk7DQorDQorICAgICAgICBpZiAoaXNPdmVydHlwZU1vZGUoKSkgew0KKyAgICAgICAgICAgIHNldENhcmV0KG92ZXJ0eXBlQ2FyZXQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgc2V0Q2FyZXQoZGVmYXVsdENhcmV0KTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHNldENhcmV0UG9zaXRpb24ocG9zKTsNCisgICAgfQ0KKyAgICANCisgICAgLyoqDQorICAgICAqIEBwYXJhbSB1bndyYXBwZWQNCisgICAgICovICAgIA0KKyAgICBwdWJsaWMgdm9pZCBzZXRVbndyYXBwZWQoYm9vbGVhbiB1bndyYXBwZWQpIHsNCisgICAgICAgIHRoaXMudW53cmFwcGVkID0gdW53cmFwcGVkOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGNsYXNzIEZpbmRBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdEFjdGlvbiB7ICAgICAgICANCisgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBhZSkgew0KKyAgICAgICAgICAgIEZpbmRSZXBsYWNlVXRpbGl0eS5zaG93RGlhbG9nKCk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgY2xhc3MgUmVwbGFjZUFjdGlvbiBleHRlbmRzIEFic3RyYWN0QWN0aW9uIHsNCisgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBhZSkgew0KKyAgICAgICAgICAgIEZpbmRSZXBsYWNlVXRpbGl0eS5zaG93RGlhbG9nKHRydWUpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGNsYXNzIFNoaWZ0VGFiQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RBY3Rpb24geyAgICAgICAgDQorICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgYWUpIHsNCisgICAgICAgICAgICB0cnkgew0KKyAgICAgICAgICAgICAgICBpZiAobXVsdGlMaW5lVGFiICYmIFRleHRFZGl0b3IudGhpcy5nZXRTZWxlY3RlZFRleHQoKSAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgICBEb2N1bWVudCBkb2MgPSBUZXh0RWRpdG9yLnRoaXMuZ2V0RG9jdW1lbnQoKTsNCisgICAgICAgICAgICAgICAgICAgIGludCBlbmQgPSBVdGlsaXRpZXMuZ2V0Um93RW5kKFRleHRFZGl0b3IudGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFNlbGVjdGlvbkVuZCgpKTsNCisgICAgICAgICAgICAgICAgICAgIFRleHRFZGl0b3IudGhpcy5zZXRTZWxlY3Rpb25FbmQoZW5kKTsNCisgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgICAgICAgRWxlbWVudCBlbCA9DQorICAgICAgICAgICAgICAgICAgICAgICAgVXRpbGl0aWVzLmdldFBhcmFncmFwaEVsZW1lbnQoVGV4dEVkaXRvci50aGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFNlbGVjdGlvblN0YXJ0KCkpOw0KKyAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0ID0gZWwuZ2V0U3RhcnRPZmZzZXQoKTsNCisgICAgICAgICAgICAgICAgICAgIFRleHRFZGl0b3IudGhpcy5zZXRTZWxlY3Rpb25TdGFydChzdGFydCk7DQorICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHRleHQgYW5kIHJlc2VsZWN0IHRoZSB0ZXh0DQorICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCA9IHRhYnNBc1NwYWNlcyA/DQorICAgICAgICAgICAgICAgICAgICAgICAgVEFCX0JBQ0tfUEFUVEVSTi5tYXRjaGVyKGdldFNlbGVjdGVkVGV4dCgpKS5yZXBsYWNlQWxsKCIiKSA6DQorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2VsZWN0ZWRUZXh0KCkucmVwbGFjZUFsbCgiXlx0IiwgIiIpOw0KKyAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgICAgICBUZXh0RWRpdG9yLnRoaXMucmVwbGFjZVNlbGVjdGlvbih0ZXh0KTsNCisgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgICAgICAgVGV4dEVkaXRvci50aGlzLnNlbGVjdChzdGFydCwgc3RhcnQgKyB0ZXh0Lmxlbmd0aCgpKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCisgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgY2xhc3MgVGFiQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RBY3Rpb24gew0KKyAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGFlKSB7DQorICAgICAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gVGV4dEVkaXRvci50aGlzLmdldERvY3VtZW50KCk7DQorICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gdGFic0FzU3BhY2VzID8gVEFCQkVEX1NQQUNFUyA6ICJcdCI7DQorICAgICAgICAgICAgICAgIGlmIChtdWx0aUxpbmVUYWIgJiYgZ2V0U2VsZWN0ZWRUZXh0KCkgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgICAgaW50IGVuZCA9IFV0aWxpdGllcy5nZXRSb3dFbmQoVGV4dEVkaXRvci50aGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2VsZWN0aW9uRW5kKCkpOw0KKyAgICAgICAgICAgICAgICAgICAgVGV4dEVkaXRvci50aGlzLnNldFNlbGVjdGlvbkVuZChlbmQpOw0KKyAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgICAgICBFbGVtZW50IGVsID0NCisgICAgICAgICAgICAgICAgICAgICAgICBVdGlsaXRpZXMuZ2V0UGFyYWdyYXBoRWxlbWVudChUZXh0RWRpdG9yLnRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2VsZWN0aW9uU3RhcnQoKSk7DQorICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQgPSBlbC5nZXRTdGFydE9mZnNldCgpOw0KKyAgICAgICAgICAgICAgICAgICAgVGV4dEVkaXRvci50aGlzLnNldFNlbGVjdGlvblN0YXJ0KHN0YXJ0KTsNCisgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRvUmVwbGFjZSA9IFRleHRFZGl0b3IudGhpcy5nZXRTZWxlY3RlZFRleHQoKTsNCisgICAgICAgICAgICAgICAgICAgIHRvUmVwbGFjZSA9IExJTkVfU1RBUlQubWF0Y2hlcih0b1JlcGxhY2UpLnJlcGxhY2VBbGwodGV4dCk7DQorICAgICAgICAgICAgICAgICAgICBUZXh0RWRpdG9yLnRoaXMucmVwbGFjZVNlbGVjdGlvbih0b1JlcGxhY2UpOw0KKyAgICAgICAgICAgICAgICAgICAgVGV4dEVkaXRvci50aGlzLnNlbGVjdChzdGFydCwgc3RhcnQgKyB0b1JlcGxhY2UubGVuZ3RoKCkpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgaW50IHBvcyA9IFRleHRFZGl0b3IudGhpcy5nZXRDYXJldFBvc2l0aW9uKCk7DQorICAgICAgICAgICAgICAgICAgICBkb2MuaW5zZXJ0U3RyaW5nKHBvcywgdGV4dCwgbnVsbCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQorICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICAvKioNCisgICAgICogIFBhaW50IGEgaG9yaXpvbnRhbCBsaW5lIHRoZSB3aWR0aCBvZiBhIGNvbHVtbiBhbmQgMSBwaXhlbCBoaWdoDQorICAgICAqLw0KKyAgICBwcml2YXRlIGNsYXNzIE92ZXJ0eXBlQ2FyZXQgZXh0ZW5kcyBEZWZhdWx0Q2FyZXQgew0KKyAgICAgICAgLy9UaGUgb3ZlcnR5cGUgY2FyZXQgd2lsbCBzaW1wbHkgYmUgYSBob3Jpem9udGFsIGxpbmUgb25lIHBpeGVsIGhpZ2gNCisgICAgICAgIC8vIChvbmNlIHdlIGRldGVybWluZSB3aGVyZSB0byBwYWludCBpdCkNCisgICAgICAgIHB1YmxpYyB2b2lkIHBhaW50KEdyYXBoaWNzIGcpIHsNCisgICAgICAgICAgICBpZiAoaXNWaXNpYmxlKCkpIHsNCisgICAgICAgICAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICAgICAgICAgIEpUZXh0Q29tcG9uZW50IGNvbXBvbmVudCA9IGdldENvbXBvbmVudCgpOw0KKyAgICAgICAgICAgICAgICAgICAgUmVjdGFuZ2xlIHIgPQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5nZXRVSSgpLm1vZGVsVG9WaWV3KGNvbXBvbmVudCwgZ2V0RG90KCkpOw0KKyAgICAgICAgICAgICAgICAgICAgQ29sb3IgYyA9IGcuZ2V0Q29sb3IoKTsNCisgICAgICAgICAgICAgICAgICAgIGcuc2V0Q29sb3IoY29tcG9uZW50LmdldEJhY2tncm91bmQoKSk7DQorICAgICAgICAgICAgICAgICAgICBnLnNldFhPUk1vZGUoY29tcG9uZW50LmdldENhcmV0Q29sb3IoKSk7DQorICAgICAgICAgICAgICAgICAgICByLnNldEJvdW5kcyhyLngsIHIueSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcuZ2V0Rm9udE1ldHJpY3MoKS5jaGFyV2lkdGgoJ3cnKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcuZ2V0Rm9udE1ldHJpY3MoKS5nZXRIZWlnaHQoKSk7DQorICAgICAgICAgICAgICAgICAgICBnLmZpbGxSZWN0KHIueCwgci55LCByLndpZHRoLCByLmhlaWdodCk7DQorICAgICAgICAgICAgICAgICAgICBnLnNldFBhaW50TW9kZSgpOw0KKyAgICAgICAgICAgICAgICAgICAgZy5zZXRDb2xvcihjKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgew0KKyAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIC8qDQorICAgICAgICAgKiAgRGFtYWdlIG11c3QgYmUgb3ZlcnJpZGRlbiB3aGVuZXZlciB0aGUgcGFpbnQgbWV0aG9kIGlzIG92ZXJyaWRkZW4NCisgICAgICAgICAqICAoVGhlIGRhbWFnZWQgYXJlYSBpcyB0aGUgYXJlYSB0aGUgY2FyZXQgaXMgcGFpbnRlZCBpbi4gV2UgbXVzdA0KKyAgICAgICAgICogIGNvbnNpZGVyIHRoZSBhcmVhIGZvciB0aGUgZGVmYXVsdCBjYXJldCBhbmQgdGhpcyBjYXJldCkNCisgICAgICAgICAqLw0KKyAgICAgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGRhbWFnZShSZWN0YW5nbGUgcikgew0KKyAgICAgICAgICAgIGlmIChyICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgSlRleHRDb21wb25lbnQgY29tcG9uZW50ID0gZ2V0Q29tcG9uZW50KCk7DQorICAgICAgICAgICAgICAgIHggPSByLng7DQorICAgICAgICAgICAgICAgIHkgPSByLnk7DQorICAgICAgICAgICAgICAgIEZvbnQgZm9udCA9IGNvbXBvbmVudC5nZXRGb250KCk7DQorICAgICAgICAgICAgICAgIHdpZHRoID0gY29tcG9uZW50LmdldEZvbnRNZXRyaWNzKGZvbnQpLmNoYXJXaWR0aCgndycpOw0KKyAgICAgICAgICAgICAgICBoZWlnaHQgPSByLmhlaWdodDsNCisgICAgICAgICAgICAgICAgcmVwYWludCgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3VpL3RleHQvVGV4dFVuZG9NYW5hZ2VyLmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3VpL3RleHQvVGV4dFVuZG9NYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM5MjkyNgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdWkvdGV4dC9UZXh0VW5kb01hbmFnZXIuamF2YQpAQCAtMCwwICsxLDIwMiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgZ3Jvb3Z5LnVpLnRleHQ7CisKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7CisKK2ltcG9ydCBqYXZheC5zd2luZy5ldmVudC5Td2luZ1Byb3BlcnR5Q2hhbmdlU3VwcG9ydDsKK2ltcG9ydCBqYXZheC5zd2luZy5ldmVudC5VbmRvYWJsZUVkaXRFdmVudDsKK2ltcG9ydCBqYXZheC5zd2luZy51bmRvLkNvbXBvdW5kRWRpdDsKK2ltcG9ydCBqYXZheC5zd2luZy51bmRvLlVuZG9NYW5hZ2VyOworaW1wb3J0IGphdmF4LnN3aW5nLnVuZG8uVW5kb2FibGVFZGl0OworCisvKioKKyAqIFRvIHVzZSB0aGlzLCBzaW1wbHkgZHJvcCB0aGlzIGFzIGFuIFVuZG9hYmxlRWRpdExpc3RlbmVyIGludG8geW91ciBkb2N1bWVudCwKKyAqIGFuZCB0aGVuIGNyZWF0ZSBhY3Rpb25zIHRvIGNhbGwgdW5kby9yZWRvIGFzIG5lZWRlZCAoY2hlY2tpbmcgY2FuIHVuZG8vcmVkbworICogZmlyc3QsIG9mIGNvdXJzZSkuCisgKgorICogQGF1dGhvciBFdmFuICJIaXBweSIgU2xhdGlzCisgKi8KK3B1YmxpYyBjbGFzcyBUZXh0VW5kb01hbmFnZXIgZXh0ZW5kcyBVbmRvTWFuYWdlciB7CisJCisgICAgcHJpdmF0ZSBTd2luZ1Byb3BlcnR5Q2hhbmdlU3VwcG9ydCBwcm9wQ2hhbmdlU3VwcG9ydCA9CisgICAgICAgIG5ldyBTd2luZ1Byb3BlcnR5Q2hhbmdlU3VwcG9ydCh0aGlzKTsKKworICAgIHByaXZhdGUgU3RydWN0dXJlZEVkaXQgY29tcG91bmRFZGl0ID0gbmV3IFN0cnVjdHVyZWRFZGl0KCk7CisKKyAgICBwcml2YXRlIGxvbmcgZmlyc3RNb2RpZmllZDsKKyAgICAKKyAgICBwcml2YXRlIFVuZG9hYmxlRWRpdCBtb2RpZmljYXRpb25NYXJrZXIgPSBlZGl0VG9CZVVuZG9uZSgpOworICAgIAorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgVGV4dFVuZG9NYW5hZ2VyLgorICAgICAqLworICAgIHB1YmxpYyBUZXh0VW5kb01hbmFnZXIoKSB7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwY2wpIHsKKyAgICAgICAgcHJvcENoYW5nZVN1cHBvcnQuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwY2wpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBkaWUoKSB7CisgICAgICAgIGJvb2xlYW4gdW5kb2FibGUgPSBjYW5VbmRvKCk7CisgICAgICAgIHN1cGVyLmRpZSgpOworICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChVbmRvTWFuYWdlci5VbmRvTmFtZSwgdW5kb2FibGUsIGNhblVuZG8oKSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGRpc2NhcmRBbGxFZGl0cygpIHsKKyAgICAgICAgYm9vbGVhbiB1bmRvYWJsZSA9IGNhblVuZG8oKTsKKyAgICAgICAgYm9vbGVhbiByZWRvYWJsZSA9IGNhblJlZG8oKTsKKyAgICAgICAgCisgICAgICAgIGJvb2xlYW4gY2hhbmdlZCA9IGhhc0NoYW5nZWQoKTsKKyAgICAgICAgc3VwZXIuZGlzY2FyZEFsbEVkaXRzKCk7CisgICAgICAgIG1vZGlmaWNhdGlvbk1hcmtlciA9IGVkaXRUb0JlVW5kb25lKCk7CisgICAgICAgIAorICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChVbmRvTWFuYWdlci5VbmRvTmFtZSwgdW5kb2FibGUsIGNhblVuZG8oKSk7CisgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KFVuZG9NYW5hZ2VyLlVuZG9OYW1lLCByZWRvYWJsZSwgY2FuUmVkbygpKTsKKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoU3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBvbGRWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG5ld1ZhbHVlKSB7CisgICAgICAgIHByb3BDaGFuZ2VTdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZShuYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNDaGFuZ2VkKCkgeworICAgICAgICByZXR1cm4gbW9kaWZpY2F0aW9uTWFya2VyICE9IGVkaXRUb0JlVW5kb25lKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHJlZG8oKSB0aHJvd3MgamF2YXguc3dpbmcudW5kby5DYW5ub3RSZWRvRXhjZXB0aW9uIHsKKyAgICAgICAgY29tcG91bmRFZGl0LmVuZCgpOworICAgICAgICAKKyAgICAgICAgaWYgKGZpcnN0TW9kaWZpZWQgPT0gMCkgeworICAgICAgICAgICAgZmlyc3RNb2RpZmllZCA9ICgoU3RydWN0dXJlZEVkaXQpZWRpdFRvQmVSZWRvbmUoKSkuZWRpdGVkVGltZSgpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBib29sZWFuIHVuZG9hYmxlID0gY2FuVW5kbygpOworICAgICAgICAKKyAgICAgICAgYm9vbGVhbiBjaGFuZ2VkID0gaGFzQ2hhbmdlZCgpOworICAgICAgICBzdXBlci5yZWRvKCk7CisgICAgICAgIAorICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChVbmRvTWFuYWdlci5VbmRvTmFtZSwgdW5kb2FibGUsIGNhblVuZG8oKSk7CisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCB2b2lkIHJlZG9UbyhVbmRvYWJsZUVkaXQgZWRpdCkgeworICAgICAgICBjb21wb3VuZEVkaXQuZW5kKCk7CisgICAgICAgIAorICAgICAgICBpZiAoZmlyc3RNb2RpZmllZCA9PSAwKSB7CisgICAgICAgICAgICBmaXJzdE1vZGlmaWVkID0gKChTdHJ1Y3R1cmVkRWRpdCllZGl0VG9CZVJlZG9uZSgpKS5lZGl0ZWRUaW1lKCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGJvb2xlYW4gdW5kb2FibGUgPSBjYW5VbmRvKCk7CisgICAgICAgIAorICAgICAgICBib29sZWFuIGNoYW5nZWQgPSBoYXNDaGFuZ2VkKCk7CisgICAgICAgIHN1cGVyLnJlZG9UbyhlZGl0KTsKKyAgICAgICAgCisgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KFVuZG9NYW5hZ2VyLlVuZG9OYW1lLCB1bmRvYWJsZSwgY2FuVW5kbygpKTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwY2wpIHsKKyAgICAgICAgcHJvcENoYW5nZVN1cHBvcnQucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwY2wpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKyAgICAgICAgYm9vbGVhbiBjaGFuZ2VkID0gbW9kaWZpY2F0aW9uTWFya2VyICE9IGVkaXRUb0JlVW5kb25lKCk7CisgICAgICAgIGlmIChjaGFuZ2VkKSB7CisgICAgICAgICAgICBtb2RpZmljYXRpb25NYXJrZXIgPSBlZGl0VG9CZVVuZG9uZSgpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCB2b2lkIHRyaW1FZGl0cyhpbnQgZnJvbSwgaW50IHRvKSB7CisgICAgICAgIGJvb2xlYW4gdW5kb2FibGUgPSBjYW5VbmRvKCk7CisgICAgICAgIGJvb2xlYW4gcmVkb2FibGUgPSBjYW5SZWRvKCk7CisgICAgICAgIAorICAgICAgICBib29sZWFuIGNoYW5nZWQgPSBoYXNDaGFuZ2VkKCk7CisgICAgICAgIHN1cGVyLnRyaW1FZGl0cyhmcm9tLCB0byk7CisgICAgICAgIAorICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChVbmRvTWFuYWdlci5VbmRvTmFtZSwgdW5kb2FibGUsIGNhblVuZG8oKSk7CisgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KFVuZG9NYW5hZ2VyLlJlZG9OYW1lLCByZWRvYWJsZSwgY2FuUmVkbygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1bmRvKCkgdGhyb3dzIGphdmF4LnN3aW5nLnVuZG8uQ2Fubm90VW5kb0V4Y2VwdGlvbiB7CisgICAgICAgIGNvbXBvdW5kRWRpdC5lbmQoKTsKKyAgICAgICAgCisgICAgICAgIFVuZG9hYmxlRWRpdCBlZGl0ID0gZWRpdFRvQmVVbmRvbmUoKTsKKyAgICAgICAgaWYgKCgoU3RydWN0dXJlZEVkaXQpZWRpdFRvQmVVbmRvbmUoKSkuZWRpdGVkVGltZSgpID09CisgICAgICAgICAgICBmaXJzdE1vZGlmaWVkKSB7CisgICAgICAgICAgICBmaXJzdE1vZGlmaWVkID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChmaXJzdE1vZGlmaWVkID09IDApIHsKKyAgICAgICAgICAgIGZpcnN0TW9kaWZpZWQgPSAoKFN0cnVjdHVyZWRFZGl0KWVkaXRUb0JlVW5kb25lKCkpLmVkaXRlZFRpbWUoKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgYm9vbGVhbiByZWRvYWJsZSA9IGNhblJlZG8oKTsKKyAgICAgICAgYm9vbGVhbiBjaGFuZ2VkID0gaGFzQ2hhbmdlZCgpOworICAgICAgICBzdXBlci51bmRvKCk7CisgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KFVuZG9NYW5hZ2VyLlJlZG9OYW1lLCByZWRvYWJsZSwgY2FuUmVkbygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1bmRvYWJsZUVkaXRIYXBwZW5lZChVbmRvYWJsZUVkaXRFdmVudCB1ZWUpIHsKKyAgICAgICAgVW5kb2FibGVFZGl0IGVkaXQgPSB1ZWUuZ2V0RWRpdCgpOworICAgICAgICBib29sZWFuIHVuZG9hYmxlID0gY2FuVW5kbygpOworCisgICAgICAgIGxvbmcgZWRpdFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworICAgICAgICBpZiAoZmlyc3RNb2RpZmllZCA9PSAwIHx8IAorICAgICAgICAgICAgZWRpdFRpbWUgLSBjb21wb3VuZEVkaXQuZWRpdGVkVGltZSgpID4gNzAwKSB7CisgICAgICAgICAgICBjb21wb3VuZEVkaXQuZW5kKCk7CisgICAgICAgICAgICBjb21wb3VuZEVkaXQgPSBuZXcgU3RydWN0dXJlZEVkaXQoKTsKKyAgICAgICAgfQorICAgICAgICBjb21wb3VuZEVkaXQuYWRkRWRpdChlZGl0KTsKKyAgICAgICAgCisgICAgICAgIGZpcnN0TW9kaWZpZWQgPSBmaXJzdE1vZGlmaWVkID09IDAgPworICAgICAgICAgICAgY29tcG91bmRFZGl0LmVkaXRlZFRpbWUoKSA6IGZpcnN0TW9kaWZpZWQ7CisKKyAgICAgICAgaWYgKGxhc3RFZGl0KCkgIT0gY29tcG91bmRFZGl0KSB7CisgICAgICAgICAgICBib29sZWFuIGNoYW5nZWQgPSBoYXNDaGFuZ2VkKCk7CisgICAgICAgICAgICBhZGRFZGl0KGNvbXBvdW5kRWRpdCk7CisgICAgICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChVbmRvTWFuYWdlci5VbmRvTmFtZSwgdW5kb2FibGUsIGNhblVuZG8oKSk7CisgICAgICAgIH0KKworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIGNsYXNzIFN0cnVjdHVyZWRFZGl0IGV4dGVuZHMgQ29tcG91bmRFZGl0IHsKKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgbG9uZyBlZGl0ZWRUaW1lOworICAgICAgICAKKyAgICAgICAgcHVibGljIGJvb2xlYW4gYWRkRWRpdChVbmRvYWJsZUVkaXQgZWRpdCkgeworICAgICAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBzdXBlci5hZGRFZGl0KGVkaXQpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAmJiBlZGl0ZWRUaW1lID09IDApIHsKKyAgICAgICAgICAgICAgICBlZGl0ZWRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gY2FuVW5kbygpIHsKKyAgICAgICAgICAgIHJldHVybiBlZGl0cy5zaXplKCkgPiAwOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwcm90ZWN0ZWQgbG9uZyBlZGl0ZWRUaW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIGVkaXRlZFRpbWU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzSW5Qcm9ncmVzcygpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0gICAgCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3VpL3RleHQvcGFja2FnZS5odG1sIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS90ZXh0L3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTdlNDFmCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS90ZXh0L3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDggQEAKKzxodG1sPgorICA8aGVhZD4KKyAgICA8dGl0bGU+cGFja2FnZSBncm9vdnkudWkudGV4dC4qPC90aXRsZT4KKyAgPC9oZWFkPgorICA8Ym9keT4KKyAgICA8cD5UZXh0IHByb2Nlc3NpbmcgaGVscGVycyBmb3IgdGhlIGludGVyYWN0aXZlIGNvbW1hbmQgbGluZSB0ZXJtaW5hbC48L3A+CisgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdWkvdmlldy9CYXNpY0NvbnRlbnRQYW5lLmdyb292eSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdWkvdmlldy9CYXNpY0NvbnRlbnRQYW5lLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGYyM2QxCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS92aWV3L0Jhc2ljQ29udGVudFBhbmUuZ3Jvb3Z5CkBAIC0wLDAgKzEsNzkgQEAKK3BhY2thZ2UgZ3Jvb3Z5LnVpLnZpZXcNCisNCitpbXBvcnQgZ3Jvb3Z5LnVpLkNvbnNvbGVUZXh0RWRpdG9yDQoraW1wb3J0IGphdmEuYXd0LioNCitpbXBvcnQgamF2YS5hd3QuaW1hZ2UuQnVmZmVyZWRJbWFnZQ0KK2ltcG9ydCBzdGF0aWMgamF2YXguc3dpbmcuSlNwbGl0UGFuZS5WRVJUSUNBTF9TUExJVA0KK2ltcG9ydCBqYXZheC5zd2luZy50ZXh0LlN0eWxlDQoraW1wb3J0IGphdmF4LnN3aW5nLnRleHQuU3R5bGVDb250ZXh0DQoraW1wb3J0IGphdmF4LnN3aW5nLnRleHQuU3R5bGVkRG9jdW1lbnQNCisNCitzcGxpdFBhbmUoaWQ6ICdzcGxpdFBhbmUnLCByZXNpemVXZWlnaHQ6IDAuNTBGLA0KKyAgICBvcmllbnRhdGlvbjogVkVSVElDQUxfU1BMSVQpDQorew0KKyAgICB3aWRnZXQobmV3IENvbnNvbGVUZXh0RWRpdG9yKCksIGJvcmRlcjplbXB0eUJvcmRlcigwKSwgaWQ6J2lucHV0RWRpdG9yJywgY29uc3RyYWludHM6Qm9yZGVyTGF5b3V0LkNFTlRFUikNCisgICAgc2Nyb2xsUGFuZShib3JkZXI6ZW1wdHlCb3JkZXIoMCkpIHsNCisgICAgICAgIHRleHRQYW5lKGlkOiAnb3V0cHV0QXJlYScsDQorICAgICAgICAgICAgZWRpdGFibGU6IGZhbHNlLA0KKyAgICAgICAgICAgIGJhY2tncm91bmQ6IG5ldyBDb2xvcigyNTUsMjU1LDIxOCksDQorICAgICAgICAgICAgZm9udDpuZXcgRm9udCgiTW9ub3NwYWNlZCIsIEZvbnQuUExBSU4sIDEyKSwNCisgICAgICAgICAgICBib3JkZXI6ZW1wdHlCb3JkZXIoNCkNCisgICAgICAgICkNCisgICAgfQ0KK30NCisNCisNCitpbnB1dEFyZWEgPSBpbnB1dEVkaXRvci50ZXh0RWRpdG9yDQorLy8gYXR0YWNoIGN0cmwtZW50ZXIgdG8gaW5wdXQgYXJlYQ0KKy8vIG5lZWQgdG8gd3JhcCBpbiBhY3Rpb25zIHRvIGtlZXAgaXQgZnJvbSBiZWluZyBhZGRlZCBhcyBhIGNvbXBvbmVudA0KK2FjdGlvbnMgew0KKyAgICBjb250YWluZXIoaW5wdXRBcmVhLCBmb250Om5ldyBGb250KCJNb25vc3BhY2VkIiwgRm9udC5QTEFJTiwgMTIpLCBib3JkZXI6ZW1wdHlCb3JkZXIoNCkpIHsNCisgICAgICAgIGFjdGlvbihydW5BY3Rpb24pDQorICAgICAgICBhY3Rpb24ocnVuU2VsZWN0aW9uQWN0aW9uKQ0KKyAgICB9DQorfQ0KKw0KKy8vIGFkZCBzdHlsZXMgdG8gdGhlIG91dHB1dCBhcmVhLCBzaHVvbGQgdGhpcyBiZSBtb3ZlZCBpbnRvIFN3aW5nQnVpZGxlciBzb21laG93Pw0KK291dHB1dEFyZWEuc2V0Rm9udChuZXcgRm9udCgiTW9ub3NwYWNlZCIsIG91dHB1dEFyZWEuZm9udC5zdHlsZSwgb3V0cHV0QXJlYS5mb250LnNpemUpKQ0KK1N0eWxlZERvY3VtZW50IGRvYyA9IG91dHB1dEFyZWEuZ2V0U3R5bGVkRG9jdW1lbnQoKTsNCisNCitTdHlsZSBkZWZTdHlsZSA9IFN0eWxlQ29udGV4dC5nZXREZWZhdWx0U3R5bGVDb250ZXh0KCkuZ2V0U3R5bGUoU3R5bGVDb250ZXh0LkRFRkFVTFRfU1RZTEUpOw0KKw0KK2RlZiBhcHBseVN0eWxlID0ge1N0eWxlIHN0eWxlLCB2YWx1ZXMgLT4gdmFsdWVzLmVhY2h7aywgdiAtPiBzdHlsZS5hZGRBdHRyaWJ1dGUoaywgdil9fQ0KKw0KK1N0eWxlIHJlZ3VsYXIgPSBkb2MuYWRkU3R5bGUoInJlZ3VsYXIiLCBkZWZTdHlsZSk7DQorYXBwbHlTdHlsZShyZWd1bGFyLCBzdHlsZXMucmVndWxhcikNCisNCitwcm9tcHRTdHlsZSA9IGRvYy5hZGRTdHlsZSgicHJvbXB0IiwgcmVndWxhcikNCithcHBseVN0eWxlKHByb21wdFN0eWxlLCBzdHlsZXMucHJvbXB0KQ0KKw0KK2NvbW1hbmRTdHlsZSA9IGRvYy5hZGRTdHlsZSgiY29tbWFuZCIsIHJlZ3VsYXIpOw0KK2FwcGx5U3R5bGUoY29tbWFuZFN0eWxlLCBzdHlsZXMuY29tbWFuZCkNCisNCitvdXRwdXRTdHlsZSA9IGRvYy5hZGRTdHlsZSgib3V0cHV0IiwgcmVndWxhcik7DQorYXBwbHlTdHlsZShvdXRwdXRTdHlsZSwgc3R5bGVzLm91dHB1dCkNCisNCityZXN1bHRTdHlsZSA9IGRvYy5hZGRTdHlsZSgicmVzdWx0IiwgcmVndWxhcikNCithcHBseVN0eWxlKHJlc3VsdFN0eWxlLCBzdHlsZXMucmVzdWx0KQ0KKw0KKy8vIHJlZG8gc3R5bGVzIGZvciBlZGl0b3INCitkb2MgPSBpbnB1dEFyZWEuZ2V0U3R5bGVkRG9jdW1lbnQoKQ0KK1N0eWxlQ29udGV4dCBzdHlsZUNvbnRleHQgPSBTdHlsZUNvbnRleHQuZ2V0RGVmYXVsdFN0eWxlQ29udGV4dCgpDQorc3R5bGVzLmVhY2gge3N0eWxlTmFtZSwgZGVmcyAtPg0KKyAgICBTdHlsZSBzdHlsZSA9IHN0eWxlQ29udGV4dC5nZXRTdHlsZShzdHlsZU5hbWUpDQorICAgIGlmIChzdHlsZSkgew0KKyAgICAgICAgYXBwbHlTdHlsZShzdHlsZSwgZGVmcykNCisgICAgfQ0KK30NCisNCisvLyBzZXQgdGhlIHByZWZlcnJlZCBzaXplIG9mIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGFyZWFzDQorLy8gdGhpcyBpcyBhIGdvb2QgZW5vdWdoIHNvbHV0aW9uLCB0aGVyZSBhcmUgbWFyZ2lucyBhbmQgc2Nyb2xsYmFycyBhbmQgc3VjaCB0byB3b3JyeSBhYm91dCBmb3IgODB4MTJ4Mg0KK0dyYXBoaWNzIGcgPSBHcmFwaGljc0Vudmlyb25tZW50LmxvY2FsR3JhcGhpY3NFbnZpcm9ubWVudC5jcmVhdGVHcmFwaGljcyAobmV3IEJ1ZmZlcmVkSW1hZ2UoMTAwLCAxMDAsIEJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfUkdCKSkNCitGb250TWV0cmljcyBmbSA9IGcuZ2V0Rm9udE1ldHJpY3Mob3V0cHV0QXJlYS5mb250KQ0KK291dHB1dEFyZWEucHJlZmVycmVkU2l6ZSA9IFsNCisgICAgZm0uY2hhcldpZHRoKDB4NzcpICogODEsDQorICAgIChmbS5nZXRIZWlnaHQoKSArIGZtLmxlYWRpbmcpICogMTJdIGFzIERpbWVuc2lvbg0KKw0KKy8vaW5wdXRBcmVhLnNldEZvbnQob3V0cHV0QXJlYS5mb250KQ0KK2lucHV0RWRpdG9yLnByZWZlcnJlZFNpemUgPSBvdXRwdXRBcmVhLnByZWZlcnJlZFNpemUNCisNCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3VpL3ZpZXcvQmFzaWNNZW51QmFyLmdyb292eSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdWkvdmlldy9CYXNpY01lbnVCYXIuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzODE0MzMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3VpL3ZpZXcvQmFzaWNNZW51QmFyLmdyb292eQpAQCAtMCwwICsxLDYwIEBACitwYWNrYWdlIGdyb292eS51aS52aWV3DQorDQorbWVudUJhciB7DQorICAgIG1lbnUodGV4dDogJ0ZpbGUnLCBtbmVtb25pYzogJ0YnKSB7DQorICAgICAgICBtZW51SXRlbShuZXdGaWxlQWN0aW9uKQ0KKyAgICAgICAgbWVudUl0ZW0obmV3V2luZG93QWN0aW9uKQ0KKyAgICAgICAgbWVudUl0ZW0ob3BlbkFjdGlvbikNCisgICAgICAgIHNlcGFyYXRvcigpDQorICAgICAgICBtZW51SXRlbShzYXZlQWN0aW9uKQ0KKyAgICAgICAgbWVudUl0ZW0oc2F2ZUFzQWN0aW9uKQ0KKyAgICAgICAgc2VwYXJhdG9yKCkNCisgICAgICAgIG1lbnVJdGVtKHByaW50QWN0aW9uKQ0KKyAgICAgICAgc2VwYXJhdG9yKCkNCisgICAgICAgIG1lbnVJdGVtKGV4aXRBY3Rpb24pDQorICAgIH0NCisNCisgICAgbWVudSh0ZXh0OiAnRWRpdCcsIG1uZW1vbmljOiAnRScpIHsNCisgICAgICAgIG1lbnVJdGVtKHVuZG9BY3Rpb24pDQorICAgICAgICBtZW51SXRlbShyZWRvQWN0aW9uKQ0KKyAgICAgICAgc2VwYXJhdG9yKCkNCisgICAgICAgIG1lbnVJdGVtKGN1dEFjdGlvbikNCisgICAgICAgIG1lbnVJdGVtKGNvcHlBY3Rpb24pDQorICAgICAgICBtZW51SXRlbShwYXN0ZUFjdGlvbikNCisgICAgICAgIHNlcGFyYXRvcigpDQorICAgICAgICBtZW51SXRlbShmaW5kQWN0aW9uKQ0KKyAgICAgICAgbWVudUl0ZW0oZmluZE5leHRBY3Rpb24pDQorICAgICAgICBtZW51SXRlbShmaW5kUHJldmlvdXNBY3Rpb24pDQorICAgICAgICBtZW51SXRlbShyZXBsYWNlQWN0aW9uKQ0KKyAgICAgICAgc2VwYXJhdG9yKCkNCisgICAgICAgIG1lbnVJdGVtKHNlbGVjdEFsbEFjdGlvbikNCisgICAgfQ0KKw0KKyAgICBtZW51KHRleHQ6ICdWaWV3JywgbW5lbW9uaWM6ICdWJykgew0KKyAgICAgICAgbWVudUl0ZW0oY2xlYXJPdXRwdXRBY3Rpb24pDQorICAgICAgICBzZXBhcmF0b3IoKQ0KKyAgICAgICAgbWVudUl0ZW0obGFyZ2VyRm9udEFjdGlvbikNCisgICAgICAgIG1lbnVJdGVtKHNtYWxsZXJGb250QWN0aW9uKQ0KKyAgICAgICAgc2VwYXJhdG9yKCkNCisgICAgICAgIGNoZWNrQm94TWVudUl0ZW0oY2FwdHVyZVN0ZE91dEFjdGlvbiwgc2VsZWN0ZWQ6IGNvbnRyb2xsZXIuY2FwdHVyZVN0ZE91dCkNCisgICAgICAgIGNoZWNrQm94TWVudUl0ZW0oZnVsbFN0YWNrVHJhY2VzQWN0aW9uLCBzZWxlY3RlZDogY29udHJvbGxlci5mdWxsU3RhY2tUcmFjZXMpDQorICAgICAgICBjaGVja0JveE1lbnVJdGVtKHNob3dUb29sYmFyQWN0aW9uLCBzZWxlY3RlZDogY29udHJvbGxlci5zaG93VG9vbGJhcikNCisgICAgfQ0KKw0KKyAgICBtZW51KHRleHQ6ICdIaXN0b3J5JywgbW5lbW9uaWM6ICdJJykgew0KKyAgICAgICAgbWVudUl0ZW0oaGlzdG9yeVByZXZBY3Rpb24pDQorICAgICAgICBtZW51SXRlbShoaXN0b3J5TmV4dEFjdGlvbikNCisgICAgfQ0KKw0KKyAgICBtZW51KHRleHQ6ICdTY3JpcHQnLCBtbmVtb25pYzogJ1MnKSB7DQorICAgICAgICBtZW51SXRlbShydW5BY3Rpb24pDQorICAgICAgICBtZW51SXRlbShydW5TZWxlY3Rpb25BY3Rpb24pDQorICAgICAgICBzZXBhcmF0b3IoKQ0KKyAgICAgICAgbWVudUl0ZW0oaW5zcGVjdExhc3RBY3Rpb24pDQorICAgICAgICBtZW51SXRlbShpbnNwZWN0VmFyaWFibGVzQWN0aW9uKQ0KKyAgICB9DQorDQorICAgIG1lbnUodGV4dDogJ0hlbHAnLCBtbmVtb25pYzogJ0gnKSB7DQorICAgICAgICBtZW51SXRlbShhYm91dEFjdGlvbikNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3VpL3ZpZXcvQmFzaWNTdGF0dXNCYXIuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS92aWV3L0Jhc2ljU3RhdHVzQmFyLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTQ3ZGJlCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS92aWV3L0Jhc2ljU3RhdHVzQmFyLmdyb292eQpAQCAtMCwwICsxLDIyIEBACitwYWNrYWdlIGdyb292eS51aS52aWV3DQorDQoraW1wb3J0IGphdmEuYXd0LkJvcmRlckxheW91dA0KK2ltcG9ydCBqYXZhLmF3dC5HcmlkQmFnQ29uc3RyYWludHMNCitpbXBvcnQgamF2YXguc3dpbmcuU3dpbmdDb25zdGFudHMNCisNCitwYW5lbChpZDogJ3N0YXR1c1BhbmVsJywgY29uc3RyYWludHM6IEJvcmRlckxheW91dC5TT1VUSCkgew0KKyAgICBncmlkQmFnTGF5b3V0KCkNCisgICAgc2VwYXJhdG9yKGNvbnN0cmFpbnRzOmdiYyhncmlkd2lkdGg6R3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUiwgZmlsbDpHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTCkpDQorICAgIGxhYmVsKCdXZWxjb21lIHRvIEdyb292eS4nLA0KKyAgICAgICAgaWQ6ICdzdGF0dXMnLA0KKyAgICAgICAgY29uc3RyYWludHM6Z2JjKHdlaWdodHg6MS4wLA0KKyAgICAgICAgICAgIGFuY2hvcjpHcmlkQmFnQ29uc3RyYWludHMuV0VTVCwNCisgICAgICAgICAgICBmaWxsOkdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMLA0KKyAgICAgICAgICAgIGluc2V0czogWzEsMywxLDNdKQ0KKyAgICApDQorICAgIHNlcGFyYXRvcihvcmllbnRhdGlvbjpTd2luZ0NvbnN0YW50cy5WRVJUSUNBTCwgY29uc3RyYWludHM6Z2JjKGZpbGw6R3JpZEJhZ0NvbnN0cmFpbnRzLlZFUlRJQ0FMKSkNCisgICAgbGFiZWwoJzE6MScsDQorICAgICAgICBpZDogJ3Jvd051bUFuZENvbE51bScsDQorICAgICAgICBjb25zdHJhaW50czpnYmMoaW5zZXRzOiBbMSwzLDEsM10pDQorICAgICkNCit9DQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS92aWV3L0Jhc2ljVG9vbEJhci5ncm9vdnkgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3VpL3ZpZXcvQmFzaWNUb29sQmFyLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTQwMWQwCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS92aWV3L0Jhc2ljVG9vbEJhci5ncm9vdnkKQEAgLTAsMCArMSwyNSBAQAorcGFja2FnZSBncm9vdnkudWkudmlldw0KKw0KK2ltcG9ydCBqYXZheC5zd2luZy5Td2luZ0NvbnN0YW50cw0KK2ltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQNCisNCit0b29sQmFyKGlkOid0b29sYmFyJywgcm9sbG92ZXI6dHJ1ZSwgdmlzaWJsZTpjb250cm9sbGVyLnNob3dUb29sYmFyLCBjb25zdHJhaW50czpCb3JkZXJMYXlvdXQuTk9SVEgpIHsNCisgICAgYnV0dG9uKG5ld0ZpbGVBY3Rpb24sIHRleHQ6bnVsbCkNCisgICAgYnV0dG9uKG9wZW5BY3Rpb24sIHRleHQ6bnVsbCkNCisgICAgYnV0dG9uKHNhdmVBY3Rpb24sIHRleHQ6bnVsbCkNCisgICAgc2VwYXJhdG9yKG9yaWVudGF0aW9uOlN3aW5nQ29uc3RhbnRzLlZFUlRJQ0FMKQ0KKyAgICBidXR0b24odW5kb0FjdGlvbiwgdGV4dDpudWxsKQ0KKyAgICBidXR0b24ocmVkb0FjdGlvbiwgdGV4dDpudWxsKQ0KKyAgICBzZXBhcmF0b3Iob3JpZW50YXRpb246U3dpbmdDb25zdGFudHMuVkVSVElDQUwpDQorICAgIGJ1dHRvbihjdXRBY3Rpb24sIHRleHQ6bnVsbCkNCisgICAgYnV0dG9uKGNvcHlBY3Rpb24sIHRleHQ6bnVsbCkNCisgICAgYnV0dG9uKHBhc3RlQWN0aW9uLCB0ZXh0Om51bGwpDQorICAgIHNlcGFyYXRvcihvcmllbnRhdGlvbjpTd2luZ0NvbnN0YW50cy5WRVJUSUNBTCkNCisgICAgYnV0dG9uKGZpbmRBY3Rpb24sIHRleHQ6bnVsbCkNCisgICAgYnV0dG9uKHJlcGxhY2VBY3Rpb24sIHRleHQ6bnVsbCkNCisgICAgc2VwYXJhdG9yKG9yaWVudGF0aW9uOlN3aW5nQ29uc3RhbnRzLlZFUlRJQ0FMKQ0KKyAgICBidXR0b24oaGlzdG9yeVByZXZBY3Rpb24sIHRleHQ6bnVsbCkNCisgICAgYnV0dG9uKGhpc3RvcnlOZXh0QWN0aW9uLCB0ZXh0Om51bGwpDQorICAgIHNlcGFyYXRvcihvcmllbnRhdGlvbjpTd2luZ0NvbnN0YW50cy5WRVJUSUNBTCkNCisgICAgYnV0dG9uKHJ1bkFjdGlvbiwgdGV4dDpudWxsKQ0KK30NCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3VpL3ZpZXcvRGVmYXVsdHMuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS92aWV3L0RlZmF1bHRzLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjRhYWM2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS92aWV3L0RlZmF1bHRzLmdyb292eQpAQCAtMCwwICsxLDU4IEBACitwYWNrYWdlIGdyb292eS51aS52aWV3DQorDQoraW1wb3J0IGdyb292eS51aS50ZXh0Lkdyb292eUZpbHRlcg0KK2ltcG9ydCBqYXZhLmF3dC5Db2xvcg0KK2ltcG9ydCBqYXZheC5zd2luZy50ZXh0LlN0eWxlQ29uc3RhbnRzDQoraW1wb3J0IGphdmF4LnN3aW5nLnRleHQuU3R5bGVDb250ZXh0DQorDQorbWVudUJhckNsYXNzICAgICA9IGdyb292eS51aS52aWV3LkJhc2ljTWVudUJhcg0KK2NvbnRlbnRQYW5lQ2xhc3MgPSBncm9vdnkudWkudmlldy5CYXNpY0NvbnRlbnRQYW5lDQordG9vbEJhckNsYXNzICAgICA9IGdyb292eS51aS52aWV3LkJhc2ljVG9vbEJhcg0KK3N0YXR1c0JhckNsYXNzICAgPSBncm9vdnkudWkudmlldy5CYXNpY1N0YXR1c0Jhcg0KKw0KK3N0eWxlcyA9IFsNCisgICAgLy8gb3V0cHV0IHdpbmRvdyBzdHlsZXMNCisgICAgcmVndWxhcjogWw0KKyAgICAgICAgICAgIChTdHlsZUNvbnN0YW50cy5Gb250RmFtaWx5KTogJ01vbm9zcGFjZWQnLA0KKyAgICAgICAgXSwNCisgICAgcHJvbXB0OiBbDQorICAgICAgICAgICAgKFN0eWxlQ29uc3RhbnRzLkZvcmVncm91bmQpOiBuZXcgQ29sb3IoMCwgMTI4LCAwKSwNCisgICAgICAgIF0sDQorICAgIGNvbW1hbmQ6IFsNCisgICAgICAgICAgICAoU3R5bGVDb25zdGFudHMuRm9yZWdyb3VuZCk6IENvbG9yLkJMVUUsDQorICAgICAgICBdLA0KKyAgICBvdXRwdXQ6IFs6XSwNCisgICAgcmVzdWx0OiBbDQorICAgICAgICAgICAgKFN0eWxlQ29uc3RhbnRzLkZvcmVncm91bmQpOiBDb2xvci5CTFVFLA0KKyAgICAgICAgICAgIChTdHlsZUNvbnN0YW50cy5CYWNrZ3JvdW5kKTogQ29sb3IuWUVMTE9XLA0KKyAgICAgICAgXSwNCisNCisgICAgLy8gc3ludGF4IGhpZ2hsaWdodGluZyBzdHlsZXMNCisgICAgKFN0eWxlQ29udGV4dC5ERUZBVUxUX1NUWUxFKSA6IFsNCisgICAgICAgICAgICAoU3R5bGVDb25zdGFudHMuRm9udEZhbWlseSk6ICdNb25vc3BhY2VkJywNCisgICAgICAgIF0sDQorICAgIChHcm9vdnlGaWx0ZXIuQ09NTUVOVCk6IFsNCisgICAgICAgICAgICAoU3R5bGVDb25zdGFudHMuRm9yZWdyb3VuZCk6IENvbG9yLkxJR0hUX0dSQVkuZGFya2VyKCkuZGFya2VyKCksDQorICAgICAgICAgICAgKFN0eWxlQ29uc3RhbnRzLkl0YWxpYykgOiB0cnVlLA0KKyAgICAgICAgXSwNCisgICAgKEdyb292eUZpbHRlci5RVU9URVMpOiBbDQorICAgICAgICAgICAgKFN0eWxlQ29uc3RhbnRzLkZvcmVncm91bmQpOiBDb2xvci5NQUdFTlRBLmRhcmtlcigpLmRhcmtlcigpLA0KKyAgICAgICAgXSwNCisgICAgKEdyb292eUZpbHRlci5TSU5HTEVfUVVPVEVTKTogWw0KKyAgICAgICAgICAgIChTdHlsZUNvbnN0YW50cy5Gb3JlZ3JvdW5kKTogQ29sb3IuR1JFRU4uZGFya2VyKCkuZGFya2VyKCksDQorICAgICAgICBdLA0KKyAgICAoR3Jvb3Z5RmlsdGVyLlNMQVNIWV9RVU9URVMpOiBbDQorICAgICAgICAgICAgKFN0eWxlQ29uc3RhbnRzLkZvcmVncm91bmQpOiBDb2xvci5PUkFOR0UuZGFya2VyKCksDQorICAgICAgICBdLA0KKyAgICAoR3Jvb3Z5RmlsdGVyLkRJR0lUKTogWw0KKyAgICAgICAgICAgIChTdHlsZUNvbnN0YW50cy5Gb3JlZ3JvdW5kKTogQ29sb3IuUkVELmRhcmtlcigpLA0KKyAgICAgICAgXSwNCisgICAgKEdyb292eUZpbHRlci5PUEVSQVRJT04pOiBbDQorICAgICAgICAgICAgKFN0eWxlQ29uc3RhbnRzLkJvbGQpOiB0cnVlLA0KKyAgICAgICAgXSwNCisgICAgKEdyb292eUZpbHRlci5JREVOVCk6IFs6XSwNCisgICAgKEdyb292eUZpbHRlci5SRVNFUlZFRF9XT1JEKTogWw0KKyAgICAgICAgKFN0eWxlQ29uc3RhbnRzLkJvbGQpOiB0cnVlLA0KKyAgICAgICAgKFN0eWxlQ29uc3RhbnRzLkZvcmVncm91bmQpOiBDb2xvci5CTFVFLmRhcmtlcigpLmRhcmtlcigpLA0KKyAgICBdLA0KK10NCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3VpL3ZpZXcvR1RLRGVmYXVsdHMuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS92aWV3L0dUS0RlZmF1bHRzLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Yzc4NDlhCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS92aWV3L0dUS0RlZmF1bHRzLmdyb292eQpAQCAtMCwwICsxLDU0IEBACitwYWNrYWdlIGdyb292eS51aS52aWV3CisKK2ltcG9ydCBqYXZheC5zd2luZy5KQ29tcG9uZW50CitpbXBvcnQgamF2YXguc3dpbmcudGV4dC5TdHlsZUNvbnN0YW50cworaW1wb3J0IGphdmF4LnN3aW5nLnRleHQuU3R5bGVDb250ZXh0CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLkludm9rZXJIZWxwZXIKKworYnVpbGQoRGVmYXVsdHMpCisKKy8vIGNoYW5nZSBmb250IHRvIERlamFWdSBTYW5zIE1vbm8sIG11Y2ggY2xlYXJlcgorc3R5bGVzLnJlZ3VsYXJbU3R5bGVDb25zdGFudHMuRm9udEZhbWlseV0gPSAnRGVqYVZ1IFNhbnMgTW9ubycKK3N0eWxlc1tTdHlsZUNvbnRleHQuREVGQVVMVF9TVFlMRV1bU3R5bGVDb25zdGFudHMuRm9udEZhbWlseV0gPSAnRGVqYVZ1IFNhbnMgTW9ubycKKworLy8gcG9zc2libHkgY2hhbmdlIGxvb2sgYW5kIGZlZWwKK2lmIChTeXN0ZW0ucHJvcGVydGllc1snamF2YS52ZXJzaW9uJ10gPX4gL14xXC41LykgeworICAgIC8vIEdUSyB3YXNuJ3Qgd2hlcmUgaXQgbmVlZGVkIHRvIGJlIGluIDEuNSwgZXNwZWNpYWxseSB3aXRoIHRvb2xiYXJzCisgICAgLy8gdXNlIG1ldGFsIGluc3RlYWQKKyAgICBsb29rQW5kRmVlbCgnbWV0YWwnLCBib2xkRm9udHM6ZmFsc2UpCisgICAgCisgICAgLy8gd2UgYWxzbyBuZWVkIHRvIHR1cm4gb24gYW50aS1hbGlzaW5nIG91cnNlbHZlcworICAgIGtleSA9IEludm9rZXJIZWxwZXIuZ2V0UHJvcGVydHkoJ2NvbS5zdW4uamF2YS5zd2luZy5Td2luZ1V0aWxpdGllczInIGFzIENsYXNzLAorICAgICAgICAnQUFfVEVYVF9QUk9QRVJUWV9LRVknKQorICAgIGFkZEF0dHJpYnV0ZURlbGVnYXRlIHtidWlsZGVyLCBub2RlLCBhdHRyaWJ1dGVzIC0+CisgICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgSkNvbXBvbmVudCkgeworICAgICAgICAgICAgbm9kZS5wdXRDbGllbnRQcm9wZXJ0eShrZXksIG5ldyBCb29sZWFuKHRydWUpKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gc29tZSBjdXJyZW50IGRpc3Ryb3MgKFVidW50dSA3LjEwKSBoYXZlIGJyb2tlbiBwcmludGluZyBzdXBwb3J0IDooCisvLyBkZXRlY3QgaXQgYW5kIGRpc2FibGUgaXQKK3RyeSB7CisgICAgcGogPSBqYXZhLmF3dC5wcmludC5QcmludGVySm9iLmdldFByaW50ZXJKb2IoKQorICAgIHBzID0gcGouZ2V0UHJpbnRTZXJ2aWNlKCkKKyAgICBwcy5nZXRBdHRyaWJ1dGVzKCkKKyAgICBkb2NGbGF2ICA9IChwcy5nZXRTdXBwb3J0ZWREb2NGbGF2b3JzKCkgYXMgTGlzdCkuZmluZCB7aXQubWltZVR5cGUgPT0gJ2FwcGxpY2F0aW9uL3ZuZC5jdXBzLXBvc3RzY3JpcHQnIH0KKyAgICBhdHRyc2V0ID0gcHMuZ2V0QXR0cmlidXRlcygpCisgICAgb3JpZW50ID0gYXR0cnNldC5nZXQoamF2YXgucHJpbnQuYXR0cmlidXRlLnN0YW5kYXJkLk9yaWVudGF0aW9uUmVxdWVzdGVkKSA/OiAKKyAgICAgICAgICAgICBwcy5nZXREZWZhdWx0QXR0cmlidXRlVmFsdWUoamF2YXgucHJpbnQuYXR0cmlidXRlLnN0YW5kYXJkLk9yaWVudGF0aW9uUmVxdWVzdGVkKQorICAgIHBzLmlzQXR0cmlidXRlVmFsdWVTdXBwb3J0ZWQob3JpZW50LCBkb2NGbGF2LCBhdHRyc2V0KQorfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gbnBlKSB7CisgICAgLy9wcmludCB3aWxsIGJvbWIgb3V0Li4uIHJlcGxhY2Ugd2l0aCBkaXNhYmxlZCBwcmludCBhY3Rpb24KKyAgICBhY3Rpb24oaWQ6ICdwcmludEFjdGlvbicsDQorICAgICAgICBuYW1lOiAnUHJpbnQuLi4nLAorICAgICAgICBjbG9zdXJlOiBjb250cm9sbGVyLiZwcmludCwNCisgICAgICAgIG1uZW1vbmljOiAnUCcsDQorICAgICAgICBhY2NlbGVyYXRvcjogc2hvcnRjdXQoJ1AnKSwNCisgICAgICAgIHNob3J0RGVzY3JpcHRpb246ICdQcmludGluZyBkb2VzIG5vdCB3b3JrIGluIEphdmEgd2l0aCB0aGlzIHZlcnNpb24gb2YgQ1VQUycsDQorICAgICAgICBlbmFibGVkOiBmYWxzZQ0KKyAgICApDQorfQorCisKKwpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS92aWV3L01hY09TWERlZmF1bHRzLmdyb292eSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdWkvdmlldy9NYWNPU1hEZWZhdWx0cy5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ2YmI5ZQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdWkvdmlldy9NYWNPU1hEZWZhdWx0cy5ncm9vdnkKQEAgLTAsMCArMSw1OCBAQAorcGFja2FnZSBncm9vdnkudWkudmlldw0KKw0KK2ltcG9ydCBncm9vdnkudWkudGV4dC5Hcm9vdnlGaWx0ZXINCitpbXBvcnQgamF2YS5hd3QuQ29sb3INCitpbXBvcnQgamF2YXguc3dpbmcudGV4dC5TdHlsZUNvbnN0YW50cw0KKw0KK2J1aWxkKERlZmF1bHRzKQ0KKw0KKy8vIG1lbnUgYmFyIHR3ZWFrcw0KK1N5c3RlbS5zZXRQcm9wZXJ0eSgiYXBwbGUubGFmLnVzZVNjcmVlbk1lbnVCYXIiLCAidHJ1ZSIpDQorU3lzdGVtLnNldFByb3BlcnR5KCJjb20uYXBwbGUubXJqLmFwcGxpY2F0aW9uLmFwcGxlLm1lbnUuYWJvdXQubmFtZSIsICJHcm9vdnlDb25zb2xlIikNCisNCisvLyByZWRvIG91dHB1dCBzdHlsZXMNCitzdHlsZXMgPSBbDQorICAgIC8vIG91dHB1dCB3aW5kb3cgc3R5bGVzDQorICAgIHJlZ3VsYXI6IFsNCisgICAgICAgICAgICAoU3R5bGVDb25zdGFudHMuRm9udEZhbWlseSk6ICJNb25hY28iLA0KKyAgICAgICAgXSwNCisgICAgcHJvbXB0OiBbDQorICAgICAgICAgICAgKFN0eWxlQ29uc3RhbnRzLkZvcmVncm91bmQpOiBDb2xvci5MSUdIVF9HUkFZLA0KKyAgICAgICAgXSwNCisgICAgY29tbWFuZDogWw0KKyAgICAgICAgICAgIChTdHlsZUNvbnN0YW50cy5Gb3JlZ3JvdW5kKTogQ29sb3IuR1JBWSwNCisgICAgICAgIF0sDQorICAgIG91dHB1dDogWzpdLA0KKyAgICByZXN1bHQ6IFsNCisgICAgICAgICAgICAoU3R5bGVDb25zdGFudHMuRm9yZWdyb3VuZCk6IENvbG9yLldISVRFLA0KKyAgICAgICAgICAgIChTdHlsZUNvbnN0YW50cy5CYWNrZ3JvdW5kKTogQ29sb3IuQkxBQ0ssDQorICAgICAgICBdLA0KKw0KKyAgICAvLyBzeW50YXggaGlnaGxpZ2h0aW5nIHN0eWxlcw0KKyAgICAoR3Jvb3Z5RmlsdGVyLkNPTU1FTlQpOiBbDQorICAgICAgICAgICAgKFN0eWxlQ29uc3RhbnRzLkZvcmVncm91bmQpOiBDb2xvci5MSUdIVF9HUkFZLmRhcmtlcigpLmRhcmtlcigpLA0KKyAgICAgICAgICAgIChTdHlsZUNvbnN0YW50cy5JdGFsaWMpIDogdHJ1ZSwNCisgICAgICAgIF0sDQorICAgIChHcm9vdnlGaWx0ZXIuUVVPVEVTKTogWw0KKyAgICAgICAgICAgIChTdHlsZUNvbnN0YW50cy5Gb3JlZ3JvdW5kKTogQ29sb3IuTUFHRU5UQS5kYXJrZXIoKS5kYXJrZXIoKSwNCisgICAgICAgIF0sDQorICAgIChHcm9vdnlGaWx0ZXIuU0lOR0xFX1FVT1RFUyk6IFsNCisgICAgICAgICAgICAoU3R5bGVDb25zdGFudHMuRm9yZWdyb3VuZCk6IENvbG9yLkdSRUVOLmRhcmtlcigpLmRhcmtlcigpLA0KKyAgICAgICAgXSwNCisgICAgKEdyb292eUZpbHRlci5TTEFTSFlfUVVPVEVTKTogWw0KKyAgICAgICAgICAgIChTdHlsZUNvbnN0YW50cy5Gb3JlZ3JvdW5kKTogQ29sb3IuT1JBTkdFLmRhcmtlcigpLA0KKyAgICAgICAgXSwNCisgICAgKEdyb292eUZpbHRlci5ESUdJVCk6IFsNCisgICAgICAgICAgICAoU3R5bGVDb25zdGFudHMuRm9yZWdyb3VuZCk6IENvbG9yLlJFRC5kYXJrZXIoKSwNCisgICAgICAgIF0sDQorICAgIChHcm9vdnlGaWx0ZXIuT1BFUkFUSU9OKTogWw0KKyAgICAgICAgICAgIChTdHlsZUNvbnN0YW50cy5Cb2xkKTogdHJ1ZSwNCisgICAgICAgIF0sDQorICAgIChHcm9vdnlGaWx0ZXIuSURFTlQpOiBbOl0sDQorICAgIChHcm9vdnlGaWx0ZXIuUkVTRVJWRURfV09SRCk6IFsNCisgICAgICAgIChTdHlsZUNvbnN0YW50cy5Cb2xkKTogdHJ1ZSwNCisgICAgICAgIChTdHlsZUNvbnN0YW50cy5Gb3JlZ3JvdW5kKTogQ29sb3IuQkxVRS5kYXJrZXIoKS5kYXJrZXIoKSwNCisgICAgXSwNCitdDQorDQorbWVudUJhckNsYXNzID0gTWFjT1NYTWVudUJhcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdWkvdmlldy9NYWNPU1hNZW51QmFyLmdyb292eSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdWkvdmlldy9NYWNPU1hNZW51QmFyLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjdiZjdiCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS92aWV3L01hY09TWE1lbnVCYXIuZ3Jvb3Z5CkBAIC0wLDAgKzEsODUgQEAKK3BhY2thZ2UgZ3Jvb3Z5LnVpLnZpZXcNCisNCittZW51QmFyIHsNCisgICAgbWVudSh0ZXh0OiAnRmlsZScsIG1uZW1vbmljOiAnRicpIHsNCisgICAgICAgIG1lbnVJdGVtKG5ld0ZpbGVBY3Rpb24sIGljb246bnVsbCkNCisgICAgICAgIG1lbnVJdGVtKG5ld1dpbmRvd0FjdGlvbiwgaWNvbjpudWxsKQ0KKyAgICAgICAgbWVudUl0ZW0ob3BlbkFjdGlvbiwgaWNvbjpudWxsKQ0KKyAgICAgICAgc2VwYXJhdG9yKCkNCisgICAgICAgIG1lbnVJdGVtKHNhdmVBY3Rpb24sIGljb246bnVsbCkNCisgICAgICAgIG1lbnVJdGVtKHNhdmVBc0FjdGlvbiwgaWNvbjpudWxsKQ0KKyAgICAgICAgc2VwYXJhdG9yKCkNCisgICAgICAgIG1lbnVJdGVtKHByaW50QWN0aW9uLCBpY29uOm51bGwpDQorICAgIH0NCisNCisgICAgbWVudSh0ZXh0OiAnRWRpdCcsIG1uZW1vbmljOiAnRScpIHsNCisgICAgICAgIG1lbnVJdGVtKHVuZG9BY3Rpb24sIGljb246bnVsbCkNCisgICAgICAgIG1lbnVJdGVtKHJlZG9BY3Rpb24sIGljb246bnVsbCkNCisgICAgICAgIHNlcGFyYXRvcigpDQorICAgICAgICBtZW51SXRlbShjdXRBY3Rpb24sIGljb246bnVsbCkNCisgICAgICAgIG1lbnVJdGVtKGNvcHlBY3Rpb24sIGljb246bnVsbCkNCisgICAgICAgIG1lbnVJdGVtKHBhc3RlQWN0aW9uLCBpY29uOm51bGwpDQorICAgICAgICBzZXBhcmF0b3IoKQ0KKyAgICAgICAgbWVudUl0ZW0oZmluZEFjdGlvbiwgaWNvbjpudWxsKQ0KKyAgICAgICAgbWVudUl0ZW0oZmluZE5leHRBY3Rpb24sIGljb246bnVsbCkNCisgICAgICAgIG1lbnVJdGVtKGZpbmRQcmV2aW91c0FjdGlvbiwgaWNvbjpudWxsKQ0KKyAgICAgICAgbWVudUl0ZW0ocmVwbGFjZUFjdGlvbiwgaWNvbjpudWxsKQ0KKyAgICAgICAgc2VwYXJhdG9yKCkNCisgICAgICAgIG1lbnVJdGVtKHNlbGVjdEFsbEFjdGlvbiwgaWNvbjpudWxsKQ0KKyAgICB9DQorDQorICAgIG1lbnUodGV4dDogJ1ZpZXcnLCBtbmVtb25pYzogJ1YnKSB7DQorICAgICAgICBtZW51SXRlbShjbGVhck91dHB1dEFjdGlvbiwgaWNvbjpudWxsKQ0KKyAgICAgICAgc2VwYXJhdG9yKCkNCisgICAgICAgIG1lbnVJdGVtKGxhcmdlckZvbnRBY3Rpb24sIGljb246bnVsbCkNCisgICAgICAgIG1lbnVJdGVtKHNtYWxsZXJGb250QWN0aW9uLCBpY29uOm51bGwpDQorICAgICAgICBzZXBhcmF0b3IoKQ0KKyAgICAgICAgY2hlY2tCb3hNZW51SXRlbShjYXB0dXJlU3RkT3V0QWN0aW9uLCBzZWxlY3RlZDogY29udHJvbGxlci5jYXB0dXJlU3RkT3V0KQ0KKyAgICAgICAgY2hlY2tCb3hNZW51SXRlbShmdWxsU3RhY2tUcmFjZXNBY3Rpb24sIHNlbGVjdGVkOiBjb250cm9sbGVyLmZ1bGxTdGFja1RyYWNlcykNCisgICAgICAgIGNoZWNrQm94TWVudUl0ZW0oc2hvd1Rvb2xiYXJBY3Rpb24sIHNlbGVjdGVkOiBjb250cm9sbGVyLnNob3dUb29sYmFyKQ0KKyAgICB9DQorDQorICAgIG1lbnUodGV4dDogJ0hpc3RvcnknLCBtbmVtb25pYzogJ0knKSB7DQorICAgICAgICBtZW51SXRlbShoaXN0b3J5UHJldkFjdGlvbiwgaWNvbjpudWxsKQ0KKyAgICAgICAgbWVudUl0ZW0oaGlzdG9yeU5leHRBY3Rpb24sIGljb246bnVsbCkNCisgICAgfQ0KKw0KKyAgICBtZW51KHRleHQ6ICdTY3JpcHQnLCBtbmVtb25pYzogJ1MnKSB7DQorICAgICAgICBtZW51SXRlbShydW5BY3Rpb24sIGljb246bnVsbCkNCisgICAgICAgIG1lbnVJdGVtKHJ1blNlbGVjdGlvbkFjdGlvbiwgaWNvbjpudWxsKQ0KKyAgICAgICAgc2VwYXJhdG9yKCkNCisgICAgICAgIG1lbnVJdGVtKGluc3BlY3RMYXN0QWN0aW9uLCBpY29uOm51bGwpDQorICAgICAgICBtZW51SXRlbShpbnNwZWN0VmFyaWFibGVzQWN0aW9uLCBpY29uOm51bGwpDQorICAgIH0NCit9DQorDQorc3RhdGljIGhhbmRsZXIgPSBmYWxzZQ0KK2lmICghaGFuZGxlcikgew0KKw0KK2hhbmRsZXIgPSBidWlsZCgiIiINCitwYWNrYWdlIGdyb292eS51aQ0KKw0KK2ltcG9ydCBjb20uYXBwbGUubXJqLioNCisNCitjbGFzcyBDb25zb2xlTWFjT3NTdXBwb3J0IGltcGxlbWVudHMgTVJKUXVpdEhhbmRsZXIsIE1SSkFib3V0SGFuZGxlciB7DQorDQorCWRlZiBxdWl0SGFuZGxlcg0KKwlkZWYgYWJvdXRIYW5kbGVyDQorDQorCXB1YmxpYyB2b2lkIGhhbmRsZUFib3V0KCkgew0KKwkJYWJvdXRIYW5kbGVyKCkNCisJfQ0KKw0KKwlwdWJsaWMgdm9pZCBoYW5kbGVRdWl0KCkgew0KKwkJcXVpdEhhbmRsZXIoKQ0KKwl9DQorDQorfQ0KKw0KK2RlZiBoYW5kbGVyID0gbmV3IENvbnNvbGVNYWNPc1N1cHBvcnQocXVpdEhhbmRsZXI6Y29udHJvbGxlci4mZXhpdCwgYWJvdXRIYW5kbGVyOmNvbnRyb2xsZXIuJnNob3dBYm91dCkNCitNUkpBcHBsaWNhdGlvblV0aWxzLnJlZ2lzdGVyQWJvdXRIYW5kbGVyKGhhbmRsZXIpDQorTVJKQXBwbGljYXRpb25VdGlscy5yZWdpc3RlclF1aXRIYW5kbGVyKGhhbmRsZXIpDQorDQorcmV0dXJuIGhhbmRsZXINCisiIiIsIG5ldyBHcm9vdnlDbGFzc0xvYWRlcih0aGlzLmNsYXNzLmNsYXNzTG9hZGVyKSkNCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS92aWV3L1dpbmRvd3NEZWZhdWx0cy5ncm9vdnkgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3VpL3ZpZXcvV2luZG93c0RlZmF1bHRzLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDdjNWIxCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91aS92aWV3L1dpbmRvd3NEZWZhdWx0cy5ncm9vdnkKQEAgLTAsMCArMSwyNiBAQAorcGFja2FnZSBncm9vdnkudWkudmlldw0KKw0KK2ltcG9ydCBqYXZheC5zd2luZy5KQ29tcG9uZW50DQoraW1wb3J0IGphdmF4LnN3aW5nLnRleHQuU3R5bGVDb25zdGFudHMNCitpbXBvcnQgamF2YXguc3dpbmcudGV4dC5TdHlsZUNvbnRleHQNCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLkludm9rZXJIZWxwZXINCisNCitidWlsZChEZWZhdWx0cykNCisNCisvLyBjaGFuZ2UgZm9udHMgZm9yIHZpc3RhDQoraWYgKChTeXN0ZW0ucHJvcGVydGllc1snb3MudmVyc2lvbiddIGFzIEZsb2F0KSA+PSA2LjApIHsNCisgICAgLy8gVmlzdGEvU2VydmVyIDIwMDggb3IgbGF0ZXINCisgICAgc3R5bGVzLnJlZ3VsYXJbU3R5bGVDb25zdGFudHMuRm9udEZhbWlseV0gPSAnQ29uc29sYXMnDQorICAgIHN0eWxlc1tTdHlsZUNvbnRleHQuREVGQVVMVF9TVFlMRV1bU3R5bGVDb25zdGFudHMuRm9udEZhbWlseV0gPSAnQ29uc29sYXMnDQorDQorICAgIC8vIGluIEpESyAxLjUgd2UgbmVlZCB0byB0dXJuIG9uIGFudGktYWxpYXNpbmcgc28gY29uc29sYXMgbG9va3MgYmV0dGVyDQorICAgIGlmIChTeXN0ZW0ucHJvcGVydGllc1snamF2YS52ZXJzaW9uJ10gPX4gL14xXC41Lykgew0KKyAgICAgICAga2V5ID0gSW52b2tlckhlbHBlci5nZXRQcm9wZXJ0eSgnY29tLnN1bi5qYXZhLnN3aW5nLlN3aW5nVXRpbGl0aWVzMicgYXMgQ2xhc3MsDQorICAgICAgICAgICAgJ0FBX1RFWFRfUFJPUEVSVFlfS0VZJykNCisgICAgICAgIGFkZEF0dHJpYnV0ZURlbGVnYXRlIHtidWlsZGVyLCBub2RlLCBhdHRyaWJ1dGVzIC0+DQorICAgICAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBKQ29tcG9uZW50KSB7DQorICAgICAgICAgICAgICAgIG5vZGUucHV0Q2xpZW50UHJvcGVydHkoa2V5LCBuZXcgQm9vbGVhbih0cnVlKSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdXRpbC9BYnN0cmFjdEZhY3RvcnkuamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdXRpbC9BYnN0cmFjdEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzVkNjEwCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91dGlsL0Fic3RyYWN0RmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qDQorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorcGFja2FnZSBncm9vdnkudXRpbDsNCisNCitpbXBvcnQgamF2YS51dGlsLk1hcDsNCisNCisvKioNCisgKiBAYXV0aG9yIEFuZHJlcyBBbG1pcmF5IDxhYWxtaXJheUB1c2Vycy5zb3VyY2Vmb3JnZS5jb20+DQorICovIA0KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEZhY3RvcnkgaW1wbGVtZW50cyBGYWN0b3J5IHsNCisgICAgcHVibGljIGJvb2xlYW4gaXNMZWFmKCkgew0KKyAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIG9uSGFuZGxlTm9kZUF0dHJpYnV0ZXMoIEZhY3RvcnlCdWlsZGVyU3VwcG9ydCBidWlsZGVyLCBPYmplY3Qgbm9kZSwNCisgICAgICAgICAgICBNYXAgYXR0cmlidXRlcyApIHsNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIG9uTm9kZUNvbXBsZXRlZCggRmFjdG9yeUJ1aWxkZXJTdXBwb3J0IGJ1aWxkZXIsIE9iamVjdCBwYXJlbnQsIE9iamVjdCBub2RlICkgew0KKw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudCggRmFjdG9yeUJ1aWxkZXJTdXBwb3J0IGJ1aWxkZXIsIE9iamVjdCBwYXJlbnQsIE9iamVjdCBjaGlsZCApIHsNCisNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXRDaGlsZCggRmFjdG9yeUJ1aWxkZXJTdXBwb3J0IGJ1aWxkZXIsIE9iamVjdCBwYXJlbnQsIE9iamVjdCBjaGlsZCApIHsNCisNCisgICAgfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvQWxsVGVzdFN1aXRlLmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvQWxsVGVzdFN1aXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ2NDMxYgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdXRpbC9BbGxUZXN0U3VpdGUuamF2YQpAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgZ3Jvb3Z5LnV0aWw7CisKK2ltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlDbGFzc0xvYWRlcjsKK2ltcG9ydCBncm9vdnkubGFuZy5TY3JpcHQ7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLlNjcmlwdFRlc3RBZGFwdGVyOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLyoqCisgKiBBbGxUZXN0U3VpdGUgY2FuIGJlIHVzZWQgaW4gZXh0ZW5zaW9uIG9mIEdyb292eVRlc3RTdWl0ZSB0byBleGVjdXRlIFRlc3RDYXNlcyB3cml0dGVuIGluIEdyb292eQorICogZnJvbSBpbnNpZGUgYSBKYXZhIElERS4KKyAqIEFsbFRlc3RTdWl0ZSBjb2xsZWN0cyBhbGwgZmlsZXMgYmVsb3cgYSBnaXZlbiBkaXJlY3RvcnkgdGhhdCBjb21wbHkgdG8gYSBnaXZlbiBwYXR0ZXJuLgorICogRnJvbSB0aGVzZSBmaWxlcywgYSBUZXN0U3VpdGUgaXMgY29uc3RydWN0ZWQgdGhhdCBjYW4gYmUgcnVuIHZpYSBhbiBJREUgZ3JhcGhpY2FsIFRlc3QgcnVubmVyLgorICogVGhlIGZpbGVzIGFyZSBhc3N1bWVkIHRvIGJlIEdyb292eSBzb3VyY2UgZmlsZXMgYW5kIGJlIGVpdGhlciBhIFRlc3RDYXNlIG9yIGEgU2NyaXB0IHRoYXQgY2FuCisgKiBiZSB3cmFwcGVkIHRyYW5zcGFyZW50bHkgaW50byBhIFRlc3RDYXNlLgorICogVGhlIGRpcmVjdG9yeSBhbmQgdGhlIHBhdHRlcm4gY2FuIGJlIHNldCB2aWEgU3lzdGVtIHByb3BlcnRpZXMgKHNlZSB0aGlzIGNsYXNzZXMnIGNvbnN0YW50cyBmb3IgZGV0YWlscy4pCisgKgorICogV2hlbiBzZXR0aW5nIHRoZSBsb2dsZXZlbCBvZiB0aGlzIGNsYXNzIHRvIEZJTkVTVCwgYWxsIGZpbGUgbG9hZGluZyB3aWxsIGJlIGxvZ2dlZC4KKyAqCisgKiBTZWUgYWxzbyBncm9vdnkudXRpbC5BbGxUZXN0U3VpdGVUZXN0Lmdyb292eQorICogQGF1dGhvciBEaWVyayBLb2VuaWcgYmFzZWQgb24gYSBwcm90b3R5cGUgYnkgQW5kcmV3IEdsb3ZlcgorICogQGF1dGhvciBQYXVsIEtpbmcKKyAqIHRvZG86IGRrOiBtYWtlIEZpbGVOYW1lRmluZGVyIGluamVjdGFibGUKKyAqLworcHVibGljIGNsYXNzIEFsbFRlc3RTdWl0ZSBleHRlbmRzIFRlc3RTdWl0ZSB7CisKKyAgICAvKiogVGhlIFN5c3RlbSBQcm9wZXJ0eSB0byBzZXQgYXMgYmFzZSBkaXJlY3RvcnkgZm9yIGNvbGxlY3Rpb24gb2YgVGVzdCBDYXNlcy4KKyAgICAgKiBUaGUgcGF0dGVybiB3aWxsIGJlIHVzZWQgYXMgYW4gQW50IGZpbGVzZXQgaW5jbHVkZSBiYXNlZGlyLgorICAgICAqIEtleSBpcyAiZ3Jvb3Z5LnRlc3QuZGlyIi4KKyAgICAgKiBEZWZhdWx0IHZhbHVlIGlzICIuL3Rlc3QvIi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWVNQUk9QX1RFU1RfRElSID0gImdyb292eS50ZXN0LmRpciI7CisKKyAgICAvKiogVGhlIFN5c3RlbSBQcm9wZXJ0eSB0byBzZXQgYXMgdGhlIGZpbGVuYW1lIHBhdHRlcm4gZm9yIGNvbGxlY3Rpb24gb2YgVGVzdCBDYXNlcy4KKyAgICAgKiBUaGUgcGF0dGVybiB3aWxsIGJlIHVzZWQgYXMgUmVndWxhciBFeHByZXNzaW9uIHBhdHRlcm4gYXBwbGllZCB3aXRoIHRoZSBmaW5kCisgICAgICogb3BlcmF0b3IgYWdhaW5zdCBlYWNoIGNhbmRpZGF0ZSBmaWxlLnBhdGguCisgICAgICogS2V5IGlzICJncm9vdnkudGVzdC5wYXR0ZXJuIi4KKyAgICAgKiBEZWZhdWx0IHZhbHVlIGlzICJUZXN0Lmdyb292eSIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lTUFJPUF9URVNUX1BBVFRFUk4gPSAiZ3Jvb3Z5LnRlc3QucGF0dGVybiI7CisKKyAgICAvKiogVGhlIFN5c3RlbSBQcm9wZXJ0eSB0byBzZXQgYXMgYSBmaWxlbmFtZSBleGNsdWRlcyBwYXR0ZXJuIGZvciBjb2xsZWN0aW9uIG9mIFRlc3QgQ2FzZXMuCisgICAgICogV2hlbiBub24tZW1wdHksIHRoZSBwYXR0ZXJuIHdpbGwgYmUgdXNlZCBhcyBSZWd1bGFyIEV4cHJlc3Npb24gcGF0dGVybiBhcHBsaWVkIHdpdGggdGhlCisgICAgICogZmluZCBvcGVyYXRvciBhZ2FpbnN0IGVhY2ggY2FuZGlkYXRlIGZpbGUucGF0aC4KKyAgICAgKiBLZXkgaXMgImdyb292eS50ZXN0LmV4Y2x1ZGVzUGF0dGVybiIuCisgICAgICogRGVmYXVsdCB2YWx1ZSBpcyAiIi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWVNQUk9QX1RFU1RfRVhDTFVERVNfUEFUVEVSTiA9ICJncm9vdnkudGVzdC5leGNsdWRlc1BhdHRlcm4iOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoQWxsVGVzdFN1aXRlLmNsYXNzLmdldE5hbWUoKSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3NMb2FkZXIgSkFWQV9MT0FERVIgPSBBbGxUZXN0U3VpdGUuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBHcm9vdnlDbGFzc0xvYWRlciBHUk9PVllfTE9BREVSID0gbmV3IEdyb292eUNsYXNzTG9hZGVyKEpBVkFfTE9BREVSKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVNUFRZX0FSR1MgPSBuZXcgU3RyaW5nW117fTsKKyAgICBwcml2YXRlIHN0YXRpYyBJRmlsZU5hbWVGaW5kZXIgZmluZGVyID0gbnVsbDsKKworICAgIHN0YXRpYyB7IC8vIHRoaXMgaXMgb25seSBuZWVkZWQgc2luY2UgdGhlIEdyb292eSBCdWlsZCBjb21waWxlcyAqLmdyb292eSBmaWxlcyBhZnRlciAqLmphdmEgZmlsZXMKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENsYXNzIGZpbmRlckNsYXNzID0gQ2xhc3MuZm9yTmFtZSgiZ3Jvb3Z5LnV0aWwuRmlsZU5hbWVGaW5kZXIiKTsKKyAgICAgICAgICAgIGZpbmRlciA9IChJRmlsZU5hbWVGaW5kZXIpIGZpbmRlckNsYXNzLm5ld0luc3RhbmNlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2Fubm90IGZpbmQgYW5kIGluc3RhbnRpYXRlIGNsYXNzIEZpbGVOYW1lRmluZGVyIiwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisgICAgICAgIFN0cmluZyBiYXNlZGlyID0gU3lzdGVtLmdldFByb3BlcnR5KFNZU1BST1BfVEVTVF9ESVIsICIuL3Rlc3QvIik7CisgICAgICAgIFN0cmluZyBwYXR0ZXJuID0gU3lzdGVtLmdldFByb3BlcnR5KFNZU1BST1BfVEVTVF9QQVRURVJOLCAiKiovKlRlc3QuZ3Jvb3Z5Iik7CisgICAgICAgIFN0cmluZyBleGNsdWRlc1BhdHRlcm4gPSBTeXN0ZW0uZ2V0UHJvcGVydHkoU1lTUFJPUF9URVNUX0VYQ0xVREVTX1BBVFRFUk4sICIiKTsKKyAgICAgICAgcmV0dXJuIHN1aXRlKGJhc2VkaXIsIHBhdHRlcm4pOworICAgIH0gICAgCisKKyAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoU3RyaW5nIGJhc2VkaXIsIFN0cmluZyBwYXR0ZXJuKSB7CisgICAgICAgIHJldHVybiBzdWl0ZShiYXNlZGlyLCBwYXR0ZXJuLCAiIik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKFN0cmluZyBiYXNlZGlyLCBTdHJpbmcgcGF0dGVybiwgU3RyaW5nIGV4Y2x1ZGVzUGF0dGVybikgeworICAgICAgICBBbGxUZXN0U3VpdGUgc3VpdGUgPSBuZXcgQWxsVGVzdFN1aXRlKCk7CisgICAgICAgIFN0cmluZyBmaWxlTmFtZSA9ICIiOworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ29sbGVjdGlvbiBmaWxlbmFtZXMgPSBleGNsdWRlc1BhdHRlcm4ubGVuZ3RoKCkgPiAwCisgICAgICAgICAgICAgICAgICAgID8gZmluZGVyLmdldEZpbGVOYW1lcyhiYXNlZGlyLCBwYXR0ZXJuLCBleGNsdWRlc1BhdHRlcm4pCisgICAgICAgICAgICAgICAgICAgIDogZmluZGVyLmdldEZpbGVOYW1lcyhiYXNlZGlyLCBwYXR0ZXJuKTsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGZpbGVuYW1lcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBmaWxlTmFtZSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIExPRy5maW5lc3QoInRyeWluZyB0byBsb2FkICIrIGZpbGVOYW1lKTsKKyAgICAgICAgICAgICAgICBzdWl0ZS5sb2FkVGVzdChmaWxlTmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uIGUxKSB7CisgICAgICAgICAgICBlMS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbiB3aGVuIGxvYWRpbmcgIitmaWxlTmFtZSwgZTEpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIklPRXhjZXB0aW9uIHdoZW4gbG9hZGluZyAiK2ZpbGVOYW1lLCBlMik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1aXRlOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGxvYWRUZXN0KFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIENsYXNzIHR5cGUgPSBjb21waWxlKGZpbGVOYW1lKTsKKyAgICAgICAgaWYgKCFUZXN0LmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZSkgJiYgU2NyaXB0LmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZSkpIHsKKyAgICAgICAgICAgIGFkZFRlc3QobmV3IFNjcmlwdFRlc3RBZGFwdGVyKHR5cGUsIEVNUFRZX0FSR1MpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFkZFRlc3RTdWl0ZSh0eXBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBDbGFzcyBjb21waWxlKFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBHUk9PVllfTE9BREVSLnBhcnNlQ2xhc3MobmV3IEZpbGUoZmlsZU5hbWUpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvQW50QnVpbGRlci5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91dGlsL0FudEJ1aWxkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmEzZjM2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91dGlsL0FudEJ1aWxkZXIuamF2YQpAQCAtMCwwICsxLDMwNCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGdyb292eS51dGlsOworCisKK2ltcG9ydCBncm9vdnkueG1sLlFOYW1lOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuaGVscGVyLkFudFhNTENvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuaGVscGVyLlByb2plY3RIZWxwZXIyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LmlucHV0LkRlZmF1bHRJbnB1dEhhbmRsZXI7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hbnQuRmlsZVNjYW5uZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKK2ltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOworaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuQXR0cmlidXRlc0ltcGw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLyoqCisgKiBBbGxvd3MgQW50IHRhc2tzIHRvIGJlIHVzZWQgd2l0aCBHcm9vdnlNYXJrdXAgCisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+LCBjaGFuZ2VzIGJ5IERpZXJrIEtvZW5pZyAoZGspCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBBbnRCdWlsZGVyIGV4dGVuZHMgQnVpbGRlclN1cHBvcnQgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3NbXSBBRERfVEFTS19QQVJBTV9UWVBFUyA9IHsgU3RyaW5nLmNsYXNzIH07CisKKyAgICBwcml2YXRlIGZpbmFsIExvZ2dlciBsb2cgPSBMb2dnZXIuZ2V0TG9nZ2VyKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICBwcml2YXRlIFByb2plY3QgcHJvamVjdDsKKyAgICBwcml2YXRlIGZpbmFsIEFudFhNTENvbnRleHQgYW50WG1sQ29udGV4dDsKKyAgICBwcml2YXRlIGZpbmFsIFByb2plY3RIZWxwZXIyLkVsZW1lbnRIYW5kbGVyIGFudEVsZW1lbnRIYW5kbGVyID0gbmV3IFByb2plY3RIZWxwZXIyLkVsZW1lbnRIYW5kbGVyKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBUYXJnZXQgY29sbGVjdG9yVGFyZ2V0OworICAgIHByaXZhdGUgT2JqZWN0IGxhc3RDb21wbGV0ZWROb2RlOworCisKKworICAgIHB1YmxpYyBBbnRCdWlsZGVyKCkgeworICAgICAgICB0aGlzKGNyZWF0ZVByb2plY3QoKSk7CisgICAgfQorCisgICAgcHVibGljIEFudEJ1aWxkZXIoZmluYWwgUHJvamVjdCBwcm9qZWN0KSB7CisgICAgICAgIHRoaXMocHJvamVjdCwgbmV3IFRhcmdldCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQW50QnVpbGRlcihmaW5hbCBQcm9qZWN0IHByb2plY3QsIGZpbmFsIFRhcmdldCBvd25pbmdUYXJnZXQpIHsKKyAgICAgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKKworICAgICAgICB0aGlzLnByb2plY3Quc2V0RGVmYXVsdElucHV0U3RyZWFtKFN5c3RlbS5pbik7CisgICAgICAgIHRoaXMucHJvamVjdC5zZXRJbnB1dEhhbmRsZXIobmV3IERlZmF1bHRJbnB1dEhhbmRsZXIoKSk7CisKKyAgICAgICAgY29sbGVjdG9yVGFyZ2V0ID0gb3duaW5nVGFyZ2V0OworICAgICAgICBhbnRYbWxDb250ZXh0ID0gbmV3IEFudFhNTENvbnRleHQocHJvamVjdCk7CisgICAgICAgIGNvbGxlY3RvclRhcmdldC5zZXRQcm9qZWN0KHByb2plY3QpOworICAgICAgICBhbnRYbWxDb250ZXh0LnNldEN1cnJlbnRUYXJnZXQoY29sbGVjdG9yVGFyZ2V0KTsKKyAgICAgICAgYW50WG1sQ29udGV4dC5zZXRMb2NhdG9yKG5ldyBBbnRCdWlsZGVyTG9jYXRvcigpKTsKKyAgICAgICAgCisgICAgICAgIC8vIEZpbGVTY2FubmVyIGlzIGEgR3Jvb3Z5IGhhY2sgKHV0aWxpdHk/KQorICAgICAgICBwcm9qZWN0LmFkZERhdGFUeXBlRGVmaW5pdGlvbigiZmlsZVNjYW5uZXIiLCBGaWxlU2Nhbm5lci5jbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+CisgICAgICogU2V0IHRoZSBpbnB1dCBzdHJlYW0gaGFuZGxpbmcgcG9saWN5LgorICAgICAqIFRoaXMgbWV0aG9kIGNhbiBhbHNvIGJlIHVzZWQgdG8gZGVmaW5lIGEgZGlmZmVyZW50IGlucHV0IHN0cmVhbSBmb3IgdGV4dCBpbnB1dC4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiA8Yj5SZW1hcms8L2I+OiBUaGlzIHBvbGljeSBoYXMgYmVlbiBpbnRyb2R1Y2VkIHRvIGZpeCBHUk9PVlktMjM2Mi4KKyAgICAgKiBXaXRoIHRoZSB1cGdyYWRlIHRvIEFudCAxLjcgZnJvbSBBbnQgMS42LjUsIGl0IHdhcyBub3QgcG9zc2libGUgdG8gY2FsbCB0aGUgaW5wdXQgdGFzayB0d2ljZQorICAgICAqIHdpdGhvdXQgZ2V0dGluZyBlcnJvcnMuIEJ5IHVzaW5nIGEgZGVmYXVsdCBpbnB1dCBoYW5kbGVyIGFuZCBhIERlbXV4SW5wdXRTdHJlYW0sCisgICAgICogaXQgc2VlbXMgdG8gc29sdmUgdGhlIHByb2JsZW0uCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGluIGlucHV0IHN0cmVhbSB0byB1c2UgZm9yIHJlYWRpbmcgaW5wdXQgZnJvbSB0aGUgY29tbWFuZC1saW5lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW5wdXRTdHJlYW1IYW5kbGluZ1BvbGljeShJbnB1dFN0cmVhbSBpbikgeworICAgICAgICB0aGlzLnByb2plY3Quc2V0RGVmYXVsdElucHV0U3RyZWFtKGluKTsKKyAgICAgICAgdGhpcy5wcm9qZWN0LnNldElucHV0SGFuZGxlcihuZXcgRGVmYXVsdElucHV0SGFuZGxlcigpKTsKKyAgICAgICAgU3lzdGVtLnNldEluKG5ldyBEZW11eElucHV0U3RyZWFtKHRoaXMucHJvamVjdCkpOworICAgIH0KKworICAgIHB1YmxpYyBBbnRCdWlsZGVyKGZpbmFsIFRhc2sgcGFyZW50VGFzaykgeworICAgIAl0aGlzKHBhcmVudFRhc2suZ2V0UHJvamVjdCgpLCBwYXJlbnRUYXNrLmdldE93bmluZ1RhcmdldCgpKTsKKyAgICAJCisgICAgCS8vIGRlZmluZSAib3duaW5nIiB0YXNrIGFzIHdyYXBwZXIgdG8gYXZvaWQgaGF2aW5nIHRhc2tzIGFkZGVkIHRvIHRoZSB0YXJnZXQKKyAgICAJLy8gYnV0IGl0IG5lZWRzIHRvIGJlIGFuIFVua25vd25FbGVtZW50IGFuZCBubyBhY2Nlc3MgaXMgYXZhaWxhYmxlIGZyb20KKyAgICAJLy8gdGFzayB0byBpdHMgb3JpZ2luYWwgVW5rbm93bkVsZW1lbnQgCisgICAgICAgIGZpbmFsIFVua25vd25FbGVtZW50IHVlID0gbmV3IFVua25vd25FbGVtZW50KHBhcmVudFRhc2suZ2V0VGFza05hbWUoKSk7CisgICAgICAgIHVlLnNldFByb2plY3QocGFyZW50VGFzay5nZXRQcm9qZWN0KCkpOworICAgICAgICB1ZS5zZXRUYXNrVHlwZShwYXJlbnRUYXNrLmdldFRhc2tUeXBlKCkpOworICAgICAgICB1ZS5zZXRUYXNrTmFtZShwYXJlbnRUYXNrLmdldFRhc2tOYW1lKCkpOworICAgICAgICB1ZS5zZXRMb2NhdGlvbihwYXJlbnRUYXNrLmdldExvY2F0aW9uKCkpOworICAgICAgICB1ZS5zZXRPd25pbmdUYXJnZXQocGFyZW50VGFzay5nZXRPd25pbmdUYXJnZXQoKSk7CisgICAgICAgIHVlLnNldFJ1bnRpbWVDb25maWd1cmFibGVXcmFwcGVyKHBhcmVudFRhc2suZ2V0UnVudGltZUNvbmZpZ3VyYWJsZVdyYXBwZXIoKSk7CisgICAgICAgIHBhcmVudFRhc2suZ2V0UnVudGltZUNvbmZpZ3VyYWJsZVdyYXBwZXIoKS5zZXRQcm94eSh1ZSk7CisgICAgCWFudFhtbENvbnRleHQucHVzaFdyYXBwZXIocGFyZW50VGFzay5nZXRSdW50aW1lQ29uZmlndXJhYmxlV3JhcHBlcigpKTsKKyAgICB9CisKKyAgICAvKiojCisgICAgICogR2V0cyB0aGUgQW50IHByb2plY3QgaW4gd2hpY2ggdGhlIHRhc2tzIGFyZSBleGVjdXRlZAorICAgICAqIEByZXR1cm4gdGhlIHByb2plY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgUHJvamVjdCBnZXRQcm9qZWN0KCkgeworICAgICAgICByZXR1cm4gcHJvamVjdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBuZXcgUHJvamVjdCBpbnN0YW5jZXMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIFByb2plY3QgY3JlYXRlUHJvamVjdCgpIHsKKyAgICAgICAgUHJvamVjdCBwcm9qZWN0ID0gbmV3IFByb2plY3QoKTsKKyAgICAgICAgQnVpbGRMb2dnZXIgbG9nZ2VyID0gbmV3IE5vQmFubmVyTG9nZ2VyKCk7CisKKyAgICAgICAgbG9nZ2VyLnNldE1lc3NhZ2VPdXRwdXRMZXZlbChvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0Lk1TR19JTkZPKTsKKyAgICAgICAgbG9nZ2VyLnNldE91dHB1dFByaW50U3RyZWFtKFN5c3RlbS5vdXQpOworICAgICAgICBsb2dnZXIuc2V0RXJyb3JQcmludFN0cmVhbShTeXN0ZW0uZXJyKTsKKworICAgICAgICBwcm9qZWN0LmFkZEJ1aWxkTGlzdGVuZXIobG9nZ2VyKTsKKworICAgICAgICBwcm9qZWN0LmluaXQoKTsKKyAgICAgICAgcHJvamVjdC5nZXRCYXNlRGlyKCk7CisgICAgICAgIHJldHVybiBwcm9qZWN0OworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50LCBPYmplY3QgY2hpbGQpIHsKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBXZSBkb24ndCB3YW50IHRvIHJldHVybiB0aGUgbm9kZSBhcyBjcmVhdGVkIGluIHtAbGluayAjY3JlYXRlTm9kZShPYmplY3QsIE1hcCwgT2JqZWN0KX0KKyAgICAgKiBidXQgdGhlIG9uZSBtYWRlIHJlYWR5IGJ5IHtAbGluayAjbm9kZUNvbXBsZXRlZChPYmplY3QsIE9iamVjdCl9CisgICAgICogQHNlZSBncm9vdnkudXRpbC5CdWlsZGVyU3VwcG9ydCNkb0ludm9rZU1ldGhvZChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQorICAgICAqLworICAgIHByb3RlY3RlZCBPYmplY3QgZG9JbnZva2VNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUsIE9iamVjdCBuYW1lLCBPYmplY3QgYXJncykgeworICAgIAlzdXBlci5kb0ludm9rZU1ldGhvZChtZXRob2ROYW1lLCBuYW1lLCBhcmdzKTsKKyAgICAJCisKKyAgICAJLy8gcmV0dXJuIHRoZSBjb21wbGV0ZWQgbm9kZQorICAgIAlyZXR1cm4gbGFzdENvbXBsZXRlZE5vZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lcywgd2hlbiB0aGUgQU5UIFRhc2sgdGhhdCBpcyByZXByZXNlbnRlZCBieSB0aGUgIm5vZGUiIHNob3VsZCBwZXJmb3JtLgorICAgICAqIE5vZGUgbXVzdCBiZSBhbiBBTlQgVGFzayBvciBubyAicGVyZm9ybSIgaXMgY2FsbGVkLgorICAgICAqIElmIG5vZGUgaXMgYW4gQU5UIFRhc2ssIGl0IHBlcmZvcm1zIHJpZ2h0IGFmdGVyIGNvbXBsZXRlIGNvbnRzdHJ1Y3Rpb24uCisgICAgICogSWYgbm9kZSBpcyBuZXN0ZWQgaW4gYSBUYXNrQ29udGFpbmVyLCBjYWxsaW5nICJwZXJmb3JtIiBpcyBkZWxlZ2F0ZWQgdG8gdGhhdAorICAgICAqIFRhc2tDb250YWluZXIuCisgICAgICogQHBhcmFtIHBhcmVudCBub3RlOiBudWxsIHdoZW4gbm9kZSBpcyByb290CisgICAgICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdGhhdCBub3cgaGFzIGFsbCBpdHMgY2hpbGRyZW4gYXBwbGllZAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIG5vZGVDb21wbGV0ZWQoZmluYWwgT2JqZWN0IHBhcmVudCwgZmluYWwgT2JqZWN0IG5vZGUpIHsKKworICAgIAlhbnRFbGVtZW50SGFuZGxlci5vbkVuZEVsZW1lbnQobnVsbCwgbnVsbCwgYW50WG1sQ29udGV4dCk7CisKKyAgICAJbGFzdENvbXBsZXRlZE5vZGUgPSBub2RlOworICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGxvZy5maW5lc3QoInBhcmVudCBpcyBub3QgbnVsbDogbm8gcGVyZm9ybSBvbiBub2RlQ29tcGxldGVkIik7CisgICAgICAgICAgICByZXR1cm47IC8vIHBhcmVudCB3aWxsIGNhcmUgYWJvdXQgd2hlbiBjaGlsZHJlbiBwZXJmb3JtCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIGFzIGluIFRhcmdldC5leGVjdXRlKCkKKyAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBUYXNrKSB7CisgICAgICAgICAgICBPYmplY3QgdGFzayA9IG5vZGU7CisgICAgICAgICAgICAvLyAiVW53cmFwIiB0aGUgVW5rbm93bkVsZW1lbnQgdG8gcmV0dXJuIHRoZSByZWFsIHRhc2sgdG8gdGhlIGNhbGxpbmcgY29kZQorICAgICAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBVbmtub3duRWxlbWVudCkgeworICAgICAgICAgICAgCWZpbmFsIFVua25vd25FbGVtZW50IHVua25vd25FbGVtZW50ID0gKFVua25vd25FbGVtZW50KSBub2RlOworICAgICAgICAgICAgCXVua25vd25FbGVtZW50Lm1heWJlQ29uZmlndXJlKCk7CisgICAgICAgICAgICAgICAgdGFzayA9IHVua25vd25FbGVtZW50LmdldFJlYWxUaGluZygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBsYXN0Q29tcGxldGVkTm9kZSA9IHRhc2s7CisgICAgICAgICAgICAvLyBVbmtub3duRWxlbWVudCBtYXkgd3JhcCBldmVyeXRoaW5nOiB0YXNrLCBwYXRoLCAuLi4KKyAgICAgICAgICAgIGlmICh0YXNrIGluc3RhbmNlb2YgVGFzaykgeworICAgICAgICAgICAgICAgIC8vIHNhdmUgb3JpZ2luYWwgaW5wdXQgc3RyZWFtCisgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gb3JpZ2luYWxJbiA9IFN5c3RlbS5pbjsKKyAgICAgICAgICAgICAgICBEZW11eElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IERlbXV4SW5wdXRTdHJlYW0odGhpcy5wcm9qZWN0KTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0SW4oaW5wdXRTdHJlYW0pOworCisgICAgICAgICAgICAgICAgKChUYXNrKSB0YXNrKS5wZXJmb3JtKCk7CisKKyAgICAgICAgICAgICAgICAvLyByZXN0b3JlIG9yaWdpbmFsIGlucHV0IHN0cmVhbQorICAgICAgICAgICAgICAgIFN5c3RlbS5zZXRJbihvcmlnaW5hbEluKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGZpbmFsIFJ1bnRpbWVDb25maWd1cmFibGUgciA9IChSdW50aW1lQ29uZmlndXJhYmxlKSBub2RlOworICAgICAgICAgICAgci5tYXliZUNvbmZpZ3VyZShwcm9qZWN0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlTm9kZShPYmplY3QgdGFnTmFtZSkgeworICAgICAgICByZXR1cm4gY3JlYXRlTm9kZSh0YWdOYW1lLCBDb2xsZWN0aW9ucy5FTVBUWV9NQVApOworICAgIH0KKworICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlTm9kZShPYmplY3QgbmFtZSwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIE9iamVjdCB0YXNrID0gY3JlYXRlTm9kZShuYW1lKTsKKyAgICAgICAgc2V0VGV4dCh0YXNrLCB2YWx1ZS50b1N0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIHRhc2s7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVOb2RlKE9iamVjdCBuYW1lLCBNYXAgYXR0cmlidXRlcywgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIE9iamVjdCB0YXNrID0gY3JlYXRlTm9kZShuYW1lLCBhdHRyaWJ1dGVzKTsKKyAgICAgICAgc2V0VGV4dCh0YXNrLCB2YWx1ZS50b1N0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIHRhc2s7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEJ1aWxkcyBhbiB7QGxpbmsgQXR0cmlidXRlc30gZnJvbSBhIHtAbGluayBNYXB9CisgICAgICogCisgICAgICogQHBhcmFtIGF0dHJpYnV0ZXMgdGhlIGF0dHJpYnV0ZXMgdG8gd3JhcAorICAgICAqIEByZXR1cm4gdGhlIHdyYXBwZWQgYXR0cmlidXRlcworICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgQXR0cmlidXRlcyBidWlsZEF0dHJpYnV0ZXMoZmluYWwgTWFwIGF0dHJpYnV0ZXMpIHsKKyAgICAJZmluYWwgQXR0cmlidXRlc0ltcGwgYXR0ciA9IG5ldyBBdHRyaWJ1dGVzSW1wbCgpOworICAgIAlmb3IgKGZpbmFsIEl0ZXJhdG9yIGl0ZXI9YXR0cmlidXRlcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApIHsKKyAgICAJCWZpbmFsIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOworICAgIAkJZmluYWwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKKyAgICAJCWZpbmFsIFN0cmluZyBhdHRyaWJ1dGVWYWx1ZSA9IFN0cmluZy52YWx1ZU9mKGVudHJ5LmdldFZhbHVlKCkpOworICAgIAkJYXR0ci5hZGRBdHRyaWJ1dGUobnVsbCwgYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlTmFtZSwgIkNEQVRBIiwgYXR0cmlidXRlVmFsdWUpOworICAgIAl9CisgICAgCXJldHVybiBhdHRyOworICAgIH0KKworICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlTm9kZShmaW5hbCBPYmplY3QgbmFtZSwgZmluYWwgTWFwIGF0dHJpYnV0ZXMpIHsKKworICAgICAgICBTdHJpbmcgdGFnTmFtZSA9IG5hbWUudG9TdHJpbmcoKTsKKyAgICAgICAgU3RyaW5nIG5zID0gIiI7CisKKyAgICAgICAgaWYobmFtZSBpbnN0YW5jZW9mIFFOYW1lKSB7CisgICAgICAgICAgICBRTmFtZSBxID0gKFFOYW1lKW5hbWU7CisgICAgICAgICAgICB0YWdOYW1lID0gcS5nZXRMb2NhbFBhcnQoKTsKKyAgICAgICAgICAgIG5zID0gcS5nZXROYW1lc3BhY2VVUkkoKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeQorCQl7CisJCQlhbnRFbGVtZW50SGFuZGxlci5vblN0YXJ0RWxlbWVudChucywgdGFnTmFtZSwgdGFnTmFtZSwgYnVpbGRBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpLCBhbnRYbWxDb250ZXh0KTsKKwkJfQorCQljYXRjaCAoZmluYWwgU0FYUGFyc2VFeGNlcHRpb24gZSkKKwkJeworICAgICAgICAgICAgbG9nLmxvZyhMZXZlbC5TRVZFUkUsICJDYXVnaHQ6ICIgKyBlLCBlKTsKKwkJfQorICAgIAkKKwkJZmluYWwgUnVudGltZUNvbmZpZ3VyYWJsZSB3cmFwcGVyID0gKFJ1bnRpbWVDb25maWd1cmFibGUpIGFudFhtbENvbnRleHQuZ2V0V3JhcHBlclN0YWNrKCkubGFzdEVsZW1lbnQoKTsKKyAgICAJcmV0dXJuIHdyYXBwZXIuZ2V0UHJveHkoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRUZXh0KE9iamVjdCB0YXNrLCBTdHJpbmcgdGV4dCkgeworICAgIAlmaW5hbCBjaGFyW10gY2hhcmFjdGVycyA9IHRleHQudG9DaGFyQXJyYXkoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAJYW50RWxlbWVudEhhbmRsZXIuY2hhcmFjdGVycyhjaGFyYWN0ZXJzLCAwLCBjaGFyYWN0ZXJzLmxlbmd0aCwgYW50WG1sQ29udGV4dCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKGZpbmFsIFNBWFBhcnNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZy5sb2coTGV2ZWwuV0FSTklORywgIlNldFRleHQgZmFpbGVkOiAiICsgdGFzayArICIuIFJlYXNvbjogIiArIGUsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFByb2plY3QgZ2V0QW50UHJvamVjdCgpIHsKKyAgICAgICAgcmV0dXJuIHByb2plY3Q7CisgICAgfQorfQorCisvKioKKyAqIFdvdWxkIGJlIG5pY2UgdG8gcmV0cmlldmUgbG9jYXRpb24gaW5mb3JtYXRpb24gKGZyb20gQVNUPykuCisgKiBJbiBhIGZpcnN0IHRpbWUsIHdpdGhvdXQgaW5mbworICovCitjbGFzcyBBbnRCdWlsZGVyTG9jYXRvciBpbXBsZW1lbnRzIExvY2F0b3IgeworCXB1YmxpYyBpbnQgZ2V0Q29sdW1uTnVtYmVyKCkKKwl7CisJCXJldHVybiAwOworCX0KKwlwdWJsaWMgaW50IGdldExpbmVOdW1iZXIoKQorCXsKKwkJcmV0dXJuIDA7CisJfQorCXB1YmxpYyBTdHJpbmcgZ2V0UHVibGljSWQoKQorCXsKKwkJcmV0dXJuICIiOworCX0KKwlwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUlkKCkKKwl7CisJCXJldHVybiAiIjsKKwl9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvQnVpbGRlclN1cHBvcnQuamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdXRpbC9CdWlsZGVyU3VwcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzODlhZDkKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvQnVpbGRlclN1cHBvcnQuamF2YQpAQCAtMCwwICsxLDIyMyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGdyb292eS51dGlsOworCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuQ2xvc3VyZTsKK2ltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlPYmplY3RTdXBwb3J0OworaW1wb3J0IGdyb292eS5sYW5nLk1pc3NpbmdNZXRob2RFeGNlcHRpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLkludm9rZXJIZWxwZXI7CisKKy8qKgorICogQW4gYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgY3JlYXRpbmcgYXJiaXRyYXJ5IG5lc3RlZCB0cmVlcyBvZiBvYmplY3RzCisgKiBvciBldmVudHMKKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQnVpbGRlclN1cHBvcnQgZXh0ZW5kcyBHcm9vdnlPYmplY3RTdXBwb3J0IHsKKworICAgIHByaXZhdGUgT2JqZWN0IGN1cnJlbnQ7CisgICAgcHJpdmF0ZSBDbG9zdXJlIG5hbWVNYXBwaW5nQ2xvc3VyZTsKKyAgICBwcml2YXRlIGZpbmFsIEJ1aWxkZXJTdXBwb3J0IHByb3h5QnVpbGRlcjsKKworICAgIHB1YmxpYyBCdWlsZGVyU3VwcG9ydCgpIHsKKyAgICAgICAgdGhpcy5wcm94eUJ1aWxkZXIgPSB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBCdWlsZGVyU3VwcG9ydChCdWlsZGVyU3VwcG9ydCBwcm94eUJ1aWxkZXIpIHsKKyAgICAgICAgdGhpcyhudWxsLCBwcm94eUJ1aWxkZXIpOworICAgIH0KKworICAgIHB1YmxpYyBCdWlsZGVyU3VwcG9ydChDbG9zdXJlIG5hbWVNYXBwaW5nQ2xvc3VyZSwgQnVpbGRlclN1cHBvcnQgcHJveHlCdWlsZGVyKSB7CisgICAgICAgIHRoaXMubmFtZU1hcHBpbmdDbG9zdXJlID0gbmFtZU1hcHBpbmdDbG9zdXJlOworICAgICAgICB0aGlzLnByb3h5QnVpbGRlciA9IHByb3h5QnVpbGRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSBtZXRob2Qgd2hlbiBubyBhcmd1bWVudHMgYXJlIHJlcXVpcmVkCisgICAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBjYWxsCisgICAgICogQHBhcmFtIG1ldGhvZE5hbWUgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0byBpbnZva2UKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGludm9rZU1ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSkgeworICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kKG1ldGhvZE5hbWUsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgaW52b2tlTWV0aG9kKFN0cmluZyBtZXRob2ROYW1lLCBPYmplY3QgYXJncykgeworICAgICAgICBPYmplY3QgbmFtZSA9IGdldE5hbWUobWV0aG9kTmFtZSk7CisgICAgICAgIHJldHVybiBkb0ludm9rZU1ldGhvZChtZXRob2ROYW1lLCBuYW1lLCBhcmdzKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgT2JqZWN0IGRvSW52b2tlTWV0aG9kKFN0cmluZyBtZXRob2ROYW1lLCBPYmplY3QgbmFtZSwgT2JqZWN0IGFyZ3MpIHsKKyAgICAgICAgT2JqZWN0IG5vZGUgPSBudWxsOworICAgICAgICBDbG9zdXJlIGNsb3N1cmUgPSBudWxsOworICAgICAgICBMaXN0IGxpc3QgPSBJbnZva2VySGVscGVyLmFzTGlzdChhcmdzKTsKKworICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiQ2FsbGVkIGludm9rZU1ldGhvZCB3aXRoIG5hbWU6ICIgKyBuYW1lICsgIiBhcmd1bWVudHM6ICIgKyBsaXN0KTsKKworICAgICAgICBzd2l0Y2ggKGxpc3Quc2l6ZSgpKSB7CisgICAgICAgIAkJY2FzZSAwOgorCSAgICAJICAgICAgICAgICAgbm9kZSA9IHByb3h5QnVpbGRlci5jcmVhdGVOb2RlKG5hbWUpOworICAgICAgICAJCSAgICBicmVhazsKKyAgICAgICAgCSAgICAJY2FzZSAxOgorICAgICAgICAJICAgIAl7CisgICAgICAgIAkgICAgCSAgICAJT2JqZWN0IG9iamVjdCA9IGxpc3QuZ2V0KDApOworICAgICAgICAJICAgIAkgICAgCWlmIChvYmplY3QgaW5zdGFuY2VvZiBNYXApIHsKKyAgICAgICAgCSAgICAJICAgIAkgICAgbm9kZSA9IHByb3h5QnVpbGRlci5jcmVhdGVOb2RlKG5hbWUsIChNYXApIG9iamVjdCk7CisgICAgICAgIAkgICAgCSAgICAJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBDbG9zdXJlKSB7CisgICAgICAgIAkgICAgCSAgICAJICAgIGNsb3N1cmUgPSAoQ2xvc3VyZSkgb2JqZWN0OworICAgICAgICAJICAgIAkgICAgCSAgICBub2RlID0gcHJveHlCdWlsZGVyLmNyZWF0ZU5vZGUobmFtZSk7CisgICAgICAgIAkgICAgCSAgICAJfSBlbHNlIHsKKyAgICAgICAgCSAgICAJICAgIAkgICAgbm9kZSA9IHByb3h5QnVpbGRlci5jcmVhdGVOb2RlKG5hbWUsIG9iamVjdCk7CisgICAgICAgIAkgICAgCSAgICAJfQorICAgICAgICAJICAgIAl9CisgICAgICAgIAkgICAgCWJyZWFrOworICAgICAgICAJICAgIAljYXNlIDI6CisgICAgICAgIAkgICAgCXsKKyAgICAgICAgCSAgICAJICAgIE9iamVjdCBvYmplY3QxID0gbGlzdC5nZXQoMCk7CisgICAgCSAgICAJICAgICAgICBPYmplY3Qgb2JqZWN0MiA9IGxpc3QuZ2V0KDEpOworICAgICAgICAJICAgIAkgICAgaWYgKG9iamVjdDEgaW5zdGFuY2VvZiBNYXApIHsKKyAgICAgICAgCSAgICAJICAgICAgICBpZiAob2JqZWN0MiBpbnN0YW5jZW9mIENsb3N1cmUpIHsKKyAgICAgICAgCSAgICAJICAgICAgICAgICAgY2xvc3VyZSA9IChDbG9zdXJlKSBvYmplY3QyOworICAgICAgICAJICAgIAkgICAgICAgICAgICBub2RlID0gcHJveHlCdWlsZGVyLmNyZWF0ZU5vZGUobmFtZSwgKE1hcCkgb2JqZWN0MSk7CisgICAgICAgIAkgICAgCSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgCSAgICAJICAgICAgICAgICAgbm9kZSA9IHByb3h5QnVpbGRlci5jcmVhdGVOb2RlKG5hbWUsIChNYXApIG9iamVjdDEsIG9iamVjdDIpOworICAgICAgICAJICAgIAkgICAgICAgIH0KKyAgICAgICAgCSAgICAJICAgIH0gZWxzZSB7CisgICAgICAgIAkgICAgCSAgICAgICAgaWYgKG9iamVjdDIgaW5zdGFuY2VvZiBDbG9zdXJlKSB7CisgICAgICAgIAkgICAgCSAgICAgICAgICAgIGNsb3N1cmUgPSAoQ2xvc3VyZSkgb2JqZWN0MjsKKyAgICAgICAgCSAgICAJICAgICAgICAgICAgbm9kZSA9IHByb3h5QnVpbGRlci5jcmVhdGVOb2RlKG5hbWUsIG9iamVjdDEpOworCQkJCX0gZWxzZSBpZiAob2JqZWN0MiBpbnN0YW5jZW9mIE1hcCkgeworCQkJCSAgICBub2RlID0gcHJveHlCdWlsZGVyLmNyZWF0ZU5vZGUobmFtZSwgKE1hcCkgb2JqZWN0Miwgb2JqZWN0MSk7CisgICAgICAgIAkgICAgCSAgICAgICAgfSBlbHNlIHsKKwkJCQkgICAgdGhyb3cgbmV3IE1pc3NpbmdNZXRob2RFeGNlcHRpb24obmFtZS50b1N0cmluZygpLCBnZXRDbGFzcygpLCBsaXN0LnRvQXJyYXkoKSwgZmFsc2UpOworCQkJCX0KKyAgICAgICAgCSAgICAJICAgIH0KKyAgICAgICAgCSAgICAJfQorICAgICAgICAJICAgIAlicmVhazsKKyAgICAgICAgCSAgICAJY2FzZSAzOgorICAgICAgICAJICAgIAl7CisgICAgICAgIAkgICAgCSAgICBPYmplY3QgYXJnMCA9IGxpc3QuZ2V0KDApOworICAgICAgICAJICAgIAkgICAgT2JqZWN0IGFyZzEgPSBsaXN0LmdldCgxKTsKKyAgICAgICAgCSAgICAJICAgIE9iamVjdCBhcmcyID0gbGlzdC5nZXQoMik7CisgICAgICAgIAkgICAgCSAgICBpZiAoYXJnMCBpbnN0YW5jZW9mIE1hcCAmJiBhcmcyIGluc3RhbmNlb2YgQ2xvc3VyZSkgeworICAgICAgICAJICAgIAkgICAgICAgIGNsb3N1cmUgPSAoQ2xvc3VyZSkgYXJnMjsKKyAgICAgICAgCSAgICAJICAgICAgICBub2RlID0gcHJveHlCdWlsZGVyLmNyZWF0ZU5vZGUobmFtZSwgKE1hcCkgYXJnMCwgYXJnMSk7CisJCQkgICAgfSBlbHNlIGlmIChhcmcxIGluc3RhbmNlb2YgTWFwICYmIGFyZzIgaW5zdGFuY2VvZiBDbG9zdXJlKSB7CisgICAgICAgIAkgICAgCSAgICAgICAgY2xvc3VyZSA9IChDbG9zdXJlKSBhcmcyOworICAgICAgICAJICAgIAkgICAgICAgIG5vZGUgPSBwcm94eUJ1aWxkZXIuY3JlYXRlTm9kZShuYW1lLCAoTWFwKSBhcmcxLCBhcmcwKTsKKwkJCSAgICB9IGVsc2UgeworCQkJCXRocm93IG5ldyBNaXNzaW5nTWV0aG9kRXhjZXB0aW9uKG5hbWUudG9TdHJpbmcoKSwgZ2V0Q2xhc3MoKSwgbGlzdC50b0FycmF5KCksIGZhbHNlKTsKKwkJCSAgIH0KKyAgICAgICAgCSAgICAJfQorICAgICAgICAJICAgIAlicmVhazsKKyAgICAgICAgCSAgICAJZGVmYXVsdDoKKyAgICAgICAgCSAgICAJeworCQkJICAgIHRocm93IG5ldyBNaXNzaW5nTWV0aG9kRXhjZXB0aW9uKG5hbWUudG9TdHJpbmcoKSwgZ2V0Q2xhc3MoKSwgbGlzdC50b0FycmF5KCksIGZhbHNlKTsKKwkJCX0KKworICAgICAgICB9CisKKyAgICAgICAgaWYgKGN1cnJlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgcHJveHlCdWlsZGVyLnNldFBhcmVudChjdXJyZW50LCBub2RlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjbG9zdXJlICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIHB1c2ggbmV3IG5vZGUgb24gc3RhY2sKKyAgICAgICAgICAgIE9iamVjdCBvbGRDdXJyZW50ID0gY3VycmVudDsKKyAgICAgICAgICAgIGN1cnJlbnQgPSBub2RlOworCisgICAgICAgICAgICAvLyBsZXRzIHJlZ2lzdGVyIHRoZSBidWlsZGVyIGFzIHRoZSBkZWxlZ2F0ZQorICAgICAgICAgICAgc2V0Q2xvc3VyZURlbGVnYXRlKGNsb3N1cmUsIG5vZGUpOworICAgICAgICAgICAgY2xvc3VyZS5jYWxsKCk7CisKKyAgICAgICAgICAgIGN1cnJlbnQgPSBvbGRDdXJyZW50OworICAgICAgICB9CisKKyAgICAgICAgcHJveHlCdWlsZGVyLm5vZGVDb21wbGV0ZWQoY3VycmVudCwgbm9kZSk7CisgICAgICAgIHJldHVybiBwcm94eUJ1aWxkZXIucG9zdE5vZGVDb21wbGV0aW9uKGN1cnJlbnQsIG5vZGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgc3RyYXRlZ3kgbWV0aG9kIHRvIGFsbG93IGRlcml2ZWQgYnVpbGRlcnMgdG8gdXNlCisgICAgICogYnVpbGRlci10cmVlcyBhbmQgc3dpdGNoIGluIGRpZmZlcmVudCBraW5kcyBvZiBidWlsZGVycy4KKyAgICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgY2FsbCB0aGUgc2V0RGVsZWdhdGUoKSBtZXRob2Qgb24gdGhlIGNsb3N1cmUKKyAgICAgKiB3aGljaCBieSBkZWZhdWx0IHBhc3NlcyBpbiB0aGlzIGJ1dCBpZiBub2RlIGlzLWEgYnVpbGRlcgorICAgICAqIHdlIGNvdWxkIHBhc3MgdGhhdCBpbiBpbnN0ZWFkIChvciBkbyBzb21ldGhpbmcgd2Fja3kgdG9vKQorICAgICAqCisgICAgICogQHBhcmFtIGNsb3N1cmUgdGhlIGNsb3N1cmUgb24gd2hpY2ggdG8gY2FsbCBzZXREZWxlZ2F0ZSgpCisgICAgICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdmFsdWUgdGhhdCB3ZSd2ZSBqdXN0IGNyZWF0ZWQsIHdoaWNoIGNvdWxkIGJlCisgICAgICogYSBidWlsZGVyCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0Q2xvc3VyZURlbGVnYXRlKENsb3N1cmUgY2xvc3VyZSwgT2JqZWN0IG5vZGUpIHsKKyAgICAgICAgY2xvc3VyZS5zZXREZWxlZ2F0ZSh0aGlzKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCwgT2JqZWN0IGNoaWxkKTsKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgT2JqZWN0IGNyZWF0ZU5vZGUoT2JqZWN0IG5hbWUpOworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBPYmplY3QgY3JlYXRlTm9kZShPYmplY3QgbmFtZSwgT2JqZWN0IHZhbHVlKTsKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgT2JqZWN0IGNyZWF0ZU5vZGUoT2JqZWN0IG5hbWUsIE1hcCBhdHRyaWJ1dGVzKTsKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgT2JqZWN0IGNyZWF0ZU5vZGUoT2JqZWN0IG5hbWUsIE1hcCBhdHRyaWJ1dGVzLCBPYmplY3QgdmFsdWUpOworCisgICAgLyoqCisgICAgICogQSBob29rIHRvIGFsbG93IG5hbWVzIHRvIGJlIGNvbnZlcnRlZCBpbnRvIHNvbWUgb3RoZXIgb2JqZWN0CisgICAgICogc3VjaCBhcyBhIFFOYW1lIGluIFhNTCBvciBPYmplY3ROYW1lIGluIEpNWC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXRob2ROYW1lIHRoZSBuYW1lIG9mIHRoZSBkZXNpcmVkIG1ldGhvZAorICAgICAqIEByZXR1cm4gdGhlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIG5hbWUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldE5hbWUoU3RyaW5nIG1ldGhvZE5hbWUpIHsKKyAgICAgICAgaWYgKG5hbWVNYXBwaW5nQ2xvc3VyZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbmFtZU1hcHBpbmdDbG9zdXJlLmNhbGwobWV0aG9kTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1ldGhvZE5hbWU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBIGhvb2sgdG8gYWxsb3cgbm9kZXMgdG8gYmUgcHJvY2Vzc2VkIG9uY2UgdGhleSBoYXZlIGhhZCBhbGwgb2YgdGhlaXIKKyAgICAgKiBjaGlsZHJlbiBhcHBsaWVkLgorICAgICAqCisgICAgICogQHBhcmFtIG5vZGUgdGhlIGN1cnJlbnQgbm9kZSBiZWluZyBwcm9jZXNzZWQKKyAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgb2YgdGhlIG5vZGUgYmVpbmcgcHJvY2Vzc2VkCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgbm9kZUNvbXBsZXRlZChPYmplY3QgcGFyZW50LCBPYmplY3Qgbm9kZSkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgaG9vayB0byBhbGxvdyBub2RlcyB0byBiZSBwcm9jZXNzZWQgb25jZSB0aGV5IGhhdmUgaGFkIGFsbCBvZiB0aGVpcgorICAgICAqIGNoaWxkcmVuIGFwcGxpZWQgYW5kIGFsbG93cyB0aGUgYWN0dWFsIG5vZGUgb2JqZWN0IHRoYXQgcmVwcmVzZW50cworICAgICAqIHRoZSBNYXJrdXAgZWxlbWVudCB0byBiZSBjaGFuZ2VkCisgICAgICoKKyAgICAgKiBAcGFyYW0gbm9kZSB0aGUgY3VycmVudCBub2RlIGJlaW5nIHByb2Nlc3NlZAorICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBvZiB0aGUgbm9kZSBiZWluZyBwcm9jZXNzZWQKKyAgICAgKiBAcmV0dXJuIHRoZSBub2RlLCBwb3NzaWJseSBuZXcsIHRoYXQgcmVwcmVzZW50cyB0aGUgbWFya3VwIGVsZW1lbnQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgT2JqZWN0IHBvc3ROb2RlQ29tcGxldGlvbihPYmplY3QgcGFyZW50LCBPYmplY3Qgbm9kZSkgeworICAgICAgICByZXR1cm4gbm9kZTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldEN1cnJlbnQoKSB7CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHNldEN1cnJlbnQoT2JqZWN0IGN1cnJlbnQpIHsKKyAgICAgICAgdGhpcy5jdXJyZW50ID0gY3VycmVudDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvQ2hhcnNldFRvb2xraXQuamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdXRpbC9DaGFyc2V0VG9vbGtpdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNTNlNGQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvQ2hhcnNldFRvb2xraXQuamF2YQpAQCAtMCwwICsxLDQwOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgZ3Jvb3Z5LnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCisvKioKKyAqIDxwPlV0aWxpdHkgY2xhc3MgdG8gZ3Vlc3MgdGhlIGVuY29kaW5nIG9mIGEgZ2l2ZW4gdGV4dCBmaWxlLjwvcD4KKyAqCisgKiA8cD5Vbmljb2RlIGZpbGVzIGVuY29kZWQgaW4gVVRGLTE2IChsb3cgb3IgYmlnIGVuZGlhbikgb3IgVVRGLTggZmlsZXMKKyAqIHdpdGggYSBCeXRlIE9yZGVyIE1hcmtlciBhcmUgY29ycmVjdGx5IGRpc2NvdmVyZWQuIEZvciBVVEYtOCBmaWxlcyB3aXRoIG5vIEJPTSwgaWYgdGhlIGJ1ZmZlcgorICogaXMgd2lkZSBlbm91Z2gsIHRoZSBjaGFyc2V0IHNob3VsZCBhbHNvIGJlIGRpc2NvdmVyZWQuPC9wPgorICoKKyAqIDxwPkEgYnl0ZSBidWZmZXIgb2YgNEtCIGlzIHVzdWFsbHkgc3VmZmljaWVudCB0byBiZSBhYmxlIHRvIGd1ZXNzIHRoZSBlbmNvZGluZy48L3A+CisgKgorICogPHA+VXNhZ2U6PC9wPgorICogPHByZT4KKyAqIC8vIGd1ZXNzIHRoZSBlbmNvZGluZworICogQ2hhcnNldCBndWVzc2VkQ2hhcnNldCA9IENoYXJzZXRUb29sa2l0Lmd1ZXNzRW5jb2RpbmcoZmlsZSwgNDA5Nik7CisgKgorICogLy8gY3JlYXRlIGEgcmVhZGVyIHdpdGggdGhlIGNvcnJlY3QgY2hhcnNldAorICogQ2hhcnNldFRvb2xraXQgdG9vbGtpdCA9IG5ldyBDaGFyc2V0VG9vbGtpdChmaWxlKTsKKyAqIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IHRvb2xraXQuZ2V0UmVhZGVyKCk7CisgKgorICogLy8gcmVhZCB0aGUgZmlsZSBjb250ZW50CisgKiBTdHJpbmcgbGluZTsKKyAqIHdoaWxlICgobGluZSA9IGJyLnJlYWRMaW5lKCkpIT0gbnVsbCkKKyAqIHsKKyAqICAgICBTeXN0ZW0ub3V0LnByaW50bG4obGluZSk7CisgKiB9CisgKiA8L3ByZT4KKyAqCisgKiBAYXV0aG9yIEd1aWxsYXVtZSBMYWZvcmdlCisgKi8KK3B1YmxpYyBjbGFzcyBDaGFyc2V0VG9vbGtpdCB7CisgICAgcHJpdmF0ZSBieXRlW10gYnVmZmVyOworICAgIHByaXZhdGUgQ2hhcnNldCBkZWZhdWx0Q2hhcnNldDsKKyAgICBwcml2YXRlIENoYXJzZXQgY2hhcnNldDsKKyAgICBwcml2YXRlIGJvb2xlYW4gZW5mb3JjZThCaXQgPSB0cnVlOworICAgIHByaXZhdGUgZmluYWwgRmlsZSBmaWxlOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBFTVBUWV9CWVRFX0FSUkFZID0gbmV3IGJ5dGVbMF07CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBvZiB0aGUgPGNvZGU+Q2hhcnNldFRvb2xraXQ8L2NvZGU+IHV0aWxpdHkgY2xhc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZSBvZiB3aGljaCB3ZSB3YW50IHRvIGtub3cgdGhlIGVuY29kaW5nLgorICAgICAqLworICAgIHB1YmxpYyBDaGFyc2V0VG9vbGtpdChGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMuZmlsZSA9IGZpbGU7CisgICAgICAgIHRoaXMuZGVmYXVsdENoYXJzZXQgPSBnZXREZWZhdWx0U3lzdGVtQ2hhcnNldCgpOworICAgICAgICB0aGlzLmNoYXJzZXQgPSBudWxsOworICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dCA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVs0MDk2XTsKKyAgICAgICAgICAgIGludCBieXRlc1JlYWQgPSBpbnB1dC5yZWFkKGJ5dGVzKTsKKyAgICAgICAgICAgIGlmIChieXRlc1JlYWQgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZlciA9IEVNUFRZX0JZVEVfQVJSQVk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChieXRlc1JlYWQgPCA0MDk2KSB7CisgICAgICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzVG9HdWVzcyA9IG5ldyBieXRlW2J5dGVzUmVhZF07CisgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShieXRlcywgMCwgYnl0ZXNUb0d1ZXNzLCAwLCBieXRlc1JlYWQpOworICAgICAgICAgICAgICAgIHRoaXMuYnVmZmVyID0gYnl0ZXNUb0d1ZXNzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgdGhpcy5idWZmZXIgPSBieXRlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHRyeSB7aW5wdXQuY2xvc2UoKTt9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKXsKKyAgICAgICAgICAgICAgICAvLyBJR05PUkUKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmluZXMgdGhlIGRlZmF1bHQgPGNvZGU+Q2hhcnNldDwvY29kZT4gdXNlZCBpbiBjYXNlIHRoZSBidWZmZXIgcmVwcmVzZW50cworICAgICAqIGFuIDgtYml0IDxjb2RlPkNoYXJzZXQ8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGRlZmF1bHRDaGFyc2V0IHRoZSBkZWZhdWx0IDxjb2RlPkNoYXJzZXQ8L2NvZGU+IHRvIGJlIHJldHVybmVkIGJ5IDxjb2RlPmd1ZXNzRW5jb2RpbmcoKTwvY29kZT4KKyAgICAgKiBpZiBhbiA4LWJpdCA8Y29kZT5DaGFyc2V0PC9jb2RlPiBpcyBlbmNvdW50ZXJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0Q2hhcnNldChDaGFyc2V0IGRlZmF1bHRDaGFyc2V0KSB7CisgICAgICAgIGlmIChkZWZhdWx0Q2hhcnNldCAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy5kZWZhdWx0Q2hhcnNldCA9IGRlZmF1bHRDaGFyc2V0OworICAgICAgICBlbHNlCisgICAgICAgICAgICB0aGlzLmRlZmF1bHRDaGFyc2V0ID0gZ2V0RGVmYXVsdFN5c3RlbUNoYXJzZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2hhcnNldCBnZXRDaGFyc2V0KCkgeworICAgICAgICBpZiAodGhpcy5jaGFyc2V0ID09IG51bGwpCisgICAgICAgICAgICB0aGlzLmNoYXJzZXQgPSBndWVzc0VuY29kaW5nKCk7CisgICAgICAgIHJldHVybiBjaGFyc2V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIFVTLUFTQ0lJIGlzIHJlY29nbml6ZWQsIGVuZm9yY2UgdG8gcmV0dXJuIHRoZSBkZWZhdWx0IGVuY29kaW5nLCByYXRoZXIgdGhhbiBVUy1BU0NJSS4KKyAgICAgKiBJdCBtaWdodCBiZSBhIGZpbGUgd2l0aG91dCBhbnkgc3BlY2lhbCBjaGFyYWN0ZXIgaW4gdGhlIHJhbmdlIDEyOC0yNTUsIGJ1dCB0aGF0IG1heSBiZSBvciBiZWNvbWUKKyAgICAgKiBhIGZpbGUgZW5jb2RlZCB3aXRoIHRoZSBkZWZhdWx0IDxjb2RlPmNoYXJzZXQ8L2NvZGU+IHJhdGhlciB0aGFuIFVTLUFTQ0lJLgorICAgICAqCisgICAgICogQHBhcmFtIGVuZm9yY2UgYSBib29sZWFuIHNwZWNpZnlpbmcgdGhlIHVzZSBvciBub3Qgb2YgVVMtQVNDSUkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW5mb3JjZThCaXQoYm9vbGVhbiBlbmZvcmNlKSB7CisgICAgICAgIHRoaXMuZW5mb3JjZThCaXQgPSBlbmZvcmNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGVuZm9yY2U4Qml0IGZsYWcsIGluIGNhc2Ugd2UgZG8gbm90IHdhbnQgdG8gZXZlciBnZXQgYSBVUy1BU0NJSSBlbmNvZGluZy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBib29sZWFuIHJlcHJlc2VudGluZyB0aGUgZmxhZyBvZiB1c2Ugb2YgVVMtQVNDSUkuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0RW5mb3JjZThCaXQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmVuZm9yY2U4Qml0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgZGVmYXVsdCBDaGFyc2V0CisgICAgICovCisgICAgcHVibGljIENoYXJzZXQgZ2V0RGVmYXVsdENoYXJzZXQoKSB7CisgICAgICAgIHJldHVybiBkZWZhdWx0Q2hhcnNldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD5HdWVzcyB0aGUgZW5jb2Rpbmcgb2YgdGhlIHByb3ZpZGVkIGJ1ZmZlci48L3A+CisgICAgICogSWYgQnl0ZSBPcmRlciBNYXJrZXJzIGFyZSBlbmNvdW50ZXJlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIsIHdlIGltbWlkaWF0ZWx5CisgICAgICogcmV0dXJuIHRoZSBjaGFyc2V0IGltcGxpZWQgYnkgdGhpcyBCT00uIE90aGVyd2lzZSwgdGhlIGZpbGUgd291bGQgbm90IGJlIGEgaHVtYW4KKyAgICAgKiByZWFkYWJsZSB0ZXh0IGZpbGUuPC9wPgorICAgICAqCisgICAgICogPHA+SWYgdGhlcmUgaXMgbm8gQk9NLCB0aGlzIG1ldGhvZCB0cmllcyB0byBkaXNjZXJuIHdoZXRoZXIgdGhlIGZpbGUgaXMgVVRGLTggb3Igbm90LgorICAgICAqIElmIGl0IGlzIG5vdCBVVEYtOCwgd2UgYXNzdW1lIHRoZSBlbmNvZGluZyBpcyB0aGUgZGVmYXVsdCBzeXN0ZW0gZW5jb2RpbmcKKyAgICAgKiAob2YgY291cnNlLCBpdCBtaWdodCBiZSBhbnkgOC1iaXQgY2hhcnNldCwgYnV0IHVzdWFsbHksIGFuIDgtYml0IGNoYXJzZXQgaXMgdGhlIGRlZmF1bHQgb25lKS48L3A+CisgICAgICoKKyAgICAgKiA8cD5JdCBpcyBwb3NzaWJsZSB0byBkaXNjZXJuIFVURi04IHRoYW5rcyB0byB0aGUgcGF0dGVybiBvZiBjaGFyYWN0ZXJzIHdpdGggYSBtdWx0aS1ieXRlIHNlcXVlbmNlLjwvcD4KKyAgICAgKiA8cHJlPgorICAgICAqIFVDUy00IHJhbmdlIChoZXguKSAgICAgICAgVVRGLTggb2N0ZXQgc2VxdWVuY2UgKGJpbmFyeSkKKyAgICAgKiAwMDAwIDAwMDAtMDAwMCAwMDdGICAgICAgIDB4eHh4eHh4CisgICAgICogMDAwMCAwMDgwLTAwMDAgMDdGRiAgICAgICAxMTB4eHh4eCAxMHh4eHh4eAorICAgICAqIDAwMDAgMDgwMC0wMDAwIEZGRkYgICAgICAgMTExMHh4eHggMTB4eHh4eHggMTB4eHh4eHgKKyAgICAgKiAwMDAxIDAwMDAtMDAxRiBGRkZGICAgICAgIDExMTEweHh4IDEweHh4eHh4IDEweHh4eHh4IDEweHh4eHh4CisgICAgICogMDAyMCAwMDAwLTAzRkYgRkZGRiAgICAgICAxMTExMTB4eCAxMHh4eHh4eCAxMHh4eHh4eCAxMHh4eHh4eCAxMHh4eHh4eAorICAgICAqIDA0MDAgMDAwMC03RkZGIEZGRkYgICAgICAgMTExMTExMHggMTB4eHh4eHggMTB4eHh4eHggMTB4eHh4eHggMTB4eHh4eHggMTB4eHh4eHgKKyAgICAgKiA8L3ByZT4KKyAgICAgKiA8cD5XaXRoIFVURi04LCAweEZFIGFuZCAweEZGIG5ldmVyIGFwcGVhci48L3A+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBDaGFyc2V0IHJlY29nbml6ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBDaGFyc2V0IGd1ZXNzRW5jb2RpbmcoKSB7CisgICAgICAgIC8vIGlmIHRoZSBmaWxlIGhhcyBhIEJ5dGUgT3JkZXIgTWFya2VyLCB3ZSBjYW4gYXNzdW1lIHRoZSBmaWxlIGlzIGluIFVURi14eAorICAgICAgICAvLyBvdGhlcndpc2UsIHRoZSBmaWxlIHdvdWxkIG5vdCBiZSBodW1hbiByZWFkYWJsZQorICAgICAgICBpZiAoaGFzVVRGOEJvbSgpKQorICAgICAgICAgICAgcmV0dXJuIENoYXJzZXQuZm9yTmFtZSgiVVRGLTgiKTsKKyAgICAgICAgaWYgKGhhc1VURjE2TEVCb20oKSkKKyAgICAgICAgICAgIHJldHVybiBDaGFyc2V0LmZvck5hbWUoIlVURi0xNkxFIik7CisgICAgICAgIGlmIChoYXNVVEYxNkJFQm9tKCkpCisgICAgICAgICAgICByZXR1cm4gQ2hhcnNldC5mb3JOYW1lKCJVVEYtMTZCRSIpOworCisgICAgICAgIC8vIGlmIGEgYnl0ZSBoYXMgaXRzIG1vc3Qgc2lnbmlmaWNhbnQgYml0IHNldCwgdGhlIGZpbGUgaXMgaW4gVVRGLTggb3IgaW4gdGhlIGRlZmF1bHQgZW5jb2RpbmcKKyAgICAgICAgLy8gb3RoZXJ3aXNlLCB0aGUgZmlsZSBpcyBpbiBVUy1BU0NJSQorICAgICAgICBib29sZWFuIGhpZ2hPcmRlckJpdCA9IGZhbHNlOworCisgICAgICAgIC8vIGlmIHRoZSBmaWxlIGlzIGluIFVURi04LCBoaWdoIG9yZGVyIGJ5dGVzIG11c3QgaGF2ZSBhIGNlcnRhaW4gdmFsdWUsIGluIG9yZGVyIHRvIGJlIHZhbGlkCisgICAgICAgIC8vIGlmIGl0J3Mgbm90IHRoZSBjYXNlLCB3ZSBjYW4gYXNzdW1lIHRoZSBlbmNvZGluZyBpcyB0aGUgZGVmYXVsdCBlbmNvZGluZyBvZiB0aGUgc3lzdGVtCisgICAgICAgIGJvb2xlYW4gdmFsaWRVOENoYXIgPSB0cnVlOworCisgICAgICAgIC8vIFRPRE8gdGhlIGJ1ZmZlciBpcyBub3QgcmVhZCB1cCB0byB0aGUgZW5kLCBidXQgdXAgdG8gbGVuZ3RoIC0gNgorCisgICAgICAgIGludCBsZW5ndGggPSBidWZmZXIubGVuZ3RoOworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIHdoaWxlIChpIDwgbGVuZ3RoIC0gNikgeworICAgICAgICAgICAgYnl0ZSBiMCA9IGJ1ZmZlcltpXTsKKyAgICAgICAgICAgIGJ5dGUgYjEgPSBidWZmZXJbaSArIDFdOworICAgICAgICAgICAgYnl0ZSBiMiA9IGJ1ZmZlcltpICsgMl07CisgICAgICAgICAgICBieXRlIGIzID0gYnVmZmVyW2kgKyAzXTsKKyAgICAgICAgICAgIGJ5dGUgYjQgPSBidWZmZXJbaSArIDRdOworICAgICAgICAgICAgYnl0ZSBiNSA9IGJ1ZmZlcltpICsgNV07CisgICAgICAgICAgICBpZiAoYjAgPCAwKSB7CisgICAgICAgICAgICAgICAgLy8gYSBoaWdoIG9yZGVyIGJpdCB3YXMgZW5jb3VudGVyZWQsIHRodXMgdGhlIGVuY29kaW5nIGlzIG5vdCBVUy1BU0NJSQorICAgICAgICAgICAgICAgIC8vIGl0IG1heSBiZSBlaXRoZXIgYW4gOC1iaXQgZW5jb2Rpbmcgb3IgVVRGLTgKKyAgICAgICAgICAgICAgICBoaWdoT3JkZXJCaXQgPSB0cnVlOworICAgICAgICAgICAgICAgIC8vIGEgdHdvLWJ5dGVzIHNlcXVlbmNlIHdhcyBlbmNvdXRlcmVkCisgICAgICAgICAgICAgICAgaWYgKGlzVHdvQnl0ZXNTZXF1ZW5jZShiMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlcmUgbXVzdCBiZSBvbmUgY29udGludWF0aW9uIGJ5dGUgb2YgdGhlIGZvcm0gMTB4eHh4eHgsCisgICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcmlzIGlzIG5vdCBhIHZhbGlkIFVURi04IGNvbnN0cnVjdAorICAgICAgICAgICAgICAgICAgICBpZiAoIWlzQ29udGludWF0aW9uQ2hhcihiMSkpCisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZFU4Q2hhciA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGEgdGhyZWUtYnl0ZXMgc2VxdWVuY2Ugd2FzIGVuY291dGVyZWQKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChpc1RocmVlQnl0ZXNTZXF1ZW5jZShiMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlcmUgbXVzdCBiZSB0d28gY29udGludWF0aW9uIGJ5dGVzIG9mIHRoZSBmb3JtIDEweHh4eHh4LAorICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJpcyBpcyBub3QgYSB2YWxpZCBVVEYtOCBjb25zdHJ1Y3QKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEoaXNDb250aW51YXRpb25DaGFyKGIxKSAmJiBpc0NvbnRpbnVhdGlvbkNoYXIoYjIpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkVThDaGFyID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gYSBmb3VyLWJ5dGVzIHNlcXVlbmNlIHdhcyBlbmNvdXRlcmVkCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNGb3VyQnl0ZXNTZXF1ZW5jZShiMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlcmUgbXVzdCBiZSB0aHJlZSBjb250aW51YXRpb24gYnl0ZXMgb2YgdGhlIGZvcm0gMTB4eHh4eHgsCisgICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcmlzIGlzIG5vdCBhIHZhbGlkIFVURi04IGNvbnN0cnVjdAorICAgICAgICAgICAgICAgICAgICBpZiAoIShpc0NvbnRpbnVhdGlvbkNoYXIoYjEpICYmIGlzQ29udGludWF0aW9uQ2hhcihiMikgJiYgaXNDb250aW51YXRpb25DaGFyKGIzKSkpCisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZFU4Q2hhciA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBpICs9IDM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGEgZml2ZS1ieXRlcyBzZXF1ZW5jZSB3YXMgZW5jb3V0ZXJlZAorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzRml2ZUJ5dGVzU2VxdWVuY2UoYjApKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHRoZXJlIG11c3QgYmUgZm91ciBjb250aW51YXRpb24gYnl0ZXMgb2YgdGhlIGZvcm0gMTB4eHh4eHgsCisgICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcmlzIGlzIG5vdCBhIHZhbGlkIFVURi04IGNvbnN0cnVjdAorICAgICAgICAgICAgICAgICAgICBpZiAoIShpc0NvbnRpbnVhdGlvbkNoYXIoYjEpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBpc0NvbnRpbnVhdGlvbkNoYXIoYjIpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBpc0NvbnRpbnVhdGlvbkNoYXIoYjMpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBpc0NvbnRpbnVhdGlvbkNoYXIoYjQpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkVThDaGFyID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gYSBzaXgtYnl0ZXMgc2VxdWVuY2Ugd2FzIGVuY291dGVyZWQKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChpc1NpeEJ5dGVzU2VxdWVuY2UoYjApKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHRoZXJlIG11c3QgYmUgZml2ZSBjb250aW51YXRpb24gYnl0ZXMgb2YgdGhlIGZvcm0gMTB4eHh4eHgsCisgICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcmlzIGlzIG5vdCBhIHZhbGlkIFVURi04IGNvbnN0cnVjdAorICAgICAgICAgICAgICAgICAgICBpZiAoIShpc0NvbnRpbnVhdGlvbkNoYXIoYjEpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBpc0NvbnRpbnVhdGlvbkNoYXIoYjIpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBpc0NvbnRpbnVhdGlvbkNoYXIoYjMpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBpc0NvbnRpbnVhdGlvbkNoYXIoYjQpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBpc0NvbnRpbnVhdGlvbkNoYXIoYjUpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkVThDaGFyID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gNTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB2YWxpZFU4Q2hhciA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCF2YWxpZFU4Q2hhcikKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgfQorICAgICAgICAvLyBpZiBubyBieXRlIHdpdGggYW4gaGlnaCBvcmRlciBiaXQgc2V0LCB0aGUgZW5jb2RpbmcgaXMgVVMtQVNDSUkKKyAgICAgICAgLy8gKGl0IG1pZ2h0IGhhdmUgYmVlbiBVVEYtNywgYnV0IHRoaXMgZW5jb2RpbmcgaXMgdXN1YWxseSBpbnRlcm5hbGx5IHVzZWQgb25seSBieSBtYWlsIHN5c3RlbXMpCisgICAgICAgIGlmICghaGlnaE9yZGVyQml0KSB7CisgICAgICAgICAgICAvLyByZXR1cm5zIHRoZSBkZWZhdWx0IGNoYXJzZXQgcmF0aGVyIHRoYW4gVVMtQVNDSUkgaWYgdGhlIGVuZm9yY2U4Qml0IGZsYWcgaXMgc2V0LgorICAgICAgICAgICAgaWYgKHRoaXMuZW5mb3JjZThCaXQpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdENoYXJzZXQ7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIENoYXJzZXQuZm9yTmFtZSgiVVMtQVNDSUkiKTsKKyAgICAgICAgfQorICAgICAgICAvLyBpZiBubyBpbnZhbGlkIFVURi04IHdlcmUgZW5jb3VudGVyZWQsIHdlIGNhbiBhc3N1bWUgdGhlIGVuY29kaW5nIGlzIFVURi04LAorICAgICAgICAvLyBvdGhlcndpc2UgdGhlIGZpbGUgd291bGQgbm90IGJlIGh1bWFuIHJlYWRhYmxlCisgICAgICAgIGlmICh2YWxpZFU4Q2hhcikKKyAgICAgICAgICAgIHJldHVybiBDaGFyc2V0LmZvck5hbWUoIlVURi04Iik7CisgICAgICAgIC8vIGZpbmFsbHksIGlmIGl0J3Mgbm90IFVURi04IG5vciBVUy1BU0NJSSwgbGV0J3MgYXNzdW1lIHRoZSBlbmNvZGluZyBpcyB0aGUgZGVmYXVsdCBlbmNvZGluZworICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0Q2hhcnNldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0aGUgYnl0ZSBoYXMgdGhlIGZvcm0gMTB4eHh4eCwgdGhlbiBpdCdzIGEgY29udGludWF0aW9uIGJ5dGUgb2YgYSBtdWx0aXBsZSBieXRlIGNoYXJhY3RlcjsKKyAgICAgKgorICAgICAqIEBwYXJhbSBiIGEgYnl0ZS4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgaXQncyBhIGNvbnRpbnVhdGlvbiBjaGFyLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNDb250aW51YXRpb25DaGFyKGJ5dGUgYikgeworICAgICAgICByZXR1cm4gLTEyOCA8PSBiICYmIGIgPD0gLTY1OworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRoZSBieXRlIGhhcyB0aGUgZm9ybSAxMTB4eHh4LCB0aGVuIGl0J3MgdGhlIGZpcnN0IGJ5dGUgb2YgYSB0d28tYnl0ZXMgc2VxdWVuY2UgY2hhcmFjdGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGIgYSBieXRlLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBpdCdzIHRoZSBmaXJzdCBieXRlIG9mIGEgdHdvLWJ5dGVzIHNlcXVlbmNlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNUd29CeXRlc1NlcXVlbmNlKGJ5dGUgYikgeworICAgICAgICByZXR1cm4gLTY0IDw9IGIgJiYgYiA8PSAtMzM7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdGhlIGJ5dGUgaGFzIHRoZSBmb3JtIDExMTB4eHgsIHRoZW4gaXQncyB0aGUgZmlyc3QgYnl0ZSBvZiBhIHRocmVlLWJ5dGVzIHNlcXVlbmNlIGNoYXJhY3Rlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiIGEgYnl0ZS4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgaXQncyB0aGUgZmlyc3QgYnl0ZSBvZiBhIHRocmVlLWJ5dGVzIHNlcXVlbmNlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNUaHJlZUJ5dGVzU2VxdWVuY2UoYnl0ZSBiKSB7CisgICAgICAgIHJldHVybiAtMzIgPD0gYiAmJiBiIDw9IC0xNzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0aGUgYnl0ZSBoYXMgdGhlIGZvcm0gMTExMTB4eCwgdGhlbiBpdCdzIHRoZSBmaXJzdCBieXRlIG9mIGEgZm91ci1ieXRlcyBzZXF1ZW5jZSBjaGFyYWN0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYiBhIGJ5dGUuCisgICAgICogQHJldHVybiB0cnVlIGlmIGl0J3MgdGhlIGZpcnN0IGJ5dGUgb2YgYSBmb3VyLWJ5dGVzIHNlcXVlbmNlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNGb3VyQnl0ZXNTZXF1ZW5jZShieXRlIGIpIHsKKyAgICAgICAgcmV0dXJuIC0xNiA8PSBiICYmIGIgPD0gLTk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdGhlIGJ5dGUgaGFzIHRoZSBmb3JtIDExMTEweHgsIHRoZW4gaXQncyB0aGUgZmlyc3QgYnl0ZSBvZiBhIGZpdmUtYnl0ZXMgc2VxdWVuY2UgY2hhcmFjdGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGIgYSBieXRlLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBpdCdzIHRoZSBmaXJzdCBieXRlIG9mIGEgZml2ZS1ieXRlcyBzZXF1ZW5jZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRml2ZUJ5dGVzU2VxdWVuY2UoYnl0ZSBiKSB7CisgICAgICAgIHJldHVybiAtOCA8PSBiICYmIGIgPD0gLTU7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdGhlIGJ5dGUgaGFzIHRoZSBmb3JtIDExMTB4eHgsIHRoZW4gaXQncyB0aGUgZmlyc3QgYnl0ZSBvZiBhIHNpeC1ieXRlcyBzZXF1ZW5jZSBjaGFyYWN0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYiBhIGJ5dGUuCisgICAgICogQHJldHVybiB0cnVlIGlmIGl0J3MgdGhlIGZpcnN0IGJ5dGUgb2YgYSBzaXgtYnl0ZXMgc2VxdWVuY2UuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1NpeEJ5dGVzU2VxdWVuY2UoYnl0ZSBiKSB7CisgICAgICAgIHJldHVybiAtNCA8PSBiICYmIGIgPD0gLTM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmUgdGhlIGRlZmF1bHQgY2hhcnNldCBvZiB0aGUgc3lzdGVtLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgZGVmYXVsdCA8Y29kZT5DaGFyc2V0PC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENoYXJzZXQgZ2V0RGVmYXVsdFN5c3RlbUNoYXJzZXQoKSB7CisgICAgICAgIHJldHVybiBDaGFyc2V0LmZvck5hbWUoU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLmVuY29kaW5nIikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhhcyBhIEJ5dGUgT3JkZXIgTWFya2VyIGZvciBVVEYtOCAoVXNlZCBieSBNaWNyb3NvZnQncyBOb3RlcGFkIGFuZCBvdGhlciBlZGl0b3JzKS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgYnVmZmVyIGhhcyBhIEJPTSBmb3IgVVRGOC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNVVEY4Qm9tKCkgeworICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCA+PSAzKQorICAgICAgICAgICAgcmV0dXJuIChidWZmZXJbMF0gPT0gLTE3ICYmIGJ1ZmZlclsxXSA9PSAtNjkgJiYgYnVmZmVyWzJdID09IC02NSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIYXMgYSBCeXRlIE9yZGVyIE1hcmtlciBmb3IgVVRGLTE2IExvdyBFbmRpYW4KKyAgICAgKiAodWNzLTJsZSwgdWNzLTRsZSwgYW5kIHVjcy0xNmxlKS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgYnVmZmVyIGhhcyBhIEJPTSBmb3IgVVRGLTE2IExvdyBFbmRpYW4uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzVVRGMTZMRUJvbSgpIHsKKyAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPj0gMikKKyAgICAgICAgICAgIHJldHVybiAoYnVmZmVyWzBdID09IC0xICYmIGJ1ZmZlclsxXSA9PSAtMik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIYXMgYSBCeXRlIE9yZGVyIE1hcmtlciBmb3IgVVRGLTE2IEJpZyBFbmRpYW4KKyAgICAgKiAodXRmLTE2IGFuZCB1Y3MtMikuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGJ1ZmZlciBoYXMgYSBCT00gZm9yIFVURi0xNiBCaWcgRW5kaWFuLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc1VURjE2QkVCb20oKSB7CisgICAgICAgIGlmIChidWZmZXIubGVuZ3RoID49IDIpCisgICAgICAgICAgICByZXR1cm4gKGJ1ZmZlclswXSA9PSAtMiAmJiBidWZmZXJbMV0gPT0gLTEpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyBhIDxjb2RlPkJ1ZmZlcmVkUmVhZGVyPC9jb2RlPiAoaW5kZWVkIGEgPGNvZGU+TGluZU51bWJlclJlYWRlcjwvY29kZT4pIGZyb20gdGhlIDxjb2RlPkZpbGU8L2NvZGU+CisgICAgICogc3BlY2lmaWVkIGluIHRoZSBjb25zdHJ1Y3RvciBvZiA8Y29kZT5DaGFyc2V0VG9vbGtpdDwvY29kZT4gdXNpbmcgdGhlIGNoYXJzZXQgZGlzY292ZXJlZCBieSB0aGUKKyAgICAgKiBtZXRob2QgPGNvZGU+Z3Vlc3NFbmNvZGluZygpPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSA8Y29kZT5CdWZmZXJlZFJlYWRlcjwvY29kZT4KKyAgICAgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBpZiB0aGUgZmlsZSBpcyBub3QgZm91bmQuCisgICAgICovCisgICAgcHVibGljIEJ1ZmZlcmVkUmVhZGVyIGdldFJlYWRlcigpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBMaW5lTnVtYmVyUmVhZGVyIHJlYWRlciA9IG5ldyBMaW5lTnVtYmVyUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpLCBnZXRDaGFyc2V0KCkpKTsKKyAgICAgICAgaWYgKGhhc1VURjhCb20oKSB8fCBoYXNVVEYxNkxFQm9tKCkgfHwgaGFzVVRGMTZCRUJvbSgpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJlYWRlci5yZWFkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIHNob3VsZCBuZXZlciBoYXBwZW4sIGFzIGEgZmlsZSB3aXRoIG5vIGNvbnRlbnQKKyAgICAgICAgICAgICAgICAvLyBidXQgd2l0aCBhIEJPTSBoYXMgYXQgbGVhc3Qgb25lIGNoYXIKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVhZGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyBhbGwgdGhlIGF2YWlsYWJsZSA8Y29kZT5DaGFyc2V0PC9jb2RlPnMgb24gdGhlIHBsYXRmb3JtLAorICAgICAqIGFtb25nIHdoaWNoIHRoZSBkZWZhdWx0IDxjb2RlPmNoYXJzZXQ8L2NvZGU+LgorICAgICAqCisgICAgICogQHJldHVybiBhbiBhcnJheSBvZiA8Y29kZT5DaGFyc2V0PC9jb2RlPnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDaGFyc2V0W10gZ2V0QXZhaWxhYmxlQ2hhcnNldHMoKSB7CisgICAgICAgIENvbGxlY3Rpb24gY29sbGVjdGlvbiA9IENoYXJzZXQuYXZhaWxhYmxlQ2hhcnNldHMoKS52YWx1ZXMoKTsKKyAgICAgICAgcmV0dXJuIChDaGFyc2V0W10pIGNvbGxlY3Rpb24udG9BcnJheShuZXcgQ2hhcnNldFtjb2xsZWN0aW9uLnNpemUoKV0pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdXRpbC9DbGlCdWlsZGVyLmdyb292eSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdXRpbC9DbGlCdWlsZGVyLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTg4MGU0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91dGlsL0NsaUJ1aWxkZXIuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTIxIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBncm9vdnkudXRpbAorCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNsaS4qCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLkludm9rZXJIZWxwZXIKKworCisvKioKKyAgICBTdXBwb3J0ZWQgT3B0aW9uIFByb3BlcnRpZXM6CisgICAgYXJnTmFtZTogICAgICAgIFN0cmluZworICAgIGxvbmdPcHQ6ICAgICAgICBTdHJpbmcKKyAgICBhcmdzOiAgICAgICAgICAgaW50CisgICAgb3B0aW9uYWxBcmc6ICAgIGJvb2xlYW4KKyAgICByZXF1aXJlZDogICAgICAgYm9vbGVhbgorICAgIHR5cGU6ICAgICAgICAgICBPYmplY3QKKyAgICB2YWx1ZVNlcGFyYXRvcjogY2hhcgorCisgICAgQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMuY2xpLk9wdGlvbiBmb3IgbWVhbmluZyBvZiB0aGUgcGFyYW1ldGVycy4KKyAgICBAc2VlIENsaUJ1aWxkZXJUZXN0IGZvciBleGFtcGxlIHVzYWdlcy4KKyAgICBAYXV0aG9yIERpZXJrIEtvZW5pZworKi8KKworY2xhc3MgQ2xpQnVpbGRlciB7CisKKyAgICAvLyBkZWZhdWx0IHNldHRpbmdzOiB1c2Ugc2V0dGVycyB0byBvdmVycmlkZQorICAgIFN0cmluZyB1c2FnZSAgICAgICAgICAgICA9ICdncm9vdnknCisgICAgQ29tbWFuZExpbmVQYXJzZXIgcGFyc2VyID0gbmV3IFBvc2l4UGFyc2VyKCkKKyAgICBIZWxwRm9ybWF0dGVyIGZvcm1hdHRlciAgPSBuZXcgSGVscEZvcm1hdHRlcigpCisgICAgUHJpbnRXcml0ZXIgd3JpdGVyICAgICAgID0gbmV3IFByaW50V3JpdGVyKFN5c3RlbS5vdXQpCisKKyAgICBPcHRpb25zIG9wdGlvbnMgICAgICAgICAgPSBuZXcgT3B0aW9ucygpCisKKyAgICAvKioKKyAgICAgICAgUmVjb2duaXplIGFsbCBvbmUtY2hhcmFjdGVyIG1ldGhvZCBjYWxscyBhcyBvcHRpb24gc3BlY2lmaWNhdGlvbnMuCisgICAgKi8KKyAgICBkZWYgaW52b2tlTWV0aG9kKFN0cmluZyBuYW1lLCBPYmplY3QgYXJncyl7CisgICAgICAgIGlmICgxID09IG5hbWUuc2l6ZSgpKSB7CisgICAgICAgICAgICBvcHRpb25zLmFkZE9wdGlvbihvcHRpb24obmFtZSwgYXJnc1swXSwgYXJnc1sxXSkpCisgICAgICAgICAgICByZXR1cm4gbnVsbAorICAgICAgICB9CisgICAgICAgIHJldHVybiBJbnZva2VySGVscGVyLmdldE1ldGFDbGFzcyh0aGlzKS5pbnZva2VNZXRob2QodGhpcywgbmFtZSwgYXJncykKKyAgICB9CisKKyAgICAvKioKKyAgICAgICAgTWFrZSBvcHRpb25zIGFjY2Vzc2libGUgZnJvbSBjb21tYW5kIGxpbmUgYXJncyB3aXRoIHBhcnNlciAoZGVmYXVsdDogUG9zaXgpLgorICAgICAgICBSZXR1cm5zIG51bGwgb24gYmFkIGNvbW1hbmQgbGluZXMuCisgICAgKi8KKyAgICBPcHRpb25BY2Nlc3NvciBwYXJzZShhcmdzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE9wdGlvbkFjY2Vzc29yKCBwYXJzZXIucGFyc2Uob3B0aW9ucywgYXJncyBhcyBTdHJpbmdbXSwgdHJ1ZSkgKQorICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBwZSkgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oImVycm9yOiAiICsgcGUuZ2V0TWVzc2FnZSgpKQorICAgICAgICAgICAgdXNhZ2UoKQorICAgICAgICAgICAgcmV0dXJuIG51bGwKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAgICBQcmludCB0aGUgdXNhZ2UgbWVzc2FnZSB3aXRoIHdyaXRlciAoZGVmYXVsdDogU3lzdGVtLm91dCkgYW5kIGZvcm1hdHRlciAoZGVmYXVsdDogSGVscEZvcm1hdHRlcikKKyAgICAqLworICAgIHZvaWQgdXNhZ2UoKXsKKyAgICAgICAgZm9ybWF0dGVyLnByaW50SGVscCh3cml0ZXIsIGZvcm1hdHRlci5kZWZhdWx0V2lkdGgsIHVzYWdlLCAnJywgb3B0aW9ucywgZm9ybWF0dGVyLmRlZmF1bHRMZWZ0UGFkLCBmb3JtYXR0ZXIuZGVmYXVsdERlc2NQYWQsICcnKQorICAgICAgICB3cml0ZXIuZmx1c2goKQorICAgIH0KKworICAgIC8vIGltcGxlbWVudGF0aW9uIGRldGFpbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLyoqCisgICAgICAgIEhvdyB0byBjcmVhdGUgYW4gb3B0aW9uIGZyb20gdGhlIHNwZWNpZmljYXRpb24uCisgICAgKi8KKyAgICBPcHRpb24gb3B0aW9uIChzaG9ydG5hbWUsIE1hcCBkZXRhaWxzLCBpbmZvKXsKKyAgICAgICAgT3B0aW9uIG9wdGlvbiA9IG5ldyBPcHRpb24oIHNob3J0bmFtZSwgaW5mbykKKyAgICAgICAgZGV0YWlscy5lYWNoIHsga2V5LCB2YWx1ZSAtPgorICAgICAgICAgICAgaWYgKGtleSA9PSAnb3B0aW9uYWxBcmcnKSAgICAgICAvLyBzdXJwcmlzaW5nIHRoYXQgdGhpcyBleHRyYSBoYW5kbGluZyBpcyBuZWVkZWQKKyAgICAgICAgICAgICAgICBvcHRpb24uc2V0T3B0aW9uYWxBcmcodmFsdWUpCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgb3B0aW9uW2tleV0gPSB2YWx1ZQorICAgICAgICB9CisgICAgICAgIHJldHVybiBvcHRpb24KKyAgICB9Cit9CisKK2NsYXNzIE9wdGlvbkFjY2Vzc29yIHsKKyAgICBDb21tYW5kTGluZSBpbm5lcgorICAgIE9wdGlvbkFjY2Vzc29yKENvbW1hbmRMaW5lIGlubmVyKXsKKyAgICAgICAgdGhpcy5pbm5lciA9IGlubmVyCisgICAgfQorICAgIGRlZiBpbnZva2VNZXRob2QoU3RyaW5nIG5hbWUsIE9iamVjdCBhcmdzKXsKKyAgICAgICAgcmV0dXJuIEludm9rZXJIZWxwZXIuZ2V0TWV0YUNsYXNzKGlubmVyKS5pbnZva2VNZXRob2QoaW5uZXIsIG5hbWUsIGFyZ3MpCisgICAgfQorICAgIGRlZiBnZXRQcm9wZXJ0eShTdHJpbmcgbmFtZSkgeworICAgICAgICBkZWYgbWV0aG9kbmFtZSA9ICdnZXRPcHRpb25WYWx1ZScKKyAgICAgICAgaWYgKG5hbWUuc2l6ZSgpID4gMSAmJiBuYW1lLmVuZHNXaXRoKCdzJykpIHsKKyAgICAgICAgICAgIG5hbWUgPSBuYW1lWzAuLi0yXQorICAgICAgICAgICAgbWV0aG9kbmFtZSArPSAncycKKyAgICAgICAgfQorICAgICAgICBpZiAobmFtZS5zaXplKCkgPT0gMSkgbmFtZSA9IG5hbWUgYXMgY2hhcgorICAgICAgICBkZWYgcmVzdWx0ID0gSW52b2tlckhlbHBlci5nZXRNZXRhQ2xhc3MoaW5uZXIpLmludm9rZU1ldGhvZChpbm5lciwgbWV0aG9kbmFtZSwgbmFtZSkKKyAgICAgICAgaWYgKG51bGwgPT0gcmVzdWx0KSByZXN1bHQgPSBpbm5lci5oYXNPcHRpb24obmFtZSkKKyAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFN0cmluZ1tdKSByZXN1bHQgPSByZXN1bHQudG9MaXN0KCkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgIH0KKyAgICBMaXN0IGFyZ3VtZW50cygpIHsKKyAgICAgICAgaW5uZXIuZ2V0QXJncygpLnRvTGlzdCgpCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91dGlsL0Nsb3N1cmVDb21wYXJhdG9yLmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvQ2xvc3VyZUNvbXBhcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjU1YzE0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91dGlsL0Nsb3N1cmVDb21wYXJhdG9yLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGdyb292eS51dGlsOworCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuQ2xvc3VyZTsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUudHlwZWhhbmRsaW5nLkRlZmF1bHRUeXBlVHJhbnNmb3JtYXRpb247CisKKy8qKgorICogQSBDb21wYXJhdG9yIHdoaWNoIHVzZXMgYSBjbG9zdXJlIHRvIGNvbXBhcmUgMiB2YWx1ZXMgYmVpbmcgZXF1YWwKKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIENsb3N1cmVDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7CisKKyAgICBDbG9zdXJlIGNsb3N1cmU7CisKKyAgICBwdWJsaWMgQ2xvc3VyZUNvbXBhcmF0b3IoQ2xvc3VyZSBjbG9zdXJlKSB7CisgICAgICAgIHRoaXMuY2xvc3VyZSA9IGNsb3N1cmU7CisgICAgfQorCisgICAgcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvYmplY3QxLCBPYmplY3Qgb2JqZWN0MikgeworICAgICAgICBPYmplY3QgdmFsdWUgPSBjbG9zdXJlLmNhbGwobmV3IE9iamVjdFtdIHtvYmplY3QxLCBvYmplY3QyfSk7CisgICAgICAgIHJldHVybiBEZWZhdWx0VHlwZVRyYW5zZm9ybWF0aW9uLmludFVuYm94KHZhbHVlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvQ29uZmlnT2JqZWN0Lmdyb292eSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdXRpbC9Db25maWdPYmplY3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMGVjZTIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvQ29uZmlnT2JqZWN0Lmdyb292eQpAQCAtMCwwICsxLDI0NiBAQAorLyogQ29weXJpZ2h0IDIwMDYtMjAwNyBHcmFlbWUgUm9jaGVyCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGdyb292eS51dGlsCisKKworLyoqCisqIEEgQ29uZmlnT2JqZWN0IGF0IGEgc2ltcGxlIGxldmVsIGlzIGEgTWFwIHRoYXQgY3JlYXRlcyBjb25maWd1cmF0aW9uIGVudHJpZXMgKG90aGVyIENvbmZpZ09iamVjdHMpIHdoZW4gcmVmZXJlbmNpbmcgdGhlbS4KKyogVGhpcyBtZWFucyB0aGF0IG5hdmlnYXRpbmcgdG8gZm9vLmJhci5zdHVmZiB3aWxsIG5vdCByZXR1cm4gbnVsbCBidXQgbmVzdGVkIENvbmZpZ09iamVjdHMgd2hpY2ggYXJlIG9mIGNvdXJzZSBlbXB0eSBtYXBzCisqIFRoZSBHcm9vdnkgdHJ1dGggY2FuIGJlIHVzZWQgdG8gY2hlY2sgZm9yIHRoZSBleGlzdGFuY2Ugb2YgInJlYWwiIGVudHJpZXMuCisqCisqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgorKiBAc2luY2UgMS4xCisqLworY2xhc3MgQ29uZmlnT2JqZWN0IGV4dGVuZHMgTGlua2VkSGFzaE1hcCBpbXBsZW1lbnRzIFdyaXRhYmxlIHsKKworICAgIC8vIHdvdWxkIGJlIGJldHRlciB0byBoYXZlIHRoZXNlIGF2YWlsYWJlIGFzIGNvbnN0YW50cyBmcm9tIEdyb292eSwgYnV0IGNvdWxkbid0IGZpbmQKKyAgICBzdGF0aWMgZmluYWwgS0VZV09SRFMgPSBbJ2NsYXNzJywgJ2V4dGVuZHMnLCAnaW1wbGVtZW50cycsICdwYWNrYWdlJywncmV0dXJuJywnZGVmJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RyeScsJ2ZpbmFsbHknLCd0aGlzJywnbmV3JywnY2F0Y2gnLCdzd2l0Y2gnLCdjYXNlJywnZGVmYXVsdCcsJ3doaWxlJywnaWYnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZWxzZScsJ2Vsc2VpZicsJ3ByaXZhdGUnLCdwcm90ZWN0ZWQnLCdmaW5hbCcsJ2ZvcicsJ2luJywnYnl0ZScsJ3Nob3J0JywnYnJlYWsnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5zdGFuY2VvZicsJ3N5bmNocm9uaXplZCcsJ2NvbnN0JywnZmxvYXQnLCdudWxsJywndGhyb3dzJywnZG8nLCdzdXBlcicsJ3dpdGgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGhyZWFkc2FmZScsJ3RyYW5zaWVudCcsJ25hdGl2ZScsJ2ludGVyZmFjZScsJ2FueScsJ2RvdWJsZScsJ3ZvbGF0aWxlJywnYXMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXNzZXJ0JywnZ290bycsJ2VudW0nLCdpbnQnLCdib29sZWFuJywnY2hhcicsJ2ZhbHNlJywndHJ1ZScsJ3N0YXRpYycsJ2Fic3RyYWN0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbnRpbnVlJywnaW1wb3J0Jywndm9pZCcsJ2xvbmcnXQorCisgICAgc3RhdGljIGZpbmFsIFRBQl9DSEFSQUNURVIgPSAnXHQnCisKKwkvKioKKwkgKiBUaGUgY29uZmlnIGZpbGUgdGhhdCB3YXMgdXNlZCB3aGVuIHBhcnNpbmcgdGhpcyBDb25maWdPYmplY3QKKwkgKi8KKyAgICBVUkwgY29uZmlnRmlsZQorCisgICAgQ29uZmlnT2JqZWN0KFVSTCBmaWxlKSB7CisgICAgICAgIHRoaXMuY29uZmlnRmlsZSA9IGZpbGUKKyAgICB9CisKKyAgICBDb25maWdPYmplY3QoKSB7fQorCisgICAgLyoqCisJICogV3JpdGVzIHRoaXMgY29uZmlnIG9iamVjdCBpbnRvIGEgU3RyaW5nIHNlcmlhbGl6ZWQgcmVwcmVzZW50YXRpb24gd2hpY2ggY2FuIGxhdGVyIGJlIHBhcnNlZCBiYWNrIHVzaW5nIHRoZSBwYXJzZSgpCisJICogbWV0aG9kCisJICoKKyAgICAgKiBAc2VlIGdyb292eS5sYW5nLldyaXRhYmxlI3dyaXRlVG8oamF2YS5pby5Xcml0ZXIpCisgICAgICogQHNlZSAjcGFyc2UoVVJMKQorICAgICAqLyAKKwlXcml0ZXIgd3JpdGVUbyhXcml0ZXIgb3V0QXJnKSB7CisgICAgICAgIGRlZiBvdXQKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG91dCA9IG5ldyBCdWZmZXJlZFdyaXRlcihvdXRBcmcpCisgICAgICAgICAgICB3cml0ZUNvbmZpZygiIix0aGlzLCBvdXQsIDAsIGZhbHNlKQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgb3V0LmZsdXNoKCkKKyAgICAgICAgfQorCisJCXJldHVybiBvdXRBcmcKKwl9CisgICAgICAgICAgICAgICAgICAKKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlcyB0aGUgZGVmYXVsdCBnZXRQcm9wZXJ0eSBpbXBsZW1lbnRhdGlvbiB0byBjcmVhdGUgbmVzdGVkIENvbmZpZ09iamVjdCBpbnN0YW5jZXMgb24gZGVtYW5kCisgICAgICogZm9yIG5vbi1leGlzdGFudCBrZXlzCisgICAgICovCisgICAgZGVmIGdldFByb3BlcnR5KFN0cmluZyBuYW1lKSB7ICAKKwkJaWYobmFtZSA9PSAnY29uZmlnRmlsZScpIHJldHVybiB0aGlzLmNvbmZpZ0ZpbGUKKyAgICAgICAgZGVmIHByb3AgPSBnZXQobmFtZSkKKyAgICAgICAgaWYocHJvcCA9PSBudWxsKSBwcm9wID0gbmV3IENvbmZpZ09iamVjdCh0aGlzLmNvbmZpZ0ZpbGUpCisgICAgICAgIHB1dChuYW1lLCBwcm9wKQorICAgICAgICByZXR1cm4gcHJvcAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBBIENvbmZpZ09iamVjdCBpcyBhIHRyZWUgc3RydWN0dXJlIGNvbnNpc3Rpbmcgb2YgbmVzdGVkIG1hcHMuIFRoaXMgZmxhdHRlbnMgdGhlIG1hcHMgaW50bworICAgICAqIGEgc2luZ2xlIGxldmVsIHN0cnVjdHVyZSBsaWtlIGEgcHJvcGVydGllcyBmaWxlCisgICAgICovCisgICAgTWFwIGZsYXR0ZW4oKSB7CisgICAgICAgIHJldHVybiBmbGF0dGVuKG51bGwpCisgICAgfQorICAgIC8qKgorICAgICAqIEZsYXR0ZW5zIHRoaXMgQ29uZmlnT2JqZWN0IHBvcHVsYXRpbmcgdGhlIHJlc3VsdHMgaW50byB0aGUgdGFyZ2V0IE1hcAorICAgICAqCisgICAgICogQHNlZSBDb25maWdPYmplY3QjZmxhdHRlbigpCisgICAgICovCisgICAgTWFwIGZsYXR0ZW4oTWFwIHRhcmdldCkgeworICAgICAgICBpZih0YXJnZXQgPT0gbnVsbCl0YXJnZXQgPSBuZXcgQ29uZmlnT2JqZWN0KCkKKyAgICAgICAgcG9wdWxhdGUoIiIsIHRhcmdldCwgdGhpcykKKyAgICAgICAgdGFyZ2V0CisgICAgfQorCisgICAgLyoqCisgICAgICogTWVyZ2VzIHRoZSBnaXZlbiBtYXAgd2l0aCB0aGlzIENvbmZpZ09iamVjdCBvdmVycmlkaW5nIGFueSBtYXRjaGluZyBjb25maWd1cmF0aW9uIGVudHJpZXMgaW4gdGhpcyBDb25maWdPYmplY3QKKyAgICAgKgorICAgICAqIEBwYXJhbSBvdGhlciBUaGUgQ29uZmlnT2JqZWN0IHRvIG1lcmdlIHdpdGgKKyAgICAgKiBAcmV0dXJuIFRoZSByZXN1bHQgb2YgdGhlIG1lcmdlCisgICAgICovCisgICAgTWFwIG1lcmdlKENvbmZpZ09iamVjdCBvdGhlcikgeworICAgICAgICByZXR1cm4gbWVyZ2UodGhpcyxvdGhlcikKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIHRoaXMgQ29uZmlnT2JqZWN0IGludG8gYSB0aGUgamF2YS51dGlsLlByb3BlcnRpZXMgZm9ybWF0LCBmbGF0dGVuaW5nIHRoZSB0cmVlIHN0cnVjdHVyZSBiZWZvcmVoYW5kCisgICAgICogQHJldHVybiBBIGphdmEudXRpbC5Qcm9wZXJ0aWVzIGluc3RhbmNlCisgICAgICovCisgICAgUHJvcGVydGllcyB0b1Byb3BlcnRpZXMoKSB7CisgICAgICAgIGRlZiBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCkKKyAgICAgICAgZmxhdHRlbihwcm9wcykKKyAgICAgICAgcHJvcHMgPSBjb252ZXJ0VmFsdWVzVG9TdHJpbmcocHJvcHMpCisgICAgICAgIHJldHVybiBwcm9wcworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIHRoaXMgQ29uZmlnT2JqZWN0IGlubyB0aGUgamF2YS51dGlsLlByb3BlcnRpZXMgZm9ybWF0LCBmbGF0dGVuIHRoZSB0cmVlIGFuZCBwcmVmaXhpbmcgYWxsIGVudHJpZXMgd2l0aCB0aGUgZ2l2ZW4gcHJlZml4CisgICAgICogQHBhcmFtIHByZWZpeCBUaGUgcHJlZml4IHRvIGFwcGVuZCBiZWZvcmUgcHJvcGVydHkgZW50cmllcworICAgICAqIEByZXR1cm4gQSBqYXZhLnV0aWwuUHJvcGVydGllcyBpbnN0YW5jZQorICAgICAqLworICAgIFByb3BlcnRpZXMgdG9Qcm9wZXJ0aWVzKFN0cmluZyBwcmVmaXgpIHsKKyAgICAgICAgZGVmIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKQorICAgICAgICBwb3B1bGF0ZSgiJHtwcmVmaXh9LiIsIHByb3BzLCB0aGlzKQorICAgICAgICBwcm9wcyA9IGNvbnZlcnRWYWx1ZXNUb1N0cmluZyhwcm9wcykKKyAgICAgICAgcmV0dXJuIHByb3BzCisgICAgfQorCisgICAgcHJpdmF0ZSBtZXJnZShNYXAgY29uZmlnLCBNYXAgb3RoZXIpIHsKKyAgICAgICAgZm9yKGVudHJ5IGluIG90aGVyKSB7CisKKyAgICAgICAgICAgIGRlZiBjb25maWdFbnRyeSA9IGNvbmZpZ1tlbnRyeS5rZXldCisgICAgICAgICAgICBpZihjb25maWdFbnRyeSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29uZmlnW2VudHJ5LmtleV0gPSBlbnRyeS52YWx1ZQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZihjb25maWdFbnRyeSBpbnN0YW5jZW9mIE1hcCAmJiBjb25maWdFbnRyeS5zaXplKCkgPiAwICYmIGVudHJ5LnZhbHVlIGluc3RhbmNlb2YgTWFwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHJlY3Vyc2UKKyAgICAgICAgICAgICAgICAgICAgbWVyZ2UoY29uZmlnRW50cnksIGVudHJ5LnZhbHVlKQorICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZ1tlbnRyeS5rZXldID0gZW50cnkudmFsdWUKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29uZmlnCisKKyAgICB9CisKKyAgICBwcml2YXRlIHdyaXRlQ29uZmlnKFN0cmluZyBwcmVmaXgsQ29uZmlnT2JqZWN0IG1hcCwgb3V0LCBJbnRlZ2VyIHRhYiwgYm9vbGVhbiBhcHBseSkgeworICAgICAgICBkZWYgc3BhY2UgPSBhcHBseSA/IFRBQl9DSEFSQUNURVIqdGFiIDogJycKKyAgICAgICAgZm9yKGtleSBpbiBtYXAua2V5U2V0KCkpIHsKKyAgICAgICAgICAgIGRlZiB2YWx1ZSA9IG1hcC5nZXQoa2V5KQorCisKKwkJCWlmKHZhbHVlIGluc3RhbmNlb2YgQ29uZmlnT2JqZWN0KSB7CisgICAgICAgICAgICAgICAgZGVmIGRvdHNJbktleXMgPSB2YWx1ZS5maW5kIHsgZW50cnkgLT4gZW50cnkua2V5LmluZGV4T2YoJy4nKSA+IC0xIH0KKyAgICAgICAgICAgICAgICBkZWYgY29uZmlnU2l6ZSA9IHZhbHVlLnNpemUoKQorICAgICAgICAgICAgICAgIGRlZiBmaXJzdEtleSA9IHZhbHVlLmtleVNldCgpLml0ZXJhdG9yKCkubmV4dCgpCisgICAgICAgICAgICAgICAgZGVmIGZpcnN0VmFsdWUgPSB2YWx1ZS52YWx1ZXMoKS5pdGVyYXRvcigpLm5leHQoKQorICAgICAgICAgICAgICAgIGRlZiBmaXJzdFNpemUKKyAgICAgICAgICAgICAgICBpZihmaXJzdFZhbHVlIGluc3RhbmNlb2YgQ29uZmlnT2JqZWN0KXsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3RTaXplID0gZmlyc3RWYWx1ZS5zaXplKCkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7IGZpcnN0U2l6ZSA9IDEgfQorCQkJCWlmKGNvbmZpZ1NpemUgPT0gMXx8IGRvdHNJbktleXMgKSAgeworCisgICAgICAgICAgICAgICAgICAgIGlmKGZpcnN0U2l6ZSA9PSAxICYmIGZpcnN0VmFsdWUgaW5zdGFuY2VvZiBDb25maWdPYmplY3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IEtFWVdPUkRTLmNvbnRhaW5zKGtleSkgPyBrZXkuaW5zcGVjdCgpIDoga2V5CisgICAgICAgICAgICAgICAgICAgICAgICBkZWYgd3JpdGVQcmVmaXggPSAiJHtwcmVmaXh9JHtrZXl9LiR7Zmlyc3RLZXl9LiIKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQ29uZmlnKHdyaXRlUHJlZml4LCBmaXJzdFZhbHVlLCBvdXQsIHRhYiwgdHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCFkb3RzSW5LZXlzICYmIGZpcnN0VmFsdWUgaW5zdGFuY2VvZiBDb25maWdPYmplY3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlTm9kZShrZXksIHNwYWNlLCB0YWIsdmFsdWUsIG91dCkKKyAgICAgICAgICAgICAgICAgICAgfSAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoaiBpbiB2YWx1ZS5rZXlTZXQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZiB2MiA9IHZhbHVlLmdldChqKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZiBrMiA9IGouaW5kZXhPZignLicpID4gLTEgPyBqLmluc3BlY3QoKSA6IGoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih2MiBpbnN0YW5jZW9mIENvbmZpZ09iamVjdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBLRVlXT1JEUy5jb250YWlucyhrZXkpID8ga2V5Lmluc3BlY3QoKSA6IGtleQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUNvbmZpZygiJHtwcmVmaXh9JHtrZXl9IiwgdjIsIG91dCwgdGFiLCBmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlVmFsdWUoIiR7a2V5fS4ke2syfSIsIHNwYWNlLCBwcmVmaXgsIHYyLCBvdXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKwkJCQl9CisJCQkJZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlTm9kZShrZXksIHNwYWNlLHRhYiwgdmFsdWUsIG91dCkKKwkJCQl9CisJCQl9CisJCQllbHNlIHsKKworICAgICAgICAgICAgICAgIHdyaXRlVmFsdWUoa2V5LCBzcGFjZSwgcHJlZml4LCB2YWx1ZSwgb3V0KQorCQkJfQorCQl9CisJfQorCisgICAgcHJpdmF0ZSB3cml0ZVZhbHVlKGtleSwgc3BhY2UsIHByZWZpeCwgdmFsdWUsIG91dCkgeworICAgICAgICBrZXkgPSBrZXkuaW5kZXhPZignLicpID4gLTEgPyBrZXkuaW5zcGVjdCgpIDoga2V5CisgICAgICAgIGJvb2xlYW4gaXNLZXl3b3JkID0gS0VZV09SRFMuY29udGFpbnMoa2V5KQorICAgICAgICBrZXkgPSBpc0tleXdvcmQgPyBrZXkuaW5zcGVjdCgpIDoga2V5CisKKyAgICAgICAgaWYoIXByZWZpeCAmJiBpc0tleXdvcmQpIHByZWZpeCA9ICJ0aGlzLiIKKyAgICAgICAgb3V0IDw8ICIke3NwYWNlfSR7cHJlZml4fSRrZXk9JHt2YWx1ZS5pbnNwZWN0KCl9IgorICAgICAgICBvdXQubmV3TGluZSgpCisgICAgfQorCisgICAgcHJpdmF0ZSB3cml0ZU5vZGUoa2V5LCBzcGFjZSwgdGFiLCB2YWx1ZSwgb3V0KSB7CisgICAgICAgIGtleSA9IEtFWVdPUkRTLmNvbnRhaW5zKGtleSkgPyBrZXkuaW5zcGVjdCgpIDoga2V5CisgICAgICAgIG91dCA8PCAiJHtzcGFjZX0ka2V5IHsiCisgICAgICAgIG91dC5uZXdMaW5lKCkKKyAgICAgICAgd3JpdGVDb25maWcoIiIsdmFsdWUsIG91dCwgdGFiKzEsIHRydWUpCisgICAgICAgIGRlZiBsYXN0ID0gIiR7c3BhY2V9fSIKKyAgICAgICAgb3V0IDw8IGxhc3QKKyAgICAgICAgb3V0Lm5ld0xpbmUoKQorICAgIH0KKworICAgIHByaXZhdGUgY29udmVydFZhbHVlc1RvU3RyaW5nKHByb3BzKSB7CisgICAgICAgIGRlZiBuZXdQcm9wcyA9IFs6XQorICAgICAgICBmb3IoZSBpbiBwcm9wcykgeworICAgICAgICAgICAgbmV3UHJvcHNbZS5rZXldID0gZS52YWx1ZT8udG9TdHJpbmcoKQorICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXdQcm9wcworICAgIH0KKworICAgIHByaXZhdGUgcG9wdWxhdGUoc3VmZml4LCBjb25maWcsIG1hcCkgeworICAgICAgICBmb3Ioa2V5IGluIG1hcC5rZXlTZXQoKSkgeworICAgICAgICAgICAgZGVmIHZhbHVlID0gbWFwLmdldChrZXkpCisgICAgICAgICAgICBpZih2YWx1ZSBpbnN0YW5jZW9mIE1hcCkgeworICAgICAgICAgICAgICAgIHBvcHVsYXRlKHN1ZmZpeCsiJHtrZXl9LiIsIGNvbmZpZywgdmFsdWUpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb25maWdbc3VmZml4K2tleV0gPSB2YWx1ZQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91dGlsL0NvbmZpZ1NsdXJwZXIuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91dGlsL0NvbmZpZ1NsdXJwZXIuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMzI3YzUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvQ29uZmlnU2x1cnBlci5ncm9vdnkKQEAgLTAsMCArMSwyNjUgQEAKKy8qIENvcHlyaWdodCAyMDA2LTIwMDcgR3JhZW1lIFJvY2hlcgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBncm9vdnkudXRpbAorCitpbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0b3IKK2ltcG9ydCBqYXZhLmJlYW5zLkJlYW5JbmZvCisKKy8qKgorKiA8cD4KKyogQ29uZmlnU2x1cnBlciBpcyBhIHV0aWxpdHkgY2xhc3MgZm9yIHJlYWRpbmcgY29uZmlndXJhdGlvbiBmaWxlcyBkZWZpbmVkIGluIHRoZSBmb3JtIG9mIEdyb292eQorKiBzY3JpcHRzLiBDb25maWd1cmF0aW9uIHNldHRpbmdzIGNhbiBiZSBkZWZpbmVkIHVzaW5nIGRvdCBub3RhdGlvbiBvciBzY29wZWQgdXNpbmcgY2xvc3VyZXMKKyoKKyogPHByZT48Y29kZT4KKyogICBncmFpbHMud2ViZmxvdy5zdGF0ZWxlc3MgPSB0cnVlCisqICAgIHNtdHAgeworKiAgICAgICAgbWFpbC5ob3N0ID0gJ3NtdHAubXlpc3AuY29tJworKiAgICAgICAgbWFpbC5hdXRoLnVzZXIgPSAnc2VydmVyJworKiAgICB9CisqICAgIHJlc291cmNlcy5VUkwgPSAiaHR0cDovL2xvY2FsaG9zdDo4MC9yZXNvdXJjZXMiCisqIDwvcHJlPjwvY29kZT4KKyoKKyogPHA+U2V0dGluZ3MgY2FuIGVpdGhlciBiZSBib3VuZCBpbnRvIG5lc3RlZCBtYXBzIG9yIG9udG8gYSBzcGVjaWZpZWQgSmF2YUJlYW4gaW5zdGFuY2UuIEluIHRoZSBjYXNlCisqIG9mIHRoZSBsYXR0ZXIgYW4gZXJyb3Igd2lsbCBiZSB0aHJvd24gaWYgYSBwcm9wZXJ0eSBjYW5ub3QgYmUgYm91bmQuCisqCisqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgorKiBAc2luY2UgMS4xCisqCisqICAgICAgICA8cC8+CisqICAgICAgICBDcmVhdGVkOiBKdW4gMTksIDIwMDcKKyogICAgICAgIFRpbWU6IDM6NTM6NDggUE0KKyovCisKK2NsYXNzIENvbmZpZ1NsdXJwZXIgeyAKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEVOVl9NRVRIT0QgPSAiZW52aXJvbm1lbnRzIgorICAgIHN0YXRpYyBmaW5hbCBFTlZfU0VUVElOR1MgPSAnX19lbnZfc2V0dGluZ3NfXycKKyAgICAvL3ByaXZhdGUgQmVhbkluZm8gYmVhbgorICAgIC8vcHJpdmF0ZSBpbnN0YW5jZQorICAgIEdyb292eUNsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gbmV3IEdyb292eUNsYXNzTG9hZGVyKCkKKyAgICBTdHJpbmcgZW52aXJvbm1lbnQKKyAgICBwcml2YXRlIGVudk1vZGUgPSBmYWxzZQorCXByaXZhdGUgTWFwIGJpbmRpbmdWYXJzCisKKyAgICBDb25maWdTbHVycGVyKCkgeyB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IENvbmZpZ1NsdXJwZXIgaW5zdGFuY2UgdXNpbmcgdGhlIGdpdmVuIGVudmlyb25tZW50CisgICAgICogQHBhcmFtIGVudiBUaGUgRW52aXJvbm1lbnQgdG8gdXNlCisgICAgICovCisgICAgQ29uZmlnU2x1cnBlcihTdHJpbmcgZW52KSB7CisgICAgICAgIHRoaXMuZW52aXJvbm1lbnQgPSBlbnYKKyAgICB9CisKKwkvKioKKwkgKiBTZXRzIGFueSBhZGRpdGlvbmFsIHZhcmlhYmxlcyB0aGF0IHNob3VsZCBiZSBwbGFjZWQgaW50byB0aGUgYmluZGluZyB3aGVuIGV2YWx1YXRpbmcgQ29uZmlnIHNjcmlwdHMKKwkgKi8KKwl2b2lkIHNldEJpbmRpbmcoTWFwIHZhcnMpIHsKKwkJdGhpcy5iaW5kaW5nVmFycyA9IHZhcnMKKwl9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgYSBDb25maWdPYmplY3QgaW5zdGFuY2VzIGZyb20gYW4gaW5zdGFuY2Ugb2YgamF2YS51dGlsLlByb3BlcnRpZXMKKyAgICAgKiBAcGFyYW0gVGhlIGphdmEudXRpbC5Qcm9wZXJ0aWVzIGluc3RhbmNlCisgICAgICovCisgICAgQ29uZmlnT2JqZWN0IHBhcnNlKFByb3BlcnRpZXMgcHJvcGVydGllcykgeyAgIAorICAgICAgICBDb25maWdPYmplY3QgY29uZmlnID0gbmV3IENvbmZpZ09iamVjdCgpCisgICAgICAgIGZvcihrZXkgaW4gcHJvcGVydGllcy5rZXlTZXQoKSkgeworICAgICAgICAgICAgZGVmIHRva2VucyA9IGtleS5zcGxpdCgvXC4vKQorICAgICAgICAgICAgCisgICAgICAgICAgICBkZWYgY3VycmVudCA9IGNvbmZpZworICAgICAgICAgICAgZGVmIGN1cnJlbnRUb2tlbgorICAgICAgICAgICAgZGVmIGxhc3QKKyAgICAgICAgICAgIGRlZiBsYXN0VG9rZW4KKyAgICAgICAgICAgIGZvcih0b2tlbiBpbiB0b2tlbnMpIHsKKyAgICAgICAgICAgICAgICBsYXN0ID0gY3VycmVudAorICAgICAgICAgICAgICAgIGxhc3RUb2tlbiA9IHRva2VuCisKKyAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC4iJHt0b2tlbn0iCisgICAgICAgICAgICAgICAgaWYoIShjdXJyZW50IGluc3RhbmNlb2YgQ29uZmlnT2JqZWN0KSkgYnJlYWsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoY3VycmVudCBpbnN0YW5jZW9mIENvbmZpZ09iamVjdCkgeworICAgICAgICAgICAgICAgIGlmKGxhc3RbbGFzdFRva2VuXSkgeworICAgICAgICAgICAgICAgICAgICBkZWYgZmxhdHRlbmVkID0gbGFzdC5mbGF0dGVuKCkKKyAgICAgICAgICAgICAgICAgICAgbGFzdC5jbGVhcigpCisgICAgICAgICAgICAgICAgICAgIGZsYXR0ZW5lZC5lYWNoIHsgazIsIHYyIC0+IGxhc3RbazJdID0gdjIgfQorICAgICAgICAgICAgICAgICAgICBsYXN0W2xhc3RUb2tlbl0gPSBwcm9wZXJ0aWVzLmdldChrZXkpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGxhc3RbbGFzdFRva2VuXSA9IHByb3BlcnRpZXMuZ2V0KGtleSkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjdXJyZW50ID0gY29uZmlnCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvbmZpZworICAgIH0KKyAgICAvKioKKyAgICAgKiBQYXJzZSB0aGUgZ2l2ZW4gc2NyaXB0IGFzIGEgc3RyaW5nIGFuZCByZXR1cm4gdGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0CisgICAgICoKKyAgICAgKiBAc2VlIENvbmZpZ1NsdXJwZXIjcGFyc2UoZ3Jvb3Z5LmxhbmcuU2NyaXB0KQorICAgICAqLworICAgIENvbmZpZ09iamVjdCBwYXJzZShTdHJpbmcgc2NyaXB0KSB7CisgICAgICAgIHJldHVybiBwYXJzZShjbGFzc0xvYWRlci5wYXJzZUNsYXNzKHNjcmlwdCkpCisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBnaXZlbiBzY3JpcHQgY2xhc3MgYW5kIHBhcnNlIGEgY29uZmlndXJhdGlvbiBvYmplY3QgZnJvbSBpdAorICAgICAqCisgICAgICogQHNlZSBDb25maWdTbHVycGVyI3BhcnNlKGdyb292eS5sYW5nLlNjcmlwdCkKKyAgICAgKi8KKyAgICBDb25maWdPYmplY3QgcGFyc2UoQ2xhc3Mgc2NyaXB0Q2xhc3MpIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlKHNjcmlwdENsYXNzLm5ld0luc3RhbmNlKCkpCisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2UgdGhlIGdpdmVuIHNjcmlwdCBpbnRvIGEgY29uZmlndXJhdGlvbiBvYmplY3QgKGEgTWFwKQorICAgICAqIEBwYXJhbSBzY3JpcHQgVGhlIHNjcmlwdCB0byBwYXJzZQorICAgICAqIEByZXR1cm4gQSBNYXAgb2YgbWFwcyB0aGF0IGNhbiBiZSBuYXZpZ2F0aW5nIHdpdGggZG90IGRlLXJlZmVyZW5jaW5nIHN5bnRheCB0byBvYnRhaW4gY29uZmlndXJhdGlvbiBlbnRyaWVzCisgICAgICovCisgICAgQ29uZmlnT2JqZWN0IHBhcnNlKFNjcmlwdCBzY3JpcHQpIHsKKyAgICAgICAgIHJldHVybiBwYXJzZShzY3JpcHQsIG51bGwpCisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2VzIGEgU2NyaXB0IHJlcHJlc2VudGVkIGJ5IHRoZSBnaXZlbiBVUkwgaW50byBhIENvbmZpZ09iamVjdAorICAgICAqCisgICAgICogQHBhcmFtIHNjcmlwdExvY2F0aW9uIFRoZSBsb2NhdGlvbiBvZiB0aGUgc2NyaXB0IHRvIHBhcnNlCisgICAgICogQHJldHVybiBUaGUgQ29uZmlnT2JqZWN0IGluc3RhbmNlCisgICAgICovCisgICAgQ29uZmlnT2JqZWN0IHBhcnNlKFVSTCBzY3JpcHRMb2NhdGlvbikgeworICAgICAgICByZXR1cm4gcGFyc2UoY2xhc3NMb2FkZXIucGFyc2VDbGFzcyhzY3JpcHRMb2NhdGlvbi50ZXh0KS5uZXdJbnN0YW5jZSgpLCBzY3JpcHRMb2NhdGlvbikKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgdGhlIHBhc3NlZCBncm9vdnkubGFuZy5TY3JpcHQgaW5zdGFuY2UgdXNpbmcgdGhlIHNlY29uZCBhcmd1bWVudCB0byBhbGxvdyB0aGUgQ29uZmlnT2JqZWN0CisgICAgICogdG8gcmV0YWluIGFuIHJlZmVyZW5jZSB0byB0aGUgb3JpZ2luYWwgbG9jYXRpb24gb3RoZXIgR3Jvb3Z5IHNjcmlwdAorICAgICAqCisgICAgICogQHBhcmFtIHNjcmlwdCBUaGUgZ3Jvb3Z5LmxhbmcuU2NyaXB0IGluc3RhbmNlCisgICAgICogQHBhcmFtIGxvY2F0aW9uIFRoZSBvcmlnaW5hbCBsb2NhdGlvbiBvZiB0aGUgU2NyaXB0IGFzIGEgVVJMCisgICAgICogQHJldHVybiBUaGUgQ29uZmlnT2JqZWN0IGluc3RhbmNlCisgICAgICovCisgICAgQ29uZmlnT2JqZWN0IHBhcnNlKFNjcmlwdCBzY3JpcHQsIFVSTCBsb2NhdGlvbikgeworICAgICAgICBkZWYgY29uZmlnID0gbG9jYXRpb24gPyBuZXcgQ29uZmlnT2JqZWN0KGxvY2F0aW9uKSA6IG5ldyBDb25maWdPYmplY3QoKQorICAgICAgICBHcm9vdnlTeXN0ZW0ubWV0YUNsYXNzUmVnaXN0cnkucmVtb3ZlTWV0YUNsYXNzKHNjcmlwdC5jbGFzcykKKyAgICAgICAgZGVmIG1jID0gc2NyaXB0LmNsYXNzLm1ldGFDbGFzcworICAgICAgICBkZWYgcHJlZml4ID0gIiIKKyAgICAgICAgTGlua2VkTGlzdCBzdGFjayA9IG5ldyBMaW5rZWRMaXN0KCkKKyAgICAgICAgc3RhY2sgPDwgW2NvbmZpZzpjb25maWcsc2NvcGU6WzpdXQorICAgICAgICBkZWYgcHVzaFN0YWNrID0geyBjbyAtPgorCSAgICAgICAgc3RhY2sgPDwgW2NvbmZpZzpjbyxzY29wZTpzdGFjay5sYXN0LnNjb3BlLmNsb25lKCldCisgICAgICAgIH0KKyAgICAgICAgZGVmIGFzc2lnbk5hbWUgPSB7IG5hbWUsIGNvIC0+CisgICAgICAgIAlkZWYgY3VycmVudCA9IHN0YWNrLmxhc3QKKyAgICAgICAgCWN1cnJlbnQuY29uZmlnW25hbWVdID0gY28KKyAgICAgICAgCWN1cnJlbnQuc2NvcGVbbmFtZV0gPSBjbworICAgICAgICB9CisgICAgICAgIG1jLmdldFByb3BlcnR5ID0geyBTdHJpbmcgbmFtZSAtPgorICAgICAgICAgICAgZGVmIGN1cnJlbnQgPSBzdGFjay5sYXN0CisgICAgICAgICAgICBkZWYgcmVzdWx0CisgICAgICAgICAgICBpZihjdXJyZW50LmNvbmZpZy5nZXQobmFtZSkpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBjdXJyZW50LmNvbmZpZy5nZXQobmFtZSkKKyAgICAgICAgICAgIH0gZWxzZSBpZihjdXJyZW50LnNjb3BlW25hbWVdKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gY3VycmVudC5zY29wZVtuYW1lXQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgQ29uZmlnT2JqZWN0KCkKKyAgICAgICAgICAgICAgICBhc3NpZ25OYW1lLmNhbGwobmFtZSxyZXN1bHQpCisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQKKyAgICAgICAgfQorICAgICAgICBtYy5pbnZva2VNZXRob2QgPSB7IFN0cmluZyBuYW1lLCBhcmdzIC0+CisgICAgICAgICAgICBkZWYgcmVzdWx0CisgICAgICAgICAgICBpZihhcmdzLmxlbmd0aCA9PSAxICYmIGFyZ3NbMF0gaW5zdGFuY2VvZiBDbG9zdXJlKSB7CisgICAgICAgICAgICAgICAgaWYobmFtZSA9PSBFTlZfTUVUSE9EKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbnZNb2RlID0gdHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1swXS5jYWxsKCkKKyAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudk1vZGUgPSBmYWxzZQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbnZNb2RlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKG5hbWUgPT0gZW52aXJvbm1lbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZiBjbyA9IG5ldyBDb25maWdPYmplY3QoKQorICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnW0VOVl9TRVRUSU5HU10gPSBjbworCisgICAgICAgICAgICAgICAgICAgICAgICBwdXNoU3RhY2suY2FsbChjbykKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52TW9kZSA9IGZhbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1swXS5jYWxsKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52TW9kZSA9IHRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnBvcCgpCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBkZWYgY28gPSBuZXcgQ29uZmlnT2JqZWN0KCkKKyAgICAgICAgICAgICAgICAgICAgYXNzaWduTmFtZS5jYWxsKG5hbWUsIGNvKQorICAgICAgICAgICAgICAgICAgICBwdXNoU3RhY2suY2FsbChjbykKKyAgICAgICAgICAgICAgICAgICAgYXJnc1swXS5jYWxsKCkKKyAgICAgICAgICAgICAgICAgICAgc3RhY2sucG9wKCkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09IDIgJiYgYXJnc1sxXSBpbnN0YW5jZW9mIENsb3N1cmUpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG5hbWUgKycuJworICAgICAgICAgICAgICAgICAgIGFzc2lnbk5hbWUuY2FsbChuYW1lLCBhcmdzWzBdKQorICAgICAgICAgICAgICAgICAgIGFyZ3NbMV0uY2FsbCgpCisgICAgICAgICAgICAgICAgfSAgZmluYWxseSB7IHByZWZpeCA9ICIiIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTWV0YU1ldGhvZCBtbSA9IG1jLmdldE1ldGFNZXRob2QobmFtZSwgYXJncykKKyAgICAgICAgICAgICAgICBpZihtbSkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBtbS5pbnZva2UoZGVsZWdhdGUsIGFyZ3MpCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdNZXRob2RFeGNlcHRpb24obmFtZSwgZ2V0Q2xhc3MoKSwgYXJncykKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQKKyAgICAgICAgfQorICAgICAgICBzY3JpcHQubWV0YUNsYXNzID0gbWMKKworICAgICAgICBkZWYgc2V0UHJvcGVydHkgPSB7IFN0cmluZyBuYW1lLCB2YWx1ZSAtPgorICAgICAgICAgICAgYXNzaWduTmFtZS5jYWxsKHByZWZpeCtuYW1lLCB2YWx1ZSkKKyAgICAgICAgfSAgICAgICAgICAgICAgICAKKyAgICAgCWRlZiBiaW5kaW5nID0gbmV3IENvbmZpZ0JpbmRpbmcoc2V0UHJvcGVydHkpCisJCWlmKHRoaXMuYmluZGluZ1ZhcnMpIHsKKwkJCWJpbmRpbmcuZ2V0VmFyaWFibGVzKCkucHV0QWxsKHRoaXMuYmluZGluZ1ZhcnMpCisJCX0KKyAgICAgICAgc2NyaXB0LmJpbmRpbmcgPSBiaW5kaW5nCisKKworICAgICAgICBzY3JpcHQucnVuKCkKKworICAgICAgICBkZWYgZW52U2V0dGluZ3MgPSBjb25maWcucmVtb3ZlKEVOVl9TRVRUSU5HUykKKyAgICAgICAgaWYoZW52U2V0dGluZ3MpIHsKKyAgICAgICAgICAgIGNvbmZpZy5tZXJnZShlbnZTZXR0aW5ncykKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjb25maWcKKyAgICB9CisKK30KKy8qKgorICogU2luY2UgR3Jvb3Z5IFNjcmlwdCBkb24ndCBzdXBwb3J0IG92ZXJyaWRpbmcgc2V0UHJvcGVydHksIHdlIGhhdmUgdG8gdXNpbmcgYSB0cmljayB3aXRoIHRoZSBCaW5kaW5nIHRvIHByb3ZpZGUgdGhpcworICogZnVuY3Rpb25hbGl0eQorICovCitjbGFzcyBDb25maWdCaW5kaW5nIGV4dGVuZHMgQmluZGluZyB7CisgICAgZGVmIGNhbGxhYmxlCisgICAgQ29uZmlnQmluZGluZyhDbG9zdXJlIGMpIHsKKyAgICAgICAgdGhpcy5jYWxsYWJsZSA9IGMKKyAgICB9CisKKyAgICB2b2lkIHNldFZhcmlhYmxlKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgY2FsbGFibGUobmFtZSwgdmFsdWUpCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdXRpbC9FdmFsLmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvRXZhbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZmI0OTEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvRXZhbC5qYXZhCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGdyb292eS51dGlsOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLkNvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uOworCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuQmluZGluZzsKK2ltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlTaGVsbDsKKworLyoqCisgKiBBbGxvdyBlYXN5IGludGVncmF0aW9uIGZyb20gR3Jvb3Z5IGludG8gSmF2YSB0aHJvdWdoIGNvbnZlbmllbmNlIG1ldGhvZHMuCisgKiAKKyAqIEBhdXRob3IgRGllcmsgS29lbmlnCisgKi8KKworcHVibGljIGNsYXNzIEV2YWwgeworICAgIC8qKgorICAgICAqIEBwYXJhbSBleHByZXNzaW9uIHRoZSBHcm9vdnkgZXhwcmVzc2lvbiB0byBldmFsdWF0ZQorICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgZXhwcmVzc2lvbgorICAgICAqIEB0aHJvd3MgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24gaWYgZXhwcmVzc2lvbiBpcyBubyBwcm9wZXIgR3Jvb3Z5CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgbWUoZmluYWwgU3RyaW5nIGV4cHJlc3Npb24pIHRocm93cyBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBtZShudWxsLCBudWxsLCBleHByZXNzaW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBldmFsdWF0ZSBleHByZXNzaW9uIGFuZCBtYWtlIG9iamVjdCBhdmFpbGFibGUgaW5zaWRlIHRoZSBleHByZXNzaW9uIGFzICdzeW1ib2wnCisgICAgICogQHBhcmFtIGV4cHJlc3Npb24gdGhlIEdyb292eSBleHByZXNzaW9uIHRvIGV2YWx1YXRlCisgICAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBleHByZXNzaW9uCisgICAgICogQHRocm93cyBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbiBpZiBleHByZXNzaW9uIGlzIG5vIHByb3BlciBHcm9vdnkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBtZShmaW5hbCBTdHJpbmcgc3ltYm9sLCBmaW5hbCBPYmplY3Qgb2JqZWN0LCBmaW5hbCBTdHJpbmcgZXhwcmVzc2lvbikgdGhyb3dzIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uIHsKKyAgICAgICAgQmluZGluZyBiID0gbmV3IEJpbmRpbmcoKTsKKyAgICAgICAgYi5zZXRWYXJpYWJsZShzeW1ib2wsIG9iamVjdCk7CisgICAgICAgIEdyb292eVNoZWxsIHNoID0gbmV3IEdyb292eVNoZWxsKGIpOworICAgICAgICByZXR1cm4gc2guZXZhbHVhdGUoZXhwcmVzc2lvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogZXZhbHVhdGUgZXhwcmVzc2lvbiBhbmQgbWFrZSB4IGF2YWlsYWJsZSBpbnNpZGUgdGhlIGV4cHJlc3Npb24gYXMgJ3gnCisgICAgICogQHBhcmFtIGV4cHJlc3Npb24gdGhlIEdyb292eSBleHByZXNzaW9uIHRvIGV2YWx1YXRlCisgICAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBleHByZXNzaW9uCisgICAgICogQHRocm93cyBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbiBpZiBleHByZXNzaW9uIGlzIG5vIHByb3BlciBHcm9vdnkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCB4KGZpbmFsIE9iamVjdCB4LCBmaW5hbCBTdHJpbmcgZXhwcmVzc2lvbikgdGhyb3dzIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG1lKCJ4IiwgeCwgZXhwcmVzc2lvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogZXZhbHVhdGUgZXhwcmVzc2lvbiBhbmQgbWFrZSB4IGFuZCB5IGF2YWlsYWJsZSBpbnNpZGUgdGhlIGV4cHJlc3Npb24gYXMgJ3gnIGFuZCAneScKKyAgICAgKiBAcGFyYW0gZXhwcmVzc2lvbiB0aGUgR3Jvb3Z5IGV4cHJlc3Npb24gdG8gZXZhbHVhdGUKKyAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGV4cHJlc3Npb24KKyAgICAgKiBAdGhyb3dzIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uIGlmIGV4cHJlc3Npb24gaXMgbm8gcHJvcGVyIEdyb292eQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHh5KGZpbmFsIE9iamVjdCB4LCBmaW5hbCBPYmplY3QgeSwgZmluYWwgU3RyaW5nIGV4cHJlc3Npb24pIHRocm93cyBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbiB7CisgICAgICAgIEJpbmRpbmcgYiA9IG5ldyBCaW5kaW5nKCk7CisgICAgICAgIGIuc2V0VmFyaWFibGUoIngiLCB4KTsKKyAgICAgICAgYi5zZXRWYXJpYWJsZSgieSIsIHkpOworICAgICAgICBHcm9vdnlTaGVsbCBzaCA9IG5ldyBHcm9vdnlTaGVsbChiKTsKKyAgICAgICAgcmV0dXJuIHNoLmV2YWx1YXRlKGV4cHJlc3Npb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIGV2YWx1YXRlIGV4cHJlc3Npb24gYW5kIG1ha2UgeCx5LHogYXZhaWxhYmxlIGluc2lkZSB0aGUgZXhwcmVzc2lvbiBhcyAneCcsJ3knLCd6JworICAgICAqIEBwYXJhbSBleHByZXNzaW9uIHRoZSBHcm9vdnkgZXhwcmVzc2lvbiB0byBldmFsdWF0ZQorICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgZXhwcmVzc2lvbgorICAgICAqIEB0aHJvd3MgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24gaWYgZXhwcmVzc2lvbiBpcyBubyBwcm9wZXIgR3Jvb3Z5CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgeHl6KGZpbmFsIE9iamVjdCB4LCBmaW5hbCBPYmplY3QgeSwgZmluYWwgT2JqZWN0IHosIGZpbmFsIFN0cmluZyBleHByZXNzaW9uKSB0aHJvd3MgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24geworICAgICAgICBCaW5kaW5nIGIgPSBuZXcgQmluZGluZygpOworICAgICAgICBiLnNldFZhcmlhYmxlKCJ4IiwgeCk7CisgICAgICAgIGIuc2V0VmFyaWFibGUoInkiLCB5KTsKKyAgICAgICAgYi5zZXRWYXJpYWJsZSgieiIsIHopOworICAgICAgICBHcm9vdnlTaGVsbCBzaCA9IG5ldyBHcm9vdnlTaGVsbChiKTsKKyAgICAgICAgcmV0dXJuIHNoLmV2YWx1YXRlKGV4cHJlc3Npb24pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdXRpbC9FeHBhbmRvLmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvRXhwYW5kby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmYjViM2MKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvRXhwYW5kby5qYXZhCkBAIC0wLDAgKzEsMTc0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgZ3Jvb3Z5LnV0aWw7CisKK2ltcG9ydCBncm9vdnkubGFuZy5DbG9zdXJlOworaW1wb3J0IGdyb292eS5sYW5nLkdyb292eU9iamVjdFN1cHBvcnQ7CitpbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbjsKK2ltcG9ydCBncm9vdnkubGFuZy5NZXRhRXhwYW5kb1Byb3BlcnR5OworaW1wb3J0IGdyb292eS5sYW5nLk1pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworCisvKioKKyAqIFJlcHJlc2VudHMgYSBkeW5hbWljYWxseSBleHBhbmRhYmxlIGJlYW4uCisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAYXV0aG9yIEhlaW4gTWVsaW5nCisgKiBAYXV0aG9yIFBpbGhvIEtpbQorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgRXhwYW5kbyBleHRlbmRzIEdyb292eU9iamVjdFN1cHBvcnQgeworCisgICAgcHJpdmF0ZSBNYXAgZXhwYW5kb1Byb3BlcnRpZXM7CisKKyAgICBwdWJsaWMgRXhwYW5kbygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwYW5kbyhNYXAgZXhwYW5kb1Byb3BlcnRpZXMpIHsKKyAgICAgICAgdGhpcy5leHBhbmRvUHJvcGVydGllcyA9IGV4cGFuZG9Qcm9wZXJ0aWVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGR5bmFtaWNhbGx5IGV4cGFuZGVkIHByb3BlcnRpZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgTWFwIGdldFByb3BlcnRpZXMoKSB7CisgICAgICAgIGlmIChleHBhbmRvUHJvcGVydGllcyA9PSBudWxsKSB7CisgICAgICAgICAgICBleHBhbmRvUHJvcGVydGllcyA9IGNyZWF0ZU1hcCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBleHBhbmRvUHJvcGVydGllczsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdCBnZXRNZXRhUHJvcGVydHlWYWx1ZXMoKSB7CisgICAgICAgIC8vIHJ1biB0aHJvdWdoIGFsbCBvdXIgY3VycmVudCBwcm9wZXJ0aWVzIGFuZCBjcmVhdGUgTWV0YVByb3BlcnR5IG9iamVjdHMKKyAgICAgICAgTGlzdCByZXQgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGdldFByb3BlcnRpZXMoKS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlKGl0ci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIEVudHJ5IGVudHJ5ID0gKEVudHJ5KSBpdHIubmV4dCgpOworICAgICAgICAgICAgcmV0LmFkZChuZXcgTWV0YUV4cGFuZG9Qcm9wZXJ0eShlbnRyeSkpOworICAgICAgICB9CisJCQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5KSB7CisgICAgICAgIC8vIGFsd2F5cyB1c2UgdGhlIGV4cGFuZG8gcHJvcGVydGllcyBmaXJzdAorICAgICAgICBPYmplY3QgcmVzdWx0ID0gZ2V0UHJvcGVydGllcygpLmdldChwcm9wZXJ0eSk7CisgICAgICAgIGlmIChyZXN1bHQhPW51bGwpIHJldHVybiByZXN1bHQ7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0UHJvcGVydHkocHJvcGVydHkpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChNaXNzaW5nUHJvcGVydHlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gSUdOT1JFCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgbmV3VmFsdWUpIHsKKyAgICAgICAgLy8gYWx3YXlzIHVzZSB0aGUgZXhwYW5kbyBwcm9wZXJ0aWVzCisgICAgICAgIGdldFByb3BlcnRpZXMoKS5wdXQocHJvcGVydHksIG5ld1ZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGludm9rZU1ldGhvZChTdHJpbmcgbmFtZSwgT2JqZWN0IGFyZ3MpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBzdXBlci5pbnZva2VNZXRob2QobmFtZSwgYXJncyk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEdyb292eVJ1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gYnIgc2hvdWxkIGdldCBhICJuYXRpdmUiIHByb3BlcnR5IG1hdGNoIGZpcnN0LiBnZXRQcm9wZXJ0eSBpbmNsdWRlcyBzdWNoIGZhbGwtYmFjayBsb2dpYworICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gdGhpcy5nZXRQcm9wZXJ0eShuYW1lKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIENsb3N1cmUpIHsKKyAgICAgICAgICAgICAgICBDbG9zdXJlIGNsb3N1cmUgPSAoQ2xvc3VyZSkgdmFsdWU7CisgICAgICAgICAgICAgICAgY2xvc3VyZS5zZXREZWxlZ2F0ZSh0aGlzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gY2xvc3VyZS5jYWxsKChPYmplY3RbXSkgYXJncyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGlzIGFsbG93cyB0b1N0cmluZyB0byBiZSBvdmVycmlkZGVuIGJ5IGEgY2xvc3VyZSA8aT5maWVsZDwvaT4gbWV0aG9kIGF0dGFjaGVkCisgICAgICogdG8gdGhlIGV4cGFuZG8gb2JqZWN0LgorICAgICAqIAorICAgICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCisgICAgICovCisgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIE9iamVjdCBtZXRob2QgPSBnZXRQcm9wZXJ0aWVzKCkuZ2V0KCJ0b1N0cmluZyIpOworICAgICAgICBpZiAobWV0aG9kICE9IG51bGwgJiYgbWV0aG9kIGluc3RhbmNlb2YgQ2xvc3VyZSkgeworICAgICAgICAgICAgLy8gaW52b2tlIG92ZXJyaWRkZW4gdG9TdHJpbmcgY2xvc3VyZSBtZXRob2QKKyAgICAgICAgICAgIENsb3N1cmUgY2xvc3VyZSA9IChDbG9zdXJlKSBtZXRob2Q7CisgICAgICAgICAgICBjbG9zdXJlLnNldERlbGVnYXRlKHRoaXMpOworICAgICAgICAgICAgcmV0dXJuIGNsb3N1cmUuY2FsbCgpLnRvU3RyaW5nKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZXhwYW5kb1Byb3BlcnRpZXMudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGFsbG93cyBlcXVhbHMgdG8gYmUgb3ZlcnJpZGRlbiBieSBhIGNsb3N1cmUgPGk+ZmllbGQ8L2k+IG1ldGhvZCBhdHRhY2hlZAorICAgICAqIHRvIHRoZSBleHBhbmRvIG9iamVjdC4KKyAgICAgKgorICAgICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICBPYmplY3QgbWV0aG9kID0gZ2V0UHJvcGVydGllcygpLmdldCgiZXF1YWxzIik7CisgICAgICAgIGlmIChtZXRob2QgIT0gbnVsbCAmJiBtZXRob2QgaW5zdGFuY2VvZiBDbG9zdXJlKSB7CisgICAgICAgICAgICAvLyBpbnZva2Ugb3ZlcnJpZGRlbiBlcXVhbHMgY2xvc3VyZSBtZXRob2QKKyAgICAgICAgICAgIENsb3N1cmUgY2xvc3VyZSA9IChDbG9zdXJlKSBtZXRob2Q7CisgICAgICAgICAgICBjbG9zdXJlLnNldERlbGVnYXRlKHRoaXMpOworICAgICAgICAgICAgQm9vbGVhbiByZXQgPSAoQm9vbGVhbikgY2xvc3VyZS5jYWxsKG9iaik7CisgICAgICAgICAgICByZXR1cm4gcmV0LmJvb2xlYW5WYWx1ZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmVxdWFscyhvYmopOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBhbGxvd3MgaGFzaENvZGUgdG8gYmUgb3ZlcnJpZGRlbiBieSBhIGNsb3N1cmUgPGk+ZmllbGQ8L2k+IG1ldGhvZCBhdHRhY2hlZAorICAgICAqIHRvIHRoZSBleHBhbmRvIG9iamVjdC4KKyAgICAgKgorICAgICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNoYXNoQ29kZSgpCisgICAgICovCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgT2JqZWN0IG1ldGhvZCA9IGdldFByb3BlcnRpZXMoKS5nZXQoImhhc2hDb2RlIik7CisgICAgICAgIGlmIChtZXRob2QgIT0gbnVsbCAmJiBtZXRob2QgaW5zdGFuY2VvZiBDbG9zdXJlKSB7CisgICAgICAgICAgICAvLyBpbnZva2Ugb3ZlcnJpZGRlbiBoYXNoQ29kZSBjbG9zdXJlIG1ldGhvZAorICAgICAgICAgICAgQ2xvc3VyZSBjbG9zdXJlID0gKENsb3N1cmUpIG1ldGhvZDsKKyAgICAgICAgICAgIGNsb3N1cmUuc2V0RGVsZWdhdGUodGhpcyk7CisgICAgICAgICAgICBJbnRlZ2VyIHJldCA9IChJbnRlZ2VyKSBjbG9zdXJlLmNhbGwoKTsKKyAgICAgICAgICAgIHJldHVybiByZXQuaW50VmFsdWUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBzdXBlci5oYXNoQ29kZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgbmV3IE1hcCB1c2VkIHRvIHN0b3JlIHRoZSBleHBhbmRvIHByb3BlcnRpZXMgbWFwCisgICAgICogQHJldHVybiBhIG5ld2x5IGNyZWF0ZWQgTWFwIGltcGxlbWVudGF0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIE1hcCBjcmVhdGVNYXAoKSB7CisgICAgICAgIHJldHVybiBuZXcgSGFzaE1hcCgpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91dGlsL0ZhY3RvcnkuamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdXRpbC9GYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlmYjg4MwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdXRpbC9GYWN0b3J5LmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoNCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4NCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCitwYWNrYWdlIGdyb292eS51dGlsOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuTWFwOw0KKw0KKy8qKg0KKyAqIEBhdXRob3IgQW5kcmVzIEFsbWlyYXkgPGFhbG1pcmF5QHVzZXJzLnNvdXJjZWZvcmdlLmNvbT4NCisgKi8gDQorcHVibGljIGludGVyZmFjZSBGYWN0b3J5IHsNCisgICAgLyoqDQorICAgICAqDQorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBubyBjaGlsZCBjbG9zdXJlcyBzaG91bGQgYmUgcHJvY2Vzc2VkDQorICAgICAqLw0KKyAgICBib29sZWFuIGlzTGVhZigpOw0KKw0KKyAgICAvKioNCisgICAgICoNCisgICAgICogQHBhcmFtIGJ1aWxkZXIgdGhlIEZhY3RvcnlCdWlsZGVyDQorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBub2RlIGJlaW5nIGJ1aWx0DQorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgJ3ZhbHVlJyBhcmd1bWVudCBpbiB0aGUgYnVpbGQgbm9kZQ0KKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyB0aGUgYXR0cmlidXRlcyBvZiB0aGUgYnVpbGQgYXJnDQorICAgICAqIEByZXR1cm4gdGhlIG9iamVjdCBjcmVhdGVkIGZvciB0aGUgYnVpbGRlcg0KKyAgICAgKiBAdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24NCisgICAgICogQHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uDQorICAgICAqLw0KKyAgICBPYmplY3QgbmV3SW5zdGFuY2UoIEZhY3RvcnlCdWlsZGVyU3VwcG9ydCBidWlsZGVyLCBPYmplY3QgbmFtZSwgT2JqZWN0IHZhbHVlLCBNYXAgYXR0cmlidXRlcyApDQorICAgICAgICAgICAgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb247DQorDQorICAgIC8qKg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gYnVpbGRlciB0aGUgRmFjdG9yeUJ1aWxkZXINCisgICAgICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgKHJldHVybmVkIGZyb20gbmV3SU5zdGFuY2UpIHRvIGNvbnNpZGVyIHRoZSBhdHRyaWJ1dGVzIGZvcg0KKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyB0aGUgYXR0cmlidXRlcywgYSBtdXRhYmxlIHNldA0KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGZhY3RvcnkgYnVpbGRlciBzaG91bGQgdXNlIHN0YW5kZXJkIGJlYW4gcHJvcGVydHkgbWF0Y2hpbmcgZm9yIHRoZSByZW1haW5pbmcgYXR0cmlidXRlcw0KKyAgICAgKi8NCisgICAgYm9vbGVhbiBvbkhhbmRsZU5vZGVBdHRyaWJ1dGVzKCBGYWN0b3J5QnVpbGRlclN1cHBvcnQgYnVpbGRlciwgT2JqZWN0IG5vZGUsIE1hcCBhdHRyaWJ1dGVzICk7DQorDQorICAgIC8qKg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gYnVpbGRlciB0aGUgRmFjdG9yeUJ1aWxkZXINCisgICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IG5vZGUgKG51bGwgaWYgJ3Jvb3QnKQ0KKyAgICAgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSBqdXN0IGNvbXBsZXRlZA0KKyAgICAgKi8NCisgICAgdm9pZCBvbk5vZGVDb21wbGV0ZWQoIEZhY3RvcnlCdWlsZGVyU3VwcG9ydCBidWlsZGVyLCBPYmplY3QgcGFyZW50LCBPYmplY3Qgbm9kZSApOw0KKw0KKyAgICB2b2lkIHNldFBhcmVudCggRmFjdG9yeUJ1aWxkZXJTdXBwb3J0IGJ1aWxkZXIsIE9iamVjdCBwYXJlbnQsIE9iamVjdCBjaGlsZCApOw0KKw0KKyAgICB2b2lkIHNldENoaWxkKCBGYWN0b3J5QnVpbGRlclN1cHBvcnQgYnVpbGRlciwgT2JqZWN0IHBhcmVudCwgT2JqZWN0IGNoaWxkICk7DQorfQ0KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdXRpbC9GYWN0b3J5QnVpbGRlclN1cHBvcnQuamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdXRpbC9GYWN0b3J5QnVpbGRlclN1cHBvcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWEyZDdkCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91dGlsL0ZhY3RvcnlCdWlsZGVyU3VwcG9ydC5qYXZhCkBAIC0wLDAgKzEsODM2IEBACisvKg0KKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLg0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KK3BhY2thZ2UgZ3Jvb3Z5LnV0aWw7DQorDQoraW1wb3J0IGdyb292eS5sYW5nLio7DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5JbnZva2VySGVscGVyOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuKjsNCitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7DQoraW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsNCisNCisvKioNCisgKiBNaXggb2YgQnVpbGRlclN1cHBvcnQgYW5kIFN3aW5nQnVpbGRlcidzIGZhY3Rvcnkgc3VwcG9ydC4NCisgKg0KKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+DQorICogQGF1dGhvciBBbmRyZXMgQWxtaXJheSA8YWFsbWlyYXlAdXNlcnMuc291cmNlZm9yZ2UuY29tPg0KKyAqLw0KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBGYWN0b3J5QnVpbGRlclN1cHBvcnQgZXh0ZW5kcyBCaW5kaW5nIHsNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VSUkVOVF9GQUNUT1JZID0gIl9DVVJSRU5UX0ZBQ1RPUllfIjsNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSRU5UX0ZBQ1RPUlkgPSAiX1BBUkVOVF9GQUNUT1JZXyI7DQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkVOVF9OT0RFID0gIl9QQVJFTlRfTk9ERV8iOw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDVVJSRU5UX05PREUgPSAiX0NVUlJFTlRfTk9ERV8iOw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJFTlRfQ09OVEVYVCA9ICJfUEFSRU5UX0NPTlRFWFRfIjsNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1dORVIgPSAib3duZXIiOw0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyLmdldExvZ2dlciggRmFjdG9yeUJ1aWxkZXJTdXBwb3J0LmNsYXNzLmdldE5hbWUoKSApOw0KKw0KKyAgICAvKioNCisgICAgICogVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB2YWx1ZSBpcyBudWxsLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5vZGUncyB2YWx1ZQ0KKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbm9kZSdzIG5hbWUNCisgICAgICovDQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja1ZhbHVlSXNOdWxsKCBPYmplY3QgdmFsdWUsIE9iamVjdCBuYW1lICkgew0KKyAgICAgICAgaWYoIHZhbHVlICE9IG51bGwgKXsNCisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggIiciICsgbmFtZSArICInIGVsZW1lbnRzIGRvIG5vdCBhY2NlcHQgYSB2YWx1ZSBhcmd1bWVudC4iICk7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0eXBlIGlzIGFzc2lnbmFsYmUgdG8gdGhlIHZhbHVlJ3MgY2xhc3MsIGZhbHNlIGlmIHZhbHVlDQorICAgICAqIGlzIG51bGwuPGJyPg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5vZGUncyB2YWx1ZQ0KKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbm9kZSdzIG5hbWUNCisgICAgICogQHBhcmFtIHR5cGUgYSBDbGFzcyB0aGF0IG1heSBiZSBhc3NpZ25hYmxlIHRvIHRoZSB2YWx1ZSdzIGNsYXNzDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2hlY2tWYWx1ZUlzVHlwZSggT2JqZWN0IHZhbHVlLCBPYmplY3QgbmFtZSwgQ2xhc3MgdHlwZSApIHsNCisgICAgICAgIGlmKCB2YWx1ZSAhPSBudWxsICl7DQorICAgICAgICAgICAgaWYoIHR5cGUuaXNBc3NpZ25hYmxlRnJvbSggdmFsdWUuZ2V0Q2xhc3MoKSApICl7DQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgICAgIH1lbHNlew0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggIlRoZSB2YWx1ZSBhcmd1bWVudCBvZiAnIiArIG5hbWUgKyAiJyBtdXN0IGJlIG9mIHR5cGUgIg0KKyAgICAgICAgICAgICAgICAgICAgICAgICsgdHlwZS5nZXROYW1lKCkgKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9ZWxzZXsNCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0eXBlIGlzIGFzc2lnbmFsZSB0byB0aGUgdmFsdWUncyBjbGFzcywgZmFsc2UgaWYgdmFsdWUgaXMNCisgICAgICogbnVsbCBvciBhIFN0cmluZy48YnI+DQorICAgICAqDQorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbm9kZSdzIHZhbHVlDQorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBub2RlJ3MgbmFtZQ0KKyAgICAgKiBAcGFyYW0gdHlwZSBhIENsYXNzIHRoYXQgbWF5IGJlIGFzc2lnbmFibGUgdG8gdGhlIHZhbHVlJ3MgY2xhc3MNCisgICAgICovDQorICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja1ZhbHVlSXNUeXBlTm90U3RyaW5nKCBPYmplY3QgdmFsdWUsIE9iamVjdCBuYW1lLCBDbGFzcyB0eXBlICkgew0KKyAgICAgICAgaWYoIHZhbHVlICE9IG51bGwgKXsNCisgICAgICAgICAgICBpZiggdHlwZS5pc0Fzc2lnbmFibGVGcm9tKCB2YWx1ZS5nZXRDbGFzcygpICkgKXsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAgICAgfWVsc2UgaWYoIHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nICl7DQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgICAgICB9ZWxzZXsNCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oICJUaGUgdmFsdWUgYXJndW1lbnQgb2YgJyIgKyBuYW1lICsgIicgbXVzdCBiZSBvZiB0eXBlICINCisgICAgICAgICAgICAgICAgICAgICAgICArIHR5cGUuZ2V0TmFtZSgpICsgIiBvciBhIFN0cmluZy4iICk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfWVsc2V7DQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHByaXZhdGUgTGlua2VkTGlzdC8qIDxNYXA8U3RyaW5nLE9iamVjdD4+ICovY29udGV4dHMgPSBuZXcgTGlua2VkTGlzdC8qIDxNYXA8U3RyaW5nLE9iamVjdD4+ICovKCk7DQorICAgIHByaXZhdGUgTGlua2VkTGlzdC8qIDxDbG9zdXJlPiAqL2F0dHJpYnV0ZURlbGVnYXRlcyA9IG5ldyBMaW5rZWRMaXN0LyogPENsb3N1cmU+ICovKCk7IC8vDQorICAgIHByaXZhdGUgTGlzdC8qIDxDbG9zdXJlPiAqL2Rpc3Bvc2FsQ2xvc3VyZXMgPSBuZXcgQXJyYXlMaXN0LyogPENsb3N1cmU+ICovKCk7IC8vIGJlY2F1c2Ugb2YgcmV2ZXJzZSBpdGVyYXRpb24gdXNlIEFycmF5TGlzdA0KKyAgICBwcml2YXRlIE1hcC8qIDxTdHJpbmcsRmFjdG9yeT4gKi9mYWN0b3JpZXMgPSBuZXcgSGFzaE1hcC8qIDxTdHJpbmcsRmFjdG9yeT4gKi8oKTsNCisgICAgcHJpdmF0ZSBDbG9zdXJlIG5hbWVNYXBwaW5nQ2xvc3VyZTsNCisgICAgcHJpdmF0ZSBGYWN0b3J5QnVpbGRlclN1cHBvcnQgcHJveHlCdWlsZGVyOw0KKyAgICBwcml2YXRlIExpbmtlZExpc3QvKiA8Q2xvc3VyZT4gKi9wcmVJbnN0YW50aWF0ZURlbGVnYXRlcyA9IG5ldyBMaW5rZWRMaXN0LyogPENsb3N1cmU+ICovKCk7DQorICAgIHByaXZhdGUgTGlua2VkTGlzdC8qIDxDbG9zdXJlPiAqL3Bvc3RJbnN0YW50aWF0ZURlbGVnYXRlcyA9IG5ldyBMaW5rZWRMaXN0LyogPENsb3N1cmU+ICovKCk7DQorICAgIHByaXZhdGUgTGlua2VkTGlzdC8qIDxDbG9zdXJlPiAqL3Bvc3ROb2RlQ29tcGxldGlvbkRlbGVnYXRlcyA9IG5ldyBMaW5rZWRMaXN0LyogPENsb3N1cmU+ICovKCk7DQorDQorICAgIHB1YmxpYyBGYWN0b3J5QnVpbGRlclN1cHBvcnQoKSB7DQorICAgICAgICB0aGlzLnByb3h5QnVpbGRlciA9IHRoaXM7DQorICAgIH0NCisNCisgICAgcHVibGljIEZhY3RvcnlCdWlsZGVyU3VwcG9ydCggQ2xvc3VyZSBuYW1lTWFwcGluZ0Nsb3N1cmUgKSB7DQorICAgICAgICB0aGlzLm5hbWVNYXBwaW5nQ2xvc3VyZSA9IG5hbWVNYXBwaW5nQ2xvc3VyZTsNCisgICAgICAgIHRoaXMucHJveHlCdWlsZGVyID0gdGhpczsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogUmV0dXJucyB0aGUgZmFjdG9yeSBtYXAgKFVubW9kaWZpYWJsZSBNYXApLg0KKyAgICAgKi8NCisgICAgcHVibGljIE1hcCBnZXRGYWN0b3JpZXMoKSB7DQorICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKCBwcm94eUJ1aWxkZXIuZmFjdG9yaWVzICk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFJldHVybnMgdGhlIGNvbnRleHQgb2YgdGhlIGN1cnJlbnQgbm9kZS4NCisgICAgICovDQorICAgIHB1YmxpYyBNYXAgZ2V0Q29udGV4dCgpIHsNCisgICAgICAgIGlmKCAhcHJveHlCdWlsZGVyLmNvbnRleHRzLmlzRW1wdHkoKSApew0KKyAgICAgICAgICAgIHJldHVybiAoTWFwKSBwcm94eUJ1aWxkZXIuY29udGV4dHMuZ2V0Rmlyc3QoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBudWxsOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IG5vZGUgYmVpbmcgYnVpbHQuDQorICAgICAqLw0KKyAgICBwdWJsaWMgT2JqZWN0IGdldEN1cnJlbnQoKSB7DQorICAgICAgICBpZiggIXByb3h5QnVpbGRlci5jb250ZXh0cy5pc0VtcHR5KCkgKXsNCisgICAgICAgICAgICBNYXAgY29udGV4dCA9IChNYXApIHByb3h5QnVpbGRlci5jb250ZXh0cy5nZXRGaXJzdCgpOw0KKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmdldCggQ1VSUkVOVF9OT0RFICk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gbnVsbDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGJ1aWx0IHRoZSBjdXJyZW50IG5vZGUuDQorICAgICAqLw0KKyAgICBwdWJsaWMgRmFjdG9yeSBnZXRDdXJyZW50RmFjdG9yeSgpIHsNCisgICAgICAgIGlmKCAhcHJveHlCdWlsZGVyLmNvbnRleHRzLmlzRW1wdHkoKSApew0KKyAgICAgICAgICAgIE1hcCBjb250ZXh0ID0gKE1hcCkgcHJveHlCdWlsZGVyLmNvbnRleHRzLmdldEZpcnN0KCk7DQorICAgICAgICAgICAgcmV0dXJuIChGYWN0b3J5KSBjb250ZXh0LmdldCggQ1VSUkVOVF9GQUNUT1JZICk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gbnVsbDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogUmV0dXJucyB0aGUgZmFjdG9yeSBvZiB0aGUgcGFyZW50IG9mIHRoZSBjdXJyZW50IG5vZGUuDQorICAgICAqLw0KKyAgICBwdWJsaWMgRmFjdG9yeSBnZXRQYXJlbnRGYWN0b3J5KCkgew0KKyAgICAgICAgaWYoICFwcm94eUJ1aWxkZXIuY29udGV4dHMuaXNFbXB0eSgpICl7DQorICAgICAgICAgICAgTWFwIGNvbnRleHQgPSAoTWFwKSBwcm94eUJ1aWxkZXIuY29udGV4dHMuZ2V0Rmlyc3QoKTsNCisgICAgICAgICAgICByZXR1cm4gKEZhY3RvcnkpIGNvbnRleHQuZ2V0KCBQQVJFTlRfRkFDVE9SWSApOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIG51bGw7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFJldHVybnMgdGhlIHBhcmVudCBvZiB0aGUgY3VycmVudCBub2RlLg0KKyAgICAgKi8NCisgICAgcHVibGljIE9iamVjdCBnZXRQYXJlbnROb2RlKCkgew0KKyAgICAgICAgaWYoICFwcm94eUJ1aWxkZXIuY29udGV4dHMuaXNFbXB0eSgpICl7DQorICAgICAgICAgICAgTWFwIGNvbnRleHQgPSAoTWFwKSBwcm94eUJ1aWxkZXIuY29udGV4dHMuZ2V0Rmlyc3QoKTsNCisgICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXQoIFBBUkVOVF9OT0RFICk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gbnVsbDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogUmV0dXJucyB0aGUgY29udGV4dCBvZiB0aGUgcGFyZW50IG9mIHRoZSBjdXJyZW50IG5vZGUuDQorICAgICAqLw0KKyAgICBwdWJsaWMgTWFwIGdldFBhcmVudENvbnRleHQoKSB7DQorICAgICAgICBpZiggIXByb3h5QnVpbGRlci5jb250ZXh0cy5pc0VtcHR5KCkgKXsNCisgICAgICAgICAgICBNYXAgY29udGV4dCA9IChNYXApIHByb3h5QnVpbGRlci5jb250ZXh0cy5nZXRGaXJzdCgpOw0KKyAgICAgICAgICAgIHJldHVybiAoTWFwKSBjb250ZXh0LmdldCggUEFSRU5UX0NPTlRFWFQgKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBudWxsOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBDb252ZW5pZW5jZSBtZXRob2Qgd2hlbiBubyBhcmd1bWVudHMgYXJlIHJlcXVpcmVkDQorICAgICAqDQorICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgY2FsbA0KKyAgICAgKiBAcGFyYW0gbWV0aG9kTmFtZSB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIHRvIGludm9rZQ0KKyAgICAgKi8NCisgICAgcHVibGljIE9iamVjdCBpbnZva2VNZXRob2QoIFN0cmluZyBtZXRob2ROYW1lICkgew0KKyAgICAgICAgcmV0dXJuIHByb3h5QnVpbGRlci5pbnZva2VNZXRob2QoIG1ldGhvZE5hbWUsIG51bGwgKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgT2JqZWN0IGludm9rZU1ldGhvZCggU3RyaW5nIG1ldGhvZE5hbWUsIE9iamVjdCBhcmdzICkgew0KKyAgICAgICAgT2JqZWN0IG5hbWUgPSBwcm94eUJ1aWxkZXIuZ2V0TmFtZSggbWV0aG9kTmFtZSApOw0KKyAgICAgICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7DQorICAgICAgICBPYmplY3QgcHJldmlvdXNDb250ZXh0ID0gcHJveHlCdWlsZGVyLmdldENvbnRleHQoKTsNCisgICAgICAgIHRyeXsNCisgICAgICAgICAgICByZXN1bHQgPSBwcm94eUJ1aWxkZXIuZG9JbnZva2VNZXRob2QoIG1ldGhvZE5hbWUsIG5hbWUsIGFyZ3MgKTsNCisgICAgICAgIH1jYXRjaCggUnVudGltZUV4Y2VwdGlvbiBlICl7DQorICAgICAgICAgICAgLy8gcmVtb3ZlIGNvbnRleHRzIGNyZWF0ZWQgYWZ0ZXIgd2Ugc3RhcnRlZA0KKyAgICAgICAgICAgIGlmIChwcm94eUJ1aWxkZXIuY29udGV4dHMuY29udGFpbnMocHJldmlvdXNDb250ZXh0KSkgew0KKyAgICAgICAgICAgICAgICB3aGlsZSAocHJveHlCdWlsZGVyLmdldENvbnRleHQoKSAhPSBwcmV2aW91c0NvbnRleHQpIHsNCisgICAgICAgICAgICAgICAgICAgIHByb3h5QnVpbGRlci5wb3BDb250ZXh0KCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgdGhyb3cgZTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEFkZCBhbiBhdHRyaWJ1dGUgZGVsZWdhdGUgc28gaXQgY2FuIGludGVyY2VwdCBhdHRyaWJ1dGVzIGJlaW5nIHNldC4NCisgICAgICogQXR0cmlidXRlIGRlbGVnYXRlcyBhcmUgZmlyZWQgaW4gYSBGSUxPIHBhdHRlcm4sIHNvIHRoYXQgbmVzdGVkIGRlbGVnYXRlcw0KKyAgICAgKiBnZXQgZmlyc3QgY3JhY2suDQorICAgICAqDQorICAgICAqIEBwYXJhbSBhdHRyRGVsZWdhdGUNCisgICAgICovDQorICAgIHB1YmxpYyBDbG9zdXJlIGFkZEF0dHJpYnV0ZURlbGVnYXRlKCBDbG9zdXJlIGF0dHJEZWxlZ2F0ZSApIHsNCisgICAgICAgIHByb3h5QnVpbGRlci5hdHRyaWJ1dGVEZWxlZ2F0ZXMuYWRkRmlyc3QoIGF0dHJEZWxlZ2F0ZSApOw0KKyAgICAgICAgcmV0dXJuIGF0dHJEZWxlZ2F0ZTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogUmVtb3ZlIHRoZSBtb3N0IHJlY2VudGx5IGFkZGVkIGluc3RhbmNlIG9mIHRoZSBhdHRyaWJ1dGUgZGVsZWdhdGUuDQorICAgICAqDQorICAgICAqIEBwYXJhbSBhdHRyRGVsZWdhdGUNCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIHJlbW92ZUF0dHJpYnV0ZURlbGVnYXRlKCBDbG9zdXJlIGF0dHJEZWxlZ2F0ZSApIHsNCisgICAgICAgIHByb3h5QnVpbGRlci5hdHRyaWJ1dGVEZWxlZ2F0ZXMucmVtb3ZlKCBhdHRyRGVsZWdhdGUgKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQWRkIGEgcHJlSW5zdGFudGlhdGUgZGVsZWdhdGUgc28gaXQgY2FuIGludGVyY2VwdCBub2RlcyBiZWZvcmUgdGhleSBhcmUNCisgICAgICogY3JlYXRlZC4gUHJlSW5zdGFudGlhdGUgZGVsZWdhdGVzIGFyZSBmaXJlZCBpbiBhIEZJTE8gcGF0dGVybiwgc28gdGhhdA0KKyAgICAgKiBuZXN0ZWQgZGVsZWdhdGVzIGdldCBmaXJzdCBjcmFjay4NCisgICAgICoNCisgICAgICogQHBhcmFtIGRlbGVnYXRlDQorICAgICAqLw0KKyAgICBwdWJsaWMgQ2xvc3VyZSBhZGRQcmVJbnN0YW50aWF0ZURlbGVnYXRlKCBDbG9zdXJlIGRlbGVnYXRlICkgew0KKyAgICAgICAgcHJveHlCdWlsZGVyLnByZUluc3RhbnRpYXRlRGVsZWdhdGVzLmFkZEZpcnN0KCBkZWxlZ2F0ZSApOw0KKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBSZW1vdmUgdGhlIG1vc3QgcmVjZW50bHkgYWRkZWQgaW5zdGFuY2Ugb2YgdGhlIHByZUluc3RhbnRpYXRlIGRlbGVnYXRlLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gZGVsZWdhdGUNCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByZUluc3RhbnRpYXRlRGVsZWdhdGUoIENsb3N1cmUgZGVsZWdhdGUgKSB7DQorICAgICAgICBwcm94eUJ1aWxkZXIucHJlSW5zdGFudGlhdGVEZWxlZ2F0ZXMucmVtb3ZlKCBkZWxlZ2F0ZSApOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBBZGQgYSBwb3N0SW5zdGFudGlhdGUgZGVsZWdhdGUgc28gaXQgY2FuIGludGVyY2VwdCBub2RlcyBhZnRlciB0aGV5IGFyZQ0KKyAgICAgKiBjcmVhdGVkLiBQb3N0SW5zdGFudGlhdGUgZGVsZWdhdGVzIGFyZSBmaXJlZCBpbiBhIEZJTE8gcGF0dGVybiwgc28gdGhhdA0KKyAgICAgKiBuZXN0ZWQgZGVsZWdhdGVzIGdldCBmaXJzdCBjcmFjay4NCisgICAgICoNCisgICAgICogQHBhcmFtIGRlbGVnYXRlDQorICAgICAqLw0KKyAgICBwdWJsaWMgQ2xvc3VyZSBhZGRQb3N0SW5zdGFudGlhdGVEZWxlZ2F0ZSggQ2xvc3VyZSBkZWxlZ2F0ZSApIHsNCisgICAgICAgIHByb3h5QnVpbGRlci5wb3N0SW5zdGFudGlhdGVEZWxlZ2F0ZXMuYWRkRmlyc3QoIGRlbGVnYXRlICk7DQorICAgICAgICByZXR1cm4gZGVsZWdhdGU7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFJlbW92ZSB0aGUgbW9zdCByZWNlbnRseSBhZGRlZCBpbnN0YW5jZSBvZiB0aGUgcG9zdEluc3RhbnRpYXRlIGRlbGVnYXRlLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gZGVsZWdhdGUNCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIHJlbW92ZVBvc3RJbnN0YW50aWF0ZURlbGVnYXRlKCBDbG9zdXJlIGRlbGVnYXRlICkgew0KKyAgICAgICAgcHJveHlCdWlsZGVyLnBvc3RJbnN0YW50aWF0ZURlbGVnYXRlcy5yZW1vdmUoIGRlbGVnYXRlICk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEFkZCBhIG5vZGVDb21wbGV0aW9uIGRlbGVnYXRlIHNvIGl0IGNhbiBpbnRlcmNlcHQgbm9kZXMgYWZ0ZXIgdGhleSBkb25lDQorICAgICAqIHdpdGggYnVpbGRpbmcuIE5vZGVDb21wbGV0aW9uIGRlbGVnYXRlcyBhcmUgZmlyZWQgaW4gYSBGSUxPIHBhdHRlcm4sIHNvDQorICAgICAqIHRoYXQgbmVzdGVkIGRlbGVnYXRlcyBnZXQgZmlyc3QgY3JhY2suDQorICAgICAqDQorICAgICAqIEBwYXJhbSBkZWxlZ2F0ZQ0KKyAgICAgKi8NCisgICAgcHVibGljIENsb3N1cmUgYWRkUG9zdE5vZGVDb21wbGV0aW9uRGVsZWdhdGUoIENsb3N1cmUgZGVsZWdhdGUgKSB7DQorICAgICAgICBwcm94eUJ1aWxkZXIucG9zdE5vZGVDb21wbGV0aW9uRGVsZWdhdGVzLmFkZEZpcnN0KCBkZWxlZ2F0ZSApOw0KKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBSZW1vdmUgdGhlIG1vc3QgcmVjZW50bHkgYWRkZWQgaW5zdGFuY2Ugb2YgdGhlIG5vZGVDb21wbGV0aW9uIGRlbGVnYXRlLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gZGVsZWdhdGUNCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIHJlbW92ZVBvc3ROb2RlQ29tcGxldGlvbkRlbGVnYXRlKCBDbG9zdXJlIGRlbGVnYXRlICkgew0KKyAgICAgICAgcHJveHlCdWlsZGVyLnBvc3ROb2RlQ29tcGxldGlvbkRlbGVnYXRlcy5yZW1vdmUoIGRlbGVnYXRlICk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFJlZ2lzdGVycyBhIGZhY3RvcnkgZm9yIGEgSmF2YUJlYW4uPGJyPg0KKyAgICAgKiBUaGUgSmF2YUJlYW4gY2xhcyBzaG91bGQgaGF2ZSBhIG5vLWFyZ3MgY29uc3RydWN0b3IuDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlckJlYW5GYWN0b3J5KCBTdHJpbmcgdGhlTmFtZSwgZmluYWwgQ2xhc3MgYmVhbkNsYXNzICkgew0KKyAgICAgICAgcHJveHlCdWlsZGVyLnJlZ2lzdGVyRmFjdG9yeSggdGhlTmFtZSwgbmV3IEFic3RyYWN0RmFjdG9yeSgpew0KKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgbmV3SW5zdGFuY2UoIEZhY3RvcnlCdWlsZGVyU3VwcG9ydCBidWlsZGVyLCBPYmplY3QgbmFtZSwgT2JqZWN0IHZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgTWFwIHByb3BlcnRpZXMgKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7DQorICAgICAgICAgICAgICAgIGlmKCBjaGVja1ZhbHVlSXNUeXBlTm90U3RyaW5nKCB2YWx1ZSwgbmFtZSwgYmVhbkNsYXNzICkgKXsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsNCisgICAgICAgICAgICAgICAgfWVsc2V7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmVhbkNsYXNzLm5ld0luc3RhbmNlKCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9ICk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFJlZ2lzdGVycyBhIGZhY3RvcnkgZm9yIGEgbm9kZSBuYW1lLg0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJGYWN0b3J5KCBTdHJpbmcgbmFtZSwgRmFjdG9yeSBmYWN0b3J5ICkgew0KKyAgICAgICAgcHJveHlCdWlsZGVyLmZhY3Rvcmllcy5wdXQoIG5hbWUsIGZhY3RvcnkgKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogVGhpcyBtZXRob2QgaXMgcmVzcG9uc2libGUgZm9yIGluc3RhbmNpYXRpbmcgYSBub2RlIGFuZCBjb25maWd1cmUgaXRzDQorICAgICAqIHByb3BlcnRpZXMuDQorICAgICAqLw0KKyAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZU5vZGUoIE9iamVjdCBuYW1lLCBNYXAgYXR0cmlidXRlcywgT2JqZWN0IHZhbHVlICkgew0KKyAgICAgICAgT2JqZWN0IG5vZGUgPSBudWxsOw0KKw0KKyAgICAgICAgRmFjdG9yeSBmYWN0b3J5ID0gcHJveHlCdWlsZGVyLnJlc29sdmVGYWN0b3J5KCBuYW1lLCBhdHRyaWJ1dGVzLCB2YWx1ZSApOw0KKyAgICAgICAgaWYoIGZhY3RvcnkgPT0gbnVsbCApew0KKyAgICAgICAgICAgIExPRy5sb2coIExldmVsLldBUk5JTkcsICJDb3VsZCBub3QgZmluZCBtYXRjaCBmb3IgbmFtZSAnIiArIG5hbWUgKyAiJyIgKTsNCisgICAgICAgICAgICByZXR1cm4gbnVsbDsNCisgICAgICAgIH0NCisgICAgICAgIHByb3h5QnVpbGRlci5nZXRDb250ZXh0KCkucHV0KCBDVVJSRU5UX0ZBQ1RPUlksIGZhY3RvcnkgKTsNCisgICAgICAgIHByb3h5QnVpbGRlci5wcmVJbnN0YW50aWF0ZSggbmFtZSwgYXR0cmlidXRlcywgdmFsdWUgKTsNCisgICAgICAgIHRyeXsNCisgICAgICAgICAgICBub2RlID0gZmFjdG9yeS5uZXdJbnN0YW5jZSggdGhpcywgbmFtZSwgdmFsdWUsIGF0dHJpYnV0ZXMgKTsNCisgICAgICAgICAgICBpZiggbm9kZSA9PSBudWxsICl7DQorICAgICAgICAgICAgICAgIExPRy5sb2coIExldmVsLldBUk5JTkcsICJGYWN0b3J5IGZvciBuYW1lICciICsgbmFtZSArICInIHJldHVybmVkIG51bGwiICk7DQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBpZiggTE9HLmlzTG9nZ2FibGUoIExldmVsLkZJTkUgKSApew0KKyAgICAgICAgICAgICAgICBMT0cuZmluZSggIkZvciBuYW1lOiAiICsgbmFtZSArICIgY3JlYXRlZCBub2RlOiAiICsgbm9kZSApOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH1jYXRjaCggRXhjZXB0aW9uIGUgKXsNCisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggIkZhaWxlZCB0byBjcmVhdGUgY29tcG9uZW50IGZvciAnIiArIG5hbWUgKyAiJyByZWFzb246ICINCisgICAgICAgICAgICAgICAgICAgICsgZSwgZSApOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHJveHlCdWlsZGVyLnBvc3RJbnN0YW50aWF0ZSggbmFtZSwgYXR0cmlidXRlcywgbm9kZSApOw0KKyAgICAgICAgcHJveHlCdWlsZGVyLmhhbmRsZU5vZGVBdHRyaWJ1dGVzKCBub2RlLCBhdHRyaWJ1dGVzICk7DQorICAgICAgICByZXR1cm4gbm9kZTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogUmV0dXJucyB0aGUgRmFjdG9yeSBhc3NvY2lhdGVkIHdpdGggbmFtZS48YnI+DQorICAgICAqIFRoaXMgaXMgYSBob29rIGZvciBzdWJjbGFzc2VzIHRvIHBsdWdpbiBhIGN1c3RvbSBzdHJhdGVneSBmb3IgbWFwcGluZw0KKyAgICAgKiBuYW1lcyB0byBmYWN0b3JpZXMuDQorICAgICAqLw0KKyAgICBwcm90ZWN0ZWQgRmFjdG9yeSByZXNvbHZlRmFjdG9yeSggT2JqZWN0IG5hbWUsIE1hcCBhdHRyaWJ1dGVzLCBPYmplY3QgdmFsdWUgKSB7DQorICAgICAgICByZXR1cm4gKEZhY3RvcnkpIHByb3h5QnVpbGRlci5mYWN0b3JpZXMuZ2V0KCBuYW1lICk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFRoaXMgbWV0aG9kIGlzIHRoZSB3b3JraG9yc2Ugb2YgdGhlIGJ1aWxkZXIuDQorICAgICAqLw0KKyAgICBwcml2YXRlIE9iamVjdCBkb0ludm9rZU1ldGhvZCggU3RyaW5nIG1ldGhvZE5hbWUsIE9iamVjdCBuYW1lLCBPYmplY3QgYXJncyApIHsNCisgICAgICAgIE9iamVjdCBub2RlID0gbnVsbDsNCisgICAgICAgIENsb3N1cmUgY2xvc3VyZSA9IG51bGw7DQorICAgICAgICBMaXN0IGxpc3QgPSBJbnZva2VySGVscGVyLmFzTGlzdCggYXJncyApOw0KKw0KKyAgICAgICAgaWYoIHByb3h5QnVpbGRlci5nZXRDb250ZXh0cygpLmlzRW1wdHkoKSApew0KKyAgICAgICAgICAgIC8vIHNob3VsZCBiZSBjYWxsZWQgb24gZmlyc3QgYnVpbGQgbWV0aG9kIG9ubHkNCisgICAgICAgICAgICBwcm94eUJ1aWxkZXIubmV3Q29udGV4dCgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc3dpdGNoKCBsaXN0LnNpemUoKSApew0KKyAgICAgICAgICAgIGNhc2UgMDoNCisgICAgICAgICAgICAgICAgbm9kZSA9IHByb3h5QnVpbGRlci5jcmVhdGVOb2RlKCBuYW1lLCBDb2xsZWN0aW9ucy5FTVBUWV9NQVAsIG51bGwgKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSAxOiB7DQorICAgICAgICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBsaXN0LmdldCggMCApOw0KKyAgICAgICAgICAgICAgICBpZiggb2JqZWN0IGluc3RhbmNlb2YgTWFwICl7DQorICAgICAgICAgICAgICAgICAgICBub2RlID0gcHJveHlCdWlsZGVyLmNyZWF0ZU5vZGUoIG5hbWUsIChNYXApIG9iamVjdCwgbnVsbCApOw0KKyAgICAgICAgICAgICAgICB9ZWxzZSBpZiggb2JqZWN0IGluc3RhbmNlb2YgQ2xvc3VyZSApew0KKyAgICAgICAgICAgICAgICAgICAgY2xvc3VyZSA9IChDbG9zdXJlKSBvYmplY3Q7DQorICAgICAgICAgICAgICAgICAgICBub2RlID0gcHJveHlCdWlsZGVyLmNyZWF0ZU5vZGUoIG5hbWUsIENvbGxlY3Rpb25zLkVNUFRZX01BUCwgbnVsbCApOw0KKyAgICAgICAgICAgICAgICB9ZWxzZXsNCisgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBwcm94eUJ1aWxkZXIuY3JlYXRlTm9kZSggbmFtZSwgQ29sbGVjdGlvbnMuRU1QVFlfTUFQLCBvYmplY3QgKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSAyOiB7DQorICAgICAgICAgICAgICAgIE9iamVjdCBvYmplY3QxID0gbGlzdC5nZXQoIDAgKTsNCisgICAgICAgICAgICAgICAgT2JqZWN0IG9iamVjdDIgPSBsaXN0LmdldCggMSApOw0KKyAgICAgICAgICAgICAgICBpZiggb2JqZWN0MSBpbnN0YW5jZW9mIE1hcCApew0KKyAgICAgICAgICAgICAgICAgICAgaWYoIG9iamVjdDIgaW5zdGFuY2VvZiBDbG9zdXJlICl7DQorICAgICAgICAgICAgICAgICAgICAgICAgY2xvc3VyZSA9IChDbG9zdXJlKSBvYmplY3QyOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBwcm94eUJ1aWxkZXIuY3JlYXRlTm9kZSggbmFtZSwgKE1hcCkgb2JqZWN0MSwgbnVsbCApOw0KKyAgICAgICAgICAgICAgICAgICAgfWVsc2V7DQorICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9IHByb3h5QnVpbGRlci5jcmVhdGVOb2RlKCBuYW1lLCAoTWFwKSBvYmplY3QxLCBvYmplY3QyICk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH1lbHNlew0KKyAgICAgICAgICAgICAgICAgICAgaWYoIG9iamVjdDIgaW5zdGFuY2VvZiBDbG9zdXJlICl7DQorICAgICAgICAgICAgICAgICAgICAgICAgY2xvc3VyZSA9IChDbG9zdXJlKSBvYmplY3QyOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBwcm94eUJ1aWxkZXIuY3JlYXRlTm9kZSggbmFtZSwgQ29sbGVjdGlvbnMuRU1QVFlfTUFQLCBvYmplY3QxICk7DQorICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZiggb2JqZWN0MiBpbnN0YW5jZW9mIE1hcCApew0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBwcm94eUJ1aWxkZXIuY3JlYXRlTm9kZSggbmFtZSwgKE1hcCkgb2JqZWN0Miwgb2JqZWN0MSApOw0KKyAgICAgICAgICAgICAgICAgICAgfWVsc2V7DQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdNZXRob2RFeGNlcHRpb24oIG5hbWUudG9TdHJpbmcoKSwgZ2V0Q2xhc3MoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QudG9BcnJheSgpLCBmYWxzZSApOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIDM6IHsNCisgICAgICAgICAgICAgICAgT2JqZWN0IGFyZzAgPSBsaXN0LmdldCggMCApOw0KKyAgICAgICAgICAgICAgICBPYmplY3QgYXJnMSA9IGxpc3QuZ2V0KCAxICk7DQorICAgICAgICAgICAgICAgIE9iamVjdCBhcmcyID0gbGlzdC5nZXQoIDIgKTsNCisgICAgICAgICAgICAgICAgaWYoIGFyZzAgaW5zdGFuY2VvZiBNYXAgJiYgYXJnMiBpbnN0YW5jZW9mIENsb3N1cmUgKXsNCisgICAgICAgICAgICAgICAgICAgIGNsb3N1cmUgPSAoQ2xvc3VyZSkgYXJnMjsNCisgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBwcm94eUJ1aWxkZXIuY3JlYXRlTm9kZSggbmFtZSwgKE1hcCkgYXJnMCwgYXJnMSApOw0KKyAgICAgICAgICAgICAgICB9ZWxzZSBpZiggYXJnMSBpbnN0YW5jZW9mIE1hcCAmJiBhcmcyIGluc3RhbmNlb2YgQ2xvc3VyZSApew0KKyAgICAgICAgICAgICAgICAgICAgY2xvc3VyZSA9IChDbG9zdXJlKSBhcmcyOw0KKyAgICAgICAgICAgICAgICAgICAgbm9kZSA9IHByb3h5QnVpbGRlci5jcmVhdGVOb2RlKCBuYW1lLCAoTWFwKSBhcmcxLCBhcmcwICk7DQorICAgICAgICAgICAgICAgIH1lbHNlew0KKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdNZXRob2RFeGNlcHRpb24oIG5hbWUudG9TdHJpbmcoKSwgZ2V0Q2xhc3MoKSwgbGlzdC50b0FycmF5KCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlICk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdNZXRob2RFeGNlcHRpb24oIG5hbWUudG9TdHJpbmcoKSwgZ2V0Q2xhc3MoKSwgbGlzdC50b0FycmF5KCksDQorICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICB9DQorDQorICAgICAgICBpZiggbm9kZSA9PSBudWxsICl7DQorICAgICAgICAgICAgaWYoIHByb3h5QnVpbGRlci5nZXRDb250ZXh0cygpLnNpemUoKSA9PSAxICl7DQorICAgICAgICAgICAgICAgIC8vIHBvcCB0aGUgZmlyc3QgY29udGV4dA0KKyAgICAgICAgICAgICAgICBwcm94eUJ1aWxkZXIucG9wQ29udGV4dCgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gbm9kZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIE9iamVjdCBjdXJyZW50ID0gcHJveHlCdWlsZGVyLmdldEN1cnJlbnQoKTsNCisgICAgICAgIGlmKCBjdXJyZW50ICE9IG51bGwgKXsNCisgICAgICAgICAgICBwcm94eUJ1aWxkZXIuc2V0UGFyZW50KCBjdXJyZW50LCBub2RlICk7DQorICAgICAgICB9DQorDQorICAgICAgICBpZiggY2xvc3VyZSAhPSBudWxsICl7DQorICAgICAgICAgICAgaWYoIHByb3h5QnVpbGRlci5nZXRDdXJyZW50RmFjdG9yeSgpLmlzTGVhZigpICl7DQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCAiJyIgKyBuYW1lICsgIicgZG9lc24ndCBzdXBwb3J0IG5lc3RpbmcuIiApOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICAvLyBwdXNoIG5ldyBub2RlIG9uIHN0YWNrDQorICAgICAgICAgICAgT2JqZWN0IHBhcmVudEZhY3RvcnkgPSBwcm94eUJ1aWxkZXIuZ2V0Q3VycmVudEZhY3RvcnkoKTsNCisgICAgICAgICAgICBNYXAgcGFyZW50Q29udGV4dCA9IHByb3h5QnVpbGRlci5nZXRDb250ZXh0KCk7DQorICAgICAgICAgICAgcHJveHlCdWlsZGVyLm5ld0NvbnRleHQoKTsNCisgICAgICAgICAgICBwcm94eUJ1aWxkZXIuZ2V0Q29udGV4dCgpLnB1dCggT1dORVIsIGNsb3N1cmUuZ2V0T3duZXIoKSApOw0KKyAgICAgICAgICAgIHByb3h5QnVpbGRlci5nZXRDb250ZXh0KCkucHV0KCBDVVJSRU5UX05PREUsIG5vZGUgKTsNCisgICAgICAgICAgICBwcm94eUJ1aWxkZXIuZ2V0Q29udGV4dCgpLnB1dCggUEFSRU5UX0ZBQ1RPUlksIHBhcmVudEZhY3RvcnkgKTsNCisgICAgICAgICAgICBwcm94eUJ1aWxkZXIuZ2V0Q29udGV4dCgpLnB1dCggUEFSRU5UX05PREUsIGN1cnJlbnQgKTsNCisgICAgICAgICAgICBwcm94eUJ1aWxkZXIuZ2V0Q29udGV4dCgpLnB1dCggUEFSRU5UX0NPTlRFWFQsIHBhcmVudENvbnRleHQgKTsNCisgICAgICAgICAgICAvLyBsZXRzIHJlZ2lzdGVyIHRoZSBidWlsZGVyIGFzIHRoZSBkZWxlZ2F0ZQ0KKyAgICAgICAgICAgIHByb3h5QnVpbGRlci5zZXRDbG9zdXJlRGVsZWdhdGUoIGNsb3N1cmUsIG5vZGUgKTsNCisgICAgICAgICAgICBjbG9zdXJlLmNhbGwoKTsNCisgICAgICAgICAgICBwcm94eUJ1aWxkZXIucG9wQ29udGV4dCgpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHJveHlCdWlsZGVyLm5vZGVDb21wbGV0ZWQoIGN1cnJlbnQsIG5vZGUgKTsNCisgICAgICAgIG5vZGUgPSBwcm94eUJ1aWxkZXIucG9zdE5vZGVDb21wbGV0aW9uKCBjdXJyZW50LCBub2RlICk7DQorICAgICAgICBpZiggcHJveHlCdWlsZGVyLmdldENvbnRleHRzKCkNCisgICAgICAgICAgICAgICAgLnNpemUoKSA9PSAxICl7DQorICAgICAgICAgICAgLy8gcG9wIHRoZSBmaXJzdCBjb250ZXh0DQorICAgICAgICAgICAgcHJveHlCdWlsZGVyLnBvcENvbnRleHQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBub2RlOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBBIGhvb2sgdG8gYWxsb3cgbmFtZXMgdG8gYmUgY29udmVydGVkIGludG8gc29tZSBvdGhlciBvYmplY3Qgc3VjaCBhcyBhDQorICAgICAqIFFOYW1lIGluIFhNTCBvciBPYmplY3ROYW1lIGluIEpNWC4NCisgICAgICoNCisgICAgICogQHBhcmFtIG1ldGhvZE5hbWUgdGhlIG5hbWUgb2YgdGhlIGRlc2lyZWQgbWV0aG9kDQorICAgICAqIEByZXR1cm4gdGhlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIG5hbWUNCisgICAgICovDQorICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0TmFtZSggU3RyaW5nIG1ldGhvZE5hbWUgKSB7DQorICAgICAgICBpZiggcHJveHlCdWlsZGVyLm5hbWVNYXBwaW5nQ2xvc3VyZSAhPSBudWxsICl7DQorICAgICAgICAgICAgcmV0dXJuIHByb3h5QnVpbGRlci5uYW1lTWFwcGluZ0Nsb3N1cmUuY2FsbCggbWV0aG9kTmFtZSApOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIG1ldGhvZE5hbWU7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgYnVpbGRlciB0aGF0IHNlcnZlcyBhcyBhIHByb3h5Ljxicj4NCisgICAgICogUHJveHkgYnVpbGRlcnMgYXJlIHVzZWZ1bCBmb3IgY2hhbmdpbmcgdGhlIGJ1aWxkaW5nIGNvbnRleHQsIHRodXMNCisgICAgICogZW5hYmxpbmcgbWl4ICZhbXA7IG1hdGNoIGJ1aWxkZXJzLg0KKyAgICAgKi8NCisgICAgcHJvdGVjdGVkIEZhY3RvcnlCdWlsZGVyU3VwcG9ydCBnZXRQcm94eUJ1aWxkZXIoKSB7DQorICAgICAgICByZXR1cm4gcHJveHlCdWlsZGVyOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBBc3NpZ25zIGFueSBleGlzdGluZyBwcm9wZXJ0aWVzIHRvIHRoZSBub2RlLjxicj4NCisgICAgICogSXQgd2lsbCBjYWxsIGF0dHJpYnV0ZURlbGVnYXRlcyBiZWZvcmUgcGFzc2luZyBjb250cm9sIHRvIHRoZSBmYWN0b3J5DQorICAgICAqIHRoYXQgYnVpbHQgdGhlIG5vZGUuDQorICAgICAqLw0KKyAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb2RlQXR0cmlidXRlcyggT2JqZWN0IG5vZGUsIE1hcCBhdHRyaWJ1dGVzICkgew0KKyAgICAgICAgLy8gZmlyc3QsIHNob3J0IGNpcmN1aXQNCisgICAgICAgIGlmKCBub2RlID09IG51bGwgKXsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorDQorICAgICAgICBmb3IoIEl0ZXJhdG9yIGl0ZXIgPSBwcm94eUJ1aWxkZXIuYXR0cmlidXRlRGVsZWdhdGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApew0KKyAgICAgICAgICAgICgoQ2xvc3VyZSkgaXRlci5uZXh0KCkpLmNhbGwoIG5ldyBPYmplY3RbXSB7IHRoaXMsIG5vZGUsIGF0dHJpYnV0ZXMgfSApOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaWYoIHByb3h5QnVpbGRlci5nZXRDdXJyZW50RmFjdG9yeSgpLm9uSGFuZGxlTm9kZUF0dHJpYnV0ZXMoIHRoaXMsIG5vZGUsIGF0dHJpYnV0ZXMgKSApew0KKyAgICAgICAgICAgIHByb3h5QnVpbGRlci5zZXROb2RlQXR0cmlidXRlcyggbm9kZSwgYXR0cmlidXRlcyApOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBQdXNoZXMgYSBuZXcgY29udGV4dCBvbiB0aGUgc3RhY2suDQorICAgICAqLw0KKyAgICBwcm90ZWN0ZWQgdm9pZCBuZXdDb250ZXh0KCkgew0KKyAgICAgICAgcHJveHlCdWlsZGVyLmNvbnRleHRzLmFkZEZpcnN0KCBuZXcgSGFzaE1hcCgpICk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEEgaG9vayB0byBhbGxvdyBub2RlcyB0byBiZSBwcm9jZXNzZWQgb25jZSB0aGV5IGhhdmUgaGFkIGFsbCBvZiB0aGVpcg0KKyAgICAgKiBjaGlsZHJlbiBhcHBsaWVkLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gbm9kZSB0aGUgY3VycmVudCBub2RlIGJlaW5nIHByb2Nlc3NlZA0KKyAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgb2YgdGhlIG5vZGUgYmVpbmcgcHJvY2Vzc2VkDQorICAgICAqLw0KKyAgICBwcm90ZWN0ZWQgdm9pZCBub2RlQ29tcGxldGVkKCBPYmplY3QgcGFyZW50LCBPYmplY3Qgbm9kZSApIHsNCisgICAgICAgIHByb3h5QnVpbGRlci5nZXRDdXJyZW50RmFjdG9yeSgpLm9uTm9kZUNvbXBsZXRlZCggdGhpcywgcGFyZW50LCBub2RlICk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFJlbW92ZXMgdGhlIGxhc3QgY29udGV4dCBmcm9tIHRoZSBzdGFjay4NCisgICAgICovDQorICAgIHByb3RlY3RlZCBNYXAgcG9wQ29udGV4dCgpIHsNCisgICAgICAgIGlmKCAhcHJveHlCdWlsZGVyLmNvbnRleHRzLmlzRW1wdHkoKSApew0KKyAgICAgICAgICAgIHJldHVybiAoTWFwKSBwcm94eUJ1aWxkZXIuY29udGV4dHMucmVtb3ZlRmlyc3QoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBudWxsOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBBIGhvb2sgYWZ0ZXIgdGhlIGZhY3RvcnkgY3JlYXRlcyB0aGUgbm9kZSBhbmQgYmVmb3JlIGF0dHJpYnV0ZXMgYXJlIHNldC48YnI+DQorICAgICAqIEl0IHdpbGwgY2FsbCBhbnkgcmVnaXN0ZXJlZCBwb3N0SW5zdGFudGlhdGVEZWxlZ2F0ZXMsIGlmIHlvdSBvdmVycmlkZQ0KKyAgICAgKiB0aGlzIG1ldGhvZCBiZSBzdXJlIHRvIGNhbGwgdGhpcyBpbXBsIHNvbWV3aGVyZSBpbiB5b3VyIGNvZGUuDQorICAgICAqLw0KKyAgICBwcm90ZWN0ZWQgdm9pZCBwb3N0SW5zdGFudGlhdGUoIE9iamVjdCBuYW1lLCBNYXAgYXR0cmlidXRlcywgT2JqZWN0IG5vZGUgKSB7DQorICAgICAgICBmb3IoIEl0ZXJhdG9yIGl0ZXIgPSBwcm94eUJ1aWxkZXIucG9zdEluc3RhbnRpYXRlRGVsZWdhdGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApew0KKyAgICAgICAgICAgICgoQ2xvc3VyZSkgaXRlci5uZXh0KCkpLmNhbGwoIG5ldyBPYmplY3RbXSB7IHRoaXMsIG5vZGUsIGF0dHJpYnV0ZXMgfSApOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBBIGhvb2sgdG8gYWxsb3cgbm9kZXMgdG8gYmUgcHJvY2Vzc2VkIG9uY2UgdGhleSBoYXZlIGhhZCBhbGwgb2YgdGhlaXINCisgICAgICogY2hpbGRyZW4gYXBwbGllZCBhbmQgYWxsb3dzIHRoZSBhY3R1YWwgbm9kZSBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZQ0KKyAgICAgKiBNYXJrdXAgZWxlbWVudCB0byBiZSBjaGFuZ2VkLjxicj4NCisgICAgICogSXQgd2lsbCBjYWxsIGFueSByZWdpc3RlcmVkIHBvc3ROb2RlQ29tcGxldGlvbkRlbGVnYXRlcywgaWYgeW91IG92ZXJyaWRlDQorICAgICAqIHRoaXMgbWV0aG9kIGJlIHN1cmUgdG8gY2FsbCB0aGlzIGltcGwgYXQgdGhlIGVuZCBvZiB5b3VyIGNvZGUuDQorICAgICAqDQorICAgICAqIEBwYXJhbSBub2RlIHRoZSBjdXJyZW50IG5vZGUgYmVpbmcgcHJvY2Vzc2VkDQorICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBvZiB0aGUgbm9kZSBiZWluZyBwcm9jZXNzZWQNCisgICAgICogQHJldHVybiB0aGUgbm9kZSwgcG9zc2libHkgbmV3LCB0aGF0IHJlcHJlc2VudHMgdGhlIG1hcmt1cCBlbGVtZW50DQorICAgICAqLw0KKyAgICBwcm90ZWN0ZWQgT2JqZWN0IHBvc3ROb2RlQ29tcGxldGlvbiggT2JqZWN0IHBhcmVudCwgT2JqZWN0IG5vZGUgKSB7DQorICAgICAgICBmb3IoIEl0ZXJhdG9yIGl0ZXIgPSBwcm94eUJ1aWxkZXIucG9zdE5vZGVDb21wbGV0aW9uRGVsZWdhdGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApew0KKyAgICAgICAgICAgICgoQ2xvc3VyZSkgaXRlci5uZXh0KCkpLmNhbGwoIG5ldyBPYmplY3RbXSB7IHRoaXMsIHBhcmVudCwgbm9kZSB9ICk7DQorICAgICAgICB9DQorDQorICAgICAgICByZXR1cm4gbm9kZTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQSBob29rIGJlZm9yZSB0aGUgZmFjdG9yeSBjcmVhdGVzIHRoZSBub2RlLjxicj4NCisgICAgICogSXQgd2lsbCBjYWxsIGFueSByZWdpc3RlcmVkIHByZUluc3RhbnRpYXRlRGVsZWdhdGVzLCBpZiB5b3Ugb3ZlcnJpZGUgdGhpcw0KKyAgICAgKiBtZXRob2QgYmUgc3VyZSB0byBjYWxsIHRoaXMgaW1wbCBzb21ld2hlcmUgaW4geW91ciBjb2RlLg0KKyAgICAgKi8NCisgICAgcHJvdGVjdGVkIHZvaWQgcHJlSW5zdGFudGlhdGUoIE9iamVjdCBuYW1lLCBNYXAgYXR0cmlidXRlcywgT2JqZWN0IHZhbHVlICkgew0KKyAgICAgICAgZm9yKCBJdGVyYXRvciBpdGVyID0gcHJveHlCdWlsZGVyLnByZUluc3RhbnRpYXRlRGVsZWdhdGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApew0KKyAgICAgICAgICAgICgoQ2xvc3VyZSkgaXRlci5uZXh0KCkpLmNhbGwoIG5ldyBPYmplY3RbXSB7IHRoaXMsIHZhbHVlLCBhdHRyaWJ1dGVzIH0gKTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQ2xlYXJzIHRoZSBjb250ZXh0IHN0YWNrLg0KKyAgICAgKi8NCisgICAgcHJvdGVjdGVkIHZvaWQgcmVzZXQoKSB7DQorICAgICAgICBwcm94eUJ1aWxkZXIuY29udGV4dHMuY2xlYXIoKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQSBzdHJhdGVneSBtZXRob2QgdG8gYWxsb3cgZGVyaXZlZCBidWlsZGVycyB0byB1c2UgYnVpbGRlci10cmVlcyBhbmQNCisgICAgICogc3dpdGNoIGluIGRpZmZlcmVudCBraW5kcyBvZiBidWlsZGVycy4gVGhpcyBtZXRob2Qgc2hvdWxkIGNhbGwgdGhlDQorICAgICAqIHNldERlbGVnYXRlKCkgbWV0aG9kIG9uIHRoZSBjbG9zdXJlIHdoaWNoIGJ5IGRlZmF1bHQgcGFzc2VzIGluIHRoaXMgYnV0DQorICAgICAqIGlmIG5vZGUgaXMtYSBidWlsZGVyIHdlIGNvdWxkIHBhc3MgdGhhdCBpbiBpbnN0ZWFkIChvciBkbyBzb21ldGhpbmcgd2Fja3kNCisgICAgICogdG9vKQ0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gY2xvc3VyZSB0aGUgY2xvc3VyZSBvbiB3aGljaCB0byBjYWxsIHNldERlbGVnYXRlKCkNCisgICAgICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdmFsdWUgdGhhdCB3ZSd2ZSBqdXN0IGNyZWF0ZWQsIHdoaWNoIGNvdWxkIGJlIGENCisgICAgICogICAgICAgIGJ1aWxkZXINCisgICAgICovDQorICAgIHByb3RlY3RlZCB2b2lkIHNldENsb3N1cmVEZWxlZ2F0ZSggQ2xvc3VyZSBjbG9zdXJlLCBPYmplY3Qgbm9kZSApIHsNCisgICAgICAgIGNsb3N1cmUuc2V0RGVsZWdhdGUoIHRoaXMgKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogTWFwcyBhdHRyaWJ1dGVzIGtleS92YWx1ZXMgdG8gcHJvcGVydGllcyBvbiBub2RlLg0KKyAgICAgKi8NCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0Tm9kZUF0dHJpYnV0ZXMoIE9iamVjdCBub2RlLCBNYXAgYXR0cmlidXRlcyApIHsNCisgICAgICAgIC8vIHNldCB0aGUgcHJvcGVydGllcw0KKyAgICAgICAgZm9yKCBJdGVyYXRvciBpdGVyID0gYXR0cmlidXRlcy5lbnRyeVNldCgpDQorICAgICAgICAgICAgICAgIC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKXsNCisgICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsNCisgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHkgPSBlbnRyeS5nZXRLZXkoKS50b1N0cmluZygpOw0KKyAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7DQorICAgICAgICAgICAgSW52b2tlckhlbHBlci5zZXRQcm9wZXJ0eSggbm9kZSwgcHJvcGVydHksIHZhbHVlICk7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFN0cmF0ZWd5IG1ldGhvZCB0byBzdGFibGlzaCBwYXJlbnQvY2hpbGQgcmVsYXRpb25zaGlwcy4NCisgICAgICovDQorICAgIHByb3RlY3RlZCB2b2lkIHNldFBhcmVudCggT2JqZWN0IHBhcmVudCwgT2JqZWN0IGNoaWxkICkgew0KKyAgICAgICAgcHJveHlCdWlsZGVyLmdldEN1cnJlbnRGYWN0b3J5KCkuc2V0UGFyZW50KCB0aGlzLCBwYXJlbnQsIGNoaWxkICk7DQorICAgICAgICBGYWN0b3J5IHBhcmVudEZhY3RvcnkgPSBwcm94eUJ1aWxkZXIuZ2V0UGFyZW50RmFjdG9yeSgpOw0KKyAgICAgICAgaWYoIHBhcmVudEZhY3RvcnkgIT0gbnVsbCApew0KKyAgICAgICAgICAgIHBhcmVudEZhY3Rvcnkuc2V0Q2hpbGQoIHRoaXMsIHBhcmVudCwgY2hpbGQgKTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogU2V0cyB0aGUgYnVpbGRlciB0byBiZSB1c2VkIGFzIGEgcHJveHkuDQorICAgICAqLw0KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRQcm94eUJ1aWxkZXIoIEZhY3RvcnlCdWlsZGVyU3VwcG9ydCBwcm94eUJ1aWxkZXIgKSB7DQorICAgICAgICB0aGlzLnByb3h5QnVpbGRlciA9IHByb3h5QnVpbGRlcjsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogUmV0dXJucyB0aGUgc3RhY2sgb2YgYXZhaWxhYmxlIGNvbnRleHRzLg0KKyAgICAgKi8NCisgICAgcHJvdGVjdGVkIExpbmtlZExpc3QgZ2V0Q29udGV4dHMoKSB7DQorICAgICAgICByZXR1cm4gcHJveHlCdWlsZGVyLmNvbnRleHRzOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBPYmplY3QgYnVpbGQoQ2xhc3Mgdmlld0NsYXNzKSB7DQorICAgICAgICBpZiAoU2NyaXB0LmNsYXNzLmlzQXNzaWduYWJsZUZyb20odmlld0NsYXNzKSkgew0KKyAgICAgICAgICAgIFNjcmlwdCBzY3JpcHQgPSBJbnZva2VySGVscGVyLmNyZWF0ZVNjcmlwdCh2aWV3Q2xhc3MsIHRoaXMpOw0KKyAgICAgICAgICAgIHJldHVybiBidWlsZChzY3JpcHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiT25seSBzY3JpcHRzIGNhbiBiZSBleGVjdXRlZCB2aWEgYnVpbGQoQ2xhc3MpIik7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcHVibGljIE9iamVjdCBidWlsZChTY3JpcHQgc2NyaXB0KSB7DQorICAgICAgICBzeW5jaHJvbml6ZWQgKHNjcmlwdCkgew0KKyAgICAgICAgICAgIE1ldGFDbGFzcyBzY3JpcHRNZXRhQ2xhc3MgPSBzY3JpcHQuZ2V0TWV0YUNsYXNzKCk7DQorICAgICAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICAgICAgc2NyaXB0LnNldE1ldGFDbGFzcyhuZXcgRmFjdG9yeUludGVyY2VwdG9yTWV0YUNsYXNzKHNjcmlwdE1ldGFDbGFzcywgdGhpcykpOw0KKyAgICAgICAgICAgICAgICBzY3JpcHQuc2V0QmluZGluZyh0aGlzKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHNjcmlwdC5ydW4oKTsNCisgICAgICAgICAgICB9IGZpbmFsbHkgew0KKyAgICAgICAgICAgICAgICBzY3JpcHQuc2V0TWV0YUNsYXNzKHNjcmlwdE1ldGFDbGFzcyk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHB1YmxpYyBPYmplY3QgYnVpbGQoZmluYWwgU3RyaW5nIHNjcmlwdCwgR3Jvb3Z5Q2xhc3NMb2FkZXIgbG9hZGVyKSB7DQorICAgICAgICByZXR1cm4gYnVpbGQobG9hZGVyLnBhcnNlQ2xhc3Moc2NyaXB0KSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFN3aXRjaGVzIHRoZSBidWlsZGVyJ3MgcHJveHlCdWlsZGVyIGR1cmluZyB0aGUgZXhlY3V0aW9uIG9mIGEgY2xvc3VyZS48YnI+DQorICAgICAqIFRoaXMgaXMgdXNlZnVsIHRvIHRlbXBvcmFyeSBjaGFuZ2UgdGhlIGJ1aWxkaW5nIGNvbnRleHQgdG8gYW5vdGhlciBidWlsZGVyDQorICAgICAqIHdpdGhvdXQgdGhlIG5lZWQgZm9yIGEgY29udHJpdmVkIHNldHVwLiBJdCB3aWxsIGFsc28gdGFrZSBjYXJlIG9mIHJlc3RvcmluZw0KKyAgICAgKiB0aGUgcHJldmlvdXMgcHJveHlCdWlsZGVyIHdoZW4gdGhlIGV4ZWN1dGlvbiBmaW5pc2hlcywgZXZlbiBpZiBhbiBleGNlcHRpb24NCisgICAgICogd2FzIHRocm93biBmcm9tIGluc2lkZSB0aGUgY2xvc3VyZS4NCisgICAgICoNCisgICAgICogQHBhcmFtIGJ1aWxkZXIgdGhlIHRlbXBvcmFyeSBidWlsZGVyIHRvIHN3aXRjaCB0byBhcyBwcm94eUJ1aWxkZXIuDQorICAgICAqIEBwYXJhbSBjbG9zdXJlIHRoZSBjbG9zdXJlIHRvIGJlIGV4ZWN1dGVkIHVuZGVyIHRoZSB0ZW1wb3JhcnkgYnVpbGRlci4NCisgICAgICoNCisgICAgICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uIC0gYW55IGV4Y2VwdGlvbiB0aGUgY2xvc3VyZSBtaWdodCBoYXZlIHRocm93biBkdXJpbmcNCisgICAgICogZXhlY3V0aW9uLg0KKyAgICAgKiBAcmV0dXJuIHRoZSBleGVjdXRpb24gcmVzdWx0IG9mIHRoZSBjbG9zdXJlLg0KKyAgICAgKi8gDQorICAgIHB1YmxpYyBPYmplY3Qgd2l0aEJ1aWxkZXIoIEZhY3RvcnlCdWlsZGVyU3VwcG9ydCBidWlsZGVyLCBDbG9zdXJlIGNsb3N1cmUgKSB7DQorICAgICAgICBpZiggYnVpbGRlciA9PSBudWxsIHx8IGNsb3N1cmUgPT0gbnVsbCApIHsNCisJICAgIHJldHVybiBudWxsOw0KKwl9DQorDQorCU9iamVjdCByZXN1bHQgPSBudWxsOw0KKyAgICAgICAgT2JqZWN0IHByZXZpb3VzQ29udGV4dCA9IHByb3h5QnVpbGRlci5nZXRDb250ZXh0KCk7DQorCUZhY3RvcnlCdWlsZGVyU3VwcG9ydCBwcmV2aW91c1Byb3h5QnVpbGRlciA9IHByb3h5QnVpbGRlcjsNCisJdHJ5IHsNCisgICAgICAgICAgICBwcm94eUJ1aWxkZXIgPSBidWlsZGVyOw0KKwkgICAgY2xvc3VyZS5zZXREZWxlZ2F0ZSggYnVpbGRlciApOw0KKwkgICAgcmVzdWx0ID0gY2xvc3VyZS5jYWxsKCk7DQorCX0NCisJY2F0Y2goIFJ1bnRpbWVFeGNlcHRpb24gZSApIHsNCisgICAgICAgICAgICAvLyByZW1vdmUgY29udGV4dHMgY3JlYXRlZCBhZnRlciB3ZSBzdGFydGVkDQorICAgICAgICAgICAgcHJveHlCdWlsZGVyID0gcHJldmlvdXNQcm94eUJ1aWxkZXI7DQorICAgICAgICAgICAgaWYgKHByb3h5QnVpbGRlci5jb250ZXh0cy5jb250YWlucyhwcmV2aW91c0NvbnRleHQpKSB7DQorICAgICAgICAgICAgICAgIHdoaWxlIChwcm94eUJ1aWxkZXIuZ2V0Q29udGV4dCgpICE9IHByZXZpb3VzQ29udGV4dCkgew0KKyAgICAgICAgICAgICAgICAgICAgcHJveHlCdWlsZGVyLnBvcENvbnRleHQoKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICB0aHJvdyBlOw0KKwl9DQorCWZpbmFsbHkgew0KKyAgICAgICAgICAgIHByb3h5QnVpbGRlciA9IHByZXZpb3VzUHJveHlCdWlsZGVyOw0KKwl9DQorDQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBTd2l0Y2hlcyB0aGUgYnVpbGRlcidzIHByb3h5QnVpbGRlciBkdXJpbmcgdGhlIGV4ZWN1dGlvbiBvZiBhIGNsb3N1cmUuPGJyPg0KKyAgICAgKiBUaGlzIGlzIHVzZWZ1bCB0byB0ZW1wb3JhcnkgY2hhbmdlIHRoZSBidWlsZGluZyBjb250ZXh0IHRvIGFub3RoZXIgYnVpbGRlcg0KKyAgICAgKiB3aXRob3V0IHRoZSBuZWVkIGZvciBhIGNvbnRyaXZlZCBzZXR1cC4gSXQgd2lsbCBhbHNvIHRha2UgY2FyZSBvZiByZXN0b3JpbmcNCisgICAgICogdGhlIHByZXZpb3VzIHByb3h5QnVpbGRlciB3aGVuIHRoZSBleGVjdXRpb24gZmluaXNoZXMsIGV2ZW4gaWYgYW4gZXhjZXB0aW9uDQorICAgICAqIHdhcyB0aHJvd24gZnJvbSBpbnNpZGUgdGhlIGNsb3N1cmUuIEFkZGl0aW9uYWxseSBpdCB3aWxsIHVzZSB0aGUgY2xvc3VyZSdzDQorICAgICAqIHJlc3VsdCBhcyB0aGUgdmFsdWUgZm9yIHRoZSBub2RlIGlkZW50aWZpZWQgYnkgJ25hbWUnLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gYnVpbGRlciB0aGUgdGVtcG9yYXJ5IGJ1aWxkZXIgdG8gc3dpdGNoIHRvIGFzIHByb3h5QnVpbGRlci4NCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5vZGUgdG8gYnVpbGQgb24gdGhlICdwYXJlbnQnIGJ1aWxkZXIuDQorICAgICAqIEBwYXJhbSBjbG9zdXJlIHRoZSBjbG9zdXJlIHRvIGJlIGV4ZWN1dGVkIHVuZGVyIHRoZSB0ZW1wb3JhcnkgYnVpbGRlci4NCisgICAgICoNCisgICAgICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uIC0gYW55IGV4Y2VwdGlvbiB0aGUgY2xvc3VyZSBtaWdodCBoYXZlIHRocm93biBkdXJpbmcNCisgICAgICogZXhlY3V0aW9uLg0KKyAgICAgKiBAcmV0dXJuIGEgbm9kZSB0aGF0IHJlc3BvbmRzIHRvIHZhbHVlIG9mIG5hbWUgd2l0aCB0aGUgY2xvc3VyZSdzIHJlc3VsdCBhcyBpdHMNCisgICAgICogdmFsdWUuDQorICAgICAqLw0KKyAgICBwdWJsaWMgT2JqZWN0IHdpdGhCdWlsZGVyKCBGYWN0b3J5QnVpbGRlclN1cHBvcnQgYnVpbGRlciwgU3RyaW5nIG5hbWUsIENsb3N1cmUgY2xvc3VyZSApIHsNCisgICAgICAgaWYoIG5hbWUgPT0gbnVsbCApIHsNCisgICAgICAgICAgcmV0dXJuIG51bGw7DQorICAgICAgIH0NCisgICAgICAgT2JqZWN0IHJlc3VsdCA9IHByb3h5QnVpbGRlci53aXRoQnVpbGRlciggYnVpbGRlciwgY2xvc3VyZSApOw0KKyAgICAgICByZXR1cm4gcHJveHlCdWlsZGVyLmludm9rZU1ldGhvZCggbmFtZSwgbmV3IE9iamVjdFtdeyByZXN1bHQgfSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFN3aXRjaGVzIHRoZSBidWlsZGVyJ3MgcHJveHlCdWlsZGVyIGR1cmluZyB0aGUgZXhlY3V0aW9uIG9mIGEgY2xvc3VyZS48YnI+DQorICAgICAqIFRoaXMgaXMgdXNlZnVsIHRvIHRlbXBvcmFyeSBjaGFuZ2UgdGhlIGJ1aWxkaW5nIGNvbnRleHQgdG8gYW5vdGhlciBidWlsZGVyDQorICAgICAqIHdpdGhvdXQgdGhlIG5lZWQgZm9yIGEgY29udHJpdmVkIHNldHVwLiBJdCB3aWxsIGFsc28gdGFrZSBjYXJlIG9mIHJlc3RvcmluZw0KKyAgICAgKiB0aGUgcHJldmlvdXMgcHJveHlCdWlsZGVyIHdoZW4gdGhlIGV4ZWN1dGlvbiBmaW5pc2hlcywgZXZlbiBpZiBhbiBleGNlcHRpb24NCisgICAgICogd2FzIHRocm93biBmcm9tIGluc2lkZSB0aGUgY2xvc3VyZS4gQWRkaXRpb25hbGx5IGl0IHdpbGwgdXNlIHRoZSBjbG9zdXJlJ3MNCisgICAgICogcmVzdWx0IGFzIHRoZSB2YWx1ZSBmb3IgdGhlIG5vZGUgaWRlbnRpZmllZCBieSAnbmFtZScgYW5kIGFzc2lnbiBhbnkgYXR0cmlidXRlcw0KKyAgICAgKiB0aGF0IG1pZ2h0IGhhdmUgYmVlbiBzZXQuDQorICAgICAqDQorICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzIGFkZGl0aW9uYWwgcHJvcGVydGllcyBmb3IgdGhlIG5vZGUgb24gdGhlIHBhcmVudCBidWlsZGVyLg0KKyAgICAgKiBAcGFyYW0gYnVpbGRlciB0aGUgdGVtcG9yYXJ5IGJ1aWxkZXIgdG8gc3dpdGNoIHRvIGFzIHByb3h5QnVpbGRlci4NCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5vZGUgdG8gYnVpbGQgb24gdGhlICdwYXJlbnQnIGJ1aWxkZXIuDQorICAgICAqIEBwYXJhbSBjbG9zdXJlIHRoZSBjbG9zdXJlIHRvIGJlIGV4ZWN1dGVkIHVuZGVyIHRoZSB0ZW1wb3JhcnkgYnVpbGRlci4NCisgICAgICoNCisgICAgICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uIC0gYW55IGV4Y2VwdGlvbiB0aGUgY2xvc3VyZSBtaWdodCBoYXZlIHRocm93biBkdXJpbmcNCisgICAgICogZXhlY3V0aW9uLg0KKyAgICAgKiBAcmV0dXJuIGEgbm9kZSB0aGF0IHJlc3BvbmRzIHRvIHZhbHVlIG9mIG5hbWUgd2l0aCB0aGUgY2xvc3VyZSdzIHJlc3VsdCBhcyBpdHMNCisgICAgICogdmFsdWUuDQorICAgICAqLw0KKyAgICBwdWJsaWMgT2JqZWN0IHdpdGhCdWlsZGVyKCBNYXAgYXR0cmlidXRlcywgRmFjdG9yeUJ1aWxkZXJTdXBwb3J0IGJ1aWxkZXIsIFN0cmluZyBuYW1lLCBDbG9zdXJlIGNsb3N1cmUgKSB7DQorICAgICAgIGlmKCBuYW1lID09IG51bGwgKSB7DQorICAgICAgICAgIHJldHVybiBudWxsOw0KKyAgICAgICB9DQorICAgICAgIE9iamVjdCByZXN1bHQgPSBwcm94eUJ1aWxkZXIud2l0aEJ1aWxkZXIoIGJ1aWxkZXIsIGNsb3N1cmUgKTsNCisgICAgICAgcmV0dXJuIHByb3h5QnVpbGRlci5pbnZva2VNZXRob2QoIG5hbWUsIG5ldyBPYmplY3RbXXsgYXR0cmlidXRlcywgcmVzdWx0IH0pOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIGFkZERpc3Bvc2FsQ2xvc3VyZShDbG9zdXJlIGNsb3N1cmUpIHsNCisgICAgICAgIGRpc3Bvc2FsQ2xvc3VyZXMuYWRkKGNsb3N1cmUpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7DQorICAgICAgICBmb3IgKGludCBpID0gZGlzcG9zYWxDbG9zdXJlcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgew0KKyAgICAgICAgICAgICgoQ2xvc3VyZSlkaXNwb3NhbENsb3N1cmVzLmdldChpKSkuY2FsbCgpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KKw0KK2NsYXNzIEZhY3RvcnlJbnRlcmNlcHRvck1ldGFDbGFzcyBleHRlbmRzIERlbGVnYXRpbmdNZXRhQ2xhc3Mgew0KKw0KKyAgICBGYWN0b3J5QnVpbGRlclN1cHBvcnQgZmFjdG9yeTsNCisNCisgICAgcHVibGljIEZhY3RvcnlJbnRlcmNlcHRvck1ldGFDbGFzcyhNZXRhQ2xhc3MgZGVsZWdhdGUsIEZhY3RvcnlCdWlsZGVyU3VwcG9ydCBmYWN0b3J5KSB7DQorICAgICAgICBzdXBlcihkZWxlZ2F0ZSk7DQorICAgICAgICB0aGlzLmZhY3RvcnkgPSBmYWN0b3J5Ow0KKyAgICB9DQorDQorICAgIHB1YmxpYyBPYmplY3QgaW52b2tlTWV0aG9kKE9iamVjdCBvYmplY3QsIFN0cmluZyBtZXRob2ROYW1lLCBPYmplY3QgYXJndW1lbnRzKSB7DQorICAgICAgICB0cnkgew0KKyAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5pbnZva2VNZXRob2Qob2JqZWN0LCBtZXRob2ROYW1lLCBhcmd1bWVudHMpOw0KKyAgICAgICAgfSBjYXRjaCAoTWlzc2luZ01ldGhvZEV4Y2VwdGlvbiBtbWUpIHsNCisgICAgICAgICAgICAvLyBhdHRlbXB0IGZhY3RvcnkgcmVzb2x1dGlvbg0KKyAgICAgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgICAgIGlmIChmYWN0b3J5LmdldE1ldGFDbGFzcygpLnJlc3BvbmRzVG8oZmFjdG9yeSwgbWV0aG9kTmFtZSkuaXNFbXB0eSgpKSB7DQorICAgICAgICAgICAgICAgICAgICAvLyBkaXNwYXRjaCB0byBmZWN0b3JpZXMgaWYgaXQgaXMgbm90IGEgbGl0ZXJhbCBtZXRob2QNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWN0b3J5Lmludm9rZU1ldGhvZChtZXRob2ROYW1lLCBhcmd1bWVudHMpOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEludm9rZXJIZWxwZXIuaW52b2tlTWV0aG9kKGZhY3RvcnksIG1ldGhvZE5hbWUsIGFyZ3VtZW50cyk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9IGNhdGNoIChNaXNzaW5nTWV0aG9kRXhjZXB0aW9uIG1tZTIpIHsNCisgICAgICAgICAgICAgICAgLy8gdGhyb3cgb3JpZ2luYWwNCisgICAgICAgICAgICAgICAgLy8gc2hvdWxkIHdlIGNoYWluIGluIG1tZTIgc29tZWhvdz8NCisgICAgICAgICAgICAgICAgdGhyb3cgbW1lOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgT2JqZWN0IGludm9rZU1ldGhvZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbWV0aG9kTmFtZSwgT2JqZWN0W10gYXJndW1lbnRzKSB7DQorICAgICAgICB0cnkgew0KKyAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5pbnZva2VNZXRob2Qob2JqZWN0LCBtZXRob2ROYW1lLCBhcmd1bWVudHMpOw0KKyAgICAgICAgfSBjYXRjaCAoTWlzc2luZ01ldGhvZEV4Y2VwdGlvbiBtbWUpIHsNCisgICAgICAgICAgICAvLyBhdHRlbXB0IGZhY3RvcnkgcmVzb2x1dGlvbg0KKyAgICAgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgICAgIGlmIChmYWN0b3J5LmdldE1ldGFDbGFzcygpLnJlc3BvbmRzVG8oZmFjdG9yeSwgbWV0aG9kTmFtZSkuaXNFbXB0eSgpKSB7DQorICAgICAgICAgICAgICAgICAgICAvLyBkaXNwYXRjaCB0byBmZWN0b3JpZXMgaWYgaXQgaXMgbm90IGEgbGl0ZXJhbCBtZXRob2QNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWN0b3J5Lmludm9rZU1ldGhvZChtZXRob2ROYW1lLCBhcmd1bWVudHMpOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEludm9rZXJIZWxwZXIuaW52b2tlTWV0aG9kKGZhY3RvcnksIG1ldGhvZE5hbWUsIGFyZ3VtZW50cyk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9IGNhdGNoIChNaXNzaW5nTWV0aG9kRXhjZXB0aW9uIG1tZTIpIHsNCisgICAgICAgICAgICAgICAgLy8gdGhyb3cgb3JpZ2luYWwNCisgICAgICAgICAgICAgICAgLy8gc2hvdWxkIHdlIGNoYWluIGluIG1tZTIgc29tZWhvdz8NCisgICAgICAgICAgICAgICAgdGhyb3cgbW1lOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvRmlsZU5hbWVCeVJlZ2V4RmluZGVyLmdyb292eSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdXRpbC9GaWxlTmFtZUJ5UmVnZXhGaW5kZXIuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNzA0MjYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvRmlsZU5hbWVCeVJlZ2V4RmluZGVyLmdyb292eQpAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBncm9vdnkudXRpbAorCisvKioKKyAqIEZpbmQgZmlsZXMgYWNjb3JkaW5nIHRvIGEgYmFzZSBkaXJlY3RvcnkgYW5kIGFuIGluY2x1ZGVzIGFuZCBleGNsdWRlcyBwYXR0ZXJuLgorICogVGhlIGluY2x1ZGUgYW5kIGV4Y2x1ZGUgcGF0dGVybnMgY29uZm9ybSB0byByZWdleCBjb252ZW50aW9ucy4KKyAqCisgKiAgIEBhdXRob3IgRGllcmsgS29lbmlnCisgKiAgIEBhdXRob3IgUGF1bCBLaW5nCisgKi8KK2NsYXNzIEZpbGVOYW1lQnlSZWdleEZpbmRlciBpbXBsZW1lbnRzIElGaWxlTmFtZUZpbmRlcnsKKworICAgTGlzdCBnZXRGaWxlTmFtZXMoU3RyaW5nIGJhc2VkaXIsIFN0cmluZyBwYXR0ZXJuKXsKKyAgICAgICBnZXRGaWxlTmFtZXMoYmFzZWRpciwgcGF0dGVybiwgIiIpCisgICB9CisgICBMaXN0IGdldEZpbGVOYW1lcyhTdHJpbmcgYmFzZWRpciwgU3RyaW5nIHBhdHRlcm4sIFN0cmluZyBleGNsdWRlc1BhdHRlcm4peworICAgICAgZGVmIHJlc3VsdCA9IFtdCisgICAgICBuZXcgRmlsZShiYXNlZGlyKS5lYWNoRmlsZVJlY3Vyc2UgeworICAgICAgICAgIGlmIChpdC5wYXRoID1+IHBhdHRlcm4gJiYgKCFleGNsdWRlc1BhdHRlcm4gfHwgIShpdC5wYXRoID1+IGV4Y2x1ZGVzUGF0dGVybikpKSB7CisgICAgICAgICAgICAgIHJlc3VsdCA8PCBpdC5hYnNvbHV0ZVBhdGgKKyAgICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gcmVzdWx0CisgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvRmlsZU5hbWVGaW5kZXIuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91dGlsL0ZpbGVOYW1lRmluZGVyLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGYwZjQwCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91dGlsL0ZpbGVOYW1lRmluZGVyLmdyb292eQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBncm9vdnkudXRpbAorCisvKioKKyAqIEZpbmQgZmlsZXMgYWNjb3JkaW5nIHRvIGEgYmFzZSBkaXJlY3RvcnkgYW5kIGFuIGluY2x1ZGVzIGFuZCBleGNsdWRlcyBwYXR0ZXJuLgorICogVGhlIGluY2x1ZGUgYW5kIGV4Y2x1ZGUgcGF0dGVybnMgY29uZm9ybSB0byBBbnQncyBmaWxlc2V0IHBhdHRlcm4gY29udmVudGlvbnMuCisgKgorICogICBAYXV0aG9yIERpZXJrIEtvZW5pZworICogICBAYXV0aG9yIFBhdWwgS2luZworICovCitjbGFzcyBGaWxlTmFtZUZpbmRlciBpbXBsZW1lbnRzIElGaWxlTmFtZUZpbmRlciB7CisKKyAgICBMaXN0IGdldEZpbGVOYW1lcyhTdHJpbmcgYmFzZWRpciwgU3RyaW5nIHBhdHRlcm4pIHsKKyAgICAgICAgcmV0dXJuIGdldEZpbGVOYW1lcyhkaXI6IGJhc2VkaXIsIGluY2x1ZGVzOiBwYXR0ZXJuKQorICAgIH0KKworICAgIExpc3QgZ2V0RmlsZU5hbWVzKFN0cmluZyBiYXNlZGlyLCBTdHJpbmcgcGF0dGVybiwgU3RyaW5nIGV4Y2x1ZGVzUGF0dGVybikgeworICAgICAgICByZXR1cm4gZ2V0RmlsZU5hbWVzKGRpcjogYmFzZWRpciwgaW5jbHVkZXM6IHBhdHRlcm4sIGV4Y2x1ZGVzOiBleGNsdWRlc1BhdHRlcm4pCisgICAgfQorCisgICAgTGlzdCBnZXRGaWxlTmFtZXMoTWFwIGFyZ3MpIHsKKyAgICAgICAgZGVmIGFudCA9IG5ldyBBbnRCdWlsZGVyKCkKKyAgICAgICAgZGVmIHNjYW5uZXIgPSBhbnQuZmlsZVNjYW5uZXIgeworICAgICAgICAgICAgZmlsZXNldChhcmdzKQorICAgICAgICB9CisgICAgICAgIGRlZiBmbHMgPSBbXQorICAgICAgICBmb3IgKGYgaW4gc2Nhbm5lcikgeworICAgICAgICAgICAgZmxzIDw8IGYuZ2V0QWJzb2x1dGVQYXRoKCkKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmxzCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdXRpbC9Hcm9vdnlDb2xsZWN0aW9ucy5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91dGlsL0dyb292eUNvbGxlY3Rpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg0Nzg5NAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdXRpbC9Hcm9vdnlDb2xsZWN0aW9ucy5qYXZhCkBAIC0wLDAgKzEsMTk2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgZ3Jvb3Z5LnV0aWw7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUudHlwZWhhbmRsaW5nLkRlZmF1bHRUeXBlVHJhbnNmb3JtYXRpb247CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLlNjcmlwdEJ5dGVjb2RlQWRhcHRlcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuRGVmYXVsdEdyb292eU1ldGhvZHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworLyoqCisgKiBBIENvbGxlY3Rpb25zIHV0aWxpdHkgY2xhc3MKKyAqCisgKiBAYXV0aG9yIFBhdWwgS2luZworICovCitwdWJsaWMgY2xhc3MgR3Jvb3Z5Q29sbGVjdGlvbnMgeworICAgIC8qKgorICAgICAqIEZpbmRzIGFsbCBjb21iaW5hdGlvbnMgb2YgaXRlbXMgZnJvbSBhbiBhcnJheSBvZiBsaXN0cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0cyBhbiBhcnJheSBvZiBsaXN0cworICAgICAqIEByZXR1cm4gYSBMaXN0IG9mIHRoZSBjb21iaW5hdGlvbnMgZm91bmQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3QgY29tYmluYXRpb25zKE9iamVjdFtdIGxpc3RzKSB7CisgICAgICAgIHJldHVybiBjb21iaW5hdGlvbnMoQXJyYXlzLmFzTGlzdChsaXN0cykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmRzIGFsbCBjb21iaW5hdGlvbnMgb2YgaXRlbXMgZnJvbSBhIGNvbGxlY3Rpb24gb2YgbGlzdHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdHMgYSBDb2xsZWN0aW9uIG9mIGxpc3RzCisgICAgICogQHJldHVybiBhIExpc3Qgb2YgdGhlIGNvbWJpbmF0aW9ucyBmb3VuZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBjb21iaW5hdGlvbnMoQ29sbGVjdGlvbiBsaXN0cykgeworICAgICAgICBMaXN0IGNvbWJpbmF0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBvdXRlciA9IGxpc3RzLml0ZXJhdG9yKCk7IG91dGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIE9iamVjdCBjYW5kaWRhdGVMaXN0ID0gb3V0ZXIubmV4dCgpOworICAgICAgICAgICAgTGlzdCBsaXN0ID0gKExpc3QpIERlZmF1bHRUeXBlVHJhbnNmb3JtYXRpb24uY2FzdFRvVHlwZShjYW5kaWRhdGVMaXN0LCBMaXN0LmNsYXNzKTsKKyAgICAgICAgICAgIGlmIChjb21iaW5hdGlvbnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIExpc3QgbCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgbC5hZGQobGlzdC5nZXQoaSkpOworICAgICAgICAgICAgICAgICAgICBjb21iaW5hdGlvbnMuYWRkKGwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTGlzdCBzYXZlZENvbWJpbmF0aW9ucyA9IG5ldyBBcnJheUxpc3QoY29tYmluYXRpb25zKTsKKyAgICAgICAgICAgICAgICBMaXN0IG5ld0NvbWJpbmF0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGlubmVyID0gbGlzdC5pdGVyYXRvcigpOyBpbm5lci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGlubmVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBjb21ib3MgPSBzYXZlZENvbWJpbmF0aW9ucy5pdGVyYXRvcigpOyBjb21ib3MuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgICAgICAgICAgTGlzdCBvbGRsaXN0ID0gbmV3IEFycmF5TGlzdCgoTGlzdCkgY29tYm9zLm5leHQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBvbGRsaXN0LmFkZCh2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb21iaW5hdGlvbnMuYWRkKG9sZGxpc3QpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbWJpbmF0aW9ucyA9IG5ld0NvbWJpbmF0aW9uczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29tYmluYXRpb25zOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyYW5zcG9zZXMgYW4gYXJyYXkgb2YgbGlzdHMuIFNvLAorICAgICAqIHRyYW5zcG9zZShbWydhJywgJ2InXSwgWzEsIDJdXSBhcyBPYmplY3RbXSkgPT0gW1snYScsIDFdLCBbJ2InLCAyXV0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdHMgYW4gYXJyYXkgb2YgbGlzdHMKKyAgICAgKiBAcmV0dXJuIGEgTGlzdCBvZiB0aGUgdHJhbnNwb3NlZCBsaXN0cworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlzdCB0cmFuc3Bvc2UoT2JqZWN0W10gbGlzdHMpIHsKKyAgICAgICAgcmV0dXJuIHRyYW5zcG9zZShBcnJheXMuYXNMaXN0KGxpc3RzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJhbnNwb3NlcyBhIGNvbGxlY3Rpb24gb2YgbGlzdHMuIFNvLAorICAgICAqIHRyYW5zcG9zZShbWydhJywgJ2InXSwgWzEsIDJdXSkgPT0gW1snYScsIDFdLCBbJ2InLCAyXV0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdHMgYSBDb2xsZWN0aW9uIG9mIGxpc3RzCisgICAgICogQHJldHVybiBhIExpc3Qgb2YgdGhlIHRyYW5zcG9zZWQgbGlzdHMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3QgdHJhbnNwb3NlKENvbGxlY3Rpb24gbGlzdHMpIHsKKyAgICAgICAgTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGlmIChsaXN0cy5pc0VtcHR5KCkgfHwgbGlzdHMuc2l6ZSgpID09IDApIHJldHVybiByZXN1bHQ7CisgICAgICAgIGludCBtaW5TaXplID0gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgIGZvciAoSXRlcmF0b3Igb3V0ZXIgPSBsaXN0cy5pdGVyYXRvcigpOyBvdXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBPYmplY3QgY2FuZGlkYXRlTGlzdCA9IG91dGVyLm5leHQoKTsKKyAgICAgICAgICAgIExpc3QgbGlzdCA9IChMaXN0KSBEZWZhdWx0VHlwZVRyYW5zZm9ybWF0aW9uLmNhc3RUb1R5cGUoY2FuZGlkYXRlTGlzdCwgTGlzdC5jbGFzcyk7CisgICAgICAgICAgICBpZiAobGlzdC5zaXplKCkgPCBtaW5TaXplKSBtaW5TaXplID0gbGlzdC5zaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1pblNpemUgPT0gMCkgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtaW5TaXplOyBpKyspIHsKKyAgICAgICAgICAgIHJlc3VsdC5hZGQobmV3IEFycmF5TGlzdCgpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKEl0ZXJhdG9yIG91dGVyID0gbGlzdHMuaXRlcmF0b3IoKTsgb3V0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgT2JqZWN0IGNhbmRpZGF0ZUxpc3QgPSBvdXRlci5uZXh0KCk7CisgICAgICAgICAgICBMaXN0IGxpc3QgPSAoTGlzdCkgRGVmYXVsdFR5cGVUcmFuc2Zvcm1hdGlvbi5jYXN0VG9UeXBlKGNhbmRpZGF0ZUxpc3QsIExpc3QuY2xhc3MpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtaW5TaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICBMaXN0IHJlc3VsdExpc3QgPSAoTGlzdCkgcmVzdWx0LmdldChpKTsKKyAgICAgICAgICAgICAgICByZXN1bHRMaXN0LmFkZChsaXN0LmdldChpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZWxlY3RzIHRoZSBtaW5pbXVtIHZhbHVlIGZvdW5kIGluIGFuIGFycmF5IG9mIGl0ZW1zLCBzbworICAgICAqIG1pbihbMiwgNCwgNl0gYXMgT2JqZWN0W10pID09IDIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaXRlbXMgYW4gYXJyYXkgb2YgaXRlbXMKKyAgICAgKiBAcmV0dXJuIHRoZSBtaW5pbXVtIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgbWluKE9iamVjdFtdIGl0ZW1zKSB7CisgICAgICAgIHJldHVybiBtaW4oQXJyYXlzLmFzTGlzdChpdGVtcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbGVjdHMgdGhlIG1pbmltdW0gdmFsdWUgZm91bmQgaW4gYSBjb2xsZWN0aW9uIG9mIGl0ZW1zLgorICAgICAqCisgICAgICogQHBhcmFtIGl0ZW1zIGEgQ29sbGVjdGlvbgorICAgICAqIEByZXR1cm4gdGhlIG1pbmltdW0gdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBtaW4oQ29sbGVjdGlvbiBpdGVtcykgeworICAgICAgICBPYmplY3QgYW5zd2VyID0gbnVsbDsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gaXRlbXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGFuc3dlciA9PSBudWxsIHx8IFNjcmlwdEJ5dGVjb2RlQWRhcHRlci5jb21wYXJlTGVzc1RoYW4odmFsdWUsIGFuc3dlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgYW5zd2VyID0gdmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBhbnN3ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VsZWN0cyB0aGUgbWF4aW11bSB2YWx1ZSBmb3VuZCBpbiBhbiBhcnJheSBvZiBpdGVtcywgc28KKyAgICAgKiBtaW4oWzIsIDQsIDZdIGFzIE9iamVjdFtdKSA9PSA2LgorICAgICAqCisgICAgICogQHBhcmFtIGl0ZW1zIGFuIGFycmF5IG9mIGl0ZW1zCisgICAgICogQHJldHVybiB0aGUgbWF4aW11bSB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IG1heChPYmplY3RbXSBpdGVtcykgeworICAgICAgICByZXR1cm4gbWF4KEFycmF5cy5hc0xpc3QoaXRlbXMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZWxlY3RzIHRoZSBtYXhpbXVtIHZhbHVlIGZvdW5kIGluIGEgY29sbGVjdGlvbgorICAgICAqCisgICAgICogQHBhcmFtIGl0ZW1zIGEgQ29sbGVjdGlvbgorICAgICAqIEByZXR1cm4gdGhlIG1heGltdW0gdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBtYXgoQ29sbGVjdGlvbiBpdGVtcykgeworICAgICAgICBPYmplY3QgYW5zd2VyID0gbnVsbDsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gaXRlbXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGFuc3dlciA9PSBudWxsIHx8IFNjcmlwdEJ5dGVjb2RlQWRhcHRlci5jb21wYXJlR3JlYXRlclRoYW4odmFsdWUsIGFuc3dlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgYW5zd2VyID0gdmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBhbnN3ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3VtcyBhbGwgdGhlIGl0ZW1zIGZyb20gYW4gYXJyYXkgb2YgaXRlbXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaXRlbXMgYW4gYXJyYXkgb2YgaXRlbXMKKyAgICAgKiBAcmV0dXJuIHRoZSBzdW0gb2YgdGhlIGl0ZW1zCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3Qgc3VtKE9iamVjdFtdIGl0ZW1zKSB7CisgICAgICAgIHJldHVybiBEZWZhdWx0R3Jvb3Z5TWV0aG9kcy5zdW0oQXJyYXlzLmFzTGlzdChpdGVtcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN1bXMgYWxsIHRoZSBpdGVtcyBmcm9tIGEgY29sbGVjdGlvbiBvZiBpdGVtcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpdGVtcyBhIGNvbGxlY3Rpb24gb2YgaXRlbXMKKyAgICAgKiBAcmV0dXJuIHRoZSBzdW0gb2YgdGhlIGl0ZW1zCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3Qgc3VtKENvbGxlY3Rpb24gaXRlbXMpIHsKKyAgICAgICAgcmV0dXJuIERlZmF1bHRHcm9vdnlNZXRob2RzLnN1bShpdGVtcyk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvR3Jvb3Z5TG9nLmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvR3Jvb3Z5TG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY1YzkzYwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdXRpbC9Hcm9vdnlMb2cuamF2YQpAQCAtMCwwICsxLDgyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgZ3Jvb3Z5LnV0aWw7CisKK2ltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlPYmplY3RTdXBwb3J0OworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLkRlZmF1bHRHcm9vdnlNZXRob2RzOworCisvLworLy8gRklYTUU6IFRoaXMgY2xhc3MgcmVhbGx5IGlzbid0IGFsbCB0aGF0IHVzZWZ1bC4gIEl0IHdvdWxkIGJlICptdWNoKiBiZXR0ZXIgaWYgdGhlcmUKKy8vICAgICAgICB3YXMgYSBzaW1wbGUgbG9nIEFQSSBpbiBncm9vdnkgdG8gZHluYW1pY2FsbHkgc3dpdGNoIHRvIHRoZSBsb2dnaW5nIGZhY2FkZSB0aGF0CisvLyAgICAgICAgaXMgYWN0dWFsbHkgaW5zdGFsbGVkLgorLy8KKworLyoqCisgKiBSZXByZXNlbnRzIGFuIGFyYml0cmFyeSBsb2dnaW5nIHNlcnZpY2UuIEJ5IGRlZmF1bHQgdGhpcyBvdXRwdXRzIHRvCisgKiBTeXN0ZW0ub3V0IHRob3VnaCBkZXJpdmF0aW9ucyBvZiB0aGlzIGNsYXNzIGNvdWxkIGxvZyB0byBKYWthcnRhIENvbW1vbnMgTG9nZ2luZworICogb3IgbG9nNGogb3IgSkRLIDEuNSBsb2dnaW5nIGV0YworICogCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgR3Jvb3Z5TG9nIGV4dGVuZHMgR3Jvb3Z5T2JqZWN0U3VwcG9ydCB7CisKKyAgICBTdHJpbmcgcHJlZml4OworCisgICAgLyoqIAorICAgICAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBuZXcgaW5zdGFuY2VzIAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgR3Jvb3Z5TG9nIG5ld0luc3RhbmNlKENsYXNzIGFDbGFzcykgeworICAgICAgICByZXR1cm4gbmV3IEdyb292eUxvZyhhQ2xhc3MpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgR3Jvb3Z5TG9nKCkgeworICAgICAgICB0aGlzKCIiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgR3Jvb3Z5TG9nKENsYXNzIHR5cGUpIHsKKyAgICAgICAgdGhpcyh0eXBlLmdldE5hbWUoKSk7CisgICAgfQorCisgICAgcHVibGljIEdyb292eUxvZyhPYmplY3Qgb2JqKSB7CisgICAgICAgIHRoaXMob2JqLmdldENsYXNzKCkpOworICAgIH0KKworICAgIHB1YmxpYyBHcm9vdnlMb2coU3RyaW5nIHByZWZpeCkgeworICAgICAgICAvLworICAgICAgICAvLyBGSVhNRTogVGhpcyBraW5kYSBzdWNrcyBhcyBhIGRlZmF1bHQuLi4gc2hvdWxkbid0IHRhY2sgb24gYW55IFsgb3IgOiBtdWNrCisgICAgICAgIC8vCisKKyAgICAgICAgdGhpcy5wcmVmaXggPSAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCgpID4gMCkgPyAiWyIgKyBwcmVmaXggKyAiOiIgOiAiWyI7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBpbnZva2VNZXRob2QoU3RyaW5nIG5hbWUsIE9iamVjdCBhcmdzKSB7CisgICAgICAgIGlmIChhcmdzICE9IG51bGwgJiYgYXJncy5nZXRDbGFzcygpLmlzQXJyYXkoKSkgeworICAgICAgICAgICAgYXJncyA9IERlZmF1bHRHcm9vdnlNZXRob2RzLmpvaW4oKE9iamVjdFtdKWFyZ3MsICIsIik7ICAgIAorICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRklYTUU6IFRoaXMga2luZGEgc3Vja3MgYXMgYW4gb3V0cHV0IGZvcm1hdCwgc2hvdWxkIHByb2JhYmx5IHVjYXNlIG5hbWUgYW5kIHRoZW4KKyAgICAgICAgLy8gICAgICAgIHdhcnAgcHJlZml4IGluIFtdIGFuZCB0aGVuIG91dHB1dCB0aGUgYXJncy4gIEJhc2ljYWxseSB3aGF0IHRoZSBTaW1wbGVMb2cKKyAgICAgICAgLy8gICAgICAgIGRvZXMgaW4gSkNMLgorICAgICAgICAvLworICAgICAgICAKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHByZWZpeCArIG5hbWUgKyAiXSAiICsgYXJncyk7CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91dGlsL0dyb292eU1CZWFuLmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvR3Jvb3Z5TUJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGU2MGE0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91dGlsL0dyb292eU1CZWFuLmphdmEKQEAgLTAsMCArMSwzOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBncm9vdnkudXRpbDsKKworaW1wb3J0IGdyb292eS5sYW5nLkdyb292eU9iamVjdFN1cHBvcnQ7CitpbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuKjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC4qOworCisvKioKKyAqIEEgR3Jvb3Z5T2JqZWN0IGZhY2FkZSBmb3IgYW4gdW5kZXJseWluZyBNQmVhbiB3aGljaCBhY3RzIGxpa2UgYSBub3JtYWwKKyAqIGdyb292eSBvYmplY3QgYnV0IHdoaWNoIGlzIGFjdHVhbGx5IGltcGxlbWVudGVkIHZpYQorICogYW4gdW5kZXJseWluZyBKTVggTUJlYW4uCisgKiBQcm9wZXJ0aWVzIGFuZCBub3JtYWwgbWV0aG9kIGludm9jYXRpb25zCisgKiBkZWxlZ2F0ZSB0byB0aGUgTUJlYW5TZXJ2ZXIgdG8gdGhlIGFjdHVhbCBNQmVhbi4KKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQGF1dGhvciBTdGV2ZSBCdXR0b24KKyAqIEBhdXRob3IgUGF1bCBLaW5nCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBHcm9vdnlNQmVhbiBleHRlbmRzIEdyb292eU9iamVjdFN1cHBvcnQgeworICAgIHByaXZhdGUgZmluYWwgTUJlYW5TZXJ2ZXJDb25uZWN0aW9uIHNlcnZlcjsKKyAgICBwcml2YXRlIGZpbmFsIE9iamVjdE5hbWUgbmFtZTsKKyAgICBwcml2YXRlIE1CZWFuSW5mbyBiZWFuSW5mbzsKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaWdub3JlRXJyb3JzOworICAgIHByaXZhdGUgZmluYWwgTWFwIG9wZXJhdGlvbnMgPSBuZXcgSGFzaE1hcCgpOworCisgICAgcHVibGljIEdyb292eU1CZWFuKE1CZWFuU2VydmVyQ29ubmVjdGlvbiBzZXJ2ZXIsIFN0cmluZyBvYmplY3ROYW1lKSB0aHJvd3MgSk1FeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcyhzZXJ2ZXIsIG9iamVjdE5hbWUsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgR3Jvb3Z5TUJlYW4oTUJlYW5TZXJ2ZXJDb25uZWN0aW9uIHNlcnZlciwgU3RyaW5nIG9iamVjdE5hbWUsIGJvb2xlYW4gaWdub3JlRXJyb3JzKSB0aHJvd3MgSk1FeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcyhzZXJ2ZXIsIG5ldyBPYmplY3ROYW1lKG9iamVjdE5hbWUpLCBpZ25vcmVFcnJvcnMpOworICAgIH0KKworICAgIHB1YmxpYyBHcm9vdnlNQmVhbihNQmVhblNlcnZlckNvbm5lY3Rpb24gc2VydmVyLCBPYmplY3ROYW1lIG5hbWUpIHRocm93cyBKTUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICB0aGlzKHNlcnZlciwgbmFtZSwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBHcm9vdnlNQmVhbihNQmVhblNlcnZlckNvbm5lY3Rpb24gc2VydmVyLCBPYmplY3ROYW1lIG5hbWUsIGJvb2xlYW4gaWdub3JlRXJyb3JzKSB0aHJvd3MgSk1FeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuaWdub3JlRXJyb3JzID0gaWdub3JlRXJyb3JzOworICAgICAgICB0aGlzLmJlYW5JbmZvID0gc2VydmVyLmdldE1CZWFuSW5mbyhuYW1lKTsKKworICAgICAgICBNQmVhbk9wZXJhdGlvbkluZm9bXSBvcGVyYXRpb25JbmZvcyA9IGJlYW5JbmZvLmdldE9wZXJhdGlvbnMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvcGVyYXRpb25JbmZvcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgTUJlYW5PcGVyYXRpb25JbmZvIGluZm8gPSBvcGVyYXRpb25JbmZvc1tpXTsKKyAgICAgICAgICAgIFN0cmluZyBzaWduYXR1cmVbXSA9IGNyZWF0ZVNpZ25hdHVyZShpbmZvKTsKKworICAgICAgICAgICAgLy8gSW5jbHVkZSBhIHNpbXBsZSBmaXggaGVyZSB0byBzdXBwb3J0IG92ZXJsb2FkZWQgb3BlcmF0aW9ucyBvbiB0aGUgTUJlYW4uCisgICAgICAgICAgICAvLyBDb25zdHJ1Y3QgYSBzaW1wbGUga2V5IGZvciBhbiBvcGVyYXRpb24gYnkgYWRkaW5nIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycyBpdCB1c2VzCisgICAgICAgICAgICBTdHJpbmcgb3BlcmF0aW9uS2V5ID0gY3JlYXRlT3BlcmF0aW9uS2V5KGluZm8uZ2V0TmFtZSgpLCBzaWduYXR1cmUubGVuZ3RoKTsKKyAgICAgICAgICAgIG9wZXJhdGlvbnMucHV0KG9wZXJhdGlvbktleSwgc2lnbmF0dXJlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBNQmVhblNlcnZlckNvbm5lY3Rpb24gc2VydmVyKCkgeworICAgICAgICByZXR1cm4gc2VydmVyOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3ROYW1lIG5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBNQmVhbkluZm8gaW5mbygpIHsKKyAgICAgICAgcmV0dXJuIGJlYW5JbmZvOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gc2VydmVyLmdldEF0dHJpYnV0ZShuYW1lLCBwcm9wZXJ0eSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKE1CZWFuRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93RXhjZXB0aW9uV2l0aFRhcmdldCgiQ291bGQgbm90IGFjY2VzcyBwcm9wZXJ0eTogIiArIHByb3BlcnR5ICsgIi4gUmVhc29uOiAiLCBlKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGlmICghaWdub3JlRXJyb3JzKQorICAgICAgICAgICAgdGhyb3dFeGNlcHRpb24oIkNvdWxkIG5vdCBhY2Nlc3MgcHJvcGVydHk6ICIgKyBwcm9wZXJ0eSArICIuIFJlYXNvbjogIiwgZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNlcnZlci5zZXRBdHRyaWJ1dGUobmFtZSwgbmV3IEF0dHJpYnV0ZShwcm9wZXJ0eSwgdmFsdWUpKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoTUJlYW5FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3dFeGNlcHRpb25XaXRoVGFyZ2V0KCJDb3VsZCBub3Qgc2V0IHByb3BlcnR5OiAiICsgcHJvcGVydHkgKyAiLiBSZWFzb246ICIsIGUpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3dFeGNlcHRpb24oIkNvdWxkIG5vdCBzZXQgcHJvcGVydHk6ICIgKyBwcm9wZXJ0eSArICIuIFJlYXNvbjogIiwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGludm9rZU1ldGhvZChTdHJpbmcgbWV0aG9kLCBPYmplY3QgYXJndW1lbnRzKSB7CisgICAgICAgIC8vIE1vdmVkIHRoaXMgb3V0c2lkZSB0aGUgdHJ5IGJsb2NrIHNvIHdlIGNhbiBvYnRhaW4gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzCisgICAgICAgIC8vIHNwZWNpZmllZCBpbiB0aGUgYXJndW1lbnRzIGFycmF5LCB3aGljaCBpcyBuZWVkZWQgdG8gZmluZCB0aGUgY29ycmVjdCBtZXRob2QuCisgICAgICAgIE9iamVjdFtdIGFyZ0FycmF5ID0gbnVsbDsKKyAgICAgICAgaWYgKGFyZ3VtZW50cyBpbnN0YW5jZW9mIE9iamVjdFtdKSB7CisgICAgICAgICAgICBhcmdBcnJheSA9IChPYmplY3RbXSkgYXJndW1lbnRzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXJnQXJyYXkgPSBuZXcgT2JqZWN0W117YXJndW1lbnRzfTsKKyAgICAgICAgfQorICAgICAgICAvLyBMb2NhdGUgdGhlIHNwZWNpZmljIG1ldGhvZCBiYXNlZCBvbiB0aGUgbmFtZSBhbmQgbnVtYmVyIG9mIHBhcmFtZXRlcnMKKyAgICAgICAgU3RyaW5nIG9wZXJhdGlvbktleSA9IGNyZWF0ZU9wZXJhdGlvbktleShtZXRob2QsIGFyZ0FycmF5Lmxlbmd0aCk7CisgICAgICAgIFN0cmluZ1tdIHNpZ25hdHVyZSA9IChTdHJpbmdbXSkgb3BlcmF0aW9ucy5nZXQob3BlcmF0aW9uS2V5KTsKKworICAgICAgICBpZiAoc2lnbmF0dXJlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZlci5pbnZva2UobmFtZSwgbWV0aG9kLCBhcmdBcnJheSwgc2lnbmF0dXJlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChNQmVhbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3dFeGNlcHRpb25XaXRoVGFyZ2V0KCJDb3VsZCBub3QgaW52b2tlIG1ldGhvZDogIiArIG1ldGhvZCArICIuIFJlYXNvbjogIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvd0V4Y2VwdGlvbigiQ291bGQgbm90IGludm9rZSBtZXRob2Q6ICIgKyBtZXRob2QgKyAiLiBSZWFzb246ICIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuaW52b2tlTWV0aG9kKG1ldGhvZCwgYXJndW1lbnRzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBTdHJpbmdbXSBjcmVhdGVTaWduYXR1cmUoTUJlYW5PcGVyYXRpb25JbmZvIGluZm8pIHsKKyAgICAgICAgTUJlYW5QYXJhbWV0ZXJJbmZvW10gcGFyYW1zID0gaW5mby5nZXRTaWduYXR1cmUoKTsKKyAgICAgICAgU3RyaW5nW10gYW5zd2VyID0gbmV3IFN0cmluZ1twYXJhbXMubGVuZ3RoXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGFuc3dlcltpXSA9IHBhcmFtc1tpXS5nZXRUeXBlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFuc3dlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBzaW1wbGUga2V5IGJhc2VkIG9uIHRoZSBtZXRob2QgbmFtZSBhbmQgdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3BlcmF0aW9uIC0gdGhlIG1iZWFuIG9wZXJhdGlvbiBuYW1lCisgICAgICogQHBhcmFtIHBhcmFtcyAgICAtIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycyB0aGUgb3BlcmF0aW9uIHN1cHBvcnRzCisgICAgICogQHJldHVybiBzaW1wbGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgbWV0aG9kCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBjcmVhdGVPcGVyYXRpb25LZXkoU3RyaW5nIG9wZXJhdGlvbiwgaW50IHBhcmFtcykgeworICAgICAgICAvLyBUaGlzIGNvdWxkIGJlIGNoYW5nZWQgdG8gc3VwcG9ydCBzb21lIGhhc2ggb2YgdGhlIHBhcmFtZXRlciB0eXBlcywgZXRjLgorICAgICAgICByZXR1cm4gb3BlcmF0aW9uICsgIl8iICsgcGFyYW1zOworICAgIH0KKworICAgIC8qKgorICAgICAqIExpc3Qgb2YgdGhlIG5hbWVzIG9mIGVhY2ggb2YgdGhlIGF0dHJpYnV0ZXMgb24gdGhlIE1CZWFuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGxpc3Qgb2YgYXR0cmlidXRlIG5hbWVzCisgICAgICovCisgICAgcHVibGljIENvbGxlY3Rpb24gbGlzdEF0dHJpYnV0ZU5hbWVzKCkgeworICAgICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNQmVhbkF0dHJpYnV0ZUluZm9bXSBhdHRycyA9IGJlYW5JbmZvLmdldEF0dHJpYnV0ZXMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBNQmVhbkF0dHJpYnV0ZUluZm8gYXR0ciA9IGF0dHJzW2ldOworICAgICAgICAgICAgICAgIGxpc3QuYWRkKGF0dHIuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93RXhjZXB0aW9uKCJDb3VsZCBub3QgbGlzdCBhdHRyaWJ1dGUgbmFtZXMuIFJlYXNvbjogIiwgZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxpc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHZhbHVlcyBvZiBlYWNoIG9mIHRoZSBhdHRyaWJ1dGVzIG9uIHRoZSBNQmVhbgorICAgICAqCisgICAgICogQHJldHVybiBsaXN0IG9mIHZhbHVlcyBvZiBlYWNoIGF0dHJpYnV0ZQorICAgICAqLworICAgIHB1YmxpYyBMaXN0IGxpc3RBdHRyaWJ1dGVWYWx1ZXMoKSB7CisgICAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgQ29sbGVjdGlvbiBuYW1lcyA9IGxpc3RBdHRyaWJ1dGVOYW1lcygpOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbmFtZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIE9iamVjdCB2YWwgPSB0aGlzLmdldFByb3BlcnR5KG5hbWUpOworICAgICAgICAgICAgICAgIGlmICh2YWwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChuYW1lICsgIiA6ICIgKyB2YWwudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvd0V4Y2VwdGlvbigiQ291bGQgbm90IGxpc3QgYXR0cmlidXRlIHZhbHVlcy4gUmVhc29uOiAiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGlzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMaXN0IG9mIHN0cmluZyByZXByZXNlbnRhdGlvbnMgb2YgYWxsIG9mIHRoZSBhdHRyaWJ1dGVzIG9uIHRoZSBNQmVhbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbGlzdCBvZiBkZXNjcmlwdGlvbnMgb2YgZWFjaCBhdHRyaWJ1dGUgb24gdGhlIG1iZWFuCisgICAgICovCisgICAgcHVibGljIENvbGxlY3Rpb24gbGlzdEF0dHJpYnV0ZURlc2NyaXB0aW9ucygpIHsKKyAgICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgTUJlYW5BdHRyaWJ1dGVJbmZvW10gYXR0cnMgPSBiZWFuSW5mby5nZXRBdHRyaWJ1dGVzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgTUJlYW5BdHRyaWJ1dGVJbmZvIGF0dHIgPSBhdHRyc1tpXTsKKyAgICAgICAgICAgICAgICBsaXN0LmFkZChkZXNjcmliZUF0dHJpYnV0ZShhdHRyKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvd0V4Y2VwdGlvbigiQ291bGQgbm90IGxpc3QgYXR0cmlidXRlIGRlc2NyaXB0aW9ucy4gUmVhc29uOiAiLCBlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGlzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXNjcmlwdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZSBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIGF0dHIgLSB0aGUgYXR0cmlidXRlCisgICAgICogQHJldHVybiBTdHJpbmcgdGhlIGRlc2NyaXB0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBkZXNjcmliZUF0dHJpYnV0ZShNQmVhbkF0dHJpYnV0ZUluZm8gYXR0cikgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBidWYuYXBwZW5kKCIoIik7CisgICAgICAgIGlmIChhdHRyLmlzUmVhZGFibGUoKSkgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgiciIpOworICAgICAgICB9CisgICAgICAgIGlmIChhdHRyLmlzV3JpdGFibGUoKSkgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgidyIpOworICAgICAgICB9CisgICAgICAgIGJ1Zi5hcHBlbmQoIikgIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKGF0dHIuZ2V0VHlwZSgpKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoIiAiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoYXR0ci5nZXROYW1lKCkpOworICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVzY3JpcHRpb24gb2YgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lIC0gc3RyaW5naWZpZWQgbmFtZSBvZiB0aGUgYXR0cmlidXRlCisgICAgICogQHJldHVybiB0aGUgZGVzY3JpcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGRlc2NyaWJlQXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7CisgICAgICAgIFN0cmluZyByZXQgPSAiQXR0cmlidXRlIG5vdCBmb3VuZCI7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNQmVhbkF0dHJpYnV0ZUluZm9bXSBhdHRyaWJ1dGVzID0gYmVhbkluZm8uZ2V0QXR0cmlidXRlcygpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgTUJlYW5BdHRyaWJ1dGVJbmZvIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbaV07CisgICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZS5nZXROYW1lKCkuZXF1YWxzKGF0dHJpYnV0ZU5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXNjcmliZUF0dHJpYnV0ZShhdHRyaWJ1dGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93RXhjZXB0aW9uKCJDb3VsZCBub3QgZGVzY3JpYmUgYXR0cmlidXRlICciICsgYXR0cmlidXRlTmFtZSArICInLiBSZWFzb246ICIsIGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogTmFtZXMgb2YgYWxsIHRoZSBvcGVyYXRpb25zIGF2YWlsYWJsZSBvbiB0aGUgTUJlYW4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFsbCB0aGUgb3BlcmF0aW9ucyBvbiB0aGUgTUJlYW4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sbGVjdGlvbiBsaXN0T3BlcmF0aW9uTmFtZXMoKSB7CisgICAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE1CZWFuT3BlcmF0aW9uSW5mb1tdIG9wZXJhdGlvbnMgPSBiZWFuSW5mby5nZXRPcGVyYXRpb25zKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9wZXJhdGlvbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBNQmVhbk9wZXJhdGlvbkluZm8gb3BlcmF0aW9uID0gb3BlcmF0aW9uc1tpXTsKKyAgICAgICAgICAgICAgICBsaXN0LmFkZChvcGVyYXRpb24uZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93RXhjZXB0aW9uKCJDb3VsZCBub3QgbGlzdCBvcGVyYXRpb24gbmFtZXMuIFJlYXNvbjogIiwgZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxpc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVzY3JpcHRpb24gb2YgYWxsIG9mIHRoZSBvcGVyYXRpb25zIGF2YWlsYWJsZSBvbiB0aGUgTUJlYW4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGZ1bGwgZGVzY3JpcHRpb24gb2YgZWFjaCBvcGVyYXRpb24gb24gdGhlIE1CZWFuCisgICAgICovCisgICAgcHVibGljIENvbGxlY3Rpb24gbGlzdE9wZXJhdGlvbkRlc2NyaXB0aW9ucygpIHsKKyAgICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgTUJlYW5PcGVyYXRpb25JbmZvW10gb3BlcmF0aW9ucyA9IGJlYW5JbmZvLmdldE9wZXJhdGlvbnMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb3BlcmF0aW9ucy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIE1CZWFuT3BlcmF0aW9uSW5mbyBvcGVyYXRpb24gPSBvcGVyYXRpb25zW2ldOworICAgICAgICAgICAgICAgIGxpc3QuYWRkKGRlc2NyaWJlT3BlcmF0aW9uKG9wZXJhdGlvbikpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3dFeGNlcHRpb24oIkNvdWxkIG5vdCBsaXN0IG9wZXJhdGlvbiBkZXNjcmlwdGlvbnMuIFJlYXNvbjogIiwgZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxpc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgc3BlY2lmaWVkIG9wZXJhdGlvbi4gIFRoaXMgcmV0dXJucyBhIENvbGxlY3Rpb24gc2luY2UKKyAgICAgKiBvcGVyYXRpb25zIGNhbiBiZSBvdmVybG9hZGVkIGFuZCBvbmUgb3BlcmF0aW9uTmFtZSBjYW4gaGF2ZSBtdWx0aXBsZSBmb3Jtcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvcGVyYXRpb25OYW1lIHRoZSBuYW1lIG9mIHRoZSBvcGVyYXRpb24gdG8gZGVzY3JpYmUKKyAgICAgKiBAcmV0dXJuIENvbGxlY3Rpb24gb2Ygb3BlcmF0aW9uIGRlc2NyaXB0aW9uCisgICAgICovCisgICAgcHVibGljIExpc3QgZGVzY3JpYmVPcGVyYXRpb24oU3RyaW5nIG9wZXJhdGlvbk5hbWUpIHsKKyAgICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgTUJlYW5PcGVyYXRpb25JbmZvW10gb3BlcmF0aW9ucyA9IGJlYW5JbmZvLmdldE9wZXJhdGlvbnMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb3BlcmF0aW9ucy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIE1CZWFuT3BlcmF0aW9uSW5mbyBvcGVyYXRpb24gPSBvcGVyYXRpb25zW2ldOworICAgICAgICAgICAgICAgIGlmIChvcGVyYXRpb24uZ2V0TmFtZSgpLmVxdWFscyhvcGVyYXRpb25OYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChkZXNjcmliZU9wZXJhdGlvbihvcGVyYXRpb24pKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvd0V4Y2VwdGlvbigiQ291bGQgbm90IGRlc2NyaWJlIG9wZXJhdGlvbnMgbWF0Y2hpbmcgbmFtZSAnIiArIG9wZXJhdGlvbk5hbWUgKyAiJy4gUmVhc29uOiAiLCBlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGlzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXNjcmlwdGlvbiBvZiB0aGUgb3BlcmF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIG9wZXJhdGlvbiB0aGUgb3BlcmF0aW9uIHRvIGRlc2NyaWJlCisgICAgICogQHJldHVybiBwcmV0dHktcHJpbnRlZCBkZXNjcmlwdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZGVzY3JpYmVPcGVyYXRpb24oTUJlYW5PcGVyYXRpb25JbmZvIG9wZXJhdGlvbikgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBidWYuYXBwZW5kKG9wZXJhdGlvbi5nZXRSZXR1cm5UeXBlKCkpCisgICAgICAgICAgICAgICAgLmFwcGVuZCgiICIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChvcGVyYXRpb24uZ2V0TmFtZSgpKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoIigiKTsKKworICAgICAgICBNQmVhblBhcmFtZXRlckluZm9bXSBwYXJhbXMgPSBvcGVyYXRpb24uZ2V0U2lnbmF0dXJlKCk7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcGFyYW1zLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICBNQmVhblBhcmFtZXRlckluZm8gcGFyYW0gPSBwYXJhbXNbal07CisgICAgICAgICAgICBpZiAoaiAhPSAwKSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQocGFyYW0uZ2V0VHlwZSgpKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIgIikKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChwYXJhbS5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIGJ1Zi5hcHBlbmQoIikiKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBlbmQgdXNlciByZWFkYWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgdW5kZXJseWluZyBNQmVhbgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgdXNlciByZWFkYWJsZSBkZXNjcmlwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGJ1Zi5hcHBlbmQoIk1CZWFuIE5hbWU6IikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJcbiAgIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKG5hbWUuZ2V0Q2Fub25pY2FsTmFtZSgpKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoIlxuICAiKTsKKyAgICAgICAgaWYgKCFsaXN0QXR0cmlidXRlRGVzY3JpcHRpb25zKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJcbkF0dHJpYnV0ZXM6Iik7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdEF0dHJpYnV0ZURlc2NyaXB0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCJcbiAgIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoKFN0cmluZykgaXRlcmF0b3IubmV4dCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWxpc3RPcGVyYXRpb25EZXNjcmlwdGlvbnMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIlxuT3BlcmF0aW9uczoiKTsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0T3BlcmF0aW9uRGVzY3JpcHRpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIlxuICAiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGhyb3dFeGNlcHRpb24oU3RyaW5nIG0sIEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIGlmICghaWdub3JlRXJyb3JzKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbihtICsgZSwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGhyb3dFeGNlcHRpb25XaXRoVGFyZ2V0KFN0cmluZyBtLCBNQmVhbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgIGlmICghaWdub3JlRXJyb3JzKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbihtICsgZSwgZS5nZXRUYXJnZXRFeGNlcHRpb24oKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvR3Jvb3Z5U2NyaXB0RW5naW5lLmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvR3Jvb3Z5U2NyaXB0RW5naW5lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdjOTQ4NwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdXRpbC9Hcm9vdnlTY3JpcHRFbmdpbmUuamF2YQpAQCAtMCwwICsxLDQwMyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGdyb292eS51dGlsOworCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuQmluZGluZzsKK2ltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlDbGFzc0xvYWRlcjsKK2ltcG9ydCBncm9vdnkubGFuZy5TY3JpcHQ7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLkNvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5JbnZva2VySGVscGVyOworCisvKioKKyAqIFNwZWNpZmljIHNjcmlwdCBlbmdpbmUgYWJsZSB0byByZWxvYWQgbW9kaWZpZWQgc2NyaXB0cyBhcyB3ZWxsIGFzIGRlYWxpbmcgcHJvcGVybHkgd2l0aCBkZXBlbmRlbnQgc2NyaXB0cy4KKyAqCisgKiBAYXV0aG9yIHNhbQorICogQGF1dGhvciBNYXJjIFBhbG1lcgorICogQGF1dGhvciBHdWlsbGF1bWUgTGFmb3JnZQorICovCitwdWJsaWMgY2xhc3MgR3Jvb3Z5U2NyaXB0RW5naW5lIGltcGxlbWVudHMgUmVzb3VyY2VDb25uZWN0b3IgeworCisgICAgLyoqCisgICAgICogU2ltcGxlIHRlc3RpbmcgaGFybmVzcyBmb3IgdGhlIEdTRS4gRW50ZXIgc2NyaXB0IHJvb3RzIGFzIGFyZ3VtZW50cyBhbmQKKyAgICAgKiB0aGVuIGlucHV0IHNjcmlwdCBuYW1lcyB0byBydW4gdGhlbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmxzIGFycmF5IG9mIFVSTHMKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIHVybHMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBVUkxbXSByb290cyA9IG5ldyBVUkxbdXJscy5sZW5ndGhdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJvb3RzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZih1cmxzW2ldLmluZGV4T2YoIjovLyIpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgcm9vdHNbaV0gPSBuZXcgVVJMKHVybHNbaV0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByb290c1tpXSA9IG5ldyBGaWxlKHVybHNbaV0pLnRvVVJJKCkudG9VUkwoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBHcm9vdnlTY3JpcHRFbmdpbmUgZ3NlID0gbmV3IEdyb292eVNjcmlwdEVuZ2luZShyb290cyk7CisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihTeXN0ZW0uaW4pKTsKKyAgICAgICAgU3RyaW5nIGxpbmU7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJncm9vdnk+ICIpOworICAgICAgICAgICAgaWYgKChsaW5lID0gYnIucmVhZExpbmUoKSkgPT0gbnVsbCB8fCBsaW5lLmVxdWFscygicXVpdCIpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZ3NlLnJ1bihsaW5lLCBuZXcgQmluZGluZygpKSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFVSTFtdIHJvb3RzOworICAgIHByaXZhdGUgTWFwIHNjcmlwdENhY2hlID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBIYXNoTWFwKCkpOworICAgIHByaXZhdGUgUmVzb3VyY2VDb25uZWN0b3IgcmM7CisgICAgLy8gcHJpdmF0ZSBDbGFzc0xvYWRlciBwYXJlbnRDbGFzc0xvYWRlciA9IGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKKworICAgIC8vcHJpdmF0ZSBTY3JpcHRDYWNoZUVudHJ5IGN1cnJlbnRDYWNoZUVudHJ5ID0gbnVsbDsKKyAgICBwcml2YXRlIHN0YXRpYyBUaHJlYWRMb2NhbCBjdXJyZW50Q2FjaGVFbnRyeUhvbGRlciA9IG5ldyBUaHJlYWRMb2NhbCgpOworICAgIHByaXZhdGUgR3Jvb3Z5Q2xhc3NMb2FkZXIgZ3Jvb3Z5TG9hZGVyID0gbnVsbDsKKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNjcmlwdENhY2hlRW50cnkgeworICAgICAgICBwcml2YXRlIENsYXNzIHNjcmlwdENsYXNzOworICAgICAgICBwcml2YXRlIGxvbmcgbGFzdE1vZGlmaWVkOworICAgICAgICBwcml2YXRlIE1hcCBkZXBlbmRlbmNpZXMgPSBuZXcgSGFzaE1hcCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgYSBuZXcgR3Jvb3Z5Q2xhc3NMb2FkZXIgd2l0aCB0aGUgcGFyZW50Q2xhc3NMb2FkZXIgcGFzc2VkIGFzIGEgcGFyYW1ldGVyCisgICAgICogQSBHcm9vdnlTY3JpcHRFbmdpbmUgc2hvdWxkIG9ubHkgdXNlIG9uZSBHcm9vdnlDbGFzc0xvYWRlciBidXQgc2luY2UgaW4gdmVyc2lvbgorICAgICAqIHByaW9yIHRvIDEuMC1SQy0wMSB5b3UgY291bGQgc2V0IGEgbmV3IHBhcmVudENsYXNzTG9hZGVyCisgICAgICogVWx0aW1hdGVseSBncm9vdnlMb2FkZXIgc2hvdWxkIGJlIGZpbmFsIGFuZCBvbmx5IHNldCBpbiB0aGUgY29uc3RydWN0b3IKKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnRDbGFzc0xvYWRlcgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBpbml0R3Jvb3Z5TG9hZGVyKGZpbmFsIENsYXNzTG9hZGVyIHBhcmVudENsYXNzTG9hZGVyKSB7CisgICAgICAgIGlmIChncm9vdnlMb2FkZXIgPT0gbnVsbCB8fCBncm9vdnlMb2FkZXIuZ2V0UGFyZW50KCkgIT0gcGFyZW50Q2xhc3NMb2FkZXIpIHsKKyAgICAgICAgICAgIGdyb292eUxvYWRlciA9CisgICAgICAgICAgICAgICAgICAgIChHcm9vdnlDbGFzc0xvYWRlcikgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEdyb292eUNsYXNzTG9hZGVyKHBhcmVudENsYXNzTG9hZGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBDbGFzcyBmaW5kQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gY2xhc3NOYW1lLnJlcGxhY2UoJy4nLCBGaWxlLnNlcGFyYXRvckNoYXIpICsgIi5ncm9vdnkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMQ29ubmVjdGlvbiBkZXBlbmRlbnRTY3JpcHRDb25uID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW50U2NyaXB0Q29ubiA9IHJjLmdldFJlc291cmNlQ29ubmVjdGlvbihmaWxlbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NyaXB0Q2FjaGVFbnRyeSBjdXJyZW50Q2FjaGVFbnRyeSA9IChTY3JpcHRDYWNoZUVudHJ5KSBjdXJyZW50Q2FjaGVFbnRyeUhvbGRlci5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q2FjaGVFbnRyeS5kZXBlbmRlbmNpZXMucHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW50U2NyaXB0Q29ubi5nZXRVUkwoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBMb25nKGRlcGVuZGVudFNjcmlwdENvbm4uZ2V0TGFzdE1vZGlmaWVkKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VDbGFzcyhkZXBlbmRlbnRTY3JpcHRDb25uLmdldElucHV0U3RyZWFtKCksIGZpbGVuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlc291cmNlRXhjZXB0aW9uIGUxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24oIkNvdWxkIG5vdCByZWFkICIgKyBjbGFzc05hbWUgKyAiOiAiICsgZTEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24gZTIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbigiU3ludGF4IGVycm9yIGluICIgKyBjbGFzc05hbWUgKyAiOiAiICsgZTIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZTMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbigiUHJvYmxlbSByZWFkaW5nICIgKyBjbGFzc05hbWUgKyAiOiAiICsgZTMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW50U2NyaXB0Q29ubiAhPSBudWxsICYmIGRlcGVuZGVudFNjcmlwdENvbm4uZ2V0SW5wdXRTdHJlYW0oKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbnRTY3JpcHRDb25uLmdldElucHV0U3RyZWFtKCkuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSUdOT1JFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSByZXNvdXJjZSBjb25uZWN0aW9uIGFzIGEgPGNvZGU+VVJMQ29ubmVjdGlvbjwvY29kZT4gdG8gcmV0cmlldmUgYSBzY3JpcHQKKyAgICAgKiBmcm9tIHRoZSA8Y29kZT5SZXNvdXJjZUNvbm5lY3RvcjwvY29kZT4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZU5hbWUgbmFtZSBvZiB0aGUgcmVzb3VyY2UgdG8gYmUgcmV0cmlldmVkCisgICAgICogQHJldHVybiBhIFVSTENvbm5lY3Rpb24gdG8gdGhlIHJlc291cmNlCisgICAgICogQHRocm93cyBSZXNvdXJjZUV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBVUkxDb25uZWN0aW9uIGdldFJlc291cmNlQ29ubmVjdGlvbihTdHJpbmcgcmVzb3VyY2VOYW1lKSB0aHJvd3MgUmVzb3VyY2VFeGNlcHRpb24geworICAgICAgICAvLyBHZXQgdGhlIFVSTENvbm5lY3Rpb24KKyAgICAgICAgVVJMQ29ubmVjdGlvbiBncm9vdnlTY3JpcHRDb25uID0gbnVsbDsKKworICAgICAgICBSZXNvdXJjZUV4Y2VwdGlvbiBzZSA9IG51bGw7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcm9vdHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIFVSTCBzY3JpcHRVUkwgPSBudWxsOworICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzY3JpcHRVUkwgPSBuZXcgVVJMKHJvb3RzW2ldLCByZXNvdXJjZU5hbWUpOworCisgICAgICAgICAgICAgICAgZ3Jvb3Z5U2NyaXB0Q29ubiA9IHNjcmlwdFVSTC5vcGVuQ29ubmVjdGlvbigpOworCisgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGNhbiBvcGVuIGl0LCBpZiB3ZSBjYW4ndCBpdCBkb2Vzbid0IGV4aXN0LgorICAgICAgICAgICAgICAgIC8vIENvdWxkIGJlIHZlcnkgc2xvdyBpZiB0aGVyZSBhcmUgYW55IG5vbi1maWxlOi8vIFVSTHMgaW4gdGhlcmUKKyAgICAgICAgICAgICAgICBpbiA9IGdyb292eVNjcmlwdENvbm4uZ2V0SW5wdXRTdHJlYW0oKTsKKworICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBOb3cgdGhpcyBpcyBhIGJpdCB1bnVzdWFsCisKKyAgICAgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiTWFsZm9ybWVkIFVSTDogIiArIHJvb3RzW2ldICsgIiwgIiArIHJlc291cmNlTmFtZTsKKyAgICAgICAgICAgICAgICBpZiAoc2UgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBzZSA9IG5ldyBSZXNvdXJjZUV4Y2VwdGlvbihtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzZSA9IG5ldyBSZXNvdXJjZUV4Y2VwdGlvbihtZXNzYWdlLCBzZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJDYW5ub3Qgb3BlbiBVUkw6ICIgKyBzY3JpcHRVUkw7CisgICAgICAgICAgICAgICAgaWYgKHNlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgc2UgPSBuZXcgUmVzb3VyY2VFeGNlcHRpb24obWVzc2FnZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2UgPSBuZXcgUmVzb3VyY2VFeGNlcHRpb24obWVzc2FnZSwgc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nLCByZXBvcnQgb24gYWxsIHRoZSBleGNlcHRpb25zIHRoYXQgb2NjdXJyZWQuCisgICAgICAgIGlmIChncm9vdnlTY3JpcHRDb25uID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IHNlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGdyb292eVNjcmlwdENvbm47CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGdyb292eSBzY3JpcHQgZW5naW5lIHdpbGwgcnVuIGdyb292eSBzY3JpcHRzIGFuZCByZWxvYWQgdGhlbSBhbmQKKyAgICAgKiB0aGVpciBkZXBlbmRlbmNpZXMgd2hlbiB0aGV5IGFyZSBtb2RpZmllZC4gVGhpcyBpcyB1c2VmdWwgZm9yIGVtYmVkZGluZworICAgICAqIGdyb292eSBpbiBvdGhlciBjb250YWluZXJzIGxpa2UgZ2FtZXMgYW5kIGFwcGxpY2F0aW9uIHNlcnZlcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9vdHMgVGhpcyBhbiBhcnJheSBvZiBVUkxzIHdoZXJlIEdyb292eSBzY3JpcHRzIHdpbGwgYmUgc3RvcmVkLiBUaGV5IHNob3VsZAorICAgICAqICAgICAgICAgICAgICBiZSBsYXllZCBvdXQgdXNpbmcgdGhlaXIgcGFja2FnZSBzdHJ1Y3R1cmUgbGlrZSBKYXZhIGNsYXNzZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgR3Jvb3Z5U2NyaXB0RW5naW5lKFVSTFtdIHJvb3RzKSB7CisgICAgICAgIHRoaXMucm9vdHMgPSByb290czsKKyAgICAgICAgdGhpcy5yYyA9IHRoaXM7CisgICAgICAgIGluaXRHcm9vdnlMb2FkZXIoZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgR3Jvb3Z5U2NyaXB0RW5naW5lKFVSTFtdIHJvb3RzLCBDbGFzc0xvYWRlciBwYXJlbnRDbGFzc0xvYWRlcikgeworICAgICAgICB0aGlzKHJvb3RzKTsKKyAgICAgICAgaW5pdEdyb292eUxvYWRlcihwYXJlbnRDbGFzc0xvYWRlcik7CisgICAgfQorCisgICAgcHVibGljIEdyb292eVNjcmlwdEVuZ2luZShTdHJpbmdbXSB1cmxzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByb290cyA9IG5ldyBVUkxbdXJscy5sZW5ndGhdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJvb3RzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICByb290c1tpXSA9IG5ldyBGaWxlKHVybHNbaV0pLnRvVVJJKCkudG9VUkwoKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnJjID0gdGhpczsKKyAgICAgICAgaW5pdEdyb292eUxvYWRlcihnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpOworICAgIH0KKworICAgIHB1YmxpYyBHcm9vdnlTY3JpcHRFbmdpbmUoU3RyaW5nW10gdXJscywgQ2xhc3NMb2FkZXIgcGFyZW50Q2xhc3NMb2FkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRoaXModXJscyk7CisgICAgICAgIGluaXRHcm9vdnlMb2FkZXIocGFyZW50Q2xhc3NMb2FkZXIpOworICAgIH0KKworICAgIHB1YmxpYyBHcm9vdnlTY3JpcHRFbmdpbmUoU3RyaW5nIHVybCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcm9vdHMgPSBuZXcgVVJMWzFdOworICAgICAgICByb290c1swXSA9IG5ldyBGaWxlKHVybCkudG9VUkkoKS50b1VSTCgpOworICAgICAgICB0aGlzLnJjID0gdGhpczsKKyAgICAgICAgaW5pdEdyb292eUxvYWRlcihnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpOworICAgIH0KKworICAgIHB1YmxpYyBHcm9vdnlTY3JpcHRFbmdpbmUoU3RyaW5nIHVybCwgQ2xhc3NMb2FkZXIgcGFyZW50Q2xhc3NMb2FkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRoaXModXJsKTsKKyAgICAgICAgaW5pdEdyb292eUxvYWRlcihwYXJlbnRDbGFzc0xvYWRlcik7CisgICAgfQorCisgICAgcHVibGljIEdyb292eVNjcmlwdEVuZ2luZShSZXNvdXJjZUNvbm5lY3RvciByYykgeworICAgICAgICB0aGlzLnJjID0gcmM7CisgICAgICAgIGluaXRHcm9vdnlMb2FkZXIoZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgR3Jvb3Z5U2NyaXB0RW5naW5lKFJlc291cmNlQ29ubmVjdG9yIHJjLCBDbGFzc0xvYWRlciBwYXJlbnRDbGFzc0xvYWRlcikgeworICAgICAgICB0aGlzKHJjKTsKKyAgICAgICAgaW5pdEdyb292eUxvYWRlcihwYXJlbnRDbGFzc0xvYWRlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSA8Y29kZT5DbGFzc0xvYWRlcjwvY29kZT4gdGhhdCB3aWxsIHNlcnZlIGFzIHRoZSBwYXJlbnQgQ2xhc3NMb2FkZXIgb2YgdGhlCisgICAgICoge0BsaW5rIEdyb292eUNsYXNzTG9hZGVyfSBpbiB3aGljaCBzY3JpcHRzIHdpbGwgYmUgZXhlY3V0ZWQuIEJ5IGRlZmF1bHQsIHRoaXMgaXMgdGhlCisgICAgICogQ2xhc3NMb2FkZXIgdGhhdCBsb2FkZWQgdGhlIDxjb2RlPkdyb292eVNjcmlwdEVuZ2luZTwvY29kZT4gY2xhc3MuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHBhcmVudCBjbGFzc2xvYWRlciB1c2VkIHRvIGxvYWQgc2NyaXB0cworICAgICAqLworICAgIHB1YmxpYyBDbGFzc0xvYWRlciBnZXRQYXJlbnRDbGFzc0xvYWRlcigpIHsKKyAgICAgICAgcmV0dXJuIGdyb292eUxvYWRlci5nZXRQYXJlbnQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gcGFyZW50Q2xhc3NMb2FkZXIgQ2xhc3NMb2FkZXIgdG8gYmUgdXNlZCBhcyB0aGUgcGFyZW50IENsYXNzTG9hZGVyIGZvciBzY3JpcHRzIGV4ZWN1dGVkIGJ5IHRoZSBlbmdpbmUKKyAgICAgKiBAZGVwcmVjYXRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudENsYXNzTG9hZGVyKENsYXNzTG9hZGVyIHBhcmVudENsYXNzTG9hZGVyKSB7CisgICAgICAgIGlmIChwYXJlbnRDbGFzc0xvYWRlciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgcGFyZW50IGNsYXNzIGxvYWRlciBtdXN0IG5vdCBiZSBudWxsLiIpOworICAgICAgICB9CisgICAgICAgIGluaXRHcm9vdnlMb2FkZXIocGFyZW50Q2xhc3NMb2FkZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY2xhc3Mgb2YgdGhlIHNjcmlwdE5hbWUgaW4gcXVlc3Rpb24sIHNvIHRoYXQgeW91IGNhbiBpbnN0YW50aWF0ZSBHcm9vdnkgb2JqZWN0cyB3aXRoIGNhY2hpbmcgYW5kIHJlbG9hZGluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzY3JpcHROYW1lCisgICAgICogQHJldHVybiB0aGUgbG9hZGVkIHNjcmlwdE5hbWUgYXMgYSBjb21waWxlZCBjbGFzcworICAgICAqIEB0aHJvd3MgUmVzb3VyY2VFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIFNjcmlwdEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBDbGFzcyBsb2FkU2NyaXB0QnlOYW1lKFN0cmluZyBzY3JpcHROYW1lKSB0aHJvd3MgUmVzb3VyY2VFeGNlcHRpb24sIFNjcmlwdEV4Y2VwdGlvbiB7CisgICAgICAgIHNjcmlwdE5hbWUgPSBzY3JpcHROYW1lLnJlcGxhY2UoJy4nLCBGaWxlLnNlcGFyYXRvckNoYXIpICsgIi5ncm9vdnkiOworICAgICAgICBTY3JpcHRDYWNoZUVudHJ5IGVudHJ5ID0gdXBkYXRlQ2FjaGVFbnRyeShzY3JpcHROYW1lKTsKKyAgICAgICAgcmV0dXJuIGVudHJ5LnNjcmlwdENsYXNzOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjbGFzcyBvZiB0aGUgc2NyaXB0TmFtZSBpbiBxdWVzdGlvbiwgc28gdGhhdCB5b3UgY2FuIGluc3RhbnRpYXRlIEdyb292eSBvYmplY3RzIHdpdGggY2FjaGluZyBhbmQgcmVsb2FkaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIHNjcmlwdE5hbWUKKyAgICAgKiBAcmV0dXJuIHRoZSBsb2FkZWQgc2NyaXB0TmFtZSBhcyBhIGNvbXBpbGVkIGNsYXNzCisgICAgICogQHRocm93cyBSZXNvdXJjZUV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgU2NyaXB0RXhjZXB0aW9uCisgICAgICogQGRlcHJlY2F0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3MgbG9hZFNjcmlwdEJ5TmFtZShTdHJpbmcgc2NyaXB0TmFtZSwgQ2xhc3NMb2FkZXIgcGFyZW50Q2xhc3NMb2FkZXIpCisgICAgICAgICAgICB0aHJvd3MgUmVzb3VyY2VFeGNlcHRpb24sIFNjcmlwdEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRHcm9vdnlMb2FkZXIocGFyZW50Q2xhc3NMb2FkZXIpOworICAgICAgICByZXR1cm4gbG9hZFNjcmlwdEJ5TmFtZShzY3JpcHROYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2NhdGUgdGhlIGNsYXNzIGFuZCByZWxvYWQgaXQgb3IgYW55IG9mIGl0cyBkZXBlbmRlbmNpZXMKKyAgICAgKgorICAgICAqIEBwYXJhbSBzY3JpcHROYW1lCisgICAgICogQHJldHVybiB0aGUgc2NyaXB0TmFtZSBjYWNoZSBlbnRyeQorICAgICAqIEB0aHJvd3MgUmVzb3VyY2VFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIFNjcmlwdEV4Y2VwdGlvbgorICAgICAqLworICAgIHByaXZhdGUgU2NyaXB0Q2FjaGVFbnRyeSB1cGRhdGVDYWNoZUVudHJ5KFN0cmluZyBzY3JpcHROYW1lKQorICAgICAgICAgICAgdGhyb3dzIFJlc291cmNlRXhjZXB0aW9uLCBTY3JpcHRFeGNlcHRpb24geworICAgICAgICBTY3JpcHRDYWNoZUVudHJ5IGVudHJ5OworCisgICAgICAgIHNjcmlwdE5hbWUgPSBzY3JpcHROYW1lLmludGVybigpOworICAgICAgICBzeW5jaHJvbml6ZWQgKHNjcmlwdE5hbWUpIHsKKworICAgICAgICAgICAgVVJMQ29ubmVjdGlvbiBncm9vdnlTY3JpcHRDb25uID0gcmMuZ2V0UmVzb3VyY2VDb25uZWN0aW9uKHNjcmlwdE5hbWUpOworCisgICAgICAgICAgICAvLyBVUkwgbGFzdCBtb2RpZmllZAorICAgICAgICAgICAgbG9uZyBsYXN0TW9kaWZpZWQgPSBncm9vdnlTY3JpcHRDb25uLmdldExhc3RNb2RpZmllZCgpOworICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIGNhY2hlIGZvciB0aGUgc2NyaXB0TmFtZQorICAgICAgICAgICAgZW50cnkgPSAoU2NyaXB0Q2FjaGVFbnRyeSkgc2NyaXB0Q2FjaGUuZ2V0KHNjcmlwdE5hbWUpOworICAgICAgICAgICAgLy8gSWYgdGhlIGVudHJ5IGlzbid0IG51bGwgY2hlY2sgYWxsIHRoZSBkZXBlbmRlbmNpZXMKKworICAgICAgICAgICAgYm9vbGVhbiBkZXBlbmRlbmN5T3V0T2ZEYXRlID0gZmFsc2U7CisgICAgICAgICAgICBpZiAoZW50cnkgIT0gbnVsbCkgeworCisgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZW50cnkuZGVwZW5kZW5jaWVzLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgICAgICBVUkxDb25uZWN0aW9uIHVybGMgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBVUkwgdXJsID0gKFVSTCkgaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1cmxjID0gdXJsLm9wZW5Db25uZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB1cmxjLnNldERvSW5wdXQoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgdXJsYy5zZXREb091dHB1dChmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGRlcGVuZGVudExhc3RNb2RpZmllZCA9IHVybGMuZ2V0TGFzdE1vZGlmaWVkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW50TGFzdE1vZGlmaWVkID4gKChMb25nKSBlbnRyeS5kZXBlbmRlbmNpZXMuZ2V0KHVybCkpLmxvbmdWYWx1ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jeU91dE9mRGF0ZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jeU91dE9mRGF0ZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGVudHJ5ID09IG51bGwgfHwgZW50cnkubGFzdE1vZGlmaWVkIDwgbGFzdE1vZGlmaWVkIHx8IGRlcGVuZGVuY3lPdXRPZkRhdGUpIHsKKyAgICAgICAgICAgICAgICAvLyBNYWtlIGEgbmV3IGVudHJ5CisgICAgICAgICAgICAgICAgU2NyaXB0Q2FjaGVFbnRyeSBjdXJyZW50Q2FjaGVFbnRyeSA9IG5ldyBTY3JpcHRDYWNoZUVudHJ5KCk7CisgICAgICAgICAgICAgICAgY3VycmVudENhY2hlRW50cnlIb2xkZXIuc2V0KGN1cnJlbnRDYWNoZUVudHJ5KTsKKyAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG51bGw7CisKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpbiA9IGdyb292eVNjcmlwdENvbm4uZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudENhY2hlRW50cnkuc2NyaXB0Q2xhc3MgPSBncm9vdnlMb2FkZXIucGFyc2VDbGFzcyhpbiwgc2NyaXB0TmFtZSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjcmlwdEV4Y2VwdGlvbigiQ291bGQgbm90IHBhcnNlIHNjcmlwdE5hbWU6ICIgKyBzY3JpcHROYW1lLCBlKTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q2FjaGVFbnRyeUhvbGRlci5zZXQobnVsbCk7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW4gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3RoaW5nOiBKdXN0IHdhbnQgdG8gbWFrZSBzdXJlIGl0IGlzIGNsb3NlZAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY3VycmVudENhY2hlRW50cnkubGFzdE1vZGlmaWVkID0gbGFzdE1vZGlmaWVkOworICAgICAgICAgICAgICAgIHNjcmlwdENhY2hlLnB1dChzY3JpcHROYW1lLCBjdXJyZW50Q2FjaGVFbnRyeSk7CisKKyAgICAgICAgICAgICAgICBlbnRyeSA9IGN1cnJlbnRDYWNoZUVudHJ5OworICAgICAgICAgICAgICAgIGN1cnJlbnRDYWNoZUVudHJ5ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZW50cnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUnVuIGEgc2NyaXB0IGlkZW50aWZpZWQgYnkgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzY3JpcHROYW1lIG5hbWUgb2YgdGhlIHNjcmlwdCB0byBydW4KKyAgICAgKiBAcGFyYW0gYXJndW1lbnQgICBhIHNpbmdsZSBhcmd1bWVudCBwYXNzZWQgYXMgYSB2YXJpYWJsZSBuYW1lZCA8Y29kZT5hcmc8L2NvZGU+IGluIHRoZSBiaW5kaW5nCisgICAgICogQHJldHVybiBhIDxjb2RlPnRvU3RyaW5nKCk8L2NvZGU+IHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZXN1bHQgb2YgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgc2NyaXB0CisgICAgICogQHRocm93cyBSZXNvdXJjZUV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgU2NyaXB0RXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBydW4oU3RyaW5nIHNjcmlwdE5hbWUsIFN0cmluZyBhcmd1bWVudCkgdGhyb3dzIFJlc291cmNlRXhjZXB0aW9uLCBTY3JpcHRFeGNlcHRpb24geworICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSBuZXcgQmluZGluZygpOworICAgICAgICBiaW5kaW5nLnNldFZhcmlhYmxlKCJhcmciLCBhcmd1bWVudCk7CisgICAgICAgIE9iamVjdCByZXN1bHQgPSBydW4oc2NyaXB0TmFtZSwgYmluZGluZyk7CisgICAgICAgIHJldHVybiByZXN1bHQgPT0gbnVsbCA/ICIiIDogcmVzdWx0LnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUnVuIGEgc2NyaXB0IGlkZW50aWZpZWQgYnkgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzY3JpcHROYW1lIG5hbWUgb2YgdGhlIHNjcmlwdCB0byBydW4KKyAgICAgKiBAcGFyYW0gYmluZGluZyAgICBiaW5kaW5nIHRvIHBhc3MgdG8gdGhlIHNjcmlwdAorICAgICAqIEByZXR1cm4gYW4gb2JqZWN0CisgICAgICogQHRocm93cyBSZXNvdXJjZUV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgU2NyaXB0RXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBydW4oU3RyaW5nIHNjcmlwdE5hbWUsIEJpbmRpbmcgYmluZGluZykgdGhyb3dzIFJlc291cmNlRXhjZXB0aW9uLCBTY3JpcHRFeGNlcHRpb24geworCisgICAgICAgIFNjcmlwdENhY2hlRW50cnkgZW50cnkgPSB1cGRhdGVDYWNoZUVudHJ5KHNjcmlwdE5hbWUpOworICAgICAgICBTY3JpcHQgc2NyaXB0T2JqZWN0ID0gSW52b2tlckhlbHBlci5jcmVhdGVTY3JpcHQoZW50cnkuc2NyaXB0Q2xhc3MsIGJpbmRpbmcpOworICAgICAgICByZXR1cm4gc2NyaXB0T2JqZWN0LnJ1bigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdXRpbC9Hcm9vdnlUZXN0Q2FzZS5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91dGlsL0dyb292eVRlc3RDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBkNjQ1YgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdXRpbC9Hcm9vdnlUZXN0Q2FzZS5qYXZhCkBAIC0wLDAgKzEsNDA0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgZ3Jvb3Z5LnV0aWw7CisKK2ltcG9ydCBncm9vdnkubGFuZy5DbG9zdXJlOworaW1wb3J0IGdyb292eS5sYW5nLkdyb292eVJ1bnRpbWVFeGNlcHRpb247CitpbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5U2hlbGw7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5JbnZva2VySGVscGVyOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS50eXBlaGFuZGxpbmcuRGVmYXVsdFR5cGVUcmFuc2Zvcm1hdGlvbjsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8qKgorICogQSBkZWZhdWx0IEpVbml0IFRlc3RDYXNlIGluIEdyb292eS4gVGhpcyBwcm92aWRlcyBhIG51bWJlciBvZiBoZWxwZXIgbWV0aG9kcworICogcGx1cyBhdm9pZHMgdGhlIEpVbml0IHJlc3RyaWN0aW9uIG9mIHJlcXVpcmluZyBhbGwgdGVzdCogbWV0aG9kcyB0byBiZSB2b2lkCisgKiByZXR1cm4gdHlwZS4KKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpib2JAd2Vya2VuLmNvbSI+Ym9iIG1jd2hpcnRlcjwvYT4KKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAYXV0aG9yIERpZXJrIEtvZW5pZyAodGhlIG5vdFlldEltcGxlbWVudGVkIGZlYXR1cmUsIGNoYW5nZXMgdG8gc2hvdWxkRmFpbCkKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIEdyb292eVRlc3RDYXNlIGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHJvdGVjdGVkIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9nZ2VyLmdldExvZ2dlcihHcm9vdnlUZXN0Q2FzZS5jbGFzcy5nZXROYW1lKCkpOworICAgIHByaXZhdGUgc3RhdGljIGludCBjb3VudGVyOworICAgIHByaXZhdGUgYm9vbGVhbiB1c2VBZ2lsZURveE5hbWluZyA9IGZhbHNlOworCisgICAgcHVibGljIEdyb292eVRlc3RDYXNlKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIE92ZXJsb2FkIHRoZSBnZXROYW1lKCkgbWV0aG9kIHRvIG1ha2UgdGhlIHRlc3QgY2FzZXMgbG9vayBtb3JlIGxpa2UgQWdpbGVEb3gKKyAgICAgKiAodGhhbmtzIHRvIEpvZSBXYWxuZXMgZm9yIHRoaXMgdGlwISkKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIGlmICh1c2VBZ2lsZURveE5hbWluZykgeworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldE5hbWUoKS5zdWJzdHJpbmcoNCkucmVwbGFjZUFsbCgiKFtBLVpdKSIsICIgJDEiKS50b0xvd2VyQ2FzZSgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldE5hbWUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmdldE5hbWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBc3NlcnRzIHRoYXQgdGhlIGFycmF5cyBhcmUgZXF1aXZhbGVudCBhbmQgY29udGFpbiB0aGUgc2FtZSB2YWx1ZXMKKyAgICAgKgorICAgICAqIEBwYXJhbSBleHBlY3RlZAorICAgICAqIEBwYXJhbSB2YWx1ZQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydEFycmF5RXF1YWxzKE9iamVjdFtdIGV4cGVjdGVkLCBPYmplY3RbXSB2YWx1ZSkgeworICAgICAgICBTdHJpbmcgbWVzc2FnZSA9CisgICAgICAgICAgICAiZXhwZWN0ZWQgYXJyYXk6ICIgKyBJbnZva2VySGVscGVyLnRvU3RyaW5nKGV4cGVjdGVkKSArICIgdmFsdWUgYXJyYXk6ICIgKyBJbnZva2VySGVscGVyLnRvU3RyaW5nKHZhbHVlKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtZXNzYWdlICsgIjogZXhwZWN0ZWQgc2hvdWxkIG5vdCBiZSBudWxsIiwgZXhwZWN0ZWQpOworICAgICAgICBhc3NlcnROb3ROdWxsKG1lc3NhZ2UgKyAiOiB2YWx1ZSBzaG91bGQgbm90IGJlIG51bGwiLCB2YWx1ZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLCBleHBlY3RlZC5sZW5ndGgsIHZhbHVlLmxlbmd0aCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwLCBzaXplID0gZXhwZWN0ZWQubGVuZ3RoOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlWyIgKyBpICsgIl0gd2hlbiAiICsgbWVzc2FnZSwgZXhwZWN0ZWRbaV0sIHZhbHVlW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFzc2VydHMgdGhhdCB0aGUgYXJyYXkgb2YgY2hhcmFjdGVycyBoYXMgYSBnaXZlbiBsZW5ndGgKKyAgICAgKgorICAgICAqIEBwYXJhbSBsZW5ndGggZXhwZWN0ZWQgbGVuZ3RoCisgICAgICogQHBhcmFtIGFycmF5IHRoZSBhcnJheQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydExlbmd0aChpbnQgbGVuZ3RoLCBjaGFyW10gYXJyYXkpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGxlbmd0aCwgYXJyYXkubGVuZ3RoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBc3NlcnRzIHRoYXQgdGhlIGFycmF5IG9mIGludHMgaGFzIGEgZ2l2ZW4gbGVuZ3RoCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGVuZ3RoIGV4cGVjdGVkIGxlbmd0aAorICAgICAqIEBwYXJhbSBhcnJheSB0aGUgYXJyYXkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRMZW5ndGgoaW50IGxlbmd0aCwgaW50W10gYXJyYXkpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGxlbmd0aCwgYXJyYXkubGVuZ3RoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBc3NlcnRzIHRoYXQgdGhlIGFycmF5IG9mIG9iamVjdHMgaGFzIGEgZ2l2ZW4gbGVuZ3RoCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGVuZ3RoIGV4cGVjdGVkIGxlbmd0aAorICAgICAqIEBwYXJhbSBhcnJheSB0aGUgYXJyYXkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRMZW5ndGgoaW50IGxlbmd0aCwgT2JqZWN0W10gYXJyYXkpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGxlbmd0aCwgYXJyYXkubGVuZ3RoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBc3NlcnRzIHRoYXQgdGhlIGFycmF5IG9mIGNoYXJhY3RlcnMgY29udGFpbnMgYSBnaXZlbiBjaGFyCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXhwZWN0ZWQgZXhwZWN0ZWQgY2hhcmFjdGVyIHRvIGJlIGZvdW5kCisgICAgICogQHBhcmFtIGFycmF5IHRoZSBhcnJheQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydENvbnRhaW5zKGNoYXIgZXhwZWN0ZWQsIGNoYXJbXSBhcnJheSkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBpZiAoYXJyYXlbaV0gPT0gZXhwZWN0ZWQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmdCdWZmZXIgbWVzc2FnZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgICAgICBtZXNzYWdlLmFwcGVuZChleHBlY3RlZCkuYXBwZW5kKCIgbm90IGluIHsiKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBtZXNzYWdlLmFwcGVuZCgiJyIpLmFwcGVuZChhcnJheVtpXSkuYXBwZW5kKCInIik7CisKKyAgICAgICAgICAgIGlmIChpIDwgKGFycmF5Lmxlbmd0aCAtIDEpKSB7CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoIiwgIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBtZXNzYWdlLmFwcGVuZCgiIH0iKTsKKworICAgICAgICBmYWlsKG1lc3NhZ2UudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXNzZXJ0cyB0aGF0IHRoZSBhcnJheSBvZiBpbnRzIGNvbnRhaW5zIGEgZ2l2ZW4gaW50CisgICAgICoKKyAgICAgKiBAcGFyYW0gZXhwZWN0ZWQgZXhwZWN0ZWQgaW50CisgICAgICogQHBhcmFtIGFycmF5IHRoZSBhcnJheQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydENvbnRhaW5zKGludCBleHBlY3RlZCwgaW50W10gYXJyYXkpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgaWYgKGFycmF5W2ldID09IGV4cGVjdGVkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIG1lc3NhZ2UgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICAgICAgbWVzc2FnZS5hcHBlbmQoZXhwZWN0ZWQpLmFwcGVuZCgiIG5vdCBpbiB7Iik7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoIiciKS5hcHBlbmQoYXJyYXlbaV0pLmFwcGVuZCgiJyIpOworCisgICAgICAgICAgICBpZiAoaSA8IChhcnJheS5sZW5ndGggLSAxKSkgeworICAgICAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbWVzc2FnZS5hcHBlbmQoIiB9Iik7CisKKyAgICAgICAgZmFpbChtZXNzYWdlLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFzc2VydHMgdGhhdCB0aGUgdmFsdWUgb2YgdG9TdHJpbmcoKSBvbiB0aGUgZ2l2ZW4gb2JqZWN0IG1hdGNoZXMgdGhlCisgICAgICogZ2l2ZW4gdGV4dCBzdHJpbmcKKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgb2JqZWN0IHRvIGJlIG91dHB1dCB0byB0aGUgY29uc29sZQorICAgICAqIEBwYXJhbSBleHBlY3RlZCB0aGUgZXhwZWN0ZWQgU3RyaW5nIHJlcHJlc2VudGF0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0VG9TdHJpbmcoT2JqZWN0IHZhbHVlLCBTdHJpbmcgZXhwZWN0ZWQpIHsKKyAgICAgICAgT2JqZWN0IGNvbnNvbGUgPSBJbnZva2VySGVscGVyLmludm9rZU1ldGhvZCh2YWx1ZSwgInRvU3RyaW5nIiwgbnVsbCk7CisgICAgICAgIGFzc2VydEVxdWFscygidG9TdHJpbmcoKSBvbiB2YWx1ZTogIiArIHZhbHVlLCBleHBlY3RlZCwgY29uc29sZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXNzZXJ0cyB0aGF0IHRoZSB2YWx1ZSBvZiBpbnNwZWN0KCkgb24gdGhlIGdpdmVuIG9iamVjdCBtYXRjaGVzIHRoZQorICAgICAqIGdpdmVuIHRleHQgc3RyaW5nCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG9iamVjdCB0byBiZSBvdXRwdXQgdG8gdGhlIGNvbnNvbGUKKyAgICAgKiBAcGFyYW0gZXhwZWN0ZWQgdGhlIGV4cGVjdGVkIFN0cmluZyByZXByZXNlbnRhdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydEluc3BlY3QoT2JqZWN0IHZhbHVlLCBTdHJpbmcgZXhwZWN0ZWQpIHsKKyAgICAgICAgT2JqZWN0IGNvbnNvbGUgPSBJbnZva2VySGVscGVyLmludm9rZU1ldGhvZCh2YWx1ZSwgImluc3BlY3QiLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbnNwZWN0KCkgb24gdmFsdWU6ICIgKyB2YWx1ZSwgZXhwZWN0ZWQsIGNvbnNvbGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFzc2VydHMgdGhhdCB0aGUgc2NyaXB0IHJ1bnMgd2l0aG91dCBhbnkgZXhjZXB0aW9ucworICAgICAqCisgICAgICogQHBhcmFtIHNjcmlwdCB0aGUgc2NyaXB0IHRoYXQgc2hvdWxkIHBhc3Mgd2l0aG91dCBhbnkgZXhjZXB0aW9uIHRocm93bgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydFNjcmlwdChmaW5hbCBTdHJpbmcgc2NyaXB0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgR3Jvb3Z5U2hlbGwgc2hlbGwgPSBuZXcgR3Jvb3Z5U2hlbGwoKTsKKyAgICAgICAgc2hlbGwuZXZhbHVhdGUoc2NyaXB0LCBnZXRUZXN0Q2xhc3NOYW1lKCkpOworICAgIH0KKworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VGVzdENsYXNzTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICJUZXN0U2NyaXB0IiArIGdldE1ldGhvZE5hbWUoKSArIChjb3VudGVyKyspICsgIi5ncm9vdnkiOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gY29kZSBjbG9zdXJlIGZhaWxzIHdoZW4gaXQgaXMgZXZhbHVhdGVkCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29kZQorICAgICAqIEByZXR1cm4gdGhlIG1lc3NhZ2Ugb2YgdGhlIHRocm93biBUaHJvd2FibGUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHNob3VsZEZhaWwoQ2xvc3VyZSBjb2RlKSB7CisgICAgICAgIGJvb2xlYW4gZmFpbGVkID0gZmFsc2U7CisgICAgICAgIFN0cmluZyByZXN1bHQgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY29kZS5jYWxsKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICAgICAgZmFpbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBlLmdldE1lc3NhZ2UoKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKCJDbG9zdXJlICIgKyBjb2RlICsgIiBzaG91bGQgaGF2ZSBmYWlsZWQiLCBmYWlsZWQpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gY29kZSBjbG9zdXJlIGZhaWxzIHdoZW4gaXQgaXMgZXZhbHVhdGVkCisgICAgICogYW5kIHRoYXQgYSBwYXJ0aWN1bGFyIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xhenogdGhlIGNsYXNzIG9mIHRoZSBleHBlY3RlZCBleGNlcHRpb24KKyAgICAgKiBAcGFyYW0gY29kZSB0aGUgY2xvc3VyZSB0aGF0IHNob3VsZCBmYWlsCisgICAgICogQHJldHVybiB0aGUgbWVzc2FnZSBvZiB0aGUgZXhwZWN0ZWQgVGhyb3dhYmxlCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBzaG91bGRGYWlsKENsYXNzIGNsYXp6LCBDbG9zdXJlIGNvZGUpIHsKKyAgICAgICAgVGhyb3dhYmxlIHRoID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvZGUuY2FsbCgpOworICAgICAgICB9IGNhdGNoIChHcm9vdnlSdW50aW1lRXhjZXB0aW9uIGdyZSkgeworICAgICAgICAgICAgdGggPSB1bndyYXAoZ3JlKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgICAgIHRoID0gZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0aD09bnVsbCkgeworICAgICAgICAgICAgZmFpbCgiQ2xvc3VyZSAiICsgY29kZSArICIgc2hvdWxkIGhhdmUgZmFpbGVkIHdpdGggYW4gZXhjZXB0aW9uIG9mIHR5cGUgIiArIGNsYXp6LmdldE5hbWUoKSk7CisgICAgICAgIH0gZWxzZSBpZiAoISBjbGF6ei5pc0luc3RhbmNlKHRoKSkgeworICAgICAgICAgICAgZmFpbCgiQ2xvc3VyZSAiICsgY29kZSArICIgc2hvdWxkIGhhdmUgZmFpbGVkIHdpdGggYW4gZXhjZXB0aW9uIG9mIHR5cGUgIiArIGNsYXp6LmdldE5hbWUoKSArICIsIGluc3RlYWQgZ290IEV4Y2VwdGlvbiAiICsgdGgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aC5nZXRNZXNzYWdlKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFN0cmluZyBzaG91bGRGYWlsV2l0aENhdXNlKENsYXNzIGNsYXp6LCBDbG9zdXJlIGNvZGUpIHsKKyAgICAgICAgVGhyb3dhYmxlIHRoID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvZGUuY2FsbCgpOworICAgICAgICB9IGNhdGNoIChHcm9vdnlSdW50aW1lRXhjZXB0aW9uIGdyZSkgeworICAgICAgICAgICAgdGggPSBncmU7CisgICAgICAgICAgICB3aGlsZSAodGguZ2V0Q2F1c2UoKSE9bnVsbCAmJiB0aC5nZXRDYXVzZSgpIT1ncmUpeyAvLyBpZiB3cmFwcGVkLCBmaW5kIHRoZSByb290IGNhdXNlCisgICAgICAgICAgICAgICAgdGg9dGguZ2V0Q2F1c2UoKTsKKyAgICAgICAgICAgICAgICBpZiAodGghPWdyZSAmJiAodGggaW5zdGFuY2VvZiBHcm9vdnlSdW50aW1lRXhjZXB0aW9uKSkgeworICAgICAgICAgICAgICAgICAgICBncmUgPSAoR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbikgdGg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgeworICAgICAgICAgICAgdGggPSBlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRoPT1udWxsKSB7CisgICAgICAgICAgICBmYWlsKCJDbG9zdXJlICIgKyBjb2RlICsgIiBzaG91bGQgaGF2ZSBmYWlsZWQgd2l0aCBhbiBleGNlcHRpb24gb2YgdHlwZSAiICsgY2xhenouZ2V0TmFtZSgpKTsKKyAgICAgICAgfSBlbHNlIGlmICghIGNsYXp6LmlzSW5zdGFuY2UodGgpKSB7CisgICAgICAgICAgICBmYWlsKCJDbG9zdXJlICIgKyBjb2RlICsgIiBzaG91bGQgaGF2ZSBmYWlsZWQgd2l0aCBhbiBleGNlcHRpb24gb2YgdHlwZSAiICsgY2xhenouZ2V0TmFtZSgpICsgIiwgaW5zdGVhZCBnb3QgRXhjZXB0aW9uICIgKyB0aCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoLmdldE1lc3NhZ2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgUmV0dXJucyBhIGNvcHkgb2YgYSBzdHJpbmcgaW4gd2hpY2ggYWxsIEVPTHMgYXJlIFxuLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZml4RU9McyggU3RyaW5nIHZhbHVlICkKKyAgICB7CisgICAgICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlQWxsKCAiKFxcclxcbj8pfFxuIiwgIlxuIiApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJ1bnMgdGhlIGNhbGxpbmcgSlVuaXQgdGVzdCBhZ2FpbiBhbmQgZmFpbHMgb25seSBpZiBpdCB1bmV4cGVjdGVkbHkgcnVucy48YnIvPgorICAgICAqIFRoaXMgaXMgaGVscGZ1bCBmb3IgdGVzdHMgdGhhdCBkb24ndCBjdXJyZW50bHkgd29yayBidXQgc2hvdWxkIHdvcmsgb25lIGRheSwKKyAgICAgKiB3aGVuIHRoZSB0ZXN0ZWQgZnVuY3Rpb25hbGl0eSBoYXMgYmVlbiBpbXBsZW1lbnRlZC48YnIvPgorICAgICAqIFRoZSByaWdodCB3YXkgdG8gdXNlIGl0IGlzOgorICAgICAqIDxwcmU+CisgICAgICogcHVibGljIHZvaWQgdGVzdFhYWCgpIHsKKyAgICAgKiAgIGlmIChHcm9vdnlUZXN0Q2FzZS5ub3RZZXRJbXBsZW1lbnRlZCh0aGlzKSkgcmV0dXJuOworICAgICAqICAgLi4uIHRoZSByZWFsIChub3cgZmFpbGluZykgdW5pdCB0ZXN0CisgICAgICogfQorICAgICAqIDwvcHJlPgorICAgICAqIElkZWEgY29waWVkIGZyb20gSHRtbFVuaXQgKG1hbnkgdGhhbmtzIHRvIE1hcmMgR3VpbGxlbW90KS4KKyAgICAgKiBGdXR1cmUgdmVyc2lvbnMgbWF5YmUgYXZhaWxhYmxlIGluIHRoZSBKVW5pdCBkaXN0cm8uCisgICAgICogVGhlIHB1cnBvc2Ugb2YgcHJvdmlkaW5nIGEgJ3N0YXRpYycgdmVyc2lvbiBpcyBzdWNoIHRoYXQgeW91IGNhbiB1c2UgdGhlCisgICAgICogZmVhdHVyZSBldmVuIGlmIG5vdCBzdWJjbGFzc2luZyBHcm9vdnlUZXN0Q2FzZS4KKyAgICAgKiBAcmV0dXJuIDxmYWxzZT4gd2hlbiBub3QgaXRzZWxmIGFscmVhZHkgaW4gdGhlIGNhbGwgc3RhY2sKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gbm90WWV0SW1wbGVtZW50ZWQoVGVzdENhc2UgY2FsbGVyKSB7CisgICAgICAgIGlmIChub3RZZXRJbXBsZW1lbnRlZEZsYWcuZ2V0KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIG5vdFlldEltcGxlbWVudGVkRmxhZy5zZXQoQm9vbGVhbi5UUlVFKTsKKworICAgICAgICBmaW5hbCBNZXRob2QgdGVzdE1ldGhvZCA9IGZpbmRSdW5uaW5nSlVuaXRUZXN0TWV0aG9kKGNhbGxlci5nZXRDbGFzcygpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxvZy5pbmZvKCJSdW5uaW5nICIgKyB0ZXN0TWV0aG9kLmdldE5hbWUoKSArICIgYXMgbm90IHlldCBpbXBsZW1lbnRlZCIpOworICAgICAgICAgICAgdGVzdE1ldGhvZC5pbnZva2UoY2FsbGVyLCBuZXcgQ2xhc3NbXSB7fSk7CisgICAgICAgICAgICBmYWlsKHRlc3RNZXRob2QuZ2V0TmFtZSgpICsgIiBpcyBtYXJrZWQgYXMgbm90IHlldCBpbXBsZW1lbnRlZCBidXQgcGFzc2VzIHVuZXhwZWN0ZWRseSIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nLmluZm8odGVzdE1ldGhvZC5nZXROYW1lKCkgKyAiIGZhaWxzIHdoaWNoIGlzIGV4cGVjdGVkIGFzIGl0IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKKyAgICAgICAgICAgIC8vIG1ldGhvZCBleGVjdXRpb24gZmFpbGVkLCBpdCBpcyByZWFsbHkgIm5vdCB5ZXQgaW1wbGVtZW50ZWQiCisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgICBub3RZZXRJbXBsZW1lbnRlZEZsYWcuc2V0KG51bGwpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3Igc3ViY2xhc3NlcyBvZiBHcm9vdnlUZXN0Q2FzZSwgaWRlbnRpY2FsIHRvCisgICAgICogPHByZT4gR3Jvb3Z5VGVzdENhc2Uubm90WWV0SW1wbGVtZW50ZWQodGhpcyk7IDwvcHJlPi4KKyAgICAgKiBAc2VlICNub3RZZXRJbXBsZW1lbnRlZChqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UpCisgICAgICogQHJldHVybiAgPGZhbHNlPiB3aGVuIG5vdCBpdHNlbGYgYWxyZWFkeSBpbiB0aGUgY2FsbCBzdGFjaworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG5vdFlldEltcGxlbWVudGVkKCkgeworICAgICAgICByZXR1cm4gbm90WWV0SW1wbGVtZW50ZWQodGhpcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRnJvbSBKVW5pdC4gRmluZHMgZnJvbSB0aGUgY2FsbCBzdGFjayB0aGUgYWN0aXZlIHJ1bm5pbmcgSlVuaXQgdGVzdCBjYXNlCisgICAgICogQHJldHVybiB0aGUgdGVzdCBjYXNlIG1ldGhvZAorICAgICAqIEB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiBpZiBubyBtZXRob2QgY291bGQgYmUgZm91bmQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgTWV0aG9kIGZpbmRSdW5uaW5nSlVuaXRUZXN0TWV0aG9kKENsYXNzIGNhbGxlcikgeworICAgICAgICBmaW5hbCBDbGFzc1tdIGFyZ3MgPSBuZXcgQ2xhc3NbXSB7fTsKKworICAgICAgICAvLyBzZWFyY2ggdGhlIGluaWFsIGp1bml0IHRlc3QKKyAgICAgICAgZmluYWwgVGhyb3dhYmxlIHQgPSBuZXcgRXhjZXB0aW9uKCk7CisgICAgICAgIGZvciAoaW50IGk9dC5nZXRTdGFja1RyYWNlKCkubGVuZ3RoLTE7IGk+PTA7IC0taSkgeworICAgICAgICAgICAgZmluYWwgU3RhY2tUcmFjZUVsZW1lbnQgZWxlbWVudCA9IHQuZ2V0U3RhY2tUcmFjZSgpW2ldOworICAgICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0Q2xhc3NOYW1lKCkuZXF1YWxzKGNhbGxlci5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgTWV0aG9kIG0gPSBjYWxsZXIuZ2V0TWV0aG9kKGVsZW1lbnQuZ2V0TWV0aG9kTmFtZSgpLCBhcmdzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzUHVibGljVGVzdE1ldGhvZChtKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGNhbid0IGFjY2VzcywgaWdub3JlIGl0CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJObyBKVW5pdCB0ZXN0IGNhc2UgbWV0aG9kIGZvdW5kIGluIGNhbGwgc3RhY2siKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEZyb20gSnVuaXQuIFRlc3QgaWYgdGhlIG1ldGhvZCBpcyBhIGp1bml0IHRlc3QuCisgICAgICogQHBhcmFtIG1ldGhvZCB0aGUgbWV0aG9kCisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEganVuaXQgdGVzdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzUHVibGljVGVzdE1ldGhvZChmaW5hbCBNZXRob2QgbWV0aG9kKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gbWV0aG9kLmdldE5hbWUoKTsKKyAgICAgICAgZmluYWwgQ2xhc3NbXSBwYXJhbWV0ZXJzID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7CisgICAgICAgIGZpbmFsIENsYXNzIHJldHVyblR5cGUgPSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpOworCisgICAgICAgIHJldHVybiBwYXJhbWV0ZXJzLmxlbmd0aCA9PSAwICYmIG5hbWUuc3RhcnRzV2l0aCgidGVzdCIpCisgICAgICAgICAgICAmJiByZXR1cm5UeXBlLmVxdWFscyhWb2lkLlRZUEUpCisgICAgICAgICAgICAmJiBNb2RpZmllci5pc1B1YmxpYyhtZXRob2QuZ2V0TW9kaWZpZXJzKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRFcXVhbHMoU3RyaW5nIG1lc3NhZ2UsIE9iamVjdCBleHBlY3RlZCwgT2JqZWN0IGFjdHVhbCkgeworICAgICAgICBpZiAoZXhwZWN0ZWQgPT0gbnVsbCAmJiBhY3R1YWwgPT0gbnVsbCkKKwkJCXJldHVybjsKKwkJaWYgKGV4cGVjdGVkICE9IG51bGwgJiYgRGVmYXVsdFR5cGVUcmFuc2Zvcm1hdGlvbi5jb21wYXJlRXF1YWwoZXhwZWN0ZWQsIGFjdHVhbCkpCisJCQlyZXR1cm47CisJCWZhaWxOb3RFcXVhbHMobWVzc2FnZSwgZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydEVxdWFscyhPYmplY3QgZXhwZWN0ZWQsIE9iamVjdCBhY3R1YWwpIHsKKwkgICAgYXNzZXJ0RXF1YWxzKG51bGwsIGV4cGVjdGVkLCBhY3R1YWwpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRFcXVhbHMoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgYWN0dWFsKSB7CisJICAgIGFzc2VydEVxdWFscyhudWxsLCBleHBlY3RlZCwgYWN0dWFsKTsKKwl9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUaHJlYWRMb2NhbCBub3RZZXRJbXBsZW1lbnRlZEZsYWcgPSBuZXcgVGhyZWFkTG9jYWwoKTsKKworICAgIHByaXZhdGUgVGhyb3dhYmxlIHVud3JhcCAoR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbiBncmUpIHsKKyAgICAgICAgVGhyb3dhYmxlIHRoID0gZ3JlOworICAgICAgICBpZiAodGguZ2V0Q2F1c2UoKSAhPSBudWxsICYmIHRoLmdldENhdXNlKCkgIT0gZ3JlKSB0aCA9IHRoLmdldENhdXNlKCk7CisgICAgICAgIGlmICh0aCAhPSBncmUgJiYgKHRoIGluc3RhbmNlb2YgR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbikpIHJldHVybiB1bndyYXAoKEdyb292eVJ1bnRpbWVFeGNlcHRpb24pIHRoKTsKKyAgICAgICAgcmV0dXJuIHRoOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdXRpbC9Hcm9vdnlUZXN0U3VpdGUuamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdXRpbC9Hcm9vdnlUZXN0U3VpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTFhMWFjCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91dGlsL0dyb292eVRlc3RTdWl0ZS5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBncm9vdnkudXRpbDsKKworaW1wb3J0IGdyb292eS5sYW5nLkdyb292eUNsYXNzTG9hZGVyOworaW1wb3J0IGdyb292eS5sYW5nLlNjcmlwdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5TY3JpcHRUZXN0QWRhcHRlcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworCisvKioKKyAqIEEgVGVzdFN1aXRlIHdoaWNoIHdpbGwgcnVuIGEgR3Jvb3Z5IHVuaXQgdGVzdCBjYXNlIGluc2lkZSBhbnkgSmF2YSBJREUKKyAqIGVpdGhlciBhcyBhIHVuaXQgdGVzdCBjYXNlIG9yIGFzIGFuIGFwcGxpY2F0aW9uLgorICogPHAvPgorICogWW91IGNhbiBzcGVjaWZ5IHRoZSBHcm9vdnlVbml0VGVzdCB0byBydW4gYnkgcnVubmluZyB0aGlzIGNsYXNzIGFzIGFuIGFwcHBsaWNhdGlvbgorICogYW5kIHNwZWNpZnlpbmcgdGhlIHNjcmlwdCB0byBydW4gb24gdGhlIGNvbW1hbmQgbGluZS4KKyAqIDxwLz4KKyAqIDxjb2RlPgorICogamF2YSBncm9vdnkudXRpbC5Hcm9vdnlUZXN0U3VpdGUgc3JjL3Rlc3QvRm9vLmdyb292eQorICogPC9jb2RlPgorICogPHAvPgorICogT3IgdG8gcnVuIHRoZSB0ZXN0IHN1aXRlIGFzIGEgdW5pdCB0ZXN0IHN1aXRlIGluIGFuIElERSB5b3UgY2FuIHVzZQorICogdGhlICd0ZXN0JyBzeXN0ZW0gcHJvcGVydHkgdG8gZGVmaW5lIHRoZSB0ZXN0IHNjcmlwdCB0byBydW4uCisgKiBlLmcuIHBhc3MgdGhpcyBpbnRvIHRoZSBKVk0gd2hlbiB0aGUgdW5pdCB0ZXN0IHBsdWdpbiBydW5zLi4uCisgKiA8cC8+CisgKiA8Y29kZT4KKyAqIC1EdGVzdD1zcmMvdGVzdC9Gb28uZ3Jvb3Z5CisgKiA8L2NvZGU+CisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIEdyb292eVRlc3RTdWl0ZSBleHRlbmRzIFRlc3RTdWl0ZSB7CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBmaWxlID0gbnVsbDsKKworICAgIHByb3RlY3RlZCBmaW5hbCBHcm9vdnlDbGFzc0xvYWRlciBsb2FkZXIgPSBuZXcgR3Jvb3Z5Q2xhc3NMb2FkZXIoR3Jvb3Z5VGVzdFN1aXRlLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBpZiAoYXJncy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBmaWxlID0gYXJnc1swXTsKKyAgICAgICAgfQorICAgICAgICBUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisgICAgICAgIEdyb292eVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBHcm9vdnlUZXN0U3VpdGUoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN1aXRlLmxvYWRUZXN0U3VpdGUoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDb3VsZCBub3QgY3JlYXRlIHRoZSB0ZXN0IHN1aXRlOiAiICsgZSwgZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1aXRlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxvYWRUZXN0U3VpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KCJ0ZXN0IiwgZmlsZSk7CisgICAgICAgIGlmIChmaWxlTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm8gZmlsZW5hbWUgZ2l2ZW4gaW4gdGhlICd0ZXN0JyBzeXN0ZW0gcHJvcGVydHkgc28gY2Fubm90IHJ1biBhIEdyb292eSB1bml0IHRlc3QiKTsKKyAgICAgICAgfQorICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbXBpbGluZzogIiArIGZpbGVOYW1lKTsKKyAgICAgICAgQ2xhc3MgdHlwZSA9IGNvbXBpbGUoZmlsZU5hbWUpOworICAgICAgICBTdHJpbmdbXSBhcmdzID0ge307CisgICAgICAgIGlmICghVGVzdC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpICYmIFNjcmlwdC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpKSB7CisgICAgICAgICAgICAvLyBsZXRzIHRyZWF0IHRoZSBzY3JpcHQgYXMgYSBUZXN0CisgICAgICAgICAgICBhZGRUZXN0KG5ldyBTY3JpcHRUZXN0QWRhcHRlcih0eXBlLCBhcmdzKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhZGRUZXN0U3VpdGUodHlwZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3MgY29tcGlsZShTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbG9hZGVyLnBhcnNlQ2xhc3MobmV3IEZpbGUoZmlsZU5hbWUpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvSUZpbGVOYW1lRmluZGVyLmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvSUZpbGVOYW1lRmluZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRjZGEzYwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdXRpbC9JRmlsZU5hbWVGaW5kZXIuamF2YQpAQCAtMCwwICsxLDI0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBncm9vdnkudXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgaW50ZXJmYWNlIElGaWxlTmFtZUZpbmRlciB7CisgICAgTGlzdCBnZXRGaWxlTmFtZXMoU3RyaW5nIGJhc2VkaXIsIFN0cmluZyBwYXR0ZXJuKTsKKyAgICBMaXN0IGdldEZpbGVOYW1lcyhTdHJpbmcgYmFzZWRpciwgU3RyaW5nIHBhdHRlcm4sIFN0cmluZyBleGNsdWRlc1BhdHRlcm4pOworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91dGlsL0luZGVudFByaW50ZXIuamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdXRpbC9JbmRlbnRQcmludGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc1MGE4YgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdXRpbC9JbmRlbnRQcmludGVyLmphdmEKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGdyb292eS51dGlsOworCitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKKworLyoqCisgKiBBIGhlbHBlciBjbGFzcyBmb3IgcHJpbnRpbmcgaW5kZW50ZWQgdGV4dAorICogCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgSW5kZW50UHJpbnRlciB7CisKKyAgICBwcml2YXRlIGludCBpbmRlbnRMZXZlbDsKKyAgICBwcml2YXRlIFN0cmluZyBpbmRlbnQ7CisgICAgcHJpdmF0ZSBQcmludFdyaXRlciBvdXQ7CisKKyAgICBwdWJsaWMgSW5kZW50UHJpbnRlcigpIHsKKyAgICAgICAgdGhpcyhuZXcgUHJpbnRXcml0ZXIoU3lzdGVtLm91dCksICIgICIpOworICAgIH0KKworICAgIHB1YmxpYyBJbmRlbnRQcmludGVyKFByaW50V3JpdGVyIG91dCkgeworICAgICAgICB0aGlzKG91dCwgIiAgIik7CisgICAgfQorCisgICAgcHVibGljIEluZGVudFByaW50ZXIoUHJpbnRXcml0ZXIgb3V0LCBTdHJpbmcgaW5kZW50KSB7CisgICAgICAgIGlmIChvdXQgPT0gbnVsbCkgeworICAgICAgICAgICAgLyoqIEB0b2RvIHRlbXBvcmFyeSBoYWNrICovCisgICAgICAgICAgICBvdXQgPSBuZXcgUHJpbnRXcml0ZXIoU3lzdGVtLm91dCk7CisgICAgICAgICAgICAvL3Rocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk11c3Qgc3BlY2lmeSBhIFByaW50V3JpdGVyIik7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5vdXQgPSBvdXQ7CisgICAgICAgIHRoaXMuaW5kZW50ID0gaW5kZW50OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByaW50bG4oU3RyaW5nIHRleHQpIHsKKyAgICAgICAgb3V0LnByaW50KHRleHQpOworICAgICAgICBvdXQucHJpbnRsbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByaW50KFN0cmluZyB0ZXh0KSB7CisgICAgICAgIG91dC5wcmludCh0ZXh0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcmludEluZGVudCgpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnRMZXZlbDsgaSsrKSB7CisgICAgICAgICAgICBvdXQucHJpbnQoaW5kZW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByaW50bG4oKSB7CisgICAgICAgIG91dC5wcmludGxuKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5jcmVtZW50SW5kZW50KCkgeworICAgICAgICArK2luZGVudExldmVsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRlY3JlbWVudEluZGVudCgpIHsKKyAgICAgICAgLS1pbmRlbnRMZXZlbDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEluZGVudExldmVsKCkgeworICAgICAgICByZXR1cm4gaW5kZW50TGV2ZWw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SW5kZW50TGV2ZWwoaW50IGluZGVudExldmVsKSB7CisgICAgICAgIHRoaXMuaW5kZW50TGV2ZWwgPSBpbmRlbnRMZXZlbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHsKKyAgICAgICAgb3V0LmZsdXNoKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91dGlsL01hcEVudHJ5LmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvTWFwRW50cnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDRhMDYwCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91dGlsL01hcEVudHJ5LmphdmEKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGdyb292eS51dGlsOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS50eXBlaGFuZGxpbmcuRGVmYXVsdFR5cGVUcmFuc2Zvcm1hdGlvbjsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgbGlzdCBvZiBJbnRlZ2VyIG9iamVjdHMga2V5IGEgc3BlY2lmaWVkIE9iamVjdCB1cCB0byBidXQgbm90IGluY2x1ZGluZworICogYSBnaXZlbiBhbmQgdG8uCisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBNYXBFbnRyeSBpbXBsZW1lbnRzIE1hcC5FbnRyeSB7CisKKyAgICBwcml2YXRlIE9iamVjdCBrZXk7CisgICAgcHJpdmF0ZSBPYmplY3QgdmFsdWU7CisKKyAgICBwdWJsaWMgTWFwRW50cnkoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIHRoaXMua2V5ID0ga2V5OworICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCB0aGF0KSB7CisgICAgICAgIGlmICh0aGF0IGluc3RhbmNlb2YgTWFwRW50cnkpIHsKKyAgICAgICAgICAgIHJldHVybiBlcXVhbHMoKE1hcEVudHJ5KSB0aGF0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE1hcEVudHJ5IHRoYXQpIHsKKyAgICAgICAgcmV0dXJuIERlZmF1bHRUeXBlVHJhbnNmb3JtYXRpb24uY29tcGFyZUVxdWFsKHRoaXMua2V5LCB0aGF0LmtleSkgJiYgRGVmYXVsdFR5cGVUcmFuc2Zvcm1hdGlvbi5jb21wYXJlRXF1YWwodGhpcy52YWx1ZSwgdGhhdC52YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIGhhc2goa2V5KSBeIGhhc2godmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiIiArIGtleSArICI6IiArIHZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0S2V5KCkgeworICAgICAgICByZXR1cm4ga2V5OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEtleShPYmplY3Qga2V5KSB7CisgICAgICAgIHRoaXMua2V5ID0ga2V5OworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IHNldFZhbHVlKE9iamVjdCB2YWx1ZSkgeworICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIGhhbmRsZSBvYmplY3QgaGFzaGVzIGZvciBwb3NzaWJseSBudWxsIHZhbHVlcworICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgaGFzaChPYmplY3Qgb2JqZWN0KSB7CisgICAgICAgIHJldHVybiAob2JqZWN0ID09IG51bGwpID8gMHhiYWJlIDogb2JqZWN0Lmhhc2hDb2RlKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvTm9kZS5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91dGlsL05vZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWEzODcwCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91dGlsL05vZGUuamF2YQpAQCAtMCwwICsxLDM2MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGdyb292eS51dGlsOworCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuRGVsZWdhdGluZ01ldGFDbGFzczsKK2ltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlTeXN0ZW07CitpbXBvcnQgZ3Jvb3Z5LmxhbmcuTWV0YUNsYXNzOworaW1wb3J0IGdyb292eS54bWwuUU5hbWU7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLkludm9rZXJIZWxwZXI7CisKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC4qOworCisvKioKKyAqIFJlcHJlc2VudHMgYW4gYXJiaXRyYXJ5IHRyZWUgbm9kZSB3aGljaCBjYW4gYmUgdXNlZCBmb3Igc3RydWN0dXJlZCBtZXRhZGF0YSBvciBhbnkgYXJiaXRyYXJ5IFhNTC1saWtlIHRyZWUuCisgKiBBIG5vZGUgY2FuIGhhdmUgYSBuYW1lLCBhIHZhbHVlIGFuZCBhbiBvcHRpb25hbCBNYXAgb2YgYXR0cmlidXRlcy4KKyAqIFR5cGljYWxseSB0aGUgbmFtZSBpcyBhIFN0cmluZyBhbmQgYSB2YWx1ZSBpcyBlaXRoZXIgYSBTdHJpbmcgb3IgYSBMaXN0IG9mIG90aGVyIE5vZGVzLAorICogdGhvdWdoIHRoZSB0eXBlcyBhcmUgZXh0ZW5zaWJsZSB0byBwcm92aWRlIGEgZmxleGlibGUgc3RydWN0dXJlLCBlLmcuIHlvdSBjb3VsZCB1c2UgYQorICogUU5hbWUgYXMgdGhlIG5hbWUgd2hpY2ggaW5jbHVkZXMgYSBuYW1lc3BhY2UgVVJJIGFuZCBhIGxvY2FsIG5hbWUuIE9yIGEgSk1YIE9iamVjdE5hbWUgZXRjLgorICogU28gdGhpcyBjbGFzcyBjYW4gcmVwcmVzZW50IG1ldGFkYXRhIGxpa2Uge2ZvbyBhPTEgYj0iYWJjIn0gb3IgbmVzdGVkIG1ldGFkYXRhIGxpa2Uge2ZvbyBhPTEgYj0iMTIzIiB7IGJhciB4PTEyIHRleHQ9ImhlbGxvIiB9fQorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAYXV0aG9yIFBhdWwgS2luZworICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgTm9kZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKyAgICBzdGF0aWMgeworICAgICAgICAvLyB3cmFwIHRoZSBzdGFuZGFyZCBNZXRhQ2xhc3Mgd2l0aCB0aGUgZGVsZWdhdGUKKyAgICAgICAgc2V0TWV0YUNsYXNzKEdyb292eVN5c3RlbS5nZXRNZXRhQ2xhc3NSZWdpc3RyeSgpLmdldE1ldGFDbGFzcyhOb2RlLmNsYXNzKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNDEyMTEzNDc1MzI3MDU0MjY0M0w7CisgICAgcHJpdmF0ZSBOb2RlIHBhcmVudDsKKyAgICBwcml2YXRlIE9iamVjdCBuYW1lOworICAgIHByaXZhdGUgTWFwIGF0dHJpYnV0ZXM7CisgICAgcHJpdmF0ZSBPYmplY3QgdmFsdWU7CisKKyAgICBwdWJsaWMgTm9kZShOb2RlIHBhcmVudCwgT2JqZWN0IG5hbWUpIHsKKyAgICAgICAgdGhpcyhwYXJlbnQsIG5hbWUsIG5ldyBOb2RlTGlzdCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTm9kZShOb2RlIHBhcmVudCwgT2JqZWN0IG5hbWUsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICB0aGlzKHBhcmVudCwgbmFtZSwgbmV3IEhhc2hNYXAoKSwgdmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBOb2RlKE5vZGUgcGFyZW50LCBPYmplY3QgbmFtZSwgTWFwIGF0dHJpYnV0ZXMpIHsKKyAgICAgICAgdGhpcyhwYXJlbnQsIG5hbWUsIGF0dHJpYnV0ZXMsIG5ldyBOb2RlTGlzdCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTm9kZShOb2RlIHBhcmVudCwgT2JqZWN0IG5hbWUsIE1hcCBhdHRyaWJ1dGVzLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7CisgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKworICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIE9iamVjdCBwYXJlbnRWYWx1ZSA9IHBhcmVudC52YWx1ZSgpOworICAgICAgICAgICAgTGlzdCBwYXJlbnRMaXN0OworICAgICAgICAgICAgaWYgKHBhcmVudFZhbHVlIGluc3RhbmNlb2YgTGlzdCkgeworICAgICAgICAgICAgICAgIHBhcmVudExpc3QgPSAoTGlzdCkgcGFyZW50VmFsdWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBhcmVudExpc3QgPSBuZXcgTm9kZUxpc3QoKTsKKyAgICAgICAgICAgICAgICBwYXJlbnRMaXN0LmFkZChwYXJlbnRWYWx1ZSk7CisgICAgICAgICAgICAgICAgcGFyZW50LnNldFZhbHVlKHBhcmVudExpc3QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGFyZW50TGlzdC5hZGQodGhpcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgTm9kZSBhcHBlbmROb2RlKE9iamVjdCBuYW1lLCBNYXAgYXR0cmlidXRlcykgeworICAgICAgICByZXR1cm4gbmV3IE5vZGUodGhpcywgbmFtZSwgYXR0cmlidXRlcyk7CisgICAgfQorCisgICAgcHVibGljIE5vZGUgYXBwZW5kTm9kZShPYmplY3QgbmFtZSwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIHJldHVybiBuZXcgTm9kZSh0aGlzLCBuYW1lLCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIE5vZGUgYXBwZW5kTm9kZShPYmplY3QgbmFtZSwgTWFwIGF0dHJpYnV0ZXMsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gbmV3IE5vZGUodGhpcywgbmFtZSwgYXR0cmlidXRlcywgdmFsdWUpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2V0TWV0YUNsYXNzKGZpbmFsIE1ldGFDbGFzcyBtZXRhQ2xhc3MpIHsKKyAgICAgICAgZmluYWwgTWV0YUNsYXNzIG5ld01ldGFDbGFzcyA9IG5ldyBEZWxlZ2F0aW5nTWV0YUNsYXNzKG1ldGFDbGFzcykgeworICAgICAgICAgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAgICAgICAgKiBAc2VlIGdyb292eS5sYW5nLkRlbGVnYXRpbmdNZXRhQ2xhc3MjZ2V0QXR0cmlidXRlKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcpCisgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGUoZmluYWwgT2JqZWN0IG9iamVjdCwgZmluYWwgU3RyaW5nIGF0dHJpYnV0ZSkgeworICAgICAgICAgICAgICAgIE5vZGUgbiA9IChOb2RlKSBvYmplY3Q7CisgICAgICAgICAgICAgICAgcmV0dXJuIG4uZ2V0KCJAIiArIGF0dHJpYnV0ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgICAgICAgICAqIEBzZWUgZ3Jvb3Z5LmxhbmcuTWV0YUNsYXNzI3NldEF0dHJpYnV0ZShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoZmluYWwgT2JqZWN0IG9iamVjdCwgZmluYWwgU3RyaW5nIGF0dHJpYnV0ZSwgZmluYWwgT2JqZWN0IG5ld1ZhbHVlKSB7CisgICAgICAgICAgICAgICAgTm9kZSBuID0gKE5vZGUpIG9iamVjdDsKKyAgICAgICAgICAgICAgICBuLmF0dHJpYnV0ZXMoKS5wdXQoYXR0cmlidXRlLCBuZXdWYWx1ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgICAgICAgICogQHNlZSBncm9vdnkubGFuZy5NZXRhQ2xhc3MjZ2V0UHJvcGVydHkoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZykKKyAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkgeworICAgICAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBOb2RlKSB7CisgICAgICAgICAgICAgICAgICAgIE5vZGUgbiA9IChOb2RlKSBvYmplY3Q7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLmdldChwcm9wZXJ0eSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRQcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAgICAgICAgICogQHNlZSBncm9vdnkubGFuZy5NZXRhQ2xhc3Mjc2V0UHJvcGVydHkoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgbmV3VmFsdWUpIHsKKyAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkuc3RhcnRzV2l0aCgiQCIpKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyaWJ1dGUgPSBwcm9wZXJ0eS5zdWJzdHJpbmcoMSk7CisgICAgICAgICAgICAgICAgICAgIE5vZGUgbiA9IChOb2RlKSBvYmplY3Q7CisgICAgICAgICAgICAgICAgICAgIG4uYXR0cmlidXRlcygpLnB1dChhdHRyaWJ1dGUsIG5ld1ZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZWxlZ2F0ZS5zZXRQcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5LCBuZXdWYWx1ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfTsKKyAgICAgICAgR3Jvb3Z5U3lzdGVtLmdldE1ldGFDbGFzc1JlZ2lzdHJ5KCkuc2V0TWV0YUNsYXNzKE5vZGUuY2xhc3MsIG5ld01ldGFDbGFzcyk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0ZXh0KCkgeworICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKyAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKSB2YWx1ZTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIENvbGxlY3Rpb24pIHsKKyAgICAgICAgICAgIENvbGxlY3Rpb24gY29sbCA9IChDb2xsZWN0aW9uKSB2YWx1ZTsKKyAgICAgICAgICAgIFN0cmluZyBwcmV2aW91c1RleHQgPSBudWxsOworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG51bGw7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIE9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIFN0cmluZykgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2hpbGRUZXh0ID0gKFN0cmluZykgY2hpbGQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c1RleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNUZXh0ID0gY2hpbGRUZXh0OworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQocHJldmlvdXNUZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoY2hpbGRUZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChidWZmZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzVGV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcmV2aW91c1RleHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAiIjsKKyAgICB9CisKKworICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIGNoaWxkcmVuKCkuaXRlcmF0b3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdCBjaGlsZHJlbigpIHsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTm9kZUxpc3QoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBMaXN0KSB7CisgICAgICAgICAgICByZXR1cm4gKExpc3QpIHZhbHVlOworICAgICAgICB9CisgICAgICAgIC8vIHdlJ3JlIHByb2JhYmx5IGp1c3QgYSBTdHJpbmcKKyAgICAgICAgTGlzdCByZXN1bHQgPSBuZXcgTm9kZUxpc3QoKTsKKyAgICAgICAgcmVzdWx0LmFkZCh2YWx1ZSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljIE1hcCBhdHRyaWJ1dGVzKCkgeworICAgICAgICByZXR1cm4gYXR0cmlidXRlczsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGF0dHJpYnV0ZShPYmplY3Qga2V5KSB7CisgICAgICAgIHJldHVybiAoYXR0cmlidXRlcyAhPSBudWxsKSA/IGF0dHJpYnV0ZXMuZ2V0KGtleSkgOiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgbmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCB2YWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKE9iamVjdCB2YWx1ZSkgeworICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIE5vZGUgcGFyZW50KCkgeworICAgICAgICByZXR1cm4gcGFyZW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb3ZpZGVzIGxvb2t1cCBvZiBlbGVtZW50cyBieSBub24tbmFtZXNwYWNlZCBuYW1lCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5IHRoZSBuYW1lIChvciBzaG9ydGN1dCBrZXkpIG9mIHRoZSBub2RlKHMpIG9mIGludGVyZXN0CisgICAgICogQHJldHVybiB0aGUgbm9kZXMgd2hpY2ggbWF0Y2gga2V5CisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXQoU3RyaW5nIGtleSkgeworICAgICAgICBpZiAoa2V5ICE9IG51bGwgJiYga2V5LmNoYXJBdCgwKSA9PSAnQCcpIHsKKyAgICAgICAgICAgIFN0cmluZyBhdHRyaWJ1dGVOYW1lID0ga2V5LnN1YnN0cmluZygxKTsKKyAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVzKCkuZ2V0KGF0dHJpYnV0ZU5hbWUpOworICAgICAgICB9CisgICAgICAgIGlmICgiLi4iLmVxdWFscyhrZXkpKSB7CisgICAgICAgICAgICByZXR1cm4gcGFyZW50KCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCIqIi5lcXVhbHMoa2V5KSkgeworICAgICAgICAgICAgcmV0dXJuIGNoaWxkcmVuKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCIqKiIuZXF1YWxzKGtleSkpIHsKKyAgICAgICAgICAgIHJldHVybiBkZXB0aEZpcnN0KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdldEJ5TmFtZShrZXkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb3ZpZGVzIGxvb2t1cCBvZiBlbGVtZW50cyBieSBRTmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBRTmFtZSBvZiBpbnRlcmVzdAorICAgICAqIEByZXR1cm4gdGhlIG5vZGVzIG1hdGNoaW5nIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgTm9kZUxpc3QgZ2V0QXQoUU5hbWUgbmFtZSkgeworICAgICAgICBOb2RlTGlzdCBhbnN3ZXIgPSBuZXcgTm9kZUxpc3QoKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIE9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOworICAgICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgTm9kZSkgeworICAgICAgICAgICAgICAgIE5vZGUgY2hpbGROb2RlID0gKE5vZGUpIGNoaWxkOworICAgICAgICAgICAgICAgIE9iamVjdCBjaGlsZE5vZGVOYW1lID0gY2hpbGROb2RlLm5hbWUoKTsKKyAgICAgICAgICAgICAgICBpZiAobmFtZS5tYXRjaGVzKGNoaWxkTm9kZU5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIGFuc3dlci5hZGQoY2hpbGROb2RlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFuc3dlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlcyBsb29rdXAgb2YgZWxlbWVudHMgYnkgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIGludGVyZXN0CisgICAgICogQHJldHVybiB0aGUgbm9kZXMgbWF0Y2hpbmcgbmFtZQorICAgICAqLworICAgIHByaXZhdGUgTm9kZUxpc3QgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIE5vZGVMaXN0IGFuc3dlciA9IG5ldyBOb2RlTGlzdCgpOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7CisgICAgICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBOb2RlKSB7CisgICAgICAgICAgICAgICAgTm9kZSBjaGlsZE5vZGUgPSAoTm9kZSkgY2hpbGQ7CisgICAgICAgICAgICAgICAgT2JqZWN0IGNoaWxkTm9kZU5hbWUgPSBjaGlsZE5vZGUubmFtZSgpOworICAgICAgICAgICAgICAgIGlmIChjaGlsZE5vZGVOYW1lIGluc3RhbmNlb2YgUU5hbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgUU5hbWUgcW4gPSAoUU5hbWUpIGNoaWxkTm9kZU5hbWU7CisgICAgICAgICAgICAgICAgICAgIGlmIChxbi5tYXRjaGVzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbnN3ZXIuYWRkKGNoaWxkTm9kZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKGNoaWxkTm9kZU5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIGFuc3dlci5hZGQoY2hpbGROb2RlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFuc3dlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlIGEgY29sbGVjdGlvbiBvZiBhbGwgdGhlIG5vZGVzIGluIHRoZSB0cmVlCisgICAgICogdXNpbmcgYSBkZXB0aCBmaXJzdCB0cmF2ZXJzYWwuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIChkZXB0aC1maXJzdCkgb3JkZXJlZCBub2RlcworICAgICAqLworICAgIHB1YmxpYyBMaXN0IGRlcHRoRmlyc3QoKSB7CisgICAgICAgIExpc3QgYW5zd2VyID0gbmV3IE5vZGVMaXN0KCk7CisgICAgICAgIGFuc3dlci5hZGQodGhpcyk7CisgICAgICAgIGFuc3dlci5hZGRBbGwoZGVwdGhGaXJzdFJlc3QoKSk7CisgICAgICAgIHJldHVybiBhbnN3ZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBMaXN0IGRlcHRoRmlyc3RSZXN0KCkgeworICAgICAgICBMaXN0IGFuc3dlciA9IG5ldyBOb2RlTGlzdCgpOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBJbnZva2VySGVscGVyLmFzSXRlcmF0b3IodmFsdWUpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIE9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOworICAgICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgTm9kZSkgeworICAgICAgICAgICAgICAgIE5vZGUgY2hpbGROb2RlID0gKE5vZGUpIGNoaWxkOworICAgICAgICAgICAgICAgIExpc3QgY2hpbGRyZW4gPSBjaGlsZE5vZGUuZGVwdGhGaXJzdFJlc3QoKTsKKyAgICAgICAgICAgICAgICBhbnN3ZXIuYWRkKGNoaWxkTm9kZSk7CisgICAgICAgICAgICAgICAgYW5zd2VyLmFkZEFsbChjaGlsZHJlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFuc3dlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlIGEgY29sbGVjdGlvbiBvZiBhbGwgdGhlIG5vZGVzIGluIHRoZSB0cmVlCisgICAgICogdXNpbmcgYSBicmVhZHRoLWZpcnN0IHRyYXZlcnNhbC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgKGJyZWFkdGgtZmlyc3QpIG9yZGVyZWQgbm9kZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdCBicmVhZHRoRmlyc3QoKSB7CisgICAgICAgIExpc3QgYW5zd2VyID0gbmV3IE5vZGVMaXN0KCk7CisgICAgICAgIGFuc3dlci5hZGQodGhpcyk7CisgICAgICAgIGFuc3dlci5hZGRBbGwoYnJlYWR0aEZpcnN0UmVzdCgpKTsKKyAgICAgICAgcmV0dXJuIGFuc3dlcjsKKyAgICB9CisKKyAgICBwcml2YXRlIExpc3QgYnJlYWR0aEZpcnN0UmVzdCgpIHsKKyAgICAgICAgTGlzdCBhbnN3ZXIgPSBuZXcgTm9kZUxpc3QoKTsKKyAgICAgICAgTGlzdCBuZXh0TGV2ZWxDaGlsZHJlbiA9IGdldERpcmVjdENoaWxkcmVuKCk7CisgICAgICAgIHdoaWxlICghbmV4dExldmVsQ2hpbGRyZW4uaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBMaXN0IHdvcmtpbmcgPSBuZXcgTm9kZUxpc3QobmV4dExldmVsQ2hpbGRyZW4pOworICAgICAgICAgICAgbmV4dExldmVsQ2hpbGRyZW4gPSBuZXcgTm9kZUxpc3QoKTsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHdvcmtpbmcuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgTm9kZSBjaGlsZE5vZGUgPSAoTm9kZSkgaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgYW5zd2VyLmFkZChjaGlsZE5vZGUpOworICAgICAgICAgICAgICAgIExpc3QgY2hpbGRyZW4gPSBjaGlsZE5vZGUuZ2V0RGlyZWN0Q2hpbGRyZW4oKTsKKyAgICAgICAgICAgICAgICBuZXh0TGV2ZWxDaGlsZHJlbi5hZGRBbGwoY2hpbGRyZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBhbnN3ZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBMaXN0IGdldERpcmVjdENoaWxkcmVuKCkgeworICAgICAgICBMaXN0IGFuc3dlciA9IG5ldyBOb2RlTGlzdCgpOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBJbnZva2VySGVscGVyLmFzSXRlcmF0b3IodmFsdWUpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIE9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOworICAgICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgTm9kZSkgeworICAgICAgICAgICAgICAgIE5vZGUgY2hpbGROb2RlID0gKE5vZGUpIGNoaWxkOworICAgICAgICAgICAgICAgIGFuc3dlci5hZGQoY2hpbGROb2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYW5zd2VyOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBuYW1lICsgIlthdHRyaWJ1dGVzPSIgKyBhdHRyaWJ1dGVzICsgIjsgdmFsdWU9IiArIHZhbHVlICsgIl0iOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByaW50KFByaW50V3JpdGVyIG91dCkgeworICAgICAgICBuZXcgTm9kZVByaW50ZXIob3V0KS5wcmludCh0aGlzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvTm9kZUJ1aWxkZXIuamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdXRpbC9Ob2RlQnVpbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3OWViNmUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvTm9kZUJ1aWxkZXIuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgZ3Jvb3Z5LnV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogQSBoZWxwZXIgY2xhc3MgZm9yIGNyZWF0aW5nIG5lc3RlZCB0cmVlcyBvZiBOb2RlIG9iamVjdHMgZm9yIAorICogaGFuZGxpbmcgYXJiaXRyYXJ5IGRhdGEKKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIE5vZGVCdWlsZGVyIGV4dGVuZHMgQnVpbGRlclN1cHBvcnQgeworCisgICAgcHVibGljIHN0YXRpYyBOb2RlQnVpbGRlciBuZXdJbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBOb2RlQnVpbGRlcigpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50LCBPYmplY3QgY2hpbGQpIHsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZU5vZGUoT2JqZWN0IG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBOb2RlKGdldEN1cnJlbnROb2RlKCksIG5hbWUsIG5ldyBBcnJheUxpc3QoKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVOb2RlKE9iamVjdCBuYW1lLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBOb2RlKGdldEN1cnJlbnROb2RlKCksIG5hbWUsIHZhbHVlKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZU5vZGUoT2JqZWN0IG5hbWUsIE1hcCBhdHRyaWJ1dGVzKSB7CisgICAgICAgIHJldHVybiBuZXcgTm9kZShnZXRDdXJyZW50Tm9kZSgpLCBuYW1lLCBhdHRyaWJ1dGVzLCBuZXcgQXJyYXlMaXN0KCkpOworICAgIH0KKworICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlTm9kZShPYmplY3QgbmFtZSwgTWFwIGF0dHJpYnV0ZXMsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gbmV3IE5vZGUoZ2V0Q3VycmVudE5vZGUoKSwgbmFtZSwgYXR0cmlidXRlcywgdmFsdWUpOworICAgIH0KKworICAgIHByb3RlY3RlZCBOb2RlIGdldEN1cnJlbnROb2RlKCkgeworICAgICAgICByZXR1cm4gKE5vZGUpIGdldEN1cnJlbnQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvTm9kZUxpc3QuamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdXRpbC9Ob2RlTGlzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzZGI0OWIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvTm9kZUxpc3QuamF2YQpAQCAtMCwwICsxLDE2NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGdyb292eS51dGlsOworCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuRGVsZWdhdGluZ01ldGFDbGFzczsKK2ltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlTeXN0ZW07CitpbXBvcnQgZ3Jvb3Z5LmxhbmcuTWV0YUNsYXNzOworaW1wb3J0IGdyb292eS54bWwuUU5hbWU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBBIExpc3QgaW1wbGVtZW50YXRpb24gd2hpY2ggaXMgcmV0dXJuZWQgYnkgcXVlcmllcyBvbiBhIHtAbGluayBOb2RlfQorICogd2hpY2ggcHJvdmlkZXMgc29tZSBYUGF0aCBsaWtlIGhlbHBlciBtZXRob2RzIGZvciBHUGF0aC4KKyAqLworcHVibGljIGNsYXNzIE5vZGVMaXN0IGV4dGVuZHMgQXJyYXlMaXN0IHsKKworICAgIHN0YXRpYyB7CisgICAgICAgIC8vIHdyYXAgdGhlIHN0YW5kYXJkIE1ldGFDbGFzcyB3aXRoIHRoZSBkZWxlZ2F0ZQorICAgICAgICBzZXRNZXRhQ2xhc3MoR3Jvb3Z5U3lzdGVtLmdldE1ldGFDbGFzc1JlZ2lzdHJ5KCkuZ2V0TWV0YUNsYXNzKE5vZGVMaXN0LmNsYXNzKSk7CisgICAgfQorCisgICAgcHVibGljIE5vZGVMaXN0KCkgeworICAgIH0KKworICAgIHB1YmxpYyBOb2RlTGlzdChDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKKyAgICAgICAgc3VwZXIoY29sbGVjdGlvbik7CisgICAgfQorCisgICAgcHVibGljIE5vZGVMaXN0KGludCBzaXplKSB7CisgICAgICAgIHN1cGVyKHNpemUpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2V0TWV0YUNsYXNzKGZpbmFsIE1ldGFDbGFzcyBtZXRhQ2xhc3MpIHsKKyAgICAgICAgZmluYWwgTWV0YUNsYXNzIG5ld01ldGFDbGFzcyA9IG5ldyBEZWxlZ2F0aW5nTWV0YUNsYXNzKG1ldGFDbGFzcykgeworICAgICAgICAgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAgICAgICAgKiBAc2VlIGdyb292eS5sYW5nLkRlbGVnYXRpbmdNZXRhQ2xhc3MjZ2V0QXR0cmlidXRlKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcpCisgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGUoZmluYWwgT2JqZWN0IG9iamVjdCwgZmluYWwgU3RyaW5nIGF0dHJpYnV0ZSkgeworICAgICAgICAgICAgICAgIE5vZGVMaXN0IG5sID0gKE5vZGVMaXN0KSBvYmplY3Q7CisgICAgICAgICAgICAgICAgSXRlcmF0b3IgaXQgPSBubC5pdGVyYXRvcigpOworICAgICAgICAgICAgICAgIExpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgTm9kZSBub2RlID0gKE5vZGUpIGl0Lm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChub2RlLmF0dHJpYnV0ZXMoKS5nZXQoYXR0cmlidXRlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShmaW5hbCBPYmplY3Qgb2JqZWN0LCBmaW5hbCBTdHJpbmcgYXR0cmlidXRlLCBmaW5hbCBPYmplY3QgbmV3VmFsdWUpIHsKKyAgICAgICAgICAgICAgICBOb2RlTGlzdCBubCA9IChOb2RlTGlzdCkgb2JqZWN0OworICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGl0ID0gbmwuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIE5vZGUgbm9kZSA9IChOb2RlKSBpdC5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIG5vZGUuYXR0cmlidXRlcygpLnB1dChhdHRyaWJ1dGUsIG5ld1ZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgICAgICAgICogQHNlZSBncm9vdnkubGFuZy5NZXRhQ2xhc3MjZ2V0UHJvcGVydHkoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZykKKyAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkgeworICAgICAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBOb2RlTGlzdCkgeworICAgICAgICAgICAgICAgICAgICBOb2RlTGlzdCBubCA9IChOb2RlTGlzdCkgb2JqZWN0OworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmwuZ2V0QXQocHJvcGVydHkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0UHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIEdyb292eVN5c3RlbS5nZXRNZXRhQ2xhc3NSZWdpc3RyeSgpLnNldE1ldGFDbGFzcyhOb2RlTGlzdC5jbGFzcywgbmV3TWV0YUNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlcyBsb29rdXAgb2YgZWxlbWVudHMgYnkgbm9uLW5hbWVzcGFjZWQgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9yIHNob3J0Y3V0IGtleSBmb3Igbm9kZXMgb2YgaW50ZXJlc3QKKyAgICAgKiBAcmV0dXJuIHRoZSBub2RlcyBvZiBpbnRlcmVzdCB3aGljaCBtYXRjaCBuYW1lCisgICAgICovCisgICAgcHVibGljIE5vZGVMaXN0IGdldEF0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIE5vZGVMaXN0IGFuc3dlciA9IG5ldyBOb2RlTGlzdCgpOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIE9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOworICAgICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgTm9kZSkgeworICAgICAgICAgICAgICAgIE5vZGUgY2hpbGROb2RlID0gKE5vZGUpIGNoaWxkOworICAgICAgICAgICAgICAgIE9iamVjdCB0ZW1wID0gY2hpbGROb2RlLmdldChuYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAodGVtcCBpbnN0YW5jZW9mIENvbGxlY3Rpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgYW5zd2VyLmFkZEFsbCgoQ29sbGVjdGlvbikgdGVtcCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYW5zd2VyLmFkZCh0ZW1wKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFuc3dlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlcyBsb29rdXAgb2YgZWxlbWVudHMgYnkgUU5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvciBzaG9ydGN1dCBrZXkgZm9yIG5vZGVzIG9mIGludGVyZXN0CisgICAgICogQHJldHVybiB0aGUgbm9kZXMgb2YgaW50ZXJlc3Qgd2hpY2ggbWF0Y2ggbmFtZQorICAgICAqLworICAgIHB1YmxpYyBOb2RlTGlzdCBnZXRBdChRTmFtZSBuYW1lKSB7CisgICAgICAgIE5vZGVMaXN0IGFuc3dlciA9IG5ldyBOb2RlTGlzdCgpOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIE9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOworICAgICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgTm9kZSkgeworICAgICAgICAgICAgICAgIE5vZGUgY2hpbGROb2RlID0gKE5vZGUpIGNoaWxkOworICAgICAgICAgICAgICAgIE5vZGVMaXN0IHRlbXAgPSBjaGlsZE5vZGUuZ2V0QXQobmFtZSk7CisgICAgICAgICAgICAgICAgYW5zd2VyLmFkZEFsbCh0ZW1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYW5zd2VyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHRleHQgdmFsdWUgb2YgYWxsIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUgY29sbGVjdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHRleHQgdmFsdWUgb2YgYWxsIHRoZSBlbGVtZW50cyBpbiB0aGUgY29sbGVjdGlvbiBvciBudWxsCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0ZXh0KCkgeworICAgICAgICBTdHJpbmcgcHJldmlvdXNUZXh0ID0gbnVsbDsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG51bGw7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHRoaXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIFN0cmluZykgeworICAgICAgICAgICAgICAgIHRleHQgPSAoU3RyaW5nKSBjaGlsZDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGQgaW5zdGFuY2VvZiBOb2RlKSB7CisgICAgICAgICAgICAgICAgdGV4dCA9ICgoTm9kZSkgY2hpbGQpLnRleHQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0ZXh0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAocHJldmlvdXNUZXh0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNUZXh0ID0gdGV4dDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoYnVmZmVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQocHJldmlvdXNUZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKHRleHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoYnVmZmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocHJldmlvdXNUZXh0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBwcmV2aW91c1RleHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICIiOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdXRpbC9Ob2RlUHJpbnRlci5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91dGlsL05vZGVQcmludGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUxNzljMAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdXRpbC9Ob2RlUHJpbnRlci5qYXZhCkBAIC0wLDAgKzEsMTQwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgZ3Jvb3Z5LnV0aWw7CisKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5JbnZva2VySGVscGVyOworCitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBBIGhlbHBlciBjbGFzcyBmb3IgY3JlYXRpbmcgbmVzdGVkIHRyZWVzIG9mIGRhdGEKKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEBhdXRob3IgQ2hyaXN0aWFuIFN0ZWluCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBOb2RlUHJpbnRlciB7CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgSW5kZW50UHJpbnRlciBvdXQ7CisKKyAgICBwdWJsaWMgTm9kZVByaW50ZXIoKSB7CisgICAgICAgIHRoaXMobmV3IEluZGVudFByaW50ZXIobmV3IFByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoU3lzdGVtLm91dCkpKSk7CisgICAgfQorCisgICAgcHVibGljIE5vZGVQcmludGVyKFByaW50V3JpdGVyIG91dCkgeworICAgICAgICB0aGlzKG5ldyBJbmRlbnRQcmludGVyKG91dCkpOworICAgIH0KKworICAgIHB1YmxpYyBOb2RlUHJpbnRlcihJbmRlbnRQcmludGVyIG91dCkgeworICAgICAgICBpZiAob3V0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiSW5kZW50UHJpbnRlciAnb3V0JyBtdXN0IG5vdCBiZSBudWxsISIpOworICAgICAgICB9CisgICAgICAgIHRoaXMub3V0ID0gb3V0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByaW50KE5vZGUgbm9kZSkgeworICAgICAgICBvdXQucHJpbnRJbmRlbnQoKTsKKyAgICAgICAgcHJpbnROYW1lKG5vZGUpOworICAgICAgICBNYXAgYXR0cmlidXRlcyA9IG5vZGUuYXR0cmlidXRlcygpOworICAgICAgICBib29sZWFuIGhhc0F0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzICE9IG51bGwgJiYgIWF0dHJpYnV0ZXMuaXNFbXB0eSgpOworICAgICAgICBpZiAoaGFzQXR0cmlidXRlcykgeworICAgICAgICAgICAgcHJpbnRBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOworICAgICAgICB9CisgICAgICAgIE9iamVjdCB2YWx1ZSA9IG5vZGUudmFsdWUoKTsKKyAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTGlzdCkgeworICAgICAgICAgICAgaWYgKCFoYXNBdHRyaWJ1dGVzKSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KCIoKSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJpbnRMaXN0KChMaXN0KSB2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoIignIik7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KChTdHJpbmcpIHZhbHVlKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiJykiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIoKSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG91dC5mbHVzaCgpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHByaW50TmFtZShOb2RlIG5vZGUpIHsKKyAgICAgICAgT2JqZWN0IG5hbWUgPSBub2RlLm5hbWUoKTsKKyAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgb3V0LnByaW50KG5hbWUudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBvdXQucHJpbnQoIm51bGwiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHByaW50TGlzdChMaXN0IGxpc3QpIHsKKyAgICAgICAgaWYgKGxpc3QuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBvdXQucHJpbnRsbigiIik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBvdXQucHJpbnRsbigiIHsiKTsKKyAgICAgICAgICAgIG91dC5pbmNyZW1lbnRJbmRlbnQoKTsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTm9kZSkgeworICAgICAgICAgICAgICAgICAgICBwcmludCgoTm9kZSkgdmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50SW5kZW50KCk7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiYnVpbGRlci5hcHBlbmQoIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludChJbnZva2VySGVscGVyLnRvU3RyaW5nKHZhbHVlKSk7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIpIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0LmRlY3JlbWVudEluZGVudCgpOworICAgICAgICAgICAgb3V0LnByaW50SW5kZW50KCk7CisgICAgICAgICAgICBvdXQucHJpbnRsbigifSIpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwcm90ZWN0ZWQgdm9pZCBwcmludEF0dHJpYnV0ZXMoTWFwIGF0dHJpYnV0ZXMpIHsKKyAgICAgICAgb3V0LnByaW50KCIoIik7CisgICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhdHRyaWJ1dGVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiwgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQucHJpbnQoZW50cnkuZ2V0S2V5KCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBvdXQucHJpbnQoIjoiKTsKKyAgICAgICAgICAgIGlmIChlbnRyeS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgU3RyaW5nKSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KCInIiArIGVudHJ5LmdldFZhbHVlKCkgKyAiJyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KEludm9rZXJIZWxwZXIudG9TdHJpbmcoZW50cnkuZ2V0VmFsdWUoKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG91dC5wcmludCgiKSIpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91dGlsL09iamVjdEdyYXBoQnVpbGRlci5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91dGlsL09iamVjdEdyYXBoQnVpbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYjA1ODEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvT2JqZWN0R3JhcGhCdWlsZGVyLmphdmEKQEAgLTAsMCArMSw1NDMgQEAKKy8qDQorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorcGFja2FnZSBncm9vdnkudXRpbDsNCisNCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuQ2xvc3VyZTsNCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuTWV0YVByb3BlcnR5Ow0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQoraW1wb3J0IGphdmEudXRpbC5NYXA7DQorDQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5JbnZva2VySGVscGVyOw0KKw0KKy8qKg0KKyAqIEEgYnVpbGRlciBmb3IgY3JlYXRpbmcgb2JqZWN0IGdyYXBocy48YnI+DQorICogRWFjaCBub2RlIGRlZmluZXMgdGhlIGNsYXNzIHRvIGJlIGNyZWF0ZWQgYW5kIHRoZSBwcm9wZXJ0eSBvbiBpdHMgcGFyZW50IChpZg0KKyAqIGFueSkgYXQgdGhlIHNhbWUgdGltZS4NCisgKg0KKyAqIEBhdXRob3IgU2NvdHQgVmxhbWluY2sgKGh0dHA6Ly9yZWZhY3RyLmNvbSkNCisgKiBAYXV0aG9yIEFuZHJlcyBBbG1pcmF5IDxhYWxtaXJheUB1c2Vycy5zb3VyY2Vmb3JnZS5jb20+DQorICovDQorcHVibGljIGNsYXNzIE9iamVjdEdyYXBoQnVpbGRlciBleHRlbmRzIEZhY3RvcnlCdWlsZGVyU3VwcG9ydCB7DQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfQ0xBU1MgPSAiX05PREVfQ0xBU1NfIjsNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERV9OQU1FID0gIl9OT0RFX05BTUVfIjsNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0JKRUNUX0lEID0gIl9PQkpFQ1RfSURfIjsNCisNCisgICAgcHJpdmF0ZSBDaGlsZFByb3BlcnR5U2V0dGVyIGNoaWxkUHJvcGVydHlTZXR0ZXI7DQorICAgIHByaXZhdGUgQ2xhc3NOYW1lUmVzb2x2ZXIgY2xhc3NOYW1lUmVzb2x2ZXI7DQorICAgIHByaXZhdGUgSWRlbnRpZmllclJlc29sdmVyIGlkZW50aWZpZXJSZXNvbHZlcjsNCisgICAgcHJpdmF0ZSBOZXdJbnN0YW5jZVJlc29sdmVyIG5ld0luc3RhbmNlUmVzb2x2ZXI7DQorICAgIHByaXZhdGUgT2JqZWN0RmFjdG9yeSBvYmplY3RGYWN0b3J5ID0gbmV3IE9iamVjdEZhY3RvcnkoKTsNCisgICAgcHJpdmF0ZSBPYmplY3RSZWZGYWN0b3J5IG9iamVjdFJlZkZhY3RvcnkgPSBuZXcgT2JqZWN0UmVmRmFjdG9yeSgpOw0KKyAgICBwcml2YXRlIFJlZmVyZW5jZVJlc29sdmVyIHJlZmVyZW5jZVJlc29sdmVyOw0KKyAgICBwcml2YXRlIFJlbGF0aW9uTmFtZVJlc29sdmVyIHJlbGF0aW9uTmFtZVJlc29sdmVyOw0KKyAgICBwcml2YXRlIE1hcC8qIDxTdHJpbmcsQ2xhc3M+ICovcmVzb2x2ZWRDbGFzc2VzID0gbmV3IEhhc2hNYXAvKiA8U3RyaW5nLENsYXNzPiAqLygpOw0KKyAgICBwcml2YXRlIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyOw0KKw0KKyAgICBwdWJsaWMgT2JqZWN0R3JhcGhCdWlsZGVyKCkgew0KKyAgICAgICAgY2xhc3NOYW1lUmVzb2x2ZXIgPSBuZXcgRGVmYXVsdENsYXNzTmFtZVJlc29sdmVyKCk7DQorICAgICAgICBuZXdJbnN0YW5jZVJlc29sdmVyID0gbmV3IERlZmF1bHROZXdJbnN0YW5jZVJlc29sdmVyKCk7DQorICAgICAgICByZWxhdGlvbk5hbWVSZXNvbHZlciA9IG5ldyBEZWZhdWx0UmVsYXRpb25OYW1lUmVzb2x2ZXIoKTsNCisgICAgICAgIGNoaWxkUHJvcGVydHlTZXR0ZXIgPSBuZXcgRGVmYXVsdENoaWxkUHJvcGVydHlTZXR0ZXIoKTsNCisgICAgICAgIGlkZW50aWZpZXJSZXNvbHZlciA9IG5ldyBEZWZhdWx0SWRlbnRpZmllclJlc29sdmVyKCk7DQorICAgICAgICByZWZlcmVuY2VSZXNvbHZlciA9IG5ldyBEZWZhdWx0UmVmZXJlbmNlUmVzb2x2ZXIoKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBDaGlsZFByb3BlcnR5U2V0dGVyLg0KKyAgICAgKi8NCisgICAgcHVibGljIENoaWxkUHJvcGVydHlTZXR0ZXIgZ2V0Q2hpbGRQcm9wZXJ0eVNldHRlcigpIHsNCisgICAgICAgIHJldHVybiBjaGlsZFByb3BlcnR5U2V0dGVyOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm5zIHRoZSBjbGFzc0xvYWRlciB1c2VkIHRvIGxvYWQgYSBub2RlJ3MgY2xhc3MuDQorICAgICAqLw0KKyAgICBwdWJsaWMgQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXIoKSB7DQorICAgIAlyZXR1cm4gY2xhc3NMb2FkZXI7DQorICAgIH0NCisgICAgDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IENsYXNzTmFtZVJlc29sdmVyLg0KKyAgICAgKi8NCisgICAgcHVibGljIENsYXNzTmFtZVJlc29sdmVyIGdldENsYXNzTmFtZVJlc29sdmVyKCkgew0KKyAgICAgICAgcmV0dXJuIGNsYXNzTmFtZVJlc29sdmVyOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IE5ld0luc3RhbmNlUmVzb2x2ZXIuDQorICAgICAqLw0KKyAgICBwdWJsaWMgTmV3SW5zdGFuY2VSZXNvbHZlciBnZXROZXdJbnN0YW5jZVJlc29sdmVyKCkgew0KKyAgICAgICAgcmV0dXJuIG5ld0luc3RhbmNlUmVzb2x2ZXI7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgUmVsYXRpb25OYW1lUmVzb2x2ZXIuDQorICAgICAqLw0KKyAgICBwdWJsaWMgUmVsYXRpb25OYW1lUmVzb2x2ZXIgZ2V0UmVsYXRpb25OYW1lUmVzb2x2ZXIoKSB7DQorICAgICAgICByZXR1cm4gcmVsYXRpb25OYW1lUmVzb2x2ZXI7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFNldHMgdGhlIGN1cnJlbnQgQ2hpbGRQcm9wZXJ0eVNldHRlci48YnI+DQorICAgICAqIEl0IHdpbGwgYXNzaWduIERlZmF1bHRDaGlsZFByb3BlcnR5U2V0dGVyIGlmIG51bGwuPGJyPg0KKyAgICAgKiBJdCBhY2NlcHRzIGEgQ2hpbGRQcm9wZXJ0eVNldHRlciBpbnN0YW5jZSBvciBhIENsb3N1cmUuDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBzZXRDaGlsZFByb3BlcnR5U2V0dGVyKCBmaW5hbCBPYmplY3QgY2hpbGRQcm9wZXJ0eVNldHRlciApIHsNCisgICAgICAgIGlmKCBjaGlsZFByb3BlcnR5U2V0dGVyIGluc3RhbmNlb2YgQ2hpbGRQcm9wZXJ0eVNldHRlciApew0KKyAgICAgICAgICAgIHRoaXMuY2hpbGRQcm9wZXJ0eVNldHRlciA9IChDaGlsZFByb3BlcnR5U2V0dGVyKSBjaGlsZFByb3BlcnR5U2V0dGVyOw0KKyAgICAgICAgfWVsc2UgaWYoIGNoaWxkUHJvcGVydHlTZXR0ZXIgaW5zdGFuY2VvZiBDbG9zdXJlICl7DQorICAgICAgICAgICAgdGhpcy5jaGlsZFByb3BlcnR5U2V0dGVyID0gbmV3IENoaWxkUHJvcGVydHlTZXR0ZXIoKXsNCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0Q2hpbGQoIE9iamVjdCBwYXJlbnQsIE9iamVjdCBjaGlsZCwgU3RyaW5nIHBhcmVudE5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSApIHsNCisgICAgICAgICAgICAgICAgICAgICgoQ2xvc3VyZSkgY2hpbGRQcm9wZXJ0eVNldHRlcikuY2FsbCggbmV3IE9iamVjdFtdIHsgcGFyZW50LCBjaGlsZCwgcGFyZW50TmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lIH0gKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH07DQorICAgICAgICB9ZWxzZXsNCisgICAgICAgICAgICB0aGlzLmNoaWxkUHJvcGVydHlTZXR0ZXIgPSBuZXcgRGVmYXVsdENoaWxkUHJvcGVydHlTZXR0ZXIoKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgLyoqDQorICAgICAqIFNldHMgdGhlIGNsYXNzTG9hZGVyIHVzZWQgdG8gbG9hZCBhIG5vZGUncyBjbGFzcy4NCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIHNldENsYXNzTG9hZGVyKCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciApew0KKyAgICAJdGhpcy5jbGFzc0xvYWRlciA9IGNsYXNzTG9hZGVyOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBTZXRzIHRoZSBjdXJyZW50IENsYXNzTmFtZVJlc29sdmVyLjxicj4NCisgICAgICogSXQgd2lsbCBhc3NpZ24gRGVmYXVsdENsYXNzTmFtZVJlc29sdmVyIGlmIG51bGwuPGJyPg0KKyAgICAgKiBJdCBhY2NlcHRzIGEgQ2xhc3NOYW1lUmVzb2x2ZXIgaW5zdGFuY2UsIGEgU3RyaW5nIG9yIGEgQ2xvc3VyZS4NCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIHNldENsYXNzTmFtZVJlc29sdmVyKCBmaW5hbCBPYmplY3QgY2xhc3NOYW1lUmVzb2x2ZXIgKSB7DQorICAgICAgICBpZiggY2xhc3NOYW1lUmVzb2x2ZXIgaW5zdGFuY2VvZiBDbGFzc05hbWVSZXNvbHZlciApew0KKyAgICAgICAgICAgIHRoaXMuY2xhc3NOYW1lUmVzb2x2ZXIgPSAoQ2xhc3NOYW1lUmVzb2x2ZXIpIGNsYXNzTmFtZVJlc29sdmVyOw0KKyAgICAgICAgfWVsc2UgaWYoIGNsYXNzTmFtZVJlc29sdmVyIGluc3RhbmNlb2YgU3RyaW5nICl7DQorICAgICAgICAgICAgdGhpcy5jbGFzc05hbWVSZXNvbHZlciA9IG5ldyBDbGFzc05hbWVSZXNvbHZlcigpew0KKyAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIHJlc29sdmVDbGFzc25hbWUoIFN0cmluZyBjbGFzc25hbWUgKSB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xhc3NOYW1lUmVzb2x2ZXIgKyAiLiIgKyBjbGFzc25hbWUuc3Vic3RyaW5nKCAwLCAxICkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvVXBwZXJDYXNlKCkgKyBjbGFzc25hbWUuc3Vic3RyaW5nKCAxICk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9Ow0KKyAgICAgICAgfWVsc2UgaWYoIGNsYXNzTmFtZVJlc29sdmVyIGluc3RhbmNlb2YgQ2xvc3VyZSApew0KKyAgICAgICAgICAgIHRoaXMuY2xhc3NOYW1lUmVzb2x2ZXIgPSBuZXcgQ2xhc3NOYW1lUmVzb2x2ZXIoKXsNCisgICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyByZXNvbHZlQ2xhc3NuYW1lKCBTdHJpbmcgY2xhc3NuYW1lICkgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpICgoQ2xvc3VyZSkgY2xhc3NOYW1lUmVzb2x2ZXIpLmNhbGwoIG5ldyBPYmplY3RbXSB7IGNsYXNzbmFtZSB9ICk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9Ow0KKyAgICAgICAgfWVsc2V7DQorICAgICAgICAgICAgdGhpcy5jbGFzc05hbWVSZXNvbHZlciA9IG5ldyBEZWZhdWx0Q2xhc3NOYW1lUmVzb2x2ZXIoKTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogU2V0cyB0aGUgY3VycmVudCBJZGVudGlmaWVyUmVzb2x2ZXIuPGJyPg0KKyAgICAgKiBJdCB3aWxsIGFzc2lnbiBEZWZhdWx0SWRlbnRpZmllclJlc29sdmVyIGlmIG51bGwuPGJyPg0KKyAgICAgKiBJdCBhY2NlcHRzIGEgSWRlbnRpZmllclJlc29sdmVyIGluc3RhbmNlIG9yIGEgQ2xvc3VyZS4NCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIHNldElkZW50aWZpZXJSZXNvbHZlciggZmluYWwgT2JqZWN0IGlkZW50aWZpZXJSZXNvbHZlciApIHsNCisgICAgICAgIGlmKCBpZGVudGlmaWVyUmVzb2x2ZXIgaW5zdGFuY2VvZiBJZGVudGlmaWVyUmVzb2x2ZXIgKXsNCisgICAgICAgICAgICB0aGlzLmlkZW50aWZpZXJSZXNvbHZlciA9IChJZGVudGlmaWVyUmVzb2x2ZXIpIGlkZW50aWZpZXJSZXNvbHZlcjsNCisgICAgICAgIH1lbHNlIGlmKCBpZGVudGlmaWVyUmVzb2x2ZXIgaW5zdGFuY2VvZiBDbG9zdXJlICl7DQorICAgICAgICAgICAgdGhpcy5pZGVudGlmaWVyUmVzb2x2ZXIgPSBuZXcgSWRlbnRpZmllclJlc29sdmVyKCl7DQorICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWRlbnRpZmllckZvciggU3RyaW5nIG5vZGVOYW1lICkgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpICgoKENsb3N1cmUpIGlkZW50aWZpZXJSZXNvbHZlcikuY2FsbCggbmV3IE9iamVjdFtdIHsgbm9kZU5hbWUgfSApKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH07DQorICAgICAgICB9ZWxzZXsNCisgICAgICAgICAgICB0aGlzLmlkZW50aWZpZXJSZXNvbHZlciA9IG5ldyBEZWZhdWx0SWRlbnRpZmllclJlc29sdmVyKCk7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFNldHMgdGhlIGN1cnJlbnQgTmV3SW5zdGFuY2VSZXNvbHZlci48YnI+DQorICAgICAqIEl0IHdpbGwgYXNzaWduIERlZmF1bHROZXdJbnN0YW5jZVJlc29sdmVyIGlmIG51bGwuPGJyPg0KKyAgICAgKiBJdCBhY2NlcHRzIGEgTmV3SW5zdGFuY2VSZXNvbHZlciBpbnN0YW5jZSBvciBhIENsb3N1cmUuDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBzZXROZXdJbnN0YW5jZVJlc29sdmVyKCBmaW5hbCBPYmplY3QgbmV3SW5zdGFuY2VSZXNvbHZlciApIHsNCisgICAgICAgIGlmKCBuZXdJbnN0YW5jZVJlc29sdmVyIGluc3RhbmNlb2YgTmV3SW5zdGFuY2VSZXNvbHZlciApew0KKyAgICAgICAgICAgIHRoaXMubmV3SW5zdGFuY2VSZXNvbHZlciA9IChOZXdJbnN0YW5jZVJlc29sdmVyKSBuZXdJbnN0YW5jZVJlc29sdmVyOw0KKyAgICAgICAgfWVsc2UgaWYoIG5ld0luc3RhbmNlUmVzb2x2ZXIgaW5zdGFuY2VvZiBDbG9zdXJlICl7DQorICAgICAgICAgICAgdGhpcy5uZXdJbnN0YW5jZVJlc29sdmVyID0gbmV3IE5ld0luc3RhbmNlUmVzb2x2ZXIoKXsNCisgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBuZXdJbnN0YW5jZSggQ2xhc3Mga2xhc3MsIE1hcCBhdHRyaWJ1dGVzICkNCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChDbG9zdXJlKSBuZXdJbnN0YW5jZVJlc29sdmVyKS5jYWxsKCBuZXcgT2JqZWN0W10geyBrbGFzcywgYXR0cmlidXRlcyB9ICk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9Ow0KKyAgICAgICAgfWVsc2V7DQorICAgICAgICAgICAgdGhpcy5uZXdJbnN0YW5jZVJlc29sdmVyID0gbmV3IERlZmF1bHROZXdJbnN0YW5jZVJlc29sdmVyKCk7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFNldHMgdGhlIGN1cnJlbnQgUmVmZXJlbmNlUmVzb2x2ZXIuPGJyPg0KKyAgICAgKiBJdCB3aWxsIGFzc2lnbiBEZWZhdWx0UmVmZXJlbmNlUmVzb2x2ZXIgaWYgbnVsbC48YnI+DQorICAgICAqIEl0IGFjY2VwdHMgYSBSZWZlcmVuY2VSZXNvbHZlciBpbnN0YW5jZSBvciBhIENsb3N1cmUuDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VSZXNvbHZlciggZmluYWwgT2JqZWN0IHJlZmVyZW5jZVJlc29sdmVyICkgew0KKyAgICAgICAgaWYoIHJlZmVyZW5jZVJlc29sdmVyIGluc3RhbmNlb2YgUmVmZXJlbmNlUmVzb2x2ZXIgKXsNCisgICAgICAgICAgICB0aGlzLnJlZmVyZW5jZVJlc29sdmVyID0gKFJlZmVyZW5jZVJlc29sdmVyKSByZWZlcmVuY2VSZXNvbHZlcjsNCisgICAgICAgIH1lbHNlIGlmKCByZWZlcmVuY2VSZXNvbHZlciBpbnN0YW5jZW9mIENsb3N1cmUgKXsNCisgICAgICAgICAgICB0aGlzLnJlZmVyZW5jZVJlc29sdmVyID0gbmV3IFJlZmVyZW5jZVJlc29sdmVyKCl7DQorICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlRm9yKCBTdHJpbmcgbm9kZU5hbWUgKSB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFN0cmluZykgKCgoQ2xvc3VyZSkgcmVmZXJlbmNlUmVzb2x2ZXIpLmNhbGwoIG5ldyBPYmplY3RbXSB7IG5vZGVOYW1lIH0gKSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9Ow0KKyAgICAgICAgfWVsc2V7DQorICAgICAgICAgICAgdGhpcy5yZWZlcmVuY2VSZXNvbHZlciA9IG5ldyBEZWZhdWx0UmVmZXJlbmNlUmVzb2x2ZXIoKTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogU2V0cyB0aGUgY3VycmVudCBSZWxhdGlvbk5hbWVSZXNvbHZlci48YnI+DQorICAgICAqIEl0IHdpbGwgYXNzaWduIERlZmF1bHRSZWxhdGlvbk5hbWVSZXNvbHZlciBpZiBudWxsLg0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgc2V0UmVsYXRpb25OYW1lUmVzb2x2ZXIoIFJlbGF0aW9uTmFtZVJlc29sdmVyIHJlbGF0aW9uTmFtZVJlc29sdmVyICkgew0KKyAgICAgICAgdGhpcy5yZWxhdGlvbk5hbWVSZXNvbHZlciA9IHJlbGF0aW9uTmFtZVJlc29sdmVyICE9IG51bGwgPyByZWxhdGlvbk5hbWVSZXNvbHZlcg0KKyAgICAgICAgICAgICAgICA6IG5ldyBEZWZhdWx0UmVsYXRpb25OYW1lUmVzb2x2ZXIoKTsNCisgICAgfQ0KKw0KKyAgICBwcm90ZWN0ZWQgdm9pZCBwb3N0SW5zdGFudGlhdGUoIE9iamVjdCBuYW1lLCBNYXAgYXR0cmlidXRlcywgT2JqZWN0IG5vZGUgKSB7DQorICAgICAgICBzdXBlci5wb3N0SW5zdGFudGlhdGUoIG5hbWUsIGF0dHJpYnV0ZXMsIG5vZGUgKTsNCisgICAgICAgIE1hcCBjb250ZXh0ID0gZ2V0Q29udGV4dCgpOw0KKyAgICAgICAgU3RyaW5nIG9iamVjdElkID0gKFN0cmluZykgY29udGV4dC5nZXQoIE9CSkVDVF9JRCApOw0KKyAgICAgICAgaWYoIG9iamVjdElkICE9IG51bGwgJiYgbm9kZSAhPSBudWxsICl7DQorICAgICAgICAgICAgc2V0VmFyaWFibGUoIG9iamVjdElkLCBub2RlICk7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcHJvdGVjdGVkIHZvaWQgcHJlSW5zdGFudGlhdGUoIE9iamVjdCBuYW1lLCBNYXAgYXR0cmlidXRlcywgT2JqZWN0IHZhbHVlICkgew0KKyAgICAgICAgc3VwZXIucHJlSW5zdGFudGlhdGUoIG5hbWUsIGF0dHJpYnV0ZXMsIHZhbHVlICk7DQorICAgICAgICBNYXAgY29udGV4dCA9IGdldENvbnRleHQoKTsNCisgICAgICAgIGNvbnRleHQucHV0KCBPQkpFQ1RfSUQsDQorICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMucmVtb3ZlKCBpZGVudGlmaWVyUmVzb2x2ZXIuZ2V0SWRlbnRpZmllckZvciggKFN0cmluZykgbmFtZSApICkgKTsNCisgICAgfQ0KKw0KKyAgICBwcm90ZWN0ZWQgRmFjdG9yeSByZXNvbHZlRmFjdG9yeSggT2JqZWN0IG5hbWUsIE1hcCBhdHRyaWJ1dGVzLCBPYmplY3QgdmFsdWUgKSB7DQorICAgICAgICAvLyBsZXQgY3VzdG9tIGZhY3RvcmllcyB0byBiZSByZXNvbHZlZCBmaXJzdA0KKyAgICAgICAgRmFjdG9yeSBmYWN0b3J5ID0gc3VwZXIucmVzb2x2ZUZhY3RvcnkoIG5hbWUsIGF0dHJpYnV0ZXMsIHZhbHVlICk7DQorICAgICAgICBpZiggZmFjdG9yeSAhPSBudWxsICl7DQorICAgICAgICAgICAgcmV0dXJuIGZhY3Rvcnk7DQorICAgICAgICB9DQorICAgICAgICBpZiggYXR0cmlidXRlcy5nZXQoIHJlZmVyZW5jZVJlc29sdmVyLmdldFJlZmVyZW5jZUZvciggKFN0cmluZykgbmFtZSApICkgIT0gbnVsbCApew0KKyAgICAgICAgICAgIHJldHVybiBvYmplY3RSZWZGYWN0b3J5Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIG9iamVjdEZhY3Rvcnk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFN0cmF0ZWd5IGZvciBzZXR0aW5nIGEgY2hpbGQgbm9kZSBvbiBpdHMgcGFyZW50Ljxicj4NCisgICAgICogVXNlZnVsIGZvciBoYW5kbGluZyBMaXN0cy9BcnJheXMgdnMgbm9ybWFsIHByb3BlcnRpZXMuDQorICAgICAqLw0KKyAgICBwdWJsaWMgaW50ZXJmYWNlIENoaWxkUHJvcGVydHlTZXR0ZXIgew0KKyAgICAgICAgLyoqDQorICAgICAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQncyBub2RlIHZhbHVlDQorICAgICAgICAgKiBAcGFyYW0gY2hpbGQgdGhlIGNoaWxkJ3Mgbm9kZSB2YWx1ZQ0KKyAgICAgICAgICogQHBhcmFtIHBhcmVudE5hbWUgdGhlIG5hbWUgb2YgdGhlIHBhcmVudCBub2RlDQorICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIHRoZSByZXNvbHZlZCByZWxhdGlvbiBuYW1lIG9mIHRoZSBjaGlsZA0KKyAgICAgICAgICovDQorICAgICAgICB2b2lkIHNldENoaWxkKCBPYmplY3QgcGFyZW50LCBPYmplY3QgY2hpbGQsIFN0cmluZyBwYXJlbnROYW1lLCBTdHJpbmcgcHJvcGVydHlOYW1lICk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFN0cmF0ZWd5IGZvciByZXNvbHZpbmcgYSBjbGFzc25hbWUuDQorICAgICAqLw0KKyAgICBwdWJsaWMgaW50ZXJmYWNlIENsYXNzTmFtZVJlc29sdmVyIHsNCisgICAgICAgIC8qKg0KKyAgICAgICAgICogQHBhcmFtIGNsYXNzbmFtZSB0aGUgbm9kZSBuYW1lIGFzIHdyaXR0ZW4gb24gdGhlIGJ1aWxkaW5nIGNvZGUNCisgICAgICAgICAqLw0KKyAgICAgICAgU3RyaW5nIHJlc29sdmVDbGFzc25hbWUoIFN0cmluZyBjbGFzc25hbWUgKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogRGVmYXVsdCBpbXBsIHRoYXQgY2FsbHMgcGFyZW50LnByb3BlcnR5TmFtZSA9IGNoaWxkPGJyPg0KKyAgICAgKiBJZiBwYXJlbnQucHJvcGVydHlOYW1lIGlzIGEgQ29sbGVjdGlvbiBpdCB3aWxsIHRyeSB0byBhZGQgY2hpbGQgdG8gdGhlDQorICAgICAqIGNvbGxlY3Rpb24uDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIERlZmF1bHRDaGlsZFByb3BlcnR5U2V0dGVyIGltcGxlbWVudHMgQ2hpbGRQcm9wZXJ0eVNldHRlciB7DQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRDaGlsZCggT2JqZWN0IHBhcmVudCwgT2JqZWN0IGNoaWxkLCBTdHJpbmcgcGFyZW50TmFtZSwgU3RyaW5nIHByb3BlcnR5TmFtZSApIHsNCisgICAgICAgICAgICBPYmplY3QgcHJvcGVydHkgPSBJbnZva2VySGVscGVyLmdldFByb3BlcnR5KCBwYXJlbnQsIHByb3BlcnR5TmFtZSApOw0KKyAgICAgICAgICAgIGlmKCBwcm9wZXJ0eSAhPSBudWxsICYmIENvbGxlY3Rpb24uY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSggcHJvcGVydHkuZ2V0Q2xhc3MoKSApICl7DQorICAgICAgICAgICAgICAgICgoQ29sbGVjdGlvbikgcHJvcGVydHkpLmFkZCggY2hpbGQgKTsNCisgICAgICAgICAgICB9ZWxzZXsNCisgICAgICAgICAgICAgICAgSW52b2tlckhlbHBlci5zZXRQcm9wZXJ0eSggcGFyZW50LCBwcm9wZXJ0eU5hbWUsIGNoaWxkICk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBEZWZhdWx0IGltcGwgdGhhdCBjYXBpdGFsaXplcyB0aGUgY2xhc3NuYW1lLg0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEZWZhdWx0Q2xhc3NOYW1lUmVzb2x2ZXIgaW1wbGVtZW50cyBDbGFzc05hbWVSZXNvbHZlciB7DQorICAgICAgICBwdWJsaWMgU3RyaW5nIHJlc29sdmVDbGFzc25hbWUoIFN0cmluZyBjbGFzc25hbWUgKSB7DQorICAgICAgICAgICAgaWYoIGNsYXNzbmFtZS5sZW5ndGgoKSA9PSAxICl7DQorICAgICAgICAgICAgICAgIHJldHVybiBjbGFzc25hbWUudG9VcHBlckNhc2UoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIGNsYXNzbmFtZS5zdWJzdHJpbmcoIDAsIDEgKQ0KKyAgICAgICAgICAgICAgICAgICAgLnRvVXBwZXJDYXNlKCkgKyBjbGFzc25hbWUuc3Vic3RyaW5nKCAxICk7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIERlZmF1bHQgaW1wbCwgYWx3YXlzIHJldHVybnMgJ2lkJw0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEZWZhdWx0SWRlbnRpZmllclJlc29sdmVyIGltcGxlbWVudHMgSWRlbnRpZmllclJlc29sdmVyIHsNCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWRlbnRpZmllckZvciggU3RyaW5nIG5vZGVOYW1lICkgew0KKyAgICAgICAgICAgIHJldHVybiAiaWQiOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBEZWZhdWx0IGltcGwgdGhhdCBjYWxscyBDbGFzcy5uZXdJbnN0YW5jZSgpDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIERlZmF1bHROZXdJbnN0YW5jZVJlc29sdmVyIGltcGxlbWVudHMgTmV3SW5zdGFuY2VSZXNvbHZlciB7DQorICAgICAgICBwdWJsaWMgT2JqZWN0IG5ld0luc3RhbmNlKCBDbGFzcyBrbGFzcywgTWFwIGF0dHJpYnV0ZXMgKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwNCisgICAgICAgICAgICAgICAgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7DQorICAgICAgICAgICAgcmV0dXJuIGtsYXNzLm5ld0luc3RhbmNlKCk7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIERlZmF1bHQgaW1wbCwgYWx3YXlzIHJldHVybnMgJ3JlZklkJw0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEZWZhdWx0UmVmZXJlbmNlUmVzb2x2ZXIgaW1wbGVtZW50cyBSZWZlcmVuY2VSZXNvbHZlciB7DQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFJlZmVyZW5jZUZvciggU3RyaW5nIG5vZGVOYW1lICkgew0KKyAgICAgICAgICAgIHJldHVybiAicmVmSWQiOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBEZWZhdWx0IGltcGwgdGhhdCByZXR1cm5zIHBhcmVudE5hbWUgJmFtcDsgY2hpbGROYW1lIGFjY29yZGluZ2x5Lg0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEZWZhdWx0UmVsYXRpb25OYW1lUmVzb2x2ZXIgaW1wbGVtZW50cyBSZWxhdGlvbk5hbWVSZXNvbHZlciB7DQorICAgICAgICAvKioNCisgICAgICAgICAqIEZvbGxvdyB0aGUgbW9zdCBjb252ZW50aW9uYWwgcGx1cmFsIGluIEVuZ2xpc2gsIGFkZCAncycgdG8gY2hpbGROYW1lLjxicj4NCisgICAgICAgICAqIElmIHRoZSBwcm9wZXJ0eSBkb2VzIG5vdCBleGlzdCB0aGVuIGl0IHdpbGwgcmV0dXJuIGNoaWxkTmFtZQ0KKyAgICAgICAgICogdW5jaGFuZ2VkLg0KKyAgICAgICAgICovDQorICAgICAgICBwdWJsaWMgU3RyaW5nIHJlc29sdmVDaGlsZFJlbGF0aW9uTmFtZSggU3RyaW5nIHBhcmVudE5hbWUsIE9iamVjdCBwYXJlbnQsIFN0cmluZyBjaGlsZE5hbWUsDQorICAgICAgICAgICAgICAgIE9iamVjdCBjaGlsZCApIHsNCisgICAgICAgICAgICBNZXRhUHJvcGVydHkgbWV0YVByb3BlcnR5ID0gSW52b2tlckhlbHBlci5nZXRNZXRhQ2xhc3MoIHBhcmVudCApDQorICAgICAgICAgICAgICAgICAgICAuaGFzUHJvcGVydHkoIHBhcmVudCwgY2hpbGROYW1lICsgInMiICk7DQorICAgICAgICAgICAgaWYoIG1ldGFQcm9wZXJ0eSAhPSBudWxsICl7DQorICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZE5hbWUgKyAicyI7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiBjaGlsZE5hbWU7DQorICAgICAgICB9DQorDQorICAgICAgICAvKioNCisgICAgICAgICAqIEZvbGxvdyB0aGUgbW9zdCBjb252ZW50aW9uYWwgcGF0dGVybiwgcmV0dXJucyB0aGUgcGFyZW50TmFtZQ0KKyAgICAgICAgICogdW5jaGFuZ2VkLg0KKyAgICAgICAgICovDQorICAgICAgICBwdWJsaWMgU3RyaW5nIHJlc29sdmVQYXJlbnRSZWxhdGlvbk5hbWUoIFN0cmluZyBwYXJlbnROYW1lLCBPYmplY3QgcGFyZW50LA0KKyAgICAgICAgICAgICAgICBTdHJpbmcgY2hpbGROYW1lLCBPYmplY3QgY2hpbGQgKSB7DQorICAgICAgICAgICAgcmV0dXJuIHBhcmVudE5hbWU7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFN0cmF0ZWd5IGZvciBwaWNraW5nIHRoZSBjb3JyZWN0IHN5bnRoZXRpYyBpZGVudGlmaWVyLg0KKyAgICAgKi8NCisgICAgcHVibGljIGludGVyZmFjZSBJZGVudGlmaWVyUmVzb2x2ZXIgew0KKyAgICAgICAgLyoqDQorICAgICAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IHdpbGwgaWRlbnRpZnkgdGhlIG5vZGUuPGJyPg0KKyAgICAgICAgICoNCisgICAgICAgICAqIEBwYXJhbSBub2RlTmFtZSB0aGUgbmFtZSBvZiB0aGUgbm9kZQ0KKyAgICAgICAgICovDQorICAgICAgICBTdHJpbmcgZ2V0SWRlbnRpZmllckZvciggU3RyaW5nIG5vZGVOYW1lICk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFN0cmF0ZWd5IGZvciBjcmVhdGluZyBuZXcgaW5zdGFuY2VzIG9mIGEgY2xhc3MuPGJyPg0KKyAgICAgKiBVc2VmdWwgZm9yIHBsdWctaW4gY2FsbHMgdG8gbm9uLWRlZmF1bHQgY29uc3RydWN0b3JzLg0KKyAgICAgKi8NCisgICAgcHVibGljIGludGVyZmFjZSBOZXdJbnN0YW5jZVJlc29sdmVyIHsNCisgICAgICAgIC8qKg0KKyAgICAgICAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIENsYXNzIGtsYXNzLg0KKyAgICAgICAgICoNCisgICAgICAgICAqIEBwYXJhbSBrbGFzcyB0aGUgcmVzb2x2ZWQgY2xhc3MgbmFtZQ0KKyAgICAgICAgICogQHBhcmFtIGF0dHJpYnV0ZXMgdGhlIGF0dHJpYnV0ZSBNYXAgYXZhaWxhYmxlIGZvciB0aGUgbm9kZQ0KKyAgICAgICAgICovDQorICAgICAgICBPYmplY3QgbmV3SW5zdGFuY2UoIENsYXNzIGtsYXNzLCBNYXAgYXR0cmlidXRlcyApIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLA0KKyAgICAgICAgICAgICAgICBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBTdHJhdGVneSBmb3IgcGlja2luZyB0aGUgY29ycmVjdCBzeW50aGV0aWMgcmVmZXJlbmNlIGlkZW50aWZpZXIuDQorICAgICAqLw0KKyAgICBwdWJsaWMgaW50ZXJmYWNlIFJlZmVyZW5jZVJlc29sdmVyIHsNCisgICAgICAgIC8qKg0KKyAgICAgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCByZWZlcmVuY2VzIGFub3RoZXIgbm9kZS48YnI+DQorICAgICAgICAgKg0KKyAgICAgICAgICogQHBhcmFtIG5vZGVOYW1lIHRoZSBuYW1lIG9mIHRoZSBub2RlDQorICAgICAgICAgKi8NCisgICAgICAgIFN0cmluZyBnZXRSZWZlcmVuY2VGb3IoIFN0cmluZyBub2RlTmFtZSApOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBTdHJhdGVneSBmb3IgcmVzb2x2aW5nIGEgcmVsYXRpb25zaGlwIHByb3BlcnR5IG5hbWUuDQorICAgICAqLw0KKyAgICBwdWJsaWMgaW50ZXJmYWNlIFJlbGF0aW9uTmFtZVJlc29sdmVyIHsNCisgICAgICAgIC8qKg0KKyAgICAgICAgICogUmV0dXJucyB0aGUgbWFwcGluZyBuYW1lIG9mIGNoaWxkIC0mZ3Q7IHBhcmVudA0KKyAgICAgICAgICoNCisgICAgICAgICAqIEBwYXJhbSBwYXJlbnROYW1lIHRoZSBuYW1lIG9mIHRoZSBwYXJlbnQgbm9kZQ0KKyAgICAgICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IG5vZGUNCisgICAgICAgICAqIEBwYXJhbSBjaGlsZE5hbWUgdGhlIG5hbWUgb2YgdGhlIGNoaWxkIG5vZGUNCisgICAgICAgICAqIEBwYXJhbSBjaGlsZCB0aGUgY2hpbGQgbm9kZQ0KKyAgICAgICAgICovDQorICAgICAgICBTdHJpbmcgcmVzb2x2ZUNoaWxkUmVsYXRpb25OYW1lKCBTdHJpbmcgcGFyZW50TmFtZSwgT2JqZWN0IHBhcmVudCwgU3RyaW5nIGNoaWxkTmFtZSwNCisgICAgICAgICAgICAgICAgT2JqZWN0IGNoaWxkICk7DQorDQorICAgICAgICAvKioNCisgICAgICAgICAqIFJldHVybnMgdGhlIG1hcHBpbmcgbmFtZSBvZiBwYXJlbnQgLSZndDsgY2hpbGQNCisgICAgICAgICAqDQorICAgICAgICAgKiBAcGFyYW0gcGFyZW50TmFtZSB0aGUgbmFtZSBvZiB0aGUgcGFyZW50IG5vZGUNCisgICAgICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBub2RlDQorICAgICAgICAgKiBAcGFyYW0gY2hpbGROYW1lIHRoZSBuYW1lIG9mIHRoZSBjaGlsZCBub2RlDQorICAgICAgICAgKiBAcGFyYW0gY2hpbGQgdGhlIGNoaWxkIG5vZGUNCisgICAgICAgICAqLw0KKyAgICAgICAgU3RyaW5nIHJlc29sdmVQYXJlbnRSZWxhdGlvbk5hbWUoIFN0cmluZyBwYXJlbnROYW1lLCBPYmplY3QgcGFyZW50LCBTdHJpbmcgY2hpbGROYW1lLA0KKyAgICAgICAgICAgICAgICBPYmplY3QgY2hpbGQpOw0KKyAgICB9DQorDQorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE9iamVjdEZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdEZhY3Rvcnkgew0KKyAgICAgICAgcHVibGljIE9iamVjdCBuZXdJbnN0YW5jZSggRmFjdG9yeUJ1aWxkZXJTdXBwb3J0IGJ1aWxkZXIsIE9iamVjdCBuYW1lLCBPYmplY3QgdmFsdWUsDQorICAgICAgICAgICAgICAgIE1hcCBwcm9wZXJ0aWVzICkgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gew0KKyAgICAgICAgICAgIE9iamVjdEdyYXBoQnVpbGRlciBvZ2J1aWxkZXIgPSAoT2JqZWN0R3JhcGhCdWlsZGVyKSBidWlsZGVyOw0KKyAgICAgICAgICAgIFN0cmluZyBjbGFzc25hbWUgPSBvZ2J1aWxkZXIuY2xhc3NOYW1lUmVzb2x2ZXIucmVzb2x2ZUNsYXNzbmFtZSggKFN0cmluZykgbmFtZSApOw0KKyAgICAgICAgICAgIENsYXNzIGtsYXNzID0gKENsYXNzKSBvZ2J1aWxkZXIucmVzb2x2ZWRDbGFzc2VzLmdldCggY2xhc3NuYW1lICk7DQorICAgICAgICAgICAgaWYoIGtsYXNzID09IG51bGwgKXsNCisgICAgICAgICAgICAgICAga2xhc3MgPSBsb2FkQ2xhc3MoIG9nYnVpbGRlci5jbGFzc0xvYWRlciwgY2xhc3NuYW1lICk7DQorICAgICAgICAgICAgICAgIGlmKCBrbGFzcyA9PSBudWxsICl7DQorICAgICAgICAgICAgICAgIAlrbGFzcyA9IGxvYWRDbGFzcyggb2didWlsZGVyLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSwgY2xhc3NuYW1lICk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgaWYoIGtsYXNzID09IG51bGwgKXsNCisgICAgICAgICAgICAJICAgIHRyeXsNCisgICAgICAgICAgICAgICAgICAgICAgICBrbGFzcyA9IENsYXNzLmZvck5hbWUoIGNsYXNzbmFtZSApOw0KKyAgICAgICAgICAgICAgICAgICAgfWNhdGNoKCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUgKXsNCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZigga2xhc3MgPT0gbnVsbCApew0KKyAgICAgICAgICAgICAgICAJa2xhc3MgPSBsb2FkQ2xhc3MoIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCksIGNsYXNzbmFtZSApOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGlmKCBrbGFzcyA9PSBudWxsICl7DQorICAgICAgICAgICAgICAgIAl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbihjbGFzc25hbWUpKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBvZ2J1aWxkZXIucmVzb2x2ZWRDbGFzc2VzLnB1dCggY2xhc3NuYW1lLCBrbGFzcyApOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBNYXAgY29udGV4dCA9IG9nYnVpbGRlci5nZXRDb250ZXh0KCk7DQorICAgICAgICAgICAgY29udGV4dC5wdXQoIE9iamVjdEdyYXBoQnVpbGRlci5OT0RFX05BTUUsIG5hbWUgKTsNCisgICAgICAgICAgICBjb250ZXh0LnB1dCggT2JqZWN0R3JhcGhCdWlsZGVyLk5PREVfQ0xBU1MsIGtsYXNzICk7DQorDQorICAgICAgICAgICAgcmV0dXJuIG9nYnVpbGRlci5uZXdJbnN0YW5jZVJlc29sdmVyLm5ld0luc3RhbmNlKCBrbGFzcywgcHJvcGVydGllcyApOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZvaWQgc2V0Q2hpbGQoIEZhY3RvcnlCdWlsZGVyU3VwcG9ydCBidWlsZGVyLCBPYmplY3QgcGFyZW50LCBPYmplY3QgY2hpbGQgKSB7DQorICAgICAgICAgICAgT2JqZWN0R3JhcGhCdWlsZGVyIG9nYnVpbGRlciA9IChPYmplY3RHcmFwaEJ1aWxkZXIpIGJ1aWxkZXI7DQorICAgICAgICAgICAgaWYoIHBhcmVudCAhPSBudWxsICl7DQorICAgICAgICAgICAgICAgIE1hcCBjb250ZXh0ID0gb2didWlsZGVyLmdldENvbnRleHQoKTsNCisgICAgICAgICAgICAgICAgTWFwIHBhcmVudENvbnRleHQgPSBvZ2J1aWxkZXIuZ2V0UGFyZW50Q29udGV4dCgpOw0KKw0KKyAgICAgICAgICAgICAgICBTdHJpbmcgcGFyZW50TmFtZSA9IG51bGw7DQorICAgICAgICAgICAgICAgIFN0cmluZyBjaGlsZE5hbWUgPSAoU3RyaW5nKSBjb250ZXh0LmdldCggTk9ERV9OQU1FICk7DQorICAgICAgICAgICAgICAgIENsYXNzIHBhcmVudENsYXNzID0gbnVsbDsNCisgICAgICAgICAgICAgICAgQ2xhc3MgY2hpbGRDbGFzcyA9IChDbGFzcykgY29udGV4dC5nZXQoIE5PREVfQ0xBU1MgKTsNCisgICAgICAgICAgICAgICAgaWYoIHBhcmVudENvbnRleHQgIT0gbnVsbCApew0KKyAgICAgICAgICAgICAgICAgICAgcGFyZW50TmFtZSA9IChTdHJpbmcpIHBhcmVudENvbnRleHQuZ2V0KCBOT0RFX05BTUUgKTsNCisgICAgICAgICAgICAgICAgICAgIHBhcmVudENsYXNzID0gKENsYXNzKSBwYXJlbnRDb250ZXh0LmdldCggTk9ERV9DTEFTUyApOw0KKyAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSBvZ2J1aWxkZXIucmVsYXRpb25OYW1lUmVzb2x2ZXIucmVzb2x2ZVBhcmVudFJlbGF0aW9uTmFtZSgNCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnROYW1lLCBwYXJlbnQsIGNoaWxkTmFtZSwgY2hpbGQgKTsNCisgICAgICAgICAgICAgICAgTWV0YVByb3BlcnR5IG1ldGFQcm9wZXJ0eSA9IEludm9rZXJIZWxwZXIuZ2V0TWV0YUNsYXNzKCBjaGlsZCApDQorICAgICAgICAgICAgICAgICAgICAgICAgLmhhc1Byb3BlcnR5KCBjaGlsZCwgcHJvcGVydHlOYW1lICk7DQorICAgICAgICAgICAgICAgIGlmKCBtZXRhUHJvcGVydHkgIT0gbnVsbCApew0KKyAgICAgICAgICAgICAgICAgICAgbWV0YVByb3BlcnR5LnNldFByb3BlcnR5KCBjaGlsZCwgcGFyZW50ICk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnQoIEZhY3RvcnlCdWlsZGVyU3VwcG9ydCBidWlsZGVyLCBPYmplY3QgcGFyZW50LCBPYmplY3QgY2hpbGQgKSB7DQorICAgICAgICAgICAgT2JqZWN0R3JhcGhCdWlsZGVyIG9nYnVpbGRlciA9IChPYmplY3RHcmFwaEJ1aWxkZXIpIGJ1aWxkZXI7DQorICAgICAgICAgICAgaWYoIHBhcmVudCAhPSBudWxsICl7DQorICAgICAgICAgICAgICAgIE1hcCBjb250ZXh0ID0gb2didWlsZGVyLmdldENvbnRleHQoKTsNCisgICAgICAgICAgICAgICAgTWFwIHBhcmVudENvbnRleHQgPSBvZ2J1aWxkZXIuZ2V0UGFyZW50Q29udGV4dCgpOw0KKw0KKyAgICAgICAgICAgICAgICBTdHJpbmcgcGFyZW50TmFtZSA9IG51bGw7DQorICAgICAgICAgICAgICAgIFN0cmluZyBjaGlsZE5hbWUgPSAoU3RyaW5nKSBjb250ZXh0LmdldCggTk9ERV9OQU1FICk7DQorICAgICAgICAgICAgICAgIENsYXNzIHBhcmVudENsYXNzID0gbnVsbDsNCisgICAgICAgICAgICAgICAgQ2xhc3MgY2hpbGRDbGFzcyA9IChDbGFzcykgY29udGV4dC5nZXQoIE5PREVfQ0xBU1MgKTsNCisgICAgICAgICAgICAgICAgaWYoIHBhcmVudENvbnRleHQgIT0gbnVsbCApew0KKyAgICAgICAgICAgICAgICAgICAgcGFyZW50TmFtZSA9IChTdHJpbmcpIHBhcmVudENvbnRleHQuZ2V0KCBOT0RFX05BTUUgKTsNCisgICAgICAgICAgICAgICAgICAgIHBhcmVudENsYXNzID0gKENsYXNzKSBwYXJlbnRDb250ZXh0LmdldCggTk9ERV9DTEFTUyApOw0KKyAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgIG9nYnVpbGRlci5jaGlsZFByb3BlcnR5U2V0dGVyLnNldENoaWxkKCBwYXJlbnQsIGNoaWxkLCBwYXJlbnROYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIG9nYnVpbGRlci5yZWxhdGlvbk5hbWVSZXNvbHZlci5yZXNvbHZlQ2hpbGRSZWxhdGlvbk5hbWUoIHBhcmVudE5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQsIGNoaWxkTmFtZSwgY2hpbGQgKSApOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHJpdmF0ZSBDbGFzcyBsb2FkQ2xhc3MoIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyLCBTdHJpbmcgY2xhc3NuYW1lICl7DQorICAgICAgICAgICAgaWYoIGNsYXNzTG9hZGVyID09IG51bGwgfHwgY2xhc3NuYW1lID09IG51bGwgKXsNCisgICAgICAgICAgICAJcmV0dXJuIG51bGw7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgCXRyeXsNCisgICAgICAgICAgICAgICAgcmV0dXJuIGNsYXNzTG9hZGVyLmxvYWRDbGFzcyggY2xhc3NuYW1lICk7DQorICAgICAgICAgICAgfWNhdGNoKCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUgKXsNCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE9iamVjdFJlZkZhY3RvcnkgZXh0ZW5kcyBPYmplY3RGYWN0b3J5IHsNCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzTGVhZigpIHsNCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBPYmplY3QgbmV3SW5zdGFuY2UoIEZhY3RvcnlCdWlsZGVyU3VwcG9ydCBidWlsZGVyLCBPYmplY3QgbmFtZSwgT2JqZWN0IHZhbHVlLA0KKyAgICAgICAgICAgICAgICBNYXAgcHJvcGVydGllcyApIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsNCisgICAgICAgICAgICBPYmplY3RHcmFwaEJ1aWxkZXIgb2didWlsZGVyID0gKE9iamVjdEdyYXBoQnVpbGRlcikgYnVpbGRlcjsNCisgICAgICAgICAgICBTdHJpbmcgcmVmUHJvcGVydHkgPSBvZ2J1aWxkZXIucmVmZXJlbmNlUmVzb2x2ZXIuZ2V0UmVmZXJlbmNlRm9yKCAoU3RyaW5nKSBuYW1lICk7DQorICAgICAgICAgICAgU3RyaW5nIHJlZklkID0gKFN0cmluZykgcHJvcGVydGllcy5yZW1vdmUoIHJlZlByb3BlcnR5ICk7DQorDQorICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IG9nYnVpbGRlci5nZXRQcm9wZXJ0eSggcmVmSWQgKTsNCisgICAgICAgICAgICBpZiggb2JqZWN0ID09IG51bGwgKXsNCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIlRoZXJlIGlzIG5vIHByZXZpb3VzIG5vZGUgd2l0aCAiDQorICAgICAgICAgICAgICAgICAgICAgICAgKyBvZ2J1aWxkZXIuaWRlbnRpZmllclJlc29sdmVyLmdldElkZW50aWZpZXJGb3IoIChTdHJpbmcpIG5hbWUgKSArICI9Ig0KKyAgICAgICAgICAgICAgICAgICAgICAgICsgcmVmSWQgKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgaWYoICFwcm9wZXJ0aWVzLmlzRW1wdHkoKSApew0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKA0KKyAgICAgICAgICAgICAgICAgICAgICAgICJZb3UgY2FuIG5vdCBtb2RpZnkgdGhlIHByb3BlcnRpZXMgb2YgYSByZWZlcmVuY2VkIG9iamVjdC4iICk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIE1hcCBjb250ZXh0ID0gb2didWlsZGVyLmdldENvbnRleHQoKTsNCisgICAgICAgICAgICBjb250ZXh0LnB1dCggT2JqZWN0R3JhcGhCdWlsZGVyLk5PREVfTkFNRSwgbmFtZSApOw0KKyAgICAgICAgICAgIGNvbnRleHQucHV0KCBPYmplY3RHcmFwaEJ1aWxkZXIuTk9ERV9DTEFTUywgb2JqZWN0LmdldENsYXNzKCkgKTsNCisNCisgICAgICAgICAgICByZXR1cm4gb2JqZWN0Ow0KKyAgICAgICAgfQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdXRpbC9PYnNlcnZhYmxlTWFwLmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvT2JzZXJ2YWJsZU1hcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNDg4ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvT2JzZXJ2YWJsZU1hcC5qYXZhCkBAIC0wLDAgKzEsMTc3IEBACisvKg0KKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLg0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KK3BhY2thZ2UgZ3Jvb3Z5LnV0aWw7DQorDQoraW1wb3J0IGdyb292eS5sYW5nLkNsb3N1cmU7DQorDQoraW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsNCitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZVN1cHBvcnQ7DQoraW1wb3J0IGphdmEudXRpbC4qOw0KKw0KKy8qKg0KKyAqIE1hcCBkZWNvcmF0b3IgdGhhdCB3aWxsIHRyaWdnZXIgUHJvcGVydHlDaGFuZ2VFdmVudHMgd2hlbiBhIHZhbHVlIGNoYW5nZXMuPGJyPg0KKyAqIEFuIG9wdGlvbmFsIENsb3N1cmUgbWF5IGJlIHNwZWNpZmllZCBhbmQgd2lsbCB3b3JrIGFzIGEgZmlsdGVyLCBpZiBpdCByZXR1cm5zDQorICogdHJ1ZSB0aGUgcHJvcGVydHkgd2lsbCB0cmlnZ2VyIGFuIGV2ZW50IChpZiB0aGUgdmFsdWUgaW5kZWVkIGNoYW5nZWQpLA0KKyAqIG90aGVyd2lzZSBpdCB3b24ndC4gVGhlIENsb3N1cmUgbWF5IHJlY2VpdmUgMSBvciAyIHBhcmFtZXRlcnMsIHRoZSBzaW5nbGUgb25lDQorICogYmVpbmcgdGhlIHZhbHVlLCB0aGUgb3RoZXIgb25lIGJvdGggdGhlIGtleSBhbmQgdmFsdWUsIGZvciBleGFtcGxlOg0KKyAqIDxwcmU+DQorICogLy8gc2tpcCBhbGwgcHJvcGVydGllcyB3aG9zZSB2YWx1ZSBpcyBhIGNsb3N1cmUNCisgKiBkZWYgbWFwID0gbmV3IE9ic2VydmFibGVNYXAoIHshKGl0IGluc3RhbmNlb2YgQ2xvc3VyZSl9ICkNCisgKiA8cC8+DQorICogLy8gc2tpcCBhbGwgcHJvcGVydGllcyB3aG9zZSBuYW1lIG1hdGNoZXMgYSByZWdleA0KKyAqIGRlZiBtYXAgPSBuZXcgT2JzZXJ2YWJsZU1hcCggeyBuYW1lLCB2YWx1ZSAtJmd0OyAhKG5hbWUgPX4gL1tBLVorXS8pIH0gKQ0KKyAqIDwvcHJlPg0KKyAqDQorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86YWFsbWlyYXlAdXNlcnMuc291cmNlZm9yZ2UubmV0Ij5BbmRyZXMgQWxtaXJheTwvYT4NCisgKi8NCitwdWJsaWMgY2xhc3MgT2JzZXJ2YWJsZU1hcCBpbXBsZW1lbnRzIE1hcCB7DQorICAgIHByaXZhdGUgTWFwIGRlbGVnYXRlOw0KKyAgICBwcml2YXRlIFByb3BlcnR5Q2hhbmdlU3VwcG9ydCBwY3M7DQorICAgIHByaXZhdGUgQ2xvc3VyZSB0ZXN0Ow0KKw0KKyAgICBwdWJsaWMgT2JzZXJ2YWJsZU1hcCgpIHsNCisgICAgICAgIHRoaXMobmV3IExpbmtlZEhhc2hNYXAoKSwgbnVsbCk7DQorICAgIH0NCisNCisgICAgcHVibGljIE9ic2VydmFibGVNYXAoQ2xvc3VyZSB0ZXN0KSB7DQorICAgICAgICB0aGlzKG5ldyBMaW5rZWRIYXNoTWFwKCksIHRlc3QpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBPYnNlcnZhYmxlTWFwKE1hcCBkZWxlZ2F0ZSkgew0KKyAgICAgICAgdGhpcyhkZWxlZ2F0ZSwgbnVsbCk7DQorICAgIH0NCisNCisgICAgcHVibGljIE9ic2VydmFibGVNYXAoTWFwIGRlbGVnYXRlLCBDbG9zdXJlIHRlc3QpIHsNCisgICAgICAgIHRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTsNCisgICAgICAgIHRoaXMudGVzdCA9IHRlc3Q7DQorICAgICAgICBwY3MgPSBuZXcgUHJvcGVydHlDaGFuZ2VTdXBwb3J0KHRoaXMpOw0KKyAgICB9DQorDQorICAgIC8vIE1hcCBpbnRlcmZhY2UNCisNCisgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7DQorICAgICAgICBkZWxlZ2F0ZS5jbGVhcigpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KE9iamVjdCBrZXkpIHsNCisgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5jb250YWluc0tleShrZXkpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zVmFsdWUoT2JqZWN0IHZhbHVlKSB7DQorICAgICAgICByZXR1cm4gZGVsZWdhdGUuY29udGFpbnNWYWx1ZSh2YWx1ZSk7DQorICAgIH0NCisNCisgICAgcHVibGljIFNldCBlbnRyeVNldCgpIHsNCisgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5lbnRyeVNldCgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgbykgew0KKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmVxdWFscyhvKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgT2JqZWN0IGdldChPYmplY3Qga2V5KSB7DQorICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0KGtleSk7DQorICAgIH0NCisNCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsNCisgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5oYXNoQ29kZSgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7DQorICAgICAgICByZXR1cm4gZGVsZWdhdGUuaXNFbXB0eSgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTZXQga2V5U2V0KCkgew0KKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmtleVNldCgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBPYmplY3QgcHV0KE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgew0KKyAgICAgICAgT2JqZWN0IG9sZFZhbHVlID0gbnVsbDsNCisgICAgICAgIGlmICh0ZXN0ICE9IG51bGwpIHsNCisgICAgICAgICAgICBvbGRWYWx1ZSA9IGRlbGVnYXRlLnB1dChrZXksIHZhbHVlKTsNCisgICAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gbnVsbDsNCisgICAgICAgICAgICBpZiAodGVzdC5nZXRNYXhpbXVtTnVtYmVyT2ZQYXJhbWV0ZXJzKCkgPT0gMikgew0KKyAgICAgICAgICAgICAgICByZXN1bHQgPSB0ZXN0LmNhbGwobmV3IE9iamVjdFtdIHtrZXksIHZhbHVlfSk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gdGVzdC5jYWxsKHZhbHVlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdCBpbnN0YW5jZW9mIEJvb2xlYW4gJiYgKChCb29sZWFuKSByZXN1bHQpLmJvb2xlYW5WYWx1ZSgpKSB7DQorICAgICAgICAgICAgICAgIGlmIChvbGRWYWx1ZSAhPSB2YWx1ZSkgew0KKyAgICAgICAgICAgICAgICAgICAgcGNzLmZpcmVQcm9wZXJ0eUNoYW5nZShTdHJpbmcudmFsdWVPZihrZXkpLCBvbGRWYWx1ZSwgdmFsdWUpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBvbGRWYWx1ZSA9IGRlbGVnYXRlLnB1dChrZXksIHZhbHVlKTsNCisgICAgICAgICAgICBpZiAob2xkVmFsdWUgIT0gdmFsdWUpIHsNCisgICAgICAgICAgICAgICAgcGNzLmZpcmVQcm9wZXJ0eUNoYW5nZShTdHJpbmcudmFsdWVPZihrZXkpLCBvbGRWYWx1ZSwgdmFsdWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBvbGRWYWx1ZTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBwdXRBbGwoTWFwIG1hcCkgew0KKyAgICAgICAgaWYgKG1hcCAhPSBudWxsKSB7DQorICAgICAgICAgICAgZm9yIChJdGVyYXRvciBlbnRyaWVzID0gbWFwLmVudHJ5U2V0KCkNCisgICAgICAgICAgICAgICAgICAgIC5pdGVyYXRvcigpOyBlbnRyaWVzLmhhc05leHQoKTspIHsNCisgICAgICAgICAgICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgZW50cmllcy5uZXh0KCk7DQorDQorICAgICAgICAgICAgICAgIHB1dChlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlKE9iamVjdCBrZXkpIHsNCisgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5yZW1vdmUoa2V5KTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgaW50IHNpemUoKSB7DQorICAgICAgICByZXR1cm4gZGVsZWdhdGUuc2l6ZSgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBDb2xsZWN0aW9uIHZhbHVlcygpIHsNCisgICAgICAgIHJldHVybiBkZWxlZ2F0ZS52YWx1ZXMoKTsNCisgICAgfQ0KKw0KKyAgICAvLyBvYnNlcnZhYmxlIGludGVyZmFjZQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsNCisgICAgICAgIHBjcy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsNCisgICAgICAgIHBjcy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByb3BlcnR5TmFtZSwgbGlzdGVuZXIpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyW10gZ2V0UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoKSB7DQorICAgICAgICByZXR1cm4gcGNzLmdldFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJbXSBnZXRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7DQorICAgICAgICByZXR1cm4gcGNzLmdldFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKHByb3BlcnR5TmFtZSk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7DQorICAgICAgICBwY3MucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgcHJvcGVydHlOYW1lLCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7DQorICAgICAgICBwY3MucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eU5hbWUsIGxpc3RlbmVyKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNMaXN0ZW5lcnMoU3RyaW5nIHByb3BlcnR5TmFtZSkgew0KKyAgICAgICAgcmV0dXJuIHBjcy5oYXNMaXN0ZW5lcnMocHJvcGVydHlOYW1lKTsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvT3JkZXJCeS5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91dGlsL09yZGVyQnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2VkOGJkCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91dGlsL09yZGVyQnkuamF2YQpAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgZ3Jvb3Z5LnV0aWw7CisKK2ltcG9ydCBncm9vdnkubGFuZy5DbG9zdXJlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQSBoZWxwZXIgY2xhc3MgZm9yIHNvcnRpbmcgb2JqZWN0cyB2aWEgYSBjbG9zdXJlIHRvIHJldHVybiB0aGUgZmllbGQKKyAqIG9yIG9wZXJhdGlvbiBvbiB3aGljaCB0byBzb3J0LgorICogCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgT3JkZXJCeSBpbXBsZW1lbnRzIENvbXBhcmF0b3IgeworCisgICAgcHJpdmF0ZSBMaXN0IGNsb3N1cmVzOworCisgICAgcHVibGljIE9yZGVyQnkoKSB7CisgICAgICAgIHRoaXMuY2xvc3VyZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgfQorCisgICAgcHVibGljIE9yZGVyQnkoQ2xvc3VyZSBjbG9zdXJlKSB7CisgICAgICAgIHRoaXMoKTsKKyAgICAgICAgY2xvc3VyZXMuYWRkKGNsb3N1cmUpOworICAgIH0KKworICAgIHB1YmxpYyBPcmRlckJ5KExpc3QgY2xvc3VyZXMpIHsKKyAgICAgICAgdGhpcy5jbG9zdXJlcyA9IGNsb3N1cmVzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZChDbG9zdXJlIGNsb3N1cmUpIHsKKyAgICAgICAgY2xvc3VyZXMuYWRkKGNsb3N1cmUpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3Qgb2JqZWN0MSwgT2JqZWN0IG9iamVjdDIpIHsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gY2xvc3VyZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBDbG9zdXJlIGNsb3N1cmUgPSAoQ2xvc3VyZSkgaXRlci5uZXh0KCk7CisgICAgICAgICAgICBPYmplY3QgdmFsdWUxID0gY2xvc3VyZS5jYWxsKG9iamVjdDEpOworICAgICAgICAgICAgT2JqZWN0IHZhbHVlMiA9IGNsb3N1cmUuY2FsbChvYmplY3QyKTsKKworICAgICAgICAgICAgaWYgKHZhbHVlMSA9PSB2YWx1ZTIpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh2YWx1ZTEgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh2YWx1ZTEgaW5zdGFuY2VvZiBDb21wYXJhYmxlKSB7CisgICAgICAgICAgICAgICAgQ29tcGFyYWJsZSBjMSA9IChDb21wYXJhYmxlKSB2YWx1ZTE7CisgICAgICAgICAgICAgICAgcmV0dXJuIGMxLmNvbXBhcmVUbyh2YWx1ZTIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHZhbHVlMS5lcXVhbHModmFsdWUyKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHZhbHVlMS5oYXNoQ29kZSgpIC0gdmFsdWUyLmhhc2hDb2RlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91dGlsL1Byb3h5LmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvUHJveHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzQxN2IwCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91dGlsL1Byb3h5LmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGdyb292eS51dGlsOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0U3VwcG9ydDsKK2ltcG9ydCBncm9vdnkubGFuZy5NaXNzaW5nTWV0aG9kRXhjZXB0aW9uOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5JbnZva2VySGVscGVyOworCisvKioKKyAqIER5bmFtaWMgZ3Jvb3Z5IHByb3h5IGZvciBhbm90aGVyIG9iamVjdC4gIEFsbCBtZXRob2QKKyAqIGludm9jYXRpb25zIGdldCBmb3J3YXJkZWQgdG8gYWN0dWFsIG9iamVjdCwgdW5sZXNzIHRoZSBwcm94eSBvdmVycmlkZXMgaXQuCisgKiBTZWUgZ3Jvb3Z5L3V0aWwvUHJveHlUZXN0Lmdyb292eSBmb3IgdXNhZ2UgZGV0YWlscy4KKyAqCisgKiBAYXV0aG9yIFRyb3kgSGVuaW5nZXIKKyAqIEBhdXRob3IgRGllcmsgS29lbmlnCisgKi8KK3B1YmxpYyBjbGFzcyBQcm94eSBleHRlbmRzIEdyb292eU9iamVjdFN1cHBvcnQgeworCisgICAgcHJpdmF0ZSBPYmplY3QgYWRhcHRlZSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBmb3IgY29udmVuaWVuY2UuCisgICAgICogSXQgYWxsb3dzIHRvIGdldCBhcm91bmQgdGhlIG5lZWQgZm9yIGRlZmluaW5nIGR1bXAgY3RvcnMgaXMgc3ViY2xhc3Nlcy4KKyAgICAgKiBTZWUgdW5pdCB0ZXN0cyBmb3IgZGV0YWlscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJveHkgd3JhcChPYmplY3QgYWRhcHRlZSl7CisgICAgICAgIHNldEFkYXB0ZWUoYWRhcHRlZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlZSgpIHsKKyAgICAgICAgcmV0dXJuIGFkYXB0ZWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QWRhcHRlZShPYmplY3QgYWRhcHRlZSkgeworICAgICAgICB0aGlzLmFkYXB0ZWUgPSBhZGFwdGVlOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgaW52b2tlTWV0aG9kKFN0cmluZyBuYW1lLCBPYmplY3QgYXJncykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmludm9rZU1ldGhvZChuYW1lLCBhcmdzKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoTWlzc2luZ01ldGhvZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gSW52b2tlckhlbHBlci5nZXRNZXRhQ2xhc3MoYWRhcHRlZSkuaW52b2tlTWV0aG9kKGFkYXB0ZWUsIG5hbWUsIGFyZ3MpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIEludm9rZXJIZWxwZXIuYXNJdGVyYXRvcihhZGFwdGVlKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdXRpbC9Qcm94eUdlbmVyYXRvci5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91dGlsL1Byb3h5R2VuZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE2YWY4NwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdXRpbC9Qcm94eUdlbmVyYXRvci5qYXZhCkBAIC0wLDAgKzEsNDI2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgZ3Jvb3Z5LnV0aWw7CisKK2ltcG9ydCBncm9vdnkubGFuZy4qOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5NdWx0aXBsZUNvbXBpbGF0aW9uRXJyb3JzRXhjZXB0aW9uOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5EZWZhdWx0R3Jvb3Z5TWV0aG9kczsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworLyoqCisgKiBDbGFzc2VzIHRvIGdlbmVyYXRlICdQcm94eScgb2JqZWN0cyB3aGljaCBpbXBsZW1lbnQgaW50ZXJmYWNlcworICogYW5kL29yIGV4dGVuZCBjbGFzc2VzLgorICoKKyAqIEBhdXRob3IgUGF1bCBLaW5nCisgKiBAYXV0aG9yIEd1aWxsYXVtZSBMYWZvcmdlCisgKi8KK3B1YmxpYyBjbGFzcyBQcm94eUdlbmVyYXRvciB7CisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGRlYnVnID0gZmFsc2U7CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBpbnN0YW50aWF0ZUFnZ3JlZ2F0ZUZyb21CYXNlQ2xhc3MoQ2xhc3MgY2xhenopIHsKKyAgICAgICAgcmV0dXJuIGluc3RhbnRpYXRlQWdncmVnYXRlRnJvbUJhc2VDbGFzcyhudWxsLCBjbGF6eik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW5zdGFudGlhdGVBZ2dyZWdhdGVGcm9tQmFzZUNsYXNzKE1hcCBtYXAsIENsYXNzIGNsYXp6KSB7CisgICAgICAgIHJldHVybiBpbnN0YW50aWF0ZUFnZ3JlZ2F0ZUZyb21CYXNlQ2xhc3MobWFwLCBjbGF6eiwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW5zdGFudGlhdGVBZ2dyZWdhdGVGcm9tQmFzZUNsYXNzKE1hcCBtYXAsIENsYXNzIGNsYXp6LCBPYmplY3RbXSBjb25zdHJ1Y3RvckFyZ3MpIHsKKyAgICAgICAgcmV0dXJuIGluc3RhbnRpYXRlQWdncmVnYXRlKG1hcCwgbnVsbCwgY2xhenosIGNvbnN0cnVjdG9yQXJncyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW5zdGFudGlhdGVBZ2dyZWdhdGVGcm9tSW50ZXJmYWNlKENsYXNzIGNsYXp6KSB7CisgICAgICAgIHJldHVybiBpbnN0YW50aWF0ZUFnZ3JlZ2F0ZUZyb21JbnRlcmZhY2UobnVsbCwgY2xhenopOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGluc3RhbnRpYXRlQWdncmVnYXRlRnJvbUludGVyZmFjZShNYXAgbWFwLCBDbGFzcyBjbGF6eikgeworICAgICAgICBMaXN0IGludGVyZmFjZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGludGVyZmFjZXMuYWRkKGNsYXp6KTsKKyAgICAgICAgcmV0dXJuIGluc3RhbnRpYXRlQWdncmVnYXRlKG1hcCwgaW50ZXJmYWNlcyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW5zdGFudGlhdGVBZ2dyZWdhdGUoTGlzdCBpbnRlcmZhY2VzKSB7CisgICAgICAgIHJldHVybiBpbnN0YW50aWF0ZUFnZ3JlZ2F0ZShudWxsLCBpbnRlcmZhY2VzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBpbnN0YW50aWF0ZUFnZ3JlZ2F0ZShNYXAgY2xvc3VyZU1hcCwgTGlzdCBpbnRlcmZhY2VzKSB7CisgICAgICAgIHJldHVybiBpbnN0YW50aWF0ZUFnZ3JlZ2F0ZShjbG9zdXJlTWFwLCBpbnRlcmZhY2VzLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBpbnN0YW50aWF0ZUFnZ3JlZ2F0ZShNYXAgY2xvc3VyZU1hcCwgTGlzdCBpbnRlcmZhY2VzLCBDbGFzcyBjbGF6eikgeworICAgICAgICByZXR1cm4gaW5zdGFudGlhdGVBZ2dyZWdhdGUoY2xvc3VyZU1hcCwgaW50ZXJmYWNlcywgY2xhenosIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGluc3RhbnRpYXRlQWdncmVnYXRlKE1hcCBjbG9zdXJlTWFwLCBMaXN0IGludGVyZmFjZXMsIENsYXNzIGNsYXp6LCBPYmplY3RbXSBjb25zdHJ1Y3RvckFyZ3MpIHsKKyAgICAgICAgTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIGlmIChjbG9zdXJlTWFwICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1hcCA9IGNsb3N1cmVNYXA7CisgICAgICAgIH0KKyAgICAgICAgTGlzdCBpbnRlcmZhY2VzVG9JbXBsZW1lbnQgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGlmIChpbnRlcmZhY2VzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludGVyZmFjZXNUb0ltcGxlbWVudCA9IGludGVyZmFjZXM7CisgICAgICAgIH0KKyAgICAgICAgQ2xhc3MgYmFzZUNsYXNzID0gR3Jvb3Z5T2JqZWN0U3VwcG9ydC5jbGFzczsKKyAgICAgICAgaWYgKGNsYXp6ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJhc2VDbGFzcyA9IGNsYXp6OworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gaGFzQXJncyA9IGNvbnN0cnVjdG9yQXJncyAhPSBudWxsICYmIGNvbnN0cnVjdG9yQXJncy5sZW5ndGggPiAwOworICAgICAgICBTdHJpbmcgbmFtZSA9IHNob3J0TmFtZShiYXNlQ2xhc3MuZ2V0TmFtZSgpKSArICJfZ3Jvb3Z5UHJveHkiOworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCisgICAgICAgIC8vIGFkZCBjbGFzcyBoZWFkZXIgYW5kIGZpZWxkcworICAgICAgICBidWZmZXIuYXBwZW5kKCJjbGFzcyAiKS5hcHBlbmQobmFtZSk7CisgICAgICAgIGlmIChjbGF6eiAhPSBudWxsKSB7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIgZXh0ZW5kcyAiKS5hcHBlbmQoYmFzZUNsYXNzLmdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcmZhY2VzVG9JbXBsZW1lbnQuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIENsYXNzIHRoaXNJbnRlcmZhY2UgPSAoQ2xhc3MpIGludGVyZmFjZXNUb0ltcGxlbWVudC5nZXQoaSk7CisgICAgICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiIGltcGxlbWVudHMgIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiwgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKHRoaXNJbnRlcmZhY2UuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBidWZmZXIuYXBwZW5kKCIge1xuIikuYXBwZW5kKCIgICAgcHJpdmF0ZSBjbG9zdXJlTWFwXG4gICAgIik7CisKKyAgICAgICAgLy8gYWRkIGNvbnN0cnVjdG9yCisgICAgICAgIGJ1ZmZlci5hcHBlbmQobmFtZSkuYXBwZW5kKCIobWFwIik7CisgICAgICAgIGlmIChoYXNBcmdzKSB7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIsIGFyZ3MiKTsKKyAgICAgICAgfQorICAgICAgICBidWZmZXIuYXBwZW5kKCIpIHtcbiIpOworICAgICAgICBidWZmZXIuYXBwZW5kKCIgICAgICAgIHN1cGVyKCIpOworICAgICAgICBpZiAoaGFzQXJncykgeworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiKmFyZ3MiKTsKKyAgICAgICAgfQorICAgICAgICBidWZmZXIuYXBwZW5kKCIpXG4iKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiICAgICAgICB0aGlzLmNsb3N1cmVNYXAgPSBtYXBcbiIpOworICAgICAgICBidWZmZXIuYXBwZW5kKCIgICAgfVxuIik7CisKKyAgICAgICAgLy8gYWRkIG92ZXJ3cml0aW5nIG1ldGhvZHMKKyAgICAgICAgTGlzdCBzZWxlY3RlZE1ldGhvZHMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIExpc3QgcHVibGljQW5kUHJvdGVjdGVkTWV0aG9kcyA9IERlZmF1bHRHcm9vdnlNZXRob2RzLnRvTGlzdChiYXNlQ2xhc3MuZ2V0TWV0aG9kcygpKTsKKyAgICAgICAgcHVibGljQW5kUHJvdGVjdGVkTWV0aG9kcy5hZGRBbGwoZ2V0SW5oZXJpdGVkTWV0aG9kcyhiYXNlQ2xhc3MpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwdWJsaWNBbmRQcm90ZWN0ZWRNZXRob2RzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBNZXRob2QgbWV0aG9kID0gKE1ldGhvZCkgcHVibGljQW5kUHJvdGVjdGVkTWV0aG9kcy5nZXQoaSk7CisgICAgICAgICAgICBpZiAobWFwLmNvbnRhaW5zS2V5KG1ldGhvZC5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgc2VsZWN0ZWRNZXRob2RzLmFkZChtZXRob2QuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBhZGRPdmVycmlkaW5nTWFwQ2FsbChidWZmZXIsIG1ldGhvZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBhZGQgaW50ZXJmYWNlIG1ldGhvZHMKKyAgICAgICAgTGlzdCBpbnRlcmZhY2VNZXRob2RzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGludGVyZmFjZXNUb0ltcGxlbWVudC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgQ2xhc3MgdGhpc0ludGVyZmFjZSA9IChDbGFzcykgaW50ZXJmYWNlc1RvSW1wbGVtZW50LmdldChpKTsKKyAgICAgICAgICAgIGludGVyZmFjZU1ldGhvZHMuYWRkQWxsKERlZmF1bHRHcm9vdnlNZXRob2RzLnRvTGlzdCh0aGlzSW50ZXJmYWNlLmdldE1ldGhvZHMoKSkpOworICAgICAgICAgICAgaW50ZXJmYWNlTWV0aG9kcy5hZGRBbGwoZ2V0SW5oZXJpdGVkTWV0aG9kcyh0aGlzSW50ZXJmYWNlKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcmZhY2VNZXRob2RzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBNZXRob2QgbWV0aG9kID0gKE1ldGhvZCkgaW50ZXJmYWNlTWV0aG9kcy5nZXQoaSk7CisgICAgICAgICAgICBpZiAoIWNvbnRhaW5zRXF1aXZhbGVudE1ldGhvZChwdWJsaWNBbmRQcm90ZWN0ZWRNZXRob2RzLCBtZXRob2QpKSB7CisgICAgICAgICAgICAgICAgc2VsZWN0ZWRNZXRob2RzLmFkZChtZXRob2QuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBhZGRNYXBPckR1bW15Q2FsbChtYXAsIGJ1ZmZlciwgbWV0aG9kKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGFkZCBsZWZ0b3ZlciBtZXRob2RzIGZyb20gdGhlIG1hcAorICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbWFwLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXRob2ROYW1lID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOworICAgICAgICAgICAgaWYgKHNlbGVjdGVkTWV0aG9kcy5jb250YWlucyhtZXRob2ROYW1lKSkgY29udGludWU7CisgICAgICAgICAgICBhZGROZXdNYXBDYWxsKGJ1ZmZlciwgbWV0aG9kTmFtZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBlbmQgY2xhc3MKKworICAgICAgICBidWZmZXIuYXBwZW5kKCJ9XG4iKS5hcHBlbmQoIm5ldyAiKS5hcHBlbmQobmFtZSk7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIihtYXAiKTsKKyAgICAgICAgaWYgKGhhc0FyZ3MpIHsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiwgY29uc3RydWN0b3JBcmdzIik7CisgICAgICAgIH0KKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiKSIpOworCisgICAgICAgIEJpbmRpbmcgYmluZGluZyA9IG5ldyBCaW5kaW5nKCk7CisgICAgICAgIGJpbmRpbmcuc2V0VmFyaWFibGUoIm1hcCIsIG1hcCk7CisgICAgICAgIGJpbmRpbmcuc2V0VmFyaWFibGUoImNvbnN0cnVjdG9yQXJncyIsIGNvbnN0cnVjdG9yQXJncyk7CisgICAgICAgIENsYXNzTG9hZGVyIGNsID0gYmFzZUNsYXNzLmdldENsYXNzTG9hZGVyKCk7CisgICAgICAgIGlmIChjbGF6eiA9PSBudWxsICYmIGludGVyZmFjZXNUb0ltcGxlbWVudC5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBDbGFzcyBjID0gKENsYXNzKSBpbnRlcmZhY2VzVG9JbXBsZW1lbnQuZ2V0KDApOworICAgICAgICAgICAgY2wgPSBjLmdldENsYXNzTG9hZGVyKCk7CisgICAgICAgIH0KKyAgICAgICAgR3Jvb3Z5U2hlbGwgc2hlbGwgPSBuZXcgR3Jvb3Z5U2hlbGwoY2wsIGJpbmRpbmcpOworICAgICAgICBpZiAoZGVidWcpCisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInByb3h5IHNvdXJjZTpcbi0tLS0tLS0tLS0tLS0tLS0tLVxuIiArIGJ1ZmZlci50b1N0cmluZygpICsgIlxuLS0tLS0tLS0tLS0tLS0tLS0tIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gc2hlbGwuZXZhbHVhdGUoYnVmZmVyLnRvU3RyaW5nKCkpOworICAgICAgICB9IGNhdGNoIChNdWx0aXBsZUNvbXBpbGF0aW9uRXJyb3JzRXhjZXB0aW9uIGVycikgeworICAgICAgICAgICAgdGhyb3cgbmV3IEdyb292eVJ1bnRpbWVFeGNlcHRpb24oIkVycm9yIGNyZWF0aW5nIHByb3h5OiAiICsgZXJyLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBpbnN0YW50aWF0ZURlbGVnYXRlKE9iamVjdCBkZWxlZ2F0ZSkgeworICAgICAgICByZXR1cm4gaW5zdGFudGlhdGVEZWxlZ2F0ZShudWxsLCBkZWxlZ2F0ZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW5zdGFudGlhdGVEZWxlZ2F0ZShMaXN0IGludGVyZmFjZXMsIE9iamVjdCBkZWxlZ2F0ZSkgeworICAgICAgICByZXR1cm4gaW5zdGFudGlhdGVEZWxlZ2F0ZShudWxsLCBpbnRlcmZhY2VzLCBkZWxlZ2F0ZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW5zdGFudGlhdGVEZWxlZ2F0ZShNYXAgY2xvc3VyZU1hcCwgTGlzdCBpbnRlcmZhY2VzLCBPYmplY3QgZGVsZWdhdGUpIHsKKyAgICAgICAgcmV0dXJuIGluc3RhbnRpYXRlRGVsZWdhdGVXaXRoQmFzZUNsYXNzKGNsb3N1cmVNYXAsIGludGVyZmFjZXMsIGRlbGVnYXRlLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBpbnN0YW50aWF0ZURlbGVnYXRlV2l0aEJhc2VDbGFzcyhNYXAgY2xvc3VyZU1hcCwgTGlzdCBpbnRlcmZhY2VzLCBPYmplY3QgZGVsZWdhdGUpIHsKKyAgICAgICAgcmV0dXJuIGluc3RhbnRpYXRlRGVsZWdhdGVXaXRoQmFzZUNsYXNzKGNsb3N1cmVNYXAsIGludGVyZmFjZXMsIGRlbGVnYXRlLCBkZWxlZ2F0ZS5nZXRDbGFzcygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBpbnN0YW50aWF0ZURlbGVnYXRlV2l0aEJhc2VDbGFzcyhNYXAgY2xvc3VyZU1hcCwgTGlzdCBpbnRlcmZhY2VzLCBPYmplY3QgZGVsZWdhdGUsIENsYXNzIGJhc2VDbGFzcykgeworICAgICAgICBNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgaWYgKGNsb3N1cmVNYXAgIT0gbnVsbCkgeworICAgICAgICAgICAgbWFwID0gY2xvc3VyZU1hcDsKKyAgICAgICAgfQorICAgICAgICBMaXN0IHNlbGVjdGVkTWV0aG9kcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgTGlzdCBpbnRlcmZhY2VzVG9JbXBsZW1lbnQgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGlmIChpbnRlcmZhY2VzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludGVyZmFjZXNUb0ltcGxlbWVudCA9IGludGVyZmFjZXM7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIG5hbWUgPSBzaG9ydE5hbWUoZGVsZWdhdGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpICsgIl9kZWxlZ2F0ZVByb3h5IjsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgICAgICAvLyBhZGQgY2xhc3MgaGVhZGVyIGFuZCBmaWVsZHMKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5JbnZva2VySGVscGVyXG5jbGFzcyAiKS5hcHBlbmQobmFtZSk7CisgICAgICAgIGlmIChiYXNlQ2xhc3MgIT0gbnVsbCkgeworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiIGV4dGVuZHMgIikuYXBwZW5kKGJhc2VDbGFzcy5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGludGVyZmFjZXNUb0ltcGxlbWVudC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgQ2xhc3MgdGhpc0ludGVyZmFjZSA9IChDbGFzcykgaW50ZXJmYWNlc1RvSW1wbGVtZW50LmdldChpKTsKKyAgICAgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIgaW1wbGVtZW50cyAiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQodGhpc0ludGVyZmFjZS5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiB7XG4iKS5hcHBlbmQoIiAgICBwcml2YXRlIGRlbGVnYXRlXG4iKS5hcHBlbmQoIiAgICBwcml2YXRlIGNsb3N1cmVNYXBcbiAgICAiKTsKKworICAgICAgICAvLyBhZGQgY29uc3RydWN0b3IKKyAgICAgICAgYnVmZmVyLmFwcGVuZChuYW1lKS5hcHBlbmQoIihtYXAsIGRlbGVnYXRlKSB7XG4iKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiICAgICAgICB0aGlzLmNsb3N1cmVNYXAgPSBtYXBcbiIpOworICAgICAgICBidWZmZXIuYXBwZW5kKCIgICAgICAgIHRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZVxuIik7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiAgICB9XG4iKTsKKworICAgICAgICBMaXN0IG9iamVjdE1ldGhvZHMgPSBEZWZhdWx0R3Jvb3Z5TWV0aG9kcy50b0xpc3QoT2JqZWN0LmNsYXNzLmdldE1ldGhvZHMoKSk7CisgICAgICAgIG9iamVjdE1ldGhvZHMuYWRkQWxsKGdldEluaGVyaXRlZE1ldGhvZHMoT2JqZWN0LmNsYXNzKSk7CisKKyAgICAgICAgTGlzdCBncm9vdnlPYmplY3RNZXRob2RzID0gRGVmYXVsdEdyb292eU1ldGhvZHMudG9MaXN0KEdyb292eU9iamVjdC5jbGFzcy5nZXRNZXRob2RzKCkpOworICAgICAgICBncm9vdnlPYmplY3RNZXRob2RzLmFkZEFsbChnZXRJbmhlcml0ZWRNZXRob2RzKEdyb292eU9iamVjdC5jbGFzcykpOworCisgICAgICAgIC8vIGFkZCBpbnRlcmZhY2UgbWV0aG9kcworICAgICAgICBMaXN0IGludGVyZmFjZU1ldGhvZHMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJmYWNlc1RvSW1wbGVtZW50LnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBDbGFzcyB0aGlzSW50ZXJmYWNlID0gKENsYXNzKSBpbnRlcmZhY2VzVG9JbXBsZW1lbnQuZ2V0KGkpOworICAgICAgICAgICAgaW50ZXJmYWNlTWV0aG9kcy5hZGRBbGwoRGVmYXVsdEdyb292eU1ldGhvZHMudG9MaXN0KHRoaXNJbnRlcmZhY2UuZ2V0TWV0aG9kcygpKSk7CisgICAgICAgICAgICBpbnRlcmZhY2VNZXRob2RzLmFkZEFsbChnZXRJbmhlcml0ZWRNZXRob2RzKHRoaXNJbnRlcmZhY2UpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGludGVyZmFjZU1ldGhvZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSAoTWV0aG9kKSBpbnRlcmZhY2VNZXRob2RzLmdldChpKTsKKyAgICAgICAgICAgIGlmICghY29udGFpbnNFcXVpdmFsZW50TWV0aG9kKG9iamVjdE1ldGhvZHMsIG1ldGhvZCkgJiYKKyAgICAgICAgICAgICAgICAgICAgIWNvbnRhaW5zRXF1aXZhbGVudE1ldGhvZChncm9vdnlPYmplY3RNZXRob2RzLCBtZXRob2QpKSB7CisgICAgICAgICAgICAgICAgc2VsZWN0ZWRNZXRob2RzLmFkZChtZXRob2QuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBhZGRXcmFwcGVkQ2FsbChidWZmZXIsIG1ldGhvZCwgbWFwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBMaXN0IGFkZGl0aW9uYWxNZXRob2RzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBhZGRpdGlvbmFsTWV0aG9kcy5hZGRBbGwoRGVmYXVsdEdyb292eU1ldGhvZHMudG9MaXN0KGRlbGVnYXRlLmdldENsYXNzKCkuZ2V0TWV0aG9kcygpKSk7CisgICAgICAgIGFkZGl0aW9uYWxNZXRob2RzLmFkZEFsbChnZXRJbmhlcml0ZWRNZXRob2RzKGRlbGVnYXRlLmdldENsYXNzKCkpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhZGRpdGlvbmFsTWV0aG9kcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9IChNZXRob2QpIGFkZGl0aW9uYWxNZXRob2RzLmdldChpKTsKKyAgICAgICAgICAgIGlmICghY29udGFpbnNFcXVpdmFsZW50TWV0aG9kKGludGVyZmFjZU1ldGhvZHMsIG1ldGhvZCkgJiYKKyAgICAgICAgICAgICAgICAgICAgIWNvbnRhaW5zRXF1aXZhbGVudE1ldGhvZChvYmplY3RNZXRob2RzLCBtZXRob2QpICYmCisgICAgICAgICAgICAgICAgICAgICFjb250YWluc0VxdWl2YWxlbnRNZXRob2QoZ3Jvb3Z5T2JqZWN0TWV0aG9kcywgbWV0aG9kKSkgeworICAgICAgICAgICAgICAgIHNlbGVjdGVkTWV0aG9kcy5hZGQobWV0aG9kLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgYWRkV3JhcHBlZENhbGwoYnVmZmVyLCBtZXRob2QsIG1hcCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBhZGQgbGVmdG92ZXIgbWV0aG9kcyBmcm9tIHRoZSBtYXAKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChzZWxlY3RlZE1ldGhvZHMuY29udGFpbnMobWV0aG9kTmFtZSkpIGNvbnRpbnVlOworICAgICAgICAgICAgYWRkTmV3TWFwQ2FsbChidWZmZXIsIG1ldGhvZE5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZW5kIGNsYXNzCisKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgifVxuIikuYXBwZW5kKCJuZXcgIikuYXBwZW5kKG5hbWUpOworICAgICAgICBidWZmZXIuYXBwZW5kKCIobWFwLCBkZWxlZ2F0ZSkiKTsKKworICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSBuZXcgQmluZGluZygpOworICAgICAgICBiaW5kaW5nLnNldFZhcmlhYmxlKCJtYXAiLCBtYXApOworICAgICAgICBiaW5kaW5nLnNldFZhcmlhYmxlKCJkZWxlZ2F0ZSIsIGRlbGVnYXRlKTsKKyAgICAgICAgQ2xhc3NMb2FkZXIgY2wgPSBkZWxlZ2F0ZS5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7CisgICAgICAgIEdyb292eVNoZWxsIHNoZWxsID0gbmV3IEdyb292eVNoZWxsKGNsLCBiaW5kaW5nKTsKKyAgICAgICAgaWYgKGRlYnVnKQorICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJwcm94eSBzb3VyY2U6XG4tLS0tLS0tLS0tLS0tLS0tLS1cbiIgKyBidWZmZXIudG9TdHJpbmcoKSArICJcbi0tLS0tLS0tLS0tLS0tLS0tLSIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIHNoZWxsLmV2YWx1YXRlKGJ1ZmZlci50b1N0cmluZygpKTsKKyAgICAgICAgfSBjYXRjaCAoTXVsdGlwbGVDb21waWxhdGlvbkVycm9yc0V4Y2VwdGlvbiBlcnIpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBHcm9vdnlSdW50aW1lRXhjZXB0aW9uKCJFcnJvciBjcmVhdGluZyBwcm94eTogIiArIGVyci5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRXcmFwcGVkQ2FsbChTdHJpbmdCdWZmZXIgYnVmZmVyLCBNZXRob2QgbWV0aG9kLCBNYXAgbWFwKSB7CisgICAgICAgIGlmIChtYXAuY29udGFpbnNLZXkobWV0aG9kLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgIGFkZE92ZXJyaWRpbmdNYXBDYWxsKGJ1ZmZlciwgbWV0aG9kKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIENsYXNzW10gcGFyYW1ldGVyVHlwZXMgPSBhZGRNZXRob2RQcmVmaXgoYnVmZmVyLCBtZXRob2QpOworICAgICAgICAgICAgYWRkV3JhcHBlZE1ldGhvZEJvZHkoYnVmZmVyLCBtZXRob2QsIHBhcmFtZXRlclR5cGVzKTsKKyAgICAgICAgICAgIGFkZE1ldGhvZFN1ZmZpeChidWZmZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb250YWluc0VxdWl2YWxlbnRNZXRob2QoTGlzdCBwdWJsaWNBbmRQcm90ZWN0ZWRNZXRob2RzLCBNZXRob2QgY2FuZGlkYXRlKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHVibGljQW5kUHJvdGVjdGVkTWV0aG9kcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9IChNZXRob2QpIHB1YmxpY0FuZFByb3RlY3RlZE1ldGhvZHMuZ2V0KGkpOworICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZS5nZXROYW1lKCkuZXF1YWxzKG1ldGhvZC5nZXROYW1lKCkpICYmCisgICAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZS5nZXRSZXR1cm5UeXBlKCkuZXF1YWxzKG1ldGhvZC5nZXRSZXR1cm5UeXBlKCkpICYmCisgICAgICAgICAgICAgICAgICAgIGhhc01hdGNoaW5nUGFyYW1ldGVyVHlwZXMoY2FuZGlkYXRlLCBtZXRob2QpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaGFzTWF0Y2hpbmdQYXJhbWV0ZXJUeXBlcyhNZXRob2QgbWV0aG9kLCBNZXRob2QgY2FuZGlkYXRlKSB7CisgICAgICAgIENsYXNzW10gY2FuZGlkYXRlUGFyYW1UeXBlcyA9IGNhbmRpZGF0ZS5nZXRQYXJhbWV0ZXJUeXBlcygpOworICAgICAgICBDbGFzc1tdIG1ldGhvZFBhcmFtVHlwZXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKKyAgICAgICAgaWYgKGNhbmRpZGF0ZVBhcmFtVHlwZXMubGVuZ3RoICE9IG1ldGhvZFBhcmFtVHlwZXMubGVuZ3RoKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kUGFyYW1UeXBlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKCFjYW5kaWRhdGVQYXJhbVR5cGVzW2ldLmVxdWFscyhtZXRob2RQYXJhbVR5cGVzW2ldKSkgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIExpc3QgZ2V0SW5oZXJpdGVkTWV0aG9kcyhDbGFzcyBiYXNlQ2xhc3MpIHsKKyAgICAgICAgTGlzdCBwcm90ZWN0ZWRNZXRob2RMaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBDbGFzcyBjdXJyZW50Q2xhc3MgPSBiYXNlQ2xhc3M7CisgICAgICAgIHdoaWxlIChjdXJyZW50Q2xhc3MgIT0gbnVsbCkgeworICAgICAgICAgICAgTWV0aG9kW10gcHJvdGVjdGVkTWV0aG9kcyA9IGN1cnJlbnRDbGFzcy5nZXREZWNsYXJlZE1ldGhvZHMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdGVjdGVkTWV0aG9kcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSBwcm90ZWN0ZWRNZXRob2RzW2ldOworICAgICAgICAgICAgICAgIGlmIChNb2RpZmllci5pc1Byb3RlY3RlZChtZXRob2QuZ2V0TW9kaWZpZXJzKCkpKQorICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWRNZXRob2RMaXN0LmFkZChtZXRob2QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY3VycmVudENsYXNzID0gY3VycmVudENsYXNzLmdldFN1cGVyY2xhc3MoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcHJvdGVjdGVkTWV0aG9kTGlzdDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZE5ld01hcENhbGwoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIG1ldGhvZE5hbWUpIHsKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiICAgIGRlZiAiKS5hcHBlbmQobWV0aG9kTmFtZSkuYXBwZW5kKCIoT2JqZWN0W10gYXJncykge1xuIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCIgICAgICAgIHRoaXMuQGNsb3N1cmVNYXBbJyIpLmFwcGVuZChtZXRob2ROYW1lKS5hcHBlbmQoIiddICgqYXJncylcbiAgICB9XG4iKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZE92ZXJyaWRpbmdNYXBDYWxsKFN0cmluZ0J1ZmZlciBidWZmZXIsIE1ldGhvZCBtZXRob2QpIHsKKyAgICAgICAgQ2xhc3NbXSBwYXJhbWV0ZXJUeXBlcyA9IGFkZE1ldGhvZFByZWZpeChidWZmZXIsIG1ldGhvZCk7CisgICAgICAgIGFkZE1ldGhvZEJvZHkoYnVmZmVyLCBtZXRob2QsIHBhcmFtZXRlclR5cGVzKTsKKyAgICAgICAgYWRkTWV0aG9kU3VmZml4KGJ1ZmZlcik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRNYXBPckR1bW15Q2FsbChNYXAgbWFwLCBTdHJpbmdCdWZmZXIgYnVmZmVyLCBNZXRob2QgbWV0aG9kKSB7CisgICAgICAgIENsYXNzW10gcGFyYW1ldGVyVHlwZXMgPSBhZGRNZXRob2RQcmVmaXgoYnVmZmVyLCBtZXRob2QpOworICAgICAgICBpZiAobWFwLmNvbnRhaW5zS2V5KG1ldGhvZC5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICBhZGRNZXRob2RCb2R5KGJ1ZmZlciwgbWV0aG9kLCBwYXJhbWV0ZXJUeXBlcyk7CisgICAgICAgIH0KKyAgICAgICAgYWRkTWV0aG9kU3VmZml4KGJ1ZmZlcik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3NbXSBhZGRNZXRob2RQcmVmaXgoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgTWV0aG9kIG1ldGhvZCkgeworICAgICAgICBidWZmZXIuYXBwZW5kKCIgICAgIikuYXBwZW5kKGdldFNpbXBsZU5hbWUobWV0aG9kLmdldFJldHVyblR5cGUoKSkpCisgICAgICAgICAgICAgICAgLmFwcGVuZCgiICIpLmFwcGVuZChtZXRob2QuZ2V0TmFtZSgpKS5hcHBlbmQoIigiKTsKKyAgICAgICAgQ2xhc3NbXSBwYXJhbWV0ZXJUeXBlcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOworICAgICAgICBmb3IgKGludCBwYXJhbWV0ZXJUeXBlSW5kZXggPSAwOyBwYXJhbWV0ZXJUeXBlSW5kZXggPCBwYXJhbWV0ZXJUeXBlcy5sZW5ndGg7IHBhcmFtZXRlclR5cGVJbmRleCsrKSB7CisgICAgICAgICAgICBDbGFzcyBwYXJhbWV0ZXIgPSBwYXJhbWV0ZXJUeXBlc1twYXJhbWV0ZXJUeXBlSW5kZXhdOworICAgICAgICAgICAgaWYgKHBhcmFtZXRlclR5cGVJbmRleCAhPSAwKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoZ2V0U2ltcGxlTmFtZShwYXJhbWV0ZXIpKS5hcHBlbmQoIiAiKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCJwIikuYXBwZW5kKHBhcmFtZXRlclR5cGVJbmRleCk7CisgICAgICAgIH0KKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiKSB7ICIpOworICAgICAgICByZXR1cm4gcGFyYW1ldGVyVHlwZXM7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRNZXRob2RCb2R5KFN0cmluZ0J1ZmZlciBidWZmZXIsIE1ldGhvZCBtZXRob2QsIENsYXNzW10gcGFyYW1ldGVyVHlwZXMpIHsKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgidGhpcy5AY2xvc3VyZU1hcFsnIikuYXBwZW5kKG1ldGhvZC5nZXROYW1lKCkpLmFwcGVuZCgiJ10gKCIpOworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHBhcmFtZXRlclR5cGVzLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICBpZiAoaiAhPSAwKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoInAiKS5hcHBlbmQoaik7CisgICAgICAgIH0KKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiKSIpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkV3JhcHBlZE1ldGhvZEJvZHkoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgTWV0aG9kIG1ldGhvZCwgQ2xhc3NbXSBwYXJhbWV0ZXJUeXBlcykgeworICAgICAgICBidWZmZXIuYXBwZW5kKCJcbiAgICAgICAgT2JqZWN0W10gYXJncyA9IFsiKTsKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwYXJhbWV0ZXJUeXBlcy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgaWYgKGogIT0gMCkgeworICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiwgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCJwIikuYXBwZW5kKGopOworICAgICAgICB9CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIl1cbiAgICAgICAgIik7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIkludm9rZXJIZWxwZXIuaW52b2tlTWV0aG9kKGRlbGVnYXRlLCAnIikuYXBwZW5kKG1ldGhvZC5nZXROYW1lKCkpLmFwcGVuZCgiJywgYXJncylcbiIpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkTWV0aG9kU3VmZml4KFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiICAgIH1cbiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRPRE8gb25jZSB3ZSBzd2l0Y2ggdG8gSmF2YSAxLjUgYnQgZGVmYXVsdCwgdXNlIENsYXNzI2dldFNpbXBsZU5hbWUoKSBkaXJlY3RseQorICAgICAqCisgICAgICogQHBhcmFtIGMgdGhlIGNsYXNzIG9mIHdoaWNoIHdlIHdhbnQgdGhlIHJlYWRhYmxlIHNpbXBsZSBuYW1lCisgICAgICogQHJldHVybiB0aGUgcmVhZGFibGUgc2ltcGxlIG5hbWUKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U2ltcGxlTmFtZShDbGFzcyBjKSB7CisgICAgICAgIGlmIChjLmlzQXJyYXkoKSkgeworICAgICAgICAgICAgaW50IGRpbWVuc2lvbiA9IDA7CisgICAgICAgICAgICBDbGFzcyBjb21wb25lbnRDbGFzcyA9IGM7CisgICAgICAgICAgICB3aGlsZSAoY29tcG9uZW50Q2xhc3MuaXNBcnJheSgpKSB7CisgICAgICAgICAgICAgICAgY29tcG9uZW50Q2xhc3MgPSBjb21wb25lbnRDbGFzcy5nZXRDb21wb25lbnRUeXBlKCk7CisgICAgICAgICAgICAgICAgZGltZW5zaW9uKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50Q2xhc3MuZ2V0TmFtZSgpLnJlcGxhY2VBbGwoIlxcJCIsICJcXC4iKSArCisgICAgICAgICAgICAgICAgICAgIERlZmF1bHRHcm9vdnlNZXRob2RzLm11bHRpcGx5KCJbXSIsIG5ldyBJbnRlZ2VyKGRpbWVuc2lvbikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGMuZ2V0TmFtZSgpLnJlcGxhY2VBbGwoIlxcJCIsICJcXC4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHNob3J0TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICBpbnQgaW5kZXggPSBuYW1lLmxhc3RJbmRleE9mKCcuJyk7CisgICAgICAgIGlmIChpbmRleCA9PSAtMSkgcmV0dXJuIG5hbWU7CisgICAgICAgIHJldHVybiBuYW1lLnN1YnN0cmluZyhpbmRleCArIDEsIG5hbWUubGVuZ3RoKCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91dGlsL1Jlc291cmNlQ29ubmVjdG9yLmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvUmVzb3VyY2VDb25uZWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjA4YjU0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91dGlsL1Jlc291cmNlQ29ubmVjdG9yLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGdyb292eS51dGlsOworCitpbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKKworLyoqCisgKiBCYXNlIGludGVyZmFjZSBmb3IgY3VzdG9taXppbmcgd2hlcmUgcmVzb3VyY2VzIGNhbiBiZSBmb3VuZCBmb3IgdGhlIDxjb2RlPkdyb292eVNjcmlwdEVuZ2luZTwvY29kZT4uCisgKgorICogQGF1dGhvciBzYW0KKyAqLworcHVibGljIGludGVyZmFjZSBSZXNvdXJjZUNvbm5lY3RvciB7CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSBhIFVSTENvbm5lY3Rpb24gdG8gYSBzY3JpcHQgcmVmZXJlbmNlZCBieSBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiBAdGhyb3dzIFJlc291cmNlRXhjZXB0aW9uCisgICAgICovCisgICAgVVJMQ29ubmVjdGlvbiBnZXRSZXNvdXJjZUNvbm5lY3Rpb24oU3RyaW5nIG5hbWUpIHRocm93cyBSZXNvdXJjZUV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdXRpbC9SZXNvdXJjZUV4Y2VwdGlvbi5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91dGlsL1Jlc291cmNlRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY5Zjk0MwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdXRpbC9SZXNvdXJjZUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBncm9vdnkudXRpbDsKKworLyoqCisgKiBAYXV0aG9yIHNhbQorICoKKyAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bworICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKKyAqLworcHVibGljIGNsYXNzIFJlc291cmNlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKKworCS8qKgorCSAqIAorCSAqLworCXB1YmxpYyBSZXNvdXJjZUV4Y2VwdGlvbigpIHsKKwkJc3VwZXIoKTsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCisJfQorCisJLyoqCisJICogQHBhcmFtIG1lc3NhZ2UKKwkgKi8KKwlwdWJsaWMgUmVzb3VyY2VFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKwkJc3VwZXIobWVzc2FnZSk7CisJfQorCisJLyoqCisJICogQHBhcmFtIG1lc3NhZ2UKKwkgKiBAcGFyYW0gY2F1c2UKKwkgKi8KKwlwdWJsaWMgUmVzb3VyY2VFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgeworCQlzdXBlcihtZXNzYWdlLCBjYXVzZSk7CisJfQorCisJLyoqCisJICogQHBhcmFtIGNhdXNlCisJICovCisJcHVibGljIFJlc291cmNlRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgeworCQlzdXBlcihjYXVzZSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvU2NyaXB0RXhjZXB0aW9uLmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvU2NyaXB0RXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUzYzk1ZAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdXRpbC9TY3JpcHRFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBncm9vdnkudXRpbDsKKworLyoqCisgKiBAYXV0aG9yIHNhbQorICoKKyAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bworICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKKyAqLworcHVibGljIGNsYXNzIFNjcmlwdEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwdWJsaWMgU2NyaXB0RXhjZXB0aW9uKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBtZXNzYWdlCisJICovCisJcHVibGljIFNjcmlwdEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeworCQlzdXBlcihtZXNzYWdlKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gbWVzc2FnZQorCSAqIEBwYXJhbSBjYXVzZQorCSAqLworCXB1YmxpYyBTY3JpcHRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgeworCQlzdXBlcihtZXNzYWdlLCBjYXVzZSk7CisJfQorCisJLyoqCisJICogQHBhcmFtIGNhdXNlCisJICovCisJcHVibGljIFNjcmlwdEV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKKwkJc3VwZXIoY2F1c2UpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91dGlsL1htbE5vZGVQcmludGVyLmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvWG1sTm9kZVByaW50ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWI0ZThjCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91dGlsL1htbE5vZGVQcmludGVyLmphdmEKQEAgLTAsMCArMSwyMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGdyb292eS51dGlsOworCitpbXBvcnQgZ3Jvb3Z5LnhtbC5RTmFtZTsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuSW52b2tlckhlbHBlcjsKKworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogUHJpbnRzIGEgbm9kZSB3aXRoIGFsbCBjaGlsZHJlbiBpbiBYTUwgZm9ybWF0LgorICogCisgKiBAc2VlIGdyb292eS51dGlsLk5vZGVQcmludGVyCisgKiBAYXV0aG9yIENocmlzdGlhbiBTdGVpbgorICovCitwdWJsaWMgY2xhc3MgWG1sTm9kZVByaW50ZXIgeworCisgICAgcHJvdGVjdGVkIGZpbmFsIEluZGVudFByaW50ZXIgb3V0OworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHF1b3RlOworCisgICAgcHVibGljIFhtbE5vZGVQcmludGVyKCkgeworICAgICAgICB0aGlzKG5ldyBQcmludFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKFN5c3RlbS5vdXQpKSk7CisgICAgfQorCisgICAgcHVibGljIFhtbE5vZGVQcmludGVyKFByaW50V3JpdGVyIG91dCkgeworICAgICAgICB0aGlzKG91dCwgIiAgIik7CisgICAgfQorCisgICAgcHVibGljIFhtbE5vZGVQcmludGVyKFByaW50V3JpdGVyIG91dCwgU3RyaW5nIGluZGVudCkgeworICAgICAgICB0aGlzKG91dCwgaW5kZW50LCAiXCIiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgWG1sTm9kZVByaW50ZXIoUHJpbnRXcml0ZXIgb3V0LCBTdHJpbmcgaW5kZW50LCBTdHJpbmcgcXVvdGUpIHsKKyAgICAgICAgdGhpcyhuZXcgSW5kZW50UHJpbnRlcihvdXQsIGluZGVudCksIHF1b3RlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgWG1sTm9kZVByaW50ZXIoSW5kZW50UHJpbnRlciBvdXQsIFN0cmluZyBxdW90ZSkgeworICAgICAgICBpZiAob3V0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkFyZ3VtZW50ICdJbmRlbnRQcmludGVyIG91dCcgbXVzdCBub3QgYmUgbnVsbCEiKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLm91dCA9IG91dDsKKyAgICAgICAgdGhpcy5xdW90ZSA9IHF1b3RlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZU9mTm9kZShOb2RlIG5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm9kZSBtdXN0IG5vdCBiZSBudWxsISIpOworICAgICAgICB9CisgICAgICAgIE9iamVjdCBuYW1lID0gbm9kZS5uYW1lKCk7CisgICAgICAgIGlmIChuYW1lIGluc3RhbmNlb2YgUU5hbWUpIHsKKyAgICAgICAgICAgIFFOYW1lIHFuYW1lID0gKFFOYW1lKSBuYW1lOworICAgICAgICAgICAgcmV0dXJuIHFuYW1lLmdldFF1YWxpZmllZE5hbWUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmFtZS50b1N0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHlFbGVtZW50KE5vZGUgbm9kZSkgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOb2RlIG11c3Qgbm90IGJlIG51bGwhIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFub2RlLmNoaWxkcmVuKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5vZGUudGV4dCgpLmxlbmd0aCgpID09IDA7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJpbnQoTm9kZSBub2RlKSB7CisgICAgICAgIC8qCisgICAgICAgICAqIEhhbmRsZSBlbXB0eSBlbGVtZW50cyBsaWtlICc8YnIvPicsICc8aW1nLz4gb3IgJzxociBub3NoYWRlPSJub3NoYWRlIi8+LgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGlzRW1wdHlFbGVtZW50KG5vZGUpKSB7CisgICAgICAgICAgICBwcmludExpbmVCZWdpbigpOworICAgICAgICAgICAgb3V0LnByaW50KCI8Iik7CisgICAgICAgICAgICBvdXQucHJpbnQoZ2V0TmFtZU9mTm9kZShub2RlKSk7CisgICAgICAgICAgICBwcmludE5hbWVBdHRyaWJ1dGVzKG5vZGUuYXR0cmlidXRlcygpKTsKKyAgICAgICAgICAgIG91dC5wcmludCgiLz4iKTsKKyAgICAgICAgICAgIHByaW50TGluZUVuZCgpOyAvLyAibm9kZSBuYW1lZCAnIiArIG5vZGUubmFtZSgpICsgIiciCisgICAgICAgICAgICBvdXQuZmx1c2goKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIEhhbmRsZSBHU1AgdGFnIGVsZW1lbnQhCisgICAgICAgICAqLworICAgICAgICBpZiAocHJpbnRTcGVjaWFsTm9kZShub2RlKSkgeworICAgICAgICAgICAgb3V0LmZsdXNoKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBIYW5kbGUgbm9ybWFsIGVsZW1lbnQgbGlrZSA8aHRtbD4gLi4uIDwvaHRtbD4uCisgICAgICAgICAqLworICAgICAgICBPYmplY3QgdmFsdWUgPSBub2RlLnZhbHVlKCk7CisgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExpc3QpIHsKKyAgICAgICAgICAgIHByaW50TmFtZShub2RlLCB0cnVlKTsKKyAgICAgICAgICAgIHByaW50TGlzdCgoTGlzdCkgdmFsdWUpOworICAgICAgICAgICAgcHJpbnROYW1lKG5vZGUsIGZhbHNlKTsKKyAgICAgICAgICAgIG91dC5mbHVzaCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gdHJlYXQgYXMgc2ltcGxlIHR5cGUgLSBwcm9iYWJseSBhIFN0cmluZworICAgICAgICBwcmludE5hbWUobm9kZSwgdHJ1ZSk7CisgICAgICAgIHByaW50U2ltcGxlSXRlbVdpdGhJbmRlbnQodmFsdWUpOworICAgICAgICBwcmludE5hbWUobm9kZSwgZmFsc2UpOworICAgICAgICBvdXQuZmx1c2goKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBwcmludExpbmVCZWdpbigpIHsKKyAgICAgICAgb3V0LnByaW50SW5kZW50KCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgcHJpbnRMaW5lRW5kKCkgeworICAgICAgICBwcmludExpbmVFbmQobnVsbCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgcHJpbnRMaW5lRW5kKFN0cmluZyBjb21tZW50KSB7CisgICAgICAgIGlmIChjb21tZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG91dC5wcmludCgiIDwhLS0gIik7CisgICAgICAgICAgICBvdXQucHJpbnQoY29tbWVudCk7CisgICAgICAgICAgICBvdXQucHJpbnQoIiAtLT4iKTsKKyAgICAgICAgfQorICAgICAgICBvdXQucHJpbnQoIlxuIik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgcHJpbnRMaXN0KExpc3QgbGlzdCkgeworICAgICAgICBvdXQuaW5jcmVtZW50SW5kZW50KCk7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBJZiB0aGUgY3VycmVudCB2YWx1ZSBpcyBhIG5vZGUsIHJlY3Vyc2UgaW50byB0aGF0IG5vZGUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE5vZGUpIHsKKyAgICAgICAgICAgICAgICBwcmludCgoTm9kZSkgdmFsdWUpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJpbnRTaW1wbGVJdGVtKHZhbHVlKTsKKworICAgICAgICB9CisgICAgICAgIG91dC5kZWNyZW1lbnRJbmRlbnQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHJpbnRTaW1wbGVJdGVtV2l0aEluZGVudChPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgb3V0LmluY3JlbWVudEluZGVudCgpOworICAgICAgICBwcmludFNpbXBsZUl0ZW0odmFsdWUpOworICAgICAgICBvdXQuZGVjcmVtZW50SW5kZW50KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHByaW50U2ltcGxlSXRlbShPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgcHJpbnRMaW5lQmVnaW4oKTsKKyAgICAgICAgb3V0LnByaW50KEludm9rZXJIZWxwZXIudG9TdHJpbmcodmFsdWUpKTsKKyAgICAgICAgcHJpbnRMaW5lRW5kKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgcHJpbnROYW1lKE5vZGUgbm9kZSwgYm9vbGVhbiBiZWdpbikgeworICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIk5vZGUgbXVzdCBub3QgYmUgbnVsbC4iKTsKKyAgICAgICAgfQorICAgICAgICBPYmplY3QgbmFtZSA9IG5vZGUubmFtZSgpOworICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIk5hbWUgbXVzdCBub3QgYmUgbnVsbC4iKTsKKyAgICAgICAgfQorICAgICAgICBwcmludExpbmVCZWdpbigpOworICAgICAgICBvdXQucHJpbnQoIjwiKTsKKyAgICAgICAgaWYgKCFiZWdpbikgeworICAgICAgICAgICAgb3V0LnByaW50KCIvIik7CisgICAgICAgIH0KKyAgICAgICAgb3V0LnByaW50KGdldE5hbWVPZk5vZGUobm9kZSkpOworICAgICAgICBpZiAoYmVnaW4pIHsKKyAgICAgICAgICAgIHByaW50TmFtZUF0dHJpYnV0ZXMobm9kZS5hdHRyaWJ1dGVzKCkpOworICAgICAgICB9CisgICAgICAgIG91dC5wcmludCgiPiIpOworICAgICAgICBwcmludExpbmVFbmQoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBwcmludE5hbWVBdHRyaWJ1dGVzKE1hcCBhdHRyaWJ1dGVzKSB7CisgICAgICAgIGlmIChhdHRyaWJ1dGVzID09IG51bGwgfHwgYXR0cmlidXRlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhdHRyaWJ1dGVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIG91dC5wcmludCgiICIpOworICAgICAgICAgICAgb3V0LnByaW50KGVudHJ5LmdldEtleSgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgb3V0LnByaW50KCI9Iik7CisgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgb3V0LnByaW50KHF1b3RlKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgeworICAgICAgICAgICAgICAgIG91dC5wcmludCgoU3RyaW5nKSB2YWx1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG91dC5wcmludChJbnZva2VySGVscGVyLnRvU3RyaW5nKHZhbHVlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQucHJpbnQocXVvdGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJpbnRTcGVjaWFsTm9kZShOb2RlIG5vZGUpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91dGlsL1htbFBhcnNlci5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91dGlsL1htbFBhcnNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NmRjM2QKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvWG1sUGFyc2VyLmphdmEKQEAgLTAsMCArMSwzODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBncm9vdnkudXRpbDsKKworaW1wb3J0IGdyb292eS54bWwuUU5hbWU7CitpbXBvcnQgZ3Jvb3Z5LnhtbC5GYWN0b3J5U3VwcG9ydDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKKworaW1wb3J0IG9yZy54bWwuc2F4Lio7CisKKy8qKgorICogQSBoZWxwZXIgY2xhc3MgZm9yIHBhcnNpbmcgWE1MIGludG8gYSB0cmVlIG9mIE5vZGUgaW5zdGFuY2VzIGZvciAKKyAqIGEgc2ltcGxlIHdheSBvZiBwcm9jZXNzaW5nIFhNTC4gVGhpcyBwYXJzZXIgZG9lcyBub3QgcHJlc2VydmUgdGhlCisgKiBYTUwgSW5mb1NldCAtIGlmIHRoYXRzIHdoYXQgeW91IG5lZWQgdHJ5IHVzaW5nIFczQyBET00sIGRvbTRqLCBKRE9NLCBYT00gZXRjLgorICogVGhpcyBwYXJzZXIgaWdub3JlcyBjb21tZW50cyBhbmQgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMgYW5kIGNvbnZlcnRzIHRoZQorICogWE1MIGludG8gYSBOb2RlIGZvciBlYWNoIGVsZW1lbnQgaW4gdGhlIFhNTCB3aXRoIGF0dHJpYnV0ZXMKKyAqIGFuZCBjaGlsZCBOb2RlcyBhbmQgU3RyaW5ncy4gVGhpcyBzaW1wbGUgbW9kZWwgaXMgc3VmZmljaWVudCBmb3IKKyAqIG1vc3Qgc2ltcGxlIHVzZSBjYXNlcyBvZiBwcm9jZXNzaW5nIFhNTC4KKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEBhdXRob3IgUGF1bCBLaW5nCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBYbWxQYXJzZXIgaW1wbGVtZW50cyBDb250ZW50SGFuZGxlciB7CisKKyAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciBib2R5VGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICBwcml2YXRlIExpc3Qgc3RhY2sgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgcHJpdmF0ZSBMb2NhdG9yIGxvY2F0b3I7CisgICAgcHJpdmF0ZSBYTUxSZWFkZXIgcmVhZGVyOworICAgIHByaXZhdGUgTm9kZSBwYXJlbnQ7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gdHJpbVdoaXRlc3BhY2UgPSB0cnVlOworICAgIHByaXZhdGUgYm9vbGVhbiBuYW1lc3BhY2VBd2FyZTsKKworICAgIHB1YmxpYyBYbWxQYXJzZXIoKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcyhmYWxzZSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIFhtbFBhcnNlcihib29sZWFuIHZhbGlkYXRpbmcsIGJvb2xlYW4gbmFtZXNwYWNlQXdhcmUpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24geworICAgICAgICBTQVhQYXJzZXJGYWN0b3J5IGZhY3RvcnkgPSBGYWN0b3J5U3VwcG9ydC5jcmVhdGVTYXhQYXJzZXJGYWN0b3J5KCk7CisgICAgICAgIGZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUobmFtZXNwYWNlQXdhcmUpOworICAgICAgICB0aGlzLm5hbWVzcGFjZUF3YXJlID0gbmFtZXNwYWNlQXdhcmU7CisgICAgICAgIGZhY3Rvcnkuc2V0VmFsaWRhdGluZyh2YWxpZGF0aW5nKTsKKyAgICAgICAgcmVhZGVyID0gZmFjdG9yeS5uZXdTQVhQYXJzZXIoKS5nZXRYTUxSZWFkZXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgWG1sUGFyc2VyKFhNTFJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgdGhpcy5yZWFkZXIgPSByZWFkZXI7CisgICAgfQorCisgICAgcHVibGljIFhtbFBhcnNlcihTQVhQYXJzZXIgcGFyc2VyKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgcmVhZGVyID0gcGFyc2VyLmdldFhNTFJlYWRlcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdHJpbSB3aGl0ZXNwYWNlIHNldHRpbmcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgd2hpdGVzcGFjZSB3aWxsIGJlIHRyaW1tZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1RyaW1XaGl0ZXNwYWNlKCkgeworICAgICAgICByZXR1cm4gdHJpbVdoaXRlc3BhY2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdHJpbSB3aGl0ZXNwYWNlIHNldHRpbmcgdmFsdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJpbVdoaXRlc3BhY2UgdGhlIGRlc2lyZWQgc2V0dGluZyB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRyaW1XaGl0ZXNwYWNlKGJvb2xlYW4gdHJpbVdoaXRlc3BhY2UpIHsKKyAgICAgICAgdGhpcy50cmltV2hpdGVzcGFjZSA9IHRyaW1XaGl0ZXNwYWNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlcyB0aGUgY29udGVudCBvZiB0aGUgZ2l2ZW4gZmlsZSBhcyBYTUwgdHVybmluZyBpdCBpbnRvIGEgdHJlZQorICAgICAqIG9mIE5vZGVzLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGUgdGhlIEZpbGUgY29udGFpbmluZyB0aGUgWE1MIHRvIGJlIHBhcnNlZAorICAgICAqIEByZXR1cm4gdGhlIHJvb3Qgbm9kZSBvZiB0aGUgcGFyc2VkIHRyZWUgb2YgTm9kZXMKKyAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBBbnkgU0FYIGV4Y2VwdGlvbiwgcG9zc2libHkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB3cmFwcGluZyBhbm90aGVyIGV4Y2VwdGlvbi4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uICBBbiBJTyBleGNlcHRpb24gZnJvbSB0aGUgcGFyc2VyLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmx5IGZyb20gYSBieXRlIHN0cmVhbSBvciBjaGFyYWN0ZXIgc3RyZWFtCisgICAgICogICAgICAgICAgICAgICAgICAgICAgc3VwcGxpZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBOb2RlIHBhcnNlKEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24geworICAgICAgICBJbnB1dFNvdXJjZSBpbnB1dCA9IG5ldyBJbnB1dFNvdXJjZShuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpKTsKKyAgICAgICAgaW5wdXQuc2V0U3lzdGVtSWQoImZpbGU6Ly8iICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgIGdldFhNTFJlYWRlcigpLnBhcnNlKGlucHV0KTsKKyAgICAgICAgcmV0dXJuIHBhcmVudDsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIHRoZSBjb250ZW50IG9mIHRoZSBzcGVjaWZpZWQgaW5wdXQgc291cmNlIGludG8gYSB0cmVlIG9mIE5vZGVzLgorICAgICAqCisgICAgICogQHBhcmFtIGlucHV0IHRoZSBJbnB1dFNvdXJjZSBmb3IgdGhlIFhNTCB0byBwYXJzZQorICAgICAqIEByZXR1cm4gdGhlIHJvb3Qgbm9kZSBvZiB0aGUgcGFyc2VkIHRyZWUgb2YgTm9kZXMKKyAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBBbnkgU0FYIGV4Y2VwdGlvbiwgcG9zc2libHkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB3cmFwcGluZyBhbm90aGVyIGV4Y2VwdGlvbi4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uICBBbiBJTyBleGNlcHRpb24gZnJvbSB0aGUgcGFyc2VyLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmx5IGZyb20gYSBieXRlIHN0cmVhbSBvciBjaGFyYWN0ZXIgc3RyZWFtCisgICAgICogICAgICAgICAgICAgICAgICAgICAgc3VwcGxpZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBOb2RlIHBhcnNlKElucHV0U291cmNlIGlucHV0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIGdldFhNTFJlYWRlcigpLnBhcnNlKGlucHV0KTsKKyAgICAgICAgcmV0dXJuIHBhcmVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSB0aGUgY29udGVudCBvZiB0aGUgc3BlY2lmaWVkIGlucHV0IHN0cmVhbSBpbnRvIGEgdHJlZSBvZiBOb2Rlcy4KKyAgICAgKgorICAgICAqIE5vdGUgdGhhdCB1c2luZyB0aGlzIG1ldGhvZCB3aWxsIG5vdCBwcm92aWRlIHRoZSBwYXJzZXIgd2l0aCBhbnkgVVJJCisgICAgICogZm9yIHdoaWNoIHRvIGZpbmQgRFREcyBldGMKKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnB1dCBhbiBJbnB1dFN0cmVhbSBjb250YWluaW5nIHRoZSBYTUwgdG8gYmUgcGFyc2VkCisgICAgICogQHJldHVybiB0aGUgcm9vdCBub2RlIG9mIHRoZSBwYXJzZWQgdHJlZSBvZiBOb2RlcworICAgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIEFueSBTQVggZXhjZXB0aW9uLCBwb3NzaWJseQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHdyYXBwaW5nIGFub3RoZXIgZXhjZXB0aW9uLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gIEFuIElPIGV4Y2VwdGlvbiBmcm9tIHRoZSBwYXJzZXIsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcG9zc2libHkgZnJvbSBhIGJ5dGUgc3RyZWFtIG9yIGNoYXJhY3RlciBzdHJlYW0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBzdXBwbGllZCBieSB0aGUgYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHVibGljIE5vZGUgcGFyc2UoSW5wdXRTdHJlYW0gaW5wdXQpIHRocm93cyBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgSW5wdXRTb3VyY2UgaXMgPSBuZXcgSW5wdXRTb3VyY2UoaW5wdXQpOworICAgICAgICBnZXRYTUxSZWFkZXIoKS5wYXJzZShpcyk7CisgICAgICAgIHJldHVybiBwYXJlbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2UgdGhlIGNvbnRlbnQgb2YgdGhlIHNwZWNpZmllZCByZWFkZXIgaW50byBhIHRyZWUgb2YgTm9kZXMuCisgICAgICoKKyAgICAgKiBOb3RlIHRoYXQgdXNpbmcgdGhpcyBtZXRob2Qgd2lsbCBub3QgcHJvdmlkZSB0aGUgcGFyc2VyIHdpdGggYW55IFVSSQorICAgICAqIGZvciB3aGljaCB0byBmaW5kIERURHMgZXRjCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW4gYSBSZWFkZXIgdG8gcmVhZCB0aGUgWE1MIHRvIGJlIHBhcnNlZAorICAgICAqIEByZXR1cm4gdGhlIHJvb3Qgbm9kZSBvZiB0aGUgcGFyc2VkIHRyZWUgb2YgTm9kZXMKKyAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBBbnkgU0FYIGV4Y2VwdGlvbiwgcG9zc2libHkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB3cmFwcGluZyBhbm90aGVyIGV4Y2VwdGlvbi4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uICBBbiBJTyBleGNlcHRpb24gZnJvbSB0aGUgcGFyc2VyLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmx5IGZyb20gYSBieXRlIHN0cmVhbSBvciBjaGFyYWN0ZXIgc3RyZWFtCisgICAgICogICAgICAgICAgICAgICAgICAgICAgc3VwcGxpZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBOb2RlIHBhcnNlKFJlYWRlciBpbikgdGhyb3dzIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24geworICAgICAgICBJbnB1dFNvdXJjZSBpcyA9IG5ldyBJbnB1dFNvdXJjZShpbik7CisgICAgICAgIGdldFhNTFJlYWRlcigpLnBhcnNlKGlzKTsKKyAgICAgICAgcmV0dXJuIHBhcmVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSB0aGUgY29udGVudCBvZiB0aGUgc3BlY2lmaWVkIFVSSSBpbnRvIGEgdHJlZSBvZiBOb2Rlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgYSBTdHJpbmcgY29udGFpbmluZyBhIHVyaSBwb2ludGluZyB0byB0aGUgWE1MIHRvIGJlIHBhcnNlZAorICAgICAqIEByZXR1cm4gdGhlIHJvb3Qgbm9kZSBvZiB0aGUgcGFyc2VkIHRyZWUgb2YgTm9kZXMKKyAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBBbnkgU0FYIGV4Y2VwdGlvbiwgcG9zc2libHkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB3cmFwcGluZyBhbm90aGVyIGV4Y2VwdGlvbi4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uICBBbiBJTyBleGNlcHRpb24gZnJvbSB0aGUgcGFyc2VyLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmx5IGZyb20gYSBieXRlIHN0cmVhbSBvciBjaGFyYWN0ZXIgc3RyZWFtCisgICAgICogICAgICAgICAgICAgICAgICAgICAgc3VwcGxpZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBOb2RlIHBhcnNlKFN0cmluZyB1cmkpIHRocm93cyBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgSW5wdXRTb3VyY2UgaXMgPSBuZXcgSW5wdXRTb3VyY2UodXJpKTsKKyAgICAgICAgZ2V0WE1MUmVhZGVyKCkucGFyc2UoaXMpOworICAgICAgICByZXR1cm4gcGFyZW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgaGVscGVyIG1ldGhvZCB0byBwYXJzZSB0aGUgZ2l2ZW4gdGV4dCBhcyBYTUwuCisgICAgICogCisgICAgICogQHBhcmFtIHRleHQgdGhlIFhNTCB0ZXh0IHRvIHBhcnNlCisgICAgICogQHJldHVybiB0aGUgcm9vdCBub2RlIG9mIHRoZSBwYXJzZWQgdHJlZSBvZiBOb2RlcworICAgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIEFueSBTQVggZXhjZXB0aW9uLCBwb3NzaWJseQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHdyYXBwaW5nIGFub3RoZXIgZXhjZXB0aW9uLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gIEFuIElPIGV4Y2VwdGlvbiBmcm9tIHRoZSBwYXJzZXIsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcG9zc2libHkgZnJvbSBhIGJ5dGUgc3RyZWFtIG9yIGNoYXJhY3RlciBzdHJlYW0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBzdXBwbGllZCBieSB0aGUgYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHVibGljIE5vZGUgcGFyc2VUZXh0KFN0cmluZyB0ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBwYXJzZShuZXcgU3RyaW5nUmVhZGVyKHRleHQpKTsKKyAgICB9CisgICAgLy8gRGVsZWdhdGVkIFhNTFJlYWRlciBtZXRob2RzCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIG9yZy54bWwuc2F4LlhNTFJlYWRlciNnZXREVERIYW5kbGVyKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgRFRESGFuZGxlciBnZXREVERIYW5kbGVyKCkgeworICAgICAgICByZXR1cm4gdGhpcy5yZWFkZXIuZ2V0RFRESGFuZGxlcigpOworICAgIH0KKworICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIG9yZy54bWwuc2F4LlhNTFJlYWRlciNnZXRFbnRpdHlSZXNvbHZlcigpCisgICAgICovCisgICAgcHVibGljIEVudGl0eVJlc29sdmVyIGdldEVudGl0eVJlc29sdmVyKCkgeworICAgICAgICByZXR1cm4gdGhpcy5yZWFkZXIuZ2V0RW50aXR5UmVzb2x2ZXIoKTsKKyAgICB9CisKKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICogQHNlZSBvcmcueG1sLnNheC5YTUxSZWFkZXIjZ2V0RXJyb3JIYW5kbGVyKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgRXJyb3JIYW5kbGVyIGdldEVycm9ySGFuZGxlcigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucmVhZGVyLmdldEVycm9ySGFuZGxlcigpOworICAgIH0KKworICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIG9yZy54bWwuc2F4LlhNTFJlYWRlciNnZXRGZWF0dXJlKGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0RmVhdHVyZShmaW5hbCBTdHJpbmcgdXJpKSB0aHJvd3MgU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiwgU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucmVhZGVyLmdldEZlYXR1cmUodXJpKTsKKyAgICB9CisKKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICogQHNlZSBvcmcueG1sLnNheC5YTUxSZWFkZXIjZ2V0UHJvcGVydHkoamF2YS5sYW5nLlN0cmluZykKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KGZpbmFsIFN0cmluZyB1cmkpIHRocm93cyBTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uLCBTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gdGhpcy5yZWFkZXIuZ2V0UHJvcGVydHkodXJpKTsKKyAgICB9CisKKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICogQHNlZSBvcmcueG1sLnNheC5YTUxSZWFkZXIjc2V0RFRESGFuZGxlcihvcmcueG1sLnNheC5EVERIYW5kbGVyKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERUREhhbmRsZXIoZmluYWwgRFRESGFuZGxlciBkdGRIYW5kbGVyKSB7CisgICAgICAgIHRoaXMucmVhZGVyLnNldERUREhhbmRsZXIoZHRkSGFuZGxlcik7CisgICAgfQorCisgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAqIEBzZWUgb3JnLnhtbC5zYXguWE1MUmVhZGVyI3NldEVudGl0eVJlc29sdmVyKG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVudGl0eVJlc29sdmVyKGZpbmFsIEVudGl0eVJlc29sdmVyIGVudGl0eVJlc29sdmVyKSB7CisgICAgICAgIHRoaXMucmVhZGVyLnNldEVudGl0eVJlc29sdmVyKGVudGl0eVJlc29sdmVyKTsKKyAgICB9CisKKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICogQHNlZSBvcmcueG1sLnNheC5YTUxSZWFkZXIjc2V0RXJyb3JIYW5kbGVyKG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcikKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFcnJvckhhbmRsZXIoZmluYWwgRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlcikgeworICAgICAgICB0aGlzLnJlYWRlci5zZXRFcnJvckhhbmRsZXIoZXJyb3JIYW5kbGVyKTsKKyAgICB9CisKKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICogQHNlZSBvcmcueG1sLnNheC5YTUxSZWFkZXIjc2V0RmVhdHVyZShqYXZhLmxhbmcuU3RyaW5nLCBib29sZWFuKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZlYXR1cmUoZmluYWwgU3RyaW5nIHVyaSwgZmluYWwgYm9vbGVhbiB2YWx1ZSkgdGhyb3dzIFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24sIFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMucmVhZGVyLnNldEZlYXR1cmUodXJpLCB2YWx1ZSk7CisgICAgfQorCisgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAqIEBzZWUgb3JnLnhtbC5zYXguWE1MUmVhZGVyI3NldFByb3BlcnR5KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoZmluYWwgU3RyaW5nIHVyaSwgZmluYWwgT2JqZWN0IHZhbHVlKSB0aHJvd3MgU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiwgU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKKyAgICAgICAgIHRoaXMucmVhZGVyLnNldFByb3BlcnR5KHVyaSwgdmFsdWUpOworICAgIH0KKworICAgIC8vIENvbnRlbnRIYW5kbGVyIGludGVyZmFjZQorICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgCisgICAgcHVibGljIHZvaWQgc3RhcnREb2N1bWVudCgpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBwYXJlbnQgPSBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGVuZERvY3VtZW50KCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIHN0YWNrLmNsZWFyKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBsaXN0KQorICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgYWRkVGV4dFRvTm9kZSgpOworCisgICAgICAgIE9iamVjdCBuYW1lID0gZ2V0RWxlbWVudE5hbWUobmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUsIHFOYW1lKTsKKworICAgICAgICBpbnQgc2l6ZSA9IGxpc3QuZ2V0TGVuZ3RoKCk7CisgICAgICAgIE1hcCBhdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXAoc2l6ZSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBPYmplY3QgYXR0cmlidXRlTmFtZSA9IGdldEVsZW1lbnROYW1lKGxpc3QuZ2V0VVJJKGkpLCBsaXN0LmdldExvY2FsTmFtZShpKSwgbGlzdC5nZXRRTmFtZShpKSk7CisgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBsaXN0LmdldFZhbHVlKGkpOworICAgICAgICAgICAgYXR0cmlidXRlcy5wdXQoYXR0cmlidXRlTmFtZSwgdmFsdWUpOworICAgICAgICB9CisgICAgICAgIHBhcmVudCA9IG5ldyBOb2RlKHBhcmVudCwgbmFtZSwgYXR0cmlidXRlcywgbmV3IE5vZGVMaXN0KCkpOworICAgICAgICBzdGFjay5hZGQocGFyZW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIGFkZFRleHRUb05vZGUoKTsKKworICAgICAgICBpZiAoIXN0YWNrLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgc3RhY2sucmVtb3ZlKHN0YWNrLnNpemUoKSAtIDEpOworICAgICAgICAgICAgaWYgKCFzdGFjay5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBwYXJlbnQgPSAoTm9kZSkgc3RhY2suZ2V0KHN0YWNrLnNpemUoKSAtIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2hhcmFjdGVycyhjaGFyIGJ1ZmZlcltdLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBib2R5VGV4dC5hcHBlbmQoYnVmZmVyLCBzdGFydCwgbGVuZ3RoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdGFydFByZWZpeE1hcHBpbmcoU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWVzcGFjZVVSSSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZW5kUHJlZml4TWFwcGluZyhTdHJpbmcgcHJlZml4KSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpZ25vcmFibGVXaGl0ZXNwYWNlKGNoYXIgYnVmZmVyW10sIGludCBzdGFydCwgaW50IGxlbikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJvY2Vzc2luZ0luc3RydWN0aW9uKFN0cmluZyB0YXJnZXQsIFN0cmluZyBkYXRhKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICB9CisKKyAgICBwdWJsaWMgTG9jYXRvciBnZXREb2N1bWVudExvY2F0b3IoKSB7CisgICAgICAgIHJldHVybiBsb2NhdG9yOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERvY3VtZW50TG9jYXRvcihMb2NhdG9yIGxvY2F0b3IpIHsKKyAgICAgICAgdGhpcy5sb2NhdG9yID0gbG9jYXRvcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBza2lwcGVkRW50aXR5KFN0cmluZyBuYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICB9CisKKyAgICAvLyBJbXBsZW1lbnRhdGlvbiBtZXRob2RzCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAKKyAgICBwcm90ZWN0ZWQgWE1MUmVhZGVyIGdldFhNTFJlYWRlcigpIHsKKyAgICAgICAgcmVhZGVyLnNldENvbnRlbnRIYW5kbGVyKHRoaXMpOworICAgICAgICByZXR1cm4gcmVhZGVyOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGFkZFRleHRUb05vZGUoKSB7CisgICAgICAgIFN0cmluZyB0ZXh0ID0gYm9keVRleHQudG9TdHJpbmcoKTsKKyAgICAgICAgaWYgKHRyaW1XaGl0ZXNwYWNlKSB7CisgICAgICAgICAgICB0ZXh0ID0gdGV4dC50cmltKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRleHQubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICBwYXJlbnQuY2hpbGRyZW4oKS5hZGQodGV4dCk7CisgICAgICAgIH0KKyAgICAgICAgYm9keVRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE9iamVjdCBnZXRFbGVtZW50TmFtZShTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgbmFtZSA9IGxvY2FsTmFtZTsKKyAgICAgICAgU3RyaW5nIHByZWZpeCA9ICIiOworICAgICAgICBpZiAoKG5hbWUgPT0gbnVsbCkgfHwgKG5hbWUubGVuZ3RoKCkgPCAxKSkgeworICAgICAgICAgICAgbmFtZSA9IHFOYW1lOworICAgICAgICB9CisgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgPT0gbnVsbCB8fCBuYW1lc3BhY2VVUkkubGVuZ3RoKCkgPD0gMCkgeworICAgICAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHFOYW1lICE9IG51bGwgJiYgcU5hbWUubGVuZ3RoKCkgPiAwICYmIG5hbWVzcGFjZUF3YXJlKSB7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBxTmFtZS5sYXN0SW5kZXhPZigiOiIpOworICAgICAgICAgICAgaWYgKGluZGV4ID4gMCkgeworICAgICAgICAgICAgICAgIHByZWZpeCA9IHFOYW1lLnN1YnN0cmluZygwLCBpbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIG5hbWUsIHByZWZpeCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91dGlsL1htbFNsdXJwZXIuamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdXRpbC9YbWxTbHVycGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNiM2RjMQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdXRpbC9YbWxTbHVycGVyLmphdmEKQEAgLTAsMCArMSwzNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGdyb292eS51dGlsOworCitpbXBvcnQgZ3Jvb3Z5LnV0aWwuc2x1cnBlcnN1cHBvcnQuR1BhdGhSZXN1bHQ7CitpbXBvcnQgZ3Jvb3Z5LnV0aWwuc2x1cnBlcnN1cHBvcnQuTm9kZTsKK2ltcG9ydCBncm9vdnkudXRpbC5zbHVycGVyc3VwcG9ydC5Ob2RlQ2hpbGQ7CitpbXBvcnQgZ3Jvb3Z5LnhtbC5GYWN0b3J5U3VwcG9ydDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CisKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKK2ltcG9ydCBvcmcueG1sLnNheC5EVERIYW5kbGVyOworaW1wb3J0IG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyOworaW1wb3J0IG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOworaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7CisKKy8qKgorICogQGF1dGhvciBKb2huIFdpbHNvbgorICoKKyAqLworCitwdWJsaWMgY2xhc3MgWG1sU2x1cnBlciBleHRlbmRzIERlZmF1bHRIYW5kbGVyIHsKKyAgcHJpdmF0ZSBmaW5hbCBYTUxSZWFkZXIgcmVhZGVyOworICBwcml2YXRlIE5vZGUgY3VycmVudE5vZGUgPSBudWxsOworICBwcml2YXRlIGZpbmFsIFN0YWNrIHN0YWNrID0gbmV3IFN0YWNrKCk7CisgIHByaXZhdGUgZmluYWwgU3RyaW5nQnVmZmVyIGNoYXJCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgIHByaXZhdGUgZmluYWwgTWFwIG5hbWVzcGFjZVRhZ0hpbnRzID0gbmV3IEhhc2h0YWJsZSgpOworICBwcml2YXRlIGJvb2xlYW4ga2VlcFdoaXRlc3BhY2UgPSBmYWxzZTsKKworICBwdWJsaWMgWG1sU2x1cnBlcigpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24geworICAgIHRoaXMoZmFsc2UsIHRydWUpOworICB9CisgIAorICBwdWJsaWMgWG1sU2x1cnBlcihmaW5hbCBib29sZWFuIHZhbGlkYXRpbmcsIGZpbmFsIGJvb2xlYW4gbmFtZXNwYWNlQXdhcmUpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24geworICAgIFNBWFBhcnNlckZhY3RvcnkgZmFjdG9yeSA9IEZhY3RvcnlTdXBwb3J0LmNyZWF0ZVNheFBhcnNlckZhY3RvcnkoKTsKKyAgICBmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKG5hbWVzcGFjZUF3YXJlKTsKKyAgICBmYWN0b3J5LnNldFZhbGlkYXRpbmcodmFsaWRhdGluZyk7CisgICAgdGhpcy5yZWFkZXIgPSBmYWN0b3J5Lm5ld1NBWFBhcnNlcigpLmdldFhNTFJlYWRlcigpOworICB9CisgIAorICBwdWJsaWMgWG1sU2x1cnBlcihmaW5hbCBYTUxSZWFkZXIgcmVhZGVyKSB7CisgICAgdGhpcy5yZWFkZXIgPSByZWFkZXI7CisgIH0KKyAgCisgIHB1YmxpYyBYbWxTbHVycGVyKGZpbmFsIFNBWFBhcnNlciBwYXJzZXIpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgIHRoaXMocGFyc2VyLmdldFhNTFJlYWRlcigpKTsKKyAgfQorICAKKyAgLyoqCisgICAqIEBwYXJhbSBrZWVwV2hpdGVzcGFjZQorICAgKiAKKyAgICogSWYgdHJ1ZSB0aGVuIHdoaXRlc3BhY2UgYmVmb3JlIGVsZW1lbnRzIGlzIGtlcHQuCisgICAqIFRoZSBkZWFmdWx0IGlzIHRvIGRpc2NhcmQgdGhlIHdoaXRlc3BhY2UuCisgICAqLworICBwdWJsaWMgdm9pZCBzZXRLZWVwV2hpdGVzcGFjZShib29sZWFuIGtlZXBXaGl0ZXNwYWNlKSB7CisgICAgICB0aGlzLmtlZXBXaGl0ZXNwYWNlID0ga2VlcFdoaXRlc3BhY2U7CisgIH0KKyAgCisgIC8qKgorICAgKiBAcmV0dXJuIFRoZSBHUGF0aFJlc3VsdCBpbnN0YW5jZSBjcmVhdGVkIGJ5IGNvbnN1bWluZyBhIHN0cmVhbSBvZiBTQVggZXZlbnRzCisgICAqIE5vdGUgaWYgb25lIG9mIHRoZSBwYXJzZSBtZXRob2RzIGhhcyBiZWVuIGNhbGxlZCB0aGVuIHRoaXMgcmV0dXJucyBudWxsCisgICAqIE5vdGUgaWYgdGhpcyBpcyBjYWxsZWQgbW9yZSB0aGFuIG9uY2UgYWxsIGNhbGxzIGFmdGVyIHRoZSBmaXJzdCB3aWxsIHJldHVybiBudWxsCisgICAqCisgICAqLworICBwdWJsaWMgR1BhdGhSZXN1bHQgZ2V0RG9jdW1lbnQoKSB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiBuZXcgTm9kZUNoaWxkKHRoaXMuY3VycmVudE5vZGUsIG51bGwsIHRoaXMubmFtZXNwYWNlVGFnSGludHMpOworICAgIH0gZmluYWxseSB7CisgICAgICB0aGlzLmN1cnJlbnROb2RlID0gbnVsbDsKKyAgICB9CisgIH0KKyAgCisgIC8qKgorICAgKiBQYXJzZSB0aGUgY29udGVudCBvZiB0aGUgc3BlY2lmaWVkIGlucHV0IHNvdXJjZSBpbnRvIGEgR1BhdGhSZXN1bHQgb2JqZWN0CisgICAqIAorICAgKiBAcGFyYW0gaW5wdXQKKyAgICogQHJldHVybiBBbiBvYmplY3Qgd2hpY2ggc3VwcG9ydHMgR1BhdGggZXhwcmVzc2lvbnMKKyAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbgorICAgKi8KKyAgcHVibGljIEdQYXRoUmVzdWx0IHBhcnNlKGZpbmFsIElucHV0U291cmNlIGlucHV0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiB7CisgICAgdGhpcy5yZWFkZXIuc2V0Q29udGVudEhhbmRsZXIodGhpcyk7CisgICAgdGhpcy5yZWFkZXIucGFyc2UoaW5wdXQpOworICAgIAorICAgIHJldHVybiBnZXREb2N1bWVudCgpOworICAgIAorICB9CisgIAorICAvKioKKyAgICogUGFyc2VzIHRoZSBjb250ZW50IG9mIHRoZSBnaXZlbiBmaWxlIGFzIFhNTCB0dXJuaW5nIGl0IGludG8gYSBHUGF0aFJlc3VsdCBvYmplY3QKKyAgICogCisgICAqIEBwYXJhbSBmaWxlCisgICAqIEByZXR1cm4gQW4gb2JqZWN0IHdoaWNoIHN1cHBvcnRzIEdQYXRoIGV4cHJlc3Npb25zCisgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICogQHRocm93cyBTQVhFeGNlcHRpb24KKyAgICovCisgIHB1YmxpYyBHUGF0aFJlc3VsdCBwYXJzZShmaW5hbCBGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKKyAgZmluYWwgSW5wdXRTb3VyY2UgaW5wdXQgPSBuZXcgSW5wdXRTb3VyY2UobmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSk7CisgICAgCisgICAgaW5wdXQuc2V0U3lzdGVtSWQoImZpbGU6Ly8iICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgCisgICAgcmV0dXJuIHBhcnNlKGlucHV0KTsKKyAgICAKKyAgfQorICAKKyAgLyoqCisgICAqIFBhcnNlIHRoZSBjb250ZW50IG9mIHRoZSBzcGVjaWZpZWQgaW5wdXQgc3RyZWFtIGludG8gYW4gR1BhdGhSZXN1bHQgT2JqZWN0LgorICAgKiBOb3RlIHRoYXQgdXNpbmcgdGhpcyBtZXRob2Qgd2lsbCBub3QgcHJvdmlkZSB0aGUgcGFyc2VyIHdpdGggYW55IFVSSQorICAgKiBmb3Igd2hpY2ggdG8gZmluZCBEVERzIGV0YworICAgKiAKKyAgICogQHBhcmFtIGlucHV0CisgICAqIEByZXR1cm4gQW4gb2JqZWN0IHdoaWNoIHN1cHBvcnRzIEdQYXRoIGV4cHJlc3Npb25zCisgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICogQHRocm93cyBTQVhFeGNlcHRpb24KKyAgICovCisgIHB1YmxpYyBHUGF0aFJlc3VsdCBwYXJzZShmaW5hbCBJbnB1dFN0cmVhbSBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24geworICAgIHJldHVybiBwYXJzZShuZXcgSW5wdXRTb3VyY2UoaW5wdXQpKTsKKyAgfQorICAKKyAgLyoqCisgICAqIFBhcnNlIHRoZSBjb250ZW50IG9mIHRoZSBzcGVjaWZpZWQgcmVhZGVyIGludG8gYSBHUGF0aFJlc3VsdCBPYmplY3QuCisgICAqIE5vdGUgdGhhdCB1c2luZyB0aGlzIG1ldGhvZCB3aWxsIG5vdCBwcm92aWRlIHRoZSBwYXJzZXIgd2l0aCBhbnkgVVJJCisgICAqIGZvciB3aGljaCB0byBmaW5kIERURHMgZXRjCisgICAqIAorICAgKiBAcGFyYW0gaW4KKyAgICogQHJldHVybiBBbiBvYmplY3Qgd2hpY2ggc3VwcG9ydHMgR1BhdGggZXhwcmVzc2lvbnMKKyAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbgorICAgKi8KKyAgcHVibGljIEdQYXRoUmVzdWx0IHBhcnNlKGZpbmFsIFJlYWRlciBpbikgdGhyb3dzIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24geworICAgIHJldHVybiBwYXJzZShuZXcgSW5wdXRTb3VyY2UoaW4pKTsKKyAgfQorICAKKyAgLyoqCisgICAqIFBhcnNlIHRoZSBjb250ZW50IG9mIHRoZSBzcGVjaWZpZWQgVVJJIGludG8gYSBHUGF0aFJlc3VsdCBPYmplY3QKKyAgICogCisgICAqIEBwYXJhbSB1cmkKKyAgICogQHJldHVybiBBbiBvYmplY3Qgd2hpY2ggc3VwcG9ydHMgR1BhdGggZXhwcmVzc2lvbnMKKyAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbgorICAgKi8KKyAgcHVibGljIEdQYXRoUmVzdWx0IHBhcnNlKGZpbmFsIFN0cmluZyB1cmkpIHRocm93cyBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gcGFyc2UobmV3IElucHV0U291cmNlKHVyaSkpOworICB9CisgIAorICAvKioKKyAgICogQSBoZWxwZXIgbWV0aG9kIHRvIHBhcnNlIHRoZSBnaXZlbiB0ZXh0IGFzIFhNTAorICAgKiAKKyAgICogQHBhcmFtIHRleHQKKyAgICogQHJldHVybiBBbiBvYmplY3Qgd2hpY2ggc3VwcG9ydHMgR1BhdGggZXhwcmVzc2lvbnMKKyAgICovCisgIHB1YmxpYyBHUGF0aFJlc3VsdCBwYXJzZVRleHQoZmluYWwgU3RyaW5nIHRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gcGFyc2UobmV3IFN0cmluZ1JlYWRlcih0ZXh0KSk7CisgIH0KKyAgCisgIC8vIERlbGVnYXRlZCBYTUxSZWFkZXIgbWV0aG9kcworICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8qIChub24tSmF2YWRvYykKKyAgICogQHNlZSBvcmcueG1sLnNheC5YTUxSZWFkZXIjZ2V0RFRESGFuZGxlcigpCisgICAqLworICBwdWJsaWMgRFRESGFuZGxlciBnZXREVERIYW5kbGVyKCkgeworICAgICAgcmV0dXJuIHRoaXMucmVhZGVyLmdldERUREhhbmRsZXIoKTsKKyAgfQorCisgIC8qIChub24tSmF2YWRvYykKKyAgICogQHNlZSBvcmcueG1sLnNheC5YTUxSZWFkZXIjZ2V0RW50aXR5UmVzb2x2ZXIoKQorICAgKi8KKyAgcHVibGljIEVudGl0eVJlc29sdmVyIGdldEVudGl0eVJlc29sdmVyKCkgeworICAgICAgcmV0dXJuIHRoaXMucmVhZGVyLmdldEVudGl0eVJlc29sdmVyKCk7CisgIH0KKworICAvKiAobm9uLUphdmFkb2MpCisgICAqIEBzZWUgb3JnLnhtbC5zYXguWE1MUmVhZGVyI2dldEVycm9ySGFuZGxlcigpCisgICAqLworICBwdWJsaWMgRXJyb3JIYW5kbGVyIGdldEVycm9ySGFuZGxlcigpIHsKKyAgICAgIHJldHVybiB0aGlzLnJlYWRlci5nZXRFcnJvckhhbmRsZXIoKTsKKyAgfQorCisgIC8qIChub24tSmF2YWRvYykKKyAgICogQHNlZSBvcmcueG1sLnNheC5YTUxSZWFkZXIjZ2V0RmVhdHVyZShqYXZhLmxhbmcuU3RyaW5nKQorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gZ2V0RmVhdHVyZShmaW5hbCBTdHJpbmcgdXJpKSB0aHJvd3MgU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiwgU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKKyAgICAgIHJldHVybiB0aGlzLnJlYWRlci5nZXRGZWF0dXJlKHVyaSk7CisgIH0KKworICAvKiAobm9uLUphdmFkb2MpCisgICAqIEBzZWUgb3JnLnhtbC5zYXguWE1MUmVhZGVyI2dldFByb3BlcnR5KGphdmEubGFuZy5TdHJpbmcpCisgICAqLworICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KGZpbmFsIFN0cmluZyB1cmkpIHRocm93cyBTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uLCBTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24geworICAgICAgcmV0dXJuIHRoaXMucmVhZGVyLmdldFByb3BlcnR5KHVyaSk7CisgIH0KKworICAvKiAobm9uLUphdmFkb2MpCisgICAqIEBzZWUgb3JnLnhtbC5zYXguWE1MUmVhZGVyI3NldERUREhhbmRsZXIob3JnLnhtbC5zYXguRFRESGFuZGxlcikKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldERUREhhbmRsZXIoZmluYWwgRFRESGFuZGxlciBkdGRIYW5kbGVyKSB7CisgICAgICB0aGlzLnJlYWRlci5zZXREVERIYW5kbGVyKGR0ZEhhbmRsZXIpOworICB9CisKKyAgLyogKG5vbi1KYXZhZG9jKQorICAgKiBAc2VlIG9yZy54bWwuc2F4LlhNTFJlYWRlciNzZXRFbnRpdHlSZXNvbHZlcihvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcikKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldEVudGl0eVJlc29sdmVyKGZpbmFsIEVudGl0eVJlc29sdmVyIGVudGl0eVJlc29sdmVyKSB7CisgICAgICB0aGlzLnJlYWRlci5zZXRFbnRpdHlSZXNvbHZlcihlbnRpdHlSZXNvbHZlcik7CisgIH0KKworICAvKioKKyAgICogUmVzb2x2ZXMgZW50aXRpZXMgYWdhaW5zdCB1c2luZyB0aGUgc3VwcGllZCBVUkwgYXMgdGhlIGJhc2UgZm9yIHJlbGF0aXZlIFVSTHMKKyAgICogCisgICAqIEBwYXJhbSBiYXNlCisgICAqIFRoZSBVUkwgdXNlZCB0byByZXNvbHZlIHJlbGF0aXZlIFVSTHMKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldEVudGl0eUJhc2VVcmwoZmluYWwgVVJMIGJhc2UpIHsKKyAgICAgIHRoaXMucmVhZGVyLnNldEVudGl0eVJlc29sdmVyKG5ldyBFbnRpdHlSZXNvbHZlcigpIHsKKyAgICAgICAgICBwdWJsaWMgSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShmaW5hbCBTdHJpbmcgcHVibGljSWQsIGZpbmFsIFN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnB1dFNvdXJjZShuZXcgVVJMKGJhc2UsIHN5c3RlbUlkKS5vcGVuU3RyZWFtKCkpOworICAgICAgICAgIH0KKyAgICAgIH0pOworICB9CisKKyAgLyogKG5vbi1KYXZhZG9jKQorICAgKiBAc2VlIG9yZy54bWwuc2F4LlhNTFJlYWRlciNzZXRFcnJvckhhbmRsZXIob3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyKQorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0RXJyb3JIYW5kbGVyKGZpbmFsIEVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIpIHsKKyAgICAgIHRoaXMucmVhZGVyLnNldEVycm9ySGFuZGxlcihlcnJvckhhbmRsZXIpOworICB9CisKKyAgLyogKG5vbi1KYXZhZG9jKQorICAgKiBAc2VlIG9yZy54bWwuc2F4LlhNTFJlYWRlciNzZXRGZWF0dXJlKGphdmEubGFuZy5TdHJpbmcsIGJvb2xlYW4pCisgICAqLworICBwdWJsaWMgdm9pZCBzZXRGZWF0dXJlKGZpbmFsIFN0cmluZyB1cmksIGZpbmFsIGJvb2xlYW4gdmFsdWUpIHRocm93cyBTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uLCBTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24geworICAgICAgdGhpcy5yZWFkZXIuc2V0RmVhdHVyZSh1cmksIHZhbHVlKTsKKyAgfQorCisgIC8qIChub24tSmF2YWRvYykKKyAgICogQHNlZSBvcmcueG1sLnNheC5YTUxSZWFkZXIjc2V0UHJvcGVydHkoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KGZpbmFsIFN0cmluZyB1cmksIGZpbmFsIE9iamVjdCB2YWx1ZSkgdGhyb3dzIFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24sIFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7CisgICAgICAgdGhpcy5yZWFkZXIuc2V0UHJvcGVydHkodXJpLCB2YWx1ZSk7CisgIH0KKyAgCisgIAorICAvLyBDb250ZW50SGFuZGxlciBpbnRlcmZhY2UKKyAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAKKyAgCisgIC8qIChub24tSmF2YWRvYykKKyAgICogQHNlZSBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciNzdGFydERvY3VtZW50KCkKKyAgICovCisgIHB1YmxpYyB2b2lkIHN0YXJ0RG9jdW1lbnQoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICB0aGlzLmN1cnJlbnROb2RlID0gbnVsbDsKKyAgICB0aGlzLmNoYXJCdWZmZXIuc2V0TGVuZ3RoKDApOworICB9CisgIAorICAvKiAobm9uLUphdmFkb2MpCisgICAqIEBzZWUgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlciNzdGFydFByZWZpeE1hcHBpbmcoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKKyAgICovCisgIHB1YmxpYyB2b2lkIHN0YXJ0UHJlZml4TWFwcGluZyhmaW5hbCBTdHJpbmcgdGFnLCBmaW5hbCBTdHJpbmcgdXJpKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICB0aGlzLm5hbWVzcGFjZVRhZ0hpbnRzLnB1dCh0YWcsIHVyaSk7CisgIH0KKworICAvKiAobm9uLUphdmFkb2MpCisgICAqIEBzZWUgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIjc3RhcnRFbGVtZW50KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIG9yZy54bWwuc2F4LkF0dHJpYnV0ZXMpCisgICAqLworICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoZmluYWwgU3RyaW5nIG5hbWVzcGFjZVVSSSwgZmluYWwgU3RyaW5nIGxvY2FsTmFtZSwgZmluYWwgU3RyaW5nIHFOYW1lLCBmaW5hbCBBdHRyaWJ1dGVzIGF0dHMpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgIGFkZENkYXRhKCk7CisgICAgCisgICAgZmluYWwgTWFwIGF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcCgpOworICAgIGZpbmFsIE1hcCBhdHRyaWJ1dGVOYW1lc3BhY2VzID0gbmV3IEhhc2hNYXAoKTsKKyAgICAKKyAgICBmb3IgKGludCBpID0gYXR0cy5nZXRMZW5ndGgoKSAtIDE7IGkgIT0gLTE7IGktLSkgeworICAgICAgaWYgKGF0dHMuZ2V0VVJJKGkpLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgYXR0cmlidXRlcy5wdXQoYXR0cy5nZXRRTmFtZShpKSwgYXR0cy5nZXRWYWx1ZShpKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBhdHRyaWJ1dGVzLnB1dChhdHRzLmdldExvY2FsTmFtZShpKSwgYXR0cy5nZXRWYWx1ZShpKSk7CisgICAgICAgIGF0dHJpYnV0ZU5hbWVzcGFjZXMucHV0KGF0dHMuZ2V0TG9jYWxOYW1lKGkpLCBhdHRzLmdldFVSSShpKSk7CisgICAgICB9CisgICAgICAKKyAgICB9CisgICAgCisgICAgZmluYWwgTm9kZSBuZXdFbGVtZW50OworICAgIAorICAgIGlmIChuYW1lc3BhY2VVUkkubGVuZ3RoKCkgPT0gMCl7CisgICAgICBuZXdFbGVtZW50ID0gbmV3IE5vZGUodGhpcy5jdXJyZW50Tm9kZSwgcU5hbWUsIGF0dHJpYnV0ZXMsIGF0dHJpYnV0ZU5hbWVzcGFjZXMsIG5hbWVzcGFjZVVSSSk7CisgICAgfSBlbHNlIHsKKyAgICAgIG5ld0VsZW1lbnQgPSBuZXcgTm9kZSh0aGlzLmN1cnJlbnROb2RlLCBsb2NhbE5hbWUsIGF0dHJpYnV0ZXMsIGF0dHJpYnV0ZU5hbWVzcGFjZXMsIG5hbWVzcGFjZVVSSSk7CisgICAgfQorICAgIAorICAgIGlmICh0aGlzLmN1cnJlbnROb2RlICE9IG51bGwpIHsKKyAgICAgIHRoaXMuY3VycmVudE5vZGUuYWRkQ2hpbGQobmV3RWxlbWVudCk7CisgICAgfQorICAgIAorICAgIHRoaXMuc3RhY2sucHVzaCh0aGlzLmN1cnJlbnROb2RlKTsKKyAgICB0aGlzLmN1cnJlbnROb2RlID0gbmV3RWxlbWVudDsKKyAgfQorICAKKyAgLyogKG5vbi1KYXZhZG9jKQorICAgKiBAc2VlIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyI2NoYXJhY3RlcnMoY2hhcltdLCBpbnQsIGludCkKKyAgICovCisgIHB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoZmluYWwgY2hhcltdIGNoLCBmaW5hbCBpbnQgc3RhcnQsIGZpbmFsIGludCBsZW5ndGgpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgIHRoaXMuY2hhckJ1ZmZlci5hcHBlbmQoY2gsIHN0YXJ0LCBsZW5ndGgpOworICB9CisgIAorICAvKiAobm9uLUphdmFkb2MpCisgICAqIEBzZWUgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIjZW5kRWxlbWVudChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQorICAgKi8KKyAgcHVibGljIHZvaWQgZW5kRWxlbWVudChmaW5hbCBTdHJpbmcgbmFtZXNwYWNlVVJJLCBmaW5hbCBTdHJpbmcgbG9jYWxOYW1lLCBmaW5hbCBTdHJpbmcgcU5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgIGFkZENkYXRhKCk7CisgICAgCisgICAgZmluYWwgT2JqZWN0IG9sZEN1cnJlbnROb2RlID0gdGhpcy5zdGFjay5wb3AoKTsKKyAgICAKKyAgICBpZiAob2xkQ3VycmVudE5vZGUgIT0gbnVsbCkgeworICAgICAgdGhpcy5jdXJyZW50Tm9kZSA9IChOb2RlKW9sZEN1cnJlbnROb2RlOworICAgIH0KKyAgfQorICAKKyAgLyogKG5vbi1KYXZhZG9jKQorICAgKiBAc2VlIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyI2VuZERvY3VtZW50KCkKKyAgICovCisgIHB1YmxpYyB2b2lkIGVuZERvY3VtZW50KCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgIH0KKyAgCisgIC8vIEltcGxlbWVudGF0aW9uIG1ldGhvZHMKKyAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAKKyAgCisgIC8qKgorICAgKiAKKyAgICovCisgIHByaXZhdGUgdm9pZCBhZGRDZGF0YSgpIHsKKyAgICBpZiAodGhpcy5jaGFyQnVmZmVyLmxlbmd0aCgpICE9IDApIHsKKyAgICAgIC8vCisgICAgICAvLyBUaGlzIGVsZW1lbnQgaXMgcHJlY2VlZGVkIGJ5IENEQVRBIGlmIGtlZXBXaGl0ZXNwYWNlIGlzIGZhbHNlICh0aGUgZGVmYXVsdCBzZXR0aW5nKSBhbmQgCisgICAgICAvLyBpdCdzIG5vdCB3aGl0ZXNwYWNlIGFkZCBpdCB0byB0aGUgYm9keQorICAgICAgLy8gTm90ZSB0aGF0LCBhY2NvcmRpbmcgdG8gdGhlIFhNTCBzcGVjLCB3ZSBzaG91bGQgcHJlc2VydmUgdGhlIENEQVRBIGlmIGl0J3MgYWxsIHdoaXRlc3BhY2UKKyAgICAgIC8vIGJ1dCBmb3IgdGhlIHNvcnQgb2Ygd29yayBJJ20gZG9pbmcgaWdub3JpbmcgdGhlIHdoaXRlc3BhY2UgaXMgcHJlZmVyYWJsZQorICAgICAgLy8KKyAgICAgIGZpbmFsIFN0cmluZyBjZGF0YSA9IHRoaXMuY2hhckJ1ZmZlci50b1N0cmluZygpOworICAgICAgCisgICAgICB0aGlzLmNoYXJCdWZmZXIuc2V0TGVuZ3RoKDApOworICAgICAgaWYgKHRoaXMua2VlcFdoaXRlc3BhY2UgfHwgY2RhdGEudHJpbSgpLmxlbmd0aCgpICE9IDApIHsKKyAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS5hZGRDaGlsZChjZGF0YSk7CisgICAgICB9CisgICAgfSAgIAorICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvcGFja2FnZS5odG1sIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91dGlsL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWI5YmE5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91dGlsL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDggQEAKKzxodG1sPgorICA8aGVhZD4KKyAgICA8dGl0bGU+cGFja2FnZSBncm9vdnkudXRpbC4qPC90aXRsZT4KKyAgPC9oZWFkPgorICA8Ym9keT4KKyAgICA8cD5WYXJpb3VzIEdyb292eSB1dGlsaXRpZXMgZm9yIHdvcmtpbmcgd2l0aCBub2RlcywgYnVpbGRlcnMsIGxvZ2dpbmcsIEpVbml0IHRlc3QgY2FzZXMsIHRleHQgZXhwcmVzc2lvbnMsIEFudCB0YXNrcyBvciBKTVggTUJlYW5zLjwvcD4KKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91dGlsL3NsdXJwZXJzdXBwb3J0L0F0dHJpYnV0ZS5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91dGlsL3NsdXJwZXJzdXBwb3J0L0F0dHJpYnV0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNTlkYjkKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvc2x1cnBlcnN1cHBvcnQvQXR0cmlidXRlLmphdmEKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBncm9vdnkudXRpbC5zbHVycGVyc3VwcG9ydDsKKworaW1wb3J0IGdyb292eS5sYW5nLkNsb3N1cmU7CitpbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0OworaW1wb3J0IGdyb292eS5sYW5nLkdyb292eVJ1bnRpbWVFeGNlcHRpb247CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLnR5cGVoYW5kbGluZy5EZWZhdWx0VHlwZVRyYW5zZm9ybWF0aW9uOworCitwdWJsaWMgY2xhc3MgQXR0cmlidXRlIGV4dGVuZHMgR1BhdGhSZXN1bHQgeworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHZhbHVlOworCisgICAgcHVibGljIEF0dHJpYnV0ZShmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIHZhbHVlLCBmaW5hbCBHUGF0aFJlc3VsdCBwYXJlbnQsIGZpbmFsIFN0cmluZyBuYW1lc3BhY2VQcmVmaXgsIGZpbmFsIE1hcCBuYW1lc3BhY2VUYWdIaW50cykgeworICAgICAgc3VwZXIocGFyZW50LCBuYW1lLCBuYW1lc3BhY2VQcmVmaXgsIG5hbWVzcGFjZVRhZ0hpbnRzKTsKKyAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIG5hbWUoKSB7CisgICAgICAgIC8vIHRoaXMgbmFtZSBjb250YWlucyBAbmFtZSB3ZSBuZWVkIHRvIHJldHVybiBuYW1lCisgICAgICAgIHJldHVybiB0aGlzLm5hbWUuc3Vic3RyaW5nKDEpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0ZXh0KCkgeworICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7CisgICAgfQorCisgICAgcHVibGljIEdQYXRoUmVzdWx0IHBhcmVudHMoKSB7CisgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKyAgICAgICAgdGhyb3cgbmV3IEdyb292eVJ1bnRpbWVFeGNlcHRpb24oInBhcmVudHMoKSBub3QgaW1wbGVtZW50ZWQgeWV0Iik7CisgICAgfQorCisgICAgcHVibGljIEl0ZXJhdG9yIGNoaWxkTm9kZXMoKSB7CisgICAgICAgIHRocm93IG5ldyBHcm9vdnlSdW50aW1lRXhjZXB0aW9uKCJjYW4ndCBjYWxsIGNoaWxkTm9kZXMoKSBpbiB0aGUgYXR0cmlidXRlICIgKyB0aGlzLm5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIG5vZGVJdGVyYXRvcigpOworICAgIH0KKworICAgIHB1YmxpYyBHUGF0aFJlc3VsdCBmaW5kKGZpbmFsIENsb3N1cmUgY2xvc3VyZSkgeworICAgICAgICBpZiAoRGVmYXVsdFR5cGVUcmFuc2Zvcm1hdGlvbi5jYXN0VG9Cb29sZWFuKGNsb3N1cmUuY2FsbChuZXcgT2JqZWN0W117dGhpc30pKSkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTm9DaGlsZHJlbih0aGlzLCAiIiwgdGhpcy5uYW1lc3BhY2VUYWdIaW50cyk7CisgICAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBHUGF0aFJlc3VsdCBmaW5kQWxsKGZpbmFsIENsb3N1cmUgY2xvc3VyZSkgeworICAgICAgICByZXR1cm4gZmluZChjbG9zdXJlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSXRlcmF0b3Igbm9kZUl0ZXJhdG9yKCkgeworICAgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCkgeworICAgICAgICAgICAgcHJpdmF0ZSBib29sZWFuIGhhc05leHQgPSB0cnVlOworICAgICAgICAgICAgCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworICAgICAgICAgICAgICByZXR1cm4gdGhpcy5oYXNOZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7CisgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLmhhc05leHQpID8gQXR0cmlidXRlLnRoaXMgOiBudWxsOworICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHRoaXMuaGFzTmV4dCA9IGZhbHNlOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKKyAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgcHVibGljIFdyaXRlciB3cml0ZVRvKGZpbmFsIFdyaXRlciBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG91dC53cml0ZSh0aGlzLnZhbHVlKTsKKyAgICAgICAgcmV0dXJuIG91dDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBidWlsZChmaW5hbCBHcm9vdnlPYmplY3QgYnVpbGRlcikgeworICAgICAgICBidWlsZGVyLmdldFByb3BlcnR5KCJta3AiKTsKKyAgICAgICAgYnVpbGRlci5pbnZva2VNZXRob2QoInlpZWxkIiwgbmV3IE9iamVjdFtde3RoaXMudmFsdWV9KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCByZXBsYWNlTm9kZShmaW5hbCBDbG9zdXJlIG5ld1ZhbHVlKSB7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgcmVwbGFjZUJvZHkoZmluYWwgT2JqZWN0IG5ld1ZhbHVlKSB7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgYXBwZW5kTm9kZShmaW5hbCBPYmplY3QgbmV3VmFsdWUpIHsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvc2x1cnBlcnN1cHBvcnQvQXR0cmlidXRlcy5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91dGlsL3NsdXJwZXJzdXBwb3J0L0F0dHJpYnV0ZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGU4MGMyCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91dGlsL3NsdXJwZXJzdXBwb3J0L0F0dHJpYnV0ZXMuamF2YQpAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGdyb292eS51dGlsLnNsdXJwZXJzdXBwb3J0OworCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuQ2xvc3VyZTsKK2ltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlPYmplY3Q7CitpbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworLyoqCisgKiBAYXV0aG9yIEpvaG4gV2lsc29uCisgKi8KKworY2xhc3MgQXR0cmlidXRlcyBleHRlbmRzIE5vZGVDaGlsZHJlbiB7CisgICAgZmluYWwgU3RyaW5nIGF0dHJpYnV0ZU5hbWU7CisKKyAgICBwdWJsaWMgQXR0cmlidXRlcyhmaW5hbCBHUGF0aFJlc3VsdCBwYXJlbnQsIGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgbmFtZXNwYWNlUHJlZml4LCBmaW5hbCBNYXAgbmFtZXNwYWNlVGFnSGludHMpIHsKKyAgICAgICAgc3VwZXIocGFyZW50LCBuYW1lLCBuYW1lc3BhY2VQcmVmaXgsIG5hbWVzcGFjZVRhZ0hpbnRzKTsKKyAgICAgICAgdGhpcy5hdHRyaWJ1dGVOYW1lID0gdGhpcy5uYW1lLnN1YnN0cmluZygxKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQXR0cmlidXRlcyhmaW5hbCBHUGF0aFJlc3VsdCBwYXJlbnQsIGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBNYXAgbmFtZXNwYWNlVGFnSGludHMpIHsKKyAgICAgICAgdGhpcyhwYXJlbnQsIG5hbWUsICIqIiwgbmFtZXNwYWNlVGFnSGludHMpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgbmFtZSgpIHsKKyAgICAgICAgLy8gdGhpcyBuYW1lIGNvbnRhaW5zIEBuYW1lIHdlIG5lZWQgdG8gcmV0dXJuIG5hbWUKKyAgICAgICAgcmV0dXJuIHRoaXMubmFtZS5zdWJzdHJpbmcoMSk7CisgICAgfQorCisgICAgcHVibGljIEl0ZXJhdG9yIGNoaWxkTm9kZXMoKSB7CisgICAgICAgIHRocm93IG5ldyBHcm9vdnlSdW50aW1lRXhjZXB0aW9uKCJDYW4ndCBnZXQgdGhlIGNoaWxkIG5vZGVzIG9uIGEgYSBHUGF0aCBleHByZXNzaW9uIHNlbGVjdGluZyBhdHRyaWJ1dGVzOiAuLi4uIiArIHRoaXMucGFyZW50Lm5hbWUoKSArICIuIiArIG5hbWUoKSArICIuY2hpbGROb2RlcygpIik7CisgICAgfQorCisgICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgeworICAgICAgICByZXR1cm4gbmV3IE5vZGVJdGVyYXRvcihub2RlSXRlcmF0b3IoKSkgeworICAgICAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBnZXROZXh0Tm9kZShmaW5hbCBJdGVyYXRvciBpdGVyKSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBuZXh0ID0gaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0IGluc3RhbmNlb2YgQXR0cmlidXRlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV4dDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZSA9IChTdHJpbmcpICgoTm9kZSkgbmV4dCkuYXR0cmlidXRlcygpLmdldChBdHRyaWJ1dGVzLnRoaXMuYXR0cmlidXRlTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXR0cmlidXRlKEF0dHJpYnV0ZXMudGhpcy5hdHRyaWJ1dGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm9kZUNoaWxkKChOb2RlKSBuZXh0LCBBdHRyaWJ1dGVzLnRoaXMucGFyZW50LnBhcmVudCwgIiIsIEF0dHJpYnV0ZXMudGhpcy5uYW1lc3BhY2VUYWdIaW50cyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMudGhpcy5uYW1lc3BhY2VUYWdIaW50cyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgcHVibGljIEl0ZXJhdG9yIG5vZGVJdGVyYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50Lm5vZGVJdGVyYXRvcigpOworICAgIH0KKworICAgIHB1YmxpYyBHUGF0aFJlc3VsdCBwYXJlbnRzKCkgeworICAgICAgICByZXR1cm4gc3VwZXIucGFyZW50cygpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdGV4dCgpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgZmluYWwgSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgYnVmLmFwcGVuZChpdGVyLm5leHQoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0IGxpc3QoKSB7CisgICAgICAgIGZpbmFsIEl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOworICAgICAgICBmaW5hbCBMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICByZXN1bHQuYWRkKGl0ZXIubmV4dCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBHUGF0aFJlc3VsdCBmaW5kQWxsKGZpbmFsIENsb3N1cmUgY2xvc3VyZSkgeworICAgICAgICByZXR1cm4gbmV3IEZpbHRlcmVkQXR0cmlidXRlcyh0aGlzLCBjbG9zdXJlLCB0aGlzLm5hbWVzcGFjZVRhZ0hpbnRzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgV3JpdGVyIHdyaXRlVG8oZmluYWwgV3JpdGVyIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgb3V0LndyaXRlKHRleHQoKSk7CisgICAgICAgIHJldHVybiBvdXQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYnVpbGQoZmluYWwgR3Jvb3Z5T2JqZWN0IGJ1aWxkZXIpIHsKKyAgICAgICAgYnVpbGRlci5nZXRQcm9wZXJ0eSgibWtwIik7CisgICAgICAgIGJ1aWxkZXIuaW52b2tlTWV0aG9kKCJ5aWVsZCIsIG5ldyBPYmplY3RbXXt0ZXh0KCl9KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvc2x1cnBlcnN1cHBvcnQvRmlsdGVyZWRBdHRyaWJ1dGVzLmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvc2x1cnBlcnN1cHBvcnQvRmlsdGVyZWRBdHRyaWJ1dGVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk0ZjBiMQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdXRpbC9zbHVycGVyc3VwcG9ydC9GaWx0ZXJlZEF0dHJpYnV0ZXMuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgZ3Jvb3Z5LnV0aWwuc2x1cnBlcnN1cHBvcnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS50eXBlaGFuZGxpbmcuRGVmYXVsdFR5cGVUcmFuc2Zvcm1hdGlvbjsKKworaW1wb3J0IGdyb292eS5sYW5nLkNsb3N1cmU7CisKKy8qKgorICogTGF6eSBldmFsdWF0ZWQgcmVwcmVzZW50YXRpb24gb2Ygbm9kZXMgZmlsdGVyZWQgYnkgYXR0cmlidXRlcy4KKyAqCisgKiBAYXV0aG9yIEpvaG4gV2lsc29uCisgKi8KK3B1YmxpYyBjbGFzcyBGaWx0ZXJlZEF0dHJpYnV0ZXMgZXh0ZW5kcyBBdHRyaWJ1dGVzCit7CisgICAgcHJpdmF0ZSBmaW5hbCBDbG9zdXJlIGNsb3N1cmU7CisKKyAgICBwdWJsaWMgRmlsdGVyZWRBdHRyaWJ1dGVzKGZpbmFsIEdQYXRoUmVzdWx0IHBhcmVudCwgZmluYWwgQ2xvc3VyZSBjbG9zdXJlLCBmaW5hbCBNYXAgbmFtZXNwYWNlVGFnSGludHMpIHsKKyAgICAgICAgc3VwZXIocGFyZW50LCBwYXJlbnQubmFtZSwgbmFtZXNwYWNlVGFnSGludHMpOworICAgICAgICB0aGlzLmNsb3N1cmUgPSBjbG9zdXJlOworICAgIH0KKworICAgIHB1YmxpYyBJdGVyYXRvciBub2RlSXRlcmF0b3IoKSB7CisgICAgICAgIHJldHVybiBuZXcgTm9kZUl0ZXJhdG9yKHRoaXMucGFyZW50Lml0ZXJhdG9yKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0TmV4dE5vZGUoZmluYWwgSXRlcmF0b3IgaXRlcikgeworICAgICAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3Qgbm9kZSA9IGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoRGVmYXVsdFR5cGVUcmFuc2Zvcm1hdGlvbi5jYXN0VG9Cb29sZWFuKEZpbHRlcmVkQXR0cmlidXRlcy50aGlzLmNsb3N1cmUuY2FsbChuZXcgT2JqZWN0W117bm9kZX0pKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvc2x1cnBlcnN1cHBvcnQvRmlsdGVyZWROb2RlQ2hpbGRyZW4uamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdXRpbC9zbHVycGVyc3VwcG9ydC9GaWx0ZXJlZE5vZGVDaGlsZHJlbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzYmRjNjcKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvc2x1cnBlcnN1cHBvcnQvRmlsdGVyZWROb2RlQ2hpbGRyZW4uamF2YQpAQCAtMCwwICsxLDgwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgZ3Jvb3Z5LnV0aWwuc2x1cnBlcnN1cHBvcnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS50eXBlaGFuZGxpbmcuRGVmYXVsdFR5cGVUcmFuc2Zvcm1hdGlvbjsKKworaW1wb3J0IGdyb292eS5sYW5nLkNsb3N1cmU7CisKKy8qKgorICogQGF1dGhvciBKb2huIFdpbHNvbgorICovCisKK3B1YmxpYyBjbGFzcyBGaWx0ZXJlZE5vZGVDaGlsZHJlbiBleHRlbmRzIE5vZGVDaGlsZHJlbiB7CisgICAgcHJpdmF0ZSBmaW5hbCBDbG9zdXJlIGNsb3N1cmU7CisKKyAgICBwdWJsaWMgRmlsdGVyZWROb2RlQ2hpbGRyZW4oZmluYWwgR1BhdGhSZXN1bHQgcGFyZW50LCBmaW5hbCBDbG9zdXJlIGNsb3N1cmUsIGZpbmFsIE1hcCBuYW1lc3BhY2VUYWdIaW50cykgeworICAgICAgICBzdXBlcihwYXJlbnQsIHBhcmVudC5uYW1lLCBuYW1lc3BhY2VUYWdIaW50cyk7CisgICAgICAgIHRoaXMuY2xvc3VyZSA9IGNsb3N1cmU7CisgICAgfQorCisgICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgeworICAgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCkgeworICAgICAgICAgICAgZmluYWwgSXRlcmF0b3IgaXRlciA9IEZpbHRlcmVkTm9kZUNoaWxkcmVuLnRoaXMucGFyZW50Lml0ZXJhdG9yKCk7CisgICAgICAgICAgICBPYmplY3QgbmV4dCA9IG51bGw7CisKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKHRoaXMuaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGNoaWxkTm9kZSA9IHRoaXMuaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbG9zdXJlWWllbGRzVHJ1ZUZvck5vZGUoY2hpbGROb2RlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0ID0gY2hpbGROb2RlOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubmV4dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIHB1YmxpYyBJdGVyYXRvciBub2RlSXRlcmF0b3IoKSB7CisgICAgICAgIHJldHVybiBuZXcgTm9kZUl0ZXJhdG9yKHRoaXMucGFyZW50Lm5vZGVJdGVyYXRvcigpKSB7CisgICAgICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldE5leHROb2RlKGZpbmFsIEl0ZXJhdG9yIGl0ZXIpIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IG5vZGUgPSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsb3N1cmVZaWVsZHNUcnVlRm9yTm9kZShuZXcgTm9kZUNoaWxkKChOb2RlKSBub2RlLCBGaWx0ZXJlZE5vZGVDaGlsZHJlbi50aGlzLnBhcmVudCwgRmlsdGVyZWROb2RlQ2hpbGRyZW4udGhpcy5uYW1lc3BhY2VUYWdIaW50cykpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gY2xvc3VyZVlpZWxkc1RydWVGb3JOb2RlKE9iamVjdCBjaGlsZE5vZGUpIHsKKyAgICAgICAgcmV0dXJuIERlZmF1bHRUeXBlVHJhbnNmb3JtYXRpb24uY2FzdFRvQm9vbGVhbihGaWx0ZXJlZE5vZGVDaGlsZHJlbi50aGlzLmNsb3N1cmUuY2FsbChuZXcgT2JqZWN0W117Y2hpbGROb2RlfSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdXRpbC9zbHVycGVyc3VwcG9ydC9HUGF0aFJlc3VsdC5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91dGlsL3NsdXJwZXJzdXBwb3J0L0dQYXRoUmVzdWx0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk2YTU3ZgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdXRpbC9zbHVycGVyc3VwcG9ydC9HUGF0aFJlc3VsdC5qYXZhCkBAIC0wLDAgKzEsNDczIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBncm9vdnkudXRpbC5zbHVycGVyc3VwcG9ydDsKKworaW1wb3J0IGdyb292eS5sYW5nLkJ1aWxkYWJsZTsKK2ltcG9ydCBncm9vdnkubGFuZy5DbG9zdXJlOworaW1wb3J0IGdyb292eS5sYW5nLkRlbGVnYXRpbmdNZXRhQ2xhc3M7CitpbXBvcnQgZ3Jvb3Z5LmxhbmcuR1N0cmluZzsKK2ltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlPYmplY3Q7CitpbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0U3VwcG9ydDsKK2ltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlSdW50aW1lRXhjZXB0aW9uOworaW1wb3J0IGdyb292eS5sYW5nLkludFJhbmdlOworaW1wb3J0IGdyb292eS5sYW5nLk1ldGFDbGFzczsKK2ltcG9ydCBncm9vdnkubGFuZy5Xcml0YWJsZTsKKworaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TdGFjazsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5EZWZhdWx0R3Jvb3Z5TWV0aG9kczsKKworCisvKioKKyAqIEBhdXRob3IgSm9obiBXaWxzb24KKyAqLworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgR1BhdGhSZXN1bHQgZXh0ZW5kcyBHcm9vdnlPYmplY3RTdXBwb3J0IGltcGxlbWVudHMgV3JpdGFibGUsIEJ1aWxkYWJsZSB7CisgICAgcHJvdGVjdGVkIGZpbmFsIEdQYXRoUmVzdWx0IHBhcmVudDsKKyAgICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIG5hbWU7CisgICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBuYW1lc3BhY2VQcmVmaXg7CisgICAgcHJvdGVjdGVkIGZpbmFsIE1hcCBuYW1lc3BhY2VNYXAgPSBuZXcgSGFzaE1hcCgpOworICAgIHByb3RlY3RlZCBmaW5hbCBNYXAgbmFtZXNwYWNlVGFnSGludHM7CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gcGFyZW50CisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiBAcGFyYW0gbmFtZXNwYWNlUHJlZml4CisgICAgICogQHBhcmFtIG5hbWVzcGFjZVRhZ0hpbnRzCisgICAgICovCisgICAgcHVibGljIEdQYXRoUmVzdWx0KGZpbmFsIEdQYXRoUmVzdWx0IHBhcmVudCwgZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFN0cmluZyBuYW1lc3BhY2VQcmVmaXgsIGZpbmFsIE1hcCBuYW1lc3BhY2VUYWdIaW50cykgeworICAgICAgICBpZiAocGFyZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIHdlIGFyZSB0aGUgdG9wIG9mIHRoZSB0cmVlCisgICAgICAgICAgICB0aGlzLnBhcmVudCA9IHRoaXM7CisgICAgICAgICAgICB0aGlzLm5hbWVzcGFjZU1hcC5wdXQoInhtbCIsICJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiKTsgIC8vIFRoZSBYTUwgbmFtZXNwYWNlIGlzIGFsd2F5cyBkZWZpbmVkCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKKyAgICAgICAgICAgIHRoaXMubmFtZXNwYWNlTWFwLnB1dEFsbChwYXJlbnQubmFtZXNwYWNlTWFwKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB0aGlzLm5hbWVzcGFjZVByZWZpeCA9IG5hbWVzcGFjZVByZWZpeDsKKyAgICAgICAgdGhpcy5uYW1lc3BhY2VUYWdIaW50cyA9IG5hbWVzcGFjZVRhZ0hpbnRzOworCisgICAgICAgIHNldE1ldGFDbGFzcyhnZXRNZXRhQ2xhc3MoKSk7IC8vIHdyYXAgdGhlIHN0YW5kYXJkIE1ldGFDbGFzcyB3aXRoIHRoZSBkZWxlZ2F0ZQorICAgIH0KKworICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIGdyb292eS5sYW5nLkdyb292eU9iamVjdFN1cHBvcnQjc2V0TWV0YUNsYXNzKGdyb292eS5sYW5nLk1ldGFDbGFzcykKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNZXRhQ2xhc3MoZmluYWwgTWV0YUNsYXNzIG1ldGFDbGFzcykgeworICAgICAgICBmaW5hbCBNZXRhQ2xhc3MgbmV3TWV0YUNsYXNzID0gbmV3IERlbGVnYXRpbmdNZXRhQ2xhc3MobWV0YUNsYXNzKSB7CisgICAgICAgICAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICAgICAgICAqIEBzZWUgZ3Jvb3Z5LmxhbmcuRGVsZWdhdGluZ01ldGFDbGFzcyNnZXRBdHRyaWJ1dGUoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZykKKyAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZShmaW5hbCBPYmplY3Qgb2JqZWN0LCBmaW5hbCBTdHJpbmcgYXR0cmlidXRlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdQYXRoUmVzdWx0LnRoaXMuZ2V0UHJvcGVydHkoIkAiICsgYXR0cmlidXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKGZpbmFsIE9iamVjdCBvYmplY3QsIGZpbmFsIFN0cmluZyBhdHRyaWJ1dGUsIGZpbmFsIE9iamVjdCBuZXdWYWx1ZSkgeworICAgICAgICAgICAgICAgIEdQYXRoUmVzdWx0LnRoaXMuc2V0UHJvcGVydHkoIkAiICsgYXR0cmlidXRlLCBuZXdWYWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHN1cGVyLnNldE1ldGFDbGFzcyhuZXdNZXRhQ2xhc3MpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoZmluYWwgU3RyaW5nIHByb3BlcnR5KSB7CisgICAgICAgIGlmICgiLi4iLmVxdWFscyhwcm9wZXJ0eSkpIHsKKyAgICAgICAgICAgIHJldHVybiBwYXJlbnQoKTsKKyAgICAgICAgfSBlbHNlIGlmICgiKiIuZXF1YWxzKHByb3BlcnR5KSkgeworICAgICAgICAgICAgcmV0dXJuIGNoaWxkcmVuKCk7CisgICAgICAgIH0gZWxzZSBpZiAoIioqIi5lcXVhbHMocHJvcGVydHkpKSB7CisgICAgICAgICAgICByZXR1cm4gZGVwdGhGaXJzdCgpOworICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5LnN0YXJ0c1dpdGgoIkAiKSkgeworICAgICAgICAgICAgaWYgKHByb3BlcnR5LmluZGV4T2YoIjoiKSAhPSAtMSkgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCBpID0gcHJvcGVydHkuaW5kZXhPZigiOiIpOworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXR0cmlidXRlcyh0aGlzLCAiQCIgKyBwcm9wZXJ0eS5zdWJzdHJpbmcoaSArIDEpLCBwcm9wZXJ0eS5zdWJzdHJpbmcoMSwgaSksIHRoaXMubmFtZXNwYWNlVGFnSGludHMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEF0dHJpYnV0ZXModGhpcywgcHJvcGVydHksIHRoaXMubmFtZXNwYWNlVGFnSGludHMpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHByb3BlcnR5LmluZGV4T2YoIjoiKSAhPSAtMSkgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCBpID0gcHJvcGVydHkuaW5kZXhPZigiOiIpOworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTm9kZUNoaWxkcmVuKHRoaXMsIHByb3BlcnR5LnN1YnN0cmluZyhpICsgMSksIHByb3BlcnR5LnN1YnN0cmluZygwLCBpKSwgdGhpcy5uYW1lc3BhY2VUYWdIaW50cyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTm9kZUNoaWxkcmVuKHRoaXMsIHByb3BlcnR5LCB0aGlzLm5hbWVzcGFjZVRhZ0hpbnRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KGZpbmFsIFN0cmluZyBwcm9wZXJ0eSwgZmluYWwgT2JqZWN0IG5ld1ZhbHVlKSB7CisgICAgICAgIGlmIChwcm9wZXJ0eS5zdGFydHNXaXRoKCJAIikpIHsKKyAgICAgICAgICAgIGlmIChuZXdWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZyB8fCBuZXdWYWx1ZSBpbnN0YW5jZW9mIEdTdHJpbmcpIHsKKyAgICAgICAgICAgIGZpbmFsIEl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOworICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgTm9kZUNoaWxkIGNoaWxkID0gKE5vZGVDaGlsZClpdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgY2hpbGQuYXR0cmlidXRlcygpLnB1dChwcm9wZXJ0eS5zdWJzdHJpbmcoMSksIG5ld1ZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgIGZpbmFsIEdQYXRoUmVzdWx0IHJlc3VsdCA9IG5ldyBOb2RlQ2hpbGRyZW4odGhpcywgcHJvcGVydHksIHRoaXMubmFtZXNwYWNlVGFnSGludHMpOworICAgICAgICAKKyAgICAgICAgICAgIGlmIChuZXdWYWx1ZSBpbnN0YW5jZW9mIE1hcCkgeworICAgICAgICAgICAgZmluYWwgSXRlcmF0b3IgaXRlciA9ICgoTWFwKW5ld1ZhbHVlKS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KWl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2V0UHJvcGVydHkoIkAiICsgZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAKKyAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlIGluc3RhbmNlb2YgQ2xvc3VyZSkgeworICAgICAgICAgICAgICAgICAgcmVzdWx0LnJlcGxhY2VOb2RlKChDbG9zdXJlKW5ld1ZhbHVlKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIHJlc3VsdC5yZXBsYWNlQm9keShuZXdWYWx1ZSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgT2JqZWN0IGxlZnRTaGlmdChmaW5hbCBPYmplY3QgbmV3VmFsdWUpIHsKKyAgICAgICAgYXBwZW5kTm9kZShuZXdWYWx1ZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgT2JqZWN0IHBsdXMoZmluYWwgT2JqZWN0IG5ld1ZhbHVlKSB7CisgICAgICAgIHRoaXMucmVwbGFjZU5vZGUobmV3IENsb3N1cmUodGhpcykgeworICAgICAgICAgICAgcHVibGljIHZvaWQgZG9DYWxsKE9iamVjdFtdIGFyZ3MpIHsKKyAgICAgICAgICAgIGZpbmFsIEdyb292eU9iamVjdCBkZWxlZ2F0ZSA9IChHcm9vdnlPYmplY3QpZ2V0RGVsZWdhdGUoKTsKKyAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBkZWxlZ2F0ZS5nZXRQcm9wZXJ0eSgibWtwIik7CisgICAgICAgICAgICAgICAgZGVsZWdhdGUuaW52b2tlTWV0aG9kKCJ5aWVsZCIsIGFyZ3MpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGRlbGVnYXRlLmdldFByb3BlcnR5KCJta3AiKTsKKyAgICAgICAgICAgICAgICBkZWxlZ2F0ZS5pbnZva2VNZXRob2QoInlpZWxkIiwgbmV3IE9iamVjdFtde25ld1ZhbHVlfSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHJlcGxhY2VOb2RlKENsb3N1cmUgbmV3VmFsdWUpOworICAgIAorICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHJlcGxhY2VCb2R5KE9iamVjdCBuZXdWYWx1ZSk7CisgICAgCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYXBwZW5kTm9kZShPYmplY3QgbmV3VmFsdWUpOworCisgICAgcHVibGljIFN0cmluZyBuYW1lKCkgeworICAgICAgICByZXR1cm4gdGhpcy5uYW1lOworICAgIH0KKworICAgIHB1YmxpYyBHUGF0aFJlc3VsdCBwYXJlbnQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnBhcmVudDsKKyAgICB9CisKKyAgICBwdWJsaWMgR1BhdGhSZXN1bHQgY2hpbGRyZW4oKSB7CisgICAgICAgIHJldHVybiBuZXcgTm9kZUNoaWxkcmVuKHRoaXMsIHRoaXMubmFtZXNwYWNlVGFnSGludHMpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGxvb2t1cE5hbWVzcGFjZShmaW5hbCBTdHJpbmcgcHJlZml4KSB7CisgICAgICAgIHJldHVybiAoU3RyaW5nKXRoaXMubmFtZXNwYWNlVGFnSGludHMuZ2V0KHByZWZpeCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIHRleHQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSW50ZWdlciB0b0ludGVnZXIoKSB7CisgICAgICAgIHJldHVybiBEZWZhdWx0R3Jvb3Z5TWV0aG9kcy50b0ludGVnZXIodGV4dCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTG9uZyB0b0xvbmcoKSB7CisgICAgICAgIHJldHVybiBEZWZhdWx0R3Jvb3Z5TWV0aG9kcy50b0xvbmcodGV4dCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRmxvYXQgdG9GbG9hdCgpIHsKKyAgICAgICAgcmV0dXJuIERlZmF1bHRHcm9vdnlNZXRob2RzLnRvRmxvYXQodGV4dCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRG91YmxlIHRvRG91YmxlKCkgeworICAgICAgICByZXR1cm4gRGVmYXVsdEdyb292eU1ldGhvZHMudG9Eb3VibGUodGV4dCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQmlnRGVjaW1hbCB0b0JpZ0RlY2ltYWwoKSB7CisgICAgICAgIHJldHVybiBEZWZhdWx0R3Jvb3Z5TWV0aG9kcy50b0JpZ0RlY2ltYWwodGV4dCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQmlnSW50ZWdlciB0b0JpZ0ludGVnZXIoKSB7CisgICAgICAgIHJldHVybiBEZWZhdWx0R3Jvb3Z5TWV0aG9kcy50b0JpZ0ludGVnZXIodGV4dCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVVJMIHRvVVJMKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBEZWZhdWx0R3Jvb3Z5TWV0aG9kcy50b1VSTCh0ZXh0KCkpOworICAgIH0KKworICAgIHB1YmxpYyBVUkkgdG9VUkkoKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIERlZmF1bHRHcm9vdnlNZXRob2RzLnRvVVJJKHRleHQoKSk7CisgICAgfQorCisgICAgcHVibGljIEJvb2xlYW4gdG9Cb29sZWFuKCkgeworICAgICAgICByZXR1cm4gRGVmYXVsdEdyb292eU1ldGhvZHMudG9Cb29sZWFuKHRleHQoKSk7CisgICAgfQorCisgICAgcHVibGljIEdQYXRoUmVzdWx0IGRlY2xhcmVOYW1lc3BhY2UoZmluYWwgTWFwIG5ld05hbWVzcGFjZU1hcHBpbmcpIHsKKyAgICAgICAgdGhpcy5uYW1lc3BhY2VNYXAucHV0QWxsKG5ld05hbWVzcGFjZU1hcHBpbmcpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICByZXR1cm4gdGV4dCgpLmVxdWFscyhvYmoudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRBdChmaW5hbCBpbnQgaW5kZXgpIHsKKyAgICAgICAgaWYgKGluZGV4IDwgMCkgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihpbmRleCk7CisgICAgICAgIAorICAgICAgICBmaW5hbCBJdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKKyAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAKKyAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBpZiAoY291bnQrKyA9PSBpbmRleCkgeworICAgICAgICAgICAgICAgIHJldHVybiBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaXRlci5uZXh0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiBuZXcgTm9DaGlsZHJlbih0aGlzLCB0aGlzLm5hbWUsIHRoaXMubmFtZXNwYWNlVGFnSGludHMpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0QXQoZmluYWwgSW50UmFuZ2UgcmFuZ2UpIHsKKyAgICBmaW5hbCBpbnQgZnJvbSA9IHJhbmdlLmdldEZyb21JbnQoKTsKKyAgICBmaW5hbCBpbnQgdG8gPSByYW5nZS5nZXRUb0ludCgpOworICAgIAorICAgICAgICBpZiAocmFuZ2UuaXNSZXZlcnNlKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBHcm9vdnlSdW50aW1lRXhjZXB0aW9uKCJSZXZlcnNlIHJhbmdlcyBub3Qgc3VwcG9ydGVkLCByYW5nZSBzdXBwbGllZCBpcyBbIisgdG8gKyAiLi4iICsgZnJvbSArICJdIik7CisgICAgICAgIH0gZWxzZSBpZiAoZnJvbSA8IDAgfHwgdG8gPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbigiTmVnYXRpdmUgcmFuZ2UgaW5kZXhlcyBub3Qgc3VwcG9ydGVkLCByYW5nZSBzdXBwbGllZCBpcyBbIisgZnJvbSArICIuLiIgKyB0byArICJdIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCkgeworICAgICAgICAgICAgZmluYWwgSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7CisgICAgICAgICAgICBPYmplY3QgbmV4dDsKKyAgICAgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50IDw9IHRvKSB7CisgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50KysgPj0gZnJvbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dCA9IGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXh0OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfTsKKyAgICAgICAgfQorICAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwdXRBdChmaW5hbCBpbnQgaW5kZXgsIGZpbmFsIE9iamVjdCBuZXdWYWx1ZSkgeworICAgIGZpbmFsIEdQYXRoUmVzdWx0IHJlc3VsdCA9IChHUGF0aFJlc3VsdClnZXRBdChpbmRleCk7CisgICAgCisgICAgICAgIGlmIChuZXdWYWx1ZSBpbnN0YW5jZW9mIENsb3N1cmUpIHsKKyAgICAgICAgICAgIHJlc3VsdC5yZXBsYWNlTm9kZSgoQ2xvc3VyZSluZXdWYWx1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXN1bHQucmVwbGFjZUJvZHkobmV3VmFsdWUpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBJdGVyYXRvciBkZXB0aEZpcnN0KCkgeworICAgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCkgeworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0IGxpc3QgPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdGFjayBzdGFjayA9IG5ldyBTdGFjaygpOworICAgICAgICAgICAgcHJpdmF0ZSBJdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHByaXZhdGUgR1BhdGhSZXN1bHQgbmV4dCA9IGdldE5leHRCeURlcHRoKCk7CisKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubmV4dCAhPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubmV4dDsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHQgPSBnZXROZXh0QnlEZXB0aCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIEdQYXRoUmVzdWx0IGdldE5leHRCeURlcHRoKCkgeworICAgICAgICAgICAgICAgIHdoaWxlICh0aGlzLml0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIEdQYXRoUmVzdWx0IG5vZGUgPSAoR1BhdGhSZXN1bHQpIHRoaXMuaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMubGlzdC5hZGQobm9kZSk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaCh0aGlzLml0ZXIpOworICAgICAgICAgICAgICAgICAgICB0aGlzLml0ZXIgPSBub2RlLmNoaWxkcmVuKCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5saXN0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBHUGF0aFJlc3VsdCByZXN1bHQgPSAoR1BhdGhSZXN1bHQpIHRoaXMubGlzdC5nZXQoMCk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMubGlzdC5yZW1vdmUoMCk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuaXRlciA9IChJdGVyYXRvcikgdGhpcy5zdGFjay5wb3AoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgLyoqCisgICAgICogQW4gaXRlcmF0b3IgdXNlZnVsIGZvciB0cmF2ZXJzaW5nIFhNTCBkb2N1bWVudHMvZnJhZ21lbnRzIGluIGJyZWFkdGgtZmlyc3Qgb3JkZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEl0ZXJhdG9yIHRoZSBpdGVyYXRvciBvZiBHUGF0aFJlc3VsdCBvYmplY3RzCisgICAgICovCisgICAgcHVibGljIEl0ZXJhdG9yIGJyZWFkdGhGaXJzdCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigpIHsKKyAgICAgICAgICAgIHByaXZhdGUgZmluYWwgTGlzdCBsaXN0ID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICAgICAgICAgIHByaXZhdGUgSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7CisgICAgICAgICAgICBwcml2YXRlIEdQYXRoUmVzdWx0IG5leHQgPSBnZXROZXh0QnlCcmVhZHRoKCk7CisKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubmV4dCAhPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubmV4dDsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHQgPSBnZXROZXh0QnlCcmVhZHRoKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaXZhdGUgR1BhdGhSZXN1bHQgZ2V0TmV4dEJ5QnJlYWR0aCgpIHsKKyAgICAgICAgICAgICAgICBMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgICAgIHdoaWxlICh0aGlzLml0ZXIuaGFzTmV4dCgpIHx8ICFjaGlsZHJlbi5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEdQYXRoUmVzdWx0IG5vZGUgPSAoR1BhdGhSZXN1bHQpIHRoaXMuaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxpc3QuYWRkKG5vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5saXN0LmFkZCh0aGlzLml0ZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4uYWRkKG5vZGUuY2hpbGRyZW4oKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMaXN0IG5leHRMZXZlbCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUGF0aFJlc3VsdCBuZXh0ID0gKEdQYXRoUmVzdWx0KSBjaGlsZHJlbi5nZXQoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBuZXh0Lml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0TGV2ZWwuYWRkKGl0ZXJhdG9yLm5leHQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pdGVyID0gbmV4dExldmVsLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodGhpcy5saXN0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBHUGF0aFJlc3VsdCByZXN1bHQgPSAoR1BhdGhSZXN1bHQpIHRoaXMubGlzdC5nZXQoMCk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMubGlzdC5yZW1vdmUoMCk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuaXRlciA9IChJdGVyYXRvcikgdGhpcy5saXN0LmdldCgwKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5saXN0LnJlbW92ZSgwKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgcHVibGljIExpc3QgbGlzdCgpIHsKKyAgICAgICAgZmluYWwgSXRlcmF0b3IgaXRlciA9IG5vZGVJdGVyYXRvcigpOworICAgICAgICBmaW5hbCBMaXN0IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0KCk7CisgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgcmVzdWx0LmFkZChuZXcgTm9kZUNoaWxkKChOb2RlKSBpdGVyLm5leHQoKSwgdGhpcy5wYXJlbnQsIHRoaXMubmFtZXNwYWNlUHJlZml4LCB0aGlzLm5hbWVzcGFjZVRhZ0hpbnRzKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgeworICAgICAgICByZXR1cm4gc2l6ZSgpID09IDA7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBDbG9zdXJlIGdldEJvZHkoKSB7CisgICAgICAgIHJldHVybiBuZXcgQ2xvc3VyZSh0aGlzLnBhcmVudCgpLHRoaXMpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGRvQ2FsbChPYmplY3RbXSBhcmdzKSB7CisgICAgICAgICAgICAgICAgZmluYWwgR3Jvb3Z5T2JqZWN0IGRlbGVnYXRlID0gKEdyb292eU9iamVjdClnZXREZWxlZ2F0ZSgpOworICAgICAgICAgICAgICAgIGZpbmFsIEdQYXRoUmVzdWx0IHRoaXNPYmplY3QgPSAoR1BhdGhSZXN1bHQpZ2V0VGhpc09iamVjdCgpOworCisgICAgICAgICAgICAgICAgTm9kZSBub2RlID0gKE5vZGUpdGhpc09iamVjdC5nZXRBdCgwKTsKKyAgICAgICAgICAgICAgICBMaXN0IGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbigpOworCisgICAgICAgICAgICAgICAgZm9yKGludCBpPTA7ICBpPGNoaWxkcmVuLnNpemUoKTsgaSsrKXsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNoaWxkID0gY2hpbGRyZW4uZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZS5nZXRQcm9wZXJ0eSgibWtwIik7CisgICAgICAgICAgICAgICAgICAgIGlmKGNoaWxkIGluc3RhbmNlb2YgTm9kZSl7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZS5pbnZva2VNZXRob2QoInlpZWxkIiwgbmV3IE9iamVjdFtde25ldyBOb2RlQ2hpbGQoKE5vZGUpY2hpbGQsIHRoaXNPYmplY3QsIioiLG51bGwpfSk7CisgICAgICAgICAgICAgICAgICAgIH0gICAKKyAgICAgICAgICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlLmludm9rZU1ldGhvZCgieWllbGQiLCBuZXcgT2JqZWN0W117Y2hpbGR9KTsKKyAgICAgICAgICAgICAgICAgICAgfSAgIAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgcHVibGljIGFic3RyYWN0IGludCBzaXplKCk7CisKKyAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIHRleHQoKTsKKworICAgIHB1YmxpYyBhYnN0cmFjdCBHUGF0aFJlc3VsdCBwYXJlbnRzKCk7CisKKyAgICBwdWJsaWMgYWJzdHJhY3QgSXRlcmF0b3IgY2hpbGROb2RlcygpOworCisgICAgcHVibGljIGFic3RyYWN0IEl0ZXJhdG9yIGl0ZXJhdG9yKCk7CisKKyAgICBwdWJsaWMgYWJzdHJhY3QgR1BhdGhSZXN1bHQgZmluZChDbG9zdXJlIGNsb3N1cmUpOworCisgICAgcHVibGljIGFic3RyYWN0IEdQYXRoUmVzdWx0IGZpbmRBbGwoQ2xvc3VyZSBjbG9zdXJlKTsKKworICAgIHB1YmxpYyBhYnN0cmFjdCBJdGVyYXRvciBub2RlSXRlcmF0b3IoKTsKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdXRpbC9zbHVycGVyc3VwcG9ydC9Ob0NoaWxkcmVuLmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvc2x1cnBlcnN1cHBvcnQvTm9DaGlsZHJlbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMGVjMjkKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvc2x1cnBlcnN1cHBvcnQvTm9DaGlsZHJlbi5qYXZhCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBncm9vdnkudXRpbC5zbHVycGVyc3VwcG9ydDsKKworaW1wb3J0IGdyb292eS5sYW5nLkNsb3N1cmU7CitpbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0OworaW1wb3J0IGdyb292eS5sYW5nLkdyb292eVJ1bnRpbWVFeGNlcHRpb247CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIEBhdXRob3IgSm9obiBXaWxzb24KKyAqCisgKi8KKworcHVibGljIGNsYXNzIE5vQ2hpbGRyZW4gZXh0ZW5kcyBHUGF0aFJlc3VsdCB7CisgIC8qKgorICAgKiBAcGFyYW0gcGFyZW50CisgICAqIEBwYXJhbSBuYW1lCisgICAqLworICBwdWJsaWMgTm9DaGlsZHJlbihmaW5hbCBHUGF0aFJlc3VsdCBwYXJlbnQsIGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBNYXAgbmFtZXNwYWNlVGFnSGludHMpIHsKKyAgICBzdXBlcihwYXJlbnQsIG5hbWUsICIqIiwgbmFtZXNwYWNlVGFnSGludHMpOworICB9CisKKyAgLyogKG5vbi1KYXZhZG9jKQorICAgKiBAc2VlIG9yZy5jb2RlaGF1cy5ncm9vdnkuc2FuZGJveC51dGlsLnNsdXJwZXJzdXBwb3J0LkdQYXRoUmVzdWx0I3NpemUoKQorICAgKi8KKyAgcHVibGljIGludCBzaXplKCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgLyogKG5vbi1KYXZhZG9jKQorICAgKiBAc2VlIG9yZy5jb2RlaGF1cy5ncm9vdnkuc2FuZGJveC51dGlsLnNsdXJwZXJzdXBwb3J0LkdQYXRoUmVzdWx0I3RleHQoKQorICAgKi8KKyAgcHVibGljIFN0cmluZyB0ZXh0KCkgeworICAgIHJldHVybiAiIjsKKyAgfQorCisgIC8qIChub24tSmF2YWRvYykKKyAgICogQHNlZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnNhbmRib3gudXRpbC5zbHVycGVyc3VwcG9ydC5HUGF0aFJlc3VsdCNwYXJlbnRzKCkKKyAgICovCisgIHB1YmxpYyBHUGF0aFJlc3VsdCBwYXJlbnRzKCkgeworICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKyAgICB0aHJvdyBuZXcgR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbigicGFyZW50cygpIG5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKKyAgfQorCisgIC8qIChub24tSmF2YWRvYykKKyAgICogQHNlZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnNhbmRib3gudXRpbC5zbHVycGVyc3VwcG9ydC5HUGF0aFJlc3VsdCNjaGlsZE5vZGVzKCkKKyAgICovCisgIHB1YmxpYyBJdGVyYXRvciBjaGlsZE5vZGVzKCkgeworICAgIHJldHVybiBpdGVyYXRvcigpOworICB9CisKKyAgLyogKG5vbi1KYXZhZG9jKQorICAgKiBAc2VlIG9yZy5jb2RlaGF1cy5ncm9vdnkuc2FuZGJveC51dGlsLnNsdXJwZXJzdXBwb3J0LkdQYXRoUmVzdWx0I2l0ZXJhdG9yKCkKKyAgICovCisgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKKyAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCkgeworICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgCisgICAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgICAgCisgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgfQorICAgIH07CisgIH0KKworICAvKiAobm9uLUphdmFkb2MpCisgICAqIEBzZWUgb3JnLmNvZGVoYXVzLmdyb292eS5zYW5kYm94LnV0aWwuc2x1cnBlcnN1cHBvcnQuR1BhdGhSZXN1bHQjZmluZChncm9vdnkubGFuZy5DbG9zdXJlKQorICAgKi8KKyAgcHVibGljIEdQYXRoUmVzdWx0IGZpbmQoZmluYWwgQ2xvc3VyZSBjbG9zdXJlKSB7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICAvKiAobm9uLUphdmFkb2MpCisgICAqIEBzZWUgb3JnLmNvZGVoYXVzLmdyb292eS5zYW5kYm94LnV0aWwuc2x1cnBlcnN1cHBvcnQuR1BhdGhSZXN1bHQjZmluZEFsbChncm9vdnkubGFuZy5DbG9zdXJlKQorICAgKi8KKyAgcHVibGljIEdQYXRoUmVzdWx0IGZpbmRBbGwoZmluYWwgQ2xvc3VyZSBjbG9zdXJlKSB7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICAvKiAobm9uLUphdmFkb2MpCisgICAqIEBzZWUgb3JnLmNvZGVoYXVzLmdyb292eS5zYW5kYm94LnV0aWwuc2x1cnBlcnN1cHBvcnQuR1BhdGhSZXN1bHQjbm9kZUl0ZXJhdG9yKCkKKyAgICovCisgIHB1YmxpYyBJdGVyYXRvciBub2RlSXRlcmF0b3IoKSB7CisgICAgcmV0dXJuIGl0ZXJhdG9yKCk7CisgIH0KKworICAvKiAobm9uLUphdmFkb2MpCisgICAqIEBzZWUgZ3Jvb3Z5LmxhbmcuV3JpdGFibGUjd3JpdGVUbyhqYXZhLmlvLldyaXRlcikKKyAgICovCisgIHB1YmxpYyBXcml0ZXIgd3JpdGVUbyhmaW5hbCBXcml0ZXIgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJldHVybiBvdXQ7CisgIH0KKworICAvKiAobm9uLUphdmFkb2MpCisgICAqIEBzZWUgb3JnLmNvZGVoYXVzLmdyb292eS5zYW5kYm94Lm1hcmt1cC5CdWlsZGFibGUjYnVpbGQoZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0KQorICAgKi8KKyAgcHVibGljIHZvaWQgYnVpbGQoZmluYWwgR3Jvb3Z5T2JqZWN0IGJ1aWxkZXIpIHsKKyAgfQorCisgIHByb3RlY3RlZCB2b2lkIHJlcGxhY2VOb2RlKGZpbmFsIENsb3N1cmUgbmV3VmFsdWUpIHsKKyAgICAvLyBObyBlbGVtZW50cyBtYXRjaCBHUGF0aCBleHByZXNzaW9uIC0gZG8gbm90aGluZworICB9CisKKyAgcHJvdGVjdGVkIHZvaWQgcmVwbGFjZUJvZHkoZmluYWwgT2JqZWN0IG5ld1ZhbHVlKSB7CisgICAgLy8gTm8gZWxlbWVudHMgbWF0Y2ggR1BhdGggZXhwcmVzc2lvbiAtIGRvIG5vdGhpbmcgICAKKyAgfQorCisgIHByb3RlY3RlZCB2b2lkIGFwcGVuZE5vZGUoZmluYWwgT2JqZWN0IG5ld1ZhbHVlKSB7CisgICAgLy8gVE9ETyBjb25zaWRlciBjcmVhdGluZyBhbiBlbGVtZW50IGZvciB0aGlzCisgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdXRpbC9zbHVycGVyc3VwcG9ydC9Ob2RlLmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvc2x1cnBlcnN1cHBvcnQvTm9kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2YzM5MjUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvc2x1cnBlcnN1cHBvcnQvTm9kZS5qYXZhCkBAIC0wLDAgKzEsMzE3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBncm9vdnkudXRpbC5zbHVycGVyc3VwcG9ydDsKKworaW1wb3J0IGdyb292eS5sYW5nLkJ1aWxkYWJsZTsKK2ltcG9ydCBncm9vdnkubGFuZy5DbG9zdXJlOworaW1wb3J0IGdyb292eS5sYW5nLkdyb292eU9iamVjdDsKK2ltcG9ydCBncm9vdnkubGFuZy5Xcml0YWJsZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlN0YWNrOworCisKKy8qKgorICogQGF1dGhvciBKb2huIFdpbHNvbgorICoKKyAqLworCitwdWJsaWMgY2xhc3MgTm9kZSBpbXBsZW1lbnRzIFdyaXRhYmxlIHsKKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKyAgcHJpdmF0ZSBmaW5hbCBNYXAgYXR0cmlidXRlczsKKyAgcHJpdmF0ZSBmaW5hbCBNYXAgYXR0cmlidXRlTmFtZXNwYWNlczsKKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZXNwYWNlVVJJOworICBwcml2YXRlIGZpbmFsIExpc3QgY2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdCgpOworICBwcml2YXRlIGZpbmFsIFN0YWNrIHJlcGxhY2VtZW50Tm9kZVN0YWNrID0gbmV3IFN0YWNrKCk7CisgIAorICBwdWJsaWMgTm9kZShmaW5hbCBOb2RlIHBhcmVudCwgZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIE1hcCBhdHRyaWJ1dGVzLCBmaW5hbCBNYXAgYXR0cmlidXRlTmFtZXNwYWNlcywgZmluYWwgU3RyaW5nIG5hbWVzcGFjZVVSSSkgeworICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgdGhpcy5hdHRyaWJ1dGVzID0gYXR0cmlidXRlczsKKyAgICB0aGlzLmF0dHJpYnV0ZU5hbWVzcGFjZXMgPSBhdHRyaWJ1dGVOYW1lc3BhY2VzOworICAgIHRoaXMubmFtZXNwYWNlVVJJID0gbmFtZXNwYWNlVVJJOworICB9CisgIAorICBwdWJsaWMgU3RyaW5nIG5hbWUoKSB7CisgICAgcmV0dXJuIHRoaXMubmFtZTsKKyAgfQorICAKKyAgcHVibGljIFN0cmluZyBuYW1lc3BhY2VVUkkoKSB7CisgICAgcmV0dXJuIHRoaXMubmFtZXNwYWNlVVJJOworICB9CisgIAorICBwdWJsaWMgTWFwIGF0dHJpYnV0ZXMoKSB7CisgICAgcmV0dXJuIHRoaXMuYXR0cmlidXRlczsKKyAgfQorCisgIHB1YmxpYyBMaXN0IGNoaWxkcmVuKCkgeworICAgIHJldHVybiB0aGlzLmNoaWxkcmVuOworICB9CisKKyAgcHVibGljIHZvaWQgYWRkQ2hpbGQoZmluYWwgT2JqZWN0IGNoaWxkKSB7CisgICAgdGhpcy5jaGlsZHJlbi5hZGQoY2hpbGQpOworICB9CisgIAorICBwdWJsaWMgdm9pZCByZXBsYWNlTm9kZShmaW5hbCBDbG9zdXJlIHJlcGxhY2VtZW50Q2xvc3VyZSwgZmluYWwgR1BhdGhSZXN1bHQgcmVzdWx0KSB7CisgICAgICB0aGlzLnJlcGxhY2VtZW50Tm9kZVN0YWNrLnB1c2gobmV3IFJlcGxhY2VtZW50Tm9kZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGJ1aWxkKGZpbmFsIEdyb292eU9iamVjdCBidWlsZGVyLCBmaW5hbCBNYXAgbmFtZXNwYWNlTWFwLCBmaW5hbCBNYXAgbmFtZXNwYWNlVGFnSGludHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbG9zdXJlIGMgPSAoQ2xvc3VyZSlyZXBsYWNlbWVudENsb3N1cmUuY2xvbmUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZS50aGlzLnJlcGxhY2VtZW50Tm9kZVN0YWNrLnBvcCgpOyAvLyBkaXNhYmxlIHRoZSByZXBsYWNlbWVudCB3aGlsc3QgdGhlIGNsb3N1cmUgaXMgYmVpbmcgZXhlY3V0ZWQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuc2V0RGVsZWdhdGUoYnVpbGRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuY2FsbChuZXcgT2JqZWN0W117cmVzdWx0fSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUudGhpcy5yZXBsYWNlbWVudE5vZGVTdGFjay5wdXNoKHRoaXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICB9CisgIAorCisgIHByb3RlY3RlZCB2b2lkIHJlcGxhY2VCb2R5KGZpbmFsIE9iamVjdCBuZXdWYWx1ZSkgeworICAgICAgdGhpcy5jaGlsZHJlbi5jbGVhcigpOworICAgICAgdGhpcy5jaGlsZHJlbi5hZGQobmV3VmFsdWUpOworICB9CisKKyAgcHJvdGVjdGVkIHZvaWQgYXBwZW5kTm9kZShmaW5hbCBPYmplY3QgbmV3VmFsdWUsIGZpbmFsIEdQYXRoUmVzdWx0IHJlc3VsdCkgeworICAgICAgaWYgKG5ld1ZhbHVlIGluc3RhbmNlb2YgQ2xvc3VyZSkgeworICAgICAgICAgIHRoaXMuY2hpbGRyZW4uYWRkKG5ldyBSZXBsYWNlbWVudE5vZGUoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBidWlsZChmaW5hbCBHcm9vdnlPYmplY3QgYnVpbGRlciwgZmluYWwgTWFwIG5hbWVzcGFjZU1hcCwgZmluYWwgTWFwIG5hbWVzcGFjZVRhZ0hpbnRzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xvc3VyZSBjID0gKENsb3N1cmUpKChDbG9zdXJlKW5ld1ZhbHVlKS5jbG9uZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLnNldERlbGVnYXRlKGJ1aWxkZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmNhbGwobmV3IE9iamVjdFtde3Jlc3VsdH0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aGlzLmNoaWxkcmVuLmFkZChuZXdWYWx1ZSk7CisgICAgICB9CisgIH0KKworICAvKiAobm9uLUphdmFkb2MpCisgICAqIEBzZWUgb3JnLmNvZGVoYXVzLmdyb292eS5zYW5kYm94LnV0aWwuc2x1cnBlcnN1cHBvcnQuTm9kZSN0ZXh0KCkKKyAgICovCisgIHB1YmxpYyBTdHJpbmcgdGV4dCgpIHsKKyAgZmluYWwgU3RyaW5nQnVmZmVyIGJ1ZmYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgIGZpbmFsIEl0ZXJhdG9yIGl0ZXIgPSB0aGlzLmNoaWxkcmVuLml0ZXJhdG9yKCk7CisgIAorICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgIGZpbmFsIE9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOworICAgIAorICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBOb2RlKSB7CisgICAgICAgICAgICBidWZmLmFwcGVuZCgoKE5vZGUpY2hpbGQpLnRleHQoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBidWZmLmFwcGVuZChjaGlsZCk7CisgICAgICAgIH0KKyAgICB9CisgIAorICAgIHJldHVybiBidWZmLnRvU3RyaW5nKCk7CisgIH0KKworICAvKiAobm9uLUphdmFkb2MpCisgICAqIEBzZWUgb3JnLmNvZGVoYXVzLmdyb292eS5zYW5kYm94LnV0aWwuc2x1cnBlcnN1cHBvcnQuTm9kZSNjaGlsZE5vZGVzKCkKKyAgICovCisgIAorICBwdWJsaWMgSXRlcmF0b3IgY2hpbGROb2RlcygpIHsKKyAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCkgeworICAgICAgcHJpdmF0ZSBmaW5hbCBJdGVyYXRvciBpdGVyID0gTm9kZS50aGlzLmNoaWxkcmVuLml0ZXJhdG9yKCk7CisgICAgICBwcml2YXRlIE9iamVjdCBuZXh0RWxlbWVudE5vZGVzID0gZ2V0TmV4dEVsZW1lbnROb2RlcygpOworICAgICAgCisgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworICAgICAgICByZXR1cm4gdGhpcy5uZXh0RWxlbWVudE5vZGVzICE9IG51bGw7CisgICAgICB9CisgICAgICAKKyAgICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICByZXR1cm4gdGhpcy5uZXh0RWxlbWVudE5vZGVzOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgIHRoaXMubmV4dEVsZW1lbnROb2RlcyA9IGdldE5leHRFbGVtZW50Tm9kZXMoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgCisgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgfQorCisgICAgICBwcml2YXRlIE9iamVjdCBnZXROZXh0RWxlbWVudE5vZGVzKCkgeworICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgZmluYWwgT2JqZWN0IG5vZGUgPSBpdGVyLm5leHQoKTsKKyAgICAgICAgCisgICAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBOb2RlKSB7CisgICAgICAgICAgICByZXR1cm4gbm9kZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgIH07CisgIH0KKworICAvKiAobm9uLUphdmFkb2MpCisgICAqIEBzZWUgb3JnLmNvZGVoYXVzLmdyb292eS5zYW5kYm94LnV0aWwuc2x1cnBlcnN1cHBvcnQuTm9kZSN3cml0ZVRvKGphdmEuaW8uV3JpdGVyKQorICAgKi8KKyAgcHVibGljIFdyaXRlciB3cml0ZVRvKGZpbmFsIFdyaXRlciBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICBpZiAodGhpcy5yZXBsYWNlbWVudE5vZGVTdGFjay5lbXB0eSgpKSB7CisgICAgICBmaW5hbCBJdGVyYXRvciBpdGVyID0gdGhpcy5jaGlsZHJlbi5pdGVyYXRvcigpOworICAgICAgCisgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICBmaW5hbCBPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKKyAgICAgICAgCisgICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgV3JpdGFibGUpIHsKKyAgICAgICAgICAgICgoV3JpdGFibGUpY2hpbGQpLndyaXRlVG8ob3V0KTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3V0LndyaXRlKGNoaWxkLnRvU3RyaW5nKCkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIG91dDsKKyAgICAgICAgCisgICAgICB9IGVsc2UgeworICAgICAgICAgcmV0dXJuICgoV3JpdGFibGUpdGhpcy5yZXBsYWNlbWVudE5vZGVTdGFjay5wZWVrKCkpLndyaXRlVG8ob3V0KTsgCisgICAgICB9CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIGJ1aWxkKGZpbmFsIEdyb292eU9iamVjdCBidWlsZGVyLCBmaW5hbCBNYXAgbmFtZXNwYWNlTWFwLCBmaW5hbCBNYXAgbmFtZXNwYWNlVGFnSGludHMpIHsKKyAgICAgIGlmICh0aGlzLnJlcGxhY2VtZW50Tm9kZVN0YWNrLmVtcHR5KCkpIHsKKyAgICAgIGZpbmFsIENsb3N1cmUgcmVzdCA9IG5ldyBDbG9zdXJlKG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgZG9DYWxsKGZpbmFsIE9iamVjdCBvKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkQ2hpbGRyZW4oYnVpbGRlciwgbmFtZXNwYWNlTWFwLCBuYW1lc3BhY2VUYWdIaW50cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAKKyAgICAgICAgaWYgKHRoaXMubmFtZXNwYWNlVVJJLmxlbmd0aCgpID09IDAgJiYgdGhpcy5hdHRyaWJ1dGVOYW1lc3BhY2VzLmlzRW1wdHkoKSkgeworICAgICAgICAgIGJ1aWxkZXIuaW52b2tlTWV0aG9kKHRoaXMubmFtZSwgbmV3IE9iamVjdFtde3RoaXMuYXR0cmlidXRlcywgcmVzdH0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZpbmFsIExpc3QgbmV3VGFncyA9IG5ldyBMaW5rZWRMaXN0KCk7CisgICAgICAgICAgYnVpbGRlci5nZXRQcm9wZXJ0eSgibWtwIik7CisgICAgICAgICAgZmluYWwgTGlzdCBuYW1lc3BhY2VzID0gKExpc3QpYnVpbGRlci5pbnZva2VNZXRob2QoImdldE5hbWVzcGFjZXMiLCBuZXcgT2JqZWN0W117fSk7CisgICAgICAgICAgCisgICAgICAgICAgZmluYWwgTWFwIGN1cnJlbnQgPSAoTWFwKW5hbWVzcGFjZXMuZ2V0KDApOworICAgICAgICAgIGZpbmFsIE1hcCBwZW5kaW5nID0gKE1hcCluYW1lc3BhY2VzLmdldCgxKTsKKyAgICAgICAgICAKKyAgICAgICAgICBpZiAodGhpcy5hdHRyaWJ1dGVOYW1lc3BhY2VzLmlzRW1wdHkoKSkgeyAgICAgCisgICAgICAgICAgICBidWlsZGVyLmdldFByb3BlcnR5KGdldFRhZ0Zvcih0aGlzLm5hbWVzcGFjZVVSSSwgY3VycmVudCwgcGVuZGluZywgbmFtZXNwYWNlTWFwLCBuYW1lc3BhY2VUYWdIaW50cywgbmV3VGFncywgYnVpbGRlcikpOworICAgICAgICAgICAgYnVpbGRlci5pbnZva2VNZXRob2QodGhpcy5uYW1lLCBuZXcgT2JqZWN0W117dGhpcy5hdHRyaWJ1dGVzLCByZXN0fSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmaW5hbCBNYXAgYXR0cmlidXRlc1dpdGhOYW1lc3BhY2VzID0gbmV3IEhhc2hNYXAodGhpcy5hdHRyaWJ1dGVzKTsKKyAgICAgICAgICBmaW5hbCBJdGVyYXRvciBhdHRycyA9IHRoaXMuYXR0cmlidXRlcy5rZXlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICAgICAgCisgICAgICAgICAgICB3aGlsZSAoYXR0cnMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBmaW5hbCBPYmplY3Qga2V5ID0gYXR0cnMubmV4dCgpOworICAgICAgICAgICAgZmluYWwgT2JqZWN0IGF0dHJpYnV0ZU5hbWVzcGFjZVVSSSA9IHRoaXMuYXR0cmlidXRlTmFtZXNwYWNlcy5nZXQoa2V5KTsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVOYW1lc3BhY2VVUkkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNXaXRoTmFtZXNwYWNlcy5wdXQoZ2V0VGFnRm9yKGF0dHJpYnV0ZU5hbWVzcGFjZVVSSSwgY3VycmVudCwgcGVuZGluZywgbmFtZXNwYWNlTWFwLCBuYW1lc3BhY2VUYWdIaW50cywgbmV3VGFncywgYnVpbGRlcikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiQiICsga2V5LCBhdHRyaWJ1dGVzV2l0aE5hbWVzcGFjZXMucmVtb3ZlKGtleSkpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGJ1aWxkZXIuZ2V0UHJvcGVydHkoZ2V0VGFnRm9yKHRoaXMubmFtZXNwYWNlVVJJLCBjdXJyZW50LCBwZW5kaW5nLCBuYW1lc3BhY2VNYXAsbmFtZXNwYWNlVGFnSGludHMsICBuZXdUYWdzLCBidWlsZGVyKSk7CisgICAgICAgICAgICBidWlsZGVyLmludm9rZU1ldGhvZCh0aGlzLm5hbWUsIG5ldyBPYmplY3RbXXthdHRyaWJ1dGVzV2l0aE5hbWVzcGFjZXMsIHJlc3R9KTsKKyAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgLy8gcmVtb3ZlIHRoZSBuZXcgdGFncyB3ZSBoYWQgdG8gZGVmaW5lIGZvciB0aGlzIGVsZW1lbnQKKyAgICAgICAgICBpZiAoIW5ld1RhZ3MuaXNFbXB0eSgpKSB7CisgICAgICAgICAgZmluYWwgSXRlcmF0b3IgaXRlciA9IG5ld1RhZ3MuaXRlcmF0b3IoKTsKKyAgICAgICAgICAKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgcGVuZGluZy5yZW1vdmUoaXRlci5uZXh0KCkpOworICAgICAgICAgICAgfSB3aGlsZSAoaXRlci5oYXNOZXh0KCkpOworICAgICAgICAgIH0gIAorICAgICAgICB9ICAgCisgICAgICB9IGVsc2UgeworICAgICAgICAgICgoUmVwbGFjZW1lbnROb2RlKXRoaXMucmVwbGFjZW1lbnROb2RlU3RhY2sucGVlaygpKS5idWlsZChidWlsZGVyLCBuYW1lc3BhY2VNYXAsIG5hbWVzcGFjZVRhZ0hpbnRzKTsKKyAgICAgIH0KKyAgfQorICAKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFRhZ0ZvcihmaW5hbCBPYmplY3QgbmFtZXNwYWNlVVJJLCBmaW5hbCBNYXAgY3VycmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNYXAgcGVuZGluZywgZmluYWwgTWFwIGxvY2FsLCBmaW5hbCBNYXAgdGFnSGludHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdCBuZXdUYWdzLCBmaW5hbCBHcm9vdnlPYmplY3QgYnVpbGRlcikgeworICBTdHJpbmcgdGFnID0gZmluZE5hbWVzcGFjZVRhZyhwZW5kaW5nLCBuYW1lc3BhY2VVUkkpOyAvLyBsb29rIGluIHRoZSBuYW1lc3BhY2VzIHdob3NlIGRlY2xhcmF0aW9uIGhhcyBhbHJlYWR5IGJlZW4gZW1pdHRlZAorICAgIAorICAgIGlmICh0YWcgPT0gbnVsbCkgeworICAgICAgdGFnID0gZmluZE5hbWVzcGFjZVRhZyhjdXJyZW50LCBuYW1lc3BhY2VVUkkpOyAgLy8gbG9vayBpbiB0aGUgbmFtZXNwYWNlcyB3aG8gd2lsbCBiZSBkZWNsYXJlZCBhdCB0aGUgbmV4dCBlbGVtZW50CisgICAgICAKKyAgICAgIGlmICh0YWcgPT0gbnVsbCkgeworICAgICAgICAvLyB3ZSBoYXZlIHRvIGRlY2xhcmUgdGhlIG5hbWVzcGFjZSAtIGNob29zZSBhIHRhZworICAgICAgICB0YWcgPSBmaW5kTmFtZXNwYWNlVGFnKGxvY2FsLCBuYW1lc3BhY2VVUkkpOyAgLy8gSWYgdGhlIG5hbWVzcGFjZSBoYXMgYmVlbiBkZWNhcmVkIGluIHRoZSBHUGF0aCBleHByZXNzaW9uIHVzZSB0aGF0IHRhZworICAgICAgICAKKyAgICAgICAgaWYgKHRhZyA9PSBudWxsIHx8IHRhZy5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgdGFnID0gZmluZE5hbWVzcGFjZVRhZyh0YWdIaW50cywgbmFtZXNwYWNlVVJJKTsgIC8vIElmIHRoZSBuYW1lc3BhY2UgaGFzIGJlZW4gdXNlZCBpbiB0aGUgcGFyc2UgZG9jdW1hbnQgdXNlIHRoYXQgdGFnICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmICh0YWcgPT0gbnVsbCB8fCB0YWcubGVuZ3RoKCkgPT0gMCkgeyAvLyBvdGhlcndpc2UgbWFrZSB1cCBhIG5ldyB0YWcgYW5kIGNoZWNrIGl0IGhhcyBub3QgYmVlbiB1c2VkIGJlZm9yZQorICAgICAgICBpbnQgc3VmZml4ID0gMDsKKyAgICAgICAgCisgICAgICAgICAgZG8geworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBvc2libGVUYWcgPSAidGFnIiArIHN1ZmZpeCsrOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoIXBlbmRpbmcuY29udGFpbnNLZXkocG9zaWJsZVRhZykgJiYgIWN1cnJlbnQuY29udGFpbnNLZXkocG9zaWJsZVRhZykgJiYgIWxvY2FsLmNvbnRhaW5zS2V5KHBvc2libGVUYWcpKSB7CisgICAgICAgICAgICAgIHRhZyA9IHBvc2libGVUYWc7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSB3aGlsZSAodGFnID09IG51bGwpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBmaW5hbCBNYXAgbmV3TmFtZXNwYWNlID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgbmV3TmFtZXNwYWNlLnB1dCh0YWcsIG5hbWVzcGFjZVVSSSk7CisgICAgICAgIGJ1aWxkZXIuZ2V0UHJvcGVydHkoIm1rcCIpOworICAgICAgICBidWlsZGVyLmludm9rZU1ldGhvZCgiZGVjbGFyZU5hbWVzcGFjZSIsIG5ldyBPYmplY3RbXXtuZXdOYW1lc3BhY2V9KTsKKyAgICAgICAgbmV3VGFncy5hZGQodGFnKTsKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgcmV0dXJuIHRhZzsKKyAgfQorICAKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZpbmROYW1lc3BhY2VUYWcoZmluYWwgTWFwIHRhZ01hcCwgZmluYWwgT2JqZWN0IG5hbWVzcGFjZVVSSSkgeworICAgIGlmICh0YWdNYXAuY29udGFpbnNWYWx1ZShuYW1lc3BhY2VVUkkpKSB7CisgICAgZmluYWwgSXRlcmF0b3IgZW50cmllcyA9IHRhZ01hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CisgICAgICAKKyAgICAgIHdoaWxlIChlbnRyaWVzLmhhc05leHQoKSkgeworICAgICAgICBmaW5hbCBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KWVudHJpZXMubmV4dCgpOworICAgICAgICAKKyAgICAgICAgaWYgKG5hbWVzcGFjZVVSSS5lcXVhbHMoZW50cnkuZ2V0VmFsdWUoKSkpIHsKKyAgICAgICAgICByZXR1cm4gKFN0cmluZyllbnRyeS5nZXRLZXkoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICAKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorICAKKyAgcHJpdmF0ZSB2b2lkIGJ1aWxkQ2hpbGRyZW4oZmluYWwgR3Jvb3Z5T2JqZWN0IGJ1aWxkZXIsIGZpbmFsIE1hcCBuYW1lc3BhY2VNYXAsIGZpbmFsIE1hcCBuYW1lc3BhY2VUYWdIaW50cykgeworICBmaW5hbCBJdGVyYXRvciBpdGVyID0gdGhpcy5jaGlsZHJlbi5pdGVyYXRvcigpOworICAKKyAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICBmaW5hbCBPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKKyAgICAKKyAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIE5vZGUpIHsKKyAgICAgICAgKChOb2RlKWNoaWxkKS5idWlsZChidWlsZGVyLCBuYW1lc3BhY2VNYXAsIG5hbWVzcGFjZVRhZ0hpbnRzKTsKKyAgICAgIH0gZWxzZSBpZiAoY2hpbGQgaW5zdGFuY2VvZiBCdWlsZGFibGUpIHsKKyAgICAgICAgKChCdWlsZGFibGUpY2hpbGQpLmJ1aWxkKGJ1aWxkZXIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYnVpbGRlci5nZXRQcm9wZXJ0eSgibWtwIik7CisgICAgICAgIGJ1aWxkZXIuaW52b2tlTWV0aG9kKCJ5aWVsZCIsIG5ldyBPYmplY3RbXXtjaGlsZH0pOworICAgICAgfQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91dGlsL3NsdXJwZXJzdXBwb3J0L05vZGVDaGlsZC5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91dGlsL3NsdXJwZXJzdXBwb3J0L05vZGVDaGlsZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExY2NjM2UKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvc2x1cnBlcnN1cHBvcnQvTm9kZUNoaWxkLmphdmEKQEAgLTAsMCArMSwxNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGdyb292eS51dGlsLnNsdXJwZXJzdXBwb3J0OworCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuQ2xvc3VyZTsKK2ltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlPYmplY3Q7CitpbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUudHlwZWhhbmRsaW5nLkRlZmF1bHRUeXBlVHJhbnNmb3JtYXRpb247CisKKy8qKgorICogQGF1dGhvciBKb2huIFdpbHNvbgorICovCisKK3B1YmxpYyBjbGFzcyBOb2RlQ2hpbGQgZXh0ZW5kcyBHUGF0aFJlc3VsdCB7CisgICAgcHJpdmF0ZSBmaW5hbCBOb2RlIG5vZGU7CisKKyAgICBwdWJsaWMgTm9kZUNoaWxkKGZpbmFsIE5vZGUgbm9kZSwgZmluYWwgR1BhdGhSZXN1bHQgcGFyZW50LCBmaW5hbCBTdHJpbmcgbmFtZXNwYWNlUHJlZml4LCBmaW5hbCBNYXAgbmFtZXNwYWNlVGFnSGludHMpIHsKKyAgICAgICAgc3VwZXIocGFyZW50LCBub2RlLm5hbWUoKSwgbmFtZXNwYWNlUHJlZml4LCBuYW1lc3BhY2VUYWdIaW50cyk7CisgICAgICAgIHRoaXMubm9kZSA9IG5vZGU7CisgICAgfQorCisgICAgcHVibGljIE5vZGVDaGlsZChmaW5hbCBOb2RlIG5vZGUsIGZpbmFsIEdQYXRoUmVzdWx0IHBhcmVudCwgZmluYWwgTWFwIG5hbWVzcGFjZVRhZ0hpbnRzKSB7CisgICAgICAgIHRoaXMobm9kZSwgcGFyZW50LCAiKiIsIG5hbWVzcGFjZVRhZ0hpbnRzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubm9kZS50ZXh0KCk7CisgICAgfQorCisgICAgcHVibGljIEdQYXRoUmVzdWx0IHBhcmVudHMoKSB7CisgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKyAgICAgICAgdGhyb3cgbmV3IEdyb292eVJ1bnRpbWVFeGNlcHRpb24oInBhcmVudHMoKSBub3QgaW1wbGVtZW50ZWQgeWV0Iik7CisgICAgfQorCisgICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgeworICAgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCkgeworICAgICAgICAgICAgcHJpdmF0ZSBib29sZWFuIGhhc05leHQgPSB0cnVlOworCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmhhc05leHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHRoaXMuaGFzTmV4dCkgPyBOb2RlQ2hpbGQudGhpcyA6IG51bGw7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5oYXNOZXh0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgcHVibGljIEl0ZXJhdG9yIG5vZGVJdGVyYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigpIHsKKyAgICAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBoYXNOZXh0ID0gdHJ1ZTsKKworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5oYXNOZXh0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLmhhc05leHQpID8gTm9kZUNoaWxkLnRoaXMubm9kZSA6IG51bGw7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5oYXNOZXh0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRBdChmaW5hbCBpbnQgaW5kZXgpIHsKKyAgICAgICAgaWYgKGluZGV4ID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihpbmRleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgTWFwIGF0dHJpYnV0ZXMoKSB7CisgICAgICAgIHJldHVybiB0aGlzLm5vZGUuYXR0cmlidXRlcygpOworICAgIH0KKworICAgIHB1YmxpYyBJdGVyYXRvciBjaGlsZE5vZGVzKCkgeworICAgICAgICByZXR1cm4gdGhpcy5ub2RlLmNoaWxkTm9kZXMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgR1BhdGhSZXN1bHQgZmluZChmaW5hbCBDbG9zdXJlIGNsb3N1cmUpIHsKKyAgICAgICAgaWYgKERlZmF1bHRUeXBlVHJhbnNmb3JtYXRpb24uY2FzdFRvQm9vbGVhbihjbG9zdXJlLmNhbGwobmV3IE9iamVjdFtde3RoaXMubm9kZX0pKSkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE5vQ2hpbGRyZW4odGhpcywgIiIsIHRoaXMubmFtZXNwYWNlVGFnSGludHMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIEdQYXRoUmVzdWx0IGZpbmRBbGwoZmluYWwgQ2xvc3VyZSBjbG9zdXJlKSB7CisgICAgICAgIHJldHVybiBmaW5kKGNsb3N1cmUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGJ1aWxkKGZpbmFsIEdyb292eU9iamVjdCBidWlsZGVyKSB7CisgICAgICAgIHRoaXMubm9kZS5idWlsZChidWlsZGVyLCB0aGlzLm5hbWVzcGFjZU1hcCwgdGhpcy5uYW1lc3BhY2VUYWdIaW50cyk7CisgICAgfQorCisgICAgcHVibGljIFdyaXRlciB3cml0ZVRvKGZpbmFsIFdyaXRlciBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiB0aGlzLm5vZGUud3JpdGVUbyhvdXQpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHJlcGxhY2VOb2RlKGZpbmFsIENsb3N1cmUgbmV3VmFsdWUpIHsKKyAgICAgICAgdGhpcy5ub2RlLnJlcGxhY2VOb2RlKG5ld1ZhbHVlLCB0aGlzKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCByZXBsYWNlQm9keShmaW5hbCBPYmplY3QgbmV3VmFsdWUpIHsKKyAgICAgICAgdGhpcy5ub2RlLnJlcGxhY2VCb2R5KG5ld1ZhbHVlKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhcHBlbmROb2RlKGZpbmFsIE9iamVjdCBuZXdWYWx1ZSkgeworICAgICAgICB0aGlzLm5vZGUuYXBwZW5kTm9kZShuZXdWYWx1ZSwgdGhpcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91dGlsL3NsdXJwZXJzdXBwb3J0L05vZGVDaGlsZHJlbi5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91dGlsL3NsdXJwZXJzdXBwb3J0L05vZGVDaGlsZHJlbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ZGE2NWIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvc2x1cnBlcnN1cHBvcnQvTm9kZUNoaWxkcmVuLmphdmEKQEAgLTAsMCArMSwyNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGdyb292eS51dGlsLnNsdXJwZXJzdXBwb3J0OworCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuQnVpbGRhYmxlOworaW1wb3J0IGdyb292eS5sYW5nLkNsb3N1cmU7CitpbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0OworaW1wb3J0IGdyb292eS5sYW5nLkdyb292eVJ1bnRpbWVFeGNlcHRpb247CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLnR5cGVoYW5kbGluZy5EZWZhdWx0VHlwZVRyYW5zZm9ybWF0aW9uOworCisvKioKKyAqIEBhdXRob3IgSm9obiBXaWxzb24KKyAqLworCitjbGFzcyBOb2RlQ2hpbGRyZW4gZXh0ZW5kcyBHUGF0aFJlc3VsdCB7CisgICAgcHJpdmF0ZSBpbnQgc2l6ZSA9IC0xOworCisgICAgLyoqCisgICAgICogQHBhcmFtIHBhcmVudAorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogQHBhcmFtIG5hbWVzcGFjZVByZWZpeAorICAgICAqIEBwYXJhbSBuYW1lc3BhY2VUYWdIaW50cworICAgICAqLworICAgIHB1YmxpYyBOb2RlQ2hpbGRyZW4oZmluYWwgR1BhdGhSZXN1bHQgcGFyZW50LCBmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIG5hbWVzcGFjZVByZWZpeCwgZmluYWwgTWFwIG5hbWVzcGFjZVRhZ0hpbnRzKSB7CisgICAgICAgIHN1cGVyKHBhcmVudCwgbmFtZSwgbmFtZXNwYWNlUHJlZml4LCBuYW1lc3BhY2VUYWdIaW50cyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHBhcmVudAorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogQHBhcmFtIG5hbWVzcGFjZVRhZ0hpbnRzCisgICAgICovCisgICAgcHVibGljIE5vZGVDaGlsZHJlbihmaW5hbCBHUGF0aFJlc3VsdCBwYXJlbnQsIGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBNYXAgbmFtZXNwYWNlVGFnSGludHMpIHsKKyAgICAgICAgdGhpcyhwYXJlbnQsIG5hbWUsICIqIiwgbmFtZXNwYWNlVGFnSGludHMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBwYXJlbnQKKyAgICAgKiBAcGFyYW0gbmFtZXNwYWNlVGFnSGludHMKKyAgICAgKi8KKyAgICBwdWJsaWMgTm9kZUNoaWxkcmVuKGZpbmFsIEdQYXRoUmVzdWx0IHBhcmVudCwgZmluYWwgTWFwIG5hbWVzcGFjZVRhZ0hpbnRzKSB7CisgICAgICAgIHRoaXMocGFyZW50LCAiKiIsIG5hbWVzcGFjZVRhZ0hpbnRzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSXRlcmF0b3IgY2hpbGROb2RlcygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigpIHsKKyAgICAgICAgICAgIHByaXZhdGUgZmluYWwgSXRlcmF0b3IgaXRlciA9IHBhcmVudC5jaGlsZE5vZGVzKCk7CisgICAgICAgICAgICBwcml2YXRlIEl0ZXJhdG9yIGNoaWxkSXRlciA9IG5leHRDaGlsZEl0ZXIoKTsKKworICAgICAgICAgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAgICAgICAgKiBAc2VlIGphdmEudXRpbC5JdGVyYXRvciNoYXNOZXh0KCkKKyAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZEl0ZXIgIT0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAgICAgICAgKiBAc2VlIGphdmEudXRpbC5JdGVyYXRvciNuZXh0KCkKKyAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKGNoaWxkSXRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRJdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZEl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZEl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRJdGVyID0gbmV4dENoaWxkSXRlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICAgICAgICAqIEBzZWUgamF2YS51dGlsLkl0ZXJhdG9yI3JlbW92ZSgpCisgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIEl0ZXJhdG9yIG5leHRDaGlsZEl0ZXIoKSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIE5vZGUgbm9kZSA9IChOb2RlKSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKG5vZGUubmFtZSgpKSB8fCBuYW1lLmVxdWFscygiKiIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJdGVyYXRvciByZXN1bHQgPSBub2RlLmNoaWxkTm9kZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCIqIi5lcXVhbHMobmFtZXNwYWNlUHJlZml4KSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCIiLmVxdWFscyhuYW1lc3BhY2VQcmVmaXgpICYmICIiLmVxdWFscyhub2RlLm5hbWVzcGFjZVVSSSgpKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUubmFtZXNwYWNlVVJJKCkuZXF1YWxzKG5hbWVzcGFjZU1hcC5nZXQobmFtZXNwYWNlUHJlZml4KSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgeworICAgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCkgeworICAgICAgICAgICAgZmluYWwgSXRlcmF0b3IgaXRlciA9IG5vZGVJdGVyYXRvcigpOworCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworICAgICAgICAgICAgICAgIHJldHVybiBpdGVyLmhhc05leHQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIE9iamVjdCBuZXh0KCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTm9kZUNoaWxkKChOb2RlKSBpdGVyLm5leHQoKSwgcGFyZW50LCBuYW1lc3BhY2VUYWdIaW50cyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBwdWJsaWMgSXRlcmF0b3Igbm9kZUl0ZXJhdG9yKCkgeworICAgICAgICBpZiAoIioiLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuIHBhcmVudC5jaGlsZE5vZGVzKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE5vZGVJdGVyYXRvcihwYXJlbnQuY2hpbGROb2RlcygpKSB7CisgICAgICAgICAgICAgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAgICAgICAgICAgICogQHNlZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnNhbmRib3gudXRpbC5zbHVycGVyc3VwcG9ydC5Ob2RlSXRlcmF0b3IjZ2V0TmV4dE5vZGUoamF2YS51dGlsLkl0ZXJhdG9yKQorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBnZXROZXh0Tm9kZShJdGVyYXRvciBpdGVyKSB7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTm9kZSBub2RlID0gKE5vZGUpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKG5vZGUubmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgiKiIuZXF1YWxzKG5hbWVzcGFjZVByZWZpeCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiIi5lcXVhbHMobmFtZXNwYWNlUHJlZml4KSAmJiAiIi5lcXVhbHMobm9kZS5uYW1lc3BhY2VVUkkoKSkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLm5hbWVzcGFjZVVSSSgpLmVxdWFscyhuYW1lc3BhY2VNYXAuZ2V0KG5hbWVzcGFjZVByZWZpeCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIEdQYXRoUmVzdWx0IHBhcmVudHMoKSB7CisgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKyAgICAgICAgdGhyb3cgbmV3IEdyb292eVJ1bnRpbWVFeGNlcHRpb24oInBhcmVudHMoKSBub3QgaW1wbGVtZW50ZWQgeWV0Iik7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgc2l6ZSgpIHsKKyAgICAgICAgaWYgKHRoaXMuc2l6ZSA9PSAtMSkgeworICAgICAgICAgICAgZmluYWwgSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7CisgICAgICAgICAgICB0aGlzLnNpemUgPSAwOworICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgdGhpcy5zaXplKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXMuc2l6ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRleHQoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGZpbmFsIEl0ZXJhdG9yIGl0ZXIgPSBub2RlSXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCgoTm9kZSkgaXRlci5uZXh0KCkpLnRleHQoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBHUGF0aFJlc3VsdCBmaW5kKGZpbmFsIENsb3N1cmUgY2xvc3VyZSkgeworICAgICAgICBmaW5hbCBJdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBmaW5hbCBPYmplY3Qgbm9kZSA9IGl0ZXIubmV4dCgpOworICAgICAgICAgICAgaWYgKERlZmF1bHRUeXBlVHJhbnNmb3JtYXRpb24uY2FzdFRvQm9vbGVhbihjbG9zdXJlLmNhbGwobmV3IE9iamVjdFtde25vZGV9KSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKEdQYXRoUmVzdWx0KSBub2RlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgTm9DaGlsZHJlbih0aGlzLCB0aGlzLm5hbWUsIG5hbWVzcGFjZVRhZ0hpbnRzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgR1BhdGhSZXN1bHQgZmluZEFsbChmaW5hbCBDbG9zdXJlIGNsb3N1cmUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGaWx0ZXJlZE5vZGVDaGlsZHJlbih0aGlzLCBjbG9zdXJlLCBuYW1lc3BhY2VUYWdIaW50cyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYnVpbGQoZmluYWwgR3Jvb3Z5T2JqZWN0IGJ1aWxkZXIpIHsKKyAgICAgICAgZmluYWwgSXRlcmF0b3IgaXRlciA9IG5vZGVJdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIGZpbmFsIE9iamVjdCBuZXh0ID0gaXRlci5uZXh0KCk7CisgICAgICAgICAgICBpZiAobmV4dCBpbnN0YW5jZW9mIEJ1aWxkYWJsZSkgeworICAgICAgICAgICAgICAgICgoQnVpbGRhYmxlKSBuZXh0KS5idWlsZChidWlsZGVyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKChOb2RlKSBuZXh0KS5idWlsZChidWlsZGVyLCBuYW1lc3BhY2VNYXAsIG5hbWVzcGFjZVRhZ0hpbnRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIChub24tSmF2YWRvYykKKyAgICAqIEBzZWUgZ3Jvb3Z5LmxhbmcuV3JpdGFibGUjd3JpdGVUbyhqYXZhLmlvLldyaXRlcikKKyAgICAqLworICAgIHB1YmxpYyBXcml0ZXIgd3JpdGVUbyhmaW5hbCBXcml0ZXIgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBJdGVyYXRvciBpdGVyID0gbm9kZUl0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgKChOb2RlKSBpdGVyLm5leHQoKSkud3JpdGVUbyhvdXQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBvdXQ7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgcmVwbGFjZU5vZGUoZmluYWwgQ2xvc3VyZSBuZXdWYWx1ZSkgeworICAgICAgICBmaW5hbCBJdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBmaW5hbCBOb2RlQ2hpbGQgcmVzdWx0ID0gKE5vZGVDaGlsZCkgaXRlci5uZXh0KCk7CisgICAgICAgICAgICByZXN1bHQucmVwbGFjZU5vZGUobmV3VmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgcmVwbGFjZUJvZHkoZmluYWwgT2JqZWN0IG5ld1ZhbHVlKSB7CisgICAgICAgIGZpbmFsIEl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIGZpbmFsIE5vZGVDaGlsZCByZXN1bHQgPSAoTm9kZUNoaWxkKSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIHJlc3VsdC5yZXBsYWNlQm9keShuZXdWYWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhcHBlbmROb2RlKGZpbmFsIE9iamVjdCBuZXdWYWx1ZSkgeworICAgICAgICBmaW5hbCBJdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBmaW5hbCBOb2RlQ2hpbGQgcmVzdWx0ID0gKE5vZGVDaGlsZCkgaXRlci5uZXh0KCk7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kTm9kZShuZXdWYWx1ZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvc2x1cnBlcnN1cHBvcnQvTm9kZUl0ZXJhdG9yLmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3V0aWwvc2x1cnBlcnN1cHBvcnQvTm9kZUl0ZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYyMTI1ZAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdXRpbC9zbHVycGVyc3VwcG9ydC9Ob2RlSXRlcmF0b3IuamF2YQpAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBncm9vdnkudXRpbC5zbHVycGVyc3VwcG9ydDsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworLyoqCisgKiBAYXV0aG9yIEpvaG4gV2lsc29uCisgKgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTm9kZUl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3IgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBERUxBWUVEX0lOSVQgPSBuZXcgT2JqZWN0KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBJdGVyYXRvciBpdGVyOworICAgIHByaXZhdGUgT2JqZWN0IG5leHROb2RlOworCisgICAgcHVibGljIE5vZGVJdGVyYXRvcihmaW5hbCBJdGVyYXRvciBpdGVyKSB7CisgICAgICAgIHRoaXMuaXRlciA9IGl0ZXI7CisgICAgICAgIHRoaXMubmV4dE5vZGUgPSBERUxBWUVEX0lOSVQ7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXROZXh0Tm9kZSgpeworICAgICAgICBpZiAobmV4dE5vZGU9PURFTEFZRURfSU5JVCkgbmV4dE5vZGUgPSBnZXROZXh0Tm9kZShpdGVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworICAgICAgICBpbml0TmV4dE5vZGUoKTsKKyAgICAgICAgcmV0dXJuIHRoaXMubmV4dE5vZGUgIT0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7CisgICAgICAgIGluaXROZXh0Tm9kZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMubmV4dE5vZGU7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB0aGlzLm5leHROb2RlID0gZ2V0TmV4dE5vZGUodGhpcy5pdGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IE9iamVjdCBnZXROZXh0Tm9kZShmaW5hbCBJdGVyYXRvciBpdGVyKTsKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdXRpbC9zbHVycGVyc3VwcG9ydC9SZXBsYWNlbWVudE5vZGUuamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdXRpbC9zbHVycGVyc3VwcG9ydC9SZXBsYWNlbWVudE5vZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWEyN2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91dGlsL3NsdXJwZXJzdXBwb3J0L1JlcGxhY2VtZW50Tm9kZS5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBncm9vdnkudXRpbC5zbHVycGVyc3VwcG9ydDsKKworaW1wb3J0IGdyb292eS5sYW5nLkJ1aWxkYWJsZTsKK2ltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlPYmplY3Q7CitpbXBvcnQgZ3Jvb3Z5LmxhbmcuV3JpdGFibGU7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZXBsYWNlbWVudE5vZGUgaW1wbGVtZW50cyBCdWlsZGFibGUsIFdyaXRhYmxlIHsKKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBidWlsZChHcm9vdnlPYmplY3QgYnVpbGRlciwgTWFwIG5hbWVzcGFjZU1hcCwgTWFwIG5hbWVzcGFjZVRhZ0hpbnRzKTsKKyAgICAKKyAgICBwdWJsaWMgdm9pZCBidWlsZChmaW5hbCBHcm9vdnlPYmplY3QgYnVpbGRlcikgeworICAgICAgICBidWlsZChidWlsZGVyLCBudWxsLCBudWxsKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIFdyaXRlciB3cml0ZVRvKGZpbmFsIFdyaXRlciBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBvdXQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS91dGlsL3NsdXJwZXJzdXBwb3J0L3BhY2thZ2UuaHRtbCBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdXRpbC9zbHVycGVyc3VwcG9ydC9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E1MmRmOQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkvdXRpbC9zbHVycGVyc3VwcG9ydC9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSw4IEBACis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPHRpdGxlPnBhY2thZ2UgZ3Jvb3Z5LnV0aWwuc2x1cnBlcnN1cHBvcnQuKjwvdGl0bGU+CisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgPHA+SGVscGVyIGNsYXNzZXMgZm9yIFhtbFNsdXJwZXIuPC9wPgorICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3htbC9ET01CdWlsZGVyLmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3htbC9ET01CdWlsZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGViYzc2YwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkveG1sL0RPTUJ1aWxkZXIuamF2YQpAQCAtMCwwICsxLDE2MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgZ3Jvb3Z5LnhtbDsKKworaW1wb3J0IGdyb292eS51dGlsLkJ1aWxkZXJTdXBwb3J0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CisKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CitpbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworCisvKioKKyAqIEEgaGVscGVyIGNsYXNzIGZvciBjcmVhdGluZyBhIFczQyBET00gdHJlZQorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBET01CdWlsZGVyIGV4dGVuZHMgQnVpbGRlclN1cHBvcnQgeworCisgICAgRG9jdW1lbnQgZG9jdW1lbnQ7CisgICAgRG9jdW1lbnRCdWlsZGVyIGRvY3VtZW50QnVpbGRlcjsKKworICAgIHB1YmxpYyBzdGF0aWMgRE9NQnVpbGRlciBuZXdJbnN0YW5jZSgpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ld0luc3RhbmNlKGZhbHNlLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIERPTUJ1aWxkZXIgbmV3SW5zdGFuY2UoYm9vbGVhbiB2YWxpZGF0aW5nLCBib29sZWFuIG5hbWVzcGFjZUF3YXJlKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IEZhY3RvcnlTdXBwb3J0LmNyZWF0ZURvY3VtZW50QnVpbGRlckZhY3RvcnkoKTsKKyAgICAgICAgZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZShuYW1lc3BhY2VBd2FyZSk7CisgICAgICAgIGZhY3Rvcnkuc2V0VmFsaWRhdGluZyh2YWxpZGF0aW5nKTsKKyAgICAgICAgcmV0dXJuIG5ldyBET01CdWlsZGVyKGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRG9jdW1lbnQgcGFyc2UoUmVhZGVyIHJlYWRlcikgdGhyb3dzIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24geworICAgICAgICByZXR1cm4gcGFyc2UocmVhZGVyLCBmYWxzZSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBEb2N1bWVudCBwYXJzZShSZWFkZXIgcmVhZGVyLCBib29sZWFuIHZhbGlkYXRpbmcsIGJvb2xlYW4gbmFtZXNwYWNlQXdhcmUpCisgICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IEZhY3RvcnlTdXBwb3J0LmNyZWF0ZURvY3VtZW50QnVpbGRlckZhY3RvcnkoKTsKKyAgICAgICAgZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZShuYW1lc3BhY2VBd2FyZSk7CisgICAgICAgIGZhY3Rvcnkuc2V0VmFsaWRhdGluZyh2YWxpZGF0aW5nKTsKKyAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGRvY3VtZW50QnVpbGRlciA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7CisgICAgICAgIHJldHVybiBkb2N1bWVudEJ1aWxkZXIucGFyc2UobmV3IElucHV0U291cmNlKHJlYWRlcikpOworICAgIH0KKworICAgIHB1YmxpYyBET01CdWlsZGVyKERvY3VtZW50IGRvY3VtZW50KSB7CisgICAgICAgIHRoaXMuZG9jdW1lbnQgPSBkb2N1bWVudDsKKyAgICB9CisKKyAgICBwdWJsaWMgRE9NQnVpbGRlcihEb2N1bWVudEJ1aWxkZXIgZG9jdW1lbnRCdWlsZGVyKSB7CisgICAgICAgIHRoaXMuZG9jdW1lbnRCdWlsZGVyID0gZG9jdW1lbnRCdWlsZGVyOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50LCBPYmplY3QgY2hpbGQpIHsKKyAgICAgICAgTm9kZSBjdXJyZW50ID0gKE5vZGUpIHBhcmVudDsKKyAgICAgICAgTm9kZSBub2RlID0gKE5vZGUpIGNoaWxkOworCisgICAgICAgIGN1cnJlbnQuYXBwZW5kQ2hpbGQobm9kZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVOb2RlKE9iamVjdCBuYW1lKSB7CisgICAgICAgIGlmIChkb2N1bWVudCA9PSBudWxsKSB7CisgICAgICAgICAgICBkb2N1bWVudCA9IGNyZWF0ZURvY3VtZW50KCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5hbWUgaW5zdGFuY2VvZiBRTmFtZSkgeworICAgICAgICAgICAgUU5hbWUgcW5hbWUgPSAoUU5hbWUpIG5hbWU7CisgICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpLCBxbmFtZS5nZXRRdWFsaWZpZWROYW1lKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobmFtZS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBEb2N1bWVudCBjcmVhdGVEb2N1bWVudCgpIHsKKyAgICAgICAgaWYgKGRvY3VtZW50QnVpbGRlciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJObyBEb2N1bWVudCBvciBET01JbXBsZW1lbnRhdGlvbiBhdmFpbGFibGUgc28gY2Fubm90IGNyZWF0ZSBEb2N1bWVudCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50QnVpbGRlci5uZXdEb2N1bWVudCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVOb2RlKE9iamVjdCBuYW1lLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIGNyZWF0ZU5vZGUobmFtZSk7CisgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodmFsdWUudG9TdHJpbmcoKSkpOworICAgICAgICByZXR1cm4gZWxlbWVudDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZU5vZGUoT2JqZWN0IG5hbWUsIE1hcCBhdHRyaWJ1dGVzLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIGNyZWF0ZU5vZGUobmFtZSwgYXR0cmlidXRlcyk7CisgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodmFsdWUudG9TdHJpbmcoKSkpOworICAgICAgICByZXR1cm4gZWxlbWVudDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZU5vZGUoT2JqZWN0IG5hbWUsIE1hcCBhdHRyaWJ1dGVzKSB7CisgICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KSBjcmVhdGVOb2RlKG5hbWUpOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhdHRyaWJ1dGVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIFN0cmluZyBhdHRyTmFtZSA9IGVudHJ5LmdldEtleSgpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgaWYgKCJ4bWxucyIuZXF1YWxzKGF0dHJOYW1lKSkgeworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE1hcCkgeworICAgICAgICAgICAgICAgICAgICBhcHBlbmROYW1lc3BhY2VBdHRyaWJ1dGVzKGVsZW1lbnQsIChNYXApIHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgb2YgdGhlIHhtbG5zIGF0dHJpYnV0ZSBtdXN0IGJlIGEgTWFwIG9mIFFOYW1lcyB0byBTdHJpbmcgVVJJcyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlVGV4dCA9ICh2YWx1ZSAhPSBudWxsKSA/IHZhbHVlLnRvU3RyaW5nKCkgOiAiIjsKKyAgICAgICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyTmFtZSwgdmFsdWVUZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZWxlbWVudDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhcHBlbmROYW1lc3BhY2VBdHRyaWJ1dGVzKEVsZW1lbnQgZWxlbWVudCwgTWFwIGF0dHJpYnV0ZXMpIHsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gYXR0cmlidXRlcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7CisgICAgICAgICAgICBPYmplY3Qga2V5ID0gZW50cnkuZ2V0S2V5KCk7CisgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgb2Yga2V5OiAiICsga2V5ICsgIiBjYW5ub3QgYmUgbnVsbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGtleSBpbnN0YW5jZW9mIFN0cmluZykgeworICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSAoU3RyaW5nKSBrZXk7CisKKyAgICAgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiQ3JlYXRpbmcgbmFtZXNwYWNlIGZvciBwcmVmaXg6ICIgKyBwcmVmaXggKyAiIHdpdGggdmFsdWU6ICIgKyB2YWx1ZSk7CisKKyAgICAgICAgICAgICAgICAvL2VsZW1lbnQuc2V0QXR0cmlidXRlTlMoImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIsICJ4bWxuczoiICsgcHJlZml4LCB2YWx1ZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZU5TKCIiLCBwcmVmaXgsIHZhbHVlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkgaW5zdGFuY2VvZiBRTmFtZSkgeworICAgICAgICAgICAgICAgIFFOYW1lIHFuYW1lID0gKFFOYW1lKSBrZXk7CisgICAgICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhxbmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgcW5hbWUuZ2V0UXVhbGlmaWVkTmFtZSgpLCB2YWx1ZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGtleTogIiArIGtleSArICIgc2hvdWxkIGJlIGFuIGluc3RhbmNlb2Ygb2YgIiArIFFOYW1lLmNsYXNzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkveG1sL0VudGl0eS5ncm9vdnkgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3htbC9FbnRpdHkuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlZTUwNzcKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3htbC9FbnRpdHkuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTg1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBncm9vdnkueG1sCisKK2NsYXNzIEVudGl0eSBpbXBsZW1lbnRzIEJ1aWxkYWJsZSB7CisgICAgLyoKKyAgICAgKiBYTUwtY29tcGF0aWJsZSBJU08gTGF0aW4gMSBDaGFyYWN0ZXIgRW50aXR5IFNldCBmb3IgWEhUTUwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudGl0eSBuYnNwID0gbmV3IEVudGl0eSgibmJzcCIpICAgICAgICAvLyBuby1icmVhayBzcGFjZSA9IG5vbi1icmVha2luZyBzcGFjZSwgVSswMEEwIElTT251bSAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudGl0eSBpZXhjbCA9IG5ldyBFbnRpdHkoImlleGNsIikgICAgICAvLyBpbnZlcnRlZCBleGNsYW1hdGlvbiBtYXJrLCBVKzAwQTEgSVNPbnVtIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50aXR5IGNlbnQgPSBuZXcgRW50aXR5KCJjZW50IikgICAgICAgIC8vIGNlbnQgc2lnbiwgVSswMEEyIElTT251bSAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudGl0eSBwb3VuZCA9IG5ldyBFbnRpdHkoInBvdW5kIikgICAgICAvLyBwb3VuZCBzaWduLCBVKzAwQTMgSVNPbnVtIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50aXR5IGN1cnJlbiA9IG5ldyBFbnRpdHkoImN1cnJlbiIpICAgIC8vIGN1cnJlbmN5IHNpZ24sIFUrMDBBNCBJU09udW0gCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFbnRpdHkgeWVuID0gbmV3IEVudGl0eSgieWVuIikgICAgICAgICAgLy8geWVuIHNpZ24gPSB5dWFuIHNpZ24sIFUrMDBBNSBJU09udW0gCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFbnRpdHkgYnJ2YmFyID0gbmV3IEVudGl0eSgiYnJ2YmFyIikgICAgLy8gYnJva2VuIGJhciA9IGJyb2tlbiB2ZXJ0aWNhbCBiYXIsIFUrMDBBNiBJU09udW0gCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFbnRpdHkgc2VjdCA9IG5ldyBFbnRpdHkoInNlY3QiKSAgICAgICAgLy8gc2VjdGlvbiBzaWduLCBVKzAwQTcgSVNPbnVtIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50aXR5IHVtbCA9IG5ldyBFbnRpdHkoInVtbCIpICAgICAgICAgIC8vIGRpYWVyZXNpcyA9IHNwYWNpbmcgZGlhZXJlc2lzLCBVKzAwQTggSVNPZGlhCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFbnRpdHkgY29weSA9IG5ldyBFbnRpdHkoImNvcHkiKSAgICAgICAgLy8gY29weXJpZ2h0IHNpZ24sIFUrMDBBOSBJU09udW0gCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFbnRpdHkgb3JkZiA9IG5ldyBFbnRpdHkoIm9yZGYiKSAgICAgICAgLy8gZmVtaW5pbmUgb3JkaW5hbCBpbmRpY2F0b3IsIFUrMDBBQSBJU09udW0gCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFbnRpdHkgbGFxdW8gPSBuZXcgRW50aXR5KCJsYXF1byIpICAgICAgLy8gbGVmdC1wb2ludGluZyBkb3VibGUgYW5nbGUgcXVvdGF0aW9uIG1hcmsgPSBsZWZ0IHBvaW50aW5nIGd1aWxsZW1ldCwgVSswMEFCIElTT251bSAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudGl0eSBub3QgPSBuZXcgRW50aXR5KCJub3QiKSAgICAgICAgICAvLyBub3Qgc2lnbiwgVSswMEFDIElTT251bSAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudGl0eSBzaHkgPSBuZXcgRW50aXR5KCJzaHkiKSAgICAgICAgICAvLyBzb2Z0IGh5cGhlbiA9IGRpc2NyZXRpb25hcnkgaHlwaGVuLCBVKzAwQUQgSVNPbnVtIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50aXR5IHJlZyA9IG5ldyBFbnRpdHkoInJlZyIpICAgICAgICAgIC8vIHJlZ2lzdGVyZWQgc2lnbiA9IHJlZ2lzdGVyZWQgdHJhZGUgbWFyayBzaWduLCBVKzAwQUUgSVNPbnVtIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50aXR5IG1hY3IgPSBuZXcgRW50aXR5KCJtYWNyIikgICAgICAgIC8vIG1hY3JvbiA9IHNwYWNpbmcgbWFjcm9uID0gb3ZlcmxpbmUgPSBBUEwgb3ZlcmJhciwgVSswMEFGIElTT2RpYSAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudGl0eSBkZWcgPSBuZXcgRW50aXR5KCJkZWciKSAgICAgICAgICAvLyBkZWdyZWUgc2lnbiwgVSswMEIwIElTT251bSAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudGl0eSBwbHVzbW4gPSBuZXcgRW50aXR5KCJwbHVzbW4iKSAgICAvLyBwbHVzLW1pbnVzIHNpZ24gPSBwbHVzLW9yLW1pbnVzIHNpZ24sIFUrMDBCMSBJU09udW0gCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFbnRpdHkgc3VwMiA9IG5ldyBFbnRpdHkoInN1cDIiKSAgICAgICAgLy8gc3VwZXJzY3JpcHQgdHdvID0gc3VwZXJzY3JpcHQgZGlnaXQgdHdvID0gc3F1YXJlZCwgVSswMEIyIElTT251bSAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudGl0eSBzdXAzID0gbmV3IEVudGl0eSgic3VwMyIpICAgICAgICAvLyBzdXBlcnNjcmlwdCB0aHJlZSA9IHN1cGVyc2NyaXB0IGRpZ2l0IHRocmVlID0gY3ViZWQsIFUrMDBCMyBJU09udW0gCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFbnRpdHkgYWN1dGUgPSBuZXcgRW50aXR5KCJhY3V0ZSIpICAgICAgLy8gYWN1dGUgYWNjZW50ID0gc3BhY2luZyBhY3V0ZSwgVSswMEI0IElTT2RpYSAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudGl0eSBtaWNybyA9IG5ldyBFbnRpdHkoIm1pY3JvIikgICAgICAvLyBtaWNybyBzaWduLCBVKzAwQjUgSVNPbnVtIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50aXR5IHBhcmEgPSBuZXcgRW50aXR5KCJwYXJhIikgICAgICAgIC8vIHBpbGNyb3cgc2lnbiA9IHBhcmFncmFwaCBzaWduLCBVKzAwQjYgSVNPbnVtIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50aXR5IG1pZGRvdCA9IG5ldyBFbnRpdHkoIm1pZGRvdCIpICAgIC8vIG1pZGRsZSBkb3QgPSBHZW9yZ2lhbiBjb21tYSA9IEdyZWVrIG1pZGRsZSBkb3QsIFUrMDBCNyBJU09udW0gCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFbnRpdHkgY2VkaWwgPSBuZXcgRW50aXR5KCJjZWRpbCIpICAgICAgLy8gY2VkaWxsYSA9IHNwYWNpbmcgY2VkaWxsYSwgVSswMEI4IElTT2RpYSAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudGl0eSBzdXAxID0gbmV3IEVudGl0eSgic3VwMSIpICAgICAgICAvLyBzdXBlcnNjcmlwdCBvbmUgPSBzdXBlcnNjcmlwdCBkaWdpdCBvbmUsIFUrMDBCOSBJU09udW0gCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFbnRpdHkgb3JkbSA9IG5ldyBFbnRpdHkoIm9yZG0iKSAgICAgICAgLy8gbWFzY3VsaW5lIG9yZGluYWwgaW5kaWNhdG9yLCBVKzAwQkEgSVNPbnVtIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50aXR5IHJhcXVvID0gbmV3IEVudGl0eSgicmFxdW8iKSAgICAgIC8vIHJpZ2h0LXBvaW50aW5nIGRvdWJsZSBhbmdsZSBxdW90YXRpb24gbWFyayA9IHJpZ2h0IHBvaW50aW5nIGd1aWxsZW1ldCwgVSswMEJCIElTT251bSAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudGl0eSBmcmFjMTQgPSBuZXcgRW50aXR5KCJmcmFjMTQiKSAgICAvLyB2dWxnYXIgZnJhY3Rpb24gb25lIHF1YXJ0ZXIgPSBmcmFjdGlvbiBvbmUgcXVhcnRlciwgVSswMEJDIElTT251bSAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudGl0eSBmcmFjMTIgPSBuZXcgRW50aXR5KCJmcmFjMTIiKSAgICAvLyB2dWxnYXIgZnJhY3Rpb24gb25lIGhhbGYgPSBmcmFjdGlvbiBvbmUgaGFsZiwgVSswMEJEIElTT251bSAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudGl0eSBmcmFjMzQgPSBuZXcgRW50aXR5KCJmcmFjMzQiKSAgICAvLyB2dWxnYXIgZnJhY3Rpb24gdGhyZWUgcXVhcnRlcnMgPSBmcmFjdGlvbiB0aHJlZSBxdWFydGVycywgVSswMEJFIElTT251bSAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudGl0eSBpcXVlc3QgPSBuZXcgRW50aXR5KCJpcXVlc3QiKSAgICAvLyBpbnZlcnRlZCBxdWVzdGlvbiBtYXJrID0gdHVybmVkIHF1ZXN0aW9uIG1hcmssIFUrMDBCRiBJU09udW0gCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFbnRpdHkgQWdyYXZlID0gbmV3IEVudGl0eSgiQWdyYXZlIikgICAgLy8gbGF0aW4gY2FwaXRhbCBBIHdpdGggZ3JhdmUgPSBsYXRpbiBjYXBpdGFsIEEgZ3JhdmUsIFUrMDBDMCBJU09sYXQxIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50aXR5IEFhY3V0ZSA9IG5ldyBFbnRpdHkoIkFhY3V0ZSIpICAgIC8vIGxhdGluIGNhcGl0YWwgQSB3aXRoIGFjdXRlLCBVKzAwQzEgSVNPbGF0MSAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudGl0eSBBY2lyYyA9IG5ldyBFbnRpdHkoIkFjaXJjIikgICAgICAvLyBsYXRpbiBjYXBpdGFsIEEgd2l0aCBjaXJjdW1mbGV4LCBVKzAwQzIgSVNPbGF0MSAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudGl0eSBBdGlsZGUgPSBuZXcgRW50aXR5KCJBdGlsZGUiKSAgICAvLyBsYXRpbiBjYXBpdGFsIEEgd2l0aCB0aWxkZSwgVSswMEMzIElTT2xhdDEgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFbnRpdHkgQXVtbCA9IG5ldyBFbnRpdHkoIkF1bWwiKSAgICAgICAgLy8gbGF0aW4gY2FwaXRhbCBBIHdpdGggZGlhZXJlc2lzLCBVKzAwQzQgSVNPbGF0MSAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudGl0eSBBcmluZyA9IG5ldyBFbnRpdHkoIkFyaW5nIikgICAgICAvLyBsYXRpbiBjYXBpdGFsIEEgd2l0aCByaW5nIGFib3ZlID0gbGF0aW4gY2FwaXRhbCBBIHJpbmcsIFUrMDBDNSBJU09sYXQxIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50aXR5IEFFbGlnID0gbmV3IEVudGl0eSgiQUVsaWciKSAgICAgIC8vIGxhdGluIGNhcGl0YWwgQUUgPSBsYXRpbiBjYXBpdGFsIGxpZ2F0dXJlIEFFLCBVKzAwQzYgSVNPbGF0MSAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudGl0eSBDY2VkaWwgPSBuZXcgRW50aXR5KCJDY2VkaWwiKSAgICAvLyBsYXRpbiBjYXBpdGFsIEMgd2l0aCBjZWRpbGxhLCBVKzAwQzcgSVNPbGF0MSAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudGl0eSBFZ3JhdmUgPSBuZXcgRW50aXR5KCJFZ3JhdmUiKSAgICAvLyBsYXRpbiBjYXBpdGFsIEUgd2l0aCBncmF2ZSwgVSswMEM4IElTT2xhdDEgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFbnRpdHkgRWFjdXRlID0gbmV3IEVudGl0eSgiRWFjdXRlIikgICAgLy8gbGF0aW4gY2FwaXRhbCBFIHdpdGggYWN1dGUsIFUrMDBDOSBJU09sYXQxIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50aXR5IEVjaXJjID0gbmV3IEVudGl0eSgiRWNpcmMiKSAgICAgIC8vIGxhdGluIGNhcGl0YWwgRSB3aXRoIGNpcmN1bWZsZXgsIFUrMDBDQSBJU09sYXQxIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50aXR5IEV1bWwgPSBuZXcgRW50aXR5KCJFdW1sIikgICAgICAgIC8vIGxhdGluIGNhcGl0YWwgRSB3aXRoIGRpYWVyZXNpcywgVSswMENCIElTT2xhdDEgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFbnRpdHkgSWdyYXZlID0gbmV3IEVudGl0eSgiSWdyYXZlIikgICAgLy8gbGF0aW4gY2FwaXRhbCBJIHdpdGggZ3JhdmUsIFUrMDBDQyBJU09sYXQxIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50aXR5IElhY3V0ZSA9IG5ldyBFbnRpdHkoIklhY3V0ZSIpICAgIC8vIGxhdGluIGNhcGl0YWwgSSB3aXRoIGFjdXRlLCBVKzAwQ0QgSVNPbGF0MSAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudGl0eSBJY2lyYyA9IG5ldyBFbnRpdHkoIkljaXJjIikgICAgICAvLyBsYXRpbiBjYXBpdGFsIEkgd2l0aCBjaXJjdW1mbGV4LCBVKzAwQ0UgSVNPbGF0MSAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudGl0eSBJdW1sID0gbmV3IEVudGl0eSgiSXVtbCIpICAgICAgICAvLyBsYXRpbiBjYXBpdGFsIEkgd2l0aCBkaWFlcmVzaXMsIFUrMDBDRiBJU09sYXQxIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50aXR5IEVUSCA9IG5ldyBFbnRpdHkoIkVUSCIpICAgICAgICAgIC8vIGxhdGluIGNhcGl0YWwgRVRILCBVKzAwRDAgSVNPbGF0MSAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudGl0eSBOdGlsZGUgPSBuZXcgRW50aXR5KCJOdGlsZGUiKSAgICAvLyBsYXRpbiBjYXBpdGFsIE4gd2l0aCB0aWxkZSwgVSswMEQxIElTT2xhdDEgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFbnRpdHkgT2dyYXZlID0gbmV3IEVudGl0eSgiT2dyYXZlIikgICAgLy8gbGF0aW4gY2FwaXRhbCBPIHdpdGggZ3JhdmUsIFUrMDBEMiBJU09sYXQxIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50aXR5IE9hY3V0ZSA9IG5ldyBFbnRpdHkoIk9hY3V0ZSIpICAgIC8vIGxhdGluIGNhcGl0YWwgTyB3aXRoIGFjdXRlLCBVKzAwRDMgSVNPbGF0MSAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudGl0eSBPY2lyYyA9IG5ldyBFbnRpdHkoIk9jaXJjIikgICAgICAvLyBsYXRpbiBjYXBpdGFsIE8gd2l0aCBjaXJjdW1mbGV4LCBVKzAwRDQgSVNPbGF0MSAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudGl0eSBPdGlsZGUgPSBuZXcgRW50aXR5KCJPdGlsZGUiKSAgICAvLyBsYXRpbiBjYXBpdGFsIE8gd2l0aCB0aWxkZSwgVSswMEQ1IElTT2xhdDEgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFbnRpdHkgT3VtbCA9IG5ldyBFbnRpdHkoIk91bWwiKSAgICAgICAgLy8gbGF0aW4gY2FwaXRhbCBPIHdpdGggZGlhZXJlc2lzLCBVKzAwRDYgSVNPbGF0MSAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudGl0eSB0aW1lcyA9IG5ldyBFbnRpdHkoInRpbWVzIikgICAgICAvLyBtdWx0aXBsaWNhdGlvbiBzaWduLCBVKzAwRDcgSVNPbnVtIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50aXR5IE9zbGFzaCA9IG5ldyBFbnRpdHkoIk9zbGFzaCIpICAgIC8vIGxhdGluIGNhcGl0YWwgTyB3aXRoIHN0cm9rZSA9IGxhdGluIGNhcGl0YWwgTyBzbGFzaCwgVSswMEQ4IElTT2xhdDEgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFbnRpdHkgVWdyYXZlID0gbmV3IEVudGl0eSgiVWdyYXZlIikgICAgLy8gbGF0aW4gY2FwaXRhbCBVIHdpdGggZ3JhdmUsIFUrMDBEOSBJU09sYXQxIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50aXR5IFVhY3V0ZSA9IG5ldyBFbnRpdHkoIlVhY3V0ZSIpICAgIC8vIGxhdGluIGNhcGl0YWwgVSB3aXRoIGFjdXRlLCBVKzAwREEgSVNPbGF0MSAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudGl0eSBVY2lyYyA9IG5ldyBFbnRpdHkoIlVjaXJjIikgICAgICAvLyBsYXRpbiBjYXBpdGFsIFUgd2l0aCBjaXJjdW1mbGV4LCBVKzAwREIgSVNPbGF0MSAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudGl0eSBVdW1sID0gbmV3IEVudGl0eSgiVXVtbCIpICAgICAgICAvLyBsYXRpbiBjYXBpdGFsIFUgd2l0aCBkaWFlcmVzaXMsIFUrMDBEQyBJU09sYXQxIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50aXR5IFlhY3V0ZSA9IG5ldyBFbnRpdHkoIllhY3V0ZSIpICAgIC8vIGxhdGluIGNhcGl0YWwgWSB3aXRoIGFjdXRlLCBVKzAwREQgSVNPbGF0MSAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudGl0eSBUSE9STiA9IG5ldyBFbnRpdHkoIlRIT1JOIikgICAgICAvLyBsYXRpbiBjYXBpdGFsIFRIT1JOLCBVKzAwREUgSVNPbGF0MSAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudGl0eSBzemxpZyA9IG5ldyBFbnRpdHkoInN6bGlnIikgICAgICAvLyBsYXRpbiBzbWFsbCBzaGFycCBzID0gZXNzLXplZCwgVSswMERGIElTT2xhdDEgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFbnRpdHkgYWdyYXZlID0gbmV3IEVudGl0eSgiYWdyYXZlIikgICAgLy8gbGF0aW4gc21hbGwgYSB3aXRoIGdyYXZlID0gbGF0aW4gc21hbGwgYSBncmF2ZSwgVSswMEUwIElTT2xhdDEgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFbnRpdHkgYWFjdXRlID0gbmV3IEVudGl0eSgiYWFjdXRlIikgICAgLy8gbGF0aW4gc21hbGwgYSB3aXRoIGFjdXRlLCBVKzAwRTEgSVNPbGF0MSAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudGl0eSBhY2lyYyA9IG5ldyBFbnRpdHkoImFjaXJjIikgICAgICAvLyBsYXRpbiBzbWFsbCBhIHdpdGggY2lyY3VtZmxleCwgVSswMEUyIElTT2xhdDEgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFbnRpdHkgYXRpbGRlID0gbmV3IEVudGl0eSgiYXRpbGRlIikgICAgLy8gbGF0aW4gc21hbGwgYSB3aXRoIHRpbGRlLCBVKzAwRTMgSVNPbGF0MSAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudGl0eSBhdW1sID0gbmV3IEVudGl0eSgiYXVtbCIpICAgICAgICAvLyBsYXRpbiBzbWFsbCBhIHdpdGggZGlhZXJlc2lzLCBVKzAwRTQgSVNPbGF0MSAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudGl0eSBhcmluZyA9IG5ldyBFbnRpdHkoImFyaW5nIikgICAgICAvLyBsYXRpbiBzbWFsbCBhIHdpdGggcmluZyBhYm92ZSA9IGxhdGluIHNtYWxsIGEgcmluZywgVSswMEU1IElTT2xhdDEgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFbnRpdHkgYWVsaWcgPSBuZXcgRW50aXR5KCJhZWxpZyIpICAgICAgLy8gbGF0aW4gc21hbGwgYWUgPSBsYXRpbiBzbWFsbCBsaWdhdHVyZSBhZSwgVSswMEU2IElTT2xhdDEgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFbnRpdHkgY2NlZGlsID0gbmV3IEVudGl0eSgiY2NlZGlsIikgICAgLy8gbGF0aW4gc21hbGwgYyB3aXRoIGNlZGlsbGEsIFUrMDBFNyBJU09sYXQxIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50aXR5IGVncmF2ZSA9IG5ldyBFbnRpdHkoImVncmF2ZSIpICAgIC8vIGxhdGluIHNtYWxsIGUgd2l0aCBncmF2ZSwgVSswMEU4IElTT2xhdDEgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFbnRpdHkgZWFjdXRlID0gbmV3IEVudGl0eSgiZWFjdXRlIikgICAgLy8gbGF0aW4gc21hbGwgZSB3aXRoIGFjdXRlLCBVKzAwRTkgSVNPbGF0MSAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudGl0eSBlY2lyYyA9IG5ldyBFbnRpdHkoImVjaXJjIikgICAgICAvLyBsYXRpbiBzbWFsbCBlIHdpdGggY2lyY3VtZmxleCwgVSswMEVBIElTT2xhdDEgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFbnRpdHkgZXVtbCA9IG5ldyBFbnRpdHkoImV1bWwiKSAgICAgICAgLy8gbGF0aW4gc21hbGwgZSB3aXRoIGRpYWVyZXNpcywgVSswMEVCIElTT2xhdDEgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFbnRpdHkgaWdyYXZlID0gbmV3IEVudGl0eSgiaWdyYXZlIikgICAgLy8gbGF0aW4gc21hbGwgaSB3aXRoIGdyYXZlLCBVKzAwRUMgSVNPbGF0MSAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudGl0eSBpYWN1dGUgPSBuZXcgRW50aXR5KCJpYWN1dGUiKSAgICAvLyBsYXRpbiBzbWFsbCBpIHdpdGggYWN1dGUsIFUrMDBFRCBJU09sYXQxIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50aXR5IGljaXJjID0gbmV3IEVudGl0eSgiaWNpcmMiKSAgICAgIC8vIGxhdGluIHNtYWxsIGkgd2l0aCBjaXJjdW1mbGV4LCBVKzAwRUUgSVNPbGF0MSAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudGl0eSBpdW1sID0gbmV3IEVudGl0eSgiaXVtbCIpICAgICAgICAvLyBsYXRpbiBzbWFsbCBpIHdpdGggZGlhZXJlc2lzLCBVKzAwRUYgSVNPbGF0MSAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudGl0eSBldGggPSBuZXcgRW50aXR5KCJldGgiKSAgICAgICAgICAvLyBsYXRpbiBzbWFsbCBldGgsIFUrMDBGMCBJU09sYXQxIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50aXR5IG50aWxkZSA9IG5ldyBFbnRpdHkoIm50aWxkZSIpICAgIC8vIGxhdGluIHNtYWxsIG4gd2l0aCB0aWxkZSwgVSswMEYxIElTT2xhdDEgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFbnRpdHkgb2dyYXZlID0gbmV3IEVudGl0eSgib2dyYXZlIikgICAgLy8gbGF0aW4gc21hbGwgbyB3aXRoIGdyYXZlLCBVKzAwRjIgSVNPbGF0MSAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudGl0eSBvYWN1dGUgPSBuZXcgRW50aXR5KCJvYWN1dGUiKSAgICAvLyBsYXRpbiBzbWFsbCBvIHdpdGggYWN1dGUsIFUrMDBGMyBJU09sYXQxIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50aXR5IG9jaXJjID0gbmV3IEVudGl0eSgib2NpcmMiKSAgICAgIC8vIGxhdGluIHNtYWxsIG8gd2l0aCBjaXJjdW1mbGV4LCBVKzAwRjQgSVNPbGF0MSAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudGl0eSBvdGlsZGUgPSBuZXcgRW50aXR5KCJvdGlsZGUiKSAgICAvLyBsYXRpbiBzbWFsbCBvIHdpdGggdGlsZGUsIFUrMDBGNSBJU09sYXQxIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50aXR5IG91bWwgPSBuZXcgRW50aXR5KCJvdW1sIikgICAgICAgIC8vIGxhdGluIHNtYWxsIG8gd2l0aCBkaWFlcmVzaXMsIFUrMDBGNiBJU09sYXQxIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50aXR5IGRpdmlkZSA9IG5ldyBFbnRpdHkoImRpdmlkZSIpICAgIC8vIGRpdmlzaW9uIHNpZ24sIFUrMDBGNyBJU09udW0gCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFbnRpdHkgb3NsYXNoID0gbmV3IEVudGl0eSgib3NsYXNoIikgICAgLy8gbGF0aW4gc21hbGwgbyB3aXRoIHN0cm9rZSwgPSBsYXRpbiBzbWFsbCBvIHNsYXNoLCBVKzAwRjggSVNPbGF0MSAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudGl0eSB1Z3JhdmUgPSBuZXcgRW50aXR5KCJ1Z3JhdmUiKSAgICAvLyBsYXRpbiBzbWFsbCB1IHdpdGggZ3JhdmUsIFUrMDBGOSBJU09sYXQxIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50aXR5IHVhY3V0ZSA9IG5ldyBFbnRpdHkoInVhY3V0ZSIpICAgIC8vIGxhdGluIHNtYWxsIHUgd2l0aCBhY3V0ZSwgVSswMEZBIElTT2xhdDEgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFbnRpdHkgdWNpcmMgPSBuZXcgRW50aXR5KCJ1Y2lyYyIpICAgICAgLy8gbGF0aW4gc21hbGwgdSB3aXRoIGNpcmN1bWZsZXgsIFUrMDBGQiBJU09sYXQxIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50aXR5IHV1bWwgPSBuZXcgRW50aXR5KCJ1dW1sIikgICAgICAgIC8vIGxhdGluIHNtYWxsIHUgd2l0aCBkaWFlcmVzaXMsIFUrMDBGQyBJU09sYXQxIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50aXR5IHlhY3V0ZSA9IG5ldyBFbnRpdHkoInlhY3V0ZSIpICAgIC8vIGxhdGluIHNtYWxsIHkgd2l0aCBhY3V0ZSwgVSswMEZEIElTT2xhdDEgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFbnRpdHkgdGhvcm4gPSBuZXcgRW50aXR5KCJ0aG9ybiIpICAgICAgLy8gbGF0aW4gc21hbGwgdGhvcm4gd2l0aCwgVSswMEZFIElTT2xhdDEgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFbnRpdHkgeXVtbCA9IG5ldyBFbnRpdHkoInl1bWwiKSAgICAgICAgLy8gbGF0aW4gc21hbGwgeSB3aXRoIGRpYWVyZXNpcywgVSswMEZGIElTT2xhdDEKKyAgICAKKyAgICAvKgorICAgICAqIFhNTC1jb21wYXRpYmxlIElTTyBTcGVjaWFsIENoYXJhY3RlciBFbnRpdHkgU2V0IGZvciBYSFRNTCAKKyAgICAgKi8KKyAgICAKKyAgICAvLyBDMCBDb250cm9scyBhbmQgQmFzaWMgTGF0aW4gCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFbnRpdHkgbHQgPSBuZXcgRW50aXR5KCJsdCIpICAgICAgICAgICAgLy9sZXNzLXRoYW4gc2lnbiwgVSswMDNDIElTT251bQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50aXR5IGd0ID0gbmV3IEVudGl0eSgiZ3QiKSAgICAgICAgICAgIC8vZ3JlYXRlci10aGFuIHNpZ24sIFUrMDAzRSBJU09udW0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudGl0eSBhbXAgPSBuZXcgRW50aXR5KCJhbXAiKSAgICAgICAgICAvL2FtcGVyc2FuZCwgVSswMDI2IElTT251bQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50aXR5IGFwb3MgPSBuZXcgRW50aXR5KCJhcG9zIikgICAgICAgIC8vVGhlIEFwb3N0cm9waGUgKEFwb3N0cm9waGUgUXVvdGUsIEFQTCBRdW90ZSksIFUrMDAyNyBJU09udW0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudGl0eSBxdW90ID0gbmV3IEVudGl0eSgicXVvdCIpICAgICAgICAvL3F1b3RhdGlvbiBtYXJrIChRdW90ZSBEb3VibGUpLCBVKzAwMjIgSVNPbnVtCisgICAgCisgICAgLy8gTGF0aW4gRXh0ZW5kZWQtQQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50aXR5IE9FbGlnID0gbmV3IEVudGl0eSgiT0VsaWciKSAgLy9sYXRpbiBjYXBpdGFsIGxpZ2F0dXJlIE9FLCBVKzAxNTIgSVNPbGF0MgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50aXR5IG9lbGlnID0gbmV3IEVudGl0eSgib2VsaWciKSAgLy9sYXRpbiBzbWFsbCBsaWdhdHVyZSBvZSwgVSswMTUzIElTT2xhdDIKKyAgICAKKyAgICAvLyBsaWdhdHVyZSBpcyBhIG1pc25vbWVyLCB0aGlzIGlzIGEgc2VwYXJhdGUgY2hhcmFjdGVyIGluIHNvbWUgbGFuZ3VhZ2VzIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50aXR5IFNjYXJvbiA9IG5ldyBFbnRpdHkoIlNjYXJvbiIpICAgIC8vbGF0aW4gY2FwaXRhbCBsZXR0ZXIgUyB3aXRoIGNhcm9uLCBVKzAxNjAgSVNPbGF0MgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50aXR5IHNjYXJvbiA9IG5ldyBFbnRpdHkoInNjYXJvbiIpICAgIC8vbGF0aW4gc21hbGwgbGV0dGVyIHMgd2l0aCBjYXJvbiwgVSswMTYxIElTT2xhdDIKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudGl0eSBZdW1sID0gbmV3IEVudGl0eSgiWXVtbCIpICAgIC8vbGF0aW4gY2FwaXRhbCBsZXR0ZXIgWSB3aXRoIGRpYWVyZXNpcywgVSswMTc4IElTT2xhdDIKKyAgICAKKyAgICAvLyBTcGFjaW5nIE1vZGlmaWVyIExldHRlcnMKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudGl0eSBjaXJjID0gbmV3IEVudGl0eSgiY2lyYyIpICAgIC8vbW9kaWZpZXIgbGV0dGVyIGNpcmN1bWZsZXggYWNjZW50LCBVKzAyQzYgSVNPcHViCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFbnRpdHkgdGlsZGUgPSBuZXcgRW50aXR5KCJ0aWxkZSIpICAvL3NtYWxsIHRpbGRlLCBVKzAyREMgSVNPZGlhCisgICAgCisgICAgLy8gR2VuZXJhbCBQdW5jdHVhdGlvbgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50aXR5IGVuc3AgPSBuZXcgRW50aXR5KCJlbnNwIikgICAgLy9lbiBzcGFjZSwgVSsyMDAyIElTT3B1YgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50aXR5IGVtc3AgPSBuZXcgRW50aXR5KCJlbXNwIikgICAgLy9lbSBzcGFjZSwgVSsyMDAzIElTT3B1YgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50aXR5IHRoaW5zcCA9IG5ldyBFbnRpdHkoInRoaW5zcCIpICAgIC8vdGhpbiBzcGFjZSwgVSsyMDA5IElTT3B1YgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50aXR5IHp3bmogPSBuZXcgRW50aXR5KCJ6d25qIikgICAgLy96ZXJvIHdpZHRoIG5vbi1qb2luZXIsIFUrMjAwQyBORVcgUkZDIDIwNzAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudGl0eSB6d2ogPSBuZXcgRW50aXR5KCJ6d2oiKSAgLy96ZXJvIHdpZHRoIGpvaW5lciwgVSsyMDBEIE5FVyBSRkMgMjA3MAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50aXR5IGxybSA9IG5ldyBFbnRpdHkoImxybSIpICAvL2xlZnQtdG8tcmlnaHQgbWFyaywgVSsyMDBFIE5FVyBSRkMgMjA3MAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50aXR5IHJsbSA9IG5ldyBFbnRpdHkoInJsbSIpICAvL3JpZ2h0LXRvLWxlZnQgbWFyaywgVSsyMDBGIE5FVyBSRkMgMjA3MAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50aXR5IG5kYXNoID0gbmV3IEVudGl0eSgibmRhc2giKSAgLy9lbiBkYXNoLCBVKzIwMTMgSVNPcHViCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFbnRpdHkgbWRhc2ggPSBuZXcgRW50aXR5KCJtZGFzaCIpICAvL2VtIGRhc2gsIFUrMjAxNCBJU09wdWIKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudGl0eSBsc3F1byA9IG5ldyBFbnRpdHkoImxzcXVvIikgIC8vbGVmdCBzaW5nbGUgcXVvdGF0aW9uIG1hcmssIFUrMjAxOCBJU09udW0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudGl0eSByc3F1byA9IG5ldyBFbnRpdHkoInJzcXVvIikgIC8vcmlnaHQgc2luZ2xlIHF1b3RhdGlvbiBtYXJrLCBVKzIwMTkgSVNPbnVtCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFbnRpdHkgc2JxdW8gPSBuZXcgRW50aXR5KCJzYnF1byIpICAvL3NpbmdsZSBsb3ctOSBxdW90YXRpb24gbWFyaywgVSsyMDFBIE5FVworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50aXR5IGxkcXVvID0gbmV3IEVudGl0eSgibGRxdW8iKSAgLy9sZWZ0IGRvdWJsZSBxdW90YXRpb24gbWFyaywgVSsyMDFDIElTT251bQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50aXR5IHJkcXVvID0gbmV3IEVudGl0eSgicmRxdW8iKSAgLy9yaWdodCBkb3VibGUgcXVvdGF0aW9uIG1hcmssIFUrMjAxRCBJU09udW0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudGl0eSBiZHF1byA9IG5ldyBFbnRpdHkoImJkcXVvIikgIC8vZG91YmxlIGxvdy05IHF1b3RhdGlvbiBtYXJrLCBVKzIwMUUgTkVXCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFbnRpdHkgZGFnZ2VyID0gbmV3IEVudGl0eSgiZGFnZ2VyIikgICAgLy9kYWdnZXIsIFUrMjAyMCBJU09wdWIKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudGl0eSBEYWdnZXIgPSBuZXcgRW50aXR5KCJEYWdnZXIiKSAgICAvL2RvdWJsZSBkYWdnZXIsIFUrMjAyMSBJU09wdWIKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudGl0eSBwZXJtaWwgPSBuZXcgRW50aXR5KCJwZXJtaWwiKSAgICAvL3BlciBtaWxsZSBzaWduLCBVKzIwMzAgSVNPdGVjaAorICAgIAorICAgIC8vIGxzYXF1byBpcyBwcm9wb3NlZCBidXQgbm90IHlldCBJU08gc3RhbmRhcmRpemVkCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFbnRpdHkgbHNhcXVvID0gbmV3IEVudGl0eSgibHNhcXVvIikgICAgLy9zaW5nbGUgbGVmdC1wb2ludGluZyBhbmdsZSBxdW90YXRpb24gbWFyaywgVSsyMDM5IElTTyBwcm9wb3NlZAorICAgIAorICAgIC8vIHJzYXF1byBpcyBwcm9wb3NlZCBidXQgbm90IHlldCBJU08gc3RhbmRhcmRpemVkCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFbnRpdHkgcnNhcXVvID0gbmV3IEVudGl0eSgicnNhcXVvIikgICAgLy9zaW5nbGUgcmlnaHQtcG9pbnRpbmcgYW5nbGUgcXVvdGF0aW9uIG1hcmssIFUrMjAzQSBJU08gcHJvcG9zZWQKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudGl0eSBldXJvID0gbmV3IEVudGl0eSgiZXVybyIpICAgIC8vZXVybyBzaWduLCBVKzIwQUMgTkVXCisKKyAgICAKKyAgICBwcml2YXRlIGZpbmFsIGVudGl0eTsKKyAgICAKKyAgICBFbnRpdHkoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5lbnRpdHkgPSAiJiRuYW1lOyIKKyAgICB9CisgICAgCisgICAgRW50aXR5KGludCBuYW1lKSB7CisgICAgICAgIHRoaXMuZW50aXR5ID0gIiYjJG5hbWU7IgorICAgIH0KKyAgICAKKyAgICB2b2lkIGJ1aWxkKEdyb292eU9iamVjdCBidWlsZGVyKSB7CisgICAgICAgIGJ1aWxkZXIudW5lc2NhcGVkIDw8IGVudGl0eQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkveG1sL0ZhY3RvcnlTdXBwb3J0LmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3htbC9GYWN0b3J5U3VwcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ZDhkNTcKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3htbC9GYWN0b3J5U3VwcG9ydC5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGdyb292eS54bWw7CisKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbjsKKworLyoqCisgKiBTdXBwb3J0IGNsYXNzIGZvciBjcmVhdGluZyBYTUwgRmFjdG9yaWVzCisgKi8KK3B1YmxpYyBjbGFzcyBGYWN0b3J5U3VwcG9ydCB7CisgICAgc3RhdGljIE9iamVjdCBjcmVhdGVGYWN0b3J5KFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24gYWN0aW9uKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIE9iamVjdCBmYWN0b3J5OworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmFjdG9yeSA9IEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKGFjdGlvbik7CisgICAgICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gcGFlKSB7CisgICAgICAgICAgICBFeGNlcHRpb24gZSA9IHBhZS5nZXRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgIHRocm93KFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24pIGU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWN0b3J5OworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBjcmVhdGVEb2N1bWVudEJ1aWxkZXJGYWN0b3J5KCkgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24geworICAgICAgICByZXR1cm4gKERvY3VtZW50QnVpbGRlckZhY3RvcnkpIGNyZWF0ZUZhY3RvcnkobmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7CisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFNBWFBhcnNlckZhY3RvcnkgY3JlYXRlU2F4UGFyc2VyRmFjdG9yeSgpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIChTQVhQYXJzZXJGYWN0b3J5KSBjcmVhdGVGYWN0b3J5KG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICByZXR1cm4gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkveG1sL01hcmt1cEJ1aWxkZXIuamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkveG1sL01hcmt1cEJ1aWxkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWI0M2JjCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS94bWwvTWFya3VwQnVpbGRlci5qYXZhCkBAIC0wLDAgKzEsMzk1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgZ3Jvb3Z5LnhtbDsKKworaW1wb3J0IGdyb292eS51dGlsLkJ1aWxkZXJTdXBwb3J0OworaW1wb3J0IGdyb292eS51dGlsLkluZGVudFByaW50ZXI7CisKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIEEgaGVscGVyIGNsYXNzIGZvciBjcmVhdGluZyBYTUwgb3IgSFRNTCBtYXJrdXAKKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEBhdXRob3IgU3RlZmFuIE1hdHRoaWFzIEF1c3QKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnNjb3R0c3RpcmxpbmdAcmNuLmNvbSI+U2NvdHQgU3Rpcmxpbmc8L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBNYXJrdXBCdWlsZGVyIGV4dGVuZHMgQnVpbGRlclN1cHBvcnQgeworICAgIHByaXZhdGUgSW5kZW50UHJpbnRlciBvdXQ7CisgICAgcHJpdmF0ZSBib29sZWFuIG5vc3BhY2U7CisgICAgcHJpdmF0ZSBpbnQgc3RhdGU7CisgICAgcHJpdmF0ZSBib29sZWFuIG5vZGVJc0VtcHR5ID0gdHJ1ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gdXNlRG91YmxlUXVvdGVzID0gZmFsc2U7CisKKyAgICBwdWJsaWMgTWFya3VwQnVpbGRlcigpIHsKKyAgICAgICAgdGhpcyhuZXcgSW5kZW50UHJpbnRlcigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWFya3VwQnVpbGRlcihQcmludFdyaXRlciB3cml0ZXIpIHsKKyAgICAgICAgdGhpcyhuZXcgSW5kZW50UHJpbnRlcih3cml0ZXIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWFya3VwQnVpbGRlcihXcml0ZXIgd3JpdGVyKSB7CisgICAgICAgIHRoaXMobmV3IEluZGVudFByaW50ZXIobmV3IFByaW50V3JpdGVyKHdyaXRlcikpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWFya3VwQnVpbGRlcihJbmRlbnRQcmludGVyIG91dCkgeworICAgICAgICB0aGlzLm91dCA9IG91dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIGF0dHJpYnV0ZSB2YWx1ZXMgYXJlIG91dHB1dCB3aXRoCisgICAgICogZG91YmxlIHF1b3RlczsgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHNpbmdsZSBxdW90ZXMgYXJlIHVzZWQuCisgICAgICogQnkgZGVmYXVsdCwgc2luZ2xlIHF1b3RlcyBhcmUgdXNlZC4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgZG91YmxlIHF1b3RlcyBhcmUgdXNlZCBmb3IgYXR0cmlidXRlcworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldERvdWJsZVF1b3RlcygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudXNlRG91YmxlUXVvdGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciB0aGUgYnVpbGRlciBvdXRwdXRzIGF0dHJpYnV0ZSB2YWx1ZXMgaW4gZG91YmxlCisgICAgICogcXVvdGVzIG9yIHNpbmdsZSBxdW90ZXMuCisgICAgICogQHBhcmFtIHVzZURvdWJsZVF1b3RlcyBJZiB0aGlzIHBhcmFtZXRlciBpcyA8Y29kZT50cnVlPC9jb2RlPiwKKyAgICAgKiBkb3VibGUgcXVvdGVzIGFyZSB1c2VkOyBvdGhlcndpc2UsIHNpbmdsZSBxdW90ZXMgYXJlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERvdWJsZVF1b3Rlcyhib29sZWFuIHVzZURvdWJsZVF1b3RlcykgeworICAgICAgICB0aGlzLnVzZURvdWJsZVF1b3RlcyA9IHVzZURvdWJsZVF1b3RlczsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgSW5kZW50UHJpbnRlciBnZXRQcmludGVyKCkgeworICAgICAgICByZXR1cm4gdGhpcy5vdXQ7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQsIE9iamVjdCBjaGlsZCkgeyB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldE1rcCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgeWllbGQoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIGlmIChzdGF0ZSA9PSAxKSB7CisgICAgICAgICAgICBzdGF0ZSA9IDI7CisgICAgICAgICAgICB0aGlzLm5vZGVJc0VtcHR5ID0gZmFsc2U7CisgICAgICAgICAgICBvdXQucHJpbnQoIj4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RhdGUgPT0gMiB8fCBzdGF0ZSA9PSAzKSB7CisgICAgICAgICAgICBvdXQucHJpbnQoZXNjYXBlRWxlbWVudENvbnRlbnQodmFsdWUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHlpZWxkVW5lc2NhcGVkKFN0cmluZyB2YWx1ZSkgeworICAgICAgICBpZiAoc3RhdGUgPT0gMSkgeworICAgICAgICAgICAgc3RhdGUgPSAyOworICAgICAgICAgICAgdGhpcy5ub2RlSXNFbXB0eSA9IGZhbHNlOworICAgICAgICAgICAgb3V0LnByaW50KCI+Iik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0YXRlID09IDIgfHwgc3RhdGUgPT0gMykgeworICAgICAgICAgICAgb3V0LnByaW50KHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlTm9kZShPYmplY3QgbmFtZSkgeworICAgICAgICB0aGlzLm5vZGVJc0VtcHR5ID0gdHJ1ZTsKKyAgICAgICAgdG9TdGF0ZSgxLCBuYW1lKTsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVOb2RlKE9iamVjdCBuYW1lLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgdG9TdGF0ZSgyLCBuYW1lKTsKKyAgICAgICAgdGhpcy5ub2RlSXNFbXB0eSA9IGZhbHNlOworICAgICAgICBvdXQucHJpbnQoIj4iKTsKKyAgICAgICAgb3V0LnByaW50KGVzY2FwZUVsZW1lbnRDb250ZW50KHZhbHVlLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVOb2RlKE9iamVjdCBuYW1lLCBNYXAgYXR0cmlidXRlcywgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIHRvU3RhdGUoMSwgbmFtZSk7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGF0dHJpYnV0ZXMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgT2JqZWN0IGF0dHJpYnV0ZVZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVWYWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KCIgIik7CisgICAgICAgICAgICAgICAgLy8gT3V0cHV0IHRoZSBhdHRyaWJ1dGUgbmFtZSwKKyAgICAgICAgICAgICAgICBwcmludChlbnRyeS5nZXRLZXkoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAvLyBPdXRwdXQgdGhlIGF0dHJpYnV0ZSB2YWx1ZSB3aXRoaW4gcXVvdGVzLiBVc2Ugd2hpY2hldmVyCisgICAgICAgICAgICAgICAgLy8gdHlwZSBvZiBxdW90ZXMgYXJlIGN1cnJlbnRseSBjb25maWd1cmVkLgorICAgICAgICAgICAgICAgIG91dC5wcmludCh0aGlzLnVzZURvdWJsZVF1b3RlcyA/ICI9XCIiIDogIj0nIik7CisgICAgICAgICAgICAgICAgcHJpbnQoZXNjYXBlQXR0cmlidXRlVmFsdWUoYXR0cmlidXRlVmFsdWUudG9TdHJpbmcoKSkpOworICAgICAgICAgICAgICAgIG91dC5wcmludCh0aGlzLnVzZURvdWJsZVF1b3RlcyA/ICJcIiIgOiAiJyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHlpZWxkKHZhbHVlLnRvU3RyaW5nKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbm9kZUlzRW1wdHkgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVOb2RlKE9iamVjdCBuYW1lLCBNYXAgYXR0cmlidXRlcykgeworICAgICAgICByZXR1cm4gY3JlYXRlTm9kZShuYW1lLCBhdHRyaWJ1dGVzLCBudWxsKTsKKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIHZvaWQgbm9kZUNvbXBsZXRlZChPYmplY3QgcGFyZW50LCBPYmplY3Qgbm9kZSkgeworICAgICAgICB0b1N0YXRlKDMsIG5vZGUpOworICAgICAgICBvdXQuZmx1c2goKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBwcmludChPYmplY3Qgbm9kZSkgeworICAgICAgICBvdXQucHJpbnQobm9kZSA9PSBudWxsID8gIm51bGwiIDogbm9kZS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldE5hbWUoU3RyaW5nIG1ldGhvZE5hbWUpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmdldE5hbWUobWV0aG9kTmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIFN0cmluZyB3aXRoIHNwZWNpYWwgWE1MIGNoYXJhY3RlcnMgZXNjYXBlZCBhcyBlbnRpdGllcyBzbyB0aGF0CisgICAgICogb3V0cHV0IFhNTCBpcyB2YWxpZC4gRXNjYXBlcyB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcnMgYXMgY29ycmVzcG9uZGluZyAKKyAgICAgKiBlbnRpdGllczoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+XCcgYXMgJmFtcDthcG9zOzwvbGk+CisgICAgICogICA8bGk+JmFtcDsgYXMgJmFtcDthbXA7PC9saT4KKyAgICAgKiAgIDxsaT4mbHQ7IGFzICZhbXA7bHQ7PC9saT4KKyAgICAgKiAgIDxsaT4mZ3Q7IGFzICZhbXA7Z3Q7PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIAorICAgICAqIEBwYXJhbSB2YWx1ZSB0byBiZSBzZWFyY2hlZCBhbmQgcmVwbGFjZWQgZm9yIFhNTCBzcGVjaWFsIGNoYXJhY3RlcnMuCisgICAgICogQHJldHVybiB2YWx1ZSB3aXRoIFhNTCBjaGFyYWN0ZXJzIGVzY2FwZWQKKyAgICAgKiBAZGVwcmVjYXRlZAorICAgICAqIEBzZWUgI2VzY2FwZVhtbFZhbHVlKFN0cmluZywgYm9vbGVhbikKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybVZhbHVlKFN0cmluZyB2YWx1ZSkgeworICAgICAgICAvLyAmIGhhcyB0byBiZSBjaGVja2VkIGFuZCByZXBsYWNlZCBiZWZvcmUgb3RoZXJzCisgICAgICAgIGlmICh2YWx1ZS5tYXRjaGVzKCIuKiYuKiIpKSB7CisgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2VBbGwoIiYiLCAiJmFtcDsiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWUubWF0Y2hlcygiLipcXCcuKiIpKSB7CisgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2VBbGwoIlxcJyIsICImYXBvczsiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWUubWF0Y2hlcygiLio8LioiKSkgeworICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlQWxsKCI8IiwgIiZsdDsiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWUubWF0Y2hlcygiLio+LioiKSkgeworICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlQWxsKCI+IiwgIiZndDsiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXNjYXBlcyBhIHN0cmluZyBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIGRpcmVjdGx5IGFzIGFuIFhNTAorICAgICAqIGF0dHJpYnV0ZSB2YWx1ZS4KKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHN0cmluZyB0byBlc2NhcGUuCisgICAgICogQHJldHVybiBBIG5ldyBzdHJpbmcgaW4gd2hpY2ggYWxsIGNoYXJhY3RlcnMgdGhhdCByZXF1aXJlIGVzY2FwaW5nCisgICAgICogaGF2ZSBiZWVuIHJlcGxhY2VkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgWE1MIGVudGl0aWVzLgorICAgICAqIEBzZWUgI2VzY2FwZVhtbFZhbHVlKFN0cmluZywgYm9vbGVhbikKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBlc2NhcGVBdHRyaWJ1dGVWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIGVzY2FwZVhtbFZhbHVlKHZhbHVlLCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFc2NhcGVzIGEgc3RyaW5nIHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgZGlyZWN0bHkgaW4gWE1MIGVsZW1lbnQKKyAgICAgKiBjb250ZW50LgorICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgc3RyaW5nIHRvIGVzY2FwZS4KKyAgICAgKiBAcmV0dXJuIEEgbmV3IHN0cmluZyBpbiB3aGljaCBhbGwgY2hhcmFjdGVycyB0aGF0IHJlcXVpcmUgZXNjYXBpbmcKKyAgICAgKiBoYXZlIGJlZW4gcmVwbGFjZWQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBYTUwgZW50aXRpZXMuCisgICAgICogQHNlZSAjZXNjYXBlWG1sVmFsdWUoU3RyaW5nLCBib29sZWFuKQorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGVzY2FwZUVsZW1lbnRDb250ZW50KFN0cmluZyB2YWx1ZSkgeworICAgICAgICByZXR1cm4gZXNjYXBlWG1sVmFsdWUodmFsdWUsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFc2NhcGVzIGEgc3RyaW5nIHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgaW4gWE1MIHRleHQgc3VjY2Vzc2Z1bGx5LgorICAgICAqIEl0IHJlcGxhY2VzIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVycyB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIFhNTAorICAgICAqIGVudGl0aWVzOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT4mYW1wOyBhcyAmYW1wO2FtcDs8L2xpPgorICAgICAqICAgPGxpPiZsdDsgYXMgJmFtcDtsdDs8L2xpPgorICAgICAqICAgPGxpPiZndDsgYXMgJmFtcDtndDs8L2xpPgorICAgICAqIDwvdWw+CisgICAgICogSWYgdGhlIHN0cmluZyBpcyB0byBiZSBhZGRlZCBhcyBhbiBhdHRyaWJ1dGUgdmFsdWUsIHRoZXNlCisgICAgICogY2hhcmFjdGVycyBhcmUgYWxzbyBlc2NhcGVkOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT4nIGFzICZhbXA7YXBvczs8L2xpPgorICAgICAqIDwvdWw+CisgICAgICogQHBhcmFtIHZhbHVlIFRoZSBzdHJpbmcgdG8gZXNjYXBlLgorICAgICAqIEBwYXJhbSBpc0F0dHJWYWx1ZSA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3RyaW5nIGlzIHRvIGJlIHVzZWQKKyAgICAgKiBhcyBhbiBhdHRyaWJ1dGUgdmFsdWUsIG90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4uCisgICAgICogQHJldHVybiBBIG5ldyBzdHJpbmcgaW4gd2hpY2ggYWxsIGNoYXJhY3RlcnMgdGhhdCByZXF1aXJlIGVzY2FwaW5nCisgICAgICogaGF2ZSBiZWVuIHJlcGxhY2VkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgWE1MIGVudGl0aWVzLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGVzY2FwZVhtbFZhbHVlKFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBpc0F0dHJWYWx1ZSkgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcih2YWx1ZSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwLCBuID0gYnVmZmVyLmxlbmd0aCgpOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGJ1ZmZlci5jaGFyQXQoaSkpIHsKKyAgICAgICAgICAgIGNhc2UgJyYnOgorICAgICAgICAgICAgICAgIGJ1ZmZlci5yZXBsYWNlKGksIGkgKyAxLCAiJmFtcDsiKTsKKworICAgICAgICAgICAgICAgIC8vIFdlJ3JlIHJlcGxhY2luZyBhIHNpbmdsZSBjaGFyYWN0ZXIgYnkgYSBzdHJpbmcgb2YKKyAgICAgICAgICAgICAgICAvLyBsZW5ndGggNSwgc28gd2UgbmVlZCB0byB1cGRhdGUgdGhlIGluZGV4IHZhcmlhYmxlCisgICAgICAgICAgICAgICAgLy8gYW5kIHRoZSB0b3RhbCBsZW5ndGguCisgICAgICAgICAgICAgICAgaSArPSA0OworICAgICAgICAgICAgICAgIG4gKz0gNDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAnPCc6CisgICAgICAgICAgICAgICAgYnVmZmVyLnJlcGxhY2UoaSwgaSArIDEsICImbHQ7Iik7CisKKyAgICAgICAgICAgICAgICAvLyBXZSdyZSByZXBsYWNpbmcgYSBzaW5nbGUgY2hhcmFjdGVyIGJ5IGEgc3RyaW5nIG9mCisgICAgICAgICAgICAgICAgLy8gbGVuZ3RoIDQsIHNvIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBpbmRleCB2YXJpYWJsZQorICAgICAgICAgICAgICAgIC8vIGFuZCB0aGUgdG90YWwgbGVuZ3RoLgorICAgICAgICAgICAgICAgIGkgKz0gMzsKKyAgICAgICAgICAgICAgICBuICs9IDM7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgJz4nOgorICAgICAgICAgICAgICAgIGJ1ZmZlci5yZXBsYWNlKGksIGkgKyAxLCAiJmd0OyIpOworCisgICAgICAgICAgICAgICAgLy8gV2UncmUgcmVwbGFjaW5nIGEgc2luZ2xlIGNoYXJhY3RlciBieSBhIHN0cmluZyBvZgorICAgICAgICAgICAgICAgIC8vIGxlbmd0aCA0LCBzbyB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgaW5kZXggdmFyaWFibGUKKyAgICAgICAgICAgICAgICAvLyBhbmQgdGhlIHRvdGFsIGxlbmd0aC4KKyAgICAgICAgICAgICAgICBpICs9IDM7CisgICAgICAgICAgICAgICAgbiArPSAzOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlICciJzoKKyAgICAgICAgICAgICAgICAvLyBUaGUgZG91YmxlIHF1b3RlIGlzIG9ubHkgZXNjYXBlZCBpZiB0aGUgdmFsdWUgaXMgZm9yCisgICAgICAgICAgICAgICAgLy8gYW4gYXR0cmlidXRlIGFuZCB0aGUgYnVpbGRlciBpcyBjb25maWd1cmVkIHRvIG91dHB1dAorICAgICAgICAgICAgICAgIC8vIGF0dHJpYnV0ZSB2YWx1ZXMgaW5zaWRlIGRvdWJsZSBxdW90ZXMuCisgICAgICAgICAgICAgICAgaWYgKGlzQXR0clZhbHVlICYmIHRoaXMudXNlRG91YmxlUXVvdGVzKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5yZXBsYWNlKGksIGkgKyAxLCAiJnF1b3Q7Iik7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UncmUgcmVwbGFjaW5nIGEgc2luZ2xlIGNoYXJhY3RlciBieSBhIHN0cmluZyBvZgorICAgICAgICAgICAgICAgICAgICAvLyBsZW5ndGggNiwgc28gd2UgbmVlZCB0byB1cGRhdGUgdGhlIGluZGV4IHZhcmlhYmxlCisgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGUgdG90YWwgbGVuZ3RoLgorICAgICAgICAgICAgICAgICAgICBpICs9IDU7CisgICAgICAgICAgICAgICAgICAgIG4gKz0gNTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgJ1wnJzoKKyAgICAgICAgICAgICAgICAvLyBUaGUgYXBvc3Ryb3BoZSBpcyBvbmx5IGVzY2FwZWQgaWYgdGhlIHZhbHVlIGlzIGZvciBhbgorICAgICAgICAgICAgICAgIC8vIGF0dHJpYnV0ZSwgYXMgb3Bwb3NlZCB0byBlbGVtZW50IGNvbnRlbnQsIGFuZCBpZiB0aGUKKyAgICAgICAgICAgICAgICAvLyBidWlsZGVyIGlzIGNvbmZpZ3VyZWQgdG8gc3Vycm91bmQgYXR0cmlidXRlIHZhbHVlcyB3aXRoCisgICAgICAgICAgICAgICAgLy8gc2luZ2xlIHF1b3Rlcy4KKyAgICAgICAgICAgICAgICBpZiAoaXNBdHRyVmFsdWUgJiYgIXRoaXMudXNlRG91YmxlUXVvdGVzKXsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLnJlcGxhY2UoaSwgaSArIDEsICImYXBvczsiKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBXZSdyZSByZXBsYWNpbmcgYSBzaW5nbGUgY2hhcmFjdGVyIGJ5IGEgc3RyaW5nIG9mCisgICAgICAgICAgICAgICAgICAgIC8vIGxlbmd0aCA2LCBzbyB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgaW5kZXggdmFyaWFibGUKKyAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHRoZSB0b3RhbCBsZW5ndGguCisgICAgICAgICAgICAgICAgICAgIGkgKz0gNTsKKyAgICAgICAgICAgICAgICAgICAgbiArPSA1OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdG9TdGF0ZShpbnQgbmV4dCwgT2JqZWN0IG5hbWUpIHsKKyAgICAgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIHN3aXRjaCAobmV4dCkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiPCIpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQobmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIHN3aXRjaCAobmV4dCkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiPiIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vc3BhY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3NwYWNlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmluY3JlbWVudEluZGVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludEluZGVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCI8Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludChuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZUlzRW1wdHkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiAvPiIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIHN3aXRjaCAobmV4dCkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiPCIpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQobmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCI8LyIpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQobmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIj4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG5leHQpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9zcGFjZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vc3BhY2UgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRJbmRlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiPCIpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQobmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vc3BhY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3NwYWNlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmRlY3JlbWVudEluZGVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludEluZGVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCI8LyIpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQobmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIj4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZSA9IG5leHQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS94bWwvTmFtZXNwYWNlLmphdmEgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3htbC9OYW1lc3BhY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjAxNzhkCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS94bWwvTmFtZXNwYWNlLmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGdyb292eS54bWw7CisKKy8qKgorICogQSBzaW1wbGUgaGVscGVyIGNsYXNzIHdoaWNoIGFjdHMgYXMgYSBmYWN0b3J5IG9mIHtAbGluayBRTmFtZX0gaW5zdGFuY2VzLgorICogCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBOYW1lc3BhY2UgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgdXJpOworICAgIHByaXZhdGUgU3RyaW5nIHByZWZpeDsKKworICAgIHB1YmxpYyBOYW1lc3BhY2UoKSB7CisgICAgfQorCisgICAgcHVibGljIE5hbWVzcGFjZShTdHJpbmcgdXJpKSB7CisgICAgICAgIHRoaXMudXJpID0gdXJpOworICAgIH0KKworICAgIHB1YmxpYyBOYW1lc3BhY2UoU3RyaW5nIHVyaSwgU3RyaW5nIHByZWZpeCkgeworICAgICAgICB0aGlzLnVyaSA9IHVyaTsKKyAgICAgICAgdGhpcy5wcmVmaXggPSBwcmVmaXg7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgUU5hbWUgZm9yIHRoZSBnaXZlbiBsb2NhbE5hbWUuCisgICAgICogCisgICAgICogQHBhcmFtIGxvY2FsTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGxvY2FsIG5hbWUgd2l0aGluIHRoaXMKKyAgICAgKi8KKyAgICBwdWJsaWMgUU5hbWUgZ2V0KFN0cmluZyBsb2NhbE5hbWUpIHsKKyAgICAgICAgaWYgKHVyaSAhPSBudWxsICYmIHVyaS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIGlmIChwcmVmaXggIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUU5hbWUodXJpLCBsb2NhbE5hbWUsIHByZWZpeCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFFOYW1lKHVyaSwgbG9jYWxOYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUU5hbWUobG9jYWxOYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHByZWZpeCBtYXBwZWQgdG8gdGhpcyBuYW1lc3BhY2UKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBwcmVmaXggYXNzaWduZWQgdG8gdGhpcyBuYW1lc3BhY2Ugb3IgbnVsbCBpZiBubyBuYW1lc3BhY2UgaXMKKyAgICAgKiAgICAgICAgIG1hcHBlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKKyAgICAgICAgcmV0dXJuIHByZWZpeDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBVUkkgb2YgdGhpcyBuYW1lc3BhY2UKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBVUkkgb2YgdGhpcyBuYW1lc3BhY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFVyaSgpIHsKKyAgICAgICAgcmV0dXJuIHVyaTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkveG1sL05hbWVzcGFjZUJ1aWxkZXIuamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkveG1sL05hbWVzcGFjZUJ1aWxkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGQ2ZDU4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS94bWwvTmFtZXNwYWNlQnVpbGRlci5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBncm9vdnkueG1sOworCitpbXBvcnQgZ3Jvb3Z5LnV0aWwuQnVpbGRlclN1cHBvcnQ7CisKKy8qKgorICogQSBoZWxwZXIgY2xhc3MgZm9yIGNyZWF0aW5nIG5hbWVzcGFjZXMgZm9yIEdyb292eU1hcmt1cAorICogCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgTmFtZXNwYWNlQnVpbGRlciB7CisKKyAgICBwcml2YXRlIEJ1aWxkZXJTdXBwb3J0IGJ1aWxkZXI7CisKKyAgICBwdWJsaWMgc3RhdGljIE5hbWVzcGFjZUJ1aWxkZXJTdXBwb3J0IG5ld0luc3RhbmNlKEJ1aWxkZXJTdXBwb3J0IGJ1aWxkZXIsIFN0cmluZyB1cmkpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBOYW1lc3BhY2VCdWlsZGVyKGJ1aWxkZXIpLm5hbWVzcGFjZSh1cmkpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIE5hbWVzcGFjZUJ1aWxkZXJTdXBwb3J0IG5ld0luc3RhbmNlKEJ1aWxkZXJTdXBwb3J0IGJ1aWxkZXIsIFN0cmluZyB1cmksIFN0cmluZyBwcmVmaXgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBOYW1lc3BhY2VCdWlsZGVyKGJ1aWxkZXIpLm5hbWVzcGFjZSh1cmksIHByZWZpeCk7CisgICAgfQorCisgICAgcHVibGljIE5hbWVzcGFjZUJ1aWxkZXIoQnVpbGRlclN1cHBvcnQgYnVpbGRlcikgeworICAgICAgICB0aGlzLmJ1aWxkZXIgPSBidWlsZGVyOworICAgIH0KKworICAgIHB1YmxpYyBOYW1lc3BhY2VCdWlsZGVyU3VwcG9ydCBuYW1lc3BhY2UoU3RyaW5nIHVyaSkgeworICAgICAgICByZXR1cm4gbmFtZXNwYWNlKHVyaSwgIiIpOworICAgIH0KKworICAgIHB1YmxpYyBOYW1lc3BhY2VCdWlsZGVyU3VwcG9ydCBuYW1lc3BhY2UoU3RyaW5nIHVyaSwgU3RyaW5nIHByZWZpeCkgeworICAgICAgICByZXR1cm4gbmV3IE5hbWVzcGFjZUJ1aWxkZXJTdXBwb3J0KGJ1aWxkZXIsIHVyaSwgcHJlZml4KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3htbC9OYW1lc3BhY2VCdWlsZGVyU3VwcG9ydC5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS94bWwvTmFtZXNwYWNlQnVpbGRlclN1cHBvcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzkxZGVmCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS94bWwvTmFtZXNwYWNlQnVpbGRlclN1cHBvcnQuamF2YQpAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgZ3Jvb3Z5LnhtbDsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBncm9vdnkudXRpbC5CdWlsZGVyU3VwcG9ydDsKKworCisvKioKKyAqIEEgaGVscGVyIGNsYXNzIGZvciBjcmVhdGluZyBuYW1lc3BhY2VkIEdyb292eU1hcmt1cAorICogCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgTmFtZXNwYWNlQnVpbGRlclN1cHBvcnQgZXh0ZW5kcyBCdWlsZGVyU3VwcG9ydCB7CisKKyAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBidWlsZGVyOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHVyaTsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBwcmVmaXg7CisKKyAgICBwdWJsaWMgTmFtZXNwYWNlQnVpbGRlclN1cHBvcnQoQnVpbGRlclN1cHBvcnQgYnVpbGRlciwgU3RyaW5nIHVyaSkgeworICAgICAgICB0aGlzKGJ1aWxkZXIsIHVyaSwgIiIpOworICAgIH0KKworICAgIHB1YmxpYyBOYW1lc3BhY2VCdWlsZGVyU3VwcG9ydChCdWlsZGVyU3VwcG9ydCBidWlsZGVyLCBTdHJpbmcgdXJpLCBTdHJpbmcgcHJlZml4KSB7CisgICAgICAgIHN1cGVyKGJ1aWxkZXIpOworICAgICAgICB0aGlzLmJ1aWxkZXIgPSBidWlsZGVyOworICAgICAgICB0aGlzLnVyaSA9IHVyaTsKKyAgICAgICAgdGhpcy5wcmVmaXggPSBwcmVmaXg7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQsIE9iamVjdCBjaGlsZCkgeworICAgIH0KKworICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0TmFtZShTdHJpbmcgbWV0aG9kTmFtZSkgeworICAgICAgICByZXR1cm4gbmV3IFFOYW1lKHVyaSwgbWV0aG9kTmFtZSwgcHJlZml4KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZU5vZGUoT2JqZWN0IG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVOb2RlKE9iamVjdCBuYW1lLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVOb2RlKE9iamVjdCBuYW1lLCBNYXAgYXR0cmlidXRlcykgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZU5vZGUoT2JqZWN0IG5hbWUsIE1hcCBhdHRyaWJ1dGVzLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS94bWwvUU5hbWUuamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkveG1sL1FOYW1lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA3OTg2ZgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkveG1sL1FOYW1lLmphdmEKQEAgLTAsMCArMSwzMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBncm9vdnkueG1sOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworCisvKioKKyAqIDxjb2RlPlFOYW1lPC9jb2RlPiBjbGFzcyByZXByZXNlbnRzIHRoZSB2YWx1ZSBvZiBhIHF1YWxpZmllZCBuYW1lCisgKiBhcyBzcGVjaWZpZWQgaW4gPGEgaHJlZj0iIGh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNRTmFtZSAiPlhNTAorICogU2NoZW1hIFBhcnQyOiBEYXRhdHlwZXMgc3BlY2lmaWNhdGlvbjwvYT4uCisgKiA8cD4KKyAqIFRoZSB2YWx1ZSBvZiBhIFFOYW1lIGNvbnRhaW5zIGEgPGI+bmFtZXNwYWNlVVJJPC9iPiwgYSA8Yj5sb2NhbFBhcnQ8L2I+IGFuZCBhIDxiPnByZWZpeDwvYj4uCisgKiBUaGUgbG9jYWxQYXJ0IHByb3ZpZGVzIHRoZSBsb2NhbCBwYXJ0IG9mIHRoZSBxdWFsaWZpZWQgbmFtZS4gVGhlCisgKiBuYW1lc3BhY2VVUkkgaXMgYSBVUkkgcmVmZXJlbmNlIGlkZW50aWZ5aW5nIHRoZSBuYW1lc3BhY2UuCisgKgorICogQHZlcnNpb24gMS4xCisgKi8KK3B1YmxpYyBjbGFzcyBRTmFtZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKyAgICAvKiogY29tbWVudC9zaGFyZWQgZW1wdHkgc3RyaW5nICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZX1NUUklORyA9ICIiLmludGVybigpOworCisgICAgLyoqIEZpZWxkIG5hbWVzcGFjZVVSSSAqLworICAgIHByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZVVSSTsKKworICAgIC8qKiBGaWVsZCBsb2NhbFBhcnQgKi8KKyAgICBwcml2YXRlIFN0cmluZyBsb2NhbFBhcnQ7CisKKyAgICAvKiogRmllbGQgcHJlZml4ICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcHJlZml4OworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIHRoZSBRTmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsb2NhbFBhcnQgTG9jYWwgcGFydCBvZiB0aGUgUU5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgUU5hbWUoU3RyaW5nIGxvY2FsUGFydCkgeworICAgICAgICB0aGlzKEVNUFRZX1NUUklORywgbG9jYWxQYXJ0LCBFTVBUWV9TVFJJTkcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciB0aGUgUU5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZXNwYWNlVVJJIE5hbWVzcGFjZSBVUkkgZm9yIHRoZSBRTmFtZQorICAgICAqIEBwYXJhbSBsb2NhbFBhcnQgTG9jYWwgcGFydCBvZiB0aGUgUU5hbWUuCisgICAgICovCisgICAgcHVibGljIFFOYW1lKFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbFBhcnQpIHsKKyAgICAgICAgdGhpcyhuYW1lc3BhY2VVUkksIGxvY2FsUGFydCwgRU1QVFlfU1RSSU5HKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgdGhlIFFOYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWVzcGFjZVVSSSBOYW1lc3BhY2UgVVJJIGZvciB0aGUgUU5hbWUKKyAgICAgKiBAcGFyYW0gbG9jYWxQYXJ0IExvY2FsIHBhcnQgb2YgdGhlIFFOYW1lLgorICAgICAqIEBwYXJhbSBwcmVmaXggUHJlZml4IG9mIHRoZSBRTmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUU5hbWUoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsUGFydCwgU3RyaW5nIHByZWZpeCkgeworICAgICAgICB0aGlzLm5hbWVzcGFjZVVSSSA9IChuYW1lc3BhY2VVUkkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICA/IEVNUFRZX1NUUklORworICAgICAgICAgICAgICAgIDogbmFtZXNwYWNlVVJJLmludGVybigpOworICAgICAgICBpZiAobG9jYWxQYXJ0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgUU5hbWUgbG9jYWwgcGFydCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy5sb2NhbFBhcnQgPSBsb2NhbFBhcnQuaW50ZXJuKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgUU5hbWUgcHJlZml4Iik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aGlzLnByZWZpeCA9IHByZWZpeC5pbnRlcm4oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIE5hbWVzcGFjZSBVUkkgZm9yIHRoaXMgUU5hbWUKKyAgICAgKgorICAgICAqIEByZXR1cm4gTmFtZXNwYWNlIFVSSQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkgeworICAgICAgICByZXR1cm4gbmFtZXNwYWNlVVJJOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIExvY2FsIHBhcnQgZm9yIHRoaXMgUU5hbWUKKyAgICAgKgorICAgICAqIEByZXR1cm4gTG9jYWwgcGFydAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxQYXJ0KCkgeworICAgICAgICByZXR1cm4gbG9jYWxQYXJ0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIFByZWZpeCBmb3IgdGhpcyBRTmFtZQorICAgICAqCisgICAgICogQHJldHVybiBQcmVmaXgKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKKyAgICAgICAgcmV0dXJuIHByZWZpeDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGlzIFFOYW1lCisgICAgICoKKyAgICAgKiBAcmV0dXJuICBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgUU5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllZE5hbWUoKSB7CisKKyAgICAgICAgcmV0dXJuICgocHJlZml4LmVxdWFscyhFTVBUWV9TVFJJTkcpKQorICAgICAgICAgICAgICAgID8gbG9jYWxQYXJ0CisgICAgICAgICAgICAgICAgOiBwcmVmaXggKyAnOicgKyBsb2NhbFBhcnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBRTmFtZQorICAgICAqCisgICAgICogQHJldHVybiAgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIFFOYW1lCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKworICAgICAgICByZXR1cm4gKChuYW1lc3BhY2VVUkkuZXF1YWxzKEVNUFRZX1NUUklORykpCisgICAgICAgICAgICAgICAgPyBsb2NhbFBhcnQKKyAgICAgICAgICAgICAgICA6ICd7JyArIG5hbWVzcGFjZVVSSSArICd9JyArIGxvY2FsUGFydCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhpcyBRTmFtZSBmb3IgZXF1YWxpdHkgd2l0aCBhbm90aGVyIG9iamVjdC4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUgZ2l2ZW4gb2JqZWN0IGlzIG5vdCBhIFFOYW1lIG9yIFN0cmluZyBlcXVpdmFsZW50IG9yIGlzIG51bGwgdGhlbiB0aGlzIG1ldGhvZAorICAgICAqIHJldHVybnMgPHR0PmZhbHNlPC90dD4uCisgICAgICogPHA+CisgICAgICogRm9yIHR3byBRTmFtZXMgdG8gYmUgY29uc2lkZXJlZCBlcXVhbCByZXF1aXJlcyB0aGF0IGJvdGgKKyAgICAgKiBsb2NhbFBhcnQgYW5kIG5hbWVzcGFjZVVSSSBtdXN0IGJlIGVxdWFsLiBUaGlzIG1ldGhvZCB1c2VzCisgICAgICogPGNvZGU+U3RyaW5nLmVxdWFsczwvY29kZT4gdG8gY2hlY2sgZXF1YWxpdHkgb2YgbG9jYWxQYXJ0CisgICAgICogYW5kIG5hbWVzcGFjZVVSSS4gQW55IGNsYXNzIHRoYXQgZXh0ZW5kcyBRTmFtZSBpcyByZXF1aXJlZAorICAgICAqIHRvIHNhdGlzZnkgdGhpcyBlcXVhbGl0eSBjb250cmFjdC4KKyAgICAgKgorICAgICAqIElmIHRoZSBzdXBwbGllZCBvYmplY3QgaXMgYSBTdHJpbmcsIHRoZW4gaXQgaXMgc3BsaXQgaW4gdHdvIG9uIHRoZSBsYXN0IGNvbG9uCisgICAgICogYW5kIHRoZSBmaXJzdCBoYWxmIGlzIGNvbXBhcmVkIGFnYWluc3QgdGhlIHByZWZpeCB8fCBuYW1lc3BhY2VVUkkKKyAgICAgKiBhbmQgdGhlIHNlY29uZCBoYWxmIGlzIGNvbXBhcmVkIGFnYWluc3QgdGhlIGxvY2FsUGFydAorICAgICAqCisgICAgICogaS5lLiBhc3NlcnQgbmV3IFFOYW1lKCJuYW1lc3BhY2UiLCJsb2NhbFBhcnQiKS5lcXVhbHMoIm5hbWVzcGFjZTpsb2NhbFBhcnQiKQorICAgICAqCisgICAgICogSW50ZW5kZWQgVXNhZ2U6IGZvciBncGF0aCBhY2Nlc3NvcnMsIGUuZy4gcm9vdC4ndXJuOm15bmFtZXNwYWNlOm5vZGUnCisgICAgICoKKyAgICAgKiBXYXJuaW5nOiB0aGlzIGVxdWl2YWxlbmNlIGlzIG5vdCBjb21tdXRhdGl2ZSwKKyAgICAgKiBpLmUuIHFuYW1lLmVxdWFscyhzdHJpbmcpIG1heSBiZSB0cnVlL2ZhbHNlICBidXQgc3RyaW5nLmVxdWFscyhxbmFtZSkgaXMgYWx3YXlzIGZhbHNlCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCBzYXRpc2ZpZXMgdGhlIGdlbmVyYWwgY29udHJhY3Qgb2YgdGhlIDxjb2RlPk9iamVjdC5lcXVhbHM8L2NvZGU+IG1ldGhvZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvIHRoZSByZWZlcmVuY2Ugb2JqZWN0IHdpdGggd2hpY2ggdG8gY29tcGFyZQorICAgICAqCisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGlkZW50aWNhbCB0byB0aGlzCisgICAgICogICAgICBRTmFtZTogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgaWYgKHRoaXMgPT0gbykgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChvID09IG51bGwpIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBRTmFtZSkgeworICAgICAgICAgICAgZmluYWwgUU5hbWUgcU5hbWUgPSAoUU5hbWUpIG87CisgICAgICAgICAgICBpZiAoIW5hbWVzcGFjZVVSSS5lcXVhbHMocU5hbWUubmFtZXNwYWNlVVJJKSkgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIGxvY2FsUGFydC5lcXVhbHMocU5hbWUubG9jYWxQYXJ0KTsKKworICAgICAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBTdHJpbmcpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzdHJpbmcgPSAoU3RyaW5nKW87CisgICAgICAgICAgICBpZiAoc3RyaW5nLmxlbmd0aCgpID09IDApIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGludCBsYXN0Q29sb25JbmRleCA9IHN0cmluZy5sYXN0SW5kZXhPZigiOiIpOworICAgICAgICAgICAgaWYgKGxhc3RDb2xvbkluZGV4IDwgMCB8fCBsYXN0Q29sb25JbmRleCA9PSBzdHJpbmcubGVuZ3RoKCkgLSAxKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc3RyaW5nUHJlZml4ID0gc3RyaW5nLnN1YnN0cmluZygwLGxhc3RDb2xvbkluZGV4KTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzdHJpbmdMb2NhbFBhcnQgPSBzdHJpbmcuc3Vic3RyaW5nKGxhc3RDb2xvbkluZGV4ICsgMSk7CisgICAgICAgICAgICBpZiAoc3RyaW5nUHJlZml4LmVxdWFscyhwcmVmaXgpIHx8IHN0cmluZ1ByZWZpeC5lcXVhbHMobmFtZXNwYWNlVVJJKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbFBhcnQuZXF1YWxzKHN0cmluZ0xvY2FsUGFydCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIGlmIHRoaXMgUU5hbWUgbWF0Y2hlcyBhbm90aGVyIG9iamVjdC4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUgZ2l2ZW4gb2JqZWN0IGlzIG5vdCBhIFFOYW1lIG9yIFN0cmluZyBlcXVpdmFsZW50IG9yIGlzIG51bGwgdGhlbiB0aGlzIG1ldGhvZAorICAgICAqIHJldHVybnMgPHR0PmZhbHNlPC90dD4uCisgICAgICogPHA+CisgICAgICogRm9yIHR3byBRTmFtZXMgdG8gYmUgY29uc2lkZXJlZCBtYXRjaGluZyByZXF1aXJlcyB0aGF0IGJvdGgKKyAgICAgKiBsb2NhbFBhcnQgYW5kIG5hbWVzcGFjZVVSSSBtdXN0IGJlIGVxdWFsIG9yIG9uZSBvZiB0aGVtIGlzIGEgd2lsZGNhcmQuCisgICAgICoKKyAgICAgKiBJZiB0aGUgc3VwcGxpZWQgb2JqZWN0IGlzIGEgU3RyaW5nLCB0aGVuIGl0IGlzIHNwbGl0IGluIHR3byBvbiB0aGUgbGFzdCBjb2xvbgorICAgICAqIGFuZCB0aGUgZmlyc3QgaGFsZiBpcyBtYXRjaGVkIGFnYWluc3QgdGhlIHByZWZpeCB8fCBuYW1lc3BhY2VVUkkKKyAgICAgKiBhbmQgdGhlIHNlY29uZCBoYWxmIGlzIG1hdGNoZWQgYWdhaW5zdCB0aGUgbG9jYWxQYXJ0CisgICAgICoKKyAgICAgKiBAcGFyYW0gbyB0aGUgcmVmZXJlbmNlIG9iamVjdCB3aXRoIHdoaWNoIHRvIGNvbXBhcmUKKyAgICAgKgorICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIG9iamVjdCBtYXRjaGVzCisgICAgICogdGhpcyBRTmFtZTogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKE9iamVjdCBvKSB7CisgICAgICAgIGlmICh0aGlzID09IG8pIHJldHVybiB0cnVlOworICAgICAgICBpZiAobyA9PSBudWxsKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChvIGluc3RhbmNlb2YgUU5hbWUpIHsKKyAgICAgICAgICAgIGZpbmFsIFFOYW1lIHFOYW1lID0gKFFOYW1lKSBvOworICAgICAgICAgICAgaWYgKCFuYW1lc3BhY2VVUkkuZXF1YWxzKHFOYW1lLm5hbWVzcGFjZVVSSSkgJiYgIW5hbWVzcGFjZVVSSS5lcXVhbHMoIioiKSAmJiAhcU5hbWUubmFtZXNwYWNlVVJJLmVxdWFscygiKiIpKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gbG9jYWxQYXJ0LmVxdWFscyhxTmFtZS5sb2NhbFBhcnQpIHx8IGxvY2FsUGFydC5lcXVhbHMoIioiKSB8fCBxTmFtZS5sb2NhbFBhcnQuZXF1YWxzKCIqIik7CisgICAgICAgIH0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIFN0cmluZykgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHN0cmluZyA9IChTdHJpbmcpbzsKKyAgICAgICAgICAgIGlmIChzdHJpbmcubGVuZ3RoKCkgPT0gMCkgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgLy8gdHJ5IG1hdGNoaW5nIGFnYWluc3QgJ3ByZWZpeDpsb2NhbG5hbWUnCisgICAgICAgICAgICBpbnQgbGFzdENvbG9uSW5kZXggPSBzdHJpbmcubGFzdEluZGV4T2YoIjoiKTsKKyAgICAgICAgICAgIGlmIChsYXN0Q29sb25JbmRleCA8IDAgfHwgbGFzdENvbG9uSW5kZXggPT0gc3RyaW5nLmxlbmd0aCgpIC0gMSkgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHN0cmluZ1ByZWZpeCA9IHN0cmluZy5zdWJzdHJpbmcoMCxsYXN0Q29sb25JbmRleCk7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc3RyaW5nTG9jYWxQYXJ0ID0gc3RyaW5nLnN1YnN0cmluZyhsYXN0Q29sb25JbmRleCArIDEpOworICAgICAgICAgICAgaWYgKHN0cmluZ1ByZWZpeC5lcXVhbHMocHJlZml4KSB8fCBzdHJpbmdQcmVmaXguZXF1YWxzKG5hbWVzcGFjZVVSSSkgfHwgc3RyaW5nUHJlZml4LmVxdWFscygiKiIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsUGFydC5lcXVhbHMoc3RyaW5nTG9jYWxQYXJ0KSB8fCBzdHJpbmdMb2NhbFBhcnQuZXF1YWxzKCIqIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBRTmFtZSBob2xkaW5nIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIFN0cmluZy4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgc3RyaW5nIG11c3QgYmUgaW4gdGhlIGZvcm0gcmV0dXJuZWQgYnkgdGhlIFFOYW1lLnRvU3RyaW5nKCkKKyAgICAgKiBtZXRob2QsIGkuZS4gIntuYW1lc3BhY2VVUkl9bG9jYWxQYXJ0Iiwgd2l0aCB0aGUgIntuYW1lc3BhY2VVUkl9IgorICAgICAqIHBhcnQgYmVpbmcgb3B0aW9uYWwuCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgZG9lc24ndCBkbyBhIGZ1bGwgdmFsaWRhdGlvbiBvZiB0aGUgcmVzdWx0aW5nIFFOYW1lLgorICAgICAqIEluIHBhcnRpY3VsYXIsIGl0IGRvZXNuJ3QgY2hlY2sgdGhhdCB0aGUgcmVzdWx0aW5nIG5hbWVzcGFjZSBVUkkKKyAgICAgKiBpcyBhIGxlZ2FsIFVSSSAocGVyIFJGQyAyMzk2IGFuZCBSRkMgMjczMiksIG5vciB0aGF0IHRoZSByZXN1bHRpbmcKKyAgICAgKiBsb2NhbCBwYXJ0IGlzIGEgbGVnYWwgTkNOYW1lIHBlciB0aGUgWE1MIE5hbWVzcGFjZXMgc3BlY2lmaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzIHRoZSBzdHJpbmcgdG8gYmUgcGFyc2VkCisgICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIElmIHRoZSBzcGVjaWZpZWQgU3RyaW5nIGNhbm5vdCBiZSBwYXJzZWQgYXMgYSBRTmFtZQorICAgICAqIEByZXR1cm4gUU5hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gU3RyaW5nCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBRTmFtZSB2YWx1ZU9mKFN0cmluZyBzKSB7CisKKyAgICAgICAgaWYgKChzID09IG51bGwpIHx8IHMuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBRTmFtZSBsaXRlcmFsIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAocy5jaGFyQXQoMCkgPT0gJ3snKSB7CisgICAgICAgICAgICBpbnQgaSA9IHMuaW5kZXhPZignfScpOworCisgICAgICAgICAgICBpZiAoaSA9PSAtMSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgUU5hbWUgbGl0ZXJhbCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaSA9PSBzLmxlbmd0aCgpIC0gMSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgUU5hbWUgbGl0ZXJhbCIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFFOYW1lKHMuc3Vic3RyaW5nKDEsIGkpLCBzLnN1YnN0cmluZyhpICsgMSkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBRTmFtZShzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBoYXNoIGNvZGUgdmFsdWUgZm9yIHRoaXMgUU5hbWUgb2JqZWN0LiBUaGUgaGFzaCBjb2RlCisgICAgICogaXMgYmFzZWQgb24gYm90aCB0aGUgbG9jYWxQYXJ0IGFuZCBuYW1lc3BhY2VVUkkgcGFydHMgb2YgdGhlCisgICAgICogUU5hbWUuIFRoaXMgbWV0aG9kIHNhdGlzZmllcyB0aGUgIGdlbmVyYWwgY29udHJhY3Qgb2YgdGhlCisgICAgICogPGNvZGU+T2JqZWN0Lmhhc2hDb2RlPC9jb2RlPiBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgaGFzaCBjb2RlIHZhbHVlIGZvciB0aGlzIFFuYW1lIG9iamVjdAorICAgICAqLworICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGludCByZXN1bHQ7CisgICAgICAgIHJlc3VsdCA9IG5hbWVzcGFjZVVSSS5oYXNoQ29kZSgpOworICAgICAgICByZXN1bHQgPSAyOSAqIHJlc3VsdCArIGxvY2FsUGFydC5oYXNoQ29kZSgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuc3VyZSB0aGF0IGRlc2VyaWFsaXphdGlvbiBwcm9wZXJseSBpbnRlcm5zIHRoZSByZXN1bHRzLgorICAgICAqIEBwYXJhbSBpbiB0aGUgT2JqZWN0SW5wdXRTdHJlYW0gdG8gYmUgcmVhZAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KE9iamVjdElucHV0U3RyZWFtIGluKSB0aHJvd3MKKyAgICAgICAgICAgIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgaW4uZGVmYXVsdFJlYWRPYmplY3QoKTsKKworICAgICAgICBuYW1lc3BhY2VVUkkgPSBuYW1lc3BhY2VVUkkuaW50ZXJuKCk7CisgICAgICAgIGxvY2FsUGFydCA9IGxvY2FsUGFydC5pbnRlcm4oKTsKKyAgICAgICAgcHJlZml4ID0gcHJlZml4LmludGVybigpOworICAgIH0KK30gClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS94bWwvU0FYQnVpbGRlci5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS94bWwvU0FYQnVpbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3M2Q2ODEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3htbC9TQVhCdWlsZGVyLmphdmEKQEAgLTAsMCArMSwxNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBncm9vdnkueG1sOworCitpbXBvcnQgZ3Jvb3Z5LnV0aWwuQnVpbGRlclN1cHBvcnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7CitpbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuQXR0cmlidXRlc0ltcGw7CisKKy8qKgorICogQSBoZWxwZXIgY2xhc3MgZm9yIGNyZWF0aW5nIGEgVzNDIEQKKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIFNBWEJ1aWxkZXIgZXh0ZW5kcyBCdWlsZGVyU3VwcG9ydCB7CisKKyAgICBwcml2YXRlIENvbnRlbnRIYW5kbGVyIGhhbmRsZXI7CisgICAgcHJpdmF0ZSBBdHRyaWJ1dGVzIGVtcHR5QXR0cmlidXRlcyA9IG5ldyBBdHRyaWJ1dGVzSW1wbCgpOworCisgICAgcHVibGljIFNBWEJ1aWxkZXIoQ29udGVudEhhbmRsZXIgaGFuZGxlcikgeworICAgICAgICB0aGlzLmhhbmRsZXIgPSBoYW5kbGVyOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50LCBPYmplY3QgY2hpbGQpIHsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZU5vZGUoT2JqZWN0IG5hbWUpIHsKKyAgICAgICAgZG9TdGFydEVsZW1lbnQobmFtZSwgZW1wdHlBdHRyaWJ1dGVzKTsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVOb2RlKE9iamVjdCBuYW1lLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgZG9TdGFydEVsZW1lbnQobmFtZSwgZW1wdHlBdHRyaWJ1dGVzKTsKKyAgICAgICAgZG9UZXh0KHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHZhbHVlCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGRvVGV4dChPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNoYXJbXSB0ZXh0ID0gdmFsdWUudG9TdHJpbmcoKS50b0NoYXJBcnJheSgpOworICAgICAgICAgICAgaGFuZGxlci5jaGFyYWN0ZXJzKHRleHQsIDAsIHRleHQubGVuZ3RoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGhhbmRsZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlTm9kZShPYmplY3QgbmFtZSwgTWFwIGF0dHJpYnV0ZU1hcCwgT2JqZWN0IHRleHQpIHsKKyAgICAgICAgQXR0cmlidXRlc0ltcGwgYXR0cmlidXRlcyA9IG5ldyBBdHRyaWJ1dGVzSW1wbCgpOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhdHRyaWJ1dGVNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgT2JqZWN0IGtleSA9IGVudHJ5LmdldEtleSgpOworICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgIFN0cmluZyB1cmkgPSAiIjsKKyAgICAgICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSBudWxsOworICAgICAgICAgICAgU3RyaW5nIHF1YWxpZmllZE5hbWUgPSAiIjsKKyAgICAgICAgICAgIFN0cmluZyB2YWx1ZVRleHQgPSAodmFsdWUgIT0gbnVsbCkgPyB2YWx1ZS50b1N0cmluZygpIDogIiI7CisgICAgICAgICAgICBpZiAoa2V5IGluc3RhbmNlb2YgUU5hbWUpIHsKKyAgICAgICAgICAgICAgICBRTmFtZSBxbmFtZSA9IChRTmFtZSkga2V5OworICAgICAgICAgICAgICAgIHVyaSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOworICAgICAgICAgICAgICAgIGxvY2FsTmFtZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOworICAgICAgICAgICAgICAgIHF1YWxpZmllZE5hbWUgPSBxbmFtZS5nZXRRdWFsaWZpZWROYW1lKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBsb2NhbE5hbWUgPSBrZXkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBxdWFsaWZpZWROYW1lID0gbG9jYWxOYW1lOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdHRyaWJ1dGVzLmFkZEF0dHJpYnV0ZSh1cmksIGxvY2FsTmFtZSwgcXVhbGlmaWVkTmFtZSwgIkNEQVRBIiwgdmFsdWVUZXh0KTsKKyAgICAgICAgfQorICAgICAgICBkb1N0YXJ0RWxlbWVudChuYW1lLCBhdHRyaWJ1dGVzKTsKKyAgICAgICAgaWYgKHRleHQgIT0gbnVsbCkgeworICAgICAgICAgICAgZG9UZXh0KHRleHQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGRvU3RhcnRFbGVtZW50KE9iamVjdCBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKKyAgICAgICAgU3RyaW5nIHVyaSA9ICIiOworICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIHF1YWxpZmllZE5hbWUgPSAiIjsKKyAgICAgICAgaWYgKG5hbWUgaW5zdGFuY2VvZiBRTmFtZSkgeworICAgICAgICAgICAgUU5hbWUgcW5hbWUgPSAoUU5hbWUpIG5hbWU7CisgICAgICAgICAgICB1cmkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKKyAgICAgICAgICAgIGxvY2FsTmFtZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOworICAgICAgICAgICAgcXVhbGlmaWVkTmFtZSA9IHFuYW1lLmdldFF1YWxpZmllZE5hbWUoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGxvY2FsTmFtZSA9IG5hbWUudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIHF1YWxpZmllZE5hbWUgPSBsb2NhbE5hbWU7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGhhbmRsZXIuc3RhcnRFbGVtZW50KHVyaSwgbG9jYWxOYW1lLCBxdWFsaWZpZWROYW1lLCBhdHRyaWJ1dGVzKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGhhbmRsZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIG5vZGVDb21wbGV0ZWQoT2JqZWN0IHBhcmVudCwgT2JqZWN0IG5hbWUpIHsKKyAgICAgICAgU3RyaW5nIHVyaSA9ICIiOworICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIHF1YWxpZmllZE5hbWUgPSAiIjsKKyAgICAgICAgaWYgKG5hbWUgaW5zdGFuY2VvZiBRTmFtZSkgeworICAgICAgICAgICAgUU5hbWUgcW5hbWUgPSAoUU5hbWUpIG5hbWU7CisgICAgICAgICAgICB1cmkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKKyAgICAgICAgICAgIGxvY2FsTmFtZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOworICAgICAgICAgICAgcXVhbGlmaWVkTmFtZSA9IHFuYW1lLmdldFF1YWxpZmllZE5hbWUoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGxvY2FsTmFtZSA9IG5hbWUudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIHF1YWxpZmllZE5hbWUgPSBsb2NhbE5hbWU7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGhhbmRsZXIuZW5kRWxlbWVudCh1cmksIGxvY2FsTmFtZSwgcXVhbGlmaWVkTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBoYW5kbGVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVFeGNlcHRpb24oU0FYRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgfQorCisgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAqIEBzZWUgZ3Jvb3Z5LnV0aWwuQnVpbGRlclN1cHBvcnQjY3JlYXRlTm9kZShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLnV0aWwuTWFwLCBqYXZhLmxhbmcuT2JqZWN0KQorICAgICAqLworICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlTm9kZShPYmplY3QgbmFtZSwgTWFwIGF0dHJpYnV0ZXMpIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZU5vZGUobmFtZSwgYXR0cmlidXRlcywgbnVsbCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS94bWwvU3RyZWFtaW5nRE9NQnVpbGRlci5ncm9vdnkgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3htbC9TdHJlYW1pbmdET01CdWlsZGVyLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTdhYmRjCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS94bWwvU3RyZWFtaW5nRE9NQnVpbGRlci5ncm9vdnkKQEAgLTAsMCArMSwyMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGdyb292eS54bWwKKworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3RvcnkKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlCisKK2ltcG9ydCBncm9vdnkueG1sLnN0cmVhbWluZ21hcmt1cHN1cHBvcnQuQWJzdHJhY3RTdHJlYW1pbmdCdWlsZGVyCitpbXBvcnQgZ3Jvb3Z5LnhtbC5zdHJlYW1pbmdtYXJrdXBzdXBwb3J0LlN0cmVhbWluZ01hcmt1cFdyaXRlcgoraW1wb3J0IGdyb292eS54bWwuc3RyZWFtaW5nbWFya3Vwc3VwcG9ydC5CYXNlTWFya3VwQnVpbGRlcgorCitjbGFzcyBTdHJlYW1pbmdET01CdWlsZGVyIGV4dGVuZHMgQWJzdHJhY3RTdHJlYW1pbmdCdWlsZGVyIHsKKyAgICBkZWYgcGVuZGluZ1N0YWNrID0gW10KKyAgICBkZWYgY29tbWVudENsb3N1cmUgPSB7ZG9jLCBwZW5kaW5nTmFtZXNwYWNlcywgbmFtZXNwYWNlcywgbmFtZXNwYWNlU3BlY2lmaWNUYWdzLCBwcmVmaXgsIGF0dHJzLCBib2R5LCBkb20gLT4KKyAgICAgICAgZGVmIGNvbW1lbnQgPSBkb20uZG9jdW1lbnQuY3JlYXRlQ29tbWVudChib2R5KQorICAgICAgICBpZiAoY29tbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBkb20uZWxlbWVudC5hcHBlbmRDaGlsZChjb21tZW50KQorICAgICAgICB9CisgICAgfQorICAgIGRlZiBwaUNsb3N1cmUgPSB7ZG9jLCBwZW5kaW5nTmFtZXNwYWNlcywgbmFtZXNwYWNlcywgbmFtZXNwYWNlU3BlY2lmaWNUYWdzLCBwcmVmaXgsIGF0dHJzLCBib2R5LCBkb20gLT4KKyAgICAgICAgYXR0cnMuZWFjaCB7dGFyZ2V0LCBpbnN0cnVjdGlvbiAtPgorICAgICAgICAgICAgZGVmIHBpID0gbnVsbAorICAgICAgICAgICAgaWYgKGluc3RydWN0aW9uIGluc3RhbmNlb2YgTWFwKSB7CisgICAgICAgICAgICAgICAgZGVmIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKQorICAgICAgICAgICAgICAgIGluc3RydWN0aW9uLmVhY2ggeyBuYW1lLCB2YWx1ZSAtPgorICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUudG9TdHJpbmcoKS5jb250YWlucygnIicpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIgJG5hbWU9JyR2YWx1ZSciKQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiICRuYW1lPVwiJHZhbHVlXCIiICkKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwaSA9IGRvbS5kb2N1bWVudC5jcmVhdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24odGFyZ2V0LCBidWYudG9TdHJpbmcoKSkKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcGkgPSBkb20uZG9jdW1lbnQuY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKHRhcmdldCwgaW5zdHJ1Y3Rpb24pCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGRvbS5lbGVtZW50LmFwcGVuZENoaWxkKHBpKQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGRlZiBub29wQ2xvc3VyZSA9IHtkb2MsIHBlbmRpbmdOYW1lc3BhY2VzLCBuYW1lc3BhY2VzLCBuYW1lc3BhY2VTcGVjaWZpY1RhZ3MsIHByZWZpeCwgYXR0cnMsIGJvZHksIGRvbSAtPgorICAgICAgICBpZiAoYm9keSBpbnN0YW5jZW9mIENsb3N1cmUpIHsKKyAgICAgICAgICAgIGRlZiBib2R5MSA9IGJvZHkuY2xvbmUoKQorICAgICAgICAgICAgYm9keTEuZGVsZWdhdGUgPSBkb2MKKyAgICAgICAgICAgIGJvZHkxKGRvYykKKyAgICAgICAgfSBlbHNlIGlmIChib2R5IGluc3RhbmNlb2YgQnVpbGRhYmxlKSB7CisgICAgICAgICAgICBib2R5LmJ1aWxkKGRvYykKKyAgICAgICAgfSBlbHNlIGlmIChib2R5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJvZHkuZWFjaCB7CisgICAgICAgICAgICAgICAgaWYgKGl0IGluc3RhbmNlb2YgQ2xvc3VyZSkgeworICAgICAgICAgICAgICAgICAgICBkZWYgYm9keTEgPSBpdC5jbG9uZSgpCisgICAgICAgICAgICAgICAgICAgIGJvZHkxLmRlbGVnYXRlID0gZG9jCisgICAgICAgICAgICAgICAgICAgIGJvZHkxKGRvYykKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGl0IGluc3RhbmNlb2YgQnVpbGRhYmxlKSB7CisgICAgICAgICAgICAgICAgICAgIGl0LmJ1aWxkKGRvYykKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBkb20uZWxlbWVudC5hcHBlbmRDaGlsZChkb20uZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoaXQpKQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBkZWYgdGFnQ2xvc3VyZSA9IHt0YWcsIGRvYywgcGVuZGluZ05hbWVzcGFjZXMsIG5hbWVzcGFjZXMsIG5hbWVzcGFjZVNwZWNpZmljVGFncywgcHJlZml4LCBhdHRycywgYm9keSwgZG9tIC0+CisgICAgICAgIGRlZiBhdHRyaWJ1dGVzID0gW10KKyAgICAgICAgZGVmIG5zQXR0cmlidXRlcyA9IFtdCisKKyAgICAgICAgYXR0cnMuZWFjaCB7a2V5LCB2YWx1ZSAtPgorICAgICAgICAgICAgaWYgKGtleS5jb250YWlucygnJCcpKSB7CisgICAgICAgICAgICAgICAgZGVmIHBhcnRzID0ga2V5LnRva2VuaXplKCckJykKKyAgICAgICAgICAgICAgICBkZWYgbmFtZXNwYWNlVXJpID0gbnVsbAorCisgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZXMuY29udGFpbnNLZXkocGFydHNbMF0pKSB7CisgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVyaSA9IG5hbWVzcGFjZXNbcGFydHNbMF1dCisKKyAgICAgICAgICAgICAgICAgICAgbnNBdHRyaWJ1dGVzLmFkZChbbmFtZXNwYWNlVXJpLCAiJHtwYXJ0c1swXX06JHtwYXJ0c1sxXX0iLCB2YWx1ZV0pCisKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbigiYmFkIGF0dHJpYnV0ZSBuYW1lc3BhY2UgdGFnIGluICR7a2V5fSIpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmFkZChba2V5LCB2YWx1ZV0pCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBkZWYgaGlkZGVuTmFtZXNwYWNlcyA9IFs6XQorCisgICAgICAgIHBlbmRpbmdOYW1lc3BhY2VzLmVhY2gge2tleSwgdmFsdWUgLT4KKyAgICAgICAgICAgIGhpZGRlbk5hbWVzcGFjZXNba2V5XSA9IG5hbWVzcGFjZXNba2V5XQorICAgICAgICAgICAgbmFtZXNwYWNlc1trZXldID0gdmFsdWUKKyAgICAgICAgICAgIG5zQXR0cmlidXRlcy5hZGQoWyJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyIsICJ4bWxuczoke2tleX0iLCB2YWx1ZV0pCisKKyAgICAgICAgfQorCisgICAgICAgIC8vIHNldHVwIHRoZSB0YWcgaW5mbworCisgICAgICAgIGRlZiB1cmkgPSAiIgorICAgICAgICBkZWYgcXVhbGlmaWVkTmFtZSA9IHRhZworCisgICAgICAgIGlmIChwcmVmaXggIT0gIiIpIHsKKyAgICAgICAgICAgIGlmIChuYW1lc3BhY2VzLmNvbnRhaW5zS2V5KHByZWZpeCkpIHsKKyAgICAgICAgICAgICAgICB1cmkgPSBuYW1lc3BhY2VzW3ByZWZpeF0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAocGVuZGluZ05hbWVzcGFjZXMuY29udGFpbnNLZXkocHJlZml4KSkgeworICAgICAgICAgICAgICAgIHVyaSA9IHBlbmRpbmdOYW1lc3BhY2VzW3ByZWZpeF0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEdyb292eVJ1bnRpbWVFeGNlcHRpb24oIk5hbWVzcGFjZSBwcmVmaXg6ICR7cHJlZml4fSBpcyBub3QgYm91bmQgdG8gYSBVUkkiKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHByZWZpeCAhPSAiOiIpIHsKKyAgICAgICAgICAgICAgICBxdWFsaWZpZWROYW1lID0gcHJlZml4ICsgIjoiICsgdGFnCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBkZWYgZWxlbWVudCA9IGRvbS5kb2N1bWVudC5jcmVhdGVFbGVtZW50TlModXJpLCBxdWFsaWZpZWROYW1lKQorCisgICAgICAgIG5zQXR0cmlidXRlcy5lYWNoIHsKKyAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlTlMoaXRbMF0sIGl0WzFdLCBpdFsyXSkKKyAgICAgICAgfQorICAgICAgICBhdHRyaWJ1dGVzLmVhY2ggeworICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoaXRbMF0sIGl0WzFdKQorICAgICAgICB9CisKKyAgICAgICAgZG9tLmVsZW1lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCkKKyAgICAgICAgZG9tLmVsZW1lbnQgPSBlbGVtZW50CisKKyAgICAgICAgaWYgKGJvZHkgIT0gbnVsbCkgeworICAgICAgICAgICAgcGVuZGluZ1N0YWNrLmFkZCBwZW5kaW5nTmFtZXNwYWNlcy5jbG9uZSgpCisgICAgICAgICAgICBwZW5kaW5nTmFtZXNwYWNlcy5jbGVhcigpCisKKyAgICAgICAgICAgIGlmIChib2R5IGluc3RhbmNlb2YgQ2xvc3VyZSkgeworICAgICAgICAgICAgICAgIGRlZiBib2R5MSA9IGJvZHkuY2xvbmUoKQorCisgICAgICAgICAgICAgICAgYm9keTEuZGVsZWdhdGUgPSBkb2MKKyAgICAgICAgICAgICAgICBib2R5MShkb2MpCisgICAgICAgICAgICB9IGVsc2UgaWYgKGJvZHkgaW5zdGFuY2VvZiBCdWlsZGFibGUpIHsKKyAgICAgICAgICAgICAgICBib2R5LmJ1aWxkKGRvYykKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYm9keS5lYWNoIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGl0IGluc3RhbmNlb2YgQ2xvc3VyZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVmIGJvZHkxID0gaXQuY2xvbmUoKQorCisgICAgICAgICAgICAgICAgICAgICAgICBib2R5MS5kZWxlZ2F0ZSA9IGRvYworICAgICAgICAgICAgICAgICAgICAgICAgYm9keTEoZG9jKQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGl0IGluc3RhbmNlb2YgQnVpbGRhYmxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpdC5idWlsZChkb2MpCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkb20uZWxlbWVudC5hcHBlbmRDaGlsZChkb20uZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoaXQpKQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwZW5kaW5nTmFtZXNwYWNlcy5jbGVhcigpCisgICAgICAgICAgICBwZW5kaW5nTmFtZXNwYWNlcy5wdXRBbGwgcGVuZGluZ1N0YWNrLnBvcCgpCisgICAgICAgIH0KKworICAgICAgICBkb20uZWxlbWVudCA9IGRvbS5lbGVtZW50LmdldFBhcmVudE5vZGUoKQorCisgICAgICAgIGhpZGRlbk5hbWVzcGFjZXMuZWFjaCB7IGtleSwgdmFsdWUgLT4KKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSBuYW1lc3BhY2VzLnJlbW92ZSBrZXkKKyAgICAgICAgICAgIGVsc2UgbmFtZXNwYWNlc1trZXldID0gdmFsdWUKKyAgICAgICAgfQorICAgIH0KKworICAgIGRlZiBidWlsZGVyID0gbnVsbAorCisgICAgU3RyZWFtaW5nRE9NQnVpbGRlcigpIHsKKyAgICAgICAgc3BlY2lhbFRhZ3MucHV0QWxsKFsneWllbGQnOm5vb3BDbG9zdXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICd5aWVsZFVuZXNjYXBlZCc6bm9vcENsb3N1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbW1lbnQnOmNvbW1lbnRDbG9zdXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwaSc6cGlDbG9zdXJlXSkKKyAgICAgICAgZGVmIG5zU3BlY2lmaWNUYWdzID0gWyc6JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogW3RhZ0Nsb3N1cmUsIHRhZ0Nsb3N1cmUsIFs6XV0sICAgIC8vIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAnaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlJyAgICAgICAgICAgOiBbdGFnQ2xvc3VyZSwgdGFnQ2xvc3VyZSwgWzpdXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ2h0dHA6Ly93d3cuY29kZWhhdXMub3JnL0dyb292eS9tYXJrdXAva2V5d29yZHMnIDogW2JhZFRhZ0Nsb3N1cmUsIHRhZ0Nsb3N1cmUsIHNwZWNpYWxUYWdzXV0KKyAgICAgICAgdGhpcy5idWlsZGVyID0gbmV3IEJhc2VNYXJrdXBCdWlsZGVyKG5zU3BlY2lmaWNUYWdzKQorICAgIH0KKworICAgIGRlZiBiaW5kKGNsb3N1cmUpIHsKKyAgICAgICAgZGVmIGJvdW5kQ2xvc3VyZSA9IHRoaXMuYnVpbGRlci5iaW5kKGNsb3N1cmUpCisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICBpZiAoaXQgaW5zdGFuY2VvZiBOb2RlKSB7CisgICAgICAgICAgICAgICAgZGVmIGRvY3VtZW50ID0gaXQuZ2V0T3duZXJEb2N1bWVudCgpCisgICAgICAgICAgICAgICAgYm91bmRDbG9zdXJlLnRyaWdnZXIgPSBbJ2RvY3VtZW50JyA6IGRvY3VtZW50LCAnZWxlbWVudCcgOiBpdF0KKyAgICAgICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGVmIG5ld0RvY3VtZW50ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpLm5ld0RvY3VtZW50KCkKKyAgICAgICAgICAgICAgICBib3VuZENsb3N1cmUudHJpZ2dlciA9IFsnZG9jdW1lbnQnIDogbmV3RG9jdW1lbnQsICdlbGVtZW50JyA6IG5ld0RvY3VtZW50XQorICAgICAgICAgICAgICAgIHJldHVybiBuZXdEb2N1bWVudAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS94bWwvU3RyZWFtaW5nTWFya3VwQnVpbGRlci5ncm9vdnkgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3htbC9TdHJlYW1pbmdNYXJrdXBCdWlsZGVyLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWEzMTUxCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS94bWwvU3RyZWFtaW5nTWFya3VwQnVpbGRlci5ncm9vdnkKQEAgLTAsMCArMSwxNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBncm9vdnkueG1sCisKK2ltcG9ydCBncm9vdnkueG1sLnN0cmVhbWluZ21hcmt1cHN1cHBvcnQuQWJzdHJhY3RTdHJlYW1pbmdCdWlsZGVyCitpbXBvcnQgZ3Jvb3Z5LnhtbC5zdHJlYW1pbmdtYXJrdXBzdXBwb3J0LlN0cmVhbWluZ01hcmt1cFdyaXRlcgoraW1wb3J0IGdyb292eS54bWwuc3RyZWFtaW5nbWFya3Vwc3VwcG9ydC5CYXNlTWFya3VwQnVpbGRlcgorCitjbGFzcyBTdHJlYW1pbmdNYXJrdXBCdWlsZGVyIGV4dGVuZHMgQWJzdHJhY3RTdHJlYW1pbmdCdWlsZGVyIHsKKyAgICBkZWYgcGVuZGluZ1N0YWNrID0gW10KKyAgICBkZWYgY29tbWVudENsb3N1cmUgPSB7ZG9jLCBwZW5kaW5nTmFtZXNwYWNlcywgbmFtZXNwYWNlcywgbmFtZXNwYWNlU3BlY2lmaWNUYWdzLCBwcmVmaXgsIGF0dHJzLCBib2R5LCBvdXQgLT4KKyAgICAgICAgb3V0LnVuZXNjYXBlZCgpIDw8ICI8IS0tIgorICAgICAgICBvdXQuZXNjYXBlZCgpIDw8IGJvZHkKKyAgICAgICAgb3V0LnVuZXNjYXBlZCgpIDw8ICItLT4iCisgICAgfQorICAgIGRlZiBwaUNsb3N1cmUgPSB7ZG9jLCBwZW5kaW5nTmFtZXNwYWNlcywgbmFtZXNwYWNlcywgbmFtZXNwYWNlU3BlY2lmaWNUYWdzLCBwcmVmaXgsIGF0dHJzLCBib2R5LCBvdXQgLT4KKyAgICAgICAgYXR0cnMuZWFjaCB7dGFyZ2V0LCBpbnN0cnVjdGlvbiAtPgorICAgICAgICAgICAgb3V0LnVuZXNjYXBlZCgpIDw8ICI8PyIKKyAgICAgICAgICAgIGlmIChpbnN0cnVjdGlvbiBpbnN0YW5jZW9mIE1hcCkgeworICAgICAgICAgICAgICAgIG91dC51bmVzY2FwZWQoKSA8PCB0YXJnZXQKKyAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbi5lYWNoIHtuYW1lLCB2YWx1ZSAtPgorICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUudG9TdHJpbmcoKS5jb250YWlucygnIicpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQudW5lc2NhcGVkKCkgPDwgIiAkbmFtZT0nJHZhbHVlJyIKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC51bmVzY2FwZWQoKSA8PCAiICRuYW1lPVwiJHZhbHVlXCIiCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG91dC51bmVzY2FwZWQoKSA8PCAiJHRhcmdldCAkaW5zdHJ1Y3Rpb24iCisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQudW5lc2NhcGVkKCkgPDwgIj8+IgorICAgICAgICB9CisgICAgfQorICAgIGRlZiBkZWNsYXJhdGlvbkNsb3N1cmUgPSB7ZG9jLCBwZW5kaW5nTmFtZXNwYWNlcywgbmFtZXNwYWNlcywgbmFtZXNwYWNlU3BlY2lmaWNUYWdzLCBwcmVmaXgsIGF0dHJzLCBib2R5LCBvdXQgLT4KKyAgICAgICAgb3V0LnVuZXNjYXBlZCgpIDw8ICc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSInCisgICAgICAgIG91dC5lc2NhcGVkKCkgPDwgIiR7b3V0LmVuY29kaW5nfSIKKyAgICAgICAgb3V0LnVuZXNjYXBlZCgpIDw8ICciPz5cbicKKyAgICB9CisgICAgZGVmIG5vb3BDbG9zdXJlID0ge2RvYywgcGVuZGluZ05hbWVzcGFjZXMsIG5hbWVzcGFjZXMsIG5hbWVzcGFjZVNwZWNpZmljVGFncywgcHJlZml4LCBhdHRycywgYm9keSwgb3V0IC0+CisgICAgICAgIGJvZHkuZWFjaCB7CisgICAgICAgICAgICBpZiAoaXQgaW5zdGFuY2VvZiBDbG9zdXJlKSB7CisgICAgICAgICAgICAgICAgZGVmIGJvZHkxID0gaXQuY2xvbmUoKQorCisgICAgICAgICAgICAgICAgYm9keTEuZGVsZWdhdGUgPSBkb2MKKyAgICAgICAgICAgICAgICBib2R5MShkb2MpCisgICAgICAgICAgICB9IGVsc2UgaWYgKGl0IGluc3RhbmNlb2YgQnVpbGRhYmxlKSB7CisgICAgICAgICAgICAgICAgaXQuYnVpbGQoZG9jKQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvdXQuZXNjYXBlZCgpIDw8IGl0CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZGVmIHVuZXNjYXBlZENsb3N1cmUgPSB7ZG9jLCBwZW5kaW5nTmFtZXNwYWNlcywgbmFtZXNwYWNlcywgbmFtZXNwYWNlU3BlY2lmaWNUYWdzLCBwcmVmaXgsIGF0dHJzLCBib2R5LCBvdXQgLT4KKyAgICAgICAgb3V0LnVuZXNjYXBlZCgpIDw8IGJvZHkKKyAgICB9CisgICAgZGVmIHRhZ0Nsb3N1cmUgPSB7dGFnLCBkb2MsIHBlbmRpbmdOYW1lc3BhY2VzLCBuYW1lc3BhY2VzLCBuYW1lc3BhY2VTcGVjaWZpY1RhZ3MsIHByZWZpeCwgYXR0cnMsIGJvZHksIG91dCAtPgorICAgICAgICBpZiAocHJlZml4ICE9ICIiKSB7CisgICAgICAgICAgICBpZiAoIShuYW1lc3BhY2VzLmNvbnRhaW5zS2V5KHByZWZpeCkgfHwgcGVuZGluZ05hbWVzcGFjZXMuY29udGFpbnNLZXkocHJlZml4KSkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbigiTmFtZXNwYWNlIHByZWZpeDogJHtwcmVmaXh9IGlzIG5vdCBib3VuZCB0byBhIFVSSSIpCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwcmVmaXggIT0gIjoiKSB0YWcgPSBwcmVmaXggKyAiOiIgKyB0YWcKKyAgICAgICAgfQorCisgICAgICAgIG91dCA9IG91dC51bmVzY2FwZWQoKSA8PCAiPCR7dGFnfSIKKworICAgICAgICBhdHRycy5lYWNoIHtrZXksIHZhbHVlIC0+CisgICAgICAgICAgICBpZiAoa2V5LmNvbnRhaW5zKCckJykpIHsKKyAgICAgICAgICAgICAgICBkZWYgcGFydHMgPSBrZXkudG9rZW5pemUoJyQnKQorCisgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZXMuY29udGFpbnNLZXkocGFydHNbMF0pIHx8IHBlbmRpbmdOYW1lc3BhY2VzLmNvbnRhaW5zS2V5KHBhcnRzWzBdKSkgeworICAgICAgICAgICAgICAgICAgICBrZXkgPSBwYXJ0c1swXSArICI6IiArIHBhcnRzWzFdCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEdyb292eVJ1bnRpbWVFeGNlcHRpb24oImJhZCBhdHRyaWJ1dGUgbmFtZXNwYWNlIHRhZzogJHtwYXJ0c1swXX0gaW4gJHtrZXl9IikKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG91dCA8PCAiICR7a2V5fT0nIgorICAgICAgICAgICAgb3V0LndyaXRpbmdBdHRyaWJ1dGUgPSB0cnVlCisgICAgICAgICAgICAiJHt2YWx1ZX0iLmJ1aWxkKGRvYykKKyAgICAgICAgICAgIG91dC53cml0aW5nQXR0cmlidXRlID0gZmFsc2UKKyAgICAgICAgICAgIG91dCA8PCAiJyIKKyAgICAgICAgfQorCisgICAgICAgIGRlZiBoaWRkZW5OYW1lc3BhY2VzID0gWzpdCisKKyAgICAgICAgcGVuZGluZ05hbWVzcGFjZXMuZWFjaCB7a2V5LCB2YWx1ZSAtPgorICAgICAgICAgICAgaGlkZGVuTmFtZXNwYWNlc1trZXldID0gbmFtZXNwYWNlc1trZXldCisgICAgICAgICAgICBuYW1lc3BhY2VzW2tleV0gPSB2YWx1ZQorICAgICAgICAgICAgb3V0IDw8ICgoa2V5ID09ICI6IikgPyAiIHhtbG5zPSciIDogIiB4bWxuczoke2tleX09JyIpCisgICAgICAgICAgICBvdXQud3JpdGluZ0F0dHJpYnV0ZSA9IHRydWUKKyAgICAgICAgICAgICIke3ZhbHVlfSIuYnVpbGQoZG9jKQorICAgICAgICAgICAgb3V0LndyaXRpbmdBdHRyaWJ1dGUgPSBmYWxzZQorICAgICAgICAgICAgb3V0IDw8ICInIgorICAgICAgICB9CisKKyAgICAgICAgaWYgKGJvZHkgPT0gbnVsbCkgeworICAgICAgICAgICAgb3V0IDw8ICIvPiIKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG91dCA8PCAiPiIKKworICAgICAgICAgICAgcGVuZGluZ1N0YWNrLmFkZCBwZW5kaW5nTmFtZXNwYWNlcy5jbG9uZSgpCisgICAgICAgICAgICBwZW5kaW5nTmFtZXNwYWNlcy5jbGVhcigpCisKKyAgICAgICAgICAgIGJvZHkuZWFjaCB7CisgICAgICAgICAgICAgICAgaWYgKGl0IGluc3RhbmNlb2YgQ2xvc3VyZSkgeworICAgICAgICAgICAgICAgICAgICBkZWYgYm9keTEgPSBpdC5jbG9uZSgpCisKKyAgICAgICAgICAgICAgICAgICAgYm9keTEuZGVsZWdhdGUgPSBkb2MKKyAgICAgICAgICAgICAgICAgICAgYm9keTEoZG9jKQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXQgaW5zdGFuY2VvZiBCdWlsZGFibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgaXQuYnVpbGQoZG9jKQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5lc2NhcGVkKCkgPDwgaXQKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBlbmRpbmdOYW1lc3BhY2VzLmNsZWFyKCkKKyAgICAgICAgICAgIHBlbmRpbmdOYW1lc3BhY2VzLnB1dEFsbCBwZW5kaW5nU3RhY2sucG9wKCkKKworICAgICAgICAgICAgb3V0IDw8ICI8LyR7dGFnfT4iCisgICAgICAgIH0KKworICAgICAgICBoaWRkZW5OYW1lc3BhY2VzLmVhY2gge2tleSwgdmFsdWUgLT4KKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbmFtZXNwYWNlcy5yZW1vdmUga2V5CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG5hbWVzcGFjZXNba2V5XSA9IHZhbHVlCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkZWYgYnVpbGRlciA9IG51bGwKKworICAgIFN0cmVhbWluZ01hcmt1cEJ1aWxkZXIoKSB7CisgICAgICAgIHNwZWNpYWxUYWdzLnB1dEFsbChbJ3lpZWxkJzogbm9vcENsb3N1cmUsCisgICAgICAgICd5aWVsZFVuZXNjYXBlZCc6IHVuZXNjYXBlZENsb3N1cmUsCisgICAgICAgICd4bWxEZWNsYXJhdGlvbic6IGRlY2xhcmF0aW9uQ2xvc3VyZSwKKyAgICAgICAgJ2NvbW1lbnQnOiBjb21tZW50Q2xvc3VyZSwKKyAgICAgICAgJ3BpJzogcGlDbG9zdXJlXSkKKworICAgICAgICBkZWYgbnNTcGVjaWZpY1RhZ3MgPSBbJzonOiBbdGFnQ2xvc3VyZSwgdGFnQ2xvc3VyZSwgWzpdXSwgLy8gdGhlIGRlZmF1bHQgbmFtZXNwYWNlCisgICAgICAgICdodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UnOiBbdGFnQ2xvc3VyZSwgdGFnQ2xvc3VyZSwgWzpdXSwKKyAgICAgICAgJ2h0dHA6Ly93d3cuY29kZWhhdXMub3JnL0dyb292eS9tYXJrdXAva2V5d29yZHMnOiBbYmFkVGFnQ2xvc3VyZSwgdGFnQ2xvc3VyZSwgc3BlY2lhbFRhZ3NdXQorCisgICAgICAgIHRoaXMuYnVpbGRlciA9IG5ldyBCYXNlTWFya3VwQnVpbGRlcihuc1NwZWNpZmljVGFncykKKyAgICB9CisKKyAgICBkZWYgZW5jb2RpbmcgPSBudWxsCisKKyAgICBwdWJsaWMgYmluZChjbG9zdXJlKSB7CisgICAgICAgIGRlZiBib3VuZENsb3N1cmUgPSB0aGlzLmJ1aWxkZXIuYmluZChjbG9zdXJlKTsKKyAgICAgICAgZGVmIGVuYyA9IGVuY29kaW5nOyAvLyB0YWtlIGEgc25hcHNob3Qgb2YgdGhlIGVuY29kaW5nIHdoZW4gdGhlIGNsb3N1cmUgaXMgYm91bmQgdG8gdGhlIGJ1aWxkZXIKKworICAgICAgICB7b3V0IC0+CisgICAgICAgICAgICBvdXQgPSBuZXcgU3RyZWFtaW5nTWFya3VwV3JpdGVyKG91dCwgZW5jKQorICAgICAgICAgICAgYm91bmRDbG9zdXJlLnRyaWdnZXIgPSBvdXQKKyAgICAgICAgICAgIG91dC5mbHVzaCgpCisgICAgICAgIH0uYXNXcml0YWJsZSgpCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS94bWwvU3RyZWFtaW5nU0FYQnVpbGRlci5ncm9vdnkgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3htbC9TdHJlYW1pbmdTQVhCdWlsZGVyLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTBhMGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS94bWwvU3RyZWFtaW5nU0FYQnVpbGRlci5ncm9vdnkKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGdyb292eS54bWwKKworaW1wb3J0IGdyb292eS54bWwuc3RyZWFtaW5nbWFya3Vwc3VwcG9ydC5BYnN0cmFjdFN0cmVhbWluZ0J1aWxkZXIKK2ltcG9ydCBncm9vdnkueG1sLnN0cmVhbWluZ21hcmt1cHN1cHBvcnQuU3RyZWFtaW5nTWFya3VwV3JpdGVyCitpbXBvcnQgZ3Jvb3Z5LnhtbC5zdHJlYW1pbmdtYXJrdXBzdXBwb3J0LkJhc2VNYXJrdXBCdWlsZGVyCisKKworaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuQXR0cmlidXRlc0ltcGwKK2ltcG9ydCBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXIKKworICAgIGNsYXNzIFN0cmVhbWluZ1NBWEJ1aWxkZXIgZXh0ZW5kcyBBYnN0cmFjdFN0cmVhbWluZ0J1aWxkZXIgeworICAgICAgICBkZWYgcGVuZGluZ1N0YWNrID0gW10KKyAgICAgICAgZGVmIGNvbW1lbnRDbG9zdXJlID0ge2RvYywgcGVuZGluZ05hbWVzcGFjZXMsIG5hbWVzcGFjZXMsIG5hbWVzcGFjZVNwZWNpZmljVGFncywgcHJlZml4LCBhdHRycywgYm9keSwgY29udGVudEhhbmRsZXIgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRIYW5kbGVyIGluc3RhbmNlb2YgTGV4aWNhbEhhbmRsZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRIYW5kbGVyLmNvbW1lbnQoYm9keS50b0NoYXJBcnJheSgpLCAwLCBib2R5LnNpemUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgIGRlZiBwaUNsb3N1cmUgPSB7ZG9jLCBwZW5kaW5nTmFtZXNwYWNlcywgbmFtZXNwYWNlcywgbmFtZXNwYWNlU3BlY2lmaWNUYWdzLCBwcmVmaXgsIGF0dHJzLCBib2R5LCBjb250ZW50SGFuZGxlciAtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzLmVhY2gge3RhcmdldCwgaW5zdHJ1Y3Rpb24gLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdHJ1Y3Rpb24gaW5zdGFuY2VvZiBNYXApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWYgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb24uZWFjaCB7IG5hbWUsIHZhbHVlIC0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUudG9TdHJpbmcoKS5jb250YWlucygnIicpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiAkbmFtZT0nJHZhbHVlJyIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIgJG5hbWU9XCIkdmFsdWVcIiIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudEhhbmRsZXIucHJvY2Vzc2luZ0luc3RydWN0aW9uKHRhcmdldCwgYnVmLnRvU3RyaW5nKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudEhhbmRsZXIucHJvY2Vzc2luZ0luc3RydWN0aW9uKHRhcmdldCwgaW5zdHJ1Y3Rpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgIGRlZiBub29wQ2xvc3VyZSA9IHtkb2MsIHBlbmRpbmdOYW1lc3BhY2VzLCBuYW1lc3BhY2VzLCBuYW1lc3BhY2VTcGVjaWZpY1RhZ3MsIHByZWZpeCwgYXR0cnMsIGJvZHksIGNvbnRlbnRIYW5kbGVyIC0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJvZHkgaW5zdGFuY2VvZiBDbG9zdXJlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWYgYm9keTEgPSBib2R5LmNsb25lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keTEuZGVsZWdhdGUgPSBkb2MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkxKGRvYykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJvZHkgaW5zdGFuY2VvZiBCdWlsZGFibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkuYnVpbGQoZG9jKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYm9keSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5LmVhY2ggeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXQgaW5zdGFuY2VvZiBDbG9zdXJlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmIGJvZHkxID0gaXQuY2xvbmUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkxLmRlbGVnYXRlID0gZG9jCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keTEoZG9jKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGl0IGluc3RhbmNlb2YgQnVpbGRhYmxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQuYnVpbGQoZG9jKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmIGNoYXJzID0gaXQudG9DaGFyQXJyYXkoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudEhhbmRsZXIuY2hhcmFjdGVycyhjaGFycywgMCwgY2hhcnMuc2l6ZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICBkZWYgdGFnQ2xvc3VyZSA9IHt0YWcsIGRvYywgcGVuZGluZ05hbWVzcGFjZXMsIG5hbWVzcGFjZXMsIG5hbWVzcGFjZVNwZWNpZmljVGFncywgcHJlZml4LCBhdHRycywgYm9keSwgY29udGVudEhhbmRsZXIgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWYgYXR0cmlidXRlcyA9IG5ldyBBdHRyaWJ1dGVzSW1wbCgpCisgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnMuZWFjaCB7a2V5LCB2YWx1ZSAtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleS5jb250YWlucygnJCcpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmIHBhcnRzID0ga2V5LnRva2VuaXplKCckJykKKyAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlcy5jb250YWluc0tleShwYXJ0c1swXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmIG5hbWVzcGFjZVVyaSA9IG5hbWVzcGFjZXNbcGFydHNbMF1dICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmFkZEF0dHJpYnV0ZShuYW1lc3BhY2VVcmksIHBhcnRzWzFdLCAiJHtwYXJ0c1swXX06JHtwYXJ0c1sxXX0iLCAiQ0RBVEEiLCB2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbigiYmFkIGF0dHJpYnV0ZSBuYW1lc3BhY2UgdGFnIGluICR7a2V5fSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmFkZEF0dHJpYnV0ZSgiIiwga2V5LCBrZXksICJDREFUQSIsIHZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZiBoaWRkZW5OYW1lc3BhY2VzID0gWzpdCisgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ05hbWVzcGFjZXMuZWFjaCB7a2V5LCB2YWx1ZSAtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW5OYW1lc3BhY2VzW2tleV0gPSBuYW1lc3BhY2VzW2tleV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlc1trZXldID0gdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcy5hZGRBdHRyaWJ1dGUoImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIiwga2V5LCAieG1sbnM6JHtrZXl9IiwgIkNEQVRBIiwgdmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRIYW5kbGVyLnN0YXJ0UHJlZml4TWFwcGluZyhrZXksIHZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXR1cCB0aGUgdGFnIGluZm8KKyAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWYgdXJpID0gIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWYgcXVhbGlmaWVkTmFtZSA9IHRhZworICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggIT0gIiIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZXMuY29udGFpbnNLZXkocHJlZml4KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJpID0gbmFtZXNwYWNlc1twcmVmaXhdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGVuZGluZ05hbWVzcGFjZXMuY29udGFpbnNLZXkocHJlZml4KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJpID0gcGVuZGluZ05hbWVzcGFjZXNbcHJlZml4XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEdyb292eVJ1bnRpbWVFeGNlcHRpb24oIk5hbWVzcGFjZSBwcmVmaXg6ICR7cHJlZml4fSBpcyBub3QgYm91bmQgdG8gYSBVUkkiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggIT0gIjoiKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWROYW1lID0gcHJlZml4ICsgIjoiICsgdGFnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudEhhbmRsZXIuc3RhcnRFbGVtZW50KHVyaSwgdGFnLCBxdWFsaWZpZWROYW1lLCBhdHRyaWJ1dGVzKQorICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChib2R5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ1N0YWNrLmFkZCBwZW5kaW5nTmFtZXNwYWNlcy5jbG9uZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdOYW1lc3BhY2VzLmNsZWFyKCkKKyAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJvZHkgaW5zdGFuY2VvZiBDbG9zdXJlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmIGJvZHkxID0gYm9keS5jbG9uZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keTEuZGVsZWdhdGUgPSBkb2MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5MShkb2MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYm9keSBpbnN0YW5jZW9mIEJ1aWxkYWJsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkuYnVpbGQoZG9jKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkuZWFjaCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXQgaW5zdGFuY2VvZiBDbG9zdXJlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZiBib2R5MSA9IGl0LmNsb25lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkxLmRlbGVnYXRlID0gZG9jCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkxKGRvYykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXQgaW5zdGFuY2VvZiBCdWlsZGFibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQuYnVpbGQoZG9jKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWYgY2hhcnMgPSBpdC50b0NoYXJBcnJheSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudEhhbmRsZXIuY2hhcmFjdGVycyhjaGFycywgMCwgY2hhcnMuc2l6ZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ05hbWVzcGFjZXMuY2xlYXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nTmFtZXNwYWNlcy5wdXRBbGwgcGVuZGluZ1N0YWNrLnBvcCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRIYW5kbGVyLmVuZEVsZW1lbnQodXJpLCB0YWcsIHF1YWxpZmllZE5hbWUpCisgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkZGVuTmFtZXNwYWNlcy5lYWNoIHtrZXksIHZhbHVlIC0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRIYW5kbGVyLmVuZFByZWZpeE1hcHBpbmcoa2V5KQorICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlcy5yZW1vdmUga2V5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VzW2tleV0gPSB2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgZGVmIGJ1aWxkZXIgPSBudWxsCisKKyAgICAgICAgU3RyZWFtaW5nU0FYQnVpbGRlcigpIHsKKyAgICAgICAgICAgIHNwZWNpYWxUYWdzLnB1dEFsbChbJ3lpZWxkJzpub29wQ2xvc3VyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3lpZWxkVW5lc2NhcGVkJzpub29wQ2xvc3VyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbW1lbnQnOmNvbW1lbnRDbG9zdXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGknOnBpQ2xvc3VyZV0pCisKKyAgICAgICAgICAgIGRlZiBuc1NwZWNpZmljVGFncyA9IFsnOicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFt0YWdDbG9zdXJlLCB0YWdDbG9zdXJlLCBbOl1dLCAgICAvLyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlJyAgICAgICAgICAgOiBbdGFnQ2xvc3VyZSwgdGFnQ2xvc3VyZSwgWzpdXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaHR0cDovL3d3dy5jb2RlaGF1cy5vcmcvR3Jvb3Z5L21hcmt1cC9rZXl3b3JkcycgOiBbYmFkVGFnQ2xvc3VyZSwgdGFnQ2xvc3VyZSwgc3BlY2lhbFRhZ3NdXQorCisgICAgICAgICAgICB0aGlzLmJ1aWxkZXIgPSBuZXcgQmFzZU1hcmt1cEJ1aWxkZXIobnNTcGVjaWZpY1RhZ3MpCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYmluZChjbG9zdXJlKSB7CisgICAgICAgICAgICBkZWYgYm91bmRDbG9zdXJlID0gdGhpcy5idWlsZGVyLmJpbmQoY2xvc3VyZSkKKworICAgICAgICAgICAgcmV0dXJuIHtjb250ZW50SGFuZGxlciAtPgorICAgICAgICAgICAgICAgIGJvdW5kQ2xvc3VyZS50cmlnZ2VyID0gY29udGVudEhhbmRsZXIKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkveG1sL2RvbS9ET01DYXRlZ29yeS5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS94bWwvZG9tL0RPTUNhdGVnb3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjcwYTgwMwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkveG1sL2RvbS9ET01DYXRlZ29yeS5qYXZhCkBAIC0wLDAgKzEsMzk2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgZ3Jvb3Z5LnhtbC5kb207CisKK2ltcG9ydCBncm9vdnkueG1sLlFOYW1lOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5EZWZhdWx0R3Jvb3Z5TWV0aG9kczsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuSW52b2tlckhlbHBlcjsKK2ltcG9ydCBvcmcudzNjLmRvbS4qOworCitpbXBvcnQgamF2YS51dGlsLio7CisKKy8qKgorICogQGF1dGhvciBzYW0KKyAqIEBhdXRob3IgcGF1bGsKKyAqLworcHVibGljIGNsYXNzIERPTUNhdGVnb3J5IHsKKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gdHJpbVdoaXRlc3BhY2UgPSB0cnVlOworCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0KE9iamVjdCBvLCBTdHJpbmcgZWxlbWVudE5hbWUpIHsKKyAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBFbGVtZW50KSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0KChFbGVtZW50KSBvLCBlbGVtZW50TmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBOb2RlTGlzdCkgeworICAgICAgICAgICAgcmV0dXJuIGdldCgoTm9kZUxpc3QpIG8sIGVsZW1lbnROYW1lKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobyBpbnN0YW5jZW9mIE5hbWVkTm9kZU1hcCkgeworICAgICAgICAgICAgcmV0dXJuIGdldCgoTmFtZWROb2RlTWFwKSBvLCBlbGVtZW50TmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGdldChFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBlbGVtZW50TmFtZSkgeworICAgICAgICByZXR1cm4gZ2V0QXQoZWxlbWVudCwgZWxlbWVudE5hbWUpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIE9iamVjdCBnZXQoTm9kZUxpc3Qgbm9kZUxpc3QsIFN0cmluZyBlbGVtZW50TmFtZSkgeworICAgICAgICByZXR1cm4gZ2V0QXQobm9kZUxpc3QsIGVsZW1lbnROYW1lKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBPYmplY3QgZ2V0KE5hbWVkTm9kZU1hcCBub2RlTWFwLCBTdHJpbmcgZWxlbWVudE5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGdldEF0KG5vZGVNYXAsIGVsZW1lbnROYW1lKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBPYmplY3QgZ2V0QXQoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgZWxlbWVudE5hbWUpIHsKKyAgICAgICAgaWYgKCIuLiIuZXF1YWxzKGVsZW1lbnROYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuIHBhcmVudChlbGVtZW50KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIioqIi5lcXVhbHMoZWxlbWVudE5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gZGVwdGhGaXJzdChlbGVtZW50KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZWxlbWVudE5hbWUuc3RhcnRzV2l0aCgiQCIpKSB7CisgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoZWxlbWVudE5hbWUuc3Vic3RyaW5nKDEpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZ2V0Q2hpbGRFbGVtZW50cyhlbGVtZW50LCBlbGVtZW50TmFtZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGdldEF0KE5vZGVMaXN0IG5vZGVMaXN0LCBTdHJpbmcgZWxlbWVudE5hbWUpIHsKKyAgICAgICAgTGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVMaXN0LmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgIE5vZGUgbm9kZSA9IG5vZGVMaXN0Lml0ZW0oaSk7CisgICAgICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKKyAgICAgICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgZ2V0KG5vZGUsIGVsZW1lbnROYW1lKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVsZW1lbnROYW1lLnN0YXJ0c1dpdGgoIkAiKSkgeworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBOb2RlTGlzdHNIb2xkZXIocmVzdWx0cyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyhFbGVtZW50IGVsZW1lbnQpIHsKKyAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRBdChOYW1lZE5vZGVNYXAgbmFtZWROb2RlTWFwLCBTdHJpbmcgZWxlbWVudE5hbWUpIHsKKyAgICAgICAgQXR0ciBhID0gKEF0dHIpIG5hbWVkTm9kZU1hcC5nZXROYW1lZEl0ZW0oZWxlbWVudE5hbWUpOworICAgICAgICByZXR1cm4gYS5nZXRWYWx1ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgaW50IHNpemUoTmFtZWROb2RlTWFwIG5hbWVkTm9kZU1hcCkgeworICAgICAgICByZXR1cm4gbmFtZWROb2RlTWFwLmdldExlbmd0aCgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTm9kZSBnZXRBdChOb2RlIG8sIGludCBpKSB7CisgICAgICAgIHJldHVybiBub2RlR2V0QXQobywgaSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBOb2RlIGdldEF0KE5vZGVMaXN0c0hvbGRlciBvLCBpbnQgaSkgeworICAgICAgICByZXR1cm4gbm9kZUdldEF0KG8sIGkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTm9kZSBnZXRBdChOb2Rlc0hvbGRlciBvLCBpbnQgaSkgeworICAgICAgICByZXR1cm4gbm9kZUdldEF0KG8sIGkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIE5vZGUgbm9kZUdldEF0KE9iamVjdCBvLCBpbnQgaSkgeworICAgICAgICBpZiAobyBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKKyAgICAgICAgICAgIE5vZGUgbiA9IGdldEF0KChFbGVtZW50KW8sIGkpOworICAgICAgICAgICAgaWYgKG4gIT0gbnVsbCkgcmV0dXJuIG47CisgICAgICAgIH0KKyAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBOb2RlTGlzdCkgeworICAgICAgICAgICAgcmV0dXJuIGdldEF0KChOb2RlTGlzdClvLCBpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBOb2RlIGdldEF0KEVsZW1lbnQgZWxlbWVudCwgaW50IGkpIHsKKyAgICAgICAgaWYgKGhhc0NoaWxkRWxlbWVudHMoZWxlbWVudCwgIioiKSkgeworICAgICAgICAgICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSBnZXRDaGlsZEVsZW1lbnRzKGVsZW1lbnQsICIqIik7CisgICAgICAgICAgICByZXR1cm4gbm9kZUxpc3QuaXRlbShpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBOb2RlIGdldEF0KE5vZGVMaXN0IG5vZGVMaXN0LCBpbnQgaSkgeworICAgICAgICBpZiAoaSA+PSAwICYmIGkgPCBub2RlTGlzdC5nZXRMZW5ndGgoKSkgeworICAgICAgICAgICAgcmV0dXJuIG5vZGVMaXN0Lml0ZW0oaSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbmFtZShFbGVtZW50IGVsZW1lbnQpIHsKKyAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0Tm9kZU5hbWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE5vZGUgcGFyZW50KE5vZGUgbm9kZSkgeworICAgICAgICByZXR1cm4gbm9kZS5nZXRQYXJlbnROb2RlKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdGV4dChPYmplY3QgbykgeworICAgICAgICBpZiAobyBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKKyAgICAgICAgICAgIHJldHVybiB0ZXh0KChFbGVtZW50KSBvKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobyBpbnN0YW5jZW9mIE5vZGUpIHsKKyAgICAgICAgICAgIE5vZGUgbiA9IChOb2RlKSBvOworICAgICAgICAgICAgaWYgKG4uZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuLmdldE5vZGVWYWx1ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChvIGluc3RhbmNlb2YgTm9kZUxpc3QpIHsKKyAgICAgICAgICAgIHJldHVybiB0ZXh0KChOb2RlTGlzdCkgbyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRleHQoRWxlbWVudCBlbGVtZW50KSB7CisgICAgICAgIGlmICghZWxlbWVudC5oYXNDaGlsZE5vZGVzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorICAgICAgICBpZiAoZWxlbWVudC5nZXRGaXJzdENoaWxkKCkuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLlRFWFRfTk9ERSkgeworICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICB9CisgICAgICAgIHJldHVybiBlbGVtZW50LmdldEZpcnN0Q2hpbGQoKS5nZXROb2RlVmFsdWUoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdGV4dChOb2RlTGlzdCBub2RlTGlzdCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgc2IuYXBwZW5kKHRleHQobm9kZUxpc3QuaXRlbShpKSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBsaXN0KE5vZGVMaXN0IHNlbGYpIHsKKyAgICAgICAgTGlzdCBhbnN3ZXIgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIEl0ZXJhdG9yIGl0ID0gRGVmYXVsdEdyb292eU1ldGhvZHMuaXRlcmF0b3Ioc2VsZik7CisgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIGFuc3dlci5hZGQoaXQubmV4dCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYW5zd2VyOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTm9kZUxpc3QgZGVwdGhGaXJzdChFbGVtZW50IHNlbGYpIHsKKyAgICAgICAgTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIHJlc3VsdC5hZGQoY3JlYXRlTm9kZUxpc3Qoc2VsZikpOworICAgICAgICByZXN1bHQuYWRkKHNlbGYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSk7CisgICAgICAgIHJldHVybiBuZXcgTm9kZUxpc3RzSG9sZGVyKHJlc3VsdCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFZhbHVlKEVsZW1lbnQgc2VsZiwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIHNlbGYuZ2V0Rmlyc3RDaGlsZCgpLnNldE5vZGVWYWx1ZSh2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHB1dEF0KEVsZW1lbnQgc2VsZiwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgaWYgKHByb3BlcnR5LnN0YXJ0c1dpdGgoIkAiKSkgeworICAgICAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBwcm9wZXJ0eS5zdWJzdHJpbmcoMSk7CisgICAgICAgICAgICBEb2N1bWVudCBkb2MgPSBzZWxmLmdldE93bmVyRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIEF0dHIgbmV3QXR0ciA9IGRvYy5jcmVhdGVBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7CisgICAgICAgICAgICBuZXdBdHRyLnNldFZhbHVlKHZhbHVlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgc2VsZi5zZXRBdHRyaWJ1dGVOb2RlKG5ld0F0dHIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEludm9rZXJIZWxwZXIuc2V0UHJvcGVydHkoc2VsZiwgcHJvcGVydHksIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgYXBwZW5kTm9kZShFbGVtZW50IHNlbGYsIE9iamVjdCBuYW1lKSB7CisgICAgICAgIHJldHVybiBhcHBlbmROb2RlKHNlbGYsIG5hbWUsIChTdHJpbmcpbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IGFwcGVuZE5vZGUoRWxlbWVudCBzZWxmLCBPYmplY3QgbmFtZSwgTWFwIGF0dHJpYnV0ZXMpIHsKKyAgICAgICAgcmV0dXJuIGFwcGVuZE5vZGUoc2VsZiwgbmFtZSwgYXR0cmlidXRlcywgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IGFwcGVuZE5vZGUoRWxlbWVudCBzZWxmLCBPYmplY3QgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIERvY3VtZW50IGRvYyA9IHNlbGYuZ2V0T3duZXJEb2N1bWVudCgpOworICAgICAgICBFbGVtZW50IG5ld0NoaWxkOworICAgICAgICBpZiAobmFtZSBpbnN0YW5jZW9mIFFOYW1lKSB7CisgICAgICAgICAgICBRTmFtZSBxbiA9IChRTmFtZSkgbmFtZTsKKyAgICAgICAgICAgIG5ld0NoaWxkID0gZG9jLmNyZWF0ZUVsZW1lbnROUyhxbi5nZXROYW1lc3BhY2VVUkkoKSwgcW4uZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5ld0NoaWxkID0gZG9jLmNyZWF0ZUVsZW1lbnQobmFtZS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgVGV4dCB0ZXh0ID0gZG9jLmNyZWF0ZVRleHROb2RlKHZhbHVlKTsKKyAgICAgICAgICAgIG5ld0NoaWxkLmFwcGVuZENoaWxkKHRleHQpOworICAgICAgICB9CisgICAgICAgIHNlbGYuYXBwZW5kQ2hpbGQobmV3Q2hpbGQpOworICAgICAgICByZXR1cm4gbmV3Q2hpbGQ7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IGFwcGVuZE5vZGUoRWxlbWVudCBzZWxmLCBPYmplY3QgbmFtZSwgTWFwIGF0dHJpYnV0ZXMsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBFbGVtZW50IHJlc3VsdCA9IGFwcGVuZE5vZGUoc2VsZiwgbmFtZSwgdmFsdWUpOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYXR0cmlidXRlcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIE1hcC5FbnRyeSBlID0gKE1hcC5FbnRyeSkgaXRlcmF0b3IubmV4dCgpOworICAgICAgICAgICAgcHV0QXQocmVzdWx0LCAiQCIgKyBlLmdldEtleSgpLnRvU3RyaW5nKCksIGUuZ2V0VmFsdWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBOb2RlTGlzdCBjcmVhdGVOb2RlTGlzdChFbGVtZW50IHNlbGYpIHsKKyAgICAgICAgTGlzdCBmaXJzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgZmlyc3QuYWRkKHNlbGYpOworICAgICAgICByZXR1cm4gbmV3IE5vZGVzSG9sZGVyKGZpcnN0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE5vZGVMaXN0IGJyZWFkdGhGaXJzdChFbGVtZW50IHNlbGYpIHsKKyAgICAgICAgTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIE5vZGVMaXN0IHRoaXNMZXZlbCA9IGNyZWF0ZU5vZGVMaXN0KHNlbGYpOworICAgICAgICB3aGlsZSAodGhpc0xldmVsLmdldExlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgcmVzdWx0LmFkZCh0aGlzTGV2ZWwpOworICAgICAgICAgICAgdGhpc0xldmVsID0gZ2V0TmV4dExldmVsKHRoaXNMZXZlbCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBOb2RlTGlzdHNIb2xkZXIocmVzdWx0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBOb2RlTGlzdCBnZXROZXh0TGV2ZWwoTm9kZUxpc3QgdGhpc0xldmVsKSB7CisgICAgICAgIExpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXNMZXZlbC5nZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICBOb2RlIG4gPSB0aGlzTGV2ZWwuaXRlbShpKTsKKyAgICAgICAgICAgIGlmIChuIGluc3RhbmNlb2YgRWxlbWVudCkgeworICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoZ2V0Q2hpbGRFbGVtZW50cygoRWxlbWVudCkgbiwgIioiKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBOb2RlTGlzdHNIb2xkZXIocmVzdWx0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE5vZGVMaXN0IGNoaWxkcmVuKEVsZW1lbnQgc2VsZikgeworICAgICAgICByZXR1cm4gZ2V0Q2hpbGRFbGVtZW50cyhzZWxmLCAiKiIpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaGFzQ2hpbGRFbGVtZW50cyhFbGVtZW50IHNlbGYsIFN0cmluZyBlbGVtZW50TmFtZSkgeworICAgICAgICByZXR1cm4gZ2V0Q2hpbGRFbGVtZW50cyhzZWxmLCBlbGVtZW50TmFtZSkuZ2V0TGVuZ3RoKCkgPiAwOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIE5vZGVMaXN0IGdldENoaWxkRWxlbWVudHMoRWxlbWVudCBzZWxmLCBTdHJpbmcgZWxlbWVudE5hbWUpIHsKKyAgICAgICAgTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIE5vZGVMaXN0IG5vZGVMaXN0ID0gc2VsZi5nZXRDaGlsZE5vZGVzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgTm9kZSBub2RlID0gbm9kZUxpc3QuaXRlbShpKTsKKyAgICAgICAgICAgIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKKyAgICAgICAgICAgICAgICBFbGVtZW50IGNoaWxkID0gKEVsZW1lbnQpIG5vZGU7CisgICAgICAgICAgICAgICAgaWYgKCIqIi5lcXVhbHMoZWxlbWVudE5hbWUpIHx8IGNoaWxkLmdldFRhZ05hbWUoKS5lcXVhbHMoZWxlbWVudE5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoY2hpbGQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gbm9kZS5nZXROb2RlVmFsdWUoKTsKKyAgICAgICAgICAgICAgICBpZiAodHJpbVdoaXRlc3BhY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS50cmltKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgiKiIuZXF1YWxzKGVsZW1lbnROYW1lKSAmJiB2YWx1ZS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbm9kZS5zZXROb2RlVmFsdWUodmFsdWUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKG5vZGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IE5vZGVzSG9sZGVyKHJlc3VsdCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoT2JqZWN0IG8pIHsKKyAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBOb2RlKSB7CisgICAgICAgICAgICBpZiAoKChOb2RlKSBvKS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICgoTm9kZSkgbykuZ2V0Tm9kZVZhbHVlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBOb2RlTGlzdCkgeworICAgICAgICAgICAgcmV0dXJuIHRvU3RyaW5nKChOb2RlTGlzdCkgbyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG8udG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoTm9kZUxpc3Qgc2VsZikgeworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIHNiLmFwcGVuZCgiWyIpOworICAgICAgICBJdGVyYXRvciBpdCA9IERlZmF1bHRHcm9vdnlNZXRob2RzLml0ZXJhdG9yKHNlbGYpOworICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBpZiAoc2IubGVuZ3RoKCkgPiAxKSBzYi5hcHBlbmQoIiwgIik7CisgICAgICAgICAgICBzYi5hcHBlbmQoaXQubmV4dCgpLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIHNiLmFwcGVuZCgiXSIpOworICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGludCBzaXplKE5vZGVMaXN0IHNlbGYpIHsKKyAgICAgICAgcmV0dXJuIHNlbGYuZ2V0TGVuZ3RoKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRW1wdHkoTm9kZUxpc3Qgc2VsZikgeworICAgICAgICByZXR1cm4gc2l6ZShzZWxmKSA9PSAwOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkUmVzdWx0KExpc3QgcmVzdWx0cywgT2JqZWN0IHJlc3VsdCkgeworICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0cy5hZGRBbGwoKENvbGxlY3Rpb24pIHJlc3VsdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlc3VsdHMuYWRkKHJlc3VsdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBOb2RlTGlzdHNIb2xkZXIgaW1wbGVtZW50cyBOb2RlTGlzdCB7CisgICAgICAgIHByaXZhdGUgTGlzdCBub2RlTGlzdHM7CisKKyAgICAgICAgcHJpdmF0ZSBOb2RlTGlzdHNIb2xkZXIoTGlzdCBub2RlTGlzdHMpIHsKKyAgICAgICAgICAgIHRoaXMubm9kZUxpc3RzID0gbm9kZUxpc3RzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRMZW5ndGgoKSB7CisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gMDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZUxpc3RzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgTm9kZUxpc3QgbmwgPSAoTm9kZUxpc3QpIG5vZGVMaXN0cy5nZXQoaSk7CisgICAgICAgICAgICAgICAgbGVuZ3RoICs9IG5sLmdldExlbmd0aCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGxlbmd0aDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBOb2RlIGl0ZW0oaW50IGluZGV4KSB7CisgICAgICAgICAgICBpbnQgcmVsYXRpdmVJbmRleCA9IGluZGV4OworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlTGlzdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBOb2RlTGlzdCBubCA9IChOb2RlTGlzdCkgbm9kZUxpc3RzLmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAocmVsYXRpdmVJbmRleCA8IG5sLmdldExlbmd0aCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBubC5pdGVtKHJlbGF0aXZlSW5kZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZWxhdGl2ZUluZGV4IC09IG5sLmdldExlbmd0aCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIERPTUNhdGVnb3J5LnRvU3RyaW5nKHRoaXMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgTm9kZXNIb2xkZXIgaW1wbGVtZW50cyBOb2RlTGlzdCB7CisgICAgICAgIHByaXZhdGUgTGlzdCBub2RlczsKKworICAgICAgICBwcml2YXRlIE5vZGVzSG9sZGVyKExpc3Qgbm9kZXMpIHsKKyAgICAgICAgICAgIHRoaXMubm9kZXMgPSBub2RlczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgeworICAgICAgICAgICAgcmV0dXJuIG5vZGVzLnNpemUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBOb2RlIGl0ZW0oaW50IGluZGV4KSB7CisgICAgICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGdldExlbmd0aCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKE5vZGUpIG5vZGVzLmdldChpbmRleCk7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS94bWwvZG9tL0RPTVV0aWwuamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkveG1sL2RvbS9ET01VdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMzZmI4MQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkveG1sL2RvbS9ET01VdGlsLmphdmEKQEAgLTAsMCArMSwzNyBAQAorcGFja2FnZSBncm9vdnkueG1sLmRvbTsKKworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CisKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLk91dHB1dEtleXM7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CisKK3B1YmxpYyBjbGFzcyBET01VdGlsIHsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBzZXJpYWxpemUoRWxlbWVudCBlbGVtZW50KSB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgc2VyaWFsaXplKGVsZW1lbnQsIG5ldyBTdHJlYW1SZXN1bHQoc3cpKTsKKyAgICAgICAgcmV0dXJuIHN3LnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNlcmlhbGl6ZShFbGVtZW50IGVsZW1lbnQsIE91dHB1dFN0cmVhbSBvcykgeworICAgICAgICBzZXJpYWxpemUoZWxlbWVudCwgbmV3IFN0cmVhbVJlc3VsdChvcykpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2VyaWFsaXplKEVsZW1lbnQgZWxlbWVudCwgU3RyZWFtUmVzdWx0IG91dHB1dFRhcmdldCkgeworICAgICAgICBUcmFuc2Zvcm1lckZhY3RvcnkgdHJhbnNmb3JtZXJGYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7CisgICAgICAgICAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLklOREVOVCwgInllcyIpOworICAgICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZWxlbWVudCksIG91dHB1dFRhcmdldCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS94bWwvZG9tL3BhY2thZ2UuaHRtbCBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkveG1sL2RvbS9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IwNGRlOQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkveG1sL2RvbS9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSw4IEBACis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPHRpdGxlPnBhY2thZ2UgZ3Jvb3Z5LnhtbC5kb20uKjwvdGl0bGU+CisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgPHA+R3Jvb3Z5IFhNTCBEb20gcHJvY2Vzc2luZyBjbGFzc2VzLjwvcD4KKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS94bWwvcGFja2FnZS5odG1sIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS94bWwvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNjM2ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3htbC9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSw4IEBACis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPHRpdGxlPnBhY2thZ2UgZ3Jvb3Z5LnhtbC4qPC90aXRsZT4KKyAgPC9oZWFkPgorICA8Ym9keT4KKyAgICA8cD5Hcm9vdnkgbWFya3VwIGJ1aWxkZXIgY2xhc3NlcyBmb3Igd29ya2luZyB3aXRoIFNBWCBhbmQgVzNDIERPTSBhbmQgR3Jvb3Z5IG1hcmt1cC48L3A+CisgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkveG1sL3N0cmVhbWluZ21hcmt1cHN1cHBvcnQvQWJzdHJhY3RTdHJlYW1pbmdCdWlsZGVyLmdyb292eSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkveG1sL3N0cmVhbWluZ21hcmt1cHN1cHBvcnQvQWJzdHJhY3RTdHJlYW1pbmdCdWlsZGVyLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTQ3MGIxCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS94bWwvc3RyZWFtaW5nbWFya3Vwc3VwcG9ydC9BYnN0cmFjdFN0cmVhbWluZ0J1aWxkZXIuZ3Jvb3Z5CkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGdyb292eS54bWwuc3RyZWFtaW5nbWFya3Vwc3VwcG9ydAorCitjbGFzcyBBYnN0cmFjdFN0cmVhbWluZ0J1aWxkZXIgeworICAgIGRlZiBiYWRUYWdDbG9zdXJlID0ge3RhZywgZG9jLCBwZW5kaW5nTmFtZXNwYWNlcywgbmFtZXNwYWNlcywgbmFtZXNwYWNlU3BlY2lmaWNUYWdzLCBwcmVmaXgsIE9iamVjdFtdIHJlc3QgLT4KKyAgICAgICAgZGVmIHVyaSA9IHBlbmRpbmdOYW1lc3BhY2VzW3ByZWZpeF0KKyAgICAgICAgaWYgKHVyaSA9PSBudWxsKSB7CisgICAgICAgICAgICB1cmkgPSBuYW1lc3BhY2VzW3ByZWZpeF0KKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbigiVGFnICR7dGFnfSBpcyBub3QgYWxsb3dlZCBpbiBuYW1lc3BhY2UgJHt1cml9IikKKyAgICB9CisgICAgZGVmIG5hbWVzcGFjZVNldHVwQ2xvc3VyZSA9IHtkb2MsIHBlbmRpbmdOYW1lc3BhY2VzLCBuYW1lc3BhY2VzLCBuYW1lc3BhY2VTcGVjaWZpY1RhZ3MsIHByZWZpeCwgYXR0cnMsIE9iamVjdFtdIHJlc3QgLT4KKyAgICAgICAgYXR0cnMuZWFjaCB7IGtleSwgdmFsdWUgLT4KKyAgICAgICAgICAgIGlmICgga2V5ID09ICIiKSB7CisgICAgICAgICAgICAgICAga2V5ID0gIjoiICAgIC8vIG1hcmtlciBmb3IgZGVmYXVsdCBuYW1lc3BhY2UKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9TdHJpbmcoKSAgICAgLy8gaW4gY2FzZSBpdCdzIG5vdCBhIHN0cmluZworICAgICAgICAgICAgaWYgKG5hbWVzcGFjZXNba2V5XSAhPSB2YWx1ZSkgeworICAgICAgICAgICAgICAgIHBlbmRpbmdOYW1lc3BhY2VzW2tleV0gPSB2YWx1ZQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFuYW1lc3BhY2VTcGVjaWZpY1RhZ3MuY29udGFpbnNLZXkodmFsdWUpKSB7CisgICAgICAgICAgICAgICAgZGVmIGJhc2VFbnRyeSA9IG5hbWVzcGFjZVNwZWNpZmljVGFnc1snOiddCisgICAgICAgICAgICAgICAgbmFtZXNwYWNlU3BlY2lmaWNUYWdzW3ZhbHVlXSA9IFtiYXNlRW50cnlbMF0sIGJhc2VFbnRyeVsxXSwgWzpdXS50b0FycmF5KCkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBkZWYgYWxpYXNTZXR1cENsb3N1cmUgPSB7ZG9jLCBwZW5kaW5nTmFtZXNwYWNlcywgbmFtZXNwYWNlcywgbmFtZXNwYWNlU3BlY2lmaWNUYWdzLCBwcmVmaXgsIGF0dHJzLCBPYmplY3RbXSByZXN0IC0+CisgICAgICAgIGF0dHJzLmVhY2ggeyBrZXksIHZhbHVlIC0+CisgICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBNYXApIHsKKyAgICAgICAgICAgICAgICAvLyBrZXkgaXMgYSBuYW1lc3BhY2UgcHJlZml4IHZhbHVlIGlzIHRoZSBtYXBwaW5nCisgICAgICAgICAgICAgICAgZGVmIGluZm8gPSBudWxsCisgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZXMuY29udGFpbnNLZXkoa2V5KSkgeworICAgICAgICAgICAgICAgICAgICBpbmZvID0gbmFtZXNwYWNlU3BlY2lmaWNUYWdzW25hbWVzcGFjZXNba2V5XV0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBlbmRpbmdOYW1lc3BhY2VzLmNvbnRhaW5zS2V5KGtleSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5mbyA9IG5hbWVzcGFjZVNwZWNpZmljVGFnc1twZW5kaW5nTmFtZXNwYWNlc1trZXldXQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBHcm9vdnlSdW50aW1lRXhjZXB0aW9uKCJuYW1lc3BhY2UgcHJlZml4ICR7a2V5fSBoYXMgbm90IGJlZW4gZGVjbGFyZWQiKQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2YWx1ZS5lYWNoIHsgdG8sIGZyb20gLT4gaW5mb1syXVt0b10gPSBpbmZvWzFdLmN1cnJ5KGZyb20pIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGVmIGluZm8gPSBuYW1lc3BhY2VTcGVjaWZpY1RhZ3NbJzonXQorICAgICAgICAgICAgICAgIGluZm9bMl1ba2V5XSA9IGluZm9bMV0uY3VycnkodmFsdWUpCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZGVmIGdldE5hbWVzcGFjZUNsb3N1cmUgPSB7ZG9jLCBwZW5kaW5nTmFtZXNwYWNlcywgbmFtZXNwYWNlcywgT2JqZWN0W10gcmVzdCAtPiBbbmFtZXNwYWNlcywgcGVuZGluZ05hbWVzcGFjZXNdfQorCisgICAgZGVmIHNwZWNpYWxUYWdzID0gWydkZWNsYXJlTmFtZXNwYWNlJzpuYW1lc3BhY2VTZXR1cENsb3N1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGVjbGFyZUFsaWFzJzphbGlhc1NldHVwQ2xvc3VyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ2dldE5hbWVzcGFjZXMnOmdldE5hbWVzcGFjZUNsb3N1cmVdCisKKyAgICBkZWYgYnVpbGRlciA9IG51bGwKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkveG1sL3N0cmVhbWluZ21hcmt1cHN1cHBvcnQvQmFzZU1hcmt1cEJ1aWxkZXIuamF2YSBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkveG1sL3N0cmVhbWluZ21hcmt1cHN1cHBvcnQvQmFzZU1hcmt1cEJ1aWxkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzQxNTQwCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS94bWwvc3RyZWFtaW5nbWFya3Vwc3VwcG9ydC9CYXNlTWFya3VwQnVpbGRlci5qYXZhCkBAIC0wLDAgKzEsMTc4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgZ3Jvb3Z5LnhtbC5zdHJlYW1pbmdtYXJrdXBzdXBwb3J0OworCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuQ2xvc3VyZTsKK2ltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlJbnRlcmNlcHRhYmxlOworaW1wb3J0IGdyb292eS5sYW5nLkdyb292eU9iamVjdFN1cHBvcnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworcHVibGljIGNsYXNzIEJhc2VNYXJrdXBCdWlsZGVyIGV4dGVuZHMgQnVpbGRlciB7CisgICAgcHVibGljIEJhc2VNYXJrdXBCdWlsZGVyKGZpbmFsIE1hcCBuYW1lc3BhY2VNZXRob2RNYXApIHsKKyAgICAgICAgc3VwZXIobmFtZXNwYWNlTWV0aG9kTWFwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGJpbmQoZmluYWwgQ2xvc3VyZSByb290KSB7CisgICAgICAgIHJldHVybiBuZXcgRG9jdW1lbnQocm9vdCwgdGhpcy5uYW1lc3BhY2VNZXRob2RNYXApOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIERvY3VtZW50IGV4dGVuZHMgQnVpbHQgaW1wbGVtZW50cyBHcm9vdnlJbnRlcmNlcHRhYmxlIHsKKyAgICAgICAgcHJpdmF0ZSBPYmplY3Qgb3V0OworICAgICAgICBwcml2YXRlIGZpbmFsIE1hcCBwZW5kaW5nTmFtZXNwYWNlcyA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIHByaXZhdGUgZmluYWwgTWFwIG5hbWVzcGFjZXMgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICBwcml2YXRlIGZpbmFsIE1hcCBzcGVjaWFsUHJvcGVydGllcyA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIHByZWZpeCA9ICIiOworCisgICAgICAgIHsKKworICAgICAgICAgICAgbmFtZXNwYWNlcy5wdXQoInhtbCIsICJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiKTsgICAgICAgICAgICAgLy8gYnVpbHQgaW4gbmFtZXNwYWNlCisgICAgICAgICAgICBuYW1lc3BhY2VzLnB1dCgibWtwIiwgImh0dHA6Ly93d3cuY29kZWhhdXMub3JnL0dyb292eS9tYXJrdXAva2V5d29yZHMiKTsgICAvLyBwc2V1ZG8gbmFtZXNwYWNlIGZvciBtYXJrdXAga2V5d29yZHMKKworICAgICAgICAgICAgc3BlY2lhbFByb3BlcnRpZXMucHV0KCJvdXQiLCBuZXcgT3V0cHV0U2luaygib3V0IikgeworICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgbGVmdFNoaWZ0KGZpbmFsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGVmdFNoaWZ0KCJ5aWVsZCIsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHNwZWNpYWxQcm9wZXJ0aWVzLnB1dCgidW5lc2NhcGVkIiwgbmV3IE91dHB1dFNpbmsoInVuZXNjYXBlZCIpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGxlZnRTaGlmdChmaW5hbCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlZnRTaGlmdCgieWllbGRVbmVzY2FwZWQiLCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBzcGVjaWFsUHJvcGVydGllcy5wdXQoIm5hbWVzcGFjZXMiLCBuZXcgT3V0cHV0U2luaygibmFtZXNwYWNlcyIpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGxlZnRTaGlmdChmaW5hbCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlZnRTaGlmdCgiZGVjbGFyZU5hbWVzcGFjZSIsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHNwZWNpYWxQcm9wZXJ0aWVzLnB1dCgicGkiLCBuZXcgT3V0cHV0U2luaygicGkiKSB7CisgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBsZWZ0U2hpZnQoZmluYWwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0U2hpZnQoInBpIiwgdmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgc3BlY2lhbFByb3BlcnRpZXMucHV0KCJjb21tZW50IiwgbmV3IE91dHB1dFNpbmsoImNvbW1lbnQiKSB7CisgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBsZWZ0U2hpZnQoZmluYWwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0U2hpZnQoImNvbW1lbnQiLCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGFic3RyYWN0IGNsYXNzIE91dHB1dFNpbmsgZXh0ZW5kcyBHcm9vdnlPYmplY3RTdXBwb3J0IHsKKyAgICAgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisKKyAgICAgICAgICAgIHB1YmxpYyBPdXRwdXRTaW5rKGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIE9iamVjdCBpbnZva2VNZXRob2QoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIE9iamVjdCBhcmdzKSB7CisgICAgICAgICAgICAgICAgRG9jdW1lbnQudGhpcy5wcmVmaXggPSB0aGlzLm5hbWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIERvY3VtZW50LnRoaXMuaW52b2tlTWV0aG9kKG5hbWUsIGFyZ3MpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGxlZnRTaGlmdChPYmplY3QgaXRlbSk7CisKKyAgICAgICAgICAgIHByb3RlY3RlZCBPYmplY3QgbGVmdFNoaWZ0KGZpbmFsIFN0cmluZyBjb21tYW5kLCBmaW5hbCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgICAgICAgICBEb2N1bWVudC50aGlzLmdldFByb3BlcnR5KCJta3AiKTsKKyAgICAgICAgICAgICAgICBEb2N1bWVudC50aGlzLmludm9rZU1ldGhvZChjb21tYW5kLCBuZXcgT2JqZWN0W117dmFsdWV9KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBEb2N1bWVudChmaW5hbCBDbG9zdXJlIHJvb3QsIGZpbmFsIE1hcCBuYW1lc3BhY2VNZXRob2RNYXApIHsKKyAgICAgICAgICAgIHN1cGVyKHJvb3QsIG5hbWVzcGFjZU1ldGhvZE1hcCk7CisgICAgICAgIH0KKworICAgICAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICAgICAgICogQHNlZSBncm9vdnkubGFuZy5Hcm9vdnlPYmplY3QjaW52b2tlTWV0aG9kKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpCisgICAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBPYmplY3QgaW52b2tlTWV0aG9kKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBPYmplY3QgYXJncykgeworICAgICAgICAgICAgZmluYWwgT2JqZWN0W10gYXJndW1lbnRzID0gKE9iamVjdFtdKSBhcmdzOworICAgICAgICAgICAgTWFwIGF0dHJzID0gQ29sbGVjdGlvbnMuRU1QVFlfTUFQOworICAgICAgICAgICAgT2JqZWN0IGJvZHkgPSBudWxsOworCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gU29ydCB0aGUgcGFyYW1ldGVycyBvdXQKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSAhPSBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgYXJnID0gYXJndW1lbnRzW2ldOworCisgICAgICAgICAgICAgICAgaWYgKGFyZyBpbnN0YW5jZW9mIE1hcCkgeworICAgICAgICAgICAgICAgICAgICBhdHRycyA9IChNYXApIGFyZzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZyBpbnN0YW5jZW9mIENsb3N1cmUpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xvc3VyZSBjID0gKChDbG9zdXJlKSBhcmcpOworCisgICAgICAgICAgICAgICAgICAgIGMuc2V0RGVsZWdhdGUodGhpcyk7CisgICAgICAgICAgICAgICAgICAgIGJvZHkgPSBjLmFzV3JpdGFibGUoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBib2R5ID0gYXJnOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIGNhbGwgdGhlIGNsb3N1cmUgY29ycmVzcG9uZGluZyB0byB0aGUgdGFnCisgICAgICAgICAgICAvLworICAgICAgICAgICAgZmluYWwgT2JqZWN0IHVyaTsKKworICAgICAgICAgICAgaWYgKHRoaXMucGVuZGluZ05hbWVzcGFjZXMuY29udGFpbnNLZXkodGhpcy5wcmVmaXgpKSB7CisgICAgICAgICAgICAgICAgdXJpID0gdGhpcy5wZW5kaW5nTmFtZXNwYWNlcy5nZXQodGhpcy5wcmVmaXgpOworICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5hbWVzcGFjZXMuY29udGFpbnNLZXkodGhpcy5wcmVmaXgpKSB7CisgICAgICAgICAgICAgICAgdXJpID0gdGhpcy5uYW1lc3BhY2VzLmdldCh0aGlzLnByZWZpeCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHVyaSA9ICI6IjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgT2JqZWN0W10gaW5mbyA9IChPYmplY3RbXSkgdGhpcy5uYW1lc3BhY2VTcGVjaWZpY1RhZ3MuZ2V0KHVyaSk7CisgICAgICAgICAgICBmaW5hbCBNYXAgdGFnTWFwID0gKE1hcCkgaW5mb1syXTsKKyAgICAgICAgICAgIGZpbmFsIENsb3N1cmUgZGVmYXVsdFRhZ0Nsb3N1cmUgPSAoQ2xvc3VyZSkgaW5mb1swXTsKKworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByZWZpeCA9IHRoaXMucHJlZml4OworICAgICAgICAgICAgdGhpcy5wcmVmaXggPSAiIjsKKworICAgICAgICAgICAgaWYgKHRhZ01hcC5jb250YWluc0tleShuYW1lKSkgeworICAgICAgICAgICAgICAgIHJldHVybiAoKENsb3N1cmUpIHRhZ01hcC5nZXQobmFtZSkpLmNhbGwobmV3IE9iamVjdFtde3RoaXMsIHRoaXMucGVuZGluZ05hbWVzcGFjZXMsIHRoaXMubmFtZXNwYWNlcywgdGhpcy5uYW1lc3BhY2VTcGVjaWZpY1RhZ3MsIHByZWZpeCwgYXR0cnMsIGJvZHksIHRoaXMub3V0fSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VGFnQ2xvc3VyZS5jYWxsKG5ldyBPYmplY3RbXXtuYW1lLCB0aGlzLCB0aGlzLnBlbmRpbmdOYW1lc3BhY2VzLCB0aGlzLm5hbWVzcGFjZXMsIHRoaXMubmFtZXNwYWNlU3BlY2lmaWNUYWdzLCBwcmVmaXgsIGF0dHJzLCBib2R5LCB0aGlzLm91dH0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAgICAgKiBAc2VlIGdyb292eS5sYW5nLkdyb292eU9iamVjdCNnZXRQcm9wZXJ0eShqYXZhLmxhbmcuU3RyaW5nKQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShmaW5hbCBTdHJpbmcgcHJvcGVydHkpIHsKKyAgICAgICAgICAgIGZpbmFsIE9iamVjdCBzcGVjaWFsID0gdGhpcy5zcGVjaWFsUHJvcGVydGllcy5nZXQocHJvcGVydHkpOworCisgICAgICAgICAgICBpZiAoc3BlY2lhbCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhpcy5wcmVmaXggPSBwcm9wZXJ0eTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNwZWNpYWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICAgICAqIEBzZWUgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0I3NldFByb3BlcnR5KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHksIE9iamVjdCBuZXdWYWx1ZSkgeworICAgICAgICAgICAgaWYgKCJ0cmlnZ2VyIi5lcXVhbHMocHJvcGVydHkpKSB7CisgICAgICAgICAgICAgICAgdGhpcy5vdXQgPSBuZXdWYWx1ZTsKKyAgICAgICAgICAgICAgICB0aGlzLnJvb3QuY2FsbCh0aGlzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3VwZXIuc2V0UHJvcGVydHkocHJvcGVydHksIG5ld1ZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkveG1sL3N0cmVhbWluZ21hcmt1cHN1cHBvcnQvQnVpbGRlci5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS94bWwvc3RyZWFtaW5nbWFya3Vwc3VwcG9ydC9CdWlsZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMyZGZkNQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkveG1sL3N0cmVhbWluZ21hcmt1cHN1cHBvcnQvQnVpbGRlci5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGdyb292eS54bWwuc3RyZWFtaW5nbWFya3Vwc3VwcG9ydDsKKworaW1wb3J0IGdyb292eS5sYW5nLkNsb3N1cmU7CitpbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0U3VwcG9ydDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQnVpbGRlciBleHRlbmRzIEdyb292eU9iamVjdFN1cHBvcnQgeworCXByb3RlY3RlZCBmaW5hbCBNYXAgbmFtZXNwYWNlTWV0aG9kTWFwID0gbmV3IEhhc2hNYXAoKTsKKwkKKwlwdWJsaWMgQnVpbGRlcihmaW5hbCBNYXAgbmFtZXNwYWNlTWV0aG9kTWFwKSB7CisJZmluYWwgSXRlcmF0b3Iga2V5SXRlcmF0b3IgPSBuYW1lc3BhY2VNZXRob2RNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKKwkJCisJCXdoaWxlIChrZXlJdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJZmluYWwgT2JqZWN0IGtleSA9IGtleUl0ZXJhdG9yLm5leHQoKTsKKwkJZmluYWwgTGlzdCB2YWx1ZSA9IChMaXN0KW5hbWVzcGFjZU1ldGhvZE1hcC5nZXQoa2V5KTsKKwkJZmluYWwgQ2xvc3VyZSBkZyA9ICgoQ2xvc3VyZSl2YWx1ZS5nZXQoMSkpLmFzV3JpdGFibGUoKTsKKwkJCisJCQl0aGlzLm5hbWVzcGFjZU1ldGhvZE1hcC5wdXQoa2V5LCBuZXcgT2JqZWN0W117dmFsdWUuZ2V0KDApLCBkZywgZmV0dGxlTWV0aG9kTWFwKGRnLCAoTWFwKXZhbHVlLmdldCgyKSl9KTsKKwkJfQorCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBNYXAgZmV0dGxlTWV0aG9kTWFwKGZpbmFsIENsb3N1cmUgZGVmYXVsdEdlbmVyYXRvciwgZmluYWwgTWFwIG1ldGhvZE1hcCkgeworCWZpbmFsIE1hcCBuZXdNZXRob2RNYXAgPSBuZXcgSGFzaE1hcCgpOworCWZpbmFsIEl0ZXJhdG9yIGtleUl0ZXJhdG9yID0gbWV0aG9kTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7CisJCQorCQl3aGlsZSAoa2V5SXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCWZpbmFsIE9iamVjdCBrZXkgPSBrZXlJdGVyYXRvci5uZXh0KCk7CisJCWZpbmFsIE9iamVjdCB2YWx1ZSA9IG1ldGhvZE1hcC5nZXQoa2V5KTsKKwkJCisJCQlpZiAoKHZhbHVlIGluc3RhbmNlb2YgQ2xvc3VyZSkpIHsKKwkJCQluZXdNZXRob2RNYXAucHV0KGtleSwgdmFsdWUpOworCQkJfSBlbHNlIHsKKwkJCQluZXdNZXRob2RNYXAucHV0KGtleSwgZGVmYXVsdEdlbmVyYXRvci5jdXJyeSgoT2JqZWN0W10pdmFsdWUpKTsKKwkJCX0KKwkJfQorCQkKKwkJcmV0dXJuIG5ld01ldGhvZE1hcDsKKwl9CisJCisJcHVibGljIGFic3RyYWN0IE9iamVjdCBiaW5kKENsb3N1cmUgcm9vdCk7CisJCisJcHJvdGVjdGVkIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBCdWlsdCBleHRlbmRzIEdyb292eU9iamVjdFN1cHBvcnQgeworCXByb3RlY3RlZCBmaW5hbCBDbG9zdXJlIHJvb3Q7CisJcHJvdGVjdGVkIGZpbmFsIE1hcCBuYW1lc3BhY2VTcGVjaWZpY1RhZ3MgPSBuZXcgSGFzaE1hcCgpOworCQkKKwkJcHVibGljIEJ1aWx0KGZpbmFsIENsb3N1cmUgcm9vdCwgZmluYWwgTWFwIG5hbWVzcGFjZVRhZ01hcCkgeworCQkJdGhpcy5uYW1lc3BhY2VTcGVjaWZpY1RhZ3MucHV0QWxsKG5hbWVzcGFjZVRhZ01hcCk7CisJCQorCQkJdGhpcy5yb290ID0gKENsb3N1cmUpcm9vdC5jbG9uZSgpOworCQkJCisJCQl0aGlzLnJvb3Quc2V0RGVsZWdhdGUodGhpcyk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L3htbC9zdHJlYW1pbmdtYXJrdXBzdXBwb3J0L1N0cmVhbWluZ01hcmt1cFdyaXRlci5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS94bWwvc3RyZWFtaW5nbWFya3Vwc3VwcG9ydC9TdHJlYW1pbmdNYXJrdXBXcml0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODYxOTRlCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS94bWwvc3RyZWFtaW5nbWFya3Vwc3VwcG9ydC9TdHJlYW1pbmdNYXJrdXBXcml0ZXIuamF2YQpAQCAtMCwwICsxLDE4MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgZ3Jvb3Z5LnhtbC5zdHJlYW1pbmdtYXJrdXBzdXBwb3J0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0RW5jb2RlcjsKKworcHVibGljIGNsYXNzIFN0cmVhbWluZ01hcmt1cFdyaXRlciBleHRlbmRzIFdyaXRlciB7CisJcHJvdGVjdGVkIGZpbmFsIFdyaXRlciB3cml0ZXI7CisgICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBlbmNvZGluZzsKKyAgICBwcm90ZWN0ZWQgZmluYWwgQ2hhcnNldEVuY29kZXIgZW5jb2RlcjsKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiB3cml0aW5nQXR0cmlidXRlID0gZmFsc2U7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaGF2ZUhpZ2hTdXJyb2dhdGUgPSBmYWxzZTsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nQnVmZmVyIHN1cnJvZ2F0ZVBhaXIgPSBuZXcgU3RyaW5nQnVmZmVyKDIpOworCXByaXZhdGUgZmluYWwgV3JpdGVyIGVzY2FwZWRXcml0ZXIgPSAgbmV3IFdyaXRlcigpIHsKKwkJCQkJCQkJCQkJLyogKG5vbi1KYXZhZG9jKQorCQkJCQkJCQkJCQkgKiBAc2VlIGphdmEuaW8uV3JpdGVyI2Nsb3NlKCkKKwkJCQkJCQkJCQkJICovCisJCQkJCQkJCQkJCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCQkJCQkJCQkJCVN0cmVhbWluZ01hcmt1cFdyaXRlci50aGlzLmNsb3NlKCk7CisJCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQkJCisJCQkJCQkJCQkJCS8qIChub24tSmF2YWRvYykKKwkJCQkJCQkJCQkJICogQHNlZSBqYXZhLmlvLldyaXRlciNmbHVzaCgpCisJCQkJCQkJCQkJCSAqLworCQkJCQkJCQkJCQlwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCQkJCQkJCQkJCQlTdHJlYW1pbmdNYXJrdXBXcml0ZXIudGhpcy5mbHVzaCgpOworCQkJCQkJCQkJCQl9CisJCQorCQkJCQkJCQkJCQkvKiAobm9uLUphdmFkb2MpCisJCQkJCQkJCQkJCSAqIEBzZWUgamF2YS5pby5Xcml0ZXIjd3JpdGUoaW50KQorCQkJCQkJCQkJCQkgKi8KKwkJCQkJCQkJCQkJcHVibGljIHZvaWQgd3JpdGUoZmluYWwgaW50IGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCQkJCQkJCQkJCQlpZiAoYyA9PSAnPCcpIHsKKwkJCQkJCQkJCQkJCQlTdHJlYW1pbmdNYXJrdXBXcml0ZXIudGhpcy53cml0ZXIud3JpdGUoIiZsdDsiKTsKKwkJCQkJCQkJCQkJCX0gZWxzZSBpZiAoYyA9PSAnPicpIHsKKwkJCQkJCQkJCQkJCQlTdHJlYW1pbmdNYXJrdXBXcml0ZXIudGhpcy53cml0ZXIud3JpdGUoIiZndDsiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnJicpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW1pbmdNYXJrdXBXcml0ZXIudGhpcy53cml0ZXIud3JpdGUoIiZhbXA7Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworCQkJCQkJCQkJCQkJCVN0cmVhbWluZ01hcmt1cFdyaXRlci50aGlzLndyaXRlKGMpOworCQkJCQkJCQkJCQkJfQorCQkJCQkJCQkJCQl9CisJCQkJCQkJCQkJCQorCQkJCQkJCQkJCQkvKiAobm9uLUphdmFkb2MpCisJCQkJCQkJCQkJCSAqIEBzZWUgamF2YS5pby5Xcml0ZXIjd3JpdGUoY2hhcltdLCBpbnQsIGludCkKKwkJCQkJCQkJCQkJICovCisJCQkJCQkJCQkJCXB1YmxpYyB2b2lkIHdyaXRlKGZpbmFsIGNoYXJbXSBjYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkJCQkJCQkJCQkJd2hpbGUgKGxlbi0tID4gMCl7CisJCQkJCQkJCQkJCQkJd3JpdGUoY2J1ZltvZmYrK10pOworCQkJCQkJCQkJCQkJfQorCQkJCQkJCQkJCQl9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRXcml0aW5nQXR0cmlidXRlKGZpbmFsIGJvb2xlYW4gd3JpdGluZ0F0dHJpYnV0ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtaW5nTWFya3VwV3JpdGVyLnRoaXMud3JpdGluZ0F0dHJpYnV0ZSA9IHdyaXRpbmdBdHRyaWJ1dGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKwkJCQkJCQkJCQkJCisJCQkJCQkJCQkJCXB1YmxpYyBXcml0ZXIgZXhjYXBlZCgpIHsKKwkJCQkJCQkJCQkJCXJldHVybiBlc2NhcGVkV3JpdGVyOworCQkJCQkJCQkJCQl9CisJCQkJCQkJCQkJCQorCQkJCQkJCQkJCQlwdWJsaWMgV3JpdGVyIHVuZXNjYXBlZCgpIHsKKwkJCQkJCQkJCQkJCXJldHVybiBTdHJlYW1pbmdNYXJrdXBXcml0ZXIudGhpczsKKwkJCQkJCQkJCQkJfQorCQkJCQkJCQkJCX07CisKKyAgICBwdWJsaWMgU3RyZWFtaW5nTWFya3VwV3JpdGVyKGZpbmFsIFdyaXRlciB3cml0ZXIsIGZpbmFsIFN0cmluZyBlbmNvZGluZykgeworICAgICAgICB0aGlzLndyaXRlciA9IHdyaXRlcjsKKyAgICAgICAgCisgICAgICAgIGlmIChlbmNvZGluZyAhPSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLmVuY29kaW5nID0gZW5jb2Rpbmc7CisgICAgICAgIH0gZWxzZSBpZiAod3JpdGVyIGluc3RhbmNlb2YgT3V0cHV0U3RyZWFtV3JpdGVyKSB7CisgICAgICAgICAgICB0aGlzLmVuY29kaW5nID0gKChPdXRwdXRTdHJlYW1Xcml0ZXIpd3JpdGVyKS5nZXRFbmNvZGluZygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy5lbmNvZGluZyA9ICJVUy1BU0NJSSI7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHRoaXMuZW5jb2RlciA9IENoYXJzZXQuZm9yTmFtZSh0aGlzLmVuY29kaW5nKS5uZXdFbmNvZGVyKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBTdHJlYW1pbmdNYXJrdXBXcml0ZXIoZmluYWwgV3JpdGVyIHdyaXRlcikgeworICAgICAgICB0aGlzKHdyaXRlciwgbnVsbCk7CisgICAgfQorICAgIAorICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIGphdmEuaW8uV3JpdGVyI2Nsb3NlKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMud3JpdGVyLmNsb3NlKCk7CisgICAgfQorICAgIAorICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIGphdmEuaW8uV3JpdGVyI2ZsdXNoKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMud3JpdGVyLmZsdXNoKCk7CisgICAgfQorICAgIAorICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIGphdmEuaW8uV3JpdGVyI3dyaXRlKGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZShmaW5hbCBpbnQgYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGMgPj0gMFhEQzAwICYmIGMgPD0gMFhERkZGKSB7CisgICAgICAgICAgICAvLyBMb3cgc3Vycm9nYXRlCisgICAgICAgICAgICB0aGlzLnN1cnJvZ2F0ZVBhaXIuYXBwZW5kKChjaGFyKWMpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAodGhpcy5lbmNvZGVyLmNhbkVuY29kZSh0aGlzLnN1cnJvZ2F0ZVBhaXIpKSB7CisgICAgICAgICAgICAgICAgdGhpcy53cml0ZXIud3JpdGUodGhpcy5zdXJyb2dhdGVQYWlyLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aGlzLndyaXRlci53cml0ZSgiJiN4Iik7CisgICAgICAgICAgICAgICAgdGhpcy53cml0ZXIud3JpdGUoSW50ZWdlci50b0hleFN0cmluZygwWDEwMDAwICsgKCh0aGlzLnN1cnJvZ2F0ZVBhaXIuY2hhckF0KDApICYgMFgzRkYpIDw8IDEwKSArIChjICYgMFgzRkYpKSk7CisgICAgICAgICAgICAgICAgdGhpcy53cml0ZXIud3JpdGUoJzsnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgdGhpcy5oYXZlSGlnaFN1cnJvZ2F0ZSA9IGZhbHNlOworICAgICAgICAgICAgdGhpcy5zdXJyb2dhdGVQYWlyLnNldExlbmd0aCgwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICh0aGlzLmhhdmVIaWdoU3Vycm9nYXRlKSB7CisgICAgICAgICAgICAgICAgdGhpcy5oYXZlSGlnaFN1cnJvZ2F0ZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIHRoaXMuc3Vycm9nYXRlUGFpci5zZXRMZW5ndGgoMCk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJIaWdoIFN1cnJvZ2F0ZSBub3QgZm9sbG93ZWQgYnkgTG93IFN1cnJvZ2F0ZSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoYyA+PSAwWEQ4MDAgJiYgYyA8PSAwWERCRkYpIHsKKyAgICAgICAgICAgICAgICAvLyBIaWdoIHN1cnJvZ2F0ZQorICAgICAgICAgICAgICAgIHRoaXMuc3Vycm9nYXRlUGFpci5hcHBlbmQoKGNoYXIpYyk7CisgICAgICAgICAgICAgICAgdGhpcy5oYXZlSGlnaFN1cnJvZ2F0ZSA9IHRydWU7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuZW5jb2Rlci5jYW5FbmNvZGUoKGNoYXIpYykpIHsKKyAgICAgICAgICAgICAgICB0aGlzLndyaXRlci53cml0ZSgiJiN4Iik7CisgICAgICAgICAgICAgICAgdGhpcy53cml0ZXIud3JpdGUoSW50ZWdlci50b0hleFN0cmluZyhjKSk7CisgICAgICAgICAgICAgICAgdGhpcy53cml0ZXIud3JpdGUoJzsnKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnXCcnICYmIHRoaXMud3JpdGluZ0F0dHJpYnV0ZSkgeworICAgICAgICAgICAgICAgIHRoaXMud3JpdGVyLndyaXRlKCImYXBvczsiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhpcy53cml0ZXIud3JpdGUoYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAqIEBzZWUgamF2YS5pby5Xcml0ZXIjd3JpdGUoY2hhcltdLCBpbnQsIGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZShmaW5hbCBjaGFyW10gY2J1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgd2hpbGUgKGxlbi0tID4gMCl7CisgICAgICAgICAgICB3cml0ZShjYnVmW29mZisrXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0V3JpdGluZ0F0dHJpYnV0ZShmaW5hbCBib29sZWFuIHdyaXRpbmdBdHRyaWJ1dGUpIHsKKyAgICAgICAgdGhpcy53cml0aW5nQXR0cmlidXRlID0gd3JpdGluZ0F0dHJpYnV0ZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIFdyaXRlciBlc2NhcGVkKCkgeworICAgICAgICByZXR1cm4gdGhpcy5lc2NhcGVkV3JpdGVyOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgV3JpdGVyIHVuZXNjYXBlZCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmVuY29kaW5nOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9ncm9vdnkveG1sL3N0cmVhbWluZ21hcmt1cHN1cHBvcnQvcGFja2FnZS5odG1sIGIvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS94bWwvc3RyZWFtaW5nbWFya3Vwc3VwcG9ydC9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY2MWVhOAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9ncm9vdnkveG1sL3N0cmVhbWluZ21hcmt1cHN1cHBvcnQvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsOCBAQAorPGh0bWw+CisgIDxoZWFkPgorICAgIDx0aXRsZT5wYWNrYWdlIGdyb292eS54bWwuc3RyZWFtaW5nbWFya3Vwc3VwcG9ydC4qPC90aXRsZT4KKyAgPC9oZWFkPgorICA8Ym9keT4KKyAgICA8cD5YbWxCdWlsZGVyIHJlbGF0ZWQgY2xhc3NlcyB0byBzdXBwb3J0IHN0cmVhbWluZyBYTUwuPC9wPgorICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9Hcm9vdnlCdWdFcnJvci5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvR3Jvb3Z5QnVnRXJyb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWRhOThkCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvR3Jvb3Z5QnVnRXJyb3IuamF2YQpAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnk7CisKKy8qKgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGFuIGVycm9yIHRoYXQgaXMgdGhyb3duIHdoZW4gYSBidWcgaXMgCisgKiByZWNvZ25pemVkIGluc2lkZSB0aGUgcnVudGltZS4gQmFzaWNhbGx5IGl0IGlzIHRocm93biB3aGVuCisgKiBhIGNvbnN0cmFpbnQgaXMgbm90IGZ1bGxmaWxsZWQgdGhhdCBzaG91bGQgYmUgZnVsbGZpbGVkLiAKKyAqIAorICogQGF1dGhvciBKb2NoZW4gVGhlb2Rvcm91CisgKi8KK3B1YmxpYyBjbGFzcyBHcm9vdnlCdWdFcnJvciBleHRlbmRzIEFzc2VydGlvbkVycm9yIHsKKyAgICAKKyAgICAvLyBtZXNzYWdlIHN0cmluZworICAgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2U7CisgICAgLy8gb3B0aW9uYWwgZXhjZXB0aW9uCisgICAgcHJpdmF0ZSBmaW5hbCBFeGNlcHRpb24gZXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogY29uc3RydWN0cyBhIGJ1ZyBlcnJvciB1c2luZyB0aGUgZ2l2ZW4gdGV4dAorICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBlcnJvciBtZXNzYWdlIHRleHQKKyAgICAgKi8KKyAgICBwdWJsaWMgR3Jvb3Z5QnVnRXJyb3IoIFN0cmluZyBtZXNzYWdlICkgeworICAgICAgICB0aGlzKG1lc3NhZ2UsIG51bGwpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgYnVnIGVycm9yIHVzaW5nIHRoZSBnaXZlbiBleGNlcHRpb24KKyAgICAgKiBAcGFyYW0gZXhjZXB0aW9uIGNhdXNlIG9mIHRoaXMgZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgR3Jvb3Z5QnVnRXJyb3IoIEV4Y2VwdGlvbiBleGNlcHRpb24gKSB7CisgICAgICAgIHRoaXMobnVsbCwgZXhjZXB0aW9uKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIGJ1ZyBlcnJvciB1c2luZyB0aGUgZ2l2ZW4gZXhjZXB0aW9uIGFuZAorICAgICAqIGEgdGV4dCB3aXRoIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNhdXNlIAorICAgICAqIEBwYXJhbSBtc2cgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGVycm9yCisgICAgICogQHBhcmFtIGV4Y2VwdGlvbiBjYXVzZSBvZiB0aGlzIGVycm9yCisgICAgICovCisgICAgcHVibGljIEdyb292eUJ1Z0Vycm9yKCBTdHJpbmcgbXNnLCBFeGNlcHRpb24gZXhjZXB0aW9uICkgeworICAgICAgICB0aGlzLmV4Y2VwdGlvbiA9IGV4Y2VwdGlvbjsKKyAgICAgICAgdGhpcy5tZXNzYWdlID0gbXNnOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBjbGFzcyBieSBjYWxsaW5nIDxjb2RlPmdldE1lc3NhZ2UoKTwvY29kZT4uICAKKyAgICAgKiBAc2VlICNnZXRNZXNzYWdlKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gZ2V0TWVzc2FnZSgpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBkZXRhaWwgbWVzc2FnZSBzdHJpbmcgb2YgdGhpcyBlcnJvci4gVGhlIG1lc3NhZ2UgCisgICAgICogd2lsbCBjb25zaXN0IG9mIHRoZSBidWcgdGV4dCBwcmVmaXhlZCBieSAiQlVHISAiIGlmIHRoZXJlIHRoaXMKKyAgICAgKiBpc250YW5jZSB3YXMgY3JlYXRlZCB1c2luZyBhIG1lc3NhZ2UuIElmIHRoaXMgZXJyb3Igd2FzIAorICAgICAqIGNvbnN0cnVjdGVkIHdpdGhvdXQgdXNpbmcgYSBidWcgdGV4dCB0aGUgbWVzc2FnZSBvZiB0aGUgY2F1c2UgCisgICAgICogaXMgdXNlZCBwcmVmaXhlZCBieSAiQlVHISBVTkNBVUdIVCBFWENFUFRJT046ICIKKyAgICAgKiAgCisgICAgICogQHJldHVybiB0aGUgZGV0YWlsIG1lc3NhZ2Ugc3RyaW5nIG9mIHRoaXMgZXJyb3IuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgeworICAgICAgICBpZiggbWVzc2FnZSAhPSBudWxsICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICJCVUchICIrbWVzc2FnZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAiQlVHISBVTkNBVUdIVCBFWENFUFRJT046ICIgKyBleGNlcHRpb24uZ2V0TWVzc2FnZSgpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBUaHJvd2FibGUgZ2V0Q2F1c2UoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmV4Y2VwdGlvbjsKKyAgICB9ICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGJ1ZyB0ZXh0IHRvIGRlc2NyaWJlIHRoaXMgZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEJ1Z1RleHQoKXsKKyAgICAgICAgaWYoIG1lc3NhZ2UgIT0gbnVsbCApeworICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZXhjZXB0aW9uLmdldE1lc3NhZ2UoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBidWcgdGV4dCB0byBkZXNjcmliZSB0aGlzIGVycm9yCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QnVnVGV4dChTdHJpbmcgbXNnKSB7CisgICAgICAgIHRoaXMubWVzc2FnZSA9IG1zZzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9Hcm9vdnlFeGNlcHRpb24uamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L0dyb292eUV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMTcwYjMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9Hcm9vdnlFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eTsKKworcHVibGljIGNsYXNzIEdyb292eUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiBpbXBsZW1lbnRzIEdyb292eUV4Y2VwdGlvbkludGVyZmFjZSB7CisgICAgcHJpdmF0ZSBib29sZWFuIGZhdGFsID0gdHJ1ZTsKKworICAgIHB1YmxpYyBHcm9vdnlFeGNlcHRpb24oKSB7CisgICAgfQorCisgICAgcHVibGljIEdyb292eUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICBzdXBlcihtZXNzYWdlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgR3Jvb3Z5RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKKyAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOworICAgIH0KKworICAgIHB1YmxpYyBHcm9vdnlFeGNlcHRpb24oYm9vbGVhbiBmYXRhbCkgeworICAgICAgICBzdXBlcigpOworICAgICAgICB0aGlzLmZhdGFsID0gZmF0YWw7CisgICAgfQorCisgICAgcHVibGljIEdyb292eUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgYm9vbGVhbiBmYXRhbCkgeworICAgICAgICBzdXBlcihtZXNzYWdlKTsKKyAgICAgICAgdGhpcy5mYXRhbCA9IGZhdGFsOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRmF0YWwoKSB7CisgICAgICAgIHJldHVybiBmYXRhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGYXRhbChib29sZWFuIGZhdGFsKSB7CisgICAgICAgIHRoaXMuZmF0YWwgPSBmYXRhbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9Hcm9vdnlFeGNlcHRpb25JbnRlcmZhY2UuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L0dyb292eUV4Y2VwdGlvbkludGVyZmFjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZWU1ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9Hcm9vdnlFeGNlcHRpb25JbnRlcmZhY2UuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eTsKKworLyoqCisgKiAgQW4gaW50ZXJmYWNlIGZvciB1c2UgYnkgYWxsIEdyb292eSBjb21waWxlciBleGNlcHRpb25zLgorICovCisKK3B1YmxpYyBpbnRlcmZhY2UgR3Jvb3Z5RXhjZXB0aW9uSW50ZXJmYWNlIHsKKworICAgIGJvb2xlYW4gaXNGYXRhbCgpOworCisgICAgdm9pZCBzZXRGYXRhbCggYm9vbGVhbiBmYXRhbCApOworICAgIAorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50L0FudFByb2plY3RQcm9wZXJ0aWVzRGVsZWdhdGUuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudC9BbnRQcm9qZWN0UHJvcGVydGllc0RlbGVnYXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBkMzgxNgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudC9BbnRQcm9qZWN0UHJvcGVydGllc0RlbGVnYXRlLmphdmEKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50OworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKKy8qKgorICogQGF1dGhvciBHdWlsbGF1bWUgTGFmb3JnZQorICovCitwdWJsaWMgY2xhc3MgQW50UHJvamVjdFByb3BlcnRpZXNEZWxlZ2F0ZSBleHRlbmRzIEhhc2h0YWJsZSB7CisKKyAgICBwcml2YXRlIFByb2plY3QgcHJvamVjdDsKKworICAgIHB1YmxpYyBBbnRQcm9qZWN0UHJvcGVydGllc0RlbGVnYXRlKFByb2plY3QgcHJvamVjdCkgeworICAgICAgICBzdXBlcigpOworICAgICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gcHJvamVjdC5nZXRQcm9wZXJ0aWVzKCkuaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBzaXplKCkgeworICAgICAgICByZXR1cm4gcHJvamVjdC5nZXRQcm9wZXJ0aWVzKCkuc2l6ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaXMgYWx3YXlzIHRocm93biB3aGVuIHRoaXMgbWV0aG9kIGlzIGludm9rZWQuIFRoZSBQcm9qZWN0IHByb3BlcnRpZXMgYXJlIGltbXV0YWJsZS4KKyAgICAgKi8gICAgCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNsZWFyKCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIkltcG9zc2libGUgdG8gY2xlYXIgdGhlIHByb2plY3QgcHJvcGVydGllcy4iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNFbXB0eSgpIHsKKyAgICAgICAgcmV0dXJuIHByb2plY3QuZ2V0UHJvcGVydGllcygpLmlzRW1wdHkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdCBjbG9uZSgpIHsKKyAgICAgICAgcmV0dXJuIHByb2plY3QuZ2V0UHJvcGVydGllcygpLmNsb25lKCk7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGNvbnRhaW5zKE9iamVjdCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gcHJvamVjdC5nZXRQcm9wZXJ0aWVzKCkuY29udGFpbnModmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBjb250YWluc0tleShPYmplY3Qga2V5KSB7CisgICAgICAgIHJldHVybiBwcm9qZWN0LmdldFByb3BlcnRpZXMoKS5jb250YWluc0tleShrZXkpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zVmFsdWUoT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIHJldHVybiBwcm9qZWN0LmdldFByb3BlcnRpZXMoKS5jb250YWluc1ZhbHVlKHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIHJldHVybiBwcm9qZWN0LmdldFByb3BlcnRpZXMoKS5lcXVhbHMobyk7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBwcm9qZWN0LmdldFByb3BlcnRpZXMoKS50b1N0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBDb2xsZWN0aW9uIHZhbHVlcygpIHsKKyAgICAgICAgcmV0dXJuIHByb2plY3QuZ2V0UHJvcGVydGllcygpLnZhbHVlcygpOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgRW51bWVyYXRpb24gZWxlbWVudHMoKSB7CisgICAgICAgIHJldHVybiBwcm9qZWN0LmdldFByb3BlcnRpZXMoKS5lbGVtZW50cygpOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgRW51bWVyYXRpb24ga2V5cygpIHsKKyAgICAgICAgcmV0dXJuIHByb2plY3QuZ2V0UHJvcGVydGllcygpLmtleXMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQW50UHJvamVjdFByb3BlcnRpZXNEZWxlZ2F0ZShNYXAgdCkgeworICAgICAgICBzdXBlcih0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcHV0QWxsKE1hcCB0KSB7CisgICAgICAgIFNldCBrZXlTZXQgPSB0LmtleVNldCgpOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0ga2V5U2V0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIE9iamVjdCBrZXkgPSBpdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSB0LmdldChrZXkpOworICAgICAgICAgICAgcHV0KGtleSwgdmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFNldCBlbnRyeVNldCgpIHsKKyAgICAgICAgcmV0dXJuIHByb2plY3QuZ2V0UHJvcGVydGllcygpLmVudHJ5U2V0KCk7CisgICAgfQorCisgICAgcHVibGljIFNldCBrZXlTZXQoKSB7CisgICAgICAgIHJldHVybiBwcm9qZWN0LmdldFByb3BlcnRpZXMoKS5rZXlTZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdCBnZXQoT2JqZWN0IGtleSkgeworICAgICAgICByZXR1cm4gcHJvamVjdC5nZXRQcm9wZXJ0aWVzKCkuZ2V0KGtleSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpcyBhbHdheXMgdGhyb3duIHdoZW4gdGhpcyBtZXRob2QgaXMgaW52b2tlZC4gVGhlIFByb2plY3QgcHJvcGVydGllcyBhcmUgaW1tdXRhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0IHJlbW92ZShPYmplY3Qga2V5KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiSW1wb3NzaWJsZSB0byByZW1vdmUgYSBwcm9wZXJ0eSBmcm9tIHRoZSBwcm9qZWN0IHByb3BlcnRpZXMuIik7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBPYmplY3QgcHV0KE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBPYmplY3Qgb2xkVmFsdWUgPSBudWxsOworICAgICAgICBpZiAoY29udGFpbnNLZXkoa2V5KSkgeworICAgICAgICAgICAgb2xkVmFsdWUgPSBnZXQoa2V5KTsKKyAgICAgICAgfQorICAgICAgICBwcm9qZWN0LnNldFByb3BlcnR5KGtleS50b1N0cmluZygpLCB2YWx1ZS50b1N0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIG9sZFZhbHVlOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hbnQvQ29tcGlsZVRhc2tTdXBwb3J0LmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hbnQvQ29tcGlsZVRhc2tTdXBwb3J0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA0ZmRiNAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudC9Db21waWxlVGFza1N1cHBvcnQuamF2YQpAQCAtMCwwICsxLDE4MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5hbnQ7CisKK2ltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlDbGFzc0xvYWRlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLk1hdGNoaW5nVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlZmVyZW5jZTsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5Db21waWxlckNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5FcnJvclJlcG9ydGVyOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CisKKy8qKgorICogU3VwcG9ydCBmb3IgY29tcGlsYXRpb24gcmVsYXRlZCB0YXNrcy4KKyAqCisgKiBAdmVyc2lvbiAkSWQkCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYXNvbkBwbGFuZXQ1Ny5jb20iPkphc29uIERpbGxvbjwvYT4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIENvbXBpbGVUYXNrU3VwcG9ydAorICAgIGV4dGVuZHMgTWF0Y2hpbmdUYXNrCit7CisgICAgcHJvdGVjdGVkIGZpbmFsIExvZ2dpbmdIZWxwZXIgbG9nID0gbmV3IExvZ2dpbmdIZWxwZXIodGhpcyk7CisKKyAgICBwcm90ZWN0ZWQgUGF0aCBzcmM7CisKKyAgICBwcm90ZWN0ZWQgRmlsZSBkZXN0ZGlyOworCisgICAgcHJvdGVjdGVkIFBhdGggY2xhc3NwYXRoOworCisgICAgcHJvdGVjdGVkIENvbXBpbGVyQ29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgQ29tcGlsZXJDb25maWd1cmF0aW9uKCk7CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBmYWlsT25FcnJvciA9IHRydWU7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGYWlsb25lcnJvcihmaW5hbCBib29sZWFuIGZhaWwpIHsKKyAgICAgICAgZmFpbE9uRXJyb3IgPSBmYWlsOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGdldEZhaWxvbmVycm9yKCkgeworICAgICAgICByZXR1cm4gZmFpbE9uRXJyb3I7CisgICAgfQorCisgICAgcHVibGljIFBhdGggY3JlYXRlU3JjKCkgeworICAgICAgICBpZiAoc3JjID09IG51bGwpIHsKKyAgICAgICAgICAgIHNyYyA9IG5ldyBQYXRoKGdldFByb2plY3QoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNyYy5jcmVhdGVQYXRoKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3JjZGlyKGZpbmFsIFBhdGggZGlyKSB7CisgICAgICAgIGFzc2VydCBkaXIgIT0gbnVsbDsKKworICAgICAgICBpZiAoc3JjID09IG51bGwpIHsKKyAgICAgICAgICAgIHNyYyA9IGRpcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHNyYy5hcHBlbmQoZGlyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBQYXRoIGdldFNyY2RpcigpIHsKKyAgICAgICAgcmV0dXJuIHNyYzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREZXN0ZGlyKGZpbmFsIEZpbGUgZGlyKSB7CisgICAgICAgIGFzc2VydCBkaXIgIT0gbnVsbDsKKworICAgICAgICB0aGlzLmRlc3RkaXIgPSBkaXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoKGZpbmFsIFBhdGggcGF0aCkgeworICAgICAgICBhc3NlcnQgcGF0aCAhPSBudWxsOworCisgICAgICAgIGlmIChjbGFzc3BhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgY2xhc3NwYXRoID0gcGF0aDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGNsYXNzcGF0aC5hcHBlbmQocGF0aCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgUGF0aCBnZXRDbGFzc3BhdGgoKSB7CisgICAgICAgIHJldHVybiBjbGFzc3BhdGg7CisgICAgfQorCisgICAgcHVibGljIFBhdGggY3JlYXRlQ2xhc3NwYXRoKCkgeworICAgICAgICBpZiAoY2xhc3NwYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgIGNsYXNzcGF0aCA9IG5ldyBQYXRoKGdldFByb2plY3QoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY2xhc3NwYXRoLmNyZWF0ZVBhdGgoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc3BhdGhSZWYoZmluYWwgUmVmZXJlbmNlIHIpIHsKKyAgICAgICAgYXNzZXJ0IHIgIT0gbnVsbDsKKyAgICAgICAgCisgICAgICAgIGNyZWF0ZUNsYXNzcGF0aCgpLnNldFJlZmlkKHIpOworICAgIH0KKworICAgIHB1YmxpYyBDb21waWxlckNvbmZpZ3VyYXRpb24gY3JlYXRlQ29uZmlndXJhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIGNvbmZpZzsKKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAoc3JjID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTWlzc2luZyBhdHRyaWJ1dGU6IHNyY2RpciAob3Igb25lIG9yIG1vcmUgbmVzdGVkIDxzcmM+IGVsZW1lbnRzKS4iLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkZXN0ZGlyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTWlzc2luZyBhdHRyaWJ1dGU6IGRlc3RkaXIiLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghZGVzdGRpci5leGlzdHMoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJEZXN0aW5hdGlvbiBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3Q6ICIgKyBkZXN0ZGlyLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBHcm9vdnlDbGFzc0xvYWRlciBjcmVhdGVDbGFzc0xvYWRlcigpIHsKKyAgICAgICAgQ2xhc3NMb2FkZXIgcGFyZW50ID0gQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtQ2xhc3NMb2FkZXIoKTsKKyAgICAgICAgR3Jvb3Z5Q2xhc3NMb2FkZXIgZ2NsID0gbmV3IEdyb292eUNsYXNzTG9hZGVyKHBhcmVudCwgY29uZmlnKTsKKworICAgICAgICBQYXRoIHBhdGggPSBnZXRDbGFzc3BhdGgoKTsKKyAgICAgICAgaWYgKHBhdGggIT0gbnVsbCkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gZmlsZVBhdGhzID0gcGF0aC5saXN0KCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVQYXRocy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlUGF0aCA9IGZpbGVQYXRoc1tpXTsKKyAgICAgICAgICAgICAgICBnY2wuYWRkQ2xhc3NwYXRoKGZpbGVQYXRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBnY2w7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlRXhjZXB0aW9uKGZpbmFsIEV4Y2VwdGlvbiBlKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBhc3NlcnQgZSAhPSBudWxsOworICAgICAgICAKKyAgICAgICAgU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgbmV3IEVycm9yUmVwb3J0ZXIoZSwgZmFsc2UpLndyaXRlKG5ldyBQcmludFdyaXRlcih3cml0ZXIpKTsKKyAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSB3cml0ZXIudG9TdHJpbmcoKTsKKworICAgICAgICBpZiAoZmFpbE9uRXJyb3IpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlLCBlLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICB2YWxpZGF0ZSgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb21waWxlKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBoYW5kbGVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBjb21waWxlKCkgdGhyb3dzIEV4Y2VwdGlvbjsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hbnQvRmlsZUl0ZXJhdG9yLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hbnQvRmlsZUl0ZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBlOWE2YQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudC9GaWxlSXRlcmF0b3IuamF2YQpAQCAtMCwwICsxLDE0OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50OworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkRpcmVjdG9yeVNjYW5uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0OworCisvKiogCisgKiA8cD48Y29kZT5GaWxlSXRlcmF0b3I8L2NvZGU+IGlzIGFuIGl0ZXJhdG9yIG92ZXIgYSAKKyAqIG51bWJlciBvZiBmaWxlcyBmcm9tIGEgY29sbGVjdGlvbiBvZiBGaWxlU2V0IGluc3RhbmNlcy4KKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AYXBhY2hlLm9yZyI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBGaWxlSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvciB7CisKKyAgICAvKiogVGhlIGl0ZXJhdG9yIG92ZXIgdGhlIEZpbGVTZXQgb2JqZWN0cyAqLworICAgIHByaXZhdGUgSXRlcmF0b3IgZmlsZVNldEl0ZXJhdG9yOworICAgIAorICAgIC8qKiBUaGUgQW50IHByb2plY3QgKi8KKyAgICBwcml2YXRlIFByb2plY3QgcHJvamVjdDsKKyAgICAKKyAgICAvKiogVGhlIGRpcmVjdG9yeSBzY2FubmVyICovCisgICAgcHJpdmF0ZSBEaXJlY3RvcnlTY2FubmVyIGRzOworICAgIAorICAgIC8qKiBUaGUgZmlsZSBuYW1lcyBpbiB0aGUgY3VycmVudCBGaWxlU2V0IHNjYW4gKi8KKyAgICBwcml2YXRlIFN0cmluZ1tdIGZpbGVzOworICAgIAorICAgIC8qKiBUaGUgY3VycmVudCBpbmRleCBpbnRvIHRoZSBmaWxlIG5hbWUgYXJyYXkgKi8KKyAgICBwcml2YXRlIGludCBmaWxlSW5kZXggPSAtMTsKKyAgICAKKyAgICAvKiogVGhlIG5leHQgRmlsZSBvYmplY3Qgd2UnbGwgaXRlcmF0ZSBvdmVyICovCisgICAgcHJpdmF0ZSBGaWxlIG5leHRGaWxlOworCisgICAgLyoqIEhhdmUgd2Ugc2V0IGEgbmV4dCBvYmplY3Q/ICovCisgICAgcHJpdmF0ZSBib29sZWFuIG5leHRPYmplY3RTZXQgPSBmYWxzZTsKKworICAgIC8qKiBSZXR1cm4gb25seSBkaXJlY3Rvcmllcz8gKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXRlcmF0ZURpcmVjdG9yaWVzID0gZmFsc2U7CisKKyAgICBwdWJsaWMgRmlsZUl0ZXJhdG9yKFByb2plY3QgcHJvamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGZpbGVTZXRJdGVyYXRvcikgeworICAgICAgICB0aGlzKCBwcm9qZWN0LCBmaWxlU2V0SXRlcmF0b3IsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRmlsZUl0ZXJhdG9yKFByb2plY3QgcHJvamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGZpbGVTZXRJdGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXRlcmF0ZURpcmVjdG9yaWVzKSB7CisgICAgICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7CisgICAgICAgIHRoaXMuZmlsZVNldEl0ZXJhdG9yID0gZmlsZVNldEl0ZXJhdG9yOworICAgICAgICB0aGlzLml0ZXJhdGVEaXJlY3RvcmllcyA9IGl0ZXJhdGVEaXJlY3RvcmllczsKKyAgICB9CisgICAgCisgICAgLy8gSXRlcmF0b3IgaW50ZXJmYWNlCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgCisgICAgLyoqIEByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBhbm90aGVyIG9iamVjdCB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIHByZWRpY2F0ZSAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisgICAgICAgIGlmICggbmV4dE9iamVjdFNldCApIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IAorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBzZXROZXh0T2JqZWN0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogQHJldHVybiB0aGUgbmV4dCBvYmplY3Qgd2hpY2ggbWF0Y2hlcyB0aGUgZ2l2ZW4gcHJlZGljYXRlICovCisgICAgcHVibGljIE9iamVjdCBuZXh0KCkgeworICAgICAgICBpZiAoICFuZXh0T2JqZWN0U2V0ICkgeworICAgICAgICAgICAgaWYgKCFzZXROZXh0T2JqZWN0KCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG5leHRPYmplY3RTZXQgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIG5leHRGaWxlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICAvLyBJbXBsZW1lbnRhdGlvbiBtZXRob2RzCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvKioKKyAgICAgKiBTZXQgbmV4dE9iamVjdCB0byB0aGUgbmV4dCBvYmplY3QuIElmIHRoZXJlIGFyZSBubyBtb3JlIAorICAgICAqIG9iamVjdHMgdGhlbiByZXR1cm4gZmFsc2UuIE90aGVyd2lzZSwgcmV0dXJuIHRydWUuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHNldE5leHRPYmplY3QoKSB7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICB3aGlsZSAoZHMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmICggISBmaWxlU2V0SXRlcmF0b3IuaGFzTmV4dCgpICkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEZpbGVTZXQgZnMgPSAoRmlsZVNldCkgZmlsZVNldEl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgICAgICBkcyA9IGZzLmdldERpcmVjdG9yeVNjYW5uZXIocHJvamVjdCk7CisgICAgICAgICAgICAgICAgZHMuc2NhbigpOworICAgICAgICAgICAgICAgIGlmIChpdGVyYXRlRGlyZWN0b3JpZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgZmlsZXMgPSBkcy5nZXRJbmNsdWRlZERpcmVjdG9yaWVzKCk7CisgICAgICAgICAgICAgICAgfSAKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZmlsZXMgPSBkcy5nZXRJbmNsdWRlZEZpbGVzKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICggZmlsZXMubGVuZ3RoID4gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgZmlsZUluZGV4ID0gLTE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZHMgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgICAgICBpZiAoIGRzICE9IG51bGwgJiYgZmlsZXMgIT0gbnVsbCApIHsKKyAgICAgICAgICAgICAgICBpZiAoICsrZmlsZUluZGV4IDwgZmlsZXMubGVuZ3RoICkgeworICAgICAgICAgICAgICAgICAgICBuZXh0RmlsZSA9IG5ldyBGaWxlKCBkcy5nZXRCYXNlZGlyKCksIGZpbGVzW2ZpbGVJbmRleF0gKTsKKyAgICAgICAgICAgICAgICAgICAgbmV4dE9iamVjdFNldCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZHMgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hbnQvRmlsZVNjYW5uZXIuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudC9GaWxlU2Nhbm5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmOGU2MWIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hbnQvRmlsZVNjYW5uZXIuamF2YQpAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5hbnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0OworCisvKiogCisgKiA8cD48Y29kZT5GaWxlU2Nhbm5lcjwvY29kZT4gaXMgYSBiZWFuIHdoaWNoIGFsbG93cyB0aGUgaXRlcmF0aW9uCisgKiBvdmVyIGEgbnVtYmVyIG9mIGZpbGVzIGZyb20gYSBjb2xsZWNpdG9uIG9mIEZpbGVTZXQgaW5zdGFuY2VzLgorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBhcGFjaGUub3JnIj5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEBhdXRob3IgTWFyYyBHdWlsbGVtb3QKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIEZpbGVTY2FubmVyIGV4dGVuZHMgVGFzayB7CisKKyAgICAvKiogRmlsZVNldHMgKi8KKyAgICBwcml2YXRlIExpc3QgZmlsZXNldHMgPSBuZXcgQXJyYXlMaXN0KCk7CisKKyAgICBwdWJsaWMgRmlsZVNjYW5uZXIoKSB7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBGaWxlU2Nhbm5lcihmaW5hbCBQcm9qZWN0IHByb2plY3QpIHsKKyAgICAgICAgc2V0UHJvamVjdChwcm9qZWN0KTsKKyAgICB9CisgICAgCisgICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgeworICAgICAgICByZXR1cm4gbmV3IEZpbGVJdGVyYXRvcihnZXRQcm9qZWN0KCksIGZpbGVzZXRzLml0ZXJhdG9yKCkpOworICAgIH0KKworICAgIHB1YmxpYyBJdGVyYXRvciBkaXJlY3RvcmllcygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGaWxlSXRlcmF0b3IoZ2V0UHJvamVjdCgpLCBmaWxlc2V0cy5pdGVyYXRvcigpLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNGaWxlcygpIHsKKyAgICAgICAgcmV0dXJuIGZpbGVzZXRzLnNpemUoKSA+IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xlYXJzIGFueSBmaWxlIHNldHMgdGhhdCBoYXZlIGJlZW4gYWRkZWQgdG8gdGhpcyBzY2FubmVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIGZpbGVzZXRzLmNsZWFyKCk7CisgICAgfQorCisgICAgLy8gUHJvcGVydGllcworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLyoqCisgICAgICogQWRkcyBhIHNldCBvZiBmaWxlcyAobmVzdGVkIGZpbGVzZXQgYXR0cmlidXRlKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRGaWxlc2V0KEZpbGVTZXQgc2V0KSB7CisgICAgICAgIGZpbGVzZXRzLmFkZChzZXQpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50L0dlbmVyYXRlU3R1YnNUYXNrLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hbnQvR2VuZXJhdGVTdHVic1Rhc2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGNlN2M1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50L0dlbmVyYXRlU3R1YnNUYXNrLmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5hbnQ7CisKK2ltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlDbGFzc0xvYWRlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkRpcmVjdG9yeVNjYW5uZXI7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuUGhhc2VzOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuamF2YWMuSmF2YVN0dWJDb21waWxhdGlvblVuaXQ7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKKy8qKgorICogR2VuZXJhdGVzIEphdmEgc3R1YnMgZnJvbSBHcm9vdnkgc291cmNlcy4KKyAqCisgKiBAdmVyc2lvbiAkSWQkCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYXNvbkBwbGFuZXQ1Ny5jb20iPkphc29uIERpbGxvbjwvYT4KKyAqLworcHVibGljIGNsYXNzIEdlbmVyYXRlU3R1YnNUYXNrCisgICAgZXh0ZW5kcyBDb21waWxlVGFza1N1cHBvcnQKK3sKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb21waWxlKCkgeworICAgICAgICBHcm9vdnlDbGFzc0xvYWRlciBnY2wgPSBjcmVhdGVDbGFzc0xvYWRlcigpOworICAgICAgICBKYXZhU3R1YkNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvbiA9IG5ldyBKYXZhU3R1YkNvbXBpbGF0aW9uVW5pdChjb25maWcsIGdjbCwgZGVzdGRpcik7CisKKyAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgCisgICAgICAgIFN0cmluZ1tdIGxpc3QgPSBzcmMubGlzdCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIEZpbGUgYmFzZWRpciA9IGdldFByb2plY3QoKS5yZXNvbHZlRmlsZShsaXN0W2ldKTsKKyAgICAgICAgICAgIGlmICghYmFzZWRpci5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiU291cmNlIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdDogIiArIGJhc2VkaXIsIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBEaXJlY3RvcnlTY2FubmVyIHNjYW5uZXIgPSBnZXREaXJlY3RvcnlTY2FubmVyKGJhc2VkaXIpOworICAgICAgICAgICAgU3RyaW5nW10gaW5jbHVkZXMgPSBzY2FubmVyLmdldEluY2x1ZGVkRmlsZXMoKTsKKworICAgICAgICAgICAgbG9nLmRlYnVnKCJJbmNsdWRpbmcgZmlsZXMgZnJvbTogIiArIGJhc2VkaXIpOworCisgICAgICAgICAgICBmb3IgKGludCBqPTA7IGogPCBpbmNsdWRlcy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICAgICIgICsgaW5jbHVkZXNbal0pOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGJhc2VkaXIsIGluY2x1ZGVzW2pdKTsKKyAgICAgICAgICAgICAgICBjb21waWxhdGlvbi5hZGRTb3VyY2VGaWxlKGZpbGUpOworCisgICAgICAgICAgICAgICAgLy8gSW5jcmVtZW50IHRoZSBjb3VudCBmb3IgZWFjaCBub24vamF2YSBzcmMgd2UgZm91bmQKKyAgICAgICAgICAgICAgICBpZiAoIWluY2x1ZGVzW2pdLmVuZHNXaXRoKCIuamF2YSIpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvdW50ID4gMCkgeworICAgICAgICAgICAgbG9nLmluZm8oIkdlbmVyYXRpbmcgIiArIGNvdW50ICsgIiBKYXZhIHN0dWIiICsgKGNvdW50ID4gMSA/ICJzIiA6ICIiKSArICIgdG8gIiArIGRlc3RkaXIpOworCisgICAgICAgICAgICAvLyBHZW5lcmF0ZSB0aGUgc3R1YnMKKyAgICAgICAgICAgIGNvbXBpbGF0aW9uLmNvbXBpbGUoUGhhc2VzLkNPTlZFUlNJT04pOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbG9nLmluZm8oIk5vIHNvdXJjZXMgZm91bmQgZm9yIHN0dWIgZ2VuZXJhdGlvbiIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50L0dyb292eS5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50L0dyb292eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NTU5YjEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hbnQvR3Jvb3Z5LmphdmEKQEAgLTAsMCArMSw0MDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50OworCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuQmluZGluZzsKK2ltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlDbGFzc0xvYWRlcjsKK2ltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlTaGVsbDsKK2ltcG9ydCBncm9vdnkubGFuZy5TY3JpcHQ7CitpbXBvcnQgZ3Jvb3Z5LnV0aWwuQW50QnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EaXJlY3RvcnlTY2FubmVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy4qOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5Db21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuQ29tcGlsZXJDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5JbnZva2VySGVscGVyOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuRXJyb3JSZXBvcnRlcjsKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCisvKioKKyAqIEV4ZWN1dGVzIGEgc2VyaWVzIG9mIEdyb292eSBzdGF0ZW1lbnRzLgorICoKKyAqIDxwPlN0YXRlbWVudHMgY2FuCisgKiBlaXRoZXIgYmUgcmVhZCBpbiBmcm9tIGEgdGV4dCBmaWxlIHVzaW5nIHRoZSA8aT5zcmM8L2k+IGF0dHJpYnV0ZSBvciBmcm9tCisgKiBiZXR3ZWVuIHRoZSBlbmNsb3NpbmcgZ3Jvb3Z5IHRhZ3MuPC9wPgorICoKKyAqIEB2ZXJzaW9uICRJZCQKKyAqLworcHVibGljIGNsYXNzIEdyb292eSBleHRlbmRzIFRhc2sKK3sKKyAgICBwcml2YXRlIGZpbmFsIExvZ2dpbmdIZWxwZXIgbG9nID0gbmV3IExvZ2dpbmdIZWxwZXIodGhpcyk7CisKKyAgICAvKioKKyAgICAgKiBmaWxlcyB0byBsb2FkCisgICAgICovCisgICAgcHJpdmF0ZSBWZWN0b3IgZmlsZXNldHMgPSBuZXcgVmVjdG9yKCk7CisKKyAgICAvKioKKyAgICAgKiBpbnB1dCBmaWxlCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlIHNyY0ZpbGUgPSBudWxsOworCisgICAgLyoqCisgICAgICogaW5wdXQgY29tbWFuZAorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGNvbW1hbmQgPSAiIjsKKworICAgIC8qKgorICAgICAqIFJlc3VsdHMgT3V0cHV0IGZpbGUuCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlIG91dHB1dCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmQgdG8gYW4gZXhpc3RpbmcgZmlsZSBvciBvdmVyd3JpdGUgaXQ/CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGFwcGVuZCA9IGZhbHNlOworCisgICAgcHJpdmF0ZSBQYXRoIGNsYXNzcGF0aDsKKworICAgIC8qKgorICAgICAqIENvbXBpbGVyIGNvbmZpZ3VyYXRpb24uCisgICAgICoKKyAgICAgKiBVc2VkIHRvIHNwZWNpZnkgdGhlIGRlYnVnIG91dHB1dCB0byBwcmludCBzdGFja3RyYWNlcyBpbiBjYXNlIHNvbWV0aGluZyBmYWlscy4KKyAgICAgKiBUT0RPOiBDb3VsZCBwcm9iYWJseSBiZSByZXVzZWQgdG8gc3BlY2lmeSB0aGUgZW5jb2Rpbmcgb2YgdGhlIGZpbGVzIHRvIGxvYWQgb3Igb3RoZXIgcHJvcGVydGllcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIENvbXBpbGVyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gbmV3IENvbXBpbGVyQ29uZmlndXJhdGlvbigpOworCisgICAgcHJpdmF0ZSBDb21tYW5kbGluZSBjbWRsaW5lID0gbmV3IENvbW1hbmRsaW5lKCk7CisKKyAgICAvKioKKyAgICAgKiBFbmFibGUgY29tcGlsZXIgdG8gcmVwb3J0IHN0YWNrIHRyYWNlIGluZm9ybWF0aW9uIGlmIGEgcHJvYmxlbSBvY2N1cnMKKyAgICAgKiBkdXJpbmcgY29tcGlsYXRpb24uCisgICAgICogQHBhcmFtIHN0YWNrdHJhY2Ugc2V0IHRvIHRydWUgdG8gZW5hYmxlIHN0YWNrdHJhY2UgcmVwb3J0aW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3RhY2t0cmFjZShib29sZWFuIHN0YWNrdHJhY2UpIHsKKyAgICAgICAgY29uZmlndXJhdGlvbi5zZXREZWJ1ZyhzdGFja3RyYWNlKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byBiZSBydW4uIFRoZSBmb2xkZXIgb2YgdGhlIGZpbGUgaXMgYXV0b21hdGljYWxseSBhZGRlZCB0byB0aGUgY2xhc3NwYXRoLgorICAgICAqIFJlcXVpcmVkIHVubGVzcyBzdGF0ZW1lbnRzIGFyZSBlbmNsb3NlZCBpbiB0aGUgYnVpbGQgZmlsZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNyYyhmaW5hbCBGaWxlIHNyY0ZpbGUpIHsKKyAgICAgICAgdGhpcy5zcmNGaWxlID0gc3JjRmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgYW4gaW5saW5lIGNvbW1hbmQgdG8gZXhlY3V0ZS4KKyAgICAgKiBOQjogUHJvcGVydGllcyBhcmUgbm90IGV4cGFuZGVkIGluIHRoaXMgdGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRUZXh0KFN0cmluZyB0eHQpIHsKKyAgICAgICAgbG9nKCJhZGRUZXh0KCciK3R4dCsiJykiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgdGhpcy5jb21tYW5kICs9IHR4dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgc2V0IG9mIGZpbGVzIChuZXN0ZWQgZmlsZXNldCBhdHRyaWJ1dGUpLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEZpbGVzZXQoRmlsZVNldCBzZXQpIHsKKyAgICAgICAgZmlsZXNldHMuYWRkRWxlbWVudChzZXQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgb3V0cHV0IGZpbGU7CisgICAgICogb3B0aW9uYWwsIGRlZmF1bHRzIHRvIHRoZSBBbnQgbG9nLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dChGaWxlIG91dHB1dCkgeworICAgICAgICB0aGlzLm91dHB1dCA9IG91dHB1dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIG91dHB1dCBzaG91bGQgYmUgYXBwZW5kZWQgdG8gb3Igb3ZlcndyaXRlCisgICAgICogYW4gZXhpc3RpbmcgZmlsZS4gIERlZmF1bHRzIHRvIGZhbHNlLgorICAgICAqCisgICAgICogQHBhcmFtIGFwcGVuZCBzZXQgdG8gdHJ1ZSB0byBhcHBlbmQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBcHBlbmQoYm9vbGVhbiBhcHBlbmQpIHsKKyAgICAgICAgdGhpcy5hcHBlbmQgPSBhcHBlbmQ7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBjbGFzc3BhdGggZm9yIGxvYWRpbmcuCisgICAgICogQHBhcmFtIGNsYXNzcGF0aCBUaGUgY2xhc3NwYXRoIHRvIHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aChmaW5hbCBQYXRoIGNsYXNzcGF0aCkgeworICAgICAgICB0aGlzLmNsYXNzcGF0aCA9IGNsYXNzcGF0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbmV3IHBhdGggZWxlbWVudCB0aGF0IGNhbiBiZSBjb25maWd1cmVkLgorICAgICAqIEdldHMgY2FsbGVkIGZvciBpbnN0YW5jZSBieSBBbnQgd2hlbiBpdCBlbmNvdW50ZXJzIGEgbmVzdGVkICZsdDtjbGFzc3BhdGgmZ3Q7IGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHRpbmcgY3JlYXRlZCBwYXRoCisgICAgICovCisgICAgcHVibGljIFBhdGggY3JlYXRlQ2xhc3NwYXRoKCkgeworICAgICAgICBpZiAodGhpcy5jbGFzc3BhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5jbGFzc3BhdGggPSBuZXcgUGF0aChnZXRQcm9qZWN0KCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLmNsYXNzcGF0aC5jcmVhdGVQYXRoKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjbGFzc3BhdGggZm9yIGxvYWRpbmcKKyAgICAgKiB1c2luZyB0aGUgY2xhc3NwYXRoIHJlZmVyZW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWYgdGhlIHJlZmlkIHRvIHVzZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aFJlZihmaW5hbCBSZWZlcmVuY2UgcmVmKSB7CisgICAgICAgIGNyZWF0ZUNsYXNzcGF0aCgpLnNldFJlZmlkKHJlZik7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgY2xhc3NwYXRoLgorICAgICAqIEByZXR1cm4gUmV0dXJucyBhIFBhdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aCBnZXRDbGFzc3BhdGgoKSB7CisgICAgICAgIHJldHVybiBjbGFzc3BhdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9hZCB0aGUgZmlsZSBhbmQgdGhlbiBleGVjdXRlIGl0CisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGxvZy5kZWJ1ZygiZXhlY3V0ZSgpIik7CisKKyAgICAgICAgY29tbWFuZCA9IGNvbW1hbmQudHJpbSgpOworCisgICAgICAgIGlmIChzcmNGaWxlID09IG51bGwgJiYgY29tbWFuZC5sZW5ndGgoKSA9PSAwCisgICAgICAgICAgICAmJiBmaWxlc2V0cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiU291cmNlIGZpbGUgZG9lcyBub3QgZXhpc3QhIiwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3JjRmlsZSAhPSBudWxsICYmICFzcmNGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlNvdXJjZSBmaWxlIGRvZXMgbm90IGV4aXN0ISIsIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZGVhbCB3aXRoIHRoZSBmaWxlc2V0cworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzZXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBGaWxlU2V0IGZzID0gKEZpbGVTZXQpIGZpbGVzZXRzLmVsZW1lbnRBdChpKTsKKyAgICAgICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHMgPSBmcy5nZXREaXJlY3RvcnlTY2FubmVyKGdldFByb2plY3QoKSk7CisgICAgICAgICAgICBGaWxlIHNyY0RpciA9IGZzLmdldERpcihnZXRQcm9qZWN0KCkpOworCisgICAgICAgICAgICBTdHJpbmdbXSBzcmNGaWxlcyA9IGRzLmdldEluY2x1ZGVkRmlsZXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBQcmludFN0cmVhbSBvdXQgPSBTeXN0ZW0ub3V0OworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAob3V0cHV0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLnZlcmJvc2UoIk9wZW5pbmcgUHJpbnRTdHJlYW0gdG8gb3V0cHV0IGZpbGUgIiArIG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBvdXQgPSBuZXcgUHJpbnRTdHJlYW0oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0cHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEFic29sdXRlUGF0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCkpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSBhcmUgbm8gZ3Jvb3Z5IHN0YXRlbWVudHMgYmV0d2VlbiB0aGUgZW5jbG9zaW5nIEdyb292eSB0YWdzCisgICAgICAgICAgICAgICAgLy8gdGhlbiByZWFkIGdyb292eSBzdGF0ZW1lbnRzIGluIGZyb20gYSB0ZXh0IGZpbGUgdXNpbmcgdGhlIHNyYyBhdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICBpZiAoY29tbWFuZCA9PSBudWxsIHx8IGNvbW1hbmQudHJpbSgpLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgICAgICAJY3JlYXRlQ2xhc3NwYXRoKCkuYWRkKG5ldyBQYXRoKGdldFByb2plY3QoKSwgc3JjRmlsZS5nZXRQYXJlbnRGaWxlKCkuZ2V0Q2Fub25pY2FsUGF0aCgpKSk7CisgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgPSBnZXRUZXh0KG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihzcmNGaWxlKSkpOworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgaWYgKGNvbW1hbmQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBleGVjR3Jvb3Z5KGNvbW1hbmQsb3V0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlNvdXJjZSBmaWxlIGRvZXMgbm90IGV4aXN0ISIsIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpZiAob3V0ICE9IG51bGwgJiYgb3V0ICE9IFN5c3RlbS5vdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKworICAgICAgICBsb2cudmVyYm9zZSgic3RhdGVtZW50cyBleGVjdXRlZCBzdWNjZXNzZnVsbHkiKTsKKyAgICB9CisKKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRUZXh0KEJ1ZmZlcmVkUmVhZGVyIHJlYWRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGFuc3dlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgLy8gcmVhZGluZyB0aGUgY29udGVudCBvZiB0aGUgZmlsZSB3aXRoaW4gYSBjaGFyIGJ1ZmZlciBhbGxvdyB0byBrZWVwIHRoZSBjb3JyZWN0IGxpbmUgZW5kaW5ncworICAgICAgICBjaGFyW10gY2hhckJ1ZmZlciA9IG5ldyBjaGFyWzQwOTZdOworICAgICAgICBpbnQgbmJDaGFyUmVhZCA9IDA7CisgICAgICAgIHdoaWxlICgobmJDaGFyUmVhZCA9IHJlYWRlci5yZWFkKGNoYXJCdWZmZXIpKSAhPSAtMSkgeworICAgICAgICAgICAgLy8gYXBwZW5kcyBidWZmZXIKKyAgICAgICAgICAgIGFuc3dlci5hcHBlbmQoY2hhckJ1ZmZlciwgMCwgbmJDaGFyUmVhZCk7CisgICAgICAgIH0KKyAgICAgICAgcmVhZGVyLmNsb3NlKCk7CisgICAgICAgIHJldHVybiBhbnN3ZXIudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29tbWFuZGxpbmUuQXJndW1lbnQgY3JlYXRlQXJnKCkgeworICAgICAgICByZXR1cm4gY21kbGluZS5jcmVhdGVBcmd1bWVudCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgaW4gbGluZXMgYW5kIGV4ZWN1dGUgdGhlbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWFkZXIgdGhlIHJlYWRlciBmcm9tIHdoaWNoIHRvIGdldCB0aGUgZ3Jvb3Z5IHNvdXJjZSB0byBleGVjCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcnVuU3RhdGVtZW50cyhSZWFkZXIgcmVhZGVyLCBQcmludFN0cmVhbSBvdXQpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGxvZy5kZWJ1ZygicnVuU3RhdGVtZW50cygpIik7CisgICAgICAgIAorICAgICAgICBTdHJpbmdCdWZmZXIgdHh0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBTdHJpbmcgbGluZSA9ICIiOworCisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGluID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKHJlYWRlcik7CisKKyAgICAgICAgd2hpbGUgKChsaW5lID0gaW4ucmVhZExpbmUoKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgbGluZSA9IGdldFByb2plY3QoKS5yZXBsYWNlUHJvcGVydGllcyhsaW5lKTsKKworICAgICAgICAgICAgaWYgKGxpbmUuaW5kZXhPZigiLS0iKSA+PSAwKSB7CisgICAgICAgICAgICAgICAgdHh0LmFwcGVuZCgiXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBDYXRjaCBhbnkgc3RhdGVtZW50cyBub3QgZm9sbG93ZWQgYnkgOworICAgICAgICBpZiAoIXR4dC50b1N0cmluZygpLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgIGV4ZWNHcm9vdnkodHh0LnRvU3RyaW5nKCksIG91dCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEV4ZWMgdGhlIHN0YXRlbWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eHQgdGhlIGdyb292eSBzb3VyY2UgdG8gZXhlYworICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGV4ZWNHcm9vdnkoZmluYWwgU3RyaW5nIHR4dCwgZmluYWwgUHJpbnRTdHJlYW0gb3V0KSB7CisgICAgICAgIC8vIFRPRE86IG91dCBuZXZlciB1c2VkPworICAgICAgICBsb2cuZGVidWcoImV4ZWNHcm9vdnkoKSIpOworCisgICAgICAgIC8vIENoZWNrIGFuZCBpZ25vcmUgZW1wdHkgc3RhdGVtZW50cworICAgICAgICBpZiAoIiIuZXF1YWxzKHR4dC50cmltKCkpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBsb2cudmVyYm9zZSgiR3Jvb3Z5OiAiICsgdHh0KTsKKworICAgICAgICAvL2xvZyhnZXRDbGFzc3BhdGgoKS50b1N0cmluZygpLFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICBPYmplY3QgbWF2ZW5Qb20gPSBudWxsOworICAgICAgICBmaW5hbCBQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7CisgICAgICAgIGZpbmFsIENsYXNzTG9hZGVyIGJhc2VDbGFzc0xvYWRlcjsKKyAgICAgICAgLy8gdHJlYXQgdGhlIGNhc2UgQW50IGlzIHJ1biB0aHJvdWdoIE1hdmVuLCBhbmQKKyAgICAgICAgaWYgKCJvcmcuYXBhY2hlLmNvbW1vbnMuZ3JhbnQuR3JhbnRQcm9qZWN0Ii5lcXVhbHMocHJvamVjdC5nZXRDbGFzcygpLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgcHJvcHNIYW5kbGVyID0gcHJvamVjdC5nZXRDbGFzcygpLmdldE1ldGhvZCgiZ2V0UHJvcHNIYW5kbGVyIiwgbmV3IENsYXNzWzBdKS5pbnZva2UocHJvamVjdCwgbmV3IE9iamVjdFswXSk7CisgICAgICAgICAgICAgICBmaW5hbCBGaWVsZCBjb250ZXh0RmllbGQgPSBwcm9wc0hhbmRsZXIuZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZEZpZWxkKCJjb250ZXh0Iik7CisgICAgICAgICAgICAgICBjb250ZXh0RmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKKyAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBjb250ZXh0ID0gY29udGV4dEZpZWxkLmdldChwcm9wc0hhbmRsZXIpOworICAgICAgICAgICAgICAgbWF2ZW5Qb20gPSBJbnZva2VySGVscGVyLmludm9rZU1ldGhvZChjb250ZXh0LCAiZ2V0UHJvamVjdCIsIG5ldyBPYmplY3RbMF0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJJbXBvc3NpYmxlIHRvIHJldHJpZXZlIE1hdmVuJ3MgQW50IHByb2plY3Q6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBsZXQgQVNNIGxvb2t1cCAicm9vdCIgY2xhc3Nsb2FkZXIKKyAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKEdyb292eVNoZWxsLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOworICAgICAgICAgICAgLy8gbG9hZCBncm9vdnkgaW50byAicm9vdC5tYXZlbiIgY2xhc3Nsb2FkZXIgaW5zdGVhZCBvZiAicm9vdCIgc28gdGhhdAorICAgICAgICAgICAgLy8gZ3Jvb3Z5IHNjcmlwdCBjYW4gYWNjZXNzIE1hdmVuIGNsYXNzZXMKKyAgICAgICAgICAgIGJhc2VDbGFzc0xvYWRlciA9IG1hdmVuUG9tLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJhc2VDbGFzc0xvYWRlciA9IEdyb292eVNoZWxsLmNsYXNzLmdldENsYXNzTG9hZGVyKCk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBTdHJpbmcgc2NyaXB0TmFtZSA9IGNvbXB1dGVTY3JpcHROYW1lKCk7CisgICAgICAgIGZpbmFsIEdyb292eUNsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gbmV3IEdyb292eUNsYXNzTG9hZGVyKGJhc2VDbGFzc0xvYWRlcik7CisgICAgICAgIGFkZENsYXNzUGF0aGVzKGNsYXNzTG9hZGVyKTsKKyAgICAgICAgCisgICAgICAgIGZpbmFsIEdyb292eVNoZWxsIGdyb292eSA9IG5ldyBHcm9vdnlTaGVsbChjbGFzc0xvYWRlciwgbmV3IEJpbmRpbmcoKSwgY29uZmlndXJhdGlvbik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBTY3JpcHQgc2NyaXB0ID0gZ3Jvb3Z5LnBhcnNlKHR4dCwgc2NyaXB0TmFtZSk7CisgICAgICAgICAgICBzY3JpcHQuc2V0UHJvcGVydHkoImFudCIsIG5ldyBBbnRCdWlsZGVyKHRoaXMpKTsKKyAgICAgICAgICAgIHNjcmlwdC5zZXRQcm9wZXJ0eSgicHJvamVjdCIsIHByb2plY3QpOworICAgICAgICAgICAgc2NyaXB0LnNldFByb3BlcnR5KCJwcm9wZXJ0aWVzIiwgbmV3IEFudFByb2plY3RQcm9wZXJ0aWVzRGVsZWdhdGUocHJvamVjdCkpOworICAgICAgICAgICAgc2NyaXB0LnNldFByb3BlcnR5KCJ0YXJnZXQiLCBnZXRPd25pbmdUYXJnZXQoKSk7CisgICAgICAgICAgICBzY3JpcHQuc2V0UHJvcGVydHkoInRhc2siLCB0aGlzKTsKKyAgICAgICAgICAgIHNjcmlwdC5zZXRQcm9wZXJ0eSgiYXJncyIsIGNtZGxpbmUuZ2V0Q29tbWFuZGxpbmUoKSk7CisgICAgICAgICAgICBpZiAobWF2ZW5Qb20gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNjcmlwdC5zZXRQcm9wZXJ0eSgicG9tIiwgbWF2ZW5Qb20pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2NyaXB0LnJ1bigpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChmaW5hbCBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICAgICAgbmV3IEVycm9yUmVwb3J0ZXIoIGUsIGZhbHNlICkud3JpdGUoIG5ldyBQcmludFdyaXRlcih3cml0ZXIpICk7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IHdyaXRlci50b1N0cmluZygpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJTY3JpcHQgRmFpbGVkOiAiKyBtZXNzYWdlLCBlLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogVHJ5IHRvIGJ1aWxkIGEgc2NyaXB0IG5hbWUgZm9yIHRoZSBzY3JpcHQgb2YgdGhlIGdyb292eSB0YXNrIHRvIGhhdmUgYW4gaGVscGZ1bCB2YWx1ZSBpbiBzdGFjayB0cmFjZXMgaW4gY2FzZSBvZiBleGNlcHRpb24KKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIHRvIHVzZSB3aGVuIGNvbXBpbGluZyB0aGUgc2NyaXB0CisgICAgICovCisJcHJpdmF0ZSBTdHJpbmcgY29tcHV0ZVNjcmlwdE5hbWUoKSB7CisJCWlmIChzcmNGaWxlICE9IG51bGwpIHsKKwkJCXJldHVybiBzcmNGaWxlLmdldEFic29sdXRlUGF0aCgpOworCQl9CisJCWVsc2UgeworCQkJU3RyaW5nIG5hbWUgPSAiZW1iZWRkZWRfc2NyaXB0X2luXyI7CisJCQlpZiAoZ2V0TG9jYXRpb24oKS5nZXRGaWxlTmFtZSgpLmxlbmd0aCgpID4gMCkKKwkJCQluYW1lICs9IGdldExvY2F0aW9uKCkuZ2V0RmlsZU5hbWUoKS5yZXBsYWNlQWxsKCJbXlxcd19cXC5dIiwgIl8iKTsKKwkJCWVsc2UKKwkJCQluYW1lICs9ICJncm9vdnlfQW50X3Rhc2siOworCisJCQlyZXR1cm4gbmFtZTsKKwkJfQorCX0KKworCisJLyoqCisJICogQWRkcyB0aGUgY2xhc3MgcGF0aGVzIChpZiBhbnkpCisJICogQHBhcmFtIGNsYXNzTG9hZGVyIHRoZSBjbGFzc2xvYWRlciB0byBjb25maWd1cmUKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRDbGFzc1BhdGhlcyhmaW5hbCBHcm9vdnlDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikKKwl7CisJCWlmIChjbGFzc3BhdGggIT0gbnVsbCkKKwkJeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc3BhdGgubGlzdCgpLmxlbmd0aDsgaSsrKQorCQkJeworCSAgICAgICAgICAgIGNsYXNzTG9hZGVyLmFkZENsYXNzcGF0aChjbGFzc3BhdGgubGlzdCgpW2ldKTsKKwkJCX0KKwkJfQorCX0KKworICAgIC8qKgorICAgICAqIHByaW50IGFueSByZXN1bHRzIGluIHRoZSBzdGF0ZW1lbnQuCisgICAgICogQHBhcmFtIG91dCB0aGUgb3V0cHV0IFByaW50U3RyZWFtIHRvIHByaW50IHRvCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcHJpbnRSZXN1bHRzKFByaW50U3RyZWFtIG91dCkgeworICAgICAgICBsb2cuZGVidWcoInByaW50UmVzdWx0cygpIik7CisgICAgICAgIFN0cmluZ0J1ZmZlciBsaW5lID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBvdXQucHJpbnRsbihsaW5lKTsKKyAgICAgICAgbGluZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgb3V0LnByaW50bG4oKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hbnQvR3Jvb3Z5Yy5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50L0dyb292eWMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2NjMWI4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50L0dyb292eWMuamF2YQpAQCAtMCwwICsxLDY0MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50OworCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5Q2xhc3NMb2FkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNsaS4qOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQubGlzdGVuZXIuQW5zaUNvbG9yTG9nZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkphdmFjOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLk1hdGNoaW5nVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkdsb2JQYXR0ZXJuTWFwcGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU291cmNlRmlsZVNjYW5uZXI7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuQ29tcGlsZXJDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuRXJyb3JSZXBvcnRlcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLlN0cmluZ0hlbHBlcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLmphdmFjLkphdmFBd2FyZUNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLmphdmFjLkphdmFDb21waWxlcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLmphdmFjLkphdmFDb21waWxlckZhY3Rvcnk7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworCisvKioKKyAqIENvbXBpbGVzIEdyb292eSBzb3VyY2UgZmlsZXMuIFRoaXMgdGFzayBjYW4gdGFrZSB0aGUgZm9sbG93aW5nCisgKiBhcmd1bWVudHM6CisgKiA8dWw+CisgKiA8bGk+c3JjZGlyCisgKiA8bGk+ZGVzdGRpcgorICogPGxpPmNsYXNzcGF0aAorICogPGxpPnN0YWNrdHJhY2UKKyAqIDxsaT5qb2ludENvbXBpbGF0aW9uCisgKiA8bGk+dmVyYm9zZQorICogPGxpPmVuY29kaW5nCisgKiA8bGk+ZmFpbG9uZXJyb3IKKyAqIDwvdWw+CisgKiBPZiB0aGVzZSBhcmd1bWVudHMsIHRoZSA8Yj5zcmNkaXI8L2I+IGFuZCA8Yj5kZXN0ZGlyPC9iPiBhcmUgcmVxdWlyZWQuCisgKiA8cD4KKyAqIFdoZW4gdGhpcyB0YXNrIGV4ZWN1dGVzLCBpdCB3aWxsIHJlY3Vyc2l2ZWx5IHNjYW4gc3JjZGlyIGFuZAorICogZGVzdGRpciBsb29raW5nIGZvciBHcm9vdnkgc291cmNlIGZpbGVzIHRvIGNvbXBpbGUuIFRoaXMgdGFzayBtYWtlcyBpdHMKKyAqIGNvbXBpbGUgZGVjaXNpb24gYmFzZWQgb24gdGltZXN0YW1wLgorICogCisgKiBCYXNlZCBoZWF2aWx5IG9uIHRoZSBKYXZhYyBpbXBsZW1lbnRhdGlvbiBpbiBBbnQKKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQGF1dGhvciBIZWluIE1lbGluZworICogQHZlcnNpb24gJFJldmlzaW9uJCAKKyAqLworcHVibGljIGNsYXNzIEdyb292eWMgZXh0ZW5kcyBNYXRjaGluZ1Rhc2sKK3sKKyAgICBwcml2YXRlIGZpbmFsIExvZ2dpbmdIZWxwZXIgbG9nID0gbmV3IExvZ2dpbmdIZWxwZXIodGhpcyk7CisKKworICAgIHByaXZhdGUgUGF0aCBjb21waWxlQ2xhc3NwYXRoOworICAgIHByaXZhdGUgUGF0aCBjb21waWxlU291cmNlcGF0aDsKKyAgICBwcml2YXRlIFN0cmluZyBlbmNvZGluZzsKKyAgICBwcml2YXRlIEphdmFjIGphdmFjOworCisgICAgcHJvdGVjdGVkIEZpbGUgZGVzdERpcjsKKyAgICBwcm90ZWN0ZWQgUGF0aCBzcmM7ICAgIAorICAgIHByb3RlY3RlZCBDb21waWxlckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IG5ldyBDb21waWxlckNvbmZpZ3VyYXRpb24oKTsKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBmYWlsT25FcnJvciA9IHRydWU7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gbGlzdEZpbGVzID0gZmFsc2U7CisgICAgcHJvdGVjdGVkIEZpbGVbXSBjb21waWxlTGlzdCA9IG5ldyBGaWxlWzBdOworICAgIAorICAgIHByaXZhdGUgYm9vbGVhbiBqb2ludENvbXBpbGF0aW9uOworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCisgICAgICAgIFByb2plY3QgcHJvamVjdCA9IG5ldyBQcm9qZWN0KCk7CisgICAgICAgIERlZmF1bHRMb2dnZXIgbG9nZ2VyID0gbmV3IEFuc2lDb2xvckxvZ2dlcigpOworICAgICAgICBsb2dnZXIuc2V0TWVzc2FnZU91dHB1dExldmVsKFByb2plY3QuTVNHX0lORk8pOworICAgICAgICBwcm9qZWN0LmFkZEJ1aWxkTGlzdGVuZXIobG9nZ2VyKTsKKyAgICAgICAgLy8gcHJvamVjdC5pbml0KCk7CisgICAgICAgIAorICAgICAgICBHcm9vdnljIGNvbXBpbGVyID0gbmV3IEdyb292eWMoKTsKKyAgICAgICAgY29tcGlsZXIuc2V0UHJvamVjdChwcm9qZWN0KTsKKworICAgICAgICBhcmdzID0gY29tcGlsZXIuZXZhbENvbXBpbGVyRmxhZ3MoYXJncyk7CisgICAgICAgIAorICAgICAgICBTdHJpbmcgZGVzdCA9ICIuIjsKKyAgICAgICAgU3RyaW5nIHNyYyA9ICIuIjsKKyAgICAgICAgYm9vbGVhbiBsaXN0RmlsZXMgPSBmYWxzZTsKKyAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgZGVzdCA9IGFyZ3NbMF07CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMSkgeworICAgICAgICAgICAgc3JjID0gYXJnc1sxXTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXJncy5sZW5ndGggPiAyKSB7CisgICAgICAgICAgICBTdHJpbmcgZmxhZyA9IGFyZ3NbMl07CisgICAgICAgICAgICBpZiAoZmxhZy5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpIHsKKyAgICAgICAgICAgICAgICBsaXN0RmlsZXMgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBjb21waWxlci5zZXRTcmNkaXIobmV3IFBhdGgocHJvamVjdCwgc3JjKSk7CisgICAgICAgIGNvbXBpbGVyLnNldERlc3RkaXIocHJvamVjdC5yZXNvbHZlRmlsZShkZXN0KSk7CisgICAgICAgIGNvbXBpbGVyLnNldExpc3RmaWxlcyhsaXN0RmlsZXMpOworICAgICAgICAKKyAgICAgICAgY29tcGlsZXIuZXhlY3V0ZSgpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nW10gZXZhbENvbXBpbGVyRmxhZ3MoU3RyaW5nW10gYXJncykgeworICAgICAgICAvLworICAgICAgICAvLyBQYXJzZSB0aGUgY29tbWFuZCBsaW5lCisgICAgICAgIAorICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOworICAgICAgICBvcHRpb25zLmFkZE9wdGlvbigKKyAgICAgICAgICAgICAgICBPcHRpb25CdWlsZGVyLndpdGhBcmdOYW1lKCAicHJvcGVydHk9dmFsdWUiICkKKyAgICAgICAgICAgICAgICAud2l0aFZhbHVlU2VwYXJhdG9yKCc9JykKKyAgICAgICAgICAgICAgICAuaGFzQXJncygyKQorICAgICAgICAgICAgICAgIC5jcmVhdGUoICJKIiApKTsKKyAgICAgICAgb3B0aW9ucy5hZGRPcHRpb24oCisgICAgICAgICAgICAgICAgT3B0aW9uQnVpbGRlci53aXRoQXJnTmFtZSggInByb3BlcnR5PXZhbHVlIiApCisgICAgICAgICAgICAgICAgLmhhc0FyZygpCisgICAgICAgICAgICAgICAgLmNyZWF0ZSggIkYiICkpOworICAgICAgICBvcHRpb25zLmFkZE9wdGlvbihPcHRpb25CdWlsZGVyLndpdGhMb25nT3B0KCJqb2ludENvbXBpbGF0aW9uIikuY3JlYXRlKCdqJykpOworICAgICAgICAKKyAgICAgICAgUG9zaXhQYXJzZXIgY2xpUGFyc2VyID0gbmV3IFBvc2l4UGFyc2VyKCk7CisKKyAgICAgICAgQ29tbWFuZExpbmUgY2xpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2xpID0gY2xpUGFyc2VyLnBhcnNlKG9wdGlvbnMsIGFyZ3MpOworICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGpvaW50Q29tcGlsYXRpb24gPSBjbGkuaGFzT3B0aW9uKCdqJyk7CisgICAgICAgIGlmIChqb2ludENvbXBpbGF0aW9uKSB7CisgICAgICAgICAgICBNYXAgY29tcGlsZXJPcHRpb25zID0gIG5ldyBIYXNoTWFwKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFN0cmluZ1tdIG9wdHMgPSBjbGkuZ2V0T3B0aW9uVmFsdWVzKCJKIik7CisgICAgICAgICAgICBjb21waWxlck9wdGlvbnMucHV0KCJuYW1lZFZhbHVlcyIsIG9wdHMpOworICAgICAgICAgICAgCisgICAgICAgICAgICBvcHRzID0gY2xpLmdldE9wdGlvblZhbHVlcygiRiIpOworICAgICAgICAgICAgY29tcGlsZXJPcHRpb25zLnB1dCgiZmxhZ3MiLCBvcHRzKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY29tcGlsZXJPcHRpb25zLnB1dCgic3R1YkRpciIsIGNyZWF0ZVRlbXBEaXIoKSk7ICAgIAorICAgICAgICAgICAgY29uZmlndXJhdGlvbi5zZXRKb2ludENvbXBpbGF0aW9uT3B0aW9ucyhjb21waWxlck9wdGlvbnMpOworICAgICAgICB9ICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICByZXR1cm4gY2xpLmdldEFyZ3MoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgR3Jvb3Z5YygpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgcGF0aCBmb3Igc291cmNlIGNvbXBpbGF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBhIG5lc3RlZCBzcmMgZWxlbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aCBjcmVhdGVTcmMoKSB7CisgICAgICAgIGlmIChzcmMgPT0gbnVsbCkgeworICAgICAgICAgICAgc3JjID0gbmV3IFBhdGgoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3JjLmNyZWF0ZVBhdGgoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWNyZWF0ZSBzcmMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgbmVzdGVkIHNyYyBlbGVtZW50LgorICAgICAqLworICAgIHByb3RlY3RlZCBQYXRoIHJlY3JlYXRlU3JjKCkgeworICAgICAgICBzcmMgPSBudWxsOworICAgICAgICByZXR1cm4gY3JlYXRlU3JjKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzb3VyY2UgZGlyZWN0b3JpZXMgdG8gZmluZCB0aGUgc291cmNlIEphdmEgZmlsZXMuCisgICAgICogQHBhcmFtIHNyY0RpciB0aGUgc291cmNlIGRpcmVjdG9yaWVzIGFzIGEgcGF0aAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNyY2RpcihQYXRoIHNyY0RpcikgeworICAgICAgICBpZiAoc3JjID09IG51bGwpIHsKKyAgICAgICAgICAgIHNyYyA9IHNyY0RpcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHNyYy5hcHBlbmQoc3JjRGlyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHNvdXJjZSBkaXJzIHRvIGZpbmQgdGhlIHNvdXJjZSBqYXZhIGZpbGVzLgorICAgICAqIEByZXR1cm4gdGhlIHNvdXJjZSBkaXJlY3RvcnlzIGFzIGEgcGF0aAorICAgICAqLworICAgIHB1YmxpYyBQYXRoIGdldFNyY2RpcigpIHsKKyAgICAgICAgcmV0dXJuIHNyYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSBKYXZhIHNvdXJjZQorICAgICAqIGZpbGVzIHNob3VsZCBiZSBjb21waWxlZC4KKyAgICAgKiBAcGFyYW0gZGVzdERpciB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3IKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZXN0ZGlyKEZpbGUgZGVzdERpcikgeworICAgICAgICB0aGlzLmRlc3REaXIgPSBkZXN0RGlyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuYWJsZSB2ZXJib3NlIGNvbXBpbGluZyB3aGljaCB3aWxsIGRpc3BsYXkgd2hpY2ggZmlsZXMKKyAgICAgKiBhcmUgYmVpbmcgY29tcGlsZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWZXJib3NlKGJvb2xlYW4gdmVyYm9zZSkgeworICAgICAgICBjb25maWd1cmF0aW9uLnNldFZlcmJvc2UoIHZlcmJvc2UgKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmFibGUgY29tcGlsZXIgdG8gcmVwb3J0IHN0YWNrIHRyYWNlIGluZm9ybWF0aW9uIGlmIGEgcHJvYmxlbSBvY2N1cnMKKyAgICAgKiBkdXJpbmcgY29tcGlsYXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3RhY2t0cmFjZShib29sZWFuIHN0YWNrdHJhY2UpIHsKKyAgICAgICAgY29uZmlndXJhdGlvbi5zZXREZWJ1ZyhzdGFja3RyYWNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgaW50byB3aGljaCB0aGUgamF2YSBzb3VyY2UgZmlsZXMKKyAgICAgKiBzaG91bGQgYmUgY29tcGlsZWQuCisgICAgICogQHJldHVybiB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5CisgICAgICovCisgICAgcHVibGljIEZpbGUgZ2V0RGVzdGRpcigpIHsKKyAgICAgICAgcmV0dXJuIGRlc3REaXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzb3VyY2VwYXRoIHRvIGJlIHVzZWQgZm9yIHRoaXMgY29tcGlsYXRpb24uCisgICAgICogQHBhcmFtIHNvdXJjZXBhdGggdGhlIHNvdXJjZSBwYXRoCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U291cmNlcGF0aChQYXRoIHNvdXJjZXBhdGgpIHsKKyAgICAgICAgaWYgKGNvbXBpbGVTb3VyY2VwYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgIGNvbXBpbGVTb3VyY2VwYXRoID0gc291cmNlcGF0aDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGNvbXBpbGVTb3VyY2VwYXRoLmFwcGVuZChzb3VyY2VwYXRoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHNvdXJjZXBhdGggdG8gYmUgdXNlZCBmb3IgdGhpcyBjb21waWxhdGlvbi4KKyAgICAgKiBAcmV0dXJuIHRoZSBzb3VyY2UgcGF0aAorICAgICAqLworICAgIHB1YmxpYyBQYXRoIGdldFNvdXJjZXBhdGgoKSB7CisgICAgICAgIHJldHVybiBjb21waWxlU291cmNlcGF0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgcGF0aCB0byBzb3VyY2VwYXRoLgorICAgICAqIEByZXR1cm4gYSBzb3VyY2VwYXRoIHRvIGJlIGNvbmZpZ3VyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aCBjcmVhdGVTb3VyY2VwYXRoKCkgeworICAgICAgICBpZiAoY29tcGlsZVNvdXJjZXBhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgY29tcGlsZVNvdXJjZXBhdGggPSBuZXcgUGF0aChnZXRQcm9qZWN0KCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjb21waWxlU291cmNlcGF0aC5jcmVhdGVQYXRoKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIHJlZmVyZW5jZSB0byBhIHNvdXJjZSBwYXRoIGRlZmluZWQgZWxzZXdoZXJlLgorICAgICAqIEBwYXJhbSByIGEgcmVmZXJlbmNlIHRvIGEgc291cmNlIHBhdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VwYXRoUmVmKFJlZmVyZW5jZSByKSB7CisgICAgICAgIGNyZWF0ZVNvdXJjZXBhdGgoKS5zZXRSZWZpZChyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNsYXNzcGF0aCB0byBiZSB1c2VkIGZvciB0aGlzIGNvbXBpbGF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXNzcGF0aCBhbiBBbnQgUGF0aCBvYmplY3QgY29udGFpbmluZyB0aGUgY29tcGlsYXRpb24gY2xhc3NwYXRoLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aChQYXRoIGNsYXNzcGF0aCkgeworICAgICAgICBpZiAoY29tcGlsZUNsYXNzcGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICBjb21waWxlQ2xhc3NwYXRoID0gY2xhc3NwYXRoOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY29tcGlsZUNsYXNzcGF0aC5hcHBlbmQoY2xhc3NwYXRoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGNsYXNzcGF0aCB0byBiZSB1c2VkIGZvciB0aGlzIGNvbXBpbGF0aW9uLgorICAgICAqIEByZXR1cm4gdGhlIGNsYXNzIHBhdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aCBnZXRDbGFzc3BhdGgoKSB7CisgICAgICAgIHJldHVybiBjb21waWxlQ2xhc3NwYXRoOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBwYXRoIHRvIHRoZSBjbGFzc3BhdGguCisgICAgICogQHJldHVybiBhIGNsYXNzIHBhdGggdG8gYmUgY29uZmlndXJlZAorICAgICAqLworICAgIHB1YmxpYyBQYXRoIGNyZWF0ZUNsYXNzcGF0aCgpIHsKKyAgICAgICAgaWYgKGNvbXBpbGVDbGFzc3BhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgY29tcGlsZUNsYXNzcGF0aCA9IG5ldyBQYXRoKGdldFByb2plY3QoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvbXBpbGVDbGFzc3BhdGguY3JlYXRlUGF0aCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSByZWZlcmVuY2UgdG8gYSBjbGFzc3BhdGggZGVmaW5lZCBlbHNld2hlcmUuCisgICAgICogQHBhcmFtIHIgYSByZWZlcmVuY2UgdG8gYSBjbGFzc3BhdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc3BhdGhSZWYoUmVmZXJlbmNlIHIpIHsKKyAgICAgICAgY3JlYXRlQ2xhc3NwYXRoKCkuc2V0UmVmaWQocik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZW5jb2RpbmcgdG8gYmUgdXNlZCB3aGVuIGNyZWF0aW5nIGZpbGVzLjxici8+CisgICAgICogSWYgbm8gZW5jb2RpbmcgdmFsdWUgaGFzIGJlZW4gc2V0IGl0IHdpbGwgZGVmYXVsdCB0bworICAgICAqIFN5c3RlbS5wcm9wZXJ0aWVzKCJmaWxlLmVuY29kaW5nIikKKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGZpbGUgZW5jb2RpbmcgdG8gdXNlCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBjcmVhdGVFbmNvZGluZygpIHsKKyAgICAgICAgaWYgKGVuY29kaW5nID09IG51bGwpIHsKKyAgICAgICAgICAgIGVuY29kaW5nID0gU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLmVuY29kaW5nIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVuY29kaW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGZpbGUgZW5jb2RpbmcgZm9yIGdlbmVyYXRlZCBmaWxlcy4KKyAgICAgKiBAcGFyYW0gZW5jb2RpbmcgdGhlIGZpbGUgZW5jb2RpbmcgdG8gYmUgdXNlZAorICAgICAqLyAKKyAgICBwdWJsaWMgdm9pZCBzZXRFbmNvZGluZyhTdHJpbmcgZW5jb2RpbmcpIHsKKyAgICAgICAgdGhpcy5lbmNvZGluZyA9IGVuY29kaW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGVuY29kaW5nIHRvIGJlIHVzZWQgd2hlbiBjcmVhdGluZyBmaWxlcy4KKyAgICAgKiBAcmV0dXJuIHRoZSBmaWxlIGVuY29kaW5nIHRvIHVzZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB7CisgICAgICAgIHJldHVybiBlbmNvZGluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB0cnVlLCBsaXN0IHRoZSBzb3VyY2UgZmlsZXMgYmVpbmcgaGFuZGVkIG9mZiB0byB0aGUgY29tcGlsZXIuCisgICAgICogQHBhcmFtIGxpc3QgaWYgdHJ1ZSBsaXN0IHRoZSBzb3VyY2UgZmlsZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMaXN0ZmlsZXMoYm9vbGVhbiBsaXN0KSB7CisgICAgICAgIGxpc3RGaWxlcyA9IGxpc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsaXN0ZmlsZXMgZmxhZy4KKyAgICAgKiBAcmV0dXJuIHRoZSBsaXN0ZmlsZXMgZmxhZworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldExpc3RmaWxlcygpIHsKKyAgICAgICAgcmV0dXJuIGxpc3RGaWxlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgYnVpbGQgd2lsbCBjb250aW51ZQorICAgICAqIGV2ZW4gaWYgdGhlcmUgYXJlIGNvbXBpbGF0aW9uIGVycm9yczsgZGVmYXVsdHMgdG8gdHJ1ZS4KKyAgICAgKiBAcGFyYW0gZmFpbCBpZiB0cnVlIGhhbHQgdGhlIGJ1aWxkIG9uIGZhaWx1cmUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGYWlsb25lcnJvcihib29sZWFuIGZhaWwpIHsKKyAgICAgICAgZmFpbE9uRXJyb3IgPSBmYWlsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBwcm9jZWVkIGludmVyc2Ugb2YgZmFpbG9uZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9jZWVkKGJvb2xlYW4gcHJvY2VlZCkgeworICAgICAgICBmYWlsT25FcnJvciA9ICFwcm9jZWVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGZhaWxvbmVycm9yIGZsYWcuCisgICAgICogQHJldHVybiB0aGUgZmFpbG9uZXJyb3IgZmxhZworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldEZhaWxvbmVycm9yKCkgeworICAgICAgICByZXR1cm4gZmFpbE9uRXJyb3I7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZXMgdGhlIHRhc2suCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgY2hlY2tQYXJhbWV0ZXJzKCk7CisgICAgICAgIHJlc2V0RmlsZUxpc3RzKCk7CisgICAgICAgIGlmIChqYXZhYyE9bnVsbCkgam9pbnRDb21waWxhdGlvbj10cnVlOworCisgICAgICAgIC8vIHNjYW4gc291cmNlIGRpcmVjdG9yaWVzIGFuZCBkZXN0IGRpcmVjdG9yeSB0byBidWlsZCB1cAorICAgICAgICAvLyBjb21waWxlIGxpc3RzCisgICAgICAgIFN0cmluZ1tdIGxpc3QgPSBzcmMubGlzdCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIEZpbGUgc3JjRGlyID0gZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKGxpc3RbaV0pOworICAgICAgICAgICAgaWYgKCFzcmNEaXIuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInNyY2RpciBcIiIgKyBzcmNEaXIuZ2V0UGF0aCgpICsgIlwiIGRvZXMgbm90IGV4aXN0ISIsIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gdGhpcy5nZXREaXJlY3RvcnlTY2FubmVyKHNyY0Rpcik7CisgICAgICAgICAgICBTdHJpbmdbXSBmaWxlcyA9IGRzLmdldEluY2x1ZGVkRmlsZXMoKTsKKworICAgICAgICAgICAgc2NhbkRpcihzcmNEaXIsIGRlc3REaXIgIT0gbnVsbCA/IGRlc3REaXIgOiBzcmNEaXIsIGZpbGVzKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbXBpbGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbGVhciB0aGUgbGlzdCBvZiBmaWxlcyB0byBiZSBjb21waWxlZCBhbmQgY29waWVkLi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCByZXNldEZpbGVMaXN0cygpIHsKKyAgICAgICAgY29tcGlsZUxpc3QgPSBuZXcgRmlsZVswXTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTY2FucyB0aGUgZGlyZWN0b3J5IGxvb2tpbmcgZm9yIHNvdXJjZSBmaWxlcyB0byBiZSBjb21waWxlZC4KKyAgICAgKiBUaGUgcmVzdWx0cyBhcmUgcmV0dXJuZWQgaW4gdGhlIGNsYXNzIHZhcmlhYmxlIGNvbXBpbGVMaXN0CisgICAgICoKKyAgICAgKiBAcGFyYW0gc3JjRGlyICAgVGhlIHNvdXJjZSBkaXJlY3RvcnkKKyAgICAgKiBAcGFyYW0gZGVzdERpciAgVGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeQorICAgICAqIEBwYXJhbSBmaWxlcyAgICBBbiBhcnJheSBvZiBmaWxlbmFtZXMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzY2FuRGlyKEZpbGUgc3JjRGlyLCBGaWxlIGRlc3REaXIsIFN0cmluZ1tdIGZpbGVzKSB7CisgICAgICAgIEdsb2JQYXR0ZXJuTWFwcGVyIG0gPSBuZXcgR2xvYlBhdHRlcm5NYXBwZXIoKTsKKyAgICAgICAgbS5zZXRGcm9tKCIqLmdyb292eSIpOworICAgICAgICBtLnNldFRvKCIqLmNsYXNzIik7CisgICAgICAgIFNvdXJjZUZpbGVTY2FubmVyIHNmcyA9IG5ldyBTb3VyY2VGaWxlU2Nhbm5lcih0aGlzKTsKKyAgICAgICAgRmlsZVtdIG5ld0ZpbGVzID0gc2ZzLnJlc3RyaWN0QXNGaWxlcyhmaWxlcywgc3JjRGlyLCBkZXN0RGlyLCBtKTsKKyAgICAgICAgYWRkVG9Db21waWxlTGlzdChuZXdGaWxlcyk7CisgICAgICAgIAorICAgICAgICBpZiAoam9pbnRDb21waWxhdGlvbikgeworICAgICAgICAgICAgbS5zZXRGcm9tKCIqLmphdmEiKTsKKyAgICAgICAgICAgIG0uc2V0VG8oIiouY2xhc3MiKTsKKyAgICAgICAgICAgIG5ld0ZpbGVzID0gc2ZzLnJlc3RyaWN0QXNGaWxlcyhmaWxlcywgc3JjRGlyLCBkZXN0RGlyLCBtKTsKKyAgICAgICAgICAgIGFkZFRvQ29tcGlsZUxpc3QobmV3RmlsZXMpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCB2b2lkIGFkZFRvQ29tcGlsZUxpc3QoRmlsZVtdIG5ld0ZpbGVzKSB7CisgICAgICAgIGlmIChuZXdGaWxlcy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBGaWxlW10gbmV3Q29tcGlsZUxpc3QgPSBuZXcgRmlsZVtjb21waWxlTGlzdC5sZW5ndGggKyBuZXdGaWxlcy5sZW5ndGhdOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShjb21waWxlTGlzdCwgMCwgbmV3Q29tcGlsZUxpc3QsIDAsIGNvbXBpbGVMaXN0Lmxlbmd0aCk7CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG5ld0ZpbGVzLCAwLCBuZXdDb21waWxlTGlzdCwgY29tcGlsZUxpc3QubGVuZ3RoLCBuZXdGaWxlcy5sZW5ndGgpOworICAgICAgICAgICAgY29tcGlsZUxpc3QgPSBuZXdDb21waWxlTGlzdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGxpc3Qgb2YgZmlsZXMgdG8gYmUgY29tcGlsZWQuCisgICAgICogQHJldHVybiB0aGUgbGlzdCBvZiBmaWxlcyBhcyBhbiBhcnJheQorICAgICAqLworICAgIHB1YmxpYyBGaWxlW10gZ2V0RmlsZUxpc3QoKSB7CisgICAgICAgIHJldHVybiBjb21waWxlTGlzdDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja1BhcmFtZXRlcnMoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAoc3JjID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigic3JjZGlyIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3JjLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInNyY2RpciBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIiwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGVzdERpciAhPSBudWxsICYmICFkZXN0RGlyLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiZGVzdGluYXRpb24gZGlyZWN0b3J5IFwiIiArIGRlc3REaXIgKyAiXCIgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IGEgZGlyZWN0b3J5IiwKKyAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlbmNvZGluZyAhPSBudWxsICYmICFDaGFyc2V0LmlzU3VwcG9ydGVkKGVuY29kaW5nKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJlbmNvZGluZyBcIlwiIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGNvbXBpbGUoKSB7CisgICAgICAgIGlmIChjb21waWxlTGlzdC5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgbG9nLmluZm8oIk5vIHNvdXJjZXMgdG8gY29tcGlsZSIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbG9nLmluZm8oIkNvbXBpbGluZyAiICsgY29tcGlsZUxpc3QubGVuZ3RoICsKKyAgICAgICAgICAgICAgICAiIHNvdXJjZSBmaWxlIiArIChjb21waWxlTGlzdC5sZW5ndGggPT0gMSA/ICIiIDogInMiKSArCisgICAgICAgICAgICAgICAgIiB0byAiICsgZGVzdERpcik7CisKKyAgICAgICAgaWYgKGxpc3RGaWxlcykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb21waWxlTGlzdC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IGNvbXBpbGVMaXN0W2ldLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICAgICAgICAgIGxvZy5pbmZvKCIgICAgIiArIGZpbGVuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBQYXRoIGNsYXNzcGF0aCA9IGdldENsYXNzcGF0aCgpOworICAgICAgICAgICAgaWYgKGNsYXNzcGF0aCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbi5zZXRDbGFzc3BhdGgoY2xhc3NwYXRoLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uZmlndXJhdGlvbi5zZXRUYXJnZXREaXJlY3RvcnkoZGVzdERpcik7CisKKyAgICAgICAgICAgIGlmIChlbmNvZGluZyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbi5zZXRTb3VyY2VFbmNvZGluZyhlbmNvZGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbXBpbGF0aW9uVW5pdCB1bml0ID0gbWFrZUNvbXBpbGVVbml0KCk7CisgICAgICAgICAgICB1bml0LmFkZFNvdXJjZXMoY29tcGlsZUxpc3QpOworICAgICAgICAgICAgdW5pdC5jb21waWxlKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisKKyAgICAgICAgICAgIFN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgICAgICBuZXcgRXJyb3JSZXBvcnRlciggZSwgZmFsc2UgKS53cml0ZSggbmV3IFByaW50V3JpdGVyKHdyaXRlcikgKTsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gd3JpdGVyLnRvU3RyaW5nKCk7CisKKyAgICAgICAgICAgIGlmIChmYWlsT25FcnJvcikgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlLCBlLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGxvZyhtZXNzYWdlLCBQcm9qZWN0Lk1TR19FUlIpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIENvbXBpbGF0aW9uVW5pdCBtYWtlQ29tcGlsZVVuaXQoKSB7CisgICAgICAgIGlmIChqYXZhYyE9bnVsbCkgeworICAgICAgICAgICAgTWFwIGNvbXBpbGVyT3B0aW9ucyA9ICBuZXcgSGFzaE1hcCgpOworICAgICAgICAgICAgY29tcGlsZXJPcHRpb25zLnB1dCgic3R1YkRpciIsIGNyZWF0ZVRlbXBEaXIoKSk7ICAgIAorICAgICAgICAgICAgY29uZmlndXJhdGlvbi5zZXRKb2ludENvbXBpbGF0aW9uT3B0aW9ucyhjb21waWxlck9wdGlvbnMpOworICAgICAgICAgICAgam9pbnRDb21waWxhdGlvbiA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChqb2ludENvbXBpbGF0aW9uKSB7ICAgICAgICAgICAgCisgICAgICAgICAgICBKYXZhQXdhcmVDb21waWxhdGlvblVuaXQgdW5pdCA9IG5ldyBKYXZhQXdhcmVDb21waWxhdGlvblVuaXQoY29uZmlndXJhdGlvbiwgYnVpbGRDbGFzc0xvYWRlckZvcigpKTsKKyAgICAgICAgICAgIGlmIChqYXZhYyE9bnVsbCkgeworICAgICAgICAgICAgICAgIGZpbmFsIEphdmFDb21waWxlciBjb21waWxlciA9IG5ldyBKYXZhQ29tcGlsZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbXBpbGUoTGlzdCBmaWxlcywgQ29tcGlsYXRpb25Vbml0IGN1KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3J3YXJkIG9wdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqYXZhYy5nZXRDbGFzc3BhdGgoKT09bnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmFjLnNldENsYXNzcGF0aChjb21waWxlQ2xhc3NwYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqYXZhYy5nZXRTb3VyY2VwYXRoKCk9PW51bGwgJiYgY29tcGlsZVNvdXJjZXBhdGghPW51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhYy5jcmVhdGVTb3VyY2VwYXRoKCkuYWRkKGNvbXBpbGVTb3VyY2VwYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqYXZhYy5nZXRFbmNvZGluZygpPT1udWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YWMuc2V0RW5jb2RpbmcoZW5jb2RpbmcpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgamF2YWMuc2V0RGVzdGRpcihkZXN0RGlyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgUGF0aCBwID0gamF2YWMuY3JlYXRlU3JjKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwLmFkZChzcmMpOworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBQYXRoIHRtcERpciA9IG5ldyBQYXRoKGdldFByb2plY3QoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGRpciA9IChGaWxlKSBjdS5nZXRDb25maWd1cmF0aW9uKCkuZ2V0Sm9pbnRDb21waWxhdGlvbk9wdGlvbnMoKS5nZXQoInN0dWJEaXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcERpci5zZXRMb2NhdGlvbihkaXIpOworICAgICAgICAgICAgICAgICAgICAgICAgcC5hZGQodG1wRGlyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGphdmFjLmV4ZWN1dGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgdW5pdC5zZXRDb21waWxlckZhY3RvcnkobmV3IEphdmFDb21waWxlckZhY3RvcnkoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBKYXZhQ29tcGlsZXIgY3JlYXRlQ29tcGlsZXIoQ29tcGlsZXJDb25maWd1cmF0aW9uIGNvbmZpZykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBpbGVyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdW5pdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGlsYXRpb25Vbml0KGNvbmZpZ3VyYXRpb24sIG51bGwsIGJ1aWxkQ2xhc3NMb2FkZXJGb3IoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgRmlsZSBjcmVhdGVUZW1wRGlyKCkgIHsKKyAgICAgICAgRmlsZSB0ZW1wRmlsZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRlbXBGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiZ2VuZXJhdGVkLSIsICJqYXZhLXNvdXJjZSIpOworICAgICAgICAgICAgdGVtcEZpbGUuZGVsZXRlKCk7CisgICAgICAgICAgICB0ZW1wRmlsZS5ta2RpcnMoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0ZW1wRmlsZTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgR3Jvb3Z5Q2xhc3NMb2FkZXIgYnVpbGRDbGFzc0xvYWRlckZvcigpIHsKKyAgICAgICAgQ2xhc3NMb2FkZXIgcGFyZW50ID0gdGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7CisgICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBBbnRDbGFzc0xvYWRlcikgeworICAgICAgICAgICAgQW50Q2xhc3NMb2FkZXIgYW50TG9hZGVyID0gKEFudENsYXNzTG9hZGVyKSBwYXJlbnQ7CisgICAgICAgICAgICBTdHJpbmdbXSBwYXRoRWxtID0gYW50TG9hZGVyLmdldENsYXNzcGF0aCgpLnNwbGl0KEZpbGUucGF0aFNlcGFyYXRvcik7CisgICAgICAgICAgICBMaXN0IGNsYXNzcGF0aCA9IGNvbmZpZ3VyYXRpb24uZ2V0Q2xhc3NwYXRoKCk7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogSXRlcmF0ZSBvdmVyIHRoZSBjbGFzc3BhdGggcHJvdmlkZWQgdG8gZ3Jvb3Z5YywgYW5kIGFkZCBhbnkgbWlzc2luZyBwYXRoCisgICAgICAgICAgICAgKiBlbnRyaWVzIHRvIHRoZSBBbnRDbGFzc0xvYWRlci4gIFRoaXMgaXMgYSB3b3JrYXJvdW5kLCBzaW5jZSBmb3Igc29tZSByZWFzb24KKyAgICAgICAgICAgICAqICdkaXJlY3RvcnknIGNsYXNzcGF0aCBlbnRyaWVzIHdlcmUgbm90IGFkZGVkIHRvIHRoZSBBbnRDbGFzc0xvYWRlcicgY2xhc3NwYXRoLiAKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gY2xhc3NwYXRoLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIFN0cmluZyBjcEVudHJ5ID0gKFN0cmluZykgaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGF0aEVsbS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoY3BFbnRyeS5lcXVhbHMocGF0aEVsbVtpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCQkvKgorCQkgKiBmaXggZm9yIEdST09WWS0yMjg0CisJCSAqIHNlZW1zIGxpa2UgQW50Q2xhc3NMb2FkZXIgZG9lc24ndCBjaGVjayBpZiB0aGUgZmlsZQorCQkgKiBtYXkgbm90IGV4aXN0IGluIHRoZSBjbGFzc3BhdGggeWV0CisJCSAqLyAKKyAgICAgICAgICAgICAgICBpZiAoIWZvdW5kICYmIG5ldyBGaWxlKGNwRW50cnkpLmV4aXN0cygpKQorICAgICAgICAgICAgICAgICAgICBhbnRMb2FkZXIuYWRkUGF0aEVsZW1lbnQoY3BFbnRyeSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBHcm9vdnlDbGFzc0xvYWRlcihwYXJlbnQsIGNvbmZpZ3VyYXRpb24pOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRKb2ludENvbXBpbGF0aW9uT3B0aW9ucyhTdHJpbmcgb3B0aW9ucykgeworICAgICAgICBTdHJpbmdbXSBhcmdzID0gU3RyaW5nSGVscGVyLnRva2VuaXplVW5xdW90ZWQob3B0aW9ucyk7CisgICAgICAgIGV2YWxDb21waWxlckZsYWdzKGFyZ3MpOworICAgIH0gIAorICAgIAorICAgIHB1YmxpYyBKYXZhYyBjcmVhdGVKYXZhYygpIHsKKyAgICAgICAgaWYgKGphdmFjIT1udWxsKSB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIm5lc3RlZCBqYXZhYyBlbGVtZW50IGFsbG93ZWQgb25seSBvbmNlIik7CisgICAgICAgIGphdmFjID0gbmV3IEphdmFjKCk7CisgICAgICAgIHJldHVybiBqYXZhYzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hbnQvR3Jvb3Z5Y1Rhc2suamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudC9Hcm9vdnljVGFzay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMDExMGIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hbnQvR3Jvb3Z5Y1Rhc2suamF2YQpAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5hbnQ7CisKK2ltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlDbGFzc0xvYWRlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkRpcmVjdG9yeVNjYW5uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkdsb2JQYXR0ZXJuTWFwcGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU291cmNlRmlsZVNjYW5uZXI7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuQ29tcGlsYXRpb25Vbml0OworCitpbXBvcnQgamF2YS5pby5GaWxlOworCisvKioKKyAqIENvbXBpbGVzIEdyb292eSBzb3VyY2UgZmlsZXMuCisgKgorICogQHZlcnNpb24gJElkJAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFzb25AcGxhbmV0NTcuY29tIj5KYXNvbiBEaWxsb248L2E+CisgKi8KK3B1YmxpYyBjbGFzcyBHcm9vdnljVGFzaworICAgIGV4dGVuZHMgQ29tcGlsZVRhc2tTdXBwb3J0Cit7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZm9yY2U7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGb3JjZShmaW5hbCBib29sZWFuIGZsYWcpIHsKKyAgICAgICAgdGhpcy5mb3JjZSA9IGZsYWc7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgY29tcGlsZSgpIHsKKyAgICAgICAgUGF0aCBwYXRoID0gZ2V0Q2xhc3NwYXRoKCk7CisgICAgICAgIGlmIChwYXRoICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvbmZpZy5zZXRDbGFzc3BhdGgocGF0aC50b1N0cmluZygpKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbmZpZy5zZXRUYXJnZXREaXJlY3RvcnkoZGVzdGRpcik7CisKKyAgICAgICAgR3Jvb3Z5Q2xhc3NMb2FkZXIgZ2NsID0gY3JlYXRlQ2xhc3NMb2FkZXIoKTsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uID0gbmV3IENvbXBpbGF0aW9uVW5pdChjb25maWcsIG51bGwsIGdjbCk7CisKKyAgICAgICAgR2xvYlBhdHRlcm5NYXBwZXIgbWFwcGVyID0gbmV3IEdsb2JQYXR0ZXJuTWFwcGVyKCk7CisgICAgICAgIG1hcHBlci5zZXRGcm9tKCIqLmdyb292eSIpOworICAgICAgICBtYXBwZXIuc2V0VG8oIiouY2xhc3MiKTsKKyAgICAgICAgCisgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgIFN0cmluZ1tdIGxpc3QgPSBzcmMubGlzdCgpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgRmlsZSBiYXNlZGlyID0gZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKGxpc3RbaV0pOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoIWJhc2VkaXIuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlNvdXJjZSBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3Q6ICIgKyBiYXNlZGlyLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBzY2FubmVyID0gZ2V0RGlyZWN0b3J5U2Nhbm5lcihiYXNlZGlyKTsKKyAgICAgICAgICAgIFN0cmluZ1tdIGluY2x1ZGVzID0gc2Nhbm5lci5nZXRJbmNsdWRlZEZpbGVzKCk7CisKKyAgICAgICAgICAgIGlmIChmb3JjZSkgeworICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRm9yY2VmdWxseSBpbmNsdWRpbmcgYWxsIGZpbGVzIGZyb206ICIgKyBiYXNlZGlyKTsKKworICAgICAgICAgICAgICAgIGZvciAoaW50IGo9MDsgaiA8IGluY2x1ZGVzLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGJhc2VkaXIsIGluY2x1ZGVzW2pdKTsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgICAgIiAgKyBmaWxlKTsKKworICAgICAgICAgICAgICAgICAgICBjb21waWxhdGlvbi5hZGRTb3VyY2UoZmlsZSk7CisgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJJbmNsdWRpbmcgY2hhbmdlZCBmaWxlcyBmcm9tOiAiICsgYmFzZWRpcik7CisKKyAgICAgICAgICAgICAgICBTb3VyY2VGaWxlU2Nhbm5lciBzb3VyY2VTY2FubmVyID0gbmV3IFNvdXJjZUZpbGVTY2FubmVyKHRoaXMpOworICAgICAgICAgICAgICAgIEZpbGVbXSBmaWxlcyA9IHNvdXJjZVNjYW5uZXIucmVzdHJpY3RBc0ZpbGVzKGluY2x1ZGVzLCBiYXNlZGlyLCBkZXN0ZGlyLCBtYXBwZXIpOworCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaj0wOyBqIDwgZmlsZXMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgICAgIiAgKyBmaWxlc1tqXSk7CisKKyAgICAgICAgICAgICAgICAgICAgY29tcGlsYXRpb24uYWRkU291cmNlKGZpbGVzW2pdKTsKKyAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoY291bnQgPiAwKSB7CisgICAgICAgICAgICBsb2cuaW5mbygiQ29tcGlsaW5nICIgKyBjb3VudCArICIgc291cmNlIGZpbGUiICsgKGNvdW50ID4gMSA/ICJzIiA6ICIiKSArICIgdG8gIiArIGRlc3RkaXIpOworCisgICAgICAgICAgICBjb21waWxhdGlvbi5jb21waWxlKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBsb2cuaW5mbygiTm8gc291cmNlcyBmb3VuZCB0byBjb21waWxlIik7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50L0dyb292eWRvYy5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50L0dyb292eWRvYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNjFkZTcKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hbnQvR3Jvb3Z5ZG9jLmphdmEKQEAgLTAsMCArMSwyODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVuYW1lRmlsdGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkRpcmVjdG9yeVNjYW5uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5EaXJTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXR0ZXJuU2V0OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuZ3Jvb3Z5ZG9jLkNsYXNzcGF0aFJlc291cmNlTWFuYWdlcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLmdyb292eWRvYy5GaWxlT3V0cHV0VG9vbDsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLmdyb292eWRvYy5Hcm9vdnlEb2NUb29sOworCisvKioKKyAqIEFjY2VzcyB0byB0aGUgR3Jvb3Z5RG9jIHRvb2wgZnJvbSBBbnQuCisgKgorICogQHZlcnNpb24gJElkJAorICovCitwdWJsaWMgY2xhc3MgR3Jvb3Z5ZG9jIGV4dGVuZHMgVGFzaworeworICAgIHByaXZhdGUgZmluYWwgTG9nZ2luZ0hlbHBlciBsb2cgPSBuZXcgTG9nZ2luZ0hlbHBlcih0aGlzKTsKKyAgICAKKyAgICBwcml2YXRlIFBhdGggc291cmNlUGF0aDsKKyAgICBwcml2YXRlIEZpbGUgZGVzdERpcjsKKyAgICBwcml2YXRlIExpc3QgcGFja2FnZU5hbWVzOworICAgIHByaXZhdGUgTGlzdCBleGNsdWRlUGFja2FnZU5hbWVzOworCXByaXZhdGUgU3RyaW5nIHdpbmRvd1RpdGxlOworCXByaXZhdGUgYm9vbGVhbiBwcml2YXRlU2NvcGU7CisgICAgcHJpdmF0ZSBib29sZWFuIHVzZURlZmF1bHRFeGNsdWRlczsKKyAgICBwcml2YXRlIGJvb2xlYW4gaW5jbHVkZU5vU291cmNlUGFja2FnZXM7CisgICAgcHJpdmF0ZSBMaXN0IHBhY2thZ2VTZXRzOworCXByaXZhdGUgTGlzdCBzb3VyY2VGaWxlc1RvRG9jOworCisKKyAgICBwdWJsaWMgR3Jvb3Z5ZG9jKCkgeworICAgIAlwYWNrYWdlTmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgCWV4Y2x1ZGVQYWNrYWdlTmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgCXBhY2thZ2VTZXRzID0gbmV3IEFycmF5TGlzdCgpOworICAgIAlzb3VyY2VGaWxlc1RvRG9jID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBwcml2YXRlU2NvcGUgPSBmYWxzZTsKKyAgICAgICAgdXNlRGVmYXVsdEV4Y2x1ZGVzID0gdHJ1ZTsKKyAgICAgICAgaW5jbHVkZU5vU291cmNlUGFja2FnZXMgPSBmYWxzZTsKKyAgICB9CisgICAgLyoqCisgICAgICogU3BlY2lmeSB3aGVyZSB0byBmaW5kIHNvdXJjZSBmaWxlCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3JjIGEgUGF0aCBpbnN0YW5jZSBjb250YWluaW5nIHRoZSB2YXJpb3VzIHNvdXJjZSBkaXJlY3Rvcmllcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VwYXRoKFBhdGggc3JjKSB7CisgICAgICAgIGlmIChzb3VyY2VQYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgIHNvdXJjZVBhdGggPSBzcmM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzb3VyY2VQYXRoLmFwcGVuZChzcmMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIEphdmFkb2Mgb3V0cHV0IHdpbGwgYmUgZ2VuZXJhdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGRpciB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlc3RkaXIoRmlsZSBkaXIpIHsKKyAgICAgICAgZGVzdERpciA9IGRpcjsKKyAgICAgICAgLy8gdG9kbzogbWF5YmUgdGVsbCBncm9vdnlkb2MgdG8gdXNlIGZpbGUgb3V0cHV0CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgcGFja2FnZSBuYW1lcyB0byBiZSBwcm9jZXNzZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFja2FnZXMgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBwYWNrYWdlcyBzcGVjcworICAgICAqICAgICAgICAobWF5IGJlIHdpbGRjYXJkZWQpLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFja2FnZW5hbWVzKFN0cmluZyBwYWNrYWdlcykgeworICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcihwYWNrYWdlcywgIiwiKTsKKyAgICAgICAgd2hpbGUgKHRvay5oYXNNb3JlVG9rZW5zKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IHRvay5uZXh0VG9rZW4oKTsKKyAgICAgICAgICAgIHBhY2thZ2VOYW1lcy5hZGQocGFja2FnZU5hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXNlKGJvb2xlYW4gYikgeworICAgIAkvL2lnbm9yZSBhcyAndXNlIGV4dGVybmFsIGZpbGUnIGlycmVsZXZhbnQgd2l0aCBncm9vdnlkb2MgOi0pCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgdGl0bGUgdG8gYmUgcGxhY2VkIGluIHRoZSBIVE1MICZsdDt0aXRsZSZndDsgdGFnIG9mIHRoZQorICAgICAqIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHRpdGxlIHRoZSB3aW5kb3cgdGl0bGUgdG8gdXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFdpbmRvd3RpdGxlKFN0cmluZyB0aXRsZSkgeworICAgIAl3aW5kb3dUaXRsZSA9IHRpdGxlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZSB3aGV0aGVyIGFsbCBjbGFzc2VzIGFuZAorICAgICAqIG1lbWJlcnMgYXJlIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBzY29wZSBwcm9jZXNzZWQKKyAgICAgKgorICAgICAqIEBwYXJhbSBiIHRydWUgaWYgc2NvcGUgaXMgdG8gYmUgcHJpdmF0ZSBsZXZlbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcml2YXRlKGJvb2xlYW4gYikgeworICAgIAlwcml2YXRlU2NvcGUgPSBiOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCB0aGUgZGlyZWN0b3JpZXMgbWF0Y2hlZCBieSB0aGUgbmVzdGVkIGRpcnNldHMgdG8gdGhlIFZlY3RvcgorICAgICAqIGFuZCB0aGUgYmFzZSBkaXJlY3RvcmllcyBvZiB0aGUgZGlyc2V0cyB0byB0aGUgUGF0aC4gIEl0IGFsc28KKyAgICAgKiBoYW5kbGVzIHRoZSBwYWNrYWdlcyBhbmQgZXhjbHVkZXBhY2thZ2VzIGF0dHJpYnV0ZXMgYW5kCisgICAgICogZWxlbWVudHMuCisgICAgICoKKyAgICAgKiBAc2luY2UgMS41CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlUGFja2FnZXMoTGlzdCByZXN1bHRhbnRQYWNrYWdlcywgUGF0aCBzcCkgeworICAgICAgICBMaXN0IGFkZGVkUGFja2FnZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIExpc3QgZGlyU2V0cyA9IG5ldyBBcnJheUxpc3QocGFja2FnZVNldHMpOworCisgICAgICAgIC8vIGZvciBlYWNoIHNvdXJjZVBhdGggZW50cnksIGFkZCBhIGRpcmVjdG9yeXNldCB3aXRoIGluY2x1ZGVzCisgICAgICAgIC8vIHRha2VuIGZyb20gcGFja2FnZW5hbWVzIGF0dHJpYnV0ZSBhbmQgbmVzdGVkIHBhY2thZ2UKKyAgICAgICAgLy8gZWxlbWVudHMgYW5kIGV4Y2x1ZGVzIHRha2VuIGZyb20gZXhjbHVkZXBhY2thZ2VzIGF0dHJpYnV0ZQorICAgICAgICAvLyBhbmQgbmVzdGVkIGV4Y2x1ZGVwYWNrYWdlIGVsZW1lbnRzCisgICAgICAgIGlmIChzb3VyY2VQYXRoICE9IG51bGwpIHsKKyAgICAgICAgICAgIFBhdHRlcm5TZXQgcHMgPSBuZXcgUGF0dGVyblNldCgpOworICAgICAgICAgICAgaWYgKHBhY2thZ2VOYW1lcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgSXRlcmF0b3IgaXRyID0gcGFja2FnZU5hbWVzLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHAgPSAoU3RyaW5nKSBpdHIubmV4dCgpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGtnID0gcC5yZXBsYWNlKCcuJywgJy8nKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBrZy5lbmRzV2l0aCgiKiIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwa2cgKz0gIioiOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBzLmNyZWF0ZUluY2x1ZGUoKS5zZXROYW1lKHBrZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcy5jcmVhdGVJbmNsdWRlKCkuc2V0TmFtZSgiKioiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgSXRlcmF0b3IgaXRyMiA9IGV4Y2x1ZGVQYWNrYWdlTmFtZXMuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChpdHIyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBwID0gKFN0cmluZykgaXRyMi5uZXh0KCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHBrZyA9IHAucmVwbGFjZSgnLicsICcvJyk7CisgICAgICAgICAgICAgICAgaWYgKHBrZy5lbmRzV2l0aCgiKiIpKSB7CisgICAgICAgICAgICAgICAgICAgIHBrZyArPSAiKiI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBzLmNyZWF0ZUV4Y2x1ZGUoKS5zZXROYW1lKHBrZyk7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgU3RyaW5nW10gcGF0aEVsZW1lbnRzID0gc291cmNlUGF0aC5saXN0KCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhdGhFbGVtZW50cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIEZpbGUgZGlyID0gbmV3IEZpbGUocGF0aEVsZW1lbnRzW2ldKTsKKyAgICAgICAgICAgICAgICBpZiAoZGlyLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgRGlyU2V0IGRzID0gbmV3IERpclNldCgpOworICAgICAgICAgICAgICAgICAgICBkcy5zZXREZWZhdWx0ZXhjbHVkZXModXNlRGVmYXVsdEV4Y2x1ZGVzKTsKKyAgICAgICAgICAgICAgICAgICAgZHMuc2V0RGlyKGRpcik7CisgICAgICAgICAgICAgICAgICAgIGRzLmNyZWF0ZVBhdHRlcm5TZXQoKS5hZGRDb25maWd1cmVkUGF0dGVybnNldChwcyk7CisgICAgICAgICAgICAgICAgICAgIGRpclNldHMuYWRkKGRzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsb2cud2FybigiU2tpcHBpbmcgIiArIHBhdGhFbGVtZW50c1tpXSArICIgc2luY2UgaXQgaXMgbm8gZGlyZWN0b3J5LiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEl0ZXJhdG9yIGl0cjMgPSBkaXJTZXRzLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpdHIzLmhhc05leHQoKSkgeworICAgICAgICAgICAgRGlyU2V0IGRzID0gKERpclNldCkgaXRyMy5uZXh0KCk7CisgICAgICAgICAgICBGaWxlIGJhc2VEaXIgPSBkcy5nZXREaXIoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgICAgIGxvZy5kZWJ1Zygic2Nhbm5pbmcgIiArIGJhc2VEaXIgKyAiIGZvciBwYWNrYWdlcy4iKTsKKyAgICAgICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHNjID0gZHMuZ2V0RGlyZWN0b3J5U2Nhbm5lcihnZXRQcm9qZWN0KCkpOworICAgICAgICAgICAgU3RyaW5nW10gZGlycyA9IGRzYy5nZXRJbmNsdWRlZERpcmVjdG9yaWVzKCk7CisgICAgICAgICAgICBib29sZWFuIGNvbnRhaW5zUGFja2FnZXMgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGlycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIC8vIGFyZSB0aGVyZSBhbnkgZ3Jvb3Z5IG9yIGphdmEgZmlsZXMgaW4gdGhpcyBkaXJlY3Rvcnk/CisgICAgICAgICAgICAgICAgRmlsZSBwZCA9IG5ldyBGaWxlKGJhc2VEaXIsIGRpcnNbaV0pOworICAgICAgICAgICAgICAgIFN0cmluZ1tdIGZpbGVzID0gcGQubGlzdChuZXcgRmlsZW5hbWVGaWx0ZXIgKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZGlyMSwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmFtZS5lbmRzV2l0aCgiLmphdmEiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBuYW1lLmVuZHNXaXRoKCIuZ3Jvb3Z5IikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbmFtZS5lbmRzV2l0aCgiLmd2IikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbmFtZS5lbmRzV2l0aCgiLmd2eSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG5hbWUuZW5kc1dpdGgoIi5nc2giKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoaW5jbHVkZU5vU291cmNlUGFja2FnZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG5hbWUuZXF1YWxzKCJwYWNrYWdlLmh0bWwiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAgICAgSXRlcmF0b3IgaXRyNCA9IEFycmF5cy5hc0xpc3QoZmlsZXMpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKGl0cjQuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgCVN0cmluZyBmaWxlbmFtZSA9IChTdHJpbmcpIGl0cjQubmV4dCgpOworICAgICAgICAgICAgICAgIAlzb3VyY2VGaWxlc1RvRG9jLmFkZChkaXJzW2ldICsgRmlsZS5zZXBhcmF0b3IgKyBmaWxlbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChmaWxlcy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgiIi5lcXVhbHMoZGlyc1tpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKGJhc2VEaXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgY29udGFpbnMgc291cmNlIGZpbGVzIGluIHRoZSBkZWZhdWx0IHBhY2thZ2UsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB5b3UgbXVzdCBzcGVjaWZ5IHRoZW0gYXMgc291cmNlIGZpbGVzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBub3QgcGFja2FnZXMuIik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluc1BhY2thZ2VzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyc1tpXS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy4nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWRkZWRQYWNrYWdlcy5jb250YWlucyhwYWNrYWdlTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRlZFBhY2thZ2VzLmFkZChwYWNrYWdlTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0YW50UGFja2FnZXMuYWRkKHBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjb250YWluc1BhY2thZ2VzKSB7CisgICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3QgbmVlZCB0byBjYXJlIGZvciBkdXBsaWNhdGVzIGhlcmUsCisgICAgICAgICAgICAgICAgLy8gUGF0aC5saXN0IGRvZXMgaXQgZm9yIHVzLgorICAgICAgICAgICAgICAgIHNwLmNyZWF0ZVBhdGhFbGVtZW50KCkuc2V0TG9jYXRpb24oYmFzZURpcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxvZy52ZXJib3NlKGJhc2VEaXIgKyAiIGRvZXNuXCd0IGNvbnRhaW4gYW55IHBhY2thZ2VzLCBkcm9wcGluZyBpdC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIAorICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgIAkvLyBkbyBpdAorCisgICAgICAgIExpc3QgcGFja2FnZXNUb0RvYyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgUGF0aCBzb3VyY2VEaXJzID0gbmV3IFBhdGgoZ2V0UHJvamVjdCgpKTsKKworICAgICAgICBpZiAoc291cmNlUGF0aCAhPSBudWxsKSB7CisgICAgICAgICAgICBzb3VyY2VEaXJzLmFkZEV4aXN0aW5nKHNvdXJjZVBhdGgpOworICAgICAgICB9CisgICAgICAgIHBhcnNlUGFja2FnZXMocGFja2FnZXNUb0RvYywgc291cmNlRGlycyk7ICAgICAgCisgICAgICAgIAorICAJCUdyb292eURvY1Rvb2wgaHRtbFRvb2wgPSBuZXcgR3Jvb3Z5RG9jVG9vbCgKKwkJCQluZXcgQ2xhc3NwYXRoUmVzb3VyY2VNYW5hZ2VyKCksIC8vIHdlJ3JlIGdvbm5hIGdldCB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMgb3V0IG9mIHRoZSBkaXN0IGphciBmaWxlCisJCQkJc291cmNlUGF0aC50b1N0cmluZygpLCAvLyBzb3VyY2VwYXRoICAgICAgICAgICAgICAgICAgICAgLSBUT0RPIG11bHRpcGxlIHBhdGhzIG5lZWQgdG8gYmUgaGFuZGxlZCBoZXJlCisJCQkJbmV3IFN0cmluZ1tdIHsgLy8gdG9wIGxldmVsIHRlbXBsYXRlcworCQkJCQkJIm9yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvZ3Jvb3Z5ZG9jL2dzdHJpbmctdGVtcGxhdGVzL3RvcC1sZXZlbC9pbmRleC5odG1sIiwKKwkJCQkJCSJvcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2dyb292eWRvYy9nc3RyaW5nLXRlbXBsYXRlcy90b3AtbGV2ZWwvb3ZlcnZpZXctZnJhbWUuaHRtbCIsIC8vIG5lZWRzIGFsbCBwYWNrYWdlIG5hbWVzCisJCQkJCQkib3JnL2NvZGVoYXVzL2dyb292eS90b29scy9ncm9vdnlkb2MvZ3N0cmluZy10ZW1wbGF0ZXMvdG9wLWxldmVsL2FsbGNsYXNzZXMtZnJhbWUuaHRtbCIsIC8vIG5lZWRzIGFsbCBwYWNrYWdlcyAvIGNsYXNzIG5hbWVzCisJCQkJCQkib3JnL2NvZGVoYXVzL2dyb292eS90b29scy9ncm9vdnlkb2MvZ3N0cmluZy10ZW1wbGF0ZXMvdG9wLWxldmVsL292ZXJ2aWV3LXN1bW1hcnkuaHRtbCIsIC8vIG5lZWRzIGFsbCBwYWNrYWdlcworCQkJCQkJIm9yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvZ3Jvb3Z5ZG9jL2dzdHJpbmctdGVtcGxhdGVzL3RvcC1sZXZlbC9zdHlsZXNoZWV0LmNzcyIsCisJCQkJfSwKKwkJCQluZXcgU3RyaW5nW10geyAvLyBwYWNrYWdlIGxldmVsIHRlbXBsYXRlcworCQkJCQkJIm9yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvZ3Jvb3Z5ZG9jL2dzdHJpbmctdGVtcGxhdGVzL3BhY2thZ2UtbGV2ZWwvcGFja2FnZS1mcmFtZS5odG1sIiwgCisJCQkJCQkib3JnL2NvZGVoYXVzL2dyb292eS90b29scy9ncm9vdnlkb2MvZ3N0cmluZy10ZW1wbGF0ZXMvcGFja2FnZS1sZXZlbC9wYWNrYWdlLXN1bW1hcnkuaHRtbCIKKwkJCQl9LAorCQkJCW5ldyBTdHJpbmdbXSB7IC8vIGNsYXNzIGxldmVsIHRlbXBsYXRlcworCQkJCQkJIm9yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvZ3Jvb3Z5ZG9jL2dzdHJpbmctdGVtcGxhdGVzL2NsYXNzLWxldmVsL2NsYXNzRG9jTmFtZS5odG1sIgorCQkJCX0KKwkJCQkpOworCisJCXRyeSB7CisJCQlJdGVyYXRvciBpdHIgPSBzb3VyY2VGaWxlc1RvRG9jLml0ZXJhdG9yKCk7CisJCQl3aGlsZSAoaXRyLmhhc05leHQoKSkgeworCQkJCWh0bWxUb29sLmFkZCgoU3RyaW5nKSBpdHIubmV4dCgpKTsKKwkJCX0KKwkJCQorCQkJRmlsZU91dHB1dFRvb2wgb3V0cHV0ID0gbmV3IEZpbGVPdXRwdXRUb29sKCk7CisJCQlodG1sVG9vbC5yZW5kZXJUb091dHB1dChvdXRwdXQsIGRlc3REaXIuZ2V0Q2Fub25pY2FsUGF0aCgpKTsgLy8gVE9ETyBwdXNoIGRlc3REaXIgdGhyb3VnaCBBUElzPworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50L0xvZ2dpbmdIZWxwZXIuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudC9Mb2dnaW5nSGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ4MDM1MAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudC9Mb2dnaW5nSGVscGVyLmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5hbnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CisKKy8qKgorICogSGVscGVyIHRvIG1ha2UgbG9nZ2luZyBmcm9tIEFudCBlYXNpZXIuCisgKgorICogQHZlcnNpb24gJElkJAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFzb25AcGxhbmV0NTcuY29tIj5KYXNvbiBEaWxsb248L2E+CisgKi8KK3B1YmxpYyBjbGFzcyBMb2dnaW5nSGVscGVyCit7CisgICAgcHJpdmF0ZSBUYXNrIG93bmVyOworCisgICAgcHVibGljIExvZ2dpbmdIZWxwZXIoZmluYWwgVGFzayBvd25lcikgeworICAgICAgICBhc3NlcnQgb3duZXIgIT0gbnVsbDsKKworICAgICAgICB0aGlzLm93bmVyID0gb3duZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZXJyb3IoZmluYWwgU3RyaW5nIG1zZykgeworICAgICAgICBvd25lci5sb2cobXNnLCBQcm9qZWN0Lk1TR19FUlIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdhcm4oZmluYWwgU3RyaW5nIG1zZykgeworICAgICAgICBvd25lci5sb2cobXNnLCBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbmZvKGZpbmFsIFN0cmluZyBtc2cpIHsKKyAgICAgICAgb3duZXIubG9nKG1zZywgUHJvamVjdC5NU0dfSU5GTyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmVyYm9zZShmaW5hbCBTdHJpbmcgbXNnKSB7CisgICAgICAgIG93bmVyLmxvZyhtc2csIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRlYnVnKGZpbmFsIFN0cmluZyBtc2cpIHsKKyAgICAgICAgb3duZXIubG9nKG1zZywgUHJvamVjdC5NU0dfREVCVUcpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hbnQvUm9vdExvYWRlclJlZi5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50L1Jvb3RMb2FkZXJSZWYuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzFhYjAwCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50L1Jvb3RMb2FkZXJSZWYuamF2YQpAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisgCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50OworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQW50Q2xhc3NMb2FkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5NYXRjaGluZ1Rhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWZlcmVuY2U7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5Mb2FkZXJDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuUm9vdExvYWRlcjsKKworIAorLyoqCisgKiBTZXRzIHRoZSBSb290TG9hZGVyIGFzIHJlZmVyZW5jZS4KKyAqIFJlZXhlY3V0aW9uIG9mIHRoaXMgdGFzayB3aWxsIHNldCBhIG5ldyBpbnN0YW5jZSBvZiBSb290TG9hZGVyIGZvcgorICogdGhlIHJlZmVyZW5jZS4gCisgKgorICogYXJndW1lbnRzOgorICogPHVsPgorICogPGxpPnJlZjwvbGk+CisgKiA8bGk+Y2xhc3NwYXRoPC9saT4KKyAqIDwvdWw+CisgKiAKKyAqIGFsbCBhcmd1bWVudHMgYXJlIHJlcXVpZXJlZC4gCisgKgorICogQXMgYW50IHJlcXVpZXJlcyBhbiBBbnRDbGFzc0xvYWRlciBhcyByZWZlcmVuY2UsIHRoaXMgd2lsbCBjcmVhdGUgYSBSb290TG9hZGVyCisgKiBhbmQgc2V0IGFuIEFudENsYXNzTG9hZGVyIGFzIGNoaWxkIGFuZCBzdG9yZWQgaW4gdGhlIHJlZmVyZW5jZS4gVGhlIEFudENsYXNzTG9hZGVyCisgKiBpbnN0YW5jZSB3aWxsIG5vdCBoYXZlIGEgY2xhc3NwYXRoIG5vciB3aWxsIGl0IGhhdmUgYWNjZXNzIHRvIHRoZSBjbGFzc3BhdGggc29tZWhvdywKKyAqIGFsbCBsb2FkaW5nIGlzIGRvbmUgYnkgdGhlIFJvb3RMb2FkZXIgcGFyZW50LiBUbyBhdm9pZCBwcm9ibGVtcyB3aXRoIGxvYWRpbmcgY2xhc3NlcyAKKyAqIG11bHRpcGxlIHRpbWVzIGFuZCB1c2luZyB0aGVtIGF0IHRoZSBzYW1lIHRpbWUsIHRoaXMgdGFzayB3aWxsIGZpbHRlciBvdXQgdGhlIGFudCBqYXJzCisgKiBhbmQgdGhlIGNvbW1vbnMtbG9nZ2luZyBqYXJzLiBUaGlzIG9ubHkgd29ya3MgaWYgdGhlIGFudCBqYXJzIGFyZSBzdGFydGluZyB3aXRoICJhbnQtIiBhbmQKKyAqIHRoZSBsb2dnaW5nIGphciBzdGFydHMgd2l0aCAiY29tbW9ucy1sb2dnaW5nLSIuCisgKiAKKyAqIFRoaXMgd2FzIG5lZWRlZCBiZWNhdXNlIGlmIGFudCB3YW50cyB0byBhY2Nlc3MgYSB0YXNrIGFyZ3VtZW50IHRoYXQgdXNlcyBmb3IgZXhhbXBsZSBhIFBhdGgKKyAqIGl0IGxvb2sgZm9yIGEgbWF0Y2hpbmcgbWV0aG9kIHdoaWNoIGluY2x1ZGVzIGEgbWF0Y2hpbmcgY2xhc3MuIEJ1dCB0d28gY2xhc3NlcyBvZiB0aGUgc2FtZSBuYW1lCisgKiB3aXRoIGRpZmZlcmVudCBjbGFzc2xvYWRlcnMgYXJlIGRpZmZlcmVudCwgc28gYW50IHdvdWxkIG5vdCBiZSBhYmxlIHRvIGZpbmQgdGhlIG1ldGhvZC4KKyAqCisgKiBAc2VlIG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuUm9vdExvYWRlcgorICogQGF1dGhvciBKb2NoZW4gVGhlb2Rvcm91CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kIAorICovCitwdWJsaWMgY2xhc3MgUm9vdExvYWRlclJlZiBleHRlbmRzIE1hdGNoaW5nVGFzayB7CisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKyAgICBwcml2YXRlIFBhdGggdGFza0NsYXNzcGF0aDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBzZXRzIHRoZSBuYW1lIG9mIHRoZSByZWZlcmVuY2Ugd2hpY2ggc2hvdWxkIHN0b3JlIHRoZSBMb2FkZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZWYoU3RyaW5nIG4peworICAgICAgICBuYW1lID0gbjsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICh0YXNrQ2xhc3NwYXRoPT1udWxsIHx8IHRhc2tDbGFzc3BhdGguc2l6ZSgpPT0wKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIm5vIGNsYXNzcGF0aCBnaXZlbiIpOworICAgICAgICB9CisgICAgICAgIFByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKKyAgICAgICAgQW50Q2xhc3NMb2FkZXIgbG9hZGVyID0gbmV3IEFudENsYXNzTG9hZGVyKG1ha2VSb290KCksdHJ1ZSk7CisgICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKG5hbWUsbG9hZGVyKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBSb290TG9hZGVyIG1ha2VSb290KCkgeworICAgICAgICBTdHJpbmdbXSBsaXN0ID0gdGFza0NsYXNzcGF0aC5saXN0KCk7CisgICAgICAgIExvYWRlckNvbmZpZ3VyYXRpb24gbGMgPSBuZXcgTG9hZGVyQ29uZmlndXJhdGlvbigpOworICAgICAgICBmb3IgKGludCBpPTA7IGk8bGlzdC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGxpc3RbaV0ubWF0Y2hlcygiLiphbnQtW14vXSpqYXIkIikpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsaXN0W2ldLm1hdGNoZXMoIi4qY29tbW9ucy1sb2dnaW5nLVteL10qamFyJCIpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGlzdFtpXS5tYXRjaGVzKCIuKnhlcmNlcy1bXi9dKmphciQiKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGMuYWRkRmlsZShsaXN0W2ldKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IFJvb3RMb2FkZXIobGMpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNsYXNzcGF0aCB0byBiZSB1c2VkIGZvciB0aGlzIGNvbXBpbGF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXNzcGF0aCBhbiBBbnQgUGF0aCBvYmplY3QgY29udGFpbmluZyB0aGUgY29tcGlsYXRpb24gY2xhc3NwYXRoLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aChQYXRoIGNsYXNzcGF0aCkgeworICAgICAgICBpZiAodGFza0NsYXNzcGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICB0YXNrQ2xhc3NwYXRoID0gY2xhc3NwYXRoOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdGFza0NsYXNzcGF0aC5hcHBlbmQoY2xhc3NwYXRoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgcmVmZXJlbmNlIHRvIGEgY2xhc3NwYXRoIGRlZmluZWQgZWxzZXdoZXJlLgorICAgICAqIEBwYXJhbSByIGEgcmVmZXJlbmNlIHRvIGEgY2xhc3NwYXRoCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoUmVmKFJlZmVyZW5jZSByKSB7CisgICAgICAgIGNyZWF0ZUNsYXNzcGF0aCgpLnNldFJlZmlkKHIpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgcGF0aCB0byB0aGUgY2xhc3NwYXRoLgorICAgICAqIEByZXR1cm4gYSBjbGFzcyBwYXRoIHRvIGJlIGNvbmZpZ3VyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aCBjcmVhdGVDbGFzc3BhdGgoKSB7CisgICAgICAgIGlmICh0YXNrQ2xhc3NwYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgIHRhc2tDbGFzc3BhdGggPSBuZXcgUGF0aChnZXRQcm9qZWN0KCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0YXNrQ2xhc3NwYXRoLmNyZWF0ZVBhdGgoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hbnQvVWJlckNvbXBpbGVUYXNrLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hbnQvVWJlckNvbXBpbGVUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVhNjhmZAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudC9VYmVyQ29tcGlsZVRhc2suamF2YQpAQCAtMCwwICsxLDI1NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5hbnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkphdmFjOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWZlcmVuY2U7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBDb21waWxlcyBKYXZhIGFuZCBHcm9vdnkgc291cmNlIGZpbGVzLgorICoKKyAqIFRoaXMgd29ya3MgYnkgaW52b2tpbmcgdGhlIHtAbGluayBHZW5lcmF0ZVN0dWJzVGFza30gdGFzaywgdGhlbiB0aGUKKyAqIHtAbGluayBKYXZhY30gdGFzayBhbmQgdGhlbiB0aGUge0BsaW5rIEdyb292eWNUYXNrfS4gIEVhY2ggdGFzayBjYW4KKyAqIGJlIGNvbmZpZ3VyZWQgYnkgY3JlYXRpbmcgYSBuZXN0ZWQgZWxlbWVudC4gIENvbW1vbiBjb25maWd1cmF0aW9uCisgKiBzdWNoIGFzIHRoZSBzb3VyY2UgZGlyIGFuZCBjbGFzc3BhdGggaXMgcGlja2VkIHVwIGZyb20gdGhpcyB0YXNrcworICogY29uZmlndXJhdGlvbi4KKyAqCisgKiBAdmVyc2lvbiAkSWQkCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYXNvbkBwbGFuZXQ1Ny5jb20iPkphc29uIERpbGxvbjwvYT4KKyAqLworcHVibGljIGNsYXNzIFViZXJDb21waWxlVGFzaworICAgIGV4dGVuZHMgVGFzaworeworICAgIHByaXZhdGUgZmluYWwgTG9nZ2luZ0hlbHBlciBsb2cgPSBuZXcgTG9nZ2luZ0hlbHBlcih0aGlzKTsKKworICAgIHByaXZhdGUgUGF0aCBzcmM7CisKKyAgICBwcml2YXRlIEZpbGUgZGVzdGRpcjsKKworICAgIHByaXZhdGUgUGF0aCBjbGFzc3BhdGg7CisKKyAgICBwcml2YXRlIEdlblN0dWJzQWRhcHRlciBnZW5TdHVic1Rhc2s7CisKKyAgICBwcml2YXRlIEdyb292eWNBZGFwdGVyIGdyb292eWNUYXNrOworCisgICAgcHJpdmF0ZSBKYXZhY0FkYXB0ZXIgamF2YWNUYXNrOworCisgICAgcHVibGljIFBhdGggY3JlYXRlU3JjKCkgeworICAgICAgICBpZiAoc3JjID09IG51bGwpIHsKKyAgICAgICAgICAgIHNyYyA9IG5ldyBQYXRoKGdldFByb2plY3QoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNyYy5jcmVhdGVQYXRoKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3JjZGlyKGZpbmFsIFBhdGggZGlyKSB7CisgICAgICAgIGFzc2VydCBkaXIgIT0gbnVsbDsKKworICAgICAgICBpZiAoc3JjID09IG51bGwpIHsKKyAgICAgICAgICAgIHNyYyA9IGRpcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHNyYy5hcHBlbmQoZGlyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBQYXRoIGdldFNyY2RpcigpIHsKKyAgICAgICAgcmV0dXJuIHNyYzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREZXN0ZGlyKGZpbmFsIEZpbGUgZGlyKSB7CisgICAgICAgIGFzc2VydCBkaXIgIT0gbnVsbDsKKworICAgICAgICB0aGlzLmRlc3RkaXIgPSBkaXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoKGZpbmFsIFBhdGggcGF0aCkgeworICAgICAgICBhc3NlcnQgcGF0aCAhPSBudWxsOworICAgICAgICAKKyAgICAgICAgaWYgKGNsYXNzcGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICBjbGFzc3BhdGggPSBwYXRoOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY2xhc3NwYXRoLmFwcGVuZChwYXRoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBQYXRoIGdldENsYXNzcGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIGNsYXNzcGF0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgUGF0aCBjcmVhdGVDbGFzc3BhdGgoKSB7CisgICAgICAgIGlmIChjbGFzc3BhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgY2xhc3NwYXRoID0gbmV3IFBhdGgoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjbGFzc3BhdGguY3JlYXRlUGF0aCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aFJlZihmaW5hbCBSZWZlcmVuY2UgcikgeworICAgICAgICBhc3NlcnQgciAhPSBudWxsOworCisgICAgICAgIGNyZWF0ZUNsYXNzcGF0aCgpLnNldFJlZmlkKHIpOworICAgIH0KKworICAgIHB1YmxpYyBHZW5TdHVic0FkYXB0ZXIgY3JlYXRlR2VuZXJhdGVzdHVicygpIHsKKyAgICAgICAgaWYgKGdlblN0dWJzVGFzayA9PSBudWxsKSB7CisgICAgICAgICAgICBnZW5TdHVic1Rhc2sgPSBuZXcgR2VuU3R1YnNBZGFwdGVyKCk7CisgICAgICAgICAgICBnZW5TdHVic1Rhc2suc2V0UHJvamVjdChnZXRQcm9qZWN0KCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBnZW5TdHVic1Rhc2s7CisgICAgfQorCisgICAgcHVibGljIEdyb292eWNBZGFwdGVyIGNyZWF0ZUdyb292eWMoKSB7CisgICAgICAgIGlmIChncm9vdnljVGFzayA9PSBudWxsKSB7CisgICAgICAgICAgICBncm9vdnljVGFzayA9IG5ldyBHcm9vdnljQWRhcHRlcigpOworICAgICAgICAgICAgZ3Jvb3Z5Y1Rhc2suc2V0UHJvamVjdChnZXRQcm9qZWN0KCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBncm9vdnljVGFzazsKKyAgICB9CisKKyAgICBwdWJsaWMgSmF2YWNBZGFwdGVyIGNyZWF0ZUphdmFjKCkgeworICAgICAgICBpZiAoamF2YWNUYXNrID09IG51bGwpIHsKKyAgICAgICAgICAgIGphdmFjVGFzayA9IG5ldyBKYXZhY0FkYXB0ZXIoKTsKKyAgICAgICAgICAgIGphdmFjVGFzay5zZXRQcm9qZWN0KGdldFByb2plY3QoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGphdmFjVGFzazsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChzcmMgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJNaXNzaW5nIGF0dHJpYnV0ZTogc3JjZGlyIChvciBvbmUgb3IgbW9yZSBuZXN0ZWQgPHNyYz4gZWxlbWVudHMpLiIsIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRlc3RkaXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJNaXNzaW5nIGF0dHJpYnV0ZTogZGVzdGRpciIsIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFkZXN0ZGlyLmV4aXN0cygpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkRlc3RpbmF0aW9uIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdDogIiArIGRlc3RkaXIsIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICB2YWxpZGF0ZSgpOworCisgICAgICAgIEZpbGVTZXQgZmlsZXNldDsKKyAgICAgICAgCisgICAgICAgIEdlblN0dWJzQWRhcHRlciBnZW5zdHVicyA9IGNyZWF0ZUdlbmVyYXRlc3R1YnMoKTsKKyAgICAgICAgZ2Vuc3R1YnMuY2xhc3NwYXRoID0gY2xhc3NwYXRoOworICAgICAgICBnZW5zdHVicy5zcmMgPSBzcmM7CisgICAgICAgIGlmIChnZW5zdHVicy5kZXN0ZGlyID09IG51bGwpIHsKKyAgICAgICAgICAgIGdlbnN0dWJzLmRlc3RkaXIgPSBjcmVhdGVUZW1wRGlyKCk7CisgICAgICAgIH0KKworICAgICAgICBmaWxlc2V0ID0gZ2Vuc3R1YnMuZ2V0RmlsZVNldCgpOworICAgICAgICBpZiAoIWZpbGVzZXQuaGFzUGF0dGVybnMoKSkgeworICAgICAgICAgICAgZ2Vuc3R1YnMuY3JlYXRlSW5jbHVkZSgpLnNldE5hbWUoIioqLyouamF2YSIpOworICAgICAgICAgICAgZ2Vuc3R1YnMuY3JlYXRlSW5jbHVkZSgpLnNldE5hbWUoIioqLyouZ3Jvb3Z5Iik7CisgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgSmF2YWNBZGFwdGVyIGphdmFjID0gY3JlYXRlSmF2YWMoKTsKKyAgICAgICAgamF2YWMuc2V0U3JjZGlyKHNyYyk7CisgICAgICAgIGphdmFjLnNldERlc3RkaXIoZGVzdGRpcik7CisgICAgICAgIGphdmFjLnNldENsYXNzcGF0aChjbGFzc3BhdGgpOworCisgICAgICAgIGZpbGVzZXQgPSBqYXZhYy5nZXRGaWxlU2V0KCk7CisgICAgICAgIGlmICghZmlsZXNldC5oYXNQYXR0ZXJucygpKSB7CisgICAgICAgICAgICBqYXZhYy5jcmVhdGVJbmNsdWRlKCkuc2V0TmFtZSgiKiovKi5qYXZhIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBJbmNsdWRlIHRoZSBzdHVicyBpbiB0aGUgSmF2YWMgY29tcGlsYXRpb24KKyAgICAgICAgamF2YWMuY3JlYXRlU3JjKCkuY3JlYXRlUGF0aEVsZW1lbnQoKS5zZXRMb2NhdGlvbihnZW5zdHVicy5kZXN0ZGlyKTsKKworICAgICAgICBHcm9vdnljQWRhcHRlciBncm9vdnljID0gY3JlYXRlR3Jvb3Z5YygpOworICAgICAgICBncm9vdnljLmNsYXNzcGF0aCA9IGNsYXNzcGF0aDsKKyAgICAgICAgZ3Jvb3Z5Yy5zcmMgPSBzcmM7CisgICAgICAgIGdyb292eWMuZGVzdGRpciA9IGRlc3RkaXI7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gSEFDSzogRm9yIG5vdyBmb3JjZSBhbGwgY2xhc3NlcyB0byBjb21waWxlLCBzbyB3ZSBwaWNrIHVwIHN0dWIgY2hhbmdlcworICAgICAgICAvLworICAgICAgICBncm9vdnljLmZvcmNlID0gdHJ1ZTsKKyAgICAgICAgCisgICAgICAgIGZpbGVzZXQgPSBncm9vdnljLmdldEZpbGVTZXQoKTsKKyAgICAgICAgaWYgKCFmaWxlc2V0Lmhhc1BhdHRlcm5zKCkpIHsKKyAgICAgICAgICAgIGdyb292eWMuY3JlYXRlSW5jbHVkZSgpLnNldE5hbWUoIioqLyouZ3Jvb3Z5Iik7CisgICAgICAgIH0KKworICAgICAgICAvLyBJbnZva2UgZWFjaCB0YXNrIGluIHRoZSByaWdodCBvcmRlcgorICAgICAgICBnZW5zdHVicy5leGVjdXRlKCk7CisgICAgICAgIGphdmFjLmV4ZWN1dGUoKTsKKyAgICAgICAgZ3Jvb3Z5Yy5leGVjdXRlKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBGaWxlIGNyZWF0ZVRlbXBEaXIoKSAgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgRmlsZSBkaXIgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJncm9vdnktIiwgInN0dWJzIik7CisgICAgICAgICAgICBkaXIuZGVsZXRlKCk7CisgICAgICAgICAgICBkaXIubWtkaXJzKCk7CisgICAgICAgICAgICByZXR1cm4gZGlyOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLworICAgIC8vIE5lc3RlZCB0YXNrIGFkYXB0ZXJzCisgICAgLy8KKyAgICAKKyAgICBwcml2YXRlIGNsYXNzIEdlblN0dWJzQWRhcHRlcgorICAgICAgICBleHRlbmRzIEdlbmVyYXRlU3R1YnNUYXNrCisgICAgeworICAgICAgICBwdWJsaWMgRmlsZVNldCBnZXRGaWxlU2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldEltcGxpY2l0RmlsZVNldCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRUYXNrTmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBVYmVyQ29tcGlsZVRhc2sudGhpcy5nZXRUYXNrTmFtZSgpICsgIjpnZW5zdHVicyI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIEphdmFjQWRhcHRlcgorICAgICAgICBleHRlbmRzIEphdmFjCisgICAgeworICAgICAgICBwdWJsaWMgRmlsZVNldCBnZXRGaWxlU2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldEltcGxpY2l0RmlsZVNldCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRUYXNrTmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBVYmVyQ29tcGlsZVRhc2sudGhpcy5nZXRUYXNrTmFtZSgpICsgIjpqYXZhYyI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIEdyb292eWNBZGFwdGVyCisgICAgICAgIGV4dGVuZHMgR3Jvb3Z5Y1Rhc2sKKyAgICB7CisgICAgICAgIHB1YmxpYyBGaWxlU2V0IGdldEZpbGVTZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0SW1wbGljaXRGaWxlU2V0KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRhc2tOYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIFViZXJDb21waWxlVGFzay50aGlzLmdldFRhc2tOYW1lKCkgKyAiOmdyb292eWMiOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudC9WZXJpZnlDbGFzcy5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50L1ZlcmlmeUNsYXNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU0OTQ2OQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudC9WZXJpZnlDbGFzcy5qYXZhCkBAIC0wLDAgKzEsMTUyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5hbnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5NYXRjaGluZ1Rhc2s7CitpbXBvcnQgb3JnLm9iamVjdHdlYi5hc20uQ2xhc3NSZWFkZXI7CitpbXBvcnQgb3JnLm9iamVjdHdlYi5hc20uTGFiZWw7CitpbXBvcnQgb3JnLm9iamVjdHdlYi5hc20udHJlZS5BYnN0cmFjdEluc25Ob2RlOworaW1wb3J0IG9yZy5vYmplY3R3ZWIuYXNtLnRyZWUuQ2xhc3NOb2RlOworaW1wb3J0IG9yZy5vYmplY3R3ZWIuYXNtLnRyZWUuTWV0aG9kTm9kZTsKK2ltcG9ydCBvcmcub2JqZWN0d2ViLmFzbS50cmVlLmFuYWx5c2lzLkFuYWx5emVyOworaW1wb3J0IG9yZy5vYmplY3R3ZWIuYXNtLnRyZWUuYW5hbHlzaXMuRnJhbWU7CitpbXBvcnQgb3JnLm9iamVjdHdlYi5hc20udHJlZS5hbmFseXNpcy5TaW1wbGVWZXJpZmllcjsKK2ltcG9ydCBvcmcub2JqZWN0d2ViLmFzbS51dGlsLkNoZWNrQ2xhc3NBZGFwdGVyOworaW1wb3J0IG9yZy5vYmplY3R3ZWIuYXNtLnV0aWwuVHJhY2VNZXRob2RWaXNpdG9yOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogVmVyaWZ5IENsYXNzIGZpbGVzLiBUaGlzIHRhc2sgY2FuIHRha2UgdGhlIGZvbGxvd2luZworICogYXJndW1lbnRzOgorICogPHVsPgorICogPGxpPmRpcgorICogPC91bD4KKyAqIFdoZW4gdGhpcyB0YXNrIGV4ZWN1dGVzLCBpdCB3aWxsIHJlY3Vyc2l2ZWx5IHNjYW4gdGhlIGRpciBhbmQKKyAqIGxvb2sgZm9yIGNsYXNzIGZpbGVzIHRvIHZlcmlmeS4KKyAqLworcHVibGljIGNsYXNzIFZlcmlmeUNsYXNzIGV4dGVuZHMgTWF0Y2hpbmdUYXNrIHsKKyAgICBwcml2YXRlIFN0cmluZyB0b3BEaXIgPSBudWxsOworICAgIHByaXZhdGUgYm9vbGVhbiB2ZXJib3NlID0gZmFsc2U7CisKKyAgICBwdWJsaWMgVmVyaWZ5Q2xhc3MoKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICh0b3BEaXIgPT0gbnVsbCkgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJubyBkaXIgYXR0cmlidXRlIGlzIHNldCIpOworICAgICAgICBGaWxlIHRvcCA9IG5ldyBGaWxlKHRvcERpcik7CisgICAgICAgIGlmICghdG9wLmV4aXN0cygpKSB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInRoZSBkaXJlY3RvcnkgIiArIHRvcCArICIgZG9lcyBub3QgZXhpc3QiKTsKKyAgICAgICAgbG9nKCJ0b3AgZGlyIGlzICIgKyB0b3ApOworICAgICAgICBpbnQgZmFpbHMgPSBleGVjdXRlKHRvcCk7CisgICAgICAgIGlmIChmYWlscyA9PSAwKSB7CisgICAgICAgICAgICBsb2coIm5vIGJ5dGVjb2RlIHByb2JsZW1zIGZvdW5kIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsb2coImZvdW5kICIgKyBmYWlscyArICIgZmFpbGluZyBjbGFzc2VzIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREaXIoU3RyaW5nIGRpcikgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgdG9wRGlyID0gZGlyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFZlcmJvc2UoYm9vbGVhbiB2KSB7CisgICAgICAgIHZlcmJvc2UgPSB2OworICAgIH0KKworICAgIHByaXZhdGUgaW50IGV4ZWN1dGUoRmlsZSBkaXIpIHsKKyAgICAgICAgaW50IGZhaWxzID0gMDsKKyAgICAgICAgRmlsZVtdIGZpbGVzID0gZGlyLmxpc3RGaWxlcygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBGaWxlIGYgPSBmaWxlc1tpXTsKKyAgICAgICAgICAgIGlmIChmLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICBmYWlscyArPSBleGVjdXRlKGYpOworICAgICAgICAgICAgfSBlbHNlIGlmIChmLmdldE5hbWUoKS5lbmRzV2l0aCgiLmNsYXNzIikpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBib29sZWFuIG9rID0gcmVhZENsYXNzKGYuZ2V0Q2Fub25pY2FsUGF0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFvaykgZmFpbHMrKzsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKGlvZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oaW9lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhaWxzOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiByZWFkQ2xhc3MoU3RyaW5nIGNsYXp6KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBDbGFzc1JlYWRlciBjciA9IG5ldyBDbGFzc1JlYWRlcihuZXcgRmlsZUlucHV0U3RyZWFtKGNsYXp6KSk7CisgICAgICAgIENsYXNzTm9kZSBjYSA9IG5ldyBDbGFzc05vZGUoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdEVuZCgpIHsKKyAgICAgICAgICAgICAgICAvL2FjY2VwdChjdik7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIGNyLmFjY2VwdChuZXcgQ2hlY2tDbGFzc0FkYXB0ZXIoY2EpLCB0cnVlKTsKKyAgICAgICAgYm9vbGVhbiBmYWlsZWQgPSBmYWxzZTsKKworICAgICAgICBMaXN0IG1ldGhvZHMgPSBjYS5tZXRob2RzOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIE1ldGhvZE5vZGUgbWV0aG9kID0gKE1ldGhvZE5vZGUpIG1ldGhvZHMuZ2V0KGkpOworICAgICAgICAgICAgaWYgKG1ldGhvZC5pbnN0cnVjdGlvbnMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIEFuYWx5emVyIGEgPSBuZXcgQW5hbHl6ZXIobmV3IFNpbXBsZVZlcmlmaWVyKCkpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGEuYW5hbHl6ZShjYS5uYW1lLCBtZXRob2QpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaW5hbCBGcmFtZVtdIGZyYW1lcyA9IGEuZ2V0RnJhbWVzKCk7CisKKyAgICAgICAgICAgICAgICBpZiAoIWZhaWxlZCkgeworICAgICAgICAgICAgICAgICAgICBmYWlsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBsb2coInZlcmlmeWluZyBvZiBjbGFzcyAiICsgY2xhenogKyAiIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSkgbG9nKG1ldGhvZC5uYW1lICsgbWV0aG9kLmRlc2MpOworICAgICAgICAgICAgICAgIFRyYWNlTWV0aG9kVmlzaXRvciBtdiA9IG5ldyBUcmFjZU1ldGhvZFZpc2l0b3IobnVsbCkgeworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdE1heHMoaW50IG1heFN0YWNrLCBpbnQgbWF4TG9jYWxzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXh0LnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHMgPSBmcmFtZXNbaV0gPT0gbnVsbCA/ICJudWxsIiA6IGZyYW1lc1tpXS50b1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChzLmxlbmd0aCgpIDwgbWF4U3RhY2sgKyBtYXhMb2NhbHMgKyAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgKz0gIiAiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKEludGVnZXIudG9TdHJpbmcoaSArIDEwMDAwMCkuc3Vic3RyaW5nKDEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIgIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIgOiAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKHRleHQuZ2V0KGkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ZXJib3NlKSBsb2coYnVmZmVyLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG1ldGhvZC5pbnN0cnVjdGlvbnMuc2l6ZSgpOyArK2opIHsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGluc24gPSBtZXRob2QuaW5zdHJ1Y3Rpb25zLmdldChqKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluc24gaW5zdGFuY2VvZiBBYnN0cmFjdEluc25Ob2RlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAoKEFic3RyYWN0SW5zbk5vZGUpIGluc24pLmFjY2VwdChtdik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtdi52aXNpdExhYmVsKChMYWJlbCkgaW5zbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbXYudmlzaXRNYXhzKG1ldGhvZC5tYXhTdGFjaywgbWV0aG9kLm1heExvY2Fscyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICFmYWlsZWQ7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hbnQvcGFja2FnZS5odG1sIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50L3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTc4YTY4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50L3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDExIEBACis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPHRpdGxlPnBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5hbnQuKjwvdGl0bGU+CisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgPHA+CisgICAgICBBbnQgdGFza3MgZm9yIHdvcmtpbmcgd2l0aCBHcm9vdnkgLSBzdWNoIGFzIGdyb292eWMgZm9yIGNvbXBpbGluZyBHcm9vdnkgc291cmNlIGNvZGUgdG8KKyAgICAgIEphdmEgYnl0ZWNvZGUKKyAgICA8L3A+CisgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudGxpYi54bWwgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsaWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMzRlODQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsaWIueG1sCkBAIC0wLDAgKzEsNCBAQAorPGFudGxpYj4KKyAgICA8dGFza2RlZiBuYW1lPSJncm9vdnljIiBjbGFzc25hbWU9Im9yZy5jb2RlaGF1cy5ncm9vdnkuYW50Lkdyb292eWMiLz4KKyAgICA8dGFza2RlZiBuYW1lPSJncm9vdnkiICBjbGFzc25hbWU9Im9yZy5jb2RlaGF1cy5ncm9vdnkuYW50Lkdyb292eSIvPgorPC9hbnRsaWI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvQVNUUGFyc2VyRXhjZXB0aW9uLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci9BU1RQYXJzZXJFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODgwOTg2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvQVNUUGFyc2VyRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50bHI7CisKK2ltcG9ydCBhbnRsci5jb2xsZWN0aW9ucy5BU1Q7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXguUGFyc2VyRXhjZXB0aW9uOworCisvKioKKyAqIFRocm93biB3aGVuIHRyeWluZyB0byBwYXJzZSB0aGUgQVNUCisgKgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgQVNUUGFyc2VyRXhjZXB0aW9uIGV4dGVuZHMgUGFyc2VyRXhjZXB0aW9uIHsKKyAgICBwcml2YXRlIGZpbmFsIEFTVCBhc3Q7CisKKyAgICBwdWJsaWMgQVNUUGFyc2VyRXhjZXB0aW9uKEFTVFJ1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICBzdXBlcihlLmdldE1lc3NhZ2UoKSwgZSwgZS5nZXRMaW5lKCksIGUuZ2V0Q29sdW1uKCkpOworICAgICAgICB0aGlzLmFzdCA9IGUuZ2V0QXN0KCk7CisgICAgfQorCisgICAgcHVibGljIEFTVFBhcnNlckV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgQVNUUnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHN1cGVyKG1lc3NhZ2UsIGUsIGUuZ2V0TGluZSgpLCBlLmdldENvbHVtbigpKTsKKyAgICAgICAgdGhpcy5hc3QgPSBlLmdldEFzdCgpOworICAgIH0KKworICAgIHB1YmxpYyBBU1QgZ2V0QXN0KCkgeworICAgICAgICByZXR1cm4gYXN0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudGxyL0FTVFJ1bnRpbWVFeGNlcHRpb24uamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudGxyL0FTVFJ1bnRpbWVFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzc5ZWZhCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvQVNUUnVudGltZUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudGxyOworCitpbXBvcnQgYW50bHIuY29sbGVjdGlvbnMuQVNUOworCisvKioKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBwcm90aXF1ZS5jb20iPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgQVNUUnVudGltZUV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24geworICAgIHByaXZhdGUgZmluYWwgQVNUIGFzdDsKKworICAgIHB1YmxpYyBBU1RSdW50aW1lRXhjZXB0aW9uKEFTVCBhc3QsIFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIHN1cGVyKG1lc3NhZ2UgKyBkZXNjcmlwdGlvbihhc3QpKTsKKyAgICAgICAgdGhpcy5hc3QgPSBhc3Q7CisgICAgfQorCisgICAgcHVibGljIEFTVFJ1bnRpbWVFeGNlcHRpb24oQVNUIGFzdCwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0aHJvd2FibGUpIHsKKyAgICAgICAgc3VwZXIobWVzc2FnZSArIGRlc2NyaXB0aW9uKGFzdCksIHRocm93YWJsZSk7CisgICAgICAgIHRoaXMuYXN0ID0gbnVsbDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBkZXNjcmlwdGlvbihBU1Qgbm9kZSkgeworICAgICAgICByZXR1cm4gKG5vZGUgIT0gbnVsbCkgPyAiIGF0IGxpbmU6ICIgKyBub2RlLmdldExpbmUoKSArICIgY29sdW1uOiAiICsgbm9kZS5nZXRDb2x1bW4oKSA6ICIiOworICAgIH0KKworICAgIHB1YmxpYyBBU1QgZ2V0QXN0KCkgeworICAgICAgICByZXR1cm4gYXN0OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0TGluZSgpIHsKKyAgICAgICAgcmV0dXJuIGFzdCAhPSBudWxsID8gYXN0LmdldExpbmUoKSA6IC0xOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0Q29sdW1uKCkgeworICAgICAgICByZXR1cm4gYXN0ICE9IG51bGwgPyBhc3QuZ2V0Q29sdW1uKCkgOiAtMTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudGxyL0FudGxyQVNUUHJvY2Vzc1NuaXBwZXRzLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci9BbnRsckFTVFByb2Nlc3NTbmlwcGV0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNjY3Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci9BbnRsckFTVFByb2Nlc3NTbmlwcGV0cy5qYXZhCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudGxyOworCisvKioKKyAqIFByb2Nlc3MgdG8gZGVjb3JhdGUgYW50bHIgQVNUIHdpdGggZW5kaW5nIGxpbmUvY29sIGluZm8sIGFuZCBpZgorICogcG9zc2libGUgdGhlIHNuaXBwcGV0IG9mIHNvdXJjZSBmcm9tIHRoZSBzdGFydC9lbmQgbGluZS9jb2wgZm9yIGVhY2ggbm9kZS4KKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpncm9vdnlAcm9zcy1yYXluZXIuY29tIj5KZXJlbXkgUmF5bmVyPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCisKK2ltcG9ydCBhbnRsci5jb2xsZWN0aW9ucy5BU1Q7CitpbXBvcnQgamF2YS51dGlsLio7CisKK3B1YmxpYyBjbGFzcyBBbnRsckFTVFByb2Nlc3NTbmlwcGV0cyBpbXBsZW1lbnRzIEFudGxyQVNUUHJvY2Vzc29yeworICAgIHByaXZhdGUgZmluYWwgU291cmNlQnVmZmVyIHNvdXJjZUJ1ZmZlcjsKKworICAgIHB1YmxpYyBBbnRsckFTVFByb2Nlc3NTbmlwcGV0cyhTb3VyY2VCdWZmZXIgc291cmNlQnVmZmVyKSB7CisgICAgICAgIHRoaXMuc291cmNlQnVmZmVyID0gc291cmNlQnVmZmVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIGRlY29yYXRlIGFudGxyIEFTVCB3aXRoIGVuZGluZyBsaW5lL2NvbCBpbmZvLCBhbmQgaWYKKyAgICAgKiBwb3NzaWJsZSB0aGUgc25pcHBwZXQgb2Ygc291cmNlIGZyb20gdGhlIHN0YXJ0L2VuZCBsaW5lL2NvbCBmb3IgZWFjaCBub2RlLgorICAgICAqIEBwYXJhbSB0IHRoZSBBU1QgdG8gZGVjb3JhdGUKKyAgICAgKiBAcmV0dXJuIHRoZSBkZWNvcmF0ZWQgQVNUCisgICAgICovCisgICAgcHVibGljIEFTVCBwcm9jZXNzKEFTVCB0KSB7CisgICAgICAgIC8vIGZpcnN0IHZpc2l0CisgICAgICAgIExpc3QgbCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgdCA9IHRyYXZlcnNlKChHcm9vdnlTb3VyY2VBU1QpdCxsLG51bGwpOworCisgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJsOiIgKyBsKTsKKyAgICAgICAgLy8gc2Vjb25kIHZpc2l0CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGwuaXRlcmF0b3IoKTsKKyAgICAgICAgaWYgKGl0ci5oYXNOZXh0KCkpIHsgaXRyLm5leHQoKTsgLyogZGlzY2FyZCBmaXJzdCAqLyB9CisgICAgICAgIHQgPSB0cmF2ZXJzZSgoR3Jvb3Z5U291cmNlQVNUKXQsbnVsbCxpdHIpOworICAgICAgICByZXR1cm4gdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0cmF2ZXJzZSBhbiBBU1Qgbm9kZQorICAgICAqIEBwYXJhbSB0IHRoZSBBU1Qgbm9kZSB0byB0cmF2ZXJzZQorICAgICAqIEBwYXJhbSBsIEEgbGlzdCB0byBhZGQgbGluZS9jb2wgaW5mbyB0bworICAgICAqIEBwYXJhbSBpdHIgQW4gaXRlcmF0b3Igb3ZlciBhIGxpc3Qgb2YgbGluZS9jb2wKKyAgICAgKiBAcmV0dXJuIEEgZGVjb3JhdGVkIEFTVCBub2RlCisgICAgICovCisgICAgcHJpdmF0ZSBBU1QgdHJhdmVyc2UoR3Jvb3Z5U291cmNlQVNUIHQsTGlzdCBsLEl0ZXJhdG9yIGl0cikgeworICAgICAgICBpZiAodCA9PSBudWxsKSB7IHJldHVybiB0OyB9CisKKyAgICAgICAgLy8gZmlyc3QgdmlzaXQgb2Ygbm9kZQorICAgICAgICBpZiAobCAhPSBudWxsKSB7CisgICAgICAgICAgICBsLmFkZChuZXcgTGluZUNvbHVtbih0LmdldExpbmUoKSx0LmdldENvbHVtbigpKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBzZWNvbmQgdmlzdCBvZiBub2RlCisgICAgICAgIGlmIChpdHIgIT0gbnVsbCAmJiBpdHIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBMaW5lQ29sdW1uIGxjID0gKExpbmVDb2x1bW4paXRyLm5leHQoKTsKKyAgICAgICAgICAgIGlmICh0LmdldExpbmVMYXN0KCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGludCBuZXh0TGluZSA9IGxjLmdldExpbmUoKTsKKyAgICAgICAgICAgICAgICBpbnQgbmV4dENvbHVtbiA9IGxjLmdldENvbHVtbigpOworICAgICAgICAgICAgICAgIGlmIChuZXh0TGluZSA8IHQuZ2V0TGluZSgpIHx8IChuZXh0TGluZSA9PSB0LmdldExpbmUoKSAmJiBuZXh0Q29sdW1uIDwgdC5nZXRDb2x1bW4oKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbmV4dExpbmUgPSB0LmdldExpbmUoKTsKKyAgICAgICAgICAgICAgICAgICAgbmV4dENvbHVtbiA9IHQuZ2V0Q29sdW1uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHQuc2V0TGluZUxhc3QobmV4dExpbmUpOworICAgICAgICAgICAgICAgIHQuc2V0Q29sdW1uTGFzdChuZXh0Q29sdW1uKTsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgZ29vZCBwb2ludCB0byBjYWxsIHQuc2V0U25pcHBldCgpLAorICAgICAgICAgICAgICAgIC8vIGJ1dCBpdCBidWxrcyB1cCB0aGUgQVNUIHRvbyBtdWNoIGZvciBwcm9kdWN0aW9uIGNvZGUuCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBHcm9vdnlTb3VyY2VBU1QgY2hpbGQgPSAoR3Jvb3Z5U291cmNlQVNUKXQuZ2V0Rmlyc3RDaGlsZCgpOworICAgICAgICBpZiAoY2hpbGQgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJhdmVyc2UoY2hpbGQsbCxpdHIpOworICAgICAgICB9CisKKyAgICAgICAgR3Jvb3Z5U291cmNlQVNUIHNpYmxpbmcgPSAoR3Jvb3Z5U291cmNlQVNUKXQuZ2V0TmV4dFNpYmxpbmcoKTsKKyAgICAgICAgaWYgKHNpYmxpbmcgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJhdmVyc2Uoc2libGluZyxsLGl0cik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci9BbnRsckFTVFByb2Nlc3Nvci5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvQW50bHJBU1RQcm9jZXNzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDJhN2NmCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvQW50bHJBU1RQcm9jZXNzb3IuamF2YQpAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudGxyOworCitpbXBvcnQgYW50bHIuY29sbGVjdGlvbnMuQVNUOworCisvKioKKyAqIEFuIGludGVyZmFjZSBmb3IgcHJvY2Vzc2luZyBhbnRsciBBU1Qgb2JqZWN0cworICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmdyb292eUByb3NzLXJheW5lci5jb20iPkplcmVteSBSYXluZXI8L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQW50bHJBU1RQcm9jZXNzb3IgeworICAgIC8qKgorICAgICAqIHBlcmZvcm1zIHNvbWUgcHJvY2Vzc2luZyBvbiB0aGUgc3VwcGxpZWQgQVNUIG5vZGUuCisgICAgICogQHBhcmFtIHQgdGhlIEFTVCBub2RlIHRvIHByb2Nlc3MuCisgICAgICogQHJldHVybiBwb3NzaWJseSByZXR1cm5zIHRoZSBBU1QgbW9kaWZpZWQgb3IgbnVsbCwgZGVwZW5kcyBvbiB0aGUgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgQVNUIHByb2Nlc3MoQVNUIHQpOworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvQW50bHJQYXJzZXJQbHVnaW4uamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudGxyL0FudGxyUGFyc2VyUGx1Z2luLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNjMTIxMAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudGxyL0FudGxyUGFyc2VyUGx1Z2luLmphdmEKQEAgLTAsMCArMSwyNTY3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5hbnRscjsKKworaW1wb3J0IGFudGxyLlJlY29nbml0aW9uRXhjZXB0aW9uOworaW1wb3J0IGFudGxyLlRva2VuU3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IGFudGxyLlRva2VuU3RyZWFtUmVjb2duaXRpb25FeGNlcHRpb247CitpbXBvcnQgYW50bHIuY29sbGVjdGlvbnMuQVNUOworaW1wb3J0IGNvbS50aG91Z2h0d29ya3MueHN0cmVhbS5YU3RyZWFtOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuR3Jvb3Z5QnVnRXJyb3I7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hbnRsci5wYXJzZXIuR3Jvb3Z5TGV4ZXI7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hbnRsci5wYXJzZXIuR3Jvb3Z5UmVjb2duaXplcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudGxyLnBhcnNlci5Hcm9vdnlUb2tlblR5cGVzOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50bHIudHJlZXdhbGtlci4qOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0Lio7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuZXhwci4qOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuKjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLlBhcnNlclBsdWdpbjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuU291cmNlVW5pdDsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC4qOworaW1wb3J0IG9yZy5vYmplY3R3ZWIuYXNtLk9wY29kZXM7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBBIHBhcnNlciBwbHVnaW4gd2hpY2ggYWRhcHRzIHRoZSBKU1IgQW50bHIgUGFyc2VyIHRvIHRoZSBHcm9vdnkgcnVudGltZQorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBwcm90aXF1ZS5jb20iPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgQW50bHJQYXJzZXJQbHVnaW4gZXh0ZW5kcyBBU1RIZWxwZXIgaW1wbGVtZW50cyBQYXJzZXJQbHVnaW4sIEdyb292eVRva2VuVHlwZXMgeworCisgICAgcHJpdmF0ZSBBU1QgYXN0OworICAgIHByaXZhdGUgQ2xhc3NOb2RlIGNsYXNzTm9kZTsKKyAgICBwcml2YXRlIFN0cmluZ1tdIHRva2VuTmFtZXM7CisKKworICAgIHB1YmxpYyBSZWR1Y3Rpb24gcGFyc2VDU1QoZmluYWwgU291cmNlVW5pdCBzb3VyY2VVbml0LCBSZWFkZXIgcmVhZGVyKSB0aHJvd3MgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24geworICAgICAgICBhc3QgPSBudWxsOworCisgICAgICAgIHNldENvbnRyb2xsZXIoc291cmNlVW5pdCk7CisKKyAgICAgICAgZmluYWwgU291cmNlQnVmZmVyIHNvdXJjZUJ1ZmZlciA9IG5ldyBTb3VyY2VCdWZmZXIoKTsKKyAgICAgICAgVW5pY29kZUVzY2FwaW5nUmVhZGVyIHVuaWNvZGVSZWFkZXIgPSBuZXcgVW5pY29kZUVzY2FwaW5nUmVhZGVyKHJlYWRlcixzb3VyY2VCdWZmZXIpOworICAgICAgICBHcm9vdnlMZXhlciBsZXhlciA9IG5ldyBHcm9vdnlMZXhlcih1bmljb2RlUmVhZGVyKTsKKyAgICAgICAgdW5pY29kZVJlYWRlci5zZXRMZXhlcihsZXhlcik7CisgICAgICAgIEdyb292eVJlY29nbml6ZXIgcGFyc2VyID0gR3Jvb3Z5UmVjb2duaXplci5tYWtlKGxleGVyKTsKKyAgICAgICAgcGFyc2VyLnNldFNvdXJjZUJ1ZmZlcihzb3VyY2VCdWZmZXIpOworICAgICAgICB0b2tlbk5hbWVzID0gcGFyc2VyLmdldFRva2VuTmFtZXMoKTsKKyAgICAgICAgcGFyc2VyLnNldEZpbGVuYW1lKHNvdXJjZVVuaXQuZ2V0TmFtZSgpKTsKKworICAgICAgICAvLyBzdGFydCBwYXJzaW5nIGF0IHRoZSBjb21waWxhdGlvblVuaXQgcnVsZQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcGFyc2VyLmNvbXBpbGF0aW9uVW5pdCgpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChUb2tlblN0cmVhbVJlY29nbml0aW9uRXhjZXB0aW9uIHRzcmUpIHsKKyAgICAgICAgICAgIFJlY29nbml0aW9uRXhjZXB0aW9uIGUgPSB0c3JlLnJlY29nOworICAgICAgICAgICAgU3ludGF4RXhjZXB0aW9uIHNlID0gbmV3IFN5bnRheEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSxlLGUuZ2V0TGluZSgpLGUuZ2V0Q29sdW1uKCkpOworICAgICAgICAgICAgc2Uuc2V0RmF0YWwodHJ1ZSk7CisgICAgICAgICAgICBzb3VyY2VVbml0LmFkZEVycm9yKHNlKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3ludGF4RXhjZXB0aW9uIHNlID0gbmV3IFN5bnRheEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSxlLGUuZ2V0TGluZSgpLGUuZ2V0Q29sdW1uKCkpOworICAgICAgICAgICAgc2Uuc2V0RmF0YWwodHJ1ZSk7CisgICAgICAgICAgICBzb3VyY2VVbml0LmFkZEVycm9yKHNlKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoVG9rZW5TdHJlYW1FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgc291cmNlVW5pdC5hZGRFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKworICAgICAgICBhc3QgPSBwYXJzZXIuZ2V0QVNUKCk7CisKKyAgICAgICAgQW50bHJBU1RQcm9jZXNzb3Igc25pcHBldHMgPSBuZXcgQW50bHJBU1RQcm9jZXNzU25pcHBldHMoc291cmNlQnVmZmVyKTsKKyAgICAgICAgYXN0ID0gc25pcHBldHMucHJvY2Vzcyhhc3QpOworICAgICAgICAKKyAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7CisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKKyAgICAgICAgICAgIAlvdXRwdXRBU1RJblZhcmlvdXNGb3Jtc0lmTmVlZGVkKHNvdXJjZVVuaXQsIHNvdXJjZUJ1ZmZlcik7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIG51bGw7IC8vbmV3IFJlZHVjdGlvbihUcGtlbi5FT0YpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBvdXRwdXRBU1RJblZhcmlvdXNGb3Jtc0lmTmVlZGVkKFNvdXJjZVVuaXQgc291cmNlVW5pdCwgU291cmNlQnVmZmVyIHNvdXJjZUJ1ZmZlcikgeworICAgICAgICAvLyBzdHJhaWdodCB4c3RyZWFtIG91dHB1dCBvZiBBU1QKKyAgICAgICAgaWYgKCJ4bWwiLmVxdWFscyhTeXN0ZW0uZ2V0UHJvcGVydHkoImFudGxyLmFzdCIpKSkgeworICAgICAgICAgICAgc2F2ZUFzWE1MKHNvdXJjZVVuaXQuZ2V0TmFtZSgpLCBhc3QpOworICAgICAgICB9CisKKyAgICAgICAgLy8gJ3ByZXR0eSBwcmludGVyJyBvdXRwdXQgb2YgQVNUCisgICAgICAgIGlmICgiZ3Jvb3Z5Ii5lcXVhbHMoU3lzdGVtLmdldFByb3BlcnR5KCJhbnRsci5hc3QiKSkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgUHJpbnRTdHJlYW0gb3V0ID0gbmV3IFByaW50U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHNvdXJjZVVuaXQuZ2V0TmFtZSgpICsgIi5wcmV0dHkuZ3Jvb3Z5IikpOworICAgICAgICAgICAgICAgIFZpc2l0b3IgdmlzaXRvciA9IG5ldyBTb3VyY2VQcmludGVyKG91dCx0b2tlbk5hbWVzKTsKKyAgICAgICAgICAgICAgICBBbnRsckFTVFByb2Nlc3NvciB0cmVld2Fsa2VyID0gbmV3IFNvdXJjZUNvZGVUcmF2ZXJzYWwodmlzaXRvcik7CisgICAgICAgICAgICAgICAgdHJlZXdhbGtlci5wcm9jZXNzKGFzdCk7CisgICAgICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2Fubm90IGNyZWF0ZSAiICsgc291cmNlVW5pdC5nZXROYW1lKCkgKyAiLnByZXR0eS5ncm9vdnkiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIG91dHB1dCBBU1QgaW4gZm9ybWF0IHN1aXRhYmxlIGZvciBvcGVuaW5nIGluIGh0dHA6Ly9mcmVlbWluZC5zb3VyY2Vmb3JnZS5uZXQKKyAgICAgICAgLy8gd2hpY2ggaXMgYSByZWFsbHkgbmljZSB3YXkgb2Ygc2VlaW5nIHRoZSBBU1QsIGZvbGRpbmcgbm9kZXMgZXRjCisgICAgICAgIGlmICgibWluZG1hcCIuZXF1YWxzKFN5c3RlbS5nZXRQcm9wZXJ0eSgiYW50bHIuYXN0IikpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFByaW50U3RyZWFtIG91dCA9IG5ldyBQcmludFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShzb3VyY2VVbml0LmdldE5hbWUoKSArICIubW0iKSk7CisgICAgICAgICAgICAgICAgVmlzaXRvciB2aXNpdG9yID0gbmV3IE1pbmRNYXBQcmludGVyKG91dCx0b2tlbk5hbWVzKTsKKyAgICAgICAgICAgICAgICBBbnRsckFTVFByb2Nlc3NvciB0cmVld2Fsa2VyID0gbmV3IFByZU9yZGVyVHJhdmVyc2FsKHZpc2l0b3IpOworICAgICAgICAgICAgICAgIHRyZWV3YWxrZXIucHJvY2Vzcyhhc3QpOworICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNhbm5vdCBjcmVhdGUgIiArIHNvdXJjZVVuaXQuZ2V0TmFtZSgpICsgIi5tbSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gaW5jbHVkZSBvcmlnaW5hbCBsaW5lL2NvbCBpbmZvIGFuZCBzb3VyY2UgY29kZSBvbiB0aGUgbWluZG1hcCBvdXRwdXQKKyAgICAgICAgaWYgKCJleHRlbmRlZE1pbmRtYXAiLmVxdWFscyhTeXN0ZW0uZ2V0UHJvcGVydHkoImFudGxyLmFzdCIpKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBQcmludFN0cmVhbSBvdXQgPSBuZXcgUHJpbnRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oc291cmNlVW5pdC5nZXROYW1lKCkgKyAiLm1tIikpOworICAgICAgICAgICAgICAgIFZpc2l0b3IgdmlzaXRvciA9IG5ldyBNaW5kTWFwUHJpbnRlcihvdXQsdG9rZW5OYW1lcyxzb3VyY2VCdWZmZXIpOworICAgICAgICAgICAgICAgIEFudGxyQVNUUHJvY2Vzc29yIHRyZWV3YWxrZXIgPSBuZXcgUHJlT3JkZXJUcmF2ZXJzYWwodmlzaXRvcik7CisgICAgICAgICAgICAgICAgdHJlZXdhbGtlci5wcm9jZXNzKGFzdCk7CisgICAgICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2Fubm90IGNyZWF0ZSAiICsgc291cmNlVW5pdC5nZXROYW1lKCkgKyAiLm1tIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBodG1sIG91dHB1dCBvZiBBU1QKKyAgICAgICAgaWYgKCJodG1sIi5lcXVhbHMoU3lzdGVtLmdldFByb3BlcnR5KCJhbnRsci5hc3QiKSkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgUHJpbnRTdHJlYW0gb3V0ID0gbmV3IFByaW50U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHNvdXJjZVVuaXQuZ2V0TmFtZSgpICsgIi5odG1sIikpOworICAgICAgICAgICAgICAgIExpc3QgdiA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgICAgICB2LmFkZChuZXcgTm9kZUFzSFRNTFByaW50ZXIob3V0LHRva2VuTmFtZXMpKTsKKyAgICAgICAgICAgICAgICB2LmFkZChuZXcgU291cmNlUHJpbnRlcihvdXQsdG9rZW5OYW1lcykpOworICAgICAgICAgICAgICAgIFZpc2l0b3IgdmlzaXRvcnMgPSBuZXcgQ29tcG9zaXRlVmlzaXRvcih2KTsKKyAgICAgICAgICAgICAgICBBbnRsckFTVFByb2Nlc3NvciB0cmVld2Fsa2VyID0gbmV3IFNvdXJjZUNvZGVUcmF2ZXJzYWwodmlzaXRvcnMpOworICAgICAgICAgICAgICAgIHRyZWV3YWxrZXIucHJvY2Vzcyhhc3QpOworICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNhbm5vdCBjcmVhdGUgIiArIHNvdXJjZVVuaXQuZ2V0TmFtZSgpICsgIi5odG1sIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNhdmVBc1hNTChTdHJpbmcgbmFtZSwgQVNUIGFzdCkgeworICAgICAgICBYU3RyZWFtIHhzdHJlYW0gPSBuZXcgWFN0cmVhbSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgeHN0cmVhbS50b1hNTChhc3QsIG5ldyBGaWxlV3JpdGVyKG5hbWUgKyAiLmFudGxyLnhtbCIpKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV3JpdHRlbiBBU1QgdG8gIiArIG5hbWUgKyAiLmFudGxyLnhtbCIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb3VsZG4ndCB3cml0ZSB0byAiICsgbmFtZSArICIuYW50bHIueG1sIik7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIE1vZHVsZU5vZGUgYnVpbGRBU1QoU291cmNlVW5pdCBzb3VyY2VVbml0LCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciwgUmVkdWN0aW9uIGNzdCkgdGhyb3dzIFBhcnNlckV4Y2VwdGlvbiB7CisgICAgICAgIHNldENsYXNzTG9hZGVyKGNsYXNzTG9hZGVyKTsKKyAgICAgICAgbWFrZU1vZHVsZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY29udmVydEdyb292eShhc3QpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChBU1RSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBU1RQYXJzZXJFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkgKyAiLiBGaWxlOiAiICsgc291cmNlVW5pdC5nZXROYW1lKCksIGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBvdXRwdXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydHMgdGhlIEFudGxyIEFTVCB0byB0aGUgR3Jvb3Z5IEFTVAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNvbnZlcnRHcm9vdnkoQVNUIG5vZGUpIHsKKyAgICAgICAgd2hpbGUgKG5vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgaW50IHR5cGUgPSBub2RlLmdldFR5cGUoKTsKKyAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgUEFDS0FHRV9ERUY6CisgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VEZWYobm9kZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBTVEFUSUNfSU1QT1JUOgorICAgICAgICAgICAgICAgIGNhc2UgSU1QT1JUOgorICAgICAgICAgICAgICAgICAgICBpbXBvcnREZWYobm9kZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBDTEFTU19ERUY6CisgICAgICAgICAgICAgICAgICAgIGNsYXNzRGVmKG5vZGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgSU5URVJGQUNFX0RFRjoKKyAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlRGVmKG5vZGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTUVUSE9EX0RFRjoKKyAgICAgICAgICAgICAgICAgICAgbWV0aG9kRGVmKG5vZGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgY2FzZSBFTlVNX0RFRjoKKyAgICAgICAgICAgICAgICAgICAgZW51bURlZihub2RlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gc3RhdGVtZW50KG5vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmFkZFN0YXRlbWVudChzdGF0ZW1lbnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVG9wIGxldmVsIGNvbnRyb2wgc3RydWN0dXJlcworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgcHJvdGVjdGVkIHZvaWQgcGFja2FnZURlZihBU1QgcGFja2FnZURlZikgeworICAgICAgICBBU1Qgbm9kZSA9IHBhY2thZ2VEZWYuZ2V0Rmlyc3RDaGlsZCgpOworICAgICAgICBpZiAoaXNUeXBlKEFOTk9UQVRJT05TLCBub2RlKSkgeworICAgICAgICAgICAgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgbmFtZSA9IHF1YWxpZmllZE5hbWUobm9kZSk7CisgICAgICAgIHNldFBhY2thZ2VOYW1lKG5hbWUpOworICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgdm9pZCBpbXBvcnREZWYoQVNUIGltcG9ydE5vZGUpIHsKKyAgICAgICAgYm9vbGVhbiBpc1N0YXRpYyA9IGltcG9ydE5vZGUuZ2V0VHlwZSgpID09IFNUQVRJQ19JTVBPUlQ7CisKKyAgICAgICAgQVNUIG5vZGUgPSBpbXBvcnROb2RlLmdldEZpcnN0Q2hpbGQoKTsKKworICAgICAgICBTdHJpbmcgYWxpYXMgPSBudWxsOworICAgICAgICBpZiAoaXNUeXBlKExJVEVSQUxfYXMsIG5vZGUpKSB7CisgICAgICAgICAgICAvL2ltcG9ydCBpcyBsaWtlICJpbXBvcnQgRm9vIGFzIEJhciIKKyAgICAgICAgICAgIG5vZGUgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKKyAgICAgICAgICAgIEFTVCBhbGlhc05vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7CisgICAgICAgICAgICBhbGlhcyA9IGlkZW50aWZpZXIoYWxpYXNOb2RlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChub2RlLmdldE51bWJlck9mQ2hpbGRyZW4oKT09MCkgeworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBpZGVudGlmaWVyKG5vZGUpOworICAgICAgICAgICAgLy8gaW1wb3J0IGlzIGxpa2UgICJpbXBvcnQgRm9vIgorICAgICAgICAgICAgQ2xhc3NOb2RlIHR5cGUgPSBDbGFzc0hlbHBlci5tYWtlKG5hbWUpOworICAgICAgICAgICAgY29uZmlndXJlQVNUKHR5cGUsaW1wb3J0Tm9kZSk7CisgICAgICAgICAgICBpbXBvcnRDbGFzcyh0eXBlLCBuYW1lLCBhbGlhcyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBBU1QgcGFja2FnZU5vZGUgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKKyAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gcXVhbGlmaWVkTmFtZShwYWNrYWdlTm9kZSk7CisgICAgICAgIEFTVCBuYW1lTm9kZSA9IHBhY2thZ2VOb2RlLmdldE5leHRTaWJsaW5nKCk7CisgICAgICAgIGlmIChpc1R5cGUoU1RBUiwgbmFtZU5vZGUpKSB7CisgICAgICAgICAgICBpZiAoaXNTdGF0aWMpIHsKKyAgICAgICAgICAgICAgICAvLyBpbXBvcnQgaXMgbGlrZSAiaW1wb3J0IHN0YXRpYyBmb28uQmFyLioiCisgICAgICAgICAgICAgICAgLy8gcGFja2FnZU5hbWUgaXMgYWN0dWFsbHkgYSBjbGFzc05hbWUgaW4gdGhpcyBjYXNlCisgICAgICAgICAgICAgICAgQ2xhc3NOb2RlIHR5cGUgPSBDbGFzc0hlbHBlci5tYWtlKHBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgICAgICBjb25maWd1cmVBU1QodHlwZSwgaW1wb3J0Tm9kZSk7CisgICAgICAgICAgICAgICAgc3RhdGljSW1wb3J0Q2xhc3NXaXRoU3Rhcih0eXBlLCBwYWNrYWdlTmFtZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGltcG9ydCBpcyBsaWtlICJpbXBvcnQgZm9vLioiCisgICAgICAgICAgICAgICAgaW1wb3J0UGFja2FnZVdpdGhTdGFyKHBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGFsaWFzIT1udWxsKSB0aHJvdyBuZXcgR3Jvb3Z5QnVnRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICJpbXBvcnRzIGxpa2UgJ2ltcG9ydCBmb28uKiBhcyBCYXInIGFyZSBub3QgIisKKyAgICAgICAgICAgICAgICAgICAgInN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGNhdWdodCBieSB0aGUgZ3JhbW1hciIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBpZGVudGlmaWVyKG5hbWVOb2RlKTsKKyAgICAgICAgICAgIGlmIChpc1N0YXRpYykgeworICAgICAgICAgICAgICAgIC8vIGltcG9ydCBpcyBsaWtlICJpbXBvcnQgc3RhdGljIGZvby5CYXIubWV0aG9kIgorICAgICAgICAgICAgICAgIC8vIHBhY2thZ2VOYW1lIGlzIHJlYWxseSBjbGFzcyBuYW1lIGluIHRoaXMgY2FzZQorICAgICAgICAgICAgICAgIENsYXNzTm9kZSB0eXBlID0gQ2xhc3NIZWxwZXIubWFrZShwYWNrYWdlTmFtZSk7CisgICAgICAgICAgICAgICAgY29uZmlndXJlQVNUKHR5cGUsIGltcG9ydE5vZGUpOworICAgICAgICAgICAgICAgIHN0YXRpY0ltcG9ydE1ldGhvZE9yRmllbGQodHlwZSwgbmFtZSwgYWxpYXMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBpbXBvcnQgaXMgbGlrZSAiaW1wb3J0IGZvby5CYXIiCisgICAgICAgICAgICAgICAgQ2xhc3NOb2RlIHR5cGUgPSBDbGFzc0hlbHBlci5tYWtlKHBhY2thZ2VOYW1lKyIuIituYW1lKTsKKyAgICAgICAgICAgICAgICBjb25maWd1cmVBU1QodHlwZSwgaW1wb3J0Tm9kZSk7CisgICAgICAgICAgICAgICAgaW1wb3J0Q2xhc3ModHlwZSwgbmFtZSwgYWxpYXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgaW50ZXJmYWNlRGVmKEFTVCBjbGFzc0RlZikgeworICAgICAgICBMaXN0IGFubm90YXRpb25zID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBBU1Qgbm9kZSA9IGNsYXNzRGVmLmdldEZpcnN0Q2hpbGQoKTsKKyAgICAgICAgaW50IG1vZGlmaWVycyA9IE9wY29kZXMuQUNDX1BVQkxJQzsKKyAgICAgICAgaWYgKGlzVHlwZShNT0RJRklFUlMsIG5vZGUpKSB7CisgICAgICAgICAgICBtb2RpZmllcnMgPSBtb2RpZmllcnMobm9kZSwgYW5ub3RhdGlvbnMsIG1vZGlmaWVycyk7CisgICAgICAgICAgICBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpOworICAgICAgICB9CisgICAgICAgIG1vZGlmaWVycyB8PSBPcGNvZGVzLkFDQ19BQlNUUkFDVCB8IE9wY29kZXMuQUNDX0lOVEVSRkFDRTsKKworICAgICAgICBTdHJpbmcgbmFtZSA9IGlkZW50aWZpZXIobm9kZSk7CisgICAgICAgIG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7CisgICAgICAgIENsYXNzTm9kZSBzdXBlckNsYXNzID0gQ2xhc3NIZWxwZXIuT0JKRUNUX1RZUEU7CisKKyAgICAgICAgR2VuZXJpY3NUeXBlW10gZ2VuZXJpY3NUeXBlID0gbnVsbDsKKyAgICAgICAgaWYgKGlzVHlwZShUWVBFX1BBUkFNRVRFUlMsbm9kZSkpIHsKKyAgICAgICAgICAgIGdlbmVyaWNzVHlwZSA9IG1ha2VHZW5lcmljc1R5cGUobm9kZSk7CisgICAgICAgICAgICBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBDbGFzc05vZGVbXSBpbnRlcmZhY2VzID0gQ2xhc3NOb2RlLkVNUFRZX0FSUkFZOworICAgICAgICBpZiAoaXNUeXBlKEVYVEVORFNfQ0xBVVNFLCBub2RlKSkgeworICAgICAgICAgICAgaW50ZXJmYWNlcyA9IGludGVyZmFjZXMobm9kZSk7CisgICAgICAgICAgICBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpOworICAgICAgICB9CisKKyAgICAgICAgYWRkTmV3Q2xhc3NOYW1lKG5hbWUpOworICAgICAgICBjbGFzc05vZGUgPSBuZXcgQ2xhc3NOb2RlKGRvdChnZXRQYWNrYWdlTmFtZSgpLCBuYW1lKSwgbW9kaWZpZXJzLCBzdXBlckNsYXNzLCBpbnRlcmZhY2VzLCBudWxsKTsKKyAgICAgICAgY2xhc3NOb2RlLmFkZEFubm90YXRpb25zKGFubm90YXRpb25zKTsKKyAgICAgICAgY2xhc3NOb2RlLnNldEdlbmVyaWNzVHlwZXMoZ2VuZXJpY3NUeXBlKTsKKyAgICAgICAgY29uZmlndXJlQVNUKGNsYXNzTm9kZSwgY2xhc3NEZWYpOworCisgICAgICAgIGFzc2VydE5vZGVUeXBlKE9CSkJMT0NLLCBub2RlKTsKKyAgICAgICAgb2JqZWN0QmxvY2sobm9kZSk7CisgICAgICAgIG91dHB1dC5hZGRDbGFzcyhjbGFzc05vZGUpOworICAgICAgICBjbGFzc05vZGUgPSBudWxsOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGNsYXNzRGVmKEFTVCBjbGFzc0RlZikgeworICAgICAgICBMaXN0IGFubm90YXRpb25zID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBBU1Qgbm9kZSA9IGNsYXNzRGVmLmdldEZpcnN0Q2hpbGQoKTsKKyAgICAgICAgaW50IG1vZGlmaWVycyA9IE9wY29kZXMuQUNDX1BVQkxJQzsKKyAgICAgICAgaWYgKGlzVHlwZShNT0RJRklFUlMsIG5vZGUpKSB7CisgICAgICAgICAgICBtb2RpZmllcnMgPSBtb2RpZmllcnMobm9kZSwgYW5ub3RhdGlvbnMsIG1vZGlmaWVycyk7CisgICAgICAgICAgICBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBpZGVudGlmaWVyKG5vZGUpOworICAgICAgICBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpOworICAgICAgICAKKyAgICAgICAgR2VuZXJpY3NUeXBlW10gZ2VuZXJpY3NUeXBlID0gbnVsbDsKKyAgICAgICAgaWYgKGlzVHlwZShUWVBFX1BBUkFNRVRFUlMsbm9kZSkpIHsKKyAgICAgICAgICAgIGdlbmVyaWNzVHlwZSA9IG1ha2VHZW5lcmljc1R5cGUobm9kZSk7CisgICAgICAgICAgICBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpOworICAgICAgICB9CisKKyAgICAgICAgQ2xhc3NOb2RlIHN1cGVyQ2xhc3MgPSBudWxsOworICAgICAgICBpZiAoaXNUeXBlKEVYVEVORFNfQ0xBVVNFLCBub2RlKSkgeworICAgICAgICAgICAgc3VwZXJDbGFzcyA9IG1ha2VUeXBlV2l0aEFyZ3VtZW50cyhub2RlKTsKKyAgICAgICAgICAgIG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBDbGFzc05vZGVbXSBpbnRlcmZhY2VzID0gQ2xhc3NOb2RlLkVNUFRZX0FSUkFZOworICAgICAgICBpZiAoaXNUeXBlKElNUExFTUVOVFNfQ0xBVVNFLCBub2RlKSkgeworICAgICAgICAgICAgaW50ZXJmYWNlcyA9IGludGVyZmFjZXMobm9kZSk7CisgICAgICAgICAgICBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETyByZWFkIG1peGlucworICAgICAgICBNaXhpbk5vZGVbXSBtaXhpbnMgPSB7fTsKKworICAgICAgICBhZGROZXdDbGFzc05hbWUobmFtZSk7CisgICAgICAgIGNsYXNzTm9kZSA9IG5ldyBDbGFzc05vZGUoZG90KGdldFBhY2thZ2VOYW1lKCksIG5hbWUpLCBtb2RpZmllcnMsIHN1cGVyQ2xhc3MsIGludGVyZmFjZXMsIG1peGlucyk7CisgICAgICAgIGNsYXNzTm9kZS5hZGRBbm5vdGF0aW9ucyhhbm5vdGF0aW9ucyk7CisgICAgICAgIGNsYXNzTm9kZS5zZXRHZW5lcmljc1R5cGVzKGdlbmVyaWNzVHlwZSk7CisgICAgICAgIGNvbmZpZ3VyZUFTVChjbGFzc05vZGUsIGNsYXNzRGVmKTsKKworICAgICAgICBhc3NlcnROb2RlVHlwZShPQkpCTE9DSywgbm9kZSk7CisgICAgICAgIG9iamVjdEJsb2NrKG5vZGUpOworICAgICAgICBvdXRwdXQuYWRkQ2xhc3MoY2xhc3NOb2RlKTsKKyAgICAgICAgY2xhc3NOb2RlID0gbnVsbDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBvYmplY3RCbG9jayhBU1Qgb2JqZWN0QmxvY2spIHsKKyAgICAgICAgZm9yIChBU1Qgbm9kZSA9IG9iamVjdEJsb2NrLmdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKSB7CisgICAgICAgICAgICBpbnQgdHlwZSA9IG5vZGUuZ2V0VHlwZSgpOworICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBPQkpCTE9DSzoKKyAgICAgICAgICAgICAgICAgICAgb2JqZWN0QmxvY2sobm9kZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBNRVRIT0RfREVGOgorICAgICAgICAgICAgICAgICAgICBtZXRob2REZWYobm9kZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBDVE9SX0lERU5UOgorICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvckRlZihub2RlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFZBUklBQkxFX0RFRjoKKyAgICAgICAgICAgICAgICAgICAgZmllbGREZWYobm9kZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBTVEFUSUNfSU5JVDoKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljSW5pdChub2RlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGNhc2UgSU5TVEFOQ0VfSU5JVDoKKyAgICAgICAgICAgICAgICAgICAgb2JqZWN0SW5pdChub2RlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGNhc2UgRU5VTV9ERUY6CisgICAgICAgICAgICAgICAgICAgIGVudW1EZWYobm9kZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgIAorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBjYXNlIEVOVU1fQ09OU1RBTlRfREVGOgorICAgICAgICAgICAgICAgICAgICBlbnVtQ29uc3RhbnREZWYobm9kZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB1bmtub3duQVNUKG5vZGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCB2b2lkIGVudW1EZWYoQVNUIGVudW1Ob2RlKSB7CisgICAgICAgIGFzc2VydE5vZGVUeXBlKEVOVU1fREVGLCBlbnVtTm9kZSk7CisgICAgICAgIExpc3QgYW5ub3RhdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIAorICAgICAgICBBU1Qgbm9kZSA9IGVudW1Ob2RlLmdldEZpcnN0Q2hpbGQoKTsKKyAgICAgICAgaW50IG1vZGlmaWVycyA9IE9wY29kZXMuQUNDX1BVQkxJQzsKKyAgICAgICAgaWYgKGlzVHlwZShNT0RJRklFUlMsIG5vZGUpKSB7CisgICAgICAgICAgICBtb2RpZmllcnMgPSBtb2RpZmllcnMobm9kZSxhbm5vdGF0aW9ucyxtb2RpZmllcnMpOworICAgICAgICAgICAgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBpZGVudGlmaWVyKG5vZGUpOworICAgICAgICBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpOworICAgICAgIAorICAgICAgICBDbGFzc05vZGVbXSBpbnRlcmZhY2VzID0gaW50ZXJmYWNlcyhub2RlKTsKKyAgICAgICAgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKKyAgICAgICAgCisgICAgICAgIENsYXNzTm9kZSBlbnVtQ2xhc3MgPSBFbnVtSGVscGVyLm1ha2VFbnVtTm9kZShkb3QoZ2V0UGFja2FnZU5hbWUoKSxuYW1lKSxtb2RpZmllcnMsaW50ZXJmYWNlcyxjbGFzc05vZGUpOworICAgICAgICBDbGFzc05vZGUgb2xkTm9kZSA9IGNsYXNzTm9kZTsKKyAgICAgICAgY2xhc3NOb2RlID0gZW51bUNsYXNzOworICAgICAgICBhc3NlcnROb2RlVHlwZShPQkpCTE9DSywgbm9kZSk7CisgICAgICAgIG9iamVjdEJsb2NrKG5vZGUpOworICAgICAgICBjbGFzc05vZGUgPSBvbGROb2RlOworICAgICAgICAKKyAgICAgICAgb3V0cHV0LmFkZENsYXNzKGVudW1DbGFzcyk7CisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCB2b2lkIGVudW1Db25zdGFudERlZihBU1Qgbm9kZSkgeworICAgICAgICBhc3NlcnROb2RlVHlwZShFTlVNX0NPTlNUQU5UX0RFRiwgbm9kZSk7CisgICAgICAgIEFTVCBlbGVtZW50ID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7CisgICAgICAgIGlmIChpc1R5cGUoQU5OT1RBVElPTlMsZWxlbWVudCkpIHsKKyAgICAgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LmdldE5leHRTaWJsaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGlkZW50aWZpZXIgPSBpZGVudGlmaWVyKGVsZW1lbnQpOworICAgICAgICBFeHByZXNzaW9uIGluaXQgPSBudWxsOworICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5nZXROZXh0U2libGluZygpOworICAgICAgICBpZiAoZWxlbWVudCE9bnVsbCkgaW5pdCA9IGV4cHJlc3Npb24oZWxlbWVudCk7CisgICAgICAgIEVudW1IZWxwZXIuYWRkRW51bUNvbnN0YW50KGNsYXNzTm9kZSwgaWRlbnRpZmllciwgaW5pdCk7CisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCB2b2lkIHRocm93c0xpc3QoQVNUIG5vZGUsTGlzdCBsaXN0KSB7CisgICAgCVN0cmluZyBuYW1lOworICAgIAlpZiAoaXNUeXBlKERPVCwgbm9kZSkpIHsKKyAgICAJCW5hbWUgPSBxdWFsaWZpZWROYW1lKG5vZGUpOworICAgIAl9IGVsc2UgeworICAgIAkJbmFtZSA9IGlkZW50aWZpZXIobm9kZSk7CisgICAgCX0KKyAgICAJQ2xhc3NOb2RlIGV4Y2VwdGlvbiA9IENsYXNzSGVscGVyLm1ha2UobmFtZSk7CisgICAgCWxpc3QuYWRkKGV4Y2VwdGlvbik7CisgICAgCUFTVCBuZXh0ID0gbm9kZS5nZXROZXh0U2libGluZygpOworICAgIAlpZiAobmV4dCE9bnVsbCkgdGhyb3dzTGlzdChuZXh0LCBsaXN0KTsKKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIHZvaWQgbWV0aG9kRGVmKEFTVCBtZXRob2REZWYpIHsKKyAgICAgICAgTGlzdCBhbm5vdGF0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgQVNUIG5vZGUgPSBtZXRob2REZWYuZ2V0Rmlyc3RDaGlsZCgpOworICAgICAgICAKKyAgICAgICAgR2VuZXJpY3NUeXBlW10gZ2VuZXJpY3M9bnVsbDsKKyAgICAgICAgaWYgKGlzVHlwZShUWVBFX1BBUkFNRVRFUlMsIG5vZGUpKSB7CisgICAgICAgICAgICBnZW5lcmljcyA9IG1ha2VHZW5lcmljc1R5cGUobm9kZSk7CisgICAgICAgICAgICBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpbnQgbW9kaWZpZXJzID0gT3Bjb2Rlcy5BQ0NfUFVCTElDOworICAgICAgICBpZiAoaXNUeXBlKE1PRElGSUVSUywgbm9kZSkpIHsKKyAgICAgICAgICAgIG1vZGlmaWVycyA9IG1vZGlmaWVycyhub2RlLCBhbm5vdGF0aW9ucywgbW9kaWZpZXJzKTsKKyAgICAgICAgICAgIG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2xhc3NOb2RlIT1udWxsICYmIChjbGFzc05vZGUuZ2V0TW9kaWZpZXJzKCkgJiBPcGNvZGVzLkFDQ19JTlRFUkZBQ0UpID4wKSB7CisgICAgICAgICAgICBtb2RpZmllcnMgfD0gT3Bjb2Rlcy5BQ0NfQUJTVFJBQ1Q7CisgICAgICAgIH0KKworICAgICAgICBDbGFzc05vZGUgcmV0dXJuVHlwZSA9IG51bGw7CisgICAgICAgIGlmIChpc1R5cGUoVFlQRSwgbm9kZSkpIHsKKyAgICAgICAgICAgIHJldHVyblR5cGUgPSBtYWtlVHlwZVdpdGhBcmd1bWVudHMobm9kZSk7CisgICAgICAgICAgICBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBpZGVudGlmaWVyKG5vZGUpOworICAgICAgICBpZiAoY2xhc3NOb2RlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChjbGFzc05vZGUuZ2V0TmFtZVdpdGhvdXRQYWNrYWdlKCkuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFTVFJ1bnRpbWVFeGNlcHRpb24obWV0aG9kRGVmLCAiSW52YWxpZCBjb25zdHJ1Y3RvciBmb3JtYXQuIFRyeSByZW1vdmUgdGhlICdkZWYnIGV4cHJlc3Npb24/Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKKworICAgICAgICBhc3NlcnROb2RlVHlwZShQQVJBTUVURVJTLCBub2RlKTsKKyAgICAgICAgUGFyYW1ldGVyW10gcGFyYW1ldGVycyA9IHBhcmFtZXRlcnMobm9kZSk7CisgICAgICAgIGlmIChwYXJhbWV0ZXJzPT1udWxsKSBwYXJhbWV0ZXJzID0gUGFyYW1ldGVyLkVNUFRZX0FSUkFZOworICAgICAgICBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpOworICAgICAgICAKKyAgICAgICAgQ2xhc3NOb2RlW10gZXhjZXB0aW9ucz0gQ2xhc3NOb2RlLkVNUFRZX0FSUkFZOworICAgICAgICBpZiAoaXNUeXBlKExJVEVSQUxfdGhyb3dzLCBub2RlKSkgeworICAgICAgICAJQVNUIHRocm93c05vZGUgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKKyAgICAgICAgCUxpc3QgZXhjZXB0aW9uTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgCXRocm93c0xpc3QodGhyb3dzTm9kZSwgZXhjZXB0aW9uTGlzdCk7CisgICAgICAgIAlleGNlcHRpb25zID0gKENsYXNzTm9kZVtdKSBleGNlcHRpb25MaXN0LnRvQXJyYXkoZXhjZXB0aW9ucyk7CisgICAgICAgIAlub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpOworICAgICAgICB9CisKKyAgICAgICAgU3RhdGVtZW50IGNvZGUgPSBudWxsOworICAgICAgICBpZiAoKG1vZGlmaWVycyAmIE9wY29kZXMuQUNDX0FCU1RSQUNUKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAobm9kZT09bnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBU1RSdW50aW1lRXhjZXB0aW9uKG1ldGhvZERlZiwgIllvdSBkZWZpbmVkIGEgbWV0aG9kIHdpdGhvdXQgYm9keS4gVHJ5IGFkZGluZyBhIGJvZHksIG9yIGRlY2xhcmUgaXQgYWJzdHJhY3QuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnROb2RlVHlwZShTTElTVCwgbm9kZSk7CisgICAgICAgICAgICBjb2RlID0gc3RhdGVtZW50TGlzdChub2RlKTsKKyAgICAgICAgfQorCisgICAgICAgIE1ldGhvZE5vZGUgbWV0aG9kTm9kZSA9IG5ldyBNZXRob2ROb2RlKG5hbWUsIG1vZGlmaWVycywgcmV0dXJuVHlwZSwgcGFyYW1ldGVycywgZXhjZXB0aW9ucywgY29kZSk7CisgICAgICAgIG1ldGhvZE5vZGUuYWRkQW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMpOworICAgICAgICBtZXRob2ROb2RlLnNldEdlbmVyaWNzVHlwZXMoZ2VuZXJpY3MpOworICAgICAgICBjb25maWd1cmVBU1QobWV0aG9kTm9kZSwgbWV0aG9kRGVmKTsKKyAgICAgICAgaWYgKGNsYXNzTm9kZSAhPSBudWxsKSB7CisgICAgICAgICAgICBjbGFzc05vZGUuYWRkTWV0aG9kKG1ldGhvZE5vZGUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgb3V0cHV0LmFkZE1ldGhvZChtZXRob2ROb2RlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgdm9pZCBzdGF0aWNJbml0KEFTVCBzdGF0aWNJbml0KSB7ICAgICAgICAKKyAgICAgICAgQmxvY2tTdGF0ZW1lbnQgY29kZSA9IChCbG9ja1N0YXRlbWVudCkgc3RhdGVtZW50TGlzdChzdGF0aWNJbml0KTsKKyAgICAgICAgY2xhc3NOb2RlLmFkZFN0YXRpY0luaXRpYWxpemVyU3RhdGVtZW50cyhjb2RlLmdldFN0YXRlbWVudHMoKSxmYWxzZSk7CisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCB2b2lkIG9iamVjdEluaXQoQVNUIGluaXQpIHsgICAgICAgIAorICAgICAgICBCbG9ja1N0YXRlbWVudCBjb2RlID0gKEJsb2NrU3RhdGVtZW50KSBzdGF0ZW1lbnRMaXN0KGluaXQpOworICAgICAgICBjbGFzc05vZGUuYWRkT2JqZWN0SW5pdGlhbGl6ZXJTdGF0ZW1lbnRzKGNvZGUpOworICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25zdHJ1Y3RvckRlZihBU1QgY29uc3RydWN0b3JEZWYpIHsKKyAgICAgICAgTGlzdCBhbm5vdGF0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgQVNUIG5vZGUgPSBjb25zdHJ1Y3RvckRlZi5nZXRGaXJzdENoaWxkKCk7CisgICAgICAgIGludCBtb2RpZmllcnMgPSBPcGNvZGVzLkFDQ19QVUJMSUM7CisgICAgICAgIGlmIChpc1R5cGUoTU9ESUZJRVJTLCBub2RlKSkgeworICAgICAgICAgICAgbW9kaWZpZXJzID0gbW9kaWZpZXJzKG5vZGUsIGFubm90YXRpb25zLCBtb2RpZmllcnMpOworICAgICAgICAgICAgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydE5vZGVUeXBlKFBBUkFNRVRFUlMsIG5vZGUpOworICAgICAgICBQYXJhbWV0ZXJbXSBwYXJhbWV0ZXJzID0gcGFyYW1ldGVycyhub2RlKTsKKyAgICAgICAgaWYgKHBhcmFtZXRlcnMgPT0gbnVsbCkgcGFyYW1ldGVycyA9IFBhcmFtZXRlci5FTVBUWV9BUlJBWTsKKyAgICAgICAgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKKworICAgICAgICBDbGFzc05vZGVbXSBleGNlcHRpb25zPSBDbGFzc05vZGUuRU1QVFlfQVJSQVk7CisgICAgICAgIGlmIChpc1R5cGUoTElURVJBTF90aHJvd3MsIG5vZGUpKSB7CisgICAgICAgIAlBU1QgdGhyb3dzTm9kZSA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOworICAgICAgICAJTGlzdCBleGNlcHRpb25MaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAJdGhyb3dzTGlzdCh0aHJvd3NOb2RlLCBleGNlcHRpb25MaXN0KTsKKyAgICAgICAgCWV4Y2VwdGlvbnMgPSAoQ2xhc3NOb2RlW10pIGV4Y2VwdGlvbkxpc3QudG9BcnJheShleGNlcHRpb25zKTsKKyAgICAgICAgCW5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGFzc2VydE5vZGVUeXBlKFNMSVNULCBub2RlKTsKKyAgICAgICAgU3RhdGVtZW50IGNvZGUgPSBzdGF0ZW1lbnRMaXN0KG5vZGUpOworCisgICAgICAgIENvbnN0cnVjdG9yTm9kZSBjb25zdHJ1Y3Rvck5vZGUgPSBjbGFzc05vZGUuYWRkQ29uc3RydWN0b3IobW9kaWZpZXJzLCBwYXJhbWV0ZXJzLCBleGNlcHRpb25zLCBjb2RlKTsKKyAgICAgICAgY29uc3RydWN0b3JOb2RlLmFkZEFubm90YXRpb25zKGFubm90YXRpb25zKTsKKyAgICAgICAgY29uZmlndXJlQVNUKGNvbnN0cnVjdG9yTm9kZSwgY29uc3RydWN0b3JEZWYpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGZpZWxkRGVmKEFTVCBmaWVsZERlZikgeworICAgICAgICBMaXN0IGFubm90YXRpb25zID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBBU1Qgbm9kZSA9IGZpZWxkRGVmLmdldEZpcnN0Q2hpbGQoKTsKKworICAgICAgICBpbnQgbW9kaWZpZXJzID0gMDsKKyAgICAgICAgaWYgKGlzVHlwZShNT0RJRklFUlMsIG5vZGUpKSB7CisgICAgICAgICAgICBtb2RpZmllcnMgPSBtb2RpZmllcnMobm9kZSwgYW5ub3RhdGlvbnMsIG1vZGlmaWVycyk7CisgICAgICAgICAgICBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoY2xhc3NOb2RlLmlzSW50ZXJmYWNlKCkpIHsKKyAgICAgICAgCW1vZGlmaWVycyB8PSBPcGNvZGVzLkFDQ19TVEFUSUMgfCBPcGNvZGVzLkFDQ19GSU5BTDsKKyAgICAgICAgCWlmICggKG1vZGlmaWVycyAmIChPcGNvZGVzLkFDQ19QUklWQVRFIHwgT3Bjb2Rlcy5BQ0NfUFJPVEVDVEVEKSkgPT0gMCkgeworICAgICAgICAJCW1vZGlmaWVycyB8PSBPcGNvZGVzLkFDQ19QVUJMSUM7CisgICAgICAgIAl9CisgICAgICAgIH0KKworICAgICAgICBDbGFzc05vZGUgdHlwZSA9IG51bGw7CisgICAgICAgIGlmIChpc1R5cGUoVFlQRSwgbm9kZSkpIHsKKyAgICAgICAgICAgIHR5cGUgPSBtYWtlVHlwZVdpdGhBcmd1bWVudHMobm9kZSk7CisgICAgICAgICAgICBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBpZGVudGlmaWVyKG5vZGUpOworICAgICAgICBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpOworCisgICAgICAgIEV4cHJlc3Npb24gaW5pdGlhbFZhbHVlID0gbnVsbDsKKyAgICAgICAgaWYgKG5vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgYXNzZXJ0Tm9kZVR5cGUoQVNTSUdOLCBub2RlKTsKKyAgICAgICAgICAgIGluaXRpYWxWYWx1ZSA9IGV4cHJlc3Npb24obm9kZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaW5pdGlhbFZhbHVlID09IG51bGwgJiYgdHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAodHlwZT09Q2xhc3NIZWxwZXIuaW50X1RZUEUpIHsKKyAgICAgICAgICAgICAgICBpbml0aWFsVmFsdWUgPSBuZXcgQ29uc3RhbnRFeHByZXNzaW9uKG5ldyBJbnRlZ2VyKDApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHR5cGU9PUNsYXNzSGVscGVyLmxvbmdfVFlQRSkgeworICAgICAgICAgICAgICAgIGluaXRpYWxWYWx1ZSA9IG5ldyBDb25zdGFudEV4cHJlc3Npb24obmV3IExvbmcoMEwpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHR5cGU9PUNsYXNzSGVscGVyLmRvdWJsZV9UWVBFKSB7CisgICAgICAgICAgICAgICAgaW5pdGlhbFZhbHVlID0gbmV3IENvbnN0YW50RXhwcmVzc2lvbihuZXcgRG91YmxlKDAuMCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAodHlwZT09Q2xhc3NIZWxwZXIuZmxvYXRfVFlQRSkgeworICAgICAgICAgICAgICAgIGluaXRpYWxWYWx1ZSA9IG5ldyBDb25zdGFudEV4cHJlc3Npb24obmV3IEZsb2F0KDAuMEYpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHR5cGU9PUNsYXNzSGVscGVyLmJvb2xlYW5fVFlQRSkgeworICAgICAgICAgICAgICAgIGluaXRpYWxWYWx1ZSA9IENvbnN0YW50RXhwcmVzc2lvbi5GQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHR5cGU9PUNsYXNzSGVscGVyLnNob3J0X1RZUEUpIHsKKyAgICAgICAgICAgICAgICBpbml0aWFsVmFsdWUgPSBuZXcgQ29uc3RhbnRFeHByZXNzaW9uKG5ldyBTaG9ydCgoc2hvcnQpIDApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHR5cGU9PUNsYXNzSGVscGVyLmJ5dGVfVFlQRSkgeworICAgICAgICAgICAgICAgIGluaXRpYWxWYWx1ZSA9IG5ldyBDb25zdGFudEV4cHJlc3Npb24obmV3IEJ5dGUoKGJ5dGUpIDApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHR5cGU9PUNsYXNzSGVscGVyLmNoYXJfVFlQRSkgeworICAgICAgICAgICAgICAgIGluaXRpYWxWYWx1ZSA9IG5ldyBDb25zdGFudEV4cHJlc3Npb24obmV3IENoYXJhY3RlcigoY2hhcikgMCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICBGaWVsZE5vZGUgZmllbGROb2RlID0gbmV3IEZpZWxkTm9kZShuYW1lLCBtb2RpZmllcnMsIHR5cGUsIGNsYXNzTm9kZSwgaW5pdGlhbFZhbHVlKTsKKyAgICAgICAgZmllbGROb2RlLmFkZEFubm90YXRpb25zKGFubm90YXRpb25zKTsKKyAgICAgICAgY29uZmlndXJlQVNUKGZpZWxkTm9kZSwgZmllbGREZWYpOworCisgICAgICAgIGlmICghaGFzVmlzaWJpbGl0eShtb2RpZmllcnMpKSB7CisgICAgICAgICAgICAvLyBsZXRzIHNldCB0aGUgbW9kaWZpZXJzIG9uIHRoZSBmaWVsZAorICAgICAgICAgICAgaW50IGZpZWxkTW9kaWZpZXJzID0gMDsKKyAgICAgICAgICAgIGludCBmbGFncyA9IE9wY29kZXMuQUNDX1NUQVRJQyB8IE9wY29kZXMuQUNDX1RSQU5TSUVOVCB8IE9wY29kZXMuQUNDX1ZPTEFUSUxFIHwgT3Bjb2Rlcy5BQ0NfRklOQUw7CisKKyAgICAgICAgICAgIGlmICghaGFzVmlzaWJpbGl0eShtb2RpZmllcnMpKSB7CisgICAgICAgICAgICAgICAgbW9kaWZpZXJzIHw9IE9wY29kZXMuQUNDX1BVQkxJQzsKKyAgICAgICAgICAgICAgICBmaWVsZE1vZGlmaWVycyB8PSBPcGNvZGVzLkFDQ19QUklWQVRFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBsZXRzIHBhc3MgYWxvbmcgYW55IG90aGVyIG1vZGlmaWVycyB3ZSBuZWVkCisgICAgICAgICAgICBmaWVsZE1vZGlmaWVycyB8PSAobW9kaWZpZXJzICYgZmxhZ3MpOworICAgICAgICAgICAgZmllbGROb2RlLnNldE1vZGlmaWVycyhmaWVsZE1vZGlmaWVycyk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFByb3BlcnR5Tm9kZSBwcm9wZXJ0eU5vZGUgPSBuZXcgUHJvcGVydHlOb2RlKGZpZWxkTm9kZSwgbW9kaWZpZXJzLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIGNvbmZpZ3VyZUFTVChwcm9wZXJ0eU5vZGUsIGZpZWxkRGVmKTsKKyAgICAgICAgICAgIGNsYXNzTm9kZS5hZGRQcm9wZXJ0eShwcm9wZXJ0eU5vZGUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZmllbGROb2RlLnNldE1vZGlmaWVycyhtb2RpZmllcnMpOworICAgICAgICAgICAgY2xhc3NOb2RlLmFkZEZpZWxkKGZpZWxkTm9kZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQ2xhc3NOb2RlW10gaW50ZXJmYWNlcyhBU1Qgbm9kZSkgeworICAgICAgICBMaXN0IGludGVyZmFjZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGZvciAoQVNUIGltcGxlbWVudE5vZGUgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsgaW1wbGVtZW50Tm9kZSAhPSBudWxsOyBpbXBsZW1lbnROb2RlID0gaW1wbGVtZW50Tm9kZS5nZXROZXh0U2libGluZygpKSB7CisgICAgICAgICAgICBpbnRlcmZhY2VMaXN0LmFkZChtYWtlVHlwZVdpdGhBcmd1bWVudHMoaW1wbGVtZW50Tm9kZSkpOworICAgICAgICB9CisgICAgICAgIENsYXNzTm9kZVtdIGludGVyZmFjZXMgPSBDbGFzc05vZGUuRU1QVFlfQVJSQVk7CisgICAgICAgIGlmICghaW50ZXJmYWNlTGlzdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGludGVyZmFjZXMgPSBuZXcgQ2xhc3NOb2RlW2ludGVyZmFjZUxpc3Quc2l6ZSgpXTsKKyAgICAgICAgICAgIGludGVyZmFjZUxpc3QudG9BcnJheShpbnRlcmZhY2VzKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiBpbnRlcmZhY2VzOworICAgIH0KKworICAgIHByb3RlY3RlZCBQYXJhbWV0ZXJbXSBwYXJhbWV0ZXJzKEFTVCBwYXJhbWV0ZXJzTm9kZSkgeworICAgICAgICBBU1Qgbm9kZSA9IHBhcmFtZXRlcnNOb2RlLmdldEZpcnN0Q2hpbGQoKTsKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkgeworICAgICAgICAJaWYgKGlzVHlwZShJTVBMSUNJVF9QQVJBTUVURVJTLCBwYXJhbWV0ZXJzTm9kZSkpIHJldHVybiBQYXJhbWV0ZXIuRU1QVFlfQVJSQVk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIExpc3QgcGFyYW1ldGVycyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLmFkZChwYXJhbWV0ZXIobm9kZSkpOworICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAobm9kZSAhPSBudWxsKTsKKyAgICAgICAgICAgIFBhcmFtZXRlcltdIGFuc3dlciA9IG5ldyBQYXJhbWV0ZXJbcGFyYW1ldGVycy5zaXplKCldOworICAgICAgICAgICAgcGFyYW1ldGVycy50b0FycmF5KGFuc3dlcik7CisgICAgICAgICAgICByZXR1cm4gYW5zd2VyOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIFBhcmFtZXRlciBwYXJhbWV0ZXIoQVNUIHBhcmFtTm9kZSkgeworICAgICAgICBMaXN0IGFubm90YXRpb25zID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBib29sZWFuIHZhcmlhYmxlUGFyYW1ldGVyRGVmID0gaXNUeXBlKFZBUklBQkxFX1BBUkFNRVRFUl9ERUYscGFyYW1Ob2RlKTsKKyAgICAgICAgQVNUIG5vZGUgPSBwYXJhbU5vZGUuZ2V0Rmlyc3RDaGlsZCgpOworCisgICAgICAgIGludCBtb2RpZmllcnMgPSAwOworICAgICAgICBpZiAoaXNUeXBlKE1PRElGSUVSUywgbm9kZSkpIHsKKyAgICAgICAgICAgIG1vZGlmaWVycyA9IG1vZGlmaWVycyhub2RlLCBhbm5vdGF0aW9ucywgbW9kaWZpZXJzKTsKKyAgICAgICAgICAgIG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBDbGFzc05vZGUgdHlwZSA9IENsYXNzSGVscGVyLkRZTkFNSUNfVFlQRTsKKyAgICAgICAgaWYgKGlzVHlwZShUWVBFLCBub2RlKSkgeworICAgICAgICAgICAgdHlwZSA9IG1ha2VUeXBlV2l0aEFyZ3VtZW50cyhub2RlKTsKKyAgICAgICAgICAgIGlmICh2YXJpYWJsZVBhcmFtZXRlckRlZikgdHlwZSA9IHR5cGUubWFrZUFycmF5KCk7CisgICAgICAgICAgICBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBpZGVudGlmaWVyKG5vZGUpOworICAgICAgICBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpOworICAgICAgICBWYXJpYWJsZUV4cHJlc3Npb24gbGVmdEV4cHJlc3Npb24gPSBuZXcgVmFyaWFibGVFeHByZXNzaW9uKG5hbWUsIHR5cGUpOworICAgICAgICBjb25maWd1cmVBU1QobGVmdEV4cHJlc3Npb24sIHBhcmFtTm9kZSk7CisKKyAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IG51bGw7CisgICAgICAgIGlmIChub2RlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFzc2VydE5vZGVUeXBlKEFTU0lHTiwgbm9kZSk7CisgICAgICAgICAgICBFeHByZXNzaW9uIHJpZ2h0RXhwcmVzc2lvbiA9IGV4cHJlc3Npb24obm9kZS5nZXRGaXJzdENoaWxkKCkpOworICAgICAgICAgICAgcGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcih0eXBlLCBuYW1lLCByaWdodEV4cHJlc3Npb24pOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBhcmFtZXRlciA9IG5ldyBQYXJhbWV0ZXIodHlwZSwgbmFtZSk7CisKKyAgICAgICAgY29uZmlndXJlQVNUKHBhcmFtZXRlciwgcGFyYW1Ob2RlKTsKKyAgICAgICAgcGFyYW1ldGVyLmFkZEFubm90YXRpb25zKGFubm90YXRpb25zKTsKKyAgICAgICAgcmV0dXJuIHBhcmFtZXRlcjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgaW50IG1vZGlmaWVycyhBU1QgbW9kaWZpZXJOb2RlLCBMaXN0IGFubm90YXRpb25zLCBpbnQgZGVmYXVsdE1vZGlmaWVycykgeworICAgICAgICBhc3NlcnROb2RlVHlwZShNT0RJRklFUlMsIG1vZGlmaWVyTm9kZSk7CisKKyAgICAgICAgYm9vbGVhbiBhY2Nlc3MgPSBmYWxzZTsKKyAgICAgICAgaW50IGFuc3dlciA9IDA7CisKKyAgICAgICAgZm9yIChBU1Qgbm9kZSA9IG1vZGlmaWVyTm9kZS5nZXRGaXJzdENoaWxkKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgeworICAgICAgICAgICAgaW50IHR5cGUgPSBub2RlLmdldFR5cGUoKTsKKyAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgU1RBVElDX0lNUE9SVDoKKyAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIC8vIGFubm90YXRpb25zCisgICAgICAgICAgICAgICAgY2FzZSBBTk5PVEFUSU9OOgorICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucy5hZGQoYW5ub3RhdGlvbihub2RlKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIC8vIGNvcmUgYWNjZXNzIHNjb3BlIG1vZGlmaWVycworICAgICAgICAgICAgICAgIGNhc2UgTElURVJBTF9wcml2YXRlOgorICAgICAgICAgICAgICAgICAgICBhbnN3ZXIgPSBzZXRNb2RpZmllckJpdChub2RlLCBhbnN3ZXIsIE9wY29kZXMuQUNDX1BSSVZBVEUpOworICAgICAgICAgICAgICAgICAgICBhY2Nlc3MgPSBzZXRBY2Nlc3NUcnVlKG5vZGUsIGFjY2Vzcyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBMSVRFUkFMX3Byb3RlY3RlZDoKKyAgICAgICAgICAgICAgICAgICAgYW5zd2VyID0gc2V0TW9kaWZpZXJCaXQobm9kZSwgYW5zd2VyLCBPcGNvZGVzLkFDQ19QUk9URUNURUQpOworICAgICAgICAgICAgICAgICAgICBhY2Nlc3MgPSBzZXRBY2Nlc3NUcnVlKG5vZGUsIGFjY2Vzcyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBMSVRFUkFMX3B1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgYW5zd2VyID0gc2V0TW9kaWZpZXJCaXQobm9kZSwgYW5zd2VyLCBPcGNvZGVzLkFDQ19QVUJMSUMpOworICAgICAgICAgICAgICAgICAgICBhY2Nlc3MgPSBzZXRBY2Nlc3NUcnVlKG5vZGUsIGFjY2Vzcyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIC8vIG90aGVyIG1vZGlmaWVycworICAgICAgICAgICAgICAgIGNhc2UgQUJTVFJBQ1Q6CisgICAgICAgICAgICAgICAgICAgIGFuc3dlciA9IHNldE1vZGlmaWVyQml0KG5vZGUsIGFuc3dlciwgT3Bjb2Rlcy5BQ0NfQUJTVFJBQ1QpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgRklOQUw6CisgICAgICAgICAgICAgICAgICAgIGFuc3dlciA9IHNldE1vZGlmaWVyQml0KG5vZGUsIGFuc3dlciwgT3Bjb2Rlcy5BQ0NfRklOQUwpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTElURVJBTF9uYXRpdmU6CisgICAgICAgICAgICAgICAgICAgIGFuc3dlciA9IHNldE1vZGlmaWVyQml0KG5vZGUsIGFuc3dlciwgT3Bjb2Rlcy5BQ0NfTkFUSVZFKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIExJVEVSQUxfc3RhdGljOgorICAgICAgICAgICAgICAgICAgICBhbnN3ZXIgPSBzZXRNb2RpZmllckJpdChub2RlLCBhbnN3ZXIsIE9wY29kZXMuQUNDX1NUQVRJQyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBTVFJJQ1RGUDoKKyAgICAgICAgICAgICAgICAgICAgYW5zd2VyID0gc2V0TW9kaWZpZXJCaXQobm9kZSwgYW5zd2VyLCBPcGNvZGVzLkFDQ19TVFJJQ1QpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTElURVJBTF9zeW5jaHJvbml6ZWQ6CisgICAgICAgICAgICAgICAgICAgIGFuc3dlciA9IHNldE1vZGlmaWVyQml0KG5vZGUsIGFuc3dlciwgT3Bjb2Rlcy5BQ0NfU1lOQ0hST05JWkVEKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIExJVEVSQUxfdHJhbnNpZW50OgorICAgICAgICAgICAgICAgICAgICBhbnN3ZXIgPSBzZXRNb2RpZmllckJpdChub2RlLCBhbnN3ZXIsIE9wY29kZXMuQUNDX1RSQU5TSUVOVCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBMSVRFUkFMX3ZvbGF0aWxlOgorICAgICAgICAgICAgICAgICAgICBhbnN3ZXIgPSBzZXRNb2RpZmllckJpdChub2RlLCBhbnN3ZXIsIE9wY29kZXMuQUNDX1ZPTEFUSUxFKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB1bmtub3duQVNUKG5vZGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghYWNjZXNzKSB7CisgICAgICAgICAgICBhbnN3ZXIgfD0gZGVmYXVsdE1vZGlmaWVyczsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYW5zd2VyOworICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIHNldEFjY2Vzc1RydWUoQVNUIG5vZGUsIGJvb2xlYW4gYWNjZXNzKSB7CisgICAgICAgIGlmICghYWNjZXNzKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBU1RSdW50aW1lRXhjZXB0aW9uKG5vZGUsICJDYW5ub3Qgc3BlY2lmeSBtb2RpZmllcjogIiArIG5vZGUuZ2V0VGV4dCgpICsgIiB3aGVuIGFjY2VzcyBzY29wZSBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBpbnQgc2V0TW9kaWZpZXJCaXQoQVNUIG5vZGUsIGludCBhbnN3ZXIsIGludCBiaXQpIHsKKyAgICAgICAgaWYgKChhbnN3ZXIgJiBiaXQpICE9IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBU1RSdW50aW1lRXhjZXB0aW9uKG5vZGUsICJDYW5ub3QgcmVwZWF0IG1vZGlmaWVyOiAiICsgbm9kZS5nZXRUZXh0KCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhbnN3ZXIgfCBiaXQ7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEFubm90YXRpb25Ob2RlIGFubm90YXRpb24oQVNUIGFubm90YXRpb25Ob2RlKSB7CisgICAgICAgIEFTVCBub2RlID0gYW5ub3RhdGlvbk5vZGUuZ2V0Rmlyc3RDaGlsZCgpOworICAgICAgICBTdHJpbmcgbmFtZSA9IHF1YWxpZmllZE5hbWUobm9kZSk7CisgICAgICAgIEFubm90YXRpb25Ob2RlIGFubm90YXRlZE5vZGUgPSBuZXcgQW5ub3RhdGlvbk5vZGUoQ2xhc3NIZWxwZXIubWFrZShuYW1lKSk7CisgICAgICAgIGNvbmZpZ3VyZUFTVChhbm5vdGF0ZWROb2RlLCBub2RlKTsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7CisgICAgICAgICAgICBpZiAoaXNUeXBlKEFOTk9UQVRJT05fTUVNQkVSX1ZBTFVFX1BBSVIsIG5vZGUpKSB7CisgICAgICAgICAgICAgICAgQVNUIG1lbWJlck5vZGUgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGFyYW0gPSBpZGVudGlmaWVyKG1lbWJlck5vZGUpOworICAgICAgICAgICAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24obWVtYmVyTm9kZS5nZXROZXh0U2libGluZygpKTsKKyAgICAgICAgICAgICAgICBhbm5vdGF0ZWROb2RlLmFkZE1lbWJlcihwYXJhbSwgZXhwcmVzc2lvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYW5ub3RhdGVkTm9kZTsKKyAgICB9CisKKworCisgICAgLy8gU3RhdGVtZW50cworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgcHJvdGVjdGVkIFN0YXRlbWVudCBzdGF0ZW1lbnQoQVNUIG5vZGUpIHsKKyAgICAgICAgU3RhdGVtZW50IHN0YXRlbWVudCA9IG51bGw7CisgICAgICAgIGludCB0eXBlID0gbm9kZS5nZXRUeXBlKCk7CisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgY2FzZSBTTElTVDoKKyAgICAgICAgICAgIGNhc2UgTElURVJBTF9maW5hbGx5OgorICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHN0YXRlbWVudExpc3Qobm9kZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgTUVUSE9EX0NBTEw6CisgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gbWV0aG9kQ2FsbChub2RlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBWQVJJQUJMRV9ERUY6CisgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gdmFyaWFibGVEZWYobm9kZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKworICAgICAgICAgICAgY2FzZSBMQUJFTEVEX1NUQVQ6CisgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gbGFiZWxsZWRTdGF0ZW1lbnQobm9kZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgTElURVJBTF9hc3NlcnQ6CisgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gYXNzZXJ0U3RhdGVtZW50KG5vZGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIExJVEVSQUxfYnJlYWs6CisgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gYnJlYWtTdGF0ZW1lbnQobm9kZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgTElURVJBTF9jb250aW51ZToKKyAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSBjb250aW51ZVN0YXRlbWVudChub2RlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBMSVRFUkFMX2lmOgorICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IGlmU3RhdGVtZW50KG5vZGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIExJVEVSQUxfZm9yOgorICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IGZvclN0YXRlbWVudChub2RlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBMSVRFUkFMX3JldHVybjoKKyAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSByZXR1cm5TdGF0ZW1lbnQobm9kZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgTElURVJBTF9zeW5jaHJvbml6ZWQ6CisgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gc3luY2hyb25pemVkU3RhdGVtZW50KG5vZGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIExJVEVSQUxfc3dpdGNoOgorICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHN3aXRjaFN0YXRlbWVudChub2RlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBMSVRFUkFMX3RyeToKKyAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSB0cnlTdGF0ZW1lbnQobm9kZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgTElURVJBTF90aHJvdzoKKyAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSB0aHJvd1N0YXRlbWVudChub2RlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBMSVRFUkFMX3doaWxlOgorICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHdoaWxlU3RhdGVtZW50KG5vZGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IG5ldyBFeHByZXNzaW9uU3RhdGVtZW50KGV4cHJlc3Npb24obm9kZSkpOworICAgICAgICB9CisgICAgICAgIGlmIChzdGF0ZW1lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgY29uZmlndXJlQVNUKHN0YXRlbWVudCwgbm9kZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXRlbWVudDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RhdGVtZW50IHN0YXRlbWVudExpc3QoQVNUIGNvZGUpIHsKKyAgICAgICAgcmV0dXJuIHN0YXRlbWVudExpc3ROb0NoaWxkKGNvZGUuZ2V0Rmlyc3RDaGlsZCgpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RhdGVtZW50IHN0YXRlbWVudExpc3ROb0NoaWxkKEFTVCBub2RlKSB7CisgICAgICAgIEJsb2NrU3RhdGVtZW50IGJsb2NrID0gbmV3IEJsb2NrU3RhdGVtZW50KCk7CisgICAgICAgIC8vIG5vIG5lZWQgdG8gY29uZmlndXJlQVNUKGJsb2NrLG5vZGUpOyBhcyBub2RlIGlzIHByb2JhYmx5IG51bGwKKyAgICAgICAgZm9yICg7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgeworICAgICAgICAgICAgYmxvY2suYWRkU3RhdGVtZW50KHN0YXRlbWVudChub2RlKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJsb2NrOworICAgIH0KKworICAgIHByb3RlY3RlZCBTdGF0ZW1lbnQgYXNzZXJ0U3RhdGVtZW50KEFTVCBhc3NlcnROb2RlKSB7CisgICAgICAgIEFTVCBub2RlID0gYXNzZXJ0Tm9kZS5nZXRGaXJzdENoaWxkKCk7CisgICAgICAgIEJvb2xlYW5FeHByZXNzaW9uIGJvb2xlYW5FeHByZXNzaW9uID0gYm9vbGVhbkV4cHJlc3Npb24obm9kZSk7CisgICAgICAgIEV4cHJlc3Npb24gbWVzc2FnZUV4cHJlc3Npb24gPSBudWxsOworCisgICAgICAgIG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7CisgICAgICAgIGlmIChub2RlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1lc3NhZ2VFeHByZXNzaW9uID0gZXhwcmVzc2lvbihub2RlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG1lc3NhZ2VFeHByZXNzaW9uID0gQ29uc3RhbnRFeHByZXNzaW9uLk5VTEw7CisgICAgICAgIH0KKyAgICAgICAgQXNzZXJ0U3RhdGVtZW50IGFzc2VydFN0YXRlbWVudCA9IG5ldyBBc3NlcnRTdGF0ZW1lbnQoYm9vbGVhbkV4cHJlc3Npb24sIG1lc3NhZ2VFeHByZXNzaW9uKTsKKyAgICAgICAgY29uZmlndXJlQVNUKGFzc2VydFN0YXRlbWVudCwgYXNzZXJ0Tm9kZSk7CisgICAgICAgIHJldHVybiBhc3NlcnRTdGF0ZW1lbnQ7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFN0YXRlbWVudCBicmVha1N0YXRlbWVudChBU1Qgbm9kZSkgeworICAgICAgICBCcmVha1N0YXRlbWVudCBicmVha1N0YXRlbWVudCA9IG5ldyBCcmVha1N0YXRlbWVudChsYWJlbChub2RlKSk7CisgICAgICAgIGNvbmZpZ3VyZUFTVChicmVha1N0YXRlbWVudCwgbm9kZSk7CisgICAgICAgIHJldHVybiBicmVha1N0YXRlbWVudDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RhdGVtZW50IGNvbnRpbnVlU3RhdGVtZW50KEFTVCBub2RlKSB7CisgICAgICAgIENvbnRpbnVlU3RhdGVtZW50IGNvbnRpbnVlU3RhdGVtZW50ID0gbmV3IENvbnRpbnVlU3RhdGVtZW50KGxhYmVsKG5vZGUpKTsKKyAgICAgICAgY29uZmlndXJlQVNUKGNvbnRpbnVlU3RhdGVtZW50LCBub2RlKTsKKyAgICAgICAgcmV0dXJuIGNvbnRpbnVlU3RhdGVtZW50OworICAgIH0KKworICAgIHByb3RlY3RlZCBTdGF0ZW1lbnQgZm9yU3RhdGVtZW50KEFTVCBmb3JOb2RlKSB7CisgICAgICAgIEFTVCBpbk5vZGUgPSBmb3JOb2RlLmdldEZpcnN0Q2hpbGQoKTsKKyAgICAgICAgRXhwcmVzc2lvbiBjb2xsZWN0aW9uRXhwcmVzc2lvbjsKKyAgICAgICAgUGFyYW1ldGVyIGZvclBhcmFtZXRlcjsKKyAgICAgICAgaWYgKGlzVHlwZShDTE9TVVJFX0xJU1QsIGluTm9kZSkpIHsKKyAgICAgICAgICAgIENsb3N1cmVMaXN0RXhwcmVzc2lvbiBjbGlzdCA9ICBjbG9zdXJlTGlzdEV4cHJlc3Npb24oaW5Ob2RlKTsKKyAgICAgICAgICAgIGludCBzaXplID0gY2xpc3QuZ2V0RXhwcmVzc2lvbnMoKS5zaXplKCk7CisgICAgICAgICAgICBpZiAoc2l6ZSE9MykgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBU1RSdW50aW1lRXhjZXB0aW9uKGluTm9kZSwgIjMgZXhwcmVzc2lvbnMgYXJlIHJlcXVpcmVkIGZvciB0aGUgY2xhc3NpYyBmb3IgbG9vcCwgeW91IGdhdmUgIitzaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbGxlY3Rpb25FeHByZXNzaW9uID0gY2xpc3Q7CisgICAgICAgICAgICBmb3JQYXJhbWV0ZXI9Rm9yU3RhdGVtZW50LkZPUl9MT09QX0RVTU1ZOworICAgICAgICB9IGVsc2UgeyAgICAgICAgCisgICAgICAgICAgICBBU1QgdmFyaWFibGVOb2RlID0gaW5Ob2RlLmdldEZpcnN0Q2hpbGQoKTsKKyAgICAgICAgICAgIEFTVCBjb2xsZWN0aW9uTm9kZSA9IHZhcmlhYmxlTm9kZS5nZXROZXh0U2libGluZygpOworICAgIAorICAgICAgICAgICAgQ2xhc3NOb2RlIHR5cGUgPSBDbGFzc0hlbHBlci5PQkpFQ1RfVFlQRTsKKyAgICAgICAgICAgIGlmIChpc1R5cGUoVkFSSUFCTEVfREVGLCB2YXJpYWJsZU5vZGUpKSB7CisgICAgICAgICAgICAgICAgQVNUIHR5cGVOb2RlID0gdmFyaWFibGVOb2RlLmdldEZpcnN0Q2hpbGQoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnROb2RlVHlwZShUWVBFLCB0eXBlTm9kZSk7CisgICAgCisgICAgICAgICAgICAgICAgdHlwZSA9IHR5cGUodHlwZU5vZGUpOworICAgICAgICAgICAgICAgIHZhcmlhYmxlTm9kZSA9IHR5cGVOb2RlLmdldE5leHRTaWJsaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcgdmFyaWFibGUgPSBpZGVudGlmaWVyKHZhcmlhYmxlTm9kZSk7CisgICAgCisgICAgICAgICAgICBjb2xsZWN0aW9uRXhwcmVzc2lvbiA9IGV4cHJlc3Npb24oY29sbGVjdGlvbk5vZGUpOworICAgICAgICAgICAgZm9yUGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcih0eXBlLHZhcmlhYmxlKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0YXRlbWVudCBibG9jayA9IHN0YXRlbWVudChpbk5vZGUuZ2V0TmV4dFNpYmxpbmcoKSk7CisgICAgICAgIEZvclN0YXRlbWVudCBmb3JTdGF0ZW1lbnQgPSBuZXcgRm9yU3RhdGVtZW50KGZvclBhcmFtZXRlciwgY29sbGVjdGlvbkV4cHJlc3Npb24sIGJsb2NrKTsKKyAgICAgICAgY29uZmlndXJlQVNUKGZvclN0YXRlbWVudCwgZm9yTm9kZSk7CisgICAgICAgIHJldHVybiBmb3JTdGF0ZW1lbnQ7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFN0YXRlbWVudCBpZlN0YXRlbWVudChBU1QgaWZOb2RlKSB7CisgICAgICAgIEFTVCBub2RlID0gaWZOb2RlLmdldEZpcnN0Q2hpbGQoKTsKKyAgICAgICAgYXNzZXJ0Tm9kZVR5cGUoRVhQUiwgbm9kZSk7CisgICAgICAgIEJvb2xlYW5FeHByZXNzaW9uIGJvb2xlYW5FeHByZXNzaW9uID0gYm9vbGVhbkV4cHJlc3Npb24obm9kZSk7CisKKyAgICAgICAgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKKyAgICAgICAgU3RhdGVtZW50IGlmQmxvY2sgPSBzdGF0ZW1lbnQobm9kZSk7CisKKyAgICAgICAgU3RhdGVtZW50IGVsc2VCbG9jayA9IEVtcHR5U3RhdGVtZW50LklOU1RBTkNFOworICAgICAgICBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpOworICAgICAgICBpZiAobm9kZSAhPSBudWxsKSB7CisgICAgICAgICAgICBlbHNlQmxvY2sgPSBzdGF0ZW1lbnQobm9kZSk7CisgICAgICAgIH0KKyAgICAgICAgSWZTdGF0ZW1lbnQgaWZTdGF0ZW1lbnQgPSBuZXcgSWZTdGF0ZW1lbnQoYm9vbGVhbkV4cHJlc3Npb24sIGlmQmxvY2ssIGVsc2VCbG9jayk7CisgICAgICAgIGNvbmZpZ3VyZUFTVChpZlN0YXRlbWVudCwgaWZOb2RlKTsKKyAgICAgICAgcmV0dXJuIGlmU3RhdGVtZW50OworICAgIH0KKworICAgIHByb3RlY3RlZCBTdGF0ZW1lbnQgbGFiZWxsZWRTdGF0ZW1lbnQoQVNUIGxhYmVsTm9kZSkgeworICAgICAgICBBU1Qgbm9kZSA9IGxhYmVsTm9kZS5nZXRGaXJzdENoaWxkKCk7CisgICAgICAgIFN0cmluZyBsYWJlbCA9IGlkZW50aWZpZXIobm9kZSk7CisgICAgICAgIFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBzdGF0ZW1lbnQobm9kZS5nZXROZXh0U2libGluZygpKTsKKyAgICAgICAgc3RhdGVtZW50LnNldFN0YXRlbWVudExhYmVsKGxhYmVsKTsKKyAgICAgICAgcmV0dXJuIHN0YXRlbWVudDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RhdGVtZW50IG1ldGhvZENhbGwoQVNUIGNvZGUpIHsKKyAgICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gbWV0aG9kQ2FsbEV4cHJlc3Npb24oY29kZSk7CisgICAgICAgIEV4cHJlc3Npb25TdGF0ZW1lbnQgZXhwcmVzc2lvblN0YXRlbWVudCA9IG5ldyBFeHByZXNzaW9uU3RhdGVtZW50KGV4cHJlc3Npb24pOworICAgICAgICBjb25maWd1cmVBU1QoZXhwcmVzc2lvblN0YXRlbWVudCwgY29kZSk7CisgICAgICAgIHJldHVybiBleHByZXNzaW9uU3RhdGVtZW50OworICAgIH0KKworICAgIHByb3RlY3RlZCBFeHByZXNzaW9uIGRlY2xhcmF0aW9uRXhwcmVzc2lvbihBU1QgdmFyaWFibGVEZWYpIHsKKyAgICAgICAgQVNUIG5vZGUgPSB2YXJpYWJsZURlZi5nZXRGaXJzdENoaWxkKCk7CisgICAgICAgIENsYXNzTm9kZSB0eXBlID0gbnVsbDsKKyAgICAgICAgaWYgKGlzVHlwZShNT0RJRklFUlMsIG5vZGUpKSB7CisgICAgICAgICAgICBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpOworICAgICAgICB9CisgICAgICAgIGlmIChpc1R5cGUoVFlQRSwgbm9kZSkpIHsKKyAgICAgICAgICAgIHR5cGUgPSBtYWtlVHlwZShub2RlKTsKKyAgICAgICAgICAgIG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgbmFtZSA9IGlkZW50aWZpZXIobm9kZSk7CisgICAgICAgIG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7CisKKyAgICAgICAgVmFyaWFibGVFeHByZXNzaW9uIGxlZnRFeHByZXNzaW9uID0gbmV3IFZhcmlhYmxlRXhwcmVzc2lvbihuYW1lLCB0eXBlKTsKKyAgICAgICAgY29uZmlndXJlQVNUKGxlZnRFeHByZXNzaW9uLCB2YXJpYWJsZURlZik7CisKKyAgICAgICAgRXhwcmVzc2lvbiByaWdodEV4cHJlc3Npb24gPSBDb25zdGFudEV4cHJlc3Npb24uTlVMTDsKKyAgICAgICAgaWYgKG5vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgYXNzZXJ0Tm9kZVR5cGUoQVNTSUdOLCBub2RlKTsKKworICAgICAgICAgICAgcmlnaHRFeHByZXNzaW9uID0gZXhwcmVzc2lvbihub2RlLmdldEZpcnN0Q2hpbGQoKSk7CisgICAgICAgIH0KKyAgICAgICAgVG9rZW4gdG9rZW4gPSBtYWtlVG9rZW4oVHlwZXMuQVNTSUdOLCB2YXJpYWJsZURlZik7CisKKyAgICAgICAgLy8gVE9ETyBzaG91bGQgd2UgaGF2ZSBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHN0YXRlbWVudD8KKyAgICAgICAgRGVjbGFyYXRpb25FeHByZXNzaW9uIGV4cHJlc3Npb24gPSBuZXcgRGVjbGFyYXRpb25FeHByZXNzaW9uKGxlZnRFeHByZXNzaW9uLCB0b2tlbiwgcmlnaHRFeHByZXNzaW9uKTsKKyAgICAgICAgY29uZmlndXJlQVNUKGV4cHJlc3Npb24sIHZhcmlhYmxlRGVmKTsKKyAgICAgICAgRXhwcmVzc2lvblN0YXRlbWVudCBleHByZXNzaW9uU3RhdGVtZW50ID0gbmV3IEV4cHJlc3Npb25TdGF0ZW1lbnQoZXhwcmVzc2lvbik7CisgICAgICAgIGNvbmZpZ3VyZUFTVChleHByZXNzaW9uU3RhdGVtZW50LCB2YXJpYWJsZURlZik7CisgICAgICAgIHJldHVybiBleHByZXNzaW9uOworICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgU3RhdGVtZW50IHZhcmlhYmxlRGVmKEFTVCB2YXJpYWJsZURlZikgeworICAgICAgICBFeHByZXNzaW9uU3RhdGVtZW50IGV4cHJlc3Npb25TdGF0ZW1lbnQgPSBuZXcgRXhwcmVzc2lvblN0YXRlbWVudChkZWNsYXJhdGlvbkV4cHJlc3Npb24odmFyaWFibGVEZWYpKTsKKyAgICAgICAgY29uZmlndXJlQVNUKGV4cHJlc3Npb25TdGF0ZW1lbnQsIHZhcmlhYmxlRGVmKTsKKyAgICAgICAgcmV0dXJuIGV4cHJlc3Npb25TdGF0ZW1lbnQ7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFN0YXRlbWVudCByZXR1cm5TdGF0ZW1lbnQoQVNUIG5vZGUpIHsKKyAgICAgICAgQVNUIGV4cHJOb2RlID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7CisKKyAgICAgICAgLy8gVGhpcyB3aWxsIHBpY2sgdXAgaW5jb3JyZWN0IHNpYmxpbmcgbm9kZSBpZiAnbm9kZScgaXMgYSBwbGFpbiAncmV0dXJuJworCQkvLworCQkvL2lmIChleHByTm9kZSA9PSBudWxsKSB7CisgICAgICAgIC8vICAgIGV4cHJOb2RlID0gbm9kZS5nZXROZXh0U2libGluZygpOworICAgICAgICAvL30KKyAgICAgICAgaWYgKGV4cHJOb2RlICE9IG51bGwpIHsKKyAgICAgICAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24oZXhwck5vZGUpOworICAgICAgICAgICAgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBDb25zdGFudEV4cHJlc3Npb24pIHsKKyAgICAgICAgICAgICAgICBDb25zdGFudEV4cHJlc3Npb24gY29uc3RhbnRFeHByID0gKENvbnN0YW50RXhwcmVzc2lvbikgZXhwcmVzc2lvbjsKKyAgICAgICAgICAgICAgICBpZiAoY29uc3RhbnRFeHByLmdldFZhbHVlKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmV0dXJuU3RhdGVtZW50LlJFVFVSTl9OVUxMX09SX1ZPSUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgUmV0dXJuU3RhdGVtZW50IHJldHVyblN0YXRlbWVudCA9IG5ldyBSZXR1cm5TdGF0ZW1lbnQoZXhwcmVzc2lvbik7CisgICAgICAgICAgICBjb25maWd1cmVBU1QocmV0dXJuU3RhdGVtZW50LCBub2RlKTsKKyAgICAgICAgICAgIHJldHVybiByZXR1cm5TdGF0ZW1lbnQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gUmV0dXJuU3RhdGVtZW50LlJFVFVSTl9OVUxMX09SX1ZPSUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RhdGVtZW50IHN3aXRjaFN0YXRlbWVudChBU1Qgc3dpdGNoTm9kZSkgeworICAgICAgICBBU1Qgbm9kZSA9IHN3aXRjaE5vZGUuZ2V0Rmlyc3RDaGlsZCgpOworICAgICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBleHByZXNzaW9uKG5vZGUpOworICAgICAgICBTdGF0ZW1lbnQgZGVmYXVsdFN0YXRlbWVudCA9IEVtcHR5U3RhdGVtZW50LklOU1RBTkNFOworCisgICAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgZm9yIChub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpOyBpc1R5cGUoQ0FTRV9HUk9VUCwgbm9kZSk7IG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCkpIHsKKyAgICAgICAgICAgIEFTVCBjaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOworICAgICAgICAgICAgaWYgKGlzVHlwZShMSVRFUkFMX2Nhc2UsIGNoaWxkKSkgeworICAgICAgICAgICAgICAgIExpc3QgY2FzZXMgPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgc3RhdGVtZW50IGNhbiBiZSBncm91cGVkIHdpdGggcHJldmlvdXMgY2FzZQorICAgICAgICAgICAgICAgIGRlZmF1bHRTdGF0ZW1lbnQgPSBjYXNlU3RhdGVtZW50cyhjaGlsZCwgY2FzZXMpOworICAgICAgICAgICAgICAgIGxpc3QuYWRkQWxsKGNhc2VzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGVmYXVsdFN0YXRlbWVudCA9IHN0YXRlbWVudChjaGlsZC5nZXROZXh0U2libGluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobm9kZSAhPSBudWxsKSB7CisgICAgICAgICAgICB1bmtub3duQVNUKG5vZGUpOworICAgICAgICB9CisgICAgICAgIFN3aXRjaFN0YXRlbWVudCBzd2l0Y2hTdGF0ZW1lbnQgPSBuZXcgU3dpdGNoU3RhdGVtZW50KGV4cHJlc3Npb24sIGxpc3QsIGRlZmF1bHRTdGF0ZW1lbnQpOworICAgICAgICBjb25maWd1cmVBU1Qoc3dpdGNoU3RhdGVtZW50LCBzd2l0Y2hOb2RlKTsKKyAgICAgICAgcmV0dXJuIHN3aXRjaFN0YXRlbWVudDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RhdGVtZW50IGNhc2VTdGF0ZW1lbnRzKEFTVCBub2RlLCBMaXN0IGNhc2VzKSB7CisgICAgICAgIExpc3QgZXhwcmVzc2lvbnMgPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gRW1wdHlTdGF0ZW1lbnQuSU5TVEFOQ0U7CisgICAgICAgIFN0YXRlbWVudCBkZWZhdWx0U3RhdGVtZW50ID0gRW1wdHlTdGF0ZW1lbnQuSU5TVEFOQ0U7CisgICAgICAgIEFTVCBuZXh0U2libGluZyA9IG5vZGU7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24obmV4dFNpYmxpbmcuZ2V0Rmlyc3RDaGlsZCgpKTsKKyAgICAgICAgICAgIGV4cHJlc3Npb25zLmFkZChleHByZXNzaW9uKTsKKyAgICAgICAgICAgIG5leHRTaWJsaW5nID0gbmV4dFNpYmxpbmcuZ2V0TmV4dFNpYmxpbmcoKTsKKyAgICAgICAgfSB3aGlsZSAoaXNUeXBlKExJVEVSQUxfY2FzZSwgbmV4dFNpYmxpbmcpKTsKKyAgICAgICAgaWYgKG5leHRTaWJsaW5nICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChpc1R5cGUoTElURVJBTF9kZWZhdWx0LCBuZXh0U2libGluZykpIHsKKyAgICAgICAgICAgICAgICBkZWZhdWx0U3RhdGVtZW50ID0gc3RhdGVtZW50KG5leHRTaWJsaW5nLmdldE5leHRTaWJsaW5nKCkpOworICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IEVtcHR5U3RhdGVtZW50LklOU1RBTkNFOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSBzdGF0ZW1lbnQobmV4dFNpYmxpbmcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBleHByZXNzaW9ucy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBFeHByZXNzaW9uIGV4cHIgPSAoRXhwcmVzc2lvbikgaXRlcmF0b3IubmV4dCgpOworICAgICAgICAgICAgU3RhdGVtZW50IHN0bXQ7CisgICAgICAgICAgICBpZiAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgc3RtdCA9IG5ldyBDYXNlU3RhdGVtZW50KGV4cHIsRW1wdHlTdGF0ZW1lbnQuSU5TVEFOQ0UpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdG10ID0gbmV3IENhc2VTdGF0ZW1lbnQoZXhwcixzdGF0ZW1lbnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uZmlndXJlQVNUKHN0bXQsbm9kZSk7CisgICAgICAgICAgICBjYXNlcy5hZGQoc3RtdCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRlZmF1bHRTdGF0ZW1lbnQ7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFN0YXRlbWVudCBzeW5jaHJvbml6ZWRTdGF0ZW1lbnQoQVNUIHN5bmNOb2RlKSB7CisgICAgICAgIEFTVCBub2RlID0gc3luY05vZGUuZ2V0Rmlyc3RDaGlsZCgpOworICAgICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBleHByZXNzaW9uKG5vZGUpOworICAgICAgICBTdGF0ZW1lbnQgY29kZSA9IHN0YXRlbWVudChub2RlLmdldE5leHRTaWJsaW5nKCkpOworICAgICAgICBTeW5jaHJvbml6ZWRTdGF0ZW1lbnQgc3luY2hyb25pemVkU3RhdGVtZW50ID0gbmV3IFN5bmNocm9uaXplZFN0YXRlbWVudChleHByZXNzaW9uLCBjb2RlKTsKKyAgICAgICAgY29uZmlndXJlQVNUKHN5bmNocm9uaXplZFN0YXRlbWVudCwgc3luY05vZGUpOworICAgICAgICByZXR1cm4gc3luY2hyb25pemVkU3RhdGVtZW50OworICAgIH0KKworICAgIHByb3RlY3RlZCBTdGF0ZW1lbnQgdGhyb3dTdGF0ZW1lbnQoQVNUIG5vZGUpIHsKKyAgICAgICAgQVNUIGV4cHJlc3Npb25Ob2RlID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7CisgICAgICAgIGlmIChleHByZXNzaW9uTm9kZSA9PSBudWxsKSB7CisgICAgICAgICAgICBleHByZXNzaW9uTm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZXhwcmVzc2lvbk5vZGUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFTVFJ1bnRpbWVFeGNlcHRpb24obm9kZSwgIk5vIGV4cHJlc3Npb24gYXZhaWxhYmxlIik7CisgICAgICAgIH0KKyAgICAgICAgVGhyb3dTdGF0ZW1lbnQgdGhyb3dTdGF0ZW1lbnQgPSBuZXcgVGhyb3dTdGF0ZW1lbnQoZXhwcmVzc2lvbihleHByZXNzaW9uTm9kZSkpOworICAgICAgICBjb25maWd1cmVBU1QodGhyb3dTdGF0ZW1lbnQsIG5vZGUpOworICAgICAgICByZXR1cm4gdGhyb3dTdGF0ZW1lbnQ7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFN0YXRlbWVudCB0cnlTdGF0ZW1lbnQoQVNUIHRyeVN0YXRlbWVudE5vZGUpIHsKKyAgICAgICAgQVNUIHRyeU5vZGUgPSB0cnlTdGF0ZW1lbnROb2RlLmdldEZpcnN0Q2hpbGQoKTsKKyAgICAgICAgU3RhdGVtZW50IHRyeVN0YXRlbWVudCA9IHN0YXRlbWVudCh0cnlOb2RlKTsKKyAgICAgICAgU3RhdGVtZW50IGZpbmFsbHlTdGF0ZW1lbnQgPSBFbXB0eVN0YXRlbWVudC5JTlNUQU5DRTsKKyAgICAgICAgQVNUIG5vZGUgPSB0cnlOb2RlLmdldE5leHRTaWJsaW5nKCk7CisKKyAgICAgICAgLy8gbGV0cyBkbyB0aGUgY2F0Y2ggbm9kZXMKKyAgICAgICAgTGlzdCBjYXRjaGVzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBmb3IgKDsgbm9kZSAhPSBudWxsICYmIGlzVHlwZShMSVRFUkFMX2NhdGNoLCBub2RlKTsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgeworICAgICAgICAgICAgY2F0Y2hlcy5hZGQoY2F0Y2hTdGF0ZW1lbnQobm9kZSkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzVHlwZShMSVRFUkFMX2ZpbmFsbHksIG5vZGUpKSB7CisgICAgICAgICAgICBmaW5hbGx5U3RhdGVtZW50ID0gc3RhdGVtZW50KG5vZGUpOworICAgICAgICAgICAgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIFRyeUNhdGNoU3RhdGVtZW50IHRyeUNhdGNoU3RhdGVtZW50ID0gbmV3IFRyeUNhdGNoU3RhdGVtZW50KHRyeVN0YXRlbWVudCwgZmluYWxseVN0YXRlbWVudCk7CisgICAgICAgIGNvbmZpZ3VyZUFTVCh0cnlDYXRjaFN0YXRlbWVudCwgdHJ5U3RhdGVtZW50Tm9kZSk7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGNhdGNoZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBDYXRjaFN0YXRlbWVudCBzdGF0ZW1lbnQgPSAoQ2F0Y2hTdGF0ZW1lbnQpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgdHJ5Q2F0Y2hTdGF0ZW1lbnQuYWRkQ2F0Y2goc3RhdGVtZW50KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ5Q2F0Y2hTdGF0ZW1lbnQ7CisgICAgfQorCisgICAgcHJvdGVjdGVkIENhdGNoU3RhdGVtZW50IGNhdGNoU3RhdGVtZW50KEFTVCBjYXRjaE5vZGUpIHsKKyAgICAgICAgQVNUIG5vZGUgPSBjYXRjaE5vZGUuZ2V0Rmlyc3RDaGlsZCgpOworICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gcGFyYW1ldGVyKG5vZGUpOworICAgICAgICBDbGFzc05vZGUgZXhjZXB0aW9uVHlwZSA9IHBhcmFtZXRlci5nZXRUeXBlKCk7CisgICAgICAgIFN0cmluZyB2YXJpYWJsZSA9IHBhcmFtZXRlci5nZXROYW1lKCk7CisgICAgICAgIG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7CisgICAgICAgIFN0YXRlbWVudCBjb2RlID0gc3RhdGVtZW50KG5vZGUpOworICAgICAgICBQYXJhbWV0ZXIgY2F0Y2hQYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKGV4Y2VwdGlvblR5cGUsdmFyaWFibGUpOworICAgICAgICBDYXRjaFN0YXRlbWVudCBhbnN3ZXIgPSBuZXcgQ2F0Y2hTdGF0ZW1lbnQoY2F0Y2hQYXJhbWV0ZXIsIGNvZGUpOworICAgICAgICBjb25maWd1cmVBU1QoYW5zd2VyLCBjYXRjaE5vZGUpOworICAgICAgICByZXR1cm4gYW5zd2VyOworICAgIH0KKworICAgIHByb3RlY3RlZCBTdGF0ZW1lbnQgd2hpbGVTdGF0ZW1lbnQoQVNUIHdoaWxlTm9kZSkgeworICAgICAgICBBU1Qgbm9kZSA9IHdoaWxlTm9kZS5nZXRGaXJzdENoaWxkKCk7CisgICAgICAgIGFzc2VydE5vZGVUeXBlKEVYUFIsIG5vZGUpOworICAgICAgICBCb29sZWFuRXhwcmVzc2lvbiBib29sZWFuRXhwcmVzc2lvbiA9IGJvb2xlYW5FeHByZXNzaW9uKG5vZGUpOworCisgICAgICAgIG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7CisgICAgICAgIFN0YXRlbWVudCBibG9jayA9IHN0YXRlbWVudChub2RlKTsKKyAgICAgICAgV2hpbGVTdGF0ZW1lbnQgd2hpbGVTdGF0ZW1lbnQgPSBuZXcgV2hpbGVTdGF0ZW1lbnQoYm9vbGVhbkV4cHJlc3Npb24sIGJsb2NrKTsKKyAgICAgICAgY29uZmlndXJlQVNUKHdoaWxlU3RhdGVtZW50LCB3aGlsZU5vZGUpOworICAgICAgICByZXR1cm4gd2hpbGVTdGF0ZW1lbnQ7CisgICAgfQorCisKKworICAgIC8vIEV4cHJlc3Npb25zCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBwcm90ZWN0ZWQgRXhwcmVzc2lvbiBleHByZXNzaW9uKEFTVCBub2RlKSB7CisgICAgICAgIHJldHVybiBleHByZXNzaW9uKG5vZGUsZmFsc2UpOworICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgRXhwcmVzc2lvbiBleHByZXNzaW9uKEFTVCBub2RlLCBib29sZWFuIGNvbnZlcnRUb0NvbnN0YW50KSB7CisgICAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IGV4cHJlc3Npb25Td2l0Y2gobm9kZSk7CisgICAgICAgIGlmIChjb252ZXJ0VG9Db25zdGFudCkgeworICAgICAgICAgICAgLy8gYSBtZXRob2QgbmFtZSBjYW4gbmV2ZXIgYmUgYSBWYXJpYWJsZUV4cHJzc2lvbiwgc28gaXQgbXVzdCBjb252ZXJ0ZWQKKyAgICAgICAgICAgIC8vIHRvIGEgQ29uc3RhbnRFeHByZXNzaW9uIHRoZW4uIFRoaXMgaXMgbmVlZGVkIGFzIHRoZSBleHByZXNzaW9uCisgICAgICAgICAgICAvLyBtZXRob2QgZG9lc24ndCBrbm93IHdlIHdhbnQgYSBDb25zdGFudEV4cHJlc3Npb24gaW5zdGVhZCBvZiBhCisgICAgICAgICAgICAvLyBWYXJpYWJsZUV4cHJlc3Npb24KKyAgICAgICAgICAgIGlmICggZXhwcmVzc2lvbiAhPSBWYXJpYWJsZUV4cHJlc3Npb24uVEhJU19FWFBSRVNTSU9OICYmCisgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24gIT0gVmFyaWFibGVFeHByZXNzaW9uLlNVUEVSX0VYUFJFU1NJT04gJiYKKyAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbiBpbnN0YW5jZW9mIFZhcmlhYmxlRXhwcmVzc2lvbikgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVmFyaWFibGVFeHByZXNzaW9uIHZlID0gKFZhcmlhYmxlRXhwcmVzc2lvbikgZXhwcmVzc2lvbjsKKyAgICAgICAgICAgICAgICBleHByZXNzaW9uID0gbmV3IENvbnN0YW50RXhwcmVzc2lvbih2ZS5nZXROYW1lKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbmZpZ3VyZUFTVChleHByZXNzaW9uLCBub2RlKTsKKyAgICAgICAgcmV0dXJuIGV4cHJlc3Npb247ICAgICAgIAorICAgIH0KKworICAgIHByb3RlY3RlZCBFeHByZXNzaW9uIGV4cHJlc3Npb25Td2l0Y2goQVNUIG5vZGUpIHsKKyAgICAgICAgaW50IHR5cGUgPSBub2RlLmdldFR5cGUoKTsKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICBjYXNlIEVYUFI6CisgICAgICAgICAgICAgICAgcmV0dXJuIGV4cHJlc3Npb24obm9kZS5nZXRGaXJzdENoaWxkKCkpOworCisgICAgICAgICAgICBjYXNlIEVMSVNUOgorICAgICAgICAgICAgICAgIHJldHVybiBleHByZXNzaW9uTGlzdChub2RlKTsKKworICAgICAgICAgICAgY2FzZSBTTElTVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gYmxvY2tFeHByZXNzaW9uKG5vZGUpOworCisgICAgICAgICAgICBjYXNlIENMT1NBQkxFX0JMT0NLOgorICAgICAgICAgICAgICAgIHJldHVybiBjbG9zdXJlRXhwcmVzc2lvbihub2RlKTsKKworICAgICAgICAgICAgY2FzZSBTVVBFUl9DVE9SX0NBTEw6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNwZWNpYWxDb25zdHJ1Y3RvckNhbGxFeHByZXNzaW9uKG5vZGUsQ2xhc3NOb2RlLlNVUEVSKTsKKworICAgICAgICAgICAgY2FzZSBNRVRIT0RfQ0FMTDoKKyAgICAgICAgICAgICAgICByZXR1cm4gbWV0aG9kQ2FsbEV4cHJlc3Npb24obm9kZSk7CisKKyAgICAgICAgICAgIGNhc2UgTElURVJBTF9uZXc6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yQ2FsbEV4cHJlc3Npb24obm9kZS5nZXRGaXJzdENoaWxkKCkpOworCisgICAgICAgICAgICBjYXNlIENUT1JfQ0FMTDoKKyAgICAgICAgICAgICAgICByZXR1cm4gc3BlY2lhbENvbnN0cnVjdG9yQ2FsbEV4cHJlc3Npb24obm9kZSxDbGFzc05vZGUuVEhJUyk7CisKKyAgICAgICAgICAgIGNhc2UgUVVFU1RJT046IAorICAgICAgICAgICAgY2FzZSBFTFZJU19PUEVSQVRPUjoKKyAgICAgICAgICAgICAgICByZXR1cm4gdGVybmFyeUV4cHJlc3Npb24obm9kZSk7CisKKyAgICAgICAgICAgIGNhc2UgT1BUSU9OQUxfRE9UOgorICAgICAgICAgICAgY2FzZSBTUFJFQURfRE9UOgorICAgICAgICAgICAgY2FzZSBET1Q6CisgICAgICAgICAgICAgICAgcmV0dXJuIGRvdEV4cHJlc3Npb24obm9kZSk7CisKKyAgICAgICAgICAgIGNhc2UgSURFTlQ6CisgICAgICAgICAgICBjYXNlIExJVEVSQUxfYm9vbGVhbjoKKyAgICAgICAgICAgIGNhc2UgTElURVJBTF9ieXRlOgorICAgICAgICAgICAgY2FzZSBMSVRFUkFMX2NoYXI6CisgICAgICAgICAgICBjYXNlIExJVEVSQUxfZG91YmxlOgorICAgICAgICAgICAgY2FzZSBMSVRFUkFMX2Zsb2F0OgorICAgICAgICAgICAgY2FzZSBMSVRFUkFMX2ludDoKKyAgICAgICAgICAgIGNhc2UgTElURVJBTF9sb25nOgorICAgICAgICAgICAgY2FzZSBMSVRFUkFMX3Nob3J0OgorICAgICAgICAgICAgY2FzZSBMSVRFUkFMX3ZvaWQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhcmlhYmxlRXhwcmVzc2lvbihub2RlKTsKKworICAgICAgICAgICAgY2FzZSBMSVNUX0NPTlNUUlVDVE9SOgorICAgICAgICAgICAgICAgIHJldHVybiBsaXN0RXhwcmVzc2lvbihub2RlKTsKKworICAgICAgICAgICAgY2FzZSBNQVBfQ09OU1RSVUNUT1I6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1hcEV4cHJlc3Npb24obm9kZSk7CisKKyAgICAgICAgICAgIGNhc2UgTEFCRUxFRF9BUkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1hcEVudHJ5RXhwcmVzc2lvbihub2RlKTsKKworICAgICAgICAgICAgY2FzZSBTUFJFQURfQVJHOgorICAgICAgICAgICAgICAgIHJldHVybiBzcHJlYWRFeHByZXNzaW9uKG5vZGUpOworCisgICAgICAgICAgICBjYXNlIFNQUkVBRF9NQVBfQVJHOgorICAgICAgICAgICAgICAgIHJldHVybiBzcHJlYWRNYXBFeHByZXNzaW9uKG5vZGUpOworCisgICAgICAgICAgICAvLyBjb21tZW50ZWQgb3V0IG9mIGdyb292eS5nIGR1ZSB0byBub24gZGV0ZXJtaW5pc21zCisgICAgICAgICAgICAvL2Nhc2UgTUVNQkVSX1BPSU5URVJfREVGQVVMVDoKKyAgICAgICAgICAgIC8vICAgIHJldHVybiBkZWZhdWx0TWV0aG9kUG9pbnRlckV4cHJlc3Npb24obm9kZSk7CisKKyAgICAgICAgICAgIGNhc2UgTUVNQkVSX1BPSU5URVI6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZFBvaW50ZXJFeHByZXNzaW9uKG5vZGUpOworCisgICAgICAgICAgICBjYXNlIElOREVYX09QOgorICAgICAgICAgICAgICAgIHJldHVybiBpbmRleEV4cHJlc3Npb24obm9kZSk7CisKKyAgICAgICAgICAgIGNhc2UgTElURVJBTF9pbnN0YW5jZW9mOgorICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZW9mRXhwcmVzc2lvbihub2RlKTsKKworICAgICAgICAgICAgY2FzZSBMSVRFUkFMX2FzOgorICAgICAgICAgICAgICAgIHJldHVybiBhc0V4cHJlc3Npb24obm9kZSk7CisKKyAgICAgICAgICAgIGNhc2UgVFlQRUNBU1Q6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNhc3RFeHByZXNzaW9uKG5vZGUpOworCisgICAgICAgICAgICAgICAgLy8gbGl0ZXJhbHMKKworICAgICAgICAgICAgY2FzZSBMSVRFUkFMX3RydWU6CisgICAgICAgICAgICAgICAgcmV0dXJuIENvbnN0YW50RXhwcmVzc2lvbi5UUlVFOworCisgICAgICAgICAgICBjYXNlIExJVEVSQUxfZmFsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIENvbnN0YW50RXhwcmVzc2lvbi5GQUxTRTsKKworICAgICAgICAgICAgY2FzZSBMSVRFUkFMX251bGw6CisgICAgICAgICAgICAgICAgcmV0dXJuIENvbnN0YW50RXhwcmVzc2lvbi5OVUxMOworCisgICAgICAgICAgICBjYXNlIFNUUklOR19MSVRFUkFMOgorICAgICAgICAgICAgICAgIENvbnN0YW50RXhwcmVzc2lvbiBjb25zdGFudEV4cHJlc3Npb24gPSBuZXcgQ29uc3RhbnRFeHByZXNzaW9uKG5vZGUuZ2V0VGV4dCgpKTsKKyAgICAgICAgICAgICAgICBjb25maWd1cmVBU1QoY29uc3RhbnRFeHByZXNzaW9uLCBub2RlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gY29uc3RhbnRFeHByZXNzaW9uOworCisgICAgICAgICAgICBjYXNlIFNUUklOR19DT05TVFJVQ1RPUjoKKyAgICAgICAgICAgICAgICByZXR1cm4gZ3N0cmluZyhub2RlKTsKKworICAgICAgICAgICAgY2FzZSBOVU1fRE9VQkxFOgorICAgICAgICAgICAgY2FzZSBOVU1fRkxPQVQ6CisgICAgICAgICAgICBjYXNlIE5VTV9CSUdfREVDSU1BTDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVjaW1hbEV4cHJlc3Npb24obm9kZSk7CisKKyAgICAgICAgICAgIGNhc2UgTlVNX0JJR19JTlQ6CisgICAgICAgICAgICBjYXNlIE5VTV9JTlQ6CisgICAgICAgICAgICBjYXNlIE5VTV9MT05HOgorICAgICAgICAgICAgICAgIHJldHVybiBpbnRlZ2VyRXhwcmVzc2lvbihub2RlKTsKKworICAgICAgICAgICAgY2FzZSBMSVRFUkFMX3RoaXM6CisgICAgICAgICAgICAgICAgcmV0dXJuIFZhcmlhYmxlRXhwcmVzc2lvbi5USElTX0VYUFJFU1NJT047CisKKyAgICAgICAgICAgIGNhc2UgTElURVJBTF9zdXBlcjoKKyAgICAgICAgICAgICAgICByZXR1cm4gVmFyaWFibGVFeHByZXNzaW9uLlNVUEVSX0VYUFJFU1NJT047CisKKworICAgICAgICAgICAgICAgIC8vIFVuYXJ5IGV4cHJlc3Npb25zCisgICAgICAgICAgICBjYXNlIExOT1Q6CisgICAgICAgICAgICAgICAgTm90RXhwcmVzc2lvbiBub3RFeHByZXNzaW9uID0gbmV3IE5vdEV4cHJlc3Npb24oZXhwcmVzc2lvbihub2RlLmdldEZpcnN0Q2hpbGQoKSkpOworICAgICAgICAgICAgICAgIGNvbmZpZ3VyZUFTVChub3RFeHByZXNzaW9uLCBub2RlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbm90RXhwcmVzc2lvbjsKKworICAgICAgICAgICAgY2FzZSBVTkFSWV9NSU5VUzoKKyAgICAgICAgICAgICAgICByZXR1cm4gdW5hcnlNaW51c0V4cHJlc3Npb24obm9kZSk7CisKKyAgICAgICAgICAgIGNhc2UgQk5PVDoKKyAgICAgICAgICAgICAgICBCaXR3aXNlTmVnYXRpb25FeHByZXNzaW9uIGJpdHdpc2VOZWdhdGlvbkV4cHJlc3Npb24gPSBuZXcgQml0d2lzZU5lZ2F0aW9uRXhwcmVzc2lvbihleHByZXNzaW9uKG5vZGUuZ2V0Rmlyc3RDaGlsZCgpKSk7CisgICAgICAgICAgICAgICAgY29uZmlndXJlQVNUKGJpdHdpc2VOZWdhdGlvbkV4cHJlc3Npb24sIG5vZGUpOworICAgICAgICAgICAgICAgIHJldHVybiBiaXR3aXNlTmVnYXRpb25FeHByZXNzaW9uOworCisgICAgICAgICAgICBjYXNlIFVOQVJZX1BMVVM6CisgICAgICAgICAgICAgICAgcmV0dXJuIHVuYXJ5UGx1c0V4cHJlc3Npb24obm9kZSk7CisKKyAgICAgICAgICAgICAgICAvLyBQcmVmaXggZXhwcmVzc2lvbnMKKyAgICAgICAgICAgIGNhc2UgSU5DOgorICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXhFeHByZXNzaW9uKG5vZGUsIFR5cGVzLlBMVVNfUExVUyk7CisKKyAgICAgICAgICAgIGNhc2UgREVDOgorICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXhFeHByZXNzaW9uKG5vZGUsIFR5cGVzLk1JTlVTX01JTlVTKTsKKworICAgICAgICAgICAgICAgIC8vIFBvc3RmaXggZXhwcmVzc2lvbnMKKyAgICAgICAgICAgIGNhc2UgUE9TVF9JTkM6CisgICAgICAgICAgICAgICAgcmV0dXJuIHBvc3RmaXhFeHByZXNzaW9uKG5vZGUsIFR5cGVzLlBMVVNfUExVUyk7CisKKyAgICAgICAgICAgIGNhc2UgUE9TVF9ERUM6CisgICAgICAgICAgICAgICAgcmV0dXJuIHBvc3RmaXhFeHByZXNzaW9uKG5vZGUsIFR5cGVzLk1JTlVTX01JTlVTKTsKKworCisgICAgICAgICAgICAgICAgLy8gQmluYXJ5IGV4cHJlc3Npb25zCisKKyAgICAgICAgICAgIGNhc2UgQVNTSUdOOgorICAgICAgICAgICAgICAgIHJldHVybiBiaW5hcnlFeHByZXNzaW9uKFR5cGVzLkFTU0lHTiwgbm9kZSk7CisKKyAgICAgICAgICAgIGNhc2UgRVFVQUw6CisgICAgICAgICAgICAgICAgcmV0dXJuIGJpbmFyeUV4cHJlc3Npb24oVHlwZXMuQ09NUEFSRV9FUVVBTCwgbm9kZSk7CisKKyAgICAgICAgICAgIGNhc2UgTk9UX0VRVUFMOgorICAgICAgICAgICAgICAgIHJldHVybiBiaW5hcnlFeHByZXNzaW9uKFR5cGVzLkNPTVBBUkVfTk9UX0VRVUFMLCBub2RlKTsKKworICAgICAgICAgICAgY2FzZSBDT01QQVJFX1RPOgorICAgICAgICAgICAgICAgIHJldHVybiBiaW5hcnlFeHByZXNzaW9uKFR5cGVzLkNPTVBBUkVfVE8sIG5vZGUpOworCisgICAgICAgICAgICBjYXNlIExFOgorICAgICAgICAgICAgICAgIHJldHVybiBiaW5hcnlFeHByZXNzaW9uKFR5cGVzLkNPTVBBUkVfTEVTU19USEFOX0VRVUFMLCBub2RlKTsKKworICAgICAgICAgICAgY2FzZSBMVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gYmluYXJ5RXhwcmVzc2lvbihUeXBlcy5DT01QQVJFX0xFU1NfVEhBTiwgbm9kZSk7CisKKyAgICAgICAgICAgIGNhc2UgR1Q6CisgICAgICAgICAgICAgICAgcmV0dXJuIGJpbmFyeUV4cHJlc3Npb24oVHlwZXMuQ09NUEFSRV9HUkVBVEVSX1RIQU4sIG5vZGUpOworCisgICAgICAgICAgICBjYXNlIEdFOgorICAgICAgICAgICAgICAgIHJldHVybiBiaW5hcnlFeHByZXNzaW9uKFR5cGVzLkNPTVBBUkVfR1JFQVRFUl9USEFOX0VRVUFMLCBub2RlKTsKKworICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAqIFRPRE8gdHJlYmxlIGVxdWFsPworICAgICAgICAgICAgICAgICByZXR1cm4gYmluYXJ5RXhwcmVzc2lvbihUeXBlcy5DT01QQVJFX0lERU5USUNBTCwgbm9kZSk7CisKKyAgICAgICAgICAgICAgICAgY2FzZSA/Pz86CisgICAgICAgICAgICAgICAgIHJldHVybiBiaW5hcnlFeHByZXNzaW9uKFR5cGVzLkxPR0lDQUxfQU5EX0VRVUFMLCBub2RlKTsKKworICAgICAgICAgICAgICAgICBjYXNlID8/PzoKKyAgICAgICAgICAgICAgICAgcmV0dXJuIGJpbmFyeUV4cHJlc3Npb24oVHlwZXMuTE9HSUNBTF9PUl9FUVVBTCwgbm9kZSk7CisKKyAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgY2FzZSBMQU5EOgorICAgICAgICAgICAgICAgIHJldHVybiBiaW5hcnlFeHByZXNzaW9uKFR5cGVzLkxPR0lDQUxfQU5ELCBub2RlKTsKKworICAgICAgICAgICAgY2FzZSBMT1I6CisgICAgICAgICAgICAgICAgcmV0dXJuIGJpbmFyeUV4cHJlc3Npb24oVHlwZXMuTE9HSUNBTF9PUiwgbm9kZSk7CisKKyAgICAgICAgICAgIGNhc2UgQkFORDoKKyAgICAgICAgICAgICAgICByZXR1cm4gYmluYXJ5RXhwcmVzc2lvbihUeXBlcy5CSVRXSVNFX0FORCwgbm9kZSk7CisKKyAgICAgICAgICAgIGNhc2UgQkFORF9BU1NJR046CisgICAgICAgICAgICAgICAgcmV0dXJuIGJpbmFyeUV4cHJlc3Npb24oVHlwZXMuQklUV0lTRV9BTkRfRVFVQUwsIG5vZGUpOworCisgICAgICAgICAgICBjYXNlIEJPUjoKKyAgICAgICAgICAgICAgICByZXR1cm4gYmluYXJ5RXhwcmVzc2lvbihUeXBlcy5CSVRXSVNFX09SLCBub2RlKTsKKworICAgICAgICAgICAgY2FzZSBCT1JfQVNTSUdOOgorICAgICAgICAgICAgICAgIHJldHVybiBiaW5hcnlFeHByZXNzaW9uKFR5cGVzLkJJVFdJU0VfT1JfRVFVQUwsIG5vZGUpOworCisgICAgICAgICAgICBjYXNlIEJYT1I6CisgICAgICAgICAgICAgICAgcmV0dXJuIGJpbmFyeUV4cHJlc3Npb24oVHlwZXMuQklUV0lTRV9YT1IsIG5vZGUpOworCisgICAgICAgICAgICBjYXNlIEJYT1JfQVNTSUdOOgorICAgICAgICAgICAgICAgIHJldHVybiBiaW5hcnlFeHByZXNzaW9uKFR5cGVzLkJJVFdJU0VfWE9SX0VRVUFMLCBub2RlKTsKKworCisgICAgICAgICAgICBjYXNlIFBMVVM6CisgICAgICAgICAgICAgICAgcmV0dXJuIGJpbmFyeUV4cHJlc3Npb24oVHlwZXMuUExVUywgbm9kZSk7CisKKyAgICAgICAgICAgIGNhc2UgUExVU19BU1NJR046CisgICAgICAgICAgICAgICAgcmV0dXJuIGJpbmFyeUV4cHJlc3Npb24oVHlwZXMuUExVU19FUVVBTCwgbm9kZSk7CisKKworICAgICAgICAgICAgY2FzZSBNSU5VUzoKKyAgICAgICAgICAgICAgICByZXR1cm4gYmluYXJ5RXhwcmVzc2lvbihUeXBlcy5NSU5VUywgbm9kZSk7CisKKyAgICAgICAgICAgIGNhc2UgTUlOVVNfQVNTSUdOOgorICAgICAgICAgICAgICAgIHJldHVybiBiaW5hcnlFeHByZXNzaW9uKFR5cGVzLk1JTlVTX0VRVUFMLCBub2RlKTsKKworCisgICAgICAgICAgICBjYXNlIFNUQVI6CisgICAgICAgICAgICAgICAgcmV0dXJuIGJpbmFyeUV4cHJlc3Npb24oVHlwZXMuTVVMVElQTFksIG5vZGUpOworCisgICAgICAgICAgICBjYXNlIFNUQVJfQVNTSUdOOgorICAgICAgICAgICAgICAgIHJldHVybiBiaW5hcnlFeHByZXNzaW9uKFR5cGVzLk1VTFRJUExZX0VRVUFMLCBub2RlKTsKKworCisgICAgICAgICAgICBjYXNlIFNUQVJfU1RBUjoKKyAgICAgICAgICAgICAgICByZXR1cm4gYmluYXJ5RXhwcmVzc2lvbihUeXBlcy5QT1dFUiwgbm9kZSk7CisKKyAgICAgICAgICAgIGNhc2UgU1RBUl9TVEFSX0FTU0lHTjoKKyAgICAgICAgICAgICAgICByZXR1cm4gYmluYXJ5RXhwcmVzc2lvbihUeXBlcy5QT1dFUl9FUVVBTCwgbm9kZSk7CisKKworICAgICAgICAgICAgY2FzZSBESVY6CisgICAgICAgICAgICAgICAgcmV0dXJuIGJpbmFyeUV4cHJlc3Npb24oVHlwZXMuRElWSURFLCBub2RlKTsKKworICAgICAgICAgICAgY2FzZSBESVZfQVNTSUdOOgorICAgICAgICAgICAgICAgIHJldHVybiBiaW5hcnlFeHByZXNzaW9uKFR5cGVzLkRJVklERV9FUVVBTCwgbm9kZSk7CisKKworICAgICAgICAgICAgY2FzZSBNT0Q6CisgICAgICAgICAgICAgICAgcmV0dXJuIGJpbmFyeUV4cHJlc3Npb24oVHlwZXMuTU9ELCBub2RlKTsKKworICAgICAgICAgICAgY2FzZSBNT0RfQVNTSUdOOgorICAgICAgICAgICAgICAgIHJldHVybiBiaW5hcnlFeHByZXNzaW9uKFR5cGVzLk1PRF9FUVVBTCwgbm9kZSk7CisKKyAgICAgICAgICAgIGNhc2UgU0w6CisgICAgICAgICAgICAgICAgcmV0dXJuIGJpbmFyeUV4cHJlc3Npb24oVHlwZXMuTEVGVF9TSElGVCwgbm9kZSk7CisKKyAgICAgICAgICAgIGNhc2UgU0xfQVNTSUdOOgorICAgICAgICAgICAgICAgIHJldHVybiBiaW5hcnlFeHByZXNzaW9uKFR5cGVzLkxFRlRfU0hJRlRfRVFVQUwsIG5vZGUpOworCisgICAgICAgICAgICBjYXNlIFNSOgorICAgICAgICAgICAgICAgIHJldHVybiBiaW5hcnlFeHByZXNzaW9uKFR5cGVzLlJJR0hUX1NISUZULCBub2RlKTsKKworICAgICAgICAgICAgY2FzZSBTUl9BU1NJR046CisgICAgICAgICAgICAgICAgcmV0dXJuIGJpbmFyeUV4cHJlc3Npb24oVHlwZXMuUklHSFRfU0hJRlRfRVFVQUwsIG5vZGUpOworCisgICAgICAgICAgICBjYXNlIEJTUjoKKyAgICAgICAgICAgICAgICByZXR1cm4gYmluYXJ5RXhwcmVzc2lvbihUeXBlcy5SSUdIVF9TSElGVF9VTlNJR05FRCwgbm9kZSk7CisKKyAgICAgICAgICAgIGNhc2UgQlNSX0FTU0lHTjoKKyAgICAgICAgICAgICAgICByZXR1cm4gYmluYXJ5RXhwcmVzc2lvbihUeXBlcy5SSUdIVF9TSElGVF9VTlNJR05FRF9FUVVBTCwgbm9kZSk7CisKKyAgICAgICAgICAgIGNhc2UgVkFSSUFCTEVfREVGOgorICAgICAgICAgICAgICAgIHJldHVybiBkZWNsYXJhdGlvbkV4cHJlc3Npb24obm9kZSk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gUmVnZXgKKyAgICAgICAgICAgIGNhc2UgUkVHRVhfRklORDoKKyAgICAgICAgICAgICAgICByZXR1cm4gYmluYXJ5RXhwcmVzc2lvbihUeXBlcy5GSU5EX1JFR0VYLCBub2RlKTsKKworICAgICAgICAgICAgY2FzZSBSRUdFWF9NQVRDSDoKKyAgICAgICAgICAgICAgICByZXR1cm4gYmluYXJ5RXhwcmVzc2lvbihUeXBlcy5NQVRDSF9SRUdFWCwgbm9kZSk7CisKKworICAgICAgICAgICAgICAgIC8vIFJhbmdlcworICAgICAgICAgICAgY2FzZSBSQU5HRV9JTkNMVVNJVkU6CisgICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlRXhwcmVzc2lvbihub2RlLCB0cnVlKTsKKworICAgICAgICAgICAgY2FzZSBSQU5HRV9FWENMVVNJVkU6CisgICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlRXhwcmVzc2lvbihub2RlLCBmYWxzZSk7CisKKyAgICAgICAgICAgIGNhc2UgRFlOQU1JQ19NRU1CRVI6CisgICAgICAgICAgICAgICAgcmV0dXJuIGR5bmFtaWNNZW1iZXJFeHByZXNzaW9uKG5vZGUpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgY2FzZSBMSVRFUkFMX2luOgorICAgICAgICAgICAgICAgIHJldHVybiBiaW5hcnlFeHByZXNzaW9uKFR5cGVzLktFWVdPUkRfSU4sbm9kZSk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBjYXNlIEFOTk9UQVRJT046CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBbm5vdGF0aW9uQ29uc3RhbnRFeHByZXNzaW9uKGFubm90YXRpb24obm9kZSkpOworCisgICAgICAgICAgICBjYXNlIENMT1NVUkVfTElTVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gY2xvc3VyZUxpc3RFeHByZXNzaW9uKG5vZGUpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB1bmtub3duQVNUKG5vZGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIENsb3N1cmVMaXN0RXhwcmVzc2lvbiBjbG9zdXJlTGlzdEV4cHJlc3Npb24oQVNUIG5vZGUpIHsKKyAgICAgICAgQVNUIGV4cHJOb2RlID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7CisgICAgICAgIExpbmtlZExpc3QgbGlzdCA9IG5ldyBMaW5rZWRMaXN0KCk7CisgICAgICAgIHdoaWxlIChleHByTm9kZSE9bnVsbCkgeworICAgICAgICAgICAgaWYgKGlzVHlwZShFWFBSLGV4cHJOb2RlKSkgeworICAgICAgICAgICAgICAgIEV4cHJlc3Npb24gZXhwciA9IGV4cHJlc3Npb24oZXhwck5vZGUpOworICAgICAgICAgICAgICAgIGNvbmZpZ3VyZUFTVChleHByLCBleHByTm9kZSk7CisgICAgICAgICAgICAgICAgbGlzdC5hZGQoZXhwcik7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhc3NlcnROb2RlVHlwZShFTVBUWV9TVEFULCBleHByTm9kZSk7CisgICAgICAgICAgICAgICAgbGlzdC5hZGQoRW1wdHlFeHByZXNzaW9uLklOU1RBTkNFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgZXhwck5vZGUgPSBleHByTm9kZS5nZXROZXh0U2libGluZygpOworICAgICAgICB9CisgICAgICAgIENsb3N1cmVMaXN0RXhwcmVzc2lvbiBjbGUgPSBuZXcgQ2xvc3VyZUxpc3RFeHByZXNzaW9uKGxpc3QpOworICAgICAgICBjb25maWd1cmVBU1QoY2xlLG5vZGUpOworICAgICAgICByZXR1cm4gY2xlOworICAgIH0KKworICAgIHByb3RlY3RlZCBFeHByZXNzaW9uIGR5bmFtaWNNZW1iZXJFeHByZXNzaW9uKEFTVCBkeW5hbWljTWVtYmVyTm9kZSkgeworICAgICAgICBBU1Qgbm9kZSA9IGR5bmFtaWNNZW1iZXJOb2RlLmdldEZpcnN0Q2hpbGQoKTsKKyAgICAgICAgcmV0dXJuIGV4cHJlc3Npb24obm9kZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEV4cHJlc3Npb24gdGVybmFyeUV4cHJlc3Npb24oQVNUIHRlcm5hcnlOb2RlKSB7CisgICAgICAgIEFTVCBub2RlID0gdGVybmFyeU5vZGUuZ2V0Rmlyc3RDaGlsZCgpOworICAgICAgICBFeHByZXNzaW9uIGJhc2UgPSBleHByZXNzaW9uKG5vZGUpOworICAgICAgICBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpOworICAgICAgICBFeHByZXNzaW9uIGxlZnQgPSBleHByZXNzaW9uKG5vZGUpOworICAgICAgICBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpOworICAgICAgICBFeHByZXNzaW9uIHJldDsKKyAgICAgICAgaWYgKG5vZGU9PW51bGwpIHsKKyAgICAgICAgICAgIHJldCA9IG5ldyBFbHZpc09wZXJhdG9yRXhwcmVzc2lvbihiYXNlLCBsZWZ0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEV4cHJlc3Npb24gcmlnaHQgPSBleHByZXNzaW9uKG5vZGUpOworICAgICAgICAgICAgQm9vbGVhbkV4cHJlc3Npb24gYm9vbGVhbkV4cHJlc3Npb24gPSBuZXcgQm9vbGVhbkV4cHJlc3Npb24oYmFzZSk7CisgICAgICAgICAgICBib29sZWFuRXhwcmVzc2lvbi5zZXRTb3VyY2VQb3NpdGlvbihiYXNlKTsKKyAgICAgICAgICAgIHJldCA9IG5ldyBUZXJuYXJ5RXhwcmVzc2lvbihib29sZWFuRXhwcmVzc2lvbiwgbGVmdCwgcmlnaHQpOworICAgICAgICB9CisgICAgICAgIGNvbmZpZ3VyZUFTVChyZXQsIHRlcm5hcnlOb2RlKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgRXhwcmVzc2lvbiB2YXJpYWJsZUV4cHJlc3Npb24oQVNUIG5vZGUpIHsKKyAgICAgICAgU3RyaW5nIHRleHQgPSBub2RlLmdldFRleHQoKTsKKworICAgICAgICAvLyBUT0RPIHdlIG1pZ2h0IHdhbm5hIG9ubHkgdHJ5IHRvIHJlc29sdmUgdGhlIG5hbWUgaWYgd2UgYXJlCisgICAgICAgIC8vIG9uIHRoZSBsZWZ0IGhhbmQgc2lkZSBvZiBhbiBleHByZXNzaW9uIG9yIGJlZm9yZSBhIGRvdD8KKyAgICAgICAgVmFyaWFibGVFeHByZXNzaW9uIHZhcmlhYmxlRXhwcmVzc2lvbiA9IG5ldyBWYXJpYWJsZUV4cHJlc3Npb24odGV4dCk7CisgICAgICAgIGNvbmZpZ3VyZUFTVCh2YXJpYWJsZUV4cHJlc3Npb24sIG5vZGUpOworICAgICAgICByZXR1cm4gdmFyaWFibGVFeHByZXNzaW9uOworICAgIH0KKworICAgIHByb3RlY3RlZCBFeHByZXNzaW9uIHJhbmdlRXhwcmVzc2lvbihBU1QgcmFuZ2VOb2RlLCBib29sZWFuIGluY2x1c2l2ZSkgeworICAgICAgICBBU1Qgbm9kZSA9IHJhbmdlTm9kZS5nZXRGaXJzdENoaWxkKCk7CisgICAgICAgIEV4cHJlc3Npb24gbGVmdCA9IGV4cHJlc3Npb24obm9kZSk7CisgICAgICAgIEV4cHJlc3Npb24gcmlnaHQgPSBleHByZXNzaW9uKG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSk7CisgICAgICAgIFJhbmdlRXhwcmVzc2lvbiByYW5nZUV4cHJlc3Npb24gPSBuZXcgUmFuZ2VFeHByZXNzaW9uKGxlZnQsIHJpZ2h0LCBpbmNsdXNpdmUpOworICAgICAgICBjb25maWd1cmVBU1QocmFuZ2VFeHByZXNzaW9uLCByYW5nZU5vZGUpOworICAgICAgICByZXR1cm4gcmFuZ2VFeHByZXNzaW9uOworICAgIH0KKworICAgIHByb3RlY3RlZCBFeHByZXNzaW9uIHNwcmVhZEV4cHJlc3Npb24oQVNUIG5vZGUpIHsKKyAgICAgICAgQVNUIGV4cHJOb2RlID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7CisgICAgICAgIEFTVCBsaXN0Tm9kZSA9IGV4cHJOb2RlLmdldEZpcnN0Q2hpbGQoKTsKKyAgICAgICAgRXhwcmVzc2lvbiByaWdodCA9IGV4cHJlc3Npb24obGlzdE5vZGUpOworICAgICAgICBTcHJlYWRFeHByZXNzaW9uIHNwcmVhZEV4cHJlc3Npb24gPSBuZXcgU3ByZWFkRXhwcmVzc2lvbihyaWdodCk7CisgICAgICAgIGNvbmZpZ3VyZUFTVChzcHJlYWRFeHByZXNzaW9uLCBub2RlKTsKKyAgICAgICAgcmV0dXJuIHNwcmVhZEV4cHJlc3Npb247CisgICAgfQorCisgICAgcHJvdGVjdGVkIEV4cHJlc3Npb24gc3ByZWFkTWFwRXhwcmVzc2lvbihBU1Qgbm9kZSkgeworICAgICAgICBBU1QgZXhwck5vZGUgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKKyAgICAgICAgRXhwcmVzc2lvbiBleHByID0gZXhwcmVzc2lvbihleHByTm9kZSk7CisgICAgICAgIFNwcmVhZE1hcEV4cHJlc3Npb24gc3ByZWFkTWFwRXhwcmVzc2lvbiA9IG5ldyBTcHJlYWRNYXBFeHByZXNzaW9uKGV4cHIpOworICAgICAgICBjb25maWd1cmVBU1Qoc3ByZWFkTWFwRXhwcmVzc2lvbiwgbm9kZSk7CisgICAgICAgIHJldHVybiBzcHJlYWRNYXBFeHByZXNzaW9uOworICAgIH0KKworICAgIHByb3RlY3RlZCBFeHByZXNzaW9uIG1ldGhvZFBvaW50ZXJFeHByZXNzaW9uKEFTVCBub2RlKSB7CisgICAgICAgIEFTVCBleHByTm9kZSA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOworICAgICAgICBFeHByZXNzaW9uIG9iamVjdEV4cHJlc3Npb24gPSBleHByZXNzaW9uKGV4cHJOb2RlKTsKKyAgICAgICAgQVNUIG1Ob2RlID0gZXhwck5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKKyAgICAgICAgRXhwcmVzc2lvbiBtZXRob2ROYW1lOworICAgICAgICBpZiAoaXNUeXBlKERZTkFNSUNfTUVNQkVSLCBtTm9kZSkpIHsKKyAgICAgICAgICAgIG1ldGhvZE5hbWUgPSBleHByZXNzaW9uKG1Ob2RlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1ldGhvZE5hbWUgPSBuZXcgQ29uc3RhbnRFeHByZXNzaW9uKGlkZW50aWZpZXIobU5vZGUpKTsKKyAgICAgICAgfQorICAgICAgICBNZXRob2RQb2ludGVyRXhwcmVzc2lvbiBtZXRob2RQb2ludGVyRXhwcmVzc2lvbiA9IG5ldyBNZXRob2RQb2ludGVyRXhwcmVzc2lvbihvYmplY3RFeHByZXNzaW9uLCBtZXRob2ROYW1lKTsKKyAgICAgICAgY29uZmlndXJlQVNUKG1ldGhvZFBvaW50ZXJFeHByZXNzaW9uLCBub2RlKTsKKyAgICAgICAgcmV0dXJuIG1ldGhvZFBvaW50ZXJFeHByZXNzaW9uOworICAgIH0KKworLyogIGNvbW1lbnRlZCBvdXQgZHVlIHRvIGdyb292eS5nIG5vbi1kZXRlcm1pbmlzbXMKKyAgcHJvdGVjdGVkIEV4cHJlc3Npb24gZGVmYXVsdE1ldGhvZFBvaW50ZXJFeHByZXNzaW9uKEFTVCBub2RlKSB7CisgICAgICAgIEFTVCBleHByTm9kZSA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOworICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSA9IGV4cHJOb2RlLnRvU3RyaW5nKCk7CisgICAgICAgIE1ldGhvZFBvaW50ZXJFeHByZXNzaW9uIG1ldGhvZFBvaW50ZXJFeHByZXNzaW9uID0gbmV3IE1ldGhvZFBvaW50ZXJFeHByZXNzaW9uKG51bGwsIG1ldGhvZE5hbWUpOworICAgICAgICBjb25maWd1cmVBU1QobWV0aG9kUG9pbnRlckV4cHJlc3Npb24sIG5vZGUpOworICAgICAgICByZXR1cm4gbWV0aG9kUG9pbnRlckV4cHJlc3Npb247CisgICAgfQorKi8KKworICAgIHByb3RlY3RlZCBFeHByZXNzaW9uIGxpc3RFeHByZXNzaW9uKEFTVCBsaXN0Tm9kZSkgeworICAgICAgICBMaXN0IGV4cHJlc3Npb25zID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBBU1QgZWxpc3QgPSBsaXN0Tm9kZS5nZXRGaXJzdENoaWxkKCk7CisgICAgICAgIGFzc2VydE5vZGVUeXBlKEVMSVNULCBlbGlzdCk7CisKKyAgICAgICAgZm9yIChBU1Qgbm9kZSA9IGVsaXN0LmdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKSB7CisgICAgICAgICAgICAvLyBjaGVjayBmb3Igc3RyYXkgbGFiZWxlZCBhcmd1bWVudHM6CisgICAgICAgICAgICBzd2l0Y2ggKG5vZGUuZ2V0VHlwZSgpKSB7CisgICAgICAgICAgICBjYXNlIExBQkVMRURfQVJHOiAgICAgICBhc3NlcnROb2RlVHlwZShDT01NQSwgbm9kZSk7ICAgICAgIGJyZWFrOyAgLy8gaGVscGZ1bCBlcnJvcj8KKyAgICAgICAgICAgIGNhc2UgU1BSRUFEX01BUF9BUkc6ICAgIGFzc2VydE5vZGVUeXBlKFNQUkVBRF9BUkcsIG5vZGUpOyAgYnJlYWs7ICAvLyBoZWxwZnVsIGVycm9yCisgICAgICAgICAgICB9CisgICAgICAgICAgICBleHByZXNzaW9ucy5hZGQoZXhwcmVzc2lvbihub2RlKSk7CisgICAgICAgIH0KKyAgICAgICAgTGlzdEV4cHJlc3Npb24gbGlzdEV4cHJlc3Npb24gPSBuZXcgTGlzdEV4cHJlc3Npb24oZXhwcmVzc2lvbnMpOworICAgICAgICBjb25maWd1cmVBU1QobGlzdEV4cHJlc3Npb24sIGxpc3ROb2RlKTsKKyAgICAgICAgcmV0dXJuIGxpc3RFeHByZXNzaW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFR5cGljYWxseSBvbmx5IHVzZWQgZm9yIG1hcCBjb25zdHJ1Y3RvcnMgSSB0aGluaz8KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRXhwcmVzc2lvbiBtYXBFeHByZXNzaW9uKEFTVCBtYXBOb2RlKSB7CisgICAgICAgIExpc3QgZXhwcmVzc2lvbnMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIEFTVCBlbGlzdCA9IG1hcE5vZGUuZ2V0Rmlyc3RDaGlsZCgpOworICAgICAgICBpZiAoZWxpc3QgIT0gbnVsbCkgeyAgLy8gdG90YWxseSBlbXB0eSBpbiB0aGUgY2FzZSBvZiBbOl0KKyAgICAgICAgICAgIGFzc2VydE5vZGVUeXBlKEVMSVNULCBlbGlzdCk7CisgICAgICAgICAgICBmb3IgKEFTVCBub2RlID0gZWxpc3QuZ2V0Rmlyc3RDaGlsZCgpOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCkpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG5vZGUuZ2V0VHlwZSgpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBMQUJFTEVEX0FSRzoKKyAgICAgICAgICAgICAgICBjYXNlIFNQUkVBRF9NQVBfQVJHOgorICAgICAgICAgICAgICAgICAgICBicmVhazsgIC8vIGxlZ2FsIGNhc2VzCisgICAgICAgICAgICAgICAgY2FzZSBTUFJFQURfQVJHOgorICAgICAgICAgICAgICAgICAgICBhc3NlcnROb2RlVHlwZShTUFJFQURfTUFQX0FSRywgbm9kZSk7ICBicmVhazsgIC8vIGhlbHBmdWwgZXJyb3IKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhc3NlcnROb2RlVHlwZShMQUJFTEVEX0FSRywgbm9kZSk7ICBicmVhazsgIC8vIGhlbHBmdWwgZXJyb3IKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZXhwcmVzc2lvbnMuYWRkKG1hcEVudHJ5RXhwcmVzc2lvbihub2RlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgTWFwRXhwcmVzc2lvbiBtYXBFeHByZXNzaW9uID0gbmV3IE1hcEV4cHJlc3Npb24oZXhwcmVzc2lvbnMpOworICAgICAgICBjb25maWd1cmVBU1QobWFwRXhwcmVzc2lvbiwgbWFwTm9kZSk7CisgICAgICAgIHJldHVybiBtYXBFeHByZXNzaW9uOworICAgIH0KKworICAgIHByb3RlY3RlZCBNYXBFbnRyeUV4cHJlc3Npb24gbWFwRW50cnlFeHByZXNzaW9uKEFTVCBub2RlKSB7CisgICAgICAgIGlmIChub2RlLmdldFR5cGUoKSA9PSBTUFJFQURfTUFQX0FSRykgeworICAgICAgICAgICAgQVNUIHJpZ2h0Tm9kZSA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOworICAgICAgICAgICAgRXhwcmVzc2lvbiBrZXlFeHByZXNzaW9uID0gc3ByZWFkTWFwRXhwcmVzc2lvbihub2RlKTsKKyAgICAgICAgICAgIEV4cHJlc3Npb24gcmlnaHRFeHByZXNzaW9uID0gZXhwcmVzc2lvbihyaWdodE5vZGUpOworICAgICAgICAgICAgTWFwRW50cnlFeHByZXNzaW9uIG1hcEVudHJ5RXhwcmVzc2lvbiA9IG5ldyBNYXBFbnRyeUV4cHJlc3Npb24oa2V5RXhwcmVzc2lvbiwgcmlnaHRFeHByZXNzaW9uKTsKKyAgICAgICAgICAgIGNvbmZpZ3VyZUFTVChtYXBFbnRyeUV4cHJlc3Npb24sIG5vZGUpOworICAgICAgICAgICAgcmV0dXJuIG1hcEVudHJ5RXhwcmVzc2lvbjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIEFTVCBrZXlOb2RlID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7CisgICAgICAgICAgICBFeHByZXNzaW9uIGtleUV4cHJlc3Npb24gPSBleHByZXNzaW9uKGtleU5vZGUpOworICAgICAgICAgICAgQVNUIHZhbHVlTm9kZSA9IGtleU5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKKyAgICAgICAgICAgIEV4cHJlc3Npb24gdmFsdWVFeHByZXNzaW9uID0gZXhwcmVzc2lvbih2YWx1ZU5vZGUpOworICAgICAgICAgICAgTWFwRW50cnlFeHByZXNzaW9uIG1hcEVudHJ5RXhwcmVzc2lvbiA9IG5ldyBNYXBFbnRyeUV4cHJlc3Npb24oa2V5RXhwcmVzc2lvbiwgdmFsdWVFeHByZXNzaW9uKTsKKyAgICAgICAgICAgIGNvbmZpZ3VyZUFTVChtYXBFbnRyeUV4cHJlc3Npb24sIG5vZGUpOworICAgICAgICAgICAgcmV0dXJuIG1hcEVudHJ5RXhwcmVzc2lvbjsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHJvdGVjdGVkIEV4cHJlc3Npb24gaW5zdGFuY2VvZkV4cHJlc3Npb24oQVNUIG5vZGUpIHsKKyAgICAgICAgQVNUIGxlZnROb2RlID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7CisgICAgICAgIEV4cHJlc3Npb24gbGVmdEV4cHJlc3Npb24gPSBleHByZXNzaW9uKGxlZnROb2RlKTsKKworICAgICAgICBBU1QgcmlnaHROb2RlID0gbGVmdE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKKyAgICAgICAgQ2xhc3NOb2RlIHR5cGUgPSBidWlsZE5hbWUocmlnaHROb2RlKTsKKyAgICAgICAgYXNzZXJ0VHlwZU5vdE51bGwodHlwZSwgcmlnaHROb2RlKTsKKworICAgICAgICBFeHByZXNzaW9uIHJpZ2h0RXhwcmVzc2lvbiA9IG5ldyBDbGFzc0V4cHJlc3Npb24odHlwZSk7CisgICAgICAgIGNvbmZpZ3VyZUFTVChyaWdodEV4cHJlc3Npb24sIHJpZ2h0Tm9kZSk7CisgICAgICAgIEJpbmFyeUV4cHJlc3Npb24gYmluYXJ5RXhwcmVzc2lvbiA9IG5ldyBCaW5hcnlFeHByZXNzaW9uKGxlZnRFeHByZXNzaW9uLCBtYWtlVG9rZW4oVHlwZXMuS0VZV09SRF9JTlNUQU5DRU9GLCBub2RlKSwgcmlnaHRFeHByZXNzaW9uKTsKKyAgICAgICAgY29uZmlndXJlQVNUKGJpbmFyeUV4cHJlc3Npb24sIG5vZGUpOworICAgICAgICByZXR1cm4gYmluYXJ5RXhwcmVzc2lvbjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRUeXBlTm90TnVsbChDbGFzc05vZGUgdHlwZSwgQVNUIHJpZ2h0Tm9kZSkgeworICAgICAgICBpZiAodHlwZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQVNUUnVudGltZUV4Y2VwdGlvbihyaWdodE5vZGUsICJObyB0eXBlIGF2YWlsYWJsZSBmb3I6ICIgKyBxdWFsaWZpZWROYW1lKHJpZ2h0Tm9kZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIEV4cHJlc3Npb24gYXNFeHByZXNzaW9uKEFTVCBub2RlKSB7CisgICAgICAgIEFTVCBsZWZ0Tm9kZSA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOworICAgICAgICBFeHByZXNzaW9uIGxlZnRFeHByZXNzaW9uID0gZXhwcmVzc2lvbihsZWZ0Tm9kZSk7CisKKyAgICAgICAgQVNUIHJpZ2h0Tm9kZSA9IGxlZnROb2RlLmdldE5leHRTaWJsaW5nKCk7CisgICAgICAgIENsYXNzTm9kZSB0eXBlID0gYnVpbGROYW1lKHJpZ2h0Tm9kZSk7CisKKyAgICAgICAgcmV0dXJuIENhc3RFeHByZXNzaW9uLmFzRXhwcmVzc2lvbih0eXBlLCBsZWZ0RXhwcmVzc2lvbik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEV4cHJlc3Npb24gY2FzdEV4cHJlc3Npb24oQVNUIGNhc3ROb2RlKSB7CisgICAgICAgIEFTVCBub2RlID0gY2FzdE5vZGUuZ2V0Rmlyc3RDaGlsZCgpOworICAgICAgICBDbGFzc05vZGUgdHlwZSA9IGJ1aWxkTmFtZShub2RlKTsKKyAgICAgICAgYXNzZXJ0VHlwZU5vdE51bGwodHlwZSwgbm9kZSk7CisKKyAgICAgICAgQVNUIGV4cHJlc3Npb25Ob2RlID0gbm9kZS5nZXROZXh0U2libGluZygpOworICAgICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBleHByZXNzaW9uKGV4cHJlc3Npb25Ob2RlKTsKKworICAgICAgICBDYXN0RXhwcmVzc2lvbiBjYXN0RXhwcmVzc2lvbiA9IG5ldyBDYXN0RXhwcmVzc2lvbih0eXBlLCBleHByZXNzaW9uKTsKKyAgICAgICAgY29uZmlndXJlQVNUKGNhc3RFeHByZXNzaW9uLCBjYXN0Tm9kZSk7CisgICAgICAgIHJldHVybiBjYXN0RXhwcmVzc2lvbjsKKyAgICB9CisKKworICAgIHByb3RlY3RlZCBFeHByZXNzaW9uIGluZGV4RXhwcmVzc2lvbihBU1QgaW5kZXhOb2RlKSB7CisgICAgICAgIEFTVCBsZWZ0Tm9kZSA9IGluZGV4Tm9kZS5nZXRGaXJzdENoaWxkKCk7CisgICAgICAgIEV4cHJlc3Npb24gbGVmdEV4cHJlc3Npb24gPSBleHByZXNzaW9uKGxlZnROb2RlKTsKKworICAgICAgICBBU1QgcmlnaHROb2RlID0gbGVmdE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKKyAgICAgICAgRXhwcmVzc2lvbiByaWdodEV4cHJlc3Npb24gPSBleHByZXNzaW9uKHJpZ2h0Tm9kZSk7CisKKyAgICAgICAgQmluYXJ5RXhwcmVzc2lvbiBiaW5hcnlFeHByZXNzaW9uID0gbmV3IEJpbmFyeUV4cHJlc3Npb24obGVmdEV4cHJlc3Npb24sIG1ha2VUb2tlbihUeXBlcy5MRUZUX1NRVUFSRV9CUkFDS0VULCBpbmRleE5vZGUpLCByaWdodEV4cHJlc3Npb24pOworICAgICAgICBjb25maWd1cmVBU1QoYmluYXJ5RXhwcmVzc2lvbiwgaW5kZXhOb2RlKTsKKyAgICAgICAgcmV0dXJuIGJpbmFyeUV4cHJlc3Npb247CisgICAgfQorCisgICAgcHJvdGVjdGVkIEV4cHJlc3Npb24gYmluYXJ5RXhwcmVzc2lvbihpbnQgdHlwZSwgQVNUIG5vZGUpIHsKKyAgICAgICAgVG9rZW4gdG9rZW4gPSBtYWtlVG9rZW4odHlwZSwgbm9kZSk7CisKKyAgICAgICAgQVNUIGxlZnROb2RlID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7CisgICAgICAgIEV4cHJlc3Npb24gbGVmdEV4cHJlc3Npb24gPSBleHByZXNzaW9uKGxlZnROb2RlKTsKKworICAgICAgICBBU1QgcmlnaHROb2RlID0gbGVmdE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKKyAgICAgICAgaWYgKHJpZ2h0Tm9kZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbGVmdEV4cHJlc3Npb247CisgICAgICAgIH0KKworICAgICAgICBpZiAoVHlwZXMub2ZUeXBlKHR5cGUsIFR5cGVzLkFTU0lHTk1FTlRfT1BFUkFUT1IpKSB7CisgICAgICAgICAgICBpZiAobGVmdEV4cHJlc3Npb24gaW5zdGFuY2VvZiBWYXJpYWJsZUV4cHJlc3Npb24gfHwgbGVmdEV4cHJlc3Npb24uZ2V0Q2xhc3MoKSA9PSBQcm9wZXJ0eUV4cHJlc3Npb24uY2xhc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBsZWZ0RXhwcmVzc2lvbiBpbnN0YW5jZW9mIEZpZWxkRXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGxlZnRFeHByZXNzaW9uIGluc3RhbmNlb2YgQXR0cmlidXRlRXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGxlZnRFeHByZXNzaW9uIGluc3RhbmNlb2YgRGVjbGFyYXRpb25FeHByZXNzaW9uKSB7CisgICAgICAgICAgICAgICAgLy8gRG8gbm90aGluZy4KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGxlZnRFeHByZXNzaW9uIGluc3RhbmNlb2YgQ29uc3RhbnRFeHByZXNzaW9uKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFTVFJ1bnRpbWVFeGNlcHRpb24obm9kZSwgIlxuWyIgKyAoKENvbnN0YW50RXhwcmVzc2lvbikgbGVmdEV4cHJlc3Npb24pLmdldFZhbHVlKCkgKyAiXSBpcyBhIGNvbnN0YW50IGV4cHJlc3Npb24sIGJ1dCBpdCBzaG91bGQgYmUgYSB2YXJpYWJsZSBleHByZXNzaW9uIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChsZWZ0RXhwcmVzc2lvbiBpbnN0YW5jZW9mIEJpbmFyeUV4cHJlc3Npb24pIHsKKyAgICAgICAgICAgICAgICBFeHByZXNzaW9uIGxlZnRleHAgPSAoKEJpbmFyeUV4cHJlc3Npb24pIGxlZnRFeHByZXNzaW9uKS5nZXRMZWZ0RXhwcmVzc2lvbigpOworICAgICAgICAgICAgICAgIGludCBsZWZ0dHlwZSA9ICgoQmluYXJ5RXhwcmVzc2lvbikgbGVmdEV4cHJlc3Npb24pLmdldE9wZXJhdGlvbigpLmdldFR5cGUoKTsKKyAgICAgICAgICAgICAgICBpZiAoIVR5cGVzLm9mVHlwZShsZWZ0dHlwZSwgVHlwZXMuQVNTSUdOTUVOVF9PUEVSQVRPUikgJiYgbGVmdHR5cGUgIT0gVHlwZXMuTEVGVF9TUVVBUkVfQlJBQ0tFVCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQVNUUnVudGltZUV4Y2VwdGlvbihub2RlLCAiXG4iICsgKChCaW5hcnlFeHByZXNzaW9uKSBsZWZ0RXhwcmVzc2lvbikuZ2V0VGV4dCgpICsgIiBpcyBhIGJpbmFyeSBleHByZXNzaW9uLCBidXQgaXQgc2hvdWxkIGJlIGEgdmFyaWFibGUgZXhwcmVzc2lvbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGxlZnRFeHByZXNzaW9uIGluc3RhbmNlb2YgR1N0cmluZ0V4cHJlc3Npb24pIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQVNUUnVudGltZUV4Y2VwdGlvbihub2RlLCAiXG5cIiIgKyAoKEdTdHJpbmdFeHByZXNzaW9uKSBsZWZ0RXhwcmVzc2lvbikuZ2V0VGV4dCgpICsgIlwiIGlzIGEgR1N0cmluZyBleHByZXNzaW9uLCBidXQgaXQgc2hvdWxkIGJlIGEgdmFyaWFibGUgZXhwcmVzc2lvbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobGVmdEV4cHJlc3Npb24gaW5zdGFuY2VvZiBNZXRob2RDYWxsRXhwcmVzc2lvbikgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBU1RSdW50aW1lRXhjZXB0aW9uKG5vZGUsICJcblwiIiArICgoTWV0aG9kQ2FsbEV4cHJlc3Npb24pIGxlZnRFeHByZXNzaW9uKS5nZXRUZXh0KCkgKyAiXCIgaXMgYSBtZXRob2QgY2FsbCBleHByZXNzaW9uLCBidXQgaXQgc2hvdWxkIGJlIGEgdmFyaWFibGUgZXhwcmVzc2lvbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobGVmdEV4cHJlc3Npb24gaW5zdGFuY2VvZiBNYXBFeHByZXNzaW9uKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFTVFJ1bnRpbWVFeGNlcHRpb24obm9kZSwgIlxuJyIgKyAoKE1hcEV4cHJlc3Npb24pIGxlZnRFeHByZXNzaW9uKS5nZXRUZXh0KCkgKyAiJyBpcyBhIG1hcCBleHByZXNzaW9uLCBidXQgaXQgc2hvdWxkIGJlIGEgdmFyaWFibGUgZXhwcmVzc2lvbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFTVFJ1bnRpbWVFeGNlcHRpb24obm9kZSwgIlxuIiArIGxlZnRFeHByZXNzaW9uLmdldENsYXNzKCkgKyAiLCB3aXRoIGl0cyB2YWx1ZSAnIiArIGxlZnRFeHByZXNzaW9uLmdldFRleHQoKSArICInLCBpcyBhIGJhZCBleHByZXNzaW9uIGFzIHRoZSBMU0ggb2YgYW4gYXNzaWdubWVudCBvcGVyYXRvciIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qaWYgKHJpZ2h0Tm9kZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIk5vIHJpZ2h0Tm9kZSBhc3NvY2lhdGVkIHdpdGggYmluYXJ5IGV4cHJlc3Npb24iKTsKKyAgICAgICAgfSovCisgICAgICAgIEV4cHJlc3Npb24gcmlnaHRFeHByZXNzaW9uID0gZXhwcmVzc2lvbihyaWdodE5vZGUpOworICAgICAgICBCaW5hcnlFeHByZXNzaW9uIGJpbmFyeUV4cHJlc3Npb24gPSBuZXcgQmluYXJ5RXhwcmVzc2lvbihsZWZ0RXhwcmVzc2lvbiwgdG9rZW4sIHJpZ2h0RXhwcmVzc2lvbik7CisgICAgICAgIGNvbmZpZ3VyZUFTVChiaW5hcnlFeHByZXNzaW9uLCBub2RlKTsKKyAgICAgICAgcmV0dXJuIGJpbmFyeUV4cHJlc3Npb247CisgICAgfQorCisgICAgcHJvdGVjdGVkIEV4cHJlc3Npb24gcHJlZml4RXhwcmVzc2lvbihBU1Qgbm9kZSwgaW50IHRva2VuKSB7CisgICAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24obm9kZS5nZXRGaXJzdENoaWxkKCkpOworICAgICAgICBQcmVmaXhFeHByZXNzaW9uIHByZWZpeEV4cHJlc3Npb24gPSBuZXcgUHJlZml4RXhwcmVzc2lvbihtYWtlVG9rZW4odG9rZW4sIG5vZGUpLCBleHByZXNzaW9uKTsKKyAgICAgICAgY29uZmlndXJlQVNUKHByZWZpeEV4cHJlc3Npb24sIG5vZGUpOworICAgICAgICByZXR1cm4gcHJlZml4RXhwcmVzc2lvbjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgRXhwcmVzc2lvbiBwb3N0Zml4RXhwcmVzc2lvbihBU1Qgbm9kZSwgaW50IHRva2VuKSB7CisgICAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24obm9kZS5nZXRGaXJzdENoaWxkKCkpOworICAgICAgICBQb3N0Zml4RXhwcmVzc2lvbiBwb3N0Zml4RXhwcmVzc2lvbiA9IG5ldyBQb3N0Zml4RXhwcmVzc2lvbihleHByZXNzaW9uLCBtYWtlVG9rZW4odG9rZW4sIG5vZGUpKTsKKyAgICAgICAgY29uZmlndXJlQVNUKHBvc3RmaXhFeHByZXNzaW9uLCBub2RlKTsKKyAgICAgICAgcmV0dXJuIHBvc3RmaXhFeHByZXNzaW9uOworICAgIH0KKworICAgIHByb3RlY3RlZCBCb29sZWFuRXhwcmVzc2lvbiBib29sZWFuRXhwcmVzc2lvbihBU1Qgbm9kZSkgeworICAgICAgICBCb29sZWFuRXhwcmVzc2lvbiBib29sZWFuRXhwcmVzc2lvbiA9IG5ldyBCb29sZWFuRXhwcmVzc2lvbihleHByZXNzaW9uKG5vZGUpKTsKKyAgICAgICAgY29uZmlndXJlQVNUKGJvb2xlYW5FeHByZXNzaW9uLCBub2RlKTsKKyAgICAgICAgcmV0dXJuIGJvb2xlYW5FeHByZXNzaW9uOworICAgIH0KKworICAgIHByb3RlY3RlZCBFeHByZXNzaW9uIGRvdEV4cHJlc3Npb24oQVNUIG5vZGUpIHsKKyAgICAgICAgLy8gbGV0cyBkZWNpZGUgaWYgdGhpcyBpcyBhIHByb3BlcnkgaW52b2NhdGlvbiBvciBhIG1ldGhvZCBjYWxsCisgICAgICAgIEFTVCBsZWZ0Tm9kZSA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOworICAgICAgICBpZiAobGVmdE5vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgQVNUIGlkZW50aWZpZXJOb2RlID0gbGVmdE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKKyAgICAgICAgICAgIGlmIChpZGVudGlmaWVyTm9kZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgRXhwcmVzc2lvbiBsZWZ0RXhwcmVzc2lvbiA9IGV4cHJlc3Npb24obGVmdE5vZGUpOworICAgICAgICAgICAgICAgIGlmIChpc1R5cGUoU0VMRUNUX1NMT1QsIGlkZW50aWZpZXJOb2RlKSkgeworICAgICAgICAgICAgICAgICAgICBFeHByZXNzaW9uIGZpZWxkID0gZXhwcmVzc2lvbihpZGVudGlmaWVyTm9kZS5nZXRGaXJzdENoaWxkKCksdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUV4cHJlc3Npb24gYXR0cmlidXRlRXhwcmVzc2lvbiA9IG5ldyBBdHRyaWJ1dGVFeHByZXNzaW9uKGxlZnRFeHByZXNzaW9uLCBmaWVsZCwgbm9kZS5nZXRUeXBlKCkgIT0gRE9UKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUuZ2V0VHlwZSgpID09IFNQUkVBRF9ET1QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZUV4cHJlc3Npb24uc2V0U3ByZWFkU2FmZSh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjb25maWd1cmVBU1QoYXR0cmlidXRlRXhwcmVzc2lvbiwgbm9kZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVFeHByZXNzaW9uOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBFeHByZXNzaW9uIHByb3BlcnR5ID0gZXhwcmVzc2lvbihpZGVudGlmaWVyTm9kZSx0cnVlKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBQcm9wZXJ0eUV4cHJlc3Npb24gcHJvcGVydHlFeHByZXNzaW9uID0gbmV3IFByb3BlcnR5RXhwcmVzc2lvbihsZWZ0RXhwcmVzc2lvbiwgcHJvcGVydHksIG5vZGUuZ2V0VHlwZSgpICE9IERPVCk7CisgICAgICAgICAgICAgICAgaWYgKG5vZGUuZ2V0VHlwZSgpID09IFNQUkVBRF9ET1QpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlFeHByZXNzaW9uLnNldFNwcmVhZFNhZmUodHJ1ZSk7CisgICAgICAgICAgICAgICAgfSAKKyAgICAgICAgICAgICAgICBjb25maWd1cmVBU1QocHJvcGVydHlFeHByZXNzaW9uLCBub2RlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcHJvcGVydHlFeHByZXNzaW9uOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBtZXRob2RDYWxsRXhwcmVzc2lvbihub2RlKTsKKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIEV4cHJlc3Npb24gc3BlY2lhbENvbnN0cnVjdG9yQ2FsbEV4cHJlc3Npb24oQVNUIG1ldGhvZENhbGxOb2RlLCBDbGFzc05vZGUgc3BlY2lhbCkgeworICAgICAgICBBU1Qgbm9kZSA9IG1ldGhvZENhbGxOb2RlLmdldEZpcnN0Q2hpbGQoKTsKKyAgICAgICAgRXhwcmVzc2lvbiBhcmd1bWVudHMgPSBhcmd1bWVudHMobm9kZSk7CisgICAgICAgIAorICAgICAgICBDb25zdHJ1Y3RvckNhbGxFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBuZXcgQ29uc3RydWN0b3JDYWxsRXhwcmVzc2lvbihzcGVjaWFsLCBhcmd1bWVudHMpOworICAgICAgICBjb25maWd1cmVBU1QoZXhwcmVzc2lvbiwgbWV0aG9kQ2FsbE5vZGUpOworICAgICAgICByZXR1cm4gZXhwcmVzc2lvbjsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBnZXRUeXBlSW5QYXJlbnRoZXNpcyhBU1Qgbm9kZSkgeworICAgICAgICBpZiAoISBpc1R5cGUoRVhQUixub2RlKSApIG5vZGUgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKKyAgICAgICAgd2hpbGUgKG5vZGUhPW51bGwgJiZpc1R5cGUoRVhQUixub2RlKSAmJiBub2RlLmdldE5leHRTaWJsaW5nKCk9PW51bGwpIHsKKyAgICAgICAgICAgIG5vZGUgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobm9kZT09bnVsbCkgcmV0dXJuIC0xOworICAgICAgICByZXR1cm4gbm9kZS5nZXRUeXBlKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEV4cHJlc3Npb24gbWV0aG9kQ2FsbEV4cHJlc3Npb24oQVNUIG1ldGhvZENhbGxOb2RlKSB7CisgICAgICAgIEFTVCBub2RlID0gbWV0aG9kQ2FsbE5vZGUuZ2V0Rmlyc3RDaGlsZCgpOworICAgICAgICAvKiAvLyBCYWQgaWRlYSwgc2luY2UgZm9vKDEpKDIpIGlzIHZhbGlkIEdyb292eSBmb3IgZm9vKDEpLmNhbGwoMikuCisgICAgICAgIGlmIChpc1R5cGUoTUVUSE9EX0NBTEwsIG5vZGUpKSB7CisgICAgICAgICAgICAvLyBzb21ldGltZXMgbWV0aG9kIGNhbGxzIGdldCB3cmFwcGVkIGluIG1ldGhvZCBjYWxscyBmb3Igc29tZSB3aWVyZCByZWFzb24KKyAgICAgICAgICAgIHJldHVybiBtZXRob2RDYWxsRXhwcmVzc2lvbihub2RlKTsKKyAgICAgICAgfQorICAgICAgICAqLworCisgICAgICAgIEV4cHJlc3Npb24gb2JqZWN0RXhwcmVzc2lvbjsKKyAgICAgICAgQVNUIHNlbGVjdG9yOworICAgICAgICBBU1QgZWxpc3QgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7CisgICAgICAgIAorICAgICAgICBib29sZWFuIGltcGxpY2l0VGhpcyA9IGZhbHNlOworICAgICAgICBib29sZWFuIHNhZmUgPSBpc1R5cGUoT1BUSU9OQUxfRE9ULCBub2RlKTsKKyAgICAgICAgYm9vbGVhbiBzcHJlYWRTYWZlID0gaXNUeXBlKFNQUkVBRF9ET1QsIG5vZGUpOworICAgICAgICBpZiAoaXNUeXBlKERPVCwgbm9kZSkgfHwgc2FmZSB8fCBzcHJlYWRTYWZlKSB7CisgICAgICAgICAgICBBU1Qgb2JqZWN0Tm9kZSA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOworICAgICAgICAgICAgb2JqZWN0RXhwcmVzc2lvbiA9IGV4cHJlc3Npb24ob2JqZWN0Tm9kZSk7CisgICAgICAgICAgICBzZWxlY3RvciA9IG9iamVjdE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGltcGxpY2l0VGhpcyA9IHRydWU7CisgICAgICAgICAgICBvYmplY3RFeHByZXNzaW9uID0gVmFyaWFibGVFeHByZXNzaW9uLlRISVNfRVhQUkVTU0lPTjsKKyAgICAgICAgICAgIHNlbGVjdG9yID0gbm9kZTsKKyAgICAgICAgfSAKKworICAgICAgICBFeHByZXNzaW9uIG5hbWUgPSBudWxsOworICAgICAgICBpZiAoaXNUeXBlKExJVEVSQUxfc3VwZXIsIHNlbGVjdG9yKSkgeworICAgICAgICAgICAgaW1wbGljaXRUaGlzID0gdHJ1ZTsKKyAgICAgICAgICAgIG5hbWUgPSBuZXcgQ29uc3RhbnRFeHByZXNzaW9uKCJzdXBlciIpOworICAgICAgICAgICAgaWYgKG9iamVjdEV4cHJlc3Npb24gPT0gVmFyaWFibGVFeHByZXNzaW9uLlRISVNfRVhQUkVTU0lPTikgeworICAgICAgICAgICAgICAgIG9iamVjdEV4cHJlc3Npb24gPSBWYXJpYWJsZUV4cHJlc3Npb24uU1VQRVJfRVhQUkVTU0lPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChpc1ByaW1pdGl2ZVR5cGVMaXRlcmFsKHNlbGVjdG9yKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFTVFJ1bnRpbWVFeGNlcHRpb24oc2VsZWN0b3IsICJQcmltaXRpdmUgdHlwZSBsaXRlcmFsOiAiICsgc2VsZWN0b3IuZ2V0VGV4dCgpCisgICAgICAgICAgICAgICAgICAgICsgIiBjYW5ub3QgYmUgdXNlZCBhcyBhIG1ldGhvZCBuYW1lIik7CisgICAgICAgIH0gZWxzZSBpZiAoaXNUeXBlKFNFTEVDVF9TTE9ULCBzZWxlY3RvcikpIHsKKyAgICAgICAgICAgIEV4cHJlc3Npb24gZmllbGQgPSBleHByZXNzaW9uKHNlbGVjdG9yLmdldEZpcnN0Q2hpbGQoKSx0cnVlKTsKKyAgICAgICAgICAgIEF0dHJpYnV0ZUV4cHJlc3Npb24gYXR0cmlidXRlRXhwcmVzc2lvbiA9IG5ldyBBdHRyaWJ1dGVFeHByZXNzaW9uKG9iamVjdEV4cHJlc3Npb24sIGZpZWxkLCBub2RlLmdldFR5cGUoKSAhPSBET1QpOworICAgICAgICAgICAgY29uZmlndXJlQVNUKGF0dHJpYnV0ZUV4cHJlc3Npb24sIG5vZGUpOworICAgICAgICAgICAgRXhwcmVzc2lvbiBhcmd1bWVudHMgPSBhcmd1bWVudHMoZWxpc3QpOworICAgICAgICAgICAgTWV0aG9kQ2FsbEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IG5ldyBNZXRob2RDYWxsRXhwcmVzc2lvbihhdHRyaWJ1dGVFeHByZXNzaW9uLCAiY2FsbCIsIGFyZ3VtZW50cyk7CisgICAgICAgICAgICBjb25maWd1cmVBU1QoZXhwcmVzc2lvbiwgbWV0aG9kQ2FsbE5vZGUpOworICAgICAgICAgICAgcmV0dXJuIGV4cHJlc3Npb247CisgICAgICAgIH0gZWxzZSBpZiAgCisgICAgICAgICAgICAgICAoaXNUeXBlKERZTkFNSUNfTUVNQkVSLCBzZWxlY3RvcikgfHwgaXNUeXBlKElERU5ULHNlbGVjdG9yKSB8fCAKKyAgICAgICAgICAgICAgICBpc1R5cGUoU1RSSU5HX0NPTlNUUlVDVE9SLHNlbGVjdG9yKSB8fCBpc1R5cGUgKFNUUklOR19MSVRFUkFMLHNlbGVjdG9yKSkgCisgICAgICAgIHsgCisgICAgICAgICAgICBuYW1lID0gZXhwcmVzc2lvbihzZWxlY3Rvcix0cnVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGltcGxpY2l0VGhpcyA9IGZhbHNlOworICAgICAgICAgICAgbmFtZSA9IG5ldyBDb25zdGFudEV4cHJlc3Npb24oImNhbGwiKTsKKyAgICAgICAgICAgIG9iamVjdEV4cHJlc3Npb24gPSBleHByZXNzaW9uKHNlbGVjdG9yLHRydWUpOworICAgICAgICB9IAorCisgICAgICAgIEV4cHJlc3Npb24gYXJndW1lbnRzID0gYXJndW1lbnRzKGVsaXN0KTsKKyAgICAgICAgTWV0aG9kQ2FsbEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IG5ldyBNZXRob2RDYWxsRXhwcmVzc2lvbihvYmplY3RFeHByZXNzaW9uLCBuYW1lLCBhcmd1bWVudHMpOworICAgICAgICBleHByZXNzaW9uLnNldFNhZmUoc2FmZSk7CisgICAgICAgIGV4cHJlc3Npb24uc2V0U3ByZWFkU2FmZShzcHJlYWRTYWZlKTsKKyAgICAgICAgZXhwcmVzc2lvbi5zZXRJbXBsaWNpdFRoaXMoaW1wbGljaXRUaGlzKTsKKyAgICAgICAgRXhwcmVzc2lvbiByZXQgPSBleHByZXNzaW9uOworICAgICAgICAvL0ZJWE1FOiBkbyB3ZSByZWFsbHkgd2FudCB0aGlzKCkgdG8gY3JlYXRlIGEgbmV3IG9iamVjdCByZWdhcmRsZXNzCisgICAgICAgIC8vIHRoZSBwb3NpdGlvbi4uIGZvciBleGFtcGxlIG5vdCBhcyBmaXJzdCBzdGF0ZW1lbnQgaW4gYSBjb25zdHJ1Y3RvcgorICAgICAgICAvLyB0aGlzPWZpcnN0IHN0YXRlbWVudCBpbiBjb25zdHJ1Y3RvciBpcyBoYW5kbGVkIGJ5IHNwZWNpYWxDb25zdHJ1Y3RvckNhbGxFeHByZXNzaW9uCisgICAgICAgIC8vIHdlIG1heSBoYXZlIHRvIGFkZCBhIGNoZWNrIGFuZCByZW1vdmUgdGhpcyBwYXJ0IG9mIHRoZSBjb2RlCisgICAgICAgIGlmIChpbXBsaWNpdFRoaXMgJiYgInRoaXMiLmVxdWFscyhleHByZXNzaW9uLmdldE1ldGhvZEFzU3RyaW5nKCkpKSB7CisgICAgICAgICAgICByZXQgPSBuZXcgQ29uc3RydWN0b3JDYWxsRXhwcmVzc2lvbih0aGlzLmNsYXNzTm9kZSwgYXJndW1lbnRzKTsKKyAgICAgICAgfQorICAgICAgICBjb25maWd1cmVBU1QocmV0LCBtZXRob2RDYWxsTm9kZSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCBFeHByZXNzaW9uIGNvbnN0cnVjdG9yQ2FsbEV4cHJlc3Npb24oQVNUIG5vZGUpIHsKKyAgICAgICAgQVNUIGNvbnN0cnVjdG9yQ2FsbE5vZGUgPSBub2RlOworICAgICAgICBDbGFzc05vZGUgdHlwZSA9IGJ1aWxkTmFtZShjb25zdHJ1Y3RvckNhbGxOb2RlKTsKKworICAgICAgICBpZiAoaXNUeXBlKENUT1JfQ0FMTCwgbm9kZSkgfHwgaXNUeXBlKExJVEVSQUxfbmV3LCBub2RlKSkgeworICAgICAgICAgICAgbm9kZSA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQVNUIGVsaXN0ID0gbm9kZS5nZXROZXh0U2libGluZygpOworCisgICAgICAgIGlmIChlbGlzdCA9PSBudWxsICYmIGlzVHlwZShFTElTVCwgbm9kZSkpIHsKKyAgICAgICAgICAgIGVsaXN0ID0gbm9kZTsKKyAgICAgICAgICAgIGlmICgiKCIuZXF1YWxzKHR5cGUuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgIHR5cGUgPSBjbGFzc05vZGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoaXNUeXBlKEFSUkFZX0RFQ0xBUkFUT1IsIGVsaXN0KSkgeworICAgICAgICAgICAgQVNUIGV4cHJlc3Npb25Ob2RlID0gZWxpc3QuZ2V0Rmlyc3RDaGlsZCgpOworICAgICAgICAgICAgaWYgKGV4cHJlc3Npb25Ob2RlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQVNUUnVudGltZUV4Y2VwdGlvbihlbGlzdCwgIk5vIGV4cHJlc3Npb24gZm9yIHRoZSBhcnJheSBjb25zdHJ1Y3RvciBjYWxsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBMaXN0IHNpemUgPSBhcnJheVNpemVFeHByZXNzaW9uKGV4cHJlc3Npb25Ob2RlKTsKKyAgICAgICAgICAgIEFycmF5RXhwcmVzc2lvbiBhcnJheUV4cHJlc3Npb24gPSBuZXcgQXJyYXlFeHByZXNzaW9uKHR5cGUsIG51bGwsIHNpemUpOworICAgICAgICAgICAgY29uZmlndXJlQVNUKGFycmF5RXhwcmVzc2lvbiwgY29uc3RydWN0b3JDYWxsTm9kZSk7CisgICAgICAgICAgICByZXR1cm4gYXJyYXlFeHByZXNzaW9uOworICAgICAgICB9CisgICAgICAgIEV4cHJlc3Npb24gYXJndW1lbnRzID0gYXJndW1lbnRzKGVsaXN0KTsKKyAgICAgICAgQ29uc3RydWN0b3JDYWxsRXhwcmVzc2lvbiBleHByZXNzaW9uID0gbmV3IENvbnN0cnVjdG9yQ2FsbEV4cHJlc3Npb24odHlwZSwgYXJndW1lbnRzKTsKKyAgICAgICAgY29uZmlndXJlQVNUKGV4cHJlc3Npb24sIGNvbnN0cnVjdG9yQ2FsbE5vZGUpOworICAgICAgICByZXR1cm4gZXhwcmVzc2lvbjsKKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIExpc3QgYXJyYXlTaXplRXhwcmVzc2lvbihBU1Qgbm9kZSkgeworICAgICAgICBMaXN0IGxpc3Q7CisgICAgICAgIEV4cHJlc3Npb24gc2l6ZSA9IG51bGw7CisgICAgCWlmIChpc1R5cGUoQVJSQVlfREVDTEFSQVRPUixub2RlKSkgeworICAgIAkJQVNUIHJpZ2h0ID0gbm9kZS5nZXROZXh0U2libGluZygpOworICAgICAgICAJaWYgKHJpZ2h0IT1udWxsKSB7CisgICAgICAgIAkJc2l6ZSA9IGV4cHJlc3Npb24ocmlnaHQpOworICAgICAgICAJfSBlbHNlIHsKKyAgICAgICAgCQlzaXplID0gQ29uc3RhbnRFeHByZXNzaW9uLkVNVFBZX0VYUFJFU1NJT047CisgICAgICAgIAl9CisgICAgICAgIAlsaXN0ID0gYXJyYXlTaXplRXhwcmVzc2lvbihub2RlLmdldEZpcnN0Q2hpbGQoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgIAlzaXplID0gZXhwcmVzc2lvbihub2RlKTsKKyAgICAgICAgCWxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIH0KKyAgICAJbGlzdC5hZGQoc2l6ZSk7CisgICAgCXJldHVybiBsaXN0OworICAgIH0KKworICAgIHByb3RlY3RlZCBFeHByZXNzaW9uIGFyZ3VtZW50cyhBU1QgZWxpc3QpIHsKKyAgICAgICAgTGlzdCBleHByZXNzaW9uTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgLy8gRklYTUU6IGFsbCBsYWJlbGVkIGFyZ3VtZW50cyBzaG91bGQgZm9sbG93IGFueSB1bmxhYmVsZWQgYXJndW1lbnRzCisgICAgICAgIGJvb2xlYW4gbmFtZWRBcmd1bWVudHMgPSBmYWxzZTsKKyAgICAgICAgZm9yIChBU1Qgbm9kZSA9IGVsaXN0OyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCkpIHsKKyAgICAgICAgICAgIGlmIChpc1R5cGUoRUxJU1QsIG5vZGUpKSB7CisgICAgICAgICAgICAgICAgZm9yIChBU1QgY2hpbGQgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7CisgICAgICAgICAgICAgICAgICAgIG5hbWVkQXJndW1lbnRzIHw9IGFkZEFyZ3VtZW50RXhwcmVzc2lvbihjaGlsZCwgZXhwcmVzc2lvbkxpc3QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIG5hbWVkQXJndW1lbnRzIHw9IGFkZEFyZ3VtZW50RXhwcmVzc2lvbihub2RlLCBleHByZXNzaW9uTGlzdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5hbWVkQXJndW1lbnRzKSB7CisgICAgICAgICAgICBpZiAoIWV4cHJlc3Npb25MaXN0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIC8vIGxldHMgcmVtb3ZlIGFueSBub24tTWFwRW50cnlFeHByZXNzaW9uIGluc3RhbmNlcworICAgICAgICAgICAgICAgIC8vIHN1Y2ggYXMgaWYgdGhlIGxhc3QgZXhwcmVzc2lvbiBpcyBhIENsb3N1cmVFeHByZXNzaW9uCisgICAgICAgICAgICAgICAgLy8gc28gbGV0cyB3cmFwIHRoZSBuYW1lZCBtZXRob2QgY2FsbHMgaW4gYSBNYXAgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgIExpc3QgYXJndW1lbnRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGV4cHJlc3Npb25MaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSAoRXhwcmVzc2lvbikgaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBNYXBFbnRyeUV4cHJlc3Npb24pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudExpc3QuYWRkKGV4cHJlc3Npb24pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghYXJndW1lbnRMaXN0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uTGlzdC5yZW1vdmVBbGwoYXJndW1lbnRMaXN0KTsKKyAgICAgICAgICAgICAgICAgICAgTWFwRXhwcmVzc2lvbiBtYXBFeHByZXNzaW9uID0gbmV3IE1hcEV4cHJlc3Npb24oZXhwcmVzc2lvbkxpc3QpOworICAgICAgICAgICAgICAgICAgICBjb25maWd1cmVBU1QobWFwRXhwcmVzc2lvbiwgZWxpc3QpOworICAgICAgICAgICAgICAgICAgICBhcmd1bWVudExpc3QuYWRkKDAsIG1hcEV4cHJlc3Npb24pOworICAgICAgICAgICAgICAgICAgICBBcmd1bWVudExpc3RFeHByZXNzaW9uIGFyZ3VtZW50TGlzdEV4cHJlc3Npb24gPSBuZXcgQXJndW1lbnRMaXN0RXhwcmVzc2lvbihhcmd1bWVudExpc3QpOworICAgICAgICAgICAgICAgICAgICBjb25maWd1cmVBU1QoYXJndW1lbnRMaXN0RXhwcmVzc2lvbiwgZWxpc3QpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJndW1lbnRMaXN0RXhwcmVzc2lvbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBOYW1lZEFyZ3VtZW50TGlzdEV4cHJlc3Npb24gbmFtZWRBcmd1bWVudExpc3RFeHByZXNzaW9uID0gbmV3IE5hbWVkQXJndW1lbnRMaXN0RXhwcmVzc2lvbihleHByZXNzaW9uTGlzdCk7CisgICAgICAgICAgICBjb25maWd1cmVBU1QobmFtZWRBcmd1bWVudExpc3RFeHByZXNzaW9uLCBlbGlzdCk7CisgICAgICAgICAgICByZXR1cm4gbmFtZWRBcmd1bWVudExpc3RFeHByZXNzaW9uOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgQXJndW1lbnRMaXN0RXhwcmVzc2lvbiBhcmd1bWVudExpc3RFeHByZXNzaW9uID0gbmV3IEFyZ3VtZW50TGlzdEV4cHJlc3Npb24oZXhwcmVzc2lvbkxpc3QpOworICAgICAgICAgICAgY29uZmlndXJlQVNUKGFyZ3VtZW50TGlzdEV4cHJlc3Npb24sIGVsaXN0KTsKKyAgICAgICAgICAgIHJldHVybiBhcmd1bWVudExpc3RFeHByZXNzaW9uOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gYWRkQXJndW1lbnRFeHByZXNzaW9uKEFTVCBub2RlLCBMaXN0IGV4cHJlc3Npb25MaXN0KSB7CisgICAgICAgIGlmIChub2RlLmdldFR5cGUoKSA9PSBTUFJFQURfTUFQX0FSRykgeworICAgICAgICAgICAgQVNUIHJpZ2h0Tm9kZSA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOworICAgICAgICAgICAgRXhwcmVzc2lvbiBrZXlFeHByZXNzaW9uID0gc3ByZWFkTWFwRXhwcmVzc2lvbihub2RlKTsKKyAgICAgICAgICAgIEV4cHJlc3Npb24gcmlnaHRFeHByZXNzaW9uID0gZXhwcmVzc2lvbihyaWdodE5vZGUpOworICAgICAgICAgICAgTWFwRW50cnlFeHByZXNzaW9uIG1hcEVudHJ5RXhwcmVzc2lvbiA9IG5ldyBNYXBFbnRyeUV4cHJlc3Npb24oa2V5RXhwcmVzc2lvbiwgcmlnaHRFeHByZXNzaW9uKTsKKyAgICAgICAgICAgIGV4cHJlc3Npb25MaXN0LmFkZChtYXBFbnRyeUV4cHJlc3Npb24pOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBleHByZXNzaW9uKG5vZGUpOworICAgICAgICAgICAgZXhwcmVzc2lvbkxpc3QuYWRkKGV4cHJlc3Npb24pOworICAgICAgICAgICAgcmV0dXJuIGV4cHJlc3Npb24gaW5zdGFuY2VvZiBNYXBFbnRyeUV4cHJlc3Npb247CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgRXhwcmVzc2lvbiBleHByZXNzaW9uTGlzdChBU1Qgbm9kZSkgeworICAgICAgICBMaXN0IGV4cHJlc3Npb25MaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBmb3IgKEFTVCBjaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKKyAgICAgICAgICAgIGV4cHJlc3Npb25MaXN0LmFkZChleHByZXNzaW9uKGNoaWxkKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGV4cHJlc3Npb25MaXN0LnNpemUoKSA9PSAxKSB7CisgICAgICAgICAgICByZXR1cm4gKEV4cHJlc3Npb24pIGV4cHJlc3Npb25MaXN0LmdldCgwKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIExpc3RFeHByZXNzaW9uIGxpc3RFeHByZXNzaW9uID0gbmV3IExpc3RFeHByZXNzaW9uKGV4cHJlc3Npb25MaXN0KTsKKyAgICAgICAgICAgIGNvbmZpZ3VyZUFTVChsaXN0RXhwcmVzc2lvbiwgbm9kZSk7CisgICAgICAgICAgICByZXR1cm4gbGlzdEV4cHJlc3Npb247CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQ2xvc3VyZUV4cHJlc3Npb24gY2xvc3VyZUV4cHJlc3Npb24oQVNUIG5vZGUpIHsKKyAgICAgICAgQVNUIHBhcmFtTm9kZSA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOworICAgICAgICBQYXJhbWV0ZXJbXSBwYXJhbWV0ZXJzID0gbnVsbDsKKyAgICAgICAgQVNUIGNvZGVOb2RlID0gcGFyYW1Ob2RlOworICAgICAgICBpZiAoaXNUeXBlKFBBUkFNRVRFUlMsIHBhcmFtTm9kZSkgfHwgaXNUeXBlKElNUExJQ0lUX1BBUkFNRVRFUlMsIHBhcmFtTm9kZSkpIHsKKyAgICAgICAgICAgIHBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzKHBhcmFtTm9kZSk7CisgICAgICAgICAgICBjb2RlTm9kZSA9IHBhcmFtTm9kZS5nZXROZXh0U2libGluZygpOworICAgICAgICB9CisgICAgICAgIFN0YXRlbWVudCBjb2RlID0gc3RhdGVtZW50TGlzdE5vQ2hpbGQoY29kZU5vZGUpOworICAgICAgICBDbG9zdXJlRXhwcmVzc2lvbiBjbG9zdXJlRXhwcmVzc2lvbiA9IG5ldyBDbG9zdXJlRXhwcmVzc2lvbihwYXJhbWV0ZXJzLCBjb2RlKTsKKyAgICAgICAgY29uZmlndXJlQVNUKGNsb3N1cmVFeHByZXNzaW9uLCBub2RlKTsKKyAgICAgICAgcmV0dXJuIGNsb3N1cmVFeHByZXNzaW9uOworICAgIH0KKworICAgIHByb3RlY3RlZCBFeHByZXNzaW9uIGJsb2NrRXhwcmVzc2lvbihBU1Qgbm9kZSkgeworICAgICAgICBBU1QgY29kZU5vZGUgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKKyAgICAgICAgaWYgKGNvZGVOb2RlID09IG51bGwpICByZXR1cm4gQ29uc3RhbnRFeHByZXNzaW9uLk5VTEw7CisgICAgICAgIGlmIChjb2RlTm9kZS5nZXRUeXBlKCkgPT0gRVhQUiAmJiBjb2RlTm9kZS5nZXROZXh0U2libGluZygpID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIFNpbXBsaWZ5IGNvbW1vbiBjYXNlIG9mIHtleHByfSB0byBleHByLgorICAgICAgICAgICAgcmV0dXJuIGV4cHJlc3Npb24oY29kZU5vZGUpOworICAgICAgICB9CisgICAgICAgIFBhcmFtZXRlcltdIHBhcmFtZXRlcnMgPSBQYXJhbWV0ZXIuRU1QVFlfQVJSQVk7CisgICAgICAgIFN0YXRlbWVudCBjb2RlID0gc3RhdGVtZW50TGlzdE5vQ2hpbGQoY29kZU5vZGUpOworICAgICAgICBDbG9zdXJlRXhwcmVzc2lvbiBjbG9zdXJlRXhwcmVzc2lvbiA9IG5ldyBDbG9zdXJlRXhwcmVzc2lvbihwYXJhbWV0ZXJzLCBjb2RlKTsKKyAgICAgICAgY29uZmlndXJlQVNUKGNsb3N1cmVFeHByZXNzaW9uLCBub2RlKTsKKyAgICAgICAgLy8gQ2FsbCBpdCBpbW1lZGlhdGVseS4KKyAgICAgICAgU3RyaW5nIGNhbGxOYW1lID0gImNhbGwiOworICAgICAgICBFeHByZXNzaW9uIG5vQXJndW1lbnRzID0gbmV3IEFyZ3VtZW50TGlzdEV4cHJlc3Npb24oKTsKKyAgICAgICAgTWV0aG9kQ2FsbEV4cHJlc3Npb24gY2FsbCA9IG5ldyBNZXRob2RDYWxsRXhwcmVzc2lvbihjbG9zdXJlRXhwcmVzc2lvbiwgY2FsbE5hbWUsIG5vQXJndW1lbnRzKTsKKyAgICAgICAgY29uZmlndXJlQVNUKGNhbGwsIG5vZGUpOworICAgICAgICByZXR1cm4gY2FsbDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgRXhwcmVzc2lvbiB1bmFyeU1pbnVzRXhwcmVzc2lvbihBU1QgdW5hcnlNaW51c0V4cHIpIHsKKyAgICAgICAgQVNUIG5vZGUgPSB1bmFyeU1pbnVzRXhwci5nZXRGaXJzdENoaWxkKCk7CisKKyAgICAgICAgLy8gaWYgd2UgYXJlIGEgbnVtYmVyIGxpdGVyYWwgdGhlbiBsZXRzIGp1c3QgcGFyc2UgaXQKKyAgICAgICAgLy8gYXMgdGhlIG5lZ2F0aW9uIG9wZXJhdG9yIG9uIE1JTl9JTlQgY2F1c2VzIHJvdW5kaW5nIHRvIGEgbG9uZworICAgICAgICBTdHJpbmcgdGV4dCA9IG5vZGUuZ2V0VGV4dCgpOworICAgICAgICBzd2l0Y2ggKG5vZGUuZ2V0VHlwZSgpKSB7CisgICAgICAgICAgICBjYXNlIE5VTV9ET1VCTEU6CisgICAgICAgICAgICBjYXNlIE5VTV9GTE9BVDoKKyAgICAgICAgICAgIGNhc2UgTlVNX0JJR19ERUNJTUFMOgorICAgICAgICAgICAgICAgIENvbnN0YW50RXhwcmVzc2lvbiBjb25zdGFudEV4cHJlc3Npb24gPSBuZXcgQ29uc3RhbnRFeHByZXNzaW9uKE51bWJlcnMucGFyc2VEZWNpbWFsKCItIiArIHRleHQpKTsKKyAgICAgICAgICAgICAgICBjb25maWd1cmVBU1QoY29uc3RhbnRFeHByZXNzaW9uLCB1bmFyeU1pbnVzRXhwcik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnN0YW50RXhwcmVzc2lvbjsKKworICAgICAgICAgICAgY2FzZSBOVU1fQklHX0lOVDoKKyAgICAgICAgICAgIGNhc2UgTlVNX0lOVDoKKyAgICAgICAgICAgIGNhc2UgTlVNX0xPTkc6CisgICAgICAgICAgICAgICAgQ29uc3RhbnRFeHByZXNzaW9uIGNvbnN0YW50TG9uZ0V4cHJlc3Npb24gPSBuZXcgQ29uc3RhbnRFeHByZXNzaW9uKE51bWJlcnMucGFyc2VJbnRlZ2VyKCItIiArIHRleHQpKTsKKyAgICAgICAgICAgICAgICBjb25maWd1cmVBU1QoY29uc3RhbnRMb25nRXhwcmVzc2lvbiwgdW5hcnlNaW51c0V4cHIpOworICAgICAgICAgICAgICAgIHJldHVybiBjb25zdGFudExvbmdFeHByZXNzaW9uOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIFVuYXJ5TWludXNFeHByZXNzaW9uIHVuYXJ5TWludXNFeHByZXNzaW9uID0gbmV3IFVuYXJ5TWludXNFeHByZXNzaW9uKGV4cHJlc3Npb24obm9kZSkpOworICAgICAgICAgICAgICAgIGNvbmZpZ3VyZUFTVCh1bmFyeU1pbnVzRXhwcmVzc2lvbiwgdW5hcnlNaW51c0V4cHIpOworICAgICAgICAgICAgICAgIHJldHVybiB1bmFyeU1pbnVzRXhwcmVzc2lvbjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBFeHByZXNzaW9uIHVuYXJ5UGx1c0V4cHJlc3Npb24oQVNUIHVuYXJ5UGx1c0V4cHIpIHsKKyAgICAgICAgQVNUIG5vZGUgPSB1bmFyeVBsdXNFeHByLmdldEZpcnN0Q2hpbGQoKTsKKyAgICAgICAgc3dpdGNoIChub2RlLmdldFR5cGUoKSkgeworICAgICAgICAgICAgY2FzZSBOVU1fRE9VQkxFOgorICAgICAgICAgICAgY2FzZSBOVU1fRkxPQVQ6CisgICAgICAgICAgICBjYXNlIE5VTV9CSUdfREVDSU1BTDoKKyAgICAgICAgICAgIGNhc2UgTlVNX0JJR19JTlQ6CisgICAgICAgICAgICBjYXNlIE5VTV9JTlQ6CisgICAgICAgICAgICBjYXNlIE5VTV9MT05HOgorICAgICAgICAgICAgICAgIHJldHVybiBleHByZXNzaW9uKG5vZGUpOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIFVuYXJ5UGx1c0V4cHJlc3Npb24gdW5hcnlQbHVzRXhwcmVzc2lvbiA9IG5ldyBVbmFyeVBsdXNFeHByZXNzaW9uKGV4cHJlc3Npb24obm9kZSkpOworICAgICAgICAgICAgICAgIGNvbmZpZ3VyZUFTVCh1bmFyeVBsdXNFeHByZXNzaW9uLCB1bmFyeVBsdXNFeHByKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdW5hcnlQbHVzRXhwcmVzc2lvbjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBDb25zdGFudEV4cHJlc3Npb24gZGVjaW1hbEV4cHJlc3Npb24oQVNUIG5vZGUpIHsKKyAgICAgICAgU3RyaW5nIHRleHQgPSBub2RlLmdldFRleHQoKTsKKyAgICAgICAgQ29uc3RhbnRFeHByZXNzaW9uIGNvbnN0YW50RXhwcmVzc2lvbiA9IG5ldyBDb25zdGFudEV4cHJlc3Npb24oTnVtYmVycy5wYXJzZURlY2ltYWwodGV4dCkpOworICAgICAgICBjb25maWd1cmVBU1QoY29uc3RhbnRFeHByZXNzaW9uLCBub2RlKTsKKyAgICAgICAgcmV0dXJuIGNvbnN0YW50RXhwcmVzc2lvbjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQ29uc3RhbnRFeHByZXNzaW9uIGludGVnZXJFeHByZXNzaW9uKEFTVCBub2RlKSB7CisgICAgICAgIFN0cmluZyB0ZXh0ID0gbm9kZS5nZXRUZXh0KCk7CisgICAgICAgIENvbnN0YW50RXhwcmVzc2lvbiBjb25zdGFudEV4cHJlc3Npb24gPSBuZXcgQ29uc3RhbnRFeHByZXNzaW9uKE51bWJlcnMucGFyc2VJbnRlZ2VyKHRleHQpKTsKKyAgICAgICAgY29uZmlndXJlQVNUKGNvbnN0YW50RXhwcmVzc2lvbiwgbm9kZSk7CisgICAgICAgIHJldHVybiBjb25zdGFudEV4cHJlc3Npb247CisgICAgfQorCisgICAgcHJvdGVjdGVkIEV4cHJlc3Npb24gZ3N0cmluZyhBU1QgZ3N0cmluZ05vZGUpIHsKKyAgICAgICAgTGlzdCBzdHJpbmdzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBMaXN0IHZhbHVlcyA9IG5ldyBBcnJheUxpc3QoKTsKKworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCisgICAgICAgIGJvb2xlYW4gaXNQcmV2U3RyaW5nID0gZmFsc2U7CisKKyAgICAgICAgZm9yIChBU1Qgbm9kZSA9IGdzdHJpbmdOb2RlLmdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKSB7CisgICAgICAgICAgICBpbnQgdHlwZSA9IG5vZGUuZ2V0VHlwZSgpOworICAgICAgICAgICAgU3RyaW5nIHRleHQgPSBudWxsOworICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7CisKKyAgICAgICAgICAgICAgICBjYXNlIFNUUklOR19MSVRFUkFMOgorICAgICAgICAgICAgICAgICAgICBpZiAoaXNQcmV2U3RyaW5nKSAgYXNzZXJ0Tm9kZVR5cGUoSURFTlQsIG5vZGUpOyAgLy8gcGFyc2VyIGJ1ZworICAgICAgICAgICAgICAgICAgICBpc1ByZXZTdHJpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gbm9kZS5nZXRUZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIENvbnN0YW50RXhwcmVzc2lvbiBjb25zdGFudEV4cHJlc3Npb24gPSBuZXcgQ29uc3RhbnRFeHByZXNzaW9uKHRleHQpOworICAgICAgICAgICAgICAgICAgICBjb25maWd1cmVBU1QoY29uc3RhbnRFeHByZXNzaW9uLCBub2RlKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5ncy5hZGQoY29uc3RhbnRFeHByZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCh0ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzUHJldlN0cmluZykgIGFzc2VydE5vZGVUeXBlKElERU5ULCBub2RlKTsgIC8vIHBhcnNlciBidWcKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzUHJldlN0cmluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gZXhwcmVzc2lvbihub2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5hZGQoZXhwcmVzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIkIik7CisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGV4cHJlc3Npb24uZ2V0VGV4dCgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBHU3RyaW5nRXhwcmVzc2lvbiBnU3RyaW5nRXhwcmVzc2lvbiA9IG5ldyBHU3RyaW5nRXhwcmVzc2lvbihidWZmZXIudG9TdHJpbmcoKSwgc3RyaW5ncywgdmFsdWVzKTsKKyAgICAgICAgY29uZmlndXJlQVNUKGdTdHJpbmdFeHByZXNzaW9uLCBnc3RyaW5nTm9kZSk7CisgICAgICAgIHJldHVybiBnU3RyaW5nRXhwcmVzc2lvbjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQ2xhc3NOb2RlIHR5cGUoQVNUIHR5cGVOb2RlKSB7CisgICAgICAgIC8vIFRPRE8gaW50ZXJuIHR5cGVzPworICAgICAgICAvLyBUT0RPIGNvbmZpZ3VyZUFTVCguLi4pCisgICAgICAgIHJldHVybiBidWlsZE5hbWUodHlwZU5vZGUuZ2V0Rmlyc3RDaGlsZCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBxdWFsaWZpZWROYW1lKEFTVCBxdWFsaWZpZWROYW1lTm9kZSkgeworICAgIAlpZiAoaXNUeXBlKElERU5ULCBxdWFsaWZpZWROYW1lTm9kZSkpIHsKKyAgICAgICAgCXJldHVybiBxdWFsaWZpZWROYW1lTm9kZS5nZXRUZXh0KCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzVHlwZShET1QsIHF1YWxpZmllZE5hbWVOb2RlKSkgeworICAgICAgICAgICAgQVNUIG5vZGUgPSBxdWFsaWZpZWROYW1lTm9kZS5nZXRGaXJzdENoaWxkKCk7CisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7CisKKyAgICAgICAgICAgIGZvciAoOyBub2RlICE9IG51bGwgJiYgIWlzVHlwZShUWVBFX0FSR1VNRU5UUyxub2RlKTsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKHF1YWxpZmllZE5hbWUobm9kZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHF1YWxpZmllZE5hbWVOb2RlLmdldFRleHQoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBBU1QgZ2V0VHlwZUFyZ3VtZW50c05vZGUoQVNUIHJvb3QpIHsKKyAgICAgICAgd2hpbGUgKHJvb3QhPW51bGwgJiYgIWlzVHlwZShUWVBFX0FSR1VNRU5UUyxyb290KSkgeworICAgICAgICAgICAgcm9vdCA9IHJvb3QuZ2V0TmV4dFNpYmxpbmcoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcm9vdDsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBpbnQgZ2V0Qm91bmRUeXBlKEFTVCBub2RlKSB7CisgICAgICAgIGlmIChub2RlPT1udWxsKSByZXR1cm4gLTE7CisgICAgICAgIGlmIChpc1R5cGUoVFlQRV9VUFBFUl9CT1VORFMsbm9kZSkpIHJldHVybiBUWVBFX1VQUEVSX0JPVU5EUzsKKyAgICAgICAgaWYgKGlzVHlwZShUWVBFX0xPV0VSX0JPVU5EUyxub2RlKSkgcmV0dXJuIFRZUEVfTE9XRVJfQk9VTkRTOworICAgICAgICB0aHJvdyBuZXcgQVNUUnVudGltZUV4Y2VwdGlvbihub2RlLCAKKyAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCBub2RlIHR5cGU6ICIgKyBnZXRUb2tlbk5hbWUobm9kZSkgKyAKKyAgICAgICAgICAgICAgICAiIGZvdW5kIHdoZW4gZXhwZWN0aW5nIHR5cGU6ICIgKyBnZXRUb2tlbk5hbWUoVFlQRV9VUFBFUl9CT1VORFMpICsKKyAgICAgICAgICAgICAgICAiIG9yIHR5cGU6ICIgKyBnZXRUb2tlbk5hbWUoVFlQRV9MT1dFUl9CT1VORFMpKTsgICAgICAgCisgICAgfQorICAgIAorICAgIHByaXZhdGUgR2VuZXJpY3NUeXBlIG1ha2VHZW5lcmljc0FyZ3VtZW50VHlwZShBU1Qgcm9vdE5vZGUpIHsKKyAgICAgICAgR2VuZXJpY3NUeXBlIGd0OworICAgICAgICBpZiAoaXNUeXBlKFdJTERDQVJEX1RZUEUscm9vdE5vZGUpKSB7CisgICAgICAgICAgICBDbGFzc05vZGUgYmFzZSA9IENsYXNzSGVscGVyLm1ha2VXaXRob3V0Q2FjaGluZygiPyIpOworICAgICAgICAgICAgaWYgKHJvb3ROb2RlLmdldE5leHRTaWJsaW5nKCkhPW51bGwpIHsKKyAgICAgICAgICAgICAgICBpbnQgYm91bmRUeXBlID0gZ2V0Qm91bmRUeXBlKHJvb3ROb2RlLmdldE5leHRTaWJsaW5nKCkpOworICAgICAgICAgICAgICAgIENsYXNzTm9kZVtdIGd0cyA9IG1ha2VHZW5lcmljc0JvdW5kcyhyb290Tm9kZSxib3VuZFR5cGUpOworICAgICAgICAgICAgICAgIGlmIChib3VuZFR5cGU9PVRZUEVfVVBQRVJfQk9VTkRTKSB7CisgICAgICAgICAgICAgICAgICAgIGd0ID0gbmV3IEdlbmVyaWNzVHlwZShiYXNlLGd0cyxudWxsKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBndCA9IG5ldyBHZW5lcmljc1R5cGUoYmFzZSxudWxsLGd0c1swXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBndCA9IG5ldyBHZW5lcmljc1R5cGUoYmFzZSxudWxsLG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ3Quc2V0TmFtZSgiPyIpOworICAgICAgICAgICAgZ3Quc2V0V2lsZGNhcmQodHJ1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDbGFzc05vZGUgYXJndW1lbnQgPSBtYWtlVHlwZVdpdGhBcmd1bWVudHMocm9vdE5vZGUpOworICAgICAgICAgICAgZ3QgPSBuZXcgR2VuZXJpY3NUeXBlKGFyZ3VtZW50KTsKKyAgICAgICAgfQorICAgICAgICBjb25maWd1cmVBU1QoZ3QsIHJvb3ROb2RlKTsKKyAgICAgICAgcmV0dXJuIGd0OworICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgQ2xhc3NOb2RlIG1ha2VUeXBlV2l0aEFyZ3VtZW50cyhBU1Qgcm9vdE5vZGUpIHsKKyAgICAgICAgQ2xhc3NOb2RlIGJhc2ljVHlwZSA9IG1ha2VUeXBlKHJvb3ROb2RlKTsKKyAgICAgICAgTGlua2VkTGlzdCB0eXBlQXJndW1lbnRMaXN0ID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICAgICAgQVNUIG5vZGUgPSByb290Tm9kZS5nZXRGaXJzdENoaWxkKCk7CisgICAgICAgIGlmIChub2RlPT1udWxsIHx8IGlzVHlwZShJTkRFWF9PUCwgbm9kZSkgfHwgaXNUeXBlKEFSUkFZX0RFQ0xBUkFUT1IsIG5vZGUpKSByZXR1cm4gYmFzaWNUeXBlOworICAgICAgICAvL1RPRE86IHJlY29nbml6ZSBjb21iaW5hdG9ucyBvZiBpbm5lciBjbGFzc2VzIGFuZCBnZW5lcmljIHR5cGVzCisgICAgICAgIGlmIChpc1R5cGUoRE9ULCBub2RlKSkgcmV0dXJuIGJhc2ljVHlwZTsKKyAgICAgICAgbm9kZSA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOworICAgICAgICBpZiAobm9kZT09bnVsbCkgcmV0dXJuIGJhc2ljVHlwZTsKKyAgICAgICAgYXNzZXJ0Tm9kZVR5cGUoVFlQRV9BUkdVTUVOVFMsIG5vZGUpOworICAgICAgICBBU1QgdHlwZUFyZ3VtZW50ID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7CisgICAgICAgIAorICAgICAgICB3aGlsZSAodHlwZUFyZ3VtZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFzc2VydE5vZGVUeXBlKFRZUEVfQVJHVU1FTlQsIHR5cGVBcmd1bWVudCk7ICAgICAgICAgICAgCisgICAgICAgICAgICBHZW5lcmljc1R5cGUgZ3QgPSBtYWtlR2VuZXJpY3NBcmd1bWVudFR5cGUodHlwZUFyZ3VtZW50LmdldEZpcnN0Q2hpbGQoKSk7CisgICAgICAgICAgICB0eXBlQXJndW1lbnRMaXN0LmFkZChndCk7CisgICAgICAgICAgICB0eXBlQXJndW1lbnQgPSB0eXBlQXJndW1lbnQuZ2V0TmV4dFNpYmxpbmcoKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKHR5cGVBcmd1bWVudExpc3Quc2l6ZSgpPjApIHsKKyAgICAgICAgICAgIGJhc2ljVHlwZS5zZXRHZW5lcmljc1R5cGVzKChHZW5lcmljc1R5cGVbXSkgdHlwZUFyZ3VtZW50TGlzdC50b0FycmF5KG5ldyBHZW5lcmljc1R5cGVbMF0pKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYmFzaWNUeXBlOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIENsYXNzTm9kZVtdIG1ha2VHZW5lcmljc0JvdW5kcyhBU1Qgcm4sIGludCBib3VuZFR5cGUpIHsKKyAgICAgICAgQVNUIGJvdW5kc1Jvb3QgPSBybi5nZXROZXh0U2libGluZygpOworICAgICAgICBpZiAoYm91bmRzUm9vdD09bnVsbCkgcmV0dXJuIG51bGw7CisgICAgICAgIGFzc2VydE5vZGVUeXBlKGJvdW5kVHlwZSwgYm91bmRzUm9vdCk7CisgICAgICAgIExpbmtlZExpc3QgYm91bmRzID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICAgICAgZm9yICggQVNUIGJvdW5kc05vZGUgPSBib3VuZHNSb290LmdldEZpcnN0Q2hpbGQoKTsgCisgICAgICAgICAgICAgIGJvdW5kc05vZGUhPW51bGw7IAorICAgICAgICAgICAgICBib3VuZHNOb2RlPWJvdW5kc05vZGUuZ2V0TmV4dFNpYmxpbmcoKQorICAgICAgICApIHsKKyAgICAgICAgICAgIENsYXNzTm9kZSBib3VuZCA9IG51bGw7CisgICAgICAgICAgICBib3VuZCA9IG1ha2VUeXBlV2l0aEFyZ3VtZW50cyhib3VuZHNOb2RlKTsKKyAgICAgICAgICAgIGNvbmZpZ3VyZUFTVChib3VuZCwgYm91bmRzTm9kZSk7CisgICAgICAgICAgICBib3VuZHMuYWRkKGJvdW5kKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYm91bmRzLnNpemUoKT09MCkgcmV0dXJuIG51bGw7CisgICAgICAgIHJldHVybiAoQ2xhc3NOb2RlW10pIGJvdW5kcy50b0FycmF5KG5ldyBDbGFzc05vZGVbYm91bmRzLnNpemUoKV0pOworICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgR2VuZXJpY3NUeXBlW10gbWFrZUdlbmVyaWNzVHlwZShBU1Qgcm9vdE5vZGUpIHsKKyAgICAgICAgQVNUIHR5cGVQYXJhbWV0ZXIgPSByb290Tm9kZS5nZXRGaXJzdENoaWxkKCk7CisgICAgICAgIExpbmtlZExpc3QgcmV0ID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICAgICAgYXNzZXJ0Tm9kZVR5cGUoVFlQRV9QQVJBTUVURVIsIHR5cGVQYXJhbWV0ZXIpOworCisgICAgICAgIHdoaWxlIChpc1R5cGUoVFlQRV9QQVJBTUVURVIsIHR5cGVQYXJhbWV0ZXIpKSB7CisgICAgICAgICAgICBBU1QgdHlwZU5vZGUgPSB0eXBlUGFyYW1ldGVyLmdldEZpcnN0Q2hpbGQoKTsKKyAgICAgICAgICAgIENsYXNzTm9kZSB0eXBlID0gbWFrZVR5cGUodHlwZVBhcmFtZXRlcik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIEdlbmVyaWNzVHlwZSBndCA9IG5ldyBHZW5lcmljc1R5cGUodHlwZSwgbWFrZUdlbmVyaWNzQm91bmRzKHR5cGVOb2RlLFRZUEVfVVBQRVJfQk9VTkRTKSxudWxsKTsKKyAgICAgICAgICAgIGNvbmZpZ3VyZUFTVChndCwgdHlwZU5vZGUpOworICAgICAgICAgICAgCisgICAgICAgICAgICByZXQuYWRkKGd0KTsKKyAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIgPSB0eXBlUGFyYW1ldGVyLmdldE5leHRTaWJsaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChHZW5lcmljc1R5cGVbXSkgcmV0LnRvQXJyYXkobmV3IEdlbmVyaWNzVHlwZVswXSk7CisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCBDbGFzc05vZGUgbWFrZVR5cGUoQVNUIHR5cGVOb2RlKSB7CisgICAgICAgIENsYXNzTm9kZSBhbnN3ZXIgPSBDbGFzc0hlbHBlci5EWU5BTUlDX1RZUEU7CisgICAgICAgIEFTVCBub2RlID0gdHlwZU5vZGUuZ2V0Rmlyc3RDaGlsZCgpOworICAgICAgICBpZiAobm9kZSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoaXNUeXBlKElOREVYX09QLCBub2RlKSB8fCBpc1R5cGUoQVJSQVlfREVDTEFSQVRPUiwgbm9kZSkpIHsKKyAgICAgICAgICAgICAgICBhbnN3ZXIgPSBtYWtlVHlwZShub2RlKS5tYWtlQXJyYXkoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYW5zd2VyID0gQ2xhc3NIZWxwZXIubWFrZShxdWFsaWZpZWROYW1lKG5vZGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbmZpZ3VyZUFTVChhbnN3ZXIsbm9kZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFuc3dlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtcyBhIG5hbWUgcmVzb2x1dGlvbiB0byBzZWUgaWYgdGhlIGdpdmVuIG5hbWUgaXMgYSB0eXBlIGZyb20gaW1wb3J0cywKKyAgICAgKiBhbGlhc2VzIG9yIG5ld2x5IGNyZWF0ZWQgY2xhc3NlcworICAgICAqLworICAgIC8qcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlVHlwZU5hbWUoU3RyaW5nIG5hbWUsIGJvb2xlYW4gc2FmZSkgeworICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzb2x2ZU5ld0NsYXNzT3JOYW1lKG5hbWUsIHNhZmUpOworICAgIH0qLworCisgICAgLyoqCisgICAgICogRXh0cmFjdHMgYW4gaWRlbnRpZmllciBmcm9tIHRoZSBBbnRsciBBU1QgYW5kIHRoZW4gcGVyZm9ybXMgYSBuYW1lIHJlc29sdXRpb24KKyAgICAgKiB0byBzZWUgaWYgdGhlIGdpdmVuIG5hbWUgaXMgYSB0eXBlIGZyb20gaW1wb3J0cywgYWxpYXNlcyBvciBuZXdseSBjcmVhdGVkIGNsYXNzZXMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ2xhc3NOb2RlIGJ1aWxkTmFtZShBU1Qgbm9kZSkgeworICAgICAgICBpZiAoaXNUeXBlKFRZUEUsIG5vZGUpKSB7CisgICAgICAgICAgICBub2RlID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7CisgICAgICAgIH0KKyAgICAgICAgQ2xhc3NOb2RlIGFuc3dlciA9IG51bGw7CisgICAgICAgIGlmIChpc1R5cGUoRE9ULCBub2RlKSB8fCBpc1R5cGUoT1BUSU9OQUxfRE9ULCBub2RlKSkgeworICAgICAgICAgICAgYW5zd2VyID0gQ2xhc3NIZWxwZXIubWFrZShxdWFsaWZpZWROYW1lKG5vZGUpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChpc1ByaW1pdGl2ZVR5cGVMaXRlcmFsKG5vZGUpKSB7CisgICAgICAgICAgICBhbnN3ZXIgPSBDbGFzc0hlbHBlci5tYWtlKG5vZGUuZ2V0VGV4dCgpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChpc1R5cGUoSU5ERVhfT1AsIG5vZGUpIHx8IGlzVHlwZShBUlJBWV9ERUNMQVJBVE9SLCBub2RlKSkgeworICAgICAgICAgICAgQVNUIGNoaWxkID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7CisgICAgICAgICAgICByZXR1cm4gYnVpbGROYW1lKGNoaWxkKS5tYWtlQXJyYXkoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFN0cmluZyBpZGVudGlmaWVyID0gbm9kZS5nZXRUZXh0KCk7CisgICAgICAgICAgICBhbnN3ZXIgPSBDbGFzc0hlbHBlci5tYWtlKGlkZW50aWZpZXIpOworICAgICAgICB9CisgICAgICAgIEFTVCBuZXh0U2libGluZyA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKKyAgICAgICAgaWYgKGlzVHlwZShJTkRFWF9PUCwgbmV4dFNpYmxpbmcpIHx8IGlzVHlwZShBUlJBWV9ERUNMQVJBVE9SLCBub2RlKSkgeworICAgICAgICAgICAgcmV0dXJuIGFuc3dlci5tYWtlQXJyYXkoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBhbnN3ZXI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1ByaW1pdGl2ZVR5cGVMaXRlcmFsKEFTVCBub2RlKSB7CisgICAgICAgIGludCB0eXBlID0gbm9kZS5nZXRUeXBlKCk7CisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgY2FzZSBMSVRFUkFMX2Jvb2xlYW46CisgICAgICAgICAgICBjYXNlIExJVEVSQUxfYnl0ZToKKyAgICAgICAgICAgIGNhc2UgTElURVJBTF9jaGFyOgorICAgICAgICAgICAgY2FzZSBMSVRFUkFMX2RvdWJsZToKKyAgICAgICAgICAgIGNhc2UgTElURVJBTF9mbG9hdDoKKyAgICAgICAgICAgIGNhc2UgTElURVJBTF9pbnQ6CisgICAgICAgICAgICBjYXNlIExJVEVSQUxfbG9uZzoKKyAgICAgICAgICAgIGNhc2UgTElURVJBTF9zaG9ydDoKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeHRyYWN0cyBhbiBpZGVudGlmaWVyIGZyb20gdGhlIEFudGxyIEFTVAorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgaWRlbnRpZmllcihBU1Qgbm9kZSkgeworICAgICAgICBhc3NlcnROb2RlVHlwZShJREVOVCwgbm9kZSk7CisgICAgICAgIHJldHVybiBub2RlLmdldFRleHQoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGxhYmVsKEFTVCBsYWJlbE5vZGUpIHsKKyAgICAgICAgQVNUIG5vZGUgPSBsYWJlbE5vZGUuZ2V0Rmlyc3RDaGlsZCgpOworICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaWRlbnRpZmllcihub2RlKTsKKyAgICB9CisKKworCisgICAgLy8gSGVscGVyIG1ldGhvZHMKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBtb2RpZmllcnMgZmxhZ3MgY29udGFpbiBhIHZpc2liaWxpdHkgbW9kaWZpZXIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNWaXNpYmlsaXR5KGludCBtb2RpZmllcnMpIHsKKyAgICAgICAgcmV0dXJuIChtb2RpZmllcnMgJiAoT3Bjb2Rlcy5BQ0NfUFJJVkFURSB8IE9wY29kZXMuQUNDX1BST1RFQ1RFRCB8IE9wY29kZXMuQUNDX1BVQkxJQykpICE9IDA7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQVNUKEFTVE5vZGUgbm9kZSwgQVNUIGFzdCkgeworICAgICAgICBpZiAoYXN0PT1udWxsKSB0aHJvdyBuZXcgQVNUUnVudGltZUV4Y2VwdGlvbihhc3QsICJQQVJTRVIgQlVHOiBUcmllZCB0byBjb25maWd1cmUgIitub2RlLmdldENsYXNzKCkuZ2V0TmFtZSgpKyIgd2l0aCBudWxsIE5vZGUiKTsKKyAgICAgICAgbm9kZS5zZXRDb2x1bW5OdW1iZXIoYXN0LmdldENvbHVtbigpKTsKKyAgICAgICAgbm9kZS5zZXRMaW5lTnVtYmVyKGFzdC5nZXRMaW5lKCkpOworICAgICAgICBpZiAoYXN0IGluc3RhbmNlb2YgR3Jvb3Z5U291cmNlQVNUKSB7CisgICAgICAgICAgICBub2RlLnNldExhc3RDb2x1bW5OdW1iZXIoKChHcm9vdnlTb3VyY2VBU1QpYXN0KS5nZXRDb2x1bW5MYXN0KCkpOworICAgICAgICAgICAgbm9kZS5zZXRMYXN0TGluZU51bWJlcigoKEdyb292eVNvdXJjZUFTVClhc3QpLmdldExpbmVMYXN0KCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETyB3ZSBjb3VsZCBvbmUgZGF5IHN0b3JlIHRoZSBBbnRsciBBU1Qgb24gdGhlIEdyb292eSBBU1QKKyAgICAgICAgLy8gbm9kZS5zZXRDU1ROb2RlKGFzdCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBUb2tlbiBtYWtlVG9rZW4oaW50IHR5cGVDb2RlLCBBU1Qgbm9kZSkgeworICAgICAgICByZXR1cm4gVG9rZW4ubmV3U3ltYm9sKHR5cGVDb2RlLCBub2RlLmdldExpbmUoKSwgbm9kZS5nZXRDb2x1bW4oKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRGaXJzdENoaWxkVGV4dChBU1Qgbm9kZSkgeworICAgICAgICBBU1QgY2hpbGQgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKKyAgICAgICAgcmV0dXJuIGNoaWxkICE9IG51bGwgPyBjaGlsZC5nZXRUZXh0KCkgOiBudWxsOworICAgIH0KKworCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHlwZShpbnQgdHlwZUNvZGUsIEFTVCBub2RlKSB7CisgICAgICAgIHJldHVybiBub2RlICE9IG51bGwgJiYgbm9kZS5nZXRUeXBlKCkgPT0gdHlwZUNvZGU7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VG9rZW5OYW1lKGludCB0b2tlbikgeworICAgICAgICBpZiAodG9rZW5OYW1lcz09bnVsbCkgcmV0dXJuICIiK3Rva2VuOworICAgICAgICByZXR1cm4gdG9rZW5OYW1lc1t0b2tlbl07CisgICAgfQorICAgIAorICAgIHByaXZhdGUgU3RyaW5nIGdldFRva2VuTmFtZShBU1Qgbm9kZSkgeworICAgICAgICBpZiAobm9kZT09bnVsbCkgcmV0dXJuICJudWxsIjsKKyAgICAgICAgcmV0dXJuIGdldFRva2VuTmFtZShub2RlLmdldFR5cGUoKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0Tm9kZVR5cGUoaW50IHR5cGUsIEFTVCBub2RlKSB7CisgICAgICAgIGlmIChub2RlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBU1RSdW50aW1lRXhjZXB0aW9uKG5vZGUsICJObyBjaGlsZCBub2RlIGF2YWlsYWJsZSBpbiBBU1Qgd2hlbiBleHBlY3RpbmcgdHlwZTogIiArIGdldFRva2VuTmFtZSh0eXBlKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5vZGUuZ2V0VHlwZSgpICE9IHR5cGUpIHsgICAgICAgICAgICAKKyAgICAgICAgICAgIHRocm93IG5ldyBBU1RSdW50aW1lRXhjZXB0aW9uKG5vZGUsICJVbmV4cGVjdGVkIG5vZGUgdHlwZTogIiArIGdldFRva2VuTmFtZShub2RlKSArICIgZm91bmQgd2hlbiBleHBlY3RpbmcgdHlwZTogIiArIGdldFRva2VuTmFtZSh0eXBlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBub3RJbXBsZW1lbnRlZFlldChBU1Qgbm9kZSkgeworICAgICAgICB0aHJvdyBuZXcgQVNUUnVudGltZUV4Y2VwdGlvbihub2RlLCAiQVNUIG5vZGUgbm90IGltcGxlbWVudGVkIHlldCBmb3IgdHlwZTogIiArIGdldFRva2VuTmFtZShub2RlKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgdW5rbm93bkFTVChBU1Qgbm9kZSkgeworICAgICAgICBpZiAobm9kZS5nZXRUeXBlKCkgPT0gQ0xBU1NfREVGKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQVNUUnVudGltZUV4Y2VwdGlvbihub2RlLAorICAgICAgICAgICAgICAgICAgICAiQ2xhc3MgZGVmaW5pdGlvbiBub3QgZXhwZWN0ZWQgaGVyZS4gUG9zc2libGUgYXR0ZW1wdCB0byB1c2UgaW5uZXIgY2xhc3MuICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbm5lciBjbGFzc2VzIG5vdCBzdXBwb3J0ZWQsIHBlcmhhcHMgdHJ5IHVzaW5nIGEgY2xvc3VyZSBpbnN0ZWFkLiIpOworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBBU1RSdW50aW1lRXhjZXB0aW9uKG5vZGUsICJVbmtub3duIHR5cGU6ICIgKyBnZXRUb2tlbk5hbWUobm9kZSkpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGR1bXBUcmVlKEFTVCBhc3QpIHsKKyAgICAgICAgZm9yIChBU1Qgbm9kZSA9IGFzdC5nZXRGaXJzdENoaWxkKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgeworICAgICAgICAgICAgZHVtcChub2RlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGR1bXAoQVNUIG5vZGUpIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUeXBlOiAiICsgZ2V0VG9rZW5OYW1lKG5vZGUpICsgIiB0ZXh0OiAiICsgbm9kZS5nZXRUZXh0KCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudGxyL0FudGxyUGFyc2VyUGx1Z2luRmFjdG9yeS5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvQW50bHJQYXJzZXJQbHVnaW5GYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZlY2U4MQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudGxyL0FudGxyUGFyc2VyUGx1Z2luRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudGxyOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLlBhcnNlclBsdWdpbjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuUGFyc2VyUGx1Z2luRmFjdG9yeTsKKworLyoqCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBBbnRsclBhcnNlclBsdWdpbkZhY3RvcnkgZXh0ZW5kcyBQYXJzZXJQbHVnaW5GYWN0b3J5IHsKKworICAgIHB1YmxpYyBQYXJzZXJQbHVnaW4gY3JlYXRlUGFyc2VyUGx1Z2luKCkgeworICAgICAgICByZXR1cm4gbmV3IEFudGxyUGFyc2VyUGx1Z2luKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvRW51bUhlbHBlci5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvRW51bUhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ZTJhZTMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci9FbnVtSGVscGVyLmphdmEKQEAgLTAsMCArMSw0OSBAQAorcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudGxyOw0KKw0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5DbGFzc0hlbHBlcjsNCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuQ2xhc3NOb2RlOw0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5GaWVsZE5vZGU7DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LkdlbmVyaWNzVHlwZTsNCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuSW5uZXJDbGFzc05vZGU7DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0Lk1peGluTm9kZTsNCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuZXhwci5FeHByZXNzaW9uOw0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByLkxpc3RFeHByZXNzaW9uOw0KK2ltcG9ydCBvcmcub2JqZWN0d2ViLmFzbS5PcGNvZGVzOw0KKw0KKw0KK3B1YmxpYyBjbGFzcyBFbnVtSGVscGVyIHsNCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZTID0gT3Bjb2Rlcy5BQ0NfRklOQUwgfCBPcGNvZGVzLkFDQ19TVEFUSUM7DQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQVUJMSUNfRlMgPSBPcGNvZGVzLkFDQ19QVUJMSUMgfCBGUzsgDQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIENsYXNzTm9kZSBtYWtlRW51bU5vZGUoU3RyaW5nIG5hbWUsIGludCBtb2RpZmllcnMsIENsYXNzTm9kZVtdIGludGVyZmFjZXMsIENsYXNzTm9kZSBvdXRlckNsYXNzKSB7DQorICAgICAgICBtb2RpZmllcnMgPSBtb2RpZmllcnMgfCBPcGNvZGVzLkFDQ19GSU5BTCB8IE9wY29kZXMuQUNDX0VOVU07DQorICAgICAgICBDbGFzc05vZGUgZW51bUNsYXNzOw0KKyAgICAgICAgaWYgKG91dGVyQ2xhc3M9PW51bGwpIHsNCisgICAgICAgICAgICBlbnVtQ2xhc3MgPSBuZXcgQ2xhc3NOb2RlKG5hbWUsbW9kaWZpZXJzLG51bGwsaW50ZXJmYWNlcyxNaXhpbk5vZGUuRU1QVFlfQVJSQVkpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBuYW1lID0gb3V0ZXJDbGFzcy5nZXROYW1lKCkgKyAiJCIgKyBuYW1lOw0KKyAgICAgICAgICAgIGVudW1DbGFzcyA9IG5ldyBJbm5lckNsYXNzTm9kZShvdXRlckNsYXNzLG5hbWUsbW9kaWZpZXJzLG51bGwsaW50ZXJmYWNlcyxNaXhpbk5vZGUuRU1QVFlfQVJSQVkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICAvLyBzZXQgc3VwZXIgY2xhc3MgYW5kIGdlbmVyaWNzIGluZm8NCisgICAgICAgIC8vICJlbnVtIFgiIC0+IGNsYXNzIFggZXh0ZW5kcyBFbnVtPFg+DQorICAgICAgICBHZW5lcmljc1R5cGUgZ3QgPSBuZXcgR2VuZXJpY3NUeXBlKGVudW1DbGFzcyk7DQorICAgICAgICBDbGFzc05vZGUgc3VwZXJDbGFzcyA9IENsYXNzSGVscGVyLm1ha2VXaXRob3V0Q2FjaGluZygiamF2YS5sYW5nLkVudW0iKTsNCisgICAgICAgIHN1cGVyQ2xhc3Muc2V0R2VuZXJpY3NUeXBlcyhuZXcgR2VuZXJpY3NUeXBlW117Z3R9KTsNCisgICAgICAgIGVudW1DbGFzcy5zZXRTdXBlckNsYXNzKHN1cGVyQ2xhc3MpOw0KKyAgICAgICAgc3VwZXJDbGFzcy5zZXRSZWRpcmVjdChDbGFzc0hlbHBlci5FbnVtX1R5cGUpOw0KKyAgICAgICAgDQorICAgICAgICByZXR1cm4gZW51bUNsYXNzOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRFbnVtQ29uc3RhbnQoQ2xhc3NOb2RlIGVudW1DbGFzcywgU3RyaW5nIG5hbWUsIEV4cHJlc3Npb24gaW5pdCkgew0KKyAgICAgICAgaW50IG1vZGlmaWVycyA9IFBVQkxJQ19GUyB8IE9wY29kZXMuQUNDX0VOVU07DQorICAgICAgICBpZiAgKGluaXQhPW51bGwgJiYgIShpbml0IGluc3RhbmNlb2YgTGlzdEV4cHJlc3Npb24pKSB7DQorICAgICAgICAgICAgTGlzdEV4cHJlc3Npb24gbGlzdCA9IG5ldyBMaXN0RXhwcmVzc2lvbigpOw0KKyAgICAgICAgICAgIGxpc3QuYWRkRXhwcmVzc2lvbihpbml0KTsNCisgICAgICAgICAgICBpbml0ID0gbGlzdDsNCisgICAgICAgIH0NCisgICAgICAgIEZpZWxkTm9kZSBmbiA9IG5ldyBGaWVsZE5vZGUobmFtZSxtb2RpZmllcnMsZW51bUNsYXNzLGVudW1DbGFzcyxpbml0KTsNCisgICAgICAgIGVudW1DbGFzcy5hZGRGaWVsZChmbik7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvR3Jvb3Z5U291cmNlQVNULmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci9Hcm9vdnlTb3VyY2VBU1QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmJlYWYzCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvR3Jvb3Z5U291cmNlQVNULmphdmEKQEAgLTAsMCArMSwxNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50bHI7CisKK2ltcG9ydCBhbnRsci5jb2xsZWN0aW9ucy5BU1Q7CitpbXBvcnQgYW50bHIuKjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKKy8qKgorICogV2UgaGF2ZSBhbiBBU1Qgc3ViY2xhc3Mgc28gd2UgY2FuIHRyYWNrIHNvdXJjZSBpbmZvcm1hdGlvbi4KKyAqIFZlcnkgb2RkIHRoYXQgQU5UTFIgZG9lc24ndCBkbyB0aGlzIGJ5IGRlZmF1bHQuCisgKgorICogQGF1dGhvciBNaWtlIFNwaWxsZQorICogQGF1dGhvciBKZXJlbXkgUmF5bmVyIDxncm9vdnlAcm9zcy1yYXluZXIuY29tPgorICovCitwdWJsaWMgY2xhc3MgR3Jvb3Z5U291cmNlQVNUIGV4dGVuZHMgQ29tbW9uQVNUIGltcGxlbWVudHMgQ29tcGFyYWJsZSB7CisgICAgcHJpdmF0ZSBpbnQgbGluZTsKKyAgICBwcml2YXRlIGludCBjb2w7CisgICAgcHJpdmF0ZSBpbnQgbGluZUxhc3Q7CisgICAgcHJpdmF0ZSBpbnQgY29sTGFzdDsKKyAgICBwcml2YXRlIFN0cmluZyBzbmlwcGV0OworCisgICAgcHVibGljIEdyb292eVNvdXJjZUFTVCgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgR3Jvb3Z5U291cmNlQVNUKFRva2VuIHQpIHsKKyAgICAgICAgc3VwZXIodCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShBU1QgYXN0KSB7CisgICAgICAgIHN1cGVyLmluaXRpYWxpemUoYXN0KTsKKyAgICAgICAgbGluZSA9IGFzdC5nZXRMaW5lKCk7CisgICAgICAgIGNvbCA9IGFzdC5nZXRDb2x1bW4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKFRva2VuIHQpIHsKKyAgICAgICAgc3VwZXIuaW5pdGlhbGl6ZSh0KTsKKyAgICAgICAgbGluZSA9IHQuZ2V0TGluZSgpOworICAgICAgICBjb2wgPSB0LmdldENvbHVtbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldExhc3QoVG9rZW4gbGFzdCkgeworICAgICAgICBsaW5lTGFzdCA9IGxhc3QuZ2V0TGluZSgpOworICAgICAgICBjb2xMYXN0ID0gbGFzdC5nZXRDb2x1bW4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldExpbmVMYXN0KCkgeworICAgICAgICByZXR1cm4gbGluZUxhc3Q7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TGluZUxhc3QoaW50IGxpbmVMYXN0KSB7CisgICAgICAgIHRoaXMubGluZUxhc3QgPSBsaW5lTGFzdDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldENvbHVtbkxhc3QoKSB7CisgICAgICAgIHJldHVybiBjb2xMYXN0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvbHVtbkxhc3QoaW50IGNvbExhc3QpIHsKKyAgICAgICAgdGhpcy5jb2xMYXN0ID0gY29sTGFzdDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMaW5lKGludCBsaW5lKSB7CisgICAgICAgIHRoaXMubGluZSA9IGxpbmU7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRMaW5lKCkgeworICAgICAgICByZXR1cm4gKGxpbmUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvbHVtbihpbnQgY29sdW1uKSB7CisgICAgICAgIHRoaXMuY29sID0gY29sdW1uOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0Q29sdW1uKCkgeworICAgICAgICByZXR1cm4gKGNvbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U25pcHBldChTdHJpbmcgc25pcHBldCkgeworICAgICAgICB0aGlzLnNuaXBwZXQgPSBzbmlwcGV0OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U25pcHBldCgpIHsKKyAgICAgICAgcmV0dXJuIHNuaXBwZXQ7CisgICAgfQorCisgICAgcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG9iamVjdCkgeworICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGlmICghKG9iamVjdCBpbnN0YW5jZW9mIEFTVCkpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIEFTVCB0aGF0ID0gKEFTVCkgb2JqZWN0OworCisgICAgICAgIC8vIHRvZG8gLSBwb3NzaWJseSBjaGVjayBmb3IgbGluZS9jb2wgd2l0aCB2YWx1ZXMgb2YgMCBvciBsZXNzLi4uCisKKyAgICAgICAgaWYgKHRoaXMuZ2V0TGluZSgpIDwgdGhhdC5nZXRMaW5lKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5nZXRMaW5lKCkgPiB0aGF0LmdldExpbmUoKSkgeworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgICAgICBpZiAodGhpcy5nZXRDb2x1bW4oKSA8IHRoYXQuZ2V0Q29sdW1uKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5nZXRDb2x1bW4oKSA+IHRoYXQuZ2V0Q29sdW1uKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIEdyb292eVNvdXJjZUFTVCBjaGlsZEF0KGludCBwb3NpdGlvbikgeworICAgICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIEFTVCBjaGlsZCA9IHRoaXMuZ2V0Rmlyc3RDaGlsZCgpOworICAgICAgICB3aGlsZSAoY2hpbGQgIT0gbnVsbCkgeworICAgICAgICAgICAgbGlzdC5hZGQoY2hpbGQpOworICAgICAgICAgICAgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gKEdyb292eVNvdXJjZUFTVClsaXN0LmdldChwb3NpdGlvbik7CisgICAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgR3Jvb3Z5U291cmNlQVNUIGNoaWxkT2ZUeXBlKGludCB0eXBlKSB7CisgICAgICAgIEFTVCBjaGlsZCA9IHRoaXMuZ2V0Rmlyc3RDaGlsZCgpOworICAgICAgICB3aGlsZSAoY2hpbGQgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGNoaWxkLmdldFR5cGUoKSA9PSB0eXBlKSB7IHJldHVybiAoR3Jvb3Z5U291cmNlQVNUKWNoaWxkOyB9CisgICAgICAgICAgICBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci9MZXhlckZyYW1lLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci9MZXhlckZyYW1lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MxZjU5YQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudGxyL0xleGVyRnJhbWUuamF2YQpAQCAtMCwwICsxLDIwOCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5hbnRscjsKK2ltcG9ydCBqYXZhLmF3dC4qOworaW1wb3J0IGphdmEuYXd0LmV2ZW50Lio7CitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKKworaW1wb3J0IGphdmF4LnN3aW5nLio7CitpbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLkJvcmRlcjsKK2ltcG9ydCBqYXZheC5zd2luZy50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50bHIucGFyc2VyLio7CisKK2ltcG9ydCBhbnRsci4qOworCisvKioKKyAqIEBhdXRob3IgU2FudGhvc2ggS3VtYXIgVAorICogQHZlcnNpb24gMS4wCisgKi8KKworcHVibGljIGNsYXNzIExleGVyRnJhbWUgZXh0ZW5kcyBKRnJhbWUgaW1wbGVtZW50cyBBY3Rpb25MaXN0ZW5lcnsKKyAgICBKU3BsaXRQYW5lIGpTcGxpdFBhbmUxID0gbmV3IEpTcGxpdFBhbmUoKTsKKyAgICBKU2Nyb2xsUGFuZSBqU2Nyb2xsUGFuZTEgPSBuZXcgSlNjcm9sbFBhbmUoKTsKKyAgICBKU2Nyb2xsUGFuZSBqU2Nyb2xsUGFuZTIgPSBuZXcgSlNjcm9sbFBhbmUoKTsKKyAgICBKVGV4dFBhbmUgdG9rZW5QYW5lID0gbmV3IEhTY3JvbGxhYmxlVGV4dFBhbmUoKTsKKyAgICBKQnV0dG9uIGpidXR0b24gPSBuZXcgSkJ1dHRvbigib3BlbiIpOworICAgIEpQYW5lbCBtYWluUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBCb3JkZXJMYXlvdXQoKSk7CisgICAgSlRleHRBcmVhIHNjcmlwdFBhbmUgPSBuZXcgSlRleHRBcmVhKCk7CisgICAgQm9yZGVyIGJvcmRlcjE7CisgICAgQm9yZGVyIGJvcmRlcjI7CisKKyAgICBDbGFzcyBsZXhlckNsYXNzOworCisgICAgcHVibGljIExleGVyRnJhbWUoQ2xhc3MgbGV4ZXJDbGFzcywgQ2xhc3MgdG9rZW5UeXBlc0NsYXNzKXsKKyAgICAgICAgc3VwZXIoIlRva2VuIFN0ZWFtIFZpZXdlciIpOworICAgICAgICB0aGlzLmxleGVyQ2xhc3MgPSBsZXhlckNsYXNzOworICAgICAgICB0cnl7CisgICAgICAgICAgICBqYkluaXQoKTsKKyAgICAgICAgICAgIHNldFNpemUoNTAwLCA1MDApOworICAgICAgICAgICAgbGlzdFRva2Vucyh0b2tlblR5cGVzQ2xhc3MpOworCisgICAgICAgICAgICBmaW5hbCBKUG9wdXBNZW51IHBvcHVwID0gbmV3IEpQb3B1cE1lbnUoKTsKKyAgICAgICAgICAgIHBvcHVwLmFkZChsb2FkRmlsZUFjdGlvbik7CisKKyAgICAgICAgICAgIGpidXR0b24uc2V0U2l6ZSgzMCwzMCk7CisgICAgICAgICAgICBqYnV0dG9uLmFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlQWRhcHRlcigpeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlUmVsZWFzZWQoTW91c2VFdmVudCBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vaWYoZS5pc1BvcHVwVHJpZ2dlcigpKQorICAgICAgICAgICAgICAgICAgICAgICAgcG9wdXAuc2hvdyhzY3JpcHRQYW5lLCBlLmdldFgoKSwgZS5nZXRZKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgc2V0RGVmYXVsdENsb3NlT3BlcmF0aW9uKEpGcmFtZS5FWElUX09OX0NMT1NFKTsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgSGFzaHRhYmxlIHRva2VucyA9IG5ldyBIYXNodGFibGUoKTsKKworICAgIHByaXZhdGUgdm9pZCBsaXN0VG9rZW5zKENsYXNzIHRva2VuVHlwZXMpIHRocm93cyBFeGNlcHRpb257CisgICAgICAgIEZpZWxkIGZpZWxkW10gPSB0b2tlblR5cGVzLmdldERlY2xhcmVkRmllbGRzKCk7CisgICAgICAgIGZvcihpbnQgaSA9IDA7IGk8ZmllbGQubGVuZ3RoOyBpKyspCisgICAgICAgICAgICB0b2tlbnMucHV0KGZpZWxkW2ldLmdldChudWxsKSwgZmllbGRbaV0uZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgYWUpeworICAgICAgICBUb2tlbiB0b2tlbiA9IChUb2tlbikgKChKQ29tcG9uZW50KSBhZS5nZXRTb3VyY2UoKSkuZ2V0Q2xpZW50UHJvcGVydHkoInRva2VuIik7CisgICAgICAgIGlmKHRva2VuLmdldFR5cGUoKT09VG9rZW4uRU9GX1RZUEUpeworICAgICAgICAgICAgc2NyaXB0UGFuZS5zZWxlY3QoMCwgMCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdHJ5eworICAgICAgICAgICAgaW50IHN0YXJ0ID0gc2NyaXB0UGFuZS5nZXRMaW5lU3RhcnRPZmZzZXQodG9rZW4uZ2V0TGluZSgpLTEpK3Rva2VuLmdldENvbHVtbigpLTE7CisgICAgICAgICAgICBzY3JpcHRQYW5lLnNlbGVjdChzdGFydCwgc3RhcnQrdG9rZW4uZ2V0VGV4dCgpLmxlbmd0aCgpKTsKKyAgICAgICAgICAgIHNjcmlwdFBhbmUucmVxdWVzdEZvY3VzKCk7CisgICAgICAgIH0gY2F0Y2goQmFkTG9jYXRpb25FeGNlcHRpb24gZXgpeworICAgICAgICAgICAgLy8gSUdOT1JFCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIEFjdGlvbiBsb2FkRmlsZUFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigiT3BlbiBGaWxlLi4uIil7CisgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBhZSl7CisgICAgICAgICAgICBKRmlsZUNob29zZXIgamZjID0gbmV3IEpGaWxlQ2hvb3NlcigpOworICAgICAgICAgICAgaW50IHJlc3BvbnNlID0gamZjLnNob3dPcGVuRGlhbG9nKExleGVyRnJhbWUudGhpcyk7CisgICAgICAgICAgICBpZihyZXNwb25zZSE9SkZpbGVDaG9vc2VyLkFQUFJPVkVfT1BUSU9OKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIHRyeXsKKyAgICAgICAgICAgICAgICBzY2FuU2NyaXB0KGpmYy5nZXRTZWxlY3RlZEZpbGUoKSk7CisgICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBleCl7CisgICAgICAgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSB2b2lkIHNjYW5TY3JpcHQoRmlsZSBmaWxlKSB0aHJvd3MgRXhjZXB0aW9ueworICAgICAgICBzY3JpcHRQYW5lLnJlYWQobmV3IEZpbGVSZWFkZXIoZmlsZSksIG51bGwpOworCisgICAgICAgIC8vIGNyZWF0ZSBsZXhlcgorICAgICAgICBDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IGxleGVyQ2xhc3MuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW117SW5wdXRTdHJlYW0uY2xhc3N9KTsKKyAgICAgICAgQ2hhclNjYW5uZXIgbGV4ZXIgPSAoQ2hhclNjYW5uZXIpIGNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKG5ldyBPYmplY3RbXXtuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpfSk7CisKKyAgICAgICAgdG9rZW5QYW5lLnNldEVkaXRhYmxlKHRydWUpOworICAgICAgICB0b2tlblBhbmUuc2V0VGV4dCgiIik7CisKKyAgICAgICAgaW50IGxpbmUgPSAxOworICAgICAgICBCdXR0b25Hcm91cCBiZyA9IG5ldyBCdXR0b25Hcm91cCgpOworICAgICAgICBUb2tlbiB0b2tlbiA9IG51bGw7CisKKyAgICAgICAgd2hpbGUodHJ1ZSl7CisgICAgICAgICAgICB0b2tlbiA9IGxleGVyLm5leHRUb2tlbigpOworICAgICAgICAgICAgSlRvZ2dsZUJ1dHRvbiB0b2tlbkJ1dHRvbiA9IG5ldyBKVG9nZ2xlQnV0dG9uKChTdHJpbmcpIHRva2Vucy5nZXQobmV3IEludGVnZXIodG9rZW4uZ2V0VHlwZSgpKSkpOworICAgICAgICAgICAgYmcuYWRkKHRva2VuQnV0dG9uKTsKKyAgICAgICAgICAgIHRva2VuQnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgdG9rZW5CdXR0b24uc2V0VG9vbFRpcFRleHQodG9rZW4uZ2V0VGV4dCgpKTsKKyAgICAgICAgICAgIHRva2VuQnV0dG9uLnB1dENsaWVudFByb3BlcnR5KCJ0b2tlbiIsIHRva2VuKTsKKyAgICAgICAgICAgIHRva2VuQnV0dG9uLnNldE1hcmdpbihuZXcgSW5zZXRzKDAsIDEsIDAsIDEpKTsKKyAgICAgICAgICAgIHRva2VuQnV0dG9uLnNldEZvY3VzUGFpbnRlZChmYWxzZSk7CisgICAgICAgICAgICBpZih0b2tlbi5nZXRMaW5lKCk+bGluZSl7CisgICAgICAgICAgICAgICAgdG9rZW5QYW5lLmdldERvY3VtZW50KCkuaW5zZXJ0U3RyaW5nKHRva2VuUGFuZS5nZXREb2N1bWVudCgpLmdldExlbmd0aCgpLCAiXG4iLCBudWxsKTsKKyAgICAgICAgICAgICAgICBsaW5lID0gdG9rZW4uZ2V0TGluZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5zZXJ0Q29tcG9uZW50KHRva2VuQnV0dG9uKTsKKyAgICAgICAgICAgIGlmKHRva2VuLmdldFR5cGUoKT09VG9rZW4uRU9GX1RZUEUpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICB0b2tlblBhbmUuc2V0RWRpdGFibGUoZmFsc2UpOworICAgICAgICB0b2tlblBhbmUuc2V0Q2FyZXRQb3NpdGlvbigwKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5zZXJ0Q29tcG9uZW50KEpDb21wb25lbnQgY29tcCl7CisgICAgICAgIHRyeXsKKyAgICAgICAgICAgIHRva2VuUGFuZS5nZXREb2N1bWVudCgpLmluc2VydFN0cmluZyh0b2tlblBhbmUuZ2V0RG9jdW1lbnQoKS5nZXRMZW5ndGgoKSwgIiAiLCBudWxsKTsKKyAgICAgICAgfSBjYXRjaChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBleDEpeworICAgICAgICAgICAgLy8gSWdub3JlCisgICAgICAgIH0KKyAgICAgICAgdHJ5eworICAgICAgICAgICAgdG9rZW5QYW5lLnNldENhcmV0UG9zaXRpb24odG9rZW5QYW5lLmdldERvY3VtZW50KCkuZ2V0TGVuZ3RoKCktMSk7CisgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGV4KXsKKyAgICAgICAgICAgIHRva2VuUGFuZS5zZXRDYXJldFBvc2l0aW9uKDApOworICAgICAgICB9CisgICAgICAgIHRva2VuUGFuZS5pbnNlcnRDb21wb25lbnQoY29tcCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGpiSW5pdCgpIHRocm93cyBFeGNlcHRpb257CisgICAgICAgIGJvcmRlcjEgPSBCb3JkZXJGYWN0b3J5LmNyZWF0ZUVtcHR5Qm9yZGVyKCk7CisgICAgICAgIGJvcmRlcjIgPSBCb3JkZXJGYWN0b3J5LmNyZWF0ZUVtcHR5Qm9yZGVyKCk7CisgICAgICAgIGpTcGxpdFBhbmUxLnNldE9yaWVudGF0aW9uKEpTcGxpdFBhbmUuVkVSVElDQUxfU1BMSVQpOworICAgICAgICB0b2tlblBhbmUuc2V0RWRpdGFibGUoZmFsc2UpOworICAgICAgICB0b2tlblBhbmUuc2V0VGV4dCgiIik7CisgICAgICAgIHNjcmlwdFBhbmUuc2V0Rm9udChuZXcgamF2YS5hd3QuRm9udCgiRGlhbG9nSW5wdXQiLCAwLCAxMikpOworICAgICAgICBzY3JpcHRQYW5lLnNldEVkaXRhYmxlKGZhbHNlKTsKKyAgICAgICAgc2NyaXB0UGFuZS5zZXRNYXJnaW4obmV3IEluc2V0cyg1LCA1LCA1LCA1KSk7CisgICAgICAgIHNjcmlwdFBhbmUuc2V0VGV4dCgiIik7CisgICAgICAgIGpTY3JvbGxQYW5lMS5zZXRCb3JkZXIoYm9yZGVyMSk7CisgICAgICAgIGpTY3JvbGxQYW5lMi5zZXRCb3JkZXIoYm9yZGVyMSk7CisgICAgICAgIGpTcGxpdFBhbmUxLnNldE1pbmltdW1TaXplKG5ldyBEaW1lbnNpb24oODAwLDYwMCkpOworICAgICAgICBtYWluUGFuZWwuYWRkKGpTcGxpdFBhbmUxLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKKyAgICAgICAgbWFpblBhbmVsLmFkZChqYnV0dG9uLEJvcmRlckxheW91dC5OT1JUSCk7CisgICAgICAgIHRoaXMuZ2V0Q29udGVudFBhbmUoKS5hZGQobWFpblBhbmVsKTsKKyAgICAgICAgalNwbGl0UGFuZTEuYWRkKGpTY3JvbGxQYW5lMSwgSlNwbGl0UGFuZS5MRUZUKTsKKyAgICAgICAgalNjcm9sbFBhbmUxLmdldFZpZXdwb3J0KCkuYWRkKHRva2VuUGFuZSwgbnVsbCk7CisgICAgICAgIGpTcGxpdFBhbmUxLmFkZChqU2Nyb2xsUGFuZTIsIEpTcGxpdFBhbmUuUklHSFQpOworICAgICAgICBqU2Nyb2xsUGFuZTIuZ2V0Vmlld3BvcnQoKS5hZGQoc2NyaXB0UGFuZSwgbnVsbCk7CisKKyAgICAgICAgalNjcm9sbFBhbmUxLnNldENvbHVtbkhlYWRlclZpZXcobmV3IEpMYWJlbCgiIFRva2VuIFN0cmVhbToiKSk7CisgICAgICAgIGpTY3JvbGxQYW5lMi5zZXRDb2x1bW5IZWFkZXJWaWV3KG5ldyBKTGFiZWwoIiBJbnB1dCBTY3JpcHQ6IikpOworICAgICAgICBqU3BsaXRQYW5lMS5zZXRSZXNpemVXZWlnaHQoMC41KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9ueworICAgICAgICB0cnl7CisgICAgICAgICAgICBVSU1hbmFnZXIuc2V0TG9va0FuZEZlZWwoVUlNYW5hZ2VyLmdldFN5c3RlbUxvb2tBbmRGZWVsQ2xhc3NOYW1lKCkpOworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBpZ25vcmUpeworICAgICAgICAgICAgLy8gSWdub3JlCisgICAgICAgIH0KKyAgICAgICAgbmV3IExleGVyRnJhbWUoR3Jvb3Z5TGV4ZXIuY2xhc3MsIEdyb292eVRva2VuVHlwZXMuY2xhc3MpLnNldFZpc2libGUodHJ1ZSk7CisgICAgfQorfQorCisKK2NsYXNzIEhTY3JvbGxhYmxlVGV4dFBhbmUgZXh0ZW5kcyBKVGV4dFBhbmV7CisgICAgcHVibGljIGJvb2xlYW4gZ2V0U2Nyb2xsYWJsZVRyYWNrc1ZpZXdwb3J0V2lkdGgoKXsKKyAgICAgICAgcmV0dXJuKGdldFNpemUoKS53aWR0aDxnZXRQYXJlbnQoKS5nZXRTaXplKCkud2lkdGgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNpemUoRGltZW5zaW9uIGQpeworICAgICAgICBpZihkLndpZHRoPGdldFBhcmVudCgpLmdldFNpemUoKS53aWR0aCl7CisgICAgICAgICAgICBkLndpZHRoID0gZ2V0UGFyZW50KCkuZ2V0U2l6ZSgpLndpZHRoOworICAgICAgICB9CisgICAgICAgIHN1cGVyLnNldFNpemUoZCk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudGxyL0xpbmVDb2x1bW4uamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudGxyL0xpbmVDb2x1bW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDkwNzIwCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvTGluZUNvbHVtbi5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50bHI7CisKKy8qKgorICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIGxpbmUgYW5kIGNvbHVtbiBwb3NpdGlvbgorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmdyb292eUByb3NzLXJheW5lci5jb20iPkplcmVteSBSYXluZXI8L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBMaW5lQ29sdW1uIHsKKyAgICBwcml2YXRlIGludCBsaW5lOworICAgIHByaXZhdGUgaW50IGNvbHVtbjsKKworICAgIHB1YmxpYyBMaW5lQ29sdW1uKGludCBsaW5lLCBpbnQgY29sdW1uKSB7CisgICAgICAgIHRoaXMubGluZSA9IGxpbmU7CisgICAgICAgIHRoaXMuY29sdW1uID0gY29sdW1uOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0TGluZSgpIHsKKyAgICAgICAgcmV0dXJuIGxpbmU7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRDb2x1bW4oKSB7CisgICAgICAgIHJldHVybiBjb2x1bW47CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCB0aGF0KSB7CisgICAgICAgIGlmICh0aGlzID09IHRoYXQpIHJldHVybiB0cnVlOworICAgICAgICBpZiAodGhhdCA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gdGhhdC5nZXRDbGFzcygpKSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgZmluYWwgTGluZUNvbHVtbiBsaW5lQ29sdW1uID0gKExpbmVDb2x1bW4pIHRoYXQ7CisKKyAgICAgICAgaWYgKGNvbHVtbiAhPSBsaW5lQ29sdW1uLmNvbHVtbikgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAobGluZSAhPSBsaW5lQ29sdW1uLmxpbmUpIHJldHVybiBmYWxzZTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgcmVzdWx0OworICAgICAgICByZXN1bHQgPSBsaW5lOworICAgICAgICByZXN1bHQgPSAyOSAqIHJlc3VsdCArIGNvbHVtbjsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIlsiICsgbGluZSArICIsIiArIGNvbHVtbiArICJdIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci9NYWluLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci9NYWluLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIwNzc4OQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudGxyL01haW4uamF2YQpAQCAtMCwwICsxLDE5MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5hbnRscjsKKworaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0FkYXB0ZXI7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93RXZlbnQ7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50bHIucGFyc2VyLkdyb292eUxleGVyOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50bHIucGFyc2VyLkdyb292eVJlY29nbml6ZXI7CisKK2ltcG9ydCBhbnRsci5BU1RGYWN0b3J5OworaW1wb3J0IGFudGxyLkNvbW1vbkFTVDsKK2ltcG9ydCBhbnRsci5Ub2tlbjsKK2ltcG9ydCBhbnRsci5jb2xsZWN0aW9ucy5BU1Q7CitpbXBvcnQgYW50bHIuZGVidWcubWlzYy5BU1RGcmFtZTsKKworY2xhc3MgTWFpbiB7CisKKyAgICBzdGF0aWMgYm9vbGVhbiB3aGl0ZXNwYWNlSW5jbHVkZWQgPSBmYWxzZTsKKworCXN0YXRpYyBib29sZWFuIHNob3dUcmVlID0gZmFsc2U7CisgICAgLy9zdGF0aWMgYm9vbGVhbiB4bWwgPSBmYWxzZTsKKwlzdGF0aWMgYm9vbGVhbiB2ZXJib3NlID0gZmFsc2U7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQkvLyBVc2UgYSB0cnkvY2F0Y2ggYmxvY2sgZm9yIHBhcnNlciBleGNlcHRpb25zCisJCXRyeSB7CisJCQkvLyBpZiB3ZSBoYXZlIGF0IGxlYXN0IG9uZSBjb21tYW5kLWxpbmUgYXJndW1lbnQKKwkJCWlmIChhcmdzLmxlbmd0aCA+IDAgKSB7CisJCQkJU3lzdGVtLmVyci5wcmludGxuKCJQYXJzaW5nLi4uIik7CisKKwkJCQkvLyBmb3IgZWFjaCBkaXJlY3RvcnkvZmlsZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZQorCQkJCWZvcihpbnQgaT0wOyBpPCBhcmdzLmxlbmd0aDtpKyspIHsKKwkJCQkJaWYgKCBhcmdzW2ldLmVxdWFscygiLXNob3d0cmVlIikgKSB7CisJCQkJCQlzaG93VHJlZSA9IHRydWU7CisJCQkJCX0KKyAgICAgICAgICAgICAgICAgICAgLy9lbHNlIGlmICggYXJnc1tpXS5lcXVhbHMoIi14bWwiKSApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgeG1sID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgLy99CisJCQkJCWVsc2UgaWYgKCBhcmdzW2ldLmVxdWFscygiLXZlcmJvc2UiKSApIHsKKwkJCQkJCXZlcmJvc2UgPSB0cnVlOworCQkJCQl9CisJCQkJCWVsc2UgaWYgKCBhcmdzW2ldLmVxdWFscygiLXRyYWNlIikgKSB7CisJCQkJCQlHcm9vdnlSZWNvZ25pemVyLnRyYWNpbmcgPSB0cnVlOworCQkJCQkJR3Jvb3Z5TGV4ZXIudHJhY2luZyA9IHRydWU7CisJCQkJCX0KKwkJCQkJZWxzZSBpZiAoIGFyZ3NbaV0uZXF1YWxzKCItdHJhY2VQYXJzZXIiKSApIHsKKwkJCQkJCUdyb292eVJlY29nbml6ZXIudHJhY2luZyA9IHRydWU7CisJCQkJCX0KKwkJCQkJZWxzZSBpZiAoIGFyZ3NbaV0uZXF1YWxzKCItdHJhY2VMZXhlciIpICkgeworCQkJCQkJR3Jvb3Z5TGV4ZXIudHJhY2luZyA9IHRydWU7CisJCQkJCX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggYXJnc1tpXS5lcXVhbHMoIi13aGl0ZXNwYWNlSW5jbHVkZWQiKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpdGVzcGFjZUluY2x1ZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisJCQkJCQlkb0ZpbGUobmV3IEZpbGUoYXJnc1tpXSkpOyAvLyBwYXJzZSBpdAorCQkJCQl9CisJCQkJfSB9CisJCQllbHNlCisJCQkJU3lzdGVtLmVyci5wcmludGxuKCJVc2FnZTogamF2YSAtamFyIGdyb292eWMuamFyIFstc2hvd3RyZWVdIFstdmVyYm9zZV0gWy10cmFjZXssTGV4ZXIsUGFyc2VyfV0iKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGRpcmVjdG9yeSBvciBmaWxlIG5hbWU+Iik7CisJCX0KKwkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKKwkJCVN5c3RlbS5lcnIucHJpbnRsbigiZXhjZXB0aW9uOiAiK2UpOworCQkJZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7ICAgLy8gc28gd2UgY2FuIGdldCBzdGFjayB0cmFjZQorCQl9CisJfQorCisKKwkvLyBUaGlzIG1ldGhvZCBkZWNpZGVzIHdoYXQgYWN0aW9uIHRvIHRha2UgYmFzZWQgb24gdGhlIHR5cGUgb2YKKwkvLyAgIGZpbGUgd2UgYXJlIGxvb2tpbmcgYXQKKwlwdWJsaWMgc3RhdGljIHZvaWQgZG9GaWxlKEZpbGUgZikKKwkJCQkJCQkgIHRocm93cyBFeGNlcHRpb24geworCQkvLyBJZiB0aGlzIGlzIGEgZGlyZWN0b3J5LCB3YWxrIGVhY2ggZmlsZS9kaXIgaW4gdGhhdCBkaXJlY3RvcnkKKwkJaWYgKGYuaXNEaXJlY3RvcnkoKSkgeworCQkJU3RyaW5nIGZpbGVzW10gPSBmLmxpc3QoKTsKKwkJCWZvcihpbnQgaT0wOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspCisJCQkJZG9GaWxlKG5ldyBGaWxlKGYsIGZpbGVzW2ldKSk7CisJCX0KKworCQkvLyBvdGhlcndpc2UsIGlmIHRoaXMgaXMgYSBncm9vdnkgZmlsZSwgcGFyc2UgaXQhCisJCWVsc2UgaWYgKGYuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuZ3Jvb3Z5IikpIHsKKwkJCVN5c3RlbS5lcnIucHJpbnRsbigiIC0tLSAiK2YuZ2V0QWJzb2x1dGVQYXRoKCkpOworCQkJLy8gcGFyc2VGaWxlKGYuZ2V0TmFtZSgpLCBuZXcgRmlsZUlucHV0U3RyZWFtKGYpKTsKKyAgICAgICAgICAgIFNvdXJjZUJ1ZmZlciBzb3VyY2VCdWZmZXIgPSBuZXcgU291cmNlQnVmZmVyKCk7CisgICAgICAgICAgICBVbmljb2RlRXNjYXBpbmdSZWFkZXIgdW5pY29kZVJlYWRlciA9IG5ldyBVbmljb2RlRXNjYXBpbmdSZWFkZXIobmV3IEZpbGVSZWFkZXIoZiksc291cmNlQnVmZmVyKTsKKyAgICAgICAgICAgIEdyb292eUxleGVyIGxleGVyID0gbmV3IEdyb292eUxleGVyKHVuaWNvZGVSZWFkZXIpOworICAgICAgICAgICAgdW5pY29kZVJlYWRlci5zZXRMZXhlcihsZXhlcik7CisJCQlwYXJzZUZpbGUoZi5nZXROYW1lKCksbGV4ZXIsc291cmNlQnVmZmVyKTsKKwkJfQorCX0KKworCS8vIEhlcmUncyB3aGVyZSB3ZSBkbyB0aGUgcmVhbCB3b3JrLi4uCisJcHVibGljIHN0YXRpYyB2b2lkIHBhcnNlRmlsZShTdHJpbmcgZiwgR3Jvb3Z5TGV4ZXIgbCwgU291cmNlQnVmZmVyIHNvdXJjZUJ1ZmZlcikKKwkJCQkJCQkJIHRocm93cyBFeGNlcHRpb24geworCQl0cnkgeworCQkJLy8gQ3JlYXRlIGEgcGFyc2VyIHRoYXQgcmVhZHMgZnJvbSB0aGUgc2Nhbm5lcgorCQkJR3Jvb3Z5UmVjb2duaXplciBwYXJzZXIgPSBHcm9vdnlSZWNvZ25pemVyLm1ha2UobCk7CisgICAgICAgICAgICBwYXJzZXIuc2V0U291cmNlQnVmZmVyKHNvdXJjZUJ1ZmZlcik7CisJCQlwYXJzZXIuc2V0RmlsZW5hbWUoZik7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aGl0ZXNwYWNlSW5jbHVkZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm9vdnlMZXhlciBsZXhlciA9IHBhcnNlci5nZXRMZXhlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxleGVyLnNldFdoaXRlc3BhY2VJbmNsdWRlZCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbiB0ID0gbGV4ZXIubmV4dFRva2VuKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgPT0gbnVsbCB8fCB0LmdldFR5cGUoKSA9PSBUb2tlbi5FT0ZfVFlQRSkgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKwkJCS8vIHN0YXJ0IHBhcnNpbmcgYXQgdGhlIGNvbXBpbGF0aW9uVW5pdCBydWxlCisJCQlwYXJzZXIuY29tcGlsYXRpb25Vbml0KCk7CisJCQkKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigicGFyc2VGaWxlICIrZisiID0+ICIrcGFyc2VyLmdldEFTVCgpKTsKKworCQkJLy8gZG8gc29tZXRoaW5nIHdpdGggdGhlIHRyZWUKKwkJCWRvVHJlZUFjdGlvbihmLCBwYXJzZXIuZ2V0QVNUKCksIHBhcnNlci5nZXRUb2tlbk5hbWVzKCkpOworCQl9CisJCWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJU3lzdGVtLmVyci5wcmludGxuKCJwYXJzZXIgZXhjZXB0aW9uOiAiK2UpOworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsgICAvLyBzbyB3ZSBjYW4gZ2V0IHN0YWNrIHRyYWNlCQkKKwkJfQorCX0KKwkKKwlwdWJsaWMgc3RhdGljIHZvaWQgZG9UcmVlQWN0aW9uKFN0cmluZyBmLCBBU1QgdCwgU3RyaW5nW10gdG9rZW5OYW1lcykgeworCQlpZiAoIHQ9PW51bGwgKSByZXR1cm47CisJCWlmICggc2hvd1RyZWUgKSB7CisJCQlDb21tb25BU1Quc2V0VmVyYm9zZVN0cmluZ0NvbnZlcnNpb24odHJ1ZSwgdG9rZW5OYW1lcyk7CisJCQlBU1RGYWN0b3J5IGZhY3RvcnkgPSBuZXcgQVNURmFjdG9yeSgpOworCQkJQVNUIHIgPSBmYWN0b3J5LmNyZWF0ZSgwLCJBU1QgUk9PVCIpOworCQkJci5zZXRGaXJzdENoaWxkKHQpOworCQkJZmluYWwgQVNURnJhbWUgZnJhbWUgPSBuZXcgQVNURnJhbWUoIkdyb292eSBBU1QiLCByKTsKKwkJCWZyYW1lLnNldFZpc2libGUodHJ1ZSk7CisJCQlmcmFtZS5hZGRXaW5kb3dMaXN0ZW5lcigKKwkJCQluZXcgV2luZG93QWRhcHRlcigpIHsKKyAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aW5kb3dDbG9zaW5nIChXaW5kb3dFdmVudCBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLnNldFZpc2libGUoZmFsc2UpOyAvLyBoaWRlIHRoZSBGcmFtZQorICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS5kaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5leGl0KDApOworICAgICAgICAgICAgICAgICAgIH0KKwkJICAgICAgICB9CisJCQkpOworCQkJaWYgKHZlcmJvc2UpICBTeXN0ZW0ub3V0LnByaW50bG4odC50b1N0cmluZ0xpc3QoKSk7CisJCX0KKyAgICAgICAgLyppZiAoIHhtbCApIHsKKwkJCSgoQ29tbW9uQVNUKXQpLnNldFZlcmJvc2VTdHJpbmdDb252ZXJzaW9uKHRydWUsIHRva2VuTmFtZXMpOworCQkJQVNURmFjdG9yeSBmYWN0b3J5ID0gbmV3IEFTVEZhY3RvcnkoKTsKKwkJCUFTVCByID0gZmFjdG9yeS5jcmVhdGUoMCwiQVNUIFJPT1QiKTsKKwkJCXIuc2V0Rmlyc3RDaGlsZCh0KTsKKyAgICAgICAgICAgIFhTdHJlYW0geHN0cmVhbSA9IG5ldyBYU3RyZWFtKCk7CisgICAgICAgICAgICB4c3RyZWFtLmFsaWFzKCJhc3QiLCBDb21tb25BU1QuY2xhc3MpOworCQkJdHJ5IHsKKyAgICAgICAgICAgICAgICB4c3RyZWFtLnRvWE1MKHIsbmV3IEZpbGVXcml0ZXIoZiArICIueG1sIikpOworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV3JpdHRlbiBBU1QgdG8gIiArIGYgKyAiLnhtbCIpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNvdWxkbid0IHdyaXRlIHRvICIgKyBmICsgIi54bWwiKTsKKyAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgfQorCQkJLy9pZiAodmVyYm9zZSkgIFN5c3RlbS5vdXQucHJpbnRsbih0LnRvU3RyaW5nTGlzdCgpKTsKKwkJfSovCisJLypAdG9kbworCQlHcm9vdnlUcmVlUGFyc2VyIHRwYXJzZSA9IG5ldyBHcm9vdnlUcmVlUGFyc2VyKCk7CisJCXRyeSB7CisJCQl0cGFyc2UuY29tcGlsYXRpb25Vbml0KHQpOworCQkJaWYgKHZlcmJvc2UpICBTeXN0ZW0ub3V0LnByaW50bG4oInN1Y2Nlc3NmdWwgd2FsayBvZiByZXN1bHQgQVNUIGZvciAiK2YpOworCQl9CisJCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBlKSB7CisJCQlTeXN0ZW0uZXJyLnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCUB0b2RvKi8KKworCX0KK30KKwpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvU291cmNlQnVmZmVyLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci9Tb3VyY2VCdWZmZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjgxZGJlCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvU291cmNlQnVmZmVyLmphdmEKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudGxyOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworLyoqCisgKiBBIHNpbXBsZSBidWZmZXIgdGhhdCBwcm92aWRlcyBsaW5lL2NvbCBhY2Nlc3MgdG8gY2h1bmtzIG9mIHNvdXJjZSBjb2RlCisgKiBoZWxkIHdpdGhpbiBpdHNlbGYuCisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Z3Jvb3Z5QHJvc3MtcmF5bmVyLmNvbSI+SmVyZW15IFJheW5lcjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIFNvdXJjZUJ1ZmZlciB7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0IGxpbmVzOworICAgIHByaXZhdGUgU3RyaW5nQnVmZmVyIGN1cnJlbnQ7CisKKyAgICBwdWJsaWMgU291cmNlQnVmZmVyKCkgeworICAgICAgICBsaW5lcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgLy9saW5lcy5hZGQobmV3IFN0cmluZ0J1ZmZlcigpKTsgLy8gZHVtbXkgcm93IGZvciBwb3NpdGlvbiBbMF0gaW4gdGhlIExpc3QKKworICAgICAgICBjdXJyZW50ID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBsaW5lcy5hZGQoY3VycmVudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogT2J0YWlucyBhIHNuaXBwZXQgb2YgdGhlIHNvdXJjZSBjb2RlIHdpdGhpbiB0aGUgYm91bmRzIHNwZWNpZmllZAorICAgICAqIEBwYXJhbSBzdGFydCAoaW5jbHVzaXZlIGxpbmUvIGluY2x1c2l2ZSBjb2x1bW4pCisgICAgICogQHBhcmFtIGVuZCAoaW5jbHVzaXZlIGxpbmUgLyBleGNsdXNpdmUgY29sdW1uKQorICAgICAqIEByZXR1cm4gc3BlY2lmaWVkIHNuaXBwZXQgb2Ygc291cmNlIGNvZGUgYXMgYSBTdHJpbmcsIG9yIG51bGwgaWYgbm8gc291cmNlIGF2YWlsYWJsZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U25pcHBldChMaW5lQ29sdW1uIHN0YXJ0LCBMaW5lQ29sdW1uIGVuZCkgeworICAgICAgICAvLyBwcmVjb25kaXRpb25zCisgICAgICAgIGlmIChzdGFydCA9PSBudWxsIHx8IGVuZCA9PSBudWxsKSB7IHJldHVybiBudWxsOyB9IC8vIG5vIHRleHQgdG8gcmV0dXJuCisgICAgICAgIGlmIChzdGFydC5lcXVhbHMoZW5kKSkgeyByZXR1cm4gbnVsbDsgfSAvLyBubyB0ZXh0IHRvIHJldHVybgorICAgICAgICBpZiAobGluZXMuc2l6ZSgpID09IDEgJiYgY3VycmVudC5sZW5ndGgoKSA9PSAwKSB7IHJldHVybiBudWxsOyB9IC8vIGJ1ZmZlciBoYXNuJ3QgYmVlbiBmaWxsZWQgeWV0CisKKyAgICAgICAgLy8gd29ya2luZyB2YXJpYWJsZXMKKyAgICAgICAgaW50IHN0YXJ0TGluZSA9IHN0YXJ0LmdldExpbmUoKTsKKyAgICAgICAgaW50IHN0YXJ0Q29sdW1uID0gc3RhcnQuZ2V0Q29sdW1uKCk7CisgICAgICAgIGludCBlbmRMaW5lID0gZW5kLmdldExpbmUoKTsKKyAgICAgICAgaW50IGVuZENvbHVtbiA9IGVuZC5nZXRDb2x1bW4oKTsKKworICAgICAgICAvLyByZXNldCBhbnkgb3V0IG9mIGJvdW5kcyByZXF1ZXN0cworICAgICAgICBpZiAoc3RhcnRMaW5lIDwgMSkgeyBzdGFydExpbmUgPSAxO30KKyAgICAgICAgaWYgKGVuZExpbmUgPCAxKSB7IGVuZExpbmUgPSAxO30KKyAgICAgICAgaWYgKHN0YXJ0Q29sdW1uIDwgMSkgeyBzdGFydENvbHVtbiA9IDE7fQorICAgICAgICBpZiAoZW5kQ29sdW1uIDwgMSkgeyBlbmRDb2x1bW4gPSAxO30KKyAgICAgICAgaWYgKHN0YXJ0TGluZSA+IGxpbmVzLnNpemUoKSkgeyBzdGFydExpbmUgPSBsaW5lcy5zaXplKCk7IH0KKyAgICAgICAgaWYgKGVuZExpbmUgPiBsaW5lcy5zaXplKCkpIHsgZW5kTGluZSA9IGxpbmVzLnNpemUoKTsgfQorCisgICAgICAgIC8vIG9idGFpbiB0aGUgc25pcHBldCBmcm9tIHRoZSBidWZmZXIgd2l0aGluIHNwZWNpZmllZCBib3VuZHMKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNuaXBwZXQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGZvciAoaW50IGkgPSBzdGFydExpbmUgLSAxOyBpIDwgZW5kTGluZTtpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyBsaW5lID0gKChTdHJpbmdCdWZmZXIpbGluZXMuZ2V0KGkpKS50b1N0cmluZygpOworICAgICAgICAgICAgaWYgKHN0YXJ0TGluZSA9PSBlbmRMaW5lKSB7CisgICAgICAgICAgICAgICAgLy8gcmVzZXQgYW55IG91dCBvZiBib3VuZHMgcmVxdWVzdHMgKGFnYWluKQorICAgICAgICAgICAgICAgIGlmIChzdGFydENvbHVtbiA+IGxpbmUubGVuZ3RoKCkpIHsgc3RhcnRDb2x1bW4gPSBsaW5lLmxlbmd0aCgpO30KKyAgICAgICAgICAgICAgICBpZiAoc3RhcnRDb2x1bW4gPCAxKSB7IHN0YXJ0Q29sdW1uID0gMTt9CisgICAgICAgICAgICAgICAgaWYgKGVuZENvbHVtbiA+IGxpbmUubGVuZ3RoKCkpIHsgZW5kQ29sdW1uID0gbGluZS5sZW5ndGgoKSArIDE7fQorICAgICAgICAgICAgICAgIGlmIChlbmRDb2x1bW4gPCAxKSB7IGVuZENvbHVtbiA9IDE7fQorCisgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuc3Vic3RyaW5nKHN0YXJ0Q29sdW1uIC0gMSwgZW5kQ29sdW1uIC0gMSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChpID09IHN0YXJ0TGluZSAtIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0Q29sdW1uIC0gMSA8IGxpbmUubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN1YnN0cmluZyhzdGFydENvbHVtbiAtIDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpID09IGVuZExpbmUgLSAxKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChlbmRDb2x1bW4gLSAxIDwgbGluZS5sZW5ndGgoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuc3Vic3RyaW5nKDAsZW5kQ29sdW1uIC0gMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzbmlwcGV0LmFwcGVuZChsaW5lKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc25pcHBldC50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBpbnRvIHRoZSBidWZmZXIKKyAgICAgKiBAcGFyYW0gYworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBjKSB7CisgICAgICAgIGlmIChjICE9IC0xKSB7CisgICAgICAgICAgICBjdXJyZW50LmFwcGVuZCgoY2hhciljKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYyA9PSAnXG4nKSB7CisgICAgICAgICAgICBjdXJyZW50ID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgbGluZXMuYWRkKGN1cnJlbnQpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvVW5pY29kZUVzY2FwaW5nUmVhZGVyLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci9Vbmljb2RlRXNjYXBpbmdSZWFkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTJjNGNmCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvVW5pY29kZUVzY2FwaW5nUmVhZGVyLmphdmEKQEAgLTAsMCArMSwxNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5hbnRscjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CisKK2ltcG9ydCBhbnRsci5DaGFyU2Nhbm5lcjsKKworLyoqCisgKiBUcmFuc2xhdGVzIEdMUy1kZWZpbmVkIHVuaWNvZGUgZXNjYXBlcyBpbnRvIGNoYXJhY3RlcnMuIFRocm93cyBhbiBleGNlcHRpb24KKyAqIGluIHRoZSBldmVudCBvZiBhbiBpbnZhbGlkIHVuaWNvZGUgZXNjYXBlIGJlaW5nIGRldGVjdGVkLgorICoKKyAqIDxwPk5vIGF0dGVtcHQgaGFzIGJlZW4gbWFkZSB0byBvcHRpbWlzZSB0aGlzIGNsYXNzIGZvciBzcGVlZCBvcgorICogc3BhY2UuPC9wPgorICoKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIFVuaWNvZGVFc2NhcGluZ1JlYWRlciBleHRlbmRzIFJlYWRlciB7CisKKyAgICBwcml2YXRlIGZpbmFsIFJlYWRlciByZWFkZXI7CisgICAgcHJpdmF0ZSBDaGFyU2Nhbm5lciBsZXhlcjsKKyAgICBwcml2YXRlIGJvb2xlYW4gaGFzTmV4dENoYXIgPSBmYWxzZTsKKyAgICBwcml2YXRlIGludCBuZXh0Q2hhcjsKKyAgICBwcml2YXRlIGZpbmFsIFNvdXJjZUJ1ZmZlciBzb3VyY2VCdWZmZXI7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4KKyAgICAgKiBAcGFyYW0gcmVhZGVyIFRoZSByZWFkZXIgdGhhdCB0aGlzIHJlYWRlciB3aWxsIGZpbHRlciBvdmVyLgorICAgICAqLworICAgIHB1YmxpYyBVbmljb2RlRXNjYXBpbmdSZWFkZXIoUmVhZGVyIHJlYWRlcixTb3VyY2VCdWZmZXIgc291cmNlQnVmZmVyKSB7CisgICAgICAgIHRoaXMucmVhZGVyID0gcmVhZGVyOworICAgICAgICB0aGlzLnNvdXJjZUJ1ZmZlciA9IHNvdXJjZUJ1ZmZlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBsZXhlciB0aGF0IGlzIHVzaW5nIHRoaXMgcmVhZGVyLiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgdGhlCisgICAgICogbGV4ZXIgaXMgdXNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMZXhlcihDaGFyU2Nhbm5lciBsZXhlcikgeworICAgICAgICB0aGlzLmxleGVyID0gbGV4ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZHMgY2hhcmFjdGVycyBmcm9tIHRoZSB1bmRlcmx5aW5nIHJlYWRlci4KKyAgICAgKiBAc2VlIGphdmEuaW8uUmVhZGVyI3JlYWQoY2hhcltdLGludCxpbnQpCisgICAgICovCisgICAgcHVibGljIGludCByZWFkKGNoYXIgY2J1ZltdLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpbnQgYyA9IDA7CisgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgIHdoaWxlIChjb3VudCA8IGxlbiAmJiAoYyA9IHJlYWQoKSkhPSAtMSkgeworICAgICAgICAgICAgY2J1ZltvZmYgKyBjb3VudF0gPSAoY2hhcikgYzsKKyAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChjb3VudCA9PSAwICYmIGMgPT0gLTEpID8gLTEgOiBjb3VudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBuZXh0IGNoYXJhY3RlciBmcm9tIHRoZSB1bmRlcmx5aW5nIHJlYWRlciwKKyAgICAgKiB0cmFuc2xhdGluZyBlc2NhcGVzIGFzIHJlcXVpcmVkLgorICAgICAqIEBzZWUgamF2YS5pby5SZWFkZXIjY2xvc2UoKQorICAgICAqLworICAgIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChoYXNOZXh0Q2hhcikgeworICAgICAgICAgICAgaGFzTmV4dENoYXIgPSBmYWxzZTsKKyAgICAgICAgICAgIHdyaXRlKG5leHRDaGFyKTsKKyAgICAgICAgICAgIHJldHVybiBuZXh0Q2hhcjsKKyAgICAgICAgfQorCisgICAgICAgIGludCBjID0gcmVhZGVyLnJlYWQoKTsKKyAgICAgICAgaWYgKGMgIT0gJ1xcJykgeworICAgICAgICAgICAgd3JpdGUoYyk7CisgICAgICAgICAgICByZXR1cm4gYzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEhhdmUgb25lIGJhY2tzbGFzaCwgY29udGludWUgaWYgbmV4dCBjaGFyIGlzICd1JworICAgICAgICBjID0gcmVhZGVyLnJlYWQoKTsKKyAgICAgICAgaWYgKGMgIT0gJ3UnKSB7CisgICAgICAgICAgICBoYXNOZXh0Q2hhciA9IHRydWU7CisgICAgICAgICAgICBuZXh0Q2hhciA9IGM7CisgICAgICAgICAgICB3cml0ZSgnXFwnKTsKKyAgICAgICAgICAgIHJldHVybiAnXFwnOworICAgICAgICB9CisKKyAgICAgICAgLy8gU3dhbGxvdyBtdWx0aXBsZSAndSdzCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGMgPSByZWFkZXIucmVhZCgpOworICAgICAgICB9IHdoaWxlIChjID09ICd1Jyk7CisKKyAgICAgICAgLy8gR2V0IGZpcnN0IGhleCBkaWdpdAorICAgICAgICBjaGVja0hleERpZ2l0KGMpOworICAgICAgICBTdHJpbmdCdWZmZXIgY2hhck51bSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgY2hhck51bS5hcHBlbmQoKGNoYXIpIGMpOworCisgICAgICAgIC8vIE11c3Qgbm93IGJlIHRocmVlIG1vcmUgaGV4IGRpZ2l0cworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICAgICAgYyA9IHJlYWRlci5yZWFkKCk7CisgICAgICAgICAgICBjaGVja0hleERpZ2l0KGMpOworICAgICAgICAgICAgY2hhck51bS5hcHBlbmQoKGNoYXIpIGMpOworICAgICAgICB9CisgICAgICAgIGludCBydiA9IEludGVnZXIucGFyc2VJbnQoY2hhck51bS50b1N0cmluZygpLCAxNik7CisgICAgICAgIHdyaXRlKHJ2KTsKKyAgICAgICAgcmV0dXJuIHJ2OworICAgIH0KKyAgICBwcml2YXRlIHZvaWQgd3JpdGUoaW50IGMpIHsKKyAgICAgICAgaWYgKHNvdXJjZUJ1ZmZlciAhPSBudWxsKSB7c291cmNlQnVmZmVyLndyaXRlKGMpO30KKyAgICB9CisgICAgLyoqCisgICAgICogQ2hlY2tzIHRoYXQgdGhlIGdpdmVuIGNoYXJhY3RlciBpcyBpbmRlZWQgYSBoZXggZGlnaXQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrSGV4RGlnaXQoaW50IGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChjID49ICcwJyAmJiBjIDw9ICc5JykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChjID49ICdhJyAmJiBjIDw9ICdmJykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChjID49ICdBJyAmJiBjIDw9ICdGJykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIENhdXNlcyB0aGUgaW52YWxpZCBlc2NhcGUgdG8gYmUgc2tpcHBlZAorICAgICAgICBoYXNOZXh0Q2hhciA9IHRydWU7CisgICAgICAgIG5leHRDaGFyID0gYzsKKyAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJEaWQgbm90IGZpbmQgZm91ciBkaWdpdCBoZXggY2hhcmFjdGVyIGNvZGUuIgorICAgICAgICAgICAgICAgICsgIiBsaW5lOiAiICsgbGV4ZXIuZ2V0TGluZSgpICsgIiBjb2w6IiArIGxleGVyLmdldENvbHVtbigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhpcyByZWFkZXIgYnkgY2FsbGluZyBjbG9zZSBvbiB0aGUgdW5kZXJseWluZyByZWFkZXIuCisgICAgICogQHNlZSBqYXZhLmlvLlJlYWRlciNjbG9zZSgpCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZWFkZXIuY2xvc2UoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci9ncm9vdnkuZyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudGxyL2dyb292eS5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxOTM3ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci9ncm9vdnkuZwpAQCAtMCwwICsxLDM3NjMgQEAKKy8vIE5vdGU6IFBsZWFzZSBkb24ndCB1c2UgcGh5c2ljYWwgdGFicy4gIExvZ2ljYWwgdGFicyBmb3IgaW5kZW50IGFyZSB3aWR0aCA0LgoraGVhZGVyIHsKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5hbnRsci5wYXJzZXI7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hbnRsci4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgYW50bHIuSW5wdXRCdWZmZXI7CitpbXBvcnQgYW50bHIuTGV4ZXJTaGFyZWRJbnB1dFN0YXRlOworfQorIAorLyoqIEpTUi0yNDEgR3Jvb3Z5IFJlY29nbml6ZXIKKyAqCisgKiBSdW4gJ2phdmEgTWFpbiBbLXNob3d0cmVlXSBkaXJlY3RvcnktZnVsbC1vZi1ncm9vdnktZmlsZXMnCisgKgorICogW1RoZSAtc2hvd3RyZWUgb3B0aW9uIHBvcHMgdXAgYSBTd2luZyBmcmFtZSB0aGF0IHNob3dzCisgKiAgdGhlIEFTVCBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBwYXJzZXIuXQorICoKKyAqIENvbnRyaWJ1dGluZyBhdXRob3JzOgorICogICAgICAgICAgICAgIEpvaG4gTWl0Y2hlbGwgICAgICAgICAgIGpvaG5tQG5vbi5uZXQKKyAqICAgICAgICAgICAgICBUZXJlbmNlIFBhcnIgICAgICAgICAgICBwYXJydEBtYWdlbGFuZy5jb20KKyAqICAgICAgICAgICAgICBKb2huIExpbGxleSAgICAgICAgICAgICBqbGlsbGV5QGVtcGF0aHkuY29tCisgKiAgICAgICAgICAgICAgU2NvdHQgU3RhbmNoZmllbGQgICAgICAgdGhldGlja0BtYWdlbGFuZy5jb20KKyAqICAgICAgICAgICAgICBNYXJrdXMgTW9obmVuICAgICAgICAgICBtb2huZW5AaW5mb3JtYXRpay5yd3RoLWFhY2hlbi5kZQorICogICAgICAgICAgICAgIFBldGVyIFdpbGxpYW1zICAgICAgICAgIHBldGUud2lsbGlhbXNAc3VuLmNvbQorICogICAgICAgICAgICAgIEFsbGFuIEphY29icyAgICAgICAgICAgIEFsbGFuLkphY29ic0Blbmcuc3VuLmNvbQorICogICAgICAgICAgICAgIFN0ZXZlIE1lc3NpY2sgICAgICAgICAgIG1lc3NpY2tAcmVkaGlsbHMuY29tCisgKiAgICAgICAgICAgICAgSmFtZXMgU3RyYWNoYW4gICAgICAgICAganN0cmFjaGFuQHByb3RpcXVlLmNvbQorICogICAgICAgICAgICAgIEpvaG4gUHlidXMgICAgICAgICAgICAgIGpvaG5AcHlidXMub3JnCisgKiAgICAgICAgICAgICAgSm9obiBSb3NlICAgICAgICAgICAgICAgcm9zZTAwQG1hYy5jb20KKyAqICAgICAgICAgICAgICBKZXJlbXkgUmF5bmVyICAgICAgICAgICBncm9vdnlAcm9zcy1yYXluZXIuY29tCisgKiAgICAgICAgICAgICAgQWxleCBQb3Blc2N1ICAgICAgICAgICAgdGhlLm1pbmRzdG9ybUBnbWFpbC5jb20KKyAqCisgKiBWZXJzaW9uIDEuMDAgRGVjZW1iZXIgOSwgMTk5NyAtLSBpbml0aWFsIHJlbGVhc2UKKyAqIFZlcnNpb24gMS4wMSBEZWNlbWJlciAxMCwgMTk5NworICogICAgICAgICAgICAgIGZpeGVkIGJ1ZyBpbiBvY3RhbCBkZWYgKDAuLjcgbm90IDAuLjgpCisgKiBWZXJzaW9uIDEuMTAgQXVndXN0IDE5OTggKHBhcnJ0KQorICogICAgICAgICAgICAgIGFkZGVkIHRyZWUgY29uc3RydWN0aW9uCisgKiAgICAgICAgICAgICAgZml4ZWQgZGVmaW5pdGlvbiBvZiBXUyxjb21tZW50cyBmb3IgbWFjLHBjLHVuaXggbmV3bGluZXMKKyAqICAgICAgICAgICAgICBhZGRlZCB1bmFyeSBwbHVzCisgKiBWZXJzaW9uIDEuMTEgKE5vdiAyMCwgMTk5OCkKKyAqICAgICAgICAgICAgICBBZGRlZCAic2h1dHVwIiBvcHRpb24gdG8gdHVybiBvZmYgbGFzdCBhbWJpZyB3YXJuaW5nLgorICogICAgICAgICAgICAgIEZpeGVkIGlubmVyIGNsYXNzIGRlZiB0byBhbGxvdyBuYW1lZCBjbGFzcyBkZWZzIGFzIHN0YXRlbWVudHMKKyAqICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgcmVxdWlyZXMgY29tcG91bmQgbm90IHNpbXBsZSBzdGF0ZW1lbnQKKyAqICAgICAgICAgICAgICBhZGQgW10gYWZ0ZXIgYnVpbHRJblR5cGUgRE9UIGNsYXNzIGluIHByaW1hcnlFeHByZXNzaW9uCisgKiAgICAgICAgICAgICAgImNvbnN0IiBpcyByZXNlcnZlZCBidXQgbm90IHZhbGlkLi5yZW1vdmVkIGZyb20gbW9kaWZpZXJzCisgKiBWZXJzaW9uIDEuMTIgKEZlYiAyLCAxOTk5KQorICogICAgICAgICAgICAgIENoYW5nZWQgTElURVJBTF94eHggdG8geHh4IGluIHRyZWUgZ3JhbW1hci4KKyAqICAgICAgICAgICAgICBVcGRhdGVkIGphdmEuZyB0byB1c2UgdG9rZW5zIHsuLi59IG5vdyBmb3IgMi42LjAgKG5ldyBmZWF0dXJlKS4KKyAqCisgKiBWZXJzaW9uIDEuMTMgKEFwciAyMywgMTk5OSkKKyAqICAgICAgICAgICAgICBEaWRuJ3QgaGF2ZSAoc3RhdCk/IGZvciBlbHNlIGNsYXVzZSBpbiB0cmVlIHBhcnNlci4KKyAqICAgICAgICAgICAgICBEaWRuJ3QgZ2VuIEFTVHMgZm9yIGludGVyZmFjZSBleHRlbmRzLiAgVXBkYXRlZCB0cmVlIHBhcnNlciB0b28uCisgKiAgICAgICAgICAgICAgVXBkYXRlZCB0byAyLjYuMC4KKyAqIFZlcnNpb24gMS4xNCAoSnVuIDIwLCAxOTk5KQorICogICAgICAgICAgICAgIEFsbG93ZWQgZmluYWwvYWJzdHJhY3Qgb24gbG9jYWwgY2xhc3Nlcy4KKyAqICAgICAgICAgICAgICBSZW1vdmVkIGxvY2FsIGludGVyZmFjZXMgZnJvbSBtZXRob2RzCisgKiAgICAgICAgICAgICAgUHV0IGluc3RhbmNlb2YgcHJlY2VkZW5jZSB3aGVyZSBpdCBiZWxvbmdzLi4uaW4gcmVsYXRpb25hbEV4cHIKKyAqICAgICAgICAgICAgICAgICAgICAgIEl0IGFsc28gaGFkIGV4cHIgbm90IHR5cGUgYXMgYXJnOyBmaXhlZCBpdC4KKyAqICAgICAgICAgICAgICBNaXNzaW5nICEgb24gU0VNSSBpbiBjbGFzc0Jsb2NrCisgKiAgICAgICAgICAgICAgZml4ZWQ6IChleHByKSArICJzdHJpbmciIHdhcyBwYXJzZWQgaW5jb3JyZWN0bHkgKCsgYXMgdW5hcnkgcGx1cykuCisgKiAgICAgICAgICAgICAgZml4ZWQ6IGRpZG4ndCBsaWtlIE9iamVjdFtdLmNsYXNzIGluIHBhcnNlciBvciB0cmVlIHBhcnNlcgorICogVmVyc2lvbiAxLjE1IChKdW4gMjYsIDE5OTkpCisgKiAgICAgICAgICAgICAgU2NyZXdlZCB1cCBydWxlIHdpdGggaW5zdGFuY2VvZiBpbiBpdC4gOiggIEZpeGVkLgorICogICAgICAgICAgICAgIFRyZWUgcGFyc2VyIGRpZG4ndCBsaWtlIChleHByKS5zb21ldGhpbmc7IGZpeGVkLgorICogICAgICAgICAgICAgIEFsbG93ZWQgbXVsdGlwbGUgaW5oZXJpdGFuY2UgaW4gdHJlZSBncmFtbWFyLiBvb3BzLgorICogVmVyc2lvbiAxLjE2IChBdWd1c3QgMjIsIDE5OTkpCisgKiAgICAgICAgICAgICAgRXh0ZW5kaW5nIGFuIGludGVyZmFjZSBidWlsdCBhIHdhY2t5IHRyZWU6IGhhZCBleHRyYSBFWFRFTkRTLgorICogICAgICAgICAgICAgIFRyZWUgZ3JhbW1hciBkaWRuJ3QgYWxsb3cgbXVsdGlwbGUgc3VwZXJpbnRlcmZhY2VzLgorICogICAgICAgICAgICAgIFRyZWUgZ3JhbW1hciBkaWRuJ3QgYWxsb3cgZW1wdHkgdmFyIGluaXRpYWxpemVyOiB7fQorICogVmVyc2lvbiAxLjE3IChPY3RvYmVyIDEyLCAxOTk5KQorICogICAgICAgICAgICAgIEVTQyBsZXhlciBydWxlIGFsbG93ZWQgMzk5IG1heCBub3QgMzc3IG1heC4KKyAqICAgICAgICAgICAgICBqYXZhLnRyZWUuZyBkaWRuJ3QgaGFuZGxlIHRoZSBleHByZXNzaW9uIG9mIHN5bmNocm9uaXplZAorICogICAgICAgICAgICAgIHN0YXRlbWVudHMuCisgKiBWZXJzaW9uIDEuMTggKEF1Z3VzdCAxMiwgMjAwMSkKKyAqICAgICAgICAgICAgICBUZXJlbmNlIHVwZGF0ZWQgdG8gSmF2YSAyIFZlcnNpb24gMS4zIGJ5CisgKiAgICAgICAgICAgICAgb2JzZXJ2aW5nL2NvbWJpbmluZyB3b3JrIG9mIEFsbGFuIEphY29icyBhbmQgU3RldmUKKyAqICAgICAgICAgICAgICBNZXNzaWNrLiAgSGFuZGxlcyAxLjMgc3JjLiAgU3VtbWFyeToKKyAqICAgICAgICAgICAgICBvICBwcmltYXJ5IGRpZG4ndCBpbmNsdWRlIGJvb2xlYW4uY2xhc3Mga2luZCBvZiB0aGluZworICogICAgICAgICAgICAgIG8gIGNvbnN0cnVjdG9yIGNhbGxzIHBhcnNlZCBleHBsaWNpdGx5IG5vdzoKKyAqICAgICAgICAgICAgICAgICBzZWUgZXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24KKyAqICAgICAgICAgICAgICBvICBhZGQgc3RyaWN0ZnAgbW9kaWZpZXIKKyAqICAgICAgICAgICAgICBvICBtaXNzaW5nIG9iakJsb2NrIGFmdGVyIG5ldyBleHByZXNzaW9uIGluIHRyZWUgZ3JhbW1hcgorICogICAgICAgICAgICAgIG8gIG1lcmdlZCBsb2NhbCBjbGFzcyBkZWZpbml0aW9uIGFsdGVybmF0aXZlcywgbW92ZWQgYWZ0ZXIgZGVjbGFyYXRpb24KKyAqICAgICAgICAgICAgICBvICBmaXhlZCBwcm9ibGVtIHdpdGggQ2xhc3NOYW1lLnN1cGVyLmZpZWxkCisgKiAgICAgICAgICAgICAgbyAgcmVvcmRlcmVkIHNvbWUgYWx0ZXJuYXRpdmVzIHRvIG1ha2UgdGhpbmdzIG1vcmUgZWZmaWNpZW50CisgKiAgICAgICAgICAgICAgbyAgbG9uZyBhbmQgZG91YmxlIGNvbnN0YW50cyB3ZXJlIG5vdCBkaWZmZXJlbnRpYXRlZCBmcm9tIGludC9mbG9hdAorICogICAgICAgICAgICAgIG8gIHdoaXRlc3BhY2UgcnVsZSB3YXMgaW5lZmZpY2llbnQ6IG1hdGNoZWQgb25seSBvbmUgY2hhcgorICogICAgICAgICAgICAgIG8gIGFkZCBhbiBleGFtcGxlcyBkaXJlY3Rvcnkgd2l0aCBzb21lIG5hc3R5IDEuMyBjYXNlcworICogICAgICAgICAgICAgIG8gIG1hZGUgTWFpbi5qYXZhIHVzZSBidWZmZXJlZCBJTyBhbmQgYSBSZWFkZXIgZm9yIFVuaWNvZGUgc3VwcG9ydAorICogICAgICAgICAgICAgIG8gIHN1cHBvcnRzIFVOSUNPREU/CisgKiAgICAgICAgICAgICAgICAgVXNpbmcgVW5pY29kZSBjaGFyVm9jYWJ1bGF5IG1ha2VzIGNvZGUgZmlsZSBiaWcsIGJ1dCBvbmx5CisgKiAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdHNldHMgYXQgdGhlIGVuZC4gSSBuZWVkIHRvIG1ha2UgQU5UTFIgZ2VuZXJhdGUKKyAqICAgICAgICAgICAgICAgICB1bmljb2RlIGJpdHNldHMgbW9yZSBlZmZpY2llbnRseS4KKyAqIFZlcnNpb24gMS4xOSAoQXByaWwgMjUsIDIwMDIpCisgKiAgICAgICAgICAgICAgVGVyZW5jZSBhZGRlZCBpbiBuaWNlIGZpeGVzIGJ5IEpvaG4gUHlidXMgY29uY2VybmluZyBmbG9hdGluZworICogICAgICAgICAgICAgIGNvbnN0YW50cyBhbmQgcHJvYmxlbXMgd2l0aCBzdXBlcigpIGNhbGxzLiAgSm9obiBkaWQgYSBuaWNlCisgKiAgICAgICAgICAgICAgcmVvcmcgb2YgdGhlIHByaW1hcnkvcG9zdGZpeCBleHByZXNzaW9uIHN0dWZmIHRvIHJlYWQgYmV0dGVyCisgKiAgICAgICAgICAgICAgYW5kIG1ha2VzIGYuZy5zdXBlcigpIHBhcnNlIHByb3Blcmx5IChpdCB3YXMgTUVUSE9EX0NBTEwgbm90CisgKiAgICAgICAgICAgICAgYSBTVVBFUl9DVE9SX0NBTEwpLiAgQWxzbzoKKyAqCisgKiAgICAgICAgICAgICAgbyAgImZpbmFsbHkiIGNsYXVzZSB3YXMgYSByb290Li4ubWFkZSBpdCBhIGNoaWxkIG9mICJ0cnkiCisgKiAgICAgICAgICAgICAgbyAgQWRkZWQgc3R1ZmYgZm9yIGFzc2VydHMgdG9vIGZvciBKYXZhIDEuNCwgYnV0ICpjb21tZW50ZWQgb3V0KgorICogICAgICAgICAgICAgICAgIGFzIGl0IGlzIG5vdCBiYWNrd2FyZCBjb21wYXRpYmxlLgorICoKKyAqIFZlcnNpb24gMS4yMCAoT2N0b2JlciAyNywgMjAwMikKKyAqCisgKiAgICAgICAgVGVyZW5jZSBlbmRlZCB1cCByZW9yZ2luZyBKb2huIFB5YnVzJyBzdHVmZiB0bworICogICAgICAgIHJlbW92ZSBzb21lIG5vbmRldGVybWluaXNtcyBhbmQgc29tZSBzeW50YWN0aWMgcHJlZGljYXRlcy4KKyAqICAgICAgICBOb3RlIHRoYXQgdGhlIGdyYW1tYXIgaXMgc3RyaWN0ZXIgbm93OyBlLmcuLCB0aGlzKC4uLikgbXVzdAorICogICAgICBiZSB0aGUgZmlyc3Qgc3RhdGVtZW50LgorICoKKyAqICAgICAgICBUcmluYXJ5ID86IG9wZXJhdG9yIHdhc24ndCB3b3JraW5nIGFzIGFycmF5IG5hbWU6CisgKiAgICAgICAgICAgICAgICAoaXNCaWcgPyBiaWdEaWdpdHMgOiBkaWdpdHMpW2ldOworICoKKyAqICAgICAgICBDaGVja2VkIHBhcnNlci90cmVlIHBhcnNlciBvbiBzb3VyY2UgZm9yCisgKiAgICAgICAgICAgICAgICBSZXNpbi0yLjAuNSwgaml2ZS0yLjEuMSwgamRrIDEuMy4xLCBMdWNlbmUsIGFudGxyIDIuNy4yYTQsCisgKiAgICAgICAgICAgICAgYW5kIHRoZSAxMTBrLWxpbmUgakd1cnUgc2VydmVyIHNvdXJjZS4KKyAqCisgKiBWZXJzaW9uIDEuMjEgKE9jdG9iZXIgMTcsIDIwMDMpCisgKiAgRml4ZWQgbG90cyBvZiBwcm9ibGVtcyBpbmNsdWRpbmc6CisgKiAgUmF5IFdhbGRpbjogYWRkIHR5cGVEZWZpbml0aW9uIHRvIGludGVyZmFjZUJsb2NrIGluIGphdmEudHJlZS5nCisgKiAgSGUgZm91bmQgYSBwcm9ibGVtL2ZpeCB3aXRoIGZsb2F0aW5nIHBvaW50IHRoYXQgc3RhcnQgd2l0aCAwCisgKiAgUmF5IGFsc28gZml4ZWQgcHJvYmxlbSB0aGF0IChpbnQuY2xhc3MpIHdhcyBub3QgcmVjb2duaXplZC4KKyAqICBUaG9yc3RlbiB2YW4gRWxsZW4gbm90aWNlZCB0aGF0IFxuIGFyZSBhbGxvd2VkIGluY29ycmVjdGx5IGluIHN0cmluZ3MuCisgKiAgVEpQIGZpeGVkIENIQVJfTElURVJBTCBhbmFsb2dvdXNseS4KKyAqCisgKiBWZXJzaW9uIDEuMjEuMiAoTWFyY2gsIDIwMDMpCisgKiAgICAgICAgQ2hhbmdlcyBieSBNYXR0IFF1YWlsIHRvIHN1cHBvcnQgZ2VuZXJpY3MgKGFzIHBlciBKREsxLjUvSlNSMTQpCisgKiAgICAgICAgTm90ZXM6CisgKiAgICAgICAgbyBXZSBvbmx5IGFsbG93IHRoZSAiZXh0ZW5kcyIga2V5d29yZCBhbmQgbm90IHRoZSAiaW1wbGVtZW50cyIKKyAqICAgICAgICAgICAgICBrZXl3b3JkLCBzaW5jZSB0aGF0cyB3aGF0IEpTUjE0IHNlZW1zIHRvIGltcGx5LgorICogICAgICAgIG8gVGhhbmtzIHRvIE1vbnR5IFp1a293c2tpIGZvciBoaXMgaGVscCBvbiB0aGUgYW50bHItaW50ZXJlc3QKKyAqICAgICAgICAgICAgICBtYWlsIGxpc3QuCisgKiAgICAgICAgbyBUaGFua3MgdG8gQWxhbiBFbGlhc2VuIGZvciB0ZXN0aW5nIHRoZSBncmFtbWFyIG92ZXIgaGlzCisgKiAgICAgICAgICAgICAgRmluayBzb3VyY2UgYmFzZQorICoKKyAqIFZlcnNpb24gMS4yMiAoSnVseSwgMjAwNCkKKyAqICAgICAgICBDaGFuZ2VzIGJ5IE1pY2hhZWwgU3R1ZG1hbiB0byBzdXBwb3J0IEphdmEgMS41IGxhbmd1YWdlIGV4dGVuc2lvbnMKKyAqICAgICAgICBOb3RlczoKKyAqICAgICAgICBvIEFkZGVkIHN1cHBvcnQgZm9yIGFubm90YXRpb25zIHR5cGVzCisgKiAgICAgICAgbyBGaW5pc2hlZCBvZmYgTWF0dCBRdWFpbCdzIGdlbmVyaWNzIGVuaGFuY2VtZW50cyB0byBzdXBwb3J0IGJvdW5kIHR5cGUgYXJndW1lbnRzCisgKiAgICAgICAgbyBBZGRlZCBzdXBwb3J0IGZvciBuZXcgZm9yIHN0YXRlbWVudCBzeW50YXgKKyAqICAgICAgICBvIEFkZGVkIHN1cHBvcnQgZm9yIHN0YXRpYyBpbXBvcnQgc3ludGF4CisgKiAgICAgICAgbyBBZGRlZCBzdXBwb3J0IGZvciBlbnVtIHR5cGVzCisgKiAgICAgICAgbyBUZXN0ZWQgYWdhaW5zdCBKREsgMS41IHNvdXJjZSBiYXNlIGFuZCBzb3VyY2UgYmFzZSBvZiBqZGlncmFwaCBwcm9qZWN0CisgKiAgICAgICAgbyBUaGFua3MgdG8gTWF0dCBRdWFpbCBmb3IgZG9pbmcgdGhlIGhhcmQgcGFydCBieSBkb2luZyBtb3N0IG9mIHRoZSBnZW5lcmljcyB3b3JrCisgKgorICogVmVyc2lvbiAxLjIyLjEgKEp1bHkgMjgsIDIwMDQpCisgKiAgICAgICAgQnVnL29taXNzaW9uIGZpeGVzIGZvciBKYXZhIDEuNSBsYW5ndWFnZSBzdXBwb3J0CisgKiAgICAgICAgbyBGaXhlZCB0cmVlIHN0cnVjdHVyZSBidWcgd2l0aCBjbGFzc09ySW50ZXJmYWNlIC0gdGhhbmtzIHRvIFBpZXRlciBWYW5nb3JwdG8gZm9yCisgKiAgICAgICAgICAgICAgc3BvdHRpbmcgdGhpcworICogICAgICAgIG8gRml4ZWQgYnVnIHdoZXJlIGluY29ycmVjdCBoYW5kbGluZyBvZiBTUiBhbmQgQlNSIHRva2VucyB3b3VsZCBjYXVzZSB0eXBlCisgKiAgICAgICAgICAgICAgcGFyYW1ldGVycyB0byBiZSByZWNvZ25pc2VkIGFzIHR5cGUgYXJndW1lbnRzLgorICogICAgICAgIG8gRW5hYmxlZCB0eXBlIHBhcmFtZXRlcnMgb24gY29uc3RydWN0b3JzLCBhbm5vdGF0aW9ucyBvbiBlbnVtIGNvbnN0YW50cworICogICAgICAgICAgICAgIGFuZCBwYWNrYWdlIGRlZmluaXRpb25zCisgKiAgICAgICAgbyBGaXhlZCBwcm9ibGVtcyB3aGVuIHBhcnNpbmcgaWYgKChjaGFyLmNsYXNzLmVxdWFscyhjKSkpIHt9IC0gc29sdXRpb24gYnkgTWF0dCBRdWFpbCBhdCBDZW5xdWEKKyAqCisgKiBWZXJzaW9uIDEuMjIuMiAoSnVseSAyOCwgMjAwNCkKKyAqICAgICAgICBTbGlnaHQgcmVmYWN0b3Jpbmcgb2YgSmF2YSAxLjUgbGFuZ3VhZ2Ugc3VwcG9ydAorICogICAgICAgIG8gUmVmYWN0b3JlZCBmb3IvImZvcmVhY2giIHByb2R1Y3Rpb25zIHNvIHRoYXQgb3JpZ2luYWwgbGl0ZXJhbCAiZm9yIiBsaXRlcmFsCisgKiAgICAgICAgICBpcyBzdGlsbCB1c2VkIGJ1dCB0aGUgZm9yIHN1Yi1jbGF1c2VzIHZhcnkgYnkgdG9rZW4gdHlwZQorICogICAgICAgIG8gRml4ZWQgYnVnIHdoZXJlIHR5cGUgcGFyYW1ldGVyIHdhcyBub3QgaW5jbHVkZWQgaW4gZ2VuZXJpYyBjb25zdHJ1Y3RvcidzIGJyYW5jaCBvZiBBU1QKKyAqCisgKiBWZXJzaW9uIDEuMjIuMyAoQXVndXN0IDI2LCAyMDA0KQorICogICAgICAgIEJ1ZyBmaXhlcyBhcyBpZGVudGlmaWVkIGJ5IE1pY2hhZWwgU3RhaGw7IGNsZWFuIHVwIG9mIHRhYnMvc3BhY2VzCisgKiAgICAgICAgYW5kIG90aGVyIHJlZmFjdG9yaW5ncworICogICAgICAgIG8gRml4ZWQgdHlwZVBhcmFtZXRlcnMgb21pc3Npb24gaW4gaWRlbnRQcmltYXJ5IGFuZCBuZXdTdGF0ZW1lbnQKKyAqICAgICAgICBvIFJlcGxhY2VkIEdUIHJlY29uY2lsbGlhdGlvbiBjb2RlIHdpdGggc2ltcGxlIHNlbWFudGljIHByZWRpY2F0ZQorICogICAgICAgIG8gQWRhcHRlZCBlbnVtL2Fzc2VydCBrZXl3b3JkIGNoZWNraW5nIHN1cHBvcnQgZnJvbSBNaWNoYWVsIFN0YWhsJ3MgamF2YTE1IGdyYW1tYXIKKyAqICAgICAgICBvIFJlZmFjdG9yZWQgdHlwZURlZmluaXRpb24gcHJvZHVjdGlvbiBhbmQgZmllbGQgcHJvZHVjdGlvbnMgdG8gcmVkdWNlIGR1cGxpY2F0aW9uCisgKgorICogVmVyc2lvbiAxLjIyLjQgKE9jdG9iZXIgMjEsIDIwMDQpCisgKiAgICBTbWFsbCBidXggZml4ZXMKKyAqICAgIG8gQWRkZWQgdHlwZUFyZ3VtZW50cyB0byBleHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbiwgZS5nLiBuZXcgPFN0cmluZz5NeVBhcmFtZXRlcmlzZWQoKQorICogICAgbyBBZGRlZCB0eXBlQXJndW1lbnRzIHRvIHBvc3RmaXhFeHByZXNzaW9uIHByb2R1Y3Rpb25zIGZvciBhbm9ueW1vdXMgaW5uZXIgY2xhc3Mgc3VwZXIKKyAqICAgICAgY29uc3RydWN0b3IgaW52b2NhdGlvbiwgZS5nLiBuZXcgT3V0ZXIoKS48U3RyaW5nPnN1cGVyKCkKKyAqICAgIG8gRml4ZWQgYnVnIGluIGFycmF5IGRlY2xhcmF0aW9ucyBpZGVudGlmaWVkIGJ5IEdlb2ZmIFJveQorICoKKyAqIFZlcnNpb24gMS4yMi40LmcuMQorICogICAgbyBJIGhhdmUgdGFrZW4gamF2YS5nIGZvciBKYXZhMS41IGZyb20gTWljaGFlbCBTdHVkbWFuICgxLjIyLjQpCisgKiAgICAgIGFuZCBoYXZlIGFwcGxpZWQgdGhlIGdyb292eS5kaWZmIGZyb20gamF2YS5nICgxLjIyKSBieSBKb2huIFJvc2UKKyAqICAgICAgYmFjayBvbnRvIHRoZSBuZXcgcm9vdCAoMS4yMi40KSAtIEplcmVteSBSYXluZXIgKEphbiAyMDA1KQorICogICAgbyBmb3IgYSBtYXAgb2YgdGhlIHRhc2sgc2VlLi4uIAorICogICAgICBodHRwOi8vZ3Jvb3Z5LmphdmFuaWN1cy5jb20vamF2YS1nLnBuZworICoKKyAqIFRoaXMgZ3JhbW1hciBpcyBpbiB0aGUgUFVCTElDIERPTUFJTgorICovCisKK2NsYXNzIEdyb292eVJlY29nbml6ZXIgZXh0ZW5kcyBQYXJzZXI7CitvcHRpb25zIHsKKyAgICBrID0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHdvIHRva2VuIGxvb2thaGVhZAorICAgIGV4cG9ydFZvY2FiPUdyb292eTsgICAgICAgICAgICAgICAvLyBDYWxsIGl0cyB2b2NhYnVsYXJ5ICJHcm9vdnkiCisgICAgY29kZUdlbk1ha2VTd2l0Y2hUaHJlc2hvbGQgPSAyOyAgIC8vIFNvbWUgb3B0aW1pemF0aW9ucworICAgIGNvZGVHZW5CaXRzZXRUZXN0VGhyZXNob2xkID0gMzsKKyAgICBkZWZhdWx0RXJyb3JIYW5kbGVyID0gZmFsc2U7ICAgICAgLy8gRG9uJ3QgZ2VuZXJhdGUgcGFyc2VyIGVycm9yIGhhbmRsZXJzCisgICAgYnVpbGRBU1QgPSB0cnVlOworLy8gIEFTVExhYmVsVHlwZSA9ICJHcm9vdnlBU1QiOworfQorCit0b2tlbnMgeworICAgIEJMT0NLOyBNT0RJRklFUlM7IE9CSkJMT0NLOyBTTElTVDsgTUVUSE9EX0RFRjsgVkFSSUFCTEVfREVGOworICAgIElOU1RBTkNFX0lOSVQ7IFNUQVRJQ19JTklUOyBUWVBFOyBDTEFTU19ERUY7IElOVEVSRkFDRV9ERUY7CisgICAgUEFDS0FHRV9ERUY7IEFSUkFZX0RFQ0xBUkFUT1I7IEVYVEVORFNfQ0xBVVNFOyBJTVBMRU1FTlRTX0NMQVVTRTsKKyAgICBQQVJBTUVURVJTOyBQQVJBTUVURVJfREVGOyBMQUJFTEVEX1NUQVQ7IFRZUEVDQVNUOyBJTkRFWF9PUDsKKyAgICBQT1NUX0lOQzsgUE9TVF9ERUM7IE1FVEhPRF9DQUxMOyBFWFBSOworICAgIElNUE9SVDsgVU5BUllfTUlOVVM7IFVOQVJZX1BMVVM7IENBU0VfR1JPVVA7IEVMSVNUOyBGT1JfSU5JVDsgRk9SX0NPTkRJVElPTjsKKyAgICBGT1JfSVRFUkFUT1I7IEVNUFRZX1NUQVQ7IEZJTkFMPSJmaW5hbCI7IEFCU1RSQUNUPSJhYnN0cmFjdCI7CisgICAgVU5VU0VEX0dPVE89ImdvdG8iOyBVTlVTRURfQ09OU1Q9ImNvbnN0IjsgVU5VU0VEX0RPPSJkbyI7CisgICAgU1RSSUNURlA9InN0cmljdGZwIjsgU1VQRVJfQ1RPUl9DQUxMOyBDVE9SX0NBTEw7IENUT1JfSURFTlQ7IFZBUklBQkxFX1BBUkFNRVRFUl9ERUY7CisgICAgU1RSSU5HX0NPTlNUUlVDVE9SOyBTVFJJTkdfQ1RPUl9NSURETEU7CisgICAgQ0xPU0FCTEVfQkxPQ0s7IElNUExJQ0lUX1BBUkFNRVRFUlM7CisgICAgU0VMRUNUX1NMT1Q7IERZTkFNSUNfTUVNQkVSOworICAgIExBQkVMRURfQVJHOyBTUFJFQURfQVJHOyBTUFJFQURfTUFQX0FSRzsgLy9kZXByZWNhdGVkIC0gU0NPUEVfRVNDQVBFOworICAgIExJU1RfQ09OU1RSVUNUT1I7IE1BUF9DT05TVFJVQ1RPUjsKKyAgICBGT1JfSU5fSVRFUkFCTEU7CisgICAgU1RBVElDX0lNUE9SVDsgRU5VTV9ERUY7IEVOVU1fQ09OU1RBTlRfREVGOyBGT1JfRUFDSF9DTEFVU0U7IEFOTk9UQVRJT05fREVGOyBBTk5PVEFUSU9OUzsKKyAgICBBTk5PVEFUSU9OOyBBTk5PVEFUSU9OX01FTUJFUl9WQUxVRV9QQUlSOyBBTk5PVEFUSU9OX0ZJRUxEX0RFRjsgQU5OT1RBVElPTl9BUlJBWV9JTklUOworICAgIFRZUEVfQVJHVU1FTlRTOyBUWVBFX0FSR1VNRU5UOyBUWVBFX1BBUkFNRVRFUlM7IFRZUEVfUEFSQU1FVEVSOyBXSUxEQ0FSRF9UWVBFOworICAgIFRZUEVfVVBQRVJfQk9VTkRTOyBUWVBFX0xPV0VSX0JPVU5EUzsgQ0xPU1VSRV9MSVNUOworfQorCit7CisgICAgICAgIC8qKiBUaGlzIGZhY3RvcnkgaXMgdGhlIGNvcnJlY3Qgd2F5IHRvIHdpcmUgdG9nZXRoZXIgYSBHcm9vdnkgcGFyc2VyIGFuZCBsZXhlci4gKi8KKyAgICBwdWJsaWMgc3RhdGljIEdyb292eVJlY29nbml6ZXIgbWFrZShHcm9vdnlMZXhlciBsZXhlcikgeworICAgICAgICBHcm9vdnlSZWNvZ25pemVyIHBhcnNlciA9IG5ldyBHcm9vdnlSZWNvZ25pemVyKGxleGVyLnBsdW1iKCkpOworICAgICAgICAvLyBUT0RPOiBzZXQgdXAgYSBjb21tb24gZXJyb3ItaGFuZGxpbmcgY29udHJvbCBibG9jaywgdG8gYXZvaWQgZXhjZXNzaXZlIHRhbmdsZSBiZXR3ZWVuIHRoZXNlIGd1eXMKKyAgICAgICAgcGFyc2VyLmxleGVyID0gbGV4ZXI7CisgICAgICAgIGxleGVyLnBhcnNlciA9IHBhcnNlcjsKKyAgICAgICAgcGFyc2VyLmdldEFTVEZhY3RvcnkoKS5zZXRBU1ROb2RlQ2xhc3MoR3Jvb3Z5U291cmNlQVNULmNsYXNzKTsKKyAgICAgICAgcGFyc2VyLndhcm5pbmdMaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICByZXR1cm4gcGFyc2VyOworICAgIH0KKyAgICAvLyBDcmVhdGUgYSBzY2FubmVyIHRoYXQgcmVhZHMgZnJvbSB0aGUgaW5wdXQgc3RyZWFtIHBhc3NlZCB0byB1cy4uLgorICAgIHB1YmxpYyBzdGF0aWMgR3Jvb3Z5UmVjb2duaXplciBtYWtlKElucHV0U3RyZWFtIGluKSB7IHJldHVybiBtYWtlKG5ldyBHcm9vdnlMZXhlcihpbikpOyB9CisgICAgcHVibGljIHN0YXRpYyBHcm9vdnlSZWNvZ25pemVyIG1ha2UoUmVhZGVyIGluKSB7IHJldHVybiBtYWtlKG5ldyBHcm9vdnlMZXhlcihpbikpOyB9CisgICAgcHVibGljIHN0YXRpYyBHcm9vdnlSZWNvZ25pemVyIG1ha2UoSW5wdXRCdWZmZXIgaW4pIHsgcmV0dXJuIG1ha2UobmV3IEdyb292eUxleGVyKGluKSk7IH0KKyAgICBwdWJsaWMgc3RhdGljIEdyb292eVJlY29nbml6ZXIgbWFrZShMZXhlclNoYXJlZElucHV0U3RhdGUgaW4pIHsgcmV0dXJuIG1ha2UobmV3IEdyb292eUxleGVyKGluKSk7IH0KKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBHcm9vdnlTb3VyY2VBU1QgZHVtbXlWYXJpYWJsZVRvZm9yY2VDbGFzc0xvYWRlclRvRmluZEFTVENsYXNzID0gbmV3IEdyb292eVNvdXJjZUFTVCgpOworCisgICAgTGlzdCB3YXJuaW5nTGlzdDsKKyAgICBwdWJsaWMgTGlzdCBnZXRXYXJuaW5nTGlzdCgpIHsgcmV0dXJuIHdhcm5pbmdMaXN0OyB9CisgICAgCisgICAgR3Jvb3Z5TGV4ZXIgbGV4ZXI7CisgICAgcHVibGljIEdyb292eUxleGVyIGdldExleGVyKCkgeyByZXR1cm4gbGV4ZXI7IH0KKyAgICBwdWJsaWMgdm9pZCBzZXRGaWxlbmFtZShTdHJpbmcgZikgeyBzdXBlci5zZXRGaWxlbmFtZShmKTsgbGV4ZXIuc2V0RmlsZW5hbWUoZik7IH0KKyAgICBwcml2YXRlIFNvdXJjZUJ1ZmZlciBzb3VyY2VCdWZmZXI7CisgICAgcHVibGljIHZvaWQgc2V0U291cmNlQnVmZmVyKFNvdXJjZUJ1ZmZlciBzb3VyY2VCdWZmZXIpIHsKKyAgICAgICAgdGhpcy5zb3VyY2VCdWZmZXIgPSBzb3VyY2VCdWZmZXI7CisgICAgfQorCisgICAgLyoqIENyZWF0ZSBhbiBBU1Qgbm9kZSB3aXRoIHRoZSB0b2tlbiB0eXBlIGFuZCB0ZXh0IHBhc3NlZCBpbiwgYnV0CisgICAgICogIHdpdGggdGhlIHNhbWUgYmFja2dyb3VuZCBpbmZvcm1hdGlvbiBhcyBhbm90aGVyIHN1cHBsaWVkIFRva2VuIChlLmcuIGxpbmUgbnVtYmVycykKKyAgICAgKiB0byBiZSB1c2VkIGluIHBsYWNlIG9mIGFudGxyIHRyZWUgY29uc3RydWN0aW9uIHN5bnRheCwKKyAgICAgKiBpLmUuICNbVE9LRU4sInRleHQiXSAgYmVjb21lcyAgY3JlYXRlKFRPS0VOLCJ0ZXh0Iixhbm90aGVyVG9rZW4pCisgICAgICoKKyAgICAgKiB0b2RvIC0gY2hhbmdlIGFudGxyLkFTVEZhY3RvcnkgdG8gZG8gdGhpcyBpbnN0ZWFkLi4uCisgICAgICovCisgICAgcHVibGljIEFTVCBjcmVhdGUoaW50IHR5cGUsIFN0cmluZyB0eHQsIFRva2VuIGZpcnN0LCBUb2tlbiBsYXN0KSB7CisgICAgICAgIEFTVCB0ID0gYXN0RmFjdG9yeS5jcmVhdGUodHlwZSx0eHQpOworICAgICAgICBpZiAoIHQgIT0gbnVsbCAmJiBmaXJzdCAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBmaXJzdCBjb3B5IGRldGFpbHMgZnJvbSBmaXJzdCB0b2tlbgorICAgICAgICAgICAgdC5pbml0aWFsaXplKGZpcnN0KTsKKyAgICAgICAgICAgIC8vIHRoZW4gZW5zdXJlIHRoYXQgdHlwZSBhbmQgdHh0IGFyZSBzcGVjaWZpYyB0byB0aGlzIG5ldyBub2RlCisgICAgICAgICAgICB0LmluaXRpYWxpemUodHlwZSx0eHQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCh0IGluc3RhbmNlb2YgR3Jvb3Z5U291cmNlQVNUKSAmJiBsYXN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIEdyb292eVNvdXJjZUFTVCBub2RlID0gKEdyb292eVNvdXJjZUFTVCl0OworICAgICAgICAgICAgbm9kZS5zZXRMYXN0KGxhc3QpOworICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGdvb2QgcG9pbnQgdG8gY2FsbCBub2RlLnNldFNuaXBwZXQoKSwKKyAgICAgICAgICAgIC8vIGJ1dCBpdCBidWxrcyB1cCB0aGUgQVNUIHRvbyBtdWNoIGZvciBwcm9kdWN0aW9uIGNvZGUuCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHQ7CisgICAgfQorCisKKyAgICAvLyBzdHVmZiB0byBhZGp1c3QgQU5UTFIncyB0cmFjaW5nIG1hY2hpbmVyeQorICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0cmFjaW5nID0gZmFsc2U7ICAvLyBvbmx5IGVmZmVjdGl2ZSBpZiBhbnRsci5Ub29sIGlzIHJ1biB3aXRoIC10cmFjZVBhcnNlcgorICAgIHB1YmxpYyB2b2lkIHRyYWNlSW4oU3RyaW5nIHJuYW1lKSB0aHJvd3MgVG9rZW5TdHJlYW1FeGNlcHRpb24geworICAgICAgICBpZiAoIUdyb292eVJlY29nbml6ZXIudHJhY2luZykgIHJldHVybjsKKyAgICAgICAgc3VwZXIudHJhY2VJbihybmFtZSk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRyYWNlT3V0KFN0cmluZyBybmFtZSkgdGhyb3dzIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFHcm9vdnlSZWNvZ25pemVyLnRyYWNpbmcpICByZXR1cm47CisgICAgICAgIGlmIChyZXR1cm5BU1QgIT0gbnVsbCkgIHJuYW1lICs9IHJldHVybkFTVC50b1N0cmluZ0xpc3QoKTsKKyAgICAgICAgc3VwZXIudHJhY2VPdXQocm5hbWUpOworICAgIH0KKyAgICAgICAgCisgICAgLy8gRXJyb3IgaGFuZGxpbmcuICBUaGlzIGlzIGEgZnVubmVsIHRocm91Z2ggd2hpY2ggcGFyc2VyIGVycm9ycyBnbywgd2hlbiB0aGUgcGFyc2VyIGNhbiBzdWdnZXN0IGEgc29sdXRpb24uCisgICAgcHVibGljIHZvaWQgcmVxdWlyZUZhaWxlZChTdHJpbmcgcHJvYmxlbSwgU3RyaW5nIHNvbHV0aW9uKSB0aHJvd3MgU2VtYW50aWNFeGNlcHRpb24geworICAgICAgICAvLyBUT0RPOiBOZWVkcyBtb3JlIHdvcmsuCisgICAgICAgIFRva2VuIGx0ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsgbHQgPSBMVCgxKTsgfQorICAgICAgICBjYXRjaCAoVG9rZW5TdHJlYW1FeGNlcHRpb24gZWUpIHsgfQorICAgICAgICBpZiAobHQgPT0gbnVsbCkgIGx0ID0gVG9rZW4uYmFkVG9rZW47CisgICAgICAgIHRocm93IG5ldyBTZW1hbnRpY0V4Y2VwdGlvbihwcm9ibGVtICsgIjtcbiAgIHNvbHV0aW9uOiAiICsgc29sdXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGaWxlbmFtZSgpLCBsdC5nZXRMaW5lKCksIGx0LmdldENvbHVtbigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRXYXJuaW5nKFN0cmluZyB3YXJuaW5nLCBTdHJpbmcgc29sdXRpb24pIHsKKyAgICAgICAgVG9rZW4gbHQgPSBudWxsOworICAgICAgICB0cnkgeyBsdCA9IExUKDEpOyB9CisgICAgICAgIGNhdGNoIChUb2tlblN0cmVhbUV4Y2VwdGlvbiBlZSkgeyB9CisgICAgICAgIGlmIChsdCA9PSBudWxsKSAgbHQgPSBUb2tlbi5iYWRUb2tlbjsKKworICAgICAgICBNYXAgcm93ID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgcm93LnB1dCgid2FybmluZyIgLHdhcm5pbmcpOworICAgICAgICByb3cucHV0KCJzb2x1dGlvbiIsc29sdXRpb24pOworICAgICAgICByb3cucHV0KCJmaWxlbmFtZSIsZ2V0RmlsZW5hbWUoKSk7CisgICAgICAgIHJvdy5wdXQoImxpbmUiICAgICxuZXcgSW50ZWdlcihsdC5nZXRMaW5lKCkpKTsKKyAgICAgICAgcm93LnB1dCgiY29sdW1uIiAgLG5ldyBJbnRlZ2VyKGx0LmdldENvbHVtbigpKSk7CisgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbihyb3cpOworICAgICAgICB3YXJuaW5nTGlzdC5hZGQocm93KTsKKyAgICB9CisKKyAgICAvLyBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGNoZWNraW5nIG9mIGV4cGVjdGVkIGVycm9yIHN5bmRyb21lcy4KKyAgICBwcml2YXRlIHZvaWQgcmVxdWlyZShib29sZWFuIHosIFN0cmluZyBwcm9ibGVtLCBTdHJpbmcgc29sdXRpb24pIHRocm93cyBTZW1hbnRpY0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICgheikgIHJlcXVpcmVGYWlsZWQocHJvYmxlbSwgc29sdXRpb24pOworICAgIH0KKworCisgICAgLy8gUXVlcnkgYSBuYW1lIHRva2VuIHRvIHNlZSBpZiBpdCBiZWdpbnMgd2l0aCBhIGNhcGl0YWwgbGV0dGVyLgorICAgIC8vIFRoaXMgaXMgdXNlZCB0byB0ZWxsIHRoZSBkaWZmZXJlbmNlICh3L28gc3ltYm9sIHRhYmxlIGFjY2VzcykgYmV0d2VlbiB7U3RyaW5nIHh9IGFuZCB7cHJpbnRsbiB4fS4KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNVcHBlckNhc2UoVG9rZW4geCkgeworICAgICAgICBpZiAoeCA9PSBudWxsIHx8IHguZ2V0VHlwZSgpICE9IElERU5UKSAgcmV0dXJuIGZhbHNlOyAgLy8gY2Fubm90IGhhcHBlbj8KKyAgICAgICAgU3RyaW5nIHh0ZXh0ID0geC5nZXRUZXh0KCk7CisgICAgICAgIHJldHVybiAoeHRleHQubGVuZ3RoKCkgPiAwICYmIENoYXJhY3Rlci5pc1VwcGVyQ2FzZSh4dGV4dC5jaGFyQXQoMCkpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEFTVCBjdXJyZW50Q2xhc3MgPSBudWxsOyAgLy8gY3VycmVudCBlbmNsb3NpbmcgY2xhc3MgKGZvciBjb25zdHJ1Y3RvciByZWNvZ25pdGlvbikKKyAgICAvLyBRdWVyeSBhIG5hbWUgdG9rZW4gdG8gc2VlIGlmIGl0IGlzIGlkZW50aWNhbCB3aXRoIHRoZSBjdXJyZW50IGNsYXNzIG5hbWUuCisgICAgLy8gVGhpcyBpcyB1c2VkIHRvIGRpc3Rpbmd1aXNoIGNvbnN0cnVjdG9ycyBmcm9tIG90aGVyIG1ldGhvZHMuCisgICAgcHJpdmF0ZSBib29sZWFuIGlzQ29uc3RydWN0b3JJZGVudChUb2tlbiB4KSB7CisgICAgICAgIGlmIChjdXJyZW50Q2xhc3MgPT0gbnVsbCkgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKGN1cnJlbnRDbGFzcy5nZXRUeXBlKCkgIT0gSURFTlQpICByZXR1cm4gZmFsc2U7ICAvLyBjYW5ub3QgaGFwcGVuPworICAgICAgICBTdHJpbmcgY25hbWUgPSBjdXJyZW50Q2xhc3MuZ2V0VGV4dCgpOworCisgICAgICAgIGlmICh4ID09IG51bGwgfHwgeC5nZXRUeXBlKCkgIT0gSURFTlQpICByZXR1cm4gZmFsc2U7ICAvLyBjYW5ub3QgaGFwcGVuPworICAgICAgICByZXR1cm4gY25hbWUuZXF1YWxzKHguZ2V0VGV4dCgpKTsKKyAgICB9CisKKyAgICAvLyBTY3JhdGNoIHZhcmlhYmxlIGZvciBsYXN0ICdzZXAnIHRva2VuLgorICAgIC8vIFdyaXR0ZW4gYnkgdGhlICdzZXAnIHJ1bGUsIHJlYWQgb25seSBieSBpbW1lZGlhdGUgY2FsbGVycyBvZiAnc2VwJy4KKyAgICAvLyAoTm90IGVudGlyZWx5IGNsZWFuLCBidXQgYmV0dGVyIHRoYW4gYSBtaWxsaW9uIHh4PXNlcCBvY2N1cnJlbmNlcy4pCisgICAgcHJpdmF0ZSBpbnQgc2VwVG9rZW4gPSBFT0Y7CisKKyAgICAvLyBTY3JhdGNoIHZhcmlhYmxlIGZvciBsYXN0IGFyZ3VtZW50IGxpc3Q7IHRlbGxzIHdoZXRoZXIgdGhlcmUgd2FzIGEgbGFiZWwuCisgICAgLy8gV3JpdHRlbiBieSAnYXJnTGlzdCcgcnVsZSwgcmVhZCBvbmx5IGJ5IGltbWVkaWF0ZSBjYWxsZXJzIG9mICdhcmdMaXN0Jy4KKyAgICBwcml2YXRlIGJvb2xlYW4gYXJnTGlzdEhhc0xhYmVscyA9IGZhbHNlOworCisgICAgLy8gU2NyYXRjaCB2YXJpYWJsZSwgaG9sZHMgbW9zdCByZWNlbnRseSBjb21wbGV0ZWQgcGF0aEV4cHJlc3Npb24uCisgICAgLy8gUmVhZCBvbmx5IGJ5IGltbWVkaWF0ZSBjYWxsZXJzIG9mICdwYXRoRXhwcmVzc2lvbicgYW5kICdleHByZXNzaW9uJy4KKyAgICBwcml2YXRlIEFTVCBsYXN0UGF0aEV4cHJlc3Npb24gPSBudWxsOworCisgICAgLy8gSW5oZXJpdGVkIGF0dHJpYnV0ZSBwdXNoZWQgaW50byBtb3N0IGV4cHJlc3Npb24gcnVsZXMuCisgICAgLy8gSWYgbm90IHplcm8sIGl0IG1lYW5zIHRoYXQgdGhlIGxlZnQgY29udGV4dCBvZiB0aGUgZXhwcmVzc2lvbgorICAgIC8vIGJlaW5nIHBhcnNlZCBpcyBhIHN0YXRlbWVudCBib3VuZGFyeSBvciBhbiBpbml0aWFsaXplciBzaWduICc9Jy4KKyAgICAvLyBPbmx5IHN1Y2ggZXhwcmVzc2lvbnMgYXJlIGFsbG93ZWQgdG8gcmVhY2ggYWNyb3NzIG5ld2xpbmVzCisgICAgLy8gdG8gcHVsbCBpbiBhbiBMQ1VSTFkgYW5kIGFwcGVuZGVkIGJsb2NrLgorICAgIHByaXZhdGUgZmluYWwgaW50IExDX1NUTVQgPSAxLCBMQ19JTklUID0gMjsKKworICAgIC8qKgorICAgICAqIENvdW50cyB0aGUgbnVtYmVyIG9mIExUIHNlZW4gaW4gdGhlIHR5cGVBcmd1bWVudHMgcHJvZHVjdGlvbi4KKyAgICAgKiBJdCBpcyB1c2VkIGluIHNlbWFudGljIHByZWRpY2F0ZXMgdG8gZW5zdXJlIHdlIGhhdmUgc2VlbgorICAgICAqIGVub3VnaCBjbG9zaW5nICc+JyBjaGFyYWN0ZXJzOyB3aGljaCBhY3R1YWxseSBtYXkgaGF2ZSBiZWVuCisgICAgICogZWl0aGVyIEdULCBTUiBvciBCU1IgdG9rZW5zLgorICAgICAqLworICAgIHByaXZhdGUgaW50IGx0Q291bnRlciA9IDA7CisgICAgCisgICAgLyogVGhpcyBzeW1ib2wgaXMgdXNlZCB0byB3b3JrIGFyb3VuZCBhIGtub3duIEFOVExSIGxpbWl0YXRpb24uCisgICAgICogSW4gYSBsb29wIHdpdGggc3ludGFjdGljIHByZWRpY2F0ZSwgQU5UTFIgbmVlZHMgaGVscCBrbm93aW5nCisgICAgICogdGhhdCB0aGUgbG9vcCBleGl0IGlzIGEgc2Vjb25kIGFsdGVybmF0aXZlLgorICAgICAqIEV4YW1wbGUgdXNhZ2U6ICAoIChMQ1VSTFkpPT4gYmxvY2sgfCB7QU5UTFJfTE9PUF9FWElUfT8gKSoKKyAgICAgKiBQcm9iYWJseSBzaG91bGQgYmUgYW4gQU5UTFIgUkZFLgorICAgICAqLworICAgIC8vLy8vLyBPcmlnaW5hbCBjb21tZW50IGluIEphdmEgZ3JhbW1hcjoKKyAgICAvLyBVbmZvcnR1bmF0ZWx5IGEgc3ludGFjdGljIHByZWRpY2F0ZSBjYW4gb25seSBzZWxlY3Qgb25lIG9mCisgICAgLy8gbXVsdGlwbGUgYWx0ZXJuYXRpdmVzIG9uIHRoZSBzYW1lIGxldmVsLCBub3QgYnJlYWsgb3V0IG9mCisgICAgLy8gYW4gZW5jbG9zaW5nIGxvb3AsIHdoaWNoIGlzIHdoeSB0aGlzIHVnbHkgaGFjayAoYSBmYWtlCisgICAgLy8gZW1wdHkgYWx0ZXJuYXRpdmUgd2l0aCBhbHdheXMtZmFsc2Ugc2VtYW50aWMgcHJlZGljYXRlKQorICAgIC8vIGlzIG5lY2Vzc2FyeS4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIEFOVExSX0xPT1BfRVhJVCA9IGZhbHNlOworfQorCisvLyBDb21waWxhdGlvbiBVbml0OiBJbiBHcm9vdnksIHRoaXMgaXMgYSBzaW5nbGUgZmlsZSBvciBzY3JpcHQuIFRoaXMgaXMgdGhlIHN0YXJ0CisvLyBydWxlIGZvciB0aGlzIHBhcnNlcgorY29tcGlsYXRpb25Vbml0CisgICAgOgorICAgICAgICAvLyBUaGUgdmVyeSBmaXJzdCBjaGFyYWN0ZXJzIG9mIHRoZSBmaWxlIG1heSBiZSAiIyEiLiAgSWYgc28sIGlnbm9yZSB0aGUgZmlyc3QgbGluZS4KKyAgICAgICAgKFNIX0NPTU1FTlQhKT8KKworICAgICAgICAvLyB3ZSBjYW4gaGF2ZSBjb21tZW50cyBhdCB0aGUgdG9wIG9mIGEgZmlsZQorICAgICAgICBubHMhCisKKyAgICAgICAgLy8gQSBjb21waWxhdGlvbiB1bml0IHN0YXJ0cyB3aXRoIGFuIG9wdGlvbmFsIHBhY2thZ2UgZGVmaW5pdGlvbgorICAgICAgICAoICAgKGFubm90YXRpb25zT3B0ICJwYWNrYWdlIik9PiBwYWNrYWdlRGVmaW5pdGlvbgorICAgICAgICB8ICAgKHN0YXRlbWVudFtFT0ZdKT8KKyAgICAgICAgKQorCisgICAgICAgIC8vIFRoZSBtYWluIHBhcnQgb2YgdGhlIHNjcmlwdCBpcyBhIHNlcXVlbmNlIG9mIGFueSBudW1iZXIgb2Ygc3RhdGVtZW50cy4KKyAgICAgICAgLy8gU2VtaWNvbG9ucyBhbmQvb3Igc2lnbmlmaWNhbnQgbmV3bGluZXMgc2VydmUgYXMgc2VwYXJhdG9ycy4KKyAgICAgICAgKCBzZXAhIChzdGF0ZW1lbnRbc2VwVG9rZW5dKT8gKSoKKyAgICAgICAgRU9GIQorICAgIDsKKworLyoqIEEgR3Jvb3Z5IHNjcmlwdCBvciBzaW1wbGUgZXhwcmVzc2lvbi4gIENhbiBiZSBhbnl0aGluZyBsZWdhbCBpbnNpZGUgey4uLn0uICovCitzbmlwcGV0VW5pdAorICAgIDogICBubHMhIGJsb2NrQm9keVtFT0ZdCisgICAgOworCisKKy8vIFBhY2thZ2Ugc3RhdGVtZW50OiBvcHRpb25hbCBhbm5vdGF0aW9ucyBmb2xsb3dlZCBieSAicGFja2FnZSIgdGhlbiB0aGUgcGFja2FnZSBpZGVudGlmaWVyLgorcGFja2FnZURlZmluaXRpb24KKyAgICAgICAgLy9UT0RPPyBvcHRpb25zIHtkZWZhdWx0RXJyb3JIYW5kbGVyID0gdHJ1ZTt9IC8vIGxldCBBTlRMUiBoYW5kbGUgZXJyb3JzCisgICAgOiAgIGFubm90YXRpb25zT3B0IHA6InBhY2thZ2UiXiB7I3Auc2V0VHlwZShQQUNLQUdFX0RFRik7fSBpZGVudGlmaWVyCisgICAgOworCisKKy8vIEltcG9ydCBzdGF0ZW1lbnQ6IGltcG9ydCBmb2xsb3dlZCBieSBhIHBhY2thZ2Ugb3IgY2xhc3MgbmFtZQoraW1wb3J0U3RhdGVtZW50CisgICAgICAgIC8vVE9ETz8gb3B0aW9ucyB7ZGVmYXVsdEVycm9ySGFuZGxlciA9IHRydWU7fQorICAgICAgICB7IGJvb2xlYW4gaXNTdGF0aWMgPSBmYWxzZTsgfQorICAgIDogICBpOiJpbXBvcnQiXiB7I2kuc2V0VHlwZShJTVBPUlQpO30gKCAic3RhdGljIiEgeyNpLnNldFR5cGUoU1RBVElDX0lNUE9SVCk7fSApPyBpZGVudGlmaWVyU3RhcgorICAgIDsKKworLy8gVE9ETyBSRU1PVkUKKy8vIEEgdHlwZSBkZWZpbml0aW9uIGlzIGVpdGhlciBhIGNsYXNzLCBpbnRlcmZhY2UsIGVudW0gb3IgYW5ub3RhdGlvbiB3aXRoIHBvc3NpYmxlIGFkZGl0aW9uYWwgc2VtaXMuCisvL3R5cGVEZWZpbml0aW9uCisvLyAgICAgIG9wdGlvbnMge2RlZmF1bHRFcnJvckhhbmRsZXIgPSB0cnVlO30KKy8vICAgICAgOiAgICAgICBtOm1vZGlmaWVycyEKKy8vICAgICAgICAgICAgICB0eXBlRGVmaW5pdGlvbkludGVybmFsWyNtXQorLy8gICAgICB8ICAgICAgIFNFTUkhCisvLyAgICAgIDsKKworLy8gQWRkZWQgdGhpcyBwcm9kdWN0aW9uLCBldmVuIHRob3VnaCAndHlwZURlZmluaXRpb24nIHNlZW1zIHRvIGJlIG9ic29sZXRlLAorLy8gYXMgdGhpcyBpcyByZWZlcmVuY2VkIGJ5IG1hbnkgb3RoZXIgcGFydHMgb2YgdGhlIGdyYW1tYXIuCisvLyBQcm90ZWN0ZWQgdHlwZSBkZWZpbml0aW9ucyBwcm9kdWN0aW9uIGZvciByZXVzZSBpbiBvdGhlciBwcm9kdWN0aW9ucworcHJvdGVjdGVkIHR5cGVEZWZpbml0aW9uSW50ZXJuYWxbQVNUIG1vZHNdCisgICAgOiAgIGNkOmNsYXNzRGVmaW5pdGlvblsjbW9kc10gICAgICAgLy8gaW5uZXIgY2xhc3MKKyAgICAgICAgeyN0eXBlRGVmaW5pdGlvbkludGVybmFsID0gI2NkO30KKyAgICB8ICAgaWQ6aW50ZXJmYWNlRGVmaW5pdGlvblsjbW9kc10gICAvLyBpbm5lciBpbnRlcmZhY2UKKyAgICAgICAgeyN0eXBlRGVmaW5pdGlvbkludGVybmFsID0gI2lkO30KKyAgICB8ICAgZWQ6ZW51bURlZmluaXRpb25bI21vZHNdICAgICAgICAvLyBpbm5lciBlbnVtCisgICAgICAgIHsjdHlwZURlZmluaXRpb25JbnRlcm5hbCA9ICNlZDt9CisgICAgfCAgIGFkOmFubm90YXRpb25EZWZpbml0aW9uWyNtb2RzXSAgLy8gaW5uZXIgYW5ub3RhdGlvbgorICAgICAgICB7I3R5cGVEZWZpbml0aW9uSW50ZXJuYWwgPSAjYWQ7fQorICAgIDsKKworLyoqIEEgZGVjbGFyYXRpb24gaXMgdGhlIGNyZWF0aW9uIG9mIGEgcmVmZXJlbmNlIG9yIHByaW1pdGl2ZS10eXBlIHZhcmlhYmxlLAorICogIG9yIChpZiBhcmd1bWVudHMgYXJlIHByZXNlbnQpIG9mIGEgbWV0aG9kLgorICogIEdlbmVyaWNhbGx5LCB0aGlzIGlzIGNhbGxlZCBhICd2YXJpYWJsZScgZGVmaW5pdGlvbiwgZXZlbiBpbiB0aGUgY2FzZSBvZiBhIGNsYXNzIGZpZWxkIG9yIG1ldGhvZC4KKyAqICBJdCBtYXkgc3RhcnQgd2l0aCB0aGUgbW9kaWZpZXJzIGFuZC9vciBhIGRlY2xhcmF0aW9uIGtleXdvcmQgImRlZiIuCisgKiAgSXQgbWF5IGFsc28gc3RhcnQgd2l0aCB0aGUgbW9kaWZpZXJzIGFuZCBhIGNhcGl0YWxpemVkIHR5cGUgbmFtZS4KKyAqICA8cD4KKyAqICBBU1QgZWZmZWN0OiBDcmVhdGUgYSBzZXBhcmF0ZSBUeXBlL1ZhciB0cmVlIGZvciBlYWNoIHZhciBpbiB0aGUgdmFyIGxpc3QuCisgKiAgTXVzdCBiZSBndWFyZGVkLCBhcyBpbiAoZGVjbGFyYXRpb25TdGFydCkgPT4gZGVjbGFyYXRpb24uCisgKi8KK2RlY2xhcmF0aW9uIQorICAgIDoKKyAgICAgICAgLy8gbWV0aG9kL3ZhcmlhYmxlIHVzaW5nIGEgJ2RlZicgb3IgYSBtb2RpZmllcjsgdHlwZSBpcyBvcHRpb25hbAorICAgICAgICBtOm1vZGlmaWVycworICAgICAgICAodDp0eXBlU3BlY1tmYWxzZV0pPworICAgICAgICB2OnZhcmlhYmxlRGVmaW5pdGlvbnNbI20sICN0XQorICAgICAgICB7I2RlY2xhcmF0aW9uID0gI3Y7fQorICAgIHwKKyAgICAgICAgLy8gbWV0aG9kL3ZhcmlhYmxlIHVzaW5nIGEgdHlwZSBvbmx5CisgICAgICAgIHQyOnR5cGVTcGVjW2ZhbHNlXQorICAgICAgICB2Mjp2YXJpYWJsZURlZmluaXRpb25zW251bGwsI3QyXQorICAgICAgICB7I2RlY2xhcmF0aW9uID0gI3YyO30KKyAgICA7CisKK2dlbmVyaWNNZXRob2QhIAorCToKKyAgICAgICAgLy8gbWV0aG9kIHVzaW5nIGEgJ2RlZicgb3IgYSBtb2RpZmllcjsgdHlwZSBpcyBvcHRpb25hbAorICAgICAgICBtOm1vZGlmaWVycworICAgICAgICBwOnR5cGVQYXJhbWV0ZXJzCisgICAgICAgIHQ6dHlwZVNwZWNbZmFsc2VdCisgICAgICAgIHY6dmFyaWFibGVEZWZpbml0aW9uc1sjbSwgI3RdCisgICAgICAgIHsKKyAgICAgICAgCSNnZW5lcmljTWV0aG9kID0gI3Y7CisJCQlBU1Qgb2xkID0gI3YuZ2V0Rmlyc3RDaGlsZCgpOworICAgICAgICAJI2dlbmVyaWNNZXRob2Quc2V0Rmlyc3RDaGlsZCgjcCk7CisgICAgICAgIAkjcC5zZXROZXh0U2libGluZyhvbGQpOworICAgICAgICB9CisJOworCisKKy8vICpUT0RPKiBXZSBtdXN0IGFsc28gYXVkaXQgdGhlIHZhcmlvdXMgb2NjdXJyZW5jZXMgb2Ygd2FybmluZworLy8gc3VwcHJlc3Npb25zIGxpa2UgIm9wdGlvbnMgeyBncmVlZHkgPSB0cnVlOyB9Ii4KKworLyoqIEEgZGVjbGFyYXRpb24gd2l0aCBvbmUgZGVjbGFyYXRvciBhbmQgbm8gaW5pdGlhbGl6YXRpb24sIGxpa2UgYSBwYXJhbWV0ZXJEZWNsYXJhdGlvbi4KKyAqICBVc2VkIHRvIHBhcnNlIGxvb3BzIGxpa2UgPGNvZGU+Zm9yIChpbnQgeCBpbiB5KTwvY29kZT4gKHVwIHRvIHRoZSA8Y29kZT5pbjwvY29kZT4ga2V5d29yZCkuCisgKi8KK3NpbmdsZURlY2xhcmF0aW9uTm9Jbml0IQorICAgIDoKKyAgICAgICAgLy8gbWV0aG9kL3ZhcmlhYmxlIHVzaW5nIGEgJ2RlZicgb3IgYSBtb2RpZmllcjsgdHlwZSBpcyBvcHRpb25hbAorICAgICAgICBtOm1vZGlmaWVycworICAgICAgICAodDp0eXBlU3BlY1tmYWxzZV0pPworICAgICAgICB2OnNpbmdsZVZhcmlhYmxlWyNtLCAjdF0KKyAgICAgICAgeyNzaW5nbGVEZWNsYXJhdGlvbk5vSW5pdCA9ICN2O30KKyAgICB8CisgICAgICAgIC8vIG1ldGhvZC92YXJpYWJsZSB1c2luZyBhIHR5cGUgb25seQorICAgICAgICB0Mjp0eXBlU3BlY1tmYWxzZV0KKyAgICAgICAgdjI6c2luZ2xlVmFyaWFibGVbbnVsbCwjdDJdCisgICAgICAgIHsjc2luZ2xlRGVjbGFyYXRpb25Ob0luaXQgPSAjdjI7fQorICAgIDsKKworLyoqIEEgZGVjbGFyYXRpb24gd2l0aCBvbmUgZGVjbGFyYXRvciBhbmQgb3B0aW9uYWwgaW5pdGlhbGl6YXRpb24sIGxpa2UgYSBwYXJhbWV0ZXJEZWNsYXJhdGlvbi4KKyAqICBVc2VkIHRvIHBhcnNlIGRlY2xhcmF0aW9ucyB1c2VkIGZvciBib3RoIGJpbmRpbmcgYW5kIGVmZmVjdCwgaW4gcGxhY2VzIGxpa2UgYXJndW1lbnQKKyAqICBsaXN0cyBhbmQgPGNvZGU+d2hpbGU8L2NvZGU+IHN0YXRlbWVudHMuCisgKi8KK3NpbmdsZURlY2xhcmF0aW9uCisgICAgOiAgIHNkOnNpbmdsZURlY2xhcmF0aW9uTm9Jbml0IQorICAgICAgICB7ICNzaW5nbGVEZWNsYXJhdGlvbiA9ICNzZDsgfQorICAgICAgICAodmFySW5pdGlhbGl6ZXIpPworICAgIDsKKworLyoqIFVzZWQgb25seSBhcyBhIGxvb2thaGVhZCBwcmVkaWNhdGUsIGJlZm9yZSBkaXZpbmcgaW4gYW5kIHBhcnNpbmcgYSBkZWNsYXJhdGlvbi4KKyAqICBBIGRlY2xhcmF0aW9uIGNhbiBiZSB1bmFtYmlndW91c2x5IGludHJvZHVjZWQgd2l0aCAiZGVmIiwgYW4gYW5ub3RhdGlvbiBvciBhIG1vZGlmaWVyIHRva2VuIGxpa2UgImZpbmFsIi4KKyAqICBJdCBtYXkgYWxzbyBiZSBpbnRyb2R1Y2VkIGJ5IGEgc2ltcGxlIGlkZW50aWZpZXIgd2hvc2UgZmlyc3QgY2hhcmFjdGVyIGlzIGFuIHVwcGVyY2FzZSBsZXR0ZXIsCisgKiAgYXMgaW4ge1N0cmluZyB4fS4gIEEgZGVjbGFyYXRpb24gY2FuIGFsc28gYmUgaW50cm9kdWNlZCB3aXRoIGEgYnVpbHQgaW4gdHlwZSBsaWtlICdpbnQnIG9yICd2b2lkJy4KKyAqICBCcmFja2V0cyAoYXJyYXkgYW5kIGdlbmVyaWMpIGFyZSBhbGxvd2VkLCBhcyBpbiB7TGlzdFtdIHh9IG9yIHtpbnRbXVtdIHl9LgorICogIEFueXRoaW5nIGVsc2UgaXMgcGFyc2VkIGFzIGEgc3RhdGVtZW50IG9mIHNvbWUgc29ydCAoZXhwcmVzc2lvbiBvciBjb21tYW5kKS4KKyAqICA8cD4KKyAqICAoSW4gdGhlIGFic2VuY2Ugb2YgZXhwbGljaXQgbWV0aG9kLWNhbGwgcGFyZW5zLCB3ZSBhc3N1bWUgYSBjYXBpdGFsaXplZCBuYW1lIGlzIGEgdHlwZSBuYW1lLgorICogIFllcywgdGhpcyBpcyBhIGxpdHRsZSBoYWNreS4gIEFsdGVybmF0aXZlcyBhcmUgdG8gY29tcGxpY2F0ZSB0aGUgZGVjbGFyYXRpb24gb3IgY29tbWFuZAorICogIHN5bnRheGVzLCBvciB0byBoYXZlIHRoZSBwYXJzZXIgcXVlcnkgdGhlIHN5bWJvbCB0YWJsZS4gIFBhcnNlLXRpbWUgcXVlcmllcyBhcmUgZXZpbC4KKyAqICBBbmQgd2Ugd2FudCBib3RoIHtTdHJpbmcgeH0gYW5kIHtwcmludGxuIHh9LiAgU28gd2UgbmVlZCBhIHN5bnRhY3RpYyByYXpvci1lZGdlIHRvIHNsaXAKKyAqICBiZXR3ZWVuICdwcmludGxuJyBhbmQgJ1N0cmluZycuKQorICogIAorICogICAqVE9ETyogVGhlIGRlY2xhcmF0aW9uU3RhcnQgcHJvZHVjdGlvbiBuZWVkcyB0byBiZSBzdHJlbmd0aGVuZWQgdG8gcmVjb2duaXplCisgKiAgdGhpbmdzIGxpa2Uge0xpc3Q8U3RyaW5nPiBmb299LgorICogIFJpZ2h0IG5vdyBpdCBvbmx5IGtub3dzIGhvdyB0byBza2lwIHNxdWFyZSBicmFja2V0cyBhZnRlciB0aGUgdHlwZSwgbm90CisgKiAgYW5nbGUgYnJhY2tldHMuCisgKiAgVGhpcyBwcm9iYWJseSB0dXJucyBvdXQgdG8gYmUgdHJpY2t5IGJlY2F1c2Ugb2YgPj4gdnMuID4gPi4gSWYgc28sCisgKiAganVzdCBwdXQgYSBUT0RPIGNvbW1lbnQgaW4uCisgKi8KK2RlY2xhcmF0aW9uU3RhcnQhCisgICAgOiAgICgJICAiZGVmIiBubHMKKyAgICAJCXwgbW9kaWZpZXIgbmxzIAorICAgIAkJfCBhbm5vdGF0aW9uIG5scworICAgICAgICAgCXwgKCAgIHVwcGVyQ2FzZUlkZW50CisgICAgICAgICAgIAkJfCAgIGJ1aWx0SW5UeXBlCisgICAgICAgICAgIAkJfCAgIHF1YWxpZmllZFR5cGVOYW1lCisgICAgICAgICAgICAgICkgKHR5cGVBcmd1bWVudHMpPyAoTEJSQUNLIGJhbGFuY2VkVG9rZW5zIFJCUkFDSykqCisgICAgICAgICkrCisgICAgICAgIElERU5UIAorICAgIDsKKworLyoqCisgKiBsb29rYWhlYWQgcHJlZGljYXRlIGZvciB1c2FnZSBvZiBnZW5lcmljcyBpbiBtZXRob2RzCisgKiBhcyBwYXJhbWV0ZXIgZm9yIHRoZSBtZXRob2QuIEV4YW1wbGU6CisgKiBzdGF0aWMgPFQ+IFQgZm9vKCl7fQorICogPFQ+IG11c3QgYmUgZmlyc3QgYWZ0ZXIgdGhlIG1vZGlmaWVyLgorICogVGhpcyBydWxlIGFsbG93cyBtb3JlIGFuZCBkb2VzIG5vIGV4YWN0IG1hdGNoLCBidXQgaXQKKyAqIGlzIG9ubHkgYSBsb29rYWhlYWQsIG5vdCB0aGUgcmVhbCBydWxlLiAKKyAqLworZ2VuZXJpY01ldGhvZFN0YXJ0IQorICAgIDogICAoCSAgImRlZiIgbmxzCisgICAgCQl8IG1vZGlmaWVyIG5scyAKKyAgICAJCXwgYW5ub3RhdGlvbiBubHMKKyAgICAJKSsgTFQJCisgICAgOwkJCisKK3F1YWxpZmllZFR5cGVOYW1lIQorCToKKwkJSURFTlQgRE9UIChJREVOVCBET1QpKiB1cHBlckNhc2VJZGVudAorCTsKKwkKKy8qKiBVc2VkIHRvIGxvb2sgYWhlYWQgZm9yIGEgY29uc3RydWN0b3IgCisgKi8KK2NvbnN0cnVjdG9yU3RhcnQhCisgICAgOgorICAgICAgICBtb2RpZmllcnNPcHQhIGlkOklERU5UISB7aXNDb25zdHJ1Y3RvcklkZW50KGlkKX0/IG5scyEgTFBBUkVOISAvLy4uLgorICAgIDsKKworCisvKiogVXNlZCBvbmx5IGFzIGEgbG9va2FoZWFkIHByZWRpY2F0ZSBmb3IgbmVzdGVkIHR5cGUgZGVjbGFyYXRpb25zLiAqLworCisvKlRPRE8qIFRoZSBsb29rYWhlYWQgaW4gdHlwZURlY2xhcmF0aW9uU3RhcnQgbmVlZHMgdG8gc2tpcCBhbm5vdGF0aW9ucywgbm90CitqdXN0IHN0b3AgYXQgJ0AnLCBiZWNhdXNlIHZhcmlhYmxlIGFuZCBtZXRob2QgZGVjbGFyYXRpb25zIGNhbiBhbHNvIGJlCithbm5vdGF0ZWQuCis+IHR5cGVEZWNsYXJhdGlvblN0YXJ0IQorPiAgICAgOiAgIChtb2RpZmllciEpKiAoImNsYXNzIiB8ICJpbnRlcmZhY2UiIHwgImVudW0iIHwgQVQgKQorUy5CLiBzb21ldGhpbmcgbGlrZQorPiAgICAgOiAgIChtb2RpZmllciEgfCBhbm5vdGF0aW9uVG9rZW5zISkqICgiY2xhc3MiIHwgImludGVyZmFjZSIgfAorPiAiZW51bSIgKQorKEFuZCBtYXliZSBAaW50ZXJmYWNlLCBpZiBKYXZhIDUgYWxsb3dzIG5lc3RlZCBhbm5vdGF0aW9uIHR5cGVzPyBEb24ndAora25vdyBvZmZoYW5kLikKK1doZXJlIGFubm90YXRpb25Ub2tlbnMgY2FuIGJlIGEgcXVpY2sgcGFyZW4tc2tpcHBlciwgYXMgaW4gb3RoZXIKK3BsYWNlczogJ0AnIGlkZW50ICcoJyBiYWxhbmNlZFRva2VucyAnKScuCisqLworCit0eXBlRGVjbGFyYXRpb25TdGFydCEKKyAgICA6ICAgbW9kaWZpZXJzT3B0ISAoImNsYXNzIiB8ICJpbnRlcmZhY2UiIHwgImVudW0iIHwgQVQgImludGVyZmFjZSIpCisgICAgOworICAgIAorLyoqIEFuIElERU5UIHRva2VuIHdob3NlIHNwZWxsaW5nIGlzIHJlcXVpcmVkIHRvIHN0YXJ0IHdpdGggYW4gdXBwZXJjYXNlIGxldHRlci4KKyAqICBJbiB0aGUgY2FzZSBvZiBhIHNpbXBsZSBzdGF0ZW1lbnQge1VwcGVySUQgbmFtZX0gdGhlIGlkZW50aWZpZXIgaXMgdGFrZW4gdG8gYmUgYSB0eXBlIG5hbWUsIG5vdCBhIGNvbW1hbmQgbmFtZS4KKyAqLwordXBwZXJDYXNlSWRlbnQKKyAgICA6ICAge2lzVXBwZXJDYXNlKExUKDEpKX0/CisgICAgICAgIElERU5UCisgICAgOworCisvLyBBIHR5cGUgc3BlY2lmaWNhdGlvbiBpcyBhIHR5cGUgbmFtZSB3aXRoIHBvc3NpYmxlIGJyYWNrZXRzIGFmdGVyd2FyZHMKKy8vICh3aGljaCB3b3VsZCBtYWtlIGl0IGFuIGFycmF5IHR5cGUpLgorLy8gU2V0IGFkZEltYWdOb2RlIHRydWUgZm9yIHR5cGVzIGluc2lkZSBleHByZXNzaW9ucywgbm90IGRlY2xhcmF0aW9ucy4KK3R5cGVTcGVjW2Jvb2xlYW4gYWRkSW1hZ05vZGVdCisgICAgOiAgICBjbGFzc1R5cGVTcGVjW2FkZEltYWdOb2RlXQorICAgIHwgICAgYnVpbHRJblR5cGVTcGVjW2FkZEltYWdOb2RlXQorICAgIDsKKworLy8gYWxzbyBjaGVjayB0aGF0ICdjbGFzc09ySW50ZXJmYWNlVHlwZVtmYWxzZV0nIGlzIGEgc3VpdGFibGUgc3Vic3RpdHV0aW9uIGZvciAnaWRlbnRpZmllcicKKworLy8gQSBjbGFzcyB0eXBlIHNwZWNpZmljYXRpb24gaXMgYSBjbGFzcyB0eXBlIHdpdGggZWl0aGVyOgorLy8gLSBwb3NzaWJsZSBicmFja2V0cyBhZnRlcndhcmRzCisvLyAgICh3aGljaCB3b3VsZCBtYWtlIGl0IGFuIGFycmF5IHR5cGUpLgorLy8gLSBnZW5lcmljIHR5cGUgYXJndW1lbnRzIGFmdGVyCitjbGFzc1R5cGVTcGVjW2Jvb2xlYW4gYWRkSW1hZ05vZGVdICB7VG9rZW4gZmlyc3QgPSBMVCgxKTt9CisgICAgOiAgIGN0OmNsYXNzT3JJbnRlcmZhY2VUeXBlW2ZhbHNlXSEKKyAgICAgICAgZGVjbGFyYXRvckJyYWNrZXRzWyNjdF0KKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBhZGRJbWFnTm9kZSApIHsKKyAgICAgICAgICAgICAgICAjY2xhc3NUeXBlU3BlYyA9ICMoY3JlYXRlKFRZUEUsIlRZUEUiLGZpcnN0LExUKDEpKSwgI2NsYXNzVHlwZVNwZWMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgOworCisvLyBBIG5vbi1idWlsdCBpbiB0eXBlIG5hbWUsIHdpdGggcG9zc2libGUgdHlwZSBwYXJhbWV0ZXJzCitjbGFzc09ySW50ZXJmYWNlVHlwZVtib29sZWFuIGFkZEltYWdOb2RlXSAge1Rva2VuIGZpcnN0ID0gTFQoMSk7fQorICAgIDogICBJREVOVF4gKHR5cGVBcmd1bWVudHMpPworICAgICAgICAoICAgb3B0aW9uc3tncmVlZHk9dHJ1ZTt9OiAvLyBtYXRjaCBhcyBtYW55IGFzIHBvc3NpYmxlCisgICAgICAgICAgICBET1ReCisgICAgICAgICAgICBJREVOVCAodHlwZUFyZ3VtZW50cyk/CisgICAgICAgICkqCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggYWRkSW1hZ05vZGUgKSB7CisgICAgICAgICAgICAgICAgI2NsYXNzT3JJbnRlcmZhY2VUeXBlID0gIyhjcmVhdGUoVFlQRSwiVFlQRSIsZmlyc3QsTFQoMSkpLCAjY2xhc3NPckludGVyZmFjZVR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgOworCisvLyBBIHNwZWNpYWxpc2VkIGZvcm0gb2YgdHlwZVNwZWMgd2hlcmUgYnVpbHQgaW4gdHlwZXMgbXVzdCBiZSBhcnJheXMKK3R5cGVBcmd1bWVudFNwZWMKKyAgICA6ICAgY2xhc3NUeXBlU3BlY1t0cnVlXQorICAgIHwgICBidWlsdEluVHlwZUFycmF5U3BlY1t0cnVlXQorICAgIDsKKworLy8gQSBnZW5lcmljIHR5cGUgYXJndW1lbnQgaXMgYSBjbGFzcyB0eXBlLCBhIHBvc3NpYmx5IGJvdW5kZWQgd2lsZGNhcmQgdHlwZSBvciBhIGJ1aWx0LWluIHR5cGUgYXJyYXkKK3R5cGVBcmd1bWVudCAge1Rva2VuIGZpcnN0ID0gTFQoMSk7fQorICAgIDogICAoICAgdHlwZUFyZ3VtZW50U3BlYworICAgICAgICB8ICAgd2lsZGNhcmRUeXBlCisgICAgICAgICkKKyAgICAgICAgeyN0eXBlQXJndW1lbnQgPSAjKGNyZWF0ZShUWVBFX0FSR1VNRU5ULCJUWVBFX0FSR1VNRU5UIixmaXJzdCxMVCgxKSksICN0eXBlQXJndW1lbnQpO30KKyAgICA7CisKKy8vIFdpbGRjYXJkIHR5cGUgaW5kaWNhdGluZyBhbGwgdHlwZXMgKHdpdGggcG9zc2libGUgY29uc3RyYWludCkKK3dpbGRjYXJkVHlwZQorICAgIDogICBRVUVTVElPTiAKKyAgICAgICAgKCgiZXh0ZW5kcyIgfCAic3VwZXIiKT0+IHR5cGVBcmd1bWVudEJvdW5kcyk/CisgICAgICAgIHsjd2lsZGNhcmRUeXBlLnNldFR5cGUoV0lMRENBUkRfVFlQRSk7fQorICAgIDsKKworLy8gVHlwZSBhcmd1bWVudHMgdG8gYSBjbGFzcyBvciBpbnRlcmZhY2UgdHlwZQordHlwZUFyZ3VtZW50cwore1Rva2VuIGZpcnN0ID0gTFQoMSk7CitpbnQgY3VycmVudEx0TGV2ZWwgPSAwO30KKyAgICA6CisgICAgICAgIHtjdXJyZW50THRMZXZlbCA9IGx0Q291bnRlcjt9CisgICAgICAgIExUISB7bHRDb3VudGVyKys7fSBubHMhCisgICAgICAgIHR5cGVBcmd1bWVudAorICAgICAgICAoICAgb3B0aW9uc3tncmVlZHk9dHJ1ZTt9OiAvLyBtYXRjaCBhcyBtYW55IGFzIHBvc3NpYmxlCisgICAgICAgICAgICB7aW5wdXRTdGF0ZS5ndWVzc2luZyAhPTAgfHwgbHRDb3VudGVyID09IGN1cnJlbnRMdExldmVsICsgMX0/CisgICAgICAgICAgICBDT01NQSEgbmxzISB0eXBlQXJndW1lbnQKKyAgICAgICAgKSoKKyAgICAgICAgbmxzIQorICAgICAgICAoICAgLy8gdHVybiB3YXJuaW5nIG9mZiBzaW5jZSBBbnRsciBnZW5lcmF0ZXMgdGhlIHJpZ2h0IGNvZGUsCisgICAgICAgICAgICAvLyBwbHVzIHdlIGhhdmUgb3VyIHNlbWFudGljIHByZWRpY2F0ZSBiZWxvdworICAgICAgICAgICAgb3B0aW9uc3tnZW5lcmF0ZUFtYmlnV2FybmluZ3M9ZmFsc2U7fToKKyAgICAgICAgICAgIHR5cGVBcmd1bWVudHNPclBhcmFtZXRlcnNFbmQKKyAgICAgICAgKT8KKworICAgICAgICAvLyBtYWtlIHN1cmUgd2UgaGF2ZSBnb2JibGVkIHVwIGVub3VnaCAnPicgY2hhcmFjdGVycworICAgICAgICAvLyBpZiB3ZSBhcmUgYXQgdGhlICJ0b3AgbGV2ZWwiIG9mIG5lc3RlZCB0eXBlQXJndW1lbnQgcHJvZHVjdGlvbnMKKyAgICAgICAgeyhjdXJyZW50THRMZXZlbCAhPSAwKSB8fCBsdENvdW50ZXIgPT0gY3VycmVudEx0TGV2ZWx9PworCisgICAgICAgIHsjdHlwZUFyZ3VtZW50cyA9ICMoY3JlYXRlKFRZUEVfQVJHVU1FTlRTLCAiVFlQRV9BUkdVTUVOVFMiLGZpcnN0LExUKDEpKSwgI3R5cGVBcmd1bWVudHMpO30KKyAgICA7CisKKy8vIHRoaXMgZ29iYmxlcyB1cCAqc29tZSogYW1vdW50IG9mICc+JyBjaGFyYWN0ZXJzLCBhbmQgY291bnRzIGhvdyBtYW55CisvLyBpdCBnb2JibGVkLgorcHJvdGVjdGVkIHR5cGVBcmd1bWVudHNPclBhcmFtZXRlcnNFbmQKKyAgICA6ICAgR1QhIHtsdENvdW50ZXItPTE7fSBubHMhCisgICAgfCAgIFNSISB7bHRDb3VudGVyLT0yO30gbmxzIQorICAgIHwgICBCU1IhIHtsdENvdW50ZXItPTM7fSBubHMhCisgICAgOworCisvLyBSZXN0cmljdGlvbiBvbiB3aWxkY2FyZCB0eXBlcyBiYXNlZCBvbiBzdXBlciBjbGFzcyBvciBkZXJyaXZlZCBjbGFzcwordHlwZUFyZ3VtZW50Qm91bmRzCisgICAge1Rva2VuIGZpcnN0ID0gTFQoMSk7Ym9vbGVhbiBpc1VwcGVyQm91bmRzID0gZmFsc2U7fQorICAgIDoKKyAgICAgICAgKCAiZXh0ZW5kcyIhIHtpc1VwcGVyQm91bmRzPXRydWU7fSB8ICJzdXBlciIhICkgbmxzISBjbGFzc09ySW50ZXJmYWNlVHlwZVt0cnVlXSBubHMhCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpc1VwcGVyQm91bmRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICN0eXBlQXJndW1lbnRCb3VuZHMgPSAjKGNyZWF0ZShUWVBFX1VQUEVSX0JPVU5EUywiVFlQRV9VUFBFUl9CT1VORFMiLGZpcnN0LExUKDEpKSwgI3R5cGVBcmd1bWVudEJvdW5kcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgI3R5cGVBcmd1bWVudEJvdW5kcyA9ICMoY3JlYXRlKFRZUEVfTE9XRVJfQk9VTkRTLCJUWVBFX0xPV0VSX0JPVU5EUyIsZmlyc3QsTFQoMSkpLCAjdHlwZUFyZ3VtZW50Qm91bmRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIDsKKworLy8gQSBidWlsdGluIHR5cGUgYXJyYXkgc3BlY2lmaWNhdGlvbiBpcyBhIGJ1aWx0aW4gdHlwZSB3aXRoIGJyYWNrZXRzIGFmdGVyd2FyZHMKK2J1aWx0SW5UeXBlQXJyYXlTcGVjW2Jvb2xlYW4gYWRkSW1hZ05vZGVdICB7VG9rZW4gZmlyc3QgPSBMVCgxKTt9CisgICAgOiAgIGJ0OmJ1aWx0SW5UeXBlIQorICAgICAgICAoICAgKExCUkFDSyk9PiAgIC8vIHJlcXVpcmUgYXQgbGVhc3Qgb25lIFtdCisgICAgICAgICAgICBkZWNsYXJhdG9yQnJhY2tldHNbI2J0XSAKKyAgICAgICAgfCAgIHtyZXF1aXJlKGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAicHJpbWl0aXZlIHR5cGUgcGFyYW1ldGVycyBub3QgYWxsb3dlZCBoZXJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2UgdGhlIGNvcnJlc3BvbmRpbmcgd3JhcHBlciB0eXBlLCBzdWNoIGFzIEludGVnZXIgZm9yIGludCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICk7fQorICAgICAgICApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggYWRkSW1hZ05vZGUgKSB7CisgICAgICAgICAgICAgICAgI2J1aWx0SW5UeXBlQXJyYXlTcGVjID0gIyhjcmVhdGUoVFlQRSwiVFlQRSIsZmlyc3QsTFQoMSkpLCAjYnVpbHRJblR5cGVBcnJheVNwZWMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgOworCisvLyBBIGJ1aWx0aW4gdHlwZSBzcGVjaWZpY2F0aW9uIGlzIGEgYnVpbHRpbiB0eXBlIHdpdGggcG9zc2libGUgYnJhY2tldHMKKy8vIGFmdGVyd2FyZHMgKHdoaWNoIHdvdWxkIG1ha2UgaXQgYW4gYXJyYXkgdHlwZSkuCitidWlsdEluVHlwZVNwZWNbYm9vbGVhbiBhZGRJbWFnTm9kZV0gIHtUb2tlbiBmaXJzdCA9IExUKDEpO30KKyAgICA6ICAgYnQ6YnVpbHRJblR5cGUhCisgICAgICAgIGRlY2xhcmF0b3JCcmFja2V0c1sjYnRdCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggYWRkSW1hZ05vZGUgKSB7CisgICAgICAgICAgICAgICAgI2J1aWx0SW5UeXBlU3BlYyA9ICMoY3JlYXRlKFRZUEUsIlRZUEUiLGZpcnN0LExUKDEpKSwgI2J1aWx0SW5UeXBlU3BlYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICA7CisKKy8vIEEgdHlwZSBuYW1lLiB3aGljaCBpcyBlaXRoZXIgYSAocG9zc2libHkgcXVhbGlmaWVkIGFuZCBwYXJhbWV0ZXJpemVkKQorLy8gY2xhc3MgbmFtZSBvciBhIHByaW1pdGl2ZSAoYnVpbHRpbikgdHlwZQordHlwZQorICAgIDogICBjbGFzc09ySW50ZXJmYWNlVHlwZVtmYWxzZV0KKyAgICB8ICAgYnVpbHRJblR5cGUKKyAgICA7CisKKy8vIFRoZSBwcmltaXRpdmUgdHlwZXMuCitidWlsdEluVHlwZQorICAgIDogICAidm9pZCIKKyAgICB8ICAgImJvb2xlYW4iCisgICAgfCAgICJieXRlIgorICAgIHwgICAiY2hhciIKKyAgICB8ICAgInNob3J0IgorICAgIHwgICAiaW50IgorICAgIHwgICAiZmxvYXQiCisgICAgfCAgICJsb25nIgorICAgIHwgICAiZG91YmxlIgorICAgIDsKKworLy8gQSAocG9zc2libHktcXVhbGlmaWVkKSBqYXZhIGlkZW50aWZpZXIuIFdlIHN0YXJ0IHdpdGggdGhlIGZpcnN0IElERU5UCisvLyBhbmQgZXhwYW5kIGl0cyBuYW1lIGJ5IGFkZGluZyBkb3RzIGFuZCBmb2xsb3dpbmcgSURFTlRTCitpZGVudGlmaWVyCisgICAgOiAgIElERU5UCisgICAgICAgICggICBvcHRpb25zIHsgZ3JlZWR5ID0gdHJ1ZTsgfSA6CisgICAgICAgICAgICBET1ReIG5scyEgSURFTlQgKSoKKyAgICA7CisKK2lkZW50aWZpZXJTdGFyCisgICAgOiAgIElERU5UCisgICAgICAgICggICBvcHRpb25zIHsgZ3JlZWR5ID0gdHJ1ZTsgfSA6CisgICAgICAgICAgICBET1ReICBubHMhIElERU5UICkqCisgICAgICAgICggICBET1ReICBubHMhIFNUQVIKKyAgICAgICAgfCAgICJhcyJeIG5scyEgSURFTlQKKyAgICAgICAgKT8KKyAgICA7CisKK21vZGlmaWVyc0ludGVybmFsCisgICAgICAgIHsgaW50IHNlZW5EZWYgPSAwOyB9CisgICAgOgorICAgICAgICAoCisgICAgICAgICAgICAvLyBXaXRob3V0IHRoaXMgaHVzaCwgdGhlcmUgaXMgYSB3YXJuaW5nIHRoYXQgQElERU5UIGFuZCBAaW50ZXJmYWNlCisgICAgICAgICAgICAvLyBjYW4gZm9sbG93IG1vZGlmaWVyc0ludGVybmFsLiAgQnV0IGhvdyBpcyBASURFTlQgcG9zc2libGUgYWZ0ZXIKKyAgICAgICAgICAgIC8vIG1vZGlmaWVyc0ludGVybmFsPyAgQW5kIGhvdyBpcyBAaW50ZXJmYWNlIHBvc3NpYmxlIGluc2lkZSBtb2RpZmllcnNJbnRlcm5hbD8KKyAgICAgICAgICAgIC8vIElzIHRoZXJlIGFuIGFudGxyIGJ1Zz8KKyAgICAgICAgICAgIG9wdGlvbnN7Z2VuZXJhdGVBbWJpZ1dhcm5pbmdzPWZhbHNlO306CisKKyAgICAgICAgICAgIC8vICdkZWYnIGlzIGFuIGVtcHR5IG1vZGlmaWVyLCBmb3IgZGlzYW1iaWd1YXRpbmcgZGVjbGFyYXRpb25zCisgICAgICAgICAgICB7c2VlbkRlZisrID09IDB9PyAgICAgICAvLyBkbyBub3QgYWxsb3cgbXVsdGlwbGUgImRlZiIgdG9rZW5zCisgICAgICAgICAgICAiZGVmIiEgbmxzIQorICAgICAgICB8CisgICAgICAgICAgICAvLyBOb3RlOiBEdXBsaWNhdGlvbiBvZiBtb2RpZmllcnMgaXMgZGV0ZWN0ZWQgd2hlbiB3YWxraW5nIHRoZSBBU1QuCisgICAgICAgICAgICBtb2RpZmllciBubHMhCisgICAgICAgIHwKKyAgICAgICAgICAgIHtMQSgxKT09QVQgJiYgIUxUKDIpLmdldFRleHQoKS5lcXVhbHMoImludGVyZmFjZSIpfT8KKyAgICAgICAgICAgIGFubm90YXRpb24gbmxzIQorICAgICAgICApKworICAgIDsKKworLyoqIEEgbGlzdCBvZiBvbmUgb3IgbW9yZSBtb2RpZmllciwgYW5ub3RhdGlvbiwgb3IgImRlZiIuICovCittb2RpZmllcnMgIHtUb2tlbiBmaXJzdCA9IExUKDEpO30KKyAgICA6ICAgbW9kaWZpZXJzSW50ZXJuYWwKKyAgICAgICAgeyNtb2RpZmllcnMgPSAjKGNyZWF0ZShNT0RJRklFUlMsICJNT0RJRklFUlMiLGZpcnN0LExUKDEpKSwgI21vZGlmaWVycyk7fQorICAgIDsKKworLyoqIEEgbGlzdCBvZiB6ZXJvIG9yIG1vcmUgbW9kaWZpZXJzLCBhbm5vdGF0aW9ucywgb3IgImRlZiIuICovCittb2RpZmllcnNPcHQgIHtUb2tlbiBmaXJzdCA9IExUKDEpO30KKyAgICA6ICAgKAorICAgICAgICAgICAgLy8gU2VlIGNvbW1lbnQgYWJvdmUgb24gaHVzaGluZyB3YXJuaW5ncy4KKyAgICAgICAgICAgIG9wdGlvbnN7Z2VuZXJhdGVBbWJpZ1dhcm5pbmdzPWZhbHNlO306CisKKyAgICAgICAgICAgIG1vZGlmaWVyc0ludGVybmFsCisgICAgICAgICk/CisgICAgICAgIHsjbW9kaWZpZXJzT3B0ID0gIyhjcmVhdGUoTU9ESUZJRVJTLCAiTU9ESUZJRVJTIixmaXJzdCxMVCgxKSksICNtb2RpZmllcnNPcHQpO30KKyAgICA7CisKKy8vIG1vZGlmaWVycyBmb3IgSmF2YSBjbGFzc2VzLCBpbnRlcmZhY2VzLCBjbGFzcy9pbnN0YW5jZSB2YXJzIGFuZCBtZXRob2RzCittb2RpZmllcgorICAgIDogICAicHJpdmF0ZSIKKyAgICB8ICAgInB1YmxpYyIKKyAgICB8ICAgInByb3RlY3RlZCIKKyAgICB8ICAgInN0YXRpYyIKKyAgICB8ICAgInRyYW5zaWVudCIKKyAgICB8ICAgImZpbmFsIgorICAgIHwgICAiYWJzdHJhY3QiCisgICAgfCAgICJuYXRpdmUiCisgICAgfCAgICJ0aHJlYWRzYWZlIgorICAgIHwgICAic3luY2hyb25pemVkIgorICAgIHwgICAidm9sYXRpbGUiCisgICAgfCAgICJzdHJpY3RmcCIKKyAgICA7CisKK2Fubm90YXRpb24hICB7VG9rZW4gZmlyc3QgPSBMVCgxKTt9CisgICAgOiAgIEFUISBpOmlkZW50aWZpZXIgbmxzISAoIExQQVJFTiEgKCBhcmdzOmFubm90YXRpb25Bcmd1bWVudHMgKT8gUlBBUkVOISApPworICAgICAgICB7I2Fubm90YXRpb24gPSAjKGNyZWF0ZShBTk5PVEFUSU9OLCJBTk5PVEFUSU9OIixmaXJzdCxMVCgxKSksIGksIGFyZ3MpO30KKyAgICA7CisKK2Fubm90YXRpb25zT3B0ICB7VG9rZW4gZmlyc3QgPSBMVCgxKTt9CisgICAgOiAgIChhbm5vdGF0aW9uIG5scyEpKgorICAgICAgICB7I2Fubm90YXRpb25zT3B0ID0gIyhjcmVhdGUoQU5OT1RBVElPTlMsICJBTk5PVEFUSU9OUyIsIGZpcnN0LCBMVCgxKSksICNhbm5vdGF0aW9uc09wdCk7fQorOworCithbm5vdGF0aW9uQXJndW1lbnRzCisgICAgOiAgIHY6YW5ub3RhdGlvbk1lbWJlclZhbHVlSW5pdGlhbGl6ZXIKKyAgICAJCXsgVG9rZW4gaXRrbiA9IG5ldyBUb2tlbihJREVOVCwgInZhbHVlIik7CisgICAgCQkgIEFTVCBpOworICAgIAkJICAjaSA9ICMoY3JlYXRlKElERU5ULCAidmFsdWUiLCBpdGtuLCBpdGtuKSk7CisgICAgCQkJI2Fubm90YXRpb25Bcmd1bWVudHMgPSAjKGNyZWF0ZShBTk5PVEFUSU9OX01FTUJFUl9WQUxVRV9QQUlSLCJBTk5PVEFUSU9OX01FTUJFUl9WQUxVRV9QQUlSIixMVCgxKSxMVCgxKSksIGksIHYpO30gCisgICAgCQl8IGFubm90YXRpb25NZW1iZXJWYWx1ZVBhaXJzCisgICAgOworCithbm5vdGF0aW9uTWVtYmVyVmFsdWVQYWlycworICAgIDogICBhbm5vdGF0aW9uTWVtYmVyVmFsdWVQYWlyICggQ09NTUEhIG5scyEgYW5ub3RhdGlvbk1lbWJlclZhbHVlUGFpciApKgorICAgIDsKKworYW5ub3RhdGlvbk1lbWJlclZhbHVlUGFpciEgIHtUb2tlbiBmaXJzdCA9IExUKDEpO30KKyAgICA6ICAgaTpJREVOVCBBU1NJR04hIG5scyEgdjphbm5vdGF0aW9uTWVtYmVyVmFsdWVJbml0aWFsaXplcgorICAgICAgICAgICAgeyNhbm5vdGF0aW9uTWVtYmVyVmFsdWVQYWlyID0gIyhjcmVhdGUoQU5OT1RBVElPTl9NRU1CRVJfVkFMVUVfUEFJUiwiQU5OT1RBVElPTl9NRU1CRVJfVkFMVUVfUEFJUiIsZmlyc3QsTFQoMSkpLCBpLCB2KTt9CisgICAgOworCithbm5vdGF0aW9uTWVtYmVyVmFsdWVJbml0aWFsaXplcgorICAgIDogICBjb25kaXRpb25hbEV4cHJlc3Npb25bMF0gfCBhbm5vdGF0aW9uCisgICAgOworCisvKk9CUyoKKy8vIFRoaXMgaXMgYW4gaW5pdGlhbGl6ZXIgdXNlZCB0byBzZXQgdXAgYW4gYW5ub3RhdGlvbiBtZW1iZXIgYXJyYXkuCithbm5vdGF0aW9uTWVtYmVyQXJyYXlJbml0aWFsaXplcgorICAgIDogICBsYzpMQ1VSTFleIHsjbGMuc2V0VHlwZShBTk5PVEFUSU9OX0FSUkFZX0lOSVQpO30KKyAgICAgICAgKCAgIGFubm90YXRpb25NZW1iZXJBcnJheVZhbHVlSW5pdGlhbGl6ZXIKKyAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICAvLyBDT05GTElDVDogZG9lcyBhIENPTU1BIGFmdGVyIGFuIGluaXRpYWxpemVyIHN0YXJ0IGEgbmV3CisgICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZXIgb3Igc3RhcnQgdGhlIG9wdGlvbiAnLCcgYXQgZW5kPworICAgICAgICAgICAgICAgIC8vIEFOVExSIGdlbmVyYXRlcyBwcm9wZXIgY29kZSBieSBtYXRjaGluZworICAgICAgICAgICAgICAgIC8vIHRoZSBjb21tYSBhcyBzb29uIGFzIHBvc3NpYmxlLgorICAgICAgICAgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgICAgICAgICAgICAgd2FybldoZW5Gb2xsb3dBbWJpZyA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIDoKKyAgICAgICAgICAgICAgICBDT01NQSEgbmxzISBhbm5vdGF0aW9uTWVtYmVyQXJyYXlWYWx1ZUluaXRpYWxpemVyCisgICAgICAgICAgICApKgorICAgICAgICAgICAgKENPTU1BISBubHMhKT8KKyAgICAgICAgKT8KKyAgICAgICAgUkNVUkxZIQorICAgIDsKKypPQlMqLworCisvLyBUaGUgdHdvIHRoaW5ncyB0aGF0IGNhbiBpbml0aWFsaXplIGFuIGFubm90YXRpb24gYXJyYXkgZWxlbWVudCBhcmUgYSBjb25kaXRpb25hbCBleHByZXNzaW9uCisvLyBhbmQgYW4gYW5ub3RhdGlvbiAobmVzdGVkIGFubm90YXRpb24gYXJyYXkgaW5pdGlhbGlzZXJzIGFyZSBub3QgdmFsaWQpCithbm5vdGF0aW9uTWVtYmVyQXJyYXlWYWx1ZUluaXRpYWxpemVyCisgICAgOiAgIGNvbmRpdGlvbmFsRXhwcmVzc2lvblswXQorICAgIHwgICBhbm5vdGF0aW9uIG5scyEKKyAgICA7CisKK3N1cGVyQ2xhc3NDbGF1c2UhCisgICAge1Rva2VuIGZpcnN0ID0gTFQoMSk7fQorICAgIDoKKyAgICAgICAgKCAiZXh0ZW5kcyIgbmxzISBjOmNsYXNzT3JJbnRlcmZhY2VUeXBlW2ZhbHNlXSBubHMhICk/CisgICAgICAgIHsjc3VwZXJDbGFzc0NsYXVzZSA9ICMoY3JlYXRlKEVYVEVORFNfQ0xBVVNFLCJFWFRFTkRTX0NMQVVTRSIsZmlyc3QsTFQoMSkpLGMpO30KKyAgICA7CisKKy8vIERlZmluaXRpb24gb2YgYSBKYXZhIGNsYXNzCitjbGFzc0RlZmluaXRpb24hW0FTVCBtb2RpZmllcnNdCit7VG9rZW4gZmlyc3QgPSBMVCgxKTtBU1QgcHJldkN1cnJlbnRDbGFzcyA9IGN1cnJlbnRDbGFzczsgfQorICAgIDogICAiY2xhc3MiIElERU5UIG5scyEKKyAgICAgICB7IGN1cnJlbnRDbGFzcyA9ICNJREVOVDsgfQorICAgICAgICAvLyBpdCBfbWlnaHRfIGhhdmUgdHlwZSBwYXJhbWF0ZXJzCisgICAgICAgICh0cDp0eXBlUGFyYW1ldGVycyk/CisgICAgICAgIC8vIGl0IF9taWdodF8gaGF2ZSBhIHN1cGVyY2xhc3MuLi4KKyAgICAgICAgc2M6c3VwZXJDbGFzc0NsYXVzZQorICAgICAgICAvLyBpdCBtaWdodCBpbXBsZW1lbnQgc29tZSBpbnRlcmZhY2VzLi4uCisgICAgICAgIGljOmltcGxlbWVudHNDbGF1c2UKKyAgICAgICAgLy8gbm93IHBhcnNlIHRoZSBib2R5IG9mIHRoZSBjbGFzcworICAgICAgICBjYjpjbGFzc0Jsb2NrCisgICAgICAgIHsjY2xhc3NEZWZpbml0aW9uID0gIyhjcmVhdGUoQ0xBU1NfREVGLCJDTEFTU19ERUYiLGZpcnN0LExUKDEpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVycyxJREVOVCx0cCxzYyxpYyxjYik7fQorICAgICAgICB7IGN1cnJlbnRDbGFzcyA9IHByZXZDdXJyZW50Q2xhc3M7IH0KKyAgICA7CisKKy8vVE9ETyAtIHdoZXJlIGhhcyBzdXBlckNsYXNzQ2xhdXNlISBwcm9kdWN0aW9uIGdvbmU/Pz8KKworLy8gRGVmaW5pdGlvbiBvZiBhIEphdmEgSW50ZXJmYWNlCitpbnRlcmZhY2VEZWZpbml0aW9uIVtBU1QgbW9kaWZpZXJzXSAge1Rva2VuIGZpcnN0ID0gTFQoMSk7fQorICAgIDogICAiaW50ZXJmYWNlIiBJREVOVCBubHMhCisgICAgICAgIC8vIGl0IF9taWdodF8gaGF2ZSB0eXBlIHBhcmFtYXRlcnMKKyAgICAgICAgKHRwOnR5cGVQYXJhbWV0ZXJzKT8KKyAgICAgICAgLy8gaXQgbWlnaHQgZXh0ZW5kIHNvbWUgb3RoZXIgaW50ZXJmYWNlcworICAgICAgICBpZTppbnRlcmZhY2VFeHRlbmRzCisgICAgICAgIC8vIG5vdyBwYXJzZSB0aGUgYm9keSBvZiB0aGUgaW50ZXJmYWNlIChsb29rcyBsaWtlIGEgY2xhc3MuLi4pCisgICAgICAgIGliOmludGVyZmFjZUJsb2NrCisgICAgICAgIHsjaW50ZXJmYWNlRGVmaW5pdGlvbiA9ICMoY3JlYXRlKElOVEVSRkFDRV9ERUYsIklOVEVSRkFDRV9ERUYiLGZpcnN0LExUKDEpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllcnMsSURFTlQsdHAsaWUsaWIpO30KKyAgICA7CisKK2VudW1EZWZpbml0aW9uIVtBU1QgbW9kaWZpZXJzXSAge1Rva2VuIGZpcnN0ID0gTFQoMSk7IEFTVCBwcmV2Q3VycmVudENsYXNzID0gY3VycmVudENsYXNzO30KKyAgICA6ICAgImVudW0iIElERU5UCisgICAgCQl7IGN1cnJlbnRDbGFzcyA9ICNJREVOVDsgfQorICAgIAlubHMhCisgICAgICAgIC8vIGl0IG1pZ2h0IGltcGxlbWVudCBzb21lIGludGVyZmFjZXMuLi4KKyAgICAgICAgaWM6aW1wbGVtZW50c0NsYXVzZQorICAgICAgICBubHMhCisgICAgICAgIC8vIG5vdyBwYXJzZSB0aGUgYm9keSBvZiB0aGUgZW51bQorICAgICAgICBlYjplbnVtQmxvY2sKKyAgICAgICAgeyNlbnVtRGVmaW5pdGlvbiA9ICMoY3JlYXRlKEVOVU1fREVGLCJFTlVNX0RFRiIsZmlyc3QsTFQoMSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllcnMsSURFTlQsaWMsZWIpO30KKyAgICAgICAgeyBjdXJyZW50Q2xhc3MgPSBwcmV2Q3VycmVudENsYXNzOyB9CisgICAgOworCithbm5vdGF0aW9uRGVmaW5pdGlvbiFbQVNUIG1vZGlmaWVyc10gIHtUb2tlbiBmaXJzdCA9IExUKDEpO30KKyAgICA6ICAgQVQgImludGVyZmFjZSIgSURFTlQKKyAgICAgICAgLy8gbm93IHBhcnNlIHRoZSBib2R5IG9mIHRoZSBhbm5vdGF0aW9uCisgICAgICAgIGFiOmFubm90YXRpb25CbG9jaworICAgICAgICB7I2Fubm90YXRpb25EZWZpbml0aW9uID0gIyhjcmVhdGUoQU5OT1RBVElPTl9ERUYsIkFOTk9UQVRJT05fREVGIixmaXJzdCxMVCgxKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVycyxJREVOVCxhYik7fQorICAgIDsKKwordHlwZVBhcmFtZXRlcnMKK3tUb2tlbiBmaXJzdCA9IExUKDEpO2ludCBjdXJyZW50THRMZXZlbCA9IDA7fQorICAgIDoKKyAgICAgICAge2N1cnJlbnRMdExldmVsID0gbHRDb3VudGVyO30KKyAgICAgICAgTFQhIHtsdENvdW50ZXIrKzt9IG5scyEKKyAgICAgICAgdHlwZVBhcmFtZXRlciAoQ09NTUEhIG5scyEgdHlwZVBhcmFtZXRlcikqCisgICAgICAgIG5scyEKKyAgICAgICAgKHR5cGVBcmd1bWVudHNPclBhcmFtZXRlcnNFbmQpPworCisgICAgICAgIC8vIG1ha2Ugc3VyZSB3ZSBoYXZlIGdvYmJsZWQgdXAgZW5vdWdoICc+JyBjaGFyYWN0ZXJzCisgICAgICAgIC8vIGlmIHdlIGFyZSBhdCB0aGUgInRvcCBsZXZlbCIgb2YgbmVzdGVkIHR5cGVBcmd1bWVudCBwcm9kdWN0aW9ucworICAgICAgICB7KGN1cnJlbnRMdExldmVsICE9IDApIHx8IGx0Q291bnRlciA9PSBjdXJyZW50THRMZXZlbH0/CisKKyAgICAgICAgeyN0eXBlUGFyYW1ldGVycyA9ICMoY3JlYXRlKFRZUEVfUEFSQU1FVEVSUywgIlRZUEVfUEFSQU1FVEVSUyIsZmlyc3QsTFQoMSkpLCAjdHlwZVBhcmFtZXRlcnMpO30KKyAgICA7CisKK3R5cGVQYXJhbWV0ZXIgIHtUb2tlbiBmaXJzdCA9IExUKDEpO30KKyAgICA6CisgICAgICAgIC8vIEknbSBwcmV0dHkgc3VyZSBBbnRsciBnZW5lcmF0ZXMgdGhlIHJpZ2h0IHRoaW5nIGhlcmU6CisgICAgICAgIChpZDpJREVOVCkgKCBvcHRpb25ze2dlbmVyYXRlQW1iaWdXYXJuaW5ncz1mYWxzZTt9OiB0eXBlUGFyYW1ldGVyQm91bmRzICk/CisgICAgICAgIHsjdHlwZVBhcmFtZXRlciA9ICMoY3JlYXRlKFRZUEVfUEFSQU1FVEVSLCJUWVBFX1BBUkFNRVRFUiIsZmlyc3QsTFQoMSkpLCAjdHlwZVBhcmFtZXRlcik7fQorICAgIDsKKwordHlwZVBhcmFtZXRlckJvdW5kcyAge1Rva2VuIGZpcnN0ID0gTFQoMSk7fQorICAgIDoKKyAgICAgICAgImV4dGVuZHMiISBubHMhIGNsYXNzT3JJbnRlcmZhY2VUeXBlW3RydWVdCisgICAgICAgIChCQU5EISBubHMhIGNsYXNzT3JJbnRlcmZhY2VUeXBlW3RydWVdKSoKKyAgICAgICAgeyN0eXBlUGFyYW1ldGVyQm91bmRzID0gIyhjcmVhdGUoVFlQRV9VUFBFUl9CT1VORFMsIlRZUEVfVVBQRVJfQk9VTkRTIixmaXJzdCxMVCgxKSksICN0eXBlUGFyYW1ldGVyQm91bmRzKTt9CisgICAgOworCisvLyBUaGlzIGlzIHRoZSBib2R5IG9mIGEgY2xhc3MuIFlvdSBjYW4gaGF2ZSBjbGFzc0ZpZWxkcyBhbmQgZXh0cmEgc2VtaWNvbG9ucy4KK2NsYXNzQmxvY2sgIHtUb2tlbiBmaXJzdCA9IExUKDEpO30KKyAgICA6ICAgTENVUkxZIQorICAgICAgICAoIGNsYXNzRmllbGQgKT8gKCBzZXAhICggY2xhc3NGaWVsZCApPyApKgorICAgICAgICBSQ1VSTFkhCisgICAgICAgIHsjY2xhc3NCbG9jayA9ICMoY3JlYXRlKE9CSkJMT0NLLCAiT0JKQkxPQ0siLGZpcnN0LExUKDEpKSwgI2NsYXNzQmxvY2spO30KKyAgICA7CisKKy8vIFRoaXMgaXMgdGhlIGJvZHkgb2YgYW4gaW50ZXJmYWNlLiBZb3UgY2FuIGhhdmUgaW50ZXJmYWNlRmllbGQgYW5kIGV4dHJhIHNlbWljb2xvbnMuCitpbnRlcmZhY2VCbG9jayAge1Rva2VuIGZpcnN0ID0gTFQoMSk7fQorICAgIDogICBMQ1VSTFkhCisgICAgICAgICggaW50ZXJmYWNlRmllbGQgKT8gKCBzZXAhICggaW50ZXJmYWNlRmllbGQgKT8gKSoKKyAgICAgICAgUkNVUkxZIQorICAgICAgICB7I2ludGVyZmFjZUJsb2NrID0gIyhjcmVhdGUoT0JKQkxPQ0ssICJPQkpCTE9DSyIsZmlyc3QsTFQoMSkpLCAjaW50ZXJmYWNlQmxvY2spO30KKyAgICA7CisKKy8vIFRoaXMgaXMgdGhlIGJvZHkgb2YgYW4gYW5ub3RhdGlvbi4gWW91IGNhbiBoYXZlIGFubm90YXRpb24gZmllbGRzIGFuZCBleHRyYSBzZW1pY29sb25zLAorLy8gVGhhdCdzIGFib3V0IGl0ICh1bnRpbCB5b3Ugc2VlIHdoYXQgYW4gYW5ub2F0aW9uIGZpZWxkIGlzLi4uKQorYW5ub3RhdGlvbkJsb2NrICB7VG9rZW4gZmlyc3QgPSBMVCgxKTt9CisgICAgOiAgIExDVVJMWSEKKyAgICAgICAgKCBhbm5vdGF0aW9uRmllbGQgKT8gKCBzZXAhICggYW5ub3RhdGlvbkZpZWxkICk/ICkqCisgICAgICAgIFJDVVJMWSEKKyAgICAgICAgeyNhbm5vdGF0aW9uQmxvY2sgPSAjKGNyZWF0ZShPQkpCTE9DSywgIk9CSkJMT0NLIixmaXJzdCxMVCgxKSksICNhbm5vdGF0aW9uQmxvY2spO30KKyAgICA7CisKKy8vIFRoaXMgaXMgdGhlIGJvZHkgb2YgYW4gZW51bS4gWW91IGNhbiBoYXZlIHplcm8gb3IgbW9yZSBlbnVtIGNvbnN0YW50cworLy8gZm9sbG93ZWQgYnkgYW55IG51bWJlciBvZiBmaWVsZHMgbGlrZSBhIHJlZ3VsYXIgY2xhc3MKK2VudW1CbG9jayAge1Rva2VuIGZpcnN0ID0gTFQoMSk7fQorICAgIDogICBMQ1VSTFkhIG5scyEKKyAgICAgICAgKAorICAgICAgICAgICAgLy8gTmVlZCBhIHN5bnRhY3RpYyBwcmVkaWNhdGUsIHNpbmNlIGVudW1Db25zdGFudHMKKyAgICAgICAgICAgIC8vIGNhbiBzdGFydCB3aXRoIGZvbygpIGFzIHdlbGwgYXMgY2xhc3NGaWVsZC4KKyAgICAgICAgICAgIC8vIChJdCdzIGEgdHJ1ZSBhbWJpZ3VpdHksIHZpc2libGUgaW4gdGhlIHNwZWNpZmljYXRpb24uCisgICAgICAgICAgICAvLyBUbyByZXNvbHZlIGluIHByYWN0aWNlLCB1c2UgImRlZiIgYmVmb3JlIGEgcmVhbCBtZXRob2QuKQorICAgICAgICAgICAgKGVudW1Db25zdGFudHNTdGFydCk9PiBlbnVtQ29uc3RhbnRzCisgICAgICAgIHwgICAoY2xhc3NGaWVsZCk/CisgICAgICAgICkKKyAgICAgICAgKCBzZXAhIChjbGFzc0ZpZWxkKT8gKSoKKyAgICAgICAgUkNVUkxZIQorICAgICAgICB7I2VudW1CbG9jayA9ICMoY3JlYXRlKE9CSkJMT0NLLCAiT0JKQkxPQ0siLGZpcnN0LExUKDEpKSwgI2VudW1CbG9jayk7fQorICAgIDsKKworLyoqIEd1YXJkIGZvciBlbnVtQ29uc3RhbnRzLiAgKi8KK2VudW1Db25zdGFudHNTdGFydAorICAgIDogICBlbnVtQ29uc3RhbnQgKENPTU1BIHwgU0VNSSB8IE5MUyB8IFJDVVJMWSkKKyAgICA7CisKKy8qKiBDb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBvbmUgb3IgbW9yZSBlbnVtIGNvbnN0YW50IGRlZmluaXRpb25zLiAgKi8KK2VudW1Db25zdGFudHMKKyAgICA6CisgICAgICAgIGVudW1Db25zdGFudAorICAgICAgICAoIG9wdGlvbnN7Z3JlZWR5PXRydWU7fTogQ09NTUEhIG5scyEgZW51bUNvbnN0YW50ICkqCisgICAgICAgICggQ09NTUEhIG5scyEgKT8gICAgICAgICAgICAvLyB0cmFpbGluZyBleHRyYSBjb21tYSBpcyBPSworICAgIDsKKworLy8gQW4gYW5ub3RhdGlvbiBmaWVsZAorYW5ub3RhdGlvbkZpZWxkISAge1Rva2VuIGZpcnN0ID0gTFQoMSk7fQorICAgIDogICBtb2RzOm1vZGlmaWVyc09wdCEKKyAgICAgICAgKCAgIHRkOnR5cGVEZWZpbml0aW9uSW50ZXJuYWxbI21vZHNdCisgICAgICAgICAgICB7I2Fubm90YXRpb25GaWVsZCA9ICN0ZDt9CisgICAgICAgIHwgICB0OnR5cGVTcGVjW2ZhbHNlXSAgICAgICAgICAgICAgIC8vIGFubm90YXRpb24gZmllbGQKKyAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICAvLyBOZWVkIGEgc3ludGFjdGljIHByZWRpY2F0ZSwgc2luY2UgdmFyaWFibGVEZWZpbml0aW9ucworICAgICAgICAgICAgICAgIC8vIGNhbiBzdGFydCB3aXRoIGZvbygpIGFsc28uICBTaW5jZSBtZXRob2QgZGVmcyBhcmUgbm90IGxlZ2FsCisgICAgICAgICAgICAgICAgLy8gaW4gdGhpcyBjb250ZXh0LCB0aGVyZSdzIG5vIGhhcm0gZG9uZS4KKyAgICAgICAgICAgICAgICAoSURFTlQgTFBBUkVOKT0+CisgICAgICAgICAgICAgICAgaTpJREVOVCAgICAgICAgICAgICAgLy8gdGhlIG5hbWUgb2YgdGhlIGZpZWxkCisgICAgICAgICAgICAgICAgTFBBUkVOISBSUEFSRU4hCisKKyAgICAgICAgICAgICAgICAvKk9CUyogcnQ6ZGVjbGFyYXRvckJyYWNrZXRzWyN0XSAqT0JTKi8KKworICAgICAgICAgICAgICAgICggImRlZmF1bHQiIG5scyEgYW12aTphbm5vdGF0aW9uTWVtYmVyVmFsdWVJbml0aWFsaXplciApPworCisgICAgICAgICAgICAgICAgeyNhbm5vdGF0aW9uRmllbGQgPQorICAgICAgICAgICAgICAgICAgICAgICAgIyhjcmVhdGUoQU5OT1RBVElPTl9GSUVMRF9ERUYsIkFOTk9UQVRJT05fRklFTERfREVGIixmaXJzdCxMVCgxKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyhjcmVhdGUoVFlQRSwiVFlQRSIsZmlyc3QsTFQoMSkpLHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSxhbXZpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO30KKyAgICAgICAgICAgIHwgICB2OnZhcmlhYmxlRGVmaW5pdGlvbnNbI21vZHMsI3RdICAgIC8vIHZhcmlhYmxlCisgICAgICAgICAgICAgICAgeyNhbm5vdGF0aW9uRmllbGQgPSAjdjt9CisgICAgICAgICAgICApCisgICAgICAgICkKKyAgICA7CisKKy8vQW4gZW51bSBjb25zdGFudCBtYXkgaGF2ZSBvcHRpb25hbCBwYXJhbWV0ZXJzIGFuZCBtYXkgaGF2ZSBhCisvL2EgY2xhc3MgYm9keQorZW51bUNvbnN0YW50ISAge1Rva2VuIGZpcnN0ID0gTFQoMSk7fQorICAgIDogICBhbjphbm5vdGF0aW9uc09wdCAvLyBOb3RlOiAgQ2Fubm90IHN0YXJ0IHdpdGggImRlZiIgb3IgYW5vdGhlciBtb2RpZmllci4KKyAgICAgICAgaTpJREVOVAorICAgICAgICAoICAgTFBBUkVOIQorICAgICAgICAgICAgYTphcmdMaXN0CisgICAgICAgICAgICBSUEFSRU4hCisgICAgICAgICk/CisgICAgICAgICggYjplbnVtQ29uc3RhbnRCbG9jayApPworICAgICAgICB7I2VudW1Db25zdGFudCA9ICMoY3JlYXRlKEVOVU1fQ09OU1RBTlRfREVGLCAiRU5VTV9DT05TVEFOVF9ERUYiLGZpcnN0LExUKDEpKSwgYW4sIGksIGEsIGIpO30KKyAgICA7CisKKy8vVGhlIGNsYXNzLWxpa2UgYm9keSBvZiBhbiBlbnVtIGNvbnN0YW50CitlbnVtQ29uc3RhbnRCbG9jayAge1Rva2VuIGZpcnN0ID0gTFQoMSk7fQorICAgIDogICBMQ1VSTFkhCisgICAgICAgIChlbnVtQ29uc3RhbnRGaWVsZCk/ICggc2VwISAoZW51bUNvbnN0YW50RmllbGQpPyApKgorICAgICAgICBSQ1VSTFkhCisgICAgICAgIHsjZW51bUNvbnN0YW50QmxvY2sgPSAjKGNyZWF0ZShPQkpCTE9DSywgIk9CSkJMT0NLIixmaXJzdCxMVCgxKSksICNlbnVtQ29uc3RhbnRCbG9jayk7fQorICAgIDsKKworLy9BbiBlbnVtIGNvbnN0YW50IGZpZWxkIGlzIGp1c3QgbGlrZSBhIGNsYXNzIGZpZWxkIGJ1dCB3aXRob3V0CisvL3RoZSBwb3NpYmlsaXR5IG9mIGEgY29uc3RydWN0b3IgZGVmaW5pdGlvbiBvciBhIHN0YXRpYyBpbml0aWFsaXplcgorCisvLyBUT0RPIC0gbWF5YmUgYWxsb3cgJ2RlY2xhcmF0aW9uJyBwcm9kdWN0aW9uIHdpdGhpbiB0aGlzIHByb2R1Y3Rpb24sIAorLy8gYnV0IGhvdyB0byBkaXNhbGxvdyBjb25zdHJ1Y3RvcnMgYW5kIHN0YXRpYyBpbml0aWFsaXplcnMuLi4KK2VudW1Db25zdGFudEZpZWxkISAge1Rva2VuIGZpcnN0ID0gTFQoMSk7fQorICAgIDogICBtb2RzOm1vZGlmaWVyc09wdCEKKyAgICAgICAgKCAgIHRkOnR5cGVEZWZpbml0aW9uSW50ZXJuYWxbI21vZHNdCisgICAgICAgICAgICB7I2VudW1Db25zdGFudEZpZWxkID0gI3RkO30KKyAgICAgICAgfCAgIC8vIEEgZ2VuZXJpYyBtZXRob2QgaGFzIHRoZSB0eXBlUGFyYW1ldGVycyBiZWZvcmUgdGhlIHJldHVybiB0eXBlLgorICAgICAgICAgICAgLy8gVGhpcyBpcyBub3QgYWxsb3dlZCBmb3IgdmFyaWFibGUgZGVmaW5pdGlvbnMsIGJ1dCB0aGlzIHByb2R1Y3Rpb24KKyAgICAgICAgICAgIC8vIGFsbG93cyBpdCwgYSBzZW1hbnRpYyBjaGVjayBjb3VsZCBiZSB1c2VkIGlmIHlvdSB3YW50ZWQuCisgICAgICAgICAgICAodHA6dHlwZVBhcmFtZXRlcnMpPyB0OnR5cGVTcGVjW2ZhbHNlXSAgICAgICAgICAvLyBtZXRob2Qgb3IgdmFyaWFibGUgZGVjbGFyYXRpb24ocykKKyAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICAvLyBOZWVkIGEgc3ludGFjdGljIHByZWRpY2F0ZSwgc2luY2UgdmFyaWFibGVEZWZpbml0aW9ucworICAgICAgICAgICAgICAgIC8vIGNhbiBzdGFydCB3aXRoIGZvbygpIGFsc28uICBTaW5jZSBtZXRob2QgZGVmcyBhcmUgbm90IGxlZ2FsCisgICAgICAgICAgICAgICAgLy8gaW4gdGhpcyBjb250ZXh0LCB0aGVyZSdzIG5vIGhhcm0gZG9uZS4KKyAgICAgICAgICAgICAgICAoSURFTlQgTFBBUkVOKT0+CisKKyAgICAgICAgICAgICAgICBJREVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kCisKKyAgICAgICAgICAgICAgICAvLyBwYXJzZSB0aGUgZm9ybWFsIHBhcmFtZXRlciBkZWNsYXJhdGlvbnMuCisgICAgICAgICAgICAgICAgTFBBUkVOISBwYXJhbTpwYXJhbWV0ZXJEZWNsYXJhdGlvbkxpc3QgUlBBUkVOIQorCisgICAgICAgICAgICAgICAgLypPQlMqIHJ0OmRlY2xhcmF0b3JCcmFja2V0c1sjdF0gKk9CUyovCisKKyAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGxpc3Qgb2YgZXhjZXB0aW9ucyB0aGF0IHRoaXMgbWV0aG9kIGlzCisgICAgICAgICAgICAgICAgLy8gZGVjbGFyZWQgdG8gdGhyb3cKKyAgICAgICAgICAgICAgICAoKG5scyAidGhyb3dzIikgPT4gdGM6dGhyb3dzQ2xhdXNlKT8KKworICAgICAgICAgICAgICAgICggczI6Y29tcG91bmRTdGF0ZW1lbnQgKT8KKyAgICAgICAgICAgICAgICAvLyBUT0RPIC0gdmVyaWZ5IHRoYXQgJ3QnIGlzIHVzZWZ1bC9jb3JyZWN0IGhlcmUsIHVzZWQgdG8gYmUgJ3J0JworICAgICAgICAgICAgICAgIHsjZW51bUNvbnN0YW50RmllbGQgPSAjKGNyZWF0ZShNRVRIT0RfREVGLCJNRVRIT0RfREVGIixmaXJzdCxMVCgxKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjKGNyZWF0ZShUWVBFLCJUWVBFIixmaXJzdCxMVCgxKSksdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElERU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMyKTt9CisKKyAgICAgICAgICAgIHwgICB2OnZhcmlhYmxlRGVmaW5pdGlvbnNbI21vZHMsI3RdCisgICAgICAgICAgICAgICAgeyNlbnVtQ29uc3RhbnRGaWVsZCA9ICN2O30KKyAgICAgICAgICAgICkKKyAgICAgICAgKQorCisgICAgICAgIC8vICJ7IC4uLiB9IiBpbnN0YW5jZSBpbml0aWFsaXplcgorICAgIHwgICBzNDpjb21wb3VuZFN0YXRlbWVudAorICAgICAgICB7I2VudW1Db25zdGFudEZpZWxkID0gIyhjcmVhdGUoSU5TVEFOQ0VfSU5JVCwiSU5TVEFOQ0VfSU5JVCIsZmlyc3QsTFQoMSkpLCBzNCk7fQorICAgIDsKKworLy8gQW4gaW50ZXJmYWNlIGNhbiBleHRlbmQgc2V2ZXJhbCBvdGhlciBpbnRlcmZhY2VzLi4uCitpbnRlcmZhY2VFeHRlbmRzICB7VG9rZW4gZmlyc3QgPSBMVCgxKTt9CisgICAgOiAgICgKKyAgICAgICAgICAgIGU6ImV4dGVuZHMiISBubHMhCisgICAgICAgICAgICBjbGFzc09ySW50ZXJmYWNlVHlwZVt0cnVlXSAoIENPTU1BISBubHMhIGNsYXNzT3JJbnRlcmZhY2VUeXBlW3RydWVdICkqIG5scyEKKyAgICAgICAgKT8KKyAgICAgICAgeyNpbnRlcmZhY2VFeHRlbmRzID0gIyhjcmVhdGUoRVhURU5EU19DTEFVU0UsIkVYVEVORFNfQ0xBVVNFIixmaXJzdCxMVCgxKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2ludGVyZmFjZUV4dGVuZHMpO30KKyAgICA7CisKKy8vIEEgY2xhc3MgY2FuIGltcGxlbWVudCBzZXZlcmFsIGludGVyZmFjZXMuLi4KK2ltcGxlbWVudHNDbGF1c2UgIHtUb2tlbiBmaXJzdCA9IExUKDEpO30KKyAgICA6ICAgKAorICAgICAgICAgICAgaToiaW1wbGVtZW50cyIhIG5scyEKKyAgICAgICAgICAgIGNsYXNzT3JJbnRlcmZhY2VUeXBlW3RydWVdICggQ09NTUEhIG5scyEgY2xhc3NPckludGVyZmFjZVR5cGVbdHJ1ZV0gKSogbmxzIQorICAgICAgICApPworICAgICAgICB7I2ltcGxlbWVudHNDbGF1c2UgPSAjKGNyZWF0ZShJTVBMRU1FTlRTX0NMQVVTRSwiSU1QTEVNRU5UU19DTEFVU0UiLGZpcnN0LExUKDEpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjaW1wbGVtZW50c0NsYXVzZSk7fQorICAgIDsKKworLy8gTm93IHRoZSB2YXJpb3VzIHRoaW5ncyB0aGF0IGNhbiBiZSBkZWZpbmVkIGluc2lkZSBhIGNsYXNzCitjbGFzc0ZpZWxkISAge1Rva2VuIGZpcnN0ID0gTFQoMSk7fQorICAgIDogICAvLyBtZXRob2QsIGNvbnN0cnVjdG9yLCBvciB2YXJpYWJsZSBkZWNsYXJhdGlvbgorICAgICAgICAoY29uc3RydWN0b3JTdGFydCk9PgorICAgICAgICBtYzptb2RpZmllcnNPcHQhIGN0b3I6Y29uc3RydWN0b3JEZWZpbml0aW9uWyNtY10KKyAgICAgICAgeyNjbGFzc0ZpZWxkID0gI2N0b3I7fQorICAgIHwKKyAgICAgICAgKGdlbmVyaWNNZXRob2RTdGFydCk9PgorICAgICAgICBkZzpnZW5lcmljTWV0aG9kCisgICAgICAgIHsjY2xhc3NGaWVsZCA9ICNkZzt9CisgICAgfAorICAgICAgICAoZGVjbGFyYXRpb25TdGFydCk9PgorICAgICAgICBkZDpkZWNsYXJhdGlvbgorICAgICAgICB7I2NsYXNzRmllbGQgPSAjZGQ7fQorICAgICAgICAKKyAgICB8CisgICAgICAgIC8vVE9ETyAtIHVuaWZ5IHR5cGVEZWNsYXJhdGlvbiBhbmQgdHlwZURlZmluaXRpb25JbnRlcm5hbCBuYW1lcworICAgICAgICAvLyB0eXBlIGRlY2xhcmF0aW9uCisgICAgICAgICh0eXBlRGVjbGFyYXRpb25TdGFydCk9PgorICAgICAgICBtb2RzOm1vZGlmaWVyc09wdCEKKyAgICAgICAgKCAgIHRkOnR5cGVEZWZpbml0aW9uSW50ZXJuYWxbI21vZHNdCisgICAgICAgICAgICAgICAgeyNjbGFzc0ZpZWxkID0gI3RkO30KKyAgICAgICAgKQorCisgICAgLy8gInN0YXRpYyB7IC4uLiB9IiBjbGFzcyBpbml0aWFsaXplcgorICAgIHwgICAic3RhdGljIiBubHMhIHMzOmNvbXBvdW5kU3RhdGVtZW50CisgICAgICAgIHsjY2xhc3NGaWVsZCA9ICMoY3JlYXRlKFNUQVRJQ19JTklULCJTVEFUSUNfSU5JVCIsZmlyc3QsTFQoMSkpLCBzMyk7fQorCisgICAgLy8gInsgLi4uIH0iIGluc3RhbmNlIGluaXRpYWxpemVyCisgICAgfCAgIHM0OmNvbXBvdW5kU3RhdGVtZW50CisgICAgICAgIHsjY2xhc3NGaWVsZCA9ICMoY3JlYXRlKElOU1RBTkNFX0lOSVQsIklOU1RBTkNFX0lOSVQiLGZpcnN0LExUKDEpKSwgczQpO30KKyAgICA7CisKKy8vIE5vdyB0aGUgdmFyaW91cyB0aGluZ3MgdGhhdCBjYW4gYmUgZGVmaW5lZCBpbnNpZGUgYSBpbnRlcmZhY2UKK2ludGVyZmFjZUZpZWxkIQorICAgIDogICAvLyBtZXRob2QsIGNvbnN0cnVjdG9yLCBvciB2YXJpYWJsZSBkZWNsYXJhdGlvbgorICAgICAgICAoZGVjbGFyYXRpb25TdGFydCk9PgorICAgICAgICBkOmRlY2xhcmF0aW9uCisgICAgICAgIHsjaW50ZXJmYWNlRmllbGQgPSAjZDt9CisgICAgfAorICAgICAgICAvL1RPRE8gLSB1bmlmeSB0eXBlRGVjbGFyYXRpb24gYW5kIHR5cGVEZWZpbml0aW9uSW50ZXJuYWwgbmFtZXMKKyAgICAgICAgLy8gdHlwZSBkZWNsYXJhdGlvbgorICAgICAgICAodHlwZURlY2xhcmF0aW9uU3RhcnQpPT4KKyAgICAgICAgbW9kczptb2RpZmllcnNPcHQKKworICAgICAgICAoICAgdGQ6dHlwZURlZmluaXRpb25JbnRlcm5hbFsjbW9kc10KKyAgICAgICAgICAgIHsjaW50ZXJmYWNlRmllbGQgPSAjdGQ7fQorICAgICAgICApCisgICAgOworCitjb25zdHJ1Y3RvckJvZHkKKyAgICA6ICAgbGM6TENVUkxZXiBubHMhICAgICAgICAgeyNsYy5zZXRUeXBlKFNMSVNUKTt9CisgICAgICAgICggICAoZXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24pID0+ICAgLy8gSmF2YSBjb21wYXRpYmlsaXR5IGhhY2sKKyAgICAgICAgICAgICAgICBleHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbiAoc2VwISBibG9ja0JvZHlbc2VwVG9rZW5dKT8KKyAgICAgICAgICAgIHwgICBibG9ja0JvZHlbRU9GXQorICAgICAgICApCisgICAgICAgIFJDVVJMWSEKKzsKKworCisvKiogQ2F0Y2ggb2J2aW91cyBjb25zdHJ1Y3RvciBjYWxscywgYnV0IG5vdCB0aGUgZXhwci5zdXBlciguLi4pIGNhbGxzICovCitleHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbgorICAgIDogICAodHlwZUFyZ3VtZW50cyk/CisgICAgICAgICggICAidGhpcyIhIGxwMTpMUEFSRU5eIGFyZ0xpc3QgUlBBUkVOIQorICAgICAgICAgICAgeyNscDEuc2V0VHlwZShDVE9SX0NBTEwpO30KKyAgICAgICAgfCAgICJzdXBlciIhIGxwMjpMUEFSRU5eIGFyZ0xpc3QgUlBBUkVOIQorICAgICAgICAgICAgeyNscDIuc2V0VHlwZShTVVBFUl9DVE9SX0NBTEwpO30KKyAgICAgICAgKQorICAgIDsKKworLyoqIFRoZSB0YWlsIG9mIGEgZGVjbGFyYXRpb24uCisgICogRWl0aGVyIHYxLCB2MiwgLi4uICh3aXRoIHBvc3NpYmxlIGluaXRpYWxpemVycykgb3IgZWxzZSBtKGFyZ3Mpe2JvZHl9LgorICAqIFRoZSB0d28gYXJndW1lbnRzIGFyZSB0aGUgbW9kaWZpZXIgbGlzdCAoaWYgYW55KSBhbmQgdGhlIGRlY2xhcmF0aW9uIGhlYWQgKGlmIGFueSkuCisgICogVGhlIGRlY2xhcmF0aW9uIGhlYWQgaXMgdGhlIHZhcmlhYmxlIHR5cGUsIG9yIChmb3IgYSBtZXRob2QpIHRoZSByZXR1cm4gdHlwZS4KKyAgKiBJZiBpdCBpcyBtaXNzaW5nLCB0aGVuIHRoZSB2YXJpYWJsZSB0eXBlIGlzIHRha2VuIGZyb20gaXRzIGluaXRpYWxpemVyIChpZiB0aGVyZSBpcyBvbmUpLgorICAqIE90aGVyd2lzZSwgdGhlIHZhcmlhYmxlIHR5cGUgZGVmYXVsdHMgdG8gJ2FueScuCisgICogREVDSURFOiAgTWV0aG9kIHJldHVybiB0eXBlcyBkZWZhdWx0IHRvIHRoZSB0eXBlIG9mIHRoZSBtZXRob2QgYm9keSwgYXMgYW4gZXhwcmVzc2lvbi4KKyAgKi8KK3ZhcmlhYmxlRGVmaW5pdGlvbnNbQVNUIG1vZHMsIEFTVCB0XSAge1Rva2VuIGZpcnN0ID0gTFQoMSk7fQorICAgIDogICB2YXJpYWJsZURlY2xhcmF0b3JbZ2V0QVNURmFjdG9yeSgpLmR1cFRyZWUobW9kcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRBU1RGYWN0b3J5KCkuZHVwVHJlZSh0KV0KKyAgICAgICAgKCAgIENPTU1BISBubHMhCisgICAgICAgICAgICB2YXJpYWJsZURlY2xhcmF0b3JbZ2V0QVNURmFjdG9yeSgpLmR1cFRyZWUobW9kcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QVNURmFjdG9yeSgpLmR1cFRyZWUodCldCisgICAgICAgICkqCisgICAgfAorICAgICAgICAvLyBUaGUgcGFyc2VyIGFsbG93cyBhIG1ldGhvZCBkZWZpbml0aW9uIGFueXdoZXJlIGEgdmFyaWFibGUgZGVmaW5pdGlvbiBpcyBhY2NlcHRlZC4KKworICAgICAgICAoICAgaWQ6SURFTlQKKyAgICAgICAgfCAgIHFpZDpTVFJJTkdfTElURVJBTCAgICAgICAgICB7I3FpZC5zZXRUeXBlKElERU5UKTt9ICAvLyB1c2UgZm9yIG9wZXJhdG9yIGRlZmludGlvbnMsIGV0Yy4KKyAgICAgICAgKQorCisgICAgICAgIC8vIHBhcnNlIHRoZSBmb3JtYWwgcGFyYW1ldGVyIGRlY2xhcmF0aW9ucy4KKyAgICAgICAgTFBBUkVOISBwYXJhbTpwYXJhbWV0ZXJEZWNsYXJhdGlvbkxpc3QhIFJQQVJFTiEKKworICAgICAgICAvKk9CUypydDpkZWNsYXJhdG9yQnJhY2tldHNbI3RdKi8KKworICAgICAgICAvLyBnZXQgdGhlIGxpc3Qgb2YgZXhjZXB0aW9ucyB0aGF0IHRoaXMgbWV0aG9kIGlzCisgICAgICAgIC8vIGRlY2xhcmVkIHRvIHRocm93CisgICAgICAgICgobmxzICJ0aHJvd3MiKSA9PiAgdGM6dGhyb3dzQ2xhdXNlISAgKT8gCisKKyAgICAgICAgLy8gdGhlIG1ldGhvZCBib2R5IGlzIGFuIG9wZW4gYmxvY2sKKyAgICAgICAgLy8gYnV0LCBpdCBtYXkgaGF2ZSBhbiBvcHRpb25hbCBjb25zdHJ1Y3RvciBjYWxsIChmb3IgY29uc3RydWN0b3JzIG9ubHkpCisgICAgICAgIC8vIHRoaXMgY29uc3RydWN0b3IgY2xhdXNlIGlzIG9ubHkgdXNlZCBmb3IgY29uc3RydWN0b3JzIHVzaW5nICdkZWYnCisgICAgICAgIC8vIHdoaWNoIGxvb2sgbGlrZSBtZXRob2QgZGVjbGFyYXRpb25zCisgICAgICAgIC8vIHNpbmNlIHRoZSBibG9jayBpcyBvcHRpb25hbCBhbmQgbmxzIGlzIHBhcnQgb2Ygc2VwIHdlIGhhdmUgdG8gYmUgc3VyZQorICAgICAgICAvLyBhIG5ld2xpbmUgaXMgZm9sbG93ZWQgYnkgYSBibG9jayBvciBpZ25vcmUgdGhlIG5scyB0b28KKyAgICAgICAgKChubHMhIExDVVJMWSkgPT4gIChubHNXYXJuISBtYjpvcGVuQmxvY2shKSk/CisKKyAgICAgICAgeyAgIGlmICgjcWlkICE9IG51bGwpICAjaWQgPSAjcWlkOworICAgICAgICAgICAgI3ZhcmlhYmxlRGVmaW5pdGlvbnMgPQorICAgICAgICAgICAgICAgICAgICAjKGNyZWF0ZShNRVRIT0RfREVGLCJNRVRIT0RfREVGIixmaXJzdCxMVCgxKSksCisgICAgICAgICAgICAgICAgICAgICAgbW9kcywgIyhjcmVhdGUoVFlQRSwiVFlQRSIsZmlyc3QsTFQoMSkpLHQpLCBpZCwgcGFyYW0sIHRjLCBtYik7CisgICAgICAgIH0KKyAgICA7CisKKy8qKiBJJ3ZlIHNwbGl0IG91dCBjb25zdHJ1Y3RvcnMgc2VwYXJhdGVseTsgd2UgY291bGQgbWF5YmUgaW50ZWdyYXRlIGJhY2sgaW50byB2YXJpYWJsZURlZmluaXRpb25zIAorICogIGxhdGVyIG9uIGlmIHdlIG1heWJlIHNpbXBsaWZpZWQgJ2RlZicgdG8gYmUgYSB0eXBlIGRlY2xhcmF0aW9uPworICovCitjb25zdHJ1Y3RvckRlZmluaXRpb25bQVNUIG1vZHNdICB7VG9rZW4gZmlyc3QgPSBMVCgxKTt9CisgICAgOgorICAgICAgICBpZDpJREVOVAorCisgICAgICAgIC8vIHBhcnNlIHRoZSBmb3JtYWwgcGFyYW1ldGVyIGRlY2xhcmF0aW9ucy4KKyAgICAgICAgTFBBUkVOISBwYXJhbTpwYXJhbWV0ZXJEZWNsYXJhdGlvbkxpc3QhIFJQQVJFTiEKKworICAgICAgICAvKk9CUypydDpkZWNsYXJhdG9yQnJhY2tldHNbI3RdKi8KKworICAgICAgICAvLyBnZXQgdGhlIGxpc3Qgb2YgZXhjZXB0aW9ucyB0aGF0IHRoaXMgbWV0aG9kIGlzCisgICAgICAgIC8vIGRlY2xhcmVkIHRvIHRocm93CisgICAgICAgICgobmxzICJ0aHJvd3MiKSA9PiB0Yzp0aHJvd3NDbGF1c2UhICApPyBubHNXYXJuIQorICAgICAgICAvLyB0aGUgbWV0aG9kIGJvZHkgaXMgYW4gb3BlbiBibG9jaworICAgICAgICAvLyBidXQsIGl0IG1heSBoYXZlIGFuIG9wdGlvbmFsIGNvbnN0cnVjdG9yIGNhbGwgKGZvciBjb25zdHJ1Y3RvcnMgb25seSkKKworICAgICAgICAvLyBUT0RPIGFzc2VydCB0aGF0IHRoZSBpZCBtYXRjaGVzIHRoZSBjbGFzcworICAgICAgICB7IGlzQ29uc3RydWN0b3JJZGVudChpZCk7IH0KKworICAgICAgICBjYjpjb25zdHJ1Y3RvckJvZHkhCisgICAgICAgIHsgICAjY29uc3RydWN0b3JEZWZpbml0aW9uID0gICMoY3JlYXRlKENUT1JfSURFTlQsIkNUT1JfSURFTlQiLGZpcnN0LExUKDEpKSwgIG1vZHMsIHBhcmFtLCB0YywgY2IpOworICAgICAgICB9CisgICAgIDsKKworLyoqIERlY2xhcmF0aW9uIG9mIGEgdmFyaWFibGUuIFRoaXMgY2FuIGJlIGEgY2xhc3MvaW5zdGFuY2UgdmFyaWFibGUsCisgKiAgb3IgYSBsb2NhbCB2YXJpYWJsZSBpbiBhIG1ldGhvZAorICogIEl0IGNhbiBhbHNvIGluY2x1ZGUgcG9zc2libGUgaW5pdGlhbGl6YXRpb24uCisgKi8KK3ZhcmlhYmxlRGVjbGFyYXRvciFbQVNUIG1vZHMsIEFTVCB0XSAge1Rva2VuIGZpcnN0ID0gTFQoMSk7fQorICAgIDoKKyAgICAgICAgaWQ6dmFyaWFibGVOYW1lCisgICAgICAgIC8qT0JTKmQ6ZGVjbGFyYXRvckJyYWNrZXRzW3RdKi8KKyAgICAgICAgKHY6dmFySW5pdGlhbGl6ZXIpPworICAgICAgICB7I3ZhcmlhYmxlRGVjbGFyYXRvciA9ICMoY3JlYXRlKFZBUklBQkxFX0RFRiwiVkFSSUFCTEVfREVGIixmaXJzdCxMVCgxKSksIG1vZHMsICMoY3JlYXRlKFRZUEUsIlRZUEUiLGZpcnN0LExUKDEpKSx0KSwgaWQsIHYpO30KKyAgICA7CisKKy8qKiBVc2VkIGluIGNhc2VzIHdoZXJlIGEgZGVjbGFyYXRpb24gY2Fubm90IGhhdmUgY29tbWFzLCBvciBlbmRzIHdpdGggdGhlICJpbiIgb3BlcmF0b3IgaW5zdGVhZCBvZiAnPScuICovCitzaW5nbGVWYXJpYWJsZSFbQVNUIG1vZHMsIEFTVCB0XSAge1Rva2VuIGZpcnN0ID0gTFQoMSk7fQorICAgIDoKKyAgICAgICAgaWQ6dmFyaWFibGVOYW1lCisgICAgICAgIHsjc2luZ2xlVmFyaWFibGUgPSAjKGNyZWF0ZShWQVJJQUJMRV9ERUYsIlZBUklBQkxFX0RFRiIsZmlyc3QsTFQoMSkpLCBtb2RzLCAjKGNyZWF0ZShUWVBFLCJUWVBFIixmaXJzdCxMVCgxKSksdCksIGlkKTt9CisgICAgOworCit2YXJpYWJsZU5hbWUKKyAgICA6ICAgSURFTlQKKyAgICA7CisKKy8qKiBBZnRlciBzb21lIHR5cGUgbmFtZXMsIHdoZXJlIHplcm8gb3IgbW9yZSBlbXB0eSBicmFja2V0IHBhaXJzIGFyZSBhbGxvd2VkLgorICogIFdlIHVzZSBBUlJBWV9ERUNMQVJBVE9SIHRvIHJlcHJlc2VudCB0aGlzLgorICogIFRPRE86ICBJcyB0aGVyZSBzb21lIG1vcmUgR3Jvb3Z5IHdheSB0byB2aWV3IHRoaXMgaW4gdGVybXMgb2YgdGhlIGluZGV4ZWQgcHJvcGVydHkgc3ludGF4PworICovCitkZWNsYXJhdG9yQnJhY2tldHNbQVNUIHR5cF0KKyAgICA6ICAgeyNkZWNsYXJhdG9yQnJhY2tldHM9dHlwO30KKyAgICAgICAgKAorICAgICAgICAgICAgLy8gQSBmb2xsb3dpbmcgbGlzdCBjb25zdHJ1Y3RvciBtaWdodCBjb25mbGljdCB3aXRoIGluZGV4IGJyYWNrZXRzOyBwcmVmZXIgdGhlIGRlY2xhcmF0b3IuCisgICAgICAgICAgICBvcHRpb25zIHtncmVlZHk9dHJ1ZTt9IDoKKyAgICAgICAgICAgIGxiOkxCUkFDS14geyNsYi5zZXRUeXBlKEFSUkFZX0RFQ0xBUkFUT1IpO30gUkJSQUNLIQorICAgICAgICApKgorICAgIDsKKworLyoqIEFuIGFzc2lnbm1lbnQgb3BlcmF0b3IgJz0nIGZvbGxvd2VkIGJ5IGFuIGV4cHJlc3Npb24uICAoTmV2ZXIgZW1wdHkuKSAqLwordmFySW5pdGlhbGl6ZXIKKyAgICA6ICAgQVNTSUdOXiBubHMhIGV4cHJlc3Npb25bTENfSU5JVF0KKyAgICAgICAgLy8gSW4ge1QgeCA9IHl9LCB0aGUgbGVmdC1jb250ZXh0IG9mIHkgaXMgdGhhdCBvZiBhbiBpbml0aWFsaXplci4KKyAgICA7CisKKy8qT0JTKgorLy8gVGhpcyBpcyBhbiBpbml0aWFsaXplciB1c2VkIHRvIHNldCB1cCBhbiBhcnJheS4KK2FycmF5SW5pdGlhbGl6ZXIKKyAgICA6ICAgbGM6TENVUkxZXiB7I2xjLnNldFR5cGUoQVJSQVlfSU5JVCk7fQorICAgICAgICAoICAgaW5pdGlhbGl6ZXIKKyAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICAvLyBDT05GTElDVDogZG9lcyBhIENPTU1BIGFmdGVyIGFuIGluaXRpYWxpemVyIHN0YXJ0IGEgbmV3CisgICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZXIgb3Igc3RhcnQgdGhlIG9wdGlvbiAnLCcgYXQgZW5kPworICAgICAgICAgICAgICAgIC8vIEFOVExSIGdlbmVyYXRlcyBwcm9wZXIgY29kZSBieSBtYXRjaGluZworICAgICAgICAgICAgICAgIC8vIHRoZSBjb21tYSBhcyBzb29uIGFzIHBvc3NpYmxlLgorICAgICAgICAgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgICAgICAgICAgICAgd2FybldoZW5Gb2xsb3dBbWJpZyA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIDoKKyAgICAgICAgICAgICAgICBDT01NQSEgaW5pdGlhbGl6ZXIKKyAgICAgICAgICAgICkqCisgICAgICAgICAgICAoQ09NTUEhKT8KKyAgICAgICAgKT8KKyAgICAgICAgUkNVUkxZIQorICAgIDsKKypPQlMqLworCisvKk9CUyogIC8vIFVzZSBbLi4uXSBmb3IgaW5pdGlhbGl6aW5nIGFsbCBzb3J0cyBvZiBzZXF1ZW5jZXMsIGluY2x1ZGluZyBhcnJheXMuCisvLyBUaGUgdHdvICJ0aGluZ3MiIHRoYXQgY2FuIGluaXRpYWxpemUgYW4gYXJyYXkgZWxlbWVudCBhcmUgYW4gZXhwcmVzc2lvbgorLy8gYW5kIGFub3RoZXIgKG5lc3RlZCkgYXJyYXkgaW5pdGlhbGl6ZXIuCitpbml0aWFsaXplcgorICAgIDogICBleHByZXNzaW9uCisgICAgfCAgIGFycmF5SW5pdGlhbGl6ZXIKKyAgICA7CisqT0JTKi8KKworLypPQlM/Pz8KKy8vIFRoaXMgaXMgdGhlIGhlYWRlciBvZiBhIG1ldGhvZC4gSXQgaW5jbHVkZXMgdGhlIG5hbWUgYW5kIHBhcmFtZXRlcnMKKy8vIGZvciB0aGUgbWV0aG9kLgorLy8gVGhpcyBhbHNvIHdhdGNoZXMgZm9yIGEgbGlzdCBvZiBleGNlcHRpb24gY2xhc3NlcyBpbiBhICJ0aHJvd3MiIGNsYXVzZS4KK2N0b3JIZWFkCisgICAgOiAgIElERU5UIC8vIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QKKworICAgICAgICAvLyBwYXJzZSB0aGUgZm9ybWFsIHBhcmFtZXRlciBkZWNsYXJhdGlvbnMuCisgICAgICAgIExQQVJFTiEgcGFyYW1ldGVyRGVjbGFyYXRpb25MaXN0IFJQQVJFTiEKKworICAgICAgICAvLyBnZXQgdGhlIGxpc3Qgb2YgZXhjZXB0aW9ucyB0aGF0IHRoaXMgbWV0aG9kIGlzIGRlY2xhcmVkIHRvIHRocm93CisgICAgICAgICh0aHJvd3NDbGF1c2UpPworICAgIDsKKypPQlMqLworCisvLyBUaGlzIGlzIGEgbGlzdCBvZiBleGNlcHRpb24gY2xhc3NlcyB0aGF0IHRoZSBtZXRob2QgaXMgZGVjbGFyZWQgdG8gdGhyb3cKK3Rocm93c0NsYXVzZQorICAgIDogICBubHMhICJ0aHJvd3MiXiBubHMhIGlkZW50aWZpZXIgKCBDT01NQSEgbmxzISBpZGVudGlmaWVyICkqIAorICAgIDsKKworLyoqIEEgbGlzdCBvZiB6ZXJvIG9yIG1vcmUgZm9ybWFsIHBhcmFtZXRlcnMuCisgKiAgSWYgYSBwYXJhbWV0ZXIgaXMgdmFyaWFibGUgbGVuZ3RoIChlLmcuIFN0cmluZy4uLiBteUFyZykgaXQgc2hvdWxkIGJlCisgKiAgdG8gdGhlIHJpZ2h0IG9mIGFueSBvdGhlciBwYXJhbWV0ZXJzIG9mIHRoZSBzYW1lIGtpbmQuCisgKiAgR2VuZXJhbCBmb3JtOiAgKHJlcSwgLi4uLCBvcHQsIC4uLiwgW3Jlc3RdLCBrZXksIC4uLiwgW3Jlc3RLZXlzXSwgW2Jsb2NrXQorICogIFRoaXMgbXVzdCBiZSBzb3J0ZWQgb3V0IGFmdGVyIHBhcnNpbmcsIHNpbmNlIHRoZSB2YXJpb3VzIGRlY2xhcmF0aW9uIGZvcm1zCisgKiAgYXJlIGltcG9zc2libGUgdG8gdGVsbCBhcGFydCB3aXRob3V0IGJhY2t0cmFja2luZy4KKyAqLworcGFyYW1ldGVyRGVjbGFyYXRpb25MaXN0ICB7VG9rZW4gZmlyc3QgPSBMVCgxKTt9CisgICAgOgorICAgICAgICAoCisgICAgICAgICAgICBwYXJhbWV0ZXJEZWNsYXJhdGlvbgorICAgICAgICAgICAgKCAgIENPTU1BISBubHMhCisgICAgICAgICAgICAgICAgcGFyYW1ldGVyRGVjbGFyYXRpb24KKyAgICAgICAgICAgICkqCisgICAgICAgICk/CisgICAgICAgIHsjcGFyYW1ldGVyRGVjbGFyYXRpb25MaXN0ID0gIyhjcmVhdGUoUEFSQU1FVEVSUywiUEFSQU1FVEVSUyIsZmlyc3QsTFQoMSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3BhcmFtZXRlckRlY2xhcmF0aW9uTGlzdCk7fQorICAgIDsKKworLyoqIEEgZm9ybWFsIHBhcmFtZXRlciBmb3IgYSBtZXRob2Qgb3IgY2xvc3VyZS4gKi8KK3BhcmFtZXRlckRlY2xhcmF0aW9uIQorICAgICAgICB7IFRva2VuIGZpcnN0ID0gTFQoMSk7Ym9vbGVhbiBzcHJlYWRQYXJhbSA9IGZhbHNlOyB9CisgICAgOgorICAgICAgICBwbTpwYXJhbWV0ZXJNb2RpZmllcnNPcHQKKyAgICAgICAgKCAgIG9wdGlvbnMge2dyZWVkeT10cnVlO30gOgorICAgICAgICAgICAgdDp0eXBlU3BlY1tmYWxzZV0KKyAgICAgICAgKT8KKworICAgICAgICAvLyBUT0RPOiAgV2hhdCBkbyBmb3JtYWwgcGFyYW1ldGVycyBmb3Iga2V5d29yZCBhcmd1bWVudHMgbG9vayBsaWtlPworCisgICAgICAgIC8vIEphdmEtc3R5bGUgdmFyIGFyZ3MKKyAgICAgICAgKCBUUklQTEVfRE9UISB7IHNwcmVhZFBhcmFtID0gdHJ1ZTsgfSApPworCisgICAgICAgIGlkOklERU5UCisKKyAgICAgICAgLy8gYWxsb3cgYW4gb3B0aW9uYWwgZGVmYXVsdCB2YWx1ZSBleHByZXNzaW9uCisgICAgICAgIChleHA6dmFySW5pdGlhbGl6ZXIpPworCisgICAgICAgIC8qT0JTKnBkOmRlY2xhcmF0b3JCcmFja2V0c1sjdF0qLworICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3ByZWFkUGFyYW0pIHsKKyAgICAgICAgICAgICAgICAjcGFyYW1ldGVyRGVjbGFyYXRpb24gPSAjKGNyZWF0ZShWQVJJQUJMRV9QQVJBTUVURVJfREVGLCJWQVJJQUJMRV9QQVJBTUVURVJfREVGIixmaXJzdCxMVCgxKSksCisgICAgICAgICAgICAgICAgICAgICAgcG0sICMoY3JlYXRlKFRZUEUsIlRZUEUiLGZpcnN0LExUKDEpKSx0KSwgaWQsIGV4cCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICNwYXJhbWV0ZXJEZWNsYXJhdGlvbiA9ICMoY3JlYXRlKFBBUkFNRVRFUl9ERUYsIlBBUkFNRVRFUl9ERUYiLGZpcnN0LExUKDEpKSwKKyAgICAgICAgICAgICAgICAgICAgICBwbSwgIyhjcmVhdGUoVFlQRSwiVFlQRSIsZmlyc3QsTFQoMSkpLHQpLCBpZCwgZXhwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIDsKKworLypPQlMqCit2YXJpYWJsZUxlbmd0aFBhcmFtZXRlckRlY2xhcmF0aW9uISAge1Rva2VuIGZpcnN0ID0gTFQoMSk7fQorICAgIDogICBwbTpwYXJhbWV0ZXJNb2RpZmllciB0OnR5cGVTcGVjW2ZhbHNlXSBUUklQTEVfRE9UISBpZDpJREVOVAorCisgICAgICAgIC8qT0JTKiBwZDpkZWNsYXJhdG9yQnJhY2tldHNbI3RdKiAvCisgICAgICAgIHsjdmFyaWFibGVMZW5ndGhQYXJhbWV0ZXJEZWNsYXJhdGlvbiA9ICMoY3JlYXRlKFZBUklBQkxFX1BBUkFNRVRFUl9ERUYsIlZBUklBQkxFX1BBUkFNRVRFUl9ERUYiLGZpcnN0LExUKDEpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG0sICMoY3JlYXRlKFRZUEUsIlRZUEUiLGZpcnN0LExUKDEpKSx0KSwgaWQpO30KKyAgICA7CisqT0JTKi8KKworcGFyYW1ldGVyTW9kaWZpZXJzT3B0CisgICAgICAgIHsgVG9rZW4gZmlyc3QgPSBMVCgxKTtpbnQgc2VlbkRlZiA9IDA7IH0KKyAgICAgICAgLy9maW5hbCBhbmQvb3IgZGVmIGNhbiBhcHBlYXIgYW1vbmdzdCBhbm5vdGF0aW9ucyBpbiBhbnkgb3JkZXIKKyAgICA6ICAgKCAgIHtzZWVuRGVmKysgPT0gMH0/ICAgICAgIC8vIGRvIG5vdCBhbGxvdyBtdWx0aXBsZSAiZGVmIiB0b2tlbnMKKyAgICAgICAgICAgICJkZWYiISAgbmxzISAgICAgICAgICAgIC8vIHJlZHVuZGFudCwgYnV0IGFsbG93ZWQgZm9yIHN5bW1ldHJ5CisgICAgICAgIHwgICAiZmluYWwiIG5scyEKKyAgICAgICAgfCAgIGFubm90YXRpb24gbmxzIQorICAgICAgICApKgorICAgICAgICB7I3BhcmFtZXRlck1vZGlmaWVyc09wdCA9ICMoY3JlYXRlKE1PRElGSUVSUywiTU9ESUZJRVJTIixmaXJzdCxMVCgxKSksICNwYXJhbWV0ZXJNb2RpZmllcnNPcHQpO30KKyAgICA7CisKKy8qKiBDbG9zdXJlIHBhcmFtZXRlcnMgYXJlIGV4YWN0bHkgbGlrZSBtZXRob2QgcGFyYW1ldGVycywKKyAqICBleGNlcHQgdGhhdCB0aGV5IGFyZSBub3QgZW5jbG9zZWQgaW4gcGFyZW50aGVzZXMsIGJ1dCByYXRoZXIKKyAqICBhcmUgcHJlcGVuZGVkIHRvIHRoZSBmcm9udCBvZiBhIGJsb2NrLCBqdXN0IGFmdGVyIHRoZSBicmFjZS4KKyAqICBUaGV5IGFyZSBzZXBhcmF0ZWQgZnJvbSB0aGUgY2xvc3VyZSBib2R5IGJ5IGEgQ0xPU0FCTEVfQkxPQ0tfT1AgdG9rZW4gJy0+Jy4KKyAqLworLy8gV2l0aCAnfCcgdGhlcmUgd291bGQgYmUgcmVzdHJpY3Rpb25zIG9uIGJpdHdpc2Utb3IgZXhwcmVzc2lvbnMuCitjbG9zYWJsZUJsb2NrUGFyYW1zT3B0W2Jvb2xlYW4gYWRkSW1wbGljaXRdCisgICAgOiAgIChwYXJhbWV0ZXJEZWNsYXJhdGlvbkxpc3QgbmxzIENMT1NBQkxFX0JMT0NLX09QKT0+CisgICAgICAgIHBhcmFtZXRlckRlY2xhcmF0aW9uTGlzdCBubHMhIENMT1NBQkxFX0JMT0NLX09QISBubHMhCisgICAgfCAgIHthZGRJbXBsaWNpdH0/CisgICAgICAgIGltcGxpY2l0UGFyYW1ldGVycworICAgIHwKKyAgICAgICAgLyogZWxzZSBkbyBub3QgcGFyc2UgYW55IHBhcmFtZXRlcnMgYXQgYWxsICovCisgICAgOworCisvKiogTG9va2FoZWFkIHRvIGNoZWNrIHdoZXRoZXIgYSBibG9jayBiZWdpbnMgd2l0aCBleHBsaWNpdCBjbG9zdXJlIGFyZ3VtZW50cy4gKi8KK2Nsb3NhYmxlQmxvY2tQYXJhbXNTdGFydCEKKyAgICA6CisgICAgICAgIHBhcmFtZXRlckRlY2xhcmF0aW9uTGlzdCBubHMgQ0xPU0FCTEVfQkxPQ0tfT1AKKyAgICA7CisKKy8qKiBTaW1wbGUgbmFtZXMsIGFzIGluIHt4fC4uLn0sIGFyZSBjb21wbGV0ZWx5IGVxdWl2YWxlbnQgdG8geyhkZWYgeCl8Li4ufS4gIEJ1aWxkIHRoZSByaWdodCBBU1QuICovCitjbG9zYWJsZUJsb2NrUGFyYW0hICB7VG9rZW4gZmlyc3QgPSBMVCgxKTt9CisgICAgOiAgIGlkOklERU5UIQorICAgICAgICB7I2Nsb3NhYmxlQmxvY2tQYXJhbSA9ICMoY3JlYXRlKFBBUkFNRVRFUl9ERUYsIlBBUkFNRVRFUl9ERUYiLGZpcnN0LExUKDEpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjKGNyZWF0ZShNT0RJRklFUlMsIk1PRElGSUVSUyIsZmlyc3QsTFQoMSkpKSwgIyhjcmVhdGUoVFlQRSwiVFlQRSIsZmlyc3QsTFQoMSkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCk7fQorICAgIDsKKworLy8gQ29tcG91bmQgc3RhdGVtZW50LiBUaGlzIGlzIHVzZWQgaW4gbWFueSBjb250ZXh0czoKKy8vIEluc2lkZSBhIGNsYXNzIGRlZmluaXRpb24gcHJlZml4ZWQgd2l0aCAic3RhdGljIjoKKy8vIGl0IGlzIGEgY2xhc3MgaW5pdGlhbGl6ZXIKKy8vIEluc2lkZSBhIGNsYXNzIGRlZmluaXRpb24gd2l0aG91dCAic3RhdGljIjoKKy8vIGl0IGlzIGFuIGluc3RhbmNlIGluaXRpYWxpemVyCisvLyBBcyB0aGUgYm9keSBvZiBhIG1ldGhvZAorLy8gQXMgYSBjb21wbGV0ZWx5IGluZGVwZGVudCBicmFjZWQgYmxvY2sgb2YgY29kZSBpbnNpZGUgYSBtZXRob2QKKy8vIGl0IHN0YXJ0cyBhIG5ldyBzY29wZSBmb3IgdmFyaWFibGUgZGVmaW5pdGlvbnMKKy8vIEluIEdyb292eSwgdGhpcyBpcyBjYWxsZWQgYW4gIm9wZW4gYmxvY2siLiAgSXQgY2Fubm90IGhhdmUgY2xvc3VyZSBhcmd1bWVudHMuCisKK2NvbXBvdW5kU3RhdGVtZW50CisgICAgOiAgIG9wZW5CbG9jaworICAgIDsKKworLyoqIEFuIG9wZW4gYmxvY2sgaXMgbm90IGFsbG93ZWQgdG8gaGF2ZSBjbG9zdXJlIGFyZ3VtZW50cy4gKi8KK29wZW5CbG9jaworICAgIDogICBsYzpMQ1VSTFleIG5scyEgICAgIHsjbGMuc2V0VHlwZShTTElTVCk7fQorICAgICAgICAvLyBBU1QgdHlwZSBvZiBTTElTVCBtZWFucyAibmV2ZXIgZ29ubmEgYmUgYSBjbG9zdXJlIgorICAgICAgICBibG9ja0JvZHlbRU9GXQorICAgICAgICBSQ1VSTFkhCisgICAgOworCisvKiogQSBibG9jayBib2R5IGlzIGEgcGFyYWRlIG9mIHplcm8gb3IgbW9yZSBzdGF0ZW1lbnRzIG9yIGV4cHJlc3Npb25zLiAqLworYmxvY2tCb2R5W2ludCBwcmV2VG9rZW5dCisgICAgOiAgIAorICAgICAgICAoc3RhdGVtZW50W3ByZXZUb2tlbl0pPyAoc2VwISAoc3RhdGVtZW50W3NlcFRva2VuXSk/KSoKKyAgICA7CisKKy8qKiBBIGJsb2NrIHdoaWNoIGlzIGtub3duIHRvIGJlIGEgY2xvc3VyZSwgZXZlbiBpZiBpdCBoYXMgbm8gYXBwYXJlbnQgYXJndW1lbnRzLgorICogIEEgYmxvY2sgaW5zaWRlIGFuIGV4cHJlc3Npb24gb3IgYWZ0ZXIgYSBtZXRob2QgY2FsbCBpcyBhbHdheXMgYXNzdW1lZCB0byBiZSBhIGNsb3N1cmUuCisgKiAgT25seSBsYWJlbGVkLCB1bnBhcmFtZXRlcml6ZWQgYmxvY2tzIHdoaWNoIG9jY3VyIGRpcmVjdGx5IGFzIHN1YnN0YXRlbWVudHMgYXJlIGtlcHQgb3Blbi4KKyAqLworY2xvc2FibGVCbG9jaworICAgIDogICBsYzpMQ1VSTFleIG5scyEgICAgIHsjbGMuc2V0VHlwZShDTE9TQUJMRV9CTE9DSyk7fQorICAgICAgICBjbG9zYWJsZUJsb2NrUGFyYW1zT3B0W3RydWVdCisgICAgICAgIGJsb2NrQm9keVtFT0ZdCisgICAgICAgIFJDVVJMWSEKKyAgICA7CisKKy8qKiBBIGJsb2NrIGtub3duIHRvIGJlIGEgY2xvc3VyZSwgYnV0IHdoaWNoIG9taXRzIGl0cyBhcmd1bWVudHMsIGlzIGdpdmVuIHRoaXMgcGxhY2Vob2xkZXIuCisgKiAgQSBzdWJzZXF1ZW50IHBhc3MgaXMgcmVzcG9uc2libGUgZm9yIGRlY2lkaW5nIGlmIHRoZXJlIGlzIGFuIGltcGxpY2l0ICdpdCcgcGFyYW1ldGVyLAorICogIG9yIGlmIHRoZSBwYXJhbWV0ZXIgbGlzdCBzaG91bGQgYmUgZW1wdHkuCisgKi8KK2ltcGxpY2l0UGFyYW1ldGVycyAge1Rva2VuIGZpcnN0ID0gTFQoMSk7fQorICAgIDogICB7ICAgI2ltcGxpY2l0UGFyYW1ldGVycyA9ICMoY3JlYXRlKElNUExJQ0lUX1BBUkFNRVRFUlMsIklNUExJQ0lUX1BBUkFNRVRFUlMiLGZpcnN0LExUKDEpKSk7ICB9CisgICAgOworCisvKiogQSBzdWItYmxvY2sgb2YgYSBibG9jayBjYW4gYmUgZWl0aGVyIG9wZW4gb3IgY2xvc2FibGUuCisgKiAgSXQgaXMgY2xvc2FibGUgaWYgYW5kIG9ubHkgaWYgdGhlcmUgYXJlIGV4cGxpY2l0IGNsb3N1cmUgYXJndW1lbnRzLgorICogIENvbXBhcmUgdGhpcyB0byBhIGJsb2NrIHdoaWNoIGlzIGFwcGVuZGVkIHRvIGEgbWV0aG9kIGNhbGwsCisgKiAgd2hpY2ggaXMgZ2l2ZW4gY2xvc3VyZSBhcmd1bWVudHMsIGV2ZW4gaWYgdGhleSBhcmUgbm90IGV4cGxpY2l0IGluIHRoZSBjb2RlLgorICovCitvcGVuT3JDbG9zYWJsZUJsb2NrCisgICAgOiAgIGxjOkxDVVJMWV4gbmxzIQorICAgICAgICBjcDpjbG9zYWJsZUJsb2NrUGFyYW1zT3B0W2ZhbHNlXQorICAgICAgICB7ICAgaWYgKCNjcCA9PSBudWxsKSAgICAjbGMuc2V0VHlwZShTTElTVCk7CisgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICNsYy5zZXRUeXBlKENMT1NBQkxFX0JMT0NLKTsKKyAgICAgICAgfQorICAgICAgICBibG9ja0JvZHlbRU9GXQorICAgICAgICBSQ1VSTFkhCisgICAgOworCisvKiogQSBzdGF0ZW1lbnQgaXMgYW4gZWxlbWVudCBvZiBhIGJsb2NrLgorICogIFR5cGljYWwgc3RhdGVtZW50cyBhcmUgZGVjbGFyYXRpb25zICh3aGljaCBhcmUgc2NvcGVkIHRvIHRoZSBibG9jaykKKyAqICBhbmQgZXhwcmVzc2lvbnMuCisgKi8KK3N0YXRlbWVudFtpbnQgcHJldlRva2VuXQorICAgIC8vIHByZXZUb2tlbiBpcyBOTFMgaWYgcHJldmlvdXMgc3RhdGVtZW50IGlzIHNlcGFyYXRlZCBvbmx5IGJ5IGEgbmV3bGluZQorCisgICAgOiAgIChnZW5lcmljTWV0aG9kU3RhcnQpPT4KKyAgICAgICAgZ2VuZXJpY01ldGhvZAorICAgICAgICAKKworICAgIC8vIGRlY2xhcmF0aW9ucyBhcmUgYW1iaWd1b3VzIHdpdGggIklEIERPVCIgcmVsYXRpdmUgdG8gZXhwcmVzc2lvbgorICAgIC8vIHN0YXRlbWVudHMuIE11c3QgYmFja3RyYWNrIHRvIGJlIHN1cmUuIENvdWxkIHVzZSBhIHNlbWFudGljCisgICAgLy8gcHJlZGljYXRlIHRvIHRlc3Qgc3ltYm9sIHRhYmxlIHRvIHNlZSB3aGF0IHRoZSB0eXBlIHdhcyBjb21pbmcKKyAgICAvLyB1cCwgYnV0IHRoYXQncyBwcmV0dHkgaGFyZCB3aXRob3V0IGEgc3ltYm9sIHRhYmxlIDspCisgICAgfCAgIChkZWNsYXJhdGlvblN0YXJ0KT0+CisgICAgICAgIGRlY2xhcmF0aW9uCisKKyAgICAvLyBBdHRhY2ggYSBsYWJlbCB0byB0aGUgZnJvbnQgb2YgYSBzdGF0ZW1lbnQKKyAgICAvLyBUaGlzIGJsb2NrIGlzIGV4ZWN1dGVkIGZvciBlZmZlY3QsIHVubGVzcyBpdCBoYXMgYW4gZXhwbGljaXQgY2xvc3VyZSBhcmd1bWVudC4KKyAgICB8CisgICAgICAgIChJREVOVCBDT0xPTik9PgorICAgICAgICBwZng6c3RhdGVtZW50TGFiZWxQcmVmaXghCisgICAgICAgIHsjc3RhdGVtZW50ID0gI3BmeDt9ICAvLyBuZXN0IGl0IGFsbCB1bmRlciB0aGUgbGFiZWwgcHJlZml4CisgICAgICAgICggICAoTENVUkxZKSA9PiBvcGVuT3JDbG9zYWJsZUJsb2NrCisgICAgICAgIHwgICBzdGF0ZW1lbnRbQ09MT05dCisgICAgICAgICkKKworICAgIC8vIEFuIGV4cHJlc3Npb24gc3RhdGVtZW50LiBUaGlzIGNvdWxkIGJlIGEgbWV0aG9kIGNhbGwsCisgICAgLy8gYXNzaWdubWVudCBzdGF0ZW1lbnQsIG9yIGFueSBvdGhlciBleHByZXNzaW9uIGV2YWx1YXRlZCBmb3IKKyAgICAvLyBzaWRlLWVmZmVjdHMuCisgICAgLy8gVGhlIHByZXZUb2tlbiBpcyB1c2VkIHRvIGNoZWNrIGZvciBkdW1iIGV4cHJlc3Npb25zIGxpa2UgKzEuCisgICAgfCAgICBleHByZXNzaW9uU3RhdGVtZW50W3ByZXZUb2tlbl0KKworICAgIC8vIGNsYXNzIGRlZmluaXRpb24KKyAgICB8ICAgIG06bW9kaWZpZXJzT3B0ISB0eXBlRGVmaW5pdGlvbkludGVybmFsWyNtXQorCisgICAgLy8gSWYtZWxzZSBzdGF0ZW1lbnQKKyAgICB8ICAgImlmIl4gTFBBUkVOISBhc3NpZ25tZW50TGVzc0V4cHJlc3Npb24gUlBBUkVOISBubHNXYXJuISBjb21wYXRpYmxlQm9keVN0YXRlbWVudAorICAgICAgICAoCisgICAgICAgICAgICAvLyBDT05GTElDVDogdGhlIG9sZCAiZGFuZ2xpbmctZWxzZSIgcHJvYmxlbS4uLgorICAgICAgICAgICAgLy8gICAgICAgICAgIEFOVExSIGdlbmVyYXRlcyBwcm9wZXIgY29kZSBtYXRjaGluZworICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgIGFzIHNvb24gYXMgcG9zc2libGUuICBIdXNoIHdhcm5pbmcuCisgICAgICAgICAgICBvcHRpb25zIHsKKyAgICAgICAgICAgICAgICAgICAgd2FybldoZW5Gb2xsb3dBbWJpZyA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICA6ICAgLy8gbG9va2FoZWFkIHRvIGNoZWNrIGlmIHdlJ3JlIGVudGVyaW5nIGFuICdlbHNlJyBjbGF1c2UKKyAgICAgICAgICAgICggKHNlcCEpPyAiZWxzZSIhICk9PgorICAgICAgICAgICAgKHNlcCEpPyAgLy8gYWxsb3cgU0VNSSBoZXJlIGZvciBjb21wYXRpYmlsaXR5IHdpdGggSmF2YQorICAgICAgICAgICAgImVsc2UiISBubHNXYXJuISBjb21wYXRpYmxlQm9keVN0YXRlbWVudAorICAgICAgICApPworCisgICAgLy8gRm9yIHN0YXRlbWVudAorICAgIHwgICBmb3JTdGF0ZW1lbnQKKworICAgIC8vIFdoaWxlIHN0YXRlbWVudAorICAgIHwgICAid2hpbGUiXiBMUEFSRU4hIHN0cmljdENvbnRleHRFeHByZXNzaW9uIFJQQVJFTiEgbmxzV2FybiEgY29tcGF0aWJsZUJvZHlTdGF0ZW1lbnQKKworICAgIC8qT0JTKiBubyBkby13aGlsZSBzdGF0ZW1lbnQgaW4gR3Jvb3Z5ICh0b28gYW1iaWd1b3VzKQorICAgIC8vIGRvLXdoaWxlIHN0YXRlbWVudAorICAgIHwgICAiZG8iXiBzdGF0ZW1lbnQgIndoaWxlIiEgTFBBUkVOISBzdHJpY3RDb250ZXh0RXhwcmVzc2lvbiBSUEFSRU4hIFNFTUkhCisgICAgKk9CUyovCisKKyAgICAvLyBJbXBvcnQgc3RhdGVtZW50LiAgQ2FuIGJlIHVzZWQgaW4gYW55IHNjb3BlLiAgSGFzICJpbXBvcnQgeCBhcyB5IiBhbHNvLgorICAgIHwgICBpbXBvcnRTdGF0ZW1lbnQKKworICAgIC8vIHN3aXRjaC9jYXNlIHN0YXRlbWVudAorICAgIHwgICAic3dpdGNoIl4gTFBBUkVOISBzdHJpY3RDb250ZXh0RXhwcmVzc2lvbiBSUEFSRU4hIG5sc1dhcm4hIExDVVJMWSEgbmxzIQorICAgICAgICAoIGNhc2VzR3JvdXAgKSoKKyAgICAgICAgUkNVUkxZIQorCisgICAgLy8gZXhjZXB0aW9uIHRyeS1jYXRjaCBibG9jaworICAgIHwgICB0cnlCbG9jaworCisgICAgLy8gc3luY2hyb25pemUgYSBzdGF0ZW1lbnQKKyAgICB8ICAgInN5bmNocm9uaXplZCJeIExQQVJFTiEgc3RyaWN0Q29udGV4dEV4cHJlc3Npb24gUlBBUkVOISBubHNXYXJuISBjb21wb3VuZFN0YXRlbWVudAorCisKKyAgICAvKk9CUyoKKyAgICAvLyBlbXB0eSBzdGF0ZW1lbnQKKyAgICB8ICAgczpTRU1JIHsjcy5zZXRUeXBlKEVNUFRZX1NUQVQpO30KKyAgICAqT0JTKi8KKworICAgIHwgICBicmFuY2hTdGF0ZW1lbnQKKyAgICA7CisKK2ZvclN0YXRlbWVudAorICAgIDogICBmOiJmb3IiXgorICAgICAgICBMUEFSRU4hCisgICAgICAgICggICAoU0VNSSB8KHN0cmljdENvbnRleHRFeHByZXNzaW9uIFNFTUkpKT0+Y2xvc3VyZUxpc3QKKyAgICAgICAgICAgIC8vICpPQlMqCisgICAgICAgICAgICAvLyBUaGVyZSdzIG5vIG5lZWQgYXQgYWxsIGZvciBzcXVlZXppbmcgaW4gdGhlIG5ldyBKYXZhIDUgImZvciIKKyAgICAgICAgICAgIC8vIHN5bnRheCwgc2luY2UgR3Jvb3Z5J3MgaXMgYSBzdWl0YWJsZSBhbHRlcm5hdGl2ZS4KKyAgICAgICAgICAgIC8vIHwgICAocGFyYW1ldGVyRGVjbGFyYXRpb24gQ09MT04pPT4gZm9yRWFjaENsYXVzZQorICAgICAgICAgICAgLy8gKk9CUyoKKyAgICAgICAgfCAgIC8vIHRoZSBjb2FzdCBpcyBjbGVhcjsgaXQncyBhIG1vZGVybiBHcm9vdnkgZm9yIHN0YXRlbWVudAorICAgICAgICAgICAgZm9ySW5DbGF1c2UKKyAgICAgICAgKQorICAgICAgICBSUEFSRU4hIG5scyEKKyAgICAgICAgY29tcGF0aWJsZUJvZHlTdGF0ZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhdGVtZW50IHRvIGxvb3Agb3ZlcgorICAgIDsKKworY2xvc3VyZUxpc3QKKwl7VG9rZW4gZmlyc3QgPSBMVCgxKTt9CisgICAgOgorICAgIAkKKyAgICAJc3RyaWN0Q29udGV4dEV4cHJlc3Npb24KKyAgICAJKAorICAgIAkJCVNFTUkhIHN0cmljdENvbnRleHRFeHByZXNzaW9uIAorICAgIAkgICB8CVNFTUkhIHthc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsYXN0RmFjdG9yeS5jcmVhdGUoRU1QVFlfU1RBVCwgIkVNUFRZX1NUQVQiKSk7fQorICAgIAkpKworCQl7I2Nsb3N1cmVMaXN0ID0gIyhjcmVhdGUoQ0xPU1VSRV9MSVNULCJDTE9TVVJFX0xJU1QiLGZpcnN0LExUKDEpKSwjY2xvc3VyZUxpc3QpO30KKyAgICA7CisKKy8qT0JTKgorZm9yRWFjaENsYXVzZSAge1Rva2VuIGZpcnN0ID0gTFQoMSk7fQorICAgIDoKKyAgICAgICAgcDpwYXJhbWV0ZXJEZWNsYXJhdGlvbiBDT0xPTiEgZXhwcmVzc2lvbgorICAgICAgICB7I2ZvckVhY2hDbGF1c2UgPSAjKGNyZWF0ZShGT1JfRUFDSF9DTEFVU0UsIkZPUl9FQUNIX0NMQVVTRSIsZmlyc3QsTFQoMSkpLCAjZm9yRWFjaENsYXVzZSk7fQorICAgIDsKKypPQlMqLworCitmb3JJbkNsYXVzZQorICAgIDogICAoICAgKGRlY2xhcmF0aW9uU3RhcnQpPT4KKyAgICAgICAgICAgIGRlY2w6c2luZ2xlRGVjbGFyYXRpb25Ob0luaXQKKyAgICAgICAgfCAgIElERU5UCisgICAgICAgICkKKyAgICAgICAgKAorICAgICAgICAgICAgaToiaW4iXiAgICAgICAgIHsjaS5zZXRUeXBlKEZPUl9JTl9JVEVSQUJMRSk7fQorICAgICAgICAgICAgc2hpZnRFeHByZXNzaW9uWzBdCisgICAgICAgIHwKKyAgICAgICAgICAgIHsgYWRkV2FybmluZygKKyAgICAgICAgICAgICAgIkEgY29sb24gYXQgdGhpcyBwb2ludCBpcyBsZWdhbCBKYXZhIGJ1dCBub3QgcmVjb21tZW5kZWQgaW4gR3Jvb3Z5LiIsCisgICAgICAgICAgICAgICJVc2UgdGhlICdpbicga2V5d29yZC4iCisgICAgICAgICAgICAgICk7CisgICAgICAgICAgICByZXF1aXJlKCNkZWNsICE9IG51bGwsCisgICAgICAgICAgICAgICAgIkphdmEtc3R5bGUgZm9yLWVhY2ggc3RhdGVtZW50IHJlcXVpcmVzIGEgdHlwZSBkZWNsYXJhdGlvbi4iCisgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICJVc2UgdGhlICdpbicga2V5d29yZCwgYXMgZm9yICh4IGluIHkpIHsuLi59IgorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjOkNPTE9OXiAgICAgICAgIHsjYy5zZXRUeXBlKEZPUl9JTl9JVEVSQUJMRSk7fQorICAgICAgICAgICAgZXhwcmVzc2lvblswXQorICAgICAgICApCisgICAgOworCisvKiogSW4gSmF2YSwgImlmIiwgIndoaWxlIiwgYW5kICJmb3IiIHN0YXRlbWVudHMgY2FuIHRha2UgcmFuZG9tLCBub24tYnJhY2VkIHN0YXRlbWVudHMgYXMgdGhlaXIgYm9kaWVzLgorICogIFN1cHBvcnQgdGhpcyBwcmFjdGljZSwgZXZlbiB0aG91Z2ggaXQgaXNuJ3QgdmVyeSBHcm9vdnkuCisgKi8KK2NvbXBhdGlibGVCb2R5U3RhdGVtZW50CisgICAgOiAgIChMQ1VSTFkpPT4KKyAgICAgICAgY29tcG91bmRTdGF0ZW1lbnQKKyAgICB8CisgICAgICAgIHN0YXRlbWVudFtFT0ZdCisgICAgOworCisvKiogSW4gR3Jvb3Z5LCByZXR1cm4sIGJyZWFrLCBjb250aW51ZSwgdGhyb3csIGFuZCBhc3NlcnQgY2FuIGJlIHVzZWQgaW4gYSBwYXJlbnRoZXNpemVkIGV4cHJlc3Npb24gY29udGV4dC4KKyAqICBFeGFtcGxlOiAgcHJpbnRsbiAoeCB8fCAocmV0dXJuKSk7ICBwcmludGxuIGFzc2VydCB4LCAid29uJ3QgcHJpbnQgYSBmYWxzZSB2YWx1ZSEiCisgKiAgSWYgYW4gb3B0aW9uYWwgZXhwcmVzc2lvbiBpcyBtaXNzaW5nLCBpdHMgdmFsdWUgaXMgdm9pZCAodGhpcyBjb2VyY2VzIHRvIG51bGwgd2hlbiBhIHZhbHVlIGlzIHJlcXVpcmVkKS4KKyAqLworYnJhbmNoU3RhdGVtZW50CisgICAgOgorICAgIC8vIFJldHVybiBhbiBleHByZXNzaW9uCisgICAgICAgICJyZXR1cm4iXgorICAgICAgICAoIGV4cHJlc3Npb25bMF0gKT8KKworICAgIC8vIGJyZWFrOiAgZ2V0IG91dCBvZiBhIGxvb3AsIG9yIHN3aXRjaCwgb3IgbWV0aG9kIGNhbGwKKyAgICAvLyBjb250aW51ZTogIGRvIG5leHQgaXRlcmF0aW9uIG9mIGEgbG9vcCwgb3IgbGVhdmUgYSBjbG9zdXJlCisgICAgfCAgICgiYnJlYWsiXiB8ICJjb250aW51ZSJeKQorICAgICAgICAoIElERU5UICk/CisKKyAgICAvLyB0aHJvdyBhbiBleGNlcHRpb24KKyAgICB8ICAgInRocm93Il4gZXhwcmVzc2lvblswXQorCisKKyAgICAvLyBUT0RPIC0gZGVjaWRlIG9uIGRlZmluaXRpdmUgJ2Fzc2VydCcgc3RhdGVtZW50IGluIGdyb292eSAoMS40IGFuZHxvciBncm9vdnkpCisgICAgLy8gYXNzZXJ0cworICAgIC8vIDEuNCsgLi4uCisgICAgLy8gICAgICB8ICAgImFzc2VydCJeIGV4cHJlc3Npb25bMF0gKCBDT0xPTiEgZXhwcmVzc2lvblswXSApPworCisgICAgLy8gZ3Jvb3Z5IGFzc2VydGlvbi4uLgorICAgIHwgICAiYXNzZXJ0Il4gYXNzaWdubWVudExlc3NFeHByZXNzaW9uCisgICAgICAgICggICBvcHRpb25zIHtncmVlZHk9dHJ1ZTt9IDoKKyAgICAgICAgICAgICggICBDT01NQSEgIC8vIFRPRE86ICBncmF0dWl0b3VzIGNoYW5nZSBjYXVzZWQgZmFpbHVyZXMKKyAgICAgICAgICAgIHwgICBDT0xPTiEgIC8vIHN0YW5kYXJkIEphdmEgc3ludGF4LCBidXQgbG9va3MgZnVubnkgaW4gR3Jvb3Z5CisgICAgICAgICAgICApCisgICAgICAgICAgICBleHByZXNzaW9uWzBdCisgICAgICAgICk/CisgICAgOworCisvKiogQSBsYWJlbGVkIHN0YXRlbWVudCwgY29uc2lzdGluZyBvZiBhIHZhbmlsbGEgaWRlbnRpZmllciBmb2xsb3dlZCBieSBhIGNvbG9uLiAqLworLy8gTm90ZTogIEFsd2F5cyB1c2UgdGhpcyBsb29rYWhlYWQsIHRvIGtlZXAgYW50bHIgZnJvbSBwYW5pY2tpbmc6IChJREVOVCBDT0xPTik9Pgorc3RhdGVtZW50TGFiZWxQcmVmaXgKKyAgICA6ICAgSURFTlQgYzpDT0xPTl4geyNjLnNldFR5cGUoTEFCRUxFRF9TVEFUKTt9IG5scyEKKyAgICA7CisKKy8qKiBBbiBleHByZXNzaW9uIHN0YXRlbWVudCBjYW4gYmUgYW55IGdlbmVyYWwgZXhwcmVzc2lvbi4KKyAqICA8cD4KKyAqICBBbiBleHByZXNzaW9uIHN0YXRlbWVudCBjYW4gYWxzbyBiZSBhIDxlbT5jb21tYW5kPC9lbT4sCisgKiAgd2hpY2ggaXMgYSBzaW1wbGUgbWV0aG9kIGNhbGwgaW4gd2hpY2ggdGhlIG91dGVybW9zdCBwYXJlbnRoZXNlcyBhcmUgb21pdHRlZC4KKyAqICA8cD4KKyAqICBDZXJ0YWluICJzdXNwaWNpb3VzIiBsb29raW5nIGZvcm1zIGFyZSBmbGFnZ2VkIGZvciB0aGUgdXNlciB0byBkaXNhbWJpZ3VhdGUuCisgKi8KKy8vIERFQ0lERTogQSBsYXRlciBzZW1hbnRpYyBwYXNzIGNhbiBmbGFnIGR1bWIgZXhwcmVzc2lvbnMgdGhhdCBkb24ndCBvY2N1ciBpbgorLy8gICAgICAgICBwb3NpdGlvbnMgd2hlcmUgdGhlaXIgdmFsdWUgaXMgbm90IHVzZWQsIGUuZy4sIDxjb2RlPnsxKzE7cHJpbnRsbn08L2NvZGU+CitleHByZXNzaW9uU3RhdGVtZW50W2ludCBwcmV2VG9rZW5dCisgICAgICAgIHtUb2tlbiBmaXJzdCA9IExUKDEpO2Jvb2xlYW4gaXNQYXRoRXhwciA9IGZhbHNlOyAgfQorICAgIDogCisgICAgICAgICggICAoc3VzcGljaW91c0V4cHJlc3Npb25TdGF0ZW1lbnRTdGFydCk9PgorICAgICAgICAgICAgY2hlY2tTdXNwaWNpb3VzRXhwcmVzc2lvblN0YXRlbWVudFtwcmV2VG9rZW5dCisgICAgICAgICk/CisgICAgICAgIC8vIENoZWNrcyBhcmUgbm93IG91dCBvZiB0aGUgd2F5OyBoZXJlJ3MgdGhlIHJlYWwgcnVsZToKKyAgICAgICAgaGVhZDpleHByZXNzaW9uW0xDX1NUTVRdCisgICAgICAgIHsgICBpc1BhdGhFeHByID0gKCNoZWFkID09IGxhc3RQYXRoRXhwcmVzc2lvbik7ICB9CisgICAgICAgICgKKyAgICAgICAgICAgIC8vIEEgcGF0aCBleHByZXNzaW9uIChlLmcuLCBTeXN0ZW0ub3V0LnByaW50KSBjYW4gdGFrZSBhcmd1bWVudHMuCisgICAgICAgICAgICB7aXNQYXRoRXhwcn0/CisgICAgICAgICAgICBjbWQ6Y29tbWFuZEFyZ3VtZW50c1sjaGVhZF0hCisgICAgICAgICAgICB7I2V4cHJlc3Npb25TdGF0ZW1lbnQgPSAjY21kO30KKyAgICAgICAgKT8KKyAgICAgICAgeyNleHByZXNzaW9uU3RhdGVtZW50ID0gIyhjcmVhdGUoRVhQUiwiRVhQUiIsZmlyc3QsTFQoMSkpLCNleHByZXNzaW9uU3RhdGVtZW50KTt9CisgICAgOworICAgICAgICAKKy8qKgorICogIElmIHR3byBzdGF0ZW1lbnRzIGFyZSBzZXBhcmF0ZWQgYnkgbmV3bGluZSAobm90IFNFTUkpLCB0aGUgc2Vjb25kIGhhZAorICogIGJldHRlciBub3QgbG9vayBsaWtlIHRoZSBsYXR0ZXIgaGFsZiBvZiBhbiBleHByZXNzaW9uLiAgSWYgaXQgZG9lcywgaXNzdWUgYSB3YXJuaW5nLgorICogIDxwPgorICogIEFsc28sIGlmIHRoZSBleHByZXNzaW9uIHN0YXJ0cyB3aXRoIGEgY2xvc3VyZSwgaXQgbmVlZHMgdG8KKyAqICBoYXZlIGFuIGV4cGxpY2l0IHBhcmFtZXRlciBsaXN0LCBpbiBvcmRlciB0byBhdm9pZCB0aGUgYXBwZWFyYW5jZSBvZiBhCisgKiAgY29tcG91bmQgc3RhdGVtZW50LiAgVGhpcyBpcyBhIGhhcmQgZXJyb3IuCisgKiAgPHA+CisgKiAgVGhlc2UgcnVsZXMgYXJlIGRpZmZlcmVudCBmcm9tIEphdmEncyAiZHVtYiBleHByZXNzaW9uIiByZXN0cmljdGlvbi4KKyAqICBVbmxpa2UgSmF2YSwgR3Jvb3Z5IGJsb2NrcyBjYW4gZW5kIHdpdGggYXJiaXRyYXJ5IChldmVuIGR1bWIpIGV4cHJlc3Npb25zLAorICogIGFzIGEgY29uc2VxdWVuY2Ugb2Ygb3B0aW9uYWwgJ3JldHVybicgYW5kICdjb250aW51ZScgdG9rZW5zLgorICogPHA+CisgKiAgVG8gbWFrZSB0aGUgcHJvZ3JhbW1lcidzIGludGVudGlvbiBjbGVhciwgYSBsZWFkaW5nIGNsb3N1cmUgbXVzdCBoYXZlIGFuCisgKiAgZXhwbGljaXQgcGFyYW1ldGVyIGxpc3QsIGFuZCBtdXN0IG5vdCBmb2xsb3cgYSBwcmV2aW91cyBzdGF0ZW1lbnQgc2VwYXJhdGVkCisgKiAgb25seSBieSBuZXdsaW5lcy4KKyAqLworY2hlY2tTdXNwaWNpb3VzRXhwcmVzc2lvblN0YXRlbWVudFtpbnQgcHJldlRva2VuXQorICAgIDoKKyAgICAgICAgKH5MQ1VSTFkgfCBMQ1VSTFkgY2xvc2FibGVCbG9ja1BhcmFtc1N0YXJ0KT0+ICAvL0ZJWE1FIHRvbyBtdWNoIGxvb2thaGVhZAorICAgICAgICAvLyBFaXRoZXIgbm90IGEgYmxvY2ssIG9yIGEgYmxvY2sgd2l0aCBhbiBleHBsaWNpdCBjbG9zdXJlIHBhcmFtZXRlciBsaXN0LgorICAgICAgICAoICAge3ByZXZUb2tlbiA9PSBOTFN9PworICAgICAgICAgICAgeyAgIGFkZFdhcm5pbmcoCisgICAgICAgICAgICAgICAgIkV4cHJlc3Npb24gc3RhdGVtZW50IGxvb2tzIGxpa2UgaXQgbWF5IGNvbnRpbnVlIGEgcHJldmlvdXMgc3RhdGVtZW50LiIsCisgICAgICAgICAgICAgICAgIkVpdGhlciByZW1vdmUgcHJldmlvdXMgbmV3bGluZSwgb3IgYWRkIGFuIGV4cGxpY2l0IHNlbWljb2xvbiAnOycuIik7CisgICAgICAgICAgICB9CisgICAgICAgICk/CisgICAgfAorICAgICAgICAvLyBFbHNlIHdlIGhhdmUgYSBibG9jayB3aXRob3V0IGFueSB2aXNpYmxlIGNsb3N1cmUgcGFyYW1ldGVycy4KKyAgICAgICAge3ByZXZUb2tlbiA9PSBOTFN9PworICAgICAgICAvLyBpZiBwcmV2VG9rZW4gaXMgTkxTLCB3ZSBoYXZlIGRvdWJsZSB0cm91YmxlOyBpc3N1ZSBhIGRvdWJsZSB3YXJuaW5nCisgICAgICAgIC8vIEV4YW1wbGU6ICBvYmouZm9vIFxuIHtwcmludGxuIHh9CisgICAgICAgIC8vIE1pZ2h0IGJlIGFwcGVuZGVkIGJsb2NrOiAgb2JqLmZvbyB7cHJpbnRsbiB4fQorICAgICAgICAvLyBNaWdodCBiZSBjbG9zdXJlIGV4cHJlc3Npb246ICBvYmouZm9vIDsge3gtPnByaW50bG4geH0KKyAgICAgICAgLy8gTWlnaHQgYmUgb3BlbiBibG9jazogIG9iai5mb28gOyBMOntwcmludGxuIHh9CisgICAgICAgIHsgICByZXF1aXJlKGZhbHNlLAorICAgICAgICAgICAgIkNsb3N1cmUgZXhwcmVzc2lvbiBsb29rcyBsaWtlIGl0IG1heSBiZSBhbiBpc29sYXRlZCBvcGVuIGJsb2NrLCAiKworICAgICAgICAgICAgIm9yIGl0IG1heSBjb250aW51ZSBhIHByZXZpb3VzIHN0YXRlbWVudC4iCisgICAgICAgICAgICAsCisgICAgICAgICAgICAiQWRkIGFuIGV4cGxpY2l0IHBhcmFtZXRlciBsaXN0LCBhcyBpbiB7aXQgLT4gLi4ufSwgb3IgbGFiZWwgaXQgYXMgTDp7Li4ufSwgIisKKyAgICAgICAgICAgICJhbmQgYWxzbyBlaXRoZXIgcmVtb3ZlIHByZXZpb3VzIG5ld2xpbmUsIG9yIGFkZCBhbiBleHBsaWNpdCBzZW1pY29sb24gJzsnLiIKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICB8CisgICAgICAgIHtwcmV2VG9rZW4gIT0gTkxTfT8KKyAgICAgICAgLy8gSWYgcHJldlRva2VuIGlzIFNFTUkgb3Igc29tZXRoaW5nIGVsc2UsIGlzc3VlIGEgc2luZ2xlIHdhcm5pbmc6CisgICAgICAgIC8vIEV4YW1wbGU6ICBvYmouZm9vIDsge3ByaW50bG4geH0KKyAgICAgICAgLy8gTWlnaHQgYmUgY2xvc3VyZSBleHByZXNzaW9uOiAgb2JqLmZvbyA7IHt4LT5wcmludGxuIHh9CisgICAgICAgIC8vIE1pZ2h0IGJlIG9wZW4gYmxvY2s6ICBvYmouZm9vIDsgTDp7cHJpbnRsbiB4fQorICAgICAgICB7ICAgcmVxdWlyZShmYWxzZSwKKyAgICAgICAgICAgICJDbG9zdXJlIGV4cHJlc3Npb24gbG9va3MgbGlrZSBpdCBtYXkgYmUgYW4gaXNvbGF0ZWQgb3BlbiBibG9jay4iLAorICAgICAgICAgICAgIkFkZCBhbiBleHBsaWNpdCBwYXJhbWV0ZXIgbGlzdCwgYXMgaW4ge2l0IC0+IC4uLn0sIG9yIGxhYmVsIGl0IGFzIEw6ey4uLn0uIik7CisgICAgICAgIH0KKyAgICA7CisKKy8qKiBMb29rYWhlYWQgZm9yIHN1c3BpY2lvdXMgc3RhdGVtZW50IHdhcm5pbmdzIGFuZCBlcnJvcnMuICovCitzdXNwaWNpb3VzRXhwcmVzc2lvblN0YXRlbWVudFN0YXJ0CisgICAgOgorICAgICAgICAoICAgKFBMVVMgfCBNSU5VUykKKyAgICAgICAgfCAgIChMQlJBQ0sgfCBMUEFSRU4gfCBMQ1VSTFkpCisgICAgICAgICkKKyAgICAgICAgLy8gVE9ETzogIEV4cGFuZCB0aGlzIHNldD8KKyAgICA7CisKKy8vIFN1cHBvcnQgZm9yIHN3aXRjaC9jYXNlOgorY2FzZXNHcm91cCAge1Rva2VuIGZpcnN0ID0gTFQoMSk7fQorICAgIDogICAoICAgLy8gQ09ORkxJQ1Q6IHRvIHdoaWNoIGNhc2UgZ3JvdXAgZG8gdGhlIHN0YXRlbWVudHMgYmluZD8KKyAgICAgICAgICAgIC8vIEFOVExSIGdlbmVyYXRlcyBwcm9wZXIgY29kZTogaXQgZ3JvdXBzIHRoZQorICAgICAgICAgICAgLy8gbWFueSAiY2FzZSIvImRlZmF1bHQiIGxhYmVscyB0b2dldGhlciB0aGVuCisgICAgICAgICAgICAvLyBmb2xsb3dzIHRoZW0gd2l0aCB0aGUgc3RhdGVtZW50cworICAgICAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICAgICAgZ3JlZWR5ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGFDYXNlCisgICAgICAgICkrCisgICAgICAgIGNhc2VTTGlzdAorICAgICAgICB7I2Nhc2VzR3JvdXAgPSAjKGNyZWF0ZShDQVNFX0dST1VQLCAiQ0FTRV9HUk9VUCIsZmlyc3QsTFQoMSkpLCAjY2FzZXNHcm91cCk7fQorICAgIDsKKworYUNhc2UKKyAgICA6ICAgKCJjYXNlIl4gZXhwcmVzc2lvblswXSB8ICJkZWZhdWx0IikgQ09MT04hIG5scyEKKyAgICA7CisKK2Nhc2VTTGlzdCAge1Rva2VuIGZpcnN0ID0gTFQoMSk7fQorICAgIDogICBzdGF0ZW1lbnRbQ09MT05dIChzZXAhIChzdGF0ZW1lbnRbc2VwVG9rZW5dKT8pKgorICAgICAgICB7I2Nhc2VTTGlzdCA9ICMoY3JlYXRlKFNMSVNULCJTTElTVCIsZmlyc3QsTFQoMSkpLCNjYXNlU0xpc3QpO30KKyAgICA7CisKKy8vIFRoZSBpbml0aWFsaXplciBmb3IgYSBmb3IgbG9vcAorZm9ySW5pdCAge1Rva2VuIGZpcnN0ID0gTFQoMSk7fQorICAgIDogICAvLyBpZiBpdCBsb29rcyBsaWtlIGEgZGVjbGFyYXRpb24sIGl0IGlzCisgICAgICAgIChkZWNsYXJhdGlvblN0YXJ0KT0+IGRlY2xhcmF0aW9uCisgICAgfCAgIC8vIGVsc2UgaXQncyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGV4cHJlc3Npb25zCisgICAgICAgIChjb250cm9sRXhwcmVzc2lvbkxpc3QpPworICAgICAgICB7I2ZvckluaXQgPSAjKGNyZWF0ZShGT1JfSU5JVCwiRk9SX0lOSVQiLGZpcnN0LExUKDEpKSwjZm9ySW5pdCk7fQorICAgIDsKKworZm9yQ29uZCAge1Rva2VuIGZpcnN0ID0gTFQoMSk7fQorICAgIDogICAoc3RyaWN0Q29udGV4dEV4cHJlc3Npb24pPworICAgICAgICB7I2ZvckNvbmQgPSAjKGNyZWF0ZShGT1JfQ09ORElUSU9OLCJGT1JfQ09ORElUSU9OIixmaXJzdCxMVCgxKSksI2ZvckNvbmQpO30KKyAgICA7CisKK2Zvckl0ZXIgIHtUb2tlbiBmaXJzdCA9IExUKDEpO30KKyAgICA6ICAgKGNvbnRyb2xFeHByZXNzaW9uTGlzdCk/CisgICAgICAgIHsjZm9ySXRlciA9ICMoY3JlYXRlKEZPUl9JVEVSQVRPUiwiRk9SX0lURVJBVE9SIixmaXJzdCxMVCgxKSksI2Zvckl0ZXIpO30KKyAgICA7CisKKy8vIGFuIGV4Y2VwdGlvbiBoYW5kbGVyIHRyeS9jYXRjaCBibG9jawordHJ5QmxvY2sKKyAgICA6ICAgInRyeSJeIG5sc1dhcm4hIGNvbXBvdW5kU3RhdGVtZW50CisgICAgICAgICAgICAoIG9wdGlvbnMge2dyZWVkeT10cnVlO30gOiAgbmxzISBoYW5kbGVyKSoKKyAgICAgICAgICAgICggb3B0aW9ucyB7Z3JlZWR5PXRydWU7fSA6ICBubHMhIGZpbmFsbHlDbGF1c2UpPworICAgIDsKKworZmluYWxseUNsYXVzZQorICAgIDogICAiZmluYWxseSJeIG5sc1dhcm4hIGNvbXBvdW5kU3RhdGVtZW50CisgICAgOworCisvLyBhbiBleGNlcHRpb24gaGFuZGxlcgoraGFuZGxlcgorICAgIDogICAiY2F0Y2giXiBMUEFSRU4hIHBhcmFtZXRlckRlY2xhcmF0aW9uIFJQQVJFTiEgbmxzV2FybiEgY29tcG91bmRTdGF0ZW1lbnQKKyAgICA7CisKKy8qKiBBIG1lbWJlciBuYW1lICh4LnkpIG9yIGVsZW1lbnQgbmFtZSAoeFt5XSkgY2FuIHNlcnZlIGFzIGEgY29tbWFuZCBuYW1lLAorICogIHdoaWNoIG1heSBiZSBmb2xsb3dlZCBieSBhIGxpc3Qgb2YgYXJndW1lbnRzLgorICogIFVubGlrZSBwYXJlbnRoZXNpemVkIGFyZ3VtZW50cywgdGhlc2UgbXVzdCBiZSBwbGFpbiBleHByZXNzaW9ucywKKyAqICB3aXRob3V0IGxhYmVscyBvciBzcHJlYWQgb3BlcmF0b3JzLgorICovCitjb21tYW5kQXJndW1lbnRzW0FTVCBoZWFkXSAgCisgIHsKKyAgCVRva2VuIGZpcnN0ID0gTFQoMSk7CisgIAlpbnQgaGxzPTA7CisgIH0KKyAgICA6CisgICAgICAgIGNvbW1hbmRBcmd1bWVudCAoIENPTU1BISBubHMhIGNvbW1hbmRBcmd1bWVudCApKgorICAgICAgICAvLyBwcmludGxuIDIrMiAvL09LCisgICAgICAgIC8vIHByaW50bG4oMisyKSAvL09LCisgICAgICAgIC8vIHByaW50bG4gKDIpKzIgLy9CQUQKKyAgICAgICAgLy8gcHJpbnRsbigoMikrMikgLy9PSworICAgICAgICAvLyAocHJpbnRsbigyKSsyKSAvL09LCisgICAgICAgIC8vIGNvbXBhcmUgKDIpLCAyIC8vQkFECisgICAgICAgIC8vIGNvbXBhcmUoICgyKSwgMiApIC8vT0sKKyAgICAgICAgLy8gZm9vLmJhciBiYXp7YmF0fSwgYmFuZ3tib3p9IC8vT0sKKyAgICAgICAgeworICAgICAgICAgICAgQVNUIGVsaXN0ID0gIyhjcmVhdGUoRUxJU1QsIkVMSVNUIixmaXJzdCxMVCgxKSksICNjb21tYW5kQXJndW1lbnRzKTsKKyAgICAgICAgICAgIEFTVCBoZWFkaWQgPSBnZXRBU1RGYWN0b3J5KCkuZHVwKCNoZWFkKTsKKyAgICAgICAgICAgIGhlYWRpZC5zZXRUeXBlKE1FVEhPRF9DQUxMKTsKKyAgICAgICAgICAgIGhlYWRpZC5zZXRUZXh0KCI8Y29tbWFuZD4iKTsKKyAgICAgICAgICAgICNjb21tYW5kQXJndW1lbnRzID0gIyhoZWFkaWQsIGhlYWQsIGVsaXN0KTsKKyAgICAgICAgfQorICAgIDsKKworY29tbWFuZEFyZ3VtZW50CisgICAgOgorICAgICAgICAoYXJndW1lbnRMYWJlbCBDT0xPTikgPT4gKAorICAgICAgICAgICAgYXJndW1lbnRMYWJlbCBjOkNPTE9OXiAgZXhwcmVzc2lvblswXSAgeyNjLnNldFR5cGUoTEFCRUxFRF9BUkcpO30KKyAgICAgICAgKQorICAgICAgICB8ICBleHByZXNzaW9uWzBdCisgICAgOworCisvLyBleHByZXNzaW9ucworLy8gTm90ZSB0aGF0IG1vc3Qgb2YgdGhlc2UgZXhwcmVzc2lvbnMgZm9sbG93IHRoZSBwYXR0ZXJuCisvLyAgIHRoaXNMZXZlbEV4cHJlc3Npb24gOgorLy8gICAgICAgICBuZXh0SGlnaGVyUHJlY2VkZW5jZUV4cHJlc3Npb24KKy8vICAgICAgICAgICAgICAgICAoT1BFUkFUT1IgbmV4dEhpZ2hlclByZWNlZGVuY2VFeHByZXNzaW9uKSoKKy8vIHdoaWNoIGlzIGEgc3RhbmRhcmQgcmVjdXJzaXZlIGRlZmluaXRpb24gZm9yIGEgcGFyc2luZyBhbiBleHByZXNzaW9uLgorLy8gVGhlIG9wZXJhdG9ycyBpbiBqYXZhIGhhdmUgdGhlIGZvbGxvd2luZyBwcmVjZWRlbmNlczoKKy8vICAgICAgbG93ZXN0ICAoMTUpICA9ICoqPSAqPSAvPSAlPSArPSAtPSA8PD0gPj49ID4+Pj0gJj0gXj0gfD0KKy8vICAgICAgICAgICAgICAgICAgICAgICgxNCkgID86CisvLyAgICAgICAgICAgICAgICAgICAgICAoMTMpICB8fAorLy8gICAgICAgICAgICAgICAgICAgICAgKDEyKSAgJiYKKy8vICAgICAgICAgICAgICAgICAgICAgICgxMSkgIHwKKy8vICAgICAgICAgICAgICAgICAgICAgICgxMCkgIF4KKy8vICAgICAgICAgICAgICAgICAgICAgICggOSkgICYKKy8vICAgICAgICAgICAgICAgICAgICAgICggOCkgID09ICE9IDw9PgorLy8gICAgICAgICAgICAgICAgICAgICAgKCA3KSAgPCA8PSA+ID49IGluc3RhbmNlb2YgYXMKKy8vICAgICAgICAgICAgICAgICAgICAgICggNikgIDw8ID4+IC4uIC4uLgorLy8gICAgICAgICAgICAgICAgICAgICAgKCA1KSAgKyhiaW5hcnkpIC0oYmluYXJ5KQorLy8gICAgICAgICAgICAgICAgICAgICAgKCA0KSAgKiAvICUKKy8vICAgICAgICAgICAgICAgICAgICAgICggMykgICsrKHByZS9wb3N0KSAtLShwcmUvcG9zdCkgKyh1bmFyeSkgLSh1bmFyeSkKKy8vICAgICAgICAgICAgICAgICAgICAgICggMikgICoqKHBvd2VyKQorLy8gICAgICAgICAgICAgICAgICAgICAgKCAxKSAgfiAgISAkICh0eXBlKQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgLiA/LiAqLiAoZG90IC0tIGlkZW50aWZpZXIgcXVhbGlmaWNhdGlvbikKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdICAgKCkgKG1ldGhvZCBjYWxsKSAge30gKGNsb3NhYmxlQmxvY2spICBbXSAobGlzdC9tYXApCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgICgpIChleHBsaWNpdCBwYXJlbnRoZXNpcykKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICR4IChzY29wZSBlc2NhcGUpCisvLworLy8gdGhlIGxhc3QgdHdvIGFyZSBub3QgdXN1YWxseSBvbiBhIHByZWNlZGVuY2UgY2hhcnQ7IEkgcHV0IHRoZW0gaW4KKy8vIHRvIHBvaW50IG91dCB0aGF0IG5ldyBoYXMgYSBoaWdoZXIgcHJlY2VkZW5jZSB0aGFuICcuJywgc28geW91CisvLyBjYW4gdmFsaWR5IHVzZQorLy8gICAgICAgbmV3IEZyYW1lKCkuc2hvdygpCisvLworLy8gTm90ZSB0aGF0IHRoZSBhYm92ZSBwcmVjZWRlbmNlIGxldmVscyBtYXAgdG8gdGhlIHJ1bGVzIGJlbG93Li4uCisvLyBPbmNlIHlvdSBoYXZlIGEgcHJlY2VkZW5jZSBjaGFydCwgd3JpdGluZyB0aGUgYXBwcm9wcmlhdGUgcnVsZXMgYXMgYmVsb3cKKy8vICAgaXMgdXN1YWxseSB2ZXJ5IHN0cmFpZ2h0Zm93YXJkCisKKworLy8gdGhlIG1vdGhlciBvZiBhbGwgZXhwcmVzc2lvbnMKKy8vIFRoaXMgbm9udGVybWluYWwgaXMgbm90IHVzZWQgZm9yIGV4cHJlc3Npb24gc3RhdGVtZW50cywgd2hpY2ggaGF2ZSBhIG1vcmUgcmVzdHJpY3RlZCBzeW50YXgKKy8vIGR1ZSB0byBwb3NzaWJsZSBhbWJpZ3VpdGllcyB3aXRoIG90aGVyIGtpbmRzIG9mIHN0YXRlbWVudHMuICBUaGlzIG5vbnRlcm1pbmFsIGlzIHVzZWQgb25seQorLy8gaW4gY29udGV4dHMgd2hlcmUgd2Uga25vdyB3ZSBoYXZlIGFuIGV4cHJlc3Npb24uICBJdCBhbGxvd3MgZ2VuZXJhbCBKYXZhLXR5cGUgZXhwcmVzc2lvbnMuCitleHByZXNzaW9uW2ludCBsY19zdG10XQorICAgIDogICBhc3NpZ25tZW50RXhwcmVzc2lvbltsY19zdG10XQorICAgIDsKKworLy8gVGhpcyBpcyBhIGxpc3Qgb2YgZXhwcmVzc2lvbnMuCisvLyBVc2VkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCBpbiBhIGZldyBwbGFjZXMgd2hlcmUKKy8vIGNvbW1hLXNlcGFyYXRlZCBsaXN0cyBvZiBKYXZhIGV4cHJlc3Npb24gc3RhdGVtZW50cyBhbmQgZGVjbGFyYXRpb25zIGFyZSByZXF1aXJlZC4KK2NvbnRyb2xFeHByZXNzaW9uTGlzdCAge1Rva2VuIGZpcnN0ID0gTFQoMSk7fQorICAgIDogICBzdHJpY3RDb250ZXh0RXhwcmVzc2lvbiAoQ09NTUEhIG5scyEgc3RyaWN0Q29udGV4dEV4cHJlc3Npb24pKgorICAgICAgICB7I2NvbnRyb2xFeHByZXNzaW9uTGlzdCA9ICMoY3JlYXRlKEVMSVNULCJFTElTVCIsZmlyc3QsTFQoMSkpLCBjb250cm9sRXhwcmVzc2lvbkxpc3QpO30KKyAgICA7CisKKy8qKiBBICJwYXRoIGV4cHJlc3Npb24iIGlzIGEgbmFtZSBvciBvdGhlciBwcmltYXJ5LCBwb3NzaWJseSBxdWFsaWZpZWQgYnkgdmFyaW91cworICogIGZvcm1zIG9mIGRvdCwgYW5kL29yIGZvbGxvd2VkIGJ5IHZhcmlvdXMga2luZHMgb2YgYnJhY2tldHMuCisgKiAgSXQgY2FuIGJlIHVzZWQgZm9yIHZhbHVlIG9yIGFzc2lnbmVkIHRvLCBvciBlbHNlIGZ1cnRoZXIgcXVhbGlmaWVkLCBpbmRleGVkLCBvciBjYWxsZWQuCisgKiAgSXQgaXMgY2FsbGVkIGEgInBhdGgiIGJlY2F1c2UgaXQgbG9va3MgbGlrZSBhIGxpbmVhciBwYXRoIHRocm91Z2ggYSBkYXRhIHN0cnVjdHVyZS4KKyAqICBFeGFtcGxlczogIHgueSwgeD8ueSwgeCoueSwgeC5AeTsgeFtdLCB4W3ldLCB4W3ksel07IHgoKSwgeCh5KSwgeCh5LHopOyB4e3N9OyBhLmJbbl0uYyh4KS5ke3N9CisgKiAgKENvbXBhcmUgdG8gYSBDIGx2YWx1ZSwgb3IgTGVmdEhhbmRTaWRlIGluIHRoZSBKTFMgc2VjdGlvbiAxNS4yNi4pCisgKiAgR2VuZXJhbCBleHByZXNzaW9ucyBhcmUgYnVpbHQgdXAgZnJvbSBwYXRoIGV4cHJlc3Npb25zLCB1c2luZyBvcGVyYXRvcnMgbGlrZSAnKycgYW5kICc9Jy4KKyAqLworcGF0aEV4cHJlc3Npb25baW50IGxjX3N0bXRdCisgICAgICAgIHsgQVNUIHByZWZpeCA9IG51bGw7IH0KKyAgICA6CQorICAgICAgICBwcmU6cHJpbWFyeUV4cHJlc3Npb24hCisgICAgICAgIHsgcHJlZml4ID0gI3ByZTsgfQorCisgICAgICAgICgKKyAgICAgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgICAgIC8vIFxue2Zvb30gY291bGQgbWF0Y2ggaGVyZSBvciBjb3VsZCBiZWdpbiBhIG5ldyBzdGF0ZW1lbnQKKyAgICAgICAgICAgICAgICAvLyBXZSBkbyB3YW50IHRvIG1hdGNoIGhlcmUuIFR1cm4gb2ZmIHdhcm5pbmcuCisgICAgICAgICAgICAgICAgZ3JlZWR5PXRydWU7CisgICAgICAgICAgICAgICAgLy8gVGhpcyB0dXJucyB0aGUgYW1iaWd1aXR5IHdhcm5pbmcgb2YgdGhlIHNlY29uZCBhbHRlcm5hdGl2ZQorICAgICAgICAgICAgICAgIC8vIG9mZi4gU2VlIGJlbG93LiAoVGhlICJBTlRMUl9MT09QX0VYSVQiIHByZWRpY2F0ZSBtYWtlcyBpdCBub24taXNzdWUpCisgICAgICAgICAgICAgICAgLy9AQCB3YXJuV2hlbkZvbGxvd0FtYmlnPWZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gUGFyc2luZyBvZiB0aGlzIGNoYWluIGlzIGdyZWVkeS4gIEZvciBleGFtcGxlLCBhIHBhdGhFeHByZXNzaW9uIG1heSBiZSBhIGNvbW1hbmQgbmFtZQorICAgICAgICAgICAgLy8gZm9sbG93ZWQgYnkgYSBjb21tYW5kIGFyZ3VtZW50LCBidXQgdGhhdCBjb21tYW5kIGFyZ3VtZW50IGNhbm5vdCBiZWdpbiB3aXRoIGFuIExQQVJFTiwKKyAgICAgICAgICAgIC8vIHNpbmNlIGEgcGFyZW50aGVzaXplZCBleHByZXNzaW9uIGlzIGdyZWVkaWx5IGF0dGFjaGVkIHRvIHRoZSBwYXRoRXhwcmVzc2lvbiBhcyBhIG1ldGhvZCBhcmd1bWVudC4KKyAgICAgICAgICAgIC8vIFRoZSBsb29rYWhlYWQgaXMgYWxzbyBuZWNlc3NhcnkgdG8gcmVhY2ggYWNyb3NzIG5ld2xpbmUgaW4gZm9vIFxuIHtiYXJ9LgorICAgICAgICAgICAgLy8gKEFwcGFyZW50bHkgYW50bHIncyBiYXNpYyBhcHByb3hpbWF0ZSBMTChrKSBsb29rYWhlYWQgaXMgdG9vIHdlYWsgZm9yIHRoaXMuKQorICAgICAgICA6ICAgKHBhdGhFbGVtZW50U3RhcnQpPT4KKyAgICAgICAgICAgIG5scyEKKyAgICAgICAgICAgIHBlOnBhdGhFbGVtZW50W3ByZWZpeF0hCisgICAgICAgICAgICB7IHByZWZpeCA9ICNwZTsgfQorICAgICAgICB8CisgICAgICAgICAgICB7bGNfc3RtdCA9PSBMQ19TVE1UIHx8IGxjX3N0bXQgPT0gTENfSU5JVH0/CisgICAgICAgICAgICAobmxzIExDVVJMWSk9PgorICAgICAgICAgICAgbmxzV2FybiEKKyAgICAgICAgICAgIGFwYjphcHBlbmRlZEJsb2NrW3ByZWZpeF0hCisgICAgICAgICAgICB7IHByZWZpeCA9ICNhcGI7IH0KKyAgICAgICAgKSoKKworICAgICAgICB7CisgICAgICAgICAgICAjcGF0aEV4cHJlc3Npb24gPSBwcmVmaXg7CisgICAgICAgICAgICBsYXN0UGF0aEV4cHJlc3Npb24gPSAjcGF0aEV4cHJlc3Npb247CisgICAgICAgIH0KKyAgICA7CisKK3BhdGhFbGVtZW50W0FTVCBwcmVmaXhdCisgICAgICAgIC8vIFRoZSBwcmltYXJ5IGNhbiB0aGVuIGJlIGZvbGxvd2VkIGJ5IGEgY2hhaW4gb2YgLmlkLCAoYSksIFthXSwgYW5kIHsuLi59CisgICAgOgorICAgICAgICB7ICAgI3BhdGhFbGVtZW50ID0gcHJlZml4OyAgfQorICAgICAgICAoICAgLy8gU3ByZWFkIG9wZXJhdG9yOiAgeCoueSAgPT09ICB4Py5jb2xsZWN0e2l0Lnl9CisgICAgICAgICAgICBTUFJFQURfRE9UXgorICAgICAgICB8ICAgLy8gT3B0aW9uYWwtbnVsbCBvcGVyYXRvcjogIHg/LnkgID09PSAoeD09bnVsbCk/bnVsbDp4LnkKKyAgICAgICAgICAgIE9QVElPTkFMX0RPVF4KKyAgICAgICAgfCAgIC8vIE1lbWJlciBwb2ludGVyIG9wZXJhdG9yOiBmb28uJnkgPT0gZm9vLm1ldGFDbGFzcy5nZXRNZXRob2RQb2ludGVyKGZvbywgInkiKQorICAgICAgICAgICAgTUVNQkVSX1BPSU5URVJeCisgICAgICAgIHwgICAvLyBUaGUgYWxsLXBvd2VyZnVsIGRvdC4KKyAgICAgICAgICAgIChubHMhIERPVF4pCisgICAgICAgICkgbmxzIQorICAgICAgICAodHlwZUFyZ3VtZW50cyk/ICAgLy8gVE9ETzogSmF2YSA1IHR5cGUgYXJndW1lbnQgYXBwbGljYXRpb24gdmlhIHByZWZpeCB4LjxJbnRlZ2VyPnkKKyAgICAgICAgbmFtZVBhcnQKKyAgICB8CisgICAgICAgIG1jYTptZXRob2RDYWxsQXJnc1twcmVmaXhdIQorICAgICAgICB7ICAgI3BhdGhFbGVtZW50ID0gI21jYTsgIH0KKyAgICB8CisgICAgICAgIC8vIENhbiBhbHdheXMgYXBwZW5kIGEgYmxvY2ssIGFzIGZvb3tiYXJ9CisgICAgICAgIGFwYjphcHBlbmRlZEJsb2NrW3ByZWZpeF0hCisgICAgICAgIHsgICAjcGF0aEVsZW1lbnQgPSAjYXBiOyAgfQorICAgIHwKKyAgICAgICAgLy8gRWxlbWVudCBzZWxlY3Rpb24gaXMgYWx3YXlzIGFuIG9wdGlvbiwgdG9vLgorICAgICAgICAvLyBJbiBHcm9vdnksIHRoZSBzdHVmZiBiZXR3ZWVuIGJyYWNrZXRzIGlzIGEgZ2VuZXJhbCBhcmd1bWVudCBsaXN0LAorICAgICAgICAvLyBzaW5jZSB0aGUgYnJhY2tldCBvcGVyYXRvciBpcyB0cmFuc2Zvcm1lZCBpbnRvIGEgbWV0aG9kIGNhbGwuCisgICAgICAgIGlwYTppbmRleFByb3BlcnR5QXJnc1twcmVmaXhdIQorICAgICAgICB7ICAgI3BhdGhFbGVtZW50ID0gI2lwYTsgIH0KKworLypOWUkqCisgICAgfCAgIERPVF4gbmxzISAidGhpcyIKKworICAgIHwgICBET1ReIG5scyEgInN1cGVyIgorICAgICAgICAoICAgLy8gKG5ldyBPdXRlcigpKS5zdXBlcigpICAoY3JlYXRlIGVuY2xvc2luZyBpbnN0YW5jZSkKKyAgICAgICAgICAgIGxwMzpMUEFSRU5eIGFyZ0xpc3QgUlBBUkVOIQorICAgICAgICAgICAgeyNscDMuc2V0VHlwZShTVVBFUl9DVE9SX0NBTEwpO30KKyAgICAgICAgfCAgIERPVF4gSURFTlQKKyAgICAgICAgICAgICggICBscHM6TFBBUkVOXiB7I2xwcy5zZXRUeXBlKE1FVEhPRF9DQUxMKTt9CisgICAgICAgICAgICAgICAgYXJnTGlzdAorICAgICAgICAgICAgICAgIFJQQVJFTiEKKyAgICAgICAgICAgICk/CisgICAgICAgICkKKyAgICB8ICAgRE9UXiBubHMhIG5ld0V4cHJlc3Npb24KKypOWUkqLworICAgIDsKKworcGF0aEVsZW1lbnRTdGFydCEKKyAgICA6ICAgKG5scyEgRE9UKQorICAgIHwgICBTUFJFQURfRE9UCisgICAgfCAgIE9QVElPTkFMX0RPVAorLy90b2RvIC0gbm9uZGV0ZXJtaW5pc21zICAgIHwgICBNRU1CRVJfUE9JTlRFUl9ERUZBVUxUCisgICAgfCAgIE1FTUJFUl9QT0lOVEVSCisgICAgfCAgIExCUkFDSworICAgIHwgICBMUEFSRU4KKyAgICB8ICAgTENVUkxZCisgICAgOworCisvKiogVGhpcyBpcyB0aGUgZ3JhbW1hciBmb3Igd2hhdCBjYW4gZm9sbG93IGEgZG90OiAgeC5hLCB4LkBhLCB4LiZhLCB4LidhJywgZXRjLgorICogIE5vdGU6IDxjb2RlPnR5cGVBcmd1bWVudHM8L2NvZGU+IGlzIGhhbmRsZWQgYnkgdGhlIGNhbGxlciBvZiA8Y29kZT5uYW1lUGFydDwvY29kZT4uCisgKi8KK25hbWVQYXJ0ICB7VG9rZW4gZmlyc3QgPSBMVCgxKTt9CisgICAgOgorICAgICAgICAoICAgYXRzOkFUXiAgICAgeyNhdHMuc2V0VHlwZShTRUxFQ1RfU0xPVCk7fSAgKT8KKyAgICAgICAgLy8gZm9vLkBiYXIgc2VsZWN0cyB0aGUgZmllbGQgKG9yIGF0dHJpYnV0ZSksIG5vdCBwcm9wZXJ0eQorCisgICAgICAgICggICBJREVOVAorICAgICAgICB8ICAgc2w6U1RSSU5HX0xJVEVSQUwgeyNzbC5zZXRUeXBlKElERU5UKTt9CisgICAgICAgICAgICAvLyBmb28uJ2JhcicgaXMgaW4gYWxsIHdheXMgc2FtZSBhcyBmb28uYmFyLCBleGNlcHQgdGhhdCBiYXIgY2FuIGhhdmUgYW4gYXJiaXRyYXJ5IHNwZWxsaW5nCisgICAgICAgIHwgICBkeW5hbWljTWVtYmVyTmFtZQorICAgICAgICB8CisgICAgICAgICAgICBvcGVuQmxvY2sKKyAgICAgICAgICAgIC8vIFBST1BPU0FMLCBERUNJREU6ICBJcyB0aGlzIGlubGluZSBmb3JtIG9mIHRoZSAnd2l0aCcgc3RhdGVtZW50IHVzZWZ1bD8KKyAgICAgICAgICAgIC8vIERlZmluaXRpb246ICBhLntmb299ID09PSB7d2l0aChhKSB7Zm9vfX0KKyAgICAgICAgICAgIC8vIE1heSBjb3ZlciBzb21lIHBhdGggZXhwcmVzc2lvbiB1c2UtY2FzZXMgcHJldmlvdXNseSBoYW5kbGVkIGJ5IGR5bmFtaWMgc2NvcGluZyAoY2xvc3VyZSBkZWxlZ2F0ZXMpLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxldHMgYWxsb3cgY29tbW9uIGtleXdvcmRzIGFzIHByb3BlcnR5IG5hbWVzCisgICAgICAgIHwgICBrZXl3b3JkUHJvcGVydHlOYW1lcworCisvKiBsZXRzIGFsbG93IHNvbWUgY29tbW9uIGtleXdvcmRzIGZvciBwcm9wZXJ0aWVzIGxpa2UgJ2luJywgJ2NsYXNzJywgJ2RlZicgZXRjCisgKiBUT0RPOiBSZWluc3RhdGUgdGhpcyBsb2dpYyBpZiB3ZSBjaGFuZ2Ugb3IgcmVtb3ZlIGtleXdvcmRQcm9wZXJ0eU5hbWVzLgorICogU2VlIGFsc28gTElURVJBTF9pbiBsb2dpYyBpbiB0aGUgbGV4ZXIuCisgICAgICAgIC8vIFJlY292ZXIgd2l0aCBhIGdvb2QgZGlhZ25vc3RpYyBmcm9tIGEgY29tbW9uIGVycm9yOgorICAgICAgICB8ICAgImluIiAgLy8gcG9zdGVyIGNoaWxkOyB0aGUgbGV4ZXIgbWFrZXMgYWxsIGtleXdvcmRzIGFmdGVyIGRvdCBsb29rIGxpa2UgImluIgorICAgICAgICAgICAgeyAgIFN0cmluZyBrd2QgPSBMVCgxKS5nZXRUZXh0KCk7CisgICAgICAgICAgICAgICAgcmVxdWlyZShmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgImlsbGVnYWwga2V5d29yZCBhZnRlciBkb3QgaW4geC4iK2t3ZCwKKyAgICAgICAgICAgICAgICAgICAgInB1dCB0aGUga2V5d29yZCBpbiBxdW90ZXMsIGFzIGluIHguJyIra3dkKyInIik7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBoZWxwcyB0aGUgdXNlciByZWNvdmVyIGZyb20gcnVpbmVkIEphdmEgaWRlbnRpZmllcnMsIGFzIGluIFN5c3RlbS4naW4nLgorICAgICAgICAgICAgICAgIC8vIERFQ0lERTogU2hhbGwgd2UganVzdCBkZWZpbmUgZm9vLmluIHRvIERUUlQgYXV0b21hZ2ljYWxseSwgb3IgZG8gd2Ugd2FudCB0aGUgc3ludGF4IGNoZWNrPworICAgICAgICAgICAgfQorKi8gICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgKQorCisgICAgICAgIC8vIChObywgeC4mQHkgaXMgbm90IG5lZWRlZDsganVzdCBzYXkgeC4meSBhcyBTbG90IG9yIHNvbWUgc3VjaC4pCisgICAgOworCisvKiogQWxsb3dlZCBrZXl3b3JkcyBhZnRlciBkb3QgKGFzIGEgbWVtYmVyIG5hbWUpIGFuZCBiZWZvcmUgY29sb24gKGFzIGEgbGFiZWwpLgorICogIFRPRE86IFdoYXQncyB0aGUgcmF0aW9uYWxlIGZvciB0aGVzZT8KKyAqLwora2V5d29yZFByb3BlcnR5TmFtZXMKKyAgICA6ICAgKCAgICJjbGFzcyIgfCAiaW4iIHwgImFzIiB8ICJkZWYiIHwgImRlZmF1bHQiIHwgInN0YXRpYyIgfCAiZ290byIKKyAgICAgICAgfCAgICJpZiIgfCAiZWxzZSIgfCAiZm9yIiB8ICJ3aGlsZSIgfCAiZG8iIHwgInN3aXRjaCIgfCAidHJ5IiB8ICJjYXRjaCIgfCAiZmluYWxseSIKKyAgICAgICAgfCAgIGJ1aWx0SW5UeXBlCisgICAgICAgICkKKyAgICAgICAgeyAja2V5d29yZFByb3BlcnR5TmFtZXMuc2V0VHlwZShJREVOVCk7IH0KKyAgICA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy8qKiBJZiBhIGRvdCBpcyBmb2xsb3dlZCBieSBhIHBhcmVudGhlc2l6ZWQgb3IgcXVvdGVkIGV4cHJlc3Npb24sIHRoZSBtZW1iZXIgaXMgY29tcHV0ZWQgZHluYW1pY2FsbHksCisgKiAgYW5kIHRoZSBtZW1iZXIgc2VsZWN0aW9uIGlzIGRvbmUgb25seSBhdCBydW50aW1lLiAgVGhpcyBmb3JjZXMgYSBzdGF0aWNhbGx5IHVuY2hlY2tlZCBtZW1iZXIgYWNjZXNzLgorICovCitkeW5hbWljTWVtYmVyTmFtZSAge1Rva2VuIGZpcnN0ID0gTFQoMSk7fQorICAgIDogICAoICAgcGFyZW50aGVzaXplZEV4cHJlc3Npb24KKyAgICAgICAgfCAgIHN0cmluZ0NvbnN0cnVjdG9yRXhwcmVzc2lvbgorICAgICAgICApCisgICAgICAgIHsgI2R5bmFtaWNNZW1iZXJOYW1lID0gIyhjcmVhdGUoRFlOQU1JQ19NRU1CRVIsICJEWU5BTUlDX01FTUJFUiIsZmlyc3QsTFQoMSkpLCAjZHluYW1pY01lbWJlck5hbWUpOyB9CisgICAgOworCisvKiogQW4gZXhwcmVzc2lvbiBtYXkgYmUgZm9sbG93ZWQgYnkgb25lIG9yIGJvdGggb2YgKC4uLikgYW5kIHsuLi59LgorICogIE5vdGU6IElmIGVpdGhlciBpcyAoLi4uKSBvciB7Li4ufSBwcmVzZW50LCBpdCBpcyBhIG1ldGhvZCBjYWxsLgorICogIFRoZSB7Li4ufSBpcyBhcHBlbmRlZCB0byB0aGUgYXJndW1lbnQgbGlzdCwgYW5kIG1hdGNoZXMgYSBmb3JtYWwgb2YgdHlwZSBDbG9zdXJlLgorICogIElmIHRoZXJlIGlzIG5vIG1ldGhvZCBtZW1iZXIsIGEgcHJvcGVydHkgKG9yIGZpZWxkKSBpcyB1c2VkIGluc3RlYWQsIGFuZCBtdXN0IGl0c2VsZiBiZSBjYWxsYWJsZS4KKyAqICA8cD4KKyAqICBJZiB0aGUgbWV0aG9kQ2FsbEFyZ3MgYXJlIGFic2VudCwgaXQgaXMgYSBwcm9wZXJ0eSByZWZlcmVuY2UuCisgKiAgSWYgdGhlcmUgaXMgbm8gcHJvcGVydHksIGl0IGlzIHRyZWF0ZWQgYXMgYSBmaWVsZCByZWZlcmVuY2UsIGJ1dCBuZXZlciBhIG1ldGhvZCByZWZlcmVuY2UuCisgKiAgPHA+CisgKiAgQXJndW1lbnRzIGluIHRoZSAoLi4uKSBjYW4gYmUgbGFiZWxlZCwgYW5kIHRoZSBhcHBlbmRlZCBibG9jayBjYW4gYmUgbGFiZWxlZCBhbHNvLgorICogIElmIHRoZXJlIGlzIGEgbWl4IG9mIHVubGFiZWxlZCBhbmQgbGFiZWxlZCBhcmd1bWVudHMsCisgKiAgYWxsIHRoZSBsYWJlbGVkIGFyZ3VtZW50cyBtdXN0IGZvbGxvdyB0aGUgdW5sYWJlbGVkIGFyZ3VtZW50cywKKyAqICBleGNlcHQgdGhhdCB0aGUgY2xvc3VyZSAobGFiZWxlZCBvciBub3QpIGlzIGFsd2F5cyBhIHNlcGFyYXRlIGZpbmFsIGFyZ3VtZW50LgorICogIExhYmVsZWQgYXJndW1lbnRzIGFyZSBjb2xsZWN0ZWQgdXAgYW5kIHBhc3NlZCBhcyBhIHNpbmdsZSBhcmd1bWVudCB0byBhIGZvcm1hbCBvZiB0eXBlIE1hcC4KKyAqICA8cD4KKyAqICBUaGVyZWZvcmUsIGYoeCx5LCBhOnAsIGI6cSkge3N9IGlzIGVxdWl2YWxlbnQgaW4gYWxsIHdheXMgdG8gZih4LHksIFthOnAsYjpxXSwge3N9KS4KKyAqICBTcHJlYWQgYXJndW1lbnRzIG9mIHNlcXVlbmNlIHR5cGUgY291bnQgYXMgdW5sYWJlbGVkIGFyZ3VtZW50cywKKyAqICB3aGlsZSBzcHJlYWQgYXJndW1lbnRzIG9mIG1hcCB0eXBlIGNvdW50IGFzIGxhYmVsZWQgYXJndW1lbnRzLgorICogIChUaGlzIGRpc3RpbmN0aW9uIG11c3Qgc29tZXRpbWVzIGJlIGNoZWNrZWQgZHluYW1pY2FsbHkuKQorICoKKyAqICBBIHBsYWluIHVubGFiZWxlZCBhcmd1bWVudCBpcyBhbGxvd2VkIHRvIG1hdGNoIGEgdHJhaWxpbmcgTWFwIG9yIENsb3N1cmUgYXJndW1lbnQ6CisgKiAgZih4LCBhOnApIHtzfSAgPT09ICBmKCpbIHgsIFthOnBdLCB7c30gXSkKKyAqLworLy8gQVNUIGlzIFtNRVRIT0RfQ0FMTCwgY2FsbGVlLCBFTElTVD8gQ0xPU0FCTEVfQkxPQ0s/XS4KKy8vIE5vdGUgdGhhdCBjYWxsZWUgaXMgb2Z0ZW4gb2YgdGhlIGZvcm0geC55IGJ1dCBub3QgYWx3YXlzLgorLy8gSWYgdGhlIGNhbGxlZSBpcyBub3Qgb2YgdGhlIGZvcm0geC55LCB0aGVuIGFuIGltcGxpY2l0IC5jYWxsIGlzIG5lZWRlZC4KK21ldGhvZENhbGxBcmdzW0FTVCBjYWxsZWVdCisgICAgOgorICAgICAgICB7I21ldGhvZENhbGxBcmdzID0gY2FsbGVlO30KKyAgICAgICAgbHA6TFBBUkVOXiB7I2xwLnNldFR5cGUoTUVUSE9EX0NBTEwpO30KKyAgICAgICAgYXJnTGlzdAorICAgICAgICBSUEFSRU4hCisgICAgOworCisvKiogQW4gYXBwZW5kZWQgYmxvY2sgZm9sbG93cyBhbnkgZXhwcmVzc2lvbi4KKyAqICBJZiB0aGUgZXhwcmVzc2lvbiBpcyBub3QgYSBtZXRob2QgY2FsbCwgaXQgaXMgZ2l2ZW4gYW4gZW1wdHkgYXJndW1lbnQgbGlzdC4KKyAqLworYXBwZW5kZWRCbG9ja1tBU1QgY2FsbGVlXQorICAgIDoKKyAgICAgICAgeworICAgICAgICAgICAgLy8gSWYgdGhlIGNhbGxlZSBpcyBpdHNlbGYgYSBjYWxsLCBmbGF0dGVuIHRoZSBBU1QuCisgICAgICAgICAgICBpZiAoY2FsbGVlICE9IG51bGwgJiYgY2FsbGVlLmdldFR5cGUoKSA9PSBNRVRIT0RfQ0FMTCkgeworICAgICAgICAgICAgICAgICNhcHBlbmRlZEJsb2NrID0gY2FsbGVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBU1QgbGJyYWNlID0gZ2V0QVNURmFjdG9yeSgpLmNyZWF0ZShMVCgxKSk7CisgICAgICAgICAgICAgICAgbGJyYWNlLnNldFR5cGUoTUVUSE9EX0NBTEwpOworICAgICAgICAgICAgICAgIGlmIChjYWxsZWUgIT0gbnVsbCkgIGxicmFjZS5hZGRDaGlsZChjYWxsZWUpOworICAgICAgICAgICAgICAgICNhcHBlbmRlZEJsb2NrID0gbGJyYWNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qICBGSVhNRSBERUNJREU6IHNob3VsZCBhcHBlbmRlZCBibG9ja3MgYWNjZXB0IGxhYmVscz8KKyAgICAgICAgKCAgIChJREVOVCBDT0xPTiBubHMgTENVUkxZKT0+CisgICAgICAgICAgICBJREVOVCBjOkNPTE9OXiB7I2Muc2V0VHlwZShMQUJFTEVEX0FSRyk7fSBubHMhCisgICAgICAgICk/ICovCisgICAgICAgIGNsb3NhYmxlQmxvY2sKKyAgICA7CisKKy8qKiBBbiBleHByZXNzaW9uIG1heSBiZSBmb2xsb3dlZCBieSBbLi4uXS4KKyAqICBVbmxpa2UgSmF2YSwgdGhlc2UgYnJhY2tldHMgbWF5IGNvbnRhaW4gYSBnZW5lcmFsIGFyZ3VtZW50IGxpc3QsCisgKiAgd2hpY2ggaXMgcGFzc2VkIHRvIHRoZSBhcnJheSBlbGVtZW50IG9wZXJhdG9yLCB3aGljaCBjYW4gbWFrZSBvZiBpdCB3aGF0IGl0IHdhbnRzLgorICogIFRoZSBicmFja2V0cyBtYXkgYWxzbyBiZSBlbXB0eSwgYXMgaW4gVFtdLiAgVGhpcyBpcyBob3cgR3Jvb3Z5IG5hbWVzIGFycmF5IHR5cGVzLgorICogIDxwPlJldHVybmVkIEFTVCBpcyBbSU5ERVhfT1AsIGluZGV4ZWUsIEVMSVNUXS4KKyAqLworaW5kZXhQcm9wZXJ0eUFyZ3NbQVNUIGluZGV4ZWVdCisgICAgOgorICAgICAgICB7I2luZGV4UHJvcGVydHlBcmdzID0gaW5kZXhlZTt9CisgICAgICAgIGxiOkxCUkFDS14geyNsYi5zZXRUeXBlKElOREVYX09QKTt9CisgICAgICAgIGFyZ0xpc3QKKyAgICAgICAgUkJSQUNLIQorICAgIDsKKworLy8gYXNzaWdubWVudCBleHByZXNzaW9uIChsZXZlbCAxNSkKK2Fzc2lnbm1lbnRFeHByZXNzaW9uW2ludCBsY19zdG10XQorICAgIDogICBjb25kaXRpb25hbEV4cHJlc3Npb25bbGNfc3RtdF0KKyAgICAgICAgKAorICAgICAgICAgICAgKCAgIEFTU0lHTl4KKyAgICAgICAgICAgIHwgICBQTFVTX0FTU0lHTl4KKyAgICAgICAgICAgIHwgICBNSU5VU19BU1NJR05eCisgICAgICAgICAgICB8ICAgU1RBUl9BU1NJR05eCisgICAgICAgICAgICB8ICAgRElWX0FTU0lHTl4KKyAgICAgICAgICAgIHwgICBNT0RfQVNTSUdOXgorICAgICAgICAgICAgfCAgIFNSX0FTU0lHTl4KKyAgICAgICAgICAgIHwgICBCU1JfQVNTSUdOXgorICAgICAgICAgICAgfCAgIFNMX0FTU0lHTl4KKyAgICAgICAgICAgIHwgICBCQU5EX0FTU0lHTl4KKyAgICAgICAgICAgIHwgICBCWE9SX0FTU0lHTl4KKyAgICAgICAgICAgIHwgICBCT1JfQVNTSUdOXgorICAgICAgICAgICAgfCAgIFNUQVJfU1RBUl9BU1NJR05eCisgICAgICAgICAgICAvL3wgICBVU0VST1BfMTNeICAvL0RFQ0lERTogVGhpcyBpcyBob3cgdXNlci1kZWZpbmUgb3BzIHdvdWxkIHNob3cgdXAuCisgICAgICAgICAgICApCisgICAgICAgICAgICBubHMhCisgICAgICAgICAgICBhc3NpZ25tZW50RXhwcmVzc2lvbltsY19zdG10ID09IExDX1NUTVQ/IExDX0lOSVQ6IDBdCisgICAgICAgICAgICAvLyBJZiBsZWZ0LWNvbnRleHQgb2Yge3ggPSB5fSBpcyBhIHN0YXRlbWVudCBib3VuZGFyeSwKKyAgICAgICAgICAgIC8vIGRlZmluZSB0aGUgbGVmdC1jb250ZXh0IG9mIHkgYXMgYW4gaW5pdGlhbGl6ZXIuCisgICAgICAgICk/CisgICAgOworCisvLyBjb25kaXRpb25hbCB0ZXN0IChsZXZlbCAxNCkKK2NvbmRpdGlvbmFsRXhwcmVzc2lvbltpbnQgbGNfc3RtdF0KKyAgICA6ICAgbG9naWNhbE9yRXhwcmVzc2lvbltsY19zdG10XSAKKyAgICAgICAgKCAKKyAgICAgICAgICAoRUxWSVNfT1BFUkFUT1IpPT4gRUxWSVNfT1BFUkFUT1JeIG5scyEgY29uZGl0aW9uYWxFeHByZXNzaW9uWzBdIAorICAgICAgICAgIHwgUVVFU1RJT05eIG5scyEgYXNzaWdubWVudEV4cHJlc3Npb25bMF0gQ09MT04hIG5scyEgY29uZGl0aW9uYWxFeHByZXNzaW9uWzBdIAorICAgICAgICApPworICAgIDsKKworCisvLyBsb2dpY2FsIG9yICh8fCkgIChsZXZlbCAxMykKK2xvZ2ljYWxPckV4cHJlc3Npb25baW50IGxjX3N0bXRdCisgICAgOiAgIGxvZ2ljYWxBbmRFeHByZXNzaW9uW2xjX3N0bXRdIChMT1JeIG5scyEgbG9naWNhbEFuZEV4cHJlc3Npb25bMF0pKgorICAgIDsKKworCisvLyBsb2dpY2FsIGFuZCAoJiYpICAobGV2ZWwgMTIpCitsb2dpY2FsQW5kRXhwcmVzc2lvbltpbnQgbGNfc3RtdF0KKyAgICA6ICAgaW5jbHVzaXZlT3JFeHByZXNzaW9uW2xjX3N0bXRdIChMQU5EXiBubHMhIGluY2x1c2l2ZU9yRXhwcmVzc2lvblswXSkqCisgICAgOworCisvLyBiaXR3aXNlIG9yIG5vbi1zaG9ydC1jaXJjdWl0aW5nIG9yICh8KSAgKGxldmVsIDExKQoraW5jbHVzaXZlT3JFeHByZXNzaW9uW2ludCBsY19zdG10XQorICAgIDogICBleGNsdXNpdmVPckV4cHJlc3Npb25bbGNfc3RtdF0gKEJPUl4gbmxzISBleGNsdXNpdmVPckV4cHJlc3Npb25bMF0pKgorICAgIDsKKworCisvLyBleGNsdXNpdmUgb3IgKF4pICAobGV2ZWwgMTApCitleGNsdXNpdmVPckV4cHJlc3Npb25baW50IGxjX3N0bXRdCisgICAgOiAgIGFuZEV4cHJlc3Npb25bbGNfc3RtdF0gKEJYT1JeIG5scyEgYW5kRXhwcmVzc2lvblswXSkqCisgICAgOworCisKKy8vIGJpdHdpc2Ugb3Igbm9uLXNob3J0LWNpcmN1aXRpbmcgYW5kICgmKSAgKGxldmVsIDkpCithbmRFeHByZXNzaW9uW2ludCBsY19zdG10XQorICAgIDogICByZWdleEV4cHJlc3Npb25bbGNfc3RtdF0gKEJBTkReIG5scyEgcmVnZXhFeHByZXNzaW9uWzBdKSoKKyAgICA7CisKKy8vIHJlZ2V4IGZpbmQgYW5kIG1hdGNoICg9fiBhbmQgPT1+KSAobGV2ZWwgOC41KQorLy8gamV6OiBtb3ZlZCA9fiBjbG9zZXIgdG8gcHJlY2VkZW5jZSBvZiA9PSBldGMsIGFzLi4uCisvLyAnaWYgKGZvbyA9fiAiYS5jIiknIGlzIHZlcnkgY2xvc2UgaW4gaW50ZW50IHRvICdpZiAoZm9vID09ICJhYmMiKScKK3JlZ2V4RXhwcmVzc2lvbltpbnQgbGNfc3RtdF0KKyAgICA6ICAgZXF1YWxpdHlFeHByZXNzaW9uW2xjX3N0bXRdICgoUkVHRVhfRklORF4gfCBSRUdFWF9NQVRDSF4pIG5scyEgZXF1YWxpdHlFeHByZXNzaW9uWzBdKSoKKyAgICA7CisKKy8vIGVxdWFsaXR5L2luZXF1YWxpdHkgKD09LyE9KSAobGV2ZWwgOCkKK2VxdWFsaXR5RXhwcmVzc2lvbltpbnQgbGNfc3RtdF0KKyAgICA6ICAgcmVsYXRpb25hbEV4cHJlc3Npb25bbGNfc3RtdF0gKChOT1RfRVFVQUxeIHwgRVFVQUxeIHwgQ09NUEFSRV9UT14pIG5scyEgcmVsYXRpb25hbEV4cHJlc3Npb25bMF0pKgorICAgIDsKKworLy8gYm9vbGVhbiByZWxhdGlvbmFsIGV4cHJlc3Npb25zIChsZXZlbCA3KQorcmVsYXRpb25hbEV4cHJlc3Npb25baW50IGxjX3N0bXRdCisgICAgOiAgIHNoaWZ0RXhwcmVzc2lvbltsY19zdG10XQorICAgICAgICAoCW9wdGlvbnMge2dyZWVkeT10cnVlO30gOiAoCQorICAgICAgICAJCSggICBMVF4KKyAgICAgICAgICAgICAgICB8ICAgR1ReCisgICAgICAgICAgICAgICAgfCAgIExFXgorICAgICAgICAgICAgICAgIHwgICBHRV4KKyAgICAgICAgICAgICAgICB8ICAgImluIl4KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgbmxzIQorICAgICAgICAgICAgICAgIHNoaWZ0RXhwcmVzc2lvblswXQorICAgICAgICAgICAgCisgICAgICAgIAkpCisgICAgICAgIAl8ICAgImluc3RhbmNlb2YiXiBubHMhIHR5cGVTcGVjW3RydWVdCisgICAgICAgIAl8ICAgImFzIl4gICAgICAgICBubHMhIHR5cGVTcGVjW3RydWVdIC8vVE9ETzogUmV3b3JrIHRvIGFsbG93IHR5cGUgZXhwcmVzc2lvbj8KKyAgICAgICAgKT8KKyAgICA7CisKKworCisvLyBiaXQgc2hpZnQgZXhwcmVzc2lvbnMgKGxldmVsIDYpCitzaGlmdEV4cHJlc3Npb25baW50IGxjX3N0bXRdCisgICAgOiAgIGFkZGl0aXZlRXhwcmVzc2lvbltsY19zdG10XQorICAgICAgICAoCisgICAgICAgICAgICAoKFNMXiB8IFNSXiB8IEJTUl4pCisgICAgICAgICAgICB8ICAgUkFOR0VfSU5DTFVTSVZFXgorICAgICAgICAgICAgfCAgIFJBTkdFX0VYQ0xVU0lWRV4KKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIG5scyEKKyAgICAgICAgICAgIGFkZGl0aXZlRXhwcmVzc2lvblswXQorICAgICAgICApKgorICAgIDsKKworCisvLyBiaW5hcnkgYWRkaXRpb24vc3VidHJhY3Rpb24gKGxldmVsIDUpCithZGRpdGl2ZUV4cHJlc3Npb25baW50IGxjX3N0bXRdCisgICAgOiAgIG11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbltsY19zdG10XQorICAgICAgICAoCisgICAgICAgICAgICBvcHRpb25zIHtncmVlZHk9dHJ1ZTt9IDoKKyAgICAgICAgICAgIC8vIEJlIGdyZWVkeSBoZXJlLCB0byBmYXZvciB7eCt5fSBpbnN0ZWFkIG9mIHtwcmludCArdmFsdWV9CisgICAgICAgICAgICAoUExVU14gfCBNSU5VU14pIG5scyEKKyAgICAgICAgICAgIG11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblswXQorICAgICAgICApKgorICAgIDsKKworCisvLyBtdWx0aXBsaWNhdGlvbi9kaXZpc2lvbi9tb2R1bG8gKGxldmVsIDQpCittdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25baW50IGxjX3N0bXRdCisgICAgOiAgICAoIElOQ14gbmxzISAgcG93ZXJFeHByZXNzaW9uTm90UGx1c01pbnVzWzBdICgoU1RBUl4gfCBESVZeIHwgTU9EXiApICBubHMhICBwb3dlckV4cHJlc3Npb25bMF0pKiApCisgICAgfCAgICAoIERFQ14gbmxzISAgcG93ZXJFeHByZXNzaW9uTm90UGx1c01pbnVzWzBdICgoU1RBUl4gfCBESVZeIHwgTU9EXiApICBubHMhICBwb3dlckV4cHJlc3Npb25bMF0pKiApCisgICAgfCAgICAoIE1JTlVTXiB7I01JTlVTLnNldFR5cGUoVU5BUllfTUlOVVMpO30gbmxzISAgIHBvd2VyRXhwcmVzc2lvbk5vdFBsdXNNaW51c1swXSAoKFNUQVJeIHwgRElWXiB8IE1PRF4gKSAgbmxzISAgcG93ZXJFeHByZXNzaW9uWzBdKSogKQorICAgIHwgICAgKCBQTFVTXiB7I1BMVVMuc2V0VHlwZShVTkFSWV9QTFVTKTt9IG5scyEgICBwb3dlckV4cHJlc3Npb25Ob3RQbHVzTWludXNbMF0gKChTVEFSXiB8IERJVl4gfCBNT0ReICkgIG5scyEgIHBvd2VyRXhwcmVzc2lvblswXSkqICkKKyAgICB8ICAgICggIHBvd2VyRXhwcmVzc2lvbk5vdFBsdXNNaW51c1tsY19zdG10XSAoKFNUQVJeIHwgRElWXiB8IE1PRF4gKSAgbmxzISAgcG93ZXJFeHByZXNzaW9uWzBdKSogKQorICAgIDsKKyAgICAKKy8vIG1hdGggcG93ZXIgb3BlcmF0b3IgKCoqKSAobGV2ZWwgMykKK3Bvd2VyRXhwcmVzc2lvbltpbnQgbGNfc3RtdF0KKyAgICA6ICAgdW5hcnlFeHByZXNzaW9uW2xjX3N0bXRdIChTVEFSX1NUQVJeIG5scyEgdW5hcnlFeHByZXNzaW9uWzBdKSoKKyAgICA7CisgICAgCisvLyBtYXRoIHBvd2VyIG9wZXJhdG9yICgqKikgKGxldmVsIDMpIAorLy8gKHdpdGhvdXQgKysocHJlZml4KS8tLShwcmVmaXgpLysodW5hcnkpLy0odW5hcnkpKQorLy8gVGhlIGRpZmZlcmVudCBydWxlcyBhcmUgbmVlZGVkIHRvIGF2b2lkIGFtYmlnb3VzIHNlbGVjdGlvbgorLy8gb2YgYWx0ZXJuYXRpdmVzLiAKK3Bvd2VyRXhwcmVzc2lvbk5vdFBsdXNNaW51c1tpbnQgbGNfc3RtdF0KKyAgICA6ICAgdW5hcnlFeHByZXNzaW9uTm90UGx1c01pbnVzW2xjX3N0bXRdIChTVEFSX1NUQVJeIG5scyEgdW5hcnlFeHByZXNzaW9uWzBdKSoKKyAgICA7CisKKy8vICsrKHByZWZpeCkvLS0ocHJlZml4KS8rKHVuYXJ5KS8tKHVuYXJ5KSAobGV2ZWwgMikKK3VuYXJ5RXhwcmVzc2lvbltpbnQgbGNfc3RtdF0KKyAgICA6ICAgSU5DXiBubHMhIHVuYXJ5RXhwcmVzc2lvblswXQorICAgIHwgICBERUNeIG5scyEgdW5hcnlFeHByZXNzaW9uWzBdCisgICAgfCAgIE1JTlVTXiAgIHsjTUlOVVMuc2V0VHlwZShVTkFSWV9NSU5VUyk7fSAgIG5scyEgdW5hcnlFeHByZXNzaW9uWzBdIAorICAgIHwgICBQTFVTXiAgICB7I1BMVVMuc2V0VHlwZShVTkFSWV9QTFVTKTt9ICAgICBubHMhIHVuYXJ5RXhwcmVzc2lvblswXSAKKyAgICB8ICAgdW5hcnlFeHByZXNzaW9uTm90UGx1c01pbnVzW2xjX3N0bXRdCisgICAgOworCisvLyB+KEJOT1QpLyEoTE5PVCkvKHR5cGUgY2FzdGluZykgKGxldmVsIDEpCit1bmFyeUV4cHJlc3Npb25Ob3RQbHVzTWludXNbaW50IGxjX3N0bXRdCisgICAgOiAgIC8vQkFORF4gICAgeyNCQU5ELnNldFR5cGUoTUVNQkVSX1BPSU5URVJfREVGQVVMVCk7fSAgIG5scyEgIG5hbWVQYXJ0CisgICAgLy98CisgICAgICAgIEJOT1ReIG5scyEgdW5hcnlFeHByZXNzaW9uWzBdCisgICAgfCAgIExOT1ReIG5scyEgdW5hcnlFeHByZXNzaW9uWzBdCisgICAgfCAgICggICAvLyBzdWJydWxlIGFsbG93cyBvcHRpb24gdG8gc2h1dCBvZmYgd2FybmluZ3MKKyAgICAgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgICAgICAgICAvLyAiKGludCIgYW1iaWcgd2l0aCBwb3N0Zml4RXhwciBkdWUgdG8gbGFjayBvZiBzZXF1ZW5jZQorICAgICAgICAgICAgICAgICAgICAvLyBpbmZvIGluIGxpbmVhciBhcHByb3hpbWF0ZSBMTChrKS4gSXQncyBvay4gU2h1dCB1cC4KKyAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVBbWJpZ1dhcm5pbmdzPWZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICA6ICAgLy8gSWYgdHlwZWNhc3QgaXMgYnVpbHQgaW4gdHlwZSwgbXVzdCBiZSBudW1lcmljIG9wZXJhbmQKKyAgICAgICAgICAgIC8vIEhhdmUgdG8gYmFja3RyYWNrIHRvIHNlZSBpZiBvcGVyYXRvciBmb2xsb3dzCisgICAgICAgICAgICAvLyBGSVhNRTogREVDSURFOiBUaGlzIHN5bnRheCBpcyB3b3JteS4gIENhbiB3ZSBkZXByZWNhdGUgb3IgcmVtb3ZlPworICAgICAgICAgICAgKExQQVJFTiBidWlsdEluVHlwZVNwZWNbdHJ1ZV0gUlBBUkVOIHVuYXJ5RXhwcmVzc2lvblswXSk9PgorICAgICAgICAgICAgbHBiOkxQQVJFTl4geyNscGIuc2V0VHlwZShUWVBFQ0FTVCk7fSBidWlsdEluVHlwZVNwZWNbdHJ1ZV0gUlBBUkVOIQorICAgICAgICAgICAgdW5hcnlFeHByZXNzaW9uWzBdCisKKyAgICAgICAgICAgIC8vIEhhdmUgdG8gYmFja3RyYWNrIHRvIHNlZSBpZiBvcGVyYXRvciBmb2xsb3dzLiBJZiBubyBvcGVyYXRvcgorICAgICAgICAgICAgLy8gZm9sbG93cywgaXQncyBhIHR5cGVjYXN0LiBObyBzZW1hbnRpYyBjaGVja2luZyBuZWVkZWQgdG8gcGFyc2UuCisgICAgICAgICAgICAvLyBpZiBpdCBfbG9va3NfIGxpa2UgYSBjYXN0LCBpdCBfaXNfIGEgY2FzdDsgZWxzZSBpdCdzIGEgIihleHByKSIKKyAgICAgICAgICAgIC8vIEZJWE1FOiBERUNJREU6IFRoaXMgc3ludGF4IGlzIHdvcm15LiAgQ2FuIHdlIGRlcHJlY2F0ZSBvciByZW1vdmU/CisgICAgICAgICAgICAvLyBUT0RPOiAgUmV3b3JrIHRoaXMgbWVzcyBmb3IgR3Jvb3Z5LgorICAgICAgICB8ICAgKExQQVJFTiBjbGFzc1R5cGVTcGVjW3RydWVdIFJQQVJFTiB1bmFyeUV4cHJlc3Npb25Ob3RQbHVzTWludXNbMF0pPT4KKyAgICAgICAgICAgIGxwOkxQQVJFTl4geyNscC5zZXRUeXBlKFRZUEVDQVNUKTt9IGNsYXNzVHlwZVNwZWNbdHJ1ZV0gUlBBUkVOIQorICAgICAgICAgICAgdW5hcnlFeHByZXNzaW9uTm90UGx1c01pbnVzWzBdCisKKyAgICAgICAgfCAgIHBvc3RmaXhFeHByZXNzaW9uW2xjX3N0bXRdCisgICAgICAgICkKKyAgICA7CisKKy8vIHF1YWxpZmllZCBuYW1lcywgYXJyYXkgZXhwcmVzc2lvbnMsIG1ldGhvZCBpbnZvY2F0aW9uLCBwb3N0IGluYy9kZWMKK3Bvc3RmaXhFeHByZXNzaW9uW2ludCBsY19zdG10XQorICAgIDoKKyAgICAgICAgcGF0aEV4cHJlc3Npb25bbGNfc3RtdF0KKyAgICAgICAgKAorICAgICAgICAgICAgb3B0aW9ucyB7Z3JlZWR5PXRydWU7fSA6CisgICAgICAgICAgICAvLyBwb3NzaWJseSBhZGQgb24gYSBwb3N0LWluY3JlbWVudCBvciBwb3N0LWRlY3JlbWVudC4KKyAgICAgICAgICAgIC8vIGFsbG93cyBJTkMvREVDIG9uIHRvbyBtdWNoLCBidXQgc2VtYW50aWNzIGNhbiBjaGVjaworICAgICAgICAgICAgaW46SU5DXiB7I2luLnNldFR5cGUoUE9TVF9JTkMpO30KKyAgICAgICAgfCAgIGRlOkRFQ14geyNkZS5zZXRUeXBlKFBPU1RfREVDKTt9CisgICAgICAgICk/CisgICAgOworICAgIAorLy8gVE9ETzogIE1vdmUgcGF0aEV4cHJlc3Npb24gdG8gdGhpcyBwb2ludCBpbiB0aGUgZmlsZS4KKworLy8gdGhlIGJhc2ljIGVsZW1lbnQgb2YgYW4gZXhwcmVzc2lvbgorcHJpbWFyeUV4cHJlc3Npb24KKyAgICA6ICAgSURFTlQKKyAgICAgICAgLypPQlMqICAvL2tleXdvcmRzIGNhbiBmb2xsb3cgZG90IGluIEdyb292eTsgbm8gbmVlZCBmb3IgdGhpcyBzcGVjaWFsIGNhc2UKKyAgICAgICAgKCBvcHRpb25zIHtncmVlZHk9dHJ1ZTt9IDogRE9UXiAiY2xhc3MiICk/CisgICAgICAgICpPQlMqLworICAgIHwgICBjb25zdGFudAorICAgIHwgICBuZXdFeHByZXNzaW9uCisgICAgfCAgICJ0aGlzIgorICAgIHwgICAic3VwZXIiCisgICAgfCAgIHBhcmVudGhlc2l6ZWRFeHByZXNzaW9uICAgICAgICAgICAgIC8vIChnZW5lcmFsIHN0dWZmLi4uKQorICAgIHwgICBjbG9zYWJsZUJsb2NrQ29uc3RydWN0b3JFeHByZXNzaW9uCisgICAgfCAgIGxpc3RPck1hcENvbnN0cnVjdG9yRXhwcmVzc2lvbgorICAgIHwgICBzdHJpbmdDb25zdHJ1Y3RvckV4cHJlc3Npb24gICAgICAgICAvLyAiZm9vICRiYXIgYmF6IjsgcHJlc2VudGVkIGFzIG11bHRpcGxlIHRva2VucworLy9kZXByZWNhdGVkICAgIHwgICBzY29wZUVzY2FwZUV4cHJlc3Npb24gICAgICAgICAgICAgICAvLyAkeAorICAgIHwgICBidWlsdEluVHlwZQorICAgIC8qT0JTKiAgLy9jbGFzcyBuYW1lcyB3b3JrIGZpbmUgYXMgZXhwcmVzc2lvbnMKKyAgICAgICAgICAgIC8vIGxvb2sgZm9yIGludC5jbGFzcyBhbmQgaW50W10uY2xhc3MKKyAgICB8ICAgYnQ6YnVpbHRJblR5cGUhCisgICAgICAgIGRlY2xhcmF0b3JCcmFja2V0c1tidF0KKyAgICAgICAgRE9UXiBubHMhICJjbGFzcyIKKyAgICAqT0JTKi8KKyAgICA7CisKKy8vIE5vdGU6ICBUaGlzIGlzIGd1YXJhbnRlZWQgdG8gYmUgYW4gRVhQUiBBU1QuCisvLyBUaGF0IGlzLCBwYXJlbnRoZXNlcyBhcmUgcHJlc2VydmVkLCBpbiBjYXNlIHRoZSB3YWxrZXIgY2FyZXMgYWJvdXQgdGhlbS4KKy8vIFRoZXkgYXJlIHNpZ25pZmljYW50IHNvbWV0aW1lcywgYXMgaW4gKGYoeCkpe3l9IHZzLiBmKHgpe3l9LgorcGFyZW50aGVzaXplZEV4cHJlc3Npb24geyBUb2tlbiBmaXJzdCA9IExUKDEpOyBib29sZWFuIGhhc0Nsb3N1cmVMaXN0PWZhbHNlOyB9CisgICAgOiAgIExQQVJFTiEgCisgICAgICAgICAgIHN0cmljdENvbnRleHRFeHByZXNzaW9uCisgICAgICAgICAgIChTRU1JISAgCisgICAgICAgICAgICAge2hhc0Nsb3N1cmVMaXN0PXRydWU7fQorICAgICAgICAgICAgIChzdHJpY3RDb250ZXh0RXhwcmVzc2lvbiB8IHsgYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULGFzdEZhY3RvcnkuY3JlYXRlKEVNUFRZX1NUQVQsICJFTVBUWV9TVEFUIikpOyB9KSAgCisgICAgICAgICAgICkqCisgICAgICAgIFJQQVJFTiEKKyAgICAgICAgeworICAgICAgICAJaWYgKGhhc0Nsb3N1cmVMaXN0KSB7CisgICAgICAgIAkJI3BhcmVudGhlc2l6ZWRFeHByZXNzaW9uID0gIyhjcmVhdGUoQ0xPU1VSRV9MSVNULCJDTE9TVVJFX0xJU1QiLGZpcnN0LExUKDEpKSwjcGFyZW50aGVzaXplZEV4cHJlc3Npb24pOworICAgICAgICAJfQorICAgICAgICB9CisgICAgOworCisvKiogVGhpbmdzIHRoYXQgY2FuIHNob3cgdXAgYXMgZXhwcmVzc2lvbnMsIGJ1dCBvbmx5IGluIHN0cmljdAorICogIGNvbnRleHRzIGxpa2UgaW5zaWRlIHBhcmVudGhlc2VzLCBhcmd1bWVudCBsaXN0cywgYW5kIGxpc3QgY29uc3RydWN0b3JzLgorICovCitzdHJpY3RDb250ZXh0RXhwcmVzc2lvbiAge1Rva2VuIGZpcnN0ID0gTFQoMSk7fQorICAgIDoKKyAgICAgICAgKCAgIChkZWNsYXJhdGlvblN0YXJ0KT0+CisgICAgICAgICAgICBzaW5nbGVEZWNsYXJhdGlvbiAgLy8gdXNlZCBmb3IgYm90aCBiaW5kaW5nIGFuZCB2YWx1ZSwgYXM6IHdoaWxlIChTdHJpbmcgeHggPSBuZXh0bG4oKSkgeyBwcmludGxuIHh4IH0KKyAgICAgICAgfCAgIGV4cHJlc3Npb25bMF0KKyAgICAgICAgfCAgIGJyYW5jaFN0YXRlbWVudCAvLyB1c2VmdWwgdG8gZW1iZWQgaW5zaWRlIGV4cHJlc3Npb25zIChjZi4gQysrIHRocm93KQorICAgICAgICB8ICAgYW5ub3RhdGlvbiAgICAgIC8vIGNyZWF0ZXMgYW4gYW5ub3RhdGlvbiB2YWx1ZQorICAgICAgICApCisgICAgICAgIC8vIEZvciB0aGUgc2FrZSBvZiB0aGUgQVNUIHdhbGtlciwgbWFyayBub2RlcyBsaWtlIHRoaXMgdmVyeSBjbGVhcmx5LgorICAgICAgICB7I3N0cmljdENvbnRleHRFeHByZXNzaW9uID0gIyhjcmVhdGUoRVhQUiwiRVhQUiIsZmlyc3QsTFQoMSkpLCNzdHJpY3RDb250ZXh0RXhwcmVzc2lvbik7fQorICAgIDsKKyAgICAKK2Fzc2lnbm1lbnRMZXNzRXhwcmVzc2lvbiAge1Rva2VuIGZpcnN0ID0gTFQoMSk7fQorICAgIDoKKyAgICAgICAgKCAgIGNvbmRpdGlvbmFsRXhwcmVzc2lvblswXQorICAgICAgICApCisgICAgICAgIC8vIEZvciB0aGUgc2FrZSBvZiB0aGUgQVNUIHdhbGtlciwgbWFyayBub2RlcyBsaWtlIHRoaXMgdmVyeSBjbGVhcmx5LgorICAgICAgICB7I2Fzc2lnbm1lbnRMZXNzRXhwcmVzc2lvbiA9ICMoY3JlYXRlKEVYUFIsIkVYUFIiLGZpcnN0LExUKDEpKSwjYXNzaWdubWVudExlc3NFeHByZXNzaW9uKTt9CisgICAgOworCisKK2Nsb3NhYmxlQmxvY2tDb25zdHJ1Y3RvckV4cHJlc3Npb24KKyAgICA6ICAgY2xvc2FibGVCbG9jaworICAgIDsKKworLy8gR3Jvb3Z5IHN5bnRheCBmb3IgIiR4ICR5IiBvciAvJHggJHkvLgorc3RyaW5nQ29uc3RydWN0b3JFeHByZXNzaW9uICB7VG9rZW4gZmlyc3QgPSBMVCgxKTt9CisgICAgOiAgIGNzOlNUUklOR19DVE9SX1NUQVJUCisgICAgICAgIHsgI2NzLnNldFR5cGUoU1RSSU5HX0xJVEVSQUwpOyB9CisKKyAgICAgICAgc3RyaW5nQ29uc3RydWN0b3JWYWx1ZVBhcnQKKworICAgICAgICAoICAgY206U1RSSU5HX0NUT1JfTUlERExFCisgICAgICAgICAgICB7ICNjbS5zZXRUeXBlKFNUUklOR19MSVRFUkFMKTsgfQorICAgICAgICAgICAgc3RyaW5nQ29uc3RydWN0b3JWYWx1ZVBhcnQKKyAgICAgICAgKSoKKworICAgICAgICBjZTpTVFJJTkdfQ1RPUl9FTkQKKyAgICAgICAgeyAjY2Uuc2V0VHlwZShTVFJJTkdfTElURVJBTCk7CisgICAgICAgICAgI3N0cmluZ0NvbnN0cnVjdG9yRXhwcmVzc2lvbiA9CisgICAgICAgICAgICAjKGNyZWF0ZShTVFJJTkdfQ09OU1RSVUNUT1IsIlNUUklOR19DT05TVFJVQ1RPUiIsZmlyc3QsTFQoMSkpLCBzdHJpbmdDb25zdHJ1Y3RvckV4cHJlc3Npb24pOworICAgICAgICB9CisgICAgOworCitzdHJpbmdDb25zdHJ1Y3RvclZhbHVlUGFydAorICAgIDoKKyAgICAoICAgaWRlbnRpZmllcgorICAgIHwgICBvcGVuT3JDbG9zYWJsZUJsb2NrCisgICAgKQorICAgIDsKKworLyoqCisgKiBBIGxpc3QgY29uc3RydWN0b3IgaXMgYSBhcmd1bWVudCBsaXN0IGVuY2xvc2VkIGluIHNxdWFyZSBicmFja2V0cywgd2l0aG91dCBsYWJlbHMuCisgKiBBbnkgYXJndW1lbnQgY2FuIGJlIGRlY29yYXRlZCB3aXRoIGEgc3ByZWFkIG9wZXJhdG9yICgqeCksIGJ1dCBub3QgYSBsYWJlbCAoYTp4KS4KKyAqIEV4YW1wbGVzOiAgW10sIFsxXSwgWzEsMl0sIFsxLCpsMSwyXSwgWypsMSwqbDJdLgorICogKFRoZSBsMSwgbDIgbXVzdCBiZSBhIHNlcXVlbmNlIG9yIG51bGwuKQorICogPHA+CisgKiBBIG1hcCBjb25zdHJ1Y3RvciBpcyBhbiBhcmd1bWVudCBsaXN0IGVuY2xvc2VkIGluIHNxdWFyZSBicmFja2V0cywgd2l0aCBsYWJlbHMgZXZlcnl3aGVyZSwKKyAqIGV4Y2VwdCBvbiBzcHJlYWQgYXJndW1lbnRzLCB3aGljaCBzdGFuZCBmb3Igd2hvbGUgbWFwcyBzcGxpY2VkIGluLgorICogQSBjb2xvbiBhbG9uZSBiZXR3ZWVuIHRoZSBicmFja2V0cyBhbHNvIGZvcmNlcyB0aGUgZXhwcmVzc2lvbiB0byBiZSBhbiBlbXB0eSBtYXAgY29uc3RydWN0b3IuCisgKiBFeGFtcGxlczogWzpdLCBbYToxXSwgW2E6MSxiOjJdLCBbYToxLCo6bTEsYjoyXSwgWyo6bTEsKjptMl0KKyAqIChUaGUgbTEsIG0yIG11c3QgYmUgYSBtYXAgb3IgbnVsbC4pCisgKiBWYWx1ZXMgYXNzb2NpYXRlZCB3aXRoIGlkZW50aWNhbCBrZXlzIG92ZXJ3cml0ZSBmcm9tIGxlZnQgdG8gcmlnaHQ6CisgKiBbYToxLGE6Ml0gID09PSAgW2E6Ml0KKyAqIDxwPgorICogU29tZSBtYWxmb3JtZWQgY29uc3RydWN0b3IgZXhwcmVzc2lvbnMgYXJlIG5vdCBkZXRlY3RlZCBpbiB0aGUgcGFyc2VyLCBidXQgaW4gYSBwb3N0LXBhc3MuCisgKiBCYWQgZXhhbXBsZXM6IFsxLGI6Ml0sIFthOjEsMl0sIFs6MV0uCisgKiAoTm90ZSB0aGF0IG1ldGhvZCBjYWxsIGFyZ3VtZW50cywgYnkgY29udHJhc3QsIGNhbiBiZSBhIG1peCBvZiBrZXl3b3JkZWQgYW5kIG5vbi1rZXl3b3JkZWQgYXJndW1lbnRzLikKKyAqLworLy8gVGhlIHBhcnNlciBhbGxvd3MgYSBtaXggb2YgbGFiZWxlZCBhbmQgdW5sYWJlbGVkIGFyZ3VtZW50cywgYnV0IHRoZXJlIG11c3QgYmUgYSBzZW1hbnRpYyBjaGVjayB0aGF0CisvLyB0aGUgYXJndW1lbnRzIGFyZSBhbGwgbGFiZWxlZCAob3IgU1BSRUFEX01BUF9BUkcpIG9yIGFsbCB1bmxhYmVsZWQgKGFuZCBub3QgU1BSRUFEX01BUF9BUkcpLgorbGlzdE9yTWFwQ29uc3RydWN0b3JFeHByZXNzaW9uCisgICAgICAgIHsgYm9vbGVhbiBoYXNMYWJlbHMgPSBmYWxzZTsgfQorICAgIDogICBsY29uOkxCUkFDS14KKyAgICAgICAgYXJnTGlzdCAgICAgICAgICAgICAgICAgeyBoYXNMYWJlbHMgfD0gYXJnTGlzdEhhc0xhYmVsczsgIH0gIC8vIGFueSBhcmd1bWVudCBsYWJlbCBpbXBsaWVzIGEgbWFwCisgICAgICAgIFJCUkFDSyEKKyAgICAgICAgeyAjbGNvbi5zZXRUeXBlKGhhc0xhYmVscyA/IE1BUF9DT05TVFJVQ1RPUiA6IExJU1RfQ09OU1RSVUNUT1IpOyB9CisgICAgfAorICAgICAgICAvKiBTcGVjaWFsIGNhc2U6ICBbOl0gaXMgYW4gZW1wdHkgbWFwIGNvbnN0cnVjdG9yLiAqLworICAgICAgICBlbWNvbjpMQlJBQ0teIENPTE9OISBSQlJBQ0shICAgeyNlbWNvbi5zZXRUeXBlKE1BUF9DT05TVFJVQ1RPUik7fQorICAgIDsKKworLypPQlMqCisvKiogTWF0Y2ggYSwgYS5iLmMgcmVmcywgYS5iLmMoLi4uKSByZWZzLCBhLmIuY1tdLCBhLmIuY1tdLmNsYXNzLAorICogIGFuZCBhLmIuYy5jbGFzcyByZWZzLiBBbHNvIHRoaXMoLi4uKSBhbmQgc3VwZXIoLi4uKS4gTWF0Y2gKKyAqICB0aGlzIG9yIHN1cGVyLgorICovCisvKk9CUyoKK2lkZW50UHJpbWFyeQorICAgIDogICAodGExOnR5cGVBcmd1bWVudHMhKT8KKyAgICAgICAgSURFTlQKKyAgICAgICAgLy8gU3ludGF4IGZvciBtZXRob2QgaW52b2NhdGlvbiB3aXRoIHR5cGUgYXJndW1lbnRzIGlzCisgICAgICAgIC8vIDxTdHJpbmc+Zm9vKCJibGFoIikKKyAgICAgICAgKAorICAgICAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICAgICAgLy8gLmlkZW50IGNvdWxkIG1hdGNoIGhlcmUgb3IgaW4gcG9zdGZpeEV4cHJlc3Npb24uCisgICAgICAgICAgICAgICAgLy8gV2UgZG8gd2FudCB0byBtYXRjaCBoZXJlLiBUdXJuIG9mZiB3YXJuaW5nLgorICAgICAgICAgICAgICAgIGdyZWVkeT10cnVlOworICAgICAgICAgICAgICAgIC8vIFRoaXMgdHVybnMgdGhlIGFtYmlndWl0eSB3YXJuaW5nIG9mIHRoZSBzZWNvbmQgYWx0ZXJuYXRpdmUKKyAgICAgICAgICAgICAgICAvLyBvZmYuIFNlZSBiZWxvdy4gKFRoZSAiQU5UTFJfTE9PUF9FWElUIiBwcmVkaWNhdGUgbWFrZXMgaXQgbm9uLWlzc3VlKQorICAgICAgICAgICAgICAgIHdhcm5XaGVuRm9sbG93QW1iaWc9ZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyB3ZSBoYXZlIGEgbmV3IG5vbmRldGVybWluaXNtIGJlY2F1c2Ugb2YKKyAgICAgICAgICAgIC8vIHR5cGVBcmd1bWVudHMuLi4gb25seSBhIHN5bnRhY3RpYyBwcmVkaWNhdGUgd2lsbCBoZWxwLi4uCisgICAgICAgICAgICAvLyBUaGUgcHJvYmxlbSBpcyB0aGF0IHRoaXMgbG9vcCBoZXJlIGNvbmZsaWN0cyB3aXRoCisgICAgICAgICAgICAvLyBET1QgdHlwZUFyZ3VtZW50cyAic3VwZXIiIGluIHBvc3RmaXhFeHByZXNzaW9uIChrPTIpCisgICAgICAgICAgICAvLyBBIHByb3BlciBzb2x1dGlvbiB3b3VsZCByZXF1aXJlIGEgbG90IG9mIHJlZmFjdG9yaW5nLi4uCisgICAgICAgIDogICAoRE9UICh0eXBlQXJndW1lbnRzKT8gSURFTlQpID0+CisgICAgICAgICAgICBET1ReICh0YTI6dHlwZUFyZ3VtZW50cyEpPyBJREVOVAorICAgICAgICB8ICAge0FOVExSX0xPT1BfRVhJVH0/ICAvLyhzZWUgZG9jdW1lbnRhdGlvbiBhYm92ZSkKKyAgICAgICAgKSoKKyAgICAgICAgKAorICAgICAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICAgICAgLy8gQVJSQVlfREVDTEFSQVRPUiBoZXJlIGNvbmZsaWN0cyB3aXRoIElOREVYX09QIGluCisgICAgICAgICAgICAgICAgLy8gcG9zdGZpeEV4cHJlc3Npb24gb24gTEJSQUNLIFJCUkFDSy4KKyAgICAgICAgICAgICAgICAvLyBXZSB3YW50IHRvIG1hdGNoIFtdIGhlcmUsIHNvIGdyZWVkeS4gVGhpcyBvdmVyY29tZXMKKyAgICAgICAgICAgICAgICAvLyBsaW1pdGF0aW9uIG9mIGxpbmVhciBhcHByb3hpbWF0ZSBsb29rYWhlYWQuCisgICAgICAgICAgICAgICAgZ3JlZWR5PXRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIDogICAoICAgbHA6TFBBUkVOXiB7I2xwLnNldFR5cGUoTUVUSE9EX0NBTEwpO30KKyAgICAgICAgICAgICAgICAvLyBpZiB0aGUgaW5wdXQgaXMgdmFsaWQsIG9ubHkgdGhlIGxhc3QgSURFTlQgbWF5CisgICAgICAgICAgICAgICAgLy8gaGF2ZSBwcmVjZWRpbmcgdHlwZUFyZ3VtZW50cy4uLiByYXRoZXIgaGFja3ksIHRoaXMgaXMuLi4KKyAgICAgICAgICAgICAgICB7aWYgKCN0YTIgIT0gbnVsbCkgYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCAjdGEyKTt9CisgICAgICAgICAgICAgICAge2lmICgjdGEyID09IG51bGwpIGFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgI3RhMSk7fQorICAgICAgICAgICAgICAgIGFyZ0xpc3QgUlBBUkVOIQorICAgICAgICAgICAgKQorICAgICAgICB8ICAgKCAgICBvcHRpb25zIHtncmVlZHk9dHJ1ZTt9IDoKKyAgICAgICAgICAgICAgICBsYmM6TEJSQUNLXiB7I2xiYy5zZXRUeXBlKEFSUkFZX0RFQ0xBUkFUT1IpO30gUkJSQUNLIQorICAgICAgICAgICAgKSsKKyAgICAgICAgKT8KKyAgICA7CisqT0JTKi8KKworLyoqIG9iamVjdCBpbnN0YW50aWF0aW9uLgorICogIFRyZWVzIGFyZSBidWlsdCBhcyBpbGx1c3RyYXRlZCBieSB0aGUgZm9sbG93aW5nIGlucHV0L3RyZWUgcGFpcnM6CisgKgorICogIG5ldyBUKCkKKyAqCisgKiAgbmV3CisgKiAgIHwKKyAqICAgVCAtLSAgRUxJU1QKKyAqICAgICAgICAgICAgICAgICB8CisgKiAgICAgICAgICAgICAgICBhcmcxIC0tIGFyZzIgLS0gLi4gLS0gYXJnbgorICoKKyAqICBuZXcgaW50W10KKyAqCisgKiAgbmV3CisgKiAgIHwKKyAqICBpbnQgLS0gQVJSQVlfREVDTEFSQVRPUgorICoKKyAqICBuZXcgaW50W10gezEsMn0KKyAqCisgKiAgbmV3CisgKiAgIHwKKyAqICBpbnQgLS0gQVJSQVlfREVDTEFSQVRPUiAtLSBBUlJBWV9JTklUCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhQUiAtLSBFWFBSCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgfAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAyCisgKgorICogIG5ldyBpbnRbM10KKyAqICBuZXcKKyAqICAgfAorICogIGludCAtLSBBUlJBWV9ERUNMQVJBVE9SCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgRVhQUgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKKyAqCisgKiAgbmV3IGludFsxXVsyXQorICoKKyAqICBuZXcKKyAqICAgfAorICogIGludCAtLSBBUlJBWV9ERUNMQVJBVE9SCisgKiAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICAgICAgICAgICAgIEFSUkFZX0RFQ0xBUkFUT1IgLS0gRVhQUgorICogICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICBFWFBSICAgICAgICAgICAgICAgICAgICAxCisgKiAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAyCisgKgorICovCituZXdFeHByZXNzaW9uCisgICAgOiAgICJuZXciXiBubHMhICh0eXBlQXJndW1lbnRzKT8gdHlwZQorICAgICAgICAoICAgbmxzIQorICAgICAgICAgICAgbWNhOm1ldGhvZENhbGxBcmdzW251bGxdIQorCisgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgb3B0aW9ucyB7IGdyZWVkeT10cnVlOyB9OgorICAgICAgICAgICAgICAgIGFwYjE6YXBwZW5kZWRCbG9ja1sjbWNhXSEKKyAgICAgICAgICAgICAgICB7ICNtY2EgPSAjYXBiMTsgfQorICAgICAgICAgICAgKT8KKworICAgICAgICAgICAgeyNuZXdFeHByZXNzaW9uLmFkZENoaWxkKCNtY2EuZ2V0Rmlyc3RDaGlsZCgpKTt9CisKKyAgICAgICAgLy98ICAKKyAgICAgICAgLy9mcm9tIGJsYWNrcmFnOiBuZXcgT2JqZWN0LmZ7fSBtYXRjaGVzIHRoaXMgcGFydCBoZXJlCisgICAgICAgIC8vYW5kIHRoYXQgc2hvdWxkbid0IGhhcHBlbiB1bmxlc3Mgd2UgZGVjaWRlIHRvIHN1cHBvcnQKKyAgICAgICAgLy90aGlzIGtpbmQgb2YgT2JqZWN0IGluaXRpYWxpemF0aW9uICAgICAgICAKKyAgICAgICAgICAgIC8vYXBiOmFwcGVuZGVkQmxvY2tbbnVsbF0hCisgICAgICAgICAgICAvLyBGSVhNRTogIFRoaXMgbm9kZSBnZXRzIGRyb3BwZWQsIHNvbWVob3cuCisKKyAgICAgICAgICAgIC8veyNuZXdFeHByZXNzaW9uLmFkZENoaWxkKCNhcGIuZ2V0Rmlyc3RDaGlsZCgpKTt9CisKKyAgICAgICAgICAgIC8vVE9ETyAtIE5ZSSogKGFub255bW91c0lubmVyQ2xhc3NCbG9jayk/ICpOWUkKKworICAgICAgICAgICAgLy9qYXZhIDEuMQorICAgICAgICAgICAgLy8gTm90ZTogVGhpcyB3aWxsIGFsbG93IGJhZCBjb25zdHJ1Y3RzIGxpa2UKKyAgICAgICAgICAgIC8vICAgICAgbmV3IGludFs0XVtdWzNdIHtleHAsZXhwfS4KKyAgICAgICAgICAgIC8vICAgICAgVGhlcmUgbmVlZHMgdG8gYmUgYSBzZW1hbnRpYyBjaGVjayBoZXJlLi4uCisgICAgICAgICAgICAvLyB0byBtYWtlIHN1cmU6CisgICAgICAgICAgICAvLyAgIGEpIFsgZXhwciBdIGFuZCBbIF0gYXJlIG5vdCBtaXhlZAorICAgICAgICAgICAgLy8gICBiKSBbIGV4cHIgXSBhbmQgYW4gaW5pdCBhcmUgbm90IHVzZWQgdG9nZXRoZXIKKyAgICAgICAgfCAgIG5ld0FycmF5RGVjbGFyYXRvciAvLyhhcnJheUluaXRpYWxpemVyKT8KKyAgICAgICAgICAgIC8vIEdyb292eSBkb2VzIG5vdCBzdXBwb3J0IEphdmEgc3ludGF4IGZvciBpbml0aWFsaXplZCBuZXcgYXJyYXlzLgorICAgICAgICAgICAgLy8gVXNlIHNlcXVlbmNlIGNvbnN0cnVjdG9ycyBpbnN0ZWFkLgorCisgICAgICAgICkKKyAgICAgICAgLy8gREVDSURFOiAgS2VlcCAnbmV3IHgoKScgc3ludGF4PworICAgIDsKKworLypOWUkqCithbm9ueW1vdXNJbm5lckNsYXNzQmxvY2sKKyAgICA6ICAgY2xhc3NCbG9jaworICAgIDsKKypOWUkqLworCithcmdMaXN0CisgICAgeworICAgIAlUb2tlbiBmaXJzdCA9IExUKDEpOyAKKyAgICAJVG9rZW4gbGFzdENvbW1hID0gbnVsbDsKKyAgICAJaW50IGhscz0wLCBobHMyPTA7IAorICAgIAlib29sZWFuIGhhc0Nsb3N1cmVMaXN0PWZhbHNlOworICAgIAlib29sZWFuIHRyYWlsaW5nQ29tbWE9ZmFsc2U7IAorICAgCX0KKyAgICA6CQorICAgICAgICAvLyBOb3RlOiAgbmxzIG5vdCBuZWVkZWQsIHNpbmNlIHdlIGFyZSBpbnNpZGUgcGFyZW5zLAorICAgICAgICAvLyBhbmQgdGhvc2UgaW5zaWduaWZpY2FudCBuZXdsaW5lcyBhcmUgc3VwcHJlc3NlZCBieSB0aGUgbGV4ZXIuCisgICAgCShobHM9YXJndW1lbnQKKyAgICAJKCggCisgICAgCQkoCisgICAgCQkJU0VNSSEge2hhc0Nsb3N1cmVMaXN0PXRydWU7fQorICAgIAkJCSgKKyAgICAJCQkJc3RyaWN0Q29udGV4dEV4cHJlc3Npb24KKyAgICAJCQkJfCB7IGFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCxhc3RGYWN0b3J5LmNyZWF0ZShFTVBUWV9TVEFULCAiRU1QVFlfU1RBVCIpKTsgfQorICAgIAkJCSkKKyAgICAJCSkrCisgICAgCQl7I2FyZ0xpc3QgPSAjKGNyZWF0ZShDTE9TVVJFX0xJU1QsIkNMT1NVUkVfTElTVCIsZmlyc3QsTFQoMSkpLCNhcmdMaXN0KTt9CisgICAgCSkgfCAoCQorICAgIAkJCSggICB7bGFzdENvbW1hID0gTFQoMSk7fQorICAgICAgICAJICAJCUNPTU1BISAKKyAgICAgICAgCSAgCQkoCisgICAgICAgIAkgIAkJCShobHMyPWFyZ3VtZW50IHtobHMgfD0gaGxzMjt9KQorICAgICAgICAJICAJCQl8CisgICAgICAgIAkgIAkJCSgKKyAgICAgICAgCSAgCQkJIHsgIGlmICh0cmFpbGluZ0NvbW1hKSB0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24obGFzdENvbW1hLCBnZXRGaWxlbmFtZSgpKTsKKyAgICAgICAgCSAgCQkJIAl0cmFpbGluZ0NvbW1hPXRydWU7CisgICAgICAgIAkgIAkJCSB9CisgICAgICAgIAkgIAkJCSkKKyAgICAgICAgCSAgCQkpCSAKKyAgICAgICAgCSAgCQkJCisgICAgICAgIAkJKSoKKyAgICAJICAgICAgICB7I2FyZ0xpc3QgPSAjKGNyZWF0ZShFTElTVCwiRUxJU1QiLGZpcnN0LExUKDEpKSwgYXJnTGlzdCk7fQorCSAgICAgICAgKQorICAgIAkpIHwgKAorCQkJeyNhcmdMaXN0ID0gY3JlYXRlKEVMSVNULCJFTElTVCIsZmlyc3QsTFQoMSkpO30KKyAgICAJKQorICAgIAkpCQorICAgIAl7YXJnTGlzdEhhc0xhYmVscyA9IChobHMmMSkhPTA7IH0KKyAgICA7CisKKy8qKiBBIHNpbmdsZSBhcmd1bWVudCBpbiAoLi4uKSBvciBbLi4uXS4gIENvcnJlc3BvbmRzIHRvIHRvIGEgbWV0aG9kIG9yIGNsb3N1cmUgcGFyYW1ldGVyLgorICogIE1heSBiZSBsYWJlbGVkLiAgTWF5IGJlIG1vZGlmaWVkIGJ5IHRoZSBzcHJlYWQgb3BlcmF0b3IgJyonICgnKjonIGZvciBrZXl3b3JkcykuCisgKi8KK2FyZ3VtZW50CityZXR1cm5zIFtieXRlIGhhc0xhYmVsT3JTcHJlYWQgPSAwXQorICAgIDoKKyAgICAgICAgLy8gT3B0aW9uYWwgYXJndW1lbnQgbGFiZWwuCisgICAgICAgIC8vIFVzYWdlOiAgU3BlY2lmaWVzIGEgbWFwIGtleSwgb3IgYSBrZXl3b3JkZWQgYXJndW1lbnQuCisgICAgICAgICggICAoYXJndW1lbnRMYWJlbFN0YXJ0KSA9PgorICAgICAgICAgICAgYXJndW1lbnRMYWJlbCBjOkNPTE9OXiAgICAgICAgICB7I2Muc2V0VHlwZShMQUJFTEVEX0FSRyk7fQorCisgICAgICAgICAgICB7ICAgaGFzTGFiZWxPclNwcmVhZCB8PSAxOyAgfSAgLy8gc2lnbmFsIHRvIGNhbGxlciB0aGUgcHJlc2VuY2Ugb2YgYSBsYWJlbAorCisgICAgICAgIHwgICAvLyBTcHJlYWQgb3BlcmF0b3I6ICBmKCpbYSxiLGNdKSAgPT09ICBmKGEsYixjKTsgIGYoMSwqbnVsbCwyKSAgPT09ICBmKDEsMikuCisgICAgICAgICAgICBzcDpTVEFSXiAgICAgICAgICAgICAgICAgICAgICAgIHsjc3Auc2V0VHlwZShTUFJFQURfQVJHKTt9CisgICAgICAgICAgICB7ICAgaGFzTGFiZWxPclNwcmVhZCB8PSAyOyAgfSAgLy8gc2lnbmFsIHRvIGNhbGxlciB0aGUgcHJlc2VuY2Ugb2YgYSBzcHJlYWQgb3BlcmF0b3IKKyAgICAgICAgICAgIC8vIHNwcmVhZCBtYXBzIGFyZSBtYXJrZWQsIGFzIGYoKjptKSBmb3IgZihhOngsIGI6eSkgaWYgbT09W2E6eCwgYjp5XQorICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgIENPTE9OISAgICAgICAgICAgICAgICAgICAgICB7I3NwLnNldFR5cGUoU1BSRUFEX01BUF9BUkcpO30KKyAgICAgICAgICAgICAgICB7IGhhc0xhYmVsT3JTcHJlYWQgfD0gMTsgfSAgLy8gc2lnbmFsIHRvIGNhbGxlciB0aGUgcHJlc2VuY2Ugb2YgYSBsYWJlbAorICAgICAgICAgICAgKT8KKyAgICAgICAgKT8KKworICAgICAgICBzdHJpY3RDb250ZXh0RXhwcmVzc2lvbgorICAgICAgICB7CisgICAgICAgICAgICByZXF1aXJlKExBKDEpICE9IENPTE9OLAorICAgICAgICAgICAgICAgICJpbGxlZ2FsIGNvbG9uIGFmdGVyIGFyZ3VtZW50IGV4cHJlc3Npb24iLAorICAgICAgICAgICAgICAgICJhIGNvbXBsZXggbGFiZWwgZXhwcmVzc2lvbiBiZWZvcmUgYSBjb2xvbiBtdXN0IGJlIHBhcmVudGhlc2l6ZWQiKTsKKyAgICAgICAgfQorICAgIDsKKworLyoqIEEgbGFiZWwgZm9yIGFuIGFyZ3VtZW50IGlzIG9mIHRoZSBmb3JtIGE6YiwgJ2EnOmIsICJhIjpiLCAoYSk6YiwgZXRjLi4KKyAqICAgICAgVGhlIGxhYmVscyBpbiAoYTpiKSwgKCdhJzpiKSwgYW5kICgiYSI6YikgYXJlIGluIGFsbCB3YXlzIGVxdWl2YWxlbnQsCisgKiAgICAgIGV4Y2VwdCB0aGF0IHRoZSBxdW90ZXMgYWxsb3cgbW9yZSBzcGVsbGluZ3MuCisgKiAgRXF1aXZhbGVudCBkeW5hbWljYWxseSBjb21wdXRlZCBsYWJlbHMgYXJlICgoJ2EnKTpiKSBhbmQgKCIkeydhJ30iOmIpCisgKiAgYnV0IG5vdCAoKGEpOmIpIG9yICIkYSI6Yiwgc2luY2UgdGhlIGxhdHRlciBjYXNlcyBldmFsdWF0ZSAoYSkgYXMgYSBub3JtYWwgaWRlbnRpZmllci4KKyAqICAgICAgQm90dG9tIGxpbmU6ICBJZiB5b3Ugd2FudCBhIHRydWx5IHZhcmlhYmxlIGxhYmVsLCB1c2UgcGFyZW5zIGFuZCBzYXkgKChhKTpiKS4KKyAqLworYXJndW1lbnRMYWJlbAorICAgIDogICAoSURFTlQpID0+CisgICAgICAgIGlkOklERU5UICAgICAgICAgICAgICAgICAgeyNpZC5zZXRUeXBlKFNUUklOR19MSVRFUkFMKTt9ICAvLyBpZGVudGlmaWVycyBhcmUgc2VsZi1xdW90aW5nIGluIHRoaXMgY29udGV4dAorICAgIHwgICAoa2V5d29yZFByb3BlcnR5TmFtZXMpID0+CisgICAgICAgIGt3OmtleXdvcmRQcm9wZXJ0eU5hbWVzICAgeyNrdy5zZXRUeXBlKFNUUklOR19MSVRFUkFMKTt9ICAvLyBpZGVudGlmaWVycyBhcmUgc2VsZi1xdW90aW5nIGluIHRoaXMgY29udGV4dAorICAgIHwgICBwcmltYXJ5RXhwcmVzc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHluYW1pYyBleHByZXNzaW9uCisgICAgOworCisvKiogRm9yIGxvb2thaGVhZCBvbmx5LiAgRmFzdCBhcHByb3hpbWF0ZSBwYXJzZSBvZiBhbiBhcmd1bWVudExhYmVsIGZvbGxvd2VkIGJ5IGEgY29sb24uICovCithcmd1bWVudExhYmVsU3RhcnQhCisgICAgICAgIC8vIGFsbG93IG51bWJlciBhbmQgc3RyaW5nIGxpdGVyYWxzIGFzIGxhYmVscyBmb3IgbWFwcworICAgIDogICAoCisgICAgICAgICAgICBJREVOVCB8IGtleXdvcmRQcm9wZXJ0eU5hbWVzCisgICAgICAgIHwgICBjb25zdGFudE51bWJlciB8IFNUUklOR19MSVRFUkFMCisgICAgICAgIHwgICAoTFBBUkVOIHwgU1RSSU5HX0NUT1JfU1RBUlQpPT4gYmFsYW5jZWRCcmFja2V0cworICAgICAgICApCisgICAgICAgIENPTE9OCisgICAgOworCituZXdBcnJheURlY2xhcmF0b3IKKyAgICA6ICAgKAorICAgICAgICAgICAgLy8gQ09ORkxJQ1Q6CisgICAgICAgICAgICAvLyBuZXdFeHByZXNzaW9uIGlzIGEgcHJpbWFyeUV4cHJlc3Npb24gd2hpY2ggY2FuIGJlCisgICAgICAgICAgICAvLyBmb2xsb3dlZCBieSBhbiBhcnJheSBpbmRleCByZWZlcmVuY2UuIFRoaXMgaXMgb2ssCisgICAgICAgICAgICAvLyBhcyB0aGUgZ2VuZXJhdGVkIGNvZGUgd2lsbCBzdGF5IGluIHRoaXMgbG9vcCBhcworICAgICAgICAgICAgLy8gbG9uZyBhcyBpdCBzZWVzIGFuIExCUkFDSyAocHJvcGVyIGJlaGF2aW9yKQorICAgICAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICAgICAgd2FybldoZW5Gb2xsb3dBbWJpZyA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICA6CisgICAgICAgICAgICBsYjpMQlJBQ0teIHsjbGIuc2V0VHlwZShBUlJBWV9ERUNMQVJBVE9SKTt9CisgICAgICAgICAgICAgICAgKGV4cHJlc3Npb25bMF0pPworICAgICAgICAgICAgUkJSQUNLIQorICAgICAgICApKworICAgIDsKKworLyoqIE51bWVyaWMsIHN0cmluZywgcmVnZXhwLCBib29sZWFuLCBvciBudWxsIGNvbnN0YW50LiAqLworY29uc3RhbnQKKyAgICA6ICAgY29uc3RhbnROdW1iZXIKKyAgICB8ICAgU1RSSU5HX0xJVEVSQUwKKyAgICB8ICAgInRydWUiCisgICAgfCAgICJmYWxzZSIKKyAgICB8ICAgIm51bGwiCisgICAgOworCisvKiogTnVtZXJpYyBjb25zdGFudC4gKi8KK2NvbnN0YW50TnVtYmVyCisgICAgOiAgIE5VTV9JTlQKKyAgICB8ICAgTlVNX0ZMT0FUCisgICAgfCAgIE5VTV9MT05HCisgICAgfCAgIE5VTV9ET1VCTEUKKyAgICB8ICAgTlVNX0JJR19JTlQKKyAgICB8ICAgTlVNX0JJR19ERUNJTUFMCisgICAgOworCisvKiogRmFzdCBsb29rYWhlYWQgYWNyb3NzIGJhbGFuY2VkIGJyYWNrZXRzIG9mIGFsbCBzb3J0cy4gKi8KK2JhbGFuY2VkQnJhY2tldHMhCisgICAgOiAgIExQQVJFTiBiYWxhbmNlZFRva2VucyBSUEFSRU4KKyAgICB8ICAgTEJSQUNLIGJhbGFuY2VkVG9rZW5zIFJCUkFDSworICAgIHwgICBMQ1VSTFkgYmFsYW5jZWRUb2tlbnMgUkNVUkxZCisgICAgfCAgIFNUUklOR19DVE9SX1NUQVJUIGJhbGFuY2VkVG9rZW5zIFNUUklOR19DVE9SX0VORAorICAgIDsKKworYmFsYW5jZWRUb2tlbnMhCisgICAgOiAgICggICBiYWxhbmNlZEJyYWNrZXRzCisgICAgICAgIHwgICB+KExQQVJFTnxMQlJBQ0t8TENVUkxZIHwgU1RSSU5HX0NUT1JfU1RBUlQKKyAgICAgICAgICAgICB8UlBBUkVOfFJCUkFDS3xSQ1VSTFkgfCBTVFJJTkdfQ1RPUl9FTkQpCisgICAgICAgICkqCisgICAgOworCisvKiogQSBzdGF0ZW1lbnQgc2VwYXJhdG9yIGlzIGVpdGhlciBhIHNlbWljb2xvbiBvciBhIHNpZ25pZmljYW50IG5ld2xpbmUuIAorICogIEFueSBudW1iZXIgb2YgYWRkaXRpb25hbCAoaW5zaWduaWZpY2FudCkgbmV3bGluZXMgbWF5IGFjY29tcGFueSBpdC4KKyAqLworLy8gIChBbGwgdGhlICchJyBzaWducyBzaW1wbHkgc3VwcHJlc3MgdGhlIGRlZmF1bHQgQVNUIGJ1aWxkaW5nLikKKy8vICBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBzZXBhcmF0b3IgaW4gdGhpcy5zZXBUb2tlbiwgaW4gY2FzZSBpdCBtYXR0ZXJzLgorc2VwIQorICAgIDogICBTRU1JIQorICAgICAgICAob3B0aW9ucyB7IGdyZWVkeT10cnVlOyB9OiBOTFMhKSoKKyAgICAgICAgeyBzZXBUb2tlbiA9IFNFTUk7IH0KKyAgICB8ICAgTkxTISAgICAgICAgICAgICAgICAvLyB0aGlzIG5ld2xpbmUgaXMgc2lnbmlmaWNhbnQhCisgICAgICAgIHsgc2VwVG9rZW4gPSBOTFM7IH0KKyAgICAgICAgKAorICAgICAgICAgICAgb3B0aW9ucyB7IGdyZWVkeT10cnVlOyB9OgorICAgICAgICAgICAgU0VNSSEgICAgICAgICAgIC8vIHRoaXMgc3VwZXJmbHVvdXMgc2VtaWNvbG9uIGlzIGdvYmJsZWQKKyAgICAgICAgICAgIChvcHRpb25zIHsgZ3JlZWR5PXRydWU7IH06IE5MUyEpKgorICAgICAgICAgICAgeyBzZXBUb2tlbiA9IFNFTUk7IH0KKyAgICAgICAgKSoKKyAgICA7CisKKy8qKiBaZXJvIG9yIG1vcmUgaW5zaWduaWZpY2FudCBuZXdsaW5lcywgYWxsIGdvYmJsZWQgdXAgYW5kIHRocm93biBhd2F5LiAqLworbmxzIQorICAgIDoKKyAgICAgICAgKG9wdGlvbnMgeyBncmVlZHk9dHJ1ZTsgfTogTkxTISk/CisgICAgICAgIC8vIE5vdGU6ICBVc2UgJz8nIHJhdGhlciB0aGFuICcqJywgcmVseWluZyBvbiB0aGUgZmFjdCB0aGF0IHRoZSBsZXhlciBjb2xsYXBzZXMKKyAgICAgICAgLy8gYWRqYWNlbnQgTkxTIHRva2VucywgYWx3YXlzLiAgVGhpcyBsZXRzIHRoZSBwYXJzZXIgdXNlIGl0cyBMTCgzKSBsb29rYWhlYWQKKyAgICAgICAgLy8gdG8gInNlZSB0aHJvdWdoIiBzZXF1ZW5jZXMgb2YgbmV3bGluZXMuICBJZiB0aGVyZSB3ZXJlIGEgJyonIGhlcmUsIHRoZSBsb29rYWhlYWQKKyAgICAgICAgLy8gd291bGQgYmUgd2Vha2VyLCBzaW5jZSB0aGUgcGFyc2VyIHdvdWxkIGhhdmUgdG8gYmUgcHJlcGFyZWQgZm9yIGxvbmcgc2VxdWVuY2VzCisgICAgICAgIC8vIG9mIE5MUyB0b2tlbnMuCisgICAgOworCisvKiogWmVybyBvciBtb3JlIGluc2lnbmlmaWNhbnQgbmV3bGluZXMsIGFsbCBnb2JibGVkIHVwIGFuZCB0aHJvd24gYXdheSwKKyAqICBidXQgYSB3YXJuaW5nIG1lc3NhZ2UgaXMgbGVmdCBmb3IgdGhlIHVzZXIsIGlmIHRoZXJlIHdhcyBhIG5ld2xpbmUuCisgKi8KK25sc1dhcm4hCisgICAgOgorICAgICAgICAoICAgKE5MUyk9PgorICAgICAgICAgICAgeyBhZGRXYXJuaW5nKAorICAgICAgICAgICAgICAiQSBuZXdsaW5lIGF0IHRoaXMgcG9pbnQgZG9lcyBub3QgZm9sbG93IHRoZSBHcm9vdnkgQ29kaW5nIENvbnZlbnRpb25zLiIsCisgICAgICAgICAgICAgICJLZWVwIHRoaXMgc3RhdGVtZW50IG9uIG9uZSBsaW5lLCBvciB1c2UgY3VybHkgYnJhY2VzIHRvIGJyZWFrIGFjcm9zcyBtdWx0aXBsZSBsaW5lcy4iCisgICAgICAgICAgICApOyB9CisgICAgICAgICk/CisgICAgICAgIG5scyEKKyAgICA7CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUaGUgR3Jvb3Z5IHNjYW5uZXIKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY2xhc3MgR3Jvb3Z5TGV4ZXIgZXh0ZW5kcyBMZXhlcjsKKworb3B0aW9ucyB7CisgICAgZXhwb3J0Vm9jYWI9R3Jvb3Z5OyAgICAgICAgICAgICAvLyBjYWxsIHRoZSB2b2NhYnVsYXJ5ICJHcm9vdnkiCisgICAgdGVzdExpdGVyYWxzPWZhbHNlOyAgICAgICAgICAgICAvLyBkb24ndCBhdXRvbWF0aWNhbGx5IHRlc3QgZm9yIGxpdGVyYWxzCisgICAgaz00OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvdXIgY2hhcmFjdGVycyBvZiBsb29rYWhlYWQKKyAgICBjaGFyVm9jYWJ1bGFyeT0nXHUwMDAzJy4uJ1x1RkZGRic7CisgICAgLy8gd2l0aG91dCBpbmxpbmluZyBzb21lIGJpdHNldCB0ZXN0cywgY291bGRuJ3QgZG8gdW5pY29kZTsKKyAgICAvLyBJIG5lZWQgdG8gbWFrZSBBTlRMUiBnZW5lcmF0ZSBzbWFsbGVyIGJpdHNldHM7IHNlZQorICAgIC8vIGJvdHRvbSBvZiBHcm9vdnlMZXhlci5qYXZhCisgICAgY29kZUdlbkJpdHNldFRlc3RUaHJlc2hvbGQ9MjA7Cit9CisKK3sKKyAgICAvKiogZmxhZyBmb3IgZW5hYmxpbmcgdGhlICJhc3NlcnQiIGtleXdvcmQgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gYXNzZXJ0RW5hYmxlZCA9IHRydWU7CisgICAgLyoqIGZsYWcgZm9yIGVuYWJsaW5nIHRoZSAiZW51bSIga2V5d29yZCAqLworICAgIHByaXZhdGUgYm9vbGVhbiBlbnVtRW5hYmxlZCA9IHRydWU7CisgICAgLyoqIGZsYWcgZm9yIGluY2x1ZGluZyB3aGl0ZXNwYWNlIHRva2VucyAoZm9yIElERSBwcmVwYXJzaW5nKSAqLworICAgIHByaXZhdGUgYm9vbGVhbiB3aGl0ZXNwYWNlSW5jbHVkZWQgPSBmYWxzZTsKKworICAgIC8qKiBFbmFibGUgdGhlICJhc3NlcnQiIGtleXdvcmQgKi8KKyAgICBwdWJsaWMgdm9pZCBlbmFibGVBc3NlcnQoYm9vbGVhbiBzaG91bGRFbmFibGUpIHsgYXNzZXJ0RW5hYmxlZCA9IHNob3VsZEVuYWJsZTsgfQorICAgIC8qKiBRdWVyeSB0aGUgImFzc2VydCIga2V5d29yZCBzdGF0ZSAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQXNzZXJ0RW5hYmxlZCgpIHsgcmV0dXJuIGFzc2VydEVuYWJsZWQ7IH0KKyAgICAvKiogRW5hYmxlIHRoZSAiZW51bSIga2V5d29yZCAqLworICAgIHB1YmxpYyB2b2lkIGVuYWJsZUVudW0oYm9vbGVhbiBzaG91bGRFbmFibGUpIHsgZW51bUVuYWJsZWQgPSBzaG91bGRFbmFibGU7IH0KKyAgICAvKiogUXVlcnkgdGhlICJlbnVtIiBrZXl3b3JkIHN0YXRlICovCisgICAgcHVibGljIGJvb2xlYW4gaXNFbnVtRW5hYmxlZCgpIHsgcmV0dXJuIGVudW1FbmFibGVkOyB9CisKKyAgICAvKiogSW5jbHVkZSB3aGl0ZXNwYWNlIHRva2Vucy4gIE5vdGUgdGhhdCB0aGlzIGJyZWFrcyB0aGUgcGFyc2VyLiAgICovCisgICAgcHVibGljIHZvaWQgc2V0V2hpdGVzcGFjZUluY2x1ZGVkKGJvb2xlYW4geikgeyB3aGl0ZXNwYWNlSW5jbHVkZWQgPSB6OyB9CisgICAgLyoqIEFyZSB3aGl0ZXNwYWNlIHRva2VucyBpbmNsdWRlZD8gKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1doaXRlc3BhY2VJbmNsdWRlZCgpIHsgcmV0dXJuIHdoaXRlc3BhY2VJbmNsdWRlZDsgfQorCisgICAgeworICAgICAgICAvLyBJbml0aWFsaXphdGlvbiBhY3Rpb25zIHBlcmZvcm1lZCBvbiBjb25zdHJ1Y3Rpb24uCisgICAgICAgIHNldFRhYlNpemUoMSk7ICAvLyBnZXQgcmlkIG9mIHNwZWNpYWwgdGFiIGludGVycHJldGF0aW9uLCBmb3IgSURFcyBhbmQgZ2VuZXJhbCBjbGFyaXR5CisgICAgfQorCisgICAgLyoqIEJ1bXBlZCB3aGVuIGluc2lkZSAnW3hdJyBvciAnKHgpJywgcmVzZXQgaW5zaWRlICd7eH0nLiAgU2VlIE9ORV9OTC4gICovCisgICAgcHJvdGVjdGVkIGludCBwYXJlbkxldmVsID0gMDsKKyAgICBwcm90ZWN0ZWQgaW50IHN1cHByZXNzTmV3bGluZSA9IDA7ICAvLyBiZSByZWFsbHkgbWVhbiB0byBuZXdsaW5lcyBpbnNpZGUgc3RyaW5ncworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFNDU19UWVBFID0gMywgU0NTX1ZBTCA9IDQsIFNDU19MSVQgPSA4LCBTQ1NfTElNSVQgPSAxNjsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBTQ1NfU1FfVFlQRSA9IDAsIFNDU19UUV9UWVBFID0gMSwgU0NTX1JFX1RZUEUgPSAyOworICAgIHByb3RlY3RlZCBpbnQgc3RyaW5nQ3RvclN0YXRlID0gMDsgIC8vIGhhY2sgc3RyaW5nIGFuZCByZWdleHAgY29uc3RydWN0b3IgYm91bmRhcmllcworICAgIC8qKiBQdXNoIHBhcmVuTGV2ZWwgaGVyZSBhbmQgcmVzZXQgd2hlbmV2ZXIgaW5zaWRlICd7eH0nLiAqLworICAgIHByb3RlY3RlZCBBcnJheUxpc3QgcGFyZW5MZXZlbFN0YWNrID0gbmV3IEFycmF5TGlzdCgpOworICAgIHByb3RlY3RlZCBpbnQgbGFzdFNpZ1Rva2VuVHlwZSA9IEVPRjsgIC8vIGxhc3QgcmV0dXJuZWQgbm9uLXdoaXRlc3BhY2UgdG9rZW4KKworICAgIHByb3RlY3RlZCB2b2lkIHB1c2hQYXJlbkxldmVsKCkgeworICAgICAgICBwYXJlbkxldmVsU3RhY2suYWRkKG5ldyBJbnRlZ2VyKHBhcmVuTGV2ZWwqU0NTX0xJTUlUICsgc3RyaW5nQ3RvclN0YXRlKSk7CisgICAgICAgIHBhcmVuTGV2ZWwgPSAwOworICAgICAgICBzdHJpbmdDdG9yU3RhdGUgPSAwOworICAgIH0KKyAgICBwcm90ZWN0ZWQgdm9pZCBwb3BQYXJlbkxldmVsKCkgeworICAgICAgICBpbnQgbnBsID0gcGFyZW5MZXZlbFN0YWNrLnNpemUoKTsKKyAgICAgICAgaWYgKG5wbCA9PSAwKSAgcmV0dXJuOworICAgICAgICBpbnQgaSA9ICgoSW50ZWdlcikgcGFyZW5MZXZlbFN0YWNrLnJlbW92ZSgtLW5wbCkpLmludFZhbHVlKCk7CisgICAgICAgIHBhcmVuTGV2ZWwgICAgICA9IGkgLyBTQ1NfTElNSVQ7CisgICAgICAgIHN0cmluZ0N0b3JTdGF0ZSA9IGkgJSBTQ1NfTElNSVQ7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgcmVzdGFydFN0cmluZ0N0b3IoYm9vbGVhbiBleHBlY3RMaXRlcmFsKSB7CisgICAgICAgIGlmIChzdHJpbmdDdG9yU3RhdGUgIT0gMCkgeworICAgICAgICAgICAgc3RyaW5nQ3RvclN0YXRlID0gKGV4cGVjdExpdGVyYWw/IFNDU19MSVQ6IFNDU19WQUwpICsgKHN0cmluZ0N0b3JTdGF0ZSAmIFNDU19UWVBFKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhbGxvd1JlZ2V4cExpdGVyYWwoKSB7CisgICAgICAgIHJldHVybiAhaXNFeHByZXNzaW9uRW5kaW5nVG9rZW4obGFzdFNpZ1Rva2VuVHlwZSk7CisgICAgfQorCisgICAgLyoqIFJldHVybiB0cnVlIGZvciBhbiBvcGVyYXRvciBvciBwdW5jdHVhdGlvbiB3aGljaCBjYW4gZW5kIGFuIGV4cHJlc3Npb24uCisgICAgICogIFJldHVybiB0cnVlIGZvciBrZXl3b3JkcywgaWRlbnRpZmllcnMsIGFuZCBsaXRlcmFscy4KKyAgICAgKiAgUmV0dXJuIHRydWUgZm9yIHRva2VucyB3aGljaCBjYW4gZW5kIGV4cHJlc3Npb25zIChyaWdodCBicmFja2V0cywgKyssIC0tKS4KKyAgICAgKiAgUmV0dXJuIGZhbHNlIGZvciBFT0YgYW5kIGFsbCBvdGhlciBvcGVyYXRvciBhbmQgcHVuY3R1YXRpb24gdG9rZW5zLgorICAgICAqICBVc2VkIHRvIHN1cHByZXNzIHRoZSByZWNvZ25pdGlvbiBvZiAvZm9vLyBhcyBvcHBvc2VkIHRvIHRoZSBzaW1wbGUgZGl2aXNpb24gb3BlcmF0b3IgJy8nLgorICAgICAqLworICAgIC8vIENmLiAnY29uc3RhbnQnIGFuZCAnYmFsYW5jZWRCcmFja2V0cycgcnVsZXMgaW4gdGhlIGdyYW1tYXIuKQorICAgIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc0V4cHJlc3Npb25FbmRpbmdUb2tlbihpbnQgdHR5cGUpIHsKKyAgICAgICAgc3dpdGNoICh0dHlwZSkgeworICAgICAgICBjYXNlIElOQzogICAgICAgICAgICAgICAvLyB4KysgLyB5CisgICAgICAgIGNhc2UgREVDOiAgICAgICAgICAgICAgIC8vIHgtLSAvIHkKKyAgICAgICAgY2FzZSBSUEFSRU46ICAgICAgICAgICAgLy8gKHgpIC8geQorICAgICAgICBjYXNlIFJCUkFDSzogICAgICAgICAgICAvLyBmW3hdIC8geQorICAgICAgICBjYXNlIFJDVVJMWTogICAgICAgICAgICAvLyBme3h9IC8geQorICAgICAgICBjYXNlIFNUUklOR19MSVRFUkFMOiAgICAvLyAieCIgLyB5CisgICAgICAgIGNhc2UgU1RSSU5HX0NUT1JfRU5EOiAgIC8vICIkeCIgLyB5CisgICAgICAgIGNhc2UgTlVNX0lOVDogICAgICAgICAgIC8vIDAgLyB5CisgICAgICAgIGNhc2UgTlVNX0ZMT0FUOiAgICAgICAgIC8vIDBmIC8geQorICAgICAgICBjYXNlIE5VTV9MT05HOiAgICAgICAgICAvLyAwbCAvIHkKKyAgICAgICAgY2FzZSBOVU1fRE9VQkxFOiAgICAgICAgLy8gMC4wIC8geQorICAgICAgICBjYXNlIE5VTV9CSUdfSU5UOiAgICAgICAvLyAwZyAvIHkKKyAgICAgICAgY2FzZSBOVU1fQklHX0RFQ0lNQUw6ICAgLy8gMC4wZyAvIHkKKyAgICAgICAgY2FzZSBJREVOVDogICAgICAgICAgICAgLy8geCAvIHkKKyAgICAgICAgLy8gYW5kIGEgYnVuY2ggb2Yga2V5d29yZHMgKGFsbCBvZiB0aGVtOyBubyBzZW5zZSBwaWNraW5nIGFuZCBjaG9vc2luZyk6CisgICAgICAgIGNhc2UgTElURVJBTF9hczoKKyAgICAgICAgY2FzZSBMSVRFUkFMX2Fzc2VydDoKKyAgICAgICAgY2FzZSBMSVRFUkFMX2Jvb2xlYW46CisgICAgICAgIGNhc2UgTElURVJBTF9icmVhazoKKyAgICAgICAgY2FzZSBMSVRFUkFMX2J5dGU6CisgICAgICAgIGNhc2UgTElURVJBTF9jYXNlOgorICAgICAgICBjYXNlIExJVEVSQUxfY2F0Y2g6CisgICAgICAgIGNhc2UgTElURVJBTF9jaGFyOgorICAgICAgICBjYXNlIExJVEVSQUxfY2xhc3M6CisgICAgICAgIGNhc2UgTElURVJBTF9jb250aW51ZToKKyAgICAgICAgY2FzZSBMSVRFUkFMX2RlZjoKKyAgICAgICAgY2FzZSBMSVRFUkFMX2RlZmF1bHQ6CisgICAgICAgIGNhc2UgTElURVJBTF9kb3VibGU6CisgICAgICAgIGNhc2UgTElURVJBTF9lbHNlOgorICAgICAgICBjYXNlIExJVEVSQUxfZW51bToKKyAgICAgICAgY2FzZSBMSVRFUkFMX2V4dGVuZHM6CisgICAgICAgIGNhc2UgTElURVJBTF9mYWxzZToKKyAgICAgICAgY2FzZSBMSVRFUkFMX2ZpbmFsbHk6CisgICAgICAgIGNhc2UgTElURVJBTF9mbG9hdDoKKyAgICAgICAgY2FzZSBMSVRFUkFMX2ZvcjoKKyAgICAgICAgY2FzZSBMSVRFUkFMX2lmOgorICAgICAgICBjYXNlIExJVEVSQUxfaW1wbGVtZW50czoKKyAgICAgICAgY2FzZSBMSVRFUkFMX2ltcG9ydDoKKyAgICAgICAgY2FzZSBMSVRFUkFMX2luOgorICAgICAgICBjYXNlIExJVEVSQUxfaW5zdGFuY2VvZjoKKyAgICAgICAgY2FzZSBMSVRFUkFMX2ludDoKKyAgICAgICAgY2FzZSBMSVRFUkFMX2ludGVyZmFjZToKKyAgICAgICAgY2FzZSBMSVRFUkFMX2xvbmc6CisgICAgICAgIGNhc2UgTElURVJBTF9uYXRpdmU6CisgICAgICAgIGNhc2UgTElURVJBTF9uZXc6CisgICAgICAgIGNhc2UgTElURVJBTF9udWxsOgorICAgICAgICBjYXNlIExJVEVSQUxfcGFja2FnZToKKyAgICAgICAgY2FzZSBMSVRFUkFMX3ByaXZhdGU6CisgICAgICAgIGNhc2UgTElURVJBTF9wcm90ZWN0ZWQ6CisgICAgICAgIGNhc2UgTElURVJBTF9wdWJsaWM6CisgICAgICAgIGNhc2UgTElURVJBTF9yZXR1cm46CisgICAgICAgIGNhc2UgTElURVJBTF9zaG9ydDoKKyAgICAgICAgY2FzZSBMSVRFUkFMX3N0YXRpYzoKKyAgICAgICAgY2FzZSBMSVRFUkFMX3N1cGVyOgorICAgICAgICBjYXNlIExJVEVSQUxfc3dpdGNoOgorICAgICAgICBjYXNlIExJVEVSQUxfc3luY2hyb25pemVkOgorICAgICAgICBjYXNlIExJVEVSQUxfdGhpczoKKyAgICAgICAgY2FzZSBMSVRFUkFMX3RocmVhZHNhZmU6CisgICAgICAgIGNhc2UgTElURVJBTF90aHJvdzoKKyAgICAgICAgY2FzZSBMSVRFUkFMX3Rocm93czoKKyAgICAgICAgY2FzZSBMSVRFUkFMX3RyYW5zaWVudDoKKyAgICAgICAgY2FzZSBMSVRFUkFMX3RydWU6CisgICAgICAgIGNhc2UgTElURVJBTF90cnk6CisgICAgICAgIGNhc2UgTElURVJBTF92b2lkOgorICAgICAgICBjYXNlIExJVEVSQUxfdm9sYXRpbGU6CisgICAgICAgIGNhc2UgTElURVJBTF93aGlsZToKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgbmV3bGluZUNoZWNrKGJvb2xlYW4gY2hlY2spIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChjaGVjayAmJiBzdXBwcmVzc05ld2xpbmUgPiAwKSB7CisgICAgICAgICAgICByZXF1aXJlKHN1cHByZXNzTmV3bGluZSA9PSAwLAorICAgICAgICAgICAgICAgICJlbmQgb2YgbGluZSByZWFjaGVkIHdpdGhpbiBhIHNpbXBsZSBzdHJpbmcgJ3gnIG9yIFwieFwiIG9yIC94LyIsCisgICAgICAgICAgICAgICAgImZvciBtdWx0aS1saW5lIGxpdGVyYWxzLCB1c2UgdHJpcGxlIHF1b3RlcyAnJyd4JycnIG9yIFwiXCJcInhcIlwiXCIiKTsKKyAgICAgICAgICAgIHN1cHByZXNzTmV3bGluZSA9IDA7ICAvLyBzaHV0IGRvd24gYW55IGZsb29kIG9mIGVycm9ycworICAgICAgICB9CisgICAgICAgIG5ld2xpbmUoKTsKKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gYXRWYWxpZERvbGxhckVzY2FwZSgpIHRocm93cyBDaGFyU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gJyQnICgoJyonKT8gKCd7JyB8IExFVFRFUikpID0+CisgICAgICAgIGludCBrID0gMTsKKyAgICAgICAgY2hhciBsYyA9IExBKGsrKyk7CisgICAgICAgIGlmIChsYyAhPSAnJCcpICByZXR1cm4gZmFsc2U7CisgICAgICAgIGxjID0gTEEoaysrKTsKKyAgICAgICAgaWYgKGxjID09ICcqJykgIGxjID0gTEEoaysrKTsKKyAgICAgICAgcmV0dXJuIChsYyA9PSAneycgfHwgKGxjICE9ICckJyAmJiBDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclN0YXJ0KGxjKSkpOworICAgIH0KKworICAgIC8qKiBUaGlzIGlzIGEgYml0IG9mIHBsdW1iaW5nIHdoaWNoIHJlc3VtZXMgY29sbGVjdGlvbiBvZiBzdHJpbmcgY29uc3RydWN0b3IgYm9kaWVzLAorICAgICAqICBhZnRlciBhbiBlbWJlZGRlZCBleHByZXNzaW9uIGhhcyBiZWVuIHBhcnNlZC4KKyAgICAgKiAgVXNhZ2U6ICBuZXcgR3Jvb3Z5UmVjb2duaXplcihuZXcgR3Jvb3Z5TGV4ZXIoaW4pLnBsdW1iKCkpLgorICAgICAqLworICAgIHB1YmxpYyBUb2tlblN0cmVhbSBwbHVtYigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUb2tlblN0cmVhbSgpIHsKKyAgICAgICAgICAgIHB1YmxpYyBUb2tlbiBuZXh0VG9rZW4oKSB0aHJvd3MgVG9rZW5TdHJlYW1FeGNlcHRpb24geworICAgICAgICAgICAgICAgIGlmIChzdHJpbmdDdG9yU3RhdGUgPj0gU0NTX0xJVCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGdvbyBpcyBtb2RlbGVkIHVwb24gdGhlIEFOVExSIGNvZGUgZm9yIG5leHRUb2tlbjoKKyAgICAgICAgICAgICAgICAgICAgaW50IHF1b3RlVHlwZSA9IChzdHJpbmdDdG9yU3RhdGUgJiBTQ1NfVFlQRSk7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZ0N0b3JTdGF0ZSA9IDA7ICAvLyBnZXQgb3V0IG9mIHRoaXMgbW9kZSwgbm93CisgICAgICAgICAgICAgICAgICAgIHJlc2V0VGV4dCgpOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChxdW90ZVR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU0NTX1NRX1RZUEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNUUklOR19DVE9SX0VORCh0cnVlLCAvKmZyb21TdGFydDoqL2ZhbHNlLCBmYWxzZSk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTQ1NfVFFfVFlQRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU1RSSU5HX0NUT1JfRU5EKHRydWUsIC8qZnJvbVN0YXJ0OiovZmFsc2UsIHRydWUpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU0NTX1JFX1RZUEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJFR0VYUF9DVE9SX0VORCh0cnVlLCAvKmZyb21TdGFydDoqL2ZhbHNlKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RTaWdUb2tlblR5cGUgPSBfcmV0dXJuVG9rZW4uZ2V0VHlwZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9yZXR1cm5Ub2tlbjsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRva2VuU3RyZWFtUmVjb2duaXRpb25FeGNlcHRpb24oZSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENoYXJTdHJlYW1FeGNlcHRpb24gY3NlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGNzZSBpbnN0YW5jZW9mIENoYXJTdHJlYW1JT0V4Y2VwdGlvbiApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVG9rZW5TdHJlYW1JT0V4Y2VwdGlvbigoKENoYXJTdHJlYW1JT0V4Y2VwdGlvbiljc2UpLmlvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUb2tlblN0cmVhbUV4Y2VwdGlvbihjc2UuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBUb2tlbiB0b2tlbiA9IEdyb292eUxleGVyLnRoaXMubmV4dFRva2VuKCk7CisgICAgICAgICAgICAgICAgaW50IGxhc3R0eXBlID0gdG9rZW4uZ2V0VHlwZSgpOworICAgICAgICAgICAgICAgIGlmICh3aGl0ZXNwYWNlSW5jbHVkZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChsYXN0dHlwZSkgeyAgLy8gZmlsdGVyIG91dCBpbnNpZ25pZmljYW50IHR5cGVzCisgICAgICAgICAgICAgICAgICAgIGNhc2UgV1M6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT05FX05MOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFNMX0NPTU1FTlQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTUxfQ09NTUVOVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3R0eXBlID0gbGFzdFNpZ1Rva2VuVHlwZTsgIC8vIGJhY2sgdXAhCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGFzdFNpZ1Rva2VuVHlwZSA9IGxhc3R0eXBlOworICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICAgICAgLy8gc3R1ZmYgdG8gYWRqdXN0IEFOVExSJ3MgdHJhY2luZyBtYWNoaW5lcnkKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdHJhY2luZyA9IGZhbHNlOyAgLy8gb25seSBlZmZlY3RpdmUgaWYgYW50bHIuVG9vbCBpcyBydW4gd2l0aCAtdHJhY2VMZXhlcgorICAgIHB1YmxpYyB2b2lkIHRyYWNlSW4oU3RyaW5nIHJuYW1lKSB0aHJvd3MgQ2hhclN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghR3Jvb3Z5TGV4ZXIudHJhY2luZykgIHJldHVybjsKKyAgICAgICAgc3VwZXIudHJhY2VJbihybmFtZSk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRyYWNlT3V0KFN0cmluZyBybmFtZSkgdGhyb3dzIENoYXJTdHJlYW1FeGNlcHRpb24geworICAgICAgICBpZiAoIUdyb292eUxleGVyLnRyYWNpbmcpICByZXR1cm47CisgICAgICAgIGlmIChfcmV0dXJuVG9rZW4gIT0gbnVsbCkgIHJuYW1lICs9IHRva2VuU3RyaW5nT2YoX3JldHVyblRva2VuKTsKKyAgICAgICAgc3VwZXIudHJhY2VPdXQocm5hbWUpOworICAgIH0KKyAgICBwcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuSGFzaE1hcCB0dHlwZXM7CisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRva2VuU3RyaW5nT2YoVG9rZW4gdCkgeworICAgICAgICBpZiAodHR5cGVzID09IG51bGwpIHsKKyAgICAgICAgICAgIGphdmEudXRpbC5IYXNoTWFwIG1hcCA9IG5ldyBqYXZhLnV0aWwuSGFzaE1hcCgpOworICAgICAgICAgICAgamF2YS5sYW5nLnJlZmxlY3QuRmllbGRbXSBmaWVsZHMgPSBHcm9vdnlUb2tlblR5cGVzLmNsYXNzLmdldERlY2xhcmVkRmllbGRzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChmaWVsZHNbaV0uZ2V0VHlwZSgpICE9IGludC5jbGFzcykgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG1hcC5wdXQoZmllbGRzW2ldLmdldChudWxsKSwgZmllbGRzW2ldLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHR0eXBlcyA9IG1hcDsKKyAgICAgICAgfQorICAgICAgICBJbnRlZ2VyIHR0ID0gbmV3IEludGVnZXIodC5nZXRUeXBlKCkpOworICAgICAgICBPYmplY3QgdHRuID0gdHR5cGVzLmdldCh0dCk7CisgICAgICAgIGlmICh0dG4gPT0gbnVsbCkgIHR0biA9ICI8Iit0dCsiPiI7CisgICAgICAgIHJldHVybiAiWyIrdHRuKyIsXCIiK3QuZ2V0VGV4dCgpKyJcIl0iOworICAgIH0KKworICAgIHByb3RlY3RlZCBHcm9vdnlSZWNvZ25pemVyIHBhcnNlcjsgIC8vIGxpdHRsZS11c2VkIGxpbms7IFRPRE86IGdldCByaWQgb2YKKyAgICBwcml2YXRlIHZvaWQgcmVxdWlyZShib29sZWFuIHosIFN0cmluZyBwcm9ibGVtLCBTdHJpbmcgc29sdXRpb24pIHRocm93cyBTZW1hbnRpY0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIFRPRE86IERpcmVjdCB0byBhIGNvbW1vbiBlcnJvciBoYW5kbGVyLCByYXRoZXIgdGhhbiB0aHJvdWdoIHRoZSBwYXJzZXIuCisgICAgICAgIGlmICgheikgIHBhcnNlci5yZXF1aXJlRmFpbGVkKHByb2JsZW0sIHNvbHV0aW9uKTsKKyAgICB9ICAgIAorfQorCisvLyBUT0RPOiAgQm9ybmVvLXN0eWxlIG9wcy4KKworLy8gT1BFUkFUT1JTCitRVUVTVElPTiAgICAgICAgICBvcHRpb25zIHtwYXJhcGhyYXNlPSInPyciO30gICAgICAgICAgIDogICAnPycgICAgICAgICAgICAgOworTFBBUkVOICAgICAgICAgICAgb3B0aW9ucyB7cGFyYXBocmFzZT0iJygnIjt9ICAgICAgICAgICA6ICAgJygnICAgICAgICAgICAgIHsrK3BhcmVuTGV2ZWw7fTsKK1JQQVJFTiAgICAgICAgICAgIG9wdGlvbnMge3BhcmFwaHJhc2U9IicpJyI7fSAgICAgICAgICAgOiAgICcpJyAgICAgICAgICAgICB7LS1wYXJlbkxldmVsO307CitMQlJBQ0sgICAgICAgICAgICBvcHRpb25zIHtwYXJhcGhyYXNlPSInWyciO30gICAgICAgICAgIDogICAnWycgICAgICAgICAgICAgeysrcGFyZW5MZXZlbDt9OworUkJSQUNLICAgICAgICAgICAgb3B0aW9ucyB7cGFyYXBocmFzZT0iJ10nIjt9ICAgICAgICAgICA6ICAgJ10nICAgICAgICAgICAgIHstLXBhcmVuTGV2ZWw7fTsKK0xDVVJMWSAgICAgICAgICAgIG9wdGlvbnMge3BhcmFwaHJhc2U9Iid7JyI7fSAgICAgICAgICAgOiAgICd7JyAgICAgICAgICAgICB7cHVzaFBhcmVuTGV2ZWwoKTt9OworUkNVUkxZICAgICAgICAgICAgb3B0aW9ucyB7cGFyYXBocmFzZT0iJ30nIjt9ICAgICAgICAgICA6ICAgJ30nICAgICAgICAgICAgIHtwb3BQYXJlbkxldmVsKCk7IGlmKHN0cmluZ0N0b3JTdGF0ZSE9MCkgcmVzdGFydFN0cmluZ0N0b3IodHJ1ZSk7fTsKK0NPTE9OICAgICAgICAgICAgIG9wdGlvbnMge3BhcmFwaHJhc2U9Iic6JyI7fSAgICAgICAgICAgOiAgICc6JyAgICAgICAgICAgICA7CitDT01NQSAgICAgICAgICAgICBvcHRpb25zIHtwYXJhcGhyYXNlPSInLCciO30gICAgICAgICAgIDogICAnLCcgICAgICAgICAgICAgOworRE9UICAgICAgICAgICAgICAgb3B0aW9ucyB7cGFyYXBocmFzZT0iJy4nIjt9ICAgICAgICAgICA6ICAgJy4nICAgICAgICAgICAgIDsKK0FTU0lHTiAgICAgICAgICAgIG9wdGlvbnMge3BhcmFwaHJhc2U9Iic9JyI7fSAgICAgICAgICAgOiAgICc9JyAgICAgICAgICAgICA7CitDT01QQVJFX1RPICAgICAgICBvcHRpb25zIHtwYXJhcGhyYXNlPSInPD0+JyI7fSAgICAgICAgIDogICAiPD0+IiAgICAgICAgICAgOworRVFVQUwgICAgICAgICAgICAgb3B0aW9ucyB7cGFyYXBocmFzZT0iJz09JyI7fSAgICAgICAgICA6ICAgIj09IiAgICAgICAgICAgIDsKK0xOT1QgICAgICAgICAgICAgIG9wdGlvbnMge3BhcmFwaHJhc2U9IichJyI7fSAgICAgICAgICAgOiAgICchJyAgICAgICAgICAgICA7CitCTk9UICAgICAgICAgICAgICBvcHRpb25zIHtwYXJhcGhyYXNlPSInficiO30gICAgICAgICAgIDogICAnficgICAgICAgICAgICAgOworTk9UX0VRVUFMICAgICAgICAgb3B0aW9ucyB7cGFyYXBocmFzZT0iJyE9JyI7fSAgICAgICAgICA6ICAgIiE9IiAgICAgICAgICAgIDsKK3Byb3RlY3RlZCAgLy9zd2l0Y2hlZCBmcm9tIGNvbWJpbmVkIHJ1bGUKK0RJViAgICAgICAgICAgICAgIG9wdGlvbnMge3BhcmFwaHJhc2U9IicvJyI7fSAgICAgICAgICAgOiAgICcvJyAgICAgICAgICAgICA7Citwcm90ZWN0ZWQgIC8vc3dpdGNoZWQgZnJvbSBjb21iaW5lZCBydWxlCitESVZfQVNTSUdOICAgICAgICBvcHRpb25zIHtwYXJhcGhyYXNlPSInLz0nIjt9ICAgICAgICAgIDogICAiLz0iICAgICAgICAgICAgOworUExVUyAgICAgICAgICAgICAgb3B0aW9ucyB7cGFyYXBocmFzZT0iJysnIjt9ICAgICAgICAgICA6ICAgJysnICAgICAgICAgICAgIDsKK1BMVVNfQVNTSUdOICAgICAgIG9wdGlvbnMge3BhcmFwaHJhc2U9IicrPSciO30gICAgICAgICAgOiAgICIrPSIgICAgICAgICAgICA7CitJTkMgICAgICAgICAgICAgICBvcHRpb25zIHtwYXJhcGhyYXNlPSInKysnIjt9ICAgICAgICAgIDogICAiKysiICAgICAgICAgICAgOworTUlOVVMgICAgICAgICAgICAgb3B0aW9ucyB7cGFyYXBocmFzZT0iJy0nIjt9ICAgICAgICAgICA6ICAgJy0nICAgICAgICAgICAgIDsKK01JTlVTX0FTU0lHTiAgICAgIG9wdGlvbnMge3BhcmFwaHJhc2U9IictPSciO30gICAgICAgICAgOiAgICItPSIgICAgICAgICAgICA7CitERUMgICAgICAgICAgICAgICBvcHRpb25zIHtwYXJhcGhyYXNlPSInLS0nIjt9ICAgICAgICAgIDogICAiLS0iICAgICAgICAgICAgOworU1RBUiAgICAgICAgICAgICAgb3B0aW9ucyB7cGFyYXBocmFzZT0iJyonIjt9ICAgICAgICAgICA6ICAgJyonICAgICAgICAgICAgIDsKK1NUQVJfQVNTSUdOICAgICAgIG9wdGlvbnMge3BhcmFwaHJhc2U9IicqPSciO30gICAgICAgICAgOiAgICIqPSIgICAgICAgICAgICA7CitNT0QgICAgICAgICAgICAgICBvcHRpb25zIHtwYXJhcGhyYXNlPSInJSciO30gICAgICAgICAgIDogICAnJScgICAgICAgICAgICAgOworTU9EX0FTU0lHTiAgICAgICAgb3B0aW9ucyB7cGFyYXBocmFzZT0iJyU9JyI7fSAgICAgICAgICA6ICAgIiU9IiAgICAgICAgICAgIDsKK1NSICAgICAgICAgICAgICAgIG9wdGlvbnMge3BhcmFwaHJhc2U9Iic+PiciO30gICAgICAgICAgOiAgICI+PiIgICAgICAgICAgICA7CitTUl9BU1NJR04gICAgICAgICBvcHRpb25zIHtwYXJhcGhyYXNlPSInPj49JyI7fSAgICAgICAgIDogICAiPj49IiAgICAgICAgICAgOworQlNSICAgICAgICAgICAgICAgb3B0aW9ucyB7cGFyYXBocmFzZT0iJz4+PiciO30gICAgICAgICA6ICAgIj4+PiIgICAgICAgICAgIDsKK0JTUl9BU1NJR04gICAgICAgIG9wdGlvbnMge3BhcmFwaHJhc2U9Iic+Pj49JyI7fSAgICAgICAgOiAgICI+Pj49IiAgICAgICAgICA7CitHRSAgICAgICAgICAgICAgICBvcHRpb25zIHtwYXJhcGhyYXNlPSInPj0nIjt9ICAgICAgICAgIDogICAiPj0iICAgICAgICAgICAgOworR1QgICAgICAgICAgICAgICAgb3B0aW9ucyB7cGFyYXBocmFzZT0iJz4nIjt9ICAgICAgICAgICA6ICAgIj4iICAgICAgICAgICAgIDsKK1NMICAgICAgICAgICAgICAgIG9wdGlvbnMge3BhcmFwaHJhc2U9Iic8PCciO30gICAgICAgICAgOiAgICI8PCIgICAgICAgICAgICA7CitTTF9BU1NJR04gICAgICAgICBvcHRpb25zIHtwYXJhcGhyYXNlPSInPDw9JyI7fSAgICAgICAgIDogICAiPDw9IiAgICAgICAgICAgOworTEUgICAgICAgICAgICAgICAgb3B0aW9ucyB7cGFyYXBocmFzZT0iJzw9JyI7fSAgICAgICAgICA6ICAgIjw9IiAgICAgICAgICAgIDsKK0xUICAgICAgICAgICAgICAgIG9wdGlvbnMge3BhcmFwaHJhc2U9Iic8JyI7fSAgICAgICAgICAgOiAgICc8JyAgICAgICAgICAgICA7CitCWE9SICAgICAgICAgICAgICBvcHRpb25zIHtwYXJhcGhyYXNlPSInXiciO30gICAgICAgICAgIDogICAnXicgICAgICAgICAgICAgOworQlhPUl9BU1NJR04gICAgICAgb3B0aW9ucyB7cGFyYXBocmFzZT0iJ149JyI7fSAgICAgICAgICA6ICAgIl49IiAgICAgICAgICAgIDsKK0JPUiAgICAgICAgICAgICAgIG9wdGlvbnMge3BhcmFwaHJhc2U9Iid8JyI7fSAgICAgICAgICAgOiAgICd8JyAgICAgICAgICAgICA7CitCT1JfQVNTSUdOICAgICAgICBvcHRpb25zIHtwYXJhcGhyYXNlPSInfD0nIjt9ICAgICAgICAgIDogICAifD0iICAgICAgICAgICAgOworTE9SICAgICAgICAgICAgICAgb3B0aW9ucyB7cGFyYXBocmFzZT0iJ3x8JyI7fSAgICAgICAgICA6ICAgInx8IiAgICAgICAgICAgIDsKK0JBTkQgICAgICAgICAgICAgIG9wdGlvbnMge3BhcmFwaHJhc2U9IicmJyI7fSAgICAgICAgICAgOiAgICcmJyAgICAgICAgICAgICA7CitCQU5EX0FTU0lHTiAgICAgICBvcHRpb25zIHtwYXJhcGhyYXNlPSInJj0nIjt9ICAgICAgICAgIDogICAiJj0iICAgICAgICAgICAgOworTEFORCAgICAgICAgICAgICAgb3B0aW9ucyB7cGFyYXBocmFzZT0iJyYmJyI7fSAgICAgICAgICA6ICAgIiYmIiAgICAgICAgICAgIDsKK1NFTUkgICAgICAgICAgICAgIG9wdGlvbnMge3BhcmFwaHJhc2U9Iic7JyI7fSAgICAgICAgICAgOiAgICc7JyAgICAgICAgICAgICA7CitET0xMQVIgICAgICAgICAgICBvcHRpb25zIHtwYXJhcGhyYXNlPSInJCciO30gICAgICAgICAgIDogICAnJCcgICAgICAgICAgICAgOworUkFOR0VfSU5DTFVTSVZFICAgb3B0aW9ucyB7cGFyYXBocmFzZT0iJy4uJyI7fSAgICAgICAgICA6ICAgIi4uIiAgICAgICAgICAgIDsKK1JBTkdFX0VYQ0xVU0lWRSAgIG9wdGlvbnMge3BhcmFwaHJhc2U9IicuLjwnIjt9ICAgICAgICAgOiAgICIuLjwiICAgICAgICAgICA7CitUUklQTEVfRE9UICAgICAgICBvcHRpb25zIHtwYXJhcGhyYXNlPSInLi4uJyI7fSAgICAgICAgIDogICAiLi4uIiAgICAgICAgICAgOworU1BSRUFEX0RPVCAgICAgICAgb3B0aW9ucyB7cGFyYXBocmFzZT0iJyouJyI7fSAgICAgICAgICA6ICAgIiouIiAgICAgICAgICAgIDsKK09QVElPTkFMX0RPVCAgICAgIG9wdGlvbnMge3BhcmFwaHJhc2U9Iic/LiciO30gICAgICAgICAgOiAgICI/LiIJCQk7CitFTFZJU19PUEVSQVRPUiAgICBvcHRpb25zIHtwYXJhcGhyYXNlPSInPzonIjt9ICAgICAgICAgIDogICAiPzoiCQkJOworTUVNQkVSX1BPSU5URVIgICAgb3B0aW9ucyB7cGFyYXBocmFzZT0iJy4mJyI7fSAgICAgICAgICA6ICAgIi4mIiAgICAgICAgICAgIDsKK1JFR0VYX0ZJTkQgICAgICAgIG9wdGlvbnMge3BhcmFwaHJhc2U9Iic9ficiO30gICAgICAgICAgOiAgICI9fiIgICAgICAgICAgICA7CitSRUdFWF9NQVRDSCAgICAgICBvcHRpb25zIHtwYXJhcGhyYXNlPSInPT1+JyI7fSAgICAgICAgIDogICAiPT1+IiAgICAgICAgICAgOworU1RBUl9TVEFSICAgICAgICAgb3B0aW9ucyB7cGFyYXBocmFzZT0iJyoqJyI7fSAgICAgICAgICA6ICAgIioqIiAgICAgICAgICAgIDsKK1NUQVJfU1RBUl9BU1NJR04gIG9wdGlvbnMge3BhcmFwaHJhc2U9IicqKj0nIjt9ICAgICAgICAgOiAgICIqKj0iICAgICAgICAgICA7CitDTE9TQUJMRV9CTE9DS19PUCBvcHRpb25zIHtwYXJhcGhyYXNlPSInLT4nIjt9ICAgICAgICAgIDogICAiLT4iICAgICAgICAgICAgOworCisvLyBXaGl0ZXNwYWNlIC0tIGlnbm9yZWQKK1dTCitvcHRpb25zIHsKKyAgICBwYXJhcGhyYXNlPSJ3aGl0ZXNwYWNlIjsKK30KKyAgICA6CisgICAgICAgICgKKyAgICAgICAgICAgIG9wdGlvbnMgeyBncmVlZHk9dHJ1ZTsgfToKKyAgICAgICAgICAgICcgJworICAgICAgICB8ICAgJ1x0JworICAgICAgICB8ICAgJ1xmJworICAgICAgICB8ICAgJ1xcJyBPTkVfTkxbZmFsc2VdCisgICAgICAgICkrCisgICAgICAgIHsgaWYgKCF3aGl0ZXNwYWNlSW5jbHVkZWQpICBfdHR5cGUgPSBUb2tlbi5TS0lQOyB9CisgICAgOworCitwcm90ZWN0ZWQKK09ORV9OTCFbYm9vbGVhbiBjaGVja10KK29wdGlvbnMgeworICAgIHBhcmFwaHJhc2U9ImEgbmV3bGluZSI7Cit9CisgOiAgIC8vIGhhbmRsZSBuZXdsaW5lcywgd2hpY2ggYXJlIHNpZ25pZmljYW50IGluIEdyb292eQorICAgICAgICAoICAgb3B0aW9ucyB7Z2VuZXJhdGVBbWJpZ1dhcm5pbmdzPWZhbHNlO30KKyAgICAgICAgOiAgICJcclxuIiAgLy8gRXZpbCBET1MKKyAgICAgICAgfCAgICdccicgICAgLy8gTWFjaW50b3NoCisgICAgICAgIHwgICAnXG4nICAgIC8vIFVuaXggKHRoZSByaWdodCB3YXkpCisgICAgICAgICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gdXBkYXRlIGN1cnJlbnQgbGluZSBudW1iZXIgZm9yIGVycm9yIHJlcG9ydGluZworICAgICAgICAgICAgbmV3bGluZUNoZWNrKGNoZWNrKTsKKyAgICAgICAgfQorICAgIDsKKyAgICAgICAgCisvLyBHcm91cCBhbnkgbnVtYmVyIG9mIG5ld2xpbmVzICh3aXRoIGNvbW1lbnRzIGFuZCB3aGl0ZXNwYWNlKSBpbnRvIGEgc2luZ2xlIHRva2VuLgorLy8gVGhpcyByZWR1Y2VzIHRoZSBhbW91bnQgb2YgcGFyc2VyIGxvb2thaGVhZCByZXF1aXJlZCB0byBwYXJzZSBhcm91bmQgbmV3bGluZXMuCisvLyBJdCBpcyBhbiBpbnZhcmlhbnQgdGhhdCB0aGUgcGFyc2VyIG5ldmVyIHNlZXMgTkxTIHRva2VucyBiYWNrLXRvLWJhY2suCitOTFMKK29wdGlvbnMgeworICAgIHBhcmFwaHJhc2U9InNvbWUgbmV3bGluZXMsIHdoaXRlc3BhY2Ugb3IgY29tbWVudHMiOworfQorICAgIDogICBPTkVfTkxbdHJ1ZV0KKyAgICAgICAgKCAgIHshd2hpdGVzcGFjZUluY2x1ZGVkfT8KKyAgICAgICAgICAgIChPTkVfTkxbdHJ1ZV0gfCBXUyB8IFNMX0NPTU1FTlQgfCBNTF9DT01NRU5UKSsKKyAgICAgICAgICAgIC8vIChnb2JibGUsIGdvYmJsZSkqCisgICAgICAgICk/CisgICAgICAgIC8vIEluc2lkZSAoLi4uKSBhbmQgWy4uLl0gYnV0IG5vdCB7Li4ufSwgaWdub3JlIG5ld2xpbmVzLgorICAgICAgICB7ICAgaWYgKHdoaXRlc3BhY2VJbmNsdWRlZCkgeworICAgICAgICAgICAgICAgIC8vIGtlZXAgdGhlIHRva2VuIGFzLWlzCisgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmVuTGV2ZWwgIT0gMCkgeworICAgICAgICAgICAgICAgIC8vIHdoZW4gZGlyZWN0bHkgaW5zaWRlIHBhcmVucywgYWxsIG5ld2xpbmVzIGFyZSBpZ25vcmVkIGhlcmUKKyAgICAgICAgICAgICAgICAkc2V0VHlwZShUb2tlbi5TS0lQKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gaW5zaWRlIHsuLi59LCBuZXdsaW5lcyBtdXN0IGJlIGV4cGxpY2l0bHkgbWF0Y2hlZCBhcyAnbmxzIScKKyAgICAgICAgICAgICAgICAkc2V0VGV4dCgiPG5ld2xpbmU+Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICA7CisKKy8vIFNpbmdsZS1saW5lIGNvbW1lbnRzCitTTF9DT01NRU5UCitvcHRpb25zIHsKKyAgICBwYXJhcGhyYXNlPSJhIHNpbmdsZSBsaW5lIGNvbW1lbnQiOworfQorICAgIDogICAiLy8iCisgICAgICAgICgKKyAgICAgICAgICAgIG9wdGlvbnMgeyAgZ3JlZWR5ID0gdHJ1ZTsgIH06CisgICAgICAgICAgICAvLyAnXHVmZmZmJyBtZWFucyB0aGUgRU9GIGNoYXJhY3Rlci4KKyAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBmaXggdGhlIGlzc3VlIEdST09WWS03NjYgKGluZmluaXRlIGxvb3ApLgorICAgICAgICAgICAgfignXG4nfCdccid8J1x1ZmZmZicpCisgICAgICAgICkqCisgICAgICAgIHsgaWYgKCF3aGl0ZXNwYWNlSW5jbHVkZWQpICAkc2V0VHlwZShUb2tlbi5TS0lQKTsgfQorICAgICAgICAvL1RoaXMgbWlnaHQgYmUgc2lnbmlmaWNhbnQsIHNvIGRvbid0IHN3YWxsb3cgaXQgaW5zaWRlIHRoZSBjb21tZW50OgorICAgICAgICAvL09ORV9OTAorICAgIDsKKworLy8gU2NyaXB0LWhlYWRlciBjb21tZW50cworU0hfQ09NTUVOVAorb3B0aW9ucyB7CisgICAgcGFyYXBocmFzZT0iYSBzY3JpcHQgaGVhZGVyIjsKK30KKyAgICA6ICAge2dldExpbmUoKSA9PSAxICYmIGdldENvbHVtbigpID09IDF9PyAgIiMhIgorICAgICAgICAoCisgICAgICAgICAgICBvcHRpb25zIHsgIGdyZWVkeSA9IHRydWU7ICB9OgorICAgICAgICAgICAgLy8gJ1x1ZmZmZicgbWVhbnMgdGhlIEVPRiBjaGFyYWN0ZXIuCisgICAgICAgICAgICAvLyBUaGlzIHdpbGwgZml4IHRoZSBpc3N1ZSBHUk9PVlktNzY2IChpbmZpbml0ZSBsb29wKS4KKyAgICAgICAgICAgIH4oJ1xuJ3wnXHInfCdcdWZmZmYnKQorICAgICAgICApKgorICAgICAgICB7IGlmICghd2hpdGVzcGFjZUluY2x1ZGVkKSAgJHNldFR5cGUoVG9rZW4uU0tJUCk7IH0KKyAgICAgICAgLy9PTkVfTkwgIC8vTmV2ZXIgYSBzaWduaWZpY2FudCBuZXdsaW5lLCBidXQgbWlnaHQgYXMgd2VsbCBzZXBhcmF0ZSBpdC4KKyAgICA7CisKKy8vIG11bHRpcGxlLWxpbmUgY29tbWVudHMKK01MX0NPTU1FTlQKK29wdGlvbnMgeworICAgIHBhcmFwaHJhc2U9ImEgY29tbWVudCI7Cit9CisgICAgOiAgICIvKiIKKyAgICAgICAgKCAgIC8qICAnXHInICdcbicgY2FuIGJlIG1hdGNoZWQgaW4gb25lIGFsdGVybmF0aXZlIG9yIGJ5IG1hdGNoaW5nCisgICAgICAgICAgICAgICAgJ1xyJyBpbiBvbmUgaXRlcmF0aW9uIGFuZCAnXG4nIGluIGFub3RoZXIuIEkgYW0gdHJ5aW5nIHRvCisgICAgICAgICAgICAgICAgaGFuZGxlIGFueSBmbGF2b3Igb2YgbmV3bGluZSB0aGF0IGNvbWVzIGluLCBidXQgdGhlIGxhbmd1YWdlCisgICAgICAgICAgICAgICAgdGhhdCBhbGxvd3MgYm90aCAiXHJcbiIgYW5kICJcciIgYW5kICJcbiIgdG8gYWxsIGJlIHZhbGlkCisgICAgICAgICAgICAgICAgbmV3bGluZSBpcyBhbWJpZ3VvdXMuIENvbnNlcXVlbnRseSwgdGhlIHJlc3VsdGluZyBncmFtbWFyCisgICAgICAgICAgICAgICAgbXVzdCBiZSBhbWJpZ3VvdXMuIEknbSBzaHV0dGluZyB0aGlzIHdhcm5pbmcgb2ZmLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBvcHRpb25zIHsKKyAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVBbWJpZ1dhcm5pbmdzPWZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICA6CisgICAgICAgICAgICAoICcqJyB+Jy8nICkgPT4gJyonCisgICAgICAgIHwgICBPTkVfTkxbdHJ1ZV0KKyAgICAgICAgfCAgIH4oJyonfCdcbid8J1xyJ3wnXHVmZmZmJykKKyAgICAgICAgKSoKKyAgICAgICAgIiovIgorICAgICAgICB7IGlmICghd2hpdGVzcGFjZUluY2x1ZGVkKSAgJHNldFR5cGUoVG9rZW4uU0tJUCk7IH0KKyAgICA7CisKKworLy8gc3RyaW5nIGxpdGVyYWxzCitTVFJJTkdfTElURVJBTAorb3B0aW9ucyB7CisgICAgcGFyYXBocmFzZT0iYSBzdHJpbmcgbGl0ZXJhbCI7Cit9CisgICAgICAgIHtpbnQgdHQ9MDt9CisgICAgOiAgICgiJycnIikgPT4gIC8vLi4uc2h1dCBvZmYgYW1iaWd1aXR5IHdhcm5pbmcKKyAgICAgICAgIicnJyIhCisgICAgICAgICggICBTVFJJTkdfQ0ggfCBFU0MgfCAnIicgfCAnJCcgfCBTVFJJTkdfTkxbdHJ1ZV0KKyAgICAgICAgfCAgICgnXCcnICh+J1wnJyB8ICdcJycgfidcJycpKSA9PiAnXCcnICAvLyBhbGxvdyAxIG9yIDIgY2xvc2UgcXVvdGVzCisgICAgICAgICkqCisgICAgICAgICInJyciIQorICAgIHwgICAnXCcnIQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KytzdXBwcmVzc05ld2xpbmU7fQorICAgICAgICAoICAgU1RSSU5HX0NIIHwgRVNDIHwgJyInIHwgJyQnICApKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LS1zdXBwcmVzc05ld2xpbmU7fQorICAgICAgICAnXCcnIQorICAgIHwgICAoIlwiXCJcIiIpID0+ICAvLy4uLnNodXQgb2ZmIGFtYmlndWl0eSB3YXJuaW5nCisgICAgICAgICJcIlwiXCIiIQorICAgICAgICB0dD1TVFJJTkdfQ1RPUl9FTkRbdHJ1ZSwgLyp0cmlwbGVRdW90ZToqLyB0cnVlXQorICAgICAgICB7JHNldFR5cGUodHQpO30KKyAgICB8ICAgJyInIQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KytzdXBwcmVzc05ld2xpbmU7fQorICAgICAgICB0dD1TVFJJTkdfQ1RPUl9FTkRbdHJ1ZSwgLyp0cmlwbGVRdW90ZToqLyBmYWxzZV0KKyAgICAgICAgeyRzZXRUeXBlKHR0KTt9CisgICAgOworCitwcm90ZWN0ZWQKK1NUUklOR19DVE9SX0VORFtib29sZWFuIGZyb21TdGFydCwgYm9vbGVhbiB0cmlwbGVRdW90ZV0KK3JldHVybnMgW2ludCB0dD1TVFJJTkdfQ1RPUl9FTkRdCitvcHRpb25zIHsKKyAgICBwYXJhcGhyYXNlPSJhIHN0cmluZyBsaXRlcmFsIGVuZCI7Cit9CisgICAgICAgIHsgYm9vbGVhbiBkb2xsYXJPSyA9IGZhbHNlOyB9CisgICAgOgorICAgICAgICAoCisgICAgICAgICAgICBvcHRpb25zIHsgIGdyZWVkeSA9IHRydWU7ICB9OgorICAgICAgICAgICAgU1RSSU5HX0NIIHwgRVNDIHwgJ1wnJyB8IFNUUklOR19OTFt0cmlwbGVRdW90ZV0KKyAgICAgICAgfCAgICgnIicgKH4nIicgfCAnIicgficiJykpPT4ge3RyaXBsZVF1b3RlfT8gJyInICAvLyBhbGxvdyAxIG9yIDIgY2xvc2UgcXVvdGVzCisgICAgICAgICkqCisgICAgICAgICggICAoICAgeyAhdHJpcGxlUXVvdGUgfT8gIlwiIiEKKyAgICAgICAgICAgIHwgICB7ICB0cmlwbGVRdW90ZSB9PyAiXCJcIlwiIiEKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZnJvbVN0YXJ0KSAgICAgIHR0ID0gU1RSSU5HX0xJVEVSQUw7ICAvLyBwbGFpbiBzdHJpbmcgbGl0ZXJhbCEKKyAgICAgICAgICAgICAgICBpZiAoIXRyaXBsZVF1b3RlKSAgIHstLXN1cHByZXNzTmV3bGluZTt9CisgICAgICAgICAgICAgICAgLy8gZG9uZSB3aXRoIHN0cmluZyBjb25zdHJ1Y3RvciEKKyAgICAgICAgICAgICAgICAvL2Fzc2VydChzdHJpbmdDdG9yU3RhdGUgPT0gMCk7CisgICAgICAgICAgICB9CisgICAgICAgIHwgICB7ZG9sbGFyT0sgPSBhdFZhbGlkRG9sbGFyRXNjYXBlKCk7fQorICAgICAgICAgICAgJyQnIQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlcXVpcmUoZG9sbGFyT0ssCisgICAgICAgICAgICAgICAgICAgICJpbGxlZ2FsIHN0cmluZyBib2R5IGNoYXJhY3RlciBhZnRlciBkb2xsYXIgc2lnbiIsCisgICAgICAgICAgICAgICAgICAgICJlaXRoZXIgZXNjYXBlIGEgbGl0ZXJhbCBkb2xsYXIgc2lnbiBcIlxcJDVcIiBvciBicmFja2V0IHRoZSB2YWx1ZSBleHByZXNzaW9uIFwiJHs1fVwiIik7CisgICAgICAgICAgICAgICAgLy8gWWVzLCBpdCdzIGEgc3RyaW5nIGNvbnN0cnVjdG9yLCBhbmQgd2UndmUgZ290IGEgdmFsdWUgcGFydC4KKyAgICAgICAgICAgICAgICB0dCA9IChmcm9tU3RhcnQgPyBTVFJJTkdfQ1RPUl9TVEFSVCA6IFNUUklOR19DVE9SX01JRERMRSk7CisgICAgICAgICAgICAgICAgc3RyaW5nQ3RvclN0YXRlID0gU0NTX1ZBTCArICh0cmlwbGVRdW90ZT8gU0NTX1RRX1RZUEU6IFNDU19TUV9UWVBFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgKQorICAgICAgICB7ICAgJHNldFR5cGUodHQpOyAgfQorICAgIDsKKworcHJvdGVjdGVkCitTVFJJTkdfQ0gKK29wdGlvbnMgeworICAgIHBhcmFwaHJhc2U9ImEgc3RyaW5nIGNoYXJhY3RlciI7Cit9CisgICAgOiAgIH4oJyInfCdcJyd8J1xcJ3wnJCd8J1xuJ3wnXHInfCdcdWZmZmYnKQorICAgIDsKKworUkVHRVhQX0xJVEVSQUwKK29wdGlvbnMgeworICAgIHBhcmFwaHJhc2U9ImEgcmVndWxhciBleHByZXNzaW9uIGxpdGVyYWwiOworfQorICAgICAgICB7aW50IHR0PTA7fQorICAgIDogICB7YWxsb3dSZWdleHBMaXRlcmFsKCl9PworICAgICAgICAnLychCisgICAgICAgIHsrK3N1cHByZXNzTmV3bGluZTt9CisgICAgICAgIC8vRG8gdGhpcywgYnV0IHJlcXVpcmUgaXQgdG8gYmUgbm9uLXRyaXZpYWw6ICBSRUdFWFBfQ1RPUl9FTkRbdHJ1ZV0KKyAgICAgICAgLy8gVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgc3ltYm9sIG9yICQgZXNjYXBlLCBsZXN0IHRoZSByZWdleHAgY29sbGFwc2UgdG8gJy8vJy4KKyAgICAgICAgLy8gKFRoaXMgc2hvdWxkIGJlIHNpbXBsZXIsIGJ1dCBJIGRvbid0IGtub3cgaG93IHRvIGRvIGl0IHcvbyBBTlRMUiB3YXJuaW5ncyB2cy4gJy8vJyBjb21tZW50cy4pCisgICAgICAgICgKKyAgICAgICAgICAgIFJFR0VYUF9TWU1CT0wKKyAgICAgICAgICAgIHR0PVJFR0VYUF9DVE9SX0VORFt0cnVlXQorICAgICAgICB8ICAgeyFhdFZhbGlkRG9sbGFyRXNjYXBlKCl9PyAnJCcKKyAgICAgICAgICAgIHR0PVJFR0VYUF9DVE9SX0VORFt0cnVlXQorICAgICAgICB8ICAgJyQnIQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFllcywgaXQncyBhIHJlZ2V4cCBjb25zdHJ1Y3RvciwgYW5kIHdlJ3ZlIGdvdCBhIHZhbHVlIHBhcnQuCisgICAgICAgICAgICAgICAgdHQgPSBTVFJJTkdfQ1RPUl9TVEFSVDsKKyAgICAgICAgICAgICAgICBzdHJpbmdDdG9yU3RhdGUgPSBTQ1NfVkFMICsgU0NTX1JFX1RZUEU7CisgICAgICAgICAgICB9CisgICAgICAgICkKKyAgICAgICAgeyRzZXRUeXBlKHR0KTt9CisKKyAgICB8ICAgRElWICAgICAgICAgICAgICAgICB7JHNldFR5cGUoRElWKTt9CisgICAgfCAgIERJVl9BU1NJR04gICAgICAgICAgeyRzZXRUeXBlKERJVl9BU1NJR04pO30KKyAgICA7CisKK3Byb3RlY3RlZAorUkVHRVhQX0NUT1JfRU5EW2Jvb2xlYW4gZnJvbVN0YXJ0XQorcmV0dXJucyBbaW50IHR0PVNUUklOR19DVE9SX0VORF0KK29wdGlvbnMgeworICAgIHBhcmFwaHJhc2U9ImEgcmVndWxhciBleHByZXNzaW9uIGxpdGVyYWwgZW5kIjsKK30KKyAgICA6CisgICAgICAgICgKKyAgICAgICAgICAgIG9wdGlvbnMgeyAgZ3JlZWR5ID0gdHJ1ZTsgIH06CisgICAgICAgICAgICBSRUdFWFBfU1lNQk9MCisgICAgICAgIHwKKyAgICAgICAgICAgIHshYXRWYWxpZERvbGxhckVzY2FwZSgpfT8gJyQnCisgICAgICAgICkqCisgICAgICAgICggICAnLychCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZyb21TdGFydCkgICAgICB0dCA9IFNUUklOR19MSVRFUkFMOyAgLy8gcGxhaW4gcmVnZXhwIGxpdGVyYWwhCisgICAgICAgICAgICAgICAgey0tc3VwcHJlc3NOZXdsaW5lO30KKyAgICAgICAgICAgICAgICAvLyBkb25lIHdpdGggcmVnZXhwIGNvbnN0cnVjdG9yIQorICAgICAgICAgICAgICAgIC8vYXNzZXJ0KHN0cmluZ0N0b3JTdGF0ZSA9PSAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfCAgICckJyEKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBZZXMsIGl0J3MgYSByZWdleHAgY29uc3RydWN0b3IsIGFuZCB3ZSd2ZSBnb3QgYSB2YWx1ZSBwYXJ0LgorICAgICAgICAgICAgICAgIHR0ID0gKGZyb21TdGFydCA/IFNUUklOR19DVE9SX1NUQVJUIDogU1RSSU5HX0NUT1JfTUlERExFKTsKKyAgICAgICAgICAgICAgICBzdHJpbmdDdG9yU3RhdGUgPSBTQ1NfVkFMICsgU0NTX1JFX1RZUEU7CisgICAgICAgICAgICB9CisgICAgICAgICkKKyAgICAgICAgeyAgICRzZXRUeXBlKHR0KTsgIH0KKyAgICA7CisKK3Byb3RlY3RlZAorUkVHRVhQX1NZTUJPTAorb3B0aW9ucyB7CisgICAgcGFyYXBocmFzZT0iYSByZWd1bGFyIGV4cHJlc3Npb24gY2hhcmFjdGVyIjsKK30KKyAgICA6CisgICAgICAgICgKKyAgICAgICAgICAgIH4oJyonfCcvJ3wnJCd8J1xcJ3wnXG4nfCdccid8J1x1ZmZmZicpCisgICAgICAgIHwgICB7IExBKDIpIT0nLycgJiYgTEEoMikhPSdcbicgJiYgTEEoMikhPSdccicgfT8gJ1xcJyAvLyBiYWNrc2xhc2ggb25seSBlc2NhcGVzICcvJyBhbmQgRU9MCisgICAgICAgIHwgICAnXFwnICcvJyAgICAgICAgICAgICAgICAgICB7ICRzZXRUZXh0KCcvJyk7IH0KKyAgICAgICAgfCEgICdcXCcgT05FX05MW2ZhbHNlXSAgICAgICAgIHsgJHNldFRleHQoJ1xuJyk7IH0gICAgIC8vIGFsd2F5cyBub3JtYWxpemUgdG8gbmV3bGluZQorICAgICAgICApCisgICAgICAgICgnKicpKiAgICAgIC8vIHN0YXJzIGhhbmRsZWQgc3BlY2lhbGx5IHRvIGF2b2lkIGFtYmlnLiBvbiAvKiovCisgICAgOworCisvLyBlc2NhcGUgc2VxdWVuY2UgLS0gbm90ZSB0aGF0IHRoaXMgaXMgcHJvdGVjdGVkOyBpdCBjYW4gb25seSBiZSBjYWxsZWQKKy8vIGZyb20gYW5vdGhlciBsZXhlciBydWxlIC0tIGl0IHdpbGwgbm90IGV2ZXIgZGlyZWN0bHkgcmV0dXJuIGEgdG9rZW4gdG8KKy8vIHRoZSBwYXJzZXIKKy8vIFRoZXJlIGFyZSB2YXJpb3VzIGFtYmlndWl0aWVzIGh1c2hlZCBpbiB0aGlzIHJ1bGUuIFRoZSBvcHRpb25hbAorLy8gJzAnLi4uJzknIGRpZ2l0IG1hdGNoZXMgc2hvdWxkIGJlIG1hdGNoZWQgaGVyZSByYXRoZXIgdGhhbiBsZXR0aW5nCisvLyB0aGVtIGdvIGJhY2sgdG8gU1RSSU5HX0xJVEVSQUwgdG8gYmUgbWF0Y2hlZC4gQU5UTFIgZG9lcyB0aGUKKy8vIHJpZ2h0IHRoaW5nIGJ5IG1hdGNoaW5nIGltbWVkaWF0ZWx5OyBoZW5jZSwgaXQncyBvayB0byBzaHV0IG9mZgorLy8gdGhlIEZPTExPVyBhbWJpZyB3YXJuaW5ncy4KK3Byb3RlY3RlZAorRVNDCitvcHRpb25zIHsKKyAgICBwYXJhcGhyYXNlPSJhbiBlc2NhcGUgc2VxdWVuY2UiOworfQorICAgIDogICAnXFwnIQorICAgICAgICAoICAgJ24nICAgICB7JHNldFRleHQoIlxuIik7fQorICAgICAgICB8ICAgJ3InICAgICB7JHNldFRleHQoIlxyIik7fQorICAgICAgICB8ICAgJ3QnICAgICB7JHNldFRleHQoIlx0Iik7fQorICAgICAgICB8ICAgJ2InICAgICB7JHNldFRleHQoIlxiIik7fQorICAgICAgICB8ICAgJ2YnICAgICB7JHNldFRleHQoIlxmIik7fQorICAgICAgICB8ICAgJyInCisgICAgICAgIHwgICAnXCcnCisgICAgICAgIHwgICAnXFwnCisgICAgICAgIHwgICAnJCcgICAgIC8vZXNjYXBlIEdyb292eSAkIG9wZXJhdG9yIHVuaWZvcm1seSBhbHNvCisgICAgICAgIHwgICAoJ3UnKSsgeyRzZXRUZXh0KCIiKTt9CisgICAgICAgICAgICBIRVhfRElHSVQgSEVYX0RJR0lUIEhFWF9ESUdJVCBIRVhfRElHSVQKKyAgICAgICAgICAgIHtjaGFyIGNoID0gKGNoYXIpSW50ZWdlci5wYXJzZUludCgkZ2V0VGV4dCwxNik7ICRzZXRUZXh0KGNoKTt9CisgICAgICAgIHwgICAnMCcuLiczJworICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgIG9wdGlvbnMgeworICAgICAgICAgICAgICAgICAgICB3YXJuV2hlbkZvbGxvd0FtYmlnID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgOiAgICcwJy4uJzcnCisgICAgICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgICAgICBvcHRpb25zIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5XaGVuRm9sbG93QW1iaWcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIDogICAnMCcuLic3JworICAgICAgICAgICAgICAgICk/CisgICAgICAgICAgICApPworICAgICAgICAgICAge2NoYXIgY2ggPSAoY2hhcilJbnRlZ2VyLnBhcnNlSW50KCRnZXRUZXh0LDgpOyAkc2V0VGV4dChjaCk7fQorICAgICAgICB8ICAgJzQnLi4nNycKKyAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICBvcHRpb25zIHsKKyAgICAgICAgICAgICAgICAgICAgd2FybldoZW5Gb2xsb3dBbWJpZyA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIDogICAnMCcuLic3JworICAgICAgICAgICAgKT8KKyAgICAgICAgICAgIHtjaGFyIGNoID0gKGNoYXIpSW50ZWdlci5wYXJzZUludCgkZ2V0VGV4dCw4KTsgJHNldFRleHQoY2gpO30KKyAgICAgICAgKQorICAgIHwhICAnXFwnIE9ORV9OTFtmYWxzZV0KKyAgICAvL3whICBPTkVfTkxbdHJ1ZV0gICAgICAgICAgeyAkc2V0VGV4dCgnXG4nKTsgfSAgICAgICAgICAgICAvLyBhbHdheXMgbm9ybWFsaXplIHRvIG5ld2xpbmUKKyAgICA7CisKK3Byb3RlY3RlZCAKK1NUUklOR19OTFtib29sZWFuIGFsbG93TmV3bGluZV0KK29wdGlvbnMgeworICAgIHBhcmFwaHJhc2U9ImEgbmV3bGluZSBpbnNpZGUgYSBzdHJpbmciOworfQorICAgIDogIHtpZiAoIWFsbG93TmV3bGluZSkgdGhyb3cgbmV3IE1pc21hdGNoZWRDaGFyRXhjZXB0aW9uKCdcbicsICdcbicsIHRydWUsIHRoaXMpOyB9IAorICAgICAgIE9ORV9OTFtmYWxzZV0geyAkc2V0VGV4dCgnXG4nKTsgfQorICAgIDsKKworCisvLyBoZXhhZGVjaW1hbCBkaWdpdCAoYWdhaW4sIG5vdGUgaXQncyBwcm90ZWN0ZWQhKQorcHJvdGVjdGVkCitIRVhfRElHSVQKK29wdGlvbnMgeworICAgIHBhcmFwaHJhc2U9ImEgaGV4YWRlY2ltYWwgZGlnaXQiOworfQorICAgIDogICAoJzAnLi4nOSd8J0EnLi4nRid8J2EnLi4nZicpCisgICAgOworCisKKy8vIGEgZHVtbXkgcnVsZSB0byBmb3JjZSB2b2NhYnVsYXJ5IHRvIGJlIGFsbCBjaGFyYWN0ZXJzIChleGNlcHQgc3BlY2lhbAorLy8gb25lcyB0aGF0IEFOVExSIHVzZXMgaW50ZXJuYWxseSAoMCB0byAyKQorcHJvdGVjdGVkCitWT0NBQgorb3B0aW9ucyB7CisgICAgcGFyYXBocmFzZT0iYSBjaGFyYWN0ZXIiOworfQorICAgIDogICAnXDMnLi4nXDM3NycKKyAgICA7CisKKworLy8gYW4gaWRlbnRpZmllci4gTm90ZSB0aGF0IHRlc3RMaXRlcmFscyBpcyBzZXQgdG8gdHJ1ZSEgVGhpcyBtZWFucworLy8gdGhhdCBhZnRlciB3ZSBtYXRjaCB0aGUgcnVsZSwgd2UgbG9vayBpbiB0aGUgbGl0ZXJhbHMgdGFibGUgdG8gc2VlCisvLyBpZiBpdCdzIGEgbGl0ZXJhbCBvciByZWFsbHkgYW4gaWRlbnRpZmVyCitJREVOVAorb3B0aW9ucyB7CisgICAgcGFyYXBocmFzZT0iYW4gaWRlbnRpZmllciI7Cit9CisgICAgLy9vcHRpb25zIHt0ZXN0TGl0ZXJhbHM9dHJ1ZTt9ICAvLyBBY3R1YWxseSwgdGhpcyBpcyBkb25lIG1hbnVhbGx5IGluIHRoZSBhY3Rpb25zIGJlbG93LgorICAgIDogICBMRVRURVIoTEVUVEVSfERJR0lUKSoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHN0cmluZ0N0b3JTdGF0ZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKExBKDEpID09ICcuJyAmJiBMQSgyKSAhPSAnJCcgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoTEEoMikpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHBpY2sgdXAgYW5vdGhlciBuYW1lIGNvbXBvbmVudCBiZWZvcmUgZ29pbmcgbGl0ZXJhbCBhZ2FpbjoKKyAgICAgICAgICAgICAgICAgICAgcmVzdGFydFN0cmluZ0N0b3IoZmFsc2UpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGdvIGJhY2sgdG8gdGhlIHN0cmluZworICAgICAgICAgICAgICAgICAgICByZXN0YXJ0U3RyaW5nQ3Rvcih0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgdHR5cGUgPSB0ZXN0TGl0ZXJhbHNUYWJsZShJREVOVCk7CisgICAgICAgIC8qIFRoZSBncmFtbWFyIGFsbG93cyBhIGZldyBrZXl3b3JkcyB0byBmb2xsb3cgZG90LgorICAgICAgICAgKiBUT0RPOiBSZWluc3RhdGUgdGhpcyBsb2dpYyBpZiB3ZSBjaGFuZ2Ugb3IgcmVtb3ZlIGtleXdvcmRQcm9wZXJ0eU5hbWVzLgorICAgICAgICAgICAgaWYgKHR0eXBlICE9IElERU5UICYmIGxhc3RTaWdUb2tlblR5cGUgPT0gRE9UKSB7CisgICAgICAgICAgICAgICAgLy8gQSBmZXcga2V5d29yZHMgY2FuIGZvbGxvdyBhIGRvdDoKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHR0eXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBMSVRFUkFMX3RoaXM6IGNhc2UgTElURVJBTF9zdXBlcjogY2FzZSBMSVRFUkFMX2NsYXNzOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0dHlwZSA9IExJVEVSQUxfaW47ICAvLyB0aGUgcG9zdGVyIGNoaWxkIGZvciBiYWQgZG90dGVkIG5hbWVzCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAqLworICAgICAgICAgICAgJHNldFR5cGUodHR5cGUpOworCisgICAgICAgICAgICAvLyBjaGVjayBpZiAiYXNzZXJ0IiBrZXl3b3JkIGlzIGVuYWJsZWQKKyAgICAgICAgICAgIGlmIChhc3NlcnRFbmFibGVkICYmICJhc3NlcnQiLmVxdWFscygkZ2V0VGV4dCkpIHsKKyAgICAgICAgICAgICAgICAkc2V0VHlwZShMSVRFUkFMX2Fzc2VydCk7IC8vIHNldCB0b2tlbiB0eXBlIGZvciB0aGUgcnVsZSBpbiB0aGUgcGFyc2VyCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBjaGVjayBpZiAiZW51bSIga2V5d29yZCBpcyBlbmFibGVkCisgICAgICAgICAgICBpZiAoZW51bUVuYWJsZWQgJiYgImVudW0iLmVxdWFscygkZ2V0VGV4dCkpIHsKKyAgICAgICAgICAgICAgICAkc2V0VHlwZShMSVRFUkFMX2VudW0pOyAvLyBzZXQgdG9rZW4gdHlwZSBmb3IgdGhlIHJ1bGUgaW4gdGhlIHBhcnNlcgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgOworCitwcm90ZWN0ZWQKK0xFVFRFUgorb3B0aW9ucyB7CisgICAgcGFyYXBocmFzZT0iYSBsZXR0ZXIiOworfQorICAgIDogICAnYScuLid6J3wnQScuLidaJ3wnXHUwMEMwJy4uJ1x1MDBENid8J1x1MDBEOCcuLidcdTAwRjYnfCdcdTAwRjgnLi4nXHUwMEZGJ3wnXHUwMTAwJy4uJ1x1RkZGRSd8J18nCisgICAgLy8gVE9ETzogIFJlY29nbml6ZSBhbGwgdGhlIEphdmEgaWRlbnRpZmllciBzdGFydHMgaGVyZSAoZXhjZXB0ICckJykuCisgICAgOworCitwcm90ZWN0ZWQKK0RJR0lUCitvcHRpb25zIHsKKyAgICBwYXJhcGhyYXNlPSJhIGRpZ2l0IjsKK30KKyAgICA6ICAgJzAnLi4nOScKKyAgICAvLyBUT0RPOiAgUmVjb2duaXplIGFsbCB0aGUgSmF2YSBpZGVudGlmaWVyIHBhcnRzIGhlcmUgKGV4Y2VwdCAnJCcpLgorICAgIDsKKworLy8gYSBudW1lcmljIGxpdGVyYWwKK05VTV9JTlQKK29wdGlvbnMgeworICAgIHBhcmFwaHJhc2U9ImEgbnVtZXJpYyBsaXRlcmFsIjsKK30KKyAgICB7Ym9vbGVhbiBpc0RlY2ltYWw9ZmFsc2U7IFRva2VuIHQ9bnVsbDt9CisgICAgOgorLypPQlMqCisgICAgICAgICcuJyB7X3R0eXBlID0gRE9UO30KKyAgICAgICAgKAorICAgICAgICAgICAgKCgnMCcuLic5JykrIChFWFBPTkVOVCk/IChmMTpGTE9BVF9TVUZGSVgge3Q9ZjE7fSk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHQgIT0gbnVsbCAmJiB0LmdldFRleHQoKS50b1VwcGVyQ2FzZSgpLmluZGV4T2YoJ0YnKT49MCkgeworICAgICAgICAgICAgICAgICAgICBfdHR5cGUgPSBOVU1fRkxPQVQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBfdHR5cGUgPSBOVU1fRE9VQkxFOyAvLyBhc3N1bWUgZG91YmxlCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSkKKyAgICAgICAgfAorICAgICAgICAgICAgLy8gSkRLIDEuNSB0b2tlbiBmb3IgdmFyaWFibGUgbGVuZ3RoIGFyZ3VtZW50cworICAgICAgICAgICAgKCIuLiIge190dHlwZSA9IFRSSVBMRV9ET1Q7fSkKKyAgICAgICAgKT8KKyAgICB8CisqT0JTKi8KKyAgICAgICAgLy8gVE9ETzogIFRoaXMgY29tcGxleCBwYXR0ZXJuIHNlZW1zIHdyb25nLiAgVmVyaWZ5IG9yIGZpeC4KKyAgICAgICAgKCAgICcwJyB7aXNEZWNpbWFsID0gdHJ1ZTt9IC8vIHNwZWNpYWwgY2FzZSBmb3IganVzdCAnMCcKKyAgICAgICAgICAgICggICAoJ3gnfCdYJykKKyAgICAgICAgICAgICAgICB7aXNEZWNpbWFsID0gZmFsc2U7fQorICAgICAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhleAorICAgICAgICAgICAgICAgICAgICAvLyB0aGUgJ2UnfCdFJyBhbmQgZmxvYXQgc3VmZml4IHN0dWZmIGxvb2sKKyAgICAgICAgICAgICAgICAgICAgLy8gbGlrZSBoZXggZGlnaXRzLCBoZW5jZSB0aGUgKC4uLikrIGRvZXNuJ3QKKyAgICAgICAgICAgICAgICAgICAgLy8ga25vdyB3aGVuIHRvIHN0b3A6IGFtYmlnLiBBTlRMUiByZXNvbHZlcworICAgICAgICAgICAgICAgICAgICAvLyBpdCBjb3JyZWN0bHkgYnkgbWF0Y2hpbmcgaW1tZWRpYXRlbHkuIEl0CisgICAgICAgICAgICAgICAgICAgIC8vIGlzIHRoZXJlZm9yIG9rIHRvIGh1c2ggd2FybmluZy4KKyAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyB7CisgICAgICAgICAgICAgICAgICAgICAgICB3YXJuV2hlbkZvbGxvd0FtYmlnPWZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgOiAgIEhFWF9ESUdJVAorICAgICAgICAgICAgICAgICkrCisKKyAgICAgICAgICAgIHwgICAvL2Zsb2F0IG9yIGRvdWJsZSB3aXRoIGxlYWRpbmcgemVybworICAgICAgICAgICAgICAgICgoJzAnLi4nOScpKyAoJy4nKCcwJy4uJzknKXxFWFBPTkVOVHxGTE9BVF9TVUZGSVgpKSA9PiAoJzAnLi4nOScpKworCisgICAgICAgICAgICB8ICAgKCcwJy4uJzcnKSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvY3RhbAorICAgICAgICAgICAgICAgIHtpc0RlY2ltYWwgPSBmYWxzZTt9CisgICAgICAgICAgICApPworICAgICAgICB8ICAgKCcxJy4uJzknKSAoJzAnLi4nOScpKiAge2lzRGVjaW1hbD10cnVlO30gICAgICAgICAgICAgICAvLyBub24temVybyBkZWNpbWFsCisgICAgICAgICkKKyAgICAgICAgKCAgICgnbCd8J0wnKSB7IF90dHlwZSA9IE5VTV9MT05HOyB9CisgICAgICAgIHwgICAoJ2knfCdJJykgeyBfdHR5cGUgPSBOVU1fSU5UOyB9CisgICAgICAgIHwgICBCSUdfU1VGRklYIHsgX3R0eXBlID0gTlVNX0JJR19JTlQ7IH0KKworICAgICAgICAvLyBvbmx5IGNoZWNrIHRvIHNlZSBpZiBpdCdzIGEgZmxvYXQgaWYgbG9va3MgbGlrZSBkZWNpbWFsIHNvIGZhcgorICAgICAgICB8CisgICAgICAgICAgICAoficuJyB8ICcuJyAoJzAnLi4nOScpKSA9PgorICAgICAgICAgICAge2lzRGVjaW1hbH0/CisgICAgICAgICAgICAoICAgJy4nICgnMCcuLic5JykrIChFWFBPTkVOVCk/IChmMjpGTE9BVF9TVUZGSVgge3Q9ZjI7fSB8IGcyOkJJR19TVUZGSVgge3Q9ZzI7fSk/CisgICAgICAgICAgICB8ICAgRVhQT05FTlQgKGYzOkZMT0FUX1NVRkZJWCB7dD1mMzt9IHwgZzM6QklHX1NVRkZJWCB7dD1nMzt9KT8KKyAgICAgICAgICAgIHwgICBmNDpGTE9BVF9TVUZGSVgge3Q9ZjQ7fQorICAgICAgICAgICAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0cmluZyB0eHQgPSAodCA9PSBudWxsID8gIiIgOiB0LmdldFRleHQoKS50b1VwcGVyQ2FzZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAodHh0LmluZGV4T2YoJ0YnKSA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIF90dHlwZSA9IE5VTV9GTE9BVDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR4dC5pbmRleE9mKCdHJykgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBfdHR5cGUgPSBOVU1fQklHX0RFQ0lNQUw7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgX3R0eXBlID0gTlVNX0RPVUJMRTsgLy8gYXNzdW1lIGRvdWJsZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgKT8KKyAgICA7CisKKy8vIEpESyAxLjUgdG9rZW4gZm9yIGFubm90YXRpb25zIGFuZCB0aGVpciBkZWNsYXJhdGlvbnMKKy8vIGFsc28gYSBncm9vdnkgb3BlcmF0b3IgZm9yIGFjdHVhbCBmaWVsZCBhY2Nlc3MgZS5nLiAndGVsc29uLkBhZ2UnIAorQVQKK29wdGlvbnMgeworICAgIHBhcmFwaHJhc2U9IidAJyI7Cit9CisgICAgOiAgICdAJworICAgIDsKKworLy8gYSBjb3VwbGUgcHJvdGVjdGVkIG1ldGhvZHMgdG8gYXNzaXN0IGluIG1hdGNoaW5nIGZsb2F0aW5nIHBvaW50IG51bWJlcnMKK3Byb3RlY3RlZAorRVhQT05FTlQKK29wdGlvbnMgeworICAgIHBhcmFwaHJhc2U9ImFuIGV4cG9uZW50IjsKK30KKyAgICA6ICAgKCdlJ3wnRScpICgnKyd8Jy0nKT8gKCcwJy4uJzknKSsKKyAgICA7CisKKworcHJvdGVjdGVkCitGTE9BVF9TVUZGSVgKK29wdGlvbnMgeworICAgIHBhcmFwaHJhc2U9ImEgZmxvYXQgb3IgZG91YmxlIHN1ZmZpeCI7Cit9CisgICAgOiAgICdmJ3wnRid8J2QnfCdEJworICAgIDsKKworcHJvdGVjdGVkCitCSUdfU1VGRklYCitvcHRpb25zIHsKKyAgICBwYXJhcGhyYXNlPSJhIGJpZyBkZWNpbWFsIHN1ZmZpeCI7Cit9CisgICAgOiAgICdnJ3wnRycKKyAgICA7CisKKy8vIE5vdGU6IFBsZWFzZSBkb24ndCB1c2UgcGh5c2ljYWwgdGFicy4gIExvZ2ljYWwgdGFicyBmb3IgaW5kZW50IGFyZSB3aWR0aCA0LgorLy8gSGVyZSdzIGEgbGl0dGxlIGhpbnQgZm9yIHlvdSwgRW1hY3M6CisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyB0YWItd2lkdGg6IDQKKy8vIG1vZGU6IGFudGxyLW1vZGUKKy8vIGluZGVudC10YWJzLW1vZGU6IG5pbAorLy8gRW5kOgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvamF2YS9Hcm9vdmlmaWVyLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci9qYXZhL0dyb292aWZpZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTZlZjY5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvamF2YS9Hcm9vdmlmaWVyLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5hbnRsci5qYXZhOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hbnRsci5Hcm9vdnlTb3VyY2VBU1Q7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hbnRsci5wYXJzZXIuR3Jvb3Z5VG9rZW5UeXBlczsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudGxyLnRyZWV3YWxrZXIuVmlzaXRvckFkYXB0ZXI7CisKK3B1YmxpYyBjbGFzcyBHcm9vdmlmaWVyIGV4dGVuZHMgVmlzaXRvckFkYXB0ZXIgaW1wbGVtZW50cyBHcm9vdnlUb2tlblR5cGVzIHsKKyAgICBwcml2YXRlIFN0cmluZ1tdIHRva2VuTmFtZXM7CisgICAgCisJcHVibGljIEdyb292aWZpZXIoU3RyaW5nW10gdG9rZW5OYW1lcykgeworCQl0aGlzLnRva2VuTmFtZXMgPSB0b2tlbk5hbWVzOworCX0KKwkKKyAgICBwdWJsaWMgdm9pZCB2aXNpdERlZmF1bHQoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7CisgICAgICAgIGlmICh2aXNpdCA9PSBPUEVOSU5HX1ZJU0lUKSB7CisgICAgICAgICAgICAvLyBvbmx5IHdhbnQgdG8gZG8gdGhpcyBvbmNlIHBlciBub2RlLi4uCisKKyAgICAgICAgCS8vIHJlbW92ZSAncHVibGljJyB3aGVuIGltcGxpZWQgYWxyZWFkeQorICAgICAgICAJaWYgKHQuZ2V0VHlwZSgpID09IExJVEVSQUxfcHVibGljKSB7CisgICAgICAgIAkJdC5zZXRUeXBlKEVYUFIpOworICAgICAgICAJfQorICAgICAgICAJCisgICAgICAgIAkvLyBjb25zdHJ1Y3RvcnMgYXJlIG5vdCBkaXN0aW5ndWlzaGVkIGZyb20gbWV0aG9kcyBpbiBqYXZhIGFzdAorICAgICAgICAJaWYgKHQuZ2V0VHlwZSgpID09IE1FVEhPRF9ERUYpIHsKKyAgICAgICAgCQlTdHJpbmcgbWV0aG9kTmFtZSA9IHQuY2hpbGRPZlR5cGUoSURFTlQpLmdldFRleHQoKTsKKyAgICAgICAgCQlpZiAobWV0aG9kTmFtZSAhPSBudWxsICYmIG1ldGhvZE5hbWUubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgIAkJCWlmIChDaGFyYWN0ZXIuaXNVcHBlckNhc2UobWV0aG9kTmFtZS5jaGFyQXQoMCkpKSB7IC8vIHRvZG8gLSByZXBsYWNlIG5haXZlIHVwcGVyY2FzZSBjaGVjayBmb3IgY29uc3RydWN0b3JzIHdpdGggY2hlY2sgZm9yIGN1cnJlbnQgY2xhc3NuYW1lCisgICAgICAgIAkJCQl0LnNldFR5cGUoQ1RPUl9JREVOVCk7CisgICAgICAgIAkJCX0KKyAgICAgICAgCQl9CisgICAgICAgIAl9CisKKyAgICAgICAgCQorLyogICAgICAgIAlpZiAodC5nZXRUeXBlKCkgPT0gTU9ESUZJRVJTKSB7CisgICAgICAgCQkJR3Jvb3Z5U291cmNlQVNUIHB1YmxpY05vZGUgPSB0LmNoaWxkT2ZUeXBlKExJVEVSQUxfcHVibGljKTsKKyAgICAgICAJCQlpZiAodC5nZXROdW1iZXJPZkNoaWxkcmVuKCkgPiAxICYmIHB1YmxpY05vZGUgIT0gbnVsbCkgeworICAgICAgIAkJCQkvLyBoYXMgbW9yZSB0aGFuIG9uZSBtb2RpZmllciwgYW5kIG9uZSBvZiB0aGVtIGlzIHB1YmxpYworICAgICAgIAkJCQkKKyAgICAgICAJCQkJLy8gZGVsZXRlICdwdWJsaWMnIG5vZGUKKyAgICAgICAJCQkJcHVibGljTm9kZS5zZXRUeXBlKEVYUFIpOyAvLyBuZWFyIGVub3VnaCB0aGUgc2FtZSBhcyBkZWxldGUgZm9yIG5vdy4uLgorICAgICAgIAkJCX0KKyAgICAgICAgCX0qLworICAgICAgICAJLy8gLS0tLSAgICAgICAgCQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvamF2YS9KYXZhMkdyb292eUNvbnZlcnRlci5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvamF2YS9KYXZhMkdyb292eUNvbnZlcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MDYyNTUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci9qYXZhL0phdmEyR3Jvb3Z5Q29udmVydGVyLmphdmEKQEAgLTAsMCArMSwyMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50bHIuamF2YTsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50bHIuR3Jvb3Z5U291cmNlQVNUOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50bHIucGFyc2VyLkdyb292eVRva2VuVHlwZXM7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hbnRsci50cmVld2Fsa2VyLlZpc2l0b3JBZGFwdGVyOworCitwdWJsaWMgY2xhc3MgSmF2YTJHcm9vdnlDb252ZXJ0ZXIgZXh0ZW5kcyBWaXNpdG9yQWRhcHRlcnsKKyAgICBwcml2YXRlIFN0cmluZ1tdIHRva2VuTmFtZXM7CisgICAgcHJpdmF0ZSBpbnRbXSB0eXBlTWFwcGluZzsKKyAgICAKKwlwdWJsaWMgSmF2YTJHcm9vdnlDb252ZXJ0ZXIoU3RyaW5nW10gdG9rZW5OYW1lcykgeworCQl0aGlzLnRva2VuTmFtZXMgPSB0b2tlbk5hbWVzOworCQl0eXBlTWFwcGluZyA9IG5ldyBpbnRbNDAwXTsgLy8gbWFnaWMgbnVtYmVyLCBtdWNoIGdyZWF0ZXIgdGhhbiBjdXJyZW50IG51bWJlciBvZiBqYXZhIHRva2VucworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5BQlNUUkFDVF0gPSBHcm9vdnlUb2tlblR5cGVzLkFCU1RSQUNUOworCQkKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuRU9GXSA9IEdyb292eVRva2VuVHlwZXMuRU9GOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5OVUxMX1RSRUVfTE9PS0FIRUFEXSA9IEdyb292eVRva2VuVHlwZXMuTlVMTF9UUkVFX0xPT0tBSEVBRDsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuQkxPQ0tdID0gR3Jvb3Z5VG9rZW5UeXBlcy5CTE9DSzsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuTU9ESUZJRVJTXSA9IEdyb292eVRva2VuVHlwZXMuTU9ESUZJRVJTOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5PQkpCTE9DS10gPSBHcm9vdnlUb2tlblR5cGVzLk9CSkJMT0NLOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5TTElTVF0gPSBHcm9vdnlUb2tlblR5cGVzLlNMSVNUOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5NRVRIT0RfREVGXSA9IEdyb292eVRva2VuVHlwZXMuTUVUSE9EX0RFRjsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuVkFSSUFCTEVfREVGXSA9IEdyb292eVRva2VuVHlwZXMuVkFSSUFCTEVfREVGOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5JTlNUQU5DRV9JTklUXSA9IEdyb292eVRva2VuVHlwZXMuSU5TVEFOQ0VfSU5JVDsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuU1RBVElDX0lOSVRdID0gR3Jvb3Z5VG9rZW5UeXBlcy5TVEFUSUNfSU5JVDsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuVFlQRV0gPSBHcm9vdnlUb2tlblR5cGVzLlRZUEU7CisJCXR5cGVNYXBwaW5nW0phdmFUb2tlblR5cGVzLkNMQVNTX0RFRl0gPSBHcm9vdnlUb2tlblR5cGVzLkNMQVNTX0RFRjsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuSU5URVJGQUNFX0RFRl0gPSBHcm9vdnlUb2tlblR5cGVzLklOVEVSRkFDRV9ERUY7CisJCXR5cGVNYXBwaW5nW0phdmFUb2tlblR5cGVzLlBBQ0tBR0VfREVGXSA9IEdyb292eVRva2VuVHlwZXMuUEFDS0FHRV9ERUY7CisJCXR5cGVNYXBwaW5nW0phdmFUb2tlblR5cGVzLkFSUkFZX0RFQ0xBUkFUT1JdID0gR3Jvb3Z5VG9rZW5UeXBlcy5BUlJBWV9ERUNMQVJBVE9SOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5FWFRFTkRTX0NMQVVTRV0gPSBHcm9vdnlUb2tlblR5cGVzLkVYVEVORFNfQ0xBVVNFOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5JTVBMRU1FTlRTX0NMQVVTRV0gPSBHcm9vdnlUb2tlblR5cGVzLklNUExFTUVOVFNfQ0xBVVNFOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5QQVJBTUVURVJTXSA9IEdyb292eVRva2VuVHlwZXMuUEFSQU1FVEVSUzsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuUEFSQU1FVEVSX0RFRl0gPSBHcm9vdnlUb2tlblR5cGVzLlBBUkFNRVRFUl9ERUY7CisJCXR5cGVNYXBwaW5nW0phdmFUb2tlblR5cGVzLkxBQkVMRURfU1RBVF0gPSBHcm9vdnlUb2tlblR5cGVzLkxBQkVMRURfU1RBVDsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuVFlQRUNBU1RdID0gR3Jvb3Z5VG9rZW5UeXBlcy5UWVBFQ0FTVDsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuSU5ERVhfT1BdID0gR3Jvb3Z5VG9rZW5UeXBlcy5JTkRFWF9PUDsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuUE9TVF9JTkNdID0gR3Jvb3Z5VG9rZW5UeXBlcy5QT1NUX0lOQzsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuUE9TVF9ERUNdID0gR3Jvb3Z5VG9rZW5UeXBlcy5QT1NUX0RFQzsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuTUVUSE9EX0NBTExdID0gR3Jvb3Z5VG9rZW5UeXBlcy5NRVRIT0RfQ0FMTDsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuRVhQUl0gPSBHcm9vdnlUb2tlblR5cGVzLkVYUFI7CisJCXR5cGVNYXBwaW5nW0phdmFUb2tlblR5cGVzLkFSUkFZX0lOSVRdID0gR3Jvb3Z5VG9rZW5UeXBlcy5MSVNUX0NPTlNUUlVDVE9SOyAvLyB0aGlzIGFzc3VtZXMgTElTVF9DT05TVFJVQ1RPUiBzZXQgYnkgUHJlSmF2YTJHcm9vdnlDb252ZXJ0b3IKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuSU1QT1JUXSA9IEdyb292eVRva2VuVHlwZXMuSU1QT1JUOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5VTkFSWV9NSU5VU10gPSBHcm9vdnlUb2tlblR5cGVzLlVOQVJZX01JTlVTOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5VTkFSWV9QTFVTXSA9IEdyb292eVRva2VuVHlwZXMuVU5BUllfUExVUzsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuQ0FTRV9HUk9VUF0gPSBHcm9vdnlUb2tlblR5cGVzLkNBU0VfR1JPVVA7CisJCXR5cGVNYXBwaW5nW0phdmFUb2tlblR5cGVzLkVMSVNUXSA9IEdyb292eVRva2VuVHlwZXMuRUxJU1Q7CisJCXR5cGVNYXBwaW5nW0phdmFUb2tlblR5cGVzLkZPUl9JTklUXSA9IEdyb292eVRva2VuVHlwZXMuRk9SX0lOSVQ7CisJCXR5cGVNYXBwaW5nW0phdmFUb2tlblR5cGVzLkZPUl9DT05ESVRJT05dID0gR3Jvb3Z5VG9rZW5UeXBlcy5GT1JfQ09ORElUSU9OOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5GT1JfSVRFUkFUT1JdID0gR3Jvb3Z5VG9rZW5UeXBlcy5GT1JfSVRFUkFUT1I7CisJCXR5cGVNYXBwaW5nW0phdmFUb2tlblR5cGVzLkVNUFRZX1NUQVRdID0gR3Jvb3Z5VG9rZW5UeXBlcy5FTVBUWV9TVEFUOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5GSU5BTF0gPSBHcm9vdnlUb2tlblR5cGVzLkZJTkFMOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5BQlNUUkFDVF0gPSBHcm9vdnlUb2tlblR5cGVzLkFCU1RSQUNUOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5TVFJJQ1RGUF0gPSBHcm9vdnlUb2tlblR5cGVzLlNUUklDVEZQOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5TVVBFUl9DVE9SX0NBTExdID0gR3Jvb3Z5VG9rZW5UeXBlcy5TVVBFUl9DVE9SX0NBTEw7CisJCXR5cGVNYXBwaW5nW0phdmFUb2tlblR5cGVzLkNUT1JfQ0FMTF0gPSBHcm9vdnlUb2tlblR5cGVzLkNUT1JfQ0FMTDsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuVkFSSUFCTEVfUEFSQU1FVEVSX0RFRl0gPSBHcm9vdnlUb2tlblR5cGVzLlZBUklBQkxFX1BBUkFNRVRFUl9ERUY7CisJCXR5cGVNYXBwaW5nW0phdmFUb2tlblR5cGVzLlNUQVRJQ19JTVBPUlRdID0gR3Jvb3Z5VG9rZW5UeXBlcy5TVEFUSUNfSU1QT1JUOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5FTlVNX0RFRl0gPSBHcm9vdnlUb2tlblR5cGVzLkVOVU1fREVGOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5FTlVNX0NPTlNUQU5UX0RFRl0gPSBHcm9vdnlUb2tlblR5cGVzLkVOVU1fQ09OU1RBTlRfREVGOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5GT1JfRUFDSF9DTEFVU0VdID0gR3Jvb3Z5VG9rZW5UeXBlcy5GT1JfRUFDSF9DTEFVU0U7CisJCXR5cGVNYXBwaW5nW0phdmFUb2tlblR5cGVzLkFOTk9UQVRJT05fREVGXSA9IEdyb292eVRva2VuVHlwZXMuQU5OT1RBVElPTl9ERUY7CisJCXR5cGVNYXBwaW5nW0phdmFUb2tlblR5cGVzLkFOTk9UQVRJT05TXSA9IEdyb292eVRva2VuVHlwZXMuQU5OT1RBVElPTlM7CisJCXR5cGVNYXBwaW5nW0phdmFUb2tlblR5cGVzLkFOTk9UQVRJT05dID0gR3Jvb3Z5VG9rZW5UeXBlcy5BTk5PVEFUSU9OOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5BTk5PVEFUSU9OX01FTUJFUl9WQUxVRV9QQUlSXSA9IEdyb292eVRva2VuVHlwZXMuQU5OT1RBVElPTl9NRU1CRVJfVkFMVUVfUEFJUjsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuQU5OT1RBVElPTl9GSUVMRF9ERUZdID0gR3Jvb3Z5VG9rZW5UeXBlcy5BTk5PVEFUSU9OX0ZJRUxEX0RFRjsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuQU5OT1RBVElPTl9BUlJBWV9JTklUXSA9IEdyb292eVRva2VuVHlwZXMuQU5OT1RBVElPTl9BUlJBWV9JTklUOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5UWVBFX0FSR1VNRU5UU10gPSBHcm9vdnlUb2tlblR5cGVzLlRZUEVfQVJHVU1FTlRTOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5UWVBFX0FSR1VNRU5UXSA9IEdyb292eVRva2VuVHlwZXMuVFlQRV9BUkdVTUVOVDsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuVFlQRV9QQVJBTUVURVJTXSA9IEdyb292eVRva2VuVHlwZXMuVFlQRV9QQVJBTUVURVJTOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5UWVBFX1BBUkFNRVRFUl0gPSBHcm9vdnlUb2tlblR5cGVzLlRZUEVfUEFSQU1FVEVSOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5XSUxEQ0FSRF9UWVBFXSA9IEdyb292eVRva2VuVHlwZXMuV0lMRENBUkRfVFlQRTsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuVFlQRV9VUFBFUl9CT1VORFNdID0gR3Jvb3Z5VG9rZW5UeXBlcy5UWVBFX1VQUEVSX0JPVU5EUzsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuVFlQRV9MT1dFUl9CT1VORFNdID0gR3Jvb3Z5VG9rZW5UeXBlcy5UWVBFX0xPV0VSX0JPVU5EUzsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuTElURVJBTF9wYWNrYWdlXSA9IEdyb292eVRva2VuVHlwZXMuTElURVJBTF9wYWNrYWdlOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5TRU1JXSA9IEdyb292eVRva2VuVHlwZXMuU0VNSTsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuTElURVJBTF9pbXBvcnRdID0gR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX2ltcG9ydDsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuTElURVJBTF9zdGF0aWNdID0gR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX3N0YXRpYzsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuTEJSQUNLXSA9IEdyb292eVRva2VuVHlwZXMuTEJSQUNLOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5SQlJBQ0tdID0gR3Jvb3Z5VG9rZW5UeXBlcy5SQlJBQ0s7CisJCXR5cGVNYXBwaW5nW0phdmFUb2tlblR5cGVzLklERU5UXSA9IEdyb292eVRva2VuVHlwZXMuSURFTlQ7CisJCXR5cGVNYXBwaW5nW0phdmFUb2tlblR5cGVzLkRPVF0gPSBHcm9vdnlUb2tlblR5cGVzLkRPVDsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuUVVFU1RJT05dID0gR3Jvb3Z5VG9rZW5UeXBlcy5RVUVTVElPTjsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuTElURVJBTF9leHRlbmRzXSA9IEdyb292eVRva2VuVHlwZXMuTElURVJBTF9leHRlbmRzOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5MSVRFUkFMX3N1cGVyXSA9IEdyb292eVRva2VuVHlwZXMuTElURVJBTF9zdXBlcjsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuTFRdID0gR3Jvb3Z5VG9rZW5UeXBlcy5MVDsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuQ09NTUFdID0gR3Jvb3Z5VG9rZW5UeXBlcy5DT01NQTsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuR1RdID0gR3Jvb3Z5VG9rZW5UeXBlcy5HVDsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuU1JdID0gR3Jvb3Z5VG9rZW5UeXBlcy5TUjsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuQlNSXSA9IEdyb292eVRva2VuVHlwZXMuQlNSOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5MSVRFUkFMX3ZvaWRdID0gR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX3ZvaWQ7CisJCXR5cGVNYXBwaW5nW0phdmFUb2tlblR5cGVzLkxJVEVSQUxfYm9vbGVhbl0gPSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfYm9vbGVhbjsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuTElURVJBTF9ieXRlXSA9IEdyb292eVRva2VuVHlwZXMuTElURVJBTF9ieXRlOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5MSVRFUkFMX2NoYXJdID0gR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX2NoYXI7CisJCXR5cGVNYXBwaW5nW0phdmFUb2tlblR5cGVzLkxJVEVSQUxfc2hvcnRdID0gR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX3Nob3J0OworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5MSVRFUkFMX2ludF0gPSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfaW50OworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5MSVRFUkFMX2Zsb2F0XSA9IEdyb292eVRva2VuVHlwZXMuTElURVJBTF9mbG9hdDsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuTElURVJBTF9sb25nXSA9IEdyb292eVRva2VuVHlwZXMuTElURVJBTF9sb25nOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5MSVRFUkFMX2RvdWJsZV0gPSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfZG91YmxlOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5TVEFSXSA9IEdyb292eVRva2VuVHlwZXMuU1RBUjsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuTElURVJBTF9wcml2YXRlXSA9IEdyb292eVRva2VuVHlwZXMuTElURVJBTF9wcml2YXRlOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5MSVRFUkFMX3B1YmxpY10gPSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfcHVibGljOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5MSVRFUkFMX3Byb3RlY3RlZF0gPSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfcHJvdGVjdGVkOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5MSVRFUkFMX3RyYW5zaWVudF0gPSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfdHJhbnNpZW50OworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5MSVRFUkFMX25hdGl2ZV0gPSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfbmF0aXZlOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5MSVRFUkFMX3RocmVhZHNhZmVdID0gR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX3RocmVhZHNhZmU7CisJCXR5cGVNYXBwaW5nW0phdmFUb2tlblR5cGVzLkxJVEVSQUxfc3luY2hyb25pemVkXSA9IEdyb292eVRva2VuVHlwZXMuTElURVJBTF9zeW5jaHJvbml6ZWQ7CisJCXR5cGVNYXBwaW5nW0phdmFUb2tlblR5cGVzLkxJVEVSQUxfdm9sYXRpbGVdID0gR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX3ZvbGF0aWxlOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5BVF0gPSBHcm9vdnlUb2tlblR5cGVzLkFUOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5MUEFSRU5dID0gR3Jvb3Z5VG9rZW5UeXBlcy5MUEFSRU47CisJCXR5cGVNYXBwaW5nW0phdmFUb2tlblR5cGVzLlJQQVJFTl0gPSBHcm9vdnlUb2tlblR5cGVzLlJQQVJFTjsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuQVNTSUdOXSA9IEdyb292eVRva2VuVHlwZXMuQVNTSUdOOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5MQ1VSTFldID0gR3Jvb3Z5VG9rZW5UeXBlcy5MQ1VSTFk7CisJCXR5cGVNYXBwaW5nW0phdmFUb2tlblR5cGVzLlJDVVJMWV0gPSBHcm9vdnlUb2tlblR5cGVzLlJDVVJMWTsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuTElURVJBTF9jbGFzc10gPSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfY2xhc3M7CisJCXR5cGVNYXBwaW5nW0phdmFUb2tlblR5cGVzLkxJVEVSQUxfaW50ZXJmYWNlXSA9IEdyb292eVRva2VuVHlwZXMuTElURVJBTF9pbnRlcmZhY2U7CisJCXR5cGVNYXBwaW5nW0phdmFUb2tlblR5cGVzLkxJVEVSQUxfZW51bV0gPSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfZW51bTsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuQkFORF0gPSBHcm9vdnlUb2tlblR5cGVzLkJBTkQ7CisJCXR5cGVNYXBwaW5nW0phdmFUb2tlblR5cGVzLkxJVEVSQUxfZGVmYXVsdF0gPSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfZGVmYXVsdDsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuTElURVJBTF9pbXBsZW1lbnRzXSA9IEdyb292eVRva2VuVHlwZXMuTElURVJBTF9pbXBsZW1lbnRzOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5MSVRFUkFMX3RoaXNdID0gR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX3RoaXM7CisJCXR5cGVNYXBwaW5nW0phdmFUb2tlblR5cGVzLkxJVEVSQUxfdGhyb3dzXSA9IEdyb292eVRva2VuVHlwZXMuTElURVJBTF90aHJvd3M7CisJCXR5cGVNYXBwaW5nW0phdmFUb2tlblR5cGVzLlRSSVBMRV9ET1RdID0gR3Jvb3Z5VG9rZW5UeXBlcy5UUklQTEVfRE9UOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5DT0xPTl0gPSBHcm9vdnlUb2tlblR5cGVzLkNPTE9OOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5MSVRFUkFMX2lmXSA9IEdyb292eVRva2VuVHlwZXMuTElURVJBTF9pZjsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuTElURVJBTF9lbHNlXSA9IEdyb292eVRva2VuVHlwZXMuTElURVJBTF9lbHNlOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5MSVRFUkFMX3doaWxlXSA9IEdyb292eVRva2VuVHlwZXMuTElURVJBTF93aGlsZTsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuTElURVJBTF9kb10gPSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfd2hpbGU7IC8vIHdhcm5pbmcgLSBkby4uLndoaWxlLi4uIGlnbm9yZWQKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuTElURVJBTF9icmVha10gPSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfYnJlYWs7CisJCXR5cGVNYXBwaW5nW0phdmFUb2tlblR5cGVzLkxJVEVSQUxfY29udGludWVdID0gR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX2NvbnRpbnVlOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5MSVRFUkFMX3JldHVybl0gPSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfcmV0dXJuOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5MSVRFUkFMX3N3aXRjaF0gPSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfc3dpdGNoOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5MSVRFUkFMX3Rocm93XSA9IEdyb292eVRva2VuVHlwZXMuTElURVJBTF90aHJvdzsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuTElURVJBTF9hc3NlcnRdID0gR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX2Fzc2VydDsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuTElURVJBTF9mb3JdID0gR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX2ZvcjsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuTElURVJBTF9jYXNlXSA9IEdyb292eVRva2VuVHlwZXMuTElURVJBTF9jYXNlOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5MSVRFUkFMX3RyeV0gPSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfdHJ5OworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5MSVRFUkFMX2ZpbmFsbHldID0gR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX2ZpbmFsbHk7CisJCXR5cGVNYXBwaW5nW0phdmFUb2tlblR5cGVzLkxJVEVSQUxfY2F0Y2hdID0gR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX2NhdGNoOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5QTFVTX0FTU0lHTl0gPSBHcm9vdnlUb2tlblR5cGVzLlBMVVNfQVNTSUdOOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5NSU5VU19BU1NJR05dID0gR3Jvb3Z5VG9rZW5UeXBlcy5NSU5VU19BU1NJR047CisJCXR5cGVNYXBwaW5nW0phdmFUb2tlblR5cGVzLlNUQVJfQVNTSUdOXSA9IEdyb292eVRva2VuVHlwZXMuU1RBUl9BU1NJR047CisJCXR5cGVNYXBwaW5nW0phdmFUb2tlblR5cGVzLkRJVl9BU1NJR05dID0gR3Jvb3Z5VG9rZW5UeXBlcy5ESVZfQVNTSUdOOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5NT0RfQVNTSUdOXSA9IEdyb292eVRva2VuVHlwZXMuTU9EX0FTU0lHTjsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuU1JfQVNTSUdOXSA9IEdyb292eVRva2VuVHlwZXMuU1JfQVNTSUdOOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5CU1JfQVNTSUdOXSA9IEdyb292eVRva2VuVHlwZXMuQlNSX0FTU0lHTjsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuU0xfQVNTSUdOXSA9IEdyb292eVRva2VuVHlwZXMuU0xfQVNTSUdOOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5CQU5EX0FTU0lHTl0gPSBHcm9vdnlUb2tlblR5cGVzLkJBTkRfQVNTSUdOOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5CWE9SX0FTU0lHTl0gPSBHcm9vdnlUb2tlblR5cGVzLkJYT1JfQVNTSUdOOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5CT1JfQVNTSUdOXSA9IEdyb292eVRva2VuVHlwZXMuQk9SX0FTU0lHTjsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuTE9SXSA9IEdyb292eVRva2VuVHlwZXMuTE9SOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5MQU5EXSA9IEdyb292eVRva2VuVHlwZXMuTEFORDsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuQk9SXSA9IEdyb292eVRva2VuVHlwZXMuQk9SOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5CWE9SXSA9IEdyb292eVRva2VuVHlwZXMuQlhPUjsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuTk9UX0VRVUFMXSA9IEdyb292eVRva2VuVHlwZXMuTk9UX0VRVUFMOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5FUVVBTF0gPSBHcm9vdnlUb2tlblR5cGVzLkVRVUFMOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5MRV0gPSBHcm9vdnlUb2tlblR5cGVzLkxFOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5HRV0gPSBHcm9vdnlUb2tlblR5cGVzLkdFOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5MSVRFUkFMX2luc3RhbmNlb2ZdID0gR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX2luc3RhbmNlb2Y7CisJCXR5cGVNYXBwaW5nW0phdmFUb2tlblR5cGVzLlNMXSA9IEdyb292eVRva2VuVHlwZXMuU0w7CisJCXR5cGVNYXBwaW5nW0phdmFUb2tlblR5cGVzLlBMVVNdID0gR3Jvb3Z5VG9rZW5UeXBlcy5QTFVTOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5NSU5VU10gPSBHcm9vdnlUb2tlblR5cGVzLk1JTlVTOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5ESVZdID0gR3Jvb3Z5VG9rZW5UeXBlcy5ESVY7CisJCXR5cGVNYXBwaW5nW0phdmFUb2tlblR5cGVzLk1PRF0gPSBHcm9vdnlUb2tlblR5cGVzLk1PRDsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuSU5DXSA9IEdyb292eVRva2VuVHlwZXMuSU5DOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5ERUNdID0gR3Jvb3Z5VG9rZW5UeXBlcy5ERUM7CisJCXR5cGVNYXBwaW5nW0phdmFUb2tlblR5cGVzLkJOT1RdID0gR3Jvb3Z5VG9rZW5UeXBlcy5CTk9UOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5MTk9UXSA9IEdyb292eVRva2VuVHlwZXMuTE5PVDsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuTElURVJBTF90cnVlXSA9IEdyb292eVRva2VuVHlwZXMuTElURVJBTF90cnVlOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5MSVRFUkFMX2ZhbHNlXSA9IEdyb292eVRva2VuVHlwZXMuTElURVJBTF9mYWxzZTsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuTElURVJBTF9udWxsXSA9IEdyb292eVRva2VuVHlwZXMuTElURVJBTF9udWxsOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5MSVRFUkFMX25ld10gPSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfbmV3OworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5OVU1fSU5UXSA9IEdyb292eVRva2VuVHlwZXMuTlVNX0lOVDsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuQ0hBUl9MSVRFUkFMXSA9IEdyb292eVRva2VuVHlwZXMuU1RSSU5HX0xJVEVSQUw7IC8vIHdhcm5pbmc6IHRyZWF0aW5nIEphdmEgY2hhcnMgYXMgIlN0cmluZyIgaW4gR3Jvb3Z5CisJCXR5cGVNYXBwaW5nW0phdmFUb2tlblR5cGVzLlNUUklOR19MSVRFUkFMXSA9IEdyb292eVRva2VuVHlwZXMuU1RSSU5HX0xJVEVSQUw7CisJCXR5cGVNYXBwaW5nW0phdmFUb2tlblR5cGVzLk5VTV9GTE9BVF0gPSBHcm9vdnlUb2tlblR5cGVzLk5VTV9GTE9BVDsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuTlVNX0xPTkddID0gR3Jvb3Z5VG9rZW5UeXBlcy5OVU1fTE9ORzsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuTlVNX0RPVUJMRV0gPSBHcm9vdnlUb2tlblR5cGVzLk5VTV9ET1VCTEU7CisJCXR5cGVNYXBwaW5nW0phdmFUb2tlblR5cGVzLldTXSA9IEdyb292eVRva2VuVHlwZXMuV1M7CisJCXR5cGVNYXBwaW5nW0phdmFUb2tlblR5cGVzLlNMX0NPTU1FTlRdID0gR3Jvb3Z5VG9rZW5UeXBlcy5TTF9DT01NRU5UOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5NTF9DT01NRU5UXSA9IEdyb292eVRva2VuVHlwZXMuTUxfQ09NTUVOVDsKKwkJdHlwZU1hcHBpbmdbSmF2YVRva2VuVHlwZXMuRVNDXSA9IEdyb292eVRva2VuVHlwZXMuRVNDOworCQl0eXBlTWFwcGluZ1tKYXZhVG9rZW5UeXBlcy5IRVhfRElHSVRdID0gR3Jvb3Z5VG9rZW5UeXBlcy5IRVhfRElHSVQ7CisJCXR5cGVNYXBwaW5nW0phdmFUb2tlblR5cGVzLlZPQ0FCXSA9IEdyb292eVRva2VuVHlwZXMuVk9DQUI7CisJCXR5cGVNYXBwaW5nW0phdmFUb2tlblR5cGVzLkVYUE9ORU5UXSA9IEdyb292eVRva2VuVHlwZXMuRVhQT05FTlQ7CisJCXR5cGVNYXBwaW5nW0phdmFUb2tlblR5cGVzLkZMT0FUX1NVRkZJWF0gPSBHcm9vdnlUb2tlblR5cGVzLkZMT0FUX1NVRkZJWDsKKwl9CisJCisgICAgcHVibGljIHZvaWQgdmlzaXREZWZhdWx0KEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkgeworICAgICAgICBpZiAodmlzaXQgPT0gT1BFTklOR19WSVNJVCkgeworICAgICAgICAJLy8gb25seSB3YW50IHRvIGRvIHRoaXMgb25jZSBwZXIgbm9kZS4uLgorICAgICAgICAJdC5zZXRUeXBlKHR5cGVNYXBwaW5nW3QuZ2V0VHlwZSgpXSk7CisgICAgICAgICAgIAkvLyAtLS0tCisKKyAgICAgICAgCS8vIG5lZWQgdG8gcmVtb3ZlIGRvdWJsZSBxdW90ZXMgaW4gc3RyaW5nIGxpdGVyYWxzCisgICAgICAgIAkvLyBhcyBncm9vdnkgQVNUIGRvZXNuJ3QgZXhwZWN0IHRvIGhhdmUgdGhlbQorICAgICAgICAJaWYgKHQuZ2V0VHlwZSgpID09IEdyb292eVRva2VuVHlwZXMuU1RSSU5HX0xJVEVSQUwpIHsKKyAgICAgICAgCQlTdHJpbmcgdGV4dCA9IHQuZ2V0VGV4dCgpOworICAgICAgICAJCWlmIChpc1NpbmdsZVF1b3RlZCh0ZXh0KSkgeworICAgICAgICAJCQl0LnNldFRleHQodGV4dC5zdWJzdHJpbmcoMSwgdGV4dC5sZW5ndGgoKSAtIDEpKTsgLy8gY2hvcCBvZmYgdGhlIHNpbmdsZSBxdW90ZXMgYXQgc3RhcnQgYW5kIGVuZAorICAgICAgICAJCX0gZWxzZSBpZiAoaXNEb3VibGVRdW90ZWQodGV4dCkpIHsKKyAgICAgICAgCQkJdC5zZXRUZXh0KHRleHQuc3Vic3RyaW5nKDEsIHRleHQubGVuZ3RoKCkgLSAxKSk7IC8vIGNob3Agb2ZmIHRoZSBkb3VibGUgcXVvdGVzIGF0IHN0YXJ0IGFuZCBlbmQKKyAgICAgICAgCQl9CisgICAgICAgIAl9CisgICAgICAgIH0KKyAgICB9CisKKwlwcml2YXRlIGJvb2xlYW4gaXNTaW5nbGVRdW90ZWQoU3RyaW5nIHRleHQpIHsKKwkJcmV0dXJuIHRleHQgIT0gbnVsbCAmJiB0ZXh0Lmxlbmd0aCgpID4gMiAKKwkJCQkmJiB0ZXh0LmNoYXJBdCgwKSA9PSAnXCcnIAorCQkJCSYmIHRleHQuY2hhckF0KHRleHQubGVuZ3RoKCkgLSAxKSA9PSAnXCcnOworCX0KKwlwcml2YXRlIGJvb2xlYW4gaXNEb3VibGVRdW90ZWQoU3RyaW5nIHRleHQpIHsKKwkJcmV0dXJuIHRleHQgIT0gbnVsbCAmJiB0ZXh0Lmxlbmd0aCgpID4gMiAKKwkJCQkmJiB0ZXh0LmNoYXJBdCgwKSA9PSAnIicgCisJCQkJJiYgdGV4dC5jaGFyQXQodGV4dC5sZW5ndGgoKSAtIDEpID09ICciJzsKKwl9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci9qYXZhL0phdmEyR3Jvb3Z5TWFpbi5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvamF2YS9KYXZhMkdyb292eU1haW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2YzMjc2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvamF2YS9KYXZhMkdyb292eU1haW4uamF2YQpAQCAtMCwwICsxLDIwOCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50bHIuamF2YTsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jbGkuQ29tbWFuZExpbmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNsaS5PcHRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jbGkuUG9zaXhQYXJzZXI7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hbnRsci5BbnRsckFTVFByb2Nlc3NvcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudGxyLlNvdXJjZUJ1ZmZlcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudGxyLlVuaWNvZGVFc2NhcGluZ1JlYWRlcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudGxyLnBhcnNlci5Hcm9vdnlMZXhlcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudGxyLnBhcnNlci5Hcm9vdnlSZWNvZ25pemVyOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50bHIudHJlZXdhbGtlci4qOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5EZWZhdWx0R3Jvb3Z5TWV0aG9kczsKKworaW1wb3J0IGFudGxyLmNvbGxlY3Rpb25zLkFTVDsKKworcHVibGljIGNsYXNzIEphdmEyR3Jvb3Z5TWFpbiB7CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisJCXRyeXsKKwkJCU9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7CisJCQlQb3NpeFBhcnNlciBjbGlQYXJzZXIgPSBuZXcgUG9zaXhQYXJzZXIoKTsKKwkJCUNvbW1hbmRMaW5lIGNsaSA9IGNsaVBhcnNlci5wYXJzZShvcHRpb25zLCBhcmdzKTsKKyAgICAgICAgICAgIFN0cmluZ1tdIGZpbGVuYW1lcyA9IGNsaS5nZXRBcmdzKCk7CisgICAgICAgICAgICBpZiggZmlsZW5hbWVzLmxlbmd0aCA9PSAwICkgeworICAgICAgICAgICAgCVN5c3RlbS5lcnIucHJpbnRsbigiTmVlZHMgYXQgbGVhc3Qgb25lIGZpbGVuYW1lIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBMaXN0IGZpbGVuYW1lTGlzdCA9IEFycmF5cy5hc0xpc3QoZmlsZW5hbWVzKTsKKyAgICAgICAgICAgIEl0ZXJhdG9yIGkgPSBmaWxlbmFtZUxpc3QuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgeworICAgICAgICAgICAgCVN0cmluZyBmaWxlbmFtZSA9IChTdHJpbmcpIGkubmV4dCgpOworICAgICAgICAgICAgCUZpbGUgZiA9IG5ldyBGaWxlKGZpbGVuYW1lKTsKKyAgICAgICAgICAgIAlTdHJpbmcgdGV4dCA9IERlZmF1bHRHcm9vdnlNZXRob2RzLmdldFRleHQoZik7CisgICAgICAgICAgICAJU3lzdGVtLm91dC5wcmludGxuKGNvbnZlcnQoZmlsZW5hbWUsIHRleHQsIHRydWUsIHRydWUpKTsKKyAgICAgICAgICAgIH0KKwkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKwkJCXQucHJpbnRTdGFja1RyYWNlKCk7CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0KFN0cmluZyBmaWxlbmFtZSwgU3RyaW5nIGlucHV0KSB0aHJvd3MgRXhjZXB0aW9ueworCQlyZXR1cm4gY29udmVydChmaWxlbmFtZSwgaW5wdXQsIGZhbHNlLCBmYWxzZSk7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnQoU3RyaW5nIGZpbGVuYW1lLCBTdHJpbmcgaW5wdXQsYm9vbGVhbiB3aXRoSGVhZGVyLCBib29sZWFuIHdpdGhOZXdMaW5lcykgdGhyb3dzIEV4Y2VwdGlvbnsKKyAgICAgICAgSmF2YVJlY29nbml6ZXIgcGFyc2VyID0gZ2V0SmF2YVBhcnNlcihpbnB1dCk7CisgICAgICAgIFN0cmluZ1tdIHRva2VuTmFtZXMgPSBwYXJzZXIuZ2V0VG9rZW5OYW1lcygpOworICAgICAgICBwYXJzZXIuY29tcGlsYXRpb25Vbml0KCk7CisgICAgICAgIEFTVCBhc3QgPSBwYXJzZXIuZ2V0QVNUKCk7CisgICAgICAgIAorICAgICAgICAvLyBvdXRwdXQgQVNUIGluIGZvcm1hdCBzdWl0YWJsZSBmb3Igb3BlbmluZyBpbiBodHRwOi8vZnJlZW1pbmQuc291cmNlZm9yZ2UubmV0CisgICAgICAgIC8vIHdoaWNoIGlzIGEgcmVhbGx5IG5pY2Ugd2F5IG9mIHNlZWluZyB0aGUgQVNULCBmb2xkaW5nIG5vZGVzIGV0YworICAgICAgICBpZiAoIm1pbmRtYXAiLmVxdWFscyhTeXN0ZW0uZ2V0UHJvcGVydHkoImFudGxyLmFzdCIpKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBQcmludFN0cmVhbSBvdXQgPSBuZXcgUHJpbnRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZW5hbWUgKyAiLm1tIikpOworICAgICAgICAgICAgICAgIFZpc2l0b3IgdmlzaXRvciA9IG5ldyBNaW5kTWFwUHJpbnRlcihvdXQsdG9rZW5OYW1lcyk7CisgICAgICAgICAgICAgICAgQW50bHJBU1RQcm9jZXNzb3IgdHJlZXdhbGtlciA9IG5ldyBQcmVPcmRlclRyYXZlcnNhbCh2aXNpdG9yKTsKKyAgICAgICAgICAgICAgICB0cmVld2Fsa2VyLnByb2Nlc3MoYXN0KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDYW5ub3QgY3JlYXRlICIgKyBmaWxlbmFtZSArICIubW0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gbW9kaWZ5IHRoZSBKYXZhIEFTVCBpbnRvIGEgR3Jvb3Z5IEFTVAorICAgICAgICBtb2RpZnlKYXZhQVNUaW50b0dyb292eUFTVCh0b2tlbk5hbWVzLCBhc3QpOworICAgICAgICBTdHJpbmdbXSBncm9vdnlUb2tlbk5hbWVzID0gZ2V0R3Jvb3Z5VG9rZW5OYW1lcyhpbnB1dCk7CisgICAgICAgIC8vIGdyb292aWZ5IHRoZSBmYXQgSmF2YS1MaWtlIEdyb292eSBBU1QKKyAgICAgICAgZ3Jvb3ZpZnlGYXRKYXZhTGlrZUdyb292eUFTVChhc3QsIGdyb292eVRva2VuTmFtZXMpOworCisgICAgICAgIC8vIG5vdyBvdXRwdXQgICAgICAgIAorICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgVmlzaXRvciB2aXNpdG9yID0gbmV3IFNvdXJjZVByaW50ZXIobmV3IFByaW50U3RyZWFtKGJhb3MpLGdyb292eVRva2VuTmFtZXMsIHdpdGhOZXdMaW5lcyk7CisgICAgICAgIEFudGxyQVNUUHJvY2Vzc29yIHRyYXZlcnNlciA9IG5ldyBTb3VyY2VDb2RlVHJhdmVyc2FsKHZpc2l0b3IpOworCisgICAgICAgIHRyYXZlcnNlci5wcm9jZXNzKGFzdCk7CisgICAgICAgIAorICAgICAgICBTdHJpbmcgaGVhZGVyID0gIiI7CisgICAgICAgIGlmICh3aXRoSGVhZGVyKSB7CisJICAgICAgICBoZWFkZXIgPSAiLypcbiIgKworCSAgICAgICAgCQkJCSIgIEF1dG9tYXRpY2FsbHkgQ29udmVydGVkIGZyb20gSmF2YSBTb3VyY2UgXG4iICsKKwkgICAgICAgIAkJCQkiICBcbiIgKworCSAgICAgICAgCQkJCSIgIGJ5IGphdmEyZ3Jvb3Z5IHYwLjAuMSAgIENvcHlyaWdodCBKZXJlbXkgUmF5bmVyIDIwMDdcbiIgKworCSAgICAgICAgCQkJCSIgIFxuIiArCisJICAgICAgICAJCQkJIiAgISEgTk9UIEZJVCBGT1IgQU5ZIFBVUlBPU0UgISEgXG4iICsKKwkgICAgICAgIAkJCQkiICAnamF2YTJncm9vdnknIGNhbm5vdCBiZSB1c2VkIHRvIGNvbnZlcnQgb25lIHdvcmtpbmcgcHJvZ3JhbSBpbnRvIGFub3RoZXIiICsKKwkgICAgICAgIAkJCQkiICAqL1xuXG4iOworICAgICAgICB9CisgICAgICAgIHJldHVybiBoZWFkZXIgKyBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSk7CisgICAgfQorCisJLyoqCisJICogQHBhcmFtIGFzdAorCSAqIEBwYXJhbSBncm9vdnlUb2tlbk5hbWVzCisJICovCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBncm9vdmlmeUZhdEphdmFMaWtlR3Jvb3Z5QVNUKEFTVCBhc3QsIFN0cmluZ1tdIGdyb292eVRva2VuTmFtZXMpIHsKKwkJVmlzaXRvciBncm9vdmlmaWVyID0gbmV3IEdyb292aWZpZXIoZ3Jvb3Z5VG9rZW5OYW1lcyk7CisgICAgICAgIEFudGxyQVNUUHJvY2Vzc29yIGdyb292aWZpZXJUcmF2ZXJzZXIgPSBuZXcgUHJlT3JkZXJUcmF2ZXJzYWwoZ3Jvb3ZpZmllcik7CisgICAgICAgIGdyb292aWZpZXJUcmF2ZXJzZXIucHJvY2Vzcyhhc3QpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSB0b2tlbk5hbWVzCisJICogQHBhcmFtIGFzdAorCSAqLworCXByaXZhdGUgc3RhdGljIHZvaWQgbW9kaWZ5SmF2YUFTVGludG9Hcm9vdnlBU1QoU3RyaW5nW10gdG9rZW5OYW1lcywgQVNUIGFzdCkgeworCQkvLyBtdXRhdGUgdGhlIHRyZWUgd2hlbiBpbiBKYXZhbGFuZAorCQlWaXNpdG9yIHByZUphdmEyZ3Jvb3Z5Q29udmVydGVyID0gbmV3IFByZUphdmEyR3Jvb3Z5Q29udmVydGVyKHRva2VuTmFtZXMpOworCQlBbnRsckFTVFByb2Nlc3NvciBwcmVKYXZhMmdyb292eVRyYXZlcnNlciA9IG5ldyBQcmVPcmRlclRyYXZlcnNhbChwcmVKYXZhMmdyb292eUNvbnZlcnRlcik7CisJCXByZUphdmEyZ3Jvb3Z5VHJhdmVyc2VyLnByb2Nlc3MoYXN0KTsKKworICAgICAgICAvLyBtYXAgdGhlIG5vZGVzIHRvIEdyb292eSB0eXBlcworICAgICAgICBWaXNpdG9yIGphdmEyZ3Jvb3Z5Q29udmVydGVyID0gbmV3IEphdmEyR3Jvb3Z5Q29udmVydGVyKHRva2VuTmFtZXMpOworICAgICAgICBBbnRsckFTVFByb2Nlc3NvciBqYXZhMmdyb292eVRyYXZlcnNlciA9IG5ldyBQcmVPcmRlclRyYXZlcnNhbChqYXZhMmdyb292eUNvbnZlcnRlcik7CisgICAgICAgIGphdmEyZ3Jvb3Z5VHJhdmVyc2VyLnByb2Nlc3MoYXN0KTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gaW5wdXQKKwkgKiBAcmV0dXJuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgSmF2YVJlY29nbml6ZXIgZ2V0SmF2YVBhcnNlcihTdHJpbmcgaW5wdXQpIHsKKwkJSmF2YVJlY29nbml6ZXIgcGFyc2VyID0gbnVsbDsKKyAgICAgICAgU291cmNlQnVmZmVyIHNvdXJjZUJ1ZmZlciA9IG5ldyBTb3VyY2VCdWZmZXIoKTsKKyAgICAgICAgVW5pY29kZUVzY2FwaW5nUmVhZGVyIHVuaWNvZGVSZWFkZXIgPSBuZXcgVW5pY29kZUVzY2FwaW5nUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoaW5wdXQpLHNvdXJjZUJ1ZmZlcik7CisgICAgICAgIEphdmFMZXhlciBsZXhlciA9IG5ldyBKYXZhTGV4ZXIodW5pY29kZVJlYWRlcik7CisgICAgICAgIHVuaWNvZGVSZWFkZXIuc2V0TGV4ZXIobGV4ZXIpOworICAgICAgICBwYXJzZXIgPSBKYXZhUmVjb2duaXplci5tYWtlKGxleGVyKTsKKyAgICAgICAgcGFyc2VyLnNldFNvdXJjZUJ1ZmZlcihzb3VyY2VCdWZmZXIpOworCQlyZXR1cm4gcGFyc2VyOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1pbmRtYXAoU3RyaW5nIGlucHV0KSB0aHJvd3MgRXhjZXB0aW9ueworICAgICAgICBKYXZhUmVjb2duaXplciBwYXJzZXIgPSBnZXRKYXZhUGFyc2VyKGlucHV0KTsKKyAgICAgICAgU3RyaW5nW10gdG9rZW5OYW1lcyA9IHBhcnNlci5nZXRUb2tlbk5hbWVzKCk7CisgICAgICAgIHBhcnNlci5jb21waWxhdGlvblVuaXQoKTsKKyAgICAgICAgQVNUIGFzdCA9IHBhcnNlci5nZXRBU1QoKTsKKyAgICAgICAgLy8gbW9kaWZ5IHRoZSBKYXZhIEFTVCBpbnRvIGEgR3Jvb3Z5IEFTVAorICAgICAgICBtb2RpZnlKYXZhQVNUaW50b0dyb292eUFTVCh0b2tlbk5hbWVzLCBhc3QpOworICAgICAgICBTdHJpbmdbXSBncm9vdnlUb2tlbk5hbWVzID0gZ2V0R3Jvb3Z5VG9rZW5OYW1lcyhpbnB1dCk7CisgICAgICAgIC8vIGdyb292aWZ5IHRoZSBmYXQgSmF2YS1MaWtlIEdyb292eSBBU1QKKyAgICAgICAgZ3Jvb3ZpZnlGYXRKYXZhTGlrZUdyb292eUFTVChhc3QsIGdyb292eVRva2VuTmFtZXMpOworCisgICAgICAgIC8vIG5vdyBvdXRwdXQgICAgICAgIAorICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgVmlzaXRvciB2aXNpdG9yID0gbmV3IE1pbmRNYXBQcmludGVyKG5ldyBQcmludFN0cmVhbShiYW9zKSxncm9vdnlUb2tlbk5hbWVzKTsKKyAgICAgICAgQW50bHJBU1RQcm9jZXNzb3IgdHJhdmVyc2VyID0gbmV3IFNvdXJjZUNvZGVUcmF2ZXJzYWwodmlzaXRvcik7CisKKyAgICAgICAgdHJhdmVyc2VyLnByb2Nlc3MoYXN0KTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSk7CisgICAgfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgbm9kZVByaW50ZXIoU3RyaW5nIGlucHV0KSB0aHJvd3MgRXhjZXB0aW9ueworICAgICAgICBKYXZhUmVjb2duaXplciBwYXJzZXIgPSBnZXRKYXZhUGFyc2VyKGlucHV0KTsKKyAgICAgICAgU3RyaW5nW10gdG9rZW5OYW1lcyA9IHBhcnNlci5nZXRUb2tlbk5hbWVzKCk7CisgICAgICAgIHBhcnNlci5jb21waWxhdGlvblVuaXQoKTsKKyAgICAgICAgQVNUIGFzdCA9IHBhcnNlci5nZXRBU1QoKTsKKyAgICAgICAgLy8gbW9kaWZ5IHRoZSBKYXZhIEFTVCBpbnRvIGEgR3Jvb3Z5IEFTVAorICAgICAgICBtb2RpZnlKYXZhQVNUaW50b0dyb292eUFTVCh0b2tlbk5hbWVzLCBhc3QpOworICAgICAgICBTdHJpbmdbXSBncm9vdnlUb2tlbk5hbWVzID0gZ2V0R3Jvb3Z5VG9rZW5OYW1lcyhpbnB1dCk7CisgICAgICAgIC8vIGdyb292aWZ5IHRoZSBmYXQgSmF2YS1MaWtlIEdyb292eSBBU1QKKyAgICAgICAgZ3Jvb3ZpZnlGYXRKYXZhTGlrZUdyb292eUFTVChhc3QsIGdyb292eVRva2VuTmFtZXMpOworCisgICAgICAgIC8vIG5vdyBvdXRwdXQgICAgICAgIAorICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgVmlzaXRvciB2aXNpdG9yID0gbmV3IE5vZGVQcmludGVyKG5ldyBQcmludFN0cmVhbShiYW9zKSxncm9vdnlUb2tlbk5hbWVzKTsKKyAgICAgICAgQW50bHJBU1RQcm9jZXNzb3IgdHJhdmVyc2VyID0gbmV3IFNvdXJjZUNvZGVUcmF2ZXJzYWwodmlzaXRvcik7CisKKyAgICAgICAgdHJhdmVyc2VyLnByb2Nlc3MoYXN0KTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSk7CisgICAgfQorCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZ2V0R3Jvb3Z5VG9rZW5OYW1lcyhTdHJpbmcgaW5wdXQpIHsKKyAgICAgICAgR3Jvb3Z5UmVjb2duaXplciBncm9vdnlQYXJzZXIgPSBudWxsOworICAgICAgICBTb3VyY2VCdWZmZXIgZ3Jvb3Z5U291cmNlQnVmZmVyID0gbmV3IFNvdXJjZUJ1ZmZlcigpOworICAgICAgICBVbmljb2RlRXNjYXBpbmdSZWFkZXIgZ3Jvb3Z5VW5pY29kZVJlYWRlciA9IG5ldyBVbmljb2RlRXNjYXBpbmdSZWFkZXIobmV3IFN0cmluZ1JlYWRlcihpbnB1dCksZ3Jvb3Z5U291cmNlQnVmZmVyKTsKKyAgICAgICAgR3Jvb3Z5TGV4ZXIgZ3Jvb3Z5TGV4ZXIgPSBuZXcgR3Jvb3Z5TGV4ZXIoZ3Jvb3Z5VW5pY29kZVJlYWRlcik7CisgICAgICAgIGdyb292eVVuaWNvZGVSZWFkZXIuc2V0TGV4ZXIoZ3Jvb3Z5TGV4ZXIpOworICAgICAgICBncm9vdnlQYXJzZXIgPSBHcm9vdnlSZWNvZ25pemVyLm1ha2UoZ3Jvb3Z5TGV4ZXIpOworICAgICAgICByZXR1cm4gZ3Jvb3Z5UGFyc2VyLmdldFRva2VuTmFtZXMoKTsKKwl9CisJCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci9qYXZhL1ByZUphdmEyR3Jvb3Z5Q29udmVydGVyLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci9qYXZhL1ByZUphdmEyR3Jvb3Z5Q29udmVydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY2NjU3MwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudGxyL2phdmEvUHJlSmF2YTJHcm9vdnlDb252ZXJ0ZXIuamF2YQpAQCAtMCwwICsxLDE1MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5hbnRsci5qYXZhOworCitpbXBvcnQgamF2YS51dGlsLlN0YWNrOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hbnRsci5Hcm9vdnlTb3VyY2VBU1Q7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hbnRsci50cmVld2Fsa2VyLlZpc2l0b3JBZGFwdGVyOworCisvKiogVGhpcyBjbGFzcyBtdXRhdGVzIHRoZSBKYXZhIEFTVCwgd2hpbHN0IGl0IGlzIHN0aWxsIGEgSmF2YSBBU1QsIGluIHJlYWRpbmVzcyBmb3IgY29udmVyc2lvbiB0byBHcm9vdnksIHlpcHBlZS1reS1hICEgKi8KK3B1YmxpYyBjbGFzcyBQcmVKYXZhMkdyb292eUNvbnZlcnRlciBleHRlbmRzIFZpc2l0b3JBZGFwdGVyeworICAgIHByaXZhdGUgU3RyaW5nW10gdG9rZW5OYW1lczsKKyAgICBwcml2YXRlIFN0YWNrIHN0YWNrOworCisJcHVibGljIFByZUphdmEyR3Jvb3Z5Q29udmVydGVyKFN0cmluZ1tdIHRva2VuTmFtZXMpIHsKKwkJdGhpcy50b2tlbk5hbWVzID0gdG9rZW5OYW1lczsKKwkJdGhpcy5zdGFjayA9IG5ldyBTdGFjaygpOworCX0KKwkKKyAgICBwdWJsaWMgdm9pZCB2aXNpdERlZmF1bHQoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7CisgICAgICAgIGlmICh2aXNpdCA9PSBPUEVOSU5HX1ZJU0lUKSB7CisgICAgICAgIAlpZiAodC5nZXRUeXBlKCkgPT0gSmF2YVRva2VuVHlwZXMuTElURVJBTF9kbykgeworICAgICAgICAJCXZpc2l0SmF2YUxpdGVyYWxEbyh0KTsgICAgICAgIAkJCisgICAgICAgIAl9IGVsc2UgaWYgKHQuZ2V0VHlwZSgpID09IEphdmFUb2tlblR5cGVzLkFSUkFZX0lOSVQpIHsKKyAgICAgICAgCQl2aXNpdEphdmFBcnJheUluaXQodCk7CisgICAgICAgIAl9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSB2b2lkIHZpc2l0SmF2YUxpdGVyYWxEbyhHcm9vdnlTb3VyY2VBU1QgdCkgeworICAgIAkvLyB0b2RvIC0gaW5jb21wbGV0ZSwgYXMgYm9keSBvZiBkby4uLndoaWxlLi4uIHNob3VsZCBiZSBleGVjdXRlZCBhdCBsZWFzdCBvbmNlLCB3aGljaCB0aGlzIGRvZXNuJ3QgcHJvdmlkZS4KKyAgICAJc3dhcFR3b0NoaWxkcmVuKHQpOyAgICAgICAgCQkgICAgCQorICAgIH0KKyAgICAvKioKKyAgICAgKiA8cHJlPgorICAgICAqIFN0cmluZ1tdIG15QXJyYXkgPSBuZXcgU3RyaW5nW10geyJhIiwiYiIsImMifTsKKyAgICAgKiAKKyAgICAgKiBiZWNvbWVzCisgICAgICogCisgICAgICogU3RyaW5nW10gbXlBcnJheSA9IFsiYSIsICJiIiwgImMiXQorICAgICAqIAorICAgICAqIC0tLQorICAgICAqIAorICAgICAqIFRvIGNvbnZlcnQgbm9kZSAodCkgYW5kIHN1cnJvdW5kaW5nIG5vZGVzIGludG8gdGhlIHJpZ2h0IHN0cnVjdHVyZSBmb3IgTGlzdCBDb25zdHJ1Y3RvcgorICAgICAqIAorICAgICAqIChhKSBqYXZhL0VYUFIKKyAgICAgKiAgfAorICAgICAqICArLSAoYikgamF2YS9uZXcKKyAgICAgKiAgICAgIHwKKyAgICAgKiAgICAgICsgKHQpIGphdmEvQVJSQVlfSU5JVAorICAgICAqICAgIAorICAgICAqICBiZWNvbWVzCisgICAgICogIAorICAgICAqIChhKSBncm9vdnkvTElTVF9DT05TVFJVQ1RPUiAodmlhIEFSUkFZX0lOSVQgYXMgdGVtcG9yYXJ5IG1hcmtlciB0eXBlKQorICAgICAqICB8CisgICAgICogICstICh0KSBncm9vdnkvRUxJU1QKKyAgICAgKiAgCisgICAgICogICogbm90ZTogbm9kZSAoYikgaXMgdGhyb3duIGF3YXkuLi4KKyAgICAgKiA8L3ByZT4KKyAgICAgKi8KKwlwcml2YXRlIHZvaWQgdmlzaXRKYXZhQXJyYXlJbml0KEdyb292eVNvdXJjZUFTVCB0KSB7CisJCS8vIGdpdmVuIHRoYXQgd2UgbWlnaHQgaGF2ZSBhIGdyYW5kUGFyZW50Li4uCisJCWlmIChzdGFjay5zaXplKCkgPiAyKSB7CisJCQlHcm9vdnlTb3VyY2VBU1QgZ3JhbmRQYXJlbnQgPSBnZXRHcmFuZFBhcmVudE5vZGUoKTsKKwkJCWlmIChncmFuZFBhcmVudC5nZXRUeXBlKCkgPT0gSmF2YVRva2VuVHlwZXMuRVhQUikgeworCQkJCWdyYW5kUGFyZW50LnNldFR5cGUoSmF2YVRva2VuVHlwZXMuQVJSQVlfSU5JVCk7IC8vc2V0IHR5cGUgYXMgaW5kaWNhdG9yIGZvciBKYXZhMkdyb292eUNvbnZlcnRvciB0byB0dXJuIGludG8gTElTVF9DT05TVFJVQ1RPUgorCQkJCWdyYW5kUGFyZW50LnNldEZpcnN0Q2hpbGQodCk7CisJCQkJdC5zZXRUeXBlKEphdmFUb2tlblR5cGVzLkVMSVNUKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKiBUbyBzd2FwIHR3byBjaGlsZHJlbiBvZiBub2RlIHQuLi4KKwkgKiAKKwkgKjxwcmU+CisJICogICAodCkKKwkgKiAgICB8CisJICogICAgfAorCSAqICAgKGEpIC0tIChiKQorCSAqIAorCSAqIHQuZG93biA9IGZpcnN0Tm9kZQorCSAqIGEucmlnaHQgPSBiCisJICogYi5yaWdodCA9IG51bGwKKwkgKjwvcHJlPiAKKwkgKiBiZWNvbWVzCisJICo8cHJlPgorCSAqICAgKHQpCisJICogICAgfAorCSAqICAgIHwKKwkgKiAgIChiKSAtLSAoYSkKKwkgKiAgIAorCSAqIHQuZG93biA9IGIKKwkgKiBhLnJpZ2h0ID0gbnVsbAorCSAqIGIucmlnaHQgPSBhCisJICo8L3ByZT4KKwkgKgorCSAqIHRvZG8gLSBidWlsZCBBUEkgb2YgYmFzaWMgdHJlZSBtdXRhdGlvbnMgbGlrZSB0aGlzIG1ldGhvZC4KKwkgKi8KKyAgICBwdWJsaWMgdm9pZCBzd2FwVHdvQ2hpbGRyZW4oR3Jvb3Z5U291cmNlQVNUIHQpIHsKKwkJLy8gdGhpcyBzd2FwcyB0aGUgdHdvIGNoaWxkIG5vZGVzLCBzZWUgamF2YWRvYyBhYm92ZSBmb3IgZXhwbGFuYXRpb24gb2YgaW1wbGVtZW50YXRpb24KKwkJR3Jvb3Z5U291cmNlQVNUIGEgPSAoR3Jvb3Z5U291cmNlQVNUKSB0LmdldEZpcnN0Q2hpbGQoKTsKKwkJR3Jvb3Z5U291cmNlQVNUIGIgPSAoR3Jvb3Z5U291cmNlQVNUKSBhLmdldE5leHRTaWJsaW5nKCk7CisKKwkJdC5zZXRGaXJzdENoaWxkKGIpOworCQlhLnNldE5leHRTaWJsaW5nKG51bGwpOworCQliLnNldE5leHRTaWJsaW5nKGEpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICBwdWJsaWMgdm9pZCBwdXNoKEdyb292eVNvdXJjZUFTVCB0KSB7CisgICAgICAgIHN0YWNrLnB1c2godCk7CisgICAgfQorICAgIHB1YmxpYyBHcm9vdnlTb3VyY2VBU1QgcG9wKCkgeworICAgICAgICBpZiAoIXN0YWNrLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiAoR3Jvb3Z5U291cmNlQVNUKSBzdGFjay5wb3AoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIEdyb292eVNvdXJjZUFTVCBnZXRQYXJlbnROb2RlKCkgeworICAgICAgICBPYmplY3QgY3VycmVudE5vZGUgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgT2JqZWN0IHBhcmVudE5vZGUgPSBzdGFjay5wZWVrKCk7CisgICAgICAgIHN0YWNrLnB1c2goY3VycmVudE5vZGUpOworICAgICAgICByZXR1cm4gKEdyb292eVNvdXJjZUFTVCkgcGFyZW50Tm9kZTsKKyAgICB9CisKKyAgICBwcml2YXRlIEdyb292eVNvdXJjZUFTVCBnZXRHcmFuZFBhcmVudE5vZGUoKSB7CisgICAgICAgIE9iamVjdCBjdXJyZW50Tm9kZSA9IHN0YWNrLnBvcCgpOworICAgICAgICBPYmplY3QgcGFyZW50Tm9kZSA9IHN0YWNrLnBvcCgpOworICAgICAgICBPYmplY3QgZ3JhbmRQYXJlbnROb2RlID0gc3RhY2sucGVlaygpOworICAgICAgICBzdGFjay5wdXNoKHBhcmVudE5vZGUpOworICAgICAgICBzdGFjay5wdXNoKGN1cnJlbnROb2RlKTsKKyAgICAgICAgcmV0dXJuIChHcm9vdnlTb3VyY2VBU1QpIGdyYW5kUGFyZW50Tm9kZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci9qYXZhL2phdmEuZyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudGxyL2phdmEvamF2YS5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzYzk1ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci9qYXZhL2phdmEuZwpAQCAtMCwwICsxLDE5NjIgQEAKKy8vIE5vdGU6IFBsZWFzZSBkb24ndCB1c2UgcGh5c2ljYWwgdGFicy4gIExvZ2ljYWwgdGFicyBmb3IgaW5kZW50IGFyZSB3aWR0aCA0LgoraGVhZGVyIHsKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5hbnRsci5qYXZhOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50bHIuKjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudGxyLnBhcnNlci4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgYW50bHIuSW5wdXRCdWZmZXI7CitpbXBvcnQgYW50bHIuTGV4ZXJTaGFyZWRJbnB1dFN0YXRlOworfQorIAorLyoqIEphdmEgMS41IFJlY29nbml6ZXIKKyAqCisgKiBSdW4gJ2phdmEgTWFpbiBbLXNob3d0cmVlXSBkaXJlY3RvcnktZnVsbC1vZi1qYXZhLWZpbGVzJworICoKKyAqIFtUaGUgLXNob3d0cmVlIG9wdGlvbiBwb3BzIHVwIGEgU3dpbmcgZnJhbWUgdGhhdCBzaG93cworICogIHRoZSBBU1QgY29uc3RydWN0ZWQgZnJvbSB0aGUgcGFyc2VyLl0KKyAqCisgKiBSdW4gJ2phdmEgTWFpbiA8ZGlyZWN0b3J5IGZ1bGwgb2YgamF2YSBmaWxlcz4nCisgKgorICogQ29udHJpYnV0aW5nIGF1dGhvcnM6CisgKiAgICAgIEplcmVteSBSYXluZXIgICAgICAgZ3Jvb3Z5QHJvc3MtcmF5bmVyLmNvbQorICoJCUpvaG4gTWl0Y2hlbGwJCWpvaG5tQG5vbi5uZXQKKyAqCQlUZXJlbmNlIFBhcnIJCXBhcnJ0QG1hZ2VsYW5nLmNvbQorICoJCUpvaG4gTGlsbGV5CQlqbGlsbGV5QGVtcGF0aHkuY29tCisgKgkJU2NvdHQgU3RhbmNoZmllbGQJdGhldGlja0BtYWdlbGFuZy5jb20KKyAqCQlNYXJrdXMgTW9obmVuCQltb2huZW5AaW5mb3JtYXRpay5yd3RoLWFhY2hlbi5kZQorICoJCVBldGVyIFdpbGxpYW1zCQlwZXRlLndpbGxpYW1zQHN1bi5jb20KKyAqCQlBbGxhbiBKYWNvYnMJCUFsbGFuLkphY29ic0Blbmcuc3VuLmNvbQorICoJCVN0ZXZlIE1lc3NpY2sJCW1lc3NpY2tAcmVkaGlsbHMuY29tCisgKgkJSm9obiBQeWJ1cwkJam9obkBweWJ1cy5vcmcKKyAqCisgKiBWZXJzaW9uIDEuMDAgRGVjZW1iZXIgOSwgMTk5NyAtLSBpbml0aWFsIHJlbGVhc2UKKyAqIFZlcnNpb24gMS4wMSBEZWNlbWJlciAxMCwgMTk5NworICoJCWZpeGVkIGJ1ZyBpbiBvY3RhbCBkZWYgKDAuLjcgbm90IDAuLjgpCisgKiBWZXJzaW9uIDEuMTAgQXVndXN0IDE5OTggKHBhcnJ0KQorICoJCWFkZGVkIHRyZWUgY29uc3RydWN0aW9uCisgKgkJZml4ZWQgZGVmaW5pdGlvbiBvZiBXUyxjb21tZW50cyBmb3IgbWFjLHBjLHVuaXggbmV3bGluZXMKKyAqCQlhZGRlZCB1bmFyeSBwbHVzCisgKiBWZXJzaW9uIDEuMTEgKE5vdiAyMCwgMTk5OCkKKyAqCQlBZGRlZCAic2h1dHVwIiBvcHRpb24gdG8gdHVybiBvZmYgbGFzdCBhbWJpZyB3YXJuaW5nLgorICoJCUZpeGVkIGlubmVyIGNsYXNzIGRlZiB0byBhbGxvdyBuYW1lZCBjbGFzcyBkZWZzIGFzIHN0YXRlbWVudHMKKyAqCQlzeW5jaHJvbml6ZWQgcmVxdWlyZXMgY29tcG91bmQgbm90IHNpbXBsZSBzdGF0ZW1lbnQKKyAqCQlhZGQgW10gYWZ0ZXIgYnVpbHRJblR5cGUgRE9UIGNsYXNzIGluIHByaW1hcnlFeHByZXNzaW9uCisgKgkJImNvbnN0IiBpcyByZXNlcnZlZCBidXQgbm90IHZhbGlkLi5yZW1vdmVkIGZyb20gbW9kaWZpZXJzCisgKiBWZXJzaW9uIDEuMTIgKEZlYiAyLCAxOTk5KQorICoJCUNoYW5nZWQgTElURVJBTF94eHggdG8geHh4IGluIHRyZWUgZ3JhbW1hci4KKyAqCQlVcGRhdGVkIGphdmEuZyB0byB1c2UgdG9rZW5zIHsuLi59IG5vdyBmb3IgMi42LjAgKG5ldyBmZWF0dXJlKS4KKyAqCisgKiBWZXJzaW9uIDEuMTMgKEFwciAyMywgMTk5OSkKKyAqCQlEaWRuJ3QgaGF2ZSAoc3RhdCk/IGZvciBlbHNlIGNsYXVzZSBpbiB0cmVlIHBhcnNlci4KKyAqCQlEaWRuJ3QgZ2VuIEFTVHMgZm9yIGludGVyZmFjZSBleHRlbmRzLiAgVXBkYXRlZCB0cmVlIHBhcnNlciB0b28uCisgKgkJVXBkYXRlZCB0byAyLjYuMC4KKyAqIFZlcnNpb24gMS4xNCAoSnVuIDIwLCAxOTk5KQorICoJCUFsbG93ZWQgZmluYWwvYWJzdHJhY3Qgb24gbG9jYWwgY2xhc3Nlcy4KKyAqCQlSZW1vdmVkIGxvY2FsIGludGVyZmFjZXMgZnJvbSBtZXRob2RzCisgKgkJUHV0IGluc3RhbmNlb2YgcHJlY2VkZW5jZSB3aGVyZSBpdCBiZWxvbmdzLi4uaW4gcmVsYXRpb25hbEV4cHIKKyAqCQkJSXQgYWxzbyBoYWQgZXhwciBub3QgdHlwZSBhcyBhcmc7IGZpeGVkIGl0LgorICoJCU1pc3NpbmcgISBvbiBTRU1JIGluIGNsYXNzQmxvY2sKKyAqCQlmaXhlZDogKGV4cHIpICsgInN0cmluZyIgd2FzIHBhcnNlZCBpbmNvcnJlY3RseSAoKyBhcyB1bmFyeSBwbHVzKS4KKyAqCQlmaXhlZDogZGlkbid0IGxpa2UgT2JqZWN0W10uY2xhc3MgaW4gcGFyc2VyIG9yIHRyZWUgcGFyc2VyCisgKiBWZXJzaW9uIDEuMTUgKEp1biAyNiwgMTk5OSkKKyAqCQlTY3Jld2VkIHVwIHJ1bGUgd2l0aCBpbnN0YW5jZW9mIGluIGl0LiA6KCAgRml4ZWQuCisgKgkJVHJlZSBwYXJzZXIgZGlkbid0IGxpa2UgKGV4cHIpLnNvbWV0aGluZzsgZml4ZWQuCisgKgkJQWxsb3dlZCBtdWx0aXBsZSBpbmhlcml0YW5jZSBpbiB0cmVlIGdyYW1tYXIuIG9vcHMuCisgKiBWZXJzaW9uIDEuMTYgKEF1Z3VzdCAyMiwgMTk5OSkKKyAqCQlFeHRlbmRpbmcgYW4gaW50ZXJmYWNlIGJ1aWx0IGEgd2Fja3kgdHJlZTogaGFkIGV4dHJhIEVYVEVORFMuCisgKgkJVHJlZSBncmFtbWFyIGRpZG4ndCBhbGxvdyBtdWx0aXBsZSBzdXBlcmludGVyZmFjZXMuCisgKgkJVHJlZSBncmFtbWFyIGRpZG4ndCBhbGxvdyBlbXB0eSB2YXIgaW5pdGlhbGl6ZXI6IHt9CisgKiBWZXJzaW9uIDEuMTcgKE9jdG9iZXIgMTIsIDE5OTkpCisgKgkJRVNDIGxleGVyIHJ1bGUgYWxsb3dlZCAzOTkgbWF4IG5vdCAzNzcgbWF4LgorICoJCWphdmEudHJlZS5nIGRpZG4ndCBoYW5kbGUgdGhlIGV4cHJlc3Npb24gb2Ygc3luY2hyb25pemVkCisgKgkJc3RhdGVtZW50cy4KKyAqIFZlcnNpb24gMS4xOCAoQXVndXN0IDEyLCAyMDAxKQorICoJICAJVGVyZW5jZSB1cGRhdGVkIHRvIEphdmEgMiBWZXJzaW9uIDEuMyBieQorICoJCW9ic2VydmluZy9jb21iaW5pbmcgd29yayBvZiBBbGxhbiBKYWNvYnMgYW5kIFN0ZXZlCisgKgkJTWVzc2ljay4gIEhhbmRsZXMgMS4zIHNyYy4gIFN1bW1hcnk6CisgKgkJbyAgcHJpbWFyeSBkaWRuJ3QgaW5jbHVkZSBib29sZWFuLmNsYXNzIGtpbmQgb2YgdGhpbmcKKyAqCSAgCW8gIGNvbnN0cnVjdG9yIGNhbGxzIHBhcnNlZCBleHBsaWNpdGx5IG5vdzoKKyAqIAkJICAgc2VlIGV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uCisgKgkJbyAgYWRkIHN0cmljdGZwIG1vZGlmaWVyCisgKgkgIAlvICBtaXNzaW5nIG9iakJsb2NrIGFmdGVyIG5ldyBleHByZXNzaW9uIGluIHRyZWUgZ3JhbW1hcgorICoJCW8gIG1lcmdlZCBsb2NhbCBjbGFzcyBkZWZpbml0aW9uIGFsdGVybmF0aXZlcywgbW92ZWQgYWZ0ZXIgZGVjbGFyYXRpb24KKyAqCQlvICBmaXhlZCBwcm9ibGVtIHdpdGggQ2xhc3NOYW1lLnN1cGVyLmZpZWxkCisgKgkgIAlvICByZW9yZGVyZWQgc29tZSBhbHRlcm5hdGl2ZXMgdG8gbWFrZSB0aGluZ3MgbW9yZSBlZmZpY2llbnQKKyAqCQlvICBsb25nIGFuZCBkb3VibGUgY29uc3RhbnRzIHdlcmUgbm90IGRpZmZlcmVudGlhdGVkIGZyb20gaW50L2Zsb2F0CisgKgkJbyAgd2hpdGVzcGFjZSBydWxlIHdhcyBpbmVmZmljaWVudDogbWF0Y2hlZCBvbmx5IG9uZSBjaGFyCisgKgkJbyAgYWRkIGFuIGV4YW1wbGVzIGRpcmVjdG9yeSB3aXRoIHNvbWUgbmFzdHkgMS4zIGNhc2VzCisgKgkJbyAgbWFkZSBNYWluLmphdmEgdXNlIGJ1ZmZlcmVkIElPIGFuZCBhIFJlYWRlciBmb3IgVW5pY29kZSBzdXBwb3J0CisgKgkJbyAgc3VwcG9ydHMgVU5JQ09ERT8KKyAqCQkgICBVc2luZyBVbmljb2RlIGNoYXJWb2NhYnVsYXkgbWFrZXMgY29kZSBmaWxlIGJpZywgYnV0IG9ubHkKKyAqCQkgICBpbiB0aGUgYml0c2V0cyBhdCB0aGUgZW5kLiBJIG5lZWQgdG8gbWFrZSBBTlRMUiBnZW5lcmF0ZQorICoJCSAgIHVuaWNvZGUgYml0c2V0cyBtb3JlIGVmZmljaWVudGx5LgorICogVmVyc2lvbiAxLjE5IChBcHJpbCAyNSwgMjAwMikKKyAqCQlUZXJlbmNlIGFkZGVkIGluIG5pY2UgZml4ZXMgYnkgSm9obiBQeWJ1cyBjb25jZXJuaW5nIGZsb2F0aW5nCisgKgkJY29uc3RhbnRzIGFuZCBwcm9ibGVtcyB3aXRoIHN1cGVyKCkgY2FsbHMuICBKb2huIGRpZCBhIG5pY2UKKyAqCQlyZW9yZyBvZiB0aGUgcHJpbWFyeS9wb3N0Zml4IGV4cHJlc3Npb24gc3R1ZmYgdG8gcmVhZCBiZXR0ZXIKKyAqCQlhbmQgbWFrZXMgZi5nLnN1cGVyKCkgcGFyc2UgcHJvcGVybHkgKGl0IHdhcyBNRVRIT0RfQ0FMTCBub3QKKyAqCQlhIFNVUEVSX0NUT1JfQ0FMTCkuICBBbHNvOgorICoKKyAqCQlvICAiZmluYWxseSIgY2xhdXNlIHdhcyBhIHJvb3QuLi5tYWRlIGl0IGEgY2hpbGQgb2YgInRyeSIKKyAqCQlvICBBZGRlZCBzdHVmZiBmb3IgYXNzZXJ0cyB0b28gZm9yIEphdmEgMS40LCBidXQgKmNvbW1lbnRlZCBvdXQqCisgKgkJICAgYXMgaXQgaXMgbm90IGJhY2t3YXJkIGNvbXBhdGlibGUuCisgKgorICogVmVyc2lvbiAxLjIwIChPY3RvYmVyIDI3LCAyMDAyKQorICoKKyAqCSAgVGVyZW5jZSBlbmRlZCB1cCByZW9yZ2luZyBKb2huIFB5YnVzJyBzdHVmZiB0bworICoJICByZW1vdmUgc29tZSBub25kZXRlcm1pbmlzbXMgYW5kIHNvbWUgc3ludGFjdGljIHByZWRpY2F0ZXMuCisgKgkgIE5vdGUgdGhhdCB0aGUgZ3JhbW1hciBpcyBzdHJpY3RlciBub3c7IGUuZy4sIHRoaXMoLi4uKSBtdXN0CisgKgliZSB0aGUgZmlyc3Qgc3RhdGVtZW50LgorICoKKyAqCSAgVHJpbmFyeSA/OiBvcGVyYXRvciB3YXNuJ3Qgd29ya2luZyBhcyBhcnJheSBuYW1lOgorICoJCSAgKGlzQmlnID8gYmlnRGlnaXRzIDogZGlnaXRzKVtpXTsKKyAqCisgKgkgIENoZWNrZWQgcGFyc2VyL3RyZWUgcGFyc2VyIG9uIHNvdXJjZSBmb3IKKyAqCQkgIFJlc2luLTIuMC41LCBqaXZlLTIuMS4xLCBqZGsgMS4zLjEsIEx1Y2VuZSwgYW50bHIgMi43LjJhNCwKKyAqCQlhbmQgdGhlIDExMGstbGluZSBqR3VydSBzZXJ2ZXIgc291cmNlLgorICoKKyAqIFZlcnNpb24gMS4yMSAoT2N0b2JlciAxNywgMjAwMykKKyAqICBGaXhlZCBsb3RzIG9mIHByb2JsZW1zIGluY2x1ZGluZzoKKyAqICBSYXkgV2FsZGluOiBhZGQgdHlwZURlZmluaXRpb24gdG8gaW50ZXJmYWNlQmxvY2sgaW4gamF2YS50cmVlLmcKKyAqICBIZSBmb3VuZCBhIHByb2JsZW0vZml4IHdpdGggZmxvYXRpbmcgcG9pbnQgdGhhdCBzdGFydCB3aXRoIDAKKyAqICBSYXkgYWxzbyBmaXhlZCBwcm9ibGVtIHRoYXQgKGludC5jbGFzcykgd2FzIG5vdCByZWNvZ25pemVkLgorICogIFRob3JzdGVuIHZhbiBFbGxlbiBub3RpY2VkIHRoYXQgXG4gYXJlIGFsbG93ZWQgaW5jb3JyZWN0bHkgaW4gc3RyaW5ncy4KKyAqICBUSlAgZml4ZWQgQ0hBUl9MSVRFUkFMIGFuYWxvZ291c2x5LgorICoKKyAqIFZlcnNpb24gMS4yMS4yIChNYXJjaCwgMjAwMykKKyAqCSAgQ2hhbmdlcyBieSBNYXR0IFF1YWlsIHRvIHN1cHBvcnQgZ2VuZXJpY3MgKGFzIHBlciBKREsxLjUvSlNSMTQpCisgKgkgIE5vdGVzOgorICoJICBvIFdlIG9ubHkgYWxsb3cgdGhlICJleHRlbmRzIiBrZXl3b3JkIGFuZCBub3QgdGhlICJpbXBsZW1lbnRzIgorICoJCWtleXdvcmQsIHNpbmNlIHRoYXRzIHdoYXQgSlNSMTQgc2VlbXMgdG8gaW1wbHkuCisgKgkgIG8gVGhhbmtzIHRvIE1vbnR5IFp1a293c2tpIGZvciBoaXMgaGVscCBvbiB0aGUgYW50bHItaW50ZXJlc3QKKyAqCQltYWlsIGxpc3QuCisgKgkgIG8gVGhhbmtzIHRvIEFsYW4gRWxpYXNlbiBmb3IgdGVzdGluZyB0aGUgZ3JhbW1hciBvdmVyIGhpcworICoJCUZpbmsgc291cmNlIGJhc2UKKyAqCisgKiBWZXJzaW9uIDEuMjIgKEp1bHksIDIwMDQpCisgKgkgIENoYW5nZXMgYnkgTWljaGFlbCBTdHVkbWFuIHRvIHN1cHBvcnQgSmF2YSAxLjUgbGFuZ3VhZ2UgZXh0ZW5zaW9ucworICoJICBOb3RlczoKKyAqCSAgbyBBZGRlZCBzdXBwb3J0IGZvciBhbm5vdGF0aW9ucyB0eXBlcworICoJICBvIEZpbmlzaGVkIG9mZiBNYXR0IFF1YWlsJ3MgZ2VuZXJpY3MgZW5oYW5jZW1lbnRzIHRvIHN1cHBvcnQgYm91bmQgdHlwZSBhcmd1bWVudHMKKyAqCSAgbyBBZGRlZCBzdXBwb3J0IGZvciBuZXcgZm9yIHN0YXRlbWVudCBzeW50YXgKKyAqCSAgbyBBZGRlZCBzdXBwb3J0IGZvciBzdGF0aWMgaW1wb3J0IHN5bnRheAorICoJICBvIEFkZGVkIHN1cHBvcnQgZm9yIGVudW0gdHlwZXMKKyAqCSAgbyBUZXN0ZWQgYWdhaW5zdCBKREsgMS41IHNvdXJjZSBiYXNlIGFuZCBzb3VyY2UgYmFzZSBvZiBqZGlncmFwaCBwcm9qZWN0CisgKgkgIG8gVGhhbmtzIHRvIE1hdHQgUXVhaWwgZm9yIGRvaW5nIHRoZSBoYXJkIHBhcnQgYnkgZG9pbmcgbW9zdCBvZiB0aGUgZ2VuZXJpY3Mgd29yaworICoKKyAqIFZlcnNpb24gMS4yMi4xIChKdWx5IDI4LCAyMDA0KQorICoJICBCdWcvb21pc3Npb24gZml4ZXMgZm9yIEphdmEgMS41IGxhbmd1YWdlIHN1cHBvcnQKKyAqCSAgbyBGaXhlZCB0cmVlIHN0cnVjdHVyZSBidWcgd2l0aCBjbGFzc09ySW50ZXJmYWNlIC0gdGhhbmtzIHRvIFBpZXRlciBWYW5nb3JwdG8gZm9yCisgKgkJc3BvdHRpbmcgdGhpcworICoJICBvIEZpeGVkIGJ1ZyB3aGVyZSBpbmNvcnJlY3QgaGFuZGxpbmcgb2YgU1IgYW5kIEJTUiB0b2tlbnMgd291bGQgY2F1c2UgdHlwZQorICoJCXBhcmFtZXRlcnMgdG8gYmUgcmVjb2duaXNlZCBhcyB0eXBlIGFyZ3VtZW50cy4KKyAqCSAgbyBFbmFibGVkIHR5cGUgcGFyYW1ldGVycyBvbiBjb25zdHJ1Y3RvcnMsIGFubm90YXRpb25zIG9uIGVudW0gY29uc3RhbnRzCisgKgkJYW5kIHBhY2thZ2UgZGVmaW5pdGlvbnMKKyAqCSAgbyBGaXhlZCBwcm9ibGVtcyB3aGVuIHBhcnNpbmcgaWYgKChjaGFyLmNsYXNzLmVxdWFscyhjKSkpIHt9IC0gc29sdXRpb24gYnkgTWF0dCBRdWFpbCBhdCBDZW5xdWEKKyAqCisgKiBWZXJzaW9uIDEuMjIuMiAoSnVseSAyOCwgMjAwNCkKKyAqCSAgU2xpZ2h0IHJlZmFjdG9yaW5nIG9mIEphdmEgMS41IGxhbmd1YWdlIHN1cHBvcnQKKyAqCSAgbyBSZWZhY3RvcmVkIGZvci8iZm9yZWFjaCIgcHJvZHVjdGlvbnMgc28gdGhhdCBvcmlnaW5hbCBsaXRlcmFsICJmb3IiIGxpdGVyYWwKKyAqCSAgICBpcyBzdGlsbCB1c2VkIGJ1dCB0aGUgZm9yIHN1Yi1jbGF1c2VzIHZhcnkgYnkgdG9rZW4gdHlwZQorICoJICBvIEZpeGVkIGJ1ZyB3aGVyZSB0eXBlIHBhcmFtZXRlciB3YXMgbm90IGluY2x1ZGVkIGluIGdlbmVyaWMgY29uc3RydWN0b3IncyBicmFuY2ggb2YgQVNUCisgKgorICogVmVyc2lvbiAxLjIyLjMgKEF1Z3VzdCAyNiwgMjAwNCkKKyAqCSAgQnVnIGZpeGVzIGFzIGlkZW50aWZpZWQgYnkgTWljaGFlbCBTdGFobDsgY2xlYW4gdXAgb2YgdGFicy9zcGFjZXMKKyAqICAgICAgICBhbmQgb3RoZXIgcmVmYWN0b3JpbmdzCisgKgkgIG8gRml4ZWQgdHlwZVBhcmFtZXRlcnMgb21pc3Npb24gaW4gaWRlbnRQcmltYXJ5IGFuZCBuZXdTdGF0ZW1lbnQKKyAqCSAgbyBSZXBsYWNlZCBHVCByZWNvbmNpbGxpYXRpb24gY29kZSB3aXRoIHNpbXBsZSBzZW1hbnRpYyBwcmVkaWNhdGUKKyAqCSAgbyBBZGFwdGVkIGVudW0vYXNzZXJ0IGtleXdvcmQgY2hlY2tpbmcgc3VwcG9ydCBmcm9tIE1pY2hhZWwgU3RhaGwncyBqYXZhMTUgZ3JhbW1hcgorICoJICBvIFJlZmFjdG9yZWQgdHlwZURlZmluaXRpb24gcHJvZHVjdGlvbiBhbmQgZmllbGQgcHJvZHVjdGlvbnMgdG8gcmVkdWNlIGR1cGxpY2F0aW9uCisgKgorICogVmVyc2lvbiAxLjIyLjQgKE9jdG9iZXIgMjEsIDIwMDQpCisgKiAgICBTbWFsbCBidXggZml4ZXMKKyAqICAgIG8gQWRkZWQgdHlwZUFyZ3VtZW50cyB0byBleHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbiwgZS5nLiBuZXcgPFN0cmluZz5NeVBhcmFtZXRlcmlzZWQoKQorICogICAgbyBBZGRlZCB0eXBlQXJndW1lbnRzIHRvIHBvc3RmaXhFeHByZXNzaW9uIHByb2R1Y3Rpb25zIGZvciBhbm9ueW1vdXMgaW5uZXIgY2xhc3Mgc3VwZXIKKyAqICAgICAgY29uc3RydWN0b3IgaW52b2NhdGlvbiwgZS5nLiBuZXcgT3V0ZXIoKS48U3RyaW5nPnN1cGVyKCkKKyAqICAgIG8gRml4ZWQgYnVnIGluIGFycmF5IGRlY2xhcmF0aW9ucyBpZGVudGlmaWVkIGJ5IEdlb2ZmIFJveQorICoKKyAqIFZlcnNpb24gMS4yMi40LmouMQorICoJICBDaGFuZ2VzIGJ5IEplcmVteSBSYXluZXIgdG8gc3VwcG9ydCBqYXZhMmdyb292eSB0b29sCisgKiAgICBvIEkgaGF2ZSB0YWtlbiBqYXZhLmcgZm9yIEphdmExLjUgZnJvbSBNaWNoYWVsIFN0dWRtYW4gKDEuMjIuNCkKKyAqICAgICAgYW5kIGhhdmUgbWFkZSBzb21lIGNoYW5nZXMgdG8gZW5hYmxlIHVzZSBieSBqYXZhMmdyb292eSB0b29sIChKYW4gMjAwNykKKyAqCisgKiBUaGlzIGdyYW1tYXIgaXMgaW4gdGhlIFBVQkxJQyBET01BSU4KKyAqLworCitjbGFzcyBKYXZhUmVjb2duaXplciBleHRlbmRzIFBhcnNlcjsKK29wdGlvbnMgeworCWsgPSAyOwkJCQkJCQkvLyB0d28gdG9rZW4gbG9va2FoZWFkCisJZXhwb3J0Vm9jYWI9SmF2YTsJCQkJLy8gQ2FsbCBpdHMgdm9jYWJ1bGFyeSAiSmF2YSIKKwljb2RlR2VuTWFrZVN3aXRjaFRocmVzaG9sZCA9IDI7CS8vIFNvbWUgb3B0aW1pemF0aW9ucworCWNvZGVHZW5CaXRzZXRUZXN0VGhyZXNob2xkID0gMzsKKwlkZWZhdWx0RXJyb3JIYW5kbGVyID0gZmFsc2U7CS8vIERvbid0IGdlbmVyYXRlIHBhcnNlciBlcnJvciBoYW5kbGVycworCWJ1aWxkQVNUID0gdHJ1ZTsKK30KKwordG9rZW5zIHsKKwlCTE9DSzsgTU9ESUZJRVJTOyBPQkpCTE9DSzsgU0xJU1Q7IE1FVEhPRF9ERUY7IFZBUklBQkxFX0RFRjsKKwlJTlNUQU5DRV9JTklUOyBTVEFUSUNfSU5JVDsgVFlQRTsgQ0xBU1NfREVGOyBJTlRFUkZBQ0VfREVGOworCVBBQ0tBR0VfREVGOyBBUlJBWV9ERUNMQVJBVE9SOyBFWFRFTkRTX0NMQVVTRTsgSU1QTEVNRU5UU19DTEFVU0U7CisJUEFSQU1FVEVSUzsgUEFSQU1FVEVSX0RFRjsgTEFCRUxFRF9TVEFUOyBUWVBFQ0FTVDsgSU5ERVhfT1A7CisJUE9TVF9JTkM7IFBPU1RfREVDOyBNRVRIT0RfQ0FMTDsgRVhQUjsgQVJSQVlfSU5JVDsKKwlJTVBPUlQ7IFVOQVJZX01JTlVTOyBVTkFSWV9QTFVTOyBDQVNFX0dST1VQOyBFTElTVDsgRk9SX0lOSVQ7IEZPUl9DT05ESVRJT047CisJRk9SX0lURVJBVE9SOyBFTVBUWV9TVEFUOyBGSU5BTD0iZmluYWwiOyBBQlNUUkFDVD0iYWJzdHJhY3QiOworCVNUUklDVEZQPSJzdHJpY3RmcCI7IFNVUEVSX0NUT1JfQ0FMTDsgQ1RPUl9DQUxMOyBWQVJJQUJMRV9QQVJBTUVURVJfREVGOworCVNUQVRJQ19JTVBPUlQ7IEVOVU1fREVGOyBFTlVNX0NPTlNUQU5UX0RFRjsgRk9SX0VBQ0hfQ0xBVVNFOyBBTk5PVEFUSU9OX0RFRjsgQU5OT1RBVElPTlM7CisJQU5OT1RBVElPTjsgQU5OT1RBVElPTl9NRU1CRVJfVkFMVUVfUEFJUjsgQU5OT1RBVElPTl9GSUVMRF9ERUY7IEFOTk9UQVRJT05fQVJSQVlfSU5JVDsKKwlUWVBFX0FSR1VNRU5UUzsgVFlQRV9BUkdVTUVOVDsgVFlQRV9QQVJBTUVURVJTOyBUWVBFX1BBUkFNRVRFUjsgV0lMRENBUkRfVFlQRTsKKwlUWVBFX1VQUEVSX0JPVU5EUzsgVFlQRV9MT1dFUl9CT1VORFM7Cit9CisKK3sKKyAgICAvKiogVGhpcyBmYWN0b3J5IGlzIHRoZSBjb3JyZWN0IHdheSB0byB3aXJlIHRvZ2V0aGVyIGEgR3Jvb3Z5IHBhcnNlciBhbmQgbGV4ZXIuICovCisgICAgcHVibGljIHN0YXRpYyBKYXZhUmVjb2duaXplciBtYWtlKEphdmFMZXhlciBsZXhlcikgeworICAgICAgICBKYXZhUmVjb2duaXplciBwYXJzZXIgPSBuZXcgSmF2YVJlY29nbml6ZXIobGV4ZXIucGx1bWIoKSk7CisgICAgICAgIC8vIFRPRE86IHNldCB1cCBhIGNvbW1vbiBlcnJvci1oYW5kbGluZyBjb250cm9sIGJsb2NrLCB0byBhdm9pZCBleGNlc3NpdmUgdGFuZ2xlIGJldHdlZW4gdGhlc2UgZ3V5cworICAgICAgICBwYXJzZXIubGV4ZXIgPSBsZXhlcjsKKyAgICAgICAgbGV4ZXIucGFyc2VyID0gcGFyc2VyOworICAgICAgICBwYXJzZXIuc2V0QVNUTm9kZUNsYXNzKCJvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudGxyLkdyb292eVNvdXJjZUFTVCIpOworICAgICAgICByZXR1cm4gcGFyc2VyOworICAgIH0KKyAgICAvLyBDcmVhdGUgYSBzY2FubmVyIHRoYXQgcmVhZHMgZnJvbSB0aGUgaW5wdXQgc3RyZWFtIHBhc3NlZCB0byB1cy4uLgorICAgIHB1YmxpYyBzdGF0aWMgSmF2YVJlY29nbml6ZXIgbWFrZShJbnB1dFN0cmVhbSBpbikgeyByZXR1cm4gbWFrZShuZXcgSmF2YUxleGVyKGluKSk7IH0KKyAgICBwdWJsaWMgc3RhdGljIEphdmFSZWNvZ25pemVyIG1ha2UoUmVhZGVyIGluKSB7IHJldHVybiBtYWtlKG5ldyBKYXZhTGV4ZXIoaW4pKTsgfQorICAgIHB1YmxpYyBzdGF0aWMgSmF2YVJlY29nbml6ZXIgbWFrZShJbnB1dEJ1ZmZlciBpbikgeyByZXR1cm4gbWFrZShuZXcgSmF2YUxleGVyKGluKSk7IH0KKyAgICBwdWJsaWMgc3RhdGljIEphdmFSZWNvZ25pemVyIG1ha2UoTGV4ZXJTaGFyZWRJbnB1dFN0YXRlIGluKSB7IHJldHVybiBtYWtlKG5ldyBKYXZhTGV4ZXIoaW4pKTsgfQorICAgIAorICAgIHByaXZhdGUgc3RhdGljIEdyb292eVNvdXJjZUFTVCBkdW1teVZhcmlhYmxlVG9mb3JjZUNsYXNzTG9hZGVyVG9GaW5kQVNUQ2xhc3MgPSBuZXcgR3Jvb3Z5U291cmNlQVNUKCk7CisgICAgCisgICAgSmF2YUxleGVyIGxleGVyOworICAgIHB1YmxpYyBKYXZhTGV4ZXIgZ2V0TGV4ZXIoKSB7IHJldHVybiBsZXhlcjsgfQorICAgIHB1YmxpYyB2b2lkIHNldEZpbGVuYW1lKFN0cmluZyBmKSB7IHN1cGVyLnNldEZpbGVuYW1lKGYpOyBsZXhlci5zZXRGaWxlbmFtZShmKTsgfQorICAgIHByaXZhdGUgU291cmNlQnVmZmVyIHNvdXJjZUJ1ZmZlcjsKKyAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VCdWZmZXIoU291cmNlQnVmZmVyIHNvdXJjZUJ1ZmZlcikgeworICAgICAgICB0aGlzLnNvdXJjZUJ1ZmZlciA9IHNvdXJjZUJ1ZmZlcjsKKyAgICB9CisKKyAgICAvKiogQ3JlYXRlIGFuIEFTVCBub2RlIHdpdGggdGhlIHRva2VuIHR5cGUgYW5kIHRleHQgcGFzc2VkIGluLCBidXQKKyAgICAgKiAgd2l0aCB0aGUgc2FtZSBiYWNrZ3JvdW5kIGluZm9ybWF0aW9uIGFzIGFub3RoZXIgc3VwcGxpZWQgVG9rZW4gKGUuZy4gbGluZSBudW1iZXJzKQorICAgICAqIHRvIGJlIHVzZWQgaW4gcGxhY2Ugb2YgYW50bHIgdHJlZSBjb25zdHJ1Y3Rpb24gc3ludGF4LAorICAgICAqIGkuZS4gI1tUT0tFTiwidGV4dCJdICBiZWNvbWVzICBjcmVhdGUoVE9LRU4sInRleHQiLGFub3RoZXJUb2tlbikKKyAgICAgKgorICAgICAqIHRvZG8gLSBjaGFuZ2UgYW50bHIuQVNURmFjdG9yeSB0byBkbyB0aGlzIGluc3RlYWQuLi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQVNUIGNyZWF0ZShpbnQgdHlwZSwgU3RyaW5nIHR4dCwgVG9rZW4gZmlyc3QsIFRva2VuIGxhc3QpIHsKKyAgICAgICAgQVNUIHQgPSBhc3RGYWN0b3J5LmNyZWF0ZSh0eXBlLHR4dCk7CisgICAgICAgIGlmICggdCAhPSBudWxsICYmIGZpcnN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIGZpcnN0IGNvcHkgZGV0YWlscyBmcm9tIGZpcnN0IHRva2VuCisgICAgICAgICAgICB0LmluaXRpYWxpemUoZmlyc3QpOworICAgICAgICAgICAgLy8gdGhlbiBlbnN1cmUgdGhhdCB0eXBlIGFuZCB0eHQgYXJlIHNwZWNpZmljIHRvIHRoaXMgbmV3IG5vZGUKKyAgICAgICAgICAgIHQuaW5pdGlhbGl6ZSh0eXBlLHR4dCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHQgaW5zdGFuY2VvZiBHcm9vdnlTb3VyY2VBU1QpICYmIGxhc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgR3Jvb3Z5U291cmNlQVNUIG5vZGUgPSAoR3Jvb3Z5U291cmNlQVNUKXQ7CisgICAgICAgICAgICBub2RlLnNldExhc3QobGFzdCk7CisgICAgICAgICAgICAvLyBUaGlzIGlzIGEgZ29vZCBwb2ludCB0byBjYWxsIG5vZGUuc2V0U25pcHBldCgpLAorICAgICAgICAgICAgLy8gYnV0IGl0IGJ1bGtzIHVwIHRoZSBBU1QgdG9vIG11Y2ggZm9yIHByb2R1Y3Rpb24gY29kZS4KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdDsKKyAgICB9CisKKyAgICAKKyAgICAvKioKKwkgKiBDb3VudHMgdGhlIG51bWJlciBvZiBMVCBzZWVuIGluIHRoZSB0eXBlQXJndW1lbnRzIHByb2R1Y3Rpb24uCisJICogSXQgaXMgdXNlZCBpbiBzZW1hbnRpYyBwcmVkaWNhdGVzIHRvIGVuc3VyZSB3ZSBoYXZlIHNlZW4KKwkgKiBlbm91Z2ggY2xvc2luZyAnPicgY2hhcmFjdGVyczsgd2hpY2ggYWN0dWFsbHkgbWF5IGhhdmUgYmVlbgorCSAqIGVpdGhlciBHVCwgU1Igb3IgQlNSIHRva2Vucy4KKwkgKi8KKwlwcml2YXRlIGludCBsdENvdW50ZXIgPSAwOworfQorCisvLyBDb21waWxhdGlvbiBVbml0OiBJbiBKYXZhLCB0aGlzIGlzIGEgc2luZ2xlIGZpbGUuIFRoaXMgaXMgdGhlIHN0YXJ0CisvLyBydWxlIGZvciB0aGlzIHBhcnNlcgorY29tcGlsYXRpb25Vbml0CisJOgkvLyBBIGNvbXBpbGF0aW9uIHVuaXQgc3RhcnRzIHdpdGggYW4gb3B0aW9uYWwgcGFja2FnZSBkZWZpbml0aW9uCisJCSgJKGFubm90YXRpb25zICJwYWNrYWdlIik9PiBwYWNrYWdlRGVmaW5pdGlvbgorCQl8CS8qIG5vdGhpbmcgKi8KKwkJKQorCisJCS8vIE5leHQgd2UgaGF2ZSBhIHNlcmllcyBvZiB6ZXJvIG9yIG1vcmUgaW1wb3J0IHN0YXRlbWVudHMKKwkJKCBpbXBvcnREZWZpbml0aW9uICkqCisKKwkJLy8gV3JhcHBpbmcgdGhpbmdzIHVwIHdpdGggYW55IG51bWJlciBvZiBjbGFzcyBvciBpbnRlcmZhY2UKKwkJLy8gZGVmaW5pdGlvbnMKKwkJKCB0eXBlRGVmaW5pdGlvbiApKgorCisJCUVPRiEKKwk7CisKKworLy8gUGFja2FnZSBzdGF0ZW1lbnQ6IG9wdGlvbmFsIGFubm90YXRpb25zIGZvbGxvd2VkIGJ5ICJwYWNrYWdlIiB0aGVuIHRoZSBwYWNrYWdlIGlkZW50aWZpZXIuCitwYWNrYWdlRGVmaW5pdGlvbgorCW9wdGlvbnMge2RlZmF1bHRFcnJvckhhbmRsZXIgPSB0cnVlO30gLy8gbGV0IEFOVExSIGhhbmRsZSBlcnJvcnMKKwk6CWFubm90YXRpb25zIHA6InBhY2thZ2UiXiB7I3Auc2V0VHlwZShQQUNLQUdFX0RFRik7fSBpZGVudGlmaWVyIFNFTUkhCisJOworCisKKy8vIEltcG9ydCBzdGF0ZW1lbnQ6IGltcG9ydCBmb2xsb3dlZCBieSBhIHBhY2thZ2Ugb3IgY2xhc3MgbmFtZQoraW1wb3J0RGVmaW5pdGlvbgorCW9wdGlvbnMge2RlZmF1bHRFcnJvckhhbmRsZXIgPSB0cnVlO30KKwl7IGJvb2xlYW4gaXNTdGF0aWMgPSBmYWxzZTsgfQorCToJaToiaW1wb3J0Il4geyNpLnNldFR5cGUoSU1QT1JUKTt9ICggInN0YXRpYyIhIHsjaS5zZXRUeXBlKFNUQVRJQ19JTVBPUlQpO30gKT8gaWRlbnRpZmllclN0YXIgU0VNSSEKKwk7CisKKy8vIEEgdHlwZSBkZWZpbml0aW9uIGlzIGVpdGhlciBhIGNsYXNzLCBpbnRlcmZhY2UsIGVudW0gb3IgYW5ub3RhdGlvbiB3aXRoIHBvc3NpYmxlIGFkZGl0aW9uYWwgc2VtaXMuCit0eXBlRGVmaW5pdGlvbgorCW9wdGlvbnMge2RlZmF1bHRFcnJvckhhbmRsZXIgPSB0cnVlO30KKwk6CW06bW9kaWZpZXJzIQorCQl0eXBlRGVmaW5pdGlvbkludGVybmFsWyNtXQorCXwJU0VNSSEKKwk7CisKKy8vIFByb3RlY3RlZCB0eXBlIGRlZmluaXRpb25zIHByb2R1Y3Rpb24gZm9yIHJldXNlIGluIG90aGVyIHByb2R1Y3Rpb25zCitwcm90ZWN0ZWQgdHlwZURlZmluaXRpb25JbnRlcm5hbFtBU1QgbW9kc10KKwk6CWNsYXNzRGVmaW5pdGlvblsjbW9kc10JCS8vIGlubmVyIGNsYXNzCisJfAlpbnRlcmZhY2VEZWZpbml0aW9uWyNtb2RzXQkvLyBpbm5lciBpbnRlcmZhY2UKKwl8CWVudW1EZWZpbml0aW9uWyNtb2RzXQkJLy8gaW5uZXIgZW51bQorCXwJYW5ub3RhdGlvbkRlZmluaXRpb25bI21vZHNdCS8vIGlubmVyIGFubm90YXRpb24KKwk7CisKKy8vIEEgZGVjbGFyYXRpb24gaXMgdGhlIGNyZWF0aW9uIG9mIGEgcmVmZXJlbmNlIG9yIHByaW1pdGl2ZS10eXBlIHZhcmlhYmxlCisvLyBDcmVhdGUgYSBzZXBhcmF0ZSBUeXBlL1ZhciB0cmVlIGZvciBlYWNoIHZhciBpbiB0aGUgdmFyIGxpc3QuCitkZWNsYXJhdGlvbiEKKwk6CW06bW9kaWZpZXJzIHQ6dHlwZVNwZWNbZmFsc2VdIHY6dmFyaWFibGVEZWZpbml0aW9uc1sjbSwjdF0KKwkJeyNkZWNsYXJhdGlvbiA9ICN2O30KKwk7CisKKy8vIEEgdHlwZSBzcGVjaWZpY2F0aW9uIGlzIGEgdHlwZSBuYW1lIHdpdGggcG9zc2libGUgYnJhY2tldHMgYWZ0ZXJ3YXJkcworLy8gKHdoaWNoIHdvdWxkIG1ha2UgaXQgYW4gYXJyYXkgdHlwZSkuCit0eXBlU3BlY1tib29sZWFuIGFkZEltYWdOb2RlXQorCToJY2xhc3NUeXBlU3BlY1thZGRJbWFnTm9kZV0KKwl8CWJ1aWx0SW5UeXBlU3BlY1thZGRJbWFnTm9kZV0KKwk7CisKKy8vIEEgY2xhc3MgdHlwZSBzcGVjaWZpY2F0aW9uIGlzIGEgY2xhc3MgdHlwZSB3aXRoIGVpdGhlcjoKKy8vIC0gcG9zc2libGUgYnJhY2tldHMgYWZ0ZXJ3YXJkcworLy8gICAod2hpY2ggd291bGQgbWFrZSBpdCBhbiBhcnJheSB0eXBlKS4KKy8vIC0gZ2VuZXJpYyB0eXBlIGFyZ3VtZW50cyBhZnRlcgorY2xhc3NUeXBlU3BlY1tib29sZWFuIGFkZEltYWdOb2RlXSAge1Rva2VuIGZpcnN0ID0gTFQoMSk7fQorCToJY2xhc3NPckludGVyZmFjZVR5cGVbZmFsc2VdCisJCShvcHRpb25ze2dyZWVkeT10cnVlO306IC8vIG1hdGNoIGFzIG1hbnkgYXMgcG9zc2libGUKKwkJCWxiOkxCUkFDS14geyNsYi5zZXRUeXBlKEFSUkFZX0RFQ0xBUkFUT1IpO30gUkJSQUNLIQorCQkpKgorCQl7CisJCQlpZiAoIGFkZEltYWdOb2RlICkgeworCQkJCSNjbGFzc1R5cGVTcGVjID0gIyhjcmVhdGUoVFlQRSwiVFlQRSIsZmlyc3QsTFQoMSkpLCAjY2xhc3NUeXBlU3BlYyk7CisJCQl9CisJCX0KKwk7CisKKy8vIEEgbm9uLWJ1aWx0IGluIHR5cGUgbmFtZSwgd2l0aCBwb3NzaWJsZSB0eXBlIHBhcmFtZXRlcnMKK2NsYXNzT3JJbnRlcmZhY2VUeXBlW2Jvb2xlYW4gYWRkSW1hZ05vZGVdICB7VG9rZW4gZmlyc3QgPSBMVCgxKTt9CisJOglJREVOVF4gKHR5cGVBcmd1bWVudHMpPworCQkob3B0aW9uc3tncmVlZHk9dHJ1ZTt9OiAvLyBtYXRjaCBhcyBtYW55IGFzIHBvc3NpYmxlCisJCQlET1ReCisJCQlJREVOVCAodHlwZUFyZ3VtZW50cyk/CisJCSkqCisJCXsKKwkJCWlmICggYWRkSW1hZ05vZGUgKSB7CisJCQkJI2NsYXNzT3JJbnRlcmZhY2VUeXBlID0gIyhjcmVhdGUoVFlQRSwiVFlQRSIsZmlyc3QsTFQoMSkpLCAjY2xhc3NPckludGVyZmFjZVR5cGUpOworCQkJfQorCQl9CisJOworCisvLyBBIHNwZWNpYWxpc2VkIGZvcm0gb2YgdHlwZVNwZWMgd2hlcmUgYnVpbHQgaW4gdHlwZXMgbXVzdCBiZSBhcnJheXMKK3R5cGVBcmd1bWVudFNwZWMKKwk6CWNsYXNzVHlwZVNwZWNbdHJ1ZV0KKwl8CWJ1aWx0SW5UeXBlQXJyYXlTcGVjW3RydWVdCisJOworCisvLyBBIGdlbmVyaWMgdHlwZSBhcmd1bWVudCBpcyBhIGNsYXNzIHR5cGUsIGEgcG9zc2libHkgYm91bmRlZCB3aWxkY2FyZCB0eXBlIG9yIGEgYnVpbHQtaW4gdHlwZSBhcnJheQordHlwZUFyZ3VtZW50ICB7VG9rZW4gZmlyc3QgPSBMVCgxKTt9CisJOgkoCXR5cGVBcmd1bWVudFNwZWMKKwkJfAl3aWxkY2FyZFR5cGUKKwkJKQorCQl7I3R5cGVBcmd1bWVudCA9ICMoY3JlYXRlKFRZUEVfQVJHVU1FTlQsIlRZUEVfQVJHVU1FTlQiLGZpcnN0LExUKDEpKSwgI3R5cGVBcmd1bWVudCk7fQorCTsKKworLy8gV2lsZGNhcmQgdHlwZSBpbmRpY2F0aW5nIGFsbCB0eXBlcyAod2l0aCBwb3NzaWJsZSBjb25zdHJhaW50KQord2lsZGNhcmRUeXBlCisJOglxOlFVRVNUSU9OXiB7I3Euc2V0VHlwZShXSUxEQ0FSRF9UWVBFKTt9CisJCSgoImV4dGVuZHMiIHwgInN1cGVyIik9PiB0eXBlQXJndW1lbnRCb3VuZHMpPworCTsKKworLy8gVHlwZSBhcmd1bWVudHMgdG8gYSBjbGFzcyBvciBpbnRlcmZhY2UgdHlwZQordHlwZUFyZ3VtZW50cwore2ludCBjdXJyZW50THRMZXZlbCA9IDA7ICBUb2tlbiBmaXJzdCA9IExUKDEpO30KKwk6CisJCXtjdXJyZW50THRMZXZlbCA9IGx0Q291bnRlcjt9CisJCUxUISB7bHRDb3VudGVyKys7fQorCQl0eXBlQXJndW1lbnQKKwkJKG9wdGlvbnN7Z3JlZWR5PXRydWU7fTogLy8gbWF0Y2ggYXMgbWFueSBhcyBwb3NzaWJsZQorCQkJe2lucHV0U3RhdGUuZ3Vlc3NpbmcgIT0wIHx8IGx0Q291bnRlciA9PSBjdXJyZW50THRMZXZlbCArIDF9PworCQkJQ09NTUEhIHR5cGVBcmd1bWVudAorCQkpKgorCisJCSgJLy8gdHVybiB3YXJuaW5nIG9mZiBzaW5jZSBBbnRsciBnZW5lcmF0ZXMgdGhlIHJpZ2h0IGNvZGUsCisJCQkvLyBwbHVzIHdlIGhhdmUgb3VyIHNlbWFudGljIHByZWRpY2F0ZSBiZWxvdworCQkJb3B0aW9uc3tnZW5lcmF0ZUFtYmlnV2FybmluZ3M9ZmFsc2U7fToKKwkJCXR5cGVBcmd1bWVudHNPclBhcmFtZXRlcnNFbmQKKwkJKT8KKworCQkvLyBtYWtlIHN1cmUgd2UgaGF2ZSBnb2JibGVkIHVwIGVub3VnaCAnPicgY2hhcmFjdGVycworCQkvLyBpZiB3ZSBhcmUgYXQgdGhlICJ0b3AgbGV2ZWwiIG9mIG5lc3RlZCB0eXBlQXJndW1lbnQgcHJvZHVjdGlvbnMKKwkJeyhjdXJyZW50THRMZXZlbCAhPSAwKSB8fCBsdENvdW50ZXIgPT0gY3VycmVudEx0TGV2ZWx9PworCisJCXsjdHlwZUFyZ3VtZW50cyA9ICMoY3JlYXRlKFRZUEVfQVJHVU1FTlRTLCJUWVBFX0FSR1VNRU5UUyIsZmlyc3QsTFQoMSkpLCAjdHlwZUFyZ3VtZW50cyk7fQorCTsKKworLy8gdGhpcyBnb2JibGVzIHVwICpzb21lKiBhbW91bnQgb2YgJz4nIGNoYXJhY3RlcnMsIGFuZCBjb3VudHMgaG93IG1hbnkKKy8vIGl0IGdvYmJsZWQuCitwcm90ZWN0ZWQgdHlwZUFyZ3VtZW50c09yUGFyYW1ldGVyc0VuZAorCToJR1QhIHtsdENvdW50ZXItPTE7fQorCXwJU1IhIHtsdENvdW50ZXItPTI7fQorCXwJQlNSISB7bHRDb3VudGVyLT0zO30KKwk7CisKKy8vIFJlc3RyaWN0aW9uIG9uIHdpbGRjYXJkIHR5cGVzIGJhc2VkIG9uIHN1cGVyIGNsYXNzIG9yIGRlcnJpdmVkIGNsYXNzCit0eXBlQXJndW1lbnRCb3VuZHMKKwl7Ym9vbGVhbiBpc1VwcGVyQm91bmRzID0gZmFsc2U7ICBUb2tlbiBmaXJzdCA9IExUKDEpO30KKwk6CisJCSggImV4dGVuZHMiISB7aXNVcHBlckJvdW5kcz10cnVlO30gfCAic3VwZXIiISApIGNsYXNzT3JJbnRlcmZhY2VUeXBlW2ZhbHNlXQorCQl7CisJCQlpZiAoaXNVcHBlckJvdW5kcykKKwkJCXsKKwkJCQkjdHlwZUFyZ3VtZW50Qm91bmRzID0gIyhjcmVhdGUoVFlQRV9VUFBFUl9CT1VORFMsIlRZUEVfVVBQRVJfQk9VTkRTIixmaXJzdCxMVCgxKSksICN0eXBlQXJndW1lbnRCb3VuZHMpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCSN0eXBlQXJndW1lbnRCb3VuZHMgPSAjKGNyZWF0ZShUWVBFX0xPV0VSX0JPVU5EUywiVFlQRV9MT1dFUl9CT1VORFMiLGZpcnN0LExUKDEpKSwgI3R5cGVBcmd1bWVudEJvdW5kcyk7CisJCQl9CisJCX0KKwk7CisKKy8vIEEgYnVpbHRpbiB0eXBlIGFycmF5IHNwZWNpZmljYXRpb24gaXMgYSBidWlsdGluIHR5cGUgd2l0aCBicmFja2V0cyBhZnRlcndhcmRzCitidWlsdEluVHlwZUFycmF5U3BlY1tib29sZWFuIGFkZEltYWdOb2RlXSAge1Rva2VuIGZpcnN0ID0gTFQoMSk7fQorCToJYnVpbHRJblR5cGUKKwkJKG9wdGlvbnN7Z3JlZWR5PXRydWU7fTogLy8gbWF0Y2ggYXMgbWFueSBhcyBwb3NzaWJsZQorCQkJbGI6TEJSQUNLXiB7I2xiLnNldFR5cGUoQVJSQVlfREVDTEFSQVRPUik7fSBSQlJBQ0shCisJCSkrCisKKwkJeworCQkJaWYgKCBhZGRJbWFnTm9kZSApIHsKKwkJCQkjYnVpbHRJblR5cGVBcnJheVNwZWMgPSAjKGNyZWF0ZShUWVBFLCJUWVBFIixmaXJzdCxMVCgxKSksICNidWlsdEluVHlwZUFycmF5U3BlYyk7CisJCQl9CisJCX0KKwk7CisKKy8vIEEgYnVpbHRpbiB0eXBlIHNwZWNpZmljYXRpb24gaXMgYSBidWlsdGluIHR5cGUgd2l0aCBwb3NzaWJsZSBicmFja2V0cworLy8gYWZ0ZXJ3YXJkcyAod2hpY2ggd291bGQgbWFrZSBpdCBhbiBhcnJheSB0eXBlKS4KK2J1aWx0SW5UeXBlU3BlY1tib29sZWFuIGFkZEltYWdOb2RlXSAge1Rva2VuIGZpcnN0ID0gTFQoMSk7fQorCToJYnVpbHRJblR5cGUKKwkJKG9wdGlvbnN7Z3JlZWR5PXRydWU7fTogLy8gbWF0Y2ggYXMgbWFueSBhcyBwb3NzaWJsZQorCQkJbGI6TEJSQUNLXiB7I2xiLnNldFR5cGUoQVJSQVlfREVDTEFSQVRPUik7fSBSQlJBQ0shCisJCSkqCisJCXsKKwkJCWlmICggYWRkSW1hZ05vZGUgKSB7CisJCQkJI2J1aWx0SW5UeXBlU3BlYyA9ICMoY3JlYXRlKFRZUEUsIlRZUEUiLGZpcnN0LExUKDEpKSwgI2J1aWx0SW5UeXBlU3BlYyk7CisJCQl9CisJCX0KKwk7CisKKy8vIEEgdHlwZSBuYW1lLiB3aGljaCBpcyBlaXRoZXIgYSAocG9zc2libHkgcXVhbGlmaWVkIGFuZCBwYXJhbWV0ZXJpemVkKQorLy8gY2xhc3MgbmFtZSBvciBhIHByaW1pdGl2ZSAoYnVpbHRpbikgdHlwZQordHlwZQorCToJY2xhc3NPckludGVyZmFjZVR5cGVbZmFsc2VdCisJfAlidWlsdEluVHlwZQorCTsKKworLy8gVGhlIHByaW1pdGl2ZSB0eXBlcy4KK2J1aWx0SW5UeXBlCisJOgkidm9pZCIKKwl8CSJib29sZWFuIgorCXwJImJ5dGUiCisJfAkiY2hhciIKKwl8CSJzaG9ydCIKKwl8CSJpbnQiCisJfAkiZmxvYXQiCisJfAkibG9uZyIKKwl8CSJkb3VibGUiCisJOworCisvLyBBIChwb3NzaWJseS1xdWFsaWZpZWQpIGphdmEgaWRlbnRpZmllci4gV2Ugc3RhcnQgd2l0aCB0aGUgZmlyc3QgSURFTlQKKy8vIGFuZCBleHBhbmQgaXRzIG5hbWUgYnkgYWRkaW5nIGRvdHMgYW5kIGZvbGxvd2luZyBJREVOVFMKK2lkZW50aWZpZXIKKwk6CUlERU5UICggRE9UXiBJREVOVCApKgorCTsKKworaWRlbnRpZmllclN0YXIKKwk6CUlERU5UCisJCSggRE9UXiBJREVOVCApKgorCQkoIERPVF4gU1RBUiApPworCTsKKworLy8gQSBsaXN0IG9mIHplcm8gb3IgbW9yZSBtb2RpZmllcnMuIFdlIGNvdWxkIGhhdmUgdXNlZCAobW9kaWZpZXIpKiBpbgorLy8gcGxhY2Ugb2YgYSBjYWxsIHRvIG1vZGlmaWVycywgYnV0IEkgdGhvdWdodCBpdCB3YXMgYSBnb29kIGlkZWEgdG8ga2VlcAorLy8gdGhpcyBydWxlIHNlcGFyYXRlIHNvIHRoZXkgY2FuIGVhc2lseSBiZSBjb2xsZWN0ZWQgaW4gYSBWZWN0b3IgaWYKKy8vIHNvbWVvbmUgc28gZGVzaXJlcworbW9kaWZpZXJzIHtUb2tlbiBmaXJzdCA9IExUKDEpO30KKwk6CisJCSgKKwkJCS8vaHVzaCB3YXJuaW5ncyBzaW5jZSB0aGUgc2VtYW50aWMgY2hlY2sgZm9yICJAaW50ZXJmYWNlIiBzb2x2ZXMgdGhlIG5vbi1kZXRlcm1pbmlzbQorCQkJb3B0aW9uc3tnZW5lcmF0ZUFtYmlnV2FybmluZ3M9ZmFsc2U7fToKKworCQkJbW9kaWZpZXIKKwkJCXwKKwkJCS8vU2VtYW50aWMgY2hlY2sgdGhhdCB3ZSBhcmVuJ3QgbWF0Y2hpbmcgQGludGVyZmFjZSBhcyB0aGlzIGlzIG5vdCBhbiBhbm5vdGF0aW9uCisJCQkvL0EgbmljZXIgd2F5IHRvIGRvIHRoaXMgd291bGQgYmUgbmljZQorCQkJe0xBKDEpPT1BVCAmJiAhTFQoMikuZ2V0VGV4dCgpLmVxdWFscygiaW50ZXJmYWNlIil9PyBhbm5vdGF0aW9uCisJCSkqCisKKwkJeyNtb2RpZmllcnMgPSAjKGNyZWF0ZShNT0RJRklFUlMsICJNT0RJRklFUlMiLGZpcnN0LExUKDEpKSwgI21vZGlmaWVycyk7fQorCTsKKworLy8gbW9kaWZpZXJzIGZvciBKYXZhIGNsYXNzZXMsIGludGVyZmFjZXMsIGNsYXNzL2luc3RhbmNlIHZhcnMgYW5kIG1ldGhvZHMKK21vZGlmaWVyCisJOgkicHJpdmF0ZSIKKwl8CSJwdWJsaWMiCisJfAkicHJvdGVjdGVkIgorCXwJInN0YXRpYyIKKwl8CSJ0cmFuc2llbnQiCisJfAkiZmluYWwiCisJfAkiYWJzdHJhY3QiCisJfAkibmF0aXZlIgorCXwJInRocmVhZHNhZmUiCisJfAkic3luY2hyb25pemVkIgorCXwJInZvbGF0aWxlIgorCXwJInN0cmljdGZwIgorCTsKKworYW5ub3RhdGlvbiEgIHtUb2tlbiBmaXJzdCA9IExUKDEpO30KKwk6CUFUISBpOmlkZW50aWZpZXIgKCBMUEFSRU4hICggYXJnczphbm5vdGF0aW9uQXJndW1lbnRzICk/IFJQQVJFTiEgKT8KKwkJeyNhbm5vdGF0aW9uID0gIyhjcmVhdGUoQU5OT1RBVElPTiwiQU5OT1RBVElPTiIsZmlyc3QsTFQoMSkpLCBpLCBhcmdzKTt9CisJOworCithbm5vdGF0aW9ucyAge1Rva2VuIGZpcnN0ID0gTFQoMSk7fQorICAgIDogICAoYW5ub3RhdGlvbikqCisJCXsjYW5ub3RhdGlvbnMgPSAjKFtBTk5PVEFUSU9OUywgIkFOTk9UQVRJT05TIl0sICNhbm5vdGF0aW9ucyk7fQorICAgIDsKKworYW5ub3RhdGlvbkFyZ3VtZW50cworCToJYW5ub3RhdGlvbk1lbWJlclZhbHVlSW5pdGlhbGl6ZXIgfCBhbm50b3RhdGlvbk1lbWJlclZhbHVlUGFpcnMKKwk7CisKK2FubnRvdGF0aW9uTWVtYmVyVmFsdWVQYWlycworCToJYW5ub3RhdGlvbk1lbWJlclZhbHVlUGFpciAoIENPTU1BISBhbm5vdGF0aW9uTWVtYmVyVmFsdWVQYWlyICkqCisJOworCithbm5vdGF0aW9uTWVtYmVyVmFsdWVQYWlyISAge1Rva2VuIGZpcnN0ID0gTFQoMSk7fQorCToJaTpJREVOVCBBU1NJR04hIHY6YW5ub3RhdGlvbk1lbWJlclZhbHVlSW5pdGlhbGl6ZXIKKwkJeyNhbm5vdGF0aW9uTWVtYmVyVmFsdWVQYWlyID0gIyhjcmVhdGUoQU5OT1RBVElPTl9NRU1CRVJfVkFMVUVfUEFJUiwiQU5OT1RBVElPTl9NRU1CRVJfVkFMVUVfUEFJUiIsZmlyc3QsTFQoMSkpLCBpLCB2KTt9CisJOworCithbm5vdGF0aW9uTWVtYmVyVmFsdWVJbml0aWFsaXplcgorCToKKwkJY29uZGl0aW9uYWxFeHByZXNzaW9uIHwgYW5ub3RhdGlvbiB8IGFubm90YXRpb25NZW1iZXJBcnJheUluaXRpYWxpemVyCisJOworCisvLyBUaGlzIGlzIGFuIGluaXRpYWxpemVyIHVzZWQgdG8gc2V0IHVwIGFuIGFubm90YXRpb24gbWVtYmVyIGFycmF5LgorYW5ub3RhdGlvbk1lbWJlckFycmF5SW5pdGlhbGl6ZXIKKwk6CWxjOkxDVVJMWV4geyNsYy5zZXRUeXBlKEFOTk9UQVRJT05fQVJSQVlfSU5JVCk7fQorCQkJKAlhbm5vdGF0aW9uTWVtYmVyQXJyYXlWYWx1ZUluaXRpYWxpemVyCisJCQkJKAorCQkJCQkvLyBDT05GTElDVDogZG9lcyBhIENPTU1BIGFmdGVyIGFuIGluaXRpYWxpemVyIHN0YXJ0IGEgbmV3CisJCQkJCS8vIGluaXRpYWxpemVyIG9yIHN0YXJ0IHRoZSBvcHRpb24gJywnIGF0IGVuZD8KKwkJCQkJLy8gQU5UTFIgZ2VuZXJhdGVzIHByb3BlciBjb2RlIGJ5IG1hdGNoaW5nCisJCQkJCS8vIHRoZSBjb21tYSBhcyBzb29uIGFzIHBvc3NpYmxlLgorCQkJCQlvcHRpb25zIHsKKwkJCQkJCXdhcm5XaGVuRm9sbG93QW1iaWcgPSBmYWxzZTsKKwkJCQkJfQorCQkJCToKKwkJCQkJQ09NTUEhIGFubm90YXRpb25NZW1iZXJBcnJheVZhbHVlSW5pdGlhbGl6ZXIKKwkJCQkpKgorCQkJCShDT01NQSEpPworCQkJKT8KKwkJUkNVUkxZIQorCTsKKworLy8gVGhlIHR3byB0aGluZ3MgdGhhdCBjYW4gaW5pdGlhbGl6ZSBhbiBhbm5vdGF0aW9uIGFycmF5IGVsZW1lbnQgYXJlIGEgY29uZGl0aW9uYWwgZXhwcmVzc2lvbgorLy8gYW5kIGFuIGFubm90YXRpb24gKG5lc3RlZCBhbm5vdGF0aW9uIGFycmF5IGluaXRpYWxpc2VycyBhcmUgbm90IHZhbGlkKQorYW5ub3RhdGlvbk1lbWJlckFycmF5VmFsdWVJbml0aWFsaXplcgorCToJY29uZGl0aW9uYWxFeHByZXNzaW9uCisJfAlhbm5vdGF0aW9uCisJOworCitzdXBlckNsYXNzQ2xhdXNlISAge1Rva2VuIGZpcnN0ID0gTFQoMSk7fQorCToJKCAiZXh0ZW5kcyIgYzpjbGFzc09ySW50ZXJmYWNlVHlwZVtmYWxzZV0gKT8KKwkJeyNzdXBlckNsYXNzQ2xhdXNlID0gIyhjcmVhdGUoRVhURU5EU19DTEFVU0UsIkVYVEVORFNfQ0xBVVNFIixmaXJzdCxMVCgxKSksYyk7fQorCTsKKworLy8gRGVmaW5pdGlvbiBvZiBhIEphdmEgY2xhc3MKK2NsYXNzRGVmaW5pdGlvbiFbQVNUIG1vZGlmaWVyc10ge1Rva2VuIGZpcnN0ID0gTFQoMSk7fQorCToJImNsYXNzIiBJREVOVAorCQkvLyBpdCBfbWlnaHRfIGhhdmUgdHlwZSBwYXJhbWF0ZXJzCisJCSh0cDp0eXBlUGFyYW1ldGVycyk/CisJCS8vIGl0IF9taWdodF8gaGF2ZSBhIHN1cGVyY2xhc3MuLi4KKwkJc2M6c3VwZXJDbGFzc0NsYXVzZQorCQkvLyBpdCBtaWdodCBpbXBsZW1lbnQgc29tZSBpbnRlcmZhY2VzLi4uCisJCWljOmltcGxlbWVudHNDbGF1c2UKKwkJLy8gbm93IHBhcnNlIHRoZSBib2R5IG9mIHRoZSBjbGFzcworCQljYjpjbGFzc0Jsb2NrCisJCXsjY2xhc3NEZWZpbml0aW9uID0gIyhjcmVhdGUoQ0xBU1NfREVGLCJDTEFTU19ERUYiLGZpcnN0LExUKDEpKSwKKwkJCQkJCQkJbW9kaWZpZXJzLElERU5ULHRwLHNjLGljLGNiKTt9CisJOworCisvLyBEZWZpbml0aW9uIG9mIGEgSmF2YSBJbnRlcmZhY2UKK2ludGVyZmFjZURlZmluaXRpb24hW0FTVCBtb2RpZmllcnNdICB7VG9rZW4gZmlyc3QgPSBMVCgxKTt9CisJOgkiaW50ZXJmYWNlIiBJREVOVAorCQkvLyBpdCBfbWlnaHRfIGhhdmUgdHlwZSBwYXJhbWF0ZXJzCisJCSh0cDp0eXBlUGFyYW1ldGVycyk/CisJCS8vIGl0IG1pZ2h0IGV4dGVuZCBzb21lIG90aGVyIGludGVyZmFjZXMKKwkJaWU6aW50ZXJmYWNlRXh0ZW5kcworCQkvLyBub3cgcGFyc2UgdGhlIGJvZHkgb2YgdGhlIGludGVyZmFjZSAobG9va3MgbGlrZSBhIGNsYXNzLi4uKQorCQlpYjppbnRlcmZhY2VCbG9jaworCQl7I2ludGVyZmFjZURlZmluaXRpb24gPSAjKGNyZWF0ZShJTlRFUkZBQ0VfREVGLCJJTlRFUkZBQ0VfREVGIixmaXJzdCxMVCgxKSksCisJCQkJCQkJCQltb2RpZmllcnMsSURFTlQsdHAsaWUsaWIpO30KKwk7CisKK2VudW1EZWZpbml0aW9uIVtBU1QgbW9kaWZpZXJzXSAge1Rva2VuIGZpcnN0ID0gTFQoMSk7fQorCToJImVudW0iIElERU5UCisJCS8vIGl0IG1pZ2h0IGltcGxlbWVudCBzb21lIGludGVyZmFjZXMuLi4KKwkJaWM6aW1wbGVtZW50c0NsYXVzZQorCQkvLyBub3cgcGFyc2UgdGhlIGJvZHkgb2YgdGhlIGVudW0KKwkJZWI6ZW51bUJsb2NrCisJCXsjZW51bURlZmluaXRpb24gPSAjKGNyZWF0ZShFTlVNX0RFRiwiRU5VTV9ERUYiLGZpcnN0LExUKDEpKSwKKwkJCQkJCQkJbW9kaWZpZXJzLElERU5ULGljLGViKTt9CisJOworCithbm5vdGF0aW9uRGVmaW5pdGlvbiFbQVNUIG1vZGlmaWVyc10gIHtUb2tlbiBmaXJzdCA9IExUKDEpO30KKwk6CUFUICJpbnRlcmZhY2UiIElERU5UCisJCS8vIG5vdyBwYXJzZSB0aGUgYm9keSBvZiB0aGUgYW5ub3RhdGlvbgorCQlhYjphbm5vdGF0aW9uQmxvY2sKKwkJeyNhbm5vdGF0aW9uRGVmaW5pdGlvbiA9ICMoY3JlYXRlKEFOTk9UQVRJT05fREVGLCJBTk5PVEFUSU9OX0RFRiIsZmlyc3QsTFQoMSkpLAorCQkJCQkJCQkJbW9kaWZpZXJzLElERU5ULGFiKTt9CisJOworCit0eXBlUGFyYW1ldGVycwore2ludCBjdXJyZW50THRMZXZlbCA9IDA7IFRva2VuIGZpcnN0ID0gTFQoMSk7fQorCToKKwkJe2N1cnJlbnRMdExldmVsID0gbHRDb3VudGVyO30KKwkJTFQhIHtsdENvdW50ZXIrKzt9CisJCXR5cGVQYXJhbWV0ZXIgKENPTU1BISB0eXBlUGFyYW1ldGVyKSoKKwkJKHR5cGVBcmd1bWVudHNPclBhcmFtZXRlcnNFbmQpPworCisJCS8vIG1ha2Ugc3VyZSB3ZSBoYXZlIGdvYmJsZWQgdXAgZW5vdWdoICc+JyBjaGFyYWN0ZXJzCisJCS8vIGlmIHdlIGFyZSBhdCB0aGUgInRvcCBsZXZlbCIgb2YgbmVzdGVkIHR5cGVBcmd1bWVudCBwcm9kdWN0aW9ucworCQl7KGN1cnJlbnRMdExldmVsICE9IDApIHx8IGx0Q291bnRlciA9PSBjdXJyZW50THRMZXZlbH0/CisKKwkJeyN0eXBlUGFyYW1ldGVycyA9ICMoY3JlYXRlKFRZUEVfUEFSQU1FVEVSUywiVFlQRV9QQVJBTUVURVJTIixmaXJzdCxMVCgxKSksICN0eXBlUGFyYW1ldGVycyk7fQorCTsKKwordHlwZVBhcmFtZXRlciAgIHtUb2tlbiBmaXJzdCA9IExUKDEpO30KKwk6CisJCS8vIEknbSBwcmV0dHkgc3VyZSBBbnRsciBnZW5lcmF0ZXMgdGhlIHJpZ2h0IHRoaW5nIGhlcmU6CisJCShpZDpJREVOVCkgKCBvcHRpb25ze2dlbmVyYXRlQW1iaWdXYXJuaW5ncz1mYWxzZTt9OiB0eXBlUGFyYW1ldGVyQm91bmRzICk/CisJCXsjdHlwZVBhcmFtZXRlciA9ICMoY3JlYXRlKFRZUEVfUEFSQU1FVEVSLCJUWVBFX1BBUkFNRVRFUiIsZmlyc3QsTFQoMSkpLCAjdHlwZVBhcmFtZXRlcik7fQorCTsKKwordHlwZVBhcmFtZXRlckJvdW5kcyAge1Rva2VuIGZpcnN0ID0gTFQoMSk7fQorCToKKwkJImV4dGVuZHMiISBjbGFzc09ySW50ZXJmYWNlVHlwZVtmYWxzZV0KKwkJKEJBTkQhIGNsYXNzT3JJbnRlcmZhY2VUeXBlW2ZhbHNlXSkqCisJCXsjdHlwZVBhcmFtZXRlckJvdW5kcyA9ICMoY3JlYXRlKFRZUEVfVVBQRVJfQk9VTkRTLCJUWVBFX1VQUEVSX0JPVU5EUyIsZmlyc3QsTFQoMSkpLCAjdHlwZVBhcmFtZXRlckJvdW5kcyk7fQorCTsKKworLy8gVGhpcyBpcyB0aGUgYm9keSBvZiBhIGNsYXNzLiBZb3UgY2FuIGhhdmUgY2xhc3NGaWVsZHMgYW5kIGV4dHJhIHNlbWljb2xvbnMuCitjbGFzc0Jsb2NrCisJOglMQ1VSTFkhCisJCQkoIGNsYXNzRmllbGQgfCBTRU1JISApKgorCQlSQ1VSTFkhCisJCXsjY2xhc3NCbG9jayA9ICMoW09CSkJMT0NLLCAiT0JKQkxPQ0siXSwgI2NsYXNzQmxvY2spO30KKwk7CisKKy8vIFRoaXMgaXMgdGhlIGJvZHkgb2YgYW4gaW50ZXJmYWNlLiBZb3UgY2FuIGhhdmUgaW50ZXJmYWNlRmllbGQgYW5kIGV4dHJhIHNlbWljb2xvbnMuCitpbnRlcmZhY2VCbG9jaworCToJTENVUkxZIQorCQkJKCBpbnRlcmZhY2VGaWVsZCB8IFNFTUkhICkqCisJCVJDVVJMWSEKKwkJeyNpbnRlcmZhY2VCbG9jayA9ICMoW09CSkJMT0NLLCAiT0JKQkxPQ0siXSwgI2ludGVyZmFjZUJsb2NrKTt9CisJOworCQorLy8gVGhpcyBpcyB0aGUgYm9keSBvZiBhbiBhbm5vdGF0aW9uLiBZb3UgY2FuIGhhdmUgYW5ub3RhdGlvbiBmaWVsZHMgYW5kIGV4dHJhIHNlbWljb2xvbnMsCisvLyBUaGF0J3MgYWJvdXQgaXQgKHVudGlsIHlvdSBzZWUgd2hhdCBhbiBhbm5vYXRpb24gZmllbGQgaXMuLi4pCithbm5vdGF0aW9uQmxvY2sKKwk6CUxDVVJMWSEKKwkJKCBhbm5vdGF0aW9uRmllbGQgfCBTRU1JISApKgorCQlSQ1VSTFkhCisJCXsjYW5ub3RhdGlvbkJsb2NrID0gIyhbT0JKQkxPQ0ssICJPQkpCTE9DSyJdLCAjYW5ub3RhdGlvbkJsb2NrKTt9CisJOworCisvLyBUaGlzIGlzIHRoZSBib2R5IG9mIGFuIGVudW0uIFlvdSBjYW4gaGF2ZSB6ZXJvIG9yIG1vcmUgZW51bSBjb25zdGFudHMKKy8vIGZvbGxvd2VkIGJ5IGFueSBudW1iZXIgb2YgZmllbGRzIGxpa2UgYSByZWd1bGFyIGNsYXNzCitlbnVtQmxvY2sKKwk6CUxDVVJMWSEKKwkJCSggZW51bUNvbnN0YW50ICggb3B0aW9uc3tncmVlZHk9dHJ1ZTt9OiBDT01NQSEgZW51bUNvbnN0YW50ICkqICggQ09NTUEhICk/ICk/CisJCQkoIFNFTUkhICggY2xhc3NGaWVsZCB8IFNFTUkhICkqICk/CisJCVJDVVJMWSEKKwkJeyNlbnVtQmxvY2sgPSAjKFtPQkpCTE9DSywgIk9CSkJMT0NLIl0sICNlbnVtQmxvY2spO30KKwk7CisKKy8vIEFuIGFubm90YXRpb24gZmllbGQKK2Fubm90YXRpb25GaWVsZCEgIHtUb2tlbiBmaXJzdCA9IExUKDEpO30KKwk6CW1vZHM6bW9kaWZpZXJzCisJCSgJdGQ6dHlwZURlZmluaXRpb25JbnRlcm5hbFsjbW9kc10KKwkJCXsjYW5ub3RhdGlvbkZpZWxkID0gI3RkO30KKwkJfAl0OnR5cGVTcGVjW2ZhbHNlXQkJLy8gYW5ub3RhdGlvbiBmaWVsZAorCQkJKAlpOklERU5UCQkJCS8vIHRoZSBuYW1lIG9mIHRoZSBmaWVsZAorCisJCQkJTFBBUkVOISBSUEFSRU4hCisKKwkJCQlydDpkZWNsYXJhdG9yQnJhY2tldHNbI3RdCisKKwkJCQkoICJkZWZhdWx0IiBhbXZpOmFubm90YXRpb25NZW1iZXJWYWx1ZUluaXRpYWxpemVyICk/CisKKwkJCQlTRU1JCisKKwkJCQl7I2Fubm90YXRpb25GaWVsZCA9CisJCQkJCSMoY3JlYXRlKEFOTk9UQVRJT05fRklFTERfREVGLCJBTk5PVEFUSU9OX0ZJRUxEX0RFRiIsZmlyc3QsTFQoMSkpLAorCQkJCQkJIG1vZHMsCisJCQkJCQkgIyhjcmVhdGUoVFlQRSwiVFlQRSIsZmlyc3QsTFQoMSkpLHJ0KSwKKwkJCQkJCSBpLGFtdmkKKwkJCQkJCSApO30KKwkJCXwJdjp2YXJpYWJsZURlZmluaXRpb25zWyNtb2RzLCN0XSBTRU1JCS8vIHZhcmlhYmxlCisJCQkJeyNhbm5vdGF0aW9uRmllbGQgPSAjdjt9CisJCQkpCisJCSkKKwk7CisKKy8vQW4gZW51bSBjb25zdGFudCBtYXkgaGF2ZSBvcHRpb25hbCBwYXJhbWV0ZXJzIGFuZCBtYXkgaGF2ZSBhCisvL2EgY2xhc3MgYm9keQorZW51bUNvbnN0YW50IQorCToJYW46YW5ub3RhdGlvbnMKKwkJaTpJREVOVAorCQkoCUxQQVJFTiEKKwkJCWE6YXJnTGlzdAorCQkJUlBBUkVOIQorCQkpPworCQkoIGI6ZW51bUNvbnN0YW50QmxvY2sgKT8KKwkJeyNlbnVtQ29uc3RhbnQgPSAjKFtFTlVNX0NPTlNUQU5UX0RFRiwgIkVOVU1fQ09OU1RBTlRfREVGIl0sIGFuLCBpLCBhLCBiKTt9CisJOworCisvL1RoZSBjbGFzcy1saWtlIGJvZHkgb2YgYW4gZW51bSBjb25zdGFudAorZW51bUNvbnN0YW50QmxvY2sKKwk6CUxDVVJMWSEKKwkJKCBlbnVtQ29uc3RhbnRGaWVsZCB8IFNFTUkhICkqCisJCVJDVVJMWSEKKwkJeyNlbnVtQ29uc3RhbnRCbG9jayA9ICMoW09CSkJMT0NLLCAiT0JKQkxPQ0siXSwgI2VudW1Db25zdGFudEJsb2NrKTt9CisJOworCisvL0FuIGVudW0gY29uc3RhbnQgZmllbGQgaXMganVzdCBsaWtlIGEgY2xhc3MgZmllbGQgYnV0IHdpdGhvdXQKKy8vdGhlIHBvc2liaWxpdHkgb2YgYSBjb25zdHJ1Y3RvciBkZWZpbml0aW9uIG9yIGEgc3RhdGljIGluaXRpYWxpemVyCitlbnVtQ29uc3RhbnRGaWVsZCEge1Rva2VuIGZpcnN0ID0gTFQoMSk7fQorCToJbW9kczptb2RpZmllcnMKKwkJKAl0ZDp0eXBlRGVmaW5pdGlvbkludGVybmFsWyNtb2RzXQorCQkJeyNlbnVtQ29uc3RhbnRGaWVsZCA9ICN0ZDt9CisKKwkJfAkvLyBBIGdlbmVyaWMgbWV0aG9kIGhhcyB0aGUgdHlwZVBhcmFtZXRlcnMgYmVmb3JlIHRoZSByZXR1cm4gdHlwZS4KKwkJCS8vIFRoaXMgaXMgbm90IGFsbG93ZWQgZm9yIHZhcmlhYmxlIGRlZmluaXRpb25zLCBidXQgdGhpcyBwcm9kdWN0aW9uCisJCQkvLyBhbGxvd3MgaXQsIGEgc2VtYW50aWMgY2hlY2sgY291bGQgYmUgdXNlZCBpZiB5b3Ugd2FudGVkLgorCQkJKHRwOnR5cGVQYXJhbWV0ZXJzKT8gdDp0eXBlU3BlY1tmYWxzZV0JCS8vIG1ldGhvZCBvciB2YXJpYWJsZSBkZWNsYXJhdGlvbihzKQorCQkJKAlJREVOVAkJCQkJCQkJCS8vIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QKKworCQkJCS8vIHBhcnNlIHRoZSBmb3JtYWwgcGFyYW1ldGVyIGRlY2xhcmF0aW9ucy4KKwkJCQlMUEFSRU4hIHBhcmFtOnBhcmFtZXRlckRlY2xhcmF0aW9uTGlzdCBSUEFSRU4hCisKKwkJCQlydDpkZWNsYXJhdG9yQnJhY2tldHNbI3RdCisKKwkJCQkvLyBnZXQgdGhlIGxpc3Qgb2YgZXhjZXB0aW9ucyB0aGF0IHRoaXMgbWV0aG9kIGlzCisJCQkJLy8gZGVjbGFyZWQgdG8gdGhyb3cKKwkJCQkodGM6dGhyb3dzQ2xhdXNlKT8KKworCQkJCSggczI6Y29tcG91bmRTdGF0ZW1lbnQgfCBTRU1JICkKKwkJCQl7I2VudW1Db25zdGFudEZpZWxkID0gIyhjcmVhdGUoTUVUSE9EX0RFRiwiTUVUSE9EX0RFRiIsZmlyc3QsTFQoMSkpLAorCQkJCQkJCSBtb2RzLAorCQkJCQkJCSB0cCwKKwkJCQkJCQkgIyhjcmVhdGUoVFlQRSwiVFlQRSIsZmlyc3QsTFQoMSkpLHJ0KSwKKwkJCQkJCQkgSURFTlQsCisJCQkJCQkJIHBhcmFtLAorCQkJCQkJCSB0YywKKwkJCQkJCQkgczIpO30KKwkJCXwJdjp2YXJpYWJsZURlZmluaXRpb25zWyNtb2RzLCN0XSBTRU1JCisJCQkJeyNlbnVtQ29uc3RhbnRGaWVsZCA9ICN2O30KKwkJCSkKKwkJKQorCisJLy8gInsgLi4uIH0iIGluc3RhbmNlIGluaXRpYWxpemVyCisJfAlzNDpjb21wb3VuZFN0YXRlbWVudAorCQl7I2VudW1Db25zdGFudEZpZWxkID0gIyhjcmVhdGUoSU5TVEFOQ0VfSU5JVCwiSU5TVEFOQ0VfSU5JVCIsZmlyc3QsTFQoMSkpLCBzNCk7fQorCTsKKworLy8gQW4gaW50ZXJmYWNlIGNhbiBleHRlbmQgc2V2ZXJhbCBvdGhlciBpbnRlcmZhY2VzLi4uCitpbnRlcmZhY2VFeHRlbmRzICB7VG9rZW4gZmlyc3QgPSBMVCgxKTt9CisJOgkoCisJCWU6ImV4dGVuZHMiIQorCQljbGFzc09ySW50ZXJmYWNlVHlwZVtmYWxzZV0gKCBDT01NQSEgY2xhc3NPckludGVyZmFjZVR5cGVbZmFsc2VdICkqCisJCSk/CisJCXsjaW50ZXJmYWNlRXh0ZW5kcyA9ICMoY3JlYXRlKEVYVEVORFNfQ0xBVVNFLCJFWFRFTkRTX0NMQVVTRSIsZmlyc3QsTFQoMSkpLAorCQkJCQkJCQkjaW50ZXJmYWNlRXh0ZW5kcyk7fQorCTsKKworLy8gQSBjbGFzcyBjYW4gaW1wbGVtZW50IHNldmVyYWwgaW50ZXJmYWNlcy4uLgoraW1wbGVtZW50c0NsYXVzZSAge1Rva2VuIGZpcnN0ID0gTFQoMSk7fQorCToJKAorCQkJaToiaW1wbGVtZW50cyIhIGNsYXNzT3JJbnRlcmZhY2VUeXBlW2ZhbHNlXSAoIENPTU1BISBjbGFzc09ySW50ZXJmYWNlVHlwZVtmYWxzZV0gKSoKKwkJKT8KKwkJeyNpbXBsZW1lbnRzQ2xhdXNlID0gIyhjcmVhdGUoSU1QTEVNRU5UU19DTEFVU0UsIklNUExFTUVOVFNfQ0xBVVNFIixmaXJzdCxMVCgxKSksCisJCQkJCQkJCSAjaW1wbGVtZW50c0NsYXVzZSk7fQorCTsKKworLy8gTm93IHRoZSB2YXJpb3VzIHRoaW5ncyB0aGF0IGNhbiBiZSBkZWZpbmVkIGluc2lkZSBhIGNsYXNzCitjbGFzc0ZpZWxkISAgIHtUb2tlbiBmaXJzdCA9IExUKDEpO30KKwk6CS8vIG1ldGhvZCwgY29uc3RydWN0b3IsIG9yIHZhcmlhYmxlIGRlY2xhcmF0aW9uCisJCW1vZHM6bW9kaWZpZXJzCisJCSgJdGQ6dHlwZURlZmluaXRpb25JbnRlcm5hbFsjbW9kc10KKwkJCXsjY2xhc3NGaWVsZCA9ICN0ZDt9CisKKwkJfAkodHA6dHlwZVBhcmFtZXRlcnMpPworCQkJKAorCQkJCWg6Y3RvckhlYWQgczpjb25zdHJ1Y3RvckJvZHkgLy8gY29uc3RydWN0b3IKKwkJCQkvLyBqdXN0IHRyZWF0IENUT1JfREVGIGxpa2UgTUVUSE9EX0RFRiBmb3IgamF2YTJncm9vdnkKKwkJCQl7I2NsYXNzRmllbGQgPSAjKGNyZWF0ZShNRVRIT0RfREVGLCJNRVRIT0RfREVGIixmaXJzdCxMVCgxKSksIG1vZHMsIHRwLCBoLCBzKTt9CisKKwkJCQl8CS8vIEEgZ2VuZXJpYyBtZXRob2QvY3RvciBoYXMgdGhlIHR5cGVQYXJhbWV0ZXJzIGJlZm9yZSB0aGUgcmV0dXJuIHR5cGUuCisJCQkJCS8vIFRoaXMgaXMgbm90IGFsbG93ZWQgZm9yIHZhcmlhYmxlIGRlZmluaXRpb25zLCBidXQgdGhpcyBwcm9kdWN0aW9uCisJCQkJCS8vIGFsbG93cyBpdCwgYSBzZW1hbnRpYyBjaGVjayBjb3VsZCBiZSB1c2VkIGlmIHlvdSB3YW50ZWQuCisJCQkJCXQ6dHlwZVNwZWNbZmFsc2VdCQkvLyBtZXRob2Qgb3IgdmFyaWFibGUgZGVjbGFyYXRpb24ocykKKwkJCQkJKAlJREVOVAkJCQkvLyB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kCisKKwkJCQkJCS8vIHBhcnNlIHRoZSBmb3JtYWwgcGFyYW1ldGVyIGRlY2xhcmF0aW9ucy4KKwkJCQkJCUxQQVJFTiEgcGFyYW06cGFyYW1ldGVyRGVjbGFyYXRpb25MaXN0IFJQQVJFTiEKKworCQkJCQkJcnQ6ZGVjbGFyYXRvckJyYWNrZXRzWyN0XQorCisJCQkJCQkvLyBnZXQgdGhlIGxpc3Qgb2YgZXhjZXB0aW9ucyB0aGF0IHRoaXMgbWV0aG9kIGlzCisJCQkJCQkvLyBkZWNsYXJlZCB0byB0aHJvdworCQkJCQkJKHRjOnRocm93c0NsYXVzZSk/CisKKwkJCQkJCSggczI6Y29tcG91bmRTdGF0ZW1lbnQgfCBTRU1JICkKKwkJCQkJCXsjY2xhc3NGaWVsZCA9ICMoY3JlYXRlKE1FVEhPRF9ERUYsIk1FVEhPRF9ERUYiLGZpcnN0LExUKDEpKSwKKwkJCQkJCQkJCSBtb2RzLAorCQkJCQkJCQkJIHRwLAorCQkJCQkJCQkJICMoY3JlYXRlKFRZUEUsIlRZUEUiLGZpcnN0LExUKDEpKSxydCksCisJCQkJCQkJCQkgSURFTlQsCisJCQkJCQkJCQkgcGFyYW0sCisJCQkJCQkJCQkgdGMsCisJCQkJCQkJCQkgczIpO30KKwkJCQkJfAl2OnZhcmlhYmxlRGVmaW5pdGlvbnNbI21vZHMsI3RdIFNFTUkKKwkJCQkJCXsjY2xhc3NGaWVsZCA9ICN2O30KKwkJCQkJKQorCQkJKQorCQkpCisKKwkvLyAic3RhdGljIHsgLi4uIH0iIGNsYXNzIGluaXRpYWxpemVyCisJfAkic3RhdGljIiBzMzpjb21wb3VuZFN0YXRlbWVudAorCQl7I2NsYXNzRmllbGQgPSAjKGNyZWF0ZShTVEFUSUNfSU5JVCwiU1RBVElDX0lOSVQiLGZpcnN0LExUKDEpKSwgczMpO30KKworCS8vICJ7IC4uLiB9IiBpbnN0YW5jZSBpbml0aWFsaXplcgorCXwJczQ6Y29tcG91bmRTdGF0ZW1lbnQKKwkJeyNjbGFzc0ZpZWxkID0gIyhjcmVhdGUoSU5TVEFOQ0VfSU5JVCwiSU5TVEFOQ0VfSU5JVCIsZmlyc3QsTFQoMSkpLCBzNCk7fQorCTsKKworLy8gTm93IHRoZSB2YXJpb3VzIHRoaW5ncyB0aGF0IGNhbiBiZSBkZWZpbmVkIGluc2lkZSBhIGludGVyZmFjZQoraW50ZXJmYWNlRmllbGQhICAgIHtUb2tlbiBmaXJzdCA9IExUKDEpO30KKwk6CS8vIG1ldGhvZCwgY29uc3RydWN0b3IsIG9yIHZhcmlhYmxlIGRlY2xhcmF0aW9uCisJCW1vZHM6bW9kaWZpZXJzCisJCSgJdGQ6dHlwZURlZmluaXRpb25JbnRlcm5hbFsjbW9kc10KKwkJCXsjaW50ZXJmYWNlRmllbGQgPSAjdGQ7fQorCisJCXwJKHRwOnR5cGVQYXJhbWV0ZXJzKT8KKwkJCS8vIEEgZ2VuZXJpYyBtZXRob2QgaGFzIHRoZSB0eXBlUGFyYW1ldGVycyBiZWZvcmUgdGhlIHJldHVybiB0eXBlLgorCQkJLy8gVGhpcyBpcyBub3QgYWxsb3dlZCBmb3IgdmFyaWFibGUgZGVmaW5pdGlvbnMsIGJ1dCB0aGlzIHByb2R1Y3Rpb24KKwkJCS8vIGFsbG93cyBpdCwgYSBzZW1hbnRpYyBjaGVjayBjb3VsZCBiZSB1c2VkIGlmIHlvdSB3YW50IGEgbW9yZSBzdHJpY3QKKwkJCS8vIGdyYW1tYXIuCisJCQl0OnR5cGVTcGVjW2ZhbHNlXQkJLy8gbWV0aG9kIG9yIHZhcmlhYmxlIGRlY2xhcmF0aW9uKHMpCisJCQkoCUlERU5UCQkJCS8vIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QKKworCQkJCS8vIHBhcnNlIHRoZSBmb3JtYWwgcGFyYW1ldGVyIGRlY2xhcmF0aW9ucy4KKwkJCQlMUEFSRU4hIHBhcmFtOnBhcmFtZXRlckRlY2xhcmF0aW9uTGlzdCBSUEFSRU4hCisKKwkJCQlydDpkZWNsYXJhdG9yQnJhY2tldHNbI3RdCisKKwkJCQkvLyBnZXQgdGhlIGxpc3Qgb2YgZXhjZXB0aW9ucyB0aGF0IHRoaXMgbWV0aG9kIGlzCisJCQkJLy8gZGVjbGFyZWQgdG8gdGhyb3cKKwkJCQkodGM6dGhyb3dzQ2xhdXNlKT8KKworCQkJCVNFTUkKKwkJCQkKKwkJCQl7I2ludGVyZmFjZUZpZWxkID0gIyhjcmVhdGUoTUVUSE9EX0RFRiwiTUVUSE9EX0RFRiIsZmlyc3QsTFQoMSkpLAorCQkJCQkJCSBtb2RzLAorCQkJCQkJCSB0cCwKKwkJCQkJCQkgIyhjcmVhdGUoVFlQRSwiVFlQRSIsZmlyc3QsTFQoMSkpLHJ0KSwKKwkJCQkJCQkgSURFTlQsCisJCQkJCQkJIHBhcmFtLAorCQkJCQkJCSB0Yyk7fQorCQkJfAl2OnZhcmlhYmxlRGVmaW5pdGlvbnNbI21vZHMsI3RdIFNFTUkKKwkJCQl7I2ludGVyZmFjZUZpZWxkID0gI3Y7fQorCQkJKQorCQkpCisJOworCitjb25zdHJ1Y3RvckJvZHkKKwk6CWxjOkxDVVJMWV4geyNsYy5zZXRUeXBlKFNMSVNUKTt9CisJCQkoIG9wdGlvbnMgeyBncmVlZHk9dHJ1ZTsgfSA6IGV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKT8KKwkJCShzdGF0ZW1lbnQpKgorCQlSQ1VSTFkhCisJOworCisvKiogQ2F0Y2ggb2J2aW91cyBjb25zdHJ1Y3RvciBjYWxscywgYnV0IG5vdCB0aGUgZXhwci5zdXBlciguLi4pIGNhbGxzICovCitleHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbgorCToJKHR5cGVBcmd1bWVudHMpPworCQkoCSJ0aGlzIiEgbHAxOkxQQVJFTl4gYXJnTGlzdCBSUEFSRU4hIFNFTUkhCisJCQl7I2xwMS5zZXRUeXBlKENUT1JfQ0FMTCk7fQorCQl8CSJzdXBlciIhIGxwMjpMUEFSRU5eIGFyZ0xpc3QgUlBBUkVOISBTRU1JIQorCQkJeyNscDIuc2V0VHlwZShTVVBFUl9DVE9SX0NBTEwpO30KKwkJKQorCTsKKwordmFyaWFibGVEZWZpbml0aW9uc1tBU1QgbW9kcywgQVNUIHRdCisJOgl2YXJpYWJsZURlY2xhcmF0b3JbZ2V0QVNURmFjdG9yeSgpLmR1cFRyZWUobW9kcyksCisJCQkJCQkJZ2V0QVNURmFjdG9yeSgpLmR1cFRyZWUodCldCisJCSgJQ09NTUEhCisJCQl2YXJpYWJsZURlY2xhcmF0b3JbZ2V0QVNURmFjdG9yeSgpLmR1cFRyZWUobW9kcyksCisJCQkJCQkJZ2V0QVNURmFjdG9yeSgpLmR1cFRyZWUodCldCisJCSkqCisJOworCisvKiogRGVjbGFyYXRpb24gb2YgYSB2YXJpYWJsZS4gVGhpcyBjYW4gYmUgYSBjbGFzcy9pbnN0YW5jZSB2YXJpYWJsZSwKKyAqICBvciBhIGxvY2FsIHZhcmlhYmxlIGluIGEgbWV0aG9kCisgKiAgSXQgY2FuIGFsc28gaW5jbHVkZSBwb3NzaWJsZSBpbml0aWFsaXphdGlvbi4KKyAqLwordmFyaWFibGVEZWNsYXJhdG9yIVtBU1QgbW9kcywgQVNUIHRdIHsgVG9rZW4gZmlyc3QgPSBMVCgxKTt9CisJOglpZDpJREVOVCBkOmRlY2xhcmF0b3JCcmFja2V0c1t0XSB2OnZhckluaXRpYWxpemVyCisJCXsjdmFyaWFibGVEZWNsYXJhdG9yID0gIyhjcmVhdGUoVkFSSUFCTEVfREVGLCJWQVJJQUJMRV9ERUYiLGZpcnN0LExUKDEpKSwgbW9kcywgIyhjcmVhdGUoVFlQRSwiVFlQRSIsZmlyc3QsTFQoMSkpLGQpLCBpZCwgdik7fQorCTsKKworZGVjbGFyYXRvckJyYWNrZXRzW0FTVCB0eXBdCisJOgl7I2RlY2xhcmF0b3JCcmFja2V0cz10eXA7fQorCQkobGI6TEJSQUNLXiB7I2xiLnNldFR5cGUoQVJSQVlfREVDTEFSQVRPUik7fSBSQlJBQ0shKSoKKwk7CisKK3ZhckluaXRpYWxpemVyCisJOgkoIEFTU0lHTl4gaW5pdGlhbGl6ZXIgKT8KKwk7CisKKy8vIFRoaXMgaXMgYW4gaW5pdGlhbGl6ZXIgdXNlZCB0byBzZXQgdXAgYW4gYXJyYXkuCithcnJheUluaXRpYWxpemVyCisJOglsYzpMQ1VSTFleIHsjbGMuc2V0VHlwZShBUlJBWV9JTklUKTt9CisJCQkoCWluaXRpYWxpemVyCisJCQkJKAorCQkJCQkvLyBDT05GTElDVDogZG9lcyBhIENPTU1BIGFmdGVyIGFuIGluaXRpYWxpemVyIHN0YXJ0IGEgbmV3CisJCQkJCS8vIGluaXRpYWxpemVyIG9yIHN0YXJ0IHRoZSBvcHRpb24gJywnIGF0IGVuZD8KKwkJCQkJLy8gQU5UTFIgZ2VuZXJhdGVzIHByb3BlciBjb2RlIGJ5IG1hdGNoaW5nCisJCQkJCS8vIHRoZSBjb21tYSBhcyBzb29uIGFzIHBvc3NpYmxlLgorCQkJCQlvcHRpb25zIHsKKwkJCQkJCXdhcm5XaGVuRm9sbG93QW1iaWcgPSBmYWxzZTsKKwkJCQkJfQorCQkJCToKKwkJCQkJQ09NTUEhIGluaXRpYWxpemVyCisJCQkJKSoKKwkJCQkoQ09NTUEhKT8KKwkJCSk/CisJCVJDVVJMWSEKKwk7CisKKy8vIFRoZSB0d28gInRoaW5ncyIgdGhhdCBjYW4gaW5pdGlhbGl6ZSBhbiBhcnJheSBlbGVtZW50IGFyZSBhbiBleHByZXNzaW9uCisvLyBhbmQgYW5vdGhlciAobmVzdGVkKSBhcnJheSBpbml0aWFsaXplci4KK2luaXRpYWxpemVyCisJOglleHByZXNzaW9uCisJfAlhcnJheUluaXRpYWxpemVyCisJOworCisvLyBUaGlzIGlzIHRoZSBoZWFkZXIgb2YgYSBtZXRob2QuIEl0IGluY2x1ZGVzIHRoZSBuYW1lIGFuZCBwYXJhbWV0ZXJzCisvLyBmb3IgdGhlIG1ldGhvZC4KKy8vIFRoaXMgYWxzbyB3YXRjaGVzIGZvciBhIGxpc3Qgb2YgZXhjZXB0aW9uIGNsYXNzZXMgaW4gYSAidGhyb3dzIiBjbGF1c2UuCitjdG9ySGVhZAorCToJSURFTlQgLy8gdGhlIG5hbWUgb2YgdGhlIG1ldGhvZAorCisJCS8vIHBhcnNlIHRoZSBmb3JtYWwgcGFyYW1ldGVyIGRlY2xhcmF0aW9ucy4KKwkJTFBBUkVOISBwYXJhbWV0ZXJEZWNsYXJhdGlvbkxpc3QgUlBBUkVOIQorCisJCS8vIGdldCB0aGUgbGlzdCBvZiBleGNlcHRpb25zIHRoYXQgdGhpcyBtZXRob2QgaXMgZGVjbGFyZWQgdG8gdGhyb3cKKwkJKHRocm93c0NsYXVzZSk/CisJOworCisvLyBUaGlzIGlzIGEgbGlzdCBvZiBleGNlcHRpb24gY2xhc3NlcyB0aGF0IHRoZSBtZXRob2QgaXMgZGVjbGFyZWQgdG8gdGhyb3cKK3Rocm93c0NsYXVzZQorCToJInRocm93cyJeIGlkZW50aWZpZXIgKCBDT01NQSEgaWRlbnRpZmllciApKgorCTsKKworLy8gQSBsaXN0IG9mIGZvcm1hbCBwYXJhbWV0ZXJzCisvLwkgWmVybyBvciBtb3JlIHBhcmFtZXRlcnMKKy8vCSBJZiBhIHBhcmFtZXRlciBpcyB2YXJpYWJsZSBsZW5ndGggKGUuZy4gU3RyaW5nLi4uIG15QXJnKSBpdCBpcyB0aGUgcmlnaHQtbW9zdCBwYXJhbWV0ZXIKK3BhcmFtZXRlckRlY2xhcmF0aW9uTGlzdCB7VG9rZW4gZmlyc3QgPSBMVCgxKTt9CisJLy8gVGhlIHNlbWFudGljIGNoZWNrIGluICggLi4uLiApKiBibG9jayBpcyBmbGFnZ2VkIGFzIHN1cGVyZmx1b3VzLCBhbmQgc2VlbXMgc3VwZXJmbHVvdXMgYnV0CisJLy8gaXMgdGhlIG9ubHkgd2F5IEkgY291bGQgbWFrZSB0aGlzIHdvcmsuIElmIG15IHVuZGVyc3RhbmRpbmcgaXMgY29ycmVjdCB0aGlzIGlzIGEga25vd24gYnVnCisJOgkoCSggcGFyYW1ldGVyRGVjbGFyYXRpb24gKT0+IHBhcmFtZXRlckRlY2xhcmF0aW9uCisJCQkoIG9wdGlvbnMge3dhcm5XaGVuRm9sbG93QW1iaWc9ZmFsc2U7fSA6ICggQ09NTUEhIHBhcmFtZXRlckRlY2xhcmF0aW9uICkgPT4gQ09NTUEhIHBhcmFtZXRlckRlY2xhcmF0aW9uICkqCisJCQkoIENPTU1BISB2YXJpYWJsZUxlbmd0aFBhcmFtZXRlckRlY2xhcmF0aW9uICk/CisJCXwKKwkJCXZhcmlhYmxlTGVuZ3RoUGFyYW1ldGVyRGVjbGFyYXRpb24KKwkJKT8KKwkJeyNwYXJhbWV0ZXJEZWNsYXJhdGlvbkxpc3QgPSAjKGNyZWF0ZShQQVJBTUVURVJTLCJQQVJBTUVURVJTIixmaXJzdCxMVCgxKSksCisgICAgICAgICAgICAgICAgCQkJCQkJI3BhcmFtZXRlckRlY2xhcmF0aW9uTGlzdCk7fQorCTsKKworLy8gQSBmb3JtYWwgcGFyYW1ldGVyLgorcGFyYW1ldGVyRGVjbGFyYXRpb24hIHtUb2tlbiBmaXJzdCA9IExUKDEpO30KKwk6CXBtOnBhcmFtZXRlck1vZGlmaWVyIHQ6dHlwZVNwZWNbZmFsc2VdIGlkOklERU5UCisJCXBkOmRlY2xhcmF0b3JCcmFja2V0c1sjdF0KKwkJeyNwYXJhbWV0ZXJEZWNsYXJhdGlvbiA9ICMoY3JlYXRlKFBBUkFNRVRFUl9ERUYsIlBBUkFNRVRFUl9ERUYiLGZpcnN0LExUKDEpKSwKKwkJCQkJCQkJCXBtLCAjKGNyZWF0ZShUWVBFLCJUWVBFIixmaXJzdCxMVCgxKSkscGQpLCBpZCk7fQorCTsKKwordmFyaWFibGVMZW5ndGhQYXJhbWV0ZXJEZWNsYXJhdGlvbiEgIHtUb2tlbiBmaXJzdCA9IExUKDEpO30KKwk6CXBtOnBhcmFtZXRlck1vZGlmaWVyIHQ6dHlwZVNwZWNbZmFsc2VdIFRSSVBMRV9ET1QhIGlkOklERU5UCisJCXBkOmRlY2xhcmF0b3JCcmFja2V0c1sjdF0KKwkJeyN2YXJpYWJsZUxlbmd0aFBhcmFtZXRlckRlY2xhcmF0aW9uID0gIyhjcmVhdGUoVkFSSUFCTEVfUEFSQU1FVEVSX0RFRiwiVkFSSUFCTEVfUEFSQU1FVEVSX0RFRiIsZmlyc3QsTFQoMSkpLAorCQkJCQkJCQkJCQkJcG0sICMoY3JlYXRlKFRZUEUsIlRZUEUiLGZpcnN0LExUKDEpKSxwZCksIGlkKTt9CisJOworCitwYXJhbWV0ZXJNb2RpZmllciAge1Rva2VuIGZpcnN0ID0gTFQoMSk7fQorCS8vZmluYWwgY2FuIGFwcGVhciBhbW9uZ3N0IGFubm90YXRpb25zIGluIGFueSBvcmRlciAtIGdyZWVkaWx5IGNvbnN1bWUgYW55IHByZWNlZGluZworCS8vYW5ub3RhdGlvbnMgdG8gc2h1dCBub25kLWV0ZXJtaW5pc20gd2FybmluZ3Mgb2ZmCisJOgkob3B0aW9uc3tncmVlZHk9dHJ1ZTt9IDogYW5ub3RhdGlvbikqIChmOiJmaW5hbCIpPyAoYW5ub3RhdGlvbikqCisJCXsjcGFyYW1ldGVyTW9kaWZpZXIgPSAjKGNyZWF0ZShNT0RJRklFUlMsIk1PRElGSUVSUyIsZmlyc3QsTFQoMSkpLCAjcGFyYW1ldGVyTW9kaWZpZXIpO30KKwk7CisKKy8vIENvbXBvdW5kIHN0YXRlbWVudC4gVGhpcyBpcyB1c2VkIGluIG1hbnkgY29udGV4dHM6CisvLyBJbnNpZGUgYSBjbGFzcyBkZWZpbml0aW9uIHByZWZpeGVkIHdpdGggInN0YXRpYyI6CisvLyBpdCBpcyBhIGNsYXNzIGluaXRpYWxpemVyCisvLyBJbnNpZGUgYSBjbGFzcyBkZWZpbml0aW9uIHdpdGhvdXQgInN0YXRpYyI6CisvLyBpdCBpcyBhbiBpbnN0YW5jZSBpbml0aWFsaXplcgorLy8gQXMgdGhlIGJvZHkgb2YgYSBtZXRob2QKKy8vIEFzIGEgY29tcGxldGVseSBpbmRlcGRlbnQgYnJhY2VkIGJsb2NrIG9mIGNvZGUgaW5zaWRlIGEgbWV0aG9kCisvLyBpdCBzdGFydHMgYSBuZXcgc2NvcGUgZm9yIHZhcmlhYmxlIGRlZmluaXRpb25zCisKK2NvbXBvdW5kU3RhdGVtZW50CisJOglsYzpMQ1VSTFleIHsjbGMuc2V0VHlwZShTTElTVCk7fQorCQkJLy8gaW5jbHVkZSB0aGUgKHBvc3NpYmx5LWVtcHR5KSBsaXN0IG9mIHN0YXRlbWVudHMKKwkJCShzdGF0ZW1lbnQpKgorCQlSQ1VSTFkhCisJOworCisKK3N0YXRlbWVudAorCS8vIEEgbGlzdCBvZiBzdGF0ZW1lbnRzIGluIGN1cmx5IGJyYWNlcyAtLSBzdGFydCBhIG5ldyBzY29wZSEKKwk6CWNvbXBvdW5kU3RhdGVtZW50CisKKwkvLyBkZWNsYXJhdGlvbnMgYXJlIGFtYmlndW91cyB3aXRoICJJRCBET1QiIHJlbGF0aXZlIHRvIGV4cHJlc3Npb24KKwkvLyBzdGF0ZW1lbnRzLiBNdXN0IGJhY2t0cmFjayB0byBiZSBzdXJlLiBDb3VsZCB1c2UgYSBzZW1hbnRpYworCS8vIHByZWRpY2F0ZSB0byB0ZXN0IHN5bWJvbCB0YWJsZSB0byBzZWUgd2hhdCB0aGUgdHlwZSB3YXMgY29taW5nCisJLy8gdXAsIGJ1dCB0aGF0J3MgcHJldHR5IGhhcmQgd2l0aG91dCBhIHN5bWJvbCB0YWJsZSA7KQorCXwJKGRlY2xhcmF0aW9uKT0+IGRlY2xhcmF0aW9uIFNFTUkhCisKKwkvLyBBbiBleHByZXNzaW9uIHN0YXRlbWVudC4gVGhpcyBjb3VsZCBiZSBhIG1ldGhvZCBjYWxsLAorCS8vIGFzc2lnbm1lbnQgc3RhdGVtZW50LCBvciBhbnkgb3RoZXIgZXhwcmVzc2lvbiBldmFsdWF0ZWQgZm9yCisJLy8gc2lkZS1lZmZlY3RzLgorCXwJZXhwcmVzc2lvbiBTRU1JIQorCisJLy9UT0RPOiB3aGF0IGFib3VyIGludGVyZmFjZXMsIGVudW1zIGFuZCBhbm5vdGF0aW9ucworCS8vIGNsYXNzIGRlZmluaXRpb24KKwl8CW06bW9kaWZpZXJzISBjbGFzc0RlZmluaXRpb25bI21dCisKKwkvLyBBdHRhY2ggYSBsYWJlbCB0byB0aGUgZnJvbnQgb2YgYSBzdGF0ZW1lbnQKKwl8CUlERU5UIGM6Q09MT05eIHsjYy5zZXRUeXBlKExBQkVMRURfU1RBVCk7fSBzdGF0ZW1lbnQKKworCS8vIElmLWVsc2Ugc3RhdGVtZW50CisJfAkiaWYiXiBMUEFSRU4hIGV4cHJlc3Npb24gUlBBUkVOISBzdGF0ZW1lbnQKKwkJKAorCQkJLy8gQ09ORkxJQ1Q6IHRoZSBvbGQgImRhbmdsaW5nLWVsc2UiIHByb2JsZW0uLi4KKwkJCS8vIEFOVExSIGdlbmVyYXRlcyBwcm9wZXIgY29kZSBtYXRjaGluZworCQkJLy8gYXMgc29vbiBhcyBwb3NzaWJsZS4gSHVzaCB3YXJuaW5nLgorCQkJb3B0aW9ucyB7CisJCQkJd2FybldoZW5Gb2xsb3dBbWJpZyA9IGZhbHNlOworCQkJfQorCQk6CisJCQkiZWxzZSIhIHN0YXRlbWVudAorCQkpPworCisJLy8gRm9yIHN0YXRlbWVudAorCXwJZm9yU3RhdGVtZW50CisKKwkvLyBXaGlsZSBzdGF0ZW1lbnQKKwl8CSJ3aGlsZSJeIExQQVJFTiEgZXhwcmVzc2lvbiBSUEFSRU4hIHN0YXRlbWVudAorCisJLy8gZG8td2hpbGUgc3RhdGVtZW50CisJfAkiZG8iXiBzdGF0ZW1lbnQgIndoaWxlIiEgTFBBUkVOISBleHByZXNzaW9uIFJQQVJFTiEgU0VNSSEKKworCS8vIGdldCBvdXQgb2YgYSBsb29wIChvciBzd2l0Y2gpCisJfAkiYnJlYWsiXiAoSURFTlQpPyBTRU1JIQorCisJLy8gZG8gbmV4dCBpdGVyYXRpb24gb2YgYSBsb29wCisJfAkiY29udGludWUiXiAoSURFTlQpPyBTRU1JIQorCisJLy8gUmV0dXJuIGFuIGV4cHJlc3Npb24KKwl8CSJyZXR1cm4iXiAoZXhwcmVzc2lvbik/IFNFTUkhCisKKwkvLyBzd2l0Y2gvY2FzZSBzdGF0ZW1lbnQKKwl8CSJzd2l0Y2giXiBMUEFSRU4hIGV4cHJlc3Npb24gUlBBUkVOISBMQ1VSTFkhCisJCQkoIGNhc2VzR3JvdXAgKSoKKwkJUkNVUkxZIQorCisJLy8gZXhjZXB0aW9uIHRyeS1jYXRjaCBibG9jaworCXwJdHJ5QmxvY2sKKworCS8vIHRocm93IGFuIGV4Y2VwdGlvbgorCXwJInRocm93Il4gZXhwcmVzc2lvbiBTRU1JIQorCisJLy8gc3luY2hyb25pemUgYSBzdGF0ZW1lbnQKKwl8CSJzeW5jaHJvbml6ZWQiXiBMUEFSRU4hIGV4cHJlc3Npb24gUlBBUkVOISBjb21wb3VuZFN0YXRlbWVudAorCisJLy8gYXNzZXJ0cyAodW5jb21tZW50IGlmIHlvdSB3YW50IDEuNCBjb21wYXRpYmlsaXR5KQorCXwJImFzc2VydCJeIGV4cHJlc3Npb24gKCBDT0xPTiEgZXhwcmVzc2lvbiApPyBTRU1JIQorCisJLy8gZW1wdHkgc3RhdGVtZW50CisJfAlzOlNFTUkgeyNzLnNldFR5cGUoRU1QVFlfU1RBVCk7fQorCTsKKworZm9yU3RhdGVtZW50CisJOglmOiJmb3IiXgorCQlMUEFSRU4hCisJCQkoCShmb3JJbml0IFNFTUkpPT50cmFkaXRpb25hbEZvckNsYXVzZQorCQkJfAlmb3JFYWNoQ2xhdXNlCisJCQkpCisJCVJQQVJFTiEKKwkJc3RhdGVtZW50CQkJCQkgLy8gc3RhdGVtZW50IHRvIGxvb3Agb3ZlcgorCTsKKwordHJhZGl0aW9uYWxGb3JDbGF1c2UKKwk6CisJCWZvckluaXQgU0VNSSEJLy8gaW5pdGlhbGl6ZXIKKwkJZm9yQ29uZCBTRU1JIQkvLyBjb25kaXRpb24gdGVzdAorCQlmb3JJdGVyCQkJLy8gdXBkYXRlcgorCTsKKworZm9yRWFjaENsYXVzZSAge1Rva2VuIGZpcnN0ID0gTFQoMSk7fQorCToKKwkJcDpwYXJhbWV0ZXJEZWNsYXJhdGlvbiBDT0xPTiEgZXhwcmVzc2lvbgorCQl7I2ZvckVhY2hDbGF1c2UgPSAjKGNyZWF0ZShGT1JfRUFDSF9DTEFVU0UsIkZPUl9FQUNIX0NMQVVTRSIsZmlyc3QsTFQoMSkpLCAjZm9yRWFjaENsYXVzZSk7fQorCTsKKworY2FzZXNHcm91cAorCToJKAkvLyBDT05GTElDVDogdG8gd2hpY2ggY2FzZSBncm91cCBkbyB0aGUgc3RhdGVtZW50cyBiaW5kPworCQkJLy8gQU5UTFIgZ2VuZXJhdGVzIHByb3BlciBjb2RlOiBpdCBncm91cHMgdGhlCisJCQkvLyBtYW55ICJjYXNlIi8iZGVmYXVsdCIgbGFiZWxzIHRvZ2V0aGVyIHRoZW4KKwkJCS8vIGZvbGxvd3MgdGhlbSB3aXRoIHRoZSBzdGF0ZW1lbnRzCisJCQlvcHRpb25zIHsKKwkJCQlncmVlZHkgPSB0cnVlOworCQkJfQorCQkJOgorCQkJYUNhc2UKKwkJKSsKKwkJY2FzZVNMaXN0CisJCXsjY2FzZXNHcm91cCA9ICMoW0NBU0VfR1JPVVAsICJDQVNFX0dST1VQIl0sICNjYXNlc0dyb3VwKTt9CisJOworCithQ2FzZQorCToJKCJjYXNlIl4gZXhwcmVzc2lvbiB8ICJkZWZhdWx0IikgQ09MT04hCisJOworCitjYXNlU0xpc3QgIHtUb2tlbiBmaXJzdCA9IExUKDEpO30KKwk6CShzdGF0ZW1lbnQpKgorCQl7I2Nhc2VTTGlzdCA9ICMoY3JlYXRlKFNMSVNULCJTTElTVCIsZmlyc3QsTFQoMSkpLCNjYXNlU0xpc3QpO30KKwk7CisKKy8vIFRoZSBpbml0aWFsaXplciBmb3IgYSBmb3IgbG9vcAorZm9ySW5pdCAge1Rva2VuIGZpcnN0ID0gTFQoMSk7fQorCQkvLyBpZiBpdCBsb29rcyBsaWtlIGEgZGVjbGFyYXRpb24sIGl0IGlzCisJOgkoKGRlY2xhcmF0aW9uKT0+IGRlY2xhcmF0aW9uCisJCS8vIG90aGVyd2lzZSBpdCBjb3VsZCBiZSBhbiBleHByZXNzaW9uIGxpc3QuLi4KKwkJfAlleHByZXNzaW9uTGlzdAorCQkpPworCQl7I2ZvckluaXQgPSAjKGNyZWF0ZShGT1JfSU5JVCwiRk9SX0lOSVQiLGZpcnN0LExUKDEpKSwjZm9ySW5pdCk7fQorCTsKKworZm9yQ29uZCAge1Rva2VuIGZpcnN0ID0gTFQoMSk7fQorCToJKGV4cHJlc3Npb24pPworCQl7I2ZvckNvbmQgPSAjKGNyZWF0ZShGT1JfQ09ORElUSU9OLCJGT1JfQ09ORElUSU9OIixmaXJzdCxMVCgxKSksI2ZvckNvbmQpO30KKwk7CisKK2Zvckl0ZXIgIHtUb2tlbiBmaXJzdCA9IExUKDEpO30KKwk6CShleHByZXNzaW9uTGlzdCk/CisJCXsjZm9ySXRlciA9ICMoY3JlYXRlKEZPUl9JVEVSQVRPUiwiRk9SX0lURVJBVE9SIixmaXJzdCxMVCgxKSksI2Zvckl0ZXIpO30KKwk7CisKKy8vIGFuIGV4Y2VwdGlvbiBoYW5kbGVyIHRyeS9jYXRjaCBibG9jawordHJ5QmxvY2sKKwk6CSJ0cnkiXiBjb21wb3VuZFN0YXRlbWVudAorCQkoaGFuZGxlcikqCisJCSggZmluYWxseUNsYXVzZSApPworCTsKKworZmluYWxseUNsYXVzZQorCToJImZpbmFsbHkiXiBjb21wb3VuZFN0YXRlbWVudAorCTsKKworLy8gYW4gZXhjZXB0aW9uIGhhbmRsZXIKK2hhbmRsZXIKKwk6CSJjYXRjaCJeIExQQVJFTiEgcGFyYW1ldGVyRGVjbGFyYXRpb24gUlBBUkVOISBjb21wb3VuZFN0YXRlbWVudAorCTsKKworCisvLyBleHByZXNzaW9ucworLy8gTm90ZSB0aGF0IG1vc3Qgb2YgdGhlc2UgZXhwcmVzc2lvbnMgZm9sbG93IHRoZSBwYXR0ZXJuCisvLyAgIHRoaXNMZXZlbEV4cHJlc3Npb24gOgorLy8JICAgbmV4dEhpZ2hlclByZWNlZGVuY2VFeHByZXNzaW9uCisvLwkJICAgKE9QRVJBVE9SIG5leHRIaWdoZXJQcmVjZWRlbmNlRXhwcmVzc2lvbikqCisvLyB3aGljaCBpcyBhIHN0YW5kYXJkIHJlY3Vyc2l2ZSBkZWZpbml0aW9uIGZvciBhIHBhcnNpbmcgYW4gZXhwcmVzc2lvbi4KKy8vIFRoZSBvcGVyYXRvcnMgaW4gamF2YSBoYXZlIHRoZSBmb2xsb3dpbmcgcHJlY2VkZW5jZXM6CisvLwlsb3dlc3QgICgxMykgID0gKj0gLz0gJT0gKz0gLT0gPDw9ID4+PSA+Pj49ICY9IF49IHw9CisvLwkJCSgxMikgID86CisvLwkJCSgxMSkgIHx8CisvLwkJCSgxMCkgICYmCisvLwkJCSggOSkgIHwKKy8vCQkJKCA4KSAgXgorLy8JCQkoIDcpICAmCisvLwkJCSggNikgID09ICE9CisvLwkJCSggNSkgIDwgPD0gPiA+PQorLy8JCQkoIDQpICA8PCA+PgorLy8JCQkoIDMpICArKGJpbmFyeSkgLShiaW5hcnkpCisvLwkJCSggMikgICogLyAlCisvLwkJCSggMSkgICsrIC0tICsodW5hcnkpIC0odW5hcnkpICB+ICAhICAodHlwZSkKKy8vCQkJCSAgW10gICAoKSAobWV0aG9kIGNhbGwpICAuIChkb3QgLS0gaWRlbnRpZmllciBxdWFsaWZpY2F0aW9uKQorLy8JCQkJICBuZXcgICAoKSAgKGV4cGxpY2l0IHBhcmVudGhlc2lzKQorLy8KKy8vIHRoZSBsYXN0IHR3byBhcmUgbm90IHVzdWFsbHkgb24gYSBwcmVjZWRlbmNlIGNoYXJ0OyBJIHB1dCB0aGVtIGluCisvLyB0byBwb2ludCBvdXQgdGhhdCBuZXcgaGFzIGEgaGlnaGVyIHByZWNlZGVuY2UgdGhhbiAnLicsIHNvIHlvdQorLy8gY2FuIHZhbGlkeSB1c2UKKy8vCSBuZXcgRnJhbWUoKS5zaG93KCkKKy8vCisvLyBOb3RlIHRoYXQgdGhlIGFib3ZlIHByZWNlZGVuY2UgbGV2ZWxzIG1hcCB0byB0aGUgcnVsZXMgYmVsb3cuLi4KKy8vIE9uY2UgeW91IGhhdmUgYSBwcmVjZWRlbmNlIGNoYXJ0LCB3cml0aW5nIHRoZSBhcHByb3ByaWF0ZSBydWxlcyBhcyBiZWxvdworLy8gICBpcyB1c3VhbGx5IHZlcnkgc3RyYWlnaHRmb3dhcmQKKworCisKKy8vIHRoZSBtb3RoZXIgb2YgYWxsIGV4cHJlc3Npb25zCitleHByZXNzaW9uICB7VG9rZW4gZmlyc3QgPSBMVCgxKTt9CisJOglhc3NpZ25tZW50RXhwcmVzc2lvbgorCQl7I2V4cHJlc3Npb24gPSAjKGNyZWF0ZShFWFBSLCJFWFBSIixmaXJzdCxMVCgxKSksI2V4cHJlc3Npb24pO30KKwk7CisKKworLy8gVGhpcyBpcyBhIGxpc3Qgb2YgZXhwcmVzc2lvbnMuCitleHByZXNzaW9uTGlzdCAge1Rva2VuIGZpcnN0ID0gTFQoMSk7fQorCToJZXhwcmVzc2lvbiAoQ09NTUEhIGV4cHJlc3Npb24pKgorCQl7I2V4cHJlc3Npb25MaXN0ID0gIyhjcmVhdGUoRUxJU1QsIkVMSVNUIixmaXJzdCxMVCgxKSksICNleHByZXNzaW9uTGlzdCk7fQorCTsKKworCisvLyBhc3NpZ25tZW50IGV4cHJlc3Npb24gKGxldmVsIDEzKQorYXNzaWdubWVudEV4cHJlc3Npb24KKwk6CWNvbmRpdGlvbmFsRXhwcmVzc2lvbgorCQkoCSgJQVNTSUdOXgorCQkJfAlQTFVTX0FTU0lHTl4KKwkJCXwJTUlOVVNfQVNTSUdOXgorCQkJfAlTVEFSX0FTU0lHTl4KKwkJCXwJRElWX0FTU0lHTl4KKwkJCXwJTU9EX0FTU0lHTl4KKwkJCXwJU1JfQVNTSUdOXgorCQkJfAlCU1JfQVNTSUdOXgorCQkJfAlTTF9BU1NJR05eCisJCQl8CUJBTkRfQVNTSUdOXgorCQkJfAlCWE9SX0FTU0lHTl4KKwkJCXwJQk9SX0FTU0lHTl4KKwkJCSkKKwkJCWFzc2lnbm1lbnRFeHByZXNzaW9uCisJCSk/CisJOworCisKKy8vIGNvbmRpdGlvbmFsIHRlc3QgKGxldmVsIDEyKQorY29uZGl0aW9uYWxFeHByZXNzaW9uCisJOglsb2dpY2FsT3JFeHByZXNzaW9uCisJCSggUVVFU1RJT05eIGFzc2lnbm1lbnRFeHByZXNzaW9uIENPTE9OISBjb25kaXRpb25hbEV4cHJlc3Npb24gKT8KKwk7CisKKworLy8gbG9naWNhbCBvciAofHwpIChsZXZlbCAxMSkKK2xvZ2ljYWxPckV4cHJlc3Npb24KKwk6CWxvZ2ljYWxBbmRFeHByZXNzaW9uIChMT1JeIGxvZ2ljYWxBbmRFeHByZXNzaW9uKSoKKwk7CisKKworLy8gbG9naWNhbCBhbmQgKCYmKSAobGV2ZWwgMTApCitsb2dpY2FsQW5kRXhwcmVzc2lvbgorCToJaW5jbHVzaXZlT3JFeHByZXNzaW9uIChMQU5EXiBpbmNsdXNpdmVPckV4cHJlc3Npb24pKgorCTsKKworCisvLyBiaXR3aXNlIG9yIG5vbi1zaG9ydC1jaXJjdWl0aW5nIG9yICh8KSAobGV2ZWwgOSkKK2luY2x1c2l2ZU9yRXhwcmVzc2lvbgorCToJZXhjbHVzaXZlT3JFeHByZXNzaW9uIChCT1JeIGV4Y2x1c2l2ZU9yRXhwcmVzc2lvbikqCisJOworCisKKy8vIGV4Y2x1c2l2ZSBvciAoXikgKGxldmVsIDgpCitleGNsdXNpdmVPckV4cHJlc3Npb24KKwk6CWFuZEV4cHJlc3Npb24gKEJYT1JeIGFuZEV4cHJlc3Npb24pKgorCTsKKworCisvLyBiaXR3aXNlIG9yIG5vbi1zaG9ydC1jaXJjdWl0aW5nIGFuZCAoJikgKGxldmVsIDcpCithbmRFeHByZXNzaW9uCisJOgllcXVhbGl0eUV4cHJlc3Npb24gKEJBTkReIGVxdWFsaXR5RXhwcmVzc2lvbikqCisJOworCisKKy8vIGVxdWFsaXR5L2luZXF1YWxpdHkgKD09LyE9KSAobGV2ZWwgNikKK2VxdWFsaXR5RXhwcmVzc2lvbgorCToJcmVsYXRpb25hbEV4cHJlc3Npb24gKChOT1RfRVFVQUxeIHwgRVFVQUxeKSByZWxhdGlvbmFsRXhwcmVzc2lvbikqCisJOworCisKKy8vIGJvb2xlYW4gcmVsYXRpb25hbCBleHByZXNzaW9ucyAobGV2ZWwgNSkKK3JlbGF0aW9uYWxFeHByZXNzaW9uCisJOglzaGlmdEV4cHJlc3Npb24KKwkJKAkoCSgJTFReCisJCQkJfAlHVF4KKwkJCQl8CUxFXgorCQkJCXwJR0VeCisJCQkJKQorCQkJCXNoaWZ0RXhwcmVzc2lvbgorCQkJKSoKKwkJfAkiaW5zdGFuY2VvZiJeIHR5cGVTcGVjW3RydWVdCisJCSkKKwk7CisKKworLy8gYml0IHNoaWZ0IGV4cHJlc3Npb25zIChsZXZlbCA0KQorc2hpZnRFeHByZXNzaW9uCisJOglhZGRpdGl2ZUV4cHJlc3Npb24gKChTTF4gfCBTUl4gfCBCU1JeKSBhZGRpdGl2ZUV4cHJlc3Npb24pKgorCTsKKworCisvLyBiaW5hcnkgYWRkaXRpb24vc3VidHJhY3Rpb24gKGxldmVsIDMpCithZGRpdGl2ZUV4cHJlc3Npb24KKwk6CW11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiAoKFBMVVNeIHwgTUlOVVNeKSBtdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24pKgorCTsKKworCisvLyBtdWx0aXBsaWNhdGlvbi9kaXZpc2lvbi9tb2R1bG8gKGxldmVsIDIpCittdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24KKwk6CXVuYXJ5RXhwcmVzc2lvbiAoKFNUQVJeIHwgRElWXiB8IE1PRF4gKSB1bmFyeUV4cHJlc3Npb24pKgorCTsKKwordW5hcnlFeHByZXNzaW9uCisJOglJTkNeIHVuYXJ5RXhwcmVzc2lvbgorCXwJREVDXiB1bmFyeUV4cHJlc3Npb24KKwl8CU1JTlVTXiB7I01JTlVTLnNldFR5cGUoVU5BUllfTUlOVVMpO30gdW5hcnlFeHByZXNzaW9uCisJfAlQTFVTXiB7I1BMVVMuc2V0VHlwZShVTkFSWV9QTFVTKTt9IHVuYXJ5RXhwcmVzc2lvbgorCXwJdW5hcnlFeHByZXNzaW9uTm90UGx1c01pbnVzCisJOworCit1bmFyeUV4cHJlc3Npb25Ob3RQbHVzTWludXMKKwk6CUJOT1ReIHVuYXJ5RXhwcmVzc2lvbgorCXwJTE5PVF4gdW5hcnlFeHByZXNzaW9uCisJfAkoCS8vIHN1YnJ1bGUgYWxsb3dzIG9wdGlvbiB0byBzaHV0IG9mZiB3YXJuaW5ncworCQkJb3B0aW9ucyB7CisJCQkJLy8gIihpbnQiIGFtYmlnIHdpdGggcG9zdGZpeEV4cHIgZHVlIHRvIGxhY2sgb2Ygc2VxdWVuY2UKKwkJCQkvLyBpbmZvIGluIGxpbmVhciBhcHByb3hpbWF0ZSBMTChrKS4gSXQncyBvay4gU2h1dCB1cC4KKwkJCQlnZW5lcmF0ZUFtYmlnV2FybmluZ3M9ZmFsc2U7CisJCQl9CisJCToJLy8gSWYgdHlwZWNhc3QgaXMgYnVpbHQgaW4gdHlwZSwgbXVzdCBiZSBudW1lcmljIG9wZXJhbmQKKwkJCS8vIEhhdmUgdG8gYmFja3RyYWNrIHRvIHNlZSBpZiBvcGVyYXRvciBmb2xsb3dzCisJCShMUEFSRU4gYnVpbHRJblR5cGVTcGVjW3RydWVdIFJQQVJFTiB1bmFyeUV4cHJlc3Npb24pPT4KKwkJbHBiOkxQQVJFTl4geyNscGIuc2V0VHlwZShUWVBFQ0FTVCk7fSBidWlsdEluVHlwZVNwZWNbdHJ1ZV0gUlBBUkVOIQorCQl1bmFyeUV4cHJlc3Npb24KKworCQkvLyBIYXZlIHRvIGJhY2t0cmFjayB0byBzZWUgaWYgb3BlcmF0b3IgZm9sbG93cy4gSWYgbm8gb3BlcmF0b3IKKwkJLy8gZm9sbG93cywgaXQncyBhIHR5cGVjYXN0LiBObyBzZW1hbnRpYyBjaGVja2luZyBuZWVkZWQgdG8gcGFyc2UuCisJCS8vIGlmIGl0IF9sb29rc18gbGlrZSBhIGNhc3QsIGl0IF9pc18gYSBjYXN0OyBlbHNlIGl0J3MgYSAiKGV4cHIpIgorCXwJKExQQVJFTiBjbGFzc1R5cGVTcGVjW3RydWVdIFJQQVJFTiB1bmFyeUV4cHJlc3Npb25Ob3RQbHVzTWludXMpPT4KKwkJbHA6TFBBUkVOXiB7I2xwLnNldFR5cGUoVFlQRUNBU1QpO30gY2xhc3NUeXBlU3BlY1t0cnVlXSBSUEFSRU4hCisJCXVuYXJ5RXhwcmVzc2lvbk5vdFBsdXNNaW51cworCisJfAlwb3N0Zml4RXhwcmVzc2lvbgorCSkKKwk7CisKKy8vIHF1YWxpZmllZCBuYW1lcywgYXJyYXkgZXhwcmVzc2lvbnMsIG1ldGhvZCBpbnZvY2F0aW9uLCBwb3N0IGluYy9kZWMKK3Bvc3RmaXhFeHByZXNzaW9uCisJOgorCQlwcmltYXJ5RXhwcmVzc2lvbgorCisJCSgKKwkJCS8qCisJCQlvcHRpb25zIHsKKwkJCQkvLyB0aGUgdXNlIG9mIHBvc3RmaXhFeHByZXNzaW9uIGluIFNVUEVSX0NUT1JfQ0FMTCBhZGRzIERPVAorCQkJCS8vIHRvIHRoZSBsb29rYWhlYWQgc2V0LCBhbmQgZ2l2ZXMgbG9hZHMgb2YgZmFsc2Ugbm9uLWRldAorCQkJCS8vIHdhcm5pbmdzLgorCQkJCS8vIHNodXQgdGhlbSBvZmYuCisJCQkJZ2VuZXJhdGVBbWJpZ1dhcm5pbmdzPWZhbHNlOworCQkJfQorCQk6CSovCisJCQkvL3R5cGUgYXJndW1lbnRzIGFyZSBvbmx5IGFwcHJvcHJpYXRlIGZvciBhIHBhcmFtZXRlcml6ZWQgbWV0aG9kL2N0b3IgaW52b2NhdGlvbnMKKwkJCS8vc2VtYW50aWMgY2hlY2sgbWF5IGJlIG5lZWRlZCBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoaXMgaXMgdGhlIGNhc2UKKwkJCURPVF4gKHR5cGVBcmd1bWVudHMpPworCQkJCSgJSURFTlQKKwkJCQkJKAlscDpMUEFSRU5eIHsjbHAuc2V0VHlwZShNRVRIT0RfQ0FMTCk7fQorCQkJCQkJYXJnTGlzdAorCQkJCQkJUlBBUkVOIQorCQkJCQkpPworCQkJCXwJInN1cGVyIgorCQkJCQkoCS8vIChuZXcgT3V0ZXIoKSkuc3VwZXIoKSAoY3JlYXRlIGVuY2xvc2luZyBpbnN0YW5jZSkKKwkJCQkJCWxwMzpMUEFSRU5eIGFyZ0xpc3QgUlBBUkVOIQorCQkJCQkJeyNscDMuc2V0VHlwZShTVVBFUl9DVE9SX0NBTEwpO30KKwkJCQkJfAlET1ReICh0eXBlQXJndW1lbnRzKT8gSURFTlQKKwkJCQkJCSgJbHBzOkxQQVJFTl4geyNscHMuc2V0VHlwZShNRVRIT0RfQ0FMTCk7fQorCQkJCQkJCWFyZ0xpc3QKKwkJCQkJCQlSUEFSRU4hCisJCQkJCQkpPworCQkJCQkpCisJCQkJKQorCQl8CURPVF4gInRoaXMiCisJCXwJRE9UXiBuZXdFeHByZXNzaW9uCisJCXwJbGI6TEJSQUNLXiB7I2xiLnNldFR5cGUoSU5ERVhfT1ApO30gZXhwcmVzc2lvbiBSQlJBQ0shCisJCSkqCisKKwkJKAkvLyBwb3NzaWJseSBhZGQgb24gYSBwb3N0LWluY3JlbWVudCBvciBwb3N0LWRlY3JlbWVudC4KKwkJCS8vIGFsbG93cyBJTkMvREVDIG9uIHRvbyBtdWNoLCBidXQgc2VtYW50aWNzIGNhbiBjaGVjaworCQkJaW46SU5DXiB7I2luLnNldFR5cGUoUE9TVF9JTkMpO30KKwkgCXwJZGU6REVDXiB7I2RlLnNldFR5cGUoUE9TVF9ERUMpO30KKwkJKT8KKyAJOworCisvLyB0aGUgYmFzaWMgZWxlbWVudCBvZiBhbiBleHByZXNzaW9uCitwcmltYXJ5RXhwcmVzc2lvbgorCToJaWRlbnRQcmltYXJ5ICggb3B0aW9ucyB7Z3JlZWR5PXRydWU7fSA6IERPVF4gImNsYXNzIiApPworCXwJY29uc3RhbnQKKwl8CSJ0cnVlIgorCXwJImZhbHNlIgorCXwJIm51bGwiCisJfAluZXdFeHByZXNzaW9uCisJfAkidGhpcyIKKwl8CSJzdXBlciIKKwl8CUxQQVJFTiEgYXNzaWdubWVudEV4cHJlc3Npb24gUlBBUkVOIQorCQkvLyBsb29rIGZvciBpbnQuY2xhc3MgYW5kIGludFtdLmNsYXNzCisJfAlidWlsdEluVHlwZQorCQkoIGxidDpMQlJBQ0teIHsjbGJ0LnNldFR5cGUoQVJSQVlfREVDTEFSQVRPUik7fSBSQlJBQ0shICkqCisJCURPVF4gImNsYXNzIgorCTsKKworLyoqIE1hdGNoIGEsIGEuYi5jIHJlZnMsIGEuYi5jKC4uLikgcmVmcywgYS5iLmNbXSwgYS5iLmNbXS5jbGFzcywKKyAqICBhbmQgYS5iLmMuY2xhc3MgcmVmcy4gQWxzbyB0aGlzKC4uLikgYW5kIHN1cGVyKC4uLikuIE1hdGNoCisgKiAgdGhpcyBvciBzdXBlci4KKyAqLworaWRlbnRQcmltYXJ5CisJOgkodGExOnR5cGVBcmd1bWVudHMhKT8KKwkJSURFTlQKKwkJLy8gU3ludGF4IGZvciBtZXRob2QgaW52b2NhdGlvbiB3aXRoIHR5cGUgYXJndW1lbnRzIGlzCisJCS8vIDxTdHJpbmc+Zm9vKCJibGFoIikKKwkJKAorCQkJb3B0aW9ucyB7CisJCQkJLy8gLmlkZW50IGNvdWxkIG1hdGNoIGhlcmUgb3IgaW4gcG9zdGZpeEV4cHJlc3Npb24uCisJCQkJLy8gV2UgZG8gd2FudCB0byBtYXRjaCBoZXJlLiBUdXJuIG9mZiB3YXJuaW5nLgorCQkJCWdyZWVkeT10cnVlOworCQkJCS8vIFRoaXMgdHVybnMgdGhlIGFtYmlndWl0eSB3YXJuaW5nIG9mIHRoZSBzZWNvbmQgYWx0ZXJuYXRpdmUKKwkJCQkvLyBvZmYuIFNlZSBiZWxvdy4gKFRoZSAiZmFsc2UiIHByZWRpY2F0ZSBtYWtlcyBpdCBub24taXNzdWUpCisJCQkJd2FybldoZW5Gb2xsb3dBbWJpZz1mYWxzZTsKKwkJCX0KKwkJCS8vIHdlIGhhdmUgYSBuZXcgbm9uZGV0ZXJtaW5pc20gYmVjYXVzZSBvZgorCQkJLy8gdHlwZUFyZ3VtZW50cy4uLiBvbmx5IGEgc3ludGFjdGljIHByZWRpY2F0ZSB3aWxsIGhlbHAuLi4KKwkJCS8vIFRoZSBwcm9ibGVtIGlzIHRoYXQgdGhpcyBsb29wIGhlcmUgY29uZmxpY3RzIHdpdGgKKwkJCS8vIERPVCB0eXBlQXJndW1lbnRzICJzdXBlciIgaW4gcG9zdGZpeEV4cHJlc3Npb24gKGs9MikKKwkJCS8vIEEgcHJvcGVyIHNvbHV0aW9uIHdvdWxkIHJlcXVpcmUgYSBsb3Qgb2YgcmVmYWN0b3JpbmcuLi4KKwkJOgkoRE9UICh0eXBlQXJndW1lbnRzKT8gSURFTlQpID0+CisJCQkJRE9UXiAodGEyOnR5cGVBcmd1bWVudHMhKT8gSURFTlQKKwkJfAl7ZmFsc2V9PwkvLyBGSVhNRTogdGhpcyBpcyB2ZXJ5IHVnbHkgYnV0IGl0IHNlZW1zIHRvIHdvcmsuLi4KKwkJCQkJCS8vIHRoaXMgd2lsbCBhbHNvIHByb2R1Y2UgYW4gQU5UTFIgd2FybmluZyEKKwkJCQkvLyBVbmZvcnR1bmF0ZWx5IGEgc3ludGFjdGljIHByZWRpY2F0ZSBjYW4gb25seSBzZWxlY3Qgb25lIG9mCisJCQkJLy8gbXVsdGlwbGUgYWx0ZXJuYXRpdmVzIG9uIHRoZSBzYW1lIGxldmVsLCBub3QgYnJlYWsgb3V0IG9mCisJCQkJLy8gYW4gZW5jbG9zaW5nIGxvb3AsIHdoaWNoIGlzIHdoeSB0aGlzIHVnbHkgaGFjayAoYSBmYWtlCisJCQkJLy8gZW1wdHkgYWx0ZXJuYXRpdmUgd2l0aCBhbHdheXMtZmFsc2Ugc2VtYW50aWMgcHJlZGljYXRlKQorCQkJCS8vIGlzIG5lY2Vzc2FyeS4KKwkJKSoKKwkJKAorCQkJb3B0aW9ucyB7CisJCQkJLy8gQVJSQVlfREVDTEFSQVRPUiBoZXJlIGNvbmZsaWN0cyB3aXRoIElOREVYX09QIGluCisJCQkJLy8gcG9zdGZpeEV4cHJlc3Npb24gb24gTEJSQUNLIFJCUkFDSy4KKwkJCQkvLyBXZSB3YW50IHRvIG1hdGNoIFtdIGhlcmUsIHNvIGdyZWVkeS4gVGhpcyBvdmVyY29tZXMKKwkJCQkvLyBsaW1pdGF0aW9uIG9mIGxpbmVhciBhcHByb3hpbWF0ZSBsb29rYWhlYWQuCisJCQkJZ3JlZWR5PXRydWU7CisJCQl9CisJCToJKAlscDpMUEFSRU5eIHsjbHAuc2V0VHlwZShNRVRIT0RfQ0FMTCk7fQorCQkJCS8vIGlmIHRoZSBpbnB1dCBpcyB2YWxpZCwgb25seSB0aGUgbGFzdCBJREVOVCBtYXkKKwkJCQkvLyBoYXZlIHByZWNlZGluZyB0eXBlQXJndW1lbnRzLi4uIHJhdGhlciBoYWNreSwgdGhpcyBpcy4uLgorCQkJCXtpZiAoI3RhMiAhPSBudWxsKSBhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsICN0YTIpO30KKwkJCQl7aWYgKCN0YTIgPT0gbnVsbCkgYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCAjdGExKTt9CisJCQkJYXJnTGlzdCBSUEFSRU4hCisJCQkpCisJCXwJKCBvcHRpb25zIHtncmVlZHk9dHJ1ZTt9IDoKKwkJCQlsYmM6TEJSQUNLXiB7I2xiYy5zZXRUeXBlKEFSUkFZX0RFQ0xBUkFUT1IpO30gUkJSQUNLIQorCQkJKSsKKwkJKT8KKwk7CisKKy8qKiBvYmplY3QgaW5zdGFudGlhdGlvbi4KKyAqICBUcmVlcyBhcmUgYnVpbHQgYXMgaWxsdXN0cmF0ZWQgYnkgdGhlIGZvbGxvd2luZyBpbnB1dC90cmVlIHBhaXJzOgorICoKKyAqICBuZXcgVCgpCisgKgorICogIG5ldworICogICB8CisgKiAgIFQgLS0gIEVMSVNUCisgKgkJICAgfAorICoJCSAgYXJnMSAtLSBhcmcyIC0tIC4uIC0tIGFyZ24KKyAqCisgKiAgbmV3IGludFtdCisgKgorICogIG5ldworICogICB8CisgKiAgaW50IC0tIEFSUkFZX0RFQ0xBUkFUT1IKKyAqCisgKiAgbmV3IGludFtdIHsxLDJ9CisgKgorICogIG5ldworICogICB8CisgKiAgaW50IC0tIEFSUkFZX0RFQ0xBUkFUT1IgLS0gQVJSQVlfSU5JVAorICoJCQkJCQkJCSAgfAorICoJCQkJCQkJCUVYUFIgLS0gRVhQUgorICoJCQkJCQkJCSAgfAkgIHwKKyAqCQkJCQkJCQkgIDEJICAyCisgKgorICogIG5ldyBpbnRbM10KKyAqICBuZXcKKyAqICAgfAorICogIGludCAtLSBBUlJBWV9ERUNMQVJBVE9SCisgKgkJCQl8CisgKgkJCSAgRVhQUgorICoJCQkJfAorICoJCQkJMworICoKKyAqICBuZXcgaW50WzFdWzJdCisgKgorICogIG5ldworICogICB8CisgKiAgaW50IC0tIEFSUkFZX0RFQ0xBUkFUT1IKKyAqCQkJICAgfAorICoJCSBBUlJBWV9ERUNMQVJBVE9SIC0tIEVYUFIKKyAqCQkJICAgfAkJCSAgfAorICoJCQkgRVhQUgkJCSAxCisgKgkJCSAgIHwKKyAqCQkJICAgMgorICoKKyAqLworbmV3RXhwcmVzc2lvbgorCToJIm5ldyJeICh0eXBlQXJndW1lbnRzKT8gdHlwZQorCQkoCUxQQVJFTiEgYXJnTGlzdCBSUEFSRU4hIChjbGFzc0Jsb2NrKT8KKworCQkJLy9qYXZhIDEuMQorCQkJLy8gTm90ZTogVGhpcyB3aWxsIGFsbG93IGJhZCBjb25zdHJ1Y3RzIGxpa2UKKwkJCS8vCW5ldyBpbnRbNF1bXVszXSB7ZXhwLGV4cH0uCisJCQkvLwlUaGVyZSBuZWVkcyB0byBiZSBhIHNlbWFudGljIGNoZWNrIGhlcmUuLi4KKwkJCS8vIHRvIG1ha2Ugc3VyZToKKwkJCS8vICAgYSkgWyBleHByIF0gYW5kIFsgXSBhcmUgbm90IG1peGVkCisJCQkvLyAgIGIpIFsgZXhwciBdIGFuZCBhbiBpbml0IGFyZSBub3QgdXNlZCB0b2dldGhlcgorCisJCXwJbmV3QXJyYXlEZWNsYXJhdG9yIChhcnJheUluaXRpYWxpemVyKT8KKwkJKQorCTsKKworYXJnTGlzdCB7VG9rZW4gZmlyc3QgPSBMVCgxKTt9CisJOgkoCWV4cHJlc3Npb25MaXN0CisJCXwJLypub3RoaW5nKi8KKwkJCXsjYXJnTGlzdCA9IGNyZWF0ZShFTElTVCwiRUxJU1QiLGZpcnN0LExUKDEpKTt9CisJCSkKKwk7CisKK25ld0FycmF5RGVjbGFyYXRvcgorCToJKAorCQkJLy8gQ09ORkxJQ1Q6CisJCQkvLyBuZXdFeHByZXNzaW9uIGlzIGEgcHJpbWFyeUV4cHJlc3Npb24gd2hpY2ggY2FuIGJlCisJCQkvLyBmb2xsb3dlZCBieSBhbiBhcnJheSBpbmRleCByZWZlcmVuY2UuIFRoaXMgaXMgb2ssCisJCQkvLyBhcyB0aGUgZ2VuZXJhdGVkIGNvZGUgd2lsbCBzdGF5IGluIHRoaXMgbG9vcCBhcworCQkJLy8gbG9uZyBhcyBpdCBzZWVzIGFuIExCUkFDSyAocHJvcGVyIGJlaGF2aW9yKQorCQkJb3B0aW9ucyB7CisJCQkJd2FybldoZW5Gb2xsb3dBbWJpZyA9IGZhbHNlOworCQkJfQorCQk6CisJCQlsYjpMQlJBQ0teIHsjbGIuc2V0VHlwZShBUlJBWV9ERUNMQVJBVE9SKTt9CisJCQkJKGV4cHJlc3Npb24pPworCQkJUkJSQUNLIQorCQkpKworCTsKKworY29uc3RhbnQKKwk6CU5VTV9JTlQKKwl8CUNIQVJfTElURVJBTAorCXwJU1RSSU5HX0xJVEVSQUwKKwl8CU5VTV9GTE9BVAorCXwJTlVNX0xPTkcKKwl8CU5VTV9ET1VCTEUKKwk7CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUaGUgSmF2YSBzY2FubmVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2NsYXNzIEphdmFMZXhlciBleHRlbmRzIExleGVyOworCitvcHRpb25zIHsKKwlleHBvcnRWb2NhYj1KYXZhOwkJLy8gY2FsbCB0aGUgdm9jYWJ1bGFyeSAiSmF2YSIKKwl0ZXN0TGl0ZXJhbHM9ZmFsc2U7CQkvLyBkb24ndCBhdXRvbWF0aWNhbGx5IHRlc3QgZm9yIGxpdGVyYWxzCisJaz00OwkJCQkJLy8gZm91ciBjaGFyYWN0ZXJzIG9mIGxvb2thaGVhZAorCWNoYXJWb2NhYnVsYXJ5PSdcdTAwMDMnLi4nXHVGRkZGJzsKKwkvLyB3aXRob3V0IGlubGluaW5nIHNvbWUgYml0c2V0IHRlc3RzLCBjb3VsZG4ndCBkbyB1bmljb2RlOworCS8vIEkgbmVlZCB0byBtYWtlIEFOVExSIGdlbmVyYXRlIHNtYWxsZXIgYml0c2V0czsgc2VlCisJLy8gYm90dG9tIG9mIEphdmFMZXhlci5qYXZhCisJY29kZUdlbkJpdHNldFRlc3RUaHJlc2hvbGQ9MjA7Cit9CisKK3sKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBTQ1NfVFlQRSA9IDMsIFNDU19WQUwgPSA0LCBTQ1NfTElUID0gOCwgU0NTX0xJTUlUID0gMTY7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgU0NTX1NRX1RZUEUgPSAwLCBTQ1NfVFFfVFlQRSA9IDEsIFNDU19SRV9UWVBFID0gMjsKKyAgICBwcm90ZWN0ZWQgaW50IHN0cmluZ0N0b3JTdGF0ZSA9IDA7ICAvLyBoYWNrIHN0cmluZyBhbmQgcmVnZXhwIGNvbnN0cnVjdG9yIGJvdW5kYXJpZXMKKyAgICBwcm90ZWN0ZWQgaW50IGxhc3RTaWdUb2tlblR5cGUgPSBFT0Y7ICAvLyBsYXN0IHJldHVybmVkIG5vbi13aGl0ZXNwYWNlIHRva2VuCisKKyAgICAvKiogZmxhZyBmb3IgZW5hYmxpbmcgdGhlICJhc3NlcnQiIGtleXdvcmQgKi8KKwlwcml2YXRlIGJvb2xlYW4gYXNzZXJ0RW5hYmxlZCA9IHRydWU7CisJLyoqIGZsYWcgZm9yIGVuYWJsaW5nIHRoZSAiZW51bSIga2V5d29yZCAqLworCXByaXZhdGUgYm9vbGVhbiBlbnVtRW5hYmxlZCA9IHRydWU7CisgICAgLyoqIGZsYWcgZm9yIGluY2x1ZGluZyB3aGl0ZXNwYWNlIHRva2VucyAoZm9yIElERSBwcmVwYXJzaW5nKSAqLworICAgIHByaXZhdGUgYm9vbGVhbiB3aGl0ZXNwYWNlSW5jbHVkZWQgPSBmYWxzZTsKKworCS8qKiBFbmFibGUgdGhlICJhc3NlcnQiIGtleXdvcmQgKi8KKwlwdWJsaWMgdm9pZCBlbmFibGVBc3NlcnQoYm9vbGVhbiBzaG91bGRFbmFibGUpIHsgYXNzZXJ0RW5hYmxlZCA9IHNob3VsZEVuYWJsZTsgfQorCS8qKiBRdWVyeSB0aGUgImFzc2VydCIga2V5d29yZCBzdGF0ZSAqLworCXB1YmxpYyBib29sZWFuIGlzQXNzZXJ0RW5hYmxlZCgpIHsgcmV0dXJuIGFzc2VydEVuYWJsZWQ7IH0KKwkvKiogRW5hYmxlIHRoZSAiZW51bSIga2V5d29yZCAqLworCXB1YmxpYyB2b2lkIGVuYWJsZUVudW0oYm9vbGVhbiBzaG91bGRFbmFibGUpIHsgZW51bUVuYWJsZWQgPSBzaG91bGRFbmFibGU7IH0KKwkvKiogUXVlcnkgdGhlICJlbnVtIiBrZXl3b3JkIHN0YXRlICovCisJcHVibGljIGJvb2xlYW4gaXNFbnVtRW5hYmxlZCgpIHsgcmV0dXJuIGVudW1FbmFibGVkOyB9CisKKyAgICAvKiogVGhpcyBpcyBhIGJpdCBvZiBwbHVtYmluZyB3aGljaCByZXN1bWVzIGNvbGxlY3Rpb24gb2Ygc3RyaW5nIGNvbnN0cnVjdG9yIGJvZGllcywKKyAgICAgKiAgYWZ0ZXIgYW4gZW1iZWRkZWQgZXhwcmVzc2lvbiBoYXMgYmVlbiBwYXJzZWQuCisgICAgICogIFVzYWdlOiAgbmV3IEphdmFSZWNvZ25pemVyKG5ldyBKYXZhTGV4ZXIoaW4pLnBsdW1iKCkpLgorICAgICAqLworICAgIHB1YmxpYyBUb2tlblN0cmVhbSBwbHVtYigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUb2tlblN0cmVhbSgpIHsKKyAgICAgICAgICAgIHB1YmxpYyBUb2tlbiBuZXh0VG9rZW4oKSB0aHJvd3MgVG9rZW5TdHJlYW1FeGNlcHRpb24geworICAgICAgICAgICAgICAgIGlmIChzdHJpbmdDdG9yU3RhdGUgPj0gU0NTX0xJVCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGdvbyBpcyBtb2RlbGVkIHVwb24gdGhlIEFOVExSIGNvZGUgZm9yIG5leHRUb2tlbjoKKyAgICAgICAgICAgICAgICAgICAgaW50IHF1b3RlVHlwZSA9IChzdHJpbmdDdG9yU3RhdGUgJiBTQ1NfVFlQRSk7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZ0N0b3JTdGF0ZSA9IDA7ICAvLyBnZXQgb3V0IG9mIHRoaXMgbW9kZSwgbm93CisgICAgICAgICAgICAgICAgICAgIHJlc2V0VGV4dCgpOworLyogICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHF1b3RlVHlwZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTQ1NfU1FfVFlQRToKKy8vdG9kbzogc3VpdGFibGUgcmVwbGFjZW1lbnQ/Pz8gICAgIG1TVFJJTkdfQ1RPUl9FTkQodHJ1ZSwgZmFsc2UsIGZhbHNlKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAJYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNDU19UUV9UWVBFOgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNUUklOR19DVE9SX0VORCh0cnVlLCBmYWxzZSwgdHJ1ZSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgCWJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTQ1NfUkVfVFlQRToKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SRUdFWFBfQ1RPUl9FTkQodHJ1ZSwgZmFsc2UpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgIAlicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFNpZ1Rva2VuVHlwZSA9IF9yZXR1cm5Ub2tlbi5nZXRUeXBlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3JldHVyblRva2VuOworICAgICAgICAgICAgICAgICAgICB9Ki8vKiBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRva2VuU3RyZWFtUmVjb2duaXRpb25FeGNlcHRpb24oZSk7CisgICAgICAgICAgICAgICAgICAgIH0qLyAvKmNhdGNoIChDaGFyU3RyZWFtRXhjZXB0aW9uIGNzZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBjc2UgaW5zdGFuY2VvZiBDaGFyU3RyZWFtSU9FeGNlcHRpb24gKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRva2VuU3RyZWFtSU9FeGNlcHRpb24oKChDaGFyU3RyZWFtSU9FeGNlcHRpb24pY3NlKS5pbyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVG9rZW5TdHJlYW1FeGNlcHRpb24oY3NlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0qLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBUb2tlbiB0b2tlbiA9IEphdmFMZXhlci50aGlzLm5leHRUb2tlbigpOworICAgICAgICAgICAgICAgIGludCBsYXN0dHlwZSA9IHRva2VuLmdldFR5cGUoKTsKKyAgICAgICAgICAgICAgICBpZiAod2hpdGVzcGFjZUluY2x1ZGVkKSB7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobGFzdHR5cGUpIHsgIC8vIGZpbHRlciBvdXQgaW5zaWduaWZpY2FudCB0eXBlcworICAgICAgICAgICAgICAgICAgICBjYXNlIFdTOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFNMX0NPTU1FTlQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTUxfQ09NTUVOVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3R0eXBlID0gbGFzdFNpZ1Rva2VuVHlwZTsgIC8vIGJhY2sgdXAhCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGFzdFNpZ1Rva2VuVHlwZSA9IGxhc3R0eXBlOworICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIEphdmFSZWNvZ25pemVyIHBhcnNlcjsgIC8vIGxpdHRsZS11c2VkIGxpbms7IFRPRE86IGdldCByaWQgb2YKK30KKworLy8gT1BFUkFUT1JTCitRVUVTVElPTgkJOgknPycJCTsKK0xQQVJFTgkJCToJJygnCQk7CitSUEFSRU4JCQk6CScpJwkJOworTEJSQUNLCQkJOgknWycJCTsKK1JCUkFDSwkJCToJJ10nCQk7CitMQ1VSTFkJCQk6CSd7JwkJOworUkNVUkxZCQkJOgknfScJCTsKK0NPTE9OCQkJOgknOicJCTsKK0NPTU1BCQkJOgknLCcJCTsKKy8vRE9UCQkJOgknLicJCTsKK0FTU0lHTgkJCToJJz0nCQk7CitFUVVBTAkJCToJIj09Igk7CitMTk9UCQkJOgknIScJCTsKK0JOT1QJCQk6CSd+JwkJOworTk9UX0VRVUFMCQk6CSIhPSIJOworRElWCQkJCToJJy8nCQk7CitESVZfQVNTSUdOCQk6CSIvPSIJOworUExVUwkJCToJJysnCQk7CitQTFVTX0FTU0lHTgkJOgkiKz0iCTsKK0lOQwkJCQk6CSIrKyIJOworTUlOVVMJCQk6CSctJwkJOworTUlOVVNfQVNTSUdOCToJIi09Igk7CitERUMJCQkJOgkiLS0iCTsKK1NUQVIJCQk6CScqJwkJOworU1RBUl9BU1NJR04JCToJIio9Igk7CitNT0QJCQkJOgknJScJCTsKK01PRF9BU1NJR04JCToJIiU9Igk7CitTUgkJCQk6CSI+PiIJOworU1JfQVNTSUdOCQk6CSI+Pj0iCTsKK0JTUgkJCQk6CSI+Pj4iCTsKK0JTUl9BU1NJR04JCToJIj4+Pj0iCTsKK0dFCQkJCToJIj49Igk7CitHVAkJCQk6CSI+IgkJOworU0wJCQkJOgkiPDwiCTsKK1NMX0FTU0lHTgkJOgkiPDw9Igk7CitMRQkJCQk6CSI8PSIJOworTFQJCQkJOgknPCcJCTsKK0JYT1IJCQk6CSdeJwkJOworQlhPUl9BU1NJR04JCToJIl49Igk7CitCT1IJCQkJOgknfCcJCTsKK0JPUl9BU1NJR04JCToJInw9Igk7CitMT1IJCQkJOgkifHwiCTsKK0JBTkQJCQk6CScmJwkJOworQkFORF9BU1NJR04JCToJIiY9Igk7CitMQU5ECQkJOgkiJiYiCTsKK1NFTUkJCQk6CSc7JwkJOworCisKKy8vIFdoaXRlc3BhY2UgLS0gaWdub3JlZAorV1MJOgkoCScgJworCQl8CSdcdCcKKwkJfAknXGYnCisJCQkvLyBoYW5kbGUgbmV3bGluZXMKKwkJfAkoCW9wdGlvbnMge2dlbmVyYXRlQW1iaWdXYXJuaW5ncz1mYWxzZTt9CisJCQk6CSJcclxuIgkvLyBFdmlsIERPUworCQkJfAknXHInCS8vIE1hY2ludG9zaAorCQkJfAknXG4nCS8vIFVuaXggKHRoZSByaWdodCB3YXkpCisJCQkpCisJCQl7IG5ld2xpbmUoKTsgfQorCQkpKworCQl7IF90dHlwZSA9IFRva2VuLlNLSVA7IH0KKwk7CisKKy8vIFNpbmdsZS1saW5lIGNvbW1lbnRzCitTTF9DT01NRU5UCisJOgkiLy8iCisJCSh+KCdcbid8J1xyJykpKiAoJ1xuJ3wnXHInKCdcbicpPykKKwkJeyRzZXRUeXBlKFRva2VuLlNLSVApOyBuZXdsaW5lKCk7fQorCTsKKworLy8gbXVsdGlwbGUtbGluZSBjb21tZW50cworTUxfQ09NTUVOVAorCToJIi8qIgorCQkoCS8qCSdccicgJ1xuJyBjYW4gYmUgbWF0Y2hlZCBpbiBvbmUgYWx0ZXJuYXRpdmUgb3IgYnkgbWF0Y2hpbmcKKwkJCQknXHInIGluIG9uZSBpdGVyYXRpb24gYW5kICdcbicgaW4gYW5vdGhlci4gSSBhbSB0cnlpbmcgdG8KKwkJCQloYW5kbGUgYW55IGZsYXZvciBvZiBuZXdsaW5lIHRoYXQgY29tZXMgaW4sIGJ1dCB0aGUgbGFuZ3VhZ2UKKwkJCQl0aGF0IGFsbG93cyBib3RoICJcclxuIiBhbmQgIlxyIiBhbmQgIlxuIiB0byBhbGwgYmUgdmFsaWQKKwkJCQluZXdsaW5lIGlzIGFtYmlndW91cy4gQ29uc2VxdWVudGx5LCB0aGUgcmVzdWx0aW5nIGdyYW1tYXIKKwkJCQltdXN0IGJlIGFtYmlndW91cy4gSSdtIHNodXR0aW5nIHRoaXMgd2FybmluZyBvZmYuCisJCQkgKi8KKwkJCW9wdGlvbnMgeworCQkJCWdlbmVyYXRlQW1iaWdXYXJuaW5ncz1mYWxzZTsKKwkJCX0KKwkJOgorCQkJeyBMQSgyKSE9Jy8nIH0/ICcqJworCQl8CSdccicgJ1xuJwkJe25ld2xpbmUoKTt9CisJCXwJJ1xyJwkJCXtuZXdsaW5lKCk7fQorCQl8CSdcbicJCQl7bmV3bGluZSgpO30KKwkJfAl+KCcqJ3wnXG4nfCdccicpCisJCSkqCisJCSIqLyIKKwkJeyRzZXRUeXBlKFRva2VuLlNLSVApO30KKwk7CisKKworLy8JIGNoYXJhY3RlciBsaXRlcmFscworCUNIQVJfTElURVJBTAorCQk6CSdcJycgKCBFU0MgfCB+KCdcJyd8J1xuJ3wnXHInfCdcXCcpICkgJ1wnJworCQk7CisKKy8vCSBzdHJpbmcgbGl0ZXJhbHMKKwlTVFJJTkdfTElURVJBTAorCQk6CSciJyAoRVNDfH4oJyInfCdcXCd8J1xuJ3wnXHInKSkqICciJworCQk7CisKKworLy8gZXNjYXBlIHNlcXVlbmNlIC0tIG5vdGUgdGhhdCB0aGlzIGlzIHByb3RlY3RlZDsgaXQgY2FuIG9ubHkgYmUgY2FsbGVkCisvLyBmcm9tIGFub3RoZXIgbGV4ZXIgcnVsZSAtLSBpdCB3aWxsIG5vdCBldmVyIGRpcmVjdGx5IHJldHVybiBhIHRva2VuIHRvCisvLyB0aGUgcGFyc2VyCisvLyBUaGVyZSBhcmUgdmFyaW91cyBhbWJpZ3VpdGllcyBodXNoZWQgaW4gdGhpcyBydWxlLiBUaGUgb3B0aW9uYWwKKy8vICcwJy4uLic5JyBkaWdpdCBtYXRjaGVzIHNob3VsZCBiZSBtYXRjaGVkIGhlcmUgcmF0aGVyIHRoYW4gbGV0dGluZworLy8gdGhlbSBnbyBiYWNrIHRvIFNUUklOR19MSVRFUkFMIHRvIGJlIG1hdGNoZWQuIEFOVExSIGRvZXMgdGhlCisvLyByaWdodCB0aGluZyBieSBtYXRjaGluZyBpbW1lZGlhdGVseTsgaGVuY2UsIGl0J3Mgb2sgdG8gc2h1dCBvZmYKKy8vIHRoZSBGT0xMT1cgYW1iaWcgd2FybmluZ3MuCitwcm90ZWN0ZWQKK0VTQworCToJJ1xcJworCQkoCSduJworCQl8CSdyJworCQl8CSd0JworCQl8CSdiJworCQl8CSdmJworCQl8CSciJworCQl8CSdcJycKKwkJfAknXFwnCisJCXwJKCd1JykrIEhFWF9ESUdJVCBIRVhfRElHSVQgSEVYX0RJR0lUIEhFWF9ESUdJVAorCQl8CScwJy4uJzMnCisJCQkoCisJCQkJb3B0aW9ucyB7CisJCQkJCXdhcm5XaGVuRm9sbG93QW1iaWcgPSBmYWxzZTsKKwkJCQl9CisJCQk6CScwJy4uJzcnCisJCQkJKAorCQkJCQlvcHRpb25zIHsKKwkJCQkJCXdhcm5XaGVuRm9sbG93QW1iaWcgPSBmYWxzZTsKKwkJCQkJfQorCQkJCToJJzAnLi4nNycKKwkJCQkpPworCQkJKT8KKwkJfAknNCcuLic3JworCQkJKAorCQkJCW9wdGlvbnMgeworCQkJCQl3YXJuV2hlbkZvbGxvd0FtYmlnID0gZmFsc2U7CisJCQkJfQorCQkJOgknMCcuLic3JworCQkJKT8KKwkJKQorCTsKKworCisvLyBoZXhhZGVjaW1hbCBkaWdpdCAoYWdhaW4sIG5vdGUgaXQncyBwcm90ZWN0ZWQhKQorcHJvdGVjdGVkCitIRVhfRElHSVQKKwk6CSgnMCcuLic5J3wnQScuLidGJ3wnYScuLidmJykKKwk7CisKKworLy8gYSBkdW1teSBydWxlIHRvIGZvcmNlIHZvY2FidWxhcnkgdG8gYmUgYWxsIGNoYXJhY3RlcnMgKGV4Y2VwdCBzcGVjaWFsCisvLyBvbmVzIHRoYXQgQU5UTFIgdXNlcyBpbnRlcm5hbGx5ICgwIHRvIDIpCitwcm90ZWN0ZWQKK1ZPQ0FCCisJOgknXDMnLi4nXDM3NycKKwk7CisKKworLy8gYW4gaWRlbnRpZmllci4gTm90ZSB0aGF0IHRlc3RMaXRlcmFscyBpcyBzZXQgdG8gdHJ1ZSEgVGhpcyBtZWFucworLy8gdGhhdCBhZnRlciB3ZSBtYXRjaCB0aGUgcnVsZSwgd2UgbG9vayBpbiB0aGUgbGl0ZXJhbHMgdGFibGUgdG8gc2VlCisvLyBpZiBpdCdzIGEgbGl0ZXJhbCBvciByZWFsbHkgYW4gaWRlbnRpZmVyCitJREVOVAorCW9wdGlvbnMge3Rlc3RMaXRlcmFscz10cnVlO30KKwk6CSgnYScuLid6J3wnQScuLidaJ3wnXyd8JyQnKSAoJ2EnLi4neid8J0EnLi4nWid8J18nfCcwJy4uJzknfCckJykqCisJCXsKKwkJCS8vIGNoZWNrIGlmICJhc3NlcnQiIGtleXdvcmQgaXMgZW5hYmxlZAorCQkJaWYgKGFzc2VydEVuYWJsZWQgJiYgImFzc2VydCIuZXF1YWxzKCRnZXRUZXh0KSkgeworCQkJCSRzZXRUeXBlKExJVEVSQUxfYXNzZXJ0KTsgLy8gc2V0IHRva2VuIHR5cGUgZm9yIHRoZSBydWxlIGluIHRoZSBwYXJzZXIKKwkJCX0KKwkJCS8vIGNoZWNrIGlmICJlbnVtIiBrZXl3b3JkIGlzIGVuYWJsZWQKKwkJCWlmIChlbnVtRW5hYmxlZCAmJiAiZW51bSIuZXF1YWxzKCRnZXRUZXh0KSkgeworCQkJCSRzZXRUeXBlKExJVEVSQUxfZW51bSk7IC8vIHNldCB0b2tlbiB0eXBlIGZvciB0aGUgcnVsZSBpbiB0aGUgcGFyc2VyCisJCQl9CisJCX0KKwk7CisKKworLy8gYSBudW1lcmljIGxpdGVyYWwKK05VTV9JTlQKKwl7Ym9vbGVhbiBpc0RlY2ltYWw9ZmFsc2U7IFRva2VuIHQ9bnVsbDt9CisJOgknLicge190dHlwZSA9IERPVDt9CisJCQkoCisJCQkJKCgnMCcuLic5JykrIChFWFBPTkVOVCk/IChmMTpGTE9BVF9TVUZGSVgge3Q9ZjE7fSk/CisJCQkJeworCQkJCWlmICh0ICE9IG51bGwgJiYgdC5nZXRUZXh0KCkudG9VcHBlckNhc2UoKS5pbmRleE9mKCdGJyk+PTApIHsKKwkJCQkJX3R0eXBlID0gTlVNX0ZMT0FUOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJX3R0eXBlID0gTlVNX0RPVUJMRTsgLy8gYXNzdW1lIGRvdWJsZQorCQkJCX0KKwkJCQl9KQorCQkJCXwKKwkJCQkvLyBKREsgMS41IHRva2VuIGZvciB2YXJpYWJsZSBsZW5ndGggYXJndW1lbnRzCisJCQkJKCIuLiIge190dHlwZSA9IFRSSVBMRV9ET1Q7fSkKKwkJCSk/CisKKwl8CSgJJzAnIHtpc0RlY2ltYWwgPSB0cnVlO30gLy8gc3BlY2lhbCBjYXNlIGZvciBqdXN0ICcwJworCQkJKAkoJ3gnfCdYJykKKwkJCQkoCQkJCQkJCQkJCQkvLyBoZXgKKwkJCQkJLy8gdGhlICdlJ3wnRScgYW5kIGZsb2F0IHN1ZmZpeCBzdHVmZiBsb29rCisJCQkJCS8vIGxpa2UgaGV4IGRpZ2l0cywgaGVuY2UgdGhlICguLi4pKyBkb2Vzbid0CisJCQkJCS8vIGtub3cgd2hlbiB0byBzdG9wOiBhbWJpZy4gQU5UTFIgcmVzb2x2ZXMKKwkJCQkJLy8gaXQgY29ycmVjdGx5IGJ5IG1hdGNoaW5nIGltbWVkaWF0ZWx5LiBJdAorCQkJCQkvLyBpcyB0aGVyZWZvciBvayB0byBodXNoIHdhcm5pbmcuCisJCQkJCW9wdGlvbnMgeworCQkJCQkJd2FybldoZW5Gb2xsb3dBbWJpZz1mYWxzZTsKKwkJCQkJfQorCQkJCToJSEVYX0RJR0lUCisJCQkJKSsKKworCQkJfAkvL2Zsb2F0IG9yIGRvdWJsZSB3aXRoIGxlYWRpbmcgemVybworCQkJCSgoJzAnLi4nOScpKyAoJy4nfEVYUE9ORU5UfEZMT0FUX1NVRkZJWCkpID0+ICgnMCcuLic5JykrCisKKwkJCXwJKCcwJy4uJzcnKSsJCQkJCQkJCQkvLyBvY3RhbAorCQkJKT8KKwkJfAkoJzEnLi4nOScpICgnMCcuLic5JykqICB7aXNEZWNpbWFsPXRydWU7fQkJLy8gbm9uLXplcm8gZGVjaW1hbAorCQkpCisJCSgJKCdsJ3wnTCcpIHsgX3R0eXBlID0gTlVNX0xPTkc7IH0KKworCQkvLyBvbmx5IGNoZWNrIHRvIHNlZSBpZiBpdCdzIGEgZmxvYXQgaWYgbG9va3MgbGlrZSBkZWNpbWFsIHNvIGZhcgorCQl8CXtpc0RlY2ltYWx9PworCQkJKAknLicgKCcwJy4uJzknKSogKEVYUE9ORU5UKT8gKGYyOkZMT0FUX1NVRkZJWCB7dD1mMjt9KT8KKwkJCXwJRVhQT05FTlQgKGYzOkZMT0FUX1NVRkZJWCB7dD1mMzt9KT8KKwkJCXwJZjQ6RkxPQVRfU1VGRklYIHt0PWY0O30KKwkJCSkKKwkJCXsKKwkJCWlmICh0ICE9IG51bGwgJiYgdC5nZXRUZXh0KCkudG9VcHBlckNhc2UoKSAuaW5kZXhPZignRicpID49IDApIHsKKwkJCQlfdHR5cGUgPSBOVU1fRkxPQVQ7CisJCQl9CisJCQllbHNlIHsKKwkJCQlfdHR5cGUgPSBOVU1fRE9VQkxFOyAvLyBhc3N1bWUgZG91YmxlCisJCQl9CisJCQl9CisJCSk/CisJOworCisvLyBKREsgMS41IHRva2VuIGZvciBhbm5vdGF0aW9ucyBhbmQgdGhlaXIgZGVjbGFyYXRpb25zCitBVAorCToJJ0AnCisJOworCisvLyBhIGNvdXBsZSBwcm90ZWN0ZWQgbWV0aG9kcyB0byBhc3Npc3QgaW4gbWF0Y2hpbmcgZmxvYXRpbmcgcG9pbnQgbnVtYmVycworcHJvdGVjdGVkCitFWFBPTkVOVAorCToJKCdlJ3wnRScpICgnKyd8Jy0nKT8gKCcwJy4uJzknKSsKKwk7CisKKworcHJvdGVjdGVkCitGTE9BVF9TVUZGSVgKKwk6CSdmJ3wnRid8J2QnfCdEJworCTsKKwkJCQorCisvLwkJCSBOb3RlOiBQbGVhc2UgZG9uJ3QgdXNlIHBoeXNpY2FsIHRhYnMuICBMb2dpY2FsIHRhYnMgZm9yIGluZGVudCBhcmUgd2lkdGggNC4KKy8vCQkJIEhlcmUncyBhIGxpdHRsZSBoaW50IGZvciB5b3UsIEVtYWNzOgorLy8JCQkgTG9jYWwgVmFyaWFibGVzOgorLy8JCQkgdGFiLXdpZHRoOiA0CisvLwkJCSBtb2RlOiBhbnRsci1tb2RlCisvLwkJCSBpbmRlbnQtdGFicy1tb2RlOiBuaWwKKy8vCQkJIEVuZDoKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudGxyL3BhY2thZ2UuaHRtbCBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudGxyL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmRhOWU3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsOCBAQAorPGh0bWw+CisgIDxoZWFkPgorICAgIDx0aXRsZT5wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50bHIuKjwvdGl0bGU+CisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgPHA+UGFyc2VyIHJlbGF0ZWQgY2xhc3Nlcy48L3A+CisgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudGxyL3RyZWV3YWxrZXIvQ29tcG9zaXRlVmlzaXRvci5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvdHJlZXdhbGtlci9Db21wb3NpdGVWaXNpdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY5YjU2MgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudGxyL3RyZWV3YWxrZXIvQ29tcG9zaXRlVmlzaXRvci5qYXZhCkBAIC0wLDAgKzEsMTE2MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50bHIudHJlZXdhbGtlcjsKKworaW1wb3J0IGphdmEudXRpbC4qOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hbnRsci5Hcm9vdnlTb3VyY2VBU1Q7CisKKy8qKgorICogQSBjb21wb3NpdGUgb2YgbWFueSB2aXNpdG9ycy4gQW55IGNhbGwgdG8gYSBtZXRob2QgZnJvbSBWaXNpdG9yCisgKiB3aWxsIGludm9rZSBlYWNoIHZpc2l0b3IgaW4gdHVybiwgYW5kIHJldmVyc2UgdGhlIGludm9jYXRpb24KKyAqIG9yZGVyIG9uIGEgY2xvc2luZyB2aXNpdC4KKyAqIGkuZS4KKyAqIHdpdGggdGhlIGxpc3Qgb2YgdmlzaXRvcnMgPSBbYSxiLGNdCisgKiBjb21wb3NpdGUudmlzaXREZWZhdWx0KCkgd291bGQuLi4KKyAqIGNhbGwgb24gdGhlIG9wZW5pbmcgdmlzaXQgLSBhLnZpc2l0RGVmYXVsdCgpIHRoZW4gYi52aXNpdERlZmF1bHQoKSB0aGVuIGMudmlzaXREZWZhdWx0KCkKKyAqIGNhbGwgb24gdGhlIGNsb3NpbmcgdmlzaXQgLSBjLnZpc2l0RGVmYXVsdCgpIHRoZW4gYi52aXNpdERlZmF1bHQoKSB0aGVuIGEudmlzaXREZWZhdWx0KCkKKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpncm9vdnlAcm9zcy1yYXluZXIuY29tIj5KZXJlbXkgUmF5bmVyPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCisKK3B1YmxpYyBjbGFzcyBDb21wb3NpdGVWaXNpdG9yIGltcGxlbWVudHMgVmlzaXRvcnsKKyAgICBmaW5hbCBMaXN0IHZpc2l0b3JzOworICAgIGZpbmFsIExpc3QgYmFja1RvRnJvbnRWaXNpdG9yczsKKyAgICBwcml2YXRlIGZpbmFsIFN0YWNrIHN0YWNrOworCisgICAgLyoqCisgICAgICogQSBjb21wb3NpdGUgb2YgdGhlIHN1cHBsaWVkIGxpc3Qgb2YgYW50bHIgQVNUIHZpc2l0b3JzLgorICAgICAqIEBwYXJhbSB2aXNpdG9ycyBhIExpc3Qgb2YgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBWaXNpdG9yIGludGVyZmFjZQorICAgICAqLworICAgIHB1YmxpYyBDb21wb3NpdGVWaXNpdG9yKExpc3QgdmlzaXRvcnMpIHsKKyAgICAgICAgdGhpcy52aXNpdG9ycyA9IHZpc2l0b3JzOworICAgICAgICB0aGlzLnN0YWNrID0gbmV3IFN0YWNrKCk7CisgICAgICAgIGJhY2tUb0Zyb250VmlzaXRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGJhY2tUb0Zyb250VmlzaXRvcnMuYWRkQWxsKHZpc2l0b3JzKTsKKyAgICAgICAgQ29sbGVjdGlvbnMucmV2ZXJzZShiYWNrVG9Gcm9udFZpc2l0b3JzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEl0ZXJhdG9yIGl0cihpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyPXZpc2l0b3JzLml0ZXJhdG9yKCk7CisgICAgICAgIGlmICh2aXNpdCA9PSBDTE9TSU5HX1ZJU0lUKSB7CisgICAgICAgICAgICBpdHIgPSBiYWNrVG9Gcm9udFZpc2l0b3JzLml0ZXJhdG9yKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGl0cjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gdmlzaXRvcnMuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkuc2V0VXAoKTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRBYnN0cmFjdChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0QWJzdHJhY3QodCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0QW5ub3RhdGlvbihHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0QW5ub3RhdGlvbih0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRBbm5vdGF0aW9ucyhHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0QW5ub3RhdGlvbnModCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0QW5ub3RhdGlvbkFycmF5SW5pdChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0QW5ub3RhdGlvbkFycmF5SW5pdCh0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRBbm5vdGF0aW9uRGVmKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRBbm5vdGF0aW9uRGVmKHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEFubm90YXRpb25GaWVsZERlZihHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0QW5ub3RhdGlvbkZpZWxkRGVmKHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEFubm90YXRpb25NZW1iZXJWYWx1ZVBhaXIoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdEFubm90YXRpb25NZW1iZXJWYWx1ZVBhaXIodCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0QXJyYXlEZWNsYXJhdG9yKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRBcnJheURlY2xhcmF0b3IodCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0QXNzaWduKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRBc3NpZ24odCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0QXQoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdEF0KHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEJhbmQoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdEJhbmQodCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0QmFuZEFzc2lnbihHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0QmFuZEFzc2lnbih0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRCaWdTdWZmaXgoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdEJpZ1N1ZmZpeCh0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRCbG9jayhHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0QmxvY2sodCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0Qm5vdChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0Qm5vdCh0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRCb3IoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdEJvcih0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRCb3JBc3NpZ24oR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdEJvckFzc2lnbih0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRCc3IoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdEJzcih0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRCc3JBc3NpZ24oR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdEJzckFzc2lnbih0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRCeG9yKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRCeG9yKHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEJ4b3JBc3NpZ24oR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdEJ4b3JBc3NpZ24odCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0Q2FzZUdyb3VwKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRDYXNlR3JvdXAodCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0Q2xhc3NEZWYoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdENsYXNzRGVmKHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdENsb3NlZEJsb2NrKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRDbG9zZWRCbG9jayh0LHZpc2l0KTt9CisgICAgfQorCisJcHVibGljIHZvaWQgdmlzaXRDbG9zdXJlTGlzdChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0Q2xvc3VyZUxpc3QodCx2aXNpdCk7fQorCX0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0Q2xvc3VyZU9wKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRDbG9zdXJlT3AodCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0Q29sb24oR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdENvbG9uKHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdENvbW1hKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRDb21tYSh0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRDb21wYXJlVG8oR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdENvbXBhcmVUbyh0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRDdG9yQ2FsbChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0Q3RvckNhbGwodCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0Q3RvcklkZW50KEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRDdG9ySWRlbnQodCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0RGVjKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXREZWModCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0RGlnaXQoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdERpZ2l0KHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdERpdihHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0RGl2KHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdERpdkFzc2lnbihHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0RGl2QXNzaWduKHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdERvbGxhcihHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0RG9sbGFyKHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdERvdChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0RG90KHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdER5bmFtaWNNZW1iZXIoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdER5bmFtaWNNZW1iZXIodCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0RWxpc3QoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdEVsaXN0KHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEVtcHR5U3RhdChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0RW1wdHlTdGF0KHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEVudW1Db25zdGFudERlZihHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0RW51bUNvbnN0YW50RGVmKHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEVudW1EZWYoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdEVudW1EZWYodCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0RW9mKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRFb2YodCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0RXF1YWwoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdEVxdWFsKHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEVzYyhHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0RXNjKHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEV4cG9uZW50KEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRFeHBvbmVudCh0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRFeHByKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRFeHByKHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEV4dGVuZHNDbGF1c2UoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdEV4dGVuZHNDbGF1c2UodCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0RmluYWwoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdEZpbmFsKHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEZsb2F0U3VmZml4KEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRGbG9hdFN1ZmZpeCh0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRGb3JDb25kaXRpb24oR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdEZvckNvbmRpdGlvbih0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRGb3JFYWNoQ2xhdXNlKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRGb3JFYWNoQ2xhdXNlKHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEZvckluaXQoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdEZvckluaXQodCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0Rm9ySW5JdGVyYWJsZShHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0Rm9ySW5JdGVyYWJsZSh0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRGb3JJdGVyYXRvcihHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0Rm9ySXRlcmF0b3IodCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0R2UoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdEdlKHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEd0KEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRHdCh0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRIZXhEaWdpdChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0SGV4RGlnaXQodCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0SWRlbnQoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdElkZW50KHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEltcGxlbWVudHNDbGF1c2UoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdEltcGxlbWVudHNDbGF1c2UodCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0SW1wbGljaXRQYXJhbWV0ZXJzKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRJbXBsaWNpdFBhcmFtZXRlcnModCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0SW1wb3J0KEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRJbXBvcnQodCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0SW5jKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRJbmModCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0SW5kZXhPcChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0SW5kZXhPcCh0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRJbnN0YW5jZUluaXQoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdEluc3RhbmNlSW5pdCh0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRJbnRlcmZhY2VEZWYoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdEludGVyZmFjZURlZih0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRMYWJlbGVkQXJnKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRMYWJlbGVkQXJnKHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdExhYmVsZWRTdGF0KEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRMYWJlbGVkU3RhdCh0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRMYW5kKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRMYW5kKHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdExicmFjayhHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0TGJyYWNrKHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdExjdXJseShHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0TGN1cmx5KHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdExlKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRMZSh0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRMZXR0ZXIoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdExldHRlcih0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRMaXN0Q29uc3RydWN0b3IoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdExpc3RDb25zdHJ1Y3Rvcih0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRMaXRlcmFsQXMoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdExpdGVyYWxBcyh0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRMaXRlcmFsQXNzZXJ0KEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRMaXRlcmFsQXNzZXJ0KHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdExpdGVyYWxCb29sZWFuKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRMaXRlcmFsQm9vbGVhbih0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRMaXRlcmFsQnJlYWsoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdExpdGVyYWxCcmVhayh0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRMaXRlcmFsQnl0ZShHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0TGl0ZXJhbEJ5dGUodCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbENhc2UoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdExpdGVyYWxDYXNlKHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdExpdGVyYWxDYXRjaChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0TGl0ZXJhbENhdGNoKHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdExpdGVyYWxDaGFyKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRMaXRlcmFsQ2hhcih0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRMaXRlcmFsQ2xhc3MoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdExpdGVyYWxDbGFzcyh0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRMaXRlcmFsQ29udGludWUoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdExpdGVyYWxDb250aW51ZSh0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRMaXRlcmFsRGVmKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRMaXRlcmFsRGVmKHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdExpdGVyYWxEZWZhdWx0KEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRMaXRlcmFsRGVmYXVsdCh0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRMaXRlcmFsRG91YmxlKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRMaXRlcmFsRG91YmxlKHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdExpdGVyYWxFbHNlKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRMaXRlcmFsRWxzZSh0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRMaXRlcmFsRW51bShHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0TGl0ZXJhbEVudW0odCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbEV4dGVuZHMoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdExpdGVyYWxFeHRlbmRzKHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdExpdGVyYWxGYWxzZShHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0TGl0ZXJhbEZhbHNlKHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdExpdGVyYWxGaW5hbGx5KEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRMaXRlcmFsRmluYWxseSh0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRMaXRlcmFsRmxvYXQoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdExpdGVyYWxGbG9hdCh0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRMaXRlcmFsRm9yKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRMaXRlcmFsRm9yKHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdExpdGVyYWxJZihHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0TGl0ZXJhbElmKHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdExpdGVyYWxJbXBsZW1lbnRzKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRMaXRlcmFsSW1wbGVtZW50cyh0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRMaXRlcmFsSW1wb3J0KEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRMaXRlcmFsSW1wb3J0KHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdExpdGVyYWxJbihHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0TGl0ZXJhbEluKHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdExpdGVyYWxJbnN0YW5jZW9mKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRMaXRlcmFsSW5zdGFuY2VvZih0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRMaXRlcmFsSW50KEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRMaXRlcmFsSW50KHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdExpdGVyYWxJbnRlcmZhY2UoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdExpdGVyYWxJbnRlcmZhY2UodCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbExvbmcoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdExpdGVyYWxMb25nKHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdExpdGVyYWxOYXRpdmUoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdExpdGVyYWxOYXRpdmUodCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbE5ldyhHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0TGl0ZXJhbE5ldyh0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRMaXRlcmFsTnVsbChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0TGl0ZXJhbE51bGwodCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbFBhY2thZ2UoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdExpdGVyYWxQYWNrYWdlKHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdExpdGVyYWxQcml2YXRlKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRMaXRlcmFsUHJpdmF0ZSh0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRMaXRlcmFsUHJvdGVjdGVkKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRMaXRlcmFsUHJvdGVjdGVkKHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdExpdGVyYWxQdWJsaWMoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdExpdGVyYWxQdWJsaWModCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbFJldHVybihHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0TGl0ZXJhbFJldHVybih0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRMaXRlcmFsU2hvcnQoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdExpdGVyYWxTaG9ydCh0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRMaXRlcmFsU3RhdGljKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRMaXRlcmFsU3RhdGljKHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdExpdGVyYWxTdXBlcihHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0TGl0ZXJhbFN1cGVyKHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdExpdGVyYWxTd2l0Y2goR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdExpdGVyYWxTd2l0Y2godCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbFN5bmNocm9uaXplZChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0TGl0ZXJhbFN5bmNocm9uaXplZCh0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRMaXRlcmFsVGhpcyhHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0TGl0ZXJhbFRoaXModCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbFRocmVhZHNhZmUoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdExpdGVyYWxUaHJlYWRzYWZlKHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdExpdGVyYWxUaHJvdyhHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0TGl0ZXJhbFRocm93KHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdExpdGVyYWxUaHJvd3MoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdExpdGVyYWxUaHJvd3ModCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbFRyYW5zaWVudChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0TGl0ZXJhbFRyYW5zaWVudCh0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRMaXRlcmFsVHJ1ZShHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0TGl0ZXJhbFRydWUodCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbFRyeShHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0TGl0ZXJhbFRyeSh0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRMaXRlcmFsVm9pZChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0TGl0ZXJhbFZvaWQodCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbFZvbGF0aWxlKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRMaXRlcmFsVm9sYXRpbGUodCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbFdoaWxlKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRMaXRlcmFsV2hpbGUodCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0TG5vdChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0TG5vdCh0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRMb3IoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdExvcih0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRMcGFyZW4oR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdExwYXJlbih0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRMdChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0THQodCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0TWFwQ29uc3RydWN0b3IoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdE1hcENvbnN0cnVjdG9yKHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdE1lbWJlclBvaW50ZXIoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdE1lbWJlclBvaW50ZXIodCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0TWV0aG9kQ2FsbChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0TWV0aG9kQ2FsbCh0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRNZXRob2REZWYoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdE1ldGhvZERlZih0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRNaW51cyhHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0TWludXModCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0TWludXNBc3NpZ24oR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdE1pbnVzQXNzaWduKHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdE1sQ29tbWVudChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0TWxDb21tZW50KHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdE1vZChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0TW9kKHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdE1vZGlmaWVycyhHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0TW9kaWZpZXJzKHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdE1vZEFzc2lnbihHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0TW9kQXNzaWduKHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdE5scyhHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0TmxzKHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdE5vdEVxdWFsKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXROb3RFcXVhbCh0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXROdWxsVHJlZUxvb2thaGVhZChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0TnVsbFRyZWVMb29rYWhlYWQodCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0TnVtQmlnRGVjaW1hbChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0TnVtQmlnRGVjaW1hbCh0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXROdW1CaWdJbnQoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdE51bUJpZ0ludCh0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXROdW1Eb3VibGUoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdE51bURvdWJsZSh0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXROdW1GbG9hdChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0TnVtRmxvYXQodCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0TnVtSW50KEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXROdW1JbnQodCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0TnVtTG9uZyhHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0TnVtTG9uZyh0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRPYmpibG9jayhHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0T2JqYmxvY2sodCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0T25lTmwoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdE9uZU5sKHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdE9wdGlvbmFsRG90KEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRPcHRpb25hbERvdCh0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRQYWNrYWdlRGVmKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRQYWNrYWdlRGVmKHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFBhcmFtZXRlcnMoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdFBhcmFtZXRlcnModCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0UGFyYW1ldGVyRGVmKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRQYXJhbWV0ZXJEZWYodCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0UGx1cyhHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0UGx1cyh0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRQbHVzQXNzaWduKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRQbHVzQXNzaWduKHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFBvc3REZWMoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdFBvc3REZWModCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0UG9zdEluYyhHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0UG9zdEluYyh0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRRdWVzdGlvbihHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0UXVlc3Rpb24odCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0UmFuZ2VFeGNsdXNpdmUoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdFJhbmdlRXhjbHVzaXZlKHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFJhbmdlSW5jbHVzaXZlKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRSYW5nZUluY2x1c2l2ZSh0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRSYnJhY2soR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdFJicmFjayh0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRSY3VybHkoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdFJjdXJseSh0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRSZWdleHBDdG9yRW5kKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRSZWdleHBDdG9yRW5kKHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFJlZ2V4cExpdGVyYWwoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdFJlZ2V4cExpdGVyYWwodCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0UmVnZXhwU3ltYm9sKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRSZWdleHBTeW1ib2wodCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0UmVnZXhGaW5kKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRSZWdleEZpbmQodCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0UmVnZXhNYXRjaChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0UmVnZXhNYXRjaCh0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRScGFyZW4oR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdFJwYXJlbih0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRTZWxlY3RTbG90KEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRTZWxlY3RTbG90KHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFNlbWkoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdFNlbWkodCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0U2hDb21tZW50KEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRTaENvbW1lbnQodCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0U2woR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdFNsKHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFNsaXN0KEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRTbGlzdCh0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRTbEFzc2lnbihHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0U2xBc3NpZ24odCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0U2xDb21tZW50KEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRTbENvbW1lbnQodCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0U3ByZWFkQXJnKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRTcHJlYWRBcmcodCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0U3ByZWFkRG90KEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRTcHJlYWREb3QodCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0U3ByZWFkTWFwQXJnKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRTcHJlYWRNYXBBcmcodCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0U3IoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdFNyKHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFNyQXNzaWduKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRTckFzc2lnbih0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRTdGFyKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRTdGFyKHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFN0YXJBc3NpZ24oR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdFN0YXJBc3NpZ24odCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0U3RhclN0YXIoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdFN0YXJTdGFyKHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFN0YXJTdGFyQXNzaWduKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRTdGFyU3RhckFzc2lnbih0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRTdGF0aWNJbXBvcnQoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdFN0YXRpY0ltcG9ydCh0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRTdGF0aWNJbml0KEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRTdGF0aWNJbml0KHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFN0cmljdGZwKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRTdHJpY3RmcCh0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRTdHJpbmdDaChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0U3RyaW5nQ2godCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0U3RyaW5nQ29uc3RydWN0b3IoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdFN0cmluZ0NvbnN0cnVjdG9yKHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFN0cmluZ0N0b3JFbmQoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdFN0cmluZ0N0b3JFbmQodCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0U3RyaW5nQ3Rvck1pZGRsZShHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0U3RyaW5nQ3Rvck1pZGRsZSh0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRTdHJpbmdDdG9yU3RhcnQoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdFN0cmluZ0N0b3JTdGFydCh0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRTdHJpbmdMaXRlcmFsKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRTdHJpbmdMaXRlcmFsKHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFN0cmluZ05sKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRTdHJpbmdObCh0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRTdXBlckN0b3JDYWxsKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRTdXBlckN0b3JDYWxsKHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFRyaXBsZURvdChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0VHJpcGxlRG90KHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFR5cGUoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdFR5cGUodCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0VHlwZWNhc3QoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdFR5cGVjYXN0KHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFR5cGVBcmd1bWVudChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0VHlwZUFyZ3VtZW50KHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFR5cGVBcmd1bWVudHMoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdFR5cGVBcmd1bWVudHModCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0VHlwZUxvd2VyQm91bmRzKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRUeXBlTG93ZXJCb3VuZHModCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0VHlwZVBhcmFtZXRlcihHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0VHlwZVBhcmFtZXRlcih0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRUeXBlUGFyYW1ldGVycyhHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0VHlwZVBhcmFtZXRlcnModCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0VHlwZVVwcGVyQm91bmRzKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRUeXBlVXBwZXJCb3VuZHModCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0VW5hcnlNaW51cyhHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0VW5hcnlNaW51cyh0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRVbmFyeVBsdXMoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdFVuYXJ5UGx1cyh0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRVbnVzZWRDb25zdChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0VW51c2VkQ29uc3QodCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0VW51c2VkRG8oR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdFVudXNlZERvKHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFVudXNlZEdvdG8oR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdFVudXNlZEdvdG8odCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0VmFyaWFibGVEZWYoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdFZhcmlhYmxlRGVmKHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFZhcmlhYmxlUGFyYW1ldGVyRGVmKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRWYXJpYWJsZVBhcmFtZXRlckRlZih0LHZpc2l0KTt9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRWb2NhYihHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGl0cih2aXNpdCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnZpc2l0Vm9jYWIodCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0V2lsZGNhcmRUeXBlKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gaXRyKHZpc2l0KTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkudmlzaXRXaWxkY2FyZFR5cGUodCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0V3MoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdFdzKHQsdmlzaXQpO30KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdERlZmF1bHQoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBpdHIodmlzaXQpOworICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgeygoVmlzaXRvcilpdHIubmV4dCgpKS52aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgeworICAgICAgICBJdGVyYXRvciBpdHIgPSBiYWNrVG9Gcm9udFZpc2l0b3JzLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7KChWaXNpdG9yKWl0ci5uZXh0KCkpLnRlYXJEb3duKCk7fQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHB1c2goR3Jvb3Z5U291cmNlQVNUIHQpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRyID0gdmlzaXRvcnMuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsoKFZpc2l0b3IpaXRyLm5leHQoKSkucHVzaCh0KTt9CisgICAgfQorICAgIHB1YmxpYyBHcm9vdnlTb3VyY2VBU1QgcG9wKCkgeworICAgICAgICBHcm9vdnlTb3VyY2VBU1QgbGFzdE5vZGVQb3BwZWQgPSBudWxsOworICAgICAgICBJdGVyYXRvciBpdHIgPSBiYWNrVG9Gcm9udFZpc2l0b3JzLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7bGFzdE5vZGVQb3BwZWQgPSAoR3Jvb3Z5U291cmNlQVNUKSAoKFZpc2l0b3IpaXRyLm5leHQoKSkucG9wKCk7fQorICAgICAgICByZXR1cm4gbGFzdE5vZGVQb3BwZWQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvdHJlZXdhbGtlci9GbGF0Tm9kZUxpc3RUcmF2ZXJzYWwuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudGxyL3RyZWV3YWxrZXIvRmxhdE5vZGVMaXN0VHJhdmVyc2FsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNlYzFhZQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudGxyL3RyZWV3YWxrZXIvRmxhdE5vZGVMaXN0VHJhdmVyc2FsLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50bHIudHJlZXdhbGtlcjsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50bHIuQW50bHJBU1RQcm9jZXNzb3I7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hbnRsci5Hcm9vdnlTb3VyY2VBU1Q7CisKK2ltcG9ydCBhbnRsci5jb2xsZWN0aW9ucy5BU1Q7CisKKy8qKgorICogQSBzaW1wbGUgaXRlcmF0b3Igb3ZlciBhbiBvcmRlcmVkIChmbGF0KSBMaXN0IG9mIHRoZSBub2RlcyBvZiB0aGUgQVNULgorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmdyb292eUByb3NzLXJheW5lci5jb20iPkplcmVteSBSYXluZXI8L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb246IDM2MjYgJAorICovCitwdWJsaWMgY2xhc3MgRmxhdE5vZGVMaXN0VHJhdmVyc2FsIGV4dGVuZHMgVHJhdmVyc2FsSGVscGVyIHsKKyAgICAKKyAgICBwdWJsaWMgRmxhdE5vZGVMaXN0VHJhdmVyc2FsKFZpc2l0b3IgdmlzaXRvcikgeworICAgICAgICBzdXBlcih2aXNpdG9yKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQVNUIHByb2Nlc3MoQVNUIHQpIHsKKyAgICAgICAgR3Jvb3Z5U291cmNlQVNUIG5vZGUgPSAoR3Jvb3Z5U291cmNlQVNUKSB0OworCisgICAgICAgIC8vIGZldGNoIGFsbCB0aGUgbm9kZXMgaW4gdGhpcyBBU1QgaW50byBhIExpc3QKKyAgICAgICAgTm9kZUNvbGxlY3RvciBjb2xsZWN0b3IgPSBuZXcgTm9kZUNvbGxlY3RvcigpOworICAgICAgICBBbnRsckFTVFByb2Nlc3NvciBpbnRlcm5hbFRyYXZlcnNhbCA9IG5ldyBQcmVPcmRlclRyYXZlcnNhbChjb2xsZWN0b3IpOworICAgICAgICBpbnRlcm5hbFRyYXZlcnNhbC5wcm9jZXNzKHQpOworICAgICAgICBMaXN0IGxpc3RPZkFsbE5vZGVzSW5UaGlzQVNUID0gY29sbGVjdG9yLmdldE5vZGVzKCk7CisgICAgICAgIAorICAgICAgICAvLyBwcm9jZXNzIGVhY2ggbm9kZSBpbiB0dXJuCisgICAgICAgIHNldFVwKG5vZGUpOyAgICAgICAgCisgICAgICAgIEl0ZXJhdG9yIGl0ciA9IGxpc3RPZkFsbE5vZGVzSW5UaGlzQVNULml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7CisgICAgICAgIAlHcm9vdnlTb3VyY2VBU1QgY3VycmVudE5vZGUgPSAoR3Jvb3Z5U291cmNlQVNUKSBpdHIubmV4dCgpOworICAgICAgICAJYWNjZXB0KGN1cnJlbnROb2RlKTsKKyAgICAgICAgfQorICAgICAgICB0ZWFyRG93bihub2RlKTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisJcHJvdGVjdGVkIHZvaWQgYWNjZXB0KEdyb292eVNvdXJjZUFTVCBjdXJyZW50Tm9kZSkgeworICAgIAlvcGVuaW5nVmlzaXQoY3VycmVudE5vZGUpOworICAgIAljbG9zaW5nVmlzaXQoY3VycmVudE5vZGUpOworCX0gICAgCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci90cmVld2Fsa2VyL01pbmRNYXBQcmludGVyLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci90cmVld2Fsa2VyL01pbmRNYXBQcmludGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUyMjJjOQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudGxyL3RyZWV3YWxrZXIvTWluZE1hcFByaW50ZXIuamF2YQpAQCAtMCwwICsxLDM3NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50bHIudHJlZXdhbGtlcjsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50bHIuR3Jvb3Z5U291cmNlQVNUOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50bHIuTGluZUNvbHVtbjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudGxyLlNvdXJjZUJ1ZmZlcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudGxyLnBhcnNlci5Hcm9vdnlUb2tlblR5cGVzOworCitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKKworLyoqCisgKiBBbiBhbnRsciBBU1QgdmlzaXRvciB0aGF0IHByaW50cyBhIGZvcm1hdCBzdWl0YWJsZSBmb3Igdmlld2luZyBpbiBodHRwOi8vZnJlZW1pbmQuc291cmNlZm9yZ2UubmV0CisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Z3Jvb3Z5QHJvc3MtcmF5bmVyLmNvbSI+SmVyZW15IFJheW5lcjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworCitwdWJsaWMgY2xhc3MgTWluZE1hcFByaW50ZXIgZXh0ZW5kcyBWaXNpdG9yQWRhcHRlciB7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSB0b2tlbk5hbWVzOworICAgIHByaXZhdGUgZmluYWwgUHJpbnRTdHJlYW0gb3V0OworICAgIHByaXZhdGUgaW50IGRlcHRoOworICAgIHByaXZhdGUgU291cmNlQnVmZmVyIHNvdXJjZUJ1ZmZlcjsKKworICAgIC8qKgorICAgICAqIEEgdmlzaXRvciB0aGF0IHByaW50cyBhIGZvcm1hdCBzdWl0YWJsZSBmb3Igdmlld2luZyBpbiBodHRwOi8vZnJlZW1pbmQuc291cmNlZm9yZ2UubmV0CisgICAgICogQHBhcmFtIG91dCB3aGVyZSB0byBwcmludCB0aGUgbWluZG1hcCBmaWxlIGNvbnRlbnRzIHRvCisgICAgICogQHBhcmFtIHRva2VuTmFtZXMgYW4gYXJyYXkgb2YgdG9rZW4gbmFtZXMgZnJvbSBhbnRscgorICAgICAqLworCisgICAgcHVibGljIE1pbmRNYXBQcmludGVyKFByaW50U3RyZWFtIG91dCxTdHJpbmdbXSB0b2tlbk5hbWVzKSB7CisgICAgICAgIHRoaXMudG9rZW5OYW1lcyA9IHRva2VuTmFtZXM7CisgICAgICAgIHRoaXMub3V0ID0gb3V0OworICAgIH0KKworICAgIHB1YmxpYyBNaW5kTWFwUHJpbnRlcihQcmludFN0cmVhbSBvdXQsU3RyaW5nW10gdG9rZW5OYW1lcywgU291cmNlQnVmZmVyIHNvdXJjZUJ1ZmZlcikgeworICAgICAgICB0aGlzLnRva2VuTmFtZXMgPSB0b2tlbk5hbWVzOworICAgICAgICB0aGlzLm91dCA9IG91dDsKKyAgICAgICAgdGhpcy5zb3VyY2VCdWZmZXIgPSBzb3VyY2VCdWZmZXI7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBkZXB0aCA9IDA7CisgICAgICAgIG91dC5wcmludGxuKCI8bWFwIHZlcnNpb249JzAuNy4xJz48bm9kZSBURVhUPSdBU1QnPiIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0RGVmYXVsdChHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHsKKyAgICAgICAgaWYgKHZpc2l0ID09IE9QRU5JTkdfVklTSVQpIHsKKyAgICAgICAgICAgIGRlcHRoKys7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGdldE5hbWUodCk7CisgICAgICAgICAgICBTdHJpbmcgY29sb3VyID0gZ2V0Q29sb3VyKHQpOworICAgICAgICAgICAgU3RyaW5nIGZvbGRlZCA9IGdldEZvbGRlZCh0KTsKKyAgICAgICAgICAgIG91dC5wcmludCgiPG5vZGUgVEVYVD0nIiArIG5hbWUgKyAiJyBQT1NJVElPTj0ncmlnaHQnIiArIGNvbG91ciArIGZvbGRlZCArICI+Iik7CisgICAgICAgIH0gZWxzZSBpZiAodmlzaXQgPT0gQ0xPU0lOR19WSVNJVCkgeworICAgICAgICAgICAgb3V0LnByaW50bG4oIjwvbm9kZT4iKTsKKyAgICAgICAgICAgIGRlcHRoLS07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKKyAgICAgICAgb3V0LnByaW50bG4oIjwvbm9kZT48L21hcD4iKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRGb2xkZWQoR3Jvb3Z5U291cmNlQVNUIHQpIHsKKyAgICAgICAgaWYgKGRlcHRoID4gMiAmJiB0LmdldE51bWJlck9mQ2hpbGRyZW4oKSA+IDApIHsKKyAgICAgICAgICAgIHN3aXRjaCAodC5nZXRUeXBlKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuRVhQUiA6CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLk1FVEhPRF9ERUYgOgorICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5WQVJJQUJMRV9ERUYgOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiBGT0xERUQ9J3RydWUnIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAodC5nZXRUeXBlKCkgPT0gR3Jvb3Z5VG9rZW5UeXBlcy5JTVBPUlQpIHsKKyAgICAgICAgICAgIHJldHVybiAiIEZPTERFRD0ndHJ1ZSciOworICAgICAgICB9CisgICAgICAgIHJldHVybiAiIjsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRDb2xvdXIoR3Jvb3Z5U291cmNlQVNUIHQpIHsKKyAgICAgICAgU3RyaW5nIGNvbG91ciA9ICIiOworICAgICAgICBTdHJpbmcgYmxhY2sgPSAiIENPTE9SPVwiIzAwMDAwMFwiIjsKKyAgICAgICAgU3RyaW5nIGN5YW4gPSAiIENPTE9SPVwiIzAwNjY5OVwiIjsKKyAgICAgICAgU3RyaW5nIGJsdWUgPSAiIENPTE9SPVwiIzE3MTc4QlwiIjsKKyAgICAgICAgU3RyaW5nIGdyZWVuID0gIiBDT0xPUj1cIiMwMDgwMDBcIiI7CisgICAgICAgIHN3aXRjaCAodC5nZXRUeXBlKCkpIHsKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5BQlNUUkFDVCAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuQU5OT1RBVElPTiAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkFOTk9UQVRJT05TICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5BTk5PVEFUSU9OX0FSUkFZX0lOSVQgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuQU5OT1RBVElPTl9ERUYgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkFOTk9UQVRJT05fRklFTERfREVGICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5BTk5PVEFUSU9OX01FTUJFUl9WQUxVRV9QQUlSICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuQVJSQVlfREVDTEFSQVRPUiAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkFTU0lHTiAgICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5BVCAgICAgICAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuQkFORCAgICAgICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkJBTkRfQVNTSUdOICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5CSUdfU1VGRklYICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuQkxPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkJOT1QgICAgICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5CT1IgICAgICAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuQk9SX0FTU0lHTiAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkJTUiAgICAgICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5CU1JfQVNTSUdOICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuQlhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkJYT1JfQVNTSUdOICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5DQVNFX0dST1VQICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuQ0xPU0FCTEVfQkxPQ0sgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkNMT1NBQkxFX0JMT0NLX09QICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5DT0xPTiAgICAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuQ09NTUEgICAgICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkNPTVBBUkVfVE8gICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5DVE9SX0NBTEwgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuQ1RPUl9JREVOVCAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkRFQyAgICAgICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5ESUdJVCAgICAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuRElWICAgICAgICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkRJVl9BU1NJR04gICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5ET0xMQVIgICAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuRE9UICAgICAgICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkRZTkFNSUNfTUVNQkVSICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5FTElTVCAgICAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuRU1QVFlfU1RBVCAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkVOVU1fQ09OU1RBTlRfREVGICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5FTlVNX0RFRiAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuRU9GICAgICAgICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkVRVUFMICAgICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5FU0MgICAgICAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuRVhQT05FTlQgICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkVYUFIgICAgICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5GSU5BTCAgICAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuRkxPQVRfU1VGRklYICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkZPUl9DT05ESVRJT04gICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5GT1JfRUFDSF9DTEFVU0UgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuRk9SX0lOSVQgICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkZPUl9JTl9JVEVSQUJMRSAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5GT1JfSVRFUkFUT1IgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkdUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5IRVhfRElHSVQgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuSU1QTElDSVRfUEFSQU1FVEVSUyAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLklOQyAgICAgICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5JTkRFWF9PUCAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuSU5TVEFOQ0VfSU5JVCAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLklOVEVSRkFDRV9ERUYgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MQUJFTEVEX0FSRyAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTEFCRUxFRF9TVEFUICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxBTkQgICAgICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MQlJBQ0sgICAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTENVUkxZICAgICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MRVRURVIgICAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElTVF9DT05TVFJVQ1RPUiAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxOT1QgICAgICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MT1IgICAgICAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTFBBUkVOICAgICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5NQVBfQ09OU1RSVUNUT1IgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTUVNQkVSX1BPSU5URVIgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLk1FVEhPRF9DQUxMICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5NRVRIT0RfREVGICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTUlOVVMgICAgICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLk1JTlVTX0FTU0lHTiAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5NTF9DT01NRU5UICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTU9EICAgICAgICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLk1PRElGSUVSUyAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5NT0RfQVNTSUdOICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTkxTICAgICAgICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLk5PVF9FUVVBTCAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5OVUxMX1RSRUVfTE9PS0FIRUFEICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTlVNX0JJR19ERUNJTUFMICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLk5VTV9CSUdfSU5UICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5OVU1fRE9VQkxFICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTlVNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLk5VTV9JTlQgICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5OVU1fTE9ORyAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuT0JKQkxPQ0sgICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLk9ORV9OTCAgICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5PUFRJT05BTF9ET1QgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuUEFSQU1FVEVSUyAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlBBUkFNRVRFUl9ERUYgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5QTFVTICAgICAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuUExVU19BU1NJR04gICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlBPU1RfREVDICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5QT1NUX0lOQyAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuUVVFU1RJT04gICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlJBTkdFX0VYQ0xVU0lWRSAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5SQU5HRV9JTkNMVVNJVkUgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuUkJSQUNLICAgICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlJDVVJMWSAgICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5SRUdFWFBfQ1RPUl9FTkQgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuUkVHRVhQX1NZTUJPTCAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlJFR0VYX0ZJTkQgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5SRUdFWF9NQVRDSCAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuUlBBUkVOICAgICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlNFTEVDVF9TTE9UICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5TRU1JICAgICAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuU0hfQ09NTUVOVCAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlNMICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5TTElTVCAgICAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuU0xfQVNTSUdOICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlNMX0NPTU1FTlQgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5TUFJFQURfQVJHICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuU1BSRUFEX0RPVCAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlNQUkVBRF9NQVBfQVJHICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5TUiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuU1JfQVNTSUdOICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlNUQVIgICAgICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5TVEFSX0FTU0lHTiAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuU1RBUl9TVEFSICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlNUQVJfU1RBUl9BU1NJR04gICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5TVEFUSUNfSU1QT1JUICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuU1RBVElDX0lOSVQgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlNUUklDVEZQICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5TVFJJTkdfQ0ggICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuU1RSSU5HX0NPTlNUUlVDVE9SICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlNUUklOR19DVE9SX0VORCAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5TVFJJTkdfQ1RPUl9NSURETEUgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuU1RSSU5HX0NUT1JfU1RBUlQgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlNUUklOR19OTCAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5TVVBFUl9DVE9SX0NBTEwgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuVFJJUExFX0RPVCAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlRZUEVDQVNUICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5UWVBFX0FSR1VNRU5UICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuVFlQRV9BUkdVTUVOVFMgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlRZUEVfTE9XRVJfQk9VTkRTICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5UWVBFX1BBUkFNRVRFUiAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuVFlQRV9QQVJBTUVURVJTICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlRZUEVfVVBQRVJfQk9VTkRTICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5VTkFSWV9NSU5VUyAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuVU5BUllfUExVUyAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlVOVVNFRF9DT05TVCAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5VTlVTRURfRE8gICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuVU5VU0VEX0dPVE8gICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlZBUklBQkxFX0RFRiAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5WQVJJQUJMRV9QQVJBTUVURVJfREVGICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuVk9DQUIgICAgICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLldJTERDQVJEX1RZUEUgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5XUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICAgICAgY29sb3VyID0gYmxhY2s7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5TVFJJTkdfTElURVJBTCAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuUkVHRVhQX0xJVEVSQUwgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgICAgIGNvbG91ciA9IGdyZWVuOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuQ0xBU1NfREVGICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkVYVEVORFNfQ0xBVVNFICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5JTVBMRU1FTlRTX0NMQVVTRSAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuSU1QT1JUICAgICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfYXMgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX2Fzc2VydCAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF9ib29sZWFuICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfYnJlYWsgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX2J5dGUgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF9jYXNlICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfY2F0Y2ggICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX2NoYXIgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF9jbGFzcyAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfY29udGludWUgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX2RlZiAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF9kZWZhdWx0ICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfZG91YmxlICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX2Vsc2UgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF9lbnVtICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfZXh0ZW5kcyAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX2ZhbHNlICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF9maW5hbGx5ICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfZmxvYXQgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX2ZvciAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF9pZiAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfaW1wbGVtZW50cyAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX2ltcG9ydCAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF9pbiAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfaW5zdGFuY2VvZiAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX2ludCAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF9pbnRlcmZhY2UgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfbG9uZyAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX25hdGl2ZSAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF9uZXcgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfbnVsbCAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX3BhY2thZ2UgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF9wcml2YXRlICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfcHJvdGVjdGVkICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX3B1YmxpYyAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF9yZXR1cm4gICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfc2hvcnQgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX3N0YXRpYyAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF9zdXBlciAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfc3dpdGNoICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX3N5bmNocm9uaXplZCAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF90aGlzICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfdGhyZWFkc2FmZSAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX3Rocm93ICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF90aHJvd3MgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfdHJhbnNpZW50ICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX3RydWUgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF90cnkgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfdm9pZCAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX3ZvbGF0aWxlICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF93aGlsZSAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlBBQ0tBR0VfREVGICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICAgICAgY29sb3VyID0gYmx1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLklERU5UICAgICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgICAgICBjb2xvdXIgPSBjeWFuOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGNvbG91ciA9IGJsYWNrOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gbGVhZiBub2RlcyB0aGF0IGhhdmVuJ3QgYmVlbiBjb2xvdXJlZCB5ZXQKKyAgICAgICAgaWYgKGJsYWNrLmVxdWFscyhjb2xvdXIpICYmIHQuZ2V0TnVtYmVyT2ZDaGlsZHJlbigpID09IDApIHsKKyAgICAgICAgICAgIGNvbG91ciA9IGN5YW47CisgICAgICAgIH0KKworCisKKyAgICAgICAgcmV0dXJuIGNvbG91cjsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXROYW1lKEdyb292eVNvdXJjZUFTVCB0KSB7CisgICAgICAgIFN0cmluZyBuYW1lID0gdG9rZW5OYW1lc1t0LmdldFR5cGUoKV0gKyAiIDwiICsgdC5nZXRUeXBlKCkgKyAiPiI7CisgICAgICAgIGlmICghKGVzY2FwZSh0b2tlbk5hbWVzW3QuZ2V0VHlwZSgpXSkuZXF1YWxzKGVzY2FwZSh0LmdldFRleHQoKSkpKSkgeworICAgICAgICAgICAgbmFtZSA9IG5hbWUgKyAiIDogIiArIHQuZ2V0VGV4dCgpOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAodC5nZXRUeXBlKCkpIHsKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5NRVRIT0RfREVGIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5WQVJJQUJMRV9ERUYgOgorICAgICAgICAgICAgICAgIEdyb292eVNvdXJjZUFTVCBpZGVudE5vZGUgPSB0LmNoaWxkT2ZUeXBlKEdyb292eVRva2VuVHlwZXMuSURFTlQpOworICAgICAgICAgICAgICAgIGlmIChpZGVudE5vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBuYW1lID0gbmFtZSArICIgOiAiICsgaWRlbnROb2RlLmdldFRleHQoKSArICIiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBuYW1lID0gZXNjYXBlKG5hbWUpOworICAgICAgICBpZiAoc291cmNlQnVmZmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG5hbWUgKz0gIiYjeGE7IjsKKyAgICAgICAgICAgIG5hbWUgKz0gdC5nZXRMaW5lKCkgKyAiLCIgKyB0LmdldENvbHVtbigpICsgIiAtICIgKyB0LmdldExpbmVMYXN0KCkgKyAiLCIgKyB0LmdldENvbHVtbkxhc3QoKTsKKyAgICAgICAgICAgIG5hbWUgKz0gIiYjeGE7IjsKKyAgICAgICAgICAgIG5hbWUgKz0gZXNjYXBlKHNvdXJjZUJ1ZmZlci5nZXRTbmlwcGV0KG5ldyBMaW5lQ29sdW1uKHQuZ2V0TGluZSgpLCB0LmdldENvbHVtbigpKSwgbmV3IExpbmVDb2x1bW4odC5nZXRMaW5lTGFzdCgpLCB0LmdldENvbHVtbkxhc3QoKSkpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBlc2NhcGUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisgICAgICAgIC8vIHJlbW92ZSBtaWRkbGUgb2YgbGFyZ2UgYml0cyBvZiB0ZXh0CisgICAgICAgIGlmIChuYW1lLmxlbmd0aCgpID4gMjAwKSB7CisgICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMCwxMDApICsgIiAuLi4uLiAiICsgbmFtZS5zdWJzdHJpbmcobmFtZS5sZW5ndGgoKSAtIDEwMCk7CisgICAgICAgIH0KKyAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgnIicsJyAnKTsKKyAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgnXCcnLCcgJyk7CisgICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2VBbGwoIiYiLCImYW1wOyIpOworICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlQWxsKCI8IiwiJmx0OyIpOworICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlQWxsKCI+IiwiJmd0OyIpOworICAgICAgICBuYW1lID0gbmFtZS50cmltKCk7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudGxyL3RyZWV3YWxrZXIvTm9kZUFzSFRNTFByaW50ZXIuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudGxyL3RyZWV3YWxrZXIvTm9kZUFzSFRNTFByaW50ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjliNjIyCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvdHJlZXdhbGtlci9Ob2RlQXNIVE1MUHJpbnRlci5qYXZhCkBAIC0wLDAgKzEsMzE2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5hbnRsci50cmVld2Fsa2VyOworCitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudGxyLkdyb292eVNvdXJjZUFTVDsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudGxyLnBhcnNlci5Hcm9vdnlUb2tlblR5cGVzOworCisvKioKKyAqIEEgdmlzaXRvciB0aGF0IHByaW50cyBhIGh0bWwgdGFncyBvZiBlYWNoIG5vZGUgdG8gdGhlIHN1cHBsaWVkIFByaW50U3RyZWFtCisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Z3Jvb3Z5QHJvc3MtcmF5bmVyLmNvbSI+SmVyZW15IFJheW5lcjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworCitwdWJsaWMgY2xhc3MgTm9kZUFzSFRNTFByaW50ZXIgZXh0ZW5kcyBWaXNpdG9yQWRhcHRlciB7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSB0b2tlbk5hbWVzOworICAgIHByaXZhdGUgZmluYWwgUHJpbnRTdHJlYW0gb3V0OworICAgIHByaXZhdGUgZmluYWwgU3RhY2sgc3RhY2s7CisKKyAgICAvKioKKyAgICAgKiBBIHZpc2l0b3IgdGhhdCBwcmludHMgYSBodG1sIHRhZ3MsIGZvciBlYWNoIG5vZGUsIHRvIHRoZSBzdXBwbGllZCBQcmludFN0cmVhbS4KKyAgICAgKiBAcGFyYW0gb3V0IHN1cHBsaWVkIFByaW50U3RyZWFtIHRvIG91dHB1dCBub2RlcyB0bworICAgICAqIEBwYXJhbSB0b2tlbk5hbWVzIGFuIGFycmF5IG9mIHRva2VuIG5hbWVzIHRvIHVzZQorICAgICAqLworICAgIHB1YmxpYyBOb2RlQXNIVE1MUHJpbnRlcihQcmludFN0cmVhbSBvdXQsU3RyaW5nW10gdG9rZW5OYW1lcykgeworICAgICAgICB0aGlzLnRva2VuTmFtZXMgPSB0b2tlbk5hbWVzOworICAgICAgICB0aGlzLm91dCA9IG91dDsKKyAgICAgICAgdGhpcy5zdGFjayA9IG5ldyBTdGFjaygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBvdXQucHJpbnRsbigiPGh0bWw+PGhlYWQ+PC9oZWFkPjxib2R5PjxwcmU+Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXREZWZhdWx0KEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkgeworICAgICAgICBpZiAodmlzaXQgPT0gT1BFTklOR19WSVNJVCkgeworICAgICAgICAgICAgb3V0LnByaW50KCI8Y29kZSB0aXRsZT0iICsgcXVvdGUodG9rZW5OYW1lc1t0LmdldFR5cGUoKV0pICsgIj48Zm9udCBjb2xvcj0nIyIgKyBjb2xvdXIodCkgKyAiJz4iKTsKKyAgICAgICAgfSBlbHNlIGlmICh2aXNpdCA9PSBDTE9TSU5HX1ZJU0lUKSB7CisgICAgICAgICAgICBvdXQucHJpbnQoIjwvZm9udD48L2NvZGU+Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBxdW90ZShTdHJpbmcgdG9rZW5OYW1lKSB7CisgICAgICAgIGlmICh0b2tlbk5hbWUubGVuZ3RoKCkgPiAwICYmIHRva2VuTmFtZS5jaGFyQXQoMCkgIT0gJ1wnJykKKyAgICAgICAgICAgIHJldHVybiAiJyIgKyB0b2tlbk5hbWUgKyAiJyI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiAiXCIiICsgdG9rZW5OYW1lICsgIlwiIjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKKyAgICAgICAgb3V0LnByaW50bG4oIjwvcHJlPjwvYm9keT48L2h0bWw+Iik7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgY29sb3VyKEdyb292eVNvdXJjZUFTVCB0KSB7CisgICAgICAgIFN0cmluZyBibGFjayA9ICIwMDAwMDAiOworICAgICAgICBTdHJpbmcgYmx1ZSA9ICIxNzE3OEIiOworICAgICAgICBTdHJpbmcgZ3JlZW4gPSAiMDA4MDAwIjsKKyAgICAgICAgLy9TdHJpbmcgcHVycGxlID0gIjdDMzA4RCI7CisgICAgICAgIFN0cmluZyBjb2xvdXIgPSBibGFjazsKKyAgICAgICAgc3dpdGNoICh0LmdldFR5cGUoKSkgeworICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkFCU1RSQUNUICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5BTk5PVEFUSU9OICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuQU5OT1RBVElPTlMgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkFOTk9UQVRJT05fQVJSQVlfSU5JVCAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5BTk5PVEFUSU9OX0RFRiAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuQU5OT1RBVElPTl9GSUVMRF9ERUYgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkFOTk9UQVRJT05fTUVNQkVSX1ZBTFVFX1BBSVIgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5BUlJBWV9ERUNMQVJBVE9SICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuQVNTSUdOICAgICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkFUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5CQU5EICAgICAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuQkFORF9BU1NJR04gICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkJJR19TVUZGSVggICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5CTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuQk5PVCAgICAgICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5CT1JfQVNTSUdOICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuQlNSICAgICAgICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkJTUl9BU1NJR04gICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5CWE9SICAgICAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuQlhPUl9BU1NJR04gICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkNBU0VfR1JPVVAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5DTE9TQUJMRV9CTE9DSyAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuQ0xPU0FCTEVfQkxPQ0tfT1AgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkNPTE9OICAgICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5DT01NQSAgICAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuQ09NUEFSRV9UTyAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkNUT1JfQ0FMTCAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5DVE9SX0lERU5UICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuREVDICAgICAgICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkRJR0lUICAgICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5ESVYgICAgICAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuRElWX0FTU0lHTiAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkRPTExBUiAgICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5ET1QgICAgICAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuRFlOQU1JQ19NRU1CRVIgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkVMSVNUICAgICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5FTVBUWV9TVEFUICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuRU5VTV9DT05TVEFOVF9ERUYgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkVOVU1fREVGICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5FT0YgICAgICAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuRVFVQUwgICAgICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkVTQyAgICAgICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5FWFBPTkVOVCAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuRVhQUiAgICAgICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkZJTkFMICAgICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5GTE9BVF9TVUZGSVggICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuRk9SX0NPTkRJVElPTiAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkZPUl9FQUNIX0NMQVVTRSAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5GT1JfSU5JVCAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuRk9SX0lOX0lURVJBQkxFICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkZPUl9JVEVSQVRPUiAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5HRSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuR1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkhFWF9ESUdJVCAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5JREVOVCAgICAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuSU1QTElDSVRfUEFSQU1FVEVSUyAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLklOQyAgICAgICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5JTkRFWF9PUCAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuSU5TVEFOQ0VfSU5JVCAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLklOVEVSRkFDRV9ERUYgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MQUJFTEVEX0FSRyAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTEFCRUxFRF9TVEFUICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxBTkQgICAgICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MQlJBQ0sgICAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTENVUkxZICAgICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MRVRURVIgICAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElTVF9DT05TVFJVQ1RPUiAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxOT1QgICAgICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MT1IgICAgICAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTFBBUkVOICAgICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5NQVBfQ09OU1RSVUNUT1IgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTUVNQkVSX1BPSU5URVIgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLk1FVEhPRF9DQUxMICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5NRVRIT0RfREVGICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTUlOVVMgICAgICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLk1JTlVTX0FTU0lHTiAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5NTF9DT01NRU5UICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTU9EICAgICAgICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLk1PRElGSUVSUyAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5NT0RfQVNTSUdOICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTkxTICAgICAgICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLk5PVF9FUVVBTCAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5OVUxMX1RSRUVfTE9PS0FIRUFEICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTlVNX0JJR19ERUNJTUFMICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLk5VTV9CSUdfSU5UICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5OVU1fRE9VQkxFICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTlVNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLk5VTV9JTlQgICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5OVU1fTE9ORyAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuT0JKQkxPQ0sgICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLk9ORV9OTCAgICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5PUFRJT05BTF9ET1QgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuUEFSQU1FVEVSUyAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlBBUkFNRVRFUl9ERUYgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5QTFVTICAgICAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuUExVU19BU1NJR04gICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlBPU1RfREVDICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5QT1NUX0lOQyAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuUVVFU1RJT04gICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlJBTkdFX0VYQ0xVU0lWRSAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5SQU5HRV9JTkNMVVNJVkUgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuUkJSQUNLICAgICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlJDVVJMWSAgICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5SRUdFWFBfQ1RPUl9FTkQgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuUkVHRVhQX1NZTUJPTCAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlJFR0VYX0ZJTkQgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5SRUdFWF9NQVRDSCAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuUlBBUkVOICAgICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlNFTEVDVF9TTE9UICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5TRU1JICAgICAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuU0hfQ09NTUVOVCAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlNMICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5TTElTVCAgICAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuU0xfQVNTSUdOICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlNMX0NPTU1FTlQgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5TUFJFQURfQVJHICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuU1BSRUFEX0RPVCAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlNQUkVBRF9NQVBfQVJHICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5TUiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuU1JfQVNTSUdOICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlNUQVIgICAgICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5TVEFSX0FTU0lHTiAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuU1RBUl9TVEFSICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlNUQVJfU1RBUl9BU1NJR04gICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5TVEFUSUNfSU1QT1JUICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuU1RBVElDX0lOSVQgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlNUUklDVEZQICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5TVFJJTkdfQ0ggICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuU1RSSU5HX0NPTlNUUlVDVE9SICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlNUUklOR19DVE9SX0VORCAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5TVFJJTkdfQ1RPUl9NSURETEUgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuU1RSSU5HX0NUT1JfU1RBUlQgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlNUUklOR19OTCAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5TVVBFUl9DVE9SX0NBTEwgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuVFJJUExFX0RPVCAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlRZUEVDQVNUICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5UWVBFX0FSR1VNRU5UICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuVFlQRV9BUkdVTUVOVFMgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlRZUEVfTE9XRVJfQk9VTkRTICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5UWVBFX1BBUkFNRVRFUiAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuVFlQRV9QQVJBTUVURVJTICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlRZUEVfVVBQRVJfQk9VTkRTICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5VTkFSWV9NSU5VUyAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuVU5BUllfUExVUyAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlVOVVNFRF9DT05TVCAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5VTlVTRURfRE8gICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuVU5VU0VEX0dPVE8gICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlZBUklBQkxFX0RFRiAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5WQVJJQUJMRV9QQVJBTUVURVJfREVGICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuVk9DQUIgICAgICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLldJTERDQVJEX1RZUEUgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5XUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICAgICAgY29sb3VyID0gYmxhY2s7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5TVFJJTkdfTElURVJBTCAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuUkVHRVhQX0xJVEVSQUwgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgICAgIGNvbG91ciA9IGdyZWVuOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuQ0xBU1NfREVGICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkVYVEVORFNfQ0xBVVNFICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5JTVBMRU1FTlRTX0NMQVVTRSAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuSU1QT1JUICAgICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfYXMgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX2Fzc2VydCAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF9ib29sZWFuICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfYnJlYWsgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX2J5dGUgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF9jYXNlICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfY2F0Y2ggICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX2NoYXIgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF9jbGFzcyAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfY29udGludWUgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX2RlZiAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF9kZWZhdWx0ICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfZG91YmxlICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX2Vsc2UgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF9lbnVtICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfZXh0ZW5kcyAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX2ZhbHNlICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF9maW5hbGx5ICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfZmxvYXQgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX2ZvciAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF9pZiAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfaW1wbGVtZW50cyAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX2ltcG9ydCAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF9pbiAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfaW5zdGFuY2VvZiAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX2ludCAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF9pbnRlcmZhY2UgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfbG9uZyAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX25hdGl2ZSAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF9uZXcgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfbnVsbCAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX3BhY2thZ2UgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF9wcml2YXRlICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfcHJvdGVjdGVkICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX3B1YmxpYyAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF9yZXR1cm4gICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfc2hvcnQgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX3N0YXRpYyAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF9zdXBlciAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfc3dpdGNoICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX3N5bmNocm9uaXplZCAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF90aGlzICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfdGhyZWFkc2FmZSAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX3Rocm93ICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF90aHJvd3MgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfdHJhbnNpZW50ICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX3RydWUgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF90cnkgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfdm9pZCAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX3ZvbGF0aWxlICAgICAgICAgICAgICA6CisgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF93aGlsZSAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlBBQ0tBR0VfREVGICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICAgICAgY29sb3VyID0gYmx1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBjb2xvdXIgPSBibGFjazsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29sb3VyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHB1c2goR3Jvb3Z5U291cmNlQVNUIHQpIHsKKyAgICAgICAgc3RhY2sucHVzaCh0KTsKKyAgICB9CisgICAgcHVibGljIEdyb292eVNvdXJjZUFTVCBwb3AoKSB7CisgICAgICAgIGlmICghc3RhY2suZW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIChHcm9vdnlTb3VyY2VBU1QpIHN0YWNrLnBvcCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudGxyL3RyZWV3YWxrZXIvTm9kZUNvbGxlY3Rvci5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvdHJlZXdhbGtlci9Ob2RlQ29sbGVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUwZGE5OQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudGxyL3RyZWV3YWxrZXIvTm9kZUNvbGxlY3Rvci5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudGxyLnRyZWV3YWxrZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hbnRsci5Hcm9vdnlTb3VyY2VBU1Q7CisKKy8qKgorICogQSBzaW1wbGUgYW50bHIgQVNUIHZpc2l0b3IgdGhhdCBjb2xsZWN0cyBhbGwgbm9kZXMgaW50byBhIExpc3QuCisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Z3Jvb3Z5QHJvc3MtcmF5bmVyLmNvbSI+SmVyZW15IFJheW5lcjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbjogNDAzMiAkCisgKi8KKworcHVibGljIGNsYXNzIE5vZGVDb2xsZWN0b3IgZXh0ZW5kcyBWaXNpdG9yQWRhcHRlciB7CisJcHJpdmF0ZSBMaXN0IG5vZGVzOworCXB1YmxpYyBOb2RlQ29sbGVjdG9yKCkgeworCQlub2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKKwl9CisJcHVibGljIExpc3QgZ2V0Tm9kZXMoKSB7CisJCXJldHVybiBub2RlczsKKwl9CisgICAgcHVibGljIHZvaWQgdmlzaXREZWZhdWx0KEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkgeworICAgICAgICBpZiAodmlzaXQgPT0gT1BFTklOR19WSVNJVCkgeworICAgICAgICAJbm9kZXMuYWRkKHQpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvdHJlZXdhbGtlci9Ob2RlUHJpbnRlci5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvdHJlZXdhbGtlci9Ob2RlUHJpbnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyYjM2YjcKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci90cmVld2Fsa2VyL05vZGVQcmludGVyLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50bHIudHJlZXdhbGtlcjsKKworaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudGxyLkdyb292eVNvdXJjZUFTVDsKKworLyoqCisgKiBBIHNpbXBsZSBhbnRsciBBU1QgdmlzaXRvciB0aGF0IG91dHB1dHMgdGhlIHRva2VuTmFtZSBvZiBlYWNoIG5vZGUgaW4gYSBwc2V1ZG8geG1sIHN0eWxlLgorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmdyb292eUByb3NzLXJheW5lci5jb20iPkplcmVteSBSYXluZXI8L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KKworcHVibGljIGNsYXNzIE5vZGVQcmludGVyIGV4dGVuZHMgVmlzaXRvckFkYXB0ZXIgeworICAgIHByaXZhdGUgU3RyaW5nW10gdG9rZW5OYW1lczsKKyAgICBwcml2YXRlIFByaW50U3RyZWFtIG91dDsKKworICAgIC8qKgorICAgICAqIEEgdmlzaXRvciB0aGF0IHByaW50cyBhIHBzZXVkbyB4bWwgb3V0cHV0IHRvIHRoZSBzdXBwbGllZCBQcmludFN0cmVhbQorICAgICAqIEBwYXJhbSBvdXQgc3VwcGxpZWQgUHJpbnRTdHJlYW0gdG8gb3V0cHV0IG5vZGVzIHRvCisgICAgICogQHBhcmFtIHRva2VuTmFtZXMgYW4gYXJyYXkgb2YgdG9rZW4gbmFtZXMgdG8gdXNlCisgICAgICovCisgICAgcHVibGljIE5vZGVQcmludGVyKFByaW50U3RyZWFtIG91dCxTdHJpbmdbXSB0b2tlbk5hbWVzKSB7CisgICAgICAgIHRoaXMudG9rZW5OYW1lcyA9IHRva2VuTmFtZXM7CisgICAgICAgIHRoaXMub3V0ID0gb3V0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0RGVmYXVsdChHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHsKKyAgICAgICAgaWYgKHZpc2l0ID09IE9QRU5JTkdfVklTSVQpIHsKKyAgICAgICAgICAgIG91dC5wcmludCgiPCIrIHRva2VuTmFtZXNbdC5nZXRUeXBlKCldICsgIj4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG91dC5wcmludCgiPC8iICsgdG9rZW5OYW1lc1t0LmdldFR5cGUoKV0gKyAiPiIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvdHJlZXdhbGtlci9QcmVPcmRlclRyYXZlcnNhbC5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvdHJlZXdhbGtlci9QcmVPcmRlclRyYXZlcnNhbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MmY2MTcKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci90cmVld2Fsa2VyL1ByZU9yZGVyVHJhdmVyc2FsLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50bHIudHJlZXdhbGtlcjsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50bHIuR3Jvb3Z5U291cmNlQVNUOworCisvKioKKyAqIEEgc2ltcGxlIHByZW9yZGVyIHRyYXZlcnNhbCBvdmVyIHRoZSBzdXBwbGllZCBhbnRsciBBU1QuCisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Z3Jvb3Z5QHJvc3MtcmF5bmVyLmNvbSI+SmVyZW15IFJheW5lcjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIFByZU9yZGVyVHJhdmVyc2FsIGV4dGVuZHMgVHJhdmVyc2FsSGVscGVyIHsKKyAgICAKKyAgICAvKioKKyAgICAgKiBBIHNpbXBsZSBwcmVvcmRlciB0cmF2ZXJzYWwgb3ZlciB0aGUgc3VwcGxpZWQgYW50bHIgQVNULgorICAgICAqIEBwYXJhbSB2aXNpdG9yIHRoZSBWaXNpdG9yIHRvIGNhbGwgZm9yIGVhY2ggbm9kZSB2aXNpdGVkIAorICAgICAqLworICAgIHB1YmxpYyBQcmVPcmRlclRyYXZlcnNhbChWaXNpdG9yIHZpc2l0b3IpIHsKKyAgICAgICAgc3VwZXIodmlzaXRvcik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWNjZXB0KEdyb292eVNvdXJjZUFTVCBjdXJyZW50Tm9kZSkgeworICAgICAgICBwdXNoKGN1cnJlbnROb2RlKTsKKyAgICAgICAgb3BlbmluZ1Zpc2l0KGN1cnJlbnROb2RlKTsKKyAgICAgICAgYWNjZXB0Q2hpbGRyZW4oY3VycmVudE5vZGUpOworICAgICAgICBjbG9zaW5nVmlzaXQoY3VycmVudE5vZGUpOworICAgICAgICBwb3AoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci90cmVld2Fsa2VyL1NvdXJjZUNvZGVUcmF2ZXJzYWwuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudGxyL3RyZWV3YWxrZXIvU291cmNlQ29kZVRyYXZlcnNhbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMmRlYWMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci90cmVld2Fsa2VyL1NvdXJjZUNvZGVUcmF2ZXJzYWwuamF2YQpAQCAtMCwwICsxLDI1NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1IEplcmVteSBSYXluZXIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudGxyLnRyZWV3YWxrZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50bHIuR3Jvb3Z5U291cmNlQVNUOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50bHIucGFyc2VyLkdyb292eVRva2VuVHlwZXM7CisKKy8qKgorICogQSB0cmVld2Fsa2VyIGZvciB0aGUgYW50bHIgZ2VuZXJhdGVkIEFTVCB0aGF0IGF0dGVtcHRzIHRvIHZpc2l0IHRoZQorICogQVNUIG5vZGVzIGluIHRoZSBvcmRlciBuZWVkZWQgdG8gZ2VuZXJhdGUgdmFsaWQgZ3Jvb3Z5IHNvdXJjZSBjb2RlLgorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmdyb292eUByb3NzLXJheW5lci5jb20iPkplcmVteSBSYXluZXI8L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBTb3VyY2VDb2RlVHJhdmVyc2FsIGV4dGVuZHMgVHJhdmVyc2FsSGVscGVyIHsKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgdHJlZXdhbGtlciBmb3IgdGhlIGFudGxyIGdlbmVyYXRlZCBBU1QgdGhhdCBhdHRlbXB0cyB0byB2aXNpdCB0aGUKKyAgICAgKiBBU1Qgbm9kZXMgaW4gdGhlIG9yZGVyIG5lZWRlZCB0byBnZW5lcmF0ZSB2YWxpZCBncm9vdnkgc291cmNlIGNvZGUuCisgICAgICogQHBhcmFtIHZpc2l0b3IgdGhlIHZpc2l0b3IgaW1wbGVtZW50YXRpb24gdG8gY2FsbCBmb3IgZWFjaCBBU1Qgbm9kZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU291cmNlQ29kZVRyYXZlcnNhbChWaXNpdG9yIHZpc2l0b3IpIHsKKyAgICAgICAgc3VwZXIodmlzaXRvcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2F0aGVyLCBzb3J0IGFuZCBwcm9jZXNzIGFsbCB1bnZpc2l0ZWQgbm9kZXMKKyAgICAgKiBAcGFyYW0gdCB0aGUgQVNUIHRvIHByb2Nlc3MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVcChHcm9vdnlTb3VyY2VBU1QgdCkgeworICAgICAgICBzdXBlci5zZXRVcCh0KTsKKyAgICAgICAgCisgICAgICAgIC8vIGdhdGhlciBhbmQgc29ydCBhbGwgdW52aXNpdGVkIEFTVCBub2RlcworICAgICAgICB1bnZpc2l0ZWROb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgdHJhdmVyc2UodCk7CisgICAgICAgIENvbGxlY3Rpb25zLnNvcnQodW52aXNpdGVkTm9kZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHRyYXZlcnNlIGFuIEFTVCBub2RlCisgICAgICogQHBhcmFtIHQgdGhlIEFTVCBub2RlIHRvIHRyYXZlcnNlCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHRyYXZlcnNlKEdyb292eVNvdXJjZUFTVCB0KSB7CisgICAgICAgIGlmICh0ID09IG51bGwpIHsgcmV0dXJuOyB9CisgICAgICAgIGlmICh1bnZpc2l0ZWROb2RlcyAhPSBudWxsKSB7CisgICAgICAgICAgIHVudmlzaXRlZE5vZGVzLmFkZCh0KTsKKyAgICAgICAgfQorICAgICAgICBHcm9vdnlTb3VyY2VBU1QgY2hpbGQgPSAoR3Jvb3Z5U291cmNlQVNUKXQuZ2V0Rmlyc3RDaGlsZCgpOworICAgICAgICBpZiAoY2hpbGQgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJhdmVyc2UoY2hpbGQpOworICAgICAgICB9CisgICAgICAgIEdyb292eVNvdXJjZUFTVCBzaWJsaW5nID0gKEdyb292eVNvdXJjZUFTVCl0LmdldE5leHRTaWJsaW5nKCk7CisgICAgICAgIGlmIChzaWJsaW5nICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyYXZlcnNlKHNpYmxpbmcpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgYWNjZXB0KEdyb292eVNvdXJjZUFTVCBjdXJyZW50Tm9kZSkgeworICAgICAgICBpZiAoY3VycmVudE5vZGUgIT0gbnVsbCAmJiB1bnZpc2l0ZWROb2RlcyAhPSBudWxsICYmIHVudmlzaXRlZE5vZGVzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIEdyb292eVNvdXJjZUFTVCB0ID0gY3VycmVudE5vZGU7CisKKyAgICAgICAgICAgIGlmICghKHVudmlzaXRlZE5vZGVzLmNvbnRhaW5zKGN1cnJlbnROb2RlKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoKHQpOworICAgICAgICAgICAgc3dpdGNoICh0LmdldFR5cGUoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5RVUVTVElPTjogLy8gZXhwcj9mb286YmFyCisgICAgICAgICAgICAgICAgICAgIGFjY2VwdF9GaXJzdENoaWxkX3ZfU2Vjb25kQ2hpbGRfdl9UaGlyZENoaWxkX3YodCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkNBU0VfR1JPVVA6IC8vCisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfaW5zdGFuY2VvZjogLy8gZm9vIGluc3RhbmNlb2YgTXlUeXBlCisgICAgICAgICAgICAgICAgICAgIGFjY2VwdF9GaXJzdENoaWxkX3ZfU2Vjb25kQ2hpbGRzQ2hpbGRyZW5fdih0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuQU5OT1RBVElPTjoKKyAgICAgICAgICAgICAgICAgICAgYWNjZXB0X3ZfRmlyc3RDaGlsZF8ybmR2X1NlY29uZENoaWxkX3ZfX19MYXN0Q2hpbGRfdih0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuQ0xPU1VSRV9MSVNUOiAvLyAoYT0xOyBhPDEwOyBhKyspCisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkVMSVNUOiAvLyBhLGIsYworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5QQVJBTUVURVJTOiAvLyBhLGIsYworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5UWVBFX0FSR1VNRU5UUzogLy8gPFN0cmluZywgT2JqZWN0PgorICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5TVFJJTkdfQ09OU1RSVUNUT1I6IC8vICJmb28ke2Jhcn13aWJibGUiCisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlRZUEVfUEFSQU1FVEVSOiAvLyBjbGFzcyBGb288VCBleHRlbmRzIEY+CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlRZUEVfUEFSQU1FVEVSUzogLy8gY2xhc3MgRm9vPFQ+CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlRZUEVfVVBQRVJfQk9VTkRTOiAvLyBjbGFzcyBGb288VCBleHRlbmRzIEY+CisgICAgICAgICAgICAgICAgICAgIGFjY2VwdF92X0ZpcnN0Q2hpbGRfdl9TZWNvbmRDaGlsZF92X19fTGFzdENoaWxkX3YodCk7CisgICAgICAgICAgICAgICAgICAgIC8vIHRvZG8gOiBjb25maXJtIHRoYXQgVFlQRV9MT1dFUl9CT1VORFMgZG9lcyBub3QgaGF2ZSBtdWx0aXBsZSBjaGlsZHJlbgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5WQVJJQUJMRV9QQVJBTUVURVJfREVGOiAvLyB2b2lkIGYoU3RyaW5nIC4uLiBvdGhlcnMpIHt9CisgICAgICAgICAgICAgICAgICAgIGFjY2VwdF92X0ZpcnN0Q2hpbGRfU2Vjb25kQ2hpbGRfdl9UaGlyZENoaWxkX3YodCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLklOREVYX09QOgorICAgICAgICAgICAgICAgICAgICBhY2NlcHRfRmlyc3RDaGlsZF92X1NlY29uZENoaWxkX3YodCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkVOVU1fQ09OU1RBTlRfREVGOiAvLyBlbnVtIEZvbyhUSEVTRSxBUkUsVEhFWSkKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuRVhQUjoKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuSU1QT1JUOgorICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5WQVJJQUJMRV9ERUY6CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLk1FVEhPRF9ERUY6CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLk9CSkJMT0NLOiAvL2NsYXNzIEZvbyB7ZGVmIGJhcigpfSAgPC0tIHRoaXMgYmxvY2sKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuUEFSQU1FVEVSX0RFRjogLy8gdm9pZCBmKFN0cmluZyBtZSkge30KKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuU0xJU1Q6IC8vIGxpc3Qgb2YgZXhwcmVzc2lvbnMsIHZhcmlhYmxlIGRlZnMgZXRjCisgICAgICAgICAgICAgICAgICAgIGFjY2VwdF92X0FsbENoaWxkcmVuX3YodCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkFOTk9UQVRJT05fTUVNQkVSX1ZBTFVFX1BBSVI6IC8vIEBCbHVlKGZvbz0xMjMpCisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkFTU0lHTjogLy8gYSA9IGIKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuQkFORF9BU1NJR046IC8vIGEgJj0gYgorICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5CT1JfQVNTSUdOOiAvLyBhIHw9IGIKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuQlNSX0FTU0lHTjogLy8gYSA+Pj49IGIKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuQlhPUl9BU1NJR046IC8vIGEgXj0gYgorICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5DT01QQVJFX1RPOiAvLyBhIDw9PiBiCisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkRJVl9BU1NJR046IC8vIGEgLz0gYgorICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5FUVVBTDogLy8gYSA9PSBiCisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLk1JTlVTX0FTU0lHTjogLy8gYSAtPSBiCisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLk1PRF9BU1NJR046IC8vIGEgJT0gYgorICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5OT1RfRVFVQUw6IC8vIGEgIT0gYgorICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5QTFVTX0FTU0lHTjogLy8gYSArPSBiCisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlJFR0VYX0ZJTkQ6IC8vIGEgPX4gYgorICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5SRUdFWF9NQVRDSDogLy8gYSA9PX4gYgorICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5TTF9BU1NJR046IC8vIGEgPDw9IGIKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuU1JfQVNTSUdOOiAvLyBhID4+PSBiCisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlNUQVJfQVNTSUdOOiAvLyBhICo9IGIKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuU1RBUl9TVEFSX0FTU0lHTjogLy8geCAqKj0gMworICAgICAgICAgICAgICAgICAgICBpZiAodC5jaGlsZEF0KDEpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VwdF9GaXJzdENoaWxkX3ZfUmVzdE9mVGhlQ2hpbGRyZW4odCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhY2NlcHRfdl9GaXJzdENoaWxkX3ZfUmVzdE9mVGhlQ2hpbGRyZW4odCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuQU5OT1RBVElPTl9GSUVMRF9ERUY6IC8vIEBpbnRlcmZhY2UgRm9veyBpbnQgYmFyKCkuLi4KKyAgICAgICAgICAgICAgICAgICAgYWNjZXB0X0ZpcnN0U2Vjb25kQW5kVGhpcmRDaGlsZF92X3ZfRm9ydGhDaGlsZCh0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5BTk5PVEFUSU9OX0RFRjogLy8gQGludGVyZmFjZSBGb28uLi4KKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuQkFORDogLy8gMSAmIDIKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuQk9SOiAvLyAxIHwgMgorICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5CU1I6IC8vIDEgPj4+IDIKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuQlhPUjogLy8gMSBeIDIKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuQ0xBU1NfREVGOiAvLyBjbGFzcyBGb28uLi4KKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuQ1RPUl9JREVOVDogLy8gcHJpdmF0ZSBGb28oKSB7Li4uCisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkRJVjogLy8gIDMvNAorICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5ET1Q6IC8vIGZvby5iYXIKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuRU5VTV9ERUY6IC8vIGVudW0gRm9vLi4uCisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkdFOiAvLyBhID49IGIKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuR1Q6IC8vIGEgPiBiCisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLklOVEVSRkFDRV9ERUY6IC8vIGludGVyZmFjZSBGb28uLi4KKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTEFCRUxFRF9BUkc6IC8vIG15TWV0aG9kKG5hbWU6IkpleiIpCisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxBQkVMRURfU1RBVDogLy8gZm9vOng9MSAgICAgICAgICAgICAgICAgICAgCQorICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MQU5EOiAvLyB0cnVlICYmIGZhbHNlCisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxFOiAvLyBhIDw9IGIKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF9hczogLy8gZm9vIGFzIEJhcgorICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX2luOiAvLyBpZiAoaSBpbiBteUxpc3QpIC4uLgorICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MT1I6IC8vIHRydWUgJiYgZmFsc2UKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTFQ6IC8vIGEgPCBiCisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLk1FTUJFUl9QT0lOVEVSOiAvLyB0aGlzLiZmb28oKQorICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5NT0Q6IC8vICA0ICUgMworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5NSU5VUzogLy8gMSAtIDEKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuT1BUSU9OQUxfRE9UOiAvLyBmb28/LmJhcgorICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5QQUNLQUdFX0RFRjoKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuUExVUzogLy8gMSArIDEKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuUkFOR0VfRVhDTFVTSVZFOiAvLyBbMS4uPDEwXQorICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5SQU5HRV9JTkNMVVNJVkU6IC8vIFsxLi4xMF0KKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuU0w6IC8vIGEgPDwgYgorICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5TUFJFQURfRE9UOiAvLyBmb28qLmJhcgorICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5TUjogLy8gYSA+PiBiCisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlNUQVI6IC8vIGEgKiBiICAgb3IgICAgaW1wb3J0IGZvby4qCisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlNUQVJfU1RBUjogLy8geCAqKiAzCisgICAgICAgICAgICAgICAgICAgIGFjY2VwdF9GaXJzdENoaWxkX3ZfUmVzdE9mVGhlQ2hpbGRyZW4odCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkNUT1JfQ0FMTDoKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTUVUSE9EX0NBTEw6CisgICAgICAgICAgICAgICAgICAgIGlmICh0LmdldE51bWJlck9mQ2hpbGRyZW4oKSA9PSAyICYmIHQuY2hpbGRBdCgxKSAhPSBudWxsICYmIHQuY2hpbGRBdCgxKS5nZXRUeXBlKCkgPT0gR3Jvb3Z5VG9rZW5UeXBlcy5DTE9TQUJMRV9CTE9DSykgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbXlNZXRob2Qgey4uLgorICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXB0X0ZpcnN0Q2hpbGRfdl9TZWNvbmRDaGlsZCh0KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEdyb292eVNvdXJjZUFTVCBsYXN0Q2hpbGQgPSB0LmNoaWxkQXQodC5nZXROdW1iZXJPZkNoaWxkcmVuKCkgLTEpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RDaGlsZCAhPSBudWxsICYmIGxhc3RDaGlsZC5nZXRUeXBlKCkgPT0gR3Jvb3Z5VG9rZW5UeXBlcy5DTE9TQUJMRV9CTE9DSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG15TWV0aG9kKGEsYikgey4uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VwdF9GaXJzdENoaWxkX3ZfUmVzdE9mVGhlQ2hpbGRyZW5fdl9MYXN0Q2hpbGQodCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG15TWV0aG9kKGEsYikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NlcHRfRmlyc3RDaGlsZF92X1Jlc3RPZlRoZUNoaWxkcmVuX3YodCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF93aGlsZToKKy8vZGVwcmVjYXRlZCAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF93aXRoOgorICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5UWVBFQ0FTVDogLy8gKFN0cmluZylpdHIubmV4dCgpCisgICAgICAgICAgICAgICAgICAgIGFjY2VwdF92X0ZpcnN0Q2hpbGRzRmlyc3RDaGlsZF92X1Jlc3RPZlRoZUNoaWxkcmVuKHQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX2lmOiAvLyBpZiAoZ3JhbmRjaGlsZCkge2NoaWxkMX0gZWxzZSB7Y2hpbGQyfSAuLi4KKyAgICAgICAgICAgICAgICAgICAgYWNjZXB0X3ZfRmlyc3RDaGlsZHNGaXJzdENoaWxkX3ZfQ2hpbGQyX0NoaWxkM192X0NoaWxkNF92X19fdl9MYXN0Q2hpbGQodCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkNMT1NBQkxFX0JMT0NLOiAvLyBbMSwyLDNdLmVhY2gge2ZvbyhpdCl9ICA8LS0gQ2xvc3VyZQorICAgICAgICAgICAgICAgICAgICBpZiAodC5jaGlsZEF0KDApICE9IG51bGwgJiYgdC5jaGlsZEF0KDApLmdldFR5cGUoKSA9PSBHcm9vdnlUb2tlblR5cGVzLklNUExJQ0lUX1BBUkFNRVRFUlMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VwdF92X0FsbENoaWxkcmVuX3YodCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhY2NlcHRfdl9GaXJzdENoaWxkX3ZfUmVzdE9mVGhlQ2hpbGRyZW5fdih0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5GT1JfSU5fSVRFUkFCTEU6CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfZm9yOgorICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX25ldzoKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF9zd2l0Y2g6CisgICAgICAgICAgICAgICAgICAgIGFjY2VwdF92X0ZpcnN0Q2hpbGRfdl9SZXN0T2ZUaGVDaGlsZHJlbl92KHQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuQU5OT1RBVElPTlM6IC8vIGp1c3QgbGlrZSBtb2RpZmllcnMgYnV0IGZvciBwYWNrYWdlL2VudW0gZGVjbGFyYXRpb25zCisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfYXNzZXJ0OgorICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX2NhdGNoOgorICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX3N5bmNocm9uaXplZDoKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF90cnk6CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLk1PRElGSUVSUzoKKyAgICAgICAgICAgICAgICAgICAgYWNjZXB0X3ZfRmlyc3RDaGlsZF92X1Jlc3RPZlRoZUNoaWxkcmVuKHQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLldJTERDQVJEX1RZUEU6CisgICAgICAgICAgICAgICAgICAgIGFjY2VwdF92X1NpYmxpbmdzX3YodCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYWNjZXB0X3ZfRmlyc3RDaGlsZF92KHQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBvcCgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvdHJlZXdhbGtlci9Tb3VyY2VQcmludGVyLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci90cmVld2Fsa2VyL1NvdXJjZVByaW50ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGYxMmIzCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvdHJlZXdhbGtlci9Tb3VyY2VQcmludGVyLmphdmEKQEAgLTAsMCArMSwxMDY5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5hbnRsci50cmVld2Fsa2VyOworCitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudGxyLkdyb292eVNvdXJjZUFTVDsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudGxyLnBhcnNlci5Hcm9vdnlUb2tlblR5cGVzOworCisvKioKKyAqIEFuIGFudGxyIEFTVCB2aXNpdG9yIHRoYXQgcHJpbnRzIGdyb292eSBzb3VyY2UgY29kZSBmb3IgZWFjaCB2aXNpdGVkIG5vZGUKKyAqIHRvIHRoZSBzdXBwbGllZCBQcmludFN0cmVhbS4KKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpncm9vdnlAcm9zcy1yYXluZXIuY29tIj5KZXJlbXkgUmF5bmVyPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCisKK3B1YmxpYyBjbGFzcyBTb3VyY2VQcmludGVyIGV4dGVuZHMgVmlzaXRvckFkYXB0ZXIgeworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nW10gdG9rZW5OYW1lczsKKyAgICBwcml2YXRlIGludCB0YWJMZXZlbDsKKyAgICBwcml2YXRlIGludCBsYXN0TGluZVByaW50ZWQ7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG5ld0xpbmVzOworICAgIHByb3RlY3RlZCBmaW5hbCBQcmludFN0cmVhbSBvdXQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgY2xhc3NOYW1lOworICAgIHByaXZhdGUgZmluYWwgU3RhY2sgc3RhY2s7CisgICAgcHJpdmF0ZSBpbnQgc3RyaW5nQ29uc3RydWN0b3JDb3VudGVyOworCisgICAgLyoqCisgICAgICogQSB2aXNpdG9yIHRoYXQgcHJpbnRzIGdyb292eSBzb3VyY2UgY29kZSBmb3IgZWFjaCBub2RlIHZpc2l0ZWQuCisgICAgICogQHBhcmFtIG91dCB3aGVyZSB0byBwcmludCB0aGUgc291cmNlIGNvZGUgdG8KKyAgICAgKiBAcGFyYW0gdG9rZW5OYW1lcyBhbiBhcnJheSBvZiB0b2tlbiBuYW1lcyBmcm9tIGFudGxyCisgICAgICovCisgICAgcHVibGljIFNvdXJjZVByaW50ZXIoUHJpbnRTdHJlYW0gb3V0LFN0cmluZ1tdIHRva2VuTmFtZXMpIHsKKyAgICAgICAgdGhpcyhvdXQsdG9rZW5OYW1lcyx0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHZpc2l0b3IgdGhhdCBwcmludHMgZ3Jvb3Z5IHNvdXJjZSBjb2RlIGZvciBlYWNoIG5vZGUgdmlzaXRlZC4KKyAgICAgKiBAcGFyYW0gb3V0IHdoZXJlIHRvIHByaW50IHRoZSBzb3VyY2UgY29kZSB0bworICAgICAqIEBwYXJhbSB0b2tlbk5hbWVzIGFuIGFycmF5IG9mIHRva2VuIG5hbWVzIGZyb20gYW50bHIKKyAgICAgKiBAcGFyYW0gbmV3TGluZXMgb3V0cHV0IG5ld2xpbmUgY2hhcmFjdGVyCisgICAgICovCisgICAgcHVibGljIFNvdXJjZVByaW50ZXIoUHJpbnRTdHJlYW0gb3V0LFN0cmluZ1tdIHRva2VuTmFtZXMsIGJvb2xlYW4gbmV3TGluZXMpIHsKKyAgICAgICAgdGhpcy50b2tlbk5hbWVzID0gdG9rZW5OYW1lczsKKyAgICAgICAgdGFiTGV2ZWwgPSAwOworICAgICAgICBsYXN0TGluZVByaW50ZWQgPSAwOworICAgICAgICB0aGlzLm91dCA9IG91dDsKKyAgICAgICAgdGhpcy5uZXdMaW5lcyA9IG5ld0xpbmVzOworICAgICAgICB0aGlzLnN0YWNrID0gbmV3IFN0YWNrKCk7CisgICAgfQorICAgIAorCisJcHVibGljIHZvaWQgdmlzaXRBYnN0cmFjdChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisJCXByaW50KHQsdmlzaXQsImFic3RyYWN0ICIsbnVsbCxudWxsKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB2aXNpdEFubm90YXRpb24oR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworCQlpZiAodmlzaXQgPT0gT1BFTklOR19WSVNJVCkgeworCQkJcHJpbnQodCx2aXNpdCwiQCIpOworCQl9CisJCWlmICh2aXNpdCA9PSBTRUNPTkRfVklTSVQpIHsKKwkJCXByaW50KHQsdmlzaXQsIigiKTsKKwkJfQorCQlpZiAodmlzaXQgPT0gU1VCU0VRVUVOVF9WSVNJVCkgeworCQkJcHJpbnQodCx2aXNpdCwiLCAiKTsKKwkJfQorCQlpZiAodmlzaXQgPT0gQ0xPU0lOR19WSVNJVCkgeworCQkJaWYgKHQuZ2V0TnVtYmVyT2ZDaGlsZHJlbigpID4gMSkgeworCQkJCXByaW50KHQsdmlzaXQsIikgIik7CisJCQl9IGVsc2UgeworCQkJCXByaW50KHQsdmlzaXQsIiAiKTsKKwkJCX0KKwkJfQorCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRBbm5vdGF0aW9ucyhHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgCS8vIGRvIG5vdGhpbmcKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEFubm90YXRpb25EZWYoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7CisgICAgICAgIHByaW50KHQsdmlzaXQsIkBpbnRlcmZhY2UgIixudWxsLG51bGwpOworICAgIH0KKworCXB1YmxpYyB2b2lkIHZpc2l0QW5ub3RhdGlvbkZpZWxkRGVmKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAJcHJpbnQodCx2aXNpdCwiKCkgIiwiZGVmYXVsdCAiLG51bGwpOworCX0KKworCXB1YmxpYyB2b2lkIHZpc2l0QW5ub3RhdGlvbk1lbWJlclZhbHVlUGFpcihHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisJCXByaW50KHQsdmlzaXQsIiA9ICIsbnVsbCxudWxsKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB2aXNpdEFycmF5RGVjbGFyYXRvcihHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisJCS8vPEFSUkFZX0RFQ0xBUkFUT1I+aW50PC9BUlJBWV9ERUNMQVJBVE9SPiBwcmltZXMgPSBuZXcgaW50KDxBUlJBWV9ERUNMQVJBVE9SPjU8L0FSUkFZX0RFQ0xBUkFUT1I+KQorCQlpZiAoZ2V0UGFyZW50Tm9kZSgpLmdldFR5cGUoKSA9PSBHcm9vdnlUb2tlblR5cGVzLlRZUEUgfHwKKwkJCQlnZXRQYXJlbnROb2RlKCkuZ2V0VHlwZSgpID09IEdyb292eVRva2VuVHlwZXMuVFlQRUNBU1QpIHsgLy8gdWdseSBoYWNrCisJCQkvLyB0eXBlIGRlZmludGlvbiwgaS5lLiAgIGludFtdIHg7CisJCQlwcmludCh0LHZpc2l0LG51bGwsbnVsbCwiW10iKTsKKwkJfSBlbHNlIHsKKwkJCS8vIHVzdWFsbHkgaW4gbmV3LCBpLmUuICAgZGVmIHkgPSBuZXcgaW50WzVdOworCQkJcHJpbnQodCx2aXNpdCwiWyIsbnVsbCwiXSIpOworCQl9CisJfQorCisJcHVibGljIHZvaWQgdmlzaXRBc3NpZ24oR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7CisgICAgICAgIHByaW50KHQsdmlzaXQsIiA9ICIsbnVsbCxudWxsKTsKKyAgICB9CisJCisgICAgLy8gdmlzaXRBdCgpIC4uLgorICAgIC8vICAgdG9rZW4gdHlwZSAnQVQnIHNob3VsZCBuZXZlciBiZSB2aXNpdGVkLCBhcyBhbm5vdGF0aW9uIGRlZmluaXRpb25zIGFuZCB1c2FnZSwgYW5kCisgICAgLy8gICBkaXJlY3QgZmllbGQgYWNjZXNzIHNob3VsZCBoYXZlIGFsbCBtb3ZlZCB0aGlzIHRva2VuIG91dCBvZiB0aGUgd2F5LiBObyB0ZXN0IG5lZWRlZC4KKworCS8vICAgb25lIG9mIHRoZSBCQU5EIHRva2VucyBpcyBhY3R1YWxseSByZXBsYWNlZCBieSBUWVBFX1VQUEVSX0JPVU5EUyAoZS5nLiBjbGFzcyBGb288VCBleHRlbmRzIEMgJiBJPiB7VCB0fSApCisgICAgcHVibGljIHZvaWQgdmlzaXRCYW5kKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgcHJpbnQodCx2aXNpdCwiICYgIixudWxsLG51bGwpOworICAgIH0KKworCXB1YmxpYyB2b2lkIHZpc2l0QmFuZEFzc2lnbihHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHsKKyAgICAgICAgcHJpbnQodCx2aXNpdCwiICY9ICIsbnVsbCxudWxsKTsKKyAgICB9CisJCisgICAgLy8gdmlzaXRCaWdTdWZmaXgoKSAuLi4KKwkvLyAgIHRva2VuIHR5cGUgQklHX1NVRkZJWCBuZXZlciBjcmVhdGVkL3Zpc2l0ZWQsIE5VTV9CSUdfSU5ULCBOVU1fQklHX0RFQ0lNQUwgaW5zdGVhZC4uLiAgICAKKyAgICAKKwkvLyB2aXNpdEJsb2NrKCkgLi4uCisJLy8gICB0b2tlbiB0eXBlIEJMT0NLIG5ldmVyIGNyZWF0ZWQvdmlzaXRlZCwgc2VlIENMT1NBQkxFX0JMT0NLIGV0Yy4uLgorCQorCXB1YmxpYyB2b2lkIHZpc2l0Qm5vdChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisJCXByaW50KHQsdmlzaXQsIn4iLG51bGwsbnVsbCk7CisJfQorCQorCS8vIE5vdGU6IG9sZCBjbG9zdXJlIHN5bnRheCB1c2luZyBCT1IgaXMgZGVwcmVjYXRlZCwgYW5kIGFsc28gbmV2ZXIgY3JlYXRlcy92aXNpdHMgYSBCT1Igbm9kZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0Qm9yKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgcHJpbnQodCx2aXNpdCwiIHwgIixudWxsLG51bGwpOworICAgIH0KKwkKKwlwdWJsaWMgdm9pZCB2aXNpdEJvckFzc2lnbihHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHsKKyAgICAgICAgcHJpbnQodCx2aXNpdCwiIHw9ICIsbnVsbCxudWxsKTsKKyAgICB9CisJCisgICAgcHVibGljIHZvaWQgdmlzaXRCc3IoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBwcmludCh0LHZpc2l0LCIgPj4+ICIsbnVsbCxudWxsKTsKKyAgICB9CisJCisJcHVibGljIHZvaWQgdmlzaXRCc3JBc3NpZ24oR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7CisgICAgICAgIHByaW50KHQsdmlzaXQsIiA+Pj49ICIsbnVsbCxudWxsKTsKKyAgICB9CisJCisgICAgcHVibGljIHZvaWQgdmlzaXRCeG9yKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgcHJpbnQodCx2aXNpdCwiIF4gIixudWxsLG51bGwpOworICAgIH0KKwkKKwlwdWJsaWMgdm9pZCB2aXNpdEJ4b3JBc3NpZ24oR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7CisgICAgICAgIHByaW50KHQsdmlzaXQsIiBePSAiLG51bGwsbnVsbCk7CisgICAgfQorCQorICAgIHB1YmxpYyB2b2lkIHZpc2l0Q2FzZUdyb3VwKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgaWYgKHZpc2l0ID09IE9QRU5JTkdfVklTSVQpIHsKKyAgICAgICAgICAgIHRhYkxldmVsKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZpc2l0ID09IENMT1NJTkdfVklTSVQpIHsKKyAgICAgICAgICAgIHRhYkxldmVsLS07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdENsYXNzRGVmKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkgeworICAgICAgICBwcmludCh0LHZpc2l0LCJjbGFzcyAiLG51bGwsbnVsbCk7CisKKyAgICAgICAgaWYgKHZpc2l0ID09IE9QRU5JTkdfVklTSVQpIHsKKyAgICAgICAgICAgIC8vIHN0b3JlIG5hbWUgb2YgY2xhc3MgYXdheSBmb3IgdXNlIGluIGNvbnN0cnVjdG9yIGlkZW50CisgICAgICAgICAgICBjbGFzc05hbWUgPSB0LmNoaWxkT2ZUeXBlKEdyb292eVRva2VuVHlwZXMuSURFTlQpLmdldFRleHQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0Q2xvc2VkQmxvY2soR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBwcmludFVwZGF0aW5nVGFiTGV2ZWwodCx2aXNpdCwieyIsIi0+ICIsIn0iKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdmlzaXRDbG9zdXJlTGlzdChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgCXByaW50KHQsdmlzaXQsIigiLCI7ICIsIikiKTsKKyAgICB9CisgICAgLy8gdmlzaXRDbG9zdXJlT3AgLi4uCisJLy8gICB0b2tlbiB0eXBlIENMT1NBQkxFX0JMT0NLX09QIG5ldmVyIGNyZWF0ZWQvdmlzaXRlZCwgc2VlIENMT1NBQkxFX0JMT0NLLi4uCisJCisKKyAgICAvLyB2aXNpdENvbG9uIC4uLgorICAgIC8vICAgdG9rZW4gdHlwZSBDT0xPTiBuZXZlciBjcmVhdGVkL3Zpc2l0ZWQsIHNlZSBMQUJFTEVEX1NUQVQsIEZPUl9JTl9JVEVSQUJMRSwgCisgICAgLy8gICBBU1NFUlQsIENBU0UsIFFVRVNUSU9OLCBNQVBfQ09OU1RSVUNUT1IsIExBQkVMRURfQVJHLCBTUFJFQURfTUFQX0FSRworCisgICAgLy8gdmlzaXRDb21tYSAuLi4KKyAgICAvLyAgIHRva2VuIHR5cGUgQ09NTUEgbmV2ZXIgY3JlYXRlZC92aXNpdGVkLAorICAgIC8vICAgc2VlIFRZUEVfQVJHVU1FTlRTLCBBTk5PVEFUSU9OLCBtYW55IG90aGVycyAuLi4KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB2aXNpdENvbXBhcmVUbyhHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHsKKyAgICAgICAgcHJpbnQodCx2aXNpdCwiIDw9PiAiLG51bGwsbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRDdG9yQ2FsbChHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHsKKyAgICAgICAgcHJpbnRVcGRhdGluZ1RhYkxldmVsKHQsdmlzaXQsInRoaXMoIiwiICIsIikiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEN0b3JJZGVudChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIC8vIHVzZSBuYW1lIG9mIGNsYXNzIGZvciBjb25zdHJ1Y3RvciBmcm9tIHRoZSBjbGFzcyBkZWZpbml0aW9uCisgICAgICAgIHByaW50KHQsdmlzaXQsY2xhc3NOYW1lLG51bGwsbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXREZWMoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgIAlwcmludCh0LHZpc2l0LCItLSIsbnVsbCxudWxsKTsKKyAgICB9CisgICAgCisgICAgLy8gdmlzaXREaWdpdCAuLi4KKyAgICAvLyAgICBuZXZlciBjcmVhdGVkL3Zpc2l0ZWQKKyAgICAKKyAgICBwdWJsaWMgdm9pZCB2aXNpdERpdihHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIHByaW50KHQsdmlzaXQsIiAvICIsbnVsbCxudWxsKTsKKyAgICB9CisKKwlwdWJsaWMgdm9pZCB2aXNpdERpdkFzc2lnbihHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHsKKyAgICAgICAgcHJpbnQodCx2aXNpdCwiIC89ICIsbnVsbCxudWxsKTsKKyAgICB9CisJCisgICAgLy8gdmlzaXREb2xsYXIgLi4uCisgICAgLy8gICB0b2tlbiB0eXBlIERPTExBUiBuZXZlciBjcmVhdGVkL3Zpc2l0ZWQsIHNlZSBTQ09QRV9FU0NBUEUgaW5zdGVhZAorICAgIAorICAgIHB1YmxpYyB2b2lkIHZpc2l0RG90KEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkgeworICAgICAgICBwcmludCh0LHZpc2l0LCIuIixudWxsLG51bGwpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB2aXNpdER5bmFtaWNNZW1iZXIoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgIAlpZiAodC5jaGlsZE9mVHlwZShHcm9vdnlUb2tlblR5cGVzLlNUUklOR19DT05TVFJVQ1RPUikgPT0gbnVsbCkgeworICAgIAkJcHJpbnRVcGRhdGluZ1RhYkxldmVsKHQsdmlzaXQsIigiLG51bGwsIikiKTsKKyAgICAJfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEVsaXN0KEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkgeworICAgIAlpZiAoZ2V0UGFyZW50Tm9kZSgpLmdldFR5cGUoKSA9PSBHcm9vdnlUb2tlblR5cGVzLkVOVU1fQ09OU1RBTlRfREVGKSB7CisgICAgCQlwcmludCh0LHZpc2l0LCIoIiwiLCAiLCIpIik7CisgICAgCX0gZWxzZSB7CisgICAgCQlwcmludCh0LHZpc2l0LG51bGwsIiwgIixudWxsKTsKKyAgICAJfQorICAgIH0KKworICAgIC8vIHZpc2l0RW1wdHlTdGF0IC4uLgorICAgIC8vICAgdG9rZW4gdHlwZSBFTVBUWV9TVEFUIG9ic29sZXRlIGFuZCBzaG91bGQgYmUgcmVtb3ZlZCwgbmV2ZXIgdmlzaXRlZC9jcmVhdGVkCisgICAgCisgICAgcHVibGljIHZvaWQgdmlzaXRFbnVtQ29uc3RhbnREZWYoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7CisgICAgCUdyb292eVNvdXJjZUFTVCBzaWJsaW5nID0gKEdyb292eVNvdXJjZUFTVCl0LmdldE5leHRTaWJsaW5nKCk7CisgICAgCWlmIChzaWJsaW5nICE9IG51bGwgJiYgc2libGluZy5nZXRUeXBlKCkgPT0gR3Jvb3Z5VG9rZW5UeXBlcy5FTlVNX0NPTlNUQU5UX0RFRikgeworICAgIAkJcHJpbnQodCx2aXNpdCxudWxsLG51bGwsIiwgIik7CisgICAgCX0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEVudW1EZWYoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7CisgICAgICAgIHByaW50KHQsdmlzaXQsImVudW0gIixudWxsLG51bGwpOworICAgIH0KKworICAgIC8vIHZpc2l0RW9mIC4uLgorICAgIC8vICAgdG9rZW4gdHlwZSBFT0YgbmV2ZXIgdmlzaXRlZC9jcmVhdGVkCisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEVxdWFsKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkgeworICAgICAgICBwcmludCh0LHZpc2l0LCIgPT0gIixudWxsLG51bGwpOworICAgIH0KKworICAgIC8vIHZpc2l0RXhwb25lbnQgLi4uCisgICAgLy8gICB0b2tlbiB0eXBlIEVYUE9ORU5UIG9ubHkgdXNlZCBieSBsZXhlciwgbmV2ZXIgdmlzaXRlZC9jcmVhdGVkCisgICAgCisgICAgcHVibGljIHZvaWQgdmlzaXRFeHByKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkgeworICAgIAkvLyBkbyBub3RoaW5nCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRFeHRlbmRzQ2xhdXNlKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkgeworICAgICAgICBpZiAodmlzaXQgPT0gT1BFTklOR19WSVNJVCkgeworICAgICAgICAgICAgaWYgKHQuZ2V0TnVtYmVyT2ZDaGlsZHJlbigpICE9IDApIHsKKyAgICAgICAgICAgICAgICBwcmludCh0LHZpc2l0LCIgZXh0ZW5kcyAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKwlwdWJsaWMgdm9pZCB2aXNpdEZpbmFsKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgcHJpbnQodCx2aXNpdCwiZmluYWwgIixudWxsLG51bGwpOworCX0KKworCS8vIHZpc2l0RmxvYXRTdWZmaXggLi4uIG5ldmVyIHZpc2l0ZWQvY3JlYXRlZCBzZWUgTlVNX0RPVUJMRSBvciBOVU1fRkxPQVQgaW5zdGVhZAorCQorCXB1YmxpYyB2b2lkIHZpc2l0Rm9yQ29uZGl0aW9uKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAJcHJpbnQodCx2aXNpdCwiIDsgIixudWxsLG51bGwpOworICAgIH0KKwkKKwkvLyB2aXNpdEZvckVhY2hDbGF1c2UgLi4uIAorCS8vICAgRk9SX0VBQ0hfQ0xBVVNFIG9ic29sZXRlIGFuZCBzaG91bGQgYmUgcmVtb3ZlZCwgbmV2ZXIgdmlzaXRlZC9jcmVhdGVkCisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEZvckluaXQoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgIAlwcmludCh0LHZpc2l0LCIoIixudWxsLG51bGwpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEZvckluSXRlcmFibGUoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBwcmludFVwZGF0aW5nVGFiTGV2ZWwodCx2aXNpdCwiKCIsIiBpbiAiLCIpICIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0Rm9ySXRlcmF0b3IoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgIAlwcmludCh0LHZpc2l0LCIgOyAiLG51bGwsIikiKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdmlzaXRHZShHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgCXByaW50KHQsdmlzaXQsIiA+PSAiLG51bGwsbnVsbCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHZpc2l0R3QoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBwcmludCh0LHZpc2l0LCIgPiAiLG51bGwsbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRJZGVudChHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHsKKyAgICAgICAgcHJpbnQodCx2aXNpdCx0LmdldFRleHQoKSxudWxsLG51bGwpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCB2aXNpdEltcGxlbWVudHNDbGF1c2UoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7CisgICAgICAgIGlmICh2aXNpdCA9PSBPUEVOSU5HX1ZJU0lUKSB7CisgICAgICAgICAgICBpZiAodC5nZXROdW1iZXJPZkNoaWxkcmVuKCkgIT0gMCkgeworICAgICAgICAgICAgICAgIHByaW50KHQsdmlzaXQsIiBpbXBsZW1lbnRzICIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICh2aXNpdCA9PSBDTE9TSU5HX1ZJU0lUKSB7CisgICAgICAgICAgICAvL3NwYWNlIGJldHdlZW4gY2xhc3NkZWYgYW5kIG9iamJsb2NrCisgICAgICAgICAgICBwcmludCh0LHZpc2l0LCIgIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEltcGxpY2l0UGFyYW1ldGVycyhHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgCS8vIGRvIG5vdGhpbmcKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEltcG9ydChHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHsKKyAgICAgICAgcHJpbnQodCx2aXNpdCwiaW1wb3J0ICIsbnVsbCxudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEluYyhHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgCXByaW50KHQsdmlzaXQsIisrIixudWxsLG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0SW5kZXhPcChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIHByaW50VXBkYXRpbmdUYWJMZXZlbCh0LHZpc2l0LCJbIixudWxsLCJdIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRJbnRlcmZhY2VEZWYoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7CisgICAgICAgIHByaW50KHQsdmlzaXQsImludGVyZmFjZSAiLG51bGwsbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRJbnN0YW5jZUluaXQoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgIAkvLyBkbyBub3RoaW5nCisJfQorCisJcHVibGljIHZvaWQgdmlzaXRMYWJlbGVkQXJnKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgcHJpbnQodCx2aXNpdCwiOiIsbnVsbCxudWxsKTsKKyAgICB9CisKKwlwdWJsaWMgdm9pZCB2aXNpdExhYmVsZWRTdGF0KEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgcHJpbnQodCx2aXNpdCwiOiIsbnVsbCxudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdExhbmQoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBwcmludCh0LHZpc2l0LCIgJiYgIixudWxsLG51bGwpOworICAgIH0KKworICAgIC8vIHZpc2l0IGxicmFjaygpCisgICAgLy8gICB0b2tlbiB0eXBlIExCUkFDSyBvbmx5IHVzZWQgaW5zaWRlIHBhcnNlciwgbmV2ZXIgdmlzaXRlZC9jcmVhdGVkCisKKyAgICAvLyB2aXNpdCBsY3VybHkoKQorICAgIC8vICAgdG9rZW4gdHlwZSBMQ1VSTFkgb25seSB1c2VkIGluc2lkZSBwYXJzZXIsIG5ldmVyIHZpc2l0ZWQvY3JlYXRlZAorICAgIAorICAgIHB1YmxpYyB2b2lkIHZpc2l0TGUoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgIAlwcmludCh0LHZpc2l0LCIgPD0gIixudWxsLG51bGwpOworICAgIH0KKworICAgIC8vIHZpc2l0TGV0dGVyIC4uLgorICAgIC8vICAgdG9rZW4gdHlwZSBMRVRURVIgb25seSB1c2VkIGJ5IGxleGVyLCBuZXZlciB2aXNpdGVkL2NyZWF0ZWQKKworICAgIHB1YmxpYyB2b2lkIHZpc2l0TGlzdENvbnN0cnVjdG9yKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgcHJpbnRVcGRhdGluZ1RhYkxldmVsKHQsdmlzaXQsIlsiLG51bGwsIl0iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdExpdGVyYWxBcyhHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHsKKyAgICAgICAgcHJpbnQodCx2aXNpdCwiIGFzICIsbnVsbCxudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdExpdGVyYWxBc3NlcnQoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7CisgICAgCWlmICh0LmdldE51bWJlck9mQ2hpbGRyZW4oKSA+IDEpIHsKKyAgICAJCXByaW50KHQsdmlzaXQsImFzc2VydCAiLG51bGwsIiA6ICIpOworICAgIAl9IGVsc2UgeworICAgIAkJcHJpbnQodCx2aXNpdCwiYXNzZXJ0ICIsbnVsbCxudWxsKTsKKyAgICAJfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbEJvb2xlYW4oR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBwcmludCh0LHZpc2l0LCJib29sZWFuIixudWxsLG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbEJyZWFrKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgcHJpbnQodCx2aXNpdCwiYnJlYWsgIixudWxsLG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbEJ5dGUoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBwcmludCh0LHZpc2l0LCJieXRlIixudWxsLG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbENhc2UoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBwcmludCh0LHZpc2l0LCJjYXNlICIsbnVsbCwiOiIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbENhdGNoKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkgeworICAgICAgICBwcmludFVwZGF0aW5nVGFiTGV2ZWwodCx2aXNpdCwiIGNhdGNoICgiLG51bGwsIikgIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRMaXRlcmFsQ2hhcihHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIHByaW50KHQsdmlzaXQsImNoYXIiLG51bGwsbnVsbCk7CisgICAgfQorCisgICAgLy8gdmlzaXRMaXRlcmFsQ2xhc3MgLi4uCisgICAgLy8gICB0b2tlbiB0eXBlICJjbGFzcyIgb25seSB1c2VkIGJ5IHBhcnNlciwgbmV2ZXIgdmlzaXRlZC9jcmVhdGVkIGRpcmVjdGx5CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdExpdGVyYWxDb250aW51ZShHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIHByaW50KHQsdmlzaXQsImNvbnRpbnVlICIsbnVsbCxudWxsKTsKKyAgICB9CisKKyAgICAvLyB2aXNpdExpdGVyYWxEZWYgLi4uCisgICAgLy8gICB0b2tlbiB0eXBlICJkZWYiIG9ubHkgdXNlZCBieSBwYXJzZXIsIG5ldmVyIHZpc2l0ZWQvY3JlYXRlZCBkaXJlY3RseQorCisgICAgcHVibGljIHZvaWQgdmlzaXRMaXRlcmFsRGVmYXVsdChHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHsKKyAgICAgICAgcHJpbnQodCx2aXNpdCwiZGVmYXVsdCIsbnVsbCwiOiIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbERvdWJsZShHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIHByaW50KHQsdmlzaXQsImRvdWJsZSIsbnVsbCxudWxsKTsKKyAgICB9CisKKyAgICAvLyB2aXNpdExpdGVyYWxFbHNlIC4uLgorICAgIC8vICAgdG9rZW4gdHlwZSAiZWxzZSIgb25seSB1c2VkIGJ5IHBhcnNlciwgbmV2ZXIgdmlzaXRlZC9jcmVhdGVkIGRpcmVjdGx5CisKKyAgICAvLyB2aXNpdExpdGVyYWxFbnVtIC4uLgorICAgIC8vICAgdG9rZW4gdHlwZSAiZW51bSIgb25seSB1c2VkIGJ5IHBhcnNlciwgbmV2ZXIgdmlzaXRlZC9jcmVhdGVkIGRpcmVjdGx5CisKKyAgICAvLyB2aXNpdExpdGVyYWxFeHRlbmRzCisgICAgLy8gICB0b2tlbiB0eXBlICJleHRlbmRzIiBvbmx5IHVzZWQgYnkgcGFyc2VyLCBuZXZlciB2aXNpdGVkL2NyZWF0ZWQgZGlyZWN0bHkKKyAgICAKKyAgICBwdWJsaWMgdm9pZCB2aXNpdExpdGVyYWxGYWxzZShHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHsKKyAgICAgICAgcHJpbnQodCx2aXNpdCwiZmFsc2UiLG51bGwsbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRMaXRlcmFsRmluYWxseShHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHsKKyAgICAgICAgcHJpbnQodCx2aXNpdCwiZmluYWxseSAiLG51bGwsbnVsbCk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbEZsb2F0KEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkgeworICAgICAgICBwcmludCh0LHZpc2l0LCJmbG9hdCIsbnVsbCxudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdExpdGVyYWxGb3IoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7CisgICAgICAgIHByaW50KHQsdmlzaXQsImZvciAiLG51bGwsbnVsbCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbElmKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkgeworICAgICAgICAvLyBzbGlnaHRseSBzdHJhbmdlIGFzIHN1YnNlcXVlbnQgdmlzaXQgaXMgZG9uZSBhZnRlciBjbG9zaW5nIHZpc2l0CisgICAgICAgIHByaW50VXBkYXRpbmdUYWJMZXZlbCh0LHZpc2l0LCJpZiAoIiwiIGVsc2UgIiwiKSAiKTsKKyAgICB9CisKKyAgICAvLyB2aXNpdExpdGVyYWxJbXBsZW1lbnRzCisgICAgLy8gICB0b2tlbiB0eXBlICJpbXBsZW1lbnRzIiBvbmx5IHVzZWQgYnkgcGFyc2VyLCBuZXZlciB2aXNpdGVkL2NyZWF0ZWQgZGlyZWN0bHkKKworICAgIC8vIHZpc2l0TGl0ZXJhbEltcG9ydAorICAgIC8vICAgdG9rZW4gdHlwZSAiaW1wb3J0IiBvbmx5IHVzZWQgYnkgcGFyc2VyLCBuZXZlciB2aXNpdGVkL2NyZWF0ZWQgZGlyZWN0bHkKKworICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbEluKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgcHJpbnQodCx2aXNpdCwiIGluICIsbnVsbCxudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdExpdGVyYWxJbnN0YW5jZW9mKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgcHJpbnQodCx2aXNpdCwiIGluc3RhbmNlb2YgIixudWxsLG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbEludChHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHsKKyAgICAgICAgcHJpbnQodCx2aXNpdCwiaW50IixudWxsLG51bGwpOworICAgIH0KKworICAgIC8vIHZpc2l0TGl0ZXJhbEludGVyZmFjZQorICAgIC8vICAgdG9rZW4gdHlwZSAiaW50ZXJmYWNlIiBvbmx5IHVzZWQgYnkgcGFyc2VyLCBuZXZlciB2aXNpdGVkL2NyZWF0ZWQgZGlyZWN0bHkKKworICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbExvbmcoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7CisgICAgICAgIHByaW50KHQsdmlzaXQsImxvbmciLG51bGwsbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRMaXRlcmFsTmF0aXZlKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkgeworICAgICAgICBwcmludCh0LHZpc2l0LCJuYXRpdmUgIixudWxsLG51bGwpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCB2aXNpdExpdGVyYWxOZXcoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7CisgICAgCWlmICh0LmNoaWxkT2ZUeXBlKEdyb292eVRva2VuVHlwZXMuQVJSQVlfREVDTEFSQVRPUikgPT0gbnVsbCkgeworICAgIAkJLy8gb25seSBwcmludCBwYXJlbnRoZXNpcyBpZiBpcyBub3Qgb2YgZm9ybSBkZWYgeCA9IG5ldyBpbnRbNV0KKyAgICAJCXByaW50KHQsdmlzaXQsIm5ldyAiLCIoIiwiKSIpOworICAgIAl9IGVsc2UgeworICAgIAkJcHJpbnQodCx2aXNpdCwibmV3ICIsbnVsbCxudWxsKTsKKyAgICAJfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbE51bGwoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBwcmludCh0LHZpc2l0LCJudWxsIixudWxsLG51bGwpOworICAgIH0KKworICAgIC8vIHZpc2l0TGl0ZXJhbFBhY2thZ2UKKyAgICAvLyAgIHRva2VuIHR5cGUgInBhY2thZ2UiIG9ubHkgdXNlZCBieSBwYXJzZXIsIG5ldmVyIHZpc2l0ZWQvY3JlYXRlZCBkaXJlY3RseQorCisgICAgcHVibGljIHZvaWQgdmlzaXRMaXRlcmFsUHJpdmF0ZShHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHsKKyAgICAgICAgcHJpbnQodCx2aXNpdCwicHJpdmF0ZSAiLG51bGwsbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRMaXRlcmFsUHJvdGVjdGVkKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkgeworICAgICAgICBwcmludCh0LHZpc2l0LCJwcm90ZWN0ZWQgIixudWxsLG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbFB1YmxpYyhHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHsKKyAgICAgICAgcHJpbnQodCx2aXNpdCwicHVibGljICIsbnVsbCxudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdExpdGVyYWxSZXR1cm4oR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBwcmludCh0LHZpc2l0LCJyZXR1cm4gIixudWxsLG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbFNob3J0KEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkgeworICAgICAgICBwcmludCh0LHZpc2l0LCJzaG9ydCIsbnVsbCxudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdExpdGVyYWxTdGF0aWMoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBwcmludCh0LHZpc2l0LCJzdGF0aWMgIixudWxsLG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbFN1cGVyKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAJLy8gb25seSB2aXNpdGVkIHdoZW4gY2FsbGluZyBzdXBlcigpIHdpdGhvdXQgcGFyZW50aGVzZXMsIGkuZS4gInN1cGVyIDk5IiBpcyBlcXVpdmFsZW50IHRvICJzdXBlcig5OSkiCisgICAgCXByaW50KHQsdmlzaXQsInN1cGVyIixudWxsLG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbFN3aXRjaChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIGlmICh2aXNpdCA9PSBPUEVOSU5HX1ZJU0lUKSB7CisgICAgICAgICAgICBwcmludCh0LHZpc2l0LCJzd2l0Y2ggKCIpOworICAgICAgICAgICAgdGFiTGV2ZWwrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAodmlzaXQgPT0gU1VCU0VRVUVOVF9WSVNJVCkgeworICAgICAgICAgICAgcHJpbnQodCx2aXNpdCwiKSB7Iik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZpc2l0ID09IENMT1NJTkdfVklTSVQpIHsKKyAgICAgICAgICAgIHRhYkxldmVsLS07CisgICAgICAgICAgICBwcmludCh0LHZpc2l0LCJ9Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdExpdGVyYWxTeW5jaHJvbml6ZWQoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7CisgICAgCWlmICh0LmdldE51bWJlck9mQ2hpbGRyZW4oKSA+IDApIHsKKyAgICAJCXByaW50KHQsdmlzaXQsInN5bmNocm9uaXplZCAoIixudWxsLCIpICIpOworICAgIAl9IGVsc2UgeworICAgIAkJcHJpbnQodCx2aXNpdCwic3luY2hyb25pemVkICIsbnVsbCxudWxsKTsgICAgCQkKKyAgICAJfQorCX0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbFRoaXMoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBwcmludCh0LHZpc2l0LCJ0aGlzIixudWxsLG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbFRocmVhZHNhZmUoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7CisgICAgICAgIHByaW50KHQsdmlzaXQsInRocmVhZHNhZmUgIixudWxsLG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbFRocm93KEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgcHJpbnQodCx2aXNpdCwidGhyb3cgIixudWxsLG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbFRocm93cyhHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIHByaW50KHQsdmlzaXQsInRocm93cyAiLG51bGwsbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRMaXRlcmFsVHJhbnNpZW50KEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkgeworICAgICAgICBwcmludCh0LHZpc2l0LCJ0cmFuc2llbnQgIixudWxsLG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbFRydWUoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7CisgICAgICAgIHByaW50KHQsdmlzaXQsInRydWUiLG51bGwsbnVsbCk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbFRyeShHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHsKKyAgICAgICAgcHJpbnQodCx2aXNpdCwidHJ5ICIsbnVsbCxudWxsKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdmlzaXRMaXRlcmFsVm9pZChHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHsKKyAgICAgICAgcHJpbnQodCx2aXNpdCwidm9pZCIsbnVsbCxudWxsKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdmlzaXRMaXRlcmFsVm9sYXRpbGUoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7CisgICAgICAgIHByaW50KHQsdmlzaXQsInZvbGF0aWxlICIsbnVsbCxudWxsKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdmlzaXRMaXRlcmFsV2hpbGUoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7CisgICAgICAgIHByaW50VXBkYXRpbmdUYWJMZXZlbCh0LHZpc2l0LCJ3aGlsZSAoIixudWxsLCIpICIpOworICAgIH0KKworLy9kZXByZWNhdGVkCisvLyAgcHVibGljIHZvaWQgdmlzaXRMaXRlcmFsV2l0aChHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHsKKy8vICAgICAgICBwcmludFVwZGF0aW5nVGFiTGV2ZWwodCx2aXNpdCwid2l0aCAoIixudWxsLCIpICIpOworLy8gICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHZpc2l0TG5vdChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIHByaW50KHQsdmlzaXQsIiEiLG51bGwsbnVsbCk7CisgICAgfQorCisJLy8gTm90ZTogb2xkIGNsb3N1cmUgc3ludGF4IHVzaW5nIExPUiBpcyBkZXByZWNhdGVkLCBhbmQgYWxzbyBuZXZlciBjcmVhdGVzL3Zpc2l0cyBhIExPUiBub2RlCisgICAgcHVibGljIHZvaWQgdmlzaXRMb3IoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBwcmludCh0LHZpc2l0LCIgfHwgIixudWxsLG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0THQoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBwcmludCh0LHZpc2l0LCIgPCAiLG51bGwsbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRNYXBDb25zdHJ1Y3RvcihHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIGlmICh0LmdldE51bWJlck9mQ2hpbGRyZW4oKSA9PSAwKSB7CisgICAgICAgICAgICBwcmludCh0LHZpc2l0LCJbOl0iLG51bGwsbnVsbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludFVwZGF0aW5nVGFiTGV2ZWwodCx2aXNpdCwiWyIsbnVsbCwiXSIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRNZW1iZXJQb2ludGVyKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgcHJpbnQodCx2aXNpdCwiLiYiLG51bGwsbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRNZXRob2RDYWxsKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkgeworICAgIAlpZiAoIjxjb21tYW5kPiIuZXF1YWxzKHQuZ2V0VGV4dCgpKSkgeworICAgIAkJcHJpbnRVcGRhdGluZ1RhYkxldmVsKHQsdmlzaXQsIiAiLCIgIixudWxsKTsKKyAgICAJfSBlbHNlIHsKKyAgICAJCXByaW50VXBkYXRpbmdUYWJMZXZlbCh0LHZpc2l0LCIoIiwiICIsIikiKTsKKyAgICAJfQorICAgIH0KKyAgICBwdWJsaWMgdm9pZCB2aXNpdE1ldGhvZERlZihHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHsKKyAgICAgICAgLy9kbyBub3RoaW5nCisgICAgfQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TWludXMoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7CisgICAgICAgIHByaW50KHQsdmlzaXQsIiAtICIsbnVsbCxudWxsKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdmlzaXRNaW51c0Fzc2lnbihHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIHByaW50KHQsdmlzaXQsIiAtPSAiLG51bGwsbnVsbCk7CisgICAgfQorCisgICAgLy8gdmlzaXRNbENvbW1lbnQKKyAgICAvLyAgIG11bHRpLWxpbmUgY29tbWVudHMgYXJlIG5vdCBjcmVhdGVkIG9uIHRoZSBBU1QgY3VycmVudGx5LgorCisgICAgcHVibGljIHZvaWQgdmlzaXRNb2QoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBwcmludCh0LHZpc2l0LCIgJSAiLG51bGwsbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRNb2RpZmllcnMoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7CisgICAgICAgIC8vZG8gbm90aGluZworICAgIH0KKyAgICBwdWJsaWMgdm9pZCB2aXNpdE1vZEFzc2lnbihHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIHByaW50KHQsdmlzaXQsIiAlPSAiLG51bGwsbnVsbCk7CisgICAgfQorCisgICAgLy8gdmlzaXRObHMKKyAgICAvLyAgIG5ldyBsaW5lcyBhcmUgdXNlZCBieSBwYXJzZXIsIGJ1dCBhcmUgbm90IGNyZWF0ZWQgb24gdGhlIEFTVCwKKyAgICAvLyAgIHRoZXkgY2FuIGJlIGltcGxpZWQgYnkgdGhlIHNvdXJjZSBjb2RlIGxpbmUvY29sdW1uIGluZm9ybWF0aW9uCisKKyAgICAvLyB2aXNpdE51bGxUcmVlTG9va2FoZWFkCisgICAgLy8gICBub3QgdXNlZCBleHBsaWNpdGx5IGJ5IHBhcnNlci4KKyAgICAKKyAgICAKKyAgICBwdWJsaWMgdm9pZCB2aXNpdE5vdEVxdWFsKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgcHJpbnQodCx2aXNpdCwiICE9ICIsbnVsbCxudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdE51bUJpZ0RlY2ltYWwoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7CisgICAgICAgIHByaW50KHQsdmlzaXQsdC5nZXRUZXh0KCksbnVsbCxudWxsKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdmlzaXROdW1CaWdJbnQoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7CisgICAgICAgIHByaW50KHQsdmlzaXQsdC5nZXRUZXh0KCksbnVsbCxudWxsKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdmlzaXROdW1Eb3VibGUoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7CisgICAgICAgIHByaW50KHQsdmlzaXQsdC5nZXRUZXh0KCksbnVsbCxudWxsKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdmlzaXROdW1JbnQoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7CisgICAgICAgIHByaW50KHQsdmlzaXQsdC5nZXRUZXh0KCksbnVsbCxudWxsKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdmlzaXROdW1GbG9hdChHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHsKKyAgICAgICAgcHJpbnQodCx2aXNpdCx0LmdldFRleHQoKSxudWxsLG51bGwpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCB2aXNpdE51bUxvbmcoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7CisgICAgICAgIHByaW50KHQsdmlzaXQsdC5nZXRUZXh0KCksbnVsbCxudWxsKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdmlzaXRPYmpibG9jayhHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHsKKyAgICAgICAgaWYgKHZpc2l0ID09IE9QRU5JTkdfVklTSVQpIHsKKyAgICAgICAgICAgIHRhYkxldmVsKys7CisgICAgICAgICAgICBwcmludCh0LHZpc2l0LCJ7Iik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0YWJMZXZlbC0tOworICAgICAgICAgICAgcHJpbnQodCx2aXNpdCwifSIpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gdmlzaXRPbmVObAorICAgIC8vICAgbmV3IGxpbmVzIGFyZSB1c2VkIGJ5IHBhcnNlciwgYnV0IGFyZSBub3QgY3JlYXRlZCBvbiB0aGUgQVNULAorICAgIC8vICAgdGhleSBjYW4gYmUgaW1wbGllZCBieSB0aGUgc291cmNlIGNvZGUgbGluZS9jb2x1bW4gaW5mb3JtYXRpb24KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0T3B0aW9uYWxEb3QoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7CisgICAgICAgIHByaW50KHQsdmlzaXQsIj8uIixudWxsLG51bGwpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFBhY2thZ2VEZWYoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBwcmludCh0LHZpc2l0LCJwYWNrYWdlICIsbnVsbCxudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFBhcmFtZXRlckRlZihHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHsKKyAgICAgICAgLy9kbyBub3RoaW5nCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRQYXJhbWV0ZXJzKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkgeworICAgIAlpZiAoZ2V0UGFyZW50Tm9kZSgpLmdldFR5cGUoKSA9PSBHcm9vdnlUb2tlblR5cGVzLkNMT1NBQkxFX0JMT0NLKSB7CisgICAgCQlwcmludFVwZGF0aW5nVGFiTGV2ZWwodCx2aXNpdCxudWxsLCIsIiwiICIpOworICAgIAl9IGVsc2UgeworICAgIAkJcHJpbnRVcGRhdGluZ1RhYkxldmVsKHQsdmlzaXQsIigiLCIsICIsIikgIik7CisgICAgCX0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFBsdXMoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBwcmludCh0LHZpc2l0LCIgKyAiLG51bGwsbnVsbCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHZpc2l0UGx1c0Fzc2lnbihHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIHByaW50KHQsdmlzaXQsIiArPSAiLG51bGwsbnVsbCk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHZpc2l0UG9zdERlYyhHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgCXByaW50KHQsdmlzaXQsbnVsbCxudWxsLCItLSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0UG9zdEluYyhHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgCXByaW50KHQsdmlzaXQsbnVsbCxudWxsLCIrKyIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0UXVlc3Rpb24oR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICAvLyB0ZXJuYXJ5IG9wZXJhdG9yCisgICAgICAgIHByaW50KHQsdmlzaXQsIj8iLCI6IixudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFJhbmdlRXhjbHVzaXZlKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAgICAgcHJpbnQodCx2aXNpdCwiLi48IixudWxsLG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0UmFuZ2VJbmNsdXNpdmUoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgICAgICBwcmludCh0LHZpc2l0LCIuLiIsbnVsbCxudWxsKTsKKyAgICB9CisKKyAgICAvLyB2aXNpdCByYnJhY2soKQorICAgIC8vICAgdG9rZW4gdHlwZSBSQlJBQ0sgb25seSB1c2VkIGluc2lkZSBwYXJzZXIsIG5ldmVyIHZpc2l0ZWQvY3JlYXRlZAorCisgICAgLy8gdmlzaXQgcmN1cmx5KCkKKyAgICAvLyAgIHRva2VuIHR5cGUgUkNVUkxZIG9ubHkgdXNlZCBpbnNpZGUgcGFyc2VyLCBuZXZlciB2aXNpdGVkL2NyZWF0ZWQKKworICAgIC8vIHZpc2l0IFJlZ2V4cEN0b3JFbmQKKyAgICAvLyB2aXNpdCBSZWdleHBMaXRlcmFsCisgICAgLy8gdmlzaXQgUmVnZXhwU3ltYm9sCisgICAgLy8gICAgdG9rZW4gdHlwZXMgUkVHRVhQX0NUT1JfRU5ELCBSRUdFWFBfTElURVJBTCwgUkVHRVhQX1NZTUJPTCBvbmx5IHVzZWQgaW5zaWRlIGxleGVyCisgICAgCisgICAgcHVibGljIHZvaWQgdmlzaXRSZWdleEZpbmQoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgIAlwcmludCh0LHZpc2l0LCIgPX4gIixudWxsLG51bGwpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCB2aXNpdFJlZ2V4TWF0Y2goR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgIAlwcmludCh0LHZpc2l0LCIgPT1+ICIsbnVsbCxudWxsKTsKKyAgICB9CisgICAgLy8gdmlzaXQgcnBhcmVuKCkKKyAgICAvLyAgIHRva2VuIHR5cGUgUlBBUkVOIG9ubHkgdXNlZCBpbnNpZGUgcGFyc2VyLCBuZXZlciB2aXNpdGVkL2NyZWF0ZWQKKworICAgIHB1YmxpYyB2b2lkIHZpc2l0U2VsZWN0U2xvdChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgCXByaW50KHQsdmlzaXQsIkAiLG51bGwsbnVsbCk7CisgICAgfQorICAgIAorICAgIC8vIHZpc2l0IHNlbWkoKQorICAgIC8vICBTRU1JIG9ubHkgdXNlZCBpbnNpZGUgcGFyc2VyLCBuZXZlciB2aXNpdGVkL2NyZWF0ZWQgKHNlZSB2aXNpdEZvckNvbmRpdGlvbigpLCB2aXNpdEZvckl0ZXJhdG9yKCkpCisgICAgCisgICAgLy8gdmlzaXQgU2hDb21tZW50KCkKKyAgICAvLyAgbmV2ZXIgdmlzaXRlZC9jcmVhdGVkIGJ5IHBhcnNlcgorICAgIAorICAgIHB1YmxpYyB2b2lkIHZpc2l0U2woR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgIAlwcmludCh0LHZpc2l0LCIgPDwgIixudWxsLG51bGwpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCB2aXNpdFNsQXNzaWduKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAJcHJpbnQodCx2aXNpdCwiIDw8PSAiLG51bGwsbnVsbCk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHZpc2l0U2xpc3QoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7CisgICAgICAgIGlmICh2aXNpdCA9PSBPUEVOSU5HX1ZJU0lUKSB7CisgICAgICAgICAgICB0YWJMZXZlbCsrOworICAgICAgICAgICAgcHJpbnQodCx2aXNpdCwieyIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGFiTGV2ZWwtLTsKKyAgICAgICAgICAgIHByaW50KHQsdmlzaXQsIn0iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHZpc2l0IFNsQ29tbWVudCgpCisgICAgLy8gICBuZXZlciB2aXNpdGVkL2NyZWF0ZWQgYnkgcGFyc2VyCisgICAgCisgICAgcHVibGljIHZvaWQgdmlzaXRTcHJlYWRBcmcoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7CisgICAgCXByaW50KHQsdmlzaXQsIioiLG51bGwsbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRTcHJlYWREb3QoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7CisJcHJpbnQodCx2aXNpdCwiKi4iLG51bGwsbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRTcHJlYWRNYXBBcmcoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7CisgICAgCXByaW50KHQsdmlzaXQsIio6IixudWxsLG51bGwpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFNyKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAJcHJpbnQodCx2aXNpdCwiID4+ICIsbnVsbCxudWxsKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdmlzaXRTckFzc2lnbihHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgCXByaW50KHQsdmlzaXQsIiA+Pj0gIixudWxsLG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0U3RhcihHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHsKKyAgICAgICAgcHJpbnQodCx2aXNpdCwiKiIsbnVsbCxudWxsKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdmlzaXRTdGFyQXNzaWduKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAJcHJpbnQodCx2aXNpdCwiICo9ICIsbnVsbCxudWxsKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdmlzaXRTdGFyU3RhcihHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHsKKyAgICAgICAgcHJpbnQodCx2aXNpdCwiKioiLG51bGwsbnVsbCk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHZpc2l0U3RhclN0YXJBc3NpZ24oR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgIAlwcmludCh0LHZpc2l0LCIgKio9ICIsbnVsbCxudWxsKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdmlzaXRTdGF0aWNJbml0KEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAJcHJpbnQodCx2aXNpdCwic3RhdGljICIsbnVsbCxudWxsKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdmlzaXRTdGF0aWNJbXBvcnQoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7CisgICAgICAgIHByaW50KHQsdmlzaXQsImltcG9ydCBzdGF0aWMgIixudWxsLG51bGwpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCB2aXNpdFN0cmljdGZwKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkgeworICAgIAlwcmludCh0LHZpc2l0LCJzdHJpY3RmcCAiLG51bGwsbnVsbCk7CisgICAgfQorCisgICAgLy8gdmlzaXRTdHJpbmdjaAorICAgIC8vICAgU3RyaW5nIGNoYXJhY3RlcnMgb25seSB1c2VkIGJ5IGxleGVyLCBuZXZlciB2aXNpdGVkL2NyZWF0ZWQgZGlyZWN0bHkKKworCisgICAgcHVibGljIHZvaWQgdmlzaXRTdHJpbmdDb25zdHJ1Y3RvcihHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHsKKyAgICAgICAgaWYgKHZpc2l0ID09IE9QRU5JTkdfVklTSVQpIHsKKyAgICAgICAgICAgIHN0cmluZ0NvbnN0cnVjdG9yQ291bnRlciA9IDA7CisgICAgICAgICAgICBwcmludCh0LHZpc2l0LCJcIiIpOworICAgICAgICB9CisgICAgICAgIGlmICh2aXNpdCA9PSBTVUJTRVFVRU5UX1ZJU0lUKSB7CisgICAgICAgICAgICAvLyBldmVyeSBvdGhlciBzdWJzZXF1ZW50IHZpc2l0IHVzZSBhbiBlc2NhcGluZyAkCisgICAgICAgICAgICBpZiAoc3RyaW5nQ29uc3RydWN0b3JDb3VudGVyICUgMiA9PSAwKSB7CisgICAgICAgICAgICAgICBwcmludCh0LHZpc2l0LCIkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJpbmdDb25zdHJ1Y3RvckNvdW50ZXIrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAodmlzaXQgPT0gQ0xPU0lOR19WSVNJVCkgeworICAgICAgICAgICAgcHJpbnQodCx2aXNpdCwiXCIiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0U3RyaW5nTGl0ZXJhbChHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHsKKyAgICAgICAgaWYgKHZpc2l0ID09IE9QRU5JTkdfVklTSVQpIHsKKyAgICAgICAgICAgIFN0cmluZyB0aGVTdHJpbmcgPSBlc2NhcGUodC5nZXRUZXh0KCkpOworICAgICAgICBpZiAoZ2V0UGFyZW50Tm9kZSgpLmdldFR5cGUoKSAhPSBHcm9vdnlUb2tlblR5cGVzLkxBQkVMRURfQVJHICYmCisgICAgICAgICAgICBnZXRQYXJlbnROb2RlKCkuZ2V0VHlwZSgpICE9IEdyb292eVRva2VuVHlwZXMuU1RSSU5HX0NPTlNUUlVDVE9SKSB7CisgICAgICAgICAgICAgICAgdGhlU3RyaW5nID0gIlwiIiArIHRoZVN0cmluZyArICJcIiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmludCh0LHZpc2l0LHRoZVN0cmluZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBlc2NhcGUoU3RyaW5nIGxpdGVyYWwpIHsKKyAgICAgICAgbGl0ZXJhbCA9IGxpdGVyYWwucmVwbGFjZUFsbCgiXG4iLCJcXFxcPDxSRU1PVkU+Pm4iKTsgLy8gY2FuJ3Qgc2VlbSB0byBkbyBcbiBpbiBvbmUgZ28gd2l0aCBKYXZhIHJlZ2V4CisgICAgICAgIGxpdGVyYWwgPSBsaXRlcmFsLnJlcGxhY2VBbGwoIjw8UkVNT1ZFPj4iLCIiKTsKKyAgICAgICAgcmV0dXJuIGxpdGVyYWw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRTdXBlckN0b3JDYWxsKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkgeworCQlwcmludFVwZGF0aW5nVGFiTGV2ZWwodCx2aXNpdCwic3VwZXIoIiwiICIsIikiKTsKKyAgICB9CisgICAgCisgICAgLy8gdmlzaXQgVHJpcGxlRG90LCBub3QgdXNlZCBpbiB0aGUgQVNUCisgICAgCisgICAgcHVibGljIHZvaWQgdmlzaXRUeXBlKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkgeworICAgICAgICBHcm9vdnlTb3VyY2VBU1QgcGFyZW50ID0gZ2V0UGFyZW50Tm9kZSgpOworICAgICAgICBHcm9vdnlTb3VyY2VBU1QgbW9kaWZpZXJzID0gcGFyZW50LmNoaWxkT2ZUeXBlKEdyb292eVRva2VuVHlwZXMuTU9ESUZJRVJTKTsKKworICAgICAgICAvLyBObyBuZWVkIHRvIHByaW50ICdkZWYnIGlmIHdlIGFscmVhZHkgaGF2ZSBzb21lIG1vZGlmaWVycworICAgICAgICBpZiAobW9kaWZpZXJzID09IG51bGwgfHwgbW9kaWZpZXJzLmdldE51bWJlck9mQ2hpbGRyZW4oKSA9PSAwKSB7CisKKyAgICAgICAgICAgIGlmICh2aXNpdCA9PSBPUEVOSU5HX1ZJU0lUKSB7CisgICAgICAgICAgICAgICAgaWYgKHQuZ2V0TnVtYmVyT2ZDaGlsZHJlbigpID09IDAgJiYgCisgICAgICAgICAgICAgICAgCQlwYXJlbnQuZ2V0VHlwZSgpICE9IEdyb292eVRva2VuVHlwZXMuUEFSQU1FVEVSX0RFRikgeyAvLyBubyBuZWVkIGZvciAnZGVmJyBpZiBpbiBhIHBhcmFtZXRlciBsaXN0CisgICAgICAgICAgICAgICAgICAgIHByaW50KHQsdmlzaXQsImRlZiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gCisgICAgICAgICAgICBpZiAodmlzaXQgPT0gQ0xPU0lOR19WSVNJVCkgeworICAgICAgICAgICAgICAgIGlmICggIHBhcmVudC5nZXRUeXBlKCkgPT0gR3Jvb3Z5VG9rZW5UeXBlcy5WQVJJQUJMRV9ERUYgICAgICAgICB8fAorICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5nZXRUeXBlKCkgPT0gR3Jvb3Z5VG9rZW5UeXBlcy5NRVRIT0RfREVGICAgICAgICAgICB8fAorICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5nZXRUeXBlKCkgPT0gR3Jvb3Z5VG9rZW5UeXBlcy5BTk5PVEFUSU9OX0ZJRUxEX0RFRiB8fAorICAgICAgICAgICAgICAgICAgICAgKHBhcmVudC5nZXRUeXBlKCkgPT0gR3Jvb3Z5VG9rZW5UeXBlcy5QQVJBTUVURVJfREVGICYmIHQuZ2V0TnVtYmVyT2ZDaGlsZHJlbigpIT0wKSkgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwcmludCh0LHZpc2l0LCIgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgIAkvKmlmICh2aXNpdCA9PSBDTE9TSU5HX1ZJU0lUKSB7CisgICAgICAgIAkJcHJpbnQodCx2aXNpdCwiICIpOworICAgICAgICAgICAgfSovCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgIAlpZiAodmlzaXQgPT0gQ0xPU0lOR19WSVNJVCkgeworICAgICAgICAJCWlmICh0LmdldE51bWJlck9mQ2hpbGRyZW4oKSAhPSAwKSB7CisgICAgICAgIAkJCXByaW50KHQsdmlzaXQsIiAiKTsKKyAgICAgICAgCQl9CisgICAgICAgIAl9CisgICAgICAgIH0KKyAgICB9CisgICAgcHVibGljIHZvaWQgdmlzaXRUeXBlQXJndW1lbnQoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgIAkvLyBwcmludCBub3RoaW5nCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRUeXBlQXJndW1lbnRzKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAJcHJpbnQodCx2aXNpdCwiPCIsIiwgIiwiPiIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0VHlwZWNhc3QoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7CisgICAgICAgIHByaW50KHQsdmlzaXQsIigiLG51bGwsIikiKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdmlzaXRUeXBlTG93ZXJCb3VuZHMoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7CisgICAgICAgIHByaW50KHQsdmlzaXQsIiBzdXBlciAiLCIgJiAiLG51bGwpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCB2aXNpdFR5cGVQYXJhbWV0ZXIoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgIAkvLyBwcmludCBub3RoaW5nCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRUeXBlUGFyYW1ldGVycyhHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgCXByaW50KHQsdmlzaXQsIjwiLCIsICIsIj4iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFR5cGVVcHBlckJvdW5kcyhHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHsKKyAgICAgICAgcHJpbnQodCx2aXNpdCwiIGV4dGVuZHMgIiwiICYgIixudWxsKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdmlzaXRVbmFyeU1pbnVzKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpIHsKKyAgICAJcHJpbnQodCx2aXNpdCwiLSIsbnVsbCxudWxsKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdmlzaXRVbmFyeVBsdXMoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCkgeworICAgIAlwcmludCh0LHZpc2l0LCIrIixudWxsLG51bGwpOworICAgIH0KKworICAgIC8vIHZpc2l0IFVudXNlZCAiY29uc3QiLCAiZG8iLCAiZ290byIgLSB1bnN1cnByaXNpbmdseSB0aGVzZSBhcmUgdW51c2VkIGJ5IHRoZSBBU1QuCisgICAgCisgICAgcHVibGljIHZvaWQgdmlzaXRWYXJpYWJsZURlZihHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHsKKyAgICAgICAgLy8gZG8gbm90aGluZworICAgIH0KKworICAgIC8vIGEuay5hLiAidmFyaWFibGUgYXJpdHkgcGFyYW1ldGVyIiBpbiB0aGUgSkxTCisgICAgcHVibGljIHZvaWQgdmlzaXRWYXJpYWJsZVBhcmFtZXRlckRlZihHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHsKKyAgICAgICAgcHJpbnQodCx2aXNpdCxudWxsLCIuLi4gIixudWxsKTsKKyAgICB9CisgICAgCisgICAgLy8gdmlzaXQgVm9jYWIgLSBvbmx5IHVzZWQgYnkgTGV4ZXIKKyAgICAKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFdpbGRjYXJkVHlwZShHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgCXByaW50KHQsdmlzaXQsIj8iLG51bGwsbnVsbCk7CisgICAgfQorCisgICAgLy8gdmlzaXQgV1MgLSBvbmx5IHVzZWQgYnkgbGV4ZXIKKyAgICAKKyAgICAKKyAgICAKKyAgICBwdWJsaWMgdm9pZCB2aXNpdERlZmF1bHQoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7CisgICAgICAgIGlmICh2aXNpdCA9PSBPUEVOSU5HX1ZJU0lUKSB7CisgICAgICAgICAgICBwcmludCh0LHZpc2l0LCI8IiArIHRva2VuTmFtZXNbdC5nZXRUeXBlKCldICsgIj4iKTsKKyAgICAgICAgICAgIC8vb3V0LnByaW50KCI8IiArIHQuZ2V0VHlwZSgpICsgIj4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50KHQsdmlzaXQsIjwvIiArIHRva2VuTmFtZXNbdC5nZXRUeXBlKCldICsgIj4iKTsKKyAgICAgICAgICAgIC8vb3V0LnByaW50KCI8LyIgKyB0LmdldFR5cGUoKSArICI+Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBwcmludFVwZGF0aW5nVGFiTGV2ZWwoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0LFN0cmluZyBvcGVuaW5nLCBTdHJpbmcgc3Vic2VxdWVudCwgU3RyaW5nIGNsb3NpbmcpIHsKKyAgICAgICAgaWYgKHZpc2l0ID09IE9QRU5JTkdfVklTSVQgJiYgb3BlbmluZyAhPSBudWxsKSB7CisgICAgICAgICAgICBwcmludCh0LHZpc2l0LG9wZW5pbmcpOworICAgICAgICAgICAgdGFiTGV2ZWwrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAodmlzaXQgPT0gU1VCU0VRVUVOVF9WSVNJVCAmJiBzdWJzZXF1ZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHByaW50KHQsdmlzaXQsc3Vic2VxdWVudCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZpc2l0ID09IENMT1NJTkdfVklTSVQgJiYgY2xvc2luZyAhPSBudWxsKSB7CisgICAgICAgICAgICB0YWJMZXZlbC0tOworICAgICAgICAgICAgcHJpbnQodCx2aXNpdCxjbG9zaW5nKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHByaW50KEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCxTdHJpbmcgb3BlbmluZywgU3RyaW5nIHN1YnNlcXVlbnQsIFN0cmluZyBjbG9zaW5nKSB7CisgICAgICAgIGlmICh2aXNpdCA9PSBPUEVOSU5HX1ZJU0lUICYmIG9wZW5pbmcgIT0gbnVsbCkgeworICAgICAgICAgICAgcHJpbnQodCx2aXNpdCxvcGVuaW5nKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmlzaXQgPT0gU1VCU0VRVUVOVF9WSVNJVCAmJiBzdWJzZXF1ZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHByaW50KHQsdmlzaXQsc3Vic2VxdWVudCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZpc2l0ID09IENMT1NJTkdfVklTSVQgJiYgY2xvc2luZyAhPSBudWxsKSB7CisgICAgICAgICAgICBwcmludCh0LHZpc2l0LGNsb3NpbmcpOworICAgICAgICB9CisgICAgfQorICAgIHByb3RlY3RlZCB2b2lkIHByaW50KEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCxTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgaWYodmlzaXQgPT0gT1BFTklOR19WSVNJVCkgeworICAgICAgICAgICAgcHJpbnROZXdsaW5lQW5kSW5kZW50KHQsIHZpc2l0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmlzaXQgPT0gQ0xPU0lOR19WSVNJVCkgeworICAgICAgICAgICAgcHJpbnROZXdsaW5lQW5kSW5kZW50KHQsIHZpc2l0KTsKKyAgICAgICAgfQorICAgICAgICBvdXQucHJpbnQodmFsdWUpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHByaW50TmV3bGluZUFuZEluZGVudChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgICAgIGludCBjdXJyZW50TGluZSA9IHQuZ2V0TGluZSgpOworICAgICAgICBpZiAobGFzdExpbmVQcmludGVkID09IDApIHsgbGFzdExpbmVQcmludGVkID0gY3VycmVudExpbmU7IH0KKyAgICAgICAgaWYgKGxhc3RMaW5lUHJpbnRlZCAhPSBjdXJyZW50TGluZSkgeworICAgICAgICAgICAgaWYgKG5ld0xpbmVzKSB7CisgICAgICAgICAgICAgICAgaWYgKCEodmlzaXQgPT0gT1BFTklOR19WSVNJVCAmJiB0LmdldFR5cGUoKSA9PSBHcm9vdnlUb2tlblR5cGVzLlNMSVNUKSkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpPWxhc3RMaW5lUHJpbnRlZDtpPGN1cnJlbnRMaW5lO2krKykgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobGFzdExpbmVQcmludGVkID4gY3VycmVudExpbmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0TGluZVByaW50ZWQgPSBjdXJyZW50TGluZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAodmlzaXQgPT0gT1BFTklOR19WSVNJVCB8fCAodmlzaXQgPT0gQ0xPU0lOR19WSVNJVCAmJiBsYXN0TGluZVByaW50ZWQgPiBjdXJyZW50TGluZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDtpPHRhYkxldmVsO2krKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiICAgICIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbGFzdExpbmVQcmludGVkID0gTWF0aC5tYXgoY3VycmVudExpbmUsbGFzdExpbmVQcmludGVkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHB1c2goR3Jvb3Z5U291cmNlQVNUIHQpIHsKKyAgICAgICAgc3RhY2sucHVzaCh0KTsKKyAgICB9CisgICAgcHVibGljIEdyb292eVNvdXJjZUFTVCBwb3AoKSB7CisgICAgICAgIGlmICghc3RhY2suZW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIChHcm9vdnlTb3VyY2VBU1QpIHN0YWNrLnBvcCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgR3Jvb3Z5U291cmNlQVNUIGdldFBhcmVudE5vZGUoKSB7CisgICAgICAgIE9iamVjdCBjdXJyZW50Tm9kZSA9IHN0YWNrLnBvcCgpOworICAgICAgICBPYmplY3QgcGFyZW50Tm9kZSA9IHN0YWNrLnBlZWsoKTsKKyAgICAgICAgc3RhY2sucHVzaChjdXJyZW50Tm9kZSk7CisgICAgICAgIHJldHVybiAoR3Jvb3Z5U291cmNlQVNUKSBwYXJlbnROb2RlOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvdHJlZXdhbGtlci9UcmF2ZXJzYWxIZWxwZXIuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudGxyL3RyZWV3YWxrZXIvVHJhdmVyc2FsSGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY1NDUyZAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudGxyL3RyZWV3YWxrZXIvVHJhdmVyc2FsSGVscGVyLmphdmEKQEAgLTAsMCArMSw1MzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNSBKZXJlbXkgUmF5bmVyCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5hbnRsci50cmVld2Fsa2VyOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50bHIuR3Jvb3Z5U291cmNlQVNUOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50bHIuQW50bHJBU1RQcm9jZXNzb3I7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hbnRsci5wYXJzZXIuR3Jvb3Z5VG9rZW5UeXBlczsKKworaW1wb3J0IGFudGxyLmNvbGxlY3Rpb25zLkFTVDsKKworLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIEhlbHBlciBDbGFzcyBmb3IgQW50bHIgQVNUIHRyYXZlcnNhbCBhbmQgdmlzaXRhdGlvbi4KKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpncm9vdnlAcm9zcy1yYXluZXIuY29tIj5KZXJlbXkgUmF5bmVyPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBUcmF2ZXJzYWxIZWxwZXIgaW1wbGVtZW50cyBBbnRsckFTVFByb2Nlc3NvciB7CisgICAgcHJvdGVjdGVkIExpc3QgdW52aXNpdGVkTm9kZXM7CisgICAgcHJpdmF0ZSBmaW5hbCBWaXNpdG9yIHY7CisKKyAgICBwdWJsaWMgVHJhdmVyc2FsSGVscGVyKFZpc2l0b3IgdmlzaXRvcikgeworICAgICAgICB0aGlzLnVudmlzaXRlZE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICB0aGlzLnYgPSB2aXNpdG9yOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKEdyb292eVNvdXJjZUFTVCBhc3QpIHsKKyAgICAgICAgdi5zZXRVcCgpOworICAgIH0KKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bihHcm9vdnlTb3VyY2VBU1QgYXN0KSB7CisgICAgICAgIHYudGVhckRvd24oKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBwdXNoKEdyb292eVNvdXJjZUFTVCBhc3QpIHsKKyAgICAgICAgdi5wdXNoKGFzdCk7CisgICAgfQorICAgIHByb3RlY3RlZCBHcm9vdnlTb3VyY2VBU1QgcG9wKCkgeworICAgICAgICByZXR1cm4gdi5wb3AoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB2aXNpdE5vZGUoR3Jvb3Z5U291cmNlQVNUIGFzdCwgaW50IG4pIHsKKyAgICAgICAgaWYgKGFzdCAhPSBudWxsKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFzdC5nZXRUeXBlKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuQUJTVFJBQ1QgICAgICAgICAgICAgICAgICAgICAgOiAgIHYudmlzaXRBYnN0cmFjdChhc3Qsbik7ICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkFOTk9UQVRJT04gICAgICAgICAgICAgICAgICAgIDogICB2LnZpc2l0QW5ub3RhdGlvbihhc3Qsbik7ICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5BTk5PVEFUSU9OUyAgICAgICAgICAgICAgICAgICA6ICAgdi52aXNpdEFubm90YXRpb25zKGFzdCxuKTsgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuQU5OT1RBVElPTl9BUlJBWV9JTklUICAgICAgICAgOiAgIHYudmlzaXRBbm5vdGF0aW9uQXJyYXlJbml0KGFzdCxuKTsgICAgICAgICAgYnJlYWs7IC8vIG9ic29sZXRlPworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5BTk5PVEFUSU9OX0RFRiAgICAgICAgICAgICAgICA6ICAgdi52aXNpdEFubm90YXRpb25EZWYoYXN0LG4pOyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuQU5OT1RBVElPTl9GSUVMRF9ERUYgICAgICAgICAgOiAgIHYudmlzaXRBbm5vdGF0aW9uRmllbGREZWYoYXN0LG4pOyAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkFOTk9UQVRJT05fTUVNQkVSX1ZBTFVFX1BBSVIgIDogICB2LnZpc2l0QW5ub3RhdGlvbk1lbWJlclZhbHVlUGFpcihhc3Qsbik7ICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5BUlJBWV9ERUNMQVJBVE9SICAgICAgICAgICAgICA6ICAgdi52aXNpdEFycmF5RGVjbGFyYXRvcihhc3Qsbik7ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuQVNTSUdOICAgICAgICAgICAgICAgICAgICAgICAgOiAgIHYudmlzaXRBc3NpZ24oYXN0LG4pOyAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkFUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICB2LnZpc2l0QXQoYXN0LG4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5CQU5EICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgdi52aXNpdEJhbmQoYXN0LG4pOyAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuQkFORF9BU1NJR04gICAgICAgICAgICAgICAgICAgOiAgIHYudmlzaXRCYW5kQXNzaWduKGFzdCxuKTsgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkJJR19TVUZGSVggICAgICAgICAgICAgICAgICAgIDogICB2LnZpc2l0QmlnU3VmZml4KGFzdCxuKTsgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5CTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgdi52aXNpdEJsb2NrKGFzdCxuKTsgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuQk5PVCAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgIHYudmlzaXRCbm90KGFzdCxuKTsgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICB2LnZpc2l0Qm9yKGFzdCxuKTsgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5CT1JfQVNTSUdOICAgICAgICAgICAgICAgICAgICA6ICAgdi52aXNpdEJvckFzc2lnbihhc3Qsbik7ICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuQlNSICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgIHYudmlzaXRCc3IoYXN0LG4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkJTUl9BU1NJR04gICAgICAgICAgICAgICAgICAgIDogICB2LnZpc2l0QnNyQXNzaWduKGFzdCxuKTsgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5CWE9SICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgdi52aXNpdEJ4b3IoYXN0LG4pOyAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuQlhPUl9BU1NJR04gICAgICAgICAgICAgICAgICAgOiAgIHYudmlzaXRCeG9yQXNzaWduKGFzdCxuKTsgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkNBU0VfR1JPVVAgICAgICAgICAgICAgICAgICAgIDogICB2LnZpc2l0Q2FzZUdyb3VwKGFzdCxuKTsgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5DTEFTU19ERUYgICAgICAgICAgICAgICAgICAgICA6ICAgdi52aXNpdENsYXNzRGVmKGFzdCxuKTsgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuQ0xPU0FCTEVfQkxPQ0sgICAgICAgICAgICAgICAgOiAgIHYudmlzaXRDbG9zZWRCbG9jayhhc3Qsbik7ICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkNMT1NBQkxFX0JMT0NLX09QICAgICAgICAgICAgIDogICB2LnZpc2l0Q2xvc3VyZU9wKGFzdCxuKTsgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5DTE9TVVJFX0xJU1QgICAgICAgICAgICAgICAgICA6ICAgdi52aXNpdENsb3N1cmVMaXN0KGFzdCxuKTsgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuQ09MT04gICAgICAgICAgICAgICAgICAgICAgICAgOiAgIHYudmlzaXRDb2xvbihhc3Qsbik7ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkNPTU1BICAgICAgICAgICAgICAgICAgICAgICAgIDogICB2LnZpc2l0Q29tbWEoYXN0LG4pOyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5DT01QQVJFX1RPICAgICAgICAgICAgICAgICAgICA6ICAgdi52aXNpdENvbXBhcmVUbyhhc3Qsbik7ICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuQ1RPUl9DQUxMICAgICAgICAgICAgICAgICAgICAgOiAgIHYudmlzaXRDdG9yQ2FsbChhc3Qsbik7ICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkNUT1JfSURFTlQgICAgICAgICAgICAgICAgICAgIDogICB2LnZpc2l0Q3RvcklkZW50KGFzdCxuKTsgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5ERUMgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgdi52aXNpdERlYyhhc3Qsbik7ICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuRElHSVQgICAgICAgICAgICAgICAgICAgICAgICAgOiAgIHYudmlzaXREaWdpdChhc3Qsbik7ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkRJViAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICB2LnZpc2l0RGl2KGFzdCxuKTsgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5ESVZfQVNTSUdOICAgICAgICAgICAgICAgICAgICA6ICAgdi52aXNpdERpdkFzc2lnbihhc3Qsbik7ICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuRE9MTEFSICAgICAgICAgICAgICAgICAgICAgICAgOiAgIHYudmlzaXREb2xsYXIoYXN0LG4pOyAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkRPVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICB2LnZpc2l0RG90KGFzdCxuKTsgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5EWU5BTUlDX01FTUJFUiAgICAgICAgICAgICAgICA6ICAgdi52aXNpdER5bmFtaWNNZW1iZXIoYXN0LG4pOyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuRUxJU1QgICAgICAgICAgICAgICAgICAgICAgICAgOiAgIHYudmlzaXRFbGlzdChhc3Qsbik7ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkVNUFRZX1NUQVQgICAgICAgICAgICAgICAgICAgIDogICB2LnZpc2l0RW1wdHlTdGF0KGFzdCxuKTsgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5FTlVNX0NPTlNUQU5UX0RFRiAgICAgICAgICAgICA6ICAgdi52aXNpdEVudW1Db25zdGFudERlZihhc3Qsbik7ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuRU5VTV9ERUYgICAgICAgICAgICAgICAgICAgICAgOiAgIHYudmlzaXRFbnVtRGVmKGFzdCxuKTsgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkVPRiAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICB2LnZpc2l0RW9mKGFzdCxuKTsgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5FUVVBTCAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgdi52aXNpdEVxdWFsKGFzdCxuKTsgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuRVNDICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgIHYudmlzaXRFc2MoYXN0LG4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkVYUE9ORU5UICAgICAgICAgICAgICAgICAgICAgIDogICB2LnZpc2l0RXhwb25lbnQoYXN0LG4pOyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5FWFBSICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgdi52aXNpdEV4cHIoYXN0LG4pOyAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuRVhURU5EU19DTEFVU0UgICAgICAgICAgICAgICAgOiAgIHYudmlzaXRFeHRlbmRzQ2xhdXNlKGFzdCxuKTsgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkZJTkFMICAgICAgICAgICAgICAgICAgICAgICAgIDogICB2LnZpc2l0RmluYWwoYXN0LG4pOyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5GTE9BVF9TVUZGSVggICAgICAgICAgICAgICAgICA6ICAgdi52aXNpdEZsb2F0U3VmZml4KGFzdCxuKTsgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuRk9SX0NPTkRJVElPTiAgICAgICAgICAgICAgICAgOiAgIHYudmlzaXRGb3JDb25kaXRpb24oYXN0LG4pOyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkZPUl9FQUNIX0NMQVVTRSAgICAgICAgICAgICAgIDogICB2LnZpc2l0Rm9yRWFjaENsYXVzZShhc3Qsbik7ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5GT1JfSU5JVCAgICAgICAgICAgICAgICAgICAgICA6ICAgdi52aXNpdEZvckluaXQoYXN0LG4pOyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuRk9SX0lOX0lURVJBQkxFICAgICAgICAgICAgICAgOiAgIHYudmlzaXRGb3JJbkl0ZXJhYmxlKGFzdCxuKTsgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkZPUl9JVEVSQVRPUiAgICAgICAgICAgICAgICAgIDogICB2LnZpc2l0Rm9ySXRlcmF0b3IoYXN0LG4pOyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5HRSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgdi52aXNpdEdlKGFzdCxuKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuR1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgIHYudmlzaXRHdChhc3Qsbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkhFWF9ESUdJVCAgICAgICAgICAgICAgICAgICAgIDogICB2LnZpc2l0SGV4RGlnaXQoYXN0LG4pOyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5JREVOVCAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgdi52aXNpdElkZW50KGFzdCxuKTsgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuSU1QTEVNRU5UU19DTEFVU0UgICAgICAgICAgICAgOiAgIHYudmlzaXRJbXBsZW1lbnRzQ2xhdXNlKGFzdCxuKTsgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLklNUExJQ0lUX1BBUkFNRVRFUlMgICAgICAgICAgIDogICB2LnZpc2l0SW1wbGljaXRQYXJhbWV0ZXJzKGFzdCxuKTsgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5JTVBPUlQgICAgICAgICAgICAgICAgICAgICAgICA6ICAgdi52aXNpdEltcG9ydChhc3Qsbik7ICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuSU5DICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgIHYudmlzaXRJbmMoYXN0LG4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLklOREVYX09QICAgICAgICAgICAgICAgICAgICAgIDogICB2LnZpc2l0SW5kZXhPcChhc3Qsbik7ICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5JTlNUQU5DRV9JTklUICAgICAgICAgICAgICAgICA6ICAgdi52aXNpdEluc3RhbmNlSW5pdChhc3Qsbik7ICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuSU5URVJGQUNFX0RFRiAgICAgICAgICAgICAgICAgOiAgIHYudmlzaXRJbnRlcmZhY2VEZWYoYXN0LG4pOyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxBQkVMRURfQVJHICAgICAgICAgICAgICAgICAgIDogICB2LnZpc2l0TGFiZWxlZEFyZyhhc3Qsbik7ICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MQUJFTEVEX1NUQVQgICAgICAgICAgICAgICAgICA6ICAgdi52aXNpdExhYmVsZWRTdGF0KGFzdCxuKTsgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTEFORCAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgIHYudmlzaXRMYW5kKGFzdCxuKTsgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxCUkFDSyAgICAgICAgICAgICAgICAgICAgICAgIDogICB2LnZpc2l0TGJyYWNrKGFzdCxuKTsgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MQ1VSTFkgICAgICAgICAgICAgICAgICAgICAgICA6ICAgdi52aXNpdExjdXJseShhc3Qsbik7ICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgIHYudmlzaXRMZShhc3Qsbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxFVFRFUiAgICAgICAgICAgICAgICAgICAgICAgIDogICB2LnZpc2l0TGV0dGVyKGFzdCxuKTsgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVNUX0NPTlNUUlVDVE9SICAgICAgICAgICAgICA6ICAgdi52aXNpdExpc3RDb25zdHJ1Y3Rvcihhc3Qsbik7ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF9hcyAgICAgICAgICAgICAgICAgICAgOiAgIHYudmlzaXRMaXRlcmFsQXMoYXN0LG4pOyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfYXNzZXJ0ICAgICAgICAgICAgICAgIDogICB2LnZpc2l0TGl0ZXJhbEFzc2VydChhc3Qsbik7ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX2Jvb2xlYW4gICAgICAgICAgICAgICA6ICAgdi52aXNpdExpdGVyYWxCb29sZWFuKGFzdCxuKTsgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF9icmVhayAgICAgICAgICAgICAgICAgOiAgIHYudmlzaXRMaXRlcmFsQnJlYWsoYXN0LG4pOyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfYnl0ZSAgICAgICAgICAgICAgICAgIDogICB2LnZpc2l0TGl0ZXJhbEJ5dGUoYXN0LG4pOyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX2Nhc2UgICAgICAgICAgICAgICAgICA6ICAgdi52aXNpdExpdGVyYWxDYXNlKGFzdCxuKTsgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF9jYXRjaCAgICAgICAgICAgICAgICAgOiAgIHYudmlzaXRMaXRlcmFsQ2F0Y2goYXN0LG4pOyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfY2hhciAgICAgICAgICAgICAgICAgIDogICB2LnZpc2l0TGl0ZXJhbENoYXIoYXN0LG4pOyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX2NsYXNzICAgICAgICAgICAgICAgICA6ICAgdi52aXNpdExpdGVyYWxDbGFzcyhhc3Qsbik7ICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF9jb250aW51ZSAgICAgICAgICAgICAgOiAgIHYudmlzaXRMaXRlcmFsQ29udGludWUoYXN0LG4pOyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfZGVmICAgICAgICAgICAgICAgICAgIDogICB2LnZpc2l0TGl0ZXJhbERlZihhc3Qsbik7ICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX2RlZmF1bHQgICAgICAgICAgICAgICA6ICAgdi52aXNpdExpdGVyYWxEZWZhdWx0KGFzdCxuKTsgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF9kb3VibGUgICAgICAgICAgICAgICAgOiAgIHYudmlzaXRMaXRlcmFsRG91YmxlKGFzdCxuKTsgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfZWxzZSAgICAgICAgICAgICAgICAgIDogICB2LnZpc2l0TGl0ZXJhbEVsc2UoYXN0LG4pOyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX2VudW0gICAgICAgICAgICAgICAgICA6ICAgdi52aXNpdExpdGVyYWxFbnVtKGFzdCxuKTsgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF9leHRlbmRzICAgICAgICAgICAgICAgOiAgIHYudmlzaXRMaXRlcmFsRXh0ZW5kcyhhc3Qsbik7ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfZmFsc2UgICAgICAgICAgICAgICAgIDogICB2LnZpc2l0TGl0ZXJhbEZhbHNlKGFzdCxuKTsgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX2ZpbmFsbHkgICAgICAgICAgICAgICA6ICAgdi52aXNpdExpdGVyYWxGaW5hbGx5KGFzdCxuKTsgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF9mbG9hdCAgICAgICAgICAgICAgICAgOiAgIHYudmlzaXRMaXRlcmFsRmxvYXQoYXN0LG4pOyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfZm9yICAgICAgICAgICAgICAgICAgIDogICB2LnZpc2l0TGl0ZXJhbEZvcihhc3Qsbik7ICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX2lmICAgICAgICAgICAgICAgICAgICA6ICAgdi52aXNpdExpdGVyYWxJZihhc3Qsbik7ICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF9pbXBsZW1lbnRzICAgICAgICAgICAgOiAgIHYudmlzaXRMaXRlcmFsSW1wbGVtZW50cyhhc3Qsbik7ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfaW1wb3J0ICAgICAgICAgICAgICAgIDogICB2LnZpc2l0TGl0ZXJhbEltcG9ydChhc3Qsbik7ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX2luICAgICAgICAgICAgICAgICAgICA6ICAgdi52aXNpdExpdGVyYWxJbihhc3Qsbik7ICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF9pbnN0YW5jZW9mICAgICAgICAgICAgOiAgIHYudmlzaXRMaXRlcmFsSW5zdGFuY2VvZihhc3Qsbik7ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfaW50ICAgICAgICAgICAgICAgICAgIDogICB2LnZpc2l0TGl0ZXJhbEludChhc3Qsbik7ICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX2ludGVyZmFjZSAgICAgICAgICAgICA6ICAgdi52aXNpdExpdGVyYWxJbnRlcmZhY2UoYXN0LG4pOyAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF9sb25nICAgICAgICAgICAgICAgICAgOiAgIHYudmlzaXRMaXRlcmFsTG9uZyhhc3Qsbik7ICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfbmF0aXZlICAgICAgICAgICAgICAgIDogICB2LnZpc2l0TGl0ZXJhbE5hdGl2ZShhc3Qsbik7ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX25ldyAgICAgICAgICAgICAgICAgICA6ICAgdi52aXNpdExpdGVyYWxOZXcoYXN0LG4pOyAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF9udWxsICAgICAgICAgICAgICAgICAgOiAgIHYudmlzaXRMaXRlcmFsTnVsbChhc3Qsbik7ICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfcGFja2FnZSAgICAgICAgICAgICAgIDogICB2LnZpc2l0TGl0ZXJhbFBhY2thZ2UoYXN0LG4pOyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX3ByaXZhdGUgICAgICAgICAgICAgICA6ICAgdi52aXNpdExpdGVyYWxQcml2YXRlKGFzdCxuKTsgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF9wcm90ZWN0ZWQgICAgICAgICAgICAgOiAgIHYudmlzaXRMaXRlcmFsUHJvdGVjdGVkKGFzdCxuKTsgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfcHVibGljICAgICAgICAgICAgICAgIDogICB2LnZpc2l0TGl0ZXJhbFB1YmxpYyhhc3Qsbik7ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX3JldHVybiAgICAgICAgICAgICAgICA6ICAgdi52aXNpdExpdGVyYWxSZXR1cm4oYXN0LG4pOyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF9zaG9ydCAgICAgICAgICAgICAgICAgOiAgIHYudmlzaXRMaXRlcmFsU2hvcnQoYXN0LG4pOyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfc3RhdGljICAgICAgICAgICAgICAgIDogICB2LnZpc2l0TGl0ZXJhbFN0YXRpYyhhc3Qsbik7ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX3N1cGVyICAgICAgICAgICAgICAgICA6ICAgdi52aXNpdExpdGVyYWxTdXBlcihhc3Qsbik7ICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF9zd2l0Y2ggICAgICAgICAgICAgICAgOiAgIHYudmlzaXRMaXRlcmFsU3dpdGNoKGFzdCxuKTsgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfc3luY2hyb25pemVkICAgICAgICAgIDogICB2LnZpc2l0TGl0ZXJhbFN5bmNocm9uaXplZChhc3Qsbik7ICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX3RoaXMgICAgICAgICAgICAgICAgICA6ICAgdi52aXNpdExpdGVyYWxUaGlzKGFzdCxuKTsgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF90aHJlYWRzYWZlICAgICAgICAgICAgOiAgIHYudmlzaXRMaXRlcmFsVGhyZWFkc2FmZShhc3Qsbik7ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfdGhyb3cgICAgICAgICAgICAgICAgIDogICB2LnZpc2l0TGl0ZXJhbFRocm93KGFzdCxuKTsgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX3Rocm93cyAgICAgICAgICAgICAgICA6ICAgdi52aXNpdExpdGVyYWxUaHJvd3MoYXN0LG4pOyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF90cmFuc2llbnQgICAgICAgICAgICAgOiAgIHYudmlzaXRMaXRlcmFsVHJhbnNpZW50KGFzdCxuKTsgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfdHJ1ZSAgICAgICAgICAgICAgICAgIDogICB2LnZpc2l0TGl0ZXJhbFRydWUoYXN0LG4pOyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX3RyeSAgICAgICAgICAgICAgICAgICA6ICAgdi52aXNpdExpdGVyYWxUcnkoYXN0LG4pOyAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF92b2lkICAgICAgICAgICAgICAgICAgOiAgIHYudmlzaXRMaXRlcmFsVm9pZChhc3Qsbik7ICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfdm9sYXRpbGUgICAgICAgICAgICAgIDogICB2LnZpc2l0TGl0ZXJhbFZvbGF0aWxlKGFzdCxuKTsgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX3doaWxlICAgICAgICAgICAgICAgICA6ICAgdi52aXNpdExpdGVyYWxXaGlsZShhc3Qsbik7ICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTE5PVCAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgIHYudmlzaXRMbm90KGFzdCxuKTsgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxPUiAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICB2LnZpc2l0TG9yKGFzdCxuKTsgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MUEFSRU4gICAgICAgICAgICAgICAgICAgICAgICA6ICAgdi52aXNpdExwYXJlbihhc3Qsbik7ICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgIHYudmlzaXRMdChhc3Qsbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLk1BUF9DT05TVFJVQ1RPUiAgICAgICAgICAgICAgIDogICB2LnZpc2l0TWFwQ29uc3RydWN0b3IoYXN0LG4pOyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5NRU1CRVJfUE9JTlRFUiAgICAgICAgICAgICAgICA6ICAgdi52aXNpdE1lbWJlclBvaW50ZXIoYXN0LG4pOyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTUVUSE9EX0NBTEwgICAgICAgICAgICAgICAgICAgOiAgIHYudmlzaXRNZXRob2RDYWxsKGFzdCxuKTsgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLk1FVEhPRF9ERUYgICAgICAgICAgICAgICAgICAgIDogICB2LnZpc2l0TWV0aG9kRGVmKGFzdCxuKTsgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5NSU5VUyAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgdi52aXNpdE1pbnVzKGFzdCxuKTsgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTUlOVVNfQVNTSUdOICAgICAgICAgICAgICAgICAgOiAgIHYudmlzaXRNaW51c0Fzc2lnbihhc3Qsbik7ICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLk1MX0NPTU1FTlQgICAgICAgICAgICAgICAgICAgIDogICB2LnZpc2l0TWxDb21tZW50KGFzdCxuKTsgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5NT0QgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgdi52aXNpdE1vZChhc3Qsbik7ICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTU9ESUZJRVJTICAgICAgICAgICAgICAgICAgICAgOiAgIHYudmlzaXRNb2RpZmllcnMoYXN0LG4pOyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLk1PRF9BU1NJR04gICAgICAgICAgICAgICAgICAgIDogICB2LnZpc2l0TW9kQXNzaWduKGFzdCxuKTsgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5OTFMgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgdi52aXNpdE5scyhhc3Qsbik7ICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTk9UX0VRVUFMICAgICAgICAgICAgICAgICAgICAgOiAgIHYudmlzaXROb3RFcXVhbChhc3Qsbik7ICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLk5VTExfVFJFRV9MT09LQUhFQUQgICAgICAgICAgIDogICB2LnZpc2l0TnVsbFRyZWVMb29rYWhlYWQoYXN0LG4pOyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5OVU1fQklHX0RFQ0lNQUwgICAgICAgICAgICAgICA6ICAgdi52aXNpdE51bUJpZ0RlY2ltYWwoYXN0LG4pOyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTlVNX0JJR19JTlQgICAgICAgICAgICAgICAgICAgOiAgIHYudmlzaXROdW1CaWdJbnQoYXN0LG4pOyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLk5VTV9ET1VCTEUgICAgICAgICAgICAgICAgICAgIDogICB2LnZpc2l0TnVtRG91YmxlKGFzdCxuKTsgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5OVU1fRkxPQVQgICAgICAgICAgICAgICAgICAgICA6ICAgdi52aXNpdE51bUZsb2F0KGFzdCxuKTsgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuTlVNX0lOVCAgICAgICAgICAgICAgICAgICAgICAgOiAgIHYudmlzaXROdW1JbnQoYXN0LG4pOyAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLk5VTV9MT05HICAgICAgICAgICAgICAgICAgICAgIDogICB2LnZpc2l0TnVtTG9uZyhhc3Qsbik7ICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5PQkpCTE9DSyAgICAgICAgICAgICAgICAgICAgICA6ICAgdi52aXNpdE9iamJsb2NrKGFzdCxuKTsgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuT05FX05MICAgICAgICAgICAgICAgICAgICAgICAgOiAgIHYudmlzaXRPbmVObChhc3Qsbik7ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLk9QVElPTkFMX0RPVCAgICAgICAgICAgICAgICAgIDogICB2LnZpc2l0T3B0aW9uYWxEb3QoYXN0LG4pOyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5QQUNLQUdFX0RFRiAgICAgICAgICAgICAgICAgICA6ICAgdi52aXNpdFBhY2thZ2VEZWYoYXN0LG4pOyAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuUEFSQU1FVEVSUyAgICAgICAgICAgICAgICAgICAgOiAgIHYudmlzaXRQYXJhbWV0ZXJzKGFzdCxuKTsgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlBBUkFNRVRFUl9ERUYgICAgICAgICAgICAgICAgIDogICB2LnZpc2l0UGFyYW1ldGVyRGVmKGFzdCxuKTsgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5QTFVTICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgdi52aXNpdFBsdXMoYXN0LG4pOyAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuUExVU19BU1NJR04gICAgICAgICAgICAgICAgICAgOiAgIHYudmlzaXRQbHVzQXNzaWduKGFzdCxuKTsgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlBPU1RfREVDICAgICAgICAgICAgICAgICAgICAgIDogICB2LnZpc2l0UG9zdERlYyhhc3Qsbik7ICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5QT1NUX0lOQyAgICAgICAgICAgICAgICAgICAgICA6ICAgdi52aXNpdFBvc3RJbmMoYXN0LG4pOyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuUVVFU1RJT04gICAgICAgICAgICAgICAgICAgICAgOiAgIHYudmlzaXRRdWVzdGlvbihhc3Qsbik7ICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlJBTkdFX0VYQ0xVU0lWRSAgICAgICAgICAgICAgIDogICB2LnZpc2l0UmFuZ2VFeGNsdXNpdmUoYXN0LG4pOyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5SQU5HRV9JTkNMVVNJVkUgICAgICAgICAgICAgICA6ICAgdi52aXNpdFJhbmdlSW5jbHVzaXZlKGFzdCxuKTsgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuUkJSQUNLICAgICAgICAgICAgICAgICAgICAgICAgOiAgIHYudmlzaXRSYnJhY2soYXN0LG4pOyAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlJDVVJMWSAgICAgICAgICAgICAgICAgICAgICAgIDogICB2LnZpc2l0UmN1cmx5KGFzdCxuKTsgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5SRUdFWFBfQ1RPUl9FTkQgICAgICAgICAgICAgICA6ICAgdi52aXNpdFJlZ2V4cEN0b3JFbmQoYXN0LG4pOyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuUkVHRVhQX0xJVEVSQUwgICAgICAgICAgICAgICAgOiAgIHYudmlzaXRSZWdleHBMaXRlcmFsKGFzdCxuKTsgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlJFR0VYUF9TWU1CT0wgICAgICAgICAgICAgICAgIDogICB2LnZpc2l0UmVnZXhwU3ltYm9sKGFzdCxuKTsgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5SRUdFWF9GSU5EICAgICAgICAgICAgICAgICAgICA6ICAgdi52aXNpdFJlZ2V4RmluZChhc3Qsbik7ICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuUkVHRVhfTUFUQ0ggICAgICAgICAgICAgICAgICAgOiAgIHYudmlzaXRSZWdleE1hdGNoKGFzdCxuKTsgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlJQQVJFTiAgICAgICAgICAgICAgICAgICAgICAgIDogICB2LnZpc2l0UnBhcmVuKGFzdCxuKTsgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5TRUxFQ1RfU0xPVCAgICAgICAgICAgICAgICAgICA6ICAgdi52aXNpdFNlbGVjdFNsb3QoYXN0LG4pOyAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuU0VNSSAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgIHYudmlzaXRTZW1pKGFzdCxuKTsgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlNIX0NPTU1FTlQgICAgICAgICAgICAgICAgICAgIDogICB2LnZpc2l0U2hDb21tZW50KGFzdCxuKTsgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5TTCAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgdi52aXNpdFNsKGFzdCxuKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuU0xJU1QgICAgICAgICAgICAgICAgICAgICAgICAgOiAgIHYudmlzaXRTbGlzdChhc3Qsbik7ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlNMX0FTU0lHTiAgICAgICAgICAgICAgICAgICAgIDogICB2LnZpc2l0U2xBc3NpZ24oYXN0LG4pOyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5TTF9DT01NRU5UICAgICAgICAgICAgICAgICAgICA6ICAgdi52aXNpdFNsQ29tbWVudChhc3Qsbik7ICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuU1BSRUFEX0FSRyAgICAgICAgICAgICAgICAgICAgOiAgIHYudmlzaXRTcHJlYWRBcmcoYXN0LG4pOyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlNQUkVBRF9ET1QgICAgICAgICAgICAgICAgICAgIDogICB2LnZpc2l0U3ByZWFkRG90KGFzdCxuKTsgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5TUFJFQURfTUFQX0FSRyAgICAgICAgICAgICAgICA6ICAgdi52aXNpdFNwcmVhZE1hcEFyZyhhc3Qsbik7ICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuU1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgIHYudmlzaXRTcihhc3Qsbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlNSX0FTU0lHTiAgICAgICAgICAgICAgICAgICAgIDogICB2LnZpc2l0U3JBc3NpZ24oYXN0LG4pOyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5TVEFSICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgdi52aXNpdFN0YXIoYXN0LG4pOyAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuU1RBUl9BU1NJR04gICAgICAgICAgICAgICAgICAgOiAgIHYudmlzaXRTdGFyQXNzaWduKGFzdCxuKTsgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlNUQVJfU1RBUiAgICAgICAgICAgICAgICAgICAgIDogICB2LnZpc2l0U3RhclN0YXIoYXN0LG4pOyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5TVEFSX1NUQVJfQVNTSUdOICAgICAgICAgICAgICA6ICAgdi52aXNpdFN0YXJTdGFyQXNzaWduKGFzdCxuKTsgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuU1RBVElDX0lNUE9SVCAgICAgICAgICAgICAgICAgOiAgIHYudmlzaXRTdGF0aWNJbXBvcnQoYXN0LG4pOyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlNUQVRJQ19JTklUICAgICAgICAgICAgICAgICAgIDogICB2LnZpc2l0U3RhdGljSW5pdChhc3Qsbik7ICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5TVFJJQ1RGUCAgICAgICAgICAgICAgICAgICAgICA6ICAgdi52aXNpdFN0cmljdGZwKGFzdCxuKTsgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuU1RSSU5HX0NIICAgICAgICAgICAgICAgICAgICAgOiAgIHYudmlzaXRTdHJpbmdDaChhc3Qsbik7ICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlNUUklOR19DT05TVFJVQ1RPUiAgICAgICAgICAgIDogICB2LnZpc2l0U3RyaW5nQ29uc3RydWN0b3IoYXN0LG4pOyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5TVFJJTkdfQ1RPUl9FTkQgICAgICAgICAgICAgICA6ICAgdi52aXNpdFN0cmluZ0N0b3JFbmQoYXN0LG4pOyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuU1RSSU5HX0NUT1JfTUlERExFICAgICAgICAgICAgOiAgIHYudmlzaXRTdHJpbmdDdG9yTWlkZGxlKGFzdCxuKTsgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlNUUklOR19DVE9SX1NUQVJUICAgICAgICAgICAgIDogICB2LnZpc2l0U3RyaW5nQ3RvclN0YXJ0KGFzdCxuKTsgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5TVFJJTkdfTElURVJBTCAgICAgICAgICAgICAgICA6ICAgdi52aXNpdFN0cmluZ0xpdGVyYWwoYXN0LG4pOyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuU1RSSU5HX05MICAgICAgICAgICAgICAgICAgICAgOiAgIHYudmlzaXRTdHJpbmdObChhc3Qsbik7ICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlNVUEVSX0NUT1JfQ0FMTCAgICAgICAgICAgICAgIDogICB2LnZpc2l0U3VwZXJDdG9yQ2FsbChhc3Qsbik7ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5UUklQTEVfRE9UICAgICAgICAgICAgICAgICAgICA6ICAgdi52aXNpdFRyaXBsZURvdChhc3Qsbik7ICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgIHYudmlzaXRUeXBlKGFzdCxuKTsgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlRZUEVDQVNUICAgICAgICAgICAgICAgICAgICAgIDogICB2LnZpc2l0VHlwZWNhc3QoYXN0LG4pOyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5UWVBFX0FSR1VNRU5UICAgICAgICAgICAgICAgICA6ICAgdi52aXNpdFR5cGVBcmd1bWVudChhc3Qsbik7ICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuVFlQRV9BUkdVTUVOVFMgICAgICAgICAgICAgICAgOiAgIHYudmlzaXRUeXBlQXJndW1lbnRzKGFzdCxuKTsgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlRZUEVfTE9XRVJfQk9VTkRTICAgICAgICAgICAgIDogICB2LnZpc2l0VHlwZUxvd2VyQm91bmRzKGFzdCxuKTsgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5UWVBFX1BBUkFNRVRFUiAgICAgICAgICAgICAgICA6ICAgdi52aXNpdFR5cGVQYXJhbWV0ZXIoYXN0LG4pOyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuVFlQRV9QQVJBTUVURVJTICAgICAgICAgICAgICAgOiAgIHYudmlzaXRUeXBlUGFyYW1ldGVycyhhc3Qsbik7ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlRZUEVfVVBQRVJfQk9VTkRTICAgICAgICAgICAgIDogICB2LnZpc2l0VHlwZVVwcGVyQm91bmRzKGFzdCxuKTsgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5VTkFSWV9NSU5VUyAgICAgICAgICAgICAgICAgICA6ICAgdi52aXNpdFVuYXJ5TWludXMoYXN0LG4pOyAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuVU5BUllfUExVUyAgICAgICAgICAgICAgICAgICAgOiAgIHYudmlzaXRVbmFyeVBsdXMoYXN0LG4pOyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlVOVVNFRF9DT05TVCAgICAgICAgICAgICAgICAgIDogICB2LnZpc2l0VW51c2VkQ29uc3QoYXN0LG4pOyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5VTlVTRURfRE8gICAgICAgICAgICAgICAgICAgICA6ICAgdi52aXNpdFVudXNlZERvKGFzdCxuKTsgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuVU5VU0VEX0dPVE8gICAgICAgICAgICAgICAgICAgOiAgIHYudmlzaXRVbnVzZWRHb3RvKGFzdCxuKTsgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLlZBUklBQkxFX0RFRiAgICAgICAgICAgICAgICAgIDogICB2LnZpc2l0VmFyaWFibGVEZWYoYXN0LG4pOyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5WQVJJQUJMRV9QQVJBTUVURVJfREVGICAgICAgICA6ICAgdi52aXNpdFZhcmlhYmxlUGFyYW1ldGVyRGVmKGFzdCxuKTsgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdyb292eVRva2VuVHlwZXMuVk9DQUIgICAgICAgICAgICAgICAgICAgICAgICAgOiAgIHYudmlzaXRWb2NhYihhc3Qsbik7ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHcm9vdnlUb2tlblR5cGVzLldJTERDQVJEX1RZUEUgICAgICAgICAgICAgICAgIDogICB2LnZpc2l0V2lsZGNhcmRUeXBlKGFzdCxuKTsgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5XUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgdi52aXNpdFdzKGFzdCxuKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworCisgICAgICAgICAgICAgICAgZGVmYXVsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICB2LnZpc2l0RGVmYXVsdChhc3Qsbik7ICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gdGhlIHN1cHBsaWVkIEFTVCB3YXMgbnVsbAorICAgICAgICAgICAgdi52aXNpdERlZmF1bHQobnVsbCxuKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhY2NlcHQoR3Jvb3Z5U291cmNlQVNUIGN1cnJlbnROb2RlKTsKKworICAgIHByb3RlY3RlZCB2b2lkIGFjY2VwdF92X0ZpcnN0Q2hpbGRzRmlyc3RDaGlsZF92X0NoaWxkMl9DaGlsZDNfdl9DaGlsZDRfdl9fX3ZfTGFzdENoaWxkKEdyb292eVNvdXJjZUFTVCB0KSB7CisgICAgICAgIG9wZW5pbmdWaXNpdCh0KTsKKyAgICAgICAgR3Jvb3Z5U291cmNlQVNUIGV4cHIyID0gdC5jaGlsZEF0KDApOworICAgICAgICBza2lwKGV4cHIyKTsKKyAgICAgICAgYWNjZXB0KGV4cHIyLmNoaWxkQXQoMCkpOworICAgICAgICBjbG9zaW5nVmlzaXQodCk7CisKKyAgICAgICAgR3Jvb3Z5U291cmNlQVNUIHNpYmxpbmcgPSAoR3Jvb3Z5U291cmNlQVNUKWV4cHIyLmdldE5leHRTaWJsaW5nKCk7CisgICAgICAgIGJvb2xlYW4gZmlyc3RTTGlzdCA9IHRydWU7CisgICAgICAgIHdoaWxlIChzaWJsaW5nICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICghZmlyc3RTTGlzdCkgeworICAgICAgICAgICAgICAgIHN1YnNlcXVlbnRWaXNpdCh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpcnN0U0xpc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIGFjY2VwdChzaWJsaW5nKTsKKyAgICAgICAgICAgIHNpYmxpbmcgPSAoR3Jvb3Z5U291cmNlQVNUKXNpYmxpbmcuZ2V0TmV4dFNpYmxpbmcoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGFjY2VwdF92X0ZpcnN0Q2hpbGRzRmlyc3RDaGlsZF92X1Jlc3RPZlRoZUNoaWxkcmVuKEdyb292eVNvdXJjZUFTVCB0KSB7CisgICAgICAgIG9wZW5pbmdWaXNpdCh0KTsKKyAgICAgICAgR3Jvb3Z5U291cmNlQVNUIGV4cHIgPSB0LmNoaWxkQXQoMCk7CisgICAgICAgIHNraXAoZXhwcik7CisgICAgICAgIGFjY2VwdChleHByLmNoaWxkQXQoMCkpOworICAgICAgICBjbG9zaW5nVmlzaXQodCk7CisgICAgICAgIGFjY2VwdFNpYmxpbmdzKGV4cHIpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGFjY2VwdF9GaXJzdENoaWxkX3ZfU2Vjb25kQ2hpbGQoR3Jvb3Z5U291cmNlQVNUIHQpIHsKKyAgICAgICAgYWNjZXB0KHQuY2hpbGRBdCgwKSk7CisgICAgICAgIHN1YnNlcXVlbnRWaXNpdCh0KTsKKyAgICAgICAgYWNjZXB0KHQuY2hpbGRBdCgxKSk7CisgICAgfQorICAgIHByb3RlY3RlZCB2b2lkIGFjY2VwdF9GaXJzdENoaWxkX3ZfU2Vjb25kQ2hpbGRfdihHcm9vdnlTb3VyY2VBU1QgdCkgeworICAgICAgICBhY2NlcHQodC5jaGlsZEF0KDApKTsKKyAgICAgICAgb3BlbmluZ1Zpc2l0KHQpOworICAgICAgICBhY2NlcHQodC5jaGlsZEF0KDEpKTsKKyAgICAgICAgY2xvc2luZ1Zpc2l0KHQpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGFjY2VwdF9GaXJzdENoaWxkX3ZfU2Vjb25kQ2hpbGRzQ2hpbGRyZW5fdihHcm9vdnlTb3VyY2VBU1QgdCkgeworICAgICAgICBhY2NlcHQodC5jaGlsZEF0KDApKTsKKworICAgICAgICBvcGVuaW5nVmlzaXQodCk7CisgICAgICAgIEdyb292eVNvdXJjZUFTVCBzZWNvbmRDaGlsZCA9IHQuY2hpbGRBdCgxKTsKKyAgICAgICAgaWYgKHNlY29uZENoaWxkICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFjY2VwdENoaWxkcmVuKHNlY29uZENoaWxkKTsKKyAgICAgICAgfQorICAgICAgICBjbG9zaW5nVmlzaXQodCk7CisgICAgfQorCisgICAgCisgICAgcHJvdGVjdGVkIHZvaWQgYWNjZXB0X3ZfRmlyc3RDaGlsZF9TZWNvbmRDaGlsZF92X1RoaXJkQ2hpbGRfdihHcm9vdnlTb3VyY2VBU1QgdCkgeworICAgICAgICBvcGVuaW5nVmlzaXQodCk7CisgICAgICAgIGFjY2VwdCh0LmNoaWxkQXQoMCkpOworICAgICAgICBhY2NlcHQodC5jaGlsZEF0KDEpKTsKKyAgICAgICAgc3Vic2VxdWVudFZpc2l0KHQpOworICAgICAgICBhY2NlcHQodC5jaGlsZEF0KDIpKTsKKyAgICAgICAgY2xvc2luZ1Zpc2l0KHQpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGFjY2VwdF9GaXJzdENoaWxkX3ZfU2Vjb25kQ2hpbGRfdl9UaGlyZENoaWxkX3YoR3Jvb3Z5U291cmNlQVNUIHQpIHsKKyAgICAgICAgYWNjZXB0KHQuY2hpbGRBdCgwKSk7CisgICAgICAgIG9wZW5pbmdWaXNpdCh0KTsKKyAgICAgICAgYWNjZXB0KHQuY2hpbGRBdCgxKSk7CisgICAgICAgIHN1YnNlcXVlbnRWaXNpdCh0KTsKKyAgICAgICAgYWNjZXB0KHQuY2hpbGRBdCgyKSk7CisgICAgICAgIGNsb3NpbmdWaXNpdCh0KTsKKyAgICB9CisJCisgICAgcHJvdGVjdGVkIHZvaWQgYWNjZXB0X0ZpcnN0U2Vjb25kQW5kVGhpcmRDaGlsZF92X3ZfRm9ydGhDaGlsZChHcm9vdnlTb3VyY2VBU1QgdCkgeworICAgICAgICBHcm9vdnlTb3VyY2VBU1QgY2hpbGQxID0gKEdyb292eVNvdXJjZUFTVCl0LmdldEZpcnN0Q2hpbGQoKTsKKyAgICAgICAgaWYgKGNoaWxkMSAhPSBudWxsKXsKKyAgICAgICAgCWFjY2VwdChjaGlsZDEpOworICAgICAgICAgICAgR3Jvb3Z5U291cmNlQVNUIGNoaWxkMiA9IChHcm9vdnlTb3VyY2VBU1QpY2hpbGQxLmdldE5leHRTaWJsaW5nKCk7CisgICAgICAgICAgICBpZiAoY2hpbGQyICE9IG51bGwpIHsKKyAgICAgICAgICAgIAlhY2NlcHQoY2hpbGQyKTsKKyAgICAgICAgICAgICAgICBHcm9vdnlTb3VyY2VBU1QgY2hpbGQzID0gKEdyb292eVNvdXJjZUFTVCljaGlsZDIuZ2V0TmV4dFNpYmxpbmcoKTsKKyAgICAgICAgICAgICAgICBpZiAoY2hpbGQzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAJYWNjZXB0KGNoaWxkMyk7CisgICAgICAgICAgICAgICAgCW9wZW5pbmdWaXNpdCh0KTsKKyAgICAgICAgICAgICAgICAJR3Jvb3Z5U291cmNlQVNUIGNoaWxkNCA9IChHcm9vdnlTb3VyY2VBU1QpY2hpbGQzLmdldE5leHRTaWJsaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZDQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAJc3Vic2VxdWVudFZpc2l0KHQpOworICAgICAgICAgICAgICAgICAgICAJYWNjZXB0KGNoaWxkNCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBhY2NlcHRfdl9GaXJzdENoaWxkXzJuZHZfU2Vjb25kQ2hpbGRfdl9fX0xhc3RDaGlsZF92KEdyb292eVNvdXJjZUFTVCB0KSB7CisgICAgICAgIG9wZW5pbmdWaXNpdCh0KTsKKyAgICAgICAgR3Jvb3Z5U291cmNlQVNUIGNoaWxkID0gKEdyb292eVNvdXJjZUFTVCl0LmdldEZpcnN0Q2hpbGQoKTsKKyAgICAgICAgaWYgKGNoaWxkICE9IG51bGwpeworICAgICAgICAgICAgYWNjZXB0KGNoaWxkKTsKKyAgICAgICAgICAgIEdyb292eVNvdXJjZUFTVCBzaWJsaW5nID0gKEdyb292eVNvdXJjZUFTVCljaGlsZC5nZXROZXh0U2libGluZygpOworICAgICAgICAgICAgaWYgKHNpYmxpbmcgIT0gbnVsbCkgeworICAgICAgICAgICAgCXNlY29uZFZpc2l0KHQpOworICAgICAgICAgICAgCWFjY2VwdChzaWJsaW5nKTsKKyAgICAgICAgICAgICAgICBzaWJsaW5nID0gKEdyb292eVNvdXJjZUFTVClzaWJsaW5nLmdldE5leHRTaWJsaW5nKCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKHNpYmxpbmcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBzdWJzZXF1ZW50VmlzaXQodCk7CisgICAgICAgICAgICAgICAgICAgIGFjY2VwdChzaWJsaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgc2libGluZyA9IChHcm9vdnlTb3VyY2VBU1Qpc2libGluZy5nZXROZXh0U2libGluZygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjbG9zaW5nVmlzaXQodCk7CisgICAgfQorCisJcHJvdGVjdGVkIHZvaWQgYWNjZXB0X3ZfRmlyc3RDaGlsZF92X1NlY29uZENoaWxkX3ZfX19MYXN0Q2hpbGRfdihHcm9vdnlTb3VyY2VBU1QgdCkgeworICAgICAgICBvcGVuaW5nVmlzaXQodCk7CisgICAgICAgIEdyb292eVNvdXJjZUFTVCBjaGlsZCA9IChHcm9vdnlTb3VyY2VBU1QpdC5nZXRGaXJzdENoaWxkKCk7CisgICAgICAgIGlmIChjaGlsZCAhPSBudWxsKXsKKyAgICAgICAgICAgIGFjY2VwdChjaGlsZCk7CisgICAgICAgICAgICBHcm9vdnlTb3VyY2VBU1Qgc2libGluZyA9IChHcm9vdnlTb3VyY2VBU1QpY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKKyAgICAgICAgICAgIHdoaWxlIChzaWJsaW5nICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzdWJzZXF1ZW50VmlzaXQodCk7CisgICAgICAgICAgICAgICAgYWNjZXB0KHNpYmxpbmcpOworICAgICAgICAgICAgICAgIHNpYmxpbmcgPSAoR3Jvb3Z5U291cmNlQVNUKXNpYmxpbmcuZ2V0TmV4dFNpYmxpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjbG9zaW5nVmlzaXQodCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgYWNjZXB0X3ZfRmlyc3RDaGlsZF92KEdyb292eVNvdXJjZUFTVCB0KSB7CisgICAgICAgIG9wZW5pbmdWaXNpdCh0KTsKKyAgICAgICAgYWNjZXB0KHQuY2hpbGRBdCgwKSk7CisgICAgICAgIGNsb3NpbmdWaXNpdCh0KTsKKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIHZvaWQgYWNjZXB0X3ZfU2libGluZ3NfdihHcm9vdnlTb3VyY2VBU1QgdCkgeworICAgICAgICBvcGVuaW5nVmlzaXQodCk7CisgICAgICAgIGFjY2VwdFNpYmxpbmdzKHQpOworICAgICAgICBjbG9zaW5nVmlzaXQodCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgYWNjZXB0X3ZfQWxsQ2hpbGRyZW5fdl9TaWJsaW5ncyhHcm9vdnlTb3VyY2VBU1QgdCkgeworICAgICAgICBvcGVuaW5nVmlzaXQodCk7CisgICAgICAgIGFjY2VwdENoaWxkcmVuKHQpOworICAgICAgICBjbG9zaW5nVmlzaXQodCk7CisgICAgICAgIGFjY2VwdFNpYmxpbmdzKHQpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGFjY2VwdF92X0FsbENoaWxkcmVuX3YoR3Jvb3Z5U291cmNlQVNUIHQpIHsKKyAgICAgICAgb3BlbmluZ1Zpc2l0KHQpOworICAgICAgICBhY2NlcHRDaGlsZHJlbih0KTsKKyAgICAgICAgY2xvc2luZ1Zpc2l0KHQpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGFjY2VwdF9GaXJzdENoaWxkX3ZfUmVzdE9mVGhlQ2hpbGRyZW4oR3Jvb3Z5U291cmNlQVNUIHQpIHsKKyAgICAgICAgYWNjZXB0KHQuY2hpbGRBdCgwKSk7CisgICAgICAgIG9wZW5pbmdWaXNpdCh0KTsKKyAgICAgICAgY2xvc2luZ1Zpc2l0KHQpOworICAgICAgICBhY2NlcHRTaWJsaW5ncyh0LmNoaWxkQXQoMCkpOworICAgIH0KKyAgICBwcm90ZWN0ZWQgdm9pZCBhY2NlcHRfRmlyc3RDaGlsZF92X1Jlc3RPZlRoZUNoaWxkcmVuX3ZfTGFzdENoaWxkKEdyb292eVNvdXJjZUFTVCB0KSB7CisgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgIGFjY2VwdCh0LmNoaWxkQXQoMCkpOworICAgICAgICBjb3VudCsrOworICAgICAgICBvcGVuaW5nVmlzaXQodCk7CisgICAgICAgIGlmICh0LmNoaWxkQXQoMCkgIT0gbnVsbCkgeworICAgICAgICAgICAgR3Jvb3Z5U291cmNlQVNUIHNpYmxpbmcgPSAoR3Jvb3Z5U291cmNlQVNUKXQuY2hpbGRBdCgwKS5nZXROZXh0U2libGluZygpOworICAgICAgICAgICAgd2hpbGUgKHNpYmxpbmcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChjb3VudCA9PSB0LmdldE51bWJlck9mQ2hpbGRyZW4oKSAtIDEpIHtjbG9zaW5nVmlzaXQodCk7fQorICAgICAgICAgICAgICAgIGFjY2VwdChzaWJsaW5nKTsKKyAgICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgICAgIHNpYmxpbmcgPSAoR3Jvb3Z5U291cmNlQVNUKXNpYmxpbmcuZ2V0TmV4dFNpYmxpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICB9CisgICAgcHJvdGVjdGVkIHZvaWQgYWNjZXB0X0ZpcnN0Q2hpbGRfdl9SZXN0T2ZUaGVDaGlsZHJlbl92KEdyb292eVNvdXJjZUFTVCB0KSB7CisgICAgICAgIGFjY2VwdCh0LmNoaWxkQXQoMCkpOworICAgICAgICBvcGVuaW5nVmlzaXQodCk7CisgICAgICAgIGFjY2VwdFNpYmxpbmdzKHQuY2hpbGRBdCgwKSk7CisgICAgICAgIGNsb3NpbmdWaXNpdCh0KTsKKyAgICB9CisgICAgcHJvdGVjdGVkIHZvaWQgYWNjZXB0X3ZfRmlyc3RDaGlsZF92X1Jlc3RPZlRoZUNoaWxkcmVuKEdyb292eVNvdXJjZUFTVCB0KSB7CisgICAgICAgIGFjY2VwdF92X0ZpcnN0Q2hpbGRfdih0KTsKKyAgICAgICAgYWNjZXB0U2libGluZ3ModC5jaGlsZEF0KDApKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhY2NlcHRfdl9GaXJzdENoaWxkX3ZfUmVzdE9mVGhlQ2hpbGRyZW5fdihHcm9vdnlTb3VyY2VBU1QgdCkgeworICAgICAgICBvcGVuaW5nVmlzaXQodCk7CisgICAgICAgIGFjY2VwdCh0LmNoaWxkQXQoMCkpOworICAgICAgICBzdWJzZXF1ZW50VmlzaXQodCk7CisgICAgICAgIGFjY2VwdFNpYmxpbmdzKHQuY2hpbGRBdCgwKSk7CisgICAgICAgIGNsb3NpbmdWaXNpdCh0KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhY2NlcHRTaWJsaW5ncyhHcm9vdnlTb3VyY2VBU1QgdCkgeworICAgICAgICBpZiAodCAhPSBudWxsKSB7CisgICAgICAgICAgICBHcm9vdnlTb3VyY2VBU1Qgc2libGluZyA9IChHcm9vdnlTb3VyY2VBU1QpdC5nZXROZXh0U2libGluZygpOworICAgICAgICAgICAgd2hpbGUgKHNpYmxpbmcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGFjY2VwdChzaWJsaW5nKTsKKyAgICAgICAgICAgICAgICBzaWJsaW5nID0gKEdyb292eVNvdXJjZUFTVClzaWJsaW5nLmdldE5leHRTaWJsaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhY2NlcHRDaGlsZHJlbihHcm9vdnlTb3VyY2VBU1QgdCkgeworICAgICAgICBpZiAodCAhPSBudWxsKSB7CisgICAgICAgICAgICBHcm9vdnlTb3VyY2VBU1QgY2hpbGQgPSAoR3Jvb3Z5U291cmNlQVNUKXQuZ2V0Rmlyc3RDaGlsZCgpOworICAgICAgICAgICAgaWYgKGNoaWxkICE9IG51bGwpeworICAgICAgICAgICAgICAgIGFjY2VwdChjaGlsZCk7CisgICAgICAgICAgICAgICAgYWNjZXB0U2libGluZ3MoY2hpbGQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2tpcChHcm9vdnlTb3VyY2VBU1QgZXhwcikgeworICAgICAgICB1bnZpc2l0ZWROb2Rlcy5yZW1vdmUoZXhwcik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgb3BlbmluZ1Zpc2l0KEdyb292eVNvdXJjZUFTVCB0KSB7CisgICAgICAgIHVudmlzaXRlZE5vZGVzLnJlbW92ZSh0KTsKKworICAgICAgICBpbnQgbiA9IFZpc2l0b3IuT1BFTklOR19WSVNJVDsKKyAgICAgICAgdmlzaXROb2RlKHQsIG4pOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHNlY29uZFZpc2l0KEdyb292eVNvdXJjZUFTVCB0KSB7CisgICAgICAgIGludCBuID0gVmlzaXRvci5TRUNPTkRfVklTSVQ7CisgICAgICAgIHZpc2l0Tm9kZSh0LCBuKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzdWJzZXF1ZW50VmlzaXQoR3Jvb3Z5U291cmNlQVNUIHQpIHsKKyAgICAgICAgaW50IG4gPSBWaXNpdG9yLlNVQlNFUVVFTlRfVklTSVQ7CisgICAgICAgIHZpc2l0Tm9kZSh0LCBuKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBjbG9zaW5nVmlzaXQoR3Jvb3Z5U291cmNlQVNUIHQpIHsKKyAgICAgICAgaW50IG4gPSBWaXNpdG9yLkNMT1NJTkdfVklTSVQ7CisgICAgICAgIHZpc2l0Tm9kZSh0LCBuKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIEFTVCBwcm9jZXNzKEFTVCB0KSB7CisgICAgICAgIEdyb292eVNvdXJjZUFTVCBub2RlID0gKEdyb292eVNvdXJjZUFTVCkgdDsKKyAgICAgICAgCisgICAgICAgIC8vIHByb2Nlc3MgZWFjaCBub2RlIGluIHR1cm4KKyAgICAgICAgc2V0VXAobm9kZSk7CisgICAgICAgIGFjY2VwdChub2RlKTsKKyAgICAgICAgYWNjZXB0U2libGluZ3Mobm9kZSk7CisgICAgICAgIHRlYXJEb3duKG5vZGUpOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9ICAgIAorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvdHJlZXdhbGtlci9WaXNpdG9yLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci90cmVld2Fsa2VyL1Zpc2l0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGJjNjhiCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvdHJlZXdhbGtlci9WaXNpdG9yLmphdmEKQEAgLTAsMCArMSwyNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNSBKZXJlbXkgUmF5bmVyCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5hbnRsci50cmVld2Fsa2VyOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hbnRsci5Hcm9vdnlTb3VyY2VBU1Q7CisKKy8qKgorICogQW4gaW50ZXJmYWNlIGZvciB2aXNpdGluZyBhIEdyb292eVNvdXJjZUFTVCBub2RlLgorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmdyb292eUByb3NzLXJheW5lci5jb20iPkplcmVteSBSYXluZXI8L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KKworcHVibGljIGludGVyZmFjZSBWaXNpdG9yIHsKKyAgICBpbnQgT1BFTklOR19WSVNJVCA9IDE7CisgICAgaW50IFNFQ09ORF9WSVNJVCA9IDI7IC8vIG9ubHkgdXNlZCBvbiByYXJlIG9jY2FzaW9ucywgZS5nLiB0aGUgJygnIGluIHRoaXMgc25pcHBldC4uLiAgIEBGb28gICggIGE9MSwgYj0yLCBjPTMpCisgICAgaW50IFNVQlNFUVVFTlRfVklTSVQgPSAzOworICAgIGludCBDTE9TSU5HX1ZJU0lUID0gNDsKKworICAgIHZvaWQgc2V0VXAoKTsKKyAgICB2b2lkIHZpc2l0QWJzdHJhY3QoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdEFubm90YXRpb24oR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdEFubm90YXRpb25zKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRBbm5vdGF0aW9uQXJyYXlJbml0KEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRBbm5vdGF0aW9uRGVmKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRBbm5vdGF0aW9uRmllbGREZWYoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdEFubm90YXRpb25NZW1iZXJWYWx1ZVBhaXIoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdEFycmF5RGVjbGFyYXRvcihHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0QXNzaWduKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRBdChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0QmFuZChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0QmFuZEFzc2lnbihHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0QmlnU3VmZml4KEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRCbG9jayhHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0Qm5vdChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0Qm9yKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRCb3JBc3NpZ24oR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdEJzcihHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0QnNyQXNzaWduKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRCeG9yKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRCeG9yQXNzaWduKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRDYXNlR3JvdXAoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdENsYXNzRGVmKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRDbG9zZWRCbG9jayhHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0Q2xvc3VyZUxpc3QoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdENsb3N1cmVPcChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0Q29sb24oR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdENvbW1hKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRDb21wYXJlVG8oR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdEN0b3JDYWxsKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRDdG9ySWRlbnQoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdERlYyhHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0RGlnaXQoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdERpdihHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0RGl2QXNzaWduKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXREb2xsYXIoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdERvdChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0RHluYW1pY01lbWJlcihHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0RWxpc3QoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdEVtcHR5U3RhdChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0RW51bUNvbnN0YW50RGVmKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRFbnVtRGVmKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRFb2YoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdEVxdWFsKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRFc2MoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdEV4cG9uZW50KEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRFeHByKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRFeHRlbmRzQ2xhdXNlKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRGaW5hbChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0RmxvYXRTdWZmaXgoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdEZvckNvbmRpdGlvbihHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0Rm9yRWFjaENsYXVzZShHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0Rm9ySW5pdChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0Rm9ySW5JdGVyYWJsZShHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0Rm9ySXRlcmF0b3IoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdEdlKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRHdChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0SGV4RGlnaXQoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdElkZW50KEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRJbXBsZW1lbnRzQ2xhdXNlKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRJbXBsaWNpdFBhcmFtZXRlcnMoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdEltcG9ydChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0SW5jKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRJbmRleE9wKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRJbnN0YW5jZUluaXQoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdEludGVyZmFjZURlZihHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0TGFiZWxlZEFyZyhHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0TGFiZWxlZFN0YXQoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdExhbmQoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdExicmFjayhHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0TGN1cmx5KEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRMZShHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0TGV0dGVyKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRMaXN0Q29uc3RydWN0b3IoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdExpdGVyYWxBcyhHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0TGl0ZXJhbEFzc2VydChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0TGl0ZXJhbEJvb2xlYW4oR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdExpdGVyYWxCcmVhayhHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0TGl0ZXJhbEJ5dGUoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdExpdGVyYWxDYXNlKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRMaXRlcmFsQ2F0Y2goR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdExpdGVyYWxDaGFyKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRMaXRlcmFsQ2xhc3MoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdExpdGVyYWxDb250aW51ZShHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0TGl0ZXJhbERlZihHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0TGl0ZXJhbERlZmF1bHQoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdExpdGVyYWxEb3VibGUoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdExpdGVyYWxFbHNlKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRMaXRlcmFsRW51bShHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0TGl0ZXJhbEV4dGVuZHMoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdExpdGVyYWxGYWxzZShHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0TGl0ZXJhbEZpbmFsbHkoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdExpdGVyYWxGbG9hdChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0TGl0ZXJhbEZvcihHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0TGl0ZXJhbElmKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRMaXRlcmFsSW1wbGVtZW50cyhHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0TGl0ZXJhbEltcG9ydChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0TGl0ZXJhbEluKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRMaXRlcmFsSW5zdGFuY2VvZihHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0TGl0ZXJhbEludChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0TGl0ZXJhbEludGVyZmFjZShHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0TGl0ZXJhbExvbmcoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdExpdGVyYWxOYXRpdmUoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdExpdGVyYWxOZXcoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdExpdGVyYWxOdWxsKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRMaXRlcmFsUGFja2FnZShHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0TGl0ZXJhbFByaXZhdGUoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdExpdGVyYWxQcm90ZWN0ZWQoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdExpdGVyYWxQdWJsaWMoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdExpdGVyYWxSZXR1cm4oR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdExpdGVyYWxTaG9ydChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0TGl0ZXJhbFN0YXRpYyhHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0TGl0ZXJhbFN1cGVyKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRMaXRlcmFsU3dpdGNoKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRMaXRlcmFsU3luY2hyb25pemVkKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRMaXRlcmFsVGhpcyhHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0TGl0ZXJhbFRocmVhZHNhZmUoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdExpdGVyYWxUaHJvdyhHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0TGl0ZXJhbFRocm93cyhHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0TGl0ZXJhbFRyYW5zaWVudChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0TGl0ZXJhbFRydWUoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdExpdGVyYWxUcnkoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdExpdGVyYWxWb2lkKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRMaXRlcmFsVm9sYXRpbGUoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdExpdGVyYWxXaGlsZShHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0TG5vdChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0TG9yKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRMcGFyZW4oR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdEx0KEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRNYXBDb25zdHJ1Y3RvcihHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0TWVtYmVyUG9pbnRlcihHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0TWV0aG9kQ2FsbChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0TWV0aG9kRGVmKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRNaW51cyhHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0TWludXNBc3NpZ24oR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdE1sQ29tbWVudChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0TW9kKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRNb2RpZmllcnMoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdE1vZEFzc2lnbihHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0TmxzKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXROb3RFcXVhbChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0TnVsbFRyZWVMb29rYWhlYWQoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdE51bUJpZ0RlY2ltYWwoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdE51bUJpZ0ludChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0TnVtRG91YmxlKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXROdW1GbG9hdChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0TnVtSW50KEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXROdW1Mb25nKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRPYmpibG9jayhHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0T25lTmwoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdE9wdGlvbmFsRG90KEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRQYWNrYWdlRGVmKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRQYXJhbWV0ZXJzKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRQYXJhbWV0ZXJEZWYoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdFBsdXMoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdFBsdXNBc3NpZ24oR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdFBvc3REZWMoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdFBvc3RJbmMoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdFF1ZXN0aW9uKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRSYW5nZUV4Y2x1c2l2ZShHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0UmFuZ2VJbmNsdXNpdmUoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdFJicmFjayhHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0UmN1cmx5KEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRSZWdleHBDdG9yRW5kKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRSZWdleHBMaXRlcmFsKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRSZWdleHBTeW1ib2woR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdFJlZ2V4RmluZChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0UmVnZXhNYXRjaChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0UnBhcmVuKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRTZWxlY3RTbG90KEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRTZW1pKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRTaENvbW1lbnQoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdFNsKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRTbGlzdChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0U2xBc3NpZ24oR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdFNsQ29tbWVudChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0U3ByZWFkQXJnKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRTcHJlYWREb3QoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdFNwcmVhZE1hcEFyZyhHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0U3IoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdFNyQXNzaWduKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRTdGFyKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRTdGFyQXNzaWduKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRTdGFyU3RhcihHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0U3RhclN0YXJBc3NpZ24oR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdFN0YXRpY0ltcG9ydChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0U3RhdGljSW5pdChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0U3RyaWN0ZnAoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdFN0cmluZ0NoKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRTdHJpbmdDb25zdHJ1Y3RvcihHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0U3RyaW5nQ3RvckVuZChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0U3RyaW5nQ3Rvck1pZGRsZShHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0U3RyaW5nQ3RvclN0YXJ0KEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRTdHJpbmdMaXRlcmFsKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRTdHJpbmdObChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0U3VwZXJDdG9yQ2FsbChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0VHJpcGxlRG90KEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRUeXBlKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRUeXBlY2FzdChHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0VHlwZUFyZ3VtZW50KEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRUeXBlQXJndW1lbnRzKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRUeXBlTG93ZXJCb3VuZHMoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdFR5cGVQYXJhbWV0ZXIoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdFR5cGVQYXJhbWV0ZXJzKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRUeXBlVXBwZXJCb3VuZHMoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdFVuYXJ5TWludXMoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdFVuYXJ5UGx1cyhHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0VW51c2VkQ29uc3QoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdFVudXNlZERvKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRVbnVzZWRHb3RvKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRWYXJpYWJsZURlZihHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KTsKKyAgICB2b2lkIHZpc2l0VmFyaWFibGVQYXJhbWV0ZXJEZWYoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdFZvY2FiKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworICAgIHZvaWQgdmlzaXRXaWxkY2FyZFR5cGUoR3Jvb3Z5U291cmNlQVNUIHQsIGludCB2aXNpdCk7CisgICAgdm9pZCB2aXNpdFdzKEdyb292eVNvdXJjZUFTVCB0LCBpbnQgdmlzaXQpOworCisgICAgdm9pZCB2aXNpdERlZmF1bHQoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KTsKKyAgICB2b2lkIHRlYXJEb3duKCk7CisKKyAgICB2b2lkIHB1c2goR3Jvb3Z5U291cmNlQVNUIHQpOworICAgIEdyb292eVNvdXJjZUFTVCBwb3AoKTsKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudGxyL3RyZWV3YWxrZXIvVmlzaXRvckFkYXB0ZXIuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudGxyL3RyZWV3YWxrZXIvVmlzaXRvckFkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWU0ZmRjCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvdHJlZXdhbGtlci9WaXNpdG9yQWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsMjUzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5hbnRsci50cmVld2Fsa2VyOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hbnRsci5Hcm9vdnlTb3VyY2VBU1Q7CisKKworLyoqCisgKiBBIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgYWxsIHZpc2l0b3IgbWV0aG9kcy4KKyAqIElmIHlvdSBleHRlbmQgdGhpcyBjbGFzcywgYW55IHVuLW92ZXJyaWRlbiB2aXNpdCBtZXRob2RzIHdpbGwKKyAqIGNhbGwgdmlzaXREZWZhdWx0LgorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmdyb292eUByb3NzLXJheW5lci5jb20iPkplcmVteSBSYXluZXI8L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KKworcHVibGljIGNsYXNzIFZpc2l0b3JBZGFwdGVyIGltcGxlbWVudHMgVmlzaXRvciB7CisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0QWJzdHJhY3QoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdEFubm90YXRpb24oR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdEFubm90YXRpb25zKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRBbm5vdGF0aW9uQXJyYXlJbml0KEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRBbm5vdGF0aW9uRGVmKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRBbm5vdGF0aW9uRmllbGREZWYoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdEFubm90YXRpb25NZW1iZXJWYWx1ZVBhaXIoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdEFycmF5RGVjbGFyYXRvcihHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0QXNzaWduKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRBdChHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0QmFuZChHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0QmFuZEFzc2lnbihHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0QmlnU3VmZml4KEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRCbG9jayhHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0Qm5vdChHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0Qm9yKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRCb3JBc3NpZ24oR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdEJzcihHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0QnNyQXNzaWduKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRCeG9yKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRCeG9yQXNzaWduKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRDYXNlR3JvdXAoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdENsYXNzRGVmKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRDbG9zZWRCbG9jayhHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0Q2xvc3VyZU9wKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRDbG9zdXJlTGlzdChHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0Q29sb24oR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdENvbW1hKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRDb21wYXJlVG8oR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdEN0b3JDYWxsKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRDdG9ySWRlbnQoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdERlYyhHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0RGlnaXQoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdERpdihHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0RGl2QXNzaWduKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXREb2xsYXIoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdERvdChHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0RHluYW1pY01lbWJlcihHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0RWxpc3QoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdEVtcHR5U3RhdChHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0RW51bUNvbnN0YW50RGVmKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRFbnVtRGVmKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRFb2YoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdEVxdWFsKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRFc2MoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdEV4cG9uZW50KEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRFeHByKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRFeHRlbmRzQ2xhdXNlKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRGaW5hbChHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0RmxvYXRTdWZmaXgoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdEZvckNvbmRpdGlvbihHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0Rm9yRWFjaENsYXVzZShHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0Rm9ySW5pdChHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0Rm9ySW5JdGVyYWJsZShHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0Rm9ySXRlcmF0b3IoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdEdlKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRHdChHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0SGV4RGlnaXQoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdElkZW50KEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRJbXBsZW1lbnRzQ2xhdXNlKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRJbXBsaWNpdFBhcmFtZXRlcnMoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdEltcG9ydChHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0SW5jKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRJbmRleE9wKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRJbnN0YW5jZUluaXQoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdEludGVyZmFjZURlZihHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TGFiZWxlZEFyZyhHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TGFiZWxlZFN0YXQoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdExhbmQoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdExicmFjayhHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TGN1cmx5KEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRMZShHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TGV0dGVyKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRMaXN0Q29uc3RydWN0b3IoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdExpdGVyYWxBcyhHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbEFzc2VydChHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbEJvb2xlYW4oR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdExpdGVyYWxCcmVhayhHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbEJ5dGUoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdExpdGVyYWxDYXNlKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRMaXRlcmFsQ2F0Y2goR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdExpdGVyYWxDaGFyKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRMaXRlcmFsQ2xhc3MoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdExpdGVyYWxDb250aW51ZShHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbERlZihHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbERlZmF1bHQoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdExpdGVyYWxEb3VibGUoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdExpdGVyYWxFbHNlKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRMaXRlcmFsRW51bShHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbEV4dGVuZHMoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdExpdGVyYWxGYWxzZShHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbEZpbmFsbHkoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdExpdGVyYWxGbG9hdChHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbEZvcihHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbElmKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRMaXRlcmFsSW1wbGVtZW50cyhHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbEltcG9ydChHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbEluKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRMaXRlcmFsSW5zdGFuY2VvZihHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbEludChHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbEludGVyZmFjZShHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbExvbmcoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdExpdGVyYWxOYXRpdmUoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdExpdGVyYWxOZXcoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdExpdGVyYWxOdWxsKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRMaXRlcmFsUGFja2FnZShHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbFByaXZhdGUoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdExpdGVyYWxQcm90ZWN0ZWQoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdExpdGVyYWxQdWJsaWMoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdExpdGVyYWxSZXR1cm4oR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdExpdGVyYWxTaG9ydChHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbFN0YXRpYyhHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbFN1cGVyKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRMaXRlcmFsU3dpdGNoKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRMaXRlcmFsU3luY2hyb25pemVkKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRMaXRlcmFsVGhpcyhHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbFRocmVhZHNhZmUoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdExpdGVyYWxUaHJvdyhHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbFRocm93cyhHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbFRyYW5zaWVudChHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TGl0ZXJhbFRydWUoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdExpdGVyYWxUcnkoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdExpdGVyYWxWb2lkKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRMaXRlcmFsVm9sYXRpbGUoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdExpdGVyYWxXaGlsZShHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TG5vdChHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TG9yKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRMcGFyZW4oR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdEx0KEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRNYXBDb25zdHJ1Y3RvcihHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TWVtYmVyUG9pbnRlcihHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TWV0aG9kQ2FsbChHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TWV0aG9kRGVmKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRNaW51cyhHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TWludXNBc3NpZ24oR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdE1sQ29tbWVudChHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TW9kKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRNb2RpZmllcnMoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdE1vZEFzc2lnbihHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TmxzKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXROb3RFcXVhbChHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TnVsbFRyZWVMb29rYWhlYWQoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdE51bUJpZ0RlY2ltYWwoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdE51bUJpZ0ludChHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TnVtRG91YmxlKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXROdW1GbG9hdChHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TnVtSW50KEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXROdW1Mb25nKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRPYmpibG9jayhHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0T25lTmwoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdE9wdGlvbmFsRG90KEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRQYWNrYWdlRGVmKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRQYXJhbWV0ZXJzKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRQYXJhbWV0ZXJEZWYoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdFBsdXMoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdFBsdXNBc3NpZ24oR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdFBvc3REZWMoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdFBvc3RJbmMoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdFF1ZXN0aW9uKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRSYW5nZUV4Y2x1c2l2ZShHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0UmFuZ2VJbmNsdXNpdmUoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdFJicmFjayhHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0UmN1cmx5KEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRSZWdleHBDdG9yRW5kKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRSZWdleHBMaXRlcmFsKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRSZWdleHBTeW1ib2woR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdFJlZ2V4RmluZChHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0UmVnZXhNYXRjaChHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0UnBhcmVuKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRTZWxlY3RTbG90KEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRTZW1pKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRTaENvbW1lbnQoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdFNsKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRTbGlzdChHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0U2xBc3NpZ24oR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdFNsQ29tbWVudChHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0U3ByZWFkQXJnKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRTcHJlYWREb3QoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdFNwcmVhZE1hcEFyZyhHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0U3IoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdFNyQXNzaWduKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRTdGFyKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRTdGFyQXNzaWduKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRTdGFyU3RhcihHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0U3RhclN0YXJBc3NpZ24oR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdFN0YXRpY0ltcG9ydChHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0U3RhdGljSW5pdChHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0U3RyaWN0ZnAoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdFN0cmluZ0NoKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRTdHJpbmdDb25zdHJ1Y3RvcihHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0U3RyaW5nQ3RvckVuZChHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0U3RyaW5nQ3Rvck1pZGRsZShHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0U3RyaW5nQ3RvclN0YXJ0KEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRTdHJpbmdMaXRlcmFsKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRTdHJpbmdObChHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0U3VwZXJDdG9yQ2FsbChHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0VHJpcGxlRG90KEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRUeXBlKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRUeXBlY2FzdChHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0VHlwZUFyZ3VtZW50KEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRUeXBlQXJndW1lbnRzKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRUeXBlTG93ZXJCb3VuZHMoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdFR5cGVQYXJhbWV0ZXIoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdFR5cGVQYXJhbWV0ZXJzKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRUeXBlVXBwZXJCb3VuZHMoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdFVuYXJ5TWludXMoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdFVuYXJ5UGx1cyhHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0VW51c2VkQ29uc3QoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdFVudXNlZERvKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRVbnVzZWRHb3RvKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRWYXJpYWJsZURlZihHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHt2aXNpdERlZmF1bHQodCx2aXNpdCk7fQorICAgIHB1YmxpYyB2b2lkIHZpc2l0VmFyaWFibGVQYXJhbWV0ZXJEZWYoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdFZvY2FiKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisgICAgcHVibGljIHZvaWQgdmlzaXRXaWxkY2FyZFR5cGUoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7dmlzaXREZWZhdWx0KHQsdmlzaXQpO30KKyAgICBwdWJsaWMgdm9pZCB2aXNpdFdzKEdyb292eVNvdXJjZUFTVCB0LGludCB2aXNpdCkge3Zpc2l0RGVmYXVsdCh0LHZpc2l0KTt9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdERlZmF1bHQoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7fQorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkge30KKworICAgIHB1YmxpYyB2b2lkIHB1c2goR3Jvb3Z5U291cmNlQVNUIHQpIHt9CisgICAgcHVibGljIEdyb292eVNvdXJjZUFTVCBwb3AoKSB7cmV0dXJuIG51bGw7fQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvdHJlZXdhbGtlci9wYWNrYWdlLmh0bWwgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci90cmVld2Fsa2VyL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDljN2UyCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvdHJlZXdhbGtlci9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSw4IEBACis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPHRpdGxlPnBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5hbnRsci50cmVld2Fsa2VyLio8L3RpdGxlPgorICA8L2hlYWQ+CisgIDxib2R5PgorICAgIDxwPkNsYXNzZXMgZm9yIHdhbGtpbmcgdGhlIEFTVC48L3A+CisgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9BU1ROb2RlLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvQVNUTm9kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhOGVmODEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvQVNUTm9kZS5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdDsKKworCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIGFueSBBU1Qgbm9kZQorICogCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgQVNUTm9kZSB7CisKKyAgICBwcml2YXRlIGludCBsaW5lTnVtYmVyID0gLTE7CisgICAgcHJpdmF0ZSBpbnQgY29sdW1uTnVtYmVyID0gLTE7CisgICAgcHJpdmF0ZSBpbnQgbGFzdExpbmVOdW1iZXIgPSAtMTsKKyAgICBwcml2YXRlIGludCBsYXN0Q29sdW1uTnVtYmVyID0gLTE7CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChHcm9vdnlDb2RlVmlzaXRvciB2aXNpdG9yKSB7CisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJObyB2aXNpdCgpIG1ldGhvZCBpbXBsZW1lbnRlZCBmb3IgY2xhc3M6ICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgeworICAgICAgICByZXR1cm4gIjxub3QgaW1wbGVtZW50ZWQgeWV0IGZvciBjbGFzczogIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIj4iOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpIHsKKyAgICAgICAgcmV0dXJuIGxpbmVOdW1iZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TGluZU51bWJlcihpbnQgbGluZU51bWJlcikgeworICAgICAgICB0aGlzLmxpbmVOdW1iZXIgPSBsaW5lTnVtYmVyOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0Q29sdW1uTnVtYmVyKCkgeworICAgICAgICByZXR1cm4gY29sdW1uTnVtYmVyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvbHVtbk51bWJlcihpbnQgY29sdW1uTnVtYmVyKSB7CisgICAgICAgIHRoaXMuY29sdW1uTnVtYmVyID0gY29sdW1uTnVtYmVyOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0TGFzdExpbmVOdW1iZXIoKSB7CisgICAgICAgIHJldHVybiBsYXN0TGluZU51bWJlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMYXN0TGluZU51bWJlcihpbnQgbGFzdExpbmVOdW1iZXIpIHsKKyAgICAgICAgdGhpcy5sYXN0TGluZU51bWJlciA9IGxhc3RMaW5lTnVtYmVyOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0TGFzdENvbHVtbk51bWJlcigpIHsKKyAgICAgICAgcmV0dXJuIGxhc3RDb2x1bW5OdW1iZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TGFzdENvbHVtbk51bWJlcihpbnQgbGFzdENvbHVtbk51bWJlcikgeworICAgICAgICB0aGlzLmxhc3RDb2x1bW5OdW1iZXIgPSBsYXN0Q29sdW1uTnVtYmVyOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBzb3VyY2UgcG9zaXRpb24gdXNpbmcgYW5vdGhlciBBU1ROb2RlLgorICAgICAqIFRoZSBzb3VyY2VQb3NpdGlvbiBjb25zaXN0cyBvZiBhIGxpbmUvY29sdW1uIHBhaXIgZm9yCisgICAgICogdGhlIHN0YXJ0IGFuZCBhIGxpbmUvY29sdW1uIHBhaXIgZm9yIHRoZSBlbmQgb2YgdGhlCisgICAgICogZXhwcmVzc2lvbiBvciBzdGF0ZW1lbnQgCisgICAgICogCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U291cmNlUG9zaXRpb24oQVNUTm9kZSBub2RlKSB7CisgICAgICAgIHRoaXMuY29sdW1uTnVtYmVyID0gbm9kZS5nZXRDb2x1bW5OdW1iZXIoKTsKKyAgICAgICAgdGhpcy5sYXN0TGluZU51bWJlciA9IG5vZGUuZ2V0TGFzdExpbmVOdW1iZXIoKTsKKyAgICAgICAgdGhpcy5sYXN0Q29sdW1uTnVtYmVyID0gbm9kZS5nZXRMYXN0Q29sdW1uTnVtYmVyKCk7CisgICAgICAgIHRoaXMubGluZU51bWJlciA9IG5vZGUuZ2V0TGluZU51bWJlcigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9Bbm5vdGF0ZWROb2RlLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvQW5ub3RhdGVkTm9kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZmNjNTcKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvQW5ub3RhdGVkTm9kZS5qYXZhCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5hc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworLyoqCisgKiBCYXNlIGNsYXNzIGZvciBhbnkgQVNUIG5vZGUgd2hpY2ggaXMgY2FwYWJsZSBvZiBiZWluZyBhbm5vdGF0ZWQKKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AcHJvdGlxdWUuY29tIj5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIEFubm90YXRlZE5vZGUgZXh0ZW5kcyBBU1ROb2RlIHsKKyAgICBwcml2YXRlIE1hcCBhbm5vdGF0aW9ucyA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKKyAgICBwcml2YXRlIE1hcCBhbm5vdGF0aW9uQ2xhc3NlcyA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKKyAgICBwcml2YXRlIGJvb2xlYW4gc3ludGhldGljOworICAgIENsYXNzTm9kZSBkZWNsYXJpbmdDbGFzczsKKworICAgIHB1YmxpYyBBbm5vdGF0ZWROb2RlKCkgeworICAgIH0KKworICAgIHB1YmxpYyBNYXAgZ2V0QW5ub3RhdGlvbnMoKSB7CisgICAgICAgIHJldHVybiBhbm5vdGF0aW9uczsKKyAgICB9CisKKyAgICBwdWJsaWMgQW5ub3RhdGlvbk5vZGUgZ2V0QW5ub3RhdGlvbnMoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGFubm90YXRpb25zID09IENvbGxlY3Rpb25zLkVNUFRZX01BUCA/IG51bGwgOiAoQW5ub3RhdGlvbk5vZGUpIGFubm90YXRpb25zLmdldChuYW1lKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIENsYXNzTm9kZSBnZXRBbm5vdGF0aW9uQ2xhc3MoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGFubm90YXRpb25DbGFzc2VzID09IENvbGxlY3Rpb25zLkVNUFRZX01BUCA/IG51bGwgOiAoQ2xhc3NOb2RlKSBhbm5vdGF0aW9uQ2xhc3Nlcy5nZXQobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkQW5ub3RhdGlvbihTdHJpbmcgbmFtZSwgQW5ub3RhdGlvbk5vZGUgdmFsdWUpIHsKKyAgICAgICAgY2hlY2tJbml0KCk7CisKKyAgICAgICAgYW5ub3RhdGlvbkNsYXNzZXMucHV0KG5hbWUsdmFsdWUuZ2V0Q2xhc3NOb2RlKCkpOworICAgICAgICBBbm5vdGF0aW9uTm9kZSBvbGRWYWx1ZSA9IChBbm5vdGF0aW9uTm9kZSkgYW5ub3RhdGlvbnMuZ2V0KG5hbWUpOworCisgICAgICAgIC8vIFRPRE8gY2FuIHdlIHN1cHBvcnQgbWFueSBhbm5vdGF0aW9ucyBvZiB0aGUgc2FtZSBuYW1lPworICAgICAgICBpZiAob2xkVmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgYW5ub3RhdGlvbnMucHV0KG5hbWUsIHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIExpc3QgbGlzdCA9IG51bGw7CisgICAgICAgICAgICBpZiAob2xkVmFsdWUgaW5zdGFuY2VvZiBMaXN0KSB7CisgICAgICAgICAgICAgICAgbGlzdCA9IChMaXN0KSBvbGRWYWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICAgICAgbGlzdC5hZGQob2xkVmFsdWUpOworICAgICAgICAgICAgICAgIGFubm90YXRpb25zLnB1dChuYW1lLCBsaXN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxpc3QuYWRkKHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja0luaXQoKSB7CisgICAgICAgIGlmIChhbm5vdGF0aW9ucyA9PSBDb2xsZWN0aW9ucy5FTVBUWV9NQVApCisgICAgICAgICAgYW5ub3RhdGlvbnMgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICBpZiAoYW5ub3RhdGlvbkNsYXNzZXMgPT0gQ29sbGVjdGlvbnMuRU1QVFlfTUFQKQorICAgICAgICAgIGFubm90YXRpb25DbGFzc2VzID0gbmV3IEhhc2hNYXAoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRBbm5vdGF0aW9ucyhMaXN0IGFubm90YXRpb25zKSB7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGFubm90YXRpb25zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgQW5ub3RhdGlvbk5vZGUgbm9kZSA9IChBbm5vdGF0aW9uTm9kZSkgaXRlci5uZXh0KCk7CisgICAgICAgICAgICBhZGRBbm5vdGF0aW9uKG5vZGUuZ2V0Q2xhc3NOb2RlKCkuZ2V0TmFtZSgpLCBub2RlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzU3ludGhldGljKCkgeworICAgICAgICByZXR1cm4gc3ludGhldGljOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFN5bnRoZXRpYyhib29sZWFuIHN5bnRoZXRpYykgeworICAgICAgICB0aGlzLnN5bnRoZXRpYyA9IHN5bnRoZXRpYzsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3NOb2RlIGdldERlY2xhcmluZ0NsYXNzKCkgeworICAgICAgICByZXR1cm4gZGVjbGFyaW5nQ2xhc3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGRlY2xhcmluZ0NsYXNzIFRoZSBkZWNsYXJpbmdDbGFzcyB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVjbGFyaW5nQ2xhc3MoQ2xhc3NOb2RlIGRlY2xhcmluZ0NsYXNzKSB7CisgICAgICAgIHRoaXMuZGVjbGFyaW5nQ2xhc3MgPSBkZWNsYXJpbmdDbGFzczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvQW5ub3RhdGlvbk5vZGUuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9Bbm5vdGF0aW9uTm9kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMmE4YWIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvQW5ub3RhdGlvbk5vZGUuamF2YQpAQCAtMCwwICsxLDE3NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuZXhwci5FeHByZXNzaW9uOworCisKKy8qKgorICogUmVwcmVzZW50cyBhbiBhbm5vdGF0aW9uIHdoaWNoIGNhbiBiZSBhdHRhY2hlZCB0byBpbnRlcmZhY2VzLCBjbGFzc2VzLCBtZXRob2RzIGFuZCBmaWVsZHMuCisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBwcm90aXF1ZS5jb20iPkphbWVzIFN0cmFjaGFuPC9hPgorICogQGF1dGhvciA8YSBocmVmPSdtYWlsdG86dGhlW2RvdF1taW5kc3Rvcm1bYXRdZ21haWxbZG90XWNvbSc+QWxleCBQb3Blc2N1PC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgQW5ub3RhdGlvbk5vZGUgZXh0ZW5kcyBBU1ROb2RlIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1RBUkdFVCA9IDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OU1RSVUNUT1JfVEFSR0VUID0gMSA8PCAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FVEhPRF9UQVJHRVQgPSAxIDw8IDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklFTERfVEFSR0VUID0gMSA8PCAzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBUkFNRVRFUl9UQVJHRVQgPSAgMSA8PCA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQ0FMX1ZBUklBQkxFX1RBUkdFVCA9IDEgPDwgNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTk5PVEFUSU9OX1RBUkdFVCA9IDEgPDwgNjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUxMX1RBUkdFVFMgPSBUWVBFX1RBUkdFVCB8IENPTlNUUlVDVE9SX1RBUkdFVCB8IE1FVEhPRF9UQVJHRVQKKyAgICAgICAgfCBGSUVMRF9UQVJHRVQgfCBQQVJBTUVURVJfVEFSR0VUIHwgTE9DQUxfVkFSSUFCTEVfVEFSR0VUIHwgQU5OT1RBVElPTl9UQVJHRVQ7CisgICAgCisgICAgcHJpdmF0ZSBmaW5hbCBDbGFzc05vZGUgY2xhc3NOb2RlOworICAgIHByaXZhdGUgTWFwIG1lbWJlcnMgPSBuZXcgSGFzaE1hcCgpOworICAgIHByaXZhdGUgYm9vbGVhbiBydW50aW1lUmV0ZW50aW9uPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gc291cmNlUmV0ZW50aW9uPSBmYWxzZTsKKyAgICBwcml2YXRlIGludCBhbGxvd2VkVGFyZ2V0cyA9IEFMTF9UQVJHRVRTOworICAgIHByaXZhdGUgYm9vbGVhbiB2YWxpZDsKKworICAgIHB1YmxpYyBBbm5vdGF0aW9uTm9kZShDbGFzc05vZGUgY2xhc3NOb2RlKSB7CisgICAgICAgIHRoaXMuY2xhc3NOb2RlID0gY2xhc3NOb2RlOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzc05vZGUgZ2V0Q2xhc3NOb2RlKCkgeworICAgICAgICByZXR1cm4gY2xhc3NOb2RlOworICAgIH0KKworICAgIHB1YmxpYyBNYXAgZ2V0TWVtYmVycygpIHsKKyAgICAgICAgcmV0dXJuIG1lbWJlcnM7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBFeHByZXNzaW9uIGdldE1lbWJlcihTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gKEV4cHJlc3Npb24pIG1lbWJlcnMuZ2V0KG5hbWUpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBhZGRNZW1iZXIoU3RyaW5nIG5hbWUsIEV4cHJlc3Npb24gdmFsdWUpIHsKKyAgICAgICAgRXhwcmVzc2lvbiBvbGRWYWx1ZSA9IChFeHByZXNzaW9uKSBtZW1iZXJzLmdldChuYW1lKTsKKyAgICAgICAgaWYgKG9sZFZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIG1lbWJlcnMucHV0KG5hbWUsIHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIExpc3QgbGlzdCA9IG51bGw7CisgICAgICAgICAgICBpZiAob2xkVmFsdWUgaW5zdGFuY2VvZiBMaXN0KSB7CisgICAgICAgICAgICAgICAgbGlzdCA9IChMaXN0KSBvbGRWYWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICAgICAgbGlzdC5hZGQob2xkVmFsdWUpOworICAgICAgICAgICAgICAgIG1lbWJlcnMucHV0KG5hbWUsIGxpc3QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGlzdC5hZGQodmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TWVtYmVyKFN0cmluZyBuYW1lLCBFeHByZXNzaW9uIHZhbHVlKSB7CisgICAgICAgIG1lbWJlcnMucHV0KG5hbWUsIHZhbHVlKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gaXNCdWlsdEluKCl7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGbGFnIGNvcnJlc3BvbmRpbmcgdG8gPGNvZGU+UmV0ZW50aW9uUG9saWN5PC9jb2RlPi4KKyAgICAgKiBAcmV0dXJuIDx0dD50cnVlPC90dD4gaWYgdGhlIGFubm90YXRpb24gc2hvdWxkIGJlIHZpc2libGUgYXQgcnVudGltZSwgCisgICAgICogICAgICA8dHQ+ZmFsc2U8L3R0PiBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNSdW50aW1lUmV0ZW50aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5ydW50aW1lUmV0ZW50aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGludGVybmFsIGZsYWcgb2YgdGhpcyBhbm5vdGF0aW9uIHJ1bnRpbWUgcmV0ZW50aW9uIHBvbGljeS4KKyAgICAgKiBJZiB0aGUgY3VycmVudCBhbm5vdGF0aW9uIGhhcyAKKyAgICAgKiA8Y29kZT5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTwvY29kZT4gb3IgaWYgPHR0PmZhbHNlPC90dD4KKyAgICAgKiBpZiB0aGUgPGNvZGU+UmV0ZW50aW9uUG9saWN5LkNMQVNTPC9jb2RlPi4KKyAgICAgKiBAcGFyYW0gZmxhZyBpZiA8dHQ+dHJ1ZTwvdHQ+IHRoZW4gY3VycmVudCBhbm5vdGF0aW9uIGlzIG1hcmtlZCBhcyBoYXZpbmcKKyAgICAgKiAgICAgPGNvZGU+UmV0ZW50aW9uUG9saWN5LlJVTlRJTUU8L2NvZGU+LiBJZiA8dHQ+ZmFsc2U8L3R0PiB0aGVuCisgICAgICogICAgIHRoZSBhbm5vdGF0aW9uIGhhcyA8Y29kZT5SZXRlbnRpb25Qb2xpY3kuQ0xBU1M8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJ1bnRpbWVSZXRlbnRpb24oYm9vbGVhbiBmbGFnKSB7CisgICAgICAgIHRoaXMucnVudGltZVJldGVudGlvbiA9IGZsYWc7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEZsYWcgY29ycmVzcG9uZGluZyB0byA8Y29kZT5SZXRlbnRpb25Qb2xpY3kuU09VUkNFPC9jb2RlPi4KKyAgICAgKiBAcmV0dXJuIDx0dD50cnVlPC90dD4gaWYgdGhlIGFubm90YXRpb24gaXMgb25seSBhbGxvd2VkIGluIHNvdXJjZXMgCisgICAgICogICAgICA8dHQ+ZmFsc2U8L3R0PiBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNTb3VyY2VSZXRlbnRpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLnNvdXJjZVJldGVudGlvbjsKKyAgICB9CisKKyAgICAvKiogU2V0cyB0aGUgaW50ZXJuYWwgZmxhZyBpZiB0aGUgY3VycmVudCBhbm5vdGF0aW9uIGhhcyAKKyAgICAgKiA8Y29kZT5SZXRlbnRpb25Qb2xpY3kuU09VUkNFPC9jb2RlPi4KKyAgICAgKi8gCisgICAgcHVibGljIHZvaWQgc2V0U291cmNlUmV0ZW50aW9uKGJvb2xlYW4gZmxhZykgeworICAgICAgICB0aGlzLnNvdXJjZVJldGVudGlvbiA9IGZsYWc7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QWxsb3dlZFRhcmdldHMoaW50IGJpdG1hcCkgeworICAgICAgICB0aGlzLmFsbG93ZWRUYXJnZXRzID0gYml0bWFwOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1RhcmdldEFsbG93ZWQoaW50IHRhcmdldCkgeworICAgICAgICByZXR1cm4gKHRoaXMuYWxsb3dlZFRhcmdldHMgJiB0YXJnZXQpID09IHRhcmdldDsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IGlmIHRoZSBjdXJyZW50IGFubm90YXRpb24gaXMgdmVyaWZpZWQgYW5kIHBhc3NlZCBhbGwKKyAgICAgKiB2YWxpZGF0aW9ucworICAgICAqIEBwYXJhbSBmbGFnCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmFsaWQoYm9vbGVhbiBmbGFnKSB7CisgICAgICAgIHRoaXMudmFsaWQgPSBmbGFnOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzdGF0ZSBvZiB0aGlzIGFubm90YXRpb24gKHZlcmlmaWVkIGFuZCBhbGwgdmVyaWZpY2F0aW9uIHBhc3NlZCkuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudmFsaWQ7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHRhcmdldFRvTmFtZShpbnQgdGFyZ2V0KSB7CisgICAgICAgIHN3aXRjaCh0YXJnZXQpIHsKKyAgICAgICAgICAgIGNhc2UgVFlQRV9UQVJHRVQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJUWVBFIjsKKyAgICAgICAgICAgIGNhc2UgQ09OU1RSVUNUT1JfVEFSR0VUOgorICAgICAgICAgICAgICAgIHJldHVybiAiQ09OU1RSVUNUT1IiOworICAgICAgICAgICAgY2FzZSBNRVRIT0RfVEFSR0VUOgorICAgICAgICAgICAgICAgIHJldHVybiAiTUVUSE9EIjsKKyAgICAgICAgICAgIGNhc2UgRklFTERfVEFSR0VUOgorICAgICAgICAgICAgICAgIHJldHVybiAiRklFTEQiOworICAgICAgICAgICAgY2FzZSBQQVJBTUVURVJfVEFSR0VUOgorICAgICAgICAgICAgICAgIHJldHVybiAiUEFSQU1FVEVSIjsKKyAgICAgICAgICAgIGNhc2UgTE9DQUxfVkFSSUFCTEVfVEFSR0VUOgorICAgICAgICAgICAgICAgIHJldHVybiAiTE9DQUxfVkFSSUFCTEUiOworICAgICAgICAgICAgY2FzZSBBTk5PVEFUSU9OX1RBUkdFVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIkFOTk9UQVRJT04iOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gInVua25vd24gdGFyZ2V0IjsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9DbGFzc0NvZGVFeHByZXNzaW9uVHJhbnNmb3JtZXIuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9DbGFzc0NvZGVFeHByZXNzaW9uVHJhbnNmb3JtZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODQwOTY2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L0NsYXNzQ29kZUV4cHJlc3Npb25UcmFuc2Zvcm1lci5qYXZhCkBAIC0wLDAgKzEsMTUwIEBACisvKg0KKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLg0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5hc3Q7DQorDQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5NYXA7DQorDQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHIuKjsNCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3Quc3RtdC5Bc3NlcnRTdGF0ZW1lbnQ7DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuQ2FzZVN0YXRlbWVudDsNCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3Quc3RtdC5Eb1doaWxlU3RhdGVtZW50Ow0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5zdG10LkV4cHJlc3Npb25TdGF0ZW1lbnQ7DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuRm9yU3RhdGVtZW50Ow0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5zdG10LklmU3RhdGVtZW50Ow0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5zdG10LlJldHVyblN0YXRlbWVudDsNCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3Quc3RtdC5TdGF0ZW1lbnQ7DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuU3dpdGNoU3RhdGVtZW50Ow0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5zdG10LlN5bmNocm9uaXplZFN0YXRlbWVudDsNCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3Quc3RtdC5UaHJvd1N0YXRlbWVudDsNCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3Quc3RtdC5XaGlsZVN0YXRlbWVudDsNCisNCisvKioNCisgKiBWaXNpdG9yIHRvIHRyYW5zZm9ybSBleHByZXNzaW9ucyBpbiBhIHdob2xlIGNsYXNzLiANCisgKiBUcmFuc2Zvcm1lZCBFeHByZXNzaW9ucyBhcmUgdXN1YWxseSBub3QgdmlzaXRlZC4gDQorICoNCisgKiBAYXV0aG9yIEpvY2hlbiBUaGVvZG9yb3UNCisgKi8NCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2xhc3NDb2RlRXhwcmVzc2lvblRyYW5zZm9ybWVyIGV4dGVuZHMgQ2xhc3NDb2RlVmlzaXRvclN1cHBvcnQgaW1wbGVtZW50cyBFeHByZXNzaW9uVHJhbnNmb3JtZXIgew0KKyAgICANCisgICAgcHJvdGVjdGVkIHZvaWQgdmlzaXRDb25zdHJ1Y3Rvck9yTWV0aG9kKE1ldGhvZE5vZGUgbm9kZSwgYm9vbGVhbiBpc0NvbnN0cnVjdG9yKSB7DQorICAgICAgICBQYXJhbWV0ZXJbXSBwYXJhcyA9IG5vZGUuZ2V0UGFyYW1ldGVycygpOw0KKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPHBhcmFzLmxlbmd0aDsgaSsrKSB7DQorICAgICAgICAgICAgUGFyYW1ldGVyIHAgPSBwYXJhc1tpXTsNCisgICAgICAgICAgICBpZiAocC5oYXNJbml0aWFsRXhwcmVzc2lvbigpKSB7DQorICAgICAgICAgICAgICAgIEV4cHJlc3Npb24gaW5pdCA9IHAuZ2V0SW5pdGlhbEV4cHJlc3Npb24oKTsNCisgICAgICAgICAgICAgICAgcC5zZXRJbml0aWFsRXhwcmVzc2lvbih0cmFuc2Zvcm0oaW5pdCkpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHN1cGVyLnZpc2l0Q29uc3RydWN0b3JPck1ldGhvZChub2RlLGlzQ29uc3RydWN0b3IpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHZpc2l0U3dpdGNoKFN3aXRjaFN0YXRlbWVudCBzdGF0ZW1lbnQpIHsNCisgICAgICAgIEV4cHJlc3Npb24gZXhwID0gc3RhdGVtZW50LmdldEV4cHJlc3Npb24oKTsNCisgICAgICAgIHN0YXRlbWVudC5zZXRFeHByZXNzaW9uKHRyYW5zZm9ybShleHApKTsNCisgICAgICAgIExpc3QgbGlzdCA9IHN0YXRlbWVudC5nZXRDYXNlU3RhdGVtZW50cygpOw0KKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKSB7DQorICAgICAgICAgICAgQ2FzZVN0YXRlbWVudCBjYXNlU3RhdGVtZW50ID0gKENhc2VTdGF0ZW1lbnQpIGl0ZXIubmV4dCgpOw0KKyAgICAgICAgICAgIGNhc2VTdGF0ZW1lbnQudmlzaXQodGhpcyk7DQorICAgICAgICB9DQorICAgICAgICBzdGF0ZW1lbnQuZ2V0RGVmYXVsdFN0YXRlbWVudCgpLnZpc2l0KHRoaXMpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHZpc2l0RmllbGQoRmllbGROb2RlIG5vZGUpIHsNCisgICAgICAgIHZpc2l0QW5ub3RhdGlvbnMobm9kZSk7DQorICAgICAgICBFeHByZXNzaW9uIGluaXQgPSBub2RlLmdldEluaXRpYWxFeHByZXNzaW9uKCk7DQorICAgICAgICBub2RlLnNldEluaXRpYWxWYWx1ZUV4cHJlc3Npb24odHJhbnNmb3JtKGluaXQpKTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHZvaWQgdmlzaXRQcm9wZXJ0eShQcm9wZXJ0eU5vZGUgbm9kZSkgew0KKyAgICAgICAgdmlzaXRBbm5vdGF0aW9ucyhub2RlKTsNCisgICAgICAgIFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBub2RlLmdldEdldHRlckJsb2NrKCk7DQorICAgICAgICB2aXNpdENsYXNzQ29kZUNvbnRhaW5lcihzdGF0ZW1lbnQpOw0KKyAgICAgICAgDQorICAgICAgICBzdGF0ZW1lbnQgPSBub2RlLmdldFNldHRlckJsb2NrKCk7DQorICAgICAgICB2aXNpdENsYXNzQ29kZUNvbnRhaW5lcihzdGF0ZW1lbnQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgdm9pZCB2aXNpdElmRWxzZShJZlN0YXRlbWVudCBpZkVsc2UpIHsNCisgICAgICAgIGlmRWxzZS5zZXRCb29sZWFuRXhwcmVzc2lvbigoQm9vbGVhbkV4cHJlc3Npb24pICh0cmFuc2Zvcm0oaWZFbHNlLmdldEJvb2xlYW5FeHByZXNzaW9uKCkpKSk7DQorICAgICAgICBpZkVsc2UuZ2V0SWZCbG9jaygpLnZpc2l0KHRoaXMpOw0KKyAgICAgICAgaWZFbHNlLmdldEVsc2VCbG9jaygpLnZpc2l0KHRoaXMpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBFeHByZXNzaW9uIHRyYW5zZm9ybShFeHByZXNzaW9uIGV4cCkgew0KKyAgICAgICAgaWYgKGV4cD09bnVsbCkgcmV0dXJuIG51bGw7DQorICAgICAgICByZXR1cm4gZXhwLnRyYW5zZm9ybUV4cHJlc3Npb24odGhpcyk7DQorICAgIH0NCisgICAgICAgIA0KKyAgICBwdWJsaWMgdm9pZCB2aXNpdEFubm90YXRpb25zKEFubm90YXRlZE5vZGUgbm9kZSkgew0KKyAgICAgICAgTWFwIGFubm90aW9uTWFwID0gbm9kZS5nZXRBbm5vdGF0aW9ucygpOw0KKyAgICAgICAgaWYgKGFubm90aW9uTWFwLmlzRW1wdHkoKSkgcmV0dXJuOw0KKyAgICAgICAgSXRlcmF0b3IgaXQgPSBhbm5vdGlvbk1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOw0KKyAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgew0KKyAgICAgICAgICAgIEFubm90YXRpb25Ob2RlIGFuID0gKEFubm90YXRpb25Ob2RlKSBpdC5uZXh0KCk7DQorICAgICAgICAgICAgLy9za2lwIGJ1aWx0aW4gcHJvcGVydGllcw0KKyAgICAgICAgICAgIGlmIChhbi5pc0J1aWx0SW4oKSkgY29udGludWU7DQorICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gYW4uZ2V0TWVtYmVycygpLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7DQorICAgICAgICAgICAgICAgIE1hcC5FbnRyeSBtZW1iZXIgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsNCisgICAgICAgICAgICAgICAgRXhwcmVzc2lvbiBtZW1iZXJWYWx1ZSA9IChFeHByZXNzaW9uKSBtZW1iZXIuZ2V0VmFsdWUoKTsNCisgICAgICAgICAgICAgICAgbWVtYmVyLnNldFZhbHVlKHRyYW5zZm9ybShtZW1iZXJWYWx1ZSkpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCB2aXNpdFJldHVyblN0YXRlbWVudChSZXR1cm5TdGF0ZW1lbnQgc3RhdGVtZW50KSB7DQorICAgICAgIHN0YXRlbWVudC5zZXRFeHByZXNzaW9uKHRyYW5zZm9ybShzdGF0ZW1lbnQuZ2V0RXhwcmVzc2lvbigpKSk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgdmlzaXRBc3NlcnRTdGF0ZW1lbnQoQXNzZXJ0U3RhdGVtZW50IGFzKSB7DQorICAgICAgICBhcy5zZXRCb29sZWFuRXhwcmVzc2lvbigoQm9vbGVhbkV4cHJlc3Npb24pICh0cmFuc2Zvcm0oYXMuZ2V0Qm9vbGVhbkV4cHJlc3Npb24oKSkpKTsNCisgICAgICAgIGFzLnNldE1lc3NhZ2VFeHByZXNzaW9uKHRyYW5zZm9ybShhcy5nZXRNZXNzYWdlRXhwcmVzc2lvbigpKSk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgdmlzaXRDYXNlU3RhdGVtZW50KENhc2VTdGF0ZW1lbnQgc3RhdGVtZW50KSB7DQorICAgIAlzdGF0ZW1lbnQuc2V0RXhwcmVzc2lvbih0cmFuc2Zvcm0oc3RhdGVtZW50LmdldEV4cHJlc3Npb24oKSkpOw0KKyAgICAJc3RhdGVtZW50LmdldENvZGUoKS52aXNpdCh0aGlzKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCB2aXNpdERvV2hpbGVMb29wKERvV2hpbGVTdGF0ZW1lbnQgbG9vcCkgew0KKyAgICAgICAgbG9vcC5zZXRCb29sZWFuRXhwcmVzc2lvbigoQm9vbGVhbkV4cHJlc3Npb24pICh0cmFuc2Zvcm0obG9vcC5nZXRCb29sZWFuRXhwcmVzc2lvbigpKSkpOw0KKyAgICAgICAgc3VwZXIudmlzaXREb1doaWxlTG9vcChsb29wKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCB2aXNpdEZvckxvb3AoRm9yU3RhdGVtZW50IGZvckxvb3ApIHsNCisgICAgICAgIGZvckxvb3Auc2V0Q29sbGVjdGlvbkV4cHJlc3Npb24odHJhbnNmb3JtKGZvckxvb3AuZ2V0Q29sbGVjdGlvbkV4cHJlc3Npb24oKSkpOw0KKyAgICAgICAgc3VwZXIudmlzaXRGb3JMb29wKGZvckxvb3ApOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHZpc2l0U3luY2hyb25pemVkU3RhdGVtZW50KFN5bmNocm9uaXplZFN0YXRlbWVudCBzeW5jKSB7DQorICAgICAgICBzeW5jLnNldEV4cHJlc3Npb24odHJhbnNmb3JtKHN5bmMuZ2V0RXhwcmVzc2lvbigpKSk7DQorICAgICAgICBzdXBlci52aXNpdFN5bmNocm9uaXplZFN0YXRlbWVudChzeW5jKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCB2aXNpdFRocm93U3RhdGVtZW50KFRocm93U3RhdGVtZW50IHRzKSB7DQorICAgICAgICB0cy5zZXRFeHByZXNzaW9uKHRyYW5zZm9ybSh0cy5nZXRFeHByZXNzaW9uKCkpKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCB2aXNpdFdoaWxlTG9vcChXaGlsZVN0YXRlbWVudCBsb29wKSB7DQorICAgIAlsb29wLnNldEJvb2xlYW5FeHByZXNzaW9uKChCb29sZWFuRXhwcmVzc2lvbikgdHJhbnNmb3JtKGxvb3AuZ2V0Qm9vbGVhbkV4cHJlc3Npb24oKSkpOw0KKyAgICAJc3VwZXIudmlzaXRXaGlsZUxvb3AobG9vcCk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgdmlzaXRFeHByZXNzaW9uU3RhdGVtZW50KEV4cHJlc3Npb25TdGF0ZW1lbnQgZXMpIHsNCisgICAgICAgIGVzLnNldEV4cHJlc3Npb24odHJhbnNmb3JtKGVzLmdldEV4cHJlc3Npb24oKSkpOw0KKyAgICB9ICAgIA0KK30NCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvQ2xhc3NDb2RlVmlzaXRvclN1cHBvcnQuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9DbGFzc0NvZGVWaXNpdG9yU3VwcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2ZTVjNGMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvQ2xhc3NDb2RlVmlzaXRvclN1cHBvcnQuamF2YQpAQCAtMCwwICsxLDIwMSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0OworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByLkV4cHJlc3Npb247CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3Quc3RtdC5Bc3NlcnRTdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3Quc3RtdC5CbG9ja1N0YXRlbWVudDsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5zdG10LkJyZWFrU3RhdGVtZW50OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuQ2FzZVN0YXRlbWVudDsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5zdG10LkNhdGNoU3RhdGVtZW50OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuQ29udGludWVTdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3Quc3RtdC5Eb1doaWxlU3RhdGVtZW50OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuRXhwcmVzc2lvblN0YXRlbWVudDsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5zdG10LkZvclN0YXRlbWVudDsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5zdG10LklmU3RhdGVtZW50OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuUmV0dXJuU3RhdGVtZW50OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuU3RhdGVtZW50OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuU3dpdGNoU3RhdGVtZW50OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuU3luY2hyb25pemVkU3RhdGVtZW50OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuVGhyb3dTdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3Quc3RtdC5UcnlDYXRjaFN0YXRlbWVudDsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5zdG10LldoaWxlU3RhdGVtZW50OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5Tb3VyY2VVbml0OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5tZXNzYWdlcy5TeW50YXhFcnJvck1lc3NhZ2U7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXguU3ludGF4RXhjZXB0aW9uOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2xhc3NDb2RlVmlzaXRvclN1cHBvcnQgZXh0ZW5kcyBDb2RlVmlzaXRvclN1cHBvcnQgaW1wbGVtZW50cyBHcm9vdnlDbGFzc1Zpc2l0b3IgeworICAgIAorICAgIHB1YmxpYyB2b2lkIHZpc2l0Q2xhc3MoQ2xhc3NOb2RlIG5vZGUpIHsKKyAgICAgICAgdmlzaXRBbm5vdGF0aW9ucyhub2RlKTsKKyAgICAgICAgbm9kZS52aXNpdENvbnRlbnRzKHRoaXMpOworICAgICAgICBMaXN0IGxpc3QgPSBub2RlLmdldE9iamVjdEluaXRpYWxpemVyU3RhdGVtZW50cygpOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgU3RhdGVtZW50IGVsZW1lbnQgPSAoU3RhdGVtZW50KSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIGVsZW1lbnQudmlzaXQodGhpcyk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdmlzaXRBbm5vdGF0aW9ucyhBbm5vdGF0ZWROb2RlIG5vZGUpIHsKKyAgICAgICAgTWFwIGFubm90aW9uTWFwID0gbm9kZS5nZXRBbm5vdGF0aW9ucygpOworICAgICAgICBpZiAoYW5ub3Rpb25NYXAuaXNFbXB0eSgpKSByZXR1cm47CisgICAgICAgIEl0ZXJhdG9yIGl0ID0gYW5ub3Rpb25NYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgCisgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIEFubm90YXRpb25Ob2RlIGFuID0gKEFubm90YXRpb25Ob2RlKSBpdC5uZXh0KCk7CisgICAgICAgICAgICAvL3NraXAgYnVpbHRpbiBwcm9wZXJ0aWVzCisgICAgICAgICAgICBpZiAoYW4uaXNCdWlsdEluKCkpIGNvbnRpbnVlOworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gYW4uZ2V0TWVtYmVycygpLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgTWFwLkVudHJ5IG1lbWJlciA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIEV4cHJlc3Npb24gbWVtYmVyVmFsdWUgPSAoRXhwcmVzc2lvbikgbWVtYmVyLmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgbWVtYmVyVmFsdWUudmlzaXQodGhpcyk7CisgICAgICAgICAgICB9ICAKKyAgICAgICAgfQorICAgIH0KKyAgICAgICAgCisgICAgcHJvdGVjdGVkIHZvaWQgdmlzaXRDbGFzc0NvZGVDb250YWluZXIoU3RhdGVtZW50IGNvZGUpIHsKKyAgICAgICAgaWYgKGNvZGUgIT0gbnVsbCkgY29kZS52aXNpdCh0aGlzKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB2aXNpdENvbnN0cnVjdG9yT3JNZXRob2QoTWV0aG9kTm9kZSBub2RlLCBib29sZWFuIGlzQ29uc3RydWN0b3IpIHsKKyAgICAgICAgdmlzaXRBbm5vdGF0aW9ucyhub2RlKTsKKyAgICAgICAgU3RhdGVtZW50IGNvZGUgPSBub2RlLmdldENvZGUoKTsKKyAgICAgICAgCisgICAgICAgIHZpc2l0Q2xhc3NDb2RlQ29udGFpbmVyKGNvZGUpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB2aXNpdENvbnN0cnVjdG9yKENvbnN0cnVjdG9yTm9kZSBub2RlKSB7CisgICAgICAgIHZpc2l0Q29uc3RydWN0b3JPck1ldGhvZChub2RlLHRydWUpOyAgICAgICAgCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRNZXRob2QoTWV0aG9kTm9kZSBub2RlKSB7CisgICAgICAgIHZpc2l0Q29uc3RydWN0b3JPck1ldGhvZChub2RlLGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEZpZWxkKEZpZWxkTm9kZSBub2RlKSB7CisgICAgICAgIHZpc2l0QW5ub3RhdGlvbnMobm9kZSk7CisgICAgICAgIEV4cHJlc3Npb24gaW5pdCA9IG5vZGUuZ2V0SW5pdGlhbEV4cHJlc3Npb24oKTsKKyAgICAgICAgaWYgKGluaXQgIT0gbnVsbCkgaW5pdC52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdmlzaXRQcm9wZXJ0eShQcm9wZXJ0eU5vZGUgbm9kZSkgeworICAgICAgICB2aXNpdEFubm90YXRpb25zKG5vZGUpOworICAgICAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbm9kZS5nZXRHZXR0ZXJCbG9jaygpOworICAgICAgICB2aXNpdENsYXNzQ29kZUNvbnRhaW5lcihzdGF0ZW1lbnQpOworICAgICAgICAKKyAgICAgICAgc3RhdGVtZW50ID0gbm9kZS5nZXRTZXR0ZXJCbG9jaygpOworICAgICAgICB2aXNpdENsYXNzQ29kZUNvbnRhaW5lcihzdGF0ZW1lbnQpOworICAgICAgICAKKyAgICAgICAgRXhwcmVzc2lvbiBpbml0ID0gbm9kZS5nZXRJbml0aWFsRXhwcmVzc2lvbigpOworICAgICAgICBpZiAoaW5pdCAhPSBudWxsKSBpbml0LnZpc2l0KHRoaXMpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGFkZEVycm9yKFN0cmluZyBtc2csIEFTVE5vZGUgZXhwcikgeworICAgICAgICBpbnQgbGluZSA9IGV4cHIuZ2V0TGluZU51bWJlcigpOworICAgICAgICBpbnQgY29sID0gZXhwci5nZXRDb2x1bW5OdW1iZXIoKTsKKyAgICAgICAgU291cmNlVW5pdCBzb3VyY2UgPSBnZXRTb3VyY2VVbml0KCk7CisgICAgICAgIHNvdXJjZS5nZXRFcnJvckNvbGxlY3RvcigpLmFkZEVycm9yQW5kQ29udGludWUoCisgICAgICAgICAgbmV3IFN5bnRheEVycm9yTWVzc2FnZShuZXcgU3ludGF4RXhjZXB0aW9uKG1zZyArICdcbicsIGxpbmUsIGNvbCksIHNvdXJjZSkKKyAgICAgICAgKTsKKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IFNvdXJjZVVuaXQgZ2V0U291cmNlVW5pdCgpOworICAgIAorICAgIHByb3RlY3RlZCB2b2lkIHZpc2l0U3RhdGVtZW50KFN0YXRlbWVudCBzdGF0ZW1lbnQpIHt9CisgICAgCisgICAgcHVibGljIHZvaWQgdmlzaXRBc3NlcnRTdGF0ZW1lbnQoQXNzZXJ0U3RhdGVtZW50IHN0YXRlbWVudCkgeworICAgICAgICB2aXNpdFN0YXRlbWVudChzdGF0ZW1lbnQpOworICAgICAgICBzdXBlci52aXNpdEFzc2VydFN0YXRlbWVudChzdGF0ZW1lbnQpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEJsb2NrU3RhdGVtZW50KEJsb2NrU3RhdGVtZW50IGJsb2NrKSB7CisgICAgICAgIHZpc2l0U3RhdGVtZW50KGJsb2NrKTsKKyAgICAgICAgc3VwZXIudmlzaXRCbG9ja1N0YXRlbWVudChibG9jayk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHZpc2l0QnJlYWtTdGF0ZW1lbnQoQnJlYWtTdGF0ZW1lbnQgc3RhdGVtZW50KSB7CisgICAgICAgIHZpc2l0U3RhdGVtZW50KHN0YXRlbWVudCk7CisgICAgICAgIHN1cGVyLnZpc2l0QnJlYWtTdGF0ZW1lbnQoc3RhdGVtZW50KTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdmlzaXRDYXNlU3RhdGVtZW50KENhc2VTdGF0ZW1lbnQgc3RhdGVtZW50KSB7CisgICAgICAgIHZpc2l0U3RhdGVtZW50KHN0YXRlbWVudCk7CisgICAgICAgIHN1cGVyLnZpc2l0Q2FzZVN0YXRlbWVudChzdGF0ZW1lbnQpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB2aXNpdENhdGNoU3RhdGVtZW50KENhdGNoU3RhdGVtZW50IHN0YXRlbWVudCkgeworICAgICAgICB2aXNpdFN0YXRlbWVudChzdGF0ZW1lbnQpOworICAgICAgICBzdXBlci52aXNpdENhdGNoU3RhdGVtZW50KHN0YXRlbWVudCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHZpc2l0Q29udGludWVTdGF0ZW1lbnQoQ29udGludWVTdGF0ZW1lbnQgc3RhdGVtZW50KSB7CisgICAgICAgIHZpc2l0U3RhdGVtZW50KHN0YXRlbWVudCk7CisgICAgICAgIHN1cGVyLnZpc2l0Q29udGludWVTdGF0ZW1lbnQoc3RhdGVtZW50KTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdmlzaXREb1doaWxlTG9vcChEb1doaWxlU3RhdGVtZW50IGxvb3ApIHsKKyAgICAgICAgdmlzaXRTdGF0ZW1lbnQobG9vcCk7CisgICAgICAgIHN1cGVyLnZpc2l0RG9XaGlsZUxvb3AobG9vcCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHZpc2l0RXhwcmVzc2lvblN0YXRlbWVudChFeHByZXNzaW9uU3RhdGVtZW50IHN0YXRlbWVudCkgeworICAgICAgICB2aXNpdFN0YXRlbWVudChzdGF0ZW1lbnQpOworICAgICAgICBzdXBlci52aXNpdEV4cHJlc3Npb25TdGF0ZW1lbnQoc3RhdGVtZW50KTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdmlzaXRGb3JMb29wKEZvclN0YXRlbWVudCBmb3JMb29wKSB7CisgICAgICAgIHZpc2l0U3RhdGVtZW50KGZvckxvb3ApOworICAgICAgICBzdXBlci52aXNpdEZvckxvb3AoZm9yTG9vcCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHZpc2l0SWZFbHNlKElmU3RhdGVtZW50IGlmRWxzZSkgeworICAgICAgICB2aXNpdFN0YXRlbWVudChpZkVsc2UpOworICAgICAgICBzdXBlci52aXNpdElmRWxzZShpZkVsc2UpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFJldHVyblN0YXRlbWVudChSZXR1cm5TdGF0ZW1lbnQgc3RhdGVtZW50KSB7CisgICAgICAgIHZpc2l0U3RhdGVtZW50KHN0YXRlbWVudCk7CisgICAgICAgIHN1cGVyLnZpc2l0UmV0dXJuU3RhdGVtZW50KHN0YXRlbWVudCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHZpc2l0U3dpdGNoKFN3aXRjaFN0YXRlbWVudCBzdGF0ZW1lbnQpIHsKKyAgICAgICAgdmlzaXRTdGF0ZW1lbnQoc3RhdGVtZW50KTsKKyAgICAgICAgc3VwZXIudmlzaXRTd2l0Y2goc3RhdGVtZW50KTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdmlzaXRTeW5jaHJvbml6ZWRTdGF0ZW1lbnQoU3luY2hyb25pemVkU3RhdGVtZW50IHN0YXRlbWVudCkgeworICAgICAgICB2aXNpdFN0YXRlbWVudChzdGF0ZW1lbnQpOworICAgICAgICBzdXBlci52aXNpdFN5bmNocm9uaXplZFN0YXRlbWVudChzdGF0ZW1lbnQpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFRocm93U3RhdGVtZW50KFRocm93U3RhdGVtZW50IHN0YXRlbWVudCkgeworICAgICAgICB2aXNpdFN0YXRlbWVudChzdGF0ZW1lbnQpOworICAgICAgICBzdXBlci52aXNpdFRocm93U3RhdGVtZW50KHN0YXRlbWVudCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHZpc2l0VHJ5Q2F0Y2hGaW5hbGx5KFRyeUNhdGNoU3RhdGVtZW50IHN0YXRlbWVudCkgeworICAgICAgICB2aXNpdFN0YXRlbWVudChzdGF0ZW1lbnQpOworICAgICAgICBzdXBlci52aXNpdFRyeUNhdGNoRmluYWxseShzdGF0ZW1lbnQpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFdoaWxlTG9vcChXaGlsZVN0YXRlbWVudCBsb29wKSB7CisgICAgICAgIHZpc2l0U3RhdGVtZW50KGxvb3ApOworICAgICAgICBzdXBlci52aXNpdFdoaWxlTG9vcChsb29wKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvQ2xhc3NIZWxwZXIuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9DbGFzc0hlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MmM2YmMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvQ2xhc3NIZWxwZXIuamF2YQpAQCAtMCwwICsxLDI4MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5hc3Q7CisKK2ltcG9ydCBncm9vdnkubGFuZy5DbG9zdXJlOworaW1wb3J0IGdyb292eS5sYW5nLkdTdHJpbmc7CitpbXBvcnQgZ3Jvb3Z5LmxhbmcuTWV0YUNsYXNzOworaW1wb3J0IGdyb292eS5sYW5nLlJhbmdlOworaW1wb3J0IGdyb292eS5sYW5nLlJlZmVyZW5jZTsKK2ltcG9ydCBncm9vdnkubGFuZy5TY3JpcHQ7CisKK2ltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLkdlbmVyYXRlZENsb3N1cmU7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS52bXBsdWdpbi5WTVBsdWdpbkZhY3Rvcnk7CitpbXBvcnQgb3JnLm9iamVjdHdlYi5hc20uT3Bjb2RlczsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGEgSGVscGVyIGZvciBDbGFzc05vZGUgYW5kIGNsYXNzZXMgaGFuZGxpbmcgQ2xhc3NOb2Rlcy4KKyAqIEl0IGRvZXMgY29udGFpbiBhIHNldCBvZiBwcmVkZWZpbmVkIENsYXNzTm9kZXMgZm9yIHRoZSBtb3N0IHVzZWQgCisgKiB0eXBlcyBhbmQgc29tZSBjb2RlIGZvciBjYWNoZWQgQ2xhc3NOb2RlIGNyZWF0aW9uIGFuZCBiYXNpYyAKKyAqIENsYXNzTm9kZSBoYW5kbGluZyAKKyAqIAorICogQGF1dGhvciBKb2NoZW4gVGhlb2Rvcm91CisgKi8KK3B1YmxpYyBjbGFzcyBDbGFzc0hlbHBlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1tdIGNsYXNzZXMgPSBuZXcgQ2xhc3NbXSB7CisgICAgICAgIE9iamVjdC5jbGFzcywgQm9vbGVhbi5UWVBFLCBDaGFyYWN0ZXIuVFlQRSwgQnl0ZS5UWVBFLCBTaG9ydC5UWVBFLAorICAgICAgICBJbnRlZ2VyLlRZUEUsIExvbmcuVFlQRSwgRG91YmxlLlRZUEUsIEZsb2F0LlRZUEUsIFZvaWQuVFlQRSwKKyAgICAgICAgQ2xvc3VyZS5jbGFzcywgR1N0cmluZy5jbGFzcywgTGlzdC5jbGFzcywgTWFwLmNsYXNzLCBSYW5nZS5jbGFzcywKKyAgICAgICAgUGF0dGVybi5jbGFzcywgU2NyaXB0LmNsYXNzLCBTdHJpbmcuY2xhc3MsICBCb29sZWFuLmNsYXNzLCAKKyAgICAgICAgQ2hhcmFjdGVyLmNsYXNzLCBCeXRlLmNsYXNzLCBTaG9ydC5jbGFzcywgSW50ZWdlci5jbGFzcywgTG9uZy5jbGFzcywKKyAgICAgICAgRG91YmxlLmNsYXNzLCBGbG9hdC5jbGFzcywgQmlnRGVjaW1hbC5jbGFzcywgQmlnSW50ZWdlci5jbGFzcywgVm9pZC5jbGFzcywKKyAgICAgICAgUmVmZXJlbmNlLmNsYXNzLCBDbGFzcy5jbGFzcywgTWV0YUNsYXNzLmNsYXNzLCAgICAgCisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHByaW1pdGl2ZUNsYXNzTmFtZXMgPSBuZXcgU3RyaW5nW10geworICAgICAgICAiIiwgImJvb2xlYW4iLCAiY2hhciIsICJieXRlIiwgInNob3J0IiwgCisgICAgICAgICJpbnQiLCAibG9uZyIsICJkb3VibGUiLCAiZmxvYXQiLCAidm9pZCIKKyAgICB9OworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3NOb2RlIAorICAgICAgICBEWU5BTUlDX1RZUEUgPSBuZXcgQ2xhc3NOb2RlKE9iamVjdC5jbGFzcyksICBPQkpFQ1RfVFlQRSA9IERZTkFNSUNfVFlQRSwKKyAgICAgICAgVk9JRF9UWVBFID0gbmV3IENsYXNzTm9kZShWb2lkLlRZUEUpLCAgICAgICAgQ0xPU1VSRV9UWVBFID0gbmV3IENsYXNzTm9kZShDbG9zdXJlLmNsYXNzKSwKKyAgICAgICAgR1NUUklOR19UWVBFID0gbmV3IENsYXNzTm9kZShHU3RyaW5nLmNsYXNzKSwgTElTVF9UWVBFID0gbWFrZVdpdGhvdXRDYWNoaW5nKExpc3QuY2xhc3MpLAorICAgICAgICBNQVBfVFlQRSA9IG5ldyBDbGFzc05vZGUoTWFwLmNsYXNzKSwgICAgICAgICBSQU5HRV9UWVBFID0gbmV3IENsYXNzTm9kZShSYW5nZS5jbGFzcyksCisgICAgICAgIFBBVFRFUk5fVFlQRSA9IG5ldyBDbGFzc05vZGUoUGF0dGVybi5jbGFzcyksIFNUUklOR19UWVBFID0gbmV3IENsYXNzTm9kZShTdHJpbmcuY2xhc3MpLAorICAgICAgICBTQ1JJUFRfVFlQRSA9IG5ldyBDbGFzc05vZGUoU2NyaXB0LmNsYXNzKSwgICBSRUZFUkVOQ0VfVFlQRSA9IG1ha2VXaXRob3V0Q2FjaGluZyhSZWZlcmVuY2UuY2xhc3MpLAorICAgICAgICAKKyAgICAgICAgYm9vbGVhbl9UWVBFID0gbmV3IENsYXNzTm9kZShib29sZWFuLmNsYXNzKSwgICAgIGNoYXJfVFlQRSA9IG5ldyBDbGFzc05vZGUoY2hhci5jbGFzcyksCisgICAgICAgIGJ5dGVfVFlQRSA9IG5ldyBDbGFzc05vZGUoYnl0ZS5jbGFzcyksICAgICAgICAgICBpbnRfVFlQRSA9IG5ldyBDbGFzc05vZGUoaW50LmNsYXNzKSwKKyAgICAgICAgbG9uZ19UWVBFID0gbmV3IENsYXNzTm9kZShsb25nLmNsYXNzKSwgICAgICAgICAgIHNob3J0X1RZUEUgPSBuZXcgQ2xhc3NOb2RlKHNob3J0LmNsYXNzKSwKKyAgICAgICAgZG91YmxlX1RZUEUgPSBuZXcgQ2xhc3NOb2RlKGRvdWJsZS5jbGFzcyksICAgICAgIGZsb2F0X1RZUEUgPSBuZXcgQ2xhc3NOb2RlKGZsb2F0LmNsYXNzKSwKKyAgICAgICAgQnl0ZV9UWVBFID0gbmV3IENsYXNzTm9kZShCeXRlLmNsYXNzKSwgICAgICAgICAgIFNob3J0X1RZUEUgPSBuZXcgQ2xhc3NOb2RlKFNob3J0LmNsYXNzKSwKKyAgICAgICAgSW50ZWdlcl9UWVBFID0gbmV3IENsYXNzTm9kZShJbnRlZ2VyLmNsYXNzKSwgICAgIExvbmdfVFlQRSA9IG5ldyBDbGFzc05vZGUoTG9uZy5jbGFzcyksCisgICAgICAgIENoYXJhY3Rlcl9UWVBFID0gbmV3IENsYXNzTm9kZShDaGFyYWN0ZXIuY2xhc3MpLCBGbG9hdF9UWVBFID0gbmV3IENsYXNzTm9kZShGbG9hdC5jbGFzcyksCisgICAgICAgIERvdWJsZV9UWVBFID0gbmV3IENsYXNzTm9kZShEb3VibGUuY2xhc3MpLCAgICAgICBCb29sZWFuX1RZUEUgPSBuZXcgQ2xhc3NOb2RlKEJvb2xlYW4uY2xhc3MpLAorICAgICAgICBCaWdJbnRlZ2VyX1RZUEUgPSAgbmV3IENsYXNzTm9kZShqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcyksCisgICAgICAgIEJpZ0RlY2ltYWxfVFlQRSA9IG5ldyBDbGFzc05vZGUoamF2YS5tYXRoLkJpZ0RlY2ltYWwuY2xhc3MpLAorICAgICAgICB2b2lkX1dSQVBQRVJfVFlQRSA9IG5ldyBDbGFzc05vZGUoVm9pZC5jbGFzcyksICAgCisgICAgICAgIAorICAgICAgICBDTEFTU19UeXBlID0gbmV3IENsYXNzTm9kZShDbGFzcy5jbGFzcyksICAgICAgICBNRVRBQ0xBU1NfVFlQRSA9IG5ldyBDbGFzc05vZGUoTWV0YUNsYXNzLmNsYXNzKSwKKyAgICAgICAgR0VORVJBVEVEX0NMT1NVUkVfVHlwZSA9IG5ldyBDbGFzc05vZGUoR2VuZXJhdGVkQ2xvc3VyZS5jbGFzcyksCisgICAgICAgIEVudW1fVHlwZSA9IG5ldyBDbGFzc05vZGUoImphdmEubGFuZy5FbnVtIiwwLE9CSkVDVF9UWVBFKTsKKyAgICAgICAgCisgICAgc3RhdGljIHsKKyAgICAgICAgRW51bV9UeXBlLmlzUHJpbWFyeU5vZGUgPSBmYWxzZTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3NOb2RlW10gdHlwZXMgPSBuZXcgQ2xhc3NOb2RlW10geworICAgICAgICBPQkpFQ1RfVFlQRSwKKyAgICAgICAgYm9vbGVhbl9UWVBFLCBjaGFyX1RZUEUsIGJ5dGVfVFlQRSwgc2hvcnRfVFlQRSwKKyAgICAgICAgaW50X1RZUEUsIGxvbmdfVFlQRSwgZG91YmxlX1RZUEUsIGZsb2F0X1RZUEUsCisgICAgICAgIFZPSURfVFlQRSwgQ0xPU1VSRV9UWVBFLCBHU1RSSU5HX1RZUEUsCisgICAgICAgIExJU1RfVFlQRSwgTUFQX1RZUEUsIFJBTkdFX1RZUEUsIFBBVFRFUk5fVFlQRSwKKyAgICAgICAgU0NSSVBUX1RZUEUsIFNUUklOR19UWVBFLCBCb29sZWFuX1RZUEUsIENoYXJhY3Rlcl9UWVBFLAorICAgICAgICBCeXRlX1RZUEUsIFNob3J0X1RZUEUsIEludGVnZXJfVFlQRSwgTG9uZ19UWVBFLAorICAgICAgICBEb3VibGVfVFlQRSwgRmxvYXRfVFlQRSwgQmlnRGVjaW1hbF9UWVBFLCBCaWdJbnRlZ2VyX1RZUEUsIAorICAgICAgICB2b2lkX1dSQVBQRVJfVFlQRSwgUkVGRVJFTkNFX1RZUEUsIENMQVNTX1R5cGUsIE1FVEFDTEFTU19UWVBFLAorICAgICAgICBHRU5FUkFURURfQ0xPU1VSRV9UeXBlLCBFbnVtX1R5cGUKKyAgICB9OworCisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3NOb2RlW10gbnVtYmVycyA9IG5ldyBDbGFzc05vZGVbXSB7CisgICAgICAgIGNoYXJfVFlQRSwgYnl0ZV9UWVBFLCBzaG9ydF9UWVBFLCBpbnRfVFlQRSwgbG9uZ19UWVBFLCAKKyAgICAgICAgZG91YmxlX1RZUEUsIGZsb2F0X1RZUEUsIFNob3J0X1RZUEUsIEJ5dGVfVFlQRSwgQ2hhcmFjdGVyX1RZUEUsCisgICAgICAgIEludGVnZXJfVFlQRSwgRmxvYXRfVFlQRSwgTG9uZ19UWVBFLCBEb3VibGVfVFlQRSwgQmlnSW50ZWdlcl9UWVBFLAorICAgICAgICBCaWdEZWNpbWFsX1RZUEUKKyAgICB9OworCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzc05vZGVbXSBFTVBUWV9UWVBFX0FSUkFZID0ge307CisgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0JKRUNUID0gImphdmEubGFuZy5PYmplY3QiOyAgICAKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIENsYXNzTm9kZXMgdXNpbmcgYW4gYXJyYXkgb2YgY2xhc3Nlcy4KKyAgICAgKiBGb3IgZWFjaCBvZiB0aGUgZ2l2ZW4gY2xhc3NlcyBhIG5ldyBDbGFzc05vZGUgd2lsbCBiZSAKKyAgICAgKiBjcmVhdGVkCisgICAgICogQHNlZSAjbWFrZShDbGFzcykKKyAgICAgKiBAcGFyYW0gY2xhc3NlcyBhbiBhcnJheSBvZiBjbGFzc2VzIHVzZWQgdG8gY3JlYXRlIHRoZSBDbGFzc05vZGVzCisgICAgICogQHJldHVybiBhbiBhcnJheSBvZiBDbGFzc05vZGVzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDbGFzc05vZGVbXSBtYWtlKENsYXNzW10gY2xhc3NlcykgeworICAgIAlDbGFzc05vZGVbXSBjbnMgPSBuZXcgQ2xhc3NOb2RlW2NsYXNzZXMubGVuZ3RoXTsKKyAgICAJZm9yIChpbnQgaT0wOyBpPGNucy5sZW5ndGg7IGkrKykgeworICAgIAkJY25zW2ldID0gbWFrZShjbGFzc2VzW2ldKTsKKyAgICAJfQorICAgIAkKKyAgICAJcmV0dXJuIGNuczsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIENsYXNzTm9kZSB1c2luZyBhIGdpdmVuIGNsYXNzLgorICAgICAqIEEgbmV3IENsYXNzTm9kZSBvYmplY3QgaXMgb25seSBjcmVhdGVkIGlmIHRoZSBjbGFzcworICAgICAqIGlzIG5vdCBvbmUgb2YgdGhlIHByZWRlZmluZWQgb25lcworICAgICAqIAorICAgICAqIEBwYXJhbSBjIGNsYXNzIHVzZWQgdG8gY3JlYXRlZCB0aGUgQ2xhc3NOb2RlCisgICAgICogQHJldHVybiBDbGFzc05vZGUgaW5zdGFuY2UgY3JlYXRlZCBmcm9tIHRoZSBnaXZlbiBjbGFzcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3NOb2RlIG1ha2UoQ2xhc3MgYykgeworICAgICAgICByZXR1cm4gbWFrZShjLHRydWUpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIENsYXNzTm9kZSBtYWtlKENsYXNzIGMsIGJvb2xlYW4gaW5jbHVkZUdlbmVyaWNzKSB7CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxjbGFzc2VzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoYz09Y2xhc3Nlc1tpXSkgcmV0dXJuIHR5cGVzW2ldOworICAgICAgICB9CisgICAgICAgIGlmIChjLmlzQXJyYXkoKSkgeworICAgICAgICAgICAgQ2xhc3NOb2RlIGNuID0gbWFrZShjLmdldENvbXBvbmVudFR5cGUoKSxpbmNsdWRlR2VuZXJpY3MpOworICAgICAgICAgICAgcmV0dXJuIGNuLm1ha2VBcnJheSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtYWtlV2l0aG91dENhY2hpbmcoYyxpbmNsdWRlR2VuZXJpY3MpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIENsYXNzTm9kZSBtYWtlV2l0aG91dENhY2hpbmcoQ2xhc3MgYyl7CisgICAgICAgIHJldHVybiBtYWtlV2l0aG91dENhY2hpbmcoYyx0cnVlKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBDbGFzc05vZGUgbWFrZVdpdGhvdXRDYWNoaW5nKENsYXNzIGMsIGJvb2xlYW4gaW5jbHVkZUdlbmVyaWNzKXsKKyAgICAgICAgQ2xhc3NOb2RlIHQgPSBuZXcgQ2xhc3NOb2RlKGMpOworICAgICAgICBpZiAoaW5jbHVkZUdlbmVyaWNzKSBWTVBsdWdpbkZhY3RvcnkuZ2V0UGx1Z2luKCkuc2V0R2VuZXJpY3NUeXBlcyh0KTsKKyAgICAgICAgcmV0dXJuIHQ7CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBDbGFzc05vZGUgdXNpbmcgYSBnaXZlbiBjbGFzcy4KKyAgICAgKiBVbmxpa2UgbWFrZShTdHJpbmcpIHRoaXMgbWV0aG9kIHdpbGwgbm90IHVzZSB0aGUgY2FjaGUKKyAgICAgKiB0byBjcmVhdGUgdGhlIENsYXNzTm9kZS4gVGhpcyBtZWFucyB0aGUgQ2xhc3NOb2RlIGNyZWF0ZWQKKyAgICAgKiBmcm9tIHRoaXMgbWV0aG9kIHVzaW5nIHRoZSBzYW1lIG5hbWUgd2lsbCBoYXZlIGEgZGlmZmVyZW50CisgICAgICogcmVmZXJlbmNlcworICAgICAqIAorICAgICAqIEBzZWUgI21ha2UoU3RyaW5nKQorICAgICAqIEBwYXJhbSBuYW1lIG9mIHRoZSBjbGFzcyB0aGUgQ2xhc3NOb2RlIGlzIHJlcHJlc2VudGluZworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3NOb2RlIG1ha2VXaXRob3V0Q2FjaGluZyhTdHJpbmcgbmFtZSkgeyAKKyAgICAgICAgQ2xhc3NOb2RlIGNuID0gbmV3IENsYXNzTm9kZShuYW1lLE9wY29kZXMuQUNDX1BVQkxJQyxPQkpFQ1RfVFlQRSk7CisgICAgICAgIGNuLmlzUHJpbWFyeU5vZGUgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIGNuOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgQ2xhc3NOb2RlIHVzaW5nIGEgZ2l2ZW4gY2xhc3MuCisgICAgICogSWYgdGhlIG5hbWUgaXMgb25lIG9mIHRoZSBwcmVkZWZpbmVkIENsYXNzTm9kZXMgdGhlbiB0aGUgCisgICAgICogY29ycmVzcG9uZGluZyBDbGFzc05vZGUgaW5zdGFuY2Ugd2lsbCBiZSByZXR1cm5lZC4gSWYgdGhlCisgICAgICogaXMgbnVsbCBvZiBvZiBsZW5ndGggMCB0aGUgZHluYW1pYyB0eXBlIGlzIHJldHVybmVkCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgb2YgdGhlIGNsYXNzIHRoZSBDbGFzc05vZGUgaXMgcmVwcmVzZW50aW5nCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDbGFzc05vZGUgbWFrZShTdHJpbmcgbmFtZSkgeworICAgICAgICBpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUubGVuZ3RoKCkgPT0gMCkgcmV0dXJuIERZTkFNSUNfVFlQRTsKKyAgICAgICAgCisgICAgICAgIGZvciAoaW50IGk9MDsgaTxwcmltaXRpdmVDbGFzc05hbWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAocHJpbWl0aXZlQ2xhc3NOYW1lc1tpXS5lcXVhbHMobmFtZSkpIHJldHVybiB0eXBlc1tpXTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPGNsYXNzZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyBjbmFtZSA9IGNsYXNzZXNbaV0uZ2V0TmFtZSgpOworICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKGNuYW1lKSkgcmV0dXJuIHR5cGVzW2ldOworICAgICAgICB9ICAgICAgICAKKyAgICAgICAgcmV0dXJuIG1ha2VXaXRob3V0Q2FjaGluZyhuYW1lKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIENsYXNzTm9kZSBjb250YWluaW5nIHRoZSB3cmFwcGVyIG9mIGEgQ2xhc3NOb2RlIAorICAgICAqIG9mIHByaW1pdGl2ZSB0eXBlLiBBbnkgQ2xhc3NOb2RlIHJlcHJlc2VudGluZyBhIHByaW1pdGl2ZQorICAgICAqIHR5cGUgc2hvdWxkIGJlIGNyZWF0ZWQgdXNpbmcgdGhlIHByZWRlZmluZWQgdHlwZXMgdXNlZCBpbgorICAgICAqIGNsYXNzLiBUaGUgbWV0aG9kIHdpbGwgY2hlY2sgdGhlIHBhcmFtZXRlciBmb3Iga25vd24gCisgICAgICogcmVmZXJlbmNlcyBvZiBDbGFzc05vZGUgcmVwcmVzZW50aW5nIGEgcHJpbWl0aXZlIHR5cGUuIElmCisgICAgICogUmVmZXJlbmNlIGlzIGZvdW5kLCB0aGVuIGEgQ2xhc3NOb2RlIHdpbGwgYmUgY29udGFpbmVkIHRoYXQKKyAgICAgKiByZXByZXNlbnRzIHRoZSB3cmFwcGVyIGNsYXNzLiBGb3IgZXhtYXBsZSBmb3IgYm9vbGVhbiwgdGhlIAorICAgICAqIHdyYXBwZXIgY2xhc3MgaXMgamF2YS5sYW5nLkJvb2xlYW4uCisgICAgICogCisgICAgICogSWYgdGhlIHBhcmFtZXRlciBpcyBubyBwcmltaXR2ZSB0eXBlLCB0aGUgcmVkaXJlY3RlZCAKKyAgICAgKiBDbGFzc05vZGUgd2lsbCBiZSByZXR1cm5lZCAKKyAgICAgKiAgIAorICAgICAqIEBzZWUgI21ha2UoQ2xhc3MpCisgICAgICogQHNlZSAjbWFrZShTdHJpbmcpCisgICAgICogQHBhcmFtIGNuIHRoZSBDbGFzc05vZGUgY29udGFpbmluZyBhIHBvc3NpYmxlIHByaW1pdGl2ZSB0eXBlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDbGFzc05vZGUgZ2V0V3JhcHBlcihDbGFzc05vZGUgY24pIHsKKyAgICAgICAgY24gPSBjbi5yZWRpcmVjdCgpOworICAgICAgICBpZiAoIWlzUHJpbWl0aXZlVHlwZShjbikpIHJldHVybiBjbjsKKyAgICAgICAgaWYgKGNuPT1ib29sZWFuX1RZUEUpIHsKKyAgICAgICAgICAgIHJldHVybiBCb29sZWFuX1RZUEU7CisgICAgICAgIH0gZWxzZSBpZiAoY249PWJ5dGVfVFlQRSkgeworICAgICAgICAgICAgcmV0dXJuIEJ5dGVfVFlQRTsKKyAgICAgICAgfSBlbHNlIGlmIChjbj09Y2hhcl9UWVBFKSB7CisgICAgICAgICAgICByZXR1cm4gQ2hhcmFjdGVyX1RZUEU7CisgICAgICAgIH0gZWxzZSBpZiAoY249PXNob3J0X1RZUEUpIHsKKyAgICAgICAgICAgIHJldHVybiBTaG9ydF9UWVBFOworICAgICAgICB9IGVsc2UgaWYgKGNuPT1pbnRfVFlQRSkgeworICAgICAgICAgICAgcmV0dXJuIEludGVnZXJfVFlQRTsKKyAgICAgICAgfSBlbHNlIGlmIChjbj09bG9uZ19UWVBFKSB7CisgICAgICAgICAgICByZXR1cm4gTG9uZ19UWVBFOworICAgICAgICB9IGVsc2UgaWYgKGNuPT1mbG9hdF9UWVBFKSB7CisgICAgICAgICAgICByZXR1cm4gRmxvYXRfVFlQRTsKKyAgICAgICAgfSBlbHNlIGlmIChjbj09ZG91YmxlX1RZUEUpIHsKKyAgICAgICAgICAgIHJldHVybiBEb3VibGVfVFlQRTsKKyAgICAgICAgfSBlbHNlIGlmIChjbj09Vk9JRF9UWVBFKSB7CisgICAgICAgIAlyZXR1cm4gdm9pZF9XUkFQUEVSX1RZUEU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gY247CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGVzdCB0byBkZXRlcm1pbmUgaWYgYSBDbGFzTm9kZSBpcyBhIHByaW1pdHZlIHR5cGUuIAorICAgICAqIE5vdGU6IHRoaXMgb25seSB3b3JrcyBmb3IgQ2xhc3NOb2RlcyBjcmVhdGVkIHVzaW5nIGEKKyAgICAgKiBwcmVkZWZpbmVkIENsYXNzTm9kZQorICAgICAqIAorICAgICAqIEBzZWUgI21ha2UoQ2xhc3MpCisgICAgICogQHNlZSAjbWFrZShTdHJpbmcpCisgICAgICogQHBhcmFtIGNuIHRoZSBDbGFzc05vZGUgY29udGFpbmluZyBhIHBvc3NpYmxlIHByaW1pdGl2ZSB0eXBlCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBDbGFzc05vZGUgaXMgYSBwcmltaXR2ZSB0eXBlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUHJpbWl0aXZlVHlwZShDbGFzc05vZGUgY24pIHsKKyAgICAgICAgcmV0dXJuICBjbiA9PSBib29sZWFuX1RZUEUgfHwKKyAgICAgICAgICAgICAgICBjbiA9PSBjaGFyX1RZUEUgfHwKKyAgICAgICAgICAgICAgICBjbiA9PSBieXRlX1RZUEUgfHwKKyAgICAgICAgICAgICAgICBjbiA9PSBzaG9ydF9UWVBFIHx8CisgICAgICAgICAgICAgICAgY24gPT0gaW50X1RZUEUgfHwKKyAgICAgICAgICAgICAgICBjbiA9PSBsb25nX1RZUEUgfHwKKyAgICAgICAgICAgICAgICBjbiA9PSBmbG9hdF9UWVBFIHx8CisgICAgICAgICAgICAgICAgY24gPT0gZG91YmxlX1RZUEUgfHwKKyAgICAgICAgICAgICAgICBjbiA9PSBWT0lEX1RZUEU7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBDbGFzc05vZGUgbWFrZVJlZmVyZW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIG1ha2UoUmVmZXJlbmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNVbnJlc29sdmVkRW51bShDbGFzc05vZGUgbm9kZSkgeworICAgICAgICBpZiAoRW51bV9UeXBlLmlzUmVzb2x2ZWQoKSkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAobm9kZS5pc1Jlc29sdmVkKCkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgQ2xhc3NOb2RlIHN1cGVyQ2xhc3MgPSBub2RlLmdldFN1cGVyQ2xhc3MoKTsKKyAgICAgICAgaWYgKHN1cGVyQ2xhc3M9PW51bGwpIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHN1cGVyQ2xhc3MucmVkaXJlY3QoKT09RW51bV9UeXBlOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L0NsYXNzTm9kZS5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L0NsYXNzTm9kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZTFlYzAKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvQ2xhc3NOb2RlLmphdmEKQEAgLTAsMCArMSwxMDczIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5hc3Q7CisKK2ltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlPYmplY3Q7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5Lkdyb292eUJ1Z0Vycm9yOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHIuRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByLlR1cGxlRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5zdG10LkJsb2NrU3RhdGVtZW50OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuRW1wdHlTdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3Quc3RtdC5TdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLm9iamVjdHdlYi5hc20uT3Bjb2RlczsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgY2xhc3MgaW4gdGhlIEFTVC48YnIvPgorICogQSBDbGFzc05vZGUgc2hvdWxkIGJlIGNyZWF0ZWQgdXNpbmcgdGhlIG1ldGhvZHMgaW4gQ2xhc3NIZWxwZXIuIAorICogVGhpcyBDbGFzc05vZGUgbWF5IGJlIHVzZWQgdG8gcmVwcmVzZW50IGEgY2xhc3MgZGVjbGFyYXRpb24gb3IKKyAqIGFueSBvdGhlciB0eXBlLiBUaGlzIGNsYXNzIHVzZXMgYSBwcm94eSBtZXNjaGFuaXNtIGFsbG93aW5nIHRvCisgKiBjcmVhdGUgYSBjbGFzcyBmb3IgYSBwbGFpbiBuYW1lIGF0IGFzdCBjcmVhdGlvbiB0aW1lLiBJbiBhbm90aGVyIAorICogcGhhc2Ugb2YgdGhlIGNvbXBpbGVyIHRoZSByZWFsIENsYXNzTm9kZSBmb3IgdGhlIHBsYWluIG5hbWUgbWF5IGJlCisgKiBmb3VuZC4gVG8gYXZvaWQgdGhlIG5lZWQgb2YgZXhjaGFuZ2luZyB0aGlzIENsYXNzTm9kZSB3aXRoIGFuIAorICogaW5zdGFuY2Ugb2YgdGhlIGNvcnJlY3QgQ2xhc3NOb2RlIHRoZSBjb3JyZWN0IENsYXNzTm9kZSBpcyBzZXQgYXMgCisgKiByZWRpcmVjdC4gTW9zdCBtZXRob2QgY2FsbHMgYXJlIHRoZW4gcmVkaXJlY3RlZCB0byB0aGF0IENsYXNzTm9kZS4KKyAqIDxicj4KKyAqIDxiPk5vdGU6PC9iPiB0aGUgcHJveHkgbWVjaGFuaXNtIGlzIG9ubHkgYWxsb3dlZCBmb3IgY2xhc3NlcyBiZWluZyBtYXJrZWQKKyAqIGFzIHByaW1hcnkgQ2xhc3NOb2RlIHdoaWNoIG1lYW5zIHRoZXkgcmVwcmVzZW50IG5vIGFjdHVhbCBjbGFzcy4gCisgKiBUaGUgcmVkaXJlY3QgaXRzZWxmIGNhbiBiZSBhbnkgdHlwZSBvZiBDbGFzc05vZGUKKyAqIDxicj4KKyAqIFRvIGRlc2NpcmJlIGdlbmVyaWMgdHlwZSBzaWduYXR1cmUgc2VlIHtAbGluayAjZ2V0R2VuZXJpY3NUeXBlcygpfSBhbmQKKyAqIHtAbGluayAjc2V0R2VuZXJpY3NUeXBlcyhHZW5lcmljc1R5cGVbXSl9LiBUaGVzZSBlbXRob2RzIGFyZSBub3QgcHJveGllZCwKKyAqIHRoZXkgZGVzY3JpYmUgdGhlIHR5cGUgc2lnbmF0dXJlIHVzZWQgYXQgdGhlIHBvaW50IG9mIGRlY2xhcmF0aW9uIG9yIHRoZQorICogdHlwZSBzaWduYXR1cmVzIHByb3ZpZGVkIGJ5IHRoZSBjbGFzcy4gSWYgdGhlIHR5cGUgc2lnbmF0dXJlcyBwcm92aWRlZAorICogYnkgdGhlIGNsYXNzIGFyZSBuZWVkZWQsIHRoZW4gYSBjYWxsIHRvIHtAbGluayAjcmVkaXJlY3QoKX0gd2lsbCBoZWxwLgorICoKKyAqIEBzZWUgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuQ2xhc3NIZWxwZXIKKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEBhdXRob3IgSm9jaGVuIFRoZW9kb3JvdQorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgQ2xhc3NOb2RlIGV4dGVuZHMgQW5ub3RhdGVkTm9kZSBpbXBsZW1lbnRzIE9wY29kZXMgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTWFwT2ZMaXN0cyB7CisgICAgICAgIHByaXZhdGUgTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIHB1YmxpYyBMaXN0IGdldChPYmplY3Qga2V5KSB7CisgICAgICAgICAgICByZXR1cm4gKExpc3QpIG1hcC5nZXQoa2V5KTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgTGlzdCBnZXROb3ROdWxsKE9iamVjdCBrZXkpIHsKKyAgICAgICAgICAgIExpc3QgcmV0ID0gZ2V0KGtleSk7CisgICAgICAgICAgICBpZiAocmV0PT1udWxsKSByZXQgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdm9pZCBwdXQoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgICAgICBpZiAobWFwLmNvbnRhaW5zS2V5KGtleSkpIHsKKyAgICAgICAgICAgICAgICBnZXQoa2V5KS5hZGQodmFsdWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoMik7CisgICAgICAgICAgICAgICAgbGlzdC5hZGQodmFsdWUpOworICAgICAgICAgICAgICAgIG1hcC5wdXQoa2V5LCBsaXN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAgICAgICAgCisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3NOb2RlW10gRU1QVFlfQVJSQVkgPSBuZXcgQ2xhc3NOb2RlWzBdOworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3NOb2RlIFRISVMgPSBuZXcgQ2xhc3NOb2RlKE9iamVjdC5jbGFzcyk7CisgICAgcHVibGljIHN0YXRpYyBDbGFzc05vZGUgU1VQRVIgPSBuZXcgQ2xhc3NOb2RlKE9iamVjdC5jbGFzcyk7CisgICAgCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKyAgICBwcml2YXRlIGZpbmFsIGludCBtb2RpZmllcnM7CisgICAgcHJpdmF0ZSBDbGFzc05vZGVbXSBpbnRlcmZhY2VzOworICAgIHByaXZhdGUgTWl4aW5Ob2RlW10gbWl4aW5zOworICAgIHByaXZhdGUgTGlzdCBjb25zdHJ1Y3RvcnMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgcHJpdmF0ZSBMaXN0ICBvYmplY3RJbml0aWFsaXplcnMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgcHJpdmF0ZSBNYXBPZkxpc3RzIG1ldGhvZHM7CisgICAgcHJpdmF0ZSBMaXN0IG1ldGhvZHNMaXN0OworICAgIHByaXZhdGUgTGlzdCBmaWVsZHMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgcHJpdmF0ZSBMaXN0IHByb3BlcnRpZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgcHJpdmF0ZSBNYXAgZmllbGRJbmRleCA9IG5ldyBIYXNoTWFwKCk7CisgICAgcHJpdmF0ZSBNb2R1bGVOb2RlIG1vZHVsZTsKKyAgICBwcml2YXRlIENvbXBpbGVVbml0IGNvbXBpbGVVbml0OworICAgIHByaXZhdGUgYm9vbGVhbiBzdGF0aWNDbGFzcyA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBzY3JpcHRCb2R5ID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIHNjcmlwdDsKKyAgICBwcml2YXRlIENsYXNzTm9kZSBzdXBlckNsYXNzOworICAgIGJvb2xlYW4gaXNQcmltYXJ5Tm9kZTsKKyAgICAKKyAgICAvLyB1c2UgdGhpcyB0byBzeW5jaHJvbml6ZSBhY2Nlc3MgZm9yIHRoZSBsYXp5IGludGl0CisgICAgcHJvdGVjdGVkIE9iamVjdCBsYXp5SW5pdExvY2sgPSBuZXcgT2JqZWN0KCk7CisKKyAgICAvLyBjbGF6eiE9bnVsbCB3aGVuIHJlc29sdmVkCisgICAgcHJvdGVjdGVkIENsYXNzIGNsYXp6OworICAgIC8vIG9ubHkgZmFsc2Ugd2hlbiB0aGlzIGNsYXNzTm9kZSBpcyBjb25zdHJ1Y3RlZCBmcm9tIGEgY2xhc3MgCisgICAgcHJpdmF0ZSBib29sZWFuIGxhenlJbml0RG9uZT10cnVlOworICAgIC8vIG5vdCBudWxsIGlmIGlmIHRoZSBDbGFzc05vZGUgaXMgYW4gYXJyYXkgCisgICAgcHJpdmF0ZSBDbGFzc05vZGUgY29tcG9uZW50VHlwZSA9IG51bGw7CisgICAgLy8gaWYgbm90IG51bGwgdGhpcyBpbnN0YW5jZSBpcyBoYW5kbGVkIGFzIHByb3h5IAorICAgIC8vIGZvciB0aGUgcmVkaXJlY3QKKyAgICBwcml2YXRlIENsYXNzTm9kZSByZWRpcmVjdD1udWxsOyAKKyAgICAvLyBmbGFnIGlmIHRoZSBjbGFzc2VzIG9yIGl0cyBtZW1iZXJzIGFyZSBhbm5vdGF0ZWQKKyAgICBwcml2YXRlIGJvb2xlYW4gYW5ub3RhdGVkOworICAgIAorICAgIC8vIHR5cGUgc3BlYyBmb3IgZ2VuZXJpY3MKKyAgICBwcml2YXRlIEdlbmVyaWNzVHlwZVtdIGdlbmVyaWNzVHlwZXM9bnVsbDsKKyAgICBwcml2YXRlIGJvb2xlYW4gdXNlc0dlbmVyaWNzPWZhbHNlOworICAgIAorICAgIC8vIGlmIHNldCB0byB0cnVlIHRoZSBuYW1lIGdldEdlbmVyaWNzVHlwZXMgY29uc2lzdHMKKyAgICAvLyBvZiAxIGVsZW1lbnQgZGVzY3JpYmluZyB0aGUgbmFtZSBvZiB0aGUgcGxhY2Vob2xkZXIKKyAgICBwcml2YXRlIGJvb2xlYW4gcGxhY2Vob2xkZXI7CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgQ2xhc3NOb2RlIHRoaXMgQ2xhc3NOb2RlIGlzIHJlZGlyZWN0aW5nIHRvLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzc05vZGUgcmVkaXJlY3QoKXsKKyAgICAgICAgaWYgKHJlZGlyZWN0PT1udWxsKSByZXR1cm4gdGhpczsKKyAgICAgICAgcmV0dXJuIHJlZGlyZWN0LnJlZGlyZWN0KCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldHMgdGhpcyBpbnN0YW5jZSBhcyBwcm94eSBmb3IgdGhlIGdpdmVuIENsYXNzTm9kZS4gCisgICAgICogQHBhcmFtIGNuIHRoZSBjbGFzcyB0byByZWRpcmVjdCB0by4gSWYgc2V0IHRvIG51bGwgdGhlIHJlZGlyZWN0IHdpbGwgYmUgcmVtb3ZlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlZGlyZWN0KENsYXNzTm9kZSBjbikgeworICAgICAgICBpZiAoaXNQcmltYXJ5Tm9kZSkgdGhyb3cgbmV3IEdyb292eUJ1Z0Vycm9yKCJ0cmllZCB0byBzZXQgYSByZWRpcmVjdCBmb3IgYSBwcmltYXJ5IENsYXNzTm9kZSAoIitnZXROYW1lKCkrIi0+Iitjbi5nZXROYW1lKCkrIikuIik7CisgICAgICAgIGlmIChjbiE9bnVsbCkgY24gPSBjbi5yZWRpcmVjdCgpOworICAgICAgICBpZiAoY249PXRoaXMpIHJldHVybjsKKyAgICAgICAgcmVkaXJlY3QgPSBjbjsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIENsYXNzTm9kZSByZXByZXNlbnRpbmcgYW4gYXJyYXkgb2YgdGhlIGNsYXNzCisgICAgICogcmVwcmVzZW50ZWQgYnkgdGhpcyBDbGFzc05vZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NOb2RlIG1ha2VBcnJheSgpIHsKKyAgICAgICAgaWYgKHJlZGlyZWN0IT1udWxsKSByZXR1cm4gcmVkaXJlY3QoKS5tYWtlQXJyYXkoKTsKKyAgICAgICAgQ2xhc3NOb2RlIGNuOworICAgICAgICBpZiAoY2xhenohPW51bGwpIHsKKyAgICAgICAgICAgIENsYXNzIHJldCA9IEFycmF5Lm5ld0luc3RhbmNlKGNsYXp6LDApLmdldENsYXNzKCk7CisgICAgICAgICAgICAvLyBkb24ndCB1c2UgdGhlIENsYXNzSGVscGVyIGhlcmUhCisgICAgICAgICAgICBjbiA9IG5ldyBDbGFzc05vZGUocmV0LHRoaXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY24gPSBuZXcgQ2xhc3NOb2RlKHRoaXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjbjsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyBpZiB0aGlzIGluc3RhbmNlIGlzIGEgcHJpbWFyeSBDbGFzc05vZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ByaW1hcnlDbGFzc05vZGUoKXsKKyAgICAJcmV0dXJuIHJlZGlyZWN0KCkuaXNQcmltYXJ5Tm9kZSB8fCAoY29tcG9uZW50VHlwZSE9IG51bGwgJiYgY29tcG9uZW50VHlwZS5pc1ByaW1hcnlDbGFzc05vZGUoKSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIHVzZWQgYnkgbWFrZUFycmF5KCkgaWYgbm8gcmVhbCBjbGFzcyBpcyBhdmFpbGFibGUKKyAgICAgKi8KKyAgICBwcml2YXRlIENsYXNzTm9kZShDbGFzc05vZGUgY29tcG9uZW50VHlwZSkgeworICAgICAgICB0aGlzKGNvbXBvbmVudFR5cGUuZ2V0TmFtZSgpKyJbXSIsIEFDQ19QVUJMSUMsIENsYXNzSGVscGVyLk9CSkVDVF9UWVBFKTsKKyAgICAgICAgdGhpcy5jb21wb25lbnRUeXBlID0gY29tcG9uZW50VHlwZS5yZWRpcmVjdCgpOworICAgICAgICBpc1ByaW1hcnlOb2RlPWZhbHNlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciB1c2VkIGJ5IG1ha2VBcnJheSgpIGlmIGEgcmVhbCBjbGFzcyBpcyBhdmFpbGFibGUKKyAgICAgKi8KKyAgICBwcml2YXRlIENsYXNzTm9kZShDbGFzcyBjLCBDbGFzc05vZGUgY29tcG9uZW50VHlwZSkgeworICAgICAgICB0aGlzKGMpOworICAgICAgICB0aGlzLmNvbXBvbmVudFR5cGUgPSBjb21wb25lbnRUeXBlOworICAgICAgICBpc1ByaW1hcnlOb2RlPWZhbHNlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgQ2xhc3NOb2RlIGZyb20gYSByZWFsIGNsYXNzLiBUaGUgcmVzdWx0aW5nIAorICAgICAqIENsYXNzTm9kZSB3aWxsIGJlIG5vIHByaW1hcnkgQ2xhc3NOb2RlLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzc05vZGUoQ2xhc3MgYykgeworICAgICAgICB0aGlzKGMuZ2V0TmFtZSgpLCBjLmdldE1vZGlmaWVycygpLCBudWxsLCBudWxsICxNaXhpbk5vZGUuRU1QVFlfQVJSQVkpOworICAgICAgICBjbGF6ej1jOworICAgICAgICBsYXp5SW5pdERvbmU9ZmFsc2U7CisgICAgICAgIENvbXBpbGVVbml0IGN1ID0gZ2V0Q29tcGlsZVVuaXQoKTsKKyAgICAgICAgaWYgKGN1IT1udWxsKSBjdS5hZGRDbGFzcyh0aGlzKTsKKyAgICAgICAgaXNQcmltYXJ5Tm9kZT1mYWxzZTsKKyAgICB9ICAgIAorICAgIAorICAgIC8qKgorICAgICAqIFRoZSBjb21wbGV0ZSBjbGFzcyBzdHJ1Y3R1cmUgd2lsbCBiZSBpbml0aWFsaXplZCBvbmx5IHdoZW4gcmVhbGx5CisgICAgICogbmVlZGVkIHRvIGF2b2lkIGhhdmluZyB0b28gbXVjaCBvYmplY3RzIGR1cmluZyBjb21waWxhdGlvbgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBsYXp5Q2xhc3NJbml0KCkgeyAgICAgICAKKyAgICAgICAgc3luY2hyb25pemVkIChsYXp5SW5pdExvY2spIHsKKyAgICAgICAgICAgIGlmIChsYXp5SW5pdERvbmUpIHJldHVybjsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgRmllbGRbXSBmaWVsZHMgPSBjbGF6ei5nZXREZWNsYXJlZEZpZWxkcygpOworICAgICAgICAgICAgZm9yIChpbnQgaT0wO2k8ZmllbGRzLmxlbmd0aDtpKyspeworICAgICAgICAgICAgICAgIGFkZEZpZWxkKGZpZWxkc1tpXS5nZXROYW1lKCksZmllbGRzW2ldLmdldE1vZGlmaWVycygpLHRoaXMsbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBNZXRob2RbXSBtZXRob2RzID0gY2xhenouZ2V0RGVjbGFyZWRNZXRob2RzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7aTxtZXRob2RzLmxlbmd0aDtpKyspeworICAgICAgICAgICAgICAgIE1ldGhvZCBtID0gbWV0aG9kc1tpXTsKKyAgICAgICAgICAgICAgICBNZXRob2ROb2RlIG1uID0gbmV3IE1ldGhvZE5vZGUobS5nZXROYW1lKCksIG0uZ2V0TW9kaWZpZXJzKCksIENsYXNzSGVscGVyLm1ha2UobS5nZXRSZXR1cm5UeXBlKCkpLCBjcmVhdGVQYXJhbWV0ZXJzKG0uZ2V0UGFyYW1ldGVyVHlwZXMoKSksIENsYXNzSGVscGVyLm1ha2UobS5nZXRFeGNlcHRpb25UeXBlcygpKSwgbnVsbCk7CisgICAgICAgICAgICAgICAgYWRkTWV0aG9kKG1uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnN0cnVjdG9yW10gY29uc3RydWN0b3JzID0gY2xhenouZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcnMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDtpPGNvbnN0cnVjdG9ycy5sZW5ndGg7aSsrKXsKKyAgICAgICAgICAgICAgICBDb25zdHJ1Y3RvciBjdG9yID0gY29uc3RydWN0b3JzW2ldOworICAgICAgICAgICAgICAgIGFkZENvbnN0cnVjdG9yKGN0b3IuZ2V0TW9kaWZpZXJzKCksY3JlYXRlUGFyYW1ldGVycyhjdG9yLmdldFBhcmFtZXRlclR5cGVzKCkpLENsYXNzSGVscGVyLm1ha2UoY3Rvci5nZXRFeGNlcHRpb25UeXBlcygpKSxudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENsYXNzIHNjID0gY2xhenouZ2V0U3VwZXJjbGFzcygpOworICAgICAgICAgICAgaWYgKHNjIT1udWxsKSBzdXBlckNsYXNzID0gQ2xhc3NIZWxwZXIubWFrZShzYyk7CisgICAgICAgICAgICBidWlsZEludGVyZmFjZVR5cGVzKGNsYXp6KTsgICAgICAgCisgICAgICAgICAgICBsYXp5SW5pdERvbmU9dHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgYnVpbGRJbnRlcmZhY2VUeXBlcyhDbGFzcyBjKSB7CisgICAgICAgIENsYXNzW10gaW50ZXJmYWNlcyA9IGMuZ2V0SW50ZXJmYWNlcygpOworICAgICAgICBDbGFzc05vZGVbXSByZXQgPSBuZXcgQ2xhc3NOb2RlW2ludGVyZmFjZXMubGVuZ3RoXTsKKyAgICAgICAgZm9yIChpbnQgaT0wO2k8aW50ZXJmYWNlcy5sZW5ndGg7aSsrKXsKKyAgICAgICAgICAgIHJldFtpXSA9IENsYXNzSGVscGVyLm1ha2UoaW50ZXJmYWNlc1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5pbnRlcmZhY2VzID0gcmV0OworICAgIH0KKyAgICAKKyAgICAKKyAgICAvLyBhZGRlZCB0byB0cmFjayB0aGUgZW5jbG9zaW5nIG1ldGhvZCBmb3IgbG9jYWwgaW5uZXIgY2xhc3NlcworICAgIHByaXZhdGUgTWV0aG9kTm9kZSBlbmNsb3NpbmdNZXRob2QgPSBudWxsOworCisgICAgcHVibGljIE1ldGhvZE5vZGUgZ2V0RW5jbG9zaW5nTWV0aG9kKCkgeworICAgICAgICByZXR1cm4gcmVkaXJlY3QoKS5lbmNsb3NpbmdNZXRob2Q7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RW5jbG9zaW5nTWV0aG9kKE1ldGhvZE5vZGUgZW5jbG9zaW5nTWV0aG9kKSB7CisgICAgICAgIHJlZGlyZWN0KCkuZW5jbG9zaW5nTWV0aG9kID0gZW5jbG9zaW5nTWV0aG9kOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQHBhcmFtIG5hbWUgICAgICAgaXMgdGhlIGZ1bGwgbmFtZSBvZiB0aGUgY2xhc3MKKyAgICAgKiBAcGFyYW0gbW9kaWZpZXJzICB0aGUgbW9kaWZpZXJzLAorICAgICAqIEBwYXJhbSBzdXBlckNsYXNzIHRoZSBiYXNlIGNsYXNzIG5hbWUgLSB1c2UgImphdmEubGFuZy5PYmplY3QiIGlmIG5vIGRpcmVjdAorICAgICAqICAgICAgICAgICAgICAgICAgIGJhc2UgY2xhc3MKKyAgICAgKiBAc2VlIG9yZy5vYmplY3R3ZWIuYXNtLk9wY29kZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NOb2RlKFN0cmluZyBuYW1lLCBpbnQgbW9kaWZpZXJzLCBDbGFzc05vZGUgc3VwZXJDbGFzcykgeworICAgICAgICB0aGlzKG5hbWUsIG1vZGlmaWVycywgc3VwZXJDbGFzcywgRU1QVFlfQVJSQVksIE1peGluTm9kZS5FTVBUWV9BUlJBWSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIG5hbWUgICAgICAgaXMgdGhlIGZ1bGwgbmFtZSBvZiB0aGUgY2xhc3MKKyAgICAgKiBAcGFyYW0gbW9kaWZpZXJzICB0aGUgbW9kaWZpZXJzLAorICAgICAqIEBwYXJhbSBzdXBlckNsYXNzIHRoZSBiYXNlIGNsYXNzIG5hbWUgLSB1c2UgImphdmEubGFuZy5PYmplY3QiIGlmIG5vIGRpcmVjdAorICAgICAqICAgICAgICAgICAgICAgICAgIGJhc2UgY2xhc3MKKyAgICAgKiBAc2VlIG9yZy5vYmplY3R3ZWIuYXNtLk9wY29kZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NOb2RlKFN0cmluZyBuYW1lLCBpbnQgbW9kaWZpZXJzLCBDbGFzc05vZGUgc3VwZXJDbGFzcywgQ2xhc3NOb2RlW10gaW50ZXJmYWNlcywgTWl4aW5Ob2RlW10gbWl4aW5zKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMubW9kaWZpZXJzID0gbW9kaWZpZXJzOworICAgICAgICB0aGlzLnN1cGVyQ2xhc3MgPSBzdXBlckNsYXNzOworICAgICAgICB0aGlzLmludGVyZmFjZXMgPSBpbnRlcmZhY2VzOworICAgICAgICB0aGlzLm1peGlucyA9IG1peGluczsKKyAgICAgICAgaXNQcmltYXJ5Tm9kZSA9IHRydWU7CisgICAgICAgIGlmIChzdXBlckNsYXNzIT1udWxsKSB7CisgICAgICAgICAgICB1c2VzR2VuZXJpY3MgPSBzdXBlckNsYXNzLmlzVXNpbmdHZW5lcmljcygpOworICAgICAgICB9CisgICAgICAgIGlmICghdXNlc0dlbmVyaWNzICYmIGludGVyZmFjZXMhPW51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJmYWNlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIHVzZXNHZW5lcmljcyA9IHVzZXNHZW5lcmljcyB8fCBpbnRlcmZhY2VzW2ldLmlzVXNpbmdHZW5lcmljcygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRoaXMubWV0aG9kcyA9IG5ldyBNYXBPZkxpc3RzKCk7CisgICAgICAgIHRoaXMubWV0aG9kc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgfQorCisgICAgCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgc3VwZXJjbGFzcyBvZiB0aGlzIENsYXNzTm9kZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN1cGVyQ2xhc3MoQ2xhc3NOb2RlIHN1cGVyQ2xhc3MpIHsKKyAgICAgICAgcmVkaXJlY3QoKS5zdXBlckNsYXNzID0gc3VwZXJDbGFzczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbGlzdCBjb250YWluaW5nIEZpZWxkTm9kZSBvYmplY3RzIGZvcgorICAgICAqIGVhY2ggZmllbGQgaW4gdGhlIGNsYXNzIHJlcHJlc2VudGVkIGJ5IHRoaXMgQ2xhc3NOb2RlCisgICAgICovCisgICAgcHVibGljIExpc3QgZ2V0RmllbGRzKCkgeworICAgICAgICBpZiAoIWxhenlJbml0RG9uZSkgeworICAgICAgICAgICAgbGF6eUNsYXNzSW5pdCgpOworICAgICAgICB9CisgICAgICAgIGlmIChyZWRpcmVjdCE9bnVsbCkgcmV0dXJuIHJlZGlyZWN0KCkuZ2V0RmllbGRzKCk7CisgICAgICAgIHJldHVybiBmaWVsZHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBDbGFzc05vZGVzIHJlcHJlc2VudGluZyB0aGUKKyAgICAgKiBpbnRlcmZhY2VzIHRoZSBjbGFzcyBpbXBsZW1lbnRzCisgICAgICovCisgICAgcHVibGljIENsYXNzTm9kZVtdIGdldEludGVyZmFjZXMoKSB7CisgICAgICAgIGlmICghbGF6eUluaXREb25lKSB7CisgICAgICAgICAgICBsYXp5Q2xhc3NJbml0KCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlZGlyZWN0IT1udWxsKSByZXR1cm4gcmVkaXJlY3QoKS5nZXRJbnRlcmZhY2VzKCk7CisgICAgICAgIHJldHVybiBpbnRlcmZhY2VzOworICAgIH0KKworICAgIHB1YmxpYyBNaXhpbk5vZGVbXSBnZXRNaXhpbnMoKSB7CisgICAgICAgIHJldHVybiByZWRpcmVjdCgpLm1peGluczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbGlzdCBjb250YWluaW5nIE1ldGhvZE5vZGUgb2JqZWN0cyBmb3IKKyAgICAgKiBlYWNoIG1ldGhvZCBpbiB0aGUgY2xhc3MgcmVwcmVzZW50ZWQgYnkgdGhpcyBDbGFzc05vZGUKKyAgICAgKi8gICAgCisgICAgcHVibGljIExpc3QgZ2V0TWV0aG9kcygpIHsKKyAgICAgICAgaWYgKCFsYXp5SW5pdERvbmUpIGxhenlDbGFzc0luaXQoKTsKKyAgICAgICAgaWYgKHJlZGlyZWN0IT1udWxsKSByZXR1cm4gcmVkaXJlY3QoKS5nZXRNZXRob2RzKCk7CisgICAgICAgIHJldHVybiBtZXRob2RzTGlzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbGlzdCBjb250YWluaW5nIE1ldGhvZE5vZGUgb2JqZWN0cyBmb3IKKyAgICAgKiBlYWNoIGFic3RyYWN0IG1ldGhvZCBpbiB0aGUgY2xhc3MgcmVwcmVzZW50ZWQgYnkgCisgICAgICogdGhpcyBDbGFzc05vZGUKKyAgICAgKi8gICAKKyAgICBwdWJsaWMgTGlzdCBnZXRBYnN0cmFjdE1ldGhvZHMoKSB7CisgICAgICAgIAorICAgICAgICBIYXNoU2V0IGFic3RyYWN0Tm9kZXMgPSBuZXcgSGFzaFNldCgpOworICAgICAgICAvLyBsZXQgdXMgY29sbGVjdCB0aGUgYWJzdHJhY3Qgc3VwZXIgY2xhc3NlcyBhbmQgc3RvcCBhdCB0aGUKKyAgICAgICAgLy8gZmlyc3Qgbm9uIGFic3RyYWN0IHN1cGVyIGNsYXNzLiBJZiBzdWNoIGEgY2xhc3Mgc3RpbGwgCisgICAgICAgIC8vIGNvbnRhaW5zIGFic3RyYWN0IG1ldGhvZHMsIHRoZW4gbG9hZGluZyB0aGF0IGNsYXNzIHdpbGwgZmFpbC4KKyAgICAgICAgLy8gTm8gbmVlZCB0byBiZSBleHRyYSBjYXJlZnVsIGhlcmUgZm9yIHRoYXQuCisgICAgICAgIENsYXNzTm9kZSBwYXJlbnQgPSB0aGlzLnJlZGlyZWN0KCk7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGFic3RyYWN0Tm9kZXMuYWRkKHBhcmVudCk7CisgICAgICAgICAgICBDbGFzc05vZGVbXSBpbnRlcmZhY2VzID0gcGFyZW50LmdldEludGVyZmFjZXMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJmYWNlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGFic3RyYWN0Tm9kZXMuYWRkKGludGVyZmFjZXNbaV0ucmVkaXJlY3QoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQuZ2V0U3VwZXJDbGFzcygpLnJlZGlyZWN0KCk7CisgICAgICAgIH0gd2hpbGUgKHBhcmVudCE9bnVsbCAmJiAoKHBhcmVudC5nZXRNb2RpZmllcnMoKSAmIE9wY29kZXMuQUNDX0FCU1RSQUNUKSAhPSAwKSk7CisgICAgICAgIAorICAgICAgICBMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBtZXRoSXQgPSBnZXRBbGxEZWNsYXJlZE1ldGhvZHMoKS5pdGVyYXRvcigpOyBtZXRoSXQuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgTWV0aG9kTm9kZSBtZXRob2QgPSAoTWV0aG9kTm9kZSkgbWV0aEl0Lm5leHQoKTsKKyAgICAgICAgICAgIC8vIGFkZCBvbmx5IGFic3RyYWN0IG1ldGhvZHMgZnJvbSBhYnRyYWN0IGNsYXNzZXMgdGhhdAorICAgICAgICAgICAgLy8gYXJlIG5vdCBvdmVyd3JpdHRlbgorICAgICAgICAgICAgaWYgKCBhYnN0cmFjdE5vZGVzLmNvbnRhaW5zKG1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpLnJlZGlyZWN0KCkpICYmIAorICAgICAgICAgICAgICAgICAobWV0aG9kLmdldE1vZGlmaWVycygpICYgT3Bjb2Rlcy5BQ0NfQUJTVFJBQ1QpICE9IDAKKyAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQobWV0aG9kKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocmVzdWx0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIExpc3QgZ2V0QWxsRGVjbGFyZWRNZXRob2RzKCkgeworICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdChnZXREZWNsYXJlZE1ldGhvZHNNYXAoKS52YWx1ZXMoKSk7CisgICAgfQorCisKKyAgICBwcm90ZWN0ZWQgTWFwIGdldERlY2xhcmVkTWV0aG9kc01hcCgpIHsKKyAgICAgICAgLy8gU3RhcnQgb2ZmIHdpdGggdGhlIG1ldGhvZHMgZnJvbSB0aGUgc3VwZXJjbGFzcy4KKyAgICAgICAgQ2xhc3NOb2RlIHBhcmVudCA9IGdldFN1cGVyQ2xhc3MoKTsKKyAgICAgICAgTWFwIHJlc3VsdCA9IG51bGw7CisgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVzdWx0ID0gcGFyZW50LmdldERlY2xhcmVkTWV0aG9kc01hcCgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGFkZCBpbiB1bmltcGxlbWVudGVkIGFic3RyYWN0IG1ldGhvZHMgZnJvbSB0aGUgaW50ZXJmYWNlcworICAgICAgICBDbGFzc05vZGVbXSBpbnRlcmZhY2VzID0gZ2V0SW50ZXJmYWNlcygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGludGVyZmFjZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIENsYXNzTm9kZSBpZmFjZSA9IGludGVyZmFjZXNbaV07CisgICAgICAgICAgICBNYXAgaWZhY2VNZXRob2RzTWFwID0gaWZhY2UuZ2V0RGVjbGFyZWRNZXRob2RzTWFwKCk7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBpZmFjZU1ldGhvZHNNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIG1ldGhTaWcgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdC5jb250YWluc0tleShtZXRoU2lnKSkgeworICAgICAgICAgICAgICAgICAgICBNZXRob2ROb2RlIG1ldGhOb2RlID0gKE1ldGhvZE5vZGUpIGlmYWNlTWV0aG9kc01hcC5nZXQobWV0aFNpZyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXQobWV0aFNpZywgbWV0aE5vZGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEFuZCBhZGQgaW4gdGhlIG1ldGhvZHMgaW1wbGVtZW50ZWQgaW4gdGhpcyBjbGFzcy4KKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0TWV0aG9kcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgTWV0aG9kTm9kZSBtZXRob2QgPSAoTWV0aG9kTm9kZSkgaXRlci5uZXh0KCk7CisgICAgICAgICAgICBTdHJpbmcgc2lnID0gbWV0aG9kLmdldFR5cGVEZXNjcmlwdG9yKCk7CisgICAgICAgICAgICByZXN1bHQucHV0KHNpZywgbWV0aG9kKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHJlZGlyZWN0KCkubmFtZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIFN0cmluZyBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiByZWRpcmVjdCgpLm5hbWU9bmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldE1vZGlmaWVycygpIHsKKyAgICAgICAgcmV0dXJuIHJlZGlyZWN0KCkubW9kaWZpZXJzOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0IGdldFByb3BlcnRpZXMoKSB7CisgICAgICAgIHJldHVybiByZWRpcmVjdCgpLnByb3BlcnRpZXM7CisgICAgfQorCisgICAgcHVibGljIExpc3QgZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcnMoKSB7CisgICAgICAgIGlmICghbGF6eUluaXREb25lKSB7CisgICAgICAgICAgICBsYXp5Q2xhc3NJbml0KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlZGlyZWN0KCkuY29uc3RydWN0b3JzOworICAgIH0KKworICAgIHB1YmxpYyBNb2R1bGVOb2RlIGdldE1vZHVsZSgpIHsKKyAgICAgICAgcmV0dXJuIHJlZGlyZWN0KCkubW9kdWxlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1vZHVsZShNb2R1bGVOb2RlIG1vZHVsZSkgeworICAgICAgICByZWRpcmVjdCgpLm1vZHVsZSA9IG1vZHVsZTsKKyAgICAgICAgaWYgKG1vZHVsZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZWRpcmVjdCgpLmNvbXBpbGVVbml0ID0gbW9kdWxlLmdldFVuaXQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZEZpZWxkKEZpZWxkTm9kZSBub2RlKSB7CisgICAgICAgIG5vZGUuc2V0RGVjbGFyaW5nQ2xhc3MocmVkaXJlY3QoKSk7CisgICAgICAgIG5vZGUuc2V0T3duZXIocmVkaXJlY3QoKSk7CisgICAgICAgIHJlZGlyZWN0KCkuZmllbGRzLmFkZChub2RlKTsKKyAgICAgICAgcmVkaXJlY3QoKS5maWVsZEluZGV4LnB1dChub2RlLmdldE5hbWUoKSwgbm9kZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkUHJvcGVydHkoUHJvcGVydHlOb2RlIG5vZGUpIHsKKyAgICAgICAgbm9kZS5zZXREZWNsYXJpbmdDbGFzcyhyZWRpcmVjdCgpKTsKKyAgICAgICAgRmllbGROb2RlIGZpZWxkID0gbm9kZS5nZXRGaWVsZCgpOworICAgICAgICBhZGRGaWVsZChmaWVsZCk7CisKKyAgICAgICAgcmVkaXJlY3QoKS5wcm9wZXJ0aWVzLmFkZChub2RlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvcGVydHlOb2RlIGFkZFByb3BlcnR5KFN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGlmaWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzTm9kZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwcmVzc2lvbiBpbml0aWFsVmFsdWVFeHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGVtZW50IGdldHRlckJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGVtZW50IHNldHRlckJsb2NrKSB7CisgICAgCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldFByb3BlcnRpZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIFByb3BlcnR5Tm9kZSBwbiA9IChQcm9wZXJ0eU5vZGUpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgaWYgKHBuLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHJldHVybiBwbjsKKyAgICAgICAgfQorICAgICAgICBQcm9wZXJ0eU5vZGUgbm9kZSA9CisgICAgICAgICAgICAgICAgbmV3IFByb3BlcnR5Tm9kZShuYW1lLCBtb2RpZmllcnMsIHR5cGUsIHJlZGlyZWN0KCksIGluaXRpYWxWYWx1ZUV4cHJlc3Npb24sIGdldHRlckJsb2NrLCBzZXR0ZXJCbG9jayk7CisgICAgICAgIGFkZFByb3BlcnR5KG5vZGUpOworICAgICAgICByZXR1cm4gbm9kZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRDb25zdHJ1Y3RvcihDb25zdHJ1Y3Rvck5vZGUgbm9kZSkgeworICAgICAgICBub2RlLnNldERlY2xhcmluZ0NsYXNzKHRoaXMpOworICAgICAgICByZWRpcmVjdCgpLmNvbnN0cnVjdG9ycy5hZGQobm9kZSk7CisgICAgfQorCisgICAgcHVibGljIENvbnN0cnVjdG9yTm9kZSBhZGRDb25zdHJ1Y3RvcihpbnQgbW9kaWZpZXJzLCBQYXJhbWV0ZXJbXSBwYXJhbWV0ZXJzLCBDbGFzc05vZGVbXSBleGNlcHRpb25zLCBTdGF0ZW1lbnQgY29kZSkgeworICAgICAgICBDb25zdHJ1Y3Rvck5vZGUgbm9kZSA9IG5ldyBDb25zdHJ1Y3Rvck5vZGUobW9kaWZpZXJzLCBwYXJhbWV0ZXJzLCBleGNlcHRpb25zLCBjb2RlKTsKKyAgICAgICAgYWRkQ29uc3RydWN0b3Iobm9kZSk7CisgICAgICAgIHJldHVybiBub2RlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZE1ldGhvZChNZXRob2ROb2RlIG5vZGUpIHsKKyAgICAgICAgbm9kZS5zZXREZWNsYXJpbmdDbGFzcyh0aGlzKTsKKyAgICAgICAgcmVkaXJlY3QoKS5tZXRob2RzTGlzdC5hZGQobm9kZSk7CisgICAgICAgIHJlZGlyZWN0KCkubWV0aG9kcy5wdXQobm9kZS5nZXROYW1lKCksIG5vZGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIElGIGEgbWV0aG9kIHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIHBhcmFtZXRlcnMgaXMgYWxyZWFkeSBkZWZpbmVkIHRoZW4gaXQgaXMgcmV0dXJuZWQKKyAgICAgKiBvdGhlcndpc2UgdGhlIGdpdmVuIG1ldGhvZCBpcyBhZGRlZCB0byB0aGlzIG5vZGUuIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCBmb3IKKyAgICAgKiBkZWZhdWx0IG1ldGhvZCBhZGRpbmcgbGlrZSBnZXRQcm9wZXJ0eSgpIG9yIGludm9rZU1ldGhvZCgpIHdoZXJlIHRoZXJlIG1heSBhbHJlYWR5CisgICAgICogYmUgYSBtZXRob2QgZGVmaW5lZCBpbiBhIGNsYXNzIGFuZCAgc28gdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIHNob3VsZCBub3QgYmUgYWRkZWQKKyAgICAgKiBpZiBhbHJlYWR5IHByZXNlbnQuCisgICAgICovCisgICAgcHVibGljIE1ldGhvZE5vZGUgYWRkTWV0aG9kKFN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kaWZpZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc05vZGUgcmV0dXJuVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyW10gcGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NOb2RlW10gZXhjZXB0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGVtZW50IGNvZGUpIHsKKyAgICAgICAgTWV0aG9kTm9kZSBvdGhlciA9IGdldERlY2xhcmVkTWV0aG9kKG5hbWUsIHBhcmFtZXRlcnMpOworICAgICAgICAvLyBsZXRzIG5vdCBhZGQgZHVwbGljYXRlIG1ldGhvZHMKKyAgICAgICAgaWYgKG90aGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBvdGhlcjsKKyAgICAgICAgfQorICAgICAgICBNZXRob2ROb2RlIG5vZGUgPSBuZXcgTWV0aG9kTm9kZShuYW1lLCBtb2RpZmllcnMsIHJldHVyblR5cGUsIHBhcmFtZXRlcnMsIGV4Y2VwdGlvbnMsIGNvZGUpOworICAgICAgICBhZGRNZXRob2Qobm9kZSk7CisgICAgICAgIHJldHVybiBub2RlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBzeW50aGV0aWMgbWV0aG9kIGFzIHBhcnQgb2YgdGhlIGNvbXBpbGF0aW9uIHByb2Nlc3MKKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0aG9kTm9kZSBhZGRTeW50aGV0aWNNZXRob2QoU3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RpZmllcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzTm9kZSByZXR1cm5UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJbXSBwYXJhbWV0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc05vZGVbXSBleGNlcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZW1lbnQgY29kZSkgeworICAgICAgICBNZXRob2ROb2RlIGFuc3dlciA9IGFkZE1ldGhvZChuYW1lLCBtb2RpZmllcnMsIHJldHVyblR5cGUsIHBhcmFtZXRlcnMsIGV4Y2VwdGlvbnMsIGNvZGUpOworICAgICAgICBhbnN3ZXIuc2V0U3ludGhldGljKHRydWUpOworICAgICAgICByZXR1cm4gYW5zd2VyOworICAgIH0KKworICAgIHB1YmxpYyBGaWVsZE5vZGUgYWRkRmllbGQoU3RyaW5nIG5hbWUsIGludCBtb2RpZmllcnMsIENsYXNzTm9kZSB0eXBlLCBFeHByZXNzaW9uIGluaXRpYWxWYWx1ZSkgeworICAgICAgICBGaWVsZE5vZGUgbm9kZSA9IG5ldyBGaWVsZE5vZGUobmFtZSwgbW9kaWZpZXJzLCB0eXBlLCByZWRpcmVjdCgpLCBpbml0aWFsVmFsdWUpOworICAgICAgICBhZGRGaWVsZChub2RlKTsKKyAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkSW50ZXJmYWNlKENsYXNzTm9kZSB0eXBlKSB7CisgICAgICAgIC8vIGxldHMgY2hlY2sgaWYgaXQgYWxyZWFkeSBpbXBsZW1lbnRzIGFuIGludGVyZmFjZQorICAgICAgICBib29sZWFuIHNraXAgPSBmYWxzZTsKKyAgICAgICAgQ2xhc3NOb2RlW10gaW50ZXJmYWNlcyA9IHJlZGlyZWN0KCkuaW50ZXJmYWNlczsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcmZhY2VzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAodHlwZS5lcXVhbHMoaW50ZXJmYWNlc1tpXSkpIHsKKyAgICAgICAgICAgICAgICBza2lwID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIXNraXApIHsKKyAgICAgICAgICAgIENsYXNzTm9kZVtdIG5ld0ludGVyZmFjZXMgPSBuZXcgQ2xhc3NOb2RlW2ludGVyZmFjZXMubGVuZ3RoICsgMV07CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGludGVyZmFjZXMsIDAsIG5ld0ludGVyZmFjZXMsIDAsIGludGVyZmFjZXMubGVuZ3RoKTsKKyAgICAgICAgICAgIG5ld0ludGVyZmFjZXNbaW50ZXJmYWNlcy5sZW5ndGhdID0gdHlwZTsKKyAgICAgICAgICAgIHJlZGlyZWN0KCkuaW50ZXJmYWNlcyA9IG5ld0ludGVyZmFjZXM7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIGlmIChyZWRpcmVjdCE9bnVsbCkgcmV0dXJuIHJlZGlyZWN0KCkuZXF1YWxzKG8pOworICAgICAgICBDbGFzc05vZGUgY24gPSAoQ2xhc3NOb2RlKSBvOyAgICAgICAgCisgICAgICAgIHJldHVybiAoY24uZ2V0TmFtZSgpLmVxdWFscyhnZXROYW1lKCkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRNaXhpbihNaXhpbk5vZGUgbWl4aW4pIHsKKyAgICAgICAgLy8gbGV0cyBjaGVjayBpZiBpdCBhbHJlYWR5IHVzZXMgYSBtaXhpbgorICAgICAgICBNaXhpbk5vZGVbXSBtaXhpbnMgPSByZWRpcmVjdCgpLm1peGluczsKKyAgICAgICAgYm9vbGVhbiBza2lwID0gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWl4aW5zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAobWl4aW4uZXF1YWxzKG1peGluc1tpXSkpIHsKKyAgICAgICAgICAgICAgICBza2lwID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIXNraXApIHsKKyAgICAgICAgICAgIE1peGluTm9kZVtdIG5ld01peGlucyA9IG5ldyBNaXhpbk5vZGVbbWl4aW5zLmxlbmd0aCArIDFdOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShtaXhpbnMsIDAsIG5ld01peGlucywgMCwgbWl4aW5zLmxlbmd0aCk7CisgICAgICAgICAgICBuZXdNaXhpbnNbbWl4aW5zLmxlbmd0aF0gPSBtaXhpbjsKKyAgICAgICAgICAgIHJlZGlyZWN0KCkubWl4aW5zID0gbmV3TWl4aW5zOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIEZpZWxkTm9kZSBnZXRGaWVsZChTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gKEZpZWxkTm9kZSkgcmVkaXJlY3QoKS5maWVsZEluZGV4LmdldChuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBmaWVsZCBub2RlIG9uIHRoZSBvdXRlciBjbGFzcyBvciBudWxsIGlmIHRoaXMgaXMgbm90IGFuCisgICAgICogICAgICAgICBpbm5lciBjbGFzcworICAgICAqLworICAgIHB1YmxpYyBGaWVsZE5vZGUgZ2V0T3V0ZXJGaWVsZChTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIGF2b2lkIGNhc3RpbmcgdG8gaW5uZXIgY2xhc3MKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NOb2RlIGdldE91dGVyQ2xhc3MoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBhZGRPYmplY3RJbml0aWFsaXplclN0YXRlbWVudHMoU3RhdGVtZW50IHN0YXRlbWVudHMpIHsKKyAgICAgICAgb2JqZWN0SW5pdGlhbGl6ZXJzLmFkZChzdGF0ZW1lbnRzKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIExpc3QgZ2V0T2JqZWN0SW5pdGlhbGl6ZXJTdGF0ZW1lbnRzKCkgeworICAgICAgICByZXR1cm4gb2JqZWN0SW5pdGlhbGl6ZXJzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZFN0YXRpY0luaXRpYWxpemVyU3RhdGVtZW50cyhMaXN0IHN0YXRpY1N0YXRlbWVudHMsIGJvb2xlYW4gZmllbGRJbml0KSB7CisgICAgICAgIE1ldGhvZE5vZGUgbWV0aG9kID0gbnVsbDsKKyAgICAgICAgTGlzdCBkZWNsYXJlZE1ldGhvZHMgPSBnZXREZWNsYXJlZE1ldGhvZHMoIjxjbGluaXQ+Iik7CisgICAgICAgIGlmIChkZWNsYXJlZE1ldGhvZHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBtZXRob2QgPQorICAgICAgICAgICAgICAgICAgICBhZGRNZXRob2QoIjxjbGluaXQ+IiwgQUNDX1NUQVRJQywgQ2xhc3NIZWxwZXIuVk9JRF9UWVBFLCBQYXJhbWV0ZXIuRU1QVFlfQVJSQVksIENsYXNzTm9kZS5FTVBUWV9BUlJBWSwgbmV3IEJsb2NrU3RhdGVtZW50KCkpOworICAgICAgICAgICAgbWV0aG9kLnNldFN5bnRoZXRpYyh0cnVlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG1ldGhvZCA9IChNZXRob2ROb2RlKSBkZWNsYXJlZE1ldGhvZHMuZ2V0KDApOworICAgICAgICB9CisgICAgICAgIEJsb2NrU3RhdGVtZW50IGJsb2NrID0gbnVsbDsKKyAgICAgICAgU3RhdGVtZW50IHN0YXRlbWVudCA9IG1ldGhvZC5nZXRDb2RlKCk7CisgICAgICAgIGlmIChzdGF0ZW1lbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgYmxvY2sgPSBuZXcgQmxvY2tTdGF0ZW1lbnQoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChzdGF0ZW1lbnQgaW5zdGFuY2VvZiBCbG9ja1N0YXRlbWVudCkgeworICAgICAgICAgICAgYmxvY2sgPSAoQmxvY2tTdGF0ZW1lbnQpIHN0YXRlbWVudDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGJsb2NrID0gbmV3IEJsb2NrU3RhdGVtZW50KCk7CisgICAgICAgICAgICBibG9jay5hZGRTdGF0ZW1lbnQoc3RhdGVtZW50KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gd2hpbGUgYW55dGhpbmcgaW5zaWRlIGEgc3RhdGljIGluaXRpYWxpemVyIGJsb2NrIGlzIGFwcGVuZGVkIAorICAgICAgICAvLyB3ZSBkb24ndCB3YW50IHRvIGFwcGVuZCBpbiB0aGUgY2FzZSB3ZSBoYXZlIGEgaW5pdGlhbGl6YXRpb24KKyAgICAgICAgLy8gZXhwcmVzc2lvbiBvZiBhIHN0YXRpYyBmaWVsZC4gSW4gdGhhdCBjYXNlIHdlIHdhbnQgdG8gYWRkCisgICAgICAgIC8vIGJlZm9yZSB0aGUgb3RoZXIgc3RhdGVtZW50cworICAgICAgICBpZiAoIWZpZWxkSW5pdCkgeworICAgICAgICAgICAgYmxvY2suYWRkU3RhdGVtZW50cyhzdGF0aWNTdGF0ZW1lbnRzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExpc3QgYmxvY2tTdGF0ZW1lbnRzID0gYmxvY2suZ2V0U3RhdGVtZW50cygpOworICAgICAgICAgICAgc3RhdGljU3RhdGVtZW50cy5hZGRBbGwoYmxvY2tTdGF0ZW1lbnRzKTsKKyAgICAgICAgICAgIGJsb2NrU3RhdGVtZW50cy5jbGVhcigpOworICAgICAgICAgICAgYmxvY2tTdGF0ZW1lbnRzLmFkZEFsbChzdGF0aWNTdGF0ZW1lbnRzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kcyByZXR1cm5zIGEgbGlzdCBvZiBhbGwgbWV0aG9kcyBvZiB0aGUgZ2l2ZW4gbmFtZQorICAgICAqIGRlZmluZWQgaW4gdGhlIGN1cnJlbnQgY2xhc3MKKyAgICAgKiBAcmV0dXJuIHRoZSBtZXRob2QgbGlzdAorICAgICAqIEBzZWUgI2dldE1ldGhvZHMoU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyBMaXN0IGdldERlY2xhcmVkTWV0aG9kcyhTdHJpbmcgbmFtZSkgeworICAgICAgICBpZiAoIWxhenlJbml0RG9uZSkgbGF6eUNsYXNzSW5pdCgpOworICAgICAgICBpZiAocmVkaXJlY3QhPW51bGwpIHJldHVybiByZWRpcmVjdCgpLmdldERlY2xhcmVkTWV0aG9kcyhuYW1lKTsKKyAgICAgICAgcmV0dXJuIG1ldGhvZHMuZ2V0Tm90TnVsbChuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZHMgY3JlYXRlcyBhIGxpc3Qgb2YgYWxsIG1ldGhvZHMgd2l0aCB0aGlzIG5hbWUgb2YgdGhlCisgICAgICogY3VycmVudCBjbGFzcyBhbmQgb2YgYWxsIHN1cGVyIGNsYXNzZXMKKyAgICAgKiBAcmV0dXJuIHRoZSBtZXRob2RzIGxpc3QKKyAgICAgKiBAc2VlICNnZXREZWNsYXJlZE1ldGhvZHMoU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyBMaXN0IGdldE1ldGhvZHMoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgTGlzdCBhbnN3ZXIgPSBuZXcgQXJyYXlMaXN0KGdldERlY2xhcmVkTWV0aG9kcyhuYW1lKSk7CisgICAgICAgIENsYXNzTm9kZSBwYXJlbnQgPSBnZXRTdXBlckNsYXNzKCk7CisgICAgICAgIGlmIChwYXJlbnQhPW51bGwpIGFuc3dlci5hZGRBbGwocGFyZW50LmdldE1ldGhvZHMobmFtZSkpOworICAgICAgICByZXR1cm4gYW5zd2VyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIG1ldGhvZCBtYXRjaGluZyB0aGUgZ2l2ZW4gbmFtZSBhbmQgcGFyYW1ldGVycyBvciBudWxsCisgICAgICovCisgICAgcHVibGljIE1ldGhvZE5vZGUgZ2V0RGVjbGFyZWRNZXRob2QoU3RyaW5nIG5hbWUsIFBhcmFtZXRlcltdIHBhcmFtZXRlcnMpIHsKKyAgICAgICAgTGlzdCBsaXN0ID0gZ2V0RGVjbGFyZWRNZXRob2RzKG5hbWUpOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgTWV0aG9kTm9kZSBtZXRob2QgPSAoTWV0aG9kTm9kZSkgaXRlci5uZXh0KCk7CisgICAgICAgICAgICBpZiAocGFyYW1ldGVyc0VxdWFsKG1ldGhvZC5nZXRQYXJhbWV0ZXJzKCksIHBhcmFtZXRlcnMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBub2RlIGlzIGRlcml2ZWQgZnJvbSB0aGUgZ2l2ZW4gY2xhc3Mgbm9kZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRGVyaXZlZEZyb20oQ2xhc3NOb2RlIHR5cGUpIHsKKyAgICAgICAgaWYgKHR5cGUuZXF1YWxzKENsYXNzSGVscGVyLk9CSkVDVF9UWVBFKSkgcmV0dXJuIHRydWU7CisgICAgICAgIENsYXNzTm9kZSBub2RlID0gdGhpczsKKyAgICAgICAgd2hpbGUgKG5vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHR5cGUuZXF1YWxzKG5vZGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub2RlID0gbm9kZS5nZXRTdXBlckNsYXNzKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGNsYXNzIGlzIGRlcml2ZWQgZnJvbSBhIGdyb292eSBvYmplY3QKKyAgICAgKiAgICAgICAgIGkuZS4gaXQgaW1wbGVtZW50cyBHcm9vdnlPYmplY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Rlcml2ZWRGcm9tR3Jvb3Z5T2JqZWN0KCkgeworICAgICAgICByZXR1cm4gaW1wbGVtZW50c0ludGVyZmFjZShHcm9vdnlPYmplY3QuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGludGVyZmFjZQorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGNsYXNzIG9yIGFueSBiYXNlIGNsYXNzIGltcGxlbWVudHMgdGhlIGdpdmVuIGludGVyZmFjZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGltcGxlbWVudHNJbnRlcmZhY2UoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgQ2xhc3NOb2RlIG5vZGUgPSByZWRpcmVjdCgpOworICAgICAgICBkbyB7CisgICAgICAgICAgICBpZiAobm9kZS5kZWNsYXJlc0ludGVyZmFjZShuYW1lKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbm9kZSA9IG5vZGUuZ2V0U3VwZXJDbGFzcygpOworICAgICAgICB9CisgICAgICAgIHdoaWxlIChub2RlICE9IG51bGwpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBpbnRlcmZhY2UKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBjbGFzcyBkZWNsYXJlcyB0aGF0IGl0IGltcGxlbWVudHMgdGhlIGdpdmVuIGludGVyZmFjZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGRlY2xhcmVzSW50ZXJmYWNlKFN0cmluZyBuYW1lKSB7CisgICAgICAgIENsYXNzTm9kZVtdIGludGVyZmFjZXMgPSByZWRpcmVjdCgpLmdldEludGVyZmFjZXMoKTsKKyAgICAgICAgaW50IHNpemUgPSBpbnRlcmZhY2VzLmxlbmd0aDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChpbnRlcmZhY2VzW2ldLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgQ2xhc3NOb2RlIG9mIHRoZSBzdXBlciBjbGFzcyBvZiB0aGlzIHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NOb2RlIGdldFN1cGVyQ2xhc3MoKSB7CisgICAgICAgIGlmICghbGF6eUluaXREb25lICYmICFpc1Jlc29sdmVkKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBHcm9vdnlCdWdFcnJvcigiQ2xhc3Nub2RlI2dldFN1cGVyQ2xhc3MgZm9yICIrZ2V0TmFtZSgpKyIgY2FsbGVkIGJlZm9yZSBjbGFzcyByZXNvbHZpbmciKTsKKyAgICAgICAgfQorICAgICAgICBDbGFzc05vZGUgc24gPSByZWRpcmVjdCgpLmdldFVucmVzb2x2ZWRTdXBlckNsYXNzKCk7CisgICAgICAgIGlmIChzbiE9bnVsbCkgc249c24ucmVkaXJlY3QoKTsKKyAgICAgICAgcmV0dXJuIHNuOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgQ2xhc3NOb2RlIGdldFVucmVzb2x2ZWRTdXBlckNsYXNzKCkgeworICAgICAgICByZXR1cm4gZ2V0VW5yZXNvbHZlZFN1cGVyQ2xhc3ModHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIENsYXNzTm9kZSBnZXRVbnJlc29sdmVkU3VwZXJDbGFzcyhib29sZWFuIHVzZVJlZGlyZWN0KSB7CisgICAgICAgIGlmICghdXNlUmVkaXJlY3QpIHJldHVybiBzdXBlckNsYXNzOworICAgICAgICBpZiAoIWxhenlJbml0RG9uZSkgeworICAgICAgICAgICAgbGF6eUNsYXNzSW5pdCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZWRpcmVjdCgpLnN1cGVyQ2xhc3M7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBNZXRob2ROb2RlIHZpYSByZWZsZWN0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIE1ldGhvZE5vZGUgY3JlYXRlTWV0aG9kTm9kZShNZXRob2QgbWV0aG9kKSB7CisgICAgICAgIFBhcmFtZXRlcltdIHBhcmFtZXRlcnMgPSBjcmVhdGVQYXJhbWV0ZXJzKG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpKTsKKyAgICAgICAgcmV0dXJuIG5ldyBNZXRob2ROb2RlKG1ldGhvZC5nZXROYW1lKCksIG1ldGhvZC5nZXRNb2RpZmllcnMoKSwgQ2xhc3NIZWxwZXIubWFrZShtZXRob2QuZ2V0UmV0dXJuVHlwZSgpKSwgcGFyYW1ldGVycywgQ2xhc3NIZWxwZXIubWFrZShtZXRob2QuZ2V0RXhjZXB0aW9uVHlwZXMoKSksIEVtcHR5U3RhdGVtZW50LklOU1RBTkNFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gdHlwZXMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUGFyYW1ldGVyW10gY3JlYXRlUGFyYW1ldGVycyhDbGFzc1tdIHR5cGVzKSB7CisgICAgICAgIFBhcmFtZXRlcltdIHBhcmFtZXRlcnMgPSBQYXJhbWV0ZXIuRU1QVFlfQVJSQVk7CisgICAgICAgIGludCBzaXplID0gdHlwZXMubGVuZ3RoOworICAgICAgICBpZiAoc2l6ZSA+IDApIHsKKyAgICAgICAgICAgIHBhcmFtZXRlcnMgPSBuZXcgUGFyYW1ldGVyW3NpemVdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzW2ldID0gY3JlYXRlUGFyYW1ldGVyKHR5cGVzW2ldLCBpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGFyYW1ldGVyczsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgUGFyYW1ldGVyIGNyZWF0ZVBhcmFtZXRlcihDbGFzcyBwYXJhbWV0ZXJUeXBlLCBpbnQgaWR4KSB7CisgICAgICAgIHJldHVybiBuZXcgUGFyYW1ldGVyKENsYXNzSGVscGVyLm1ha2UocGFyYW1ldGVyVHlwZSksICJwYXJhbSIgKyBpZHgpOworICAgIH0KKworICAgIHB1YmxpYyBDb21waWxlVW5pdCBnZXRDb21waWxlVW5pdCgpIHsKKyAgICAgICAgaWYgKHJlZGlyZWN0IT1udWxsKSByZXR1cm4gcmVkaXJlY3QoKS5nZXRDb21waWxlVW5pdCgpOworICAgICAgICBpZiAoY29tcGlsZVVuaXQgPT0gbnVsbCAmJiBtb2R1bGUgIT0gbnVsbCkgeworICAgICAgICAgICAgY29tcGlsZVVuaXQgPSBtb2R1bGUuZ2V0VW5pdCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjb21waWxlVW5pdDsKKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0Q29tcGlsZVVuaXQoQ29tcGlsZVVuaXQgY3UpIHsKKyAgICAgICAgaWYgKHJlZGlyZWN0IT1udWxsKSByZWRpcmVjdCgpLnNldENvbXBpbGVVbml0KGN1KTsKKyAgICAgICAgaWYgKGNvbXBpbGVVbml0IT0gbnVsbCkgY29tcGlsZVVuaXQgPSBjdTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHR3byBhcnJheXMgYXJlIG9mIHRoZSBzYW1lIHNpemUgYW5kIGhhdmUgdGhlIHNhbWUgY29udGVudHMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwYXJhbWV0ZXJzRXF1YWwoUGFyYW1ldGVyW10gYSwgUGFyYW1ldGVyW10gYikgeworICAgICAgICBpZiAoYS5sZW5ndGggPT0gYi5sZW5ndGgpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gYW5zd2VyID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICghYVtpXS5nZXRUeXBlKCkuZXF1YWxzKGJbaV0uZ2V0VHlwZSgpKSkgeworICAgICAgICAgICAgICAgICAgICBhbnN3ZXIgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGFuc3dlcjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgcGFja2FnZSBuYW1lIG9mIHRoaXMgY2xhc3MKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgeworICAgICAgICBpbnQgaWR4ID0gZ2V0TmFtZSgpLmxhc3RJbmRleE9mKCcuJyk7CisgICAgICAgIGlmIChpZHggPiAwKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0TmFtZSgpLnN1YnN0cmluZygwLCBpZHgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZVdpdGhvdXRQYWNrYWdlKCkgeworICAgICAgICBpbnQgaWR4ID0gZ2V0TmFtZSgpLmxhc3RJbmRleE9mKCcuJyk7CisgICAgICAgIGlmIChpZHggPiAwKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0TmFtZSgpLnN1YnN0cmluZyhpZHggKyAxKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZ2V0TmFtZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0Q29udGVudHMoR3Jvb3Z5Q2xhc3NWaXNpdG9yIHZpc2l0b3IpIHsKKyAgICAgICAgCisgICAgICAgIC8vIG5vdyBsZXRzIHZpc2l0IHRoZSBjb250ZW50cyBvZiB0aGUgY2xhc3MKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0UHJvcGVydGllcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgUHJvcGVydHlOb2RlIHBuID0gKFByb3BlcnR5Tm9kZSkgaXRlci5uZXh0KCk7CisgICAgICAgICAgICB2aXNpdG9yLnZpc2l0UHJvcGVydHkocG4pOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0RmllbGRzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBGaWVsZE5vZGUgZm4gPSAoRmllbGROb2RlKSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIHZpc2l0b3IudmlzaXRGaWVsZChmbik7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXREZWNsYXJlZENvbnN0cnVjdG9ycygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgQ29uc3RydWN0b3JOb2RlIGNuID0gKENvbnN0cnVjdG9yTm9kZSkgaXRlci5uZXh0KCk7CisgICAgICAgICAgICB2aXNpdG9yLnZpc2l0Q29uc3RydWN0b3IoY24pOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0TWV0aG9kcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgTWV0aG9kTm9kZSBtbiA9IChNZXRob2ROb2RlKSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIHZpc2l0b3IudmlzaXRNZXRob2QobW4pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIE1ldGhvZE5vZGUgZ2V0R2V0dGVyTWV0aG9kKFN0cmluZyBnZXR0ZXJOYW1lKSB7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGdldERlY2xhcmVkTWV0aG9kcyhnZXR0ZXJOYW1lKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIE1ldGhvZE5vZGUgbWV0aG9kID0gKE1ldGhvZE5vZGUpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgaWYgKGdldHRlck5hbWUuZXF1YWxzKG1ldGhvZC5nZXROYW1lKCkpCisgICAgICAgICAgICAgICAgICAgICYmIENsYXNzSGVscGVyLlZPSURfVFlQRSE9bWV0aG9kLmdldFJldHVyblR5cGUoKQorICAgICAgICAgICAgICAgICAgICAmJiBtZXRob2QuZ2V0UGFyYW1ldGVycygpLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBDbGFzc05vZGUgcGFyZW50ID0gZ2V0U3VwZXJDbGFzcygpOyAKKyAgICAgICAgaWYgKHBhcmVudCE9bnVsbCkgcmV0dXJuIHBhcmVudC5nZXRHZXR0ZXJNZXRob2QoZ2V0dGVyTmFtZSk7IAorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgTWV0aG9kTm9kZSBnZXRTZXR0ZXJNZXRob2QoU3RyaW5nIHNldHRlck5hbWUpIHsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0RGVjbGFyZWRNZXRob2RzKHNldHRlck5hbWUpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgTWV0aG9kTm9kZSBtZXRob2QgPSAoTWV0aG9kTm9kZSkgaXRlci5uZXh0KCk7CisgICAgICAgICAgICBpZiAoc2V0dGVyTmFtZS5lcXVhbHMobWV0aG9kLmdldE5hbWUoKSkKKyAgICAgICAgICAgICAgICAgICAgJiYgQ2xhc3NIZWxwZXIuVk9JRF9UWVBFPT1tZXRob2QuZ2V0UmV0dXJuVHlwZSgpCisgICAgICAgICAgICAgICAgICAgICYmIG1ldGhvZC5nZXRQYXJhbWV0ZXJzKCkubGVuZ3RoID09IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbWV0aG9kOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIENsYXNzTm9kZSBwYXJlbnQgPSBnZXRTdXBlckNsYXNzKCk7IAorICAgICAgICBpZiAocGFyZW50IT1udWxsKSByZXR1cm4gcGFyZW50LmdldFNldHRlck1ldGhvZChzZXR0ZXJOYW1lKTsgCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIElzIHRoaXMgY2xhc3MgZGVsY2FyZWQgaW4gYSBzdGF0aWMgbWV0aG9kIChzdWNoIGFzIGEgY2xvc3VyZSAvIGlubmVyIGNsYXNzIGRlY2xhcmVkIGluIGEgc3RhdGljIG1ldGhvZCkKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YXRpY0NsYXNzKCkgeworICAgICAgICByZXR1cm4gcmVkaXJlY3QoKS5zdGF0aWNDbGFzczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdGF0aWNDbGFzcyhib29sZWFuIHN0YXRpY0NsYXNzKSB7CisgICAgICAgIHJlZGlyZWN0KCkuc3RhdGljQ2xhc3MgPSBzdGF0aWNDbGFzczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlubmVyIGNsYXNzIG9yIGNsb3N1cmUgd2FzIGRlY2xhcmVkIGluc2lkZSBhIHNjcmlwdCBib2R5CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTY3JpcHRCb2R5KCkgeworICAgICAgICByZXR1cm4gcmVkaXJlY3QoKS5zY3JpcHRCb2R5OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNjcmlwdEJvZHkoYm9vbGVhbiBzY3JpcHRCb2R5KSB7CisgICAgICAgIHJlZGlyZWN0KCkuc2NyaXB0Qm9keSA9IHNjcmlwdEJvZHk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNTY3JpcHQoKSB7CisgICAgICAgIHJldHVybiByZWRpcmVjdCgpLnNjcmlwdCB8fCBpc0Rlcml2ZWRGcm9tKENsYXNzSGVscGVyLlNDUklQVF9UWVBFKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTY3JpcHQoYm9vbGVhbiBzY3JpcHQpIHsKKyAgICAgICAgcmVkaXJlY3QoKS5zY3JpcHQgPSBzY3JpcHQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nIHJldCA9IGdldE5hbWUoKTsgCisgICAgICAgIGlmIChnZW5lcmljc1R5cGVzIT1udWxsKSB7CisgICAgICAgICAgICByZXQgKz0gIiA8IjsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ2VuZXJpY3NUeXBlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChpIT0wKSByZXQrPSIsICI7CisgICAgICAgICAgICAgICAgcmV0ICs9IGdlbmVyaWNzVHlwZXNbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXQgKz0gIj4iOworICAgICAgICB9CisgICAgICAgIGlmIChyZWRpcmVjdCE9bnVsbCkgeworICAgICAgICAgICAgcmV0ICs9ICIgLT4gIityZWRpcmVjdCgpLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIG1ldGhvZCBoYXMgYSBwb3NzaWJseSBtYXRjaGluZyBtZXRob2Qgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgYXJndW1lbnRzCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzUG9zc2libGVNZXRob2QoU3RyaW5nIG5hbWUsIEV4cHJlc3Npb24gYXJndW1lbnRzKSB7CisgICAgICAgIGludCBjb3VudCA9IDA7CisKKyAgICAgICAgaWYgKGFyZ3VtZW50cyBpbnN0YW5jZW9mIFR1cGxlRXhwcmVzc2lvbikgeworICAgICAgICAgICAgVHVwbGVFeHByZXNzaW9uIHR1cGxlID0gKFR1cGxlRXhwcmVzc2lvbikgYXJndW1lbnRzOworICAgICAgICAgICAgLy8gVE9ETyB0aGlzIHdvbid0IHN0cmljdGx5IGJlIHRydWUgd2hlbiB1c2luZyBsaXN0IGV4cGFuc2lvbiBpbiBhcmd1bWVudCBjYWxscworICAgICAgICAgICAgY291bnQgPSB0dXBsZS5nZXRFeHByZXNzaW9ucygpLnNpemUoKTsKKyAgICAgICAgfQorICAgICAgICBDbGFzc05vZGUgbm9kZSA9IHRoaXM7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGdldERlY2xhcmVkTWV0aG9kcyhuYW1lKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBNZXRob2ROb2RlIG1ldGhvZCA9IChNZXRob2ROb2RlKSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAobWV0aG9kLmdldFBhcmFtZXRlcnMoKS5sZW5ndGggPT0gY291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbm9kZSA9IG5vZGUuZ2V0U3VwZXJDbGFzcygpOworICAgICAgICB9CisgICAgICAgIHdoaWxlIChub2RlICE9IG51bGwpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gbWV0aG9kIGhhcyBhIHBvc3NpYmx5IG1hdGNoaW5nIHN0YXRpYyBtZXRob2Qgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgYXJndW1lbnRzCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzUG9zc2libGVTdGF0aWNNZXRob2QoU3RyaW5nIG5hbWUsIEV4cHJlc3Npb24gYXJndW1lbnRzKSB7CisgICAgICAgIGludCBjb3VudCA9IDA7CisKKyAgICAgICAgaWYgKGFyZ3VtZW50cyBpbnN0YW5jZW9mIFR1cGxlRXhwcmVzc2lvbikgeworICAgICAgICAgICAgVHVwbGVFeHByZXNzaW9uIHR1cGxlID0gKFR1cGxlRXhwcmVzc2lvbikgYXJndW1lbnRzOworICAgICAgICAgICAgLy8gVE9ETyB0aGlzIHdvbid0IHN0cmljdGx5IGJlIHRydWUgd2hlbiB1c2luZyBsaXN0IGV4cGFuc2lvbiBpbiBhcmd1bWVudCBjYWxscworICAgICAgICAgICAgY291bnQgPSB0dXBsZS5nZXRFeHByZXNzaW9ucygpLnNpemUoKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXREZWNsYXJlZE1ldGhvZHMobmFtZSkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBNZXRob2ROb2RlIG1ldGhvZCA9IChNZXRob2ROb2RlKSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChtZXRob2QuZ2V0UGFyYW1ldGVycygpLmxlbmd0aCA9PSBjb3VudCAmJiBtZXRob2QuaXNTdGF0aWMoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gaGFuZGxlIHZhcmFyZ3MgY2FzZQorICAgICAgICAgICAgaWYgKG1ldGhvZC5pc1N0YXRpYygpICYmIG1ldGhvZC5nZXRQYXJhbWV0ZXJzKCkubGVuZ3RoID4gMCAmJgorICAgICAgICAgICAgICAgIG1ldGhvZC5nZXRQYXJhbWV0ZXJzKClbbWV0aG9kLmdldFBhcmFtZXRlcnMoKS5sZW5ndGggLSAxXS5nZXRUeXBlKCkuaXNBcnJheSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGNvdW50ID49IG1ldGhvZC5nZXRQYXJhbWV0ZXJzKCkubGVuZ3RoIC0gMSkgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzSW50ZXJmYWNlKCl7CisgICAgICAgIHJldHVybiAoZ2V0TW9kaWZpZXJzKCkgJiBPcGNvZGVzLkFDQ19JTlRFUkZBQ0UpID4gMDsgCisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGlzUmVzb2x2ZWQoKXsKKyAgICAgICAgcmV0dXJuIHJlZGlyZWN0KCkuY2xhenohPW51bGwgfHwgKGNvbXBvbmVudFR5cGUgIT0gbnVsbCAmJiBjb21wb25lbnRUeXBlLmlzUmVzb2x2ZWQoKSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGlzQXJyYXkoKXsKKyAgICAgICAgcmV0dXJuIGNvbXBvbmVudFR5cGUhPW51bGw7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBDbGFzc05vZGUgZ2V0Q29tcG9uZW50VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIGNvbXBvbmVudFR5cGU7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBDbGFzcyBnZXRUeXBlQ2xhc3MoKXsKKyAgICAgICAgQ2xhc3MgYyA9IHJlZGlyZWN0KCkuY2xheno7CisgICAgICAgIGlmIChjIT1udWxsKSByZXR1cm4gYzsKKyAgICAgICAgQ2xhc3NOb2RlIGNvbXBvbmVudCA9IHJlZGlyZWN0KCkuY29tcG9uZW50VHlwZTsKKyAgICAgICAgaWYgKGNvbXBvbmVudCE9bnVsbCAmJiBjb21wb25lbnQuaXNSZXNvbHZlZCgpKXsKKyAgICAgICAgICAgIENsYXNzTm9kZSBjbiA9IGNvbXBvbmVudC5tYWtlQXJyYXkoKTsKKyAgICAgICAgICAgIHNldFJlZGlyZWN0KGNuKTsKKyAgICAgICAgICAgIHJldHVybiByZWRpcmVjdCgpLmNsYXp6OworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBHcm9vdnlCdWdFcnJvcigiQ2xhc3NOb2RlI2dldFR5cGVDbGFzcyBmb3IgIitnZXROYW1lKCkrIiBpcyBjYWxsZWQgYmVmb3JlIHRoZSB0eXBlIGNsYXNzIGlzIHNldCAiKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gaGFzUGFja2FnZU5hbWUoKXsKKyAgICAgICAgcmV0dXJuIHJlZGlyZWN0KCkubmFtZS5pbmRleE9mKCcuJyk+MDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYXJrcyBpZiB0aGUgY3VycmVudCBjbGFzcyB1c2VzIGFubm90YXRpb25zIG9yIG5vdAorICAgICAqIEBwYXJhbSBmbGFnCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QW5ub3RhdGVkKGJvb2xlYW4gZmxhZykgeworICAgICAgICB0aGlzLmFubm90YXRlZCA9IGZsYWc7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGlzQW5ub3RhdGVkKCkgeworICAgICAgICByZXR1cm4gdGhpcy5hbm5vdGF0ZWQ7CisgICAgfQorCisgICAgcHVibGljIEdlbmVyaWNzVHlwZVtdIGdldEdlbmVyaWNzVHlwZXMoKSB7CisgICAgICAgIHJldHVybiBnZW5lcmljc1R5cGVzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyaWNzVHlwZXMoR2VuZXJpY3NUeXBlW10gZ2VuZXJpY3NUeXBlcykgeworICAgICAgICB1c2VzR2VuZXJpY3MgPSB1c2VzR2VuZXJpY3MgfHwgZ2VuZXJpY3NUeXBlcyE9bnVsbDsKKyAgICAgICAgdGhpcy5nZW5lcmljc1R5cGVzID0gZ2VuZXJpY3NUeXBlczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmljc1BsYWNlSG9sZGVyKGJvb2xlYW4gYikgeworICAgICAgICB1c2VzR2VuZXJpY3MgPSB1c2VzR2VuZXJpY3MgfHwgYjsKKyAgICAgICAgcGxhY2Vob2xkZXIgPSBiOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0dlbmVyaWNzUGxhY2VIb2xkZXIoKSB7CisgICAgICAgIHJldHVybiBwbGFjZWhvbGRlcjsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gaXNVc2luZ0dlbmVyaWNzKCkgeworICAgICAgICByZXR1cm4gdXNlc0dlbmVyaWNzOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRVc2luZ0dlbmVyaWNzKGJvb2xlYW4gYikgeworICAgICAgICB1c2VzR2VuZXJpY3MgPSBiOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgQ2xhc3NOb2RlIGdldFBsYWluTm9kZVJlZmVyZW5jZSgpIHsKKyAgICAgICAgQ2xhc3NOb2RlIG4gPSBuZXcgQ2xhc3NOb2RlKGdldE5hbWUoKSxnZXRNb2RpZmllcnMoKSxnZXRTdXBlckNsYXNzKCksbnVsbCxudWxsKTsKKyAgICAgICAgbi5pc1ByaW1hcnlOb2RlID0gZmFsc2U7CisgICAgICAgIG4uc2V0UmVkaXJlY3QodGhpcy5yZWRpcmVjdCk7CisgICAgICAgIHJldHVybiBuOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9Db2RlVmlzaXRvclN1cHBvcnQuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9Db2RlVmlzaXRvclN1cHBvcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDU3MDEzCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L0NvZGVWaXNpdG9yU3VwcG9ydC5qYXZhCkBAIC0wLDAgKzEsMjk2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5hc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByLio7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3Quc3RtdC5Bc3NlcnRTdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3Quc3RtdC5CbG9ja1N0YXRlbWVudDsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5zdG10LkJyZWFrU3RhdGVtZW50OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuQ2FzZVN0YXRlbWVudDsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5zdG10LkNhdGNoU3RhdGVtZW50OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuQ29udGludWVTdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3Quc3RtdC5Eb1doaWxlU3RhdGVtZW50OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuRXhwcmVzc2lvblN0YXRlbWVudDsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5zdG10LkZvclN0YXRlbWVudDsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5zdG10LklmU3RhdGVtZW50OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuUmV0dXJuU3RhdGVtZW50OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuU3RhdGVtZW50OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuU3dpdGNoU3RhdGVtZW50OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuU3luY2hyb25pemVkU3RhdGVtZW50OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuVGhyb3dTdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3Quc3RtdC5UcnlDYXRjaFN0YXRlbWVudDsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5zdG10LldoaWxlU3RhdGVtZW50OworCisvKioKKyAqIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGFueSBHcm9vdnlDb2RlVmlzaXRvcnkgd2hpY2ggYnkgZGVmYXVsdAorICoganVzdCB3YWxrcyB0aGUgY29kZSBhbmQgZXhwcmVzc2lvbiB0cmVlCisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb2RlVmlzaXRvclN1cHBvcnQgaW1wbGVtZW50cyBHcm9vdnlDb2RlVmlzaXRvciB7CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEJsb2NrU3RhdGVtZW50KEJsb2NrU3RhdGVtZW50IGJsb2NrKSB7CisgICAgICAgIExpc3Qgc3RhdGVtZW50cyA9IGJsb2NrLmdldFN0YXRlbWVudHMoKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gc3RhdGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKSB7CisgICAgICAgICAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gKFN0YXRlbWVudCkgaXRlci5uZXh0KCk7CisgICAgICAgICAgICBzdGF0ZW1lbnQudmlzaXQodGhpcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEZvckxvb3AoRm9yU3RhdGVtZW50IGZvckxvb3ApIHsKKyAgICAgICAgZm9yTG9vcC5nZXRDb2xsZWN0aW9uRXhwcmVzc2lvbigpLnZpc2l0KHRoaXMpOworICAgICAgICBmb3JMb29wLmdldExvb3BCbG9jaygpLnZpc2l0KHRoaXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0V2hpbGVMb29wKFdoaWxlU3RhdGVtZW50IGxvb3ApIHsKKyAgICAgICAgbG9vcC5nZXRCb29sZWFuRXhwcmVzc2lvbigpLnZpc2l0KHRoaXMpOworICAgICAgICBsb29wLmdldExvb3BCbG9jaygpLnZpc2l0KHRoaXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0RG9XaGlsZUxvb3AoRG9XaGlsZVN0YXRlbWVudCBsb29wKSB7CisgICAgICAgIGxvb3AuZ2V0TG9vcEJsb2NrKCkudmlzaXQodGhpcyk7CisgICAgICAgIGxvb3AuZ2V0Qm9vbGVhbkV4cHJlc3Npb24oKS52aXNpdCh0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdElmRWxzZShJZlN0YXRlbWVudCBpZkVsc2UpIHsKKyAgICAgICAgaWZFbHNlLmdldEJvb2xlYW5FeHByZXNzaW9uKCkudmlzaXQodGhpcyk7CisgICAgICAgIGlmRWxzZS5nZXRJZkJsb2NrKCkudmlzaXQodGhpcyk7CisgICAgICAgIGlmRWxzZS5nZXRFbHNlQmxvY2soKS52aXNpdCh0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEV4cHJlc3Npb25TdGF0ZW1lbnQoRXhwcmVzc2lvblN0YXRlbWVudCBzdGF0ZW1lbnQpIHsKKyAgICAgICAgc3RhdGVtZW50LmdldEV4cHJlc3Npb24oKS52aXNpdCh0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFJldHVyblN0YXRlbWVudChSZXR1cm5TdGF0ZW1lbnQgc3RhdGVtZW50KSB7CisgICAgICAgIHN0YXRlbWVudC5nZXRFeHByZXNzaW9uKCkudmlzaXQodGhpcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRBc3NlcnRTdGF0ZW1lbnQoQXNzZXJ0U3RhdGVtZW50IHN0YXRlbWVudCkgeworICAgICAgICBzdGF0ZW1lbnQuZ2V0Qm9vbGVhbkV4cHJlc3Npb24oKS52aXNpdCh0aGlzKTsKKyAgICAgICAgc3RhdGVtZW50LmdldE1lc3NhZ2VFeHByZXNzaW9uKCkudmlzaXQodGhpcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRUcnlDYXRjaEZpbmFsbHkoVHJ5Q2F0Y2hTdGF0ZW1lbnQgc3RhdGVtZW50KSB7CisgICAgICAgIHN0YXRlbWVudC5nZXRUcnlTdGF0ZW1lbnQoKS52aXNpdCh0aGlzKTsKKyAgICAgICAgTGlzdCBsaXN0ID0gc3RhdGVtZW50LmdldENhdGNoU3RhdGVtZW50cygpOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApIHsKKyAgICAgICAgICAgIENhdGNoU3RhdGVtZW50IGNhdGNoU3RhdGVtZW50ID0gKENhdGNoU3RhdGVtZW50KSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIGNhdGNoU3RhdGVtZW50LnZpc2l0KHRoaXMpOworICAgICAgICB9CisgICAgICAgIHN0YXRlbWVudC5nZXRGaW5hbGx5U3RhdGVtZW50KCkudmlzaXQodGhpcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRTd2l0Y2goU3dpdGNoU3RhdGVtZW50IHN0YXRlbWVudCkgeworICAgICAgICBzdGF0ZW1lbnQuZ2V0RXhwcmVzc2lvbigpLnZpc2l0KHRoaXMpOworICAgICAgICBMaXN0IGxpc3QgPSBzdGF0ZW1lbnQuZ2V0Q2FzZVN0YXRlbWVudHMoKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKSB7CisgICAgICAgICAgICBDYXNlU3RhdGVtZW50IGNhc2VTdGF0ZW1lbnQgPSAoQ2FzZVN0YXRlbWVudCkgaXRlci5uZXh0KCk7CisgICAgICAgICAgICBjYXNlU3RhdGVtZW50LnZpc2l0KHRoaXMpOworICAgICAgICB9CisgICAgICAgIHN0YXRlbWVudC5nZXREZWZhdWx0U3RhdGVtZW50KCkudmlzaXQodGhpcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRDYXNlU3RhdGVtZW50KENhc2VTdGF0ZW1lbnQgc3RhdGVtZW50KSB7CisgICAgICAgIHN0YXRlbWVudC5nZXRFeHByZXNzaW9uKCkudmlzaXQodGhpcyk7CisgICAgICAgIHN0YXRlbWVudC5nZXRDb2RlKCkudmlzaXQodGhpcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRCcmVha1N0YXRlbWVudChCcmVha1N0YXRlbWVudCBzdGF0ZW1lbnQpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdENvbnRpbnVlU3RhdGVtZW50KENvbnRpbnVlU3RhdGVtZW50IHN0YXRlbWVudCkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0U3luY2hyb25pemVkU3RhdGVtZW50KFN5bmNocm9uaXplZFN0YXRlbWVudCBzdGF0ZW1lbnQpIHsKKyAgICAgICAgc3RhdGVtZW50LmdldEV4cHJlc3Npb24oKS52aXNpdCh0aGlzKTsKKyAgICAgICAgc3RhdGVtZW50LmdldENvZGUoKS52aXNpdCh0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFRocm93U3RhdGVtZW50KFRocm93U3RhdGVtZW50IHN0YXRlbWVudCkgeworICAgICAgICBzdGF0ZW1lbnQuZ2V0RXhwcmVzc2lvbigpLnZpc2l0KHRoaXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0TWV0aG9kQ2FsbEV4cHJlc3Npb24oTWV0aG9kQ2FsbEV4cHJlc3Npb24gY2FsbCkgeworICAgICAgICBjYWxsLmdldE9iamVjdEV4cHJlc3Npb24oKS52aXNpdCh0aGlzKTsKKyAgICAgICAgY2FsbC5nZXRNZXRob2QoKS52aXNpdCh0aGlzKTsKKyAgICAgICAgY2FsbC5nZXRBcmd1bWVudHMoKS52aXNpdCh0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFN0YXRpY01ldGhvZENhbGxFeHByZXNzaW9uKFN0YXRpY01ldGhvZENhbGxFeHByZXNzaW9uIGNhbGwpIHsKKyAgICAgICAgY2FsbC5nZXRBcmd1bWVudHMoKS52aXNpdCh0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdENvbnN0cnVjdG9yQ2FsbEV4cHJlc3Npb24oQ29uc3RydWN0b3JDYWxsRXhwcmVzc2lvbiBjYWxsKSB7CisgICAgICAgIGNhbGwuZ2V0QXJndW1lbnRzKCkudmlzaXQodGhpcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRCaW5hcnlFeHByZXNzaW9uKEJpbmFyeUV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgICAgICBleHByZXNzaW9uLmdldExlZnRFeHByZXNzaW9uKCkudmlzaXQodGhpcyk7CisgICAgICAgIGV4cHJlc3Npb24uZ2V0UmlnaHRFeHByZXNzaW9uKCkudmlzaXQodGhpcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRUZXJuYXJ5RXhwcmVzc2lvbihUZXJuYXJ5RXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisgICAgICAgIGV4cHJlc3Npb24uZ2V0Qm9vbGVhbkV4cHJlc3Npb24oKS52aXNpdCh0aGlzKTsKKyAgICAgICAgZXhwcmVzc2lvbi5nZXRUcnVlRXhwcmVzc2lvbigpLnZpc2l0KHRoaXMpOworICAgICAgICBleHByZXNzaW9uLmdldEZhbHNlRXhwcmVzc2lvbigpLnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFNob3J0VGVybmFyeUV4cHJlc3Npb24oRWx2aXNPcGVyYXRvckV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgICAgICB2aXNpdFRlcm5hcnlFeHByZXNzaW9uKGV4cHJlc3Npb24pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0UG9zdGZpeEV4cHJlc3Npb24oUG9zdGZpeEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgICAgICBleHByZXNzaW9uLmdldEV4cHJlc3Npb24oKS52aXNpdCh0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFByZWZpeEV4cHJlc3Npb24oUHJlZml4RXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisgICAgICAgIGV4cHJlc3Npb24uZ2V0RXhwcmVzc2lvbigpLnZpc2l0KHRoaXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0Qm9vbGVhbkV4cHJlc3Npb24oQm9vbGVhbkV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworCQlleHByZXNzaW9uLmdldEV4cHJlc3Npb24oKS52aXNpdCh0aGlzKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB2aXNpdE5vdEV4cHJlc3Npb24oTm90RXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisJCWV4cHJlc3Npb24uZ2V0RXhwcmVzc2lvbigpLnZpc2l0KHRoaXMpOworCX0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0Q2xvc3VyZUV4cHJlc3Npb24oQ2xvc3VyZUV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgICAgICBleHByZXNzaW9uLmdldENvZGUoKS52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdmlzaXRUdXBsZUV4cHJlc3Npb24oVHVwbGVFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKyAgICAgICAgdmlzaXRMaXN0T2ZFeHByZXNzaW9ucyhleHByZXNzaW9uLmdldEV4cHJlc3Npb25zKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0TGlzdEV4cHJlc3Npb24oTGlzdEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgICAgICB2aXNpdExpc3RPZkV4cHJlc3Npb25zKGV4cHJlc3Npb24uZ2V0RXhwcmVzc2lvbnMoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRBcnJheUV4cHJlc3Npb24oQXJyYXlFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKyAgICAgICAgdmlzaXRMaXN0T2ZFeHByZXNzaW9ucyhleHByZXNzaW9uLmdldEV4cHJlc3Npb25zKCkpOworICAgICAgICB2aXNpdExpc3RPZkV4cHJlc3Npb25zKGV4cHJlc3Npb24uZ2V0U2l6ZUV4cHJlc3Npb24oKSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHZpc2l0TWFwRXhwcmVzc2lvbihNYXBFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKyAgICAgICAgdmlzaXRMaXN0T2ZFeHByZXNzaW9ucyhleHByZXNzaW9uLmdldE1hcEVudHJ5RXhwcmVzc2lvbnMoKSk7CisgICAgICAgIAorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0TWFwRW50cnlFeHByZXNzaW9uKE1hcEVudHJ5RXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisgICAgICAgIGV4cHJlc3Npb24uZ2V0S2V5RXhwcmVzc2lvbigpLnZpc2l0KHRoaXMpOworICAgICAgICBleHByZXNzaW9uLmdldFZhbHVlRXhwcmVzc2lvbigpLnZpc2l0KHRoaXMpOworICAgICAgICAKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFJhbmdlRXhwcmVzc2lvbihSYW5nZUV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgICAgICBleHByZXNzaW9uLmdldEZyb20oKS52aXNpdCh0aGlzKTsKKyAgICAgICAgZXhwcmVzc2lvbi5nZXRUbygpLnZpc2l0KHRoaXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0U3ByZWFkRXhwcmVzc2lvbihTcHJlYWRFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKyAgICAgICAgZXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uKCkudmlzaXQodGhpcyk7CisgICAgfQorIAorICAgIHB1YmxpYyB2b2lkIHZpc2l0U3ByZWFkTWFwRXhwcmVzc2lvbihTcHJlYWRNYXBFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKyAgICAgICAgZXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uKCkudmlzaXQodGhpcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRNZXRob2RQb2ludGVyRXhwcmVzc2lvbihNZXRob2RQb2ludGVyRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisgICAgICAgIGV4cHJlc3Npb24uZ2V0RXhwcmVzc2lvbigpLnZpc2l0KHRoaXMpOworICAgICAgICBleHByZXNzaW9uLmdldE1ldGhvZE5hbWUoKS52aXNpdCh0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFVuYXJ5TWludXNFeHByZXNzaW9uKFVuYXJ5TWludXNFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKyAgICAgICAgZXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uKCkudmlzaXQodGhpcyk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHZpc2l0VW5hcnlQbHVzRXhwcmVzc2lvbihVbmFyeVBsdXNFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKyAgICAgICAgZXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uKCkudmlzaXQodGhpcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRCaXR3aXNlTmVnYXRpb25FeHByZXNzaW9uKEJpdHdpc2VOZWdhdGlvbkV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgICAgICBleHByZXNzaW9uLmdldEV4cHJlc3Npb24oKS52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdmlzaXRDYXN0RXhwcmVzc2lvbihDYXN0RXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisgICAgICAgIGV4cHJlc3Npb24uZ2V0RXhwcmVzc2lvbigpLnZpc2l0KHRoaXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0Q29uc3RhbnRFeHByZXNzaW9uKENvbnN0YW50RXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRDbGFzc0V4cHJlc3Npb24oQ2xhc3NFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFZhcmlhYmxlRXhwcmVzc2lvbihWYXJpYWJsZUV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0RGVjbGFyYXRpb25FeHByZXNzaW9uKERlY2xhcmF0aW9uRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisgICAgICAgIHZpc2l0QmluYXJ5RXhwcmVzc2lvbihleHByZXNzaW9uKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdmlzaXRQcm9wZXJ0eUV4cHJlc3Npb24oUHJvcGVydHlFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKyAgICAJZXhwcmVzc2lvbi5nZXRPYmplY3RFeHByZXNzaW9uKCkudmlzaXQodGhpcyk7CisgICAgCWV4cHJlc3Npb24uZ2V0UHJvcGVydHkoKS52aXNpdCh0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZUV4cHJlc3Npb24oQXR0cmlidXRlRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisgICAgCWV4cHJlc3Npb24uZ2V0T2JqZWN0RXhwcmVzc2lvbigpLnZpc2l0KHRoaXMpOworICAgIAlleHByZXNzaW9uLmdldFByb3BlcnR5KCkudmlzaXQodGhpcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRGaWVsZEV4cHJlc3Npb24oRmllbGRFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFJlZ2V4RXhwcmVzc2lvbihSZWdleEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0R1N0cmluZ0V4cHJlc3Npb24oR1N0cmluZ0V4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgICAgICB2aXNpdExpc3RPZkV4cHJlc3Npb25zKGV4cHJlc3Npb24uZ2V0U3RyaW5ncygpKTsKKyAgICAgICAgdmlzaXRMaXN0T2ZFeHByZXNzaW9ucyhleHByZXNzaW9uLmdldFZhbHVlcygpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB2aXNpdExpc3RPZkV4cHJlc3Npb25zKExpc3QgbGlzdCkgeworICAgICAgICBpZiAobGlzdD09bnVsbCkgcmV0dXJuOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApIHsKKyAgICAgICAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IChFeHByZXNzaW9uKSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgU3ByZWFkRXhwcmVzc2lvbikgeworICAgICAgICAgICAgICAgIEV4cHJlc3Npb24gc3ByZWFkID0gKChTcHJlYWRFeHByZXNzaW9uKSBleHByZXNzaW9uKS5nZXRFeHByZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgc3ByZWFkLnZpc2l0KHRoaXMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBleHByZXNzaW9uLnZpc2l0KHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHZpc2l0Q2F0Y2hTdGF0ZW1lbnQoQ2F0Y2hTdGF0ZW1lbnQgc3RhdGVtZW50KSB7CisgICAgCXN0YXRlbWVudC5nZXRDb2RlKCkudmlzaXQodGhpcyk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHZpc2l0QXJndW1lbnRsaXN0RXhwcmVzc2lvbihBcmd1bWVudExpc3RFeHByZXNzaW9uIGFsZSkgeworICAgIAl2aXNpdFR1cGxlRXhwcmVzc2lvbihhbGUpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB2aXNpdENsb3N1cmVMaXN0RXhwcmVzc2lvbihDbG9zdXJlTGlzdEV4cHJlc3Npb24gY2xlKSB7CisgICAgICAgIHZpc2l0TGlzdE9mRXhwcmVzc2lvbnMoY2xlLmdldEV4cHJlc3Npb25zKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9Db21waWxlVW5pdC5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L0NvbXBpbGVVbml0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc0Mzk3YQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9Db21waWxlVW5pdC5qYXZhCkBAIC0wLDAgKzEsMTc1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5hc3Q7CisKK2ltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlDbGFzc0xvYWRlcjsKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuQ29kZVNvdXJjZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLkNvbXBpbGVyQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuU291cmNlVW5pdDsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wubWVzc2FnZXMuU3ludGF4RXJyb3JNZXNzYWdlOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LlN5bnRheEV4Y2VwdGlvbjsKKworLyoqCisgKiBSZXByZXNlbnRzIHRoZSBlbnRpcmUgY29udGVudHMgb2YgYSBjb21waWxhdGlvbiBzdGVwIHdoaWNoIGNvbnNpc3RzIG9mIG9uZQorICogb3IgbW9yZSB7QGxpbmsgTW9kdWxlTm9kZX1pbnN0YW5jZXMKKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbiA8L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBDb21waWxlVW5pdCB7CisKKyAgICBwcml2YXRlIGZpbmFsIExpc3QgbW9kdWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICBwcml2YXRlIE1hcCBjbGFzc2VzID0gbmV3IEhhc2hNYXAoKTsKKyAgICBwcml2YXRlIENvbXBpbGVyQ29uZmlndXJhdGlvbiBjb25maWc7CisgICAgcHJpdmF0ZSBHcm9vdnlDbGFzc0xvYWRlciBjbGFzc0xvYWRlcjsKKyAgICBwcml2YXRlIENvZGVTb3VyY2UgY29kZVNvdXJjZTsKKyAgICBwcml2YXRlIE1hcCBjbGFzc2VzVG9Db21waWxlID0gbmV3IEhhc2hNYXAoKTsKKyAgICBwcml2YXRlIE1hcCBjbGFzc05hbWVUb1NvdXJjZSA9IG5ldyBIYXNoTWFwKCk7CisgICAgCisgICAgcHVibGljIENvbXBpbGVVbml0KEdyb292eUNsYXNzTG9hZGVyIGNsYXNzTG9hZGVyLCBDb21waWxlckNvbmZpZ3VyYXRpb24gY29uZmlnKSB7CisgICAgCXRoaXMoY2xhc3NMb2FkZXIsIG51bGwsIGNvbmZpZyk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBDb21waWxlVW5pdChHcm9vdnlDbGFzc0xvYWRlciBjbGFzc0xvYWRlciwgQ29kZVNvdXJjZSBjb2RlU291cmNlLCBDb21waWxlckNvbmZpZ3VyYXRpb24gY29uZmlnKSB7CisgICAgICAgIHRoaXMuY2xhc3NMb2FkZXIgPSBjbGFzc0xvYWRlcjsKKyAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7CisgICAgICAgIHRoaXMuY29kZVNvdXJjZSA9IGNvZGVTb3VyY2U7CisgICAgfQorCisgICAgcHVibGljIExpc3QgZ2V0TW9kdWxlcygpIHsKKyAgICAgICAgcmV0dXJuIG1vZHVsZXM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkTW9kdWxlKE1vZHVsZU5vZGUgbm9kZSkgeworICAgICAgICAvLyBub2RlPT1udWxsIG1lYW5zIGEgY29tcGlsYXRpb24gZXJyb3IgcHJldmVudGVkCisgICAgICAgIC8vIGdyb292eSBmcm9tIGJ1aWxkaW5nIGFuIGFzdAorICAgICAgICBpZiAobm9kZT09bnVsbCkgcmV0dXJuOworICAgICAgICBtb2R1bGVzLmFkZChub2RlKTsKKyAgICAgICAgbm9kZS5zZXRVbml0KHRoaXMpOworICAgICAgICBhZGRDbGFzc2VzKG5vZGUuZ2V0Q2xhc3NlcygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBDbGFzc05vZGUgZm9yIHRoZSBnaXZlbiBxdWFsaWZpZWQgbmFtZSBvciByZXR1cm5zIG51bGwgaWYKKyAgICAgKiAgICAgICAgIHRoZSBuYW1lIGRvZXMgbm90IGV4aXN0IGluIHRoZSBjdXJyZW50IGNvbXBpbGF0aW9uIHVuaXQKKyAgICAgKiAgICAgICAgIChpZ25vcmluZyB0aGUgLmNsYXNzIGZpbGVzIG9uIHRoZSBjbGFzc3BhdGgpCisgICAgICovCisgICAgcHVibGljIENsYXNzTm9kZSBnZXRDbGFzcyhTdHJpbmcgbmFtZSkgeworICAgICAgICBDbGFzc05vZGUgY24gPSAoQ2xhc3NOb2RlKSBjbGFzc2VzLmdldChuYW1lKTsKKyAgICAgICAgaWYgKGNuIT1udWxsKSByZXR1cm4gY247CisgICAgICAgIHJldHVybiAoQ2xhc3NOb2RlKSBjbGFzc2VzVG9Db21waWxlLmdldChuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBhbGwgdGhlIGNsYXNzZXMgaW4gZWFjaCBtb2R1bGUgaW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdCBnZXRDbGFzc2VzKCkgeworICAgICAgICBMaXN0IGFuc3dlciA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gbW9kdWxlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIE1vZHVsZU5vZGUgbW9kdWxlID0gKE1vZHVsZU5vZGUpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgYW5zd2VyLmFkZEFsbChtb2R1bGUuZ2V0Q2xhc3NlcygpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYW5zd2VyOworICAgIH0KKworICAgIHB1YmxpYyBDb21waWxlckNvbmZpZ3VyYXRpb24gZ2V0Q29uZmlnKCkgeworICAgICAgICByZXR1cm4gY29uZmlnOworICAgIH0KKworICAgIHB1YmxpYyBHcm9vdnlDbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlcigpIHsKKyAgICAgICAgcmV0dXJuIGNsYXNzTG9hZGVyOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgQ29kZVNvdXJjZSBnZXRDb2RlU291cmNlKCkgeworICAgIAlyZXR1cm4gY29kZVNvdXJjZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmRzIGFsbCBvZiB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWVzIGluIHRoaXMKKyAgICAgKiBtb2R1bGUgaW50byB0aGUgZ2l2ZW4gbWFwCisgICAgICovCisgICAgdm9pZCBhZGRDbGFzc2VzKExpc3QgY2xhc3NMaXN0KSB7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGNsYXNzTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIGFkZENsYXNzKChDbGFzc05vZGUpIGl0ZXIubmV4dCgpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiAgQWRkcyBhIGNsYXNzIHRvIHRoZSB1bml0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENsYXNzKENsYXNzTm9kZSBub2RlKSB7CisgICAgCW5vZGUgPSBub2RlLnJlZGlyZWN0KCk7CisgICAgICAgIFN0cmluZyBuYW1lID0gbm9kZS5nZXROYW1lKCk7CisgICAgICAgIENsYXNzTm9kZSBzdG9yZWQgPSAoQ2xhc3NOb2RlKSBjbGFzc2VzLmdldChuYW1lKTsKKyAgICAgICAgaWYgKHN0b3JlZCAhPSBudWxsICYmIHN0b3JlZCAhPSBub2RlKSB7CisgICAgICAgICAgICAvLyB3ZSBoYXZlIGEgZHVwbGljYXRlIGNsYXNzIQorICAgICAgICAgICAgLy8gT25lIHBvc3NpYmlsaXR5IGZvciB0aGlzIGlzLCB0aGF0IHdlIGRlbGNhcmVkIGEgc2NyaXB0IGFuZCBhIAorICAgICAgICAgICAgLy8gY2xhc3MgaW4gdGhlIHNhbWUgZmlsZSBhbmQgbmFtZWQgdGhlIGNsYXNzIGxpa2UgdGhlIGZpbGUKKyAgICAgICAgICAgIFNvdXJjZVVuaXQgbm9kZVNvdXJjZSA9IG5vZGUuZ2V0TW9kdWxlKCkuZ2V0Q29udGV4dCgpOworICAgICAgICAgICAgU291cmNlVW5pdCBzdG9yZWRTb3VyY2UgPSBzdG9yZWQuZ2V0TW9kdWxlKCkuZ2V0Q29udGV4dCgpOworICAgICAgICAgICAgU3RyaW5nIHR4dCA9ICJJbnZhbGlkIGR1cGxpY2F0ZSBjbGFzcyBkZWZpbml0aW9uIG9mIGNsYXNzICIrbm9kZS5nZXROYW1lKCkrIiA6ICI7CisgICAgICAgICAgICBpZiAobm9kZVNvdXJjZT09c3RvcmVkU291cmNlKSB7CisgICAgICAgICAgICAgICAgLy8gc2FtZSBjbGFzcyBpbiBzYW1lIHNvdXJjZQorICAgICAgICAgICAgICAgIHR4dCArPSAiVGhlIHNvdXJjZSAiK25vZGVTb3VyY2UuZ2V0TmFtZSgpKyIgY29udGFpbnMgYXQgbGFzdCB0d28gZGVmaW50aW9ucyBvZiB0aGUgY2xhc3MgIitub2RlLmdldE5hbWUoKSsiLlxuIjsKKyAgICAgICAgICAgICAgICBpZiAobm9kZS5pc1NjcmlwdEJvZHkoKSB8fCBzdG9yZWQuaXNTY3JpcHRCb2R5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdHh0ICs9ICJPbmUgb2YgdGhlIGNsYXNzZXMgaXMgYSBleHBsaWNpdCBnZW5lcmF0ZWQgY2xhc3MgdXNpbmcgdGhlIGNsYXNzIHN0YXRlbWVudCwgdGhlIG90aGVyIGlzIGEgY2xhc3MgZ2VuZXJhdGVkIGZyb20iKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB0aGUgc2NyaXB0IGJvZHkgYmFzZWQgb24gdGhlIGZpbGUgbmFtZS4gU29sdXRpb25zIGFyZSB0byBjaGFuZ2UgdGhlIGZpbGUgbmFtZSBvciB0byBjaGFuZ2UgdGhlIGNsYXNzIG5hbWUuXG4iOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdHh0ICs9ICJUaGUgc291cmNlcyAiK25vZGVTb3VyY2UuZ2V0TmFtZSgpKyIgYW5kICIrc3RvcmVkU291cmNlLmdldE5hbWUoKSsiIGFyZSBjb250YWluaW5nIGJvdGggYSBjbGFzcyBvZiB0aGUgbmFtZSAiK25vZGUuZ2V0TmFtZSgpKyIuXG4iOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbm9kZVNvdXJjZS5nZXRFcnJvckNvbGxlY3RvcigpLmFkZEVycm9yQW5kQ29udGludWUoCisgICAgICAgICAgICAgICAgICAgIG5ldyBTeW50YXhFcnJvck1lc3NhZ2UobmV3IFN5bnRheEV4Y2VwdGlvbih0eHQsIG5vZGUuZ2V0TGluZU51bWJlcigpLCBub2RlLmdldENvbHVtbk51bWJlcigpKSwgbm9kZVNvdXJjZSkKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICAgICAgY2xhc3Nlcy5wdXQobmFtZSwgbm9kZSk7CisgICAgICAgIAorICAgICAgICBpZiAoY2xhc3Nlc1RvQ29tcGlsZS5jb250YWluc0tleShuYW1lKSkgeworICAgICAgICAgICAgQ2xhc3NOb2RlIGNuID0gKENsYXNzTm9kZSkgY2xhc3Nlc1RvQ29tcGlsZS5nZXQobmFtZSk7CisgICAgICAgICAgICBjbi5zZXRSZWRpcmVjdChub2RlKTsKKyAgICAgICAgICAgIGNsYXNzZXNUb0NvbXBpbGUucmVtb3ZlKG5hbWUpOworICAgICAgICB9ICAgICAgICAKKyAgICB9CisgICAgIAorICAgIC8qKgorICAgICAqIHRoaXMgZW10aG9kIGFjdHVhbGx5IGRvZXMgbm90IGNvbXBpbGUgYSBjbGFzcy4gSXQncyBvbmx5CisgICAgICogYSBtYXJrZXIgdGhhdCB0aGlzIHR5cGUgaGFzIHRvIGJlIGNvbXBpbGVkIGJ5IHRoZSBDb21waWxhdGlvblVuaXQKKyAgICAgKiBhdCB0aGUgZW5kIG9mIGEgcGFyc2Ugc3RlcCBubyBub2RlIHNob3VsZCBiZSBiZSBsZWZ0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENsYXNzTm9kZVRvQ29tcGlsZShDbGFzc05vZGUgbm9kZSwgU291cmNlVW5pdCBsb2NhdGlvbikgeworICAgICAgICBjbGFzc2VzVG9Db21waWxlLnB1dChub2RlLmdldE5hbWUoKSxub2RlKTsKKyAgICAgICAgY2xhc3NOYW1lVG9Tb3VyY2UucHV0KG5vZGUuZ2V0TmFtZSgpLGxvY2F0aW9uKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIFNvdXJjZVVuaXQgZ2V0U2NyaXB0U291cmNlTG9jYXRpb24oU3RyaW5nIGNsYXNzTmFtZSkgeworICAgICAgICByZXR1cm4gKFNvdXJjZVVuaXQpIGNsYXNzTmFtZVRvU291cmNlLmdldChjbGFzc05hbWUpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc0NsYXNzTm9kZVRvQ29tcGlsZSgpeworICAgICAgICByZXR1cm4gIWNsYXNzZXNUb0NvbXBpbGUuaXNFbXB0eSgpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0ZUNsYXNzTm9kZVRvQ29tcGlsZSgpeworICAgICAgICByZXR1cm4gY2xhc3Nlc1RvQ29tcGlsZS5rZXlTZXQoKS5pdGVyYXRvcigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9Db25zdHJ1Y3Rvck5vZGUuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9Db25zdHJ1Y3Rvck5vZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODYxYjYxCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L0NvbnN0cnVjdG9yTm9kZS5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdDsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHIuQ29uc3RydWN0b3JDYWxsRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByLkV4cHJlc3Npb247CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3Quc3RtdC5FeHByZXNzaW9uU3RhdGVtZW50OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuU3RhdGVtZW50OworCisKKy8qKgorICogUmVwcmVzZW50cyBhIGNvbnN0cnVjdG9yIGRlY2xhcmF0aW9uCisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBDb25zdHJ1Y3Rvck5vZGUgZXh0ZW5kcyBNZXRob2ROb2RlIHsKKyAgICAKKyAgICBwdWJsaWMgQ29uc3RydWN0b3JOb2RlKGludCBtb2RpZmllcnMsIFN0YXRlbWVudCBjb2RlKSB7CisgICAgICAgIHRoaXMobW9kaWZpZXJzLCBQYXJhbWV0ZXIuRU1QVFlfQVJSQVksIENsYXNzTm9kZS5FTVBUWV9BUlJBWSwgY29kZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBDb25zdHJ1Y3Rvck5vZGUoaW50IG1vZGlmaWVycywgUGFyYW1ldGVyW10gcGFyYW1ldGVycywgQ2xhc3NOb2RlW10gZXhjZXB0aW9ucywgU3RhdGVtZW50IGNvZGUpIHsKKyAgICAgICAgc3VwZXIoIjxpbml0PiIsbW9kaWZpZXJzLENsYXNzSGVscGVyLlZPSURfVFlQRSxwYXJhbWV0ZXJzLGV4Y2VwdGlvbnMsY29kZSk7CisgICAgICAgIAorICAgICAgICBWYXJpYWJsZVNjb3BlIHNjb3BlID0gbmV3IFZhcmlhYmxlU2NvcGUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBzY29wZS5wdXREZWNsYXJlZFZhcmlhYmxlKHBhcmFtZXRlcnNbaV0pOworICAgICAgICB9CisgICAgICAgIHRoaXMuc2V0VmFyaWFibGVTY29wZShzY29wZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGZpcnN0U3RhdGVtZW50SXNTcGVjaWFsQ29uc3RydWN0b3JDYWxsKCkgeworICAgICAgICBTdGF0ZW1lbnQgY29kZSA9IGdldEZpcnN0U3RhdGVtZW50KCk7CisgICAgICAgIGlmIChjb2RlID09IG51bGwgfHwgIShjb2RlIGluc3RhbmNlb2YgRXhwcmVzc2lvblN0YXRlbWVudCkpIHJldHVybiBmYWxzZTsKKworICAgICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSAoKEV4cHJlc3Npb25TdGF0ZW1lbnQpIGNvZGUpLmdldEV4cHJlc3Npb24oKTsKKyAgICAgICAgaWYgKCEoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIENvbnN0cnVjdG9yQ2FsbEV4cHJlc3Npb24pKSByZXR1cm4gZmFsc2U7CisgICAgICAgIENvbnN0cnVjdG9yQ2FsbEV4cHJlc3Npb24gY2NlID0gKENvbnN0cnVjdG9yQ2FsbEV4cHJlc3Npb24pIGV4cHJlc3Npb247CisgICAgICAgIHJldHVybiBjY2UuaXNTcGVjaWFsQ2FsbCgpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L0R5bmFtaWNWYXJpYWJsZS5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L0R5bmFtaWNWYXJpYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZTk1MmUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvRHluYW1pY1ZhcmlhYmxlLmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0OworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuZXhwci5FeHByZXNzaW9uOworCitwdWJsaWMgY2xhc3MgRHluYW1pY1ZhcmlhYmxlIGltcGxlbWVudHMgVmFyaWFibGUgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gY2xvc3VyZVNoYXJlID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIHN0YXRpY0NvbnRleHQgPSBmYWxzZTsKKyAgICAKKyAgICBwdWJsaWMgRHluYW1pY1ZhcmlhYmxlKFN0cmluZyBuYW1lLCBib29sZWFuIGNvbnRleHQpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgc3RhdGljQ29udGV4dCA9IGNvbnRleHQ7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBDbGFzc05vZGUgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIENsYXNzSGVscGVyLkRZTkFNSUNfVFlQRTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBFeHByZXNzaW9uIGdldEluaXRpYWxFeHByZXNzaW9uKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNJbml0aWFsRXhwcmVzc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzSW5TdGF0aWNDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gc3RhdGljQ29udGV4dDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0R5bmFtaWNUeXBlZCgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNDbG9zdXJlU2hhcmVkVmFyaWFibGUoKSB7CisgICAgICAgIHJldHVybiBjbG9zdXJlU2hhcmU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2xvc3VyZVNoYXJlZFZhcmlhYmxlKGJvb2xlYW4gaW5DbG9zdXJlKSB7CisgICAgICAgIGNsb3N1cmVTaGFyZSA9IGluQ2xvc3VyZTsgICAgICAgIAorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L0ZpZWxkTm9kZS5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L0ZpZWxkTm9kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlM2M3MjcKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvRmllbGROb2RlLmphdmEKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuZXhwci5FeHByZXNzaW9uOworaW1wb3J0IG9yZy5vYmplY3R3ZWIuYXNtLk9wY29kZXM7CisKKy8qKgorICogUmVwcmVzZW50cyBhIGZpZWxkIChtZW1iZXIgdmFyaWFibGUpCisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBGaWVsZE5vZGUgZXh0ZW5kcyBBbm5vdGF0ZWROb2RlIGltcGxlbWVudHMgT3Bjb2RlcywgVmFyaWFibGUgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKyAgICBwcml2YXRlIGludCBtb2RpZmllcnM7CisgICAgcHJpdmF0ZSBDbGFzc05vZGUgdHlwZTsKKyAgICBwcml2YXRlIENsYXNzTm9kZSBvd25lcjsKKyAgICBwcml2YXRlIEV4cHJlc3Npb24gaW5pdGlhbFZhbHVlRXhwcmVzc2lvbjsKKyAgICBwcml2YXRlIGJvb2xlYW4gZHluYW1pY1R5cGVkOworICAgIHByaXZhdGUgYm9vbGVhbiBob2xkZXI7CisgICAgcHJpdmF0ZSBib29sZWFuIGNsb3N1cmVTaGFyZSA9IGZhbHNlOworCisgICAgcHVibGljIHN0YXRpYyBGaWVsZE5vZGUgbmV3U3RhdGljKENsYXNzIHRoZUNsYXNzLCBTdHJpbmcgbmFtZSkgdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uLCBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7CisgICAgICAgIEZpZWxkIGZpZWxkID0gdGhlQ2xhc3MuZ2V0RmllbGQobmFtZSk7CisgICAgICAgIENsYXNzTm9kZSBmbGRUeXBlID0gQ2xhc3NIZWxwZXIubWFrZShmaWVsZC5nZXRUeXBlKCkpOworICAgICAgICByZXR1cm4gbmV3IEZpZWxkTm9kZShuYW1lLCBBQ0NfUFVCTElDIHwgQUNDX1NUQVRJQywgZmxkVHlwZSwgQ2xhc3NIZWxwZXIubWFrZSh0aGVDbGFzcyksIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBGaWVsZE5vZGUoU3RyaW5nIG5hbWUsIGludCBtb2RpZmllcnMsIENsYXNzTm9kZSB0eXBlLCBDbGFzc05vZGUgb3duZXIsIEV4cHJlc3Npb24gaW5pdGlhbFZhbHVlRXhwcmVzc2lvbikgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB0aGlzLm1vZGlmaWVycyA9IG1vZGlmaWVyczsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgaWYgKHRoaXMudHlwZT09Q2xhc3NIZWxwZXIuRFlOQU1JQ19UWVBFICYmIGluaXRpYWxWYWx1ZUV4cHJlc3Npb24hPW51bGwpIHRoaXMuc2V0VHlwZShpbml0aWFsVmFsdWVFeHByZXNzaW9uLmdldFR5cGUoKSk7CisgICAgICAgIHRoaXMuc2V0VHlwZSh0eXBlKTsKKyAgICAgICAgdGhpcy5vd25lciA9IG93bmVyOworICAgICAgICB0aGlzLmluaXRpYWxWYWx1ZUV4cHJlc3Npb24gPSBpbml0aWFsVmFsdWVFeHByZXNzaW9uOworICAgIH0KKworICAgIHB1YmxpYyBFeHByZXNzaW9uIGdldEluaXRpYWxFeHByZXNzaW9uKCkgeworICAgICAgICByZXR1cm4gaW5pdGlhbFZhbHVlRXhwcmVzc2lvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldE1vZGlmaWVycygpIHsKKyAgICAgICAgcmV0dXJuIG1vZGlmaWVyczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzc05vZGUgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VHlwZShDbGFzc05vZGUgdHlwZSkgeworICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICBkeW5hbWljVHlwZWQgfD0gdHlwZT09Q2xhc3NIZWxwZXIuRFlOQU1JQ19UWVBFOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgQ2xhc3NOb2RlIGdldE93bmVyKCkgeworICAgICAgICByZXR1cm4gb3duZXI7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNIb2xkZXIoKSB7CisgICAgICAgIHJldHVybiBob2xkZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SG9sZGVyKGJvb2xlYW4gaG9sZGVyKSB7CisgICAgICAgIHRoaXMuaG9sZGVyID0gaG9sZGVyOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRHluYW1pY1R5cGVkKCkgeworICAgICAgICByZXR1cm4gZHluYW1pY1R5cGVkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1vZGlmaWVycyhpbnQgbW9kaWZpZXJzKSB7CisgICAgICAgIHRoaXMubW9kaWZpZXJzID0gbW9kaWZpZXJzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZmllbGQgaXMgc3RhdGljCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTdGF0aWMoKSB7CisgICAgICAgIHJldHVybiAobW9kaWZpZXJzICYgQUNDX1NUQVRJQykgIT0gMDsKKyAgICB9CisJLyoqCisJICogQHBhcmFtIG93bmVyIFRoZSBvd25lciB0byBzZXQuCisJICovCisJcHVibGljIHZvaWQgc2V0T3duZXIoQ2xhc3NOb2RlIG93bmVyKSB7CisJCXRoaXMub3duZXIgPSBvd25lcjsKKwl9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNJbml0aWFsRXhwcmVzc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIGluaXRpYWxWYWx1ZUV4cHJlc3Npb24hPW51bGw7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNJblN0YXRpY0NvbnRleHQoKSB7CisgICAgICAgIHJldHVybiBpc1N0YXRpYygpOworICAgIH0KKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBnZXRJbml0aWFsVmFsdWVFeHByZXNzaW9uKCkgeworICAgICAgICByZXR1cm4gaW5pdGlhbFZhbHVlRXhwcmVzc2lvbjsKKyAgICB9CisgICAgcHVibGljIHZvaWQgc2V0SW5pdGlhbFZhbHVlRXhwcmVzc2lvbihFeHByZXNzaW9uIGluaXRpYWxWYWx1ZUV4cHJlc3Npb24pIHsKKyAgICAgICAgdGhpcy5pbml0aWFsVmFsdWVFeHByZXNzaW9uID0gaW5pdGlhbFZhbHVlRXhwcmVzc2lvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Nsb3N1cmVTaGFyZWRWYXJpYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRDbG9zdXJlU2hhcmVkVmFyaWFibGUoYm9vbGVhbiBpbkNsb3N1cmUpIHsKKyAgICAgICAgY2xvc3VyZVNoYXJlID0gaW5DbG9zdXJlOyAgICAgICAgCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L0dlbmVyaWNzVHlwZS5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L0dlbmVyaWNzVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNzJlODIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvR2VuZXJpY3NUeXBlLmphdmEKQEAgLTAsMCArMSwxMDggQEAKKy8qDQorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdDsNCisNCisvKioNCisgKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gZGVzY3JpYmUgZ2VuZXJpYyB0eXBlIHNpZ25hdHVyZXMNCisgKiBmb3IgQ2xhc3NOb2Rlcy4gDQorICogQGF1dGhvciBKb2NoZW4gVGhlb2Rvcm91DQorICogQHNlZSBDbGFzc05vZGUNCisgKi8NCitwdWJsaWMgY2xhc3MgR2VuZXJpY3NUeXBlIGV4dGVuZHMgQVNUTm9kZSB7DQorICAgIHByaXZhdGUgZmluYWwgQ2xhc3NOb2RlW10gdXBwZXJCb3VuZHM7DQorICAgIHByaXZhdGUgZmluYWwgQ2xhc3NOb2RlIGxvd2VyQm91bmQ7DQorICAgIHByaXZhdGUgQ2xhc3NOb2RlIHR5cGU7DQorICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7DQorICAgIHByaXZhdGUgYm9vbGVhbiBwbGFjZWhvbGRlcjsNCisgICAgcHJpdmF0ZSBib29sZWFuIHJlc29sdmVkOw0KKyAgICBwcml2YXRlIGJvb2xlYW4gd2lsZGNhcmQ7DQorICAgIA0KKyAgICBwdWJsaWMgR2VuZXJpY3NUeXBlKENsYXNzTm9kZSB0eXBlLCBDbGFzc05vZGVbXSB1cHBlckJvdW5kcywgQ2xhc3NOb2RlIGxvd2VyQm91bmQpIHsNCisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7DQorICAgICAgICB0aGlzLm5hbWUgPSB0eXBlLmdldE5hbWUoKTsNCisgICAgICAgIHRoaXMudXBwZXJCb3VuZHMgPSB1cHBlckJvdW5kczsNCisgICAgICAgIHRoaXMubG93ZXJCb3VuZCA9IGxvd2VyQm91bmQ7DQorICAgICAgICBwbGFjZWhvbGRlciA9IGZhbHNlOw0KKyAgICAgICAgcmVzb2x2ZWQgPSBmYWxzZTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIEdlbmVyaWNzVHlwZShDbGFzc05vZGUgYmFzaWNUeXBlKSB7DQorICAgICAgICB0aGlzKGJhc2ljVHlwZSxudWxsLG51bGwpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBDbGFzc05vZGUgZ2V0VHlwZSgpIHsNCisgICAgICAgIHJldHVybiB0eXBlOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKENsYXNzTm9kZSB0eXBlKSB7DQorICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KKyAgICAgICAgU3RyaW5nIHJldCA9IG5hbWU7DQorICAgICAgICBpZiAodXBwZXJCb3VuZHMhPW51bGwpIHsNCisgICAgICAgICAgICByZXQgKz0gIiBleHRlbmRzICI7DQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1cHBlckJvdW5kcy5sZW5ndGg7IGkrKykgew0KKyAgICAgICAgICAgICAgICByZXQgKz0gdXBwZXJCb3VuZHNbaV0udG9TdHJpbmcoKTsNCisgICAgICAgICAgICAgICAgaWYgKGkrMTx1cHBlckJvdW5kcy5sZW5ndGgpIHJldCArPSAiICYgIjsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2UgaWYgKGxvd2VyQm91bmQhPW51bGwpIHsNCisgICAgICAgICAgICByZXQgKz0gIiBzdXBlciAiK2xvd2VyQm91bmQ7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcmV0Ow0KKyAgICB9DQorDQorICAgIHB1YmxpYyBDbGFzc05vZGVbXSBnZXRVcHBlckJvdW5kcygpIHsNCisgICAgICAgIHJldHVybiB1cHBlckJvdW5kczsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCl7DQorICAgICAgICByZXR1cm4gbmFtZTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1BsYWNlaG9sZGVyKCkgew0KKyAgICAgICAgcmV0dXJuIHBsYWNlaG9sZGVyOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldFBsYWNlaG9sZGVyKGJvb2xlYW4gcGxhY2Vob2xkZXIpIHsNCisgICAgICAgIHRoaXMucGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlcjsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGJvb2xlYW4gaXNSZXNvbHZlZCgpIHsNCisgICAgICAgIHJldHVybiByZXNvbHZlZCB8fCBwbGFjZWhvbGRlcjsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHZvaWQgc2V0UmVzb2x2ZWQoYm9vbGVhbiByZXMpIHsNCisgICAgICAgIHJlc29sdmVkID0gcmVzOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsNCisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gaXNXaWxkY2FyZCgpIHsNCisgICAgICAgIHJldHVybiB3aWxkY2FyZDsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXRXaWxkY2FyZChib29sZWFuIHdpbGRjYXJkKSB7DQorICAgICAgICB0aGlzLndpbGRjYXJkID0gd2lsZGNhcmQ7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBDbGFzc05vZGUgZ2V0TG93ZXJCb3VuZCgpIHsNCisgICAgICAgIHJldHVybiBsb3dlckJvdW5kOw0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9Hcm9vdnlDbGFzc1Zpc2l0b3IuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9Hcm9vdnlDbGFzc1Zpc2l0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjk3MzNlCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L0dyb292eUNsYXNzVmlzaXRvci5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdDsKKworLyoqCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdmlzaXRvciBwYXR0ZXJuIGZvciB3b3JraW5nIHdpdGggQVNUTm9kZXMKKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGludGVyZmFjZSBHcm9vdnlDbGFzc1Zpc2l0b3IgeworCisgICAgdm9pZCB2aXNpdENsYXNzKENsYXNzTm9kZSBub2RlKTsKKyAgICB2b2lkIHZpc2l0Q29uc3RydWN0b3IoQ29uc3RydWN0b3JOb2RlIG5vZGUpOworICAgIHZvaWQgdmlzaXRNZXRob2QoTWV0aG9kTm9kZSBub2RlKTsKKyAgICB2b2lkIHZpc2l0RmllbGQoRmllbGROb2RlIG5vZGUpOworICAgIHZvaWQgdmlzaXRQcm9wZXJ0eShQcm9wZXJ0eU5vZGUgbm9kZSk7CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9Hcm9vdnlDb2RlVmlzaXRvci5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L0dyb292eUNvZGVWaXNpdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYxOWVkNwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9Hcm9vdnlDb2RlVmlzaXRvci5qYXZhCkBAIC0wLDAgKzEsMTQyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdDsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHIuKjsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuKjsKKworLyoqCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdmlzaXRvciBwYXR0ZXJuIGZvciB3b3JraW5nIHdpdGggQVNUTm9kZXMKKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCisKK3B1YmxpYyBpbnRlcmZhY2UgR3Jvb3Z5Q29kZVZpc2l0b3IgeworCisgICAgLy8gc3RhdGVtZW50cworCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICB2b2lkIHZpc2l0QmxvY2tTdGF0ZW1lbnQoQmxvY2tTdGF0ZW1lbnQgc3RhdGVtZW50KTsKKworICAgIHZvaWQgdmlzaXRGb3JMb29wKEZvclN0YXRlbWVudCBmb3JMb29wKTsKKworICAgIHZvaWQgdmlzaXRXaGlsZUxvb3AoV2hpbGVTdGF0ZW1lbnQgbG9vcCk7CisKKyAgICB2b2lkIHZpc2l0RG9XaGlsZUxvb3AoRG9XaGlsZVN0YXRlbWVudCBsb29wKTsKKworICAgIHZvaWQgdmlzaXRJZkVsc2UoSWZTdGF0ZW1lbnQgaWZFbHNlKTsKKworICAgIHZvaWQgdmlzaXRFeHByZXNzaW9uU3RhdGVtZW50KEV4cHJlc3Npb25TdGF0ZW1lbnQgc3RhdGVtZW50KTsKKworICAgIHZvaWQgdmlzaXRSZXR1cm5TdGF0ZW1lbnQoUmV0dXJuU3RhdGVtZW50IHN0YXRlbWVudCk7CisKKyAgICB2b2lkIHZpc2l0QXNzZXJ0U3RhdGVtZW50KEFzc2VydFN0YXRlbWVudCBzdGF0ZW1lbnQpOworCisgICAgdm9pZCB2aXNpdFRyeUNhdGNoRmluYWxseShUcnlDYXRjaFN0YXRlbWVudCBmaW5hbGx5MSk7CisKKyAgICB2b2lkIHZpc2l0U3dpdGNoKFN3aXRjaFN0YXRlbWVudCBzdGF0ZW1lbnQpOworCisgICAgdm9pZCB2aXNpdENhc2VTdGF0ZW1lbnQoQ2FzZVN0YXRlbWVudCBzdGF0ZW1lbnQpOworCisgICAgdm9pZCB2aXNpdEJyZWFrU3RhdGVtZW50KEJyZWFrU3RhdGVtZW50IHN0YXRlbWVudCk7CisKKyAgICB2b2lkIHZpc2l0Q29udGludWVTdGF0ZW1lbnQoQ29udGludWVTdGF0ZW1lbnQgc3RhdGVtZW50KTsKKworICAgIHZvaWQgdmlzaXRUaHJvd1N0YXRlbWVudChUaHJvd1N0YXRlbWVudCBzdGF0ZW1lbnQpOworCisgICAgdm9pZCB2aXNpdFN5bmNocm9uaXplZFN0YXRlbWVudChTeW5jaHJvbml6ZWRTdGF0ZW1lbnQgc3RhdGVtZW50KTsKKyAgICAKKyAgICB2b2lkIHZpc2l0Q2F0Y2hTdGF0ZW1lbnQoQ2F0Y2hTdGF0ZW1lbnQgc3RhdGVtZW50KTsKKworICAgIC8vIGV4cHJlc3Npb25zCisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIHZvaWQgdmlzaXRNZXRob2RDYWxsRXhwcmVzc2lvbihNZXRob2RDYWxsRXhwcmVzc2lvbiBjYWxsKTsKKworICAgIHZvaWQgdmlzaXRTdGF0aWNNZXRob2RDYWxsRXhwcmVzc2lvbihTdGF0aWNNZXRob2RDYWxsRXhwcmVzc2lvbiBleHByZXNzaW9uKTsKKworICAgIHZvaWQgdmlzaXRDb25zdHJ1Y3RvckNhbGxFeHByZXNzaW9uKENvbnN0cnVjdG9yQ2FsbEV4cHJlc3Npb24gZXhwcmVzc2lvbik7CisKKyAgICB2b2lkIHZpc2l0VGVybmFyeUV4cHJlc3Npb24oVGVybmFyeUV4cHJlc3Npb24gZXhwcmVzc2lvbik7CisgICAgCisgICAgdm9pZCB2aXNpdFNob3J0VGVybmFyeUV4cHJlc3Npb24oRWx2aXNPcGVyYXRvckV4cHJlc3Npb24gZXhwcmVzc2lvbik7CisKKyAgICB2b2lkIHZpc2l0QmluYXJ5RXhwcmVzc2lvbihCaW5hcnlFeHByZXNzaW9uIGV4cHJlc3Npb24pOworCisgICAgdm9pZCB2aXNpdFByZWZpeEV4cHJlc3Npb24oUHJlZml4RXhwcmVzc2lvbiBleHByZXNzaW9uKTsKKworICAgIHZvaWQgdmlzaXRQb3N0Zml4RXhwcmVzc2lvbihQb3N0Zml4RXhwcmVzc2lvbiBleHByZXNzaW9uKTsKKworICAgIHZvaWQgdmlzaXRCb29sZWFuRXhwcmVzc2lvbihCb29sZWFuRXhwcmVzc2lvbiBleHByZXNzaW9uKTsKKworICAgIHZvaWQgdmlzaXRDbG9zdXJlRXhwcmVzc2lvbihDbG9zdXJlRXhwcmVzc2lvbiBleHByZXNzaW9uKTsKKworICAgIHZvaWQgdmlzaXRUdXBsZUV4cHJlc3Npb24oVHVwbGVFeHByZXNzaW9uIGV4cHJlc3Npb24pOworCisgICAgdm9pZCB2aXNpdE1hcEV4cHJlc3Npb24oTWFwRXhwcmVzc2lvbiBleHByZXNzaW9uKTsKKworICAgIHZvaWQgdmlzaXRNYXBFbnRyeUV4cHJlc3Npb24oTWFwRW50cnlFeHByZXNzaW9uIGV4cHJlc3Npb24pOworCisgICAgdm9pZCB2aXNpdExpc3RFeHByZXNzaW9uKExpc3RFeHByZXNzaW9uIGV4cHJlc3Npb24pOworCisgICAgdm9pZCB2aXNpdFJhbmdlRXhwcmVzc2lvbihSYW5nZUV4cHJlc3Npb24gZXhwcmVzc2lvbik7CisKKyAgICB2b2lkIHZpc2l0UHJvcGVydHlFeHByZXNzaW9uKFByb3BlcnR5RXhwcmVzc2lvbiBleHByZXNzaW9uKTsKKworICAgIHZvaWQgdmlzaXRBdHRyaWJ1dGVFeHByZXNzaW9uKEF0dHJpYnV0ZUV4cHJlc3Npb24gYXR0cmlidXRlRXhwcmVzc2lvbik7CisKKyAgICB2b2lkIHZpc2l0RmllbGRFeHByZXNzaW9uKEZpZWxkRXhwcmVzc2lvbiBleHByZXNzaW9uKTsKKworICAgIHZvaWQgdmlzaXRNZXRob2RQb2ludGVyRXhwcmVzc2lvbihNZXRob2RQb2ludGVyRXhwcmVzc2lvbiBleHByZXNzaW9uKTsKKworICAgIHZvaWQgdmlzaXRDb25zdGFudEV4cHJlc3Npb24oQ29uc3RhbnRFeHByZXNzaW9uIGV4cHJlc3Npb24pOworCisgICAgdm9pZCB2aXNpdENsYXNzRXhwcmVzc2lvbihDbGFzc0V4cHJlc3Npb24gZXhwcmVzc2lvbik7CisKKyAgICB2b2lkIHZpc2l0VmFyaWFibGVFeHByZXNzaW9uKFZhcmlhYmxlRXhwcmVzc2lvbiBleHByZXNzaW9uKTsKKworICAgIHZvaWQgdmlzaXREZWNsYXJhdGlvbkV4cHJlc3Npb24oRGVjbGFyYXRpb25FeHByZXNzaW9uIGV4cHJlc3Npb24pOworCisgICAgdm9pZCB2aXNpdFJlZ2V4RXhwcmVzc2lvbihSZWdleEV4cHJlc3Npb24gZXhwcmVzc2lvbik7CisKKyAgICB2b2lkIHZpc2l0R1N0cmluZ0V4cHJlc3Npb24oR1N0cmluZ0V4cHJlc3Npb24gZXhwcmVzc2lvbik7CisKKyAgICB2b2lkIHZpc2l0QXJyYXlFeHByZXNzaW9uKEFycmF5RXhwcmVzc2lvbiBleHByZXNzaW9uKTsKKworICAgIHZvaWQgdmlzaXRTcHJlYWRFeHByZXNzaW9uKFNwcmVhZEV4cHJlc3Npb24gZXhwcmVzc2lvbik7CisKKyAgICB2b2lkIHZpc2l0U3ByZWFkTWFwRXhwcmVzc2lvbihTcHJlYWRNYXBFeHByZXNzaW9uIGV4cHJlc3Npb24pOworCisgICAgdm9pZCB2aXNpdE5vdEV4cHJlc3Npb24oTm90RXhwcmVzc2lvbiBleHByZXNzaW9uKTsKKworICAgIHZvaWQgdmlzaXRVbmFyeU1pbnVzRXhwcmVzc2lvbihVbmFyeU1pbnVzRXhwcmVzc2lvbiBleHByZXNzaW9uKTsKKworICAgIHZvaWQgdmlzaXRVbmFyeVBsdXNFeHByZXNzaW9uKFVuYXJ5UGx1c0V4cHJlc3Npb24gZXhwcmVzc2lvbik7CisKKyAgICB2b2lkIHZpc2l0Qml0d2lzZU5lZ2F0aW9uRXhwcmVzc2lvbihCaXR3aXNlTmVnYXRpb25FeHByZXNzaW9uIGV4cHJlc3Npb24pOworCisgICAgdm9pZCB2aXNpdENhc3RFeHByZXNzaW9uKENhc3RFeHByZXNzaW9uIGV4cHJlc3Npb24pOworCisgICAgdm9pZCB2aXNpdEFyZ3VtZW50bGlzdEV4cHJlc3Npb24oQXJndW1lbnRMaXN0RXhwcmVzc2lvbiBleHByZXNzaW9uKTsKKworICAgIHZvaWQgdmlzaXRDbG9zdXJlTGlzdEV4cHJlc3Npb24oQ2xvc3VyZUxpc3RFeHByZXNzaW9uIGNsb3N1cmVMaXN0RXhwcmVzc2lvbik7Cit9CisKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9JbXBvcnROb2RlLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvSW1wb3J0Tm9kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMmE2NWQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvSW1wb3J0Tm9kZS5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdDsKKworaW1wb3J0IG9yZy5vYmplY3R3ZWIuYXNtLk9wY29kZXM7CisKKy8qKgorICogUmVwcmVzZW50cyBhbiBpbXBvcnQgc3RhdGVtZW50IG9mIGEgc2luZ2xlIGNsYXNzCisgKiAKKyAqIGF1dGhvciBKb2NoZW4gVGhlb2Rvcm91CisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgSW1wb3J0Tm9kZSBleHRlbmRzIEFubm90YXRlZE5vZGUgaW1wbGVtZW50cyBPcGNvZGVzIHsKKworICAgIHByaXZhdGUgZmluYWwgQ2xhc3NOb2RlIHR5cGU7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgYWxpYXM7CisgICAgCisgICAgcHVibGljIEltcG9ydE5vZGUoQ2xhc3NOb2RlIHR5cGUsIFN0cmluZyBhbGlhcykgeworICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICB0aGlzLmFsaWFzID0gYWxpYXM7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHRleHQgZGlzcGxheSBvZiB0aGlzIGltcG9ydAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKKyAgICAgICAgaWYgKGFsaWFzID09IG51bGwgfHwgYWxpYXMubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuICJpbXBvcnQgIiArIHR5cGUuZ2V0TmFtZSgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmV0dXJuICJpbXBvcnQgIiArIHR5cGUuZ2V0TmFtZSgpICsgIiBhcyAiICsgYWxpYXM7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXRBbGlhcygpIHsKKyAgICAgICAgcmV0dXJuIGFsaWFzOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzc05vZGUgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgeworICAgIAlyZXR1cm4gdHlwZS5nZXROYW1lKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvSW5uZXJDbGFzc05vZGUuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9Jbm5lckNsYXNzTm9kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NDFiM2YKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvSW5uZXJDbGFzc05vZGUuamF2YQpAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5hc3Q7CisKKy8qKgorICogUmVwcmVzZW50cyBhbiBpbm5lciBjbGFzcyBkZWNsYXJhdGlvbgorICogCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgSW5uZXJDbGFzc05vZGUgZXh0ZW5kcyBDbGFzc05vZGUgeworCisgICAgcHJpdmF0ZSBDbGFzc05vZGUgb3V0ZXJDbGFzczsKKworICAgIC8qKgorICAgICAqIEBwYXJhbSBuYW1lIGlzIHRoZSBmdWxsIG5hbWUgb2YgdGhlIGNsYXNzCisgICAgICogQHBhcmFtIG1vZGlmaWVycyB0aGUgbW9kaWZpZXJzLCBAc2VlIG9yZy5vYmplY3R3ZWIuYXNtLk9wY29kZXMKKyAgICAgKiBAcGFyYW0gc3VwZXJDbGFzcyB0aGUgYmFzZSBjbGFzcyBuYW1lIC0gdXNlICJqYXZhLmxhbmcuT2JqZWN0IiBpZiBubyBkaXJlY3QgYmFzZSBjbGFzcworICAgICAqLworICAgIHB1YmxpYyBJbm5lckNsYXNzTm9kZShDbGFzc05vZGUgb3V0ZXJDbGFzcywgU3RyaW5nIG5hbWUsIGludCBtb2RpZmllcnMsIENsYXNzTm9kZSBzdXBlckNsYXNzKSB7CisgICAgICAgIHRoaXMob3V0ZXJDbGFzcywgbmFtZSwgbW9kaWZpZXJzLCBzdXBlckNsYXNzLCBDbGFzc0hlbHBlci5FTVBUWV9UWVBFX0FSUkFZLCBNaXhpbk5vZGUuRU1QVFlfQVJSQVkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBuYW1lIGlzIHRoZSBmdWxsIG5hbWUgb2YgdGhlIGNsYXNzCisgICAgICogQHBhcmFtIG1vZGlmaWVycyB0aGUgbW9kaWZpZXJzLCBAc2VlIG9yZy5vYmplY3R3ZWIuYXNtLk9wY29kZXMKKyAgICAgKiBAcGFyYW0gc3VwZXJDbGFzcyB0aGUgYmFzZSBjbGFzcyBuYW1lIC0gdXNlICJqYXZhLmxhbmcuT2JqZWN0IiBpZiBubyBkaXJlY3QgYmFzZSBjbGFzcworICAgICAqLworICAgIHB1YmxpYyBJbm5lckNsYXNzTm9kZShDbGFzc05vZGUgb3V0ZXJDbGFzcywgU3RyaW5nIG5hbWUsIGludCBtb2RpZmllcnMsIENsYXNzTm9kZSBzdXBlckNsYXNzLCBDbGFzc05vZGVbXSBpbnRlcmZhY2VzLCBNaXhpbk5vZGVbXSBtaXhpbnMpIHsKKyAgICAgICAgc3VwZXIobmFtZSwgbW9kaWZpZXJzLCBzdXBlckNsYXNzLCBpbnRlcmZhY2VzLCBtaXhpbnMpOworICAgICAgICB0aGlzLm91dGVyQ2xhc3MgPSBvdXRlckNsYXNzOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzc05vZGUgZ2V0T3V0ZXJDbGFzcygpIHsKKyAgICAgICAgcmV0dXJuIG91dGVyQ2xhc3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgZmllbGQgbm9kZSBvbiB0aGUgb3V0ZXIgY2xhc3Mgb3IgbnVsbCBpZiB0aGlzIGlzIG5vdCBhbiBpbm5lciBjbGFzcworICAgICAqLworICAgIHB1YmxpYyBGaWVsZE5vZGUgZ2V0T3V0ZXJGaWVsZChTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gb3V0ZXJDbGFzcy5nZXRGaWVsZChuYW1lKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvTWV0aG9kTm9kZS5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L01ldGhvZE5vZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTU0NGZiCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L01ldGhvZE5vZGUuamF2YQpAQCAtMCwwICsxLDE5OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0OworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3Quc3RtdC5CbG9ja1N0YXRlbWVudDsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5zdG10LlN0YXRlbWVudDsKK2ltcG9ydCBvcmcub2JqZWN0d2ViLmFzbS5PcGNvZGVzOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogUmVwcmVzZW50cyBhIG1ldGhvZCBkZWNsYXJhdGlvbgorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBNZXRob2ROb2RlIGV4dGVuZHMgQW5ub3RhdGVkTm9kZSBpbXBsZW1lbnRzIE9wY29kZXMgeworCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKyAgICBwcml2YXRlIGludCBtb2RpZmllcnM7CisgICAgcHJpdmF0ZSBDbGFzc05vZGUgcmV0dXJuVHlwZTsKKyAgICBwcml2YXRlIFBhcmFtZXRlcltdIHBhcmFtZXRlcnM7CisgICAgcHJpdmF0ZSBib29sZWFuIGhhc0RlZmF1bHRWYWx1ZSA9IGZhbHNlOworICAgIHByaXZhdGUgU3RhdGVtZW50IGNvZGU7CisgICAgcHJpdmF0ZSBib29sZWFuIGR5bmFtaWNSZXR1cm5UeXBlOworICAgIHByaXZhdGUgVmFyaWFibGVTY29wZSB2YXJpYWJsZVNjb3BlOworICAgIHByaXZhdGUgZmluYWwgQ2xhc3NOb2RlW10gZXhjZXB0aW9uczsKKyAgICAKKyAgICAvLyB0eXBlIHNwZWMgZm9yIGdlbmVyaWNzCisgICAgcHJpdmF0ZSBHZW5lcmljc1R5cGVbXSBnZW5lcmljc1R5cGVzPW51bGw7CisKKyAgICBwdWJsaWMgTWV0aG9kTm9kZShTdHJpbmcgbmFtZSwgaW50IG1vZGlmaWVycywgQ2xhc3NOb2RlIHJldHVyblR5cGUsIFBhcmFtZXRlcltdIHBhcmFtZXRlcnMsIENsYXNzTm9kZVtdIGV4Y2VwdGlvbnMsIFN0YXRlbWVudCBjb2RlKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMubW9kaWZpZXJzID0gbW9kaWZpZXJzOworICAgICAgICB0aGlzLmNvZGUgPSBjb2RlOworICAgICAgICB0aGlzLnJldHVyblR5cGUgPSByZXR1cm5UeXBlOworICAgICAgICBpZiAocmV0dXJuVHlwZT09bnVsbCkgdGhpcy5yZXR1cm5UeXBlID0gQ2xhc3NIZWxwZXIuT0JKRUNUX1RZUEU7IAorICAgICAgICBWYXJpYWJsZVNjb3BlIHNjb3BlID0gbmV3IFZhcmlhYmxlU2NvcGUoKTsKKyAgICAgICAgc2V0VmFyaWFibGVTY29wZShzY29wZSk7CisgICAgICAgIHNldFBhcmFtZXRlcnMocGFyYW1ldGVycyk7CisgICAgICAgIAorICAgICAgICB0aGlzLmV4Y2VwdGlvbnMgPSBleGNlcHRpb25zOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIGRlc2NyaXB0b3IgZm9yIGEgbWV0aG9kIG5vZGUgaXMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kLCBpdHMgcmV0dXJuIHR5cGUsCisgICAgICogYW5kIGl0cyBwYXJhbWV0ZXIgdHlwZXMgaW4gYSBjYW5vbmljYWwgZm9ybS4gRm9yIHNpbXBsaWNpdHksIEknbSB1c2luZyB0aGUgZm9ybWF0IG9mIGEgSmF2YSBkZWNsYXJhdGlvbgorICAgICAqIHdpdGhvdXQgcGFyYW1ldGVyIG5hbWVzLCBhbmQgd2l0aCAkZHluYW1pYyBhcyB0aGUgdHlwZSBmb3IgYW55IGR5bmFtaWNhbGx5IHR5cGVkIHZhbHVlcy4KKyAgICAgKi8KKyAgICAvLyBUT0RPOiBhZGQgdGVzdCBjYXNlIGZvciB0eXBlIGRlc2NyaXB0b3IKKyAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGVEZXNjcmlwdG9yKCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcihuYW1lLmxlbmd0aCgpK3BhcmFtZXRlcnMubGVuZ3RoKjEwKTsKKyAgICAgICAgLy8gYnVmLmFwcGVuZChkeW5hbWljUmV0dXJuVHlwZSA/ICIkZHluYW1pYyIgOiBjbGVhbnVwVHlwZU5hbWUocmV0dXJuVHlwZSkpOworICAgICAgICAvLworICAgICAgICBidWYuYXBwZW5kKHJldHVyblR5cGUuZ2V0TmFtZSgpKTsgLy8gYnIgIHRvIHJlcGxhY2UgdGhlIGFib3ZlLiBEeW5hbWljIHR5cGUgcmV0dXJucyBPYmplY3QuCisgICAgICAgIC8vCisgICAgICAgIGJ1Zi5hcHBlbmQoJyAnKTsKKyAgICAgICAgYnVmLmFwcGVuZChuYW1lKTsKKyAgICAgICAgYnVmLmFwcGVuZCgnKCcpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChpID4gMCkgeworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiwgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQYXJhbWV0ZXIgcGFyYW0gPSBwYXJhbWV0ZXJzW2ldOworICAgICAgICAgICAgYnVmLmFwcGVuZChwYXJhbS5nZXRUeXBlKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICBidWYuYXBwZW5kKCcpJyk7CisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9CisgCisgICAgcHVibGljIGJvb2xlYW4gaXNWb2lkTWV0aG9kKCkgeworICAgICAgICByZXR1cm4gcmV0dXJuVHlwZT09Q2xhc3NIZWxwZXIuVk9JRF9UWVBFOworICAgIH0KKworICAgIHB1YmxpYyBTdGF0ZW1lbnQgZ2V0Q29kZSgpIHsKKyAgICAgICAgcmV0dXJuIGNvZGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29kZShTdGF0ZW1lbnQgY29kZSkgeworICAgICAgICB0aGlzLmNvZGUgPSBjb2RlOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0TW9kaWZpZXJzKCkgeworICAgICAgICByZXR1cm4gbW9kaWZpZXJzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1vZGlmaWVycyhpbnQgbW9kaWZpZXJzKSB7CisgICAgICAgIHRoaXMubW9kaWZpZXJzID0gbW9kaWZpZXJzOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgcHVibGljIFBhcmFtZXRlcltdIGdldFBhcmFtZXRlcnMoKSB7CisgICAgICAgIHJldHVybiBwYXJhbWV0ZXJzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtZXRlcnMoUGFyYW1ldGVyW10gcGFyYW1ldGVycykgeworICAgICAgICBWYXJpYWJsZVNjb3BlIHNjb3BlID0gbmV3IFZhcmlhYmxlU2NvcGUoKTsKKyAgICAgICAgdGhpcy5wYXJhbWV0ZXJzID0gcGFyYW1ldGVyczsKKyAgICAgICAgaWYgKHBhcmFtZXRlcnMgIT0gbnVsbCAmJiBwYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIFBhcmFtZXRlciBwYXJhID0gcGFyYW1ldGVyc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAocGFyYS5oYXNJbml0aWFsRXhwcmVzc2lvbigpKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFzRGVmYXVsdFZhbHVlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGFyYS5zZXRJblN0YXRpY0NvbnRleHQoaXNTdGF0aWMoKSk7CisgICAgICAgICAgICAgICAgc2NvcGUucHV0RGVjbGFyZWRWYXJpYWJsZShwYXJhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzZXRWYXJpYWJsZVNjb3BlKHNjb3BlKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIENsYXNzTm9kZSBnZXRSZXR1cm5UeXBlKCkgeworICAgICAgICByZXR1cm4gcmV0dXJuVHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmFyaWFibGVTY29wZSBnZXRWYXJpYWJsZVNjb3BlKCkgeworICAgICAgICByZXR1cm4gdmFyaWFibGVTY29wZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRWYXJpYWJsZVNjb3BlKFZhcmlhYmxlU2NvcGUgdmFyaWFibGVTY29wZSkgeworICAgICAgICB0aGlzLnZhcmlhYmxlU2NvcGUgPSB2YXJpYWJsZVNjb3BlOworICAgICAgICB2YXJpYWJsZVNjb3BlLnNldEluU3RhdGljQ29udGV4dChpc1N0YXRpYygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0R5bmFtaWNSZXR1cm5UeXBlKCkgeworICAgICAgICByZXR1cm4gZHluYW1pY1JldHVyblR5cGU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNBYnN0cmFjdCgpIHsKKyAgICAgICAgcmV0dXJuIChtb2RpZmllcnMgJiBBQ0NfQUJTVFJBQ1QpICE9IDA7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNTdGF0aWMoKSB7CisgICAgICAgIHJldHVybiAobW9kaWZpZXJzICYgQUNDX1NUQVRJQykgIT0gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1B1YmxpYygpIHsKKyAgICAgICAgcmV0dXJuIChtb2RpZmllcnMgJiBBQ0NfUFVCTElDKSAhPSAwOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzUHJvdGVjdGVkKCkgeworICAgICAgICByZXR1cm4gKG1vZGlmaWVycyAmIEFDQ19QUk9URUNURUQpICE9IDA7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGFzRGVmYXVsdFZhbHVlKCkgeworICAgICAgICByZXR1cm4gdGhpcy5oYXNEZWZhdWx0VmFsdWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCkgKyAiW25hbWU6ICIgKyBuYW1lICsgIl0iOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJldHVyblR5cGUoQ2xhc3NOb2RlIHJldHVyblR5cGUpIHsKKyAgICAgICAgdGhpcy5yZXR1cm5UeXBlID0gcmV0dXJuVHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3NOb2RlW10gZ2V0RXhjZXB0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbnM7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBTdGF0ZW1lbnQgZ2V0Rmlyc3RTdGF0ZW1lbnQoKXsKKyAgICAgICAgaWYgKGNvZGUgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisgICAgICAgIFN0YXRlbWVudCBmaXJzdCA9IGNvZGU7CisgICAgICAgIHdoaWxlIChmaXJzdCBpbnN0YW5jZW9mIEJsb2NrU3RhdGVtZW50KSB7CisgICAgICAgICAgICBMaXN0IGxpc3QgPSAoKEJsb2NrU3RhdGVtZW50KSBmaXJzdCkuZ2V0U3RhdGVtZW50cygpOworICAgICAgICAgICAgaWYgKGxpc3QuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgZmlyc3Q9bnVsbDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZmlyc3QgPSAoU3RhdGVtZW50KSBsaXN0LmdldCgwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmlyc3Q7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBHZW5lcmljc1R5cGVbXSBnZXRHZW5lcmljc1R5cGVzKCkgeworICAgICAgICByZXR1cm4gZ2VuZXJpY3NUeXBlczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmljc1R5cGVzKEdlbmVyaWNzVHlwZVtdIGdlbmVyaWNzVHlwZXMpIHsKKyAgICAgICAgdGhpcy5nZW5lcmljc1R5cGVzID0gZ2VuZXJpY3NUeXBlczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvTWl4aW5Ob2RlLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvTWl4aW5Ob2RlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZhNmE4YgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9NaXhpbk5vZGUuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5hc3Q7CisKKy8qKgorICogUmVwcmVzZW50cyBhIG1peGluIHdoaWNoIGNhbiBiZSBhcHBsaWVkIHRvIGFueSBDbGFzc05vZGUgdG8gaW1wbGVtZW50IG1peGlucworICogCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgTWl4aW5Ob2RlIGV4dGVuZHMgQ2xhc3NOb2RlIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWl4aW5Ob2RlW10gRU1QVFlfQVJSQVkgPSB7fTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gbmFtZSBpcyB0aGUgZnVsbCBuYW1lIG9mIHRoZSBjbGFzcworICAgICAqIEBwYXJhbSBtb2RpZmllcnMgdGhlIG1vZGlmaWVycywgQHNlZSBvcmcub2JqZWN0d2ViLmFzbS5PcGNvZGVzCisgICAgICogQHBhcmFtIHN1cGVyVHlwZSB0aGUgYmFzZSBjbGFzcyBuYW1lIC0gdXNlICJqYXZhLmxhbmcuT2JqZWN0IiBpZiBubyBkaXJlY3QgYmFzZSBjbGFzcworICAgICAqLworICAgIHB1YmxpYyBNaXhpbk5vZGUoU3RyaW5nIG5hbWUsIGludCBtb2RpZmllcnMsIENsYXNzTm9kZSBzdXBlclR5cGUpIHsKKyAgICAgICAgdGhpcyhuYW1lLCBtb2RpZmllcnMsIHN1cGVyVHlwZSwgQ2xhc3NIZWxwZXIuRU1QVFlfVFlQRV9BUlJBWSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIG5hbWUgaXMgdGhlIGZ1bGwgbmFtZSBvZiB0aGUgY2xhc3MKKyAgICAgKiBAcGFyYW0gbW9kaWZpZXJzIHRoZSBtb2RpZmllcnMsIEBzZWUgb3JnLm9iamVjdHdlYi5hc20uT3Bjb2RlcworICAgICAqIEBwYXJhbSBzdXBlclR5cGUgdGhlIGJhc2UgY2xhc3MgbmFtZSAtIHVzZSAiamF2YS5sYW5nLk9iamVjdCIgaWYgbm8gZGlyZWN0IGJhc2UgY2xhc3MKKyAgICAgKi8KKyAgICBwdWJsaWMgTWl4aW5Ob2RlKFN0cmluZyBuYW1lLCBpbnQgbW9kaWZpZXJzLCBDbGFzc05vZGUgc3VwZXJUeXBlLCBDbGFzc05vZGVbXSBpbnRlcmZhY2VzKSB7CisgICAgICAgIHN1cGVyKG5hbWUsIG1vZGlmaWVycywgc3VwZXJUeXBlLCBpbnRlcmZhY2VzLCBNaXhpbk5vZGUuRU1QVFlfQVJSQVkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9Nb2R1bGVOb2RlLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvTW9kdWxlTm9kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNjgwMzQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvTW9kdWxlTm9kZS5qYXZhCkBAIC0wLDAgKzEsMzI4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5hc3Q7CisKK2ltcG9ydCBncm9vdnkubGFuZy5CaW5kaW5nOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHIuQXJndW1lbnRMaXN0RXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByLkNsYXNzRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByLk1ldGhvZENhbGxFeHByZXNzaW9uOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHIuVmFyaWFibGVFeHByZXNzaW9uOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuQmxvY2tTdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3Quc3RtdC5FeHByZXNzaW9uU3RhdGVtZW50OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuU3RhdGVtZW50OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5Tb3VyY2VVbml0OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5JbnZva2VySGVscGVyOworaW1wb3J0IG9yZy5vYmplY3R3ZWIuYXNtLk9wY29kZXM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLio7CisKKy8qKgorICogUmVwcmVzZW50cyBhIG1vZHVsZSwgd2hpY2ggY29uc2lzdHMgdHlwaWNhbGx5IG9mIGEgY2xhc3MgZGVjbGFyYXRpb24KKyAqIGJ1dCBjb3VsZCBpbmNsdWRlIHNvbWUgaW1wb3J0cywgc29tZSBzdGF0ZW1lbnRzIGFuZCBtdWx0aXBsZSBjbGFzc2VzCisgKiBpbnRlcm1peGVkIHdpdGggc3RhdGVtZW50cyBsaWtlIHNjcmlwdHMgaW4gUHl0aG9uIG9yIFJ1YnkKKyAqCisgKiBAYXV0aG9yIEpvY2hlbiBUaGVvZG9yb3UKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBNb2R1bGVOb2RlIGV4dGVuZHMgQVNUTm9kZSBpbXBsZW1lbnRzIE9wY29kZXMgeworCisgICAgcHJpdmF0ZSBCbG9ja1N0YXRlbWVudCBzdGF0ZW1lbnRCbG9jayA9IG5ldyBCbG9ja1N0YXRlbWVudCgpOworICAgIExpc3QgY2xhc3NlcyA9IG5ldyBMaW5rZWRMaXN0KCk7CisgICAgcHJpdmF0ZSBMaXN0IG1ldGhvZHMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgcHJpdmF0ZSBMaXN0IGltcG9ydHMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgcHJpdmF0ZSBMaXN0IGltcG9ydFBhY2thZ2VzID0gbmV3IEFycmF5TGlzdCgpOworICAgIHByaXZhdGUgTWFwIGltcG9ydEluZGV4ID0gbmV3IEhhc2hNYXAoKTsKKyAgICBwcml2YXRlIE1hcCBzdGF0aWNJbXBvcnRBbGlhc2VzID0gbmV3IEhhc2hNYXAoKTsKKyAgICBwcml2YXRlIE1hcCBzdGF0aWNJbXBvcnRGaWVsZHMgPSBuZXcgTGlua2VkSGFzaE1hcCgpOworICAgIHByaXZhdGUgTWFwIHN0YXRpY0ltcG9ydENsYXNzZXMgPSBuZXcgTGlua2VkSGFzaE1hcCgpOworICAgIHByaXZhdGUgQ29tcGlsZVVuaXQgdW5pdDsKKyAgICBwcml2YXRlIFN0cmluZyBwYWNrYWdlTmFtZTsKKyAgICBwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKKyAgICBwcml2YXRlIGJvb2xlYW4gY3JlYXRlQ2xhc3NGb3JTdGF0ZW1lbnRzID0gdHJ1ZTsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBTb3VyY2VVbml0IGNvbnRleHQ7CisgICAgcHJpdmF0ZSBib29sZWFuIGltcG9ydHNSZXNvbHZlZCA9IGZhbHNlOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVNUFRZX1NUUklOR19BUlJBWSA9IG5ldyBTdHJpbmdbXSB7IC8qIGNsYXNzIG5hbWVzLCBub3QgcXVhbGlmaWVkICovIH07CisKKworICAgIHB1YmxpYyBNb2R1bGVOb2RlIChTb3VyY2VVbml0IGNvbnRleHQgKSB7CisgICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7CisgICAgfQorCisgICAgcHVibGljIE1vZHVsZU5vZGUgKENvbXBpbGVVbml0IHVuaXQpIHsKKyAgICAgICAgdGhpcy51bml0ID0gdW5pdDsKKyAgICB9CisKKyAgICBwdWJsaWMgQmxvY2tTdGF0ZW1lbnQgZ2V0U3RhdGVtZW50QmxvY2soKSB7CisgICAgICAgIHJldHVybiBzdGF0ZW1lbnRCbG9jazsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdCBnZXRNZXRob2RzKCkgeworICAgICAgICByZXR1cm4gbWV0aG9kczsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdCBnZXRDbGFzc2VzKCkgeworICAgICAgICBpZiAoY3JlYXRlQ2xhc3NGb3JTdGF0ZW1lbnRzICYmICghc3RhdGVtZW50QmxvY2suaXNFbXB0eSgpIHx8ICFtZXRob2RzLmlzRW1wdHkoKSkpIHsKKyAgICAgICAgICAgIENsYXNzTm9kZSBtYWluQ2xhc3MgPSBjcmVhdGVTdGF0ZW1lbnRzQ2xhc3MoKTsKKyAgICAgICAgICAgIGNyZWF0ZUNsYXNzRm9yU3RhdGVtZW50cyA9IGZhbHNlOworICAgICAgICAgICAgY2xhc3Nlcy5hZGQoMCwgbWFpbkNsYXNzKTsKKyAgICAgICAgICAgIG1haW5DbGFzcy5zZXRNb2R1bGUodGhpcyk7CisgICAgICAgICAgICBhZGRUb0NvbXBpbGVVbml0KG1haW5DbGFzcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNsYXNzZXM7CisgICAgfQorCisgICAgcHVibGljIExpc3QgZ2V0SW1wb3J0cygpIHsKKyAgICAgICAgcmV0dXJuIGltcG9ydHM7CisgICAgfQorCisgICAgcHVibGljIExpc3QgZ2V0SW1wb3J0UGFja2FnZXMoKSB7CisgICAgICAgIHJldHVybiBpbXBvcnRQYWNrYWdlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBjbGFzcyBuYW1lIGZvciB0aGUgZ2l2ZW4gYWxpYXMgb3IgbnVsbCBpZiBub25lIGlzIGF2YWlsYWJsZQorICAgICAqLworICAgIHB1YmxpYyBDbGFzc05vZGUgZ2V0SW1wb3J0KFN0cmluZyBhbGlhcykgeworICAgICAgICByZXR1cm4gKENsYXNzTm9kZSkgaW1wb3J0SW5kZXguZ2V0KGFsaWFzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRJbXBvcnQoU3RyaW5nIGFsaWFzLCBDbGFzc05vZGUgdHlwZSkgeworICAgICAgICBpbXBvcnRzLmFkZChuZXcgSW1wb3J0Tm9kZSh0eXBlLCBhbGlhcykpOworICAgICAgICBpbXBvcnRJbmRleC5wdXQoYWxpYXMsIHR5cGUpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmdbXSAgYWRkSW1wb3J0UGFja2FnZShTdHJpbmcgcGFja2FnZU5hbWUpIHsKKyAgICAgICAgaW1wb3J0UGFja2FnZXMuYWRkKHBhY2thZ2VOYW1lKTsKKyAgICAgICAgcmV0dXJuIEVNUFRZX1NUUklOR19BUlJBWTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRTdGF0ZW1lbnQoU3RhdGVtZW50IG5vZGUpIHsKKyAgICAgICAgc3RhdGVtZW50QmxvY2suYWRkU3RhdGVtZW50KG5vZGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZENsYXNzKENsYXNzTm9kZSBub2RlKSB7CisgICAgICAgIGNsYXNzZXMuYWRkKG5vZGUpOworICAgICAgICBub2RlLnNldE1vZHVsZSh0aGlzKTsKKyAgICAgICAgYWRkVG9Db21waWxlVW5pdChub2RlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gbm9kZQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhZGRUb0NvbXBpbGVVbml0KENsYXNzTm9kZSBub2RlKSB7CisgICAgICAgIC8vIHJlZ2lzdGVyIHRoZSBuZXcgY2xhc3Mgd2l0aCB0aGUgY29tcGlsZSB1bml0CisgICAgICAgIGlmICh1bml0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHVuaXQuYWRkQ2xhc3Mobm9kZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRNZXRob2QoTWV0aG9kTm9kZSBub2RlKSB7CisgICAgICAgIG1ldGhvZHMuYWRkKG5vZGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0KEdyb292eUNvZGVWaXNpdG9yIHZpc2l0b3IpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgeworICAgICAgICByZXR1cm4gcGFja2FnZU5hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UGFja2FnZU5hbWUoU3RyaW5nIHBhY2thZ2VOYW1lKSB7CisgICAgICAgIHRoaXMucGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gaGFzUGFja2FnZU5hbWUoKXsKKyAgICAgICAgcmV0dXJuIHRoaXMucGFja2FnZU5hbWUgIT0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgU291cmNlVW5pdCBnZXRDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gY29udGV4dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSB1bmRlcmx5aW5nIGNoYXJhY3RlciBzdHJlYW0gZGVzY3JpcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICBpZiggY29udGV4dCAhPSBudWxsICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0TmFtZSgpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVzY3JpcHRpb247CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKKyAgICAgICAgLy8gREVQUkVDQVRFRCAtLSBjb250ZXh0LmdldE5hbWUoKSBpcyBub3cgc3VmZmljaWVudAorICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisgICAgfQorCisgICAgcHVibGljIENvbXBpbGVVbml0IGdldFVuaXQoKSB7CisgICAgICAgIHJldHVybiB1bml0OworICAgIH0KKworICAgIHZvaWQgc2V0VW5pdChDb21waWxlVW5pdCB1bml0KSB7CisgICAgICAgIHRoaXMudW5pdCA9IHVuaXQ7CisgICAgfQorCisgICAgcHJvdGVjdGVkIENsYXNzTm9kZSBjcmVhdGVTdGF0ZW1lbnRzQ2xhc3MoKSB7CisgICAgICAgIFN0cmluZyBuYW1lID0gZ2V0UGFja2FnZU5hbWUoKTsKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgbmFtZSA9ICIiOworICAgICAgICB9CisgICAgICAgIC8vIG5vdyBsZXRzIHVzZSB0aGUgZmlsZSBuYW1lIHRvIGRldGVybWluZSB0aGUgY2xhc3MgbmFtZQorICAgICAgICBpZiAoZ2V0RGVzY3JpcHRpb24oKSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2Fubm90IGdlbmVyYXRlIG1haW4oU3RyaW5nW10pIGNsYXNzIGZvciBzdGF0ZW1lbnRzIHdoZW4gd2UgaGF2ZSBubyBmaWxlIGRlc2NyaXB0aW9uIik7CisgICAgICAgIH0KKyAgICAgICAgbmFtZSArPSBleHRyYWN0Q2xhc3NGcm9tRmlsZURlc2NyaXB0aW9uKCk7CisKKyAgICAgICAgU3RyaW5nIGJhc2VDbGFzc05hbWUgPSBudWxsOworICAgICAgICBpZiAodW5pdCAhPSBudWxsKSBiYXNlQ2xhc3NOYW1lID0gdW5pdC5nZXRDb25maWcoKS5nZXRTY3JpcHRCYXNlQ2xhc3MoKTsKKyAgICAgICAgQ2xhc3NOb2RlIGJhc2VDbGFzcyA9IG51bGw7CisgICAgICAgIGlmIChiYXNlQ2xhc3NOYW1lIT1udWxsKSB7CisgICAgICAgICAgICBiYXNlQ2xhc3MgPSBDbGFzc0hlbHBlci5tYWtlKGJhc2VDbGFzc05hbWUpOworICAgICAgICB9CisgICAgICAgIGlmIChiYXNlQ2xhc3MgPT0gbnVsbCkgeworICAgICAgICAgICAgYmFzZUNsYXNzID0gQ2xhc3NIZWxwZXIuU0NSSVBUX1RZUEU7CisgICAgICAgIH0KKyAgICAgICAgQ2xhc3NOb2RlIGNsYXNzTm9kZSA9IG5ldyBDbGFzc05vZGUobmFtZSwgQUNDX1BVQkxJQywgYmFzZUNsYXNzKTsKKyAgICAgICAgY2xhc3NOb2RlLnNldFNjcmlwdCh0cnVlKTsKKyAgICAgICAgY2xhc3NOb2RlLnNldFNjcmlwdEJvZHkodHJ1ZSk7CisKKyAgICAgICAgLy8gcmV0dXJuIG5ldyBGb28obmV3IFNoZWxsQ29udGV4dChhcmdzKSkucnVuKCkKKyAgICAgICAgY2xhc3NOb2RlLmFkZE1ldGhvZCgKKyAgICAgICAgICAgIG5ldyBNZXRob2ROb2RlKAorICAgICAgICAgICAgICAgICJtYWluIiwKKyAgICAgICAgICAgICAgICBBQ0NfUFVCTElDIHwgQUNDX1NUQVRJQywKKyAgICAgICAgICAgICAgICBDbGFzc0hlbHBlci5WT0lEX1RZUEUsCisgICAgICAgICAgICAgICAgbmV3IFBhcmFtZXRlcltdIHsgbmV3IFBhcmFtZXRlcihDbGFzc0hlbHBlci5TVFJJTkdfVFlQRS5tYWtlQXJyYXkoKSwgImFyZ3MiKX0sCisgICAgICAgICAgICAgICAgQ2xhc3NOb2RlLkVNUFRZX0FSUkFZLAorICAgICAgICAgICAgICAgIG5ldyBFeHByZXNzaW9uU3RhdGVtZW50KAorICAgICAgICAgICAgICAgICAgICBuZXcgTWV0aG9kQ2FsbEV4cHJlc3Npb24oCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NFeHByZXNzaW9uKENsYXNzSGVscGVyLm1ha2UoSW52b2tlckhlbHBlci5jbGFzcykpLAorICAgICAgICAgICAgICAgICAgICAgICAgInJ1blNjcmlwdCIsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXJndW1lbnRMaXN0RXhwcmVzc2lvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzRXhwcmVzc2lvbihjbGFzc05vZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVmFyaWFibGVFeHByZXNzaW9uKCJhcmdzIikpKSkpKTsKKworICAgICAgICBjbGFzc05vZGUuYWRkTWV0aG9kKAorICAgICAgICAgICAgbmV3IE1ldGhvZE5vZGUoInJ1biIsIEFDQ19QVUJMSUMsIENsYXNzSGVscGVyLk9CSkVDVF9UWVBFLCBQYXJhbWV0ZXIuRU1QVFlfQVJSQVksIENsYXNzTm9kZS5FTVBUWV9BUlJBWSwgc3RhdGVtZW50QmxvY2spKTsKKworICAgICAgICBjbGFzc05vZGUuYWRkQ29uc3RydWN0b3IoQUNDX1BVQkxJQywgUGFyYW1ldGVyLkVNUFRZX0FSUkFZLCBDbGFzc05vZGUuRU1QVFlfQVJSQVksIG5ldyBCbG9ja1N0YXRlbWVudCgpKTsKKyAgICAgICAgU3RhdGVtZW50IHN0bXQgPSBuZXcgRXhwcmVzc2lvblN0YXRlbWVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBNZXRob2RDYWxsRXhwcmVzc2lvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVmFyaWFibGVFeHByZXNzaW9uKCJzdXBlciIpLAorICAgICAgICAgICAgCQkJCSJzZXRCaW5kaW5nIiwKKyAgICAgICAgICAgIAkJCQluZXcgQXJndW1lbnRMaXN0RXhwcmVzc2lvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVmFyaWFibGVFeHByZXNzaW9uKCJjb250ZXh0IikpKSk7CisKKyAgICAgICAgY2xhc3NOb2RlLmFkZENvbnN0cnVjdG9yKAorICAgICAgICAgICAgQUNDX1BVQkxJQywKKyAgICAgICAgICAgIG5ldyBQYXJhbWV0ZXJbXSB7IG5ldyBQYXJhbWV0ZXIoQ2xhc3NIZWxwZXIubWFrZShCaW5kaW5nLmNsYXNzKSwgImNvbnRleHQiKX0sCisJCQlDbGFzc05vZGUuRU1QVFlfQVJSQVksCisgICAgICAgICAgICBzdG10KTsKKworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtZXRob2RzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgTWV0aG9kTm9kZSBub2RlID0gKE1ldGhvZE5vZGUpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgaW50IG1vZGlmaWVycyA9IG5vZGUuZ2V0TW9kaWZpZXJzKCk7CisgICAgICAgICAgICBpZiAoKG1vZGlmaWVycyAmIEFDQ19BQlNUUkFDVCkgIT0gMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHVzZSBhYnN0cmFjdCBtZXRob2RzIGluIGEgc2NyaXB0LCB0aGV5IGFyZSBvbmx5IGF2YWlsYWJsZSBpbnNpZGUgY2xhc3Nlcy4gTWV0aG9kOiAiCisgICAgICAgICAgICAgICAgICAgICAgICArIG5vZGUuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGJyOiB0aGUgb2xkIGxvZ2ljIHNlZW1zIHRvIGFkZCBzdGF0aWMgdG8gYWxsIGRlZiBmKCkuLi4uIGluIGEgc2NyaXB0LCB3aGljaCBtYWtlcyBlbmNsb3NpbmcKKyAgICAgICAgICAgIC8vIGlubmVyIGNsYXNzZXMgKGluY2x1ZGluZyBjbG9zdXJlcykgaW4gYSBkZWYgZnVuY3Rpb24gZGlmZmljdWx0LiBDb21tZW50IGl0IG91dC4KKyAgICAgICAgICAgIG5vZGUuc2V0TW9kaWZpZXJzKG1vZGlmaWVycyAvKnwgQUNDX1NUQVRJQyovKTsKKworICAgICAgICAgICAgY2xhc3NOb2RlLmFkZE1ldGhvZChub2RlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2xhc3NOb2RlOworICAgIH0KKworICAgIHByb3RlY3RlZCBTdHJpbmcgZXh0cmFjdENsYXNzRnJvbUZpbGVEZXNjcmlwdGlvbigpIHsKKyAgICAgICAgLy8gbGV0cyBzdHJpcCBvZmYgZXZlcnl0aGluZyBhZnRlciB0aGUgbGFzdCAuCisgICAgICAgIFN0cmluZyBhbnN3ZXIgPSBnZXREZXNjcmlwdGlvbigpOworICAgICAgICBpbnQgaWR4ID0gYW5zd2VyLmxhc3RJbmRleE9mKCcuJyk7CisgICAgICAgIGlmIChpZHggPiAwKSB7CisgICAgICAgICAgICBhbnN3ZXIgPSBhbnN3ZXIuc3Vic3RyaW5nKDAsIGlkeCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gbmV3IGxldHMgdHJpcCB0aGUgcGF0aCBzZXBhcmF0b3JzCisgICAgICAgIGlkeCA9IGFuc3dlci5sYXN0SW5kZXhPZignLycpOworICAgICAgICBpZiAoaWR4ID49IDApIHsKKyAgICAgICAgICAgIGFuc3dlciA9IGFuc3dlci5zdWJzdHJpbmcoaWR4ICsgMSk7CisgICAgICAgIH0KKyAgICAgICAgaWR4ID0gYW5zd2VyLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yQ2hhcik7CisgICAgICAgIGlmIChpZHggPj0gMCkgeworICAgICAgICAgICAgYW5zd2VyID0gYW5zd2VyLnN1YnN0cmluZyhpZHggKyAxKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYW5zd2VyOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CisgICAgICAgIHJldHVybiBjbGFzc2VzLmlzRW1wdHkoKSAmJiBzdGF0ZW1lbnRCbG9jay5nZXRTdGF0ZW1lbnRzKCkuaXNFbXB0eSgpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzb3J0Q2xhc3NlcygpeworICAgIAlpZiAoaXNFbXB0eSgpKSByZXR1cm47CisgICAgCUxpc3QgY2xhc3NlcyA9IGdldENsYXNzZXMoKTsKKyAgICAJTGlua2VkTGlzdCBzb3J0ZWQgPSBuZXcgTGlua2VkTGlzdCgpOworICAgIAlpbnQgbGV2ZWw9MTsKKyAgICAJd2hpbGUgKCFjbGFzc2VzLmlzRW1wdHkoKSkgeworCSAgICAJZm9yIChJdGVyYXRvciBjbmkgPSBjbGFzc2VzLml0ZXJhdG9yKCk7IGNuaS5oYXNOZXh0KCk7KSB7CisJCQkJQ2xhc3NOb2RlIGNuID0gKENsYXNzTm9kZSkgY25pLm5leHQoKTsKKwkJCQlDbGFzc05vZGUgc24gPSBjbjsKKwkJCQlmb3IgKGludCBpPTA7IHNuIT1udWxsICYmIGk8bGV2ZWw7IGkrKykgc24gPSBzbi5nZXRTdXBlckNsYXNzKCk7CisJCQkJaWYgKHNuIT1udWxsICYmIHNuLmlzUHJpbWFyeUNsYXNzTm9kZSgpKSBjb250aW51ZTsKKwkJCQljbmkucmVtb3ZlKCk7CisJCQkJc29ydGVkLmFkZExhc3QoY24pOworCQkJfQorCSAgICAJbGV2ZWwrKzsKKyAgICAJfQorICAgIAl0aGlzLmNsYXNzZXMgPSBzb3J0ZWQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGFzSW1wb3J0c1Jlc29sdmVkKCkgeworICAgICAgICByZXR1cm4gaW1wb3J0c1Jlc29sdmVkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEltcG9ydHNSZXNvbHZlZChib29sZWFuIGltcG9ydHNSZXNvbHZlZCkgeworICAgICAgICB0aGlzLmltcG9ydHNSZXNvbHZlZCA9IGltcG9ydHNSZXNvbHZlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgTWFwIGdldFN0YXRpY0ltcG9ydEFsaWFzZXMoKSB7CisgICAgICAgIHJldHVybiBzdGF0aWNJbXBvcnRBbGlhc2VzOworICAgIH0KKworICAgIHB1YmxpYyBNYXAgZ2V0U3RhdGljSW1wb3J0Q2xhc3NlcygpIHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY0ltcG9ydENsYXNzZXM7CisgICAgfQorCisgICAgcHVibGljIE1hcCBnZXRTdGF0aWNJbXBvcnRGaWVsZHMoKSB7CisgICAgICAgIHJldHVybiBzdGF0aWNJbXBvcnRGaWVsZHM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkU3RhdGljTWV0aG9kT3JGaWVsZChDbGFzc05vZGUgdHlwZSwgU3RyaW5nIGZpZWxkTmFtZSwgU3RyaW5nIGFsaWFzKSB7CisgICAgICAgIHN0YXRpY0ltcG9ydEFsaWFzZXMucHV0KGFsaWFzLCB0eXBlKTsKKyAgICAgICAgc3RhdGljSW1wb3J0RmllbGRzLnB1dChhbGlhcywgZmllbGROYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRTdGF0aWNJbXBvcnRDbGFzcyhTdHJpbmcgbmFtZSwgQ2xhc3NOb2RlIHR5cGUpIHsKKyAgICAgICAgc3RhdGljSW1wb3J0Q2xhc3Nlcy5wdXQobmFtZSwgdHlwZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L1BhcmFtZXRlci5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L1BhcmFtZXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NjdmNjUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvUGFyYW1ldGVyLmphdmEKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdDsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHIuKjsKKworCisvKioKKyAqIFJlcHJlc2VudHMgYSBwYXJhbWV0ZXIgb24gYSBjb25zdHJ1Y3RvciBvciBtZXRob2QgY2FsbC4gVGhlIHR5cGUgbmFtZSBpcworICogb3B0aW9uYWwgLSBpdCBkZWZhdWx0cyB0byBqYXZhLmxhbmcuT2JqZWN0IGlmIHVua25vd24uCisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBQYXJhbWV0ZXIgZXh0ZW5kcyBBbm5vdGF0ZWROb2RlIGltcGxlbWVudHMgVmFyaWFibGUgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJhbWV0ZXJbXSBFTVBUWV9BUlJBWSA9IHsKKyAgICB9OworCisgICAgcHJpdmF0ZSBDbGFzc05vZGUgdHlwZTsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworICAgIHByaXZhdGUgYm9vbGVhbiBkeW5hbWljVHlwZWQ7CisgICAgcHJpdmF0ZSBFeHByZXNzaW9uIGRlZmF1bHRWYWx1ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gaGFzRGVmYXVsdFZhbHVlOworICAgIHByaXZhdGUgYm9vbGVhbiBpblN0YXRpY0NvbnRleHQ7CisgICAgcHJpdmF0ZSBib29sZWFuIGNsb3N1cmVTaGFyZT1mYWxzZTsKKworICAgIHB1YmxpYyBQYXJhbWV0ZXIoQ2xhc3NOb2RlIHR5cGUsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuc2V0VHlwZSh0eXBlKTsKKyAgICAgICAgdGhpcy5oYXNEZWZhdWx0VmFsdWUgPSBmYWxzZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIFBhcmFtZXRlcihDbGFzc05vZGUgdHlwZSwgU3RyaW5nIG5hbWUsIEV4cHJlc3Npb24gZGVmYXVsdFZhbHVlKSB7CisgICAgICAgIHRoaXModHlwZSxuYW1lKTsKKyAgICAgICAgdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7CisgICAgICAgIHRoaXMuaGFzRGVmYXVsdFZhbHVlID0gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gc3VwZXIudG9TdHJpbmcoKSArICJbbmFtZToiICsgbmFtZSArICgodHlwZSA9PSBudWxsKSA/ICIiIDogIiB0eXBlOiAiICsgdHlwZS5nZXROYW1lKCkpICsgIiwgaGFzRGVmYXVsdFZhbHVlOiAiICsgdGhpcy5oYXNJbml0aWFsRXhwcmVzc2lvbigpICsgIl0iOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgcHVibGljIENsYXNzTm9kZSBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gdHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKENsYXNzTm9kZSB0eXBlKSB7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgIGR5bmFtaWNUeXBlZCB8PSB0eXBlPT1DbGFzc0hlbHBlci5EWU5BTUlDX1RZUEU7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGhhc0luaXRpYWxFeHByZXNzaW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5oYXNEZWZhdWx0VmFsdWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUgZXhwcmVzc2lvbiBmb3IgdGhpcyBwYXJhbWV0ZXIgb3IgbnVsbCBpZgorICAgICAqIG5vIGRlZmF1bHQgdmFsdWUgaXMgc3BlY2lmaWVkCisgICAgICovCisgICAgcHVibGljIEV4cHJlc3Npb24gZ2V0SW5pdGlhbEV4cHJlc3Npb24oKSB7CisgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldEluaXRpYWxFeHByZXNzaW9uKEV4cHJlc3Npb24gaW5pdCkgeworICAgICAgICBkZWZhdWx0VmFsdWUgPSBpbml0OworICAgICAgICBpZiAoZGVmYXVsdFZhbHVlPT1udWxsKSBoYXNEZWZhdWx0VmFsdWU9ZmFsc2U7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGlzSW5TdGF0aWNDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gaW5TdGF0aWNDb250ZXh0OworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRJblN0YXRpY0NvbnRleHQoYm9vbGVhbiBpblN0YXRpY0NvbnRleHQpIHsKKyAgICAgICAgdGhpcy5pblN0YXRpY0NvbnRleHQgPSBpblN0YXRpY0NvbnRleHQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNEeW5hbWljVHlwZWQoKSB7CisgICAgICAgIHJldHVybiBkeW5hbWljVHlwZWQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNDbG9zdXJlU2hhcmVkVmFyaWFibGUoKSB7CisgICAgICAgIHJldHVybiBjbG9zdXJlU2hhcmU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2xvc3VyZVNoYXJlZFZhcmlhYmxlKGJvb2xlYW4gaW5DbG9zdXJlKSB7CisgICAgICAgIGNsb3N1cmVTaGFyZSA9IGluQ2xvc3VyZTsgICAgICAgIAorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9Qcm9wZXJ0eU5vZGUuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9Qcm9wZXJ0eU5vZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDM5ZTIzCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L1Byb3BlcnR5Tm9kZS5qYXZhCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5hc3Q7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByLio7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3Quc3RtdC4qOworaW1wb3J0IG9yZy5vYmplY3R3ZWIuYXNtLk9wY29kZXM7CisKKy8qKgorICogUmVwcmVzZW50cyBhIHByb3BlcnR5IChtZW1iZXIgdmFyaWFibGUsIGEgZ2V0dGVyIGFuZCBzZXR0ZXIpCisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBQcm9wZXJ0eU5vZGUgZXh0ZW5kcyBBbm5vdGF0ZWROb2RlIGltcGxlbWVudHMgT3Bjb2RlcyxWYXJpYWJsZSB7CisKKyAgICBwcml2YXRlIGZpbmFsIEZpZWxkTm9kZSBmaWVsZDsKKyAgICBwcml2YXRlIGZpbmFsIFN0YXRlbWVudCBnZXR0ZXJCbG9jazsKKyAgICBwcml2YXRlIGZpbmFsIFN0YXRlbWVudCBzZXR0ZXJCbG9jazsKKyAgICBwcml2YXRlIGZpbmFsIGludCBtb2RpZmllcnM7CisgICAgcHJpdmF0ZSBib29sZWFuIGNsb3N1cmVTaGFyZSA9IGZhbHNlOworCisgICAgcHVibGljIFByb3BlcnR5Tm9kZSgKKyAgICAgICAgU3RyaW5nIG5hbWUsIGludCBtb2RpZmllcnMsIENsYXNzTm9kZSB0eXBlLCBDbGFzc05vZGUgb3duZXIsCisgICAgICAgIEV4cHJlc3Npb24gaW5pdGlhbFZhbHVlRXhwcmVzc2lvbiwgU3RhdGVtZW50IGdldHRlckJsb2NrLAorICAgICAgICBTdGF0ZW1lbnQgc2V0dGVyQmxvY2spCisgICAgeworICAgICAgICB0aGlzKG5ldyBGaWVsZE5vZGUobmFtZSwgbW9kaWZpZXJzICYgQUNDX1NUQVRJQywgdHlwZSwgb3duZXIsIGluaXRpYWxWYWx1ZUV4cHJlc3Npb24pLCBtb2RpZmllcnMsIGdldHRlckJsb2NrLCBzZXR0ZXJCbG9jayk7CisgICAgfQorCisgICAgcHVibGljIFByb3BlcnR5Tm9kZShGaWVsZE5vZGUgZmllbGQsIGludCBtb2RpZmllcnMsIFN0YXRlbWVudCBnZXR0ZXJCbG9jaywgU3RhdGVtZW50IHNldHRlckJsb2NrKSB7CisgICAgICAgIHRoaXMuZmllbGQgPSBmaWVsZDsKKyAgICAgICAgdGhpcy5tb2RpZmllcnMgPSBtb2RpZmllcnM7CisgICAgICAgIHRoaXMuZ2V0dGVyQmxvY2sgPSBnZXR0ZXJCbG9jazsKKyAgICAgICAgdGhpcy5zZXR0ZXJCbG9jayA9IHNldHRlckJsb2NrOworICAgIH0KKworICAgIHB1YmxpYyBTdGF0ZW1lbnQgZ2V0R2V0dGVyQmxvY2soKSB7CisgICAgICAgIHJldHVybiBnZXR0ZXJCbG9jazsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBnZXRJbml0aWFsRXhwcmVzc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIGZpZWxkLmdldEluaXRpYWxFeHByZXNzaW9uKCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRNb2RpZmllcnMoKSB7CisgICAgICAgIHJldHVybiBtb2RpZmllcnM7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gZmllbGQuZ2V0TmFtZSgpOworICAgIH0KKworICAgIHB1YmxpYyBTdGF0ZW1lbnQgZ2V0U2V0dGVyQmxvY2soKSB7CisgICAgICAgIHJldHVybiBzZXR0ZXJCbG9jazsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3NOb2RlIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiBmaWVsZC5nZXRUeXBlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VHlwZShDbGFzc05vZGUgdCkgeworICAgICAgICBmaWVsZC5zZXRUeXBlKHQpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgRmllbGROb2RlIGdldEZpZWxkKCkgeworICAgICAgICByZXR1cm4gZmllbGQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNQcml2YXRlKCkgeworICAgICAgICByZXR1cm4gKG1vZGlmaWVycyAmIEFDQ19QUklWQVRFKSAhPSAwOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YXRpYygpIHsKKyAgICAgICAgcmV0dXJuIChtb2RpZmllcnMgJiBBQ0NfU1RBVElDKSAhPSAwOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc0luaXRpYWxFeHByZXNzaW9uKCkgeworICAgICAgICByZXR1cm4gZmllbGQuaGFzSW5pdGlhbEV4cHJlc3Npb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0luU3RhdGljQ29udGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIGZpZWxkLmlzSW5TdGF0aWNDb250ZXh0KCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNEeW5hbWljVHlwZWQoKSB7CisgICAgICAgIHJldHVybiBmaWVsZC5pc0R5bmFtaWNUeXBlZCgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzQ2xvc3VyZVNoYXJlZFZhcmlhYmxlKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldENsb3N1cmVTaGFyZWRWYXJpYWJsZShib29sZWFuIGluQ2xvc3VyZSkgeworICAgICAgICBjbG9zdXJlU2hhcmUgPSBpbkNsb3N1cmU7ICAgICAgICAKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvVmFyaWFibGUuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9WYXJpYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNDk2OTkKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvVmFyaWFibGUuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5hc3Q7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByLkV4cHJlc3Npb247CisKKy8qKgorICogaW50ZXJmYWNlIHRvIG1hcmsgYSBBc3ROb2RlIGFzIFZhcmlhYmxlLiBUeXBpY2FsbHkgdGhlc2UgYXJlIAorICogVmFyaWFibGVFeHByZXNzaW9uLCBGaWVsZE5vZGUsIFByb3BlcnR5Tm9kZSBhbmQgUGFyYW1ldGVyCisgKiAKKyAqIEBhdXRob3IgSm9jaGVuIFRoZW9kb3JvdQorICovCitwdWJsaWMgaW50ZXJmYWNlIFZhcmlhYmxlIHsKKyAgICAKKyAgICAvKioKKyAgICAgKiB0aGUgdHlwZSBvZiB0aGUgdmFyaWFibGUKKyAgICAgKi8KKyAgICBDbGFzc05vZGUgZ2V0VHlwZSgpOworICAgIAorICAgIC8qKgorICAgICAqIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZQorICAgICAqLworICAgIFN0cmluZyBnZXROYW1lKCk7CisgICAgCisgICAgLyoqCisgICAgICogZXhwcmVzc2lvbiB1c2VkIHRvIGluaXRpYWxpemUgdGhlIHZhcmlhYmxlIG9yIG51bGwgb2YgdGhlcmUKKyAgICAgKiBpcyBubyBpbml0aWFsaXphdGlvbi4KKyAgICAgKi8KKyAgICBFeHByZXNzaW9uIGdldEluaXRpYWxFeHByZXNzaW9uKCk7CisgICAgCisgICAgLyoqCisgICAgICogcmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIGFuIGluaXRpYWxpemF0aW9uIGV4cHJlc3Npb24KKyAgICAgKi8KKyAgICBib29sZWFuIGhhc0luaXRpYWxFeHByZXNzaW9uKCk7CisgICAgCisgICAgLyoqCisgICAgICogcmV0dXJucyB0cnVlIGlmIHRoaXMgdmFyaWFibGUgaXMgdXNlZCBpbiBhIHN0YXRpYyBjb250ZXh0LgorICAgICAqIEEgc3RhdGljIGNvbnRleHQgaXMgYW55IHN0YXRpYyBpbml0aWFsaXplciBibG9jaywgd2hlbiB0aGlzIHZhcmlhYmxlCisgICAgICogaXMgZGVjbGFyZWQgYXMgc3RhdGljIG9yIHdoZW4gdGhpcyB2YXJpYWJsZSBpcyB1c2VkIGluIGEgc3RhdGljIG1ldGhvZCAKKyAgICAgKi8KKyAgICBib29sZWFuIGlzSW5TdGF0aWNDb250ZXh0KCk7CisKKyAgICBib29sZWFuIGlzRHluYW1pY1R5cGVkKCk7CisgICAgYm9vbGVhbiBpc0Nsb3N1cmVTaGFyZWRWYXJpYWJsZSgpOworICAgIHZvaWQgc2V0Q2xvc3VyZVNoYXJlZFZhcmlhYmxlKGJvb2xlYW4gaW5DbG9zdXJlKTsKKyAgICAKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9WYXJpYWJsZVNjb3BlLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvVmFyaWFibGVTY29wZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNjE4YzYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvVmFyaWFibGVTY29wZS5qYXZhCkBAIC0wLDAgKzEsMTU1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5hc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogUmVwcmVzZW50cyBhIHZhcmlhYmxlIHNjb3BlLiBUaGlzIGlzIHByaW1hcmlseSB1c2VkIHRvIGRldGVybWluZSB2YXJpYWJsZSBzaGFyaW5nCisgKiBhY3Jvc3MgbWV0aG9kIGFuZCBjbG9zdXJlIGJvdW5kYXJpZXMuCisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEBhdXRob3IgSm9jaGVuIFRoZW9kb3JvdQorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgVmFyaWFibGVTY29wZSAgeworICAgIHByaXZhdGUgTWFwIGRlY2xhcmVkVmFyaWFibGVzID0gQ29sbGVjdGlvbnMuRU1QVFlfTUFQOworICAgIHByaXZhdGUgTWFwIHJlZmVyZW5jZWRMb2NhbFZhcmlhYmxlcyA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKKyAgICBwcml2YXRlIE1hcCByZWZlcmVuY2VkQ2xhc3NWYXJpYWJsZXMgPSBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7CisgCisgICAgcHJpdmF0ZSBib29sZWFuIGluU3RhdGljQ29udGV4dCA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiByZXNvbHZlc0R5bmFtaWMgPSBmYWxzZTsgCisgICAgcHJpdmF0ZSBDbGFzc05vZGUgY2xhenpTY29wZTsKKyAgICBwcml2YXRlIFZhcmlhYmxlU2NvcGUgcGFyZW50OworCisgICAgcHVibGljIFZhcmlhYmxlU2NvcGUoKSB7CisgICAgfQorICAgIHB1YmxpYyBWYXJpYWJsZVNjb3BlKFZhcmlhYmxlU2NvcGUgcGFyZW50KSB7CisgICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OworICAgIH0KKworICAgIHB1YmxpYyBWYXJpYWJsZSBnZXREZWNsYXJlZFZhcmlhYmxlKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiAoVmFyaWFibGUpIGRlY2xhcmVkVmFyaWFibGVzLmdldChuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlZmVyZW5jZWRMb2NhbFZhcmlhYmxlKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiByZWZlcmVuY2VkTG9jYWxWYXJpYWJsZXMuY29udGFpbnNLZXkobmFtZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGlzUmVmZXJlbmNlZENsYXNzVmFyaWFibGUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIHJlZmVyZW5jZWRDbGFzc1ZhcmlhYmxlcy5jb250YWluc0tleShuYW1lKTsKKyAgICB9CisgICAgcHVibGljIFZhcmlhYmxlU2NvcGUgZ2V0UGFyZW50KCkgeworICAgICAgICByZXR1cm4gcGFyZW50OworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzSW5TdGF0aWNDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gaW5TdGF0aWNDb250ZXh0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEluU3RhdGljQ29udGV4dChib29sZWFuIGluU3RhdGljQ29udGV4dCkgeworICAgICAgICB0aGlzLmluU3RhdGljQ29udGV4dCA9IGluU3RhdGljQ29udGV4dDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Jlc29sdmluZ0R5bmFtaWMoKSB7CisgICAgICAgIHJldHVybiByZXNvbHZlc0R5bmFtaWM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RHluYW1pY1Jlc29sdmluZyhib29sZWFuIHJlc29sdmVzRHluYW1pYykgeworICAgICAgICB0aGlzLnJlc29sdmVzRHluYW1pYyA9IHJlc29sdmVzRHluYW1pYzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc1Njb3BlKENsYXNzTm9kZSBub2RlKSB7CisgICAgICAgIHRoaXMuY2xhenpTY29wZSA9IG5vZGU7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBDbGFzc05vZGUgZ2V0Q2xhc3NTY29wZSgpeworICAgICAgICByZXR1cm4gY2xhenpTY29wZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gaXNDbGFzc1Njb3BlKCl7CisgICAgICAgIHJldHVybiBjbGF6elNjb3BlIT1udWxsOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Jvb3QoKSB7CisgICAgICAgIHJldHVybiBwYXJlbnQ9PW51bGw7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBWYXJpYWJsZVNjb3BlIGNvcHkoKSB7CisgICAgICAgIFZhcmlhYmxlU2NvcGUgY29weSA9IG5ldyBWYXJpYWJsZVNjb3BlKCk7CisgICAgICAgIGNvcHkuY2xhenpTY29wZSA9IGNsYXp6U2NvcGU7CisgICAgICAgIGlmIChkZWNsYXJlZFZhcmlhYmxlcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgY29weS5kZWNsYXJlZFZhcmlhYmxlcyA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgICAgY29weS5kZWNsYXJlZFZhcmlhYmxlcy5wdXRBbGwoZGVjbGFyZWRWYXJpYWJsZXMpOworICAgICAgICB9CisgICAgICAgIGNvcHkuaW5TdGF0aWNDb250ZXh0ID0gaW5TdGF0aWNDb250ZXh0OworICAgICAgICBjb3B5LnBhcmVudCA9IHBhcmVudDsKKyAgICAgICAgaWYgKHJlZmVyZW5jZWRDbGFzc1ZhcmlhYmxlcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBjb3B5LnJlZmVyZW5jZWRDbGFzc1ZhcmlhYmxlcyA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgICAgICBjb3B5LnJlZmVyZW5jZWRDbGFzc1ZhcmlhYmxlcy5wdXRBbGwocmVmZXJlbmNlZENsYXNzVmFyaWFibGVzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVmZXJlbmNlZExvY2FsVmFyaWFibGVzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIGNvcHkucmVmZXJlbmNlZExvY2FsVmFyaWFibGVzID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgICAgIGNvcHkucmVmZXJlbmNlZExvY2FsVmFyaWFibGVzLnB1dEFsbChyZWZlcmVuY2VkTG9jYWxWYXJpYWJsZXMpOworICAgICAgICB9CisgICAgICAgIGNvcHkucmVzb2x2ZXNEeW5hbWljID0gcmVzb2x2ZXNEeW5hbWljOworICAgICAgICByZXR1cm4gY29weTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwdXREZWNsYXJlZFZhcmlhYmxlKFZhcmlhYmxlIHZhcikgeworICAgICAgICBpZiAoZGVjbGFyZWRWYXJpYWJsZXMgPT0gQ29sbGVjdGlvbnMuRU1QVFlfTUFQKQorICAgICAgICAgIGRlY2xhcmVkVmFyaWFibGVzID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgZGVjbGFyZWRWYXJpYWJsZXMucHV0KHZhci5nZXROYW1lKCksIHZhcik7CisgICAgfQorCisgICAgcHVibGljIEl0ZXJhdG9yIGdldFJlZmVyZW5jZWRMb2NhbFZhcmlhYmxlc0l0ZXJhdG9yKCkgeworICAgICAgICByZXR1cm4gcmVmZXJlbmNlZExvY2FsVmFyaWFibGVzLnZhbHVlcygpLml0ZXJhdG9yKCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRSZWZlcmVuY2VkTG9jYWxWYXJpYWJsZXNDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIHJlZmVyZW5jZWRMb2NhbFZhcmlhYmxlcy5zaXplKCk7CisgICAgfQorCisgICAgcHVibGljIFZhcmlhYmxlIGdldFJlZmVyZW5jZWRMb2NhbFZhcmlhYmxlKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiAoVmFyaWFibGUpIHJlZmVyZW5jZWRMb2NhbFZhcmlhYmxlcy5nZXQobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHV0UmVmZXJlbmNlZExvY2FsVmFyaWFibGUoVmFyaWFibGUgdmFyKSB7CisgICAgICAgIGlmIChyZWZlcmVuY2VkTG9jYWxWYXJpYWJsZXMgPT0gQ29sbGVjdGlvbnMuRU1QVFlfTUFQKQorICAgICAgICAgIHJlZmVyZW5jZWRMb2NhbFZhcmlhYmxlcyA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIHJlZmVyZW5jZWRMb2NhbFZhcmlhYmxlcy5wdXQodmFyLmdldE5hbWUoKSwgdmFyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwdXRSZWZlcmVuY2VkQ2xhc3NWYXJpYWJsZShWYXJpYWJsZSB2YXIpIHsKKyAgICAgICAgaWYgKHJlZmVyZW5jZWRDbGFzc1ZhcmlhYmxlcyA9PSBDb2xsZWN0aW9ucy5FTVBUWV9NQVApCisgICAgICAgICAgcmVmZXJlbmNlZENsYXNzVmFyaWFibGVzID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgcmVmZXJlbmNlZENsYXNzVmFyaWFibGVzLnB1dCh2YXIuZ2V0TmFtZSgpLCB2YXIpOworICAgIH0KKworICAgIHB1YmxpYyBWYXJpYWJsZSBnZXRSZWZlcmVuY2VkQ2xhc3NWYXJpYWJsZShTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gKFZhcmlhYmxlKSByZWZlcmVuY2VkQ2xhc3NWYXJpYWJsZXMuZ2V0KG5hbWUpOyAKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZVJlZmVyZW5jZWRDbGFzc1ZhcmlhYmxlKFN0cmluZyBuYW1lKSB7CisgICAgICAgIGlmIChyZWZlcmVuY2VkQ2xhc3NWYXJpYWJsZXMgPT0gQ29sbGVjdGlvbnMuRU1QVFlfTUFQKQorICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBlbHNlCisgICAgICAgICAgcmV0dXJuIHJlZmVyZW5jZWRDbGFzc1ZhcmlhYmxlcy5yZW1vdmUobmFtZSk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL0Fubm90YXRpb25Db25zdGFudEV4cHJlc3Npb24uamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL0Fubm90YXRpb25Db25zdGFudEV4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjJiOGYyCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L2V4cHIvQW5ub3RhdGlvbkNvbnN0YW50RXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qDQorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5NYXA7DQorDQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LkFubm90YXRpb25Ob2RlOw0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5Hcm9vdnlDb2RlVmlzaXRvcjsNCisNCisNCisvKioNCisgKiBSZXByZXNlbnRzIGFuIGFubm90YXRpb24gImNvbnN0YW50IiB0aGF0IG1heSBhcHBlYXIgaW4gYW5ub3RhdGlvbiBhdHRyaWJ1dGVzIA0KKyAqIChtYWlubHkgdXNlZCBhcyBhIG1hcmtlcikuDQorICogDQorICogQGF1dGhvciA8YSBocmVmPSdtYWlsdG86dGhlW2RvdF1taW5kc3Rvcm1bYXRdZ21haWxbZG90XWNvbSc+QWxleCBQb3Blc2N1PC9hPg0KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMzI2NCAkDQorICovDQorcHVibGljIGNsYXNzIEFubm90YXRpb25Db25zdGFudEV4cHJlc3Npb24gZXh0ZW5kcyBDb25zdGFudEV4cHJlc3Npb24gew0KKyAgICBwdWJsaWMgQW5ub3RhdGlvbkNvbnN0YW50RXhwcmVzc2lvbihBbm5vdGF0aW9uTm9kZSBub2RlKSB7DQorICAgICAgICBzdXBlcihub2RlKTsNCisgICAgICAgIHNldFR5cGUobm9kZS5nZXRDbGFzc05vZGUoKSk7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KEdyb292eUNvZGVWaXNpdG9yIHZpc2l0b3IpIHsNCisgICAgICAgIEFubm90YXRpb25Ob2RlIG5vZGUgPSAoQW5ub3RhdGlvbk5vZGUpIGdldFZhbHVlKCk7DQorICAgICAgICBNYXAgYXR0cnMgPSBub2RlLmdldE1lbWJlcnMoKTsNCisgICAgICAgIGZvcihJdGVyYXRvciBpdCA9IGF0dHJzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7DQorICAgICAgICAgICAgKChFeHByZXNzaW9uKSBpdC5uZXh0KCkpLnZpc2l0KHZpc2l0b3IpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL0FyZ3VtZW50TGlzdEV4cHJlc3Npb24uamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL0FyZ3VtZW50TGlzdEV4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDU0NDE0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L2V4cHIvQXJndW1lbnRMaXN0RXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5Hcm9vdnlDb2RlVmlzaXRvcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5QYXJhbWV0ZXI7CisKKy8qKgorICogUmVwcmVzZW50cyBvbmUgb3IgbW9yZSBhcmd1bWVudHMgYmVpbmcgcGFzc2VkIGludG8gYSBtZXRob2QKKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIEFyZ3VtZW50TGlzdEV4cHJlc3Npb24gZXh0ZW5kcyBUdXBsZUV4cHJlc3Npb24geworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9BUlJBWSA9IHsKKyAgICB9OworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQXJndW1lbnRMaXN0RXhwcmVzc2lvbiBFTVBUWV9BUkdVTUVOVFMgPSBuZXcgQXJndW1lbnRMaXN0RXhwcmVzc2lvbigpOworCisgICAgcHVibGljIEFyZ3VtZW50TGlzdEV4cHJlc3Npb24oKSB7CisgICAgfQorCisgICAgcHVibGljIEFyZ3VtZW50TGlzdEV4cHJlc3Npb24oTGlzdCBleHByZXNzaW9ucykgeworICAgICAgICBzdXBlcihleHByZXNzaW9ucyk7CisgICAgfQorCisgICAgcHVibGljIEFyZ3VtZW50TGlzdEV4cHJlc3Npb24oRXhwcmVzc2lvbltdIGV4cHJlc3Npb25zKSB7CisgICAgICAgIHN1cGVyKGV4cHJlc3Npb25zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQXJndW1lbnRMaXN0RXhwcmVzc2lvbihQYXJhbWV0ZXJbXSBwYXJhbWV0ZXJzKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IHBhcmFtZXRlcnNbaV07CisgICAgICAgICAgICBhZGRFeHByZXNzaW9uKG5ldyBWYXJpYWJsZUV4cHJlc3Npb24ocGFyYW1ldGVyLmdldE5hbWUoKSkpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBBcmd1bWVudExpc3RFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcikgeworICAgICAgICBzdXBlcihleHByKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQXJndW1lbnRMaXN0RXhwcmVzc2lvbihFeHByZXNzaW9uIGV4cHIxLCBFeHByZXNzaW9uIGV4cHIyKSB7CisgICAgICAgIHN1cGVyKGV4cHIxLCBleHByMik7CisgICAgfQorCisgICAgcHVibGljIEFyZ3VtZW50TGlzdEV4cHJlc3Npb24oRXhwcmVzc2lvbiBleHByMSwgRXhwcmVzc2lvbiBleHByMiwgRXhwcmVzc2lvbiBleHByMykgeworICAgICAgICBzdXBlcihleHByMSwgZXhwcjIsIGV4cHIzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiB0cmFuc2Zvcm1FeHByZXNzaW9uKEV4cHJlc3Npb25UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lcikgeworICAgICAgICBFeHByZXNzaW9uIHJldCA9IG5ldyBBcmd1bWVudExpc3RFeHByZXNzaW9uKHRyYW5zZm9ybUV4cHJlc3Npb25zKGdldEV4cHJlc3Npb25zKCksIHRyYW5zZm9ybWVyKSk7CisgICAgICAgIHJldC5zZXRTb3VyY2VQb3NpdGlvbih0aGlzKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdmlzaXQoR3Jvb3Z5Q29kZVZpc2l0b3IgdmlzaXRvcikgeworICAgICAgICB2aXNpdG9yLnZpc2l0QXJndW1lbnRsaXN0RXhwcmVzc2lvbih0aGlzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvZXhwci9BcnJheUV4cHJlc3Npb24uamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL0FycmF5RXhwcmVzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjOWM0NDkKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvZXhwci9BcnJheUV4cHJlc3Npb24uamF2YQpAQCAtMCwwICsxLDEzOCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuQ2xhc3NOb2RlOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0Lkdyb292eUNvZGVWaXNpdG9yOworCisvKioKKyAqIFJlcHJlc2VudHMgYW4gYXJyYXkgb2JqZWN0IGNvbnN0cnVjdGlvbiBlaXRoZXIgdXNpbmcgYSBmaXhlZCBzaXplCisgKiBvciBhbiBpbml0aWFsaXplciBleHByZXNzaW9uCisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBBcnJheUV4cHJlc3Npb24gZXh0ZW5kcyBFeHByZXNzaW9uIHsKKyAgICBwcml2YXRlIExpc3QgZXhwcmVzc2lvbnM7CisgICAgcHJpdmF0ZSBMaXN0IHNpemVFeHByZXNzaW9uOworCisgICAgcHJpdmF0ZSBDbGFzc05vZGUgZWxlbWVudFR5cGU7CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3NOb2RlIG1ha2VBcnJheShDbGFzc05vZGUgYmFzZSwgTGlzdCBzaXplRXhwcmVzc2lvbikgeworICAgIAlDbGFzc05vZGUgcmV0ID0gYmFzZS5tYWtlQXJyYXkoKTsKKyAgICAJaWYgKHNpemVFeHByZXNzaW9uPT1udWxsKSByZXR1cm4gcmV0OworICAgIAlpbnQgc2l6ZSA9IHNpemVFeHByZXNzaW9uLnNpemUoKTsKKyAgICAJZm9yIChpbnQgaT0xOyBpPHNpemU7IGkrKykgeworICAgIAkJcmV0ID0gcmV0Lm1ha2VBcnJheSgpOworICAgIAl9CisgICAgCXJldHVybiByZXQ7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBBcnJheUV4cHJlc3Npb24oQ2xhc3NOb2RlIGVsZW1lbnRUeXBlLCBMaXN0IGV4cHJlc3Npb25zLCBMaXN0IHNpemVFeHByZXNzaW9uKSB7CisgICAgICAgIC8vZXhwZWN0IHRvIGdldCB0aGUgZWxlbWVudFR5cGUKKyAgICAgICAgc3VwZXIuc2V0VHlwZShtYWtlQXJyYXkoZWxlbWVudFR5cGUsc2l6ZUV4cHJlc3Npb24pKTsKKyAgICAgICAgaWYgKGV4cHJlc3Npb25zPT1udWxsKSBleHByZXNzaW9ucz1Db2xsZWN0aW9ucy5FTVBUWV9MSVNUOworICAgICAgICB0aGlzLmVsZW1lbnRUeXBlID0gZWxlbWVudFR5cGU7CisgICAgICAgIHRoaXMuZXhwcmVzc2lvbnMgPSBleHByZXNzaW9uczsKKyAgICAgICAgdGhpcy5zaXplRXhwcmVzc2lvbiA9IHNpemVFeHByZXNzaW9uOworICAgICAgICAKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gZXhwcmVzc2lvbnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBPYmplY3QgaXRlbSA9IGl0ZXIubmV4dCgpOworICAgICAgICAgICAgaWYgKGl0ZW0hPW51bGwgJiYgIShpdGVtIGluc3RhbmNlb2YgRXhwcmVzc2lvbikpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NDYXN0RXhjZXB0aW9uKCJJdGVtOiAiICsgaXRlbSArICIgaXMgbm90IGFuIEV4cHJlc3Npb24iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoc2l6ZUV4cHJlc3Npb24hPW51bGwpIHsKKwkgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHNpemVFeHByZXNzaW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworCSAgICAgICAgICAgIE9iamVjdCBpdGVtID0gaXRlci5uZXh0KCk7CisJICAgICAgICAgICAgaWYgKCEoaXRlbSBpbnN0YW5jZW9mIEV4cHJlc3Npb24pKSB7CisJICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc0Nhc3RFeGNlcHRpb24oIkl0ZW06ICIgKyBpdGVtICsgIiBpcyBub3QgYW4gRXhwcmVzc2lvbiIpOworCSAgICAgICAgICAgIH0KKwkgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIGFycmF5IHVzaW5nIGFuIGluaXRpYWxpemVyIGV4cHJlc3Npb24KKyAgICAgKi8KKyAgICBwdWJsaWMgQXJyYXlFeHByZXNzaW9uKENsYXNzTm9kZSBlbGVtZW50VHlwZSwgTGlzdCBleHByZXNzaW9ucykgeworICAgICAgICB0aGlzKGVsZW1lbnRUeXBlLGV4cHJlc3Npb25zLG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZEV4cHJlc3Npb24oRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisgICAgICAgIGV4cHJlc3Npb25zLmFkZChleHByZXNzaW9uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdCBnZXRFeHByZXNzaW9ucygpIHsKKyAgICAgICAgcmV0dXJuIGV4cHJlc3Npb25zOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0KEdyb292eUNvZGVWaXNpdG9yIHZpc2l0b3IpIHsKKyAgICAgICAgdmlzaXRvci52aXNpdEFycmF5RXhwcmVzc2lvbih0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0R5bmFtaWMoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiB0cmFuc2Zvcm1FeHByZXNzaW9uKEV4cHJlc3Npb25UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lcikgeworICAgIAlMaXN0IGV4cHJMaXN0ID0gdHJhbnNmb3JtRXhwcmVzc2lvbnMoZXhwcmVzc2lvbnMsIHRyYW5zZm9ybWVyKTsKKyAgICAJTGlzdCBzaXplcyA9IG51bGw7CisgICAgCWlmIChzaXplRXhwcmVzc2lvbiE9bnVsbCkgc2l6ZXMgPSB0cmFuc2Zvcm1FeHByZXNzaW9ucyhzaXplRXhwcmVzc2lvbix0cmFuc2Zvcm1lcik7CisgICAgICAgIEV4cHJlc3Npb24gcmV0ID0gbmV3IEFycmF5RXhwcmVzc2lvbihlbGVtZW50VHlwZSwgZXhwckxpc3QsIHNpemVzKTsKKyAgICAgICAgcmV0LnNldFNvdXJjZVBvc2l0aW9uKHRoaXMpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHB1YmxpYyBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oaW50IGkpIHsKKyAgICAgICAgT2JqZWN0IG9iamVjdCA9IGV4cHJlc3Npb25zLmdldChpKTsKKyAgICAgICAgcmV0dXJuIChFeHByZXNzaW9uKSBvYmplY3Q7CisgICAgfQorCisgICAgcHVibGljIENsYXNzTm9kZSBnZXRFbGVtZW50VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIGVsZW1lbnRUeXBlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCJbIik7CisgICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBleHByZXNzaW9ucy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCgoRXhwcmVzc2lvbikgaXRlci5uZXh0KCkpLmdldFRleHQoKSk7CisgICAgICAgIH0KKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiXSIpOworICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIExpc3QgZ2V0U2l6ZUV4cHJlc3Npb24oKSB7CisgICAgICAgIHJldHVybiBzaXplRXhwcmVzc2lvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gc3VwZXIudG9TdHJpbmcoKSArIGV4cHJlc3Npb25zOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL0F0dHJpYnV0ZUV4cHJlc3Npb24uamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL0F0dHJpYnV0ZUV4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmZlOWFmCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L2V4cHIvQXR0cmlidXRlRXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuR3Jvb3Z5Q29kZVZpc2l0b3I7CisKKworLyoqCisgKiBSZXByZXNlbnRzIGFuIGF0dHJpYnV0ZSBhY2Nlc3MgKGFjY2Vzc2luZyB0aGUgZmllbGQgb2YgYSBjbGFzcykgc3VjaCBhcyB0aGUgZXhwcmVzc2lvbiAiZm9vLkBiYXIiLgorICogCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgQXR0cmlidXRlRXhwcmVzc2lvbiBleHRlbmRzIFByb3BlcnR5RXhwcmVzc2lvbiB7CisKKyAgICBwdWJsaWMgQXR0cmlidXRlRXhwcmVzc2lvbihFeHByZXNzaW9uIG9iamVjdEV4cHJlc3Npb24sIEV4cHJlc3Npb24gcHJvcGVydHkpIHsKKyAgICAgICAgc3VwZXIob2JqZWN0RXhwcmVzc2lvbiwgcHJvcGVydHksIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQXR0cmlidXRlRXhwcmVzc2lvbihFeHByZXNzaW9uIG9iamVjdEV4cHJlc3Npb24sIEV4cHJlc3Npb24gcHJvcGVydHksIGJvb2xlYW4gc2FmZSkgeworICAgICAgICBzdXBlcihvYmplY3RFeHByZXNzaW9uLCBwcm9wZXJ0eSwgc2FmZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXQoR3Jvb3Z5Q29kZVZpc2l0b3IgdmlzaXRvcikgeworICAgICAgICB2aXNpdG9yLnZpc2l0QXR0cmlidXRlRXhwcmVzc2lvbih0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiB0cmFuc2Zvcm1FeHByZXNzaW9uKEV4cHJlc3Npb25UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lcikgeworICAgICAgICBFeHByZXNzaW9uIHJldCA9IG5ldyBBdHRyaWJ1dGVFeHByZXNzaW9uKHRyYW5zZm9ybWVyLnRyYW5zZm9ybShnZXRPYmplY3RFeHByZXNzaW9uKCkpLHRyYW5zZm9ybWVyLnRyYW5zZm9ybShnZXRQcm9wZXJ0eSgpKSxpc1NhZmUoKSk7CisgICAgICAgIHJldC5zZXRTb3VyY2VQb3NpdGlvbih0aGlzKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvZXhwci9CaW5hcnlFeHByZXNzaW9uLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvZXhwci9CaW5hcnlFeHByZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUzMzBjNAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL0JpbmFyeUV4cHJlc3Npb24uamF2YQpAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHI7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5DbGFzc05vZGU7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuR3Jvb3Z5Q29kZVZpc2l0b3I7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuVmFyaWFibGU7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXguVG9rZW47CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXguVHlwZXM7CisKKy8qKgorICogUmVwcmVzZW50cyB0d28gZXhwcmVzc2lvbnMgYW5kIGFuIG9wZXJhdGlvbgorICogCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgQmluYXJ5RXhwcmVzc2lvbiBleHRlbmRzIEV4cHJlc3Npb24geworICAgIAorICAgIHByaXZhdGUgRXhwcmVzc2lvbiBsZWZ0RXhwcmVzc2lvbjsKKyAgICBwcml2YXRlIEV4cHJlc3Npb24gcmlnaHRFeHByZXNzaW9uOworICAgIHByaXZhdGUgZmluYWwgVG9rZW4gb3BlcmF0aW9uOworICAgIAorICAgIHB1YmxpYyBCaW5hcnlFeHByZXNzaW9uKEV4cHJlc3Npb24gbGVmdEV4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW4gb3BlcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHJlc3Npb24gcmlnaHRFeHByZXNzaW9uKSB7CisgICAgICAgIHRoaXMubGVmdEV4cHJlc3Npb24gPSBsZWZ0RXhwcmVzc2lvbjsKKyAgICAgICAgdGhpcy5vcGVyYXRpb24gPSBvcGVyYXRpb247CisgICAgICAgIHRoaXMucmlnaHRFeHByZXNzaW9uID0gcmlnaHRFeHByZXNzaW9uOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBzdXBlci50b1N0cmluZygpICsiWyIgKyBsZWZ0RXhwcmVzc2lvbiArIG9wZXJhdGlvbiArIHJpZ2h0RXhwcmVzc2lvbiArICJdIjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChHcm9vdnlDb2RlVmlzaXRvciB2aXNpdG9yKSB7CisgICAgICAgIHZpc2l0b3IudmlzaXRCaW5hcnlFeHByZXNzaW9uKHRoaXMpOworICAgIH0KKworICAgIHB1YmxpYyBFeHByZXNzaW9uIHRyYW5zZm9ybUV4cHJlc3Npb24oRXhwcmVzc2lvblRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyKSB7CisgICAgICAgIEV4cHJlc3Npb24gcmV0ID0gbmV3IEJpbmFyeUV4cHJlc3Npb24odHJhbnNmb3JtZXIudHJhbnNmb3JtKGxlZnRFeHByZXNzaW9uKSwgb3BlcmF0aW9uLCB0cmFuc2Zvcm1lci50cmFuc2Zvcm0ocmlnaHRFeHByZXNzaW9uKSk7CisgICAgICAgIHJldC5zZXRTb3VyY2VQb3NpdGlvbih0aGlzKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBnZXRMZWZ0RXhwcmVzc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIGxlZnRFeHByZXNzaW9uOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldExlZnRFeHByZXNzaW9uKEV4cHJlc3Npb24gbGVmdEV4cHJlc3Npb24pIHsKKyAgICAgICAgdGhpcy5sZWZ0RXhwcmVzc2lvbiA9IGxlZnRFeHByZXNzaW9uOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJpZ2h0RXhwcmVzc2lvbihFeHByZXNzaW9uIHJpZ2h0RXhwcmVzc2lvbikgeworICAgICAgICB0aGlzLnJpZ2h0RXhwcmVzc2lvbiA9IHJpZ2h0RXhwcmVzc2lvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgVG9rZW4gZ2V0T3BlcmF0aW9uKCkgeworICAgICAgICByZXR1cm4gb3BlcmF0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBFeHByZXNzaW9uIGdldFJpZ2h0RXhwcmVzc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIHJpZ2h0RXhwcmVzc2lvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CisgICAgICAgIGlmIChvcGVyYXRpb24uZ2V0VHlwZSgpID09IFR5cGVzLkxFRlRfU1FVQVJFX0JSQUNLRVQpIHsKKyAgICAgICAgICAgIHJldHVybiBsZWZ0RXhwcmVzc2lvbi5nZXRUZXh0KCkgKyAiWyIgKyByaWdodEV4cHJlc3Npb24uZ2V0VGV4dCgpICsgIl0iOworICAgICAgICB9CisgICAgICAgIHJldHVybiAiKCIgKyBsZWZ0RXhwcmVzc2lvbi5nZXRUZXh0KCkgKyAiICIgKyBvcGVyYXRpb24uZ2V0VGV4dCgpICsgIiAiICsgcmlnaHRFeHByZXNzaW9uLmdldFRleHQoKSArICIpIjsKKyAgICB9CisgICAgCisgICAgCisgICAvKioKKyAgICAqICBDcmVhdGVzIGFuIGFzc2lnbm1lbnQgZXhwcmVzc2lvbiBpbiB3aGljaCB0aGUgc3BlY2lmaWVkIGV4cHJlc3Npb24KKyAgICAqICBpcyB3cml0dGVuIGludG8gdGhlIHNwZWNpZmllZCB2YXJpYWJsZSBuYW1lLiAgIAorICAgICovCisgICAgCisgICAgcHVibGljIHN0YXRpYyBCaW5hcnlFeHByZXNzaW9uIG5ld0Fzc2lnbm1lbnRFeHByZXNzaW9uKCBWYXJpYWJsZSB2YXJpYWJsZSwgRXhwcmVzc2lvbiByaHMgKSB7CisgICAgCVZhcmlhYmxlRXhwcmVzc2lvbiBsaHMgPSBuZXcgVmFyaWFibGVFeHByZXNzaW9uKCB2YXJpYWJsZSApOworICAgIAlUb2tlbiAgICAgICAgIG9wZXJhdG9yID0gVG9rZW4ubmV3UGxhY2Vob2xkZXIoIFR5cGVzLkFTU0lHTiApOworICAgIAorICAgIAlyZXR1cm4gbmV3IEJpbmFyeUV4cHJlc3Npb24oIGxocywgb3BlcmF0b3IsIHJocyApOworICAgIH0KKworCisgICAgLyoqCisgICAgICogIENyZWF0ZXMgdmFyaWFibGUgaW5pdGlhbGl6YXRpb24gZXhwcmVzc2lvbiBpbiB3aGljaCB0aGUgc3BlY2lmaWVkIGV4cHJlc3Npb24KKyAgICAgKiAgaXMgd3JpdHRlbiBpbnRvIHRoZSBzcGVjaWZpZWQgdmFyaWFibGUgbmFtZS4gICAKKyAgICAgKi8KKyAgICAgCisgICAgIHB1YmxpYyBzdGF0aWMgQmluYXJ5RXhwcmVzc2lvbiBuZXdJbml0aWFsaXphdGlvbkV4cHJlc3Npb24oIFN0cmluZyB2YXJpYWJsZSwgQ2xhc3NOb2RlIHR5cGUsIEV4cHJlc3Npb24gcmhzICkgeworICAgICAJVmFyaWFibGVFeHByZXNzaW9uIGxocyA9IG5ldyBWYXJpYWJsZUV4cHJlc3Npb24oIHZhcmlhYmxlICk7CisgICAgIAorICAgICAJaWYoIHR5cGUgIT0gbnVsbCApIHsKKyAgICAgCSAgICBsaHMuc2V0VHlwZSh0eXBlKTsKKyAgICAgCX0KKyAgICAgCisgICAgIAlUb2tlbiBvcGVyYXRvciA9IFRva2VuLm5ld1BsYWNlaG9sZGVyKCBUeXBlcy5BU1NJR04gKTsKKyAgICAgCisgICAgICAgIHJldHVybiBuZXcgQmluYXJ5RXhwcmVzc2lvbiggbGhzLCBvcGVyYXRvciwgcmhzICk7CisgICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L2V4cHIvQml0d2lzZU5lZ2F0aW9uRXhwcmVzc2lvbi5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L2V4cHIvQml0d2lzZU5lZ2F0aW9uRXhwcmVzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMGNmNzkKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvZXhwci9CaXR3aXNlTmVnYXRpb25FeHByZXNzaW9uLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHI7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5DbGFzc05vZGU7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuR3Jvb3Z5Q29kZVZpc2l0b3I7CisKKy8qKgorICogQGF1dGhvciBwaGsKKyAqLworcHVibGljIGNsYXNzIEJpdHdpc2VOZWdhdGlvbkV4cHJlc3Npb24gZXh0ZW5kcyBFeHByZXNzaW9uIHsKKworICAgIHByaXZhdGUgRXhwcmVzc2lvbiBleHByZXNzaW9uOworCQorICAgIHB1YmxpYyBCaXR3aXNlTmVnYXRpb25FeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uOworICAgIH0KKworICAgIHB1YmxpYyBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oKSB7CisgICAgICAgIHJldHVybiBleHByZXNzaW9uOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0KEdyb292eUNvZGVWaXNpdG9yIHZpc2l0b3IpIHsKKyAgICAgICAgdmlzaXRvci52aXNpdEJpdHdpc2VOZWdhdGlvbkV4cHJlc3Npb24odGhpcyk7CisgICAgfQorCisgICAgcHVibGljIEV4cHJlc3Npb24gdHJhbnNmb3JtRXhwcmVzc2lvbihFeHByZXNzaW9uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIpIHsKKyAgICAgICAgRXhwcmVzc2lvbiByZXQgPSBuZXcgQml0d2lzZU5lZ2F0aW9uRXhwcmVzc2lvbih0cmFuc2Zvcm1lci50cmFuc2Zvcm0oZXhwcmVzc2lvbikpOworICAgICAgICByZXQuc2V0U291cmNlUG9zaXRpb24odGhpcyk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgeworCQlyZXR1cm4gZXhwcmVzc2lvbi5nZXRUZXh0KCk7CisJfQorCisgICAgcHVibGljIENsYXNzTm9kZSBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gZXhwcmVzc2lvbi5nZXRUeXBlKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvZXhwci9Cb29sZWFuRXhwcmVzc2lvbi5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L2V4cHIvQm9vbGVhbkV4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDYxOGVmCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L2V4cHIvQm9vbGVhbkV4cHJlc3Npb24uamF2YQpAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuZXhwcjsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LkNsYXNzSGVscGVyOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0Lkdyb292eUNvZGVWaXNpdG9yOworCisvKioKKyAqIFJlcHJlc2VudHMgYSBib29sZWFuIGV4cHJlc3Npb24KKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIEJvb2xlYW5FeHByZXNzaW9uIGV4dGVuZHMgRXhwcmVzc2lvbiB7CisgICAgcHJpdmF0ZSBmaW5hbCBFeHByZXNzaW9uIGV4cHJlc3Npb247CisKKyAgICBwdWJsaWMgQm9vbGVhbkV4cHJlc3Npb24oRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisgICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247CisgICAgICAgIHNldFR5cGUoQ2xhc3NIZWxwZXIuYm9vbGVhbl9UWVBFKTsgLy8gZm9yIGNvbnNpc3RhbmN5IHdpdGggQXNtQ2xhc3NHZW5lcmF0b3IuIHNlZSBBc21DbGFzc0dlbmVyYXRvci52aXNpdEJvb2xlYW5FeHByZXNzaW9uLiAgCisgICAgfQorICAgIAorICAgIHB1YmxpYyBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oKSB7CisgICAgICAgIHJldHVybiBleHByZXNzaW9uOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0KEdyb292eUNvZGVWaXNpdG9yIHZpc2l0b3IpIHsKKyAgICAgICAgdmlzaXRvci52aXNpdEJvb2xlYW5FeHByZXNzaW9uKHRoaXMpOworICAgIH0KKworICAgIHB1YmxpYyBFeHByZXNzaW9uIHRyYW5zZm9ybUV4cHJlc3Npb24oRXhwcmVzc2lvblRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyKSB7CisgICAgICAgIEV4cHJlc3Npb24gcmV0ID0gbmV3IEJvb2xlYW5FeHByZXNzaW9uKHRyYW5zZm9ybWVyLnRyYW5zZm9ybShleHByZXNzaW9uKSk7CisgICAgICAgIHJldC5zZXRTb3VyY2VQb3NpdGlvbih0aGlzKTsKKyAgICAgICAgcmV0dXJuIHJldDsgICAgfQorICAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIGV4cHJlc3Npb24uZ2V0VGV4dCgpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L2V4cHIvQ2FzdEV4cHJlc3Npb24uamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL0Nhc3RFeHByZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFjZWVkYgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL0Nhc3RFeHByZXNzaW9uLmphdmEKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHI7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5DbGFzc05vZGU7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuR3Jvb3Z5Q29kZVZpc2l0b3I7CisKKy8qKgorICogUmVwcmVzZW50cyBhIHR5cGUgY2FzdCBleHByZXNzaW9uCisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBDYXN0RXhwcmVzc2lvbiBleHRlbmRzIEV4cHJlc3Npb24geworICAgIAorICAgIHByaXZhdGUgZmluYWwgRXhwcmVzc2lvbiBleHByZXNzaW9uOworICAgIHByaXZhdGUgYm9vbGVhbiBpZ25vcmVBdXRvYm94aW5nPWZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBjb2VyY2UgPSBmYWxzZTsKKworICAgIHB1YmxpYyBzdGF0aWMgQ2FzdEV4cHJlc3Npb24gYXNFeHByZXNzaW9uKENsYXNzTm9kZSB0eXBlLCBFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKyAgICAgICAgQ2FzdEV4cHJlc3Npb24gYW5zd2VyID0gbmV3IENhc3RFeHByZXNzaW9uKHR5cGUsIGV4cHJlc3Npb24pOworICAgICAgICBhbnN3ZXIuc2V0Q29lcmNlKHRydWUpOworICAgICAgICByZXR1cm4gYW5zd2VyOworICAgIH0KKworICAgIHB1YmxpYyBDYXN0RXhwcmVzc2lvbihDbGFzc05vZGUgdHlwZSwgRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisgICAgICAgIHRoaXModHlwZSxleHByZXNzaW9uLGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2FzdEV4cHJlc3Npb24oQ2xhc3NOb2RlIHR5cGUsIEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgYm9vbGVhbiBpZ25vcmVBdXRvYm94aW5nKSB7CisgICAgICAgIHN1cGVyLnNldFR5cGUodHlwZSk7CisgICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247CisgICAgICAgIHRoaXMuaWdub3JlQXV0b2JveGluZyA9IGlnbm9yZUF1dG9ib3hpbmc7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGlzSWdub3JpbmdBdXRvYm94aW5nKCl7CisgICAgICAgIHJldHVybiBpZ25vcmVBdXRvYm94aW5nOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzQ29lcmNlKCkgeworICAgICAgICByZXR1cm4gY29lcmNlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvZXJjZShib29sZWFuIGNvZXJjZSkgeworICAgICAgICB0aGlzLmNvZXJjZSA9IGNvZXJjZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gc3VwZXIudG9TdHJpbmcoKSArIlsoIiArIGdldFR5cGUoKS5nZXROYW1lKCkgKyAiKSAiICsgZXhwcmVzc2lvbiArICJdIjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChHcm9vdnlDb2RlVmlzaXRvciB2aXNpdG9yKSB7CisgICAgICAgIHZpc2l0b3IudmlzaXRDYXN0RXhwcmVzc2lvbih0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiB0cmFuc2Zvcm1FeHByZXNzaW9uKEV4cHJlc3Npb25UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lcikgeworICAgICAgICBDYXN0RXhwcmVzc2lvbiByZXQgPSAgbmV3IENhc3RFeHByZXNzaW9uKGdldFR5cGUoKSwgdHJhbnNmb3JtZXIudHJhbnNmb3JtKGV4cHJlc3Npb24pKTsKKyAgICAgICAgcmV0LnNldFNvdXJjZVBvc2l0aW9uKHRoaXMpOworICAgICAgICByZXQuc2V0Q29lcmNlKHRoaXMuaXNDb2VyY2UoKSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKKyAgICAgICAgcmV0dXJuICIoIiArIGdldFR5cGUoKSArICIpICIgKyBleHByZXNzaW9uLmdldFRleHQoKTsKKyAgICB9CisgCisgICAgcHVibGljIEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIGV4cHJlc3Npb247CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoQ2xhc3NOb2RlIHQpIHsKKyAgICAgICAgc3VwZXIuc2V0VHlwZSh0KTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL0NsYXNzRXhwcmVzc2lvbi5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L2V4cHIvQ2xhc3NFeHByZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJjNDYzNAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL0NsYXNzRXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuQ2xhc3NOb2RlOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0Lkdyb292eUNvZGVWaXNpdG9yOworCisvKioKKyAqIFJlcHJlc2VudHMgYWNjZXNzIHRvIGEgSmF2YS9Hcm9vdnkgY2xhc3MgaW4gYW4gZXhwcmVzc2lvbiwgc3VjaAorICogYXMgd2hlbiBpbnZva2luZyBhIHN0YXRpYyBtZXRob2Qgb3IgYWNjZXNzaW5nIGEgc3RhdGljIHR5cGUKKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIENsYXNzRXhwcmVzc2lvbiBleHRlbmRzIEV4cHJlc3Npb24geworCisgICAgcHVibGljIENsYXNzRXhwcmVzc2lvbihDbGFzc05vZGUgdHlwZSkgeworICAgICAgICBzdXBlci5zZXRUeXBlKHR5cGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0KEdyb292eUNvZGVWaXNpdG9yIHZpc2l0b3IpIHsKKyAgICAgICAgdmlzaXRvci52aXNpdENsYXNzRXhwcmVzc2lvbih0aGlzKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIEV4cHJlc3Npb24gdHJhbnNmb3JtRXhwcmVzc2lvbihFeHByZXNzaW9uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIGdldFR5cGUoKS5nZXROYW1lKCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICByZXR1cm4gc3VwZXIudG9TdHJpbmcoKSArICJbdHlwZTogIiArIGdldFR5cGUoKS5nZXROYW1lKCkgKyAiXSI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L2V4cHIvQ2xvc3VyZUV4cHJlc3Npb24uamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL0Nsb3N1cmVFeHByZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIyNWQzOQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL0Nsb3N1cmVFeHByZXNzaW9uLmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHI7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5DbGFzc0hlbHBlcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5Hcm9vdnlDb2RlVmlzaXRvcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5QYXJhbWV0ZXI7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuVmFyaWFibGVTY29wZTsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5zdG10LlN0YXRlbWVudDsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuSW52b2tlckhlbHBlcjsKKworCisvKioKKyAqIFJlcHJlc2VudHMgYSBjbG9zdXJlIGNyZWF0aW9uIGV4cHJlc3Npb24gc3VjaCBhcyB7IHN0YXRlbWVudDsgfSAKKyAqIG9yIHsgaSA6IHN0YXRlbWVudDsgfSBvciB7IGksIHgsIFN0cmluZyB5OiBzdGF0ZW1lbnQgfQorICogCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgQ2xvc3VyZUV4cHJlc3Npb24gZXh0ZW5kcyBFeHByZXNzaW9uIHsKKyAgICAKKyAgICBwcml2YXRlIFBhcmFtZXRlcltdIHBhcmFtZXRlcnM7CisgICAgcHJpdmF0ZSBTdGF0ZW1lbnQgY29kZTsKKyAgICBwcml2YXRlIFZhcmlhYmxlU2NvcGUgdmFyaWFibGVTY29wZTsKKyAgICAKKyAgICBwdWJsaWMgQ2xvc3VyZUV4cHJlc3Npb24oUGFyYW1ldGVyW10gcGFyYW1ldGVycywgU3RhdGVtZW50IGNvZGUpIHsKKyAgICAgICAgdGhpcy5wYXJhbWV0ZXJzID0gcGFyYW1ldGVyczsKKyAgICAgICAgdGhpcy5jb2RlID0gY29kZTsKKyAgICAgICAgc3VwZXIuc2V0VHlwZShDbGFzc0hlbHBlci5DTE9TVVJFX1RZUEUpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChHcm9vdnlDb2RlVmlzaXRvciB2aXNpdG9yKSB7CisgICAgICAgIHZpc2l0b3IudmlzaXRDbG9zdXJlRXhwcmVzc2lvbih0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiB0cmFuc2Zvcm1FeHByZXNzaW9uKEV4cHJlc3Npb25UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lcikgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAgCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCkgKyBJbnZva2VySGVscGVyLnRvU3RyaW5nKHBhcmFtZXRlcnMpICsgInsgIiArIGNvZGUgKyAiIH0iOworICAgIH0KKworICAgIHB1YmxpYyBTdGF0ZW1lbnQgZ2V0Q29kZSgpIHsKKyAgICAgICAgcmV0dXJuIGNvZGU7CisgICAgfQorCisgICAgcHVibGljIFBhcmFtZXRlcltdIGdldFBhcmFtZXRlcnMoKSB7CisgICAgICAgIHJldHVybiBwYXJhbWV0ZXJzOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzUGFyYW1ldGVyU3BlY2lmaWVkKCkgeworICAgICAgICByZXR1cm4gcGFyYW1ldGVycyAhPSBudWxsICYmIHBhcmFtZXRlcnMubGVuZ3RoID4gMDsKKyAgICB9CisgICAgCisgICAgcHVibGljIFZhcmlhYmxlU2NvcGUgZ2V0VmFyaWFibGVTY29wZSgpIHsKKyAgICAgICAgcmV0dXJuIHZhcmlhYmxlU2NvcGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VmFyaWFibGVTY29wZShWYXJpYWJsZVNjb3BlIHZhcmlhYmxlU2NvcGUpIHsKKyAgICAgICAgdGhpcy52YXJpYWJsZVNjb3BlID0gdmFyaWFibGVTY29wZTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL0Nsb3N1cmVMaXN0RXhwcmVzc2lvbi5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L2V4cHIvQ2xvc3VyZUxpc3RFeHByZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMxODJmOAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL0Nsb3N1cmVMaXN0RXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsODYgQEAKKy8qDQorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5Hcm9vdnlDb2RlVmlzaXRvcjsNCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuVmFyaWFibGVTY29wZTsNCisNCisvKioNCisgKiBUaGlzIGNsYXNzIHJlcnByZXNlbnRzIGEgbGlzdCBvZiBleHByZXNzaW9ucyB1c2VkIHRvIA0KKyAqIGNyZWF0ZSBjbG9zdXJlcy4gRXhhbXBsZToNCisgKiA8Y29kZT4NCisgKiBkZWYgZm9vID0gKDE7Mjs7KQ0KKyAqIDwvY29kZT4NCisgKiBUaGUgcmlnaHQgc2lkZSBpcyBhIENsb3N1cmVMaXN0RXhwcmVzc2lvbiBjb25zaXN0aW5nIG9mDQorICogdHdvIENvbnN0YW50RXhwcmVzc2lvbnMgZm9yIHRoZSB2YWx1ZXMgMSBhbmQgMiwgYW5kIHR3bw0KKyAqIEVtcHR5U3RhdGVtZW50IGVudHJpZXMuIFRoZSBDbG9zdXJlTGlzdEV4cHJlc3Npb24gZGVmaW5lcyBhIG5ldyANCisgKiB2YXJpYWJsZSBzY29wZS4gQWxsIGNyZWF0ZWQgQ2xvc3VyZXMgc2hhcmUgdGhpcyBzY29wZS4NCisgKiANCisgKiANCisgKiBAYXV0aG9yIEpvY2hlbiBUaGVvZG9yb3UNCisgKi8NCitwdWJsaWMgY2xhc3MgQ2xvc3VyZUxpc3RFeHByZXNzaW9uIGV4dGVuZHMgTGlzdEV4cHJlc3Npb24gew0KKw0KKyAgICBwcml2YXRlIFZhcmlhYmxlU2NvcGUgc2NvcGU7DQorICAgIA0KKyAgICBwdWJsaWMgQ2xvc3VyZUxpc3RFeHByZXNzaW9uKExpc3QgZXhwcmVzc2lvbnMpIHsNCisgICAgICAgIHN1cGVyKGV4cHJlc3Npb25zKTsNCisgICAgICAgIHNjb3BlID0gbmV3IFZhcmlhYmxlU2NvcGUoKTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIENsb3N1cmVMaXN0RXhwcmVzc2lvbigpIHsNCisgICAgICAgIHRoaXMobmV3IEFycmF5TGlzdCgzKSk7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KEdyb292eUNvZGVWaXNpdG9yIHZpc2l0b3IpIHsNCisgICAgICAgIHZpc2l0b3IudmlzaXRDbG9zdXJlTGlzdEV4cHJlc3Npb24odGhpcyk7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBFeHByZXNzaW9uIHRyYW5zZm9ybUV4cHJlc3Npb24oRXhwcmVzc2lvblRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyKSB7DQorICAgICAgICBFeHByZXNzaW9uIHJldCA9IG5ldyBDbG9zdXJlTGlzdEV4cHJlc3Npb24odHJhbnNmb3JtRXhwcmVzc2lvbnMoZ2V0RXhwcmVzc2lvbnMoKSwgdHJhbnNmb3JtZXIpKTsNCisgICAgICAgIHJldC5zZXRTb3VyY2VQb3NpdGlvbih0aGlzKTsNCisgICAgICAgIHJldHVybiByZXQ7ICAgICAgIA0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgdm9pZCBzZXRWYXJpYWJsZVNjb3BlKFZhcmlhYmxlU2NvcGUgc2NvcGUpIHsNCisgICAgICAgIHRoaXMuc2NvcGUgPSBzY29wZTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIFZhcmlhYmxlU2NvcGUgZ2V0VmFyaWFibGVTY29wZSgpIHsNCisgICAgICAgIHJldHVybiBzY29wZTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgew0KKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoIigiKTsNCisgICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOw0KKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0RXhwcmVzc2lvbnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKSB7DQorICAgICAgICAgICAgaWYgKGZpcnN0KSB7DQorICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiOyAiKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgDQorICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgoKEV4cHJlc3Npb24paXRlci5uZXh0KCkpLmdldFRleHQoKSk7DQorICAgICAgICB9DQorICAgICAgICBidWZmZXIuYXBwZW5kKCIpIik7DQorICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L2V4cHIvQ29uc3RhbnRFeHByZXNzaW9uLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvZXhwci9Db25zdGFudEV4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Nzk0NWM5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L2V4cHIvQ29uc3RhbnRFeHByZXNzaW9uLmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHI7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5DbGFzc0hlbHBlcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5Hcm9vdnlDb2RlVmlzaXRvcjsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgY29uc3RhbnQgZXhwcmVzc2lvbiBzdWNoIGFzIG51bGwsIHRydWUsIGZhbHNlCisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBDb25zdGFudEV4cHJlc3Npb24gZXh0ZW5kcyBFeHByZXNzaW9uIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbnN0YW50RXhwcmVzc2lvbiBWT0lEID0gbmV3IENvbnN0YW50RXhwcmVzc2lvbihWb2lkLmNsYXNzKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbnN0YW50RXhwcmVzc2lvbiBOVUxMID0gbmV3IENvbnN0YW50RXhwcmVzc2lvbihudWxsKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbnN0YW50RXhwcmVzc2lvbiBUUlVFID0gbmV3IENvbnN0YW50RXhwcmVzc2lvbihCb29sZWFuLlRSVUUpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29uc3RhbnRFeHByZXNzaW9uIEZBTFNFID0gbmV3IENvbnN0YW50RXhwcmVzc2lvbihCb29sZWFuLkZBTFNFKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbnN0YW50RXhwcmVzc2lvbiBFTVBUWV9TVFJJTkcgPSBuZXcgQ29uc3RhbnRFeHByZXNzaW9uKCIiKTsKKyAgICAvL3B1YmxpYyBzdGF0aWMgZmluYWwgRXhwcmVzc2lvbiBFTVBUWV9BUlJBWSA9IG5ldyBQcm9wZXJ0eUV4cHJlc3Npb24obmV3IENsYXNzRXhwcmVzc2lvbihBcmd1bWVudExpc3RFeHByZXNzaW9uLmNsYXNzLmdldE5hbWUoKSksICJFTVBUWV9BUlJBWSIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29uc3RhbnRFeHByZXNzaW9uIEVNVFBZX0VYUFJFU1NJT04gPSBuZXcgQ29uc3RhbnRFeHByZXNzaW9uKG51bGwpOworICAgIAorICAgIHByaXZhdGUgT2JqZWN0IHZhbHVlOworICAgIAorICAgIHB1YmxpYyBDb25zdGFudEV4cHJlc3Npb24oT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgaWYgKHRoaXMudmFsdWUgIT0gbnVsbCkKKyAgICAgICAgICAgIHNldFR5cGUoQ2xhc3NIZWxwZXIubWFrZSh2YWx1ZS5nZXRDbGFzcygpKSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJDb25zdGFudEV4cHJlc3Npb25bIiArIHZhbHVlICsgIl0iOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0KEdyb292eUNvZGVWaXNpdG9yIHZpc2l0b3IpIHsKKyAgICAgICAgdmlzaXRvci52aXNpdENvbnN0YW50RXhwcmVzc2lvbih0aGlzKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBFeHByZXNzaW9uIHRyYW5zZm9ybUV4cHJlc3Npb24oRXhwcmVzc2lvblRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoaXMgY29uc3RhbnQgZXhwcmVzc2lvbgorICAgICAqLyAgICAKKyAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgeworICAgICAgICByZXR1cm4gKHZhbHVlID09IG51bGwpID8gIm51bGwiIDogdmFsdWUudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvZXhwci9Db25zdHJ1Y3RvckNhbGxFeHByZXNzaW9uLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvZXhwci9Db25zdHJ1Y3RvckNhbGxFeHByZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjcxZGMyYQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL0NvbnN0cnVjdG9yQ2FsbEV4cHJlc3Npb24uamF2YQpAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuZXhwcjsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LkNsYXNzTm9kZTsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5Hcm9vdnlDb2RlVmlzaXRvcjsKKworLyoqCisgKiBBIGNvbnN0cnVjdG9yIGNhbGwKKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEBhdXRob3IgSm9jaGVuIFRoZW9kb3JvdQorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgQ29uc3RydWN0b3JDYWxsRXhwcmVzc2lvbiBleHRlbmRzIEV4cHJlc3Npb24geworCisgICAgcHJpdmF0ZSBmaW5hbCBFeHByZXNzaW9uIGFyZ3VtZW50czsKKworICAgIHB1YmxpYyBDb25zdHJ1Y3RvckNhbGxFeHByZXNzaW9uKENsYXNzTm9kZSB0eXBlLCBFeHByZXNzaW9uIGFyZ3VtZW50cykgeworICAgICAgICBzdXBlci5zZXRUeXBlKHR5cGUpOworICAgICAgICBpZiAoIShhcmd1bWVudHMgaW5zdGFuY2VvZiBUdXBsZUV4cHJlc3Npb24pKXsKKyAgICAgICAgICAgIHRoaXMuYXJndW1lbnRzID0gbmV3IFR1cGxlRXhwcmVzc2lvbihhcmd1bWVudHMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy5hcmd1bWVudHMgPSBhcmd1bWVudHM7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdmlzaXQoR3Jvb3Z5Q29kZVZpc2l0b3IgdmlzaXRvcikgeworICAgICAgICB2aXNpdG9yLnZpc2l0Q29uc3RydWN0b3JDYWxsRXhwcmVzc2lvbih0aGlzKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIEV4cHJlc3Npb24gdHJhbnNmb3JtRXhwcmVzc2lvbihFeHByZXNzaW9uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIpIHsKKyAgICAgICAgRXhwcmVzc2lvbiBhcmdzID0gdHJhbnNmb3JtZXIudHJhbnNmb3JtKGFyZ3VtZW50cyk7CisgICAgICAgIEV4cHJlc3Npb24gcmV0ID0gbmV3IENvbnN0cnVjdG9yQ2FsbEV4cHJlc3Npb24oZ2V0VHlwZSgpLCBhcmdzKTsKKyAgICAgICAgcmV0LnNldFNvdXJjZVBvc2l0aW9uKHRoaXMpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHB1YmxpYyBFeHByZXNzaW9uIGdldEFyZ3VtZW50cygpIHsKKyAgICAgICAgcmV0dXJuIGFyZ3VtZW50czsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CisgICAgICAgIFN0cmluZyB0ZXh0ID0gbnVsbDsKKyAgICAgICAgaWYgKGlzU3VwZXJDYWxsKCkpIHsKKyAgICAgICAgICAgIHRleHQgPSAic3VwZXIgIjsKKyAgICAgICAgfSBlbHNlIGlmIChpc1RoaXNDYWxsKCkpIHsKKyAgICAgICAgICAgIHRleHQgPSAidGhpcyAiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGV4dCA9ICJuZXcgIisgZ2V0VHlwZSgpLmdldE5hbWUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGV4dCArIGFyZ3VtZW50cy5nZXRUZXh0KCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCkgKyAiW3R5cGU6ICIgKyBnZXRUeXBlKCkgKyAiIGFyZ3VtZW50czogIiArIGFyZ3VtZW50cyArICJdIjsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gaXNTdXBlckNhbGwoKSB7CisgICAgICAgIHJldHVybiBnZXRUeXBlKCk9PUNsYXNzTm9kZS5TVVBFUjsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gaXNTcGVjaWFsQ2FsbCgpeworICAgICAgICByZXR1cm4gaXNUaGlzQ2FsbCgpIHx8IGlzU3VwZXJDYWxsKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGlzVGhpc0NhbGwoKSB7CisgICAgICAgIHJldHVybiBnZXRUeXBlKCk9PUNsYXNzTm9kZS5USElTOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL0RlY2xhcmF0aW9uRXhwcmVzc2lvbi5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L2V4cHIvRGVjbGFyYXRpb25FeHByZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlmODRmOAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL0RlY2xhcmF0aW9uRXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuR3Jvb3Z5Q29kZVZpc2l0b3I7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXguVG9rZW47CisKKy8qKgorICogUmVwcmVzZW50cyBhIGxvY2FsIHZhcmlhYmxlIG5hbWUgZGVjbGFyYXRpb24sIGFuIGV4cHJlc3Npb24gbGlrZSAKKyAqICJkZWYgZm9vIiBvciB3aXRoIHR5cGUgIlN0cmluZyBmb28iLgorICogCisgKiBAYXV0aG9yIEpvY2hlbiBUaGVvZG9yb3UKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIERlY2xhcmF0aW9uRXhwcmVzc2lvbiBleHRlbmRzIEJpbmFyeUV4cHJlc3Npb24geworICAgIAorICAgIHB1YmxpYyBEZWNsYXJhdGlvbkV4cHJlc3Npb24oVmFyaWFibGVFeHByZXNzaW9uIGxlZnQsIFRva2VuIG9wZXJhdGlvbiwgRXhwcmVzc2lvbiByaWdodCkgeworICAgICAgICBzdXBlcihsZWZ0LG9wZXJhdGlvbixyaWdodCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXQoR3Jvb3Z5Q29kZVZpc2l0b3IgdmlzaXRvcikgeworICAgICAgICB2aXNpdG9yLnZpc2l0RGVjbGFyYXRpb25FeHByZXNzaW9uKHRoaXMpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgVmFyaWFibGVFeHByZXNzaW9uIGdldFZhcmlhYmxlRXhwcmVzc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIChWYXJpYWJsZUV4cHJlc3Npb24pIHRoaXMuZ2V0TGVmdEV4cHJlc3Npb24oKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0TGVmdEV4cHJlc3Npb24oRXhwcmVzc2lvbiBsZWZ0RXhwcmVzc2lvbikgeworICAgICAgICBzdXBlci5zZXRMZWZ0RXhwcmVzc2lvbigoVmFyaWFibGVFeHByZXNzaW9uKSBsZWZ0RXhwcmVzc2lvbik7CisgICAgfQorICAgIAorICAgIAorICAgIHB1YmxpYyBFeHByZXNzaW9uIHRyYW5zZm9ybUV4cHJlc3Npb24oRXhwcmVzc2lvblRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyKSB7CisgICAgICAgIEV4cHJlc3Npb24gcmV0ID0gIG5ldyBEZWNsYXJhdGlvbkV4cHJlc3Npb24oKFZhcmlhYmxlRXhwcmVzc2lvbikgdHJhbnNmb3JtZXIudHJhbnNmb3JtKGdldExlZnRFeHByZXNzaW9uKCkpLCBnZXRPcGVyYXRpb24oKSwgdHJhbnNmb3JtZXIudHJhbnNmb3JtKGdldFJpZ2h0RXhwcmVzc2lvbigpKSk7CisgICAgICAgIHJldC5zZXRTb3VyY2VQb3NpdGlvbih0aGlzKTsKKyAgICAgICAgcmV0dXJuIHJldDsgICAgICAgIAorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL0VsdmlzT3BlcmF0b3JFeHByZXNzaW9uLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvZXhwci9FbHZpc09wZXJhdG9yRXhwcmVzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZjM5MzkKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvZXhwci9FbHZpc09wZXJhdG9yRXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKKy8qDQorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByOw0KKw0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5Hcm9vdnlDb2RlVmlzaXRvcjsNCisNCisvKioNCisgKiBSZXByZXNlbnRzIGEgc2hvcnQgdGVybmFyeSBleHByZXNzaW9uIHggPzogeSwgd2hpY2ggaXMgZXF1YWwgDQorICogdG8gDQorICogPHByZT4NCisgKiBkZWYgdHJ1ZVBhcnQgPSB4DQorICogZGVmIGJvb2xlYW5QYXJ0ID0gdHJ1ZVBhcnQgYXMgYm9vbGVhbg0KKyAqIGJvb2xlYW5QYXJ0PyB0cnVlUGFydCA6IHkNCisgKiA8L3ByZT4NCisgKiBFdmVuIGlmIHggaXMgbm8gYXRvbWljIGV4cHJlc3Npb24sIHggd2lsbCBiZSBldmFsdWF0ZWQgb25seSANCisgKiBvbmNlLiBFeGFtcGxlOg0KKyAqIDxwcmU+DQorICogY2xhc3MgRm9vIHsgDQorICogICBkZWYgaW5kZXg9MCANCisgKiAgIGRlZiBnZXRYKCl7IGluZGV4Kys7IHJldHVybiBpbmRleCB9DQorICogfQ0KKyAqIGRlZiBmb28gPSBuZXcgRm9vKCkNCisgKiBkZWYgcmVzdWx0ID0gZm9vLnggPzogImZhbHNlIGNhc2UiIA0KKyAqIGFzc2VydCBmb28uaW5kZXggPT0gMQ0KKyAqIGFzc2VydCByZXN1bHQgPT0gMSANCisgKiA8cHJlPg0KKyAqIA0KKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmJsYWNrZHJhZ0BnbXgub3JnIj5Kb2NoZW4gVGhlb2Rvcm91PC9hPg0KKyAqIEBzaW5jZSAxLjENCisgKi8NCitwdWJsaWMgY2xhc3MgRWx2aXNPcGVyYXRvckV4cHJlc3Npb24gZXh0ZW5kcyBUZXJuYXJ5RXhwcmVzc2lvbiB7DQorDQorICAgIHB1YmxpYyBFbHZpc09wZXJhdG9yRXhwcmVzc2lvbihFeHByZXNzaW9uIGJhc2UsIEV4cHJlc3Npb24gZmFsc2VFeHByZXNzaW9uKSB7DQorICAgICAgICBzdXBlcihnZXRCb29sKGJhc2UpLCBiYXNlLCBmYWxzZUV4cHJlc3Npb24pOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIHN0YXRpYyBCb29sZWFuRXhwcmVzc2lvbiBnZXRCb29sKEV4cHJlc3Npb24gYmFzZSkgew0KKyAgICAgICBCb29sZWFuRXhwcmVzc2lvbiBiZSA9IG5ldyBCb29sZWFuRXhwcmVzc2lvbihiYXNlKTsNCisgICAgICAgYmUuc2V0U291cmNlUG9zaXRpb24oYmFzZSk7DQorICAgICAgIHJldHVybiBiZTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCB2aXNpdChHcm9vdnlDb2RlVmlzaXRvciB2aXNpdG9yKSB7DQorICAgICAgICB2aXNpdG9yLnZpc2l0U2hvcnRUZXJuYXJ5RXhwcmVzc2lvbih0aGlzKTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIEV4cHJlc3Npb24gdHJhbnNmb3JtRXhwcmVzc2lvbihFeHByZXNzaW9uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIpIHsNCisgICAgICAgIEV4cHJlc3Npb24gcmV0ID0gbmV3IEVsdmlzT3BlcmF0b3JFeHByZXNzaW9uKA0KKyAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0oZ2V0VHJ1ZUV4cHJlc3Npb24oKSksDQorICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShnZXRGYWxzZUV4cHJlc3Npb24oKSkpOw0KKyAgICAgICAgcmV0LnNldFNvdXJjZVBvc2l0aW9uKHRoaXMpOw0KKyAgICAgICAgcmV0dXJuIHJldDsgDQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L2V4cHIvRW1wdHlFeHByZXNzaW9uLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvZXhwci9FbXB0eUV4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzFmODQxCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L2V4cHIvRW1wdHlFeHByZXNzaW9uLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoNCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4NCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHI7DQorDQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0Lkdyb292eUNvZGVWaXNpdG9yOw0KKw0KKy8qKg0KKyAqIFRoaXMgY2xhc3MgaXMgYSBwbGFjZSBob2xkZXIgZm9yIGFuIGVtcHR5IGV4cHJlc3Npb24uIA0KKyAqIEVtcHR5IGV4cHJlc3Npb24gYXJlIHVzZWQgaW4gY2xvc3VyZXMgbGlzdHMgbGlrZSAoOykuIER1cmluZw0KKyAqIGNsYXNzIEdlbmVyYXRpb24gdGhpcyBleHByZXNzaW9uIHNob3VsZCBiZSBlaXRoZXIgaWdub3JlZCBvcg0KKyAqIHJlYXBsY2Ugd2l0aCBhIG51bGwgdmFsdWUuDQorICogICANCisgKiBAYXV0aG9yIEpvY2hlbiBUaGVvZG9yb3UNCisgKiBAc2VlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuRW1wdHlTdGF0ZW1lbnQNCisgKi8NCitwdWJsaWMgY2xhc3MgRW1wdHlFeHByZXNzaW9uIGV4dGVuZHMgRXhwcmVzc2lvbiB7DQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW1wdHlFeHByZXNzaW9uIElOU1RBTkNFID0gbmV3IEVtcHR5RXhwcmVzc2lvbigpOw0KKw0KKyAgICBwdWJsaWMgRXhwcmVzc2lvbiB0cmFuc2Zvcm1FeHByZXNzaW9uKEV4cHJlc3Npb25UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lcikgew0KKyAgICAgICAgcmV0dXJuIHRoaXM7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgdmlzaXQoR3Jvb3Z5Q29kZVZpc2l0b3IgdmlzaXRvcikgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL0V4cHJlc3Npb24uamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL0V4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjIyNWU1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L2V4cHIvRXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5BU1ROb2RlOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LkNsYXNzSGVscGVyOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LkNsYXNzTm9kZTsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgYmFzZSBjbGFzcyBmb3IgZXhwcmVzc2lvbnMgd2hpY2ggZXZhbHVhdGUgYXMgYW4gb2JqZWN0CisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBFeHByZXNzaW9uIGV4dGVuZHMgQVNUTm9kZSB7CisKKyAgICBwcml2YXRlIENsYXNzTm9kZSB0eXBlPUNsYXNzSGVscGVyLkRZTkFNSUNfVFlQRTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBleHByZXNzaW9uIGNhbGxpbmcgdGhlIHRyYW5zZm9ybWVyIG9uIGFueSBuZXN0ZWQgZXhwcmVzc2lvbnMgCisgICAgICogQHBhcmFtIHRyYW5zZm9ybWVyCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IEV4cHJlc3Npb24gdHJhbnNmb3JtRXhwcmVzc2lvbihFeHByZXNzaW9uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIpOworCisgICAgLyoqCisgICAgICogVHJhbnNmb3JtcyB0aGUgbGlzdCBvZiBleHByZXNzaW9ucworICAgICAqIEByZXR1cm4gYSBuZXcgbGlzdCBvZiB0cmFuc2Zvcm1lZCBleHByZXNzaW9ucworICAgICAqLworICAgIHByb3RlY3RlZCBMaXN0IHRyYW5zZm9ybUV4cHJlc3Npb25zKExpc3QgZXhwcmVzc2lvbnMsIEV4cHJlc3Npb25UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lcikgeworICAgICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KGV4cHJlc3Npb25zLnNpemUoKSk7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGV4cHJlc3Npb25zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApIHsKKyAgICAgICAgICAgIGxpc3QuYWRkKHRyYW5zZm9ybWVyLnRyYW5zZm9ybSgoRXhwcmVzc2lvbikgaXRlci5uZXh0KCkpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGlzdDsKKyAgICB9CisgICAgCisgICAgcHVibGljIENsYXNzTm9kZSBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gdHlwZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0VHlwZShDbGFzc05vZGUgdCkgeworICAgICAgICB0eXBlPXQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L2V4cHIvRXhwcmVzc2lvblRyYW5zZm9ybWVyLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvZXhwci9FeHByZXNzaW9uVHJhbnNmb3JtZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzQyZTA5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L2V4cHIvRXhwcmVzc2lvblRyYW5zZm9ybWVyLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHI7CisKKworLyoqCisgKiBQcm92aWRlcyBhIHdheSB0byB0cmFuc2Zvcm0gZXhwcmVzc2lvbnMKKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGludGVyZmFjZSBFeHByZXNzaW9uVHJhbnNmb3JtZXIgeworICAgIAorICAgIC8qKiAKKyAgICAgKiBUcmFuc2Zvcm1zIHRoZSBnaXZlbiBleHByZXNzaW9uIGludG8gYW5vdGhlciBleHByZXNzaW9uCisgICAgICovCisgICAgRXhwcmVzc2lvbiB0cmFuc2Zvcm0oRXhwcmVzc2lvbiBleHByZXNzaW9uKTsKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL0ZpZWxkRXhwcmVzc2lvbi5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L2V4cHIvRmllbGRFeHByZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY5NDEzNgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL0ZpZWxkRXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuQ2xhc3NOb2RlOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LkZpZWxkTm9kZTsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5Hcm9vdnlDb2RlVmlzaXRvcjsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgZmllbGQgYWNjZXNzIHN1Y2ggYXMgdGhlIGV4cHJlc3Npb24gInRoaXMuZm9vIi4KKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIEZpZWxkRXhwcmVzc2lvbiBleHRlbmRzIEV4cHJlc3Npb24geworCisgICAgcHJpdmF0ZSBmaW5hbCBGaWVsZE5vZGUgZmllbGQ7CisgICAgCisgICAgcHVibGljIEZpZWxkRXhwcmVzc2lvbihGaWVsZE5vZGUgZmllbGQpIHsKKyAgICAgICAgdGhpcy5maWVsZCA9IGZpZWxkOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChHcm9vdnlDb2RlVmlzaXRvciB2aXNpdG9yKSB7CisgICAgICAgIHZpc2l0b3IudmlzaXRGaWVsZEV4cHJlc3Npb24odGhpcyk7CisgICAgfQorCisgICAgcHVibGljIEV4cHJlc3Npb24gdHJhbnNmb3JtRXhwcmVzc2lvbihFeHByZXNzaW9uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmllbGROYW1lKCkgeworICAgICAgICByZXR1cm4gZmllbGQuZ2V0TmFtZSgpOworICAgIH0KKworICAgIHB1YmxpYyBGaWVsZE5vZGUgZ2V0RmllbGQoKSB7CisgICAgICAgIHJldHVybiBmaWVsZDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CisgICAgICAgIHJldHVybiAidGhpcy4iICsgZmllbGQuZ2V0TmFtZSgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRHluYW1pY1R5cGVkKCkgeworICAgICAgICByZXR1cm4gZmllbGQuaXNEeW5hbWljVHlwZWQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKENsYXNzTm9kZSB0eXBlKSB7CisgICAgICAgIHN1cGVyLnNldFR5cGUodHlwZSk7CisgICAgICAgIGZpZWxkLnNldFR5cGUodHlwZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBDbGFzc05vZGUgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIGZpZWxkLmdldFR5cGUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvZXhwci9HU3RyaW5nRXhwcmVzc2lvbi5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L2V4cHIvR1N0cmluZ0V4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGU0ZDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L2V4cHIvR1N0cmluZ0V4cHJlc3Npb24uamF2YQpAQCAtMCwwICsxLDExMyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LkNsYXNzSGVscGVyOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0Lkdyb292eUNvZGVWaXNpdG9yOworCisvKioKKyAqIFJlcHJlc2VudHMgYSBTdHJpbmcgZXhwcmVzc2lvbiB3aGljaCBjb250YWlucyBlbWJlZGRlZCB2YWx1ZXMgaW5zaWRlCisgKiBpdCBzdWNoIGFzICJoZWxsbyB0aGVyZSAke3VzZXJ9IGhvdyBhcmUgeW91IiB3aGljaCBpcyBleHBhbmRlZCBsYXppbHkKKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIEdTdHJpbmdFeHByZXNzaW9uIGV4dGVuZHMgRXhwcmVzc2lvbiB7CisKKyAgICBwcml2YXRlIFN0cmluZyB2ZXJiYXRpbVRleHQ7CisgICAgcHJpdmF0ZSBMaXN0IHN0cmluZ3MgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgcHJpdmF0ZSBMaXN0IHZhbHVlcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAKKyAgICBwdWJsaWMgR1N0cmluZ0V4cHJlc3Npb24oU3RyaW5nIHZlcmJhdGltVGV4dCkgeworICAgICAgICB0aGlzLnZlcmJhdGltVGV4dCA9IHZlcmJhdGltVGV4dDsKKyAgICAgICAgc3VwZXIuc2V0VHlwZShDbGFzc0hlbHBlci5HU1RSSU5HX1RZUEUpOworICAgIH0KKworICAgIHB1YmxpYyBHU3RyaW5nRXhwcmVzc2lvbihTdHJpbmcgdmVyYmF0aW1UZXh0LCBMaXN0IHN0cmluZ3MsIExpc3QgdmFsdWVzKSB7CisgICAgICAgIHRoaXMudmVyYmF0aW1UZXh0ID0gdmVyYmF0aW1UZXh0OworICAgICAgICB0aGlzLnN0cmluZ3MgPSBzdHJpbmdzOworICAgICAgICB0aGlzLnZhbHVlcyA9IHZhbHVlczsKKyAgICAgICAgc3VwZXIuc2V0VHlwZShDbGFzc0hlbHBlci5HU1RSSU5HX1RZUEUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0KEdyb292eUNvZGVWaXNpdG9yIHZpc2l0b3IpIHsKKyAgICAgICAgdmlzaXRvci52aXNpdEdTdHJpbmdFeHByZXNzaW9uKHRoaXMpOworICAgIH0KKworICAgIHB1YmxpYyBFeHByZXNzaW9uIHRyYW5zZm9ybUV4cHJlc3Npb24oRXhwcmVzc2lvblRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyKSB7CisgICAgICAgIEV4cHJlc3Npb24gcmV0ID0gbmV3IEdTdHJpbmdFeHByZXNzaW9uKAorICAgICAgICAgICAgICAgIHZlcmJhdGltVGV4dCwKKyAgICAgICAgICAgICAgICB0cmFuc2Zvcm1FeHByZXNzaW9ucyhzdHJpbmdzLCB0cmFuc2Zvcm1lciksCisgICAgICAgICAgICAgICAgdHJhbnNmb3JtRXhwcmVzc2lvbnModmFsdWVzLCB0cmFuc2Zvcm1lcikpOworICAgICAgICByZXQuc2V0U291cmNlUG9zaXRpb24odGhpcyk7CisgICAgICAgIHJldHVybiByZXQ7ICAgICAgICAKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gc3VwZXIudG9TdHJpbmcoKSArICJbc3RyaW5nczogIiArIHN0cmluZ3MgKyAiIHZhbHVlczogIiArIHZhbHVlcyArICJdIjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CisgICAgICAgIHJldHVybiB2ZXJiYXRpbVRleHQ7CisgICAgfQorCisgICAgcHVibGljIExpc3QgZ2V0U3RyaW5ncygpIHsKKyAgICAgICAgcmV0dXJuIHN0cmluZ3M7CisgICAgfQorCisgICAgcHVibGljIExpc3QgZ2V0VmFsdWVzKCkgeworICAgICAgICByZXR1cm4gdmFsdWVzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZFN0cmluZyhDb25zdGFudEV4cHJlc3Npb24gdGV4dCkgeworICAgICAgICBpZiAodGV4dCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkNhbm5vdCBhZGQgYSBudWxsIHRleHQgZXhwcmVzc2lvbiIpOworICAgICAgICB9CisgICAgICAgIHN0cmluZ3MuYWRkKHRleHQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZFZhbHVlKEV4cHJlc3Npb24gdmFsdWUpIHsKKyAgICAgICAgLy8gSWYgdGhlIGZpcnN0IHRoaW5nIGlzIGFuIHZhbHVlLCB0aGVuIHdlIG5lZWQgYSBkdW1teSBlbXB0eSBzdHJpbmcgaW4gZnJvbnQgb2YgaXQgc28gdGhhdCB3aGVuIHdlCisgICAgICAgIC8vIHRvU3RyaW5nIGl0IHRoZXkgY29tZSBvdXQgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuCisgICAgICAgIGlmIChzdHJpbmdzLnNpemUoKSA9PSAwKQorICAgICAgICAgICAgc3RyaW5ncy5hZGQoQ29uc3RhbnRFeHByZXNzaW9uLkVNUFRZX1NUUklORyk7CisgICAgICAgIHZhbHVlcy5hZGQodmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBFeHByZXNzaW9uIGdldFZhbHVlKGludCBpZHgpIHsKKyAgICAgICAgcmV0dXJuIChFeHByZXNzaW9uKSB2YWx1ZXMuZ2V0KGlkeCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNDb25zdGFudFN0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlcy5pc0VtcHR5KCk7CisgICAgfQorCisgICAgcHVibGljIEV4cHJlc3Npb24gYXNDb25zdGFudFN0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gc3RyaW5ncy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIENvbnN0YW50RXhwcmVzc2lvbiBleHByZXNzaW9uID0gKENvbnN0YW50RXhwcmVzc2lvbikgaXRlci5uZXh0KCk7CisgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBleHByZXNzaW9uLmdldFZhbHVlKCk7CisgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQodmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgQ29uc3RhbnRFeHByZXNzaW9uKGJ1ZmZlci50b1N0cmluZygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvZXhwci9MaXN0RXhwcmVzc2lvbi5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L2V4cHIvTGlzdEV4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWQ1NWY1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L2V4cHIvTGlzdEV4cHJlc3Npb24uamF2YQpAQCAtMCwwICsxLDg3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuZXhwcjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuQ2xhc3NIZWxwZXI7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuR3Jvb3Z5Q29kZVZpc2l0b3I7CisKKy8qKgorICogUmVwcmVzZW50cyBhIGxpc3QgZXhwcmVzc2lvbiBbMSwgMiwgM10gd2hpY2ggY3JlYXRlcyBhIG11dGFibGUgTGlzdAorICogCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgTGlzdEV4cHJlc3Npb24gZXh0ZW5kcyBFeHByZXNzaW9uIHsKKyAgICBwcml2YXRlIExpc3QgZXhwcmVzc2lvbnM7CisKKyAgICBwdWJsaWMgTGlzdEV4cHJlc3Npb24oKSB7CisgICAgICAgIHRoaXMobmV3IEFycmF5TGlzdCgpKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIExpc3RFeHByZXNzaW9uKExpc3QgZXhwcmVzc2lvbnMpIHsKKyAgICAgICAgdGhpcy5leHByZXNzaW9ucyA9IGV4cHJlc3Npb25zOworICAgICAgICAvL1RPRE86IGdldCB0aGUgdHlwZSdzIG9mIHRoZSBleHByZXNzaW9ucyB0byBzcGVjaWZ5IHRoZQorICAgICAgICAvLyBsaXN0IHR5cGUgdG8gTGlzdDxYPiBpZiBwb3NzaWJsZS4KKyAgICAgICAgc2V0VHlwZShDbGFzc0hlbHBlci5MSVNUX1RZUEUpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBhZGRFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgICAgICBleHByZXNzaW9ucy5hZGQoZXhwcmVzc2lvbik7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBMaXN0IGdldEV4cHJlc3Npb25zKCkgeworICAgICAgICByZXR1cm4gZXhwcmVzc2lvbnM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXQoR3Jvb3Z5Q29kZVZpc2l0b3IgdmlzaXRvcikgeworICAgICAgICB2aXNpdG9yLnZpc2l0TGlzdEV4cHJlc3Npb24odGhpcyk7CisgICAgfQorCisgICAgcHVibGljIEV4cHJlc3Npb24gdHJhbnNmb3JtRXhwcmVzc2lvbihFeHByZXNzaW9uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIpIHsKKyAgICAgICAgRXhwcmVzc2lvbiByZXQgPSBuZXcgTGlzdEV4cHJlc3Npb24odHJhbnNmb3JtRXhwcmVzc2lvbnMoZ2V0RXhwcmVzc2lvbnMoKSwgdHJhbnNmb3JtZXIpKTsKKyAgICAgICAgcmV0LnNldFNvdXJjZVBvc2l0aW9uKHRoaXMpOworICAgICAgICByZXR1cm4gcmV0OyAgICAgICAKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKGludCBpKSB7CisgICAgICAgIHJldHVybiAoRXhwcmVzc2lvbikgZXhwcmVzc2lvbnMuZ2V0KGkpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoIlsiKTsKKyAgICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGV4cHJlc3Npb25zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApIHsKKyAgICAgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCgoRXhwcmVzc2lvbilpdGVyLm5leHQoKSkuZ2V0VGV4dCgpKTsKKyAgICAgICAgfQorICAgICAgICBidWZmZXIuYXBwZW5kKCJdIik7CisgICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gc3VwZXIudG9TdHJpbmcoKSArIGV4cHJlc3Npb25zOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL01hcEVudHJ5RXhwcmVzc2lvbi5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L2V4cHIvTWFwRW50cnlFeHByZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc1MmFmZgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL01hcEVudHJ5RXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuR3Jvb3Z5Q29kZVZpc2l0b3I7CisKKworLyoqCisgKiBSZXByZXNlbnRzIGFuIGVudHJ5IGluc2lkZSBhIG1hcCBleHByZXNzaW9uIHN1Y2ggYXMgMSA6IDIuCisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBNYXBFbnRyeUV4cHJlc3Npb24gZXh0ZW5kcyBFeHByZXNzaW9uIHsKKyAgICBwcml2YXRlIEV4cHJlc3Npb24ga2V5RXhwcmVzc2lvbjsKKyAgICBwcml2YXRlIEV4cHJlc3Npb24gdmFsdWVFeHByZXNzaW9uOworCisgICAgcHVibGljIE1hcEVudHJ5RXhwcmVzc2lvbihFeHByZXNzaW9uIGtleUV4cHJlc3Npb24sIEV4cHJlc3Npb24gdmFsdWVFeHByZXNzaW9uKSB7CisgICAgICAgIHRoaXMua2V5RXhwcmVzc2lvbiA9IGtleUV4cHJlc3Npb247CisgICAgICAgIHRoaXMudmFsdWVFeHByZXNzaW9uID0gdmFsdWVFeHByZXNzaW9uOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0KEdyb292eUNvZGVWaXNpdG9yIHZpc2l0b3IpIHsKKyAgICAgICAgdmlzaXRvci52aXNpdE1hcEVudHJ5RXhwcmVzc2lvbih0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiB0cmFuc2Zvcm1FeHByZXNzaW9uKEV4cHJlc3Npb25UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lcikgeworICAgICAgICBFeHByZXNzaW9uIHJldCA9IG5ldyBNYXBFbnRyeUV4cHJlc3Npb24odHJhbnNmb3JtZXIudHJhbnNmb3JtKGtleUV4cHJlc3Npb24pLCB0cmFuc2Zvcm1lci50cmFuc2Zvcm0odmFsdWVFeHByZXNzaW9uKSk7CisgICAgICAgIHJldC5zZXRTb3VyY2VQb3NpdGlvbih0aGlzKTsKKyAgICAgICAgcmV0dXJuIHJldDsgICAgICAgIAorICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBzdXBlci50b1N0cmluZygpICsgIihrZXk6ICIgKyBrZXlFeHByZXNzaW9uICsgIiwgdmFsdWU6ICIgKyB2YWx1ZUV4cHJlc3Npb24gKyAiKSI7CisgICAgfQorCisgICAgcHVibGljIEV4cHJlc3Npb24gZ2V0S2V5RXhwcmVzc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIGtleUV4cHJlc3Npb247CisgICAgfQorCisgICAgcHVibGljIEV4cHJlc3Npb24gZ2V0VmFsdWVFeHByZXNzaW9uKCkgeworICAgICAgICByZXR1cm4gdmFsdWVFeHByZXNzaW9uOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L2V4cHIvTWFwRXhwcmVzc2lvbi5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L2V4cHIvTWFwRXhwcmVzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZmE0MWQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvZXhwci9NYXBFeHByZXNzaW9uLmphdmEKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuQ2xhc3NIZWxwZXI7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuR3Jvb3Z5Q29kZVZpc2l0b3I7CisKKy8qKgorICogUmVwcmVzZW50cyBhIG1hcCBleHByZXNzaW9uIFsxIDogMiwgImEiIDogImIiLCB4IDogeV0gd2hpY2ggY3JlYXRlcyBhIG11dGFibGUgTWFwCisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIE1hcEV4cHJlc3Npb24gZXh0ZW5kcyBFeHByZXNzaW9uIHsKKyAgICBwcml2YXRlIGZpbmFsIExpc3QgbWFwRW50cnlFeHByZXNzaW9uczsKKworICAgIHB1YmxpYyBNYXBFeHByZXNzaW9uKCkgeworICAgICAgICB0aGlzKG5ldyBBcnJheUxpc3QoKSk7CisgICAgfQorCisgICAgcHVibGljIE1hcEV4cHJlc3Npb24oTGlzdCBtYXBFbnRyeUV4cHJlc3Npb25zKSB7CisgICAgICAgIHRoaXMubWFwRW50cnlFeHByZXNzaW9ucyA9IG1hcEVudHJ5RXhwcmVzc2lvbnM7CisgICAgICAgIC8vVE9ETzogZ2V0IHRoZSB0eXBlJ3Mgb2YgdGhlIGV4cHJlc3Npb25zIHRvIHNwZWNpZnkgdGhlCisgICAgICAgIC8vIG1hcCB0eXBlIHRvIE1hcDxYPiBpZiBwb3NzaWJsZS4KKyAgICAgICAgc2V0VHlwZShDbGFzc0hlbHBlci5NQVBfVFlQRSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkTWFwRW50cnlFeHByZXNzaW9uKE1hcEVudHJ5RXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisgICAgICAgIG1hcEVudHJ5RXhwcmVzc2lvbnMuYWRkKGV4cHJlc3Npb24pOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0IGdldE1hcEVudHJ5RXhwcmVzc2lvbnMoKSB7CisgICAgICAgIHJldHVybiBtYXBFbnRyeUV4cHJlc3Npb25zOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0KEdyb292eUNvZGVWaXNpdG9yIHZpc2l0b3IpIHsKKyAgICAgICAgdmlzaXRvci52aXNpdE1hcEV4cHJlc3Npb24odGhpcyk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNEeW5hbWljKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIEV4cHJlc3Npb24gdHJhbnNmb3JtRXhwcmVzc2lvbihFeHByZXNzaW9uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIpIHsKKyAgICAgICAgRXhwcmVzc2lvbiByZXQgPSBuZXcgTWFwRXhwcmVzc2lvbih0cmFuc2Zvcm1FeHByZXNzaW9ucyhnZXRNYXBFbnRyeUV4cHJlc3Npb25zKCksIHRyYW5zZm9ybWVyKSk7CisgICAgICAgIHJldC5zZXRTb3VyY2VQb3NpdGlvbih0aGlzKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gc3VwZXIudG9TdHJpbmcoKSArIG1hcEVudHJ5RXhwcmVzc2lvbnM7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKDMyKTsKKyAgICAgICAgc2IuYXBwZW5kKCJbIik7CisgICAgICAgIGludCBzaXplID0gbWFwRW50cnlFeHByZXNzaW9ucy5zaXplKCk7CisgICAgICAgIE1hcEVudHJ5RXhwcmVzc2lvbiBtYXBFbnRyeUV4cHJlc3Npb24gPSBudWxsOworICAgICAgICBpZiAoc2l6ZSA+IDApIHsKKyAgICAgICAgICAgIG1hcEVudHJ5RXhwcmVzc2lvbiA9IChNYXBFbnRyeUV4cHJlc3Npb24pIG1hcEVudHJ5RXhwcmVzc2lvbnMuZ2V0KDApOworICAgICAgICAgICAgc2IuYXBwZW5kKG1hcEVudHJ5RXhwcmVzc2lvbi5nZXRLZXlFeHByZXNzaW9uKCkuZ2V0VGV4dCgpICsgIjoiICsgbWFwRW50cnlFeHByZXNzaW9uLmdldFZhbHVlRXhwcmVzc2lvbigpLmdldFRleHQoKSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgICAgIG1hcEVudHJ5RXhwcmVzc2lvbiA9IChNYXBFbnRyeUV4cHJlc3Npb24pIG1hcEVudHJ5RXhwcmVzc2lvbnMuZ2V0KGkpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLCAiICsgbWFwRW50cnlFeHByZXNzaW9uLmdldEtleUV4cHJlc3Npb24oKS5nZXRUZXh0KCkgKyAiOiIgKyBtYXBFbnRyeUV4cHJlc3Npb24uZ2V0VmFsdWVFeHByZXNzaW9uKCkuZ2V0VGV4dCgpKTsKKyAgICAgICAgICAgICAgICBpZiAoc2IubGVuZ3RoKCkgPiAxMjAgJiYgaSA8IHNpemUgLSAxKSB7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLCAuLi4gIik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoIl0iKTsKKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkTWFwRW50cnlFeHByZXNzaW9uKEV4cHJlc3Npb24ga2V5RXhwcmVzc2lvbiwgRXhwcmVzc2lvbiB2YWx1ZUV4cHJlc3Npb24pIHsKKyAgICAgICAgYWRkTWFwRW50cnlFeHByZXNzaW9uKG5ldyBNYXBFbnRyeUV4cHJlc3Npb24oa2V5RXhwcmVzc2lvbiwgdmFsdWVFeHByZXNzaW9uKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvZXhwci9NZXRob2RDYWxsRXhwcmVzc2lvbi5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L2V4cHIvTWV0aG9kQ2FsbEV4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWFlNTNlCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L2V4cHIvTWV0aG9kQ2FsbEV4cHJlc3Npb24uamF2YQpAQCAtMCwwICsxLDE2MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHI7CisKK2ltcG9ydCBncm9vdnkubGFuZy5NZXRhTWV0aG9kOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuQ2xhc3NIZWxwZXI7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuR3Jvb3Z5Q29kZVZpc2l0b3I7CisKKy8qKgorICogQSBtZXRob2QgY2FsbCBvbiBhbiBvYmplY3Qgb3IgY2xhc3MKKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIE1ldGhvZENhbGxFeHByZXNzaW9uIGV4dGVuZHMgRXhwcmVzc2lvbiB7CisKKyAgICBwcml2YXRlIEV4cHJlc3Npb24gb2JqZWN0RXhwcmVzc2lvbjsKKyAgICBwcml2YXRlIEV4cHJlc3Npb24gbWV0aG9kOworICAgIHByaXZhdGUgRXhwcmVzc2lvbiBhcmd1bWVudHM7CisgICAgcHJpdmF0ZSBib29sZWFuIHNwcmVhZFNhZmUgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gc2FmZSA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBpbXBsaWNpdFRoaXM7CisgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFeHByZXNzaW9uIE5PX0FSR1VNRU5UUyA9IG5ldyBUdXBsZUV4cHJlc3Npb24oKTsKKworICAgIHB1YmxpYyBNZXRhTWV0aG9kIGdldE1ldGFNZXRob2QoKSB7CisgICAgICAgIHJldHVybiBtZXRhTWV0aG9kOworICAgIH0KKworICAgIHByaXZhdGUgTWV0YU1ldGhvZCBtZXRhTWV0aG9kID0gbnVsbDsKKworICAgIHB1YmxpYyBNZXRob2RDYWxsRXhwcmVzc2lvbihFeHByZXNzaW9uIG9iamVjdEV4cHJlc3Npb24sIFN0cmluZyBtZXRob2QsIEV4cHJlc3Npb24gYXJndW1lbnRzKSB7CisgICAgICAgIHRoaXMob2JqZWN0RXhwcmVzc2lvbixuZXcgQ29uc3RhbnRFeHByZXNzaW9uKG1ldGhvZCksYXJndW1lbnRzKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIE1ldGhvZENhbGxFeHByZXNzaW9uKEV4cHJlc3Npb24gb2JqZWN0RXhwcmVzc2lvbiwgRXhwcmVzc2lvbiBtZXRob2QsIEV4cHJlc3Npb24gYXJndW1lbnRzKSB7CisgICAgICAgIHRoaXMub2JqZWN0RXhwcmVzc2lvbiA9IG9iamVjdEV4cHJlc3Npb247CisgICAgICAgIHRoaXMubWV0aG9kID0gbWV0aG9kOworICAgICAgICB0aGlzLmFyZ3VtZW50cyA9IGFyZ3VtZW50czsKKyAgICAgICAgLy9UT0RPOiBzZXQgY29ycmVjdCB0eXBlIGhlcmUKKyAgICAgICAgLy8gaWYgc2V0dGluZyB0eXBlIGFuZCBhIG1ldGhvZGNhbGwgaXMgdGhlIGxhc3QgZXhwcmVzc2lvbiBpbiBhIG1ldGhvZCwKKyAgICAgICAgLy8gdGhlbiB0aGUgbWV0aG9kIHdpbGwgcmV0dXJuIG51bGwgaWYgdGhlIG1ldGhvZCBpdHNlbGYgaXMgbm90IHZvaWQgdG9vIQorICAgICAgICAvLyAoaW4gYnl0ZWNvZGUgYWZ0ZXIgY2FsbDogYWNvbnN0X251bGwsIGFyZXR1cm4pCisgICAgICAgIHRoaXMuc2V0VHlwZShDbGFzc0hlbHBlci5EWU5BTUlDX1RZUEUpOworICAgICAgICB0aGlzLnNldEltcGxpY2l0VGhpcyh0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChHcm9vdnlDb2RlVmlzaXRvciB2aXNpdG9yKSB7CisgICAgICAgIHZpc2l0b3IudmlzaXRNZXRob2RDYWxsRXhwcmVzc2lvbih0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiB0cmFuc2Zvcm1FeHByZXNzaW9uKEV4cHJlc3Npb25UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lcikgeworICAgICAgICBNZXRob2RDYWxsRXhwcmVzc2lvbiBhbnN3ZXIgPQorICAgICAgICAgICAgbmV3IE1ldGhvZENhbGxFeHByZXNzaW9uKHRyYW5zZm9ybWVyLnRyYW5zZm9ybShvYmplY3RFeHByZXNzaW9uKSwgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG1ldGhvZCksIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShhcmd1bWVudHMpKTsKKyAgICAgICAgYW5zd2VyLnNldFNhZmUoc2FmZSk7CisgICAgICAgIGFuc3dlci5zZXRTb3VyY2VQb3NpdGlvbih0aGlzKTsKKyAgICAgICAgcmV0dXJuIGFuc3dlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBnZXRBcmd1bWVudHMoKSB7CisgICAgICAgIHJldHVybiBhcmd1bWVudHM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QXJndW1lbnRzKEV4cHJlc3Npb24gYXJndW1lbnRzKQorICAgIHsKKyAgICAgIHRoaXMuYXJndW1lbnRzID0gYXJndW1lbnRzOworICAgIH0KKworICAgIHB1YmxpYyBFeHByZXNzaW9uIGdldE1ldGhvZCgpIHsKKyAgICAgICAgcmV0dXJuIG1ldGhvZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNZXRob2QoRXhwcmVzc2lvbiBtZXRob2QpCisgICAgeworICAgICAgdGhpcy5tZXRob2QgPSBtZXRob2Q7CisgICAgfQorCisgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIG1ldGhvZCBuYW1lIGFzIFN0cmluZyBpZiBpdCBpcyBubyBkeW5hbWljCisgICAgICogY2FsY3VsYXRlZCBtZXRob2QgbmFtZSwgYnV0IGEgY29uc3RhbnQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRNZXRob2RBc1N0cmluZygpIHsKKyAgICAgICAgaWYgKCEgKG1ldGhvZCBpbnN0YW5jZW9mIENvbnN0YW50RXhwcmVzc2lvbikpIHJldHVybiBudWxsOworICAgICAgICBDb25zdGFudEV4cHJlc3Npb24gY29uc3RhbnQgPSAoQ29uc3RhbnRFeHByZXNzaW9uKSBtZXRob2Q7CisgICAgICAgIHJldHVybiBjb25zdGFudC5nZXRUZXh0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0T2JqZWN0RXhwcmVzc2lvbihFeHByZXNzaW9uIG9iamVjdEV4cHJlc3Npb24pCisgICAgeworICAgICAgdGhpcy5vYmplY3RFeHByZXNzaW9uID0gb2JqZWN0RXhwcmVzc2lvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBnZXRPYmplY3RFeHByZXNzaW9uKCkgeworICAgICAgICByZXR1cm4gb2JqZWN0RXhwcmVzc2lvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CisgICAgICAgIHJldHVybiBvYmplY3RFeHByZXNzaW9uLmdldFRleHQoKSArICIuIiArIG1ldGhvZC5nZXRUZXh0KCkgKyBhcmd1bWVudHMuZ2V0VGV4dCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gaXMgdGhpcyBhIHNhZmUgbWV0aG9kIGNhbGwsIGkuZS4gaWYgdHJ1ZSB0aGVuIGlmIHRoZSBzb3VyY2Ugb2JqZWN0IGlzIG51bGwKKyAgICAgKiB0aGVuIHRoaXMgbWV0aG9kIGNhbGwgd2lsbCByZXR1cm4gbnVsbCByYXRoZXIgdGhhbiB0aHJvd2luZyBhIG51bGwgcG9pbnRlciBleGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NhZmUoKSB7CisgICAgICAgIHJldHVybiBzYWZlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNhZmUoYm9vbGVhbiBzYWZlKSB7CisgICAgICAgIHRoaXMuc2FmZSA9IHNhZmU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNTcHJlYWRTYWZlKCkgeworICAgICAgICByZXR1cm4gc3ByZWFkU2FmZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTcHJlYWRTYWZlKGJvb2xlYW4gdmFsdWUpIHsKKyAgICAgICAgc3ByZWFkU2FmZSA9IHZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBubyBvYmplY3QgZXhwcmVzc2lvbiB3YXMgc3BlY2lmaWVkIG90aGVyd2lzZSBpZiAKKyAgICAgKiBzb21lIGV4cHJlc3Npb24gd2FzIHNwZWNpZmllZCBmb3IgdGhlIG9iamVjdCBvbiB3aGljaCB0byBldmFsdWF0ZQorICAgICAqIHRoZSBtZXRob2QgdGhlbiByZXR1cm4gZmFsc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ltcGxpY2l0VGhpcygpIHsKKyAgICAgICAgcmV0dXJuIGltcGxpY2l0VGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJbXBsaWNpdFRoaXMoYm9vbGVhbiBpbXBsaWNpdFRoaXMpIHsKKyAgICAgICAgdGhpcy5pbXBsaWNpdFRoaXMgPSBpbXBsaWNpdFRoaXM7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCkKKyAgICAgICAgICAgICsgIltvYmplY3Q6ICIKKyAgICAgICAgICAgICsgb2JqZWN0RXhwcmVzc2lvbgorICAgICAgICAgICAgKyAiIG1ldGhvZDogIgorICAgICAgICAgICAgKyBtZXRob2QKKyAgICAgICAgICAgICsgIiBhcmd1bWVudHM6ICIKKyAgICAgICAgICAgICsgYXJndW1lbnRzCisgICAgICAgICAgICArICJdIjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNZXRhTWV0aG9kKE1ldGFNZXRob2QgbW1ldGgpIHsKKyAgICAgICAgdGhpcy5tZXRhTWV0aG9kID0gbW1ldGg7CisgICAgICAgIHN1cGVyLnNldFR5cGUoQ2xhc3NIZWxwZXIubWFrZShtbWV0aC5nZXRSZXR1cm5UeXBlKCkpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvZXhwci9NZXRob2RQb2ludGVyRXhwcmVzc2lvbi5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L2V4cHIvTWV0aG9kUG9pbnRlckV4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTQ0YjAxCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L2V4cHIvTWV0aG9kUG9pbnRlckV4cHJlc3Npb24uamF2YQpAQCAtMCwwICsxLDg5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuZXhwcjsKKworaW1wb3J0IGdyb292eS5sYW5nLkNsb3N1cmU7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5DbGFzc0hlbHBlcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5DbGFzc05vZGU7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuR3Jvb3Z5Q29kZVZpc2l0b3I7CisKKy8qKgorICogUmVwcmVzZW50cyBhIG1ldGhvZCBwb2ludGVyIG9uIGFuIG9iamVjdCBzdWNoIGFzCisgKiBmb28uJmJhciB3aGljaCBtZWFucyBmaW5kIHRoZSBtZXRob2QgcG9pbnRlciBvbiBmb28gZm9yIHRoZSBtZXRob2QgY2FsbGVkICJiYXIiCisgKiB3aGljaCBpcyBlcXVpdmFsZW50IHRvCisgKiA8Y29kZT4KKyAqIGZvby5tZXRhQ2xhc3MuZ2V0TWV0aG9kUG9pbnRlcihmb28sICJiYXIiKQorICogCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBNZXRob2RQb2ludGVyRXhwcmVzc2lvbiBleHRlbmRzIEV4cHJlc3Npb24geworCisgICAgcHJpdmF0ZSBFeHByZXNzaW9uIGV4cHJlc3Npb247CisgICAgcHJpdmF0ZSBFeHByZXNzaW9uIG1ldGhvZE5hbWU7CisKKyAgICBwdWJsaWMgTWV0aG9kUG9pbnRlckV4cHJlc3Npb24oRXhwcmVzc2lvbiBleHByZXNzaW9uLCBFeHByZXNzaW9uIG1ldGhvZE5hbWUpIHsKKyAgICAgICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjsKKyAgICAgICAgdGhpcy5tZXRob2ROYW1lID0gbWV0aG9kTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKCkgeworCWlmIChleHByZXNzaW9uID09IG51bGwpCisJICAgIHJldHVybiBWYXJpYWJsZUV4cHJlc3Npb24uVEhJU19FWFBSRVNTSU9OOworCWVsc2UKKwkgICAgcmV0dXJuIGV4cHJlc3Npb247CisgICAgfQorCisgICAgcHVibGljIEV4cHJlc3Npb24gZ2V0TWV0aG9kTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG1ldGhvZE5hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXQoR3Jvb3Z5Q29kZVZpc2l0b3IgdmlzaXRvcikgeworICAgICAgICB2aXNpdG9yLnZpc2l0TWV0aG9kUG9pbnRlckV4cHJlc3Npb24odGhpcyk7CisgICAgfQorCisgICAgcHVibGljIEV4cHJlc3Npb24gdHJhbnNmb3JtRXhwcmVzc2lvbihFeHByZXNzaW9uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIpIHsKKyAgICAgICAgRXhwcmVzc2lvbiByZXQ7CisgICAgICAgIEV4cHJlc3Npb24gbW5hbWUgPSB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obWV0aG9kTmFtZSk7CisgICAgICAgIGlmIChleHByZXNzaW9uID09IG51bGwpIHsKKwkgICAgICAgIHJldCA9IG5ldyBNZXRob2RQb2ludGVyRXhwcmVzc2lvbihWYXJpYWJsZUV4cHJlc3Npb24uVEhJU19FWFBSRVNTSU9OLCBtbmFtZSk7CisgICAgICAgIH0gZWxzZSB7CisJICAgICAgICByZXQgPSBuZXcgTWV0aG9kUG9pbnRlckV4cHJlc3Npb24odHJhbnNmb3JtZXIudHJhbnNmb3JtKGV4cHJlc3Npb24pLCBtbmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0LnNldFNvdXJjZVBvc2l0aW9uKHRoaXMpOworICAgICAgICByZXR1cm4gcmV0OyAgICAgICAgCisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgeworICAgICAgICBpZiAoZXhwcmVzc2lvbiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gIiYiICsgbWV0aG9kTmFtZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBleHByZXNzaW9uLmdldFRleHQoKSArICIuJiIgKyBtZXRob2ROYW1lLmdldFRleHQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBDbGFzc05vZGUgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIENsYXNzSGVscGVyLkNMT1NVUkVfVFlQRTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0R5bmFtaWMoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3MgZ2V0VHlwZUNsYXNzKCkgeworICAgICAgICByZXR1cm4gQ2xvc3VyZS5jbGFzczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvZXhwci9OYW1lZEFyZ3VtZW50TGlzdEV4cHJlc3Npb24uamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL05hbWVkQXJndW1lbnRMaXN0RXhwcmVzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYmU0MjUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvZXhwci9OYW1lZEFyZ3VtZW50TGlzdEV4cHJlc3Npb24uamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuZXhwcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFJlcHJlc2VudHMgb25lIG9yIG1vcmUgYXJndW1lbnRzIGJlaW5nIHBhc3NlZCBpbnRvIGEgbWV0aG9kIGJ5IG5hbWUKKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIE5hbWVkQXJndW1lbnRMaXN0RXhwcmVzc2lvbiBleHRlbmRzIE1hcEV4cHJlc3Npb24geworCisgICAgcHVibGljIE5hbWVkQXJndW1lbnRMaXN0RXhwcmVzc2lvbigpIHsKKyAgICB9CisgICAgCisgICAgcHVibGljIE5hbWVkQXJndW1lbnRMaXN0RXhwcmVzc2lvbihMaXN0IG1hcEVudHJ5RXhwcmVzc2lvbnMpIHsKKyAgICAgICAgc3VwZXIobWFwRW50cnlFeHByZXNzaW9ucyk7CisgICAgfQorCisgICAgcHVibGljIEV4cHJlc3Npb24gdHJhbnNmb3JtRXhwcmVzc2lvbihFeHByZXNzaW9uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIpIHsKKyAgICAgICAgRXhwcmVzc2lvbiByZXQgPSBuZXcgTmFtZWRBcmd1bWVudExpc3RFeHByZXNzaW9uKHRyYW5zZm9ybUV4cHJlc3Npb25zKGdldE1hcEVudHJ5RXhwcmVzc2lvbnMoKSwgdHJhbnNmb3JtZXIpKTsgCisgICAgICAgIHJldC5zZXRTb3VyY2VQb3NpdGlvbih0aGlzKTsKKyAgICAgICAgcmV0dXJuIHJldDsgICAgICAgIAorICAgIH0KKyAgICAKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL05vdEV4cHJlc3Npb24uamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL05vdEV4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTZmMTU4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L2V4cHIvTm90RXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuR3Jvb3Z5Q29kZVZpc2l0b3I7CisKKy8qKgorICogQGF1dGhvciBzYW0KKyAqLworcHVibGljIGNsYXNzIE5vdEV4cHJlc3Npb24gZXh0ZW5kcyBCb29sZWFuRXhwcmVzc2lvbiB7CisKKwlwdWJsaWMgTm90RXhwcmVzc2lvbihFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKwkJc3VwZXIoZXhwcmVzc2lvbik7CisJfQorCisJcHVibGljIHZvaWQgdmlzaXQoR3Jvb3Z5Q29kZVZpc2l0b3IgdmlzaXRvcikgeworCQl2aXNpdG9yLnZpc2l0Tm90RXhwcmVzc2lvbih0aGlzKTsKKwl9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0R5bmFtaWMoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiB0cmFuc2Zvcm1FeHByZXNzaW9uKEV4cHJlc3Npb25UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lcikgeworICAgICAgICBFeHByZXNzaW9uIHJldCA9IG5ldyBOb3RFeHByZXNzaW9uKHRyYW5zZm9ybWVyLnRyYW5zZm9ybShnZXRFeHByZXNzaW9uKCkpKTsgCisgICAgICAgIHJldC5zZXRTb3VyY2VQb3NpdGlvbih0aGlzKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKwl9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvZXhwci9Qb3N0Zml4RXhwcmVzc2lvbi5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L2V4cHIvUG9zdGZpeEV4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDYxYjk4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L2V4cHIvUG9zdGZpeEV4cHJlc3Npb24uamF2YQpAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuZXhwcjsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LkNsYXNzTm9kZTsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5Hcm9vdnlDb2RlVmlzaXRvcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5Ub2tlbjsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgcG9zdGZpeCBleHByZXNzaW9uIGxpa2UgZm9vKysgb3IgYmFyKysKKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIFBvc3RmaXhFeHByZXNzaW9uIGV4dGVuZHMgRXhwcmVzc2lvbiB7CisKKyAgICBwcml2YXRlIFRva2VuIG9wZXJhdGlvbjsKKyAgICBwcml2YXRlIEV4cHJlc3Npb24gZXhwcmVzc2lvbjsKKworICAgIHB1YmxpYyBQb3N0Zml4RXhwcmVzc2lvbihFeHByZXNzaW9uIGV4cHJlc3Npb24sIFRva2VuIG9wZXJhdGlvbikgeworICAgICAgICB0aGlzLm9wZXJhdGlvbiA9IG9wZXJhdGlvbjsKKyAgICAgICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gc3VwZXIudG9TdHJpbmcoKSArICJbIiArIGV4cHJlc3Npb24gKyBvcGVyYXRpb24gKyAiXSI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXQoR3Jvb3Z5Q29kZVZpc2l0b3IgdmlzaXRvcikgeworICAgICAgICB2aXNpdG9yLnZpc2l0UG9zdGZpeEV4cHJlc3Npb24odGhpcyk7CisgICAgfQorCisgICAgcHVibGljIEV4cHJlc3Npb24gdHJhbnNmb3JtRXhwcmVzc2lvbihFeHByZXNzaW9uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIpIHsKKyAgICAgICAgRXhwcmVzc2lvbiByZXQgPSBuZXcgUG9zdGZpeEV4cHJlc3Npb24odHJhbnNmb3JtZXIudHJhbnNmb3JtKGV4cHJlc3Npb24pLCBvcGVyYXRpb24pOyAKKyAgICAgICAgcmV0LnNldFNvdXJjZVBvc2l0aW9uKHRoaXMpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEV4cHJlc3Npb24oRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisgICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247CisgICAgfQorCisgICAgcHVibGljIFRva2VuIGdldE9wZXJhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG9wZXJhdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKCkgeworICAgICAgICByZXR1cm4gZXhwcmVzc2lvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CisgICAgICAgIHJldHVybiAiKCIgKyBleHByZXNzaW9uLmdldFRleHQoKSArIG9wZXJhdGlvbi5nZXRUZXh0KCkgKyAiKSI7CisgICAgfQorCisgICAgcHVibGljIENsYXNzTm9kZSBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gZXhwcmVzc2lvbi5nZXRUeXBlKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvZXhwci9QcmVmaXhFeHByZXNzaW9uLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvZXhwci9QcmVmaXhFeHByZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjlhZGYyYwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL1ByZWZpeEV4cHJlc3Npb24uamF2YQpAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuZXhwcjsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LkNsYXNzTm9kZTsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5Hcm9vdnlDb2RlVmlzaXRvcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5Ub2tlbjsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgcHJlZml4IGV4cHJlc3Npb24gbGlrZSArK2ZvbyBvciAtLWJhcgorICogCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgUHJlZml4RXhwcmVzc2lvbiBleHRlbmRzIEV4cHJlc3Npb24geworCisgICAgcHJpdmF0ZSBUb2tlbiBvcGVyYXRpb247CisgICAgcHJpdmF0ZSBFeHByZXNzaW9uIGV4cHJlc3Npb247CisKKyAgICBwdWJsaWMgUHJlZml4RXhwcmVzc2lvbihUb2tlbiBvcGVyYXRpb24sIEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgICAgICB0aGlzLm9wZXJhdGlvbiA9IG9wZXJhdGlvbjsKKyAgICAgICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gc3VwZXIudG9TdHJpbmcoKSArICJbIiArIG9wZXJhdGlvbiArIGV4cHJlc3Npb24gKyAiXSI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXQoR3Jvb3Z5Q29kZVZpc2l0b3IgdmlzaXRvcikgeworICAgICAgICB2aXNpdG9yLnZpc2l0UHJlZml4RXhwcmVzc2lvbih0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiB0cmFuc2Zvcm1FeHByZXNzaW9uKEV4cHJlc3Npb25UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lcikgeworICAgICAgICBFeHByZXNzaW9uIHJldCA9IG5ldyBQcmVmaXhFeHByZXNzaW9uKG9wZXJhdGlvbiwgdHJhbnNmb3JtZXIudHJhbnNmb3JtKGV4cHJlc3Npb24pKTsgCisgICAgICAgIHJldC5zZXRTb3VyY2VQb3NpdGlvbih0aGlzKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uOworICAgIH0KKworICAgIHB1YmxpYyBUb2tlbiBnZXRPcGVyYXRpb24oKSB7CisgICAgICAgIHJldHVybiBvcGVyYXRpb247CisgICAgfQorCisgICAgcHVibGljIEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIGV4cHJlc3Npb247CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgeworICAgICAgICByZXR1cm4gIigiICsgb3BlcmF0aW9uLmdldFRleHQoKSArIGV4cHJlc3Npb24uZ2V0VGV4dCgpICsgIikiOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzc05vZGUgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIGV4cHJlc3Npb24uZ2V0VHlwZSgpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L2V4cHIvUHJvcGVydHlFeHByZXNzaW9uLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvZXhwci9Qcm9wZXJ0eUV4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmM0NjhiCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L2V4cHIvUHJvcGVydHlFeHByZXNzaW9uLmphdmEKQEAgLTAsMCArMSwxMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuR3Jvb3Z5Q29kZVZpc2l0b3I7CisKKy8qKgorICogUmVwcmVzZW50cyBhIHByb3BlcnR5IGFjY2VzcyBzdWNoIGFzIHRoZSBleHByZXNzaW9uICJmb28uYmFyIi4KKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIFByb3BlcnR5RXhwcmVzc2lvbiBleHRlbmRzIEV4cHJlc3Npb24geworCisgICAgcHJpdmF0ZSBFeHByZXNzaW9uIG9iamVjdEV4cHJlc3Npb247CisgICAgcHJpdmF0ZSBFeHByZXNzaW9uIHByb3BlcnR5OworICAgIHByaXZhdGUgYm9vbGVhbiBzcHJlYWRTYWZlID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIHNhZmUgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNTdGF0aWMgPSBmYWxzZTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBpbXBsaWNpdFRoaXMgPSBmYWxzZTsKKworICAgIHB1YmxpYyBib29sZWFuIGlzU3RhdGljKCkgeworICAgICAgICByZXR1cm4gaXNTdGF0aWM7CisgICAgfQorCisgICAgcHVibGljIFByb3BlcnR5RXhwcmVzc2lvbihFeHByZXNzaW9uIG9iamVjdEV4cHJlc3Npb24sIFN0cmluZyBwcm9wZXJ0eSkgeworICAgICAgICB0aGlzKG9iamVjdEV4cHJlc3Npb24sIG5ldyBDb25zdGFudEV4cHJlc3Npb24ocHJvcGVydHkpLCBmYWxzZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBQcm9wZXJ0eUV4cHJlc3Npb24oRXhwcmVzc2lvbiBvYmplY3RFeHByZXNzaW9uLCBFeHByZXNzaW9uIHByb3BlcnR5KSB7CisgICAgICAgIHRoaXMob2JqZWN0RXhwcmVzc2lvbiwgcHJvcGVydHksIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvcGVydHlFeHByZXNzaW9uKEV4cHJlc3Npb24gb2JqZWN0RXhwcmVzc2lvbiwgRXhwcmVzc2lvbiBwcm9wZXJ0eSwgYm9vbGVhbiBzYWZlKSB7CisgICAgICAgIHRoaXMub2JqZWN0RXhwcmVzc2lvbiA9IG9iamVjdEV4cHJlc3Npb247CisgICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTsKKyAgICAgICAgdGhpcy5zYWZlID0gc2FmZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChHcm9vdnlDb2RlVmlzaXRvciB2aXNpdG9yKSB7CisgICAgICAgIHZpc2l0b3IudmlzaXRQcm9wZXJ0eUV4cHJlc3Npb24odGhpcyk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNEeW5hbWljKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiB0cmFuc2Zvcm1FeHByZXNzaW9uKEV4cHJlc3Npb25UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lcikgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBnZXRPYmplY3RFeHByZXNzaW9uKCkgeworICAgICAgICByZXR1cm4gb2JqZWN0RXhwcmVzc2lvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRPYmplY3RFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwKSB7CisgICAgICAgIG9iamVjdEV4cHJlc3Npb249ZXhwOworICAgIH0gICAgCisgICAgCisgICAgcHVibGljIEV4cHJlc3Npb24gZ2V0UHJvcGVydHkoKSB7CisgICAgICAgIHJldHVybiBwcm9wZXJ0eTsKKyAgICB9CisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eUFzU3RyaW5nKCkgeworICAgICAgICBpZiAocHJvcGVydHk9PW51bGwpIHJldHVybiBudWxsOworICAgICAgICBpZiAoISAocHJvcGVydHkgaW5zdGFuY2VvZiBDb25zdGFudEV4cHJlc3Npb24pKSByZXR1cm4gbnVsbDsKKyAgICAgICAgQ29uc3RhbnRFeHByZXNzaW9uIGNvbnN0YW50ID0gKENvbnN0YW50RXhwcmVzc2lvbikgcHJvcGVydHk7CisgICAgICAgIHJldHVybiBjb25zdGFudC5nZXRUZXh0KCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgeworICAgICAgICByZXR1cm4gb2JqZWN0RXhwcmVzc2lvbi5nZXRUZXh0KCkgKyAiLiIgKyBwcm9wZXJ0eS5nZXRUZXh0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBpcyB0aGlzIGEgc2FmZSBuYXZpZ2F0aW9uLCBpLmUuIGlmIHRydWUgdGhlbiBpZiB0aGUgc291cmNlIG9iamVjdCBpcyBudWxsCisgICAgICogdGhlbiB0aGlzIG5hdmlnYXRpb24gd2lsbCByZXR1cm4gbnVsbAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU2FmZSgpIHsKKyAgICAgICAgcmV0dXJuIHNhZmU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNTcHJlYWRTYWZlKCkgeworICAgICAgICByZXR1cm4gc3ByZWFkU2FmZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTcHJlYWRTYWZlKGJvb2xlYW4gdmFsdWUpIHsKKyAgICAgICAgc3ByZWFkU2FmZSA9IHZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBzdXBlci50b1N0cmluZygpICsgIltvYmplY3Q6ICIgKyBvYmplY3RFeHByZXNzaW9uICsgIiBwcm9wZXJ0eTogIiArIHByb3BlcnR5ICsgIl0iOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFN0YXRpYyhib29sZWFuIGFTdGF0aWMpIHsKKyAgICAgICAgdGhpcy5pc1N0YXRpYyA9IGFTdGF0aWM7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGlzSW1wbGljaXRUaGlzKCl7CisgICAgICAgIHJldHVybiBpbXBsaWNpdFRoaXM7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldEltcGxpY2l0VGhpcyhib29sZWFuIGl0KSB7CisgICAgICAgIGltcGxpY2l0VGhpcyAgPSBpdDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvZXhwci9SYW5nZUV4cHJlc3Npb24uamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL1JhbmdlRXhwcmVzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZTBmNzgKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvZXhwci9SYW5nZUV4cHJlc3Npb24uamF2YQpAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuZXhwcjsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0Lkdyb292eUNvZGVWaXNpdG9yOworCisvKioKKyAqIFJlcHJlc2VudHMgYSByYW5nZSBleHByZXNzaW9uIHN1Y2ggYXMgZm9yIGl0ZXJhdGluZworICogPHByZT5mb3IgaSBpbiAwLi4xMCB7Li4ufQorICogPC9wcmU+CisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBSYW5nZUV4cHJlc3Npb24gZXh0ZW5kcyBFeHByZXNzaW9uIHsKKworICAgIHByaXZhdGUgRXhwcmVzc2lvbiBmcm9tOworICAgIHByaXZhdGUgRXhwcmVzc2lvbiB0bzsKKyAgICBwcml2YXRlIGJvb2xlYW4gaW5jbHVzaXZlOworCisgICAgcHVibGljIFJhbmdlRXhwcmVzc2lvbihFeHByZXNzaW9uIGZyb20sIEV4cHJlc3Npb24gdG8sIGJvb2xlYW4gaW5jbHVzaXZlKSB7CisgICAgICAgIHRoaXMuZnJvbSA9IGZyb207CisgICAgICAgIHRoaXMudG8gPSB0bzsKKyAgICAgICAgdGhpcy5pbmNsdXNpdmUgPSBpbmNsdXNpdmU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXQoR3Jvb3Z5Q29kZVZpc2l0b3IgdmlzaXRvcikgeworICAgICAgICB2aXNpdG9yLnZpc2l0UmFuZ2VFeHByZXNzaW9uKHRoaXMpOworICAgIH0KKworICAgIHB1YmxpYyBFeHByZXNzaW9uIHRyYW5zZm9ybUV4cHJlc3Npb24oRXhwcmVzc2lvblRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyKSB7CisgICAgICAgIEV4cHJlc3Npb24gcmV0ID0gbmV3IFJhbmdlRXhwcmVzc2lvbih0cmFuc2Zvcm1lci50cmFuc2Zvcm0oZnJvbSksIHRyYW5zZm9ybWVyLnRyYW5zZm9ybSh0byksIGluY2x1c2l2ZSk7IAorICAgICAgICByZXQuc2V0U291cmNlUG9zaXRpb24odGhpcyk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcHVibGljIEV4cHJlc3Npb24gZ2V0RnJvbSgpIHsKKyAgICAgICAgcmV0dXJuIGZyb207CisgICAgfQorCisgICAgcHVibGljIEV4cHJlc3Npb24gZ2V0VG8oKSB7CisgICAgICAgIHJldHVybiB0bzsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0luY2x1c2l2ZSgpIHsKKyAgICAgICAgcmV0dXJuIGluY2x1c2l2ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CisgICAgICAgIHJldHVybiAiKCIgKyBmcm9tLmdldFRleHQoKSArCisgICAgICAgICAgICAgICAoIWlzSW5jbHVzaXZlKCk/ICIuLjwiIDogIi4uIiApICsKKyAgICAgICAgICAgICAgIHRvLmdldFRleHQoKSArICIpIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvZXhwci9SZWdleEV4cHJlc3Npb24uamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL1JlZ2V4RXhwcmVzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZTM0YWYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvZXhwci9SZWdleEV4cHJlc3Npb24uamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuZXhwcjsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LkNsYXNzSGVscGVyOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0Lkdyb292eUNvZGVWaXNpdG9yOworCisvKioKKyAqIFJlcHJlc2VudHMgYSByZWd1bGFyIGV4cHJlc3Npb24gb2YgdGhlIGZvcm0gfjxkb3VibGUgcXVvdGVkIHN0cmluZz4gd2hpY2ggY3JlYXRlcworICogYSByZWd1bGFyIGV4cHJlc3Npb24uIAorICogCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgUmVnZXhFeHByZXNzaW9uIGV4dGVuZHMgRXhwcmVzc2lvbiB7CisgICAgCisgICAgcHJpdmF0ZSBmaW5hbCBFeHByZXNzaW9uIHN0cmluZzsKKyAgICAKKyAgICBwdWJsaWMgUmVnZXhFeHByZXNzaW9uKEV4cHJlc3Npb24gc3RyaW5nKSB7CisgICAgICAgIHRoaXMuc3RyaW5nID0gc3RyaW5nOworICAgICAgICBzdXBlci5zZXRUeXBlKENsYXNzSGVscGVyLlBBVFRFUk5fVFlQRSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHZpc2l0KEdyb292eUNvZGVWaXNpdG9yIHZpc2l0b3IpIHsKKyAgICAgICAgdmlzaXRvci52aXNpdFJlZ2V4RXhwcmVzc2lvbih0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiB0cmFuc2Zvcm1FeHByZXNzaW9uKEV4cHJlc3Npb25UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lcikgeworICAgICAgICBFeHByZXNzaW9uIHJldCA9IG5ldyBSZWdleEV4cHJlc3Npb24odHJhbnNmb3JtZXIudHJhbnNmb3JtKHN0cmluZykpOyAKKyAgICAgICAgcmV0LnNldFNvdXJjZVBvc2l0aW9uKHRoaXMpOworICAgICAgICByZXR1cm4gcmV0OyAgICAgICAKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBnZXRSZWdleCgpIHsKKyAgICAgICAgcmV0dXJuIHN0cmluZzsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL1NwcmVhZEV4cHJlc3Npb24uamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL1NwcmVhZEV4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGE0N2I4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L2V4cHIvU3ByZWFkRXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuQ2xhc3NOb2RlOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0Lkdyb292eUNvZGVWaXNpdG9yOworCisvKioKKyAqIFJlcHJlc2VudHMgYSBzcHJlYWQgZXhwcmVzc2lvbiAqeCBpbiB0aGUgbGlzdCBleHByZXNzaW9uIFsxLCAqeCwgMl0uCisgKiAKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIFNwcmVhZEV4cHJlc3Npb24gZXh0ZW5kcyBFeHByZXNzaW9uIHsKKworICAgIHByaXZhdGUgZmluYWwgRXhwcmVzc2lvbiBleHByZXNzaW9uOworCQorICAgIHB1YmxpYyBTcHJlYWRFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uOworICAgIH0KKworICAgIHB1YmxpYyBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oKSB7CisgICAgICAgIHJldHVybiBleHByZXNzaW9uOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0KEdyb292eUNvZGVWaXNpdG9yIHZpc2l0b3IpIHsKKyAgICAgICAgdmlzaXRvci52aXNpdFNwcmVhZEV4cHJlc3Npb24odGhpcyk7CisgICAgfQorCisgICAgcHVibGljIEV4cHJlc3Npb24gdHJhbnNmb3JtRXhwcmVzc2lvbihFeHByZXNzaW9uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIpIHsKKyAgICAgICAgRXhwcmVzc2lvbiByZXQgPSBuZXcgU3ByZWFkRXhwcmVzc2lvbih0cmFuc2Zvcm1lci50cmFuc2Zvcm0oZXhwcmVzc2lvbikpOyAKKyAgICAgICAgcmV0LnNldFNvdXJjZVBvc2l0aW9uKHRoaXMpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKKwkJcmV0dXJuICIqIiArIGV4cHJlc3Npb24uZ2V0VGV4dCgpOworCX0KKworICAgIHB1YmxpYyBDbGFzc05vZGUgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIGV4cHJlc3Npb24uZ2V0VHlwZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL1NwcmVhZE1hcEV4cHJlc3Npb24uamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL1NwcmVhZE1hcEV4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2M5NGFiCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L2V4cHIvU3ByZWFkTWFwRXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuQ2xhc3NOb2RlOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0Lkdyb292eUNvZGVWaXNpdG9yOworCisvKioKKyAqIFJlcHJlc2VudHMgYSBzcHJlYWQgbWFwIGV4cHJlc3Npb24gKjptCisgKiAgICAgICAgIGluIHRoZSBtYXAgZXhwcmVzc2lvbiBbMSwgKjptLCAyLCAiYyI6MTAwXQorICogICAgICBvciBpbiB0aGUgbWV0aG9kIGludm9rZSBleHByZXNzaW9uIGZ1bmMoMSwgKjptLCAyLCAiYyI6MTAwKS4KKyAqIAorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgU3ByZWFkTWFwRXhwcmVzc2lvbiBleHRlbmRzIEV4cHJlc3Npb24geworCisgICAgcHJpdmF0ZSBFeHByZXNzaW9uIGV4cHJlc3Npb247CisJCisgICAgcHVibGljIFNwcmVhZE1hcEV4cHJlc3Npb24oRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisgICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247CisgICAgfQorCisgICAgcHVibGljIEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIGV4cHJlc3Npb247CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXQoR3Jvb3Z5Q29kZVZpc2l0b3IgdmlzaXRvcikgeworICAgICAgICB2aXNpdG9yLnZpc2l0U3ByZWFkTWFwRXhwcmVzc2lvbih0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiB0cmFuc2Zvcm1FeHByZXNzaW9uKEV4cHJlc3Npb25UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lcikgeworICAgICAgICBFeHByZXNzaW9uIHJldCA9IG5ldyBTcHJlYWRNYXBFeHByZXNzaW9uKHRyYW5zZm9ybWVyLnRyYW5zZm9ybShleHByZXNzaW9uKSk7IAorICAgICAgICByZXQuc2V0U291cmNlUG9zaXRpb24odGhpcyk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgeworCXJldHVybiAiKjoiICsgZXhwcmVzc2lvbi5nZXRUZXh0KCk7CisgICAgfQorCisgICAgcHVibGljIENsYXNzTm9kZSBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gZXhwcmVzc2lvbi5nZXRUeXBlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L2V4cHIvU3RhdGljTWV0aG9kQ2FsbEV4cHJlc3Npb24uamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL1N0YXRpY01ldGhvZENhbGxFeHByZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg1MzllNgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL1N0YXRpY01ldGhvZENhbGxFeHByZXNzaW9uLmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHI7CisKK2ltcG9ydCBncm9vdnkubGFuZy5NZXRhTWV0aG9kOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuQ2xhc3NOb2RlOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0Lkdyb292eUNvZGVWaXNpdG9yOworCisvKioKKyAqIEEgc3RhdGljIG1ldGhvZCBjYWxsIG9uIGEgY2xhc3MKKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgU3RhdGljTWV0aG9kQ2FsbEV4cHJlc3Npb24gZXh0ZW5kcyBFeHByZXNzaW9uIHsKKworICAgIHByaXZhdGUgQ2xhc3NOb2RlIG93bmVyVHlwZTsKKyAgICBwcml2YXRlIFN0cmluZyBtZXRob2Q7CisgICAgcHJpdmF0ZSBFeHByZXNzaW9uIGFyZ3VtZW50czsKKyAgICBwcml2YXRlIE1ldGFNZXRob2QgbWV0YU1ldGhvZCA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RhdGljTWV0aG9kQ2FsbEV4cHJlc3Npb24oQ2xhc3NOb2RlIHR5cGUsIFN0cmluZyBtZXRob2QsIEV4cHJlc3Npb24gYXJndW1lbnRzKSB7CisgICAgICAgIG93bmVyVHlwZSA9IHR5cGU7CisgICAgICAgIHRoaXMubWV0aG9kID0gbWV0aG9kOworICAgICAgICB0aGlzLmFyZ3VtZW50cyA9IGFyZ3VtZW50czsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChHcm9vdnlDb2RlVmlzaXRvciB2aXNpdG9yKSB7CisgICAgICAgIHZpc2l0b3IudmlzaXRTdGF0aWNNZXRob2RDYWxsRXhwcmVzc2lvbih0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiB0cmFuc2Zvcm1FeHByZXNzaW9uKEV4cHJlc3Npb25UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lcikgeworICAgICAgICBFeHByZXNzaW9uIHJldCA9IG5ldyBTdGF0aWNNZXRob2RDYWxsRXhwcmVzc2lvbihnZXRPd25lclR5cGUoKSwgbWV0aG9kLCB0cmFuc2Zvcm1lci50cmFuc2Zvcm0oYXJndW1lbnRzKSk7CisgICAgICAgIHJldC5zZXRTb3VyY2VQb3NpdGlvbih0aGlzKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBnZXRBcmd1bWVudHMoKSB7CisgICAgICAgIHJldHVybiBhcmd1bWVudHM7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRNZXRob2QoKSB7CisgICAgICAgIHJldHVybiBtZXRob2Q7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgeworICAgICAgICByZXR1cm4gZ2V0T3duZXJUeXBlKCkuZ2V0TmFtZSgpICsgIi4iICsgbWV0aG9kICsgYXJndW1lbnRzLmdldFRleHQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gc3VwZXIudG9TdHJpbmcoKSArICJbIiArIGdldE93bmVyVHlwZSgpLmdldE5hbWUoKSArICIjIiArIG1ldGhvZCArICIgYXJndW1lbnRzOiAiICsgYXJndW1lbnRzICsgIl0iOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzc05vZGUgZ2V0T3duZXJUeXBlKCkgeworICAgICAgICByZXR1cm4gb3duZXJUeXBlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE93bmVyVHlwZShDbGFzc05vZGUgb3duZXJUeXBlKSB7CisgICAgICAgIHRoaXMub3duZXJUeXBlID0gb3duZXJUeXBlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1ldGFNZXRob2QoTWV0YU1ldGhvZCBtZXRhTWV0aG9kKSB7CisgICAgICAgIHRoaXMubWV0YU1ldGhvZCA9IG1ldGFNZXRob2Q7CisgICAgfQorCisgICAgcHVibGljIE1ldGFNZXRob2QgZ2V0TWV0YU1ldGhvZCgpIHsKKyAgICAgICAgcmV0dXJuIG1ldGFNZXRob2Q7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvZXhwci9UZXJuYXJ5RXhwcmVzc2lvbi5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L2V4cHIvVGVybmFyeUV4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjJjMmFmCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L2V4cHIvVGVybmFyeUV4cHJlc3Npb24uamF2YQpAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuZXhwcjsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LkNsYXNzSGVscGVyOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LkNsYXNzTm9kZTsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5Hcm9vdnlDb2RlVmlzaXRvcjsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgdGVybmFyeSBleHByZXNzaW9uIChib29sZWFuRXhwcmVzc2lvbikgPyBleHByZXNzaW9uIDogZXhwcmVzc2lvbgorICogCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgVGVybmFyeUV4cHJlc3Npb24gZXh0ZW5kcyBFeHByZXNzaW9uIHsKKworICAgIHByaXZhdGUgQm9vbGVhbkV4cHJlc3Npb24gYm9vbGVhbkV4cHJlc3Npb247CisgICAgcHJpdmF0ZSBFeHByZXNzaW9uIHRydWVFeHByZXNzaW9uOworICAgIHByaXZhdGUgRXhwcmVzc2lvbiBmYWxzZUV4cHJlc3Npb247CisKKyAgICBwdWJsaWMgVGVybmFyeUV4cHJlc3Npb24oCisgICAgICAgIEJvb2xlYW5FeHByZXNzaW9uIGJvb2xlYW5FeHByZXNzaW9uLAorICAgICAgICBFeHByZXNzaW9uIHRydWVFeHByZXNzaW9uLAorICAgICAgICBFeHByZXNzaW9uIGZhbHNlRXhwcmVzc2lvbikgeworICAgICAgICB0aGlzLmJvb2xlYW5FeHByZXNzaW9uID0gYm9vbGVhbkV4cHJlc3Npb247CisgICAgICAgIHRoaXMudHJ1ZUV4cHJlc3Npb24gPSB0cnVlRXhwcmVzc2lvbjsKKyAgICAgICAgdGhpcy5mYWxzZUV4cHJlc3Npb24gPSBmYWxzZUV4cHJlc3Npb247CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KEdyb292eUNvZGVWaXNpdG9yIHZpc2l0b3IpIHsKKyAgICAgICAgdmlzaXRvci52aXNpdFRlcm5hcnlFeHByZXNzaW9uKHRoaXMpOworICAgIH0KKworICAgIHB1YmxpYyBFeHByZXNzaW9uIHRyYW5zZm9ybUV4cHJlc3Npb24oRXhwcmVzc2lvblRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyKSB7CisgICAgICAgIEV4cHJlc3Npb24gcmV0ID0gbmV3IFRlcm5hcnlFeHByZXNzaW9uKAorICAgICAgICAgICAgICAgIChCb29sZWFuRXhwcmVzc2lvbikgdHJhbnNmb3JtZXIudHJhbnNmb3JtKGJvb2xlYW5FeHByZXNzaW9uKSwKKyAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0odHJ1ZUV4cHJlc3Npb24pLAorICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShmYWxzZUV4cHJlc3Npb24pKTsgCisgICAgICAgIHJldC5zZXRTb3VyY2VQb3NpdGlvbih0aGlzKTsKKyAgICAgICAgcmV0dXJuIHJldDsgCisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCkgKyJbIiArIGJvb2xlYW5FeHByZXNzaW9uICsgIiA/ICIgKyB0cnVlRXhwcmVzc2lvbiArICIgOiAiICsgZmFsc2VFeHByZXNzaW9uICsgIl0iOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgQm9vbGVhbkV4cHJlc3Npb24gZ2V0Qm9vbGVhbkV4cHJlc3Npb24oKSB7CisgICAgICAgIHJldHVybiBib29sZWFuRXhwcmVzc2lvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBnZXRGYWxzZUV4cHJlc3Npb24oKSB7CisgICAgICAgIHJldHVybiBmYWxzZUV4cHJlc3Npb247CisgICAgfQorCisgICAgcHVibGljIEV4cHJlc3Npb24gZ2V0VHJ1ZUV4cHJlc3Npb24oKSB7CisgICAgICAgIHJldHVybiB0cnVlRXhwcmVzc2lvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CisgICAgICAgIHJldHVybiAiKCIKKyAgICAgICAgICAgICsgYm9vbGVhbkV4cHJlc3Npb24uZ2V0VGV4dCgpCisgICAgICAgICAgICArICIpID8gIgorICAgICAgICAgICAgKyB0cnVlRXhwcmVzc2lvbi5nZXRUZXh0KCkKKyAgICAgICAgICAgICsgIiA6ICIKKyAgICAgICAgICAgICsgZmFsc2VFeHByZXNzaW9uLmdldFRleHQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3NOb2RlIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiBDbGFzc0hlbHBlci5PQkpFQ1RfVFlQRTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvZXhwci9UdXBsZUV4cHJlc3Npb24uamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL1R1cGxlRXhwcmVzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MGJiMGQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvZXhwci9UdXBsZUV4cHJlc3Npb24uamF2YQpAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuR3Jvb3Z5Q29kZVZpc2l0b3I7CisKKy8qKgorICogUmVwcmVzZW50cyBhIHR1cGxlIGV4cHJlc3Npb24gezEsIDIsIDN9IHdoaWNoIGNyZWF0ZXMgYW4gaW1tdXRhYmxlIExpc3QKKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIFR1cGxlRXhwcmVzc2lvbiBleHRlbmRzIEV4cHJlc3Npb24geworICAgIHByaXZhdGUgTGlzdCBleHByZXNzaW9uczsKKworICAgIHB1YmxpYyBUdXBsZUV4cHJlc3Npb24oKSB7CisgICAgICAgIHRoaXMoMCk7CisgICAgfQorCisgICAgcHVibGljIFR1cGxlRXhwcmVzc2lvbihFeHByZXNzaW9uIGV4cHIpIHsKKyAgICAgICAgdGhpcygxKTsKKyAgICAgICAgYWRkRXhwcmVzc2lvbihleHByKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVHVwbGVFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcjEsIEV4cHJlc3Npb24gZXhwcjIpIHsKKyAgICAgICAgdGhpcygyKTsKKyAgICAgICAgYWRkRXhwcmVzc2lvbihleHByMSk7CisgICAgICAgIGFkZEV4cHJlc3Npb24oZXhwcjIpOworICAgIH0KKworICAgIHB1YmxpYyBUdXBsZUV4cHJlc3Npb24oRXhwcmVzc2lvbiBleHByMSwgRXhwcmVzc2lvbiBleHByMiwgRXhwcmVzc2lvbiBleHByMykgeworICAgICAgICB0aGlzKDMpOworICAgICAgICBhZGRFeHByZXNzaW9uKGV4cHIxKTsKKyAgICAgICAgYWRkRXhwcmVzc2lvbihleHByMik7CisgICAgICAgIGFkZEV4cHJlc3Npb24oZXhwcjMpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgVHVwbGVFeHByZXNzaW9uKGludCBsZW5ndGgpIHsKKyAgICAgICAgdGhpcy5leHByZXNzaW9ucyA9IG5ldyBBcnJheUxpc3QobGVuZ3RoKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIFR1cGxlRXhwcmVzc2lvbihMaXN0IGV4cHJlc3Npb25zKSB7CisgICAgICAgIHRoaXMuZXhwcmVzc2lvbnMgPSBleHByZXNzaW9uczsKKyAgICB9CisgICAgCisgICAgcHVibGljIFR1cGxlRXhwcmVzc2lvbihFeHByZXNzaW9uW10gZXhwcmVzc2lvbkFycmF5KSB7CisgICAgICAgIHRoaXMoKTsKKyAgICAgICAgZXhwcmVzc2lvbnMuYWRkQWxsKEFycmF5cy5hc0xpc3QoZXhwcmVzc2lvbkFycmF5KSk7CisgICAgfQorCisgICAgcHVibGljIFR1cGxlRXhwcmVzc2lvbiBhZGRFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgICAgICBleHByZXNzaW9ucy5hZGQoZXhwcmVzc2lvbik7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgTGlzdCBnZXRFeHByZXNzaW9ucygpIHsKKyAgICAgICAgcmV0dXJuIGV4cHJlc3Npb25zOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0KEdyb292eUNvZGVWaXNpdG9yIHZpc2l0b3IpIHsKKyAgICAgICAgdmlzaXRvci52aXNpdFR1cGxlRXhwcmVzc2lvbih0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiB0cmFuc2Zvcm1FeHByZXNzaW9uKEV4cHJlc3Npb25UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lcikgeworICAgICAgICBFeHByZXNzaW9uIHJldCA9IG5ldyBUdXBsZUV4cHJlc3Npb24odHJhbnNmb3JtRXhwcmVzc2lvbnMoZ2V0RXhwcmVzc2lvbnMoKSwgdHJhbnNmb3JtZXIpKTsgCisgICAgICAgIHJldC5zZXRTb3VyY2VQb3NpdGlvbih0aGlzKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKGludCBpKSB7CisgICAgICAgIHJldHVybiAoRXhwcmVzc2lvbikgZXhwcmVzc2lvbnMuZ2V0KGkpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoIigiKTsKKyAgICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGV4cHJlc3Npb25zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApIHsKKyAgICAgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCgoRXhwcmVzc2lvbilpdGVyLm5leHQoKSkuZ2V0VGV4dCgpKTsKKyAgICAgICAgfQorICAgICAgICBidWZmZXIuYXBwZW5kKCIpIik7CisgICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gc3VwZXIudG9TdHJpbmcoKSArIGV4cHJlc3Npb25zOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL1VuYXJ5TWludXNFeHByZXNzaW9uLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvZXhwci9VbmFyeU1pbnVzRXhwcmVzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMzcxZTcKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvZXhwci9VbmFyeU1pbnVzRXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuQ2xhc3NOb2RlOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0Lkdyb292eUNvZGVWaXNpdG9yOworCisvKioKKyAqIEBhdXRob3Igc2FtCisgKi8KK3B1YmxpYyBjbGFzcyBVbmFyeU1pbnVzRXhwcmVzc2lvbiBleHRlbmRzIEV4cHJlc3Npb24geworCisJcHJpdmF0ZSBmaW5hbCBFeHByZXNzaW9uIGV4cHJlc3Npb247CisJCisJcHVibGljIFVuYXJ5TWludXNFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworCQl0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uOworCX0KKworCXB1YmxpYyBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oKSB7CisJCXJldHVybiBleHByZXNzaW9uOworCX0KKworCXB1YmxpYyB2b2lkIHZpc2l0KEdyb292eUNvZGVWaXNpdG9yIHZpc2l0b3IpIHsKKwkJdmlzaXRvci52aXNpdFVuYXJ5TWludXNFeHByZXNzaW9uKHRoaXMpOworCX0KKworCXB1YmxpYyBFeHByZXNzaW9uIHRyYW5zZm9ybUV4cHJlc3Npb24oRXhwcmVzc2lvblRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyKSB7CisgICAgICAgIEV4cHJlc3Npb24gcmV0ID0gbmV3IFVuYXJ5TWludXNFeHByZXNzaW9uKHRyYW5zZm9ybWVyLnRyYW5zZm9ybShleHByZXNzaW9uKSk7CisgICAgICAgIHJldC5zZXRTb3VyY2VQb3NpdGlvbih0aGlzKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKwl9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CisJCXJldHVybiBleHByZXNzaW9uLmdldFRleHQoKTsKKwl9CisKKyAgICBwdWJsaWMgQ2xhc3NOb2RlIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiBleHByZXNzaW9uLmdldFR5cGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0R5bmFtaWMoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL1VuYXJ5UGx1c0V4cHJlc3Npb24uamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL1VuYXJ5UGx1c0V4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjgyMDcyCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L2V4cHIvVW5hcnlQbHVzRXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuQ2xhc3NOb2RlOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0Lkdyb292eUNvZGVWaXNpdG9yOworCisvKioKKyAqIEBhdXRob3IgUGF1bCBLaW5nCisgKi8KK3B1YmxpYyBjbGFzcyBVbmFyeVBsdXNFeHByZXNzaW9uIGV4dGVuZHMgRXhwcmVzc2lvbiB7CisKKwlwcml2YXRlIGZpbmFsIEV4cHJlc3Npb24gZXhwcmVzc2lvbjsKKworCXB1YmxpYyBVbmFyeVBsdXNFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworCQl0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uOworCX0KKworCXB1YmxpYyBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oKSB7CisJCXJldHVybiBleHByZXNzaW9uOworCX0KKworCXB1YmxpYyB2b2lkIHZpc2l0KEdyb292eUNvZGVWaXNpdG9yIHZpc2l0b3IpIHsKKwkJdmlzaXRvci52aXNpdFVuYXJ5UGx1c0V4cHJlc3Npb24odGhpcyk7CisJfQorCisJcHVibGljIEV4cHJlc3Npb24gdHJhbnNmb3JtRXhwcmVzc2lvbihFeHByZXNzaW9uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIpIHsKKyAgICAgICAgRXhwcmVzc2lvbiByZXQgPSBuZXcgVW5hcnlQbHVzRXhwcmVzc2lvbih0cmFuc2Zvcm1lci50cmFuc2Zvcm0oZXhwcmVzc2lvbikpOworICAgICAgICByZXQuc2V0U291cmNlUG9zaXRpb24odGhpcyk7CisgICAgICAgIHJldHVybiByZXQ7CisJfQorCisgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgeworCQlyZXR1cm4gZXhwcmVzc2lvbi5nZXRUZXh0KCk7CisJfQorCisgICAgcHVibGljIENsYXNzTm9kZSBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gZXhwcmVzc2lvbi5nZXRUeXBlKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNEeW5hbWljKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L2V4cHIvVmFyaWFibGVFeHByZXNzaW9uLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvZXhwci9WYXJpYWJsZUV4cHJlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDc0NzI4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L2V4cHIvVmFyaWFibGVFeHByZXNzaW9uLmphdmEKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuQ2xhc3NIZWxwZXI7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuQ2xhc3NOb2RlOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0Lkdyb292eUNvZGVWaXNpdG9yOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LlZhcmlhYmxlOworCisvKioKKyAqIFJlcHJlc2VudHMgYSBsb2NhbCB2YXJpYWJsZSBuYW1lLCB0aGUgc2ltcGxlc3QgZm9ybSBvZiBleHByZXNzaW9uLiBlLmcuICJmb28iLgorICogCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgVmFyaWFibGVFeHByZXNzaW9uIGV4dGVuZHMgRXhwcmVzc2lvbiBpbXBsZW1lbnRzIFZhcmlhYmxlIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVmFyaWFibGVFeHByZXNzaW9uIFRISVNfRVhQUkVTU0lPTiA9IG5ldyBWYXJpYWJsZUV4cHJlc3Npb24oInRoaXMiLCBDbGFzc0hlbHBlci5EWU5BTUlDX1RZUEUpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVmFyaWFibGVFeHByZXNzaW9uIFNVUEVSX0VYUFJFU1NJT04gPSBuZXcgVmFyaWFibGVFeHByZXNzaW9uKCJzdXBlciIsIENsYXNzSGVscGVyLkRZTkFNSUNfVFlQRSk7CisKKyAgICBwcml2YXRlIFN0cmluZyB2YXJpYWJsZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gaW5TdGF0aWNDb250ZXh0OworICAgIHByaXZhdGUgYm9vbGVhbiBpc0R5bmFtaWNUeXBlZD1mYWxzZTsKKyAgICBwcml2YXRlIFZhcmlhYmxlIGFjY2Vzc2VkVmFyaWFibGU7CisgICAgYm9vbGVhbiBjbG9zdXJlU2hhcmU9ZmFsc2U7CisKKyAgICBwdWJsaWMgVmFyaWFibGUgZ2V0QWNjZXNzZWRWYXJpYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIGFjY2Vzc2VkVmFyaWFibGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QWNjZXNzZWRWYXJpYWJsZShWYXJpYWJsZSBvcmlnaW4pIHsKKyAgICAgICAgdGhpcy5hY2Nlc3NlZFZhcmlhYmxlID0gb3JpZ2luOworICAgIH0KKworICAgIHB1YmxpYyBWYXJpYWJsZUV4cHJlc3Npb24oU3RyaW5nIHZhcmlhYmxlLCBDbGFzc05vZGUgdHlwZSkgeworICAgICAgICB0aGlzLnZhcmlhYmxlID0gdmFyaWFibGU7CisgICAgICAgIHNldFR5cGUoQ2xhc3NIZWxwZXIuZ2V0V3JhcHBlcih0eXBlKSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBWYXJpYWJsZUV4cHJlc3Npb24oU3RyaW5nIHZhcmlhYmxlKSB7CisgICAgICAgIHRoaXModmFyaWFibGUsIENsYXNzSGVscGVyLkRZTkFNSUNfVFlQRSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBWYXJpYWJsZUV4cHJlc3Npb24oVmFyaWFibGUgdmFyaWFibGUpIHsKKyAgICAgICAgdGhpcyh2YXJpYWJsZS5nZXROYW1lKCksIHZhcmlhYmxlLmdldFR5cGUoKSk7CisgICAgICAgIHNldEFjY2Vzc2VkVmFyaWFibGUodmFyaWFibGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0KEdyb292eUNvZGVWaXNpdG9yIHZpc2l0b3IpIHsKKyAgICAgICAgdmlzaXRvci52aXNpdFZhcmlhYmxlRXhwcmVzc2lvbih0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiB0cmFuc2Zvcm1FeHByZXNzaW9uKEV4cHJlc3Npb25UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lcikgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CisgICAgICAgIHJldHVybiB2YXJpYWJsZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gdmFyaWFibGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgdmFyaWFibGUgaXMgZHluYW1pY2FsbHkgdHlwZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gc3VwZXIudG9TdHJpbmcoKSArICJbdmFyaWFibGU6ICIgKyB2YXJpYWJsZSArICh0aGlzLmlzRHluYW1pY1R5cGVkKCkgPyAiIiA6ICIgdHlwZTogIiArIGdldFR5cGUoKSkgKyAiXSI7CisgICAgfQorCisgICAgcHVibGljIEV4cHJlc3Npb24gZ2V0SW5pdGlhbEV4cHJlc3Npb24oKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc0luaXRpYWxFeHByZXNzaW9uKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGlzSW5TdGF0aWNDb250ZXh0KCkgeworICAgICAgICBpZiAoYWNjZXNzZWRWYXJpYWJsZSE9bnVsbCAmJiBhY2Nlc3NlZFZhcmlhYmxlIT10aGlzKSByZXR1cm4gYWNjZXNzZWRWYXJpYWJsZS5pc0luU3RhdGljQ29udGV4dCgpOworICAgICAgICByZXR1cm4gaW5TdGF0aWNDb250ZXh0OworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRJblN0YXRpY0NvbnRleHQoYm9vbGVhbiBpblN0YXRpY0NvbnRleHQpIHsKKyAgICAgICAgdGhpcy5pblN0YXRpY0NvbnRleHQgPSBpblN0YXRpY0NvbnRleHQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VHlwZShDbGFzc05vZGUgY24peworICAgICAgICBzdXBlci5zZXRUeXBlKGNuKTsKKyAgICAgICAgaXNEeW5hbWljVHlwZWQgfD0gQ2xhc3NIZWxwZXIuRFlOQU1JQ19UWVBFPT1jbjsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gaXNEeW5hbWljVHlwZWQoKSB7CisgICAgICAgIHJldHVybiBpc0R5bmFtaWNUeXBlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Nsb3N1cmVTaGFyZWRWYXJpYWJsZSgpIHsKKyAgICAgICAgaWYgKGFjY2Vzc2VkVmFyaWFibGUhPW51bGwgJiYgYWNjZXNzZWRWYXJpYWJsZSE9dGhpcykgcmV0dXJuIGFjY2Vzc2VkVmFyaWFibGUuaXNDbG9zdXJlU2hhcmVkVmFyaWFibGUoKTsKKyAgICAgICAgcmV0dXJuIGNsb3N1cmVTaGFyZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0Q2xvc3VyZVNoYXJlZFZhcmlhYmxlKGJvb2xlYW4gaW5DbG9zdXJlKSB7CisgICAgICAgIGNsb3N1cmVTaGFyZSA9IGluQ2xvc3VyZTsgICAgICAgIAorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgQ2xhc3NOb2RlIGdldFR5cGUoKSB7CisgICAgICAgIGlmIChhY2Nlc3NlZFZhcmlhYmxlIT1udWxsICYmIGFjY2Vzc2VkVmFyaWFibGUhPXRoaXMpIHJldHVybiBhY2Nlc3NlZFZhcmlhYmxlLmdldFR5cGUoKTsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmdldFR5cGUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvZXhwci9wYWNrYWdlLmh0bWwgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvZXhwci9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFjNTA3MQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9leHByL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDggQEAKKzxodG1sPgorICA8aGVhZD4KKyAgICA8dGl0bGU+cGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByLio8L3RpdGxlPgorICA8L2hlYWQ+CisgIDxib2R5PgorICAgIDxwPkFTVCBub2RlcyBmb3IgR3Jvb3Z5IGV4cHJlc3Npb25zPC9wPgorICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3QvcGFja2FnZS5odG1sIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWQ5NGIwCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDggQEAKKzxodG1sPgorICA8aGVhZD4KKyAgICA8dGl0bGU+cGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC4qPC90aXRsZT4KKyAgPC9oZWFkPgorICA8Ym9keT4KKyAgICA8cD5Hcm9vdnkgQVNUIG5vZGVzIGZvciB0aGUgc3ludGF4IG9mIHRoZSBsYW5ndWFnZTwvcD4KKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L3N0bXQvQXNzZXJ0U3RhdGVtZW50LmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3Qvc3RtdC9Bc3NlcnRTdGF0ZW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmZjYjU4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L3N0bXQvQXNzZXJ0U3RhdGVtZW50LmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQ7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5Hcm9vdnlDb2RlVmlzaXRvcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByLkJvb2xlYW5FeHByZXNzaW9uOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHIuQ29uc3RhbnRFeHByZXNzaW9uOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHIuRXhwcmVzc2lvbjsKKworLyoqCisgKiBSZXByZXNlbnRzIGFuIGFzc2VydCBzdGF0ZW1lbnQgc3VjaCBhcyAKKyAqIDxjb2RlPgorICogYXNzZXJ0IGkgIT0gMCA6ICJzaG91bGQgbmV2ZXIgYmUgemVybyI7CisgKiA8L2NvZGU+CisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBBc3NlcnRTdGF0ZW1lbnQgZXh0ZW5kcyBTdGF0ZW1lbnQgeworCisgICAgcHJpdmF0ZSBCb29sZWFuRXhwcmVzc2lvbiBib29sZWFuRXhwcmVzc2lvbjsKKyAgICBwcml2YXRlIEV4cHJlc3Npb24gbWVzc2FnZUV4cHJlc3Npb247CisgICAgCisgICAgcHVibGljIEFzc2VydFN0YXRlbWVudChCb29sZWFuRXhwcmVzc2lvbiBib29sZWFuRXhwcmVzc2lvbikgeworICAgICAgICB0aGlzKGJvb2xlYW5FeHByZXNzaW9uLCBDb25zdGFudEV4cHJlc3Npb24uTlVMTCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBBc3NlcnRTdGF0ZW1lbnQoQm9vbGVhbkV4cHJlc3Npb24gYm9vbGVhbkV4cHJlc3Npb24sIEV4cHJlc3Npb24gbWVzc2FnZUV4cHJlc3Npb24pIHsKKyAgICAgICAgdGhpcy5ib29sZWFuRXhwcmVzc2lvbiA9IGJvb2xlYW5FeHByZXNzaW9uOworICAgICAgICB0aGlzLm1lc3NhZ2VFeHByZXNzaW9uID0gbWVzc2FnZUV4cHJlc3Npb247CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHZpc2l0KEdyb292eUNvZGVWaXNpdG9yIHZpc2l0b3IpIHsKKyAgICAgICAgdmlzaXRvci52aXNpdEFzc2VydFN0YXRlbWVudCh0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBnZXRNZXNzYWdlRXhwcmVzc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VFeHByZXNzaW9uOworICAgIH0KKworICAgIHB1YmxpYyBCb29sZWFuRXhwcmVzc2lvbiBnZXRCb29sZWFuRXhwcmVzc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIGJvb2xlYW5FeHByZXNzaW9uOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzZXRCb29sZWFuRXhwcmVzc2lvbihCb29sZWFuRXhwcmVzc2lvbiBib29sZWFuRXhwcmVzc2lvbikgeworICAgICAgICB0aGlzLmJvb2xlYW5FeHByZXNzaW9uID0gYm9vbGVhbkV4cHJlc3Npb247CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VFeHByZXNzaW9uKEV4cHJlc3Npb24gbWVzc2FnZUV4cHJlc3Npb24pIHsKKyAgICAgICAgdGhpcy5tZXNzYWdlRXhwcmVzc2lvbiA9IG1lc3NhZ2VFeHByZXNzaW9uOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9zdG10L0Jsb2NrU3RhdGVtZW50LmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3Qvc3RtdC9CbG9ja1N0YXRlbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNmE3MTMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3Qvc3RtdC9CbG9ja1N0YXRlbWVudC5qYXZhCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5zdG10OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0Lkdyb292eUNvZGVWaXNpdG9yOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LlZhcmlhYmxlU2NvcGU7CisKKy8qKgorICogQSBsaXN0IG9mIHN0YXRlbWVudHMKKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIEJsb2NrU3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHsKKworICAgIHByaXZhdGUgTGlzdCBzdGF0ZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOworICAgIHByaXZhdGUgVmFyaWFibGVTY29wZSBzY29wZTsKKyAgICAKKyAgICBwdWJsaWMgQmxvY2tTdGF0ZW1lbnQoKSB7CisgICAgICAgIHRoaXMobmV3IEFycmF5TGlzdCgpLCBuZXcgVmFyaWFibGVTY29wZSgpKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIEJsb2NrU3RhdGVtZW50KExpc3Qgc3RhdGVtZW50cywgVmFyaWFibGVTY29wZSBzY29wZSkgeworICAgICAgICB0aGlzLnN0YXRlbWVudHMgPSBzdGF0ZW1lbnRzOworICAgICAgICB0aGlzLnNjb3BlID0gc2NvcGU7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBCbG9ja1N0YXRlbWVudChTdGF0ZW1lbnRbXSBzdGF0ZW1lbnRzLCBWYXJpYWJsZVNjb3BlIHNjb3BlKSB7CisgICAgICAgIHRoaXMuc3RhdGVtZW50cy5hZGRBbGwoQXJyYXlzLmFzTGlzdChzdGF0ZW1lbnRzKSk7CisgICAgICAgIHRoaXMuc2NvcGUgPSBzY29wZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChHcm9vdnlDb2RlVmlzaXRvciB2aXNpdG9yKSB7CisgICAgICAgIHZpc2l0b3IudmlzaXRCbG9ja1N0YXRlbWVudCh0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdCBnZXRTdGF0ZW1lbnRzKCkgeworICAgICAgICByZXR1cm4gc3RhdGVtZW50czsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRTdGF0ZW1lbnQoU3RhdGVtZW50IHN0YXRlbWVudCkgeworICAgICAgICBzdGF0ZW1lbnRzLmFkZChzdGF0ZW1lbnQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZFN0YXRlbWVudHMoTGlzdCBsaXN0T2ZTdGF0ZW1lbnRzKSB7CisgICAgICAgIHN0YXRlbWVudHMuYWRkQWxsKGxpc3RPZlN0YXRlbWVudHMpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBzdXBlci50b1N0cmluZygpICsgc3RhdGVtZW50czsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCJ7ICIpOworICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gc3RhdGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKSB7CisgICAgICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiOyAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0YXRlbWVudCBzdGF0ZW1lbnQgPSAoU3RhdGVtZW50KSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoc3RhdGVtZW50LmdldFRleHQoKSk7CisgICAgICAgIH0KKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiIH0iKTsKKyAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CisgICAgICAgIHJldHVybiBzdGF0ZW1lbnRzLmlzRW1wdHkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRWYXJpYWJsZVNjb3BlKFZhcmlhYmxlU2NvcGUgc2NvcGUpIHsKKyAgICAgICAgdGhpcy5zY29wZSA9IHNjb3BlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgVmFyaWFibGVTY29wZSBnZXRWYXJpYWJsZVNjb3BlKCkgeworICAgICAgICByZXR1cm4gc2NvcGU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L3N0bXQvQnJlYWtTdGF0ZW1lbnQuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9zdG10L0JyZWFrU3RhdGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYxMjA2MAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9zdG10L0JyZWFrU3RhdGVtZW50LmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQ7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5Hcm9vdnlDb2RlVmlzaXRvcjsKKworCisvKioKKyAqIFJlcHJlc2VudHMgYSBicmVhayBzdGF0ZW1lbnQgaW4gYSBzd2l0Y2ggb3IgbG9vcCBzdGF0ZW1lbnQKKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIEJyZWFrU3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHsKKworICAgIHByaXZhdGUgU3RyaW5nIGxhYmVsOworICAgIAorICAgIHB1YmxpYyBCcmVha1N0YXRlbWVudCgpIHsKKyAgICAgICAgdGhpcyhudWxsKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIEJyZWFrU3RhdGVtZW50KFN0cmluZyBsYWJlbCkgeworICAgICAgICB0aGlzLmxhYmVsID0gbGFiZWw7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7CisgICAgICAgIHJldHVybiBsYWJlbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChHcm9vdnlDb2RlVmlzaXRvciB2aXNpdG9yKSB7CisgICAgICAgIHZpc2l0b3IudmlzaXRCcmVha1N0YXRlbWVudCh0aGlzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3Qvc3RtdC9DYXNlU3RhdGVtZW50LmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3Qvc3RtdC9DYXNlU3RhdGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZmMjM5ZgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9zdG10L0Nhc2VTdGF0ZW1lbnQuamF2YQpAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5hc3Quc3RtdDsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0Lkdyb292eUNvZGVWaXNpdG9yOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHIuRXhwcmVzc2lvbjsKKworCisvKioKKyAqIFJlcHJlc2VudHMgYSBjYXNlIHN0YXRlbWVudCBpbiBhIHN3aXRjaCBzdGF0ZW1lbnQKKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIENhc2VTdGF0ZW1lbnQgZXh0ZW5kcyBTdGF0ZW1lbnQgeworCisgICAgcHJpdmF0ZSBmaW5hbCBTdGF0ZW1lbnQgY29kZTsKKyAgICBwcml2YXRlIEV4cHJlc3Npb24gZXhwcmVzc2lvbjsKKyAgICAKKyAgICBwdWJsaWMgQ2FzZVN0YXRlbWVudChFeHByZXNzaW9uIGV4cHJlc3Npb24sIFN0YXRlbWVudCBjb2RlKSB7CisgICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247CisgICAgICAgIHRoaXMuY29kZSA9IGNvZGU7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBTdGF0ZW1lbnQgZ2V0Q29kZSgpIHsKKyAgICAgICAgcmV0dXJuIGNvZGU7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oKSB7CisgICAgICAgIHJldHVybiBleHByZXNzaW9uOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRFeHByZXNzaW9uKEV4cHJlc3Npb24gZSkgeworICAgICAgICBleHByZXNzaW9uPWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXQoR3Jvb3Z5Q29kZVZpc2l0b3IgdmlzaXRvcikgeworICAgICAgICB2aXNpdG9yLnZpc2l0Q2FzZVN0YXRlbWVudCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCkgKyAiW2V4cHJlc3Npb246ICIgKyBleHByZXNzaW9uICsgIjsgY29kZTogIiArIGNvZGUgKyAiXSI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L3N0bXQvQ2F0Y2hTdGF0ZW1lbnQuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9zdG10L0NhdGNoU3RhdGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdiMDE0YQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9zdG10L0NhdGNoU3RhdGVtZW50LmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQ7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5DbGFzc05vZGU7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuR3Jvb3Z5Q29kZVZpc2l0b3I7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuUGFyYW1ldGVyOworCisKKy8qKgorICogUmVwcmVzZW50cyBhIGNhdGNoIChFeGNlcHRpb24gdmFyKSB7IH0gc3RhdGVtZW50CisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBDYXRjaFN0YXRlbWVudCBleHRlbmRzIFN0YXRlbWVudCB7CisKKyAgICBwcml2YXRlIFBhcmFtZXRlciB2YXJpYWJsZTsKKyAgICBwcml2YXRlIFN0YXRlbWVudCBjb2RlOworICAgIAorICAgIHB1YmxpYyBDYXRjaFN0YXRlbWVudChQYXJhbWV0ZXIgdmFyaWFibGUsIFN0YXRlbWVudCBjb2RlKSB7CisgICAgICAgIHRoaXMudmFyaWFibGUgPSB2YXJpYWJsZTsKKyAgICAgICAgdGhpcy5jb2RlID0gY29kZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdmlzaXQoR3Jvb3Z5Q29kZVZpc2l0b3IgdmlzaXRvcikgeworICAgICAgICB2aXNpdG9yLnZpc2l0Q2F0Y2hTdGF0ZW1lbnQodGhpcyk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBTdGF0ZW1lbnQgZ2V0Q29kZSgpIHsKKyAgICAgICAgcmV0dXJuIGNvZGU7CisgICAgfQorCisgICAgcHVibGljIENsYXNzTm9kZSBnZXRFeGNlcHRpb25UeXBlKCkgeworICAgICAgICByZXR1cm4gdmFyaWFibGUuZ2V0VHlwZSgpOworICAgIH0KKworICAgIHB1YmxpYyBQYXJhbWV0ZXIgZ2V0VmFyaWFibGUoKSB7CisgICAgICAgIHJldHVybiB2YXJpYWJsZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3Qvc3RtdC9Db250aW51ZVN0YXRlbWVudC5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L3N0bXQvQ29udGludWVTdGF0ZW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjEwMjBkCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L3N0bXQvQ29udGludWVTdGF0ZW1lbnQuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5hc3Quc3RtdDsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0Lkdyb292eUNvZGVWaXNpdG9yOworCisKKy8qKgorICogUmVwcmVzZW50cyBhIGNvbnRpbnVlIHN0YXRlbWVudCBpbiBhIGxvb3Agc3RhdGVtZW50CisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBDb250aW51ZVN0YXRlbWVudCBleHRlbmRzIFN0YXRlbWVudCB7CisKKyAgICBwcml2YXRlIFN0cmluZyBsYWJlbDsKKyAgICAKKyAgICBwdWJsaWMgQ29udGludWVTdGF0ZW1lbnQoKSB7CisgICAgICAgIHRoaXMobnVsbCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBDb250aW51ZVN0YXRlbWVudChTdHJpbmcgbGFiZWwpIHsKKyAgICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgeworICAgICAgICByZXR1cm4gbGFiZWw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXQoR3Jvb3Z5Q29kZVZpc2l0b3IgdmlzaXRvcikgeworICAgICAgICB2aXNpdG9yLnZpc2l0Q29udGludWVTdGF0ZW1lbnQodGhpcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L3N0bXQvRG9XaGlsZVN0YXRlbWVudC5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L3N0bXQvRG9XaGlsZVN0YXRlbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNTg1ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3Qvc3RtdC9Eb1doaWxlU3RhdGVtZW50LmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQ7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5Hcm9vdnlDb2RlVmlzaXRvcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByLkJvb2xlYW5FeHByZXNzaW9uOworCisvKioKKyAqIFJlcHJlc2VudHMgYSBkbyB7IC4uLiB9IHdoaWxlIChjb25kaXRpb24pIGxvb3AgaW4gR3Jvb3Z5CisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBEb1doaWxlU3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHsKKworICAgIHByaXZhdGUgQm9vbGVhbkV4cHJlc3Npb24gYm9vbGVhbkV4cHJlc3Npb247CisgICAgcHJpdmF0ZSBTdGF0ZW1lbnQgbG9vcEJsb2NrOworICAgIAorCisgICAgcHVibGljIERvV2hpbGVTdGF0ZW1lbnQoQm9vbGVhbkV4cHJlc3Npb24gYm9vbGVhbkV4cHJlc3Npb24sIFN0YXRlbWVudCBsb29wQmxvY2spIHsKKyAgICAgICAgdGhpcy5ib29sZWFuRXhwcmVzc2lvbiA9IGJvb2xlYW5FeHByZXNzaW9uOworICAgICAgICB0aGlzLmxvb3BCbG9jayA9IGxvb3BCbG9jazsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdmlzaXQoR3Jvb3Z5Q29kZVZpc2l0b3IgdmlzaXRvcikgeworICAgICAgICB2aXNpdG9yLnZpc2l0RG9XaGlsZUxvb3AodGhpcyk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBCb29sZWFuRXhwcmVzc2lvbiBnZXRCb29sZWFuRXhwcmVzc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIGJvb2xlYW5FeHByZXNzaW9uOworICAgIH0KKworICAgIHB1YmxpYyBTdGF0ZW1lbnQgZ2V0TG9vcEJsb2NrKCkgeworICAgICAgICByZXR1cm4gbG9vcEJsb2NrOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzZXRCb29sZWFuRXhwcmVzc2lvbihCb29sZWFuRXhwcmVzc2lvbiBib29sZWFuRXhwcmVzc2lvbikgeworICAgICAgICB0aGlzLmJvb2xlYW5FeHByZXNzaW9uID0gYm9vbGVhbkV4cHJlc3Npb247CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L3N0bXQvRW1wdHlTdGF0ZW1lbnQuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9zdG10L0VtcHR5U3RhdGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNjYTBlOAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9zdG10L0VtcHR5U3RhdGVtZW50LmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQ7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5Hcm9vdnlDb2RlVmlzaXRvcjsKKworLyoqCisgKiBSZXByZXNlbnRzIGFuIGVtcHR5IHN0YXRlbWVudAorICogCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgRW1wdHlTdGF0ZW1lbnQgZXh0ZW5kcyBTdGF0ZW1lbnQgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFbXB0eVN0YXRlbWVudCBJTlNUQU5DRSA9IG5ldyBFbXB0eVN0YXRlbWVudCgpOworICAgIAorICAgIHB1YmxpYyB2b2lkIHZpc2l0KEdyb292eUNvZGVWaXNpdG9yIHZpc2l0b3IpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9zdG10L0V4cHJlc3Npb25TdGF0ZW1lbnQuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9zdG10L0V4cHJlc3Npb25TdGF0ZW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzFhNmZiCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L3N0bXQvRXhwcmVzc2lvblN0YXRlbWVudC5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5zdG10OworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuR3Jvb3Z5Q29kZVZpc2l0b3I7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuZXhwci5FeHByZXNzaW9uOworCisKKy8qKgorICogQSBzaW1wbGUgc3RhdGVtZW50IHN1Y2ggYXMgYSBtZXRob2QgY2FsbCB3aGVyZSB0aGUgcmV0dXJuIHZhbHVlIGlzIGlnbm9yZWQKKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIEV4cHJlc3Npb25TdGF0ZW1lbnQgZXh0ZW5kcyBTdGF0ZW1lbnQgeworCisgICAgcHJpdmF0ZSBFeHByZXNzaW9uIGV4cHJlc3Npb247CisgICAgCisgICAgcHVibGljIEV4cHJlc3Npb25TdGF0ZW1lbnQoRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisgICAgICAgIGlmIChleHByZXNzaW9uID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImV4cHJlc3Npb24gY2Fubm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChHcm9vdnlDb2RlVmlzaXRvciB2aXNpdG9yKSB7CisgICAgICAgIHZpc2l0b3IudmlzaXRFeHByZXNzaW9uU3RhdGVtZW50KHRoaXMpOworICAgIH0KKworICAgIHB1YmxpYyBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oKSB7CisgICAgICAgIHJldHVybiBleHByZXNzaW9uOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEV4cHJlc3Npb24oRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisgICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgeworICAgIAlyZXR1cm4gdGhpcy50b1N0cmluZygpOworICAgIH0KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gc3VwZXIudG9TdHJpbmcoKSArICJbZXhwcmVzc2lvbjoiICsgZXhwcmVzc2lvbiArICJdIjsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9zdG10L0ZvclN0YXRlbWVudC5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L3N0bXQvRm9yU3RhdGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIxYjZmZgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9zdG10L0ZvclN0YXRlbWVudC5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5zdG10OworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuQ2xhc3NIZWxwZXI7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuQ2xhc3NOb2RlOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0Lkdyb292eUNvZGVWaXNpdG9yOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LlBhcmFtZXRlcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5WYXJpYWJsZVNjb3BlOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHIuRXhwcmVzc2lvbjsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgc3RhbmRhcmQgZm9yIGxvb3AgaW4gR3Jvb3Z5CisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBGb3JTdGF0ZW1lbnQgZXh0ZW5kcyBTdGF0ZW1lbnQgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyYW1ldGVyIEZPUl9MT09QX0RVTU1ZID0gbmV3IFBhcmFtZXRlcihDbGFzc0hlbHBlci5PQkpFQ1RfVFlQRSwiZm9yTG9vcER1bW15UGFyYW1ldGVyIik7CisKKyAgICBwcml2YXRlIFBhcmFtZXRlciB2YXJpYWJsZTsKKyAgICBwcml2YXRlIEV4cHJlc3Npb24gY29sbGVjdGlvbkV4cHJlc3Npb247CisgICAgcHJpdmF0ZSBTdGF0ZW1lbnQgbG9vcEJsb2NrOworICAgIHByaXZhdGUgVmFyaWFibGVTY29wZSBzY29wZTsKKyAgICAKKworICAgIHB1YmxpYyBGb3JTdGF0ZW1lbnQoUGFyYW1ldGVyIHZhcmlhYmxlLCBFeHByZXNzaW9uIGNvbGxlY3Rpb25FeHByZXNzaW9uLCBTdGF0ZW1lbnQgbG9vcEJsb2NrKSB7CisgICAgICAgIHRoaXMudmFyaWFibGUgPSB2YXJpYWJsZTsgCisgICAgICAgIHRoaXMuY29sbGVjdGlvbkV4cHJlc3Npb24gPSBjb2xsZWN0aW9uRXhwcmVzc2lvbjsKKyAgICAgICAgdGhpcy5sb29wQmxvY2sgPSBsb29wQmxvY2s7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHZpc2l0KEdyb292eUNvZGVWaXNpdG9yIHZpc2l0b3IpIHsKKyAgICAgICAgdmlzaXRvci52aXNpdEZvckxvb3AodGhpcyk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBFeHByZXNzaW9uIGdldENvbGxlY3Rpb25FeHByZXNzaW9uKCkgeworICAgICAgICByZXR1cm4gY29sbGVjdGlvbkV4cHJlc3Npb247CisgICAgfQorCisgICAgcHVibGljIFN0YXRlbWVudCBnZXRMb29wQmxvY2soKSB7CisgICAgICAgIHJldHVybiBsb29wQmxvY2s7CisgICAgfQorCisgICAgcHVibGljIFBhcmFtZXRlciBnZXRWYXJpYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIHZhcmlhYmxlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgQ2xhc3NOb2RlIGdldFZhcmlhYmxlVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHZhcmlhYmxlLmdldFR5cGUoKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0Q29sbGVjdGlvbkV4cHJlc3Npb24oRXhwcmVzc2lvbiBjb2xsZWN0aW9uRXhwcmVzc2lvbikgeworICAgICAgICB0aGlzLmNvbGxlY3Rpb25FeHByZXNzaW9uID0gY29sbGVjdGlvbkV4cHJlc3Npb247CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VmFyaWFibGVTY29wZShWYXJpYWJsZVNjb3BlIHZhcmlhYmxlU2NvcGUpIHsKKyAgICAgICBzY29wZSA9IHZhcmlhYmxlU2NvcGU7ICAgICAgICAKKyAgICB9CisKKyAgICBwdWJsaWMgVmFyaWFibGVTY29wZSBnZXRWYXJpYWJsZVNjb3BlKCkgeworICAgICAgICByZXR1cm4gc2NvcGU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L3N0bXQvSWZTdGF0ZW1lbnQuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9zdG10L0lmU3RhdGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUwMGZmMwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9zdG10L0lmU3RhdGVtZW50LmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQ7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5Hcm9vdnlDb2RlVmlzaXRvcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByLkJvb2xlYW5FeHByZXNzaW9uOworCisvKioKKyAqIFJlcHJlc2VudHMgYSBkbyB7IC4uLiB9IHdoaWxlIChjb25kaXRpb24pIGxvb3AgaW4gR3Jvb3Z5CisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBJZlN0YXRlbWVudCBleHRlbmRzIFN0YXRlbWVudCB7CisKKyAgICBwcml2YXRlIEJvb2xlYW5FeHByZXNzaW9uIGJvb2xlYW5FeHByZXNzaW9uOworICAgIHByaXZhdGUgU3RhdGVtZW50IGlmQmxvY2s7CisgICAgcHJpdmF0ZSBTdGF0ZW1lbnQgZWxzZUJsb2NrOworICAgIAorCisgICAgcHVibGljIElmU3RhdGVtZW50KEJvb2xlYW5FeHByZXNzaW9uIGJvb2xlYW5FeHByZXNzaW9uLCBTdGF0ZW1lbnQgaWZCbG9jaywgU3RhdGVtZW50IGVsc2VCbG9jaykgeworICAgICAgICB0aGlzLmJvb2xlYW5FeHByZXNzaW9uID0gYm9vbGVhbkV4cHJlc3Npb247CisgICAgICAgIHRoaXMuaWZCbG9jayA9IGlmQmxvY2s7CisgICAgICAgIHRoaXMuZWxzZUJsb2NrID0gZWxzZUJsb2NrOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChHcm9vdnlDb2RlVmlzaXRvciB2aXNpdG9yKSB7CisgICAgICAgIHZpc2l0b3IudmlzaXRJZkVsc2UodGhpcyk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBCb29sZWFuRXhwcmVzc2lvbiBnZXRCb29sZWFuRXhwcmVzc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIGJvb2xlYW5FeHByZXNzaW9uOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgU3RhdGVtZW50IGdldElmQmxvY2soKSB7CisgICAgICAgIHJldHVybiBpZkJsb2NrOworICAgIH0KKworICAgIHB1YmxpYyBTdGF0ZW1lbnQgZ2V0RWxzZUJsb2NrKCkgeworICAgICAgICByZXR1cm4gZWxzZUJsb2NrOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEJvb2xlYW5FeHByZXNzaW9uKEJvb2xlYW5FeHByZXNzaW9uIGJvb2xlYW5FeHByZXNzaW9uKSB7CisgICAgICAgIHRoaXMuYm9vbGVhbkV4cHJlc3Npb24gPSBib29sZWFuRXhwcmVzc2lvbjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3Qvc3RtdC9SZXR1cm5TdGF0ZW1lbnQuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9zdG10L1JldHVyblN0YXRlbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2OTg3NGYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3Qvc3RtdC9SZXR1cm5TdGF0ZW1lbnQuamF2YQpAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5hc3Quc3RtdDsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0Lkdyb292eUNvZGVWaXNpdG9yOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHIuQ29uc3RhbnRFeHByZXNzaW9uOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHIuRXhwcmVzc2lvbjsKKworLyoqCisgKiBBIHJldHVybiBzdGF0ZW1lbnQKKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIFJldHVyblN0YXRlbWVudCBleHRlbmRzIFN0YXRlbWVudCB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFJldHVyblN0YXRlbWVudCBSRVRVUk5fTlVMTF9PUl9WT0lEID0gbmV3IFJldHVyblN0YXRlbWVudChDb25zdGFudEV4cHJlc3Npb24uTlVMTCk7CisKKyAgICBwcml2YXRlIEV4cHJlc3Npb24gZXhwcmVzc2lvbjsKKyAgICAKKyAgICBwdWJsaWMgUmV0dXJuU3RhdGVtZW50KEV4cHJlc3Npb25TdGF0ZW1lbnQgc3RhdGVtZW50KSB7CisgICAgICAgIHRoaXMoc3RhdGVtZW50LmdldEV4cHJlc3Npb24oKSk7CisgICAgICAgIHNldFN0YXRlbWVudExhYmVsKHN0YXRlbWVudC5nZXRTdGF0ZW1lbnRMYWJlbCgpKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIFJldHVyblN0YXRlbWVudChFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKyAgICAgICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdmlzaXQoR3Jvb3Z5Q29kZVZpc2l0b3IgdmlzaXRvcikgeworICAgICAgICB2aXNpdG9yLnZpc2l0UmV0dXJuU3RhdGVtZW50KHRoaXMpOworICAgIH0KKworICAgIHB1YmxpYyBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oKSB7CisgICAgICAgIHJldHVybiBleHByZXNzaW9uOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKKyAgICAgICAgcmV0dXJuICJyZXR1cm4gIiArIGV4cHJlc3Npb24uZ2V0VGV4dCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEV4cHJlc3Npb24oRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisgICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L3N0bXQvU3RhdGVtZW50LmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3Qvc3RtdC9TdGF0ZW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2Q3YWJkCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L3N0bXQvU3RhdGVtZW50LmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQ7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5BU1ROb2RlOworCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIGFueSBzdGF0ZW1lbnQKKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIFN0YXRlbWVudCBleHRlbmRzIEFTVE5vZGUgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgc3RhdGVtZW50TGFiZWw7CisKKyAgICBwdWJsaWMgU3RhdGVtZW50KCkgeworICAgICAgICBzdGF0ZW1lbnRMYWJlbCA9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRTdGF0ZW1lbnRMYWJlbCgpIHsKKyAgICAgICAgcmV0dXJuIHN0YXRlbWVudExhYmVsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFN0YXRlbWVudExhYmVsKCBTdHJpbmcgbGFiZWwgKSB7CisgICAgICAgIHN0YXRlbWVudExhYmVsID0gbGFiZWw7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9zdG10L1N3aXRjaFN0YXRlbWVudC5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L3N0bXQvU3dpdGNoU3RhdGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIzZTdlMgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9zdG10L1N3aXRjaFN0YXRlbWVudC5qYXZhCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5zdG10OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0Lkdyb292eUNvZGVWaXNpdG9yOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHIuRXhwcmVzc2lvbjsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgc3dpdGNoIChvYmplY3QpIHsgY2FzZSB2YWx1ZTogLi4uIGNhc2UgWzEsIDIsIDNdOiAuLi4gIGRlZmF1bHQ6IC4uLiB9IHN0YXRlbWVudCBpbiBHcm9vdnkuCisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBTd2l0Y2hTdGF0ZW1lbnQgZXh0ZW5kcyBTdGF0ZW1lbnQgeworCisgICAgcHJpdmF0ZSBFeHByZXNzaW9uIGV4cHJlc3Npb247CisgICAgcHJpdmF0ZSBMaXN0IGNhc2VTdGF0ZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOworICAgIHByaXZhdGUgU3RhdGVtZW50IGRlZmF1bHRTdGF0ZW1lbnQ7CisgICAgCisKKyAgICBwdWJsaWMgU3dpdGNoU3RhdGVtZW50KEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgICAgICB0aGlzKGV4cHJlc3Npb24sIEVtcHR5U3RhdGVtZW50LklOU1RBTkNFKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3dpdGNoU3RhdGVtZW50KEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgU3RhdGVtZW50IGRlZmF1bHRTdGF0ZW1lbnQpIHsKKyAgICAgICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjsKKyAgICAgICAgdGhpcy5kZWZhdWx0U3RhdGVtZW50ID0gZGVmYXVsdFN0YXRlbWVudDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3dpdGNoU3RhdGVtZW50KEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgTGlzdCBjYXNlU3RhdGVtZW50cywgU3RhdGVtZW50IGRlZmF1bHRTdGF0ZW1lbnQpIHsKKyAgICAgICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjsKKyAgICAgICAgdGhpcy5jYXNlU3RhdGVtZW50cyA9IGNhc2VTdGF0ZW1lbnRzOworICAgICAgICB0aGlzLmRlZmF1bHRTdGF0ZW1lbnQgPSBkZWZhdWx0U3RhdGVtZW50OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0KEdyb292eUNvZGVWaXNpdG9yIHZpc2l0b3IpIHsKKyAgICAgICAgdmlzaXRvci52aXNpdFN3aXRjaCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIExpc3QgZ2V0Q2FzZVN0YXRlbWVudHMoKSB7CisgICAgICAgIHJldHVybiBjYXNlU3RhdGVtZW50czsKKyAgICB9CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKCkgeworICAgICAgICByZXR1cm4gZXhwcmVzc2lvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRFeHByZXNzaW9uKEV4cHJlc3Npb24gZSkgeworICAgICAgICBleHByZXNzaW9uPWU7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBTdGF0ZW1lbnQgZ2V0RGVmYXVsdFN0YXRlbWVudCgpIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRTdGF0ZW1lbnQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdFN0YXRlbWVudChTdGF0ZW1lbnQgZGVmYXVsdFN0YXRlbWVudCkgeworICAgICAgICB0aGlzLmRlZmF1bHRTdGF0ZW1lbnQgPSBkZWZhdWx0U3RhdGVtZW50OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZENhc2UoQ2FzZVN0YXRlbWVudCBjYXNlU3RhdGVtZW50KSB7CisgICAgICAgIGNhc2VTdGF0ZW1lbnRzLmFkZChjYXNlU3RhdGVtZW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBjYXNlIHN0YXRlbWVudCBvZiB0aGUgZ2l2ZW4gaW5kZXggb3IgbnVsbAorICAgICAqLworICAgIHB1YmxpYyBDYXNlU3RhdGVtZW50IGdldENhc2VTdGF0ZW1lbnQoaW50IGlkeCkgeworICAgICAgICBpZiAoaWR4ID49IDAgJiYgaWR4IDwgY2FzZVN0YXRlbWVudHMuc2l6ZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gKENhc2VTdGF0ZW1lbnQpIGNhc2VTdGF0ZW1lbnRzLmdldChpZHgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9zdG10L1N5bmNocm9uaXplZFN0YXRlbWVudC5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L3N0bXQvU3luY2hyb25pemVkU3RhdGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcyMjVkOAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9zdG10L1N5bmNocm9uaXplZFN0YXRlbWVudC5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5zdG10OworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuR3Jvb3Z5Q29kZVZpc2l0b3I7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuZXhwci5FeHByZXNzaW9uOworCisKKy8qKgorICogUmVwcmVzZW50cyBhIHN5bmNocm9uaXplZCBzdGF0ZW1lbnQKKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIFN5bmNocm9uaXplZFN0YXRlbWVudCBleHRlbmRzIFN0YXRlbWVudCB7CisKKyAgICBwcml2YXRlIFN0YXRlbWVudCBjb2RlOworICAgIHByaXZhdGUgRXhwcmVzc2lvbiBleHByZXNzaW9uOworICAgIAorICAgIHB1YmxpYyBTeW5jaHJvbml6ZWRTdGF0ZW1lbnQoRXhwcmVzc2lvbiBleHByZXNzaW9uLCBTdGF0ZW1lbnQgY29kZSkgeworICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uOworICAgICAgICB0aGlzLmNvZGUgPSBjb2RlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgU3RhdGVtZW50IGdldENvZGUoKSB7CisgICAgICAgIHJldHVybiBjb2RlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKCkgeworICAgICAgICByZXR1cm4gZXhwcmVzc2lvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChHcm9vdnlDb2RlVmlzaXRvciB2aXNpdG9yKSB7CisgICAgICAgIHZpc2l0b3IudmlzaXRTeW5jaHJvbml6ZWRTdGF0ZW1lbnQodGhpcyk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNldEV4cHJlc3Npb24oRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisgICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L3N0bXQvVGhyb3dTdGF0ZW1lbnQuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9zdG10L1Rocm93U3RhdGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEzMmRkNgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9zdG10L1Rocm93U3RhdGVtZW50LmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQ7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5Hcm9vdnlDb2RlVmlzaXRvcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByLkV4cHJlc3Npb247CisKKworLyoqCisgKiBSZXByZXNlbnRzIGEgdGhyb3cgc3RhdGVtZW50CisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBUaHJvd1N0YXRlbWVudCBleHRlbmRzIFN0YXRlbWVudCB7CisKKyAgICBwcml2YXRlIEV4cHJlc3Npb24gZXhwcmVzc2lvbjsKKyAgICAKKyAgICBwdWJsaWMgVGhyb3dTdGF0ZW1lbnQoRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisgICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247CisgICAgfQorICAgIAorICAgIHB1YmxpYyBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oKSB7CisgICAgICAgIHJldHVybiBleHByZXNzaW9uOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0KEdyb292eUNvZGVWaXNpdG9yIHZpc2l0b3IpIHsKKyAgICAgICAgdmlzaXRvci52aXNpdFRocm93U3RhdGVtZW50KHRoaXMpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzZXRFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9zdG10L1RyeUNhdGNoU3RhdGVtZW50LmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3Qvc3RtdC9UcnlDYXRjaFN0YXRlbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZGYwYjAKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3Qvc3RtdC9UcnlDYXRjaFN0YXRlbWVudC5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5zdG10OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0Lkdyb292eUNvZGVWaXNpdG9yOworCisvKioKKyAqIFJlcHJlc2VudHMgYSB0cnkgeyAuLi4gfSBjYXRjaCAoKSBmaW5hbGx5IHt9IHN0YXRlbWVudCBpbiBHcm9vdnkKKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIFRyeUNhdGNoU3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHsKKworICAgIHByaXZhdGUgU3RhdGVtZW50IHRyeVN0YXRlbWVudDsKKyAgICBwcml2YXRlIExpc3QgY2F0Y2hTdGF0ZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOworICAgIHByaXZhdGUgU3RhdGVtZW50IGZpbmFsbHlTdGF0ZW1lbnQ7CisgICAgCisKKyAgICBwdWJsaWMgVHJ5Q2F0Y2hTdGF0ZW1lbnQoU3RhdGVtZW50IHRyeVN0YXRlbWVudCwgU3RhdGVtZW50IGZpbmFsbHlTdGF0ZW1lbnQpIHsKKyAgICAgICAgdGhpcy50cnlTdGF0ZW1lbnQgPSB0cnlTdGF0ZW1lbnQ7CisgICAgICAgIHRoaXMuZmluYWxseVN0YXRlbWVudCA9IGZpbmFsbHlTdGF0ZW1lbnQ7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHZpc2l0KEdyb292eUNvZGVWaXNpdG9yIHZpc2l0b3IpIHsKKyAgICAgICAgdmlzaXRvci52aXNpdFRyeUNhdGNoRmluYWxseSh0aGlzKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIExpc3QgZ2V0Q2F0Y2hTdGF0ZW1lbnRzKCkgeworICAgICAgICByZXR1cm4gY2F0Y2hTdGF0ZW1lbnRzOworICAgIH0KKworICAgIHB1YmxpYyBTdGF0ZW1lbnQgZ2V0RmluYWxseVN0YXRlbWVudCgpIHsKKyAgICAgICAgcmV0dXJuIGZpbmFsbHlTdGF0ZW1lbnQ7CisgICAgfQorCisgICAgcHVibGljIFN0YXRlbWVudCBnZXRUcnlTdGF0ZW1lbnQoKSB7CisgICAgICAgIHJldHVybiB0cnlTdGF0ZW1lbnQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkQ2F0Y2goQ2F0Y2hTdGF0ZW1lbnQgY2F0Y2hTdGF0ZW1lbnQpIHsKKyAgICAgICAgY2F0Y2hTdGF0ZW1lbnRzLmFkZChjYXRjaFN0YXRlbWVudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgY2F0Y2ggc3RhdGVtZW50IG9mIHRoZSBnaXZlbiBpbmRleCBvciBudWxsCisgICAgICovCisgICAgcHVibGljIENhdGNoU3RhdGVtZW50IGdldENhdGNoU3RhdGVtZW50KGludCBpZHgpIHsKKyAgICAgICAgaWYgKGlkeCA+PSAwICYmIGlkeCA8IGNhdGNoU3RhdGVtZW50cy5zaXplKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAoQ2F0Y2hTdGF0ZW1lbnQpIGNhdGNoU3RhdGVtZW50cy5nZXQoaWR4KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9hc3Qvc3RtdC9XaGlsZVN0YXRlbWVudC5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L3N0bXQvV2hpbGVTdGF0ZW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjNhNWQwCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L3N0bXQvV2hpbGVTdGF0ZW1lbnQuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5hc3Quc3RtdDsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0Lkdyb292eUNvZGVWaXNpdG9yOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHIuQm9vbGVhbkV4cHJlc3Npb247CisKKy8qKgorICogUmVwcmVzZW50cyBhIHdoaWxlIChjb25kaXRpb24pIHsgLi4uIH0gbG9vcCBpbiBHcm9vdnkKKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIFdoaWxlU3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHsKKworICAgIHByaXZhdGUgQm9vbGVhbkV4cHJlc3Npb24gYm9vbGVhbkV4cHJlc3Npb247CisgICAgcHJpdmF0ZSBTdGF0ZW1lbnQgbG9vcEJsb2NrOworICAgIAorCisgICAgcHVibGljIFdoaWxlU3RhdGVtZW50KEJvb2xlYW5FeHByZXNzaW9uIGJvb2xlYW5FeHByZXNzaW9uLCBTdGF0ZW1lbnQgbG9vcEJsb2NrKSB7CisgICAgICAgIHRoaXMuYm9vbGVhbkV4cHJlc3Npb24gPSBib29sZWFuRXhwcmVzc2lvbjsKKyAgICAgICAgdGhpcy5sb29wQmxvY2sgPSBsb29wQmxvY2s7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHZpc2l0KEdyb292eUNvZGVWaXNpdG9yIHZpc2l0b3IpIHsKKyAgICAgICAgdmlzaXRvci52aXNpdFdoaWxlTG9vcCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIEJvb2xlYW5FeHByZXNzaW9uIGdldEJvb2xlYW5FeHByZXNzaW9uKCkgeworICAgICAgICByZXR1cm4gYm9vbGVhbkV4cHJlc3Npb247CisgICAgfQorCisgICAgcHVibGljIFN0YXRlbWVudCBnZXRMb29wQmxvY2soKSB7CisgICAgICAgIHJldHVybiBsb29wQmxvY2s7CisgICAgfQorCisJcHVibGljIHZvaWQgc2V0Qm9vbGVhbkV4cHJlc3Npb24oQm9vbGVhbkV4cHJlc3Npb24gYm9vbGVhbkV4cHJlc3Npb24pIHsKKwkJdGhpcy5ib29sZWFuRXhwcmVzc2lvbiA9IGJvb2xlYW5FeHByZXNzaW9uOworCX0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9zdG10L3BhY2thZ2UuaHRtbCBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9zdG10L3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWE2ZTc0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L3N0bXQvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsOCBAQAorPGh0bWw+CisgIDxoZWFkPgorICAgIDx0aXRsZT5wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuKjwvdGl0bGU+CisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgPHA+QVNUIG5vZGVzIGZvciBHcm9vdnkgc3RhdGVtZW50czwvcD4KKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYmluZGluZy9BYnN0cmFjdEZ1bGxCaW5kaW5nLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9iaW5kaW5nL0Fic3RyYWN0RnVsbEJpbmRpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTdjNTNjCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYmluZGluZy9BYnN0cmFjdEZ1bGxCaW5kaW5nLmphdmEKQEAgLTAsMCArMSwxMTIgQEAKKy8qDQorICogQ29weXJpZ2h0IDIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLg0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5iaW5kaW5nOw0KKw0KK2ltcG9ydCBncm9vdnkubGFuZy5DbG9zdXJlOw0KKw0KKy8qKg0KKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnNoZW1ub25AeWFob28uY29tIj5EYW5ubyBGZXJyaW48L2E+DQorICogQHZlcnNpb24gJFJldmlzaW9uJA0KKyAqIEBzaW5jZSBHcm9vdnkgMS4xDQorICovDQorcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RnVsbEJpbmRpbmcgIGltcGxlbWVudHMgRnVsbEJpbmRpbmcgew0KKw0KKyAgICBwcm90ZWN0ZWQgU291cmNlQmluZGluZyBzb3VyY2VCaW5kaW5nOw0KKyAgICBwcm90ZWN0ZWQgVGFyZ2V0QmluZGluZyB0YXJnZXRCaW5kaW5nOw0KKyAgICBwcm90ZWN0ZWQgQ2xvc3VyZSB2YWxpZGF0b3I7DQorICAgIHByb3RlY3RlZCBDbG9zdXJlIGNvbnZlcnRlcjsNCisgICAgcHJvdGVjdGVkIENsb3N1cmUgcmV2ZXJzZUNvbnZlcnRlcjsNCisNCisgICAgcHJpdmF0ZSB2b2lkIGZpcmVCaW5kaW5nKCkgew0KKyAgICAgICAgaWYgKChzb3VyY2VCaW5kaW5nID09IG51bGwpIHx8ICh0YXJnZXRCaW5kaW5nID09IG51bGwpKSB7DQorICAgICAgICAgICAgLy8gc2hvdWxkIHdlIHRocm93IGludmFsaWQgYmluZGluZyBleGNlcHRpb24/ICBvciBmYWlsIHF1aWV0bHk/DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICAgICAgT2JqZWN0IHJlc3VsdCA9IHNvdXJjZUJpbmRpbmcuZ2V0U291cmNlVmFsdWUoKTsNCisgICAgICAgIGlmIChnZXRWYWxpZGF0b3IoKSAhPSBudWxsKSB7DQorICAgICAgICAgICAgT2JqZWN0IHZhbGlkYXRpb24gPSBnZXRWYWxpZGF0b3IoKS5jYWxsKCk7DQorICAgICAgICAgICAgaWYgKCh2YWxpZGF0aW9uID09IG51bGwpDQorICAgICAgICAgICAgICAgIHx8ICgodmFsaWRhdGlvbiBpbnN0YW5jZW9mIEJvb2xlYW4pICYmICEoKEJvb2xlYW4pdmFsaWRhdGlvbikuYm9vbGVhblZhbHVlKCkpKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgLy8gc2hvdWxkIHdlIHRocm93IGEgdmFsaWRhdGlvbiBmYWlsZWQgZXhjZXB0aW9uPyAgb3IgZmFpbCBxdWlldGx5Pw0KKyAgICAgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGdldENvbnZlcnRlcigpICE9IG51bGwpIHsNCisgICAgICAgICAgICByZXN1bHQgPSBnZXRDb252ZXJ0ZXIoKS5jYWxsKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgICB0YXJnZXRCaW5kaW5nLnVwZGF0ZVRhcmdldFZhbHVlKHJlc3VsdCk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgdXBkYXRlKCkgew0KKyAgICAgICAgZmlyZUJpbmRpbmcoKTsNCisgICAgfQ0KKw0KKyAgICBwcml2YXRlIHZvaWQgZmlyZVJldmVyc2VCaW5kaW5nKCkgew0KKyAgICAgICAgaWYgKCEoc291cmNlQmluZGluZyBpbnN0YW5jZW9mIFRhcmdldEJpbmRpbmcpIHx8ICEodGFyZ2V0QmluZGluZyBpbnN0YW5jZW9mIFNvdXJjZUJpbmRpbmcpKSB7DQorICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkJpbmRpbmcgSW5zdGFuY2UgaXMgbm90IHJldmVyc2FibGUiKTsNCisgICAgICAgIH0NCisgICAgICAgIE9iamVjdCByZXN1bHQgPSAoKFNvdXJjZUJpbmRpbmcpdGFyZ2V0QmluZGluZykuZ2V0U291cmNlVmFsdWUoKTsNCisgICAgICAgIGlmIChnZXRSZXZlcnNlQ29udmVydGVyKCkgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IGdldFJldmVyc2VDb252ZXJ0ZXIoKS5jYWxsKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgICAgICAoKFRhcmdldEJpbmRpbmcpc291cmNlQmluZGluZykudXBkYXRlVGFyZ2V0VmFsdWUocmVzdWx0KTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCByZXZlcnNlVXBkYXRlKCkgew0KKyAgICAgICAgZmlyZVJldmVyc2VCaW5kaW5nKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIFNvdXJjZUJpbmRpbmcgZ2V0U291cmNlQmluZGluZygpIHsNCisgICAgICAgIHJldHVybiBzb3VyY2VCaW5kaW5nOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldFNvdXJjZUJpbmRpbmcoU291cmNlQmluZGluZyBzb3VyY2VCaW5kaW5nKSB7DQorICAgICAgICB0aGlzLnNvdXJjZUJpbmRpbmcgPSBzb3VyY2VCaW5kaW5nOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBUYXJnZXRCaW5kaW5nIGdldFRhcmdldEJpbmRpbmcoKSB7DQorICAgICAgICByZXR1cm4gdGFyZ2V0QmluZGluZzsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXRCaW5kaW5nKFRhcmdldEJpbmRpbmcgdGFyZ2V0QmluZGluZykgew0KKyAgICAgICAgdGhpcy50YXJnZXRCaW5kaW5nID0gdGFyZ2V0QmluZGluZzsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgQ2xvc3VyZSBnZXRWYWxpZGF0b3IoKSB7DQorICAgICAgICByZXR1cm4gdmFsaWRhdG9yOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRvcihDbG9zdXJlIHZhbGlkYXRvcikgew0KKyAgICAgICAgdGhpcy52YWxpZGF0b3IgPSB2YWxpZGF0b3I7DQorICAgIH0NCisNCisgICAgcHVibGljIENsb3N1cmUgZ2V0Q29udmVydGVyKCkgew0KKyAgICAgICAgcmV0dXJuIGNvbnZlcnRlcjsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZXIoQ2xvc3VyZSBjb252ZXJ0ZXIpIHsNCisgICAgICAgIHRoaXMuY29udmVydGVyID0gY29udmVydGVyOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBDbG9zdXJlIGdldFJldmVyc2VDb252ZXJ0ZXIoKSB7DQorICAgICAgICByZXR1cm4gcmV2ZXJzZUNvbnZlcnRlcjsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXZlcnNlQ29udmVydGVyKENsb3N1cmUgcmV2ZXJzZUNvbnZlcnRlcikgew0KKyAgICAgICAgdGhpcy5yZXZlcnNlQ29udmVydGVyID0gcmV2ZXJzZUNvbnZlcnRlcjsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9iaW5kaW5nL0JpbmRpbmdVcGRhdGFibGUuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2JpbmRpbmcvQmluZGluZ1VwZGF0YWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ZGRjNGEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9iaW5kaW5nL0JpbmRpbmdVcGRhdGFibGUuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKg0KKyAqIENvcHlyaWdodCAyMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4NCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYmluZGluZzsNCisNCisvKioNCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzaGVtbm9uQHlhaG9vLmNvbSI+RGFubm8gRmVycmluPC9hPg0KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQNCisgKiBAc2luY2UgR3Jvb3Z5IDEuMQ0KKyAqLw0KK3B1YmxpYyBpbnRlcmZhY2UgQmluZGluZ1VwZGF0YWJsZSB7DQorDQorICAgIC8qKg0KKyAgICAgKiBDYXVzZXMgYXV0b21hdGljIHVwZGF0aW5nIG9mIGJvdW5kIHZhbHVlcyB0byBiZSB0dXJuZWQgb24uDQorICAgICAqIFRoaXMgaXMgaWRlbXBvdGVudCBiZXR3ZWVuIGNhbGxzIHRvIHVuYmluZCBhbmQgcmViaW5kOyBpLmUuIG11bHRpcGxlIGNhbGxzDQorICAgICAqIHRvIGJpbmQgd2lsbCBoYXZlIG9ubHkgdGhlIGVmZmVjdCBvZiB0aGUgZmlyc3QgY2FsbC4NCisgICAgICovDQorICAgIHZvaWQgYmluZCgpOw0KKw0KKyAgICAvKioNCisgICAgICogQ2F1c2VzIGF1dG9tYXRpYyB1cGRhdGluZyBvZiBib3VuZCB2YWx1ZXMgdG8gYmUgdHVybmVkIG9mZi4NCisgICAgICogVGhpcyBpcyBpZGVtcG90ZW50IGJldHdlZW4gY2FsbHMgdG8gYmluZCBhbmQgcmViaW5kOyBpLmUuIG11bHRpcGxlIGNhbGxzDQorICAgICAqIHRvIHVuYmluZCB3aWxsIGhhdmUgb25seSB0aGUgZWZmZWN0IG9mIHRoZSBmaXJzdCBjYWxsLiANCisgICAgICovDQorICAgIHZvaWQgdW5iaW5kKCk7DQorDQorICAgIC8qKg0KKyAgICAgKiBDYXVzZXMgdGhlIGN1cnJlbnQgYmluZGluZ3MgdG8gYmUgcmVzZXQuDQorICAgICAqIElmIHRoZSBiaW5kaW5nIGlzIG5vdCBib3VuZCwgaXQgaXMgYSBuby1vcC4NCisgICAgICogSWYgdGhlIGJpbmRpbmcgaXMgYm91bmQsIGl0IHdpbGwgYmUgdHVybmVkIG9mZiwgdGhlbiB0dXJuZWQgb24gYWdhaW5zdCBjdXJyZW50IHZhbHVlcy4NCisgICAgICovDQorICAgIHZvaWQgcmViaW5kKCk7DQorDQorICAgIC8qKg0KKyAgICAgKiBDYXVzZXMgdGhlIHZhbHVlcyB0byBiZSBwcm9waWdhdGVkIGZyb20gdGhlIHNvdXJjZSB0byB0aGUgdGFyZ2V0DQorICAgICAqLw0KKyAgICB2b2lkIHVwZGF0ZSgpOw0KKw0KKyAgICAvKioNCisgICAgICogSWYgc3VwcG9ydGVkLCBDYXVzZXMgdGhlIHZhbHVlcyB0byBiZSBwcm9waWdhdGVkIGZyb20gdGhlIHRhcmdldCB0byB0aGUgc291cmNlLA0KKyAgICAgKiBJZiBub3Qgc3VwcG9ydGVkLCBhbiBleGNlcHRpb24gbWF5IGJlIHRocm93biANCisgICAgICovDQorICAgIHZvaWQgcmV2ZXJzZVVwZGF0ZSgpOw0KK30NCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9iaW5kaW5nL0Nsb3N1cmVTb3VyY2VCaW5kaW5nLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9iaW5kaW5nL0Nsb3N1cmVTb3VyY2VCaW5kaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q5NDEyYgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2JpbmRpbmcvQ2xvc3VyZVNvdXJjZUJpbmRpbmcuamF2YQpAQCAtMCwwICsxLDU4IEBACisvKg0KKyAqIENvcHlyaWdodCAyMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4NCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYmluZGluZzsNCisNCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuQ2xvc3VyZTsNCisNCisvKioNCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzaGVtbm9uQHlhaG9vLmNvbSI+RGFubm8gRmVycmluPC9hPg0KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQNCisgKiBAc2luY2UgR3Jvb3Z5IDEuMQ0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDbG9zdXJlU291cmNlQmluZGluZyBpbXBsZW1lbnRzIFNvdXJjZUJpbmRpbmcgew0KKw0KKyAgICBDbG9zdXJlIGNsb3N1cmU7DQorICAgIE9iamVjdFtdIGFyZ3VtZW50czsNCisNCisgICAgcHVibGljIENsb3N1cmVTb3VyY2VCaW5kaW5nKENsb3N1cmUgY2xvc3VyZSkgew0KKyAgICAgICAgdGhpcyhjbG9zdXJlLCBuZXcgT2JqZWN0WzBdKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgQ2xvc3VyZVNvdXJjZUJpbmRpbmcoQ2xvc3VyZSBjbG9zdXJlLCBPYmplY3RbXSBhcmd1bWVudHMpIHsgLy9UT0RPIGluIEdyb292eSAyLjAgdXNlIHZhcmFyZ3M/DQorICAgICAgICB0aGlzLmNsb3N1cmUgPSBjbG9zdXJlOw0KKyAgICAgICAgdGhpcy5hcmd1bWVudHMgPSBhcmd1bWVudHM7DQorICAgIH0NCisNCisgICAgcHVibGljIENsb3N1cmUgZ2V0Q2xvc3VyZSgpIHsNCisgICAgICAgIHJldHVybiBjbG9zdXJlOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldENsb3N1cmUoQ2xvc3VyZSBjbG9zdXJlKSB7DQorICAgICAgICB0aGlzLmNsb3N1cmUgPSBjbG9zdXJlOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBPYmplY3QgZ2V0U291cmNlVmFsdWUoKSB7DQorICAgICAgICByZXR1cm4gY2xvc3VyZS5jYWxsKGFyZ3VtZW50cyk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgc2V0Q2xvc3VyZUFyZ3VtZW50cyhPYmplY3RbXSBhcmd1bWVudHMpIHsNCisgICAgICAgIHRoaXMuYXJndW1lbnRzID0gYXJndW1lbnRzOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldENsb3N1cmVBcmd1bWVudChPYmplY3QgYXJndW1lbnQpIHsNCisgICAgICAgIHRoaXMuYXJndW1lbnRzID0gbmV3IE9iamVjdFtdIHthcmd1bWVudH07DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYmluZGluZy9FdmVudFRyaWdnZXJCaW5kaW5nLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9iaW5kaW5nL0V2ZW50VHJpZ2dlckJpbmRpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWI0ZDJiCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYmluZGluZy9FdmVudFRyaWdnZXJCaW5kaW5nLmphdmEKQEAgLTAsMCArMSw4MyBAQAorLyoNCisgKiBDb3B5cmlnaHQgMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmJpbmRpbmc7DQorDQoraW1wb3J0IGdyb292eS5sYW5nLkNsb3N1cmU7DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5JbnZva2VySGVscGVyOw0KKw0KKy8qKg0KKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnNoZW1ub25AeWFob28uY29tIj5EYW5ubyBGZXJyaW48L2E+DQorICogQHZlcnNpb24gJFJldmlzaW9uJA0KKyAqIEBzaW5jZSBHcm9vdnkgMS4xDQorICovDQorcHVibGljIGNsYXNzIEV2ZW50VHJpZ2dlckJpbmRpbmcgaW1wbGVtZW50cyBUcmlnZ2VyQmluZGluZyB7DQorDQorICAgIE9iamVjdCB0cmlnZ2VyQmVhbjsNCisgICAgU3RyaW5nIGV2ZW50TmFtZTsNCisNCisgICAgcHVibGljIEV2ZW50VHJpZ2dlckJpbmRpbmcoT2JqZWN0IHRyaWdnZXJCZWFuLCBTdHJpbmcgZXZlbnROYW1lKSB7DQorICAgICAgICB0aGlzLnRyaWdnZXJCZWFuID0gdHJpZ2dlckJlYW47DQorICAgICAgICB0aGlzLmV2ZW50TmFtZSA9IGV2ZW50TmFtZTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgRnVsbEJpbmRpbmcgY3JlYXRlQmluZGluZyhmaW5hbCBTb3VyY2VCaW5kaW5nIHNvdXJjZUJpbmRpbmcsIGZpbmFsIFRhcmdldEJpbmRpbmcgdGFyZ2V0QmluZGluZykgew0KKyAgICAgICAgcmV0dXJuIG5ldyBFdmVudFRyaWdnZXJGdWxsQmluZGluZyhzb3VyY2VCaW5kaW5nLCB0YXJnZXRCaW5kaW5nKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgT2JqZWN0IGdldFRyaWdnZXJCZWFuKCkgew0KKyAgICAgICAgcmV0dXJuIHRyaWdnZXJCZWFuOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldFRyaWdnZXJCZWFuKE9iamVjdCB0cmlnZ2VyQmVhbikgew0KKyAgICAgICAgdGhpcy50cmlnZ2VyQmVhbiA9IHRyaWdnZXJCZWFuOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXZlbnROYW1lKCkgew0KKyAgICAgICAgcmV0dXJuIGV2ZW50TmFtZTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXRFdmVudE5hbWUoU3RyaW5nIGV2ZW50TmFtZSkgew0KKyAgICAgICAgdGhpcy5ldmVudE5hbWUgPSBldmVudE5hbWU7DQorICAgIH0NCisNCisgICAgcHJpdmF0ZSBjbGFzcyBFdmVudFRyaWdnZXJGdWxsQmluZGluZyBleHRlbmRzIEFic3RyYWN0RnVsbEJpbmRpbmcgew0KKw0KKyAgICAgICAgQ2xvc3VyZSBoYW5kbGVyOw0KKw0KKyAgICAgICAgcHVibGljIEV2ZW50VHJpZ2dlckZ1bGxCaW5kaW5nKFNvdXJjZUJpbmRpbmcgc291cmNlQmluZGluZywgVGFyZ2V0QmluZGluZyB0YXJnZXRCaW5kaW5nKSB7DQorICAgICAgICAgICAgc2V0U291cmNlQmluZGluZyhzb3VyY2VCaW5kaW5nKTsNCisgICAgICAgICAgICBzZXRUYXJnZXRCaW5kaW5nKHRhcmdldEJpbmRpbmcpOw0KKyAgICAgICAgICAgIGhhbmRsZXIgPSBuZXcgQ2xvc3VyZSh0cmlnZ2VyQmVhbikgew0KKyAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGNhbGwoT2JqZWN0W10gcGFyYW1zKSB7DQorICAgICAgICAgICAgICAgICAgICB1cGRhdGUoKTsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyB2b2lkIGJpbmQoKSB7DQorICAgICAgICAgICAgSW52b2tlckhlbHBlci5zZXRQcm9wZXJ0eSh0cmlnZ2VyQmVhbiwgZXZlbnROYW1lLCBoYW5kbGVyKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyB2b2lkIHVuYmluZCgpIHsNCisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyB2b2lkIHJlYmluZCgpIHsNCisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsNCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9iaW5kaW5nL0Z1bGxCaW5kaW5nLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9iaW5kaW5nL0Z1bGxCaW5kaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQyMTQ1ZgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2JpbmRpbmcvRnVsbEJpbmRpbmcuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKg0KKyAqIENvcHlyaWdodCAyMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4NCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYmluZGluZzsNCisNCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuQ2xvc3VyZTsNCisNCisvKioNCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzaGVtbm9uQHlhaG9vLmNvbSI+RGFubm8gRmVycmluPC9hPg0KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQNCisgKiBAc2luY2UgR3Jvb3Z5IDEuMQ0KKyAqLw0KK3B1YmxpYyBpbnRlcmZhY2UgRnVsbEJpbmRpbmcgZXh0ZW5kcyBCaW5kaW5nVXBkYXRhYmxlIHsNCisNCisgICAgU291cmNlQmluZGluZyBnZXRTb3VyY2VCaW5kaW5nKCk7DQorDQorICAgIFRhcmdldEJpbmRpbmcgZ2V0VGFyZ2V0QmluZGluZygpOw0KKw0KKyAgICB2b2lkIHNldFNvdXJjZUJpbmRpbmcoU291cmNlQmluZGluZyBzb3VyY2UpOw0KKw0KKyAgICB2b2lkIHNldFRhcmdldEJpbmRpbmcoVGFyZ2V0QmluZGluZyB0YXJnZXQpOw0KKw0KKyAgICB2b2lkIHNldFZhbGlkYXRvcihDbG9zdXJlIHZhbGlkYXRvcik7DQorDQorICAgIENsb3N1cmUgZ2V0VmFsaWRhdG9yKCk7DQorDQorICAgIHZvaWQgc2V0Q29udmVydGVyKENsb3N1cmUgY29udmVydGVyKTsNCisNCisgICAgQ2xvc3VyZSBnZXRDb252ZXJ0ZXIoKTsNCisNCisgICAgdm9pZCBzZXRSZXZlcnNlQ29udmVydGVyKENsb3N1cmUgcmV2ZXJzZUNvbnZlcnRlcik7DQorDQorICAgIENsb3N1cmUgZ2V0UmV2ZXJzZUNvbnZlcnRlcigpOw0KK30NCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9iaW5kaW5nL01vZGVsQmluZGluZy5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYmluZGluZy9Nb2RlbEJpbmRpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzRhMWU2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYmluZGluZy9Nb2RlbEJpbmRpbmcuamF2YQpAQCAtMCwwICsxLDE1NSBAQAorLyoNCisgKiBDb3B5cmlnaHQgMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmJpbmRpbmc7DQorDQoraW1wb3J0IGdyb292eS5sYW5nLkdyb292eU9iamVjdFN1cHBvcnQ7DQoraW1wb3J0IGdyb292eS5sYW5nLlJlYWRPbmx5UHJvcGVydHlFeGNlcHRpb247DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTWFwOw0KKw0KKy8qKg0KKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnNoZW1ub25AeWFob28uY29tIj5EYW5ubyBGZXJyaW48L2E+DQorICogQHZlcnNpb24gJFJldmlzaW9uJA0KKyAqIEBzaW5jZSBHcm9vdnkgMS4xDQorICovDQorcHVibGljIGNsYXNzIE1vZGVsQmluZGluZyBleHRlbmRzIEdyb292eU9iamVjdFN1cHBvcnQgaW1wbGVtZW50cyBCaW5kaW5nVXBkYXRhYmxlIHsNCisNCisgICAgT2JqZWN0IG1vZGVsOw0KKyAgICBib29sZWFuIGJvdW5kOw0KKw0KKyAgICBmaW5hbCBNYXAvKjxTdHJpbmcsIFByb3BlcnR5QmluZGluZz4qLyBwcm9wZXJ0eUJpbmRpbmdzID0gbmV3IEhhc2hNYXAvKjxTdHJpbmcsIFByb3BlcnR5QmluZGluZz4qLygpOw0KKyAgICBmaW5hbCBMaXN0Lyo8RnVsbEJpbmRpbmc+Ki8gZ2VuZXJhdGVkQmluZGluZ3MgPSBuZXcgQXJyYXlMaXN0Lyo8RnVsbEJpbmRpbmc+Ki8oKTsNCisNCisgICAgcHVibGljIE1vZGVsQmluZGluZyhPYmplY3QgbW9kZWwpIHsNCisgICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgT2JqZWN0IGdldE1vZGVsKCkgew0KKyAgICAgICAgcmV0dXJuIG1vZGVsOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRNb2RlbChPYmplY3QgbW9kZWwpIHsNCisgICAgICAgIC8vIHNob3VsZCB3ZSB1c2UgYSBmaW5lciBncmFpbmVkIGxvY2sgdGhhbiB0aGlzPw0KKw0KKyAgICAgICAgdGhpcy5tb2RlbCA9IG1vZGVsOw0KKyAgICAgICAgLy9UT0RPIHNlZSBpZiBib3VuZCwgbWFyayBpZiBzbw0KKyAgICAgICAgdW5iaW5kKCk7DQorICAgICAgICBJdGVyYXRvciBpdGVyID0gcHJvcGVydHlCaW5kaW5ncy52YWx1ZXMoKS5pdGVyYXRvcigpOw0KKyAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7DQorICAgICAgICAgICAgKChQcm9wZXJ0eUJpbmRpbmcpaXRlci5uZXh0KCkpLnNldEJlYW4obW9kZWwpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcmViaW5kKCk7DQorICAgICAgICB1cGRhdGUoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSkgew0KKyAgICAgICAgUHJvcGVydHlCaW5kaW5nIHBiOw0KKyAgICAgICAgc3luY2hyb25pemVkIChwcm9wZXJ0eUJpbmRpbmdzKSB7DQorICAgICAgICAgICAgLy8gc2hvdWxkIHdlIHZlcmlmeSB0aGUgcHJvcGVydHkgaXMgdmFsaWQ/DQorICAgICAgICAgICAgT2JqZWN0IG8gPSBwcm9wZXJ0eUJpbmRpbmdzLmdldChwcm9wZXJ0eSk7DQorICAgICAgICAgICAgaWYgKG8gPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICBvID0gbmV3IE1vZGVsQmluZGluZ1Byb3BlcnR5QmluZGluZyhtb2RlbCwgcHJvcGVydHkpOw0KKyAgICAgICAgICAgICAgICBwcm9wZXJ0eUJpbmRpbmdzLnB1dChwcm9wZXJ0eSwgbyk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHBiID0gKFByb3BlcnR5QmluZGluZylvOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRnVsbEJpbmRpbmcgZmIgPSBwYi5jcmVhdGVCaW5kaW5nKHBiLCBudWxsKTsNCisgICAgICAgIGlmIChib3VuZCkgew0KKyAgICAgICAgICAgIGZiLmJpbmQoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBmYjsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHksIE9iamVjdCB2YWx1ZSkgew0KKyAgICAgICAgdGhyb3cgbmV3IFJlYWRPbmx5UHJvcGVydHlFeGNlcHRpb24ocHJvcGVydHksIG1vZGVsLmdldENsYXNzKCkpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIGJpbmQoKSB7DQorICAgICAgICBzeW5jaHJvbml6ZWQgKGdlbmVyYXRlZEJpbmRpbmdzKSB7DQorICAgICAgICAgICAgaWYgKCFib3VuZCkgew0KKyAgICAgICAgICAgICAgICBib3VuZCA9IHRydWU7DQorICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBnZW5lcmF0ZWRCaW5kaW5ncy5pdGVyYXRvcigpOw0KKyAgICAgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsNCisgICAgICAgICAgICAgICAgICAgICgoRnVsbEJpbmRpbmcpaXRlci5uZXh0KCkpLmJpbmQoKTsNCisgICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZCB3ZSB0cmFwIGV4Y2VwdGlvbnMgYW5kIGRvIGFuIGVhY2g/DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgdW5iaW5kKCkgew0KKyAgICAgICAgc3luY2hyb25pemVkIChnZW5lcmF0ZWRCaW5kaW5ncykgew0KKyAgICAgICAgICAgIGlmIChib3VuZCkgew0KKyAgICAgICAgICAgICAgICBib3VuZCA9IGZhbHNlOw0KKyAgICAgICAgICAgICAgICBJdGVyYXRvciBpdGVyID0gZ2VuZXJhdGVkQmluZGluZ3MuaXRlcmF0b3IoKTsNCisgICAgICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7DQorICAgICAgICAgICAgICAgICAgICAoKEZ1bGxCaW5kaW5nKWl0ZXIubmV4dCgpKS51bmJpbmQoKTsNCisgICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZCB3ZSB0cmFwIGV4Y2VwdGlvbnMgYW5kIGRvIGFuIGVhY2g/DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgcmViaW5kKCkgew0KKyAgICAgICAgc3luY2hyb25pemVkIChnZW5lcmF0ZWRCaW5kaW5ncykgew0KKyAgICAgICAgICAgIGlmIChib3VuZCkgew0KKyAgICAgICAgICAgICAgICBJdGVyYXRvciBpdGVyID0gZ2VuZXJhdGVkQmluZGluZ3MuaXRlcmF0b3IoKTsNCisgICAgICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7DQorICAgICAgICAgICAgICAgICAgICAoKEZ1bGxCaW5kaW5nKWl0ZXIubmV4dCgpKS5yZWJpbmQoKTsNCisgICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZCB3ZSB0cmFwIGV4Y2VwdGlvbnMgYW5kIGRvIGFuIGVhY2g/DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgdXBkYXRlKCkgew0KKyAgICAgICAgc3luY2hyb25pemVkIChnZW5lcmF0ZWRCaW5kaW5ncykgew0KKyAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBnZW5lcmF0ZWRCaW5kaW5ncy5pdGVyYXRvcigpOw0KKyAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgew0KKyAgICAgICAgICAgICAgICAoKEZ1bGxCaW5kaW5nKWl0ZXIubmV4dCgpKS51cGRhdGUoKTsNCisgICAgICAgICAgICAgICAgLy8gc2hvdWxkIHdlIHRyYXAgZXhjZXB0aW9ucyBhbmQgZG8gYW4gZWFjaD8NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgcmV2ZXJzZVVwZGF0ZSgpIHsNCisgICAgICAgIHN5bmNocm9uaXplZCAoZ2VuZXJhdGVkQmluZGluZ3MpIHsNCisgICAgICAgICAgICBJdGVyYXRvciBpdGVyID0gZ2VuZXJhdGVkQmluZGluZ3MuaXRlcmF0b3IoKTsNCisgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsNCisgICAgICAgICAgICAgICAgKChGdWxsQmluZGluZylpdGVyLm5leHQoKSkucmV2ZXJzZVVwZGF0ZSgpOw0KKyAgICAgICAgICAgICAgICAvLyBzaG91bGQgd2UgdHJhcCBleGNlcHRpb25zIGFuZCBkbyBhbiBlYWNoPw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBjbGFzcyBNb2RlbEJpbmRpbmdQcm9wZXJ0eUJpbmRpbmcgZXh0ZW5kcyBQcm9wZXJ0eUJpbmRpbmcgew0KKyAgICAgICAgcHVibGljIE1vZGVsQmluZGluZ1Byb3BlcnR5QmluZGluZyhPYmplY3QgYmVhbiwgU3RyaW5nIHByb3BlcnR5TmFtZSkgew0KKyAgICAgICAgICAgIHN1cGVyKGJlYW4sIHByb3BlcnR5TmFtZSk7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgRnVsbEJpbmRpbmcgY3JlYXRlQmluZGluZyhTb3VyY2VCaW5kaW5nIHNvdXJjZSwgVGFyZ2V0QmluZGluZyB0YXJnZXQpIHsNCisgICAgICAgICAgICBGdWxsQmluZGluZyBmYiA9IHN1cGVyLmNyZWF0ZUJpbmRpbmcoc291cmNlLCB0YXJnZXQpOw0KKyAgICAgICAgICAgIGdlbmVyYXRlZEJpbmRpbmdzLmFkZChmYik7DQorICAgICAgICAgICAgcmV0dXJuIGZiOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorfQ0KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2JpbmRpbmcvUHJvcGVydHlCaW5kaW5nLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9iaW5kaW5nL1Byb3BlcnR5QmluZGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyMDIwZjQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9iaW5kaW5nL1Byb3BlcnR5QmluZGluZy5qYXZhCkBAIC0wLDAgKzEsMTM3IEBACisvKg0KKyAqIENvcHlyaWdodCAyMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4NCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYmluZGluZzsNCisNCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuTWlzc2luZ01ldGhvZEV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLkludm9rZXJIZWxwZXI7DQorDQoraW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VFdmVudDsNCitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOw0KKw0KKw0KKy8qKg0KKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnNoZW1ub25AeWFob28uY29tIj5EYW5ubyBGZXJyaW48L2E+DQorICogQHZlcnNpb24gJFJldmlzaW9uJA0KKyAqIEBzaW5jZSBHcm9vdnkgMS4xDQorICovDQorcHVibGljIGNsYXNzIFByb3BlcnR5QmluZGluZyBpbXBsZW1lbnRzIFNvdXJjZUJpbmRpbmcsIFRhcmdldEJpbmRpbmcsIFRyaWdnZXJCaW5kaW5nIHsNCisNCisgICAgT2JqZWN0IGJlYW47DQorICAgIFN0cmluZyBwcm9wZXJ0eU5hbWU7DQorDQorICAgIHB1YmxpYyBQcm9wZXJ0eUJpbmRpbmcoT2JqZWN0IGJlYW4sIFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsNCisgICAgICAgIHRoaXMuYmVhbiA9IGJlYW47DQorICAgICAgICB0aGlzLnByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVUYXJnZXRWYWx1ZShPYmplY3QgbmV3VmFsdWUpIHsNCisgICAgICAgIEludm9rZXJIZWxwZXIuc2V0UHJvcGVydHkoYmVhbiwgcHJvcGVydHlOYW1lLCBuZXdWYWx1ZSk7DQorICAgIH0NCisNCisgICAgcHVibGljIE9iamVjdCBnZXRTb3VyY2VWYWx1ZSgpIHsNCisgICAgICAgIHJldHVybiBJbnZva2VySGVscGVyLmdldFByb3BlcnR5U2FmZShiZWFuLCBwcm9wZXJ0eU5hbWUpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBGdWxsQmluZGluZyBjcmVhdGVCaW5kaW5nKFNvdXJjZUJpbmRpbmcgc291cmNlLCBUYXJnZXRCaW5kaW5nIHRhcmdldCkgew0KKyAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eUZ1bGxCaW5kaW5nDQorICAgICAgICAgICAgICAgIChzb3VyY2UsIHRhcmdldCk7DQorICAgIH0NCisNCisgICAgY2xhc3MgUHJvcGVydHlGdWxsQmluZGluZyBleHRlbmRzIEFic3RyYWN0RnVsbEJpbmRpbmcgaW1wbGVtZW50cyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHsNCisNCisgICAgICAgIE9iamVjdCBib3VuZEJlYW47DQorICAgICAgICBPYmplY3QgYm91bmRQcm9wZXJ0eTsNCisgICAgICAgIGJvb2xlYW4gYm91bmQ7DQorICAgICAgICBib29sZWFuIGJvdW5kVG9Qcm9wZXJ0eTsNCisNCisgICAgICAgIFByb3BlcnR5RnVsbEJpbmRpbmcoU291cmNlQmluZGluZyBzb3VyY2UsIFRhcmdldEJpbmRpbmcgdGFyZ2V0KSB7DQorICAgICAgICAgICAgc2V0U291cmNlQmluZGluZyhzb3VyY2UpOw0KKyAgICAgICAgICAgIHNldFRhcmdldEJpbmRpbmcodGFyZ2V0KTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsNCisgICAgICAgICAgICBpZiAoYm91bmRUb1Byb3BlcnR5IHx8IGV2ZW50LmdldFByb3BlcnR5TmFtZSgpLmVxdWFscyhib3VuZFByb3BlcnR5KSkgew0KKyAgICAgICAgICAgICAgICB1cGRhdGUoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgdm9pZCBiaW5kKCkgew0KKyAgICAgICAgICAgIGlmICghYm91bmQpIHsNCisgICAgICAgICAgICAgICAgYm91bmQgPSB0cnVlOw0KKyAgICAgICAgICAgICAgICBib3VuZEJlYW4gPSBiZWFuOw0KKyAgICAgICAgICAgICAgICBib3VuZFByb3BlcnR5ID0gcHJvcGVydHlOYW1lOw0KKyAgICAgICAgICAgICAgICB0cnkgew0KKyAgICAgICAgICAgICAgICAgICAgSW52b2tlckhlbHBlci5pbnZva2VNZXRob2RTYWZlKGJvdW5kQmVhbiwgImFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIiLCBuZXcgT2JqZWN0W10ge2JvdW5kUHJvcGVydHksIHRoaXN9KTsNCisgICAgICAgICAgICAgICAgICAgIGJvdW5kVG9Qcm9wZXJ0eSA9IHRydWU7DQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE1pc3NpbmdNZXRob2RFeGNlcHRpb24gbW1lKSB7DQorICAgICAgICAgICAgICAgICAgICB0cnkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kVG9Qcm9wZXJ0eSA9IGZhbHNlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIEludm9rZXJIZWxwZXIuaW52b2tlTWV0aG9kU2FmZShib3VuZEJlYW4sICJhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIiwgbmV3IE9iamVjdFtdIHt0aGlzfSk7DQorICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChNaXNzaW5nTWV0aG9kRXhjZXB0aW9uIG1tZTIpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiUHJvcGVydGllcyBpbiBiZWFucyBvZiB0eXBlICIgKyBiZWFuLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBhcmUgbm90IG9ic2VydmFibGUgaW4gYW55IGNhcGFjaXR5IChubyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHN1cHBvcnQpLiIpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZvaWQgdW5iaW5kKCkgew0KKyAgICAgICAgICAgIGlmIChib3VuZCkgew0KKyAgICAgICAgICAgICAgICBpZiAoYm91bmRUb1Byb3BlcnR5KSB7DQorICAgICAgICAgICAgICAgICAgICB0cnkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIEludm9rZXJIZWxwZXIuaW52b2tlTWV0aG9kU2FmZShib3VuZEJlYW4sICJyZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIiwgbmV3IE9iamVjdFtdIHtib3VuZFByb3BlcnR5LCB0aGlzfSk7DQorICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChNaXNzaW5nTWV0aG9kRXhjZXB0aW9uIG1tZSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSwgdG9vIGJhZCBzbyBzYWQgdGhleSBkb24ndCBmb2xsb3cgY29udmVudGlvbnMsIHdlJ2xsIGp1c3QgbGVhdmUgdGhlIGxpc3RlbmVyIGF0dGFjaGVkDQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICB0cnkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIEludm9rZXJIZWxwZXIuaW52b2tlTWV0aG9kU2FmZShib3VuZEJlYW4sICJyZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIiwgbmV3IE9iamVjdFtdIHt0aGlzfSk7DQorICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChNaXNzaW5nTWV0aG9kRXhjZXB0aW9uIG1tZTIpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUsIHRvbyBiYWQgc28gc2FkIHRoZXkgZG9uJ3QgZm9sbG93IGNvbnZlbnRpb25zLCB3ZSdsbCBqdXN0IGxlYXZlIHRoZSBsaXN0ZW5lciBhdHRhY2hlZA0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJvdW5kQmVhbiA9IG51bGw7DQorICAgICAgICAgICAgICAgIGJvdW5kUHJvcGVydHkgPSBudWxsOw0KKyAgICAgICAgICAgICAgICBib3VuZCA9IGZhbHNlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyB2b2lkIHJlYmluZCgpIHsNCisgICAgICAgICAgICBpZiAoYm91bmQpIHsNCisgICAgICAgICAgICAgICAgdW5iaW5kKCk7DQorICAgICAgICAgICAgICAgIGJpbmQoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgIH0NCisNCisgICAgcHVibGljIE9iamVjdCBnZXRCZWFuKCkgew0KKyAgICAgICAgcmV0dXJuIGJlYW47DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgc2V0QmVhbihPYmplY3QgYmVhbikgew0KKyAgICAgICAgdGhpcy5iZWFuID0gYmVhbjsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5TmFtZSgpIHsNCisgICAgICAgIHJldHVybiBwcm9wZXJ0eU5hbWU7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlOYW1lKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsNCisgICAgICAgIHRoaXMucHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lOw0KKyAgICB9DQorDQorDQorfQ0KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2JpbmRpbmcvU291cmNlQmluZGluZy5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYmluZGluZy9Tb3VyY2VCaW5kaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAyNGM0MwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2JpbmRpbmcvU291cmNlQmluZGluZy5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qDQorICogQ29weXJpZ2h0IDIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLg0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5iaW5kaW5nOw0KKw0KKy8qKg0KKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnNoZW1ub25AeWFob28uY29tIj5EYW5ubyBGZXJyaW48L2E+DQorICogQHZlcnNpb24gJFJldmlzaW9uJA0KKyAqIEBzaW5jZSBHcm9vdnkgMS4xDQorICovDQorcHVibGljIGludGVyZmFjZSBTb3VyY2VCaW5kaW5nIHsNCisNCisgICAgT2JqZWN0IGdldFNvdXJjZVZhbHVlKCk7DQorDQorfQ0KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2JpbmRpbmcvU3dpbmdUaW1lclRyaWdnZXJCaW5kaW5nLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9iaW5kaW5nL1N3aW5nVGltZXJUcmlnZ2VyQmluZGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNzVkMTcKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9iaW5kaW5nL1N3aW5nVGltZXJUcmlnZ2VyQmluZGluZy5qYXZhCkBAIC0wLDAgKzEsMTgzIEBACisvKg0KKyAqIENvcHlyaWdodCAyMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4NCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYmluZGluZzsNCisNCitpbXBvcnQgamF2YXguc3dpbmcuVGltZXI7DQoraW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOw0KK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsNCisNCisvKioNCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzaGVtbm9uQHlhaG9vLmNvbSI+RGFubm8gRmVycmluPC9hPg0KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbjogNzc5NyAkDQorICogQHNpbmNlIEdyb292eSAxLjENCisgKi8NCitwdWJsaWMgY2xhc3MgU3dpbmdUaW1lclRyaWdnZXJCaW5kaW5nIGltcGxlbWVudHMgVHJpZ2dlckJpbmRpbmcgew0KKyAgICBwdWJsaWMgRnVsbEJpbmRpbmcgY3JlYXRlQmluZGluZyhTb3VyY2VCaW5kaW5nIHNvdXJjZSwgVGFyZ2V0QmluZGluZyB0YXJnZXQpIHsNCisgICAgICAgIHJldHVybiBuZXcgU3dpbmdUaW1lckZ1bGxCaW5kaW5nKChDbG9zdXJlU291cmNlQmluZGluZykgc291cmNlLCB0YXJnZXQpOw0KKyAgICB9DQorfQ0KKw0KKy8qKg0KKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnNoZW1ub25AeWFob28uY29tIj5EYW5ubyBGZXJyaW48L2E+DQorICogQHZlcnNpb24gJFJldmlzaW9uOiA3Nzk3ICQNCisgKiBAc2luY2UgR3Jvb3Z5IDEuMQ0KKyAqLw0KK2NsYXNzIFN3aW5nVGltZXJGdWxsQmluZGluZyBleHRlbmRzIEFic3RyYWN0RnVsbEJpbmRpbmcgaW1wbGVtZW50cyBBY3Rpb25MaXN0ZW5lciB7DQorICAgIFRpbWVyIHRpbWVyOw0KKyAgICBsb25nIHN0YXJ0VGltZTsNCisgICAgbG9uZyBkdXJhdGlvbjsNCisgICAgaW50IHN0ZXBTaXplOw0KKw0KKyAgICBib29sZWFuIHJlcG9ydFN0ZXBzOw0KKyAgICBib29sZWFuIHJlcG9ydEZyYWN0aW9uOw0KKyAgICBib29sZWFuIHJlcG9ydEVsYXBzZWQ7DQorICAgIGJvb2xlYW4gcmVwZWF0Ow0KKyAgICBib29sZWFuIGJvdW5kOw0KKw0KKyAgICBTd2luZ1RpbWVyRnVsbEJpbmRpbmcoQ2xvc3VyZVNvdXJjZUJpbmRpbmcgc291cmNlLCBUYXJnZXRCaW5kaW5nIHRhcmdldCkgew0KKyAgICAgICAgdGhpcyhzb3VyY2UsIHRhcmdldCwgNTAsIDEwMDApOw0KKyAgICB9DQorDQorICAgIFN3aW5nVGltZXJGdWxsQmluZGluZyhTb3VyY2VCaW5kaW5nIHNvdXJjZSwgVGFyZ2V0QmluZGluZyB0YXJnZXQsIGludCBpbnRlcnZhbCwgaW50IGR1cmF0aW9uKSB7DQorICAgICAgICBzZXRTb3VyY2VCaW5kaW5nKHNvdXJjZSk7DQorICAgICAgICBzZXRUYXJnZXRCaW5kaW5nKHRhcmdldCk7DQorICAgICAgICB0aW1lciA9IG5ldyBUaW1lcihpbnRlcnZhbCwgdGhpcyk7DQorICAgICAgICB0aW1lci5zZXRJbml0aWFsRGVsYXkoMCk7DQorICAgICAgICB0aW1lci5zZXRSZXBlYXRzKHRydWUpOw0KKyAgICAgICAgdGhpcy5kdXJhdGlvbiA9IGR1cmF0aW9uOw0KKyAgICB9DQorDQorICAgIHZvaWQgcmVzZXRUaW1lcigpIHsNCisgICAgICAgIHRpbWVyLnN0b3AoKTsNCisgICAgICAgIHN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOw0KKyAgICAgICAgdGltZXIuc3RhcnQoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBiaW5kKCkgew0KKyAgICAgICAgaWYgKCFib3VuZCkgew0KKyAgICAgICAgICAgIHJlc2V0VGltZXIoKTsNCisgICAgICAgICAgICBib3VuZCA9IHRydWU7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgdW5iaW5kKCkgew0KKyAgICAgICAgaWYgKGJvdW5kKSB7DQorICAgICAgICAgICAgdGltZXIuc3RvcCgpOw0KKyAgICAgICAgICAgIGJvdW5kID0gZmFsc2U7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgcmViaW5kKCkgew0KKyAgICAgICAgaWYgKGJvdW5kKSB7DQorICAgICAgICAgICAgcmVzZXRUaW1lcigpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7DQorICAgICAgICBsb25nIGN1cnJlbnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7DQorICAgICAgICBsb25nIGVsYXBzZWQgPSBjdXJyZW50VGltZSAtIHN0YXJ0VGltZTsNCisgICAgICAgIGlmIChlbGFwc2VkID49IGR1cmF0aW9uKSB7DQorICAgICAgICAgICAgaWYgKHJlcGVhdCkgew0KKyAgICAgICAgICAgICAgICBzdGFydFRpbWUgPSBjdXJyZW50VGltZTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICB0aW1lci5zdG9wKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIC8vIG5vIG92ZXItcnVucy4uLg0KKyAgICAgICAgICAgIGVsYXBzZWQgPSBkdXJhdGlvbjsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vIGNhbGN1bGF0ZQ0KKyAgICAgICAgaWYgKHJlcG9ydFN0ZXBzKSB7DQorICAgICAgICAgICAgKChDbG9zdXJlU291cmNlQmluZGluZylzb3VyY2VCaW5kaW5nKS5zZXRDbG9zdXJlQXJndW1lbnQoDQorICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZWdlcigoaW50KSAoZWxhcHNlZCAvIHN0ZXBTaXplKSkpOw0KKyAgICAgICAgICAgICAgLy9pbiBHcm9vdnkyLjAgdXNlIHZhbHVlT2YNCisgICAgICAgIH0gZWxzZSBpZiAocmVwb3J0RnJhY3Rpb24pIHsNCisgICAgICAgICAgICAoKENsb3N1cmVTb3VyY2VCaW5kaW5nKXNvdXJjZUJpbmRpbmcpLnNldENsb3N1cmVBcmd1bWVudCgNCisgICAgICAgICAgICAgICAgICAgIG5ldyBGbG9hdCgoZmxvYXQpIGVsYXBzZWQgLyAoZmxvYXQpIGR1cmF0aW9uKSk7DQorICAgICAgICAgICAgLy9pbiBHcm9vdnkyLjAgdXNlIHZhbHVlT2YNCisgICAgICAgIH0gZWxzZSBpZiAocmVwb3J0RWxhcHNlZCkgew0KKyAgICAgICAgICAgICgoQ2xvc3VyZVNvdXJjZUJpbmRpbmcpc291cmNlQmluZGluZykuc2V0Q2xvc3VyZUFyZ3VtZW50KA0KKyAgICAgICAgICAgICAgICAgICAgbmV3IExvbmcoZWxhcHNlZCkpOw0KKyAgICAgICAgICAgIC8vaW4gR3Jvb3Z5Mi4wIHVzZSB2YWx1ZU9mDQorICAgICAgICB9IA0KKw0KKyAgICAgICAgdXBkYXRlKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGxvbmcgZ2V0RHVyYXRpb24oKSB7DQorICAgICAgICByZXR1cm4gZHVyYXRpb247DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgc2V0RHVyYXRpb24obG9uZyBkdXJhdGlvbikgew0KKyAgICAgICAgdGhpcy5kdXJhdGlvbiA9IGR1cmF0aW9uOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBpbnQgZ2V0SW50ZXJ2YWwoKSB7DQorICAgICAgICByZXR1cm4gdGltZXIuZ2V0RGVsYXkoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXRJbnRlcnZhbChpbnQgaW50ZXJ2YWwpIHsNCisgICAgICAgIHRpbWVyLnNldERlbGF5KGludGVydmFsKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgaW50IGdldFN0ZXBTaXplKCkgew0KKyAgICAgICAgcmV0dXJuIHN0ZXBTaXplOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldFN0ZXBTaXplKGludCBzdGVwU2l6ZSkgew0KKyAgICAgICAgdGhpcy5zdGVwU2l6ZSA9IHN0ZXBTaXplOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGlzQ29hbGVzY2UoKSB7DQorICAgICAgICByZXR1cm4gdGltZXIuaXNDb2FsZXNjZSgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldENvYWxlc2NlKGJvb2xlYW4gY29hbGVzY2UpIHsNCisgICAgICAgIHRpbWVyLnNldENvYWxlc2NlKGNvYWxlc2NlKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcG9ydFN0ZXBzKCkgew0KKyAgICAgICAgcmV0dXJuIHJlcG9ydFN0ZXBzOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldFJlcG9ydFN0ZXBzKGJvb2xlYW4gcmVwb3J0U3RlcHMpIHsNCisgICAgICAgIHRoaXMucmVwb3J0U3RlcHMgPSByZXBvcnRTdGVwczsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcG9ydEZyYWN0aW9uKCkgew0KKyAgICAgICAgcmV0dXJuIHJlcG9ydEZyYWN0aW9uOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldFJlcG9ydEZyYWN0aW9uKGJvb2xlYW4gcmVwb3J0RnJhY3Rpb24pIHsNCisgICAgICAgIHRoaXMucmVwb3J0RnJhY3Rpb24gPSByZXBvcnRGcmFjdGlvbjsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcG9ydEVsYXBzZWQoKSB7DQorICAgICAgICByZXR1cm4gcmVwb3J0RWxhcHNlZDsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXBvcnRFbGFwc2VkKGJvb2xlYW4gcmVwb3J0RWxhcHNlZCkgew0KKyAgICAgICAgdGhpcy5yZXBvcnRFbGFwc2VkID0gcmVwb3J0RWxhcHNlZDsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcGVhdCgpIHsNCisgICAgICAgIHJldHVybiByZXBlYXQ7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgc2V0UmVwZWF0KGJvb2xlYW4gcmVwZWF0KSB7DQorICAgICAgICB0aGlzLnJlcGVhdCA9IHJlcGVhdDsNCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9iaW5kaW5nL1RhcmdldEJpbmRpbmcuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2JpbmRpbmcvVGFyZ2V0QmluZGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhYmVhNWMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9iaW5kaW5nL1RhcmdldEJpbmRpbmcuamF2YQpAQCAtMCwwICsxLDI2IEBACisvKg0KKyAqIENvcHlyaWdodCAyMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4NCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYmluZGluZzsNCisNCisvKioNCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpzaGVtbm9uQHlhaG9vLmNvbSI+RGFubm8gRmVycmluPC9hPg0KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQNCisgKiBAc2luY2UgR3Jvb3Z5IDEuMQ0KKyAqLw0KK3B1YmxpYyBpbnRlcmZhY2UgVGFyZ2V0QmluZGluZyB7DQorICAgIHZvaWQgdXBkYXRlVGFyZ2V0VmFsdWUoT2JqZWN0IHZhbHVlKTsNCisNCit9DQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYmluZGluZy9UcmlnZ2VyQmluZGluZy5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYmluZGluZy9UcmlnZ2VyQmluZGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYWQ1ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9iaW5kaW5nL1RyaWdnZXJCaW5kaW5nLmphdmEKQEAgLTAsMCArMSwyNyBAQAorLyoNCisgKiBDb3B5cmlnaHQgMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmJpbmRpbmc7DQorDQorLyoqDQorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86c2hlbW5vbkB5YWhvby5jb20iPkRhbm5vIEZlcnJpbjwvYT4NCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kDQorICogQHNpbmNlIEdyb292eSAxLjENCisgKi8NCitwdWJsaWMgaW50ZXJmYWNlIFRyaWdnZXJCaW5kaW5nIHsNCisNCisgICAgRnVsbEJpbmRpbmcgY3JlYXRlQmluZGluZyhTb3VyY2VCaW5kaW5nIHNvdXJjZSwgVGFyZ2V0QmluZGluZyB0YXJnZXQpOw0KKw0KK30NCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9iaW5kaW5nL3BhY2thZ2UuaHRtbCBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2JpbmRpbmcvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MTQ1ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9iaW5kaW5nL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDggQEAKKzxodG1sPgorICA8aGVhZD4KKyAgICA8dGl0bGU+cGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmJpbmRpbmcuKjwvdGl0bGU+CisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgPHA+Q2xhc3NlcyByZWxhdGVkIHRvIHByb3BlcnR5IGJpbmRpbmcuPC9wPgorICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ic2YvQ2FjaGluZ0dyb292eUVuZ2luZS5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYnNmL0NhY2hpbmdHcm9vdnlFbmdpbmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDk2ZTcxCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYnNmL0NhY2hpbmdHcm9vdnlFbmdpbmUuamF2YQpAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYnNmOworCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuQmluZGluZzsKK2ltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlDbGFzc0xvYWRlcjsKK2ltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlTaGVsbDsKK2ltcG9ydCBncm9vdnkubGFuZy5TY3JpcHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5ic2YuQlNGRGVjbGFyZWRCZWFuOworaW1wb3J0IG9yZy5hcGFjaGUuYnNmLkJTRkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmJzZi5CU0ZNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuYnNmLnV0aWwuQlNGRnVuY3Rpb25zOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5Db21waWxlckNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLkludm9rZXJIZWxwZXI7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKKworLyoqCisgKiBBIENhY2hpbmcgaW1wbGVtZW50YXRpb24gb2YgdGhlIEdyb292eUVuZ2luZQorICoKKyAqIEBhdXRob3IgSmFtZXMgQmlyY2hmaWVsZAorICovCitwdWJsaWMgY2xhc3MgQ2FjaGluZ0dyb292eUVuZ2luZSBleHRlbmRzIEdyb292eUVuZ2luZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoQ2FjaGluZ0dyb292eUVuZ2luZS5jbGFzcy5nZXROYW1lKCkpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIEVNUFRZX0FSR1MgPSBuZXcgT2JqZWN0W117bmV3IFN0cmluZ1tde319OworCisgICAgcHJpdmF0ZSBNYXAgZXZhbFNjcmlwdHM7CisgICAgcHJpdmF0ZSBNYXAgZXhlY1NjcmlwdHM7CisgICAgcHJpdmF0ZSBCaW5kaW5nIGNvbnRleHQ7CisgICAgcHJpdmF0ZSBHcm9vdnlDbGFzc0xvYWRlciBsb2FkZXI7CisKKyAgICAvKioKKyAgICAgKiBFdmFsdWF0ZSBhbiBleHByZXNzaW9uLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZXZhbChTdHJpbmcgc291cmNlLCBpbnQgbGluZU5vLCBpbnQgY29sdW1uTm8sIE9iamVjdCBzY3JpcHQpIHRocm93cyBCU0ZFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2xhc3Mgc2NyaXB0Q2xhc3MgPSAoQ2xhc3MpIGV2YWxTY3JpcHRzLmdldChzY3JpcHQpOworICAgICAgICAgICAgaWYgKHNjcmlwdENsYXNzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzY3JpcHRDbGFzcyA9IGxvYWRlci5wYXJzZUNsYXNzKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzY3JpcHQudG9TdHJpbmcoKS5nZXRCeXRlcygpKSwgc291cmNlKTsKKyAgICAgICAgICAgICAgICBldmFsU2NyaXB0cy5wdXQoc2NyaXB0LCBzY3JpcHRDbGFzcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExPRy5maW5lKCJldmFsKCkgLSBVc2luZyBjYWNoZWQgc2NyaXB0Li4uIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL2Nhbid0IGNhY2hlIHRoZSBzY3JpcHQgYmVjYXVzZSB0aGUgY29udGV4dCBtYXkgYmUgZGlmZmVyZW50LgorICAgICAgICAgICAgLy9idXQgZG9uJ3QgYm90aGVyIGxvYWRpbmcgcGFyc2luZyB0aGUgY2xhc3MgYWdhaW4KKyAgICAgICAgICAgIFNjcmlwdCBzID0gSW52b2tlckhlbHBlci5jcmVhdGVTY3JpcHQoc2NyaXB0Q2xhc3MsIGNvbnRleHQpOworICAgICAgICAgICAgcmV0dXJuIHMucnVuKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQlNGRXhjZXB0aW9uKEJTRkV4Y2VwdGlvbi5SRUFTT05fRVhFQ1VUSU9OX0VSUk9SLCAiZXhjZXB0aW9uIGZyb20gR3Jvb3Z5OiAiICsgZSwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIGEgc2NyaXB0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWMoU3RyaW5nIHNvdXJjZSwgaW50IGxpbmVObywgaW50IGNvbHVtbk5vLCBPYmplY3Qgc2NyaXB0KSB0aHJvd3MgQlNGRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vICAgICAgICAgIHNoZWxsLnJ1bihzY3JpcHQudG9TdHJpbmcoKSwgc291cmNlLCBFTVBUWV9BUkdTKTsKKworICAgICAgICAgICAgQ2xhc3Mgc2NyaXB0Q2xhc3MgPSAoQ2xhc3MpIGV4ZWNTY3JpcHRzLmdldChzY3JpcHQpOworICAgICAgICAgICAgaWYgKHNjcmlwdENsYXNzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzY3JpcHRDbGFzcyA9IGxvYWRlci5wYXJzZUNsYXNzKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzY3JpcHQudG9TdHJpbmcoKS5nZXRCeXRlcygpKSwgc291cmNlKTsKKyAgICAgICAgICAgICAgICBleGVjU2NyaXB0cy5wdXQoc2NyaXB0LCBzY3JpcHRDbGFzcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExPRy5maW5lKCJleGVjKCkgLSBVc2luZyBjYWNoZWQgdmVyc2lvbiBvZiBjbGFzcy4uLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgSW52b2tlckhlbHBlci5pbnZva2VNZXRob2Qoc2NyaXB0Q2xhc3MsICJtYWluIiwgRU1QVFlfQVJHUyk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLldBUk5JTkcsICJCU0YgdHJhY2UiLCBlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCU0ZFeGNlcHRpb24oQlNGRXhjZXB0aW9uLlJFQVNPTl9FWEVDVVRJT05fRVJST1IsICJleGNlcHRpb24gZnJvbSBHcm9vdnk6ICIgKyBlLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgdGhlIGVuZ2luZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKGZpbmFsIEJTRk1hbmFnZXIgbWdyLCBTdHJpbmcgbGFuZywgVmVjdG9yIGRlY2xhcmVkQmVhbnMpIHRocm93cyBCU0ZFeGNlcHRpb24geworICAgICAgICBzdXBlci5pbml0aWFsaXplKG1nciwgbGFuZywgZGVjbGFyZWRCZWFucyk7CisgICAgICAgIENsYXNzTG9hZGVyIHBhcmVudCA9IG1nci5nZXRDbGFzc0xvYWRlcigpOworICAgICAgICBpZiAocGFyZW50ID09IG51bGwpCisgICAgICAgICAgICBwYXJlbnQgPSBHcm9vdnlTaGVsbC5jbGFzcy5nZXRDbGFzc0xvYWRlcigpOworICAgICAgICBmaW5hbCBDbGFzc0xvYWRlciBmaW5hbFBhcmVudCA9IHBhcmVudDsKKyAgICAgICAgdGhpcy5sb2FkZXIgPQorICAgICAgICAgICAgICAgIChHcm9vdnlDbGFzc0xvYWRlcikgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGlsZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBuZXcgQ29tcGlsZXJDb25maWd1cmF0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLnNldENsYXNzcGF0aChtZ3IuZ2V0Q2xhc3NQYXRoKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBHcm9vdnlDbGFzc0xvYWRlcihmaW5hbFBhcmVudCwgY29uZmlndXJhdGlvbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgZXhlY1NjcmlwdHMgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICBldmFsU2NyaXB0cyA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIGNvbnRleHQgPSBzaGVsbC5nZXRDb250ZXh0KCk7CisgICAgICAgIC8vIGNyZWF0ZSBhIHNoZWxsCisgICAgICAgIC8vIHJlZ2lzdGVyIHRoZSBtZ3Igd2l0aCBvYmplY3QgbmFtZSAiYnNmIgorICAgICAgICBjb250ZXh0LnNldFZhcmlhYmxlKCJic2YiLCBuZXcgQlNGRnVuY3Rpb25zKG1nciwgdGhpcykpOworICAgICAgICBpbnQgc2l6ZSA9IGRlY2xhcmVkQmVhbnMuc2l6ZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgZGVjbGFyZUJlYW4oKEJTRkRlY2xhcmVkQmVhbikgZGVjbGFyZWRCZWFucy5lbGVtZW50QXQoaSkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYnNmL0dyb292eUVuZ2luZS5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvYnNmL0dyb292eUVuZ2luZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmYTc2ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ic2YvR3Jvb3Z5RW5naW5lLmphdmEKQEAgLTAsMCArMSwxNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmJzZjsKKworaW1wb3J0IGdyb292eS5sYW5nLkNsb3N1cmU7CitpbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5U2hlbGw7CitpbXBvcnQgb3JnLmFwYWNoZS5ic2YuQlNGRGVjbGFyZWRCZWFuOworaW1wb3J0IG9yZy5hcGFjaGUuYnNmLkJTRkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmJzZi5CU0ZNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuYnNmLnV0aWwuQlNGRW5naW5lSW1wbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmJzZi51dGlsLkJTRkZ1bmN0aW9uczsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuSW52b2tlckhlbHBlcjsKKworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKKy8qKgorICogQSBCU0YgRW5naW5lIGZvciB0aGUgPGEgaHJlZj0iaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvIj5Hcm9vdnk8L2E+CisgKiBzY3JpcHRpbmcgbGFuZ3VhZ2UuCisgKiA8cC8+CisgKiBJdCdzIGRlcml2ZWQgZnJvbSB0aGUgSnl0aG9uIC8gSlB5dGhvbiBlbmdpbmUKKyAqCisgKiBAYXV0aG9yIEphbWVzIFN0cmFjaGFuCisgKi8KK3B1YmxpYyBjbGFzcyBHcm9vdnlFbmdpbmUgZXh0ZW5kcyBCU0ZFbmdpbmVJbXBsIHsKKyAgICBwcm90ZWN0ZWQgR3Jvb3Z5U2hlbGwgc2hlbGw7CisKKyAgICAvKgorICAgICAqIENvbnZlcnQgYSBub24gamF2YSBjbGFzcyBuYW1lIHRvIGEgamF2YSBjbGFzc25hbWUKKyAgICAgKiBUaGlzIGlzIHVzZWQgdG8gY29udmVydCBhIHNjcmlwdCBuYW1lIHRvIGEgbmFtZQorICAgICAqIHRoYXQgY2FuIGJlIHVzZWQgYXMgYSBjbGFzc25hbWUgd2l0aCB0aGUgc2NyaXB0IGlzCisgICAgICogbG9hZGVkIGluIEdyb292eUNsYXNzbG9hZGVyI2xvYWQoKQorICAgICAqIFRoZSBtZXRob2Qgc2ltcGx5IHJlcGxhY2VzIGFueSBpbnZhbGlkIGNoYXJhY3RlcnMKKyAgICAgKiB3aXRoICJfIi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjb252ZXJ0VG9WYWxpZEphdmFDbGFzc25hbWUoU3RyaW5nIGluTmFtZSkgeworICAgICAgICBpZiAoaW5OYW1lID09IG51bGwgfHwgaW5OYW1lLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgIHJldHVybiAiXyI7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nQnVmZmVyIG91dHB1dCA9IG5ldyBTdHJpbmdCdWZmZXIoaW5OYW1lLmxlbmd0aCgpKTsKKyAgICAgICAgYm9vbGVhbiBmaXJzdENoYXIgPSB0cnVlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluTmFtZS5sZW5ndGgoKTsgKytpKSB7CisgICAgICAgICAgICBjaGFyIGNoID0gaW5OYW1lLmNoYXJBdChpKTsKKyAgICAgICAgICAgIGlmIChmaXJzdENoYXIgJiYgIUNoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoY2gpKSB7CisgICAgICAgICAgICAgICAgY2ggPSAnXyc7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFmaXJzdENoYXIKKyAgICAgICAgICAgICAgICAgICAgJiYgIShDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoY2gpIHx8IGNoID09ICcuJykpIHsKKyAgICAgICAgICAgICAgICBjaCA9ICdfJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpcnN0Q2hhciA9IChjaCA9PSAnLicpOworICAgICAgICAgICAgb3V0cHV0LmFwcGVuZChjaCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG91dHB1dC50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFsbG93IGFuIGFub255bW91cyBmdW5jdGlvbiB0byBiZSBkZWNsYXJlZCBhbmQgaW52b2tlZAorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgYXBwbHkoU3RyaW5nIHNvdXJjZSwgaW50IGxpbmVObywgaW50IGNvbHVtbk5vLCBPYmplY3QgZnVuY0JvZHksIFZlY3RvciBwYXJhbU5hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yIGFyZ3VtZW50cykgdGhyb3dzIEJTRkV4Y2VwdGlvbiB7CisgICAgICAgIE9iamVjdCBvYmplY3QgPSBldmFsKHNvdXJjZSwgbGluZU5vLCBjb2x1bW5ObywgZnVuY0JvZHkpOworICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgQ2xvc3VyZSkgeworICAgICAgICAgICAgLy8gbGV0cyBjYWxsIHRoZSBmdW5jdGlvbgorICAgICAgICAgICAgQ2xvc3VyZSBjbG9zdXJlID0gKENsb3N1cmUpIG9iamVjdDsKKyAgICAgICAgICAgIHJldHVybiBjbG9zdXJlLmNhbGwoYXJndW1lbnRzLnRvQXJyYXkoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG9iamVjdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsIHRoZSBuYW1lZCBtZXRob2Qgb2YgdGhlIGdpdmVuIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGNhbGwoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1ldGhvZCwgT2JqZWN0W10gYXJncykgdGhyb3dzIEJTRkV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBJbnZva2VySGVscGVyLmludm9rZU1ldGhvZChvYmplY3QsIG1ldGhvZCwgYXJncyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXZhbHVhdGUgYW4gZXhwcmVzc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGV2YWwoU3RyaW5nIHNvdXJjZSwgaW50IGxpbmVObywgaW50IGNvbHVtbk5vLCBPYmplY3Qgc2NyaXB0KSB0aHJvd3MgQlNGRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNvdXJjZSA9IGNvbnZlcnRUb1ZhbGlkSmF2YUNsYXNzbmFtZShzb3VyY2UpOworICAgICAgICAgICAgcmV0dXJuIGdldEV2YWxTaGVsbCgpLmV2YWx1YXRlKHNjcmlwdC50b1N0cmluZygpLCBzb3VyY2UpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJTRkV4Y2VwdGlvbihCU0ZFeGNlcHRpb24uUkVBU09OX0VYRUNVVElPTl9FUlJPUiwgImV4Y2VwdGlvbiBmcm9tIEdyb292eTogIiArIGUsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZSBhIHNjcmlwdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjKFN0cmluZyBzb3VyY2UsIGludCBsaW5lTm8sIGludCBjb2x1bW5ObywgT2JqZWN0IHNjcmlwdCkgdGhyb3dzIEJTRkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyB1c2UgZXZhbHVhdGUgdG8gcGFzcyBpbiB0aGUgQlNGIHZhcmlhYmxlcworICAgICAgICAgICAgc291cmNlID0gY29udmVydFRvVmFsaWRKYXZhQ2xhc3NuYW1lKHNvdXJjZSk7CisgICAgICAgICAgICBnZXRFdmFsU2hlbGwoKS5ldmFsdWF0ZShzY3JpcHQudG9TdHJpbmcoKSwgc291cmNlKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCU0ZFeGNlcHRpb24oQlNGRXhjZXB0aW9uLlJFQVNPTl9FWEVDVVRJT05fRVJST1IsICJleGNlcHRpb24gZnJvbSBHcm9vdnk6ICIgKyBlLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgdGhlIGVuZ2luZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKEJTRk1hbmFnZXIgbWdyLCBTdHJpbmcgbGFuZywgVmVjdG9yIGRlY2xhcmVkQmVhbnMpIHRocm93cyBCU0ZFeGNlcHRpb24geworICAgICAgICBzdXBlci5pbml0aWFsaXplKG1nciwgbGFuZywgZGVjbGFyZWRCZWFucyk7CisKKyAgICAgICAgLy8gY3JlYXRlIGEgc2hlbGwKKyAgICAgICAgc2hlbGwgPSBuZXcgR3Jvb3Z5U2hlbGwobWdyLmdldENsYXNzTG9hZGVyKCkpOworCisgICAgICAgIC8vIHJlZ2lzdGVyIHRoZSBtZ3Igd2l0aCBvYmplY3QgbmFtZSAiYnNmIgorICAgICAgICBzaGVsbC5zZXRWYXJpYWJsZSgiYnNmIiwgbmV3IEJTRkZ1bmN0aW9ucyhtZ3IsIHRoaXMpKTsKKworICAgICAgICBpbnQgc2l6ZSA9IGRlY2xhcmVkQmVhbnMuc2l6ZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgZGVjbGFyZUJlYW4oKEJTRkRlY2xhcmVkQmVhbikgZGVjbGFyZWRCZWFucy5lbGVtZW50QXQoaSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVjbGFyZSBhIGJlYW4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkZWNsYXJlQmVhbihCU0ZEZWNsYXJlZEJlYW4gYmVhbikgdGhyb3dzIEJTRkV4Y2VwdGlvbiB7CisgICAgICAgIHNoZWxsLnNldFZhcmlhYmxlKGJlYW4ubmFtZSwgYmVhbi5iZWFuKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVbmRlY2xhcmUgYSBwcmV2aW91c2x5IGRlY2xhcmVkIGJlYW4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdW5kZWNsYXJlQmVhbihCU0ZEZWNsYXJlZEJlYW4gYmVhbikgdGhyb3dzIEJTRkV4Y2VwdGlvbiB7CisgICAgICAgIHNoZWxsLnNldFZhcmlhYmxlKGJlYW4ubmFtZSwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBhIG5ld2x5IGNyZWF0ZWQgR3Jvb3Z5U2hlbGwgdXNpbmcgdGhlIHNhbWUgdmFyaWFibGUgc2NvcGUgYnV0IGEgbmV3IGNsYXNzIGxvYWRlcgorICAgICAqLworICAgIHByb3RlY3RlZCBHcm9vdnlTaGVsbCBnZXRFdmFsU2hlbGwoKSB7CisgICAgICAgIHJldHVybiBuZXcgR3Jvb3Z5U2hlbGwoc2hlbGwpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2JzZi9wYWNrYWdlLmh0bWwgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ic2YvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlYjBhMjUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ic2YvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsOCBAQAorPGh0bWw+CisgIDxoZWFkPgorICAgIDx0aXRsZT5wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYnNmLio8L3RpdGxlPgorICA8L2hlYWQ+CisgIDxib2R5PgorICAgIDxwPkRlZmluZXMgdGhlIEJTRiBFbmdpbmUgZm9yIHVzaW5nIEdyb292eSBpbnNpZGUgYW55IEJTRiBhcHBsaWNhdGlvbi48L3A+CisgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL0Fubm90YXRpb25WaXNpdG9yLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9Bbm5vdGF0aW9uVmlzaXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5Nzc4MmYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9Bbm5vdGF0aW9uVmlzaXRvci5qYXZhCkBAIC0wLDAgKzEsMzM2IEBACisvKg0KKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLg0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbjsNCisNCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOw0KK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLk1hcDsNCisNCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuQVNUTm9kZTsNCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuQW5ub3RhdGlvbk5vZGU7DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LkNsYXNzSGVscGVyOw0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5DbGFzc05vZGU7DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHIuQW5ub3RhdGlvbkNvbnN0YW50RXhwcmVzc2lvbjsNCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuZXhwci5Db25zdGFudEV4cHJlc3Npb247DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHIuRXhwcmVzc2lvbjsNCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuZXhwci5MaXN0RXhwcmVzc2lvbjsNCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuZXhwci5Qcm9wZXJ0eUV4cHJlc3Npb247DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5FcnJvckNvbGxlY3RvcjsNCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLlNvdXJjZVVuaXQ7DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5tZXNzYWdlcy5TeW50YXhFcnJvck1lc3NhZ2U7DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LlN5bnRheEV4Y2VwdGlvbjsNCisNCisNCisvKioNCisgKiBBbiBBbm5vdGF0aW9uIHZpc2l0b3IgcmVzcG9uc2libGUgd2l0aDoNCisgKiAtIHJlYWRpbmcgYW5ub3RhdGlvbiBtZXRhZGF0YSAoQFJldGVudGlvbiwgQFRhcmdldCwgYXR0cmlidXRlIHR5cGVzKQ0KKyAqIC0gdmVyaWZ5IHRoYXQgYW4gPGNvZGU+QW5ub3RhdGlvbk5vZGU8L2NvZGU+IGNvbmZvcm1zIHRvIGFubm90YXRpb24gbWV0YQ0KKyAqIC0gZW5oYW5jaW5nIGFuIDxjb2RlPkFubm90YXRpb25Ob2RlPC9jb2RlPiBBU1QgdG8gcmVmbGVjdCByZWFsIGFubm90YXRpb24gbWV0YQ0KKyAqIA0KKyAqIEBhdXRob3IgPGEgaHJlZj0nbWFpbHRvOnRoZVtkb3RdbWluZHN0b3JtW2F0XWdtYWlsW2RvdF1jb20nPkFsZXggUG9wZXNjdTwvYT4NCisgKi8NCitwdWJsaWMgY2xhc3MgQW5ub3RhdGlvblZpc2l0b3Igew0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1tdIEVNUFRZX0FSR19UWVBFUyA9IG5ldyBDbGFzc1swXTsNCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gRU1QVFlfQVJHUyA9IG5ldyBPYmplY3RbMF07DQorICAgIA0KKyAgICBwcml2YXRlIGZpbmFsIENsYXNzIGFubm90YXRpb25Sb290Q2xhc3M7DQorICAgIHByaXZhdGUgU291cmNlVW5pdCBzb3VyY2U7DQorICAgIHByaXZhdGUgRXJyb3JDb2xsZWN0b3IgZXJyb3JDb2xsZWN0b3I7DQorICAgIA0KKyAgICBwcml2YXRlIEFubm90YXRpb25Ob2RlIGFubm90YXRpb247DQorICAgIHByaXZhdGUgQ2xhc3MgYW5ub3RhdGlvbkNsYXNzOw0KKyAgICBwcml2YXRlIE1hcCByZXF1aXJlZEF0dHJUeXBlcyA9IG5ldyBIYXNoTWFwKCk7IC8vIE1hcDxTdHJpbmcsIENsYXNzPg0KKyAgICBwcml2YXRlIE1hcCBkZWZhdWx0QXR0clR5cGVzID0gbmV3IEhhc2hNYXAoKTsgIC8vIE1hcDxTdHJpbmcsIENsYXNzPg0KKyAgICANCisgICAgcHVibGljIEFubm90YXRpb25WaXNpdG9yKFNvdXJjZVVuaXQgc291cmNlLCBFcnJvckNvbGxlY3RvciBlcnJvckNvbGxlY3Rvcikgew0KKyAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7DQorICAgICAgICB0aGlzLmVycm9yQ29sbGVjdG9yID0gZXJyb3JDb2xsZWN0b3I7DQorICAgICAgICB0aGlzLmFubm90YXRpb25Sb290Q2xhc3MgPSBsb2FkQW5ub3RhdGlvblJvb3RDbGFzcygpOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgQW5ub3RhdGlvbk5vZGUgdmlzaXQoQW5ub3RhdGlvbk5vZGUgbm9kZSkgew0KKyAgICAgICAgaWYoIWlzVmFsaWRBbm5vdGF0aW9uQ2xhc3Mobm9kZSkpIHsNCisgICAgICAgICAgICBub2RlLnNldFZhbGlkKGZhbHNlKTsNCisgICAgICAgICAgICByZXR1cm4gbm9kZTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgdGhpcy5hbm5vdGF0aW9uID0gbm9kZTsNCisgICAgICAgIGlmKCFub2RlLmdldENsYXNzTm9kZSgpLmlzUmVzb2x2ZWQoKSkgew0KKyAgICAgICAgICAgIGFkZEVycm9yKCJDdXJyZW50IHR5cGUgd2FzIG5vdCB5ZXQgcmVzb2x2ZWQuIENhbm5vdCBpbnRyb3NwZWN0IGl0LiIpOw0KKyAgICAgICAgICAgIG5vZGUuc2V0VmFsaWQoZmFsc2UpOw0KKyAgICAgICAgICAgIHJldHVybiBub2RlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgdGhpcy5hbm5vdGF0aW9uQ2xhc3MgPSBub2RlLmdldENsYXNzTm9kZSgpLmdldFR5cGVDbGFzcygpOw0KKyAgICAgICAgDQorICAgICAgICBleHRyYWN0QW5ub3RhdGlvbk1ldGEodGhpcy5hbm5vdGF0aW9uQ2xhc3MpOw0KKyAgICAgICAgDQorICAgICAgICBpZih0aGlzLmVycm9yQ29sbGVjdG9yLmhhc0Vycm9ycygpKSB7DQorICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uLnNldFZhbGlkKGZhbHNlKTsNCisgICAgICAgICAgICByZXR1cm4gdGhpcy5hbm5vdGF0aW9uOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBNYXAgYXR0cmlidXRlcyA9IHRoaXMuYW5ub3RhdGlvbi5nZXRNZW1iZXJzKCk7DQorICAgICAgICBmb3IoSXRlcmF0b3IgaXQgPSBhdHRyaWJ1dGVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsNCisgICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7DQorICAgICAgICAgICAgU3RyaW5nIGF0dHJOYW1lID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7DQorICAgICAgICAgICAgRXhwcmVzc2lvbiBhdHRyRXhwciA9IChFeHByZXNzaW9uKSBlbnRyeS5nZXRWYWx1ZSgpOw0KKyAgICAgICAgICAgIENsYXNzIGF0dHJUeXBlID0gZ2V0QXR0cmlidXRlVHlwZShhdHRyTmFtZSk7DQorICAgICAgICAgICAgaWYoYXR0clR5cGUgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICBhZGRFcnJvcigiVW5rbm93biBhdHRyaWJ1dGUgJyIgKyBhdHRyTmFtZSArICInIiwgYXR0ckV4cHIpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgdmlzaXRFeHByZXNzaW9uKGF0dHJOYW1lLCBhdHRyRXhwciwgYXR0clR5cGUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZighdGhpcy5yZXF1aXJlZEF0dHJUeXBlcy5pc0VtcHR5KCkpIHsNCisgICAgICAgICAgICBhZGRFcnJvcigiUmVxdWlyZWQgYXR0cmlidXRlcyAiICsgdGhpcy5yZXF1aXJlZEF0dHJUeXBlcy5rZXlTZXQoKSArICIgbm90IGZvdW5kIiwNCisgICAgICAgICAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvbik7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHRoaXMuYW5ub3RhdGlvbi5zZXRWYWxpZCghdGhpcy5lcnJvckNvbGxlY3Rvci5oYXNFcnJvcnMoKSk7DQorICAgICAgICByZXR1cm4gdGhpcy5hbm5vdGF0aW9uOw0KKyAgICB9DQorICAgIA0KKyAgICAvKioNCisgICAgICogQHBhcmFtIG5vZGUNCisgICAgICogQHJldHVybg0KKyAgICAgKi8NCisgICAgcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRBbm5vdGF0aW9uQ2xhc3MoQW5ub3RhdGlvbk5vZGUgbm9kZSkgew0KKyAgICAgICAgcmV0dXJuIG5vZGUuZ2V0Q2xhc3NOb2RlKCkuaW1wbGVtZW50c0ludGVyZmFjZSgiamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbiIpOw0KKyAgICB9DQorDQorICAgIHByb3RlY3RlZCB2b2lkIHZpc2l0RXhwcmVzc2lvbihTdHJpbmcgYXR0ck5hbWUsIEV4cHJlc3Npb24gYXR0ckFzdCwgQ2xhc3MgYXR0clR5cGUpIHsNCisgICAgICAgIGlmKGF0dHJUeXBlLmlzQXJyYXkoKSkgew0KKyAgICAgICAgICAgIC8vIGNoZWNrIG5lZWRlZCBhcyBAVGVzdChhdHRyID0geyJlbGVtIn0pIHBhc3NlcyB0aHJvdWdoIHRoZSBwYXJzZXINCisgICAgICAgICAgICBpZihhdHRyQXN0IGluc3RhbmNlb2YgTGlzdEV4cHJlc3Npb24pIHsNCisgICAgICAgICAgICAgICAgdmlzaXRMaXN0RXhwcmVzc2lvbihhdHRyTmFtZSwgKExpc3RFeHByZXNzaW9uKSBhdHRyQXN0LCBhdHRyVHlwZS5nZXRDb21wb25lbnRUeXBlKCkpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgICAgYWRkRXJyb3IoIkFubm90YXRpb24gbGlzdCBhdHRyaWJ1dGVzIG11c3QgdXNlIEdyb292eSBub3RhdGlvbiBbZWwxLCBlbDJdIiwgYXR0ckFzdCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYoYXR0clR5cGUuaXNQcmltaXRpdmUoKSkgew0KKyAgICAgICAgICAgIHZpc2l0Q29uc3RhbnRFeHByZXNzaW9uKGF0dHJOYW1lLCAoQ29uc3RhbnRFeHByZXNzaW9uKSBhdHRyQXN0LCBDbGFzc0hlbHBlci5nZXRXcmFwcGVyKENsYXNzSGVscGVyLm1ha2UoYXR0clR5cGUpKSk7DQorICAgICAgICB9DQorICAgICAgICBlbHNlIGlmKFN0cmluZy5jbGFzcy5lcXVhbHMoYXR0clR5cGUpKSB7DQorICAgICAgICAgICAgdmlzaXRDb25zdGFudEV4cHJlc3Npb24oYXR0ck5hbWUsIChDb25zdGFudEV4cHJlc3Npb24pIGF0dHJBc3QsIENsYXNzSGVscGVyLm1ha2UoU3RyaW5nLmNsYXNzKSk7DQorICAgICAgICB9DQorICAgICAgICBlbHNlIGlmKENsYXNzLmNsYXNzLmVxdWFscyhhdHRyVHlwZSkpIHsNCisgICAgICAgICAgICAvLyB0aGVyZSBpcyBub3RoaW5nIHRvIGNoZWNrIGFib3V0IENsYXNzRXhwcmVzc2lvbnMNCisgICAgICAgIH0NCisgICAgICAgIGVsc2UgaWYoaXNFbnVtKGF0dHJUeXBlKSkgew0KKyAgICAgICAgICAgIGlmKGF0dHJBc3QgaW5zdGFuY2VvZiBQcm9wZXJ0eUV4cHJlc3Npb24pIHsNCisgICAgICAgICAgICAgICAgdmlzaXRFbnVtRXhwcmVzc2lvbihhdHRyTmFtZSwgKFByb3BlcnR5RXhwcmVzc2lvbikgYXR0ckFzdCwgQ2xhc3NIZWxwZXIubWFrZShhdHRyVHlwZSkpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgICAgYWRkRXJyb3IoIlZhbHVlIG5vdCBkZWZpbmVkIGZvciBhbm5vdGF0aW9uIGF0dHJpYnV0ZSAiICsgYXR0ck5hbWUsIGF0dHJBc3QpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGVsc2UgaWYoaXNBbm5vdGF0aW9uKGF0dHJUeXBlKSkgew0KKyAgICAgICAgICAgIHZpc2l0QW5ub3RhdGlvbkV4cHJlc3Npb24oYXR0ck5hbWUsIChBbm5vdGF0aW9uQ29uc3RhbnRFeHByZXNzaW9uKSBhdHRyQXN0LCBhdHRyVHlwZSk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIC8qKg0KKyAgICAgKiBAcGFyYW0gYXR0ck5hbWUNCisgICAgICogQHBhcmFtIGV4cHJlc3Npb24NCisgICAgICogQHBhcmFtIGF0dHJUeXBlDQorICAgICAqLw0KKyAgICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEFubm90YXRpb25FeHByZXNzaW9uKFN0cmluZyBhdHRyTmFtZSwgQW5ub3RhdGlvbkNvbnN0YW50RXhwcmVzc2lvbiBleHByZXNzaW9uLCBDbGFzcyBhdHRyVHlwZSkgew0KKyAgICAgICAgQW5ub3RhdGlvbk5vZGUgYW5ub3RhdGlvbk5vZGUgPSAoQW5ub3RhdGlvbk5vZGUpIGV4cHJlc3Npb24uZ2V0VmFsdWUoKTsNCisgICAgICAgIEFubm90YXRpb25WaXNpdG9yIHZpc2l0b3IgPSBuZXcgQW5ub3RhdGlvblZpc2l0b3IodGhpcy5zb3VyY2UsIHRoaXMuZXJyb3JDb2xsZWN0b3IpOw0KKyAgICAgICAgdmlzaXRvci52aXNpdChhbm5vdGF0aW9uTm9kZSk7DQorICAgIH0NCisNCisgICAgcHJvdGVjdGVkIHZvaWQgdmlzaXRMaXN0RXhwcmVzc2lvbihTdHJpbmcgYXR0ck5hbWUsIExpc3RFeHByZXNzaW9uIGxpc3RFeHByLCBDbGFzcyBlbGVtZW50VHlwZSkgew0KKyAgICAgICAgTGlzdCBleHByZXNzaW9ucyA9IGxpc3RFeHByLmdldEV4cHJlc3Npb25zKCk7DQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4cHJlc3Npb25zLnNpemUoKTsgaSsrKSB7DQorICAgICAgICAgICAgdmlzaXRFeHByZXNzaW9uKGF0dHJOYW1lLCAoRXhwcmVzc2lvbikgZXhwcmVzc2lvbnMuZ2V0KGkpLCBlbGVtZW50VHlwZSk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCB2b2lkIHZpc2l0Q29uc3RhbnRFeHByZXNzaW9uKFN0cmluZyBhdHRyTmFtZSwgQ29uc3RhbnRFeHByZXNzaW9uIGNvbnN0RXhwciwgQ2xhc3NOb2RlIGF0dHJUeXBlKSB7DQorICAgICAgICBpZighY29uc3RFeHByLmdldFR5cGUoKS5pc0Rlcml2ZWRGcm9tKGF0dHJUeXBlKSkgew0KKyAgICAgICAgICAgIGFkZEVycm9yKCJBdHRyaWJ1dGUgJyIgKyBhdHRyTmFtZSArICInIHNob3VsZCBoYXZlIHR5cGUgJyIgKyBhdHRyVHlwZS5nZXROYW1lKCkgKyAiJzsgIg0KKyAgICAgICAgICAgICAgICAgICAgKyAiYnV0IGZvdW5kIHR5cGUgJyIgKyBjb25zdEV4cHIuZ2V0VHlwZSgpLmdldE5hbWUoKSArICInIiwNCisgICAgICAgICAgICAgICAgICAgIGNvbnN0RXhwcik7DQorICAgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCB2b2lkIHZpc2l0RW51bUV4cHJlc3Npb24oU3RyaW5nIGF0dHJOYW1lLCBQcm9wZXJ0eUV4cHJlc3Npb24gcHJvcEV4cHIsIENsYXNzTm9kZSBhdHRyVHlwZSkgew0KKyAgICAgICAgaWYoIXByb3BFeHByLmdldE9iamVjdEV4cHJlc3Npb24oKS5nZXRUeXBlKCkuaXNEZXJpdmVkRnJvbShhdHRyVHlwZSkpIHsNCisgICAgICAgICAgICBhZGRFcnJvcigiQXR0cmlidXRlICciICsgYXR0ck5hbWUgKyAiJyBzaG91bGQgaGF2ZSB0eXBlICciICsgYXR0clR5cGUuZ2V0TmFtZSgpICsiJyAoRW51bSksIGJ1dCBmb3VuZCAiDQorICAgICAgICAgICAgICAgICAgICArIHByb3BFeHByLmdldE9iamVjdEV4cHJlc3Npb24oKS5nZXRUeXBlKCkuZ2V0TmFtZSgpLCANCisgICAgICAgICAgICAgICAgICAgIHByb3BFeHByKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBib29sZWFuIGlzQW5ub3RhdGlvbihDbGFzcyBjbGF6eikgew0KKyAgICAgICAgQm9vbGVhbiByZXN1bHQgPSAoQm9vbGVhbikgaW52b2tlKGNsYXp6LmdldENsYXNzKCksICJpc0Fubm90YXRpb24iLCBFTVBUWV9BUkdfVFlQRVMsIGNsYXp6LCBFTVBUWV9BUkdTKTsNCisgICAgICAgIHJldHVybiByZXN1bHQuYm9vbGVhblZhbHVlKCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgYm9vbGVhbiBpc0VudW0oQ2xhc3MgY2xhenopIHsNCisgICAgICAgIEJvb2xlYW4gcmVzdWx0ID0gKEJvb2xlYW4pIGludm9rZShjbGF6ei5nZXRDbGFzcygpLCAiaXNFbnVtIiwgRU1QVFlfQVJHX1RZUEVTLCBjbGF6eiwgRU1QVFlfQVJHUyk7DQorICAgICAgICByZXR1cm4gcmVzdWx0LmJvb2xlYW5WYWx1ZSgpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIHZvaWQgZXh0cmFjdEFubm90YXRpb25NZXRhKENsYXNzIGFubm90YXRpb25DbGFzcykgew0KKyAgICAgICAgaW5pdGlhbGl6ZUFubm90YXRpb25NZXRhKGFubm90YXRpb25DbGFzcyk7DQorICAgICAgICBpbml0aWFsaXplQXR0cmlidXRlVHlwZXMoYW5ub3RhdGlvbkNsYXNzKTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVBbm5vdGF0aW9uTWV0YShDbGFzcyBhbm5vdGF0aW9uQ2xhc3MpIHsNCisgICAgICAgIE9iamVjdFtdIGFubm90YXRpb25zID0gKE9iamVjdFtdKSBpbnZva2UoYW5ub3RhdGlvbkNsYXNzLmdldENsYXNzKCksIA0KKyAgICAgICAgICAgICAgICAiZ2V0QW5ub3RhdGlvbnMiLCBFTVBUWV9BUkdfVFlQRVMsIGFubm90YXRpb25DbGFzcywgRU1QVFlfQVJHUyk7DQorICAgICAgICBpZiAoYW5ub3RhdGlvbnMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgIGFkZEVycm9yKCJDYW5ub3QgcmV0cmlldmUgYW5ub3RhdGlvbiBtZXRhIGluZm9ybWF0aW9uLiAiIA0KKyAgICAgICAgICAgICAgICAgICAgKyBFeHRlbmRlZFZlcmlmaWVyLkpWTV9FUlJPUl9NRVNTQUdFKTsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBhbm5vdGF0aW9ucy5sZW5ndGg7IGkrKykgew0KKyAgICAgICAgICAgIENsYXNzIGFubm90YXRpb25UeXBlID0gKENsYXNzKSBpbnZva2UodGhpcy5hbm5vdGF0aW9uUm9vdENsYXNzLCANCisgICAgICAgICAgICAgICAgICAgICJhbm5vdGF0aW9uVHlwZSIsIEVNUFRZX0FSR19UWVBFUywgYW5ub3RhdGlvbnNbaV0sIEVNUFRZX0FSR1MpOw0KKyAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uVHlwZSA9PSBudWxsKSBjb250aW51ZTsNCisgICAgICAgICAgICANCisgICAgICAgICAgICBpZiAoImphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbiIuZXF1YWxzKGFubm90YXRpb25UeXBlLmdldE5hbWUoKSkpIHsNCisgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZVJldGVudGlvbihhbm5vdGF0aW9uQ2xhc3MsIGFubm90YXRpb25UeXBlLCBhbm5vdGF0aW9uc1tpXSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UgaWYoImphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldCIuZXF1YWxzKGFubm90YXRpb25UeXBlLmdldE5hbWUoKSkpIHsNCisgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZVRhcmdldChhbm5vdGF0aW9uQ2xhc3MsIGFubm90YXRpb25UeXBlLCBhbm5vdGF0aW9uc1tpXSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUF0dHJpYnV0ZVR5cGVzKENsYXNzIGFubm90YXRpb25DbGFzcykgew0KKyAgICAgICAgTWV0aG9kW10gbWV0aG9kcyA9IGFubm90YXRpb25DbGFzcy5nZXREZWNsYXJlZE1ldGhvZHMoKTsNCisgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7DQorICAgICAgICAgICAgT2JqZWN0IGRlZmF1bHRWYWx1ZSA9IGludm9rZShNZXRob2QuY2xhc3MsICJnZXREZWZhdWx0VmFsdWUiLCBFTVBUWV9BUkdfVFlQRVMsIG1ldGhvZHNbaV0sIEVNUFRZX0FSR1MpOw0KKyAgICAgICAgICAgIGlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgeyANCisgICAgICAgICAgICAgICAgLy8gYnkgbm93IHdlIGtub3cgSkRLMS41IEFQSSBpcyBhdmFpbGFibGUgc28gYSBudWxsIG1lYW5zIG5vIGRlZmF1bHQgdmFsdWUNCisgICAgICAgICAgICAgICAgZGVmYXVsdEF0dHJUeXBlcy5wdXQobWV0aG9kc1tpXS5nZXROYW1lKCksIG1ldGhvZHNbaV0uZ2V0UmV0dXJuVHlwZSgpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICAgIHJlcXVpcmVkQXR0clR5cGVzLnB1dChtZXRob2RzW2ldLmdldE5hbWUoKSwgbWV0aG9kc1tpXS5nZXRSZXR1cm5UeXBlKCkpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVSZXRlbnRpb24oQ2xhc3MgYW5ub3RhdGlvbkNsYXNzLCBDbGFzcyByZXRlbnRpb25DbGFzcywgT2JqZWN0IHJldGVudGlvbkFubm90YXRpb24pIHsNCisgICAgICAgIE9iamVjdCByZXRlbnRpb25Qb2xpY3lFbnVtID0gDQorICAgICAgICAgICAgaW52b2tlKHJldGVudGlvbkNsYXNzLCAidmFsdWUiLCBFTVBUWV9BUkdfVFlQRVMsIHJldGVudGlvbkFubm90YXRpb24sIEVNUFRZX0FSR1MpOw0KKyAgICAgICAgaWYgKHJldGVudGlvblBvbGljeUVudW0gPT0gbnVsbCkgew0KKyAgICAgICAgICAgIGFkZEVycm9yKCJDYW5ub3QgcmVhZCBAUmV0ZW50aW9uUG9saWN5IG9uIHRoZSBAIiArIGFubm90YXRpb25DbGFzcy5nZXROYW1lKCkgDQorICAgICAgICAgICAgICAgICAgICArIEV4dGVuZGVkVmVyaWZpZXIuSlZNX0VSUk9SX01FU1NBR0UpOw0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgaWYoIlJVTlRJTUUiLmVxdWFscyhyZXRlbnRpb25Qb2xpY3lFbnVtLnRvU3RyaW5nKCkpKSB7DQorICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uLnNldFJ1bnRpbWVSZXRlbnRpb24odHJ1ZSk7DQorICAgICAgICB9DQorICAgICAgICBlbHNlIGlmKCJTT1VSQ0UiLmVxdWFscyhyZXRlbnRpb25Qb2xpY3lFbnVtLnRvU3RyaW5nKCkpKSB7DQorICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uLnNldFNvdXJjZVJldGVudGlvbih0cnVlKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVUYXJnZXQoQ2xhc3MgYW5ub3RhdGlvbkNsYXNzLCBDbGFzcyB0YXJnZXRDbGFzcywgT2JqZWN0IHRhcmdldEFubm90YXRpb24pIHsNCisgICAgICAgIE9iamVjdFtdIGVsZW1lbnRUeXBlRW51bSA9DQorICAgICAgICAgICAgKE9iamVjdFtdKSBpbnZva2UodGFyZ2V0Q2xhc3MsICJ2YWx1ZSIsIEVNUFRZX0FSR19UWVBFUywgdGFyZ2V0QW5ub3RhdGlvbiwgRU1QVFlfQVJHUyk7DQorICAgICAgICBpZiAoZWxlbWVudFR5cGVFbnVtID09IG51bGwpIHsNCisgICAgICAgICAgICBhZGRFcnJvcigiQ2Fubm90IHJlYWQgQFRhcmdldCBvbiB0aGUgQCIgKyBhbm5vdGF0aW9uQ2xhc3MuZ2V0TmFtZSgpIA0KKyAgICAgICAgICAgICAgICAgICAgKyBFeHRlbmRlZFZlcmlmaWVyLkpWTV9FUlJPUl9NRVNTQUdFKTsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgICAgICBpbnQgYml0bWFwID0gMDsNCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudFR5cGVFbnVtLmxlbmd0aDsgaSsrKSB7DQorICAgICAgICAgICAgU3RyaW5nIHRhcmdldE5hbWUgPSBlbGVtZW50VHlwZUVudW1baV0udG9TdHJpbmcoKTsNCisgICAgICAgICAgICBpZigiVFlQRSIuZXF1YWxzKHRhcmdldE5hbWUpKSB7DQorICAgICAgICAgICAgICAgIGJpdG1hcCB8PSBBbm5vdGF0aW9uTm9kZS5UWVBFX1RBUkdFVDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZSBpZigiQ09OU1RSVUNUT1IiLmVxdWFscyh0YXJnZXROYW1lKSkgew0KKyAgICAgICAgICAgICAgICBiaXRtYXAgfD0gQW5ub3RhdGlvbk5vZGUuQ09OU1RSVUNUT1JfVEFSR0VUOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlIGlmKCJNRVRIT0QiLmVxdWFscyh0YXJnZXROYW1lKSkgew0KKyAgICAgICAgICAgICAgICBiaXRtYXAgfD0gQW5ub3RhdGlvbk5vZGUuTUVUSE9EX1RBUkdFVDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZSBpZigiRklFTEQiLmVxdWFscyh0YXJnZXROYW1lKSkgew0KKyAgICAgICAgICAgICAgICBiaXRtYXAgfD0gQW5ub3RhdGlvbk5vZGUuRklFTERfVEFSR0VUOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlIGlmKCJQQVJBTUVURVIiLmVxdWFscyh0YXJnZXROYW1lKSkgew0KKyAgICAgICAgICAgICAgICBiaXRtYXAgfD0gQW5ub3RhdGlvbk5vZGUuUEFSQU1FVEVSX1RBUkdFVDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZSBpZigiTE9DQUxfVkFSSUFCTEUiLmVxdWFscyh0YXJnZXROYW1lKSkgew0KKyAgICAgICAgICAgICAgICBiaXRtYXAgfD0gQW5ub3RhdGlvbk5vZGUuTE9DQUxfVkFSSUFCTEVfVEFSR0VUOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlIGlmKCJBTk5PVEFUSU9OIi5lcXVhbHModGFyZ2V0TmFtZSkpIHsNCisgICAgICAgICAgICAgICAgYml0bWFwIHw9IEFubm90YXRpb25Ob2RlLkFOTk9UQVRJT05fVEFSR0VUOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHRoaXMuYW5ub3RhdGlvbi5zZXRBbGxvd2VkVGFyZ2V0cyhiaXRtYXApOw0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRFcnJvcihTdHJpbmcgbXNnKSB7DQorICAgICAgICB0aGlzLmVycm9yQ29sbGVjdG9yLmFkZEVycm9yQW5kQ29udGludWUoDQorICAgICAgICAgIG5ldyBTeW50YXhFcnJvck1lc3NhZ2UobmV3IFN5bnRheEV4Y2VwdGlvbihtc2cgDQorICAgICAgICAgICAgICAgICAgKyAiIGluIEAiICsgdGhpcy5hbm5vdGF0aW9uQ2xhc3MuZ2V0TmFtZSgpICsgJ1xuJywgDQorICAgICAgICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uLmdldExpbmVOdW1iZXIoKSwgDQorICAgICAgICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uLmdldENvbHVtbk51bWJlcigpKSwgdGhpcy5zb3VyY2UpDQorICAgICAgICApOw0KKyAgICB9DQorICAgIA0KKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRFcnJvcihTdHJpbmcgbXNnLCBBU1ROb2RlIGV4cHIpIHsNCisgICAgICAgIHRoaXMuZXJyb3JDb2xsZWN0b3IuYWRkRXJyb3JBbmRDb250aW51ZSgNCisgICAgICAgICAgbmV3IFN5bnRheEVycm9yTWVzc2FnZShuZXcgU3ludGF4RXhjZXB0aW9uKG1zZyANCisgICAgICAgICAgICAgICAgICArICIgaW4gQCIgKyB0aGlzLmFubm90YXRpb25DbGFzcy5nZXROYW1lKCkgKyAnXG4nLCANCisgICAgICAgICAgICAgICAgICBleHByLmdldExpbmVOdW1iZXIoKSwgDQorICAgICAgICAgICAgICAgICAgZXhwci5nZXRDb2x1bW5OdW1iZXIoKSksIHRoaXMuc291cmNlKQ0KKyAgICAgICAgKTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBDbGFzcyBnZXRBdHRyaWJ1dGVUeXBlKFN0cmluZyBhdHRyKSB7DQorICAgICAgICBpZih0aGlzLnJlcXVpcmVkQXR0clR5cGVzLmNvbnRhaW5zS2V5KGF0dHIpKSB7DQorICAgICAgICAgICAgcmV0dXJuIChDbGFzcykgdGhpcy5yZXF1aXJlZEF0dHJUeXBlcy5yZW1vdmUoYXR0cik7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHJldHVybiAoQ2xhc3MpIHRoaXMuZGVmYXVsdEF0dHJUeXBlcy5yZW1vdmUoYXR0cik7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgT2JqZWN0IGludm9rZShDbGFzcyBjbGF6eiwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzW10gYXJnVHlwZXMsIE9iamVjdCB0YXJnZXQsIE9iamVjdFtdIGFyZ3MpIHsNCisgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgTWV0aG9kIG0gPSBjbGF6ei5nZXRNZXRob2QobWV0aG9kTmFtZSwgYXJnVHlwZXMpOw0KKyAgICAgICAgICAgIHJldHVybiBtLmludm9rZSh0YXJnZXQsIGFyZ3MpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY2F0Y2goVGhyb3dhYmxlIGNhdXNlKSB7DQorICAgICAgICAgICAgLy8gd2UgcmVwb3J0IGFuIGVycm9yIG9uIGNhbGxlZCBzaWRlDQorICAgICAgICB9DQorICAgICANCisgICAgICAgIHJldHVybiBudWxsOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIENsYXNzIGxvYWRBbm5vdGF0aW9uUm9vdENsYXNzKCkgew0KKyAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZSgiamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbiIpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY2F0Y2goVGhyb3dhYmxlIGNhdXNlKSB7DQorICAgICAgICAgICAgLy8gcmVwb3J0IHRoZSBlcnJvciBsYXRlcg0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICByZXR1cm4gbnVsbDsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9Bc21DbGFzc0dlbmVyYXRvci5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vQXNtQ2xhc3NHZW5lcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWEwZDZlCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vQXNtQ2xhc3NHZW5lcmF0b3IuamF2YQpAQCAtMCwwICsxLDM3MjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW47CisKK2ltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlPYmplY3Q7CitpbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5Lkdyb292eUJ1Z0Vycm9yOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0Lio7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuZXhwci4qOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuKjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuQ29tcGlsZXJDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5Tb3VyY2VVbml0OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5NZXRhQ2xhc3NIZWxwZXI7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLlNjcmlwdEJ5dGVjb2RlQWRhcHRlcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5SdW50aW1lUGFyc2VyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LlR5cGVzOworaW1wb3J0IG9yZy5vYmplY3R3ZWIuYXNtLkFubm90YXRpb25WaXNpdG9yOworaW1wb3J0IG9yZy5vYmplY3R3ZWIuYXNtLio7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworCisvKioKKyAqIEdlbmVyYXRlcyBKYXZhIGNsYXNzIHZlcnNpb25zIG9mIEdyb292eSBjbGFzc2VzIHVzaW5nIEFTTS4KKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86YjU1ckBzaW5hLmNvbSI+QmluZyBSYW48L2E+CisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpibGFja2RyYWdAZ214Lm9yZyI+Sm9jaGVuIFRoZW9kb3JvdTwvYT4KKyAqIEBhdXRob3IgPGEgaHJlZj0nbWFpbHRvOnRoZVtkb3RdbWluZHN0b3JtW2F0XWdtYWlsW2RvdF1jb20nPkFsZXggUG9wZXNjdTwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIEFzbUNsYXNzR2VuZXJhdG9yIGV4dGVuZHMgQ2xhc3NHZW5lcmF0b3IgeworCisvLyAgICBwcml2YXRlIExvZ2dlciBsb2cgPSBMb2dnZXIuZ2V0TG9nZ2VyKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKworICAgIHByaXZhdGUgZmluYWwgQ2xhc3NWaXNpdG9yIGN2OworICAgIHByaXZhdGUgTWV0aG9kVmlzaXRvciBtdjsKKyAgICBwcml2YXRlIEdlbmVyYXRvckNvbnRleHQgY29udGV4dDsKKworICAgIHByaXZhdGUgU3RyaW5nIHNvdXJjZUZpbGU7CisKKyAgICAvLyBjdXJyZW50IGNsYXNzIGRldGFpbHMKKyAgICBwcml2YXRlIENsYXNzTm9kZSBjbGFzc05vZGU7CisgICAgcHJpdmF0ZSBDbGFzc05vZGUgb3V0ZXJtb3N0Q2xhc3M7CisgICAgcHJpdmF0ZSBTdHJpbmcgaW50ZXJuYWxDbGFzc05hbWU7CisgICAgcHJpdmF0ZSBTdHJpbmcgaW50ZXJuYWxCYXNlQ2xhc3NOYW1lOworCisgICAgLyoqCisgICAgICogbWFwcyB0aGUgdmFyaWFibGUgbmFtZXMgdG8gdGhlIEpWTSBpbmRpY2VzCisgICAgICovCisgICAgcHJpdmF0ZSBDb21waWxlU3RhY2sgY29tcGlsZVN0YWNrOworCisgICAgLyoqCisgICAgICogaGF2ZSB3ZSBvdXRwdXQgYSByZXR1cm4gc3RhdGVtZW50IHlldAorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBvdXRwdXRSZXR1cm47CisKKyAgICAvKioKKyAgICAgKiBhcmUgd2Ugb24gdGhlIGxlZnQgb3IgcmlnaHQgb2YgYW4gZXhwcmVzc2lvbgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBsZWZ0SGFuZEV4cHJlc3Npb24gPSBmYWxzZTsKKyAgICAvKioKKyAgICAgKiBOb3RlcyBmb3IgbGVmdEhhbmRFeHByZXNzaW9uOgorICAgICAqIFRoZSBkZWZhdWx0IGlzIGZhbHNlLCB0aGF0IG1lbmFzIHRoZSByaWdodCBzaWRlIGlzIGRlZmF1bHQuCisgICAgICogVGhlIHJpZ2h0IHNpZGUgbWVhbnMgdGhhdCB2YXJpYWJsZXMgYXJlIHJlYWQgYW5kIG5vdCB3cml0dGVuLgorICAgICAqIEFueSBjaGFuZ2Ugb2YgbGVmdEhhbmRFeHByZXNzaW9uIHRvIHRydWUsIHNob3VsZCBiZSBtYWRlIGNhcmVmdWxseS4KKyAgICAgKiBJZiBzdWNoIGEgY2hhbmdlIGlzIG5lZWRlZCwgdGhlbiBpdCBzaG91bGQgYmUgc2V0IHRvIGZhbHNlIGFzIHNvb24gYXMKKyAgICAgKiBwb3NzaWJsZSwgYnV0IG1vc3QgaW1wb3J0YW50IGluIHRoZSBzYW1lIG1ldGhvZC4gU2V0dGluZworICAgICAqIGxlZnRIYW5kRXhwcmVzc2lvbiB0byBmYWxzZSBpcyBuZWVkZWQgZm9yIHdyaXRpbmcgdmFyaWFibGVzLgorICAgICAqLworCisgICAgLy8gbWV0aG9kIGludm9jYXRpb24KKyAgICBzdGF0aWMgZmluYWwgTWV0aG9kQ2FsbGVyTXVsdGlBZGFwdGVyIGludm9rZU1ldGhvZE9uQ3VycmVudCA9IE1ldGhvZENhbGxlck11bHRpQWRhcHRlci5uZXdTdGF0aWMoU2NyaXB0Qnl0ZWNvZGVBZGFwdGVyLmNsYXNzLCAiaW52b2tlTWV0aG9kT25DdXJyZW50IiwgdHJ1ZSwgZmFsc2UpOworICAgIHN0YXRpYyBmaW5hbCBNZXRob2RDYWxsZXJNdWx0aUFkYXB0ZXIgaW52b2tlTWV0aG9kT25TdXBlciA9IE1ldGhvZENhbGxlck11bHRpQWRhcHRlci5uZXdTdGF0aWMoU2NyaXB0Qnl0ZWNvZGVBZGFwdGVyLmNsYXNzLCAiaW52b2tlTWV0aG9kT25TdXBlciIsIHRydWUsIGZhbHNlKTsKKyAgICBzdGF0aWMgZmluYWwgTWV0aG9kQ2FsbGVyTXVsdGlBZGFwdGVyIGludm9rZU1ldGhvZCA9IE1ldGhvZENhbGxlck11bHRpQWRhcHRlci5uZXdTdGF0aWMoU2NyaXB0Qnl0ZWNvZGVBZGFwdGVyLmNsYXNzLCAiaW52b2tlTWV0aG9kIiwgdHJ1ZSwgZmFsc2UpOworICAgIHN0YXRpYyBmaW5hbCBNZXRob2RDYWxsZXJNdWx0aUFkYXB0ZXIgaW52b2tlU3RhdGljTWV0aG9kID0gTWV0aG9kQ2FsbGVyTXVsdGlBZGFwdGVyLm5ld1N0YXRpYyhTY3JpcHRCeXRlY29kZUFkYXB0ZXIuY2xhc3MsICJpbnZva2VTdGF0aWNNZXRob2QiLCB0cnVlLCB0cnVlKTsKKyAgICBzdGF0aWMgZmluYWwgTWV0aG9kQ2FsbGVyTXVsdGlBZGFwdGVyIGludm9rZU5ldyA9IE1ldGhvZENhbGxlck11bHRpQWRhcHRlci5uZXdTdGF0aWMoU2NyaXB0Qnl0ZWNvZGVBZGFwdGVyLmNsYXNzLCAiaW52b2tlTmV3IiwgdHJ1ZSwgdHJ1ZSk7CisKKyAgICAvLyBmaWVsZHMgJiBwcm9wZXJ0aWVzCisgICAgc3RhdGljIGZpbmFsIE1ldGhvZENhbGxlck11bHRpQWRhcHRlciBzZXRGaWVsZCA9IE1ldGhvZENhbGxlck11bHRpQWRhcHRlci5uZXdTdGF0aWMoU2NyaXB0Qnl0ZWNvZGVBZGFwdGVyLmNsYXNzLCAic2V0RmllbGQiLCBmYWxzZSwgZmFsc2UpOworICAgIHN0YXRpYyBmaW5hbCBNZXRob2RDYWxsZXJNdWx0aUFkYXB0ZXIgZ2V0RmllbGQgPSBNZXRob2RDYWxsZXJNdWx0aUFkYXB0ZXIubmV3U3RhdGljKFNjcmlwdEJ5dGVjb2RlQWRhcHRlci5jbGFzcywgImdldEZpZWxkIiwgZmFsc2UsIGZhbHNlKTsKKyAgICBzdGF0aWMgZmluYWwgTWV0aG9kQ2FsbGVyTXVsdGlBZGFwdGVyIHNldEdyb292eU9iamVjdEZpZWxkID0gTWV0aG9kQ2FsbGVyTXVsdGlBZGFwdGVyLm5ld1N0YXRpYyhTY3JpcHRCeXRlY29kZUFkYXB0ZXIuY2xhc3MsICJzZXRHcm9vdnlPYmplY3RGaWVsZCIsIGZhbHNlLCBmYWxzZSk7CisgICAgc3RhdGljIGZpbmFsIE1ldGhvZENhbGxlck11bHRpQWRhcHRlciBnZXRHcm9vdnlPYmplY3RGaWVsZCA9IE1ldGhvZENhbGxlck11bHRpQWRhcHRlci5uZXdTdGF0aWMoU2NyaXB0Qnl0ZWNvZGVBZGFwdGVyLmNsYXNzLCAiZ2V0R3Jvb3Z5T2JqZWN0RmllbGQiLCBmYWxzZSwgZmFsc2UpOworICAgIHN0YXRpYyBmaW5hbCBNZXRob2RDYWxsZXJNdWx0aUFkYXB0ZXIgc2V0RmllbGRPblN1cGVyID0gTWV0aG9kQ2FsbGVyTXVsdGlBZGFwdGVyLm5ld1N0YXRpYyhTY3JpcHRCeXRlY29kZUFkYXB0ZXIuY2xhc3MsICJzZXRGaWVsZE9uU3VwZXIiLCBmYWxzZSwgZmFsc2UpOworICAgIHN0YXRpYyBmaW5hbCBNZXRob2RDYWxsZXJNdWx0aUFkYXB0ZXIgZ2V0RmllbGRPblN1cGVyID0gTWV0aG9kQ2FsbGVyTXVsdGlBZGFwdGVyLm5ld1N0YXRpYyhTY3JpcHRCeXRlY29kZUFkYXB0ZXIuY2xhc3MsICJnZXRGaWVsZE9uU3VwZXIiLCBmYWxzZSwgZmFsc2UpOworCisgICAgc3RhdGljIGZpbmFsIE1ldGhvZENhbGxlck11bHRpQWRhcHRlciBzZXRQcm9wZXJ0eSA9IE1ldGhvZENhbGxlck11bHRpQWRhcHRlci5uZXdTdGF0aWMoU2NyaXB0Qnl0ZWNvZGVBZGFwdGVyLmNsYXNzLCAic2V0UHJvcGVydHkiLCBmYWxzZSwgZmFsc2UpOworICAgIHN0YXRpYyBmaW5hbCBNZXRob2RDYWxsZXJNdWx0aUFkYXB0ZXIgZ2V0UHJvcGVydHkgPSBNZXRob2RDYWxsZXJNdWx0aUFkYXB0ZXIubmV3U3RhdGljKFNjcmlwdEJ5dGVjb2RlQWRhcHRlci5jbGFzcywgImdldFByb3BlcnR5IiwgZmFsc2UsIGZhbHNlKTsKKyAgICBzdGF0aWMgZmluYWwgTWV0aG9kQ2FsbGVyTXVsdGlBZGFwdGVyIHNldEdyb292eU9iamVjdFByb3BlcnR5ID0gTWV0aG9kQ2FsbGVyTXVsdGlBZGFwdGVyLm5ld1N0YXRpYyhTY3JpcHRCeXRlY29kZUFkYXB0ZXIuY2xhc3MsICJzZXRHcm9vdnlPYmplY3RQcm9wZXJ0eSIsIGZhbHNlLCBmYWxzZSk7CisgICAgc3RhdGljIGZpbmFsIE1ldGhvZENhbGxlck11bHRpQWRhcHRlciBnZXRHcm9vdnlPYmplY3RQcm9wZXJ0eSA9IE1ldGhvZENhbGxlck11bHRpQWRhcHRlci5uZXdTdGF0aWMoU2NyaXB0Qnl0ZWNvZGVBZGFwdGVyLmNsYXNzLCAiZ2V0R3Jvb3Z5T2JqZWN0UHJvcGVydHkiLCBmYWxzZSwgZmFsc2UpOworICAgIHN0YXRpYyBmaW5hbCBNZXRob2RDYWxsZXJNdWx0aUFkYXB0ZXIgc2V0UHJvcGVydHlPblN1cGVyID0gTWV0aG9kQ2FsbGVyTXVsdGlBZGFwdGVyLm5ld1N0YXRpYyhTY3JpcHRCeXRlY29kZUFkYXB0ZXIuY2xhc3MsICJzZXRQcm9wZXJ0eU9uU3VwZXIiLCBmYWxzZSwgZmFsc2UpOworICAgIHN0YXRpYyBmaW5hbCBNZXRob2RDYWxsZXJNdWx0aUFkYXB0ZXIgZ2V0UHJvcGVydHlPblN1cGVyID0gTWV0aG9kQ2FsbGVyTXVsdGlBZGFwdGVyLm5ld1N0YXRpYyhTY3JpcHRCeXRlY29kZUFkYXB0ZXIuY2xhc3MsICJnZXRQcm9wZXJ0eU9uU3VwZXIiLCBmYWxzZSwgZmFsc2UpOworCisgICAgLy8gaXRlcmF0b3IKKyAgICBzdGF0aWMgZmluYWwgTWV0aG9kQ2FsbGVyIGl0ZXJhdG9yTmV4dE1ldGhvZCA9IE1ldGhvZENhbGxlci5uZXdJbnRlcmZhY2UoSXRlcmF0b3IuY2xhc3MsICJuZXh0Iik7CisgICAgc3RhdGljIGZpbmFsIE1ldGhvZENhbGxlciBpdGVyYXRvckhhc05leHRNZXRob2QgPSBNZXRob2RDYWxsZXIubmV3SW50ZXJmYWNlKEl0ZXJhdG9yLmNsYXNzLCAiaGFzTmV4dCIpOworICAgIC8vIGFzc2VydAorICAgIHN0YXRpYyBmaW5hbCBNZXRob2RDYWxsZXIgYXNzZXJ0RmFpbGVkTWV0aG9kID0gTWV0aG9kQ2FsbGVyLm5ld1N0YXRpYyhTY3JpcHRCeXRlY29kZUFkYXB0ZXIuY2xhc3MsICJhc3NlcnRGYWlsZWQiKTsKKyAgICAvLyBpc0Nhc2UKKyAgICBzdGF0aWMgZmluYWwgTWV0aG9kQ2FsbGVyIGlzQ2FzZU1ldGhvZCA9IE1ldGhvZENhbGxlci5uZXdTdGF0aWMoU2NyaXB0Qnl0ZWNvZGVBZGFwdGVyLmNsYXNzLCAiaXNDYXNlIik7CisgICAgLy9jb21wYXJlCisgICAgc3RhdGljIGZpbmFsIE1ldGhvZENhbGxlciBjb21wYXJlSWRlbnRpY2FsTWV0aG9kID0gTWV0aG9kQ2FsbGVyLm5ld1N0YXRpYyhTY3JpcHRCeXRlY29kZUFkYXB0ZXIuY2xhc3MsICJjb21wYXJlSWRlbnRpY2FsIik7CisgICAgc3RhdGljIGZpbmFsIE1ldGhvZENhbGxlciBjb21wYXJlRXF1YWxNZXRob2QgPSBNZXRob2RDYWxsZXIubmV3U3RhdGljKFNjcmlwdEJ5dGVjb2RlQWRhcHRlci5jbGFzcywgImNvbXBhcmVFcXVhbCIpOworICAgIHN0YXRpYyBmaW5hbCBNZXRob2RDYWxsZXIgY29tcGFyZU5vdEVxdWFsTWV0aG9kID0gTWV0aG9kQ2FsbGVyLm5ld1N0YXRpYyhTY3JpcHRCeXRlY29kZUFkYXB0ZXIuY2xhc3MsICJjb21wYXJlTm90RXF1YWwiKTsKKyAgICBzdGF0aWMgZmluYWwgTWV0aG9kQ2FsbGVyIGNvbXBhcmVUb01ldGhvZCA9IE1ldGhvZENhbGxlci5uZXdTdGF0aWMoU2NyaXB0Qnl0ZWNvZGVBZGFwdGVyLmNsYXNzLCAiY29tcGFyZVRvIik7CisgICAgc3RhdGljIGZpbmFsIE1ldGhvZENhbGxlciBjb21wYXJlTGVzc1RoYW5NZXRob2QgPSBNZXRob2RDYWxsZXIubmV3U3RhdGljKFNjcmlwdEJ5dGVjb2RlQWRhcHRlci5jbGFzcywgImNvbXBhcmVMZXNzVGhhbiIpOworICAgIHN0YXRpYyBmaW5hbCBNZXRob2RDYWxsZXIgY29tcGFyZUxlc3NUaGFuRXF1YWxNZXRob2QgPSBNZXRob2RDYWxsZXIubmV3U3RhdGljKFNjcmlwdEJ5dGVjb2RlQWRhcHRlci5jbGFzcywgImNvbXBhcmVMZXNzVGhhbkVxdWFsIik7CisgICAgc3RhdGljIGZpbmFsIE1ldGhvZENhbGxlciBjb21wYXJlR3JlYXRlclRoYW5NZXRob2QgPSBNZXRob2RDYWxsZXIubmV3U3RhdGljKFNjcmlwdEJ5dGVjb2RlQWRhcHRlci5jbGFzcywgImNvbXBhcmVHcmVhdGVyVGhhbiIpOworICAgIHN0YXRpYyBmaW5hbCBNZXRob2RDYWxsZXIgY29tcGFyZUdyZWF0ZXJUaGFuRXF1YWxNZXRob2QgPSBNZXRob2RDYWxsZXIubmV3U3RhdGljKFNjcmlwdEJ5dGVjb2RlQWRhcHRlci5jbGFzcywgImNvbXBhcmVHcmVhdGVyVGhhbkVxdWFsIik7CisgICAgLy9yZWdleHByCisgICAgc3RhdGljIGZpbmFsIE1ldGhvZENhbGxlciBmaW5kUmVnZXhNZXRob2QgPSBNZXRob2RDYWxsZXIubmV3U3RhdGljKFNjcmlwdEJ5dGVjb2RlQWRhcHRlci5jbGFzcywgImZpbmRSZWdleCIpOworICAgIHN0YXRpYyBmaW5hbCBNZXRob2RDYWxsZXIgbWF0Y2hSZWdleE1ldGhvZCA9IE1ldGhvZENhbGxlci5uZXdTdGF0aWMoU2NyaXB0Qnl0ZWNvZGVBZGFwdGVyLmNsYXNzLCAibWF0Y2hSZWdleCIpOworICAgIHN0YXRpYyBmaW5hbCBNZXRob2RDYWxsZXIgcmVnZXhQYXR0ZXJuID0gTWV0aG9kQ2FsbGVyLm5ld1N0YXRpYyhTY3JpcHRCeXRlY29kZUFkYXB0ZXIuY2xhc3MsICJyZWdleFBhdHRlcm4iKTsKKyAgICAvLyBzcHJlYWQgZXhwcmVzc2lvbnMKKyAgICBzdGF0aWMgZmluYWwgTWV0aG9kQ2FsbGVyIHNwcmVhZE1hcCA9IE1ldGhvZENhbGxlci5uZXdTdGF0aWMoU2NyaXB0Qnl0ZWNvZGVBZGFwdGVyLmNsYXNzLCAic3ByZWFkTWFwIik7CisgICAgc3RhdGljIGZpbmFsIE1ldGhvZENhbGxlciBkZXNwcmVhZExpc3QgPSBNZXRob2RDYWxsZXIubmV3U3RhdGljKFNjcmlwdEJ5dGVjb2RlQWRhcHRlci5jbGFzcywgImRlc3ByZWFkTGlzdCIpOworICAgIC8vIENsb3N1cmUKKyAgICBzdGF0aWMgZmluYWwgTWV0aG9kQ2FsbGVyIGdldE1ldGhvZFBvaW50ZXIgPSBNZXRob2RDYWxsZXIubmV3U3RhdGljKFNjcmlwdEJ5dGVjb2RlQWRhcHRlci5jbGFzcywgImdldE1ldGhvZFBvaW50ZXIiKTsKKyAgICBzdGF0aWMgZmluYWwgTWV0aG9kQ2FsbGVyIGludm9rZUNsb3N1cmVNZXRob2QgPSBNZXRob2RDYWxsZXIubmV3U3RhdGljKFNjcmlwdEJ5dGVjb2RlQWRhcHRlci5jbGFzcywgImludm9rZUNsb3N1cmUiKTsKKyAgICAvLyB1bmFyeSBwbHVzLCB1bmFyeSBtaW51cywgYml0d2lzZSBuZWdhdGlvbgorICAgIHN0YXRpYyBmaW5hbCBNZXRob2RDYWxsZXIgdW5hcnlQbHVzID0gTWV0aG9kQ2FsbGVyLm5ld1N0YXRpYyhTY3JpcHRCeXRlY29kZUFkYXB0ZXIuY2xhc3MsICJ1bmFyeVBsdXMiKTsKKyAgICBzdGF0aWMgZmluYWwgTWV0aG9kQ2FsbGVyIHVuYXJ5TWludXMgPSBNZXRob2RDYWxsZXIubmV3U3RhdGljKFNjcmlwdEJ5dGVjb2RlQWRhcHRlci5jbGFzcywgInVuYXJ5TWludXMiKTsKKyAgICBzdGF0aWMgZmluYWwgTWV0aG9kQ2FsbGVyIGJpdHdpc2VOZWdhdGUgPSBNZXRob2RDYWxsZXIubmV3U3RhdGljKFNjcmlwdEJ5dGVjb2RlQWRhcHRlci5jbGFzcywgImJpdHdpc2VOZWdhdGUiKTsKKworICAgIC8vIHR5cGUgY29udmVyc2lvbnMKKyAgICBzdGF0aWMgZmluYWwgTWV0aG9kQ2FsbGVyIGFzVHlwZU1ldGhvZCA9IE1ldGhvZENhbGxlci5uZXdTdGF0aWMoU2NyaXB0Qnl0ZWNvZGVBZGFwdGVyLmNsYXNzLCAiYXNUeXBlIik7CisgICAgc3RhdGljIGZpbmFsIE1ldGhvZENhbGxlciBjYXN0VG9UeXBlTWV0aG9kID0gTWV0aG9kQ2FsbGVyLm5ld1N0YXRpYyhTY3JpcHRCeXRlY29kZUFkYXB0ZXIuY2xhc3MsICJjYXN0VG9UeXBlIik7CisgICAgc3RhdGljIGZpbmFsIE1ldGhvZENhbGxlciBjcmVhdGVMaXN0TWV0aG9kID0gTWV0aG9kQ2FsbGVyLm5ld1N0YXRpYyhTY3JpcHRCeXRlY29kZUFkYXB0ZXIuY2xhc3MsICJjcmVhdGVMaXN0Iik7CisgICAgc3RhdGljIGZpbmFsIE1ldGhvZENhbGxlciBjcmVhdGVUdXBsZU1ldGhvZCA9IE1ldGhvZENhbGxlci5uZXdTdGF0aWMoU2NyaXB0Qnl0ZWNvZGVBZGFwdGVyLmNsYXNzLCAiY3JlYXRlVHVwbGUiKTsKKyAgICBzdGF0aWMgZmluYWwgTWV0aG9kQ2FsbGVyIGNyZWF0ZU1hcE1ldGhvZCA9IE1ldGhvZENhbGxlci5uZXdTdGF0aWMoU2NyaXB0Qnl0ZWNvZGVBZGFwdGVyLmNsYXNzLCAiY3JlYXRlTWFwIik7CisgICAgc3RhdGljIGZpbmFsIE1ldGhvZENhbGxlciBjcmVhdGVSYW5nZU1ldGhvZCA9IE1ldGhvZENhbGxlci5uZXdTdGF0aWMoU2NyaXB0Qnl0ZWNvZGVBZGFwdGVyLmNsYXNzLCAiY3JlYXRlUmFuZ2UiKTsKKworICAgIC8vIHdyYXBwZXIgY3JlYXRpb24gbWV0aG9kcworICAgIHN0YXRpYyBmaW5hbCBNZXRob2RDYWxsZXIgY3JlYXRlUG9qb1dyYXBwZXJNZXRob2QgPSBNZXRob2RDYWxsZXIubmV3U3RhdGljKFNjcmlwdEJ5dGVjb2RlQWRhcHRlci5jbGFzcywgImNyZWF0ZVBvam9XcmFwcGVyIik7CisgICAgc3RhdGljIGZpbmFsIE1ldGhvZENhbGxlciBjcmVhdGVHcm9vdnlPYmplY3RXcmFwcGVyTWV0aG9kID0gTWV0aG9kQ2FsbGVyLm5ld1N0YXRpYyhTY3JpcHRCeXRlY29kZUFkYXB0ZXIuY2xhc3MsICJjcmVhdGVHcm9vdnlPYmplY3RXcmFwcGVyIik7CisKKyAgICAvLyBjb25zdHJ1Y3RvciBjYWxscyB3aXRoIHRoaXMoKSBhbmQgc3VwZXIoKQorICAgIHN0YXRpYyBmaW5hbCBNZXRob2RDYWxsZXIgc2VsZWN0Q29uc3RydWN0b3JBbmRUcmFuc2Zvcm1Bcmd1bWVudHMgPSBNZXRob2RDYWxsZXIubmV3U3RhdGljKFNjcmlwdEJ5dGVjb2RlQWRhcHRlci5jbGFzcywgInNlbGVjdENvbnN0cnVjdG9yQW5kVHJhbnNmb3JtQXJndW1lbnRzIik7CisKKyAgICAvLyBleGNlcHRpb24gYmxvY2tzIGxpc3QKKyAgICBwcml2YXRlIExpc3QgZXhjZXB0aW9uQmxvY2tzID0gbmV3IEFycmF5TGlzdCgpOworCisgICAgcHJpdmF0ZSBTZXQgc3ludGhldGljU3RhdGljRmllbGRzID0gbmV3IEhhc2hTZXQoKTsKKyAgICBwcml2YXRlIGJvb2xlYW4gcGFzc2luZ0Nsb3N1cmVQYXJhbXM7CisKKyAgICBwcml2YXRlIENvbnN0cnVjdG9yTm9kZSBjb25zdHJ1Y3Rvck5vZGU7CisgICAgcHJpdmF0ZSBNZXRob2ROb2RlIG1ldGhvZE5vZGU7CisgICAgcHJpdmF0ZSBCeXRlY29kZUhlbHBlciBoZWxwZXIgPSBuZXcgQnl0ZWNvZGVIZWxwZXIobnVsbCk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gQ1JFQVRFX0RFQlVHX0lORk8gPSB0cnVlOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBDUkVBVEVfTElORV9OVU1CRVJfSU5GTyA9IHRydWU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBNQVJLX1NUQVJUID0gdHJ1ZTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBBU01fREVCVUcgPSBmYWxzZTsgLy8gYWRkIG1hcmtlciBpbiB0aGUgYnl0ZWNvZGUgdG8gc2hvdyBzb3VyY2UtYnllY29kZSByZWxhdGlvbnNoaXAKKyAgICBwcml2YXRlIGludCBsaW5lTnVtYmVyID0gLTE7CisgICAgcHJpdmF0ZSBpbnQgY29sdW1uTnVtYmVyID0gLTE7CisgICAgcHJpdmF0ZSBBU1ROb2RlIGN1cnJlbnRBU1ROb2RlID0gbnVsbDsKKworICAgIHByaXZhdGUgRHVtbXlDbGFzc0dlbmVyYXRvciBkdW1teUdlbiA9IG51bGw7CisgICAgcHJpdmF0ZSBDbGFzc1dyaXRlciBkdW1teUNsYXNzV3JpdGVyID0gbnVsbDsKKworICAgIHByaXZhdGUgQ2xhc3NOb2RlIGludGVyZmFjZUNsYXNzTG9hZGluZ0NsYXNzOworCisgICAgcHJpdmF0ZSBib29sZWFuIGltcGxpY2l0VGhpcyA9IGZhbHNlOworCisgICAgcHJpdmF0ZSBNYXAgZ2VuZXJpY1BhcmFtZXRlck5hbWVzID0gbnVsbDsKKworICAgIHB1YmxpYyBBc21DbGFzc0dlbmVyYXRvcigKKyAgICAgICAgICAgIEdlbmVyYXRvckNvbnRleHQgY29udGV4dCwgQ2xhc3NWaXNpdG9yIGNsYXNzVmlzaXRvciwKKyAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyLCBTdHJpbmcgc291cmNlRmlsZQorICAgICkgeworICAgICAgICBzdXBlcihjbGFzc0xvYWRlcik7CisgICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIHRoaXMuY3YgPSBjbGFzc1Zpc2l0b3I7CisgICAgICAgIHRoaXMuc291cmNlRmlsZSA9IHNvdXJjZUZpbGU7CisKKyAgICAgICAgdGhpcy5kdW1teUNsYXNzV3JpdGVyID0gbmV3IENsYXNzV3JpdGVyKHRydWUpOworICAgICAgICBkdW1teUdlbiA9IG5ldyBEdW1teUNsYXNzR2VuZXJhdG9yKGNvbnRleHQsIGR1bW15Q2xhc3NXcml0ZXIsIGNsYXNzTG9hZGVyLCBzb3VyY2VGaWxlKTsKKyAgICAgICAgY29tcGlsZVN0YWNrID0gbmV3IENvbXBpbGVTdGFjaygpOworICAgICAgICBnZW5lcmljUGFyYW1ldGVyTmFtZXMgPSBuZXcgSGFzaE1hcCgpOworICAgIH0KKworICAgIHByb3RlY3RlZCBTb3VyY2VVbml0IGdldFNvdXJjZVVuaXQoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworCisgICAgLy8gR3Jvb3Z5Q2xhc3NWaXNpdG9yIGludGVyZmFjZQorICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHB1YmxpYyB2b2lkIHZpc2l0Q2xhc3MoQ2xhc3NOb2RlIGNsYXNzTm9kZSkgeworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW50aGV0aWNTdGF0aWNGaWVsZHMuY2xlYXIoKTsKKyAgICAgICAgICAgIHRoaXMuY2xhc3NOb2RlID0gY2xhc3NOb2RlOworICAgICAgICAgICAgdGhpcy5vdXRlcm1vc3RDbGFzcyA9IG51bGw7CisgICAgICAgICAgICB0aGlzLmludGVybmFsQ2xhc3NOYW1lID0gQnl0ZWNvZGVIZWxwZXIuZ2V0Q2xhc3NJbnRlcm5hbE5hbWUoY2xhc3NOb2RlKTsKKworICAgICAgICAgICAgdGhpcy5pbnRlcm5hbEJhc2VDbGFzc05hbWUgPSBCeXRlY29kZUhlbHBlci5nZXRDbGFzc0ludGVybmFsTmFtZShjbGFzc05vZGUuZ2V0U3VwZXJDbGFzcygpKTsKKworICAgICAgICAgICAgY3YudmlzaXQoCisgICAgICAgICAgICAgICAgICAgIGdldEJ5dGVjb2RlVmVyc2lvbigpLAorICAgICAgICAgICAgICAgICAgICBjbGFzc05vZGUuZ2V0TW9kaWZpZXJzKCksCisgICAgICAgICAgICAgICAgICAgIGludGVybmFsQ2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICAgICBCeXRlY29kZUhlbHBlci5nZXRHZW5lcmljc1NpZ25hdHVyZShjbGFzc05vZGUpLAorICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbEJhc2VDbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgIEJ5dGVjb2RlSGVscGVyLmdldENsYXNzSW50ZXJuYWxOYW1lcyhjbGFzc05vZGUuZ2V0SW50ZXJmYWNlcygpKQorICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGN2LnZpc2l0U291cmNlKHNvdXJjZUZpbGUsIG51bGwpOworICAgICAgICAgICAgdmlzaXRBbm5vdGF0aW9ucyhjbGFzc05vZGUsIGN2KTsKKworICAgICAgICAgICAgaWYgKGNsYXNzTm9kZS5pc0ludGVyZmFjZSgpKSB7CisgICAgICAgICAgICAgICAgQ2xhc3NOb2RlIG93bmVyID0gY2xhc3NOb2RlOworICAgICAgICAgICAgICAgIGlmIChvd25lciBpbnN0YW5jZW9mIElubmVyQ2xhc3NOb2RlKSB7CisgICAgICAgICAgICAgICAgICAgIG93bmVyID0gb3duZXIuZ2V0T3V0ZXJDbGFzcygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTdHJpbmcgb3V0ZXJDbGFzc05hbWUgPSBvd25lci5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBvdXRlckNsYXNzTmFtZSArICIkIiArIGNvbnRleHQuZ2V0TmV4dElubmVyQ2xhc3NJZHgoKTsKKyAgICAgICAgICAgICAgICBpbnRlcmZhY2VDbGFzc0xvYWRpbmdDbGFzcyA9IG5ldyBJbm5lckNsYXNzTm9kZShvd25lciwgbmFtZSwgNDEyOCwgQ2xhc3NIZWxwZXIuT0JKRUNUX1RZUEUpOworCisgICAgICAgICAgICAgICAgc3VwZXIudmlzaXRDbGFzcyhjbGFzc05vZGUpOworICAgICAgICAgICAgICAgIGNyZWF0ZUludGVyZmFjZVN5bnRoZXRpY1N0YXRpY0ZpZWxkcygpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdXBlci52aXNpdENsYXNzKGNsYXNzTm9kZSk7CisgICAgICAgICAgICAgICAgaWYgKCFjbGFzc05vZGUuZGVjbGFyZXNJbnRlcmZhY2UoQ2xhc3NIZWxwZXIuR0VORVJBVEVEX0NMT1NVUkVfVHlwZS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGNyZWF0ZU1vcE1ldGhvZHMoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY3JlYXRlU3ludGhldGljU3RhdGljRmllbGRzKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGlubmVyQ2xhc3Nlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBDbGFzc05vZGUgaW5uZXJDbGFzcyA9IChDbGFzc05vZGUpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIFN0cmluZyBpbm5lckNsYXNzTmFtZSA9IGlubmVyQ2xhc3MuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIFN0cmluZyBpbm5lckNsYXNzSW50ZXJuYWxOYW1lID0gQnl0ZWNvZGVIZWxwZXIuZ2V0Q2xhc3NJbnRlcm5hbE5hbWUoaW5uZXJDbGFzc05hbWUpOworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gaW5uZXJDbGFzc05hbWUubGFzdEluZGV4T2YoJyQnKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIGlubmVyQ2xhc3NOYW1lID0gaW5uZXJDbGFzc05hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFN0cmluZyBvdXRlckNsYXNzTmFtZSA9IGludGVybmFsQ2xhc3NOYW1lOyAvLyBkZWZhdWx0IGZvciBpbm5lciBjbGFzc2VzCisgICAgICAgICAgICAgICAgTWV0aG9kTm9kZSBlbmNsb3NpbmdNZXRob2QgPSBpbm5lckNsYXNzLmdldEVuY2xvc2luZ01ldGhvZCgpOworICAgICAgICAgICAgICAgIGlmIChlbmNsb3NpbmdNZXRob2QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBsb2NhbCBpbm5lciBjbGFzc2VzIGRvIG5vdCBzcGVjaWZ5IHRoZSBvdXRlciBjbGFzcyBuYW1lCisgICAgICAgICAgICAgICAgICAgIG91dGVyQ2xhc3NOYW1lID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaW5uZXJDbGFzc05hbWUgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjdi52aXNpdElubmVyQ2xhc3MoCisgICAgICAgICAgICAgICAgICAgICAgICBpbm5lckNsYXNzSW50ZXJuYWxOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZXJDbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbm5lckNsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlubmVyQ2xhc3MuZ2V0TW9kaWZpZXJzKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy9UT0RPOiBhbiBpbm5lciBjbGFzcyBzaG91bGQgaGF2ZSBhbiBlbnRyeSBvZiBpdHNlbGYKKyAgICAgICAgICAgIGN2LnZpc2l0RW5kKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEdyb292eVJ1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5zZXRNb2R1bGUoY2xhc3NOb2RlLmdldE1vZHVsZSgpKTsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEdlbmVyaWNUeXBlKEdlbmVyaWNzVHlwZSBnZW5lcmljc1R5cGUpIHsKKyAgICAgICAgQ2xhc3NOb2RlIHR5cGUgPSBnZW5lcmljc1R5cGUuZ2V0VHlwZSgpOworICAgICAgICBnZW5lcmljUGFyYW1ldGVyTmFtZXMucHV0KHR5cGUuZ2V0TmFtZSgpLCBnZW5lcmljc1R5cGUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjcmVhdGVNb3BNZXRob2RzKCkgeworICAgICAgICB2aXNpdE1vcE1ldGhvZExpc3QoY2xhc3NOb2RlLmdldE1ldGhvZHMoKSwgdHJ1ZSk7CisgICAgICAgIHZpc2l0TW9wTWV0aG9kTGlzdChjbGFzc05vZGUuZ2V0U3VwZXJDbGFzcygpLmdldEFsbERlY2xhcmVkTWV0aG9kcygpLCBmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmdbXSBidWlsZEV4Y2VwdGlvbnMoQ2xhc3NOb2RlW10gZXhjZXB0aW9ucykgeworICAgICAgICBpZiAoZXhjZXB0aW9ucyA9PSBudWxsKSByZXR1cm4gbnVsbDsKKyAgICAgICAgU3RyaW5nW10gcmV0ID0gbmV3IFN0cmluZ1tleGNlcHRpb25zLmxlbmd0aF07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhjZXB0aW9ucy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgcmV0W2ldID0gQnl0ZWNvZGVIZWxwZXIuZ2V0Q2xhc3NJbnRlcm5hbE5hbWUoZXhjZXB0aW9uc1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBmaWx0ZXJzIGEgbGlzdCBvZiBtZXRob2QgZm9yIE1PUCBtZXRob2RzLiBGb3IgYWxsIG1ldGhvZHMgdGhhdCBhcmUgbm8KKyAgICAgKiBNT1AgbWV0aG9kcyBhIE1PUCBtZXRob2QgaXMgY3JlYXRlZCBpZiB0aGUgbWV0aG9kIGlzIG5vdCBwdWJsaWMgYW5kIHRoZQorICAgICAqIGNhbGwgd291bGQgYmUgYSBjYWxsIG9uICJ0aGlzIiAoaXNUaGlzID09IHRydWUpLiBJZiB0aGUgY2FsbCBpcyBub3Qgb24KKyAgICAgKiAidGhpcyIsIHRoZW4gdGhlIGNhbGwgaXMgYSBjYWxsIG9uICJzdXBlciIgYW5kIGFsbCBtZXRob2RzIGFyZSB1c2VkLAorICAgICAqIHVubGVzcyB0aGV5IGFyZSBhbHJlYWR5IGEgTU9QIG1ldGhvZAorICAgICAqCisgICAgICogQHBhcmFtIG1ldGhvZHMgdW5maWx0ZXJlZCBsaXN0IG9mIG1ldGhvZHMgZm9yIE1PUAorICAgICAqIEBwYXJhbSBpc1RoaXMgIGlmIHRydWUsIHRoZW4gd2UgYXJlIGNyZWF0aW5nIGEgTU9QIG1ldGhvZCBvbiAidGhpcyIsICJzdXBlciIgZWxzZQorICAgICAqIEBzZWUgI2dlbmVyYXRlTW9wQ2FsbHMoTGlua2VkTGlzdCxib29sZWFuKQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB2aXNpdE1vcE1ldGhvZExpc3QoTGlzdCBtZXRob2RzLCBib29sZWFuIGlzVGhpcykgeworICAgICAgICBIYXNoTWFwIG1vcHMgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICBjbGFzcyBLZXkgeworICAgICAgICAgICAgaW50IGhhc2ggPSAwOworICAgICAgICAgICAgU3RyaW5nIG5hbWU7CisgICAgICAgICAgICBQYXJhbWV0ZXJbXSBwYXJhbXM7CisKKyAgICAgICAgICAgIEtleShTdHJpbmcgbmFtZSwgUGFyYW1ldGVyW10gcGFyYW1zKSB7CisgICAgICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgICAgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtczsKKyAgICAgICAgICAgICAgICBoYXNoID0gbmFtZS5oYXNoQ29kZSgpIDw8IDIgKyBwYXJhbXMubGVuZ3RoOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBoYXNoOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICAgICAgICAgIEtleSBvdGhlciA9IChLZXkpIG9iajsKKyAgICAgICAgICAgICAgICByZXR1cm4gb3RoZXIubmFtZS5lcXVhbHMobmFtZSkgJiYgZXF1YWxQYXJhbWV0ZXJUeXBlcyhvdGhlci5wYXJhbXMscGFyYW1zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBMaW5rZWRMaXN0IG1vcENhbGxzID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gbWV0aG9kcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIE1ldGhvZE5vZGUgbW4gPSAoTWV0aG9kTm9kZSkgaXRlci5uZXh0KCk7CisgICAgICAgICAgICBpZiAoKG1uLmdldE1vZGlmaWVycygpICYgQUNDX0FCU1RSQUNUKSAhPSAwKSBjb250aW51ZTsKKyAgICAgICAgICAgIC8vIG5vIHRoaXMkIG1ldGhvZHMgZm9yIHByb3RlY3RlZC9wdWJsaWMgaXNUaGlzPXRydWUKKyAgICAgICAgICAgIC8vIHN1cGVyJCBtZXRob2QgZm9yIHByb3RlY3RlZC9wdWJsaWMgaXNUaGlzPWZhbHNlCisgICAgICAgICAgICAvLyAtLT4gcmVzdWx0cyBpbiBYT1IKKyAgICAgICAgICAgIGlmIChpc1RoaXMgXiAobW4uZ2V0TW9kaWZpZXJzKCkgJiAoQUNDX1BVQkxJQyB8IEFDQ19QUk9URUNURUQpKSA9PSAwKSBjb250aW51ZTsKKyAgICAgICAgICAgIFN0cmluZyBtZXRob2ROYW1lID0gbW4uZ2V0TmFtZSgpOworICAgICAgICAgICAgaWYgKGlzTW9wTWV0aG9kKG1ldGhvZE5hbWUpKSB7CisgICAgICAgICAgICAgICAgbW9wcy5wdXQobmV3IEtleShtZXRob2ROYW1lLCBtbi5nZXRQYXJhbWV0ZXJzKCkpLCBtbik7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobWV0aG9kTmFtZS5zdGFydHNXaXRoKCI8IikpIGNvbnRpbnVlOworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBnZXRNb3BNZXRob2ROYW1lKG1uLCBpc1RoaXMpOworICAgICAgICAgICAgS2V5IGtleSA9IG5ldyBLZXkobmFtZSwgbW4uZ2V0UGFyYW1ldGVycygpKTsKKyAgICAgICAgICAgIGlmIChtb3BzLmNvbnRhaW5zS2V5KGtleSkpIGNvbnRpbnVlOworICAgICAgICAgICAgbW9wcy5wdXQoa2V5LCBtbik7CisgICAgICAgICAgICBtb3BDYWxscy5hZGQobW4pOworICAgICAgICB9CisgICAgICAgIGdlbmVyYXRlTW9wQ2FsbHMobW9wQ2FsbHMsIGlzVGhpcyk7CisgICAgICAgIG1vcENhbGxzLmNsZWFyKCk7CisgICAgICAgIG1vcHMuY2xlYXIoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gZXF1YWxQYXJhbWV0ZXJUeXBlcyhQYXJhbWV0ZXJbXSBwMSwgUGFyYW1ldGVyW10gcDIpIHsKKyAgICAgICAgaWYgKHAxLmxlbmd0aCE9cDIubGVuZ3RoKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxwMS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKCFwMVtpXS5nZXRUeXBlKCkuZXF1YWxzKHAyW2ldLmdldFR5cGUoKSkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZW5lcmF0ZXMgYSBNZXRhIE9iamVjdCBQcm90b2NvbGwgbWV0aG9kLCB0aGF0IGlzIHVzZWQgdG8gY2FsbCBhIG5vbiBwdWJsaWMKKyAgICAgKiBtZXRob2QsIG9yIHRvIG1ha2UgYSBjYWxsIHRvIHN1cGVyLgorICAgICAqCisgICAgICogQHBhcmFtIG1vcENhbGxzIGxpc3Qgb2YgbWV0aG9kcyBhIG1vcCBjYWxsIG1ldGhvZCBzaG91bGQgYmUgZ2VuZXJhdGVkIGZvcgorICAgICAqIEBwYXJhbSB1c2VUaGlzICB0cnVlIGlmICJ0aGlzIiBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIG5hbWluZworICAgICAqLworICAgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZU1vcENhbGxzKExpbmtlZExpc3QgbW9wQ2FsbHMsIGJvb2xlYW4gdXNlVGhpcykgeworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtb3BDYWxscy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIE1ldGhvZE5vZGUgbWV0aG9kID0gKE1ldGhvZE5vZGUpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBnZXRNb3BNZXRob2ROYW1lKG1ldGhvZCwgdXNlVGhpcyk7CisgICAgICAgICAgICBQYXJhbWV0ZXJbXSBwYXJhbWV0ZXJzID0gbWV0aG9kLmdldFBhcmFtZXRlcnMoKTsKKyAgICAgICAgICAgIFN0cmluZyBtZXRob2REZXNjcmlwdG9yID0gQnl0ZWNvZGVIZWxwZXIuZ2V0TWV0aG9kRGVzY3JpcHRvcihtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLCBtZXRob2QuZ2V0UGFyYW1ldGVycygpKTsKKyAgICAgICAgICAgIG12ID0gY3YudmlzaXRNZXRob2QoT3Bjb2Rlcy5BQ0NfUFVCTElDICYgT3Bjb2Rlcy5BQ0NfU1lOVEhFVElDLCBuYW1lLCBtZXRob2REZXNjcmlwdG9yLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIG12LnZpc2l0VmFySW5zbihBTE9BRCwgMCk7CisgICAgICAgICAgICBCeXRlY29kZUhlbHBlciBoZWxwZXIgPSBuZXcgQnl0ZWNvZGVIZWxwZXIobXYpOworICAgICAgICAgICAgaW50IG5ld1JlZ2lzdGVyID0gMTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIENsYXNzTm9kZSB0eXBlID0gcGFyYW1ldGVyc1tpXS5nZXRUeXBlKCk7CisgICAgICAgICAgICAgICAgaGVscGVyLmxvYWQocGFyYW1ldGVyc1tpXS5nZXRUeXBlKCksIG5ld1JlZ2lzdGVyKTsKKyAgICAgICAgICAgICAgICAvLyBpbmNyZW1lbnQgdG8gbmV4dCByZWdpc3RlciwgZG91YmxlL2xvbmcgYXJlIHVzaW5nIHR3byBwbGFjZXMKKyAgICAgICAgICAgICAgICBuZXdSZWdpc3RlcisrOworICAgICAgICAgICAgICAgIGlmICh0eXBlID09IENsYXNzSGVscGVyLmRvdWJsZV9UWVBFIHx8IHR5cGUgPT0gQ2xhc3NIZWxwZXIubG9uZ19UWVBFKSBuZXdSZWdpc3RlcisrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbXYudmlzaXRNZXRob2RJbnNuKElOVk9LRVNQRUNJQUwsIEJ5dGVjb2RlSGVscGVyLmdldENsYXNzSW50ZXJuYWxOYW1lKG1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpKSwgbWV0aG9kLmdldE5hbWUoKSwgbWV0aG9kRGVzY3JpcHRvcik7CisgICAgICAgICAgICBoZWxwZXIuZG9SZXR1cm4obWV0aG9kLmdldFJldHVyblR5cGUoKSk7CisgICAgICAgICAgICBtdi52aXNpdE1heHMoMCwgMCk7CisgICAgICAgICAgICBtdi52aXNpdEVuZCgpOworICAgICAgICAgICAgY2xhc3NOb2RlLmFkZE1ldGhvZChuYW1lLCBPcGNvZGVzLkFDQ19QVUJMSUMgJiBPcGNvZGVzLkFDQ19TWU5USEVUSUMsIG1ldGhvZC5nZXRSZXR1cm5UeXBlKCksIHBhcmFtZXRlcnMsIG51bGwsIG51bGwpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogY3JlYXRlcyBhIE1PUCBtZXRob2QgbmFtZSBmcm9tIGEgbWV0aG9kCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWV0aG9kICB0aGUgbWV0aG9kIHRvIGJlIGNhbGxlZCBieSB0aGUgbW9wIG1ldGhvZAorICAgICAqIEBwYXJhbSB1c2VUaGlzIGlmIHRydWUsIHRoZW4gaXQgaXMgYSBjYWxsIG9uICJ0aGlzIiwgInN1cGVyIiBlbHNlCisgICAgICogQHJldHVybiB0aGUgbW9wIG1ldGhvZCBuYW1lCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TW9wTWV0aG9kTmFtZShNZXRob2ROb2RlIG1ldGhvZCwgYm9vbGVhbiB1c2VUaGlzKSB7CisgICAgICAgIENsYXNzTm9kZSBkZWNsYXJpbmdOb2RlID0gbWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCk7CisgICAgICAgIGludCBkaXN0YW5jZSA9IDA7CisgICAgICAgIGZvciAoOyBkZWNsYXJpbmdOb2RlICE9IG51bGw7IGRlY2xhcmluZ05vZGUgPSBkZWNsYXJpbmdOb2RlLmdldFN1cGVyQ2xhc3MoKSkgeworICAgICAgICAgICAgZGlzdGFuY2UrKzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKHVzZVRoaXMgPyAidGhpcyIgOiAic3VwZXIiKSArICIkIiArIGRpc3RhbmNlICsgIiQiICsgbWV0aG9kLmdldE5hbWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBtZXRob2QgdG8gZGV0ZXJtaW5lIGlmIGEgbWV0aG9kIGlzIGEgTU9QIG1ldGhvZC4gVGhpcyBpcyBkb25lIGJ5IHRoZQorICAgICAqIG1ldGhvZCBuYW1lLiBJZiB0aGUgbmFtZSBzdGFydHMgd2l0aCAidGhpcyQiIG9yICJzdXBlciQiLCB0aGVuIGl0IGlzCisgICAgICogYSBNT1AgbWV0aG9kCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWV0aG9kTmFtZSBuYW1lIG9mIHRoZSBtZXRob2QgdG8gdGVzdAorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbWV0aG9kIGlzIGEgTU9QIG1ldGhvZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc01vcE1ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSkgeworICAgICAgICByZXR1cm4gbWV0aG9kTmFtZS5zdGFydHNXaXRoKCJ0aGlzJCIpIHx8CisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZS5zdGFydHNXaXRoKCJzdXBlciQiKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB2aXNpdENvbnN0cnVjdG9yT3JNZXRob2QoTWV0aG9kTm9kZSBub2RlLCBib29sZWFuIGlzQ29uc3RydWN0b3IpIHsKKyAgICAgICAgUGFyYW1ldGVyW10gcGFyYW1ldGVycyA9IG5vZGUuZ2V0UGFyYW1ldGVycygpOworICAgICAgICBTdHJpbmcgbWV0aG9kVHlwZSA9IEJ5dGVjb2RlSGVscGVyLmdldE1ldGhvZERlc2NyaXB0b3Iobm9kZS5nZXRSZXR1cm5UeXBlKCksIHBhcmFtZXRlcnMpOworCisgICAgICAgIFN0cmluZyBzaWduYXR1cmUgPSBCeXRlY29kZUhlbHBlci5nZXRHZW5lcmljc01ldGhvZFNpZ25hdHVyZShub2RlKTsKKyAgICAgICAgaW50IG1vZGlmaWVycyA9IG5vZGUuZ2V0TW9kaWZpZXJzKCk7CisgICAgICAgIGlmIChpc1ZhcmdzKG5vZGUuZ2V0UGFyYW1ldGVycygpKSkgbW9kaWZpZXJzIHw9IE9wY29kZXMuQUNDX1ZBUkFSR1M7CisgICAgICAgIG12ID0gY3YudmlzaXRNZXRob2QobW9kaWZpZXJzLCBub2RlLmdldE5hbWUoKSwgbWV0aG9kVHlwZSwgc2lnbmF0dXJlLCBidWlsZEV4Y2VwdGlvbnMobm9kZS5nZXRFeGNlcHRpb25zKCkpKTsKKyAgICAgICAgdmlzaXRBbm5vdGF0aW9ucyhub2RlLCBtdik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdmlzaXRQYXJhbWV0ZXJBbm5vdGF0aW9ucyhwYXJhbWV0ZXJzW2ldLCBpLCBtdik7CisgICAgICAgIH0KKyAgICAgICAgaGVscGVyID0gbmV3IEJ5dGVjb2RlSGVscGVyKG12KTsKKyAgICAgICAgaWYgKCFub2RlLmlzQWJzdHJhY3QoKSkgeworICAgICAgICAgICAgU3RhdGVtZW50IGNvZGUgPSBub2RlLmdldENvZGUoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGlzQ29uc3RydWN0b3IgJiYgKGNvZGUgPT0gbnVsbCB8fCAhKChDb25zdHJ1Y3Rvck5vZGUpIG5vZGUpLmZpcnN0U3RhdGVtZW50SXNTcGVjaWFsQ29uc3RydWN0b3JDYWxsKCkpKSB7CisgICAgICAgICAgICAgICAgLy8gaW52b2tlcyB0aGUgc3VwZXIgY2xhc3MgY29uc3RydWN0b3IKKyAgICAgICAgICAgICAgICBtdi52aXNpdFZhckluc24oQUxPQUQsIDApOworICAgICAgICAgICAgICAgIG12LnZpc2l0TWV0aG9kSW5zbihJTlZPS0VTUEVDSUFMLCBCeXRlY29kZUhlbHBlci5nZXRDbGFzc0ludGVybmFsTmFtZShjbGFzc05vZGUuZ2V0U3VwZXJDbGFzcygpKSwgIjxpbml0PiIsICIoKVYiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29tcGlsZVN0YWNrLmluaXQobm9kZS5nZXRWYXJpYWJsZVNjb3BlKCksIHBhcmFtZXRlcnMsIG12LCBjbGFzc05vZGUpOworCisgICAgICAgICAgICAvLyBlbnN1cmUgd2Ugc2F2ZSB0aGUgY3VycmVudCAobWV0YSkgY2xhc3MgaW4gYSByZWdpc3RlcgorICAgICAgICAgICAgKG5ldyBDbGFzc0V4cHJlc3Npb24oY2xhc3NOb2RlKSkudmlzaXQodGhpcyk7CisgICAgICAgICAgICBtdi52aXNpdEluc24oUE9QKTsKKyAgICAgICAgICAgIChuZXcgQ2xhc3NFeHByZXNzaW9uKENsYXNzSGVscGVyLk1FVEFDTEFTU19UWVBFKSkudmlzaXQodGhpcyk7CisgICAgICAgICAgICBtdi52aXNpdEluc24oUE9QKTsKKworICAgICAgICAgICAgLy8gaGFuZGxlIGJvZHkKKyAgICAgICAgICAgIHN1cGVyLnZpc2l0Q29uc3RydWN0b3JPck1ldGhvZChub2RlLCBpc0NvbnN0cnVjdG9yKTsKKyAgICAgICAgICAgIGlmICghb3V0cHV0UmV0dXJuIHx8IG5vZGUuaXNWb2lkTWV0aG9kKCkpIHsKKyAgICAgICAgICAgICAgICBtdi52aXNpdEluc24oUkVUVVJOKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbXBpbGVTdGFjay5jbGVhcigpOworCisgICAgICAgICAgICAvLyBsZXRzIGRvIGFsbCB0aGUgZXhjZXB0aW9uIGJsb2NrcworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gZXhjZXB0aW9uQmxvY2tzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIFJ1bm5hYmxlIHJ1bm5hYmxlID0gKFJ1bm5hYmxlKSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICBydW5uYWJsZS5ydW4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGV4Y2VwdGlvbkJsb2Nrcy5jbGVhcigpOworCisgICAgICAgICAgICBtdi52aXNpdE1heHMoMCwgMCk7CisgICAgICAgIH0KKyAgICAgICAgbXYudmlzaXRFbmQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNWYXJncyhQYXJhbWV0ZXJbXSBwKSB7CisgICAgICAgIGlmIChwLmxlbmd0aD09MCkgcmV0dXJuIGZhbHNlOworICAgICAgICBDbGFzc05vZGUgY2xhenogPSBwW3AubGVuZ3RoLTFdLmdldFR5cGUoKTsKKyAgICAgICAgcmV0dXJuIChjbGF6ei5pc0FycmF5KCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0Q29uc3RydWN0b3IoQ29uc3RydWN0b3JOb2RlIG5vZGUpIHsKKyAgICAgICAgdGhpcy5jb25zdHJ1Y3Rvck5vZGUgPSBub2RlOworICAgICAgICB0aGlzLm1ldGhvZE5vZGUgPSBudWxsOworICAgICAgICBvdXRwdXRSZXR1cm4gPSBmYWxzZTsKKyAgICAgICAgc3VwZXIudmlzaXRDb25zdHJ1Y3Rvcihub2RlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdE1ldGhvZChNZXRob2ROb2RlIG5vZGUpIHsKKyAgICAgICAgdGhpcy5jb25zdHJ1Y3Rvck5vZGUgPSBudWxsOworICAgICAgICB0aGlzLm1ldGhvZE5vZGUgPSBub2RlOworICAgICAgICBvdXRwdXRSZXR1cm4gPSBmYWxzZTsKKworICAgICAgICBzdXBlci52aXNpdE1ldGhvZChub2RlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEZpZWxkKEZpZWxkTm9kZSBmaWVsZE5vZGUpIHsKKyAgICAgICAgb25MaW5lTnVtYmVyKGZpZWxkTm9kZSwgInZpc2l0RmllbGQ6ICIgKyBmaWVsZE5vZGUuZ2V0TmFtZSgpKTsKKyAgICAgICAgQ2xhc3NOb2RlIHQgPSBmaWVsZE5vZGUuZ2V0VHlwZSgpOworICAgICAgICBTdHJpbmcgc2lnbmF0dXJlID0gaGVscGVyLmdldEdlbmVyaWNzQm91bmRzKHQpOworICAgICAgICBGaWVsZFZpc2l0b3IgZnYgPSBjdi52aXNpdEZpZWxkKAorICAgICAgICAgICAgICAgIGZpZWxkTm9kZS5nZXRNb2RpZmllcnMoKSwKKyAgICAgICAgICAgICAgICBmaWVsZE5vZGUuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgIEJ5dGVjb2RlSGVscGVyLmdldFR5cGVEZXNjcmlwdGlvbih0KSwKKyAgICAgICAgICAgICAgICBzaWduYXR1cmUsIC8vZmllbGRWYWx1ZSwgIC8vYnIgIGFsbCB0aGUgc3VkZGVuIHRoYXQgb25lIGNhbm5vdCBpbml0IHRoZSBmaWVsZCBoZXJlLiBpbml0IGlzIGRvbmUgaW4gc3RhdGljIGluaXRpbGl6ZXIgYW5kIGluc3RhY2UgaW50aWFsaXplci4KKyAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgdmlzaXRBbm5vdGF0aW9ucyhmaWVsZE5vZGUsIGZ2KTsKKyAgICAgICAgZnYudmlzaXRFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFByb3BlcnR5KFByb3BlcnR5Tm9kZSBzdGF0ZW1lbnQpIHsKKyAgICAgICAgLy8gdGhlIHZlcmlmeWVyIGNyZWF0ZWQgdGhlIGZpZWxkIGFuZCB0aGUgc2V0dGVyL2dldHRlciBtZXRob2RzLCBzbyBoZXJlIGlzCisgICAgICAgIC8vIG5vdCByZWFsbHkgc29tZXRoaW5nIHRvIGRvCisgICAgICAgIG9uTGluZU51bWJlcihzdGF0ZW1lbnQsICJ2aXNpdFByb3BlcnR5OiIgKyBzdGF0ZW1lbnQuZ2V0RmllbGQoKS5nZXROYW1lKCkpOworICAgICAgICB0aGlzLm1ldGhvZE5vZGUgPSBudWxsOworICAgIH0KKworICAgIC8vIEdyb292eUNvZGVWaXNpdG9yIGludGVyZmFjZQorICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLy8gU3RhdGVtZW50cworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgcHJvdGVjdGVkIHZvaWQgdmlzaXRTdGF0ZW1lbnQoU3RhdGVtZW50IHN0YXRlbWVudCkgeworICAgICAgICBTdHJpbmcgbmFtZSA9IHN0YXRlbWVudC5nZXRTdGF0ZW1lbnRMYWJlbCgpOworICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICBMYWJlbCBsYWJlbCA9IGNvbXBpbGVTdGFjay5jcmVhdGVMb2NhbExhYmVsKG5hbWUpOworICAgICAgICAgICAgbXYudmlzaXRMYWJlbChsYWJlbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEJsb2NrU3RhdGVtZW50KEJsb2NrU3RhdGVtZW50IGJsb2NrKSB7CisgICAgICAgIG9uTGluZU51bWJlcihibG9jaywgInZpc2l0QmxvY2tTdGF0ZW1lbnQiKTsKKyAgICAgICAgdmlzaXRTdGF0ZW1lbnQoYmxvY2spOworCisgICAgICAgIGNvbXBpbGVTdGFjay5wdXNoVmFyaWFibGVTY29wZShibG9jay5nZXRWYXJpYWJsZVNjb3BlKCkpOworICAgICAgICBzdXBlci52aXNpdEJsb2NrU3RhdGVtZW50KGJsb2NrKTsKKyAgICAgICAgY29tcGlsZVN0YWNrLnBvcCgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB2aXNpdEV4cHJlc3Npb25PclN0YXRlbWVudChPYmplY3QgbykgeworICAgICAgICBpZiAobyA9PSBFbXB0eUV4cHJlc3Npb24uSU5TVEFOQ0UpIHJldHVybjsKKyAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBFeHByZXNzaW9uKSB7CisgICAgICAgICAgICBFeHByZXNzaW9uIGV4cHIgPSAoRXhwcmVzc2lvbikgbzsKKyAgICAgICAgICAgIHZpc2l0QW5kQXV0b2JveEJvb2xlYW4oZXhwcik7CisgICAgICAgICAgICBpZiAoaXNQb3BSZXF1aXJlZChleHByKSkgbXYudmlzaXRJbnNuKFBPUCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAoKFN0YXRlbWVudCkgbykudmlzaXQodGhpcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmlzaXRGb3JMb29wV2l0aENsb3N1cmVMaXN0KEZvclN0YXRlbWVudCBsb29wKSB7CisgICAgICAgIGNvbXBpbGVTdGFjay5wdXNoTG9vcChsb29wLmdldFZhcmlhYmxlU2NvcGUoKSwgbG9vcC5nZXRTdGF0ZW1lbnRMYWJlbCgpKTsKKworICAgICAgICBDbG9zdXJlTGlzdEV4cHJlc3Npb24gY2xFeHByID0gKENsb3N1cmVMaXN0RXhwcmVzc2lvbikgbG9vcC5nZXRDb2xsZWN0aW9uRXhwcmVzc2lvbigpOworICAgICAgICBjb21waWxlU3RhY2sucHVzaFZhcmlhYmxlU2NvcGUoY2xFeHByLmdldFZhcmlhYmxlU2NvcGUoKSk7CisKKyAgICAgICAgTGlzdCBleHByZXNzaW9ucyA9IGNsRXhwci5nZXRFeHByZXNzaW9ucygpOworICAgICAgICBpbnQgc2l6ZSA9IGV4cHJlc3Npb25zLnNpemUoKTsKKworICAgICAgICAvLyBtaWRkbGUgZWxlbWVudCBpcyBjb25kaXRpb24sIGxvd2VyIGhhbGYgaXMgaW5pdCwgaGlnaGVyIGhhbGYgaXMgaW5jcmVtZW50CisgICAgICAgIGludCBjb25kSW5kZXggPSAoc2l6ZSAtIDEpIC8gMjsKKworICAgICAgICAvLyB2aXNpdCBpbml0CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29uZEluZGV4OyBpKyspIHsKKyAgICAgICAgICAgIHZpc2l0RXhwcmVzc2lvbk9yU3RhdGVtZW50KGV4cHJlc3Npb25zLmdldChpKSk7CisgICAgICAgIH0KKworICAgICAgICBMYWJlbCBjb250aW51ZUxhYmVsID0gY29tcGlsZVN0YWNrLmdldENvbnRpbnVlTGFiZWwoKTsKKyAgICAgICAgTGFiZWwgYnJlYWtMYWJlbCA9IGNvbXBpbGVTdGFjay5nZXRCcmVha0xhYmVsKCk7CisKKyAgICAgICAgbXYudmlzaXRMYWJlbChjb250aW51ZUxhYmVsKTsKKworICAgICAgICAvLyB2aXNpdCBjb25kaXRpb24gbGVhdmUgYm9vbGVhbiBvbiBzdGFjaworICAgICAgICB7CisgICAgICAgICAgICBFeHByZXNzaW9uIGNvbmRFeHByID0gKEV4cHJlc3Npb24pIGV4cHJlc3Npb25zLmdldChjb25kSW5kZXgpOworICAgICAgICAgICAgaWYgKGNvbmRFeHByID09IEVtcHR5RXhwcmVzc2lvbi5JTlNUQU5DRSkgeworICAgICAgICAgICAgICAgIG12LnZpc2l0SW50SW5zbihCSVBVU0gsIDApOworICAgICAgICAgICAgfSBlbHNlIGlmIChpc0NvbXBhcmlzb25FeHByZXNzaW9uKGNvbmRFeHByKSkgeworICAgICAgICAgICAgICAgIGNvbmRFeHByLnZpc2l0KHRoaXMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB2aXNpdEFuZEF1dG9ib3hCb29sZWFuKGNvbmRFeHByKTsKKyAgICAgICAgICAgICAgICBoZWxwZXIudW5ib3goQ2xhc3NIZWxwZXIuYm9vbGVhbl9UWVBFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBqdW1wIGlmIHdlIGRvbid0IHdhbnQgdG8gY29udGludWUKKyAgICAgICAgLy8gbm90ZTogaWZlcSB0ZXN0cyBmb3IgPT0wLCBhIGJvb2xlYW4gaXMgMCBpZiBpdCBpcyBmYWxzZQorICAgICAgICBtdi52aXNpdEp1bXBJbnNuKElGRVEsIGJyZWFrTGFiZWwpOworCisgICAgICAgIC8vIEdlbmVyYXRlIHRoZSBsb29wIGJvZHkKKyAgICAgICAgbG9vcC5nZXRMb29wQmxvY2soKS52aXNpdCh0aGlzKTsKKworICAgICAgICAvLyB2aXNpdCBpbmNyZW1lbnQKKyAgICAgICAgZm9yIChpbnQgaSA9IGNvbmRJbmRleCArIDE7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIHZpc2l0RXhwcmVzc2lvbk9yU3RhdGVtZW50KGV4cHJlc3Npb25zLmdldChpKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBqdW1wIHRvIHRlc3QgdGhlIGNvbmRpdGlvbiBhZ2FpbgorICAgICAgICBtdi52aXNpdEp1bXBJbnNuKEdPVE8sIGNvbnRpbnVlTGFiZWwpOworCisgICAgICAgIC8vIGxvb3AgZW5kCisgICAgICAgIG12LnZpc2l0TGFiZWwoYnJlYWtMYWJlbCk7CisKKyAgICAgICAgY29tcGlsZVN0YWNrLnBvcCgpOworICAgICAgICBjb21waWxlU3RhY2sucG9wKCk7CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEZvckxvb3AoRm9yU3RhdGVtZW50IGxvb3ApIHsKKworICAgICAgICBvbkxpbmVOdW1iZXIobG9vcCwgInZpc2l0Rm9yTG9vcCIpOworICAgICAgICB2aXNpdFN0YXRlbWVudChsb29wKTsKKworCisgICAgICAgIFBhcmFtZXRlciBsb29wVmFyID0gbG9vcC5nZXRWYXJpYWJsZSgpOworICAgICAgICBpZiAobG9vcFZhciA9PSBGb3JTdGF0ZW1lbnQuRk9SX0xPT1BfRFVNTVkpIHsKKyAgICAgICAgICAgIHZpc2l0Rm9yTG9vcFdpdGhDbG9zdXJlTGlzdChsb29wKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGNvbXBpbGVTdGFjay5wdXNoTG9vcChsb29wLmdldFZhcmlhYmxlU2NvcGUoKSwgbG9vcC5nZXRTdGF0ZW1lbnRMYWJlbCgpKTsKKworICAgICAgICAvLyBEZWNsYXJlIHRoZSBsb29wIGNvdW50ZXIuCisgICAgICAgIFZhcmlhYmxlIHZhcmlhYmxlID0gY29tcGlsZVN0YWNrLmRlZmluZVZhcmlhYmxlKGxvb3AuZ2V0VmFyaWFibGUoKSwgZmFsc2UpOworCisgICAgICAgIC8vCisgICAgICAgIC8vIFRoZW4gZ2V0IHRoZSBpdGVyYXRvciBhbmQgZ2VuZXJhdGUgdGhlIGxvb3AgY29udHJvbAorICAgICAgICBNZXRob2RDYWxsRXhwcmVzc2lvbiBpdGVyYXRvciA9IG5ldyBNZXRob2RDYWxsRXhwcmVzc2lvbihsb29wLmdldENvbGxlY3Rpb25FeHByZXNzaW9uKCksICJpdGVyYXRvciIsIG5ldyBBcmd1bWVudExpc3RFeHByZXNzaW9uKCkpOworICAgICAgICBpdGVyYXRvci52aXNpdCh0aGlzKTsKKworICAgICAgICBmaW5hbCBpbnQgaXRlcmF0b3JJZHggPSBjb21waWxlU3RhY2suZGVmaW5lVGVtcG9yYXJ5VmFyaWFibGUoIml0ZXJhdG9yIiwgQ2xhc3NIZWxwZXIubWFrZShqYXZhLnV0aWwuSXRlcmF0b3IuY2xhc3MpLCB0cnVlKTsKKworICAgICAgICBMYWJlbCBjb250aW51ZUxhYmVsID0gY29tcGlsZVN0YWNrLmdldENvbnRpbnVlTGFiZWwoKTsKKyAgICAgICAgTGFiZWwgYnJlYWtMYWJlbCA9IGNvbXBpbGVTdGFjay5nZXRCcmVha0xhYmVsKCk7CisKKyAgICAgICAgbXYudmlzaXRMYWJlbChjb250aW51ZUxhYmVsKTsKKyAgICAgICAgbXYudmlzaXRWYXJJbnNuKEFMT0FELCBpdGVyYXRvcklkeCk7CisgICAgICAgIGl0ZXJhdG9ySGFzTmV4dE1ldGhvZC5jYWxsKG12KTsKKyAgICAgICAgLy8gbm90ZTogaWZlcSB0ZXN0cyBmb3IgPT0wLCBhIGJvb2xlYW4gaXMgMCBpZiBpdCBpcyBmYWxzZQorICAgICAgICBtdi52aXNpdEp1bXBJbnNuKElGRVEsIGJyZWFrTGFiZWwpOworCisgICAgICAgIG12LnZpc2l0VmFySW5zbihBTE9BRCwgaXRlcmF0b3JJZHgpOworICAgICAgICBpdGVyYXRvck5leHRNZXRob2QuY2FsbChtdik7CisgICAgICAgIGhlbHBlci5zdG9yZVZhcih2YXJpYWJsZSk7CisKKyAgICAgICAgLy8gR2VuZXJhdGUgdGhlIGxvb3AgYm9keQorICAgICAgICBsb29wLmdldExvb3BCbG9jaygpLnZpc2l0KHRoaXMpOworCisgICAgICAgIG12LnZpc2l0SnVtcEluc24oR09UTywgY29udGludWVMYWJlbCk7CisgICAgICAgIG12LnZpc2l0TGFiZWwoYnJlYWtMYWJlbCk7CisKKyAgICAgICAgY29tcGlsZVN0YWNrLnBvcCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0V2hpbGVMb29wKFdoaWxlU3RhdGVtZW50IGxvb3ApIHsKKyAgICAgICAgb25MaW5lTnVtYmVyKGxvb3AsICJ2aXNpdFdoaWxlTG9vcCIpOworICAgICAgICB2aXNpdFN0YXRlbWVudChsb29wKTsKKworICAgICAgICBjb21waWxlU3RhY2sucHVzaExvb3AobG9vcC5nZXRTdGF0ZW1lbnRMYWJlbCgpKTsKKyAgICAgICAgTGFiZWwgY29udGludWVMYWJlbCA9IGNvbXBpbGVTdGFjay5nZXRDb250aW51ZUxhYmVsKCk7CisgICAgICAgIExhYmVsIGJyZWFrTGFiZWwgPSBjb21waWxlU3RhY2suZ2V0QnJlYWtMYWJlbCgpOworCisgICAgICAgIG12LnZpc2l0TGFiZWwoY29udGludWVMYWJlbCk7CisgICAgICAgIGxvb3AuZ2V0Qm9vbGVhbkV4cHJlc3Npb24oKS52aXNpdCh0aGlzKTsKKyAgICAgICAgbXYudmlzaXRKdW1wSW5zbihJRkVRLCBicmVha0xhYmVsKTsKKworICAgICAgICBsb29wLmdldExvb3BCbG9jaygpLnZpc2l0KHRoaXMpOworCisgICAgICAgIG12LnZpc2l0SnVtcEluc24oR09UTywgY29udGludWVMYWJlbCk7CisgICAgICAgIG12LnZpc2l0TGFiZWwoYnJlYWtMYWJlbCk7CisKKyAgICAgICAgY29tcGlsZVN0YWNrLnBvcCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0RG9XaGlsZUxvb3AoRG9XaGlsZVN0YXRlbWVudCBsb29wKSB7CisgICAgICAgIG9uTGluZU51bWJlcihsb29wLCAidmlzaXREb1doaWxlTG9vcCIpOworICAgICAgICB2aXNpdFN0YXRlbWVudChsb29wKTsKKworICAgICAgICBjb21waWxlU3RhY2sucHVzaExvb3AobG9vcC5nZXRTdGF0ZW1lbnRMYWJlbCgpKTsKKyAgICAgICAgTGFiZWwgYnJlYWtMYWJlbCA9IGNvbXBpbGVTdGFjay5nZXRCcmVha0xhYmVsKCk7CisgICAgICAgIExhYmVsIGNvbnRpbnVlTGFiZWwgPSBjb21waWxlU3RhY2suZ2V0Q29udGludWVMYWJlbCgpOworICAgICAgICBtdi52aXNpdExhYmVsKGNvbnRpbnVlTGFiZWwpOworCisgICAgICAgIGxvb3AuZ2V0TG9vcEJsb2NrKCkudmlzaXQodGhpcyk7CisKKyAgICAgICAgbG9vcC5nZXRCb29sZWFuRXhwcmVzc2lvbigpLnZpc2l0KHRoaXMpOworICAgICAgICBtdi52aXNpdEp1bXBJbnNuKElGRVEsIGNvbnRpbnVlTGFiZWwpOworICAgICAgICBtdi52aXNpdExhYmVsKGJyZWFrTGFiZWwpOworCisgICAgICAgIGNvbXBpbGVTdGFjay5wb3AoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdElmRWxzZShJZlN0YXRlbWVudCBpZkVsc2UpIHsKKyAgICAgICAgb25MaW5lTnVtYmVyKGlmRWxzZSwgInZpc2l0SWZFbHNlIik7CisgICAgICAgIHZpc2l0U3RhdGVtZW50KGlmRWxzZSk7CisgICAgICAgIGlmRWxzZS5nZXRCb29sZWFuRXhwcmVzc2lvbigpLnZpc2l0KHRoaXMpOworCisgICAgICAgIExhYmVsIGwwID0gbmV3IExhYmVsKCk7CisgICAgICAgIG12LnZpc2l0SnVtcEluc24oSUZFUSwgbDApOworCisgICAgICAgIC8vIGlmLWVsc2UgaXMgaGVyZSBoYW5kbGVkIGFzIGEgc3BlY2lhbCB2ZXJzaW9uCisgICAgICAgIC8vIG9mIGEgYm9vZWxhbiBleHByZXNzaW9uCisgICAgICAgIGNvbXBpbGVTdGFjay5wdXNoQm9vbGVhbkV4cHJlc3Npb24oKTsKKyAgICAgICAgaWZFbHNlLmdldElmQmxvY2soKS52aXNpdCh0aGlzKTsKKyAgICAgICAgY29tcGlsZVN0YWNrLnBvcCgpOworCisgICAgICAgIExhYmVsIGwxID0gbmV3IExhYmVsKCk7CisgICAgICAgIG12LnZpc2l0SnVtcEluc24oR09UTywgbDEpOworICAgICAgICBtdi52aXNpdExhYmVsKGwwKTsKKworICAgICAgICBjb21waWxlU3RhY2sucHVzaEJvb2xlYW5FeHByZXNzaW9uKCk7CisgICAgICAgIGlmRWxzZS5nZXRFbHNlQmxvY2soKS52aXNpdCh0aGlzKTsKKyAgICAgICAgY29tcGlsZVN0YWNrLnBvcCgpOworCisgICAgICAgIG12LnZpc2l0TGFiZWwobDEpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0VGVybmFyeUV4cHJlc3Npb24oVGVybmFyeUV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgICAgICBvbkxpbmVOdW1iZXIoZXhwcmVzc2lvbiwgInZpc2l0VGVybmFyeUV4cHJlc3Npb24iKTsKKworICAgICAgICBCb29sZWFuRXhwcmVzc2lvbiBib29sUGFydCA9IGV4cHJlc3Npb24uZ2V0Qm9vbGVhbkV4cHJlc3Npb24oKTsKKyAgICAgICAgRXhwcmVzc2lvbiB0cnVlUGFydCA9IGV4cHJlc3Npb24uZ2V0VHJ1ZUV4cHJlc3Npb24oKTsKKyAgICAgICAgRXhwcmVzc2lvbiBmYWxzZVBhcnQgPSBleHByZXNzaW9uLmdldEZhbHNlRXhwcmVzc2lvbigpOworICAgICAgICAKKyAgICAgICAgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBFbHZpc09wZXJhdG9yRXhwcmVzc2lvbikgeworICAgICAgICAgICAgdmlzaXRBbmRBdXRvYm94Qm9vbGVhbihleHByZXNzaW9uLmdldFRydWVFeHByZXNzaW9uKCkpOworICAgICAgICAgICAgYm9vbFBhcnQgPSBuZXcgQm9vbGVhbkV4cHJlc3Npb24oCisgICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlY29kZUV4cHJlc3Npb24oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChHcm9vdnlDb2RlVmlzaXRvciB2aXNpdG9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXYudmlzaXRJbnNuKERVUCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICk7CisgICAgICAgICAgICB0cnVlUGFydCA9IEJ5dGVjb2RlRXhwcmVzc2lvbi5OT1A7CisgICAgICAgICAgICBmaW5hbCBFeHByZXNzaW9uIG9sZEZhbHNlID0gZmFsc2VQYXJ0OworICAgICAgICAgICAgZmFsc2VQYXJ0ID0gbmV3IEJ5dGVjb2RlRXhwcmVzc2lvbigpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChHcm9vdnlDb2RlVmlzaXRvciB2aXNpdG9yKSB7CisgICAgICAgICAgICAgICAgICAgIG12LnZpc2l0SW5zbihQT1ApOworICAgICAgICAgICAgICAgICAgICB2aXNpdEFuZEF1dG9ib3hCb29sZWFuKG9sZEZhbHNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgYm9vbFBhcnQudmlzaXQodGhpcyk7CisKKyAgICAgICAgTGFiZWwgbDAgPSBuZXcgTGFiZWwoKTsKKyAgICAgICAgbXYudmlzaXRKdW1wSW5zbihJRkVRLCBsMCk7CisgICAgICAgIGNvbXBpbGVTdGFjay5wdXNoQm9vbGVhbkV4cHJlc3Npb24oKTsKKyAgICAgICAgdmlzaXRBbmRBdXRvYm94Qm9vbGVhbih0cnVlUGFydCk7CisgICAgICAgIGNvbXBpbGVTdGFjay5wb3AoKTsKKyAgICAgICAgCisgICAgICAgIExhYmVsIGwxID0gbmV3IExhYmVsKCk7CisgICAgICAgIG12LnZpc2l0SnVtcEluc24oR09UTywgbDEpOworICAgICAgICBtdi52aXNpdExhYmVsKGwwKTsKKyAgICAgICAgY29tcGlsZVN0YWNrLnB1c2hCb29sZWFuRXhwcmVzc2lvbigpOworICAgICAgICB2aXNpdEFuZEF1dG9ib3hCb29sZWFuKGZhbHNlUGFydCk7CisgICAgICAgIGNvbXBpbGVTdGFjay5wb3AoKTsKKyAgICAgICAgCisgICAgICAgIG12LnZpc2l0TGFiZWwobDEpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0QXNzZXJ0U3RhdGVtZW50KEFzc2VydFN0YXRlbWVudCBzdGF0ZW1lbnQpIHsKKyAgICAgICAgb25MaW5lTnVtYmVyKHN0YXRlbWVudCwgInZpc2l0QXNzZXJ0U3RhdGVtZW50Iik7CisgICAgICAgIHZpc2l0U3RhdGVtZW50KHN0YXRlbWVudCk7CisKKyAgICAgICAgQm9vbGVhbkV4cHJlc3Npb24gYm9vbGVhbkV4cHJlc3Npb24gPSBzdGF0ZW1lbnQuZ2V0Qm9vbGVhbkV4cHJlc3Npb24oKTsKKyAgICAgICAgYm9vbGVhbkV4cHJlc3Npb24udmlzaXQodGhpcyk7CisKKyAgICAgICAgTGFiZWwgbDAgPSBuZXcgTGFiZWwoKTsKKyAgICAgICAgbXYudmlzaXRKdW1wSW5zbihJRkVRLCBsMCk7CisKKyAgICAgICAgLy8gZG8gbm90aGluZworCisgICAgICAgIExhYmVsIGwxID0gbmV3IExhYmVsKCk7CisgICAgICAgIG12LnZpc2l0SnVtcEluc24oR09UTywgbDEpOworICAgICAgICBtdi52aXNpdExhYmVsKGwwKTsKKworICAgICAgICAvLyBwdXNoIGV4cHJlc3Npb24gc3RyaW5nIG9udG8gc3RhY2sKKyAgICAgICAgU3RyaW5nIGV4cHJlc3Npb25UZXh0ID0gYm9vbGVhbkV4cHJlc3Npb24uZ2V0VGV4dCgpOworICAgICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGFkZFZhcmlhYmxlTmFtZXMoYm9vbGVhbkV4cHJlc3Npb24sIGxpc3QpOworICAgICAgICBpZiAobGlzdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIG12LnZpc2l0TGRjSW5zbihleHByZXNzaW9uVGV4dCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKworICAgICAgICAgICAgLy8gbGV0cyBjcmVhdGUgYSBuZXcgZXhwcmVzc2lvbgorICAgICAgICAgICAgbXYudmlzaXRUeXBlSW5zbihORVcsICJqYXZhL2xhbmcvU3RyaW5nQnVmZmVyIik7CisgICAgICAgICAgICBtdi52aXNpdEluc24oRFVQKTsKKyAgICAgICAgICAgIG12LnZpc2l0TGRjSW5zbihleHByZXNzaW9uVGV4dCArICIuIFZhbHVlczogIik7CisKKyAgICAgICAgICAgIG12LnZpc2l0TWV0aG9kSW5zbihJTlZPS0VTUEVDSUFMLCAiamF2YS9sYW5nL1N0cmluZ0J1ZmZlciIsICI8aW5pdD4iLCAiKExqYXZhL2xhbmcvU3RyaW5nOylWIik7CisKKyAgICAgICAgICAgIGludCB0ZW1wSW5kZXggPSBjb21waWxlU3RhY2suZGVmaW5lVGVtcG9yYXJ5VmFyaWFibGUoImFzc2VydCIsIHRydWUpOworCisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHRleHQgPSBuYW1lICsgIiA9ICI7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGV4dCA9ICIsICIgKyB0ZXh0OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG12LnZpc2l0VmFySW5zbihBTE9BRCwgdGVtcEluZGV4KTsKKyAgICAgICAgICAgICAgICBtdi52aXNpdExkY0luc24odGV4dCk7CisgICAgICAgICAgICAgICAgbXYudmlzaXRNZXRob2RJbnNuKAorICAgICAgICAgICAgICAgICAgICAgICAgSU5WT0tFVklSVFVBTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJqYXZhL2xhbmcvU3RyaW5nQnVmZmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhcHBlbmQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIihMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9TdHJpbmdCdWZmZXI7Iik7CisgICAgICAgICAgICAgICAgbXYudmlzaXRJbnNuKFBPUCk7CisKKyAgICAgICAgICAgICAgICBtdi52aXNpdFZhckluc24oQUxPQUQsIHRlbXBJbmRleCk7CisgICAgICAgICAgICAgICAgbmV3IFZhcmlhYmxlRXhwcmVzc2lvbihuYW1lKS52aXNpdCh0aGlzKTsKKyAgICAgICAgICAgICAgICBtdi52aXNpdE1ldGhvZEluc24oCisgICAgICAgICAgICAgICAgICAgICAgICBJTlZPS0VWSVJUVUFMLAorICAgICAgICAgICAgICAgICAgICAgICAgImphdmEvbGFuZy9TdHJpbmdCdWZmZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgImFwcGVuZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiKExqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL1N0cmluZ0J1ZmZlcjsiKTsKKyAgICAgICAgICAgICAgICBtdi52aXNpdEluc24oUE9QKTsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgbXYudmlzaXRWYXJJbnNuKEFMT0FELCB0ZW1wSW5kZXgpOworICAgICAgICAgICAgY29tcGlsZVN0YWNrLnJlbW92ZVZhcih0ZW1wSW5kZXgpOworICAgICAgICB9CisgICAgICAgIC8vIG5vdyB0aGUgb3B0aW9uYWwgZXhjZXB0aW9uIGV4cHJlc3Npb24KKyAgICAgICAgc3RhdGVtZW50LmdldE1lc3NhZ2VFeHByZXNzaW9uKCkudmlzaXQodGhpcyk7CisKKyAgICAgICAgYXNzZXJ0RmFpbGVkTWV0aG9kLmNhbGwobXYpOworICAgICAgICBtdi52aXNpdExhYmVsKGwxKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWRkVmFyaWFibGVOYW1lcyhFeHByZXNzaW9uIGV4cHJlc3Npb24sIExpc3QgbGlzdCkgeworICAgICAgICBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIEJvb2xlYW5FeHByZXNzaW9uKSB7CisgICAgICAgICAgICBCb29sZWFuRXhwcmVzc2lvbiBib29sRXhwID0gKEJvb2xlYW5FeHByZXNzaW9uKSBleHByZXNzaW9uOworICAgICAgICAgICAgYWRkVmFyaWFibGVOYW1lcyhib29sRXhwLmdldEV4cHJlc3Npb24oKSwgbGlzdCk7CisgICAgICAgIH0gZWxzZSBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIEJpbmFyeUV4cHJlc3Npb24pIHsKKyAgICAgICAgICAgIEJpbmFyeUV4cHJlc3Npb24gYmluRXhwID0gKEJpbmFyeUV4cHJlc3Npb24pIGV4cHJlc3Npb247CisgICAgICAgICAgICBhZGRWYXJpYWJsZU5hbWVzKGJpbkV4cC5nZXRMZWZ0RXhwcmVzc2lvbigpLCBsaXN0KTsKKyAgICAgICAgICAgIGFkZFZhcmlhYmxlTmFtZXMoYmluRXhwLmdldFJpZ2h0RXhwcmVzc2lvbigpLCBsaXN0KTsKKyAgICAgICAgfSBlbHNlIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgVmFyaWFibGVFeHByZXNzaW9uKSB7CisgICAgICAgICAgICBWYXJpYWJsZUV4cHJlc3Npb24gdmFyRXhwID0gKFZhcmlhYmxlRXhwcmVzc2lvbikgZXhwcmVzc2lvbjsKKyAgICAgICAgICAgIGxpc3QuYWRkKHZhckV4cC5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRUcnlDYXRjaEZpbmFsbHkoVHJ5Q2F0Y2hTdGF0ZW1lbnQgc3RhdGVtZW50KSB7CisgICAgICAgIG9uTGluZU51bWJlcihzdGF0ZW1lbnQsICJ2aXNpdFRyeUNhdGNoRmluYWxseSIpOworICAgICAgICB2aXNpdFN0YXRlbWVudChzdGF0ZW1lbnQpOworCisgICAgICAgIENhdGNoU3RhdGVtZW50IGNhdGNoU3RhdGVtZW50ID0gc3RhdGVtZW50LmdldENhdGNoU3RhdGVtZW50KDApOworICAgICAgICBTdGF0ZW1lbnQgdHJ5U3RhdGVtZW50ID0gc3RhdGVtZW50LmdldFRyeVN0YXRlbWVudCgpOworICAgICAgICBmaW5hbCBTdGF0ZW1lbnQgZmluYWxseVN0YXRlbWVudCA9IHN0YXRlbWVudC5nZXRGaW5hbGx5U3RhdGVtZW50KCk7CisKKyAgICAgICAgaW50IGFueUV4Y2VwdGlvbkluZGV4ID0gY29tcGlsZVN0YWNrLmRlZmluZVRlbXBvcmFyeVZhcmlhYmxlKCJleGNlcHRpb24iLCBmYWxzZSk7CisgICAgICAgIGlmICghZmluYWxseVN0YXRlbWVudC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGNvbXBpbGVTdGFjay5wdXNoRmluYWxseUJsb2NrKAorICAgICAgICAgICAgICAgICAgICBuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZVN0YWNrLnB1c2hGaW5hbGx5QmxvY2tWaXNpdCh0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5U3RhdGVtZW50LnZpc2l0KEFzbUNsYXNzR2VuZXJhdG9yLnRoaXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVTdGFjay5wb3BGaW5hbGx5QmxvY2tWaXNpdCh0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHN0YXJ0IHRyeSBibG9jaywgbGFiZWwgbmVlZGVkIGZvciBleGNlcHRpb24gdGFibGUKKyAgICAgICAgZmluYWwgTGFiZWwgdHJ5U3RhcnQgPSBuZXcgTGFiZWwoKTsKKyAgICAgICAgbXYudmlzaXRMYWJlbCh0cnlTdGFydCk7CisgICAgICAgIHRyeVN0YXRlbWVudC52aXNpdCh0aGlzKTsKKyAgICAgICAgLy8gZ290byBmaW5hbGx5IHBhcnQKKyAgICAgICAgZmluYWwgTGFiZWwgZmluYWxseVN0YXJ0ID0gbmV3IExhYmVsKCk7CisgICAgICAgIG12LnZpc2l0SnVtcEluc24oR09UTywgZmluYWxseVN0YXJ0KTsKKyAgICAgICAgLy8gbWFya2VyIG5lZWRlZCBmb3IgRXhjZXB0aW9uIHRhYmxlCisgICAgICAgIGZpbmFsIExhYmVsIHRyeUVuZCA9IG5ldyBMYWJlbCgpOworICAgICAgICBtdi52aXNpdExhYmVsKHRyeUVuZCk7CisKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IHN0YXRlbWVudC5nZXRDYXRjaFN0YXRlbWVudHMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBjYXRjaFN0YXRlbWVudCA9IChDYXRjaFN0YXRlbWVudCkgaXQubmV4dCgpOworICAgICAgICAgICAgQ2xhc3NOb2RlIGV4Y2VwdGlvblR5cGUgPSBjYXRjaFN0YXRlbWVudC5nZXRFeGNlcHRpb25UeXBlKCk7CisgICAgICAgICAgICAvLyBzdGFydCBjYXRjaCBibG9jaywgbGFiZWwgbmVlZGVkIGZvciBleGNlcHRpb24gdGFibGUKKyAgICAgICAgICAgIGZpbmFsIExhYmVsIGNhdGNoU3RhcnQgPSBuZXcgTGFiZWwoKTsKKyAgICAgICAgICAgIG12LnZpc2l0TGFiZWwoY2F0Y2hTdGFydCk7CisgICAgICAgICAgICAvLyBjcmVhdGUgZXhjZXB0aW9uIHZhcmlhYmxlIGFuZCBzdG9yZSB0aGUgZXhjZXB0aW9uIAorICAgICAgICAgICAgY29tcGlsZVN0YWNrLmRlZmluZVZhcmlhYmxlKGNhdGNoU3RhdGVtZW50LmdldFZhcmlhYmxlKCksIHRydWUpOworICAgICAgICAgICAgLy8gaGFuZGxlIGNhdGNoIGJvZHkKKyAgICAgICAgICAgIGNhdGNoU3RhdGVtZW50LnZpc2l0KHRoaXMpOworICAgICAgICAgICAgLy8gZ290byBmaW5hbGx5IHN0YXJ0CisgICAgICAgICAgICBtdi52aXNpdEp1bXBJbnNuKEdPVE8sIGZpbmFsbHlTdGFydCk7CisgICAgICAgICAgICAvLyBhZGQgZXhjZXB0aW9uIHRvIHRhYmxlCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZXhjZXB0aW9uVHlwZUludGVybmFsTmFtZSA9IEJ5dGVjb2RlSGVscGVyLmdldENsYXNzSW50ZXJuYWxOYW1lKGV4Y2VwdGlvblR5cGUpOworICAgICAgICAgICAgZXhjZXB0aW9uQmxvY2tzLmFkZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBtdi52aXNpdFRyeUNhdGNoQmxvY2sodHJ5U3RhcnQsIHRyeUVuZCwgY2F0Y2hTdGFydCwgZXhjZXB0aW9uVHlwZUludGVybmFsTmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBtYXJrZXIgbmVlZGVkIGZvciB0aGUgZXhjZXB0aW9uIHRhYmxlCisgICAgICAgIGZpbmFsIExhYmVsIGVuZE9mQWxsQ2F0Y2hlcyA9IG5ldyBMYWJlbCgpOworICAgICAgICBtdi52aXNpdExhYmVsKGVuZE9mQWxsQ2F0Y2hlcyk7CisKKyAgICAgICAgLy8gcmVtb3ZlIHRoZSBmaW5hbGx5LCBkb24ndCBsZXQgaXQgdmlzaXQgaXRzZWxmCisgICAgICAgIGlmICghZmluYWxseVN0YXRlbWVudC5pc0VtcHR5KCkpIGNvbXBpbGVTdGFjay5wb3BGaW5hbGx5QmxvY2soKTsKKworICAgICAgICAvLyBzdGFydCBmaW5hbGx5CisgICAgICAgIG12LnZpc2l0TGFiZWwoZmluYWxseVN0YXJ0KTsKKyAgICAgICAgZmluYWxseVN0YXRlbWVudC52aXNpdCh0aGlzKTsKKyAgICAgICAgLy8gZ290byBlbmQgb2YgZmluYWxseQorICAgICAgICBMYWJlbCBhZnRlckZpbmFsbHkgPSBuZXcgTGFiZWwoKTsKKyAgICAgICAgbXYudmlzaXRKdW1wSW5zbihHT1RPLCBhZnRlckZpbmFsbHkpOworCisgICAgICAgIC8vIHN0YXJ0IGEgYmxvY2sgY2F0Y2hpbmcgYW55IEV4Y2VwdGlvbgorICAgICAgICBmaW5hbCBMYWJlbCBjYXRjaEFueSA9IG5ldyBMYWJlbCgpOworICAgICAgICBtdi52aXNpdExhYmVsKGNhdGNoQW55KTsKKyAgICAgICAgLy9zdG9yZSBleGNlcHRpb24KKyAgICAgICAgbXYudmlzaXRWYXJJbnNuKEFTVE9SRSwgYW55RXhjZXB0aW9uSW5kZXgpOworICAgICAgICBmaW5hbGx5U3RhdGVtZW50LnZpc2l0KHRoaXMpOworICAgICAgICAvLyBsb2FkIHRoZSBleGNlcHRpb24gYW5kIHJldGhyb3cgaXQKKyAgICAgICAgbXYudmlzaXRWYXJJbnNuKEFMT0FELCBhbnlFeGNlcHRpb25JbmRleCk7CisgICAgICAgIG12LnZpc2l0SW5zbihBVEhST1cpOworCisgICAgICAgIC8vIGVuZCBvZiBhbGwgY2F0Y2hlcyBhbmQgZmluYWxseSBwYXJ0cworICAgICAgICBtdi52aXNpdExhYmVsKGFmdGVyRmluYWxseSk7CisKKyAgICAgICAgLy8gYWRkIGNhdGNoIGFueSBibG9jayB0byBleGNlcHRpb24gdGFibGUKKyAgICAgICAgZXhjZXB0aW9uQmxvY2tzLmFkZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgbXYudmlzaXRUcnlDYXRjaEJsb2NrKHRyeVN0YXJ0LCBlbmRPZkFsbENhdGNoZXMsIGNhdGNoQW55LCBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRTd2l0Y2goU3dpdGNoU3RhdGVtZW50IHN0YXRlbWVudCkgeworICAgICAgICBvbkxpbmVOdW1iZXIoc3RhdGVtZW50LCAidmlzaXRTd2l0Y2giKTsKKyAgICAgICAgdmlzaXRTdGF0ZW1lbnQoc3RhdGVtZW50KTsKKworICAgICAgICBzdGF0ZW1lbnQuZ2V0RXhwcmVzc2lvbigpLnZpc2l0KHRoaXMpOworCisgICAgICAgIC8vIHN3aXRjaCBkb2VzIG5vdCBoYXZlIGEgY29udGludWUgbGFiZWwuIHVzZSBpdHMgcGFyZW50J3MgZm9yIGNvbnRpbnVlCisgICAgICAgIExhYmVsIGJyZWFrTGFiZWwgPSBjb21waWxlU3RhY2sucHVzaFN3aXRjaCgpOworCisgICAgICAgIGludCBzd2l0Y2hWYXJpYWJsZUluZGV4ID0gY29tcGlsZVN0YWNrLmRlZmluZVRlbXBvcmFyeVZhcmlhYmxlKCJzd2l0Y2giLCB0cnVlKTsKKworICAgICAgICBMaXN0IGNhc2VTdGF0ZW1lbnRzID0gc3RhdGVtZW50LmdldENhc2VTdGF0ZW1lbnRzKCk7CisgICAgICAgIGludCBjYXNlQ291bnQgPSBjYXNlU3RhdGVtZW50cy5zaXplKCk7CisgICAgICAgIExhYmVsW10gbGFiZWxzID0gbmV3IExhYmVsW2Nhc2VDb3VudCArIDFdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhc2VDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBsYWJlbHNbaV0gPSBuZXcgTGFiZWwoKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gY2FzZVN0YXRlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7IGkrKykgeworICAgICAgICAgICAgQ2FzZVN0YXRlbWVudCBjYXNlU3RhdGVtZW50ID0gKENhc2VTdGF0ZW1lbnQpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgdmlzaXRDYXNlU3RhdGVtZW50KGNhc2VTdGF0ZW1lbnQsIHN3aXRjaFZhcmlhYmxlSW5kZXgsIGxhYmVsc1tpXSwgbGFiZWxzW2kgKyAxXSk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0ZW1lbnQuZ2V0RGVmYXVsdFN0YXRlbWVudCgpLnZpc2l0KHRoaXMpOworCisgICAgICAgIG12LnZpc2l0TGFiZWwoYnJlYWtMYWJlbCk7CisKKyAgICAgICAgY29tcGlsZVN0YWNrLnBvcCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0Q2FzZVN0YXRlbWVudChDYXNlU3RhdGVtZW50IHN0YXRlbWVudCkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0Q2FzZVN0YXRlbWVudCgKKyAgICAgICAgICAgIENhc2VTdGF0ZW1lbnQgc3RhdGVtZW50LAorICAgICAgICAgICAgaW50IHN3aXRjaFZhcmlhYmxlSW5kZXgsCisgICAgICAgICAgICBMYWJlbCB0aGlzTGFiZWwsCisgICAgICAgICAgICBMYWJlbCBuZXh0TGFiZWwpIHsKKworICAgICAgICBvbkxpbmVOdW1iZXIoc3RhdGVtZW50LCAidmlzaXRDYXNlU3RhdGVtZW50Iik7CisKKyAgICAgICAgbXYudmlzaXRWYXJJbnNuKEFMT0FELCBzd2l0Y2hWYXJpYWJsZUluZGV4KTsKKyAgICAgICAgc3RhdGVtZW50LmdldEV4cHJlc3Npb24oKS52aXNpdCh0aGlzKTsKKworICAgICAgICBpc0Nhc2VNZXRob2QuY2FsbChtdik7CisKKyAgICAgICAgTGFiZWwgbDAgPSBuZXcgTGFiZWwoKTsKKyAgICAgICAgbXYudmlzaXRKdW1wSW5zbihJRkVRLCBsMCk7CisKKyAgICAgICAgbXYudmlzaXRMYWJlbCh0aGlzTGFiZWwpOworCisgICAgICAgIHN0YXRlbWVudC5nZXRDb2RlKCkudmlzaXQodGhpcyk7CisKKyAgICAgICAgLy8gbm93IGlmIHdlIGRvbid0IGZpbmlzaCB3aXRoIGEgYnJlYWsgd2UgbmVlZCB0byBqdW1wIHBhc3QKKyAgICAgICAgLy8gdGhlIG5leHQgY29tcGFyaXNvbgorICAgICAgICBpZiAobmV4dExhYmVsICE9IG51bGwpIHsKKyAgICAgICAgICAgIG12LnZpc2l0SnVtcEluc24oR09UTywgbmV4dExhYmVsKTsKKyAgICAgICAgfQorCisgICAgICAgIG12LnZpc2l0TGFiZWwobDApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0QnJlYWtTdGF0ZW1lbnQoQnJlYWtTdGF0ZW1lbnQgc3RhdGVtZW50KSB7CisgICAgICAgIG9uTGluZU51bWJlcihzdGF0ZW1lbnQsICJ2aXNpdEJyZWFrU3RhdGVtZW50Iik7CisgICAgICAgIHZpc2l0U3RhdGVtZW50KHN0YXRlbWVudCk7CisKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBzdGF0ZW1lbnQuZ2V0TGFiZWwoKTsKKyAgICAgICAgTGFiZWwgYnJlYWtMYWJlbCA9IGNvbXBpbGVTdGFjay5nZXROYW1lZEJyZWFrTGFiZWwobmFtZSk7CisgICAgICAgIGNvbXBpbGVTdGFjay5hcHBseUZpbmFsbHlCbG9ja3MoYnJlYWtMYWJlbCwgdHJ1ZSk7CisKKyAgICAgICAgbXYudmlzaXRKdW1wSW5zbihHT1RPLCBicmVha0xhYmVsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdENvbnRpbnVlU3RhdGVtZW50KENvbnRpbnVlU3RhdGVtZW50IHN0YXRlbWVudCkgeworICAgICAgICBvbkxpbmVOdW1iZXIoc3RhdGVtZW50LCAidmlzaXRDb250aW51ZVN0YXRlbWVudCIpOworICAgICAgICB2aXNpdFN0YXRlbWVudChzdGF0ZW1lbnQpOworCisgICAgICAgIFN0cmluZyBuYW1lID0gc3RhdGVtZW50LmdldExhYmVsKCk7CisgICAgICAgIExhYmVsIGNvbnRpbnVlTGFiZWwgPSBjb21waWxlU3RhY2suZ2V0Q29udGludWVMYWJlbCgpOworICAgICAgICBpZiAobmFtZSAhPSBudWxsKSBjb250aW51ZUxhYmVsID0gY29tcGlsZVN0YWNrLmdldE5hbWVkQ29udGludWVMYWJlbChuYW1lKTsKKyAgICAgICAgY29tcGlsZVN0YWNrLmFwcGx5RmluYWxseUJsb2Nrcyhjb250aW51ZUxhYmVsLCBmYWxzZSk7CisgICAgICAgIG12LnZpc2l0SnVtcEluc24oR09UTywgY29udGludWVMYWJlbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRTeW5jaHJvbml6ZWRTdGF0ZW1lbnQoU3luY2hyb25pemVkU3RhdGVtZW50IHN0YXRlbWVudCkgeworICAgICAgICBvbkxpbmVOdW1iZXIoc3RhdGVtZW50LCAidmlzaXRTeW5jaHJvbml6ZWRTdGF0ZW1lbnQiKTsKKyAgICAgICAgdmlzaXRTdGF0ZW1lbnQoc3RhdGVtZW50KTsKKworICAgICAgICBzdGF0ZW1lbnQuZ2V0RXhwcmVzc2lvbigpLnZpc2l0KHRoaXMpOworICAgICAgICBmaW5hbCBpbnQgaW5kZXggPSBjb21waWxlU3RhY2suZGVmaW5lVGVtcG9yYXJ5VmFyaWFibGUoInN5bmNocm9uaXplZCIsIENsYXNzSGVscGVyLkludGVnZXJfVFlQRSwgdHJ1ZSk7CisKKyAgICAgICAgZmluYWwgTGFiZWwgc3luY2hyb25pemVkU3RhcnQgPSBuZXcgTGFiZWwoKTsKKyAgICAgICAgZmluYWwgTGFiZWwgc3luY2hyb25pemVkRW5kID0gbmV3IExhYmVsKCk7CisgICAgICAgIGZpbmFsIExhYmVsIGNhdGNoQWxsID0gbmV3IExhYmVsKCk7CisKKyAgICAgICAgbXYudmlzaXRWYXJJbnNuKEFMT0FELCBpbmRleCk7CisgICAgICAgIG12LnZpc2l0SW5zbihNT05JVE9SRU5URVIpOworICAgICAgICBtdi52aXNpdExhYmVsKHN5bmNocm9uaXplZFN0YXJ0KTsKKworICAgICAgICBSdW5uYWJsZSBmaW5hbGx5UGFydCA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBtdi52aXNpdFZhckluc24oQUxPQUQsIGluZGV4KTsKKyAgICAgICAgICAgICAgICBtdi52aXNpdEluc24oTU9OSVRPUkVYSVQpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBjb21waWxlU3RhY2sucHVzaEZpbmFsbHlCbG9jayhmaW5hbGx5UGFydCk7CisgICAgICAgIHN0YXRlbWVudC5nZXRDb2RlKCkudmlzaXQodGhpcyk7CisKKyAgICAgICAgZmluYWxseVBhcnQucnVuKCk7CisgICAgICAgIG12LnZpc2l0SnVtcEluc24oR09UTywgc3luY2hyb25pemVkRW5kKTsKKyAgICAgICAgbXYudmlzaXRMYWJlbChjYXRjaEFsbCk7CisgICAgICAgIGZpbmFsbHlQYXJ0LnJ1bigpOworICAgICAgICBtdi52aXNpdEluc24oQVRIUk9XKTsKKyAgICAgICAgbXYudmlzaXRMYWJlbChzeW5jaHJvbml6ZWRFbmQpOworCisgICAgICAgIGNvbXBpbGVTdGFjay5wb3BGaW5hbGx5QmxvY2soKTsKKyAgICAgICAgZXhjZXB0aW9uQmxvY2tzLmFkZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgbXYudmlzaXRUcnlDYXRjaEJsb2NrKHN5bmNocm9uaXplZFN0YXJ0LCBjYXRjaEFsbCwgY2F0Y2hBbGwsIG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFRocm93U3RhdGVtZW50KFRocm93U3RhdGVtZW50IHN0YXRlbWVudCkgeworICAgICAgICBvbkxpbmVOdW1iZXIoc3RhdGVtZW50LCAidmlzaXRUaHJvd1N0YXRlbWVudCIpOworICAgICAgICB2aXNpdFN0YXRlbWVudChzdGF0ZW1lbnQpOworCisgICAgICAgIHN0YXRlbWVudC5nZXRFeHByZXNzaW9uKCkudmlzaXQodGhpcyk7CisKKyAgICAgICAgLy8gd2Ugc2hvdWxkIGluZmVyIHRoZSB0eXBlIG9mIHRoZSBleGNlcHRpb24gZnJvbSB0aGUgZXhwcmVzc2lvbgorICAgICAgICBtdi52aXNpdFR5cGVJbnNuKENIRUNLQ0FTVCwgImphdmEvbGFuZy9UaHJvd2FibGUiKTsKKworICAgICAgICBtdi52aXNpdEluc24oQVRIUk9XKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFJldHVyblN0YXRlbWVudChSZXR1cm5TdGF0ZW1lbnQgc3RhdGVtZW50KSB7CisgICAgICAgIG9uTGluZU51bWJlcihzdGF0ZW1lbnQsICJ2aXNpdFJldHVyblN0YXRlbWVudCIpOworICAgICAgICB2aXNpdFN0YXRlbWVudChzdGF0ZW1lbnQpOworCisgICAgICAgIENsYXNzTm9kZSByZXR1cm5UeXBlOworICAgICAgICBpZiAobWV0aG9kTm9kZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm5UeXBlID0gbWV0aG9kTm9kZS5nZXRSZXR1cm5UeXBlKCk7CisgICAgICAgIH0gZWxzZSBpZiAoY29uc3RydWN0b3JOb2RlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVyblR5cGUgPSBjb25zdHJ1Y3Rvck5vZGUuZ2V0UmV0dXJuVHlwZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IEdyb292eUJ1Z0Vycm9yKCJJIHNwb3R0ZWQgYSByZXR1cm4gdGhhdCBpcyBuZWl0aGVyIGluIGEgbWV0aG9kIG5vciBpbiBhIGNvbnN0cnVjdG9yLi4uIEkgY2FuIG5vdCBoYW5kbGUgdGhhdCIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJldHVyblR5cGUgPT0gQ2xhc3NIZWxwZXIuVk9JRF9UWVBFKSB7CisgICAgICAgICAgICBpZiAoIShzdGF0ZW1lbnQgPT0gUmV0dXJuU3RhdGVtZW50LlJFVFVSTl9OVUxMX09SX1ZPSUQpKSB7CisgICAgICAgICAgICAgICAgdGhyb3dFeGNlcHRpb24oIkNhbm5vdCB1c2UgcmV0dXJuIHN0YXRlbWVudCB3aXRoIGFuIGV4cHJlc3Npb24gb24gYSBtZXRob2QgdGhhdCByZXR1cm5zIHZvaWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbXBpbGVTdGFjay5hcHBseUZpbmFsbHlCbG9ja3MoKTsKKyAgICAgICAgICAgIG12LnZpc2l0SW5zbihSRVRVUk4pOworICAgICAgICAgICAgb3V0cHV0UmV0dXJuID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHN0YXRlbWVudC5nZXRFeHByZXNzaW9uKCk7CisgICAgICAgIGV2YWx1YXRlRXhwcmVzc2lvbihleHByZXNzaW9uKTsKKyAgICAgICAgaWYgKHJldHVyblR5cGUgPT0gQ2xhc3NIZWxwZXIuT0JKRUNUX1RZUEUgJiYgZXhwcmVzc2lvbi5nZXRUeXBlKCkgIT0gbnVsbCAmJiBleHByZXNzaW9uLmdldFR5cGUoKSA9PSBDbGFzc0hlbHBlci5WT0lEX1RZUEUpIHsKKyAgICAgICAgICAgIG12LnZpc2l0SW5zbihBQ09OU1RfTlVMTCk7IC8vIGNoZWF0IHRoZSBjYWxsZXIKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHJldHVybiBpcyBiYXNlZCBvbiBjbGFzcyB0eXBlCisgICAgICAgICAgICAvLyB3ZSBtYXkgbmVlZCB0byBjYXN0CisgICAgICAgICAgICBkb0NvbnZlcnRBbmRDYXN0KHJldHVyblR5cGUsIGV4cHJlc3Npb24sIGZhbHNlLCB0cnVlLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbXBpbGVTdGFjay5oYXNGaW5hbGx5QmxvY2tzKCkpIHsKKyAgICAgICAgICAgIC8vIHZhbHVlIGlzIGFsd2F5cyBzYXZlZCBpbiBib3hlZCBmb3JtLCBzbyBubyBuZWVkIHRvIGhhdmUgYSBzcGVjaWFsIGxvYWQgcm91dGluZSBoZXJlCisgICAgICAgICAgICBpbnQgcmV0dXJuVmFsdWVJZHggPSBjb21waWxlU3RhY2suZGVmaW5lVGVtcG9yYXJ5VmFyaWFibGUoInJldHVyblZhbHVlIiwgQ2xhc3NIZWxwZXIuT0JKRUNUX1RZUEUsIHRydWUpOworICAgICAgICAgICAgY29tcGlsZVN0YWNrLmFwcGx5RmluYWxseUJsb2NrcygpOworICAgICAgICAgICAgaGVscGVyLmxvYWQoQ2xhc3NIZWxwZXIuT0JKRUNUX1RZUEUsIHJldHVyblZhbHVlSWR4KTsKKyAgICAgICAgfQorICAgICAgICAvLyB2YWx1ZSBpcyBhbHdheXMgc2F2ZWQgaW4gYm94ZWQgZm9ybSwgc28gd2UgbmVlZCB0byB1bmJveCBpdCBoZXJlICAgICAgICAKKyAgICAgICAgaGVscGVyLnVuYm94KHJldHVyblR5cGUpOworICAgICAgICBoZWxwZXIuZG9SZXR1cm4ocmV0dXJuVHlwZSk7CisgICAgICAgIG91dHB1dFJldHVybiA9IHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FzdHMgdG8gdGhlIGdpdmVuIHR5cGUgdW5sZXNzIGl0IGNhbiBiZSBkZXRlcm1pbmVkIHRoYXQgdGhlIGNhc3QgaXMgdW5uZWNlc3NhcnkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBkb0NvbnZlcnRBbmRDYXN0KENsYXNzTm9kZSB0eXBlLCBFeHByZXNzaW9uIGV4cHJlc3Npb24sIGJvb2xlYW4gaWdub3JlQXV0b2JveGluZywgYm9vbGVhbiBmb3JjZUNhc3QsIGJvb2xlYW4gY29lcmNlKSB7CisgICAgICAgIENsYXNzTm9kZSBleHBUeXBlID0gZ2V0RXhwcmVzc2lvblR5cGUoZXhwcmVzc2lvbik7CisgICAgICAgIC8vIHRlbXAgcmVzb2x1dGlvbjogY29udmVydCBhbGwgcHJpbWl0aXZlIGNhc3RpbmcgdG8gY29ycmVzcG9uc2luZyBPYmplY3QgdHlwZQorICAgICAgICBpZiAoIWlnbm9yZUF1dG9ib3hpbmcgJiYgQ2xhc3NIZWxwZXIuaXNQcmltaXRpdmVUeXBlKHR5cGUpKSB7CisgICAgICAgICAgICB0eXBlID0gQ2xhc3NIZWxwZXIuZ2V0V3JhcHBlcih0eXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmb3JjZUNhc3QgfHwgKHR5cGUgIT0gbnVsbCAmJiAhdHlwZS5lcXVhbHMoZXhwVHlwZSkpKSB7CisgICAgICAgICAgICBkb0NvbnZlcnRBbmRDYXN0KHR5cGUsIGNvZXJjZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gZXhwcmVzc2lvbgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGV2YWx1YXRlRXhwcmVzc2lvbihFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKyAgICAgICAgdmlzaXRBbmRBdXRvYm94Qm9vbGVhbihleHByZXNzaW9uKTsKKworICAgICAgICBFeHByZXNzaW9uIGFzc2lnbkV4cHIgPSBjcmVhdGVSZXR1cm5MSFNFeHByZXNzaW9uKGV4cHJlc3Npb24pOworICAgICAgICBpZiAoYXNzaWduRXhwciAhPSBudWxsKSB7CisgICAgICAgICAgICBsZWZ0SGFuZEV4cHJlc3Npb24gPSBmYWxzZTsKKyAgICAgICAgICAgIGFzc2lnbkV4cHIudmlzaXQodGhpcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEV4cHJlc3Npb25TdGF0ZW1lbnQoRXhwcmVzc2lvblN0YXRlbWVudCBzdGF0ZW1lbnQpIHsKKyAgICAgICAgb25MaW5lTnVtYmVyKHN0YXRlbWVudCwgInZpc2l0RXhwcmVzc2lvblN0YXRlbWVudDogIiArIHN0YXRlbWVudC5nZXRFeHByZXNzaW9uKCkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICB2aXNpdFN0YXRlbWVudChzdGF0ZW1lbnQpOworCisgICAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHN0YXRlbWVudC5nZXRFeHByZXNzaW9uKCk7CisKKyAgICAgICAgdmlzaXRBbmRBdXRvYm94Qm9vbGVhbihleHByZXNzaW9uKTsKKworICAgICAgICBpZiAoaXNQb3BSZXF1aXJlZChleHByZXNzaW9uKSkgeworICAgICAgICAgICAgbXYudmlzaXRJbnNuKFBPUCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBFeHByZXNzaW9ucworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgcHVibGljIHZvaWQgdmlzaXREZWNsYXJhdGlvbkV4cHJlc3Npb24oRGVjbGFyYXRpb25FeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKyAgICAgICAgb25MaW5lTnVtYmVyKGV4cHJlc3Npb24sICJ2aXNpdERlY2xhcmF0aW9uRXhwcmVzc2lvbjogXCIiICsgZXhwcmVzc2lvbi5nZXRWYXJpYWJsZUV4cHJlc3Npb24oKS5nZXROYW1lKCkgKyAiXCIiKTsKKworICAgICAgICBFeHByZXNzaW9uIHJpZ2h0RXhwcmVzc2lvbiA9IGV4cHJlc3Npb24uZ2V0UmlnaHRFeHByZXNzaW9uKCk7CisgICAgICAgIC8vIG5vIG5lZWQgdG8gdmlzaXQgbGVmdCBzaWRlLCBqdXN0IGdldCB0aGUgdmFyaWFibGUgbmFtZQorICAgICAgICBWYXJpYWJsZUV4cHJlc3Npb24gdmV4ID0gZXhwcmVzc2lvbi5nZXRWYXJpYWJsZUV4cHJlc3Npb24oKTsKKyAgICAgICAgQ2xhc3NOb2RlIHR5cGUgPSB2ZXguZ2V0VHlwZSgpOworCisgICAgICAgIC8vIGxldHMgbm90IGNhc3QgZm9yIHByaW1pdGl2ZSB0eXBlcyBhcyB3ZSBoYW5kbGUgdGhlc2UgaW4gZmllbGQgc2V0dGluZyBldGMKKyAgICAgICAgaWYgKENsYXNzSGVscGVyLmlzUHJpbWl0aXZlVHlwZSh0eXBlKSkgeworICAgICAgICAgICAgcmlnaHRFeHByZXNzaW9uLnZpc2l0KHRoaXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHR5cGUgIT0gQ2xhc3NIZWxwZXIuT0JKRUNUX1RZUEUpIHsKKyAgICAgICAgICAgICAgICB2aXNpdENhc3RFeHByZXNzaW9uKG5ldyBDYXN0RXhwcmVzc2lvbih0eXBlLCByaWdodEV4cHJlc3Npb24pKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdmlzaXRBbmRBdXRvYm94Qm9vbGVhbihyaWdodEV4cHJlc3Npb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbXBpbGVTdGFjay5kZWZpbmVWYXJpYWJsZSh2ZXgsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0QmluYXJ5RXhwcmVzc2lvbihCaW5hcnlFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKyAgICAgICAgb25MaW5lTnVtYmVyKGV4cHJlc3Npb24sICJ2aXNpdEJpbmFyeUV4cHJlc3Npb246IFwiIiArIGV4cHJlc3Npb24uZ2V0T3BlcmF0aW9uKCkuZ2V0VGV4dCgpICsgIlwiICIpOworICAgICAgICBzd2l0Y2ggKGV4cHJlc3Npb24uZ2V0T3BlcmF0aW9uKCkuZ2V0VHlwZSgpKSB7CisgICAgICAgICAgICBjYXNlIFR5cGVzLkVRVUFMOiAvLyA9IGFzc2lnbm1lbnQKKyAgICAgICAgICAgICAgICBldmFsdWF0ZUVxdWFsKGV4cHJlc3Npb24pOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFR5cGVzLkNPTVBBUkVfSURFTlRJQ0FMOiAvLyA9PT0KKyAgICAgICAgICAgICAgICBldmFsdWF0ZUJpbmFyeUV4cHJlc3Npb24oY29tcGFyZUlkZW50aWNhbE1ldGhvZCwgZXhwcmVzc2lvbik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuQ09NUEFSRV9FUVVBTDogLy8gPT0KKyAgICAgICAgICAgICAgICBldmFsdWF0ZUJpbmFyeUV4cHJlc3Npb24oY29tcGFyZUVxdWFsTWV0aG9kLCBleHByZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBUeXBlcy5DT01QQVJFX05PVF9FUVVBTDoKKyAgICAgICAgICAgICAgICBldmFsdWF0ZUJpbmFyeUV4cHJlc3Npb24oY29tcGFyZU5vdEVxdWFsTWV0aG9kLCBleHByZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBUeXBlcy5DT01QQVJFX1RPOgorICAgICAgICAgICAgICAgIGV2YWx1YXRlQ29tcGFyZVRvKGV4cHJlc3Npb24pOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFR5cGVzLkNPTVBBUkVfR1JFQVRFUl9USEFOOgorICAgICAgICAgICAgICAgIGV2YWx1YXRlQmluYXJ5RXhwcmVzc2lvbihjb21wYXJlR3JlYXRlclRoYW5NZXRob2QsIGV4cHJlc3Npb24pOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFR5cGVzLkNPTVBBUkVfR1JFQVRFUl9USEFOX0VRVUFMOgorICAgICAgICAgICAgICAgIGV2YWx1YXRlQmluYXJ5RXhwcmVzc2lvbihjb21wYXJlR3JlYXRlclRoYW5FcXVhbE1ldGhvZCwgZXhwcmVzc2lvbik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuQ09NUEFSRV9MRVNTX1RIQU46CisgICAgICAgICAgICAgICAgZXZhbHVhdGVCaW5hcnlFeHByZXNzaW9uKGNvbXBhcmVMZXNzVGhhbk1ldGhvZCwgZXhwcmVzc2lvbik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuQ09NUEFSRV9MRVNTX1RIQU5fRVFVQUw6CisgICAgICAgICAgICAgICAgZXZhbHVhdGVCaW5hcnlFeHByZXNzaW9uKGNvbXBhcmVMZXNzVGhhbkVxdWFsTWV0aG9kLCBleHByZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBUeXBlcy5MT0dJQ0FMX0FORDoKKyAgICAgICAgICAgICAgICBldmFsdWF0ZUxvZ2ljYWxBbmRFeHByZXNzaW9uKGV4cHJlc3Npb24pOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFR5cGVzLkxPR0lDQUxfT1I6CisgICAgICAgICAgICAgICAgZXZhbHVhdGVMb2dpY2FsT3JFeHByZXNzaW9uKGV4cHJlc3Npb24pOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFR5cGVzLkJJVFdJU0VfQU5EOgorICAgICAgICAgICAgICAgIGV2YWx1YXRlQmluYXJ5RXhwcmVzc2lvbigiYW5kIiwgZXhwcmVzc2lvbik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuQklUV0lTRV9BTkRfRVFVQUw6CisgICAgICAgICAgICAgICAgZXZhbHVhdGVCaW5hcnlFeHByZXNzaW9uV2l0aEFzc2lnbm1lbnQoImFuZCIsIGV4cHJlc3Npb24pOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFR5cGVzLkJJVFdJU0VfT1I6CisgICAgICAgICAgICAgICAgZXZhbHVhdGVCaW5hcnlFeHByZXNzaW9uKCJvciIsIGV4cHJlc3Npb24pOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFR5cGVzLkJJVFdJU0VfT1JfRVFVQUw6CisgICAgICAgICAgICAgICAgZXZhbHVhdGVCaW5hcnlFeHByZXNzaW9uV2l0aEFzc2lnbm1lbnQoIm9yIiwgZXhwcmVzc2lvbik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuQklUV0lTRV9YT1I6CisgICAgICAgICAgICAgICAgZXZhbHVhdGVCaW5hcnlFeHByZXNzaW9uKCJ4b3IiLCBleHByZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBUeXBlcy5CSVRXSVNFX1hPUl9FUVVBTDoKKyAgICAgICAgICAgICAgICBldmFsdWF0ZUJpbmFyeUV4cHJlc3Npb25XaXRoQXNzaWdubWVudCgieG9yIiwgZXhwcmVzc2lvbik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuUExVUzoKKyAgICAgICAgICAgICAgICBldmFsdWF0ZUJpbmFyeUV4cHJlc3Npb24oInBsdXMiLCBleHByZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBUeXBlcy5QTFVTX0VRVUFMOgorICAgICAgICAgICAgICAgIGV2YWx1YXRlQmluYXJ5RXhwcmVzc2lvbldpdGhBc3NpZ25tZW50KCJwbHVzIiwgZXhwcmVzc2lvbik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuTUlOVVM6CisgICAgICAgICAgICAgICAgZXZhbHVhdGVCaW5hcnlFeHByZXNzaW9uKCJtaW51cyIsIGV4cHJlc3Npb24pOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFR5cGVzLk1JTlVTX0VRVUFMOgorICAgICAgICAgICAgICAgIGV2YWx1YXRlQmluYXJ5RXhwcmVzc2lvbldpdGhBc3NpZ25tZW50KCJtaW51cyIsIGV4cHJlc3Npb24pOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFR5cGVzLk1VTFRJUExZOgorICAgICAgICAgICAgICAgIGV2YWx1YXRlQmluYXJ5RXhwcmVzc2lvbigibXVsdGlwbHkiLCBleHByZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBUeXBlcy5NVUxUSVBMWV9FUVVBTDoKKyAgICAgICAgICAgICAgICBldmFsdWF0ZUJpbmFyeUV4cHJlc3Npb25XaXRoQXNzaWdubWVudCgibXVsdGlwbHkiLCBleHByZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBUeXBlcy5ESVZJREU6CisgICAgICAgICAgICAgICAgZXZhbHVhdGVCaW5hcnlFeHByZXNzaW9uKCJkaXYiLCBleHByZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBUeXBlcy5ESVZJREVfRVFVQUw6CisgICAgICAgICAgICAgICAgLy9TUEcgZG9uJ3QgdXNlIGRpdmlkZSBzaW5jZSBCaWdJbnRlZ2VyIGltcGxlbWVudHMgZGlyZWN0bHkKKyAgICAgICAgICAgICAgICAvL2FuZCB3ZSB3YW50IHRvIGRpc3BhdGNoIHRocm91Z2ggRGVmYXVsdEdyb292eU1ldGhvZHMgdG8gZ2V0IGEgQmlnRGVjaW1hbCByZXN1bHQKKyAgICAgICAgICAgICAgICBldmFsdWF0ZUJpbmFyeUV4cHJlc3Npb25XaXRoQXNzaWdubWVudCgiZGl2IiwgZXhwcmVzc2lvbik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuSU5URElWOgorICAgICAgICAgICAgICAgIGV2YWx1YXRlQmluYXJ5RXhwcmVzc2lvbigiaW50ZGl2IiwgZXhwcmVzc2lvbik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuSU5URElWX0VRVUFMOgorICAgICAgICAgICAgICAgIGV2YWx1YXRlQmluYXJ5RXhwcmVzc2lvbldpdGhBc3NpZ25tZW50KCJpbnRkaXYiLCBleHByZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBUeXBlcy5NT0Q6CisgICAgICAgICAgICAgICAgZXZhbHVhdGVCaW5hcnlFeHByZXNzaW9uKCJtb2QiLCBleHByZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBUeXBlcy5NT0RfRVFVQUw6CisgICAgICAgICAgICAgICAgZXZhbHVhdGVCaW5hcnlFeHByZXNzaW9uV2l0aEFzc2lnbm1lbnQoIm1vZCIsIGV4cHJlc3Npb24pOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFR5cGVzLlBPV0VSOgorICAgICAgICAgICAgICAgIGV2YWx1YXRlQmluYXJ5RXhwcmVzc2lvbigicG93ZXIiLCBleHByZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBUeXBlcy5QT1dFUl9FUVVBTDoKKyAgICAgICAgICAgICAgICBldmFsdWF0ZUJpbmFyeUV4cHJlc3Npb25XaXRoQXNzaWdubWVudCgicG93ZXIiLCBleHByZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBUeXBlcy5MRUZUX1NISUZUOgorICAgICAgICAgICAgICAgIGV2YWx1YXRlQmluYXJ5RXhwcmVzc2lvbigibGVmdFNoaWZ0IiwgZXhwcmVzc2lvbik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuTEVGVF9TSElGVF9FUVVBTDoKKyAgICAgICAgICAgICAgICBldmFsdWF0ZUJpbmFyeUV4cHJlc3Npb25XaXRoQXNzaWdubWVudCgibGVmdFNoaWZ0IiwgZXhwcmVzc2lvbik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuUklHSFRfU0hJRlQ6CisgICAgICAgICAgICAgICAgZXZhbHVhdGVCaW5hcnlFeHByZXNzaW9uKCJyaWdodFNoaWZ0IiwgZXhwcmVzc2lvbik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuUklHSFRfU0hJRlRfRVFVQUw6CisgICAgICAgICAgICAgICAgZXZhbHVhdGVCaW5hcnlFeHByZXNzaW9uV2l0aEFzc2lnbm1lbnQoInJpZ2h0U2hpZnQiLCBleHByZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBUeXBlcy5SSUdIVF9TSElGVF9VTlNJR05FRDoKKyAgICAgICAgICAgICAgICBldmFsdWF0ZUJpbmFyeUV4cHJlc3Npb24oInJpZ2h0U2hpZnRVbnNpZ25lZCIsIGV4cHJlc3Npb24pOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFR5cGVzLlJJR0hUX1NISUZUX1VOU0lHTkVEX0VRVUFMOgorICAgICAgICAgICAgICAgIGV2YWx1YXRlQmluYXJ5RXhwcmVzc2lvbldpdGhBc3NpZ25tZW50KCJyaWdodFNoaWZ0VW5zaWduZWQiLCBleHByZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBUeXBlcy5LRVlXT1JEX0lOU1RBTkNFT0Y6CisgICAgICAgICAgICAgICAgZXZhbHVhdGVJbnN0YW5jZW9mKGV4cHJlc3Npb24pOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFR5cGVzLkZJTkRfUkVHRVg6CisgICAgICAgICAgICAgICAgZXZhbHVhdGVCaW5hcnlFeHByZXNzaW9uKGZpbmRSZWdleE1ldGhvZCwgZXhwcmVzc2lvbik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgVHlwZXMuTUFUQ0hfUkVHRVg6CisgICAgICAgICAgICAgICAgZXZhbHVhdGVCaW5hcnlFeHByZXNzaW9uKG1hdGNoUmVnZXhNZXRob2QsIGV4cHJlc3Npb24pOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFR5cGVzLkxFRlRfU1FVQVJFX0JSQUNLRVQ6CisgICAgICAgICAgICAgICAgaWYgKGxlZnRIYW5kRXhwcmVzc2lvbikgeworICAgICAgICAgICAgICAgICAgICB0aHJvd0V4Y2VwdGlvbigiU2hvdWxkIG5vdCBiZSBjYWxsZWQgaGVyZS4gUG9zc2libGUgcmVhc29uOiBwb3N0Zml4IG9wZXJhdGlvbiBvbiBhcnJheS4iKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBoYW5kbGVkIHJpZ2h0IG5vdyBpbiB0aGUgZXZhbHVhdGVFcXVhbCgpCisgICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZCBzdXBwb3J0IHRoaXMgaGVyZSBsYXRlcgorICAgICAgICAgICAgICAgICAgICAvL2V2YWx1YXRlQmluYXJ5RXhwcmVzc2lvbigicHV0QXQiLCBleHByZXNzaW9uKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBldmFsdWF0ZUJpbmFyeUV4cHJlc3Npb24oImdldEF0IiwgZXhwcmVzc2lvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFR5cGVzLktFWVdPUkRfSU46CisgICAgICAgICAgICAgICAgZXZhbHVhdGVCaW5hcnlFeHByZXNzaW9uKGlzQ2FzZU1ldGhvZCwgZXhwcmVzc2lvbik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3dFeGNlcHRpb24oIk9wZXJhdGlvbjogIiArIGV4cHJlc3Npb24uZ2V0T3BlcmF0aW9uKCkgKyAiIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBsb2FkKEV4cHJlc3Npb24gZXhwKSB7CisKKyAgICAgICAgYm9vbGVhbiB3YXNMZWZ0ID0gbGVmdEhhbmRFeHByZXNzaW9uOworICAgICAgICBsZWZ0SGFuZEV4cHJlc3Npb24gPSBmYWxzZTsKKy8vICAgICAgICBpZiAoQ1JFQVRFX0RFQlVHX0lORk8pCisvLyAgICAgICAgICAgIGhlbHBlci5tYXJrKCItLSBsb2FkaW5nIGV4cHJlc3Npb246ICIgKyBleHAuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKworLy8gICAgICAgICAgICAgICAgICAgICIgYXQgWyIgKyBleHAuZ2V0TGluZU51bWJlcigpICsgIjoiICsgZXhwLmdldENvbHVtbk51bWJlcigpICsgIl0iKTsKKyAgICAgICAgLy9leHAudmlzaXQodGhpcyk7CisgICAgICAgIHZpc2l0QW5kQXV0b2JveEJvb2xlYW4oZXhwKTsKKy8vICAgICAgICBpZiAoQ1JFQVRFX0RFQlVHX0lORk8pCisvLyAgICAgICAgICAgIGhlbHBlci5tYXJrKCIgLS0gZW5kIG9mIGxvYWRpbmcgLS0iKTsKKworICAgICAgICBsZWZ0SGFuZEV4cHJlc3Npb24gPSB3YXNMZWZ0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0UG9zdGZpeEV4cHJlc3Npb24oUG9zdGZpeEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgICAgICBzd2l0Y2ggKGV4cHJlc3Npb24uZ2V0T3BlcmF0aW9uKCkuZ2V0VHlwZSgpKSB7CisgICAgICAgICAgICBjYXNlIFR5cGVzLlBMVVNfUExVUzoKKyAgICAgICAgICAgICAgICBldmFsdWF0ZVBvc3RmaXhNZXRob2QoIm5leHQiLCBleHByZXNzaW9uLmdldEV4cHJlc3Npb24oKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFR5cGVzLk1JTlVTX01JTlVTOgorICAgICAgICAgICAgICAgIGV2YWx1YXRlUG9zdGZpeE1ldGhvZCgicHJldmlvdXMiLCBleHByZXNzaW9uLmdldEV4cHJlc3Npb24oKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGhyb3dFeGNlcHRpb24oU3RyaW5nIHMpIHsKKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVQYXJzZXJFeGNlcHRpb24ocywgY3VycmVudEFTVE5vZGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0UHJlZml4RXhwcmVzc2lvbihQcmVmaXhFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKyAgICAgICAgc3dpdGNoIChleHByZXNzaW9uLmdldE9wZXJhdGlvbigpLmdldFR5cGUoKSkgeworICAgICAgICAgICAgY2FzZSBUeXBlcy5QTFVTX1BMVVM6CisgICAgICAgICAgICAgICAgZXZhbHVhdGVQcmVmaXhNZXRob2QoIm5leHQiLCBleHByZXNzaW9uLmdldEV4cHJlc3Npb24oKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFR5cGVzLk1JTlVTX01JTlVTOgorICAgICAgICAgICAgICAgIGV2YWx1YXRlUHJlZml4TWV0aG9kKCJwcmV2aW91cyIsIGV4cHJlc3Npb24uZ2V0RXhwcmVzc2lvbigpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0Q2xvc3VyZUV4cHJlc3Npb24oQ2xvc3VyZUV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgICAgICBDbGFzc05vZGUgaW5uZXJDbGFzcyA9IGNyZWF0ZUNsb3N1cmVDbGFzcyhleHByZXNzaW9uKTsKKyAgICAgICAgYWRkSW5uZXJDbGFzcyhpbm5lckNsYXNzKTsKKyAgICAgICAgaW5uZXJDbGFzcy5hZGRJbnRlcmZhY2UoQ2xhc3NIZWxwZXIuR0VORVJBVEVEX0NMT1NVUkVfVHlwZSk7CisgICAgICAgIFN0cmluZyBpbm5lckNsYXNzaW50ZXJuYWxOYW1lID0gQnl0ZWNvZGVIZWxwZXIuZ2V0Q2xhc3NJbnRlcm5hbE5hbWUoaW5uZXJDbGFzcyk7CisKKyAgICAgICAgcGFzc2luZ0Nsb3N1cmVQYXJhbXMgPSB0cnVlOworICAgICAgICBMaXN0IGNvbnN0cnVjdG9ycyA9IGlubmVyQ2xhc3MuZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcnMoKTsKKyAgICAgICAgQ29uc3RydWN0b3JOb2RlIG5vZGUgPSAoQ29uc3RydWN0b3JOb2RlKSBjb25zdHJ1Y3RvcnMuZ2V0KDApOworCisgICAgICAgIFBhcmFtZXRlcltdIGxvY2FsVmFyaWFibGVQYXJhbXMgPSBub2RlLmdldFBhcmFtZXRlcnMoKTsKKworICAgICAgICBtdi52aXNpdFR5cGVJbnNuKE5FVywgaW5uZXJDbGFzc2ludGVybmFsTmFtZSk7CisgICAgICAgIG12LnZpc2l0SW5zbihEVVApOworICAgICAgICBpZiAoaXNTdGF0aWNNZXRob2QoKSAmJiAhY2xhc3NOb2RlLmRlY2xhcmVzSW50ZXJmYWNlKENsYXNzSGVscGVyLkdFTkVSQVRFRF9DTE9TVVJFX1R5cGUuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgdmlzaXRDbGFzc0V4cHJlc3Npb24obmV3IENsYXNzRXhwcmVzc2lvbihjbGFzc05vZGUpKTsKKyAgICAgICAgICAgIHZpc2l0Q2xhc3NFeHByZXNzaW9uKG5ldyBDbGFzc0V4cHJlc3Npb24oZ2V0T3V0ZXJtb3N0Q2xhc3MoKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbXYudmlzaXRWYXJJbnNuKEFMT0FELCAwKTsKKyAgICAgICAgICAgIGxvYWRUaGlzKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBub3cgbGV0cyBsb2FkIHRoZSB2YXJpb3VzIHBhcmFtZXRlcnMgd2UncmUgcGFzc2luZworICAgICAgICAvLyB3ZSBzdGFydCBhdCBpbmRleCAxIGJlY2F1c2UgdGhlIGZpcnN0IHZhcmlhYmxlIHdlIHBhc3MKKyAgICAgICAgLy8gaXMgdGhlIG93bmVyIGluc3RhbmNlIGFuZCBhdCB0aGlzIHBvaW50IGl0IGlzIGFscmVhZHkgCisgICAgICAgIC8vIG9uIHRoZSBzdGFjaworICAgICAgICBmb3IgKGludCBpID0gMjsgaSA8IGxvY2FsVmFyaWFibGVQYXJhbXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIFBhcmFtZXRlciBwYXJhbSA9IGxvY2FsVmFyaWFibGVQYXJhbXNbaV07CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHBhcmFtLmdldE5hbWUoKTsKKworICAgICAgICAgICAgLy8gY29tcGlsZVN0YWNrLmNvbnRhaW5zVmFyaWFibGUobmFtZSkgbWVhbnMgdG8gYXNrIGlmIHRoZSB2YXJpYWJsZSBpcyBhbHJlYWR5IGRlY2xhcmVkCisgICAgICAgICAgICAvLyBjb21waWxlU3RhY2suZ2V0U2NvcGUoKS5pc1JlZmVyZW5jZWRDbGFzc1ZhcmlhYmxlKG5hbWUpIG1lYW5zIHRvIGFzayBpZiB0aGUgdmFyaWFibGUgaXMgYSBmaWVsZAorICAgICAgICAgICAgLy8gSWYgaXQgaXMgbm8gZmllbGQgYW5kIGlzIG5vdCB5ZXQgZGVjbGFyZWQsIHRoZW4gaXQgaXMgZWl0aGVyIGEgY2xvc3VyZSBzaGFyZWQgdmFyaWFibGUgb3IgCisgICAgICAgICAgICAvLyBhbiBhbHJlYWR5IGRlY2xhcmVkIHZhcmlhYmxlLiAKKyAgICAgICAgICAgIGlmICghY29tcGlsZVN0YWNrLmNvbnRhaW5zVmFyaWFibGUobmFtZSkgJiYgY29tcGlsZVN0YWNrLmdldFNjb3BlKCkuaXNSZWZlcmVuY2VkQ2xhc3NWYXJpYWJsZShuYW1lKSkgeworICAgICAgICAgICAgICAgIHZpc2l0RmllbGRFeHByZXNzaW9uKG5ldyBGaWVsZEV4cHJlc3Npb24oY2xhc3NOb2RlLmdldEZpZWxkKG5hbWUpKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFZhcmlhYmxlIHYgPSBjb21waWxlU3RhY2suZ2V0VmFyaWFibGUobmFtZSwgY2xhc3NOb2RlLmdldFN1cGVyQ2xhc3MoKSAhPSBDbGFzc0hlbHBlci5DTE9TVVJFX1RZUEUpOworICAgICAgICAgICAgICAgIGlmICh2ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdmFyaWFibGUgaXMgbm90IG9uIHN0YWNrIGJlY2F1c2Ugd2UgYXJlCisgICAgICAgICAgICAgICAgICAgIC8vIGluc2lkZSBhIG5lc3RlZCBDbG9zdXJlIGFuZCB0aGlzIHZhcmlhYmxlCisgICAgICAgICAgICAgICAgICAgIC8vIHdhcyBub3QgdXNlZCBiZWZvcmUKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiBsb2FkIGl0IGZyb20gdGhlIENsb3N1cmUgZmllbGQKKyAgICAgICAgICAgICAgICAgICAgRmllbGROb2RlIGZpZWxkID0gY2xhc3NOb2RlLmdldEZpZWxkKG5hbWUpOworICAgICAgICAgICAgICAgICAgICBtdi52aXNpdFZhckluc24oQUxPQUQsIDApOworICAgICAgICAgICAgICAgICAgICBtdi52aXNpdEZpZWxkSW5zbihHRVRGSUVMRCwgaW50ZXJuYWxDbGFzc05hbWUsIG5hbWUsIEJ5dGVjb2RlSGVscGVyLmdldFR5cGVEZXNjcmlwdGlvbihmaWVsZC5nZXRUeXBlKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGRlZmluZSBpdAorICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOgorICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjYW4gc2ltcGx5IGRlZmluZSBpdCBoZXJlIGFuZCBkb24ndCBoYXZlIHRvCisgICAgICAgICAgICAgICAgICAgIC8vIGJlIGFmcmFpZCBhYm91dCBuYW1lIHByb2JsZW1zIGJlY2F1c2UgYSBzZWNvbmQKKyAgICAgICAgICAgICAgICAgICAgLy8gdmFyaWFibGUgd2l0aCB0aGF0IG5hbWUgaXMgbm90IGFsbG93ZWQgaW5zaWRlIHRoZSBjbG9zdXJlCisgICAgICAgICAgICAgICAgICAgIHBhcmFtLnNldENsb3N1cmVTaGFyZWRWYXJpYWJsZShmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIHYgPSBjb21waWxlU3RhY2suZGVmaW5lVmFyaWFibGUocGFyYW0sIHRydWUpOworICAgICAgICAgICAgICAgICAgICBwYXJhbS5zZXRDbG9zdXJlU2hhcmVkVmFyaWFibGUodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIHYuc2V0SG9sZGVyKHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtdi52aXNpdFZhckluc24oQUxPQUQsIHYuZ2V0SW5kZXgoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcGFzc2luZ0Nsb3N1cmVQYXJhbXMgPSBmYWxzZTsKKworICAgICAgICAvLyB3ZSBtYXkgbmVlZCB0byBwYXNzIGluIHNvbWUgb3RoZXIgY29uc3RydWN0b3JzCisgICAgICAgIC8vY3YudmlzaXRNZXRob2RJbnNuKElOVk9LRVNQRUNJQUwsIGlubmVyQ2xhc3NpbnRlcm5hbE5hbWUsICI8aW5pdD4iLCBwcm90b3R5cGUgKyAiKVYiKTsKKyAgICAgICAgbXYudmlzaXRNZXRob2RJbnNuKAorICAgICAgICAgICAgICAgIElOVk9LRVNQRUNJQUwsCisgICAgICAgICAgICAgICAgaW5uZXJDbGFzc2ludGVybmFsTmFtZSwKKyAgICAgICAgICAgICAgICAiPGluaXQ+IiwKKyAgICAgICAgICAgICAgICBCeXRlY29kZUhlbHBlci5nZXRNZXRob2REZXNjcmlwdG9yKENsYXNzSGVscGVyLlZPSURfVFlQRSwgbG9jYWxWYXJpYWJsZVBhcmFtcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvYWRzIGVpdGhlciB0aGlzIG9iamVjdCBvciBpZiB3ZSdyZSBpbnNpZGUgYSBjbG9zdXJlIHRoZW4gbG9hZCB0aGUgdG9wIGxldmVsIG93bmVyCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgbG9hZFRoaXNPck93bmVyKCkgeworICAgICAgICBpZiAoaXNJbm5lckNsYXNzKCkpIHsKKyAgICAgICAgICAgIHZpc2l0RmllbGRFeHByZXNzaW9uKG5ldyBGaWVsZEV4cHJlc3Npb24oY2xhc3NOb2RlLmdldEZpZWxkKCJvd25lciIpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsb2FkVGhpcygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRSZWdleEV4cHJlc3Npb24oUmVnZXhFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKyAgICAgICAgZXhwcmVzc2lvbi5nZXRSZWdleCgpLnZpc2l0KHRoaXMpOworICAgICAgICByZWdleFBhdHRlcm4uY2FsbChtdik7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGUgYnl0ZSBjb2RlIGZvciBjb25zdGFudHMKKyAgICAgKgorICAgICAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL3Ztc3BlYy8ybmQtZWRpdGlvbi9odG1sL0NsYXNzRmlsZS5kb2MuaHRtbCMxNDE1MiI+Q2xhc3MgZmllbGQgdHlwZXM8L2E+CisgICAgICovCisgICAgcHVibGljIHZvaWQgdmlzaXRDb25zdGFudEV4cHJlc3Npb24oQ29uc3RhbnRFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKyAgICAgICAgT2JqZWN0IHZhbHVlID0gZXhwcmVzc2lvbi5nZXRWYWx1ZSgpOworICAgICAgICBoZWxwZXIubG9hZENvbnN0YW50KHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFNwcmVhZEV4cHJlc3Npb24oU3ByZWFkRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisgICAgICAgIHRocm93IG5ldyBHcm9vdnlCdWdFcnJvcigiU3ByZWFkRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIHZpc2l0ZWQgaGVyZSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0U3ByZWFkTWFwRXhwcmVzc2lvbihTcHJlYWRNYXBFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKyAgICAgICAgRXhwcmVzc2lvbiBzdWJFeHByZXNzaW9uID0gZXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uKCk7CisgICAgICAgIHN1YkV4cHJlc3Npb24udmlzaXQodGhpcyk7CisgICAgICAgIHNwcmVhZE1hcC5jYWxsKG12KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdE1ldGhvZFBvaW50ZXJFeHByZXNzaW9uKE1ldGhvZFBvaW50ZXJFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKyAgICAgICAgRXhwcmVzc2lvbiBzdWJFeHByZXNzaW9uID0gZXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uKCk7CisgICAgICAgIHN1YkV4cHJlc3Npb24udmlzaXQodGhpcyk7CisgICAgICAgIGxvYWREeW5hbWljTmFtZShleHByZXNzaW9uLmdldE1ldGhvZE5hbWUoKSk7CisgICAgICAgIGdldE1ldGhvZFBvaW50ZXIuY2FsbChtdik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGxvYWREeW5hbWljTmFtZShFeHByZXNzaW9uIG5hbWUpIHsKKyAgICAgICAgaWYgKG5hbWUgaW5zdGFuY2VvZiBDb25zdGFudEV4cHJlc3Npb24pIHsKKyAgICAgICAgICAgIENvbnN0YW50RXhwcmVzc2lvbiBjZSA9IChDb25zdGFudEV4cHJlc3Npb24pIG5hbWU7CisgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBjZS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7CisgICAgICAgICAgICAgICAgaGVscGVyLmxvYWRDb25zdGFudCh2YWx1ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG5ldyBDYXN0RXhwcmVzc2lvbihDbGFzc0hlbHBlci5TVFJJTkdfVFlQRSwgbmFtZSkudmlzaXQodGhpcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRVbmFyeU1pbnVzRXhwcmVzc2lvbihVbmFyeU1pbnVzRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisgICAgICAgIEV4cHJlc3Npb24gc3ViRXhwcmVzc2lvbiA9IGV4cHJlc3Npb24uZ2V0RXhwcmVzc2lvbigpOworICAgICAgICBzdWJFeHByZXNzaW9uLnZpc2l0KHRoaXMpOworICAgICAgICB1bmFyeU1pbnVzLmNhbGwobXYpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0VW5hcnlQbHVzRXhwcmVzc2lvbihVbmFyeVBsdXNFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKyAgICAgICAgRXhwcmVzc2lvbiBzdWJFeHByZXNzaW9uID0gZXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uKCk7CisgICAgICAgIHN1YkV4cHJlc3Npb24udmlzaXQodGhpcyk7CisgICAgICAgIHVuYXJ5UGx1cy5jYWxsKG12KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEJpdHdpc2VOZWdhdGlvbkV4cHJlc3Npb24oQml0d2lzZU5lZ2F0aW9uRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisgICAgICAgIEV4cHJlc3Npb24gc3ViRXhwcmVzc2lvbiA9IGV4cHJlc3Npb24uZ2V0RXhwcmVzc2lvbigpOworICAgICAgICBzdWJFeHByZXNzaW9uLnZpc2l0KHRoaXMpOworICAgICAgICBiaXR3aXNlTmVnYXRlLmNhbGwobXYpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0Q2FzdEV4cHJlc3Npb24oQ2FzdEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgICAgICBDbGFzc05vZGUgdHlwZSA9IGV4cHJlc3Npb24uZ2V0VHlwZSgpOworICAgICAgICB2aXNpdEFuZEF1dG9ib3hCb29sZWFuKGV4cHJlc3Npb24uZ2V0RXhwcmVzc2lvbigpKTsKKyAgICAgICAgZG9Db252ZXJ0QW5kQ2FzdCh0eXBlLCBleHByZXNzaW9uLmdldEV4cHJlc3Npb24oKSwgZXhwcmVzc2lvbi5pc0lnbm9yaW5nQXV0b2JveGluZygpLCBmYWxzZSwgZXhwcmVzc2lvbi5pc0NvZXJjZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdE5vdEV4cHJlc3Npb24oTm90RXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisgICAgICAgIEV4cHJlc3Npb24gc3ViRXhwcmVzc2lvbiA9IGV4cHJlc3Npb24uZ2V0RXhwcmVzc2lvbigpOworICAgICAgICBzdWJFeHByZXNzaW9uLnZpc2l0KHRoaXMpOworICAgICAgICAvLyBpZiB3ZSBkbyAhb2JqZWN0LCB0aGVuIHRoZSBjYXN0IHRvIGJvb2xlYW4gd2lsbAorICAgICAgICAvLyBkbyB0aGUgY29udmVyc2lvbiBvZiBPYmplY3QgdG8gYm9vbGVhbi4gc28gYSBzaW1wbGUKKyAgICAgICAgLy8gY2FsbCB0byB1bmJveCBpcyBlbm91Z2ggaGVyZS4KKyAgICAgICAgaWYgKAorICAgICAgICAgICAgICAgICFpc0NvbXBhcmlzb25FeHByZXNzaW9uKHN1YkV4cHJlc3Npb24pICYmCisgICAgICAgICAgICAgICAgICAgICAgICAhKHN1YkV4cHJlc3Npb24gaW5zdGFuY2VvZiBCb29sZWFuRXhwcmVzc2lvbikpIHsKKyAgICAgICAgICAgIGhlbHBlci51bmJveChib29sZWFuLmNsYXNzKTsKKyAgICAgICAgfQorICAgICAgICBoZWxwZXIubmVnYXRlQm9vbGVhbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHJldHVybiBhIHByaW1pdGl2ZSBib29sZWFuIHZhbHVlIG9mIHRoZSBCb29sZWFuRXhwcmVzaW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGV4cHJlc3Npb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB2aXNpdEJvb2xlYW5FeHByZXNzaW9uKEJvb2xlYW5FeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKyAgICAgICAgY29tcGlsZVN0YWNrLnB1c2hCb29sZWFuRXhwcmVzc2lvbigpOworICAgICAgICBleHByZXNzaW9uLmdldEV4cHJlc3Npb24oKS52aXNpdCh0aGlzKTsKKworICAgICAgICBpZiAoIWlzQ29tcGFyaXNvbkV4cHJlc3Npb24oZXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uKCkpKSB7CisvLyBjb21tZW50IG91dCBmb3Igb3B0aW1pemF0aW9uIHdoZW4gYm9vbGVhbiB2YWx1ZXMgYXJlIG5vdCBhdXRvYm94ZWQgZm9yIGVnLiBmdW5jdGlvbiBjYWxscy4KKy8vICAgICAgICAgICBDbGFzcyB0eXBlQ2xhc3MgPSBleHByZXNzaW9uLmdldEV4cHJlc3Npb24oKS5nZXRUeXBlQ2xhc3MoKTsKKy8vICAgICAgICAgICBpZiAodHlwZUNsYXNzICE9IG51bGwgJiYgdHlwZUNsYXNzICE9IGJvb2xlYW4uY2xhc3MpIHsKKyAgICAgICAgICAgIGhlbHBlci51bmJveChib29sZWFuLmNsYXNzKTsgLy8gdG8gcmV0dXJuIGEgcHJpbWl0aXZlIGJvb2xlYW4KKy8vICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbXBpbGVTdGFjay5wb3AoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbWFrZUludm9rZU1ldGhvZENhbGwoTWV0aG9kQ2FsbEV4cHJlc3Npb24gY2FsbCwgYm9vbGVhbiB1c2VTdXBlciwgTWV0aG9kQ2FsbGVyTXVsdGlBZGFwdGVyIGFkYXB0ZXIpIHsKKyAgICAgICAgLy8gcmVjZWl2ZXIKKyAgICAgICAgLy8gd2Ugb3BlcmF0ZSBvbiBHcm9vdnlPYmplY3QgaWYgcG9zc2libGUKKyAgICAgICAgRXhwcmVzc2lvbiBvYmplY3RFeHByZXNzaW9uID0gY2FsbC5nZXRPYmplY3RFeHByZXNzaW9uKCk7CisgICAgICAgIGlmICghaXNTdGF0aWNNZXRob2QoKSAmJiAhaXNTdGF0aWNDb250ZXh0KCkgJiYgaXNUaGlzRXhwcmVzc2lvbihjYWxsLmdldE9iamVjdEV4cHJlc3Npb24oKSkpIHsKKyAgICAgICAgICAgIG9iamVjdEV4cHJlc3Npb24gPSBuZXcgQ2FzdEV4cHJlc3Npb24oQ2xhc3NIZWxwZXIubWFrZShHcm9vdnlPYmplY3QuY2xhc3MpLCBvYmplY3RFeHByZXNzaW9uKTsKKyAgICAgICAgfQorICAgICAgICAvLyBtZXNzYWdlIG5hbWUKKyAgICAgICAgRXhwcmVzc2lvbiBtZXNzYWdlTmFtZSA9IG5ldyBDYXN0RXhwcmVzc2lvbihDbGFzc0hlbHBlci5TVFJJTkdfVFlQRSwgY2FsbC5nZXRNZXRob2QoKSk7CisgICAgICAgIGlmICh1c2VTdXBlcikgeworICAgICAgICAgICAgbWFrZUNhbGwobmV3IENsYXNzRXhwcmVzc2lvbihnZXRPdXRlcm1vc3RDbGFzcygpLmdldFN1cGVyQ2xhc3MoKSksCisgICAgICAgICAgICAgICAgICAgIG9iamVjdEV4cHJlc3Npb24sIG1lc3NhZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICBjYWxsLmdldEFyZ3VtZW50cygpLCBhZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICBjYWxsLmlzU2FmZSgpLCBjYWxsLmlzU3ByZWFkU2FmZSgpLAorICAgICAgICAgICAgICAgICAgICBmYWxzZQorICAgICAgICAgICAgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1ha2VDYWxsKG9iamVjdEV4cHJlc3Npb24sIG1lc3NhZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICBjYWxsLmdldEFyZ3VtZW50cygpLCBhZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICBjYWxsLmlzU2FmZSgpLCBjYWxsLmlzU3ByZWFkU2FmZSgpLAorICAgICAgICAgICAgICAgICAgICBjYWxsLmlzSW1wbGljaXRUaGlzKCkKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbWFrZUNhbGwoCisgICAgICAgICAgICBFeHByZXNzaW9uIHJlY2VpdmVyLCBFeHByZXNzaW9uIG1lc3NhZ2UsIEV4cHJlc3Npb24gYXJndW1lbnRzLAorICAgICAgICAgICAgTWV0aG9kQ2FsbGVyTXVsdGlBZGFwdGVyIGFkYXB0ZXIsCisgICAgICAgICAgICBib29sZWFuIHNhZmUsIGJvb2xlYW4gc3ByZWFkU2FmZSwgYm9vbGVhbiBpbXBsaWNpdFRoaXMKKyAgICApIHsKKyAgICAgICAgQ2xhc3NOb2RlIGNuID0gY2xhc3NOb2RlOworICAgICAgICBpZiAoaXNJbkNsb3N1cmUoKSAmJiAhaW1wbGljaXRUaGlzKSB7CisgICAgICAgICAgICBjbiA9IGdldE91dGVybW9zdENsYXNzKCk7CisgICAgICAgIH0KKyAgICAgICAgbWFrZUNhbGwobmV3IENsYXNzRXhwcmVzc2lvbihjbiksIHJlY2VpdmVyLCBtZXNzYWdlLCBhcmd1bWVudHMsCisgICAgICAgICAgICAgICAgYWRhcHRlciwgc2FmZSwgc3ByZWFkU2FmZSwgaW1wbGljaXRUaGlzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbWFrZUNhbGwoCisgICAgICAgICAgICBDbGFzc0V4cHJlc3Npb24gc2VuZGVyLAorICAgICAgICAgICAgRXhwcmVzc2lvbiByZWNlaXZlciwgRXhwcmVzc2lvbiBtZXNzYWdlLCBFeHByZXNzaW9uIGFyZ3VtZW50cywKKyAgICAgICAgICAgIE1ldGhvZENhbGxlck11bHRpQWRhcHRlciBhZGFwdGVyLAorICAgICAgICAgICAgYm9vbGVhbiBzYWZlLCBib29sZWFuIHNwcmVhZFNhZmUsIGJvb2xlYW4gaW1wbGljaXRUaGlzCisgICAgKSB7CisgICAgICAgIC8vIGVuc3VyZSBWYXJpYWJsZUFyZ3VtZW50cyBhcmUgcmVhZCwgbm90IHN0b3JlZAorICAgICAgICBib29sZWFuIGxocyA9IGxlZnRIYW5kRXhwcmVzc2lvbjsKKyAgICAgICAgbGVmdEhhbmRFeHByZXNzaW9uID0gZmFsc2U7CisKKyAgICAgICAgLy8gc2VuZGVyCisgICAgICAgIHNlbmRlci52aXNpdCh0aGlzKTsKKyAgICAgICAgLy8gcmVjZWl2ZXIKKyAgICAgICAgYm9vbGVhbiBvbGRWYWwgPSB0aGlzLmltcGxpY2l0VGhpczsKKyAgICAgICAgdGhpcy5pbXBsaWNpdFRoaXMgPSBpbXBsaWNpdFRoaXM7CisgICAgICAgIHZpc2l0QW5kQXV0b2JveEJvb2xlYW4ocmVjZWl2ZXIpOworICAgICAgICB0aGlzLmltcGxpY2l0VGhpcyA9IG9sZFZhbDsKKyAgICAgICAgLy8gbWVzc2FnZQorICAgICAgICBpZiAobWVzc2FnZSAhPSBudWxsKSBtZXNzYWdlLnZpc2l0KHRoaXMpOworCisgICAgICAgIC8vIGFyZ3VtZW50cworICAgICAgICBib29sZWFuIGNvbnRhaW5zU3ByZWFkRXhwcmVzc2lvbiA9IGNvbnRhaW5zU3ByZWFkRXhwcmVzc2lvbihhcmd1bWVudHMpOworICAgICAgICBpbnQgbnVtYmVyT2ZBcmd1bWVudHMgPSBjb250YWluc1NwcmVhZEV4cHJlc3Npb24gPyAtMSA6IGFyZ3VtZW50U2l6ZShhcmd1bWVudHMpOworICAgICAgICBpZiAobnVtYmVyT2ZBcmd1bWVudHMgPiBhZGFwdGVyLk1BWF9BUkdTIHx8IGNvbnRhaW5zU3ByZWFkRXhwcmVzc2lvbikgeworICAgICAgICAgICAgQXJndW1lbnRMaXN0RXhwcmVzc2lvbiBhZTsKKyAgICAgICAgICAgIGlmIChhcmd1bWVudHMgaW5zdGFuY2VvZiBBcmd1bWVudExpc3RFeHByZXNzaW9uKSB7CisgICAgICAgICAgICAgICAgYWUgPSAoQXJndW1lbnRMaXN0RXhwcmVzc2lvbikgYXJndW1lbnRzOworICAgICAgICAgICAgfSBlbHNlIGlmIChhcmd1bWVudHMgaW5zdGFuY2VvZiBUdXBsZUV4cHJlc3Npb24pIHsKKyAgICAgICAgICAgICAgICBUdXBsZUV4cHJlc3Npb24gdGUgPSAoVHVwbGVFeHByZXNzaW9uKSBhcmd1bWVudHM7CisgICAgICAgICAgICAgICAgYWUgPSBuZXcgQXJndW1lbnRMaXN0RXhwcmVzc2lvbih0ZS5nZXRFeHByZXNzaW9ucygpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYWUgPSBuZXcgQXJndW1lbnRMaXN0RXhwcmVzc2lvbigpOworICAgICAgICAgICAgICAgIGFlLmFkZEV4cHJlc3Npb24oYXJndW1lbnRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjb250YWluc1NwcmVhZEV4cHJlc3Npb24pIHsKKyAgICAgICAgICAgICAgICBkZXNwcmVhZExpc3QoYWUuZ2V0RXhwcmVzc2lvbnMoKSwgdHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFlLnZpc2l0KHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG51bWJlck9mQXJndW1lbnRzID4gMCkgeworICAgICAgICAgICAgVHVwbGVFeHByZXNzaW9uIHRlID0gKFR1cGxlRXhwcmVzc2lvbikgYXJndW1lbnRzOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXJPZkFyZ3VtZW50czsgaSsrKSB7CisgICAgICAgICAgICAgICAgRXhwcmVzc2lvbiBhcmd1bWVudCA9IHRlLmdldEV4cHJlc3Npb24oaSk7CisgICAgICAgICAgICAgICAgdmlzaXRBbmRBdXRvYm94Qm9vbGVhbihhcmd1bWVudCk7CisgICAgICAgICAgICAgICAgaWYgKGFyZ3VtZW50IGluc3RhbmNlb2YgQ2FzdEV4cHJlc3Npb24pIGxvYWRXcmFwcGVyKGFyZ3VtZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGFkYXB0ZXIuY2FsbChtdiwgbnVtYmVyT2ZBcmd1bWVudHMsIHNhZmUsIHNwcmVhZFNhZmUpOworCisgICAgICAgIGxlZnRIYW5kRXhwcmVzc2lvbiA9IGxoczsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGVzcHJlYWRMaXN0KExpc3QgZXhwcmVzc2lvbnMsIGJvb2xlYW4gd3JhcCkgeworCisgICAgICAgIEFycmF5TGlzdCBzcHJlYWRJbmRleGVzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBBcnJheUxpc3Qgc3ByZWFkRXhwcmVzc2lvbnMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIEFycmF5TGlzdCBub3JtYWxBcmd1bWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwcmVzc2lvbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIE9iamVjdCBleHByID0gZXhwcmVzc2lvbnMuZ2V0KGkpOworICAgICAgICAgICAgaWYgKCEoZXhwciBpbnN0YW5jZW9mIFNwcmVhZEV4cHJlc3Npb24pKSB7CisgICAgICAgICAgICAgICAgbm9ybWFsQXJndW1lbnRzLmFkZChleHByKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3ByZWFkSW5kZXhlcy5hZGQobmV3IENvbnN0YW50RXhwcmVzc2lvbihuZXcgSW50ZWdlcihpIC0gc3ByZWFkRXhwcmVzc2lvbnMuc2l6ZSgpKSkpOworICAgICAgICAgICAgICAgIHNwcmVhZEV4cHJlc3Npb25zLmFkZCgoKFNwcmVhZEV4cHJlc3Npb24pIGV4cHIpLmdldEV4cHJlc3Npb24oKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvL2xvYWQgbm9ybWFsIGFyZ3VtZW50cyBhcyBhcnJheQorICAgICAgICB2aXNpdFR1cGxlRXhwcmVzc2lvbihuZXcgQXJndW1lbnRMaXN0RXhwcmVzc2lvbihub3JtYWxBcmd1bWVudHMpLCB3cmFwKTsKKyAgICAgICAgLy9sb2FkIHNwcmVhZCBleHByZXNzaW9ucyBhcyBhcnJheQorICAgICAgICAobmV3IFR1cGxlRXhwcmVzc2lvbihzcHJlYWRFeHByZXNzaW9ucykpLnZpc2l0KHRoaXMpOworICAgICAgICAvL2xvYWQgaW5zZXJ0aW9uIGluZGV4CisgICAgICAgIChuZXcgQXJyYXlFeHByZXNzaW9uKENsYXNzSGVscGVyLmludF9UWVBFLCBzcHJlYWRJbmRleGVzLCBudWxsKSkudmlzaXQodGhpcyk7CisgICAgICAgIGRlc3ByZWFkTGlzdC5jYWxsKG12KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdE1ldGhvZENhbGxFeHByZXNzaW9uKE1ldGhvZENhbGxFeHByZXNzaW9uIGNhbGwpIHsKKyAgICAgICAgb25MaW5lTnVtYmVyKGNhbGwsICJ2aXNpdE1ldGhvZENhbGxFeHByZXNzaW9uOiBcIiIgKyBjYWxsLmdldE1ldGhvZCgpICsgIlwiOiIpOworCisgICAgICAgIEV4cHJlc3Npb24gYXJndW1lbnRzID0gY2FsbC5nZXRBcmd1bWVudHMoKTsKKyAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSBjYWxsLmdldE1ldGhvZEFzU3RyaW5nKCk7CisgICAgICAgIGJvb2xlYW4gaXNTdXBlck1ldGhvZENhbGwgPSB1c2VzU3VwZXIoY2FsbCk7CisgICAgICAgIGJvb2xlYW4gaXNUaGlzRXhwcmVzc2lvbiA9IGlzVGhpc0V4cHJlc3Npb24oY2FsbC5nZXRPYmplY3RFeHByZXNzaW9uKCkpOworCisgICAgICAgIC8vIGFyZSB3ZSBhIGxvY2FsIHZhcmlhYmxlCisgICAgICAgIGlmIChtZXRob2ROYW1lICE9IG51bGwgJiYgaXNUaGlzRXhwcmVzc2lvbiAmJiBpc0ZpZWxkT3JWYXJpYWJsZShtZXRob2ROYW1lKSAmJiAhY2xhc3NOb2RlLmhhc1Bvc3NpYmxlTWV0aG9kKG1ldGhvZE5hbWUsIGFyZ3VtZW50cykpIHsKKyAgICAgICAgICAgIC8vIGxldHMgaW52b2tlIHRoZSBjbG9zdXJlIG1ldGhvZAorICAgICAgICAgICAgdmlzaXRWYXJpYWJsZUV4cHJlc3Npb24obmV3IFZhcmlhYmxlRXhwcmVzc2lvbihtZXRob2ROYW1lKSk7CisgICAgICAgICAgICBpZiAoYXJndW1lbnRzIGluc3RhbmNlb2YgVHVwbGVFeHByZXNzaW9uKSB7CisgICAgICAgICAgICAgICAgYXJndW1lbnRzLnZpc2l0KHRoaXMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBuZXcgVHVwbGVFeHByZXNzaW9uKGFyZ3VtZW50cykudmlzaXQodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnZva2VDbG9zdXJlTWV0aG9kLmNhbGwobXYpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTWV0aG9kQ2FsbGVyTXVsdGlBZGFwdGVyIGFkYXB0ZXIgPSBpbnZva2VNZXRob2Q7CisgICAgICAgICAgICBpZiAoaXNUaGlzRXhwcmVzc2lvbikgYWRhcHRlciA9IGludm9rZU1ldGhvZE9uQ3VycmVudDsKKyAgICAgICAgICAgIGlmIChpc1N1cGVyTWV0aG9kQ2FsbCkgYWRhcHRlciA9IGludm9rZU1ldGhvZE9uU3VwZXI7CisgICAgICAgICAgICBpZiAoaXNTdGF0aWNJbnZvY2F0aW9uKGNhbGwpKSBhZGFwdGVyID0gaW52b2tlU3RhdGljTWV0aG9kOworICAgICAgICAgICAgbWFrZUludm9rZU1ldGhvZENhbGwoY2FsbCwgaXNTdXBlck1ldGhvZENhbGwsIGFkYXB0ZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzU3RhdGljSW52b2NhdGlvbihNZXRob2RDYWxsRXhwcmVzc2lvbiBjYWxsKSB7CisgICAgICAgIGlmICghaXNUaGlzRXhwcmVzc2lvbihjYWxsLmdldE9iamVjdEV4cHJlc3Npb24oKSkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKGlzU3RhdGljTWV0aG9kKCkpIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gaXNTdGF0aWNDb250ZXh0KCkgJiYgIWNhbGwuaXNJbXBsaWNpdFRoaXMoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBlbXB0eUFyZ3VtZW50cyhFeHByZXNzaW9uIGFyZ3VtZW50cykgeworICAgICAgICByZXR1cm4gYXJndW1lbnRTaXplKGFyZ3VtZW50cykgPT0gMDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gY29udGFpbnNTcHJlYWRFeHByZXNzaW9uKEV4cHJlc3Npb24gYXJndW1lbnRzKSB7CisgICAgICAgIExpc3QgYXJncyA9IG51bGw7CisgICAgICAgIGlmIChhcmd1bWVudHMgaW5zdGFuY2VvZiBUdXBsZUV4cHJlc3Npb24pIHsKKyAgICAgICAgICAgIFR1cGxlRXhwcmVzc2lvbiB0dXBsZUV4cHJlc3Npb24gPSAoVHVwbGVFeHByZXNzaW9uKSBhcmd1bWVudHM7CisgICAgICAgICAgICBhcmdzID0gdHVwbGVFeHByZXNzaW9uLmdldEV4cHJlc3Npb25zKCk7CisgICAgICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzIGluc3RhbmNlb2YgTGlzdEV4cHJlc3Npb24pIHsKKyAgICAgICAgICAgIExpc3RFeHByZXNzaW9uIGxlID0gKExpc3RFeHByZXNzaW9uKSBhcmd1bWVudHM7CisgICAgICAgICAgICBhcmdzID0gbGUuZ2V0RXhwcmVzc2lvbnMoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBhcmd1bWVudHMgaW5zdGFuY2VvZiBTcHJlYWRFeHByZXNzaW9uOworICAgICAgICB9CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGFyZ3MuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBpZiAoaXRlci5uZXh0KCkgaW5zdGFuY2VvZiBTcHJlYWRFeHByZXNzaW9uKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBpbnQgYXJndW1lbnRTaXplKEV4cHJlc3Npb24gYXJndW1lbnRzKSB7CisgICAgICAgIGlmIChhcmd1bWVudHMgaW5zdGFuY2VvZiBUdXBsZUV4cHJlc3Npb24pIHsKKyAgICAgICAgICAgIFR1cGxlRXhwcmVzc2lvbiB0dXBsZUV4cHJlc3Npb24gPSAoVHVwbGVFeHByZXNzaW9uKSBhcmd1bWVudHM7CisgICAgICAgICAgICBpbnQgc2l6ZSA9IHR1cGxlRXhwcmVzc2lvbi5nZXRFeHByZXNzaW9ucygpLnNpemUoKTsKKyAgICAgICAgICAgIHJldHVybiBzaXplOworICAgICAgICB9CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0U3RhdGljTWV0aG9kQ2FsbEV4cHJlc3Npb24oU3RhdGljTWV0aG9kQ2FsbEV4cHJlc3Npb24gY2FsbCkgeworICAgICAgICBvbkxpbmVOdW1iZXIoY2FsbCwgInZpc2l0U3RhdGljTWV0aG9kQ2FsbEV4cHJlc3Npb246IFwiIiArIGNhbGwuZ2V0TWV0aG9kKCkgKyAiXCI6Iik7CisKKyAgICAgICAgbWFrZUNhbGwoCisgICAgICAgICAgICAgICAgbmV3IENsYXNzRXhwcmVzc2lvbihjYWxsLmdldE93bmVyVHlwZSgpKSwKKyAgICAgICAgICAgICAgICBuZXcgQ29uc3RhbnRFeHByZXNzaW9uKGNhbGwuZ2V0TWV0aG9kKCkpLAorICAgICAgICAgICAgICAgIGNhbGwuZ2V0QXJndW1lbnRzKCksCisgICAgICAgICAgICAgICAgaW52b2tlU3RhdGljTWV0aG9kLAorICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgYWRkR2VuZXJhdGVkQ2xvc3VyZUNvbnN0cnVjdG9yQ2FsbChDb25zdHJ1Y3RvckNhbGxFeHByZXNzaW9uIGNhbGwpIHsKKyAgICAgICAgbXYudmlzaXRWYXJJbnNuKEFMT0FELCAwKTsKKyAgICAgICAgQ2xhc3NOb2RlIGNhbGxOb2RlID0gY2xhc3NOb2RlLmdldFN1cGVyQ2xhc3MoKTsKKyAgICAgICAgVHVwbGVFeHByZXNzaW9uIGFyZ3VtZW50cyA9IChUdXBsZUV4cHJlc3Npb24pIGNhbGwuZ2V0QXJndW1lbnRzKCk7CisgICAgICAgIGlmIChhcmd1bWVudHMuZ2V0RXhwcmVzc2lvbnMoKS5zaXplKCkhPTIpIHRocm93IG5ldyBHcm9vdnlCdWdFcnJvcigiZXhwZWN0ZWQgMiBhcmd1bWVudHMgZm9yIGNsb3N1cmUgY29uc3RydWN0b3Igc3VwZXIgY2FsbCwgYnV0IGdvdCIrYXJndW1lbnRzLmdldEV4cHJlc3Npb25zKCkuc2l6ZSgpKTsKKyAgICAgICAgYXJndW1lbnRzLmdldEV4cHJlc3Npb24oMCkudmlzaXQodGhpcyk7CisgICAgICAgIGFyZ3VtZW50cy5nZXRFeHByZXNzaW9uKDEpLnZpc2l0KHRoaXMpOworICAgICAgICBQYXJhbWV0ZXIgcCA9IG5ldyBQYXJhbWV0ZXIoQ2xhc3NIZWxwZXIuT0JKRUNUX1RZUEUsIl9wIik7CisgICAgICAgIFN0cmluZyBkZXNjcmlwdG9yID0gaGVscGVyLmdldE1ldGhvZERlc2NyaXB0b3IoQ2xhc3NIZWxwZXIuVk9JRF9UWVBFLCBuZXcgUGFyYW1ldGVyW117cCxwfSk7CisgICAgICAgIG12LnZpc2l0TWV0aG9kSW5zbihJTlZPS0VTUEVDSUFMLCBCeXRlY29kZUhlbHBlci5nZXRDbGFzc0ludGVybmFsTmFtZShjYWxsTm9kZSksICI8aW5pdD4iLCBkZXNjcmlwdG9yKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmlzaXRTcGVjaWFsQ29uc3RydWN0b3JDYWxsKENvbnN0cnVjdG9yQ2FsbEV4cHJlc3Npb24gY2FsbCkgeworICAgICAgICBpZiAoY2xhc3NOb2RlLmRlY2xhcmVzSW50ZXJmYWNlKENsYXNzSGVscGVyLkdFTkVSQVRFRF9DTE9TVVJFX1R5cGUuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgYWRkR2VuZXJhdGVkQ2xvc3VyZUNvbnN0cnVjdG9yQ2FsbChjYWxsKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQ2xhc3NOb2RlIGNhbGxOb2RlID0gY2xhc3NOb2RlOworICAgICAgICBpZiAoY2FsbC5pc1N1cGVyQ2FsbCgpKSBjYWxsTm9kZSA9IGNhbGxOb2RlLmdldFN1cGVyQ2xhc3MoKTsKKyAgICAgICAgTGlzdCBjb25zdHJ1Y3RvcnMgPSBzb3J0Q29uc3RydWN0b3JzKGNhbGwsIGNhbGxOb2RlKTsKKyAgICAgICAgY2FsbC5nZXRBcmd1bWVudHMoKS52aXNpdCh0aGlzKTsKKyAgICAgICAgLy8ga2VlcCBPYmplY3RbXSBvbiBzdGFjaworICAgICAgICBtdi52aXNpdEluc24oRFVQKTsKKyAgICAgICAgLy8gdG8gc2VsZWN0IHRoZSBjb25zdHJ1Y3RvciB3ZSBuZWVkIGFsc28gdGhlIG51bWJlciBvZgorICAgICAgICAvLyBhdmFpbGFibGUgY29uc3RydWN0b3JzIGFuZCB0aGUgY2xhc3Mgd2Ugd2FudCB0byBtYWtlCisgICAgICAgIC8vIHRoZSBjYWxsIG9uCisgICAgICAgIGhlbHBlci5wdXNoQ29uc3RhbnQoY29uc3RydWN0b3JzLnNpemUoKSk7CisgICAgICAgIHZpc2l0Q2xhc3NFeHByZXNzaW9uKG5ldyBDbGFzc0V4cHJlc3Npb24oY2FsbE5vZGUpKTsKKyAgICAgICAgLy8gcmVtb3ZlcyBvbmUgT2JqZWN0W10gbGVhdmVzIHRoZSBpbnQgY29udGFpbmluZyB0aGUgCisgICAgICAgIC8vIGNhbGwgZmxhZ3MgYW5kIHRoZSBjb25zdHJ1dGNvciBudW1iZXIKKyAgICAgICAgc2VsZWN0Q29uc3RydWN0b3JBbmRUcmFuc2Zvcm1Bcmd1bWVudHMuY2FsbChtdik7CisgICAgICAgIC8vIE9iamVjdFtdLGludCAtPiBpbnQsT2JqZWN0W10saW50CisgICAgICAgIC8vIHdlIG5lZWQgdG8gZXhhbWluZSB0aGUgZmxhZ3MgYW5kIG1heWJlIGNoYW5nZSB0aGUgCisgICAgICAgIC8vIE9iamVjdFtdIGxhdGVyLCBzbyB0aGlzIHJlb3JkZXJpbmcgd2lsbCBkbyB0aGUgam9iCisgICAgICAgIG12LnZpc2l0SW5zbihEVVBfWDEpOworICAgICAgICAvLyB0ZXN0IGlmIHJld3JhcCBmbGFnIGlzIHNldAorICAgICAgICBtdi52aXNpdEluc24oSUNPTlNUXzEpOworICAgICAgICBtdi52aXNpdEluc24oSUFORCk7CisgICAgICAgIExhYmVsIGFmdGVySWYgPSBuZXcgTGFiZWwoKTsKKyAgICAgICAgbXYudmlzaXRKdW1wSW5zbihJRkVRLCBhZnRlcklmKTsKKyAgICAgICAgLy8gdHJ1ZSBwYXJ0LCBzbyByZXdyYXAgdXNpbmcgdGhlIGZpcnN0IGFyZ3VtZW50CisgICAgICAgIG12LnZpc2l0SW5zbihJQ09OU1RfMCk7CisgICAgICAgIG12LnZpc2l0SW5zbihBQUxPQUQpOworICAgICAgICBtdi52aXNpdFR5cGVJbnNuKENIRUNLQ0FTVCwgIltMamF2YS9sYW5nL09iamVjdDsiKTsKKyAgICAgICAgbXYudmlzaXRMYWJlbChhZnRlcklmKTsKKyAgICAgICAgLy8gaGVyZSB0aGUgc3RhY2sgaXMgaW50LE9iamVjdFtdLCBidXQgd2UgbmVlZCB0aGUKKyAgICAgICAgLy8gdGhlIGludCBmb3Igb3VyIHRhYmxlLCBzbyBzd2FwIGl0CisgICAgICAgIG12LnZpc2l0SW5zbihTV0FQKTsKKyAgICAgICAgLy9sb2FkICJ0aGlzIgorICAgICAgICBpZiAoY29uc3RydWN0b3JOb2RlIT1udWxsKSB7CisgICAgICAgICAgICBtdi52aXNpdFZhckluc24oQUxPQUQsIDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbXYudmlzaXRUeXBlSW5zbihORVcsIEJ5dGVjb2RlSGVscGVyLmdldENsYXNzSW50ZXJuYWxOYW1lKGNhbGxOb2RlKSk7CisgICAgICAgIH0KKyAgICAgICAgbXYudmlzaXRJbnNuKFNXQVApOworICAgICAgICAvL3ByZXBhcmUgc3dpdGNoIHdpdGggPj44ICAgICAgICAKKyAgICAgICAgbXYudmlzaXRJbnRJbnNuKEJJUFVTSCwgOCk7CisgICAgICAgIG12LnZpc2l0SW5zbihJU0hSKTsKKyAgICAgICAgTGFiZWxbXSB0YXJnZXRzID0gbmV3IExhYmVsW2NvbnN0cnVjdG9ycy5zaXplKCldOworICAgICAgICBpbnRbXSBpbmRpY2VzID0gbmV3IGludFtjb25zdHJ1Y3RvcnMuc2l6ZSgpXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YXJnZXRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0YXJnZXRzW2ldID0gbmV3IExhYmVsKCk7CisgICAgICAgICAgICBpbmRpY2VzW2ldID0gaTsKKyAgICAgICAgfQorICAgICAgICAvLyBjcmVhdGUgc3dpdGNoIHRhcmdldHMKKyAgICAgICAgTGFiZWwgZGVmYXVsdExhYmVsID0gbmV3IExhYmVsKCk7CisgICAgICAgIExhYmVsIGFmdGVyU3dpdGNoID0gbmV3IExhYmVsKCk7CisgICAgICAgIG12LnZpc2l0TG9va3VwU3dpdGNoSW5zbihkZWZhdWx0TGFiZWwsIGluZGljZXMsIHRhcmdldHMpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhcmdldHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIG12LnZpc2l0TGFiZWwodGFyZ2V0c1tpXSk7CisgICAgICAgICAgICAvLyB0byBrZWVwIHRoZSBzdGFjayBoZWlnaHQsIHdlIG5lZWQgdG8gbGVhdmUKKyAgICAgICAgICAgIC8vIG9uZSBPYmplY3RbXSBvbiB0aGUgc3RhY2sgYXMgbGFzdCBlbGVtZW50LiBBdCB0aGUgCisgICAgICAgICAgICAvLyBzYW1lIHRpbWUsIHdlIG5lZWQgdGhlIE9iamVjdFtdIG9uIHRvcCBvZiB0aGUgc3RhY2sKKyAgICAgICAgICAgIC8vIHRvIGV4dHJhY3QgdGhlIHBhcmFtZXRlcnMuIAorICAgICAgICAgICAgaWYgKGNvbnN0cnVjdG9yTm9kZSE9bnVsbCkgeworICAgICAgICAgICAgICAgIC8vIGluIHRoaXMgY2FzZSB3ZSBuZWVkIG9uZSAidGhpcyIsIHNvIGEgU1dBUCB3aWxsIGV4Y2hhbmdlIAorICAgICAgICAgICAgICAgIC8vICJ0aGlzIiBhbmQgT2JqZWN0W10sIGEgRFVQX1gxIHdpbGwgdGhlbiBjb3B5IHRoZSBPYmplY3RbXQorICAgICAgICAgICAgICAgIC8vLyB0byB0aGUgbGFzdCBwbGFjZSBpbiB0aGUgc3RhY2s6IAorICAgICAgICAgICAgICAgIC8vICAgICBPYmplY3RbXSx0aGlzIC1TV0FQLT4gdGhpcyxPYmplY3RbXQorICAgICAgICAgICAgICAgIC8vICAgICB0aGlzLE9iamVjdFtdIC1EVVBfWDEtPiBPYmplY3RbXSx0aGlzLE9iamVjdFtdIAorICAgICAgICAgICAgICAgIG12LnZpc2l0SW5zbihTV0FQKTsKKyAgICAgICAgICAgICAgICBtdi52aXNpdEluc24oRFVQX1gxKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gaW4gdGhpcyBjYXNlIHdlIG5lZWQgdHdvICJ0aGlzIiBpbiBiZXR3ZWVuIGFuZCB0aGUgT2JqZWN0W10KKyAgICAgICAgICAgICAgICAvLyBhdCB0aGUgYm90dG9tIG9mIHRoZSBzdGFjayBhcyB3ZWxsIGFzIG9uIHRvcCBmb3Igb3VyIGludm9rZVNwZWNpYWwgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBTbyB3ZSBkbyBEVVBfWDEsIERVUDJfWDEsIFBPUCAKKyAgICAgICAgICAgICAgICAvLyAgICAgT2JqZWN0W10sdGhpcyAtRFVQX1gxLT4gdGhpcyxPYmplY3RbXSx0aGlzCisgICAgICAgICAgICAgICAgLy8gICAgIHRoaXMsT2JqZWN0W10sdGhpcyAtRFVQMl9YMS0+IE9iamVjdFtdLHRoaXMsdGhpcyxPYmplY3RbXSx0aGlzCisgICAgICAgICAgICAgICAgLy8gICAgIE9iamVjdFtdLHRoaXMsdGhpcyxPYmplY3RbXSx0aGlzIC1QT1AtPiAgT2JqZWN0W10sdGhpcyx0aGlzLE9iamVjdFtdCisgICAgICAgICAgICAgICAgbXYudmlzaXRJbnNuKERVUF9YMSk7CisgICAgICAgICAgICAgICAgbXYudmlzaXRJbnNuKERVUDJfWDEpOworICAgICAgICAgICAgICAgIG12LnZpc2l0SW5zbihQT1ApOworICAgICAgICAgICAgfSAgICAgICAgICAgIAorCisgICAgICAgICAgICBDb25zdHJ1Y3Rvck5vZGUgY24gPSAoQ29uc3RydWN0b3JOb2RlKSBjb25zdHJ1Y3RvcnMuZ2V0KGkpOworICAgICAgICAgICAgU3RyaW5nIGRlc2NyaXB0b3IgPSBoZWxwZXIuZ2V0TWV0aG9kRGVzY3JpcHRvcihDbGFzc0hlbHBlci5WT0lEX1RZUEUsIGNuLmdldFBhcmFtZXRlcnMoKSk7CisgICAgICAgICAgICAvLyB1bndyYXAgdGhlIE9iamVjdFtdIGFuZCBtYWtlIHRyYW5zZm9ybWF0aW9ucyBpZiBuZWVkZWQKKyAgICAgICAgICAgIC8vIHRoYXQgbWVhbnMsIHRvIGR1cGxpY2F0ZSB0aGUgT2JqZWN0W10sIG1ha2UgYSBjYXN0IHdpdGggcG9zc2libGUKKyAgICAgICAgICAgIC8vIHVuYm94aW5nIGFuZCB0aGVuIHN3YXAgaXQgd2l0aCB0aGUgT2JqZWN0W10gZm9yIGVhY2ggcGFyYW1ldGVyCisgICAgICAgICAgICBQYXJhbWV0ZXJbXSBwYXJhbWV0ZXJzID0gY24uZ2V0UGFyYW1ldGVycygpOworICAgICAgICAgICAgZm9yIChpbnQgcCA9IDA7IHAgPCBwYXJhbWV0ZXJzLmxlbmd0aDsgcCsrKSB7CisgICAgICAgICAgICAgICAgbXYudmlzaXRJbnNuKERVUCk7CisgICAgICAgICAgICAgICAgaGVscGVyLnB1c2hDb25zdGFudChwKTsKKyAgICAgICAgICAgICAgICBtdi52aXNpdEluc24oQUFMT0FEKTsKKyAgICAgICAgICAgICAgICBDbGFzc05vZGUgdHlwZSA9IHBhcmFtZXRlcnNbcF0uZ2V0VHlwZSgpOworICAgICAgICAgICAgICAgIGlmIChDbGFzc0hlbHBlci5pc1ByaW1pdGl2ZVR5cGUodHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaGVscGVyLnVuYm94KHR5cGUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGhlbHBlci5kb0Nhc3QodHlwZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGhlbHBlci5zd2FwV2l0aE9iamVjdCh0eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGF0IHRoZSBlbmQgd2UgcmVtb3ZlIHRoZSBPYmplY3RbXQorICAgICAgICAgICAgbXYudmlzaXRJbnNuKFBPUCk7CisgICAgICAgICAgICAvLyBtYWtlIHRoZSBjb25zdHJ1Y3RvciBjYWxsCisgICAgICAgICAgICBtdi52aXNpdE1ldGhvZEluc24oSU5WT0tFU1BFQ0lBTCwgQnl0ZWNvZGVIZWxwZXIuZ2V0Q2xhc3NJbnRlcm5hbE5hbWUoY2FsbE5vZGUpLCAiPGluaXQ+IiwgZGVzY3JpcHRvcik7CisgICAgICAgICAgICBtdi52aXNpdEp1bXBJbnNuKEdPVE8sIGFmdGVyU3dpdGNoKTsKKyAgICAgICAgfQorICAgICAgICBtdi52aXNpdExhYmVsKGRlZmF1bHRMYWJlbCk7CisgICAgICAgIC8vIHRoaXMgcGFydCBzaG91bGQgbmV2ZXIgYmUgcmVhY2hlZCEKKyAgICAgICAgbXYudmlzaXRUeXBlSW5zbihORVcsICJqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIik7CisgICAgICAgIG12LnZpc2l0SW5zbihEVVApOworICAgICAgICBtdi52aXNpdExkY0luc24oImlsbGVnYWwgY29uc3RydWN0b3IgbnVtYmVyIik7CisgICAgICAgIG12LnZpc2l0TWV0aG9kSW5zbihJTlZPS0VTUEVDSUFMLCAiamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIsICI8aW5pdD4iLCAiKExqYXZhL2xhbmcvU3RyaW5nOylWIik7CisgICAgICAgIG12LnZpc2l0SW5zbihBVEhST1cpOworICAgICAgICBtdi52aXNpdExhYmVsKGFmdGVyU3dpdGNoKTsKKyAgICAgICAgCisgICAgICAgIC8vIHRvIGtlZXAgdGhlIHN0YWNrIGhpZ2h0IHdlIGtlcHQgb25lIG9iamVjdCBvbiB0aGUgc3RhY2sKKyAgICAgICAgLy8gZm9yIHRoZSBzd2l0Y2gsIG5vdyB3ZSByZW1vdmUgdGhhdCBvYmplY3QKKyAgICAgICAgaWYgKGNvbnN0cnVjdG9yTm9kZT09bnVsbCkgeworICAgICAgICAgICAgLy8gYnV0IGluIGNhc2Ugd2UgYXJlIG5vdCBpbiBhIGNvbnN0cnVjdG9yIHdlIGhhdmUgYW4gYWRkaXRpb25hbAorICAgICAgICAgICAgLy8gb2JqZWN0IG9uIHRoZSBzdGFjaywgdGhlIHJlc3VsdCBvZiBvdXIgY29uc3RydWN0b3IgY2FsbAorICAgICAgICAgICAgLy8gd2hpY2ggd2Ugd2FudCB0byBrZWVwLCBzbyB3ZSBzd2FwIHRoZSBhcmd1bWVudHMgdG8gcmVtb3ZlIAorICAgICAgICAgICAgLy8gdGhlIHJpZ2h0IG9uZQorICAgICAgICAgICAgbXYudmlzaXRJbnNuKFNXQVApOworICAgICAgICB9CisgICAgICAgIG12LnZpc2l0SW5zbihQT1ApOworICAgIH0KKworICAgIHByaXZhdGUgTGlzdCBzb3J0Q29uc3RydWN0b3JzKENvbnN0cnVjdG9yQ2FsbEV4cHJlc3Npb24gY2FsbCwgQ2xhc3NOb2RlIGNhbGxOb2RlKSB7CisgICAgICAgIC8vIHNvcnQgaW4gYSBuZXcgbGlzdCB0byBwcmV2ZW50IHNpZGUgZWZmZWN0cworICAgICAgICBMaXN0IGNvbnN0cnVjdG9ycyA9IG5ldyBBcnJheUxpc3QoY2FsbE5vZGUuZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcnMoKSk7CisgICAgICAgIENvbXBhcmF0b3IgY29tcCA9IG5ldyBDb21wYXJhdG9yKCkgeworICAgICAgICAgICAgcHVibGljIGludCBjb21wYXJlKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICAgICAgICAgIENvbnN0cnVjdG9yTm9kZSBjMCA9IChDb25zdHJ1Y3Rvck5vZGUpIGFyZzA7CisgICAgICAgICAgICAgICAgQ29uc3RydWN0b3JOb2RlIGMxID0gKENvbnN0cnVjdG9yTm9kZSkgYXJnMTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZGVzY3JpcHRvcjAgPSBoZWxwZXIuZ2V0TWV0aG9kRGVzY3JpcHRvcihDbGFzc0hlbHBlci5WT0lEX1RZUEUsIGMwLmdldFBhcmFtZXRlcnMoKSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGRlc2NyaXB0b3IxID0gaGVscGVyLmdldE1ldGhvZERlc2NyaXB0b3IoQ2xhc3NIZWxwZXIuVk9JRF9UWVBFLCBjMS5nZXRQYXJhbWV0ZXJzKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdG9yMC5jb21wYXJlVG8oZGVzY3JpcHRvcjEpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGNvbnN0cnVjdG9ycywgY29tcCk7CisgICAgICAgIHJldHVybiBjb25zdHJ1Y3RvcnM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRDb25zdHJ1Y3RvckNhbGxFeHByZXNzaW9uKENvbnN0cnVjdG9yQ2FsbEV4cHJlc3Npb24gY2FsbCkgeworICAgICAgICBvbkxpbmVOdW1iZXIoY2FsbCwgInZpc2l0Q29uc3RydWN0b3JDYWxsRXhwcmVzc2lvbjogXCIiICsgY2FsbC5nZXRUeXBlKCkuZ2V0TmFtZSgpICsgIlwiOiIpOworCisgICAgICAgIGlmIChjYWxsLmlzU3BlY2lhbENhbGwoKSkgeworICAgICAgICAgICAgdmlzaXRTcGVjaWFsQ29uc3RydWN0b3JDYWxsKGNhbGwpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgRXhwcmVzc2lvbiBhcmd1bWVudHMgPSBjYWxsLmdldEFyZ3VtZW50cygpOworICAgICAgICBpZiAoYXJndW1lbnRzIGluc3RhbmNlb2YgVHVwbGVFeHByZXNzaW9uKSB7CisgICAgICAgICAgICBUdXBsZUV4cHJlc3Npb24gdHVwbGVFeHByZXNzaW9uID0gKFR1cGxlRXhwcmVzc2lvbikgYXJndW1lbnRzOworICAgICAgICAgICAgaW50IHNpemUgPSB0dXBsZUV4cHJlc3Npb24uZ2V0RXhwcmVzc2lvbnMoKS5zaXplKCk7CisgICAgICAgICAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgYXJndW1lbnRzID0gTWV0aG9kQ2FsbEV4cHJlc3Npb24uTk9fQVJHVU1FTlRTOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgRXhwcmVzc2lvbiByZWNlaXZlckNsYXNzID0gbmV3IENsYXNzRXhwcmVzc2lvbihjYWxsLmdldFR5cGUoKSk7CisgICAgICAgIG1ha2VDYWxsKAorICAgICAgICAgICAgICAgIHJlY2VpdmVyQ2xhc3MsIG51bGwsCisgICAgICAgICAgICAgICAgYXJndW1lbnRzLAorICAgICAgICAgICAgICAgIGludm9rZU5ldywgZmFsc2UsIGZhbHNlLCBmYWxzZQorICAgICAgICApOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBtYWtlRmllbGRDbGFzc05hbWUoQ2xhc3NOb2RlIHR5cGUpIHsKKyAgICAgICAgU3RyaW5nIGludGVybmFsTmFtZSA9IEJ5dGVjb2RlSGVscGVyLmdldENsYXNzSW50ZXJuYWxOYW1lKHR5cGUpOworICAgICAgICBTdHJpbmdCdWZmZXIgcmV0ID0gbmV3IFN0cmluZ0J1ZmZlcihpbnRlcm5hbE5hbWUubGVuZ3RoKCkpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGludGVybmFsTmFtZS5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICBjaGFyIGMgPSBpbnRlcm5hbE5hbWUuY2hhckF0KGkpOworICAgICAgICAgICAgaWYgKGMgPT0gJy8nKSB7CisgICAgICAgICAgICAgICAgcmV0LmFwcGVuZCgnJCcpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICc7JykgeworICAgICAgICAgICAgICAgIC8vYXBwZW5kIG5vdGhpbmcgLT4gZGVsZXRlICc7JworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXQuYXBwZW5kKGMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3RhdGljRmllbGROYW1lKENsYXNzTm9kZSB0eXBlKSB7CisgICAgICAgIENsYXNzTm9kZSBjb21wb25lbnRUeXBlID0gdHlwZTsKKyAgICAgICAgU3RyaW5nIHByZWZpeCA9ICIiOworICAgICAgICBmb3IgKDsgY29tcG9uZW50VHlwZS5pc0FycmF5KCk7IGNvbXBvbmVudFR5cGUgPSBjb21wb25lbnRUeXBlLmdldENvbXBvbmVudFR5cGUoKSkgeworICAgICAgICAgICAgcHJlZml4ICs9ICIkIjsKKyAgICAgICAgfQorICAgICAgICBpZiAocHJlZml4Lmxlbmd0aCgpICE9IDApIHByZWZpeCA9ICJhcnJheSIgKyBwcmVmaXg7CisgICAgICAgIFN0cmluZyBuYW1lID0gcHJlZml4ICsgImNsYXNzJCIgKyBtYWtlRmllbGRDbGFzc05hbWUoY29tcG9uZW50VHlwZSk7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB2aXNpdEF0dHJpYnV0ZU9yUHJvcGVydHkoUHJvcGVydHlFeHByZXNzaW9uIGV4cHJlc3Npb24sIE1ldGhvZENhbGxlck11bHRpQWRhcHRlciBhZGFwdGVyKSB7CisgICAgICAgIEV4cHJlc3Npb24gb2JqZWN0RXhwcmVzc2lvbiA9IGV4cHJlc3Npb24uZ2V0T2JqZWN0RXhwcmVzc2lvbigpOworICAgICAgICBpZiAoaXNUaGlzT3JTdXBlcihvYmplY3RFeHByZXNzaW9uKSkgeworICAgICAgICAgICAgLy8gbGV0J3MgdXNlIHRoZSBmaWVsZCBleHByZXNzaW9uIGlmIGl0J3MgYXZhaWxhYmxlCisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGV4cHJlc3Npb24uZ2V0UHJvcGVydHlBc1N0cmluZygpOworICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEZpZWxkTm9kZSBmaWVsZCA9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKGlzU3VwZXJFeHByZXNzaW9uKG9iamVjdEV4cHJlc3Npb24pKSB7CisgICAgICAgICAgICAgICAgICAgIGZpZWxkID0gY2xhc3NOb2RlLmdldFN1cGVyQ2xhc3MoKS5nZXRGaWVsZChuYW1lKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmaWVsZCA9IGNsYXNzTm9kZS5nZXRGaWVsZChuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGZpZWxkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdmlzaXRGaWVsZEV4cHJlc3Npb24obmV3IEZpZWxkRXhwcmVzc2lvbihmaWVsZCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGlzU3VwZXJFeHByZXNzaW9uKG9iamVjdEV4cHJlc3Npb24pKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHByZWZpeDsKKyAgICAgICAgICAgICAgICBpZiAobGVmdEhhbmRFeHByZXNzaW9uKSB7CisgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9ICJzZXQiOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9ICJnZXQiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcE5hbWUgPSBwcmVmaXggKyBNZXRhQ2xhc3NIZWxwZXIuY2FwaXRhbGl6ZShuYW1lKTsKKyAgICAgICAgICAgICAgICB2aXNpdE1ldGhvZENhbGxFeHByZXNzaW9uKG5ldyBNZXRob2RDYWxsRXhwcmVzc2lvbihvYmplY3RFeHByZXNzaW9uLCBwcm9wTmFtZSwgTWV0aG9kQ2FsbEV4cHJlc3Npb24uTk9fQVJHVU1FTlRTKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gYXJndW1lbnRzIGFscmVhZHkgb24gc3RhY2sgaWYgYW55CisgICAgICAgIG1ha2VDYWxsKAorICAgICAgICAgICAgICAgIG9iamVjdEV4cHJlc3Npb24sIC8vIHJlY2VpdmVyCisgICAgICAgICAgICAgICAgbmV3IENhc3RFeHByZXNzaW9uKENsYXNzSGVscGVyLlNUUklOR19UWVBFLCBleHByZXNzaW9uLmdldFByb3BlcnR5KCkpLCAvLyBtZXNzYWdlTmFtZQorICAgICAgICAgICAgICAgIE1ldGhvZENhbGxFeHByZXNzaW9uLk5PX0FSR1VNRU5UUywKKyAgICAgICAgICAgICAgICBhZGFwdGVyLAorICAgICAgICAgICAgICAgIGV4cHJlc3Npb24uaXNTYWZlKCksIGV4cHJlc3Npb24uaXNTcHJlYWRTYWZlKCksIGV4cHJlc3Npb24uaXNJbXBsaWNpdFRoaXMoKQorICAgICAgICApOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc1N0YXRpY0NvbnRleHQoKSB7CisgICAgICAgIGlmICghaXNJbkNsb3N1cmUoKSkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoY29uc3RydWN0b3JOb2RlICE9IG51bGwpIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIGNsYXNzTm9kZS5pc1N0YXRpY0NsYXNzKCkgfHwgbWV0aG9kTm9kZS5pc1N0YXRpYygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0UHJvcGVydHlFeHByZXNzaW9uKFByb3BlcnR5RXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisgICAgICAgIEV4cHJlc3Npb24gb2JqZWN0RXhwcmVzc2lvbiA9IGV4cHJlc3Npb24uZ2V0T2JqZWN0RXhwcmVzc2lvbigpOworICAgICAgICBNZXRob2RDYWxsZXJNdWx0aUFkYXB0ZXIgYWRhcHRlcjsKKyAgICAgICAgaWYgKGxlZnRIYW5kRXhwcmVzc2lvbikgeworICAgICAgICAgICAgYWRhcHRlciA9IHNldFByb3BlcnR5OworICAgICAgICAgICAgaWYgKGlzR3Jvb3Z5T2JqZWN0KG9iamVjdEV4cHJlc3Npb24pKSBhZGFwdGVyID0gc2V0R3Jvb3Z5T2JqZWN0UHJvcGVydHk7CisgICAgICAgICAgICBpZiAoaXNTdGF0aWNDb250ZXh0KCkgJiYgaXNUaGlzT3JTdXBlcihvYmplY3RFeHByZXNzaW9uKSkgYWRhcHRlciA9IHNldFByb3BlcnR5OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWRhcHRlciA9IGdldFByb3BlcnR5OworICAgICAgICAgICAgaWYgKGlzR3Jvb3Z5T2JqZWN0KG9iamVjdEV4cHJlc3Npb24pKSBhZGFwdGVyID0gZ2V0R3Jvb3Z5T2JqZWN0UHJvcGVydHk7CisgICAgICAgICAgICBpZiAoaXNTdGF0aWNDb250ZXh0KCkgJiYgaXNUaGlzT3JTdXBlcihvYmplY3RFeHByZXNzaW9uKSkgYWRhcHRlciA9IGdldFByb3BlcnR5OworICAgICAgICB9CisgICAgICAgIHZpc2l0QXR0cmlidXRlT3JQcm9wZXJ0eShleHByZXNzaW9uLCBhZGFwdGVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZUV4cHJlc3Npb24oQXR0cmlidXRlRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisgICAgICAgIEV4cHJlc3Npb24gb2JqZWN0RXhwcmVzc2lvbiA9IGV4cHJlc3Npb24uZ2V0T2JqZWN0RXhwcmVzc2lvbigpOworICAgICAgICBNZXRob2RDYWxsZXJNdWx0aUFkYXB0ZXIgYWRhcHRlcjsKKyAgICAgICAgaWYgKGxlZnRIYW5kRXhwcmVzc2lvbikgeworICAgICAgICAgICAgYWRhcHRlciA9IHNldEZpZWxkOworICAgICAgICAgICAgaWYgKGlzR3Jvb3Z5T2JqZWN0KG9iamVjdEV4cHJlc3Npb24pKSBhZGFwdGVyID0gc2V0R3Jvb3Z5T2JqZWN0RmllbGQ7CisgICAgICAgICAgICBpZiAodXNlc1N1cGVyKGV4cHJlc3Npb24pKSBhZGFwdGVyID0gc2V0RmllbGRPblN1cGVyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWRhcHRlciA9IGdldEZpZWxkOworICAgICAgICAgICAgaWYgKGlzR3Jvb3Z5T2JqZWN0KG9iamVjdEV4cHJlc3Npb24pKSBhZGFwdGVyID0gZ2V0R3Jvb3Z5T2JqZWN0RmllbGQ7CisgICAgICAgICAgICBpZiAodXNlc1N1cGVyKGV4cHJlc3Npb24pKSBhZGFwdGVyID0gZ2V0RmllbGRPblN1cGVyOworICAgICAgICB9CisgICAgICAgIHZpc2l0QXR0cmlidXRlT3JQcm9wZXJ0eShleHByZXNzaW9uLCBhZGFwdGVyKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0dyb292eU9iamVjdChFeHByZXNzaW9uIG9iamVjdEV4cHJlc3Npb24pIHsKKyAgICAgICAgcmV0dXJuIGlzVGhpc0V4cHJlc3Npb24ob2JqZWN0RXhwcmVzc2lvbik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRGaWVsZEV4cHJlc3Npb24oRmllbGRFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKyAgICAgICAgRmllbGROb2RlIGZpZWxkID0gZXhwcmVzc2lvbi5nZXRGaWVsZCgpOworCisgICAgICAgIGlmIChmaWVsZC5pc1N0YXRpYygpKSB7CisgICAgICAgICAgICBpZiAobGVmdEhhbmRFeHByZXNzaW9uKSB7CisgICAgICAgICAgICAgICAgc3RvcmVTdGF0aWNGaWVsZChleHByZXNzaW9uKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbG9hZFN0YXRpY0ZpZWxkKGV4cHJlc3Npb24pOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGxlZnRIYW5kRXhwcmVzc2lvbikgeworICAgICAgICAgICAgICAgIHN0b3JlVGhpc0luc3RhbmNlRmllbGQoZXhwcmVzc2lvbik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxvYWRJbnN0YW5jZUZpZWxkKGV4cHJlc3Npb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGZsZEV4cAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGxvYWRTdGF0aWNGaWVsZChGaWVsZEV4cHJlc3Npb24gZmxkRXhwKSB7CisgICAgICAgIEZpZWxkTm9kZSBmaWVsZCA9IGZsZEV4cC5nZXRGaWVsZCgpOworICAgICAgICBib29sZWFuIGhvbGRlciA9IGZpZWxkLmlzSG9sZGVyKCkgJiYgIWlzSW5DbG9zdXJlQ29uc3RydWN0b3IoKTsKKyAgICAgICAgQ2xhc3NOb2RlIHR5cGUgPSBmaWVsZC5nZXRUeXBlKCk7CisKKyAgICAgICAgU3RyaW5nIG93bmVyTmFtZSA9IChmaWVsZC5nZXRPd25lcigpLmVxdWFscyhjbGFzc05vZGUpKQorICAgICAgICAgICAgICAgID8gaW50ZXJuYWxDbGFzc05hbWUKKyAgICAgICAgICAgICAgICA6IEJ5dGVjb2RlSGVscGVyLmdldENsYXNzSW50ZXJuYWxOYW1lKGZpZWxkLmdldE93bmVyKCkpOworICAgICAgICBpZiAoaG9sZGVyKSB7CisgICAgICAgICAgICBtdi52aXNpdEZpZWxkSW5zbihHRVRTVEFUSUMsIG93bmVyTmFtZSwgZmxkRXhwLmdldEZpZWxkTmFtZSgpLCBCeXRlY29kZUhlbHBlci5nZXRUeXBlRGVzY3JpcHRpb24odHlwZSkpOworICAgICAgICAgICAgbXYudmlzaXRNZXRob2RJbnNuKElOVk9LRVZJUlRVQUwsICJncm9vdnkvbGFuZy9SZWZlcmVuY2UiLCAiZ2V0IiwgIigpTGphdmEvbGFuZy9PYmplY3Q7Iik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtdi52aXNpdEZpZWxkSW5zbihHRVRTVEFUSUMsIG93bmVyTmFtZSwgZmxkRXhwLmdldEZpZWxkTmFtZSgpLCBCeXRlY29kZUhlbHBlci5nZXRUeXBlRGVzY3JpcHRpb24odHlwZSkpOworICAgICAgICAgICAgaWYgKENsYXNzSGVscGVyLmlzUHJpbWl0aXZlVHlwZSh0eXBlKSkgeworICAgICAgICAgICAgICAgIGhlbHBlci5ib3godHlwZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUkhTIGluc3RhbmNlIGZpZWxkLiBzaG91bGQgbW92ZSBtb3N0IG9mIHRoZSBjb2RlIGluIHRoZSBCeXRlY29kZUhlbHBlcgorICAgICAqCisgICAgICogQHBhcmFtIGZsZEV4cAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGxvYWRJbnN0YW5jZUZpZWxkKEZpZWxkRXhwcmVzc2lvbiBmbGRFeHApIHsKKyAgICAgICAgRmllbGROb2RlIGZpZWxkID0gZmxkRXhwLmdldEZpZWxkKCk7CisgICAgICAgIGJvb2xlYW4gaG9sZGVyID0gZmllbGQuaXNIb2xkZXIoKSAmJiAhaXNJbkNsb3N1cmVDb25zdHJ1Y3RvcigpOworICAgICAgICBDbGFzc05vZGUgdHlwZSA9IGZpZWxkLmdldFR5cGUoKTsKKyAgICAgICAgU3RyaW5nIG93bmVyTmFtZSA9IChmaWVsZC5nZXRPd25lcigpLmVxdWFscyhjbGFzc05vZGUpKQorICAgICAgICAgICAgICAgID8gaW50ZXJuYWxDbGFzc05hbWUKKyAgICAgICAgICAgICAgICA6IGhlbHBlci5nZXRDbGFzc0ludGVybmFsTmFtZShmaWVsZC5nZXRPd25lcigpKTsKKworICAgICAgICBtdi52aXNpdFZhckluc24oQUxPQUQsIDApOworICAgICAgICBtdi52aXNpdEZpZWxkSW5zbihHRVRGSUVMRCwgb3duZXJOYW1lLCBmbGRFeHAuZ2V0RmllbGROYW1lKCksIEJ5dGVjb2RlSGVscGVyLmdldFR5cGVEZXNjcmlwdGlvbih0eXBlKSk7CisKKyAgICAgICAgaWYgKGhvbGRlcikgeworICAgICAgICAgICAgbXYudmlzaXRNZXRob2RJbnNuKElOVk9LRVZJUlRVQUwsICJncm9vdnkvbGFuZy9SZWZlcmVuY2UiLCAiZ2V0IiwgIigpTGphdmEvbGFuZy9PYmplY3Q7Iik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoQ2xhc3NIZWxwZXIuaXNQcmltaXRpdmVUeXBlKHR5cGUpKSB7CisgICAgICAgICAgICAgICAgaGVscGVyLmJveCh0eXBlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9yZVRoaXNJbnN0YW5jZUZpZWxkKEZpZWxkRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisgICAgICAgIEZpZWxkTm9kZSBmaWVsZCA9IGV4cHJlc3Npb24uZ2V0RmllbGQoKTsKKworICAgICAgICBib29sZWFuIGhvbGRlciA9IGZpZWxkLmlzSG9sZGVyKCkgJiYgIWlzSW5DbG9zdXJlQ29uc3RydWN0b3IoKTsKKyAgICAgICAgQ2xhc3NOb2RlIHR5cGUgPSBmaWVsZC5nZXRUeXBlKCk7CisKKyAgICAgICAgU3RyaW5nIG93bmVyTmFtZSA9IChmaWVsZC5nZXRPd25lcigpLmVxdWFscyhjbGFzc05vZGUpKSA/CisgICAgICAgICAgICAgICAgaW50ZXJuYWxDbGFzc05hbWUgOiBCeXRlY29kZUhlbHBlci5nZXRDbGFzc0ludGVybmFsTmFtZShmaWVsZC5nZXRPd25lcigpKTsKKyAgICAgICAgaWYgKGhvbGRlcikgeworICAgICAgICAgICAgbXYudmlzaXRWYXJJbnNuKEFMT0FELCAwKTsKKyAgICAgICAgICAgIG12LnZpc2l0RmllbGRJbnNuKEdFVEZJRUxELCBvd25lck5hbWUsIGV4cHJlc3Npb24uZ2V0RmllbGROYW1lKCksIEJ5dGVjb2RlSGVscGVyLmdldFR5cGVEZXNjcmlwdGlvbih0eXBlKSk7CisgICAgICAgICAgICBtdi52aXNpdEluc24oU1dBUCk7CisgICAgICAgICAgICBtdi52aXNpdE1ldGhvZEluc24oSU5WT0tFVklSVFVBTCwgImdyb292eS9sYW5nL1JlZmVyZW5jZSIsICJzZXQiLCAiKExqYXZhL2xhbmcvT2JqZWN0OylWIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoaXNJbkNsb3N1cmVDb25zdHJ1Y3RvcigpKSB7CisgICAgICAgICAgICAgICAgaGVscGVyLmRvQ2FzdCh0eXBlKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIUNsYXNzSGVscGVyLmlzUHJpbWl0aXZlVHlwZSh0eXBlKSkgeworICAgICAgICAgICAgICAgIGRvQ29udmVydEFuZENhc3QodHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtdi52aXNpdFZhckluc24oQUxPQUQsIDApOworICAgICAgICAgICAgLy9oZWxwZXIuc3dhcE9iamVjdFdpdGgodHlwZSk7CisgICAgICAgICAgICBtdi52aXNpdEluc24oU1dBUCk7CisgICAgICAgICAgICBoZWxwZXIudW5ib3godHlwZSk7CisgICAgICAgICAgICBoZWxwZXIucHV0RmllbGQoZmllbGQsIG93bmVyTmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHN0b3JlU3RhdGljRmllbGQoRmllbGRFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKyAgICAgICAgRmllbGROb2RlIGZpZWxkID0gZXhwcmVzc2lvbi5nZXRGaWVsZCgpOworCisgICAgICAgIGJvb2xlYW4gaG9sZGVyID0gZmllbGQuaXNIb2xkZXIoKSAmJiAhaXNJbkNsb3N1cmVDb25zdHJ1Y3RvcigpOworCisgICAgICAgIENsYXNzTm9kZSB0eXBlID0gZmllbGQuZ2V0VHlwZSgpOworCisgICAgICAgIFN0cmluZyBvd25lck5hbWUgPSAoZmllbGQuZ2V0T3duZXIoKS5lcXVhbHMoY2xhc3NOb2RlKSkKKyAgICAgICAgICAgICAgICA/IGludGVybmFsQ2xhc3NOYW1lCisgICAgICAgICAgICAgICAgOiBoZWxwZXIuZ2V0Q2xhc3NJbnRlcm5hbE5hbWUoZmllbGQuZ2V0T3duZXIoKSk7CisgICAgICAgIGlmIChob2xkZXIpIHsKKyAgICAgICAgICAgIG12LnZpc2l0RmllbGRJbnNuKEdFVFNUQVRJQywgb3duZXJOYW1lLCBleHByZXNzaW9uLmdldEZpZWxkTmFtZSgpLCBCeXRlY29kZUhlbHBlci5nZXRUeXBlRGVzY3JpcHRpb24odHlwZSkpOworICAgICAgICAgICAgbXYudmlzaXRJbnNuKFNXQVApOworICAgICAgICAgICAgbXYudmlzaXRNZXRob2RJbnNuKElOVk9LRVZJUlRVQUwsICJncm9vdnkvbGFuZy9SZWZlcmVuY2UiLCAic2V0IiwgIihMamF2YS9sYW5nL09iamVjdDspViIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaGVscGVyLmRvQ2FzdCh0eXBlKTsKKyAgICAgICAgICAgIG12LnZpc2l0RmllbGRJbnNuKFBVVFNUQVRJQywgb3duZXJOYW1lLCBleHByZXNzaW9uLmdldEZpZWxkTmFtZSgpLCBCeXRlY29kZUhlbHBlci5nZXRUeXBlRGVzY3JpcHRpb24odHlwZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgdmlzaXRPdXRlckZpZWxkRXhwcmVzc2lvbihGaWVsZEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgQ2xhc3NOb2RlIG91dGVyQ2xhc3NOb2RlLCBpbnQgc3RlcHMsIGJvb2xlYW4gZmlyc3QpIHsKKyAgICAgICAgRmllbGROb2RlIGZpZWxkID0gZXhwcmVzc2lvbi5nZXRGaWVsZCgpOworICAgICAgICBib29sZWFuIGlzU3RhdGljID0gZmllbGQuaXNTdGF0aWMoKTsKKworICAgICAgICBpbnQgdGVtcElkeCA9IGNvbXBpbGVTdGFjay5kZWZpbmVUZW1wb3JhcnlWYXJpYWJsZShmaWVsZCwgbGVmdEhhbmRFeHByZXNzaW9uICYmIGZpcnN0KTsKKworICAgICAgICBpZiAoc3RlcHMgPiAxIHx8ICFpc1N0YXRpYykgeworICAgICAgICAgICAgbXYudmlzaXRWYXJJbnNuKEFMT0FELCAwKTsKKyAgICAgICAgICAgIG12LnZpc2l0RmllbGRJbnNuKAorICAgICAgICAgICAgICAgICAgICBHRVRGSUVMRCwKKyAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWxDbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgICJvd25lciIsCisgICAgICAgICAgICAgICAgICAgIEJ5dGVjb2RlSGVscGVyLmdldFR5cGVEZXNjcmlwdGlvbihvdXRlckNsYXNzTm9kZSkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0ZXBzID09IDEpIHsKKyAgICAgICAgICAgIGludCBvcGNvZGUgPSAobGVmdEhhbmRFeHByZXNzaW9uKSA/ICgoaXNTdGF0aWMpID8gUFVUU1RBVElDIDogUFVURklFTEQpIDogKChpc1N0YXRpYykgPyBHRVRTVEFUSUMgOiBHRVRGSUVMRCk7CisgICAgICAgICAgICBTdHJpbmcgb3duZXJOYW1lID0gQnl0ZWNvZGVIZWxwZXIuZ2V0Q2xhc3NJbnRlcm5hbE5hbWUob3V0ZXJDbGFzc05vZGUpOworCisgICAgICAgICAgICBpZiAobGVmdEhhbmRFeHByZXNzaW9uKSB7CisgICAgICAgICAgICAgICAgbXYudmlzaXRWYXJJbnNuKEFMT0FELCB0ZW1wSWR4KTsKKyAgICAgICAgICAgICAgICBib29sZWFuIGhvbGRlciA9IGZpZWxkLmlzSG9sZGVyKCkgJiYgIWlzSW5DbG9zdXJlQ29uc3RydWN0b3IoKTsKKyAgICAgICAgICAgICAgICBpZiAoIWhvbGRlcikgeworICAgICAgICAgICAgICAgICAgICBkb0NvbnZlcnRBbmRDYXN0KGZpZWxkLmdldFR5cGUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbXYudmlzaXRGaWVsZEluc24ob3Bjb2RlLCBvd25lck5hbWUsIGV4cHJlc3Npb24uZ2V0RmllbGROYW1lKCksIEJ5dGVjb2RlSGVscGVyLmdldFR5cGVEZXNjcmlwdGlvbihmaWVsZC5nZXRUeXBlKCkpKTsKKyAgICAgICAgICAgIGlmICghbGVmdEhhbmRFeHByZXNzaW9uKSB7CisgICAgICAgICAgICAgICAgaWYgKENsYXNzSGVscGVyLmlzUHJpbWl0aXZlVHlwZShmaWVsZC5nZXRUeXBlKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGhlbHBlci5ib3goZmllbGQuZ2V0VHlwZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2aXNpdE91dGVyRmllbGRFeHByZXNzaW9uKGV4cHJlc3Npb24sIG91dGVyQ2xhc3NOb2RlLmdldE91dGVyQ2xhc3MoKSwgc3RlcHMgLSAxLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFZpc2l0cyBhIGJhcmUgKHVucXVhbGlmaWVkKSB2YXJpYWJsZSBleHByZXNzaW9uLgorICAgICAqLworCisgICAgcHVibGljIHZvaWQgdmlzaXRWYXJpYWJsZUV4cHJlc3Npb24oVmFyaWFibGVFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKworICAgICAgICBTdHJpbmcgdmFyaWFibGVOYW1lID0gZXhwcmVzc2lvbi5nZXROYW1lKCk7CisKKyAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAvLyBTUEVDSUFMIENBU0VTCisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gInRoaXMiIGZvciBzdGF0aWMgbWV0aG9kcyBpcyB0aGUgQ2xhc3MgaW5zdGFuY2UKKworICAgICAgICBDbGFzc05vZGUgY2xhc3NOb2RlID0gdGhpcy5jbGFzc05vZGU7CisgICAgICAgIGlmIChpc0luQ2xvc3VyZSgpKSBjbGFzc05vZGUgPSBnZXRPdXRlcm1vc3RDbGFzcygpOworCisgICAgICAgIGlmICh2YXJpYWJsZU5hbWUuZXF1YWxzKCJ0aGlzIikpIHsKKyAgICAgICAgICAgIGlmIChpc1N0YXRpY01ldGhvZCgpIHx8ICghaW1wbGljaXRUaGlzICYmIGlzU3RhdGljQ29udGV4dCgpKSkgeworICAgICAgICAgICAgICAgIHZpc2l0Q2xhc3NFeHByZXNzaW9uKG5ldyBDbGFzc0V4cHJlc3Npb24oY2xhc3NOb2RlKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxvYWRUaGlzKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyAic3VwZXIiIGFsc28gcmVxdWlyZXMgc3BlY2lhbCBoYW5kbGluZworCisgICAgICAgIGlmICh2YXJpYWJsZU5hbWUuZXF1YWxzKCJzdXBlciIpKSB7CisgICAgICAgICAgICBpZiAoaXNTdGF0aWNNZXRob2QoKSkgeworICAgICAgICAgICAgICAgIHZpc2l0Q2xhc3NFeHByZXNzaW9uKG5ldyBDbGFzc0V4cHJlc3Npb24oY2xhc3NOb2RlLmdldFN1cGVyQ2xhc3MoKSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsb2FkVGhpcygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPDw8IEZMT1cgQ09OVFJPTCA8PDw8PDw8PDwKKyAgICAgICAgfQorCisgICAgICAgIFZhcmlhYmxlIHZhcmlhYmxlID0gY29tcGlsZVN0YWNrLmdldFZhcmlhYmxlKHZhcmlhYmxlTmFtZSwgZmFsc2UpOworCisgICAgICAgIFZhcmlhYmxlU2NvcGUgc2NvcGUgPSBjb21waWxlU3RhY2suZ2V0U2NvcGUoKTsKKyAgICAgICAgaWYgKHZhcmlhYmxlID09IG51bGwpIHsKKyAgICAgICAgICAgIHByb2Nlc3NDbGFzc1ZhcmlhYmxlKHZhcmlhYmxlTmFtZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcm9jZXNzU3RhY2tWYXJpYWJsZSh2YXJpYWJsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbG9hZFRoaXMoKSB7CisgICAgICAgIG12LnZpc2l0VmFySW5zbihBTE9BRCwgMCk7CisgICAgICAgIGlmICghaW1wbGljaXRUaGlzICYmIGlzSW5DbG9zdXJlKCkpIHsKKyAgICAgICAgICAgIG12LnZpc2l0TWV0aG9kSW5zbigKKyAgICAgICAgICAgICAgICAgICAgSU5WT0tFVklSVFVBTCwKKyAgICAgICAgICAgICAgICAgICAgImdyb292eS9sYW5nL0Nsb3N1cmUiLAorICAgICAgICAgICAgICAgICAgICAiZ2V0VGhpc09iamVjdCIsCisgICAgICAgICAgICAgICAgICAgICIoKUxqYXZhL2xhbmcvT2JqZWN0OyIKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzU3RhY2tWYXJpYWJsZShWYXJpYWJsZSB2YXJpYWJsZSkgeworICAgICAgICBpZiAobGVmdEhhbmRFeHByZXNzaW9uKSB7CisgICAgICAgICAgICBoZWxwZXIuc3RvcmVWYXIodmFyaWFibGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaGVscGVyLmxvYWRWYXIodmFyaWFibGUpOworICAgICAgICB9CisgICAgICAgIGlmIChBU01fREVCVUcpIHsKKyAgICAgICAgICAgIGhlbHBlci5tYXJrKCJ2YXI6ICIgKyB2YXJpYWJsZS5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0NsYXNzVmFyaWFibGUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgaWYgKHBhc3NpbmdDbG9zdXJlUGFyYW1zICYmIGlzSW5TY3JpcHRCb2R5KCkpIHsKKyAgICAgICAgICAgIC8vIGxldCdzIGNyZWF0ZSBhIFNjcmlwdFJlZmVyZW5jZSB0byBwYXNzIGludG8gdGhlIGNsb3N1cmUKKyAgICAgICAgICAgIG12LnZpc2l0VHlwZUluc24oTkVXLCAib3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL1NjcmlwdFJlZmVyZW5jZSIpOworICAgICAgICAgICAgbXYudmlzaXRJbnNuKERVUCk7CisKKyAgICAgICAgICAgIGxvYWRUaGlzT3JPd25lcigpOworICAgICAgICAgICAgbXYudmlzaXRMZGNJbnNuKG5hbWUpOworCisgICAgICAgICAgICBtdi52aXNpdE1ldGhvZEluc24oCisgICAgICAgICAgICAgICAgICAgIElOVk9LRVNQRUNJQUwsCisgICAgICAgICAgICAgICAgICAgICJvcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvU2NyaXB0UmVmZXJlbmNlIiwKKyAgICAgICAgICAgICAgICAgICAgIjxpbml0PiIsCisgICAgICAgICAgICAgICAgICAgICIoTGdyb292eS9sYW5nL1NjcmlwdDtMamF2YS9sYW5nL1N0cmluZzspViIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUHJvcGVydHlFeHByZXNzaW9uIHBleHAgPSBuZXcgUHJvcGVydHlFeHByZXNzaW9uKFZhcmlhYmxlRXhwcmVzc2lvbi5USElTX0VYUFJFU1NJT04sIG5hbWUpOworICAgICAgICAgICAgcGV4cC5zZXRJbXBsaWNpdFRoaXModHJ1ZSk7CisgICAgICAgICAgICB2aXNpdFByb3BlcnR5RXhwcmVzc2lvbihwZXhwKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0ZpZWxkQWNjZXNzKFN0cmluZyBuYW1lLCBGaWVsZE5vZGUgZmllbGQsIGludCBzdGVwcykgeworICAgICAgICBGaWVsZEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IG5ldyBGaWVsZEV4cHJlc3Npb24oZmllbGQpOworCisgICAgICAgIGlmIChzdGVwcyA9PSAwKSB7CisgICAgICAgICAgICB2aXNpdEZpZWxkRXhwcmVzc2lvbihleHByZXNzaW9uKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZpc2l0T3V0ZXJGaWVsZEV4cHJlc3Npb24oZXhwcmVzc2lvbiwgY2xhc3NOb2RlLmdldE91dGVyQ2xhc3MoKSwgc3RlcHMsIHRydWUpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgd2UgYXJlIGluIGEgc2NyaXB0IGJvZHksIHdoZXJlIGFsbCB2YXJpYWJsZXMgZGVjbGFyZWQgYXJlIG5vIGxvbmdlcgorICAgICAqICAgICAgICAgbG9jYWwgdmFyaWFibGVzIGJ1dCBhcmUgcHJvcGVydGllcworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGlzSW5TY3JpcHRCb2R5KCkgeworICAgICAgICBpZiAoY2xhc3NOb2RlLmlzU2NyaXB0Qm9keSgpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBjbGFzc05vZGUuaXNTY3JpcHQoKSAmJiBtZXRob2ROb2RlICE9IG51bGwgJiYgbWV0aG9kTm9kZS5nZXROYW1lKCkuZXF1YWxzKCJydW4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGV4cHJlc3Npb24gd2lsbCBoYXZlIGxlZnQgYSB2YWx1ZSBvbiB0aGUgc3RhY2sKKyAgICAgKiAgICAgICAgIHRoYXQgbXVzdCBiZSBwb3BwZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1BvcFJlcXVpcmVkKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgICAgICBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIE1ldGhvZENhbGxFeHByZXNzaW9uKSB7CisgICAgICAgICAgICBpZiAoZXhwcmVzc2lvbi5nZXRUeXBlKCkgPT0gQ2xhc3NIZWxwZXIuVk9JRF9UWVBFKSB7IC8vIG5vdGhpbmcgb24gdGhlIHN0YWNrCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIERlY2xhcmF0aW9uRXhwcmVzc2lvbikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgQmluYXJ5RXhwcmVzc2lvbikgeworICAgICAgICAgICAgQmluYXJ5RXhwcmVzc2lvbiBiaW5FeHAgPSAoQmluYXJ5RXhwcmVzc2lvbikgZXhwcmVzc2lvbjsKKyAgICAgICAgICAgIHN3aXRjaCAoYmluRXhwLmdldE9wZXJhdGlvbigpLmdldFR5cGUoKSkgeyAgIC8vIGJyIHRvZG8gc2hvdWxkIGxlYXZlIGEgY29weSBvZiB0aGUgdmFsdWUgb24gdGhlIHN0YWNrIGZvciBhbGwgdGhlIGFzc2lnbmVtbnQuCisvLyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkVRVUFMIDogICAvLyBiciBhIGNvcHkgb2YgdGhlIHJpZ2h0IHZhbHVlIGlzIGxlZnQgb24gdGhlIHN0YWNrIChzZWUgZXZhbHVhdGVFcXVhbCgpKSBzbyBhIHBvcCBpcyByZXF1aXJlZCBmb3IgYSBzdGFuZGFsb25lIGFzc2lnbm1lbnQKKy8vICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuUExVU19FUVVBTCA6IC8vIHRoaXMgYW5kIHRoZSBmb2xsb3dpbmcgYXJlIHJlbGF0ZWQgdG8gZXZhbHVhdGVCaW5hcnlFeHByZXNzaW9uV2l0aEFzc2lnbm1lbnQoKQorLy8gICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5NSU5VU19FUVVBTCA6CisvLyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLk1VTFRJUExZX0VRVUFMIDoKKy8vICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuRElWSURFX0VRVUFMIDoKKy8vICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuSU5URElWX0VRVUFMIDoKKy8vICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuTU9EX0VRVUFMIDoKKy8vICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBDb25zdHJ1Y3RvckNhbGxFeHByZXNzaW9uKSB7CisgICAgICAgICAgICBDb25zdHJ1Y3RvckNhbGxFeHByZXNzaW9uIGNjZSA9IChDb25zdHJ1Y3RvckNhbGxFeHByZXNzaW9uKSBleHByZXNzaW9uOworICAgICAgICAgICAgcmV0dXJuICFjY2UuaXNTcGVjaWFsQ2FsbCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUludGVyZmFjZVN5bnRoZXRpY1N0YXRpY0ZpZWxkcygpIHsKKyAgICAgICAgaWYgKHN5bnRoZXRpY1N0YXRpY0ZpZWxkcy5pc0VtcHR5KCkpIHJldHVybjsKKworICAgICAgICBhZGRJbm5lckNsYXNzKGludGVyZmFjZUNsYXNzTG9hZGluZ0NsYXNzKTsKKworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzeW50aGV0aWNTdGF0aWNGaWVsZHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBTdHJpbmcgc3RhdGljRmllbGROYW1lID0gKFN0cmluZykgaXRlci5uZXh0KCk7CisgICAgICAgICAgICAvLyBnZW5lcmF0ZSBhIGZpZWxkIG5vZGUKKyAgICAgICAgICAgIGludGVyZmFjZUNsYXNzTG9hZGluZ0NsYXNzLmFkZEZpZWxkKHN0YXRpY0ZpZWxkTmFtZSwgQUNDX1NUQVRJQyArIEFDQ19TWU5USEVUSUMsIENsYXNzSGVscGVyLkNMQVNTX1R5cGUsIG51bGwpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlU3ludGhldGljU3RhdGljRmllbGRzKCkgeworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzeW50aGV0aWNTdGF0aWNGaWVsZHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBTdHJpbmcgc3RhdGljRmllbGROYW1lID0gKFN0cmluZykgaXRlci5uZXh0KCk7CisgICAgICAgICAgICAvLyBnZW5lcmF0ZSBhIGZpZWxkIG5vZGUKKyAgICAgICAgICAgIEZpZWxkTm9kZSBmbiA9IGNsYXNzTm9kZS5nZXRGaWVsZChzdGF0aWNGaWVsZE5hbWUpOworICAgICAgICAgICAgaWYgKGZuICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBib29sZWFuIHR5cGUgPSBmbi5nZXRUeXBlKCkgPT0gQ2xhc3NIZWxwZXIuQ0xBU1NfVHlwZTsKKyAgICAgICAgICAgICAgICBib29sZWFuIG1vZGlmaWVycyA9IGZuLmdldE1vZGlmaWVycygpID09IEFDQ19TVEFUSUMgKyBBQ0NfU1lOVEhFVElDOworICAgICAgICAgICAgICAgIGlmICh0eXBlICYmIG1vZGlmaWVycykgY29udGludWU7CisgICAgICAgICAgICAgICAgU3RyaW5nIHRleHQgPSAiIjsKKyAgICAgICAgICAgICAgICBpZiAoIXR5cGUpIHRleHQgPSAiIHdpdGggd3JvbmcgdHlwZTogIiArIGZuLmdldFR5cGUoKSArICIgKGphdmEubGFuZy5DbGFzcyBuZWVkZWQpIjsKKyAgICAgICAgICAgICAgICBpZiAoIW1vZGlmaWVycykKKyAgICAgICAgICAgICAgICAgICAgdGV4dCA9ICIgd2l0aCB3cm9uZyBtb2RpZmllcnM6ICIgKyBmbi5nZXRNb2RpZmllcnMoKSArICIgKCIgKyAoQUNDX1NUQVRJQyArIEFDQ19TWU5USEVUSUMpICsgIiBuZWVkZWQpIjsKKyAgICAgICAgICAgICAgICB0aHJvd0V4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0cmllZCB0byBzZXQgYSBzdGF0aWMgc3ludGV0aGljIGZpZWxkICIgKyBzdGF0aWNGaWVsZE5hbWUgKyAiIGluICIgKyBjbGFzc05vZGUuZ2V0TmFtZSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBmb3IgY2xhc3MgcmVzb2x2aW5nLCBidXQgZm91bmQgYWxyZWVhZHkgYSBub2RlIG9mIHRoYXQiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBuYW1lICIgKyB0ZXh0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY3YudmlzaXRGaWVsZChBQ0NfU1RBVElDICsgQUNDX1NZTlRIRVRJQywgc3RhdGljRmllbGROYW1lLCAiTGphdmEvbGFuZy9DbGFzczsiLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG12ID0KKyAgICAgICAgICAgICAgICBjdi52aXNpdE1ldGhvZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIEFDQ19TVEFUSUMgKyBBQ0NfU1lOVEhFVElDLAorICAgICAgICAgICAgICAgICAgICAgICAgImNsYXNzJCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL0NsYXNzOyIsCisgICAgICAgICAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7CisgICAgICAgIExhYmVsIGwwID0gbmV3IExhYmVsKCk7CisgICAgICAgIG12LnZpc2l0TGFiZWwobDApOworICAgICAgICBtdi52aXNpdFZhckluc24oQUxPQUQsIDApOworICAgICAgICBtdi52aXNpdE1ldGhvZEluc24oSU5WT0tFU1RBVElDLCAiamF2YS9sYW5nL0NsYXNzIiwgImZvck5hbWUiLCAiKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL0NsYXNzOyIpOworICAgICAgICBMYWJlbCBsMSA9IG5ldyBMYWJlbCgpOworICAgICAgICBtdi52aXNpdExhYmVsKGwxKTsKKyAgICAgICAgbXYudmlzaXRJbnNuKEFSRVRVUk4pOworICAgICAgICBMYWJlbCBsMiA9IG5ldyBMYWJlbCgpOworICAgICAgICBtdi52aXNpdExhYmVsKGwyKTsKKyAgICAgICAgbXYudmlzaXRWYXJJbnNuKEFTVE9SRSwgMSk7CisgICAgICAgIG12LnZpc2l0VHlwZUluc24oTkVXLCAiamF2YS9sYW5nL05vQ2xhc3NEZWZGb3VuZEVycm9yIik7CisgICAgICAgIG12LnZpc2l0SW5zbihEVVApOworICAgICAgICBtdi52aXNpdFZhckluc24oQUxPQUQsIDEpOworICAgICAgICBtdi52aXNpdE1ldGhvZEluc24oSU5WT0tFVklSVFVBTCwgImphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uIiwgImdldE1lc3NhZ2UiLCAiKClMamF2YS9sYW5nL1N0cmluZzsiKTsKKyAgICAgICAgbXYudmlzaXRNZXRob2RJbnNuKElOVk9LRVNQRUNJQUwsICJqYXZhL2xhbmcvTm9DbGFzc0RlZkZvdW5kRXJyb3IiLCAiPGluaXQ+IiwgIihMamF2YS9sYW5nL1N0cmluZzspViIpOworICAgICAgICBtdi52aXNpdEluc24oQVRIUk9XKTsKKyAgICAgICAgbXYudmlzaXRUcnlDYXRjaEJsb2NrKGwwLCBsMiwgbDIsICJqYXZhL2xhbmcvQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiIpOyAvLyBiciB1c2luZyBsMiBhcyB0aGUgMm5kIHBhcmFtIHNlZW1zIGNyZWF0ZSB0aGUgcmlnaHQgdGFibGUgZW50cnkKKyAgICAgICAgbXYudmlzaXRNYXhzKDMsIDIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGxvYWQgY2xhc3Mgb2JqZWN0IG9uIHN0YWNrCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmlzaXRDbGFzc0V4cHJlc3Npb24oQ2xhc3NFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKyAgICAgICAgQ2xhc3NOb2RlIHR5cGUgPSBleHByZXNzaW9uLmdldFR5cGUoKTsKKworICAgICAgICBpZiAoQ2xhc3NIZWxwZXIuaXNQcmltaXRpdmVUeXBlKHR5cGUpKSB7CisgICAgICAgICAgICBDbGFzc05vZGUgb2JqZWN0VHlwZSA9IENsYXNzSGVscGVyLmdldFdyYXBwZXIodHlwZSk7CisgICAgICAgICAgICBtdi52aXNpdEZpZWxkSW5zbihHRVRTVEFUSUMsIEJ5dGVjb2RlSGVscGVyLmdldENsYXNzSW50ZXJuYWxOYW1lKG9iamVjdFR5cGUpLCAiVFlQRSIsICJMamF2YS9sYW5nL0NsYXNzOyIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU3RyaW5nIHN0YXRpY0ZpZWxkTmFtZTsKKyAgICAgICAgICAgIGlmICh0eXBlLmVxdWFscyhjbGFzc05vZGUpKSB7CisgICAgICAgICAgICAgICAgc3RhdGljRmllbGROYW1lID0gImNsYXNzJDAiOworICAgICAgICAgICAgICAgIGlmIChjb21waWxlU3RhY2suZ2V0Q3VycmVudENsYXNzSW5kZXgoKSAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICBtdi52aXNpdFZhckluc24oQUxPQUQsIGNvbXBpbGVTdGFjay5nZXRDdXJyZW50Q2xhc3NJbmRleCgpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZS5lcXVhbHMoQ2xhc3NIZWxwZXIuTUVUQUNMQVNTX1RZUEUpKSB7CisgICAgICAgICAgICAgICAgc3RhdGljRmllbGROYW1lID0gZ2V0U3RhdGljRmllbGROYW1lKHR5cGUpOworICAgICAgICAgICAgICAgIGlmIChjb21waWxlU3RhY2suZ2V0Q3VycmVudE1ldGFDbGFzc0luZGV4KCkgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgbXYudmlzaXRWYXJJbnNuKEFMT0FELCBjb21waWxlU3RhY2suZ2V0Q3VycmVudE1ldGFDbGFzc0luZGV4KCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdGF0aWNGaWVsZE5hbWUgPSBnZXRTdGF0aWNGaWVsZE5hbWUodHlwZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN5bnRoZXRpY1N0YXRpY0ZpZWxkcy5hZGQoc3RhdGljRmllbGROYW1lKTsKKworICAgICAgICAgICAgU3RyaW5nIGludGVybmFsQ2xhc3NOYW1lID0gdGhpcy5pbnRlcm5hbENsYXNzTmFtZTsKKyAgICAgICAgICAgIGlmIChjbGFzc05vZGUuaXNJbnRlcmZhY2UoKSkgeworICAgICAgICAgICAgICAgIGludGVybmFsQ2xhc3NOYW1lID0gQnl0ZWNvZGVIZWxwZXIuZ2V0Q2xhc3NJbnRlcm5hbE5hbWUoaW50ZXJmYWNlQ2xhc3NMb2FkaW5nQ2xhc3MpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtdi52aXNpdEZpZWxkSW5zbihHRVRTVEFUSUMsIGludGVybmFsQ2xhc3NOYW1lLCBzdGF0aWNGaWVsZE5hbWUsICJMamF2YS9sYW5nL0NsYXNzOyIpOworCisgICAgICAgICAgICBMYWJlbCBsMCA9IG5ldyBMYWJlbCgpOworICAgICAgICAgICAgbXYudmlzaXRKdW1wSW5zbihJRk5PTk5VTEwsIGwwKTsKKyAgICAgICAgICAgIG12LnZpc2l0TGRjSW5zbihCeXRlY29kZUhlbHBlci5nZXRDbGFzc0xvYWRpbmdUeXBlRGVzY3JpcHRpb24odHlwZSkpOworICAgICAgICAgICAgbXYudmlzaXRNZXRob2RJbnNuKElOVk9LRVNUQVRJQywgaW50ZXJuYWxDbGFzc05hbWUsICJjbGFzcyQiLCAiKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL0NsYXNzOyIpOworICAgICAgICAgICAgbXYudmlzaXRJbnNuKERVUCk7CisgICAgICAgICAgICBtdi52aXNpdEZpZWxkSW5zbihQVVRTVEFUSUMsIGludGVybmFsQ2xhc3NOYW1lLCBzdGF0aWNGaWVsZE5hbWUsICJMamF2YS9sYW5nL0NsYXNzOyIpOworICAgICAgICAgICAgTGFiZWwgbDEgPSBuZXcgTGFiZWwoKTsKKyAgICAgICAgICAgIG12LnZpc2l0SnVtcEluc24oR09UTywgbDEpOworICAgICAgICAgICAgbXYudmlzaXRMYWJlbChsMCk7CisgICAgICAgICAgICBtdi52aXNpdEZpZWxkSW5zbihHRVRTVEFUSUMsIGludGVybmFsQ2xhc3NOYW1lLCBzdGF0aWNGaWVsZE5hbWUsICJMamF2YS9sYW5nL0NsYXNzOyIpOworICAgICAgICAgICAgbXYudmlzaXRMYWJlbChsMSk7CisKKyAgICAgICAgICAgIGlmICh0eXBlLmVxdWFscyhjbGFzc05vZGUpKSB7CisgICAgICAgICAgICAgICAgbXYudmlzaXRJbnNuKERVUCk7CisgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gY29tcGlsZVN0YWNrLmRlZmluZVRlbXBvcmFyeVZhcmlhYmxlKCJjbGFzcyQwIiwgQ2xhc3NIZWxwZXIuQ0xBU1NfVHlwZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgY29tcGlsZVN0YWNrLnNldEN1cnJlbnRDbGFzc0luZGV4KGluZGV4KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZS5lcXVhbHMoQ2xhc3NIZWxwZXIuTUVUQUNMQVNTX1RZUEUpKSB7CisgICAgICAgICAgICAgICAgbXYudmlzaXRJbnNuKERVUCk7CisgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gY29tcGlsZVN0YWNrLmRlZmluZVRlbXBvcmFyeVZhcmlhYmxlKCJtZXRhJGNsYXNzJDAiLCBDbGFzc0hlbHBlci5DTEFTU19UeXBlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBjb21waWxlU3RhY2suc2V0Q3VycmVudE1ldGFDbGFzc0luZGV4KGluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0UmFuZ2VFeHByZXNzaW9uKFJhbmdlRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisgICAgICAgIGV4cHJlc3Npb24uZ2V0RnJvbSgpLnZpc2l0KHRoaXMpOworICAgICAgICBleHByZXNzaW9uLmdldFRvKCkudmlzaXQodGhpcyk7CisKKyAgICAgICAgaGVscGVyLnB1c2hDb25zdGFudChleHByZXNzaW9uLmlzSW5jbHVzaXZlKCkpOworCisgICAgICAgIGNyZWF0ZVJhbmdlTWV0aG9kLmNhbGwobXYpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0TWFwRW50cnlFeHByZXNzaW9uKE1hcEVudHJ5RXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisgICAgICAgIHRocm93IG5ldyBHcm9vdnlCdWdFcnJvcigiTWFwRW50cnlFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgdmlzaXRlZCBoZXJlIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRNYXBFeHByZXNzaW9uKE1hcEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgICAgICBMaXN0IGVudHJpZXMgPSBleHByZXNzaW9uLmdldE1hcEVudHJ5RXhwcmVzc2lvbnMoKTsKKyAgICAgICAgaW50IHNpemUgPSBlbnRyaWVzLnNpemUoKTsKKyAgICAgICAgaGVscGVyLnB1c2hDb25zdGFudChzaXplICogMik7CisKKyAgICAgICAgbXYudmlzaXRUeXBlSW5zbihBTkVXQVJSQVksICJqYXZhL2xhbmcvT2JqZWN0Iik7CisKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbnRyaWVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IGl0ZXIubmV4dCgpOworICAgICAgICAgICAgTWFwRW50cnlFeHByZXNzaW9uIGVudHJ5ID0gKE1hcEVudHJ5RXhwcmVzc2lvbikgb2JqZWN0OworCisgICAgICAgICAgICBtdi52aXNpdEluc24oRFVQKTsKKyAgICAgICAgICAgIGhlbHBlci5wdXNoQ29uc3RhbnQoaSsrKTsKKyAgICAgICAgICAgIHZpc2l0QW5kQXV0b2JveEJvb2xlYW4oZW50cnkuZ2V0S2V5RXhwcmVzc2lvbigpKTsKKyAgICAgICAgICAgIG12LnZpc2l0SW5zbihBQVNUT1JFKTsKKworICAgICAgICAgICAgbXYudmlzaXRJbnNuKERVUCk7CisgICAgICAgICAgICBoZWxwZXIucHVzaENvbnN0YW50KGkrKyk7CisgICAgICAgICAgICB2aXNpdEFuZEF1dG9ib3hCb29sZWFuKGVudHJ5LmdldFZhbHVlRXhwcmVzc2lvbigpKTsKKyAgICAgICAgICAgIG12LnZpc2l0SW5zbihBQVNUT1JFKTsKKyAgICAgICAgfQorICAgICAgICBjcmVhdGVNYXBNZXRob2QuY2FsbChtdik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRBcmd1bWVudGxpc3RFeHByZXNzaW9uKEFyZ3VtZW50TGlzdEV4cHJlc3Npb24gYWxlKSB7CisgICAgICAgIGlmIChjb250YWluc1NwcmVhZEV4cHJlc3Npb24oYWxlKSkgeworICAgICAgICAgICAgZGVzcHJlYWRMaXN0KGFsZS5nZXRFeHByZXNzaW9ucygpLCB0cnVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZpc2l0VHVwbGVFeHByZXNzaW9uKGFsZSwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFR1cGxlRXhwcmVzc2lvbihUdXBsZUV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgICAgICB2aXNpdFR1cGxlRXhwcmVzc2lvbihleHByZXNzaW9uLCBmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZpc2l0VHVwbGVFeHByZXNzaW9uKFR1cGxlRXhwcmVzc2lvbiBleHByZXNzaW9uLCBib29sZWFuIHVzZVdyYXBwZXIpIHsKKyAgICAgICAgaW50IHNpemUgPSBleHByZXNzaW9uLmdldEV4cHJlc3Npb25zKCkuc2l6ZSgpOworCisgICAgICAgIGhlbHBlci5wdXNoQ29uc3RhbnQoc2l6ZSk7CisKKyAgICAgICAgbXYudmlzaXRUeXBlSW5zbihBTkVXQVJSQVksICJqYXZhL2xhbmcvT2JqZWN0Iik7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIG12LnZpc2l0SW5zbihEVVApOworICAgICAgICAgICAgaGVscGVyLnB1c2hDb25zdGFudChpKTsKKyAgICAgICAgICAgIEV4cHJlc3Npb24gYXJndW1lbnQgPSBleHByZXNzaW9uLmdldEV4cHJlc3Npb24oaSk7CisgICAgICAgICAgICB2aXNpdEFuZEF1dG9ib3hCb29sZWFuKGFyZ3VtZW50KTsKKyAgICAgICAgICAgIGlmICh1c2VXcmFwcGVyICYmIGFyZ3VtZW50IGluc3RhbmNlb2YgQ2FzdEV4cHJlc3Npb24pIGxvYWRXcmFwcGVyKGFyZ3VtZW50KTsKKworICAgICAgICAgICAgbXYudmlzaXRJbnNuKEFBU1RPUkUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGxvYWRXcmFwcGVyKEV4cHJlc3Npb24gYXJndW1lbnQpIHsKKyAgICAgICAgQ2xhc3NOb2RlIGdvYWxDbGFzcyA9IGFyZ3VtZW50LmdldFR5cGUoKTsKKyAgICAgICAgdmlzaXRDbGFzc0V4cHJlc3Npb24obmV3IENsYXNzRXhwcmVzc2lvbihnb2FsQ2xhc3MpKTsKKyAgICAgICAgaWYgKGdvYWxDbGFzcy5pc0Rlcml2ZWRGcm9tR3Jvb3Z5T2JqZWN0KCkpIHsKKyAgICAgICAgICAgIGNyZWF0ZUdyb292eU9iamVjdFdyYXBwZXJNZXRob2QuY2FsbChtdik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjcmVhdGVQb2pvV3JhcHBlck1ldGhvZC5jYWxsKG12KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0QXJyYXlFeHByZXNzaW9uKEFycmF5RXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisgICAgICAgIENsYXNzTm9kZSBlbGVtZW50VHlwZSA9IGV4cHJlc3Npb24uZ2V0RWxlbWVudFR5cGUoKTsKKyAgICAgICAgU3RyaW5nIGFycmF5VHlwZU5hbWUgPSBCeXRlY29kZUhlbHBlci5nZXRDbGFzc0ludGVybmFsTmFtZShlbGVtZW50VHlwZSk7CisgICAgICAgIExpc3Qgc2l6ZUV4cHJlc3Npb24gPSBleHByZXNzaW9uLmdldFNpemVFeHByZXNzaW9uKCk7CisKKyAgICAgICAgaW50IHNpemUgPSAwOworICAgICAgICBpbnQgZGltZW5zaW9ucyA9IDA7CisgICAgICAgIGlmIChzaXplRXhwcmVzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzaXplRXhwcmVzc2lvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBFeHByZXNzaW9uIGVsZW1lbnQgPSAoRXhwcmVzc2lvbikgaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgPT0gQ29uc3RhbnRFeHByZXNzaW9uLkVNVFBZX0VYUFJFU1NJT04pIGJyZWFrOworICAgICAgICAgICAgICAgIGRpbWVuc2lvbnMrKzsKKyAgICAgICAgICAgICAgICAvLyBsZXRzIGNvbnZlcnQgdG8gYW4gaW50CisgICAgICAgICAgICAgICAgdmlzaXRBbmRBdXRvYm94Qm9vbGVhbihlbGVtZW50KTsKKyAgICAgICAgICAgICAgICBoZWxwZXIudW5ib3goaW50LmNsYXNzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNpemUgPSBleHByZXNzaW9uLmdldEV4cHJlc3Npb25zKCkuc2l6ZSgpOworICAgICAgICAgICAgaGVscGVyLnB1c2hDb25zdGFudChzaXplKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBzdG9yZUlucyA9IEFBU1RPUkU7CisgICAgICAgIGlmIChzaXplRXhwcmVzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBhcnJheVR5cGVOYW1lID0gQnl0ZWNvZGVIZWxwZXIuZ2V0VHlwZURlc2NyaXB0aW9uKGV4cHJlc3Npb24uZ2V0VHlwZSgpKTsKKyAgICAgICAgICAgIG12LnZpc2l0TXVsdGlBTmV3QXJyYXlJbnNuKGFycmF5VHlwZU5hbWUsIGRpbWVuc2lvbnMpOworICAgICAgICB9IGVsc2UgaWYgKENsYXNzSGVscGVyLmlzUHJpbWl0aXZlVHlwZShlbGVtZW50VHlwZSkpIHsKKyAgICAgICAgICAgIGludCBwcmltVHlwZSA9IDA7CisgICAgICAgICAgICBpZiAoZWxlbWVudFR5cGUgPT0gQ2xhc3NIZWxwZXIuYm9vbGVhbl9UWVBFKSB7CisgICAgICAgICAgICAgICAgcHJpbVR5cGUgPSBUX0JPT0xFQU47CisgICAgICAgICAgICAgICAgc3RvcmVJbnMgPSBCQVNUT1JFOworICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50VHlwZSA9PSBDbGFzc0hlbHBlci5jaGFyX1RZUEUpIHsKKyAgICAgICAgICAgICAgICBwcmltVHlwZSA9IFRfQ0hBUjsKKyAgICAgICAgICAgICAgICBzdG9yZUlucyA9IENBU1RPUkU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnRUeXBlID09IENsYXNzSGVscGVyLmZsb2F0X1RZUEUpIHsKKyAgICAgICAgICAgICAgICBwcmltVHlwZSA9IFRfRkxPQVQ7CisgICAgICAgICAgICAgICAgc3RvcmVJbnMgPSBGQVNUT1JFOworICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50VHlwZSA9PSBDbGFzc0hlbHBlci5kb3VibGVfVFlQRSkgeworICAgICAgICAgICAgICAgIHByaW1UeXBlID0gVF9ET1VCTEU7CisgICAgICAgICAgICAgICAgc3RvcmVJbnMgPSBEQVNUT1JFOworICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50VHlwZSA9PSBDbGFzc0hlbHBlci5ieXRlX1RZUEUpIHsKKyAgICAgICAgICAgICAgICBwcmltVHlwZSA9IFRfQllURTsKKyAgICAgICAgICAgICAgICBzdG9yZUlucyA9IEJBU1RPUkU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnRUeXBlID09IENsYXNzSGVscGVyLnNob3J0X1RZUEUpIHsKKyAgICAgICAgICAgICAgICBwcmltVHlwZSA9IFRfU0hPUlQ7CisgICAgICAgICAgICAgICAgc3RvcmVJbnMgPSBTQVNUT1JFOworICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50VHlwZSA9PSBDbGFzc0hlbHBlci5pbnRfVFlQRSkgeworICAgICAgICAgICAgICAgIHByaW1UeXBlID0gVF9JTlQ7CisgICAgICAgICAgICAgICAgc3RvcmVJbnMgPSBJQVNUT1JFOworICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50VHlwZSA9PSBDbGFzc0hlbHBlci5sb25nX1RZUEUpIHsKKyAgICAgICAgICAgICAgICBwcmltVHlwZSA9IFRfTE9ORzsKKyAgICAgICAgICAgICAgICBzdG9yZUlucyA9IExBU1RPUkU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtdi52aXNpdEludEluc24oTkVXQVJSQVksIHByaW1UeXBlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG12LnZpc2l0VHlwZUluc24oQU5FV0FSUkFZLCBhcnJheVR5cGVOYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBtdi52aXNpdEluc24oRFVQKTsKKyAgICAgICAgICAgIGhlbHBlci5wdXNoQ29uc3RhbnQoaSk7CisgICAgICAgICAgICBFeHByZXNzaW9uIGVsZW1lbnRFeHByZXNzaW9uID0gZXhwcmVzc2lvbi5nZXRFeHByZXNzaW9uKGkpOworICAgICAgICAgICAgaWYgKGVsZW1lbnRFeHByZXNzaW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBDb25zdGFudEV4cHJlc3Npb24uTlVMTC52aXNpdCh0aGlzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50VHlwZS5lcXVhbHMoZWxlbWVudEV4cHJlc3Npb24uZ2V0VHlwZSgpKSkgeworICAgICAgICAgICAgICAgICAgICB2aXNpdENhc3RFeHByZXNzaW9uKG5ldyBDYXN0RXhwcmVzc2lvbihlbGVtZW50VHlwZSwgZWxlbWVudEV4cHJlc3Npb24sIHRydWUpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB2aXNpdEFuZEF1dG9ib3hCb29sZWFuKGVsZW1lbnRFeHByZXNzaW9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtdi52aXNpdEluc24oc3RvcmVJbnMpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNpemVFeHByZXNzaW9uID09IG51bGwgJiYgQ2xhc3NIZWxwZXIuaXNQcmltaXRpdmVUeXBlKGVsZW1lbnRUeXBlKSkgeworICAgICAgICAgICAgaW50IHBhciA9IGNvbXBpbGVTdGFjay5kZWZpbmVUZW1wb3JhcnlWYXJpYWJsZSgicGFyIiwgdHJ1ZSk7CisgICAgICAgICAgICBtdi52aXNpdFZhckluc24oQUxPQUQsIHBhcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdENsb3N1cmVMaXN0RXhwcmVzc2lvbihDbG9zdXJlTGlzdEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgICAgICBjb21waWxlU3RhY2sucHVzaFZhcmlhYmxlU2NvcGUoZXhwcmVzc2lvbi5nZXRWYXJpYWJsZVNjb3BlKCkpOworCisgICAgICAgIExpc3QgZXhwcmVzc2lvbnMgPSBleHByZXNzaW9uLmdldEV4cHJlc3Npb25zKCk7CisgICAgICAgIGZpbmFsIGludCBzaXplID0gZXhwcmVzc2lvbnMuc2l6ZSgpOworICAgICAgICAvLyBpbml0IGRlY2xhcmF0aW9ucworICAgICAgICBMaW5rZWRMaXN0IGRlY2xhcmF0aW9ucyA9IG5ldyBMaW5rZWRMaXN0KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBPYmplY3QgZXhwciA9IGV4cHJlc3Npb25zLmdldChpKTsKKyAgICAgICAgICAgIGlmIChleHByIGluc3RhbmNlb2YgRGVjbGFyYXRpb25FeHByZXNzaW9uKSB7CisgICAgICAgICAgICAgICAgZGVjbGFyYXRpb25zLmFkZChleHByKTsKKyAgICAgICAgICAgICAgICBEZWNsYXJhdGlvbkV4cHJlc3Npb24gZGUgPSAoRGVjbGFyYXRpb25FeHByZXNzaW9uKSBleHByOworICAgICAgICAgICAgICAgIEJpbmFyeUV4cHJlc3Npb24gYmUgPSBuZXcgQmluYXJ5RXhwcmVzc2lvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlLmdldExlZnRFeHByZXNzaW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICBkZS5nZXRPcGVyYXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlLmdldFJpZ2h0RXhwcmVzc2lvbigpKTsKKyAgICAgICAgICAgICAgICBleHByZXNzaW9ucy5zZXQoaSwgYmUpOworICAgICAgICAgICAgICAgIGRlLnNldFJpZ2h0RXhwcmVzc2lvbihDb25zdGFudEV4cHJlc3Npb24uTlVMTCk7CisgICAgICAgICAgICAgICAgdmlzaXREZWNsYXJhdGlvbkV4cHJlc3Npb24oZGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgTGlua2VkTGlzdCBpbnN0cnVjdGlvbnMgPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICBCeXRlY29kZVNlcXVlbmNlIHNlcSA9IG5ldyBCeXRlY29kZVNlcXVlbmNlKGluc3RydWN0aW9ucyk7CisgICAgICAgIEJsb2NrU3RhdGVtZW50IGJzID0gbmV3IEJsb2NrU3RhdGVtZW50KCk7CisgICAgICAgIGJzLmFkZFN0YXRlbWVudChzZXEpOworICAgICAgICBQYXJhbWV0ZXIgY2xvc3VyZUluZGV4ID0gbmV3IFBhcmFtZXRlcihDbGFzc0hlbHBlci5pbnRfVFlQRSwgIl9fY2xvc3VyZUluZGV4Iik7CisgICAgICAgIENsb3N1cmVFeHByZXNzaW9uIGNlID0gbmV3IENsb3N1cmVFeHByZXNzaW9uKG5ldyBQYXJhbWV0ZXJbXXtjbG9zdXJlSW5kZXh9LCBicyk7CisgICAgICAgIGNlLnNldFZhcmlhYmxlU2NvcGUoZXhwcmVzc2lvbi5nZXRWYXJpYWJsZVNjb3BlKCkpOworCisgICAgICAgIC8vIHRvIGtlZXAgc3RhY2sgaGlnaHQgcHV0IGEgbnVsbCBvbiBzdGFjaworICAgICAgICBpbnN0cnVjdGlvbnMuYWRkKENvbnN0YW50RXhwcmVzc2lvbi5OVUxMKTsKKworICAgICAgICAvLyBpbml0IHRhYmxlCisgICAgICAgIGZpbmFsIExhYmVsIGRmbHQgPSBuZXcgTGFiZWwoKTsKKyAgICAgICAgZmluYWwgTGFiZWwgdGFibGVFbmQgPSBuZXcgTGFiZWwoKTsKKyAgICAgICAgZmluYWwgTGFiZWxbXSBsYWJlbHMgPSBuZXcgTGFiZWxbc2l6ZV07CisgICAgICAgIGluc3RydWN0aW9ucy5hZGQobmV3IEJ5dGVjb2RlSW5zdHJ1Y3Rpb24oKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChNZXRob2RWaXNpdG9yIG12KSB7CisgICAgICAgICAgICAgICAgbXYudmlzaXRWYXJJbnNuKElMT0FELCAxKTsKKyAgICAgICAgICAgICAgICBtdi52aXNpdFRhYmxlU3dpdGNoSW5zbigwLCBzaXplIC0gMSwgZGZsdCwgbGFiZWxzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgLy8gdmlzaXQgY2FzZXMKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKCk7CisgICAgICAgICAgICBPYmplY3QgZXhwciA9IGV4cHJlc3Npb25zLmdldChpKTsKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNTdGF0ZW1lbnQgPSBleHByIGluc3RhbmNlb2YgU3RhdGVtZW50OworICAgICAgICAgICAgbGFiZWxzW2ldID0gbGFiZWw7CisgICAgICAgICAgICBpbnN0cnVjdGlvbnMuYWRkKG5ldyBCeXRlY29kZUluc3RydWN0aW9uKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE1ldGhvZFZpc2l0b3IgbXYpIHsKKyAgICAgICAgICAgICAgICAgICAgbXYudmlzaXRMYWJlbChsYWJlbCk7CisgICAgICAgICAgICAgICAgICAgIC8vIGV4cHJlc3Npb25zIHdpbGwgbGVhdmUgYSB2YWx1ZSBvbiBzdGFjaywgc3RhdGVtZW50cyBub3QKKyAgICAgICAgICAgICAgICAgICAgLy8gc28gZXhwcmVzc2lvbnMgbmVlZCB0byBwb3AgdGhlIGFsaWJpIG51bGwKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1N0YXRlbWVudCkgbXYudmlzaXRJbnNuKFBPUCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBpbnN0cnVjdGlvbnMuYWRkKGV4cHIpOworICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zLmFkZChuZXcgQnl0ZWNvZGVJbnN0cnVjdGlvbigpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChNZXRob2RWaXNpdG9yIG12KSB7CisgICAgICAgICAgICAgICAgICAgIG12LnZpc2l0SnVtcEluc24oR09UTywgdGFibGVFbmQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICAgICAgLy8gZGVmYXVsdCBjYXNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGluc3RydWN0aW9ucy5hZGQobmV3IEJ5dGVjb2RlSW5zdHJ1Y3Rpb24oKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTWV0aG9kVmlzaXRvciBtdikgeworICAgICAgICAgICAgICAgICAgICBtdi52aXNpdExhYmVsKGRmbHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgQ29uc3RhbnRFeHByZXNzaW9uIHRleHQgPSBuZXcgQ29uc3RhbnRFeHByZXNzaW9uKCJpbnZhbGlkIGluZGV4IGZvciBjbG9zdXJlIik7CisgICAgICAgICAgICBDb25zdHJ1Y3RvckNhbGxFeHByZXNzaW9uIGNjZSA9IG5ldyBDb25zdHJ1Y3RvckNhbGxFeHByZXNzaW9uKENsYXNzSGVscGVyLm1ha2UoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKSwgdGV4dCk7CisgICAgICAgICAgICBUaHJvd1N0YXRlbWVudCB0cyA9IG5ldyBUaHJvd1N0YXRlbWVudChjY2UpOworICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zLmFkZCh0cyk7CisgICAgICAgIH0KKworICAgICAgICAvLyByZXR1cm4KKyAgICAgICAgaW5zdHJ1Y3Rpb25zLmFkZChuZXcgQnl0ZWNvZGVJbnN0cnVjdGlvbigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KE1ldGhvZFZpc2l0b3IgbXYpIHsKKyAgICAgICAgICAgICAgICBtdi52aXNpdExhYmVsKHRhYmxlRW5kKTsKKyAgICAgICAgICAgICAgICBtdi52aXNpdEluc24oQVJFVFVSTik7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIC8vIGxvYWQgbWFpbiBDbG9zdXJlCisgICAgICAgIHZpc2l0Q2xvc3VyZUV4cHJlc3Npb24oY2UpOworCisgICAgICAgIC8vIHdlIG5lZWQgbGF0ZXIgYW4gYXJyYXkgdG8gc3RvcmUgdGhlIGN1cnJpZWQKKyAgICAgICAgLy8gY2xvc3VyZXMsIHNvIHdlIGNyZWF0ZSBpdCBoZXJlIGFuZCBhdmUgaXQKKyAgICAgICAgLy8gaW4gYSB0ZW1wb3JhcnkgdmFyaWFibGUKKyAgICAgICAgaGVscGVyLnB1c2hDb25zdGFudChzaXplKTsKKyAgICAgICAgbXYudmlzaXRUeXBlSW5zbihBTkVXQVJSQVksICJqYXZhL2xhbmcvT2JqZWN0Iik7CisgICAgICAgIGludCBsaXN0QXJyYXlWYXIgPSBjb21waWxlU3RhY2suZGVmaW5lVGVtcG9yYXJ5VmFyaWFibGUoIl9saXN0T2ZDbG9zdXJlcyIsIHRydWUpOworCisgICAgICAgIC8vIGFkZCBjdXJyaWVkIHZlcnNpb25zCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAvLyBzdGFjazogY2xvc3VyZQorCisgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGNyZWF0ZSBhIGN1cnJpZWQgY2xvc3VyZSB2ZXJzaW9uCisgICAgICAgICAgICAvLyBzbyB3ZSBzdG9yZSB0aGUgdHlwZSBvbiBzdGFjaworICAgICAgICAgICAgbXYudmlzaXRUeXBlSW5zbihORVcsICJvcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvQ3VycmllZENsb3N1cmUiKTsKKyAgICAgICAgICAgIC8vIHN0YWNrOiBjbG9zdXJlLCB0eXBlCisgICAgICAgICAgICAvLyBmb3IgYSBjb25zdHJ1Y3RvciBjYWxsIHdlIG5lZWQgdGhlIHR5cGUgdHdvIHRpbWVzIAorCisgICAgICAgICAgICAvLyBhbmQgdGhlIGNsb3N1cmUgYWZ0ZXIgdGhlbQorICAgICAgICAgICAgbXYudmlzaXRJbnNuKERVUDIpOworICAgICAgICAgICAgbXYudmlzaXRJbnNuKFNXQVApOworICAgICAgICAgICAgLy8gc3RhY2s6IGNsb3N1cmUsdHlwZSx0eXBlLGNsb3N1cmUKKworICAgICAgICAgICAgLy8gc28gd2UgY2FuIGNyZWF0ZSB0aGUgY3VycmllZCBjbG9zdXJlCisgICAgICAgICAgICBoZWxwZXIucHVzaENvbnN0YW50KGkpOworICAgICAgICAgICAgbXYudmlzaXRNZXRob2RJbnNuKElOVk9LRVNQRUNJQUwsICJvcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvQ3VycmllZENsb3N1cmUiLCAiPGluaXQ+IiwgIihMZ3Jvb3Z5L2xhbmcvQ2xvc3VyZTtJKVYiKTsKKyAgICAgICAgICAgIC8vIHN0YWNrOiBjbG9zdXJlLGN1cnJpZWRDbG9zdXJlCisKKyAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gc2F2ZSB0aGUgcmVzdWx0CisgICAgICAgICAgICBtdi52aXNpdFZhckluc24oQUxPQUQsIGxpc3RBcnJheVZhcik7CisgICAgICAgICAgICBtdi52aXNpdEluc24oU1dBUCk7CisgICAgICAgICAgICBoZWxwZXIucHVzaENvbnN0YW50KGkpOworICAgICAgICAgICAgbXYudmlzaXRJbnNuKFNXQVApOworICAgICAgICAgICAgbXYudmlzaXRJbnNuKEFBU1RPUkUpOworICAgICAgICAgICAgLy8gc3RhY2s6IGNsb3N1cmUKKyAgICAgICAgfQorCisgICAgICAgIC8vIHdlIGRvbid0IG5lZWQgdGhlIGNsb3N1cmUgYW55IGxvbmdlciwgc28gcmVtb3ZlIGl0CisgICAgICAgIG12LnZpc2l0SW5zbihQT1ApOworICAgICAgICAvLyB3ZSBsb2FkIHRoZSBhcnJheSBhbmQgY3JlYXRlIGEgbGlzdCBmcm9tIGl0CisgICAgICAgIG12LnZpc2l0VmFySW5zbihBTE9BRCwgbGlzdEFycmF5VmFyKTsKKyAgICAgICAgY3JlYXRlTGlzdE1ldGhvZC5jYWxsKG12KTsKKworICAgICAgICAvLyByZW1vdmUgdGhlIHRlbXBvcmFyeSB2YXJpYWJsZSB0byBrZWVwIHRoZSAKKyAgICAgICAgLy8gc3RhY2sgY2xlYW4KKyAgICAgICAgY29tcGlsZVN0YWNrLnJlbW92ZVZhcihsaXN0QXJyYXlWYXIpOworICAgICAgICBjb21waWxlU3RhY2sucG9wKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRCeXRlY29kZVNlcXVlbmNlKEJ5dGVjb2RlU2VxdWVuY2UgYnl0ZWNvZGVTZXF1ZW5jZSkgeworICAgICAgICBMaXN0IGluc3RydWN0aW9ucyA9IGJ5dGVjb2RlU2VxdWVuY2UuZ2V0SW5zdHJ1Y3Rpb25zKCk7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBpbnN0cnVjdGlvbnMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgT2JqZWN0IHBhcnQgPSBpdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICBpZiAocGFydCA9PSBFbXB0eUV4cHJlc3Npb24uSU5TVEFOQ0UpIHsKKyAgICAgICAgICAgICAgICBtdi52aXNpdEluc24oQUNPTlNUX05VTEwpOworICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0IGluc3RhbmNlb2YgRXhwcmVzc2lvbikgeworICAgICAgICAgICAgICAgIHZpc2l0QW5kQXV0b2JveEJvb2xlYW4oKEV4cHJlc3Npb24pIHBhcnQpOworICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0IGluc3RhbmNlb2YgU3RhdGVtZW50KSB7CisgICAgICAgICAgICAgICAgU3RhdGVtZW50IHN0bSA9IChTdGF0ZW1lbnQpIHBhcnQ7CisgICAgICAgICAgICAgICAgc3RtLnZpc2l0KHRoaXMpOworICAgICAgICAgICAgICAgIG12LnZpc2l0SW5zbihBQ09OU1RfTlVMTCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEJ5dGVjb2RlSW5zdHJ1Y3Rpb24gcnVubmVyID0gKEJ5dGVjb2RlSW5zdHJ1Y3Rpb24pIHBhcnQ7CisgICAgICAgICAgICAgICAgcnVubmVyLnZpc2l0KG12KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0TGlzdEV4cHJlc3Npb24oTGlzdEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgICAgICBpbnQgc2l6ZSA9IGV4cHJlc3Npb24uZ2V0RXhwcmVzc2lvbnMoKS5zaXplKCk7CisgICAgICAgIGJvb2xlYW4gY29udGFpbnNTcHJlYWRFeHByZXNzaW9uID0gY29udGFpbnNTcHJlYWRFeHByZXNzaW9uKGV4cHJlc3Npb24pOworICAgICAgICBpZiAoIWNvbnRhaW5zU3ByZWFkRXhwcmVzc2lvbikgeworICAgICAgICAgICAgaGVscGVyLnB1c2hDb25zdGFudChzaXplKTsKKworICAgICAgICAgICAgbXYudmlzaXRUeXBlSW5zbihBTkVXQVJSQVksICJqYXZhL2xhbmcvT2JqZWN0Iik7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgbXYudmlzaXRJbnNuKERVUCk7CisgICAgICAgICAgICAgICAgaGVscGVyLnB1c2hDb25zdGFudChpKTsKKyAgICAgICAgICAgICAgICB2aXNpdEFuZEF1dG9ib3hCb29sZWFuKGV4cHJlc3Npb24uZ2V0RXhwcmVzc2lvbihpKSk7CisgICAgICAgICAgICAgICAgbXYudmlzaXRJbnNuKEFBU1RPUkUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVzcHJlYWRMaXN0KGV4cHJlc3Npb24uZ2V0RXhwcmVzc2lvbnMoKSwgZmFsc2UpOworICAgICAgICB9CisgICAgICAgIGNyZWF0ZUxpc3RNZXRob2QuY2FsbChtdik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRHU3RyaW5nRXhwcmVzc2lvbihHU3RyaW5nRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisKKyAgICAgICAgbXYudmlzaXRUeXBlSW5zbihORVcsICJvcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvR1N0cmluZ0ltcGwiKTsKKyAgICAgICAgbXYudmlzaXRJbnNuKERVUCk7CisKKyAgICAgICAgaW50IHNpemUgPSBleHByZXNzaW9uLmdldFZhbHVlcygpLnNpemUoKTsKKyAgICAgICAgaGVscGVyLnB1c2hDb25zdGFudChzaXplKTsKKyAgICAgICAgbXYudmlzaXRUeXBlSW5zbihBTkVXQVJSQVksICJqYXZhL2xhbmcvT2JqZWN0Iik7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIG12LnZpc2l0SW5zbihEVVApOworICAgICAgICAgICAgaGVscGVyLnB1c2hDb25zdGFudChpKTsKKyAgICAgICAgICAgIHZpc2l0QW5kQXV0b2JveEJvb2xlYW4oZXhwcmVzc2lvbi5nZXRWYWx1ZShpKSk7CisgICAgICAgICAgICBtdi52aXNpdEluc24oQUFTVE9SRSk7CisgICAgICAgIH0KKworICAgICAgICBMaXN0IHN0cmluZ3MgPSBleHByZXNzaW9uLmdldFN0cmluZ3MoKTsKKyAgICAgICAgc2l6ZSA9IHN0cmluZ3Muc2l6ZSgpOworICAgICAgICBoZWxwZXIucHVzaENvbnN0YW50KHNpemUpOworICAgICAgICBtdi52aXNpdFR5cGVJbnNuKEFORVdBUlJBWSwgImphdmEvbGFuZy9TdHJpbmciKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgbXYudmlzaXRJbnNuKERVUCk7CisgICAgICAgICAgICBoZWxwZXIucHVzaENvbnN0YW50KGkpOworICAgICAgICAgICAgbXYudmlzaXRMZGNJbnNuKCgoQ29uc3RhbnRFeHByZXNzaW9uKSBzdHJpbmdzLmdldChpKSkuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICBtdi52aXNpdEluc24oQUFTVE9SRSk7CisgICAgICAgIH0KKworICAgICAgICBtdi52aXNpdE1ldGhvZEluc24oSU5WT0tFU1BFQ0lBTCwgIm9yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9HU3RyaW5nSW1wbCIsICI8aW5pdD4iLCAiKFtMamF2YS9sYW5nL09iamVjdDtbTGphdmEvbGFuZy9TdHJpbmc7KVYiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOb3RlOiBpZ25vcmUgaXQuIEFubm90YXRpb24gZ2VuZXJhdGlvbiBuZWVkcyB0aGUgY3VycmVudCB2aXNpdG9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZpc2l0QW5ub3RhdGlvbnMoQW5ub3RhdGVkTm9kZSBub2RlKSB7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZpc2l0QW5ub3RhdGlvbnMoQW5ub3RhdGVkTm9kZSB0YXJnZXROb2RlLCBPYmplY3QgdmlzaXRvcikgeworICAgICAgICBNYXAgYW5ub3Rpb25NYXAgPSB0YXJnZXROb2RlLmdldEFubm90YXRpb25zKCk7CisgICAgICAgIGlmIChhbm5vdGlvbk1hcC5pc0VtcHR5KCkpIHJldHVybjsKKworICAgICAgICBJdGVyYXRvciBpdCA9IGFubm90aW9uTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIEFubm90YXRpb25Ob2RlIGFuID0gKEFubm90YXRpb25Ob2RlKSBpdC5uZXh0KCk7CisgICAgICAgICAgICAvL3NraXAgYnVpbHRpbiBwcm9wZXJ0aWVzCisgICAgICAgICAgICBpZiAoYW4uaXNCdWlsdEluKCkpIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKGFuLmhhc1NvdXJjZVJldGVudGlvbigpKSBjb250aW51ZTsKKworICAgICAgICAgICAgQW5ub3RhdGlvblZpc2l0b3IgYXYgPSBnZXRBbm5vdGF0aW9uVmlzaXRvcih0YXJnZXROb2RlLCBhbiwgdmlzaXRvcik7CisgICAgICAgICAgICB2aXNpdEFubm90YXRpb25BdHRyaWJ1dGVzKGFuLCBhdik7CisgICAgICAgICAgICBhdi52aXNpdEVuZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVE9ETyByZW1vdmUgZHVwIGJldHdlZW4gdGhpcyBhbmQgdmlzaXRBbm5vdGF0aW9ucworICAgIHByaXZhdGUgdm9pZCB2aXNpdFBhcmFtZXRlckFubm90YXRpb25zKFBhcmFtZXRlciBwYXJhbWV0ZXIsIGludCBwYXJhbU51bWJlciwgTWV0aG9kVmlzaXRvciBtdikgeworICAgICAgICBNYXAgYW5ub3Rpb25NYXAgPSBwYXJhbWV0ZXIuZ2V0QW5ub3RhdGlvbnMoKTsKKyAgICAgICAgaWYgKGFubm90aW9uTWFwLmlzRW1wdHkoKSkgcmV0dXJuOworCisgICAgICAgIEl0ZXJhdG9yIGl0ID0gYW5ub3Rpb25NYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgeworICAgICAgICAgICAgQW5ub3RhdGlvbk5vZGUgYW4gPSAoQW5ub3RhdGlvbk5vZGUpIGl0Lm5leHQoKTsKKyAgICAgICAgICAgIC8vc2tpcCBidWlsdGluIHByb3BlcnRpZXMKKyAgICAgICAgICAgIGlmIChhbi5pc0J1aWx0SW4oKSkgY29udGludWU7CisgICAgICAgICAgICBpZiAoYW4uaGFzU291cmNlUmV0ZW50aW9uKCkpIGNvbnRpbnVlOworCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYW5ub3RhdGlvbkRlc2NyaXB0b3IgPSBCeXRlY29kZUhlbHBlci5nZXRUeXBlRGVzY3JpcHRpb24oYW4uZ2V0Q2xhc3NOb2RlKCkpOworICAgICAgICAgICAgQW5ub3RhdGlvblZpc2l0b3IgYXYgPSBtdi52aXNpdFBhcmFtZXRlckFubm90YXRpb24ocGFyYW1OdW1iZXIsIGFubm90YXRpb25EZXNjcmlwdG9yLCBhbi5oYXNSdW50aW1lUmV0ZW50aW9uKCkpOworICAgICAgICAgICAgdmlzaXRBbm5vdGF0aW9uQXR0cmlidXRlcyhhbiwgYXYpOworICAgICAgICAgICAgYXYudmlzaXRFbmQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgQW5ub3RhdGlvblZpc2l0b3IgZ2V0QW5ub3RhdGlvblZpc2l0b3IoQW5ub3RhdGVkTm9kZSB0YXJnZXROb2RlLCBBbm5vdGF0aW9uTm9kZSBhbiwgT2JqZWN0IHZpc2l0b3IpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGFubm90YXRpb25EZXNjcmlwdG9yID0gQnl0ZWNvZGVIZWxwZXIuZ2V0VHlwZURlc2NyaXB0aW9uKGFuLmdldENsYXNzTm9kZSgpKTsKKyAgICAgICAgaWYgKHRhcmdldE5vZGUgaW5zdGFuY2VvZiBNZXRob2ROb2RlKSB7CisgICAgICAgICAgICByZXR1cm4gKChNZXRob2RWaXNpdG9yKSB2aXNpdG9yKS52aXNpdEFubm90YXRpb24oYW5ub3RhdGlvbkRlc2NyaXB0b3IsIGFuLmhhc1J1bnRpbWVSZXRlbnRpb24oKSk7CisgICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0Tm9kZSBpbnN0YW5jZW9mIEZpZWxkTm9kZSkgeworICAgICAgICAgICAgcmV0dXJuICgoRmllbGRWaXNpdG9yKSB2aXNpdG9yKS52aXNpdEFubm90YXRpb24oYW5ub3RhdGlvbkRlc2NyaXB0b3IsIGFuLmhhc1J1bnRpbWVSZXRlbnRpb24oKSk7CisgICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0Tm9kZSBpbnN0YW5jZW9mIENsYXNzTm9kZSkgeworICAgICAgICAgICAgcmV0dXJuICgoQ2xhc3NWaXNpdG9yKSB2aXNpdG9yKS52aXNpdEFubm90YXRpb24oYW5ub3RhdGlvbkRlc2NyaXB0b3IsIGFuLmhhc1J1bnRpbWVSZXRlbnRpb24oKSk7CisgICAgICAgIH0KKworICAgICAgICB0aHJvd0V4Y2VwdGlvbigiQ2Fubm90IGNyZWF0ZSBhbiBBbm5vdGF0aW9uVmlzaXRvci4gUGxlYXNlIHJlcG9ydCBHcm9vdnkgYnVnIik7CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGUgdGhlIGFubm90YXRpb24gYXR0cmlidXRlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdmlzaXRBbm5vdGF0aW9uQXR0cmlidXRlcyhBbm5vdGF0aW9uTm9kZSBhbiwgQW5ub3RhdGlvblZpc2l0b3IgYXYpIHsKKyAgICAgICAgTWFwIGNvbnN0YW50QXR0cnMgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICBNYXAgZW51bUF0dHJzID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgTWFwIGF0QXR0cnMgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICBNYXAgYXJyYXlBdHRycyA9IG5ldyBIYXNoTWFwKCk7CisKKyAgICAgICAgSXRlcmF0b3IgbUl0ID0gYW4uZ2V0TWVtYmVycygpLmtleVNldCgpLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChtSXQuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIG1JdC5uZXh0KCk7CisgICAgICAgICAgICBFeHByZXNzaW9uIGV4cHIgPSBhbi5nZXRNZW1iZXIobmFtZSk7CisgICAgICAgICAgICBpZiAoZXhwciBpbnN0YW5jZW9mIEFubm90YXRpb25Db25zdGFudEV4cHJlc3Npb24pIHsKKyAgICAgICAgICAgICAgICBhdEF0dHJzLnB1dChuYW1lLCAoKEFubm90YXRpb25Db25zdGFudEV4cHJlc3Npb24pIGV4cHIpLmdldFZhbHVlKCkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChleHByIGluc3RhbmNlb2YgQ29uc3RhbnRFeHByZXNzaW9uKSB7CisgICAgICAgICAgICAgICAgY29uc3RhbnRBdHRycy5wdXQobmFtZSwgKChDb25zdGFudEV4cHJlc3Npb24pIGV4cHIpLmdldFZhbHVlKCkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChleHByIGluc3RhbmNlb2YgQ2xhc3NFeHByZXNzaW9uKSB7CisgICAgICAgICAgICAgICAgY29uc3RhbnRBdHRycy5wdXQobmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUuZ2V0VHlwZShCeXRlY29kZUhlbHBlci5nZXRUeXBlRGVzY3JpcHRpb24oZXhwci5nZXRUeXBlKCkpKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGV4cHIgaW5zdGFuY2VvZiBQcm9wZXJ0eUV4cHJlc3Npb24pIHsKKyAgICAgICAgICAgICAgICBlbnVtQXR0cnMucHV0KG5hbWUsIGV4cHIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChleHByIGluc3RhbmNlb2YgTGlzdEV4cHJlc3Npb24pIHsKKyAgICAgICAgICAgICAgICBhcnJheUF0dHJzLnB1dChuYW1lLCBleHByKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBjb25zdGFudEF0dHJzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOworICAgICAgICAgICAgYXYudmlzaXQoKFN0cmluZykgZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBlbnVtQXR0cnMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7CisgICAgICAgICAgICBQcm9wZXJ0eUV4cHJlc3Npb24gcHJvcEV4cCA9IChQcm9wZXJ0eUV4cHJlc3Npb24pIGVudHJ5LmdldFZhbHVlKCk7CisgICAgICAgICAgICBhdi52aXNpdEVudW0oKFN0cmluZykgZW50cnkuZ2V0S2V5KCksCisgICAgICAgICAgICAgICAgICAgIEJ5dGVjb2RlSGVscGVyLmdldFR5cGVEZXNjcmlwdGlvbihwcm9wRXhwLmdldE9iamVjdEV4cHJlc3Npb24oKS5nZXRUeXBlKCkpLAorICAgICAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZigoKENvbnN0YW50RXhwcmVzc2lvbikgcHJvcEV4cC5nZXRQcm9wZXJ0eSgpKS5nZXRWYWx1ZSgpKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGF0QXR0cnMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7CisgICAgICAgICAgICBBbm5vdGF0aW9uTm9kZSBhdE5vZGUgPSAoQW5ub3RhdGlvbk5vZGUpIGVudHJ5LmdldFZhbHVlKCk7CisgICAgICAgICAgICBBbm5vdGF0aW9uVmlzaXRvciBhdjIgPSBhdi52aXNpdEFubm90YXRpb24oKFN0cmluZykgZW50cnkuZ2V0S2V5KCksCisgICAgICAgICAgICAgICAgICAgIEJ5dGVjb2RlSGVscGVyLmdldFR5cGVEZXNjcmlwdGlvbihhdE5vZGUuZ2V0Q2xhc3NOb2RlKCkpKTsKKyAgICAgICAgICAgIHZpc2l0QW5ub3RhdGlvbkF0dHJpYnV0ZXMoYXROb2RlLCBhdjIpOworICAgICAgICAgICAgYXYyLnZpc2l0RW5kKCk7CisgICAgICAgIH0KKworICAgICAgICB2aXNpdEFycmF5QXR0cmlidXRlcyhhbiwgYXJyYXlBdHRycywgYXYpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB2aXNpdEFycmF5QXR0cmlidXRlcyhBbm5vdGF0aW9uTm9kZSBhbiwgTWFwIGFycmF5QXR0ciwgQW5ub3RhdGlvblZpc2l0b3IgYXYpIHsKKyAgICAgICAgaWYgKGFycmF5QXR0ci5pc0VtcHR5KCkpIHJldHVybjsKKworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gYXJyYXlBdHRyLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOworICAgICAgICAgICAgU3RyaW5nIGF0dHJOYW1lID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7CisgICAgICAgICAgICBMaXN0RXhwcmVzc2lvbiBsaXN0RXhwciA9IChMaXN0RXhwcmVzc2lvbikgZW50cnkuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgIEFubm90YXRpb25WaXNpdG9yIGF2MiA9IGF2LnZpc2l0QXJyYXkoYXR0ck5hbWUpOworICAgICAgICAgICAgTGlzdCB2YWx1ZXMgPSBsaXN0RXhwci5nZXRFeHByZXNzaW9ucygpOworICAgICAgICAgICAgaWYgKCF2YWx1ZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgRXhwcmVzc2lvbiBleHByID0gKEV4cHJlc3Npb24pIHZhbHVlcy5nZXQoMCk7CisgICAgICAgICAgICAgICAgaW50IGFycmF5RWxlbWVudFR5cGUgPSAtMTsKKyAgICAgICAgICAgICAgICBpZiAoZXhwciBpbnN0YW5jZW9mIEFubm90YXRpb25Db25zdGFudEV4cHJlc3Npb24pIHsKKyAgICAgICAgICAgICAgICAgICAgYXJyYXlFbGVtZW50VHlwZSA9IDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChleHByIGluc3RhbmNlb2YgQ29uc3RhbnRFeHByZXNzaW9uKSB7CisgICAgICAgICAgICAgICAgICAgIGFycmF5RWxlbWVudFR5cGUgPSAyOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXhwciBpbnN0YW5jZW9mIENsYXNzRXhwcmVzc2lvbikgeworICAgICAgICAgICAgICAgICAgICBhcnJheUVsZW1lbnRUeXBlID0gMzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV4cHIgaW5zdGFuY2VvZiBQcm9wZXJ0eUV4cHJlc3Npb24pIHsKKyAgICAgICAgICAgICAgICAgICAgYXJyYXlFbGVtZW50VHlwZSA9IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgZXhwckl0ID0gbGlzdEV4cHIuZ2V0RXhwcmVzc2lvbnMoKS5pdGVyYXRvcigpOyBleHBySXQuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFycmF5RWxlbWVudFR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uTm9kZSBhdEF0dHIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFubm90YXRpb25Ob2RlKSAoKEFubm90YXRpb25Db25zdGFudEV4cHJlc3Npb24pIGV4cHJJdC5uZXh0KCkpLmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvblZpc2l0b3IgYXYzID0gYXYyLnZpc2l0QW5ub3RhdGlvbihudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZWNvZGVIZWxwZXIuZ2V0VHlwZURlc2NyaXB0aW9uKGF0QXR0ci5nZXRDbGFzc05vZGUoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc2l0QW5ub3RhdGlvbkF0dHJpYnV0ZXMoYXRBdHRyLCBhdjMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2My52aXNpdEVuZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Mi52aXNpdChudWxsLCAoKENvbnN0YW50RXhwcmVzc2lvbikgZXhwckl0Lm5leHQoKSkuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXYyLnZpc2l0KG51bGwsIFR5cGUuZ2V0VHlwZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVjb2RlSGVscGVyLmdldFR5cGVEZXNjcmlwdGlvbigoKEV4cHJlc3Npb24pIGV4cHJJdC5uZXh0KCkpLmdldFR5cGUoKSkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUV4cHJlc3Npb24gcHJvcEV4cHIgPSAoUHJvcGVydHlFeHByZXNzaW9uKSBleHBySXQubmV4dCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Mi52aXNpdEVudW0obnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVjb2RlSGVscGVyLmdldFR5cGVEZXNjcmlwdGlvbihwcm9wRXhwci5nZXRPYmplY3RFeHByZXNzaW9uKCkuZ2V0VHlwZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKCgoQ29uc3RhbnRFeHByZXNzaW9uKSBwcm9wRXhwci5nZXRQcm9wZXJ0eSgpKS5nZXRWYWx1ZSgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2Mi52aXNpdEVuZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gSW1wbGVtZW50YXRpb24gbWV0aG9kcworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHByb3RlY3RlZCBib29sZWFuIGFkZElubmVyQ2xhc3MoQ2xhc3NOb2RlIGlubmVyQ2xhc3MpIHsKKyAgICAgICAgaW5uZXJDbGFzcy5zZXRNb2R1bGUoY2xhc3NOb2RlLmdldE1vZHVsZSgpKTsKKyAgICAgICAgcmV0dXJuIGlubmVyQ2xhc3Nlcy5hZGQoaW5uZXJDbGFzcyk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIENsYXNzTm9kZSBjcmVhdGVDbG9zdXJlQ2xhc3MoQ2xvc3VyZUV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgICAgICBDbGFzc05vZGUgb3V0ZXJDbGFzcyA9IGdldE91dGVybW9zdENsYXNzKCk7CisgICAgICAgIFN0cmluZyBuYW1lID0gb3V0ZXJDbGFzcy5nZXROYW1lKCkgKyAiJCIKKyAgICAgICAgICAgICAgICArIGNvbnRleHQuZ2V0TmV4dENsb3N1cmVJbm5lck5hbWUob3V0ZXJDbGFzcywgY2xhc3NOb2RlLCBtZXRob2ROb2RlKTsgLy8gYnIgYWRkZWQgYSBtb3JlIGluZm9tYXRpdmUgbmFtZQorICAgICAgICBib29sZWFuIHN0YXRpY01ldGhvZE9ySW5TdGF0aWNDbGFzcyA9IGlzU3RhdGljTWV0aG9kKCkgfHwgY2xhc3NOb2RlLmlzU3RhdGljQ2xhc3MoKTsKKworICAgICAgICBQYXJhbWV0ZXJbXSBwYXJhbWV0ZXJzID0gZXhwcmVzc2lvbi5nZXRQYXJhbWV0ZXJzKCk7CisgICAgICAgIGlmIChwYXJhbWV0ZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIHBhcmFtZXRlcnMgPSBQYXJhbWV0ZXIuRU1QVFlfQVJSQVk7CisgICAgICAgIH0gZWxzZSBpZiAocGFyYW1ldGVycy5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgLy8gbGV0cyBjcmVhdGUgYSBkZWZhdWx0ICdpdCcgcGFyYW1ldGVyCisgICAgICAgICAgICBwYXJhbWV0ZXJzID0gbmV3IFBhcmFtZXRlcltde25ldyBQYXJhbWV0ZXIoQ2xhc3NIZWxwZXIuT0JKRUNUX1RZUEUsICJpdCIsIENvbnN0YW50RXhwcmVzc2lvbi5OVUxMKX07CisgICAgICAgIH0KKworICAgICAgICBQYXJhbWV0ZXJbXSBsb2NhbFZhcmlhYmxlUGFyYW1zID0gZ2V0Q2xvc3VyZVNoYXJlZFZhcmlhYmxlcyhleHByZXNzaW9uKTsKKyAgICAgICAgcmVtb3ZlSW5pdGlhbFZhbHVlcyhsb2NhbFZhcmlhYmxlUGFyYW1zKTsKKworICAgICAgICBJbm5lckNsYXNzTm9kZSBhbnN3ZXIgPSBuZXcgSW5uZXJDbGFzc05vZGUob3V0ZXJDbGFzcywgbmFtZSwgMCwgQ2xhc3NIZWxwZXIuQ0xPU1VSRV9UWVBFKTsgLy8gY2xvc3VyZXMgYXJlIGxvY2FsIGlubmVycyBhbmQgbm90IHB1YmxpYworICAgICAgICBhbnN3ZXIuc2V0RW5jbG9zaW5nTWV0aG9kKHRoaXMubWV0aG9kTm9kZSk7CisgICAgICAgIGFuc3dlci5zZXRTeW50aGV0aWModHJ1ZSk7CisKKyAgICAgICAgaWYgKHN0YXRpY01ldGhvZE9ySW5TdGF0aWNDbGFzcykgeworICAgICAgICAgICAgYW5zd2VyLnNldFN0YXRpY0NsYXNzKHRydWUpOworICAgICAgICB9CisgICAgICAgIGlmIChpc0luU2NyaXB0Qm9keSgpKSB7CisgICAgICAgICAgICBhbnN3ZXIuc2V0U2NyaXB0Qm9keSh0cnVlKTsKKyAgICAgICAgfQorICAgICAgICBNZXRob2ROb2RlIG1ldGhvZCA9CisgICAgICAgICAgICAgICAgYW5zd2VyLmFkZE1ldGhvZCgiZG9DYWxsIiwgQUNDX1BVQkxJQywgQ2xhc3NIZWxwZXIuT0JKRUNUX1RZUEUsIHBhcmFtZXRlcnMsIENsYXNzTm9kZS5FTVBUWV9BUlJBWSwgZXhwcmVzc2lvbi5nZXRDb2RlKCkpOworICAgICAgICBtZXRob2Quc2V0U291cmNlUG9zaXRpb24oZXhwcmVzc2lvbik7CisKKyAgICAgICAgVmFyaWFibGVTY29wZSB2YXJTY29wZSA9IGV4cHJlc3Npb24uZ2V0VmFyaWFibGVTY29wZSgpOworICAgICAgICBpZiAodmFyU2NvcGUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJNdXN0IGhhdmUgYSBWYXJpYWJsZVNjb3BlIGJ5IG5vdyEgZm9yIGV4cHJlc3Npb246ICIgKyBleHByZXNzaW9uICsgIiBjbGFzczogIiArIG5hbWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWV0aG9kLnNldFZhcmlhYmxlU2NvcGUodmFyU2NvcGUuY29weSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocGFyYW1ldGVycy5sZW5ndGggPiAxCisgICAgICAgICAgICAgICAgfHwgKHBhcmFtZXRlcnMubGVuZ3RoID09IDEKKyAgICAgICAgICAgICAgICAmJiBwYXJhbWV0ZXJzWzBdLmdldFR5cGUoKSAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgcGFyYW1ldGVyc1swXS5nZXRUeXBlKCkgIT0gQ2xhc3NIZWxwZXIuT0JKRUNUX1RZUEUpKSB7CisKKyAgICAgICAgICAgIC8vIGxldHMgYWRkIGEgdHlwZXNhZmUgY2FsbCBtZXRob2QKKyAgICAgICAgICAgIE1ldGhvZE5vZGUgY2FsbCA9IGFuc3dlci5hZGRNZXRob2QoCisgICAgICAgICAgICAgICAgICAgICJjYWxsIiwKKyAgICAgICAgICAgICAgICAgICAgQUNDX1BVQkxJQywKKyAgICAgICAgICAgICAgICAgICAgQ2xhc3NIZWxwZXIuT0JKRUNUX1RZUEUsCisgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgIENsYXNzTm9kZS5FTVBUWV9BUlJBWSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFJldHVyblN0YXRlbWVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTWV0aG9kQ2FsbEV4cHJlc3Npb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYXJpYWJsZUV4cHJlc3Npb24uVEhJU19FWFBSRVNTSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRvQ2FsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXJndW1lbnRMaXN0RXhwcmVzc2lvbihwYXJhbWV0ZXJzKSkpKTsKKyAgICAgICAgICAgIGNhbGwuc2V0U291cmNlUG9zaXRpb24oZXhwcmVzc2lvbik7CisgICAgICAgIH0KKworICAgICAgICAvLyBsZXRzIG1ha2UgdGhlIGNvbnN0cnVjdG9yCisgICAgICAgIEJsb2NrU3RhdGVtZW50IGJsb2NrID0gbmV3IEJsb2NrU3RhdGVtZW50KCk7CisgICAgICAgIGJsb2NrLnNldFNvdXJjZVBvc2l0aW9uKGV4cHJlc3Npb24pOworICAgICAgICBWYXJpYWJsZUV4cHJlc3Npb24gb3V0ZXIgPSBuZXcgVmFyaWFibGVFeHByZXNzaW9uKCJfb3V0ZXJJbnN0YW5jZSIpOworICAgICAgICBvdXRlci5zZXRTb3VyY2VQb3NpdGlvbihleHByZXNzaW9uKTsKKyAgICAgICAgYmxvY2suZ2V0VmFyaWFibGVTY29wZSgpLnB1dFJlZmVyZW5jZWRMb2NhbFZhcmlhYmxlKG91dGVyKTsKKyAgICAgICAgVmFyaWFibGVFeHByZXNzaW9uIHRoaXNPYmplY3QgPSBuZXcgVmFyaWFibGVFeHByZXNzaW9uKCJfdGhpc09iamVjdCIpOworICAgICAgICB0aGlzT2JqZWN0LnNldFNvdXJjZVBvc2l0aW9uKGV4cHJlc3Npb24pOworICAgICAgICBibG9jay5nZXRWYXJpYWJsZVNjb3BlKCkucHV0UmVmZXJlbmNlZExvY2FsVmFyaWFibGUodGhpc09iamVjdCk7CisgICAgICAgIFR1cGxlRXhwcmVzc2lvbiBjb25BcmdzID0gbmV3IFR1cGxlRXhwcmVzc2lvbihvdXRlciwgdGhpc09iamVjdCk7CisgICAgICAgIGJsb2NrLmFkZFN0YXRlbWVudCgKKyAgICAgICAgICAgICAgICBuZXcgRXhwcmVzc2lvblN0YXRlbWVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb25zdHJ1Y3RvckNhbGxFeHByZXNzaW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc05vZGUuU1VQRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbkFyZ3MpKSk7CisKKyAgICAgICAgLy8gbGV0cyBhc3NpZ24gYWxsIHRoZSBwYXJhbWV0ZXIgZmllbGRzIGZyb20gdGhlIG91dGVyIGNvbnRleHQKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbFZhcmlhYmxlUGFyYW1zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBQYXJhbWV0ZXIgcGFyYW0gPSBsb2NhbFZhcmlhYmxlUGFyYW1zW2ldOworICAgICAgICAgICAgU3RyaW5nIHBhcmFtTmFtZSA9IHBhcmFtLmdldE5hbWUoKTsKKyAgICAgICAgICAgIEV4cHJlc3Npb24gaW5pdGlhbFZhbHVlID0gbnVsbDsKKyAgICAgICAgICAgIENsYXNzTm9kZSB0eXBlID0gcGFyYW0uZ2V0VHlwZSgpOworICAgICAgICAgICAgRmllbGROb2RlIHBhcmFtRmllbGQgPSBudWxsOworICAgICAgICAgICAgaWYgKHRydWUpIHsKKyAgICAgICAgICAgICAgICBpbml0aWFsVmFsdWUgPSBuZXcgVmFyaWFibGVFeHByZXNzaW9uKHBhcmFtTmFtZSk7CisgICAgICAgICAgICAgICAgQ2xhc3NOb2RlIHJlYWxUeXBlID0gdHlwZTsKKyAgICAgICAgICAgICAgICB0eXBlID0gQ2xhc3NIZWxwZXIubWFrZVJlZmVyZW5jZSgpOworICAgICAgICAgICAgICAgIHBhcmFtLnNldFR5cGUoQ2xhc3NIZWxwZXIubWFrZVJlZmVyZW5jZSgpKTsKKyAgICAgICAgICAgICAgICBwYXJhbUZpZWxkID0gYW5zd2VyLmFkZEZpZWxkKHBhcmFtTmFtZSwgQUNDX1BSSVZBVEUsIHR5cGUsIGluaXRpYWxWYWx1ZSk7CisgICAgICAgICAgICAgICAgcGFyYW1GaWVsZC5zZXRIb2xkZXIodHJ1ZSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSBWZXJpZmllci5jYXBpdGFsaXplKHBhcmFtTmFtZSk7CisKKyAgICAgICAgICAgICAgICAvLyBsZXRzIGFkZCBhIGdldHRlciAmIHNldHRlcgorICAgICAgICAgICAgICAgIEV4cHJlc3Npb24gZmllbGRFeHAgPSBuZXcgRmllbGRFeHByZXNzaW9uKHBhcmFtRmllbGQpOworICAgICAgICAgICAgICAgIGFuc3dlci5hZGRNZXRob2QoCisgICAgICAgICAgICAgICAgICAgICAgICAiZ2V0IiArIG1ldGhvZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBBQ0NfUFVCTElDLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVhbFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXIuRU1QVFlfQVJSQVksCisgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc05vZGUuRU1QVFlfQVJSQVksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUmV0dXJuU3RhdGVtZW50KGZpZWxkRXhwKSk7CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgIGFuc3dlci5hZGRNZXRob2QoCisgICAgICAgICAgICAgICAgICAgICJzZXQiICsgbWV0aG9kTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgQUNDX1BVQkxJQywKKyAgICAgICAgICAgICAgICAgICAgInZvaWQiLAorICAgICAgICAgICAgICAgICAgICBuZXcgUGFyYW1ldGVyW10geyBuZXcgUGFyYW1ldGVyKHJlYWxUeXBlLCAiX192YWx1ZSIpIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBFeHByZXNzaW9uU3RhdGVtZW50KAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJpbmFyeUV4cHJlc3Npb24oZXhwcmVzc2lvbiwgVG9rZW4ubmV3U3ltYm9sKFR5cGVzLkVRVUFMLCAwLCAwKSwgbmV3IFZhcmlhYmxlRXhwcmVzc2lvbigiX192YWx1ZSIpKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFBhcmFtZXRlcltdIHBhcmFtcyA9IG5ldyBQYXJhbWV0ZXJbMiArIGxvY2FsVmFyaWFibGVQYXJhbXMubGVuZ3RoXTsKKyAgICAgICAgcGFyYW1zWzBdID0gbmV3IFBhcmFtZXRlcihDbGFzc0hlbHBlci5PQkpFQ1RfVFlQRSwgIl9vdXRlckluc3RhbmNlIik7CisgICAgICAgIHBhcmFtc1sxXSA9IG5ldyBQYXJhbWV0ZXIoQ2xhc3NIZWxwZXIuT0JKRUNUX1RZUEUsICJfdGhpc09iamVjdCIpOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGxvY2FsVmFyaWFibGVQYXJhbXMsIDAsIHBhcmFtcywgMiwgbG9jYWxWYXJpYWJsZVBhcmFtcy5sZW5ndGgpOworCisgICAgICAgIEFTVE5vZGUgc24gPSBhbnN3ZXIuYWRkQ29uc3RydWN0b3IoQUNDX1BVQkxJQywgcGFyYW1zLCBDbGFzc05vZGUuRU1QVFlfQVJSQVksIGJsb2NrKTsKKyAgICAgICAgc24uc2V0U291cmNlUG9zaXRpb24oZXhwcmVzc2lvbik7CisgICAgICAgIHJldHVybiBhbnN3ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogdGhpcyBtZXRob2QgaXMgY2FsbGVkIGZvciBsb2NhbCB2YXJpYWJsZXMgc2hhcmVkIGJldHdlZW4gc2NvcGVzLgorICAgICAqIFRoZXNlIHZhcmlhYmxlcyBtdXN0IG5vdCBoYXZlIGluaXQgdmFsdWVzIGJlY2F1c2UgdGhlc2Ugd291bGQKKyAgICAgKiB0aGVuIGluIGxhdGVyIHN0ZXBzIGJlIHVzZWQgdG8gY3JlYXRlIG11bHRpcGxlIHZlcnNpb25zIG9mIHRoZQorICAgICAqIHNhbWUgbWV0aG9kLCBpbiB0aGlzIGNhc2UgdGhlIGNvbnN0cnVjdG9yLiBBIGNsb3N1cmUgc2hvdWxkIG5vdAorICAgICAqIGhhdmUgbW9yZSB0aGFuIG9uZSBjb25zdHJ1Y3RvciEKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVtb3ZlSW5pdGlhbFZhbHVlcyhQYXJhbWV0ZXJbXSBwYXJhbXMpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChwYXJhbXNbaV0uaGFzSW5pdGlhbEV4cHJlc3Npb24oKSkgeworICAgICAgICAgICAgICAgIHBhcmFtc1tpXSA9IG5ldyBQYXJhbWV0ZXIocGFyYW1zW2ldLmdldFR5cGUoKSwgcGFyYW1zW2ldLmdldE5hbWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgUGFyYW1ldGVyW10gZ2V0Q2xvc3VyZVNoYXJlZFZhcmlhYmxlcyhDbG9zdXJlRXhwcmVzc2lvbiBjZSkgeworICAgICAgICBWYXJpYWJsZVNjb3BlIHNjb3BlID0gY2UuZ2V0VmFyaWFibGVTY29wZSgpOworICAgICAgICBQYXJhbWV0ZXJbXSByZXQgPSBuZXcgUGFyYW1ldGVyW3Njb3BlLmdldFJlZmVyZW5jZWRMb2NhbFZhcmlhYmxlc0NvdW50KCldOworICAgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzY29wZS5nZXRSZWZlcmVuY2VkTG9jYWxWYXJpYWJsZXNJdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LlZhcmlhYmxlIGVsZW1lbnQgPSAob3JnLmNvZGVoYXVzLmdyb292eS5hc3QuVmFyaWFibGUpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgUGFyYW1ldGVyIHAgPSBuZXcgUGFyYW1ldGVyKGVsZW1lbnQuZ2V0VHlwZSgpLCBlbGVtZW50LmdldE5hbWUoKSk7CisgICAgICAgICAgICByZXRbaW5kZXhdID0gcDsKKyAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQ2xhc3NOb2RlIGdldE91dGVybW9zdENsYXNzKCkgeworICAgICAgICBpZiAob3V0ZXJtb3N0Q2xhc3MgPT0gbnVsbCkgeworICAgICAgICAgICAgb3V0ZXJtb3N0Q2xhc3MgPSBjbGFzc05vZGU7CisgICAgICAgICAgICB3aGlsZSAob3V0ZXJtb3N0Q2xhc3MgaW5zdGFuY2VvZiBJbm5lckNsYXNzTm9kZSkgeworICAgICAgICAgICAgICAgIG91dGVybW9zdENsYXNzID0gb3V0ZXJtb3N0Q2xhc3MuZ2V0T3V0ZXJDbGFzcygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBvdXRlcm1vc3RDbGFzczsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBkb0NvbnZlcnRBbmRDYXN0KENsYXNzTm9kZSB0eXBlKSB7CisgICAgICAgIGRvQ29udmVydEFuZENhc3QodHlwZSwgZmFsc2UpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGRvQ29udmVydEFuZENhc3QoQ2xhc3NOb2RlIHR5cGUsIGJvb2xlYW4gY29lcmNlKSB7CisgICAgICAgIGlmICh0eXBlID09IENsYXNzSGVscGVyLk9CSkVDVF9UWVBFKSByZXR1cm47CisgICAgICAgIGlmIChpc1ZhbGlkVHlwZUZvckNhc3QodHlwZSkpIHsKKyAgICAgICAgICAgIHZpc2l0Q2xhc3NFeHByZXNzaW9uKG5ldyBDbGFzc0V4cHJlc3Npb24odHlwZSkpOworICAgICAgICAgICAgaWYgKGNvZXJjZSkgeworICAgICAgICAgICAgICAgIGFzVHlwZU1ldGhvZC5jYWxsKG12KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY2FzdFRvVHlwZU1ldGhvZC5jYWxsKG12KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBoZWxwZXIuZG9DYXN0KHR5cGUpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGV2YWx1YXRlTG9naWNhbE9yRXhwcmVzc2lvbihCaW5hcnlFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKyAgICAgICAgdmlzaXRCb29sZWFuRXhwcmVzc2lvbihuZXcgQm9vbGVhbkV4cHJlc3Npb24oZXhwcmVzc2lvbi5nZXRMZWZ0RXhwcmVzc2lvbigpKSk7CisgICAgICAgIExhYmVsIGwwID0gbmV3IExhYmVsKCk7CisgICAgICAgIExhYmVsIGwyID0gbmV3IExhYmVsKCk7CisgICAgICAgIG12LnZpc2l0SnVtcEluc24oSUZFUSwgbDApOworCisgICAgICAgIG12LnZpc2l0TGFiZWwobDIpOworCisgICAgICAgIHZpc2l0Q29uc3RhbnRFeHByZXNzaW9uKENvbnN0YW50RXhwcmVzc2lvbi5UUlVFKTsKKworICAgICAgICBMYWJlbCBsMSA9IG5ldyBMYWJlbCgpOworICAgICAgICBtdi52aXNpdEp1bXBJbnNuKEdPVE8sIGwxKTsKKyAgICAgICAgbXYudmlzaXRMYWJlbChsMCk7CisKKyAgICAgICAgdmlzaXRCb29sZWFuRXhwcmVzc2lvbihuZXcgQm9vbGVhbkV4cHJlc3Npb24oZXhwcmVzc2lvbi5nZXRSaWdodEV4cHJlc3Npb24oKSkpOworCisgICAgICAgIG12LnZpc2l0SnVtcEluc24oSUZORSwgbDIpOworCisgICAgICAgIHZpc2l0Q29uc3RhbnRFeHByZXNzaW9uKENvbnN0YW50RXhwcmVzc2lvbi5GQUxTRSk7CisgICAgICAgIG12LnZpc2l0TGFiZWwobDEpOworICAgIH0KKworICAgIC8vIHRvZG86IG9wdGltaXphdGlvbjogY2hhbmdlIHRvIHJldHVybiBwcmltaXRpdmUgYm9vbGVhbi4gbmVlZCB0byBhZGp1c3QgdGhlIEJpbmFyeUV4cHJlc3Npb24gYW5kIGlzQ29tcGFyaXNvbkV4cHJlc3Npb24gZm9yCisgICAgLy8gY29uc2lzdGFuY3kuCisgICAgcHJvdGVjdGVkIHZvaWQgZXZhbHVhdGVMb2dpY2FsQW5kRXhwcmVzc2lvbihCaW5hcnlFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKyAgICAgICAgdmlzaXRCb29sZWFuRXhwcmVzc2lvbihuZXcgQm9vbGVhbkV4cHJlc3Npb24oZXhwcmVzc2lvbi5nZXRMZWZ0RXhwcmVzc2lvbigpKSk7CisgICAgICAgIExhYmVsIGwwID0gbmV3IExhYmVsKCk7CisgICAgICAgIG12LnZpc2l0SnVtcEluc24oSUZFUSwgbDApOworCisgICAgICAgIHZpc2l0Qm9vbGVhbkV4cHJlc3Npb24obmV3IEJvb2xlYW5FeHByZXNzaW9uKGV4cHJlc3Npb24uZ2V0UmlnaHRFeHByZXNzaW9uKCkpKTsKKworICAgICAgICBtdi52aXNpdEp1bXBJbnNuKElGRVEsIGwwKTsKKworICAgICAgICB2aXNpdENvbnN0YW50RXhwcmVzc2lvbihDb25zdGFudEV4cHJlc3Npb24uVFJVRSk7CisKKyAgICAgICAgTGFiZWwgbDEgPSBuZXcgTGFiZWwoKTsKKyAgICAgICAgbXYudmlzaXRKdW1wSW5zbihHT1RPLCBsMSk7CisgICAgICAgIG12LnZpc2l0TGFiZWwobDApOworCisgICAgICAgIHZpc2l0Q29uc3RhbnRFeHByZXNzaW9uKENvbnN0YW50RXhwcmVzc2lvbi5GQUxTRSk7CisKKyAgICAgICAgbXYudmlzaXRMYWJlbChsMSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgZXZhbHVhdGVCaW5hcnlFeHByZXNzaW9uKFN0cmluZyBtZXRob2QsIEJpbmFyeUV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgICAgICBtYWtlQ2FsbCgKKyAgICAgICAgICAgICAgICBleHByZXNzaW9uLmdldExlZnRFeHByZXNzaW9uKCksCisgICAgICAgICAgICAgICAgbmV3IENvbnN0YW50RXhwcmVzc2lvbihtZXRob2QpLAorICAgICAgICAgICAgICAgIG5ldyBBcmd1bWVudExpc3RFeHByZXNzaW9uKGV4cHJlc3Npb24uZ2V0UmlnaHRFeHByZXNzaW9uKCkpLAorICAgICAgICAgICAgICAgIGludm9rZU1ldGhvZCwgZmFsc2UsIGZhbHNlLCBmYWxzZQorICAgICAgICApOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGV2YWx1YXRlQ29tcGFyZVRvKEJpbmFyeUV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgICAgICBFeHByZXNzaW9uIGxlZnRFeHByZXNzaW9uID0gZXhwcmVzc2lvbi5nZXRMZWZ0RXhwcmVzc2lvbigpOworICAgICAgICBsZWZ0RXhwcmVzc2lvbi52aXNpdCh0aGlzKTsKKyAgICAgICAgaWYgKGlzQ29tcGFyaXNvbkV4cHJlc3Npb24obGVmdEV4cHJlc3Npb24pKSB7CisgICAgICAgICAgICBoZWxwZXIuYm94Qm9vbGVhbigpOworICAgICAgICB9CisKKyAgICAgICAgLy8gaWYgdGhlIHJpZ2h0IGhhbmQgc2lkZSBpcyBhIGJvb2xlYW4gZXhwcmVzc2lvbiwgd2UgbmVlZCB0byBhdXRvYm94CisgICAgICAgIEV4cHJlc3Npb24gcmlnaHRFeHByZXNzaW9uID0gZXhwcmVzc2lvbi5nZXRSaWdodEV4cHJlc3Npb24oKTsKKyAgICAgICAgcmlnaHRFeHByZXNzaW9uLnZpc2l0KHRoaXMpOworICAgICAgICBpZiAoaXNDb21wYXJpc29uRXhwcmVzc2lvbihyaWdodEV4cHJlc3Npb24pKSB7CisgICAgICAgICAgICBoZWxwZXIuYm94Qm9vbGVhbigpOworICAgICAgICB9CisgICAgICAgIGNvbXBhcmVUb01ldGhvZC5jYWxsKG12KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBldmFsdWF0ZUJpbmFyeUV4cHJlc3Npb25XaXRoQXNzaWdubWVudChTdHJpbmcgbWV0aG9kLCBCaW5hcnlFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKyAgICAgICAgRXhwcmVzc2lvbiBsZWZ0RXhwcmVzc2lvbiA9IGV4cHJlc3Npb24uZ2V0TGVmdEV4cHJlc3Npb24oKTsKKyAgICAgICAgaWYgKGxlZnRFeHByZXNzaW9uIGluc3RhbmNlb2YgQmluYXJ5RXhwcmVzc2lvbikgeworICAgICAgICAgICAgQmluYXJ5RXhwcmVzc2lvbiBsZWZ0QmluRXhwciA9IChCaW5hcnlFeHByZXNzaW9uKSBsZWZ0RXhwcmVzc2lvbjsKKyAgICAgICAgICAgIGlmIChsZWZ0QmluRXhwci5nZXRPcGVyYXRpb24oKS5nZXRUeXBlKCkgPT0gVHlwZXMuTEVGVF9TUVVBUkVfQlJBQ0tFVCkgeworICAgICAgICAgICAgICAgIC8vIGxldHMgcmVwbGFjZSB0aGlzIGFzc2lnbm1lbnQgdG8gYSBzdWJzY3JpcHQgb3BlcmF0b3Igd2l0aCBhCisgICAgICAgICAgICAgICAgLy8gbWV0aG9kIGNhbGwKKyAgICAgICAgICAgICAgICAvLyBlLmcuIHhbNV0gKz0gMTAKKyAgICAgICAgICAgICAgICAvLyAtPiAoeCwgW10sIDUpLCA9LCB4WzVdICsgMTAKKyAgICAgICAgICAgICAgICAvLyAtPiBtZXRob2RDYWxsKHgsICJwdXRBdCIsIFs1LCBtZXRob2RDYWxsKHhbNV0sICJwbHVzIiwgMTApXSkKKworICAgICAgICAgICAgICAgIE1ldGhvZENhbGxFeHByZXNzaW9uIG1ldGhvZENhbGwgPQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE1ldGhvZENhbGxFeHByZXNzaW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uLmdldExlZnRFeHByZXNzaW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFyZ3VtZW50TGlzdEV4cHJlc3Npb24oZXhwcmVzc2lvbi5nZXRSaWdodEV4cHJlc3Npb24oKSkpOworCisgICAgICAgICAgICAgICAgRXhwcmVzc2lvbiBzYWZlSW5kZXhFeHByID0gY3JlYXRlUmV1c2FibGVFeHByZXNzaW9uKGxlZnRCaW5FeHByLmdldFJpZ2h0RXhwcmVzc2lvbigpKTsKKworICAgICAgICAgICAgICAgIHZpc2l0TWV0aG9kQ2FsbEV4cHJlc3Npb24oCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTWV0aG9kQ2FsbEV4cHJlc3Npb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRCaW5FeHByLmdldExlZnRFeHByZXNzaW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwdXRBdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBcmd1bWVudExpc3RFeHByZXNzaW9uKHNhZmVJbmRleEV4cHIsIG1ldGhvZENhbGwpKSk7CisgICAgICAgICAgICAgICAgLy9jdi52aXNpdEluc24oUE9QKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBldmFsdWF0ZUJpbmFyeUV4cHJlc3Npb24obWV0aG9kLCBleHByZXNzaW9uKTsKKworICAgICAgICAvLyBiciB0byBsZWF2ZSBhIGNvcHkgb2YgcnZhbHVlIG9uIHRoZSBzdGFjay4gc2VlIGFsc28gaXNQb3BSZXF1aXJlZCgpCisgICAgICAgIG12LnZpc2l0SW5zbihEVVApOworCisgICAgICAgIGxlZnRIYW5kRXhwcmVzc2lvbiA9IHRydWU7CisgICAgICAgIGV2YWx1YXRlRXhwcmVzc2lvbihsZWZ0RXhwcmVzc2lvbik7CisgICAgICAgIGxlZnRIYW5kRXhwcmVzc2lvbiA9IGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBldmFsdWF0ZUJpbmFyeUV4cHJlc3Npb24oTWV0aG9kQ2FsbGVyIGNvbXBhcmVNZXRob2QsIEJpbmFyeUV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgICAgICBFeHByZXNzaW9uIGxlZnRFeHAgPSBleHByZXNzaW9uLmdldExlZnRFeHByZXNzaW9uKCk7CisgICAgICAgIEV4cHJlc3Npb24gcmlnaHRFeHAgPSBleHByZXNzaW9uLmdldFJpZ2h0RXhwcmVzc2lvbigpOworICAgICAgICBsb2FkKGxlZnRFeHApOworICAgICAgICBsb2FkKHJpZ2h0RXhwKTsKKyAgICAgICAgY29tcGFyZU1ldGhvZC5jYWxsKG12KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBldmFsdWF0ZUVxdWFsKEJpbmFyeUV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgICAgICBFeHByZXNzaW9uIGxlZnRFeHByZXNzaW9uID0gZXhwcmVzc2lvbi5nZXRMZWZ0RXhwcmVzc2lvbigpOworICAgICAgICBpZiAobGVmdEV4cHJlc3Npb24gaW5zdGFuY2VvZiBCaW5hcnlFeHByZXNzaW9uKSB7CisgICAgICAgICAgICBCaW5hcnlFeHByZXNzaW9uIGxlZnRCaW5FeHByID0gKEJpbmFyeUV4cHJlc3Npb24pIGxlZnRFeHByZXNzaW9uOworICAgICAgICAgICAgaWYgKGxlZnRCaW5FeHByLmdldE9wZXJhdGlvbigpLmdldFR5cGUoKSA9PSBUeXBlcy5MRUZUX1NRVUFSRV9CUkFDS0VUKSB7CisgICAgICAgICAgICAgICAgLy8gbGV0cyByZXBsYWNlIHRoaXMgYXNzaWdubWVudCB0byBhIHN1YnNjcmlwdCBvcGVyYXRvciB3aXRoIGEKKyAgICAgICAgICAgICAgICAvLyBtZXRob2QgY2FsbAorICAgICAgICAgICAgICAgIC8vIGUuZy4geFs1XSA9IDEwCisgICAgICAgICAgICAgICAgLy8gLT4gKHgsIFtdLCA1KSwgPSwgMTAKKyAgICAgICAgICAgICAgICAvLyAtPiBtZXRob2RDYWxsKHgsICJwdXRBdCIsIFs1LCAxMF0pCisKKyAgICAgICAgICAgICAgICB2aXNpdE1ldGhvZENhbGxFeHByZXNzaW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE1ldGhvZENhbGxFeHByZXNzaW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0QmluRXhwci5nZXRMZWZ0RXhwcmVzc2lvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHV0QXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXJndW1lbnRMaXN0RXhwcmVzc2lvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRXhwcmVzc2lvbltde2xlZnRCaW5FeHByLmdldFJpZ2h0RXhwcmVzc2lvbigpLCBleHByZXNzaW9uLmdldFJpZ2h0RXhwcmVzc2lvbigpfSkpKTsKKyAgICAgICAgICAgICAgICAvLyBjdi52aXNpdEluc24oUE9QKTsgLy90aGlzIGlzIHJlYWx0ZWQgdG8gaXNQb3BSZXF1aXJlZCgpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gbGV0cyBldmFsdWF0ZSB0aGUgUkhTIHRoZW4gaG9wZWZ1bGx5IHRoZSBMSFMgd2lsbCBiZSBhIGZpZWxkCisgICAgICAgIEV4cHJlc3Npb24gcmlnaHRFeHByZXNzaW9uID0gZXhwcmVzc2lvbi5nZXRSaWdodEV4cHJlc3Npb24oKTsKKyAgICAgICAgQ2xhc3NOb2RlIHR5cGUgPSBnZXRMSFNUeXBlKGxlZnRFeHByZXNzaW9uKTsKKyAgICAgICAgLy8gbGV0cyBub3QgY2FzdCBmb3IgcHJpbWl0aXZlIHR5cGVzIGFzIHdlIGhhbmRsZSB0aGVzZSBpbiBmaWVsZCBzZXR0aW5nIGV0YworICAgICAgICBpZiAoQ2xhc3NIZWxwZXIuaXNQcmltaXRpdmVUeXBlKHR5cGUpKSB7CisgICAgICAgICAgICB2aXNpdEFuZEF1dG9ib3hCb29sZWFuKHJpZ2h0RXhwcmVzc2lvbik7CisgICAgICAgIH0gZWxzZSBpZiAodHlwZSAhPSBDbGFzc0hlbHBlci5PQkpFQ1RfVFlQRSkgeworICAgICAgICAgICAgdmlzaXRDYXN0RXhwcmVzc2lvbihuZXcgQ2FzdEV4cHJlc3Npb24odHlwZSwgcmlnaHRFeHByZXNzaW9uKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2aXNpdEFuZEF1dG9ib3hCb29sZWFuKHJpZ2h0RXhwcmVzc2lvbik7CisgICAgICAgIH0KKworICAgICAgICBtdi52aXNpdEluc24oRFVQKTsgIC8vIHRvIGxlYXZlIGEgY29weSBvZiB0aGUgcmlnaHRleHByZXNzaW9uIHZhbHVlIG9uIHRoZSBzdGFjayBhZnRlciB0aGUgYXNzaWdubWVudC4KKyAgICAgICAgbGVmdEhhbmRFeHByZXNzaW9uID0gdHJ1ZTsKKyAgICAgICAgbGVmdEV4cHJlc3Npb24udmlzaXQodGhpcyk7CisgICAgICAgIGxlZnRIYW5kRXhwcmVzc2lvbiA9IGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlZHVjZXMgdGhlIHR5cGUgbmFtZSByZXF1aXJlZCBmb3Igc29tZSBjYXN0aW5nCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBnaXZlbiAoTEhTKSBleHByZXNzaW9uIG9yIG51bGwgaWYgaXQgaXMgamF2YS5sYW5nLk9iamVjdCBvciBpdCBjYW5ub3QgYmUgZGVkdWNlZAorICAgICAqLworICAgIHByb3RlY3RlZCBDbGFzc05vZGUgZ2V0TEhTVHlwZShFeHByZXNzaW9uIGxlZnRFeHByZXNzaW9uKSB7CisgICAgICAgIGlmIChsZWZ0RXhwcmVzc2lvbiBpbnN0YW5jZW9mIFZhcmlhYmxlRXhwcmVzc2lvbikgeworICAgICAgICAgICAgVmFyaWFibGVFeHByZXNzaW9uIHZhckV4cCA9IChWYXJpYWJsZUV4cHJlc3Npb24pIGxlZnRFeHByZXNzaW9uOworICAgICAgICAgICAgQ2xhc3NOb2RlIHR5cGUgPSB2YXJFeHAuZ2V0VHlwZSgpOworICAgICAgICAgICAgaWYgKGlzVmFsaWRUeXBlRm9yQ2FzdCh0eXBlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0eXBlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nIHZhcmlhYmxlTmFtZSA9IHZhckV4cC5nZXROYW1lKCk7CisgICAgICAgICAgICBWYXJpYWJsZSB2YXJpYWJsZSA9IGNvbXBpbGVTdGFjay5nZXRWYXJpYWJsZSh2YXJpYWJsZU5hbWUsIGZhbHNlKTsKKyAgICAgICAgICAgIGlmICh2YXJpYWJsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKHZhcmlhYmxlLmlzSG9sZGVyKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZS5pc1Byb3BlcnR5KCkpIHJldHVybiB2YXJpYWJsZS5nZXRUeXBlKCk7CisgICAgICAgICAgICAgICAgdHlwZSA9IHZhcmlhYmxlLmdldFR5cGUoKTsKKyAgICAgICAgICAgICAgICBpZiAoaXNWYWxpZFR5cGVGb3JDYXN0KHR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgRmllbGROb2RlIGZpZWxkID0gY2xhc3NOb2RlLmdldEZpZWxkKHZhcmlhYmxlTmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKGZpZWxkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZmllbGQgPSBjbGFzc05vZGUuZ2V0T3V0ZXJGaWVsZCh2YXJpYWJsZU5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZmllbGQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0eXBlID0gZmllbGQuZ2V0VHlwZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZpZWxkLmlzSG9sZGVyKCkgJiYgaXNWYWxpZFR5cGVGb3JDYXN0KHR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChsZWZ0RXhwcmVzc2lvbiBpbnN0YW5jZW9mIEZpZWxkRXhwcmVzc2lvbikgeworICAgICAgICAgICAgRmllbGRFeHByZXNzaW9uIGZpZWxkRXhwID0gKEZpZWxkRXhwcmVzc2lvbikgbGVmdEV4cHJlc3Npb247CisgICAgICAgICAgICBDbGFzc05vZGUgdHlwZSA9IGZpZWxkRXhwLmdldFR5cGUoKTsKKyAgICAgICAgICAgIGlmIChpc1ZhbGlkVHlwZUZvckNhc3QodHlwZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHlwZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQ2xhc3NIZWxwZXIuRFlOQU1JQ19UWVBFOworICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIGlzVmFsaWRUeXBlRm9yQ2FzdChDbGFzc05vZGUgdHlwZSkgeworICAgICAgICByZXR1cm4gdHlwZSAhPSBDbGFzc0hlbHBlci5EWU5BTUlDX1RZUEUgJiYKKyAgICAgICAgICAgICAgICB0eXBlICE9IENsYXNzSGVscGVyLlJFRkVSRU5DRV9UWVBFOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHZpc2l0QW5kQXV0b2JveEJvb2xlYW4oRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisgICAgICAgIGV4cHJlc3Npb24udmlzaXQodGhpcyk7CisKKyAgICAgICAgaWYgKGlzQ29tcGFyaXNvbkV4cHJlc3Npb24oZXhwcmVzc2lvbikpIHsKKyAgICAgICAgICAgIGhlbHBlci5ib3hCb29sZWFuKCk7IC8vIGNvbnZlcnQgYm9vbGVhbiB0byBCb29sZWFuCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZXhlY01ldGhvZEFuZFN0b3JlRm9yU3Vic2NyaXB0T3BlcmF0b3IoU3RyaW5nIG1ldGhvZCwgRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisgICAgICAgIC8vIGV4ZWN1dGUgbWV0aG9kCisgICAgICAgIG1ha2VDYWxsKAorICAgICAgICAgICAgICAgIGV4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgbmV3IENvbnN0YW50RXhwcmVzc2lvbihtZXRob2QpLAorICAgICAgICAgICAgICAgIE1ldGhvZENhbGxFeHByZXNzaW9uLk5PX0FSR1VNRU5UUywKKyAgICAgICAgICAgICAgICBpbnZva2VNZXRob2QsZmFsc2UsZmFsc2UsZmFsc2UpOworICAgICAgICAKKyAgICAgICAgLy8gd2UgbmVlZCBzcGVjaWFsIGNvZGUgZm9yIGFycmF5cyB0byBzdG9yZSB0aGUgcmVzdWx0CisgICAgICAgIGJvb2xlYW4gc2V0UmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBCaW5hcnlFeHByZXNzaW9uKSB7CisgICAgICAgICAgICBCaW5hcnlFeHByZXNzaW9uIGJlID0gKEJpbmFyeUV4cHJlc3Npb24pIGV4cHJlc3Npb247CisgICAgICAgICAgICBpZiAoYmUuZ2V0T3BlcmF0aW9uKCkuZ2V0VHlwZSgpPT1UeXBlcy5MRUZUX1NRVUFSRV9CUkFDS0VUKSB7CisgICAgICAgICAgICAgICAgbXYudmlzaXRJbnNuKERVUCk7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHJlc3VsdElkeCA9IGNvbXBpbGVTdGFjay5kZWZpbmVUZW1wb3JhcnlWYXJpYWJsZSgicG9zdGZpeF8iICsgbWV0aG9kLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBCeXRlY29kZUV4cHJlc3Npb24gcmVzdWx0ID0gbmV3IEJ5dGVjb2RlRXhwcmVzc2lvbigpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoR3Jvb3Z5Q29kZVZpc2l0b3IgdmlzaXRvcikgeworICAgICAgICAgICAgICAgICAgICAgICAgbXYudmlzaXRWYXJJbnNuKEFMT0FELCByZXN1bHRJZHgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBUdXBsZUV4cHJlc3Npb24gYXJncyA9IG5ldyBBcmd1bWVudExpc3RFeHByZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgYXJncy5hZGRFeHByZXNzaW9uKGJlLmdldFJpZ2h0RXhwcmVzc2lvbigpKTsKKyAgICAgICAgICAgICAgICBhcmdzLmFkZEV4cHJlc3Npb24ocmVzdWx0KTsKKyAgICAgICAgICAgICAgICBtYWtlQ2FsbCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGJlLmdldExlZnRFeHByZXNzaW9uKCksIG5ldyBDb25zdGFudEV4cHJlc3Npb24oInB1dEF0IiksCisgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgaW52b2tlTWV0aG9kLGZhbHNlLGZhbHNlLGZhbHNlKTsKKyAgICAgICAgICAgICAgICBtdi52aXNpdEluc24oUE9QKTsKKyAgICAgICAgICAgICAgICBzZXRSZXN1bHQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIH0gZWxzZSBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIENvbnN0YW50RXhwcmVzc2lvbikgeworICAgICAgICAgICAgc2V0UmVzdWx0ID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChzZXRSZXN1bHQpIHsKKyAgICAgICAgICAgIC8vIHdlIHdhbnQgdG8ga2VlcCBhIHZhbHVlIG9uIHN0YWNrLCBzbyB3ZSBoYXZlIHRvIERVUCBoZXJlCisgICAgICAgICAgICBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIFZhcmlhYmxlRXhwcmVzc2lvbiB8fAorICAgICAgICAgICAgICAgIGV4cHJlc3Npb24gaW5zdGFuY2VvZiBQcm9wZXJ0eUV4cHJlc3Npb24pIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG12LnZpc2l0SW5zbihEVVApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGVmdEhhbmRFeHByZXNzaW9uID0gdHJ1ZTsKKyAgICAgICAgICAgIGV4cHJlc3Npb24udmlzaXQodGhpcyk7CisgICAgICAgICAgICBsZWZ0SGFuZEV4cHJlc3Npb24gPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgdm9pZCBldmFsdWF0ZVByZWZpeE1ldGhvZChTdHJpbmcgbWV0aG9kLCBFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKyAgICAgICAgLy8gZXhlY3V0ZSBNZXRob2QKKyAgICAgICAgZXhlY01ldGhvZEFuZFN0b3JlRm9yU3Vic2NyaXB0T3BlcmF0b3IobWV0aG9kLGV4cHJlc3Npb24pOworCisgICAgICAgIC8vIG5ldyB2YWx1ZSBpcyBhbHJlYWR5IG9uIHN0YWNrLCBzbyBub3RoaW5nIHRvIGRvIGhlcmUKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBldmFsdWF0ZVBvc3RmaXhNZXRob2QoU3RyaW5nIG1ldGhvZCwgRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisgICAgICAgIC8vIGxvYWQgCisgICAgICAgIGV4cHJlc3Npb24udmlzaXQodGhpcyk7CisKKyAgICAgICAgLy8gc2F2ZSB2YWx1ZSBmb3IgbGF0ZXIKKyAgICAgICAgaW50IHRlbXBJZHggPSBjb21waWxlU3RhY2suZGVmaW5lVGVtcG9yYXJ5VmFyaWFibGUoInBvc3RmaXhfIiArIG1ldGhvZCwgdHJ1ZSk7CisKKyAgICAgICAgLy8gZXhlY3V0ZSBNZXRob2QKKyAgICAgICAgZXhlY01ldGhvZEFuZFN0b3JlRm9yU3Vic2NyaXB0T3BlcmF0b3IobWV0aG9kLGV4cHJlc3Npb24pOworICAgICAgICAvLyByZW1vdmUgdGhlIHJlc3VsdCBvZiB0aGUgbWV0aG9kIGNhbGwKKyAgICAgICAgbXYudmlzaXRJbnNuKFBPUCk7CisgICAgICAgIAorICAgICAgICAvL3JlbG9hZCBzYXZlZCB2YWx1ZQorICAgICAgICBtdi52aXNpdFZhckluc24oQUxPQUQsIHRlbXBJZHgpOworICAgICAgICBjb21waWxlU3RhY2sucmVtb3ZlVmFyKHRlbXBJZHgpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGV2YWx1YXRlSW5zdGFuY2VvZihCaW5hcnlFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKyAgICAgICAgdmlzaXRBbmRBdXRvYm94Qm9vbGVhbihleHByZXNzaW9uLmdldExlZnRFeHByZXNzaW9uKCkpOworICAgICAgICBFeHByZXNzaW9uIHJpZ2h0RXhwID0gZXhwcmVzc2lvbi5nZXRSaWdodEV4cHJlc3Npb24oKTsKKyAgICAgICAgQ2xhc3NOb2RlIGNsYXNzVHlwZSA9IENsYXNzSGVscGVyLkRZTkFNSUNfVFlQRTsKKyAgICAgICAgaWYgKHJpZ2h0RXhwIGluc3RhbmNlb2YgQ2xhc3NFeHByZXNzaW9uKSB7CisgICAgICAgICAgICBDbGFzc0V4cHJlc3Npb24gY2xhc3NFeHAgPSAoQ2xhc3NFeHByZXNzaW9uKSByaWdodEV4cDsKKyAgICAgICAgICAgIGNsYXNzVHlwZSA9IGNsYXNzRXhwLmdldFR5cGUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiUmlnaHQgaGFuZCBzaWRlIG9mIHRoZSBpbnN0YW5jZW9mIGtleXdvcmQgbXVzdCBiZSBhIGNsYXNzIG5hbWUsIG5vdDogIiArIHJpZ2h0RXhwKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgY2xhc3NJbnRlcm5hbE5hbWUgPSBCeXRlY29kZUhlbHBlci5nZXRDbGFzc0ludGVybmFsTmFtZShjbGFzc1R5cGUpOworICAgICAgICBtdi52aXNpdFR5cGVJbnNuKElOU1RBTkNFT0YsIGNsYXNzSW50ZXJuYWxOYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGFyZ3VtZW50IGV4cHJlc3Npb24gcmVxdWlyZXMgdGhlIHN0YWNrLCBpbgorICAgICAqICAgICAgICAgd2hpY2ggY2FzZSB0aGUgYXJndW1lbnRzIGFyZSBldmFsdWF0ZWQgZmlyc3QsIHN0b3JlZCBpbiB0aGUKKyAgICAgKiAgICAgICAgIHZhcmlhYmxlIHN0YWNrIGFuZCB0aGVuIHJlbG9hZGVkIHRvIG1ha2UgYSBtZXRob2QgY2FsbAorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGFyZ3VtZW50c1VzZVN0YWNrKEV4cHJlc3Npb24gYXJndW1lbnRzKSB7CisgICAgICAgIHJldHVybiBhcmd1bWVudHMgaW5zdGFuY2VvZiBUdXBsZUV4cHJlc3Npb24gfHwgYXJndW1lbnRzIGluc3RhbmNlb2YgQ2xvc3VyZUV4cHJlc3Npb247CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBleHByZXNzaW9uIHJlcHJlc2VudHMgYSBub24tc3RhdGljIGZpZWxkCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNOb25TdGF0aWNGaWVsZChFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKyAgICAgICAgRmllbGROb2RlIGZpZWxkID0gbnVsbDsKKyAgICAgICAgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBWYXJpYWJsZUV4cHJlc3Npb24pIHsKKyAgICAgICAgICAgIFZhcmlhYmxlRXhwcmVzc2lvbiB2YXJFeHAgPSAoVmFyaWFibGVFeHByZXNzaW9uKSBleHByZXNzaW9uOworICAgICAgICAgICAgZmllbGQgPSBjbGFzc05vZGUuZ2V0RmllbGQodmFyRXhwLmdldE5hbWUoKSk7CisgICAgICAgIH0gZWxzZSBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIEZpZWxkRXhwcmVzc2lvbikgeworICAgICAgICAgICAgRmllbGRFeHByZXNzaW9uIGZpZWxkRXhwID0gKEZpZWxkRXhwcmVzc2lvbikgZXhwcmVzc2lvbjsKKyAgICAgICAgICAgIGZpZWxkID0gY2xhc3NOb2RlLmdldEZpZWxkKGZpZWxkRXhwLmdldEZpZWxkTmFtZSgpKTsKKyAgICAgICAgfSBlbHNlIGlmIChleHByZXNzaW9uLmdldENsYXNzKCkgPT0gUHJvcGVydHlFeHByZXNzaW9uLmNsYXNzKSB7CisgICAgICAgICAgICBQcm9wZXJ0eUV4cHJlc3Npb24gZmllbGRFeHAgPSAoUHJvcGVydHlFeHByZXNzaW9uKSBleHByZXNzaW9uOworICAgICAgICAgICAgU3RyaW5nIHBvc3NpYmxlRmllbGQgPSBmaWVsZEV4cC5nZXRQcm9wZXJ0eUFzU3RyaW5nKCk7CisgICAgICAgICAgICBpZiAocG9zc2libGVGaWVsZCAhPSBudWxsKSBmaWVsZCA9IGNsYXNzTm9kZS5nZXRGaWVsZChwb3NzaWJsZUZpZWxkKTsKKyAgICAgICAgfQorICAgICAgcmV0dXJuIGZpZWxkICE9IG51bGwgJiYgIWZpZWxkLmlzU3RhdGljKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1RoaXNFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgICAgICBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIFZhcmlhYmxlRXhwcmVzc2lvbikgeworICAgICAgICAgICAgVmFyaWFibGVFeHByZXNzaW9uIHZhckV4cCA9IChWYXJpYWJsZUV4cHJlc3Npb24pIGV4cHJlc3Npb247CisgICAgICAgICAgICByZXR1cm4gdmFyRXhwLmdldE5hbWUoKS5lcXVhbHMoInRoaXMiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1N1cGVyRXhwcmVzc2lvbihFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKyAgICAgICAgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBWYXJpYWJsZUV4cHJlc3Npb24pIHsKKyAgICAgICAgICAgIFZhcmlhYmxlRXhwcmVzc2lvbiB2YXJFeHAgPSAoVmFyaWFibGVFeHByZXNzaW9uKSBleHByZXNzaW9uOworICAgICAgICAgICAgcmV0dXJuIHZhckV4cC5nZXROYW1lKCkuZXF1YWxzKCJzdXBlciIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVGhpc09yU3VwZXIoRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisgICAgICAgIHJldHVybiBpc1RoaXNFeHByZXNzaW9uKGV4cHJlc3Npb24pIHx8IGlzU3VwZXJFeHByZXNzaW9uKGV4cHJlc3Npb24pOworICAgIH0KKworCisgICAgLyoqCisgICAgICogRm9yIGFzc2lnbm1lbnQgZXhwcmVzc2lvbnMsIHJldHVybiBhIHNhZmUgZXhwcmVzc2lvbiBmb3IgdGhlIExIUyB3ZSBjYW4gdXNlCisgICAgICogdG8gcmV0dXJuIHRoZSB2YWx1ZQorICAgICAqLworICAgIHByb3RlY3RlZCBFeHByZXNzaW9uIGNyZWF0ZVJldHVybkxIU0V4cHJlc3Npb24oRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisgICAgICAgIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgQmluYXJ5RXhwcmVzc2lvbikgeworICAgICAgICAgICAgQmluYXJ5RXhwcmVzc2lvbiBiaW5FeHByID0gKEJpbmFyeUV4cHJlc3Npb24pIGV4cHJlc3Npb247CisgICAgICAgICAgICBpZiAoYmluRXhwci5nZXRPcGVyYXRpb24oKS5pc0EoVHlwZXMuQVNTSUdOTUVOVF9PUEVSQVRPUikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlUmV1c2FibGVFeHByZXNzaW9uKGJpbkV4cHIuZ2V0TGVmdEV4cHJlc3Npb24oKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEV4cHJlc3Npb24gY3JlYXRlUmV1c2FibGVFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgICAgICBFeHByZXNzaW9uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSBuZXcgRXhwcmVzc2lvblRyYW5zZm9ybWVyKCkgeworICAgICAgICAgICAgcHVibGljIEV4cHJlc3Npb24gdHJhbnNmb3JtKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgICAgICAgICAgICAgIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgUG9zdGZpeEV4cHJlc3Npb24pIHsKKyAgICAgICAgICAgICAgICAgICAgUG9zdGZpeEV4cHJlc3Npb24gcG9zdGZpeEV4cCA9IChQb3N0Zml4RXhwcmVzc2lvbikgZXhwcmVzc2lvbjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBvc3RmaXhFeHAuZ2V0RXhwcmVzc2lvbigpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIFByZWZpeEV4cHJlc3Npb24pIHsKKyAgICAgICAgICAgICAgICAgICAgUHJlZml4RXhwcmVzc2lvbiBwcmVmaXhFeHAgPSAoUHJlZml4RXhwcmVzc2lvbikgZXhwcmVzc2lvbjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeEV4cC5nZXRFeHByZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBleHByZXNzaW9uOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIC8vIGNvdWxkIGp1c3QgYmUgYSBwb3N0Zml4IC8gcHJlZml4IGV4cHJlc3Npb24gb3IgbmVzdGVkIGluc2lkZSBzb21lIG90aGVyIGV4cHJlc3Npb24KKyAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShleHByZXNzaW9uLnRyYW5zZm9ybUV4cHJlc3Npb24odHJhbnNmb3JtZXIpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0NvbXBhcmlzb25FeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgICAgICBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIEJpbmFyeUV4cHJlc3Npb24pIHsKKyAgICAgICAgICAgIEJpbmFyeUV4cHJlc3Npb24gYmluRXhwciA9IChCaW5hcnlFeHByZXNzaW9uKSBleHByZXNzaW9uOworICAgICAgICAgICAgc3dpdGNoIChiaW5FeHByLmdldE9wZXJhdGlvbigpLmdldFR5cGUoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuQ09NUEFSRV9FUVVBTDoKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLk1BVENIX1JFR0VYOgorICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuQ09NUEFSRV9HUkVBVEVSX1RIQU46CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5DT01QQVJFX0dSRUFURVJfVEhBTl9FUVVBTDoKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkNPTVBBUkVfTEVTU19USEFOOgorICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuQ09NUEFSRV9MRVNTX1RIQU5fRVFVQUw6CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5DT01QQVJFX0lERU5USUNBTDoKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkNPTVBBUkVfTk9UX0VRVUFMOgorICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuS0VZV09SRF9JTlNUQU5DRU9GOgorICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuS0VZV09SRF9JTjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIEJvb2xlYW5FeHByZXNzaW9uKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgb25MaW5lTnVtYmVyKEFTVE5vZGUgc3RhdGVtZW50LCBTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICBpbnQgbGluZSA9IHN0YXRlbWVudC5nZXRMaW5lTnVtYmVyKCk7CisgICAgICAgIGludCBjb2wgPSBzdGF0ZW1lbnQuZ2V0Q29sdW1uTnVtYmVyKCk7CisgICAgICAgIHRoaXMuY3VycmVudEFTVE5vZGUgPSBzdGF0ZW1lbnQ7CisKKyAgICAgICAgaWYgKGxpbmUgPj0gMCkgeworICAgICAgICAgICAgbGluZU51bWJlciA9IGxpbmU7CisgICAgICAgICAgICBjb2x1bW5OdW1iZXIgPSBjb2w7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxpbmUgPj0gMCAmJiBtdiAhPSBudWxsKSB7CisgICAgICAgICAgICBMYWJlbCBsID0gbmV3IExhYmVsKCk7CisgICAgICAgICAgICBtdi52aXNpdExhYmVsKGwpOworICAgICAgICAgICAgbXYudmlzaXRMaW5lTnVtYmVyKGxpbmUsIGwpOworICAgICAgICAgICAgaWYgKEFTTV9ERUJVRykgeworICAgICAgICAgICAgICAgIGhlbHBlci5tYXJrKG1lc3NhZ2UgKyAiWyIgKyBzdGF0ZW1lbnQuZ2V0TGluZU51bWJlcigpICsgIjoiICsgc3RhdGVtZW50LmdldENvbHVtbk51bWJlcigpICsgIl0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc0lubmVyQ2xhc3MoKSB7CisgICAgICAgIHJldHVybiBjbGFzc05vZGUgaW5zdGFuY2VvZiBJbm5lckNsYXNzTm9kZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIG5hbWUgaXMgYSBsb2NhbCB2YXJpYWJsZSBvciBhIGZpZWxkCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNGaWVsZE9yVmFyaWFibGUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGNvbXBpbGVTdGFjay5jb250YWluc1ZhcmlhYmxlKG5hbWUpIHx8IGNsYXNzTm9kZS5nZXRGaWVsZChuYW1lKSAhPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gaWYgdGhlIHR5cGUgb2YgdGhlIGV4cHJlc3Npb24gY2FuIGJlIGRldGVybWluZWQgYXQgY29tcGlsZSB0aW1lCisgICAgICogICAgICAgICB0aGVuIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHR5cGUgLSBvdGhlcndpc2UgbnVsbAorICAgICAqLworICAgIHByb3RlY3RlZCBDbGFzc05vZGUgZ2V0RXhwcmVzc2lvblR5cGUoRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisgICAgICAgIGlmIChpc0NvbXBhcmlzb25FeHByZXNzaW9uKGV4cHJlc3Npb24pKSB7CisgICAgICAgICAgICByZXR1cm4gQ2xhc3NIZWxwZXIuYm9vbGVhbl9UWVBFOworICAgICAgICB9CisgICAgICAgIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgVmFyaWFibGVFeHByZXNzaW9uKSB7CisgICAgICAgICAgICBpZiAoZXhwcmVzc2lvbiA9PSBWYXJpYWJsZUV4cHJlc3Npb24uVEhJU19FWFBSRVNTSU9OKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNsYXNzTm9kZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZXhwcmVzc2lvbiA9PSBWYXJpYWJsZUV4cHJlc3Npb24uU1VQRVJfRVhQUkVTU0lPTikgeworICAgICAgICAgICAgICAgIHJldHVybiBjbGFzc05vZGUuZ2V0U3VwZXJDbGFzcygpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBWYXJpYWJsZUV4cHJlc3Npb24gdmFyRXhwciA9IChWYXJpYWJsZUV4cHJlc3Npb24pIGV4cHJlc3Npb247CisgICAgICAgICAgICBWYXJpYWJsZSB2YXJpYWJsZSA9IGNvbXBpbGVTdGFjay5nZXRWYXJpYWJsZSh2YXJFeHByLmdldE5hbWUoKSwgZmFsc2UpOworICAgICAgICAgICAgaWYgKHZhcmlhYmxlICE9IG51bGwgJiYgIXZhcmlhYmxlLmlzSG9sZGVyKCkpIHsKKyAgICAgICAgICAgICAgICBDbGFzc05vZGUgdHlwZSA9IHZhcmlhYmxlLmdldFR5cGUoKTsKKyAgICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlLmlzRHluYW1pY1R5cGVkKCkpIHJldHVybiB0eXBlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHZhcmlhYmxlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5WYXJpYWJsZSB2YXIgPSAob3JnLmNvZGVoYXVzLmdyb292eS5hc3QuVmFyaWFibGUpIGNvbXBpbGVTdGFjay5nZXRTY29wZSgpLmdldFJlZmVyZW5jZWRDbGFzc1ZhcmlhYmxlKHZhckV4cHIuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAodmFyICE9IG51bGwgJiYgIXZhci5pc0R5bmFtaWNUeXBlZCgpKSByZXR1cm4gdmFyLmdldFR5cGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXhwcmVzc2lvbi5nZXRUeXBlKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNJbkNsb3N1cmVDb25zdHJ1Y3RvcigpIHsKKyAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yTm9kZSAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgY2xhc3NOb2RlLmdldE91dGVyQ2xhc3MoKSAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgY2xhc3NOb2RlLmdldFN1cGVyQ2xhc3MoKSA9PSBDbGFzc0hlbHBlci5DTE9TVVJFX1RZUEU7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNJbkNsb3N1cmUoKSB7CisgICAgICAgIHJldHVybiBjbGFzc05vZGUuZ2V0T3V0ZXJDbGFzcygpICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiBjbGFzc05vZGUuZ2V0U3VwZXJDbGFzcygpID09IENsYXNzSGVscGVyLkNMT1NVUkVfVFlQRTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1N0YXRpY01ldGhvZCgpIHsKKyAgICAgIHJldHVybiBtZXRob2ROb2RlICE9IG51bGwgJiYgbWV0aG9kTm9kZS5pc1N0YXRpYygpOworICAgIH0KKworICAgIHByb3RlY3RlZCBDb21waWxlVW5pdCBnZXRDb21waWxlVW5pdCgpIHsKKyAgICAgICAgQ29tcGlsZVVuaXQgYW5zd2VyID0gY2xhc3NOb2RlLmdldENvbXBpbGVVbml0KCk7CisgICAgICAgIGlmIChhbnN3ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgYW5zd2VyID0gY29udGV4dC5nZXRDb21waWxlVW5pdCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhbnN3ZXI7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNIb2xkZXJWYXJpYWJsZShFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKyAgICAgICAgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBGaWVsZEV4cHJlc3Npb24pIHsKKyAgICAgICAgICAgIEZpZWxkRXhwcmVzc2lvbiBmaWVsZEV4cCA9IChGaWVsZEV4cHJlc3Npb24pIGV4cHJlc3Npb247CisgICAgICAgICAgICByZXR1cm4gZmllbGRFeHAuZ2V0RmllbGQoKS5pc0hvbGRlcigpOworICAgICAgICB9CisgICAgICAgIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgVmFyaWFibGVFeHByZXNzaW9uKSB7CisgICAgICAgICAgICBWYXJpYWJsZUV4cHJlc3Npb24gdmFyRXhwID0gKFZhcmlhYmxlRXhwcmVzc2lvbikgZXhwcmVzc2lvbjsKKyAgICAgICAgICAgIFZhcmlhYmxlIHZhcmlhYmxlID0gY29tcGlsZVN0YWNrLmdldFZhcmlhYmxlKHZhckV4cC5nZXROYW1lKCksIGZhbHNlKTsKKyAgICAgICAgICAgIGlmICh2YXJpYWJsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhcmlhYmxlLmlzSG9sZGVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGaWVsZE5vZGUgZmllbGQgPSBjbGFzc05vZGUuZ2V0RmllbGQodmFyRXhwLmdldE5hbWUoKSk7CisgICAgICAgICAgICBpZiAoZmllbGQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmaWVsZC5pc0hvbGRlcigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdXNlc1N1cGVyKE1ldGhvZENhbGxFeHByZXNzaW9uIGNhbGwpIHsKKyAgICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gY2FsbC5nZXRPYmplY3RFeHByZXNzaW9uKCk7CisgICAgICAgIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgVmFyaWFibGVFeHByZXNzaW9uKSB7CisgICAgICAgICAgICBWYXJpYWJsZUV4cHJlc3Npb24gdmFyRXhwID0gKFZhcmlhYmxlRXhwcmVzc2lvbikgZXhwcmVzc2lvbjsKKyAgICAgICAgICAgIFN0cmluZyB2YXJpYWJsZSA9IHZhckV4cC5nZXROYW1lKCk7CisgICAgICAgICAgICByZXR1cm4gdmFyaWFibGUuZXF1YWxzKCJzdXBlciIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdXNlc1N1cGVyKFByb3BlcnR5RXhwcmVzc2lvbiBwZSkgeworICAgICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBwZS5nZXRPYmplY3RFeHByZXNzaW9uKCk7CisgICAgICAgIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgVmFyaWFibGVFeHByZXNzaW9uKSB7CisgICAgICAgICAgICBWYXJpYWJsZUV4cHJlc3Npb24gdmFyRXhwID0gKFZhcmlhYmxlRXhwcmVzc2lvbikgZXhwcmVzc2lvbjsKKyAgICAgICAgICAgIFN0cmluZyB2YXJpYWJsZSA9IHZhckV4cC5nZXROYW1lKCk7CisgICAgICAgICAgICByZXR1cm4gdmFyaWFibGUuZXF1YWxzKCJzdXBlciIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgaW50IGdldEJ5dGVjb2RlVmVyc2lvbigpIHsKKyAgICAgICAgaWYgKCFjbGFzc05vZGUuaXNVc2luZ0dlbmVyaWNzKCkgJiYKKyAgICAgICAgICAgICAgICAhY2xhc3NOb2RlLmlzQW5ub3RhdGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBPcGNvZGVzLlYxXzM7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBTdHJpbmcgdGFyZ2V0ID0gZ2V0Q29tcGlsZVVuaXQoKS5nZXRDb25maWcoKS5nZXRUYXJnZXRCeXRlY29kZSgpOworICAgICAgICByZXR1cm4gQ29tcGlsZXJDb25maWd1cmF0aW9uLlBPU1RfSkRLNS5lcXVhbHModGFyZ2V0KSA/IE9wY29kZXMuVjFfNSA6IE9wY29kZXMuVjFfMzsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL0J5dGVjb2RlRXhwcmVzc2lvbi5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vQnl0ZWNvZGVFeHByZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg4Y2JkZAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL0J5dGVjb2RlRXhwcmVzc2lvbi5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuR3Jvb3Z5Q29kZVZpc2l0b3I7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuZXhwci5FeHByZXNzaW9uOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHIuRXhwcmVzc2lvblRyYW5zZm9ybWVyOworCisvKioKKyAqIFJlcHJlc2VudHMgc29tZSBjdXN0b20gYnl0ZWNvZGUgZ2VuZXJhdGlvbiBieSB0aGUgY29tcGlsZXIKKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEJ5dGVjb2RlRXhwcmVzc2lvbiBleHRlbmRzIEV4cHJlc3Npb24geworICAgIHB1YmxpYyBzdGF0aWMgQnl0ZWNvZGVFeHByZXNzaW9uIE5PUCA9IG5ldyBCeXRlY29kZUV4cHJlc3Npb24oKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KEdyb292eUNvZGVWaXNpdG9yIHZpc2l0b3IpIHsKKyAgICAgICAgICAgIC8vZG8gbm90aGluZyAgICAgICAgICAgICAKKyAgICAgICAgfQorICAgIH07CisgICAgCisgICAgCisgICAgcHVibGljIEJ5dGVjb2RlRXhwcmVzc2lvbigpIHsKKyAgICB9CisgICAgCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgdmlzaXQoR3Jvb3Z5Q29kZVZpc2l0b3IgdmlzaXRvcik7CisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiB0cmFuc2Zvcm1FeHByZXNzaW9uKEV4cHJlc3Npb25UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lcikgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9CeXRlY29kZUhlbHBlci5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vQnl0ZWNvZGVIZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWQxMDM3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vQnl0ZWNvZGVIZWxwZXIuamF2YQpAQCAtMCwwICsxLDc5MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW47CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC4qOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS50eXBlaGFuZGxpbmcuRGVmYXVsdFR5cGVUcmFuc2Zvcm1hdGlvbjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJlZmxlY3Rpb24uUmVmbGVjdGlvbkNhY2hlOworaW1wb3J0IG9yZy5vYmplY3R3ZWIuYXNtLkxhYmVsOworaW1wb3J0IG9yZy5vYmplY3R3ZWIuYXNtLk1ldGhvZFZpc2l0b3I7CitpbXBvcnQgb3JnLm9iamVjdHdlYi5hc20uT3Bjb2RlczsKKworaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworCisvKioKKyAqIEEgaGVscGVyIGNsYXNzIGZvciBieXRlY29kZSBnZW5lcmF0aW9uIHdpdGggQXNtQ2xhc3NHZW5lcmF0b3IuCisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmI1NXJAc2luYS5jb20iPkJpbmcgUmFuPC9hPgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86YmxhY2tkcmFnQGdteC5vcmciPkpvY2hlbiBUaGVvZG9yb3U8L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBCeXRlY29kZUhlbHBlciBpbXBsZW1lbnRzIE9wY29kZXMgeworCisgICAgcHJpdmF0ZSBNZXRob2RWaXNpdG9yIG12OworCisgICAgcHVibGljIE1ldGhvZFZpc2l0b3IgZ2V0TWV0aG9kVmlzaXRvcigpIHsKKyAgICAgICAgcmV0dXJuIG12OworICAgIH0KKworICAgIHB1YmxpYyBCeXRlY29kZUhlbHBlcihNZXRob2RWaXNpdG9yIG12KSB7CisgICAgICAgIHRoaXMubXYgPSBtdjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBib3ggdGhlIHByaW1pdGl2ZSB2YWx1ZSBvbiB0aGUgc3RhY2sKKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcXVpY2tCb3hJZk5lY2Vzc2FyeShDbGFzc05vZGUgdHlwZSkgeworICAgICAgICBTdHJpbmcgZGVzY3IgPSBnZXRUeXBlRGVzY3JpcHRpb24odHlwZSk7CisgICAgICAgIGlmICh0eXBlID09IENsYXNzSGVscGVyLmJvb2xlYW5fVFlQRSkgeworICAgICAgICAgICAgYm94Qm9vbGVhbigpOworICAgICAgICB9IGVsc2UgaWYgKENsYXNzSGVscGVyLmlzUHJpbWl0aXZlVHlwZSh0eXBlKSAmJiB0eXBlICE9IENsYXNzSGVscGVyLlZPSURfVFlQRSkgeworICAgICAgICAgICAgQ2xhc3NOb2RlIHdyYXBwZXIgPSBDbGFzc0hlbHBlci5nZXRXcmFwcGVyKHR5cGUpOworICAgICAgICAgICAgU3RyaW5nIGludGVybk5hbWUgPSBnZXRDbGFzc0ludGVybmFsTmFtZSh3cmFwcGVyKTsKKyAgICAgICAgICAgIG12LnZpc2l0VHlwZUluc24oTkVXLCBpbnRlcm5OYW1lKTsKKyAgICAgICAgICAgIG12LnZpc2l0SW5zbihEVVApOworICAgICAgICAgICAgaWYgKHR5cGUgPT0gQ2xhc3NIZWxwZXIuZG91YmxlX1RZUEUgfHwgdHlwZSA9PSBDbGFzc0hlbHBlci5sb25nX1RZUEUpIHsKKyAgICAgICAgICAgICAgICBtdi52aXNpdEluc24oRFVQMl9YMik7CisgICAgICAgICAgICAgICAgbXYudmlzaXRJbnNuKFBPUDIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtdi52aXNpdEluc24oRFVQMl9YMSk7CisgICAgICAgICAgICAgICAgbXYudmlzaXRJbnNuKFBPUDIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbXYudmlzaXRNZXRob2RJbnNuKElOVk9LRVNQRUNJQUwsIGludGVybk5hbWUsICI8aW5pdD4iLCAiKCIgKyBkZXNjciArICIpViIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcXVpY2tVbmJveElmTmVjZXNzYXJ5KENsYXNzTm9kZSB0eXBlKSB7CisgICAgICAgIGlmIChDbGFzc0hlbHBlci5pc1ByaW1pdGl2ZVR5cGUodHlwZSkgJiYgdHlwZSAhPSBDbGFzc0hlbHBlci5WT0lEX1RZUEUpIHsgLy8gdG9kbyBjYXJlIHdoZW4gQmlnRGVjaW1hbCBvciBCaWdJbmV0ZWdlciBvbiBzdGFjaworICAgICAgICAgICAgQ2xhc3NOb2RlIHdyYXBwZXIgPSBDbGFzc0hlbHBlci5nZXRXcmFwcGVyKHR5cGUpOworICAgICAgICAgICAgU3RyaW5nIGludGVybk5hbWUgPSBnZXRDbGFzc0ludGVybmFsTmFtZSh3cmFwcGVyKTsKKyAgICAgICAgICAgIGlmICh0eXBlID09IENsYXNzSGVscGVyLmJvb2xlYW5fVFlQRSkgeworICAgICAgICAgICAgICAgIG12LnZpc2l0VHlwZUluc24oQ0hFQ0tDQVNULCBpbnRlcm5OYW1lKTsKKyAgICAgICAgICAgICAgICBtdi52aXNpdE1ldGhvZEluc24oSU5WT0tFVklSVFVBTCwgaW50ZXJuTmFtZSwgdHlwZS5nZXROYW1lKCkgKyAiVmFsdWUiLCAiKCkiICsgZ2V0VHlwZURlc2NyaXB0aW9uKHR5cGUpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IC8vIG51bWJlcnMKKyAgICAgICAgICAgICAgICBtdi52aXNpdFR5cGVJbnNuKENIRUNLQ0FTVCwgImphdmEvbGFuZy9OdW1iZXIiKTsKKyAgICAgICAgICAgICAgICBtdi52aXNpdE1ldGhvZEluc24oSU5WT0tFVklSVFVBTCwgLyppbnRlcm5OYW1lKi8iamF2YS9sYW5nL051bWJlciIsIHR5cGUuZ2V0TmFtZSgpICsgIlZhbHVlIiwgIigpIiArIGdldFR5cGVEZXNjcmlwdGlvbih0eXBlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgdGhlIGJ5dGVjb2RlIHRvIGF1dG9ib3ggdGhlIGN1cnJlbnQgdmFsdWUgb24gdGhlIHN0YWNrCisgICAgICovCisgICAgcHVibGljIHZvaWQgYm94KENsYXNzIHR5cGUpIHsKKyAgICAgICAgaWYgKFJlZmxlY3Rpb25DYWNoZS5nZXRDYWNoZWRDbGFzcyh0eXBlKS5pc1ByaW1pdGl2ZSAmJiB0eXBlICE9IHZvaWQuY2xhc3MpIHsKKyAgICAgICAgICAgIFN0cmluZyByZXR1cm5TdHJpbmcgPSAiKCIgKyBnZXRUeXBlRGVzY3JpcHRpb24odHlwZSkgKyAiKUxqYXZhL2xhbmcvT2JqZWN0OyI7CisgICAgICAgICAgICBtdi52aXNpdE1ldGhvZEluc24oSU5WT0tFU1RBVElDLCBnZXRDbGFzc0ludGVybmFsTmFtZShEZWZhdWx0VHlwZVRyYW5zZm9ybWF0aW9uLmNsYXNzLmdldE5hbWUoKSksICJib3giLCByZXR1cm5TdHJpbmcpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYm94KENsYXNzTm9kZSB0eXBlKSB7CisgICAgICAgIGlmICh0eXBlLmlzUHJpbWFyeUNsYXNzTm9kZSgpKSByZXR1cm47CisgICAgICAgIGJveCh0eXBlLmdldFR5cGVDbGFzcygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgdGhlIGJ5dGVjb2RlIHRvIHVuYm94IHRoZSBjdXJyZW50IHZhbHVlIG9uIHRoZSBzdGFjaworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVuYm94KENsYXNzIHR5cGUpIHsKKyAgICAgICAgaWYgKHR5cGUuaXNQcmltaXRpdmUoKSAmJiB0eXBlICE9IFZvaWQuVFlQRSkgeworICAgICAgICAgICAgU3RyaW5nIHJldHVyblN0cmluZyA9ICIoTGphdmEvbGFuZy9PYmplY3Q7KSIgKyBnZXRUeXBlRGVzY3JpcHRpb24odHlwZSk7CisgICAgICAgICAgICBtdi52aXNpdE1ldGhvZEluc24oCisgICAgICAgICAgICAgICAgICAgIElOVk9LRVNUQVRJQywKKyAgICAgICAgICAgICAgICAgICAgZ2V0Q2xhc3NJbnRlcm5hbE5hbWUoRGVmYXVsdFR5cGVUcmFuc2Zvcm1hdGlvbi5jbGFzcy5nZXROYW1lKCkpLAorICAgICAgICAgICAgICAgICAgICB0eXBlLmdldE5hbWUoKSArICJVbmJveCIsCisgICAgICAgICAgICAgICAgICAgIHJldHVyblN0cmluZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1bmJveChDbGFzc05vZGUgdHlwZSkgeworICAgICAgICBpZiAodHlwZS5pc1ByaW1hcnlDbGFzc05vZGUoKSkgcmV0dXJuOworICAgICAgICB1bmJveCh0eXBlLmdldFR5cGVDbGFzcygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDbGFzc0ludGVybmFsTmFtZShDbGFzc05vZGUgdCkgeworICAgICAgICBpZiAodC5pc1ByaW1hcnlDbGFzc05vZGUoKSkgeworICAgICAgICAgICAgcmV0dXJuIGdldENsYXNzSW50ZXJuYWxOYW1lKHQuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZ2V0Q2xhc3NJbnRlcm5hbE5hbWUodC5nZXRUeXBlQ2xhc3MoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q2xhc3NJbnRlcm5hbE5hbWUoQ2xhc3MgdCkgeworICAgICAgICByZXR1cm4gb3JnLm9iamVjdHdlYi5hc20uVHlwZS5nZXRJbnRlcm5hbE5hbWUodCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgQVNNIGludGVybmFsIG5hbWUgb2YgdGhlIHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDbGFzc0ludGVybmFsTmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gbmFtZS5yZXBsYWNlKCcuJywgJy8nKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBBU00gbWV0aG9kIHR5cGUgZGVzY3JpcHRvcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1ldGhvZERlc2NyaXB0b3IoQ2xhc3NOb2RlIHJldHVyblR5cGUsIFBhcmFtZXRlcltdIHBhcmFtZXRlcnMpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoIigiKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGdldFR5cGVEZXNjcmlwdGlvbihwYXJhbWV0ZXJzW2ldLmdldFR5cGUoKSkpOworICAgICAgICB9CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIikiKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZChnZXRUeXBlRGVzY3JpcHRpb24ocmV0dXJuVHlwZSkpOworICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgQVNNIG1ldGhvZCB0eXBlIGRlc2NyaXB0b3IKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXRob2REZXNjcmlwdG9yKENsYXNzIHJldHVyblR5cGUsIENsYXNzW10gcGFyYW1UeXBlcykgeworICAgICAgICAvLyBsZXRzIGF2b2lkIGNsYXNzIGxvYWRpbmcKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoIigiKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbVR5cGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGdldFR5cGVEZXNjcmlwdGlvbihwYXJhbVR5cGVzW2ldKSk7CisgICAgICAgIH0KKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiKSIpOworICAgICAgICBidWZmZXIuYXBwZW5kKGdldFR5cGVEZXNjcmlwdGlvbihyZXR1cm5UeXBlKSk7CisgICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUeXBlRGVzY3JpcHRpb24oQ2xhc3MgYykgeworICAgICAgICByZXR1cm4gb3JnLm9iamVjdHdlYi5hc20uVHlwZS5nZXREZXNjcmlwdG9yKGMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFycmF5IHR5cGVzIGFyZSBzcGVjaWFsOgorICAgICAqIGVnLjogU3RyaW5nW106IGNsYXNzbmFtZTogW0xqYXZhLmxhbmcuU3RyaW5nOworICAgICAqIE9iamVjdDogICBjbGFzc25hbWU6IGphdmEubGFuZy5PYmplY3QKKyAgICAgKiBpbnRbXSA6ICAgY2xhc3NuYW1lOiBbSQorICAgICAqIHVubGlrZSBnZXRUeXBlRGVzY3JpcHRpb24gJy4nIGlzIG5vdCByZXBsYWNlZCBieSAnLycuCisgICAgICogaXQgc2VlbXMgdGhhdCBtYWtlcyBwcm9ibGVtcyBmb3IKKyAgICAgKiB0aGUgY2xhc3MgbG9hZGluZyBpZiAnLicgaXMgcmVwbGFjZWQgYnkgJy8nCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBBU00gdHlwZSBkZXNjcmlwdGlvbiBmb3IgY2xhc3MgbG9hZGluZworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENsYXNzTG9hZGluZ1R5cGVEZXNjcmlwdGlvbihDbGFzc05vZGUgYykgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBib29sZWFuIGFycmF5ID0gZmFsc2U7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBpZiAoYy5pc0FycmF5KCkpIHsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCdbJyk7CisgICAgICAgICAgICAgICAgYyA9IGMuZ2V0Q29tcG9uZW50VHlwZSgpOworICAgICAgICAgICAgICAgIGFycmF5ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKENsYXNzSGVscGVyLmlzUHJpbWl0aXZlVHlwZShjKSkgeworICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKGdldFR5cGVEZXNjcmlwdGlvbihjKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFycmF5KSBidWYuYXBwZW5kKCdMJyk7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoYy5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBpZiAoYXJyYXkpIGJ1Zi5hcHBlbmQoJzsnKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogYXJyYXkgdHlwZXMgYXJlIHNwZWNpYWw6CisgICAgICogZWcuOiBTdHJpbmdbXTogY2xhc3NuYW1lOiBbTGphdmEvbGFuZy9TdHJpbmc7CisgICAgICogaW50W106IFtJCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBBU00gdHlwZSBkZXNjcmlwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFR5cGVEZXNjcmlwdGlvbihDbGFzc05vZGUgYykgeworICAgICAgICByZXR1cm4gZ2V0VHlwZURlc2NyaXB0aW9uKGMsIHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGFycmF5IHR5cGVzIGFyZSBzcGVjaWFsOgorICAgICAqIGVnLjogU3RyaW5nW106IGNsYXNzbmFtZTogW0xqYXZhL2xhbmcvU3RyaW5nOworICAgICAqIGludFtdOiBbSQorICAgICAqCisgICAgICogQHJldHVybiB0aGUgQVNNIHR5cGUgZGVzY3JpcHRpb24KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VHlwZURlc2NyaXB0aW9uKENsYXNzTm9kZSBjLCBib29sZWFuIGVuZCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBDbGFzc05vZGUgZCA9IGM7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBpZiAoQ2xhc3NIZWxwZXIuaXNQcmltaXRpdmVUeXBlKGQpKSB7CisgICAgICAgICAgICAgICAgY2hhciBjYXI7CisgICAgICAgICAgICAgICAgaWYgKGQgPT0gQ2xhc3NIZWxwZXIuaW50X1RZUEUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FyID0gJ0knOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZCA9PSBDbGFzc0hlbHBlci5WT0lEX1RZUEUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FyID0gJ1YnOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZCA9PSBDbGFzc0hlbHBlci5ib29sZWFuX1RZUEUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FyID0gJ1onOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZCA9PSBDbGFzc0hlbHBlci5ieXRlX1RZUEUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FyID0gJ0InOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZCA9PSBDbGFzc0hlbHBlci5jaGFyX1RZUEUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FyID0gJ0MnOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZCA9PSBDbGFzc0hlbHBlci5zaG9ydF9UWVBFKSB7CisgICAgICAgICAgICAgICAgICAgIGNhciA9ICdTJzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGQgPT0gQ2xhc3NIZWxwZXIuZG91YmxlX1RZUEUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FyID0gJ0QnOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZCA9PSBDbGFzc0hlbHBlci5mbG9hdF9UWVBFKSB7CisgICAgICAgICAgICAgICAgICAgIGNhciA9ICdGJzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgLyogbG9uZyAqLyB7CisgICAgICAgICAgICAgICAgICAgIGNhciA9ICdKJzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChjYXIpOworICAgICAgICAgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZC5pc0FycmF5KCkpIHsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCdbJyk7CisgICAgICAgICAgICAgICAgZCA9IGQuZ2V0Q29tcG9uZW50VHlwZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCdMJyk7CisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBkLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICBpbnQgbGVuID0gbmFtZS5sZW5ndGgoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgY2FyID0gbmFtZS5jaGFyQXQoaSk7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoY2FyID09ICcuJyA/ICcvJyA6IGNhcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChlbmQpIGJ1Zi5hcHBlbmQoJzsnKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIEFTTSBpbnRlcm5hbCBuYW1lcyBvZiB0aGUgdHlwZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0Q2xhc3NJbnRlcm5hbE5hbWVzKENsYXNzTm9kZVtdIG5hbWVzKSB7CisgICAgICAgIGludCBzaXplID0gbmFtZXMubGVuZ3RoOworICAgICAgICBTdHJpbmdbXSBhbnN3ZXIgPSBuZXcgU3RyaW5nW3NpemVdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgYW5zd2VyW2ldID0gZ2V0Q2xhc3NJbnRlcm5hbE5hbWUobmFtZXNbaV0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhbnN3ZXI7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgcHVzaENvbnN0YW50KGJvb2xlYW4gdmFsdWUpIHsKKyAgICAgICAgaWYgKHZhbHVlKSB7CisgICAgICAgICAgICBtdi52aXNpdEluc24oSUNPTlNUXzEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbXYudmlzaXRJbnNuKElDT05TVF8wKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHB1c2hDb25zdGFudChpbnQgdmFsdWUpIHsKKyAgICAgICAgc3dpdGNoICh2YWx1ZSkgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIG12LnZpc2l0SW5zbihJQ09OU1RfMCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgbXYudmlzaXRJbnNuKElDT05TVF8xKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICBtdi52aXNpdEluc24oSUNPTlNUXzIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIG12LnZpc2l0SW5zbihJQ09OU1RfMyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgbXYudmlzaXRJbnNuKElDT05TVF80KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICBtdi52aXNpdEluc24oSUNPTlNUXzUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPj0gQnl0ZS5NSU5fVkFMVUUgJiYgdmFsdWUgPD0gQnl0ZS5NQVhfVkFMVUUpIHsKKyAgICAgICAgICAgICAgICAgICAgbXYudmlzaXRJbnRJbnNuKEJJUFVTSCwgdmFsdWUpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPj0gU2hvcnQuTUlOX1ZBTFVFICYmIHZhbHVlIDw9IFNob3J0Lk1BWF9WQUxVRSkgeworICAgICAgICAgICAgICAgICAgICBtdi52aXNpdEludEluc24oU0lQVVNILCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbXYudmlzaXRMZGNJbnNuKG5ldyBJbnRlZ2VyKHZhbHVlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZG9DYXN0KENsYXNzIHR5cGUpIHsKKyAgICAgICAgaWYgKHR5cGUgIT0gT2JqZWN0LmNsYXNzKSB7CisgICAgICAgICAgICBpZiAodHlwZS5pc1ByaW1pdGl2ZSgpICYmIHR5cGUgIT0gVm9pZC5UWVBFKSB7CisgICAgICAgICAgICAgICAgdW5ib3godHlwZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG12LnZpc2l0VHlwZUluc24oCisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS0NBU1QsCisgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLmlzQXJyYXkoKSA/IGdldFR5cGVEZXNjcmlwdGlvbih0eXBlKSA6IGdldENsYXNzSW50ZXJuYWxOYW1lKHR5cGUuZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkb0Nhc3QoQ2xhc3NOb2RlIHR5cGUpIHsKKyAgICAgICAgaWYgKHR5cGUgPT0gQ2xhc3NIZWxwZXIuT0JKRUNUX1RZUEUpIHJldHVybjsKKyAgICAgICAgaWYgKENsYXNzSGVscGVyLmlzUHJpbWl0aXZlVHlwZSh0eXBlKSAmJiB0eXBlICE9IENsYXNzSGVscGVyLlZPSURfVFlQRSkgeworICAgICAgICAgICAgdW5ib3godHlwZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtdi52aXNpdFR5cGVJbnNuKAorICAgICAgICAgICAgICAgICAgICBDSEVDS0NBU1QsCisgICAgICAgICAgICAgICAgICAgIHR5cGUuaXNBcnJheSgpID8gZ2V0VHlwZURlc2NyaXB0aW9uKHR5cGUpIDogZ2V0Q2xhc3NJbnRlcm5hbE5hbWUodHlwZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbG9hZChDbGFzc05vZGUgdHlwZSwgaW50IGlkeCkgeworICAgICAgICBpZiAodHlwZSA9PSBDbGFzc0hlbHBlci5kb3VibGVfVFlQRSkgeworICAgICAgICAgICAgbXYudmlzaXRWYXJJbnNuKERMT0FELCBpZHgpOworICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gQ2xhc3NIZWxwZXIuZmxvYXRfVFlQRSkgeworICAgICAgICAgICAgbXYudmlzaXRWYXJJbnNuKEZMT0FELCBpZHgpOworICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gQ2xhc3NIZWxwZXIubG9uZ19UWVBFKSB7CisgICAgICAgICAgICBtdi52aXNpdFZhckluc24oTExPQUQsIGlkeCk7CisgICAgICAgIH0gZWxzZSBpZiAoCisgICAgICAgICAgICAgICAgdHlwZSA9PSBDbGFzc0hlbHBlci5ib29sZWFuX1RZUEUKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IHR5cGUgPT0gQ2xhc3NIZWxwZXIuY2hhcl9UWVBFCisgICAgICAgICAgICAgICAgICAgICAgICB8fCB0eXBlID09IENsYXNzSGVscGVyLmJ5dGVfVFlQRQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgdHlwZSA9PSBDbGFzc0hlbHBlci5pbnRfVFlQRQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgdHlwZSA9PSBDbGFzc0hlbHBlci5zaG9ydF9UWVBFKSB7CisgICAgICAgICAgICBtdi52aXNpdFZhckluc24oSUxPQUQsIGlkeCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtdi52aXNpdFZhckluc24oQUxPQUQsIGlkeCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsb2FkKFZhcmlhYmxlIHYpIHsKKyAgICAgICAgbG9hZCh2LmdldFR5cGUoKSwgdi5nZXRJbmRleCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9yZShWYXJpYWJsZSB2LCBib29sZWFuIG1hcmtTdGFydCkgeworICAgICAgICBDbGFzc05vZGUgdHlwZSA9IHYuZ2V0VHlwZSgpOworICAgICAgICB1bmJveCh0eXBlKTsKKyAgICAgICAgaW50IGlkeCA9IHYuZ2V0SW5kZXgoKTsKKworICAgICAgICBpZiAodHlwZSA9PSBDbGFzc0hlbHBlci5kb3VibGVfVFlQRSkgeworICAgICAgICAgICAgbXYudmlzaXRWYXJJbnNuKERTVE9SRSwgaWR4KTsKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IENsYXNzSGVscGVyLmZsb2F0X1RZUEUpIHsKKyAgICAgICAgICAgIG12LnZpc2l0VmFySW5zbihGU1RPUkUsIGlkeCk7CisgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBDbGFzc0hlbHBlci5sb25nX1RZUEUpIHsKKyAgICAgICAgICAgIG12LnZpc2l0VmFySW5zbihMU1RPUkUsIGlkeCk7CisgICAgICAgIH0gZWxzZSBpZiAoCisgICAgICAgICAgICAgICAgdHlwZSA9PSBDbGFzc0hlbHBlci5ib29sZWFuX1RZUEUKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IHR5cGUgPT0gQ2xhc3NIZWxwZXIuY2hhcl9UWVBFCisgICAgICAgICAgICAgICAgICAgICAgICB8fCB0eXBlID09IENsYXNzSGVscGVyLmJ5dGVfVFlQRQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgdHlwZSA9PSBDbGFzc0hlbHBlci5pbnRfVFlQRQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgdHlwZSA9PSBDbGFzc0hlbHBlci5zaG9ydF9UWVBFKSB7CisgICAgICAgICAgICBtdi52aXNpdFZhckluc24oSVNUT1JFLCBpZHgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbXYudmlzaXRWYXJJbnNuKEFTVE9SRSwgaWR4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3JlKFZhcmlhYmxlIHYpIHsKKyAgICAgICAgc3RvcmUodiwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGxvYWQgdGhlIGNvbnN0YW50IG9uIHRoZSBvcGVyYW5kIHN0YWNrLiBwcmltaXRpdmVzIGF1dG8tYm94ZWQuCisgICAgICovCisgICAgdm9pZCBsb2FkQ29uc3RhbnQoT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICBtdi52aXNpdEluc24oQUNPTlNUX05VTEwpOworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7CisgICAgICAgICAgICBtdi52aXNpdExkY0luc24odmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7CisgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gImphdmEvbGFuZy9DaGFyYWN0ZXIiOworICAgICAgICAgICAgbXYudmlzaXRUeXBlSW5zbihORVcsIGNsYXNzTmFtZSk7CisgICAgICAgICAgICBtdi52aXNpdEluc24oRFVQKTsKKyAgICAgICAgICAgIG12LnZpc2l0TGRjSW5zbih2YWx1ZSk7CisgICAgICAgICAgICBTdHJpbmcgbWV0aG9kVHlwZSA9ICIoQylWIjsKKyAgICAgICAgICAgIG12LnZpc2l0TWV0aG9kSW5zbihJTlZPS0VTUEVDSUFMLCBjbGFzc05hbWUsICI8aW5pdD4iLCBtZXRob2RUeXBlKTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE51bWJlcikgeworICAgICAgICAgICAgLyoqIHRvZG8gaXQgd291bGQgYmUgbW9yZSBlZmZpY2llbnQgdG8gZ2VuZXJhdGUgY2xhc3MgY29uc3RhbnRzICovCisgICAgICAgICAgICBOdW1iZXIgbiA9IChOdW1iZXIpIHZhbHVlOworICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IEJ5dGVjb2RlSGVscGVyLmdldENsYXNzSW50ZXJuYWxOYW1lKHZhbHVlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIG12LnZpc2l0VHlwZUluc24oTkVXLCBjbGFzc05hbWUpOworICAgICAgICAgICAgbXYudmlzaXRJbnNuKERVUCk7CisgICAgICAgICAgICBTdHJpbmcgbWV0aG9kVHlwZTsKKyAgICAgICAgICAgIGlmIChuIGluc3RhbmNlb2YgSW50ZWdlcikgeworICAgICAgICAgICAgICAgIC8vcHVzaENvbnN0YW50KG4uaW50VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgbXYudmlzaXRMZGNJbnNuKG4pOworICAgICAgICAgICAgICAgIG1ldGhvZFR5cGUgPSAiKEkpViI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG4gaW5zdGFuY2VvZiBEb3VibGUpIHsKKyAgICAgICAgICAgICAgICBtdi52aXNpdExkY0luc24obik7CisgICAgICAgICAgICAgICAgbWV0aG9kVHlwZSA9ICIoRClWIjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobiBpbnN0YW5jZW9mIEZsb2F0KSB7CisgICAgICAgICAgICAgICAgbXYudmlzaXRMZGNJbnNuKG4pOworICAgICAgICAgICAgICAgIG1ldGhvZFR5cGUgPSAiKEYpViI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG4gaW5zdGFuY2VvZiBMb25nKSB7CisgICAgICAgICAgICAgICAgbXYudmlzaXRMZGNJbnNuKG4pOworICAgICAgICAgICAgICAgIG1ldGhvZFR5cGUgPSAiKEopViI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG4gaW5zdGFuY2VvZiBCaWdEZWNpbWFsKSB7CisgICAgICAgICAgICAgICAgbXYudmlzaXRMZGNJbnNuKG4udG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgbWV0aG9kVHlwZSA9ICIoTGphdmEvbGFuZy9TdHJpbmc7KVYiOworICAgICAgICAgICAgfSBlbHNlIGlmIChuIGluc3RhbmNlb2YgQmlnSW50ZWdlcikgeworICAgICAgICAgICAgICAgIG12LnZpc2l0TGRjSW5zbihuLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIG1ldGhvZFR5cGUgPSAiKExqYXZhL2xhbmcvU3RyaW5nOylWIjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobiBpbnN0YW5jZW9mIFNob3J0KSB7CisgICAgICAgICAgICAgICAgbXYudmlzaXRMZGNJbnNuKG4pOworICAgICAgICAgICAgICAgIG1ldGhvZFR5cGUgPSAiKFMpViI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG4gaW5zdGFuY2VvZiBCeXRlKSB7CisgICAgICAgICAgICAgICAgbXYudmlzaXRMZGNJbnNuKG4pOworICAgICAgICAgICAgICAgIG1ldGhvZFR5cGUgPSAiKEIpViI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc0dlbmVyYXRvckV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgZ2VuZXJhdGUgYnl0ZWNvZGUgZm9yIGNvbnN0YW50OiAiICsgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG9mIHR5cGU6ICIgKyB2YWx1ZS5nZXRDbGFzcygpLmdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIuICBOdW1lcmljIGNvbnN0YW50IHR5cGUgbm90IHN1cHBvcnRlZC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG12LnZpc2l0TWV0aG9kSW5zbihJTlZPS0VTUEVDSUFMLCBjbGFzc05hbWUsICI8aW5pdD4iLCBtZXRob2RUeXBlKTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW4pIHsKKyAgICAgICAgICAgIEJvb2xlYW4gYm9vbCA9IChCb29sZWFuKSB2YWx1ZTsKKyAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gKGJvb2wuYm9vbGVhblZhbHVlKCkpID8gIlRSVUUiIDogIkZBTFNFIjsKKyAgICAgICAgICAgIG12LnZpc2l0RmllbGRJbnNuKEdFVFNUQVRJQywgImphdmEvbGFuZy9Cb29sZWFuIiwgdGV4dCwgIkxqYXZhL2xhbmcvQm9vbGVhbjsiKTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIENsYXNzKSB7CisgICAgICAgICAgICBDbGFzcyB2YyA9IChDbGFzcykgdmFsdWU7CisgICAgICAgICAgICBpZiAodmMuZ2V0TmFtZSgpLmVxdWFscygiamF2YS5sYW5nLlZvaWQiKSkgeworICAgICAgICAgICAgICAgIC8vIGxvYWQgbm90aGluZyBoZXJlIGZvciB2b2lkCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc0dlbmVyYXRvckV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgZ2VuZXJhdGUgYnl0ZWNvZGUgZm9yIGNvbnN0YW50OiAiICsgdmFsdWUgKyAiIG9mIHR5cGU6ICIgKyB2YWx1ZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NHZW5lcmF0b3JFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgZ2VuZXJhdGUgYnl0ZWNvZGUgZm9yIGNvbnN0YW50OiAiICsgdmFsdWUgKyAiIG9mIHR5cGU6ICIgKyB2YWx1ZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIGxvYWQgdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSBvbiB0aGUgb3BlcmFuZCBzdGFjay4gdW5ib3ggaXQgaWYgaXQncyBhIHJlZmVyZW5jZQorICAgICAqCisgICAgICogQHBhcmFtIHZhcmlhYmxlCisgICAgICovCisgICAgcHVibGljIHZvaWQgbG9hZFZhcihWYXJpYWJsZSB2YXJpYWJsZSkgeworICAgICAgICBpbnQgaW5kZXggPSB2YXJpYWJsZS5nZXRJbmRleCgpOworICAgICAgICBpZiAodmFyaWFibGUuaXNIb2xkZXIoKSkgeworICAgICAgICAgICAgbXYudmlzaXRWYXJJbnNuKEFMT0FELCBpbmRleCk7CisgICAgICAgICAgICBtdi52aXNpdE1ldGhvZEluc24oSU5WT0tFVklSVFVBTCwgImdyb292eS9sYW5nL1JlZmVyZW5jZSIsICJnZXQiLCAiKClMamF2YS9sYW5nL09iamVjdDsiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxvYWQodmFyaWFibGUpOworICAgICAgICAgICAgaWYgKHZhcmlhYmxlICE9IFZhcmlhYmxlLlRISVNfVkFSSUFCTEUgJiYgdmFyaWFibGUgIT0gVmFyaWFibGUuU1VQRVJfVkFSSUFCTEUpIHsKKyAgICAgICAgICAgICAgICBib3godmFyaWFibGUuZ2V0VHlwZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3JlVmFyKFZhcmlhYmxlIHZhcmlhYmxlKSB7CisgICAgICAgIFN0cmluZyB0eXBlID0gdmFyaWFibGUuZ2V0VHlwZU5hbWUoKTsKKyAgICAgICAgaW50IGluZGV4ID0gdmFyaWFibGUuZ2V0SW5kZXgoKTsKKworICAgICAgICBpZiAodmFyaWFibGUuaXNIb2xkZXIoKSkgeworICAgICAgICAgICAgbXYudmlzaXRWYXJJbnNuKEFMT0FELCBpbmRleCk7CisgICAgICAgICAgICBtdi52aXNpdEluc24oU1dBUCk7CisgICAgICAgICAgICBtdi52aXNpdE1ldGhvZEluc24oSU5WT0tFVklSVFVBTCwgImdyb292eS9sYW5nL1JlZmVyZW5jZSIsICJzZXQiLCAiKExqYXZhL2xhbmcvT2JqZWN0OylWIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdG9yZSh2YXJpYWJsZSwgZmFsc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHV0RmllbGQoRmllbGROb2RlIGZsZCkgeworICAgICAgICBwdXRGaWVsZChmbGQsIGdldENsYXNzSW50ZXJuYWxOYW1lKGZsZC5nZXRPd25lcigpKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHV0RmllbGQoRmllbGROb2RlIGZsZCwgU3RyaW5nIG93bmVyTmFtZSkgeworICAgICAgICBtdi52aXNpdEZpZWxkSW5zbihQVVRGSUVMRCwgb3duZXJOYW1lLCBmbGQuZ2V0TmFtZSgpLCBnZXRUeXBlRGVzY3JpcHRpb24oZmxkLmdldFR5cGUoKSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN3YXBPYmplY3RXaXRoKENsYXNzTm9kZSB0eXBlKSB7CisgICAgICAgIGlmICh0eXBlID09IENsYXNzSGVscGVyLmxvbmdfVFlQRSB8fCB0eXBlID09IENsYXNzSGVscGVyLmRvdWJsZV9UWVBFKSB7CisgICAgICAgICAgICBtdi52aXNpdEluc24oRFVQX1gyKTsKKyAgICAgICAgICAgIG12LnZpc2l0SW5zbihQT1ApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbXYudmlzaXRJbnNuKFNXQVApOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3dhcFdpdGhPYmplY3QoQ2xhc3NOb2RlIHR5cGUpIHsKKyAgICAgICAgaWYgKHR5cGUgPT0gQ2xhc3NIZWxwZXIubG9uZ19UWVBFIHx8IHR5cGUgPT0gQ2xhc3NIZWxwZXIuZG91YmxlX1RZUEUpIHsKKyAgICAgICAgICAgIG12LnZpc2l0SW5zbihEVVAyX1gxKTsKKyAgICAgICAgICAgIG12LnZpc2l0SW5zbihQT1AyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG12LnZpc2l0SW5zbihTV0FQKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3NOb2RlIGJveE9uUHJpbWl0aXZlKENsYXNzTm9kZSB0eXBlKSB7CisgICAgICAgIGlmICghdHlwZS5pc0FycmF5KCkpIHJldHVybiBDbGFzc0hlbHBlci5nZXRXcmFwcGVyKHR5cGUpOworICAgICAgICByZXR1cm4gYm94T25QcmltaXRpdmUodHlwZS5nZXRDb21wb25lbnRUeXBlKCkpLm1ha2VBcnJheSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGNvbnZlcnQgYm9vbGVhbiB0byBCb29sZWFuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYm94Qm9vbGVhbigpIHsKKyAgICAgICAgTGFiZWwgbDAgPSBuZXcgTGFiZWwoKTsKKyAgICAgICAgbXYudmlzaXRKdW1wSW5zbihJRkVRLCBsMCk7CisgICAgICAgIG12LnZpc2l0RmllbGRJbnNuKEdFVFNUQVRJQywgImphdmEvbGFuZy9Cb29sZWFuIiwgIlRSVUUiLCAiTGphdmEvbGFuZy9Cb29sZWFuOyIpOworICAgICAgICBMYWJlbCBsMSA9IG5ldyBMYWJlbCgpOworICAgICAgICBtdi52aXNpdEp1bXBJbnNuKEdPVE8sIGwxKTsKKyAgICAgICAgbXYudmlzaXRMYWJlbChsMCk7CisgICAgICAgIG12LnZpc2l0RmllbGRJbnNuKEdFVFNUQVRJQywgImphdmEvbGFuZy9Cb29sZWFuIiwgIkZBTFNFIiwgIkxqYXZhL2xhbmcvQm9vbGVhbjsiKTsKKyAgICAgICAgbXYudmlzaXRMYWJlbChsMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogbmVnYXRlIGEgYm9vbGVhbiBvbiBzdGFjay4gdHJ1ZS0+ZmFsc2UsIGZhbHNlLT50cnVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgbmVnYXRlQm9vbGVhbigpIHsKKyAgICAgICAgLy8gY29kZSB0byBuZWdhdGUgdGhlIHByaW1pdGl2ZSBib29sZWFuCisgICAgICAgIExhYmVsIGVuZExhYmVsID0gbmV3IExhYmVsKCk7CisgICAgICAgIExhYmVsIGZhbHNlTGFiZWwgPSBuZXcgTGFiZWwoKTsKKyAgICAgICAgbXYudmlzaXRKdW1wSW5zbihJRk5FLCBmYWxzZUxhYmVsKTsKKyAgICAgICAgbXYudmlzaXRJbnNuKElDT05TVF8xKTsKKyAgICAgICAgbXYudmlzaXRKdW1wSW5zbihHT1RPLCBlbmRMYWJlbCk7CisgICAgICAgIG12LnZpc2l0TGFiZWwoZmFsc2VMYWJlbCk7CisgICAgICAgIG12LnZpc2l0SW5zbihJQ09OU1RfMCk7CisgICAgICAgIG12LnZpc2l0TGFiZWwoZW5kTGFiZWwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGxvYWQgYSBtZXNzYWdlIG9uIHRoZSBzdGFjayBhbmQgcmVtb3ZlIGl0IHJpZ2h0IGF3YXkuIEdvb2QgZm9yIHB1dCBhIG1hcmsgaW4gdGhlIGdlbmVyYXRlZCBieXRlY29kZSBmb3IgZGVidWdnaW5nIHB1cnBvc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbXNnCisgICAgICovCisgICAgcHVibGljIHZvaWQgbWFyayhTdHJpbmcgbXNnKSB7CisgICAgICAgIG12LnZpc2l0TGRjSW5zbihtc2cpOworICAgICAgICBtdi52aXNpdEluc24oUE9QKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZXR1cm5zIGEgbmFtZSB0aGF0IENsYXNzLmZvck5hbWUoKSBjYW4gdGFrZS4gTm90YWJsZWx5IGZvciBhcnJheXM6CisgICAgICogW0ksIFtMamF2YS5sYW5nLlN0cmluZzsgZXRjCisgICAgICogUmVndWxhciBvYmplY3QgdHlwZTogIGphdmEubGFuZy5TdHJpbmcKKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybWF0TmFtZUZvckNsYXNzTG9hZGluZyhTdHJpbmcgbmFtZSkgeworICAgICAgICBpZiAobmFtZS5lcXVhbHMoImludCIpCisgICAgICAgICAgICAgICAgfHwgbmFtZS5lcXVhbHMoImxvbmciKQorICAgICAgICAgICAgICAgIHx8IG5hbWUuZXF1YWxzKCJzaG9ydCIpCisgICAgICAgICAgICAgICAgfHwgbmFtZS5lcXVhbHMoImZsb2F0IikKKyAgICAgICAgICAgICAgICB8fCBuYW1lLmVxdWFscygiZG91YmxlIikKKyAgICAgICAgICAgICAgICB8fCBuYW1lLmVxdWFscygiYnl0ZSIpCisgICAgICAgICAgICAgICAgfHwgbmFtZS5lcXVhbHMoImNoYXIiKQorICAgICAgICAgICAgICAgIHx8IG5hbWUuZXF1YWxzKCJib29sZWFuIikKKyAgICAgICAgICAgICAgICB8fCBuYW1lLmVxdWFscygidm9pZCIpCisgICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiAiamF2YS5sYW5nLk9iamVjdDsiOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aCgiWyIpKSB7CisgICAgICAgICAgICByZXR1cm4gbmFtZS5yZXBsYWNlKCcvJywgJy4nKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoIkwiKSkgeworICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDEpOworICAgICAgICAgICAgaWYgKG5hbWUuZW5kc1dpdGgoIjsiKSkgeworICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxlbmd0aCgpIC0gMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmFtZS5yZXBsYWNlKCcvJywgJy4nKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBwcmVmaXggPSAiIjsKKyAgICAgICAgaWYgKG5hbWUuZW5kc1dpdGgoIltdIikpIHsgLy8gdG9kbyBuZWVkIHByb2Nlc3MgbXVsdGkKKyAgICAgICAgICAgIHByZWZpeCA9ICJbIjsKKyAgICAgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxlbmd0aCgpIC0gMik7CisgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoImludCIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeCArICJJIjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoImxvbmciKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXggKyAiSiI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJzaG9ydCIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeCArICJTIjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoImZsb2F0IikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgIkYiOworICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscygiZG91YmxlIikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgIkQiOworICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscygiYnl0ZSIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeCArICJCIjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoImNoYXIiKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXggKyAiQyI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJib29sZWFuIikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgIloiOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgIkwiICsgbmFtZS5yZXBsYWNlKCcvJywgJy4nKSArICI7IjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmFtZS5yZXBsYWNlKCcvJywgJy4nKTsKKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGR1cCgpIHsKKyAgICAgICAgbXYudmlzaXRJbnNuKERVUCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZG9SZXR1cm4oQ2xhc3NOb2RlIHJldHVyblR5cGUpIHsKKyAgICAgICAgaWYgKHJldHVyblR5cGUgPT0gQ2xhc3NIZWxwZXIuZG91YmxlX1RZUEUpIHsKKyAgICAgICAgICAgIG12LnZpc2l0SW5zbihEUkVUVVJOKTsKKyAgICAgICAgfSBlbHNlIGlmIChyZXR1cm5UeXBlID09IENsYXNzSGVscGVyLmZsb2F0X1RZUEUpIHsKKyAgICAgICAgICAgIG12LnZpc2l0SW5zbihGUkVUVVJOKTsKKyAgICAgICAgfSBlbHNlIGlmIChyZXR1cm5UeXBlID09IENsYXNzSGVscGVyLmxvbmdfVFlQRSkgeworICAgICAgICAgICAgbXYudmlzaXRJbnNuKExSRVRVUk4pOworICAgICAgICB9IGVsc2UgaWYgKAorICAgICAgICAgICAgICAgIHJldHVyblR5cGUgPT0gQ2xhc3NIZWxwZXIuYm9vbGVhbl9UWVBFCisgICAgICAgICAgICAgICAgICAgICAgICB8fCByZXR1cm5UeXBlID09IENsYXNzSGVscGVyLmNoYXJfVFlQRQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgcmV0dXJuVHlwZSA9PSBDbGFzc0hlbHBlci5ieXRlX1RZUEUKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IHJldHVyblR5cGUgPT0gQ2xhc3NIZWxwZXIuaW50X1RZUEUKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IHJldHVyblR5cGUgPT0gQ2xhc3NIZWxwZXIuc2hvcnRfVFlQRSkgeworICAgICAgICAgICAgLy9ieXRlLHNob3J0LGJvb2xlYW4saW50IGFyZSBhbGwgSVJFVFVSTgorICAgICAgICAgICAgbXYudmlzaXRJbnNuKElSRVRVUk4pOworICAgICAgICB9IGVsc2UgaWYgKHJldHVyblR5cGUgPT0gQ2xhc3NIZWxwZXIuVk9JRF9UWVBFKSB7CisgICAgICAgICAgICBtdi52aXNpdEluc24oUkVUVVJOKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG12LnZpc2l0SW5zbihBUkVUVVJOKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBoYXNHZW5lcmljcyhQYXJhbWV0ZXJbXSBwYXJhbSkgeworICAgICAgICBpZiAocGFyYW0ubGVuZ3RoID09IDApIHJldHVybiBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgQ2xhc3NOb2RlIHR5cGUgPSBwYXJhbVtpXS5nZXRUeXBlKCk7CisgICAgICAgICAgICBpZiAodHlwZS5nZXRHZW5lcmljc1R5cGVzKCkgIT0gbnVsbCkgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEdlbmVyaWNzTWV0aG9kU2lnbmF0dXJlKE1ldGhvZE5vZGUgbm9kZSkgeworICAgICAgICBHZW5lcmljc1R5cGVbXSBnZW5lcmljcyA9IG5vZGUuZ2V0R2VuZXJpY3NUeXBlcygpOworICAgICAgICBQYXJhbWV0ZXJbXSBwYXJhbSA9IG5vZGUuZ2V0UGFyYW1ldGVycygpOworICAgICAgICBDbGFzc05vZGUgcmV0dXJuVHlwZSA9IG5vZGUuZ2V0UmV0dXJuVHlwZSgpOworCisgICAgICAgIGlmIChnZW5lcmljcyA9PSBudWxsICYmICFoYXNHZW5lcmljcyhwYXJhbSkgJiYgcmV0dXJuVHlwZS5nZXRHZW5lcmljc1R5cGVzKCkgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisKKyAgICAgICAgU3RyaW5nQnVmZmVyIHJldCA9IG5ldyBTdHJpbmdCdWZmZXIoMTAwKTsKKyAgICAgICAgZ2V0R2VuZXJpY3NUeXBlU3BlYyhyZXQsIGdlbmVyaWNzKTsKKworICAgICAgICBHZW5lcmljc1R5cGVbXSBwYXJhbVR5cGVzID0gbmV3IEdlbmVyaWNzVHlwZVtwYXJhbS5sZW5ndGhdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBDbGFzc05vZGUgcFR5cGUgPSBwYXJhbVtpXS5nZXRUeXBlKCk7CisgICAgICAgICAgICBpZiAocFR5cGUuZ2V0R2VuZXJpY3NUeXBlcygpID09IG51bGwgfHwgIXBUeXBlLmlzR2VuZXJpY3NQbGFjZUhvbGRlcigpKSB7CisgICAgICAgICAgICAgICAgcGFyYW1UeXBlc1tpXSA9IG5ldyBHZW5lcmljc1R5cGUocFR5cGUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwYXJhbVR5cGVzW2ldID0gcFR5cGUuZ2V0R2VuZXJpY3NUeXBlcygpWzBdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFkZFN1YlR5cGVzKHJldCwgcGFyYW1UeXBlcywgIigiLCAiKSIpOworICAgICAgICBpZiAocmV0dXJuVHlwZS5pc0dlbmVyaWNzUGxhY2VIb2xkZXIoKSkgeworICAgICAgICAgICAgYWRkU3ViVHlwZXMocmV0LCByZXR1cm5UeXBlLmdldEdlbmVyaWNzVHlwZXMoKSwgIiIsICIiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdyaXRlR2VuZXJpY3NCb3VuZHMocmV0LCBuZXcgR2VuZXJpY3NUeXBlKHJldHVyblR5cGUpLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldC50b1N0cmluZygpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gdXNlc0dlbmVyaWNzSW5DbGFzc1NpZ25hdHVyZShDbGFzc05vZGUgbm9kZSkgeworICAgICAgICBpZiAoIW5vZGUuaXNVc2luZ0dlbmVyaWNzKCkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKG5vZGUuZ2V0R2VuZXJpY3NUeXBlcygpICE9IG51bGwpIHJldHVybiB0cnVlOworICAgICAgICBDbGFzc05vZGUgc2NsYXNzID0gbm9kZS5nZXRVbnJlc29sdmVkU3VwZXJDbGFzcyhmYWxzZSk7CisgICAgICAgIGlmIChzY2xhc3MuaXNVc2luZ0dlbmVyaWNzKCkpIHJldHVybiB0cnVlOworICAgICAgICBDbGFzc05vZGVbXSBpbnRlcmZhY2VzID0gbm9kZS5nZXRJbnRlcmZhY2VzKCk7CisgICAgICAgIGlmIChpbnRlcmZhY2VzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJmYWNlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChpbnRlcmZhY2VzW2ldLmlzVXNpbmdHZW5lcmljcygpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRHZW5lcmljc1NpZ25hdHVyZShDbGFzc05vZGUgbm9kZSkgeworICAgICAgICBpZiAoIXVzZXNHZW5lcmljc0luQ2xhc3NTaWduYXR1cmUobm9kZSkpIHJldHVybiBudWxsOworICAgICAgICBHZW5lcmljc1R5cGVbXSBnZW5lcmljc1R5cGVzID0gbm9kZS5nZXRHZW5lcmljc1R5cGVzKCk7CisgICAgICAgIFN0cmluZ0J1ZmZlciByZXQgPSBuZXcgU3RyaW5nQnVmZmVyKDEwMCk7CisgICAgICAgIGdldEdlbmVyaWNzVHlwZVNwZWMocmV0LCBnZW5lcmljc1R5cGVzKTsKKyAgICAgICAgR2VuZXJpY3NUeXBlIGV4dGVuZHNQYXJ0ID0gbmV3IEdlbmVyaWNzVHlwZShub2RlLmdldFVucmVzb2x2ZWRTdXBlckNsYXNzKGZhbHNlKSk7CisgICAgICAgIHdyaXRlR2VuZXJpY3NCb3VuZHMocmV0LCBleHRlbmRzUGFydCwgdHJ1ZSk7CisgICAgICAgIENsYXNzTm9kZVtdIGludGVyZmFjZXMgPSBub2RlLmdldEludGVyZmFjZXMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcmZhY2VzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBHZW5lcmljc1R5cGUgaW50ZXJmYWNlUGFydCA9IG5ldyBHZW5lcmljc1R5cGUoaW50ZXJmYWNlc1tpXSk7CisgICAgICAgICAgICB3cml0ZUdlbmVyaWNzQm91bmRzKHJldCwgaW50ZXJmYWNlUGFydCwgZmFsc2UpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGdldEdlbmVyaWNzVHlwZVNwZWMoU3RyaW5nQnVmZmVyIHJldCwgR2VuZXJpY3NUeXBlW10gZ2VuZXJpY3NUeXBlcykgeworICAgICAgICBpZiAoZ2VuZXJpY3NUeXBlcyA9PSBudWxsKSByZXR1cm47CisgICAgICAgIHJldC5hcHBlbmQoJzwnKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBnZW5lcmljc1R5cGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGdlbmVyaWNzVHlwZXNbaV0uZ2V0TmFtZSgpOworICAgICAgICAgICAgcmV0LmFwcGVuZChuYW1lKTsKKyAgICAgICAgICAgIHJldC5hcHBlbmQoJzonKTsKKyAgICAgICAgICAgIHdyaXRlR2VuZXJpY3NCb3VuZHMocmV0LCBnZW5lcmljc1R5cGVzW2ldLCB0cnVlKTsKKyAgICAgICAgfQorICAgICAgICByZXQuYXBwZW5kKCc+Jyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0R2VuZXJpY3NCb3VuZHMoQ2xhc3NOb2RlIHR5cGUpIHsKKyAgICAgICAgR2VuZXJpY3NUeXBlW10gZ2VuZXJpY3NUeXBlcyA9IHR5cGUuZ2V0R2VuZXJpY3NUeXBlcygpOworICAgICAgICBpZiAoZ2VuZXJpY3NUeXBlcyA9PSBudWxsKSByZXR1cm4gbnVsbDsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHJldCA9IG5ldyBTdHJpbmdCdWZmZXIoMTAwKTsKKyAgICAgICAgaWYgKHR5cGUuaXNHZW5lcmljc1BsYWNlSG9sZGVyKCkpIHsKKyAgICAgICAgICAgIGFkZFN1YlR5cGVzKHJldCwgdHlwZS5nZXRHZW5lcmljc1R5cGVzKCksICIiLCAiIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBHZW5lcmljc1R5cGUgZ3QgPSBuZXcgR2VuZXJpY3NUeXBlKHR5cGUpOworICAgICAgICAgICAgd3JpdGVHZW5lcmljc0JvdW5kcyhyZXQsIGd0LCBmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmV0LnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZUdlbmVyaWNzQm91bmRUeXBlKFN0cmluZ0J1ZmZlciByZXQsIENsYXNzTm9kZSBwcmludFR5cGUsIGJvb2xlYW4gd3JpdGVJbnRlcmZhY2VNYXJrZXIpIHsKKyAgICAgICAgaWYgKHdyaXRlSW50ZXJmYWNlTWFya2VyICYmIHByaW50VHlwZS5pc0ludGVyZmFjZSgpKSByZXQuYXBwZW5kKCI6Iik7CisgICAgICAgIHJldC5hcHBlbmQoZ2V0VHlwZURlc2NyaXB0aW9uKHByaW50VHlwZSwgZmFsc2UpKTsKKyAgICAgICAgYWRkU3ViVHlwZXMocmV0LCBwcmludFR5cGUuZ2V0R2VuZXJpY3NUeXBlcygpLCAiPCIsICI+Iik7CisgICAgICAgIGlmICghQ2xhc3NIZWxwZXIuaXNQcmltaXRpdmVUeXBlKHByaW50VHlwZSkpIHJldC5hcHBlbmQoIjsiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlR2VuZXJpY3NCb3VuZHMoU3RyaW5nQnVmZmVyIHJldCwgR2VuZXJpY3NUeXBlIHR5cGUsIGJvb2xlYW4gd3JpdGVJbnRlcmZhY2VNYXJrZXIpIHsKKyAgICAgICAgaWYgKHR5cGUuZ2V0VXBwZXJCb3VuZHMoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBDbGFzc05vZGVbXSBib3VuZHMgPSB0eXBlLmdldFVwcGVyQm91bmRzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJvdW5kcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIHdyaXRlR2VuZXJpY3NCb3VuZFR5cGUocmV0LCBib3VuZHNbaV0sIHdyaXRlSW50ZXJmYWNlTWFya2VyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh0eXBlLmdldExvd2VyQm91bmQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICB3cml0ZUdlbmVyaWNzQm91bmRUeXBlKHJldCwgdHlwZS5nZXRMb3dlckJvdW5kKCksIHdyaXRlSW50ZXJmYWNlTWFya2VyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdyaXRlR2VuZXJpY3NCb3VuZFR5cGUocmV0LCB0eXBlLmdldFR5cGUoKSwgd3JpdGVJbnRlcmZhY2VNYXJrZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRTdWJUeXBlcyhTdHJpbmdCdWZmZXIgcmV0LCBHZW5lcmljc1R5cGVbXSB0eXBlcywgU3RyaW5nIHN0YXJ0LCBTdHJpbmcgZW5kKSB7CisgICAgICAgIGlmICh0eXBlcyA9PSBudWxsKSByZXR1cm47CisgICAgICAgIHJldC5hcHBlbmQoc3RhcnQpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHR5cGVzW2ldLmdldE5hbWUoKTsKKyAgICAgICAgICAgIGlmICh0eXBlc1tpXS5pc1BsYWNlaG9sZGVyKCkpIHsKKyAgICAgICAgICAgICAgICByZXQuYXBwZW5kKCdUJyk7CisgICAgICAgICAgICAgICAgcmV0LmFwcGVuZChuYW1lKTsKKyAgICAgICAgICAgICAgICByZXQuYXBwZW5kKCc7Jyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVzW2ldLmlzV2lsZGNhcmQoKSkgeworICAgICAgICAgICAgICAgIGlmICh0eXBlc1tpXS5nZXRVcHBlckJvdW5kcygpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0LmFwcGVuZCgnKycpOworICAgICAgICAgICAgICAgICAgICB3cml0ZUdlbmVyaWNzQm91bmRzKHJldCwgdHlwZXNbaV0sIGZhbHNlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVzW2ldLmdldExvd2VyQm91bmQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldC5hcHBlbmQoJy0nKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVHZW5lcmljc0JvdW5kcyhyZXQsIHR5cGVzW2ldLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0LmFwcGVuZCgnKicpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgd3JpdGVHZW5lcmljc0JvdW5kcyhyZXQsIHR5cGVzW2ldLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0LmFwcGVuZChlbmQpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vQnl0ZWNvZGVJbnN0cnVjdGlvbi5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vQnl0ZWNvZGVJbnN0cnVjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YjgwMmQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9CeXRlY29kZUluc3RydWN0aW9uLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoNCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4NCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW47DQorDQoraW1wb3J0IG9yZy5vYmplY3R3ZWIuYXNtLk1ldGhvZFZpc2l0b3I7DQorDQorLyoqDQorICogSGVscGVyIGNsYXNzIHVzZWQgYnkgdGhlIGNsYXNzIGdlbmVyYXRvci4gVXN1YWxseQ0KKyAqIGFuIGlubmVyIGNsYXNzIGlzIHByb2R1Y2VkLCB0aGF0IGNvbnRhaW5zIGJ5dGVjb2RlDQorICogY3JlYXRpb24gY29kZSBpbiB0aGUgdmlzaXQgbWV0aG9kLg0KKyAqDQorICogQGF1dGhvciBKb2NoZW4gVGhlb2Rvcm91DQorICovDQorcHVibGljIGFic3RyYWN0IGNsYXNzIEJ5dGVjb2RlSW5zdHJ1Y3Rpb24gew0KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB2aXNpdChNZXRob2RWaXNpdG9yIG12KTsNCit9DQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vQnl0ZWNvZGVTZXF1ZW5jZS5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vQnl0ZWNvZGVTZXF1ZW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwZTY5NTkKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9CeXRlY29kZVNlcXVlbmNlLmphdmEKQEAgLTAsMCArMSw3MiBAQAorLyoNCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4NCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW47DQorDQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LkFTVE5vZGU7DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0Lkdyb292eUNvZGVWaXNpdG9yOw0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5zdG10LlN0YXRlbWVudDsNCisNCisvKioNCisgKiBUaGlzIGNsYXNzIHJlcGVyc2VudHMgYSBzZXF1ZW5jZSBvZiBCeXRlY29kZUluc3RydWN0aW9ucw0KKyAqIG9yIEFTVE5vZGVzLiBUaGUgZXZhbHVhdGlvbiBpcyBkcGVlbmRpbmcgb24gdGhlIHR5cGUgb2YgDQorICogdGhlIHZpc2l0b3IuDQorICogDQorICogQHNlZSBCeXRlY29kZUluc3RydWN0aW9uDQorICogQHNlZSBBU1ROb2RlDQorICovDQorDQorcHVibGljIGNsYXNzIEJ5dGVjb2RlU2VxdWVuY2UgZXh0ZW5kcyBTdGF0ZW1lbnQgew0KKyAgICBwcml2YXRlIGZpbmFsIExpc3QgaW5zdHJ1Y3Rpb25zOw0KKyAgICBwdWJsaWMgQnl0ZWNvZGVTZXF1ZW5jZShMaXN0IGluc3RydWN0aW9ucykgew0KKyAgICAgICAgdGhpcy5pbnN0cnVjdGlvbnMgPSBpbnN0cnVjdGlvbnM7DQorICAgIH0NCisgICAgDQorICAgIC8qKg0KKyAgICAgKiBEZWxlZ2F0ZXMgdG8gdGhlIHZpc2l0IG1ldGhvZCB1c2VkIGZvciB0aGlzIGNsYXNzLg0KKyAgICAgKiBJZiB0aGUgdmlzaXRvciBpcyBhIENsYXNzR2VuZXJhdG9yLCB0aGVuIA0KKyAgICAgKiB7QGxpbmsgQ2xhc3NHZW5lcmF0b3IjdmlzaXRCeXRlY29kZVNlcXVlbmNlKEJ5dGVjb2RlU2VxdWVuY2UpfQ0KKyAgICAgKiBpcyBjYWxsZWQgd2l0aCB0aGlzIGluc3RhbmNlLiBJZiB0aGUgdmlzaXRvciBpcyBubyANCisgICAgICogQ2xhc3NHZW5lcmF0b3IsIHRoZW4gdGhpcyBtZXRob2Qgd2lsbCBjYWxsIHZpc2l0IG9uDQorICAgICAqIGVhY2ggQVNUTm9kZSBlbGVtZW50IHNvdHJlZCBieSB0aGlzIGNsYXNzLiBJZiBvbmUgDQorICAgICAqIGVsZW1lbnQgaXMgYSBCeXRlY29kZUluc3RydWN0aW9uLCB0aGVuIGl0IHdpbGwgYmUgc2tpcHBlZA0KKyAgICAgKiBhcyBpdCBpcyBubyBBU1ROb2RlLiANCisgICAgICogDQorICAgICAqIEBwYXJhbSB2aXNpdG9yIHRoZSB2aXNpdG9yDQorICAgICAqIEBzZWUgQ2xhc3NHZW5lcmF0b3INCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KEdyb292eUNvZGVWaXNpdG9yIHZpc2l0b3IpIHsNCisgICAgICAgIGlmICh2aXNpdG9yIGluc3RhbmNlb2YgQ2xhc3NHZW5lcmF0b3IpIHsNCisgICAgICAgICAgICBDbGFzc0dlbmVyYXRvciBnZW4gPSAoQ2xhc3NHZW5lcmF0b3IpIHZpc2l0b3I7DQorICAgICAgICAgICAgZ2VuLnZpc2l0Qnl0ZWNvZGVTZXF1ZW5jZSh0aGlzKTsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gaW5zdHJ1Y3Rpb25zLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsNCisgICAgICAgICAgICBPYmplY3QgcGFydCA9IChPYmplY3QpIGl0ZXJhdG9yLm5leHQoKTsNCisgICAgICAgICAgICBpZiAocGFydCBpbnN0YW5jZW9mIEFTVE5vZGUpIHsNCisgICAgICAgICAgICAgICAgKChBU1ROb2RlKXBhcnQpLnZpc2l0KHZpc2l0b3IpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgTGlzdCBnZXRJbnN0cnVjdGlvbnMoKSB7DQorICAgICAgICByZXR1cm4gaW5zdHJ1Y3Rpb25zOw0KKyAgICB9DQorDQorfQ0KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL0NsYXNzQ29tcGxldGlvblZlcmlmaWVyLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9DbGFzc0NvbXBsZXRpb25WZXJpZmllci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYThkNjYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9DbGFzc0NvbXBsZXRpb25WZXJpZmllci5qYXZhCkBAIC0wLDAgKzEsMzEyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiBHcm9vdnkgY29tbXVuaXR5IC0gc3Vic2VxdWVudCBtb2RpZmljYXRpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuQ2xhc3NDb2RlVmlzaXRvclN1cHBvcnQ7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuQ2xhc3NIZWxwZXI7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuQ2xhc3NOb2RlOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LkZpZWxkTm9kZTsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5NZXRob2ROb2RlOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LlBhcmFtZXRlcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByLkJpbmFyeUV4cHJlc3Npb247CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuZXhwci5Db25zdHJ1Y3RvckNhbGxFeHByZXNzaW9uOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHIuTWFwRW50cnlFeHByZXNzaW9uOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuQ2F0Y2hTdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLlNvdXJjZVVuaXQ7CitpbXBvcnQgb3JnLm9iamVjdHdlYi5hc20uT3Bjb2RlczsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5UeXBlczsKKworLyoqCisgKiBDbGFzc0NvbXBsZXRpb25WZXJpZmllcgorICovCitwdWJsaWMgY2xhc3MgQ2xhc3NDb21wbGV0aW9uVmVyaWZpZXIgZXh0ZW5kcyBDbGFzc0NvZGVWaXNpdG9yU3VwcG9ydCB7CisKKyAgICBwcml2YXRlIENsYXNzTm9kZSBjdXJyZW50Q2xhc3M7CisgICAgcHJpdmF0ZSBTb3VyY2VVbml0IHNvdXJjZTsKKworICAgIHB1YmxpYyBDbGFzc0NvbXBsZXRpb25WZXJpZmllcihTb3VyY2VVbml0IHNvdXJjZSkgeworICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3NOb2RlIGdldENsYXNzTm9kZSgpIHsKKyAgICAgICAgcmV0dXJuIGN1cnJlbnRDbGFzczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdENsYXNzKENsYXNzTm9kZSBub2RlKSB7CisgICAgICAgIENsYXNzTm9kZSBvbGRDbGFzcyA9IGN1cnJlbnRDbGFzczsKKyAgICAgICAgY3VycmVudENsYXNzID0gbm9kZTsKKyAgICAgICAgY2hlY2tJbXBsZW1lbnRzQW5kRXh0ZW5kcyhub2RlKTsKKyAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxsICYmICFzb3VyY2UuZ2V0RXJyb3JDb2xsZWN0b3IoKS5oYXNFcnJvcnMoKSkgeworICAgICAgICAgICAgY2hlY2tDbGFzc0ZvckluY29ycmVjdE1vZGlmaWVycyhub2RlKTsKKyAgICAgICAgICAgIGNoZWNrQ2xhc3NGb3JPdmVyd3JpdGluZ0ZpbmFsKG5vZGUpOworICAgICAgICAgICAgY2hlY2tNZXRob2RzRm9ySW5jb3JyZWN0TW9kaWZpZXJzKG5vZGUpOworICAgICAgICAgICAgY2hlY2tNZXRob2RzRm9yT3ZlcndyaXRpbmdGaW5hbChub2RlKTsKKyAgICAgICAgICAgIGNoZWNrTm9BYnN0cmFjdE1ldGhvZHNOb25hYnN0cmFjdENsYXNzKG5vZGUpOworICAgICAgICB9CisgICAgICAgIHN1cGVyLnZpc2l0Q2xhc3Mobm9kZSk7CisgICAgICAgIGN1cnJlbnRDbGFzcyA9IG9sZENsYXNzOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja05vQWJzdHJhY3RNZXRob2RzTm9uYWJzdHJhY3RDbGFzcyhDbGFzc05vZGUgbm9kZSkgeworICAgICAgICBpZiAoTW9kaWZpZXIuaXNBYnN0cmFjdChub2RlLmdldE1vZGlmaWVycygpKSkgcmV0dXJuOworICAgICAgICBMaXN0IGFic3RyYWN0TWV0aG9kcyA9IG5vZGUuZ2V0QWJzdHJhY3RNZXRob2RzKCk7CisgICAgICAgIGlmIChhYnN0cmFjdE1ldGhvZHMgPT0gbnVsbCkgcmV0dXJuOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhYnN0cmFjdE1ldGhvZHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBNZXRob2ROb2RlIG1ldGhvZCA9IChNZXRob2ROb2RlKSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIFN0cmluZyBtZXRob2ROYW1lID0gbWV0aG9kLmdldFR5cGVEZXNjcmlwdG9yKCk7CisgICAgICAgICAgICBhZGRFcnJvcigiQ2FuJ3QgaGF2ZSBhbiBhYnN0cmFjdCBtZXRob2QgaW4gYSBub24tYWJzdHJhY3QgY2xhc3MuIiArCisgICAgICAgICAgICAgICAgICAgICIgVGhlICIgKyBnZXREZXNjcmlwdGlvbihub2RlKSArICIgbXVzdCBiZSBkZWNsYXJlZCBhYnN0cmFjdCBvciIgKworICAgICAgICAgICAgICAgICAgICAiIHRoZSAiICsgZ2V0RGVzY3JpcHRpb24obWV0aG9kKSArICIgbXVzdCBiZSBpbXBsZW1lbnRlZC4iLCBub2RlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja0NsYXNzRm9ySW5jb3JyZWN0TW9kaWZpZXJzKENsYXNzTm9kZSBub2RlKSB7CisgICAgICAgIGNoZWNrQ2xhc3NGb3JBYnN0cmFjdEFuZEZpbmFsKG5vZGUpOworICAgICAgICBjaGVja0NsYXNzRm9yT3RoZXJNb2RpZmllcnMobm9kZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrQ2xhc3NGb3JBYnN0cmFjdEFuZEZpbmFsKENsYXNzTm9kZSBub2RlKSB7CisgICAgICAgIGlmICghTW9kaWZpZXIuaXNBYnN0cmFjdChub2RlLmdldE1vZGlmaWVycygpKSkgcmV0dXJuOworICAgICAgICBpZiAoIU1vZGlmaWVyLmlzRmluYWwobm9kZS5nZXRNb2RpZmllcnMoKSkpIHJldHVybjsKKyAgICAgICAgaWYgKG5vZGUuaXNJbnRlcmZhY2UoKSkgeworICAgICAgICAgICAgYWRkRXJyb3IoIlRoZSAiICsgZ2V0RGVzY3JpcHRpb24obm9kZSkgKyIgbXVzdCBub3QgYmUgZmluYWwuIEl0IGlzIGJ5IGRlZmluaXRpb24gYWJzdHJhY3QuIiwgbm9kZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhZGRFcnJvcigiVGhlICIgKyBnZXREZXNjcmlwdGlvbihub2RlKSArICIgbXVzdCBub3QgYmUgYm90aCBmaW5hbCBhbmQgYWJzdHJhY3QuIiwgbm9kZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tDbGFzc0Zvck90aGVyTW9kaWZpZXJzKENsYXNzTm9kZSBub2RlKSB7CisgICAgICAgIC8vIFRPRE86IHdvcmsgb3V0IHdoeSAic3luY2hyb25pc2VkIiBjYW4ndCBiZSB1c2VkIGhlcmUKKyAgICAgICAgY2hlY2tDbGFzc0Zvck1vZGlmaWVyKG5vZGUsIE1vZGlmaWVyLmlzVHJhbnNpZW50KG5vZGUuZ2V0TW9kaWZpZXJzKCkpLCAidHJhbnNpZW50Iik7CisgICAgICAgIGNoZWNrQ2xhc3NGb3JNb2RpZmllcihub2RlLCBNb2RpZmllci5pc1ZvbGF0aWxlKG5vZGUuZ2V0TW9kaWZpZXJzKCkpLCAidm9sYXRpbGUiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tDbGFzc0Zvck1vZGlmaWVyKENsYXNzTm9kZSBub2RlLCBib29sZWFuIGNvbmRpdGlvbiwgU3RyaW5nIG1vZGlmaWVyTmFtZSkgeworICAgICAgICBpZiAoIWNvbmRpdGlvbikgcmV0dXJuOworICAgICAgICBhZGRFcnJvcigiVGhlICIgKyBnZXREZXNjcmlwdGlvbihub2RlKSArICIgaGFzIGFuIGluY29ycmVjdCBtb2RpZmllciAiICsgbW9kaWZpZXJOYW1lICsgIi4iLCBub2RlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXREZXNjcmlwdGlvbihDbGFzc05vZGUgbm9kZSkgeworICAgICAgICByZXR1cm4gKG5vZGUuaXNJbnRlcmZhY2UoKSA/ICJpbnRlcmZhY2UiIDogImNsYXNzIikgKyAiICciICsgbm9kZS5nZXROYW1lKCkgKyAiJyI7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oTWV0aG9kTm9kZSBub2RlKSB7CisgICAgICAgIHJldHVybiAibWV0aG9kICciICsgbm9kZS5nZXRUeXBlRGVzY3JpcHRvcigpICsgIiciOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldERlc2NyaXB0aW9uKEZpZWxkTm9kZSBub2RlKSB7CisgICAgICAgIHJldHVybiAiZmllbGQgJyIgKyBub2RlLmdldE5hbWUoKSArICInIjsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tBYnN0cmFjdERlY2xhcmF0aW9uKE1ldGhvZE5vZGUgbWV0aG9kTm9kZSkgeworICAgICAgICBpZiAoIU1vZGlmaWVyLmlzQWJzdHJhY3QobWV0aG9kTm9kZS5nZXRNb2RpZmllcnMoKSkpIHJldHVybjsKKyAgICAgICAgaWYgKE1vZGlmaWVyLmlzQWJzdHJhY3QoY3VycmVudENsYXNzLmdldE1vZGlmaWVycygpKSkgcmV0dXJuOworICAgICAgICBhZGRFcnJvcigiQ2FuJ3QgaGF2ZSBhbiBhYnN0cmFjdCBtZXRob2QgaW4gYSBub24tYWJzdHJhY3QgY2xhc3MuIiArCisgICAgICAgICAgICAgICAgIiBUaGUgIiArIGdldERlc2NyaXB0aW9uKGN1cnJlbnRDbGFzcykgKyAiIG11c3QgYmUgZGVjbGFyZWQgYWJzdHJhY3Qgb3IgdGhlIG1ldGhvZCAnIiArCisgICAgICAgICAgICAgICAgbWV0aG9kTm9kZS5nZXRUeXBlRGVzY3JpcHRvcigpICsgIicgbXVzdCBub3QgYmUgYWJzdHJhY3QuIiwgbWV0aG9kTm9kZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrQ2xhc3NGb3JPdmVyd3JpdGluZ0ZpbmFsKENsYXNzTm9kZSBjbikgeworICAgICAgICBDbGFzc05vZGUgc3VwZXJDTiA9IGNuLmdldFN1cGVyQ2xhc3MoKTsKKyAgICAgICAgaWYgKHN1cGVyQ04gPT0gbnVsbCkgcmV0dXJuOworICAgICAgICBpZiAoIU1vZGlmaWVyLmlzRmluYWwoc3VwZXJDTi5nZXRNb2RpZmllcnMoKSkpIHJldHVybjsKKyAgICAgICAgU3RyaW5nQnVmZmVyIG1zZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgbXNnLmFwcGVuZCgiWW91IGFyZSBub3QgYWxsb3dlZCB0byBvdmVyd3JpdGUgdGhlIGZpbmFsICIpOworICAgICAgICBtc2cuYXBwZW5kKGdldERlc2NyaXB0aW9uKHN1cGVyQ04pKTsKKyAgICAgICAgbXNnLmFwcGVuZCgiLiIpOworICAgICAgICBhZGRFcnJvcihtc2cudG9TdHJpbmcoKSwgY24pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja0ltcGxlbWVudHNBbmRFeHRlbmRzKENsYXNzTm9kZSBub2RlKSB7CisgICAgICAgIENsYXNzTm9kZSBjbiA9IG5vZGUuZ2V0U3VwZXJDbGFzcygpOworICAgICAgICBpZiAoY24uaXNJbnRlcmZhY2UoKSAmJiAhbm9kZS5pc0ludGVyZmFjZSgpKSB7CisgICAgICAgICAgICBhZGRFcnJvcigiWW91IGFyZSBub3QgYWxsb3dlZCB0byBleHRlbmQgdGhlICIgKyBnZXREZXNjcmlwdGlvbihjbikgKyAiLCB1c2UgaW1wbGVtZW50cyBpbnN0ZWFkLiIsIG5vZGUpOworICAgICAgICB9CisgICAgICAgIENsYXNzTm9kZVtdIGludGVyZmFjZXMgPSBub2RlLmdldEludGVyZmFjZXMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcmZhY2VzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjbiA9IGludGVyZmFjZXNbaV07CisgICAgICAgICAgICBpZiAoIWNuLmlzSW50ZXJmYWNlKCkpIHsKKyAgICAgICAgICAgICAgICBhZGRFcnJvcigiWW91IGFyZSBub3QgYWxsb3dlZCB0byBpbXBsZW1lbnQgdGhlICIgKyBnZXREZXNjcmlwdGlvbihjbikgKyAiLCB1c2UgZXh0ZW5kcyBpbnN0ZWFkLiIsIG5vZGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrTWV0aG9kc0ZvckluY29ycmVjdE1vZGlmaWVycyhDbGFzc05vZGUgY24pIHsKKyAgICAgICAgaWYgKCFjbi5pc0ludGVyZmFjZSgpKSByZXR1cm47CisgICAgICAgIExpc3QgbWV0aG9kcyA9IGNuLmdldE1ldGhvZHMoKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBjbkl0ZXIgPSBtZXRob2RzLml0ZXJhdG9yKCk7IGNuSXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBNZXRob2ROb2RlIG1ldGhvZCA9IChNZXRob2ROb2RlKSBjbkl0ZXIubmV4dCgpOworICAgICAgICAgICAgaWYgKE1vZGlmaWVyLmlzRmluYWwobWV0aG9kLmdldE1vZGlmaWVycygpKSkgeworICAgICAgICAgICAgICAgIGFkZEVycm9yKCJUaGUgIiArIGdldERlc2NyaXB0aW9uKG1ldGhvZCkgKyAiIGZyb20gIiArIGdldERlc2NyaXB0aW9uKGNuKSArCisgICAgICAgICAgICAgICAgICAgICAgICAiIG11c3Qgbm90IGJlIGZpbmFsLiBJdCBpcyBieSBkZWZpbml0aW9uIGFic3RyYWN0LiIsIG1ldGhvZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoTW9kaWZpZXIuaXNTdGF0aWMobWV0aG9kLmdldE1vZGlmaWVycygpKSAmJiAhaXNDb25zdHJ1Y3RvcihtZXRob2QpKSB7CisgICAgICAgICAgICAgICAgYWRkRXJyb3IoIlRoZSAiICsgZ2V0RGVzY3JpcHRpb24obWV0aG9kKSArICIgZnJvbSAiICsgZ2V0RGVzY3JpcHRpb24oY24pICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgbXVzdCBub3QgYmUgc3RhdGljLiBPbmx5IGZpZWxkcyBtYXkgYmUgc3RhdGljIGluIGFuIGludGVyZmFjZS4iLCBtZXRob2QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzQ29uc3RydWN0b3IoTWV0aG9kTm9kZSBtZXRob2QpIHsKKyAgICAgICAgcmV0dXJuIG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCI8Y2xpbml0PiIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja01ldGhvZHNGb3JPdmVyd3JpdGluZ0ZpbmFsKENsYXNzTm9kZSBjbikgeworICAgICAgICBMaXN0IG1ldGhvZHMgPSBjbi5nZXRNZXRob2RzKCk7CisgICAgICAgIGZvciAoSXRlcmF0b3IgY25JdGVyID0gbWV0aG9kcy5pdGVyYXRvcigpOyBjbkl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgTWV0aG9kTm9kZSBtZXRob2QgPSAoTWV0aG9kTm9kZSkgY25JdGVyLm5leHQoKTsKKyAgICAgICAgICAgIFBhcmFtZXRlcltdIHBhcmFtcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJzKCk7CisgICAgICAgICAgICBMaXN0IHN1cGVyTWV0aG9kcyA9IGNuLmdldFN1cGVyQ2xhc3MoKS5nZXRNZXRob2RzKG1ldGhvZC5nZXROYW1lKCkpOworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gc3VwZXJNZXRob2RzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIE1ldGhvZE5vZGUgc3VwZXJNZXRob2QgPSAoTWV0aG9kTm9kZSkgaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgUGFyYW1ldGVyW10gc3VwZXJQYXJhbXMgPSBzdXBlck1ldGhvZC5nZXRQYXJhbWV0ZXJzKCk7CisgICAgICAgICAgICAgICAgaWYgKCFoYXNFcXVhbFBhcmFtZXRlclR5cGVzKHBhcmFtcywgc3VwZXJQYXJhbXMpKSBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpZiAoIU1vZGlmaWVyLmlzRmluYWwoc3VwZXJNZXRob2QuZ2V0TW9kaWZpZXJzKCkpKSByZXR1cm47CisgICAgICAgICAgICAgICAgYWRkSW52YWxpZFVzZU9mRmluYWxFcnJvcihtZXRob2QsIHBhcmFtcywgc3VwZXJNZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFkZEludmFsaWRVc2VPZkZpbmFsRXJyb3IoTWV0aG9kTm9kZSBtZXRob2QsIFBhcmFtZXRlcltdIHBhcmFtZXRlcnMsIENsYXNzTm9kZSBzdXBlckNOKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBtc2cgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIG1zZy5hcHBlbmQoIllvdSBhcmUgbm90IGFsbG93ZWQgdG8gb3ZlcndyaXRlIHRoZSBmaW5hbCBtZXRob2QgIikuYXBwZW5kKG1ldGhvZC5nZXROYW1lKCkpOworICAgICAgICBtc2cuYXBwZW5kKCIoIik7CisgICAgICAgIGJvb2xlYW4gbmVlZHNDb21tYSA9IGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChuZWVkc0NvbW1hKSB7CisgICAgICAgICAgICAgICAgbXNnLmFwcGVuZCgiLCIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBuZWVkc0NvbW1hID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1zZy5hcHBlbmQocGFyYW1ldGVyc1tpXS5nZXRUeXBlKCkpOworICAgICAgICB9CisgICAgICAgIG1zZy5hcHBlbmQoIikgZnJvbSAiKS5hcHBlbmQoZ2V0RGVzY3JpcHRpb24oc3VwZXJDTikpOworICAgICAgICBtc2cuYXBwZW5kKCIuIik7CisgICAgICAgIGFkZEVycm9yKG1zZy50b1N0cmluZygpLCBtZXRob2QpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBoYXNFcXVhbFBhcmFtZXRlclR5cGVzKFBhcmFtZXRlcltdIGZpcnN0LCBQYXJhbWV0ZXJbXSBzZWNvbmQpIHsKKyAgICAgICAgaWYgKGZpcnN0Lmxlbmd0aCAhPSBzZWNvbmQubGVuZ3RoKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlyc3QubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyBmdCA9IGZpcnN0W2ldLmdldFR5cGUoKS5nZXROYW1lKCk7CisgICAgICAgICAgICBTdHJpbmcgc3QgPSBzZWNvbmRbaV0uZ2V0VHlwZSgpLmdldE5hbWUoKTsKKyAgICAgICAgICAgIGlmIChmdC5lcXVhbHMoc3QpKSBjb250aW51ZTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU291cmNlVW5pdCBnZXRTb3VyY2VVbml0KCkgeworICAgICAgICByZXR1cm4gc291cmNlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0Q29uc3RydWN0b3JDYWxsRXhwcmVzc2lvbihDb25zdHJ1Y3RvckNhbGxFeHByZXNzaW9uIGNhbGwpIHsKKyAgICAgICAgQ2xhc3NOb2RlIHR5cGUgPSBjYWxsLmdldFR5cGUoKTsKKyAgICAgICAgaWYgKE1vZGlmaWVyLmlzQWJzdHJhY3QodHlwZS5nZXRNb2RpZmllcnMoKSkpIHsKKyAgICAgICAgICAgIGFkZEVycm9yKCJZb3UgY2Fubm90IGNyZWF0ZSBhbiBpbnN0YW5jZSBmcm9tIHRoZSBhYnN0cmFjdCAiICsgZ2V0RGVzY3JpcHRpb24odHlwZSkgKyAiLiIsIGNhbGwpOworICAgICAgICB9CisgICAgICAgIHN1cGVyLnZpc2l0Q29uc3RydWN0b3JDYWxsRXhwcmVzc2lvbihjYWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdE1ldGhvZChNZXRob2ROb2RlIG5vZGUpIHsKKyAgICAgICAgY2hlY2tBYnN0cmFjdERlY2xhcmF0aW9uKG5vZGUpOworICAgICAgICBjaGVja1JlcGV0aXRpdmVNZXRob2Qobm9kZSk7CisgICAgICAgIGNoZWNrT3ZlcmxvYWRpbmdQcml2YXRlQW5kUHVibGljKG5vZGUpOworICAgICAgICBzdXBlci52aXNpdE1ldGhvZChub2RlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tPdmVybG9hZGluZ1ByaXZhdGVBbmRQdWJsaWMoTWV0aG9kTm9kZSBub2RlKSB7CisgICAgICAgIGlmIChpc0NvbnN0cnVjdG9yKG5vZGUpKSByZXR1cm47CisgICAgICAgIExpc3QgbWV0aG9kcyA9IGN1cnJlbnRDbGFzcy5nZXRNZXRob2RzKG5vZGUuZ2V0TmFtZSgpKTsKKyAgICAgICAgYm9vbGVhbiBoYXNQcml2YXRlPWZhbHNlOworICAgICAgICBib29sZWFuIGhhc1B1YmxpYz1mYWxzZTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gbWV0aG9kcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIE1ldGhvZE5vZGUgZWxlbWVudCA9IChNZXRob2ROb2RlKSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChlbGVtZW50ID09IG5vZGUpIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKCFlbGVtZW50LmdldERlY2xhcmluZ0NsYXNzKCkuZXF1YWxzKG5vZGUuZ2V0RGVjbGFyaW5nQ2xhc3MoKSkpIGNvbnRpbnVlOworICAgICAgICAgICAgaW50IG1vZGlmaWVycyA9IGVsZW1lbnQuZ2V0TW9kaWZpZXJzKCk7CisgICAgICAgICAgICBpZiAoTW9kaWZpZXIuaXNQdWJsaWMobW9kaWZpZXJzKSB8fCBNb2RpZmllci5pc1Byb3RlY3RlZChtb2RpZmllcnMpKXsKKyAgICAgICAgICAgICAgICBoYXNQdWJsaWM9dHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaGFzUHJpdmF0ZT10cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChoYXNQcml2YXRlICYmIGhhc1B1YmxpYykgeworICAgICAgICAgICAgYWRkRXJyb3IoIk1peGluZyBwcml2YXRlIGFuZCBwdWJsaWMvcHJvdGVjdGVkIG1ldGhvZHMgb2YgdGhlIHNhbWUgbmFtZSBjYXVzZXMgbXVsdGltZXRob2RzIHRvIGJlIGRpc2FibGVkIGFuZCBpcyBmb3JiaWRkZW4gdG8gYXZvaWQgc3VycHJpc2luZyBiZWhhdmlvdXIuIFJlbmFtaW5nIHRoZSBwcml2YXRlIG1ldGhvZHMgd2lsbCBzb2x2ZSB0aGUgcHJvYmxlbS4iLG5vZGUpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHByaXZhdGUgdm9pZCBjaGVja1JlcGV0aXRpdmVNZXRob2QoTWV0aG9kTm9kZSBub2RlKSB7CisgICAgICAgIGlmIChpc0NvbnN0cnVjdG9yKG5vZGUpKSByZXR1cm47CisgICAgICAgIExpc3QgbWV0aG9kcyA9IGN1cnJlbnRDbGFzcy5nZXRNZXRob2RzKG5vZGUuZ2V0TmFtZSgpKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gbWV0aG9kcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIE1ldGhvZE5vZGUgZWxlbWVudCA9IChNZXRob2ROb2RlKSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChlbGVtZW50ID09IG5vZGUpIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKCFlbGVtZW50LmdldERlY2xhcmluZ0NsYXNzKCkuZXF1YWxzKG5vZGUuZ2V0RGVjbGFyaW5nQ2xhc3MoKSkpIGNvbnRpbnVlOworICAgICAgICAgICAgUGFyYW1ldGVyW10gcDEgPSBub2RlLmdldFBhcmFtZXRlcnMoKTsKKyAgICAgICAgICAgIFBhcmFtZXRlcltdIHAyID0gZWxlbWVudC5nZXRQYXJhbWV0ZXJzKCk7CisgICAgICAgICAgICBpZiAocDEubGVuZ3RoICE9IHAyLmxlbmd0aCkgY29udGludWU7CisgICAgICAgICAgICBhZGRFcnJvcklmUGFyYW1zQW5kUmV0dXJuVHlwZUVxdWFsKHAyLCBwMSwgbm9kZSwgZWxlbWVudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWRkRXJyb3JJZlBhcmFtc0FuZFJldHVyblR5cGVFcXVhbChQYXJhbWV0ZXJbXSBwMiwgUGFyYW1ldGVyW10gcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kTm9kZSBub2RlLCBNZXRob2ROb2RlIGVsZW1lbnQpIHsKKyAgICAgICAgYm9vbGVhbiBpc0VxdWFsID0gdHJ1ZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwMi5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaXNFcXVhbCAmPSBwMVtpXS5nZXRUeXBlKCkuZXF1YWxzKHAyW2ldLmdldFR5cGUoKSk7CisgICAgICAgIH0KKyAgICAgICAgaXNFcXVhbCAmPSBub2RlLmdldFJldHVyblR5cGUoKS5lcXVhbHMoZWxlbWVudC5nZXRSZXR1cm5UeXBlKCkpOworICAgICAgICBpZiAoaXNFcXVhbCkgeworICAgICAgICAgICAgYWRkRXJyb3IoIlJlcGV0aXRpdmUgbWV0aG9kIG5hbWUvc2lnbmF0dXJlIGZvciAiICsgZ2V0RGVzY3JpcHRpb24obm9kZSkgKworICAgICAgICAgICAgICAgICAgICAiIGluICIgKyBnZXREZXNjcmlwdGlvbihjdXJyZW50Q2xhc3MpICsgIi4iLCBub2RlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0RmllbGQoRmllbGROb2RlIG5vZGUpIHsKKyAgICAgICAgaWYgKGN1cnJlbnRDbGFzcy5nZXRGaWVsZChub2RlLmdldE5hbWUoKSkgIT0gbm9kZSkgeworICAgICAgICAgICAgYWRkRXJyb3IoIlRoZSAiICsgZ2V0RGVzY3JpcHRpb24obm9kZSkgKyAiIGlzIGRlY2xhcmVkIG11bHRpcGxlIHRpbWVzLiIsIG5vZGUpOworICAgICAgICB9CisgICAgICAgIGNoZWNrSW50ZXJmYWNlRmllbGRNb2RpZmllcnMobm9kZSk7CisgICAgICAgIHN1cGVyLnZpc2l0RmllbGQobm9kZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrSW50ZXJmYWNlRmllbGRNb2RpZmllcnMoRmllbGROb2RlIG5vZGUpIHsKKyAgICAgICAgaWYgKCFjdXJyZW50Q2xhc3MuaXNJbnRlcmZhY2UoKSkgcmV0dXJuOworICAgICAgICBpZiAoKG5vZGUuZ2V0TW9kaWZpZXJzKCkgJiAoT3Bjb2Rlcy5BQ0NfUFVCTElDIHwgT3Bjb2Rlcy5BQ0NfU1RBVElDIHwgT3Bjb2Rlcy5BQ0NfRklOQUwpKSA9PSAwKSB7CisgICAgICAgICAgICBhZGRFcnJvcigiVGhlICIgKyBnZXREZXNjcmlwdGlvbihub2RlKSArICIgaXMgbm90ICdwdWJsaWMgZmluYWwgc3RhdGljJyBidXQgaXMgZGVmaW5lZCBpbiB0aGUgIiArCisgICAgICAgICAgICAgICAgICAgIGdldERlc2NyaXB0aW9uKGN1cnJlbnRDbGFzcykgKyAiLiIsIG5vZGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRCaW5hcnlFeHByZXNzaW9uKEJpbmFyeUV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgICAgICBpZiAoZXhwcmVzc2lvbi5nZXRPcGVyYXRpb24oKS5nZXRUeXBlKCkgPT0gVHlwZXMuTEVGVF9TUVVBUkVfQlJBQ0tFVCAmJgorICAgICAgICAgICAgICAgIGV4cHJlc3Npb24uZ2V0UmlnaHRFeHByZXNzaW9uKCkgaW5zdGFuY2VvZiBNYXBFbnRyeUV4cHJlc3Npb24pIHsKKyAgICAgICAgICAgIGFkZEVycm9yKCJZb3UgdHJpZWQgdG8gdXNlIGEgbWFwIGVudHJ5IGZvciBhbiBpbmRleCBvcGVyYXRpb24sIHRoaXMgaXMgbm90IGFsbG93ZWQuICIgKworICAgICAgICAgICAgICAgICAgICAiTWF5YmUgc29tZXRoaW5nIHNob3VsZCBiZSBzZXQgaW4gcGFyZW50aGVzZXMgb3IgYSBjb21tYSBpcyBtaXNzaW5nPyIsCisgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24uZ2V0UmlnaHRFeHByZXNzaW9uKCkpOworICAgICAgICB9CisgICAgICAgIHN1cGVyLnZpc2l0QmluYXJ5RXhwcmVzc2lvbihleHByZXNzaW9uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdENhdGNoU3RhdGVtZW50KENhdGNoU3RhdGVtZW50IGNzKSB7CisgICAgICAgIGlmICghKGNzLmdldEV4Y2VwdGlvblR5cGUoKS5pc0Rlcml2ZWRGcm9tKENsYXNzSGVscGVyLm1ha2UoVGhyb3dhYmxlLmNsYXNzKSkpKSB7CisgICAgICAgICAgICBhZGRFcnJvcigiQ2F0Y2ggc3RhdGVtZW50IHBhcmFtZXRlciB0eXBlIGlzIG5vdCBhIHN1YmNsYXNzIG9mIFRocm93YWJsZS4iLCBjcyk7CisgICAgICAgIH0KKyAgICAgICAgc3VwZXIudmlzaXRDYXRjaFN0YXRlbWVudChjcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vQ2xhc3NHZW5lcmF0b3IuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL0NsYXNzR2VuZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E4N2IxZQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL0NsYXNzR2VuZXJhdG9yLmphdmEKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW47CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5DbGFzc0NvZGVWaXNpdG9yU3VwcG9ydDsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuU291cmNlVW5pdDsKK2ltcG9ydCBvcmcub2JqZWN0d2ViLmFzbS5PcGNvZGVzOworCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CisKKy8qKgorICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgZ2VuZXJhdG9yIG9mIEphdmEgY2xhc3MgdmVyc2lvbnMgb2YgR3Jvb3Z5IEFTVCBjbGFzc2VzCisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQHByb3RpcXVlLmNvbSI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAYXV0aG9yIFJ1c3NlbCBXaW5kZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIENsYXNzR2VuZXJhdG9yIGV4dGVuZHMgQ2xhc3NDb2RlVmlzaXRvclN1cHBvcnQgaW1wbGVtZW50cyBPcGNvZGVzIHsKKyAgICBwcm90ZWN0ZWQgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXI7CisgICAgLy8gaW5uZXIgY2xhc3NlcyBjcmVhdGVkIHdoaWxlIGdlbmVyYXRpbmcgYnl0ZWNvZGUKKyAgICBwcm90ZWN0ZWQgTGlua2VkTGlzdCBpbm5lckNsYXNzZXMgPSBuZXcgTGlua2VkTGlzdCgpOworCisgICAgcHVibGljIENsYXNzR2VuZXJhdG9yKENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB7CisgICAgICAgIHRoaXMuY2xhc3NMb2FkZXIgPSBjbGFzc0xvYWRlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlua2VkTGlzdCBnZXRJbm5lckNsYXNzZXMoKSB7CisgICAgICAgIHJldHVybiBpbm5lckNsYXNzZXM7CisgICAgfQorCisgICAgcHVibGljIENsYXNzTG9hZGVyIGdldENsYXNzTG9hZGVyKCkgeworICAgICAgICByZXR1cm4gY2xhc3NMb2FkZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBjb25zdGFudCB0aGF0IGlzIHRoZSBBU00gcmVwcmVzZW50YXRpb24gb2YgdGhlIEpESyB2ZXJzaW9uIG51bWJlciBmb3IgdXNlIGluIHRoZQorICAgICAqIDxjb2RlPkNsYXNzV3JpdGVyLnZpc2l0b3I8L2NvZGU+IG1ldGhvZCBjYWxscy4KKyAgICAgKiA8cC8+CisgICAgICogPHA+UHJpb3IgdG8gdmVyc2lvbiAxLjUgb2YgQVNNLCB0aGUgY29kZSBnZW5lcmF0ZWQgd2FzIGFsd2F5cyBKREsxLjMgY29tcGxpYW50LiAgQXMgb2YgQVNNIHZlcnNpb24KKyAgICAgKiAxLjUgdGhlcmUgaXMgYW4gZXh0cmEgKGZpcnN0KSBwYXJhbWV0ZXIgdG8gc3BlY2lmeSB0aGUgYnl0ZWNvZGUgdmVyc2lvbiB0byBnZW5lcmF0ZS4gIEluCisgICAgICogdmVyc2lvbiAxLjUgdGhlc2UgYXJlIGluIENvbnN0YW50cy4gIFRoZSBDVlMgKGFzIGF0IDIwMDQuMTIuMTIpIGFuZCBwcmVzdW1hYmx5IGluIHZlcnNpb24gMi4wLAorICAgICAqIHRoZSBpbnRlcmZhY2UgQ29uc3RhbnRzIGlzIHJlcGxhY2VkIGJ5IE9wY29kZXMuPC9wPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGFzbUpES1ZlcnNpb24gPSBWMV8zOworICAgIC8vICBXZSBjYW4gdXNlIFYxXzMgYW5kIG5vdCBvcmcub2JqZWN0d2ViLmFzbS5PcGNvZGVzLlYxXzMgYmVjYXVzZSB0aGlzIGFic3RyYWN0IGNsYXNzCisgICAgLy8gIGltcGxlbWVudHMgb3JnLm9iamVjdHdlYi5hc20uT3Bjb2RlcyBzbyBhbGwgaXRzIGNvbnN0YW50cyBhcmUgYXZhaWxhYmxlIGRpcmVjdGx5LgorCisKKyAgICBwcm90ZWN0ZWQgU291cmNlVW5pdCBnZXRTb3VyY2VVbml0KCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEJ5dGVjb2RlU2VxdWVuY2UoQnl0ZWNvZGVTZXF1ZW5jZSBieXRlY29kZVNlcXVlbmNlKSB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vQ2xhc3NHZW5lcmF0b3JFeGNlcHRpb24uamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL0NsYXNzR2VuZXJhdG9yRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM5MGUwZAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL0NsYXNzR2VuZXJhdG9yRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW47CisKKy8qKgorICogQW4gZXhjZXB0aW9uIHRocm93biBieSB0aGUgY2xhc3MgZ2VuZXJhdG9yCisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIENsYXNzR2VuZXJhdG9yRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CisKKyAgICBwdWJsaWMgQ2xhc3NHZW5lcmF0b3JFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgc3VwZXIobWVzc2FnZSk7CisgICAgfQorCisgICAgcHVibGljIENsYXNzR2VuZXJhdG9yRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKKyAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vQ29tcGlsZVN0YWNrLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9Db21waWxlU3RhY2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTE3MTM3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vQ29tcGlsZVN0YWNrLmphdmEKQEAgLTAsMCArMSw2MjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW47CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5Lkdyb292eUJ1Z0Vycm9yOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LkNsYXNzSGVscGVyOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LkNsYXNzTm9kZTsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5QYXJhbWV0ZXI7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuVmFyaWFibGVTY29wZTsKK2ltcG9ydCBvcmcub2JqZWN0d2ViLmFzbS5MYWJlbDsKK2ltcG9ydCBvcmcub2JqZWN0d2ViLmFzbS5NZXRob2RWaXNpdG9yOworaW1wb3J0IG9yZy5vYmplY3R3ZWIuYXNtLk9wY29kZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGEgaGVscGVyIGZvciBBc21DbGFzc0dlbmVyYXRvci4gSXQgbWFuYWdlcworICogZGlmZmVyZW50IGFzcGVjdHMgb2YgdGhlIGNvZGUgb2YgYSBjb2RlIGJsb2NrIGxpa2UgCisgKiBoYW5kbGluZyBsYWJlbHMsIGRlZmluaW5nIHZhcmlhYmxlcywgYW5kIHNjb3Blcy4gCisgKiBBZnRlciBhIE1ldGhvZE5vZGUgaXMgdmlzaXRlZCBjbGVhciBzaG91bGQgYmUgY2FsbGVkLCBmb3IgCisgKiBpbml0aWFsaXphdGlvbiB0aGUgbWV0aG9kIGluaXQgc2hvdWxkIGJlIHVzZWQuCisgKiA8cD4gCisgKiBTb21lIE5vdGVzOgorICogPHVsPgorICogPGxpPiBldmVyeSBwdXNoIG1ldGhvZCB3aWxsIHJlcXVpcmUgYSBsYXRlciBwb3AgY2FsbAorICogPGxpPiBtZXRob2QgcGFyYW1ldGVycyBtYXkgZGVmaW5lIGEgY2F0ZWdvcnkgMiB2YXJpYWJsZSwgc28KKyAqICAgICAgZG9uJ3QgaWdub3JlIHRoZSB0eXBlIHN0b3JlZCBpbiB0aGUgdmFyaWFibGUgb2JqZWN0CisgKiA8bGk+IHRoZSBpbmRleCBvZiB0aGUgdmFyaWFibGUgbWF5IG5vdCBiZSBhcyBhc3N1bWVkIHdoZW4KKyAqICAgICAgdGhlIHZhcmlhYmxlIGlzIGEgcGFyYW1ldGVyIG9mIGEgbWV0aG9kIGJlY2F1c2UgdGhlIAorICogICAgICBwYXJhbWV0ZXIgbWF5IGJlIHVzZWQgaW4gYSBjbG9zdXJlLCBzbyBkb24ndCBpZ25vcmUKKyAqICAgICAgdGhlIHN0b3JlZCB2YXJpYWJsZSBpbmRleAorICogPGxpPiB0aGUgbmFtZXMgb2YgdGVtcG9yYXJ5IHZhcmlhYmxlcyBjYW4gYmUgaWdub3JlZC4gVGhlIG5hbWVzCisgKiAgICAgIGFyZSBvbmx5IHVzZWQgZm9yIGRlYnVnZ2luZyBhbmQgZG8gbm90IGNvbmZsaWN0IHdpdGggZWFjaCAKKyAqICAgICAgb3RoZXIgb3Igbm9ybWFsIHZhcmlhYmxlcy4gRm9yIGFjY2Vzc2luZyB0aGUgaW5kZXggb2YgdGhlCisgKiAgICAgIHZhcmlhYmxlIG11c3QgYmUgdXNlZC4KKyAqIDwvdWw+CisgKiAKKyAqIAorICogQHNlZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuLkFzbUNsYXNzR2VuZXJhdG9yCisgKiBAYXV0aG9yIEpvY2hlbiBUaGVvZG9yb3UKKyAqLworcHVibGljIGNsYXNzIENvbXBpbGVTdGFjayBpbXBsZW1lbnRzIE9wY29kZXMgeworICAgIC8qKgorICAgICAqIEBUT0RPIHJlbW92ZSBvcHRpbWl6YXRpb24gb2YgdGhpcy5mb28gLT4gdGhpcy5AZm9vCisgICAgICogCisgICAgICovCisgICAgCisgICAgLy8gc3RhdGUgZmxhZworICAgIHByaXZhdGUgYm9vbGVhbiBjbGVhcj10cnVlOworICAgIC8vIGN1cnJlbnQgc2NvcGUKKyAgICBwcml2YXRlIFZhcmlhYmxlU2NvcGUgc2NvcGU7CisgICAgLy8gY3VycmVudCBsYWJlbCBmb3IgY29udGludWUKKyAgICBwcml2YXRlIExhYmVsIGNvbnRpbnVlTGFiZWw7CisgICAgLy8gY3VycmVudCBsYWJlbCBmb3IgYnJlYWsKKyAgICBwcml2YXRlIExhYmVsIGJyZWFrTGFiZWw7CisgICAgLy8gYXZhaWxhYmxlIHZhcmlhYmxlcyBvbiBzdGFjaworICAgIHByaXZhdGUgTWFwIHN0YWNrVmFyaWFibGVzID0gbmV3IEhhc2hNYXAoKTsKKyAgICAvLyBpbmRleCBvZiB0aGUgbGFzdCB2YXJpYWJsZSBvbiBzdGFjaworICAgIHByaXZhdGUgaW50IGN1cnJlbnRWYXJpYWJsZUluZGV4ID0gMTsKKyAgICAvLyBpbmRleCBmb3IgdGhlIG5leHQgdmFyaWFibGUgb24gc3RhY2sKKyAgICBwcml2YXRlIGludCBuZXh0VmFyaWFibGVJbmRleCA9IDE7CisgICAgLy8gY3VycmVudGx5IHRlbXBvcmFyeSB2YXJpYWJsZXMgaW4gdXNlCisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0IHRlbXBvcmFyeVZhcmlhYmxlcyA9IG5ldyBMaW5rZWRMaXN0KCk7CisgICAgLy8gb3ZlcmFsbCB1c2VkIHZhcmlhYmxlcyBmb3IgYSBtZXRob2QvY29uc3RydWN0b3IKKyAgICBwcml2YXRlIGZpbmFsIExpbmtlZExpc3QgdXNlZFZhcmlhYmxlcyA9IG5ldyBMaW5rZWRMaXN0KCk7CisgICAgLy8gbWFwIGNvbnRhaW5pbmcgbmFtZWQgbGFiZWxzIG9mIHBhcmVudGluZyBibG9ja3MKKyAgICBwcml2YXRlIE1hcCBzdXBlckJsb2NrTmFtZWRMYWJlbHMgPSBuZXcgSGFzaE1hcCgpOworICAgIC8vIG1hcCBjb250YWluaW5nIG5hbWVkIGxhYmVscyBvZiBjdXJyZW50IGJsb2NrCisgICAgcHJpdmF0ZSBNYXAgY3VycmVudEJsb2NrTmFtZWRMYWJlbHMgPSBuZXcgSGFzaE1hcCgpOworICAgIC8vIGxpc3QgY29udGFpbmluZyBydW5uYWJsZXMgcmVwcmVzZW50aW5nIGEgZmluYWxseSBibG9jaworICAgIC8vIHN1Y2ggYSBibG9jayBpcyBjcmVhdGVkIGJ5IHN5bmNocm9uaXplZCBvciBmaW5hbGx5IGFuZAorICAgIC8vIG11c3QgYmUgY2FsbGVkIGZvciBicmVhay9jb250aW51ZS9yZXR1cm4KKyAgICBwcml2YXRlIExpbmtlZExpc3QgZmluYWxseUJsb2NrcyA9IG5ldyBMaW5rZWRMaXN0KCk7CisgICAgLy8gYSBsaXN0IG9mIGJsb2NrcyBhbHJlYWR5IHZpc2l0aW5nLiAKKyAgICBwcml2YXRlIGZpbmFsIExpc3QgdmlzaXRlZEJsb2NrcyA9IG5ldyBMaW5rZWRMaXN0KCk7CisgICAgCisgICAgcHJpdmF0ZSBMYWJlbCB0aGlzU3RhcnRMYWJlbCwgdGhpc0VuZExhYmVsOworCisgICAgLy8gY3VycmVudCBjbGFzcyBpbmRleAorICAgIHByaXZhdGUgaW50IGN1cnJlbnRDbGFzc0luZGV4ICwgY3VycmVudE1ldGFDbGFzc0luZGV4OworICAgIAorICAgIHByaXZhdGUgTWV0aG9kVmlzaXRvciBtdjsKKyAgICBwcml2YXRlIEJ5dGVjb2RlSGVscGVyIGhlbHBlcjsKKyAgICAKKyAgICAvLyBoZWxwZXIgdG8gaGFuZGxlIGRpZmZlcmVudCBzdGFjayBiYXNlZCB2YXJpYWJsZXMgICAgCisgICAgcHJpdmF0ZSBmaW5hbCBMaW5rZWRMaXN0IHN0YXRlU3RhY2sgPSBuZXcgTGlua2VkTGlzdCgpOworICAgIAorICAgIC8vIGRlZmluZXMgdGhlIGZpcnN0IHZhcmlhYmxlIGluZGV4IHVzZWFibGUgYWZ0ZXIKKyAgICAvLyBhbGwgcGFyYW1ldGVycyBvZiBhIG1ldGhvZCAKKyAgICBwcml2YXRlIGludCBsb2NhbFZhcmlhYmxlT2Zmc2V0OworICAgIC8vIHRoaXMgaXMgdXNlZCB0byBzdG9yZSB0aGUgZ29hbHMgZm9yIGEgImJyZWFrIGZvbyIgY2FsbAorICAgIC8vIGluIGEgbG9vcCB3aGVyZSBmb28gaXMgYSBsYWJlbC4KKwlwcml2YXRlIGZpbmFsIE1hcCBuYW1lZExvb3BCcmVha0xhYmVsID0gbmV3IEhhc2hNYXAoKTsKKwkvL3RoaXMgaXMgdXNlZCB0byBzdG9yZSB0aGUgZ29hbHMgZm9yIGEgImNvbnRpbnVlIGZvbyIgY2FsbAorICAgIC8vIGluIGEgbG9vcCB3aGVyZSBmb28gaXMgYSBsYWJlbC4KKwlwcml2YXRlIGZpbmFsIE1hcCBuYW1lZExvb3BDb250aW51ZUxhYmVsID0gbmV3IEhhc2hNYXAoKTsKKyAgICBwcml2YXRlIFN0cmluZyBjbGFzc05hbWU7CisJCisgICAgcHJpdmF0ZSBjbGFzcyBTdGF0ZVN0YWNrRWxlbWVudCB7CisgICAgICAgIGZpbmFsIFZhcmlhYmxlU2NvcGUgc2NvcGU7CisgICAgICAgIGZpbmFsIExhYmVsIGNvbnRpbnVlTGFiZWw7CisgICAgICAgIGZpbmFsIExhYmVsIGJyZWFrTGFiZWw7CisgICAgICAgIExhYmVsIGZpbmFsbHlMYWJlbDsKKyAgICAgICAgZmluYWwgaW50IGxhc3RWYXJpYWJsZUluZGV4OworICAgICAgICBmaW5hbCBpbnQgbmV4dFZhcmlhYmxlSW5kZXg7CisgICAgICAgIGZpbmFsIE1hcCBzdGFja1ZhcmlhYmxlczsKKyAgICAgICAgTGlzdCB0ZW1wb3JhcnlWYXJpYWJsZXMgPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICBMaXN0IHVzZWRWYXJpYWJsZXMgPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICBmaW5hbCBNYXAgc3VwZXJCbG9ja05hbWVkTGFiZWxzOworICAgICAgICBmaW5hbCBNYXAgY3VycmVudEJsb2NrTmFtZWRMYWJlbHM7CisgICAgICAgIGZpbmFsIExpbmtlZExpc3QgZmluYWxseUJsb2NrczsKKyAgICAgICAgCisgICAgICAgIFN0YXRlU3RhY2tFbGVtZW50KCkgeworICAgICAgICAgICAgc2NvcGUgPSBDb21waWxlU3RhY2sudGhpcy5zY29wZTsKKyAgICAgICAgICAgIGNvbnRpbnVlTGFiZWwgPSBDb21waWxlU3RhY2sudGhpcy5jb250aW51ZUxhYmVsOworICAgICAgICAgICAgYnJlYWtMYWJlbCA9IENvbXBpbGVTdGFjay50aGlzLmJyZWFrTGFiZWw7CisgICAgICAgICAgICBsYXN0VmFyaWFibGVJbmRleCA9IENvbXBpbGVTdGFjay50aGlzLmN1cnJlbnRWYXJpYWJsZUluZGV4OworICAgICAgICAgICAgc3RhY2tWYXJpYWJsZXMgPSBDb21waWxlU3RhY2sudGhpcy5zdGFja1ZhcmlhYmxlczsKKyAgICAgICAgICAgIHRlbXBvcmFyeVZhcmlhYmxlcyA9IENvbXBpbGVTdGFjay50aGlzLnRlbXBvcmFyeVZhcmlhYmxlczsKKyAgICAgICAgICAgIG5leHRWYXJpYWJsZUluZGV4ID0gQ29tcGlsZVN0YWNrLnRoaXMubmV4dFZhcmlhYmxlSW5kZXg7CisgICAgICAgICAgICBzdXBlckJsb2NrTmFtZWRMYWJlbHMgPSBDb21waWxlU3RhY2sudGhpcy5zdXBlckJsb2NrTmFtZWRMYWJlbHM7CisgICAgICAgICAgICBjdXJyZW50QmxvY2tOYW1lZExhYmVscyA9IENvbXBpbGVTdGFjay50aGlzLmN1cnJlbnRCbG9ja05hbWVkTGFiZWxzOworICAgICAgICAgICAgZmluYWxseUJsb2NrcyA9IENvbXBpbGVTdGFjay50aGlzLmZpbmFsbHlCbG9ja3M7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSB2b2lkIHB1c2hTdGF0ZSgpIHsKKyAgICAgICAgc3RhdGVTdGFjay5hZGQobmV3IFN0YXRlU3RhY2tFbGVtZW50KCkpOworICAgICAgICBzdGFja1ZhcmlhYmxlcyA9IG5ldyBIYXNoTWFwKHN0YWNrVmFyaWFibGVzKTsKKyAgICAgICAgZmluYWxseUJsb2NrcyA9IG5ldyBMaW5rZWRMaXN0KGZpbmFsbHlCbG9ja3MpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgcG9wU3RhdGUoKSB7CisgICAgICAgIGlmIChzdGF0ZVN0YWNrLnNpemUoKT09MCkgeworICAgICAgICAgICAgIHRocm93IG5ldyBHcm9vdnlCdWdFcnJvcigiVHJpZWQgdG8gZG8gYSBwb3Agb24gdGhlIGNvbXBpbGUgc3RhY2sgd2l0aG91dCBwdXNoLiIpOworICAgICAgICB9CisgICAgICAgIFN0YXRlU3RhY2tFbGVtZW50IGVsZW1lbnQgPSAoU3RhdGVTdGFja0VsZW1lbnQpIHN0YXRlU3RhY2sucmVtb3ZlTGFzdCgpOworICAgICAgICBzY29wZSA9IGVsZW1lbnQuc2NvcGU7CisgICAgICAgIGNvbnRpbnVlTGFiZWwgPSBlbGVtZW50LmNvbnRpbnVlTGFiZWw7CisgICAgICAgIGJyZWFrTGFiZWwgPSBlbGVtZW50LmJyZWFrTGFiZWw7CisgICAgICAgIGN1cnJlbnRWYXJpYWJsZUluZGV4ID0gZWxlbWVudC5sYXN0VmFyaWFibGVJbmRleDsKKyAgICAgICAgc3RhY2tWYXJpYWJsZXMgPSBlbGVtZW50LnN0YWNrVmFyaWFibGVzOworICAgICAgICBuZXh0VmFyaWFibGVJbmRleCA9IGVsZW1lbnQubmV4dFZhcmlhYmxlSW5kZXg7CisgICAgICAgIGZpbmFsbHlCbG9ja3MgPSBlbGVtZW50LmZpbmFsbHlCbG9ja3M7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBMYWJlbCBnZXRDb250aW51ZUxhYmVsKCkgeworICAgICAgICByZXR1cm4gY29udGludWVMYWJlbDsKKyAgICB9CisKKyAgICBwdWJsaWMgTGFiZWwgZ2V0QnJlYWtMYWJlbCgpIHsKKyAgICAgICAgcmV0dXJuIGJyZWFrTGFiZWw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVtb3ZlVmFyKGludCB0ZW1wSW5kZXgpIHsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gdGVtcG9yYXJ5VmFyaWFibGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgVmFyaWFibGUgZWxlbWVudCA9IChWYXJpYWJsZSkgaXRlci5uZXh0KCk7CisgICAgICAgICAgICBpZiAoZWxlbWVudC5nZXRJbmRleCgpPT10ZW1wSW5kZXgpIHsKKyAgICAgICAgICAgICAgICBpdGVyLnJlbW92ZSgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgR3Jvb3Z5QnVnRXJyb3IoIkNvbXBpbGVTdGFjayNyZW1vdmVWYXI6IHRyaWVkIHRvIHJlbW92ZSBhIHRlbXBvcmFyeSB2YXJpYWJsZSB3aXRoIGEgbm9uIGV4aXN0ZW50IGluZGV4Iik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldEVuZExhYmVscygpeworICAgICAgICBMYWJlbCBlbmRMYWJlbCA9IG5ldyBMYWJlbCgpOworICAgICAgICBtdi52aXNpdExhYmVsKGVuZExhYmVsKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gc3RhY2tWYXJpYWJsZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBWYXJpYWJsZSB2YXIgPSAoVmFyaWFibGUpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgdmFyLnNldEVuZExhYmVsKGVuZExhYmVsKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzRW5kTGFiZWwgPSBlbmRMYWJlbDsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgcG9wKCkgeworICAgICAgICBzZXRFbmRMYWJlbHMoKTsKKyAgICAgICAgcG9wU3RhdGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVmFyaWFibGVTY29wZSBnZXRTY29wZSgpIHsKKyAgICAgICAgcmV0dXJuIHNjb3BlOworICAgIH0KKworICAgIC8qKgorICAgICAqIGNyZWF0ZXMgYSB0ZW1wb3JhcnkgdmFyaWFibGUuIAorICAgICAqIAorICAgICAqIEBwYXJhbSB2YXIgZGVmaW5lcyB0eXBlIGFuZCBuYW1lCisgICAgICogQHBhcmFtIHN0b3JlIGRlZmluZXMgaWYgdGhlIHRvcGxldmVsIGFyZ3VtZW50IG9mIHRoZSBzdGFjayBzaG91bGQgYmUgc3RvcmVkCisgICAgICogQHJldHVybiB0aGUgaW5kZXggdXNlZCBmb3IgdGhpcyB0ZW1wb3JhcnkgdmFyaWFibGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGRlZmluZVRlbXBvcmFyeVZhcmlhYmxlKG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LlZhcmlhYmxlIHZhciwgYm9vbGVhbiBzdG9yZSkgeworICAgICAgICByZXR1cm4gZGVmaW5lVGVtcG9yYXJ5VmFyaWFibGUodmFyLmdldE5hbWUoKSwgdmFyLmdldFR5cGUoKSxzdG9yZSk7CisgICAgfQorCisgICAgcHVibGljIFZhcmlhYmxlIGdldFZhcmlhYmxlKFN0cmluZyB2YXJpYWJsZU5hbWUgKSB7CisgICAgICAgIHJldHVybiBnZXRWYXJpYWJsZSh2YXJpYWJsZU5hbWUsdHJ1ZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBWYXJpYWJsZSBnZXRWYXJpYWJsZShTdHJpbmcgdmFyaWFibGVOYW1lLCBib29sZWFuIG11c3RFeGlzdCkgeworICAgICAgICBpZiAodmFyaWFibGVOYW1lLmVxdWFscygidGhpcyIpKSByZXR1cm4gVmFyaWFibGUuVEhJU19WQVJJQUJMRTsKKyAgICAgICAgaWYgKHZhcmlhYmxlTmFtZS5lcXVhbHMoInN1cGVyIikpIHJldHVybiBWYXJpYWJsZS5TVVBFUl9WQVJJQUJMRTsKKyAgICAgICAgVmFyaWFibGUgdiA9IChWYXJpYWJsZSkgc3RhY2tWYXJpYWJsZXMuZ2V0KHZhcmlhYmxlTmFtZSk7CisgICAgICAgIGlmICh2PT1udWxsICYmIG11c3RFeGlzdCkgIHRocm93IG5ldyBHcm9vdnlCdWdFcnJvcigidHJpZWQgdG8gZ2V0IGEgdmFyaWFibGUgd2l0aCB0aGUgbmFtZSAiK3ZhcmlhYmxlTmFtZSsiIGFzIHN0YWNrIHZhcmlhYmxlLCBidXQgYSB2YXJpYWJsZSB3aXRoIHRoaXMgbmFtZSB3YXMgbm90IGNyZWF0ZWQiKTsKKyAgICAgICAgcmV0dXJuIHY7CisgICAgfQorCisgICAgLyoqCisgICAgICogY3JlYXRlcyBhIHRlbXBvcmFyeSB2YXJpYWJsZS4gCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgZGVmaW5lcyB0eXBlIGFuZCBuYW1lCisgICAgICogQHBhcmFtIHN0b3JlIGRlZmluZXMgaWYgdGhlIHRvcGxldmVsIGFyZ3VtZW50IG9mIHRoZSBzdGFjayBzaG91bGQgYmUgc3RvcmVkCisgICAgICogQHJldHVybiB0aGUgaW5kZXggdXNlZCBmb3IgdGhpcyB0ZW1wb3JhcnkgdmFyaWFibGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGRlZmluZVRlbXBvcmFyeVZhcmlhYmxlKFN0cmluZyBuYW1lLGJvb2xlYW4gc3RvcmUpIHsKKyAgICAgICAgcmV0dXJuIGRlZmluZVRlbXBvcmFyeVZhcmlhYmxlKG5hbWUsIENsYXNzSGVscGVyLkRZTkFNSUNfVFlQRSxzdG9yZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogY3JlYXRlcyBhIHRlbXBvcmFyeSB2YXJpYWJsZS4gCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgZGVmaW5lcyB0aGUgbmFtZQorICAgICAqIEBwYXJhbSBub2RlIGRlZmluZXMgdGhlIG5vZGUKKyAgICAgKiBAcGFyYW0gc3RvcmUgZGVmaW5lcyBpZiB0aGUgdG9wbGV2ZWwgYXJndW1lbnQgb2YgdGhlIHN0YWNrIHNob3VsZCBiZSBzdG9yZWQgCisgICAgICogQHJldHVybiB0aGUgaW5kZXggdXNlZCBmb3IgdGhpcyB0ZW1wb3JhcnkgdmFyaWFibGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGRlZmluZVRlbXBvcmFyeVZhcmlhYmxlKFN0cmluZyBuYW1lLCBDbGFzc05vZGUgbm9kZSwgYm9vbGVhbiBzdG9yZSkgeworICAgICAgICBWYXJpYWJsZSBhbnN3ZXIgPSBkZWZpbmVWYXIobmFtZSxub2RlLGZhbHNlKTsKKyAgICAgICAgdGVtcG9yYXJ5VmFyaWFibGVzLmFkZChhbnN3ZXIpOworICAgICAgICB1c2VkVmFyaWFibGVzLnJlbW92ZUxhc3QoKTsKKyAgICAgICAgCisgICAgICAgIGlmIChzdG9yZSkgbXYudmlzaXRWYXJJbnNuKEFTVE9SRSwgY3VycmVudFZhcmlhYmxlSW5kZXgpOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIGFuc3dlci5nZXRJbmRleCgpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgcmVzZXRWYXJpYWJsZUluZGV4KGJvb2xlYW4gaXNTdGF0aWMpIHsKKyAgICAgICAgaWYgKCFpc1N0YXRpYykgeworICAgICAgICAgICAgY3VycmVudFZhcmlhYmxlSW5kZXg9MTsKKyAgICAgICAgICAgIG5leHRWYXJpYWJsZUluZGV4PTE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjdXJyZW50VmFyaWFibGVJbmRleD0wOworICAgICAgICAgICAgbmV4dFZhcmlhYmxlSW5kZXg9MDsKKyAgICAgICAgfQorICAgIH0KKyAgCisgICAgLyoqCisgICAgICogQ2xlYXJzIHRoZSBzdGF0ZSBvZiB0aGUgY2xhc3MuIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgCisgICAgICogYWZ0ZXIgYSBNZXRob2ROb2RlIGlzIHZpc2l0ZWQuIE5vdGUgdGhhdCBhIGNhbGwgdG8gaW5pdCB3aWxsCisgICAgICogZmFpbCBpZiBjbGVhciBpcyBub3QgY2FsbGVkIGJlZm9yZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICBpZiAoc3RhdGVTdGFjay5zaXplKCk+MSkgeworICAgICAgICAgICAgaW50IHNpemUgPSBzdGF0ZVN0YWNrLnNpemUoKS0xOworICAgICAgICAgICAgdGhyb3cgbmV3IEdyb292eUJ1Z0Vycm9yKCJ0aGUgY29tcGlsZSBzdGFjayBjb250YWlucyAiK3NpemUrIiBtb3JlIHB1c2ggaW5zdHJ1Y3Rpb24iKyhzaXplPT0xPyIiOiJzIikrIiB0aGFuIHBvcHMuIik7CisgICAgICAgIH0KKyAgICAgICAgY2xlYXIgPSB0cnVlOworICAgICAgICAvLyBiciBleHBlcmltZW50IHdpdGggbG9jYWwgdmFyIHRhYmxlIHNvIGRlYnVnZ2VycyBjYW4gcmV0cmlldmUgdmFyaWFibGUgbmFtZXMKKyAgICAgICAgaWYgKHRydWUpIHsvL0FzbUNsYXNzR2VuZXJhdG9yLkNSRUFURV9ERUJVR19JTkZPKSB7CisgICAgICAgICAgICBpZiAodGhpc0VuZExhYmVsPT1udWxsKSBzZXRFbmRMYWJlbHMoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKCFzY29wZS5pc0luU3RhdGljQ29udGV4dCgpKSB7CisgICAgICAgICAgICAgICAgLy8gd3JpdGUgInRoaXMiCisgICAgICAgICAgICAgICAgbXYudmlzaXRMb2NhbFZhcmlhYmxlKCJ0aGlzIiwgY2xhc3NOYW1lLCBudWxsLCB0aGlzU3RhcnRMYWJlbCwgdGhpc0VuZExhYmVsLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgCisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gdXNlZFZhcmlhYmxlcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgVmFyaWFibGUgdiA9IChWYXJpYWJsZSkgaXRlcmF0b3IubmV4dCgpOworICAgICAgICAgICAgICAgIFN0cmluZyB0eXBlID0gQnl0ZWNvZGVIZWxwZXIuZ2V0VHlwZURlc2NyaXB0aW9uKHYuZ2V0VHlwZSgpKTsKKyAgICAgICAgICAgICAgICBMYWJlbCBzdGFydCA9IHYuZ2V0U3RhcnRMYWJlbCgpOworICAgICAgICAgICAgICAgIExhYmVsIGVuZCA9IHYuZ2V0RW5kTGFiZWwoKTsKKyAgICAgICAgICAgICAgICBtdi52aXNpdExvY2FsVmFyaWFibGUodi5nZXROYW1lKCksIHR5cGUsIG51bGwsIHN0YXJ0LCBlbmQsIHYuZ2V0SW5kZXgoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcG9wKCk7CisgICAgICAgIHN0YWNrVmFyaWFibGVzLmNsZWFyKCk7CisgICAgICAgIHVzZWRWYXJpYWJsZXMuY2xlYXIoKTsKKyAgICAgICAgc2NvcGUgPSBudWxsOworICAgICAgICBtdj1udWxsOworICAgICAgICByZXNldFZhcmlhYmxlSW5kZXgoZmFsc2UpOworICAgICAgICBzdXBlckJsb2NrTmFtZWRMYWJlbHMuY2xlYXIoKTsKKyAgICAgICAgY3VycmVudEJsb2NrTmFtZWRMYWJlbHMuY2xlYXIoKTsKKyAgICAgICAgbmFtZWRMb29wQnJlYWtMYWJlbC5jbGVhcigpOworICAgICAgICBuYW1lZExvb3BDb250aW51ZUxhYmVsLmNsZWFyKCk7CisgICAgICAgIGNvbnRpbnVlTGFiZWw9bnVsbDsKKyAgICAgICAgYnJlYWtMYWJlbD1udWxsOworICAgICAgICBoZWxwZXIgPSBudWxsOworICAgICAgICB0aGlzU3RhcnRMYWJlbD1udWxsOworICAgICAgICB0aGlzRW5kTGFiZWw9bnVsbDsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogaW5pdGlhbGl6ZXMgdGhpcyBjbGFzcyBmb3IgYSBNZXRob2ROb2RlLiBUaGlzIG1ldGhvZCB3aWxsCisgICAgICogYXV0b21hdGljYWxseSBkZWZpbmUgdmFyaWJhbGVzIGZvciB0aGUgbWV0aG9kIHBhcmFtZXRlcnMKKyAgICAgKiBhbmQgd2lsbCBjcmVhdGUgcmVmZXJlbmNlcyBpZiBuZWVkZWQuIHRoZSBjcmVhdGVkIHZhcmlhYmxlcworICAgICAqIGNhbiBiZSBnZXQgYnkgZ2V0VmFyaWFibGUKKyAgICAgKiAKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KFZhcmlhYmxlU2NvcGUgZWwsIFBhcmFtZXRlcltdIHBhcmFtZXRlcnMsIE1ldGhvZFZpc2l0b3IgbXYsIENsYXNzTm9kZSBjbikgeworICAgICAgICBpZiAoIWNsZWFyKSB0aHJvdyBuZXcgR3Jvb3Z5QnVnRXJyb3IoIkNvbXBpbGVTdGFjayNpbml0IGNhbGxlZCB3aXRob3V0IGNhbGxpbmcgY2xlYXIgYmVmb3JlIik7CisgICAgICAgIGNsZWFyPWZhbHNlOworICAgICAgICBwdXNoVmFyaWFibGVTY29wZShlbCk7CisgICAgICAgIHRoaXMubXYgPSBtdjsKKyAgICAgICAgdGhpcy5oZWxwZXIgPSBuZXcgQnl0ZWNvZGVIZWxwZXIobXYpOworICAgICAgICBkZWZpbmVNZXRob2RWYXJpYWJsZXMocGFyYW1ldGVycyxlbC5pc0luU3RhdGljQ29udGV4dCgpKTsKKyAgICAgICAgdGhpcy5jbGFzc05hbWUgPSBCeXRlY29kZUhlbHBlci5nZXRUeXBlRGVzY3JpcHRpb24oY24pOworICAgICAgICBjdXJyZW50Q2xhc3NJbmRleCA9IC0xOyBjdXJyZW50TWV0YUNsYXNzSW5kZXggPSAtMTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYXVzZXMgdGhlIHN0YXRlc3RhY2sgdG8gYWRkIGFuIGVsZW1lbnQgYW5kIHNldHMKKyAgICAgKiB0aGUgZ2l2ZW4gc2NvcGUgYXMgbmV3IGN1cnJlbnQgdmFyaWFibGUgc2NvcGUuIENyZWF0ZXMgCisgICAgICogYSBlbGVtZW50IGZvciB0aGUgc3RhdGUgc3RhY2sgc28gcG9wIGhhcyB0byBiZSBjYWxsZWQgbGF0ZXIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBwdXNoVmFyaWFibGVTY29wZShWYXJpYWJsZVNjb3BlIGVsKSB7CisgICAgICAgIHB1c2hTdGF0ZSgpOworICAgICAgICBzY29wZSA9IGVsOworICAgICAgICBzdXBlckJsb2NrTmFtZWRMYWJlbHMgPSBuZXcgSGFzaE1hcChzdXBlckJsb2NrTmFtZWRMYWJlbHMpOworICAgICAgICBzdXBlckJsb2NrTmFtZWRMYWJlbHMucHV0QWxsKGN1cnJlbnRCbG9ja05hbWVkTGFiZWxzKTsKKyAgICAgICAgY3VycmVudEJsb2NrTmFtZWRMYWJlbHMgPSBuZXcgSGFzaE1hcCgpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTaG91bGQgYmUgY2FsbGVkIHdoZW4gZGVjZW5kaW5nIGludG8gYSBsb29wIHRoYXQgZGVmaW5lcworICAgICAqIGFsc28gYSBzY29wZS4gQ2FsbHMgcHVzaFZhcmlhYmxlU2NvcGUgYW5kIHByZXBhcmVzIGxhYmVscyAKKyAgICAgKiBmb3IgYSBsb29wIHN0cnVjdHVyZS4gQ3JlYXRlcyBhIGVsZW1lbnQgZm9yIHRoZSBzdGF0ZSBzdGFjaworICAgICAqIHNvIHBvcCBoYXMgdG8gYmUgY2FsbGVkIGxhdGVyIAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHB1c2hMb29wKFZhcmlhYmxlU2NvcGUgZWwsIFN0cmluZyBsYWJlbE5hbWUpIHsKKyAgICAgICAgcHVzaFZhcmlhYmxlU2NvcGUoZWwpOworICAgICAgICBpbml0TG9vcExhYmVscyhsYWJlbE5hbWUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0TG9vcExhYmVscyhTdHJpbmcgbGFiZWxOYW1lKSB7CisgICAgICAgIGNvbnRpbnVlTGFiZWwgPSBuZXcgTGFiZWwoKTsKKyAgICAgICAgYnJlYWtMYWJlbCA9IG5ldyBMYWJlbCgpOworICAgICAgICBpZiAobGFiZWxOYW1lIT1udWxsKSB7CisgICAgICAgIAluYW1lZExvb3BCcmVha0xhYmVsLnB1dChsYWJlbE5hbWUsYnJlYWtMYWJlbCk7CisgICAgICAgIAluYW1lZExvb3BDb250aW51ZUxhYmVsLnB1dChsYWJlbE5hbWUsY29udGludWVMYWJlbCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2hvdWxkIGJlIGNhbGxlZCB3aGVuIGRlY2VuZGluZyBpbnRvIGEgbG9vcCB0aGF0IGRvZXMgCisgICAgICogbm90IGRlZmluZSBhIHNjb3BlLiBDcmVhdGVzIGEgZWxlbWVudCBmb3IgdGhlIHN0YXRlIHN0YWNrCisgICAgICogc28gcG9wIGhhcyB0byBiZSBjYWxsZWQgbGF0ZXIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBwdXNoTG9vcChTdHJpbmcgbGFiZWxOYW1lKSB7CisgICAgICAgIHB1c2hTdGF0ZSgpOworICAgICAgICBpbml0TG9vcExhYmVscyhsYWJlbE5hbWUpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBVc2VkIGZvciA8Y29kZT5icmVhayBmb288L2NvZGU+IGluc2lkZSBhIGxvb3AgdG8gZW5kIHRoZQorICAgICAqIGV4ZWN1dGlvbiBvZiB0aGUgbWFya2VkIGxvb3AuIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZQorICAgICAqIGJyZWFrIGxhYmVsIG9mIHRoZSBsb29wIGlmIHRoZXJlIGlzIG9uZSBmb3VuZCBmb3IgdGhlIG5hbWUuCisgICAgICogSWYgbm90LCB0aGUgY3VycmVudCBicmVhayBsYWJlbCBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTGFiZWwgZ2V0TmFtZWRCcmVha0xhYmVsKFN0cmluZyBuYW1lKSB7CisgICAgCUxhYmVsIGxhYmVsID0gZ2V0QnJlYWtMYWJlbCgpOworICAgIAlMYWJlbCBlbmRMYWJlbCA9IG51bGw7CisgICAgICAgIGlmIChuYW1lIT1udWxsKSBlbmRMYWJlbCA9IChMYWJlbCkgbmFtZWRMb29wQnJlYWtMYWJlbC5nZXQobmFtZSk7CisgICAgCWlmIChlbmRMYWJlbCE9bnVsbCkgbGFiZWwgPSBlbmRMYWJlbDsKKyAgICAgICAgcmV0dXJuIGxhYmVsOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBVc2VkIGZvciA8Y29kZT5jb250aW51ZSBmb288L2NvZGU+IGluc2lkZSBhIGxvb3AgdG8gY29udGludWUKKyAgICAgKiB0aGUgZXhlY3V0aW9uIG9mIHRoZSBtYXJrZWQgbG9vcC4gVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gCisgICAgICogdGhlIGJyZWFrIGxhYmVsIG9mIHRoZSBsb29wIGlmIHRoZXJlIGlzIG9uZSBmb3VuZCBmb3IgdGhlIAorICAgICAqIG5hbWUuIElmIG5vdCwgZ2V0TGFiZWwgaXMgdXNlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTGFiZWwgZ2V0TmFtZWRDb250aW51ZUxhYmVsKFN0cmluZyBuYW1lKSB7CisgICAgCUxhYmVsIGxhYmVsID0gZ2V0TGFiZWwobmFtZSk7CisgICAgCUxhYmVsIGVuZExhYmVsID0gbnVsbDsKKyAgICAgICAgaWYgKG5hbWUhPW51bGwpIGVuZExhYmVsID0gKExhYmVsKSBuYW1lZExvb3BDb250aW51ZUxhYmVsLmdldChuYW1lKTsKKyAgICAJaWYgKGVuZExhYmVsIT1udWxsKSBsYWJlbCA9IGVuZExhYmVsOworICAgICAgICByZXR1cm4gbGFiZWw7CisgICAgfSAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGJyZWFrIGxhYmVsIGFuZCBhIGVsZW1lbnQgZm9yIHRoZSBzdGF0ZSBzdGFjaworICAgICAqIHNvIHBvcCBoYXMgdG8gYmUgY2FsbGVkIGxhdGVyCisgICAgICovCisgICAgcHJvdGVjdGVkIExhYmVsIHB1c2hTd2l0Y2goKXsKKyAgICAgICAgcHVzaFN0YXRlKCk7CisgICAgICAgIGJyZWFrTGFiZWwgPSBuZXcgTGFiZWwoKTsKKyAgICAgICAgcmV0dXJuIGJyZWFrTGFiZWw7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIGJlY2F1c2UgYSBib29sZWFuIEV4cHJlc3Npb24gbWF5IG5vdCBiZSBldmFsdWF0ZWQgY29tcGxldGx5CisgICAgICogaXQgaXMgaW1wb3J0YW50IHRvIGtlZXAgdGhlIHJlZ2lzdGVycyBjbGVhbgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHB1c2hCb29sZWFuRXhwcmVzc2lvbigpeworICAgICAgICBwdXNoU3RhdGUoKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBWYXJpYWJsZSBkZWZpbmVWYXIoU3RyaW5nIG5hbWUsIENsYXNzTm9kZSB0eXBlLCBib29sZWFuIG1ldGhvZFBhcmFtZXRlclVzZWRJbkNsb3N1cmUpIHsKKyAgICAgICAgbWFrZU5leHRWYXJpYWJsZUlEKHR5cGUpOworICAgICAgICBpbnQgaW5kZXggPSBjdXJyZW50VmFyaWFibGVJbmRleDsKKyAgICAgICAgaWYgKG1ldGhvZFBhcmFtZXRlclVzZWRJbkNsb3N1cmUpIHsKKyAgICAgICAgICAgIGluZGV4ID0gbG9jYWxWYXJpYWJsZU9mZnNldCsrOworICAgICAgICAgICAgdHlwZSA9IENsYXNzSGVscGVyLmdldFdyYXBwZXIodHlwZSk7CisgICAgICAgIH0KKyAgICAgICAgVmFyaWFibGUgYW5zd2VyID0gbmV3IFZhcmlhYmxlKGluZGV4LCB0eXBlLCBuYW1lKTsKKyAgICAgICAgdXNlZFZhcmlhYmxlcy5hZGQoYW5zd2VyKTsKKyAgICAgICAgYW5zd2VyLnNldEhvbGRlcihtZXRob2RQYXJhbWV0ZXJVc2VkSW5DbG9zdXJlKTsKKyAgICAgICAgcmV0dXJuIGFuc3dlcjsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSB2b2lkIG1ha2VMb2NhbFZhcmlhYmxlc09mZnNldChQYXJhbWV0ZXJbXSBwYXJhcyxib29sZWFuIGlzSW5TdGF0aWNDb250ZXh0KSB7CisgICAgICAgIHJlc2V0VmFyaWFibGVJbmRleChpc0luU3RhdGljQ29udGV4dCk7CisgICAgICAgIAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBtYWtlTmV4dFZhcmlhYmxlSUQocGFyYXNbaV0uZ2V0VHlwZSgpKTsKKyAgICAgICAgfQorICAgICAgICBsb2NhbFZhcmlhYmxlT2Zmc2V0ID0gbmV4dFZhcmlhYmxlSW5kZXg7CisgICAgICAgIAorICAgICAgICByZXNldFZhcmlhYmxlSW5kZXgoaXNJblN0YXRpY0NvbnRleHQpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgZGVmaW5lTWV0aG9kVmFyaWFibGVzKFBhcmFtZXRlcltdIHBhcmFzLGJvb2xlYW4gaXNJblN0YXRpY0NvbnRleHQpIHsKKyAgICAgICAgTGFiZWwgc3RhcnRMYWJlbCAgPSBuZXcgTGFiZWwoKTsKKyAgICAgICAgdGhpc1N0YXJ0TGFiZWwgPSBzdGFydExhYmVsOworICAgICAgICBtdi52aXNpdExhYmVsKHN0YXJ0TGFiZWwpOworICAgICAgICAKKyAgICAgICAgbWFrZUxvY2FsVmFyaWFibGVzT2Zmc2V0KHBhcmFzLGlzSW5TdGF0aWNDb250ZXh0KTsgICAgICAKKyAgICAgICAgCisgICAgICAgIGJvb2xlYW4gaGFzSG9sZGVyID0gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gcGFyYXNbaV0uZ2V0TmFtZSgpOworICAgICAgICAgICAgVmFyaWFibGUgYW5zd2VyOworICAgICAgICAgICAgQ2xhc3NOb2RlIHR5cGUgPSBwYXJhc1tpXS5nZXRUeXBlKCk7CisgICAgICAgICAgICBpZiAocGFyYXNbaV0uaXNDbG9zdXJlU2hhcmVkVmFyaWFibGUoKSkgeworICAgICAgICAgICAgICAgIGFuc3dlciA9IGRlZmluZVZhcihuYW1lLCB0eXBlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBoZWxwZXIubG9hZCh0eXBlLGN1cnJlbnRWYXJpYWJsZUluZGV4KTsKKyAgICAgICAgICAgICAgICBoZWxwZXIuYm94KHR5cGUpOworICAgICAgICAgICAgICAgIGNyZWF0ZVJlZmVyZW5jZShhbnN3ZXIpOworICAgICAgICAgICAgICAgIGhhc0hvbGRlciA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFuc3dlciA9IGRlZmluZVZhcihuYW1lLHR5cGUsZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYW5zd2VyLnNldFN0YXJ0TGFiZWwoc3RhcnRMYWJlbCk7CisgICAgICAgICAgICBzdGFja1ZhcmlhYmxlcy5wdXQobmFtZSwgYW5zd2VyKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKGhhc0hvbGRlcikgeworICAgICAgICAgICAgbmV4dFZhcmlhYmxlSW5kZXggPSBsb2NhbFZhcmlhYmxlT2Zmc2V0OworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVJlZmVyZW5jZShWYXJpYWJsZSByZWZlcmVuY2UpIHsKKyAgICAgICAgbXYudmlzaXRUeXBlSW5zbihORVcsICJncm9vdnkvbGFuZy9SZWZlcmVuY2UiKTsKKyAgICAgICAgbXYudmlzaXRJbnNuKERVUF9YMSk7CisgICAgICAgIG12LnZpc2l0SW5zbihTV0FQKTsKKyAgICAgICAgbXYudmlzaXRNZXRob2RJbnNuKElOVk9LRVNQRUNJQUwsICJncm9vdnkvbGFuZy9SZWZlcmVuY2UiLCAiPGluaXQ+IiwgIihMamF2YS9sYW5nL09iamVjdDspViIpOworICAgICAgICBtdi52aXNpdFZhckluc24oQVNUT1JFLCByZWZlcmVuY2UuZ2V0SW5kZXgoKSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIERlZmluZXMgYSBuZXcgVmFyaWFibGUgdXNpbmcgYW4gQVNUIHZhcmlhYmxlLgorICAgICAqIEBwYXJhbSBpbml0RnJvbVN0YWNrIGlmIHRydWUgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgCisgICAgICogICAgICAgICAgICAgICAgICAgICAgc3RhY2sgd2lsbCBiZSB1c2VkIHRvIGluaXRpbGl6ZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRoZSBuZXcgdmFyaWFibGUuIElmIGZhbHNlIG51bGwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHVzZWQuCisgICAgICovCisgICAgcHVibGljIFZhcmlhYmxlIGRlZmluZVZhcmlhYmxlKG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LlZhcmlhYmxlIHYsIGJvb2xlYW4gaW5pdEZyb21TdGFjaykgeworICAgICAgICBTdHJpbmcgbmFtZSA9IHYuZ2V0TmFtZSgpOworICAgICAgICBWYXJpYWJsZSBhbnN3ZXIgPSBkZWZpbmVWYXIobmFtZSx2LmdldFR5cGUoKSxmYWxzZSk7CisgICAgICAgIGlmICh2LmlzQ2xvc3VyZVNoYXJlZFZhcmlhYmxlKCkpIGFuc3dlci5zZXRIb2xkZXIodHJ1ZSk7CisgICAgICAgIHN0YWNrVmFyaWFibGVzLnB1dChuYW1lLCBhbnN3ZXIpOworICAgICAgICAKKyAgICAgICAgTGFiZWwgc3RhcnRMYWJlbCAgPSBuZXcgTGFiZWwoKTsKKyAgICAgICAgYW5zd2VyLnNldFN0YXJ0TGFiZWwoc3RhcnRMYWJlbCk7CisgICAgICAgIGlmIChhbnN3ZXIuaXNIb2xkZXIoKSkgIHsKKyAgICAgICAgICAgIGlmICghaW5pdEZyb21TdGFjaykgbXYudmlzaXRJbnNuKEFDT05TVF9OVUxMKTsKKyAgICAgICAgICAgIGNyZWF0ZVJlZmVyZW5jZShhbnN3ZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCFpbml0RnJvbVN0YWNrKSBtdi52aXNpdEluc24oQUNPTlNUX05VTEwpOworICAgICAgICAgICAgbXYudmlzaXRWYXJJbnNuKEFTVE9SRSwgY3VycmVudFZhcmlhYmxlSW5kZXgpOyAgICAgICAgICAgIAorICAgICAgICB9IAorICAgICAgICBtdi52aXNpdExhYmVsKHN0YXJ0TGFiZWwpOworICAgICAgICByZXR1cm4gYW5zd2VyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSBvZiBpbnRlcmVzdAorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhIHZhcmlhYmxlIGlzIGFscmVhZHkgZGVmaW5lZAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zVmFyaWFibGUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIHN0YWNrVmFyaWFibGVzLmNvbnRhaW5zS2V5KG5hbWUpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDYWxjdWxhdGVzIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBmcmVlIHJlZ2lzdGVyIHN0b3JlcyBpcgorICAgICAqIGFuZCBzZXRzIHRoZSBjdXJyZW50IHZhcmlhYmxlIGluZGV4IHRvIHRoZSBvbGQgdmFsdWUKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgbWFrZU5leHRWYXJpYWJsZUlEKENsYXNzTm9kZSB0eXBlKSB7CisgICAgICAgIGN1cnJlbnRWYXJpYWJsZUluZGV4ID0gbmV4dFZhcmlhYmxlSW5kZXg7CisgICAgICAgIGlmICh0eXBlPT1DbGFzc0hlbHBlci5sb25nX1RZUEUgfHwgdHlwZT09Q2xhc3NIZWxwZXIuZG91YmxlX1RZUEUpIHsKKyAgICAgICAgICAgIG5leHRWYXJpYWJsZUluZGV4Kys7CisgICAgICAgIH0KKyAgICAgICAgbmV4dFZhcmlhYmxlSW5kZXgrKzsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbGFiZWwgZm9yIHRoZSBnaXZlbiBuYW1lIAorICAgICAqLworICAgIHB1YmxpYyBMYWJlbCBnZXRMYWJlbChTdHJpbmcgbmFtZSkgeworICAgICAgICBpZiAobmFtZT09bnVsbCkgcmV0dXJuIG51bGw7CisgICAgICAgIExhYmVsIGwgPSAoTGFiZWwpIHN1cGVyQmxvY2tOYW1lZExhYmVscy5nZXQobmFtZSk7CisgICAgICAgIGlmIChsPT1udWxsKSBsID0gY3JlYXRlTG9jYWxMYWJlbChuYW1lKTsKKyAgICAgICAgcmV0dXJuIGw7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIGNyZWF0ZXMgYSBuZXcgbmFtZWQgbGFiZWwKKyAgICAgKi8KKyAgICBwdWJsaWMgTGFiZWwgY3JlYXRlTG9jYWxMYWJlbChTdHJpbmcgbmFtZSkgeworICAgICAgICBMYWJlbCBsID0gKExhYmVsKSBjdXJyZW50QmxvY2tOYW1lZExhYmVscy5nZXQobmFtZSk7CisgICAgICAgIGlmIChsPT1udWxsKSB7CisgICAgICAgICAgICBsID0gbmV3IExhYmVsKCk7CisgICAgICAgICAgICBjdXJyZW50QmxvY2tOYW1lZExhYmVscy5wdXQobmFtZSxsKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbDsKKyAgICB9CisgICAgCisgICAgcHVibGljIGludCBnZXRDdXJyZW50Q2xhc3NJbmRleCgpeworICAgICAgICByZXR1cm4gY3VycmVudENsYXNzSW5kZXg7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldEN1cnJlbnRDbGFzc0luZGV4KGludCBpbmRleCl7CisgICAgICAgIGN1cnJlbnRDbGFzc0luZGV4PWluZGV4OworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgaW50IGdldEN1cnJlbnRNZXRhQ2xhc3NJbmRleCgpeworICAgICAgICByZXR1cm4gY3VycmVudE1ldGFDbGFzc0luZGV4OworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRDdXJyZW50TWV0YUNsYXNzSW5kZXgoaW50IGluZGV4KXsKKyAgICAgICAgY3VycmVudE1ldGFDbGFzc0luZGV4PWluZGV4OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFwcGx5RmluYWxseUJsb2NrcyhMYWJlbCBsYWJlbCwgYm9vbGVhbiBpc0JyZWFrTGFiZWwpIHsKKyAgICAgICAgLy8gZmlyc3QgZmluZCB0aGUgc3RhdGUgZGVmaW5pbmcgdGhlIGxhYmVsLiBUaGF0IGlzIHRoZSBzdGF0ZQorICAgICAgICAvLyBkaXJlY3RseSBhZnRlciB0aGUgc3RhdGUgbm90IGtub3dpbmcgdGhpcyBsYWJlbC4gSWYgbm8gc3RhdGUKKyAgICAgICAgLy8gaW4gdGhlIGxpc3Qga25vd3MgdGhhdCBsYWJlbCwgdGhlbiB0aGUgZGVmaW5pbmcgc3RhdGUgaXMgdGhlCisgICAgICAgIC8vIGN1cnJlbnQgc3RhdGUuCisgICAgICAgIFN0YXRlU3RhY2tFbGVtZW50IHJlc3VsdCA9IG51bGw7CisgICAgICAgIGZvciAoTGlzdEl0ZXJhdG9yIGl0ZXIgPSBzdGF0ZVN0YWNrLmxpc3RJdGVyYXRvcihzdGF0ZVN0YWNrLnNpemUoKSk7IGl0ZXIuaGFzUHJldmlvdXMoKTspIHsKKyAgICAgICAgICAgIFN0YXRlU3RhY2tFbGVtZW50IGVsZW1lbnQgPSAoU3RhdGVTdGFja0VsZW1lbnQpIGl0ZXIucHJldmlvdXMoKTsKKyAgICAgICAgICAgIGlmICghZWxlbWVudC5jdXJyZW50QmxvY2tOYW1lZExhYmVscy52YWx1ZXMoKS5jb250YWlucyhsYWJlbCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNCcmVha0xhYmVsICYmIGVsZW1lbnQuYnJlYWtMYWJlbCAhPSBsYWJlbCkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBlbGVtZW50OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFpc0JyZWFrTGFiZWwgJiYgZWxlbWVudC5jb250aW51ZUxhYmVsICE9IGxhYmVsKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGVsZW1lbnQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgTGlzdCBibG9ja3NUb1JlbW92ZTsKKyAgICAgICAgaWYgKHJlc3VsdD09bnVsbCkgeworICAgICAgICAgICAgLy8gYWxsIEJsb2NrcyBkbyBrbm93IHRoZSBsYWJlbCwgc28gdXNlIGFsbCBmaW5hbGx5IGJsb2NrcworICAgICAgICAgICAgYmxvY2tzVG9SZW1vdmUgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYmxvY2tzVG9SZW1vdmUgPSByZXN1bHQuZmluYWxseUJsb2NrczsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQXJyYXlMaXN0IGJsb2NrcyA9IG5ldyBBcnJheUxpc3QoZmluYWxseUJsb2Nrcyk7CisgICAgICAgIGJsb2Nrcy5yZW1vdmVBbGwoYmxvY2tzVG9SZW1vdmUpOworICAgICAgICBhcHBseUZpbmFsbHlCbG9ja3MoYmxvY2tzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXBwbHlGaW5hbGx5QmxvY2tzKExpc3QgYmxvY2tzKSB7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGJsb2Nrcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIFJ1bm5hYmxlIGJsb2NrID0gKFJ1bm5hYmxlKSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIGlmICh2aXNpdGVkQmxvY2tzLmNvbnRhaW5zKGJsb2NrKSkgY29udGludWU7CisgICAgICAgICAgICBibG9jay5ydW4oKTsKKyAgICAgICAgfSAgICAgCisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGFwcGx5RmluYWxseUJsb2NrcygpIHsKKyAgICAgICAgYXBwbHlGaW5hbGx5QmxvY2tzKGZpbmFsbHlCbG9ja3MpOyAKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNGaW5hbGx5QmxvY2tzKCkgeworICAgICAgICByZXR1cm4gIWZpbmFsbHlCbG9ja3MuaXNFbXB0eSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHB1c2hGaW5hbGx5QmxvY2soUnVubmFibGUgYmxvY2spIHsKKyAgICAgICAgZmluYWxseUJsb2Nrcy5hZGRGaXJzdChibG9jayk7CisgICAgICAgIHB1c2hTdGF0ZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBvcEZpbmFsbHlCbG9jaygpIHsKKyAgICAgICAgcG9wU3RhdGUoKTsKKyAgICAgICAgZmluYWxseUJsb2Nrcy5yZW1vdmVGaXJzdCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHB1c2hGaW5hbGx5QmxvY2tWaXNpdChSdW5uYWJsZSBibG9jaykgeworICAgICAgICB2aXNpdGVkQmxvY2tzLmFkZChibG9jayk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHBvcEZpbmFsbHlCbG9ja1Zpc2l0KFJ1bm5hYmxlIGJsb2NrKSB7CisgICAgICAgIHZpc2l0ZWRCbG9ja3MucmVtb3ZlKGJsb2NrKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9EdW1teUNsYXNzR2VuZXJhdG9yLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9EdW1teUNsYXNzR2VuZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE4YzI3MAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL0R1bW15Q2xhc3NHZW5lcmF0b3IuamF2YQpAQCAtMCwwICsxLDE3MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW47CisKK2ltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlSdW50aW1lRXhjZXB0aW9uOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0Lio7CitpbXBvcnQgb3JnLm9iamVjdHdlYi5hc20uQ2xhc3NWaXNpdG9yOworaW1wb3J0IG9yZy5vYmplY3R3ZWIuYXNtLk1ldGhvZFZpc2l0b3I7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKKy8qKgorICogVG8gZ2VuZXJhdGUgYSBjbGFzcyB0aGF0IGhhcyBhbGwgdGhlIGZpZWxkcyBhbmQgbWV0aG9kcywgZXhjZXB0IHRoYXQgZmllbGRzIGFyZSBub3QgaW5pdGlsaXplZAorICogYW5kIG1ldGhvZHMgYXJlIGVtcHR5LiBJdCdzIGludGVuZGVkIGZvciBiZWluZyB1c2VkIGFzIGEgcGxhY2UgaG9sZGVyIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KKyAqIG9mIHJlZmVyZW5jZSB0byB0aGUgInRoaXMiIGNsYXNzIGl0c2VsZi4KKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86YjU1ckBzaW5hLmNvbSI+QmluZyBSYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBEdW1teUNsYXNzR2VuZXJhdG9yIGV4dGVuZHMgQ2xhc3NHZW5lcmF0b3IgeworCisgICAgcHJpdmF0ZSBDbGFzc1Zpc2l0b3IgY3Y7CisgICAgcHJpdmF0ZSBNZXRob2RWaXNpdG9yIG12OworICAgIHByaXZhdGUgR2VuZXJhdG9yQ29udGV4dCBjb250ZXh0OworCisgICAgcHJpdmF0ZSBTdHJpbmcgc291cmNlRmlsZTsKKworICAgIC8vIGN1cnJlbnQgY2xhc3MgZGV0YWlscworICAgIHByaXZhdGUgQ2xhc3NOb2RlIGNsYXNzTm9kZTsKKyAgICBwcml2YXRlIFN0cmluZyBpbnRlcm5hbENsYXNzTmFtZTsKKyAgICBwcml2YXRlIFN0cmluZyBpbnRlcm5hbEJhc2VDbGFzc05hbWU7CisKKworICAgIHB1YmxpYyBEdW1teUNsYXNzR2VuZXJhdG9yKAorICAgICAgICAgICAgR2VuZXJhdG9yQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgQ2xhc3NWaXNpdG9yIGNsYXNzVmlzaXRvciwKKyAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyLAorICAgICAgICAgICAgU3RyaW5nIHNvdXJjZUZpbGUpIHsKKyAgICAgICAgc3VwZXIoY2xhc3NMb2FkZXIpOworICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OworICAgICAgICB0aGlzLmN2ID0gY2xhc3NWaXNpdG9yOworICAgICAgICB0aGlzLnNvdXJjZUZpbGUgPSBzb3VyY2VGaWxlOworICAgIH0KKworICAgIC8vIEdyb292eUNsYXNzVmlzaXRvciBpbnRlcmZhY2UKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBwdWJsaWMgdm9pZCB2aXNpdENsYXNzKENsYXNzTm9kZSBjbGFzc05vZGUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRoaXMuY2xhc3NOb2RlID0gY2xhc3NOb2RlOworICAgICAgICAgICAgdGhpcy5pbnRlcm5hbENsYXNzTmFtZSA9IEJ5dGVjb2RlSGVscGVyLmdldENsYXNzSW50ZXJuYWxOYW1lKGNsYXNzTm9kZSk7CisKKyAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJHZW5lcmF0aW5nIGNsYXNzOiAiICsgY2xhc3NOb2RlLmdldE5hbWUoKSk7CisKKyAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxCYXNlQ2xhc3NOYW1lID0gQnl0ZWNvZGVIZWxwZXIuZ2V0Q2xhc3NJbnRlcm5hbE5hbWUoY2xhc3NOb2RlLmdldFN1cGVyQ2xhc3MoKSk7CisKKyAgICAgICAgICAgIGN2LnZpc2l0KAorICAgICAgICAgICAgICAgICAgICBhc21KREtWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICBjbGFzc05vZGUuZ2V0TW9kaWZpZXJzKCksCisgICAgICAgICAgICAgICAgICAgIGludGVybmFsQ2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSBudWxsLAorICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbEJhc2VDbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgIEJ5dGVjb2RlSGVscGVyLmdldENsYXNzSW50ZXJuYWxOYW1lcyhjbGFzc05vZGUuZ2V0SW50ZXJmYWNlcygpKQorICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgY2xhc3NOb2RlLnZpc2l0Q29udGVudHModGhpcyk7CisKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGlubmVyQ2xhc3Nlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBDbGFzc05vZGUgaW5uZXJDbGFzcyA9IChDbGFzc05vZGUpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIENsYXNzTm9kZSBpbm5lckNsYXNzVHlwZSA9IGlubmVyQ2xhc3M7CisgICAgICAgICAgICAgICAgU3RyaW5nIGlubmVyQ2xhc3NJbnRlcm5hbE5hbWUgPSBCeXRlY29kZUhlbHBlci5nZXRDbGFzc0ludGVybmFsTmFtZShpbm5lckNsYXNzVHlwZSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIG91dGVyQ2xhc3NOYW1lID0gaW50ZXJuYWxDbGFzc05hbWU7IC8vIGRlZmF1bHQgZm9yIGlubmVyIGNsYXNzZXMKKyAgICAgICAgICAgICAgICBNZXRob2ROb2RlIGVuY2xvc2luZ01ldGhvZCA9IGlubmVyQ2xhc3MuZ2V0RW5jbG9zaW5nTWV0aG9kKCk7CisgICAgICAgICAgICAgICAgaWYgKGVuY2xvc2luZ01ldGhvZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGxvY2FsIGlubmVyIGNsYXNzZXMgZG8gbm90IHNwZWNpZnkgdGhlIG91dGVyIGNsYXNzIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgb3V0ZXJDbGFzc05hbWUgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjdi52aXNpdElubmVyQ2xhc3MoCisgICAgICAgICAgICAgICAgICAgICAgICBpbm5lckNsYXNzSW50ZXJuYWxOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZXJDbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbm5lckNsYXNzVHlwZS5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICBpbm5lckNsYXNzLmdldE1vZGlmaWVycygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGN2LnZpc2l0RW5kKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEdyb292eVJ1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5zZXRNb2R1bGUoY2xhc3NOb2RlLmdldE1vZHVsZSgpKTsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdENvbnN0cnVjdG9yKENvbnN0cnVjdG9yTm9kZSBub2RlKSB7CisKKyAgICAgICAgdmlzaXRQYXJhbWV0ZXJzKG5vZGUsIG5vZGUuZ2V0UGFyYW1ldGVycygpKTsKKworICAgICAgICBTdHJpbmcgbWV0aG9kVHlwZSA9IEJ5dGVjb2RlSGVscGVyLmdldE1ldGhvZERlc2NyaXB0b3IoQ2xhc3NIZWxwZXIuVk9JRF9UWVBFLCBub2RlLmdldFBhcmFtZXRlcnMoKSk7CisgICAgICAgIG12ID0gY3YudmlzaXRNZXRob2Qobm9kZS5nZXRNb2RpZmllcnMoKSwgIjxpbml0PiIsIG1ldGhvZFR5cGUsIG51bGwsIG51bGwpOworICAgICAgICBtdi52aXNpdFR5cGVJbnNuKE5FVywgImphdmEvbGFuZy9SdW50aW1lRXhjZXB0aW9uIik7CisgICAgICAgIG12LnZpc2l0SW5zbihEVVApOworICAgICAgICBtdi52aXNpdExkY0luc24oIm5vdCBpbnRlbmRlZCBmb3IgZXhlY3V0aW9uIik7CisgICAgICAgIG12LnZpc2l0TWV0aG9kSW5zbihJTlZPS0VTUEVDSUFMLCAiamF2YS9sYW5nL1J1bnRpbWVFeGNlcHRpb24iLCAiPGluaXQ+IiwgIihMamF2YS9sYW5nL1N0cmluZzspViIpOworICAgICAgICBtdi52aXNpdEluc24oQVRIUk9XKTsKKyAgICAgICAgbXYudmlzaXRNYXhzKDAsIDApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0TWV0aG9kKE1ldGhvZE5vZGUgbm9kZSkgeworCisgICAgICAgIHZpc2l0UGFyYW1ldGVycyhub2RlLCBub2RlLmdldFBhcmFtZXRlcnMoKSk7CisKKyAgICAgICAgU3RyaW5nIG1ldGhvZFR5cGUgPSBCeXRlY29kZUhlbHBlci5nZXRNZXRob2REZXNjcmlwdG9yKG5vZGUuZ2V0UmV0dXJuVHlwZSgpLCBub2RlLmdldFBhcmFtZXRlcnMoKSk7CisgICAgICAgIG12ID0gY3YudmlzaXRNZXRob2Qobm9kZS5nZXRNb2RpZmllcnMoKSwgbm9kZS5nZXROYW1lKCksIG1ldGhvZFR5cGUsIG51bGwsIG51bGwpOworCisgICAgICAgIG12LnZpc2l0VHlwZUluc24oTkVXLCAiamF2YS9sYW5nL1J1bnRpbWVFeGNlcHRpb24iKTsKKyAgICAgICAgbXYudmlzaXRJbnNuKERVUCk7CisgICAgICAgIG12LnZpc2l0TGRjSW5zbigibm90IGludGVuZGVkIGZvciBleGVjdXRpb24iKTsKKyAgICAgICAgbXYudmlzaXRNZXRob2RJbnNuKElOVk9LRVNQRUNJQUwsICJqYXZhL2xhbmcvUnVudGltZUV4Y2VwdGlvbiIsICI8aW5pdD4iLCAiKExqYXZhL2xhbmcvU3RyaW5nOylWIik7CisgICAgICAgIG12LnZpc2l0SW5zbihBVEhST1cpOworCisgICAgICAgIG12LnZpc2l0TWF4cygwLCAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEZpZWxkKEZpZWxkTm9kZSBmaWVsZE5vZGUpIHsKKworICAgICAgICBjdi52aXNpdEZpZWxkKAorICAgICAgICAgICAgICAgIGZpZWxkTm9kZS5nZXRNb2RpZmllcnMoKSwKKyAgICAgICAgICAgICAgICBmaWVsZE5vZGUuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgIEJ5dGVjb2RlSGVscGVyLmdldFR5cGVEZXNjcmlwdGlvbihmaWVsZE5vZGUuZ2V0VHlwZSgpKSwKKyAgICAgICAgICAgICAgICBudWxsLCAvL2ZpZWxkVmFsdWUsICAvL2JyICBhbGwgdGhlIHN1ZGRlbiB0aGF0IG9uZSBjYW5ub3QgaW5pdCB0aGUgZmllbGQgaGVyZS4gaW5pdCBpcyBkb25lIGluIHN0YXRpYyBpbml0aWxpemVyIGFuZCBpbnN0YWNlIGludGlhbGl6ZXIuCisgICAgICAgICAgICAgICAgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGdldHRlciwgc2V0dGVyIGFuZCBmaWVsZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZpc2l0UHJvcGVydHkoUHJvcGVydHlOb2RlIHN0YXRlbWVudCkgeworICAgIH0KKworICAgIHByb3RlY3RlZCBDb21waWxlVW5pdCBnZXRDb21waWxlVW5pdCgpIHsKKyAgICAgICAgQ29tcGlsZVVuaXQgYW5zd2VyID0gY2xhc3NOb2RlLmdldENvbXBpbGVVbml0KCk7CisgICAgICAgIGlmIChhbnN3ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgYW5zd2VyID0gY29udGV4dC5nZXRDb21waWxlVW5pdCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhbnN3ZXI7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgdmlzaXRQYXJhbWV0ZXJzKEFTVE5vZGUgbm9kZSwgUGFyYW1ldGVyW10gcGFyYW1ldGVycykgeworICAgICAgICBmb3IgKGludCBpID0gMCwgc2l6ZSA9IHBhcmFtZXRlcnMubGVuZ3RoOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICB2aXNpdFBhcmFtZXRlcihub2RlLCBwYXJhbWV0ZXJzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHZpc2l0UGFyYW1ldGVyKEFTVE5vZGUgbm9kZSwgUGFyYW1ldGVyIHBhcmFtZXRlcikgeworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgdmlzaXRBbm5vdGF0aW9ucyhBbm5vdGF0ZWROb2RlIG5vZGUpIHsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9FbnVtVmlzaXRvci5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vRW51bVZpc2l0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDIzYjE1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vRW51bVZpc2l0b3IuamF2YQpAQCAtMCwwICsxLDIzNSBAQAorcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5DbGFzc0NvZGVWaXNpdG9yU3VwcG9ydDsNCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuQ2xhc3NIZWxwZXI7DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LkNsYXNzTm9kZTsNCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuQ29kZVZpc2l0b3JTdXBwb3J0Ow0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5Db25zdHJ1Y3Rvck5vZGU7DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LkZpZWxkTm9kZTsNCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuTWV0aG9kTm9kZTsNCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuUGFyYW1ldGVyOw0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByLkFyZ3VtZW50TGlzdEV4cHJlc3Npb247DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHIuQXJyYXlFeHByZXNzaW9uOw0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByLkJpbmFyeUV4cHJlc3Npb247DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHIuQ2xhc3NFeHByZXNzaW9uOw0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByLkNvbnN0YW50RXhwcmVzc2lvbjsNCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuZXhwci5Db25zdHJ1Y3RvckNhbGxFeHByZXNzaW9uOw0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByLkV4cHJlc3Npb247DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHIuRmllbGRFeHByZXNzaW9uOw0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByLkxpc3RFeHByZXNzaW9uOw0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByLk1ldGhvZENhbGxFeHByZXNzaW9uOw0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByLlNwcmVhZEV4cHJlc3Npb247DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHIuVmFyaWFibGVFeHByZXNzaW9uOw0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5zdG10LkJsb2NrU3RhdGVtZW50Ow0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5zdG10LkV4cHJlc3Npb25TdGF0ZW1lbnQ7DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuUmV0dXJuU3RhdGVtZW50Ow0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5zdG10LlN0YXRlbWVudDsNCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLkNvbXBpbGF0aW9uVW5pdDsNCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLlNvdXJjZVVuaXQ7DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LlRva2VuOw0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5UeXBlczsNCitpbXBvcnQgb3JnLm9iamVjdHdlYi5hc20uT3Bjb2RlczsNCisNCitwdWJsaWMgY2xhc3MgRW51bVZpc2l0b3IgZXh0ZW5kcyBDbGFzc0NvZGVWaXNpdG9yU3VwcG9ydHsNCisNCisgICAgLy8gc29tZSBjb25zdGFudHMgZm9yIG1vZGlmaWVycw0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRlMgPSBPcGNvZGVzLkFDQ19GSU5BTCB8IE9wY29kZXMuQUNDX1NUQVRJQzsNCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBTID0gT3Bjb2Rlcy5BQ0NfUFVCTElDIHwgT3Bjb2Rlcy5BQ0NfU1RBVElDOw0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFVCTElDX0ZTID0gT3Bjb2Rlcy5BQ0NfUFVCTElDIHwgRlM7DQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUklWQVRFX0ZTID0gT3Bjb2Rlcy5BQ0NfUFJJVkFURSB8IEZTOw0KKyAgICANCisgICAgcHJpdmF0ZSBmaW5hbCBDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0Ow0KKyAgICBwcml2YXRlIGZpbmFsIFNvdXJjZVVuaXQgc291cmNlVW5pdDsNCisgICAgDQorICAgIA0KKyAgICBwdWJsaWMgRW51bVZpc2l0b3IoQ29tcGlsYXRpb25Vbml0IGN1LCBTb3VyY2VVbml0IHN1KSB7DQorICAgICAgICBjb21waWxhdGlvblVuaXQgPSBjdTsNCisgICAgICAgIHNvdXJjZVVuaXQgPSBzdTsNCisgICAgfSAgICANCisgICAgDQorICAgIHB1YmxpYyB2b2lkIHZpc2l0Q2xhc3MoQ2xhc3NOb2RlIG5vZGUpIHsNCisgICAgICAgIGlmICghaXNFbnVtKG5vZGUpKSByZXR1cm47DQorICAgICAgICBjb21wbGV0ZUVudW0obm9kZSk7DQorICAgIH0NCisNCisgICAgcHJvdGVjdGVkIFNvdXJjZVVuaXQgZ2V0U291cmNlVW5pdCgpIHsNCisgICAgICAgIHJldHVybiBzb3VyY2VVbml0Ow0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNFbnVtKENsYXNzTm9kZSBub2RlKSB7DQorICAgICAgIHJldHVybiAobm9kZS5nZXRNb2RpZmllcnMoKSZPcGNvZGVzLkFDQ19FTlVNKSAhPSAwOw0KKyAgICB9DQorDQorICAgIHByaXZhdGUgdm9pZCBjb21wbGV0ZUVudW0oZmluYWwgQ2xhc3NOb2RlIGVudW1DbGFzcykgew0KKyAgICAgICAgQ2xhc3NOb2RlIGVudW1BcnJheSA9IGVudW1DbGFzcy5tYWtlQXJyYXkoKTsNCisNCisgICAgICAgIC8vIGNyZWF0ZSB2YWx1ZXMgZmllbGQNCisgICAgICAgIEZpZWxkTm9kZSB2YWx1ZXMgPSBuZXcgRmllbGROb2RlKCIkVkFMVUVTIixQUklWQVRFX0ZTLGVudW1BcnJheSxlbnVtQ2xhc3MsbnVsbCk7DQorICAgICAgICB2YWx1ZXMuc2V0U3ludGhldGljKHRydWUpOyAgICAgIA0KKyAgICAgICAgew0KKyAgICAgICAgICAgIC8vIGNyZWF0ZSB2YWx1ZXMoKSBtZXRob2QNCisgICAgICAgICAgICBNZXRob2ROb2RlIHZhbHVlc01ldGhvZCA9IG5ldyBNZXRob2ROb2RlKCJ2YWx1ZXMiLFBVQkxJQ19GUyxlbnVtQXJyYXksbmV3IFBhcmFtZXRlclswXSxDbGFzc05vZGUuRU1QVFlfQVJSQVksbnVsbCk7DQorICAgICAgICAgICAgdmFsdWVzTWV0aG9kLnNldFN5bnRoZXRpYyh0cnVlKTsNCisgICAgICAgICAgICBCbG9ja1N0YXRlbWVudCBjb2RlID0gbmV3IEJsb2NrU3RhdGVtZW50KCk7DQorICAgICAgICAgICAgY29kZS5hZGRTdGF0ZW1lbnQoDQorICAgICAgICAgICAgICAgICAgICBuZXcgUmV0dXJuU3RhdGVtZW50KA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTWV0aG9kQ2FsbEV4cHJlc3Npb24obmV3IEZpZWxkRXhwcmVzc2lvbih2YWx1ZXMpLCJjbG9uZSIsTWV0aG9kQ2FsbEV4cHJlc3Npb24uTk9fQVJHVU1FTlRTKQ0KKyAgICAgICAgICAgICAgICAgICAgKQ0KKyAgICAgICAgICAgICk7DQorICAgICAgICAgICAgdmFsdWVzTWV0aG9kLnNldENvZGUoY29kZSk7DQorICAgICAgICAgICAgZW51bUNsYXNzLmFkZE1ldGhvZCh2YWx1ZXNNZXRob2QpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICB7ICAgICAgICANCisgICAgICAgICAgICAvLyBjcmVhdGUgdmFsdWVPZg0KKyAgICAgICAgICAgIFBhcmFtZXRlciBzdHJpbmdQYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKENsYXNzSGVscGVyLlNUUklOR19UWVBFLCJuYW1lIik7DQorICAgICAgICAgICAgTWV0aG9kTm9kZSB2YWx1ZU9mTWV0aG9kID0gbmV3IE1ldGhvZE5vZGUoInZhbHVlT2YiLFBTLGVudW1DbGFzcyxuZXcgUGFyYW1ldGVyW117c3RyaW5nUGFyYW1ldGVyfSxDbGFzc05vZGUuRU1QVFlfQVJSQVksbnVsbCk7DQorICAgICAgICAgICAgQXJndW1lbnRMaXN0RXhwcmVzc2lvbiBjYWxsQXJndW1lbnRzID0gbmV3IEFyZ3VtZW50TGlzdEV4cHJlc3Npb24oKTsNCisgICAgICAgICAgICBjYWxsQXJndW1lbnRzLmFkZEV4cHJlc3Npb24obmV3IENsYXNzRXhwcmVzc2lvbihlbnVtQ2xhc3MpKTsNCisgICAgICAgICAgICBjYWxsQXJndW1lbnRzLmFkZEV4cHJlc3Npb24obmV3IFZhcmlhYmxlRXhwcmVzc2lvbigibmFtZSIpKTsNCisNCisgICAgICAgICAgICBCbG9ja1N0YXRlbWVudCBjb2RlID0gbmV3IEJsb2NrU3RhdGVtZW50KCk7DQorICAgICAgICAgICAgY29kZS5hZGRTdGF0ZW1lbnQoDQorICAgICAgICAgICAgICAgICAgICBuZXcgUmV0dXJuU3RhdGVtZW50KA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTWV0aG9kQ2FsbEV4cHJlc3Npb24obmV3IENsYXNzRXhwcmVzc2lvbihDbGFzc0hlbHBlci5FbnVtX1R5cGUpLCJ2YWx1ZU9mIixjYWxsQXJndW1lbnRzKQ0KKyAgICAgICAgICAgICAgICAgICAgKQ0KKyAgICAgICAgICAgICk7DQorICAgICAgICAgICAgdmFsdWVPZk1ldGhvZC5zZXRDb2RlKGNvZGUpOw0KKyAgICAgICAgICAgIHZhbHVlT2ZNZXRob2Quc2V0U3ludGhldGljKHRydWUpOw0KKyAgICAgICAgICAgIGVudW1DbGFzcy5hZGRNZXRob2QodmFsdWVPZk1ldGhvZCk7DQorICAgICAgICB9DQorICAgICAgICBhZGRDb25zdHJ1Y3RvcihlbnVtQ2xhc3MpOw0KKyAgICAgICAgew0KKyAgICAgICAgICAgIC8vIGNvbnN0cnVjdG9yIGhlbHBlcg0KKyAgICAgICAgICAgIC8vIFRoaXMgbWV0aG9kIGlzIHVzZWQgaW5zdGVhZCBvZiBjYWxsaW5nIHRoZSBjb25zdHJ1Y3RvciBhcw0KKyAgICAgICAgICAgIC8vIGNhbGxpbmcgdGhlIGNvbnN0cmN1dG9yIG1heSByZXF1aXJlIGEgdGFibGUgd2l0aCBNZXRhQ2xhc3MNCisgICAgICAgICAgICAvLyBzZWxlY3RpbmcgdGhlIGNvbnN0cnVjdG9yIGZvciBlYWNoIGVudW0gdmFsdWUuIFNvIGluc3RlYWQgd2UNCisgICAgICAgICAgICAvLyB1c2UgdGhpcyBtZXRob2QgdG8gaGF2ZSBhIGNlbnRyYWwgcG9pbnQgZm9yIGNvbnN0cnVjdG9yIHNlbGVjdGlvbg0KKyAgICAgICAgICAgIC8vIGFuZCBvbmx5IG9uZSB0YWJsZS4gVGhlIHdob2xlIGNvbnN0cnVjdGlvbiBpcyBuZWVkZWQgYmVjYXVzZSANCisgICAgICAgICAgICAvLyBSZWZsZWN0aW9uIGZvcmJpZHMgYWNjZXNzIHRvIHRoZSBlbnVtIGNvbnN0cnVjdG9yLg0KKyAgICAgICAgICAgIC8vIGNvZGU6DQorICAgICAgICAgICAgLy8gZGVmICRJTklUKE9iamVjdFtdIHBhcmEpIHsNCisgICAgICAgICAgICAvLyAgcmV0dXJuIHRoaXMoKnBhcmEpDQorICAgICAgICAgICAgLy8gfSAgICAgICAgICAgIA0KKyAgICAgICAgICAgIFBhcmFtZXRlcltdIHBhcmFtZXRlciA9IG5ldyBQYXJhbWV0ZXJbXXtuZXcgUGFyYW1ldGVyKENsYXNzSGVscGVyLk9CSkVDVF9UWVBFLm1ha2VBcnJheSgpLCAicGFyYSIpfTsNCisgICAgICAgICAgICBNZXRob2ROb2RlIGluaXRNZXRob2QgPSBuZXcgTWV0aG9kTm9kZSgiJElOSVQiLFBSSVZBVEVfRlMsZW51bUNsYXNzLHBhcmFtZXRlcixDbGFzc05vZGUuRU1QVFlfQVJSQVksbnVsbCk7DQorICAgICAgICAgICAgaW5pdE1ldGhvZC5zZXRTeW50aGV0aWModHJ1ZSk7DQorICAgICAgICAgICAgQ29uc3RydWN0b3JDYWxsRXhwcmVzc2lvbiBjY2UgPSBuZXcgQ29uc3RydWN0b3JDYWxsRXhwcmVzc2lvbigNCisgICAgICAgICAgICAgICAgICAgIENsYXNzTm9kZS5USElTLA0KKyAgICAgICAgICAgICAgICAgICAgbmV3IEFyZ3VtZW50TGlzdEV4cHJlc3Npb24oDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTcHJlYWRFeHByZXNzaW9uKG5ldyBWYXJpYWJsZUV4cHJlc3Npb24oInBhcmEiKSkNCisgICAgICAgICAgICAgICAgICAgICkNCisgICAgICAgICAgICApOw0KKyAgICAgICAgICAgIEJsb2NrU3RhdGVtZW50IGNvZGUgPSBuZXcgQmxvY2tTdGF0ZW1lbnQoKTsNCisgICAgICAgICAgICBjb2RlLmFkZFN0YXRlbWVudChuZXcgUmV0dXJuU3RhdGVtZW50KGNjZSkpOw0KKyAgICAgICAgICAgIGluaXRNZXRob2Quc2V0Q29kZShjb2RlKTsNCisgICAgICAgICAgICBlbnVtQ2xhc3MuYWRkTWV0aG9kKGluaXRNZXRob2QpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICB7DQorICAgICAgICAgICAgLy8gc3RhdGljIGluaXQNCisgICAgICAgICAgICBMaXN0IGZpZWxkcyA9IGVudW1DbGFzcy5nZXRGaWVsZHMoKTsNCisgICAgICAgICAgICBMaXN0IGFycmF5SW5pdCA9IG5ldyBBcnJheUxpc3QoKTsNCisgICAgICAgICAgICBpbnQgdmFsdWUgPSAtMTsNCisgICAgICAgICAgICBUb2tlbiBhc3NpZ24gPSBUb2tlbi5uZXdTeW1ib2woVHlwZXMuQVNTSUdOLCAtMSwgLTEpOw0KKyAgICAgICAgICAgIExpc3QgYmxvY2sgPSBuZXcgQXJyYXlMaXN0KCk7DQorICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGZpZWxkcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorICAgICAgICAgICAgICAgIEZpZWxkTm9kZSBmaWVsZCA9IChGaWVsZE5vZGUpIGl0ZXJhdG9yLm5leHQoKTsNCisgICAgICAgICAgICAgICAgaWYgKChmaWVsZC5nZXRNb2RpZmllcnMoKSZPcGNvZGVzLkFDQ19FTlVNKSA9PSAwKSBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgdmFsdWUrKzsNCisgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgIEFyZ3VtZW50TGlzdEV4cHJlc3Npb24gYXJncyA9IG5ldyBBcmd1bWVudExpc3RFeHByZXNzaW9uKCk7DQorICAgICAgICAgICAgICAgIGFyZ3MuYWRkRXhwcmVzc2lvbihuZXcgQ29uc3RhbnRFeHByZXNzaW9uKGZpZWxkLmdldE5hbWUoKSkpOw0KKyAgICAgICAgICAgICAgICBhcmdzLmFkZEV4cHJlc3Npb24obmV3IENvbnN0YW50RXhwcmVzc2lvbihuZXcgSW50ZWdlcih2YWx1ZSkpKTsNCisgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmdldEluaXRpYWxFeHByZXNzaW9uKCkhPW51bGwpIHsNCisgICAgICAgICAgICAgICAgICAgIExpc3RFeHByZXNzaW9uIG9sZEFyZ3MgPSAoTGlzdEV4cHJlc3Npb24pIGZpZWxkLmdldEluaXRpYWxFeHByZXNzaW9uKCk7DQorICAgICAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIG9sZEFyZ3NJdGVyYXRvciA9IG9sZEFyZ3MuZ2V0RXhwcmVzc2lvbnMoKS5pdGVyYXRvcigpOyBvbGRBcmdzSXRlcmF0b3IuaGFzTmV4dCgpOykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIEV4cHJlc3Npb24gZXhwID0gKEV4cHJlc3Npb24pIG9sZEFyZ3NJdGVyYXRvci5uZXh0KCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5hZGRFeHByZXNzaW9uKGV4cCk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZmllbGQuc2V0SW5pdGlhbFZhbHVlRXhwcmVzc2lvbihudWxsKTsNCisgICAgICAgICAgICAgICAgYmxvY2suYWRkKA0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFeHByZXNzaW9uU3RhdGVtZW50KA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJpbmFyeUV4cHJlc3Npb24oDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWVsZEV4cHJlc3Npb24oZmllbGQpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBNZXRob2RDYWxsRXhwcmVzc2lvbihuZXcgQ2xhc3NFeHByZXNzaW9uKGVudW1DbGFzcyksIiRJTklUIixhcmdzKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICkNCisgICAgICAgICAgICAgICAgKTsNCisgICAgICAgICAgICAgICAgYXJyYXlJbml0LmFkZChuZXcgRmllbGRFeHByZXNzaW9uKGZpZWxkKSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIA0KKyAgICAgICAgICAgIGJsb2NrLmFkZCgNCisgICAgICAgICAgICAgICAgICAgIG5ldyBFeHByZXNzaW9uU3RhdGVtZW50KA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQmluYXJ5RXhwcmVzc2lvbihuZXcgRmllbGRFeHByZXNzaW9uKHZhbHVlcyksYXNzaWduLG5ldyBBcnJheUV4cHJlc3Npb24oZW51bUNsYXNzLGFycmF5SW5pdCkpDQorICAgICAgICAgICAgICAgICAgICApDQorICAgICAgICAgICAgKTsNCisgICAgICAgICAgICBlbnVtQ2xhc3MuYWRkU3RhdGljSW5pdGlhbGl6ZXJTdGF0ZW1lbnRzKGJsb2NrLCB0cnVlKTsNCisgICAgICAgICAgICBlbnVtQ2xhc3MuYWRkRmllbGQodmFsdWVzKTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgDQorICAgIH0NCisNCisgICAgcHJpdmF0ZSB2b2lkIGFkZENvbnN0cnVjdG9yKENsYXNzTm9kZSBlbnVtQ2xhc3MpIHsNCisgICAgICAgIC8vIGZpcnN0IGxvb2sgaWYgdGhlcmUgYXJlIGRlY2xhcmVkIGNvbnN0cnVjdG9ycw0KKyAgICAgICAgTGlzdCBjdG9ycyA9IG5ldyBBcnJheUxpc3QoZW51bUNsYXNzLmdldERlY2xhcmVkQ29uc3RydWN0b3JzKCkpOw0KKyAgICAgICAgaWYgKGN0b3JzLnNpemUoKT09MCkgew0KKyAgICAgICAgICAgIC8vIGFkZCBkZWZhdWx0IGNvbnN0cnVjdG9yDQorICAgICAgICAgICAgQ29uc3RydWN0b3JOb2RlIGluaXQgPSBuZXcgQ29uc3RydWN0b3JOb2RlKE9wY29kZXMuQUNDX1BSSVZBVEUsbmV3IFBhcmFtZXRlclswXSxDbGFzc05vZGUuRU1QVFlfQVJSQVksbmV3IEJsb2NrU3RhdGVtZW50KCkpOw0KKyAgICAgICAgICAgIGVudW1DbGFzcy5hZGRDb25zdHJ1Y3Rvcihpbml0KTsNCisgICAgICAgICAgICBjdG9ycy5hZGQoaW5pdCk7DQorICAgICAgICB9IA0KKyAgICAgICAgDQorICAgICAgICAvLyBmb3IgZWFjaCBjb25zdHJ1Y3RvcjoNCisgICAgICAgIC8vIGlmIGNvbnN0cnVjdG9yZG9lcyBub3QgZGVmaW5lIGEgY2FsbCB0byBzdXBlciwgdGhlbiB0cmFuc2Zvcm0gY29uc3RydWN0b3INCisgICAgICAgIC8vIHRvIGdldCBTdHJpbmcsaW50IHBhcmFtZXRlcnMgYXQgYmVnaW5uaW5nIGFuZCBhZGQgY2FsbCBzdXBlcihTdHJpbmcsaW50KSAgDQorICAgICAgICANCisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjdG9ycy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorICAgICAgICAgICAgQ29uc3RydWN0b3JOb2RlIGN0b3IgPSAoQ29uc3RydWN0b3JOb2RlKSBpdGVyYXRvci5uZXh0KCk7DQorICAgICAgICAgICAgaWYgKGN0b3IuZmlyc3RTdGF0ZW1lbnRJc1NwZWNpYWxDb25zdHJ1Y3RvckNhbGwoKSkgY29udGludWU7DQorICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBhZGQgcGFyYW1ldGVycw0KKyAgICAgICAgICAgIFBhcmFtZXRlcltdIG9sZFAgPSBjdG9yLmdldFBhcmFtZXRlcnMoKTsNCisgICAgICAgICAgICBQYXJhbWV0ZXJbXSBuZXdQID0gbmV3IFBhcmFtZXRlcltvbGRQLmxlbmd0aCsyXTsNCisgICAgICAgICAgICBTdHJpbmcgc3RyaW5nUGFyYW1ldGVyTmFtZSA9IGdldFVuaXF1ZVZhcmlhYmxlTmFtZSgiX19zdHIiLGN0b3IuZ2V0Q29kZSgpKTsNCisgICAgICAgICAgICBuZXdQWzBdID0gbmV3IFBhcmFtZXRlcihDbGFzc0hlbHBlci5TVFJJTkdfVFlQRSxzdHJpbmdQYXJhbWV0ZXJOYW1lKTsNCisgICAgICAgICAgICBTdHJpbmcgaW50UGFyYW1ldGVyTmFtZSA9IGdldFVuaXF1ZVZhcmlhYmxlTmFtZSgiX19pbnQiLGN0b3IuZ2V0Q29kZSgpKTsNCisgICAgICAgICAgICBuZXdQWzFdID0gbmV3IFBhcmFtZXRlcihDbGFzc0hlbHBlci5pbnRfVFlQRSxpbnRQYXJhbWV0ZXJOYW1lKTsNCisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG9sZFAsIDAsIG5ld1AsIDIsIG9sZFAubGVuZ3RoKTsNCisgICAgICAgICAgICBjdG9yLnNldFBhcmFtZXRlcnMobmV3UCk7DQorICAgICAgICAgICAgLy8gYW5kIGEgc3VwZXIgY2FsbA0KKyAgICAgICAgICAgIENvbnN0cnVjdG9yQ2FsbEV4cHJlc3Npb24gY2NlID0gbmV3IENvbnN0cnVjdG9yQ2FsbEV4cHJlc3Npb24oDQorICAgICAgICAgICAgICAgICAgICBDbGFzc05vZGUuU1VQRVIsDQorICAgICAgICAgICAgICAgICAgICBuZXcgQXJndW1lbnRMaXN0RXhwcmVzc2lvbigNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVmFyaWFibGVFeHByZXNzaW9uKHN0cmluZ1BhcmFtZXRlck5hbWUpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBWYXJpYWJsZUV4cHJlc3Npb24oaW50UGFyYW1ldGVyTmFtZSkNCisgICAgICAgICAgICAgICAgICAgICkNCisgICAgICAgICAgICApOw0KKyAgICAgICAgICAgIEJsb2NrU3RhdGVtZW50IGNvZGUgPSBuZXcgQmxvY2tTdGF0ZW1lbnQoKTsNCisgICAgICAgICAgICBjb2RlLmFkZFN0YXRlbWVudChuZXcgRXhwcmVzc2lvblN0YXRlbWVudChjY2UpKTsNCisgICAgICAgICAgICBTdGF0ZW1lbnQgb2xkQ29kZSA9IGN0b3IuZ2V0Q29kZSgpOw0KKyAgICAgICAgICAgIGlmIChvbGRDb2RlIT1udWxsKSBjb2RlLmFkZFN0YXRlbWVudChvbGRDb2RlKTsNCisgICAgICAgICAgICBjdG9yLnNldENvZGUoY29kZSk7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VW5pcXVlVmFyaWFibGVOYW1lKGZpbmFsIFN0cmluZyBuYW1lLCBTdGF0ZW1lbnQgY29kZSkgew0KKyAgICAgICAgaWYgKGNvZGU9PW51bGwpIHJldHVybiBuYW1lOw0KKyAgICAgICAgZmluYWwgT2JqZWN0W10gZm91bmQ9bmV3IE9iamVjdFsxXTsNCisgICAgICAgIENvZGVWaXNpdG9yU3VwcG9ydCBjdiA9IG5ldyBDb2RlVmlzaXRvclN1cHBvcnQoKSB7DQorICAgICAgICAgICAgcHVibGljIHZvaWQgdmlzaXRWYXJpYWJsZUV4cHJlc3Npb24oVmFyaWFibGVFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsNCisgICAgICAgICAgICAgICAgaWYgKGV4cHJlc3Npb24uZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgZm91bmRbMF09Qm9vbGVhbi5UUlVFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH07DQorICAgICAgICBjb2RlLnZpc2l0KGN2KTsNCisgICAgICAgIGlmIChmb3VuZFswXSE9bnVsbCkgcmV0dXJuIGdldFVuaXF1ZVZhcmlhYmxlTmFtZSgiXyIrbmFtZSwgY29kZSk7DQorICAgICAgICByZXR1cm4gbmFtZTsNCisgICAgfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9FeHRlbmRlZFZlcmlmaWVyLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9FeHRlbmRlZFZlcmlmaWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBhNDY1NQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL0V4dGVuZGVkVmVyaWZpZXIuamF2YQpAQCAtMCwwICsxLDEzMCBAQAorLyoNCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4NCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW47DQorDQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQorDQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0Lio7DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5Db21waWxlckNvbmZpZ3VyYXRpb247DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5FcnJvckNvbGxlY3RvcjsNCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLlNvdXJjZVVuaXQ7DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5tZXNzYWdlcy5TeW50YXhFcnJvck1lc3NhZ2U7DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LlN5bnRheEV4Y2VwdGlvbjsNCisNCisNCisvKioNCisgKiBBIHNwZWNpYWxpemVkIEdyb292eSBBU1QgdmlzaXRvciBtZWFudCB0byBwZXJmb3JtIGFkZGl0aW9uYWwgdmVyaWZpY2F0aW9ucyB1cG9uIHRoZQ0KKyAqIGN1cnJlbnQgQVNULiBDdXJyZW50bHkgaXQgZG9lcyBjaGVja3Mgb24gYW5ub3RhdGVkIG5vZGVzIGFuZCBhbm5vdGF0aW9ucyBpdHNlbGYuDQorICogDQorICogQ3VycmVudCBsaW1pdGF0aW9uczoNCisgKiAtIGFubm90YXRpb25zIG9uIGxvY2FsIHZhcmlhYmxlcyBhcmUgbm90IHN1cHBvcnRlZA0KKyAqIA0KKyAqIEBhdXRob3IgPGEgaHJlZj0nbWFpbHRvOnRoZVtkb3RdbWluZHN0b3JtW2F0XWdtYWlsW2RvdF1jb20nPkFsZXggUG9wZXNjdTwvYT4NCisgKi8NCitwdWJsaWMgY2xhc3MgRXh0ZW5kZWRWZXJpZmllciBpbXBsZW1lbnRzIEdyb292eUNsYXNzVmlzaXRvciB7DQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpWTV9FUlJPUl9NRVNTQUdFID0gIlBsZWFzZSBtYWtlIHN1cmUgeW91IGFyZSBydW5uaW5nIG9uIGEgSlZNID49IDEuNSI7DQorDQorICAgIHByaXZhdGUgU291cmNlVW5pdCBzb3VyY2U7DQorICAgIHByaXZhdGUgQ2xhc3NOb2RlIGN1cnJlbnRDbGFzczsNCisgICAgDQorICAgIHB1YmxpYyBFeHRlbmRlZFZlcmlmaWVyKFNvdXJjZVVuaXQgc291cmNlVW5pdCkgew0KKyAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2VVbml0Ow0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHZpc2l0Q2xhc3MoQ2xhc3NOb2RlIG5vZGUpIHsNCisgICAgICAgIHRoaXMuY3VycmVudENsYXNzID0gbm9kZTsNCisgICAgICAgIHZpc2l0QW5ub3RhdGlvbnMobm9kZSwgQW5ub3RhdGlvbk5vZGUuVFlQRV9UQVJHRVQpOw0KKyAgICAgICAgbm9kZS52aXNpdENvbnRlbnRzKHRoaXMpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHZpc2l0Q29uc3RydWN0b3IoQ29uc3RydWN0b3JOb2RlIG5vZGUpIHsNCisgICAgICAgIHZpc2l0QW5ub3RhdGlvbnMobm9kZSwgQW5ub3RhdGlvbk5vZGUuQ09OU1RSVUNUT1JfVEFSR0VUKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCB2aXNpdEZpZWxkKEZpZWxkTm9kZSBub2RlKSB7DQorICAgICAgICB2aXNpdEFubm90YXRpb25zKG5vZGUsIEFubm90YXRpb25Ob2RlLkZJRUxEX1RBUkdFVCk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgdmlzaXRNZXRob2QoTWV0aG9kTm9kZSBub2RlKSB7DQorICAgICAgICB2aXNpdEFubm90YXRpb25zKG5vZGUsIEFubm90YXRpb25Ob2RlLk1FVEhPRF9UQVJHRVQpOw0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlLmdldFBhcmFtZXRlcnMoKS5sZW5ndGg7IGkrKykgew0KKyAgICAgICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBub2RlLmdldFBhcmFtZXRlcnMoKVtpXTsNCisgICAgICAgICAgICB2aXNpdEFubm90YXRpb25zKHBhcmFtZXRlciwgQW5ub3RhdGlvbk5vZGUuUEFSQU1FVEVSX1RBUkdFVCk7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgdmlzaXRQcm9wZXJ0eShQcm9wZXJ0eU5vZGUgbm9kZSkgew0KKyAgICB9DQorDQorICAgIHByb3RlY3RlZCB2b2lkIHZpc2l0QW5ub3RhdGlvbnMoQW5ub3RhdGVkTm9kZSBub2RlLCBpbnQgdGFyZ2V0KSB7DQorICAgICAgICBpZihub2RlLmdldEFubm90YXRpb25zKCkuaXNFbXB0eSgpKSB7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICB0aGlzLmN1cnJlbnRDbGFzcy5zZXRBbm5vdGF0ZWQodHJ1ZSk7DQorICAgICAgICANCisgICAgICAgIGlmKCFpc0Fubm90YXRpb25Db21wYXRpYmxlKCkpIHsNCisgICAgICAgICAgICBhZGRFcnJvcigiQW5ub3RhdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGN1cnJlbnQgcnVudGltZS4iICsgSlZNX0VSUk9SX01FU1NBR0UsDQorICAgICAgICAgICAgICAgICAgICBub2RlKTsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIENvbGxlY3Rpb24gYW5ub3RhdGlvbnMgPSBub2RlLmdldEFubm90YXRpb25zKCkudmFsdWVzKCk7DQorICAgICAgICBmb3IoSXRlcmF0b3IgaXQgPSBhbm5vdGF0aW9ucy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgew0KKyAgICAgICAgICAgIEFubm90YXRpb25Ob2RlIGFuID0gKEFubm90YXRpb25Ob2RlKSBpdC5uZXh0KCk7DQorDQorICAgICAgICAgICAgQW5ub3RhdGlvbk5vZGUgYW5ub3RhdGlvbiA9IHZpc2l0QW5ub3RhdGlvbihhbik7DQorICAgICAgICAgICAgaWYoIWFubm90YXRpb24uaXNWYWxpZCgpKSB7DQorICAgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYoIWFubm90YXRpb24uaXNUYXJnZXRBbGxvd2VkKHRhcmdldCkpIHsNCisgICAgICAgICAgICAgICAgYWRkRXJyb3IoIkFubm90YXRpb24gQCIgKyBhbm5vdGF0aW9uLmdldENsYXNzTm9kZSgpLmdldE5hbWUoKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpcyBub3QgYWxsb3dlZCBvbiBlbGVtZW50ICIgKyBBbm5vdGF0aW9uTm9kZS50YXJnZXRUb05hbWUodGFyZ2V0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIC8qKg0KKyAgICAgKiBSZXNvbHZlIG1ldGFkYXRhIGFuZCBkZXRhaWxzIG9mIHRoZSBhbm5vdGF0aW9uLg0KKyAgICAgKi8NCisgICAgcHJpdmF0ZSBBbm5vdGF0aW9uTm9kZSB2aXNpdEFubm90YXRpb24oQW5ub3RhdGlvbk5vZGUgbm9kZSkgew0KKyAgICAgICAgRXJyb3JDb2xsZWN0b3IgZXJyb3JDb2xsZWN0b3IgPSBuZXcgRXJyb3JDb2xsZWN0b3IodGhpcy5zb3VyY2UuZ2V0Q29uZmlndXJhdGlvbigpKTsNCisgICAgICAgIEFubm90YXRpb25WaXNpdG9yIHZpc2l0b3IgPSBuZXcgQW5ub3RhdGlvblZpc2l0b3IodGhpcy5zb3VyY2UsIGVycm9yQ29sbGVjdG9yKTsNCisgICAgICAgIEFubm90YXRpb25Ob2RlIHNvbHZlZEFubm90YXRpb24gPSB2aXNpdG9yLnZpc2l0KG5vZGUpOw0KKyAgICAgICAgdGhpcy5zb3VyY2UuZ2V0RXJyb3JDb2xsZWN0b3IoKS5hZGRDb2xsZWN0b3JDb250ZW50cyhlcnJvckNvbGxlY3Rvcik7DQorICAgICAgICByZXR1cm4gc29sdmVkQW5ub3RhdGlvbjsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQ2hlY2sgaWYgdGhlIGN1cnJlbnQgcnVudGltZSBhbGxvd3MgQW5ub3RhdGlvbiB1c2FnZS4NCisgICAgICovDQorICAgIHByb3RlY3RlZCBib29sZWFuIGlzQW5ub3RhdGlvbkNvbXBhdGlibGUoKSB7DQorICAgICAgICByZXR1cm4gQ29tcGlsZXJDb25maWd1cmF0aW9uLlBPU1RfSkRLNS5lcXVhbHModGhpcy5zb3VyY2UuZ2V0Q29uZmlndXJhdGlvbigpLmdldFRhcmdldEJ5dGVjb2RlKCkpOyANCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIHZvaWQgYWRkRXJyb3IoU3RyaW5nIG1zZywgQVNUTm9kZSBleHByKSB7DQorICAgICAgICB0aGlzLnNvdXJjZS5nZXRFcnJvckNvbGxlY3RvcigpLmFkZEVycm9yQW5kQ29udGludWUoDQorICAgICAgICAgICAgbmV3IFN5bnRheEVycm9yTWVzc2FnZSgNCisgICAgICAgICAgICAgICAgICAgIG5ldyBTeW50YXhFeGNlcHRpb24obXNnICsgJ1xuJywgZXhwci5nZXRMaW5lTnVtYmVyKCksIGV4cHIuZ2V0Q29sdW1uTnVtYmVyKCkpLCB0aGlzLnNvdXJjZSkNCisgICAgICAgICk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgdmlzaXRHZW5lcmljVHlwZShHZW5lcmljc1R5cGUgZ2VuZXJpY3NUeXBlKSB7DQorDQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vR2VuZXJhdG9yQ29udGV4dC5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vR2VuZXJhdG9yQ29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1OWFiZDUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9HZW5lcmF0b3JDb250ZXh0LmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW47CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5DbGFzc0hlbHBlcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5DbGFzc05vZGU7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuQ29tcGlsZVVuaXQ7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuTWV0aG9kTm9kZTsKKworCisvKioKKyAqIEEgY29udGV4dCBzaGFyZWQgYWNyb3NzIGdlbmVyYXRpb25zIG9mIGEgY2xhc3MgYW5kIGl0cyBpbm5lciBjbGFzc2VzCisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBHZW5lcmF0b3JDb250ZXh0IHsKKworICAgIHByaXZhdGUgaW50IGlubmVyQ2xhc3NJZHggPSAxOworICAgIHByaXZhdGUgQ29tcGlsZVVuaXQgY29tcGlsZVVuaXQ7CisgICAgCisgICAgcHVibGljIEdlbmVyYXRvckNvbnRleHQoQ29tcGlsZVVuaXQgY29tcGlsZVVuaXQpIHsKKyAgICAgICAgdGhpcy5jb21waWxlVW5pdCA9IGNvbXBpbGVVbml0OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0TmV4dElubmVyQ2xhc3NJZHgoKSB7CisgICAgICAgIHJldHVybiBpbm5lckNsYXNzSWR4Kys7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBDb21waWxlVW5pdCBnZXRDb21waWxlVW5pdCgpIHsKKyAgICAgICAgcmV0dXJuIGNvbXBpbGVVbml0OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmV4dENsb3N1cmVJbm5lck5hbWUoQ2xhc3NOb2RlIG93bmVyLCBDbGFzc05vZGUgZW5jbG9zaW5nQ2xhc3MsIE1ldGhvZE5vZGUgZW5jbG9zaW5nTWV0aG9kKSB7CisgICAgICAgIFN0cmluZyBvd25lclNob3J0TmFtZSA9IG93bmVyLmdldE5hbWVXaXRob3V0UGFja2FnZSgpOworICAgICAgICBTdHJpbmcgY2xhc3NTaG9ydE5hbWUgPSBlbmNsb3NpbmdDbGFzcy5nZXROYW1lV2l0aG91dFBhY2thZ2UoKTsKKyAgICAgICAgaWYgKGNsYXNzU2hvcnROYW1lLmVxdWFscyhvd25lclNob3J0TmFtZSkpIHsKKyAgICAgICAgICAgIGNsYXNzU2hvcnROYW1lID0gIiI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjbGFzc1Nob3J0TmFtZSArPSAiXyI7CisgICAgICAgIH0KKyAgICAgICAgLy8gcmVtb3ZlICQKKyAgICAgICAgaW50IGRwID0gY2xhc3NTaG9ydE5hbWUubGFzdEluZGV4T2YoIiQiKTsKKyAgICAgICAgaWYgKGRwID49IDApIHsKKyAgICAgICAgICAgIGNsYXNzU2hvcnROYW1lID0gY2xhc3NTaG9ydE5hbWUuc3Vic3RyaW5nKCsrZHApOworICAgICAgICB9CisgICAgICAgIC8vIHJlbW92ZSBsZWFkaW5nIF8KKyAgICAgICAgaWYgKGNsYXNzU2hvcnROYW1lLnN0YXJ0c1dpdGgoIl8iKSkgeworICAgICAgICAgICAgY2xhc3NTaG9ydE5hbWUgPSBjbGFzc1Nob3J0TmFtZS5zdWJzdHJpbmcoMSk7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSAiIjsKKyAgICAgICAgaWYgKGVuY2xvc2luZ01ldGhvZCAhPSBudWxsKSB7CisgICAgICAgICAgICBtZXRob2ROYW1lID0gZW5jbG9zaW5nTWV0aG9kLmdldE5hbWUoKSArICJfIjsKKworICAgICAgICAgICAgaWYgKGVuY2xvc2luZ0NsYXNzLmlzRGVyaXZlZEZyb20oQ2xhc3NIZWxwZXIuQ0xPU1VSRV9UWVBFKSkgeworICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1ldGhvZE5hbWUgPSBtZXRob2ROYW1lLnJlcGxhY2UoJzwnLCAnXycpOworICAgICAgICAgICAgbWV0aG9kTmFtZSA9IG1ldGhvZE5hbWUucmVwbGFjZSgnPicsICdfJyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICJfIiArIGNsYXNzU2hvcnROYW1lICsgbWV0aG9kTmFtZSArICJjbG9zdXJlIiArIGdldE5leHRJbm5lckNsYXNzSWR4KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vTWV0aG9kQ2FsbGVyLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9NZXRob2RDYWxsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDZkNTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vTWV0aG9kQ2FsbGVyLmphdmEKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW47CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisKK2ltcG9ydCBvcmcub2JqZWN0d2ViLmFzbS5NZXRob2RWaXNpdG9yOworaW1wb3J0IG9yZy5vYmplY3R3ZWIuYXNtLk9wY29kZXM7CitpbXBvcnQgb3JnLm9iamVjdHdlYi5hc20uVHlwZTsKKworLyoqCisgKiBBIGhlbHBlciBjbGFzcyB0byBpbnZva2UgbWV0aG9kcyBtb3JlIGVhc2lseSBpbiBBU00KKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIE1ldGhvZENhbGxlciBpbXBsZW1lbnRzIE9wY29kZXMgeworCisgICAgcHJpdmF0ZSBpbnQgb3Bjb2RlOworICAgIHByaXZhdGUgU3RyaW5nIGludGVybmFsTmFtZTsKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworICAgIHByaXZhdGUgQ2xhc3MgdGhlQ2xhc3M7CisgICAgcHJpdmF0ZSBTdHJpbmcgbWV0aG9kRGVzY3JpcHRvcjsKKworICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kQ2FsbGVyIG5ld1N0YXRpYyhDbGFzcyB0aGVDbGFzcywgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNZXRob2RDYWxsZXIoSU5WT0tFU1RBVElDLCB0aGVDbGFzcywgbmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBNZXRob2RDYWxsZXIgbmV3SW50ZXJmYWNlKENsYXNzIHRoZUNsYXNzLCBTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gbmV3IE1ldGhvZENhbGxlcihJTlZPS0VJTlRFUkZBQ0UsIHRoZUNsYXNzLCBuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE1ldGhvZENhbGxlciBuZXdWaXJ0dWFsKENsYXNzIHRoZUNsYXNzLCBTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gbmV3IE1ldGhvZENhbGxlcihJTlZPS0VWSVJUVUFMLCB0aGVDbGFzcywgbmFtZSk7CisgICAgfQorCisgICAgcHVibGljIE1ldGhvZENhbGxlcihpbnQgb3Bjb2RlLCBDbGFzcyB0aGVDbGFzcywgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5vcGNvZGUgPSBvcGNvZGU7CisgICAgICAgIHRoaXMuaW50ZXJuYWxOYW1lID0gVHlwZS5nZXRJbnRlcm5hbE5hbWUodGhlQ2xhc3MpOworICAgICAgICB0aGlzLnRoZUNsYXNzID0gdGhlQ2xhc3M7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjYWxsKE1ldGhvZFZpc2l0b3IgbWV0aG9kVmlzaXRvcikgeworICAgICAgICBtZXRob2RWaXNpdG9yLnZpc2l0TWV0aG9kSW5zbihvcGNvZGUsIGludGVybmFsTmFtZSwgbmFtZSwgZ2V0TWV0aG9kRGVzY3JpcHRvcigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1ldGhvZERlc2NyaXB0b3IoKSB7CisgICAgICAgIGlmIChtZXRob2REZXNjcmlwdG9yID09IG51bGwpIHsKKyAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSBnZXRNZXRob2QoKTsKKyAgICAgICAgICAgIG1ldGhvZERlc2NyaXB0b3IgPSBUeXBlLmdldE1ldGhvZERlc2NyaXB0b3IobWV0aG9kKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbWV0aG9kRGVzY3JpcHRvcjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgTWV0aG9kIGdldE1ldGhvZCgpIHsKKyAgICAgICAgTWV0aG9kW10gbWV0aG9kcyA9IHRoZUNsYXNzLmdldE1ldGhvZHMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBNZXRob2QgbWV0aG9kID0gbWV0aG9kc1tpXTsKKyAgICAgICAgICAgIGlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBtZXRob2Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IENsYXNzR2VuZXJhdG9yRXhjZXB0aW9uKCJDb3VsZCBub3QgZmluZCBtZXRob2Q6ICIgKyBuYW1lICsgIiBvbiBjbGFzczogIiArIHRoZUNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9NZXRob2RDYWxsZXJNdWx0aUFkYXB0ZXIuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL01ldGhvZENhbGxlck11bHRpQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMzgzYTUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9NZXRob2RDYWxsZXJNdWx0aUFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDgwIEBACisvKg0KKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLg0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbjsNCisNCitpbXBvcnQgb3JnLm9iamVjdHdlYi5hc20uTWV0aG9kVmlzaXRvcjsNCisNCitwdWJsaWMgY2xhc3MgTWV0aG9kQ2FsbGVyTXVsdGlBZGFwdGVyIHsNCisgICAgcHJpdmF0ZSBNZXRob2RDYWxsZXJbXSBtZXRob2RzOw0KKyAgICBib29sZWFuIHNraXBTcHJlYWRTYWZlQW5kU2FmZTsNCisNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0FSR1MgPSAwOw0KKw0KKyAgICBwdWJsaWMgc3RhdGljIE1ldGhvZENhbGxlck11bHRpQWRhcHRlciBuZXdTdGF0aWMoQ2xhc3MgdGhlQ2xhc3MsIFN0cmluZyBiYXNlTmFtZSwgYm9vbGVhbiBjcmVhdGVOQXJncywgYm9vbGVhbiBza2lwU3ByZWFkU2FmZUFuZFNhZmUpIHsNCisgICAgICAgIE1ldGhvZENhbGxlck11bHRpQWRhcHRlciBtY21hID0gbmV3IE1ldGhvZENhbGxlck11bHRpQWRhcHRlcigpOw0KKyAgICAgICAgbWNtYS5za2lwU3ByZWFkU2FmZUFuZFNhZmUgPSBza2lwU3ByZWFkU2FmZUFuZFNhZmU7DQorICAgICAgICBpZiAoY3JlYXRlTkFyZ3MpIHsNCisgICAgICAgICAgICBpbnQgbnVtYmVyT2ZCYXNlTWV0aG9kcyA9IG1jbWEubnVtYmVyT2ZCYXNlTWV0aG9kcygpOw0KKyAgICAgICAgICAgIG1jbWEubWV0aG9kcyA9IG5ldyBNZXRob2RDYWxsZXJbKE1BWF9BUkdTICsgMikgKiBudW1iZXJPZkJhc2VNZXRob2RzXTsNCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSBNQVhfQVJHUzsgaSsrKSB7DQorICAgICAgICAgICAgICAgIG1jbWEubWV0aG9kc1tpICogbnVtYmVyT2ZCYXNlTWV0aG9kc10gPSBNZXRob2RDYWxsZXIubmV3U3RhdGljKHRoZUNsYXNzLCBiYXNlTmFtZSArIGkpOw0KKyAgICAgICAgICAgICAgICBpZiAoc2tpcFNwcmVhZFNhZmVBbmRTYWZlKSBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgbWNtYS5tZXRob2RzW2kgKiBudW1iZXJPZkJhc2VNZXRob2RzICsgMV0gPSBNZXRob2RDYWxsZXIubmV3U3RhdGljKHRoZUNsYXNzLCBiYXNlTmFtZSArIGkgKyAiU2FmZSIpOw0KKyAgICAgICAgICAgICAgICBtY21hLm1ldGhvZHNbaSAqIG51bWJlck9mQmFzZU1ldGhvZHMgKyAyXSA9IE1ldGhvZENhbGxlci5uZXdTdGF0aWModGhlQ2xhc3MsIGJhc2VOYW1lICsgaSArICJTcHJlYWRTYWZlIik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIG1jbWEubWV0aG9kc1soTUFYX0FSR1MgKyAxKSAqIG51bWJlck9mQmFzZU1ldGhvZHNdID0gTWV0aG9kQ2FsbGVyLm5ld1N0YXRpYyh0aGVDbGFzcywgYmFzZU5hbWUgKyAiTiIpOw0KKyAgICAgICAgICAgIGlmICghc2tpcFNwcmVhZFNhZmVBbmRTYWZlKSB7DQorICAgICAgICAgICAgICAgIG1jbWEubWV0aG9kc1soTUFYX0FSR1MgKyAxKSAqIG51bWJlck9mQmFzZU1ldGhvZHMgKyAxXSA9IE1ldGhvZENhbGxlci5uZXdTdGF0aWModGhlQ2xhc3MsIGJhc2VOYW1lICsgIk4iICsgIlNhZmUiKTsNCisgICAgICAgICAgICAgICAgbWNtYS5tZXRob2RzWyhNQVhfQVJHUyArIDEpICogbnVtYmVyT2ZCYXNlTWV0aG9kcyArIDJdID0gTWV0aG9kQ2FsbGVyLm5ld1N0YXRpYyh0aGVDbGFzcywgYmFzZU5hbWUgKyAiTiIgKyAiU3ByZWFkU2FmZSIpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgIH0gZWxzZSBpZiAoIXNraXBTcHJlYWRTYWZlQW5kU2FmZSkgew0KKyAgICAgICAgICAgIG1jbWEubWV0aG9kcyA9IG5ldyBNZXRob2RDYWxsZXJbXXsNCisgICAgICAgICAgICAgICAgICAgIE1ldGhvZENhbGxlci5uZXdTdGF0aWModGhlQ2xhc3MsIGJhc2VOYW1lKSwNCisgICAgICAgICAgICAgICAgICAgIE1ldGhvZENhbGxlci5uZXdTdGF0aWModGhlQ2xhc3MsIGJhc2VOYW1lICsgIlNhZmUiKSwNCisgICAgICAgICAgICAgICAgICAgIE1ldGhvZENhbGxlci5uZXdTdGF0aWModGhlQ2xhc3MsIGJhc2VOYW1lICsgIlNwcmVhZFNhZmUiKQ0KKyAgICAgICAgICAgIH07DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIG1jbWEubWV0aG9kcyA9IG5ldyBNZXRob2RDYWxsZXJbXXsNCisgICAgICAgICAgICAgICAgICAgIE1ldGhvZENhbGxlci5uZXdTdGF0aWModGhlQ2xhc3MsIGJhc2VOYW1lKQ0KKyAgICAgICAgICAgIH07DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gbWNtYTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHBhcmFtIG1ldGhvZFZpc2l0b3INCisgICAgICogQHBhcmFtIG51bWJlck9mQXJndW1lbnRzIGEgdmFsdWUgPjAgZGVzY3JpYmluZyBob3cgbWFueSBhcmd1bWVudHMgYXJlIGFkZGl0aW9uYWxseSB1c2VkIGZvciB0aGUgbWV0aG9kIGNhbGwNCisgICAgICogQHBhcmFtIHNhZmUNCisgICAgICogQHBhcmFtIHNwcmVhZFNhZmUNCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIGNhbGwoTWV0aG9kVmlzaXRvciBtZXRob2RWaXNpdG9yLCBpbnQgbnVtYmVyT2ZBcmd1bWVudHMsIGJvb2xlYW4gc2FmZSwgYm9vbGVhbiBzcHJlYWRTYWZlKSB7DQorICAgICAgICBpbnQgb2Zmc2V0ID0gMDsNCisgICAgICAgIGlmIChzYWZlICYmICFza2lwU3ByZWFkU2FmZUFuZFNhZmUpIG9mZnNldCA9IDE7DQorICAgICAgICBpZiAoc3ByZWFkU2FmZSAmJiAhc2tpcFNwcmVhZFNhZmVBbmRTYWZlKSBvZmZzZXQgPSAyOw0KKyAgICAgICAgaWYgKG51bWJlck9mQXJndW1lbnRzID4gTUFYX0FSR1MgfHwgbnVtYmVyT2ZBcmd1bWVudHMgPCAwKSB7DQorICAgICAgICAgICAgb2Zmc2V0ICs9IChNQVhfQVJHUyArIDEpICogbnVtYmVyT2ZCYXNlTWV0aG9kcygpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBvZmZzZXQgKz0gbnVtYmVyT2ZBcmd1bWVudHMgKiBudW1iZXJPZkJhc2VNZXRob2RzKCk7DQorICAgICAgICB9DQorICAgICAgICBtZXRob2RzW29mZnNldF0uY2FsbChtZXRob2RWaXNpdG9yKTsNCisgICAgfQ0KKw0KKyAgICBwcml2YXRlIGludCBudW1iZXJPZkJhc2VNZXRob2RzKCkgew0KKyAgICAgICAgaWYgKHNraXBTcHJlYWRTYWZlQW5kU2FmZSkgcmV0dXJuIDE7DQorICAgICAgICByZXR1cm4gMzsNCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9SZWZsZWN0b3JHZW5lcmF0b3IuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL1JlZmxlY3RvckdlbmVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMjY1ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9SZWZsZWN0b3JHZW5lcmF0b3IuamF2YQpAQCAtMCwwICsxLDIxMSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW47CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJlZmxlY3Rpb24uQ2FjaGVkQ2xhc3M7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5yZWZsZWN0aW9uLkNhY2hlZE1ldGhvZDsKK2ltcG9ydCBvcmcub2JqZWN0d2ViLmFzbS5DbGFzc1Zpc2l0b3I7CitpbXBvcnQgb3JnLm9iamVjdHdlYi5hc20uTGFiZWw7CitpbXBvcnQgb3JnLm9iamVjdHdlYi5hc20uTWV0aG9kVmlzaXRvcjsKK2ltcG9ydCBvcmcub2JqZWN0d2ViLmFzbS5PcGNvZGVzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQ29kZSBnZW5lcmF0ZXMgYSBSZWZsZWN0b3IKKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgUmVmbGVjdG9yR2VuZXJhdG9yIGltcGxlbWVudHMgT3Bjb2RlcyB7CisKKyAgICBwcml2YXRlIExpc3QgbWV0aG9kczsKKyAgICBwcml2YXRlIENsYXNzVmlzaXRvciBjdjsKKyAgICBwcml2YXRlIEJ5dGVjb2RlSGVscGVyIGhlbHBlciA9IG5ldyBCeXRlY29kZUhlbHBlcihudWxsKTsKKyAgICBwcml2YXRlIFN0cmluZyBjbGFzc0ludGVybmFsTmFtZTsKKworICAgIHByaXZhdGUgc3RhdGljIExpc3QgbV9uYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRfbV9uYW1lIChpbnQgaSkgeworICAgICAgd2hpbGUgKGkgPj0gbV9uYW1lcy5zaXplKCkpIHsKKyAgICAgICAgbV9uYW1lcy5hZGQoIm0iICsgbV9uYW1lcy5zaXplKCkpOworICAgICAgfQorCisgICAgICByZXR1cm4gKFN0cmluZykgbV9uYW1lcy5nZXQoaSk7CisgICAgfQorCisgICAgcHVibGljIFJlZmxlY3RvckdlbmVyYXRvcihMaXN0IG1ldGhvZHMpIHsKKyAgICAgICAgdGhpcy5tZXRob2RzID0gbmV3IEFycmF5TGlzdChtZXRob2RzLnNpemUoKSk7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBtZXRob2RzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7CisgICAgICAgICAgICBDYWNoZWRNZXRob2QgbWV0aG9kID0gKENhY2hlZE1ldGhvZCkgaXQubmV4dCgpOworICAgICAgICAgICAgaWYgKG1ldGhvZC5jYW5CZUNhbGxlZEJ5UmVmbGVjdG9yKCkpCisgICAgICAgICAgICAgIHRoaXMubWV0aG9kcy5hZGQobWV0aG9kKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlKENsYXNzVmlzaXRvciBjdiwgU3RyaW5nIGNsYXNzTmFtZSkgeworICAgICAgICB0aGlzLmN2ID0gY3Y7CisKKyAgICAgICAgY2xhc3NJbnRlcm5hbE5hbWUgPSBCeXRlY29kZUhlbHBlci5nZXRDbGFzc0ludGVybmFsTmFtZShjbGFzc05hbWUpOworICAgICAgICBjdi52aXNpdChDbGFzc0dlbmVyYXRvci5hc21KREtWZXJzaW9uLCBBQ0NfUFVCTElDICsgQUNDX1NVUEVSLCBjbGFzc0ludGVybmFsTmFtZSwgbnVsbCwgIm9yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9SZWZsZWN0b3IiLCBudWxsKTsKKworICAgICAgICBjdi52aXNpdEZpZWxkKEFDQ19QVUJMSUMgKyBBQ0NfU1RBVElDLCAiYWNjZXNzb3IiLCAiTGphdmEvbGFuZy9PYmplY3Q7IiwgbnVsbCwgbnVsbCk7CisKKyAgICAgICAgTWV0aG9kVmlzaXRvciBtdkluaXQgPSBjdi52aXNpdE1ldGhvZChBQ0NfUFVCTElDLCAiPGluaXQ+IiwgIigpViIsIG51bGwsIG51bGwpOworICAgICAgICBtdkluaXQudmlzaXRWYXJJbnNuKEFMT0FELCAwKTsKKyAgICAgICAgbXZJbml0LnZpc2l0TWV0aG9kSW5zbihJTlZPS0VTUEVDSUFMLCAib3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL1JlZmxlY3RvciIsICI8aW5pdD4iLCAiKClWIik7CisgICAgICAgIG12SW5pdC52aXNpdEluc24oUkVUVVJOKTsKKyAgICAgICAgbXZJbml0LnZpc2l0TWF4cygxLCAxKTsKKworICAgICAgICBNZXRob2RWaXNpdG9yIG12Q2xpbml0ID0gY3YudmlzaXRNZXRob2QoQUNDX1NUQVRJQywgIjxjbGluaXQ+IiwgIigpViIsIG51bGwsIG51bGwpOworICAgICAgICBtdkNsaW5pdC52aXNpdFR5cGVJbnNuKE5FVywgY2xhc3NJbnRlcm5hbE5hbWUpOworICAgICAgICBtdkNsaW5pdC52aXNpdEluc24oRFVQKTsKKyAgICAgICAgbXZDbGluaXQudmlzaXRNZXRob2RJbnNuKElOVk9LRVNQRUNJQUwsIGNsYXNzSW50ZXJuYWxOYW1lLCAiPGluaXQ+IiwgIigpViIpOworICAgICAgICBtdkNsaW5pdC52aXNpdEZpZWxkSW5zbihQVVRTVEFUSUMsIGNsYXNzSW50ZXJuYWxOYW1lLCAiYWNjZXNzb3IiLCAiTGphdmEvbGFuZy9PYmplY3Q7Iik7CisgICAgICAgIG12Q2xpbml0LnZpc2l0SW5zbihSRVRVUk4pOworICAgICAgICBtdkNsaW5pdC52aXNpdE1heHMoMSwgMSk7CisKKyAgICAgICAgZ2VuZXJhdGVJbnZva2VNZXRob2QoKTsKKworICAgICAgICBjdi52aXNpdEVuZCgpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGdlbmVyYXRlSW52b2tlTWV0aG9kKCkgeworICAgICAgICBpbnQgbWV0aG9kQ291bnQgPSBtZXRob2RzLnNpemUoKTsKKworICAgICAgICBNZXRob2RWaXNpdG9yIG12ID0gY3YudmlzaXRNZXRob2QoCisgICAgICAgICAgICAgICAgQUNDX1BVQkxJQywKKyAgICAgICAgICAgICAgICAiaW52b2tlIiwKKyAgICAgICAgICAgICAgICAiKExvcmcvY29kZWhhdXMvZ3Jvb3Z5L3JlZmxlY3Rpb24vQ2FjaGVkTWV0aG9kO0xqYXZhL2xhbmcvT2JqZWN0O1tMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7IiwKKyAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgIG51bGwpOworCisgICAgICAgIC8vIGxvYWQgcGFyYW1ldGVycyBmb3IgdGhlIGhlbHBlciBtZXRob2QgY2FsbAorICAgICAgICBtdi52aXNpdFZhckluc24oQUxPQUQsIDApOworICAgICAgICBtdi52aXNpdFZhckluc24oQUxPQUQsIDEpOworICAgICAgICBtdi52aXNpdFZhckluc24oQUxPQUQsIDIpOworICAgICAgICBtdi52aXNpdFZhckluc24oQUxPQUQsIDMpOworCisgICAgICAgIC8vIGdldCBtZXRob2QgbnVtYmVyIGZvciBzd2l0Y2gKKyAgICAgICAgbXYudmlzaXRWYXJJbnNuKEFMT0FELCAxKTsKKyAgICAgICAgbXYudmlzaXRNZXRob2RJbnNuKElOVk9LRVZJUlRVQUwsICJvcmcvY29kZWhhdXMvZ3Jvb3Z5L3JlZmxlY3Rpb24vQ2FjaGVkTWV0aG9kIiwgImdldE1ldGhvZEluZGV4IiwgIigpSSIpOworCisgICAgICAgIC8vIGluaXQgbWV0YSBtZXRob2RzIHdpdGggbnVtYmVyCisgICAgICAgIExhYmVsIGRlZmF1bHRMYWJlbCA9IG5ldyBMYWJlbCgpOworICAgICAgICBMYWJlbFtdIGxhYmVscyA9IG5ldyBMYWJlbFttZXRob2RDb3VudF07CisgICAgICAgIGludFtdIGluZGljZXMgPSBuZXcgaW50W21ldGhvZENvdW50XTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBsYWJlbHNbaV0gPSBuZXcgTGFiZWwoKTsKKyAgICAgICAgICAgIENhY2hlZE1ldGhvZCBtZXRob2QgPSAoQ2FjaGVkTWV0aG9kKSBtZXRob2RzLmdldChpKTsKKyAgICAgICAgICAgIG1ldGhvZC5zZXRNZXRob2RJbmRleChpbmRpY2VzW2ldID0gaSsxKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGRvIHN3aXRjaAorICAgICAgICBtdi52aXNpdExvb2t1cFN3aXRjaEluc24oZGVmYXVsdExhYmVsLCBpbmRpY2VzLCBsYWJlbHMpOworICAgICAgICAvLyBjcmVhdGUgc3dpdGNoIGNhc2VzCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kQ291bnQ7IGkrKykgeworICAgICAgICAgICAgLy8gY2FsbCBoZWxwZXIgZm9yIGludm9jYXRpb24KKyAgICAgICAgICAgIG12LnZpc2l0TGFiZWwobGFiZWxzW2ldKTsKKyAgICAgICAgICAgIG12LnZpc2l0TWV0aG9kSW5zbigKKyAgICAgICAgICAgICAgICAgICAgSU5WT0tFU1BFQ0lBTCwKKyAgICAgICAgICAgICAgICAgICAgY2xhc3NJbnRlcm5hbE5hbWUsCisgICAgICAgICAgICAgICAgICAgIGdldF9tX25hbWUoaSksCisgICAgICAgICAgICAgICAgICAgICIoTG9yZy9jb2RlaGF1cy9ncm9vdnkvcmVmbGVjdGlvbi9DYWNoZWRNZXRob2Q7TGphdmEvbGFuZy9PYmplY3Q7W0xqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL09iamVjdDsiKTsKKyAgICAgICAgICAgIG12LnZpc2l0SW5zbihBUkVUVVJOKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNhbGwgaGVscGVyIGZvciBlcnJvcgorICAgICAgICBtdi52aXNpdExhYmVsKGRlZmF1bHRMYWJlbCk7CisgICAgICAgIG12LnZpc2l0TWV0aG9kSW5zbigKKyAgICAgICAgICAgICAgICBJTlZPS0VWSVJUVUFMLAorICAgICAgICAgICAgICAgIGNsYXNzSW50ZXJuYWxOYW1lLAorICAgICAgICAgICAgICAgICJub1N1Y2hNZXRob2QiLAorICAgICAgICAgICAgICAgICIoTG9yZy9jb2RlaGF1cy9ncm9vdnkvcmVmbGVjdGlvbi9DYWNoZWRNZXRob2Q7TGphdmEvbGFuZy9PYmplY3Q7W0xqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL09iamVjdDsiKTsKKyAgICAgICAgbXYudmlzaXRJbnNuKEFSRVRVUk4pOworICAgICAgICAvLyBlbmQgbWV0aG9kCisgICAgICAgIG12LnZpc2l0TWF4cyg0LCA0KTsKKyAgICAgICAgbXYudmlzaXRFbmQoKTsKKworICAgICAgICAvLyBjcmVhdGUgaGVscGVyIG1ldGhvZHMgbSoKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBtdiA9IGN2LnZpc2l0TWV0aG9kKAorICAgICAgICAgICAgICAgICAgICBBQ0NfUFJJVkFURSwKKyAgICAgICAgICAgICAgICAgICAgZ2V0X21fbmFtZShpKSwKKyAgICAgICAgICAgICAgICAgICAgIihMb3JnL2NvZGVoYXVzL2dyb292eS9yZWZsZWN0aW9uL0NhY2hlZE1ldGhvZDtMamF2YS9sYW5nL09iamVjdDtbTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2JqZWN0OyIsCisgICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgIG51bGwpOworICAgICAgICAgICAgaGVscGVyID0gbmV3IEJ5dGVjb2RlSGVscGVyKG12KTsKKworICAgICAgICAgICAgQ2FjaGVkTWV0aG9kIG1ldGhvZCA9IChDYWNoZWRNZXRob2QpIG1ldGhvZHMuZ2V0KGkpOworICAgICAgICAgICAgaW52b2tlTWV0aG9kKG1ldGhvZCwgbXYpOworICAgICAgICAgICAgaWYgKG1ldGhvZC5nZXRSZXR1cm5UeXBlKCkgPT0gdm9pZC5jbGFzcykgeworICAgICAgICAgICAgICAgIG12LnZpc2l0SW5zbihBQ09OU1RfTlVMTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtdi52aXNpdEluc24oQVJFVFVSTik7CisgICAgICAgICAgICBtdi52aXNpdE1heHMoMCwgMCk7CisgICAgICAgICAgICBtdi52aXNpdEVuZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgaW52b2tlTWV0aG9kKENhY2hlZE1ldGhvZCBtZXRob2QsIE1ldGhvZFZpc2l0b3IgbXYpIHsKKyAgICAgICAgLy8gY29tcHV0ZSBjbGFzcyB0byBtYWtlIHRoZSBjYWxsIG9uCisgICAgICAgIENsYXNzIGNhbGxDbGFzcyA9IG1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpOworICAgICAgICBib29sZWFuIHVzZUludGVyZmFjZSA9IGNhbGxDbGFzcy5pc0ludGVyZmFjZSgpOworLy8gICAgICAgIGlmIChjYWxsQ2xhc3MgPT0gbnVsbCkgeworLy8gICAgICAgICAgICBjYWxsQ2xhc3MgPSBtZXRob2QuZ2V0Q2FsbENsYXNzKCk7CisvLyAgICAgICAgfSBlbHNlIHsKKy8vICAgICAgICAgICAgdXNlSW50ZXJmYWNlID0gdHJ1ZTsKKy8vICAgICAgICB9CisgICAgICAgIC8vIGdldCBieXRlY29kZSBpbmZvcm1hdGlvbgorICAgICAgICBTdHJpbmcgdHlwZSA9IEJ5dGVjb2RlSGVscGVyLmdldENsYXNzSW50ZXJuYWxOYW1lKGNhbGxDbGFzcy5nZXROYW1lKCkpOworICAgICAgICBTdHJpbmcgZGVzY3JpcHRvciA9IEJ5dGVjb2RlSGVscGVyLmdldE1ldGhvZERlc2NyaXB0b3IobWV0aG9kLmdldFJldHVyblR5cGUoKSwgbWV0aG9kLmdldE5hdGl2ZVBhcmFtZXRlclR5cGVzKCkpOworCisgICAgICAgIC8vIG1ha2UgY2FsbAorICAgICAgICBpZiAobWV0aG9kLmlzU3RhdGljKCkpIHsKKyAgICAgICAgICAgIGxvYWRQYXJhbWV0ZXJzKG1ldGhvZCwgMywgbXYpOworICAgICAgICAgICAgbXYudmlzaXRNZXRob2RJbnNuKElOVk9LRVNUQVRJQywgdHlwZSwgbWV0aG9kLmdldE5hbWUoKSwgZGVzY3JpcHRvcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtdi52aXNpdFZhckluc24oQUxPQUQsIDIpOworICAgICAgICAgICAgaGVscGVyLmRvQ2FzdChjYWxsQ2xhc3MpOworICAgICAgICAgICAgbG9hZFBhcmFtZXRlcnMobWV0aG9kLCAzLCBtdik7CisgICAgICAgICAgICBtdi52aXNpdE1ldGhvZEluc24oKHVzZUludGVyZmFjZSkgPyBJTlZPS0VJTlRFUkZBQ0UgOiBJTlZPS0VWSVJUVUFMLCB0eXBlLCBtZXRob2QuZ2V0TmFtZSgpLCBkZXNjcmlwdG9yKTsKKyAgICAgICAgfQorCisgICAgICAgIGhlbHBlci5ib3gobWV0aG9kLmdldFJldHVyblR5cGUoKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgbG9hZFBhcmFtZXRlcnMoQ2FjaGVkTWV0aG9kIG1ldGhvZCwgaW50IGFyZ3VtZW50SW5kZXgsIE1ldGhvZFZpc2l0b3IgbXYpIHsKKyAgICAgICAgQ2FjaGVkQ2xhc3NbXSBwYXJhbWV0ZXJzID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7CisgICAgICAgIGludCBzaXplID0gcGFyYW1ldGVycy5sZW5ndGg7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAvLyB1bnBhY2sgYXJndW1lbnQgZnJvbSBPYmplY3RbXQorICAgICAgICAgICAgbXYudmlzaXRWYXJJbnNuKEFMT0FELCBhcmd1bWVudEluZGV4KTsKKyAgICAgICAgICAgIGhlbHBlci5wdXNoQ29uc3RhbnQoaSk7CisgICAgICAgICAgICBtdi52aXNpdEluc24oQUFMT0FEKTsKKworICAgICAgICAgICAgLy8gY2FzdCBhcmd1bWVudCB0byBwYXJhbWV0ZXIgY2xhc3MsIGluY2x1c2l2ZSB1bmJveGluZworICAgICAgICAgICAgLy8gZm9yIG1ldGhvZHMgd2l0aCBwcmltaXRpdmUgdHlwZXMKKyAgICAgICAgICAgIENsYXNzIHR5cGUgPSBwYXJhbWV0ZXJzW2ldLmdldENhY2hlZENsYXNzKCk7CisgICAgICAgICAgICBpZiAodHlwZS5pc1ByaW1pdGl2ZSgpKSB7CisgICAgICAgICAgICAgICAgaGVscGVyLnVuYm94KHR5cGUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBoZWxwZXIuZG9DYXN0KHR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vUnVudGltZUluY29tcGxldGVDbGFzc0V4Y2VwdGlvbi5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vUnVudGltZUluY29tcGxldGVDbGFzc0V4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhNDZlYjAKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9SdW50aW1lSW5jb21wbGV0ZUNsYXNzRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW47CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LkFTVE5vZGU7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXguUnVudGltZVBhcnNlckV4Y2VwdGlvbjsKKworLyoqCisgKiBSdW50aW1lSW5jb21wbGV0ZUNsYXNzRXhjZXB0aW9uCisgKiAKKyAqLworcHVibGljIGNsYXNzIFJ1bnRpbWVJbmNvbXBsZXRlQ2xhc3NFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lUGFyc2VyRXhjZXB0aW9uIHsKKworICAgIC8qKgorICAgICAqIEBwYXJhbSBjbGFzc25hbWVzIG5hbWVzIG9mIGNsYXNzZXMKKyAgICAgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSBjb250YWluaW5nIHRoZSBlcnJvcgorICAgICAqLworICAgIHB1YmxpYyBSdW50aW1lSW5jb21wbGV0ZUNsYXNzRXhjZXB0aW9uKExpc3QgY2xhc3NuYW1lcywgQVNUTm9kZSBub2RlKSB7CisgICAgICAgIHN1cGVyKCJJbmNvbXBsZXRlIGNsYXNzOiBkb2VzIG5vdCBpbXBsZW1lbnQgYWJzdHJhY3QgbWV0aG9kczogIiArIGNsYXNzbmFtZXMsIG5vZGUpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vVmFyaWFibGUuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL1ZhcmlhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU4YTU0MgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL1ZhcmlhYmxlLmphdmEKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuQ2xhc3NIZWxwZXI7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuQ2xhc3NOb2RlOworaW1wb3J0IG9yZy5vYmplY3R3ZWIuYXNtLkxhYmVsOworCisvKioKKyAqIFJlcHJlc2VudHMgY29tcGlsZSB0aW1lIHZhcmlhYmxlIG1ldGFkYXRhIHdoaWxlIGNvbXBpbGluZyBhIG1ldGhvZC4KKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmJsYWNrZHJhZ0BnbXgub3JnIj5Kb2NoZW4gVGhlb2Rvcm91PC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgVmFyaWFibGUgeworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVmFyaWFibGUgVEhJU19WQVJJQUJMRSA9IG5ldyBWYXJpYWJsZSgpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVmFyaWFibGUgU1VQRVJfVkFSSUFCTEUgPSBuZXcgVmFyaWFibGUoKTsKKworICAgIHByaXZhdGUgaW50IGluZGV4OworICAgIHByaXZhdGUgQ2xhc3NOb2RlIHR5cGU7CisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gaG9sZGVyOworICAgIHByaXZhdGUgYm9vbGVhbiBwcm9wZXJ0eTsKKworICAgIC8vIGJyIGZvciBzZXR0aW5nIG9uIHRoZSBMb2NhbFZhcmlhYmxlVGFibGUgaW4gdGhlIGNsYXNzIGZpbGUKKyAgICAvLyB0aGVzZSBmaWVsZHMgc2hvdWxkIHByb2JhYmx5IGdvIHRvIGp2bSBPcGVyYW5kIGNsYXNzCisgICAgcHJpdmF0ZSBMYWJlbCBzdGFydExhYmVsID0gbnVsbDsKKyAgICBwcml2YXRlIExhYmVsIGVuZExhYmVsID0gbnVsbDsKKyAgICBwcml2YXRlIGJvb2xlYW4gZHluYW1pY1R5cGVkOworCisgICAgcHJpdmF0ZSBWYXJpYWJsZSgpeworICAgICAgICBkeW5hbWljVHlwZWQgPSB0cnVlOworICAgICAgICBpbmRleD0wOworICAgICAgICBob2xkZXI9ZmFsc2U7CisgICAgICAgIHByb3BlcnR5PWZhbHNlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgVmFyaWFibGUoaW50IGluZGV4LCBDbGFzc05vZGUgdHlwZSwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4OworICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgcHVibGljIENsYXNzTm9kZSBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gdHlwZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHR5cGUuZ2V0TmFtZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHN0YWNrIGluZGV4IGZvciB0aGlzIHZhcmlhYmxlCisgICAgICovCisgICAgcHVibGljIGludCBnZXRJbmRleCgpIHsKKyAgICAgICAgcmV0dXJuIGluZGV4OworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gaXMgdGhpcyBsb2NhbCB2YXJpYWJsZSBzaGFyZWQgaW4gb3RoZXIgc2NvcGVzIChhbmQgc28gbXVzdCB1c2UgYSBWYWx1ZUhvbGRlcikKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0hvbGRlcigpIHsKKyAgICAgICAgcmV0dXJuIGhvbGRlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRIb2xkZXIoYm9vbGVhbiBob2xkZXIpIHsKKyAgICAgICAgdGhpcy5ob2xkZXIgPSBob2xkZXI7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eSgpIHsKKyAgICAgICAgcmV0dXJuIHByb3BlcnR5OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KGJvb2xlYW4gcHJvcGVydHkpIHsKKyAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5OworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgTGFiZWwgZ2V0U3RhcnRMYWJlbCgpIHsKKyAgICAgICAgcmV0dXJuIHN0YXJ0TGFiZWw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3RhcnRMYWJlbChMYWJlbCBzdGFydExhYmVsKSB7CisgICAgICAgIHRoaXMuc3RhcnRMYWJlbCA9IHN0YXJ0TGFiZWw7CisgICAgfQorCisgICAgcHVibGljIExhYmVsIGdldEVuZExhYmVsKCkgeworICAgICAgICByZXR1cm4gZW5kTGFiZWw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RW5kTGFiZWwoTGFiZWwgZW5kTGFiZWwpIHsKKyAgICAgICAgdGhpcy5lbmRMYWJlbCA9IGVuZExhYmVsOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKyAgICAgICAgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCkgKyAiWyIgKyB0eXBlICsgIiAiICsgbmFtZSArICIgKCIgKyBpbmRleCArICIpIjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKENsYXNzTm9kZSB0eXBlKSB7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgIGR5bmFtaWNUeXBlZCB8PSB0eXBlPT1DbGFzc0hlbHBlci5EWU5BTUlDX1RZUEU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RHluYW1pY1R5cGVkKGJvb2xlYW4gYikgeworICAgICAgICBkeW5hbWljVHlwZWQgPSBiOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0R5bmFtaWNUeXBlZCgpIHsKKyAgICAgICAgcmV0dXJuIGR5bmFtaWNUeXBlZDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9WYXJpYWJsZVNjb3BlVmlzaXRvci5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vVmFyaWFibGVTY29wZVZpc2l0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGJiNGExCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vVmFyaWFibGVTY29wZVZpc2l0b3IuamF2YQpAQCAtMCwwICsxLDUwMSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW47CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5Lkdyb292eUJ1Z0Vycm9yOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0Lio7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuVmFyaWFibGU7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuZXhwci4qOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuQmxvY2tTdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3Quc3RtdC5DYXRjaFN0YXRlbWVudDsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5zdG10LkZvclN0YXRlbWVudDsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuU291cmNlVW5pdDsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIGdvZXMgdGhyb3VnaCBhbiBBU1QgYW5kIGluaXRpYWxpemVzIHRoZSBzY29wZXMKKyAqCisgKiBAYXV0aG9yIEpvY2hlbiBUaGVvZG9yb3UKKyAqLworcHVibGljIGNsYXNzIFZhcmlhYmxlU2NvcGVWaXNpdG9yIGV4dGVuZHMgQ2xhc3NDb2RlVmlzaXRvclN1cHBvcnQgeworICAgIHByaXZhdGUgVmFyaWFibGVTY29wZSBjdXJyZW50U2NvcGUgPSBudWxsOworICAgIHByaXZhdGUgVmFyaWFibGVTY29wZSBoZWFkU2NvcGUgPSBuZXcgVmFyaWFibGVTY29wZSgpOworICAgIHByaXZhdGUgQ2xhc3NOb2RlIGN1cnJlbnRDbGFzcyA9IG51bGw7CisgICAgcHJpdmF0ZSBTb3VyY2VVbml0IHNvdXJjZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gaW5DbG9zdXJlID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIGluUHJvcGVydHlFeHByZXNzaW9uID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIGlzU3BlY2lhbENvbnN0cnVjdG9yQ2FsbCA9IGZhbHNlOworCisgICAgcHJpdmF0ZSBMaW5rZWRMaXN0IHN0YXRlU3RhY2sgPSBuZXcgTGlua2VkTGlzdCgpOworCisgICAgcHJpdmF0ZSBjbGFzcyBTdGF0ZVN0YWNrRWxlbWVudCB7CisgICAgICAgIFZhcmlhYmxlU2NvcGUgc2NvcGU7CisgICAgICAgIENsYXNzTm9kZSBjbGF6ejsKKyAgICAgICAgYm9vbGVhbiBjbG9zdXJlOworCisgICAgICAgIFN0YXRlU3RhY2tFbGVtZW50KCkgeworICAgICAgICAgICAgc2NvcGUgPSBWYXJpYWJsZVNjb3BlVmlzaXRvci50aGlzLmN1cnJlbnRTY29wZTsKKyAgICAgICAgICAgIGNsYXp6ID0gVmFyaWFibGVTY29wZVZpc2l0b3IudGhpcy5jdXJyZW50Q2xhc3M7CisgICAgICAgICAgICBjbG9zdXJlID0gVmFyaWFibGVTY29wZVZpc2l0b3IudGhpcy5pbkNsb3N1cmU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgVmFyaWFibGVTY29wZVZpc2l0b3IoU291cmNlVW5pdCBzb3VyY2UpIHsKKyAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7CisgICAgICAgIGN1cnJlbnRTY29wZSA9IGhlYWRTY29wZTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBoZWxwZXIgbWV0aG9kcyAgIAorICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBwcml2YXRlIHZvaWQgcHVzaFN0YXRlKGJvb2xlYW4gaXNTdGF0aWMpIHsKKyAgICAgICAgc3RhdGVTdGFjay5hZGQobmV3IFN0YXRlU3RhY2tFbGVtZW50KCkpOworICAgICAgICBjdXJyZW50U2NvcGUgPSBuZXcgVmFyaWFibGVTY29wZShjdXJyZW50U2NvcGUpOworICAgICAgICBjdXJyZW50U2NvcGUuc2V0SW5TdGF0aWNDb250ZXh0KGlzU3RhdGljKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHVzaFN0YXRlKCkgeworICAgICAgICBwdXNoU3RhdGUoY3VycmVudFNjb3BlLmlzSW5TdGF0aWNDb250ZXh0KCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwb3BTdGF0ZSgpIHsKKyAgICAgICAgLy8gYSBzY29wZSBpbiBhIGNsb3N1cmUgaXMgbmV2ZXIgcmVhbGx5IHN0YXRpYworICAgICAgICAvLyB0aGUgY2hlY2tpbmcgbmVlZHMgdGhpcyB0byBiZSBhcyB0aGUgc3Vycm91bmRpbmcKKyAgICAgICAgLy8gbWV0aG9kIHRvIGNvcnJlY3RseSBjaGVjayB0aGUgYWNjZXNzIHRvIHZhcmlhYmxlcy4KKyAgICAgICAgLy8gQnV0IGEgY2xvc3VyZSBhbmQgYWxsIG5lc3RlZCBzY29wZXMgYXJlIGEgcmVzdWx0CisgICAgICAgIC8vIG9mIGNhbGxpbmcgYSBub24gc3RhdGljIG1ldGhvZCwgc28gdGhlIGNvbnRleHQKKyAgICAgICAgLy8gaXMgbm90IHN0YXRpYy4KKyAgICAgICAgaWYgKGluQ2xvc3VyZSkgY3VycmVudFNjb3BlLnNldEluU3RhdGljQ29udGV4dChmYWxzZSk7CisKKyAgICAgICAgU3RhdGVTdGFja0VsZW1lbnQgZWxlbWVudCA9IChTdGF0ZVN0YWNrRWxlbWVudCkgc3RhdGVTdGFjay5yZW1vdmVMYXN0KCk7CisgICAgICAgIGN1cnJlbnRTY29wZSA9IGVsZW1lbnQuc2NvcGU7CisgICAgICAgIGN1cnJlbnRDbGFzcyA9IGVsZW1lbnQuY2xheno7CisgICAgICAgIGluQ2xvc3VyZSA9IGVsZW1lbnQuY2xvc3VyZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGVjbGFyZShQYXJhbWV0ZXJbXSBwYXJhbWV0ZXJzLCBBU1ROb2RlIG5vZGUpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAocGFyYW1ldGVyc1tpXS5oYXNJbml0aWFsRXhwcmVzc2lvbigpKSB7CisgICAgICAgICAgICAgICAgcGFyYW1ldGVyc1tpXS5nZXRJbml0aWFsRXhwcmVzc2lvbigpLnZpc2l0KHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVjbGFyZShwYXJhbWV0ZXJzW2ldLCBub2RlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkZWNsYXJlKFZhcmlhYmxlRXhwcmVzc2lvbiBleHByKSB7CisgICAgICAgIGRlY2xhcmUoZXhwciwgZXhwcik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRlY2xhcmUoVmFyaWFibGUgdmFyLCBBU1ROb2RlIGV4cHIpIHsKKyAgICAgICAgU3RyaW5nIHNjb3BlVHlwZSA9ICJzY29wZSI7CisgICAgICAgIFN0cmluZyB2YXJpYWJsZVR5cGUgPSAidmFyaWFibGUiOworCisgICAgICAgIGlmIChleHByLmdldENsYXNzKCkgPT0gRmllbGROb2RlLmNsYXNzKSB7CisgICAgICAgICAgICBzY29wZVR5cGUgPSAiY2xhc3MiOworICAgICAgICAgICAgdmFyaWFibGVUeXBlID0gImZpZWxkIjsKKyAgICAgICAgfSBlbHNlIGlmIChleHByLmdldENsYXNzKCkgPT0gUHJvcGVydHlOb2RlLmNsYXNzKSB7CisgICAgICAgICAgICBzY29wZVR5cGUgPSAiY2xhc3MiOworICAgICAgICAgICAgdmFyaWFibGVUeXBlID0gInByb3BlcnR5IjsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZ0J1ZmZlciBtc2cgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIG1zZy5hcHBlbmQoIlRoZSBjdXJyZW50ICIpLmFwcGVuZChzY29wZVR5cGUpOworICAgICAgICBtc2cuYXBwZW5kKCIgYWxyZWFkeSBjb250YWlucyBhICIpLmFwcGVuZCh2YXJpYWJsZVR5cGUpOworICAgICAgICBtc2cuYXBwZW5kKCIgb2YgdGhlIG5hbWUgIikuYXBwZW5kKHZhci5nZXROYW1lKCkpOworCisgICAgICAgIGlmIChjdXJyZW50U2NvcGUuZ2V0RGVjbGFyZWRWYXJpYWJsZSh2YXIuZ2V0TmFtZSgpKSAhPSBudWxsKSB7CisgICAgICAgICAgICBhZGRFcnJvcihtc2cudG9TdHJpbmcoKSwgZXhwcik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmb3IgKFZhcmlhYmxlU2NvcGUgc2NvcGUgPSBjdXJyZW50U2NvcGUuZ2V0UGFyZW50KCk7IHNjb3BlICE9IG51bGw7IHNjb3BlID0gc2NvcGUuZ2V0UGFyZW50KCkpIHsKKyAgICAgICAgICAgIC8vIGlmIHdlIGFyZSBpbiBhIGNsYXNzIGFuZCBubyB2YXJpYWJsZSBpcyBkZWNsYXJlZCB1bnRpbAorICAgICAgICAgICAgLy8gbm93LCB0aGVuIHdlIGNhbiBicmVhayB0aGUgbG9vcCwgYmVjYXVzZSB3ZSBhcmUgYWxsb3dlZAorICAgICAgICAgICAgLy8gdG8gZGVjbGFyZSBhIHZhcmlhYmxlIG9mIHRoZSBzYW1lIG5hbWUgYXMgYSBjbGFzcyBtZW1iZXIKKyAgICAgICAgICAgIGlmIChzY29wZS5nZXRDbGFzc1Njb3BlKCkgIT0gbnVsbCkgYnJlYWs7CisKKyAgICAgICAgICAgIGlmIChzY29wZS5nZXREZWNsYXJlZFZhcmlhYmxlKHZhci5nZXROYW1lKCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyB2YXJpYWJsZSBhbHJlYWR5IGRlY2xhcmVkCisgICAgICAgICAgICAgICAgYWRkRXJyb3IobXNnLnRvU3RyaW5nKCksIGV4cHIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIGRlY2xhcmUgdGhlIHZhcmlhYmxlIGV2ZW4gaWYgdGhlcmUgd2FzIGFuIGVycm9yIHRvIGFsbG93IG1vcmUgY2hlY2tzCisgICAgICAgIGN1cnJlbnRTY29wZS5wdXREZWNsYXJlZFZhcmlhYmxlKHZhcik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFNvdXJjZVVuaXQgZ2V0U291cmNlVW5pdCgpIHsKKyAgICAgICAgcmV0dXJuIHNvdXJjZTsKKyAgICB9CisKKyAgICBwcml2YXRlIFZhcmlhYmxlIGZpbmRDbGFzc01lbWJlcihDbGFzc05vZGUgY24sIFN0cmluZyBuYW1lKSB7CisgICAgICAgIGlmIChjbiA9PSBudWxsKSByZXR1cm4gbnVsbDsKKyAgICAgICAgaWYgKGNuLmlzU2NyaXB0KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRHluYW1pY1ZhcmlhYmxlKG5hbWUsIGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBMaXN0IGwgPSBjbi5nZXRGaWVsZHMoKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gbC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIEZpZWxkTm9kZSBmID0gKEZpZWxkTm9kZSkgaXRlci5uZXh0KCk7CisgICAgICAgICAgICBpZiAoZi5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSByZXR1cm4gZjsKKyAgICAgICAgfQorCisgICAgICAgIGwgPSBjbi5nZXRNZXRob2RzKCk7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGwuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBNZXRob2ROb2RlIGYgPSAoTWV0aG9kTm9kZSkgaXRlci5uZXh0KCk7CisgICAgICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSA9IGYuZ2V0TmFtZSgpOworICAgICAgICAgICAgU3RyaW5nIHBOYW1lID0gZ2V0UHJvcGVydHlOYW1lKGYpOworICAgICAgICAgICAgaWYgKHBOYW1lID09IG51bGwpIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKCFwTmFtZS5lcXVhbHMobmFtZSkpIGNvbnRpbnVlOworICAgICAgICAgICAgUHJvcGVydHlOb2RlIHZhciA9IG5ldyBQcm9wZXJ0eU5vZGUocE5hbWUsIGYuZ2V0TW9kaWZpZXJzKCksIGdldFByb3BlcnR5VHlwZShmKSwgY24sIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICAgICAgcmV0dXJuIHZhcjsKKyAgICAgICAgfQorCisgICAgICAgIGwgPSBjbi5nZXRQcm9wZXJ0aWVzKCk7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGwuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBQcm9wZXJ0eU5vZGUgZiA9IChQcm9wZXJ0eU5vZGUpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgaWYgKGYuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgcmV0dXJuIGY7CisgICAgICAgIH0KKworICAgICAgICBWYXJpYWJsZSByZXQgPSBmaW5kQ2xhc3NNZW1iZXIoY24uZ2V0U3VwZXJDbGFzcygpLCBuYW1lKTsKKyAgICAgICAgaWYgKHJldCAhPSBudWxsKSByZXR1cm4gcmV0OworICAgICAgICByZXR1cm4gZmluZENsYXNzTWVtYmVyKGNuLmdldE91dGVyQ2xhc3MoKSwgbmFtZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBDbGFzc05vZGUgZ2V0UHJvcGVydHlUeXBlKE1ldGhvZE5vZGUgbSkgeworICAgICAgICBTdHJpbmcgbmFtZSA9IG0uZ2V0TmFtZSgpOworICAgICAgICBpZiAobS5nZXRSZXR1cm5UeXBlKCkgIT0gQ2xhc3NIZWxwZXIuVk9JRF9UWVBFKSB7CisgICAgICAgICAgICByZXR1cm4gbS5nZXRSZXR1cm5UeXBlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG0uZ2V0UGFyYW1ldGVycygpWzBdLmdldFR5cGUoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoTWV0aG9kTm9kZSBtKSB7CisgICAgICAgIFN0cmluZyBuYW1lID0gbS5nZXROYW1lKCk7CisgICAgICAgIGlmICghKG5hbWUuc3RhcnRzV2l0aCgic2V0IikgfHwgbmFtZS5zdGFydHNXaXRoKCJnZXQiKSkpIHJldHVybiBudWxsOworICAgICAgICBTdHJpbmcgcG5hbWUgPSBuYW1lLnN1YnN0cmluZygzKTsKKyAgICAgICAgaWYgKHBuYW1lLmxlbmd0aCgpID09IDApIHJldHVybiBudWxsOworICAgICAgICBTdHJpbmcgcyA9IHBuYW1lLnN1YnN0cmluZygwLCAxKS50b0xvd2VyQ2FzZSgpOworICAgICAgICBTdHJpbmcgcmVzdCA9IHBuYW1lLnN1YnN0cmluZygxKTsKKyAgICAgICAgcG5hbWUgPSBzICsgcmVzdDsKKworICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKCJnZXQiKSAmJiBtLmdldFJldHVyblR5cGUoKSA9PSBDbGFzc0hlbHBlci5WT0lEX1RZUEUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoInNldCIpICYmIG0uZ2V0UGFyYW1ldGVycygpLmxlbmd0aCAhPSAxKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcG5hbWU7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIGRpZmZlcmVudCBWYXJpYWJsZSBiYXNlZCBjaGVja3MgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIHByaXZhdGUgVmFyaWFibGUgY2hlY2tWYXJpYWJsZU5hbWVGb3JEZWNsYXJhdGlvbihTdHJpbmcgbmFtZSwgRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisgICAgICAgIGlmICgic3VwZXIiLmVxdWFscyhuYW1lKSB8fCAidGhpcyIuZXF1YWxzKG5hbWUpKSByZXR1cm4gbnVsbDsKKworICAgICAgICBWYXJpYWJsZVNjb3BlIHNjb3BlID0gY3VycmVudFNjb3BlOworICAgICAgICBWYXJpYWJsZSB2YXIgPSBuZXcgRHluYW1pY1ZhcmlhYmxlKG5hbWUsIGN1cnJlbnRTY29wZS5pc0luU3RhdGljQ29udGV4dCgpKTsKKyAgICAgICAgVmFyaWFibGUgZHVtbXlTdGFydCA9IHZhcjsKKyAgICAgICAgLy8gdHJ5IHRvIGZpbmQgYSBkZWNsYXJhdGlvbiBvZiBhIHZhcmlhYmxlCisgICAgICAgIFZhcmlhYmxlU2NvcGUgZHluYW1pY1Njb3BlID0gbnVsbDsKKyAgICAgICAgd2hpbGUgKCFzY29wZS5pc1Jvb3QoKSkgeworICAgICAgICAgICAgaWYgKGR5bmFtaWNTY29wZSA9PSBudWxsICYmIHNjb3BlLmlzUmVzb2x2aW5nRHluYW1pYygpKSB7CisgICAgICAgICAgICAgICAgZHluYW1pY1Njb3BlID0gc2NvcGU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFZhcmlhYmxlIHZhcjE7CisgICAgICAgICAgICB2YXIxID0gc2NvcGUuZ2V0RGVjbGFyZWRWYXJpYWJsZSh2YXIuZ2V0TmFtZSgpKTsKKworICAgICAgICAgICAgaWYgKHZhcjEgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHZhciA9IHZhcjE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhcjEgPSAoVmFyaWFibGUpIHNjb3BlLmdldFJlZmVyZW5jZWRMb2NhbFZhcmlhYmxlKHZhci5nZXROYW1lKCkpOworICAgICAgICAgICAgaWYgKHZhcjEgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHZhciA9IHZhcjE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhcjEgPSBzY29wZS5nZXRSZWZlcmVuY2VkQ2xhc3NWYXJpYWJsZSh2YXIuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIGlmICh2YXIxICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB2YXIgPSB2YXIxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDbGFzc05vZGUgY2xhc3NTY29wZSA9IHNjb3BlLmdldENsYXNzU2NvcGUoKTsKKyAgICAgICAgICAgIGlmIChjbGFzc1Njb3BlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBWYXJpYWJsZSBtZW1iZXIgPSBmaW5kQ2xhc3NNZW1iZXIoY2xhc3NTY29wZSwgdmFyLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgaWYgKG1lbWJlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gY2MgPSBjdXJyZW50U2NvcGUuaXNJblN0YXRpY0NvbnRleHQoKSB8fCBpc1NwZWNpYWxDb25zdHJ1Y3RvckNhbGw7CisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gY20gPSBtZW1iZXIuaXNJblN0YXRpY0NvbnRleHQoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgLy8gd2UgZG9uJ3QgYWxsb3cgYWNjZXNzIGZyb20gZHluYW1pYyBjb250ZXh0IHRvIHN0YXRpYyBjb250ZXh0CisgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgIC8vIGNtPT1jYzogCisgICAgICAgICAgICAgICAgICAgIC8vICAgd2UgYWx3YXlzIGFsbG93IGFjY2VzcyBpZiB0aGUgY29udGV4dCBpcyBpbiBib3RoIGNhc2VzIHN0YXRpYyAKKyAgICAgICAgICAgICAgICAgICAgLy8gICBvciBkeW5hbWljCisgICAgICAgICAgICAgICAgICAgIC8vIGNtPT10cnVlOiAKKyAgICAgICAgICAgICAgICAgICAgLy8gICB0aGUgbWVtYmVyIGlzIHN0YXRpYywgd2hpY2ggbWVhbnMgYWNjZXNzIGlzIGFsd2F5cyBhbGxvd2VkCisgICAgICAgICAgICAgICAgICAgIC8vIGNtfHxjbT09Y2M6CisgICAgICAgICAgICAgICAgICAgIC8vICAgaXMgZmFsc2Ugb25seSBmb3IgdGhlIGNhc2UgY2M9PXRydWUgYW5kIGNtPT1mYWxzZSwgd2hpY2ggbWVhbnMKKyAgICAgICAgICAgICAgICAgICAgLy8gICB0aGUgbWVtYmVyIGlzIGEgZHluYW1pYyBjb250ZXh0LCBidXQgdGhlIGN1cnJlbnQgc2NvcGUgaXMgc3RhdGljLgorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAvLyBPbmUgZXhhbXBsZSBmb3IgKGNtfHxjbT09Y2MpPT1mYWxzZSBpcyBhIHN0YXRpYyBtZXRob2QgdHJ5aW5nIHRvIAorICAgICAgICAgICAgICAgICAgICAvLyBhY2Nlc3MgYSBub24gc3RhdGljIGZpZWxkLgorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICBpZiAoY20gfHwgY20gPT0gY2MpIHZhciA9IG1lbWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzY29wZSA9IHNjb3BlLmdldFBhcmVudCgpOworICAgICAgICB9CisKKyAgICAgICAgVmFyaWFibGVTY29wZSBlbmQgPSBzY29wZTsKKworICAgICAgICBpZiAoc2NvcGUuaXNSb290KCkgJiYgZHluYW1pY1Njb3BlID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIG5vIG1hdGNoaW5nIHNjb3BlIGZvdW5kCisgICAgICAgICAgICBkZWNsYXJlKHZhciwgZXhwcmVzc2lvbik7CisgICAgICAgICAgICBhZGRFcnJvcigiVGhlIHZhcmlhYmxlICIgKyB2YXIuZ2V0TmFtZSgpICsKKyAgICAgICAgICAgICAgICAgICAgIiBpcyB1bmRlZmluZWQgaW4gdGhlIGN1cnJlbnQgc2NvcGUiLCBleHByZXNzaW9uKTsKKyAgICAgICAgfSBlbHNlIGlmIChzY29wZS5pc1Jvb3QoKSAmJiBkeW5hbWljU2NvcGUgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gbm8gbWF0Y2hpbmcgc2NvcGUgZm91bmQsIGJ1dCB0aGVyZSB3YXMgYSBzY29wZSB0aGF0CisgICAgICAgICAgICAvLyByZXNvbHZlcyBkeW5hbWljCisgICAgICAgICAgICBzY29wZSA9IGR5bmFtaWNTY29wZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghc2NvcGUuaXNSb290KCkpIHsKKyAgICAgICAgICAgIHNjb3BlID0gY3VycmVudFNjb3BlOworICAgICAgICAgICAgd2hpbGUgKHNjb3BlICE9IGVuZCkgeworICAgICAgICAgICAgICAgIE1hcCByZWZlcmVuY2VzID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpZiAoZW5kLmlzQ2xhc3NTY29wZSgpIHx8IGVuZC5pc1Jvb3QoKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKGVuZC5pc1JlZmVyZW5jZWRDbGFzc1ZhcmlhYmxlKG5hbWUpICYmIGVuZC5nZXREZWNsYXJlZFZhcmlhYmxlKG5hbWUpID09IG51bGwpKSB7CisgICAgICAgICAgICAgICAgICAgIHNjb3BlLnB1dFJlZmVyZW5jZWRDbGFzc1ZhcmlhYmxlKHZhcik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyLnNldENsb3N1cmVTaGFyZWRWYXJpYWJsZSh2YXIuaXNDbG9zdXJlU2hhcmVkVmFyaWFibGUoKSB8fCBpbkNsb3N1cmUpOworICAgICAgICAgICAgICAgICAgICBzY29wZS5wdXRSZWZlcmVuY2VkTG9jYWxWYXJpYWJsZSh2YXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzY29wZSA9IHNjb3BlLmdldFBhcmVudCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVuZC5pc1Jlc29sdmluZ0R5bmFtaWMoKSkgeworICAgICAgICAgICAgICAgIGlmIChlbmQuZ2V0RGVjbGFyZWRWYXJpYWJsZSh2YXIuZ2V0TmFtZSgpKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGVuZC5wdXREZWNsYXJlZFZhcmlhYmxlKHZhcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHZhcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhIHByb3BlcnR5IG9uICJ0aGlzIiwgbGlrZSB0aGlzLnggaXMgdHJhbnNmb3JtZWQgdG8gYQorICAgICAqIGRpcmVjdCBmaWVsZCBhY2Nlc3MsIHNvIHdlIG5lZWQgdG8gY2hlY2sgdGhlCisgICAgICogc3RhdGljIGNvbnRleHQgaGVyZQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjaGVja1Byb3BlcnR5T25FeHBsaWNpdFRoaXMoUHJvcGVydHlFeHByZXNzaW9uIHBlKSB7CisgICAgICAgIGlmICghY3VycmVudFNjb3BlLmlzSW5TdGF0aWNDb250ZXh0KCkpIHJldHVybjsKKyAgICAgICAgRXhwcmVzc2lvbiBvYmplY3QgPSBwZS5nZXRPYmplY3RFeHByZXNzaW9uKCk7CisgICAgICAgIGlmICghKG9iamVjdCBpbnN0YW5jZW9mIFZhcmlhYmxlRXhwcmVzc2lvbikpIHJldHVybjsKKyAgICAgICAgVmFyaWFibGVFeHByZXNzaW9uIHZlID0gKFZhcmlhYmxlRXhwcmVzc2lvbikgb2JqZWN0OworICAgICAgICBpZiAoIXZlLmdldE5hbWUoKS5lcXVhbHMoInRoaXMiKSkgcmV0dXJuOworICAgICAgICBTdHJpbmcgbmFtZSA9IHBlLmdldFByb3BlcnR5QXNTdHJpbmcoKTsKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgcmV0dXJuOworICAgICAgICBWYXJpYWJsZSBtZW1iZXIgPSBmaW5kQ2xhc3NNZW1iZXIoY3VycmVudENsYXNzLCBuYW1lKTsKKyAgICAgICAgaWYgKG1lbWJlciA9PSBudWxsKSByZXR1cm47CisgICAgICAgIGNoZWNrVmFyaWFibGVDb250ZXh0QWNjZXNzKG1lbWJlciwgcGUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja1ZhcmlhYmxlQ29udGV4dEFjY2VzcyhWYXJpYWJsZSB2LCBFeHByZXNzaW9uIGV4cHIpIHsKKyAgICAgICAgaWYgKGluUHJvcGVydHlFeHByZXNzaW9uIHx8IHYuaXNJblN0YXRpY0NvbnRleHQoKSB8fCAhY3VycmVudFNjb3BlLmlzSW5TdGF0aWNDb250ZXh0KCkpIHJldHVybjsKKworICAgICAgICBTdHJpbmcgbXNnID0gdi5nZXROYW1lKCkgKworICAgICAgICAgICAgICAgICIgaXMgZGVjbGFyZWQgaW4gYSBkeW5hbWljIGNvbnRleHQsIGJ1dCB5b3UgdHJpZWQgdG8iICsKKyAgICAgICAgICAgICAgICAiIGFjY2VzcyBpdCBmcm9tIGEgc3RhdGljIGNvbnRleHQuIjsKKyAgICAgICAgYWRkRXJyb3IobXNnLCBleHByKTsKKworICAgICAgICAvLyBkZWNsYXJlIGEgc3RhdGljIHZhcmlhYmxlIHRvIGJlIGFibGUgdG8gY29udGludWUgdGhlIGNoZWNrCisgICAgICAgIER5bmFtaWNWYXJpYWJsZSB2MiA9IG5ldyBEeW5hbWljVmFyaWFibGUodi5nZXROYW1lKCksIGN1cnJlbnRTY29wZS5pc0luU3RhdGljQ29udGV4dCgpKTsKKyAgICAgICAgY3VycmVudFNjb3BlLnB1dERlY2xhcmVkVmFyaWFibGUodjIpOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIGNvZGUgdmlzaXQgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgcHVibGljIHZvaWQgdmlzaXRCbG9ja1N0YXRlbWVudChCbG9ja1N0YXRlbWVudCBibG9jaykgeworICAgICAgICBwdXNoU3RhdGUoKTsKKyAgICAgICAgYmxvY2suc2V0VmFyaWFibGVTY29wZShjdXJyZW50U2NvcGUpOworICAgICAgICBzdXBlci52aXNpdEJsb2NrU3RhdGVtZW50KGJsb2NrKTsKKyAgICAgICAgcG9wU3RhdGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEZvckxvb3AoRm9yU3RhdGVtZW50IGZvckxvb3ApIHsKKyAgICAgICAgcHVzaFN0YXRlKCk7CisgICAgICAgIGZvckxvb3Auc2V0VmFyaWFibGVTY29wZShjdXJyZW50U2NvcGUpOworICAgICAgICBQYXJhbWV0ZXIgcCA9IChQYXJhbWV0ZXIpIGZvckxvb3AuZ2V0VmFyaWFibGUoKTsKKyAgICAgICAgcC5zZXRJblN0YXRpY0NvbnRleHQoY3VycmVudFNjb3BlLmlzSW5TdGF0aWNDb250ZXh0KCkpOworICAgICAgICBpZiAocCAhPSBGb3JTdGF0ZW1lbnQuRk9SX0xPT1BfRFVNTVkpIGRlY2xhcmUocCwgZm9yTG9vcCk7CisgICAgICAgIHN1cGVyLnZpc2l0Rm9yTG9vcChmb3JMb29wKTsKKyAgICAgICAgcG9wU3RhdGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdERlY2xhcmF0aW9uRXhwcmVzc2lvbihEZWNsYXJhdGlvbkV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgICAgICAvLyB2aXNpdCByaWdodCBzaWRlIGZpcnN0IHRvIGF2b2lkIHRoZSB1c2FnZSBvZiBhIAorICAgICAgICAvLyB2YXJpYWJsZSBiZWZvcmUgaXRzIGRlY2xhcmF0aW9uCisgICAgICAgIGV4cHJlc3Npb24uZ2V0UmlnaHRFeHByZXNzaW9uKCkudmlzaXQodGhpcyk7CisgICAgICAgIC8vIG5vIG5lZWQgdG8gdmlzaXQgbGVmdCBzaWRlLCBqdXN0IGdldCB0aGUgdmFyaWFibGUgbmFtZQorICAgICAgICBWYXJpYWJsZUV4cHJlc3Npb24gdmV4ID0gZXhwcmVzc2lvbi5nZXRWYXJpYWJsZUV4cHJlc3Npb24oKTsKKyAgICAgICAgdmV4LnNldEluU3RhdGljQ29udGV4dChjdXJyZW50U2NvcGUuaXNJblN0YXRpY0NvbnRleHQoKSk7CisgICAgICAgIGRlY2xhcmUodmV4KTsKKyAgICAgICAgdmV4LnNldEFjY2Vzc2VkVmFyaWFibGUodmV4KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFZhcmlhYmxlRXhwcmVzc2lvbihWYXJpYWJsZUV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgICAgICBTdHJpbmcgbmFtZSA9IGV4cHJlc3Npb24uZ2V0TmFtZSgpOworICAgICAgICBWYXJpYWJsZSB2ID0gY2hlY2tWYXJpYWJsZU5hbWVGb3JEZWNsYXJhdGlvbihuYW1lLCBleHByZXNzaW9uKTsKKyAgICAgICAgaWYgKHYgPT0gbnVsbCkgcmV0dXJuOworICAgICAgICBleHByZXNzaW9uLnNldEFjY2Vzc2VkVmFyaWFibGUodik7CisgICAgICAgIGNoZWNrVmFyaWFibGVDb250ZXh0QWNjZXNzKHYsIGV4cHJlc3Npb24pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0UHJvcGVydHlFeHByZXNzaW9uKFByb3BlcnR5RXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisgICAgICAgIGJvb2xlYW4gaXBlID0gaW5Qcm9wZXJ0eUV4cHJlc3Npb247CisgICAgICAgIGluUHJvcGVydHlFeHByZXNzaW9uID0gdHJ1ZTsKKyAgICAgICAgZXhwcmVzc2lvbi5nZXRPYmplY3RFeHByZXNzaW9uKCkudmlzaXQodGhpcyk7CisgICAgICAgIGluUHJvcGVydHlFeHByZXNzaW9uID0gZmFsc2U7CisgICAgICAgIGV4cHJlc3Npb24uZ2V0UHJvcGVydHkoKS52aXNpdCh0aGlzKTsKKyAgICAgICAgY2hlY2tQcm9wZXJ0eU9uRXhwbGljaXRUaGlzKGV4cHJlc3Npb24pOworICAgICAgICBpblByb3BlcnR5RXhwcmVzc2lvbiA9IGlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdENsb3N1cmVFeHByZXNzaW9uKENsb3N1cmVFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKyAgICAgICAgcHVzaFN0YXRlKCk7CisKKyAgICAgICAgaW5DbG9zdXJlID0gdHJ1ZTsKKyAgICAgICAgLy8gYXMgcmVzdWx0IG9mIHRoZSBQYXJpcyBtZWV0aW5nIENsb3N1cmUgcmVzb2x2ZXMKKyAgICAgICAgLy8gYWx3YXlzIGR5bmFtaWNhbGx5CisgICAgICAgIGN1cnJlbnRTY29wZS5zZXREeW5hbWljUmVzb2x2aW5nKHRydWUpOworCisgICAgICAgIGV4cHJlc3Npb24uc2V0VmFyaWFibGVTY29wZShjdXJyZW50U2NvcGUpOworCisgICAgICAgIGlmIChleHByZXNzaW9uLmlzUGFyYW1ldGVyU3BlY2lmaWVkKCkpIHsKKyAgICAgICAgICAgIFBhcmFtZXRlcltdIHBhcmFtZXRlcnMgPSBleHByZXNzaW9uLmdldFBhcmFtZXRlcnMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVycy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIHBhcmFtZXRlcnNbaV0uc2V0SW5TdGF0aWNDb250ZXh0KGN1cnJlbnRTY29wZS5pc0luU3RhdGljQ29udGV4dCgpKTsKKyAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyc1tpXS5oYXNJbml0aWFsRXhwcmVzc2lvbigpKSB7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnNbaV0uZ2V0SW5pdGlhbEV4cHJlc3Npb24oKS52aXNpdCh0aGlzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVjbGFyZShwYXJhbWV0ZXJzW2ldLCBleHByZXNzaW9uKTsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZXhwcmVzc2lvbi5nZXRQYXJhbWV0ZXJzKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgRHluYW1pY1ZhcmlhYmxlIHZhciA9IG5ldyBEeW5hbWljVmFyaWFibGUoIml0IiwgY3VycmVudFNjb3BlLmlzSW5TdGF0aWNDb250ZXh0KCkpOworICAgICAgICAgICAgY3VycmVudFNjb3BlLnB1dERlY2xhcmVkVmFyaWFibGUodmFyKTsKKyAgICAgICAgfQorCisgICAgICAgIHN1cGVyLnZpc2l0Q2xvc3VyZUV4cHJlc3Npb24oZXhwcmVzc2lvbik7CisgICAgICAgIHBvcFN0YXRlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRDYXRjaFN0YXRlbWVudChDYXRjaFN0YXRlbWVudCBzdGF0ZW1lbnQpIHsKKyAgICAgICAgcHVzaFN0YXRlKCk7CisgICAgICAgIFBhcmFtZXRlciBwID0gKFBhcmFtZXRlcikgc3RhdGVtZW50LmdldFZhcmlhYmxlKCk7CisgICAgICAgIHAuc2V0SW5TdGF0aWNDb250ZXh0KGN1cnJlbnRTY29wZS5pc0luU3RhdGljQ29udGV4dCgpKTsKKyAgICAgICAgZGVjbGFyZShwLCBzdGF0ZW1lbnQpOworICAgICAgICBzdXBlci52aXNpdENhdGNoU3RhdGVtZW50KHN0YXRlbWVudCk7CisgICAgICAgIHBvcFN0YXRlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRGaWVsZEV4cHJlc3Npb24oRmllbGRFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBleHByZXNzaW9uLmdldEZpZWxkTmFtZSgpOworICAgICAgICAvL1RPRE86IGNoYW5nZSB0aGF0IHRvIGdldCB0aGUgY29ycmVjdCBzY29wZQorICAgICAgICBWYXJpYWJsZSB2ID0gY2hlY2tWYXJpYWJsZU5hbWVGb3JEZWNsYXJhdGlvbihuYW1lLCBleHByZXNzaW9uKTsKKyAgICAgICAgY2hlY2tWYXJpYWJsZUNvbnRleHRBY2Nlc3ModiwgZXhwcmVzc2lvbik7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gY2xhc3MgdmlzaXQgIAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgcHVibGljIHZvaWQgdmlzaXRDbGFzcyhDbGFzc05vZGUgbm9kZSkgeworICAgICAgICBwdXNoU3RhdGUoKTsKKworICAgICAgICBjdXJyZW50Q2xhc3MgPSBub2RlOworICAgICAgICBib29sZWFuIGR5bmFtaWNNb2RlID0gbm9kZS5pc1NjcmlwdCgpOworICAgICAgICBjdXJyZW50U2NvcGUuc2V0RHluYW1pY1Jlc29sdmluZyhkeW5hbWljTW9kZSk7CisgICAgICAgIGN1cnJlbnRTY29wZS5zZXRDbGFzc1Njb3BlKG5vZGUpOworCisgICAgICAgIHN1cGVyLnZpc2l0Q2xhc3Mobm9kZSk7CisgICAgICAgIHBvcFN0YXRlKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgdmlzaXRDb25zdHJ1Y3Rvck9yTWV0aG9kKE1ldGhvZE5vZGUgbm9kZSwgYm9vbGVhbiBpc0NvbnN0cnVjdG9yKSB7CisgICAgICAgIHB1c2hTdGF0ZShub2RlLmlzU3RhdGljKCkpOworCisgICAgICAgIG5vZGUuc2V0VmFyaWFibGVTY29wZShjdXJyZW50U2NvcGUpOworCisgICAgICAgIC8vIEdST09WWS0yMTU2CisgICAgICAgIFBhcmFtZXRlcltdIHBhcmFtZXRlcnMgPSBub2RlLmdldFBhcmFtZXRlcnMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gcGFyYW1ldGVyc1tpXTsKKyAgICAgICAgICAgIHZpc2l0QW5ub3RhdGlvbnMocGFyYW1ldGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIGRlY2xhcmUobm9kZS5nZXRQYXJhbWV0ZXJzKCksIG5vZGUpOworCisgICAgICAgIHN1cGVyLnZpc2l0Q29uc3RydWN0b3JPck1ldGhvZChub2RlLCBpc0NvbnN0cnVjdG9yKTsKKyAgICAgICAgcG9wU3RhdGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdE1ldGhvZENhbGxFeHByZXNzaW9uKE1ldGhvZENhbGxFeHByZXNzaW9uIGNhbGwpIHsKKyAgICAgICAgaWYgKGNhbGwuaXNJbXBsaWNpdFRoaXMoKSAmJiBjYWxsLmdldE1ldGhvZCgpIGluc3RhbmNlb2YgQ29uc3RhbnRFeHByZXNzaW9uKSB7CisgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSAoKENvbnN0YW50RXhwcmVzc2lvbikgY2FsbC5nZXRNZXRob2QoKSkuZ2V0VGV4dCgpOworICAgICAgICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEdyb292eUJ1Z0Vycm9yKCJ0cmllZCB0byBtYWtlIGEgbWV0aG9kIGNhbGwgd2l0aCBhIG5vbi1TdHJpbmcgY29uc3RhbnQgbWV0aG9kIG5hbWUuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSA9IChTdHJpbmcpIHZhbHVlOworICAgICAgICAgICAgVmFyaWFibGUgdiA9IGNoZWNrVmFyaWFibGVOYW1lRm9yRGVjbGFyYXRpb24obWV0aG9kTmFtZSwgY2FsbCk7CisgICAgICAgICAgICBpZiAodiAhPSBudWxsICYmICEodiBpbnN0YW5jZW9mIER5bmFtaWNWYXJpYWJsZSkpIHsKKyAgICAgICAgICAgICAgICBjaGVja1ZhcmlhYmxlQ29udGV4dEFjY2Vzcyh2LCBjYWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdXBlci52aXNpdE1ldGhvZENhbGxFeHByZXNzaW9uKGNhbGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0Q29uc3RydWN0b3JDYWxsRXhwcmVzc2lvbihDb25zdHJ1Y3RvckNhbGxFeHByZXNzaW9uIGNhbGwpIHsKKyAgICAgICAgaXNTcGVjaWFsQ29uc3RydWN0b3JDYWxsID0gY2FsbC5pc1NwZWNpYWxDYWxsKCk7CisgICAgICAgIHN1cGVyLnZpc2l0Q29uc3RydWN0b3JDYWxsRXhwcmVzc2lvbihjYWxsKTsKKyAgICAgICAgaXNTcGVjaWFsQ29uc3RydWN0b3JDYWxsID0gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRQcm9wZXJ0eShQcm9wZXJ0eU5vZGUgbm9kZSkgeworICAgICAgICBwdXNoU3RhdGUobm9kZS5pc1N0YXRpYygpKTsKKyAgICAgICAgc3VwZXIudmlzaXRQcm9wZXJ0eShub2RlKTsKKyAgICAgICAgcG9wU3RhdGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEZpZWxkKEZpZWxkTm9kZSBub2RlKSB7CisgICAgICAgIHB1c2hTdGF0ZShub2RlLmlzU3RhdGljKCkpOworICAgICAgICBzdXBlci52aXNpdEZpZWxkKG5vZGUpOworICAgICAgICBwb3BTdGF0ZSgpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vVmVyaWZpZXIuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL1ZlcmlmaWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEzZmUyNQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL1ZlcmlmaWVyLmphdmEKQEAgLTAsMCArMSw4MjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuOworCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0OworaW1wb3J0IGdyb292eS5sYW5nLk1ldGFDbGFzczsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC4qOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHIuKjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5zdG10Lio7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLlNjcmlwdEJ5dGVjb2RlQWRhcHRlcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5SdW50aW1lUGFyc2VyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LlRva2VuOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LlR5cGVzOworaW1wb3J0IG9yZy5vYmplY3R3ZWIuYXNtLk1ldGhvZFZpc2l0b3I7CitpbXBvcnQgb3JnLm9iamVjdHdlYi5hc20uT3Bjb2RlczsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOworaW1wb3J0IGphdmEudXRpbC4qOworCisvKioKKyAqIFZlcmlmaWVzIHRoZSBBU1Qgbm9kZSBhbmQgYWRkcyBhbnkgZGVmYXVsdGVkIEFTVCBjb2RlIGJlZm9yZQorICogYnl0ZWNvZGUgZ2VuZXJhdGlvbiBvY2N1cnMuCisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBWZXJpZmllciBpbXBsZW1lbnRzIEdyb292eUNsYXNzVmlzaXRvciwgT3Bjb2RlcyB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfX1RJTUVTVEFNUCA9ICJfX3RpbWVTdGFtcCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX19USU1FU1RBTVBfXyA9ICJfX3RpbWVTdGFtcF9fMjM5X25ldmVySGFwcGVuIjsKKwlwcml2YXRlIENsYXNzTm9kZSBjbGFzc05vZGU7CisgICAgcHJpdmF0ZSBNZXRob2ROb2RlIG1ldGhvZE5vZGU7CisKKyAgICBwdWJsaWMgQ2xhc3NOb2RlIGdldENsYXNzTm9kZSgpIHsKKyAgICAgICAgcmV0dXJuIGNsYXNzTm9kZTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWV0aG9kTm9kZSBnZXRNZXRob2ROb2RlKCkgeworICAgICAgICByZXR1cm4gbWV0aG9kTm9kZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGQgY29kZSB0byBpbXBsZW1lbnQgR3Jvb3Z5T2JqZWN0CisgICAgICogQHBhcmFtIG5vZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB2aXNpdENsYXNzKENsYXNzTm9kZSBub2RlKSB7CisgICAgICAgIHRoaXMuY2xhc3NOb2RlID0gbm9kZTsKKyAgICAgICAgCisgICAgICAgIGlmICgoY2xhc3NOb2RlLmdldE1vZGlmaWVycygpICYgT3Bjb2Rlcy5BQ0NfSU5URVJGQUNFKSA+MCkgeworICAgICAgICAgICAgLy9pbnRlcmZhY2VzIGhhdmUgbm8gY29uc3RydWNvdHJzLCBidXQgdGhpcyBjb2RlIGV4cGVjdHMgb25lLCAKKyAgICAgICAgICAgIC8vc28gY3JlYXRlIGEgZHVtbXkgYW5kIGRvbid0IGFkZCBpdCB0byB0aGUgY2xhc3Mgbm9kZQorICAgICAgICAgICAgQ29uc3RydWN0b3JOb2RlIGR1bW15ID0gbmV3IENvbnN0cnVjdG9yTm9kZSgwLG51bGwpOworICAgICAgICAgICAgYWRkSW5pdGlhbGl6YXRpb24obm9kZSwgZHVtbXkpOworICAgICAgICAgICAgbm9kZS52aXNpdENvbnRlbnRzKHRoaXMpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBhZGREZWZhdWx0UGFyYW1ldGVyTWV0aG9kcyhub2RlKTsKKyAgICAgICAgYWRkRGVmYXVsdFBhcmFtZXRlckNvbnN0cnVjdG9ycyhub2RlKTsKKworICAgICAgICBpZiAoIW5vZGUuaXNEZXJpdmVkRnJvbUdyb292eU9iamVjdCgpKSB7CisgICAgICAgICAgICBub2RlLmFkZEludGVyZmFjZShDbGFzc0hlbHBlci5tYWtlKEdyb292eU9iamVjdC5jbGFzcykpOworCisgICAgICAgICAgICAvLyBsZXRzIGFkZCBhIG5ldyBmaWVsZCBmb3IgdGhlIG1ldGFjbGFzcworICAgICAgICAgICAgU3RhdGljTWV0aG9kQ2FsbEV4cHJlc3Npb24gaW5pdE1ldGFDbGFzc0NhbGwgPQorICAgICAgICAgICAgICAgIG5ldyBTdGF0aWNNZXRob2RDYWxsRXhwcmVzc2lvbigKKyAgICAgICAgICAgICAgICAgICAgQ2xhc3NIZWxwZXIubWFrZShTY3JpcHRCeXRlY29kZUFkYXB0ZXIuY2xhc3MpLAorICAgICAgICAgICAgICAgICAgICAiaW5pdE1ldGFDbGFzcyIsCisgICAgICAgICAgICAgICAgICAgIFZhcmlhYmxlRXhwcmVzc2lvbi5USElTX0VYUFJFU1NJT04pOworCisgICAgICAgICAgICBQcm9wZXJ0eU5vZGUgbWV0YUNsYXNzUHJvcGVydHkgPQorICAgICAgICAgICAgICAgIG5vZGUuYWRkUHJvcGVydHkoIm1ldGFDbGFzcyIsIEFDQ19QVUJMSUMsIENsYXNzSGVscGVyLm1ha2UoTWV0YUNsYXNzLmNsYXNzKSwgaW5pdE1ldGFDbGFzc0NhbGwsIG51bGwsIG51bGwpOworICAgICAgICAgICAgbWV0YUNsYXNzUHJvcGVydHkuc2V0U3ludGhldGljKHRydWUpOworICAgICAgICAgICAgRmllbGROb2RlIG1ldGFDbGFzc0ZpZWxkID0gbWV0YUNsYXNzUHJvcGVydHkuZ2V0RmllbGQoKTsKKyAgICAgICAgICAgIG1ldGFDbGFzc0ZpZWxkLnNldE1vZGlmaWVycyhtZXRhQ2xhc3NGaWVsZC5nZXRNb2RpZmllcnMoKSB8IEFDQ19UUkFOU0lFTlQpOworCisgICAgICAgICAgICBGaWVsZEV4cHJlc3Npb24gbWV0YUNsYXNzVmFyID0gbmV3IEZpZWxkRXhwcmVzc2lvbihtZXRhQ2xhc3NGaWVsZCk7CisgICAgICAgICAgICBJZlN0YXRlbWVudCBpbml0TWV0YUNsYXNzRmllbGQgPQorICAgICAgICAgICAgICAgIG5ldyBJZlN0YXRlbWVudCgKKyAgICAgICAgICAgICAgICAgICAgbmV3IEJvb2xlYW5FeHByZXNzaW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJpbmFyeUV4cHJlc3Npb24obWV0YUNsYXNzVmFyLCBUb2tlbi5uZXdTeW1ib2woIFR5cGVzLkNPTVBBUkVfRVFVQUwsIC0xLCAtMSksIENvbnN0YW50RXhwcmVzc2lvbi5OVUxMKSksCisgICAgICAgICAgICAgICAgICAgIG5ldyBFeHByZXNzaW9uU3RhdGVtZW50KG5ldyBCaW5hcnlFeHByZXNzaW9uKG1ldGFDbGFzc1ZhciwgVG9rZW4ubmV3U3ltYm9sKCBUeXBlcy5FUVVBTCwgLTEsIC0xKSwgaW5pdE1ldGFDbGFzc0NhbGwpKSwKKyAgICAgICAgICAgICAgICAgICAgRW1wdHlTdGF0ZW1lbnQuSU5TVEFOQ0UpOworCisgICAgICAgICAgICBub2RlLmFkZFN5bnRoZXRpY01ldGhvZCgKKyAgICAgICAgICAgICAgICAiZ2V0TWV0YUNsYXNzIiwKKyAgICAgICAgICAgICAgICBBQ0NfUFVCTElDLAorICAgICAgICAgICAgICAgIENsYXNzSGVscGVyLm1ha2UoTWV0YUNsYXNzLmNsYXNzKSwKKyAgICAgICAgICAgICAgICBQYXJhbWV0ZXIuRU1QVFlfQVJSQVksCisgICAgICAgICAgICAgICAgQ2xhc3NOb2RlLkVNUFRZX0FSUkFZLAorICAgICAgICAgICAgICAgIG5ldyBCbG9ja1N0YXRlbWVudChuZXcgU3RhdGVtZW50W10geyBpbml0TWV0YUNsYXNzRmllbGQsIG5ldyBSZXR1cm5TdGF0ZW1lbnQobWV0YUNsYXNzVmFyKX0sIG5ldyBWYXJpYWJsZVNjb3BlKCkpCisgICAgICAgICAgICApOworCisgICAgICAgICAgICAvLyBAdG9kbyB3ZSBzaG91bGQgY2hlY2sgaWYgdGhlIGJhc2UgY2xhc3MgaW1wbGVtZW50cyB0aGUgaW52b2tlTWV0aG9kIG1ldGhvZAorCisgICAgICAgICAgICAvLyBsZXRzIGFkZCB0aGUgaW52b2tlTWV0aG9kIGltcGxlbWVudGF0aW9uCisgICAgICAgICAgICBDbGFzc05vZGUgc3VwZXJDbGFzcyA9IG5vZGUuZ2V0U3VwZXJDbGFzcygpOworICAgICAgICAgICAgYm9vbGVhbiBhZGREZWxlZ2F0ZU9iamVjdCA9CisgICAgICAgICAgICAgICAgKG5vZGUgaW5zdGFuY2VvZiBJbm5lckNsYXNzTm9kZSAmJiBzdXBlckNsYXNzLmVxdWFscyhDbGFzc0hlbHBlci5DTE9TVVJFX1RZUEUpKQorICAgICAgICAgICAgICAgICAgICB8fCBzdXBlckNsYXNzLmVxdWFscyhDbGFzc0hlbHBlci5HU1RSSU5HX1RZUEUpOworCisgICAgICAgICAgICAvLyBkb24ndCBkbyBhbnl0aGluZyBhcyB0aGUgYmFzZSBjbGFzcyBpbXBsZW1lbnRzIHRoZSBpbnZva2VNZXRob2QKKyAgICAgICAgICAgIGlmICghYWRkRGVsZWdhdGVPYmplY3QpIHsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBWYXJpYWJsZUV4cHJlc3Npb24gdk1ldGhvZHMgPSBuZXcgVmFyaWFibGVFeHByZXNzaW9uKCJtZXRob2QiKTsKKyAgICAgICAgICAgICAgICBWYXJpYWJsZUV4cHJlc3Npb24gdkFyZ3VtZW50cyA9IG5ldyBWYXJpYWJsZUV4cHJlc3Npb24oImFyZ3VtZW50cyIpOworICAgICAgICAgICAgICAgIFZhcmlhYmxlU2NvcGUgYmxvY2tTY29wZSA9IG5ldyBWYXJpYWJsZVNjb3BlKCk7CisgICAgICAgICAgICAgICAgYmxvY2tTY29wZS5wdXRSZWZlcmVuY2VkTG9jYWxWYXJpYWJsZSh2TWV0aG9kcyk7CisgICAgICAgICAgICAgICAgYmxvY2tTY29wZS5wdXRSZWZlcmVuY2VkTG9jYWxWYXJpYWJsZSh2QXJndW1lbnRzKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBub2RlLmFkZFN5bnRoZXRpY01ldGhvZCgKKyAgICAgICAgICAgICAgICAgICAgImludm9rZU1ldGhvZCIsCisgICAgICAgICAgICAgICAgICAgIEFDQ19QVUJMSUMsCisgICAgICAgICAgICAgICAgICAgIENsYXNzSGVscGVyLk9CSkVDVF9UWVBFLAorICAgICAgICAgICAgICAgICAgICBuZXcgUGFyYW1ldGVyW10geworICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFBhcmFtZXRlcihDbGFzc0hlbHBlci5TVFJJTkdfVFlQRSwgIm1ldGhvZCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFBhcmFtZXRlcihDbGFzc0hlbHBlci5PQkpFQ1RfVFlQRSwgImFyZ3VtZW50cyIpCisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIENsYXNzTm9kZS5FTVBUWV9BUlJBWSwgICAgCisgICAgICAgICAgICAgICAgICAgIG5ldyBCbG9ja1N0YXRlbWVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdGF0ZW1lbnRbXSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdE1ldGFDbGFzc0ZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSZXR1cm5TdGF0ZW1lbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBNZXRob2RDYWxsRXhwcmVzc2lvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFDbGFzc1ZhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZva2VNZXRob2QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFyZ3VtZW50TGlzdEV4cHJlc3Npb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhcmlhYmxlRXhwcmVzc2lvbi5USElTX0VYUFJFU1NJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZNZXRob2RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2QXJndW1lbnRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tTY29wZQorICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAKKworICAgICAgICAgICAgICAgIGlmICghbm9kZS5pc1NjcmlwdCgpKSB7CisgICAgICAgICAgICAgICAgICAgIG5vZGUuYWRkU3ludGhldGljTWV0aG9kKAorICAgICAgICAgICAgICAgICAgICAgICAgImdldFByb3BlcnR5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFDQ19QVUJMSUMsCisgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0hlbHBlci5PQkpFQ1RfVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQYXJhbWV0ZXJbXSB7IG5ldyBQYXJhbWV0ZXIoQ2xhc3NIZWxwZXIuU1RSSU5HX1RZUEUsICJwcm9wZXJ0eSIpfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzTm9kZS5FTVBUWV9BUlJBWSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCbG9ja1N0YXRlbWVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RhdGVtZW50W10geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0TWV0YUNsYXNzRmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSZXR1cm5TdGF0ZW1lbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTWV0aG9kQ2FsbEV4cHJlc3Npb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YUNsYXNzVmFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZXRQcm9wZXJ0eSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFyZ3VtZW50TGlzdEV4cHJlc3Npb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYXJpYWJsZUV4cHJlc3Npb24uVEhJU19FWFBSRVNTSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFZhcmlhYmxlRXhwcmVzc2lvbigicHJvcGVydHkiKSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFZhcmlhYmxlU2NvcGUoKQorICAgICAgICAgICAgICAgICAgICAgICAgKSk7CisgICAgICAgICAgICAgICAgICAgIFZhcmlhYmxlRXhwcmVzc2lvbiB2UHJvcCA9IG5ldyBWYXJpYWJsZUV4cHJlc3Npb24oInByb3BlcnR5Iik7CisgICAgICAgICAgICAgICAgICAgIFZhcmlhYmxlRXhwcmVzc2lvbiB2VmFsdWUgPSBuZXcgVmFyaWFibGVFeHByZXNzaW9uKCJ2YWx1ZSIpOworICAgICAgICAgICAgICAgICAgICBibG9ja1Njb3BlID0gbmV3IFZhcmlhYmxlU2NvcGUoKTsKKyAgICAgICAgICAgICAgICAgICAgYmxvY2tTY29wZS5wdXRSZWZlcmVuY2VkTG9jYWxWYXJpYWJsZSh2UHJvcCk7CisgICAgICAgICAgICAgICAgICAgIGJsb2NrU2NvcGUucHV0UmVmZXJlbmNlZExvY2FsVmFyaWFibGUodlZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIG5vZGUuYWRkU3ludGhldGljTWV0aG9kKAorICAgICAgICAgICAgICAgICAgICAgICAgInNldFByb3BlcnR5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFDQ19QVUJMSUMsCisgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0hlbHBlci5WT0lEX1RZUEUsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUGFyYW1ldGVyW10geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQYXJhbWV0ZXIoQ2xhc3NIZWxwZXIuU1RSSU5HX1RZUEUsICJwcm9wZXJ0eSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQYXJhbWV0ZXIoQ2xhc3NIZWxwZXIuT0JKRUNUX1RZUEUsICJ2YWx1ZSIpCisgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NOb2RlLkVNUFRZX0FSUkFZLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJsb2NrU3RhdGVtZW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdGF0ZW1lbnRbXSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRNZXRhQ2xhc3NGaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEV4cHJlc3Npb25TdGF0ZW1lbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTWV0aG9kQ2FsbEV4cHJlc3Npb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YUNsYXNzVmFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRQcm9wZXJ0eSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFyZ3VtZW50TGlzdEV4cHJlc3Npb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYXJpYWJsZUV4cHJlc3Npb24uVEhJU19FWFBSRVNTSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdlByb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2VmFsdWUpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrU2NvcGUKKyAgICAgICAgICAgICAgICAgICAgKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG5vZGUuZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcnMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIENvbnN0cnVjdG9yTm9kZSBjb25zdHJ1Y3RvciA9IG5ldyBDb25zdHJ1Y3Rvck5vZGUoQUNDX1BVQkxJQywgbnVsbCk7CisgICAgICAgICAgICBjb25zdHJ1Y3Rvci5zZXRTeW50aGV0aWModHJ1ZSk7CisgICAgICAgICAgICBub2RlLmFkZENvbnN0cnVjdG9yKGNvbnN0cnVjdG9yKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKCEobm9kZSBpbnN0YW5jZW9mIElubmVyQ2xhc3NOb2RlKSkgey8vIGFkZCBhIHN0YXRpYyB0aW1lc3RhbXAgZmllbGQgdG8gdGhlIGNsYXNzCisgICAgICAgICAgICBhZGRUaW1lU3RhbXAobm9kZSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGFkZEluaXRpYWxpemF0aW9uKG5vZGUpOworICAgICAgICBjaGVja1JldHVybkluT2JqZWN0SW5pdGlhbGl6ZXIobm9kZS5nZXRPYmplY3RJbml0aWFsaXplclN0YXRlbWVudHMoKSk7CisgICAgICAgIG5vZGUuZ2V0T2JqZWN0SW5pdGlhbGl6ZXJTdGF0ZW1lbnRzKCkuY2xlYXIoKTsKKyAgICAgICAgYWRkQ292YXJpYW50TWV0aG9kcyhub2RlKTsKKyAgICAgICAgbm9kZS52aXNpdENvbnRlbnRzKHRoaXMpOworICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRUaW1lU3RhbXAoQ2xhc3NOb2RlIG5vZGUpIHsKKyAgICAgICAgRmllbGROb2RlIHRpbWVUYWdGaWVsZCA9IG5ldyBGaWVsZE5vZGUoCisgICAgICAgICAgICAgICAgVmVyaWZpZXIuX19USU1FU1RBTVAsCisgICAgICAgICAgICAgICAgTW9kaWZpZXIuUFVCTElDIHwgTW9kaWZpZXIuU1RBVElDLAorICAgICAgICAgICAgICAgIENsYXNzSGVscGVyLkxvbmdfVFlQRSwKKyAgICAgICAgICAgICAgICAvLyIiLAorICAgICAgICAgICAgICAgIG5vZGUsCisgICAgICAgICAgICAgICAgbmV3IENvbnN0YW50RXhwcmVzc2lvbihuZXcgTG9uZyhTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkpKTsKKyAgICAgICAgLy8gYWx0ZXJuYXRpdmVseSAsIEZpZWxkTm9kZSB0aW1lVGFnRmllbGQgPSBTb3VyY2VVbml0LmNyZWF0ZUZpZWxkTm9kZSgicHVibGljIHN0YXRpYyBmaW5hbCBsb25nIF9fdGltZVN0YW1wID0gIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgIkwiKTsKKyAgICAgICAgdGltZVRhZ0ZpZWxkLnNldFN5bnRoZXRpYyh0cnVlKTsKKyAgICAgICAgbm9kZS5hZGRGaWVsZCh0aW1lVGFnRmllbGQpOworCisgICAgICAgIHRpbWVUYWdGaWVsZCA9IG5ldyBGaWVsZE5vZGUoCisgICAgICAgICAgICAgICAgVmVyaWZpZXIuX19USU1FU1RBTVBfXyArIFN0cmluZy52YWx1ZU9mKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKSwKKyAgICAgICAgICAgICAgICBNb2RpZmllci5QVUJMSUMgfCBNb2RpZmllci5TVEFUSUMsCisgICAgICAgICAgICAgICAgQ2xhc3NIZWxwZXIuTG9uZ19UWVBFLAorICAgICAgICAgICAgICAgIC8vIiIsCisgICAgICAgICAgICAgICAgbm9kZSwKKyAgICAgICAgICAgICAgICBuZXcgQ29uc3RhbnRFeHByZXNzaW9uKG5ldyBMb25nKDApKSk7CisgICAgICAgIC8vIGFsdGVybmF0aXZlbHkgLCBGaWVsZE5vZGUgdGltZVRhZ0ZpZWxkID0gU291cmNlVW5pdC5jcmVhdGVGaWVsZE5vZGUoInB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBfX3RpbWVTdGFtcCA9ICIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArICJMIik7CisgICAgICAgIHRpbWVUYWdGaWVsZC5zZXRTeW50aGV0aWModHJ1ZSk7CisgICAgICAgIG5vZGUuYWRkRmllbGQodGltZVRhZ0ZpZWxkKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tSZXR1cm5Jbk9iamVjdEluaXRpYWxpemVyKExpc3QgaW5pdCkgeworICAgICAgICBDb2RlVmlzaXRvclN1cHBvcnQgY3ZzID0gbmV3IENvZGVWaXNpdG9yU3VwcG9ydCgpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0UmV0dXJuU3RhdGVtZW50KFJldHVyblN0YXRlbWVudCBzdGF0ZW1lbnQpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZVBhcnNlckV4Y2VwdGlvbigiJ3JldHVybicgaXMgbm90IGFsbG93ZWQgaW4gb2JqZWN0IGluaXRpYWxpemVyIixzdGF0ZW1lbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gaW5pdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBTdGF0ZW1lbnQgc3RtID0gKFN0YXRlbWVudCkgaXRlcmF0b3IubmV4dCgpOworICAgICAgICAgICAgc3RtLnZpc2l0KGN2cyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdENvbnN0cnVjdG9yKENvbnN0cnVjdG9yTm9kZSBub2RlKSB7CisgICAgICAgIENvZGVWaXNpdG9yU3VwcG9ydCBjaGVja1N1cGVyID0gbmV3IENvZGVWaXNpdG9yU3VwcG9ydCgpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gZmlyc3RNZXRob2RDYWxsID0gdHJ1ZTsKKyAgICAgICAgICAgIFN0cmluZyB0eXBlPW51bGw7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdE1ldGhvZENhbGxFeHByZXNzaW9uKE1ldGhvZENhbGxFeHByZXNzaW9uIGNhbGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWZpcnN0TWV0aG9kQ2FsbCkgcmV0dXJuOworICAgICAgICAgICAgICAgIGZpcnN0TWV0aG9kQ2FsbCA9IGZhbHNlOworICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gY2FsbC5nZXRNZXRob2RBc1N0cmluZygpOworICAgICAgICAgICAgICAgIC8vIHRoZSBuYW1lIG1pZ2h0IG5vdCBiZSBudWxsIGlmIHRoZSBtZXRob2QgbmFtZSBpcyBhIEdTdHJpbmcgZm9yIGV4YW1wbGUKKyAgICAgICAgICAgICAgICBpZiAobmFtZT09bnVsbCkgcmV0dXJuOworICAgICAgICAgICAgICAgIGlmICghbmFtZS5lcXVhbHMoInN1cGVyIikgJiYgIW5hbWUuZXF1YWxzKCJ0aGlzIikpIHJldHVybjsKKyAgICAgICAgICAgICAgICB0eXBlPW5hbWU7CisgICAgICAgICAgICAgICAgY2FsbC5nZXRBcmd1bWVudHMoKS52aXNpdCh0aGlzKTsKKyAgICAgICAgICAgICAgICB0eXBlPW51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdFZhcmlhYmxlRXhwcmVzc2lvbihWYXJpYWJsZUV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgICAgICAgICAgICAgIGlmICh0eXBlPT1udWxsKSByZXR1cm47CisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBleHByZXNzaW9uLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICBpZiAoIW5hbWUuZXF1YWxzKCJ0aGlzIikgJiYgIW5hbWUuZXF1YWxzKCJzdXBlciIpKSByZXR1cm47CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVQYXJzZXJFeGNlcHRpb24oImNhbm5vdCByZWZlcmVuY2UgIituYW1lKyIgaW5zaWRlIG9mICIrdHlwZSsiKC4uLi4pIGJlZm9yZSBzdXBlcnR5cGUgY29uc3RydWN0b3IgaGFzIGJlZW4gY2FsbGVkIixleHByZXNzaW9uKTsKKyAgICAgICAgICAgIH0gICAgICAgICAgICAKKyAgICAgICAgfTsKKyAgICAgICAgU3RhdGVtZW50IHMgPSBub2RlLmdldENvZGUoKTsKKyAgICAgICAgLy90b2RvIHdoeSBjYW4gYSBzdGF0ZW1lbnQgY2FuIGJlIG51bGw/CisgICAgICAgIGlmIChzID09IG51bGwpIHJldHVybjsKKyAgICAgICAgcy52aXNpdChjaGVja1N1cGVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdE1ldGhvZChNZXRob2ROb2RlIG5vZGUpIHsKKyAgICAgICAgdGhpcy5tZXRob2ROb2RlID0gbm9kZTsKKyAgICAgICAgU3RhdGVtZW50IHN0YXRlbWVudCA9IG5vZGUuZ2V0Q29kZSgpOworICAgICAgICBpZiAoIW5vZGUuaXNWb2lkTWV0aG9kKCkpIHsKKyAgICAgICAgICAgIGlmIChzdGF0ZW1lbnQgaW5zdGFuY2VvZiBFeHByZXNzaW9uU3RhdGVtZW50KSB7CisgICAgICAgICAgICAgICAgRXhwcmVzc2lvblN0YXRlbWVudCBleHBTdG10ID0gKEV4cHJlc3Npb25TdGF0ZW1lbnQpIHN0YXRlbWVudDsKKyAgICAgICAgICAgICAgICBub2RlLnNldENvZGUobmV3IFJldHVyblN0YXRlbWVudChleHBTdG10LmdldEV4cHJlc3Npb24oKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGVtZW50IGluc3RhbmNlb2YgQmxvY2tTdGF0ZW1lbnQpIHsKKyAgICAgICAgICAgICAgICBCbG9ja1N0YXRlbWVudCBibG9jayA9IChCbG9ja1N0YXRlbWVudCkgc3RhdGVtZW50OworCisgICAgICAgICAgICAgICAgLy8gbGV0cyBjb3B5IHRoZSBsaXN0IHNvIHdlIGNyZWF0ZSBhIG5ldyBibG9jaworICAgICAgICAgICAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoYmxvY2suZ2V0U3RhdGVtZW50cygpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWxpc3QuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBpZHggPSBsaXN0LnNpemUoKSAtIDE7CisgICAgICAgICAgICAgICAgICAgIFN0YXRlbWVudCBsYXN0ID0gKFN0YXRlbWVudCkgbGlzdC5nZXQoaWR4KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3QgaW5zdGFuY2VvZiBFeHByZXNzaW9uU3RhdGVtZW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBFeHByZXNzaW9uU3RhdGVtZW50IGV4cFN0bXQgPSAoRXhwcmVzc2lvblN0YXRlbWVudCkgbGFzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3Quc2V0KGlkeCwgbmV3IFJldHVyblN0YXRlbWVudChleHBTdG10KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIShsYXN0IGluc3RhbmNlb2YgUmV0dXJuU3RhdGVtZW50KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQobmV3IFJldHVyblN0YXRlbWVudChDb25zdGFudEV4cHJlc3Npb24uTlVMTCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChuZXcgUmV0dXJuU3RhdGVtZW50KENvbnN0YW50RXhwcmVzc2lvbi5OVUxMKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbm9kZS5zZXRDb2RlKG5ldyBCbG9ja1N0YXRlbWVudChmaWx0ZXJTdGF0ZW1lbnRzKGxpc3QpLGJsb2NrLmdldFZhcmlhYmxlU2NvcGUoKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCFub2RlLmlzQWJzdHJhY3QoKSkgeworICAgICAgICAJQmxvY2tTdGF0ZW1lbnQgbmV3QmxvY2sgPSBuZXcgQmxvY2tTdGF0ZW1lbnQoKTsKKyAgICAgICAgICAgIGlmIChzdGF0ZW1lbnQgaW5zdGFuY2VvZiBCbG9ja1N0YXRlbWVudCkgeworICAgICAgICAgICAgICAgIG5ld0Jsb2NrLmFkZFN0YXRlbWVudHMoZmlsdGVyU3RhdGVtZW50cygoKEJsb2NrU3RhdGVtZW50KXN0YXRlbWVudCkuZ2V0U3RhdGVtZW50cygpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBuZXdCbG9jay5hZGRTdGF0ZW1lbnQoZmlsdGVyU3RhdGVtZW50KHN0YXRlbWVudCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmV3QmxvY2suYWRkU3RhdGVtZW50KFJldHVyblN0YXRlbWVudC5SRVRVUk5fTlVMTF9PUl9WT0lEKTsKKyAgICAgICAgICAgIG5vZGUuc2V0Q29kZShuZXdCbG9jayk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5vZGUuZ2V0TmFtZSgpLmVxdWFscygibWFpbiIpICYmIG5vZGUuaXNTdGF0aWMoKSkgeworICAgICAgICAgICAgUGFyYW1ldGVyW10gcGFyYW1zID0gbm9kZS5nZXRQYXJhbWV0ZXJzKCk7CisgICAgICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCA9PSAxKSB7CisgICAgICAgICAgICAgICAgUGFyYW1ldGVyIHBhcmFtID0gcGFyYW1zWzBdOworICAgICAgICAgICAgICAgIGlmIChwYXJhbS5nZXRUeXBlKCkgPT0gbnVsbCB8fCBwYXJhbS5nZXRUeXBlKCk9PUNsYXNzSGVscGVyLk9CSkVDVF9UWVBFKSB7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtLnNldFR5cGUoQ2xhc3NIZWxwZXIuU1RSSU5HX1RZUEUubWFrZUFycmF5KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdGF0ZW1lbnQgPSBub2RlLmdldENvZGUoKTsKKyAgICAgICAgaWYgKHN0YXRlbWVudCE9bnVsbCkgc3RhdGVtZW50LnZpc2l0KG5ldyBWZXJpZmllckNvZGVWaXNpdG9yKHRoaXMpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEZpZWxkKEZpZWxkTm9kZSBub2RlKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRQcm9wZXJ0eShQcm9wZXJ0eU5vZGUgbm9kZSkgeworICAgICAgICBTdHJpbmcgbmFtZSA9IG5vZGUuZ2V0TmFtZSgpOworICAgICAgICBGaWVsZE5vZGUgZmllbGQgPSBub2RlLmdldEZpZWxkKCk7CisKKyAgICAgICAgU3RyaW5nIGdldHRlck5hbWUgPSAiZ2V0IiArIGNhcGl0YWxpemUobmFtZSk7CisgICAgICAgIFN0cmluZyBzZXR0ZXJOYW1lID0gInNldCIgKyBjYXBpdGFsaXplKG5hbWUpOworCisgICAgICAgIFN0YXRlbWVudCBnZXR0ZXJCbG9jayA9IG5vZGUuZ2V0R2V0dGVyQmxvY2soKTsKKyAgICAgICAgaWYgKGdldHRlckJsb2NrID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmICghbm9kZS5pc1ByaXZhdGUoKSAmJiBjbGFzc05vZGUuZ2V0R2V0dGVyTWV0aG9kKGdldHRlck5hbWUpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBnZXR0ZXJCbG9jayA9IGNyZWF0ZUdldHRlckJsb2NrKG5vZGUsIGZpZWxkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBTdGF0ZW1lbnQgc2V0dGVyQmxvY2sgPSBub2RlLmdldFNldHRlckJsb2NrKCk7CisgICAgICAgIGlmIChzZXR0ZXJCbG9jayA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAoIW5vZGUuaXNQcml2YXRlKCkgJiYgKG5vZGUuZ2V0TW9kaWZpZXJzKCkmQUNDX0ZJTkFMKT09MCAmJiBjbGFzc05vZGUuZ2V0U2V0dGVyTWV0aG9kKHNldHRlck5hbWUpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXR0ZXJCbG9jayA9IGNyZWF0ZVNldHRlckJsb2NrKG5vZGUsIGZpZWxkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChnZXR0ZXJCbG9jayAhPSBudWxsKSB7CisgICAgICAgICAgICBNZXRob2ROb2RlIGdldHRlciA9CisgICAgICAgICAgICAgICAgbmV3IE1ldGhvZE5vZGUoZ2V0dGVyTmFtZSwgbm9kZS5nZXRNb2RpZmllcnMoKSwgbm9kZS5nZXRUeXBlKCksIFBhcmFtZXRlci5FTVBUWV9BUlJBWSwgQ2xhc3NOb2RlLkVNUFRZX0FSUkFZLCBnZXR0ZXJCbG9jayk7CisgICAgICAgICAgICBnZXR0ZXIuc2V0U3ludGhldGljKHRydWUpOworICAgICAgICAgICAgY2xhc3NOb2RlLmFkZE1ldGhvZChnZXR0ZXIpOworICAgICAgICAgICAgdmlzaXRNZXRob2QoZ2V0dGVyKTsKKworICAgICAgICAgICAgaWYgKENsYXNzSGVscGVyLmJvb2xlYW5fVFlQRT09bm9kZS5nZXRUeXBlKCkgfHwgQ2xhc3NIZWxwZXIuQm9vbGVhbl9UWVBFPT1ub2RlLmdldFR5cGUoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBzZWNvbmRHZXR0ZXJOYW1lID0gImlzIiArIGNhcGl0YWxpemUobmFtZSk7CisgICAgICAgICAgICAgICAgTWV0aG9kTm9kZSBzZWNvbmRHZXR0ZXIgPQorICAgICAgICAgICAgICAgICAgICBuZXcgTWV0aG9kTm9kZShzZWNvbmRHZXR0ZXJOYW1lLCBub2RlLmdldE1vZGlmaWVycygpLCBub2RlLmdldFR5cGUoKSwgUGFyYW1ldGVyLkVNUFRZX0FSUkFZLCBDbGFzc05vZGUuRU1QVFlfQVJSQVksIGdldHRlckJsb2NrKTsKKyAgICAgICAgICAgICAgICBzZWNvbmRHZXR0ZXIuc2V0U3ludGhldGljKHRydWUpOworICAgICAgICAgICAgICAgIGNsYXNzTm9kZS5hZGRNZXRob2Qoc2Vjb25kR2V0dGVyKTsKKyAgICAgICAgICAgICAgICB2aXNpdE1ldGhvZChzZWNvbmRHZXR0ZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChzZXR0ZXJCbG9jayAhPSBudWxsKSB7CisgICAgICAgICAgICBQYXJhbWV0ZXJbXSBzZXR0ZXJQYXJhbWV0ZXJUeXBlcyA9IHsgbmV3IFBhcmFtZXRlcihub2RlLmdldFR5cGUoKSwgInZhbHVlIil9OworICAgICAgICAgICAgTWV0aG9kTm9kZSBzZXR0ZXIgPQorICAgICAgICAgICAgICAgIG5ldyBNZXRob2ROb2RlKHNldHRlck5hbWUsIG5vZGUuZ2V0TW9kaWZpZXJzKCksIENsYXNzSGVscGVyLlZPSURfVFlQRSwgc2V0dGVyUGFyYW1ldGVyVHlwZXMsIENsYXNzTm9kZS5FTVBUWV9BUlJBWSwgc2V0dGVyQmxvY2spOworICAgICAgICAgICAgc2V0dGVyLnNldFN5bnRoZXRpYyh0cnVlKTsKKyAgICAgICAgICAgIGNsYXNzTm9kZS5hZGRNZXRob2Qoc2V0dGVyKTsKKyAgICAgICAgICAgIHZpc2l0TWV0aG9kKHNldHRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJbXBsZW1lbnRhdGlvbiBtZXRob2RzCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgCisgICAgcHJpdmF0ZSBpbnRlcmZhY2UgRGVmYXVsdEFyZ3NBY3Rpb24geworICAgICAgICB2b2lkIGNhbGwoQXJndW1lbnRMaXN0RXhwcmVzc2lvbiBhcmd1bWVudHMsIFBhcmFtZXRlcltdIG5ld1BhcmFtcywgTWV0aG9kTm9kZSBtZXRob2QpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGhlbHBlciBtZXRob2QgZm9yIGVhY2ggY29tYmluYXRpb24gb2YgZGVmYXVsdCBwYXJhbWV0ZXIgZXhwcmVzc2lvbnMgCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgYWRkRGVmYXVsdFBhcmFtZXRlck1ldGhvZHMoZmluYWwgQ2xhc3NOb2RlIG5vZGUpIHsKKyAgICAgICAgTGlzdCBtZXRob2RzID0gbmV3IEFycmF5TGlzdChub2RlLmdldE1ldGhvZHMoKSk7CisgICAgICAgIGFkZERlZmF1bHRQYXJhbWV0ZXJzKG1ldGhvZHMsIG5ldyBEZWZhdWx0QXJnc0FjdGlvbigpeworICAgICAgICAgICAgcHVibGljIHZvaWQgY2FsbChBcmd1bWVudExpc3RFeHByZXNzaW9uIGFyZ3VtZW50cywgUGFyYW1ldGVyW10gbmV3UGFyYW1zLCBNZXRob2ROb2RlIG1ldGhvZCkgeworICAgICAgICAgICAgICAgIE1ldGhvZENhbGxFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBuZXcgTWV0aG9kQ2FsbEV4cHJlc3Npb24oVmFyaWFibGVFeHByZXNzaW9uLlRISVNfRVhQUkVTU0lPTiwgbWV0aG9kLmdldE5hbWUoKSwgYXJndW1lbnRzKTsKKyAgICAgICAgICAgICAgICBleHByZXNzaW9uLnNldEltcGxpY2l0VGhpcyh0cnVlKTsKKyAgICAgICAgICAgICAgICBTdGF0ZW1lbnQgY29kZSA9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKG1ldGhvZC5pc1ZvaWRNZXRob2QoKSkgeworICAgICAgICAgICAgICAgICAgICBjb2RlID0gbmV3IEV4cHJlc3Npb25TdGF0ZW1lbnQoZXhwcmVzc2lvbik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY29kZSA9IG5ldyBSZXR1cm5TdGF0ZW1lbnQoZXhwcmVzc2lvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5vZGUuYWRkTWV0aG9kKG1ldGhvZC5nZXROYW1lKCksIG1ldGhvZC5nZXRNb2RpZmllcnMoKSwgbWV0aG9kLmdldFJldHVyblR5cGUoKSwgbmV3UGFyYW1zLCBtZXRob2QuZ2V0RXhjZXB0aW9ucygpLCBjb2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCB2b2lkIGFkZERlZmF1bHRQYXJhbWV0ZXJDb25zdHJ1Y3RvcnMoZmluYWwgQ2xhc3NOb2RlIG5vZGUpIHsKKyAgICAgICAgTGlzdCBtZXRob2RzID0gbmV3IEFycmF5TGlzdChub2RlLmdldERlY2xhcmVkQ29uc3RydWN0b3JzKCkpOworICAgICAgICBhZGREZWZhdWx0UGFyYW1ldGVycyhtZXRob2RzLCBuZXcgRGVmYXVsdEFyZ3NBY3Rpb24oKXsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNhbGwoQXJndW1lbnRMaXN0RXhwcmVzc2lvbiBhcmd1bWVudHMsIFBhcmFtZXRlcltdIG5ld1BhcmFtcywgTWV0aG9kTm9kZSBtZXRob2QpIHsKKyAgICAgICAgICAgICAgICBDb25zdHJ1Y3Rvck5vZGUgY3RvciA9IChDb25zdHJ1Y3Rvck5vZGUpIG1ldGhvZDsKKyAgICAgICAgICAgICAgICBDb25zdHJ1Y3RvckNhbGxFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBuZXcgQ29uc3RydWN0b3JDYWxsRXhwcmVzc2lvbihDbGFzc05vZGUuVEhJUywgYXJndW1lbnRzKTsKKyAgICAgICAgICAgICAgICBTdGF0ZW1lbnQgY29kZSA9IG5ldyBFeHByZXNzaW9uU3RhdGVtZW50KGV4cHJlc3Npb24pOworICAgICAgICAgICAgICAgIG5vZGUuYWRkQ29uc3RydWN0b3IoY3Rvci5nZXRNb2RpZmllcnMoKSwgbmV3UGFyYW1zLCBjdG9yLmdldEV4Y2VwdGlvbnMoKSwgY29kZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgaGVscGVyIG1ldGhvZCBmb3IgZWFjaCBjb21iaW5hdGlvbiBvZiBkZWZhdWx0IHBhcmFtZXRlciBleHByZXNzaW9ucyAKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGREZWZhdWx0UGFyYW1ldGVycyhMaXN0IG1ldGhvZHMsIERlZmF1bHRBcmdzQWN0aW9uIGFjdGlvbikgeworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtZXRob2RzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgTWV0aG9kTm9kZSBtZXRob2QgPSAoTWV0aG9kTm9kZSkgaXRlci5uZXh0KCk7CisgICAgICAgICAgICBpZiAobWV0aG9kLmhhc0RlZmF1bHRWYWx1ZSgpKSB7CisgICAgICAgICAgICAgICAgUGFyYW1ldGVyW10gcGFyYW1ldGVycyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJzKCk7CisgICAgICAgICAgICAgICAgaW50IGNvdW50ZXIgPSAwOworICAgICAgICAgICAgICAgIExpc3QgcGFyYW1WYWx1ZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICAgICAgaW50IHNpemUgPSBwYXJhbWV0ZXJzLmxlbmd0aDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gc2l6ZSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBwYXJhbWV0ZXJzW2ldOworICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyICE9IG51bGwgJiYgcGFyYW1ldGVyLmhhc0luaXRpYWxFeHByZXNzaW9uKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtVmFsdWVzLmFkZChuZXcgSW50ZWdlcihpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbVZhbHVlcy5hZGQocGFyYW1ldGVyLmdldEluaXRpYWxFeHByZXNzaW9uKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlcisrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDE7IGogPD0gY291bnRlcjsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlcltdIG5ld1BhcmFtcyA9ICBuZXcgUGFyYW1ldGVyW3BhcmFtZXRlcnMubGVuZ3RoIC0gal07CisgICAgICAgICAgICAgICAgICAgIEFyZ3VtZW50TGlzdEV4cHJlc3Npb24gYXJndW1lbnRzID0gbmV3IEFyZ3VtZW50TGlzdEV4cHJlc3Npb24oKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaW50IGsgPSAxOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrID4gY291bnRlciAtIGogJiYgcGFyYW1ldGVyc1tpXSAhPSBudWxsICYmIHBhcmFtZXRlcnNbaV0uaGFzSW5pdGlhbEV4cHJlc3Npb24oKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50cy5hZGRFeHByZXNzaW9uKHBhcmFtZXRlcnNbaV0uZ2V0SW5pdGlhbEV4cHJlc3Npb24oKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaysrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocGFyYW1ldGVyc1tpXSAhPSBudWxsICYmIHBhcmFtZXRlcnNbaV0uaGFzSW5pdGlhbEV4cHJlc3Npb24oKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhcmFtc1tpbmRleCsrXSA9IHBhcmFtZXRlcnNbaV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzLmFkZEV4cHJlc3Npb24obmV3IFZhcmlhYmxlRXhwcmVzc2lvbihwYXJhbWV0ZXJzW2ldLmdldE5hbWUoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhcmFtc1tpbmRleCsrXSA9IHBhcmFtZXRlcnNbaV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzLmFkZEV4cHJlc3Npb24obmV3IFZhcmlhYmxlRXhwcmVzc2lvbihwYXJhbWV0ZXJzW2ldLmdldE5hbWUoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJzLmxlbmd0aD4wICYmIHBhcmFtZXRlcnNbcGFyYW1ldGVycy5sZW5ndGgtMV0uZ2V0VHlwZSgpLmlzQXJyYXkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFyZ3MgY2FsbC4uLiBiZXR0ZXIgZXhwYW5kIHRoZSBhcmd1bWVudDoKKyAgICAgICAgICAgICAgICAgICAgICAgIEV4cHJlc3Npb24gZXhwID0gYXJndW1lbnRzLmdldEV4cHJlc3Npb24ocGFyYW1ldGVycy5sZW5ndGgtMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBTcHJlYWRFeHByZXNzaW9uIHNlID0gbmV3IFNwcmVhZEV4cHJlc3Npb24oZXhwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50cy5nZXRFeHByZXNzaW9ucygpLnNldChwYXJhbWV0ZXJzLmxlbmd0aC0xLCBzZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYWN0aW9uLmNhbGwoYXJndW1lbnRzLG5ld1BhcmFtcyxtZXRob2QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGRlZmF1bHQgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzW2ldLnNldEluaXRpYWxFeHByZXNzaW9uKG51bGwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGFkZENsb3N1cmVDb2RlKElubmVyQ2xhc3NOb2RlIG5vZGUpIHsKKyAgICAgICAgLy8gYWRkIGEgbmV3IGludm9rZQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGFkZEluaXRpYWxpemF0aW9uKENsYXNzTm9kZSBub2RlKSB7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IG5vZGUuZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIGFkZEluaXRpYWxpemF0aW9uKG5vZGUsIChDb25zdHJ1Y3Rvck5vZGUpIGl0ZXIubmV4dCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGFkZEluaXRpYWxpemF0aW9uKENsYXNzTm9kZSBub2RlLCBDb25zdHJ1Y3Rvck5vZGUgY29uc3RydWN0b3JOb2RlKSB7CisgICAgICAgIFN0YXRlbWVudCBmaXJzdFN0YXRlbWVudCA9IGNvbnN0cnVjdG9yTm9kZS5nZXRGaXJzdFN0YXRlbWVudCgpOworICAgICAgICBDb25zdHJ1Y3RvckNhbGxFeHByZXNzaW9uIGZpcnN0ID0gZ2V0Rmlyc3RJZlNwZWNpYWxDb25zdHJ1Y3RvckNhbGwoZmlyc3RTdGF0ZW1lbnQpOworICAgICAgICAKKyAgICAgICAgLy8gaW4gY2FzZSBvZiB0aGlzKC4uLikgbGV0IHRoZSBvdGhlciBjb25zdHJ1Y3RvciBkbyB0aGUgaW50aXQKKyAgICAgICAgaWYgKGZpcnN0IT1udWxsICYmIGZpcnN0LmlzVGhpc0NhbGwoKSkgcmV0dXJuOworICAgICAgICAKKyAgICAgICAgTGlzdCBzdGF0ZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBMaXN0IHN0YXRpY1N0YXRlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IG5vZGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBhZGRGaWVsZEluaXRpYWxpemF0aW9uKHN0YXRlbWVudHMsIHN0YXRpY1N0YXRlbWVudHMsIChGaWVsZE5vZGUpIGl0ZXIubmV4dCgpKTsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZW1lbnRzLmFkZEFsbChub2RlLmdldE9iamVjdEluaXRpYWxpemVyU3RhdGVtZW50cygpKTsKKyAgICAgICAgaWYgKCFzdGF0ZW1lbnRzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgU3RhdGVtZW50IGNvZGUgPSBjb25zdHJ1Y3Rvck5vZGUuZ2V0Q29kZSgpOworICAgICAgICAgICAgQmxvY2tTdGF0ZW1lbnQgYmxvY2sgPSBuZXcgQmxvY2tTdGF0ZW1lbnQoKTsKKyAgICAgICAgICAgIExpc3Qgb3RoZXJTdGF0ZW1lbnRzID0gYmxvY2suZ2V0U3RhdGVtZW50cygpOworICAgICAgICAgICAgaWYgKGNvZGUgaW5zdGFuY2VvZiBCbG9ja1N0YXRlbWVudCkgeworICAgICAgICAgICAgICAgIGJsb2NrID0gKEJsb2NrU3RhdGVtZW50KSBjb2RlOworICAgICAgICAgICAgICAgIG90aGVyU3RhdGVtZW50cz1ibG9jay5nZXRTdGF0ZW1lbnRzKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChjb2RlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBvdGhlclN0YXRlbWVudHMuYWRkKGNvZGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFvdGhlclN0YXRlbWVudHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0IT1udWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGl0IGlzIHN1cGVyKC4uKSBzaW5jZSB0aGlzKC4uKSBpcyBhbHJlYWR5IGNvdmVyZWQKKyAgICAgICAgICAgICAgICAgICAgb3RoZXJTdGF0ZW1lbnRzLnJlbW92ZSgwKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50cy5hZGQoMCwgZmlyc3RTdGF0ZW1lbnQpOworICAgICAgICAgICAgICAgIH0gCisgICAgICAgICAgICAgICAgc3RhdGVtZW50cy5hZGRBbGwob3RoZXJTdGF0ZW1lbnRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnN0cnVjdG9yTm9kZS5zZXRDb2RlKG5ldyBCbG9ja1N0YXRlbWVudChzdGF0ZW1lbnRzLCBibG9jay5nZXRWYXJpYWJsZVNjb3BlKCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghc3RhdGljU3RhdGVtZW50cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIG5vZGUuYWRkU3RhdGljSW5pdGlhbGl6ZXJTdGF0ZW1lbnRzKHN0YXRpY1N0YXRlbWVudHMsdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIENvbnN0cnVjdG9yQ2FsbEV4cHJlc3Npb24gZ2V0Rmlyc3RJZlNwZWNpYWxDb25zdHJ1Y3RvckNhbGwoU3RhdGVtZW50IGNvZGUpIHsKKyAgICAgICAgaWYgKGNvZGUgPT0gbnVsbCB8fCAhKGNvZGUgaW5zdGFuY2VvZiBFeHByZXNzaW9uU3RhdGVtZW50KSkgcmV0dXJuIG51bGw7CisKKyAgICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gKChFeHByZXNzaW9uU3RhdGVtZW50KWNvZGUpLmdldEV4cHJlc3Npb24oKTsKKyAgICAgICAgaWYgKCEoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIENvbnN0cnVjdG9yQ2FsbEV4cHJlc3Npb24pKSByZXR1cm4gbnVsbDsKKyAgICAgICAgQ29uc3RydWN0b3JDYWxsRXhwcmVzc2lvbiBjY2UgPSAoQ29uc3RydWN0b3JDYWxsRXhwcmVzc2lvbikgZXhwcmVzc2lvbjsKKyAgICAgICAgaWYgKGNjZS5pc1NwZWNpYWxDYWxsKCkpIHJldHVybiBjY2U7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGFkZEZpZWxkSW5pdGlhbGl6YXRpb24oCisgICAgICAgIExpc3QgbGlzdCwKKyAgICAgICAgTGlzdCBzdGF0aWNMaXN0LAorICAgICAgICBGaWVsZE5vZGUgZmllbGROb2RlKSB7CisgICAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IGZpZWxkTm9kZS5nZXRJbml0aWFsRXhwcmVzc2lvbigpOworICAgICAgICBpZiAoZXhwcmVzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBFeHByZXNzaW9uU3RhdGVtZW50IHN0YXRlbWVudCA9CisgICAgICAgICAgICAgICAgbmV3IEV4cHJlc3Npb25TdGF0ZW1lbnQoCisgICAgICAgICAgICAgICAgICAgIG5ldyBCaW5hcnlFeHByZXNzaW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpZWxkRXhwcmVzc2lvbihmaWVsZE5vZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW4ubmV3U3ltYm9sKFR5cGVzLkVRVUFMLCBmaWVsZE5vZGUuZ2V0TGluZU51bWJlcigpLCBmaWVsZE5vZGUuZ2V0Q29sdW1uTnVtYmVyKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbikpOworICAgICAgICAgICAgaWYgKGZpZWxkTm9kZS5pc1N0YXRpYygpKSB7CisgICAgICAgICAgICAgICAgc3RhdGljTGlzdC5hZGQoc3RhdGVtZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGxpc3QuYWRkKHN0YXRlbWVudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYXBpdGFsaXplcyB0aGUgc3RhcnQgb2YgdGhlIGdpdmVuIGJlYW4gcHJvcGVydHkgbmFtZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhcGl0YWxpemUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIG5hbWUuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnN1YnN0cmluZygxLCBuYW1lLmxlbmd0aCgpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RhdGVtZW50IGNyZWF0ZUdldHRlckJsb2NrKFByb3BlcnR5Tm9kZSBwcm9wZXJ0eU5vZGUsIEZpZWxkTm9kZSBmaWVsZCkgeworICAgICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBuZXcgRmllbGRFeHByZXNzaW9uKGZpZWxkKTsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXR1cm5TdGF0ZW1lbnQoZXhwcmVzc2lvbik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFN0YXRlbWVudCBjcmVhdGVTZXR0ZXJCbG9jayhQcm9wZXJ0eU5vZGUgcHJvcGVydHlOb2RlLCBGaWVsZE5vZGUgZmllbGQpIHsKKyAgICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gbmV3IEZpZWxkRXhwcmVzc2lvbihmaWVsZCk7CisgICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvblN0YXRlbWVudCgKKyAgICAgICAgICAgIG5ldyBCaW5hcnlFeHByZXNzaW9uKGV4cHJlc3Npb24sIFRva2VuLm5ld1N5bWJvbChUeXBlcy5FUVVBTCwgMCwgMCksIG5ldyBWYXJpYWJsZUV4cHJlc3Npb24oInZhbHVlIikpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaWx0ZXJzIHRoZSBnaXZlbiBzdGF0ZW1lbnRzCisgICAgICovCisgICAgcHJvdGVjdGVkIExpc3QgZmlsdGVyU3RhdGVtZW50cyhMaXN0IGxpc3QpIHsKKyAgICAgICAgTGlzdCBhbnN3ZXIgPSBuZXcgQXJyYXlMaXN0KGxpc3Quc2l6ZSgpKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIGFuc3dlci5hZGQoZmlsdGVyU3RhdGVtZW50KChTdGF0ZW1lbnQpIGl0ZXIubmV4dCgpKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFuc3dlcjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RhdGVtZW50IGZpbHRlclN0YXRlbWVudChTdGF0ZW1lbnQgc3RhdGVtZW50KSB7CisgICAgICAgIGlmIChzdGF0ZW1lbnQgaW5zdGFuY2VvZiBFeHByZXNzaW9uU3RhdGVtZW50KSB7CisgICAgICAgICAgICBFeHByZXNzaW9uU3RhdGVtZW50IGV4cFN0bXQgPSAoRXhwcmVzc2lvblN0YXRlbWVudCkgc3RhdGVtZW50OworICAgICAgICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gZXhwU3RtdC5nZXRFeHByZXNzaW9uKCk7CisgICAgICAgICAgICBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIENsb3N1cmVFeHByZXNzaW9uKSB7CisgICAgICAgICAgICAgICAgQ2xvc3VyZUV4cHJlc3Npb24gY2xvc3VyZUV4cCA9IChDbG9zdXJlRXhwcmVzc2lvbikgZXhwcmVzc2lvbjsKKyAgICAgICAgICAgICAgICBpZiAoIWNsb3N1cmVFeHAuaXNQYXJhbWV0ZXJTcGVjaWZpZWQoKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xvc3VyZUV4cC5nZXRDb2RlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0ZW1lbnQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRHZW5lcmljVHlwZShHZW5lcmljc1R5cGUgZ2VuZXJpY3NUeXBlKSB7CisKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGxvbmcgZ2V0VGltZXN0YW1wIChDbGFzcyBjbGF6eikgeworICAgICAgICBmaW5hbCBGaWVsZFtdIGZpZWxkcyA9IGNsYXp6LmdldEZpZWxkcygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSAhPSBmaWVsZHMubGVuZ3RoOyArK2kgKSB7CisgICAgICAgICAgIGlmIChNb2RpZmllci5pc1N0YXRpYyhmaWVsZHNbaV0uZ2V0TW9kaWZpZXJzKCkpKSB7CisgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IGZpZWxkc1tpXS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKF9fVElNRVNUQU1QX18pKSB7CisgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTG9uZy5kZWNvZGUobmFtZS5zdWJzdHJpbmcoX19USU1FU1RBTVBfXy5sZW5ndGgoKSkpLmxvbmdWYWx1ZSgpOworICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIExvbmcuTUFYX1ZBTFVFOworICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgfQorICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIExvbmcuTUFYX1ZBTFVFOworICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRDb3ZhcmlhbnRNZXRob2RzKENsYXNzTm9kZSBjbGFzc05vZGUpIHsKKyAgICAgICAgTWFwIG1ldGhvZHNUb0FkZCA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIExpc3QgZGVjbGFyZWRNZXRob2RzID0gbmV3IEFycmF5TGlzdChjbGFzc05vZGUuZ2V0TWV0aG9kcygpKTsKKyAgICAgICAgTWFwIGdlbmVyaWNzU3BlYyA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIAorICAgICAgICAvLyByZW1vdmUgc3RhaWMgbWV0aG9kcyBmcm9tIGRlY2xhcmVkTWV0aG9kcworICAgICAgICBmb3IgKEl0ZXJhdG9yIG1ldGhvZHNJdGVyYXRvciA9IGRlY2xhcmVkTWV0aG9kcy5pdGVyYXRvcigpOyBtZXRob2RzSXRlcmF0b3IuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgTWV0aG9kTm9kZSBtID0gKE1ldGhvZE5vZGUpIG1ldGhvZHNJdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICBpZiAobS5pc1N0YXRpYygpKSBtZXRob2RzSXRlcmF0b3IucmVtb3ZlKCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGFkZENvdmFyaWFudE1ldGhvZHMoY2xhc3NOb2RlLCBkZWNsYXJlZE1ldGhvZHMsIG1ldGhvZHNUb0FkZCwgZ2VuZXJpY3NTcGVjKTsKKyAgICAgICAKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IG1ldGhvZHNUb0FkZC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBNZXRob2ROb2RlIG1ldGhvZCA9IChNZXRob2ROb2RlKSBpdC5uZXh0KCk7CisgICAgICAgICAgICBjbGFzc05vZGUuYWRkTWV0aG9kKG1ldGhvZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSB2b2lkIGFkZENvdmFyaWFudE1ldGhvZHMoQ2xhc3NOb2RlIGNsYXNzTm9kZSwgTGlzdCBkZWNsYXJlZE1ldGhvZHMsIE1hcCBtZXRob2RzVG9BZGQsIE1hcCBvbGRHZW5lcmljc1NwZWMpIHsKKyAgICAgICAgQ2xhc3NOb2RlIHNuID0gY2xhc3NOb2RlLmdldFVucmVzb2x2ZWRTdXBlckNsYXNzKGZhbHNlKTsKKyAgICAgICAgaWYgKHNuIT1udWxsICYmIHNuLnJlZGlyZWN0KCkhPUNsYXNzSGVscGVyLk9CSkVDVF9UWVBFKSB7CisgICAgICAgICAgICBNYXAgZ2VuZXJpY3NTcGVjID0gY3JlYXRlR2VuZXJpY3NTcGVjKHNuLG9sZEdlbmVyaWNzU3BlYyk7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gZGVjbGFyZWRNZXRob2RzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBNZXRob2ROb2RlIG1ldGhvZCA9IChNZXRob2ROb2RlKSBpdC5uZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKG1ldGhvZC5pc1N0YXRpYygpKSBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBzdG9yZU1pc3NpbmdDb3ZhcmlhbnRNZXRob2RzKHNuLG1ldGhvZCxtZXRob2RzVG9BZGQsZ2VuZXJpY3NTcGVjKTsKKyAgICAgICAgICAgICAgICBhZGRDb3ZhcmlhbnRNZXRob2RzKHNuLGRlY2xhcmVkTWV0aG9kcyxtZXRob2RzVG9BZGQsZ2VuZXJpY3NTcGVjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQ2xhc3NOb2RlW10gaW50ZXJmYWNlcyA9IGNsYXNzTm9kZS5nZXRJbnRlcmZhY2VzKCk7CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxpbnRlcmZhY2VzLmxlbmd0aDsgaSsrKSB7ICAgICAgICAgICAgCisgICAgICAgICAgICBNYXAgZ2VuZXJpY3NTcGVjID0gY3JlYXRlR2VuZXJpY3NTcGVjKGludGVyZmFjZXNbaV0sb2xkR2VuZXJpY3NTcGVjKTsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBkZWNsYXJlZE1ldGhvZHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIE1ldGhvZE5vZGUgbWV0aG9kID0gKE1ldGhvZE5vZGUpIGl0Lm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAobWV0aG9kLmlzU3RhdGljKCkpIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIHN0b3JlTWlzc2luZ0NvdmFyaWFudE1ldGhvZHMoaW50ZXJmYWNlc1tpXSxtZXRob2QsbWV0aG9kc1RvQWRkLGdlbmVyaWNzU3BlYyk7CisgICAgICAgICAgICAgICAgYWRkQ292YXJpYW50TWV0aG9kcyhzbixkZWNsYXJlZE1ldGhvZHMsbWV0aG9kc1RvQWRkLGdlbmVyaWNzU3BlYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gICAgICAgIAorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIE1ldGhvZE5vZGUgZ2V0Q292YXJpYW50SW1wbGVtZW50YXRpb24oZmluYWwgTWV0aG9kTm9kZSBvbGRNZXRob2QsIGZpbmFsIE1ldGhvZE5vZGUgb3ZlcnJpZGluZ01ldGhvZCwgTWFwIGdlbmVyaWNzU3BlYykgeworICAgICAgICBpZiAoIW9sZE1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKG92ZXJyaWRpbmdNZXRob2QuZ2V0TmFtZSgpKSkgcmV0dXJuIG51bGw7CisgICAgICAgIGlmICghZXF1YWxQYXJhbWV0ZXJzKG92ZXJyaWRpbmdNZXRob2Qsb2xkTWV0aG9kLGdlbmVyaWNzU3BlYykpIHJldHVybiBudWxsOworICAgICAgICBDbGFzc05vZGUgbXIgPSBvdmVycmlkaW5nTWV0aG9kLmdldFJldHVyblR5cGUoKTsKKyAgICAgICAgQ2xhc3NOb2RlIG9tciA9IG9sZE1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7CisgICAgICAgIGlmIChtci5lcXVhbHMob21yKSkgcmV0dXJuIG51bGw7CisgICAgICAgIENsYXNzTm9kZSB0ZXN0bXIgPSBjb3JyZWN0VG9HZW5lcmljc1NwZWMoZ2VuZXJpY3NTcGVjLG9tcik7CisgICAgICAgIGlmICghbXIuaXNEZXJpdmVkRnJvbSh0ZXN0bXIpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZVBhcnNlckV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgInRoZSByZXR1cm4gdHlwZSBpcyBpbmNvbXBhdGlibGUgd2l0aCAiKworICAgICAgICAgICAgICAgICAgICBvbGRNZXRob2QuZ2V0VHlwZURlc2NyaXB0b3IoKSsKKyAgICAgICAgICAgICAgICAgICAgIiBpbiAiK29sZE1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGluZ01ldGhvZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChvbGRNZXRob2QuZ2V0TW9kaWZpZXJzKCkmQUNDX0ZJTkFMKSE9MCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVQYXJzZXJFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJjYW5ub3Qgb3ZlcnJpZGUgZmluYWwgbWV0aG9kICIrCisgICAgICAgICAgICAgICAgICAgIG9sZE1ldGhvZC5nZXRUeXBlRGVzY3JpcHRvcigpKworICAgICAgICAgICAgICAgICAgICAiIGluICIrb2xkTWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCkuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICBvdmVycmlkaW5nTWV0aG9kKTsKKyAgICAgICAgfQorICAgICAgICBpZiAob2xkTWV0aG9kLmlzU3RhdGljKCkgIT0gb3ZlcnJpZGluZ01ldGhvZC5pc1N0YXRpYygpKXsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lUGFyc2VyRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiY2Fubm90IG92ZXJyaWRlIG1ldGhvZCAiKworICAgICAgICAgICAgICAgICAgICBvbGRNZXRob2QuZ2V0VHlwZURlc2NyaXB0b3IoKSsKKyAgICAgICAgICAgICAgICAgICAgIiBpbiAiK29sZE1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpLmdldE5hbWUoKSsKKyAgICAgICAgICAgICAgICAgICAgIiB3aXRoIGRpc3BhcmF0ZSBzdGF0aWMgbW9kaWZpZXIiLAorICAgICAgICAgICAgICAgICAgICBvdmVycmlkaW5nTWV0aG9kKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgTWV0aG9kTm9kZSBuZXdNZXRob2QgPSBuZXcgTWV0aG9kTm9kZSgKKyAgICAgICAgICAgICAgICBvbGRNZXRob2QuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgIG92ZXJyaWRpbmdNZXRob2QuZ2V0TW9kaWZpZXJzKCkgfCBBQ0NfU1lOVEhFVElDIHwgQUNDX0JSSURHRSwKKyAgICAgICAgICAgICAgICBvbGRNZXRob2QuZ2V0UmV0dXJuVHlwZSgpLmdldFBsYWluTm9kZVJlZmVyZW5jZSgpLAorICAgICAgICAgICAgICAgIGNsZWFuUGFyYW1ldGVycyhvbGRNZXRob2QuZ2V0UGFyYW1ldGVycygpKSwKKyAgICAgICAgICAgICAgICBvbGRNZXRob2QuZ2V0RXhjZXB0aW9ucygpLAorICAgICAgICAgICAgICAgIG51bGwKKyAgICAgICAgKTsKKyAgICAgICAgTGlzdCBpbnN0cnVjdGlvbnMgPSBuZXcgQXJyYXlMaXN0KDEpOworICAgICAgICBpbnN0cnVjdGlvbnMuYWRkICgKKyAgICAgICAgICAgICAgICBuZXcgQnl0ZWNvZGVJbnN0cnVjdGlvbigpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoTWV0aG9kVmlzaXRvciBtdikgeworICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZWNvZGVIZWxwZXIgaGVscGVyID0gbmV3IEJ5dGVjb2RlSGVscGVyKG12KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG12LnZpc2l0VmFySW5zbihBTE9BRCwwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlcltdIHBhcmEgPSBvbGRNZXRob2QuZ2V0UGFyYW1ldGVycygpOworICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyW10gZ29hbCA9IG92ZXJyaWRpbmdNZXRob2QuZ2V0UGFyYW1ldGVycygpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscGVyLmxvYWQocGFyYVtpXS5nZXRUeXBlKCksIGkrMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJhW2ldLmdldFR5cGUoKS5lcXVhbHMoZ29hbFtpXS5nZXRUeXBlKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHBlci5kb0Nhc3QoZ29hbFtpXS5nZXRUeXBlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG12LnZpc2l0TWV0aG9kSW5zbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5WT0tFVklSVFVBTCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVjb2RlSGVscGVyLmdldENsYXNzSW50ZXJuYWxOYW1lKGNsYXNzTm9kZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRpbmdNZXRob2QuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlY29kZUhlbHBlci5nZXRNZXRob2REZXNjcmlwdG9yKG92ZXJyaWRpbmdNZXRob2QuZ2V0UmV0dXJuVHlwZSgpLCBvdmVycmlkaW5nTWV0aG9kLmdldFBhcmFtZXRlcnMoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgaGVscGVyLmRvUmV0dXJuKG9sZE1ldGhvZC5nZXRSZXR1cm5UeXBlKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICk7CisgICAgICAgIG5ld01ldGhvZC5zZXRDb2RlKG5ldyBCeXRlY29kZVNlcXVlbmNlKGluc3RydWN0aW9ucykpOworICAgICAgICByZXR1cm4gbmV3TWV0aG9kOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIFBhcmFtZXRlcltdIGNsZWFuUGFyYW1ldGVycyhQYXJhbWV0ZXJbXSBwYXJhbWV0ZXJzKSB7CisgICAgICAgIFBhcmFtZXRlcltdIHBhcmFtcyA9IG5ldyBQYXJhbWV0ZXJbcGFyYW1ldGVycy5sZW5ndGhdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgcGFyYW1zW2ldID0gbmV3IFBhcmFtZXRlcihwYXJhbWV0ZXJzW2ldLmdldFR5cGUoKS5nZXRQbGFpbk5vZGVSZWZlcmVuY2UoKSxwYXJhbWV0ZXJzW2ldLmdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhcmFtczsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc3RvcmVNaXNzaW5nQ292YXJpYW50TWV0aG9kcyhDbGFzc05vZGUgY3VycmVudCwgTWV0aG9kTm9kZSBtZXRob2QsIE1hcCBtZXRob2RzVG9BZGQsIE1hcCBnZW5lcmljc1NwZWMpIHsKKyAgICAgICAgTGlzdCBtZXRob2RzID0gY3VycmVudC5nZXRNZXRob2RzKCk7CisgICAgICAgIGZvciAoSXRlcmF0b3Igc2l0ID0gbWV0aG9kcy5pdGVyYXRvcigpOyBzaXQuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgTWV0aG9kTm9kZSB0b092ZXJyaWRlID0gKE1ldGhvZE5vZGUpIHNpdC5uZXh0KCk7CisgICAgICAgICAgICBNZXRob2ROb2RlIGJyaWRnZU1ldGhvZCA9IGdldENvdmFyaWFudEltcGxlbWVudGF0aW9uKHRvT3ZlcnJpZGUsbWV0aG9kLGdlbmVyaWNzU3BlYyk7CisgICAgICAgICAgICBpZiAoYnJpZGdlTWV0aG9kPT1udWxsKSBjb250aW51ZTsKKyAgICAgICAgICAgIG1ldGhvZHNUb0FkZC5wdXQgKGJyaWRnZU1ldGhvZC5nZXRUeXBlRGVzY3JpcHRvcigpLGJyaWRnZU1ldGhvZCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBDbGFzc05vZGUgY29ycmVjdFRvR2VuZXJpY3NTcGVjKE1hcCBnZW5lcmljc1NwZWMsIEdlbmVyaWNzVHlwZSB0eXBlKSB7CisgICAgICAgIENsYXNzTm9kZSByZXQgPSBudWxsOworICAgICAgICBpZiAodHlwZS5pc1BsYWNlaG9sZGVyKCkpeworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSB0eXBlLmdldE5hbWUoKTsKKyAgICAgICAgICAgIHJldCA9IChDbGFzc05vZGUpIGdlbmVyaWNzU3BlYy5nZXQobmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJldD09bnVsbCkgcmV0ID0gdHlwZS5nZXRUeXBlKCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgQ2xhc3NOb2RlIGNvcnJlY3RUb0dlbmVyaWNzU3BlYyhNYXAgZ2VuZXJpY3NTcGVjLCBDbGFzc05vZGUgdHlwZSkgeworICAgICAgICBpZiAodHlwZS5pc0dlbmVyaWNzUGxhY2VIb2xkZXIoKSl7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHR5cGUuZ2V0R2VuZXJpY3NUeXBlcygpWzBdLmdldE5hbWUoKTsKKyAgICAgICAgICAgIHR5cGUgPSAoQ2xhc3NOb2RlKSBnZW5lcmljc1NwZWMuZ2V0KG5hbWUpOworICAgICAgICB9CisgICAgICAgIGlmICh0eXBlPT1udWxsKSB0eXBlID0gQ2xhc3NIZWxwZXIuT0JKRUNUX1RZUEU7CisgICAgICAgIHJldHVybiB0eXBlOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIGJvb2xlYW4gZXF1YWxQYXJhbWV0ZXJzKE1ldGhvZE5vZGUgbTEsIE1ldGhvZE5vZGUgbTIsIE1hcCBnZW5lcmljc1NwZWMpIHsKKyAgICAgICAgUGFyYW1ldGVyW10gcDEgPSBtMS5nZXRQYXJhbWV0ZXJzKCk7CisgICAgICAgIFBhcmFtZXRlcltdIHAyID0gbTIuZ2V0UGFyYW1ldGVycygpOworICAgICAgICBpZiAocDEubGVuZ3RoIT1wMi5sZW5ndGgpIHJldHVybiBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwMi5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgQ2xhc3NOb2RlIHR5cGUgPSBwMltpXS5nZXRUeXBlKCk7CisgICAgICAgICAgICB0eXBlID0gY29ycmVjdFRvR2VuZXJpY3NTcGVjKGdlbmVyaWNzU3BlYyx0eXBlKTsKKyAgICAgICAgICAgIGlmICghcDFbaV0uZ2V0VHlwZSgpLmVxdWFscyh0eXBlKSkgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIE1hcCBjcmVhdGVHZW5lcmljc1NwZWMoQ2xhc3NOb2RlIGN1cnJlbnQsIE1hcCBvbGRTcGVjKSB7CisgICAgICAgIE1hcCByZXQgPSBuZXcgSGFzaE1hcChvbGRTcGVjKTsKKyAgICAgICAgLy8gcmV0IGNvbnRhaW5zIHRoZSB0eXBlIHNwZWNzLCB3aGF0IHdlIG5vdyBuZWVkIGlzIHRoZSB0eXBlIHNwZWMgZm9yIHRoZSAKKyAgICAgICAgLy8gY3VycmVudCBjbGFzcy4gVG8gZ2V0IHRoYXQgd2UgZmlyc3QgYXBwbHkgdGhlIHR5cGUgcGFyYW1ldGVycyB0byB0aGUgCisgICAgICAgIC8vIGN1cnJlbnQgY2xhc3MgYW5kIHRoZW4gdXNlIHRoZSB0eXBlIG5hbWVzIG9mIHRoZSBjdXJyZW50IGNsYXNzIHRvIHJlc2V0IAorICAgICAgICAvLyB0aGUgbWFwLiBFeGFtcGxlOgorICAgICAgICAvLyAgIGNsYXNzIEE8VixXLFg+e30KKyAgICAgICAgLy8gICBjbGFzcyBCPFQgZXh0ZW5kcyBOdW1iZXI+IGV4dGVuZHMgQTxULExvbmcsU3RyaW5nPiB7fQorICAgICAgICAvLyBmaXJzdCB3ZSBoYXZlOiAgICBULT5OdW1iZXIKKyAgICAgICAgLy8gd2UgYXBwbHkgaXQgdG8gQTxULExvbmcsU3RyaW5nPiAtPiBBPE51bWJlcixMb25nLFN0cmluZz4KKyAgICAgICAgLy8gcmVzdWx0aW5nIGluOiAgICAgVi0+TnVtYmVyLFctPkxvbmcsWC0+U3RyaW5nCisKKyAgICAgICAgR2VuZXJpY3NUeXBlW10gc2d0cyA9IGN1cnJlbnQuZ2V0R2VuZXJpY3NUeXBlcygpOworICAgICAgICBpZiAoc2d0cyE9bnVsbCkgeworICAgICAgICAgICAgQ2xhc3NOb2RlW10gc3BlYyA9IG5ldyBDbGFzc05vZGVbc2d0cy5sZW5ndGhdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcGVjLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgc3BlY1tpXT1jb3JyZWN0VG9HZW5lcmljc1NwZWMocmV0LCBzZ3RzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEdlbmVyaWNzVHlwZVtdIG5ld0d0cyA9IGN1cnJlbnQucmVkaXJlY3QoKS5nZXRHZW5lcmljc1R5cGVzKCk7CisgICAgICAgICAgICByZXQuY2xlYXIoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3BlYy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIHJldC5wdXQobmV3R3RzW2ldLmdldE5hbWUoKSwgc3BlY1tpXSk7CisgICAgICAgICAgICB9ICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL1ZlcmlmaWVyQ29kZVZpc2l0b3IuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL1ZlcmlmaWVyQ29kZVZpc2l0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDFkOTk2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vVmVyaWZpZXJDb2RlVmlzaXRvci5qYXZhCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbjsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LkFTVE5vZGU7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuQ29kZVZpc2l0b3JTdXBwb3J0OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuRm9yU3RhdGVtZW50OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHIuQmluYXJ5RXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByLkV4cHJlc3Npb247CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuZXhwci5MaXN0RXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByLk1hcEVudHJ5RXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByLk1ldGhvZENhbGxFeHByZXNzaW9uOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHIuUHJvcGVydHlFeHByZXNzaW9uOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHIuRmllbGRFeHByZXNzaW9uOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHIuVmFyaWFibGVFeHByZXNzaW9uOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LlJ1bnRpbWVQYXJzZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLm9iamVjdHdlYi5hc20uT3Bjb2RlczsKKworLyoqCisgKiBWZXJpZmllcyB0aGUgbWV0aG9kIGNvZGUKKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIFZlcmlmaWVyQ29kZVZpc2l0b3IgZXh0ZW5kcyBDb2RlVmlzaXRvclN1cHBvcnQgaW1wbGVtZW50cyBPcGNvZGVzIHsKKworICAgIHByaXZhdGUgVmVyaWZpZXIgdmVyaWZpZXI7CisKKyAgICBWZXJpZmllckNvZGVWaXNpdG9yKFZlcmlmaWVyIHZlcmlmaWVyKSB7CisgICAgICAgIHRoaXMudmVyaWZpZXIgPSB2ZXJpZmllcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdE1ldGhvZENhbGxFeHByZXNzaW9uKE1ldGhvZENhbGxFeHByZXNzaW9uIGNhbGwpIHsKKyAgICAgICAgc3VwZXIudmlzaXRNZXRob2RDYWxsRXhwcmVzc2lvbihjYWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEZvckxvb3AoRm9yU3RhdGVtZW50IGV4cHJlc3Npb24pIHsKKyAgICAgICAgYXNzZXJ0VmFsaWRJZGVudGlmaWVyKGV4cHJlc3Npb24uZ2V0VmFyaWFibGUoKS5nZXROYW1lKCksICJmb3IgbG9vcCB2YXJpYWJsZSBuYW1lIiwgZXhwcmVzc2lvbik7CisgICAgICAgIHN1cGVyLnZpc2l0Rm9yTG9vcChleHByZXNzaW9uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFByb3BlcnR5RXhwcmVzc2lvbihQcm9wZXJ0eUV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgICAgICAvLyBhc3NlcnRWYWxpZElkZW50aWZpZXIoZXhwcmVzc2lvbi5nZXRQcm9wZXJ0eSgpLCAicHJvcGVydHkgbmFtZSIsIGV4cHJlc3Npb24pOyAgLy8gVGhpcyBoYXMgYmVlbiBjb21tZW50ZWQgb3V0IHRvIGZpeCB0aGUgaXNzdWUgR3Jvb3Z5LTg0MworICAgICAgICBzdXBlci52aXNpdFByb3BlcnR5RXhwcmVzc2lvbihleHByZXNzaW9uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEZpZWxkRXhwcmVzc2lvbihGaWVsZEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgICAgICBpZiAoIWV4cHJlc3Npb24uZ2V0RmllbGQoKS5pc1N5bnRoZXRpYygpKSB7CisgICAgICAgICAgICBhc3NlcnRWYWxpZElkZW50aWZpZXIoZXhwcmVzc2lvbi5nZXRGaWVsZE5hbWUoKSwgImZpZWxkIG5hbWUiLCBleHByZXNzaW9uKTsKKyAgICAgICAgfQorICAgICAgICBzdXBlci52aXNpdEZpZWxkRXhwcmVzc2lvbihleHByZXNzaW9uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFZhcmlhYmxlRXhwcmVzc2lvbihWYXJpYWJsZUV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgICAgICBhc3NlcnRWYWxpZElkZW50aWZpZXIoZXhwcmVzc2lvbi5nZXROYW1lKCksICJ2YXJpYWJsZSBuYW1lIiwgZXhwcmVzc2lvbik7CisgICAgICAgIHN1cGVyLnZpc2l0VmFyaWFibGVFeHByZXNzaW9uKGV4cHJlc3Npb24pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0QmluYXJ5RXhwcmVzc2lvbihCaW5hcnlFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKyAgICAgICAgLyoKKyAgICAgICAgaWYgKHZlcmlmaWVyLmdldENsYXNzTm9kZSgpLmlzU2NyaXB0KCkgJiYgZXhwcmVzc2lvbi5nZXRPcGVyYXRpb24oKS5nZXRUeXBlKCkgPT0gVG9rZW4uRVFVQUwpIHsKKyAgICAgICAgICAgIC8vIGxldHMgdHVybiB2YXJpYWJsZSBhc3NpZ25tZW50cyBpbnRvIHByb3BlcnR5IGFzc2lnbm1lbnRzCisgICAgICAgICAgICBFeHByZXNzaW9uIGxlZnQgPSBleHByZXNzaW9uLmdldExlZnRFeHByZXNzaW9uKCk7CisgICAgICAgICAgICBpZiAobGVmdCBpbnN0YW5jZW9mIFZhcmlhYmxlRXhwcmVzc2lvbikgeworICAgICAgICAgICAgICAgIFZhcmlhYmxlRXhwcmVzc2lvbiB2YXJFeHAgPSAoVmFyaWFibGVFeHByZXNzaW9uKSBsZWZ0OworCisgICAgICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIkNvbnZlcnRpbmcgdmFyaWFibGUgZXhwcmVzc2lvbjogIiArIHZhckV4cC5nZXRWYXJpYWJsZSgpKTsKKworICAgICAgICAgICAgICAgIFByb3BlcnR5RXhwcmVzc2lvbiBwcm9wRXhwID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IFByb3BlcnR5RXhwcmVzc2lvbihWYXJpYWJsZUV4cHJlc3Npb24uVEhJU19FWFBSRVNTSU9OLCB2YXJFeHAuZ2V0VmFyaWFibGUoKSk7CisgICAgICAgICAgICAgICAgZXhwcmVzc2lvbi5zZXRMZWZ0RXhwcmVzc2lvbihwcm9wRXhwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAqLworICAgICAgICBzdXBlci52aXNpdEJpbmFyeUV4cHJlc3Npb24oZXhwcmVzc2lvbik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydFZhbGlkSWRlbnRpZmllcihTdHJpbmcgbmFtZSwgU3RyaW5nIG1lc3NhZ2UsIEFTVE5vZGUgbm9kZSkgeworICAgICAgICBpbnQgc2l6ZSA9IG5hbWUubGVuZ3RoKCk7CisgICAgICAgIGlmIChzaXplIDw9IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lUGFyc2VyRXhjZXB0aW9uKCJJbnZhbGlkICIgKyBtZXNzYWdlICsgIi4gSWRlbnRpZmllciBtdXN0IG5vdCBiZSBlbXB0eSIsIG5vZGUpOworICAgICAgICB9CisgICAgICAgIGNoYXIgZmlyc3RDaCA9IG5hbWUuY2hhckF0KDApOworICAgICAgICBpZiAoIUNoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoZmlyc3RDaCkgfHwgZmlyc3RDaCA9PSAnJCcpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lUGFyc2VyRXhjZXB0aW9uKCJJbnZhbGlkICIgKyBtZXNzYWdlICsgIi4gTXVzdCBzdGFydCB3aXRoIGEgbGV0dGVyIGJ1dCB3YXM6ICIgKyBuYW1lLCBub2RlKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBjaGFyIGNoID0gbmFtZS5jaGFyQXQoaSk7CisgICAgICAgICAgICBpZiAoIUNoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChjaCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZVBhcnNlckV4Y2VwdGlvbigiSW52YWxpZCAiICsgbWVzc2FnZSArICIuIEludmFsaWQgY2hhcmFjdGVyIGF0IHBvc2l0aW9uOiAiICsgKGkgKyAxKSArICIgb2YgdmFsdWU6ICAiICsgY2ggKyAiIGluIG5hbWU6ICIgKyBuYW1lLCBub2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB2aXNpdExpc3RFeHByZXNzaW9uKExpc3RFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKyAgICAgICAgTGlzdCBleHByZXNzaW9ucyA9IGV4cHJlc3Npb24uZ2V0RXhwcmVzc2lvbnMoKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gZXhwcmVzc2lvbnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOworICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNYXBFbnRyeUV4cHJlc3Npb24pIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZVBhcnNlckV4Y2VwdGlvbiAoIm5vIG1hcCBlbnRyeSBhbGxvd2VkIGF0IHRoaXMgcGxhY2UiLChFeHByZXNzaW9uKSBlbGVtZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdXBlci52aXNpdExpc3RFeHByZXNzaW9uKGV4cHJlc3Npb24pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL3BhY2thZ2UuaHRtbCBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDY5MjIxCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsOCBAQAorPGh0bWw+CisgIDxoZWFkPgorICAgIDx0aXRsZT5wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW4uKjwvdGl0bGU+CisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgPHA+R2VuZXJhdGVzIEphdmEgY2xhc3NlcyBmb3IgR3Jvb3Z5IGNsYXNzZXMgdXNpbmcgQVNNLjwvcD4KKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY29udHJvbC9Db21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbi5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY29udHJvbC9Db21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNzM5MzEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9jb250cm9sL0NvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sOworCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbjsKKworCisvKioKKyAqIFRocm93biB3aGVuIGNvbXBpbGF0aW9uIGZhaWxzIGZyb20gc291cmNlIGVycm9ycy4KKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpjcG9pcmllckBkcmVhbWluZy5vcmciPkNocmlzIFBvaXJpZXI8L2E+CisgKiBAdmVyc2lvbiAkSWQkCisgKi8KKworcHVibGljIGNsYXNzIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uIGV4dGVuZHMgR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbiB7CisKKyAgICBwcm90ZWN0ZWQgaW50IHBoYXNlOyAgIC8vIFRoZSBwaGFzZSBpbiB3aGljaCB0aGUgZmFpbHVyZXMgb2NjdXJyZWQKKyAgICBwcm90ZWN0ZWQgUHJvY2Vzc2luZ1VuaXQgdW5pdDsgICAgLy8gVGhlICpVbml0IG9iamVjdCB0aGlzIGV4Y2VwdGlvbiB3cmFwcworCisgICAgcHVibGljIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uKGludCBwaGFzZSwgUHJvY2Vzc2luZ1VuaXQgdW5pdCwgVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgICAgIHN1cGVyKFBoYXNlcy5nZXREZXNjcmlwdGlvbihwaGFzZSkgKyAiIGZhaWxlZCIsIGNhdXNlKTsKKyAgICAgICAgdGhpcy5waGFzZSA9IHBoYXNlOworICAgICAgICB0aGlzLnVuaXQgPSB1bml0OworICAgIH0KKworCisgICAgcHVibGljIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uKGludCBwaGFzZSwgUHJvY2Vzc2luZ1VuaXQgdW5pdCkgeworICAgICAgICBzdXBlcihQaGFzZXMuZ2V0RGVzY3JpcHRpb24ocGhhc2UpICsgIiBmYWlsZWQiKTsKKyAgICAgICAgdGhpcy5waGFzZSA9IHBoYXNlOworICAgICAgICB0aGlzLnVuaXQgPSB1bml0OworICAgIH0KKworCisgICAgLyoqCisgICAgICogRm9ybWF0cyB0aGUgZXJyb3IgZGF0YSBhcyBhIFN0cmluZy4KKyAgICAgKi8KKworICAgIC8qcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIGRhdGEgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IG5ldyBQcmludFdyaXRlcihkYXRhKTsKKyAgICAgICAgSmFuaXRvciBqYW5pdG9yID0gbmV3IEphbml0b3IoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgdW5pdC5nZXRFcnJvclJlcG9ydGVyKCkud3JpdGUod3JpdGVyLCBqYW5pdG9yKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgIGphbml0b3IuY2xlYW51cCgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGRhdGEudG9TdHJpbmcoKTsKKyAgICB9Ki8KKworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgUHJvY2Vzc2luZ1VuaXQgaW4gd2hpY2ggdGhlIGVycm9yIG9jY3VycmVkLgorICAgICAqLworCisgICAgcHVibGljIFByb2Nlc3NpbmdVbml0IGdldFVuaXQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnVuaXQ7CisgICAgfQorCit9CisKKworCisKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NvbnRyb2wvQ29tcGlsYXRpb25Vbml0LmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9jb250cm9sL0NvbXBpbGF0aW9uVW5pdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMTM5MDEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9jb250cm9sL0NvbXBpbGF0aW9uVW5pdC5qYXZhCkBAIC0wLDAgKzEsOTQ5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkNvZGVTb3VyY2U7CitpbXBvcnQgamF2YS51dGlsLio7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5Lkdyb292eUJ1Z0Vycm9yOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LkFTVE5vZGU7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuQ2xhc3NOb2RlOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LkNvbXBpbGVVbml0OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0Lk1vZHVsZU5vZGU7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbi5Bc21DbGFzc0dlbmVyYXRvcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuLkNsYXNzQ29tcGxldGlvblZlcmlmaWVyOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW4uQ2xhc3NHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbi5FbnVtVmlzaXRvcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuLkV4dGVuZGVkVmVyaWZpZXI7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbi5HZW5lcmF0b3JDb250ZXh0OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW4uVmFyaWFibGVTY29wZVZpc2l0b3I7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbi5WZXJpZmllcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuaW8uSW5wdXRTdHJlYW1SZWFkZXJTb3VyY2U7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLmlvLlJlYWRlclNvdXJjZTsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wubWVzc2FnZXMuRXhjZXB0aW9uTWVzc2FnZTsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wubWVzc2FnZXMuTWVzc2FnZTsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wubWVzc2FnZXMuU2ltcGxlTWVzc2FnZTsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5TeW50YXhFeGNlcHRpb247CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5Hcm9vdnlDbGFzczsKK2ltcG9ydCBvcmcub2JqZWN0d2ViLmFzbS5DbGFzc1Zpc2l0b3I7CitpbXBvcnQgb3JnLm9iamVjdHdlYi5hc20uQ2xhc3NXcml0ZXI7CisKK2ltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlDbGFzc0xvYWRlcjsKK2ltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlSdW50aW1lRXhjZXB0aW9uOworCisvKioKKyAqIENvbGxlY3RzIGFsbCBjb21waWxhdGlvbiBkYXRhIGFzIGl0IGlzIGdlbmVyYXRlZCBieSB0aGUgY29tcGlsZXIgc3lzdGVtLgorICogQWxsb3dzIGFkZGl0aW9uYWwgc291cmNlIHVuaXRzIHRvIGJlIGFkZGVkIGFuZCBjb21waWxhdGlvbiBydW4gYWdhaW4gKHRvCisgKiBhZmZlY3Qgb25seSB0aGUgZGVsdGFzKS4KKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpjcG9pcmllckBkcmVhbWluZy5vcmciPkNocmlzIFBvaXJpZXI8L2E+CisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpibGFja2RyYWdAZ214Lm9yZyI+Sm9jaGVuIFRoZW9kb3JvdTwvYT4KKyAqIEB2ZXJzaW9uICRJZCQKKyAqLworCitwdWJsaWMgY2xhc3MgQ29tcGlsYXRpb25Vbml0IGV4dGVuZHMgUHJvY2Vzc2luZ1VuaXQgeworCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBDT05TVFJVQ1RJT04gQU5EIFNVQ0gKKworCisgICAgcHJvdGVjdGVkIE1hcCBzb3VyY2VzOyAgICAvLyBUaGUgU291cmNlVW5pdHMgZnJvbSB3aGljaCB0aGlzIHVuaXQgaXMgYnVpbHQKKyAgICBwcm90ZWN0ZWQgTWFwIHN1bW1hcmllc0J5U291cmNlTmFtZTsgICAgICAvLyBTdW1tYXJ5IG9mIGVhY2ggU291cmNlVW5pdAorICAgIHByb3RlY3RlZCBNYXAgc3VtbWFyaWVzQnlQdWJsaWNDbGFzc05hbWU7ICAgICAgIC8vIFN1bW1hcnkgb2YgZWFjaCBTb3VyY2VVbml0CisgICAgcHJvdGVjdGVkIE1hcCBjbGFzc1NvdXJjZXNCeVB1YmxpY0NsYXNzTmFtZTsgICAgLy8gU3VtbWFyeSBvZiBlYWNoIENsYXNzCisgICAgcHJvdGVjdGVkIExpc3QgbmFtZXM7ICAgICAgLy8gTmFtZXMgZm9yIGVhY2ggU291cmNlVW5pdCBpbiBzb3VyY2VzLgorICAgIHByb3RlY3RlZCBMaW5rZWRMaXN0IHF1ZXVlZFNvdXJjZXM7CisKKyAgICBwcm90ZWN0ZWQgQ29tcGlsZVVuaXQgYXN0OyAgICAgICAgLy8gVGhlIG92ZXJhbGwgQVNUIGZvciB0aGlzIENvbXBpbGF0aW9uVW5pdC4KKyAgICBwcm90ZWN0ZWQgTGlzdCBnZW5lcmF0ZWRDbGFzc2VzOyAgICAvLyBUaGUgY2xhc3NlcyBnZW5lcmF0ZWQgZHVyaW5nIGNsYXNzZ2VuLgorCisgICAgcHJvdGVjdGVkIFZlcmlmaWVyIHZlcmlmaWVyOyAgIC8vIEZvciB1c2UgYnkgdmVyaWZ5KCkuCisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBkZWJ1ZzsgICAgICAvLyBDb250cm9scyBiZWhhdmlvdXIgb2YgY2xhc3NnZW4oKSBhbmQgb3RoZXIgcm91dGluZXMuCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gY29uZmlndXJlZDsgLy8gU2V0IHRydWUgYWZ0ZXIgdGhlIGZpcnN0IGNvbmZpZ3VyZSgpIG9wZXJhdGlvbgorCisgICAgcHJvdGVjdGVkIENsYXNzZ2VuQ2FsbGJhY2sgY2xhc3NnZW5DYWxsYmFjazsgIC8vIEEgY2FsbGJhY2sgZm9yIHVzZSBkdXJpbmcgY2xhc3NnZW4oKQorICAgIHByb3RlY3RlZCBQcm9ncmVzc0NhbGxiYWNrIHByb2dyZXNzQ2FsbGJhY2s7ICAvLyBBIGNhbGxiYWNrIGZvciB1c2UgZHVyaW5nIGNvbXBpbGUoKQorICAgIHByb3RlY3RlZCBSZXNvbHZlVmlzaXRvciByZXNvbHZlVmlzaXRvcjsKKyAgICBwcm90ZWN0ZWQgU3RhdGljSW1wb3J0VmlzaXRvciBzdGF0aWNJbXBvcnRWaXNpdG9yOworCisgICAgTGlua2VkTGlzdFtdIHBoYXNlT3BlcmF0aW9uczsKKworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZXMgdGhlIENvbXBpbGF0aW9uVW5pdCB3aXRoIGRlZmF1bHRzLgorICAgICAqLworICAgIHB1YmxpYyBDb21waWxhdGlvblVuaXQoKSB7CisgICAgICAgIHRoaXMobnVsbCwgbnVsbCwgbnVsbCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplcyB0aGUgQ29tcGlsYXRpb25Vbml0IHdpdGggZGVmYXVsdHMgZXhjZXB0IGZvciBjbGFzcyBsb2FkZXIuCisgICAgICovCisgICAgcHVibGljIENvbXBpbGF0aW9uVW5pdChHcm9vdnlDbGFzc0xvYWRlciBsb2FkZXIpIHsKKyAgICAgICAgdGhpcyhudWxsLCBudWxsLCBsb2FkZXIpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZXMgdGhlIENvbXBpbGF0aW9uVW5pdCB3aXRoIG5vIHNlY3VyaXR5IGNvbnNpZGVyYXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBDb21waWxhdGlvblVuaXQoQ29tcGlsZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKKyAgICAgICAgdGhpcyhjb25maWd1cmF0aW9uLCBudWxsLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplcyB0aGUgQ29tcGlsYXRpb25Vbml0IHdpdGggYSBDb2RlU291cmNlIGZvciBjb250cm9sbGluZworICAgICAqIHNlY3VyaXR5IHN0dWZmIGFuZCBhIGNsYXNzIGxvYWRlciBmb3IgbG9hZGluZyBjbGFzc2VzLgorICAgICAqLworICAgIHB1YmxpYyBDb21waWxhdGlvblVuaXQoQ29tcGlsZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sIENvZGVTb3VyY2Ugc2VjdXJpdHksIEdyb292eUNsYXNzTG9hZGVyIGxvYWRlcikgeworICAgICAgICBzdXBlcihjb25maWd1cmF0aW9uLCBsb2FkZXIsIG51bGwpOworICAgICAgICB0aGlzLm5hbWVzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICB0aGlzLnF1ZXVlZFNvdXJjZXMgPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICB0aGlzLnNvdXJjZXMgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICB0aGlzLnN1bW1hcmllc0J5U291cmNlTmFtZSA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIHRoaXMuc3VtbWFyaWVzQnlQdWJsaWNDbGFzc05hbWUgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICB0aGlzLmNsYXNzU291cmNlc0J5UHVibGljQ2xhc3NOYW1lID0gbmV3IEhhc2hNYXAoKTsKKworICAgICAgICB0aGlzLmFzdCA9IG5ldyBDb21waWxlVW5pdCh0aGlzLmNsYXNzTG9hZGVyLCBzZWN1cml0eSwgdGhpcy5jb25maWd1cmF0aW9uKTsKKyAgICAgICAgdGhpcy5nZW5lcmF0ZWRDbGFzc2VzID0gbmV3IEFycmF5TGlzdCgpOworCisKKyAgICAgICAgdGhpcy52ZXJpZmllciA9IG5ldyBWZXJpZmllcigpOworICAgICAgICB0aGlzLnJlc29sdmVWaXNpdG9yID0gbmV3IFJlc29sdmVWaXNpdG9yKHRoaXMpOworICAgICAgICB0aGlzLnN0YXRpY0ltcG9ydFZpc2l0b3IgPSBuZXcgU3RhdGljSW1wb3J0VmlzaXRvcih0aGlzKTsKKworICAgICAgICBwaGFzZU9wZXJhdGlvbnMgPSBuZXcgTGlua2VkTGlzdFtQaGFzZXMuQUxMICsgMV07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGhhc2VPcGVyYXRpb25zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBwaGFzZU9wZXJhdGlvbnNbaV0gPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICB9CisgICAgICAgIGFkZFBoYXNlT3BlcmF0aW9uKG5ldyBTb3VyY2VVbml0T3BlcmF0aW9uKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgY2FsbChTb3VyY2VVbml0IHNvdXJjZSkgdGhyb3dzIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBzb3VyY2UucGFyc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwgUGhhc2VzLlBBUlNJTkcpOworICAgICAgICBhZGRQaGFzZU9wZXJhdGlvbihjb252ZXJ0LCBQaGFzZXMuQ09OVkVSU0lPTik7CisgICAgICAgIGFkZFBoYXNlT3BlcmF0aW9uKG5ldyBQcmltYXJ5Q2xhc3NOb2RlT3BlcmF0aW9uKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgY2FsbChTb3VyY2VVbml0IHNvdXJjZSwgR2VuZXJhdG9yQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc05vZGUgY2xhc3NOb2RlKSB0aHJvd3MgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24geworICAgICAgICAgICAgICAgIEVudW1WaXNpdG9yIGV2ID0gbmV3IEVudW1WaXNpdG9yKENvbXBpbGF0aW9uVW5pdC50aGlzLCBzb3VyY2UpOworICAgICAgICAgICAgICAgIGV2LnZpc2l0Q2xhc3MoY2xhc3NOb2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwgUGhhc2VzLkNPTlZFUlNJT04pOworICAgICAgICBhZGRQaGFzZU9wZXJhdGlvbihyZXNvbHZlLCBQaGFzZXMuU0VNQU5USUNfQU5BTFlTSVMpOworICAgICAgICBhZGRQaGFzZU9wZXJhdGlvbihzdGF0aWNJbXBvcnQsIFBoYXNlcy5TRU1BTlRJQ19BTkFMWVNJUyk7CisgICAgICAgIGFkZFBoYXNlT3BlcmF0aW9uKGNvbXBpbGVDb21wbGV0ZUNoZWNrLCBQaGFzZXMuQ0FOT05JQ0FMSVpBVElPTik7CisgICAgICAgIGFkZFBoYXNlT3BlcmF0aW9uKGNsYXNzZ2VuLCBQaGFzZXMuQ0xBU1NfR0VORVJBVElPTik7CisgICAgICAgIGFkZFBoYXNlT3BlcmF0aW9uKG91dHB1dCk7CisKKyAgICAgICAgdGhpcy5jbGFzc2dlbkNhbGxiYWNrID0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRQaGFzZU9wZXJhdGlvbihTb3VyY2VVbml0T3BlcmF0aW9uIG9wLCBpbnQgcGhhc2UpIHsKKyAgICAgICAgaWYgKHBoYXNlIDwgMCB8fCBwaGFzZSA+IFBoYXNlcy5BTEwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBoYXNlICIgKyBwaGFzZSArICIgaXMgdW5rbm93biIpOworICAgICAgICBwaGFzZU9wZXJhdGlvbnNbcGhhc2VdLmFkZChvcCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkUGhhc2VPcGVyYXRpb24oUHJpbWFyeUNsYXNzTm9kZU9wZXJhdGlvbiBvcCwgaW50IHBoYXNlKSB7CisgICAgICAgIGlmIChwaGFzZSA8IDAgfHwgcGhhc2UgPiBQaGFzZXMuQUxMKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwaGFzZSAiICsgcGhhc2UgKyAiIGlzIHVua25vd24iKTsKKyAgICAgICAgcGhhc2VPcGVyYXRpb25zW3BoYXNlXS5hZGQob3ApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZFBoYXNlT3BlcmF0aW9uKEdyb292eUNsYXNzT3BlcmF0aW9uIG9wKSB7CisgICAgICAgIHBoYXNlT3BlcmF0aW9uc1tQaGFzZXMuT1VUUFVUXS5hZGRGaXJzdChvcCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmVzIGl0cyBkZWJ1Z2dpbmcgbW9kZSBhbmQgY2xhc3Nsb2FkZXIgY2xhc3NwYXRoIGZyb20gYSBnaXZlbiBjb21waWxlciBjb25maWd1cmF0aW9uLgorICAgICAqIFRoaXMgY2Fubm90IGJlIGRvbmUgbW9yZSB0aGFuIG9uY2UgZHVlIHRvIGxpbWl0YXRpb25zIGluIHtAbGluayBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlciBVUkxDbGFzc0xvYWRlcn0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgY29uZmlndXJlKENvbXBpbGVyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7CisgICAgICAgIHN1cGVyLmNvbmZpZ3VyZShjb25maWd1cmF0aW9uKTsKKyAgICAgICAgdGhpcy5kZWJ1ZyA9IGNvbmZpZ3VyYXRpb24uZ2V0RGVidWcoKTsKKworICAgICAgICBpZiAoIXRoaXMuY29uZmlndXJlZCAmJiB0aGlzLmNsYXNzTG9hZGVyIGluc3RhbmNlb2YgR3Jvb3Z5Q2xhc3NMb2FkZXIpIHsKKyAgICAgICAgICAgIGFwcGVuZENvbXBpbGVyQ29uZmlndXJhdGlvbkNsYXNzcGF0aFRvQ2xhc3NMb2FkZXIoY29uZmlndXJhdGlvbiwgKEdyb292eUNsYXNzTG9hZGVyKSB0aGlzLmNsYXNzTG9hZGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuY29uZmlndXJlZCA9IHRydWU7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFwcGVuZENvbXBpbGVyQ29uZmlndXJhdGlvbkNsYXNzcGF0aFRvQ2xhc3NMb2FkZXIoQ29tcGlsZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sIEdyb292eUNsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB7CisgICAgICAgIC8qZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGNvbmZpZ3VyYXRpb24uZ2V0Q2xhc3NwYXRoKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApIHsKKyAgICAgICAgICAgIGNsYXNzTG9hZGVyLmFkZENsYXNzcGF0aCgoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCkpOworICAgICAgICB9Ki8KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBDb21waWxlVW5pdCB0aGF0IHJvb3RzIG91ciBBU1QuCisgICAgICovCisgICAgcHVibGljIENvbXBpbGVVbml0IGdldEFTVCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuYXN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgc291cmNlIHN1bW1hcmllcworICAgICAqLworICAgIHB1YmxpYyBNYXAgZ2V0U3VtbWFyaWVzQnlTb3VyY2VOYW1lKCkgeworICAgICAgICByZXR1cm4gc3VtbWFyaWVzQnlTb3VyY2VOYW1lOworICAgIH0KKworICAgIHB1YmxpYyBNYXAgZ2V0U3VtbWFyaWVzQnlQdWJsaWNDbGFzc05hbWUoKSB7CisgICAgICAgIHJldHVybiBzdW1tYXJpZXNCeVB1YmxpY0NsYXNzTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWFwIGdldENsYXNzU291cmNlc0J5UHVibGljQ2xhc3NOYW1lKCkgeworICAgICAgICByZXR1cm4gY2xhc3NTb3VyY2VzQnlQdWJsaWNDbGFzc05hbWU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNQdWJsaWNDbGFzcyhTdHJpbmcgY2xhc3NOYW1lKSB7CisgICAgICAgIHJldHVybiBzdW1tYXJpZXNCeVB1YmxpY0NsYXNzTmFtZS5jb250YWluc0tleShjbGFzc05hbWUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBHcm9vdnlDbGFzc2VzIGdlbmVyYXRlZCBieSBjb21waWxlKCkuCisgICAgICovCisgICAgcHVibGljIExpc3QgZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgcmV0dXJuIGdlbmVyYXRlZENsYXNzZXM7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSByb3V0aW5lIHRvIGdldCB0aGUgZmlyc3QgQ2xhc3NOb2RlLCBmb3IKKyAgICAgKiB3aGVuIHlvdSBhcmUgc3VyZSB0aGVyZSBpcyBvbmx5IG9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NOb2RlIGdldEZpcnN0Q2xhc3NOb2RlKCkgeworICAgICAgICByZXR1cm4gKENsYXNzTm9kZSkgKChNb2R1bGVOb2RlKSB0aGlzLmFzdC5nZXRNb2R1bGVzKCkuZ2V0KDApKS5nZXRDbGFzc2VzKCkuZ2V0KDApOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29udmVuaWVuY2Ugcm91dGluZSB0byBnZXQgdGhlIG5hbWVkIENsYXNzTm9kZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NOb2RlIGdldENsYXNzTm9kZShmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICBmaW5hbCBDbGFzc05vZGVbXSByZXN1bHQgPSBuZXcgQ2xhc3NOb2RlW117bnVsbH07CisgICAgICAgIFByaW1hcnlDbGFzc05vZGVPcGVyYXRpb24gaGFuZGxlciA9IG5ldyBQcmltYXJ5Q2xhc3NOb2RlT3BlcmF0aW9uKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgY2FsbChTb3VyY2VVbml0IHNvdXJjZSwgR2VuZXJhdG9yQ29udGV4dCBjb250ZXh0LCBDbGFzc05vZGUgY2xhc3NOb2RlKSB7CisgICAgICAgICAgICAgICAgaWYgKGNsYXNzTm9kZS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFswXSA9IGNsYXNzTm9kZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFwcGx5VG9QcmltYXJ5Q2xhc3NOb2RlcyhoYW5kbGVyKTsKKyAgICAgICAgfSBjYXRjaCAoQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaWYgKGRlYnVnKSBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHRbMF07CisgICAgfQorCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBTT1VSQ0UgQ1JFQVRJT04KKworCisgICAgLyoqCisgICAgICogQWRkcyBhIHNldCBvZiBmaWxlIHBhdGhzIHRvIHRoZSB1bml0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFNvdXJjZXMoU3RyaW5nW10gcGF0aHMpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXRocy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUocGF0aHNbaV0pOworICAgICAgICAgICAgYWRkU291cmNlKGZpbGUpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgc2V0IG9mIHNvdXJjZSBmaWxlcyB0byB0aGUgdW5pdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRTb3VyY2VzKEZpbGVbXSBmaWxlcykgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBhZGRTb3VyY2UoZmlsZXNbaV0pOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgc291cmNlIGZpbGUgdG8gdGhlIHVuaXQuCisgICAgICovCisgICAgcHVibGljIFNvdXJjZVVuaXQgYWRkU291cmNlKEZpbGUgZmlsZSkgeworICAgICAgICByZXR1cm4gYWRkU291cmNlKG5ldyBTb3VyY2VVbml0KGZpbGUsIGNvbmZpZ3VyYXRpb24sIGNsYXNzTG9hZGVyLCBnZXRFcnJvckNvbGxlY3RvcigpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIHNvdXJjZSBmaWxlIHRvIHRoZSB1bml0LgorICAgICAqLworICAgIHB1YmxpYyBTb3VyY2VVbml0IGFkZFNvdXJjZShVUkwgdXJsKSB7CisgICAgICAgIHJldHVybiBhZGRTb3VyY2UobmV3IFNvdXJjZVVuaXQodXJsLCBjb25maWd1cmF0aW9uLCBjbGFzc0xvYWRlciwgZ2V0RXJyb3JDb2xsZWN0b3IoKSkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkcyBhIElucHV0U3RyZWFtIHNvdXJjZSB0byB0aGUgdW5pdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU291cmNlVW5pdCBhZGRTb3VyY2UoU3RyaW5nIG5hbWUsIElucHV0U3RyZWFtIHN0cmVhbSkgeworICAgICAgICBSZWFkZXJTb3VyY2Ugc291cmNlID0gbmV3IElucHV0U3RyZWFtUmVhZGVyU291cmNlKHN0cmVhbSwgY29uZmlndXJhdGlvbik7CisgICAgICAgIHJldHVybiBhZGRTb3VyY2UobmV3IFNvdXJjZVVuaXQobmFtZSwgc291cmNlLCBjb25maWd1cmF0aW9uLCBjbGFzc0xvYWRlciwgZ2V0RXJyb3JDb2xsZWN0b3IoKSkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkcyBhIFNvdXJjZVVuaXQgdG8gdGhlIHVuaXQuCisgICAgICovCisgICAgcHVibGljIFNvdXJjZVVuaXQgYWRkU291cmNlKFNvdXJjZVVuaXQgc291cmNlKSB7CisgICAgICAgIFN0cmluZyBuYW1lID0gc291cmNlLmdldE5hbWUoKTsKKyAgICAgICAgc291cmNlLnNldENsYXNzTG9hZGVyKHRoaXMuY2xhc3NMb2FkZXIpOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBxdWV1ZWRTb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgU291cmNlVW5pdCBzdSA9IChTb3VyY2VVbml0KSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscyhzdS5nZXROYW1lKCkpKSByZXR1cm4gc3U7CisgICAgICAgIH0KKyAgICAgICAgcXVldWVkU291cmNlcy5hZGQoc291cmNlKTsKKyAgICAgICAgcmV0dXJuIHNvdXJjZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYW4gaXRlcmF0b3Igb24gdGhlIHVuaXQncyBTb3VyY2VVbml0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7CisgICAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoKSB7CisgICAgICAgICAgICBJdGVyYXRvciBuYW1lSXRlcmF0b3IgPSBuYW1lcy5pdGVyYXRvcigpOworCisKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5hbWVJdGVyYXRvci5oYXNOZXh0KCk7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgcHVibGljIE9iamVjdCBuZXh0KCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgbmFtZUl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gc291cmNlcy5nZXQobmFtZSk7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworCisgICAgLyoqCisgICAgICogQWRkcyBhIENsYXNzTm9kZSBkaXJlY3RseSB0byB0aGUgdW5pdCAoaWUuIHdpdGhvdXQgc291cmNlKS4KKyAgICAgKiBXQVJOSU5HOiB0aGUgc291cmNlIGlzIG5lZWRlZCBmb3IgZXJyb3IgcmVwb3J0aW5nLCB1c2luZworICAgICAqIHRoaXMgbWV0aG9kIHdpdGhvdXQgc2V0dGluZyBhIFNvdXJjZVVuaXQgd2lsbCBjYXVzZQorICAgICAqIE51bGxQaW50ZXJFeGNlcHRpb25zCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ2xhc3NOb2RlKENsYXNzTm9kZSBub2RlKSB7CisgICAgICAgIE1vZHVsZU5vZGUgbW9kdWxlID0gbmV3IE1vZHVsZU5vZGUodGhpcy5hc3QpOworICAgICAgICB0aGlzLmFzdC5hZGRNb2R1bGUobW9kdWxlKTsKKyAgICAgICAgbW9kdWxlLmFkZENsYXNzKG5vZGUpOworICAgIH0KKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gRVhURVJOQUwgQ0FMTEJBQ0tTCisKKworICAgIC8qKgorICAgICAqIEEgY2FsbGJhY2sgaW50ZXJmYWNlIHlvdSBjYW4gdXNlIHRvICJhY2NvbXBhbnkiIHRoZSBjbGFzc2dlbigpCisgICAgICogY29kZSBhcyBpdCB0cmF2ZXJzZXMgdGhlIENsYXNzTm9kZSB0cmVlLiAgWW91IHdpbGwgYmUgY2FsbGVkLWJhY2sKKyAgICAgKiBmb3IgZWFjaCBwcmltYXJ5IGFuZCBpbm5lciBjbGFzcy4gIFVzZSBzZXRDbGFzc2dlbkNhbGxiYWNrKCkgYmVmb3JlCisgICAgICogcnVubmluZyBjb21waWxlKCkgdG8gc2V0IHlvdXIgY2FsbGJhY2suCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBDbGFzc2dlbkNhbGxiYWNrIHsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgY2FsbChDbGFzc1Zpc2l0b3Igd3JpdGVyLCBDbGFzc05vZGUgbm9kZSkgdGhyb3dzIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0cyBhIENsYXNzZ2VuQ2FsbGJhY2suICBZb3UgY2FuIGhhdmUgb25seSBvbmUsIGFuZCBzZXR0aW5nCisgICAgICogaXQgdG8gbnVsbCByZW1vdmVzIGFueSBleGlzdGluZyBzZXR0aW5nLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsYXNzZ2VuQ2FsbGJhY2soQ2xhc3NnZW5DYWxsYmFjayB2aXNpdG9yKSB7CisgICAgICAgIHRoaXMuY2xhc3NnZW5DYWxsYmFjayA9IHZpc2l0b3I7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBIGNhbGxiYWNrIGludGVyZmFjZSB5b3UgY2FuIHVzZSB0byBnZXQgYSBjYWxsYmFjayBhZnRlciBldmVyeQorICAgICAqIHVuaXQgb2YgdGhlIGNvbXBpbGUgcHJvY2Vzcy4gIFlvdSB3aWxsIGJlIGNhbGxlZC1iYWNrIHdpdGggYQorICAgICAqIFByb2Nlc3NpbmdVbml0IGFuZCBhIHBoYXNlIGluZGljYXRvci4gIFVzZSBzZXRQcm9ncmVzc0NhbGxiYWNrKCkKKyAgICAgKiBiZWZvcmUgcnVubmluZyBjb21waWxlKCkgdG8gc2V0IHlvdXIgY2FsbGJhY2suCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBQcm9ncmVzc0NhbGxiYWNrIHsKKworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBjYWxsKFByb2Nlc3NpbmdVbml0IGNvbnRleHQsIGludCBwaGFzZSkgdGhyb3dzIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYSBQcm9ncmVzc0NhbGxiYWNrLiAgWW91IGNhbiBoYXZlIG9ubHkgb25lLCBhbmQgc2V0dGluZworICAgICAqIGl0IHRvIG51bGwgcmVtb3ZlcyBhbnkgZXhpc3Rpbmcgc2V0dGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9ncmVzc0NhbGxiYWNrKFByb2dyZXNzQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgdGhpcy5wcm9ncmVzc0NhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgfQorCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBBQ1RJT05TCisKKworICAgIC8qKgorICAgICAqIFN5bm9ueW0gZm9yIGNvbXBpbGUoUGhhc2VzLkFMTCkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY29tcGlsZSgpIHRocm93cyBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbXBpbGUoUGhhc2VzLkFMTCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGlsZXMgdGhlIGNvbXBpbGF0aW9uIHVuaXQgZnJvbSBzb3VyY2VzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvbXBpbGUoaW50IHRocm91Z2hQaGFzZSkgdGhyb3dzIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVG8gc3VwcG9ydCBkZWx0YSBjb21waWxhdGlvbnMsIHdlIGFsd2F5cyByZXN0YXJ0CisgICAgICAgIC8vIHRoZSBjb21waWxlci4gIFRoZSBpbmRpdmlkdWFsIHBhc3NlcyBhcmUgcmVzcG9uc2libGUKKyAgICAgICAgLy8gZm9yIG5vdCByZXByb2Nlc3Npbmcgb2xkIGNvZGUuCisgICAgICAgIGdvdG9QaGFzZShQaGFzZXMuSU5JVElBTElaQVRJT04pOworICAgICAgICB0aHJvdWdoUGhhc2UgPSBNYXRoLm1pbih0aHJvdWdoUGhhc2UsIFBoYXNlcy5BTEwpOworCisgICAgICAgIHdoaWxlICh0aHJvdWdoUGhhc2UgPj0gcGhhc2UgJiYgcGhhc2UgPD0gUGhhc2VzLkFMTCkgeworCisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gcGhhc2VPcGVyYXRpb25zW3BoYXNlXS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgT2JqZWN0IG9wZXJhdGlvbiA9IGl0Lm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAob3BlcmF0aW9uIGluc3RhbmNlb2YgUHJpbWFyeUNsYXNzTm9kZU9wZXJhdGlvbikgeworICAgICAgICAgICAgICAgICAgICBhcHBseVRvUHJpbWFyeUNsYXNzTm9kZXMoKFByaW1hcnlDbGFzc05vZGVPcGVyYXRpb24pIG9wZXJhdGlvbik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBTb3VyY2VVbml0T3BlcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIGFwcGx5VG9Tb3VyY2VVbml0cygoU291cmNlVW5pdE9wZXJhdGlvbikgb3BlcmF0aW9uKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhcHBseVRvR2VuZXJhdGVkR3Jvb3Z5Q2xhc3NlcygoR3Jvb3Z5Q2xhc3NPcGVyYXRpb24pIG9wZXJhdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocHJvZ3Jlc3NDYWxsYmFjayAhPSBudWxsKSBwcm9ncmVzc0NhbGxiYWNrLmNhbGwodGhpcywgcGhhc2UpOworICAgICAgICAgICAgY29tcGxldGVQaGFzZSgpOworICAgICAgICAgICAgYXBwbHlUb1NvdXJjZVVuaXRzKG1hcmspOworCisgICAgICAgICAgICBpZiAoZGVxdWV1ZWQoKSkgY29udGludWU7CisKKyAgICAgICAgICAgIGdvdG9QaGFzZShwaGFzZSArIDEpOworCisgICAgICAgICAgICBpZiAocGhhc2UgPT0gUGhhc2VzLkNMQVNTX0dFTkVSQVRJT04pIHsKKyAgICAgICAgICAgICAgICBzb3J0Q2xhc3NlcygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZXJyb3JDb2xsZWN0b3IuZmFpbElmRXJyb3JzKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNvcnRDbGFzc2VzKCkgdGhyb3dzIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uIHsKKyAgICAgICAgSXRlcmF0b3IgbW9kdWxlcyA9IHRoaXMuYXN0LmdldE1vZHVsZXMoKS5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAobW9kdWxlcy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIE1vZHVsZU5vZGUgbW9kdWxlID0gKE1vZHVsZU5vZGUpIG1vZHVsZXMubmV4dCgpOworCisgICAgICAgICAgICAvLyBiZWZvcmUgd2UgYWN0dWFsbHkgZG8gdGhlIHNvcnRpbmcgd2Ugc2hvdWxkIGNoZWNrCisgICAgICAgICAgICAvLyBmb3IgY3ljbGljIHJlZmVyZW5jZXMKKyAgICAgICAgICAgIExpc3QgY2xhc3NlcyA9IG1vZHVsZS5nZXRDbGFzc2VzKCk7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjbGFzc2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIENsYXNzTm9kZSBzdGFydCA9IChDbGFzc05vZGUpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIENsYXNzTm9kZSBjbiA9IHN0YXJ0OworICAgICAgICAgICAgICAgIFNldCBwYXJlbnRzID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnRzLmNvbnRhaW5zKGNuLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldEVycm9yQ29sbGVjdG9yKCkuYWRkRXJyb3JBbmRDb250aW51ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNpbXBsZU1lc3NhZ2UoImN5Y2xpYyBpbmhlcml0YW5jZSBpbnZvbHZpbmcgIiArIGNuLmdldE5hbWUoKSArICIgaW4gY2xhc3MgIiArIHN0YXJ0LmdldE5hbWUoKSwgdGhpcykKKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgICAgICBjbiA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRzLmFkZChjbi5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgY24gPSBjbi5nZXRTdXBlckNsYXNzKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IHdoaWxlIChjbiAhPSBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVycm9yQ29sbGVjdG9yLmZhaWxJZkVycm9ycygpOworICAgICAgICAgICAgbW9kdWxlLnNvcnRDbGFzc2VzKCk7CisKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogRGVxdWV1ZXMgYW55IHNvdXJjZSB1bml0cyBhZGQgdGhyb3VnaCBhZGRTb3VyY2UgYW5kIHJlc2V0cyB0aGUgY29tcGlsZXIgcGhhc2UKKyAgICAgKiB0byBpbml0aWFsaXphdGlvbi4KKyAgICAgKiA8cC8+CisgICAgICogTm90ZTogdGhpcyBkb2VzIG5vdCBtZWFuIGEgZmlsZSBpcyByZWNvbXBpbGVkLiBJZiBhIFNvdWNyZVVuaXQgaGFzIGFscmVhZHkgcGFzc2VkCisgICAgICogYSBwaGFzZSBpdCBpcyBza2lwcGVkIHVudGlsIGEgaGlnaGVyIHBoYXNlIGlzIHJlYWNoZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlcmUgd2FzIGEgcXVldWVkIHNvdXJjZQorICAgICAqIEB0aHJvd3MgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBkZXF1ZXVlZCgpIHRocm93cyBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbiB7CisgICAgICAgIGJvb2xlYW4gZGVxdWV1ZSA9ICFxdWV1ZWRTb3VyY2VzLmlzRW1wdHkoKTsKKyAgICAgICAgd2hpbGUgKCFxdWV1ZWRTb3VyY2VzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgU291cmNlVW5pdCBzdSA9IChTb3VyY2VVbml0KSBxdWV1ZWRTb3VyY2VzLnJlbW92ZUZpcnN0KCk7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHN1LmdldE5hbWUoKTsKKyAgICAgICAgICAgIG5hbWVzLmFkZChuYW1lKTsKKyAgICAgICAgICAgIHNvdXJjZXMucHV0KG5hbWUsIHN1KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGVxdWV1ZSkgeworICAgICAgICAgICAgZ290b1BoYXNlKFBoYXNlcy5JTklUSUFMSVpBVElPTik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRlcXVldWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzb2x2ZXMgYWxsIHR5cGVzCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBTb3VyY2VVbml0T3BlcmF0aW9uIHJlc29sdmUgPSBuZXcgU291cmNlVW5pdE9wZXJhdGlvbigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgY2FsbChTb3VyY2VVbml0IHNvdXJjZSkgdGhyb3dzIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIExpc3QgY2xhc3NlcyA9IHNvdXJjZS5hc3QuZ2V0Q2xhc3NlcygpOworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGNsYXNzZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIENsYXNzTm9kZSBub2RlID0gKENsYXNzTm9kZSkgaXQubmV4dCgpOworCisgICAgICAgICAgICAgICAgVmFyaWFibGVTY29wZVZpc2l0b3Igc2NvcGVWaXNpdG9yID0gbmV3IFZhcmlhYmxlU2NvcGVWaXNpdG9yKHNvdXJjZSk7CisgICAgICAgICAgICAgICAgc2NvcGVWaXNpdG9yLnZpc2l0Q2xhc3Mobm9kZSk7CisKKyAgICAgICAgICAgICAgICByZXNvbHZlVmlzaXRvci5zdGFydFJlc29sdmluZyhub2RlLCBzb3VyY2UpOworCisgICAgICAgICAgICAgICAgR2VuZXJpY3NWaXNpdG9yIGdlbmVyaWNzVmlzaXRvciA9IG5ldyBHZW5lcmljc1Zpc2l0b3Ioc291cmNlKTsKKyAgICAgICAgICAgICAgICBnZW5lcmljc1Zpc2l0b3IudmlzaXRDbGFzcyhub2RlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgUHJpbWFyeUNsYXNzTm9kZU9wZXJhdGlvbiBzdGF0aWNJbXBvcnQgPSBuZXcgUHJpbWFyeUNsYXNzTm9kZU9wZXJhdGlvbigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgY2FsbChTb3VyY2VVbml0IHNvdXJjZSwgR2VuZXJhdG9yQ29udGV4dCBjb250ZXh0LCBDbGFzc05vZGUgY2xhc3NOb2RlKSB0aHJvd3MgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24geworICAgICAgICAgICAgc3RhdGljSW1wb3J0VmlzaXRvci52aXNpdENsYXNzKGNsYXNzTm9kZSwgc291cmNlKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBSdW5zIGNvbnZlcnQoKSBvbiBhIHNpbmdsZSBTb3VyY2VVbml0LgorICAgICAqLworICAgIHByaXZhdGUgU291cmNlVW5pdE9wZXJhdGlvbiBjb252ZXJ0ID0gbmV3IFNvdXJjZVVuaXRPcGVyYXRpb24oKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIGNhbGwoU291cmNlVW5pdCBzb3VyY2UpIHRocm93cyBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBzb3VyY2UuY29udmVydCgpOworICAgICAgICAgICAgQ29tcGlsYXRpb25Vbml0LnRoaXMuYXN0LmFkZE1vZHVsZShzb3VyY2UuZ2V0QVNUKCkpOworCisKKyAgICAgICAgICAgIGlmIChDb21waWxhdGlvblVuaXQudGhpcy5wcm9ncmVzc0NhbGxiYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBDb21waWxhdGlvblVuaXQudGhpcy5wcm9ncmVzc0NhbGxiYWNrLmNhbGwoc291cmNlLCBDb21waWxhdGlvblVuaXQudGhpcy5waGFzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBHcm9vdnlDbGFzc09wZXJhdGlvbiBvdXRwdXQgPSBuZXcgR3Jvb3Z5Q2xhc3NPcGVyYXRpb24oKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIGNhbGwoR3Jvb3Z5Q2xhc3MgZ2NsYXNzKSB0aHJvd3MgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24geworICAgICAgICAgICAgYm9vbGVhbiBmYWlsdXJlcyA9IGZhbHNlOworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBnY2xhc3MuZ2V0TmFtZSgpLnJlcGxhY2UoJy4nLCBGaWxlLnNlcGFyYXRvckNoYXIpICsgIi5jbGFzcyI7CisgICAgICAgICAgICBGaWxlIHBhdGggPSBuZXcgRmlsZShjb25maWd1cmF0aW9uLmdldFRhcmdldERpcmVjdG9yeSgpLCBuYW1lKTsKKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIEVuc3VyZSB0aGUgcGF0aCBpcyByZWFkeSBmb3IgdGhlIGZpbGUKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBGaWxlIGRpcmVjdG9yeSA9IHBhdGguZ2V0UGFyZW50RmlsZSgpOworICAgICAgICAgICAgaWYgKGRpcmVjdG9yeSAhPSBudWxsICYmICFkaXJlY3RvcnkuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICBkaXJlY3RvcnkubWtkaXJzKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBDcmVhdGUgdGhlIGZpbGUgYW5kIHdyaXRlIG91dCB0aGUgZGF0YQorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IGdjbGFzcy5nZXRCeXRlcygpOworCisgICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHBhdGgpOworICAgICAgICAgICAgICAgIHN0cmVhbS53cml0ZShieXRlcywgMCwgYnl0ZXMubGVuZ3RoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBnZXRFcnJvckNvbGxlY3RvcigpLmFkZEVycm9yKE1lc3NhZ2UuY3JlYXRlKGUuZ2V0TWVzc2FnZSgpLCBDb21waWxhdGlvblVuaXQudGhpcykpOworICAgICAgICAgICAgICAgIGZhaWx1cmVzID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIC8qIGNoZWNrcyBpZiBhbGwgbmVlZGVkIGNsYXNzZXMgYXJlIGNvbXBpbGVkIGJlZm9yZSBnZW5lcmF0aW5nIHRoZSBieXRlY29kZSAqLworICAgIHByaXZhdGUgU291cmNlVW5pdE9wZXJhdGlvbiBjb21waWxlQ29tcGxldGVDaGVjayA9IG5ldyBTb3VyY2VVbml0T3BlcmF0aW9uKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBjYWxsKFNvdXJjZVVuaXQgc291cmNlKSB0aHJvd3MgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24geworICAgICAgICAgICAgTGlzdCBjbGFzc2VzID0gc291cmNlLmFzdC5nZXRDbGFzc2VzKCk7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gY2xhc3Nlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgQ2xhc3NOb2RlIG5vZGUgPSAoQ2xhc3NOb2RlKSBpdC5uZXh0KCk7CisgICAgICAgICAgICAgICAgQ29tcGlsZVVuaXQgY3UgPSBub2RlLmdldENvbXBpbGVVbml0KCk7CisgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gY3UuaXRlcmF0ZUNsYXNzTm9kZVRvQ29tcGlsZSgpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgU291cmNlVW5pdCBzdSA9IGFzdC5nZXRTY3JpcHRTb3VyY2VMb2NhdGlvbihuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgTGlzdCBjbGFzc2VzSW5Tb3VyY2VVbml0ID0gc3UuYXN0LmdldENsYXNzZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIG1lc3NhZ2UgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCJDb21waWxhdGlvbiBpbmNvbXBsZXRlOiBleHBlY3RlZCB0byBmaW5kIHRoZSBjbGFzcyAiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQobmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIgaW4gIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKHN1LmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGFzc2VzSW5Tb3VyY2VVbml0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoIiwgYnV0IHRoZSBmaWxlIHNlZW1zIG5vdCB0byBjb250YWluIGFueSBjbGFzc2VzIik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmFwcGVuZCgiLCBidXQgdGhlIGZpbGUgY29udGFpbnMgdGhlIGNsYXNzZXM6ICIpOworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIHN1Q2xhc3Nlc0l0ZXIgPSBjbGFzc2VzSW5Tb3VyY2VVbml0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pdGVyYXRvcigpOyBzdUNsYXNzZXNJdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc05vZGUgY24gPSAoQ2xhc3NOb2RlKSBzdUNsYXNzZXNJdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpcnN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKGNuLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBnZXRFcnJvckNvbGxlY3RvcigpLmFkZEVycm9yQW5kQ29udGludWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNpbXBsZU1lc3NhZ2UobWVzc2FnZS50b1N0cmluZygpLCBDb21waWxhdGlvblVuaXQudGhpcykKKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgaXRlci5yZW1vdmUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisKKyAgICAvKioKKyAgICAgKiBSdW5zIGNsYXNzZ2VuKCkgb24gYSBzaW5nbGUgQ2xhc3NOb2RlLgorICAgICAqLworICAgIHByaXZhdGUgUHJpbWFyeUNsYXNzTm9kZU9wZXJhdGlvbiBjbGFzc2dlbiA9IG5ldyBQcmltYXJ5Q2xhc3NOb2RlT3BlcmF0aW9uKCkgeworICAgICAgICBwdWJsaWMgYm9vbGVhbiBuZWVkU29ydGVkSW5wdXQoKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGNhbGwoU291cmNlVW5pdCBzb3VyY2UsIEdlbmVyYXRvckNvbnRleHQgY29udGV4dCwgQ2xhc3NOb2RlIGNsYXNzTm9kZSkgdGhyb3dzIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFJ1biB0aGUgVmVyaWZpZXIgb24gdGhlIG91dGVyIGNsYXNzCisgICAgICAgICAgICAvLworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB2ZXJpZmllci52aXNpdENsYXNzKGNsYXNzTm9kZSk7CisgICAgICAgICAgICB9IGNhdGNoIChHcm9vdnlSdW50aW1lRXhjZXB0aW9uIHJwZSkgeworICAgICAgICAgICAgICAgIEFTVE5vZGUgbm9kZSA9IHJwZS5nZXROb2RlKCk7CisgICAgICAgICAgICAgICAgZ2V0RXJyb3JDb2xsZWN0b3IoKS5hZGRFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTeW50YXhFeGNlcHRpb24ocnBlLmdldE1lc3NhZ2UoKSwgbnVsbCwgbm9kZS5nZXRMaW5lTnVtYmVyKCksIG5vZGUuZ2V0Q29sdW1uTnVtYmVyKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTGFiZWxWZXJpZmllciBsdiA9IG5ldyBMYWJlbFZlcmlmaWVyKHNvdXJjZSk7CisgICAgICAgICAgICBsdi52aXNpdENsYXNzKGNsYXNzTm9kZSk7CisKKyAgICAgICAgICAgIENsYXNzQ29tcGxldGlvblZlcmlmaWVyIGNvbXBsZXRpb25WZXJpZmllciA9IG5ldyBDbGFzc0NvbXBsZXRpb25WZXJpZmllcihzb3VyY2UpOworICAgICAgICAgICAgY29tcGxldGlvblZlcmlmaWVyLnZpc2l0Q2xhc3MoY2xhc3NOb2RlKTsKKworICAgICAgICAgICAgRXh0ZW5kZWRWZXJpZmllciB4dmVyaWZpZXIgPSBuZXcgRXh0ZW5kZWRWZXJpZmllcihzb3VyY2UpOworICAgICAgICAgICAgeHZlcmlmaWVyLnZpc2l0Q2xhc3MoY2xhc3NOb2RlKTsKKworICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGUgY2xhc3MgbWF5IGJlIGdlbmVyYXRlZCBldmVuIGlmIGEgZXJyb3Igd2FzIGZvdW5kCisgICAgICAgICAgICAvLyBhbmQgdGhhdCBjbGFzcyBtYXkgaGF2ZSBhbiBpbnZhbGlkIGZvcm1hdCB3ZSBmYWlsIGhlcmUgaWYgbmVlZGVkCisgICAgICAgICAgICBnZXRFcnJvckNvbGxlY3RvcigpLmZhaWxJZkVycm9ycygpOworCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gUHJlcCB0aGUgZ2VuZXJhdG9yIG1hY2hpbmVyeQorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIENsYXNzVmlzaXRvciB2aXNpdG9yID0gY3JlYXRlQ2xhc3NWaXNpdG9yKCk7CisKKworICAgICAgICAgICAgU3RyaW5nIHNvdXJjZU5hbWUgPSAoc291cmNlID09IG51bGwgPyBjbGFzc05vZGUuZ2V0TW9kdWxlKCkuZ2V0RGVzY3JpcHRpb24oKSA6IHNvdXJjZS5nZXROYW1lKCkpOworICAgICAgICAgICAgLy8gb25seSBzaG93IHRoZSBmaWxlIG5hbWUgYW5kIGl0cyBleHRlbnNpb24gbGlrZSBqYXZhYyBkb2VzIGluIGl0cyBzdGFja3RyYWNlcyByYXRoZXIgdGhhbiB0aGUgZnVsbCBwYXRoCisgICAgICAgICAgICAvLyBhbHNvIHRha2VzIGNhcmUgb2YgYm90aCBcIGFuZCAvIGRlcGVuZGluZyBvbiB0aGUgaG9zdCBjb21waWxpbmcgZW52aXJvbm1lbnQKKyAgICAgICAgICAgIGlmIChzb3VyY2VOYW1lICE9IG51bGwpCisgICAgICAgICAgICAgICAgc291cmNlTmFtZSA9IHNvdXJjZU5hbWUuc3Vic3RyaW5nKE1hdGgubWF4KHNvdXJjZU5hbWUubGFzdEluZGV4T2YoJ1xcJyksIHNvdXJjZU5hbWUubGFzdEluZGV4T2YoJy8nKSkgKyAxKTsKKyAgICAgICAgICAgIENsYXNzR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBBc21DbGFzc0dlbmVyYXRvcihjb250ZXh0LCB2aXNpdG9yLCBjbGFzc0xvYWRlciwgc291cmNlTmFtZSk7CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBSdW4gdGhlIGdlbmVyYXRpb24gYW5kIGNyZWF0ZSB0aGUgY2xhc3MgKGlmIHJlcXVpcmVkKQorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGdlbmVyYXRvci52aXNpdENsYXNzKGNsYXNzTm9kZSk7CisKKworICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gKChDbGFzc1dyaXRlcikgdmlzaXRvcikudG9CeXRlQXJyYXkoKTsKKyAgICAgICAgICAgIGdlbmVyYXRlZENsYXNzZXMuYWRkKG5ldyBHcm9vdnlDbGFzcyhjbGFzc05vZGUuZ2V0TmFtZSgpLCBieXRlcykpOworCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gSGFuZGxlIGFueSBjYWxsYmFjayB0aGF0J3MgYmVlbiBzZXQKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBpZiAoQ29tcGlsYXRpb25Vbml0LnRoaXMuY2xhc3NnZW5DYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY2xhc3NnZW5DYWxsYmFjay5jYWxsKHZpc2l0b3IsIGNsYXNzTm9kZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBSZWN1cnNlIGZvciBpbm5lciBjbGFzc2VzCisgICAgICAgICAgICAvLworICAgICAgICAgICAgTGlua2VkTGlzdCBpbm5lckNsYXNzZXMgPSBnZW5lcmF0b3IuZ2V0SW5uZXJDbGFzc2VzKCk7CisgICAgICAgICAgICB3aGlsZSAoIWlubmVyQ2xhc3Nlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBjbGFzc2dlbi5jYWxsKHNvdXJjZSwgY29udGV4dCwgKENsYXNzTm9kZSkgaW5uZXJDbGFzc2VzLnJlbW92ZUZpcnN0KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworCisgICAgcHJvdGVjdGVkIENsYXNzVmlzaXRvciBjcmVhdGVDbGFzc1Zpc2l0b3IoKSB7CisgICAgICAgIHJldHVybiBuZXcgQ2xhc3NXcml0ZXIodHJ1ZSk7CisgICAgfQorCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBQSEFTRSBIQU5ETElORworCisKKyAgICAvKioKKyAgICAgKiBVcGRhdGVzIHRoZSBwaGFzZSBtYXJrZXIgb24gYWxsIHNvdXJjZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgbWFyaygpIHRocm93cyBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbiB7CisgICAgICAgIGFwcGx5VG9Tb3VyY2VVbml0cyhtYXJrKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIE1hcmtzIGEgc2luZ2xlIFNvdXJjZVVuaXQgd2l0aCB0aGUgY3VycmVudCBwaGFzZSwKKyAgICAgKiBpZiBpdCBpc24ndCBhbHJlYWR5IHRoZXJlIHlldC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFNvdXJjZVVuaXRPcGVyYXRpb24gbWFyayA9IG5ldyBTb3VyY2VVbml0T3BlcmF0aW9uKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBjYWxsKFNvdXJjZVVuaXQgc291cmNlKSB0aHJvd3MgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24geworICAgICAgICAgICAgaWYgKHNvdXJjZS5waGFzZSA8IHBoYXNlKSB7CisgICAgICAgICAgICAgICAgc291cmNlLmdvdG9QaGFzZShwaGFzZSk7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgaWYgKHNvdXJjZS5waGFzZSA9PSBwaGFzZSAmJiBwaGFzZUNvbXBsZXRlICYmICFzb3VyY2UucGhhc2VDb21wbGV0ZSkgeworICAgICAgICAgICAgICAgIHNvdXJjZS5jb21wbGV0ZVBoYXNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBMT09QIFNJTVBMSUZJQ0FUSU9OIEZPUiBTb3VyY2VVbml0IE9QRVJBVElPTlMKKworCisgICAgLyoqCisgICAgICogQW4gY2FsbGJhY2sgaW50ZXJmYWNlIGZvciB1c2UgaW4gdGhlIGFwcGx5VG9Tb3VyY2VVbml0cyBsb29wIGRyaXZlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIFNvdXJjZVVuaXRPcGVyYXRpb24geworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBjYWxsKFNvdXJjZVVuaXQgc291cmNlKSB0aHJvd3MgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb247CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBIGxvb3AgZHJpdmVyIGZvciBhcHBseWluZyBvcGVyYXRpb25zIHRvIGFsbCBTb3VyY2VVbml0cy4KKyAgICAgKiBBdXRvbWF0aWNhbGx5IHNraXBzIHVuaXRzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gcHJvY2Vzc2VkCisgICAgICogdGhyb3VnaCB0aGUgY3VycmVudCBwaGFzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhcHBseVRvU291cmNlVW5pdHMoU291cmNlVW5pdE9wZXJhdGlvbiBib2R5KSB0aHJvd3MgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24geworICAgICAgICBJdGVyYXRvciBrZXlzID0gbmFtZXMuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGtleXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGtleXMubmV4dCgpOworICAgICAgICAgICAgU291cmNlVW5pdCBzb3VyY2UgPSAoU291cmNlVW5pdCkgc291cmNlcy5nZXQobmFtZSk7CisgICAgICAgICAgICBpZiAoKHNvdXJjZS5waGFzZSA8IHBoYXNlKSB8fCAoc291cmNlLnBoYXNlID09IHBoYXNlICYmICFzb3VyY2UucGhhc2VDb21wbGV0ZSkpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBib2R5LmNhbGwoc291cmNlKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgR3Jvb3Z5QnVnRXJyb3IgZ2JlID0gbmV3IEdyb292eUJ1Z0Vycm9yKGUpOworICAgICAgICAgICAgICAgICAgICBjaGFuZ2VCdWdUZXh0KGdiZSwgc291cmNlKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgZ2JlOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEdyb292eUJ1Z0Vycm9yIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhbmdlQnVnVGV4dChlLCBzb3VyY2UpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgZ2V0RXJyb3JDb2xsZWN0b3IoKS5mYWlsSWZFcnJvcnMoKTsKKyAgICB9CisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIExPT1AgU0lNUExJRklDQVRJT04gRk9SIFBSSU1BUlkgQ2xhc3NOb2RlIE9QRVJBVElPTlMKKworCisgICAgLyoqCisgICAgICogQW4gY2FsbGJhY2sgaW50ZXJmYWNlIGZvciB1c2UgaW4gdGhlIGFwcGx5VG9Tb3VyY2VVbml0cyBsb29wIGRyaXZlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIFByaW1hcnlDbGFzc05vZGVPcGVyYXRpb24geworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBjYWxsKFNvdXJjZVVuaXQgc291cmNlLCBHZW5lcmF0b3JDb250ZXh0IGNvbnRleHQsIENsYXNzTm9kZSBjbGFzc05vZGUpIHRocm93cyBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbjsKKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBuZWVkU29ydGVkSW5wdXQoKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIEdyb292eUNsYXNzT3BlcmF0aW9uIHsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgY2FsbChHcm9vdnlDbGFzcyBnY2xhc3MpIHRocm93cyBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbjsKKyAgICB9CisKKyAgICBwcml2YXRlIExpc3QgZ2V0UHJpbWFyeUNsYXNzTm9kZXMoYm9vbGVhbiBzb3J0KSB7CisgICAgICAgIExpc3QgdW5zb3J0ZWQgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIEl0ZXJhdG9yIG1vZHVsZXMgPSB0aGlzLmFzdC5nZXRNb2R1bGVzKCkuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKG1vZHVsZXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBNb2R1bGVOb2RlIG1vZHVsZSA9IChNb2R1bGVOb2RlKSBtb2R1bGVzLm5leHQoKTsKKworICAgICAgICAgICAgSXRlcmF0b3IgY2xhc3NOb2RlcyA9IG1vZHVsZS5nZXRDbGFzc2VzKCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChjbGFzc05vZGVzLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIENsYXNzTm9kZSBjbGFzc05vZGUgPSAoQ2xhc3NOb2RlKSBjbGFzc05vZGVzLm5leHQoKTsKKyAgICAgICAgICAgICAgICB1bnNvcnRlZC5hZGQoY2xhc3NOb2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChzb3J0ID09IGZhbHNlKSByZXR1cm4gdW5zb3J0ZWQ7CisKKyAgICAgICAgaW50W10gaW5kZXhDbGFzcyA9IG5ldyBpbnRbdW5zb3J0ZWQuc2l6ZSgpXTsKKyAgICAgICAgaW50W10gaW5kZXhJbnRlcmZhY2UgPSBuZXcgaW50W3Vuc29ydGVkLnNpemUoKV07CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHVuc29ydGVkLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBDbGFzc05vZGUgbm9kZSA9IChDbGFzc05vZGUpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgICAgICAgICAgQ2xhc3NOb2RlIGVsZW1lbnQgPSBub2RlOworICAgICAgICAgICAgICAgIHdoaWxlIChlbGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQuZ2V0U3VwZXJDbGFzcygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobm9kZS5pc0ludGVyZmFjZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGluZGV4SW50ZXJmYWNlW2ldID0gY291bnQ7CisgICAgICAgICAgICAgICAgICAgIGluZGV4Q2xhc3NbaV0gPSAtMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpbmRleENsYXNzW2ldID0gY291bnQ7CisgICAgICAgICAgICAgICAgICAgIGluZGV4SW50ZXJmYWNlW2ldID0gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgTGlzdCBzb3J0ZWQgPSBnZXRTb3J0ZWQoaW5kZXhJbnRlcmZhY2UsIHVuc29ydGVkKTsKKyAgICAgICAgc29ydGVkLmFkZEFsbChnZXRTb3J0ZWQoaW5kZXhDbGFzcywgdW5zb3J0ZWQpKTsKKworICAgICAgICByZXR1cm4gc29ydGVkOworICAgIH0KKworICAgIHByaXZhdGUgTGlzdCBnZXRTb3J0ZWQoaW50W10gaW5kZXgsIExpc3QgdW5zb3J0ZWQpIHsKKyAgICAgICAgTGlzdCBzb3J0ZWQgPSBuZXcgQXJyYXlMaXN0KHVuc29ydGVkLnNpemUoKSk7CisgICAgICAgIGludCBzdGFydCA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdW5zb3J0ZWQuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGludCBtaW4gPSAtMTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgdW5zb3J0ZWQuc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXhbal0gPT0gLTEpIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGlmIChtaW4gPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgbWluID0gajsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluZGV4W2pdIDwgaW5kZXhbbWluXSkgeworICAgICAgICAgICAgICAgICAgICBtaW4gPSBqOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtaW4gPT0gLTEpIGJyZWFrOworICAgICAgICAgICAgc29ydGVkLmFkZCh1bnNvcnRlZC5nZXQobWluKSk7CisgICAgICAgICAgICBpbmRleFttaW5dID0gLTE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNvcnRlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGxvb3AgZHJpdmVyIGZvciBhcHBseWluZyBvcGVyYXRpb25zIHRvIGFsbCBwcmltYXJ5IENsYXNzTm9kZXMgaW4KKyAgICAgKiBvdXIgQVNULiAgQXV0b21hdGljYWxseSBza2lwcyB1bml0cyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZAorICAgICAqIHRocm91Z2ggdGhlIGN1cnJlbnQgcGhhc2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYXBwbHlUb1ByaW1hcnlDbGFzc05vZGVzKFByaW1hcnlDbGFzc05vZGVPcGVyYXRpb24gYm9keSkgdGhyb3dzIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uIHsKKyAgICAgICAgSXRlcmF0b3IgY2xhc3NOb2RlcyA9IGdldFByaW1hcnlDbGFzc05vZGVzKGJvZHkubmVlZFNvcnRlZElucHV0KCkpLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChjbGFzc05vZGVzLmhhc05leHQoKSkgeworICAgICAgICAgICAgU291cmNlVW5pdCBjb250ZXh0ID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQ2xhc3NOb2RlIGNsYXNzTm9kZSA9IChDbGFzc05vZGUpIGNsYXNzTm9kZXMubmV4dCgpOworICAgICAgICAgICAgICAgIGNvbnRleHQgPSBjbGFzc05vZGUuZ2V0TW9kdWxlKCkuZ2V0Q29udGV4dCgpOworICAgICAgICAgICAgICAgIGlmIChjb250ZXh0ID09IG51bGwgfHwgY29udGV4dC5waGFzZSA8PSBwaGFzZSkgeworICAgICAgICAgICAgICAgICAgICBib2R5LmNhbGwoY29udGV4dCwgbmV3IEdlbmVyYXRvckNvbnRleHQodGhpcy5hc3QpLCBjbGFzc05vZGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBmYWxsIHRob3J1Z2gsIGdldEVycm9yUkVwb3J0ZXIoKS5mYWlsSWZFcnJvcnMoKSB3aWxsIHRyaWdlcgorICAgICAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gbnBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbnBlOworICAgICAgICAgICAgfSBjYXRjaCAoR3Jvb3Z5QnVnRXJyb3IgZSkgeworICAgICAgICAgICAgICAgIGNoYW5nZUJ1Z1RleHQoZSwgY29udGV4dCk7CisgICAgICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhlIGV4Y2VwdGlvbiBmb3IgYSBuZXN0ZWQgY29tcGlsYXRpb24gZXhjZXB0aW9uCisgICAgICAgICAgICAgICAgRXJyb3JDb2xsZWN0b3IgbmVzdGVkQ29sbGVjdG9yID0gbnVsbDsKKyAgICAgICAgICAgICAgICBmb3IgKFRocm93YWJsZSBuZXh0ID0gZS5nZXRDYXVzZSgpOyBuZXh0ICE9IGUgJiYgbmV4dCAhPSBudWxsOyBuZXh0ID0gbmV4dC5nZXRDYXVzZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghKG5leHQgaW5zdGFuY2VvZiBNdWx0aXBsZUNvbXBpbGF0aW9uRXJyb3JzRXhjZXB0aW9uKSkgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIE11bHRpcGxlQ29tcGlsYXRpb25FcnJvcnNFeGNlcHRpb24gbWNlZSA9IChNdWx0aXBsZUNvbXBpbGF0aW9uRXJyb3JzRXhjZXB0aW9uKSBuZXh0OworICAgICAgICAgICAgICAgICAgICBuZXN0ZWRDb2xsZWN0b3IgPSBtY2VlLmNvbGxlY3RvcjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG5lc3RlZENvbGxlY3RvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGdldEVycm9yQ29sbGVjdG9yKCkuYWRkQ29sbGVjdG9yQ29udGVudHMobmVzdGVkQ29sbGVjdG9yKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBnZXRFcnJvckNvbGxlY3RvcigpLmFkZEVycm9yKG5ldyBFeGNlcHRpb25NZXNzYWdlKGUsIGNvbmZpZ3VyYXRpb24uZ2V0RGVidWcoKSwgdGhpcykpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGdldEVycm9yQ29sbGVjdG9yKCkuZmFpbElmRXJyb3JzKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXBwbHlUb0dlbmVyYXRlZEdyb292eUNsYXNzZXMoR3Jvb3Z5Q2xhc3NPcGVyYXRpb24gYm9keSkgdGhyb3dzIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHRoaXMucGhhc2UgIT0gUGhhc2VzLk9VVFBVVCAmJiAhKHRoaXMucGhhc2UgPT0gUGhhc2VzLkNMQVNTX0dFTkVSQVRJT04gJiYgdGhpcy5waGFzZUNvbXBsZXRlKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEdyb292eUJ1Z0Vycm9yKCJDb21waWxhdGlvblVuaXQgbm90IHJlYWR5IGZvciBvdXRwdXQoKS4gQ3VycmVudCBwaGFzZT0iICsgZ2V0UGhhc2VEZXNjcmlwdGlvbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gZmFpbHVyZXMgPSBmYWxzZTsKKworICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IHRoaXMuZ2VuZXJhdGVkQ2xhc3Nlcy5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gR2V0IHRoZSBjbGFzcyBhbmQgY2FsY3VsYXRlIGl0cyBmaWxlc3lzdGVtIG5hbWUKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBHcm9vdnlDbGFzcyBnY2xhc3MgPSAoR3Jvb3Z5Q2xhc3MpIGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYm9keS5jYWxsKGdjbGFzcyk7CisgICAgICAgICAgICB9IGNhdGNoIChDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gZmFsbCB0aG9ydWdoLCBnZXRFcnJvclJFcG9ydGVyKCkuZmFpbElmRXJyb3JzKCkgd2lsbCB0cmlnZXIKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIG5wZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5wZTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEdyb292eUJ1Z0Vycm9yIGUpIHsKKyAgICAgICAgICAgICAgICBjaGFuZ2VCdWdUZXh0KGUsIG51bGwpOworICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIEdyb292eUJ1Z0Vycm9yIGdiZSA9IG5ldyBHcm9vdnlCdWdFcnJvcihlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBnYmU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBnZXRFcnJvckNvbGxlY3RvcigpLmZhaWxJZkVycm9ycygpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGFuZ2VCdWdUZXh0KEdyb292eUJ1Z0Vycm9yIGUsIFNvdXJjZVVuaXQgY29udGV4dCkgeworICAgICAgICBlLnNldEJ1Z1RleHQoImV4Y2VwdGlvbiBpbiBwaGFzZSAnIiArIGdldFBoYXNlRGVzY3JpcHRpb24oKSArICInIGluIHNvdXJjZSB1bml0ICciICsgKChjb250ZXh0ICE9IG51bGwpID8gY29udGV4dC5nZXROYW1lKCkgOiAiPyIpICsgIicgIiArIGUuZ2V0QnVnVGV4dCgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9jb250cm9sL0NvbXBpbGVyQ29uZmlndXJhdGlvbi5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY29udHJvbC9Db21waWxlckNvbmZpZ3VyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2RhMzNlCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY29udHJvbC9Db21waWxlckNvbmZpZ3VyYXRpb24uamF2YQpAQCAtMCwwICsxLDY2MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLmlvLk51bGxXcml0ZXI7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLm1lc3NhZ2VzLldhcm5pbmdNZXNzYWdlOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworCisKKy8qKgorICogQ29tcGlsYXRpb24gY29udHJvbCBmbGFncyBhbmQgY29vcmRpbmF0aW9uIHN0dWZmLgorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNwb2lyaWVyQGRyZWFtaW5nLm9yZyI+Q2hyaXMgUG9pcmllcjwvYT4KKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmJsYWNrZHJhZ0BnbXgub3JnIj5Kb2NoZW4gVGhlb2Rvcm91PC9hPgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amltQHBhZ2VzbWl0aHMuY29tIj5KaW0gV2hpdGU8L2E+CisgKiBAdmVyc2lvbiAkSWQkCisgKi8KKworcHVibGljIGNsYXNzIENvbXBpbGVyQ29uZmlndXJhdGlvbiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkRLNV9DTEFTU05BTUVfQ0hFQ0sgPSAiamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbiI7CisKKyAgICAvKiogVGhpcyAoPGNvZGU+IjEuNSI8L2NvZGU+KSBpcyB0aGUgdmFsdWUgZm9yIHRhcmdldEJ5dGVjb2RlIHRvIGNvbXBpbGUgZm9yIGEgSkRLIDEuNSBvciBsYXRlciBKVk0uICoqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBPU1RfSkRLNSA9ICIxLjUiOworICAgIAorICAgIC8qKiBUaGlzICg8Y29kZT4iMS40Ijxjb2RlLz4pIGlzIHRoZSB2YWx1ZSBmb3IgdGFyZ2V0Qnl0ZWNvZGUgdG8gY29tcGlsZSBmb3IgYSBKREsgMS40IEpWTS4gKiovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFX0pESzUgPSAiMS40IjsKKworICAgIC8vIEp1c3QgY2FsbCBnZXRWTVZlcnNpb24oKSBvbmNlLgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGN1cnJlbnRKVk1WZXJzaW9uID0gZ2V0Vk1WZXJzaW9uKCk7CisKKyAgICAvLyBTdGF0aWMgaW5pdGlhbGl6ZXJzIGFyZSBleGVjdXRlZCBpbiB0ZXh0IG9yZGVyLAorICAgIC8vIHRoZXJlZm9yZSB3ZSBtdXN0IGRvIHRoaXMgb25lIGxhc3QhCisgICAgLyoqCisgICAgICogIEEgY29udmVuaWVuY2UgZm9yIGdldHRpbmcgYSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uICBEbyBub3QgbW9kaWZ5IGl0IQorICAgICAqICBTZWUge0BsaW5rICNDb21waWxlckNvbmZpZ3VyYXRpb24oUHJvcGVydGllcyl9IGZvciBhbiBleGFtcGxlIG9uIGhvdyB0bworICAgICAqICBtYWtlIGEgc3VpdGFibGUgY29weSB0byBtb2RpZnkuICBCdXQgaWYgeW91J3JlIHJlYWxseSBzdGFydGluZyBmcm9tIGEKKyAgICAgKiAgZGVmYXVsdCBjb250ZXh0LCB0aGVuIHlvdSBwcm9iYWJseSBqdXN0IHdhbnQgPGNvZGU+bmV3IENvbXBpbGVyQ29uZmlndXJhdGlvbigpPC9jb2RlPi4gCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21waWxlckNvbmZpZ3VyYXRpb24gREVGQVVMVCA9IG5ldyBDb21waWxlckNvbmZpZ3VyYXRpb24oKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBTZWUge0BsaW5rIFdhcm5pbmdNZXNzYWdlfSBmb3IgbGV2ZWxzLgorICAgICAqLworICAgIHByaXZhdGUgaW50IHdhcm5pbmdMZXZlbDsKKyAgICAvKioKKyAgICAgKiBFbmNvZGluZyBmb3Igc291cmNlIGZpbGVzCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgc291cmNlRW5jb2Rpbmc7CisgICAgLyoqCisgICAgICogQSA8Y29kZT5QcmludFdyaXRlcjwvY29kZT4gZm9yIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgdXNlcgorICAgICAqLworICAgIHByaXZhdGUgUHJpbnRXcml0ZXIgb3V0cHV0OworICAgIC8qKgorICAgICAqIERpcmVjdG9yeSBpbnRvIHdoaWNoIHRvIHdyaXRlIGNsYXNzZXMKKyAgICAgKi8KKyAgICBwcml2YXRlIEZpbGUgdGFyZ2V0RGlyZWN0b3J5OworICAgIC8qKgorICAgICAqIENsYXNzcGF0aCBmb3IgdXNlIGR1cmluZyBjb21waWxhdGlvbgorICAgICAqLworICAgIHByaXZhdGUgTGlua2VkTGlzdCBjbGFzc3BhdGg7CisgICAgLyoqCisgICAgICogSWYgdHJ1ZSwgdGhlIGNvbXBpbGVyIHNob3VsZCBwcm9kdWNlIGFjdGlvbiBpbmZvcm1hdGlvbgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiB2ZXJib3NlOworICAgIC8qKgorICAgICAqIElmIHRydWUsIGRlYnVnZ2luZyBjb2RlIHNob3VsZCBiZSBhY3RpdmF0ZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZGVidWc7CisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBub24tZmF0YWwgZXJyb3JzIHRvIGFsbG93IGJlZm9yZSBiYWlsaW5nCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgdG9sZXJhbmNlOworICAgIC8qKgorICAgICAqIEJhc2UgY2xhc3MgbmFtZSBmb3Igc2NyaXB0cyAobXVzdCBkZXJpdmUgZnJvbSBTY3JpcHQpCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgc2NyaXB0QmFzZUNsYXNzOworCisgICAgcHJpdmF0ZSBQYXJzZXJQbHVnaW5GYWN0b3J5IHBsdWdpbkZhY3Rvcnk7CisKKyAgICAvKioKKyAgICAgKiBleHRlbnNpb24gdXNlZCB0byBmaW5kIGEgZ3Jvb3Z5IGZpbGUKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBkZWZhdWx0U2NyaXB0RXh0ZW5zaW9uOworICAgIAorICAgIC8qKgorICAgICAqIGlmIHNldCB0byB0cnVlIHJlY29tcGlsYXRpb24gaXMgZW5hYmxlZAorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiByZWNvbXBpbGVHcm9vdnlTb3VyY2U7CisgICAgCisgICAgLyoqCisgICAgICogc2V0cyB0aGUgbWluaW11bSBvZiB0aW1lIGFmdGVyIGEgc2NyaXB0IGNhbiBiZSByZWNvbXBpbGVkLgorICAgICAqLworICAgIHByaXZhdGUgaW50IG1pbmltdW1SZWNvbXBpbGF0aW9uSW50ZXJ2YWw7CisKKyAgICAvKioKKyAgICAgKiBzZXRzIHRoZSBieXRlY29kZSB2ZXJzaW9uIHRhcmdldAorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHRhcmdldEJ5dGVjb2RlOworCisgICAgLyoqCisgICAgICogb3B0aW9ucyBmb3Igam9pbnQgY29tcGlsYXRpb24gKG51bGwgYnkgZGVmYXVsdCA9PSBubyBqb2ludCBjb21waWxhdGlvbikKKyAgICAgKi8KKyAgICBwcml2YXRlIE1hcCBqb2ludENvbXBpbGF0aW9uT3B0aW9uczsKKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBGbGFncyB0byBkZWZhdWx0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29tcGlsZXJDb25maWd1cmF0aW9uKCkgeworICAgICAgICAvLworICAgICAgICAvLyBTZXQgaW4gc2FmZSBkZWZhdWx0cworCisgICAgICAgIHNldFdhcm5pbmdMZXZlbChXYXJuaW5nTWVzc2FnZS5MSUtFTFlfRVJST1JTKTsKKyAgICAgICAgc2V0T3V0cHV0KG51bGwpOworICAgICAgICBzZXRUYXJnZXREaXJlY3RvcnkoKEZpbGUpIG51bGwpOworICAgICAgICBzZXRDbGFzc3BhdGgoIiIpOworICAgICAgICBzZXRWZXJib3NlKGZhbHNlKTsKKyAgICAgICAgc2V0RGVidWcoZmFsc2UpOworICAgICAgICBzZXRUb2xlcmFuY2UoMTApOworICAgICAgICBzZXRTY3JpcHRCYXNlQ2xhc3MobnVsbCk7CisgICAgICAgIHNldFJlY29tcGlsZUdyb292eVNvdXJjZShmYWxzZSk7CisgICAgICAgIHNldE1pbmltdW1SZWNvbXBpbGF0aW9uSW50ZXJ2YWwoMTAwKTsKKyAgICAgICAgc2V0VGFyZ2V0Qnl0ZWNvZGUoZ2V0Vk1WZXJzaW9uKCkpOworICAgICAgICBzZXREZWZhdWx0U2NyaXB0RXh0ZW5zaW9uKCIuZ3Jvb3Z5Iik7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gU291cmNlIGZpbGUgZW5jb2RpbmcKKyAgICAgICAgU3RyaW5nIGVuY29kaW5nID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGVuY29kaW5nID0gU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLmVuY29kaW5nIiwgIlVTLUFTQ0lJIik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBJR05PUkUKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgZW5jb2RpbmcgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImdyb292eS5zb3VyY2UuZW5jb2RpbmciLCBlbmNvZGluZyk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBJR05PUkUKKyAgICAgICAgfQorICAgICAgICBzZXRTb3VyY2VFbmNvZGluZyhlbmNvZGluZyk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNldE91dHB1dChuZXcgUHJpbnRXcml0ZXIoU3lzdGVtLmVycikpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gSUdOT1JFCisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RyaW5nIHRhcmdldCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiZ3Jvb3Z5LnRhcmdldC5kaXJlY3RvcnkiKTsKKyAgICAgICAgICAgIGlmICh0YXJnZXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNldFRhcmdldERpcmVjdG9yeSh0YXJnZXQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gSUdOT1JFCisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ29weSBjb25zdHJ1Y3Rvci4gIFVzZSB0aGlzIGlmIHlvdSBoYXZlIGEgbW9zdGx5IGNvcnJlY3QgY29uZmlndXJhdGlvbgorICAgICAqIGZvciB5b3VyIGNvbXBpbGF0aW9uIGJ1dCB5b3Ugd2FudCB0byBtYWtlIGEgc29tZSBjaGFuZ2VzIHByb2dyYW1tYXRpY2FsbHkuICAKKyAgICAgKiBBbiBpbXBvcnRhbnQgcmVhc29uIHRvIHByZWZlciB0aGlzIGFwcHJvYWNoIGlzIHRoYXQgeW91ciBjb2RlIHdpbGwgbW9zdAorICAgICAqIGxpa2VseSBiZSBmb3J3YXJkIGNvbXBhdGlibGUgd2l0aCBmdXR1cmUgY2hhbmdlcyB0byB0aGlzIGNvbmZpZ3VyYXRpb24gQVBJLjxici8+CisgICAgICogQW4gZXhhbXBsZSBvZiB0aGlzIGNvcHkgY29uc3RydWN0b3IgYXQgd29yazo8YnIvPgorICAgICAqIDxwcmU+CisgICAgICogICAgLy8gSW4gYWxsIGxpa2VsaWhvb2QgdGhlcmUgaXMgYWxyZWFkeSBhIGNvbmZpZ3VyYXRpb24gaW4geW91ciBjb2RlJ3MgY29udGV4dAorICAgICAqICAgIC8vIGZvciB5b3UgdG8gY29weSwgYnV0IGZvciB0aGUgc2FrZSBvZiB0aGlzIGV4YW1wbGUgd2UnbGwgdXNlIHRoZSBnbG9iYWwgZGVmYXVsdC4KKyAgICAgKiAgICBDb21waWxlckNvbmZpZ3VyYXRpb24gbXlDb25maWd1cmF0aW9uID0gbmV3IENvbXBpbGVyQ29uZmlndXJhdGlvbihDb21waWxlckNvbmZpZ3VyYXRpb24uREVGQVVMVCk7CisgICAgICogICAgbXlDb25maWd1cmF0aW9uLnNldERlYnVnKHRydWUpOworICAgICAqPC9wcmU+CisgICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gVGhlIGNvbmZpZ3VyYXRpb24gdG8gY29weS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29tcGlsZXJDb25maWd1cmF0aW9uKENvbXBpbGVyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7CisgICAgICAgIHNldFdhcm5pbmdMZXZlbChjb25maWd1cmF0aW9uLmdldFdhcm5pbmdMZXZlbCgpKTsKKyAgICAgICAgc2V0T3V0cHV0KGNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0KCkpOworICAgICAgICBzZXRUYXJnZXREaXJlY3RvcnkoY29uZmlndXJhdGlvbi5nZXRUYXJnZXREaXJlY3RvcnkoKSk7CisgICAgICAgIHNldENsYXNzcGF0aExpc3QobmV3IExpbmtlZExpc3QoY29uZmlndXJhdGlvbi5nZXRDbGFzc3BhdGgoKSkpOworICAgICAgICBzZXRWZXJib3NlKGNvbmZpZ3VyYXRpb24uZ2V0VmVyYm9zZSgpKTsKKyAgICAgICAgc2V0RGVidWcoY29uZmlndXJhdGlvbi5nZXREZWJ1ZygpKTsKKyAgICAgICAgc2V0VG9sZXJhbmNlKGNvbmZpZ3VyYXRpb24uZ2V0VG9sZXJhbmNlKCkpOworICAgICAgICBzZXRTY3JpcHRCYXNlQ2xhc3MoY29uZmlndXJhdGlvbi5nZXRTY3JpcHRCYXNlQ2xhc3MoKSk7CisgICAgICAgIHNldFJlY29tcGlsZUdyb292eVNvdXJjZShjb25maWd1cmF0aW9uLmdldFJlY29tcGlsZUdyb292eVNvdXJjZSgpKTsKKyAgICAgICAgc2V0TWluaW11bVJlY29tcGlsYXRpb25JbnRlcnZhbChjb25maWd1cmF0aW9uLmdldE1pbmltdW1SZWNvbXBpbGF0aW9uSW50ZXJ2YWwoKSk7CisgICAgICAgIHNldFRhcmdldEJ5dGVjb2RlKGNvbmZpZ3VyYXRpb24uZ2V0VGFyZ2V0Qnl0ZWNvZGUoKSk7CisgICAgICAgIHNldERlZmF1bHRTY3JpcHRFeHRlbnNpb24oY29uZmlndXJhdGlvbi5nZXREZWZhdWx0U2NyaXB0RXh0ZW5zaW9uKCkpOworICAgICAgICBzZXRTb3VyY2VFbmNvZGluZyhjb25maWd1cmF0aW9uLmdldFNvdXJjZUVuY29kaW5nKCkpOworICAgICAgICBzZXRPdXRwdXQoY29uZmlndXJhdGlvbi5nZXRPdXRwdXQoKSk7CisgICAgICAgIHNldFRhcmdldERpcmVjdG9yeShjb25maWd1cmF0aW9uLmdldFRhcmdldERpcmVjdG9yeSgpKTsKKyAgICAgICAgTWFwIGpvaW50Q29tcGlsYXRpb25PcHRpb25zID0gY29uZmlndXJhdGlvbi5nZXRKb2ludENvbXBpbGF0aW9uT3B0aW9ucygpOworICAgICAgICBpZiAoam9pbnRDb21waWxhdGlvbk9wdGlvbnMhPW51bGwpIHsKKyAgICAgICAgICAgIGpvaW50Q29tcGlsYXRpb25PcHRpb25zID0gbmV3IEhhc2hNYXAoam9pbnRDb21waWxhdGlvbk9wdGlvbnMpOworICAgICAgICB9CisgICAgICAgIHNldEpvaW50Q29tcGlsYXRpb25PcHRpb25zKGpvaW50Q29tcGlsYXRpb25PcHRpb25zKTsKKyAgICAgICAgc2V0UGx1Z2luRmFjdG9yeShjb25maWd1cmF0aW9uLmdldFBsdWdpbkZhY3RvcnkoKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBGbGFncyB0byB0aGUgc3BlY2lmaWVkIGNvbmZpZ3VyYXRpb24sIHdpdGggZGVmYXVsdHMKKyAgICAgKiBmb3IgdGhvc2Ugbm90IHN1cHBsaWVkLgorICAgICAqIE5vdGUgdGhhdCB0aG9zZSAiZGVmYXVsdHMiIGhlcmUgZG8gPGVtPm5vdDwvZW0+IGluY2x1ZGUgY2hlY2tpbmcgdGhlCisgICAgICogc2V0dGluZ3MgaW4ge0BsaW5rIFN5c3RlbSNnZXRQcm9wZXJ0aWVzKCl9IGluIGdlbmVyYWwsIG9ubHkgZmlsZS5lbmNvZGluZywgCisgICAgICogZ3Jvb3Z5LnRhcmdldC5kaXJlY3RvcnkgYW5kIGdyb292eS5zb3VyY2UuZW5jb2RpbmcgYXJlLjxici8+CisgICAgICogSWYgeW91IHdhbnQgdG8gc2V0IGEgZmV3IGZsYWdzIGJ1dCBrZWVwIEdyb292eSdzIGRlZmF1bHQKKyAgICAgKiBjb25maWd1cmF0aW9uIGJlaGF2aW9yIHRoZW4gYmUgc3VyZSB0byBtYWtlIHlvdXIgc2V0dGluZ3MgaW4KKyAgICAgKiBhIFByb3BlcnRpZXMgdGhhdCBpcyBiYWNrZWQgYnkgPGNvZGU+U3lzdGVtLmdldFByb3BlcnRpZXMoKTwvY29kZT4gKHdoaWNoCisgICAgICogaXMgZG9uZSB1c2luZyB0aGUge0BsaW5rICNDb21waWxlckNvbmZpZ3VyYXRpb24oUHJvcGVydGllcyl9IGNvbnN0cnVjdG9yKS48YnIvPgorICAgICAqICAgVGhhdCBtaWdodCBiZSBkb25lIGxpa2UgdGhpczo8YnIvPgorICAgICAqIDxwcmU+CisgICAgICogICAgUHJvcGVydGllcyBteVByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcyhTeXN0ZW0uZ2V0UHJvcGVydGllcygpKTsKKyAgICAgKiAgICBteVByb3BlcnRpZXMuc2V0UHJvcGVydHkoImdyb292eS5vdXRwdXQuZGVidWciLCAidHJ1ZSIpOworICAgICAqICAgIG15Q29uZmlndXJhdGlvbiA9IG5ldyBDb21waWxlckNvbmZpZ3VyYXRpb24obXlQcm9wZXJ0aWVzKTsKKyAgICAgKiA8L3ByZT4KKyAgICAgKiBBbmQgeW91IGFsc28gaGF2ZSB0byBjb250ZW5kIHdpdGggYSBwb3NzaWJsZSBTZWN1cml0eUV4Y2VwdGlvbiB3aGVuCisgICAgICogZ2V0dGluZyB0aGUgc3lzdGVtIHByb3BlcnRpZXMgKFNlZSB7QGxpbmsgamF2YS5sYW5nLlN5c3RlbSNnZXRQcm9wZXJ0aWVzKCl9KS48YnIvPiAKKyAgICAgKiBBbiBzYWZlciBtZXRob2Qgd291bGQgYmUgdG8gY29weSBhIGRlZmF1bHQKKyAgICAgKiBDb21waWxlckNvbmZpZ3VyYXRpb24gYW5kIG1ha2UgeW91ciBjaGFuZ2VzIHRoZXJlIHVzaW5nIHRoZQorICAgICAqIHNldHRlci48YnIvPgorICAgICAqIDxwcmU+CisgICAgICogICAgLy8gSW4gYWxsIGxpa2VsaWhvb2QgdGhlcmUgaXMgYWxyZWFkeSBhIGNvbmZpZ3VyYXRpb24gZm9yIHlvdSB0byBjb3B5LAorICAgICAqICAgIC8vIGJ1dCBmb3IgdGhlIHNha2Ugb2YgdGhpcyBleGFtcGxlIHdlJ2xsIHVzZSB0aGUgZ2xvYmFsIGRlZmF1bHQuCisgICAgICogICAgQ29tcGlsZXJDb25maWd1cmF0aW9uIG15Q29uZmlndXJhdGlvbiA9IG5ldyBDb21waWxlckNvbmZpZ3VyYXRpb24oQ29tcGlsZXJDb25maWd1cmF0aW9uLkRFRkFVTFQpOworICAgICAqICAgIG15Q29uZmlndXJhdGlvbi5zZXREZWJ1Zyh0cnVlKTsKKyAgICAgKiA8L3ByZT4KKyAgICAgKiBBbm90aGVyIHJlYXNvbiB0byB1c2UgdGhlIGNvcHkgY29uc3RydWN0b3IgcmF0aGVyIHRoYW4gdGhpcyBvbmUgaXMgdGhhdCB5b3UKKyAgICAgKiBtdXN0IGNhbGwge0BsaW5rICNzZXRPdXRwdXR9LiAgQ2FsbGluZyA8Y29kZT5zZXRPdXRwdXQobnVsbCk8L2NvZGU+IGlzIHZhbGlkIGFuZCB3aWxsCisgICAgICogc2V0IHVwIGEgPGNvZGU+UHJpbnRXcml0ZXI8L2NvZGU+IHRvIGEgYml0IGJ1Y2tldC4gIFRoZSBjb3B5IGNvbnN0cnVjdG9yIHdpbGwgb2YgY291cnNlIHNldAorICAgICAqIHRoZSBzYW1lIG9uZSBhcyB0aGUgb3JpZ2luYWwuCisgICAgICoKKyAgICAgKjx0YWJsZSBzdW1tYXJ5PSJHcm9vdnkgQ29tcGlsZXIgQ29uZmlndXJhdGlvbiBQcm9wZXJ0aWVzIj4KKyAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5Qcm9wZXJ0eSBLZXk8L3RoPjx0aD5HZXQvU2V0IFByb3BlcnR5IE5hbWU8L3RoPgorICAgICAgICAgPC90cj4KKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0ZD48Y29kZT4iZ3Jvb3Z5Lndhcm5pbmdzIjwvY29kZT48L3RkPjx0ZD57QGxpbmsgI2dldFdhcm5pbmdMZXZlbH08L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkPjxjb2RlPiJncm9vdnkuc291cmNlLmVuY29kaW5nIjwvY29kZT48L3RkPjx0ZD57QGxpbmsgI2dldFNvdXJjZUVuY29kaW5nfTwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQ+PGNvZGU+Imdyb292eS50YXJnZXQuZGlyZWN0b3J5IjwvY29kZT48L3RkPjx0ZD57QGxpbmsgI2dldFRhcmdldERpcmVjdG9yeX08L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkPjxjb2RlPiJncm9vdnkudGFyZ2V0LmJ5dGVjb2RlIjwvY29kZT48L3RkPjx0ZD57QGxpbmsgI2dldFRhcmdldEJ5dGVjb2RlfTwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQ+PGNvZGU+Imdyb292eS5jbGFzc3BhdGgiPC9jb2RlPjwvdGQ+PHRkPntAbGluayAjZ2V0Q2xhc3NwYXRofTwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQ+PGNvZGU+Imdyb292eS5vdXRwdXQudmVyYm9zZSI8L2NvZGU+PC90ZD48dGQ+e0BsaW5rICNnZXRWZXJib3NlfTwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQ+PGNvZGU+Imdyb292eS5vdXRwdXQuZGVidWciPC9jb2RlPjwvdGQ+PHRkPntAbGluayAjZ2V0RGVidWd9PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZD48Y29kZT4iZ3Jvb3Z5LmVycm9ycy50b2xlcmFuY2UiPC9jb2RlPjwvdGQ+PHRkPntAbGluayAjZ2V0VG9sZXJhbmNlfTwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQ+PGNvZGU+Imdyb292eS5zY3JpcHQuZXh0ZW5zaW9uIjwvY29kZT48L3RkPjx0ZD57QGxpbmsgI2dldERlZmF1bHRTY3JpcHRFeHRlbnNpb259PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZD48Y29kZT4iZ3Jvb3Z5LnNjcmlwdC5iYXNlIjwvY29kZT48L3RkPjx0ZD57QGxpbmsgI2dldFNjcmlwdEJhc2VDbGFzc308L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkPjxjb2RlPiJncm9vdnkucmVjb21waWxlIjwvY29kZT48L3RkPjx0ZD57QGxpbmsgI2dldFJlY29tcGlsZUdyb292eVNvdXJjZX08L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkPjxjb2RlPiJncm9vdnkucmVjb21waWxlLm1pbmltdW1JbnRlcnZhbCI8L2NvZGU+PC90ZD48dGQ+e0BsaW5rICNnZXRNaW5pbXVtUmVjb21waWxhdGlvbkludGVydmFsfTwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQ+CisgICAgICAgICA8L3RyPgorICAgICA8L3RhYmxlPgorICAgICA8YnIvPgorICAgICAqIEBwYXJhbSBjb25maWd1cmF0aW9uIFRoZSBwcm9wZXJ0aWVzIHRvIGdldCBmbGFnIHZhbHVlcyBmcm9tLgorICAgICAqLworICAgIHB1YmxpYyBDb21waWxlckNvbmZpZ3VyYXRpb24oUHJvcGVydGllcyBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMoKTsKKyAgICAgICAgY29uZmlndXJlKGNvbmZpZ3VyYXRpb24pOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBNZXRob2QgdG8gY29uZmlndXJlIGEgdGhpcyBDb21waWxlckNvbmZpZ3VyYXRpb24gYnkgdXNpbmcgUHJvcGVydGllcy4KKyAgICAgKiBGb3IgYSBsaXN0IG9mIGF2YWlsYWJsZSBwcm9wZXJ0aWVzIGxvb2sgYXQge2xpbmsge0BsaW5rICNDb21waWxlckNvbmZpZ3VyYXRpb24oUHJvcGVydGllcyl9LgorICAgICAqIEBwYXJhbSBjb25maWd1cmF0aW9uIFRoZSBwcm9wZXJ0aWVzIHRvIGdldCBmbGFnIHZhbHVlcyBmcm9tLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShQcm9wZXJ0aWVzIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHRleHQgPSBudWxsOworICAgICAgICBpbnQgbnVtZXJpYyA9IDA7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gV2FybmluZyBsZXZlbAorCisgICAgICAgIG51bWVyaWMgPSBnZXRXYXJuaW5nTGV2ZWwoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRleHQgPSBjb25maWd1cmF0aW9uLmdldFByb3BlcnR5KCJncm9vdnkud2FybmluZ3MiLCAibGlrZWx5IGVycm9ycyIpOworICAgICAgICAgICAgbnVtZXJpYyA9IEludGVnZXIucGFyc2VJbnQodGV4dCk7CisgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0ZXh0ID0gdGV4dC50b0xvd2VyQ2FzZSgpOworICAgICAgICAgICAgaWYgKHRleHQuZXF1YWxzKCJub25lIikpIHsKKyAgICAgICAgICAgICAgICBudW1lcmljID0gV2FybmluZ01lc3NhZ2UuTk9ORTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHRleHQuc3RhcnRzV2l0aCgibGlrZWx5IikpIHsKKyAgICAgICAgICAgICAgICBudW1lcmljID0gV2FybmluZ01lc3NhZ2UuTElLRUxZX0VSUk9SUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHRleHQuc3RhcnRzV2l0aCgicG9zc2libGUiKSkgeworICAgICAgICAgICAgICAgIG51bWVyaWMgPSBXYXJuaW5nTWVzc2FnZS5QT1NTSUJMRV9FUlJPUlM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICh0ZXh0LnN0YXJ0c1dpdGgoInBhcmFub2lhIikpIHsKKyAgICAgICAgICAgICAgICBudW1lcmljID0gV2FybmluZ01lc3NhZ2UuUEFSQU5PSUE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigidW5yZWNvZ2l6ZWQgZ3Jvb3Z5Lndhcm5pbmdzOiAiICsgdGV4dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc2V0V2FybmluZ0xldmVsKG51bWVyaWMpOworCisgICAgICAgIC8vIAorICAgICAgICAvLyBTb3VyY2UgZmlsZSBlbmNvZGluZyAKKyAgICAgICAgLy8gCisgICAgICAgIHRleHQgPSBjb25maWd1cmF0aW9uLmdldFByb3BlcnR5KCJncm9vdnkuc291cmNlLmVuY29kaW5nIik7CisgICAgICAgIGlmICh0ZXh0ICE9IG51bGwpIHNldFNvdXJjZUVuY29kaW5nKHRleHQpOworCisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGFyZ2V0IGRpcmVjdG9yeSBmb3IgY2xhc3NlcworICAgICAgICAvLworICAgICAgICB0ZXh0ID0gY29uZmlndXJhdGlvbi5nZXRQcm9wZXJ0eSgiZ3Jvb3Z5LnRhcmdldC5kaXJlY3RvcnkiKTsKKyAgICAgICAgaWYgKHRleHQgIT0gbnVsbCkgc2V0VGFyZ2V0RGlyZWN0b3J5KHRleHQpOworICAgICAgICAKKyAgICAgICAgdGV4dCA9IGNvbmZpZ3VyYXRpb24uZ2V0UHJvcGVydHkoImdyb292eS50YXJnZXQuYnl0ZWNvZGUiKTsKKyAgICAgICAgaWYgKHRleHQgIT0gbnVsbCkgc2V0VGFyZ2V0Qnl0ZWNvZGUodGV4dCk7CisgICAgICAgIAorICAgICAgICAvLworICAgICAgICAvLyBDbGFzc3BhdGgKKyAgICAgICAgLy8KKyAgICAgICAgdGV4dCA9IGNvbmZpZ3VyYXRpb24uZ2V0UHJvcGVydHkoImdyb292eS5jbGFzc3BhdGgiKTsKKyAgICAgICAgaWYgKHRleHQgIT0gbnVsbCkgc2V0Q2xhc3NwYXRoKHRleHQpOworCisgICAgICAgIC8vCisgICAgICAgIC8vIFZlcmJvc2l0eQorICAgICAgICAvLworICAgICAgICB0ZXh0ID0gY29uZmlndXJhdGlvbi5nZXRQcm9wZXJ0eSgiZ3Jvb3Z5Lm91dHB1dC52ZXJib3NlIik7CisgICAgICAgIGlmICh0ZXh0ICE9IG51bGwgJiYgdGV4dC5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpIHNldFZlcmJvc2UodHJ1ZSk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRGVidWdnaW5nCisgICAgICAgIC8vCisgICAgICAgIHRleHQgPSBjb25maWd1cmF0aW9uLmdldFByb3BlcnR5KCJncm9vdnkub3V0cHV0LmRlYnVnIik7CisgICAgICAgIGlmICh0ZXh0ICE9IG51bGwgJiYgdGV4dC5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpIHNldERlYnVnKHRydWUpOworCisgICAgICAgIC8vCisgICAgICAgIC8vIFRvbGVyYW5jZQorICAgICAgICAvLyAKKyAgICAgICAgbnVtZXJpYyA9IDEwOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGV4dCA9IGNvbmZpZ3VyYXRpb24uZ2V0UHJvcGVydHkoImdyb292eS5lcnJvcnMudG9sZXJhbmNlIiwgIjEwIik7CisgICAgICAgICAgICBudW1lcmljID0gSW50ZWdlci5wYXJzZUludCh0ZXh0KTsKKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgICAgIHNldFRvbGVyYW5jZShudW1lcmljKTsKKworCisgICAgICAgIC8vCisgICAgICAgIC8vIFNjcmlwdCBCYXNlIENsYXNzCisgICAgICAgIC8vCisgICAgICAgIHRleHQgPSBjb25maWd1cmF0aW9uLmdldFByb3BlcnR5KCJncm9vdnkuc2NyaXB0LmJhc2UiKTsKKyAgICAgICAgaWYgKHRleHQhPW51bGwpIHNldFNjcmlwdEJhc2VDbGFzcyh0ZXh0KTsKKyAgICAgICAgCisgICAgICAgIC8vCisgICAgICAgIC8vIHJlY29tcGlsYXRpb24gb3B0aW9ucworICAgICAgICAvLworICAgICAgICB0ZXh0ID0gY29uZmlndXJhdGlvbi5nZXRQcm9wZXJ0eSgiZ3Jvb3Z5LnJlY29tcGlsZSIpOworICAgICAgICBpZiAodGV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICBzZXRSZWNvbXBpbGVHcm9vdnlTb3VyY2UodGV4dC5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBudW1lcmljID0gMTAwOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGV4dCA9IGNvbmZpZ3VyYXRpb24uZ2V0UHJvcGVydHkoImdyb292eS5yZWNvbXBpbGUubWluaW11bUludGVydmFsbCIpOworICAgICAgICAgICAgaWYgKHRleHQ9PW51bGwpIHRleHQgPSBjb25maWd1cmF0aW9uLmdldFByb3BlcnR5KCJncm9vdnkucmVjb21waWxlLm1pbmltdW1JbnRlcnZhbCIpOworICAgICAgICAgICAgaWYgKHRleHQhPW51bGwpIHsKKyAgICAgICAgICAgICAgICBudW1lcmljID0gSW50ZWdlci5wYXJzZUludCh0ZXh0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbnVtZXJpYyA9IDEwMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgICAgIHNldE1pbmltdW1SZWNvbXBpbGF0aW9uSW50ZXJ2YWwobnVtZXJpYyk7CisgICAgICAgIAorICAgICAgICAKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGN1cnJlbnRseSBjb25maWd1cmVkIHdhcm5pbmcgbGV2ZWwuICBTZWUgV2FybmluZ01lc3NhZ2UKKyAgICAgKiBmb3IgbGV2ZWwgZGV0YWlscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFdhcm5pbmdMZXZlbCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMud2FybmluZ0xldmVsOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgd2FybmluZyBsZXZlbC4gIFNlZSBXYXJuaW5nTWVzc2FnZSBmb3IgbGV2ZWwgZGV0YWlscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRXYXJuaW5nTGV2ZWwoaW50IGxldmVsKSB7CisgICAgICAgIGlmIChsZXZlbCA8IFdhcm5pbmdNZXNzYWdlLk5PTkUgfHwgbGV2ZWwgPiBXYXJuaW5nTWVzc2FnZS5QQVJBTk9JQSkgeworICAgICAgICAgICAgdGhpcy53YXJuaW5nTGV2ZWwgPSBXYXJuaW5nTWVzc2FnZS5MSUtFTFlfRVJST1JTOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdGhpcy53YXJuaW5nTGV2ZWwgPSBsZXZlbDsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgY3VycmVudGx5IGNvbmZpZ3VyZWQgc291cmNlIGZpbGUgZW5jb2RpbmcuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTb3VyY2VFbmNvZGluZygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlRW5jb2Rpbmc7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBlbmNvZGluZyB0byBiZSB1c2VkIHdoZW4gcmVhZGluZyBzb3VyY2UgZmlsZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U291cmNlRW5jb2RpbmcoU3RyaW5nIGVuY29kaW5nKSB7CisgICAgICAgIGlmIChlbmNvZGluZyA9PSBudWxsKSBlbmNvZGluZyA9ICJVUy1BU0NJSSI7CisgICAgICAgIHRoaXMuc291cmNlRW5jb2RpbmcgPSBlbmNvZGluZzsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGN1cnJlbnRseSBjb25maWd1cmVkIG91dHB1dCB3cml0ZXIuCisgICAgICovCisgICAgcHVibGljIFByaW50V3JpdGVyIGdldE91dHB1dCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMub3V0cHV0OworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgb3V0cHV0IHdyaXRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXQoUHJpbnRXcml0ZXIgb3V0cHV0KSB7CisgICAgICAgIGlmIChvdXRwdXQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5vdXRwdXQgPSBuZXcgUHJpbnRXcml0ZXIoTnVsbFdyaXRlci5ERUZBVUxUKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHRoaXMub3V0cHV0ID0gb3V0cHV0OworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB0YXJnZXQgZGlyZWN0b3J5IGZvciB3cml0aW5nIGNsYXNzZXMuCisgICAgICovCisgICAgcHVibGljIEZpbGUgZ2V0VGFyZ2V0RGlyZWN0b3J5KCkgeworICAgICAgICByZXR1cm4gdGhpcy50YXJnZXREaXJlY3Rvcnk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB0YXJnZXQgZGlyZWN0b3J5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldERpcmVjdG9yeShTdHJpbmcgZGlyZWN0b3J5KSB7CisgICAgICAgIGlmIChkaXJlY3RvcnkgIT0gbnVsbCAmJiBkaXJlY3RvcnkubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICB0aGlzLnRhcmdldERpcmVjdG9yeSA9IG5ldyBGaWxlKGRpcmVjdG9yeSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aGlzLnRhcmdldERpcmVjdG9yeSA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHRhcmdldCBkaXJlY3RvcnkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0RGlyZWN0b3J5KEZpbGUgZGlyZWN0b3J5KSB7CisgICAgICAgIHRoaXMudGFyZ2V0RGlyZWN0b3J5ID0gZGlyZWN0b3J5OworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgY2xhc3NwYXRoLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0IGdldENsYXNzcGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuY2xhc3NwYXRoOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgY2xhc3NwYXRoLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aChTdHJpbmcgY2xhc3NwYXRoKSB7CisgICAgICAgIHRoaXMuY2xhc3NwYXRoID0gbmV3IExpbmtlZExpc3QoKTsKKworICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihjbGFzc3BhdGgsIEZpbGUucGF0aFNlcGFyYXRvcik7CisgICAgICAgIHdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7CisgICAgICAgICAgICB0aGlzLmNsYXNzcGF0aC5hZGQodG9rZW5pemVyLm5leHRUb2tlbigpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBzZXRzIHRoZSBjbGFzc3BhdGggdXNpbmcgYSBsaXN0IG9mIFN0cmluZ3MKKyAgICAgKiBAcGFyYW0gbCBsaXN0IG9mIHN0cmluZ3MgY29udGFpbmcgdGhlIGNsYXNzcGF0aHBhcnRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoTGlzdChMaXN0IGwpIHsKKyAgICAgICAgdGhpcy5jbGFzc3BhdGggPSBuZXcgTGlua2VkTGlzdChsKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB2ZXJib3NlIG9wZXJhdGlvbiBoYXMgYmVlbiByZXF1ZXN0ZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0VmVyYm9zZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudmVyYm9zZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFR1cm5zIHZlcmJvc2Ugb3BlcmF0aW9uIG9uIG9yIG9mZi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWZXJib3NlKGJvb2xlYW4gdmVyYm9zZSkgeworICAgICAgICB0aGlzLnZlcmJvc2UgPSB2ZXJib3NlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIGRlYnVnZ2luZyBvcGVyYXRpb24gaGFzIGJlZW4gcmVxdWVzdGVkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldERlYnVnKCkgeworICAgICAgICByZXR1cm4gdGhpcy5kZWJ1ZzsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFR1cm5zIGRlYnVnZ2luZyBvcGVyYXRpb24gb24gb3Igb2ZmLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlYnVnKGJvb2xlYW4gZGVidWcpIHsKKyAgICAgICAgdGhpcy5kZWJ1ZyA9IGRlYnVnOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcmVxdWVzdGVkIGVycm9yIHRvbGVyYW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFRvbGVyYW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudG9sZXJhbmNlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZXJyb3IgdG9sZXJhbmNlLCB3aGljaCBpcyB0aGUgbnVtYmVyIG9mCisgICAgICogbm9uLWZhdGFsIGVycm9ycyAocGVyIHVuaXQpIHRoYXQgc2hvdWxkIGJlIHRvbGVyYXRlZCBiZWZvcmUKKyAgICAgKiBjb21waWxhdGlvbiBpcyBhYm9ydGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRvbGVyYW5jZShpbnQgdG9sZXJhbmNlKSB7CisgICAgICAgIHRoaXMudG9sZXJhbmNlID0gdG9sZXJhbmNlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbmFtZSBvZiB0aGUgYmFzZSBjbGFzcyBmb3Igc2NyaXB0cy4gIEl0IG11c3QgYmUgYSBzdWJjbGFzcworICAgICAqIG9mIFNjcmlwdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFNjcmlwdEJhc2VDbGFzcygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuc2NyaXB0QmFzZUNsYXNzOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgYmFzZSBjbGFzcyBmb3Igc2NyaXB0cy4gIEl0IG11c3QgYmUgYSBzdWJjbGFzcworICAgICAqIG9mIFNjcmlwdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTY3JpcHRCYXNlQ2xhc3MoU3RyaW5nIHNjcmlwdEJhc2VDbGFzcykgeworICAgICAgICB0aGlzLnNjcmlwdEJhc2VDbGFzcyA9IHNjcmlwdEJhc2VDbGFzczsKKyAgICB9CisKKyAgICBwdWJsaWMgUGFyc2VyUGx1Z2luRmFjdG9yeSBnZXRQbHVnaW5GYWN0b3J5KCkgeworICAgICAgICBpZiAocGx1Z2luRmFjdG9yeSA9PSBudWxsKSB7CisgICAgICAgICAgICBwbHVnaW5GYWN0b3J5ID0gUGFyc2VyUGx1Z2luRmFjdG9yeS5uZXdJbnN0YW5jZSh0cnVlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGx1Z2luRmFjdG9yeTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQbHVnaW5GYWN0b3J5KFBhcnNlclBsdWdpbkZhY3RvcnkgcGx1Z2luRmFjdG9yeSkgeworICAgICAgICB0aGlzLnBsdWdpbkZhY3RvcnkgPSBwbHVnaW5GYWN0b3J5OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFNjcmlwdEV4dGVuc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRTY3JpcHRFeHRlbnNpb247CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0U2NyaXB0RXh0ZW5zaW9uKFN0cmluZyBkZWZhdWx0U2NyaXB0RXh0ZW5zaW9uKSB7CisgICAgICAgIHRoaXMuZGVmYXVsdFNjcmlwdEV4dGVuc2lvbiA9IGRlZmF1bHRTY3JpcHRFeHRlbnNpb247CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldFJlY29tcGlsZUdyb292eVNvdXJjZShib29sZWFuIHJlY29tcGlsZSkgeworICAgICAgICByZWNvbXBpbGVHcm9vdnlTb3VyY2UgPSByZWNvbXBpbGU7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGdldFJlY29tcGlsZUdyb292eVNvdXJjZSgpeworICAgICAgICByZXR1cm4gcmVjb21waWxlR3Jvb3Z5U291cmNlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRNaW5pbXVtUmVjb21waWxhdGlvbkludGVydmFsKGludCB0aW1lKSB7CisgICAgICAgIG1pbmltdW1SZWNvbXBpbGF0aW9uSW50ZXJ2YWwgPSBNYXRoLm1heCgwLHRpbWUpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgaW50IGdldE1pbmltdW1SZWNvbXBpbGF0aW9uSW50ZXJ2YWwoKSB7CisgICAgICAgIHJldHVybiBtaW5pbXVtUmVjb21waWxhdGlvbkludGVydmFsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFsbG93IHNldHRpbmcgdGhlIGJ5dGVjb2RlIGNvbXBhdGliaWxpdHkuIFRoZSBwYXJhbWV0ZXIgY2FuIHRha2UKKyAgICAgKiBvbmUgb2YgdGhlIHZhbHVlcyA8dHQ+MS41PC90dD4gb3IgPHR0PjEuNDwvdHQ+LiBJZiB3cm9uZyBwYXJhbWV0ZXIKKyAgICAgKiB0aGVuIHRoZSB2YWx1ZSB3aWxsIGRlZmF1bHQgdG8gVk0gZGV0ZXJtaW5lZCB2ZXJzaW9uLgorICAgICAqIAorICAgICAqIEBwYXJhbSB2ZXJzaW9uIHRoZSBieXRlY29kZSBjb21wYXRpYmlsaXR5IG1vZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXRCeXRlY29kZShTdHJpbmcgdmVyc2lvbikgeworICAgICAgICBpZihQUkVfSkRLNS5lcXVhbHModmVyc2lvbikgfHwgUE9TVF9KREs1LmVxdWFscyh2ZXJzaW9uKSkgeworICAgICAgICAgICAgdGhpcy50YXJnZXRCeXRlY29kZSA9IHZlcnNpb247CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIGNvbXBpbGVyIGJ5dGVjb2RlIGNvbXBhdGliaWxpdHkgbW9kZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGJ5dGVjb2RlIGNvbXBhdGliaXR5IG1vZGUuIENhbiBiZSBlaXRoZXIgPHR0PjEuNTwvdHQ+IG9yIDx0dD4xLjQ8L3R0Pi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldEJ5dGVjb2RlKCkgeworICAgICAgICByZXR1cm4gdGhpcy50YXJnZXRCeXRlY29kZTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFZNVmVyc2lvbigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENsYXNzLmZvck5hbWUoSkRLNV9DTEFTU05BTUVfQ0hFQ0spOworICAgICAgICAgICAgcmV0dXJuIFBPU1RfSkRLNTsKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIElHTk9SRQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gUFJFX0pESzU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEdldHMgdGhlIGpvaW50IGNvbXBpbGF0aW9uIG9wdGlvbnMgZm9yIHRoaXMgY29uZmlndXJhdGlvbi4KKyAgICAgKiBAcmV0dXJuIHRoZSBvcHRpb25zCisgICAgICovCisgICAgcHVibGljIE1hcCBnZXRKb2ludENvbXBpbGF0aW9uT3B0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIGpvaW50Q29tcGlsYXRpb25PcHRpb25zOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBqb2ludCBjb21waWxhdGlvbiBvcHRpb25zIGZvciB0aGlzIGNvbmZpZ3VyYXRpb24uIAorICAgICAqIFVzaW5nIG51bGwgd2lsbCBkaXNhYmxlIGpvaW50IGNvbXBpbGF0aW9uLgorICAgICAqIEBwYXJhbSBvcHRpb25zIHRoZSBvcHRpb25zCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Sm9pbnRDb21waWxhdGlvbk9wdGlvbnMoTWFwIG9wdGlvbnMpIHsKKyAgICAgICAgam9pbnRDb21waWxhdGlvbk9wdGlvbnMgPSBvcHRpb25zOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NvbnRyb2wvQ29uZmlndXJhdGlvbkV4Y2VwdGlvbi5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY29udHJvbC9Db25maWd1cmF0aW9uRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM5ZWVlMQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NvbnRyb2wvQ29uZmlndXJhdGlvbkV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbDsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuR3Jvb3Z5RXhjZXB0aW9uSW50ZXJmYWNlOworCisKKworCisvKioKKyAqICBUaHJvd24gd2hlbiBjb25maWd1cmF0aW9uIGRhdGEgaXMgaW52YWxpZC4KKyAqCisgKiAgQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y3BvaXJpZXJAZHJlYW1pbmcub3JnIj5DaHJpcyBQb2lyaWVyPC9hPgorICoKKyAqICBAdmVyc2lvbiAkSWQkCisgKi8KKworcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIGltcGxlbWVudHMgR3Jvb3Z5RXhjZXB0aW9uSW50ZXJmYWNlCit7CisgICAgCisgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIENPTlNUUlVDVElPTiBBTkQgU1VDSAorCisgICAgcHJvdGVjdGVkIEV4Y2VwdGlvbiBjYXVzZTsgICAvLyBUaGUgcGhhc2UgaW4gd2hpY2ggdGhlIGZhaWx1cmVzIG9jY3VycmVkCisKKyAgICAKKyAgIC8qKgorICAgICogIEluaXRpYWxpemVzIHRoZSBleGNlcHRpb24gZnJvbSBhIGNhdXNlIGV4Y2VwdGlvbi4KKyAgICAqLworICAgIAorICAgIHB1YmxpYyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCBFeGNlcHRpb24gY2F1c2UgKSAKKyAgICB7CisgICAgICAgIHN1cGVyKCBjYXVzZS5nZXRNZXNzYWdlKCkgKTsKKyAgICAgICAgdGhpcy5jYXVzZSA9IGNhdXNlOworICAgIH0KKyAgICAKKyAgICAKKyAgIC8qKgorICAgICogIEluaXRpYWxpemVzIHRoZSBleGNlcHRpb24gd2l0aCBqdXN0IGEgbWVzc2FnZS4KKyAgICAqLworICAgIAorICAgIHB1YmxpYyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCBTdHJpbmcgbWVzc2FnZSApCisgICAgeworICAgICAgICBzdXBlciggbWVzc2FnZSApOworICAgIH0KKworICAgIAorICAgIAorICAgLyoqCisgICAgKiAgUmV0dXJucyB0aGUgY2F1c2luZyBleGNlcHRpb24sIGlmIGF2YWlsYWJsZS4KKyAgICAqLworICAgIAorICAgIHB1YmxpYyBUaHJvd2FibGUgZ2V0Q2F1c2UoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNhdXNlOworICAgIH0KKyAgICAKKyAgICAKKyAgIC8qKgorICAgICogIEl0cyBhbHdheXMgZmF0YWwuCisgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ZhdGFsKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAgICAKKyAgICAKKyAgIC8qKgorICAgICogIFNldCBmYXRhbCBpcyBqdXN0IGlnbm9yZWQuCisgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRGYXRhbCggYm9vbGVhbiBmYXRhbCApCisgICAgeworICAgIH0KKyAgICAKK30KKwpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY29udHJvbC9FcnJvckNvbGxlY3Rvci5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY29udHJvbC9FcnJvckNvbGxlY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmYTNkODMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9jb250cm9sL0Vycm9yQ29sbGVjdG9yLmphdmEKQEAgLTAsMCArMSwzMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbDsKKworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLm1lc3NhZ2VzLkV4Y2VwdGlvbk1lc3NhZ2U7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLm1lc3NhZ2VzLkxvY2F0ZWRNZXNzYWdlOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5tZXNzYWdlcy5NZXNzYWdlOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5tZXNzYWdlcy5TeW50YXhFcnJvck1lc3NhZ2U7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLm1lc3NhZ2VzLldhcm5pbmdNZXNzYWdlOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LkNTVE5vZGU7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXguU3ludGF4RXhjZXB0aW9uOworCisvKioKKyAqIEEgYmFzZSBjbGFzcyBmb3IgY29sbGVjdGluZyBtZXNzYWdlcyBhbmQgZXJyb3JzIGR1cmluZyBwcm9jZXNzaW5nLgorICogRWFjaCBDb21waWxhdGlvblVuaXQgc2hvdWxkIGhhdmUgb25lIGFuZCBTb3VyY2VVbml0cyBzaG91bGQgc2hhcmUKKyAqIHRoZWlyIEVycm9yQ29sbGVjdG9yIHdpdGggdGhlIENvbXBpbGF0aW9uVW5pdC4KKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpjcG9pcmllckBkcmVhbWluZy5vcmciPkNocmlzIFBvaXJpZXI8L2E+CisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpibGFja2RyYWdAZ214Lm9yZyI+Sm9jaGVuIFRoZW9kb3JvdTwvYT4KKyAqIEB2ZXJzaW9uICRJZCQKKyAqLworcHVibGljIGNsYXNzIEVycm9yQ29sbGVjdG9yIHsKKyAgICAKKyAgICAvKioKKyAgICAgKiBXYXJuaW5nTWVzc2FnZXMgY29sbGVjdGVkIGR1cmluZyBwcm9jZXNzaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkIExpbmtlZExpc3Qgd2FybmluZ3M7CisgICAgLyoqCisgICAgICogRXJyb3JNZXNzYWdlcyBjb2xsZWN0ZWQgZHVyaW5nIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTGlua2VkTGlzdCBlcnJvcnM7CisgICAgLyoqCisgICAgICogQ29uZmlndXJhdGlvbiBhbmQgb3RoZXIgc2V0dGluZ3MgdGhhdCBjb250cm9sIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29tcGlsZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb247CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIHRoZSBFcnJvclJlcG9ydGVyLgorICAgICAqLworICAgIHB1YmxpYyBFcnJvckNvbGxlY3RvcihDb21waWxlckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgeworICAgICAgICB0aGlzLndhcm5pbmdzID0gbnVsbDsKKyAgICAgICAgdGhpcy5lcnJvcnMgPSBudWxsOworICAgICAgICAKKyAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgYWRkQ29sbGVjdG9yQ29udGVudHMoRXJyb3JDb2xsZWN0b3IgZXIpIHsKKyAgICAgICAgaWYgKGVyLmVycm9ycyE9bnVsbCkgeworICAgICAgICAgICAgaWYgKGVycm9ycz09bnVsbCkgeworICAgICAgICAgICAgICAgIGVycm9ycyA9IGVyLmVycm9yczsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZXJyb3JzLmFkZEFsbChlci5lcnJvcnMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChlci53YXJuaW5ncyE9bnVsbCkgeworICAgICAgICAgICAgaWYgKHdhcm5pbmdzPT1udWxsKSB7CisgICAgICAgICAgICAgICAgd2FybmluZ3MgPSBlci53YXJuaW5nczsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgd2FybmluZ3MuYWRkQWxsKGVyLndhcm5pbmdzKTsKKyAgICAgICAgICAgIH0gICAgICAgICAgICAKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAKKyAgICAKKyAgICAvKioKKyAgICAgKiBBZGRzIGFuIGVycm9yIHRvIHRoZSBtZXNzYWdlIHNldCwgYnV0IGRvbid0IGZhaWwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRXJyb3JBbmRDb250aW51ZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgaWYgKHRoaXMuZXJyb3JzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMuZXJyb3JzID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuZXJyb3JzLmFkZChtZXNzYWdlKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQWRkcyBhIG5vbi1mYXRhbCBlcnJvciB0byB0aGUgbWVzc2FnZSBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRXJyb3IoTWVzc2FnZSBtZXNzYWdlKSB0aHJvd3MgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24geworICAgICAgICBhZGRFcnJvckFuZENvbnRpbnVlKG1lc3NhZ2UpOworCisgICAgICAgIGlmIChlcnJvcnMhPW51bGwgJiYgdGhpcy5lcnJvcnMuc2l6ZSgpID49IGNvbmZpZ3VyYXRpb24uZ2V0VG9sZXJhbmNlKCkpIHsKKyAgICAgICAgICAgIGZhaWxJZkVycm9ycygpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEFkZHMgYW4gb3B0aW9uYWxseS1mYXRhbCBlcnJvciB0byB0aGUgbWVzc2FnZSBzZXQuICBUaHJvd3MKKyAgICAgKiB0aGUgdW5pdCBhcyBhIFBoYXNlRmFpbGVkRXhjZXB0aW9uLCBpZiB0aGUgZXJyb3IgaXMgZmF0YWwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRXJyb3IoTWVzc2FnZSBtZXNzYWdlLCBib29sZWFuIGZhdGFsKSB0aHJvd3MgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24geworICAgICAgICBpZiAoZmF0YWwpIHsKKyAgICAgICAgICAgIGFkZEZhdGFsRXJyb3IobWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBhZGRFcnJvcihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIAorICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIHdyYXBwZXIgZm9yIGFkZEVycm9yKCkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRXJyb3IoU3ludGF4RXhjZXB0aW9uIGVycm9yLCBTb3VyY2VVbml0IHNvdXJjZSkgdGhyb3dzIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uIHsKKyAgICAgICAgYWRkRXJyb3IoTWVzc2FnZS5jcmVhdGUoZXJyb3IsIHNvdXJjZSksIGVycm9yLmlzRmF0YWwoKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSB3cmFwcGVyIGZvciBhZGRFcnJvcigpLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEVycm9yKFN0cmluZyB0ZXh0LCBDU1ROb2RlIGNvbnRleHQsIFNvdXJjZVVuaXQgc291cmNlKSB0aHJvd3MgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24geworICAgICAgICBhZGRFcnJvcihuZXcgTG9jYXRlZE1lc3NhZ2UodGV4dCwgY29udGV4dCwgc291cmNlKSk7CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIEFkZHMgYSBmYXRhbCBleGNlcHRpb24gdG8gdGhlIG1lc3NhZ2Ugc2V0IGFuZCB0aHJvd3MKKyAgICAgKiB0aGUgdW5pdCBhcyBhIFBoYXNlRmFpbGVkRXhjZXB0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEZhdGFsRXJyb3IoTWVzc2FnZSBtZXNzYWdlKSB0aHJvd3MgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24geworICAgICAgICBhZGRFcnJvcihtZXNzYWdlKTsKKyAgICAgICAgZmFpbElmRXJyb3JzKCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBhZGRFeGNlcHRpb24oRXhjZXB0aW9uIGNhdXNlLCBTb3VyY2VVbml0IHNvdXJjZSkgdGhyb3dzIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uIHsKKyAgICAgICAgYWRkRXJyb3IobmV3IEV4Y2VwdGlvbk1lc3NhZ2UoY2F1c2UsY29uZmlndXJhdGlvbi5nZXREZWJ1ZygpLHNvdXJjZSkpOworICAgICAgICBmYWlsSWZFcnJvcnMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIGFueSBlcnJvcnMgcGVuZGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNFcnJvcnMoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmVycm9ycyAhPSBudWxsOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIGFueSB3YXJuaW5ncyBwZW5kaW5nLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc1dhcm5pbmdzKCkgeworICAgICAgICByZXR1cm4gdGhpcy53YXJuaW5ncyAhPSBudWxsOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHdhcm5pbmdzLCBvciBudWxsIGlmIHRoZXJlIGFyZSBub25lLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0IGdldFdhcm5pbmdzKCkgeworICAgICAgICByZXR1cm4gdGhpcy53YXJuaW5nczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGVycm9ycywgb3IgbnVsbCBpZiB0aGVyZSBhcmUgbm9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdCBnZXRFcnJvcnMoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmVycm9yczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygd2FybmluZ3MuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRXYXJuaW5nQ291bnQoKSB7CisgICAgICAgIHJldHVybiAoKHRoaXMud2FybmluZ3MgPT0gbnVsbCkgPyAwIDogdGhpcy53YXJuaW5ncy5zaXplKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBlcnJvcnMuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRFcnJvckNvdW50KCkgeworICAgICAgICByZXR1cm4gKCh0aGlzLmVycm9ycyA9PSBudWxsKSA/IDAgOiB0aGlzLmVycm9ycy5zaXplKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNwZWNpZmllZCB3YXJuaW5nIG1lc3NhZ2UsIG9yIG51bGwuCisgICAgICovCisgICAgcHVibGljIFdhcm5pbmdNZXNzYWdlIGdldFdhcm5pbmcoaW50IGluZGV4KSB7CisgICAgICAgIGlmIChpbmRleCA8IGdldFdhcm5pbmdDb3VudCgpKSB7CisgICAgICAgICAgICByZXR1cm4gKFdhcm5pbmdNZXNzYWdlKSB0aGlzLndhcm5pbmdzLmdldChpbmRleCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc3BlY2lmaWVkIGVycm9yIG1lc3NhZ2UsIG9yIG51bGwuCisgICAgICovCisgICAgcHVibGljIE1lc3NhZ2UgZ2V0RXJyb3IoaW50IGluZGV4KSB7CisgICAgICAgIGlmIChpbmRleCA8IGdldEVycm9yQ291bnQoKSkgeworICAgICAgICAgICAgcmV0dXJuIChNZXNzYWdlKSB0aGlzLmVycm9ycy5nZXQoaW5kZXgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGxhc3QgZXJyb3IgcmVwb3J0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgTWVzc2FnZSBnZXRMYXN0RXJyb3IoKSB7CisgICAgICAgIHJldHVybiAoTWVzc2FnZSkgdGhpcy5lcnJvcnMuZ2V0TGFzdCgpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSByb3V0aW5lIHRvIHJldHVybiB0aGUgc3BlY2lmaWVkIGVycm9yJ3MKKyAgICAgKiB1bmRlcmx5aW5nIFN5bnRheEV4Y2VwdGlvbiwgb3IgbnVsbCBpZiBpdCBpc24ndCBvbmUuCisgICAgICovCisgICAgcHVibGljIFN5bnRheEV4Y2VwdGlvbiBnZXRTeW50YXhFcnJvcihpbnQgaW5kZXgpIHsKKyAgICAgICAgU3ludGF4RXhjZXB0aW9uIGV4Y2VwdGlvbiA9IG51bGw7CisKKyAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gZ2V0RXJyb3IoaW5kZXgpOworICAgICAgICBpZiAobWVzc2FnZSAhPSBudWxsICYmIG1lc3NhZ2UgaW5zdGFuY2VvZiBTeW50YXhFcnJvck1lc3NhZ2UpIHsKKyAgICAgICAgICAgIGV4Y2VwdGlvbiA9ICgoU3ludGF4RXJyb3JNZXNzYWdlKSBtZXNzYWdlKS5nZXRDYXVzZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBleGNlcHRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVuaWVuY2Ugcm91dGluZSB0byByZXR1cm4gdGhlIHNwZWNpZmllZCBlcnJvcidzCisgICAgICogdW5kZXJseWluZyBFeGNlcHRpb24sIG9yIG51bGwgaWYgaXQgaXNuJ3Qgb25lLgorICAgICAqLworICAgIHB1YmxpYyBFeGNlcHRpb24gZ2V0RXhjZXB0aW9uKGludCBpbmRleCkgeworICAgICAgICBFeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsKKworICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBnZXRFcnJvcihpbmRleCk7CisgICAgICAgIGlmIChtZXNzYWdlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlIGluc3RhbmNlb2YgRXhjZXB0aW9uTWVzc2FnZSkgeworICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiA9ICgoRXhjZXB0aW9uTWVzc2FnZSkgbWVzc2FnZSkuZ2V0Q2F1c2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UgaW5zdGFuY2VvZiBTeW50YXhFcnJvck1lc3NhZ2UpIHsKKyAgICAgICAgICAgICAgICBleGNlcHRpb24gPSAoKFN5bnRheEVycm9yTWVzc2FnZSkgbWVzc2FnZSkuZ2V0Q2F1c2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXhjZXB0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBXYXJuaW5nTWVzc2FnZSB0byB0aGUgbWVzc2FnZSBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkV2FybmluZyhXYXJuaW5nTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgIGlmIChtZXNzYWdlLmlzUmVsZXZhbnQoY29uZmlndXJhdGlvbi5nZXRXYXJuaW5nTGV2ZWwoKSkpIHsKKyAgICAgICAgICAgIGlmICh0aGlzLndhcm5pbmdzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aGlzLndhcm5pbmdzID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy53YXJuaW5ncy5hZGQobWVzc2FnZSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIHdyYXBwZXIgZm9yIGFkZFdhcm5pbmcoKSB0aGF0IHdvbid0IGNyZWF0ZSBhbiBvYmplY3QKKyAgICAgKiB1bmxlc3MgaXQgaXMgcmVsZXZhbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkV2FybmluZyhpbnQgaW1wb3J0YW5jZSwgU3RyaW5nIHRleHQsIENTVE5vZGUgY29udGV4dCwgU291cmNlVW5pdCBzb3VyY2UpIHsKKyAgICAgICAgaWYgKFdhcm5pbmdNZXNzYWdlLmlzUmVsZXZhbnQoaW1wb3J0YW5jZSwgY29uZmlndXJhdGlvbi5nZXRXYXJuaW5nTGV2ZWwoKSkpIHsKKyAgICAgICAgICAgIGFkZFdhcm5pbmcobmV3IFdhcm5pbmdNZXNzYWdlKGltcG9ydGFuY2UsIHRleHQsIGNvbnRleHQsIHNvdXJjZSkpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIAorICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIHdyYXBwZXIgZm9yIGFkZFdhcm5pbmcoKSB0aGF0IHdvbid0IGNyZWF0ZSBhbiBvYmplY3QKKyAgICAgKiB1bmxlc3MgaXQgaXMgcmVsZXZhbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkV2FybmluZyhpbnQgaW1wb3J0YW5jZSwgU3RyaW5nIHRleHQsIE9iamVjdCBkYXRhLCBDU1ROb2RlIGNvbnRleHQsIFNvdXJjZVVuaXQgc291cmNlKSB7CisgICAgICAgIGlmIChXYXJuaW5nTWVzc2FnZS5pc1JlbGV2YW50KGltcG9ydGFuY2UsIGNvbmZpZ3VyYXRpb24uZ2V0V2FybmluZ0xldmVsKCkpKSB7CisgICAgICAgICAgICBhZGRXYXJuaW5nKG5ldyBXYXJuaW5nTWVzc2FnZShpbXBvcnRhbmNlLCB0ZXh0LCBkYXRhLCBjb250ZXh0LCBzb3VyY2UpKTsKKyAgICAgICAgfQorICAgIH0KKyAgIAorCisgICAgLyoqCisgICAgICogQ2F1c2VzIHRoZSBjdXJyZW50IHBoYXNlIHRvIGZhaWwgYnkgdGhyb3dpbmcgYQorICAgICAqIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGZhaWxJZkVycm9ycygpIHRocm93cyBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChoYXNFcnJvcnMoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE11bHRpcGxlQ29tcGlsYXRpb25FcnJvcnNFeGNlcHRpb24odGhpcyk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBPVVRQVVQKKworCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlKFByaW50V3JpdGVyIHdyaXRlciwgSmFuaXRvciBqYW5pdG9yLCBMaXN0IG1lc3NhZ2VzLCBTdHJpbmcgdHh0KSB7CisgICAgICAgIGlmIChtZXNzYWdlcz09bnVsbCB8fCBtZXNzYWdlcy5zaXplKCk9PTApIHJldHVybjsKKyAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBtZXNzYWdlcy5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSAoTWVzc2FnZSkgaXRlcmF0b3IubmV4dCgpOworICAgICAgICAgICAgbWVzc2FnZS53cml0ZSh3cml0ZXIsIGphbml0b3IpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbi5nZXREZWJ1ZygpICYmIChtZXNzYWdlIGluc3RhbmNlb2YgU3ludGF4RXJyb3JNZXNzYWdlKSl7CisgICAgICAgICAgICAgICAgU3ludGF4RXJyb3JNZXNzYWdlIHNlbSA9IChTeW50YXhFcnJvck1lc3NhZ2UpIG1lc3NhZ2U7CisgICAgICAgICAgICAgICAgc2VtLmdldENhdXNlKCkucHJpbnRTdGFja1RyYWNlKHdyaXRlcik7CisgICAgICAgICAgICB9IAorICAgICAgICB9CisKKyAgICAgICAgd3JpdGVyLnByaW50bG4oKTsKKyAgICAgICAgd3JpdGVyLnByaW50KG1lc3NhZ2VzLnNpemUoKSk7CisgICAgICAgIHdyaXRlci5wcmludCgiICIrdHh0KTsKKyAgICAgICAgaWYgKG1lc3NhZ2VzLnNpemUoKT4xKSB3cml0ZXIucHJpbnQoInMiKTsKKyAgICAgICAgd3JpdGVyLnByaW50bG4oKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogV3JpdGVzIGVycm9yIG1lc3NhZ2VzIHRvIHRoZSBzcGVjaWZpZWQgUHJpbnRXcml0ZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGUoUHJpbnRXcml0ZXIgd3JpdGVyLCBKYW5pdG9yIGphbml0b3IpIHsKKyAgICAgICAgd3JpdGUod3JpdGVyLGphbml0b3Isd2FybmluZ3MsIndhcm5pbmciKTsKKyAgICAgICAgd3JpdGUod3JpdGVyLGphbml0b3IsZXJyb3JzLCJlcnJvciIpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY29udHJvbC9HZW5lcmljc1Zpc2l0b3IuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NvbnRyb2wvR2VuZXJpY3NWaXNpdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhkMzhkYQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NvbnRyb2wvR2VuZXJpY3NWaXNpdG9yLmphdmEKQEAgLTAsMCArMSwxMzUgQEAKKy8qDQorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2w7DQorDQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LkNsYXNzQ29kZVZpc2l0b3JTdXBwb3J0Ow0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5DbGFzc05vZGU7DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LkdlbmVyaWNzVHlwZTsNCisNCisvKioNCisgKiBjbGFzcyB1c2VkIHRvIHZlcmlmeSBjb3JyZWN0IHVzYWdlIG9mIGdlbmVyaWNzIGluIA0KKyAqIGNsYXNzIGhlYWRlciAoY2xhc3MgYW5kIHN1cGVyY2xhc3MgZGVjbGFyYXRpb24pIA0KKyAqIEBhdXRob3IgSm9jaGVuIFRoZW9kb3JvdQ0KKyAqLw0KK3B1YmxpYyBjbGFzcyBHZW5lcmljc1Zpc2l0b3IgZXh0ZW5kcyBDbGFzc0NvZGVWaXNpdG9yU3VwcG9ydCB7DQorICAgIHByaXZhdGUgU291cmNlVW5pdCBzb3VyY2U7DQorICAgIA0KKyAgICBwdWJsaWMgR2VuZXJpY3NWaXNpdG9yKFNvdXJjZVVuaXQgc291cmNlKSB7DQorICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTsNCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIFNvdXJjZVVuaXQgZ2V0U291cmNlVW5pdCgpIHsNCisgICAgICAgIHJldHVybiBzb3VyY2U7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyB2b2lkIHZpc2l0Q2xhc3MoQ2xhc3NOb2RlIG5vZGUpIHsNCisgICAgICAgIGJvb2xlYW4gZXJyb3I9Y2hlY2tXaWxkY2FyZChub2RlKTsNCisgICAgICAgIGlmIChlcnJvcikgcmV0dXJuOw0KKyAgICAgICAgY2hlY2tHZW5lcmljc1VzYWdlKG5vZGUuZ2V0VW5yZXNvbHZlZFN1cGVyQ2xhc3MoZmFsc2UpLCBub2RlLmdldFN1cGVyQ2xhc3MoKSk7DQorICAgICAgICBDbGFzc05vZGVbXSBpbnRlcmZhY2VzID0gbm9kZS5nZXRJbnRlcmZhY2VzKCk7DQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGludGVyZmFjZXMubGVuZ3RoOyBpKyspIHsNCisgICAgICAgICAgICBjaGVja0dlbmVyaWNzVXNhZ2UoaW50ZXJmYWNlc1tpXSwgaW50ZXJmYWNlc1tpXS5yZWRpcmVjdCgpKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrV2lsZGNhcmQoQ2xhc3NOb2RlIGNuKSB7DQorICAgICAgICBDbGFzc05vZGUgc24gPSBjbi5nZXRVbnJlc29sdmVkU3VwZXJDbGFzcyhmYWxzZSk7DQorICAgICAgICBpZiAoc249PW51bGwpIHJldHVybiBmYWxzZTsNCisgICAgICAgIEdlbmVyaWNzVHlwZVtdIGdlbmVyaWNzID0gc24uZ2V0R2VuZXJpY3NUeXBlcygpOw0KKyAgICAgICAgaWYgKGdlbmVyaWNzPT1udWxsKSByZXR1cm4gZmFsc2U7DQorICAgICAgICBib29sZWFuIGVycm9yPWZhbHNlOw0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBnZW5lcmljcy5sZW5ndGg7IGkrKykgew0KKyAgICAgICAgICAgIGlmKGdlbmVyaWNzW2ldLmlzV2lsZGNhcmQoKSkgew0KKyAgICAgICAgICAgICAgICBhZGRFcnJvcigiQSBzdXBlcnR5cGUgbWF5IG5vdCBzcGVjaWZpeSBhIHdpbGRjYXJkIHR5cGUiLHNuKTsNCisgICAgICAgICAgICAgICAgZXJyb3IgPSB0cnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBlcnJvcjsNCisgICAgfQ0KKw0KKyAgICBwcml2YXRlIHZvaWQgY2hlY2tHZW5lcmljc1VzYWdlKENsYXNzTm9kZSBuLCBDbGFzc05vZGUgY24pIHsNCisgICAgICAgIEdlbmVyaWNzVHlwZVtdIG5UeXBlcyA9IG4uZ2V0R2VuZXJpY3NUeXBlcygpOw0KKyAgICAgICAgR2VuZXJpY3NUeXBlW10gY25UeXBlcyA9IGNuLmdldEdlbmVyaWNzVHlwZXMoKTsNCisgICAgICAgIC8vIHJhdyB0eXBlIHVzYWdlIGlzIGFsd2F5cyBhbGxvd2VkDQorICAgICAgICBpZiAoblR5cGVzPT1udWxsKSByZXR1cm47DQorICAgICAgICAvLyBwYXJhbWV0ZXJpemUgYSB0eXBlIGJ5IHVzaW5nIGFsbCBvZiB0aGUgcGFyYW1ldGVycyBvbmx5DQorICAgICAgICBpZiAoY25UeXBlcz09bnVsbCkgew0KKyAgICAgICAgICAgIGFkZEVycm9yKCAiVGhlIGNsYXNzICIrbi5nZXROYW1lKCkrIiByZWZlcnMgdG8gdGhlIGNsYXNzICIrDQorICAgICAgICAgICAgICAgICAgICAgIGNuLmdldE5hbWUoKSsiIGFuZCB1c2VzICIrblR5cGVzLmxlbmd0aCsNCisgICAgICAgICAgICAgICAgICAgICAgIiBwYXJhbWV0ZXJzLCBidXQgdGhlIHJlZmVycmVkIGNsYXNzIHRha2VzIG5vIHBhcmFtZXRlcnMiLCBuKTsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgICAgICBpZiAoblR5cGVzLmxlbmd0aCE9Y25UeXBlcy5sZW5ndGgpIHsNCisgICAgICAgICAgICBhZGRFcnJvciggIlRoZSBjbGFzcyAiK24uZ2V0TmFtZSgpKyIgcmVmZXJzIHRvIHRoZSBjbGFzcyAiKw0KKyAgICAgICAgICAgICAgICAgICAgICBjbi5nZXROYW1lKCkrIiBhbmQgdXNlcyAiK25UeXBlcy5sZW5ndGgrDQorICAgICAgICAgICAgICAgICAgICAgICIgcGFyYW1ldGVycywgYnV0IHRoZSByZWZlcmVkIGNsYXNzIG5lZWRzICIrDQorICAgICAgICAgICAgICAgICAgICAgIGNuVHlwZXMubGVuZ3RoLCBuKTsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgICAgICAvLyBjaGVjayBib3VuZHMNCisgICAgICAgIGZvciAoaW50IGk9MDsgaTxuVHlwZXMubGVuZ3RoOyBpKyspIHsNCisgICAgICAgICAgICBDbGFzc05vZGUgblR5cGUgPSBuVHlwZXNbaV0uZ2V0VHlwZSgpOw0KKyAgICAgICAgICAgIENsYXNzTm9kZSBjblR5cGUgPSBjblR5cGVzW2ldLmdldFR5cGUoKTsNCisgICAgICAgICAgICBpZiAoIW5UeXBlLmlzRGVyaXZlZEZyb20oY25UeXBlKSkgew0KKyAgICAgICAgICAgICAgICBpZiAoY25UeXBlLmlzSW50ZXJmYWNlKCkgJiYgblR5cGUuZGVjbGFyZXNJbnRlcmZhY2UoY25UeXBlLmdldE5hbWUoKSkpIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICBhZGRFcnJvcigiVGhlIHR5cGUgIituVHlwZXNbaV0uZ2V0TmFtZSgpKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAiIGlzIG5vdCBhIHZhbGlkIHN1YnN0aXR1dGUgZm9yIHRoZSBib3VuZGVkIHBhcmFtZXRlciA8IisNCisgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UHJpbnROYW1lKGNuVHlwZXNbaV0pKyI+IixuKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgU3RyaW5nIGdldFByaW50TmFtZShHZW5lcmljc1R5cGUgZ3QpIHsNCisgICAgICAgIFN0cmluZyByZXQgPSBndC5nZXROYW1lKCk7DQorICAgICAgICBDbGFzc05vZGVbXSB1cHBlckJvdW5kcyA9IGd0LmdldFVwcGVyQm91bmRzKCk7DQorICAgICAgICBDbGFzc05vZGUgbG93ZXJCb3VuZCA9IGd0LmdldExvd2VyQm91bmQoKTsNCisgICAgICAgIGlmICh1cHBlckJvdW5kcyE9bnVsbCkgew0KKyAgICAgICAgICAgIHJldCArPSAiIGV4dGVuZHMgIjsNCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHVwcGVyQm91bmRzLmxlbmd0aDsgaSsrKSB7DQorICAgICAgICAgICAgICAgIHJldCArPSBnZXRQcmludE5hbWUodXBwZXJCb3VuZHNbaV0pOw0KKyAgICAgICAgICAgICAgICBpZiAoaSsxPHVwcGVyQm91bmRzLmxlbmd0aCkgcmV0ICs9ICIgJiAiOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSBpZiAobG93ZXJCb3VuZCE9bnVsbCkgew0KKyAgICAgICAgICAgIHJldCArPSAiIHN1cGVyICIrZ2V0UHJpbnROYW1lKGxvd2VyQm91bmQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJldDsNCisNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UHJpbnROYW1lKENsYXNzTm9kZSBjbikgew0KKyAgICAgICAgU3RyaW5nIHJldCA9IGNuLmdldE5hbWUoKTsNCisgICAgICAgIEdlbmVyaWNzVHlwZVtdIGd0cyA9IGNuLmdldEdlbmVyaWNzVHlwZXMoKTsNCisgICAgICAgIGlmIChndHMhPW51bGwpIHsNCisgICAgICAgICAgICByZXQgKz0gIjwiOw0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ3RzLmxlbmd0aDsgaSsrKSB7DQorICAgICAgICAgICAgICAgIGlmIChpIT0wKSByZXQrPSIsIjsNCisgICAgICAgICAgICAgICAgcmV0Kz1nZXRQcmludE5hbWUoZ3RzW2ldKTsNCisgICAgICAgICAgICB9IA0KKyAgICAgICAgICAgIHJldCs9Ij4iOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJldDsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrQm91bmRzKENsYXNzTm9kZVtdIGdpdmVuLCBDbGFzc05vZGVbXSByZXN0cmljdGlvbnMpIHsNCisgICAgICAgIGlmIChyZXN0cmljdGlvbnM9PW51bGwpIHJldHVybjsNCisgICAgICAgIGZvciAoaW50IGk9MDsgaTxnaXZlbi5sZW5ndGg7IGkrKykgew0KKyAgICAgICAgICAgIGZvciAoaW50IGo9MDsgajxyZXN0cmljdGlvbnMubGVuZ3RoOyBqKyspIHsNCisgICAgICAgICAgICAgICAgaWYgKCEgZ2l2ZW5baV0uaXNEZXJpdmVkRnJvbShyZXN0cmljdGlvbnNbal0pKXt9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NvbnRyb2wvSGFzQ2xlYW51cC5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY29udHJvbC9IYXNDbGVhbnVwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE4YWFjYgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NvbnRyb2wvSGFzQ2xlYW51cC5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbDsKKworLyoqCisgKiAgQW4gaW50ZXJmYWNlIGZvciB0aGluZ3MgdGhhdCBuZWVkIHRvIGJlIGNsZWFuZWQgdXAgYWZ0ZXIKKyAqICBvcGVyYXRpb25zIGNvbXBsZXRlLgorICoKKyAqICBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpjcG9pcmllckBkcmVhbWluZy5vcmciPkNocmlzIFBvaXJpZXI8L2E+CisgKgorICogIEB2ZXJzaW9uICRJZCQKKyAqLworCitwdWJsaWMgaW50ZXJmYWNlIEhhc0NsZWFudXAgCit7CisgICAgdm9pZCBjbGVhbnVwKCk7Cit9CisKKworCisKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NvbnRyb2wvSmFuaXRvci5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY29udHJvbC9KYW5pdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYwMDM4NwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NvbnRyb2wvSmFuaXRvci5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqICBBbiBhZ2VudCB0aGF0IGNhbiBiZSB1c2VkIHRvIGRlZmVyIGNsZWFudXAgb3BlcmF0aW9ucyB0byAKKyAqICBhIGxhdGVyIHRpbWUuICBVc2VycyBtdWNoIGltcGxlbWVudCB0aGUgSGFzQ2xlYW51cCBpbnRlcmZhY2UuICAKKyAqCisgKiAgQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y3BvaXJpZXJAZHJlYW1pbmcub3JnIj5DaHJpcyBQb2lyaWVyPC9hPgorICoKKyAqICBAdmVyc2lvbiAkSWQkCisgKi8KKworcHVibGljIGNsYXNzIEphbml0b3IgaW1wbGVtZW50cyBIYXNDbGVhbnVwCit7CisgICAgcHJpdmF0ZSBmaW5hbCBTZXQgcGVuZGluZyA9IG5ldyBIYXNoU2V0KCk7ICAgLy8gQWxsIG9iamVjdHMgcGVuZGluZyBjbGVhbnVwCisgICAgCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXIoIEhhc0NsZWFudXAgb2JqZWN0ICkKKyAgICB7CisgICAgICAgIHBlbmRpbmcuYWRkKCBvYmplY3QgKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgY2xlYW51cCgpCisgICAgeworICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IHBlbmRpbmcuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUoIGl0ZXJhdG9yLmhhc05leHQoKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIEhhc0NsZWFudXAgb2JqZWN0ID0gKEhhc0NsZWFudXApaXRlcmF0b3IubmV4dCgpOworICAgICAgICAgICAgCisgICAgICAgICAgICB0cnkgeyBvYmplY3QuY2xlYW51cCgpOyB9IGNhdGNoKCBFeGNlcHRpb24gZSApIHsKKyAgICAgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcGVuZGluZy5jbGVhcigpOworICAgIH0KK30KKworCisKKwpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY29udHJvbC9MYWJlbFZlcmlmaWVyLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9jb250cm9sL0xhYmVsVmVyaWZpZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGY1NmI5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY29udHJvbC9MYWJlbFZlcmlmaWVyLmphdmEKQEAgLTAsMCArMSwxNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2w7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5DbGFzc0NvZGVWaXNpdG9yU3VwcG9ydDsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5zdG10LkJyZWFrU3RhdGVtZW50OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuQ29udGludWVTdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3Quc3RtdC5Eb1doaWxlU3RhdGVtZW50OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuRm9yU3RhdGVtZW50OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuU3RhdGVtZW50OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuU3dpdGNoU3RhdGVtZW50OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuV2hpbGVTdGF0ZW1lbnQ7CisKKy8qKgorICogVGhpcyBjbGFzcyBjaGVja3MgdGhlIGhhbmRsaW5nIG9mIGxhYmVscyBpbiB0aGUgQVNUCisgKiAKKyAqIEBhdXRob3IgSm9jaGVuIFRoZW9kb3JvdQorICovCitwdWJsaWMgY2xhc3MgTGFiZWxWZXJpZmllciBleHRlbmRzIENsYXNzQ29kZVZpc2l0b3JTdXBwb3J0IHsKKworICAgIHByaXZhdGUgU291cmNlVW5pdCBzb3VyY2U7CisgICAgcHJpdmF0ZSBMaW5rZWRMaXN0IHZpc2l0ZWRMYWJlbHM7CisgICAgcHJpdmF0ZSBMaW5rZWRMaXN0IGNvbnRpbnVlTGFiZWxzOworICAgIHByaXZhdGUgTGlua2VkTGlzdCBicmVha0xhYmVsczsKKyAgICBib29sZWFuIGluTG9vcD1mYWxzZTsKKyAgICBib29sZWFuIGluU3dpdGNoPWZhbHNlOworICAgIAorICAgIHB1YmxpYyBMYWJlbFZlcmlmaWVyKFNvdXJjZVVuaXQgc3JjKSB7CisgICAgICAgIHNvdXJjZSA9IHNyYzsKKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIFNvdXJjZVVuaXQgZ2V0U291cmNlVW5pdCgpIHsKKyAgICAgICAgcmV0dXJuIHNvdXJjZTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSB2b2lkIGluaXQoKXsKKyAgICAgICAgdmlzaXRlZExhYmVscyA9IG5ldyBMaW5rZWRMaXN0KCk7CisgICAgICAgIGNvbnRpbnVlTGFiZWxzID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICAgICAgYnJlYWtMYWJlbHMgPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICBpbkxvb3A9ZmFsc2U7CisgICAgICAgIGluU3dpdGNoPWZhbHNlOworICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgdm9pZCB2aXNpdENsYXNzQ29kZUNvbnRhaW5lcihTdGF0ZW1lbnQgY29kZSkgeworICAgICAgICBpbml0KCk7CisgICAgICAgIHN1cGVyLnZpc2l0Q2xhc3NDb2RlQ29udGFpbmVyKGNvZGUpOworICAgICAgICBhc3NlcnROb0xhYmVsc01pc3NlZCgpOworICAgIH0KKyAgICAKKyAgIHB1YmxpYyB2b2lkIHZpc2l0U3RhdGVtZW50KFN0YXRlbWVudCBzdGF0ZW1lbnQpIHsKKyAgICAgICBTdHJpbmcgbGFiZWwgPSBzdGF0ZW1lbnQuZ2V0U3RhdGVtZW50TGFiZWwoKTsKKyAgICAgICAKKyAgICAgICBpZiAobGFiZWwhPW51bGwpIHsKKyAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gYnJlYWtMYWJlbHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICBCcmVha1N0YXRlbWVudCBlbGVtZW50ID0gKEJyZWFrU3RhdGVtZW50KSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmdldExhYmVsKCkuZXF1YWxzKGxhYmVsKSkgaXRlci5yZW1vdmUoKTsKKyAgICAgICAgICAgfQorICAgICAgICAgICAKKyAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gY29udGludWVMYWJlbHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICBDb250aW51ZVN0YXRlbWVudCBlbGVtZW50ID0gKENvbnRpbnVlU3RhdGVtZW50KSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmdldExhYmVsKCkuZXF1YWxzKGxhYmVsKSkgaXRlci5yZW1vdmUoKTsKKyAgICAgICAgICAgfQorICAgICAgICAgICAKKyAgICAgICAgICAgdmlzaXRlZExhYmVscy5hZGQobGFiZWwpOworICAgICAgIH0KKyAgICAgICAKKyAgICAgICBzdXBlci52aXNpdFN0YXRlbWVudChzdGF0ZW1lbnQpOworfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHZpc2l0Rm9yTG9vcChGb3JTdGF0ZW1lbnQgZm9yTG9vcCkgeworICAgICAgICBib29sZWFuIG9sZEluTG9vcCA9IGluTG9vcDsKKyAgICAgICAgaW5Mb29wID0gdHJ1ZTsKKyAgICAgICAgc3VwZXIudmlzaXRGb3JMb29wKGZvckxvb3ApOworICAgICAgICBpbkxvb3AgPSBvbGRJbkxvb3A7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHZpc2l0RG9XaGlsZUxvb3AoRG9XaGlsZVN0YXRlbWVudCBsb29wKSB7CisgICAgICAgIGJvb2xlYW4gb2xkSW5Mb29wID0gaW5Mb29wOworICAgICAgICBpbkxvb3AgPSB0cnVlOworICAgICAgICBzdXBlci52aXNpdERvV2hpbGVMb29wKGxvb3ApOworICAgICAgICBpbkxvb3AgPSBvbGRJbkxvb3A7CisgICAgfSAgICAgCisgICAgCisgICAgcHVibGljIHZvaWQgdmlzaXRXaGlsZUxvb3AoV2hpbGVTdGF0ZW1lbnQgbG9vcCkgeworICAgICAgICBib29sZWFuIG9sZEluTG9vcCA9IGluTG9vcDsKKyAgICAgICAgaW5Mb29wID0gdHJ1ZTsKKyAgICAgICAgc3VwZXIudmlzaXRXaGlsZUxvb3AobG9vcCk7CisgICAgICAgIGluTG9vcCA9IG9sZEluTG9vcDsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdmlzaXRCcmVha1N0YXRlbWVudChCcmVha1N0YXRlbWVudCBzdGF0ZW1lbnQpIHsKKyAgICAgICAgU3RyaW5nIGxhYmVsID0gc3RhdGVtZW50LmdldExhYmVsKCk7CisgICAgICAgIGJvb2xlYW4gaGFzTmFtZWRMYWJlbCA9IGxhYmVsIT1udWxsOworICAgICAgICBpZiAoIWhhc05hbWVkTGFiZWwgJiYgIWluTG9vcCAmJiAhaW5Td2l0Y2gpIHsKKyAgICAgICAgICAgIGFkZEVycm9yKCJ0aGUgYnJlYWsgc3RhdGVtZW50IGlzIG9ubHkgYWxsb3dlZCBpbnNpZGUgbG9vcHMgb3Igc3dpdGNoZXMiLHN0YXRlbWVudCk7CisgICAgICAgIH0gZWxzZSBpZiAoaGFzTmFtZWRMYWJlbCAmJiAhaW5Mb29wKSB7CisgICAgICAgICAgICBhZGRFcnJvcigidGhlIGJyZWFrIHN0YXRlbWVudCB3aXRoIG5hbWVkIGxhYmVsIGlzIG9ubHkgYWxsb3dlZCBpbnNpZGUgbG9vcHMiLHN0YXRlbWVudCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxhYmVsIT1udWxsKSB7CisgICAgICAgICAgICBib29sZWFuIGZvdW5kPWZhbHNlOworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gdmlzaXRlZExhYmVscy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZWxlbWVudCA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmVxdWFscyhsYWJlbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWZvdW5kKSBicmVha0xhYmVscy5hZGQoc3RhdGVtZW50KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgc3VwZXIudmlzaXRCcmVha1N0YXRlbWVudChzdGF0ZW1lbnQpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB2aXNpdENvbnRpbnVlU3RhdGVtZW50KENvbnRpbnVlU3RhdGVtZW50IHN0YXRlbWVudCkgeworICAgICAgICBTdHJpbmcgbGFiZWwgPSBzdGF0ZW1lbnQuZ2V0TGFiZWwoKTsKKyAgICAgICAgYm9vbGVhbiBoYXNOYW1lZExhYmVsID0gbGFiZWwhPW51bGw7CisgICAgICAgIGlmICghaGFzTmFtZWRMYWJlbCAmJiAhaW5Mb29wKSB7CisgICAgICAgICAgICBhZGRFcnJvcigidGhlIGNvbnRpbnVlIHN0YXRlbWVudCBpcyBvbmx5IGFsbG93ZWQgaW5zaWRlIGxvb3BzIixzdGF0ZW1lbnQpOworICAgICAgICB9IAorICAgICAgICBpZiAobGFiZWwhPW51bGwpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gZm91bmQ9ZmFsc2U7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB2aXNpdGVkTGFiZWxzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIFN0cmluZyBlbGVtZW50ID0gKFN0cmluZykgaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZXF1YWxzKGxhYmVsKSkgeworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghZm91bmQpIGNvbnRpbnVlTGFiZWxzLmFkZChzdGF0ZW1lbnQpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBzdXBlci52aXNpdENvbnRpbnVlU3RhdGVtZW50KHN0YXRlbWVudCk7CisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydE5vTGFiZWxzTWlzc2VkKCkgeworICAgICAgICAvL1RPRE86IHJlcG9ydCBtdWx0aXBsZSBtaXNzaW5nIGxhYmVscyBvZiB0aGUgc2FtZSBuYW1lIG9ubHkgb25jZQorICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb250aW51ZUxhYmVscy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIENvbnRpbnVlU3RhdGVtZW50IGVsZW1lbnQgPSAoQ29udGludWVTdGF0ZW1lbnQpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgYWRkRXJyb3IoImNvbnRpbnVlIHRvIG1pc3NpbmcgbGFiZWwiLGVsZW1lbnQpOworICAgICAgICB9CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGJyZWFrTGFiZWxzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgQnJlYWtTdGF0ZW1lbnQgZWxlbWVudCA9IChCcmVha1N0YXRlbWVudCkgaXRlci5uZXh0KCk7CisgICAgICAgICAgICBhZGRFcnJvcigiYnJlYWsgdG8gbWlzc2luZyBsYWJlbCIsZWxlbWVudCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdmlzaXRTd2l0Y2goU3dpdGNoU3RhdGVtZW50IHN0YXRlbWVudCkgeworICAgICAgICBpblN3aXRjaD10cnVlOworICAgICAgICBzdXBlci52aXNpdFN3aXRjaChzdGF0ZW1lbnQpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY29udHJvbC9NdWx0aXBsZUNvbXBpbGF0aW9uRXJyb3JzRXhjZXB0aW9uLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9jb250cm9sL011bHRpcGxlQ29tcGlsYXRpb25FcnJvcnNFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWY3M2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY29udHJvbC9NdWx0aXBsZUNvbXBpbGF0aW9uRXJyb3JzRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbDsKKworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CisKKy8qKgorICogQGF1dGhvciBKb2NoZW4gVGhlb2Rvcm91CisgKi8KK3B1YmxpYyBjbGFzcyBNdWx0aXBsZUNvbXBpbGF0aW9uRXJyb3JzRXhjZXB0aW9uIGV4dGVuZHMKKyAgICAgICAgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24geworICAgIAorICAgIHByb3RlY3RlZCBFcnJvckNvbGxlY3RvciBjb2xsZWN0b3I7CisgICAgCisgICAgcHVibGljIE11bHRpcGxlQ29tcGlsYXRpb25FcnJvcnNFeGNlcHRpb24oRXJyb3JDb2xsZWN0b3IgZWMpIHsKKyAgICAgICAgc3VwZXIoMCwgbnVsbCk7CisgICAgICAgIGlmIChlYyA9PSBudWxsKSB7CisgICAgICAgICAgICBDb21waWxlckNvbmZpZ3VyYXRpb24gY29uZmlnID0gc3VwZXIuZ2V0VW5pdCgpICE9IG51bGwgPworICAgICAgICAgICAgICAgIHN1cGVyLmdldFVuaXQoKS5nZXRDb25maWd1cmF0aW9uKCkgOgorICAgICAgICAgICAgICAgIG5ldyBDb21waWxlckNvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgICAgIGNvbGxlY3RvciA9IG5ldyBFcnJvckNvbGxlY3Rvcihjb25maWcpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29sbGVjdG9yID0gZWM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgRXJyb3JDb2xsZWN0b3IgZ2V0RXJyb3JDb2xsZWN0b3IoKSB7CisgICAgICAgIHJldHVybiBjb2xsZWN0b3I7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKKyAgICAgICAgCisgICAgICAgIFN0cmluZ1dyaXRlciBkYXRhID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoZGF0YSk7CisgICAgICAgIEphbml0b3IgamFuaXRvciA9IG5ldyBKYW5pdG9yKCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbGxlY3Rvci53cml0ZSh3cml0ZXIsIGphbml0b3IpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICAgICAgamFuaXRvci5jbGVhbnVwKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc3VwZXIuZ2V0TWVzc2FnZSgpICsgIiwgIiArIGRhdGEudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9jb250cm9sL1BhcnNlclBsdWdpbi5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY29udHJvbC9QYXJzZXJQbHVnaW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGQ3NjJjCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY29udHJvbC9QYXJzZXJQbHVnaW4uamF2YQpAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXguUmVkdWN0aW9uOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LlBhcnNlckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5Nb2R1bGVOb2RlOworCitpbXBvcnQgamF2YS5pby5SZWFkZXI7CisKKy8qKgorICogQSBzaW1wbGUgZXh0ZW5zaW9uIHBvaW50IHRvIGFsbG93IHVzIHRvIHN3aXRjaCBiZXR3ZWVuIHRoZSBjbGFzc2ljIEdyb292eSBwYXJzZXIgYW5kIHRoZSBuZXcgQW50bHIgYmFzZWQgcGFyc2VyCisgKiAKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGludGVyZmFjZSBQYXJzZXJQbHVnaW4geworCisgICAgUmVkdWN0aW9uIHBhcnNlQ1NUKFNvdXJjZVVuaXQgc291cmNlVW5pdCwgUmVhZGVyIHJlYWRlcikgdGhyb3dzIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uOworCisgICAgTW9kdWxlTm9kZSBidWlsZEFTVChTb3VyY2VVbml0IHNvdXJjZVVuaXQsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyLCBSZWR1Y3Rpb24gY3N0KSB0aHJvd3MgUGFyc2VyRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY29udHJvbC9QYXJzZXJQbHVnaW5GYWN0b3J5LmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9jb250cm9sL1BhcnNlclBsdWdpbkZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGI3NWZhCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY29udHJvbC9QYXJzZXJQbHVnaW5GYWN0b3J5LmphdmEKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbDsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50bHIuQW50bHJQYXJzZXJQbHVnaW5GYWN0b3J5OworCisvKioKKyAqIEEgZmFjdG9yeSBvZiBwYXJzZXIgcGx1Z2luIGluc3RhbmNlcworICoKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFBhcnNlclBsdWdpbkZhY3RvcnkgeworICAgIHB1YmxpYyBzdGF0aWMgUGFyc2VyUGx1Z2luRmFjdG9yeSBuZXdJbnN0YW5jZShib29sZWFuIHVzZU5ld1BhcnNlcikgeworICAgICAgICBpZiAodXNlTmV3UGFyc2VyKSB7CisgICAgICAgICAgICBDbGFzcyB0eXBlID0gbnVsbDsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gIm9yZy5jb2RlaGF1cy5ncm9vdnkuYW50bHIuQW50bHJQYXJzZXJQbHVnaW5GYWN0b3J5IjsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdHlwZSA9IENsYXNzLmZvck5hbWUobmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgdHlwZSA9IFBhcnNlclBsdWdpbkZhY3RvcnkuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MobmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUxKSB7CisgICAgICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyIGNvbnRleHRDbGFzc0xvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZXh0Q2xhc3NMb2FkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gY29udGV4dENsYXNzTG9hZGVyLmxvYWRDbGFzcyhuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0eXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFBhcnNlclBsdWdpbkZhY3RvcnkpIHR5cGUubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDb3VsZCBub3QgY3JlYXRlIEFudGxyUGFyc2VyUGx1Z2luRmFjdG9yeTogIiArIGUsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGNhbid0IGZpbmQgQW50bHIgcGFyc2VyLCBzbyBsZXRzIHVzZSB0aGUgQ2xhc3NpYyBvbmUKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IEFudGxyUGFyc2VyUGx1Z2luRmFjdG9yeSgpOworICAgIH0KKworICAgIHB1YmxpYyBhYnN0cmFjdCBQYXJzZXJQbHVnaW4gY3JlYXRlUGFyc2VyUGx1Z2luKCk7Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9jb250cm9sL1BoYXNlcy5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY29udHJvbC9QaGFzZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzUzYTZkCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY29udHJvbC9QaGFzZXMuamF2YQpAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2w7CisKKworCisKKy8qKgorICogIENvbXBpbGF0aW9uIHBoYXNlIGlkZW50aWZpZXJzLiAgCisgKgorICogIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNwb2lyaWVyQGRyZWFtaW5nLm9yZyI+Q2hyaXMgUG9pcmllcjwvYT4KKyAqCisgKiAgQHZlcnNpb24gJElkJAorICovCisKK3B1YmxpYyBjbGFzcyBQaGFzZXMKK3sKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTklUSUFMSVpBVElPTiAgICAgICAgPSAxOyAgIC8vIE9wZW5pbmcgb2YgZmlsZXMgYW5kIHN1Y2gKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVJTSU5HICAgICAgICAgICAgICAgPSAyOyAgIC8vIExleGluZywgcGFyc2luZywgYW5kIEFTVCBidWlsZGluZworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlZFUlNJT04gICAgICAgICAgICA9IDM7ICAgLy8gQ1NUIHRvIEFTVCBjb252ZXJzaW9uCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VNQU5USUNfQU5BTFlTSVMgICAgID0gNDsgICAvLyBBU1Qgc2VtYW50aWMgYW5hbHlzaXMgYW5kIGVsdWNpZGF0aW9uCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FOT05JQ0FMSVpBVElPTiAgICAgID0gNTsgICAvLyBBU1QgY29tcGxldGlvbgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOU1RSVUNUSU9OX1NFTEVDVElPTiA9IDY7ICAgLy8gQ2xhc3MgZ2VuZXJhdGlvbiwgcGhhc2UgMQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMQVNTX0dFTkVSQVRJT04gICAgICA9IDc7ICAgLy8gQ2xhc3MgZ2VuZXJhdGlvbiwgcGhhc2UgMgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9VVFBVVCAgICAgICAgICAgICAgICA9IDg7ICAgLy8gT3V0cHV0IG9mIGNsYXNzIHRvIGRpc2sKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSU5BTElaQVRJT04gICAgICAgICAgPSA5OyAgIC8vIENsZWFudXAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTEwgICAgICAgICAgICAgICAgICAgPSA5OyAgIC8vIFN5bm9ueW0gZm9yIGZ1bGwgY29tcGlsYXRpb24KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGRlc2NyaXB0aW9ucyA9IHsKKyAgICAgICAgICAic3RhcnR1cCIKKyAgICAgICAgLCAiaW5pdGlhbGl6YXRpb24iCisgICAgICAgICwgInBhcnNpbmciCisgICAgICAgICwgImNvbnZlcnNpb24iCisgICAgICAgICwgInNlbWFudGljIGFuYWx5c2lzIgorICAgICAgICAsICJjYW5vbmljYWxpemF0aW9uIgorICAgICAgICAsICJpbnN0cnVjdGlvbiBzZWxlY3Rpb24iCisgICAgICAgICwgImNsYXNzIGdlbmVyYXRpb24iCisgICAgICAgICwgIm91dHB1dCIKKyAgICAgICAgLCAiY2xlYW51cCIKKyAgICB9OworICAgIAorICAgIAorICAgIAorICAgLyoqCisgICAgKiAgUmV0dXJucyBhIGRlc2NyaXB0aW9uIG9mIHRoZSBzcGVjaWZpZWQgcGhhc2UuCisgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZXNjcmlwdGlvbiggaW50IHBoYXNlICkKKyAgICB7CisgICAgICAgIHJldHVybiBkZXNjcmlwdGlvbnNbcGhhc2VdOworICAgIH0KKyAgICAKK30KKworCisKKwpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY29udHJvbC9Qcm9jZXNzaW5nVW5pdC5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY29udHJvbC9Qcm9jZXNzaW5nVW5pdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhYmQ0NjMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9jb250cm9sL1Byb2Nlc3NpbmdVbml0LmphdmEKQEAgLTAsMCArMSwxNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbDsKKworaW1wb3J0IGdyb292eS5sYW5nLkdyb292eUNsYXNzTG9hZGVyOworCisvKioKKyAqIEEgYmFzZSBjbGFzcyBmb3IgZGF0YSBzdHJ1Y3R1cmVzIHRoYXQgY2FuIGNvbGxlY3QgbWVzc2FnZXMgYW5kIGVycm9ycworICogZHVyaW5nIHByb2Nlc3NpbmcuCisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y3BvaXJpZXJAZHJlYW1pbmcub3JnIj5DaHJpcyBQb2lyaWVyPC9hPgorICogQHZlcnNpb24gJElkJAorICovCisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcm9jZXNzaW5nVW5pdCB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY3VycmVudCBwaGFzZQorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgcGhhc2U7CisgICAgLyoqCisgICAgICogU2V0IHRydWUgaWYgcGhhc2UgaXMgZmluaXNoZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwaGFzZUNvbXBsZXRlOworCisgICAgLyoqCisgICAgICogQ29uZmlndXJhdGlvbiBhbmQgb3RoZXIgc2V0dGluZ3MgdGhhdCBjb250cm9sIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29tcGlsZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb247CisgIAorICAgIC8qKgorICAgICAqIFRoZSBDbGFzc0xvYWRlciB0byB1c2UgZHVyaW5nIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgR3Jvb3Z5Q2xhc3NMb2FkZXIgY2xhc3NMb2FkZXI7CisgICAgCisgICAgLyoqCisgICAgICogYSBoZWxwZXIgdG8gc2hhcmUgZXJyb3JzIGFuZCByZXBvcnQgdGhlbQorICAgICAqLworICAgIHByb3RlY3RlZCBFcnJvckNvbGxlY3RvciBlcnJvckNvbGxlY3RvcjsKKworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSB0aGUgUHJvY2Vzc2luZ1VuaXQgdG8gdGhlIGVtcHR5IHN0YXRlLgorICAgICAqLworCisgICAgcHVibGljIFByb2Nlc3NpbmdVbml0KENvbXBpbGVyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBHcm9vdnlDbGFzc0xvYWRlciBjbGFzc0xvYWRlciwgRXJyb3JDb2xsZWN0b3IgZXIpIHsKKworICAgICAgICB0aGlzLnBoYXNlID0gUGhhc2VzLklOSVRJQUxJWkFUSU9OOworICAgICAgICB0aGlzLnNldENsYXNzTG9hZGVyKGNsYXNzTG9hZGVyKTsKKyAgICAgICAgY29uZmlndXJlKChjb25maWd1cmF0aW9uID09IG51bGwgPyBuZXcgQ29tcGlsZXJDb25maWd1cmF0aW9uKCkgOiBjb25maWd1cmF0aW9uKSk7CisgICAgICAgIGlmIChlcj09bnVsbCkgZXIgPSBuZXcgRXJyb3JDb2xsZWN0b3IoZ2V0Q29uZmlndXJhdGlvbigpKTsKKyAgICAgICAgdGhpcy5lcnJvckNvbGxlY3RvciA9IGVyOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVjb25maWd1cmVzIHRoZSBQcm9jZXNzaW5nVW5pdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb25maWd1cmUoQ29tcGlsZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKKyAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjsKKyAgICB9CisKKworICAgIHB1YmxpYyBDb21waWxlckNvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIGNvbmZpZ3VyYXRpb247CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29uZmlndXJhdGlvbihDb21waWxlckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgeworICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNsYXNzIGxvYWRlciBpbiB1c2UgYnkgdGhpcyBQcm9jZXNzaW5nVW5pdC4KKyAgICAgKi8KKworICAgIHB1YmxpYyBHcm9vdnlDbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlcigpIHsKKyAgICAgICAgcmV0dXJuIGNsYXNzTG9hZGVyOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgY2xhc3MgbG9hZGVyIGZvciB1c2UgYnkgdGhpcyBQcm9jZXNzaW5nVW5pdC4KKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHNldENsYXNzTG9hZGVyKEdyb292eUNsYXNzTG9hZGVyIGxvYWRlcikgeworICAgICAgICBDbGFzc0xvYWRlciBwYXJlbnQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOworICAgICAgICBpZiAocGFyZW50ID09IG51bGwpIHBhcmVudCA9IFByb2Nlc3NpbmdVbml0LmNsYXNzLmdldENsYXNzTG9hZGVyKCk7CisgICAgICAgIHRoaXMuY2xhc3NMb2FkZXIgPSAobG9hZGVyID09IG51bGwgPyBuZXcgR3Jvb3Z5Q2xhc3NMb2FkZXIocGFyZW50LCBjb25maWd1cmF0aW9uKSA6IGxvYWRlcik7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHBoYXNlLgorICAgICAqLworCisgICAgcHVibGljIGludCBnZXRQaGFzZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucGhhc2U7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdGlvbiBmb3IgdGhlIGN1cnJlbnQgcGhhc2UuCisgICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBoYXNlRGVzY3JpcHRpb24oKSB7CisgICAgICAgIHJldHVybiBQaGFzZXMuZ2V0RGVzY3JpcHRpb24odGhpcy5waGFzZSk7CisgICAgfQorCisgICAgcHVibGljIEVycm9yQ29sbGVjdG9yIGdldEVycm9yQ29sbGVjdG9yKCkgeworICAgICAgICByZXR1cm4gZXJyb3JDb2xsZWN0b3I7CisgICAgfQorICAgIAorICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gUFJPQ0VTU0lORworCisKKyAgICAvKioKKyAgICAgKiBNYXJrcyB0aGUgY3VycmVudCBwaGFzZSBjb21wbGV0ZSBhbmQgcHJvY2Vzc2VzIGFueQorICAgICAqIGVycm9ycy4KKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIGNvbXBsZXRlUGhhc2UoKSB0aHJvd3MgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24geyAgICAgICAKKyAgICAgICAgZXJyb3JDb2xsZWN0b3IuZmFpbElmRXJyb3JzKCk7CisgICAgICAgIHBoYXNlQ29tcGxldGUgPSB0cnVlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQSBzeW5vbnltIGZvciA8Y29kZT5nb3RvUGhhc2UoIHBoYXNlICsgMSApPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBuZXh0UGhhc2UoKSB0aHJvd3MgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24geworICAgICAgICBnb3RvUGhhc2UodGhpcy5waGFzZSArIDEpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogV3JhcHMgdXAgYW55IHBlbmRpbmcgb3BlcmF0aW9ucyBmb3IgdGhlIGN1cnJlbnQgcGhhc2UKKyAgICAgKiBhbmQgc3dpdGNoZXMgdG8gdGhlIG5leHQgcGhhc2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZ290b1BoYXNlKGludCBwaGFzZSkgdGhyb3dzIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCF0aGlzLnBoYXNlQ29tcGxldGUpIHsKKyAgICAgICAgICAgIGNvbXBsZXRlUGhhc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMucGhhc2UgPSBwaGFzZTsKKyAgICAgICAgdGhpcy5waGFzZUNvbXBsZXRlID0gZmFsc2U7CisgICAgfQorCit9CisKKworCisKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NvbnRyb2wvUmVzb2x2ZVZpc2l0b3IuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NvbnRyb2wvUmVzb2x2ZVZpc2l0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzE3NjE4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY29udHJvbC9SZXNvbHZlVmlzaXRvci5qYXZhCkBAIC0wLDAgKzEsODQ3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sOworCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5Q2xhc3NMb2FkZXI7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuKjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByLio7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3Quc3RtdC5CbG9ja1N0YXRlbWVudDsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5zdG10LkNhdGNoU3RhdGVtZW50OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuRm9yU3RhdGVtZW50OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuU3RhdGVtZW50OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW4uVmVyaWZpZXI7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLm1lc3NhZ2VzLkV4Y2VwdGlvbk1lc3NhZ2U7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXguVHlwZXM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247CitpbXBvcnQgamF2YS51dGlsLio7CisKKy8qKgorICogVmlzaXRvciB0byByZXNvbHZlIFR5cGVzIGFuZCBjb252ZXJ0IFZhcmlhYmxlRXhwcmVzc2lvbiB0bworICogQ2xhc3NFeHByZXNzaW9ucyBpZiBuZWVkZWQuIFRoZSBSZXNvbHZlVmlzaXRvciB3aWxsIHRyeSB0bworICogZmluZCB0aGUgQ2xhc3MgZm9yIGEgQ2xhc3NFeHByZXNzaW9uIGFuZCBwcmludHMgYW4gZXJyb3IgaWYKKyAqIGl0IGZhaWxzIHRvIGRvIHNvLiBDb25zdHJ1Y3Rpb25zIGxpa2UgQ1tdLCBmb28gYXMgQywgKEMpIGZvbworICogd2lsbCBmb3JjZSBjcmVhdGlvbiBvZiBhIENsYXNzRXhwcmVzc2lvbiBmb3IgQworICogPHAvPgorICogTm90ZTogdGhlIG1ldGhvZCB0byBzdGFydCB0aGUgcmVzb2x2aW5nIGlzICBzdGFydFJlc29sdmluZyhDbGFzc05vZGUsIFNvdXJjZVVuaXQpLgorICoKKyAqIEBhdXRob3IgSm9jaGVuIFRoZW9kb3JvdQorICovCitwdWJsaWMgY2xhc3MgUmVzb2x2ZVZpc2l0b3IgZXh0ZW5kcyBDbGFzc0NvZGVFeHByZXNzaW9uVHJhbnNmb3JtZXIgeworICAgIHByaXZhdGUgQ2xhc3NOb2RlIGN1cnJlbnRDbGFzczsKKyAgICAvLyBub3RlOiBCaWdJbnRlZ2VyIGFuZCBCaWdEZWNpbWFsIGFyZSBhbHNvIGltcG9ydGVkIGJ5IGRlZmF1bHQKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfSU1QT1JUUyA9IHsiamF2YS5sYW5nLiIsICJqYXZhLmlvLiIsICJqYXZhLm5ldC4iLCAiamF2YS51dGlsLiIsICJncm9vdnkubGFuZy4iLCAiZ3Jvb3Z5LnV0aWwuIn07CisgICAgcHJpdmF0ZSBDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0OworICAgIHByaXZhdGUgTWFwIGNhY2hlZENsYXNzZXMgPSBuZXcgSGFzaE1hcCgpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBOT19DTEFTUyA9IG5ldyBPYmplY3QoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgU0NSSVBUID0gbmV3IE9iamVjdCgpOworICAgIHByaXZhdGUgU291cmNlVW5pdCBzb3VyY2U7CisgICAgcHJpdmF0ZSBWYXJpYWJsZVNjb3BlIGN1cnJlbnRTY29wZTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBpc1RvcExldmVsUHJvcGVydHkgPSB0cnVlOworICAgIHByaXZhdGUgYm9vbGVhbiBpblByb3BlcnR5RXhwcmVzc2lvbiA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBpbkNsb3N1cmUgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNTcGVjaWFsQ29uc3RydWN0b3JDYWxsID0gZmFsc2U7CisKKyAgICBwcml2YXRlIE1hcCBnZW5lcmljUGFyYW1ldGVyTmFtZXMgPSBuZXcgSGFzaE1hcCgpOworCisgICAgcHVibGljIFJlc29sdmVWaXNpdG9yKENvbXBpbGF0aW9uVW5pdCBjdSkgeworICAgICAgICBjb21waWxhdGlvblVuaXQgPSBjdTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdGFydFJlc29sdmluZyhDbGFzc05vZGUgbm9kZSwgU291cmNlVW5pdCBzb3VyY2UpIHsKKyAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7CisgICAgICAgIHZpc2l0Q2xhc3Mobm9kZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgdmlzaXRDb25zdHJ1Y3Rvck9yTWV0aG9kKE1ldGhvZE5vZGUgbm9kZSwgYm9vbGVhbiBpc0NvbnN0cnVjdG9yKSB7CisgICAgICAgIFZhcmlhYmxlU2NvcGUgb2xkU2NvcGUgPSBjdXJyZW50U2NvcGU7CisgICAgICAgIGN1cnJlbnRTY29wZSA9IG5vZGUuZ2V0VmFyaWFibGVTY29wZSgpOworICAgICAgICBNYXAgb2xkUE5hbWVzID0gZ2VuZXJpY1BhcmFtZXRlck5hbWVzOworICAgICAgICBnZW5lcmljUGFyYW1ldGVyTmFtZXMgPSBuZXcgSGFzaE1hcChnZW5lcmljUGFyYW1ldGVyTmFtZXMpOworCisgICAgICAgIHJlc29sdmVHZW5lcmljc0hlYWRlcihub2RlLmdldEdlbmVyaWNzVHlwZXMoKSk7CisKKyAgICAgICAgUGFyYW1ldGVyW10gcGFyYXMgPSBub2RlLmdldFBhcmFtZXRlcnMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgUGFyYW1ldGVyIHAgPSBwYXJhc1tpXTsKKyAgICAgICAgICAgIHAuc2V0SW5pdGlhbEV4cHJlc3Npb24odHJhbnNmb3JtKHAuZ2V0SW5pdGlhbEV4cHJlc3Npb24oKSkpOworICAgICAgICAgICAgcmVzb2x2ZU9yRmFpbChwLmdldFR5cGUoKSwgcC5nZXRUeXBlKCkpOworICAgICAgICAgICAgdmlzaXRBbm5vdGF0aW9ucyhwKTsKKyAgICAgICAgfQorICAgICAgICBDbGFzc05vZGVbXSBleGNlcHRpb25zID0gbm9kZS5nZXRFeGNlcHRpb25zKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhjZXB0aW9ucy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgQ2xhc3NOb2RlIHQgPSBleGNlcHRpb25zW2ldOworICAgICAgICAgICAgcmVzb2x2ZU9yRmFpbCh0LCBub2RlKTsKKyAgICAgICAgfQorICAgICAgICByZXNvbHZlT3JGYWlsKG5vZGUuZ2V0UmV0dXJuVHlwZSgpLCBub2RlKTsKKworICAgICAgICBzdXBlci52aXNpdENvbnN0cnVjdG9yT3JNZXRob2Qobm9kZSwgaXNDb25zdHJ1Y3Rvcik7CisKKyAgICAgICAgZ2VuZXJpY1BhcmFtZXRlck5hbWVzID0gb2xkUE5hbWVzOworICAgICAgICBjdXJyZW50U2NvcGUgPSBvbGRTY29wZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEZpZWxkKEZpZWxkTm9kZSBub2RlKSB7CisgICAgICAgIENsYXNzTm9kZSB0ID0gbm9kZS5nZXRUeXBlKCk7CisgICAgICAgIHJlc29sdmVPckZhaWwodCwgbm9kZSk7CisgICAgICAgIHN1cGVyLnZpc2l0RmllbGQobm9kZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRQcm9wZXJ0eShQcm9wZXJ0eU5vZGUgbm9kZSkgeworICAgICAgICBDbGFzc05vZGUgdCA9IG5vZGUuZ2V0VHlwZSgpOworICAgICAgICByZXNvbHZlT3JGYWlsKHQsIG5vZGUpOworICAgICAgICBzdXBlci52aXNpdFByb3BlcnR5KG5vZGUpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiByZXNvbHZlVG9Jbm5lciAoQ2xhc3NOb2RlIHR5cGUpIHsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSB0eXBlLmdldE5hbWUoKSwgc2F2ZWQgPSBuYW1lOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgaW50IGxlbiA9IG5hbWUubGFzdEluZGV4T2YoJy4nKTsKKyAgICAgICAgICAgIGlmIChsZW4gPT0gLTEpCisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsbGVuKSArICIkIiArIG5hbWUuc3Vic3RyaW5nKGxlbisxKTsKKyAgICAgICAgICAgIHR5cGUuc2V0TmFtZShuYW1lKTsKKyAgICAgICAgICAgIGlmIChyZXNvbHZlKHR5cGUpKQorICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICB0eXBlLnNldE5hbWUoc2F2ZWQpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlc29sdmVPckZhaWwoQ2xhc3NOb2RlIHR5cGUsIFN0cmluZyBtc2csIEFTVE5vZGUgbm9kZSkgeworICAgICAgICBpZiAocmVzb2x2ZSh0eXBlKSkgcmV0dXJuOworICAgICAgICBpZiAocmVzb2x2ZVRvSW5uZXIodHlwZSkpIHJldHVybjsKKyAgICAgICAgYWRkRXJyb3IoInVuYWJsZSB0byByZXNvbHZlIGNsYXNzICIgKyB0eXBlLmdldE5hbWUoKSArICIgIiArIG1zZywgbm9kZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlc29sdmVPckZhaWwoQ2xhc3NOb2RlIHR5cGUsIEFTVE5vZGUgbm9kZSwgYm9vbGVhbiBwcmVmZXJlSW1wb3J0cykgeworICAgICAgICByZXNvbHZlR2VuZXJpY3NUeXBlcyh0eXBlLmdldEdlbmVyaWNzVHlwZXMoKSk7CisgICAgICAgIGlmIChwcmVmZXJlSW1wb3J0cyAmJiByZXNvbHZlQWxpYXNGcm9tTW9kdWxlKHR5cGUpKSByZXR1cm47CisgICAgICAgIHJlc29sdmVPckZhaWwodHlwZSwgbm9kZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlc29sdmVPckZhaWwoQ2xhc3NOb2RlIHR5cGUsIEFTVE5vZGUgbm9kZSkgeworICAgICAgICByZXNvbHZlT3JGYWlsKHR5cGUsICIiLCBub2RlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gcmVzb2x2ZShDbGFzc05vZGUgdHlwZSkgeworICAgICAgICByZXR1cm4gcmVzb2x2ZSh0eXBlLCB0cnVlLCB0cnVlLCB0cnVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gcmVzb2x2ZShDbGFzc05vZGUgdHlwZSwgYm9vbGVhbiB0ZXN0TW9kdWxlSW1wb3J0cywgYm9vbGVhbiB0ZXN0RGVmYXVsdEltcG9ydHMsIGJvb2xlYW4gdGVzdFN0YXRpY0lubmVyQ2xhc3NlcykgeworICAgICAgICBpZiAodHlwZS5pc1Jlc29sdmVkKCkgfHwgdHlwZS5pc1ByaW1hcnlDbGFzc05vZGUoKSkgcmV0dXJuIHRydWU7CisgICAgICAgIHJlc29sdmVHZW5lcmljc1R5cGVzKHR5cGUuZ2V0R2VuZXJpY3NUeXBlcygpKTsKKyAgICAgICAgaWYgKHR5cGUuaXNBcnJheSgpKSB7CisgICAgICAgICAgICBDbGFzc05vZGUgZWxlbWVudCA9IHR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpOworICAgICAgICAgICAgYm9vbGVhbiByZXNvbHZlZCA9IHJlc29sdmUoZWxlbWVudCwgdGVzdE1vZHVsZUltcG9ydHMsIHRlc3REZWZhdWx0SW1wb3J0cywgdGVzdFN0YXRpY0lubmVyQ2xhc3Nlcyk7CisgICAgICAgICAgICBpZiAocmVzb2x2ZWQpIHsKKyAgICAgICAgICAgICAgICBDbGFzc05vZGUgY24gPSBlbGVtZW50Lm1ha2VBcnJheSgpOworICAgICAgICAgICAgICAgIHR5cGUuc2V0UmVkaXJlY3QoY24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVkOworICAgICAgICB9CisKKyAgICAgICAgLy8gdGVzdCBpZiB2YW5pbGxhIG5hbWUgaXMgY3VycmVudCBjbGFzcyBuYW1lCisgICAgICAgIGlmIChjdXJyZW50Q2xhc3MgPT0gdHlwZSkgcmV0dXJuIHRydWU7CisKKyAgICAgICAgaWYgKGdlbmVyaWNQYXJhbWV0ZXJOYW1lcy5nZXQodHlwZS5nZXROYW1lKCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgIEdlbmVyaWNzVHlwZSBndCA9IChHZW5lcmljc1R5cGUpIGdlbmVyaWNQYXJhbWV0ZXJOYW1lcy5nZXQodHlwZS5nZXROYW1lKCkpOworICAgICAgICAgICAgdHlwZS5zZXRSZWRpcmVjdChndC5nZXRUeXBlKCkpOworICAgICAgICAgICAgdHlwZS5zZXRHZW5lcmljc1R5cGVzKG5ldyBHZW5lcmljc1R5cGVbXXtndH0pOworICAgICAgICAgICAgdHlwZS5zZXRHZW5lcmljc1BsYWNlSG9sZGVyKHRydWUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY3VycmVudENsYXNzLmdldE5hbWVXaXRob3V0UGFja2FnZSgpLmVxdWFscyh0eXBlLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgIHR5cGUuc2V0UmVkaXJlY3QoY3VycmVudENsYXNzKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc29sdmVGcm9tTW9kdWxlKHR5cGUsIHRlc3RNb2R1bGVJbXBvcnRzKSB8fAorICAgICAgICAgICAgICAgIHJlc29sdmVGcm9tQ29tcGlsZVVuaXQodHlwZSkgfHwKKyAgICAgICAgICAgICAgICByZXNvbHZlRnJvbURlZmF1bHRJbXBvcnRzKHR5cGUsIHRlc3REZWZhdWx0SW1wb3J0cykgfHwKKyAgICAgICAgICAgICAgICByZXNvbHZlRnJvbVN0YXRpY0lubmVyQ2xhc3Nlcyh0eXBlLCB0ZXN0U3RhdGljSW5uZXJDbGFzc2VzKSB8fAorICAgICAgICAgICAgICAgIHJlc29sdmVGcm9tQ2xhc3NDYWNoZSh0eXBlKSB8fAorICAgICAgICAgICAgICAgIHJlc29sdmVUb0NsYXNzKHR5cGUpIHx8CisgICAgICAgICAgICAgICAgcmVzb2x2ZVRvU2NyaXB0KHR5cGUpOworCisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHJlc29sdmVGcm9tQ2xhc3NDYWNoZShDbGFzc05vZGUgdHlwZSkgeworICAgICAgICBTdHJpbmcgbmFtZSA9IHR5cGUuZ2V0TmFtZSgpOworICAgICAgICBPYmplY3QgdmFsID0gY2FjaGVkQ2xhc3Nlcy5nZXQobmFtZSk7CisgICAgICAgIGlmICh2YWwgPT0gbnVsbCB8fCB2YWwgPT0gTk9fQ0xBU1MpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNldENsYXNzKHR5cGUsIChDbGFzcykgdmFsKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gTk9URTogY29waWVkIGZyb20gR3Jvb3Z5Q2xhc3NMb2FkZXIKKyAgICBwcml2YXRlIGxvbmcgZ2V0VGltZVN0YW1wKENsYXNzIGNscykgeworICAgICAgICByZXR1cm4gVmVyaWZpZXIuZ2V0VGltZXN0YW1wKGNscyk7CisgICAgfQorCisgICAgLy8gTk9URTogY29waWVkIGZyb20gR3Jvb3Z5Q2xhc3NMb2FkZXIKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNTb3VyY2VOZXdlcihVUkwgc291cmNlLCBDbGFzcyBjbHMpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxvbmcgbGFzdE1vZDsKKworICAgICAgICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgZmlsZTovLyBwcm90b2NvbCwgYXMgZ2V0TGFzdE1vZGlmaWVkKCkgb2Z0ZW4gcmVwb3J0cworICAgICAgICAgICAgLy8gaW5jb3JyZWN0IHJlc3VsdHMgKC0xKQorICAgICAgICAgICAgaWYgKHNvdXJjZS5nZXRQcm90b2NvbCgpLmVxdWFscygiZmlsZSIpKSB7CisgICAgICAgICAgICAgICAgLy8gQ29lcmNlIHRoZSBmaWxlIFVSTCB0byBhIEZpbGUKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IHNvdXJjZS5nZXRQYXRoKCkucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcikucmVwbGFjZSgnfCcsICc6Jyk7CisgICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUocGF0aCk7CisgICAgICAgICAgICAgICAgbGFzdE1vZCA9IGZpbGUubGFzdE1vZGlmaWVkKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFVSTENvbm5lY3Rpb24gY29ubiA9IHNvdXJjZS5vcGVuQ29ubmVjdGlvbigpOworICAgICAgICAgICAgICAgIGxhc3RNb2QgPSBjb25uLmdldExhc3RNb2RpZmllZCgpOworICAgICAgICAgICAgICAgIGNvbm4uZ2V0SW5wdXRTdHJlYW0oKS5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGxhc3RNb2QgPiBnZXRUaW1lU3RhbXAoY2xzKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gaWYgdGhlIHN0cmVhbSBjYW4ndCBiZSBvcGVuZWQsIGxldCdzIGtlZXAgdGhlIG9sZCByZWZlcmVuY2UKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHJpdmF0ZSBib29sZWFuIHJlc29sdmVUb1NjcmlwdChDbGFzc05vZGUgdHlwZSkgeworICAgICAgICBTdHJpbmcgbmFtZSA9IHR5cGUuZ2V0TmFtZSgpOworICAgICAgICBpZiAoY2FjaGVkQ2xhc3Nlcy5nZXQobmFtZSkgPT0gTk9fQ0xBU1MpIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKGNhY2hlZENsYXNzZXMuZ2V0KG5hbWUpID09IFNDUklQVCkgY2FjaGVkQ2xhc3Nlcy5wdXQobmFtZSwgTk9fQ0xBU1MpOworICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKCJqYXZhLiIpKSByZXR1cm4gdHlwZS5pc1Jlc29sdmVkKCk7CisgICAgICAgIC8vVE9ETzogZG9uJ3QgaWdub3JlIGlubmVyIHN0YXRpYyBjbGFzc2VzIGNvbXBsZXRlbHkKKyAgICAgICAgaWYgKG5hbWUuaW5kZXhPZignJCcpICE9IC0xKSByZXR1cm4gdHlwZS5pc1Jlc29sdmVkKCk7CisgICAgICAgIE1vZHVsZU5vZGUgbW9kdWxlID0gY3VycmVudENsYXNzLmdldE1vZHVsZSgpOworICAgICAgICBpZiAobW9kdWxlLmhhc1BhY2thZ2VOYW1lKCkgJiYgbmFtZS5pbmRleE9mKCcuJykgPT0gLTEpIHJldHVybiB0eXBlLmlzUmVzb2x2ZWQoKTsKKyAgICAgICAgLy8gdHJ5IHRvIGZpbmQgYSBzY3JpcHQgZnJvbSBjbGFzc3BhdGgKKyAgICAgICAgR3Jvb3Z5Q2xhc3NMb2FkZXIgZ2NsID0gY29tcGlsYXRpb25Vbml0LmdldENsYXNzTG9hZGVyKCk7CisgICAgICAgIFVSTCB1cmwgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdXJsID0gZ2NsLmdldFJlc291cmNlTG9hZGVyKCkubG9hZEdyb292eVNvdXJjZShuYW1lKTsKKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaCBhbmQgbGV0IHRoZSBVUkwgYmUgbnVsbAorICAgICAgICB9CisgICAgICAgIGlmICh1cmwgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHR5cGUuaXNSZXNvbHZlZCgpKSB7CisgICAgICAgICAgICAgICAgQ2xhc3MgY2xzID0gdHlwZS5nZXRUeXBlQ2xhc3MoKTsKKyAgICAgICAgICAgICAgICAvLyBpZiB0aGUgZmlsZSBpcyBub3QgbmV3ZXIgd2UgZG9uJ3Qgd2FudCB0byByZWNvbXBpbGUKKyAgICAgICAgICAgICAgICBpZiAoIWlzU291cmNlTmV3ZXIodXJsLCBjbHMpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICBjYWNoZWRDbGFzc2VzLnJlbW92ZSh0eXBlLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgdHlwZS5zZXRSZWRpcmVjdChudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFNvdXJjZVVuaXQgc3UgPSBjb21waWxhdGlvblVuaXQuYWRkU291cmNlKHVybCk7CisgICAgICAgICAgICBjdXJyZW50Q2xhc3MuZ2V0Q29tcGlsZVVuaXQoKS5hZGRDbGFzc05vZGVUb0NvbXBpbGUodHlwZSwgc3UpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgLy8gdHlwZSBtYXkgYmUgcmVzb2x2ZWQgdGhyb3VnaCB0aGUgY2xhc3Nsb2FkZXIgYmVmb3JlCisgICAgICAgIHJldHVybiB0eXBlLmlzUmVzb2x2ZWQoKTsKKyAgICB9CisKKworICAgIHByaXZhdGUgYm9vbGVhbiByZXNvbHZlRnJvbVN0YXRpY0lubmVyQ2xhc3NlcyhDbGFzc05vZGUgdHlwZSwgYm9vbGVhbiB0ZXN0U3RhdGljSW5uZXJDbGFzc2VzKSB7CisgICAgICAgIC8vIHRyeSB0byByZXNvbHZlIGEgcHVibGljIHN0YXRpYyBpbm5lciBjbGFzcycgbmFtZQorICAgICAgICB0ZXN0U3RhdGljSW5uZXJDbGFzc2VzICY9IHR5cGUuaGFzUGFja2FnZU5hbWUoKTsKKyAgICAgICAgaWYgKHRlc3RTdGF0aWNJbm5lckNsYXNzZXMpIHsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gdHlwZS5nZXROYW1lKCk7CisgICAgICAgICAgICBTdHJpbmcgcmVwbGFjZWRQb2ludFR5cGUgPSBuYW1lOworICAgICAgICAgICAgaW50IGxhc3RQb2ludCA9IHJlcGxhY2VkUG9pbnRUeXBlLmxhc3RJbmRleE9mKCcuJyk7CisgICAgICAgICAgICByZXBsYWNlZFBvaW50VHlwZSA9IG5ldyBTdHJpbmdCdWZmZXIoKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKHJlcGxhY2VkUG9pbnRUeXBlLnN1YnN0cmluZygwLCBsYXN0UG9pbnQpKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIkIikKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChyZXBsYWNlZFBvaW50VHlwZS5zdWJzdHJpbmcobGFzdFBvaW50ICsgMSkpCisgICAgICAgICAgICAgICAgICAgIC50b1N0cmluZygpOworICAgICAgICAgICAgdHlwZS5zZXROYW1lKHJlcGxhY2VkUG9pbnRUeXBlKTsKKyAgICAgICAgICAgIGlmIChyZXNvbHZlKHR5cGUsIGZhbHNlLCB0cnVlLCB0cnVlKSkgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB0eXBlLnNldE5hbWUobmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiByZXNvbHZlRnJvbURlZmF1bHRJbXBvcnRzKENsYXNzTm9kZSB0eXBlLCBib29sZWFuIHRlc3REZWZhdWx0SW1wb3J0cykgeworICAgICAgICAvLyB0ZXN0IGRlZmF1bHQgaW1wb3J0cworICAgICAgICB0ZXN0RGVmYXVsdEltcG9ydHMgJj0gIXR5cGUuaGFzUGFja2FnZU5hbWUoKTsKKyAgICAgICAgaWYgKHRlc3REZWZhdWx0SW1wb3J0cykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIHNpemUgPSBERUZBVUxUX0lNUE9SVFMubGVuZ3RoOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VQcmVmaXggPSBERUZBVUxUX0lNUE9SVFNbaV07CisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSB0eXBlLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZnFuID0gcGFja2FnZVByZWZpeCArIG5hbWU7CisgICAgICAgICAgICAgICAgdHlwZS5zZXROYW1lKGZxbik7CisgICAgICAgICAgICAgICAgaWYgKHJlc29sdmUodHlwZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSkpIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIHR5cGUuc2V0TmFtZShuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gdHlwZS5nZXROYW1lKCk7CisgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoIkJpZ0ludGVnZXIiKSkgeworICAgICAgICAgICAgICAgIHR5cGUuc2V0UmVkaXJlY3QoQ2xhc3NIZWxwZXIuQmlnSW50ZWdlcl9UWVBFKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoIkJpZ0RlY2ltYWwiKSkgeworICAgICAgICAgICAgICAgIHR5cGUuc2V0UmVkaXJlY3QoQ2xhc3NIZWxwZXIuQmlnRGVjaW1hbF9UWVBFKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHJlc29sdmVGcm9tQ29tcGlsZVVuaXQoQ2xhc3NOb2RlIHR5cGUpIHsKKyAgICAgICAgLy8gbG9vayBpbnRvIHRoZSBjb21waWxlIHVuaXQgaWYgdGhlcmUgaXMgYSBjbGFzcyB3aXRoIHRoYXQgbmFtZQorICAgICAgICBDb21waWxlVW5pdCBjb21waWxlVW5pdCA9IGN1cnJlbnRDbGFzcy5nZXRDb21waWxlVW5pdCgpOworICAgICAgICBpZiAoY29tcGlsZVVuaXQgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOworICAgICAgICBDbGFzc05vZGUgY3VDbGFzcyA9IGNvbXBpbGVVbml0LmdldENsYXNzKHR5cGUuZ2V0TmFtZSgpKTsKKyAgICAgICAgaWYgKGN1Q2xhc3MgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHR5cGUgIT0gY3VDbGFzcykgdHlwZS5zZXRSZWRpcmVjdChjdUNsYXNzKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0Q2xhc3MoQ2xhc3NOb2RlIG4sIENsYXNzIGNscykgeworICAgICAgICBDbGFzc05vZGUgY24gPSBDbGFzc0hlbHBlci5tYWtlKGNscyk7CisgICAgICAgIG4uc2V0UmVkaXJlY3QoY24pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhbWJpZ3VvdXNDbGFzcyhDbGFzc05vZGUgdHlwZSwgQ2xhc3NOb2RlIGlUeXBlLCBTdHJpbmcgbmFtZSwgYm9vbGVhbiByZXNvbHZlZCkgeworICAgICAgICBpZiAocmVzb2x2ZWQgJiYgIXR5cGUuZ2V0TmFtZSgpLmVxdWFscyhpVHlwZS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICBhZGRFcnJvcigicmVmZXJlbmNlIHRvICIgKyBuYW1lICsgIiBpcyBhbWJpZ3VvdXMsIGJvdGggY2xhc3MgIiArIHR5cGUuZ2V0TmFtZSgpICsgIiBhbmQgIiArIGlUeXBlLmdldE5hbWUoKSArICIgbWF0Y2giLCB0eXBlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHR5cGUuc2V0UmVkaXJlY3QoaVR5cGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHJlc29sdmVBbGlhc0Zyb21Nb2R1bGUoQ2xhc3NOb2RlIHR5cGUpIHsKKyAgICAgICAgTW9kdWxlTm9kZSBtb2R1bGUgPSBjdXJyZW50Q2xhc3MuZ2V0TW9kdWxlKCk7CisgICAgICAgIGlmIChtb2R1bGUgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOworICAgICAgICBTdHJpbmcgbmFtZSA9IHR5cGUuZ2V0TmFtZSgpOworCisgICAgICAgIC8vIGNoZWNrIG1vZHVsZSBub2RlIGltcG9ydHMgYWxpYXNlcworICAgICAgICAvLyB0aGUgd2hpbGUgbG9vcCBlbmFibGVzIGEgY2hlY2sgZm9yIGlubmVyIGNsYXNzZXMgd2hpY2ggYXJlIG5vdCBmdWxseSBpbXBvcnRlZCwKKyAgICAgICAgLy8gYnV0IHZpc2libGUgYXMgdGhlIHN1cnJvdW5kaW5nIGNsYXNzIGlzIGltcG9ydGVkIGFuZCB0aGUgaW5uZXIgY2xhc3MgaXMgcHVibGljL3Byb3RlY3RlZCBzdGF0aWMKKyAgICAgICAgU3RyaW5nIHBuYW1lID0gbmFtZTsKKyAgICAgICAgaW50IGluZGV4ID0gbmFtZS5sZW5ndGgoKTsKKyAgICAgICAgLyoKKyAgICAgICAgICogd2UgaGF2ZSBhIG5hbWUgZm9vLmJhciBhbmQgYW4gaW1wb3J0IGZvby5mb28uIFRoaXMgbWVhbnMgZm9vLmJhciBpcyBwb3NzaWJseQorICAgICAgICAgKiBmb28uZm9vLmJhciByYXRoZXIgdGhhbiBmb28uYmFyLiBUaGlzIG1lYW5zIHRvIGN1dCBhdCB0aGUgZG90IGluIGZvby5iYXIgYW5kCisgICAgICAgICAqIGZvbyBmb3IgaW1wb3J0CisgICAgICAgICAqLworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgcG5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBpbmRleCk7CisgICAgICAgICAgICBDbGFzc05vZGUgYWxpYXNlZE5vZGUgPSBtb2R1bGUuZ2V0SW1wb3J0KHBuYW1lKTsKKyAgICAgICAgICAgIGlmIChhbGlhc2VkTm9kZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKHBuYW1lLmxlbmd0aCgpID09IG5hbWUubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZnVsbCBtYXRjaCwgbm8gbmVlZCB0byBjcmVhdGUgYSBuZXcgY2xhc3MKKyAgICAgICAgICAgICAgICAgICAgdHlwZS5zZXRSZWRpcmVjdChhbGlhc2VkTm9kZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vcGFydGlhbCBtYXRjaAorICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmV3TmFtZSA9IGFsaWFzZWROb2RlLmdldE5hbWUoKSArIG5hbWUuc3Vic3RyaW5nKHBuYW1lLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgdHlwZS5zZXROYW1lKG5ld05hbWUpOworICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZSh0eXBlLCB0cnVlLCB0cnVlLCB0cnVlKSkgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIC8vIHdhcyBub3QgcmVzb2x2ZWQgc28gaXQgd2FzIGEgZmFrZSBtYXRjaAorICAgICAgICAgICAgICAgICAgICB0eXBlLnNldE5hbWUobmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5kZXggPSBwbmFtZS5sYXN0SW5kZXhPZignLicpOworICAgICAgICAgICAgaWYgKGluZGV4ID09IC0xKSBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHJlc29sdmVGcm9tTW9kdWxlKENsYXNzTm9kZSB0eXBlLCBib29sZWFuIHRlc3RNb2R1bGVJbXBvcnRzKSB7CisgICAgICAgIFN0cmluZyBuYW1lID0gdHlwZS5nZXROYW1lKCk7CisgICAgICAgIE1vZHVsZU5vZGUgbW9kdWxlID0gY3VycmVudENsYXNzLmdldE1vZHVsZSgpOworICAgICAgICBpZiAobW9kdWxlID09IG51bGwpIHJldHVybiBmYWxzZTsKKworICAgICAgICBpZiAoIXR5cGUuaGFzUGFja2FnZU5hbWUoKSAmJiBtb2R1bGUuaGFzUGFja2FnZU5hbWUoKSkgeworICAgICAgICAgICAgdHlwZS5zZXROYW1lKG1vZHVsZS5nZXRQYWNrYWdlTmFtZSgpICsgbmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gbG9vayBpbnRvIHRoZSBtb2R1bGUgbm9kZSBpZiB0aGVyZSBpcyBhIGNsYXNzIHdpdGggdGhhdCBuYW1lCisgICAgICAgIExpc3QgbW9kdWxlQ2xhc3NlcyA9IG1vZHVsZS5nZXRDbGFzc2VzKCk7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IG1vZHVsZUNsYXNzZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBDbGFzc05vZGUgbUNsYXNzID0gKENsYXNzTm9kZSkgaXRlci5uZXh0KCk7CisgICAgICAgICAgICBpZiAobUNsYXNzLmdldE5hbWUoKS5lcXVhbHModHlwZS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1DbGFzcyAhPSB0eXBlKSB0eXBlLnNldFJlZGlyZWN0KG1DbGFzcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdHlwZS5zZXROYW1lKG5hbWUpOworCisgICAgICAgIGlmICh0ZXN0TW9kdWxlSW1wb3J0cykgeworICAgICAgICAgICAgaWYgKHJlc29sdmVBbGlhc0Zyb21Nb2R1bGUodHlwZSkpIHJldHVybiB0cnVlOworCisgICAgICAgICAgICBib29sZWFuIHJlc29sdmVkID0gZmFsc2U7CisgICAgICAgICAgICBpZiAobW9kdWxlLmhhc1BhY2thZ2VOYW1lKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBjaGVjayBwYWNrYWdlIHRoaXMgY2xhc3MgaXMgZGVmaW5lZCBpbgorICAgICAgICAgICAgICAgIHR5cGUuc2V0TmFtZShtb2R1bGUuZ2V0UGFja2FnZU5hbWUoKSArIG5hbWUpOworICAgICAgICAgICAgICAgIHJlc29sdmVkID0gcmVzb2x2ZSh0eXBlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGNoZWNrIG1vZHVsZSBub2RlIGltcG9ydHMgcGFja2FnZXMKKyAgICAgICAgICAgIExpc3QgcGFja2FnZXMgPSBtb2R1bGUuZ2V0SW1wb3J0UGFja2FnZXMoKTsKKyAgICAgICAgICAgIENsYXNzTm9kZSBpVHlwZSA9IENsYXNzSGVscGVyLm1ha2VXaXRob3V0Q2FjaGluZyhuYW1lKTsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHBhY2thZ2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlUHJlZml4ID0gKFN0cmluZykgaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGZxbiA9IHBhY2thZ2VQcmVmaXggKyBuYW1lOworICAgICAgICAgICAgICAgIGlUeXBlLnNldE5hbWUoZnFuKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZShpVHlwZSwgZmFsc2UsIGZhbHNlLCB0cnVlKSkgeworICAgICAgICAgICAgICAgICAgICBhbWJpZ3VvdXNDbGFzcyh0eXBlLCBpVHlwZSwgbmFtZSwgcmVzb2x2ZWQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaVR5cGUuc2V0TmFtZShuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghcmVzb2x2ZWQpIHR5cGUuc2V0TmFtZShuYW1lKTsKKyAgICAgICAgICAgIHJldHVybiByZXNvbHZlZDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHJlc29sdmVUb0NsYXNzKENsYXNzTm9kZSB0eXBlKSB7CisgICAgICAgIFN0cmluZyBuYW1lID0gdHlwZS5nZXROYW1lKCk7CisgICAgICAgIGlmIChjYWNoZWRDbGFzc2VzLmdldChuYW1lKSA9PSBOT19DTEFTUykgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoY3VycmVudENsYXNzLmdldE1vZHVsZSgpLmhhc1BhY2thZ2VOYW1lKCkgJiYgbmFtZS5pbmRleE9mKCcuJykgPT0gLTEpIHJldHVybiBmYWxzZTsKKyAgICAgICAgR3Jvb3Z5Q2xhc3NMb2FkZXIgbG9hZGVyID0gY29tcGlsYXRpb25Vbml0LmdldENsYXNzTG9hZGVyKCk7CisgICAgICAgIENsYXNzIGNsczsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIE5PVEU6IGl0J3MgaW1wb3J0YW50IHRvIGRvIG5vIGxvb2t1cCBhZ2FpbnN0IHNjcmlwdCBmaWxlcworICAgICAgICAgICAgLy8gaGVyZSBzaW5jZSB0aGUgR3Jvb3Z5Q2xhc3NMb2FkZXIgd291bGQgY3JlYXRlIGEgbmV3IENvbXBpbGF0aW9uVW5pdAorICAgICAgICAgICAgY2xzID0gbG9hZGVyLmxvYWRDbGFzcyhuYW1lLCBmYWxzZSwgdHJ1ZSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gY25mZSkgeworICAgICAgICAgICAgY2FjaGVkQ2xhc3Nlcy5wdXQobmFtZSwgU0NSSVBUKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBjYXRjaCAoQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24gY2ZlKSB7CisgICAgICAgICAgICBjb21waWxhdGlvblVuaXQuZ2V0RXJyb3JDb2xsZWN0b3IoKS5hZGRFcnJvckFuZENvbnRpbnVlKG5ldyBFeGNlcHRpb25NZXNzYWdlKGNmZSwgdHJ1ZSwgc291cmNlKSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgLy9UT0RPOiB0aGUgY2FzZSBvZiBhIE5vQ2xhc3NEZWZGb3VuZEVycm9yIG5lZWRzIGEgYml0IG1vcmUgcmVzZWFyY2gKKyAgICAgICAgLy8gYSBzaW1wbGUgcmVjb21waWxhdGlvbiBpcyBub3QgcG9zc2libGUgaXQgc2VlbXMuIFRoZSBjdXJyZW50IGNsYXNzCisgICAgICAgIC8vIHdlIGFyZSBzZWFyY2hpbmcgZm9yIGlzIHRoZXJlLCBzbyB3ZSBzaG91bGQgbWFyayB0aGF0IHNvbWVob3cuCisgICAgICAgIC8vIEJhc2ljYWxseSB0aGUgbWlzc2luZyBjbGFzcyBuZWVkcyB0byBiZSBjb21wbGV0bHkgY29tcGlsZWQgYmVmb3JlCisgICAgICAgIC8vIHdlIGNhbiBhZ2FpbiBzZWFyY2ggZm9yIHRoZSBjdXJyZW50IG5hbWUuCisgICAgICAgIC8qY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIG5jZGZlKSB7CisgICAgICAgICAgICBjYWNoZWRDbGFzc2VzLnB1dChuYW1lLFNDUklQVCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0qLworICAgICAgICBpZiAoY2xzID09IG51bGwpIHJldHVybiBmYWxzZTsKKyAgICAgICAgY2FjaGVkQ2xhc3Nlcy5wdXQobmFtZSwgY2xzKTsKKyAgICAgICAgc2V0Q2xhc3ModHlwZSwgY2xzKTsKKyAgICAgICAgLy9OT1RFOiB3ZSByZXR1cm4gZmFsc2UgaGVyZSBldmVuIGlmIHdlIGZvdW5kIGEgY2xhc3MsCisgICAgICAgIC8vYnV0IHdlIHdhbnQgdG8gZ2l2ZSBhIHBvc3NpYmxlIHNjcmlwdCBhIGNoYW5jZSB0byByZWNvbXBpbGUuCisgICAgICAgIC8vdGhpcyBjYW4gb25seSBiZSBkb25lIGlmIHRoZSBsb2FkZXIgd2FzIG5vdCB0aGUgaW5zdGFuY2UKKyAgICAgICAgLy9kZWZpbmluZyB0aGUgY2xhc3MuCisgICAgICAgIHJldHVybiBjbHMuZ2V0Q2xhc3NMb2FkZXIoKSA9PSBsb2FkZXI7CisgICAgfQorCisKKyAgICBwdWJsaWMgRXhwcmVzc2lvbiB0cmFuc2Zvcm0oRXhwcmVzc2lvbiBleHApIHsKKyAgICAgICAgaWYgKGV4cCA9PSBudWxsKSByZXR1cm4gbnVsbDsKKyAgICAgICAgaWYgKGV4cCBpbnN0YW5jZW9mIFZhcmlhYmxlRXhwcmVzc2lvbikgeworICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybVZhcmlhYmxlRXhwcmVzc2lvbigoVmFyaWFibGVFeHByZXNzaW9uKSBleHApOworICAgICAgICB9IGVsc2UgaWYgKGV4cC5nZXRDbGFzcygpID09IFByb3BlcnR5RXhwcmVzc2lvbi5jbGFzcykgeworICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybVByb3BlcnR5RXhwcmVzc2lvbigoUHJvcGVydHlFeHByZXNzaW9uKSBleHApOworICAgICAgICB9IGVsc2UgaWYgKGV4cCBpbnN0YW5jZW9mIERlY2xhcmF0aW9uRXhwcmVzc2lvbikgeworICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybURlY2xhcmF0aW9uRXhwcmVzc2lvbigoRGVjbGFyYXRpb25FeHByZXNzaW9uKSBleHApOworICAgICAgICB9IGVsc2UgaWYgKGV4cCBpbnN0YW5jZW9mIEJpbmFyeUV4cHJlc3Npb24pIHsKKyAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1CaW5hcnlFeHByZXNzaW9uKChCaW5hcnlFeHByZXNzaW9uKSBleHApOworICAgICAgICB9IGVsc2UgaWYgKGV4cCBpbnN0YW5jZW9mIE1ldGhvZENhbGxFeHByZXNzaW9uKSB7CisgICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtTWV0aG9kQ2FsbEV4cHJlc3Npb24oKE1ldGhvZENhbGxFeHByZXNzaW9uKSBleHApOworICAgICAgICB9IGVsc2UgaWYgKGV4cCBpbnN0YW5jZW9mIENsb3N1cmVFeHByZXNzaW9uKSB7CisgICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtQ2xvc3VyZUV4cHJlc3Npb24oKENsb3N1cmVFeHByZXNzaW9uKSBleHApOworICAgICAgICB9IGVsc2UgaWYgKGV4cCBpbnN0YW5jZW9mIENvbnN0cnVjdG9yQ2FsbEV4cHJlc3Npb24pIHsKKyAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1Db25zdHJ1Y3RvckNhbGxFeHByZXNzaW9uKChDb25zdHJ1Y3RvckNhbGxFeHByZXNzaW9uKSBleHApOworICAgICAgICB9IGVsc2UgaWYgKGV4cCBpbnN0YW5jZW9mIEFubm90YXRpb25Db25zdGFudEV4cHJlc3Npb24pIHsKKyAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1Bbm5vdGF0aW9uQ29uc3RhbnRFeHByZXNzaW9uKChBbm5vdGF0aW9uQ29uc3RhbnRFeHByZXNzaW9uKSBleHApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzb2x2ZU9yRmFpbChleHAuZ2V0VHlwZSgpLCBleHApOworICAgICAgICAgICAgcmV0dXJuIGV4cC50cmFuc2Zvcm1FeHByZXNzaW9uKHRoaXMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgbG9va3VwQ2xhc3NOYW1lKFByb3BlcnR5RXhwcmVzc2lvbiBwZSkgeworICAgICAgICBTdHJpbmcgbmFtZSA9ICIiOworICAgICAgICBmb3IgKEV4cHJlc3Npb24gaXQgPSBwZTsgaXQgIT0gbnVsbDsgaXQgPSAoKFByb3BlcnR5RXhwcmVzc2lvbikgaXQpLmdldE9iamVjdEV4cHJlc3Npb24oKSkgeworICAgICAgICAgICAgaWYgKGl0IGluc3RhbmNlb2YgVmFyaWFibGVFeHByZXNzaW9uKSB7CisgICAgICAgICAgICAgICAgVmFyaWFibGVFeHByZXNzaW9uIHZlID0gKFZhcmlhYmxlRXhwcmVzc2lvbikgaXQ7CisgICAgICAgICAgICAgICAgLy8gc3RvcCBhdCBzdXBlciBhbmQgdGhpcworICAgICAgICAgICAgICAgIGlmICh2ZSA9PSBWYXJpYWJsZUV4cHJlc3Npb24uU1VQRVJfRVhQUkVTU0lPTiB8fCB2ZSA9PSBWYXJpYWJsZUV4cHJlc3Npb24uVEhJU19FWFBSRVNTSU9OKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBuYW1lID0gdmUuZ2V0TmFtZSgpICsgIi4iICsgbmFtZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGFueXRoaW5nIG90aGVyIHRoYW4gUHJvcGVydHlFeHByZXNzaW9ucywgQ2xhc3NFeHByZXNzaW9uIG9yCisgICAgICAgICAgICAvLyBWYXJpYWJsZUV4cHJlc3Npb25zIHdpbGwgc3RvcCByZXNvbHZpbmcKKyAgICAgICAgICAgIGVsc2UgaWYgKCEoaXQuZ2V0Q2xhc3MoKSA9PSBQcm9wZXJ0eUV4cHJlc3Npb24uY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFByb3BlcnR5RXhwcmVzc2lvbiBjdXJyZW50ID0gKFByb3BlcnR5RXhwcmVzc2lvbikgaXQ7CisgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5UGFydCA9IGN1cnJlbnQuZ2V0UHJvcGVydHlBc1N0cmluZygpOworICAgICAgICAgICAgICAgIC8vIHRoZSBjbGFzcyBwcm9wZXJ0eSBzdG9wcyByZXNvbHZpbmcsIGR5bmFtaWMgcHJvcGVydHkgbmFtZXMgdG9vCisgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5UGFydCA9PSBudWxsIHx8IHByb3BlcnR5UGFydC5lcXVhbHMoImNsYXNzIikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5hbWUgPSBwcm9wZXJ0eVBhcnQgKyAiLiIgKyBuYW1lOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChuYW1lLmxlbmd0aCgpID4gMCkgcmV0dXJuIG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUubGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLy8gaXRlcmF0ZSBmcm9tIHRoZSBpbm5lciBtb3N0IHRvIHRoZSBvdXRlciBhbmQgY2hlY2sgZm9yIGNsYXNzZXMKKyAgICAvLyB0aGlzIGNoZWNrIHdpbGwgaWdub3JlIGEgLmNsYXNzIHByb3BlcnR5LCBmb3IgRXhhbXBsZSBJbnRlZ2VyLmNsYXNzIHdpbGwgYmUKKyAgICAvLyBhIFByb3BlcnR5RXhwcmVzc2lvbiB3aXRoIHRoZSBDbGFzc0V4cHJlc3Npb24gb2YgSW50ZWdlciBhcyBvYmplY3RFeHByZXNzaW9uCisgICAgLy8gYW5kIGNsYXNzIGFzIHByb3BlcnR5CisgICAgcHJpdmF0ZSBFeHByZXNzaW9uIGNvcnJlY3RDbGFzc0NsYXNzQ2hhaW4oUHJvcGVydHlFeHByZXNzaW9uIHBlKSB7CisgICAgICAgIExpbmtlZExpc3Qgc3RhY2sgPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICBDbGFzc0V4cHJlc3Npb24gZm91bmQgPSBudWxsOworICAgICAgICBmb3IgKEV4cHJlc3Npb24gaXQgPSBwZTsgaXQgIT0gbnVsbDsgaXQgPSAoKFByb3BlcnR5RXhwcmVzc2lvbikgaXQpLmdldE9iamVjdEV4cHJlc3Npb24oKSkgeworICAgICAgICAgICAgaWYgKGl0IGluc3RhbmNlb2YgQ2xhc3NFeHByZXNzaW9uKSB7CisgICAgICAgICAgICAgICAgZm91bmQgPSAoQ2xhc3NFeHByZXNzaW9uKSBpdDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIShpdC5nZXRDbGFzcygpID09IFByb3BlcnR5RXhwcmVzc2lvbi5jbGFzcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGFjay5hZGRGaXJzdChpdCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvdW5kID09IG51bGwpIHJldHVybiBwZTsKKworICAgICAgICBpZiAoc3RhY2suaXNFbXB0eSgpKSByZXR1cm4gcGU7CisgICAgICAgIE9iamVjdCBzdGFja0VsZW1lbnQgPSBzdGFjay5yZW1vdmVGaXJzdCgpOworICAgICAgICBpZiAoIShzdGFja0VsZW1lbnQuZ2V0Q2xhc3MoKSA9PSBQcm9wZXJ0eUV4cHJlc3Npb24uY2xhc3MpKSByZXR1cm4gcGU7CisgICAgICAgIFByb3BlcnR5RXhwcmVzc2lvbiBjbGFzc1Byb3BlcnR5RXhwcmVzc2lvbiA9IChQcm9wZXJ0eUV4cHJlc3Npb24pIHN0YWNrRWxlbWVudDsKKyAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZVBhcnQgPSBjbGFzc1Byb3BlcnR5RXhwcmVzc2lvbi5nZXRQcm9wZXJ0eUFzU3RyaW5nKCk7CisgICAgICAgIGlmIChwcm9wZXJ0eU5hbWVQYXJ0ID09IG51bGwgfHwgIXByb3BlcnR5TmFtZVBhcnQuZXF1YWxzKCJjbGFzcyIpKSByZXR1cm4gcGU7CisKKyAgICAgICAgaWYgKHN0YWNrLmlzRW1wdHkoKSkgcmV0dXJuIGZvdW5kOworICAgICAgICBzdGFja0VsZW1lbnQgPSBzdGFjay5yZW1vdmVGaXJzdCgpOworICAgICAgICBpZiAoIShzdGFja0VsZW1lbnQuZ2V0Q2xhc3MoKSA9PSBQcm9wZXJ0eUV4cHJlc3Npb24uY2xhc3MpKSByZXR1cm4gcGU7CisgICAgICAgIFByb3BlcnR5RXhwcmVzc2lvbiBjbGFzc1Byb3BlcnR5RXhwcmVzc2lvbkNvbnRhaW5lciA9IChQcm9wZXJ0eUV4cHJlc3Npb24pIHN0YWNrRWxlbWVudDsKKworICAgICAgICBjbGFzc1Byb3BlcnR5RXhwcmVzc2lvbkNvbnRhaW5lci5zZXRPYmplY3RFeHByZXNzaW9uKGZvdW5kKTsKKyAgICAgICAgcmV0dXJuIHBlOworICAgIH0KKworICAgIHByb3RlY3RlZCBFeHByZXNzaW9uIHRyYW5zZm9ybVByb3BlcnR5RXhwcmVzc2lvbihQcm9wZXJ0eUV4cHJlc3Npb24gcGUpIHsKKyAgICAgICAgYm9vbGVhbiBpdGxwID0gaXNUb3BMZXZlbFByb3BlcnR5OworICAgICAgICBib29sZWFuIGlwZSA9IGluUHJvcGVydHlFeHByZXNzaW9uOworCisgICAgICAgIEV4cHJlc3Npb24gb2JqZWN0RXhwcmVzc2lvbiA9IHBlLmdldE9iamVjdEV4cHJlc3Npb24oKTsKKyAgICAgICAgaW5Qcm9wZXJ0eUV4cHJlc3Npb24gPSB0cnVlOworICAgICAgICBpc1RvcExldmVsUHJvcGVydHkgPSAhKG9iamVjdEV4cHJlc3Npb24uZ2V0Q2xhc3MoKSA9PSBQcm9wZXJ0eUV4cHJlc3Npb24uY2xhc3MpOworICAgICAgICBvYmplY3RFeHByZXNzaW9uID0gdHJhbnNmb3JtKG9iamVjdEV4cHJlc3Npb24pOworICAgICAgICAvLyB3ZSBoYW5kbGUgdGhlIHByb3BlcnR5IHBhcnQgYXMgaWYgaXQgd2hlcmUgbm90IHBhcnQgb2YgdGhlIHByb3BlcnR5CisgICAgICAgIGluUHJvcGVydHlFeHByZXNzaW9uID0gZmFsc2U7CisgICAgICAgIEV4cHJlc3Npb24gcHJvcGVydHkgPSB0cmFuc2Zvcm0ocGUuZ2V0UHJvcGVydHkoKSk7CisgICAgICAgIGlzVG9wTGV2ZWxQcm9wZXJ0eSA9IGl0bHA7CisgICAgICAgIGluUHJvcGVydHlFeHByZXNzaW9uID0gaXBlOworCisgICAgICAgIGJvb2xlYW4gc3ByZWFkU2FmZSA9IHBlLmlzU3ByZWFkU2FmZSgpOworICAgICAgICBwZSA9IG5ldyBQcm9wZXJ0eUV4cHJlc3Npb24ob2JqZWN0RXhwcmVzc2lvbiwgcHJvcGVydHksIHBlLmlzU2FmZSgpKTsKKyAgICAgICAgcGUuc2V0U3ByZWFkU2FmZShzcHJlYWRTYWZlKTsKKworICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gbG9va3VwQ2xhc3NOYW1lKHBlKTsKKyAgICAgICAgaWYgKGNsYXNzTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICBDbGFzc05vZGUgdHlwZSA9IENsYXNzSGVscGVyLm1ha2UoY2xhc3NOYW1lKTsKKyAgICAgICAgICAgIGlmIChyZXNvbHZlKHR5cGUpKSByZXR1cm4gbmV3IENsYXNzRXhwcmVzc2lvbih0eXBlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAob2JqZWN0RXhwcmVzc2lvbiBpbnN0YW5jZW9mIENsYXNzRXhwcmVzc2lvbiAmJiBwZS5nZXRQcm9wZXJ0eUFzU3RyaW5nKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gcG9zc2libHkgYW4gaW5uZXIgY2xhc3MKKyAgICAgICAgICAgIENsYXNzRXhwcmVzc2lvbiBjZSA9IChDbGFzc0V4cHJlc3Npb24pIG9iamVjdEV4cHJlc3Npb247CisgICAgICAgICAgICBDbGFzc05vZGUgdHlwZSA9IENsYXNzSGVscGVyLm1ha2UoY2UuZ2V0VHlwZSgpLmdldE5hbWUoKSArICIkIiArIHBlLmdldFByb3BlcnR5QXNTdHJpbmcoKSk7CisgICAgICAgICAgICBpZiAocmVzb2x2ZSh0eXBlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSkgcmV0dXJuIG5ldyBDbGFzc0V4cHJlc3Npb24odHlwZSk7CisgICAgICAgIH0KKyAgICAgICAgRXhwcmVzc2lvbiByZXQgPSBwZTsKKyAgICAgICAgaWYgKGlzVG9wTGV2ZWxQcm9wZXJ0eSkgcmV0ID0gY29ycmVjdENsYXNzQ2xhc3NDaGFpbihwZSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEV4cHJlc3Npb24gdHJhbnNmb3JtVmFyaWFibGVFeHByZXNzaW9uKFZhcmlhYmxlRXhwcmVzc2lvbiB2ZSkgeworICAgICAgICBpZiAodmUuZ2V0TmFtZSgpLmVxdWFscygidGhpcyIpKSByZXR1cm4gVmFyaWFibGVFeHByZXNzaW9uLlRISVNfRVhQUkVTU0lPTjsKKyAgICAgICAgaWYgKHZlLmdldE5hbWUoKS5lcXVhbHMoInN1cGVyIikpIHJldHVybiBWYXJpYWJsZUV4cHJlc3Npb24uU1VQRVJfRVhQUkVTU0lPTjsKKyAgICAgICAgVmFyaWFibGUgdiA9IHZlLmdldEFjY2Vzc2VkVmFyaWFibGUoKTsKKyAgICAgICAgaWYgKHYgaW5zdGFuY2VvZiBEeW5hbWljVmFyaWFibGUpIHsKKyAgICAgICAgICAgIENsYXNzTm9kZSB0ID0gQ2xhc3NIZWxwZXIubWFrZSh2ZS5nZXROYW1lKCkpOworICAgICAgICAgICAgaWYgKHJlc29sdmUodCkpIHsKKyAgICAgICAgICAgICAgICAvLyB0aGUgbmFtZSBpcyBhIHR5cGUgc28gcmVtb3ZlIGl0IGZyb20gdGhlIHNjb3BpbmcKKyAgICAgICAgICAgICAgICAvLyBhcyBpdCBpcyBvbmx5IGEgY2xhc3N2YXJpYWJsZSwgaXQgaXMgb25seSBpbgorICAgICAgICAgICAgICAgIC8vIHJlZmVyZW5jZWRDbGFzc1ZhcmlhYmxlcywgYnV0IG11c3QgYmUgcmVtb3ZlZAorICAgICAgICAgICAgICAgIC8vIGZvciBlYWNoIHBhcmVudHNjb3BlIHRvbworICAgICAgICAgICAgICAgIGZvciAoVmFyaWFibGVTY29wZSBzY29wZSA9IGN1cnJlbnRTY29wZTsgc2NvcGUgIT0gbnVsbCAmJiAhc2NvcGUuaXNSb290KCk7IHNjb3BlID0gc2NvcGUuZ2V0UGFyZW50KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3BlLmlzUm9vdCgpKSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3BlLnJlbW92ZVJlZmVyZW5jZWRDbGFzc1ZhcmlhYmxlKHZlLmdldE5hbWUoKSkgPT0gbnVsbCkgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENsYXNzRXhwcmVzc2lvbiBjZSA9IG5ldyBDbGFzc0V4cHJlc3Npb24odCk7CisgICAgICAgICAgICAgICAgY2Uuc2V0U291cmNlUG9zaXRpb24odmUpOworICAgICAgICAgICAgICAgIHJldHVybiBjZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXNvbHZlT3JGYWlsKHZlLmdldFR5cGUoKSwgdmUpOworICAgICAgICByZXR1cm4gdmU7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEV4cHJlc3Npb24gdHJhbnNmb3JtQmluYXJ5RXhwcmVzc2lvbihCaW5hcnlFeHByZXNzaW9uIGJlKSB7CisgICAgICAgIEV4cHJlc3Npb24gbGVmdCA9IHRyYW5zZm9ybShiZS5nZXRMZWZ0RXhwcmVzc2lvbigpKTsKKyAgICAgICAgaW50IHR5cGUgPSBiZS5nZXRPcGVyYXRpb24oKS5nZXRUeXBlKCk7CisgICAgICAgIGlmICgodHlwZSA9PSBUeXBlcy5BU1NJR05NRU5UX09QRVJBVE9SIHx8IHR5cGUgPT0gVHlwZXMuRVFVQUwpICYmCisgICAgICAgICAgICAgICAgbGVmdCBpbnN0YW5jZW9mIENsYXNzRXhwcmVzc2lvbikgeworICAgICAgICAgICAgQ2xhc3NFeHByZXNzaW9uIGNlID0gKENsYXNzRXhwcmVzc2lvbikgbGVmdDsKKyAgICAgICAgICAgIFN0cmluZyBlcnJvciA9ICJ5b3UgdHJpZWQgdG8gYXNzaWduIGEgdmFsdWUgdG8gdGhlIGNsYXNzICciICsgY2UuZ2V0VHlwZSgpLmdldE5hbWUoKSArICInIjsKKyAgICAgICAgICAgIGlmIChjZS5nZXRUeXBlKCkuaXNTY3JpcHQoKSkgeworICAgICAgICAgICAgICAgIGVycm9yICs9ICIuIERvIHlvdSBoYXZlIGEgc2NyaXB0IHdpdGggdGhpcyBuYW1lPyI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhZGRFcnJvcihlcnJvciwgYmUuZ2V0TGVmdEV4cHJlc3Npb24oKSk7CisgICAgICAgICAgICByZXR1cm4gYmU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxlZnQgaW5zdGFuY2VvZiBDbGFzc0V4cHJlc3Npb24gJiYgYmUuZ2V0UmlnaHRFeHByZXNzaW9uKCkgaW5zdGFuY2VvZiBMaXN0RXhwcmVzc2lvbikgeworICAgICAgICAgICAgLy8gd2UgaGF2ZSBDW10gaWYgdGhlIGxpc3QgaXMgZW1wdHkgLT4gc2hvdWxkIGJlIGFuIGFycmF5IHRoZW4hCisgICAgICAgICAgICBMaXN0RXhwcmVzc2lvbiBsaXN0ID0gKExpc3RFeHByZXNzaW9uKSBiZS5nZXRSaWdodEV4cHJlc3Npb24oKTsKKyAgICAgICAgICAgIGlmIChsaXN0LmdldEV4cHJlc3Npb25zKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDbGFzc0V4cHJlc3Npb24obGVmdC5nZXRUeXBlKCkubWFrZUFycmF5KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEV4cHJlc3Npb24gcmlnaHQgPSB0cmFuc2Zvcm0oYmUuZ2V0UmlnaHRFeHByZXNzaW9uKCkpOworICAgICAgICBiZS5zZXRMZWZ0RXhwcmVzc2lvbihsZWZ0KTsKKyAgICAgICAgYmUuc2V0UmlnaHRFeHByZXNzaW9uKHJpZ2h0KTsKKyAgICAgICAgcmV0dXJuIGJlOworICAgIH0KKworICAgIHByb3RlY3RlZCBFeHByZXNzaW9uIHRyYW5zZm9ybUNsb3N1cmVFeHByZXNzaW9uKENsb3N1cmVFeHByZXNzaW9uIGNlKSB7CisgICAgICAgIGJvb2xlYW4gb2xkSW5DbG9zdXJlID0gaW5DbG9zdXJlOworICAgICAgICBpbkNsb3N1cmUgPSB0cnVlOworICAgICAgICBQYXJhbWV0ZXJbXSBwYXJhcyA9IGNlLmdldFBhcmFtZXRlcnMoKTsKKyAgICAgICAgaWYgKHBhcmFzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBDbGFzc05vZGUgdCA9IHBhcmFzW2ldLmdldFR5cGUoKTsKKyAgICAgICAgICAgICAgICByZXNvbHZlT3JGYWlsKHQsIGNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBTdGF0ZW1lbnQgY29kZSA9IGNlLmdldENvZGUoKTsKKyAgICAgICAgaWYgKGNvZGUgIT0gbnVsbCkgY29kZS52aXNpdCh0aGlzKTsKKyAgICAgICAgaW5DbG9zdXJlID0gb2xkSW5DbG9zdXJlOworICAgICAgICByZXR1cm4gY2U7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEV4cHJlc3Npb24gdHJhbnNmb3JtQ29uc3RydWN0b3JDYWxsRXhwcmVzc2lvbihDb25zdHJ1Y3RvckNhbGxFeHByZXNzaW9uIGNjZSkgeworICAgICAgICBDbGFzc05vZGUgdHlwZSA9IGNjZS5nZXRUeXBlKCk7CisgICAgICAgIHJlc29sdmVPckZhaWwodHlwZSwgY2NlKTsKKyAgICAgICAgaXNTcGVjaWFsQ29uc3RydWN0b3JDYWxsID0gY2NlLmlzU3BlY2lhbENhbGwoKTsKKyAgICAgICAgRXhwcmVzc2lvbiByZXQgPSBjY2UudHJhbnNmb3JtRXhwcmVzc2lvbih0aGlzKTsKKyAgICAgICAgaXNTcGVjaWFsQ29uc3RydWN0b3JDYWxsID0gZmFsc2U7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEV4cHJlc3Npb24gdHJhbnNmb3JtTWV0aG9kQ2FsbEV4cHJlc3Npb24oTWV0aG9kQ2FsbEV4cHJlc3Npb24gbWNlKSB7CisgICAgICAgIEV4cHJlc3Npb24gYXJncyA9IHRyYW5zZm9ybShtY2UuZ2V0QXJndW1lbnRzKCkpOworICAgICAgICBFeHByZXNzaW9uIG1ldGhvZCA9IHRyYW5zZm9ybShtY2UuZ2V0TWV0aG9kKCkpOworICAgICAgICBFeHByZXNzaW9uIG9iamVjdCA9IHRyYW5zZm9ybShtY2UuZ2V0T2JqZWN0RXhwcmVzc2lvbigpKTsKKworICAgICAgICBNZXRob2RDYWxsRXhwcmVzc2lvbiByZXN1bHQgPSBuZXcgTWV0aG9kQ2FsbEV4cHJlc3Npb24ob2JqZWN0LCBtZXRob2QsIGFyZ3MpOworICAgICAgICByZXN1bHQuc2V0U2FmZShtY2UuaXNTYWZlKCkpOworICAgICAgICByZXN1bHQuc2V0SW1wbGljaXRUaGlzKG1jZS5pc0ltcGxpY2l0VGhpcygpKTsKKyAgICAgICAgcmVzdWx0LnNldFNwcmVhZFNhZmUobWNlLmlzU3ByZWFkU2FmZSgpKTsKKyAgICAgICAgcmVzdWx0LnNldFNvdXJjZVBvc2l0aW9uKG1jZSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEV4cHJlc3Npb24gdHJhbnNmb3JtRGVjbGFyYXRpb25FeHByZXNzaW9uKERlY2xhcmF0aW9uRXhwcmVzc2lvbiBkZSkgeworICAgICAgICBFeHByZXNzaW9uIG9sZExlZnQgPSBkZS5nZXRMZWZ0RXhwcmVzc2lvbigpOworICAgICAgICBFeHByZXNzaW9uIGxlZnQgPSB0cmFuc2Zvcm0ob2xkTGVmdCk7CisgICAgICAgIGlmIChsZWZ0ICE9IG9sZExlZnQpIHsKKyAgICAgICAgICAgIENsYXNzRXhwcmVzc2lvbiBjZSA9IChDbGFzc0V4cHJlc3Npb24pIGxlZnQ7CisgICAgICAgICAgICBhZGRFcnJvcigieW91IHRyaWVkIHRvIGFzc2lnbiBhIHZhbHVlIHRvICIgKyBjZS5nZXRUeXBlKCkuZ2V0TmFtZSgpLCBvbGRMZWZ0KTsKKyAgICAgICAgICAgIHJldHVybiBkZTsKKyAgICAgICAgfQorICAgICAgICBFeHByZXNzaW9uIHJpZ2h0ID0gdHJhbnNmb3JtKGRlLmdldFJpZ2h0RXhwcmVzc2lvbigpKTsKKyAgICAgICAgaWYgKHJpZ2h0ID09IGRlLmdldFJpZ2h0RXhwcmVzc2lvbigpKSByZXR1cm4gZGU7CisgICAgICAgIHJldHVybiBuZXcgRGVjbGFyYXRpb25FeHByZXNzaW9uKChWYXJpYWJsZUV4cHJlc3Npb24pIGxlZnQsIGRlLmdldE9wZXJhdGlvbigpLCByaWdodCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEV4cHJlc3Npb24gdHJhbnNmb3JtQW5ub3RhdGlvbkNvbnN0YW50RXhwcmVzc2lvbihBbm5vdGF0aW9uQ29uc3RhbnRFeHByZXNzaW9uIGFjZSkgeworICAgICAgICBBbm5vdGF0aW9uTm9kZSBhbiA9IChBbm5vdGF0aW9uTm9kZSkgYWNlLmdldFZhbHVlKCk7CisgICAgICAgIENsYXNzTm9kZSB0eXBlID0gYW4uZ2V0Q2xhc3NOb2RlKCk7CisgICAgICAgIHJlc29sdmVPckZhaWwodHlwZSwgInVuYWJsZSB0byBmaW5kIGNsYXNzIGZvciBhbm5vdGF0aW9uIiwgYW4pOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhbi5nZXRNZW1iZXJzKCkuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIE1hcC5FbnRyeSBtZW1iZXIgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIEV4cHJlc3Npb24gbWVtYmVyVmFsdWUgPSAoRXhwcmVzc2lvbikgbWVtYmVyLmdldFZhbHVlKCk7CisgICAgICAgICAgICBtZW1iZXIuc2V0VmFsdWUodHJhbnNmb3JtKG1lbWJlclZhbHVlKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYWNlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0QW5ub3RhdGlvbnMoQW5ub3RhdGVkTm9kZSBub2RlKSB7CisgICAgICAgIE1hcCBhbm5vdGlvbk1hcCA9IG5vZGUuZ2V0QW5ub3RhdGlvbnMoKTsKKyAgICAgICAgaWYgKGFubm90aW9uTWFwLmlzRW1wdHkoKSkgcmV0dXJuOworICAgICAgICBJdGVyYXRvciBpdCA9IGFubm90aW9uTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIEFubm90YXRpb25Ob2RlIGFuID0gKEFubm90YXRpb25Ob2RlKSBpdC5uZXh0KCk7CisgICAgICAgICAgICAvL3NraXAgYnVpbHRpbiBwcm9wZXJ0aWVzCisgICAgICAgICAgICBpZiAoYW4uaXNCdWlsdEluKCkpIGNvbnRpbnVlOworICAgICAgICAgICAgQ2xhc3NOb2RlIHR5cGUgPSBhbi5nZXRDbGFzc05vZGUoKTsKKyAgICAgICAgICAgIHJlc29sdmVPckZhaWwodHlwZSwgInVuYWJsZSB0byBmaW5kIGNsYXNzIGZvciBhbm5vdGF0aW9uIiwgYW4pOworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gYW4uZ2V0TWVtYmVycygpLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgTWFwLkVudHJ5IG1lbWJlciA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIEV4cHJlc3Npb24gbWVtYmVyVmFsdWUgPSAoRXhwcmVzc2lvbikgbWVtYmVyLmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgbWVtYmVyLnNldFZhbHVlKHRyYW5zZm9ybShtZW1iZXJWYWx1ZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRDbGFzcyhDbGFzc05vZGUgbm9kZSkgeworICAgICAgICBDbGFzc05vZGUgb2xkTm9kZSA9IGN1cnJlbnRDbGFzczsKKyAgICAgICAgY3VycmVudENsYXNzID0gbm9kZTsKKworICAgICAgICByZXNvbHZlR2VuZXJpY3NIZWFkZXIobm9kZS5nZXRHZW5lcmljc1R5cGVzKCkpOworCisgICAgICAgIE1vZHVsZU5vZGUgbW9kdWxlID0gbm9kZS5nZXRNb2R1bGUoKTsKKyAgICAgICAgaWYgKCFtb2R1bGUuaGFzSW1wb3J0c1Jlc29sdmVkKCkpIHsKKyAgICAgICAgICAgIExpc3QgbCA9IG1vZHVsZS5nZXRJbXBvcnRzKCk7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIEltcG9ydE5vZGUgZWxlbWVudCA9IChJbXBvcnROb2RlKSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICBDbGFzc05vZGUgdHlwZSA9IGVsZW1lbnQuZ2V0VHlwZSgpOworICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlKHR5cGUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSkpIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGFkZEVycm9yKCJ1bmFibGUgdG8gcmVzb2x2ZSBjbGFzcyAiICsgdHlwZS5nZXROYW1lKCksIHR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTWFwIGltcG9ydFBhY2thZ2VzID0gbW9kdWxlLmdldFN0YXRpY0ltcG9ydENsYXNzZXMoKTsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGltcG9ydFBhY2thZ2VzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIENsYXNzTm9kZSB0eXBlID0gKENsYXNzTm9kZSkgaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKHJlc29sdmUodHlwZSwgZmFsc2UsIGZhbHNlLCB0cnVlKSkgY29udGludWU7CisgICAgICAgICAgICAgICAgYWRkRXJyb3IoInVuYWJsZSB0byByZXNvbHZlIGNsYXNzICIgKyB0eXBlLmdldE5hbWUoKSwgdHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtb2R1bGUuZ2V0U3RhdGljSW1wb3J0QWxpYXNlcygpLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIENsYXNzTm9kZSB0eXBlID0gKENsYXNzTm9kZSkgaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKHJlc29sdmUodHlwZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSkpIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGFkZEVycm9yKCJ1bmFibGUgdG8gcmVzb2x2ZSBjbGFzcyAiICsgdHlwZS5nZXROYW1lKCksIHR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gbW9kdWxlLmdldFN0YXRpY0ltcG9ydENsYXNzZXMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBDbGFzc05vZGUgdHlwZSA9IChDbGFzc05vZGUpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlKHR5cGUsIHRydWUsIHRydWUsIHRydWUpKSBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBhZGRFcnJvcigidW5hYmxlIHRvIHJlc29sdmUgY2xhc3MgIiArIHR5cGUuZ2V0TmFtZSgpLCB0eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1vZHVsZS5zZXRJbXBvcnRzUmVzb2x2ZWQodHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBDbGFzc05vZGUgc24gPSBub2RlLmdldFVucmVzb2x2ZWRTdXBlckNsYXNzKCk7CisgICAgICAgIGlmIChzbiAhPSBudWxsKSByZXNvbHZlT3JGYWlsKHNuLCBub2RlLCB0cnVlKTsKKworICAgICAgICBDbGFzc05vZGVbXSBpbnRlcmZhY2VzID0gbm9kZS5nZXRJbnRlcmZhY2VzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJmYWNlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgcmVzb2x2ZU9yRmFpbChpbnRlcmZhY2VzW2ldLCBub2RlLCB0cnVlKTsKKworICAgICAgICB9CisKKyAgICAgICAgc3VwZXIudmlzaXRDbGFzcyhub2RlKTsKKworICAgICAgICBjdXJyZW50Q2xhc3MgPSBvbGROb2RlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0Q2F0Y2hTdGF0ZW1lbnQoQ2F0Y2hTdGF0ZW1lbnQgY3MpIHsKKyAgICAgICAgcmVzb2x2ZU9yRmFpbChjcy5nZXRFeGNlcHRpb25UeXBlKCksIGNzKTsKKyAgICAgICAgaWYgKGNzLmdldEV4Y2VwdGlvblR5cGUoKSA9PSBDbGFzc0hlbHBlci5EWU5BTUlDX1RZUEUpIHsKKyAgICAgICAgICAgIGNzLmdldFZhcmlhYmxlKCkuc2V0VHlwZShDbGFzc0hlbHBlci5tYWtlKEV4Y2VwdGlvbi5jbGFzcykpOworICAgICAgICB9CisgICAgICAgIHN1cGVyLnZpc2l0Q2F0Y2hTdGF0ZW1lbnQoY3MpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZpc2l0Rm9yTG9vcChGb3JTdGF0ZW1lbnQgZm9yTG9vcCkgeworICAgICAgICByZXNvbHZlT3JGYWlsKGZvckxvb3AuZ2V0VmFyaWFibGVUeXBlKCksIGZvckxvb3ApOworICAgICAgICBzdXBlci52aXNpdEZvckxvb3AoZm9yTG9vcCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmlzaXRCbG9ja1N0YXRlbWVudChCbG9ja1N0YXRlbWVudCBibG9jaykgeworICAgICAgICBWYXJpYWJsZVNjb3BlIG9sZFNjb3BlID0gY3VycmVudFNjb3BlOworICAgICAgICBjdXJyZW50U2NvcGUgPSBibG9jay5nZXRWYXJpYWJsZVNjb3BlKCk7CisgICAgICAgIHN1cGVyLnZpc2l0QmxvY2tTdGF0ZW1lbnQoYmxvY2spOworICAgICAgICBjdXJyZW50U2NvcGUgPSBvbGRTY29wZTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU291cmNlVW5pdCBnZXRTb3VyY2VVbml0KCkgeworICAgICAgICByZXR1cm4gc291cmNlOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZXNvbHZlR2VuZXJpY3NUeXBlcyhHZW5lcmljc1R5cGVbXSB0eXBlcykgeworICAgICAgICBpZiAodHlwZXMgPT0gbnVsbCkgcmV0dXJuOworICAgICAgICBjdXJyZW50Q2xhc3Muc2V0VXNpbmdHZW5lcmljcyh0cnVlKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgcmVzb2x2ZUdlbmVyaWNzVHlwZSh0eXBlc1tpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVzb2x2ZUdlbmVyaWNzSGVhZGVyKEdlbmVyaWNzVHlwZVtdIHR5cGVzKSB7CisgICAgICAgIGlmICh0eXBlcyA9PSBudWxsKSByZXR1cm47CisgICAgICAgIGN1cnJlbnRDbGFzcy5zZXRVc2luZ0dlbmVyaWNzKHRydWUpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBDbGFzc05vZGUgdHlwZSA9IHR5cGVzW2ldLmdldFR5cGUoKTsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gdHlwZS5nZXROYW1lKCk7CisgICAgICAgICAgICBDbGFzc05vZGVbXSBib3VuZHMgPSB0eXBlc1tpXS5nZXRVcHBlckJvdW5kcygpOworICAgICAgICAgICAgaWYgKGJvdW5kcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBuYW1lQWRkZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGJvdW5kcy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgICAgICBDbGFzc05vZGUgdXBwZXJCb3VuZCA9IGJvdW5kc1tqXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFuYW1lQWRkZWQgJiYgdXBwZXJCb3VuZCAhPSBudWxsIHx8ICFyZXNvbHZlKHR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljUGFyYW1ldGVyTmFtZXMucHV0KG5hbWUsIHR5cGVzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVzW2ldLnNldFBsYWNlaG9sZGVyKHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgdHlwZS5zZXRSZWRpcmVjdCh1cHBlckJvdW5kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVBZGRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZU9yRmFpbCh1cHBlckJvdW5kLCB0eXBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGdlbmVyaWNQYXJhbWV0ZXJOYW1lcy5wdXQobmFtZSwgdHlwZXNbaV0pOworICAgICAgICAgICAgICAgIHR5cGUuc2V0UmVkaXJlY3QoQ2xhc3NIZWxwZXIuT0JKRUNUX1RZUEUpOworICAgICAgICAgICAgICAgIHR5cGVzW2ldLnNldFBsYWNlaG9sZGVyKHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlc29sdmVHZW5lcmljc1R5cGUoR2VuZXJpY3NUeXBlIGdlbmVyaWNzVHlwZSkgeworICAgICAgICBpZiAoZ2VuZXJpY3NUeXBlLmlzUmVzb2x2ZWQoKSkgcmV0dXJuOworICAgICAgICBjdXJyZW50Q2xhc3Muc2V0VXNpbmdHZW5lcmljcyh0cnVlKTsKKyAgICAgICAgQ2xhc3NOb2RlIHR5cGUgPSBnZW5lcmljc1R5cGUuZ2V0VHlwZSgpOworICAgICAgICAvLyBzYXZlIG5hbWUgYmVmb3JlIHJlZGlyZWN0CisgICAgICAgIFN0cmluZyBuYW1lID0gdHlwZS5nZXROYW1lKCk7CisgICAgICAgIENsYXNzTm9kZVtdIGJvdW5kcyA9IGdlbmVyaWNzVHlwZS5nZXRVcHBlckJvdW5kcygpOworICAgICAgICBpZiAoIWdlbmVyaWNQYXJhbWV0ZXJOYW1lcy5jb250YWluc0tleShuYW1lKSkgeworICAgICAgICAgICAgaWYgKGJvdW5kcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBib3VuZHMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgQ2xhc3NOb2RlIHVwcGVyQm91bmQgPSBib3VuZHNbal07CisgICAgICAgICAgICAgICAgICAgIHJlc29sdmVPckZhaWwodXBwZXJCb3VuZCwgZ2VuZXJpY3NUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgdHlwZS5zZXRSZWRpcmVjdCh1cHBlckJvdW5kKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUdlbmVyaWNzVHlwZXModXBwZXJCb3VuZC5nZXRHZW5lcmljc1R5cGVzKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZ2VuZXJpY3NUeXBlLmlzV2lsZGNhcmQoKSkgeworICAgICAgICAgICAgICAgIHR5cGUuc2V0UmVkaXJlY3QoQ2xhc3NIZWxwZXIuT0JKRUNUX1RZUEUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXNvbHZlT3JGYWlsKHR5cGUsIGdlbmVyaWNzVHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBHZW5lcmljc1R5cGUgZ3QgPSAoR2VuZXJpY3NUeXBlKSBnZW5lcmljUGFyYW1ldGVyTmFtZXMuZ2V0KG5hbWUpOworICAgICAgICAgICAgdHlwZS5zZXRSZWRpcmVjdChndC5nZXRUeXBlKCkpOworICAgICAgICAgICAgZ2VuZXJpY3NUeXBlLnNldFBsYWNlaG9sZGVyKHRydWUpOworICAgICAgICB9CisKKworICAgICAgICBpZiAoZ2VuZXJpY3NUeXBlLmdldExvd2VyQm91bmQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXNvbHZlT3JGYWlsKGdlbmVyaWNzVHlwZS5nZXRMb3dlckJvdW5kKCksIGdlbmVyaWNzVHlwZSk7CisgICAgICAgIH0KKyAgICAgICAgcmVzb2x2ZUdlbmVyaWNzVHlwZXModHlwZS5nZXRHZW5lcmljc1R5cGVzKCkpOworICAgICAgICBnZW5lcmljc1R5cGUuc2V0UmVzb2x2ZWQodHJ1ZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY29udHJvbC9Tb3VyY2VVbml0LmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9jb250cm9sL1NvdXJjZVVuaXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTBlOWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY29udHJvbC9Tb3VyY2VVbml0LmphdmEKQEAgLTAsMCArMSwzNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbDsKKworaW1wb3J0IGdyb292eS5sYW5nLkdyb292eUNsYXNzTG9hZGVyOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5Hcm9vdnlCdWdFcnJvcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5Nb2R1bGVOb2RlOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5pby5GaWxlUmVhZGVyU291cmNlOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5pby5SZWFkZXJTb3VyY2U7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLmlvLlN0cmluZ1JlYWRlclNvdXJjZTsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuaW8uVVJMUmVhZGVyU291cmNlOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5tZXNzYWdlcy5NZXNzYWdlOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5tZXNzYWdlcy5TaW1wbGVNZXNzYWdlOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5tZXNzYWdlcy5TeW50YXhFcnJvck1lc3NhZ2U7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXguKjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLlV0aWxpdGllczsKKworaW1wb3J0IGFudGxyLkNoYXJTY2FubmVyOworaW1wb3J0IGFudGxyLk1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbjsKK2ltcG9ydCBhbnRsci5Ob1ZpYWJsZUFsdEV4Y2VwdGlvbjsKK2ltcG9ydCBhbnRsci5Ob1ZpYWJsZUFsdEZvckNoYXJFeGNlcHRpb247CisKK2ltcG9ydCBjb20udGhvdWdodHdvcmtzLnhzdHJlYW0uWFN0cmVhbTsKKworCisvKioKKyAqIFByb3ZpZGVzIGFuIGFuY2hvciBmb3IgYSBzaW5nbGUgc291cmNlIHVuaXQgKHVzdWFsbHkgYSBzY3JpcHQgZmlsZSkKKyAqIGFzIGl0IHBhc3NlcyB0aHJvdWdoIHRoZSBjb21waWxlciBzeXN0ZW0uCisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y3BvaXJpZXJAZHJlYW1pbmcub3JnIj5DaHJpcyBQb2lyaWVyPC9hPgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86YjU1ckBzaW5hLmNvbSI+QmluZyBSYW48L2E+CisgKiBAdmVyc2lvbiAkSWQkCisgKi8KKworcHVibGljIGNsYXNzIFNvdXJjZVVuaXQgZXh0ZW5kcyBQcm9jZXNzaW5nVW5pdCB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcGx1Z2dhYmxlIHBhcnNlciB1c2VkIHRvIGdlbmVyYXRlIHRoZSBBU1QgLSB3ZSBhbGxvdyBwbHVnZ2FiaWxpdHkgY3VycmVudGx5IGFzIHdlIG5lZWQgdG8gaGF2ZSBDbGFzc2ljIGFuZCBKU1Igc3VwcG9ydAorICAgICAqLworICAgIHByaXZhdGUgUGFyc2VyUGx1Z2luIHBhcnNlclBsdWdpbjsKKworICAgIC8qKgorICAgICAqIFdoZXJlIHdlIGNhbiBnZXQgUmVhZGVycyBmb3Igb3VyIHNvdXJjZSB1bml0CisgICAgICovCisgICAgcHJvdGVjdGVkIFJlYWRlclNvdXJjZSBzb3VyY2U7CisgICAgLyoqCisgICAgICogQSBkZXNjcmlwdGl2ZSBuYW1lIG9mIHRoZSBzb3VyY2UgdW5pdC4gVGhpcyBuYW1lIHNob3VsZG4ndAorICAgICAqIGJlIHVzZWQgZm9yIGNvbnRyb2xpbmcgdGhlIFNvdXJjZVVuaXQsIGl0IGlzIG9ubHkgZm9yIGVycm9yCisgICAgICogbWVzc2FnZXMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7CisgICAgLyoqCisgICAgICogQSBDb25jcmV0ZSBTeW50YXggVHJlZSBvZiB0aGUgc291cmNlCisgICAgICovCisgICAgcHJvdGVjdGVkIFJlZHVjdGlvbiBjc3Q7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcm9vdCBvZiB0aGUgQWJzdHJhY3QgU3ludGF4IFRyZWUgZm9yIHRoZSBzb3VyY2UKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTW9kdWxlTm9kZSBhc3Q7CisKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemVzIHRoZSBTb3VyY2VVbml0IGZyb20gZXhpc3RpbmcgbWFjaGluZXJ5LgorICAgICAqLworICAgIHB1YmxpYyBTb3VyY2VVbml0KFN0cmluZyBuYW1lLCBSZWFkZXJTb3VyY2Ugc291cmNlLCBDb21waWxlckNvbmZpZ3VyYXRpb24gZmxhZ3MsIEdyb292eUNsYXNzTG9hZGVyIGxvYWRlciwgRXJyb3JDb2xsZWN0b3IgZXIpIHsKKyAgICAgICAgc3VwZXIoZmxhZ3MsIGxvYWRlciwgZXIpOworCisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuc291cmNlID0gc291cmNlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZXMgdGhlIFNvdXJjZVVuaXQgZnJvbSB0aGUgc3BlY2lmaWVkIGZpbGUuCisgICAgICovCisgICAgcHVibGljIFNvdXJjZVVuaXQoRmlsZSBzb3VyY2UsIENvbXBpbGVyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBHcm9vdnlDbGFzc0xvYWRlciBsb2FkZXIsIEVycm9yQ29sbGVjdG9yIGVyKSB7CisgICAgICAgIHRoaXMoc291cmNlLmdldFBhdGgoKSwgbmV3IEZpbGVSZWFkZXJTb3VyY2Uoc291cmNlLCBjb25maWd1cmF0aW9uKSwgY29uZmlndXJhdGlvbiwgbG9hZGVyLCBlcik7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplcyB0aGUgU291cmNlVW5pdCBmcm9tIHRoZSBzcGVjaWZpZWQgVVJMLgorICAgICAqLworICAgIHB1YmxpYyBTb3VyY2VVbml0KFVSTCBzb3VyY2UsIENvbXBpbGVyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBHcm9vdnlDbGFzc0xvYWRlciBsb2FkZXIsIEVycm9yQ29sbGVjdG9yIGVyKSB7CisgICAgICAgIHRoaXMoc291cmNlLmdldFBhdGgoKSwgbmV3IFVSTFJlYWRlclNvdXJjZShzb3VyY2UsIGNvbmZpZ3VyYXRpb24pLCBjb25maWd1cmF0aW9uLCBsb2FkZXIsIGVyKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemVzIHRoZSBTb3VyY2VVbml0IGZvciBhIHN0cmluZyBvZiBzb3VyY2UuCisgICAgICovCisgICAgcHVibGljIFNvdXJjZVVuaXQoU3RyaW5nIG5hbWUsIFN0cmluZyBzb3VyY2UsIENvbXBpbGVyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBHcm9vdnlDbGFzc0xvYWRlciBsb2FkZXIsIEVycm9yQ29sbGVjdG9yIGVyKSB7CisgICAgICAgIHRoaXMobmFtZSwgbmV3IFN0cmluZ1JlYWRlclNvdXJjZShzb3VyY2UsIGNvbmZpZ3VyYXRpb24pLCBjb25maWd1cmF0aW9uLCBsb2FkZXIsIGVyKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5hbWUgZm9yIHRoZSBTb3VyY2VVbml0LiBUaGlzIG5hbWUgc2hvdWxkbid0CisgICAgICogYmUgdXNlZCBmb3IgY29udHJvbGluZyB0aGUgU291cmNlVW5pdCwgaXQgaXMgb25seSBmb3IgZXJyb3IKKyAgICAgKiBtZXNzYWdlcworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBDb25jcmV0ZSBTeW50YXggVHJlZSBwcm9kdWNlZCBkdXJpbmcgcGFyc2UoKWluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVkdWN0aW9uIGdldENTVCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuY3N0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIEFic3RyYWN0IFN5bnRheCBUcmVlIHByb2R1Y2VkIGR1cmluZyBwYXJzZSgpaW5nCisgICAgICogYW5kIGV4cGFuZGVkIGR1cmluZyBsYXRlciBwaGFzZXMuCisgICAgICovCisgICAgcHVibGljIE1vZHVsZU5vZGUgZ2V0QVNUKCkgeworICAgICAgICByZXR1cm4gdGhpcy5hc3Q7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSByb3V0aW5lLCBwcmltYXJpbHkgZm9yIHVzZSBieSB0aGUgSW50ZXJhY3RpdmVTaGVsbCwKKyAgICAgKiB0aGF0IHJldHVybnMgdHJ1ZSBpZiBwYXJzZSgpIGZhaWxlZCB3aXRoIGFuIHVuZXhwZWN0ZWQgRU9GLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGZhaWxlZFdpdGhVbmV4cGVjdGVkRU9GKCkgeworICAgIAkvLyBJbXBsZW1lbnRhdGlvbiBub3RlIC0gdGhlcmUgYXJlIHNldmVyYWwgd2F5cyBmb3IgdGhlIEdyb292eSBjb21waWxlcgorICAgIAkvLyB0byByZXBvcnQgYW4gdW5leHBlY3RlZCBFT0YuIFBlcmhhcHMgdGhpcyBpbXBsZW1lbnRhdGlvbiBtaXNzZXMgc29tZS4KKyAgICAJLy8gSWYgeW91IGZpbmQgYW5vdGhlciB3YXksIHBsZWFzZSBhZGQgaXQuCisgICAgICAgIGlmIChnZXRFcnJvckNvbGxlY3RvcigpLmhhc0Vycm9ycygpKSB7CisgICAgICAgICAgICBNZXNzYWdlIGxhc3QgPSAoTWVzc2FnZSkgZ2V0RXJyb3JDb2xsZWN0b3IoKS5nZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgIFRocm93YWJsZSBjYXVzZSA9IG51bGw7CisgICAgICAgICAgICBpZiAobGFzdCBpbnN0YW5jZW9mIFN5bnRheEVycm9yTWVzc2FnZSkgeworICAgICAgICAgICAgICAgIGNhdXNlID0gKChTeW50YXhFcnJvck1lc3NhZ2UpIGxhc3QpLmdldENhdXNlKCkuZ2V0Q2F1c2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjYXVzZSAhPSBudWxsKSB7CisgICAgICAgICAgICAJaWYgKGNhdXNlIGluc3RhbmNlb2YgTm9WaWFibGVBbHRFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzRW9mVG9rZW4oKChOb1ZpYWJsZUFsdEV4Y2VwdGlvbikgY2F1c2UpLnRva2VuKTsKKyAgICAgICAgICAgIAl9IGVsc2UgaWYgKGNhdXNlIGluc3RhbmNlb2YgTm9WaWFibGVBbHRGb3JDaGFyRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAJCWNoYXIgYmFkQ2hhciA9ICgoTm9WaWFibGVBbHRGb3JDaGFyRXhjZXB0aW9uKSBjYXVzZSkuZm91bmRDaGFyOworICAgICAgICAgICAgCQlyZXR1cm4gYmFkQ2hhciA9PSBDaGFyU2Nhbm5lci5FT0ZfQ0hBUjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNhdXNlIGluc3RhbmNlb2YgTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc0VvZlRva2VuKCgoTWlzbWF0Y2hlZFRva2VuRXhjZXB0aW9uKSBjYXVzZSkudG9rZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7ICAgIAorICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIGlzRW9mVG9rZW4oYW50bHIuVG9rZW4gdG9rZW4pIHsKKyAgICAgICAgcmV0dXJuIHRva2VuLmdldFR5cGUoKSA9PSBhbnRsci5Ub2tlbi5FT0ZfVFlQRTsKKyAgICB9CisKKworCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBGQUNUT1JJRVMKKworCisgICAgLyoqCisgICAgICogQSBjb252ZW5pZW5jZSByb3V0aW5lIHRvIGNyZWF0ZSBhIHN0YW5kYWxvbmUgU291cmNlVW5pdCBvbiBhIFN0cmluZworICAgICAqIHdpdGggZGVmYXVsdHMgZm9yIGFsbW9zdCBldmVyeXRoaW5nIHRoYXQgaXMgY29uZmlndXJhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU291cmNlVW5pdCBjcmVhdGUoU3RyaW5nIG5hbWUsIFN0cmluZyBzb3VyY2UpIHsKKyAgICAgICAgQ29tcGlsZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBuZXcgQ29tcGlsZXJDb25maWd1cmF0aW9uKCk7CisgICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0VG9sZXJhbmNlKDEpOworCisgICAgICAgIHJldHVybiBuZXcgU291cmNlVW5pdChuYW1lLCBzb3VyY2UsIGNvbmZpZ3VyYXRpb24sIG51bGwsIG5ldyBFcnJvckNvbGxlY3Rvcihjb25maWd1cmF0aW9uKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBIGNvbnZlbmllbmNlIHJvdXRpbmUgdG8gY3JlYXRlIGEgc3RhbmRhbG9uZSBTb3VyY2VVbml0IG9uIGEgU3RyaW5nCisgICAgICogd2l0aCBkZWZhdWx0cyBmb3IgYWxtb3N0IGV2ZXJ5dGhpbmcgdGhhdCBpcyBjb25maWd1cmFibGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTb3VyY2VVbml0IGNyZWF0ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHNvdXJjZSwgaW50IHRvbGVyYW5jZSkgeworICAgICAgICBDb21waWxlckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IG5ldyBDb21waWxlckNvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgY29uZmlndXJhdGlvbi5zZXRUb2xlcmFuY2UodG9sZXJhbmNlKTsKKworICAgICAgICByZXR1cm4gbmV3IFNvdXJjZVVuaXQobmFtZSwgc291cmNlLCBjb25maWd1cmF0aW9uLCBudWxsLCBuZXcgRXJyb3JDb2xsZWN0b3IoY29uZmlndXJhdGlvbikpOworICAgIH0KKworCisKKworCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBQUk9DRVNTSU5HCisKKworICAgIC8qKgorICAgICAqIFBhcnNlcyB0aGUgc291cmNlIHRvIGEgQ1NULiAgWW91IGNhbiByZXRyaWV2ZSBpdCB3aXRoIGdldENTVCgpLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBhcnNlKCkgdGhyb3dzIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHRoaXMucGhhc2UgPiBQaGFzZXMuUEFSU0lORykgeworICAgICAgICAgICAgdGhyb3cgbmV3IEdyb292eUJ1Z0Vycm9yKCJwYXJzaW5nIGlzIGFscmVhZHkgY29tcGxldGUiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0aGlzLnBoYXNlID09IFBoYXNlcy5JTklUSUFMSVpBVElPTikgeworICAgICAgICAgICAgbmV4dFBoYXNlKCk7CisgICAgICAgIH0KKworCisgICAgICAgIC8vCisgICAgICAgIC8vIENyZWF0ZSBhIHJlYWRlciBvbiB0aGUgc291cmNlIGFuZCBydW4gdGhlIHBhcnNlci4KKworICAgICAgICBSZWFkZXIgcmVhZGVyID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlciA9IHNvdXJjZS5nZXRSZWFkZXIoKTsKKworICAgICAgICAgICAgLy8gbGV0cyByZWNyZWF0ZSB0aGUgcGFyc2VyIGVhY2ggdGltZSBhcyBpdCB0ZW5kcyB0byBrZWVwIGFyb3VuZCBzdGF0ZQorICAgICAgICAgICAgcGFyc2VyUGx1Z2luID0gZ2V0Q29uZmlndXJhdGlvbigpLmdldFBsdWdpbkZhY3RvcnkoKS5jcmVhdGVQYXJzZXJQbHVnaW4oKTsKKworICAgICAgICAgICAgY3N0ID0gcGFyc2VyUGx1Z2luLnBhcnNlQ1NUKHRoaXMsIHJlYWRlcik7CisKKyAgICAgICAgICAgIHJlYWRlci5jbG9zZSgpOworICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGdldEVycm9yQ29sbGVjdG9yKCkuYWRkRmF0YWxFcnJvcihuZXcgU2ltcGxlTWVzc2FnZShlLmdldE1lc3NhZ2UoKSx0aGlzKSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgICBpZiAocmVhZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgYW4gQVNUIGZyb20gdGhlIENTVC4gIFlvdSBjYW4gcmV0cmlldmUgaXQgd2l0aCBnZXRBU1QoKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb252ZXJ0KCkgdGhyb3dzIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHRoaXMucGhhc2UgPT0gUGhhc2VzLlBBUlNJTkcgJiYgdGhpcy5waGFzZUNvbXBsZXRlKSB7CisgICAgICAgICAgICBnb3RvUGhhc2UoUGhhc2VzLkNPTlZFUlNJT04pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRoaXMucGhhc2UgIT0gUGhhc2VzLkNPTlZFUlNJT04pIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBHcm9vdnlCdWdFcnJvcigiU291cmNlVW5pdCBub3QgcmVhZHkgZm9yIGNvbnZlcnQoKSIpOworICAgICAgICB9CisKKyAgICAgICAgCisgICAgICAgIC8vCisgICAgICAgIC8vIEJ1aWxkIHRoZSBBU1QKKyAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0aGlzLmFzdCA9IHBhcnNlclBsdWdpbi5idWlsZEFTVCh0aGlzLCB0aGlzLmNsYXNzTG9hZGVyLCB0aGlzLmNzdCk7CisKKyAgICAgICAgICAgIHRoaXMuYXN0LnNldERlc2NyaXB0aW9uKHRoaXMubmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFN5bnRheEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBnZXRFcnJvckNvbGxlY3RvcigpLmFkZEVycm9yKG5ldyBTeW50YXhFcnJvck1lc3NhZ2UoZSx0aGlzKSk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgcHJvcGVydHkgPSAoU3RyaW5nKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKKyAgICAgICAgCXB1YmxpYyBPYmplY3QgcnVuKCkgeworICAgICAgICAJCXJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoImdyb292eS5hc3QiKTsKKyAgICAgICAgCX0KKyAgICAgICAgfSk7CisgICAgICAgIAorICAgICAgICBpZiAoInhtbCIuZXF1YWxzKHByb3BlcnR5KSkgeworICAgICAgICAgICAgc2F2ZUFzWE1MKG5hbWUsYXN0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzYXZlQXNYTUwoU3RyaW5nIG5hbWUsIE1vZHVsZU5vZGUgYXN0KSB7CisgICAgICAgIFhTdHJlYW0geHN0cmVhbSA9IG5ldyBYU3RyZWFtKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB4c3RyZWFtLnRvWE1MKGFzdCxuZXcgRmlsZVdyaXRlcihuYW1lICsgIi54bWwiKSk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIldyaXR0ZW4gQVNUIHRvICIgKyBuYW1lICsgIi54bWwiKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ291bGRuJ3Qgd3JpdGUgdG8gIiArIG5hbWUgKyAiLnhtbCIpOworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAvLyBTT1VSQ0UgU0FNUExJTkcKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzYW1wbGluZyBvZiB0aGUgc291cmNlIGF0IHRoZSBzcGVjaWZpZWQgbGluZSBhbmQgY29sdW1uLAorICAgICAqIG9mIG51bGwgaWYgaXQgaXMgdW5hdmFpbGFibGUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTYW1wbGUoaW50IGxpbmUsIGludCBjb2x1bW4sIEphbml0b3IgamFuaXRvcikgeworICAgICAgICBTdHJpbmcgc2FtcGxlID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIHRleHQgPSBzb3VyY2UuZ2V0TGluZShsaW5lLCBqYW5pdG9yKTsKKworICAgICAgICBpZiAodGV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoY29sdW1uID4gMCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBtYXJrZXIgPSBVdGlsaXRpZXMucmVwZWF0U3RyaW5nKCIgIiwgY29sdW1uIC0gMSkgKyAiXiI7CisKKyAgICAgICAgICAgICAgICBpZiAoY29sdW1uID4gNDApIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0ID0gY29sdW1uIC0gMzAgLSAxOworICAgICAgICAgICAgICAgICAgICBpbnQgZW5kID0gKGNvbHVtbiArIDEwID4gdGV4dC5sZW5ndGgoKSA/IHRleHQubGVuZ3RoKCkgOiBjb2x1bW4gKyAxMCAtIDEpOworICAgICAgICAgICAgICAgICAgICBzYW1wbGUgPSAiICAgIiArIHRleHQuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpICsgVXRpbGl0aWVzLmVvbCgpICsgIiAgICIgKyBtYXJrZXIuc3Vic3RyaW5nKHN0YXJ0LCBtYXJrZXIubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxlID0gIiAgICIgKyB0ZXh0ICsgVXRpbGl0aWVzLmVvbCgpICsgIiAgICIgKyBtYXJrZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgc2FtcGxlID0gdGV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzYW1wbGU7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGFkZEV4Y2VwdGlvbihFeGNlcHRpb24gZSkgdGhyb3dzIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZ2V0RXJyb3JDb2xsZWN0b3IoKS5hZGRFeGNlcHRpb24oZSx0aGlzKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgYWRkRXJyb3IoU3ludGF4RXhjZXB0aW9uIHNlKSB0aHJvd3MgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24geworICAgICAgICBnZXRFcnJvckNvbGxlY3RvcigpLmFkZEVycm9yKHNlLHRoaXMpOworICAgIH0KK30KKworCisKKwpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY29udHJvbC9TdGF0aWNJbXBvcnRWaXNpdG9yLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9jb250cm9sL1N0YXRpY0ltcG9ydFZpc2l0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzI2OTIwCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY29udHJvbC9TdGF0aWNJbXBvcnRWaXNpdG9yLmphdmEKQEAgLTAsMCArMSwyNjAgQEAKKy8qDQorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2w7DQorDQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0Lio7DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHIuKjsNCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3Quc3RtdC5TdGF0ZW1lbnQ7DQorDQoraW1wb3J0IGphdmEudXRpbC4qOw0KKw0KKy8qKg0KKyAqIFZpc2l0b3IgdG8gcmVzb2x2ZSBjb25zdGFudHMgYW5kIG1ldGhvZCBjYWxscyBmcm9tIHN0YXRpYyBJbXBvcnRzDQorICoNCisgKiBAYXV0aG9yIEpvY2hlbiBUaGVvZG9yb3UNCisgKiBAYXV0aG9yIFBhdWwgS2luZw0KKyAqLw0KK3B1YmxpYyBjbGFzcyBTdGF0aWNJbXBvcnRWaXNpdG9yIGV4dGVuZHMgQ2xhc3NDb2RlRXhwcmVzc2lvblRyYW5zZm9ybWVyIHsNCisgICAgcHJpdmF0ZSBDbGFzc05vZGUgY3VycmVudENsYXNzOw0KKyAgICBwcml2YXRlIFNvdXJjZVVuaXQgc291cmNlOw0KKyAgICBwcml2YXRlIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQ7DQorICAgIHByaXZhdGUgYm9vbGVhbiBzdGlsbFJlc29sdmluZzsNCisgICAgcHJpdmF0ZSBib29sZWFuIGluU3BlY2lhbENvbnN0cnVjdG9yQ2FsbDsNCisgICAgcHJpdmF0ZSBib29sZWFuIGluQ2xvc3VyZTsNCisgICAgcHJpdmF0ZSBib29sZWFuIGluUHJvcGVydHlFeHByZXNzaW9uOw0KKyAgICBwcml2YXRlIEV4cHJlc3Npb24gZm91bmRDb25zdGFudDsNCisgICAgcHJpdmF0ZSBFeHByZXNzaW9uIGZvdW5kQXJnczsNCisNCisgICAgcHVibGljIFN0YXRpY0ltcG9ydFZpc2l0b3IoQ29tcGlsYXRpb25Vbml0IGN1KSB7DQorICAgICAgICBjb21waWxhdGlvblVuaXQgPSBjdTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCB2aXNpdENsYXNzKENsYXNzTm9kZSBub2RlLCBTb3VyY2VVbml0IHNvdXJjZSkgew0KKyAgICAgICAgdGhpcy5jdXJyZW50Q2xhc3MgPSBub2RlOw0KKyAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7DQorICAgICAgICBzdXBlci52aXNpdENsYXNzKG5vZGUpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBFeHByZXNzaW9uIHRyYW5zZm9ybShFeHByZXNzaW9uIGV4cCkgew0KKyAgICAgICAgaWYgKGV4cCA9PSBudWxsKSByZXR1cm4gbnVsbDsNCisgICAgICAgIGlmIChleHAuZ2V0Q2xhc3MoKSA9PSBWYXJpYWJsZUV4cHJlc3Npb24uY2xhc3MpIHsNCisgICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtVmFyaWFibGVFeHByZXNzaW9uKChWYXJpYWJsZUV4cHJlc3Npb24pIGV4cCk7DQorICAgICAgICB9DQorICAgICAgICBpZiAoZXhwLmdldENsYXNzKCkgPT0gUHJvcGVydHlFeHByZXNzaW9uLmNsYXNzKSB7DQorICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybVByb3BlcnR5RXhwcmVzc2lvbigoUHJvcGVydHlFeHByZXNzaW9uKSBleHApOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGV4cC5nZXRDbGFzcygpID09IE1ldGhvZENhbGxFeHByZXNzaW9uLmNsYXNzKSB7DQorICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybU1ldGhvZENhbGxFeHByZXNzaW9uKChNZXRob2RDYWxsRXhwcmVzc2lvbikgZXhwKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChleHAuZ2V0Q2xhc3MoKSA9PSBDbG9zdXJlRXhwcmVzc2lvbi5jbGFzcykgew0KKyAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1DbG9zdXJlRXhwcmVzc2lvbigoQ2xvc3VyZUV4cHJlc3Npb24pIGV4cCk7DQorICAgICAgICB9DQorICAgICAgICBpZiAoZXhwLmdldENsYXNzKCkgPT0gQ29uc3RydWN0b3JDYWxsRXhwcmVzc2lvbi5jbGFzcykgew0KKyAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1Db25zdHJ1Y3RvckNhbGxFeHByZXNzaW9uKChDb25zdHJ1Y3RvckNhbGxFeHByZXNzaW9uKSBleHApOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGV4cC5nZXRDbGFzcygpID09IEFyZ3VtZW50TGlzdEV4cHJlc3Npb24uY2xhc3MpIHsNCisgICAgICAgICAgICBFeHByZXNzaW9uIHJlc3VsdCA9IGV4cC50cmFuc2Zvcm1FeHByZXNzaW9uKHRoaXMpOw0KKyAgICAgICAgICAgIGlmIChpblByb3BlcnR5RXhwcmVzc2lvbikgew0KKyAgICAgICAgICAgICAgICBmb3VuZEFyZ3MgPSByZXN1bHQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAoZXhwLmdldENsYXNzKCkgPT0gQ29uc3RhbnRFeHByZXNzaW9uLmNsYXNzKSB7DQorICAgICAgICAgICAgRXhwcmVzc2lvbiByZXN1bHQgPSBleHAudHJhbnNmb3JtRXhwcmVzc2lvbih0aGlzKTsNCisgICAgICAgICAgICBpZiAoaW5Qcm9wZXJ0eUV4cHJlc3Npb24pIHsNCisgICAgICAgICAgICAgICAgZm91bmRDb25zdGFudCA9IHJlc3VsdDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBleHAudHJhbnNmb3JtRXhwcmVzc2lvbih0aGlzKTsNCisgICAgfQ0KKw0KKyAgICBwcm90ZWN0ZWQgRXhwcmVzc2lvbiB0cmFuc2Zvcm1WYXJpYWJsZUV4cHJlc3Npb24oVmFyaWFibGVFeHByZXNzaW9uIHZlKSB7DQorICAgICAgICBWYXJpYWJsZSB2ID0gdmUuZ2V0QWNjZXNzZWRWYXJpYWJsZSgpOw0KKyAgICAgICAgaWYgKHYgIT0gbnVsbCAmJiB2IGluc3RhbmNlb2YgRHluYW1pY1ZhcmlhYmxlKSB7DQorICAgICAgICAgICAgRXhwcmVzc2lvbiByZXN1bHQgPSBmaW5kU3RhdGljRmllbGRJbXBvcnRGcm9tTW9kdWxlKHYuZ2V0TmFtZSgpKTsNCisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHJldHVybiByZXN1bHQ7DQorICAgICAgICAgICAgaWYgKCFpblByb3BlcnR5RXhwcmVzc2lvbiB8fCBpblNwZWNpYWxDb25zdHJ1Y3RvckNhbGwpIGFkZFN0YXRpY1ZhcmlhYmxlRXJyb3IodmUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHZlOw0KKyAgICB9DQorDQorICAgIHByb3RlY3RlZCBFeHByZXNzaW9uIHRyYW5zZm9ybU1ldGhvZENhbGxFeHByZXNzaW9uKE1ldGhvZENhbGxFeHByZXNzaW9uIG1jZSkgew0KKyAgICAgICAgRXhwcmVzc2lvbiBhcmdzID0gdHJhbnNmb3JtKG1jZS5nZXRBcmd1bWVudHMoKSk7DQorICAgICAgICBFeHByZXNzaW9uIG1ldGhvZCA9IHRyYW5zZm9ybShtY2UuZ2V0TWV0aG9kKCkpOw0KKyAgICAgICAgaWYgKG1jZS5pc0ltcGxpY2l0VGhpcygpKSB7DQorICAgICAgICAgICAgRXhwcmVzc2lvbiByZXQgPSBmaW5kU3RhdGljTWV0aG9kSW1wb3J0RnJvbU1vZHVsZShtZXRob2QsIGFyZ3MpOw0KKyAgICAgICAgICAgIGlmIChyZXQgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoaW5TcGVjaWFsQ29uc3RydWN0b3JDYWxsICYmIG1ldGhvZCBpbnN0YW5jZW9mIENvbnN0YW50RXhwcmVzc2lvbikgew0KKyAgICAgICAgICAgICAgICBDb25zdGFudEV4cHJlc3Npb24gY2UgPSAoQ29uc3RhbnRFeHByZXNzaW9uKSBtZXRob2Q7DQorICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGNlLmdldFZhbHVlKCk7DQorICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdGF0aWNNZXRob2RDYWxsRXhwcmVzc2lvbihjdXJyZW50Q2xhc3MsIChTdHJpbmcpIHZhbHVlLCBhcmdzKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIEV4cHJlc3Npb24gb2JqZWN0ID0gdHJhbnNmb3JtKG1jZS5nZXRPYmplY3RFeHByZXNzaW9uKCkpOw0KKw0KKyAgICAgICAgTWV0aG9kQ2FsbEV4cHJlc3Npb24gcmVzdWx0ID0gbmV3IE1ldGhvZENhbGxFeHByZXNzaW9uKG9iamVjdCwgbWV0aG9kLCBhcmdzKTsNCisgICAgICAgIHJlc3VsdC5zZXRTYWZlKG1jZS5pc1NhZmUoKSk7DQorICAgICAgICByZXN1bHQuc2V0SW1wbGljaXRUaGlzKG1jZS5pc0ltcGxpY2l0VGhpcygpKTsNCisgICAgICAgIHJlc3VsdC5zZXRTcHJlYWRTYWZlKG1jZS5pc1NwcmVhZFNhZmUoKSk7DQorICAgICAgICByZXN1bHQuc2V0U291cmNlUG9zaXRpb24obWNlKTsNCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgIH0NCisNCisgICAgcHJvdGVjdGVkIEV4cHJlc3Npb24gdHJhbnNmb3JtQ29uc3RydWN0b3JDYWxsRXhwcmVzc2lvbihDb25zdHJ1Y3RvckNhbGxFeHByZXNzaW9uIGNjZSkgew0KKyAgICAgICAgaW5TcGVjaWFsQ29uc3RydWN0b3JDYWxsID0gY2NlLmlzU3BlY2lhbENhbGwoKTsNCisgICAgICAgIEV4cHJlc3Npb24gcmV0ID0gY2NlLnRyYW5zZm9ybUV4cHJlc3Npb24odGhpcyk7DQorICAgICAgICBpblNwZWNpYWxDb25zdHJ1Y3RvckNhbGwgPSBmYWxzZTsNCisgICAgICAgIHJldHVybiByZXQ7DQorICAgIH0NCisNCisgICAgcHJvdGVjdGVkIEV4cHJlc3Npb24gdHJhbnNmb3JtQ2xvc3VyZUV4cHJlc3Npb24oQ2xvc3VyZUV4cHJlc3Npb24gY2UpIHsNCisgICAgICAgIGJvb2xlYW4gb2xkSW5DbG9zdXJlID0gaW5DbG9zdXJlOw0KKyAgICAgICAgaW5DbG9zdXJlID0gdHJ1ZTsNCisgICAgICAgIFN0YXRlbWVudCBjb2RlID0gY2UuZ2V0Q29kZSgpOw0KKyAgICAgICAgaWYgKGNvZGUgIT0gbnVsbCkgY29kZS52aXNpdCh0aGlzKTsNCisgICAgICAgIGluQ2xvc3VyZSA9IG9sZEluQ2xvc3VyZTsNCisgICAgICAgIHJldHVybiBjZTsNCisgICAgfQ0KKw0KKyAgICAvLyBUT0RPOiBmaW5kIGEgbmljZXIgd2F5IHRvIGRvIHRoaXMgLSB3ZSBhcmUgdW5yYXZlbGxpbmcgd2hhdCBSZXNvbHZlVmlzaXRvciByYXZlbGxlZA0KKyAgICBwcm90ZWN0ZWQgRXhwcmVzc2lvbiB0cmFuc2Zvcm1Qcm9wZXJ0eUV4cHJlc3Npb24oUHJvcGVydHlFeHByZXNzaW9uIHBlKSB7DQorICAgICAgICBib29sZWFuIG9sZEluUHJvcGVydHlFeHByZXNzaW9uID0gaW5Qcm9wZXJ0eUV4cHJlc3Npb247DQorICAgICAgICBFeHByZXNzaW9uIG9sZEZvdW5kQXJncyA9IGZvdW5kQXJnczsNCisgICAgICAgIEV4cHJlc3Npb24gb2xkRm91bmRNZXRob2QgPSBmb3VuZENvbnN0YW50Ow0KKyAgICAgICAgaW5Qcm9wZXJ0eUV4cHJlc3Npb24gPSB0cnVlOw0KKyAgICAgICAgZm91bmRBcmdzID0gbnVsbDsNCisgICAgICAgIGZvdW5kQ29uc3RhbnQgPSBudWxsOw0KKyAgICAgICAgRXhwcmVzc2lvbiBvYmplY3RFeHByZXNzaW9uID0gdHJhbnNmb3JtKHBlLmdldE9iamVjdEV4cHJlc3Npb24oKSk7DQorICAgICAgICBpZiAoZm91bmRBcmdzICE9IG51bGwgJiYgZm91bmRDb25zdGFudCAhPSBudWxsKSB7DQorICAgICAgICAgICAgRXhwcmVzc2lvbiByZXN1bHQgPSBmaW5kU3RhdGljTWV0aG9kSW1wb3J0RnJvbU1vZHVsZShmb3VuZENvbnN0YW50LCBmb3VuZEFyZ3MpOw0KKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICBvYmplY3RFeHByZXNzaW9uID0gcmVzdWx0Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGluUHJvcGVydHlFeHByZXNzaW9uID0gb2xkSW5Qcm9wZXJ0eUV4cHJlc3Npb247DQorICAgICAgICBmb3VuZEFyZ3MgPSBvbGRGb3VuZEFyZ3M7DQorICAgICAgICBmb3VuZENvbnN0YW50ID0gb2xkRm91bmRNZXRob2Q7DQorICAgICAgICBwZS5zZXRPYmplY3RFeHByZXNzaW9uKG9iamVjdEV4cHJlc3Npb24pOw0KKyAgICAgICAgaWYgKCFpblNwZWNpYWxDb25zdHJ1Y3RvckNhbGwpIGNoZWNrU3RhdGljU2NvcGUocGUpOw0KKyAgICAgICAgcmV0dXJuIHBlOw0KKyAgICB9DQorDQorICAgIHByaXZhdGUgdm9pZCBjaGVja1N0YXRpY1Njb3BlKFByb3BlcnR5RXhwcmVzc2lvbiBwZSkgew0KKyAgICAgICAgaWYgKGluQ2xvc3VyZSkgcmV0dXJuOw0KKyAgICAgICAgZm9yIChFeHByZXNzaW9uIGl0ID0gcGU7IGl0ICE9IG51bGw7IGl0ID0gKChQcm9wZXJ0eUV4cHJlc3Npb24pIGl0KS5nZXRPYmplY3RFeHByZXNzaW9uKCkpIHsNCisgICAgICAgICAgICBpZiAoaXQgaW5zdGFuY2VvZiBQcm9wZXJ0eUV4cHJlc3Npb24pIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIGlmIChpdCBpbnN0YW5jZW9mIFZhcmlhYmxlRXhwcmVzc2lvbikgew0KKyAgICAgICAgICAgICAgICBhZGRTdGF0aWNWYXJpYWJsZUVycm9yKChWYXJpYWJsZUV4cHJlc3Npb24pIGl0KTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHByaXZhdGUgdm9pZCBhZGRTdGF0aWNWYXJpYWJsZUVycm9yKFZhcmlhYmxlRXhwcmVzc2lvbiB2ZSkgew0KKyAgICAgICAgLy8gY2xvc3VyZXMgYXJlIGFsd2F5cyBkeW5hbWljDQorICAgICAgICAvLyBwcm9wZXJ0aWVzRXhwcmVzc2lvbnMgd2lsbCBoYW5kbGUgdGhlIGVycm9yIGEgYml0IGRpZmZlcmVudA0KKyAgICAgICAgaWYgKCFpblNwZWNpYWxDb25zdHJ1Y3RvckNhbGwgJiYgKGluQ2xvc3VyZSB8fCAhdmUuaXNJblN0YXRpY0NvbnRleHQoKSkpIHJldHVybjsNCisgICAgICAgIGlmIChzdGlsbFJlc29sdmluZykgcmV0dXJuOw0KKyAgICAgICAgaWYgKHZlID09IFZhcmlhYmxlRXhwcmVzc2lvbi5USElTX0VYUFJFU1NJT04gfHwgdmUgPT0gVmFyaWFibGVFeHByZXNzaW9uLlNVUEVSX0VYUFJFU1NJT04pIHJldHVybjsNCisgICAgICAgIFZhcmlhYmxlIHYgPSB2ZS5nZXRBY2Nlc3NlZFZhcmlhYmxlKCk7DQorICAgICAgICBpZiAodiAhPSBudWxsICYmICEodiBpbnN0YW5jZW9mIER5bmFtaWNWYXJpYWJsZSkgJiYgdi5pc0luU3RhdGljQ29udGV4dCgpKSByZXR1cm47DQorICAgICAgICBhZGRFcnJvcigidGhlIG5hbWUgIiArIHZlLmdldE5hbWUoKSArICIgZG9lc24ndCByZWZlciB0byBhIGRlY2xhcmVkIHZhcmlhYmxlIG9yIGNsYXNzLiBUaGUgc3RhdGljIiArDQorICAgICAgICAgICAgICAgICIgc2NvcGUgcmVxdWlyZXMgdGhhdCB5b3UgZGVjbGFyZSB2YXJpYWJsZXMgYmVmb3JlIHVzaW5nIHRoZW0uIElmIHRoZSB2YXJpYWJsZSBzaG91bGQgaGF2ZSIgKw0KKyAgICAgICAgICAgICAgICAiIGJlZW4gYSBjbGFzcyBjaGVjayB0aGUgc3BlbGxpbmcuIiwgdmUpOw0KKyAgICB9DQorDQorICAgIHByaXZhdGUgRXhwcmVzc2lvbiBmaW5kU3RhdGljRmllbGRJbXBvcnRGcm9tTW9kdWxlKFN0cmluZyBuYW1lKSB7DQorICAgICAgICBNb2R1bGVOb2RlIG1vZHVsZSA9IGN1cnJlbnRDbGFzcy5nZXRNb2R1bGUoKTsNCisgICAgICAgIGlmIChtb2R1bGUgPT0gbnVsbCkgcmV0dXJuIG51bGw7DQorICAgICAgICBNYXAgYWxpYXNlcyA9IG1vZHVsZS5nZXRTdGF0aWNJbXBvcnRBbGlhc2VzKCk7DQorICAgICAgICBzdGlsbFJlc29sdmluZyA9IGZhbHNlOw0KKyAgICAgICAgaWYgKGFsaWFzZXMuY29udGFpbnNLZXkobmFtZSkpIHsNCisgICAgICAgICAgICBDbGFzc05vZGUgbm9kZSA9IChDbGFzc05vZGUpIGFsaWFzZXMuZ2V0KG5hbWUpOw0KKyAgICAgICAgICAgIE1hcCBmaWVsZHMgPSBtb2R1bGUuZ2V0U3RhdGljSW1wb3J0RmllbGRzKCk7DQorICAgICAgICAgICAgU3RyaW5nIGZpZWxkTmFtZSA9IChTdHJpbmcpIGZpZWxkcy5nZXQobmFtZSk7DQorICAgICAgICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gZmluZFN0YXRpY0ZpZWxkKG5vZGUsIGZpZWxkTmFtZSk7DQorICAgICAgICAgICAgaWYgKGV4cHJlc3Npb24gIT0gbnVsbCkgcmV0dXJuIGV4cHJlc3Npb247DQorICAgICAgICB9DQorICAgICAgICBNYXAgaW1wb3J0ZWRDbGFzc2VzID0gbW9kdWxlLmdldFN0YXRpY0ltcG9ydENsYXNzZXMoKTsNCisgICAgICAgIEl0ZXJhdG9yIGl0ID0gaW1wb3J0ZWRDbGFzc2VzLmtleVNldCgpLml0ZXJhdG9yKCk7DQorICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7DQorICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IChTdHJpbmcpIGl0Lm5leHQoKTsNCisgICAgICAgICAgICBDbGFzc05vZGUgbm9kZSA9IChDbGFzc05vZGUpIGltcG9ydGVkQ2xhc3Nlcy5nZXQoY2xhc3NOYW1lKTsNCisgICAgICAgICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBmaW5kU3RhdGljRmllbGQobm9kZSwgbmFtZSk7DQorICAgICAgICAgICAgaWYgKGV4cHJlc3Npb24gIT0gbnVsbCkgcmV0dXJuIGV4cHJlc3Npb247DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gbnVsbDsNCisgICAgfQ0KKw0KKyAgICBwcml2YXRlIEV4cHJlc3Npb24gZmluZFN0YXRpY0ZpZWxkKENsYXNzTm9kZSBzdGF0aWNJbXBvcnRUeXBlLCBTdHJpbmcgZmllbGROYW1lKSB7DQorICAgICAgICBpZiAoIXN0YXRpY0ltcG9ydFR5cGUuaXNSZXNvbHZlZCgpICYmICFzdGF0aWNJbXBvcnRUeXBlLmlzUHJpbWFyeUNsYXNzTm9kZSgpKSB7DQorICAgICAgICAgICAgc3RpbGxSZXNvbHZpbmcgPSB0cnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHN0YXRpY0ltcG9ydFR5cGUuaXNQcmltYXJ5Q2xhc3NOb2RlKCkgfHwgc3RhdGljSW1wb3J0VHlwZS5pc1Jlc29sdmVkKCkpIHsNCisgICAgICAgICAgICBzdGF0aWNJbXBvcnRUeXBlLmdldEZpZWxkcygpOyAvLyBmb3JjZSBpbml0DQorICAgICAgICAgICAgRmllbGROb2RlIGZpZWxkID0gc3RhdGljSW1wb3J0VHlwZS5nZXRGaWVsZChmaWVsZE5hbWUpOw0KKyAgICAgICAgICAgIGlmIChmaWVsZCAhPSBudWxsICYmIGZpZWxkLmlzU3RhdGljKCkpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eUV4cHJlc3Npb24obmV3IENsYXNzRXhwcmVzc2lvbihzdGF0aWNJbXBvcnRUeXBlKSwgZmllbGROYW1lKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gbnVsbDsNCisgICAgfQ0KKw0KKyAgICBwcml2YXRlIEV4cHJlc3Npb24gZmluZFN0YXRpY01ldGhvZEltcG9ydEZyb21Nb2R1bGUoRXhwcmVzc2lvbiBtZXRob2QsIEV4cHJlc3Npb24gYXJncykgew0KKyAgICAgICAgTW9kdWxlTm9kZSBtb2R1bGUgPSBjdXJyZW50Q2xhc3MuZ2V0TW9kdWxlKCk7DQorICAgICAgICBpZiAobW9kdWxlID09IG51bGwgfHwgIShtZXRob2QgaW5zdGFuY2VvZiBDb25zdGFudEV4cHJlc3Npb24pKSByZXR1cm4gbnVsbDsNCisgICAgICAgIE1hcCBhbGlhc2VzID0gbW9kdWxlLmdldFN0YXRpY0ltcG9ydEFsaWFzZXMoKTsNCisgICAgICAgIENvbnN0YW50RXhwcmVzc2lvbiBjZSA9IChDb25zdGFudEV4cHJlc3Npb24pIG1ldGhvZDsNCisgICAgICAgIE9iamVjdCB2YWx1ZSA9IGNlLmdldFZhbHVlKCk7DQorICAgICAgICAvLyBza2lwIG5vbi1TdHJpbmdzLCBlLmcuIEludGVnZXINCisgICAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSkgcmV0dXJuIG51bGw7DQorICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIHZhbHVlOw0KKyAgICAgICAgaWYgKGFsaWFzZXMuY29udGFpbnNLZXkobmFtZSkpIHsNCisgICAgICAgICAgICBDbGFzc05vZGUgbm9kZSA9IChDbGFzc05vZGUpIGFsaWFzZXMuZ2V0KG5hbWUpOw0KKyAgICAgICAgICAgIE1hcCBmaWVsZHMgPSBtb2R1bGUuZ2V0U3RhdGljSW1wb3J0RmllbGRzKCk7DQorICAgICAgICAgICAgU3RyaW5nIGZpZWxkTmFtZSA9IChTdHJpbmcpIGZpZWxkcy5nZXQobmFtZSk7DQorICAgICAgICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gZmluZFN0YXRpY01ldGhvZChub2RlLCBmaWVsZE5hbWUsIGFyZ3MpOw0KKyAgICAgICAgICAgIGlmIChleHByZXNzaW9uICE9IG51bGwpIHJldHVybiBleHByZXNzaW9uOw0KKyAgICAgICAgfQ0KKyAgICAgICAgTWFwIGltcG9ydFBhY2thZ2VzID0gbW9kdWxlLmdldFN0YXRpY0ltcG9ydENsYXNzZXMoKTsNCisgICAgICAgIEl0ZXJhdG9yIGl0ID0gaW1wb3J0UGFja2FnZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsNCisgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsNCisgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gKFN0cmluZykgaXQubmV4dCgpOw0KKyAgICAgICAgICAgIENsYXNzTm9kZSBzdGFySW1wb3J0VHlwZSA9IChDbGFzc05vZGUpIGltcG9ydFBhY2thZ2VzLmdldChjbGFzc05hbWUpOw0KKyAgICAgICAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IGZpbmRTdGF0aWNNZXRob2Qoc3RhckltcG9ydFR5cGUsIG5hbWUsIGFyZ3MpOw0KKyAgICAgICAgICAgIGlmIChleHByZXNzaW9uICE9IG51bGwpIHJldHVybiBleHByZXNzaW9uOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIG51bGw7DQorICAgIH0NCisNCisgICAgcHJpdmF0ZSBFeHByZXNzaW9uIGZpbmRTdGF0aWNNZXRob2QoQ2xhc3NOb2RlIHN0YXRpY0ltcG9ydFR5cGUsIFN0cmluZyBtZXRob2ROYW1lLCBFeHByZXNzaW9uIGFyZ3MpIHsNCisgICAgICAgIGlmIChzdGF0aWNJbXBvcnRUeXBlLmlzUHJpbWFyeUNsYXNzTm9kZSgpIHx8IHN0YXRpY0ltcG9ydFR5cGUuaXNSZXNvbHZlZCgpKSB7DQorICAgICAgICAgICAgaWYgKHN0YXRpY0ltcG9ydFR5cGUuaGFzUG9zc2libGVTdGF0aWNNZXRob2QobWV0aG9kTmFtZSwgYXJncykpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdGF0aWNNZXRob2RDYWxsRXhwcmVzc2lvbihzdGF0aWNJbXBvcnRUeXBlLCBtZXRob2ROYW1lLCBhcmdzKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gbnVsbDsNCisgICAgfQ0KKw0KKyAgICBwcm90ZWN0ZWQgU291cmNlVW5pdCBnZXRTb3VyY2VVbml0KCkgew0KKyAgICAgICAgcmV0dXJuIHNvdXJjZTsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9jb250cm9sL2lvL0Fic3RyYWN0UmVhZGVyU291cmNlLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9jb250cm9sL2lvL0Fic3RyYWN0UmVhZGVyU291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdmNGUzNAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NvbnRyb2wvaW8vQWJzdHJhY3RSZWFkZXJTb3VyY2UuamF2YQpAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5pbzsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5Db21waWxlckNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLkphbml0b3I7CisKKy8qKgorICogRm9yIFJlYWRlclNvdXJjZXMgdGhhdCBjYW4gY2hvb3NlIGEgcGFyZW50IGNsYXNzLCBhIGJhc2UgdGhhdAorICogcHJvdmlkZXMgY29tbW9uIGZ1bmN0aW9uYWxpdHkuCisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y3BvaXJpZXJAZHJlYW1pbmcub3JnIj5DaHJpcyBQb2lyaWVyPC9hPgorICogQHZlcnNpb24gJElkJAorICovCisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFJlYWRlclNvdXJjZSBpbXBsZW1lbnRzIFJlYWRlclNvdXJjZSB7CisgICAgcHJvdGVjdGVkIENvbXBpbGVyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uOyAgIC8vIENvbmZpZ3VyYXRpb24gZGF0YQorCisgICAgcHVibGljIEFic3RyYWN0UmVhZGVyU291cmNlKENvbXBpbGVyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7CisgICAgICAgIGlmIChjb25maWd1cmF0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gbXVzdCBub3QgYmUgbnVsbCEiKTsKKyAgICAgICAgICAgIC8vIC4uLiBvciBtb3JlIHJlbGF4ZWQ/CisgICAgICAgICAgICAvLyBjb25maWd1cmF0aW9uID0gQ29tcGlsZXJDb25maWd1cmF0aW9uLkRFRkFVTFQ7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNvdXJjZSBjYW4gYmUgcmVzdGFydGVkIChpZS4gaWYgZ2V0UmVhZGVyKCkKKyAgICAgKiB3aWxsIHJldHVybiBub24tbnVsbCBvbiBzdWJzZXF1ZW50IGNhbGxzLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNhblJlb3BlblNvdXJjZSgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBCdWZmZXJlZFJlYWRlciBsaW5lU291cmNlID0gbnVsbDsgICAgLy8gSWYgc2V0LCBhIHJlYWRlciBvbiB0aGUgY3VycmVudCBzb3VyY2UgZmlsZQorICAgIHByaXZhdGUgU3RyaW5nIGxpbmUgPSBudWxsOyAgICAvLyBUaGUgbGFzdCBsaW5lIHJlYWQgZnJvbSB0aGUgY3VycmVudCBzb3VyY2UgZmlsZQorICAgIHByaXZhdGUgaW50IG51bWJlciA9IDA7ICAgICAgIC8vIFRoZSBsYXN0IGxpbmUgbnVtYmVyIHJlYWQKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBsaW5lIGZyb20gdGhlIHNvdXJjZSwgb3IgbnVsbCwgaWYgdW5hdmFpbGFibGUuICBJZgorICAgICAqIHlvdSBzdXBwbHkgYSBKYW5pdG9yLCByZXNvdXJjZXMgd2lsbCBiZSBjYWNoZWQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRMaW5lKGludCBsaW5lTnVtYmVyLCBKYW5pdG9yIGphbml0b3IpIHsKKyAgICAgICAgLy8gSWYgdGhlIHNvdXJjZSBpcyBhbHJlYWR5IG9wZW4gYW5kIGlzIHBhc3NlZCB0aGUgbGluZSB3ZQorICAgICAgICAvLyB3YW50LCBjbG9zZSBpdC4KKyAgICAgICAgaWYgKGxpbmVTb3VyY2UgIT0gbnVsbCAmJiBudW1iZXIgPiBsaW5lTnVtYmVyKSB7CisgICAgICAgICAgICBjbGVhbnVwKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiB0aGUgbGluZSBzb3VyY2UgaXMgY2xvc2VkLCB0cnkgdG8gb3BlbiBpdC4KKyAgICAgICAgaWYgKGxpbmVTb3VyY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBsaW5lU291cmNlID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGdldFJlYWRlcigpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gSWdub3JlCisgICAgICAgICAgICB9CisgICAgICAgICAgICBudW1iZXIgPSAwOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVhZCB1bnRpbCB0aGUgYXBwcm9wcmlhdGUgbGluZSBudW1iZXIuCisgICAgICAgIGlmIChsaW5lU291cmNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHdoaWxlIChudW1iZXIgPCBsaW5lTnVtYmVyKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmVTb3VyY2UucmVhZExpbmUoKTsKKyAgICAgICAgICAgICAgICAgICAgbnVtYmVyKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGNsZWFudXAoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChqYW5pdG9yID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjbGVhbnVwKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGphbml0b3IucmVnaXN0ZXIodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbGluZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbGVhbnMgdXAgYW55IGNhY2hlZCByZXNvdXJjZXMgdXNlZCBieSBnZXRMaW5lKCkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYW51cCgpIHsKKyAgICAgICAgaWYgKGxpbmVTb3VyY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBsaW5lU291cmNlLmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIElnbm9yZQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbGluZVNvdXJjZSA9IG51bGw7CisgICAgICAgIGxpbmUgPSBudWxsOworICAgICAgICBudW1iZXIgPSAwOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY29udHJvbC9pby9GaWxlUmVhZGVyU291cmNlLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9jb250cm9sL2lvL0ZpbGVSZWFkZXJTb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzJhY2IyCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY29udHJvbC9pby9GaWxlUmVhZGVyU291cmNlLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5pbzsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuQ29tcGlsZXJDb25maWd1cmF0aW9uOworCisvKioKKyAqICBBIFJlYWRlclNvdXJjZSBmb3Igc291cmNlIGZpbGVzLgorICoKKyAqICBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpjcG9pcmllckBkcmVhbWluZy5vcmciPkNocmlzIFBvaXJpZXI8L2E+CisgKiAgQHZlcnNpb24gJElkJAorICovCitwdWJsaWMgY2xhc3MgRmlsZVJlYWRlclNvdXJjZSBleHRlbmRzIEFic3RyYWN0UmVhZGVyU291cmNlIHsKKyAgICBwcml2YXRlIEZpbGUgZmlsZTsgIC8vIFRoZSBGaWxlIGZyb20gd2hpY2ggd2UgcHJvZHVjZSBSZWFkZXJzLgorCisgICAvKioKKyAgICAqICBDcmVhdGVzIHRoZSBSZWFkZXJTb3VyY2UgZnJvbSBhIEZpbGUgZGVzY3JpcHRvci4KKyAgICAqIEBwYXJhbSBmaWxlIHNjcmlwdCBzb3VyY2UgZmlsZQorICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiBmb3IgY29tcGlsaW5nIHNvdXJjZQorICAgICovCisgICAgcHVibGljIEZpbGVSZWFkZXJTb3VyY2UoIEZpbGUgZmlsZSwgQ29tcGlsZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gKSB7CisgICAgICAgc3VwZXIoIGNvbmZpZ3VyYXRpb24gKTsKKyAgICAgICAgdGhpcy5maWxlID0gZmlsZTsKKyAgICB9CisKKyAgIC8qKgorICAgICogIFJldHVybnMgYSBuZXcgUmVhZGVyIG9uIHRoZSB1bmRlcmx5aW5nIHNvdXJjZSBvYmplY3QuICAKKyAgICAqLworICAgIHB1YmxpYyBSZWFkZXIgZ2V0UmVhZGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICByZXR1cm4gbmV3IElucHV0U3RyZWFtUmVhZGVyKCBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpLCBjb25maWd1cmF0aW9uLmdldFNvdXJjZUVuY29kaW5nKCkgKTsKKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9jb250cm9sL2lvL0lucHV0U3RyZWFtUmVhZGVyU291cmNlLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9jb250cm9sL2lvL0lucHV0U3RyZWFtUmVhZGVyU291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE4NjUwOQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NvbnRyb2wvaW8vSW5wdXRTdHJlYW1SZWFkZXJTb3VyY2UuamF2YQpAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLmlvOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuQ29tcGlsZXJDb25maWd1cmF0aW9uOworCisvKioKKyAqIEEgUmVhZGVyU291cmNlIGZvciBzb3VyY2Ugc3RyaW5ncy4KKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpjcG9pcmllckBkcmVhbWluZy5vcmciPkNocmlzIFBvaXJpZXI8L2E+CisgKiBAdmVyc2lvbiAkSWQkCisgKi8KK3B1YmxpYyBjbGFzcyBJbnB1dFN0cmVhbVJlYWRlclNvdXJjZSBleHRlbmRzIEFic3RyYWN0UmVhZGVyU291cmNlIHsKKyAgICBwcml2YXRlIElucHV0U3RyZWFtIHN0cmVhbTsgIC8vIFRoZSBJbnB1dFN0cmVhbSBmcm9tIHdoaWNoIHdlIHByb2R1Y2UgYSBSZWFkZXIuCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIHRoZSBSZWFkZXJTb3VyY2UgZnJvbSBhIEZpbGUgZGVzY3JpcHRvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJlYW0gICAgICAgIHN0cmVhbSBjb250YWluaW5nIHNvdXJjZQorICAgICAqIEBwYXJhbSBjb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gZm9yIGNvbXBpbGluZyBzb3VyY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgSW5wdXRTdHJlYW1SZWFkZXJTb3VyY2UoSW5wdXRTdHJlYW0gc3RyZWFtLCBDb21waWxlckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgeworICAgICAgICBzdXBlcihjb25maWd1cmF0aW9uKTsKKyAgICAgICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIG5ldyBSZWFkZXIgb24gdGhlIHVuZGVybHlpbmcgc291cmNlIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVhZGVyIGdldFJlYWRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgUmVhZGVyIHJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihzdHJlYW0sIGNvbmZpZ3VyYXRpb24uZ2V0U291cmNlRW5jb2RpbmcoKSk7CisgICAgICAgICAgICBzdHJlYW0gPSBudWxsOworICAgICAgICAgICAgcmV0dXJuIHJlYWRlcjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNvdXJjZSBjYW4gYmUgcmVzdGFydGVkIChpZS4gaWYgZ2V0UmVhZGVyKCkKKyAgICAgKiB3aWxsIHJldHVybiBub24tbnVsbCBvbiBzdWJzZXF1ZW50IGNhbGxzLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNhblJlb3BlblNvdXJjZSgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NvbnRyb2wvaW8vTnVsbFdyaXRlci5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY29udHJvbC9pby9OdWxsV3JpdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFjYWNhNwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NvbnRyb2wvaW8vTnVsbFdyaXRlci5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuaW87CisKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKKworLyoqCisgKiAgQW4gV3JpdGVyIHRoYW4gZWF0cyBpdHMgaW5wdXQuCisgKgorICogIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNwb2lyaWVyQGRyZWFtaW5nLm9yZyI+Q2hyaXMgUG9pcmllcjwvYT4KKyAqCisgKiAgQHZlcnNpb24gJElkJAorICovCitwdWJsaWMgY2xhc3MgTnVsbFdyaXRlciBleHRlbmRzIFdyaXRlciB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBOdWxsV3JpdGVyIERFRkFVTFQgPSBuZXcgTnVsbFdyaXRlcigpOworICAgIAorICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkge30KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHt9CisgICAgCisgICAgcHVibGljIHZvaWQgd3JpdGUoIGNoYXJbXSBjYnVmLCBpbnQgb2ZmLCBpbnQgbGVuICkge30KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NvbnRyb2wvaW8vUmVhZGVyU291cmNlLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9jb250cm9sL2lvL1JlYWRlclNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhYWM5OTYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9jb250cm9sL2lvL1JlYWRlclNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuaW87CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLkhhc0NsZWFudXA7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLkphbml0b3I7CisKKy8qKgorICogIEFuIGludGVyZmFjZSBmb3IgdGhpbmdzIHRoYXQgY2FuIHN1cHBseSAoYW5kIHBvdGVudGlhbGx5IHJlc3VwcGx5KSBhIFJlYWRlcgorICogIG9uIGEgc291cmNlIHN0cmVhbS4KKyAqCisgKiAgQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y3BvaXJpZXJAZHJlYW1pbmcub3JnIj5DaHJpcyBQb2lyaWVyPC9hPgorICoKKyAqICBAdmVyc2lvbiAkSWQkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUmVhZGVyU291cmNlIGV4dGVuZHMgSGFzQ2xlYW51cCB7CisgICAvKioKKyAgICAqICBSZXR1cm5zIGEgbmV3IFJlYWRlciBvbiB0aGUgdW5kZXJseWluZyBzb3VyY2Ugb2JqZWN0LiAgUmV0dXJucworICAgICogIG51bGwgaWYgdGhlIHNvdXJjZSBjYW4ndCBiZSByZW9wZW5lZC4KKyAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiBpZiB0aGVyZSB3YXMgYW4gZXJyb3Igb3BlbmluZyBmb3Igc3RyZWFtCisgICAgKiBAcmV0dXJuIHRoZSByZWFkZXIgdG8gdGhlIHJlc291cmNlCisgICAgKi8KKyAgICBSZWFkZXIgZ2V0UmVhZGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uOworICAgIAorICAgLyoqCisgICAgKiAgUmV0dXJucyB0cnVlIGlmIHRoZSBzb3VyY2UgY2FuIGJlIHJlc3RhcnRlZCAoaWUuIGlmIGdldFJlYWRlcigpCisgICAgKiAgd2lsbCByZXR1cm4gbm9uLW51bGwgb24gc3Vic2VxdWVudCBjYWxscy4KKyAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVzb3VyY2UgY2FuIGJlIHJlb3BlbmVkIGZvciByZWFkaW5nCisgICAgKi8KKyAgICBib29sZWFuIGNhblJlb3BlblNvdXJjZSgpOworICAgIAorICAgLyoqCisgICAgKiAgUmV0dXJucyBhIGxpbmUgZnJvbSB0aGUgc291cmNlLCBvciBudWxsLCBpZiB1bmF2YWlsYWJsZS4gIElmCisgICAgKiAgeW91IHN1cHBseSBhIEphbml0b3IsIHJlc291cmNlcyB3aWxsIGJlIGNhY2hlZC4KKyAgICAqIEBwYXJhbSBsaW5lTnVtYmVyIHRoZSBudW1iZXIgb2YgdGhlIGxpbmUgb2YgaW50ZXJlc3QKKyAgICAqIEBwYXJhbSBqYW5pdG9yIGhlbHBlciB0byBjbGVhbiB1cCBhZnRlcndhcmRzCisgICAgKiBAcmV0dXJuIHRoZSBsaW5lIG9mIGludGVyZXN0CisgICAgKi8KKyAgICBTdHJpbmcgZ2V0TGluZSggaW50IGxpbmVOdW1iZXIsIEphbml0b3IgamFuaXRvciApOworICAgIAorICAgLyoqCisgICAgKiAgQ2xlYW5zIHVwIGFueSBjYWNoZWQgcmVzb3VyY2VzIHVzZWQgYnkgZ2V0TGluZSgpLgorICAgICovCisgICAgdm9pZCBjbGVhbnVwKCk7Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9jb250cm9sL2lvL1N0cmluZ1JlYWRlclNvdXJjZS5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY29udHJvbC9pby9TdHJpbmdSZWFkZXJTb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDRiZjI1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY29udHJvbC9pby9TdHJpbmdSZWFkZXJTb3VyY2UuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLmlvOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5Db21waWxlckNvbmZpZ3VyYXRpb247CisKKy8qKgorICogIEEgUmVhZGVyU291cmNlIGZvciBzb3VyY2Ugc3RyaW5ncy4KKyAqCisgKiAgQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y3BvaXJpZXJAZHJlYW1pbmcub3JnIj5DaHJpcyBQb2lyaWVyPC9hPgorICoKKyAqICBAdmVyc2lvbiAkSWQkCisgKi8KKworcHVibGljIGNsYXNzIFN0cmluZ1JlYWRlclNvdXJjZSBleHRlbmRzIEFic3RyYWN0UmVhZGVyU291cmNlIHsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBzdHJpbmc7ICAvLyBUaGUgU3RyaW5nIGZyb20gd2hpY2ggd2UgcHJvZHVjZSBSZWFkZXJzLgorCisgICAvKioKKyAgICAqIENyZWF0ZXMgdGhlIFJlYWRlclNvdXJjZSBmcm9tIGEgRmlsZSBkZXNjcmlwdG9yLgorICAgICoKKyAgICAqIEBwYXJhbSBzdHJpbmcgc3RyaW5nIGNvbnRhaW5pbmcgc2NyaXB0IHNvdXJjZQorICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiBmb3IgY29tcGlsaW5nIHNvdXJjZQorICAgICovCisgICAgcHVibGljIFN0cmluZ1JlYWRlclNvdXJjZSggU3RyaW5nIHN0cmluZywgQ29tcGlsZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gKSB7CisgICAgICAgc3VwZXIoIGNvbmZpZ3VyYXRpb24gKTsKKyAgICAgICAgdGhpcy5zdHJpbmc9IHN0cmluZzsKKyAgICB9CisgICAgCisgICAvKioKKyAgICAqICBSZXR1cm5zIGEgbmV3IFJlYWRlciBvbiB0aGUgdW5kZXJseWluZyBzb3VyY2Ugb2JqZWN0LiAgCisgICAgKi8KKyAgICBwdWJsaWMgUmVhZGVyIGdldFJlYWRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdSZWFkZXIoIHN0cmluZyApOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY29udHJvbC9pby9VUkxSZWFkZXJTb3VyY2UuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NvbnRyb2wvaW8vVVJMUmVhZGVyU291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FhNjRlNQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NvbnRyb2wvaW8vVVJMUmVhZGVyU291cmNlLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5pbzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuQ29tcGlsZXJDb25maWd1cmF0aW9uOworCisvKioKKyAqICBBIFJlYWRlclNvdXJjZSBmb3Igc291cmNlIGZpbGVzIGhvc3RlZCBhdCBhIFVSTC4KKyAqCisgKiAgQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y3BvaXJpZXJAZHJlYW1pbmcub3JnIj5DaHJpcyBQb2lyaWVyPC9hPgorICoKKyAqICBAdmVyc2lvbiAkSWQkCisgKi8KK3B1YmxpYyBjbGFzcyBVUkxSZWFkZXJTb3VyY2UgZXh0ZW5kcyBBYnN0cmFjdFJlYWRlclNvdXJjZSB7CisgICAgcHJpdmF0ZSBVUkwgdXJsOyAgLy8gVGhlIFVSTCBmcm9tIHdoaWNoIHdlIHByb2R1Y2UgUmVhZGVycy4KKyAgICAKKyAgIC8qKgorICAgICogIENyZWF0ZXMgdGhlIFJlYWRlclNvdXJjZSBmcm9tIGEgRmlsZSBkZXNjcmlwdG9yLgorICAgICogQHBhcmFtIHVybCB1cmwgcG9pbnRpbmcgdG8gc2NyaXB0IHNvdXJjZQorICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiBmb3IgY29tcGlsaW5nIHNvdXJjZQorICAgICovCisgICAgcHVibGljIFVSTFJlYWRlclNvdXJjZSggVVJMIHVybCwgQ29tcGlsZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gKSB7CisgICAgICAgc3VwZXIoIGNvbmZpZ3VyYXRpb24gKTsKKyAgICAgICAgdGhpcy51cmwgPSB1cmw7CisgICAgfQorCisgICAvKioKKyAgICAqICBSZXR1cm5zIGEgbmV3IFJlYWRlciBvbiB0aGUgdW5kZXJseWluZyBzb3VyY2Ugb2JqZWN0LiAgCisgICAgKi8KKyAgICBwdWJsaWMgUmVhZGVyIGdldFJlYWRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgcmV0dXJuIG5ldyBJbnB1dFN0cmVhbVJlYWRlciggdXJsLm9wZW5TdHJlYW0oKSwgY29uZmlndXJhdGlvbi5nZXRTb3VyY2VFbmNvZGluZygpICk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9jb250cm9sL2lvL3BhY2thZ2UuaHRtbCBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NvbnRyb2wvaW8vcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxOTY4M2YKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9jb250cm9sL2lvL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDggQEAKKzxodG1sPgorICA8aGVhZD4KKyAgICA8dGl0bGU+cGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuaW8uKjwvdGl0bGU+CisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgPHA+SW50ZXJuYWwgY2xhc3NlcyBmb3IgR3Jvb3ZpZXIgSW5wdXQvT3V0cHV0LjwvcD4KKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY29udHJvbC9tZXNzYWdlcy9FeGNlcHRpb25NZXNzYWdlLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9jb250cm9sL21lc3NhZ2VzL0V4Y2VwdGlvbk1lc3NhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDU3NzAxCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY29udHJvbC9tZXNzYWdlcy9FeGNlcHRpb25NZXNzYWdlLmphdmEKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLm1lc3NhZ2VzOworCitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5KYW5pdG9yOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5Qcm9jZXNzaW5nVW5pdDsKKworCisKKy8qKgorICogIEEgY2xhc3MgZm9yIGVycm9yIG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IHRoZSBwYXJzZXIgc3lzdGVtLgorICoKKyAqICBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpjcG9pcmllckBkcmVhbWluZy5vcmciPkNocmlzIFBvaXJpZXI8L2E+CisgKgorICogIEB2ZXJzaW9uICRJZCQKKyAqLworCitwdWJsaWMgY2xhc3MgRXhjZXB0aW9uTWVzc2FnZSBleHRlbmRzIE1lc3NhZ2UKK3sKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiB2ZXJib3NlID0gdHJ1ZTsKKworICAgIHByaXZhdGUgRXhjZXB0aW9uIGNhdXNlID0gbnVsbDsgICAvLyBUaGUgZXhjZXB0aW9uIHNvdXJjZSBvZiB0aGUgbWVzc2FnZSwgaWYgYW55CisgICAgUHJvY2Vzc2luZ1VuaXQgb3duZXIgPSBudWxsOworCisgICAgcHVibGljIEV4Y2VwdGlvbk1lc3NhZ2UoIEV4Y2VwdGlvbiBjYXVzZSwgYm9vbGVhbiB2LCBQcm9jZXNzaW5nVW5pdCBvd25lciApCisgICAgeworICAgICAgICB0aGlzLnZlcmJvc2UgPSB2OworICAgICAgICB0aGlzLmNhdXNlID0gY2F1c2U7CisgICAgICAgIHRoaXMub3duZXIgPSBvd25lcjsKKyAgICB9CisgICAgCisgICAgCisgICAKKyAgIC8qKgorICAgICogIFJldHVybnMgdGhlIHVuZGVybHlpbmcgRXhjZXB0aW9uLgorICAgICovCisKKyAgICBwdWJsaWMgRXhjZXB0aW9uIGdldENhdXNlKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLmNhdXNlOworICAgIH0KKyAgICAKKworCisgICAvKioKKyAgICAqICBXcml0ZXMgb3V0IGEgbmljZWx5IGZvcm1hdHRlZCBzdW1tYXJ5IG9mIHRoZSBleGNlcHRpb24uIAorICAgICovCisgICAgCisgICAgcHVibGljIHZvaWQgd3JpdGUoIFByaW50V3JpdGVyIG91dHB1dCwgSmFuaXRvciBqYW5pdG9yICkKKyAgICB7CisgICAgICAgIFN0cmluZyBkZXNjcmlwdGlvbiA9ICJHZW5lcmFsIGVycm9yIGR1cmluZyAiICsgb3duZXIuZ2V0UGhhc2VEZXNjcmlwdGlvbigpICsgIjogIjsgCisgICAgICAgIAorICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IGNhdXNlLmdldE1lc3NhZ2UoKTsKKyAgICAgICAgaWYoIG1lc3NhZ2UgIT0gbnVsbCApCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dHB1dC5wcmludGxuKCBkZXNjcmlwdGlvbiArIG1lc3NhZ2UgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dHB1dC5wcmludGxuKCBkZXNjcmlwdGlvbiArIGNhdXNlICk7CisgICAgICAgIH0KKyAgICAgICAgb3V0cHV0LnByaW50bG4oKTsKKworICAgICAgICAvL2lmICh2ZXJib3NlKSB7CisgICAgICAgICAgICBjYXVzZS5wcmludFN0YWNrVHJhY2Uob3V0cHV0KTsKKyAgICAgICAgLy99CisgICAgfQorICAgIAorfQorCisKKwpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY29udHJvbC9tZXNzYWdlcy9Mb2NhdGVkTWVzc2FnZS5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY29udHJvbC9tZXNzYWdlcy9Mb2NhdGVkTWVzc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NzljMzAKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9jb250cm9sL21lc3NhZ2VzL0xvY2F0ZWRNZXNzYWdlLmphdmEKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLm1lc3NhZ2VzOworCitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5KYW5pdG9yOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5Tb3VyY2VVbml0OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LkNTVE5vZGU7CisKKworCisvKioKKyAqICBBIGJhc2UgY2xhc3MgZm9yIGNvbXBpbGF0aW9uIG1lc3NhZ2VzLgorICoKKyAqICBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpjcG9pcmllckBkcmVhbWluZy5vcmciPkNocmlzIFBvaXJpZXI8L2E+CisgKgorICogIEB2ZXJzaW9uICRJZCQKKyAqLworCitwdWJsaWMgY2xhc3MgTG9jYXRlZE1lc3NhZ2UgZXh0ZW5kcyBTaW1wbGVNZXNzYWdlCit7CisgICAgcHJvdGVjdGVkIENTVE5vZGUgY29udGV4dDsgIC8vIFRoZSBDU1ROb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBsb2NhdGlvbiB0byB3aGljaCB0aGUgbWVzc2FnZSBhcHBsaWVzCisgICAgCisgICAgcHVibGljIExvY2F0ZWRNZXNzYWdlKCBTdHJpbmcgbWVzc2FnZSwgQ1NUTm9kZSBjb250ZXh0LCBTb3VyY2VVbml0IHNvdXJjZSApIAorICAgIHsKKyAgICAgICAgc3VwZXIoIG1lc3NhZ2UsIHNvdXJjZSApOworICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OworICAgIH0KKyAgICAKKyAgICAKKyAgICBwdWJsaWMgTG9jYXRlZE1lc3NhZ2UoIFN0cmluZyBtZXNzYWdlLCBPYmplY3QgZGF0YSwgQ1NUTm9kZSBjb250ZXh0LCBTb3VyY2VVbml0IHNvdXJjZSApIAorICAgIHsKKyAgICAgICAgc3VwZXIoIG1lc3NhZ2UsIGRhdGEsIHNvdXJjZSApOworICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OworICAgIH0KKyAgICAKKyAgICAKKyAgICBwdWJsaWMgdm9pZCB3cml0ZSggUHJpbnRXcml0ZXIgd3JpdGVyLCBKYW5pdG9yIGphbml0b3IgKQorICAgIHsKKyAgICAgICAgU291cmNlVW5pdCBzb3VyY2UgPSAoU291cmNlVW5pdCkgb3duZXI7CisgICAgICAgIAorICAgICAgICBTdHJpbmcgbmFtZSAgID0gc291cmNlLmdldE5hbWUoKTsKKyAgICAgICAgaW50ICAgIGxpbmUgICA9IGNvbnRleHQuZ2V0U3RhcnRMaW5lKCk7CisgICAgICAgIGludCAgICBjb2x1bW4gPSBjb250ZXh0LmdldFN0YXJ0Q29sdW1uKCk7CisgICAgICAgIFN0cmluZyBzYW1wbGUgPSBzb3VyY2UuZ2V0U2FtcGxlKCBsaW5lLCBjb2x1bW4sIGphbml0b3IgKTsKKyAgICAgICAgCisgICAgICAgIGlmKCBzYW1wbGUgIT0gbnVsbCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCBzb3VyY2UuZ2V0U2FtcGxlKGxpbmUsIGNvbHVtbiwgamFuaXRvcikgKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgd3JpdGVyLnByaW50bG4oIG5hbWUgKyAiOiAiICsgbGluZSArICI6ICIgKyB0aGlzLm1lc3NhZ2UgKTsKKyAgICAgICAgd3JpdGVyLnByaW50bG4oIiIpOworICAgIH0KKyAgICAKK30KKworCisKKwpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY29udHJvbC9tZXNzYWdlcy9NZXNzYWdlLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9jb250cm9sL21lc3NhZ2VzL01lc3NhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzI0NzFiCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY29udHJvbC9tZXNzYWdlcy9NZXNzYWdlLmphdmEKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5tZXNzYWdlczsKKworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuSmFuaXRvcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuUHJvY2Vzc2luZ1VuaXQ7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLlNvdXJjZVVuaXQ7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXguU3ludGF4RXhjZXB0aW9uOworCisKKworLyoqCisgKiAgQSBiYXNlIGNsYXNzIGZvciBjb21waWxhdGlvbiBtZXNzYWdlcy4KKyAqCisgKiAgQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y3BvaXJpZXJAZHJlYW1pbmcub3JnIj5DaHJpcyBQb2lyaWVyPC9hPgorICoKKyAqICBAdmVyc2lvbiAkSWQkCisgKi8KKworcHVibGljIGFic3RyYWN0IGNsYXNzIE1lc3NhZ2UKK3sKKyAgICAKKyAgICAKKyAgIC8qKgorICAgICogIFdyaXRlcyB0aGUgbWVzc2FnZSB0byB0aGUgc3BlY2lmaWVkIFByaW50V3JpdGVyLiAgVGhlIHN1cHBsaWVkCisgICAgKiAgUHJvY2Vzc2luZ1VuaXQgaXMgdGhlIHVuaXQgdGhhdCBob2xkcyB0aGlzIE1lc3NhZ2UuCisgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZSggUHJpbnRXcml0ZXIgd3JpdGVyLCBKYW5pdG9yIGphbml0b3IgKTsKKyAgICAKKyAgICAKKyAgIC8qKgorICAgICogIEEgc3lub255biBmb3Igd3JpdGUoIHdyaXRlciwgb3duZXIsIG51bGwgKS4KKyAgICAqLworICAgIAorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlKCBQcmludFdyaXRlciB3cml0ZXIpCisgICAgeworICAgICAgICB3cml0ZSggd3JpdGVyLCAgbnVsbCApOworICAgIH0KKyAgICAKKyAgICAKKyAgICAKKyAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gRkFDVE9SWSBNRVRIT0RTCisgICAgCisgICAgCisgICAvKioKKyAgICAqICBDcmVhdGVzIGEgbmV3IE1lc3NhZ2UgZnJvbSB0aGUgc3BlY2lmaWVkIHRleHQuCisgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIE1lc3NhZ2UgY3JlYXRlKCBTdHJpbmcgdGV4dCwgUHJvY2Vzc2luZ1VuaXQgb3duZXIgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVNZXNzYWdlKCB0ZXh0LCBvd25lciApOworICAgIH0KKyAgICAKKyAgICAKKyAgICAgICAgICAKKyAgIC8qKgorICAgICogIENyZWF0ZXMgYSBuZXcgTWVzc2FnZSBmcm9tIHRoZSBzcGVjaWZpZWQgdGV4dC4KKyAgICAqLworICAgICAKKyAgICBwdWJsaWMgc3RhdGljIE1lc3NhZ2UgY3JlYXRlKCBTdHJpbmcgdGV4dCwgT2JqZWN0IGRhdGEsIFByb2Nlc3NpbmdVbml0IG93bmVyICApCisgICAgeworICAgICAgICByZXR1cm4gbmV3IFNpbXBsZU1lc3NhZ2UoIHRleHQsIGRhdGEsIG93bmVyKTsKKyAgICB9CisgICAgIAorICAgICAKKyAgICAgICAgICAgCisgICAvKioKKyAgICAqICBDcmVhdGVzIGEgbmV3IE1lc3NhZ2UgZnJvbSB0aGUgc3BlY2lmaWVkIFN5bnRheEV4Y2VwdGlvbi4KKyAgICAqLworICAgICAgCisgICAgcHVibGljIHN0YXRpYyBNZXNzYWdlIGNyZWF0ZSggU3ludGF4RXhjZXB0aW9uIGVycm9yLCBTb3VyY2VVbml0IG93bmVyICkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgU3ludGF4RXJyb3JNZXNzYWdlKCBlcnJvciwgb3duZXIgKTsKKyAgICB9CisgICAgICAKKyAgICAKKyAgICAgIAorICAgIAorfQorCisKKworCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9jb250cm9sL21lc3NhZ2VzL1NpbXBsZU1lc3NhZ2UuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NvbnRyb2wvbWVzc2FnZXMvU2ltcGxlTWVzc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ODUyNGYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9jb250cm9sL21lc3NhZ2VzL1NpbXBsZU1lc3NhZ2UuamF2YQpAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wubWVzc2FnZXM7CisKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLkphbml0b3I7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLlByb2Nlc3NpbmdVbml0OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5Tb3VyY2VVbml0OworCisKKworLyoqCisgKiAgQSBiYXNlIGNsYXNzIGZvciBjb21waWxhdGlvbiBtZXNzYWdlcy4KKyAqCisgKiAgQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y3BvaXJpZXJAZHJlYW1pbmcub3JnIj5DaHJpcyBQb2lyaWVyPC9hPgorICoKKyAqICBAdmVyc2lvbiAkSWQkCisgKi8KKworcHVibGljIGNsYXNzIFNpbXBsZU1lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlCit7CisgICAgcHJvdGVjdGVkIFN0cmluZyBtZXNzYWdlOyAgLy8gTWVzc2FnZSB0ZXh0CisgICAgcHJvdGVjdGVkIE9iamVjdCBkYXRhOyAgICAgLy8gRGF0YSwgd2hlbiB0aGUgbWVzc2FnZSB0ZXh0IGlzIGFuIEkxOE4gaWRlbnRpZmllcgorICAgIHByb3RlY3RlZCBQcm9jZXNzaW5nVW5pdCBvd25lcjsKKyAgICAKKyAgICBwdWJsaWMgU2ltcGxlTWVzc2FnZSggU3RyaW5nIG1lc3NhZ2UsIFByb2Nlc3NpbmdVbml0IHNvdXJjZSApIAorICAgIHsKKyAgICAgICAgdGhpcyggbWVzc2FnZSwgbnVsbCwgc291cmNlICk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBTaW1wbGVNZXNzYWdlKCBTdHJpbmcgbWVzc2FnZSwgT2JqZWN0IGRhdGEsIFByb2Nlc3NpbmdVbml0IHNvdXJjZSApCisgICAgeworICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworICAgICAgICB0aGlzLmRhdGEgICAgPSBudWxsOworICAgICAgICB0aGlzLm93bmVyID0gc291cmNlOworICAgIH0KKyAgICAKKyAgICAKKyAgICBwdWJsaWMgdm9pZCB3cml0ZSggUHJpbnRXcml0ZXIgd3JpdGVyLCBKYW5pdG9yIGphbml0b3IgKQorICAgIHsKKyAgICAgICAgaWYoIG93bmVyIGluc3RhbmNlb2YgU291cmNlVW5pdCApCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKChTb3VyY2VVbml0KW93bmVyKS5nZXROYW1lKCk7CisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbiggIiIgKyBuYW1lICsgIjogIiArIG1lc3NhZ2UgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCBtZXNzYWdlICk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBtZXNzYWdlOworICAgIH0KKyAgICAKK30KKworCisKKwpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY29udHJvbC9tZXNzYWdlcy9TeW50YXhFcnJvck1lc3NhZ2UuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NvbnRyb2wvbWVzc2FnZXMvU3ludGF4RXJyb3JNZXNzYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk0NWE5MQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NvbnRyb2wvbWVzc2FnZXMvU3ludGF4RXJyb3JNZXNzYWdlLmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5tZXNzYWdlczsKKworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuSmFuaXRvcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuU291cmNlVW5pdDsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5TeW50YXhFeGNlcHRpb247CisKKy8qKgorICogQSBjbGFzcyBmb3IgZXJyb3IgbWVzc2FnZXMgcHJvZHVjZWQgYnkgdGhlIHBhcnNlciBzeXN0ZW0uCisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y3BvaXJpZXJAZHJlYW1pbmcub3JnIj5DaHJpcyBQb2lyaWVyPC9hPgorICogQHZlcnNpb24gJElkJAorICovCisKK3B1YmxpYyBjbGFzcyBTeW50YXhFcnJvck1lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIHsKKyAgICBwcm90ZWN0ZWQgU3ludGF4RXhjZXB0aW9uIGNhdXNlOworICAgIHByb3RlY3RlZCBTb3VyY2VVbml0IHNvdXJjZTsKKyAgICAKKyAgICBwdWJsaWMgU3ludGF4RXJyb3JNZXNzYWdlKFN5bnRheEV4Y2VwdGlvbiBjYXVzZSwgU291cmNlVW5pdCBzb3VyY2UpIHsKKyAgICAgICAgdGhpcy5jYXVzZSA9IGNhdXNlOworICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTsKKyAgICAgICAgY2F1c2Uuc2V0U291cmNlTG9jYXRvcihzb3VyY2UuZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIFN5bnRheEV4Y2VwdGlvbi4KKyAgICAgKi8KKworICAgIHB1YmxpYyBTeW50YXhFeGNlcHRpb24gZ2V0Q2F1c2UoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmNhdXNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyBvdXQgYSBuaWNlbHkgZm9ybWF0dGVkIHN1bW1hcnkgb2YgdGhlIHN5bnRheCBlcnJvci4KKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlKFByaW50V3JpdGVyIG91dHB1dCwgSmFuaXRvciBqYW5pdG9yKSB7CisgICAgICAgIFN0cmluZyBuYW1lID0gc291cmNlLmdldE5hbWUoKTsKKyAgICAgICAgaW50IGxpbmUgPSBnZXRDYXVzZSgpLmdldFN0YXJ0TGluZSgpOworICAgICAgICBpbnQgY29sdW1uID0gZ2V0Q2F1c2UoKS5nZXRTdGFydENvbHVtbigpOworICAgICAgICBTdHJpbmcgc2FtcGxlID0gc291cmNlLmdldFNhbXBsZShsaW5lLCBjb2x1bW4sIGphbml0b3IpOworCisgICAgICAgIG91dHB1dC5wcmludChuYW1lICsgIjogIiArIGxpbmUgKyAiOiAiICsgZ2V0Q2F1c2UoKS5nZXRNZXNzYWdlKCkpOworICAgICAgICBpZiAoc2FtcGxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG91dHB1dC5wcmludGxuKCk7CisgICAgICAgICAgICBvdXRwdXQucHJpbnQoc2FtcGxlKTsKKyAgICAgICAgICAgIG91dHB1dC5wcmludGxuKCk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NvbnRyb2wvbWVzc2FnZXMvV2FybmluZ01lc3NhZ2UuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NvbnRyb2wvbWVzc2FnZXMvV2FybmluZ01lc3NhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmNmZDIxCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY29udHJvbC9tZXNzYWdlcy9XYXJuaW5nTWVzc2FnZS5qYXZhCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wubWVzc2FnZXM7CisKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLkphbml0b3I7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLlNvdXJjZVVuaXQ7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXguQ1NUTm9kZTsKKworCisKKy8qKgorICogIEEgY2xhc3MgZm9yIHdhcm5pbmcgbWVzc2FnZXMuCisgKgorICogIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNwb2lyaWVyQGRyZWFtaW5nLm9yZyI+Q2hyaXMgUG9pcmllcjwvYT4KKyAqCisgKiAgQHZlcnNpb24gJElkJAorICovCisKK3B1YmxpYyBjbGFzcyBXYXJuaW5nTWVzc2FnZSBleHRlbmRzIExvY2F0ZWRNZXNzYWdlCit7CisgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIFdBUk5JTkcgTEVWRUxTCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT05FICAgICAgICAgICAgPSAwOyAgLy8gRm9yIHF1ZXJ5aW5nLCBpZ25vcmUgYWxsIGVycm9ycworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExJS0VMWV9FUlJPUlMgICA9IDE7ICAvLyBXYXJuaW5nIGluZGljYXRlcyBsaWtlbHkgZXJyb3IKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT1NTSUJMRV9FUlJPUlMgPSAyOyAgLy8gV2FybmluZyBpbmRpY2F0ZXMgcG9zc2libGUgZXJyb3IKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVJBTk9JQSAgICAgICAgPSAzOyAgLy8gV2FybmluZyBpbmRpY2F0ZXMgcGFyYW5vaWEgb24gdGhlIHBhcnQgb2YgdGhlIGNvbXBpbGVyCisgICAgCisgICAgCisgICAvKioKKyAgICAqICBSZXR1cm5zIHRydWUgaWYgYSB3YXJuaW5nIHdvdWxkIGJlIHJlbGV2YW50IHRvIHRoZSBzcGVjaWZpZWQgbGV2ZWwuCisgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWxldmFudCggaW50IGFjdHVhbCwgaW50IGxpbWl0ICkKKyAgICB7CisgICAgICAgIHJldHVybiBhY3R1YWwgPD0gbGltaXQ7CisgICAgfQorICAgIAorICAgIAorICAgIAorICAgLyoqCisgICAgKiAgUmV0dXJucyB0cnVlIGlmIHRoaXMgbWVzc2FnZSBpcyBhcyBvciBtb3JlIGltcG9ydGFudCB0aGFuIHRoZSAKKyAgICAqICBzcGVjaWZpZWQgaW1wb3J0YW5jZSBsZXZlbC4KKyAgICAqLworICAgIAorICAgIHB1YmxpYyBib29sZWFuIGlzUmVsZXZhbnQoIGludCBpbXBvcnRhbmNlICkKKyAgICB7CisgICAgICAgIHJldHVybiBpc1JlbGV2YW50KCB0aGlzLmltcG9ydGFuY2UsIGltcG9ydGFuY2UgKTsKKyAgICB9CisgICAgCisgICAgCisgICAgCisgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIENPTlNUUlVDVElPTiBBTkQgREFUQSBBQ0NFU1MKKworICAgIHByaXZhdGUgaW50IGltcG9ydGFuY2U7ICAvLyBUaGUgd2FybmluZyBsZXZlbCwgZm9yIGZpbHRlcmluZworICAgIAorICAgIAorICAgLyoqCisgICAgKiAgQ3JlYXRlcyBhIG5ldyB3YXJuaW5nIG1lc3NhZ2UuCisgICAgKiAKKyAgICAqICBAcGFyYW0gaW1wb3J0YW5jZSB0aGUgd2FybmluZyBsZXZlbCAKKyAgICAqICBAcGFyYW0gbWVzc2FnZSAgICB0aGUgbWVzc2FnZSB0ZXh0CisgICAgKiAgQHBhcmFtIGNvbnRleHQgICAgY29udGV4dCBpbmZvcm1hdGlvbiBmb3IgbG9jYXRpbmcgdGhlIG9mZmVuZGluZyBzb3VyY2UgdGV4dAorICAgICovCisgICAgIAorICAgIHB1YmxpYyBXYXJuaW5nTWVzc2FnZSggaW50IGltcG9ydGFuY2UsIFN0cmluZyBtZXNzYWdlLCBDU1ROb2RlIGNvbnRleHQsIFNvdXJjZVVuaXQgb3duZXIgKQorICAgIHsKKyAgICAgICAgc3VwZXIoIG1lc3NhZ2UsIGNvbnRleHQsIG93bmVyICk7CisgICAgICAgIHRoaXMuaW1wb3J0YW5jZSA9IGltcG9ydGFuY2U7CisgICAgfQorCisgICAgCisgICAgCisgICAvKioKKyAgICAqICBDcmVhdGVzIGEgbmV3IHdhcm5pbmcgbWVzc2FnZS4KKyAgICAqCisgICAgKiAgQHBhcmFtIGltcG9ydGFuY2UgdGhlIHdhcm5pbmcgbGV2ZWwgCisgICAgKiAgQHBhcmFtIG1lc3NhZ2UgICAgdGhlIG1lc3NhZ2UgdGV4dAorICAgICogIEBwYXJhbSBkYXRhICAgICAgIGFkZGl0aW9uYWwgZGF0YSBuZWVkZWQgd2hlbiBnZW5lcmF0aW5nIHRoZSBtZXNzYWdlCisgICAgKiAgQHBhcmFtIGNvbnRleHQgICAgY29udGV4dCBpbmZvcm1hdGlvbiBmb3IgbG9jYXRpbmcgdGhlIG9mZmVuZGluZyBzb3VyY2UgdGV4dAorICAgICovCisgICAgIAorICAgIHB1YmxpYyBXYXJuaW5nTWVzc2FnZSggaW50IGltcG9ydGFuY2UsIFN0cmluZyBtZXNzYWdlLCBPYmplY3QgZGF0YSwgQ1NUTm9kZSBjb250ZXh0LCBTb3VyY2VVbml0IG93bmVyICkKKyAgICB7CisgICAgICAgIHN1cGVyKCBtZXNzYWdlLCBkYXRhLCBjb250ZXh0LCBvd25lciApOworICAgICAgICB0aGlzLmltcG9ydGFuY2UgPSBpbXBvcnRhbmNlOworICAgIH0KKyAgICAKKyAgICAKKyAgICBwdWJsaWMgdm9pZCB3cml0ZSggUHJpbnRXcml0ZXIgd3JpdGVyLCBKYW5pdG9yIGphbml0b3IgKQorICAgIHsKKyAgICAgICAgd3JpdGVyLnByaW50KCAid2FybmluZzogIiApOworICAgICAgICBzdXBlci53cml0ZSggd3JpdGVyLCBqYW5pdG9yICk7CisgICAgfQorCisgICAgIAorICAgICAKK30KKworCisKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NvbnRyb2wvbWVzc2FnZXMvcGFja2FnZS5odG1sIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvY29udHJvbC9tZXNzYWdlcy9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYyZDRlYgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NvbnRyb2wvbWVzc2FnZXMvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsOCBAQAorPGh0bWw+CisgIDxoZWFkPgorICAgIDx0aXRsZT5wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5tZXNzYWdlcy4qPC90aXRsZT4KKyAgPC9oZWFkPgorICA8Ym9keT4KKyAgICA8cD5FcnJvciBtZXNzYWdlIGNsYXNzZXMuPC9wPgorICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9jb250cm9sL3BhY2thZ2UuaHRtbCBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NvbnRyb2wvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MTU3NGEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9jb250cm9sL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDggQEAKKzxodG1sPgorICA8aGVhZD4KKyAgICA8dGl0bGU+cGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuKjwvdGl0bGU+CisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgPHA+Q29tcGlsZXIgY29udHJvbCBjbGFzc2VzLjwvcD4KKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3Jvb3Z5ZG9jL0dyb292eUNsYXNzRG9jLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ncm9vdnlkb2MvR3Jvb3Z5Q2xhc3NEb2MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjBlMmNiCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3Jvb3Z5ZG9jL0dyb292eUNsYXNzRG9jLmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3Jvb3Z5ZG9jOworCitwdWJsaWMgaW50ZXJmYWNlIEdyb292eUNsYXNzRG9jIGV4dGVuZHMgR3Jvb3Z5VHlwZSwgR3Jvb3Z5UHJvZ3JhbUVsZW1lbnREb2N7CisgICAgR3Jvb3Z5Q29uc3RydWN0b3JEb2NbXSBjb25zdHJ1Y3RvcnMoKTsKKyAgICBHcm9vdnlDb25zdHJ1Y3RvckRvY1tdIGNvbnN0cnVjdG9ycyhib29sZWFuIGZpbHRlcik7CisgICAgYm9vbGVhbiBkZWZpbmVzU2VyaWFsaXphYmxlRmllbGRzKCk7CisgICAgR3Jvb3Z5RmllbGREb2NbXSBlbnVtQ29uc3RhbnRzKCk7CisgICAgR3Jvb3Z5RmllbGREb2NbXSBmaWVsZHMoKTsKKyAgICBHcm9vdnlGaWVsZERvY1tdIGZpZWxkcyhib29sZWFuIGZpbHRlcik7CisgICAgR3Jvb3Z5Q2xhc3NEb2MgZmluZENsYXNzKFN0cmluZyBjbGFzc05hbWUpOworICAgIEdyb292eUNsYXNzRG9jW10gaW1wb3J0ZWRDbGFzc2VzKCk7CisgICAgR3Jvb3Z5UGFja2FnZURvY1tdIGltcG9ydGVkUGFja2FnZXMoKTsKKyAgICBHcm9vdnlDbGFzc0RvY1tdIGlubmVyQ2xhc3NlcygpOyAvLyBub3Qgc3VwcG9ydGVkIGluIGdyb292eQorICAgIEdyb292eUNsYXNzRG9jW10gaW5uZXJDbGFzc2VzKGJvb2xlYW4gZmlsdGVyKTsgLy8gbm90IHN1cHBvcnRlZCBpbiBncm9vdnkKKyAgICBHcm9vdnlDbGFzc0RvY1tdIGludGVyZmFjZXMoKTsKKyAgICBHcm9vdnlUeXBlW10gaW50ZXJmYWNlVHlwZXMoKTsKKyAgICBib29sZWFuIGlzQWJzdHJhY3QoKTsKKyAgICBib29sZWFuIGlzRXh0ZXJuYWxpemFibGUoKTsKKyAgICBib29sZWFuIGlzU2VyaWFsaXphYmxlKCk7CisgICAgR3Jvb3Z5TWV0aG9kRG9jW10gbWV0aG9kcygpOworICAgIEdyb292eU1ldGhvZERvY1tdIG1ldGhvZHMoYm9vbGVhbiBmaWx0ZXIpOworICAgIEdyb292eUZpZWxkRG9jW10gc2VyaWFsaXphYmxlRmllbGRzKCk7CisgICAgR3Jvb3Z5TWV0aG9kRG9jW10gc2VyaWFsaXphdGlvbk1ldGhvZHMoKTsKKyAgICBib29sZWFuIHN1YmNsYXNzT2YoR3Jvb3Z5Q2xhc3NEb2MgZ2NkKTsKKyAgICBHcm9vdnlDbGFzc0RvYyBzdXBlcmNsYXNzKCk7CisgICAgR3Jvb3Z5VHlwZSBzdXBlcmNsYXNzVHlwZSgpOworLy8gICAgR3Jvb3Z5VHlwZVZhcmlhYmxlW10gdHlwZVBhcmFtZXRlcnMoKTsgLy8gbm90IHN1cHBvcnRlZCBpbiBncm9vdnkKKy8vICAgIEdyb292eVBhcmFtVGFnW10gdHlwZVBhcmFtVGFncygpOyAvLyBub3Qgc3VwcG9ydGVkIGluIGdyb292eQorCisKKyAgICBTdHJpbmcgZ2V0RnVsbFBhdGhOYW1lKCk7IC8vIG5vdCBpbiBKYXZhIERvY2xldCBBUEkKKyAgICBTdHJpbmcgZ2V0UmVsYXRpdmVSb290UGF0aCgpOyAvLyBub3QgaW4gSmF2YSBEb2NsZXQgQVBJCQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3Jvb3Z5ZG9jL0dyb292eUNvbnN0cnVjdG9yRG9jLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ncm9vdnlkb2MvR3Jvb3Z5Q29uc3RydWN0b3JEb2MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2EzZTg2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3Jvb3Z5ZG9jL0dyb292eUNvbnN0cnVjdG9yRG9jLmphdmEKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncm9vdnlkb2M7CisKK3B1YmxpYyBpbnRlcmZhY2UgR3Jvb3Z5Q29uc3RydWN0b3JEb2MgZXh0ZW5kcyBHcm9vdnlFeGVjdXRhYmxlTWVtYmVyRG9jIHsKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyb292eWRvYy9Hcm9vdnlEb2MuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyb292eWRvYy9Hcm9vdnlEb2MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWZjYzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3Jvb3Z5ZG9jL0dyb292eURvYy5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5Lmdyb292eWRvYzsKKworcHVibGljIGludGVyZmFjZSBHcm9vdnlEb2MgZXh0ZW5kcyBDb21wYXJhYmxlIHsKKworICAgIFN0cmluZyBjb21tZW50VGV4dCgpOworLy8gICAgR3Jvb3Z5VGFnW10gZmlyc3RTZW50ZW5jZVRhZ3MoKTsKKyAgICBTdHJpbmcgZ2V0UmF3Q29tbWVudFRleHQoKTsKKy8vICAgIEdyb292eVRhZ1tdIGlubGluZVRhZ3MoKTsKKyAgICBib29sZWFuIGlzQW5ub3RhdGlvblR5cGUoKTsKKyAgICBib29sZWFuIGlzQW5ub3RhdGlvblR5cGVFbGVtZW50KCk7CisgICAgYm9vbGVhbiBpc0NsYXNzKCk7CisgICAgYm9vbGVhbiBpc0NvbnN0cnVjdG9yKCk7CisgICAgYm9vbGVhbiBpc0VudW0oKTsKKyAgICBib29sZWFuIGlzRW51bUNvbnN0YW50KCk7CisgICAgYm9vbGVhbiBpc0Vycm9yKCk7CisgICAgYm9vbGVhbiBpc0V4Y2VwdGlvbigpOworICAgIGJvb2xlYW4gaXNGaWVsZCgpOworICAgIGJvb2xlYW4gaXNJbmNsdWRlZCgpOworICAgIGJvb2xlYW4gaXNJbnRlcmZhY2UoKTsKKyAgICBib29sZWFuIGlzTWV0aG9kKCk7CisgICAgYm9vbGVhbiBpc09yZGluYXJ5Q2xhc3MoKTsKKyAgICBTdHJpbmcgbmFtZSgpOworLy8gICAgR3Jvb3Z5U291cmNlUG9zaXRpb24gcG9zaXRpb24oKTsKKy8vICAgIEdyb292eVNlZVRhZ1tdIHNlZVRhZ3MoKTsKKyAgICB2b2lkIHNldFJhd0NvbW1lbnRUZXh0KFN0cmluZyBhcmcwKTsKKy8vICAgIEdyb292eVRhZ1tdIHRhZ3MoKTsKKy8vICAgIEdyb292eVRhZ1tdIHRhZ3MoU3RyaW5nIGFyZzApOworCQorICAgIFN0cmluZyBmaXJzdFNlbnRlbmNlQ29tbWVudFRleHQoKTsKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyb292eWRvYy9Hcm9vdnlEb2NFcnJvclJlcG9ydGVyLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ncm9vdnlkb2MvR3Jvb3Z5RG9jRXJyb3JSZXBvcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MjI0YjUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ncm9vdnlkb2MvR3Jvb3Z5RG9jRXJyb3JSZXBvcnRlci5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3Jvb3Z5ZG9jOworCitwdWJsaWMgaW50ZXJmYWNlIEdyb292eURvY0Vycm9yUmVwb3J0ZXJ7CisgICAgdm9pZCBwcmludEVycm9yKFN0cmluZyBhcmcwKTsKKy8vICAgIHZvaWQgcHJpbnRFcnJvcihHcm9vdnlTb3VyY2VQb3NpdGlvbiBhcmcwLCBTdHJpbmcgYXJnMSk7CisgICAgdm9pZCBwcmludE5vdGljZShTdHJpbmcgYXJnMCk7CisvLyAgICB2b2lkIHByaW50Tm90aWNlKEdyb292eVNvdXJjZVBvc2l0aW9uIGFyZzAsIFN0cmluZyBhcmcxKTsKKyAgICB2b2lkIHByaW50V2FybmluZyhTdHJpbmcgYXJnMCk7CisvLyAgICB2b2lkIHByaW50V2FybmluZyhHcm9vdnlTb3VyY2VQb3NpdGlvbiBhcmcwLCBTdHJpbmcgYXJnMSk7Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ncm9vdnlkb2MvR3Jvb3Z5RXhlY3V0YWJsZU1lbWJlckRvYy5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3Jvb3Z5ZG9jL0dyb292eUV4ZWN1dGFibGVNZW1iZXJEb2MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzc1MWRmCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3Jvb3Z5ZG9jL0dyb292eUV4ZWN1dGFibGVNZW1iZXJEb2MuamF2YQpAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncm9vdnlkb2M7CisKK3B1YmxpYyBpbnRlcmZhY2UgR3Jvb3Z5RXhlY3V0YWJsZU1lbWJlckRvYyBleHRlbmRzIEdyb292eU1lbWJlckRvYyB7CisgICAgU3RyaW5nIGZsYXRTaWduYXR1cmUoKTsKKyAgICBib29sZWFuIGlzTmF0aXZlKCk7CisgICAgYm9vbGVhbiBpc1N5bmNocm9uaXplZCgpOworICAgIGJvb2xlYW4gaXNWYXJBcmdzKCk7CisvLyAgICBHcm9vdnlQYXJhbWV0ZXJbXSBwYXJhbWV0ZXJzKCk7CisvLyAgICBHcm9vdnlQYXJhbVRhZ1tdIHBhcmFtVGFncygpOworICAgIFN0cmluZyBzaWduYXR1cmUoKTsKKyAgICBHcm9vdnlDbGFzc0RvY1tdIHRocm93bkV4Y2VwdGlvbnMoKTsKKyAgICBHcm9vdnlUeXBlW10gdGhyb3duRXhjZXB0aW9uVHlwZXMoKTsKKy8vICAgIEdyb292eVRocm93c1RhZ1tdIHRocm93c1RhZ3MoKTsKKy8vICAgIEdyb292eVR5cGVWYXJpYWJsZVtdIHR5cGVQYXJhbWV0ZXJzKCk7CisvLyAgICBHcm9vdnlQYXJhbVRhZ1tdIHR5cGVQYXJhbVRhZ3MoKTsKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyb292eWRvYy9Hcm9vdnlGaWVsZERvYy5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3Jvb3Z5ZG9jL0dyb292eUZpZWxkRG9jLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY4MDE4YQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyb292eWRvYy9Hcm9vdnlGaWVsZERvYy5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5Lmdyb292eWRvYzsKKworCitwdWJsaWMgaW50ZXJmYWNlIEdyb292eUZpZWxkRG9jIGV4dGVuZHMgR3Jvb3Z5TWVtYmVyRG9jIHsKKyAgICBPYmplY3QgY29uc3RhbnRWYWx1ZSgpOworICAgIFN0cmluZyBjb25zdGFudFZhbHVlRXhwcmVzc2lvbigpOworICAgIGJvb2xlYW4gaXNUcmFuc2llbnQoKTsKKyAgICBib29sZWFuIGlzVm9sYXRpbGUoKTsKKy8vICAgIEdyb292eVNlcmlhbEZpZWxkVGFnW10gc2VyaWFsRmllbGRUYWdzKCk7CisgICAgR3Jvb3Z5VHlwZSB0eXBlKCk7Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ncm9vdnlkb2MvR3Jvb3Z5TWVtYmVyRG9jLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ncm9vdnlkb2MvR3Jvb3Z5TWVtYmVyRG9jLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMxMTA3YgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyb292eWRvYy9Hcm9vdnlNZW1iZXJEb2MuamF2YQpAQCAtMCwwICsxLDIwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncm9vdnlkb2M7CisKK3B1YmxpYyBpbnRlcmZhY2UgR3Jvb3Z5TWVtYmVyRG9jIGV4dGVuZHMgR3Jvb3Z5UHJvZ3JhbUVsZW1lbnREb2N7CisgICAgYm9vbGVhbiBpc1N5bnRoZXRpYygpOworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3Jvb3Z5ZG9jL0dyb292eU1ldGhvZERvYy5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3Jvb3Z5ZG9jL0dyb292eU1ldGhvZERvYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NmRmYTEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ncm9vdnlkb2MvR3Jvb3Z5TWV0aG9kRG9jLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3Jvb3Z5ZG9jOworCitwdWJsaWMgaW50ZXJmYWNlIEdyb292eU1ldGhvZERvYyBleHRlbmRzIEdyb292eUV4ZWN1dGFibGVNZW1iZXJEb2MgeworICAgIGJvb2xlYW4gaXNBYnN0cmFjdCgpOworICAgIEdyb292eUNsYXNzRG9jIG92ZXJyaWRkZW5DbGFzcygpOworICAgIEdyb292eU1ldGhvZERvYyBvdmVycmlkZGVuTWV0aG9kKCk7CisgICAgR3Jvb3Z5VHlwZSBvdmVycmlkZGVuVHlwZSgpOworICAgIGJvb2xlYW4gb3ZlcnJpZGVzKEdyb292eU1ldGhvZERvYyBhcmcwKTsKKyAgICBHcm9vdnlUeXBlIHJldHVyblR5cGUoKTsKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyb292eWRvYy9Hcm9vdnlQYWNrYWdlRG9jLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ncm9vdnlkb2MvR3Jvb3Z5UGFja2FnZURvYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMWJhMGMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ncm9vdnlkb2MvR3Jvb3Z5UGFja2FnZURvYy5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3Jvb3Z5ZG9jOworCitwdWJsaWMgaW50ZXJmYWNlIEdyb292eVBhY2thZ2VEb2MgZXh0ZW5kcyBHcm9vdnlEb2MgeworICAgIEdyb292eUNsYXNzRG9jW10gYWxsQ2xhc3NlcygpOworICAgIEdyb292eUNsYXNzRG9jW10gYWxsQ2xhc3Nlcyhib29sZWFuIGFyZzApOworLy8gICAgR3Jvb3Z5QW5ub3RhdGlvblR5cGVEb2NbXSBhbm5vdGF0aW9uVHlwZXMoKTsKKy8vICAgIEdyb292eUFubm90YXRpb25EZXNjW10gYW5ub3RhdGlvbnMoKTsKKyAgICBHcm9vdnlDbGFzc0RvY1tdIGVudW1zKCk7CisgICAgR3Jvb3Z5Q2xhc3NEb2NbXSBlcnJvcnMoKTsKKyAgICBHcm9vdnlDbGFzc0RvY1tdIGV4Y2VwdGlvbnMoKTsKKyAgICBHcm9vdnlDbGFzc0RvYyBmaW5kQ2xhc3MoU3RyaW5nIGFyZzApOworICAgIEdyb292eUNsYXNzRG9jW10gaW50ZXJmYWNlcygpOworICAgIEdyb292eUNsYXNzRG9jW10gb3JkaW5hcnlDbGFzc2VzKCk7CisJCisgICAgU3RyaW5nIG5hbWVXaXRoRG90cygpOyAvLyBub3QgaW4gSmF2YURvYyBBUEkKKyAgICBTdHJpbmcgZ2V0UmVsYXRpdmVSb290UGF0aCgpOyAvLyBub3QgaW4gSmF2YURvYyBBUEkKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyb292eWRvYy9Hcm9vdnlQYXJhbWV0ZXIuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyb292eWRvYy9Hcm9vdnlQYXJhbWV0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDE2MDlkCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3Jvb3Z5ZG9jL0dyb292eVBhcmFtZXRlci5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5Lmdyb292eWRvYzsKKworcHVibGljIGludGVyZmFjZSBHcm9vdnlQYXJhbWV0ZXJ7CisvLwlHcm9vdnlBbm5vdGF0aW9uRGVzY1tdIGFubm90YXRpb25zKCk7CisJU3RyaW5nIG5hbWUoKTsKKwlHcm9vdnlUeXBlIHR5cGUoKTsKKwlTdHJpbmcgdHlwZU5hbWUoKTsKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyb292eWRvYy9Hcm9vdnlQcm9ncmFtRWxlbWVudERvYy5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3Jvb3Z5ZG9jL0dyb292eVByb2dyYW1FbGVtZW50RG9jLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFjOWViOAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyb292eWRvYy9Hcm9vdnlQcm9ncmFtRWxlbWVudERvYy5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5Lmdyb292eWRvYzsKKworcHVibGljIGludGVyZmFjZSBHcm9vdnlQcm9ncmFtRWxlbWVudERvYyBleHRlbmRzIEdyb292eURvYyB7CisKKy8vICAgIEdyb292eUFubm90YXRpb25EZXNjW10gYW5ub3RhdGlvbnMoKTsKKworICAgIEdyb292eUNsYXNzRG9jIGNvbnRhaW5pbmdDbGFzcygpOworCisgICAgR3Jvb3Z5UGFja2FnZURvYyBjb250YWluaW5nUGFja2FnZSgpOworCisgICAgYm9vbGVhbiBpc0ZpbmFsKCk7CisKKyAgICBib29sZWFuIGlzUGFja2FnZVByaXZhdGUoKTsKKworICAgIGJvb2xlYW4gaXNQcml2YXRlKCk7CisKKyAgICBib29sZWFuIGlzUHJvdGVjdGVkKCk7CisKKyAgICBib29sZWFuIGlzUHVibGljKCk7CisKKyAgICBib29sZWFuIGlzU3RhdGljKCk7CisKKyAgICBTdHJpbmcgbW9kaWZpZXJzKCk7CisKKyAgICBpbnQgbW9kaWZpZXJTcGVjaWZpZXIoKTsKKworICAgIFN0cmluZyBxdWFsaWZpZWROYW1lKCk7Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ncm9vdnlkb2MvR3Jvb3Z5Um9vdERvYy5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3Jvb3Z5ZG9jL0dyb292eVJvb3REb2MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODcyYmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3Jvb3Z5ZG9jL0dyb292eVJvb3REb2MuamF2YQpAQCAtMCwwICsxLDI2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5Lmdyb292eWRvYzsKKworcHVibGljIGludGVyZmFjZSBHcm9vdnlSb290RG9jIGV4dGVuZHMgR3Jvb3Z5RG9jLCBHcm9vdnlEb2NFcnJvclJlcG9ydGVyIHsKKwlHcm9vdnlDbGFzc0RvYyBjbGFzc05hbWVkKFN0cmluZyBhcmcwKTsKKwlHcm9vdnlDbGFzc0RvY1tdIGNsYXNzZXMoKTsKKwlTdHJpbmdbXVtdIG9wdGlvbnMoKTsKKwlHcm9vdnlQYWNrYWdlRG9jIHBhY2thZ2VOYW1lZChTdHJpbmcgYXJnMCk7CisJR3Jvb3Z5Q2xhc3NEb2NbXSBzcGVjaWZpZWRDbGFzc2VzKCk7CisJR3Jvb3Z5UGFja2FnZURvY1tdIHNwZWNpZmllZFBhY2thZ2VzKCk7Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ncm9vdnlkb2MvR3Jvb3Z5VHlwZS5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3Jvb3Z5ZG9jL0dyb292eVR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzA3ZWIyCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3Jvb3Z5ZG9jL0dyb292eVR5cGUuamF2YQpAQCAtMCwwICsxLDI5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncm9vdnlkb2M7CisKK3B1YmxpYyBpbnRlcmZhY2UgR3Jvb3Z5VHlwZSB7CisvLwlHcm9vdnlBbm5vdGF0aW9uVHlwZURvYyBhc0Fubm90YXRpb25UeXBlRG9jKCk7CisJR3Jvb3Z5Q2xhc3NEb2MgYXNDbGFzc0RvYygpOworLy8JR3Jvb3Z5UGFyYW1ldGVyaXplZFR5cGUgYXNQYXJhbWV0ZXJpemVkVHlwZSgpOworLy8JR3Jvb3Z5VHlwZVZhcmlhYmxlIGFzVHlwZVZhcmlhYmxlKCk7CisvLwlHcm9vdnlXaWxkY2FyZFR5cGUgYXNXaWxkY2FyZFR5cGUoKTsKKwlTdHJpbmcgZGltZW5zaW9uKCk7CisJYm9vbGVhbiBpc1ByaW1pdGl2ZSgpOworCVN0cmluZyBxdWFsaWZpZWRUeXBlTmFtZSgpOworCVN0cmluZyBzaW1wbGVUeXBlTmFtZSgpOworCVN0cmluZyB0eXBlTmFtZSgpOworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvZ3Jvb3Z5ZG9jL3BhY2thZ2UuaHRtbCBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyb292eWRvYy9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRhNTA0YgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2dyb292eWRvYy9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSw4IEBACis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPHRpdGxlPnBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ncm9vdnlkb2MuKjwvdGl0bGU+CisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgPHA+R3Jvb3Z5RG9jIGludGVybmFsIGNsYXNzZXMuPC9wPgorICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9wYWNrYWdlLmh0bWwgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJiZDdmYwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDggQEAKKzxodG1sPgorICA8aGVhZD4KKyAgICA8dGl0bGU+cGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5Lio8L3RpdGxlPgorICA8L2hlYWQ+CisgIDxib2R5PgorICAgIDxwPkdyb292eSBMYW5ndWFnZSBmb3IgdGhlIEpWTTwvcD4KKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcmVmbGVjdGlvbi9DYWNoZWRDbGFzcy5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcmVmbGVjdGlvbi9DYWNoZWRDbGFzcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ODU0MDAKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9yZWZsZWN0aW9uL0NhY2hlZENsYXNzLmphdmEKQEAgLTAsMCArMSw0MTcgQEAKKy8qDQorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJlZmxlY3Rpb247DQorDQoraW1wb3J0IGdyb292eS5sYW5nLkdTdHJpbmc7DQoraW1wb3J0IGdyb292eS5sYW5nLk1ldGFNZXRob2Q7DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW4uQnl0ZWNvZGVIZWxwZXI7DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5SZWZsZWN0b3I7DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS50eXBlaGFuZGxpbmcuRGVmYXVsdFR5cGVUcmFuc2Zvcm1hdGlvbjsNCisNCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7DQoraW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOw0KK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7DQoraW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOw0KK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsNCitpbXBvcnQgamF2YS51dGlsLio7DQoraW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsNCitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOw0KKw0KKy8qKg0KKyAqIEBhdXRob3IgQWxleC5Ua2FjaG1hbg0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDYWNoZWRDbGFzcyB7DQorICAgIHByaXZhdGUgQ2FjaGVkQ2xhc3MgY2FjaGVkU3VwZXJDbGFzczsNCisNCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWV0YU1ldGhvZFtdIEVNUFRZID0gbmV3IE1ldGFNZXRob2RbMF07DQorDQorICAgIGludCBoYXNoQ29kZTsNCisNCisgICAgcHJpdmF0ZSBSZWZsZWN0b3IgcmVmbGVjdG9yOw0KKw0KKyAgICBwcml2YXRlIENhY2hlZEZpZWxkW10gZmllbGRzOw0KKyAgICBwcml2YXRlIENhY2hlZENvbnN0cnVjdG9yW10gY29uc3RydWN0b3JzOw0KKyAgICBwcml2YXRlIENhY2hlZE1ldGhvZFtdIG1ldGhvZHM7DQorICAgIHByaXZhdGUgZmluYWwgQ2xhc3MgY2FjaGVkQ2xhc3M7DQorICAgIHByaXZhdGUgTWV0YU1ldGhvZFtdIG5ld01ldGFNZXRob2RzID0gRU1QVFk7DQorICAgIHB1YmxpYyAgQ2FjaGVkTWV0aG9kIFtdIG1vcE1ldGhvZHM7DQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ2FjaGVkQ2xhc3NbXSBFTVBUWV9BUlJBWSA9IG5ldyBDYWNoZWRDbGFzc1swXTsNCisNCisgICAgcHVibGljIFNldCBnZXRJbnRlcmZhY2VzKCkgew0KKyAgICAgICAgaWYgKGludGVyZmFjZXMgPT0gbnVsbCkgIHsNCisgICAgICAgICAgICBpbnRlcmZhY2VzID0gbmV3IEhhc2hTZXQgKDApOw0KKw0KKyAgICAgICAgICAgIGlmIChnZXRDYWNoZWRDbGFzcygpLmlzSW50ZXJmYWNlKCkpDQorICAgICAgICAgICAgICBpbnRlcmZhY2VzLmFkZCh0aGlzKTsNCisNCisgICAgICAgICAgICBDbGFzc1tdIGNsYXNzZXMgPSBnZXRDYWNoZWRDbGFzcygpLmdldEludGVyZmFjZXMoKTsNCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzZXMubGVuZ3RoOyBpKyspIHsNCisgICAgICAgICAgICAgICAgZmluYWwgQ2FjaGVkQ2xhc3MgYUNsYXNzID0gUmVmbGVjdGlvbkNhY2hlLmdldENhY2hlZENsYXNzKGNsYXNzZXNbaV0pOw0KKyAgICAgICAgICAgICAgICBpZiAoIWludGVyZmFjZXMuY29udGFpbnMoYUNsYXNzKSkNCisgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VzLmFkZEFsbChhQ2xhc3MuZ2V0SW50ZXJmYWNlcygpKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgZmluYWwgQ2FjaGVkQ2xhc3Mgc3VwZXJDbGFzcyA9IGdldENhY2hlZFN1cGVyQ2xhc3MoKTsNCisgICAgICAgICAgICBpZiAoc3VwZXJDbGFzcyAhPSBudWxsKQ0KKyAgICAgICAgICAgICAgaW50ZXJmYWNlcy5hZGRBbGwoc3VwZXJDbGFzcy5nZXRJbnRlcmZhY2VzKCkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIGludGVyZmFjZXM7DQorICAgIH0NCisNCisgICAgcHJpdmF0ZSBTZXQgb3duSW50ZXJmYWNlczsNCisNCisgICAgcHVibGljIFNldCBnZXRPd25JbnRlcmZhY2VzKCkgew0KKyAgICAgICAgaWYgKG93bkludGVyZmFjZXMgPT0gbnVsbCkgIHsNCisgICAgICAgICAgICBvd25JbnRlcmZhY2VzID0gbmV3IEhhc2hTZXQgKDApOw0KKw0KKyAgICAgICAgICAgIGlmIChnZXRDYWNoZWRDbGFzcygpLmlzSW50ZXJmYWNlKCkpDQorICAgICAgICAgICAgICBvd25JbnRlcmZhY2VzLmFkZCh0aGlzKTsNCisNCisgICAgICAgICAgICBDbGFzc1tdIGNsYXNzZXMgPSBnZXRDYWNoZWRDbGFzcygpLmdldEludGVyZmFjZXMoKTsNCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzZXMubGVuZ3RoOyBpKyspIHsNCisgICAgICAgICAgICAgICAgZmluYWwgQ2FjaGVkQ2xhc3MgYUNsYXNzID0gUmVmbGVjdGlvbkNhY2hlLmdldENhY2hlZENsYXNzKGNsYXNzZXNbaV0pOw0KKyAgICAgICAgICAgICAgICBpZiAoIW93bkludGVyZmFjZXMuY29udGFpbnMoYUNsYXNzKSkNCisgICAgICAgICAgICAgICAgICBvd25JbnRlcmZhY2VzLmFkZEFsbChhQ2xhc3MuZ2V0SW50ZXJmYWNlcygpKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgZmluYWwgQ2FjaGVkQ2xhc3Mgc3VwZXJDbGFzcyA9IGdldENhY2hlZFN1cGVyQ2xhc3MoKTsNCisgICAgICAgICAgICBpZiAoc3VwZXJDbGFzcyAhPSBudWxsKQ0KKyAgICAgICAgICAgICAgb3duSW50ZXJmYWNlcy5hZGRBbGwoc3VwZXJDbGFzcy5nZXRJbnRlcmZhY2VzKCkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIG93bkludGVyZmFjZXM7DQorICAgIH0NCisNCisgICAgcHJpdmF0ZSBTZXQgaW50ZXJmYWNlczsNCisNCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNBcnJheTsNCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNQcmltaXRpdmU7DQorICAgIHB1YmxpYyBmaW5hbCBpbnQgbW9kaWZpZXJzOw0KKyAgICBpbnQgZGlzdGFuY2UgPSAtMTsNCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNJbnRlcmZhY2U7DQorICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzTnVtYmVyOw0KKw0KKyAgICBDYWNoZWRDbGFzcyhDbGFzcyBrbGF6eikgew0KKyAgICAgICAgY2FjaGVkQ2xhc3MgPSBrbGF6ejsNCisgICAgICAgIGlzQXJyYXkgPSBrbGF6ei5pc0FycmF5KCk7DQorICAgICAgICBpc1ByaW1pdGl2ZSA9IGtsYXp6LmlzUHJpbWl0aXZlKCk7DQorICAgICAgICBtb2RpZmllcnMgPSBrbGF6ei5nZXRNb2RpZmllcnMoKTsNCisgICAgICAgIGlzSW50ZXJmYWNlID0ga2xhenouaXNJbnRlcmZhY2UoKTsNCisgICAgICAgIGlzTnVtYmVyID0gTnVtYmVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oa2xhenopOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgQ2FjaGVkQ2xhc3MgZ2V0Q2FjaGVkU3VwZXJDbGFzcygpIHsNCisgICAgICAgIGlmIChjYWNoZWRTdXBlckNsYXNzID09IG51bGwpIHsNCisgICAgICAgICAgICBpZiAoIWlzQXJyYXkpDQorICAgICAgICAgICAgICBjYWNoZWRTdXBlckNsYXNzID0gUmVmbGVjdGlvbkNhY2hlLmdldENhY2hlZENsYXNzKGdldENhY2hlZENsYXNzKCkuZ2V0U3VwZXJjbGFzcygpKTsNCisgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICBpZiAoY2FjaGVkQ2xhc3MuZ2V0Q29tcG9uZW50VHlwZSgpLmlzUHJpbWl0aXZlKCkgfHwgY2FjaGVkQ2xhc3MuZ2V0Q29tcG9uZW50VHlwZSgpID09IE9iamVjdC5jbGFzcykNCisgICAgICAgICAgICAgICAgY2FjaGVkU3VwZXJDbGFzcyA9IFJlZmxlY3Rpb25DYWNoZS5PQkpFQ1RfQ0xBU1M7DQorICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgIGNhY2hlZFN1cGVyQ2xhc3MgPSBSZWZsZWN0aW9uQ2FjaGUuT0JKRUNUX0FSUkFZX0NMQVNTOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcmV0dXJuIGNhY2hlZFN1cGVyQ2xhc3M7DQorICAgIH0NCisNCisgICAgcHVibGljIHN5bmNocm9uaXplZCBDYWNoZWRNZXRob2RbXSBnZXRNZXRob2RzKCkgew0KKyAgICAgICAgaWYgKG1ldGhvZHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgIGZpbmFsIE1ldGhvZFtdIGRlY2xhcmVkTWV0aG9kcyA9IChNZXRob2RbXSkNCisgICAgICAgICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbi8qPE1ldGhvZFtdPiovKCkgew0KKyAgICAgICAgICAgICAgICAgICBwdWJsaWMgLypNZXRob2RbXSovIE9iamVjdCBydW4oKSB7DQorICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Q2FjaGVkQ2xhc3MoKS5nZXREZWNsYXJlZE1ldGhvZHMoKTsNCisgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgIH0pOw0KKyAgICAgICAgICAgIEFycmF5TGlzdCBtZXRob2RzID0gbmV3IEFycmF5TGlzdChkZWNsYXJlZE1ldGhvZHMubGVuZ3RoKTsNCisgICAgICAgICAgICBBcnJheUxpc3QgbW9wTWV0aG9kcyA9IG5ldyBBcnJheUxpc3QoZGVjbGFyZWRNZXRob2RzLmxlbmd0aCk7DQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgIT0gZGVjbGFyZWRNZXRob2RzLmxlbmd0aDsgKytpKSB7DQorICAgICAgICAgICAgICAgIGZpbmFsIENhY2hlZE1ldGhvZCBjYWNoZWRNZXRob2QgPSBuZXcgQ2FjaGVkTWV0aG9kKHRoaXMsIGRlY2xhcmVkTWV0aG9kc1tpXSk7DQorICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gY2FjaGVkTWV0aG9kLmdldE5hbWUoKTsNCisNCisgICAgICAgICAgICAgICAgaWYgKG5hbWUuaW5kZXhPZignKycpID49IDApIHsNCisgICAgICAgICAgICAgICAgICAgIC8vIFNraXAgU3ludGhldGljIG1ldGhvZHMgaW5zZXJ0ZWQgYnkgSkRLIDEuNSBjb21waWxlcnMgYW5kIGxhdGVyDQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgfSAvKmVsc2UgaWYgKE1vZGlmaWVyLmlzQWJzdHJhY3QocmVmbGVjdGlvbk1ldGhvZC5nZXRNb2RpZmllcnMoKSkpIHsNCisgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICAgIH0qLw0KKw0KKyAgICAgICAgICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKCJ0aGlzJCIpIHx8IG5hbWUuc3RhcnRzV2l0aCgic3VwZXIkIikpDQorICAgICAgICAgICAgICAgICAgbW9wTWV0aG9kcy5hZGQoY2FjaGVkTWV0aG9kKTsNCisgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgIG1ldGhvZHMuYWRkKGNhY2hlZE1ldGhvZCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHRoaXMubWV0aG9kcyA9IChDYWNoZWRNZXRob2RbXSkgbWV0aG9kcy50b0FycmF5KG5ldyBDYWNoZWRNZXRob2RbbWV0aG9kcy5zaXplKCldKTsNCisgICAgICAgICAgICBBcnJheXMuc29ydCh0aGlzLm1ldGhvZHMpOw0KKw0KKyAgICAgICAgICAgIGZpbmFsIENhY2hlZENsYXNzIHN1cGVyQ2xhc3MgPSBnZXRDYWNoZWRTdXBlckNsYXNzKCk7DQorICAgICAgICAgICAgaWYgKHN1cGVyQ2xhc3MgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICBzdXBlckNsYXNzLmdldE1ldGhvZHMoKTsNCisgICAgICAgICAgICAgICAgZmluYWwgQ2FjaGVkTWV0aG9kW10gc3VwZXJNb3BNZXRob2RzID0gc3VwZXJDbGFzcy5tb3BNZXRob2RzOw0KKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSAhPSBzdXBlck1vcE1ldGhvZHMubGVuZ3RoOyArK2kpDQorICAgICAgICAgICAgICAgICAgbW9wTWV0aG9kcy5hZGQoc3VwZXJNb3BNZXRob2RzW2ldKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgdGhpcy5tb3BNZXRob2RzID0gKENhY2hlZE1ldGhvZFtdKSBtb3BNZXRob2RzLnRvQXJyYXkobmV3IENhY2hlZE1ldGhvZFttb3BNZXRob2RzLnNpemUoKV0pOw0KKyAgICAgICAgICAgIEFycmF5cy5zb3J0KHRoaXMubW9wTWV0aG9kcywgQ2FjaGVkTWV0aG9kQ29tcGFyYXRvckJ5TmFtZS5JTlNUQU5DRSk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gbWV0aG9kczsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIENhY2hlZEZpZWxkW10gZ2V0RmllbGRzKCkgew0KKyAgICAgICAgaWYgKGZpZWxkcyA9PSBudWxsKSB7DQorDQorICAgICAgICAgICAgZmluYWwgRmllbGRbXSBkZWNsYXJlZEZpZWxkcyA9IChGaWVsZFtdKQ0KKyAgICAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uLyo8RmllbGRbXT4qLygpIHsNCisgICAgICAgICAgICAgICAgICAgcHVibGljIC8qRmllbGRbXSovIE9iamVjdCBydW4oKSB7DQorICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Q2FjaGVkQ2xhc3MoKS5nZXREZWNsYXJlZEZpZWxkcygpOw0KKyAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgfSk7DQorICAgICAgICAgICAgZmllbGRzID0gbmV3IENhY2hlZEZpZWxkW2RlY2xhcmVkRmllbGRzLmxlbmd0aF07DQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgIT0gZmllbGRzLmxlbmd0aDsgKytpKQ0KKyAgICAgICAgICAgICAgICBmaWVsZHNbaV0gPSBuZXcgQ2FjaGVkRmllbGQodGhpcywgZGVjbGFyZWRGaWVsZHNbaV0pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIGZpZWxkczsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIENhY2hlZENvbnN0cnVjdG9yW10gZ2V0Q29uc3RydWN0b3JzKCkgew0KKyAgICAgICAgaWYgKGNvbnN0cnVjdG9ycyA9PSBudWxsKSB7DQorICAgICAgICAgICAgZmluYWwgQ29uc3RydWN0b3JbXSBkZWNsYXJlZENvbnN0cnVjdG9ycyA9IChDb25zdHJ1Y3RvcltdKQ0KKyAgICAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uLyo8Q29uc3RydWN0b3JbXT4qLygpIHsNCisgICAgICAgICAgICAgICAgICAgcHVibGljIC8qQ29uc3RydWN0b3JbXSovIE9iamVjdCBydW4oKSB7DQorICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Q2FjaGVkQ2xhc3MoKS5nZXREZWNsYXJlZENvbnN0cnVjdG9ycygpOw0KKyAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgfSk7DQorICAgICAgICAgICAgY29uc3RydWN0b3JzID0gbmV3IENhY2hlZENvbnN0cnVjdG9yW2RlY2xhcmVkQ29uc3RydWN0b3JzLmxlbmd0aF07DQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgIT0gY29uc3RydWN0b3JzLmxlbmd0aDsgKytpKQ0KKyAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcnNbaV0gPSBuZXcgQ2FjaGVkQ29uc3RydWN0b3IodGhpcywgZGVjbGFyZWRDb25zdHJ1Y3RvcnNbaV0pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yczsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgQ2FjaGVkTWV0aG9kIHNlYXJjaE1ldGhvZHMoU3RyaW5nIG5hbWUsIENhY2hlZENsYXNzW10gcGFyYW1ldGVyVHlwZXMpIHsNCisgICAgICAgIENhY2hlZE1ldGhvZFtdIG1ldGhvZHMgPSBnZXRNZXRob2RzKCk7DQorDQorICAgICAgICBDYWNoZWRNZXRob2QgcmVzID0gbnVsbDsNCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgew0KKyAgICAgICAgICAgIENhY2hlZE1ldGhvZCBtID0gbWV0aG9kc1tpXTsNCisgICAgICAgICAgICBpZiAobS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpDQorICAgICAgICAgICAgICAgICAgICAmJiBSZWZsZWN0aW9uQ2FjaGUuYXJyYXlDb250ZW50c0VxKHBhcmFtZXRlclR5cGVzLCBtLmdldFBhcmFtZXRlclR5cGVzKCkpDQorICAgICAgICAgICAgICAgICAgICAmJiAocmVzID09IG51bGwgfHwgcmVzLmdldFJldHVyblR5cGUoKS5pc0Fzc2lnbmFibGVGcm9tKG0uY2FjaGVkTWV0aG9kLmdldFJldHVyblR5cGUoKSkpKQ0KKyAgICAgICAgICAgICAgICByZXMgPSBtOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcmV0dXJuIHJlczsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgaW50IGdldE1vZGlmaWVycygpIHsNCisgICAgICAgIHJldHVybiBtb2RpZmllcnM7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIENvZXJjZXMgYSBHU3RyaW5nIGluc3RhbmNlIGludG8gU3RyaW5nIGlmIG5lZWRlZA0KKyAgICAgKg0KKyAgICAgKiBAcmV0dXJuIHRoZSBjb2VyY2VkIGFyZ3VtZW50DQorICAgICAqLw0KKyAgICBwcm90ZWN0ZWQgT2JqZWN0IGNvZXJjZUdTdHJpbmcoT2JqZWN0IGFyZ3VtZW50KSB7DQorICAgICAgICBpZiAoZ2V0Q2FjaGVkQ2xhc3MoKSAhPSBTdHJpbmcuY2xhc3MpIHJldHVybiBhcmd1bWVudDsNCisgICAgICAgIGlmICghKGFyZ3VtZW50IGluc3RhbmNlb2YgR1N0cmluZykpIHJldHVybiBhcmd1bWVudDsNCisgICAgICAgIHJldHVybiBhcmd1bWVudC50b1N0cmluZygpOw0KKyAgICB9DQorDQorICAgIC8vIFBSRUNPTkRJVElPTjoNCisgICAgLy8gICAhUmVmbGVjdGlvbkNhY2hlLmlzQXNzaWduYWJsZUZyb20ocGFyYW1ldGVyVHlwZSwgYXJndW1lbnQuZ2V0Q2xhc3MoKSkNCisgICAgcHJvdGVjdGVkIE9iamVjdCBjb2VyY2VOdW1iZXIoT2JqZWN0IGFyZ3VtZW50KSB7DQorICAgICAgICBpZiAoYXJndW1lbnQgaW5zdGFuY2VvZiBOdW1iZXIgJiYgKGlzTnVtYmVyIHx8IGlzUHJpbWl0aXZlKSkgeyAvLyBOdW1iZXIgdHlwZXMNCisgICAgICAgICAgICBPYmplY3Qgb2xkQXJndW1lbnQgPSBhcmd1bWVudDsNCisgICAgICAgICAgICBib29sZWFuIHdhc0RvdWJsZSA9IGZhbHNlOw0KKyAgICAgICAgICAgIGJvb2xlYW4gd2FzRmxvYXQgPSBmYWxzZTsNCisgICAgICAgICAgICBDbGFzcyBwYXJhbSA9IGdldENhY2hlZENsYXNzKCk7DQorICAgICAgICAgICAgaWYgKHBhcmFtID09IEJ5dGUuY2xhc3MgfHwgcGFyYW0gPT0gQnl0ZS5UWVBFKSB7DQorICAgICAgICAgICAgICAgIGFyZ3VtZW50ID0gbmV3IEJ5dGUoKChOdW1iZXIpIGFyZ3VtZW50KS5ieXRlVmFsdWUoKSk7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbSA9PSBEb3VibGUuY2xhc3MgfHwgcGFyYW0gPT0gRG91YmxlLlRZUEUpIHsNCisgICAgICAgICAgICAgICAgd2FzRG91YmxlID0gdHJ1ZTsNCisgICAgICAgICAgICAgICAgYXJndW1lbnQgPSBuZXcgRG91YmxlKCgoTnVtYmVyKSBhcmd1bWVudCkuZG91YmxlVmFsdWUoKSk7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbSA9PSBGbG9hdC5jbGFzcyB8fCBwYXJhbSA9PSBGbG9hdC5UWVBFKSB7DQorICAgICAgICAgICAgICAgIHdhc0Zsb2F0ID0gdHJ1ZTsNCisgICAgICAgICAgICAgICAgYXJndW1lbnQgPSBuZXcgRmxvYXQoKChOdW1iZXIpIGFyZ3VtZW50KS5mbG9hdFZhbHVlKCkpOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW0gPT0gSW50ZWdlci5jbGFzcyB8fCBwYXJhbSA9PSBJbnRlZ2VyLlRZUEUpIHsNCisgICAgICAgICAgICAgICAgYXJndW1lbnQgPSBuZXcgSW50ZWdlcigoKE51bWJlcikgYXJndW1lbnQpLmludFZhbHVlKCkpOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW0gPT0gTG9uZy5jbGFzcyB8fCBwYXJhbSA9PSBMb25nLlRZUEUpIHsNCisgICAgICAgICAgICAgICAgYXJndW1lbnQgPSBuZXcgTG9uZygoKE51bWJlcikgYXJndW1lbnQpLmxvbmdWYWx1ZSgpKTsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtID09IFNob3J0LmNsYXNzIHx8IHBhcmFtID09IFNob3J0LlRZUEUpIHsNCisgICAgICAgICAgICAgICAgYXJndW1lbnQgPSBuZXcgU2hvcnQoKChOdW1iZXIpIGFyZ3VtZW50KS5zaG9ydFZhbHVlKCkpOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW0gPT0gQmlnRGVjaW1hbC5jbGFzcykgew0KKyAgICAgICAgICAgICAgICBhcmd1bWVudCA9IG5ldyBCaWdEZWNpbWFsKFN0cmluZy52YWx1ZU9mKChOdW1iZXIpIGFyZ3VtZW50KSk7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbSA9PSBCaWdJbnRlZ2VyLmNsYXNzKSB7DQorICAgICAgICAgICAgICAgIGFyZ3VtZW50ID0gbmV3IEJpZ0ludGVnZXIoU3RyaW5nLnZhbHVlT2YoKE51bWJlcikgYXJndW1lbnQpKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgaWYgKG9sZEFyZ3VtZW50IGluc3RhbmNlb2YgQmlnRGVjaW1hbCkgew0KKyAgICAgICAgICAgICAgICBCaWdEZWNpbWFsIG9sZGJkID0gKEJpZ0RlY2ltYWwpIG9sZEFyZ3VtZW50Ow0KKyAgICAgICAgICAgICAgICBib29sZWFuIHRocm93RXhjZXB0aW9uID0gZmFsc2U7DQorICAgICAgICAgICAgICAgIGlmICh3YXNEb3VibGUpIHsNCisgICAgICAgICAgICAgICAgICAgIERvdWJsZSBkID0gKERvdWJsZSkgYXJndW1lbnQ7DQorICAgICAgICAgICAgICAgICAgICBpZiAoZC5pc0luZmluaXRlKCkpIHRocm93RXhjZXB0aW9uID0gdHJ1ZTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3YXNGbG9hdCkgew0KKyAgICAgICAgICAgICAgICAgICAgRmxvYXQgZiA9IChGbG9hdCkgYXJndW1lbnQ7DQorICAgICAgICAgICAgICAgICAgICBpZiAoZi5pc0luZmluaXRlKCkpIHRocm93RXhjZXB0aW9uID0gdHJ1ZTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIEJpZ0RlY2ltYWwgbmV3YmQgPSBuZXcgQmlnRGVjaW1hbChTdHJpbmcudmFsdWVPZigoTnVtYmVyKSBhcmd1bWVudCkpOw0KKyAgICAgICAgICAgICAgICAgICAgdGhyb3dFeGNlcHRpb24gPSAhb2xkQXJndW1lbnQuZXF1YWxzKG5ld2JkKTsNCisgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICBpZiAodGhyb3dFeGNlcHRpb24pDQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHBhcmFtICsgIiBvdXQgb2YgcmFuZ2Ugd2hpbGUgY29udmVydGluZyBmcm9tIEJpZ0RlY2ltYWwiKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gYXJndW1lbnQ7DQorICAgIH0NCisNCisgICAgcHJvdGVjdGVkIE9iamVjdCBjb2VyY2VBcnJheShPYmplY3QgYXJndW1lbnQpIHsNCisgICAgICAgIGlmICghaXNBcnJheSkgcmV0dXJuIGFyZ3VtZW50Ow0KKyAgICAgICAgQ2xhc3MgYXJndW1lbnRDbGFzcyA9IGFyZ3VtZW50LmdldENsYXNzKCk7DQorICAgICAgICBpZiAoIWFyZ3VtZW50Q2xhc3MuaXNBcnJheSgpKSByZXR1cm4gYXJndW1lbnQ7DQorICAgICAgICBDbGFzcyBhcmd1bWVudENvbXBvbmVudCA9IGFyZ3VtZW50Q2xhc3MuZ2V0Q29tcG9uZW50VHlwZSgpOw0KKw0KKyAgICAgICAgQ2xhc3MgcGFyYW1Db21wb25lbnQgPSBnZXRDYWNoZWRDbGFzcygpLmdldENvbXBvbmVudFR5cGUoKTsNCisgICAgICAgIGlmIChwYXJhbUNvbXBvbmVudC5pc1ByaW1pdGl2ZSgpKSB7DQorICAgICAgICAgICAgaWYgKHBhcmFtQ29tcG9uZW50ID09IGJvb2xlYW4uY2xhc3MgJiYgYXJndW1lbnRDbGFzcyA9PSBCb29sZWFuW10uY2xhc3MpIHsNCisgICAgICAgICAgICAgICAgYXJndW1lbnQgPSBEZWZhdWx0VHlwZVRyYW5zZm9ybWF0aW9uLmNvbnZlcnRUb0Jvb2xlYW5BcnJheShhcmd1bWVudCk7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbUNvbXBvbmVudCA9PSBieXRlLmNsYXNzICYmIGFyZ3VtZW50Q2xhc3MgPT0gQnl0ZVtdLmNsYXNzKSB7DQorICAgICAgICAgICAgICAgIGFyZ3VtZW50ID0gRGVmYXVsdFR5cGVUcmFuc2Zvcm1hdGlvbi5jb252ZXJ0VG9CeXRlQXJyYXkoYXJndW1lbnQpOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1Db21wb25lbnQgPT0gY2hhci5jbGFzcyAmJiBhcmd1bWVudENsYXNzID09IENoYXJhY3RlcltdLmNsYXNzKSB7DQorICAgICAgICAgICAgICAgIGFyZ3VtZW50ID0gRGVmYXVsdFR5cGVUcmFuc2Zvcm1hdGlvbi5jb252ZXJ0VG9DaGFyQXJyYXkoYXJndW1lbnQpOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1Db21wb25lbnQgPT0gc2hvcnQuY2xhc3MgJiYgYXJndW1lbnRDbGFzcyA9PSBTaG9ydFtdLmNsYXNzKSB7DQorICAgICAgICAgICAgICAgIGFyZ3VtZW50ID0gRGVmYXVsdFR5cGVUcmFuc2Zvcm1hdGlvbi5jb252ZXJ0VG9TaG9ydEFycmF5KGFyZ3VtZW50KTsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtQ29tcG9uZW50ID09IGludC5jbGFzcyAmJiBhcmd1bWVudENsYXNzID09IEludGVnZXJbXS5jbGFzcykgew0KKyAgICAgICAgICAgICAgICBhcmd1bWVudCA9IERlZmF1bHRUeXBlVHJhbnNmb3JtYXRpb24uY29udmVydFRvSW50QXJyYXkoYXJndW1lbnQpOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1Db21wb25lbnQgPT0gbG9uZy5jbGFzcyAmJg0KKyAgICAgICAgICAgICAgICAgICAgKGFyZ3VtZW50Q2xhc3MgPT0gTG9uZ1tdLmNsYXNzIHx8IGFyZ3VtZW50Q2xhc3MgPT0gSW50ZWdlcltdLmNsYXNzKSkgew0KKyAgICAgICAgICAgICAgICBhcmd1bWVudCA9IERlZmF1bHRUeXBlVHJhbnNmb3JtYXRpb24uY29udmVydFRvTG9uZ0FycmF5KGFyZ3VtZW50KTsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtQ29tcG9uZW50ID09IGZsb2F0LmNsYXNzICYmDQorICAgICAgICAgICAgICAgICAgICAoYXJndW1lbnRDbGFzcyA9PSBGbG9hdFtdLmNsYXNzIHx8IGFyZ3VtZW50Q2xhc3MgPT0gSW50ZWdlcltdLmNsYXNzKSkgew0KKyAgICAgICAgICAgICAgICBhcmd1bWVudCA9IERlZmF1bHRUeXBlVHJhbnNmb3JtYXRpb24uY29udmVydFRvRmxvYXRBcnJheShhcmd1bWVudCk7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbUNvbXBvbmVudCA9PSBkb3VibGUuY2xhc3MgJiYNCisgICAgICAgICAgICAgICAgICAgIChhcmd1bWVudENsYXNzID09IERvdWJsZVtdLmNsYXNzIHx8IGFyZ3VtZW50Q2xhc3MgPT0gRmxvYXRbXS5jbGFzcw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBCaWdEZWNpbWFsW10uY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShhcmd1bWVudENsYXNzKSkpIHsNCisgICAgICAgICAgICAgICAgYXJndW1lbnQgPSBEZWZhdWx0VHlwZVRyYW5zZm9ybWF0aW9uLmNvbnZlcnRUb0RvdWJsZUFycmF5KGFyZ3VtZW50KTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2UgaWYgKHBhcmFtQ29tcG9uZW50ID09IFN0cmluZy5jbGFzcyAmJiBhcmd1bWVudCBpbnN0YW5jZW9mIEdTdHJpbmdbXSkgew0KKyAgICAgICAgICAgIEdTdHJpbmdbXSBzdHJpbmdzID0gKEdTdHJpbmdbXSkgYXJndW1lbnQ7DQorICAgICAgICAgICAgU3RyaW5nW10gcmV0ID0gbmV3IFN0cmluZ1tzdHJpbmdzLmxlbmd0aF07DQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJpbmdzLmxlbmd0aDsgaSsrKSB7DQorICAgICAgICAgICAgICAgIHJldFtpXSA9IHN0cmluZ3NbaV0udG9TdHJpbmcoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYXJndW1lbnQgPSByZXQ7DQorICAgICAgICB9IGVsc2UgaWYgKHBhcmFtQ29tcG9uZW50PT1PYmplY3QuY2xhc3MgJiYgYXJndW1lbnRDb21wb25lbnQuaXNQcmltaXRpdmUoKSl7DQorICAgICAgICAgICAgYXJndW1lbnQgPSBEZWZhdWx0VHlwZVRyYW5zZm9ybWF0aW9uLnByaW1pdGl2ZUFycmF5Qm94KGFyZ3VtZW50KTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBhcmd1bWVudDsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGludCBnZXRTdXBlckNsYXNzRGlzdGFuY2UoKSB7DQorICAgICAgICBzeW5jaHJvbml6ZWQgKGdldENhY2hlZENsYXNzKCkpIHsNCisgICAgICAgICAgICBpZiAoZGlzdGFuY2UgPT0gLTEpIHsNCisgICAgICAgICAgICAgICAgaW50IGRpc3RhbmNlID0gMDsNCisgICAgICAgICAgICAgICAgZm9yIChDbGFzcyBrbGF6ej0gZ2V0Q2FjaGVkQ2xhc3MoKTsga2xhenogIT0gbnVsbDsga2xhenogPSBrbGF6ei5nZXRTdXBlcmNsYXNzKCkpIHsNCisgICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlKys7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgdGhpcy5kaXN0YW5jZSA9IGRpc3RhbmNlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gZGlzdGFuY2U7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsNCisgICAgICAgIGlmIChoYXNoQ29kZSA9PSAwKSB7DQorICAgICAgICAgIGhhc2hDb2RlID0gc3VwZXIuaGFzaENvZGUoKTsNCisgICAgICAgICAgaWYgKGhhc2hDb2RlID09IDApDQorICAgICAgICAgICAgaGFzaENvZGUgPSAweGNhZmViZWJlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIGhhc2hDb2RlOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlKCkgew0KKyAgICAgICAgcmV0dXJuIGlzUHJpbWl0aXZlOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGlzVm9pZCgpIHsNCisgICAgICAgIHJldHVybiBnZXRDYWNoZWRDbGFzcygpID09IHZvaWQuY2xhc3M7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgYm94KEJ5dGVjb2RlSGVscGVyIGhlbHBlcikgew0KKyAgICAgICAgaGVscGVyLmJveChnZXRDYWNoZWRDbGFzcygpKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCB1bmJveChCeXRlY29kZUhlbHBlciBoZWxwZXIpIHsNCisgICAgICAgIGhlbHBlci51bmJveChnZXRDYWNoZWRDbGFzcygpKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ludGVyZmFjZSgpIHsNCisgICAgICAgIHJldHVybiBpc0ludGVyZmFjZTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBkb0Nhc3QoQnl0ZWNvZGVIZWxwZXIgaGVscGVyKSB7DQorICAgICAgICBoZWxwZXIuZG9DYXN0KGdldENhY2hlZENsYXNzKCkpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsNCisgICAgICAgIHJldHVybiBnZXRDYWNoZWRDbGFzcygpLmdldE5hbWUoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGVEZXNjcmlwdGlvbigpIHsNCisgICAgICAgIHJldHVybiBCeXRlY29kZUhlbHBlci5nZXRUeXBlRGVzY3JpcHRpb24oZ2V0Q2FjaGVkQ2xhc3MoKSk7DQorICAgIH0NCisNCisgICAgcHVibGljIHN5bmNocm9uaXplZCBSZWZsZWN0b3IgZ2V0UmVmbGVjdG9yKCkgew0KKyAgICAgICAgLyppZiAocmVmbGVjdG9yID09IG51bGwpIHsNCisgICAgICAgICAgICBmaW5hbCBNZXRhQ2xhc3NSZWdpc3RyeSBtZXRhQ2xhc3NSZWdpc3RyeSA9IE1ldGFDbGFzc1JlZ2lzdHJ5SW1wbC5nZXRJbnN0YW5jZShNZXRhQ2xhc3NSZWdpc3RyeUltcGwuTE9BRF9ERUZBVUxUKTsNCisgICAgICAgICAgICByZWZsZWN0b3IgPSAoKE1ldGFDbGFzc1JlZ2lzdHJ5SW1wbCltZXRhQ2xhc3NSZWdpc3RyeSkubG9hZFJlZmxlY3RvcihnZXRDYWNoZWRDbGFzcygpLCBBcnJheXMuYXNMaXN0KGdldE1ldGhvZHMoKSkpOw0KKyAgICAgICAgfSovDQorICAgICAgICByZXR1cm4gcmVmbGVjdG9yOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBDbGFzcyBnZXRDYWNoZWRDbGFzcygpIHsNCisgICAgICAgIHJldHVybiBjYWNoZWRDbGFzczsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgTWV0YU1ldGhvZFtdIGdldE5ld01ldGFNZXRob2RzKCkgew0KKyAgICAgICAgcmV0dXJuIG5ld01ldGFNZXRob2RzOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldE5ld01vcE1ldGhvZHMoQXJyYXlMaXN0IGFycikgew0KKyAgICAgICAgbmV3TWV0YU1ldGhvZHMgPSAoTWV0YU1ldGhvZFtdKSBhcnIudG9BcnJheShuZXcgTWV0YU1ldGhvZFthcnIuc2l6ZSgpXSk7DQorICAgIH0NCisNCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDYWNoZWRNZXRob2RDb21wYXJhdG9yQnlOYW1lIGltcGxlbWVudHMgQ29tcGFyYXRvciB7DQorICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBhcmF0b3IgSU5TVEFOQ0UgPSBuZXcgQ2FjaGVkTWV0aG9kQ29tcGFyYXRvckJ5TmFtZSgpOw0KKw0KKyAgICAgICAgcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7DQorICAgICAgICAgICAgcmV0dXJuICgoQ2FjaGVkTWV0aG9kKW8xKS5nZXROYW1lKCkuY29tcGFyZVRvKCgoQ2FjaGVkTWV0aG9kKW8yKS5nZXROYW1lKCkpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2FjaGVkTWV0aG9kQ29tcGFyYXRvcldpdGhTdHJpbmcgaW1wbGVtZW50cyBDb21wYXJhdG9yIHsNCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcGFyYXRvciBJTlNUQU5DRSA9IG5ldyBDYWNoZWRNZXRob2RDb21wYXJhdG9yV2l0aFN0cmluZygpOw0KKw0KKyAgICAgICAgcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7DQorICAgICAgICAgICAgcmV0dXJuICgoQ2FjaGVkTWV0aG9kKW8xKS5nZXROYW1lKCkuY29tcGFyZVRvKChTdHJpbmcpbzIpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQorICAgICAgICByZXR1cm4gY2FjaGVkQ2xhc3MudG9TdHJpbmcoKTsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9yZWZsZWN0aW9uL0NhY2hlZENvbnN0cnVjdG9yLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9yZWZsZWN0aW9uL0NhY2hlZENvbnN0cnVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI2Y2U5YgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3JlZmxlY3Rpb24vQ2FjaGVkQ29uc3RydWN0b3IuamF2YQpAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5yZWZsZWN0aW9uOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CisKKy8qKgorICogQGF1dGhvciBBbGV4LlRrYWNobWFuCisgKi8KK3B1YmxpYyBjbGFzcyBDYWNoZWRDb25zdHJ1Y3RvciBleHRlbmRzIFBhcmFtZXRlclR5cGVzIHsKKyAgICBDYWNoZWRDbGFzcyBjbGF6ejsKKworICAgIHB1YmxpYyBmaW5hbCBDb25zdHJ1Y3RvciBjYWNoZWRDb25zdHJ1Y3RvcjsKKworICAgIHB1YmxpYyBDYWNoZWRDb25zdHJ1Y3RvcihDYWNoZWRDbGFzcyBjbGF6eiwgQ29uc3RydWN0b3IgYykgeworICAgICAgICB0aGlzLmNhY2hlZENvbnN0cnVjdG9yID0gYzsKKyAgICAgICAgdGhpcy5jbGF6eiA9IGNsYXp6OworICAgICAgICB0cnkgeworICAgICAgICAgICAgYy5zZXRBY2Nlc3NpYmxlKHRydWUpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBJR05PUkUKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBDYWNoZWRDb25zdHJ1Y3RvcihDb25zdHJ1Y3RvciBjKSB7CisgICAgICAgIHRoaXMoUmVmbGVjdGlvbkNhY2hlLmdldENhY2hlZENsYXNzKGMuZ2V0RGVjbGFyaW5nQ2xhc3MoKSksIGMpOworICAgIH0KKworICAgIENsYXNzW10gZ2V0UFQoKSB7CisgICAgICAgIHJldHVybiBjYWNoZWRDb25zdHJ1Y3Rvci5nZXRQYXJhbWV0ZXJUeXBlcygpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQ2FjaGVkQ29uc3RydWN0b3IgZmluZChDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvcikgeworICAgICAgICBDYWNoZWRDb25zdHJ1Y3RvcltdIGNvbnN0cnVjdG9ycyA9IFJlZmxlY3Rpb25DYWNoZS5nZXRDYWNoZWRDbGFzcyhjb25zdHJ1Y3Rvci5nZXREZWNsYXJpbmdDbGFzcygpKS5nZXRDb25zdHJ1Y3RvcnMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25zdHJ1Y3RvcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIENhY2hlZENvbnN0cnVjdG9yIGNhY2hlZENvbnN0cnVjdG9yID0gY29uc3RydWN0b3JzW2ldOworICAgICAgICAgICAgaWYgKGNhY2hlZENvbnN0cnVjdG9yLmNhY2hlZENvbnN0cnVjdG9yLmVxdWFscyhjb25zdHJ1Y3RvcikpCisgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENvbnN0cnVjdG9yOworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDb3VsZG4ndCBmaW5kIG1ldGhvZDogIiArIGNvbnN0cnVjdG9yKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3JlZmxlY3Rpb24vQ2FjaGVkRmllbGQuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3JlZmxlY3Rpb24vQ2FjaGVkRmllbGQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzgxZWRmCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcmVmbGVjdGlvbi9DYWNoZWRGaWVsZC5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJlZmxlY3Rpb247CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKKworcHVibGljIGNsYXNzIENhY2hlZEZpZWxkIHsKKyAgICBwdWJsaWMgZmluYWwgRmllbGQgZmllbGQ7CisKKyAgICBDYWNoZWRDbGFzcyBjYWNoZWRDbGFzczsKKworICAgIHB1YmxpYyBDYWNoZWRGaWVsZChDYWNoZWRDbGFzcyBjbGF6eiwgRmllbGQgZmllbGQpIHsKKyAgICAgICAgdGhpcy5maWVsZCA9IGZpZWxkOworICAgICAgICBjYWNoZWRDbGFzcyA9IGNsYXp6OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGZpZWxkLmdldE5hbWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YXRpYygpIHsKKyAgICAgICAgcmV0dXJuIE1vZGlmaWVyLmlzU3RhdGljKGdldE1vZGlmaWVycygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3MgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIGZpZWxkLmdldFR5cGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldE1vZGlmaWVycygpIHsKKyAgICAgICAgcmV0dXJuIGZpZWxkLmdldE1vZGlmaWVycygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3JlZmxlY3Rpb24vQ2FjaGVkTWV0aG9kLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9yZWZsZWN0aW9uL0NhY2hlZE1ldGhvZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZGI0MjQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9yZWZsZWN0aW9uL0NhY2hlZE1ldGhvZC5qYXZhCkBAIC0wLDAgKzEsMjMwIEBACisvKg0KKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLg0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5yZWZsZWN0aW9uOw0KKw0KK2ltcG9ydCBncm9vdnkubGFuZy5NZXRhTWV0aG9kOw0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuLkJ5dGVjb2RlSGVscGVyOw0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUubWV0YWNsYXNzLk1ldGhvZEhlbHBlcjsNCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLm1ldGFjbGFzcy5SZWZsZWN0aW9uTWV0YU1ldGhvZDsNCisNCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOw0KK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsNCitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOw0KK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247DQoraW1wb3J0IGphdmEudXRpbC5BcnJheXM7DQorDQorLyoqDQorICogQGF1dGhvciBBbGV4LlRrYWNobWFuDQorICovDQorcHVibGljIGNsYXNzIENhY2hlZE1ldGhvZCBleHRlbmRzIFBhcmFtZXRlclR5cGVzIGltcGxlbWVudHMgQ29tcGFyYWJsZXsNCisgICAgcHVibGljIGZpbmFsIENhY2hlZENsYXNzIGNhY2hlZENsYXNzOw0KKw0KKyAgICBwdWJsaWMgZmluYWwgTWV0aG9kIGNhY2hlZE1ldGhvZDsNCisgICAgcHJpdmF0ZSBib29sZWFuIGFscmVhZHlTZXRBY2Nlc3NpYmxlOw0KKyAgICBwcml2YXRlIGludCBtZXRob2RJbmRleDsNCisgICAgcHJpdmF0ZSBpbnQgaGFzaENvZGU7DQorICAgIHByaXZhdGUgTWV0YU1ldGhvZCByZWZsZWN0aW9uTWV0YU1ldGhvZDsNCisNCisgICAgcHVibGljIENhY2hlZE1ldGhvZChDYWNoZWRDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgew0KKyAgICAgICAgdGhpcy5jYWNoZWRNZXRob2QgPSBtZXRob2Q7DQorICAgICAgICB0aGlzLmNhY2hlZENsYXNzID0gY2xheno7DQorICAgICAgICBhbHJlYWR5U2V0QWNjZXNzaWJsZSA9IE1vZGlmaWVyLmlzUHVibGljKG1ldGhvZC5nZXRNb2RpZmllcnMoKSkgJiYgTW9kaWZpZXIuaXNQdWJsaWMoY2xhenouZ2V0TW9kaWZpZXJzKCkpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBDYWNoZWRNZXRob2QoTWV0aG9kIG1ldGhvZCkgew0KKyAgICAgICAgdGhpcyhSZWZsZWN0aW9uQ2FjaGUuZ2V0Q2FjaGVkQ2xhc3MobWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCkpLG1ldGhvZCk7DQorICAgIH0NCisNCisgICAgcHVibGljIHN0YXRpYyBDYWNoZWRNZXRob2QgZmluZChNZXRob2QgbWV0aG9kKSB7DQorICAgICAgICBDYWNoZWRNZXRob2RbXSBtZXRob2RzID0gUmVmbGVjdGlvbkNhY2hlLmdldENhY2hlZENsYXNzKG1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpKS5nZXRNZXRob2RzKCk7DQorLy8gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgew0KKy8vICAgICAgICAgICAgQ2FjaGVkTWV0aG9kIGNhY2hlZE1ldGhvZCA9IG1ldGhvZHNbaV07DQorLy8gICAgICAgICAgICBpZiAoY2FjaGVkTWV0aG9kLmNhY2hlZE1ldGhvZC5lcXVhbHMobWV0aG9kKSkNCisvLyAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGVkTWV0aG9kOw0KKy8vICAgICAgICB9DQorLy8gICAgICAgIHJldHVybiBudWxsOw0KKyAgICAgICAgaW50IGkgPSBBcnJheXMuYmluYXJ5U2VhcmNoKG1ldGhvZHMsIG1ldGhvZCk7DQorICAgICAgICBpZiAoaSA8IDApDQorICAgICAgICAgIHJldHVybiBudWxsOw0KKw0KKyAgICAgICAgcmV0dXJuIG1ldGhvZHNbaV07DQorICAgIH0NCisNCisgICAgQ2xhc3NbXSBnZXRQVCgpIHsNCisgICAgICAgIHJldHVybiBjYWNoZWRNZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7DQorICAgICAgICByZXR1cm4gY2FjaGVkTWV0aG9kLmdldE5hbWUoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0b3IoKSB7DQorICAgICAgICByZXR1cm4gQnl0ZWNvZGVIZWxwZXIuZ2V0TWV0aG9kRGVzY3JpcHRvcihnZXRSZXR1cm5UeXBlKCksIGdldE5hdGl2ZVBhcmFtZXRlclR5cGVzKCkpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBDbGFzcyBnZXREZWNsYXJpbmdDbGFzcygpIHsNCisgICAgICAgIHJldHVybiBjYWNoZWRDbGFzcy5nZXRDYWNoZWRDbGFzcygpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBDbGFzcyBnZXRSZXR1cm5UeXBlKCkgew0KKyAgICAgICAgcmV0dXJuIGNhY2hlZE1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGludCBnZXRQYXJhbXNDb3VudCgpIHsNCisgICAgICAgIHJldHVybiBnZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aDsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgaW50IGdldE1vZGlmaWVycygpIHsNCisgICAgICAgIHJldHVybiBjYWNoZWRNZXRob2QuZ2V0TW9kaWZpZXJzKCk7DQorICAgIH0NCisNCisNCisgICAgcHVibGljIFN0cmluZyBnZXRTaWduYXR1cmUoKSB7DQorICAgICAgICByZXR1cm4gZ2V0TmFtZSgpICsgZ2V0RGVzY3JpcHRvcigpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBNZXRob2Qgc2V0QWNjZXNzaWJsZSgpIHsNCisgICAgICAgIGlmICggIWFscmVhZHlTZXRBY2Nlc3NpYmxlICkgew0KKyAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgew0KKyAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsNCisgICAgICAgICAgICAgICAgICAgIGNhY2hlZE1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9KTsNCisgICAgICAgIH0NCisgICAgICAgIGFscmVhZHlTZXRBY2Nlc3NpYmxlID0gdHJ1ZTsNCisgICAgICAgIHJldHVybiBjYWNoZWRNZXRob2Q7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gaXNTdGF0aWMoKSB7DQorICAgICAgICByZXR1cm4gTWV0aG9kSGVscGVyLmlzU3RhdGljKGNhY2hlZE1ldGhvZCk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgc2V0TWV0aG9kSW5kZXgoaW50IGkpIHsNCisgICAgICAgIG1ldGhvZEluZGV4ID0gaTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgaW50IGdldE1ldGhvZEluZGV4KCkgew0KKyAgICAgICAgcmV0dXJuIG1ldGhvZEluZGV4Ow0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGNhbkJlQ2FsbGVkQnlSZWZsZWN0b3IgKCkgew0KKyAgICAgICAgICAgIGlmICghTW9kaWZpZXIuaXNQdWJsaWMoY2FjaGVkQ2xhc3MuZ2V0TW9kaWZpZXJzKCkpKQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorDQorICAgICAgICAgICAgaWYgKCFNb2RpZmllci5pc1B1YmxpYyhnZXRNb2RpZmllcnMoKSkpDQorICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorDQorICAgICAgICAgICAgZ2V0UGFyYW1ldGVyVHlwZXMoKTsNCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSAhPSBwYXJhbWV0ZXJUeXBlcy5sZW5ndGg7ICsraSkgew0KKyAgICAgICAgICAgICAgICBpZiAoIXBhcmFtZXRlclR5cGVzW2ldLmlzUHJpbWl0aXZlICYmICFNb2RpZmllci5pc1B1YmxpYyhwYXJhbWV0ZXJUeXBlc1tpXS5nZXRNb2RpZmllcnMoKSkpDQorICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBvKSB7DQorICAgICAgaWYgKG8gaW5zdGFuY2VvZiBDYWNoZWRNZXRob2QpDQorICAgICAgICByZXR1cm4gY29tcGFyZVRvQ2FjaGVkTWV0aG9kKChDYWNoZWRNZXRob2Qpbyk7DQorICAgICAgZWxzZQ0KKyAgICAgICAgcmV0dXJuIGNvbXBhcmVUb01ldGhvZCgoTWV0aG9kKW8pOw0KKyAgICB9DQorDQorICAgIHByaXZhdGUgaW50IGNvbXBhcmVUb0NhY2hlZE1ldGhvZChDYWNoZWRNZXRob2QgbSkgew0KKyAgICAgICAgaWYgKG0gPT0gbnVsbCkNCisgICAgICAgICByZXR1cm4gLTE7DQorDQorICAgICAgICBmaW5hbCBpbnQgc3RyQ29tcCA9IGdldE5hbWUoKS5jb21wYXJlVG8obS5nZXROYW1lKCkpOw0KKyAgICAgICAgaWYgKHN0ckNvbXAgIT0gMCkNCisgICAgICAgICAgcmV0dXJuIHN0ckNvbXA7DQorDQorICAgICAgICBmaW5hbCBpbnQgcmV0Q29tcCA9IGdldFJldHVyblR5cGUoKS5nZXROYW1lKCkuY29tcGFyZVRvKG0uZ2V0UmV0dXJuVHlwZSgpLmdldE5hbWUoKSk7DQorICAgICAgICBpZiAocmV0Q29tcCAhPSAwKQ0KKyAgICAgICAgICByZXR1cm4gcmV0Q29tcDsNCisNCisgICAgICAgIENhY2hlZENsYXNzW10gIHBhcmFtcyA9ICAgZ2V0UGFyYW1ldGVyVHlwZXMoKTsNCisgICAgICAgIENhY2hlZENsYXNzIFtdIG1wYXJhbXMgPSBtLmdldFBhcmFtZXRlclR5cGVzKCk7DQorDQorICAgICAgICBmaW5hbCBpbnQgcGQgPSBwYXJhbXMubGVuZ3RoIC0gbXBhcmFtcy5sZW5ndGg7DQorICAgICAgICBpZiAocGQgIT0gMCkNCisgICAgICAgICAgcmV0dXJuIHBkOw0KKw0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgIT0gcGFyYW1zLmxlbmd0aDsgKytpKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGZpbmFsIGludCBuYW1lQ29tcCA9IHBhcmFtc1tpXS5nZXROYW1lKCkuY29tcGFyZVRvKG1wYXJhbXNbaV0uZ2V0TmFtZSgpKTsNCisgICAgICAgICAgICBpZiAobmFtZUNvbXAgIT0gMCkNCisgICAgICAgICAgICAgIHJldHVybiBuYW1lQ29tcDsNCisgICAgICAgIH0NCisNCisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJTaG91bGQgbmV2ZXIgaGFwcGVuIik7DQorICAgIH0NCisNCisgICAgcHJpdmF0ZSBpbnQgY29tcGFyZVRvTWV0aG9kKE1ldGhvZCBtKSB7DQorICAgICAgICBpZiAobSA9PSBudWxsKQ0KKyAgICAgICAgIHJldHVybiAtMTsNCisNCisgICAgICAgIGZpbmFsIGludCBzdHJDb21wID0gZ2V0TmFtZSgpLmNvbXBhcmVUbyhtLmdldE5hbWUoKSk7DQorICAgICAgICBpZiAoc3RyQ29tcCAhPSAwKQ0KKyAgICAgICAgICByZXR1cm4gc3RyQ29tcDsNCisNCisgICAgICAgIGZpbmFsIGludCByZXRDb21wID0gZ2V0UmV0dXJuVHlwZSgpLmdldE5hbWUoKS5jb21wYXJlVG8obS5nZXRSZXR1cm5UeXBlKCkuZ2V0TmFtZSgpKTsNCisgICAgICAgIGlmIChyZXRDb21wICE9IDApDQorICAgICAgICAgIHJldHVybiByZXRDb21wOw0KKw0KKyAgICAgICAgQ2FjaGVkQ2xhc3NbXSAgcGFyYW1zID0gICBnZXRQYXJhbWV0ZXJUeXBlcygpOw0KKyAgICAgICAgQ2xhc3MgW10gbXBhcmFtcyA9IG0uZ2V0UGFyYW1ldGVyVHlwZXMoKTsNCisNCisgICAgICAgIGZpbmFsIGludCBwZCA9IHBhcmFtcy5sZW5ndGggLSBtcGFyYW1zLmxlbmd0aDsNCisgICAgICAgIGlmIChwZCAhPSAwKQ0KKyAgICAgICAgICByZXR1cm4gcGQ7DQorDQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSAhPSBwYXJhbXMubGVuZ3RoOyArK2kpDQorICAgICAgICB7DQorICAgICAgICAgICAgZmluYWwgaW50IG5hbWVDb21wID0gcGFyYW1zW2ldLmdldE5hbWUoKS5jb21wYXJlVG8obXBhcmFtc1tpXS5nZXROYW1lKCkpOw0KKyAgICAgICAgICAgIGlmIChuYW1lQ29tcCAhPSAwKQ0KKyAgICAgICAgICAgICAgcmV0dXJuIG5hbWVDb21wOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7DQorICAgICAgICByZXR1cm4gKG8gaW5zdGFuY2VvZiBDYWNoZWRNZXRob2QgJiYgY2FjaGVkTWV0aG9kLmVxdWFscygoKENhY2hlZE1ldGhvZClvKS5jYWNoZWRNZXRob2QpKQ0KKyAgICAgICAgICAgICAgICB8fCAobyBpbnN0YW5jZW9mIE1ldGhvZCAmJiBjYWNoZWRNZXRob2QuZXF1YWxzKG8pKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgew0KKyAgICAgICAgaWYgKGhhc2hDb2RlID09IDApIHsNCisgICAgICAgICAgIGhhc2hDb2RlID0gY2FjaGVkTWV0aG9kLmhhc2hDb2RlKCk7DQorICAgICAgICAgICBpZiAoaGFzaENvZGUgPT0gMCkNCisgICAgICAgICAgICAgaGFzaENvZGUgPSAweGNhZmViZWJlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIGhhc2hDb2RlOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQorICAgICAgICByZXR1cm4gY2FjaGVkTWV0aG9kLnRvU3RyaW5nKCk7DQorICAgIH0NCisNCisgICAgLy8gU2hvdWxkIGhhdmUgbG9jayBmb3IgZGVjbGFyaW5nQ2xhc3MNCisgICAgcHVibGljIE1ldGFNZXRob2QgZ2V0UmVmbGVjdGlvbk1ldGFNZXRob2QoKSB7DQorICAgICAgICBpZiAocmVmbGVjdGlvbk1ldGFNZXRob2QgPT0gbnVsbCkgew0KKyAgICAgICAgICByZWZsZWN0aW9uTWV0YU1ldGhvZCA9IG5ldyBSZWZsZWN0aW9uTWV0YU1ldGhvZCh0aGlzKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZWZsZWN0aW9uTWV0YU1ldGhvZDsNCisgICAgfQ0KK30NCisNCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9yZWZsZWN0aW9uL0NvbXBsZXhLZXlIYXNoTWFwLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9yZWZsZWN0aW9uL0NvbXBsZXhLZXlIYXNoTWFwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIyNjg1OAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3JlZmxlY3Rpb24vQ29tcGxleEtleUhhc2hNYXAuamF2YQpAQCAtMCwwICsxLDE3NCBAQAorLyoNCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4NCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkucmVmbGVjdGlvbjsNCisNCitpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247DQorDQorcHVibGljIGNsYXNzIENvbXBsZXhLZXlIYXNoTWFwDQorew0KKyAgcHVibGljIHN0YXRpYyBjbGFzcyBFbnRyeSB7DQorICAgIHB1YmxpYyBpbnQgaGFzaDsNCisgICAgcHVibGljIEVudHJ5IG5leHQ7DQorICAgIHB1YmxpYyBPYmplY3QgdmFsdWU7DQorDQorICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7DQorICAgICAgcmV0dXJuIHZhbHVlOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKE9iamVjdCB2YWx1ZSkgew0KKyAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgcHJvdGVjdGVkIEVudHJ5IHRhYmxlIFtdOw0KKw0KKyAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9DQVBBQ0lUWSA9IDMyOw0KKyAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTUlOSU1VTV9DQVBBQ0lUWSA9IDQ7DQorICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBNQVhJTVVNX0NBUEFDSVRZID0gMSA8PCAyODsNCisNCisgIHByb3RlY3RlZCBpbnQgc2l6ZTsNCisgIHByb3RlY3RlZCB0cmFuc2llbnQgaW50IHRocmVzaG9sZDsNCisNCisgIHB1YmxpYyBDb21wbGV4S2V5SGFzaE1hcCgpIHsNCisgICAgICBpbml0KERFRkFVTFRfQ0FQQUNJVFkpOw0KKyAgfQ0KKw0KKyAgICBwdWJsaWMgQ29tcGxleEtleUhhc2hNYXAoYm9vbGVhbiBiKSB7DQorICAgIH0NCisNCisgIHB1YmxpYyBDb21wbGV4S2V5SGFzaE1hcChpbnQgZXhwZWN0ZWRNYXhTaXplKSB7DQorICAgIGluaXQgKGNhcGFjaXR5KGV4cGVjdGVkTWF4U2l6ZSkpOw0KKyAgfQ0KKw0KKyAgcHVibGljIHN0YXRpYyBpbnQgaGFzaChpbnQgaCkgew0KKyAgICBoICs9IH4oaCA8PCA5KTsNCisgICAgaCBePSAgKGggPj4+IDE0KTsNCisgICAgaCArPSAgKGggPDwgNCk7DQorICAgIGggXj0gIChoID4+PiAxMCk7DQorICAgIHJldHVybiBoOw0KKyAgfQ0KKw0KKyAgcHVibGljIGludCBzaXplKCkgew0KKyAgICAgIHJldHVybiBzaXplOw0KKyAgfQ0KKw0KKyAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsNCisgICAgICByZXR1cm4gc2l6ZSA9PSAwOw0KKyAgfQ0KKw0KKyAgcHVibGljIHZvaWQgY2xlYXIoKSB7DQorICAgICAgT2JqZWN0W10gdGFiID0gdGFibGU7DQorICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YWIubGVuZ3RoOyBpKyspDQorICAgICAgICAgIHRhYltpXSA9IG51bGw7DQorICAgICAgc2l6ZSA9IDA7DQorICB9DQorDQorICBwdWJsaWMgdm9pZCBpbml0KGludCBpbml0Q2FwYWNpdHkpIHsNCisgICAgICB0aHJlc2hvbGQgPSAoaW5pdENhcGFjaXR5ICogNikvODsNCisgICAgICB0YWJsZSA9IG5ldyBFbnRyeVtpbml0Q2FwYWNpdHldOw0KKyAgfQ0KKw0KKyAgcHVibGljIHZvaWQgcmVzaXplKGludCBuZXdMZW5ndGgpIHsNCisgICAgICBFbnRyeVtdIG9sZFRhYmxlID0gdGFibGU7DQorICAgICAgaW50IG9sZExlbmd0aCA9IHRhYmxlLmxlbmd0aDsNCisNCisgICAgICBFbnRyeVtdIG5ld1RhYmxlID0gbmV3IEVudHJ5W25ld0xlbmd0aF07DQorDQorICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBvbGRMZW5ndGg7IGorKykgew0KKw0KKyAgICAgICAgZm9yIChFbnRyeSBlID0gb2xkVGFibGUgW2pdOyBlICE9IG51bGw7KSB7DQorICAgICAgICAgIEVudHJ5IG5leHQgPSBlLm5leHQ7DQorICAgICAgICAgIGludCBpbmRleCA9IGUuaGFzaCAmIChuZXdMZW5ndGgtMSk7DQorDQorICAgICAgICAgIGUubmV4dCA9IG5ld1RhYmxlW2luZGV4XTsNCisgICAgICAgICAgbmV3VGFibGUgW2luZGV4XSA9IGU7DQorDQorICAgICAgICAgIGUgPSBuZXh0Ow0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisNCisgICAgICB0YWJsZSA9IG5ld1RhYmxlOw0KKyAgICAgIHRocmVzaG9sZCA9ICg2ICogbmV3TGVuZ3RoKSAvIDg7DQorICB9DQorDQorICBwcml2YXRlIGludCBjYXBhY2l0eShpbnQgZXhwZWN0ZWRNYXhTaXplKSB7DQorICAgICAgLy8gQ29tcHV0ZSBtaW4gY2FwYWNpdHkgZm9yIGV4cGVjdGVkTWF4U2l6ZSBnaXZlbiBhIGxvYWQgZmFjdG9yIG9mIDMvNA0KKyAgICAgIGludCBtaW5DYXBhY2l0eSA9ICg4ICogZXhwZWN0ZWRNYXhTaXplKS82Ow0KKw0KKyAgICAgIC8vIENvbXB1dGUgdGhlIGFwcHJvcHJpYXRlIGNhcGFjaXR5DQorICAgICAgaW50IHJlc3VsdDsNCisgICAgICBpZiAobWluQ2FwYWNpdHkgPiBNQVhJTVVNX0NBUEFDSVRZIHx8IG1pbkNhcGFjaXR5IDwgMCkgew0KKyAgICAgICAgICByZXN1bHQgPSBNQVhJTVVNX0NBUEFDSVRZOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJlc3VsdCA9IE1JTklNVU1fQ0FQQUNJVFk7DQorICAgICAgICAgIHdoaWxlIChyZXN1bHQgPCBtaW5DYXBhY2l0eSkNCisgICAgICAgICAgICAgIHJlc3VsdCA8PD0gMTsNCisgICAgICB9DQorICAgICAgcmV0dXJuIHJlc3VsdDsNCisgIH0NCisNCisgIHB1YmxpYyBpbnRlcmZhY2UgRW50cnlJdGVyYXRvciB7DQorICAgICAgYm9vbGVhbiBoYXNOZXh0ICgpOw0KKyAgICAgIEVudHJ5ICAgbmV4dCAoKTsNCisgIH0NCisNCisNCisgICAgcHVibGljIENvbXBsZXhLZXlIYXNoTWFwLkVudHJ5W10gZ2V0VGFibGUoKSB7DQorICAgICAgICByZXR1cm4gdGFibGU7DQorICAgIH0NCisNCisgIHB1YmxpYyBFbnRyeUl0ZXJhdG9yICBnZXRFbnRyeVNldEl0ZXJhdG9yKCkgew0KKyAgICAgICAgcmV0dXJuIG5ldyBFbnRyeUl0ZXJhdG9yKCkgew0KKyAgICAgICAgICAgIEVudHJ5IG5leHQ7CS8vIG5leHQgZW50cnkgdG8gcmV0dXJuDQorICAgICAgICAgICAgaW50IGluZGV4OwkJLy8gY3VycmVudCBzbG90DQorICAgICAgICAgICAgRW50cnkgY3VycmVudDsJLy8gY3VycmVudCBlbnRyeQ0KKw0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgRW50cnlbXSB0ID0gdGFibGU7DQorICAgICAgICAgICAgICAgIGludCBpID0gdC5sZW5ndGg7DQorICAgICAgICAgICAgICAgIEVudHJ5IG4gPSBudWxsOw0KKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSAhPSAwKSB7IC8vIGFkdmFuY2UgdG8gZmlyc3QgZW50cnkNCisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpID4gMCAmJiAobiA9IHRbLS1pXSkgPT0gbnVsbCkge30NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBuZXh0ID0gbjsNCisgICAgICAgICAgICAgICAgaW5kZXggPSBpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gbmV4dCAhPSBudWxsOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBwdWJsaWMgRW50cnkgbmV4dCgpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIG5leHRFbnRyeSgpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBFbnRyeSBuZXh0RW50cnkoKSB7DQorICAgICAgICAgICAgICAgIEVudHJ5IGUgPSBuZXh0Ow0KKyAgICAgICAgICAgICAgICBpZiAoZSA9PSBudWxsKQ0KKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsNCisNCisgICAgICAgICAgICAgICAgRW50cnkgbiA9IGUubmV4dDsNCisgICAgICAgICAgICAgICAgRW50cnlbXSB0ID0gdGFibGU7DQorICAgICAgICAgICAgICAgIGludCBpID0gaW5kZXg7DQorICAgICAgICAgICAgICAgIHdoaWxlIChuID09IG51bGwgJiYgaSA+IDApDQorICAgICAgICAgICAgICAgICAgICBuID0gdFstLWldOw0KKyAgICAgICAgICAgICAgICBpbmRleCA9IGk7DQorICAgICAgICAgICAgICAgIG5leHQgPSBuOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudCA9IGU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfTsNCisgIH0NCit9DQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcmVmbGVjdGlvbi9Eb3VibGVLZXlIYXNoTWFwLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9yZWZsZWN0aW9uL0RvdWJsZUtleUhhc2hNYXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGE3MmNhCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcmVmbGVjdGlvbi9Eb3VibGVLZXlIYXNoTWFwLmphdmEKQEAgLTAsMCArMSw5MCBAQAorLyoNCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4NCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkucmVmbGVjdGlvbjsNCisNCitwdWJsaWMgY2xhc3MgRG91YmxlS2V5SGFzaE1hcCBleHRlbmRzIENvbXBsZXhLZXlIYXNoTWFwDQorew0KKyAgcHVibGljIHN0YXRpYyBjbGFzcyBFbnRyeSBleHRlbmRzIENvbXBsZXhLZXlIYXNoTWFwLkVudHJ5ew0KKyAgICBwdWJsaWMgT2JqZWN0IGtleTEsIGtleTI7DQorICB9DQorDQorICBwdWJsaWMgZmluYWwgT2JqZWN0IGdldChPYmplY3Qga2V5MSwgT2JqZWN0IGtleTIpIHsNCisgICAgaW50IGggPSBoYXNoICgzMSprZXkxLmhhc2hDb2RlKCkra2V5Mi5oYXNoQ29kZSgpKTsNCisgICAgQ29tcGxleEtleUhhc2hNYXAuRW50cnkgZSA9IHRhYmxlIFtoICYgKHRhYmxlLmxlbmd0aC0xKV07DQorICAgIGZvciAoOyBlICE9IG51bGw7IGUgPSBlLm5leHQpDQorICAgICAgaWYgKGUuaGFzaCA9PSBoICYmIGNoZWNrRXF1YWxzKChFbnRyeSkgZSwga2V5MSwga2V5MikpDQorICAgICAgICByZXR1cm4gZTsNCisNCisgICAgcmV0dXJuIG51bGw7DQorICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGNoZWNrRXF1YWxzKENvbXBsZXhLZXlIYXNoTWFwLkVudHJ5IGUsIE9iamVjdCBrZXkxLCBPYmplY3Qga2V5Mikgew0KKyAgICAgICAgRW50cnkgZWUgPSAoRW50cnkpIGU7DQorICAgICAgICByZXR1cm4gZWUua2V5MSA9PSBrZXkxICYmIGVlLmtleTIgPT0ga2V5MjsNCisgICAgfQ0KKw0KKyAgcHVibGljIEVudHJ5IGdldE9yUHV0KE9iamVjdCBrZXkxLCBPYmplY3Qga2V5MikNCisgIHsNCisgICAgaW50IGggPSBoYXNoICgzMSprZXkxLmhhc2hDb2RlKCkra2V5Mi5oYXNoQ29kZSgpKTsNCisgICAgZmluYWwgaW50IGluZGV4ID0gaCAmICh0YWJsZS5sZW5ndGggLSAxKTsNCisgICAgQ29tcGxleEtleUhhc2hNYXAuRW50cnkgZSA9IHRhYmxlIFtpbmRleF07DQorICAgIGZvciAoOyBlICE9IG51bGw7IGUgPSBlLm5leHQpDQorICAgICAgaWYgKGUuaGFzaCA9PSBoICYmIGNoZWNrRXF1YWxzKCBlLCBrZXkxLCBrZXkyKSkNCisgICAgICAgIHJldHVybiAoRW50cnkpIGU7DQorDQorICAgIENvbXBsZXhLZXlIYXNoTWFwLkVudHJ5IGVudHJ5ID0gY3JlYXRlRW50cnkoa2V5MSwga2V5MiwgaCwgaW5kZXgpOw0KKyAgICB0YWJsZSBbaW5kZXhdID0gZW50cnk7DQorDQorICAgIGlmICggKytzaXplID09IHRocmVzaG9sZCApDQorICAgICAgcmVzaXplKDIqdGFibGUubGVuZ3RoKTsNCisNCisgICAgcmV0dXJuIChFbnRyeSkgZW50cnk7DQorICB9DQorDQorICBwcml2YXRlIENvbXBsZXhLZXlIYXNoTWFwLkVudHJ5IGNyZWF0ZUVudHJ5KE9iamVjdCBrZXkxLCBPYmplY3Qga2V5MiwgaW50IGgsIGludCBpbmRleCkNCisgIHsNCisgICAgRW50cnkgZW50cnkgPSBjcmVhdGVFbnRyeSAoKTsNCisgICAgZW50cnkubmV4dCA9IHRhYmxlIFtpbmRleF07DQorICAgIGVudHJ5Lmhhc2ggPSBoOw0KKyAgICBlbnRyeS5rZXkxID0ga2V5MTsNCisgICAgZW50cnkua2V5MiA9IGtleTI7DQorICAgIHJldHVybiBlbnRyeTsNCisgIH0NCisNCisgIHB1YmxpYyBFbnRyeSBjcmVhdGVFbnRyeSgpIHsNCisgICAgICByZXR1cm4gbmV3IEVudHJ5ICgpOw0KKyAgfQ0KKw0KKyAgcHVibGljIGZpbmFsIENvbXBsZXhLZXlIYXNoTWFwLkVudHJ5IHJlbW92ZShPYmplY3Qga2V5MSwgT2JqZWN0IGtleTIpIHsNCisgICAgaW50IGggPSBoYXNoICgzMSprZXkxLmhhc2hDb2RlKCkra2V5Mi5oYXNoQ29kZSgpKTsNCisgICAgaW50IGluZGV4ID0gaCAmICh0YWJsZS5sZW5ndGggLTEpOw0KKyAgICBmb3IgKENvbXBsZXhLZXlIYXNoTWFwLkVudHJ5IGUgPSB0YWJsZSBbaW5kZXhdLCBwcmV2ID0gbnVsbDsgZSAhPSBudWxsOyBwcmV2ID0gZSwgZSA9IGUubmV4dCApIHsNCisgICAgICBpZiAoZS5oYXNoID09IGggJiYgY2hlY2tFcXVhbHMoKEVudHJ5KSBlLCBrZXkxLCBrZXkyKSkgew0KKyAgICAgICAgaWYgKHByZXYgPT0gbnVsbCkNCisgICAgICAgICAgdGFibGUgW2luZGV4XSA9IGUubmV4dDsNCisgICAgICAgIGVsc2UNCisgICAgICAgICAgcHJldi5uZXh0ID0gZS5uZXh0Ow0KKyAgICAgICAgc2l6ZS0tOw0KKw0KKyAgICAgICAgZS5uZXh0ID0gbnVsbDsNCisgICAgICAgIHJldHVybiBlOw0KKyAgICAgIH0NCisgICAgfQ0KKw0KKyAgICByZXR1cm4gbnVsbDsNCisgIH0NCisNCit9DQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcmVmbGVjdGlvbi9GYXN0QXJyYXkuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3JlZmxlY3Rpb24vRmFzdEFycmF5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcwODIwZAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3JlZmxlY3Rpb24vRmFzdEFycmF5LmphdmEKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJlZmxlY3Rpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgRmFzdEFycmF5IGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKKyAgICBwcml2YXRlIE9iamVjdFtdIGRhdGE7CisgICAgcHVibGljIGludCBzaXplOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRmFzdEFycmF5IEVNUFRZX0xJU1QgPSBuZXcgRmFzdEFycmF5KDApOworCisgICAgcHVibGljIEZhc3RBcnJheShpbnQgaW5pdGlhbENhcGFjaXR5KSB7CisgICAgICAgIGRhdGEgPSBuZXcgT2JqZWN0W2luaXRpYWxDYXBhY2l0eV07CisgICAgfQorCisgICAgcHVibGljIEZhc3RBcnJheSgpIHsKKyAgICAgICB0aGlzICg4KTsKKyAgICB9CisKKyAgICBwdWJsaWMgRmFzdEFycmF5KENvbGxlY3Rpb24gYykgeworICAgICAgICB0aGlzIChjLnRvQXJyYXkoKSk7CisgICAgfQorCisgICAgcHVibGljIEZhc3RBcnJheShPYmplY3RbXSBvYmplY3RzKSB7CisgICAgICAgIGRhdGEgPSBvYmplY3RzOworICAgICAgICBzaXplID0gb2JqZWN0cy5sZW5ndGg7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXQoaW50IGluZGV4KSB7CisgICAgICAgIHJldHVybiBkYXRhIFtpbmRleF07CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkKE9iamVjdCBvKSB7CisgICAgICAgIGlmIChzaXplID09IGRhdGEubGVuZ3RoKSB7CisgICAgICAgICAgICBPYmplY3QgW10gbmV3RGF0YSA9IG5ldyBPYmplY3Rbc2l6ZSA9PSAwID8gOCA6IHNpemUqMl07CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIDAsIG5ld0RhdGEsIDAsIHNpemUpOworICAgICAgICAgICAgZGF0YSA9IG5ld0RhdGE7CisgICAgICAgIH0KKyAgICAgICAgZGF0YSBbc2l6ZSsrXSA9IG87CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0KGludCBpbmRleCwgT2JqZWN0IG8pIHsKKyAgICAgICAgZGF0YSBbaW5kZXhdID0gbzsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgICAgIHJldHVybiBzaXplOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICBkYXRhID0gbmV3IE9iamVjdFtkYXRhLmxlbmd0aF07CisgICAgICAgIHNpemUgPSAwOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZEFsbChGYXN0QXJyYXkgbmV3RGF0YSkgeworICAgICAgICBhZGRBbGwobmV3RGF0YS5kYXRhLCBuZXdEYXRhLnNpemUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZEFsbChPYmplY3QgW10gbmV3RGF0YSwgaW50IHNpemUpIHsKKyAgICAgICAgaWYgKHNpemUgPT0gMCkKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIGZpbmFsIGludCBuZXdTaXplID0gdGhpcy5zaXplICsgc2l6ZTsKKyAgICAgICAgaWYgKG5ld1NpemUgPiBkYXRhLmxlbmd0aCkgeworICAgICAgICAgICAgT2JqZWN0IG5kIFtdID0gbmV3IE9iamVjdCBbbmV3U2l6ZV07CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIDAsIG5kLCAwLCB0aGlzLnNpemUpOworICAgICAgICAgICAgZGF0YSA9IG5kOworICAgICAgICB9CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobmV3RGF0YSwgMCwgZGF0YSwgdGhpcy5zaXplLCBzaXplKTsKKyAgICAgICAgdGhpcy5zaXplID0gbmV3U2l6ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgRmFzdEFycmF5IGNvcHkoKSB7CisgICAgICAgIGZpbmFsIE9iamVjdFtdIG5ld0RhdGEgPSBuZXcgT2JqZWN0W3NpemVdOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIDAsIG5ld0RhdGEsIDAsIHNpemUpOworICAgICAgICByZXR1cm4gbmV3IEZhc3RBcnJheShuZXdEYXRhKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgeworICAgICAgICByZXR1cm4gc2l6ZSA9PSAwOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZEFsbChMaXN0IGNvbGwpIHsKKyAgICAgICAgZmluYWwgT2JqZWN0W10gbmV3RGF0YSA9IGNvbGwudG9BcnJheSgpOworICAgICAgICBhZGRBbGwobmV3RGF0YSwgbmV3RGF0YS5sZW5ndGgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZShpbnQgaW5kZXgpIHsKKyAgICAgICAgaW50IG51bU1vdmVkID0gc2l6ZSAtIGluZGV4IC0gMTsKKyAgICAgICAgaWYgKG51bU1vdmVkID4gMCkKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZGF0YSwgaW5kZXgrMSwgZGF0YSwgaW5kZXgsIG51bU1vdmVkKTsKKyAgICAgICAgZGF0YVstLXNpemVdID0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdCB0b0xpc3QgKCkgeworICAgICAgICByZXR1cm4gbmV3IEFic3RyYWN0TGlzdCgpIHsKKworICAgICAgICAgICAgcHVibGljIE9iamVjdCBnZXQoaW50IGluZGV4KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZhc3RBcnJheS50aGlzLmdldChpbmRleCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0W10gZ2V0QXJyYXkoKSB7CisgICAgICAgIHJldHVybiBkYXRhOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIGlmIChzaXplKCkgPT0gMCkgcmV0dXJuICJbXSI7CisgICAgICAgIHJldHVybiB0b0xpc3QoKS50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3JlZmxlY3Rpb24vUGFyYW1ldGVyVHlwZXMuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3JlZmxlY3Rpb24vUGFyYW1ldGVyVHlwZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTkwZjdkCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcmVmbGVjdGlvbi9QYXJhbWV0ZXJUeXBlcy5qYXZhCkBAIC0wLDAgKzEsMTgwIEBACisvKg0KKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLg0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5yZWZsZWN0aW9uOw0KKw0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5Lkdyb292eUJ1Z0Vycm9yOw0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuTWV0YUNsYXNzSGVscGVyOw0KKw0KK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsNCisNCitwdWJsaWMgY2xhc3MgUGFyYW1ldGVyVHlwZXMNCit7DQorICBwcm90ZWN0ZWQgQ2xhc3MgW10gbmF0aXZlUGFyYW1UeXBlczsNCisgIHByb3RlY3RlZCBDYWNoZWRDbGFzcyBbXSBwYXJhbWV0ZXJUeXBlczsNCisNCisgICAgcHVibGljIFBhcmFtZXRlclR5cGVzICgpIHsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgUGFyYW1ldGVyVHlwZXMoQ2xhc3MgcHQgW10pIHsNCisgICAgICAgIG5hdGl2ZVBhcmFtVHlwZXMgPSBwdDsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgUGFyYW1ldGVyVHlwZXMoQ2FjaGVkQ2xhc3NbXSBwYXJhbWV0ZXJUeXBlcykgew0KKyAgICAgICAgdGhpcy5wYXJhbWV0ZXJUeXBlcyA9IHBhcmFtZXRlclR5cGVzOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBDYWNoZWRDbGFzc1tdIGdldFBhcmFtZXRlclR5cGVzKCkgew0KKyAgICAgIGlmIChwYXJhbWV0ZXJUeXBlcyA9PSBudWxsKSB7DQorICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsNCisgICAgICAgICAgaWYgKHBhcmFtZXRlclR5cGVzICE9IG51bGwpDQorICAgICAgICAgICAgcmV0dXJuIHBhcmFtZXRlclR5cGVzOw0KKw0KKyAgICAgICAgICBDbGFzcyBbXSBucHQgPSBuYXRpdmVQYXJhbVR5cGVzID09IG51bGwgPyBnZXRQVCgpIDogbmF0aXZlUGFyYW1UeXBlczsNCisNCisgICAgICAgICAgQ2FjaGVkQ2xhc3MgW10gcHQgPSBuZXcgQ2FjaGVkQ2xhc3MgW25wdC5sZW5ndGhdOw0KKyAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSAhPSBucHQubGVuZ3RoOyArK2kpDQorICAgICAgICAgICAgcHRbaV0gPSBSZWZsZWN0aW9uQ2FjaGUuZ2V0Q2FjaGVkQ2xhc3MobnB0W2ldKTsNCisNCisgICAgICAgICAgbmF0aXZlUGFyYW1UeXBlcyA9IG5wdDsNCisgICAgICAgICAgcGFyYW1ldGVyVHlwZXMgPSBwdDsNCisgICAgICAgIH0NCisgICAgICB9DQorDQorICAgICAgcmV0dXJuIHBhcmFtZXRlclR5cGVzOw0KKyAgfQ0KKw0KKyAgICBwdWJsaWMgQ2xhc3NbXSBnZXROYXRpdmVQYXJhbWV0ZXJUeXBlcygpIHsNCisgICAgICAgIGlmIChuYXRpdmVQYXJhbVR5cGVzID09IG51bGwpIHsNCisgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7DQorICAgICAgICAgICAgaWYgKG5hdGl2ZVBhcmFtVHlwZXMgIT0gbnVsbCkNCisgICAgICAgICAgICAgIHJldHVybiBuYXRpdmVQYXJhbVR5cGVzOw0KKw0KKyAgICAgICAgICAgIENsYXNzIFtdIG5wdDsNCisgICAgICAgICAgICBpZiAocGFyYW1ldGVyVHlwZXMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICBucHQgPSBuZXcgQ2xhc3MgW3BhcmFtZXRlclR5cGVzLmxlbmd0aF07DQorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpICE9IHBhcmFtZXRlclR5cGVzLmxlbmd0aDsgKytpKSB7DQorICAgICAgICAgICAgICAgICAgICBucHRbaV0gPSBwYXJhbWV0ZXJUeXBlc1tpXS5nZXRDYWNoZWRDbGFzcygpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgIG5wdCA9IGdldFBUICgpOw0KKyAgICAgICAgICAgIG5hdGl2ZVBhcmFtVHlwZXMgPSBucHQ7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBuYXRpdmVQYXJhbVR5cGVzOw0KKyAgICB9DQorDQorICAgIENsYXNzW10gZ2V0UFQoKSB7IHJldHVybiBudWxsOyB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGlzVmFyZ3NNZXRob2QoT2JqZWN0W10gYXJndW1lbnRzKSB7DQorICAgICAgICBnZXRQYXJhbWV0ZXJUeXBlcygpOw0KKyAgICAgICAgaWYgKHBhcmFtZXRlclR5cGVzLmxlbmd0aCA9PSAwKSByZXR1cm4gZmFsc2U7DQorICAgICAgICBmaW5hbCBpbnQgbGVuTWludXMxID0gcGFyYW1ldGVyVHlwZXMubGVuZ3RoIC0gMTsNCisgICAgICAgIGlmICghcGFyYW1ldGVyVHlwZXNbbGVuTWludXMxXS5pc0FycmF5KSByZXR1cm4gZmFsc2U7DQorICAgICAgICAvLyAtMSBiZWNhdXNlIHRoZSB2YXJnIHBhcnQgaXMgb3B0aW9uYWwNCisgICAgICAgIGlmIChsZW5NaW51czEgPT0gYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRydWU7DQorICAgICAgICBpZiAobGVuTWludXMxID4gYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiBwYXJhbWV0ZXJUeXBlcy5sZW5ndGgpIHJldHVybiB0cnVlOw0KKw0KKyAgICAgICAgLy8gb25seSBjYXNlIGxlZnQgaXMgYXJndW1lbnRzLmxlbmd0aCA9PSBwYXJhbWV0ZXJUeXBlcy5sZW5ndGgNCisgICAgICAgIE9iamVjdCBsYXN0ID0gYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXTsNCisgICAgICAgIGlmIChsYXN0ID09IG51bGwpIHJldHVybiB0cnVlOw0KKyAgICAgICAgQ2xhc3MgY2xhenogPSBsYXN0LmdldENsYXNzKCk7DQorICAgICAgICByZXR1cm4gIWNsYXp6LmVxdWFscyhwYXJhbWV0ZXJUeXBlc1tsZW5NaW51czFdLmdldENhY2hlZENsYXNzKCkpOw0KKw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBPYmplY3RbXSBjb2VyY2VBcmd1bWVudHNUb0NsYXNzZXMoT2JqZWN0W10gYXJndW1lbnRBcnJheSkgew0KKyAgICAgICAgZ2V0UGFyYW1ldGVyVHlwZXMoKTsNCisgICAgICAgIC8vIGNvcnJlY3QgYXJndW1lbnRBcnJheSdzIGxlbmd0aA0KKyAgICAgICAgaWYgKGFyZ3VtZW50QXJyYXkgPT0gbnVsbCkgew0KKyAgICAgICAgICAgIGFyZ3VtZW50QXJyYXkgPSBNZXRhQ2xhc3NIZWxwZXIuRU1QVFlfQVJSQVk7DQorICAgICAgICB9IGVsc2UgaWYgKHBhcmFtZXRlclR5cGVzLmxlbmd0aCA9PSAxICYmIGFyZ3VtZW50QXJyYXkubGVuZ3RoID09IDApIHsNCisgICAgICAgICAgICBpZiAoaXNWYXJnc01ldGhvZChhcmd1bWVudEFycmF5KSkgew0KKyAgICAgICAgICAgICAgICBhcmd1bWVudEFycmF5ID0gbmV3IE9iamVjdFtde0FycmF5Lm5ld0luc3RhbmNlKHBhcmFtZXRlclR5cGVzWzBdLmdldENhY2hlZENsYXNzKCkuZ2V0Q29tcG9uZW50VHlwZSgpLCAwKX07DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgYXJndW1lbnRBcnJheSA9IE1ldGFDbGFzc0hlbHBlci5BUlJBWV9XSVRIX05VTEw7DQorICAgICAgICB9IGVsc2UgaWYgKGlzVmFyZ3NNZXRob2QoYXJndW1lbnRBcnJheSkpIHsNCisgICAgICAgICAgICBhcmd1bWVudEFycmF5ID0gZml0VG9WYXJncyhhcmd1bWVudEFycmF5LCBwYXJhbWV0ZXJUeXBlcyk7DQorICAgICAgICB9DQorDQorICAgICAgICAvL2NvcnJlY3QgVHlwZQ0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudEFycmF5Lmxlbmd0aDsgaSsrKSB7DQorICAgICAgICAgICAgT2JqZWN0IGFyZ3VtZW50ID0gYXJndW1lbnRBcnJheVtpXTsNCisgICAgICAgICAgICBpZiAoYXJndW1lbnQgPT0gbnVsbCkgY29udGludWU7DQorICAgICAgICAgICAgQ2FjaGVkQ2xhc3MgcGFyYW1ldGVyVHlwZSA9IHBhcmFtZXRlclR5cGVzW2ldOw0KKyAgICAgICAgICAgIGlmIChSZWZsZWN0aW9uQ2FjaGUuaXNBc3NpZ25hYmxlRnJvbShwYXJhbWV0ZXJUeXBlLmdldENhY2hlZENsYXNzKCksIGFyZ3VtZW50LmdldENsYXNzKCkpKSBjb250aW51ZTsNCisNCisgICAgICAgICAgICBhcmd1bWVudCA9IHBhcmFtZXRlclR5cGUuY29lcmNlR1N0cmluZyhhcmd1bWVudCk7DQorICAgICAgICAgICAgYXJndW1lbnQgPSBwYXJhbWV0ZXJUeXBlLmNvZXJjZU51bWJlcihhcmd1bWVudCk7DQorICAgICAgICAgICAgYXJndW1lbnQgPSBwYXJhbWV0ZXJUeXBlLmNvZXJjZUFycmF5KGFyZ3VtZW50KTsNCisgICAgICAgICAgICBhcmd1bWVudEFycmF5W2ldID0gYXJndW1lbnQ7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gYXJndW1lbnRBcnJheTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogdGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIG51bWJlciBvZiBhcmd1bWVudHMgdG8gYSBtZXRob2QgaXMgZ3JlYXRlciB0aGFuIDENCisgICAgICogYW5kIGlmIHRoZSBtZXRob2QgaXMgYSB2YXJncyBtZXRob2QuIFRoaXMgbWV0aG9kIHdpbGwgdGhlbiB0cmFuc2Zvcm0gdGhlIGdpdmVuDQorICAgICAqIGFyZ3VtZW50cyB0byBtYWtlIHRoZSBtZXRob2QgY2FsbGFibGUNCisgICAgICoNCisgICAgICogQHBhcmFtIGFyZ3VtZW50QXJyYXkgdGhlIGFyZ3VtZW50cyB1c2VkIHRvIGNhbGwgdGhlIG1ldGhvZA0KKyAgICAgKiBAcGFyYW0gcGFyYW1UeXBlcyAgICB0aGUgdHlwZXMgb2YgdGhlIHBhcmFtdGVycyB0aGUgbWV0aG9kIHRha2VzDQorICAgICAqLw0KKyAgICBwcml2YXRlIHN0YXRpYyBPYmplY3RbXSBmaXRUb1ZhcmdzKE9iamVjdFtdIGFyZ3VtZW50QXJyYXksIENhY2hlZENsYXNzW10gcGFyYW1UeXBlcykgew0KKyAgICAgICAgQ2xhc3MgdmFyZ3NDbGFzcyA9IFJlZmxlY3Rpb25DYWNoZS5hdXRvYm94VHlwZShwYXJhbVR5cGVzW3BhcmFtVHlwZXMubGVuZ3RoIC0gMV0uZ2V0Q2FjaGVkQ2xhc3MoKS5nZXRDb21wb25lbnRUeXBlKCkpOw0KKw0KKyAgICAgICAgaWYgKGFyZ3VtZW50QXJyYXkubGVuZ3RoID09IHBhcmFtVHlwZXMubGVuZ3RoIC0gMSkgew0KKyAgICAgICAgICAgIC8vIHRoZSB2YXJncyBhcmd1bWVudCBpcyBtaXNzaW5nLCBzbyBmaWxsIGl0IHdpdGggYW4gZW1wdHkgYXJyYXkNCisgICAgICAgICAgICBPYmplY3RbXSBuZXdBcmdzID0gbmV3IE9iamVjdFtwYXJhbVR5cGVzLmxlbmd0aF07DQorICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShhcmd1bWVudEFycmF5LCAwLCBuZXdBcmdzLCAwLCBhcmd1bWVudEFycmF5Lmxlbmd0aCk7DQorICAgICAgICAgICAgT2JqZWN0IHZhcmdzID0gTWV0YUNsYXNzSGVscGVyLm1ha2VBcnJheShudWxsLCB2YXJnc0NsYXNzLCAwKTsNCisgICAgICAgICAgICBuZXdBcmdzW25ld0FyZ3MubGVuZ3RoIC0gMV0gPSB2YXJnczsNCisgICAgICAgICAgICByZXR1cm4gbmV3QXJnczsNCisgICAgICAgIH0gZWxzZSBpZiAoYXJndW1lbnRBcnJheS5sZW5ndGggPT0gcGFyYW1UeXBlcy5sZW5ndGgpIHsNCisgICAgICAgICAgICAvLyB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBpcyBjb3JyZWN0LCBidXQgaWYgdGhlIGxhc3QgYXJndW1lbnQNCisgICAgICAgICAgICAvLyBpcyBubyBhcnJheSB3ZSBoYXZlIHRvIHdyYXAgaXQgaW4gYSBhcnJheS4gSWYgdGhlIGxhc3QgYXJndW1lbnQNCisgICAgICAgICAgICAvLyBpcyBudWxsLCB0aGVuIHdlIGRvbid0IGhhdmUgdG8gZG8gYW55dGhpbmcNCisgICAgICAgICAgICBPYmplY3QgbGFzdEFyZ3VtZW50ID0gYXJndW1lbnRBcnJheVthcmd1bWVudEFycmF5Lmxlbmd0aCAtIDFdOw0KKyAgICAgICAgICAgIGlmIChsYXN0QXJndW1lbnQgIT0gbnVsbCAmJiAhbGFzdEFyZ3VtZW50LmdldENsYXNzKCkuaXNBcnJheSgpKSB7DQorICAgICAgICAgICAgICAgIC8vIG5vIGFycmF5IHNvIHdyYXAgaXQNCisgICAgICAgICAgICAgICAgT2JqZWN0IHdyYXBwZWQgPSBNZXRhQ2xhc3NIZWxwZXIubWFrZUFycmF5KGxhc3RBcmd1bWVudCwgdmFyZ3NDbGFzcywgMSk7DQorICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYXJndW1lbnRBcnJheSwgYXJndW1lbnRBcnJheS5sZW5ndGggLSAxLCB3cmFwcGVkLCAwLCAxKTsNCisgICAgICAgICAgICAgICAgT2JqZWN0W10gbmV3QXJncyA9IG5ldyBPYmplY3RbcGFyYW1UeXBlcy5sZW5ndGhdOw0KKyAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGFyZ3VtZW50QXJyYXksIDAsIG5ld0FyZ3MsIDAsIHBhcmFtVHlwZXMubGVuZ3RoIC0gMSk7DQorICAgICAgICAgICAgICAgIG5ld0FyZ3NbbmV3QXJncy5sZW5ndGggLSAxXSA9IHdyYXBwZWQ7DQorICAgICAgICAgICAgICAgIHJldHVybiBuZXdBcmdzOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIC8vIHdlIG1heSBoYXZlIHRvIGJveCB0aGUgYXJndWVtbnQhDQorICAgICAgICAgICAgICAgIHJldHVybiBhcmd1bWVudEFycmF5Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSBpZiAoYXJndW1lbnRBcnJheS5sZW5ndGggPiBwYXJhbVR5cGVzLmxlbmd0aCkgew0KKyAgICAgICAgICAgIC8vIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIGlzIHRvbyBiaWcsIHdyYXAgYWxsIGV4Y2VlZGluZyBlbGVtZW50cw0KKyAgICAgICAgICAgIC8vIGluIGFuIGFycmF5LCBidXQga2VlcCB0aGUgb2xkIGVsZW1lbnRzIHRoYXQgYXJlIG5vIHZhcmdzDQorICAgICAgICAgICAgT2JqZWN0W10gbmV3QXJncyA9IG5ldyBPYmplY3RbcGFyYW1UeXBlcy5sZW5ndGhdOw0KKyAgICAgICAgICAgIC8vIGNvcHkgYXJndW1lbnRzIHRoYXQgYXJlIG5vdCBhIHZhcmcNCisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGFyZ3VtZW50QXJyYXksIDAsIG5ld0FyZ3MsIDAsIHBhcmFtVHlwZXMubGVuZ3RoIC0gMSk7DQorICAgICAgICAgICAgLy8gY3JlYXRlIGEgbmV3IGFycmF5IGZvciB0aGUgdmFyZ3MgYW5kIGNvcHkgdGhlbQ0KKyAgICAgICAgICAgIGludCBudW1iZXJPZlZhcmdzID0gYXJndW1lbnRBcnJheS5sZW5ndGggLSBwYXJhbVR5cGVzLmxlbmd0aDsNCisgICAgICAgICAgICBPYmplY3QgdmFyZ3MgPSBNZXRhQ2xhc3NIZWxwZXIubWFrZUNvbW1vbkFycmF5KGFyZ3VtZW50QXJyYXksIHBhcmFtVHlwZXMubGVuZ3RoIC0gMSwgdmFyZ3NDbGFzcyk7DQorICAgICAgICAgICAgbmV3QXJnc1tuZXdBcmdzLmxlbmd0aCAtIDFdID0gdmFyZ3M7DQorICAgICAgICAgICAgcmV0dXJuIG5ld0FyZ3M7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHRocm93IG5ldyBHcm9vdnlCdWdFcnJvcigidHJ5aW5nIHRvIGNhbGwgYSB2YXJncyBtZXRob2Qgd2l0aG91dCBlbm91Z2ggYXJndW1lbnRzIik7DQorICAgICAgICB9DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcmVmbGVjdGlvbi9SZWZsZWN0aW9uQ2FjaGUuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3JlZmxlY3Rpb24vUmVmbGVjdGlvbkNhY2hlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZiMDgzMwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3JlZmxlY3Rpb24vUmVmbGVjdGlvbkNhY2hlLmphdmEKQEAgLTAsMCArMSwxNTEgQEAKKy8qDQorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJlZmxlY3Rpb247DQorDQoraW1wb3J0IGphdmEubGFuZy5yZWYuU29mdFJlZmVyZW5jZTsNCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQoraW1wb3J0IGphdmEudXRpbC5NYXA7DQoraW1wb3J0IGphdmEudXRpbC5XZWFrSGFzaE1hcDsNCisNCitwdWJsaWMgY2xhc3MgUmVmbGVjdGlvbkNhY2hlIHsNCisgICAgcHJpdmF0ZSBzdGF0aWMgTWFwIHByaW1pdGl2ZVR5cGVzTWFwID0gbmV3IEhhc2hNYXAoKTsNCisNCisgICAgc3RhdGljIHsNCisgICAgICAgIHByaW1pdGl2ZVR5cGVzTWFwLnB1dChieXRlLmNsYXNzLCBCeXRlLmNsYXNzKTsNCisgICAgICAgIHByaW1pdGl2ZVR5cGVzTWFwLnB1dChib29sZWFuLmNsYXNzLCBCb29sZWFuLmNsYXNzKTsNCisgICAgICAgIHByaW1pdGl2ZVR5cGVzTWFwLnB1dChjaGFyLmNsYXNzLCBDaGFyYWN0ZXIuY2xhc3MpOw0KKyAgICAgICAgcHJpbWl0aXZlVHlwZXNNYXAucHV0KGRvdWJsZS5jbGFzcywgRG91YmxlLmNsYXNzKTsNCisgICAgICAgIHByaW1pdGl2ZVR5cGVzTWFwLnB1dChmbG9hdC5jbGFzcywgRmxvYXQuY2xhc3MpOw0KKyAgICAgICAgcHJpbWl0aXZlVHlwZXNNYXAucHV0KGludC5jbGFzcywgSW50ZWdlci5jbGFzcyk7DQorICAgICAgICBwcmltaXRpdmVUeXBlc01hcC5wdXQobG9uZy5jbGFzcywgTG9uZy5jbGFzcyk7DQorICAgICAgICBwcmltaXRpdmVUeXBlc01hcC5wdXQoc2hvcnQuY2xhc3MsIFNob3J0LmNsYXNzKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgc3RhdGljIENsYXNzIGF1dG9ib3hUeXBlKENsYXNzIHR5cGUpIHsNCisgICAgICAgIGZpbmFsIENsYXNzIHJlcyA9IChDbGFzcykgcHJpbWl0aXZlVHlwZXNNYXAuZ2V0KHR5cGUpOw0KKyAgICAgICAgcmV0dXJuIHJlcyA9PSBudWxsID8gdHlwZSA6IHJlczsNCisvKg0KKyAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IHR5cGUuZ2V0TmFtZSgpOw0KKyAgICBzd2l0Y2ggKG5hbWUuY2hhckF0KDApKSB7DQorICAgICAgIGNhc2UgJ2InOg0KKyAgICAgICAgICAgaWYgKCJib29sZWFuIi5lcXVhbHMobmFtZSkpDQorICAgICAgICAgICAgIHJldHVybiBCb29sZWFuLmNsYXNzOw0KKyAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICBpZiAoImJ5dGUiLmVxdWFscyhuYW1lKSkNCisgICAgICAgICAgICAgICByZXR1cm4gQnl0ZS5jbGFzczsNCisgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KKw0KKyAgICAgICBjYXNlICdjJzoNCisgICAgICAgICByZXR1cm4gImNoYXIiLmVxdWFscyhuYW1lKSA/IENoYXJhY3Rlci5jbGFzcyA6IG51bGw7DQorDQorICAgICAgIGNhc2UgJ2QnOg0KKyAgICAgICAgICByZXR1cm4gImRvdWJsZSIuZXF1YWxzKG5hbWUpID8gRG91YmxlLmNsYXNzIDogbnVsbDsNCisNCisgICAgICBjYXNlICdmJzoNCisgICAgICAgIHJldHVybiAiZmxvYXQiLmVxdWFscyhuYW1lKSA/IEZsb2F0LmNsYXNzIDogbnVsbDsNCisNCisgICAgICBjYXNlICdpJzoNCisgICAgICAgIHJldHVybiAiaW50Ii5lcXVhbHMobmFtZSkgPyBJbnRlZ2VyLmNsYXNzIDogbnVsbDsNCisNCisgICAgICBjYXNlICdsJzoNCisgICAgICAgIHJldHVybiAibG9uZyIuZXF1YWxzKG5hbWUpID8gTG9uZy5jbGFzcyA6IG51bGw7DQorDQorICAgICAgY2FzZSAncyc6DQorICAgICAgICByZXR1cm4gInNob3J0Ii5lcXVhbHMobmFtZSkgPyBTaG9ydC5jbGFzcyA6IG51bGw7DQorDQorICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgcmV0dXJuIG51bGw7DQorICAgIH0NCisqLw0KKyAgICB9DQorDQorICAgIHN0YXRpYyBUcmlwbGVLZXlIYXNoTWFwIG1vcE5hbWVzID0gbmV3IFRyaXBsZUtleUhhc2hNYXAoKTsNCisNCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TU9QTWV0aG9kTmFtZShDYWNoZWRDbGFzcyBkZWNsYXJpbmdDbGFzcywgU3RyaW5nIG5hbWUsIGJvb2xlYW4gdXNlVGhpcykgew0KKyAgICAgICAgVHJpcGxlS2V5SGFzaE1hcC5FbnRyeSBtb3BOYW1lRW50cnkgPSBtb3BOYW1lcy5nZXRPclB1dChkZWNsYXJpbmdDbGFzcywgbmFtZSwgQm9vbGVhbi52YWx1ZU9mKHVzZVRoaXMpKTsNCisgICAgICAgIGlmIChtb3BOYW1lRW50cnkudmFsdWUgPT0gbnVsbCkgew0KKyAgICAgICAgICAgIG1vcE5hbWVFbnRyeS52YWx1ZSA9IG5ldyBTdHJpbmdCdWZmZXIoKS5hcHBlbmQodXNlVGhpcyA/ICJ0aGlzJCIgOiAic3VwZXIkIikuYXBwZW5kKGRlY2xhcmluZ0NsYXNzLmdldFN1cGVyQ2xhc3NEaXN0YW5jZSgpKS5hcHBlbmQoIiQiKS5hcHBlbmQobmFtZSkudG9TdHJpbmcoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiAoU3RyaW5nKSBtb3BOYW1lRW50cnkudmFsdWU7DQorICAgIH0NCisNCisgICAgc3RhdGljIGZpbmFsIE1hcCAvKjxDbGFzcyxTb2Z0UmVmZXJlbmNlPENhY2hlZENsYXNzPj4qLyBDQUNIRURfQ0xBU1NfTUFQID0gbmV3IFdlYWtIYXNoTWFwKCk7DQorDQorICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FycmF5KENsYXNzIGtsYXp6KSB7DQorICAgICAgICBDYWNoZWRDbGFzcyBjYWNoZWRDbGFzcyA9IGdldENhY2hlZENsYXNzKGtsYXp6KTsNCisgICAgICAgIHJldHVybiBjYWNoZWRDbGFzcy5pc0FycmF5Ow0KKyAgICB9DQorDQorICAgIHN0YXRpYyBXZWFrRG91YmxlS2V5SGFzaE1hcCBhc3NpZ25hYmxlTWFwID0gbmV3IFdlYWtEb3VibGVLZXlIYXNoTWFwKCk7DQorDQorICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Fzc2lnbmFibGVGcm9tKENsYXNzIGtsYXp6LCBDbGFzcyBhQ2xhc3MpIHsNCisgICAgICAgIFdlYWtEb3VibGVLZXlIYXNoTWFwLkVudHJ5IHZhbCA9IGFzc2lnbmFibGVNYXAuZ2V0T3JQdXQoa2xhenosIGFDbGFzcyk7DQorICAgICAgICBpZiAodmFsLnZhbHVlID09IG51bGwpIHsNCisgICAgICAgICAgICB2YWwudmFsdWUgPSBCb29sZWFuLnZhbHVlT2Yoa2xhenouaXNBc3NpZ25hYmxlRnJvbShhQ2xhc3MpKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiAoKEJvb2xlYW4pdmFsLnZhbHVlKS5ib29sZWFuVmFsdWUoKTsNCisgICAgfQ0KKw0KKyAgICBzdGF0aWMgYm9vbGVhbiBhcnJheUNvbnRlbnRzRXEoT2JqZWN0W10gYTEsIE9iamVjdFtdIGEyKSB7DQorICAgICAgICBpZiAoYTEgPT0gbnVsbCkgew0KKyAgICAgICAgICAgIHJldHVybiBhMiA9PSBudWxsIHx8IGEyLmxlbmd0aCA9PSAwOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaWYgKGEyID09IG51bGwpIHsNCisgICAgICAgICAgICByZXR1cm4gYTEubGVuZ3RoID09IDA7DQorICAgICAgICB9DQorDQorICAgICAgICBpZiAoYTEubGVuZ3RoICE9IGEyLmxlbmd0aCkgew0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYTEubGVuZ3RoOyBpKyspIHsNCisgICAgICAgICAgICBpZiAoYTFbaV0gIT0gYTJbaV0pIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ2FjaGVkQ2xhc3MgT0JKRUNUX0NMQVNTID0gbmV3IENhY2hlZENsYXNzKE9iamVjdC5jbGFzcykgew0KKyAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCBDYWNoZWRDbGFzcyBnZXRDYWNoZWRTdXBlckNsYXNzKCkgew0KKyAgICAgICAgICAgIHJldHVybiBudWxsOw0KKyAgICAgICAgfQ0KKyAgICB9Ow0KKw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENhY2hlZENsYXNzIE9CSkVDVF9BUlJBWV9DTEFTUyA9IGdldENhY2hlZENsYXNzKE9iamVjdFtdLmNsYXNzKTsNCisNCisgICAgcHVibGljIHN0YXRpYyBDYWNoZWRDbGFzcyBnZXRDYWNoZWRDbGFzcyhDbGFzcyBrbGF6eikgew0KKyAgICAgICAgaWYgKGtsYXp6ID09IG51bGwpDQorICAgICAgICAgICAgcmV0dXJuIG51bGw7DQorDQorICAgICAgICBpZiAoa2xhenogPT0gT2JqZWN0LmNsYXNzKQ0KKyAgICAgICAgICAgIHJldHVybiBPQkpFQ1RfQ0xBU1M7DQorDQorICAgICAgICBDYWNoZWRDbGFzcyBjYWNoZWRDbGFzczsNCisgICAgICAgIHN5bmNocm9uaXplZCAoQ0FDSEVEX0NMQVNTX01BUCkgew0KKyAgICAgICAgICAgIFNvZnRSZWZlcmVuY2UgcmVmID0gKFNvZnRSZWZlcmVuY2UpIENBQ0hFRF9DTEFTU19NQVAuZ2V0KGtsYXp6KTsNCisgICAgICAgICAgICBpZiAocmVmID09IG51bGwgfHwgKGNhY2hlZENsYXNzID0gKENhY2hlZENsYXNzKSByZWYuZ2V0KCkpID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgY2FjaGVkQ2xhc3MgPSBuZXcgQ2FjaGVkQ2xhc3Moa2xhenopOw0KKyAgICAgICAgICAgICAgICBDQUNIRURfQ0xBU1NfTUFQLnB1dChrbGF6eiwgbmV3IFNvZnRSZWZlcmVuY2UoY2FjaGVkQ2xhc3MpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gY2FjaGVkQ2xhc3M7DQorICAgIH0NCisNCisgICAgICAgICAgICB9DQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcmVmbGVjdGlvbi9TaW5nbGVLZXlIYXNoTWFwLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9yZWZsZWN0aW9uL1NpbmdsZUtleUhhc2hNYXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjk2MWMxCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcmVmbGVjdGlvbi9TaW5nbGVLZXlIYXNoTWFwLmphdmEKQEAgLTAsMCArMSwxNTggQEAKKy8qDQorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJlZmxlY3Rpb247DQorDQorcHVibGljIGNsYXNzIFNpbmdsZUtleUhhc2hNYXAgZXh0ZW5kcyBDb21wbGV4S2V5SGFzaE1hcA0KK3sNCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFbnRyeSBleHRlbmRzIENvbXBsZXhLZXlIYXNoTWFwLkVudHJ5ew0KKyAgICAgICAgcHVibGljIE9iamVjdCBrZXk7DQorDQorICAgICAgICBwdWJsaWMgT2JqZWN0IGdldEtleSgpIHsNCisgICAgICAgICAgICAgIHJldHVybiBrZXk7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcHVibGljIFNpbmdsZUtleUhhc2hNYXAgKCkgew0KKyAgICAgICAgc3VwZXIgKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIFNpbmdsZUtleUhhc2hNYXAgKGJvb2xlYW4gYikgew0KKyAgICAgICAgc3VwZXIgKGZhbHNlKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShTdHJpbmcgbmFtZSkgew0KKyAgICAgICAgcmV0dXJuIGdldChuYW1lKSAhPSBudWxsOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHB1dChPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsNCisgICAgICAgIGdldE9yUHV0KGtleSkudmFsdWUgPSB2YWx1ZTsNCisgICAgfQ0KKw0KKyAgcHVibGljIGZpbmFsIE9iamVjdCBnZXQoT2JqZWN0IGtleSkgew0KKyAgICBpbnQgaCA9IGhhc2ggKGtleS5oYXNoQ29kZSgpKTsNCisgICAgQ29tcGxleEtleUhhc2hNYXAuRW50cnkgZSA9IHRhYmxlIFtoICYgKHRhYmxlLmxlbmd0aC0xKV07DQorICAgIGZvciAoOyBlICE9IG51bGw7IGUgPSBlLm5leHQpDQorICAgICAgICBpZiAoZS5oYXNoID09IGggJiYgKChFbnRyeSkgZSkua2V5LmVxdWFscyhrZXkpKQ0KKyAgICAgICAgICByZXR1cm4gKChFbnRyeSllKS52YWx1ZTsNCisNCisgICAgcmV0dXJuIG51bGw7DQorICB9DQorDQorICBwdWJsaWMgRW50cnkgZ2V0T3JQdXQoT2JqZWN0IGtleSkNCisgIHsNCisgICAgaW50IGggPSBoYXNoIChrZXkuaGFzaENvZGUoKSk7DQorICAgICAgZmluYWwgQ29tcGxleEtleUhhc2hNYXAuRW50cnlbXSB0ID0gdGFibGU7DQorICAgICAgZmluYWwgaW50IGluZGV4ID0gaCAmICh0Lmxlbmd0aCAtIDEpOw0KKyAgICBDb21wbGV4S2V5SGFzaE1hcC5FbnRyeSBlID0gdFtpbmRleF07DQorICAgIGZvciAoOyBlICE9IG51bGw7IGUgPSBlLm5leHQpDQorICAgICAgICBpZiAoZS5oYXNoID09IGggJiYgKChFbnRyeSkgZSkua2V5LmVxdWFscyhrZXkpKQ0KKyAgICAgICAgICByZXR1cm4gKEVudHJ5KSBlOw0KKw0KKyAgICAgIEVudHJ5IGVudHJ5ID0gbmV3IEVudHJ5KCk7DQorICAgICAgZW50cnkubmV4dCA9IHQgW2luZGV4XTsNCisgICAgICBlbnRyeS5oYXNoID0gaDsNCisgICAgICBlbnRyeS5rZXkgPSBrZXk7DQorICAgICAgdFtpbmRleF0gPSBlbnRyeTsNCisNCisgICAgaWYgKCArK3NpemUgPT0gdGhyZXNob2xkICkNCisgICAgICByZXNpemUoMiogdC5sZW5ndGgpOw0KKw0KKyAgICByZXR1cm4gZW50cnk7DQorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKw0KKyAgICBwdWJsaWMgRW50cnkgZ2V0T3JQdXRFbnRyeShFbnRyeSBlbGVtZW50KSB7DQorICAgICAgICBPYmplY3Qga2V5ID0gZWxlbWVudC5rZXk7DQorICAgICAgICBpbnQgaCA9IGVsZW1lbnQuaGFzaDsNCisgICAgICAgICAgZmluYWwgQ29tcGxleEtleUhhc2hNYXAuRW50cnlbXSB0ID0gdGFibGU7DQorICAgICAgICAgIGZpbmFsIGludCBpbmRleCA9IGggJiAodC5sZW5ndGggLSAxKTsNCisgICAgICAgIENvbXBsZXhLZXlIYXNoTWFwLkVudHJ5IGUgPSB0W2luZGV4XTsNCisgICAgICAgIGZvciAoOyBlICE9IG51bGw7IGUgPSBlLm5leHQpDQorICAgICAgICAgICAgaWYgKGUuaGFzaCA9PSBoICYmICgoRW50cnkpIGUpLmtleS5lcXVhbHMoa2V5KSkNCisgICAgICAgICAgICAgIHJldHVybiAoRW50cnkpIGU7DQorDQorICAgICAgICAgIEVudHJ5IGVudHJ5ID0gbmV3IEVudHJ5KCk7DQorICAgICAgICAgIGVudHJ5Lm5leHQgPSB0IFtpbmRleF07DQorICAgICAgICAgIGVudHJ5Lmhhc2ggPSBoOw0KKyAgICAgICAgICBlbnRyeS5rZXkgPSBrZXk7DQorICAgICAgICAgIHRbaW5kZXhdID0gZW50cnk7DQorDQorICAgICAgICBpZiAoICsrc2l6ZSA9PSB0aHJlc2hvbGQgKQ0KKyAgICAgICAgICByZXNpemUoMiogdC5sZW5ndGgpOw0KKw0KKyAgICAgICAgcmV0dXJuIGVudHJ5Ow0KKyAgICB9DQorDQorICAgIHB1YmxpYyBFbnRyeSBwdXRDb3B5T2ZVbmV4aXN0aW5nKEVudHJ5IGVlKQ0KKyAgICB7DQorICAgICAgaW50IGggPSBlZS5oYXNoOw0KKyAgICAgIGZpbmFsIENvbXBsZXhLZXlIYXNoTWFwLkVudHJ5W10gdCA9IHRhYmxlOw0KKyAgICAgIGZpbmFsIGludCBpbmRleCA9IGggJiAodC5sZW5ndGggLSAxKTsNCisNCisgICAgICAgIEVudHJ5IGVudHJ5ID0gbmV3IEVudHJ5KCk7DQorICAgICAgICBlbnRyeS5uZXh0ID0gdCBbaW5kZXhdOw0KKyAgICAgICAgZW50cnkuaGFzaCA9IGg7DQorICAgICAgICBlbnRyeS5rZXkgPSBlZS5rZXk7DQorICAgICAgICBlbnRyeS52YWx1ZSA9IGVlLnZhbHVlOw0KKyAgICAgICAgdFtpbmRleF0gPSBlbnRyeTsNCisNCisgICAgICBpZiAoICsrc2l6ZSA9PSB0aHJlc2hvbGQgKQ0KKyAgICAgICAgcmVzaXplKDIqIHQubGVuZ3RoKTsNCisNCisgICAgICByZXR1cm4gZW50cnk7DQorICAgIH0NCisNCisgICAgcHVibGljIGZpbmFsIENvbXBsZXhLZXlIYXNoTWFwLkVudHJ5IHJlbW92ZShPYmplY3Qga2V5KSB7DQorICAgIGludCBoID0gaGFzaCAoa2V5Lmhhc2hDb2RlKCkpOw0KKyAgICBpbnQgaW5kZXggPSBoICYgKHRhYmxlLmxlbmd0aCAtMSk7DQorICAgIGZvciAoQ29tcGxleEtleUhhc2hNYXAuRW50cnkgZSA9IHRhYmxlIFtpbmRleF0sIHByZXYgPSBudWxsOyBlICE9IG51bGw7IHByZXYgPSBlLCBlID0gZS5uZXh0ICkgew0KKyAgICAgICAgaWYgKGUuaGFzaCA9PSBoICYmICgoRW50cnkpIGUpLmtleS5lcXVhbHMoa2V5KSkgew0KKyAgICAgICAgaWYgKHByZXYgPT0gbnVsbCkNCisgICAgICAgICAgdGFibGUgW2luZGV4XSA9IGUubmV4dDsNCisgICAgICAgIGVsc2UNCisgICAgICAgICAgcHJldi5uZXh0ID0gZS5uZXh0Ow0KKyAgICAgICAgc2l6ZS0tOw0KKw0KKyAgICAgICAgZS5uZXh0ID0gbnVsbDsNCisgICAgICAgIHJldHVybiBlOw0KKyAgICAgIH0NCisgICAgfQ0KKw0KKyAgICByZXR1cm4gbnVsbDsNCisgIH0NCisNCisgIHB1YmxpYyBzdGF0aWMgU2luZ2xlS2V5SGFzaE1hcCBjb3B5IChTaW5nbGVLZXlIYXNoTWFwIGRzdCwgU2luZ2xlS2V5SGFzaE1hcCBzcmMsIENvcGllciBjb3BpZXIpIHsNCisgICAgICBkc3QudGhyZXNob2xkID0gc3JjLnRocmVzaG9sZDsNCisgICAgICBkc3Quc2l6ZSA9IHNyYy5zaXplOw0KKyAgICAgIGZpbmFsIGludCBsZW4gPSBzcmMudGFibGUubGVuZ3RoOw0KKyAgICAgIGZpbmFsIENvbXBsZXhLZXlIYXNoTWFwLkVudHJ5W10gdCA9IG5ldyBDb21wbGV4S2V5SGFzaE1hcC5FbnRyeVtsZW5dLCB0dCA9IHNyYy50YWJsZTsNCisgICAgICBmb3IgKGludCBpID0gMDsgaSAhPSBsZW47ICsraSkgew0KKyAgICAgICAgICBmb3IgKEVudHJ5IGUgPSAoRW50cnkpIHR0W2ldOyBlICE9IG51bGw7IGUgPSAoRW50cnkpIGUubmV4dCkgew0KKyAgICAgICAgICAgICAgRW50cnkgZWUgPSBuZXcgRW50cnkoKTsNCisgICAgICAgICAgICAgIGVlLmhhc2ggPSBlLmhhc2g7DQorICAgICAgICAgICAgICBlZS5rZXkgPSBlLmtleTsNCisgICAgICAgICAgICAgIGVlLnZhbHVlID0gY29waWVyLmNvcHkoZS52YWx1ZSk7DQorICAgICAgICAgICAgICBlZS5uZXh0ID0gdCBbaV07DQorICAgICAgICAgICAgICB0IFtpXSA9IGVlOw0KKyAgICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGRzdC50YWJsZSA9IHQ7DQorICAgICAgcmV0dXJuIGRzdDsNCisgIH0NCisNCisgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIENvcGllciB7DQorICAgICAgT2JqZWN0IGNvcHkgKE9iamVjdCB2YWx1ZSk7DQorICB9DQorfQ0KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3JlZmxlY3Rpb24vVHJpcGxlS2V5SGFzaE1hcC5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcmVmbGVjdGlvbi9UcmlwbGVLZXlIYXNoTWFwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFiNTJmMwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3JlZmxlY3Rpb24vVHJpcGxlS2V5SGFzaE1hcC5qYXZhCkBAIC0wLDAgKzEsODMgQEAKKy8qDQorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJlZmxlY3Rpb247DQorDQorcHVibGljIGNsYXNzIFRyaXBsZUtleUhhc2hNYXAgZXh0ZW5kcyBDb21wbGV4S2V5SGFzaE1hcA0KK3sNCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRW50cnkgZXh0ZW5kcyBDb21wbGV4S2V5SGFzaE1hcC5FbnRyeXsNCisgICAgcHVibGljIE9iamVjdCBrZXkxLCBrZXkyLCBrZXkzOw0KKyAgfQ0KKw0KKyAgcHVibGljIGZpbmFsIE9iamVjdCBnZXQoT2JqZWN0IGtleTEsIE9iamVjdCBrZXkyLCBPYmplY3Qga2V5Mykgew0KKyAgICBpbnQgaCA9IGhhc2ggKDMxKigzMSprZXkxLmhhc2hDb2RlKCkra2V5Mi5oYXNoQ29kZSgpKStrZXkzLmhhc2hDb2RlKCkpOw0KKyAgICBDb21wbGV4S2V5SGFzaE1hcC5FbnRyeSBlID0gdGFibGUgW2ggJiAodGFibGUubGVuZ3RoLTEpXTsNCisgICAgZm9yICg7IGUgIT0gbnVsbDsgZSA9IGUubmV4dCkNCisgICAgICBpZiAoZS5oYXNoID09IGggJiYgY2hlY2tFcXVhbHMoKEVudHJ5KSBlLCBrZXkxLCBrZXkyLCBrZXkzKSkNCisgICAgICAgIHJldHVybiBlOw0KKw0KKyAgICByZXR1cm4gbnVsbDsNCisgIH0NCisNCisgIHB1YmxpYyBib29sZWFuIGNoZWNrRXF1YWxzKEVudHJ5IGUsIE9iamVjdCBrZXkxLCBPYmplY3Qga2V5MiwgT2JqZWN0IGtleTMpIHsNCisgICAgICByZXR1cm4gZS5rZXkxLmVxdWFscyhrZXkxKSAmJiBlLmtleTIuZXF1YWxzKGtleTIpICYmIGUua2V5My5lcXVhbHMoa2V5Myk7DQorICB9DQorDQorICBwdWJsaWMgRW50cnkgZ2V0T3JQdXQoT2JqZWN0IGtleTEsIE9iamVjdCBrZXkyLCBPYmplY3Qga2V5MykNCisgIHsNCisgICAgaW50IGggPSBoYXNoICgzMSooMzEqa2V5MS5oYXNoQ29kZSgpK2tleTIuaGFzaENvZGUoKSkra2V5My5oYXNoQ29kZSgpKTsNCisgICAgZmluYWwgaW50IGluZGV4ID0gaCAmICh0YWJsZS5sZW5ndGggLSAxKTsNCisgICAgQ29tcGxleEtleUhhc2hNYXAuRW50cnkgZSA9IHRhYmxlIFtpbmRleF07DQorICAgIGZvciAoOyBlICE9IG51bGw7IGUgPSBlLm5leHQpDQorICAgICAgaWYgKGUuaGFzaCA9PSBoICYmIGNoZWNrRXF1YWxzKChFbnRyeSkgZSwga2V5MSwga2V5Miwga2V5MykpDQorICAgICAgICByZXR1cm4gKEVudHJ5KSBlOw0KKw0KKyAgICBFbnRyeSBlbnRyeSA9IGNyZWF0ZUVudHJ5ICgpOw0KKyAgICBlbnRyeS5uZXh0ID0gdGFibGUgW2luZGV4XTsNCisgICAgZW50cnkuaGFzaCA9IGg7DQorICAgIGVudHJ5LmtleTEgPSBrZXkxOw0KKyAgICBlbnRyeS5rZXkyID0ga2V5MjsNCisgICAgZW50cnkua2V5MyA9IGtleTM7DQorICAgIHRhYmxlIFtpbmRleF0gPSBlbnRyeTsNCisNCisgICAgaWYgKCArK3NpemUgPT0gdGhyZXNob2xkICkNCisgICAgICByZXNpemUoMip0YWJsZS5sZW5ndGgpOw0KKw0KKyAgICByZXR1cm4gZW50cnk7DQorICB9DQorDQorICBwdWJsaWMgRW50cnkgY3JlYXRlRW50cnkoKSB7DQorICAgICAgcmV0dXJuIG5ldyBFbnRyeSAoKTsNCisgIH0NCisNCisgIHB1YmxpYyBmaW5hbCBDb21wbGV4S2V5SGFzaE1hcC5FbnRyeSByZW1vdmUoT2JqZWN0IGtleTEsIE9iamVjdCBrZXkyLCBPYmplY3Qga2V5Mykgew0KKyAgICBpbnQgaCA9IGhhc2ggKDMxKigzMSprZXkxLmhhc2hDb2RlKCkra2V5Mi5oYXNoQ29kZSgpKStrZXkzLmhhc2hDb2RlKCkpOw0KKyAgICBpbnQgaW5kZXggPSBoICYgKHRhYmxlLmxlbmd0aCAtMSk7DQorICAgIGZvciAoQ29tcGxleEtleUhhc2hNYXAuRW50cnkgZSA9IHRhYmxlIFtpbmRleF0sIHByZXYgPSBudWxsOyBlICE9IG51bGw7IHByZXYgPSBlLCBlID0gZS5uZXh0ICkgew0KKyAgICAgIGlmIChlLmhhc2ggPT0gaCAmJiBjaGVja0VxdWFscygoRW50cnkpIGUsIGtleTEsIGtleTIsIGtleTMpKSB7DQorICAgICAgICBpZiAocHJldiA9PSBudWxsKQ0KKyAgICAgICAgICB0YWJsZSBbaW5kZXhdID0gZS5uZXh0Ow0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgICBwcmV2Lm5leHQgPSBlLm5leHQ7DQorICAgICAgICBzaXplLS07DQorDQorICAgICAgICBlLm5leHQgPSBudWxsOw0KKyAgICAgICAgcmV0dXJuIGU7DQorICAgICAgfQ0KKyAgICB9DQorDQorICAgIHJldHVybiBudWxsOw0KKyAgfQ0KK30NCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9yZWZsZWN0aW9uL1dlYWtEb3VibGVLZXlIYXNoTWFwLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9yZWZsZWN0aW9uL1dlYWtEb3VibGVLZXlIYXNoTWFwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFmZmZmZgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3JlZmxlY3Rpb24vV2Vha0RvdWJsZUtleUhhc2hNYXAuamF2YQpAQCAtMCwwICsxLDE0NSBAQAorLyoNCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4NCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkucmVmbGVjdGlvbjsNCisNCitpbXBvcnQgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2VRdWV1ZTsNCitpbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOw0KKw0KK3B1YmxpYyBjbGFzcyBXZWFrRG91YmxlS2V5SGFzaE1hcCBleHRlbmRzIENvbXBsZXhLZXlIYXNoTWFwDQorew0KKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVmIGV4dGVuZHMgV2Vha1JlZmVyZW5jZSB7DQorICAgICAgcHVibGljIFJlZihPYmplY3QgcmVmZXJlbnQsIFJlZmVyZW5jZVF1ZXVlIHEsIEVudHJ5IGVudHJ5KSB7DQorICAgICAgICAgIHN1cGVyKHJlZmVyZW50LCBxKTsNCisgICAgICAgICAgdGhpcy5lbnRyeSA9IGVudHJ5Ow0KKyAgICAgIH0NCisNCisgICAgICBFbnRyeSBlbnRyeTsNCisgIH0NCisNCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRW50cnkgZXh0ZW5kcyBDb21wbGV4S2V5SGFzaE1hcC5FbnRyeXsNCisgICAgcHVibGljIFJlZiBrZXkxLCBrZXkyOw0KKyAgfQ0KKw0KKyAgcHJpdmF0ZSBmaW5hbCBSZWZlcmVuY2VRdWV1ZSBxdWV1ZSA9IG5ldyBSZWZlcmVuY2VRdWV1ZSgpOw0KKw0KKyAgICBwcml2YXRlIHZvaWQgZXhwdW5nZVN0YWxlRW50cmllcygpIHsNCisJICAgIFJlZiByOw0KKyAgICAgICAgd2hpbGUgKCAociA9IChSZWYpIHF1ZXVlLnBvbGwoKSkgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIEVudHJ5IGUgPSByLmVudHJ5Ow0KKyAgICAgICAgICAgIGlmIChlID09IG51bGwpDQorICAgICAgICAgICAgICBjb250aW51ZTsNCisNCisgICAgICAgICAgICByLmVudHJ5ID0gbnVsbDsNCisgICAgICAgICAgICBlLmtleTEgPSBlLmtleTIgPSBudWxsOw0KKw0KKyAgICAgICAgICAgIGludCBoID0gZS5oYXNoOw0KKyAgICAgICAgICAgIGludCBpID0gaCAmICh0YWJsZS5sZW5ndGgtMSk7DQorDQorICAgICAgICAgICAgRW50cnkgcHJldiA9IChFbnRyeSkgdGFibGVbaV07DQorICAgICAgICAgICAgRW50cnkgcCA9IHByZXY7DQorICAgICAgICAgICAgd2hpbGUgKHAgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICBFbnRyeSBuZXh0ID0gKEVudHJ5KSBwLm5leHQ7DQorICAgICAgICAgICAgICAgIGlmIChwID09IGUpIHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2ID09IGUpDQorICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVbaV0gPSBuZXh0Ow0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXYubmV4dCA9IG5leHQ7DQorICAgICAgICAgICAgICAgICAgICBlLm5leHQgPSBudWxsOyAgLy8gSGVscCBHQw0KKyAgICAgICAgICAgICAgICAgICAgZS52YWx1ZSA9IG51bGw7IC8vICAiICAgIg0KKyAgICAgICAgICAgICAgICAgICAgc2l6ZS0tOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcHJldiA9IHA7DQorICAgICAgICAgICAgICAgIHAgPSBuZXh0Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgcHVibGljIGZpbmFsIE9iamVjdCBnZXQoT2JqZWN0IGtleTEsIE9iamVjdCBrZXkyKSB7DQorICAgIGV4cHVuZ2VTdGFsZUVudHJpZXMoKTsNCisgICAgaW50IGggPSBoYXNoICgzMSprZXkxLmhhc2hDb2RlKCkra2V5Mi5oYXNoQ29kZSgpKTsNCisgICAgQ29tcGxleEtleUhhc2hNYXAuRW50cnkgZSA9IHRhYmxlIFtoICYgKHRhYmxlLmxlbmd0aC0xKV07DQorICAgIGZvciAoOyBlICE9IG51bGw7IGUgPSBlLm5leHQpDQorICAgICAgaWYgKGUuaGFzaCA9PSBoICYmIGNoZWNrRXF1YWxzKChFbnRyeSkgZSwga2V5MSwga2V5MikpDQorICAgICAgICByZXR1cm4gZTsNCisNCisgICAgcmV0dXJuIG51bGw7DQorICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGNoZWNrRXF1YWxzKENvbXBsZXhLZXlIYXNoTWFwLkVudHJ5IGUsIE9iamVjdCBrZXkxLCBPYmplY3Qga2V5Mikgew0KKyAgICAgICAgRW50cnkgZWUgPSAoRW50cnkpIGU7DQorICAgICAgICByZXR1cm4gZWUua2V5MS5nZXQoKSA9PSBrZXkxICYmIGVlLmtleTIuZ2V0KCkgPT0ga2V5MjsNCisgICAgfQ0KKw0KKyAgcHVibGljIEVudHJ5IGdldE9yUHV0KE9iamVjdCBrZXkxLCBPYmplY3Qga2V5MikNCisgIHsNCisgICAgZXhwdW5nZVN0YWxlRW50cmllcygpOw0KKyAgICBpbnQgaCA9IGhhc2ggKDMxKmtleTEuaGFzaENvZGUoKStrZXkyLmhhc2hDb2RlKCkpOw0KKyAgICBmaW5hbCBpbnQgaW5kZXggPSBoICYgKHRhYmxlLmxlbmd0aCAtIDEpOw0KKyAgICBDb21wbGV4S2V5SGFzaE1hcC5FbnRyeSBlID0gdGFibGUgW2luZGV4XTsNCisgICAgZm9yICg7IGUgIT0gbnVsbDsgZSA9IGUubmV4dCkNCisgICAgICBpZiAoZS5oYXNoID09IGggJiYgY2hlY2tFcXVhbHMoIGUsIGtleTEsIGtleTIpKQ0KKyAgICAgICAgcmV0dXJuIChFbnRyeSkgZTsNCisNCisgICAgQ29tcGxleEtleUhhc2hNYXAuRW50cnkgZW50cnkgPSBjcmVhdGVFbnRyeShrZXkxLCBrZXkyLCBoLCBpbmRleCk7DQorICAgIHRhYmxlIFtpbmRleF0gPSBlbnRyeTsNCisNCisgICAgaWYgKCArK3NpemUgPT0gdGhyZXNob2xkICkNCisgICAgICByZXNpemUoMip0YWJsZS5sZW5ndGgpOw0KKw0KKyAgICByZXR1cm4gKEVudHJ5KSBlbnRyeTsNCisgIH0NCisNCisgIHByaXZhdGUgQ29tcGxleEtleUhhc2hNYXAuRW50cnkgY3JlYXRlRW50cnkoT2JqZWN0IGtleTEsIE9iamVjdCBrZXkyLCBpbnQgaCwgaW50IGluZGV4KQ0KKyAgew0KKyAgICBFbnRyeSBlbnRyeSA9IGNyZWF0ZUVudHJ5ICgpOw0KKyAgICBlbnRyeS5uZXh0ID0gdGFibGUgW2luZGV4XTsNCisgICAgZW50cnkuaGFzaCA9IGg7DQorICAgIGVudHJ5LmtleTEgPSBuZXcgUmVmKGtleTEsIHF1ZXVlLCBlbnRyeSk7DQorICAgIGVudHJ5LmtleTIgPSBuZXcgUmVmKGtleTIsIHF1ZXVlLCBlbnRyeSk7DQorICAgIHJldHVybiBlbnRyeTsNCisgIH0NCisNCisgIHB1YmxpYyBFbnRyeSBjcmVhdGVFbnRyeSgpIHsNCisgICAgICByZXR1cm4gbmV3IEVudHJ5ICgpOw0KKyAgfQ0KKw0KKyAgICBwdWJsaWMgaW50IHNpemUoKSB7DQorICAgICAgICBleHB1bmdlU3RhbGVFbnRyaWVzKCk7DQorICAgICAgICByZXR1cm4gc3VwZXIuc2l6ZSgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBmaW5hbCBDb21wbGV4S2V5SGFzaE1hcC5FbnRyeSByZW1vdmUoT2JqZWN0IGtleTEsIE9iamVjdCBrZXkyKSB7DQorICAgIGV4cHVuZ2VTdGFsZUVudHJpZXMoKTsNCisgICAgaW50IGggPSBoYXNoICgzMSprZXkxLmhhc2hDb2RlKCkra2V5Mi5oYXNoQ29kZSgpKTsNCisgICAgaW50IGluZGV4ID0gaCAmICh0YWJsZS5sZW5ndGggLTEpOw0KKyAgICBmb3IgKENvbXBsZXhLZXlIYXNoTWFwLkVudHJ5IGUgPSB0YWJsZSBbaW5kZXhdLCBwcmV2ID0gbnVsbDsgZSAhPSBudWxsOyBwcmV2ID0gZSwgZSA9IGUubmV4dCApIHsNCisgICAgICBpZiAoZS5oYXNoID09IGggJiYgY2hlY2tFcXVhbHMoKEVudHJ5KSBlLCBrZXkxLCBrZXkyKSkgew0KKyAgICAgICAgaWYgKHByZXYgPT0gbnVsbCkNCisgICAgICAgICAgdGFibGUgW2luZGV4XSA9IGUubmV4dDsNCisgICAgICAgIGVsc2UNCisgICAgICAgICAgcHJldi5uZXh0ID0gZS5uZXh0Ow0KKyAgICAgICAgc2l6ZS0tOw0KKw0KKyAgICAgICAgZS5uZXh0ID0gbnVsbDsNCisgICAgICAgIHJldHVybiBlOw0KKyAgICAgIH0NCisgICAgfQ0KKw0KKyAgICByZXR1cm4gbnVsbDsNCisgIH0NCisNCit9DQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcmVmbGVjdGlvbi9wYWNrYWdlLmh0bWwgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9yZWZsZWN0aW9uL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzI1YjU5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcmVmbGVjdGlvbi9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSw4IEBACis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPHRpdGxlPnBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5yZWZsZWN0aW9uLio8L3RpdGxlPgorICA8L2hlYWQ+CisgIDxib2R5PgorICAgIDxwPkludGVybmFsIGNsYXNzZXMgZm9yIGFzc2lzdGluZyB3aXRoIHJlZmxlY3Rpb24uPC9wPgorICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL0NsYXNzRXh0ZW5kZXIuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvQ2xhc3NFeHRlbmRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5OGY4MjgKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL0NsYXNzRXh0ZW5kZXIuamF2YQpAQCAtMCwwICsxLDg3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lOworCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuQ2xvc3VyZTsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKworLyoqCisgKiBBIGhlbHBlciBjbGFzcyB1c2VkIGJ5IHRoZSBydW50aW1lIHRvIGFsbG93IEdyb292eSBjbGFzc2VzIHRvIGJlIGV4dGVuZGVkIGF0IHJ1bnRpbWUKKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIENsYXNzRXh0ZW5kZXIgeworICAgIHByaXZhdGUgTWFwIHZhcmlhYmxlczsKKyAgICBwcml2YXRlIE1hcCBtZXRob2RzOworCisgICAgcHVibGljIHN5bmNocm9uaXplZCBPYmplY3QgZ2V0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIGlmICh2YXJpYWJsZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHZhcmlhYmxlcy5nZXQobmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldChTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIGlmICh2YXJpYWJsZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgdmFyaWFibGVzID0gY3JlYXRlTWFwKCk7CisgICAgICAgIH0KKyAgICAgICAgdmFyaWFibGVzLnB1dChuYW1lLCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZShTdHJpbmcgbmFtZSkgeworICAgICAgICBpZiAodmFyaWFibGVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHZhcmlhYmxlcy5yZW1vdmUobmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjYWxsKFN0cmluZyBuYW1lLCBPYmplY3QgcGFyYW1zKSB7CisgICAgICAgIENsb3N1cmUgY2xvc3VyZSA9IG51bGw7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaWYgKG1ldGhvZHMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNsb3N1cmUgPSAoQ2xvc3VyZSkgbWV0aG9kcy5nZXQobmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNsb3N1cmUgIT0gbnVsbCkgeworICAgICAgICAgICAgY2xvc3VyZS5jYWxsKHBhcmFtcyk7CisgICAgICAgIH0KKyAgICAgICAgLyoKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBEb2VzTm90VW5kZXJzdGFuZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgICovCisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZE1ldGhvZChTdHJpbmcgbmFtZSwgQ2xvc3VyZSBjbG9zdXJlKSB7CisgICAgICAgIGlmIChtZXRob2RzID09IG51bGwpIHsKKyAgICAgICAgICAgIG1ldGhvZHMgPSBjcmVhdGVNYXAoKTsKKyAgICAgICAgfQorICAgICAgICBtZXRob2RzLnB1dChuYW1lLCBtZXRob2RzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlTWV0aG9kKFN0cmluZyBuYW1lKSB7CisgICAgICAgIGlmIChtZXRob2RzICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1ldGhvZHMucmVtb3ZlKG5hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIE1hcCBjcmVhdGVNYXAoKSB7CisgICAgICAgIHJldHVybiBuZXcgSGFzaE1hcCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvQ29udmVyc2lvbkhhbmRsZXIuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvQ29udmVyc2lvbkhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGM4NmUzCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9Db252ZXJzaW9uSGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsMTM2IEBACisvKg0KKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLg0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lOw0KKw0KK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uSGFuZGxlcjsNCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsNCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOw0KK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Qcm94eTsNCisNCisvKioNCisgKiBUaGlzIGNsYXNzIGlzIGEgZ2VuZXJhbCBhZGFwdGVyIHRvIG1hcCBhIGNhbGwgdG8gYW4gSmF2YSBpbnRlcmZhY2UgDQorICogdG8gYSBnaXZlbiBkZWxlZ2F0ZS4NCisgKiA8cD4NCisgKiBAYXV0aG9yIEJlbiBZdQ0KKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmJsYWNrZHJhZ0BnbXgub3JnIj5Kb2NoZW4gVGhlb2Rvcm91PC9hPg0KKyAqLw0KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb252ZXJzaW9uSGFuZGxlciBpbXBsZW1lbnRzIEludm9jYXRpb25IYW5kbGVyIHsNCisgICAgcHJpdmF0ZSBPYmplY3QgZGVsZWdhdGU7DQorICAgIA0KKyAgICAvKioNCisgICAgICogQ3JlYXRlcyBhIENvbnZlcnNpb25IYW5kbGVyIHdpdGggYW4gZGVsZWFndGUuDQorICAgICAqIEBwYXJhbSBkZWxlZ2F0ZSB0aGUgZGVsZWdhdGUNCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGdpdmVuIGRlbGVnYXRlIGlzIG51bGwNCisgICAgICovDQorICAgIHB1YmxpYyBDb252ZXJzaW9uSGFuZGxlcihPYmplY3QgZGVsZWdhdGUpIHsNCisgICAgICAgIGlmIChkZWxlZ2F0ZT09bnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZGVsZWdhdGUgbXVzdCBub3QgYmUgbnVsbCIpOw0KKyAgICAgICAgdGhpcy5kZWxlZ2F0ZSA9IGRlbGVnYXRlOw0KKyAgICB9DQorICAgIA0KKyAgICAvKioNCisgICAgICogZ2V0cyB0aGUgZGVsZWdhdGUuDQorICAgICAqIEByZXR1cm4gdGhlIGRlbGVnYXRlDQorICAgICAqLw0KKyAgICBwdWJsaWMgT2JqZWN0IGdldERlbGVnYXRlKCl7DQorICAgICAgICByZXR1cm4gZGVsZWdhdGU7DQorICAgIH0NCisgICAgDQorICAgIC8qKg0KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBpbnZva2UgbWV0aG9kDQorICAgICAqIGdpdmVuIGluIEludm9jYXRpb25oYW5kbGVyLiBBbnkgY2FsbCB0byBhbiBtZXRob2Qgd2l0aCBhbg0KKyAgICAgKiBkZWNsYXJpbmcgY2xhc3MgdGhhdCBpcyBub3QgT2JqZWN0IGlzIHJlZGlyZWN0ZWQgdG8gaW52b2tlQ3VzdG9tLiANCisgICAgICogTWV0aG9kcyBsaWtlIHRvc3RyaW5nLCBlcXVhbHMgYW5kIGhhc2hjb2RlIGFyZSBjYWxsZWQgb24gdGhlIGNsYXNzDQorICAgICAqIGl0c2VsZiBpbnN0ZWFkIG9mIHRoZSBkZWxlZ2F0ZS4gSXQgaXMgYmV0dGVyIHRvIG92ZXJ3cml0ZSB0aGUgDQorICAgICAqIGludm9rZUN1c3RvbSBtZXRob2Qgd2hlcmUgdGhlIE9iamVjdCByZWxhdGVkIG1ldGhvZHMgYXJlIGZpbHRlcmVkIG91dC4NCisgICAgICogDQorICAgICAqIEBzZWUgI2ludm9rZUN1c3RvbShPYmplY3QsIE1ldGhvZCwgT2JqZWN0W10pDQorICAgICAqIEBzZWUgSW52b2NhdGlvbkhhbmRsZXIjaW52b2tlKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCwgamF2YS5sYW5nLk9iamVjdFtdKQ0KKyAgICAgKiANCisgICAgICogQHBhcmFtIHByb3h5IHRoZSBwcm94eQ0KKyAgICAgKiBAcGFyYW0gbWV0aG9kIHRoZSBtZXRob2QNCisgICAgICogQHBhcmFtIGFyZ3MgdGhlIGFyZ3VtZW50cw0KKyAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGludm9jYXRpb24gYnkgbWV0aG9kIG9yIGRlbGVnYXRlDQorICAgICAqIEB0aHJvd3MgVGhyb3dhYmxlIGFueSBleGNlcHRpb24gY2F1c2VkIGJ5IHRoZSBkZWxlZ2F0ZSBvciB0aGUgbWV0aG9kDQorICAgICAqLw0KKyAgICBwdWJsaWMgT2JqZWN0IGludm9rZShPYmplY3QgcHJveHksIE1ldGhvZCBtZXRob2QsIE9iamVjdFtdIGFyZ3MpDQorICAgIHRocm93cyBUaHJvd2FibGUgew0KKyAgICAgICAgaWYoIWlzT2JqZWN0TWV0aG9kKG1ldGhvZCkpew0KKyAgICAgICAgICAgIHJldHVybiBpbnZva2VDdXN0b20ocHJveHksbWV0aG9kLGFyZ3MpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICByZXR1cm4gbWV0aG9kLmludm9rZSh0aGlzLCBhcmdzKTsNCisgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaXRlKSB7DQorICAgICAgICAgICAgdGhyb3cgaXRlLmdldFRhcmdldEV4Y2VwdGlvbigpOw0KKyAgICAgICAgfSAgDQorICAgIH0NCisgICAgDQorICAgIC8qKg0KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgZm9yIGFsbCBNZXRob2RzIG5vdCBkZWZpbmVkIG9uIE9iamVjdC4gDQorICAgICAqIFRoZSBkZWxlZ2F0ZSBzaG91bGQgYmUgY2FsbGVkIGhlcmUuDQorICAgICAqIA0KKyAgICAgKiBAcGFyYW0gcHJveHkgdGhlIHByb3h5DQorICAgICAqIEBwYXJhbSBtZXRob2QgdGhlIG1ldGhvZA0KKyAgICAgKiBAcGFyYW0gYXJncyB0aGUgYXJndW1lbnRzDQorICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgaW52b2NhdGlvbiBvZiB0aGUgZGVsZWdhdGUNCisgICAgICogQHRocm93cyBUaHJvd2FibGUgYW55IGV4Y2VwdGlvbiBjYXVzZXMgYnkgdGhlIGRlbGVnYXRlDQorICAgICAqIEBzZWUgI2ludm9rZShPYmplY3QsIE1ldGhvZCwgT2JqZWN0W10pDQorICAgICAqIEBzZWUgSW52b2NhdGlvbkhhbmRsZXIjaW52b2tlKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCwgamF2YS5sYW5nLk9iamVjdFtdKQ0KKyAgICAgKiANCisgICAgICovDQorICAgIHB1YmxpYyBhYnN0cmFjdCBPYmplY3QgaW52b2tlQ3VzdG9tKE9iamVjdCBwcm94eSwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0W10gYXJncykgdGhyb3dzIFRocm93YWJsZTsNCisgICAgDQorICAgIC8qKg0KKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBzb21lIG90aGVyIG9iamVjdCBpcyAiZXF1YWwgdG8iIHRoaXMgb25lLg0KKyAgICAgKiBUaGUgZGVsZWdhdGUgaXMgdXNlZCBpZiB0aGUgY2xhc3Mgb2YgdGhlIHBhcmFtZXRlciBhbmQgdGhlDQorICAgICAqIGN1cnJlbnQgY2xhc3MgYXJlIGVxdWFsLiBJbiBvdGhlciBjYXNlcyB0aGUgbWV0aG9kIHdpbGwgcmV0dXJuIA0KKyAgICAgKiBmYWxzZS4gVGhlIGV4YWN0IGNsYXNzIGlzIGhlcmUgdXNlZCwgaWYgaW5oZXJpdGFuY2UgaXMgbmVlZGVkLA0KKyAgICAgKiB0aGlzIG1ldGhvZCBtdXN0IGJlIG92ZXJ3cml0dGVuLiANCisgICAgICogICAgICAgIA0KKyAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpDQorICAgICAqLw0KKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgew0KKyAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFByb3h5KXsNCisgICAgICAgICAgICBvYmogPSBQcm94eS5nZXRJbnZvY2F0aW9uSGFuZGxlcihvYmopOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgQ29udmVyc2lvbkhhbmRsZXIpew0KKyAgICAgICAgICAgIHJldHVybiAoKChDb252ZXJzaW9uSGFuZGxlcilvYmopLmdldERlbGVnYXRlKCkpLmVxdWFscyhkZWxlZ2F0ZSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogUmV0dXJucyBhIGhhc2ggY29kZSB2YWx1ZSBmb3IgdGhlIGRlbGVnYXRlLiANCisgICAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkNCisgICAgICovDQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7DQorICAgICAgICByZXR1cm4gZGVsZWdhdGUuaGFzaENvZGUoKTsNCisgICAgfQ0KKyAgICANCisgICAgLyoqDQorICAgICAqIFJldHVybnMgYSBTdHJpbmcgdmVyc2lvbiBvZiB0aGUgZGVsZWdhdGUuDQorICAgICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpDQorICAgICAqLw0KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlLnRvU3RyaW5nKCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNPYmplY3RNZXRob2QoTWV0aG9kIG10ZCl7DQorICAgICAgICByZXR1cm4gbXRkLmdldERlY2xhcmluZ0NsYXNzKCkuZXF1YWxzKE9iamVjdC5jbGFzcyk7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9Db252ZXJ0ZWRDbG9zdXJlLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL0NvbnZlcnRlZENsb3N1cmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmNkNTY5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9Db252ZXJ0ZWRDbG9zdXJlLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoNCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4NCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZTsNCisNCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOw0KK2ltcG9ydCBncm9vdnkubGFuZy5DbG9zdXJlOw0KKw0KKy8qKg0KKyAqIFRoaXMgY2xhc3MgaXMgYSBnZW5lcmFsIGFkYXB0ZXIgdG8gYWRhcHQgYSBjbG9zdXJlIHRvIGFueSBKYXZhIGludGVyZmFjZS4NCisgKiA8cD4NCisgKiBAYXV0aG9yIEJlbiBZdQ0KKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmJsYWNrZHJhZ0BnbXgub3JnIj5Kb2NoZW4gVGhlb2Rvcm91PC9hPg0KKyAqIEp1bCAyNywgMjAwNiAzOjUwOjUxIFBNDQorICovDQorcHVibGljIGNsYXNzIENvbnZlcnRlZENsb3N1cmUgZXh0ZW5kcyBDb252ZXJzaW9uSGFuZGxlciB7DQorICAgIHByaXZhdGUgU3RyaW5nIG1ldGhvZE5hbWU7DQorICAgIA0KKyAgICAvKioNCisgICAgICogdG8gY3JlYXRlIGEgQ29udmVydGVkQ2xvc3VyZSBvYmplY3QuDQorICAgICAqIEBwYXJhbSBjbG9zdXJlIHRoZSBjbG9zdXJlIG9iamVjdC4NCisgICAgICovDQorICAgIHB1YmxpYyBDb252ZXJ0ZWRDbG9zdXJlKENsb3N1cmUgY2xvc3VyZSwgU3RyaW5nIG1ldGhvZCkgew0KKyAgICAgICAgc3VwZXIoY2xvc3VyZSk7DQorICAgICAgICB0aGlzLm1ldGhvZE5hbWUgPSBtZXRob2Q7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBDb252ZXJ0ZWRDbG9zdXJlKENsb3N1cmUgY2xvc3VyZSkgew0KKyAgICAgICAgdGhpcyhjbG9zdXJlLG51bGwpOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgT2JqZWN0IGludm9rZUN1c3RvbShPYmplY3QgcHJveHksIE1ldGhvZCBtZXRob2QsIE9iamVjdFtdIGFyZ3MpDQorICAgIHRocm93cyBUaHJvd2FibGUgew0KKyAgICAgICAgaWYgKG1ldGhvZE5hbWUhPW51bGwgJiYgIW1ldGhvZE5hbWUuZXF1YWxzKG1ldGhvZC5nZXROYW1lKCkpKSByZXR1cm4gbnVsbDsNCisgICAgICAgIHJldHVybiAoKENsb3N1cmUpIGdldERlbGVnYXRlKCkpLmNhbGwoYXJncyk7DQorICAgIH0NCit9DQorDQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9Db252ZXJ0ZWRNYXAuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvQ29udmVydGVkTWFwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAyYjM2OAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvQ29udmVydGVkTWFwLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoNCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4NCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZTsNCisNCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOw0KK2ltcG9ydCBqYXZhLnV0aWwuTWFwOw0KKw0KK2ltcG9ydCBncm9vdnkubGFuZy5DbG9zdXJlOw0KKw0KKy8qKg0KKyAqIFRoaXMgY2xhc3MgaXMgYSBnZW5lcmFsIGFkYXB0ZXIgdG8gYWRhcHQgYSBtYXAgb2YgY2xvc3VyZXMgdG8NCisgKiBhbnkgSmF2YSBpbnRlcmZhY2UuDQorICogPHA+DQorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86YmxhY2tkcmFnQGdteC5vcmciPkpvY2hlbiBUaGVvZG9yb3U8L2E+DQorICovDQorcHVibGljIGNsYXNzIENvbnZlcnRlZE1hcCBleHRlbmRzIENvbnZlcnNpb25IYW5kbGVyIHsNCisgICAgICAgIA0KKyAgICAvKioNCisgICAgICogdG8gY3JlYXRlIGEgQ29udmVydGVkTWFwIG9iamVjdC4NCisgICAgICogQHBhcmFtIGNsb3N1cmVzIHRoZSBtYXAgb2YgY2xvc3Jlcw0KKyAgICAgKi8NCisgICAgcHJvdGVjdGVkIENvbnZlcnRlZE1hcChNYXAgY2xvc3VyZXMpIHsNCisgICAgICAgIHN1cGVyKGNsb3N1cmVzKTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIE9iamVjdCBpbnZva2VDdXN0b20oT2JqZWN0IHByb3h5LCBNZXRob2QgbWV0aG9kLCBPYmplY3RbXSBhcmdzKQ0KKyAgICB0aHJvd3MgVGhyb3dhYmxlIHsNCisgICAgICAgIE1hcCBtID0gKE1hcCkgZ2V0RGVsZWdhdGUoKTsNCisgICAgICAgIENsb3N1cmUgY2wgPSAoQ2xvc3VyZSkgbS5nZXQobWV0aG9kLmdldE5hbWUoKSk7DQorICAgICAgICByZXR1cm4gY2wuY2FsbChhcmdzKTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCisgICAgICAgIHJldHVybiBEZWZhdWx0R3Jvb3Z5TWV0aG9kcy50b1N0cmluZygoTWFwKSBnZXREZWxlZ2F0ZSgpKTsNCisgICAgfQ0KK30NCisNCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL0N1cnJpZWRDbG9zdXJlLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL0N1cnJpZWRDbG9zdXJlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc5MzMwNQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvQ3VycmllZENsb3N1cmUuamF2YQpAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWU7CisKKworaW1wb3J0IGdyb292eS5sYW5nLkNsb3N1cmU7CisgCisvKioKKyAqIFJlcHJlc2VudHMgd3JhcHBlciBhcm91bmQgYSBDbG9zdXJlIHRvIHN1cHBvcnQgY3VycnlpbmcKKyAqIAorICogQGF1dGhvciBKb2NoZW4gVGhlb2Rvcm91CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBDdXJyaWVkQ2xvc3VyZSBleHRlbmRzIENsb3N1cmUgeworCisgICAgcHJpdmF0ZSBPYmplY3RbXSBjdXJyaWVkUGFyYW1zOworICAgIAorICAgIHB1YmxpYyBDdXJyaWVkQ2xvc3VyZShDbG9zdXJlIHVuY3VycmllZENsb3N1cmUsIE9iamVjdFtdIGFyZ3VtZW50cykgeworICAgICAgICBzdXBlcih1bmN1cnJpZWRDbG9zdXJlKTsKKyAgICAgICAgY3VycmllZFBhcmFtcyA9IGFyZ3VtZW50czsKKyAgICAgICAgbWF4aW11bU51bWJlck9mUGFyYW1ldGVycyA9IHVuY3VycmllZENsb3N1cmUuZ2V0TWF4aW11bU51bWJlck9mUGFyYW1ldGVycygpLWFyZ3VtZW50cy5sZW5ndGg7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBDdXJyaWVkQ2xvc3VyZShDbG9zdXJlIHVuY3VycmllZENsb3N1cmUsIGludCBpKSB7CisgICAgICAgIHRoaXModW5jdXJyaWVkQ2xvc3VyZSwgbmV3IE9iamVjdFtde25ldyBJbnRlZ2VyKGkpfSk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdFtdIGdldFVuY3VycmllZEFyZ3VtZW50cyhPYmplY3RbXSBhcmd1bWVudHMpIHsKKyAgICAgICAgZmluYWwgT2JqZWN0IG5ld0N1cnJpZWRQYXJhbXNbXSA9IG5ldyBPYmplY3RbY3VycmllZFBhcmFtcy5sZW5ndGggKyBhcmd1bWVudHMubGVuZ3RoXTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShjdXJyaWVkUGFyYW1zLCAwLCBuZXdDdXJyaWVkUGFyYW1zLCAwLCBjdXJyaWVkUGFyYW1zLmxlbmd0aCk7CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYXJndW1lbnRzLCAwLCBuZXdDdXJyaWVkUGFyYW1zLCBjdXJyaWVkUGFyYW1zLmxlbmd0aCwgYXJndW1lbnRzLmxlbmd0aCk7CisgICAgICAgIHJldHVybiBuZXdDdXJyaWVkUGFyYW1zOyAgICAgICAgCisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldERlbGVnYXRlKE9iamVjdCBkZWxlZ2F0ZSkgeworICAgICAgICAoKENsb3N1cmUpZ2V0T3duZXIoKSkuc2V0RGVsZWdhdGUoZGVsZWdhdGUpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgeworICAgICAgICBDbG9zdXJlIHVuY3VycmllZENsb3N1cmUgPSAoQ2xvc3VyZSkgKChDbG9zdXJlKSBnZXRPd25lcigpKS5jbG9uZSgpOworICAgICAgICByZXR1cm4gbmV3IEN1cnJpZWRDbG9zdXJlKHVuY3VycmllZENsb3N1cmUsY3VycmllZFBhcmFtcyk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBDbGFzc1tdIGdldFBhcmFtZXRlclR5cGVzKCkgeworICAgICAgICBDbGFzc1tdIG9sZFBhcmFtcyA9ICgoQ2xvc3VyZSlnZXRPd25lcigpKS5nZXRQYXJhbWV0ZXJUeXBlcygpOworICAgICAgICBDbGFzc1tdIG5ld1BhcmFtcyA9IG5ldyBDbGFzc1tvbGRQYXJhbXMubGVuZ3RoLWN1cnJpZWRQYXJhbXMubGVuZ3RoXTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShvbGRQYXJhbXMsIGN1cnJpZWRQYXJhbXMubGVuZ3RoLCBuZXdQYXJhbXMsIDAsIG5ld1BhcmFtcy5sZW5ndGgpOworICAgICAgICByZXR1cm4gbmV3UGFyYW1zOyAgCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9EZWZhdWx0Q2FjaGVkTWV0aG9kS2V5LmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL0RlZmF1bHRDYWNoZWRNZXRob2RLZXkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDlkYzIyCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9EZWZhdWx0Q2FjaGVkTWV0aG9kS2V5LmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZTsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucmVmbGVjdGlvbi5DYWNoZWRDbGFzczsKKworCisvKioKKyAqIEEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBNZXRob2RLZXkKKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uOiA3OTIyICQKKyAqLworcHVibGljIGNsYXNzIERlZmF1bHRDYWNoZWRNZXRob2RLZXkgZXh0ZW5kcyBNZXRob2RLZXl7CisKKyAgICBwcml2YXRlIGZpbmFsIENhY2hlZENsYXNzW10gcGFyYW1ldGVyVHlwZXM7CisKKyAgICBwdWJsaWMgRGVmYXVsdENhY2hlZE1ldGhvZEtleShDbGFzcyBzZW5kZXIsIFN0cmluZyBuYW1lLCBDYWNoZWRDbGFzc1tdIHBhcmFtZXRlclR5cGVzLCBib29sZWFuIGlzQ2FsbFRvU3VwZXIpIHsKKyAgICAgICAgc3VwZXIoc2VuZGVyLCBuYW1lLGlzQ2FsbFRvU3VwZXIpOworICAgICAgICB0aGlzLnBhcmFtZXRlclR5cGVzID0gcGFyYW1ldGVyVHlwZXM7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRQYXJhbWV0ZXJDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIHBhcmFtZXRlclR5cGVzLmxlbmd0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3MgZ2V0UGFyYW1ldGVyVHlwZShpbnQgaW5kZXgpIHsKKyAgICAgICAgQ2FjaGVkQ2xhc3MgYyA9IHBhcmFtZXRlclR5cGVzW2luZGV4XTsKKyAgICAgICAgaWYgKGM9PW51bGwpIHJldHVybiBPYmplY3QuY2xhc3M7CisgICAgICAgIHJldHVybiBjLmdldENhY2hlZENsYXNzKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9EZWZhdWx0R3Jvb3Z5TWV0aG9kcy5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9EZWZhdWx0R3Jvb3Z5TWV0aG9kcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzZDZiNTkKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL0RlZmF1bHRHcm9vdnlNZXRob2RzLmphdmEKQEAgLTAsMCArMSw5MDc5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lOworCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuKjsKK2ltcG9ydCBncm9vdnkudXRpbC4qOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5tZXRhY2xhc3MuTWlzc2luZ1Byb3BlcnR5RXhjZXB0aW9uTm9TdGFjazsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUudHlwZWhhbmRsaW5nLkRlZmF1bHRUeXBlVHJhbnNmb3JtYXRpb247CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLnR5cGVoYW5kbGluZy5Hcm9vdnlDYXN0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS50eXBlaGFuZGxpbmcuTnVtYmVyTWF0aDsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLlJvb3RMb2FkZXI7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuUHJveHk7CitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CitpbXBvcnQgamF2YS5uZXQuKjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKKworLyoqCisgKiBUaGlzIGNsYXNzIGRlZmluZXMgYWxsIHRoZSBuZXcgZ3Jvb3Z5IG1ldGhvZHMgd2hpY2ggYXBwZWFyIG9uIG5vcm1hbCBKREsKKyAqIGNsYXNzZXMgaW5zaWRlIHRoZSBHcm9vdnkgZW52aXJvbm1lbnQuIFN0YXRpYyBtZXRob2RzIGFyZSB1c2VkIHdpdGggdGhlCisgKiBmaXJzdCBwYXJhbWV0ZXIgdGhlIGRlc3RpbmF0aW9uIGNsYXNzLgorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAYXV0aG9yIEplcmVteSBSYXluZXIKKyAqIEBhdXRob3IgU2FtIFB1bGxhcmEKKyAqIEBhdXRob3IgUm9kIENvcGUKKyAqIEBhdXRob3IgR3VpbGxhdW1lIExhZm9yZ2UKKyAqIEBhdXRob3IgSm9obiBXaWxzb24KKyAqIEBhdXRob3IgSGVpbiBNZWxpbmcKKyAqIEBhdXRob3IgRGllcmsgS29lbmlnCisgKiBAYXV0aG9yIFBpbGhvIEtpbQorICogQGF1dGhvciBNYXJjIEd1aWxsZW1vdAorICogQGF1dGhvciBSdXNzZWwgV2luZGVyCisgKiBAYXV0aG9yIGJpbmcgcmFuCisgKiBAYXV0aG9yIEpvY2hlbiBUaGVvZG9yb3UKKyAqIEBhdXRob3IgUGF1bCBLaW5nCisgKiBAYXV0aG9yIE1pY2hhZWwgQmFlaHIKKyAqIEBhdXRob3IgSm9hY2hpbSBCYXVtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBEZWZhdWx0R3Jvb3Z5TWV0aG9kcyB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyLmdldExvZ2dlcihEZWZhdWx0R3Jvb3Z5TWV0aG9kcy5jbGFzcy5nZXROYW1lKCkpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEludGVnZXIgT05FID0gbmV3IEludGVnZXIoMSk7CisKKyAgICAvKioKKyAgICAgKiBJZGVudGl0eSBjaGVjay4gU2luY2UgPT0gaXMgb3ZlcnJpZGRlbiBpbiBHcm9vdnkgd2l0aCB0aGUgbWVhbmluZyBvZiBlcXVhbGl0eQorICAgICAqIHdlIG5lZWQgc29tZSBmYWxsYmFjayB0byBjaGVjayBmb3Igb2JqZWN0IGlkZW50aXR5LiAgSW52b2tlIHVzaW5nIHRoZQorICAgICAqICdpcycgb3BlcmF0b3IsIGxpa2Ugc286IDxjb2RlPmRlZiBzYW1lID0gKHRoaXMgaXMgdGhhdCk8L2NvZGU+CisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgYW4gb2JqZWN0CisgICAgICogQHBhcmFtIG90aGVyIGFuIG9iamVjdCB0byBjb21wYXJlIGlkZW50aXR5IHdpdGgKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgc2VsZiBhbmQgb3RoZXIgYXJlIGJvdGggcmVmZXJlbmNlcyB0byB0aGUgc2FtZQorICAgICAqICAgICAgICAgaW5zdGFuY2UsIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpcyhPYmplY3Qgc2VsZiwgT2JqZWN0IG90aGVyKSB7CisgICAgICAgIHJldHVybiBzZWxmID09IG90aGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFsbG93cyB0aGUgY2xvc3VyZSB0byBiZSBjYWxsZWQgZm9yIHRoZSBvYmplY3QgcmVmZXJlbmNlIHNlbGYKKyAgICAgKiBzeW5vbnltIGZvciAnd2l0aCgpJy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmICAgIHRoZSBvYmplY3QgdG8gaGF2ZSBhIGNsb3N1cmUgYWN0IHVwb24KKyAgICAgKiBAcGFyYW0gY2xvc3VyZSB0aGUgY2xvc3VyZSB0byBjYWxsIG9uIHRoZSBvYmplY3QKKyAgICAgKiBAcmV0dXJuIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSBjbG9zdXJlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgaWRlbnRpdHkoT2JqZWN0IHNlbGYsIENsb3N1cmUgY2xvc3VyZSkgeworICAgICAgICByZXR1cm4gRGVmYXVsdEdyb292eU1ldGhvZHMud2l0aChzZWxmLCBjbG9zdXJlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbGxvd3MgdGhlIGNsb3N1cmUgdG8gYmUgY2FsbGVkIGZvciB0aGUgb2JqZWN0IHJlZmVyZW5jZSBzZWxmCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgICB0aGUgb2JqZWN0IHRvIGhhdmUgYSBjbG9zdXJlIGFjdCB1cG9uCisgICAgICogQHBhcmFtIGNsb3N1cmUgdGhlIGNsb3N1cmUgdG8gY2FsbCBvbiB0aGUgb2JqZWN0CisgICAgICogQHJldHVybiByZXN1bHQgb2YgY2FsbGluZyB0aGUgY2xvc3VyZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHdpdGgoT2JqZWN0IHNlbGYsIENsb3N1cmUgY2xvc3VyZSkgeworICAgICAgICBmaW5hbCBDbG9zdXJlIGNsb25lZENsb3N1cmUgPSAoQ2xvc3VyZSkgY2xvc3VyZS5jbG9uZSgpOworICAgICAgICBjbG9uZWRDbG9zdXJlLnNldERlbGVnYXRlKHNlbGYpOworICAgICAgICByZXR1cm4gY2xvbmVkQ2xvc3VyZS5jYWxsKHNlbGYpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFsbG93cyB0aGUgc3Vic2NyaXB0IG9wZXJhdG9yIHRvIGJlIHVzZWQgdG8gbG9va3VwIGR5bmFtaWMgcHJvcGVydHkgdmFsdWVzLgorICAgICAqIDxjb2RlPmJlYW5bc29tZVByb3BlcnR5TmFtZUV4cHJlc3Npb25dPC9jb2RlPi4gVGhlIG5vcm1hbCBwcm9wZXJ0eSBub3RhdGlvbgorICAgICAqIG9mIGdyb292eSBpcyBuZWF0ZXIgYW5kIG1vcmUgY29uY2lzZSBidXQgb25seSB3b3JrcyB3aXRoIGNvbXBpbGUtdGltZSBrbm93bgorICAgICAqIHByb3BlcnR5IG5hbWVzLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgICAgIHRoZSBvYmplY3QgdG8gYWN0IHVwb24KKyAgICAgKiBAcGFyYW0gcHJvcGVydHkgdGhlIHByb3BlcnR5IG5hbWUgb2YgaW50ZXJlc3QKKyAgICAgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEF0KE9iamVjdCBzZWxmLCBTdHJpbmcgcHJvcGVydHkpIHsKKyAgICAgICAgcmV0dXJuIEludm9rZXJIZWxwZXIuZ2V0UHJvcGVydHkoc2VsZiwgcHJvcGVydHkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFsbG93cyB0aGUgc3Vic2NyaXB0IG9wZXJhdG9yIHRvIGJlIHVzZWQgdG8gc2V0IGR5bmFtaWNhbGx5IG5hbWVkIHByb3BlcnR5IHZhbHVlcy4KKyAgICAgKiA8Y29kZT5iZWFuW3NvbWVQcm9wZXJ0eU5hbWVFeHByZXNzaW9uXSA9IGZvbzwvY29kZT4uIFRoZSBub3JtYWwgcHJvcGVydHkgbm90YXRpb24KKyAgICAgKiBvZiBncm9vdnkgaXMgbmVhdGVyIGFuZCBtb3JlIGNvbmNpc2UgYnV0IG9ubHkgd29ya3Mgd2l0aCBwcm9wZXJ0eSBuYW1lcyB3aGljaAorICAgICAqIGFyZSBrbm93biBhdCBjb21waWxlIHRpbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgICAgdGhlIG9iamVjdCB0byBhY3QgdXBvbgorICAgICAqIEBwYXJhbSBwcm9wZXJ0eSB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gc2V0CisgICAgICogQHBhcmFtIG5ld1ZhbHVlIHRoZSB2YWx1ZSB0byBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHV0QXQoT2JqZWN0IHNlbGYsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IG5ld1ZhbHVlKSB7CisgICAgICAgIEludm9rZXJIZWxwZXIuc2V0UHJvcGVydHkoc2VsZiwgcHJvcGVydHksIG5ld1ZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgYSBkZXRhaWxlZCBkdW1wIHN0cmluZyBvZiBhbiBvYmplY3Qgc2hvd2luZyBpdHMgY2xhc3MsCisgICAgICogaGFzaENvZGUgYW5kIGZpZWxkcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmIGFuIG9iamVjdAorICAgICAqIEByZXR1cm4gdGhlIGR1bXAgcmVwcmVzZW50YXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBkdW1wKE9iamVjdCBzZWxmKSB7CisgICAgICAgIGlmIChzZWxmID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiAibnVsbCI7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoIjwiKTsKKyAgICAgICAgQ2xhc3Mga2xhc3MgPSBzZWxmLmdldENsYXNzKCk7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoa2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiQCIpOworICAgICAgICBidWZmZXIuYXBwZW5kKEludGVnZXIudG9IZXhTdHJpbmcoc2VsZi5oYXNoQ29kZSgpKSk7CisgICAgICAgIGJvb2xlYW4gZ3Jvb3Z5T2JqZWN0ID0gc2VsZiBpbnN0YW5jZW9mIEdyb292eU9iamVjdDsKKworICAgICAgICAvKmplcyB0aGlzIG1heSBiZSByZXdyaXR0ZW4gdG8gdXNlIHRoZSBuZXcgZ2V0UHJvcGVydGllcygpIHN0dWZmCisgICAgICAgICAqIGJ1dCB0aGUgb3JpZ2luYWwgcHVsbHMgb3V0IHByaXZhdGUgdmFyaWFibGVzLCB3aGVyZWFzIGdldFByb3BlcnRpZXMoKQorICAgICAgICAgKiBkb2VzIG5vdC4gV2hhdCdzIHRoZSByZWFsIHVzZSBvZiBkdW1wKCkgaGVyZT8KKyAgICAgICAgICovCisgICAgICAgIHdoaWxlIChrbGFzcyAhPSBudWxsKSB7CisgICAgICAgICAgICBGaWVsZFtdIGZpZWxkcyA9IGtsYXNzLmdldERlY2xhcmVkRmllbGRzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGZpbmFsIEZpZWxkIGZpZWxkID0gZmllbGRzW2ldOworICAgICAgICAgICAgICAgIGlmICgoZmllbGQuZ2V0TW9kaWZpZXJzKCkgJiBNb2RpZmllci5TVEFUSUMpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdyb292eU9iamVjdCAmJiBmaWVsZC5nZXROYW1lKCkuZXF1YWxzKCJtZXRhQ2xhc3MiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiICIpOworICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGZpZWxkLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIj0iKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoSW52b2tlckhlbHBlci50b1N0cmluZyhmaWVsZC5nZXQoc2VsZikpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGtsYXNzID0ga2xhc3MuZ2V0U3VwZXJjbGFzcygpOworICAgICAgICB9CisKKyAgICAgICAgLyogaGVyZSBpcyBhIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbiB0aGF0IHVzZXMgZ2V0UHJvcGVydGllcygpLiBJIGhhdmUgbGVmdAorICAgICAgICAgKiBpdCBjb21tZW50ZWQgb3V0IGJlY2F1c2UgaXQgcmV0dXJucyBhIHNsaWdodGx5IGRpZmZlcmVudCBsaXN0IG9mIHByb3BlcnRpZXM7CisgICAgICAgICAqIGllIGl0IGRvZXMgbm90IHJldHVybiBwcml2YXRlcy4gSSBkb24ndCBrbm93IHdoYXQgZHVtcCgpIHJlYWxseSBzaG91bGQgYmUgZG9pbmcsCisgICAgICAgICAqIGFsdGhvdWdoIElNTyBzaG93aW5nIHByaXZhdGUgZmllbGRzIGlzIGEgbm8tbm8KKyAgICAgICAgICovCisgICAgICAgIC8qCisgICAgICAgIExpc3QgcHJvcHMgPSBnZXRQcm9wZXJ0aWVzKHNlbGYpOworICAgICAgICAgICAgZm9yKEl0ZXJhdG9yIGl0ciA9IHByb3BzLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7ICkgeworICAgICAgICAgICAgU3RyaW5nIHByb3BOYW1lID0gaXRyLm5leHQoKS50b1N0cmluZygpOworCisgICAgICAgICAgICAvLyB0aGUgb3JpZ2luYWwgc2tpcHBlZCB0aGlzLCBzbyBJIHdpbGwgdG9vCisgICAgICAgICAgICBpZihwdi5nZXROYW1lKCkuZXF1YWxzKCJtZXRhQ2xhc3MiKSkgY29udGludWU7CisgICAgICAgICAgICBpZihwdi5nZXROYW1lKCkuZXF1YWxzKCJjbGFzcyIpKSBjb250aW51ZTsKKworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiICIpOworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChwcm9wTmFtZSk7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCI9Iik7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoSW52b2tlckhlbHBlci50b1N0cmluZyhwcm9wcy5nZXQocHJvcE5hbWUpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICovCisKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiPiIpOworICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBsaXN0IG9mIHtAbGluayBNZXRhUHJvcGVydHl9IG9iamVjdHMgZm9yICdzZWxmJyBhbmQgd3JhcHMgaXQKKyAgICAgKiBpbiBhIGxpc3Qgb2Yge0BsaW5rIFByb3BlcnR5VmFsdWV9IG9iamVjdHMgdGhhdCBhZGRpdGlvbmFsbHkgcHJvdmlkZQorICAgICAqIHRoZSB2YWx1ZSBmb3IgZWFjaCBwcm9wZXJ0eSBvZiAnc2VsZicuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiB0aGUgcmVjZWl2ZXIgb2JqZWN0CisgICAgICogQHJldHVybiBsaXN0IG9mIHtAbGluayBQcm9wZXJ0eVZhbHVlfSBvYmplY3RzCisgICAgICogQHNlZSBncm9vdnkudXRpbC5FeHBhbmRvI2dldE1ldGFQcm9wZXJ0eVZhbHVlcygpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMaXN0IGdldE1ldGFQcm9wZXJ0eVZhbHVlcyhPYmplY3Qgc2VsZikgeworICAgICAgICBNZXRhQ2xhc3MgbWV0YUNsYXNzID0gSW52b2tlckhlbHBlci5nZXRNZXRhQ2xhc3Moc2VsZik7CisgICAgICAgIExpc3QgbXBzID0gbWV0YUNsYXNzLmdldFByb3BlcnRpZXMoKTsKKyAgICAgICAgTGlzdCBwcm9wcyA9IG5ldyBBcnJheUxpc3QobXBzLnNpemUoKSk7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRyID0gbXBzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBNZXRhUHJvcGVydHkgbXAgPSAoTWV0YVByb3BlcnR5KSBpdHIubmV4dCgpOworICAgICAgICAgICAgUHJvcGVydHlWYWx1ZSBwdiA9IG5ldyBQcm9wZXJ0eVZhbHVlKHNlbGYsIG1wKTsKKyAgICAgICAgICAgIHByb3BzLmFkZChwdik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHByb3BzOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGNhbGxzIHtAbGluayAjZ2V0TWV0YVByb3BlcnR5VmFsdWVzKE9iamVjdCl9KHNlbGYpCisgICAgICogYW5kIHByb3ZpZGVzIHRoZSBkYXRhIGluIGZvcm0gb2Ygc2ltcGxlIGtleS92YWx1ZSBwYWlycywgaS5lLiB3aXRob3V0CisgICAgICogdHlwZSgpIGluZm9ybWF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgdGhlIHJlY2VpdmVyIG9iamVjdAorICAgICAqIEByZXR1cm4gbWV0YSBwcm9wZXJ0aWVzIGFzIE1hcCBvZiBrZXkvdmFsdWUgcGFpcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE1hcCBnZXRQcm9wZXJ0aWVzKE9iamVjdCBzZWxmKSB7CisgICAgICAgIExpc3QgbWV0YVByb3BzID0gZ2V0TWV0YVByb3BlcnR5VmFsdWVzKHNlbGYpOworICAgICAgICBNYXAgcHJvcHMgPSBuZXcgSGFzaE1hcChtZXRhUHJvcHMuc2l6ZSgpKTsKKworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IG1ldGFQcm9wcy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgUHJvcGVydHlWYWx1ZSBwdiA9IChQcm9wZXJ0eVZhbHVlKSBpdHIubmV4dCgpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBwcm9wcy5wdXQocHYuZ2V0TmFtZSgpLCBwdi5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTE9HLnRocm93aW5nKHNlbGYuZ2V0Q2xhc3MoKS5nZXROYW1lKCksICJnZXRQcm9wZXJ0eSgiICsgcHYuZ2V0TmFtZSgpICsgIikiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcHJvcHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2NvcGVkIHVzZSBtZXRob2QKKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmICAgICAgICAgIGFueSBPYmplY3QKKyAgICAgKiBAcGFyYW0gY2F0ZWdvcnlDbGFzcyBhIGNhdGVnb3J5IGNsYXNzIHRvIHVzZQorICAgICAqIEBwYXJhbSBjbG9zdXJlICAgICAgIHRoZSBjbG9zdXJlIHRvIGludm9rZSB3aXRoIHRoZSBjYXRlZ29yeSBpbiBwbGFjZQorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIHJldHVybmVkIGZyb20gdGhlIGNsb3N1cmUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCB1c2UoT2JqZWN0IHNlbGYsIENsYXNzIGNhdGVnb3J5Q2xhc3MsIENsb3N1cmUgY2xvc3VyZSkgeworICAgICAgICByZXR1cm4gR3Jvb3Z5Q2F0ZWdvcnlTdXBwb3J0LnVzZShjYXRlZ29yeUNsYXNzLCBjbG9zdXJlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTY29wZWQgdXNlIG1ldGhvZCB3aXRoIGxpc3Qgb2YgY2F0ZWdvcmllcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmICAgICAgICAgICAgICBhbnkgT2JqZWN0CisgICAgICogQHBhcmFtIGNhdGVnb3J5Q2xhc3NMaXN0IGEgbGlzdCBvZiBjYXRlZ29yeSBjbGFzc2VzCisgICAgICogQHBhcmFtIGNsb3N1cmUgICAgICAgICAgIHRoZSBjbG9zdXJlIHRvIGludm9rZSB3aXRoIHRoZSBjYXRlZ29yaWVzIGluIHBsYWNlCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgcmV0dXJuZWQgZnJvbSB0aGUgY2xvc3VyZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHVzZShPYmplY3Qgc2VsZiwgTGlzdCBjYXRlZ29yeUNsYXNzTGlzdCwgQ2xvc3VyZSBjbG9zdXJlKSB7CisgICAgICAgIHJldHVybiBHcm9vdnlDYXRlZ29yeVN1cHBvcnQudXNlKGNhdGVnb3J5Q2xhc3NMaXN0LCBjbG9zdXJlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbGxvd3MgdGhlIHVzYWdlIG9mIGFkZFNodXRkb3duSG9vayB3aXRob3V0IGdldHRpbmcgdGhlIHJ1bnRpbWUgZmlyc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgICB0aGUgb2JqZWN0IHRoZSBtZXRob2QgaXMgY2FsbGVkIG9uIChpZ25vcmVkKQorICAgICAqIEBwYXJhbSBjbG9zdXJlIHRoZSBzaHV0ZG93biBob29rIGFjdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRTaHV0ZG93bkhvb2soT2JqZWN0IHNlbGYsIENsb3N1cmUgY2xvc3VyZSkgeworICAgICAgICBSdW50aW1lLmdldFJ1bnRpbWUoKS5hZGRTaHV0ZG93bkhvb2sobmV3IFRocmVhZChjbG9zdXJlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogdXNlKCkgYSBsaXN0IG9mIGNhdGVnb3JpZXMsIHNwZWNpZnlpbmcgdGhlIGxpc3QgYXMgdmFyYXJnczo8YnI+CisgICAgICogdXNlKENhdGVnb3J5Q2xhc3MxLCBDYXRlZ29yeUNsYXNzMikgeyAuLi4gfTxicj4KKyAgICAgKiBUaGlzIG1ldGhvZCBwcmV2ZW50cyB0aGUgZXJyb3Igb2YgZm9yZ2V0dGluZyB0byB3cmFwIHRoZSB0aGUgY2F0ZWdvcnkKKyAgICAgKiBjbGFzc2VzIGluIGEgbGlzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmICBhbnkgT2JqZWN0CisgICAgICogQHBhcmFtIGFycmF5IGEgbGlzdCBvZiBjYXRlZ29yeSBjbGFzc2VzIGFuZCBhIENsb3N1cmUKKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIHRoZSBjbG9zdXJlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgdXNlKE9iamVjdCBzZWxmLCBPYmplY3RbXSBhcnJheSkgeworICAgICAgICBpZiAoYXJyYXkubGVuZ3RoIDwgMikKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJFeHBlY3RpbmcgYXQgbGVhc3QgMiBhcmd1bWVudHMsIGEgY2F0ZWdvcnkgY2xhc3MgYW5kIGEgQ2xvc3VyZSIpOworICAgICAgICBDbG9zdXJlIGNsb3N1cmU7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjbG9zdXJlID0gKENsb3N1cmUpIGFycmF5W2FycmF5Lmxlbmd0aCAtIDFdOworICAgICAgICB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRXhwZWN0aW5nIGEgQ2xvc3VyZSB0byBiZSB0aGUgbGFzdCBhcmd1bWVudCIpOworICAgICAgICB9CisgICAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoYXJyYXkubGVuZ3RoIC0gMSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoIC0gMTsgKytpKQorICAgICAgICAgICAgbGlzdC5hZGQoYXJyYXlbaV0pOworICAgICAgICByZXR1cm4gR3Jvb3Z5Q2F0ZWdvcnlTdXBwb3J0LnVzZShsaXN0LCBjbG9zdXJlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmludCBhIHZhbHVlIHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQgc3RyZWFtLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgIGFueSBPYmplY3QKKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIHByaW50CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHByaW50KE9iamVjdCBzZWxmLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludChJbnZva2VySGVscGVyLnRvU3RyaW5nKHZhbHVlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJpbnQgYSBsaW5lYnJlYWsgdG8gdGhlIHN0YW5kYXJkIG91dHB1dCBzdHJlYW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiBhbnkgT2JqZWN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHByaW50bG4oT2JqZWN0IHNlbGYpIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJpbnQgYSB2YWx1ZSAoZm9sbG93ZWQgYnkgYSBuZXdsaW5lKSB0byB0aGUgc3RhbmRhcmQgb3V0cHV0IHN0cmVhbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmICBhbnkgT2JqZWN0CisgICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBwcmludAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludGxuKE9iamVjdCBzZWxmLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKEludm9rZXJIZWxwZXIudG9TdHJpbmcodmFsdWUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmludGYgdG8gYSBjb25zb2xlLiAgT25seSB3b3JrcyB3aXRoIEpESzEuNSBvciBsYXRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmICAgYW55IE9iamVjdAorICAgICAqIEBwYXJhbSBmb3JtYXQgYSBmb3JtYXQgc3RyaW5nCisgICAgICogQHBhcmFtIHZhbHVlcyB2YWx1ZXMgcmVmZXJlbmNlZCBieSB0aGUgZm9ybWF0IHNwZWNpZmllcnMgaW4gdGhlIGZvcm1hdCBzdHJpbmcuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHByaW50ZihPYmplY3Qgc2VsZiwgU3RyaW5nIGZvcm1hdCwgT2JqZWN0W10gdmFsdWVzKSB7CisgICAgICAgIGlmIChzZWxmIGluc3RhbmNlb2YgUHJpbnRTdHJlYW0pCisgICAgICAgICAgICBwcmludGYoKFByaW50U3RyZWFtKSBzZWxmLCBmb3JtYXQsIHZhbHVlcyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHByaW50ZihTeXN0ZW0ub3V0LCBmb3JtYXQsIHZhbHVlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3ByaW50ZiB0byBhIHN0cmluZy4gIE9ubHkgd29ya3Mgd2l0aCBKREsxLjUgb3IgbGF0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgIGFueSBPYmplY3QKKyAgICAgKiBAcGFyYW0gZm9ybWF0IGEgZm9ybWF0IHN0cmluZworICAgICAqIEBwYXJhbSB2YWx1ZXMgdmFsdWVzIHJlZmVyZW5jZWQgYnkgdGhlIGZvcm1hdCBzcGVjaWZpZXJzIGluIHRoZSBmb3JtYXQgc3RyaW5nLgorICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdGluZyBmb3JtYXR0ZWQgc3RyaW5nCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgc3ByaW50ZihPYmplY3Qgc2VsZiwgU3RyaW5nIGZvcm1hdCwgT2JqZWN0W10gdmFsdWVzKSB7CisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIFByaW50U3RyZWFtIG91dCA9IG5ldyBQcmludFN0cmVhbShvdXRwdXRTdHJlYW0pOworICAgICAgICBwcmludGYob3V0LCBmb3JtYXQsIHZhbHVlcyk7CisgICAgICAgIHJldHVybiBvdXRwdXRTdHJlYW0udG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmludGYgdG8gYSBQcmludFN0cmVhbS4gIE9ubHkgd29ya3Mgd2l0aCBKREsxLjUgb3IgbGF0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3V0ICAgIGEgUHJpbnRTdHJlYW0gb2JqZWN0CisgICAgICogQHBhcmFtIGZvcm1hdCBhIGZvcm1hdCBzdHJpbmcKKyAgICAgKiBAcGFyYW0gdmFsdWVzIHZhbHVlcyByZWZlcmVuY2VkIGJ5IHRoZSBmb3JtYXQgc3BlY2lmaWVycyBpbiB0aGUgZm9ybWF0IHN0cmluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50ZihQcmludFN0cmVhbSBvdXQsIFN0cmluZyBmb3JtYXQsIE9iamVjdFtdIHZhbHVlcykgeworICAgICAgICBjaGFyIHZlcnNpb24gPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEudmVyc2lvbiIpLmNoYXJBdCgyKTsKKyAgICAgICAgaWYgKHZlcnNpb24gPj0gJzUnKSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gIENhbm5vdCBqdXN0IGRvOgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50Zihmb3JtYXQsIHZhbHVlcykgOworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vICBiZWNhdXNlIHRoaXMgZmFpbHMgdG8gY29tcGlsZSBvbiBKREsxLjQueCBhbmQgZWFybGllci4gIFNvIHVudGlsIHRoZSBlbnRpcmUgd29ybGQgaXMgdXNpbmcKKyAgICAgICAgICAgIC8vICBKREsxLjUgb3IgbGF0ZXIgdGhlbiB3ZSBoYXZlIHRvIGRvIHRoaW5ncyBieSByZWZsZWN0aW9uIHNvIGFzIHRvIGhpZGUgdGhlIHVzZSBvZiBwcmludGYKKyAgICAgICAgICAgIC8vICBmcm9tIHRoZSBjb21waWxlci4gIEluIEpESzEuNSB5b3UgbWlnaHQgdHJ5OgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vICAgICAgICBTeXN0ZW0ub3V0LmdldENsYXNzKCkuZ2V0TWV0aG9kKCJwcmludGYiLCBTdHJpbmcuY2xhc3MsIE9iamVjdFtdLmNsYXNzKS5pbnZva2UoU3lzdGVtLm91dCwgZm9ybWF0LCB2YWx1ZXMpIDsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyAgYnV0IG9mIGNvdXJzZSB0aGlzIGRvZXNuJ3Qgd29yayBvbiBKREsxLjQgYXMgaXQgcmVsaWVzIG9uIHZhcmFyZ3MuICBhcmdoLiAgU28gd2UgYXJlCisgICAgICAgICAgICAvLyAgZm9yY2VkIGludG86CisgICAgICAgICAgICAvLworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBvdXQuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoInByaW50ZiIsIG5ldyBDbGFzc1tde1N0cmluZy5jbGFzcywgT2JqZWN0W10uY2xhc3N9KS5pbnZva2Uob3V0LCBuZXcgT2JqZWN0W117Zm9ybWF0LCB2YWx1ZXN9KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBuc21lKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImdldE1ldGhvZCB0aHJldyBhIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbi4gIFRoaXMgaXMgaW1wb3NzaWJsZS4iKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaWFlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImludm9rZSB0aHJldyBhbiBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLiAgVGhpcyBpcyBpbXBvc3NpYmxlLiIpOworICAgICAgICAgICAgfSBjYXRjaCAoamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpdGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52b2tlckludm9jYXRpb25FeGNlcHRpb24oaXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJwcmludGYgcmVxdWlyZXMgSkRLMS41IG9yIGxhdGVyLiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJpbnRzIGEgZm9ybWF0dGVkIHN0cmluZyB1c2luZyB0aGUgc3BlY2lmaWVkIGZvcm1hdCBzdHJpbmcgYW5kCisgICAgICogYXJndW1lbnRzLgorICAgICAqIDxwLz4KKyAgICAgKiA8cC8+CisgICAgICogRm9yIGV4YW1wbGVzLCA8cHJlPgorICAgICAqICAgICBwcmludGYgKCAiSGVsbG8sICVzIVxuIiAsIFsgIndvcmxkIiBdIGFzIFN0cmluZ1tdICkKKyAgICAgKiAgICAgcHJpbnRmICggIkhlbGxvLCAlcyFcbiIgLCBbICJHcm9vdnkiIF0pCisgICAgICogICAgIHByaW50ZiAoICIlZCArICVkID0gJWRcbiIgLCBbIDEgLCAyICwgMSsyIF0gYXMgSW50ZWdlcltdICkKKyAgICAgKiAgICAgcHJpbnRmICggIiVkICsgJWQgPSAlZFxuIiAsIFsgMyAsIDMgLCAzKzMgXSkKKyAgICAgKiA8cC8+CisgICAgICogICAgICggMS4uNSApLmVhY2ggeyBwcmludGYgKCAiLS0gJWRcbiIgLCBbIGl0IF0gYXMgSW50ZWdlcltdICkgfQorICAgICAqICAgICAoIDEuLjUgKS5lYWNoIHsgcHJpbnRmICggIi0tICVkXG4iICwgWyBpdCBdIGFzIGludFtdICkgfQorICAgICAqICAgICAoIDB4NDEuLjB4NDUgKS5lYWNoIHsgcHJpbnRmICggIi0tICVjXG4iICwgWyBpdCBdIGFzIGNoYXJbXSApIH0KKyAgICAgKiAgICAgKCAwNy4uMDExICkuZWFjaCB7IHByaW50ZiAoICItLSAlZFxuIiAsIFsgaXQgXSBhcyBieXRlW10gKSB9CisgICAgICogICAgICggNy4uMTEgKS5lYWNoIHsgcHJpbnRmICggIi0tICVkXG4iICwgWyBpdCBdIGFzIHNob3J0W10gKSB9CisgICAgICogICAgICggNy4uMTEgKS5lYWNoIHsgcHJpbnRmICggIi0tICVkXG4iICwgWyBpdCBdIGFzIGxvbmdbXSApIH0KKyAgICAgKiAgICAgKCA3Li4xMSApLmVhY2ggeyBwcmludGYgKCAiLS0gJTUuMmZcbiIgLCBbIGl0IF0gYXMgZmxvYXRbXSApIH0KKyAgICAgKiAgICAgKCA3Li4xMSApLmVhY2ggeyBwcmludGYgKCAiLS0gJTUuMmdcbiIgLCBbIGl0IF0gYXMgZG91YmxlW10gKSB9CisgICAgICogPC9wcmU+CisgICAgICogPHAvPgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgICBhbnkgT2JqZWN0CisgICAgICogQHBhcmFtIGZvcm1hdCBBIGZvcm1hdCBzdHJpbmcKKyAgICAgKiBAcGFyYW0gYXJnICAgIEFyZ3VtZW50IHdoaWNoIGlzIHJlZmVyZW5jZWQgYnkgdGhlIGZvcm1hdCBzcGVjaWZpZXJzIGluIHRoZSBmb3JtYXQKKyAgICAgKiAgICAgICAgICAgICAgIHN0cmluZy4gIFRoZSB0eXBlIG9mIDxjb2RlPmFyZzwvY29kZT4gc2hvdWxkIGJlIG9uZSBvZiBPYmplY3RbXSwgTGlzdCwKKyAgICAgKiAgICAgICAgICAgICAgIGludFtdLCBzaG9ydFtdLCBieXRlW10sIGNoYXJbXSwgYm9vbGVhbltdLCBsb25nW10sIGZsb2F0W10sIG9yIGRvdWJsZVtdLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludGYoT2JqZWN0IHNlbGYsIFN0cmluZyBmb3JtYXQsIE9iamVjdCBhcmcpIHsKKyAgICAgICAgaWYgKHNlbGYgaW5zdGFuY2VvZiBQcmludFN0cmVhbSkKKyAgICAgICAgICAgIHByaW50ZigoUHJpbnRTdHJlYW0pIHNlbGYsIGZvcm1hdCwgYXJnKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHJpbnRmKFN5c3RlbS5vdXQsIGZvcm1hdCwgYXJnKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50ZihQcmludFN0cmVhbSBzZWxmLCBTdHJpbmcgZm9ybWF0LCBPYmplY3QgYXJnKSB7CisgICAgICAgIGlmIChhcmcgaW5zdGFuY2VvZiBPYmplY3RbXSkgeworICAgICAgICAgICAgcHJpbnRmKHNlbGYsIGZvcm1hdCwgKE9iamVjdFtdKSBhcmcpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChhcmcgaW5zdGFuY2VvZiBMaXN0KSB7CisgICAgICAgICAgICBwcmludGYoc2VsZiwgZm9ybWF0LCAoKExpc3QpIGFyZykudG9BcnJheSgpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWFyZy5nZXRDbGFzcygpLmlzQXJyYXkoKSkgeworICAgICAgICAgICAgT2JqZWN0W10gbyA9IChPYmplY3RbXSkgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXkubmV3SW5zdGFuY2UoYXJnLmdldENsYXNzKCksIDEpOworICAgICAgICAgICAgb1swXSA9IGFyZzsKKyAgICAgICAgICAgIHByaW50ZihzZWxmLCBmb3JtYXQsIG8pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgT2JqZWN0W10gYW5zOworICAgICAgICBTdHJpbmcgZWxlbVR5cGUgPSBhcmcuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7CisgICAgICAgIGlmIChlbGVtVHlwZS5lcXVhbHMoIltJIikpIHsKKyAgICAgICAgICAgIGludFtdIGlhID0gKGludFtdKSBhcmc7CisgICAgICAgICAgICBhbnMgPSBuZXcgSW50ZWdlcltpYS5sZW5ndGhdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpYS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGFuc1tpXSA9IG5ldyBJbnRlZ2VyKGlhW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChlbGVtVHlwZS5lcXVhbHMoIltDIikpIHsKKyAgICAgICAgICAgIGNoYXJbXSBpYSA9IChjaGFyW10pIGFyZzsKKyAgICAgICAgICAgIGFucyA9IG5ldyBDaGFyYWN0ZXJbaWEubGVuZ3RoXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaWEubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBhbnNbaV0gPSBuZXcgQ2hhcmFjdGVyKGlhW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChlbGVtVHlwZS5lcXVhbHMoIltaIikpIHsKKyAgICAgICAgICAgIGJvb2xlYW5bXSBpYSA9IChib29sZWFuW10pIGFyZzsKKyAgICAgICAgICAgIGFucyA9IG5ldyBCb29sZWFuW2lhLmxlbmd0aF07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlhLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgYW5zW2ldID0gbmV3IEJvb2xlYW4oaWFbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGVsZW1UeXBlLmVxdWFscygiW0IiKSkgeworICAgICAgICAgICAgYnl0ZVtdIGlhID0gKGJ5dGVbXSkgYXJnOworICAgICAgICAgICAgYW5zID0gbmV3IEJ5dGVbaWEubGVuZ3RoXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaWEubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBhbnNbaV0gPSBuZXcgQnl0ZShpYVtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZWxlbVR5cGUuZXF1YWxzKCJbUyIpKSB7CisgICAgICAgICAgICBzaG9ydFtdIGlhID0gKHNob3J0W10pIGFyZzsKKyAgICAgICAgICAgIGFucyA9IG5ldyBTaG9ydFtpYS5sZW5ndGhdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpYS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGFuc1tpXSA9IG5ldyBTaG9ydChpYVtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZWxlbVR5cGUuZXF1YWxzKCJbRiIpKSB7CisgICAgICAgICAgICBmbG9hdFtdIGlhID0gKGZsb2F0W10pIGFyZzsKKyAgICAgICAgICAgIGFucyA9IG5ldyBGbG9hdFtpYS5sZW5ndGhdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpYS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGFuc1tpXSA9IG5ldyBGbG9hdChpYVtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZWxlbVR5cGUuZXF1YWxzKCJbSiIpKSB7CisgICAgICAgICAgICBsb25nW10gaWEgPSAobG9uZ1tdKSBhcmc7CisgICAgICAgICAgICBhbnMgPSBuZXcgTG9uZ1tpYS5sZW5ndGhdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpYS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGFuc1tpXSA9IG5ldyBMb25nKGlhW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChlbGVtVHlwZS5lcXVhbHMoIltEIikpIHsKKyAgICAgICAgICAgIGRvdWJsZVtdIGlhID0gKGRvdWJsZVtdKSBhcmc7CisgICAgICAgICAgICBhbnMgPSBuZXcgRG91YmxlW2lhLmxlbmd0aF07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlhLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgYW5zW2ldID0gbmV3IERvdWJsZShpYVtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigicHJpbnRmKFN0cmluZywiICsgYXJnICsgIikiKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGYoc2VsZiwgZm9ybWF0LCBhbnMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBmb3JtYXR0ZWQgc3RyaW5nIHVzaW5nIHRoZSBzcGVjaWZpZWQgZm9ybWF0IHN0cmluZyBhbmQKKyAgICAgKiBhcmd1bWVudHMuCisgICAgICogPHAvPgorICAgICAqIFRPRE86IHJlbW92ZSBkdXBsaWNhdGlvbiB3aXRoIHByaW50ZgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgICBhbnkgT2JqZWN0CisgICAgICogQHBhcmFtIGZvcm1hdCBBIGZvcm1hdCBzdHJpbmcKKyAgICAgKiBAcGFyYW0gYXJnICAgIEFyZ3VtZW50IHdoaWNoIGlzIHJlZmVyZW5jZWQgYnkgdGhlIGZvcm1hdCBzcGVjaWZpZXJzIGluIHRoZSBmb3JtYXQKKyAgICAgKiAgICAgICAgICAgICAgIHN0cmluZy4gIFRoZSB0eXBlIG9mIDxjb2RlPmFyZzwvY29kZT4gc2hvdWxkIGJlIG9uZSBvZiBPYmplY3RbXSwgTGlzdCwKKyAgICAgKiAgICAgICAgICAgICAgIGludFtdLCBzaG9ydFtdLCBieXRlW10sIGNoYXJbXSwgYm9vbGVhbltdLCBsb25nW10sIGZsb2F0W10sIG9yIGRvdWJsZVtdLgorICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdGluZyBwcmludGYnZCBzdHJpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBzcHJpbnRmKE9iamVjdCBzZWxmLCBTdHJpbmcgZm9ybWF0LCBPYmplY3QgYXJnKSB7CisgICAgICAgIGlmIChhcmcgaW5zdGFuY2VvZiBPYmplY3RbXSkgeworICAgICAgICAgICAgcmV0dXJuIHNwcmludGYoc2VsZiwgZm9ybWF0LCAoT2JqZWN0W10pIGFyZyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFyZyBpbnN0YW5jZW9mIExpc3QpIHsKKyAgICAgICAgICAgIHJldHVybiBzcHJpbnRmKHNlbGYsIGZvcm1hdCwgKChMaXN0KSBhcmcpLnRvQXJyYXkoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFhcmcuZ2V0Q2xhc3MoKS5pc0FycmF5KCkpIHsKKyAgICAgICAgICAgIE9iamVjdFtdIG8gPSAoT2JqZWN0W10pIGphdmEubGFuZy5yZWZsZWN0LkFycmF5Lm5ld0luc3RhbmNlKGFyZy5nZXRDbGFzcygpLCAxKTsKKyAgICAgICAgICAgIG9bMF0gPSBhcmc7CisgICAgICAgICAgICByZXR1cm4gc3ByaW50ZihzZWxmLCBmb3JtYXQsIG8pOworICAgICAgICB9CisKKyAgICAgICAgT2JqZWN0W10gYW5zOworICAgICAgICBTdHJpbmcgZWxlbVR5cGUgPSBhcmcuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7CisgICAgICAgIGlmIChlbGVtVHlwZS5lcXVhbHMoIltJIikpIHsKKyAgICAgICAgICAgIGludFtdIGlhID0gKGludFtdKSBhcmc7CisgICAgICAgICAgICBhbnMgPSBuZXcgSW50ZWdlcltpYS5sZW5ndGhdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpYS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGFuc1tpXSA9IG5ldyBJbnRlZ2VyKGlhW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChlbGVtVHlwZS5lcXVhbHMoIltDIikpIHsKKyAgICAgICAgICAgIGNoYXJbXSBpYSA9IChjaGFyW10pIGFyZzsKKyAgICAgICAgICAgIGFucyA9IG5ldyBDaGFyYWN0ZXJbaWEubGVuZ3RoXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaWEubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBhbnNbaV0gPSBuZXcgQ2hhcmFjdGVyKGlhW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChlbGVtVHlwZS5lcXVhbHMoIltaIikpIHsKKyAgICAgICAgICAgIGJvb2xlYW5bXSBpYSA9IChib29sZWFuW10pIGFyZzsKKyAgICAgICAgICAgIGFucyA9IG5ldyBCb29sZWFuW2lhLmxlbmd0aF07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlhLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgYW5zW2ldID0gbmV3IEJvb2xlYW4oaWFbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGVsZW1UeXBlLmVxdWFscygiW0IiKSkgeworICAgICAgICAgICAgYnl0ZVtdIGlhID0gKGJ5dGVbXSkgYXJnOworICAgICAgICAgICAgYW5zID0gbmV3IEJ5dGVbaWEubGVuZ3RoXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaWEubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBhbnNbaV0gPSBuZXcgQnl0ZShpYVtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZWxlbVR5cGUuZXF1YWxzKCJbUyIpKSB7CisgICAgICAgICAgICBzaG9ydFtdIGlhID0gKHNob3J0W10pIGFyZzsKKyAgICAgICAgICAgIGFucyA9IG5ldyBTaG9ydFtpYS5sZW5ndGhdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpYS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGFuc1tpXSA9IG5ldyBTaG9ydChpYVtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZWxlbVR5cGUuZXF1YWxzKCJbRiIpKSB7CisgICAgICAgICAgICBmbG9hdFtdIGlhID0gKGZsb2F0W10pIGFyZzsKKyAgICAgICAgICAgIGFucyA9IG5ldyBGbG9hdFtpYS5sZW5ndGhdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpYS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGFuc1tpXSA9IG5ldyBGbG9hdChpYVtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZWxlbVR5cGUuZXF1YWxzKCJbSiIpKSB7CisgICAgICAgICAgICBsb25nW10gaWEgPSAobG9uZ1tdKSBhcmc7CisgICAgICAgICAgICBhbnMgPSBuZXcgTG9uZ1tpYS5sZW5ndGhdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpYS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGFuc1tpXSA9IG5ldyBMb25nKGlhW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChlbGVtVHlwZS5lcXVhbHMoIltEIikpIHsKKyAgICAgICAgICAgIGRvdWJsZVtdIGlhID0gKGRvdWJsZVtdKSBhcmc7CisgICAgICAgICAgICBhbnMgPSBuZXcgRG91YmxlW2lhLmxlbmd0aF07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlhLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgYW5zW2ldID0gbmV3IERvdWJsZShpYVtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigic3ByaW50ZihTdHJpbmcsIiArIGFyZyArICIpIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNwcmludGYoc2VsZiwgZm9ybWF0LCAoT2JqZWN0W10pIGFucyk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gc2VsZiBhbnkgT2JqZWN0CisgICAgICogQHJldHVybiBhIFN0cmluZyB0aGF0IG1hdGNoZXMgd2hhdCB3b3VsZCBiZSB0eXBlZCBpbnRvIGEgdGVybWluYWwgdG8KKyAgICAgKiAgICAgICAgIGNyZWF0ZSB0aGlzIG9iamVjdC4gZS5nLiBbMSwgJ2hlbGxvJ10uaW5zcGVjdCgpIC0+IFsxLCAiaGVsbG8iXQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGluc3BlY3QoT2JqZWN0IHNlbGYpIHsKKyAgICAgICAgcmV0dXJuIEludm9rZXJIZWxwZXIuaW5zcGVjdChzZWxmKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmludCB0byBhIGNvbnNvbGUgaW4gaW50ZXJhY3RpdmUgZm9ybWF0LgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgYW55IE9iamVjdAorICAgICAqIEBwYXJhbSBvdXQgIHRoZSBQcmludFdyaXRlciB1c2VkIGZvciBwcmludGluZworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludChPYmplY3Qgc2VsZiwgUHJpbnRXcml0ZXIgb3V0KSB7CisgICAgICAgIGlmIChvdXQgPT0gbnVsbCkgeworICAgICAgICAgICAgb3V0ID0gbmV3IFByaW50V3JpdGVyKFN5c3RlbS5vdXQpOworICAgICAgICB9CisgICAgICAgIG91dC5wcmludChJbnZva2VySGVscGVyLnRvU3RyaW5nKHNlbGYpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmludCB0byBhIGNvbnNvbGUgaW4gaW50ZXJhY3RpdmUgZm9ybWF0LgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgYW55IE9iamVjdAorICAgICAqIEBwYXJhbSBvdXQgIHRoZSBQcmludFdyaXRlciB1c2VkIGZvciBwcmludGluZworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludGxuKE9iamVjdCBzZWxmLCBQcmludFdyaXRlciBvdXQpIHsKKyAgICAgICAgaWYgKG91dCA9PSBudWxsKSB7CisgICAgICAgICAgICBvdXQgPSBuZXcgUHJpbnRXcml0ZXIoU3lzdGVtLm91dCk7CisgICAgICAgIH0KKyAgICAgICAgSW52b2tlckhlbHBlci5pbnZva2VNZXRob2Qoc2VsZiwgInByaW50Iiwgb3V0KTsKKyAgICAgICAgb3V0LnByaW50bG4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlIGEgZHluYW1pYyBtZXRob2QgaW52b2NhdGlvbiBtZXRob2Qgd2hpY2ggY2FuIGJlIG92ZXJsb2FkZWQgaW4KKyAgICAgKiBjbGFzc2VzIHRvIGltcGxlbWVudCBkeW5hbWljIHByb3hpZXMgZWFzaWx5LgorICAgICAqCisgICAgICogQHBhcmFtIG9iamVjdCAgICBhbnkgT2JqZWN0CisgICAgICogQHBhcmFtIG1ldGhvZCAgICB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIHRvIGNhbGwKKyAgICAgKiBAcGFyYW0gYXJndW1lbnRzIHRoZSBhcmd1bWVudHMgdG8gdXNlCisgICAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBtZXRob2QgY2FsbAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGludm9rZU1ldGhvZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbWV0aG9kLCBPYmplY3QgYXJndW1lbnRzKSB7CisgICAgICAgIHJldHVybiBJbnZva2VySGVscGVyLmludm9rZU1ldGhvZChvYmplY3QsIG1ldGhvZCwgYXJndW1lbnRzKTsKKyAgICB9CisKKyAgICAvLyBpc0Nhc2UgbWV0aG9kcworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLyoqCisgICAgICogTWV0aG9kIGZvciBvdmVybG9hZGluZyB0aGUgYmVoYXZpb3Igb2YgdGhlICdjYXNlJyBtZXRob2QgaW4gc3dpdGNoIHN0YXRlbWVudHMuCisgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2ltcGx5IGRlbGVnYXRlcyB0byBPYmplY3QjZXF1YWxzLCBidXQgdGhpcworICAgICAqIG1heSBiZSBvdmVycmlkZGVuIGZvciBvdGhlciB0eXBlcy4gIEluIHRoaXMgZXhhbXBsZToKKyAgICAgKiA8cHJlPiBzd2l0Y2goIGEgKSB7CisgICAgICogICBjYXNlIGI6IC8vc29tZSBjb2RlCisgICAgICogfTwvcHJlPgorICAgICAqICJzb21lIGNvZGUiIGlzIGNhbGxlZCB3aGVuIDxjb2RlPmIuaXNDYXNlKCBhICk8L2NvZGU+IHJldHVybnMKKyAgICAgKiA8Y29kZT50cnVlPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjYXNlVmFsdWUgICB0aGUgY2FzZSB2YWx1ZQorICAgICAqIEBwYXJhbSBzd2l0Y2hWYWx1ZSB0aGUgc3dpdGNoIHZhbHVlCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzd2l0Y2hWYWx1ZSBpcyBkZWVtZWQgdG8gYmUgZXF1YWwgdG8gdGhlIGNhc2VWYWx1ZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Nhc2UoT2JqZWN0IGNhc2VWYWx1ZSwgT2JqZWN0IHN3aXRjaFZhbHVlKSB7CisgICAgICAgIHJldHVybiBjYXNlVmFsdWUuZXF1YWxzKHN3aXRjaFZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAnQ2FzZScgaW1wbGVtZW50YXRpb24gZm9yIGEgU3RyaW5nLCB3aGljaCB1c2VzIFN0cmluZyNlcXVhbHMoT2JqZWN0KQorICAgICAqIGluIG9yZGVyIHRvIGFsbG93IFN0cmluZ3MgdG8gYmUgdXNlZCBpbiBzd2l0Y2ggc3RhdGVtZW50cy4KKyAgICAgKiBGb3IgZXhhbXBsZToKKyAgICAgKiA8cHJlPnN3aXRjaCggc3RyICkgeworICAgICAqICAgY2FzZSAnb25lJyA6CisgICAgICogICAvLyBldGMuLi4KKyAgICAgKiB9PC9wcmU+CisgICAgICogTm90ZSB0aGF0IHRoaXMgcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBmb3IgdGhlIGNhc2Ugd2hlcmUgYm90aCB0aGUKKyAgICAgKiAnc3dpdGNoJyBhbmQgJ2Nhc2UnIG9wZXJhbmQgaXMgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2FzZVZhbHVlICAgdGhlIGNhc2UgdmFsdWUKKyAgICAgKiBAcGFyYW0gc3dpdGNoVmFsdWUgdGhlIHN3aXRjaCB2YWx1ZQorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3dpdGNoVmFsdWUncyB0b1N0cmluZygpIGVxdWFscyB0aGUgY2FzZVZhbHVlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ2FzZShTdHJpbmcgY2FzZVZhbHVlLCBPYmplY3Qgc3dpdGNoVmFsdWUpIHsKKyAgICAgICAgaWYgKHN3aXRjaFZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBjYXNlVmFsdWUgPT0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2FzZVZhbHVlLmVxdWFscyhzd2l0Y2hWYWx1ZS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWFsICdDYXNlJyBpbXBsZW1lbnRhdGlvbiBmb3IgQ2xhc3MsIHdoaWNoIGFsbG93cyB0ZXN0aW5nCisgICAgICogZm9yIGEgY2VydGFpbiBjbGFzcyBpbiBhIHN3aXRjaCBzdGF0ZW1lbnQuCisgICAgICogRm9yIGV4YW1wbGU6CisgICAgICogPHByZT5zd2l0Y2goIG9iaiApIHsKKyAgICAgKiAgIGNhc2UgTGlzdCA6CisgICAgICogICAgIC8vIG9iaiBpcyBhIGxpc3QKKyAgICAgKiAgICAgYnJlYWs7CisgICAgICogICBjYXNlIFNldCA6CisgICAgICogICAgIC8vIGV0YworICAgICAqIH08cHJlPgorICAgICAqCisgICAgICogQHBhcmFtIGNhc2VWYWx1ZSAgIHRoZSBjYXNlIHZhbHVlCisgICAgICogQHBhcmFtIHN3aXRjaFZhbHVlIHRoZSBzd2l0Y2ggdmFsdWUKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHN3aXRjaFZhbHVlIGlzIGRlZW1lZCB0byBiZSBhc3NpZ25hYmxlIGZyb20gdGhlIGdpdmVuIGNsYXNzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ2FzZShDbGFzcyBjYXNlVmFsdWUsIE9iamVjdCBzd2l0Y2hWYWx1ZSkgeworICAgICAgICBpZiAoc3dpdGNoVmFsdWUgaW5zdGFuY2VvZiBDbGFzcykgeworICAgICAgICAgICAgQ2xhc3MgdmFsID0gKENsYXNzKSBzd2l0Y2hWYWx1ZTsKKyAgICAgICAgICAgIHJldHVybiBjYXNlVmFsdWUuaXNBc3NpZ25hYmxlRnJvbSh2YWwpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjYXNlVmFsdWUuaXNJbnN0YW5jZShzd2l0Y2hWYWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogJ0Nhc2UnIGltcGxlbWVudGF0aW9uIGZvciBjb2xsZWN0aW9ucyB3aGljaCB0ZXN0cyBpZiB0aGUgJ3N3aXRjaCcKKyAgICAgKiBvcGVyYW5kIGlzIGNvbnRhaW5lZCBpbiBhbnkgb2YgdGhlICdjYXNlJyB2YWx1ZXMuCisgICAgICogRm9yIGV4YW1wbGU6CisgICAgICogPHByZT5zd2l0Y2goIGl0ZW0gKSB7CisgICAgICogICBjYXNlIGZpcnN0TGlzdCA6CisgICAgICogICAgIC8vIGl0ZW0gaXMgY29udGFpbmVkIGluIHRoaXMgbGlzdAorICAgICAqICAgICAvLyBldGMKKyAgICAgKiB9PC9wcmU+CisgICAgICoKKyAgICAgKiBAcGFyYW0gY2FzZVZhbHVlICAgdGhlIGNhc2UgdmFsdWUKKyAgICAgKiBAcGFyYW0gc3dpdGNoVmFsdWUgdGhlIHN3aXRjaCB2YWx1ZQorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY2FzZVZhbHVlIGlzIGRlZW1lZCB0byBjb250YWluIHRoZSBzd2l0Y2hWYWx1ZQorICAgICAqIEBzZWUgamF2YS51dGlsLkNvbGxlY3Rpb24jY29udGFpbnMoT2JqZWN0KQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Nhc2UoQ29sbGVjdGlvbiBjYXNlVmFsdWUsIE9iamVjdCBzd2l0Y2hWYWx1ZSkgeworICAgICAgICByZXR1cm4gY2FzZVZhbHVlLmNvbnRhaW5zKHN3aXRjaFZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAnQ2FzZScgaW1wbGVtZW50YXRpb24gZm9yIHRoZSB7QGxpbmsgUGF0dGVybn0gY2xhc3MsIHdoaWNoIGFsbG93cworICAgICAqIHRlc3RpbmcgYSBTdHJpbmcgYWdhaW5zdCBhIG51bWJlciBvZiByZWd1bGFyIGV4cHJlc3Npb25zLgorICAgICAqIEZvciBleGFtcGxlOgorICAgICAqIDxwcmU+c3dpdGNoKCBzdHIgKSB7CisgICAgICogICBjYXNlIH4vb25lLyA6CisgICAgICogICAgIC8vIHRoZSByZWdleCAnb25lJyBtYXRjaGVzIHRoZSB2YWx1ZSBvZiBzdHIKKyAgICAgKiB9CisgICAgICogPC9wcmU+CisgICAgICogTm90ZSB0aGF0IHRoaXMgcmV0dXJucyB0cnVlIGZvciB0aGUgY2FzZSB3aGVyZSBib3RoIHRoZSBwYXR0ZXJuIGFuZAorICAgICAqIHRoZSAnc3dpdGNoJyB2YWx1ZXMgYXJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGNhc2VWYWx1ZSAgIHRoZSBjYXNlIHZhbHVlCisgICAgICogQHBhcmFtIHN3aXRjaFZhbHVlIHRoZSBzd2l0Y2ggdmFsdWUKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHN3aXRjaFZhbHVlIGlzIGRlZW1lZCB0byBtYXRjaCB0aGUgY2FzZVZhbHVlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ2FzZShQYXR0ZXJuIGNhc2VWYWx1ZSwgT2JqZWN0IHN3aXRjaFZhbHVlKSB7CisgICAgICAgIGlmIChzd2l0Y2hWYWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gY2FzZVZhbHVlID09IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgTWF0Y2hlciBtYXRjaGVyID0gY2FzZVZhbHVlLm1hdGNoZXIoc3dpdGNoVmFsdWUudG9TdHJpbmcoKSk7CisgICAgICAgIGlmIChtYXRjaGVyLm1hdGNoZXMoKSkgeworICAgICAgICAgICAgUmVnZXhTdXBwb3J0LnNldExhc3RNYXRjaGVyKG1hdGNoZXIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWFsICdjYXNlJyBpbXBsZW1lbnRhdGlvbiBmb3IgYWxsIG51bWJlcnMsIHdoaWNoIGRlbGVnYXRlcyB0byB0aGUKKyAgICAgKiA8Y29kZT5jb21wYXJlVG8oKTwvY29kZT4gbWV0aG9kIGZvciBjb21wYXJpbmcgbnVtYmVycyBvZiBkaWZmZXJlbnQKKyAgICAgKiB0eXBlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjYXNlVmFsdWUgICB0aGUgY2FzZSB2YWx1ZQorICAgICAqIEBwYXJhbSBzd2l0Y2hWYWx1ZSB0aGUgc3dpdGNoIHZhbHVlCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBudW1iZXJzIGFyZSBkZWVtZWQgZXF1YWwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDYXNlKE51bWJlciBjYXNlVmFsdWUsIE51bWJlciBzd2l0Y2hWYWx1ZSkgeworICAgICAgICByZXR1cm4gTnVtYmVyTWF0aC5jb21wYXJlVG8oY2FzZVZhbHVlLCBzd2l0Y2hWYWx1ZSkgPT0gMDsKKyAgICB9CisKKyAgICAvLyBDb2xsZWN0aW9uIGJhc2VkIG1ldGhvZHMKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKgorICAgICAqIE1vZGlmaWVzIHRoaXMgY29sbGVjdGlvbiB0byByZW1vdmUgYWxsIGR1cGxpY2F0ZWQgaXRlbXMsIHVzaW5nIHRoZQorICAgICAqIGRlZmF1bHQgY29tcGFyYXRvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmIGEgY29sbGVjdGlvbgorICAgICAqIEByZXR1cm4gdGhpcyBjb2xsZWN0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uIHVuaXF1ZShDb2xsZWN0aW9uIHNlbGYpIHsKKyAgICAgICAgaWYgKHNlbGYgaW5zdGFuY2VvZiBTZXQpCisgICAgICAgICAgICByZXR1cm4gc2VsZjsKKyAgICAgICAgTGlzdCBhbnN3ZXIgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIE51bWJlckF3YXJlQ29tcGFyYXRvciBudW1iZXJBd2FyZUNvbXBhcmF0b3IgPSBuZXcgTnVtYmVyQXdhcmVDb21wYXJhdG9yKCk7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBzZWxmLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIE9iamVjdCBvID0gaXQubmV4dCgpOworICAgICAgICAgICAgYm9vbGVhbiBkdXBsaWNhdGVkID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0MiA9IGFuc3dlci5pdGVyYXRvcigpOyBpdDIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIE9iamVjdCBvMiA9IGl0Mi5uZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKG51bWJlckF3YXJlQ29tcGFyYXRvci5jb21wYXJlKG8sIG8yKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGR1cGxpY2F0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWR1cGxpY2F0ZWQpCisgICAgICAgICAgICAgICAgYW5zd2VyLmFkZChvKTsKKyAgICAgICAgfQorICAgICAgICBzZWxmLmNsZWFyKCk7CisgICAgICAgIHNlbGYuYWRkQWxsKGFuc3dlcik7CisgICAgICAgIHJldHVybiBzZWxmOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgY29udmVuaWVuY2UgbWV0aG9kIGZvciBtYWtpbmcgYSBjb2xsZWN0aW9uIHVuaXF1ZSB1c2luZyBhIGNsb3N1cmUKKyAgICAgKiBhcyBhIGNvbXBhcmF0b3IuICBJZiB0aGUgY2xvc3VyZSB0YWtlcyBhIHNpbmdsZSBwYXJhbWV0ZXIsIHRoZQorICAgICAqIGFyZ3VtZW50IHBhc3NlZCB3aWxsIGJlIGVhY2ggZWxlbWVudCwgYW5kIHRoZSBjbG9zdXJlCisgICAgICogc2hvdWxkIHJldHVybiBhIHZhbHVlIHVzZWQgZm9yIGNvbXBhcmlzb24gKGVpdGhlciB1c2luZworICAgICAqIHtAbGluayBDb21wYXJhYmxlI2NvbXBhcmVUbyhPYmplY3QpfSBvciBPYmplY3QjZXF1YWxzKCkgKS4gIElmIHRoZQorICAgICAqIGNsb3N1cmUgdGFrZXMgdHdvIHBhcmFtZXRlcnMsIHR3byBpdGVtcyBmcm9tIHRoZSBjb2xsZWN0aW9uCisgICAgICogd2lsbCBiZSBwYXNzZWQgYXMgYXJndW1lbnRzLCBhbmQgdGhlIGNsb3N1cmUgc2hvdWxkIHJldHVybiBhbgorICAgICAqIGludCB2YWx1ZSAod2l0aCAwIGluZGljYXRpbmcgdGhlIGl0ZW1zIGFyZSBub3QgdW5pcXVlKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmICAgIGEgQ29sbGVjdGlvbgorICAgICAqIEBwYXJhbSBjbG9zdXJlIGEgQ2xvc3VyZSB1c2VkIGFzIGEgY29tcGFyYXRvcgorICAgICAqIEByZXR1cm4gc2VsZiAgIHdpdGhvdXQgYW55IGR1cGxpY2F0ZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb24gdW5pcXVlKENvbGxlY3Rpb24gc2VsZiwgQ2xvc3VyZSBjbG9zdXJlKSB7CisgICAgICAgIGlmIChzZWxmIGluc3RhbmNlb2YgU2V0KQorICAgICAgICAgICAgcmV0dXJuIHNlbGY7CisgICAgICAgIC8vIHVzZSBhIGNvbXBhcmF0b3Igb2Ygb25lIGl0ZW0gb3IgdHdvCisgICAgICAgIGludCBwYXJhbXMgPSBjbG9zdXJlLmdldE1heGltdW1OdW1iZXJPZlBhcmFtZXRlcnMoKTsKKyAgICAgICAgaWYgKHBhcmFtcyA9PSAxKSB7CisgICAgICAgICAgICB1bmlxdWUoc2VsZiwgbmV3IE9yZGVyQnkoY2xvc3VyZSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdW5pcXVlKHNlbGYsIG5ldyBDbG9zdXJlQ29tcGFyYXRvcihjbG9zdXJlKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNlbGY7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFsbCBkdXBsaWNhdGVzIGZyb20gYSBnaXZlbiBDb2xsZWN0aW9uLgorICAgICAqIFdvcmtzIG9uIHRoZSByZWNlaXZlciBvYmplY3QgYW5kIHJldHVybnMgaXQuCisgICAgICogVGhlIG9yZGVyIG9mIG1lbWJlcnMgaW4gdGhlIENvbGxlY3Rpb24gYXJlIGNvbXBhcmVkIGJ5IHRoZSBnaXZlbiBDb21wYXJhdG9yLgorICAgICAqIEZvciBlYWNoIGR1cGxpY2F0ZSwgdGhlIGZpcnN0IG1lbWJlciB3aGljaCBpcyByZXR1cm5lZAorICAgICAqIGJ5IHRoZSBnaXZlbiBDb2xsZWN0aW9uJ3MgaXRlcmF0b3IgaXMgcmV0YWluZWQsIGJ1dCBhbGwgb3RoZXIgb25lcyBhcmUgcmVtb3ZlZC4KKyAgICAgKiBUaGUgZ2l2ZW4gQ29sbGVjdGlvbidzIG9yaWdpbmFsIG9yZGVyIGlzIHByZXNlcnZlZC4KKyAgICAgKiA8cC8+CisgICAgICogPGNvZGU+PHByZT4KKyAgICAgKiAgICAgY2xhc3MgUGVyc29uIHsKKyAgICAgKiAgICAgICAgIGRlZiBmbmFtZSwgbG5hbWUKKyAgICAgKiAgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICogICAgICAgICAgICAgcmV0dXJuIGZuYW1lICsgIiAiICsgbG5hbWUKKyAgICAgKiAgICAgICAgIH0KKyAgICAgKiAgICAgfQorICAgICAqIDxwLz4KKyAgICAgKiAgICAgY2xhc3MgUGVyc29uQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IgeworICAgICAqICAgICAgICAgcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7CisgICAgICogICAgICAgICAgICAgUGVyc29uIHAxID0gKFBlcnNvbikgbzEKKyAgICAgKiAgICAgICAgICAgICBQZXJzb24gcDIgPSAoUGVyc29uKSBvMgorICAgICAqICAgICAgICAgICAgIGlmIChwMS5sbmFtZSAhPSBwMi5sbmFtZSkKKyAgICAgKiAgICAgICAgICAgICAgICAgcmV0dXJuIHAxLmxuYW1lLmNvbXBhcmVUbyhwMi5sbmFtZSkKKyAgICAgKiAgICAgICAgICAgICBlbHNlCisgICAgICogICAgICAgICAgICAgICAgIHJldHVybiBwMS5mbmFtZS5jb21wYXJlVG8ocDIuZm5hbWUpCisgICAgICogICAgICAgICB9CisgICAgICogPHAvPgorICAgICAqICAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgKiAgICAgICAgICAgICByZXR1cm4gdGhpcy5lcXVhbHMob2JqKQorICAgICAqICAgICAgICAgfQorICAgICAqICAgICB9CisgICAgICogPHAvPgorICAgICAqICAgICBQZXJzb24gYSA9IG5ldyBQZXJzb24oZm5hbWU6IkpvaG4iLCBsbmFtZToiVGF5bG9yIikKKyAgICAgKiAgICAgUGVyc29uIGIgPSBuZXcgUGVyc29uKGZuYW1lOiJDbGFyayIsIGxuYW1lOiJUYXlsb3IiKQorICAgICAqICAgICBQZXJzb24gYyA9IG5ldyBQZXJzb24oZm5hbWU6IlRvbSIsIGxuYW1lOiJDcnV6IikKKyAgICAgKiAgICAgUGVyc29uIGQgPSBuZXcgUGVyc29uKGZuYW1lOiJDbGFyayIsIGxuYW1lOiJUYXlsb3IiKQorICAgICAqIDxwLz4KKyAgICAgKiAgICAgZGVmIGxpc3QgPSBbYSwgYiwgYywgZF0KKyAgICAgKiAgICAgTGlzdCBsaXN0MiA9IGxpc3QudW5pcXVlKG5ldyBQZXJzb25Db21wYXJhdG9yKCkpCisgICAgICogICAgIGFzc2VydCggbGlzdDIgPT0gbGlzdCAmJiBsaXN0ID09IFthLCBiLCBjXSApCisgICAgICogPHAvPgorICAgICAqIDwvcHJlPjwvY29kZT4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmICAgICAgIGEgQ29sbGVjdGlvbgorICAgICAqIEBwYXJhbSBjb21wYXJhdG9yIGEgQ29tcGFyYXRvci4KKyAgICAgKiBAcmV0dXJuIHNlbGYgICAgICAgd2l0aG91dCBkdXBsaWNhdGVzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uIHVuaXF1ZShDb2xsZWN0aW9uIHNlbGYsIENvbXBhcmF0b3IgY29tcGFyYXRvcikgeworICAgICAgICBpZiAoc2VsZiBpbnN0YW5jZW9mIFNldCkKKyAgICAgICAgICAgIHJldHVybiBzZWxmOworICAgICAgICBMaXN0IGFuc3dlciA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IHNlbGYuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgT2JqZWN0IG8gPSBpdC5uZXh0KCk7CisgICAgICAgICAgICBib29sZWFuIGR1cGxpY2F0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQyID0gYW5zd2VyLml0ZXJhdG9yKCk7IGl0Mi5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgT2JqZWN0IG8yID0gaXQyLm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoY29tcGFyYXRvci5jb21wYXJlKG8sIG8yKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGR1cGxpY2F0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWR1cGxpY2F0ZWQpCisgICAgICAgICAgICAgICAgYW5zd2VyLmFkZChvKTsKKyAgICAgICAgfQorICAgICAgICBzZWxmLmNsZWFyKCk7CisgICAgICAgIHNlbGYuYWRkQWxsKGFuc3dlcik7CisgICAgICAgIHJldHVybiBzZWxmOworICAgIH0KKworICAgIC8qKgorICAgICAqIEl0ZXJhdGVzIHRocm91Z2ggYW4gYWdncmVnYXRlIHR5cGUgb3IgZGF0YSBzdHJ1Y3R1cmUsCisgICAgICogcGFzc2luZyBlYWNoIGl0ZW0gdG8gdGhlIGdpdmVuIGNsb3N1cmUuICBDdXN0b20gdHlwZXMgbWF5IHV0aWxpemUgdGhpcworICAgICAqIG1ldGhvZCBieSBzaW1wbHkgcHJvdmlkaW5nIGFuICJpdGVyYXRvcigpIiBtZXRob2QuICBUaGUgaXRlbXMgcmV0dXJuZWQKKyAgICAgKiBmcm9tIHRoZSByZXN1bHRpbmcgaXRlcmF0b3Igd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGNsb3N1cmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgICB0aGUgb2JqZWN0IG92ZXIgd2hpY2ggd2UgaXRlcmF0ZQorICAgICAqIEBwYXJhbSBjbG9zdXJlIHRoZSBjbG9zdXJlIGFwcGxpZWQgb24gZWFjaCBlbGVtZW50IGZvdW5kCisgICAgICogQHJldHVybiB0aGUgc2VsZiBPYmplY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBlYWNoKE9iamVjdCBzZWxmLCBDbG9zdXJlIGNsb3N1cmUpIHsKKyAgICAgICAgZWFjaChJbnZva2VySGVscGVyLmFzSXRlcmF0b3Ioc2VsZiksIGNsb3N1cmUpOworICAgICAgICByZXR1cm4gc2VsZjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJdGVyYXRlcyB0aHJvdWdoIGFuIGFnZ3JlZ2F0ZSB0eXBlIG9yIGRhdGEgc3RydWN0dXJlLAorICAgICAqIHBhc3NpbmcgZWFjaCBpdGVtIGFuZCB0aGUgaXRlbSdzIGluZGV4IChhIGNvdW50ZXIgc3RhcnRpbmcgYXQKKyAgICAgKiB6ZXJvKSB0byB0aGUgZ2l2ZW4gY2xvc3VyZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmICAgIGFuIE9iamVjdAorICAgICAqIEBwYXJhbSBjbG9zdXJlIGEgQ2xvc3VyZSB0byBvcGVyYXRlIG9uIGVhY2ggaXRlbQorICAgICAqIEByZXR1cm4gdGhlIHNlbGYgT2JqZWN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZWFjaFdpdGhJbmRleChPYmplY3Qgc2VsZiwgQ2xvc3VyZSBjbG9zdXJlKSB7CisgICAgICAgIGludCBjb3VudGVyID0gMDsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gSW52b2tlckhlbHBlci5hc0l0ZXJhdG9yKHNlbGYpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIGNsb3N1cmUuY2FsbChuZXcgT2JqZWN0W117aXRlci5uZXh0KCksIG5ldyBJbnRlZ2VyKGNvdW50ZXIrKyl9KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2VsZjsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBJdGVyYXRvciBlYWNoKEl0ZXJhdG9yIGl0ZXIsIENsb3N1cmUgY2xvc3VyZSkgeworICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIGNsb3N1cmUuY2FsbChpdGVyLm5leHQoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGl0ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWxsb3dzIGEgTWFwIHRvIGJlIGl0ZXJhdGVkIHRocm91Z2ggdXNpbmcgYSBjbG9zdXJlLiBJZiB0aGUKKyAgICAgKiBjbG9zdXJlIHRha2VzIG9uZSBwYXJhbWV0ZXIgdGhlbiBpdCB3aWxsIGJlIHBhc3NlZCB0aGUgTWFwLkVudHJ5CisgICAgICogb3RoZXJ3aXNlIGlmIHRoZSBjbG9zdXJlIHRha2VzIHR3byBwYXJhbWV0ZXJzIHRoZW4gaXQgd2lsbCBiZQorICAgICAqIHBhc3NlZCB0aGUga2V5IGFuZCB0aGUgdmFsdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgICB0aGUgbWFwIG92ZXIgd2hpY2ggd2UgaXRlcmF0ZQorICAgICAqIEBwYXJhbSBjbG9zdXJlIHRoZSBjbG9zdXJlIGFwcGxpZWQgb24gZWFjaCBlbnRyeSBvZiB0aGUgbWFwCisgICAgICogQHJldHVybiByZXR1cm5zIHRoZSBzZWxmIHBhcmFtZXRlcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTWFwIGVhY2goTWFwIHNlbGYsIENsb3N1cmUgY2xvc3VyZSkgeworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxmLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIGNhbGxDbG9zdXJlRm9yTWFwRW50cnkoY2xvc3VyZSwgZW50cnkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzZWxmOworICAgIH0KKworICAgIC8qKgorICAgICAqIEl0ZXJhdGUgb3ZlciBlYWNoIGVsZW1lbnQgb2YgdGhlIGxpc3QgaW4gdGhlIHJldmVyc2Ugb3JkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgICBhIExpc3QKKyAgICAgKiBAcGFyYW0gY2xvc3VyZSBhIGNsb3N1cmUgdG8gd2hpY2ggZWFjaCBpdGVtIGlzIHBhc3NlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBvcmlnaW5hbCBsaXN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMaXN0IHJldmVyc2VFYWNoKExpc3Qgc2VsZiwgQ2xvc3VyZSBjbG9zdXJlKSB7CisgICAgICAgIGVhY2gocmV2ZXJzZShzZWxmKS5pdGVyYXRvcigpLCBjbG9zdXJlKTsKKyAgICAgICAgcmV0dXJuIHNlbGY7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGdpdmVuIHByZWRpY2F0ZSBjbG9zdXJlIGlzIHZhbGlkIChpLmUuIHJldHVybnMKKyAgICAgKiA8Y29kZT50cnVlPC9jb2RlPikgZm9yIGFsbCBpdGVtcyBpbiB0aGlzIGRhdGEgc3RydWN0dXJlLgorICAgICAqIEEgc2ltcGxlIGV4YW1wbGUgZm9yIGEgbGlzdDoKKyAgICAgKiA8cHJlPmRlZiBsaXN0ID0gWzMsNCw1XQorICAgICAqIGRlZiBncmVhdGVyVGhhblR3byA9IGxpc3QuZXZlcnkgeyBpdCA+IDIgfQorICAgICAqIDwvcHJlPgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgICAgdGhlIG9iamVjdCBvdmVyIHdoaWNoIHdlIGl0ZXJhdGUKKyAgICAgKiBAcGFyYW0gY2xvc3VyZSB0aGUgY2xvc3VyZSBwcmVkaWNhdGUgdXNlZCBmb3IgbWF0Y2hpbmcKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgZXZlcnkgaXRlcmF0aW9uIG9mIHRoZSBvYmplY3QgbWF0Y2hlcyB0aGUgY2xvc3VyZSBwcmVkaWNhdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXZlcnkoT2JqZWN0IHNlbGYsIENsb3N1cmUgY2xvc3VyZSkgeworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBJbnZva2VySGVscGVyLmFzSXRlcmF0b3Ioc2VsZik7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgaWYgKCFEZWZhdWx0VHlwZVRyYW5zZm9ybWF0aW9uLmNhc3RUb0Jvb2xlYW4oY2xvc3VyZS5jYWxsKGl0ZXIubmV4dCgpKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogSXRlcmF0ZXMgb3ZlciB0aGUgZW50cmllcyBvZiBhIG1hcCwgYW5kIGNoZWNrcyB3aGV0aGVyIGEgcHJlZGljYXRlIGlzCisgICAgICogdmFsaWQgZm9yIGFsbCBlbnRyaWVzLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgICAgdGhlIG1hcCBvdmVyIHdoaWNoIHdlIGl0ZXJhdGUKKyAgICAgKiBAcGFyYW0gY2xvc3VyZSB0aGUgY2xvc3VyZSBwcmVkaWNhdGUgdXNlZCBmb3IgbWF0Y2hpbmcKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgZXZlcnkgZW50cnkgb2YgdGhlIG1hcCBtYXRjaGVzIHRoZSBjbG9zdXJlIHByZWRpY2F0ZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBldmVyeShNYXAgc2VsZiwgQ2xvc3VyZSBjbG9zdXJlKSB7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGYuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgaWYgKCFEZWZhdWx0VHlwZVRyYW5zZm9ybWF0aW9uLmNhc3RUb0Jvb2xlYW4oY2FsbENsb3N1cmVGb3JNYXBFbnRyeShjbG9zdXJlLCBlbnRyeSkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEl0ZXJhdGVzIG92ZXIgZXZlcnkgZWxlbWVudCBvZiBhIGNvbGxlY3Rpb24sIGFuZCBjaGVja3Mgd2hldGhlciBhbGwKKyAgICAgKiBlbGVtZW50cyBhcmUgPGNvZGU+dHJ1ZTwvY29kZT4gYWNjb3JkaW5nIHRvIHRoZSBHcm9vdnkgVHJ1dGguCisgICAgICogRXF1aXZhbGVudCB0byA8Y29kZT5zZWxmLmV2ZXJ5KHtlbGVtZW50IC0+IGVsZW1lbnR9KTwvY29kZT4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmIHRoZSBvYmplY3Qgb3ZlciB3aGljaCB3ZSBpdGVyYXRlCisgICAgICogQHJldHVybiB0cnVlIGlmIGV2ZXJ5IGl0ZW0gaW4gdGhlIGNvbGxlY3Rpb24gbWF0Y2hlcyB0aGUgY2xvc3VyZQorICAgICAqICAgICAgICAgcHJlZGljYXRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGV2ZXJ5KE9iamVjdCBzZWxmKSB7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IEludm9rZXJIZWxwZXIuYXNJdGVyYXRvcihzZWxmKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBpZiAoIURlZmF1bHRUeXBlVHJhbnNmb3JtYXRpb24uY2FzdFRvQm9vbGVhbihpdGVyLm5leHQoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogSXRlcmF0ZXMgb3ZlciB0aGUgY29udGVudHMgb2YgYW4gb2JqZWN0IG9yIGNvbGxlY3Rpb24sIGFuZCBjaGVja3Mgd2hldGhlciBhCisgICAgICogcHJlZGljYXRlIGlzIHZhbGlkIGZvciBhdCBsZWFzdCBvbmUgZWxlbWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmICAgIHRoZSBvYmplY3Qgb3ZlciB3aGljaCB3ZSBpdGVyYXRlCisgICAgICogQHBhcmFtIGNsb3N1cmUgdGhlIGNsb3N1cmUgcHJlZGljYXRlIHVzZWQgZm9yIG1hdGNoaW5nCisgICAgICogQHJldHVybiB0cnVlICAgaWYgYW55IGl0ZXJhdGlvbiBmb3IgdGhlIG9iamVjdCBtYXRjaGVzIHRoZSBjbG9zdXJlIHByZWRpY2F0ZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhbnkoT2JqZWN0IHNlbGYsIENsb3N1cmUgY2xvc3VyZSkgeworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBJbnZva2VySGVscGVyLmFzSXRlcmF0b3Ioc2VsZik7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgaWYgKERlZmF1bHRUeXBlVHJhbnNmb3JtYXRpb24uY2FzdFRvQm9vbGVhbihjbG9zdXJlLmNhbGwoaXRlci5uZXh0KCkpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJdGVyYXRlcyBvdmVyIHRoZSBlbnRyaWVzIG9mIGEgbWFwLCBhbmQgY2hlY2tzIHdoZXRoZXIgYSBwcmVkaWNhdGUgaXMKKyAgICAgKiB2YWxpZCBmb3IgYXQgbGVhc3Qgb25lIGVudHJ5CisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgICB0aGUgbWFwIG92ZXIgd2hpY2ggd2UgaXRlcmF0ZQorICAgICAqIEBwYXJhbSBjbG9zdXJlIHRoZSBjbG9zdXJlIHByZWRpY2F0ZSB1c2VkIGZvciBtYXRjaGluZworICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbnkgZW50cnkgaW4gdGhlIG1hcCBtYXRjaGVzIHRoZSBjbG9zdXJlIHByZWRpY2F0ZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhbnkoTWFwIHNlbGYsIENsb3N1cmUgY2xvc3VyZSkgeworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxmLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChEZWZhdWx0VHlwZVRyYW5zZm9ybWF0aW9uLmNhc3RUb0Jvb2xlYW4oY2FsbENsb3N1cmVGb3JNYXBFbnRyeShjbG9zdXJlLCBlbnRyeSkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEl0ZXJhdGVzIG92ZXIgdGhlIGVsZW1lbnRzIG9mIGEgY29sbGVjdGlvbiwgYW5kIGNoZWNrcyB3aGV0aGVyIGF0IGxlYXN0CisgICAgICogb25lIGVsZW1lbnQgaXMgdHJ1ZSBhY2NvcmRpbmcgdG8gdGhlIEdyb292eSBUcnV0aC4KKyAgICAgKiBFcXVpdmFsZW50IHRvIHNlbGYuYW55KHtlbGVtZW50IC0+IGVsZW1lbnR9KQorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgdGhlIG9iamVjdCBvdmVyIHdoaWNoIHdlIGl0ZXJhdGUKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgYW55IGl0ZW0gaW4gdGhlIGNvbGxlY3Rpb24gbWF0Y2hlcyB0aGUgY2xvc3VyZSBwcmVkaWNhdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gYW55KE9iamVjdCBzZWxmKSB7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IEludm9rZXJIZWxwZXIuYXNJdGVyYXRvcihzZWxmKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBpZiAoRGVmYXVsdFR5cGVUcmFuc2Zvcm1hdGlvbi5jYXN0VG9Cb29sZWFuKGl0ZXIubmV4dCgpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJdGVyYXRlcyBvdmVyIGV2ZXJ5IGVsZW1lbnQgb2YgdGhlIGNvbGxlY3Rpb24gYW5kIHJldHVybnMgZWFjaCBpdGVtIHRoYXQgbWF0Y2hlcworICAgICAqIHRoZSBnaXZlbiBmaWx0ZXIgLSBjYWxsaW5nIHRoZSA8Y29kZT57QGxpbmsgI2lzQ2FzZShPYmplY3QsT2JqZWN0KX08L2NvZGU+CisgICAgICogbWV0aG9kIHVzZWQgYnkgc3dpdGNoIHN0YXRlbWVudHMuICBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB3aXRoIGRpZmZlcmVudAorICAgICAqIGtpbmRzIG9mIGZpbHRlcnMgbGlrZSByZWd1bGFyIGV4cHJlc3Npb25zLCBjbGFzc2VzLCByYW5nZXMgZXRjLgorICAgICAqIEV4YW1wbGU6CisgICAgICogPHByZT5kZWYgbGlzdCA9IFsnYScsICdiJywgJ2FhJywgJ2JjJyBdCisgICAgICogZGVmIGZpbHRlcmVkID0gbGlzdC5ncmVwKCB+L2ErLyApIC8vY29udGFpbnMgJ2EnIGFuZCAnYWEnCisgICAgICogPC9wcmU+CisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgIHRoZSBvYmplY3Qgb3ZlciB3aGljaCB3ZSBpdGVyYXRlCisgICAgICogQHBhcmFtIGZpbHRlciB0aGUgZmlsdGVyIHRvIHBlcmZvcm0gb24gdGhlIGNvbGxlY3Rpb24gKHVzaW5nIHRoZSBpc0Nhc2Uob2JqZWN0KSBtZXRob2QpCisgICAgICogQHJldHVybiBhIGxpc3Qgb2Ygb2JqZWN0cyB3aGljaCBtYXRjaCB0aGUgZmlsdGVyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMaXN0IGdyZXAoT2JqZWN0IHNlbGYsIE9iamVjdCBmaWx0ZXIpIHsKKyAgICAgICAgTGlzdCBhbnN3ZXIgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIE1ldGFDbGFzcyBtZXRhQ2xhc3MgPSBJbnZva2VySGVscGVyLmdldE1ldGFDbGFzcyhmaWx0ZXIpOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBJbnZva2VySGVscGVyLmFzSXRlcmF0b3Ioc2VsZik7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IGl0ZXIubmV4dCgpOworICAgICAgICAgICAgaWYgKERlZmF1bHRUeXBlVHJhbnNmb3JtYXRpb24uY2FzdFRvQm9vbGVhbihtZXRhQ2xhc3MuaW52b2tlTWV0aG9kKGZpbHRlciwgImlzQ2FzZSIsIG9iamVjdCkpKSB7CisgICAgICAgICAgICAgICAgYW5zd2VyLmFkZChvYmplY3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBhbnN3ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ291bnRzIHRoZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2YgdGhlIGdpdmVuIHZhbHVlIGluc2lkZSB0aGlzIGNvbGxlY3Rpb24uCisgICAgICogQ29tcGFyaXNvbiBpcyBkb25lIHVzaW5nIEdyb292eSdzID09IG9wZXJhdG9yICh1c2luZworICAgICAqIDxjb2RlPmNvbXBhcmVUbyh2YWx1ZSkgPT0gMDwvY29kZT4gb3IgPGNvZGU+ZXF1YWxzKHZhbHVlKTwvY29kZT4gKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmICB0aGUgY29sbGVjdGlvbiB3aXRoaW4gd2hpY2ggd2UgY291bnQgdGhlIG51bWJlciBvZiBvY2N1cnJlbmNlcworICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgYmVpbmcgc2VhcmNoZWQgZm9yCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIG9jY3VycmVuY2VzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgY291bnQoQ29sbGVjdGlvbiBzZWxmLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgaW50IGFuc3dlciA9IDA7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGYuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBpZiAoRGVmYXVsdFR5cGVUcmFuc2Zvcm1hdGlvbi5jb21wYXJlRXF1YWwoaXRlci5uZXh0KCksIHZhbHVlKSkgeworICAgICAgICAgICAgICAgICsrYW5zd2VyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBhbnN3ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydCBhIGNvbGxlY3Rpb24gdG8gYSBMaXN0LgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgYSBjb2xsZWN0aW9uCisgICAgICogQHJldHVybiBhIExpc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3QgdG9MaXN0KENvbGxlY3Rpb24gc2VsZikgeworICAgICAgICBMaXN0IGFuc3dlciA9IG5ldyBBcnJheUxpc3Qoc2VsZi5zaXplKCkpOworICAgICAgICBhbnN3ZXIuYWRkQWxsKHNlbGYpOworICAgICAgICByZXR1cm4gYW5zd2VyOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnQgYW4gaXRlcmF0b3IgdG8gYSBMaXN0LgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgYW4gaXRlcmF0b3IKKyAgICAgKiBAcmV0dXJuIGEgTGlzdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlzdCB0b0xpc3QoSXRlcmF0b3Igc2VsZikgeworICAgICAgICBMaXN0IGFuc3dlciA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgd2hpbGUgKHNlbGYuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBhbnN3ZXIuYWRkKHNlbGYubmV4dCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYW5zd2VyOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnQgYW4gZW51bWVyYXRpb24gdG8gYSBMaXN0LgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgYW4gZW51bWVyYXRpb24KKyAgICAgKiBAcmV0dXJuIGEgTGlzdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlzdCB0b0xpc3QoRW51bWVyYXRpb24gc2VsZikgeworICAgICAgICBMaXN0IGFuc3dlciA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgd2hpbGUgKHNlbGYuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIGFuc3dlci5hZGQoc2VsZi5uZXh0RWxlbWVudCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYW5zd2VyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEl0ZXJhdGVzIHRocm91Z2ggdGhpcyBvYmplY3QgdHJhbnNmb3JtaW5nIGVhY2ggaXRlbSBpbnRvIGEgbmV3IHZhbHVlIHVzaW5nIHRoZSBjbG9zdXJlCisgICAgICogYXMgYSB0cmFuc2Zvcm1lciwgcmV0dXJuaW5nIGEgbGlzdCBvZiB0cmFuc2Zvcm1lZCB2YWx1ZXMuCisgICAgICogRXhhbXBsZToKKyAgICAgKiA8cHJlPmRlZiBsaXN0ID0gWzEsICdhJywgMS4yMywgdHJ1ZSBdCisgICAgICogZGVmIHR5cGVzID0gbGlzdC5jb2xsZWN0IHsgaXQuY2xhc3MgfQorICAgICAqIDwvcHJlPgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgICAgdGhlIHZhbHVlcyBvZiB0aGUgb2JqZWN0IHRvIG1hcAorICAgICAqIEBwYXJhbSBjbG9zdXJlIHRoZSBjbG9zdXJlIHVzZWQgdG8gdHJhbnNmb3JtIGVhY2ggZWxlbWVudCBvZiB0aGUgY29sbGVjdGlvbgorICAgICAqIEByZXR1cm4gYSBMaXN0IG9mIHRoZSBtYXBwZWQgdmFsdWVzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMaXN0IGNvbGxlY3QoT2JqZWN0IHNlbGYsIENsb3N1cmUgY2xvc3VyZSkgeworICAgICAgICByZXR1cm4gKExpc3QpIGNvbGxlY3Qoc2VsZiwgbmV3IEFycmF5TGlzdCgpLCBjbG9zdXJlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJdGVyYXRlcyB0aHJvdWdoIHRoaXMgb2JqZWN0IHRyYW5zZm9ybWluZyBlYWNoIG9iamVjdCBpbnRvIGEgbmV3IHZhbHVlIHVzaW5nIHRoZSBjbG9zdXJlCisgICAgICogYXMgYSB0cmFuc2Zvcm1lciBhbmQgYWRkaW5nIGl0IHRvIHRoZSBjb2xsZWN0aW9uLCByZXR1cm5pbmcgdGhlIHJlc3VsdGluZyBjb2xsZWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgICAgICAgdGhlIHZhbHVlcyBvZiB0aGUgb2JqZWN0IHRvIG1hcAorICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uIHRoZSBDb2xsZWN0aW9uIHRvIHdoaWNoIHRoZSB0cmFuc2Zvcm1lZCB2YWx1ZXMgYXJlIGFkZGVkCisgICAgICogQHBhcmFtIGNsb3N1cmUgICAgdGhlIGNsb3N1cmUgdXNlZCB0byBtYXAgZWFjaCBlbGVtZW50IG9mIHRoZSBjb2xsZWN0aW9uCisgICAgICogQHJldHVybiB0aGUgZ2l2ZW4gY29sbGVjdGlvbiBhZnRlciB0aGUgaXRlbXMgYXJlIGFkZGVkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uIGNvbGxlY3QoT2JqZWN0IHNlbGYsIENvbGxlY3Rpb24gY29sbGVjdGlvbiwgQ2xvc3VyZSBjbG9zdXJlKSB7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IEludm9rZXJIZWxwZXIuYXNJdGVyYXRvcihzZWxmKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBjb2xsZWN0aW9uLmFkZChjbG9zdXJlLmNhbGwoaXRlci5uZXh0KCkpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29sbGVjdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJdGVyYXRlcyB0aHJvdWdoIHRoaXMgY29sbGVjdGlvbiB0cmFuc2Zvcm1pbmcgZWFjaCBlbnRyeSBpbnRvIGEgbmV3IHZhbHVlIHVzaW5nIHRoZSBjbG9zdXJlCisgICAgICogYXMgYSB0cmFuc2Zvcm1lciwgcmV0dXJuaW5nIGEgbGlzdCBvZiB0cmFuc2Zvcm1lZCB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgICBhIGNvbGxlY3Rpb24KKyAgICAgKiBAcGFyYW0gY2xvc3VyZSB0aGUgY2xvc3VyZSB1c2VkIGZvciBtYXBwaW5nCisgICAgICogQHJldHVybiBhIExpc3Qgb2YgdGhlIG1hcHBlZCB2YWx1ZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3QgY29sbGVjdChDb2xsZWN0aW9uIHNlbGYsIENsb3N1cmUgY2xvc3VyZSkgeworICAgICAgICByZXR1cm4gKExpc3QpIGNvbGxlY3Qoc2VsZiwgbmV3IEFycmF5TGlzdChzZWxmLnNpemUoKSksIGNsb3N1cmUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEl0ZXJhdGVzIHRocm91Z2ggdGhpcyBjb2xsZWN0aW9uIHRyYW5zZm9ybWluZyBlYWNoIGVudHJ5IGludG8gYSBuZXcgdmFsdWUgdXNpbmcgdGhlIGNsb3N1cmUKKyAgICAgKiBhcyBhIHRyYW5zZm9ybWVyLCByZXR1cm5pbmcgYSBsaXN0IG9mIHRyYW5zZm9ybWVkIHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmICAgICAgIGEgY29sbGVjdGlvbgorICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uIHRoZSBDb2xsZWN0aW9uIHRvIHdoaWNoIHRoZSBtYXBwZWQgdmFsdWVzIGFyZSBhZGRlZAorICAgICAqIEBwYXJhbSBjbG9zdXJlICAgIHRoZSBjbG9zdXJlIHVzZWQgdG8gbWFwIGVhY2ggZWxlbWVudCBvZiB0aGUgY29sbGVjdGlvbgorICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdGFudCBjb2xsZWN0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uIGNvbGxlY3QoQ29sbGVjdGlvbiBzZWxmLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24sIENsb3N1cmUgY2xvc3VyZSkgeworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxmLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgY29sbGVjdGlvbi5hZGQoY2xvc3VyZS5jYWxsKGl0ZXIubmV4dCgpKSk7CisgICAgICAgICAgICBpZiAoY2xvc3VyZS5nZXREaXJlY3RpdmUoKSA9PSBDbG9zdXJlLkRPTkUpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29sbGVjdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJdGVyYXRlcyB0aHJvdWdoIHRoaXMgTWFwIHRyYW5zZm9ybWluZyBlYWNoIGVudHJ5IGludG8gYSBuZXcgdmFsdWUgdXNpbmcgdGhlIGNsb3N1cmUKKyAgICAgKiBhcyBhIHRyYW5zZm9ybWVyLCByZXR1cm5pbmcgYSBsaXN0IG9mIHRyYW5zZm9ybWVkIHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmICAgICAgIGEgTWFwCisgICAgICogQHBhcmFtIGNvbGxlY3Rpb24gdGhlIENvbGxlY3Rpb24gdG8gd2hpY2ggdGhlIG1hcHBlZCB2YWx1ZXMgYXJlIGFkZGVkCisgICAgICogQHBhcmFtIGNsb3N1cmUgICAgdGhlIGNsb3N1cmUgdXNlZCBmb3IgbWFwcGluZywgd2hpY2ggY2FuIGJlIHdpdGggb25lKE1hcC5FbnRyeSkgb3IgdHdvKGtleSwgdmFsdWUpIHBhcmFtZXRlcnMKKyAgICAgKiBAcmV0dXJuIGEgTGlzdCBvZiB0aGUgbWFwcGVkIHZhbHVlcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbiBjb2xsZWN0KE1hcCBzZWxmLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24sIENsb3N1cmUgY2xvc3VyZSkgeworICAgICAgICBib29sZWFuIGlzVHdvUGFyYW1zID0gKGNsb3N1cmUuZ2V0UGFyYW1ldGVyVHlwZXMoKS5sZW5ndGggPT0gMik7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGYuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIGlmIChpc1R3b1BhcmFtcykgeworICAgICAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24uYWRkKGNsb3N1cmUuY2FsbChuZXcgT2JqZWN0W117ZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCl9KSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24uYWRkKGNsb3N1cmUuY2FsbChpdGVyLm5leHQoKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBjb2xsZWN0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEl0ZXJhdGVzIHRocm91Z2ggdGhpcyBNYXAgdHJhbnNmb3JtaW5nIGVhY2ggZW50cnkgaW50byBhIG5ldyB2YWx1ZSB1c2luZyB0aGUgY2xvc3VyZQorICAgICAqIGFzIGEgdHJhbnNmb3JtZXIsIHJldHVybmluZyBhIGxpc3Qgb2YgdHJhbnNmb3JtZWQgdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgICAgYSBNYXAKKyAgICAgKiBAcGFyYW0gY2xvc3VyZSB0aGUgY2xvc3VyZSB1c2VkIHRvIG1hcCBlYWNoIGVsZW1lbnQgb2YgdGhlIGNvbGxlY3Rpb24KKyAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHRhbnQgY29sbGVjdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBjb2xsZWN0KE1hcCBzZWxmLCBDbG9zdXJlIGNsb3N1cmUpIHsKKyAgICAgICAgcmV0dXJuIChMaXN0KSBjb2xsZWN0KHNlbGYsIG5ldyBBcnJheUxpc3Qoc2VsZi5zaXplKCkpLCBjbG9zdXJlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kcyB0aGUgZmlyc3QgdmFsdWUgbWF0Y2hpbmcgdGhlIGNsb3N1cmUgY29uZGl0aW9uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgICBhbiBPYmplY3Qgd2l0aCBhbiBpdGVyYXRvciByZXR1cm5pbmcgaXRzIHZhbHVlcworICAgICAqIEBwYXJhbSBjbG9zdXJlIGEgY2xvc3VyZSBjb25kaXRpb24KKyAgICAgKiBAcmV0dXJuIHRoZSBmaXJzdCBPYmplY3QgZm91bmQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBmaW5kKE9iamVjdCBzZWxmLCBDbG9zdXJlIGNsb3N1cmUpIHsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gSW52b2tlckhlbHBlci5hc0l0ZXJhdG9yKHNlbGYpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGl0ZXIubmV4dCgpOworICAgICAgICAgICAgaWYgKERlZmF1bHRUeXBlVHJhbnNmb3JtYXRpb24uY2FzdFRvQm9vbGVhbihjbG9zdXJlLmNhbGwodmFsdWUpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kcyB0aGUgZmlyc3QgdmFsdWUgbWF0Y2hpbmcgdGhlIGNsb3N1cmUgY29uZGl0aW9uLiAgRXhhbXBsZToKKyAgICAgKiA8cHJlPmRlZiBsaXN0ID0gWzEsMiwzXQorICAgICAqIGxpc3QuZmluZCB7IGl0ID4gMSB9IC8vIHJldHVybnMgMgorICAgICAqIDwvcHJlPgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgICAgYSBDb2xsZWN0aW9uCisgICAgICogQHBhcmFtIGNsb3N1cmUgYSBjbG9zdXJlIGNvbmRpdGlvbgorICAgICAqIEByZXR1cm4gdGhlIGZpcnN0IE9iamVjdCBmb3VuZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGZpbmQoQ29sbGVjdGlvbiBzZWxmLCBDbG9zdXJlIGNsb3N1cmUpIHsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGl0ZXIubmV4dCgpOworICAgICAgICAgICAgaWYgKERlZmF1bHRUeXBlVHJhbnNmb3JtYXRpb24uY2FzdFRvQm9vbGVhbihjbG9zdXJlLmNhbGwodmFsdWUpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kcyB0aGUgZmlyc3QgZW50cnkgbWF0Y2hpbmcgdGhlIGNsb3N1cmUgY29uZGl0aW9uLiAgSWYgdGhlIGNsb3N1cmUgdGFrZXMKKyAgICAgKiB0d28gcGFyYW1ldGVycywgdGhlIGVudHJ5IGtleSBhbmQgdmFsdWUgYXJlIHBhc3NlZC4gIElmIHRoZSBjbG9zdXJlIHRha2VzCisgICAgICogb25lIHBhcmFtZXRlciwgdGhlIE1hcC5FbnRyeSBvYmplY3QgaXMgcGFzc2VkLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgICAgYSBNYXAKKyAgICAgKiBAcGFyYW0gY2xvc3VyZSBhIGNsb3N1cmUgY29uZGl0aW9uCisgICAgICogQHJldHVybiB0aGUgZmlyc3QgT2JqZWN0IGZvdW5kCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZmluZChNYXAgc2VsZiwgQ2xvc3VyZSBjbG9zdXJlKSB7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGYuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgaWYgKERlZmF1bHRUeXBlVHJhbnNmb3JtYXRpb24uY2FzdFRvQm9vbGVhbihjYWxsQ2xvc3VyZUZvck1hcEVudHJ5KGNsb3N1cmUsIGVudHJ5KSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZW50cnk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZHMgYWxsIGl0ZW1zIG1hdGNoaW5nIHRoZSBjbG9zdXJlIGNvbmRpdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmICAgIGFuIE9iamVjdCB3aXRoIGFuIEl0ZXJhdG9yIHJldHVybmluZyBpdHMgdmFsdWVzCisgICAgICogQHBhcmFtIGNsb3N1cmUgYSBjbG9zdXJlIGNvbmRpdGlvbgorICAgICAqIEByZXR1cm4gYSBMaXN0IG9mIHRoZSB2YWx1ZXMgZm91bmQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3QgZmluZEFsbChPYmplY3Qgc2VsZiwgQ2xvc3VyZSBjbG9zdXJlKSB7CisgICAgICAgIExpc3QgYW5zd2VyID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBJbnZva2VySGVscGVyLmFzSXRlcmF0b3Ioc2VsZik7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gaXRlci5uZXh0KCk7CisgICAgICAgICAgICBpZiAoRGVmYXVsdFR5cGVUcmFuc2Zvcm1hdGlvbi5jYXN0VG9Cb29sZWFuKGNsb3N1cmUuY2FsbCh2YWx1ZSkpKSB7CisgICAgICAgICAgICAgICAgYW5zd2VyLmFkZCh2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFuc3dlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kcyBhbGwgdmFsdWVzIG1hdGNoaW5nIHRoZSBjbG9zdXJlIGNvbmRpdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmICAgIGEgQ29sbGVjdGlvbgorICAgICAqIEBwYXJhbSBjbG9zdXJlIGEgY2xvc3VyZSBjb25kaXRpb24KKyAgICAgKiBAcmV0dXJuIGEgTGlzdCBvZiB0aGUgdmFsdWVzIGZvdW5kCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMaXN0IGZpbmRBbGwoQ29sbGVjdGlvbiBzZWxmLCBDbG9zdXJlIGNsb3N1cmUpIHsKKyAgICAgICAgTGlzdCBhbnN3ZXIgPSBuZXcgQXJyYXlMaXN0KHNlbGYuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGl0ZXIubmV4dCgpOworICAgICAgICAgICAgaWYgKERlZmF1bHRUeXBlVHJhbnNmb3JtYXRpb24uY2FzdFRvQm9vbGVhbihjbG9zdXJlLmNhbGwodmFsdWUpKSkgeworICAgICAgICAgICAgICAgIGFuc3dlci5hZGQodmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBhbnN3ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBjb21iaW5hdGlvbnMoKSBhcyBhIG1ldGhvZCBvbiBjb2xsZWN0aW9ucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmIGEgQ29sbGVjdGlvbiBvZiBsaXN0cworICAgICAqIEByZXR1cm4gYSBMaXN0IG9mIHRoZSBjb21iaW5hdGlvbnMgZm91bmQKKyAgICAgKiBAc2VlIEdyb292eUNvbGxlY3Rpb25zI2NvbWJpbmF0aW9ucyhDb2xsZWN0aW9uKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBjb21iaW5hdGlvbnMoQ29sbGVjdGlvbiBzZWxmKSB7CisgICAgICAgIHJldHVybiBHcm9vdnlDb2xsZWN0aW9ucy5jb21iaW5hdGlvbnMoc2VsZik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyB0cmFuc3Bvc2UoKSBhcyBhIG1ldGhvZCBvbiBjb2xsZWN0aW9ucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmIGEgQ29sbGVjdGlvbiBvZiBsaXN0cworICAgICAqIEByZXR1cm4gYSBMaXN0IG9mIHRoZSB0cmFuc3Bvc2VkIGxpc3RzCisgICAgICogQHNlZSBHcm9vdnlDb2xsZWN0aW9ucyN0cmFuc3Bvc2UoQ29sbGVjdGlvbikKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3QgdHJhbnNwb3NlKENvbGxlY3Rpb24gc2VsZikgeworICAgICAgICByZXR1cm4gR3Jvb3Z5Q29sbGVjdGlvbnMudHJhbnNwb3NlKHNlbGYpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmRzIGFsbCBlbnRyaWVzIG1hdGNoaW5nIHRoZSBjbG9zdXJlIGNvbmRpdGlvbi4gSWYgdGhlCisgICAgICogY2xvc3VyZSB0YWtlcyBvbmUgcGFyYW1ldGVyIHRoZW4gaXQgd2lsbCBiZSBwYXNzZWQgdGhlIE1hcC5FbnRyeS4KKyAgICAgKiBPdGhlcndpc2UgaWYgdGhlIGNsb3N1cmUgc2hvdWxkIHRha2UgdHdvIHBhcmFtZXRlcnMsIHdoaWNoIHdpbGwgYmUKKyAgICAgKiB0aGUga2V5IGFuZCB0aGUgdmFsdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgICBhIE1hcAorICAgICAqIEBwYXJhbSBjbG9zdXJlIGEgY2xvc3VyZSBjb25kaXRpb24gYXBwbHlpbmcgb24gdGhlIGVudHJpZXMKKyAgICAgKiBAcmV0dXJuIGEgbmV3IHN1Yk1hcAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTWFwIGZpbmRBbGwoTWFwIHNlbGYsIENsb3N1cmUgY2xvc3VyZSkgeworICAgICAgICBNYXAgYW5zd2VyID0gbmV3IEhhc2hNYXAoc2VsZi5zaXplKCkpOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxmLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChEZWZhdWx0VHlwZVRyYW5zZm9ybWF0aW9uLmNhc3RUb0Jvb2xlYW4oY2FsbENsb3N1cmVGb3JNYXBFbnRyeShjbG9zdXJlLCBlbnRyeSkpKSB7CisgICAgICAgICAgICAgICAgYW5zd2VyLnB1dChlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFuc3dlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTb3J0cyBhbGwgY29sbGVjdGlvbiBtZW1iZXJzIGludG8gZ3JvdXBzIGRldGVybWluZWQgYnkgdGhlCisgICAgICogc3VwcGxpZWQgbWFwcGluZyBjbG9zdXJlLiAgVGhlIGNsb3N1cmUgc2hvdWxkIHJldHVybiB0aGUga2V5IHRoYXQgdGhpcworICAgICAqIGl0ZW0gc2hvdWxkIGJlIGdyb3VwZWQgYnkuICBUaGUgcmV0dXJuZWQgTWFwIHdpbGwgaGF2ZSBhbiBlbnRyeSBmb3IgZWFjaAorICAgICAqIGRpc3RpbmN0IGtleSByZXR1cm5lZCBmcm9tIHRoZSBjbG9zdXJlLCB3aXRoIGVhY2ggdmFsdWUgYmVpbmcgYSBsaXN0IG9mCisgICAgICogaXRlbXMgZm9yIHRoYXQgZ3JvdXAuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgICBhIGNvbGxlY3Rpb24gdG8gZ3JvdXAgKG5vIG1hcCkKKyAgICAgKiBAcGFyYW0gY2xvc3VyZSBhIGNsb3N1cmUgbWFwcGluZyBlbnRyaWVzIG9uIGtleXMKKyAgICAgKiBAcmV0dXJuIGEgbmV3IE1hcCBncm91cGVkIGJ5IGtleXMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE1hcCBncm91cEJ5KENvbGxlY3Rpb24gc2VsZiwgQ2xvc3VyZSBjbG9zdXJlKSB7CisgICAgICAgIE1hcCBhbnN3ZXIgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxmLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGNsb3N1cmUuY2FsbChlbGVtZW50KTsKKyAgICAgICAgICAgIGdyb3VwQW5zd2VyKGFuc3dlciwgZWxlbWVudCwgdmFsdWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhbnN3ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogR3JvdXBzIGFsbCBtYXAgbWVtYmVycyBpbnRvIGdyb3VwcyBkZXRlcm1pbmVkIGJ5IHRoZQorICAgICAqIHN1cHBsaWVkIG1hcHBpbmcgY2xvc3VyZS4gVGhlIGNsb3N1cmUgd2lsbCBiZSBwYXNzZWQgYSBNYXAuRW50cnkgb3IKKyAgICAgKiBrZXkgYW5kIHZhbHVlIChkZXBlbmRpbmcgb24gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIHRoZSBjbG9zdXJlIGFjY2VwdHMpCisgICAgICogYW5kIHNob3VsZCByZXR1cm4gdGhlIGtleSB0aGF0IGVhY2ggaXRlbSBzaG91bGQgYmUgZ3JvdXBlZCB1bmRlci4gIFRoZQorICAgICAqIHJlc3VsdGluZyBtYXAgd2lsbCBoYXZlIGFuIGVudHJ5IGZvciBlYWNoICdncm91cCcga2V5IHJldHVybmVkIGJ5IHRoZQorICAgICAqIGNsb3N1cmUsIHdpdGggdmFsdWVzIGJlaW5nIHRoZSBhIGxpc3Qgb2YgbWFwIGVudHJpZXMgdGhhdCBiZWxvbmcgdG8gZWFjaAorICAgICAqIGdyb3VwLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgICAgYSBtYXAgdG8gZ3JvdXAKKyAgICAgKiBAcGFyYW0gY2xvc3VyZSBhIGNsb3N1cmUgbWFwcGluZyBlbnRyaWVzIG9uIGtleXMKKyAgICAgKiBAcmV0dXJuIGEgbmV3IE1hcCBncm91cGVkIGJ5IGtleXMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE1hcCBncm91cEJ5KE1hcCBzZWxmLCBDbG9zdXJlIGNsb3N1cmUpIHsKKyAgICAgICAgZmluYWwgTWFwIGFuc3dlciA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIGZvciAoZmluYWwgSXRlcmF0b3IgaXRlciA9IHNlbGYuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gY2FsbENsb3N1cmVGb3JNYXBFbnRyeShjbG9zdXJlLCBlbnRyeSk7Ly9jbG9zdXJlLmNhbGwoZWxlbWVudCk7CisgICAgICAgICAgICBncm91cEFuc3dlcihhbnN3ZXIsIGVudHJ5LCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFuc3dlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHcm91cHMgdGhlIGN1cnJlbnQgZWxlbWVudCBhY2NvcmRpbmcgdG8gdGhlIHZhbHVlCisgICAgICoKKyAgICAgKiBAcGFyYW0gYW5zd2VyICB0aGUgbWFwIGNvbnRhaW5pbmcgdGhlIHJlc3VsdHMKKyAgICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCB0byBiZSBwbGFjZWQKKyAgICAgKiBAcGFyYW0gdmFsdWUgICB0aGUgdmFsdWUgYWNjb3JkaW5nIHRvIHdoaWNoIHRoZSBlbGVtZW50IHdpbGwgYmUgcGxhY2VkCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGdyb3VwQW5zd2VyKGZpbmFsIE1hcCBhbnN3ZXIsIE9iamVjdCBlbGVtZW50LCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgaWYgKGFuc3dlci5jb250YWluc0tleSh2YWx1ZSkpIHsKKyAgICAgICAgICAgICgoTGlzdCkgYW5zd2VyLmdldCh2YWx1ZSkpLmFkZChlbGVtZW50KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExpc3QgZ3JvdXBlZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgZ3JvdXBlZEVsZW1lbnRzLmFkZChlbGVtZW50KTsKKyAgICAgICAgICAgIGFuc3dlci5wdXQodmFsdWUsIGdyb3VwZWRFbGVtZW50cyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBpbnRlcm5hbCBoZWxwZXIgbWV0aG9kCisgICAgcHJvdGVjdGVkIHN0YXRpYyBPYmplY3QgY2FsbENsb3N1cmVGb3JNYXBFbnRyeShDbG9zdXJlIGNsb3N1cmUsIE1hcC5FbnRyeSBlbnRyeSkgeworICAgICAgICBpZiAoY2xvc3VyZS5nZXRNYXhpbXVtTnVtYmVyT2ZQYXJhbWV0ZXJzKCkgPT0gMikgeworICAgICAgICAgICAgcmV0dXJuIGNsb3N1cmUuY2FsbChuZXcgT2JqZWN0W117ZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCl9KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2xvc3VyZS5jYWxsKGVudHJ5KTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEl0ZXJhdGVzIHRocm91Z2ggdGhlIGdpdmVuIGNvbGxlY3Rpb24sIHBhc3NpbmcgaW4gdGhlIGluaXRpYWwgdmFsdWUgdG8KKyAgICAgKiB0aGUgY2xvc3VyZSBhbG9uZyB3aXRoIHRoZSBjdXJyZW50IGl0ZXJhdGVkIGl0ZW0gdGhlbiBwYXNzaW5nIGludG8gdGhlCisgICAgICogbmV4dCBpdGVyYXRpb24gdGhlIHZhbHVlIG9mIHRoZSBwcmV2aW91cyBjbG9zdXJlLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgICAgYSBDb2xsZWN0aW9uCisgICAgICogQHBhcmFtIHZhbHVlICAgYSB2YWx1ZQorICAgICAqIEBwYXJhbSBjbG9zdXJlIGEgY2xvc3VyZQorICAgICAqIEByZXR1cm4gdGhlIGxhc3QgdmFsdWUgb2YgdGhlIGxhc3QgaXRlcmF0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW5qZWN0KENvbGxlY3Rpb24gc2VsZiwgT2JqZWN0IHZhbHVlLCBDbG9zdXJlIGNsb3N1cmUpIHsKKyAgICAgICAgcmV0dXJuIGluamVjdChzZWxmLml0ZXJhdG9yKCksIHZhbHVlLCBjbG9zdXJlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJdGVyYXRlcyB0aHJvdWdoIHRoZSBnaXZlbiBpdGVyYXRvciwgcGFzc2luZyBpbiB0aGUgaW5pdGlhbCB2YWx1ZSB0bworICAgICAqIHRoZSBjbG9zdXJlIGFsb25nIHdpdGggdGhlIGN1cnJlbnQgaXRlcmF0ZWQgaXRlbSB0aGVuIHBhc3NpbmcgaW50byB0aGUKKyAgICAgKiBuZXh0IGl0ZXJhdGlvbiB0aGUgdmFsdWUgb2YgdGhlIHByZXZpb3VzIGNsb3N1cmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgICBhIENvbGxlY3Rpb24KKyAgICAgKiBAcGFyYW0gdmFsdWUgICBhIHZhbHVlCisgICAgICogQHBhcmFtIGNsb3N1cmUgYSBjbG9zdXJlCisgICAgICogQHJldHVybiB0aGUgbGFzdCB2YWx1ZSBvZiB0aGUgbGFzdCBpdGVyYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBpbmplY3QoSXRlcmF0b3Igc2VsZiwgT2JqZWN0IHZhbHVlLCBDbG9zdXJlIGNsb3N1cmUpIHsKKyAgICAgICAgT2JqZWN0W10gcGFyYW1zID0gbmV3IE9iamVjdFsyXTsKKyAgICAgICAgd2hpbGUgKHNlbGYuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBPYmplY3QgaXRlbSA9IHNlbGYubmV4dCgpOworICAgICAgICAgICAgcGFyYW1zWzBdID0gdmFsdWU7CisgICAgICAgICAgICBwYXJhbXNbMV0gPSBpdGVtOworICAgICAgICAgICAgdmFsdWUgPSBjbG9zdXJlLmNhbGwocGFyYW1zKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogSXRlcmF0ZXMgdGhyb3VnaCB0aGUgZ2l2ZW4gb2JqZWN0LCBwYXNzaW5nIGluIHRoZSBpbml0aWFsIHZhbHVlIHRvCisgICAgICogdGhlIGNsb3N1cmUgYWxvbmcgd2l0aCB0aGUgY3VycmVudCBpdGVyYXRlZCBpdGVtIHRoZW4gcGFzc2luZyBpbnRvIHRoZQorICAgICAqIG5leHQgaXRlcmF0aW9uIHRoZSB2YWx1ZSBvZiB0aGUgcHJldmlvdXMgY2xvc3VyZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmICAgIGEgQ29sbGVjdGlvbgorICAgICAqIEBwYXJhbSB2YWx1ZSAgIGEgdmFsdWUKKyAgICAgKiBAcGFyYW0gY2xvc3VyZSBhIGNsb3N1cmUKKyAgICAgKiBAcmV0dXJuIHRoZSBsYXN0IHZhbHVlIG9mIHRoZSBsYXN0IGl0ZXJhdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGluamVjdChPYmplY3Qgc2VsZiwgT2JqZWN0IHZhbHVlLCBDbG9zdXJlIGNsb3N1cmUpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRlciA9IEludm9rZXJIZWxwZXIuYXNJdGVyYXRvcihzZWxmKTsKKyAgICAgICAgcmV0dXJuIGluamVjdChpdGVyLCB2YWx1ZSwgY2xvc3VyZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSXRlcmF0ZXMgdGhyb3VnaCB0aGUgZ2l2ZW4gYXJyYXkgb2Ygb2JqZWN0cywgcGFzc2luZyBpbiB0aGUgaW5pdGlhbCB2YWx1ZSB0bworICAgICAqIHRoZSBjbG9zdXJlIGFsb25nIHdpdGggdGhlIGN1cnJlbnQgaXRlcmF0ZWQgaXRlbSB0aGVuIHBhc3NpbmcgaW50byB0aGUKKyAgICAgKiBuZXh0IGl0ZXJhdGlvbiB0aGUgdmFsdWUgb2YgdGhlIHByZXZpb3VzIGNsb3N1cmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgICAgICAgIGFuIE9iamVjdFtdCisgICAgICogQHBhcmFtIGluaXRpYWxWYWx1ZSBhbiBpbml0aWFsVmFsdWUKKyAgICAgKiBAcGFyYW0gY2xvc3VyZSAgICAgIGEgY2xvc3VyZQorICAgICAqIEByZXR1cm4gdGhlIGxhc3QgdmFsdWUgb2YgdGhlIGxhc3QgaXRlcmF0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW5qZWN0KE9iamVjdFtdIHNlbGYsIE9iamVjdCBpbml0aWFsVmFsdWUsIENsb3N1cmUgY2xvc3VyZSkgeworICAgICAgICBPYmplY3RbXSBwYXJhbXMgPSBuZXcgT2JqZWN0WzJdOworICAgICAgICBPYmplY3QgdmFsdWUgPSBpbml0aWFsVmFsdWU7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VsZi5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgcGFyYW1zWzBdID0gdmFsdWU7CisgICAgICAgICAgICBwYXJhbXNbMV0gPSBzZWxmW2ldOworICAgICAgICAgICAgdmFsdWUgPSBjbG9zdXJlLmNhbGwocGFyYW1zKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3VtcyB0aGUgaXRlbXMgaW4gYSBjb2xsZWN0aW9uLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIGludm9raW5nIHRoZQorICAgICAqICJwbHVzIiBtZXRob2Qgb24gYWxsIGl0ZW1zIGluIHRoZSBjb2xsZWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgQ29sbGVjdGlvbiBvZiB2YWx1ZXMgdG8gYWRkIHRvZ2V0aGVyLgorICAgICAqIEByZXR1cm4gVGhlIHN1bSBvZiBhbGwgb2YgdGhlIGxpc3QgaXRtZW1zLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHN1bShDb2xsZWN0aW9uIHNlbGYpIHsKKyAgICAgICAgcmV0dXJuIHN1bShzZWxmLCBudWxsLCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdW1zIHRoZSBpdGVtcyBpbiBhIGNvbGxlY3Rpb24sIGFkZGluZyB0aGUgcmVzdWx0IHRvIHNvbWUgaW5pdGlhbCB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmICAgICAgICAgYSBjb2xsZWN0aW9uIG9mIHZhbHVlcyB0byBzdW0uCisgICAgICogQHBhcmFtIGluaXRpYWxWYWx1ZSB0aGUgaXRlbXMgaW4gdGhlIGNvbGxlY3Rpb24gd2lsbCBiZSBzdW1tZWQgdG8gdGhpcyBpbml0aWFsIHZhbHVlCisgICAgICogQHJldHVybiBUaGUgc3VtIG9mIGFsbCBvZiB0aGUgY29sbGVjdGlvbiBpdGVtcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBzdW0oQ29sbGVjdGlvbiBzZWxmLCBPYmplY3QgaW5pdGlhbFZhbHVlKSB7CisgICAgICAgIHJldHVybiBzdW0oc2VsZiwgaW5pdGlhbFZhbHVlLCBmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IHN1bShDb2xsZWN0aW9uIHNlbGYsIE9iamVjdCBpbml0aWFsVmFsdWUsIGJvb2xlYW4gZmlyc3QpIHsKKyAgICAgICAgT2JqZWN0IHJlc3VsdCA9IGluaXRpYWxWYWx1ZTsKKyAgICAgICAgT2JqZWN0W10gcGFyYW0gPSBuZXcgT2JqZWN0WzFdOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxmLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgcGFyYW1bMF0gPSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IHBhcmFtWzBdOworICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBNZXRhQ2xhc3MgbWV0YUNsYXNzID0gSW52b2tlckhlbHBlci5nZXRNZXRhQ2xhc3MocmVzdWx0KTsKKyAgICAgICAgICAgIHJlc3VsdCA9IG1ldGFDbGFzcy5pbnZva2VNZXRob2QocmVzdWx0LCAicGx1cyIsIHBhcmFtKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFN1bXMgdGhlIHJlc3VsdCBvZiBhcHBseSBhIGNsb3N1cmUgdG8gZWFjaCBpdGVtIG9mIGEgY29sbGVjdGlvbi4KKyAgICAgKiA8Y29kZT5jb2xsLnN1bShjbG9zdXJlKTwvY29kZT4gaXMgZXF1aXZhbGVudCB0bzoKKyAgICAgKiA8Y29kZT5jb2xsLmNvbGxlY3QoY2xvc3VyZSkuc3VtKCk8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgICAgYSBDb2xsZWN0aW9uCisgICAgICogQHBhcmFtIGNsb3N1cmUgYSBzaW5nbGUgcGFyYW1ldGVyIGNsb3N1cmUgdGhhdCByZXR1cm5zIGEgbnVtZXJpYyB2YWx1ZS4KKyAgICAgKiBAcmV0dXJuIFRoZSBzdW0gb2YgdGhlIHZhbHVlcyByZXR1cm5lZCBieSBhcHBseWluZyB0aGUgY2xvc3VyZSB0byBlYWNoCisgICAgICogICAgICAgICBpdGVtIG9mIHRoZSBsaXN0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHN1bShDb2xsZWN0aW9uIHNlbGYsIENsb3N1cmUgY2xvc3VyZSkgeworICAgICAgICByZXR1cm4gc3VtKHNlbGYsIG51bGwsIGNsb3N1cmUsIHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN1bXMgdGhlIHJlc3VsdCBvZiBhcHBseSBhIGNsb3N1cmUgdG8gZWFjaCBpdGVtIG9mIGEgY29sbGVjdGlvbiB0byBzdW0gaW50aWFsIHZhbHVlLgorICAgICAqIDxjb2RlPmNvbGwuc3VtKGNsb3N1cmUpPC9jb2RlPiBpcyBlcXVpdmFsZW50IHRvOgorICAgICAqIDxjb2RlPmNvbGwuY29sbGVjdChjbG9zdXJlKS5zdW0oKTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgICAgICAgIGEgQ29sbGVjdGlvbgorICAgICAqIEBwYXJhbSBjbG9zdXJlICAgICAgYSBzaW5nbGUgcGFyYW1ldGVyIGNsb3N1cmUgdGhhdCByZXR1cm5zIGEgbnVtZXJpYyB2YWx1ZS4KKyAgICAgKiBAcGFyYW0gaW5pdGlhbFZhbHVlIHRoZSBjbG9zdXJlIHJlc3VsdHMgd2lsbCBiZSBzdW1tZWQgdG8gdGhpcyBpbml0aWFsIHZhbHVlCisgICAgICogQHJldHVybiBUaGUgc3VtIG9mIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkgYXBwbHlpbmcgdGhlIGNsb3N1cmUgdG8gZWFjaAorICAgICAqICAgICAgICAgaXRlbSBvZiB0aGUgbGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBzdW0oQ29sbGVjdGlvbiBzZWxmLCBPYmplY3QgaW5pdGlhbFZhbHVlLCBDbG9zdXJlIGNsb3N1cmUpIHsKKyAgICAgICAgcmV0dXJuIHN1bShzZWxmLCBpbml0aWFsVmFsdWUsIGNsb3N1cmUsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBPYmplY3Qgc3VtKENvbGxlY3Rpb24gc2VsZiwgT2JqZWN0IGluaXRpYWxWYWx1ZSwgQ2xvc3VyZSBjbG9zdXJlLCBib29sZWFuIGZpcnN0KSB7CisgICAgICAgIE9iamVjdCByZXN1bHQgPSBpbml0aWFsVmFsdWU7CisgICAgICAgIE9iamVjdFtdIGNsb3N1cmVQYXJhbSA9IG5ldyBPYmplY3RbMV07CisgICAgICAgIE9iamVjdFtdIHBsdXNQYXJhbSA9IG5ldyBPYmplY3RbMV07CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGYuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBjbG9zdXJlUGFyYW1bMF0gPSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIHBsdXNQYXJhbVswXSA9IGNsb3N1cmUuY2FsbChjbG9zdXJlUGFyYW0pOworICAgICAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gcGx1c1BhcmFtWzBdOworICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBNZXRhQ2xhc3MgbWV0YUNsYXNzID0gSW52b2tlckhlbHBlci5nZXRNZXRhQ2xhc3MocmVzdWx0KTsKKyAgICAgICAgICAgIHJlc3VsdCA9IG1ldGFDbGFzcy5pbnZva2VNZXRob2QocmVzdWx0LCAicGx1cyIsIHBsdXNQYXJhbSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25jYXRlbmF0ZXMgdGhlIDxjb2RlPnRvU3RyaW5nKCk8L2NvZGU+IHJlcHJlc2VudGF0aW9uIG9mIGVhY2gKKyAgICAgKiBpdGVtIGluIHRoaXMgY29sbGVjdGlvbiwgd2l0aCB0aGUgZ2l2ZW4gU3RyaW5nIGFzIGEgc2VwYXJhdG9yIGJldHdlZW4KKyAgICAgKiBlYWNoIGl0ZW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgICAgIGEgQ29sbGVjdGlvbiBvZiBvYmplY3RzCisgICAgICogQHBhcmFtIHNlcGFyYXRvciBhIFN0cmluZyBzZXBhcmF0b3IKKyAgICAgKiBAcmV0dXJuIHRoZSBqb2luZWQgU3RyaW5nCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgam9pbihDb2xsZWN0aW9uIHNlbGYsIFN0cmluZyBzZXBhcmF0b3IpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7CisKKyAgICAgICAgaWYgKHNlcGFyYXRvciA9PSBudWxsKSBzZXBhcmF0b3IgPSAiIjsKKworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxmLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gaXRlci5uZXh0KCk7CisgICAgICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKHNlcGFyYXRvcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKEludm9rZXJIZWxwZXIudG9TdHJpbmcodmFsdWUpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uY2F0ZW5hdGVzIHRoZSA8Y29kZT50b1N0cmluZygpPC9jb2RlPiByZXByZXNlbnRhdGlvbiBvZiBlYWNoCisgICAgICogaXRlbXMgaW4gdGhpcyBhcnJheSwgd2l0aCB0aGUgZ2l2ZW4gU3RyaW5nIGFzIGEgc2VwYXJhdG9yIGJldHdlZW4gZWFjaAorICAgICAqIGl0ZW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgICAgIGFuIGFycmF5IG9mIE9iamVjdAorICAgICAqIEBwYXJhbSBzZXBhcmF0b3IgYSBTdHJpbmcgc2VwYXJhdG9yCisgICAgICogQHJldHVybiB0aGUgam9pbmVkIFN0cmluZworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGpvaW4oT2JqZWN0W10gc2VsZiwgU3RyaW5nIHNlcGFyYXRvcikgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKworICAgICAgICBpZiAoc2VwYXJhdG9yID09IG51bGwpIHNlcGFyYXRvciA9ICIiOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VsZi5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gSW52b2tlckhlbHBlci50b1N0cmluZyhzZWxmW2ldKTsKKyAgICAgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoc2VwYXJhdG9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQodmFsdWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIG1heCgpIG1ldGhvZCB0byBDb2xsZWN0aW9uIG9iamVjdHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiBhIENvbGxlY3Rpb24KKyAgICAgKiBAcmV0dXJuIHRoZSBtYXhpbXVtIHZhbHVlCisgICAgICogQHNlZSBHcm9vdnlDb2xsZWN0aW9ucyNtYXgoQ29sbGVjdGlvbikKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBtYXgoQ29sbGVjdGlvbiBzZWxmKSB7CisgICAgICAgIHJldHVybiBHcm9vdnlDb2xsZWN0aW9ucy5tYXgoc2VsZik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VsZWN0cyB0aGUgbWF4aW11bSB2YWx1ZSBmb3VuZCBpbiB0aGUgY29sbGVjdGlvbiB1c2luZyB0aGUgZ2l2ZW4gY29tcGFyYXRvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmICAgICAgIGEgQ29sbGVjdGlvbgorICAgICAqIEBwYXJhbSBjb21wYXJhdG9yIGEgQ29tcGFyYXRvcgorICAgICAqIEByZXR1cm4gdGhlIG1heGltdW0gdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBtYXgoQ29sbGVjdGlvbiBzZWxmLCBDb21wYXJhdG9yIGNvbXBhcmF0b3IpIHsKKyAgICAgICAgT2JqZWN0IGFuc3dlciA9IG51bGw7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGYuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChhbnN3ZXIgPT0gbnVsbCB8fCBjb21wYXJhdG9yLmNvbXBhcmUodmFsdWUsIGFuc3dlcikgPiAwKSB7CisgICAgICAgICAgICAgICAgYW5zd2VyID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFuc3dlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIG1pbigpIG1ldGhvZCB0byBDb2xsZWN0aW9uIG9iamVjdHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiBhIENvbGxlY3Rpb24KKyAgICAgKiBAcmV0dXJuIHRoZSBtaW5pbXVtIHZhbHVlCisgICAgICogQHNlZSBHcm9vdnlDb2xsZWN0aW9ucyNtaW4oQ29sbGVjdGlvbikKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBtaW4oQ29sbGVjdGlvbiBzZWxmKSB7CisgICAgICAgIHJldHVybiBHcm9vdnlDb2xsZWN0aW9ucy5taW4oc2VsZik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VsZWN0cyB0aGUgbWluaW11bSB2YWx1ZSBmb3VuZCBpbiB0aGUgY29sbGVjdGlvbiB1c2luZyB0aGUgZ2l2ZW4gY29tcGFyYXRvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmICAgICAgIGEgQ29sbGVjdGlvbgorICAgICAqIEBwYXJhbSBjb21wYXJhdG9yIGEgQ29tcGFyYXRvcgorICAgICAqIEByZXR1cm4gdGhlIG1pbmltdW0gdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBtaW4oQ29sbGVjdGlvbiBzZWxmLCBDb21wYXJhdG9yIGNvbXBhcmF0b3IpIHsKKyAgICAgICAgT2JqZWN0IGFuc3dlciA9IG51bGw7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGYuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChhbnN3ZXIgPT0gbnVsbCB8fCBjb21wYXJhdG9yLmNvbXBhcmUodmFsdWUsIGFuc3dlcikgPCAwKSB7CisgICAgICAgICAgICAgICAgYW5zd2VyID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFuc3dlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZWxlY3RzIHRoZSBtaW5pbXVtIHZhbHVlIGZvdW5kIGluIHRoZSBjb2xsZWN0aW9uIHVzaW5nIHRoZSBnaXZlbiBjbG9zdXJlCisgICAgICogYXMgYSBjb21wYXJhdG9yLiAgVGhlIGNsb3N1cmUgc2hvdWxkIHJldHVybiBhIGNvbXBhcmFibGUgdmFsdWUgKGkuZS4gYQorICAgICAqIG51bWJlcikgZm9yIGVhY2ggaXRlbSBwYXNzZWQuICBUaGUgY29sbGVjdGlvbiBpdGVtIGZvciB3aGljaCB0aGUgY2xvc3VyZQorICAgICAqIHJldHVybnMgdGhlIHNtYWxsZXN0IGNvbXBhcmFibGUgdmFsdWUgd2lsbCBiZSByZXR1cm5lZCBmcm9tIHRoaXMgbWV0aG9kCisgICAgICogYXMgdGhlIG1pbmltdW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgICBhIENvbGxlY3Rpb24KKyAgICAgKiBAcGFyYW0gY2xvc3VyZSBhIGNsb3N1cmUgdXNlZCBhcyBhIGNvbXBhcmF0b3IKKyAgICAgKiBAcmV0dXJuIHRoZSBtaW5pbXVtIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgbWluKENvbGxlY3Rpb24gc2VsZiwgQ2xvc3VyZSBjbG9zdXJlKSB7CisgICAgICAgIGludCBwYXJhbXMgPSBjbG9zdXJlLmdldE1heGltdW1OdW1iZXJPZlBhcmFtZXRlcnMoKTsKKyAgICAgICAgaWYgKHBhcmFtcyAhPSAxKSB7CisgICAgICAgICAgICByZXR1cm4gbWluKHNlbGYsIG5ldyBDbG9zdXJlQ29tcGFyYXRvcihjbG9zdXJlKSk7CisgICAgICAgIH0KKyAgICAgICAgT2JqZWN0IGFuc3dlciA9IG51bGw7CisgICAgICAgIE9iamVjdCBhbnN3ZXJfdmFsdWUgPSBudWxsOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxmLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgT2JqZWN0IGl0ZW0gPSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGNsb3N1cmUuY2FsbChpdGVtKTsKKyAgICAgICAgICAgIGlmIChhbnN3ZXIgPT0gbnVsbCB8fCBTY3JpcHRCeXRlY29kZUFkYXB0ZXIuY29tcGFyZUxlc3NUaGFuKHZhbHVlLCBhbnN3ZXJfdmFsdWUpKSB7CisgICAgICAgICAgICAgICAgYW5zd2VyID0gaXRlbTsKKyAgICAgICAgICAgICAgICBhbnN3ZXJfdmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYW5zd2VyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbGVjdHMgdGhlIG1heGltdW0gdmFsdWUgZm91bmQgaW4gdGhlIGNvbGxlY3Rpb24gdXNpbmcgdGhlIGdpdmVuIGNsb3N1cmUKKyAgICAgKiBhcyBhIGNvbXBhcmF0b3IuICBUaGUgY2xvc3VyZSBzaG91bGQgcmV0dXJuIGEgY29tcGFyYWJsZSB2YWx1ZSAoaS5lLiBhCisgICAgICogbnVtYmVyKSBmb3IgZWFjaCBpdGVtIHBhc3NlZC4gIFRoZSBjb2xsZWN0aW9uIGl0ZW0gZm9yIHdoaWNoIHRoZSBjbG9zdXJlCisgICAgICogcmV0dXJucyB0aGUgbGFyZ2VzdCBjb21wYXJhYmxlIHZhbHVlIHdpbGwgYmUgcmV0dXJuZWQgZnJvbSB0aGlzIG1ldGhvZAorICAgICAqIGFzIHRoZSBtYXhpbXVtLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgICAgYSBDb2xsZWN0aW9uCisgICAgICogQHBhcmFtIGNsb3N1cmUgYSBjbG9zdXJlIHVzZWQgYXMgYSBjb21wYXJhdG9yCisgICAgICogQHJldHVybiB0aGUgbWF4aW11bSB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IG1heChDb2xsZWN0aW9uIHNlbGYsIENsb3N1cmUgY2xvc3VyZSkgeworICAgICAgICBpbnQgcGFyYW1zID0gY2xvc3VyZS5nZXRNYXhpbXVtTnVtYmVyT2ZQYXJhbWV0ZXJzKCk7CisgICAgICAgIGlmIChwYXJhbXMgIT0gMSkgeworICAgICAgICAgICAgcmV0dXJuIG1heChzZWxmLCBuZXcgQ2xvc3VyZUNvbXBhcmF0b3IoY2xvc3VyZSkpOworICAgICAgICB9CisgICAgICAgIE9iamVjdCBhbnN3ZXIgPSBudWxsOworICAgICAgICBPYmplY3QgQW5zd2VyVmFsdWUgPSBudWxsOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxmLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgT2JqZWN0IGl0ZW0gPSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGNsb3N1cmUuY2FsbChpdGVtKTsKKyAgICAgICAgICAgIGlmIChhbnN3ZXIgPT0gbnVsbCB8fCBTY3JpcHRCeXRlY29kZUFkYXB0ZXIuY29tcGFyZUxlc3NUaGFuKEFuc3dlclZhbHVlLCB2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICBhbnN3ZXIgPSBpdGVtOworICAgICAgICAgICAgICAgIEFuc3dlclZhbHVlID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFuc3dlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYWtlcyBhIFN0cmluZyBsb29rIGxpa2UgYSBDb2xsZWN0aW9uIGJ5IGFkZGluZyBzdXBwb3J0IGZvciB0aGUgc2l6ZSgpIG1ldGhvZAorICAgICAqCisgICAgICogQHBhcmFtIHRleHQgYSBTdHJpbmcKKyAgICAgKiBAcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIFN0cmluZworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IHNpemUoU3RyaW5nIHRleHQpIHsKKyAgICAgICAgcmV0dXJuIHRleHQubGVuZ3RoKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvdmlkZSBzdGFuZGFyZCBHcm9vdnkgc2l6ZSgpIG1ldGhvZCBmb3IgU3RyaW5nQnVmZmVycworICAgICAqCisgICAgICogQHBhcmFtIGJ1ZmZlciBhIFN0cmluZ0J1ZmZlcgorICAgICAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgU3RyaW5nQnVmZmVyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgc2l6ZShTdHJpbmdCdWZmZXIgYnVmZmVyKSB7CisgICAgICAgIHJldHVybiBidWZmZXIubGVuZ3RoKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvdmlkZSB0aGUgc3RhbmRhcmQgR3Jvb3Z5IHNpemUgbWV0aG9kIGZvciBhIGZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiBhIGZpbGUgb2JqZWN0CisgICAgICogQHJldHVybiB0aGUgZmlsZSdzIHNpemUgKGxlbmd0aCkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGxvbmcgc2l6ZShGaWxlIHNlbGYpIHsKKyAgICAgICAgcmV0dXJuIHNlbGYubGVuZ3RoKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlIHRoZSBzdGFuZGFyZCBHcm9vdnkgc2l6ZSBtZXRob2QgZm9yIGEgbWF0Y2hlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmIGEgbWF0Y2hlciBvYmplY3QKKyAgICAgKiBAcmV0dXJuIHRoZSBtYXRjaGVyJ3Mgc2l6ZSAoY291bnQpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBsb25nIHNpemUoTWF0Y2hlciBzZWxmKSB7CisgICAgICAgIHJldHVybiBnZXRDb3VudChzZWxmKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlIHRoZSBzdGFuZGFyZCBHcm9vdnkgc2l6ZSBtZXRob2QgZm9yIGFuIGFycmF5LgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgYW4gQXJyYXkgb2Ygb2JqZWN0cworICAgICAqIEByZXR1cm4gdGhlIHNpemUgKGxlbmd0aCkgb2YgdGhlIEFycmF5CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgc2l6ZShPYmplY3RbXSBzZWxmKSB7CisgICAgICAgIHJldHVybiBzZWxmLmxlbmd0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdXBwb3J0IHRoZSBzdWJzY3JpcHQgb3BlcmF0b3IgZm9yIENoYXJTZXF1ZW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXh0ICBhIENoYXJTZXF1ZW5jZQorICAgICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgdGhlIENoYXJhY3RlciB0byBnZXQKKyAgICAgKiBAcmV0dXJuIHRoZSBDaGFyYWN0ZXIgYXQgdGhlIGdpdmVuIGluZGV4CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDaGFyU2VxdWVuY2UgZ2V0QXQoQ2hhclNlcXVlbmNlIHRleHQsIGludCBpbmRleCkgeworICAgICAgICBpbmRleCA9IG5vcm1hbGlzZUluZGV4KGluZGV4LCB0ZXh0Lmxlbmd0aCgpKTsKKyAgICAgICAgcmV0dXJuIHRleHQuc3ViU2VxdWVuY2UoaW5kZXgsIGluZGV4ICsgMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3VwcG9ydCB0aGUgc3Vic2NyaXB0IG9wZXJhdG9yIGZvciBTdHJpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGV4dCAgYSBTdHJpbmcKKyAgICAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIHRoZSBDaGFyYWN0ZXIgdG8gZ2V0CisgICAgICogQHJldHVybiB0aGUgQ2hhcmFjdGVyIGF0IHRoZSBnaXZlbiBpbmRleAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEF0KFN0cmluZyB0ZXh0LCBpbnQgaW5kZXgpIHsKKyAgICAgICAgaW5kZXggPSBub3JtYWxpc2VJbmRleChpbmRleCwgdGV4dC5sZW5ndGgoKSk7CisgICAgICAgIHJldHVybiB0ZXh0LnN1YnN0cmluZyhpbmRleCwgaW5kZXggKyAxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdXBwb3J0IHRoZSByYW5nZSBzdWJzY3JpcHQgb3BlcmF0b3IgZm9yIENoYXJTZXF1ZW5jZQorICAgICAqCisgICAgICogQHBhcmFtIHRleHQgIGEgQ2hhclNlcXVlbmNlCisgICAgICogQHBhcmFtIHJhbmdlIGEgUmFuZ2UKKyAgICAgKiBAcmV0dXJuIHRoZSBzdWJzZXF1ZW5jZSBDaGFyU2VxdWVuY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENoYXJTZXF1ZW5jZSBnZXRBdChDaGFyU2VxdWVuY2UgdGV4dCwgUmFuZ2UgcmFuZ2UpIHsKKyAgICAgICAgaW50IGZyb20gPSBub3JtYWxpc2VJbmRleChEZWZhdWx0VHlwZVRyYW5zZm9ybWF0aW9uLmludFVuYm94KHJhbmdlLmdldEZyb20oKSksIHRleHQubGVuZ3RoKCkpOworICAgICAgICBpbnQgdG8gPSBub3JtYWxpc2VJbmRleChEZWZhdWx0VHlwZVRyYW5zZm9ybWF0aW9uLmludFVuYm94KHJhbmdlLmdldFRvKCkpLCB0ZXh0Lmxlbmd0aCgpKTsKKworICAgICAgICBib29sZWFuIHJldmVyc2UgPSByYW5nZS5pc1JldmVyc2UoKTsKKyAgICAgICAgLy8gSWYgdGhpcyBpcyBhIGJhY2t3YXJkcyByYW5nZSwgcmV2ZXJzZSB0aGUgYXJndW1lbnRzIHRvIHN1YnN0cmluZy4KKyAgICAgICAgaWYgKGZyb20gPiB0bykgeworICAgICAgICAgICAgaW50IHRtcCA9IGZyb207CisgICAgICAgICAgICBmcm9tID0gdG87CisgICAgICAgICAgICB0byA9IHRtcDsKKyAgICAgICAgICAgIHJldmVyc2UgPSAhcmV2ZXJzZTsKKyAgICAgICAgfQorCisgICAgICAgIENoYXJTZXF1ZW5jZSBzZXF1ZW5jZSA9IHRleHQuc3ViU2VxdWVuY2UoZnJvbSwgdG8gKyAxKTsKKyAgICAgICAgcmV0dXJuIHJldmVyc2UgPyByZXZlcnNlKChTdHJpbmcpIHNlcXVlbmNlKSA6IHNlcXVlbmNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN1cHBvcnQgdGhlIHJhbmdlIHN1YnNjcmlwdCBvcGVyYXRvciBmb3IgQ2hhclNlcXVlbmNlIG9yIFN0cmluZ0J1ZmZlciB3aXRoIEludFJhbmdlCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGV4dCAgYSBDaGFyU2VxdWVuY2UKKyAgICAgKiBAcGFyYW0gcmFuZ2UgYW4gSW50UmFuZ2UKKyAgICAgKiBAcmV0dXJuIHRoZSBzdWJzZXF1ZW5jZSBDaGFyU2VxdWVuY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENoYXJTZXF1ZW5jZSBnZXRBdChDaGFyU2VxdWVuY2UgdGV4dCwgSW50UmFuZ2UgcmFuZ2UpIHsKKyAgICAgICAgcmV0dXJuIGdldEF0KHRleHQsIChSYW5nZSkgcmFuZ2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN1cHBvcnQgdGhlIHJhbmdlIHN1YnNjcmlwdCBvcGVyYXRvciBmb3IgQ2hhclNlcXVlbmNlIG9yIFN0cmluZ0J1ZmZlciB3aXRoIEVtcHR5UmFuZ2UKKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXh0ICBhIENoYXJTZXF1ZW5jZQorICAgICAqIEBwYXJhbSByYW5nZSBhbiBFbXB0eVJhbmdlCisgICAgICogQHJldHVybiB0aGUgc3Vic2VxdWVuY2UgQ2hhclNlcXVlbmNlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDaGFyU2VxdWVuY2UgZ2V0QXQoQ2hhclNlcXVlbmNlIHRleHQsIEVtcHR5UmFuZ2UgcmFuZ2UpIHsKKyAgICAgICAgcmV0dXJuICIiOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN1cHBvcnQgdGhlIHJhbmdlIHN1YnNjcmlwdCBvcGVyYXRvciBmb3IgU3RyaW5nIHdpdGggSW50UmFuZ2UKKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXh0ICBhIFN0cmluZworICAgICAqIEBwYXJhbSByYW5nZSBhbiBJbnRSYW5nZQorICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdGluZyBTdHJpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBdChTdHJpbmcgdGV4dCwgSW50UmFuZ2UgcmFuZ2UpIHsKKyAgICAgICAgcmV0dXJuIGdldEF0KHRleHQsIChSYW5nZSkgcmFuZ2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN1cHBvcnQgdGhlIHJhbmdlIHN1YnNjcmlwdCBvcGVyYXRvciBmb3IgU3RyaW5nIHdpdGggRW1wdHlSYW5nZQorICAgICAqCisgICAgICogQHBhcmFtIHRleHQgIGEgU3RyaW5nCisgICAgICogQHBhcmFtIHJhbmdlIGFuIEVtcHR5UmFuZ2UKKyAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHRpbmcgU3RyaW5nCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QXQoU3RyaW5nIHRleHQsIEVtcHR5UmFuZ2UgcmFuZ2UpIHsKKyAgICAgICAgcmV0dXJuICIiOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN1cHBvcnQgdGhlIHJhbmdlIHN1YnNjcmlwdCBvcGVyYXRvciBmb3IgU3RyaW5nCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGV4dCAgYSBTdHJpbmcKKyAgICAgKiBAcGFyYW0gcmFuZ2UgYSBSYW5nZQorICAgICAqIEByZXR1cm4gYSBzdWJzdHJpbmcgY29ycmVzcG9uZGluZyB0byB0aGUgUmFuZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBdChTdHJpbmcgdGV4dCwgUmFuZ2UgcmFuZ2UpIHsKKyAgICAgICAgaW50IGZyb20gPSBub3JtYWxpc2VJbmRleChEZWZhdWx0VHlwZVRyYW5zZm9ybWF0aW9uLmludFVuYm94KHJhbmdlLmdldEZyb20oKSksIHRleHQubGVuZ3RoKCkpOworICAgICAgICBpbnQgdG8gPSBub3JtYWxpc2VJbmRleChEZWZhdWx0VHlwZVRyYW5zZm9ybWF0aW9uLmludFVuYm94KHJhbmdlLmdldFRvKCkpLCB0ZXh0Lmxlbmd0aCgpKTsKKworICAgICAgICAvLyBJZiB0aGlzIGlzIGEgYmFja3dhcmRzIHJhbmdlLCByZXZlcnNlIHRoZSBhcmd1bWVudHMgdG8gc3Vic3RyaW5nLgorICAgICAgICBib29sZWFuIHJldmVyc2UgPSByYW5nZS5pc1JldmVyc2UoKTsKKyAgICAgICAgaWYgKGZyb20gPiB0bykgeworICAgICAgICAgICAgaW50IHRtcCA9IHRvOworICAgICAgICAgICAgdG8gPSBmcm9tOworICAgICAgICAgICAgZnJvbSA9IHRtcDsKKyAgICAgICAgICAgIHJldmVyc2UgPSAhcmV2ZXJzZTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBhbnN3ZXIgPSB0ZXh0LnN1YnN0cmluZyhmcm9tLCB0byArIDEpOworICAgICAgICBpZiAocmV2ZXJzZSkgeworICAgICAgICAgICAgYW5zd2VyID0gcmV2ZXJzZShhbnN3ZXIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhbnN3ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBzdHJpbmcgd2hpY2ggaXMgdGhlIHJldmVyc2UgKGJhY2t3YXJkcykgb2YgdGhpcyBzdHJpbmcKKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmIGEgU3RyaW5nCisgICAgICogQHJldHVybiBhIG5ldyBzdHJpbmcgd2l0aCBhbGwgdGhlIGNoYXJhY3RlcnMgcmV2ZXJzZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmV2ZXJzZShTdHJpbmcgc2VsZikgeworICAgICAgICBpbnQgc2l6ZSA9IHNlbGYubGVuZ3RoKCk7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHNpemUpOworICAgICAgICBmb3IgKGludCBpID0gc2l6ZSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKHNlbGYuY2hhckF0KGkpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJhbnNmb3JtcyBhIFN0cmluZyByZXByZXNlbnRpbmcgYSBVUkwgaW50byBhIFVSTCBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiB0aGUgU3RyaW5nIHJlcHJlc2VudGluZyBhIFVSTAorICAgICAqIEByZXR1cm4gYSBVUkwKKyAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlIFVSTCBpcyBub3Qgd2VsbCBmb3JtZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBVUkwgdG9VUkwoU3RyaW5nIHNlbGYpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IFVSTChzZWxmKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmFuc2Zvcm1zIGEgU3RyaW5nIHJlcHJlc2VudGluZyBhIFVSSSBpbnRvIGEgVVJJIG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmIHRoZSBTdHJpbmcgcmVwcmVzZW50aW5nIGEgVVJJCisgICAgICogQHJldHVybiBhIFVSSQorICAgICAqIEB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIGlzIHRocm93biBpZiB0aGUgVVJJIGlzIG5vdCB3ZWxsIGZvcm1lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFVSSSB0b1VSSShTdHJpbmcgc2VsZikgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgVVJJKHNlbGYpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFR1cm5zIGEgU3RyaW5nIGludG8gYSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgYSBTdHJpbmcgdG8gY29udmVydCBpbnRvIGEgcmVndWxhciBleHByZXNzaW9uCisgICAgICogQHJldHVybiB0aGUgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFBhdHRlcm4gYml0d2lzZU5lZ2F0ZShTdHJpbmcgc2VsZikgeworICAgICAgICByZXR1cm4gUGF0dGVybi5jb21waWxlKHNlbGYpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcGxhY2VzIGFsbCBvY2N1cnJlbmNpZXMgb2YgYSBjYXB0dXJlZCBncm91cCBieSB0aGUgcmVzdWx0IG9mIGEgY2xvc3VyZSBvbiB0aGF0IHRleHQuCisgICAgICogPHAvPgorICAgICAqIDxwPiBGb3IgZXhhbXBsZXMsCisgICAgICogPHByZT4KKyAgICAgKiAgICAgYXNzZXJ0ICJGT09CQVItRk9PQkFSLSIgPT0gImZvb2Jhci1Gb29CYXItIi5yZXBsYWNlQWxsKCIoKFtmRl1bb09dezJ9KVtiQl1hcikiLCB7IE9iamVjdFtdIGl0IC0+IGl0WzBdLnRvVXBwZXJDYXNlKCkgfSkKKyAgICAgKiA8cC8+CisgICAgICogICAgIEhlcmUsCisgICAgICogICAgICAgICAgaXRbMF0gaXMgdGhlIGdsb2JhbCBzdHJpbmcgb2YgdGhlIG1hdGNoZWQgZ3JvdXAKKyAgICAgKiAgICAgICAgICBpdFsxXSBpcyB0aGUgZmlyc3Qgc3RyaW5nIGluIHRoZSBtYXRjaGVkIGdyb3VwCisgICAgICogICAgICAgICAgaXRbMl0gaXMgdGhlIHNlY29uZCBzdHJpbmcgaW4gdGhlIG1hdGNoZWQgZ3JvdXAKKyAgICAgKiA8cC8+CisgICAgICogPHAvPgorICAgICAqICAgICBhc3NlcnQgIkZPTy1GT08tIiA9PSAiZm9vYmFyLUZvb0Jhci0iLnJlcGxhY2VBbGwoIigoW2ZGXVtvT117Mn0pW2JCXWFyKSIsIHsgeCwgeSwgeiAtPiB6LnRvVXBwZXJDYXNlKCkgfSkKKyAgICAgKiA8cC8+CisgICAgICogICAgIEhlcmUsCisgICAgICogICAgICAgICAgeCBpcyB0aGUgZ2xvYmFsIHN0cmluZyBvZiB0aGUgbWF0Y2hlZCBncm91cAorICAgICAqICAgICAgICAgIHkgaXMgdGhlIGZpcnN0IHN0cmluZyBpbiB0aGUgbWF0Y2hlZCBncm91cAorICAgICAqICAgICAgICAgIHogaXMgdGhlIHNlY29uZCBzdHJpbmcgaW4gdGhlIG1hdGNoZWQgZ3JvdXAKKyAgICAgKiA8L3ByZT4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmICAgIGEgU3RyaW5nCisgICAgICogQHBhcmFtIHJlZ2V4ICAgdGhlIGNhcHR1cmluZyByZWdleAorICAgICAqIEBwYXJhbSBjbG9zdXJlIHRoZSBjbG9zdXJlIHRvIGFwcGx5IG9uIGVhY2ggY2FwdHVyZWQgZ3JvdXAKKyAgICAgKiBAcmV0dXJuIGEgU3RyaW5nIHdpdGggcmVwbGFjZWQgY29udGVudAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcGxhY2VBbGwoU3RyaW5nIHNlbGYsIFN0cmluZyByZWdleCwgQ2xvc3VyZSBjbG9zdXJlKSB7CisgICAgICAgIE1hdGNoZXIgbWF0Y2hlciA9IFBhdHRlcm4uY29tcGlsZShyZWdleCkubWF0Y2hlcihzZWxmKTsKKyAgICAgICAgaWYgKG1hdGNoZXIuZmluZCgpKSB7CisgICAgICAgICAgICBtYXRjaGVyLnJlc2V0KCk7CisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICB3aGlsZSAobWF0Y2hlci5maW5kKCkpIHsKKyAgICAgICAgICAgICAgICBpbnQgY291bnQgPSBtYXRjaGVyLmdyb3VwQ291bnQoKTsKKyAgICAgICAgICAgICAgICBMaXN0IGdyb3VwcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGdyb3Vwcy5hZGQobWF0Y2hlci5ncm91cChpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1hdGNoZXIuYXBwZW5kUmVwbGFjZW1lbnQoc2IsIFN0cmluZy52YWx1ZU9mKGNsb3N1cmUuY2FsbChncm91cHMudG9BcnJheSgpKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2hlci5hcHBlbmRUYWlsKHNiKTsKKyAgICAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHNlbGY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0UGFkZGluZyhTdHJpbmcgcGFkZGluZywgaW50IGxlbmd0aCkgeworICAgICAgICBpZiAocGFkZGluZy5sZW5ndGgoKSA8IGxlbmd0aCkgeworICAgICAgICAgICAgcmV0dXJuIG11bHRpcGx5KHBhZGRpbmcsIG5ldyBJbnRlZ2VyKGxlbmd0aCAvIHBhZGRpbmcubGVuZ3RoKCkgKyAxKSkuc3Vic3RyaW5nKDAsIGxlbmd0aCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gcGFkZGluZy5zdWJzdHJpbmcoMCwgbGVuZ3RoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFBhZCBhIFN0cmluZyB3aXRoIHRoZSBjaGFyYWN0ZXJzIGFwcGVuZGVkIHRvIHRoZSBsZWZ0CisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgICAgICAgICBhIFN0cmluZyBvYmplY3QKKyAgICAgKiBAcGFyYW0gbnVtYmVyT2ZDaGFycyB0aGUgdG90YWwgbnVtYmVyIG9mIGNoYXJhY3RlcnMKKyAgICAgKiBAcGFyYW0gcGFkZGluZyAgICAgICB0aGUgY2hhcmF0ZXJzIHVzZWQgZm9yIHBhZGRpbmcKKyAgICAgKiBAcmV0dXJuIHRoZSBTdHJpbmcgcGFkZGVkIHRvIHRoZSBsZWZ0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcGFkTGVmdChTdHJpbmcgc2VsZiwgTnVtYmVyIG51bWJlck9mQ2hhcnMsIFN0cmluZyBwYWRkaW5nKSB7CisgICAgICAgIGludCBudW1DaGFycyA9IG51bWJlck9mQ2hhcnMuaW50VmFsdWUoKTsKKyAgICAgICAgaWYgKG51bUNoYXJzIDw9IHNlbGYubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBzZWxmOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGdldFBhZGRpbmcocGFkZGluZywgbnVtQ2hhcnMgLSBzZWxmLmxlbmd0aCgpKSArIHNlbGY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYWQgYSBTdHJpbmcgd2l0aCB0aGUgc3BhY2VzIGFwcGVuZGVkIHRvIHRoZSBsZWZ0CisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgICAgICAgICBhIFN0cmluZyBvYmplY3QKKyAgICAgKiBAcGFyYW0gbnVtYmVyT2ZDaGFycyB0aGUgdG90YWwgbnVtYmVyIG9mIGNoYXJhY3RlcnMKKyAgICAgKiBAcmV0dXJuIHRoZSBTdHJpbmcgcGFkZGVkIHRvIHRoZSBsZWZ0CisgICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBwYWRMZWZ0KFN0cmluZyBzZWxmLCBOdW1iZXIgbnVtYmVyT2ZDaGFycykgeworICAgICAgICByZXR1cm4gcGFkTGVmdChzZWxmLCBudW1iZXJPZkNoYXJzLCAiICIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhZCBhIFN0cmluZyB3aXRoIHRoZSBjaGFyYWN0ZXJzIGFwcGVuZGVkIHRvIHRoZSByaWdodAorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgICAgICAgICAgYSBTdHJpbmcgb2JqZWN0CisgICAgICogQHBhcmFtIG51bWJlck9mQ2hhcnMgdGhlIHRvdGFsIG51bWJlciBvZiBjaGFyYWN0ZXJzCisgICAgICogQHBhcmFtIHBhZGRpbmcgICAgICAgdGhlIGNoYXJhdGVycyB1c2VkIGZvciBwYWRkaW5nCisgICAgICogQHJldHVybiB0aGUgU3RyaW5nIHBhZGRlZCB0byB0aGUgcmlnaHQKKyAgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhZFJpZ2h0KFN0cmluZyBzZWxmLCBOdW1iZXIgbnVtYmVyT2ZDaGFycywgU3RyaW5nIHBhZGRpbmcpIHsKKyAgICAgICAgaW50IG51bUNoYXJzID0gbnVtYmVyT2ZDaGFycy5pbnRWYWx1ZSgpOworICAgICAgICBpZiAobnVtQ2hhcnMgPD0gc2VsZi5sZW5ndGgoKSkgeworICAgICAgICAgICAgcmV0dXJuIHNlbGY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gc2VsZiArIGdldFBhZGRpbmcocGFkZGluZywgbnVtQ2hhcnMgLSBzZWxmLmxlbmd0aCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFBhZCBhIFN0cmluZyB3aXRoIHRoZSBzcGFjZXMgYXBwZW5kZWQgdG8gdGhlIHJpZ2h0CisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgICAgICAgICBhIFN0cmluZyBvYmplY3QKKyAgICAgKiBAcGFyYW0gbnVtYmVyT2ZDaGFycyB0aGUgdG90YWwgbnVtYmVyIG9mIGNoYXJhY3RlcnMKKyAgICAgKiBAcmV0dXJuIHRoZSBTdHJpbmcgcGFkZGVkIHRvIHRoZSByaWdodAorICAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcGFkUmlnaHQoU3RyaW5nIHNlbGYsIE51bWJlciBudW1iZXJPZkNoYXJzKSB7CisgICAgICAgIHJldHVybiBwYWRSaWdodChzZWxmLCBudW1iZXJPZkNoYXJzLCAiICIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENlbnRlciBhIFN0cmluZyBhbmQgcGFkZCBpdCB3aXRoIHRoZSBjaGFyYWN0ZXJzIGFwcGVuZGVkIGFyb3VuZCBpdAorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgICAgICAgICAgYSBTdHJpbmcgb2JqZWN0CisgICAgICogQHBhcmFtIG51bWJlck9mQ2hhcnMgdGhlIHRvdGFsIG51bWJlciBvZiBjaGFyYWN0ZXJzCisgICAgICogQHBhcmFtIHBhZGRpbmcgICAgICAgdGhlIGNoYXJhdGVycyB1c2VkIGZvciBwYWRkaW5nCisgICAgICogQHJldHVybiB0aGUgU3RyaW5nIGNlbnRlcmVkIHdpdGggcGFkZGVkIGNoYXJhY3RlciBhcm91bmQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjZW50ZXIoU3RyaW5nIHNlbGYsIE51bWJlciBudW1iZXJPZkNoYXJzLCBTdHJpbmcgcGFkZGluZykgeworICAgICAgICBpbnQgbnVtQ2hhcnMgPSBudW1iZXJPZkNoYXJzLmludFZhbHVlKCk7CisgICAgICAgIGlmIChudW1DaGFycyA8PSBzZWxmLmxlbmd0aCgpKSB7CisgICAgICAgICAgICByZXR1cm4gc2VsZjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBjaGFyc1RvQWRkID0gbnVtQ2hhcnMgLSBzZWxmLmxlbmd0aCgpOworICAgICAgICAgICAgU3RyaW5nIHNlbWlQYWQgPSBjaGFyc1RvQWRkICUgMiA9PSAxID8KKyAgICAgICAgICAgICAgICAgICAgZ2V0UGFkZGluZyhwYWRkaW5nLCBjaGFyc1RvQWRkIC8gMiArIDEpIDoKKyAgICAgICAgICAgICAgICAgICAgZ2V0UGFkZGluZyhwYWRkaW5nLCBjaGFyc1RvQWRkIC8gMik7CisgICAgICAgICAgICBpZiAoY2hhcnNUb0FkZCAlIDIgPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VtaVBhZCArIHNlbGYgKyBzZW1pUGFkOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBzZW1pUGFkLnN1YnN0cmluZygwLCBjaGFyc1RvQWRkIC8gMikgKyBzZWxmICsgc2VtaVBhZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENlbnRlciBhIFN0cmluZyBhbmQgcGFkZCBpdCB3aXRoIHNwYWNlcyBhcHBlbmRlZCBhcm91bmQgaXQKKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmICAgICAgICAgIGEgU3RyaW5nIG9iamVjdAorICAgICAqIEBwYXJhbSBudW1iZXJPZkNoYXJzIHRoZSB0b3RhbCBudW1iZXIgb2YgY2hhcmFjdGVycworICAgICAqIEByZXR1cm4gdGhlIFN0cmluZyBjZW50ZXJlZCB3aXRoIHBhZGRlZCBjaGFyYWN0ZXIgYXJvdW5kCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY2VudGVyKFN0cmluZyBzZWxmLCBOdW1iZXIgbnVtYmVyT2ZDaGFycykgeworICAgICAgICByZXR1cm4gY2VudGVyKHNlbGYsIG51bWJlck9mQ2hhcnMsICIgIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3VwcG9ydCB0aGUgc3Vic2NyaXB0IG9wZXJhdG9yLCBlLmcuIG1hdGNoZXJbaW5kZXhdLCBmb3IgYSByZWdleCBNYXRjaGVyLgorICAgICAqIDxwLz4KKyAgICAgKiBGb3IgYW4gZXhhbXBsZSB1c2luZyBubyBncm91cCBtYXRjaCwgPGNvZGU+PHByZT4KKyAgICAgKiAgICBkZWYgcCA9IC9hYltkfGZdLworICAgICAqICAgIGRlZiBtID0gImFiY2FiZGFiZWFiZiIgPX4gcAorICAgICAqICAgIGZvciAoaSBpbiAwLi48bS5jb3VudCkgeworICAgICAqICAgICAgICBwcmludGxuKCAibS5ncm91cENvdW50KCkgPSAiICsgbS5ncm91cENvdW50KCkpCisgICAgICogICAgICAgIHByaW50bG4oICIgICIgKyBpICsgIjogIiArIG1baV0gKSAgIC8vIG1baV0gaXMgYSBTdHJpbmcKKyAgICAgKiAgICB9CisgICAgICogPC9wcmU+PC9jb2RlPgorICAgICAqIDxwLz4KKyAgICAgKiBGb3IgYW4gZXhhbXBsZSB1c2luZyBncm91cCBtYXRjaGVzLCA8Y29kZT48cHJlPgorICAgICAqICAgIGRlZiBwID0gLyg/OmFiKFtjfGR8ZXxmXSkpLworICAgICAqICAgIGRlZiBtID0gImFiY2FiZGFiZWFiZiIgPX4gcAorICAgICAqICAgIGZvciAoaSBpbiAwLi48bS5jb3VudCkgeworICAgICAqICAgICAgICBwcmludGxuKCAibS5ncm91cENvdW50KCkgPSAiICsgbS5ncm91cENvdW50KCkpCisgICAgICogICAgICAgIHByaW50bG4oICIgICIgKyBpICsgIjogIiArIG1baV0gKSAgIC8vIG1baV0gaXMgYSBMaXN0CisgICAgICogICAgfQorICAgICAqIDwvcHJlPjwvY29kZT4KKyAgICAgKiA8cC8+CisgICAgICogRm9yIGFub3RoZXIgZXhhbXBsZSB1c2luZyBncm91cCBtYXRjaGVzLCA8Y29kZT48cHJlPgorICAgICAqICAgIGRlZiBtID0gImFiY2FiZGFiZWFiZmFieHl6YWJ4IiA9fiAvKD86YWIoW2R8eC16XSspKS8KKyAgICAgKiAgICBtLmNvdW50LnRpbWVzIHsKKyAgICAgKiAgICAgICAgcHJpbnRsbiggIm0uZ3JvdXBDb3VudCgpID0gIiArIG0uZ3JvdXBDb3VudCgpKQorICAgICAqICAgICAgICBwcmludGxuKCAiICAiICsgaXQgKyAiOiAiICsgbVtpdF0gKSAgIC8vIG1baXRdIGlzIGEgTGlzdAorICAgICAqICAgIH0KKyAgICAgKiA8L3ByZT48L2NvZGU+CisgICAgICoKKyAgICAgKiBAcGFyYW0gbWF0Y2hlciBhIE1hdGNoZXIKKyAgICAgKiBAcGFyYW0gaWR4ICAgICBhbiBpbmRleAorICAgICAqIEByZXR1cm4gb2JqZWN0IGEgbWF0Y2hlZCBTdHJpbmcgaWYgbm8gZ3JvdXBzIG1hdGNoZWQsIGxpc3Qgb2YgbWF0Y2hlZCBncm91cHMgb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEF0KE1hdGNoZXIgbWF0Y2hlciwgaW50IGlkeCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IGNvdW50ID0gZ2V0Q291bnQobWF0Y2hlcik7CisgICAgICAgICAgICBpZiAoaWR4IDwgLWNvdW50IHx8IGlkeCA+PSBjb3VudCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2UgIiArICgtY291bnQpICsgIi4uIiArIChjb3VudCAtIDEpICsgIiAoaW5kZXggPSAiICsgaWR4ICsgIikiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlkeCA9IG5vcm1hbGlzZUluZGV4KGlkeCwgY291bnQpOworICAgICAgICAgICAgbWF0Y2hlci5yZXNldCgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gaWR4OyBpKyspIHsKKyAgICAgICAgICAgICAgICBtYXRjaGVyLmZpbmQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGhhc0dyb3VwKG1hdGNoZXIpKSB7CisgICAgICAgICAgICAgICAgLy8gYXJlIHdlIHVzaW5nIGdyb3Vwcz8KKyAgICAgICAgICAgICAgICAvLyB5ZXMsIHNvIHJldHVybiB0aGUgc3BlY2lmaWVkIGdyb3VwIGFzIGxpc3QKKyAgICAgICAgICAgICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KG1hdGNoZXIuZ3JvdXBDb3VudCgpKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSBtYXRjaGVyLmdyb3VwQ291bnQoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKG1hdGNoZXIuZ3JvdXAoaSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbGlzdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gbm90IHVzaW5nIGdyb3Vwcywgc28gcmV0dXJuIHRoZSBudGgKKyAgICAgICAgICAgICAgICAvLyBvY2N1cnJlbmNlIG9mIHRoZSBwYXR0ZXJuCisgICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXIuZ3JvdXAoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcG9zaXRpb24gb2YgdGhlIGdpdmVuIE1hdGNoZXIgdG8gdGhlIGdpdmVuIGluZGV4LgorICAgICAqCisgICAgICogQHBhcmFtIG1hdGNoZXIgYSBNYXRjaGVyCisgICAgICogQHBhcmFtIGlkeCAgICAgdGhlIGluZGV4IG51bWJlcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJbmRleChNYXRjaGVyIG1hdGNoZXIsIGludCBpZHgpIHsKKyAgICAgICAgaW50IGNvdW50ID0gZ2V0Q291bnQobWF0Y2hlcik7CisgICAgICAgIGlmIChpZHggPCAtY291bnQgfHwgaWR4ID49IGNvdW50KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiaW5kZXggaXMgb3V0IG9mIHJhbmdlICIgKyAoLWNvdW50KSArICIuLiIgKyAoY291bnQgLSAxKSArICIgKGluZGV4ID0gIiArIGlkeCArICIpIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlkeCA9PSAwKSB7CisgICAgICAgICAgICBtYXRjaGVyLnJlc2V0KCk7CisgICAgICAgIH0gZWxzZSBpZiAoaWR4ID4gMCkgeworICAgICAgICAgICAgbWF0Y2hlci5yZXNldCgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpZHg7IGkrKykgeworICAgICAgICAgICAgICAgIG1hdGNoZXIuZmluZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGlkeCA8IDApIHsKKyAgICAgICAgICAgIG1hdGNoZXIucmVzZXQoKTsKKyAgICAgICAgICAgIGlkeCArPSBnZXRDb3VudChtYXRjaGVyKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaWR4OyBpKyspIHsKKyAgICAgICAgICAgICAgICBtYXRjaGVyLmZpbmQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgdGhlIG51bWJlciBvZiBTdHJpbmdzIG1hdGNoZWQgdG8gdGhlIGdpdmVuIE1hdGNoZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWF0Y2hlciBhIE1hdGNoZXIKKyAgICAgKiBAcmV0dXJuIGludCAgdGhlIG51bWJlciBvZiBTdHJpbmdzIG1hdGNoZWQgdG8gdGhlIGdpdmVuIG1hdGNoZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0Q291bnQoTWF0Y2hlciBtYXRjaGVyKSB7CisgICAgICAgIGludCBjb3VudGVyID0gMDsKKyAgICAgICAgbWF0Y2hlci5yZXNldCgpOworICAgICAgICB3aGlsZSAobWF0Y2hlci5maW5kKCkpIHsKKyAgICAgICAgICAgIGNvdW50ZXIrKzsKKyAgICAgICAgfQorICAgICAgICBtYXRjaGVyLnJlc2V0KCk7CisgICAgICAgIHJldHVybiBjb3VudGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIHdoZXRoZXIgYSBNYXRjaGVyIGNvbnRhaW5zIGEgZ3JvdXAgb3Igbm90LgorICAgICAqCisgICAgICogQHBhcmFtIG1hdGNoZXIgYSBNYXRjaGVyCisgICAgICogQHJldHVybiBib29sZWFuICA8Y29kZT50cnVlPC9jb2RlPiBpZiBtYXRjaGVyIGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBncm91cC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzR3JvdXAoTWF0Y2hlciBtYXRjaGVyKSB7CisgICAgICAgIHJldHVybiBtYXRjaGVyLmdyb3VwQ291bnQoKSA+IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3VwcG9ydCB0aGUgcmFuZ2Ugc3Vic2NyaXB0IG9wZXJhdG9yIGZvciBhIExpc3QKKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmICBhIExpc3QKKyAgICAgKiBAcGFyYW0gcmFuZ2UgYSBSYW5nZSBpbmRpY2F0aW5nIHRoZSBpdGVtcyB0byBnZXQKKyAgICAgKiBAcmV0dXJuIGEgc3VibGlzdCBiYXNlZCBvbiByYW5nZSBib3JkZXJzIG9yIGEgbmV3IGxpc3QgaWYgcmFuZ2UgaXMgcmV2ZXJzZWQKKyAgICAgKiBAc2VlIGphdmEudXRpbC5MaXN0I3N1Ykxpc3QoaW50LGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0QXQoTGlzdCBzZWxmLCBJbnRSYW5nZSByYW5nZSkgeworICAgICAgICBSYW5nZUluZm8gaW5mbyA9IHN1Ykxpc3RCb3JkZXJzKHNlbGYuc2l6ZSgpLCByYW5nZSk7CisgICAgICAgIExpc3QgYW5zd2VyID0gc2VsZi5zdWJMaXN0KGluZm8uZnJvbSwgaW5mby50byk7ICAvLyBzdWJsaXN0IGlzIGFsd2F5cyBleGNsdXNpdmUsIGJ1dCBSYW5nZXMgYXJlIG5vdAorICAgICAgICBpZiAoaW5mby5yZXZlcnNlKSB7CisgICAgICAgICAgICBhbnN3ZXIgPSByZXZlcnNlKGFuc3dlcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFuc3dlcjsKKyAgICB9CisKKyAgICAvLyBoZWxwZXIgbWV0aG9kIGZvciBnZXRBdCBhbmQgcHV0QXQKKyAgICBwcm90ZWN0ZWQgc3RhdGljIFJhbmdlSW5mbyBzdWJMaXN0Qm9yZGVycyhpbnQgc2l6ZSwgSW50UmFuZ2UgcmFuZ2UpIHsKKyAgICAgICAgaW50IGZyb20gPSBub3JtYWxpc2VJbmRleChEZWZhdWx0VHlwZVRyYW5zZm9ybWF0aW9uLmludFVuYm94KHJhbmdlLmdldEZyb20oKSksIHNpemUpOworICAgICAgICBpbnQgdG8gPSBub3JtYWxpc2VJbmRleChEZWZhdWx0VHlwZVRyYW5zZm9ybWF0aW9uLmludFVuYm94KHJhbmdlLmdldFRvKCkpLCBzaXplKTsKKyAgICAgICAgYm9vbGVhbiByZXZlcnNlID0gcmFuZ2UuaXNSZXZlcnNlKCk7CisgICAgICAgIGlmIChmcm9tID4gdG8pIHsgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXBwb3J0IGxpc3RbMS4uLTFdCisgICAgICAgICAgICBpbnQgdG1wID0gdG87CisgICAgICAgICAgICB0byA9IGZyb207CisgICAgICAgICAgICBmcm9tID0gdG1wOworICAgICAgICAgICAgcmV2ZXJzZSA9ICFyZXZlcnNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgUmFuZ2VJbmZvKGZyb20sIHRvICsgMSwgcmV2ZXJzZSk7CisgICAgfQorCisgICAgLy8gaGVscGVyIG1ldGhvZCBmb3IgZ2V0QXQgYW5kIHB1dEF0CisgICAgcHJvdGVjdGVkIHN0YXRpYyBSYW5nZUluZm8gc3ViTGlzdEJvcmRlcnMoaW50IHNpemUsIEVtcHR5UmFuZ2UgcmFuZ2UpIHsKKyAgICAgICAgaW50IGZyb20gPSBub3JtYWxpc2VJbmRleChEZWZhdWx0VHlwZVRyYW5zZm9ybWF0aW9uLmludFVuYm94KHJhbmdlLmdldEZyb20oKSksIHNpemUpOworICAgICAgICByZXR1cm4gbmV3IFJhbmdlSW5mbyhmcm9tLCBmcm9tLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWxsb3dzIGEgTGlzdCB0byBiZSB1c2VkIGFzIHRoZSBpbmRpY2VzIHRvIGJlIHVzZWQgb24gYSBMaXN0CisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgICBhIExpc3QKKyAgICAgKiBAcGFyYW0gaW5kaWNlcyBhIENvbGxlY3Rpb24gb2YgaW5kaWNlcworICAgICAqIEByZXR1cm4gYSBuZXcgbGlzdCBvZiB0aGUgdmFsdWVzIGF0IHRoZSBnaXZlbiBpbmRpY2VzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMaXN0IGdldEF0KExpc3Qgc2VsZiwgQ29sbGVjdGlvbiBpbmRpY2VzKSB7CisgICAgICAgIExpc3QgYW5zd2VyID0gbmV3IEFycmF5TGlzdChpbmRpY2VzLnNpemUoKSk7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGluZGljZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFJhbmdlKSB7CisgICAgICAgICAgICAgICAgYW5zd2VyLmFkZEFsbChnZXRBdChzZWxmLCAoUmFuZ2UpIHZhbHVlKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTGlzdCkgeworICAgICAgICAgICAgICAgIGFuc3dlci5hZGRBbGwoZ2V0QXQoc2VsZiwgKExpc3QpIHZhbHVlKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCBpZHggPSBEZWZhdWx0VHlwZVRyYW5zZm9ybWF0aW9uLmludFVuYm94KHZhbHVlKTsKKyAgICAgICAgICAgICAgICBhbnN3ZXIuYWRkKGdldEF0KHNlbGYsIGlkeCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBhbnN3ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWxsb3dzIGEgTGlzdCB0byBiZSB1c2VkIGFzIHRoZSBpbmRpY2VzIHRvIGJlIHVzZWQgb24gYSBMaXN0CisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgICBhbiBBcnJheSBvZiBPYmplY3RzCisgICAgICogQHBhcmFtIGluZGljZXMgYSBDb2xsZWN0aW9uIG9mIGluZGljZXMKKyAgICAgKiBAcmV0dXJuIGEgbmV3IGxpc3Qgb2YgdGhlIHZhbHVlcyBhdCB0aGUgZ2l2ZW4gaW5kaWNlcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBdChPYmplY3RbXSBzZWxmLCBDb2xsZWN0aW9uIGluZGljZXMpIHsKKyAgICAgICAgTGlzdCBhbnN3ZXIgPSBuZXcgQXJyYXlMaXN0KGluZGljZXMuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gaW5kaWNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGl0ZXIubmV4dCgpOworICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgUmFuZ2UpIHsKKyAgICAgICAgICAgICAgICBhbnN3ZXIuYWRkQWxsKGdldEF0KHNlbGYsIChSYW5nZSkgdmFsdWUpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSB7CisgICAgICAgICAgICAgICAgYW5zd2VyLmFkZEFsbChnZXRBdChzZWxmLCAoQ29sbGVjdGlvbikgdmFsdWUpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IGlkeCA9IERlZmF1bHRUeXBlVHJhbnNmb3JtYXRpb24uaW50VW5ib3godmFsdWUpOworICAgICAgICAgICAgICAgIGFuc3dlci5hZGQoZ2V0QXQoc2VsZiwgaWR4KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFuc3dlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbGxvd3MgYSBMaXN0IHRvIGJlIHVzZWQgYXMgdGhlIGluZGljZXMgdG8gYmUgdXNlZCBvbiBhIENoYXJTZXF1ZW5jZQorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgICAgYSBDaGFyU2VxdWVuY2UKKyAgICAgKiBAcGFyYW0gaW5kaWNlcyBhIENvbGxlY3Rpb24gb2YgaW5kaWNlcworICAgICAqIEByZXR1cm4gYSBTdHJpbmcgb2YgdGhlIHZhbHVlcyBhdCB0aGUgZ2l2ZW4gaW5kaWNlcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ2hhclNlcXVlbmNlIGdldEF0KENoYXJTZXF1ZW5jZSBzZWxmLCBDb2xsZWN0aW9uIGluZGljZXMpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGFuc3dlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gaW5kaWNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGl0ZXIubmV4dCgpOworICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgUmFuZ2UpIHsKKyAgICAgICAgICAgICAgICBhbnN3ZXIuYXBwZW5kKGdldEF0KHNlbGYsIChSYW5nZSkgdmFsdWUpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSB7CisgICAgICAgICAgICAgICAgYW5zd2VyLmFwcGVuZChnZXRBdChzZWxmLCAoQ29sbGVjdGlvbikgdmFsdWUpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IGlkeCA9IERlZmF1bHRUeXBlVHJhbnNmb3JtYXRpb24uaW50VW5ib3godmFsdWUpOworICAgICAgICAgICAgICAgIGFuc3dlci5hcHBlbmQoZ2V0QXQoc2VsZiwgaWR4KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFuc3dlci50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFsbG93cyBhIExpc3QgdG8gYmUgdXNlZCBhcyB0aGUgaW5kaWNlcyB0byBiZSB1c2VkIG9uIGEgU3RyaW5nCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgICBhIFN0cmluZworICAgICAqIEBwYXJhbSBpbmRpY2VzIGEgQ29sbGVjdGlvbiBvZiBpbmRpY2VzCisgICAgICogQHJldHVybiBhIFN0cmluZyBvZiB0aGUgdmFsdWVzIGF0IHRoZSBnaXZlbiBpbmRpY2VzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QXQoU3RyaW5nIHNlbGYsIENvbGxlY3Rpb24gaW5kaWNlcykgeworICAgICAgICByZXR1cm4gKFN0cmluZykgZ2V0QXQoKENoYXJTZXF1ZW5jZSkgc2VsZiwgaW5kaWNlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWxsb3dzIGEgTGlzdCB0byBiZSB1c2VkIGFzIHRoZSBpbmRpY2VzIHRvIGJlIHVzZWQgb24gYSBNYXRjaGVyCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgICBhIE1hdGNoZXIKKyAgICAgKiBAcGFyYW0gaW5kaWNlcyBhIENvbGxlY3Rpb24gb2YgaW5kaWNlcworICAgICAqIEByZXR1cm4gYSBTdHJpbmcgb2YgdGhlIHZhbHVlcyBhdCB0aGUgZ2l2ZW4gaW5kaWNlcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEF0KE1hdGNoZXIgc2VsZiwgQ29sbGVjdGlvbiBpbmRpY2VzKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBhbnN3ZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGluZGljZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFJhbmdlKSB7CisgICAgICAgICAgICAgICAgYW5zd2VyLmFwcGVuZChnZXRBdChzZWxmLCAoUmFuZ2UpIHZhbHVlKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgQ29sbGVjdGlvbikgeworICAgICAgICAgICAgICAgIGFuc3dlci5hcHBlbmQoZ2V0QXQoc2VsZiwgKENvbGxlY3Rpb24pIHZhbHVlKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCBpZHggPSBEZWZhdWx0VHlwZVRyYW5zZm9ybWF0aW9uLmludFVuYm94KHZhbHVlKTsKKyAgICAgICAgICAgICAgICBhbnN3ZXIuYXBwZW5kKGdldEF0KHNlbGYsIGlkeCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBhbnN3ZXIudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgc3ViLU1hcCBjb250YWluaW5nIHRoZSBnaXZlbiBrZXlzLiBUaGlzIG1ldGhvZCBpcyBzaW1pbGFyIHRvCisgICAgICogTGlzdC5zdWJMaXN0KCkgYnV0IHVzZXMga2V5cyByYXRoZXIgdGhhbiBpbmRleCByYW5nZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwICBhIE1hcAorICAgICAqIEBwYXJhbSBrZXlzIGEgQ29sbGVjdGlvbiBvZiBrZXlzCisgICAgICogQHJldHVybiBhIG5ldyBNYXAgY29udGFpbmluZyB0aGUgZ2l2ZW4ga2V5cworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTWFwIHN1Yk1hcChNYXAgbWFwLCBDb2xsZWN0aW9uIGtleXMpIHsKKyAgICAgICAgTWFwIGFuc3dlciA9IG5ldyBMaW5rZWRIYXNoTWFwKGtleXMuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0ga2V5cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIE9iamVjdCBrZXkgPSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIGFuc3dlci5wdXQoa2V5LCBtYXAuZ2V0KGtleSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhbnN3ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9va3MgdXAgYW4gaXRlbSBpbiBhIE1hcCBmb3IgdGhlIGdpdmVuIGtleSBhbmQgcmV0dXJucyB0aGUgdmFsdWUgLSB1bmxlc3MKKyAgICAgKiB0aGVyZSBpcyBubyBlbnRyeSBmb3IgdGhlIGdpdmVuIGtleSBpbiB3aGljaCBjYXNlIGFkZCB0aGUgZGVmYXVsdCB2YWx1ZQorICAgICAqIHRvIHRoZSBtYXAgYW5kIHJldHVybiB0aGF0LgorICAgICAqCisgICAgICogQHBhcmFtIG1hcCAgICAgICAgICBhIE1hcAorICAgICAqIEBwYXJhbSBrZXkgICAgICAgICAgdGhlIGtleSB0byBsb29rdXAgdGhlIHZhbHVlIG9mCisgICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSB0aGUgdmFsdWUgdG8gcmV0dXJuIGFuZCBhZGQgdG8gdGhlIG1hcCBmb3IgdGhpcyBrZXkgaWYKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGVudHJ5IGZvciB0aGUgZ2l2ZW4ga2V5CisgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGtleSBvciB0aGUgZGVmYXVsdCB2YWx1ZSwgYWRkZWQgdG8gdGhlIG1hcCBpZiB0aGUKKyAgICAgKiAgICAgICAgIGtleSBkaWQgbm90IGV4aXN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0KE1hcCBtYXAsIE9iamVjdCBrZXksIE9iamVjdCBkZWZhdWx0VmFsdWUpIHsKKyAgICAgICAgT2JqZWN0IGFuc3dlciA9IG1hcC5nZXQoa2V5KTsKKyAgICAgICAgaWYgKGFuc3dlciA9PSBudWxsKSB7CisgICAgICAgICAgICBhbnN3ZXIgPSBkZWZhdWx0VmFsdWU7CisgICAgICAgICAgICBtYXAucHV0KGtleSwgYW5zd2VyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYW5zd2VyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN1cHBvcnQgdGhlIHJhbmdlIHN1YnNjcmlwdCBvcGVyYXRvciBmb3IgYW4gQXJyYXkKKyAgICAgKgorICAgICAqIEBwYXJhbSBhcnJheSBhbiBBcnJheSBvZiBPYmplY3RzCisgICAgICogQHBhcmFtIHJhbmdlIGEgUmFuZ2UKKyAgICAgKiBAcmV0dXJuIGEgcmFuZ2Ugb2YgYSBsaXN0IGZyb20gdGhlIHJhbmdlJ3MgZnJvbSBpbmRleCB1cCB0byBidXQgbm90CisgICAgICogICAgICAgICBpbmNsdWRpbmcgdGhlIHJhbmdlcydzIHRvIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMaXN0IGdldEF0KE9iamVjdFtdIGFycmF5LCBSYW5nZSByYW5nZSkgeworICAgICAgICBMaXN0IGxpc3QgPSBBcnJheXMuYXNMaXN0KGFycmF5KTsKKyAgICAgICAgcmV0dXJuIGdldEF0KGxpc3QsIHJhbmdlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0QXQoT2JqZWN0W10gYXJyYXksIEludFJhbmdlIHJhbmdlKSB7CisgICAgICAgIExpc3QgbGlzdCA9IEFycmF5cy5hc0xpc3QoYXJyYXkpOworICAgICAgICByZXR1cm4gZ2V0QXQobGlzdCwgcmFuZ2UpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBdChPYmplY3RbXSBhcnJheSwgRW1wdHlSYW5nZSByYW5nZSkgeworICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdCgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBdChPYmplY3RbXSBhcnJheSwgT2JqZWN0UmFuZ2UgcmFuZ2UpIHsKKyAgICAgICAgTGlzdCBsaXN0ID0gQXJyYXlzLmFzTGlzdChhcnJheSk7CisgICAgICAgIHJldHVybiBnZXRBdChsaXN0LCByYW5nZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3VwcG9ydCB0aGUgc3Vic2NyaXB0IG9wZXJhdG9yIGZvciBhbiBBcnJheS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcnJheSBhbiBBcnJheSBvZiBPYmplY3RzCisgICAgICogQHBhcmFtIGlkeCAgIGFuIGluZGV4CisgICAgICogQHJldHVybiB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIGluZGV4CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0QXQoT2JqZWN0W10gYXJyYXksIGludCBpZHgpIHsKKyAgICAgICAgcmV0dXJuIGFycmF5W25vcm1hbGlzZUluZGV4KGlkeCwgYXJyYXkubGVuZ3RoKV07CisgICAgfQorCisgICAgLyoqCisgICAgICogU3VwcG9ydCB0aGUgc3Vic2NyaXB0IG9wZXJhdG9yIGZvciBhbiBBcnJheS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcnJheSBhbiBBcnJheSBvZiBPYmplY3RzCisgICAgICogQHBhcmFtIGlkeCAgIGFuIGluZGV4CisgICAgICogQHBhcmFtIHZhbHVlIGFuIE9iamVjdCB0byBwdXQgYXQgdGhlIGdpdmVuIGluZGV4CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHB1dEF0KE9iamVjdFtdIGFycmF5LCBpbnQgaWR4LCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSB7CisgICAgICAgICAgICBDbGFzcyBhcnJheUNvbXBvbmVudENsYXNzID0gYXJyYXkuZ2V0Q2xhc3MoKS5nZXRDb21wb25lbnRUeXBlKCk7CisKKyAgICAgICAgICAgIGlmICghYXJyYXlDb21wb25lbnRDbGFzcy5lcXVhbHModmFsdWUuZ2V0Q2xhc3MoKSkpIHsKKyAgICAgICAgICAgICAgICBPYmplY3QgbmV3VmFsID0gRGVmYXVsdFR5cGVUcmFuc2Zvcm1hdGlvbi5jYXN0VG9UeXBlKHZhbHVlLCBhcnJheUNvbXBvbmVudENsYXNzKTsKKyAgICAgICAgICAgICAgICBhcnJheVtub3JtYWxpc2VJbmRleChpZHgsIGFycmF5Lmxlbmd0aCldID0gbmV3VmFsOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhcnJheVtub3JtYWxpc2VJbmRleChpZHgsIGFycmF5Lmxlbmd0aCldID0gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWxsb3dzIGNvbnZlcnNpb24gb2YgYXJyYXlzIGludG8gYSBtdXRhYmxlIExpc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXJyYXkgYW4gQXJyYXkgb2YgT2JqZWN0cworICAgICAqIEByZXR1cm4gdGhlIGFycmF5IGFzIGEgTGlzdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlzdCB0b0xpc3QoT2JqZWN0W10gYXJyYXkpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdChhcnJheSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN1cHBvcnQgdGhlIHN1YnNjcmlwdCBvcGVyYXRvciBmb3IgYSBMaXN0LgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgYSBMaXN0CisgICAgICogQHBhcmFtIGlkeCAgYW4gaW5kZXgKKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gaW5kZXgKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRBdChMaXN0IHNlbGYsIGludCBpZHgpIHsKKyAgICAgICAgaW50IHNpemUgPSBzZWxmLnNpemUoKTsKKyAgICAgICAgaW50IGkgPSBub3JtYWxpc2VJbmRleChpZHgsIHNpemUpOworICAgICAgICBpZiAoaSA8IHNpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmdldChpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBoZWxwZXIgbWV0aG9kIHRvIGFsbG93IGxpc3RzIHRvIHdvcmsgd2l0aCBzdWJzY3JpcHQgb3BlcmF0b3JzLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgIGEgTGlzdAorICAgICAqIEBwYXJhbSBpZHggICBhbiBpbmRleAorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gcHV0IGF0IHRoZSBnaXZlbiBpbmRleAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwdXRBdChMaXN0IHNlbGYsIGludCBpZHgsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBpbnQgc2l6ZSA9IHNlbGYuc2l6ZSgpOworICAgICAgICBpZHggPSBub3JtYWxpc2VJbmRleChpZHgsIHNpemUpOworICAgICAgICBpZiAoaWR4IDwgc2l6ZSkgeworICAgICAgICAgICAgc2VsZi5zZXQoaWR4LCB2YWx1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3aGlsZSAoc2l6ZSA8IGlkeCkgeworICAgICAgICAgICAgICAgIHNlbGYuYWRkKHNpemUrKywgbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZWxmLmFkZChpZHgsIHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogU3VwcG9ydCB0aGUgcmFuZ2Ugc3Vic2NyaXB0IG9wZXJhdG9yIGZvciBTdHJpbmdCdWZmZXIuICBJbmRleCB2YWx1ZXMgYXJlCisgICAgICogdHJlYXRlZCBhcyBjaGFyYWN0ZXJzIHdpdGhpbiB0aGUgYnVmZmVyLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgIGEgU3RyaW5nQnVmZmVyCisgICAgICogQHBhcmFtIHJhbmdlIGEgUmFuZ2UKKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG9iamVjdCB0aGF0J3MgdG9TdHJpbmcoKSB3aWxsIGJlIGluc2VydGVkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHB1dEF0KFN0cmluZ0J1ZmZlciBzZWxmLCBJbnRSYW5nZSByYW5nZSwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIFJhbmdlSW5mbyBpbmZvID0gc3ViTGlzdEJvcmRlcnMoc2VsZi5sZW5ndGgoKSwgcmFuZ2UpOworICAgICAgICBzZWxmLnJlcGxhY2UoaW5mby5mcm9tLCBpbmZvLnRvLCB2YWx1ZS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdXBwb3J0IHRoZSByYW5nZSBzdWJzY3JpcHQgb3BlcmF0b3IgZm9yIFN0cmluZ0J1ZmZlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmICBhIFN0cmluZ0J1ZmZlcgorICAgICAqIEBwYXJhbSByYW5nZSBhIFJhbmdlCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSBvYmplY3QgdGhhdCdzIHRvU3RyaW5nKCkgd2lsbCBiZSBpbnNlcnRlZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwdXRBdChTdHJpbmdCdWZmZXIgc2VsZiwgRW1wdHlSYW5nZSByYW5nZSwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIFJhbmdlSW5mbyBpbmZvID0gc3ViTGlzdEJvcmRlcnMoc2VsZi5sZW5ndGgoKSwgcmFuZ2UpOworICAgICAgICBzZWxmLnJlcGxhY2UoaW5mby5mcm9tLCBpbmZvLnRvLCB2YWx1ZS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGhlbHBlciBtZXRob2QgdG8gYWxsb3cgbGlzdHMgdG8gd29yayB3aXRoIHN1YnNjcmlwdCBvcGVyYXRvcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgYSBMaXN0CisgICAgICogQHBhcmFtIHJhbmdlIHRoZSBzdWJzZXQgb2YgdGhlIGxpc3QgdG8gc2V0CisgICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZXMgdG8gcHV0IGF0IHRoZSBnaXZlbiBzdWJsaXN0IG9yIGEgQ29sbGVjdGlvbiBvZiB2YWx1ZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHV0QXQoTGlzdCBzZWxmLCBFbXB0eVJhbmdlIHJhbmdlLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgUmFuZ2VJbmZvIGluZm8gPSBzdWJMaXN0Qm9yZGVycyhzZWxmLnNpemUoKSwgcmFuZ2UpOworICAgICAgICBMaXN0IHN1Ymxpc3QgPSBzZWxmLnN1Ykxpc3QoaW5mby5mcm9tLCBpbmZvLnRvKTsKKyAgICAgICAgc3VibGlzdC5jbGVhcigpOworICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSB7CisgICAgICAgICAgICBDb2xsZWN0aW9uIGNvbCA9IChDb2xsZWN0aW9uKSB2YWx1ZTsKKyAgICAgICAgICAgIGlmIChjb2wuaXNFbXB0eSgpKSByZXR1cm47CisgICAgICAgICAgICBzdWJsaXN0LmFkZEFsbChjb2wpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3VibGlzdC5hZGQodmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTGlzdCByZXNpemVMaXN0V2l0aFJhbmdlQW5kR2V0U3VibGlzdChMaXN0IHNlbGYsIEludFJhbmdlIHJhbmdlKSB7CisgICAgICAgIFJhbmdlSW5mbyBpbmZvID0gc3ViTGlzdEJvcmRlcnMoc2VsZi5zaXplKCksIHJhbmdlKTsKKyAgICAgICAgaW50IHNpemUgPSBzZWxmLnNpemUoKTsKKyAgICAgICAgaWYgKGluZm8udG8gPj0gc2l6ZSkgeworICAgICAgICAgICAgd2hpbGUgKHNpemUgPCBpbmZvLnRvKSB7CisgICAgICAgICAgICAgICAgc2VsZi5hZGQoc2l6ZSsrLCBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBMaXN0IHN1Ymxpc3QgPSBzZWxmLnN1Ykxpc3QoaW5mby5mcm9tLCBpbmZvLnRvKTsKKyAgICAgICAgc3VibGlzdC5jbGVhcigpOworICAgICAgICByZXR1cm4gc3VibGlzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMaXN0IHN1YnNjcmlwdCBhc3NpZ25tZW50IG9wZXJhdG9yIHdoZW4gZ2l2ZW4gYSByYW5nZSBhcyB0aGUgaW5kZXggYW5kCisgICAgICogdGhlIGFzc2lnbm1lbnQgb3BlcmFuZCBpcyBhIGNvbGxlY3Rpb24uCisgICAgICogRXhhbXBsZTogPGNvZGU+bXlMaXN0WzMuLjVdID0gYW5vdGhlckxpc3Q8L2NvZGU+LiAgSXRlbXMgaW4gdGhlIGdpdmVuCisgICAgICogcmFuZ2UgYXJlIHJlbGFjZWQgd2l0aCBpdGVtcyBmcm9tIHRoZSBjb2xsZWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgIGEgTGlzdAorICAgICAqIEBwYXJhbSByYW5nZSB0aGUgc3Vic2V0IG9mIHRoZSBsaXN0IHRvIHNldAorICAgICAqIEBwYXJhbSBjb2wgICB0aGUgY29sbGVjdGlvbiBvZiB2YWx1ZXMgdG8gcHV0IGF0IHRoZSBnaXZlbiBzdWJsaXN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHB1dEF0KExpc3Qgc2VsZiwgSW50UmFuZ2UgcmFuZ2UsIENvbGxlY3Rpb24gY29sKSB7CisgICAgICAgIExpc3Qgc3VibGlzdCA9IHJlc2l6ZUxpc3RXaXRoUmFuZ2VBbmRHZXRTdWJsaXN0KHNlbGYsIHJhbmdlKTsKKyAgICAgICAgaWYgKGNvbC5pc0VtcHR5KCkpIHJldHVybjsKKyAgICAgICAgc3VibGlzdC5hZGRBbGwoY29sKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMaXN0IHN1YnNjcmlwdCBhc3NpZ25tZW50IG9wZXJhdG9yIHdoZW4gZ2l2ZW4gYSByYW5nZSBhcyB0aGUgaW5kZXguCisgICAgICogRXhhbXBsZTogPGNvZGU+bXlMaXN0WzMuLjVdID0gbmV3SXRlbTwvY29kZT4uICBJdGVtcyBpbiB0aGUgZ2l2ZW4KKyAgICAgKiByYW5nZSBhcmUgcmVsYWNlZCB3aXRoIHRoZSBvcGVyYW5kLiAgVGhlIDxjb2RlPnZhbHVlPC9jb2RlPiBvcGVyYW5kIGlzCisgICAgICogYWx3YXlzIHRyZWF0ZWQgYXMgYSBzaW5nbGUgdmFsdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgYSBMaXN0CisgICAgICogQHBhcmFtIHJhbmdlIHRoZSBzdWJzZXQgb2YgdGhlIGxpc3QgdG8gc2V0CisgICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBwdXQgYXQgdGhlIGdpdmVuIHN1Ymxpc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHV0QXQoTGlzdCBzZWxmLCBJbnRSYW5nZSByYW5nZSwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIExpc3Qgc3VibGlzdCA9IHJlc2l6ZUxpc3RXaXRoUmFuZ2VBbmRHZXRTdWJsaXN0KHNlbGYsIHJhbmdlKTsKKyAgICAgICAgc3VibGlzdC5hZGQodmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgaGVscGVyIG1ldGhvZCB0byBhbGxvdyBsaXN0cyB0byB3b3JrIHdpdGggc3Vic2NyaXB0IG9wZXJhdG9ycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmICAgYSBMaXN0CisgICAgICogQHBhcmFtIHNwbGljZSB0aGUgc3Vic2V0IG9mIHRoZSBsaXN0IHRvIHNldAorICAgICAqIEBwYXJhbSB2YWx1ZXMgdGhlIHZhbHVlIHRvIHB1dCBhdCB0aGUgZ2l2ZW4gc3VibGlzdAorICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2Ugd2l0aCBwdXRBdChMaXN0IHNlbGYsIFJhbmdlIHJhbmdlLCBMaXN0IHZhbHVlKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwdXRBdChMaXN0IHNlbGYsIExpc3Qgc3BsaWNlLCBMaXN0IHZhbHVlcykgeworICAgICAgICBMaXN0IHN1Ymxpc3QgPSBnZXRTdWJMaXN0KHNlbGYsIHNwbGljZSk7CisgICAgICAgIHN1Ymxpc3QuY2xlYXIoKTsKKyAgICAgICAgc3VibGlzdC5hZGRBbGwodmFsdWVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGhlbHBlciBtZXRob2QgdG8gYWxsb3cgbGlzdHMgdG8gd29yayB3aXRoIHN1YnNjcmlwdCBvcGVyYXRvcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgIGEgTGlzdAorICAgICAqIEBwYXJhbSBzcGxpY2UgdGhlIHN1YnNldCBvZiB0aGUgbGlzdCB0byBzZXQKKyAgICAgKiBAcGFyYW0gdmFsdWUgIHRoZSB2YWx1ZSB0byBwdXQgYXQgdGhlIGdpdmVuIHN1Ymxpc3QKKyAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlIHdpdGggcHV0QXQoTGlzdCBzZWxmLCBSYW5nZSByYW5nZSwgT2JqZWN0IHZhbHVlKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwdXRBdChMaXN0IHNlbGYsIExpc3Qgc3BsaWNlLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgTGlzdCBzdWJsaXN0ID0gZ2V0U3ViTGlzdChzZWxmLCBzcGxpY2UpOworICAgICAgICBzdWJsaXN0LmNsZWFyKCk7CisgICAgICAgIHN1Ymxpc3QuYWRkKHZhbHVlKTsKKyAgICB9CisKKyAgICAvLyBoZWxwZXIgbWV0aG9kIGZvciBwdXRBdChTcGxpY2UpCisgICAgLy8gdG9kbzogcmVtb3ZlIGFmdGVyIHB1dEF0KFNwbGljZSkgZ2V0cyBkZWxldGVkCisgICAgcHJvdGVjdGVkIHN0YXRpYyBMaXN0IGdldFN1Ykxpc3QoTGlzdCBzZWxmLCBMaXN0IHNwbGljZSkgeworICAgICAgICBpbnQgbGVmdCAvKiA9IDAgKi87CisgICAgICAgIGludCByaWdodCA9IDA7CisgICAgICAgIGJvb2xlYW4gZW1wdHlSYW5nZSA9IGZhbHNlOworICAgICAgICBpZiAoc3BsaWNlLnNpemUoKSA9PSAyKSB7CisgICAgICAgICAgICBsZWZ0ID0gRGVmYXVsdFR5cGVUcmFuc2Zvcm1hdGlvbi5pbnRVbmJveChzcGxpY2UuZ2V0KDApKTsKKyAgICAgICAgICAgIHJpZ2h0ID0gRGVmYXVsdFR5cGVUcmFuc2Zvcm1hdGlvbi5pbnRVbmJveChzcGxpY2UuZ2V0KDEpKTsKKyAgICAgICAgfSBlbHNlIGlmIChzcGxpY2UgaW5zdGFuY2VvZiBJbnRSYW5nZSkgeworICAgICAgICAgICAgSW50UmFuZ2UgcmFuZ2UgPSAoSW50UmFuZ2UpIHNwbGljZTsKKyAgICAgICAgICAgIGxlZnQgPSByYW5nZS5nZXRGcm9tSW50KCk7CisgICAgICAgICAgICByaWdodCA9IHJhbmdlLmdldFRvSW50KCk7CisgICAgICAgIH0gZWxzZSBpZiAoc3BsaWNlIGluc3RhbmNlb2YgRW1wdHlSYW5nZSkgeworICAgICAgICAgICAgUmFuZ2VJbmZvIGluZm8gPSBzdWJMaXN0Qm9yZGVycyhzZWxmLnNpemUoKSwgKEVtcHR5UmFuZ2UpIHNwbGljZSk7CisgICAgICAgICAgICBsZWZ0ID0gaW5mby5mcm9tOworICAgICAgICAgICAgZW1wdHlSYW5nZSA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJZb3UgbXVzdCBzcGVjaWZ5IGEgbGlzdCBvZiAyIGluZGV4ZXMgdG8gY3JlYXRlIGEgc3ViLWxpc3QiKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgc2l6ZSA9IHNlbGYuc2l6ZSgpOworICAgICAgICBsZWZ0ID0gbm9ybWFsaXNlSW5kZXgobGVmdCwgc2l6ZSk7CisgICAgICAgIHJpZ2h0ID0gbm9ybWFsaXNlSW5kZXgocmlnaHQsIHNpemUpOworICAgICAgICBMaXN0IHN1Ymxpc3QgLyogPSBudWxsICovOworICAgICAgICBpZiAoIWVtcHR5UmFuZ2UpIHsKKyAgICAgICAgICAgIHN1Ymxpc3QgPSBzZWxmLnN1Ykxpc3QobGVmdCwgcmlnaHQgKyAxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN1Ymxpc3QgPSBzZWxmLnN1Ykxpc3QobGVmdCwgbGVmdCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1Ymxpc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3VwcG9ydCB0aGUgc3Vic2NyaXB0IG9wZXJhdG9yIGZvciBhIExpc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiBhIE1hcAorICAgICAqIEBwYXJhbSBrZXkgIGFuIE9iamVjdCBhcyBhIGtleSBmb3IgdGhlIG1hcAorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGtleQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEF0KE1hcCBzZWxmLCBPYmplY3Qga2V5KSB7CisgICAgICAgIHJldHVybiBzZWxmLmdldChrZXkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIDxwLz4KKyAgICAgKiBSZXR1cm5zIGEgbmV3IE1hcCBjb250YWluZyBhbGwgZW50cmllcyBmcm9tIDxjb2RlPmxlZnQ8L2NvZGU+IGFuZCA8Y29kZT5yaWdodDwvY29kZT4sCisgICAgICogZ2l2aW5nIHByZWNlZGVuY2UgdG8gPGNvZGU+cmlnaHQ8L2NvZGU+LiAgQW55IGtleXMgYXBwZWFyaW5nIGluIGJvdGggTWFwcworICAgICAqIHdpbGwgYXBwZWFyIGluIHRoZSByZXN1bHRhbnQgbWFwIHdpdGggdmFsdWVzIGZyb20gdGhlIDxjb2RlPnJpZ2h0PC9jb2RlPgorICAgICAqIG9wZXJhbmQuCisgICAgICogPC9wPgorICAgICAqIDxwLz4KKyAgICAgKiA8cC8+CisgICAgICogRXF1aXZhbGVudCB0byA8Y29kZT5NYXAgbSA9IG5ldyBIYXNoTWFwKCk7IG0ucHV0QWxsKGxlZnQpOyBtLnB1dEFsbChyaWdodCk7IHJldHVybiBtOzwvY29kZT4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gbGVmdCAgYSBNYXAKKyAgICAgKiBAcGFyYW0gcmlnaHQgYSBNYXAKKyAgICAgKiBAcmV0dXJuIGEgbmV3IE1hcCBjb250YWluaW5nIGFsbCBlbnRyaWVzIGZyb20gbGVmdCBhbmQgcmlnaHQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE1hcCBwbHVzKE1hcCBsZWZ0LCBNYXAgcmlnaHQpIHsKKyAgICAgICAgTWFwIG1hcCA9IG5ldyBUcmVlTWFwKGxlZnQpOworICAgICAgICBtYXAucHV0QWxsKHJpZ2h0KTsKKyAgICAgICAgcmV0dXJuIG1hcDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGhlbHBlciBtZXRob2QgdG8gYWxsb3cgbGlzdHMgdG8gd29yayB3aXRoIHN1YnNjcmlwdCBvcGVyYXRvcnMKKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmICBhIE1hcAorICAgICAqIEBwYXJhbSBrZXkgICBhbiBPYmplY3QgYXMgYSBrZXkgZm9yIHRoZSBtYXAKKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIHB1dCBpbnRvIHRoZSBtYXAKKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBrZXkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBwdXRBdChNYXAgc2VsZiwgT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIHNlbGYucHV0KGtleSwgdmFsdWUpOworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjb252ZXJ0cyBhIHBvc3NpYmx5IG5lZ2F0aXZlIGluZGV4IHRvIGEgcmVhbCBpbmRleCBpbnRvIHRoZSBhcnJheS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpICAgIHRoZSB1bm5vcm1hbGlzZWQgaW5kZXgKKyAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgYXJyYXkgc2l6ZQorICAgICAqIEByZXR1cm4gdGhlIG5vcm1hbGlzZWQgaW5kZXgKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGludCBub3JtYWxpc2VJbmRleChpbnQgaSwgaW50IHNpemUpIHsKKyAgICAgICAgaW50IHRlbXAgPSBpOworICAgICAgICBpZiAoaSA8IDApIHsKKyAgICAgICAgICAgIGkgKz0gc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaSA8IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oIk5lZ2F0aXZlIGFycmF5IGluZGV4IFsiICsgdGVtcCArICJdIHRvbyBsYXJnZSBmb3IgYXJyYXkgc2l6ZSAiICsgc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3VwcG9ydCB0aGUgc3Vic2NyaXB0IG9wZXJhdG9yIGZvciBMaXN0CisgICAgICoKKyAgICAgKiBAcGFyYW0gY29sbCAgICAgYSBDb2xsZWN0aW9uCisgICAgICogQHBhcmFtIHByb3BlcnR5IGEgU3RyaW5nCisgICAgICogQHJldHVybiBhIExpc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0QXQoQ29sbGVjdGlvbiBjb2xsLCBTdHJpbmcgcHJvcGVydHkpIHsKKyAgICAgICAgTGlzdCBhbnN3ZXIgPSBuZXcgQXJyYXlMaXN0KGNvbGwuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gY29sbC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIE9iamVjdCBpdGVtID0gaXRlci5uZXh0KCk7CisgICAgICAgICAgICBPYmplY3QgdmFsdWU7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHZhbHVlID0gSW52b2tlckhlbHBlci5nZXRQcm9wZXJ0eShpdGVtLCBwcm9wZXJ0eSk7CisgICAgICAgICAgICB9IGNhdGNoIChNaXNzaW5nUHJvcGVydHlFeGNlcHRpb25Ob1N0YWNrIG1wZSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBjYXVzZVN0cmluZyA9IG5ldyBNaXNzaW5nUHJvcGVydHlFeGNlcHRpb24obXBlLmdldFByb3BlcnR5KCksIG1wZS5nZXRUeXBlKCkpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbigiRXhjZXB0aW9uIGV2YWx1YXRpbmcgcHJvcGVydHkgJyIgKyBwcm9wZXJ0eSArCisgICAgICAgICAgICAgICAgICAgICAgICAiJyBmb3IgIiArIGNvbGwuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiLCBSZWFzb246ICIgKyBjYXVzZVN0cmluZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhbnN3ZXIuYWRkKHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYW5zd2VyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgY29udmVuaWVuY2UgbWV0aG9kIGZvciBjcmVhdGluZyBhbiBpbW11dGFibGUgbWFwLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgYSBNYXAKKyAgICAgKiBAcmV0dXJuIGFuIGltbXV0YWJsZSBNYXAKKyAgICAgKiBAc2VlIGphdmEudXRpbC5Db2xsZWN0aW9ucyN1bm1vZGlmaWFibGVNYXAoamF2YS51dGlsLk1hcCkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE1hcCBhc0ltbXV0YWJsZShNYXAgc2VsZikgeworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKHNlbGYpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgY29udmVuaWVuY2UgbWV0aG9kIGZvciBjcmVhdGluZyBhbiBpbW11dGFibGUgc29ydGVkIG1hcC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmIGEgU29ydGVkTWFwCisgICAgICogQHJldHVybiBhbiBpbW11dGFibGUgU29ydGVkTWFwCisgICAgICogQHNlZSBqYXZhLnV0aWwuQ29sbGVjdGlvbnMjdW5tb2RpZmlhYmxlU29ydGVkTWFwKGphdmEudXRpbC5Tb3J0ZWRNYXApCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTb3J0ZWRNYXAgYXNJbW11dGFibGUoU29ydGVkTWFwIHNlbGYpIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNvcnRlZE1hcChzZWxmKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGNvbnZlbmllbmNlIG1ldGhvZCBmb3IgY3JlYXRpbmcgYW4gaW1tdXRhYmxlIGxpc3QKKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmIGEgTGlzdAorICAgICAqIEByZXR1cm4gYW4gaW1tdXRhYmxlIExpc3QKKyAgICAgKiBAc2VlIGphdmEudXRpbC5Db2xsZWN0aW9ucyN1bm1vZGlmaWFibGVMaXN0KGphdmEudXRpbC5MaXN0KQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBhc0ltbXV0YWJsZShMaXN0IHNlbGYpIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3Qoc2VsZik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBjb252ZW5pZW5jZSBtZXRob2QgZm9yIGNyZWF0aW5nIGFuIGltbXV0YWJsZSBsaXN0LgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgYSBTZXQKKyAgICAgKiBAcmV0dXJuIGFuIGltbXV0YWJsZSBTZXQKKyAgICAgKiBAc2VlIGphdmEudXRpbC5Db2xsZWN0aW9ucyN1bm1vZGlmaWFibGVTZXQoamF2YS51dGlsLlNldCkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFNldCBhc0ltbXV0YWJsZShTZXQgc2VsZikgeworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KHNlbGYpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgY29udmVuaWVuY2UgbWV0aG9kIGZvciBjcmVhdGluZyBhbiBpbW11dGFibGUgc29ydGVkIHNldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmIGEgU29ydGVkU2V0CisgICAgICogQHJldHVybiBhbiBpbW11dGFibGUgU29ydGVkU2V0CisgICAgICogQHNlZSBqYXZhLnV0aWwuQ29sbGVjdGlvbnMjdW5tb2RpZmlhYmxlU29ydGVkU2V0KGphdmEudXRpbC5Tb3J0ZWRTZXQpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTb3J0ZWRTZXQgYXNJbW11dGFibGUoU29ydGVkU2V0IHNlbGYpIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNvcnRlZFNldChzZWxmKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGNvbnZlbmllbmNlIG1ldGhvZCBmb3IgY3JlYXRpbmcgYW4gaW1tdXRhYmxlIENvbGxlY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiBhIENvbGxlY3Rpb24KKyAgICAgKiBAcmV0dXJuIGFuIGltbXV0YWJsZSBDb2xsZWN0aW9uCisgICAgICogQHNlZSBqYXZhLnV0aWwuQ29sbGVjdGlvbnMjdW5tb2RpZmlhYmxlQ29sbGVjdGlvbihqYXZhLnV0aWwuQ29sbGVjdGlvbikKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb24gYXNJbW11dGFibGUoQ29sbGVjdGlvbiBzZWxmKSB7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVDb2xsZWN0aW9uKHNlbGYpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgY29udmVuaWVuY2UgbWV0aG9kIGZvciBjcmVhdGluZyBhIHN5bmNocm9uaXplZCBNYXAuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiBhIE1hcAorICAgICAqIEByZXR1cm4gYSBzeW5jaHJvbml6ZWQgTWFwCisgICAgICogQHNlZSBqYXZhLnV0aWwuQ29sbGVjdGlvbnMjc3luY2hyb25pemVkTWFwKGphdmEudXRpbC5NYXApCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBNYXAgYXNTeW5jaHJvbml6ZWQoTWFwIHNlbGYpIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnN5bmNocm9uaXplZE1hcChzZWxmKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGNvbnZlbmllbmNlIG1ldGhvZCBmb3IgY3JlYXRpbmcgYSBzeW5jaHJvbml6ZWQgU29ydGVkTWFwLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgYSBTb3J0ZWRNYXAKKyAgICAgKiBAcmV0dXJuIGEgc3luY2hyb25pemVkIFNvcnRlZE1hcAorICAgICAqIEBzZWUgamF2YS51dGlsLkNvbGxlY3Rpb25zI3N5bmNocm9uaXplZFNvcnRlZE1hcChqYXZhLnV0aWwuU29ydGVkTWFwKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU29ydGVkTWFwIGFzU3luY2hyb25pemVkKFNvcnRlZE1hcCBzZWxmKSB7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRTb3J0ZWRNYXAoc2VsZik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBjb252ZW5pZW5jZSBtZXRob2QgZm9yIGNyZWF0aW5nIGEgc3luY2hyb25pemVkIENvbGxlY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiBhIENvbGxlY3Rpb24KKyAgICAgKiBAcmV0dXJuIGEgc3luY2hyb25pemVkIENvbGxlY3Rpb24KKyAgICAgKiBAc2VlIGphdmEudXRpbC5Db2xsZWN0aW9ucyNzeW5jaHJvbml6ZWRDb2xsZWN0aW9uKGphdmEudXRpbC5Db2xsZWN0aW9uKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbiBhc1N5bmNocm9uaXplZChDb2xsZWN0aW9uIHNlbGYpIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnN5bmNocm9uaXplZENvbGxlY3Rpb24oc2VsZik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBjb252ZW5pZW5jZSBtZXRob2QgZm9yIGNyZWF0aW5nIGEgc3luY2hyb25pemVkIExpc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiBhIExpc3QKKyAgICAgKiBAcmV0dXJuIGEgc3luY2hyb25pemVkIExpc3QKKyAgICAgKiBAc2VlIGphdmEudXRpbC5Db2xsZWN0aW9ucyNzeW5jaHJvbml6ZWRMaXN0KGphdmEudXRpbC5MaXN0KQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBhc1N5bmNocm9uaXplZChMaXN0IHNlbGYpIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnN5bmNocm9uaXplZExpc3Qoc2VsZik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBjb252ZW5pZW5jZSBtZXRob2QgZm9yIGNyZWF0aW5nIGEgc3luY2hyb25pemVkIFNldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmIGEgU2V0CisgICAgICogQHJldHVybiBhIHN5bmNocm9uaXplZCBTZXQKKyAgICAgKiBAc2VlIGphdmEudXRpbC5Db2xsZWN0aW9ucyNzeW5jaHJvbml6ZWRTZXQoamF2YS51dGlsLlNldCkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFNldCBhc1N5bmNocm9uaXplZChTZXQgc2VsZikgeworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkU2V0KHNlbGYpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgY29udmVuaWVuY2UgbWV0aG9kIGZvciBjcmVhdGluZyBhIHN5bmNocm9uaXplZCBTb3J0ZWRTZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiBhIFNvcnRlZFNldAorICAgICAqIEByZXR1cm4gYSBzeW5jaHJvbml6ZWQgU29ydGVkU2V0CisgICAgICogQHNlZSBqYXZhLnV0aWwuQ29sbGVjdGlvbnMjc3luY2hyb25pemVkU29ydGVkU2V0KGphdmEudXRpbC5Tb3J0ZWRTZXQpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTb3J0ZWRTZXQgYXNTeW5jaHJvbml6ZWQoU29ydGVkU2V0IHNlbGYpIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnN5bmNocm9uaXplZFNvcnRlZFNldChzZWxmKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTeW5vbnltIGZvciB7QGxpbmsgI3RvU3ByZWFkTWFwKE1hcCl9LgorICAgICAqIEBwYXJhbSBzZWxmIGEgbWFwCisgICAgICogQHJldHVybiBhIG5ld2x5IGNyZWF0ZWQgU3ByZWFkbWFwCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTcHJlYWRNYXAgc3ByZWFkKE1hcCBzZWxmKSB7CisgICAgICAgIHJldHVybiB0b1NwcmVhZE1hcChzZWxmKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbmV3IDxjb2RlPlNwcmVhZE1hcDwvY29kZT4gZnJvbSB0aGlzIG1hcC4KKyAgICAgKiA8cC8+CisgICAgICogRm9yIGV4YW1wbGVzLCBpZiB0aGVyZSBpcyBkZWZpbmVkIGEgZnVuY3Rpb24gbGlrZSBhcworICAgICAqIDxibG9ja3F1b3RlPjxwcmU+CisgICAgICogICAgIGRlZiBmbihhLCBiLCBjLCBkKSB7IHJldHVybiBhICsgYiArIGMgKyBkIH0KKyAgICAgKiA8L3ByZT48L2Jsb2NrcXVvdGU+LCB0aGVuIGFsbCBvZiB0aGUgZm9sbG93aW5nIHRocmVlIGhhdmUgdGhlIHNhbWUgbWVhbmluZy4KKyAgICAgKiA8YmxvY2txdW90ZT48cHJlPgorICAgICAqICAgICBwcmludGxuIGZuKGE6MSwgW2I6MiwgYzozXS50b1NwcmVhZE1hcCgpLCBkOjQpCisgICAgICogICAgIHByaW50bG4gZm4oYToxLCAqOltiOjIsIGM6M10sIGQ6NCkKKyAgICAgKiAgICAgcHJpbnRsbiBmbihhOjEsIGI6MiwgYzozLCBkOjQpCisgICAgICogPC9wcmU+PC9ibG9ja3F1b3RlPgorICAgICAqIDxwLz4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmIGEgbGlzdCB0byBiZSBjb252ZXJ0ZWQgaW50byBhIHNwcmVhZG1hcAorICAgICAqIEByZXR1cm4gYSBuZXdseSBjcmVhdGVkIFNwcmVhZG1hcCBpZiB0aGlzIGxpc3QgaXMgbm90IG51bGwgYW5kIGl0cyBzaXplIGlzIHBvc2l0aXZlLgorICAgICAqIEBzZWUgZ3Jvb3Z5LmxhbmcuU3ByZWFkTWFwI1NwcmVhZE1hcChqYXZhLnV0aWwuTWFwKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3ByZWFkTWFwIHRvU3ByZWFkTWFwKE1hcCBzZWxmKSB7CisgICAgICAgIGlmIChzZWxmID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbigiRmFpbCB0byBjb252ZXJ0IE1hcCB0byBTcHJlYWRNYXAsIGJlY2F1c2UgaXQgaXMgbnVsbC4iKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIG5ldyBTcHJlYWRNYXAoc2VsZik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHNwcmVhZGFibGUgbWFwIGZyb20gdGhpcyBhcnJheS4KKyAgICAgKiBAcGFyYW0gc2VsZiBhbiBvYmplY3QgYXJyYXkKKyAgICAgKiBAcmV0dXJuIGEgbmV3bHkgY3JlYXRlZCBTcHJlYWRtYXAKKyAgICAgKiBAc2VlIGdyb292eS5sYW5nLlNwcmVhZE1hcCNTcHJlYWRNYXAoamF2YS5sYW5nLk9iamVjdFtdKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3ByZWFkTWFwIHRvU3ByZWFkTWFwKE9iamVjdFtdIHNlbGYpIHsKKyAgICAgICAgaWYgKHNlbGYgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBHcm9vdnlSdW50aW1lRXhjZXB0aW9uKCJGYWlsIHRvIGNvbnZlcnQgT2JqZWN0W10gdG8gU3ByZWFkTWFwLCBiZWNhdXNlIGl0IGlzIG51bGwuIik7CisgICAgICAgIGVsc2UgaWYgKHNlbGYubGVuZ3RoICUgMiAhPSAwKQorICAgICAgICAgICAgdGhyb3cgbmV3IEdyb292eVJ1bnRpbWVFeGNlcHRpb24oIkZhaWwgdG8gY29udmVydCBPYmplY3RbXSB0byBTcHJlYWRNYXAsIGJlY2F1c2UgaXQncyBzaXplIGlzIG5vdCBldmVuLiIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gbmV3IFNwcmVhZE1hcChzZWxmKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTb3J0cyB0aGUgZ2l2ZW4gY29sbGVjdGlvbiBpbnRvIGEgc29ydGVkIGxpc3QuICBUaGUgY29sbGVjdGlvbiBpdGVtcyBhcmUKKyAgICAgKiBhc3N1bWVkIHRvIGJlIGNvbXBhcmFibGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiB0aGUgY29sbGVjdGlvbiB0byBiZSBzb3J0ZWQKKyAgICAgKiBAcmV0dXJuIHRoZSBzb3J0ZWQgY29sbGVjdGlvbiBhcyBhIExpc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3Qgc29ydChDb2xsZWN0aW9uIHNlbGYpIHsKKyAgICAgICAgTGlzdCBhbnN3ZXIgPSBhc0xpc3Qoc2VsZik7CisgICAgICAgIENvbGxlY3Rpb25zLnNvcnQoYW5zd2VyLCBuZXcgTnVtYmVyQXdhcmVDb21wYXJhdG9yKCkpOworICAgICAgICByZXR1cm4gYW5zd2VyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEF2b2lkcyBkb2luZyB1bm5lY2Vzc2FyeSB3b3JrIHdoZW4gc29ydGluZyBhbiBhbHJlYWR5IHNvcnRlZCBzZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiBhbiBpZGVudGl0eSBmdW5jdGlvbiBmb3IgYW4gYWxyZWFkeSBzb3J0ZWQgc2V0CisgICAgICogQHJldHVybiB0aGUgc29ydGVkIHNldAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU29ydGVkU2V0IHNvcnQoU29ydGVkU2V0IHNlbGYpIHsKKyAgICAgICAgcmV0dXJuIHNlbGY7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlcyB0aGUgbGFzdCBpdGVtIGZyb20gdGhlIExpc3QuIFVzaW5nIGFkZCgpIGFuZCBwb3AoKQorICAgICAqIGlzIHNpbWlsYXIgdG8gcHVzaCBhbmQgcG9wIG9uIGEgU3RhY2suCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiBhIExpc3QKKyAgICAgKiBAcmV0dXJuIHRoZSBpdGVtIHJlbW92ZWQgZnJvbSB0aGUgTGlzdAorICAgICAqIEB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBpZiB0aGUgbGlzdCBpcyBlbXB0eSBhbmQgeW91IHRyeSB0byBwb3AoKSBpdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBwb3AoTGlzdCBzZWxmKSB7CisgICAgICAgIGlmIChzZWxmLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oIkNhbm5vdCBwb3AoKSBhbiBlbXB0eSBMaXN0Iik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNlbGYucmVtb3ZlKHNlbGYuc2l6ZSgpIC0gMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU29ydHMgdGhlIENvbGxlY3Rpb24gdXNpbmcgdGhlIGdpdmVuIGNvbXBhcmF0b3IuICBUaGUgZWxlbWVudHMgYXJlCisgICAgICogc29ydGVkIGludG8gYSBuZXcgbGlzdCwgYW5kIHRoZSBleGlzdGluZyBjb2xsZWN0aW9uIGlzIHVuY2hhbmdlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmICAgICAgIGEgY29sbGVjdGlvbiB0byBiZSBzb3J0ZWQKKyAgICAgKiBAcGFyYW0gY29tcGFyYXRvciBhIENvbXBhcmF0b3IgdXNlZCBmb3IgdGhlIGNvbXBhcmlzb24KKyAgICAgKiBAcmV0dXJuIGEgbmV3bHkgY3JlYXRlZCBzb3J0ZWQgTGlzdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBzb3J0KENvbGxlY3Rpb24gc2VsZiwgQ29tcGFyYXRvciBjb21wYXJhdG9yKSB7CisgICAgICAgIExpc3QgbGlzdCA9IGFzTGlzdChzZWxmKTsKKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydChsaXN0LCBjb21wYXJhdG9yKTsKKyAgICAgICAgcmV0dXJuIGxpc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogU29ydHMgdGhpcyBDb2xsZWN0aW9uIHVzaW5nIHRoZSBnaXZlbiBjbG9zdXJlIGFzIGEgY29tcGFyYXRvci4gIFRoZQorICAgICAqIGNsb3N1cmUgaXMgcGFzc2VkIGVhY2ggaXRlbSBmcm9tIHRoZSBjb2xsZWN0aW9uLCBhbmQgaXMgYXNzdW1lZCB0bworICAgICAqIHJldHVybiBhIGNvbXBhcmFibGUgdmFsdWUgKGkuZS4gYW4gaW50KS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmICAgIGEgQ29sbGVjdGlvbiB0byBiZSBzb3J0ZWQKKyAgICAgKiBAcGFyYW0gY2xvc3VyZSBhIENsb3N1cmUgdXNlZCBhcyBhIGNvbXBhcmF0b3IKKyAgICAgKiBAcmV0dXJuIGEgbmV3bHkgY3JlYXRlZCBzb3J0ZWQgTGlzdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBzb3J0KENvbGxlY3Rpb24gc2VsZiwgQ2xvc3VyZSBjbG9zdXJlKSB7CisgICAgICAgIExpc3QgbGlzdCA9IGFzTGlzdChzZWxmKTsKKyAgICAgICAgLy8gdXNlIGEgY29tcGFyYXRvciBvZiBvbmUgaXRlbSBvciB0d28KKyAgICAgICAgaW50IHBhcmFtcyA9IGNsb3N1cmUuZ2V0TWF4aW11bU51bWJlck9mUGFyYW1ldGVycygpOworICAgICAgICBpZiAocGFyYW1zID09IDEpIHsKKyAgICAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQobGlzdCwgbmV3IE9yZGVyQnkoY2xvc3VyZSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChsaXN0LCBuZXcgQ2xvc3VyZUNvbXBhcmF0b3IoY2xvc3VyZSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBsaXN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIHRoaXMgY29sbGVjdGlvbiB0byBhIExpc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiBhIGNvbGxlY3Rpb24gdG8gYmUgY29udmVydGVkIGludG8gYSBMaXN0CisgICAgICogQHJldHVybiBhIG5ld2x5IGNyZWF0ZWQgTGlzdCBpZiB0aGlzIGNvbGxlY3Rpb24gaXMgbm90IGFscmVhZHkgYSBMaXN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMaXN0IGFzTGlzdChDb2xsZWN0aW9uIHNlbGYpIHsKKyAgICAgICAgaWYgKHNlbGYgaW5zdGFuY2VvZiBMaXN0KSB7CisgICAgICAgICAgICByZXR1cm4gKExpc3QpIHNlbGY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdChzZWxmKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIHRoZSBnaXZlbiBjb2xsZWN0aW9uIHRvIGVpdGhlciBhIExpc3QsIFNldCwgb3IKKyAgICAgKiBTb3J0ZWRTZXQuICBJZiB0aGUgZ2l2ZW4gY2xhc3MgaXMgc29tZXRoaW5nIGVsc2UsIHRoZQorICAgICAqIGNhbGwgaXMgZGVmZXJyZWQgdG8ge2xpbmsgI2FzVHlwZShPYmplY3QsQ2xhc3MpfS4gIElmIHRoaXMKKyAgICAgKiBjb2xsZWN0aW9uIGlzIGFscmVhZHkgb2YgdGhlIGdpdmVuIHR5cGUsIHRoZSBzYW1lIGluc3RhbmNlIGlzCisgICAgICogcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29sICAgYSBjb2xsZWN0aW9uCisgICAgICogQHBhcmFtIGNsYXp6IHRoZSBkZXNpcmVkIGNsYXNzCisgICAgICogQHJldHVybiB0aGUgb2JqZWN0IHJlc3VsdGluZyBmcm9tIHRoaXMgdHlwZSBjb252ZXJzaW9uCisgICAgICogQHNlZSAjYXNUeXBlKE9iamVjdCxDbGFzcykKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBhc1R5cGUoQ29sbGVjdGlvbiBjb2wsIENsYXNzIGNsYXp6KSB7CisgICAgICAgIGlmIChjbGF6eiA9PSBMaXN0LmNsYXNzKSB7CisgICAgICAgICAgICByZXR1cm4gYXNMaXN0KGNvbCk7CisgICAgICAgIH0gZWxzZSBpZiAoY2xhenogPT0gU2V0LmNsYXNzKSB7CisgICAgICAgICAgICBpZiAoY29sIGluc3RhbmNlb2YgU2V0KSByZXR1cm4gY29sOworICAgICAgICAgICAgcmV0dXJuIG5ldyBIYXNoU2V0KGNvbCk7CisgICAgICAgIH0gZWxzZSBpZiAoY2xhenogPT0gU29ydGVkU2V0LmNsYXNzKSB7CisgICAgICAgICAgICBpZiAoY29sIGluc3RhbmNlb2YgU29ydGVkU2V0KSByZXR1cm4gY29sOworICAgICAgICAgICAgcmV0dXJuIG5ldyBUcmVlU2V0KGNvbCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFzVHlwZSgoT2JqZWN0KSBjb2wsIGNsYXp6KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb2VyY2VzIHRoZSBjbG9zdXJlIHRvIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBnaXZlbiBjbGFzcy4gIFRoZSBjbGFzcworICAgICAqIGlzIGFzc3VtZWQgdG8gYmUgYW4gaW50ZXJmYWNlIG9yIGNsYXNzIHdpdGggYSBzaW5nbGUgbWV0aG9kIGRlZmluaXRpb24uCisgICAgICogVGhlIGNsb3N1cmUgaXMgdXNlZCBhcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhhdCBzaW5nbGUgbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIGNsICAgIHRoZSBpbXBsZW1lbnRhaXRvbiBvZiB0aGUgc2luZ2xlIG1ldGhvZAorICAgICAqIEBwYXJhbSBjbGF6eiB0aGUgdGFyZ2V0IHR5cGUKKyAgICAgKiBAcmV0dXJuIGEgUHJveHkgb2YgdGhlIGdpdmVuIHR5cGUgd2hpY2ggd3JhcHMgdGhpcyBjbG9zdXJlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGFzVHlwZShDbG9zdXJlIGNsLCBDbGFzcyBjbGF6eikgeworICAgICAgICBpZiAoY2xhenouaXNJbnRlcmZhY2UoKSAmJiAhKGNsYXp6LmlzSW5zdGFuY2UoY2wpKSkgeworICAgICAgICAgICAgcmV0dXJuIFByb3h5Lm5ld1Byb3h5SW5zdGFuY2UoCisgICAgICAgICAgICAgICAgICAgIGNsYXp6LmdldENsYXNzTG9hZGVyKCksCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tde2NsYXp6fSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENvbnZlcnRlZENsb3N1cmUoY2wpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYXNUeXBlKChPYmplY3QpIGNsLCBjbGF6eik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29lcmNlcyB0aGlzIG1hcCB0byB0aGUgZ2l2ZW4gdHlwZSwgdXNpbmcgdGhlIG1hcCdzIGtleXMgYXMgdGhlIHB1YmxpYworICAgICAqIG1ldGhvZCBuYW1lcywgYW5kIHZhbHVlcyBhcyB0aGUgaW1wbGVtZW50YXRpb24uICBUeXBpY2FsbHkgdGhlIHZhbHVlCisgICAgICogd291bGQgYmUgYSBjbG9zdXJlIHdoaWNoIGJlaGF2ZXMgbGlrZSB0aGUgbWV0aG9kIGltcGxlbWVudGF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcCAgIHRoaXMgbWFwCisgICAgICogQHBhcmFtIGNsYXp6IHRoZSB0YXJnZXQgdHlwZQorICAgICAqIEByZXR1cm4gYSBQcm94eSBvZiB0aGUgZ2l2ZW4gdHlwZSwgd2hpY2ggZGVmZXJzIGNhbGxzIHRvIHRoaXMgbWFwJ3MgZWxlbWVudHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgYXNUeXBlKE1hcCBtYXAsIENsYXNzIGNsYXp6KSB7CisgICAgICAgIGlmICghKGNsYXp6LmlzSW5zdGFuY2UobWFwKSkgJiYgY2xhenouaXNJbnRlcmZhY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuIFByb3h5Lm5ld1Byb3h5SW5zdGFuY2UoCisgICAgICAgICAgICAgICAgICAgIGNsYXp6LmdldENsYXNzTG9hZGVyKCksCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tde2NsYXp6fSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENvbnZlcnRlZE1hcChtYXApKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGFzVHlwZSgoT2JqZWN0KSBtYXAsIGNsYXp6KTsKKyAgICAgICAgfSBjYXRjaCAoR3Jvb3Z5Q2FzdEV4Y2VwdGlvbiBjZSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUHJveHlHZW5lcmF0b3IuaW5zdGFudGlhdGVBZ2dyZWdhdGVGcm9tQmFzZUNsYXNzKG1hcCwgY2xhenopOworICAgICAgICAgICAgfSBjYXRjaCAoR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbiBjYXVzZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBHcm9vdnlDYXN0RXhjZXB0aW9uKCJFcnJvciBjYXN0aW5nIG1hcCB0byAiICsgY2xhenouZ2V0TmFtZSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIsIFJlYXNvbjogIiArIGNhdXNlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXZlcnNlcyB0aGUgbGlzdC4gIFRoZSByZXN1bHQgaXMgYSBuZXcgTGlzdCB3aXRoIHRoZSBpZGVudGljYWwgY29udGVudHMKKyAgICAgKiBpbiByZXZlcnNlIG9yZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgYSBMaXN0CisgICAgICogQHJldHVybiBhIHJldmVyc2VkIExpc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3QgcmV2ZXJzZShMaXN0IHNlbGYpIHsKKyAgICAgICAgaW50IHNpemUgPSBzZWxmLnNpemUoKTsKKyAgICAgICAgTGlzdCBhbnN3ZXIgPSBuZXcgQXJyYXlMaXN0KHNpemUpOworICAgICAgICBMaXN0SXRlcmF0b3IgaXRlciA9IHNlbGYubGlzdEl0ZXJhdG9yKHNpemUpOworICAgICAgICB3aGlsZSAoaXRlci5oYXNQcmV2aW91cygpKSB7CisgICAgICAgICAgICBhbnN3ZXIuYWRkKGl0ZXIucHJldmlvdXMoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFuc3dlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBDb2xsZWN0aW9uIGFzIGEgdW5pb24gb2YgdHdvIGNvbGxlY3Rpb25zLiBJZiB0aGUgbGVmdCBjb2xsZWN0aW9uCisgICAgICogaXMgYSBTZXQsIHRoZW4gdGhlIHJldHVybmVkIGNvbGxlY3Rpb24gd2lsbCBiZSBhIFNldCBvdGhlcndpc2UgYSBMaXN0LgorICAgICAqIFRPRE86IHJlbW92ZSBlcXVpdmFsZW50IG51bWJlcnMgYWZ0ZXIgbWVyZ2UsIGUuZy4gMUwgYW5kIDFHPworICAgICAqCisgICAgICogQHBhcmFtIGxlZnQgIHRoZSBsZWZ0IENvbGxlY3Rpb24KKyAgICAgKiBAcGFyYW0gcmlnaHQgdGhlIHJpZ2h0IENvbGxlY3Rpb24KKyAgICAgKiBAcmV0dXJuIHRoZSBtZXJnZWQgQ29sbGVjdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbiBwbHVzKENvbGxlY3Rpb24gbGVmdCwgQ29sbGVjdGlvbiByaWdodCkgeworICAgICAgICBDb2xsZWN0aW9uIGFuc3dlcjsKKyAgICAgICAgaWYgKGxlZnQgaW5zdGFuY2VvZiBTZXQpCisgICAgICAgICAgICBhbnN3ZXIgPSBuZXcgSGFzaFNldCgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhbnN3ZXIgPSBuZXcgQXJyYXlMaXN0KGxlZnQuc2l6ZSgpICsgcmlnaHQuc2l6ZSgpKTsKKyAgICAgICAgYW5zd2VyLmFkZEFsbChsZWZ0KTsKKyAgICAgICAgYW5zd2VyLmFkZEFsbChyaWdodCk7CisgICAgICAgIHJldHVybiBhbnN3ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgY29sbGVjdGlvbiBhcyBhIHVuaW9uIG9mIGEgQ29sbGVjdGlvbiBhbmQgYW4gT2JqZWN0LiBJZiB0aGUgY29sbGVjdGlvbgorICAgICAqIGlzIGEgU2V0LCB0aGVuIHRoZSByZXR1cm5lZCBjb2xsZWN0aW9uIHdpbGwgYmUgYSBTZXQgb3RoZXJ3aXNlIGEgTGlzdC4KKyAgICAgKiBUT0RPOiByZW1vdmUgZXF1aXZhbGVudCBudW1iZXJzIGFmdGVyIG1lcmdlLCBlLmcuIDFMIGFuZCAxRz8KKyAgICAgKgorICAgICAqIEBwYXJhbSBsZWZ0ICBhIENvbGxlY3Rpb24KKyAgICAgKiBAcGFyYW0gcmlnaHQgYW4gb2JqZWN0IHRvIGFkZC9hcHBlbmQKKyAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHRpbmcgQ29sbGVjdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbiBwbHVzKENvbGxlY3Rpb24gbGVmdCwgT2JqZWN0IHJpZ2h0KSB7CisgICAgICAgIENvbGxlY3Rpb24gYW5zd2VyOworICAgICAgICBpZiAobGVmdCBpbnN0YW5jZW9mIFNldCkKKyAgICAgICAgICAgIGFuc3dlciA9IG5ldyBIYXNoU2V0KCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGFuc3dlciA9IG5ldyBBcnJheUxpc3QobGVmdC5zaXplKCkgKyAxKTsKKyAgICAgICAgYW5zd2VyLmFkZEFsbChsZWZ0KTsKKyAgICAgICAgYW5zd2VyLmFkZChyaWdodCk7CisgICAgICAgIHJldHVybiBhbnN3ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgTGlzdCBjb21wb3NlZCBvZiB0aGUgZWxlbWVudHMgb2YgdGhpcyBsaXN0LCByZXBlYXRlZAorICAgICAqIGEgY2VydGFpbiBudW1iZXIgb2YgdGltZXMuICBOb3RlIHRoYXQgZm9yIG5vbi0gcHJpbWl0aXZlCisgICAgICogZWxlbWVudHMsIG11bHRpcGxlIHJlZmVyZW5jZXMgdG8gdGhlIHNhbWUgaW5zdGFuY2Ugd2lsbCBiZSBhZGRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmICAgYSBDb2xsZWN0aW9uCisgICAgICogQHBhcmFtIGZhY3RvciB0aGUgbnVtYmVyIG9mIHRpbWVzIHRvIGFwcGVuZAorICAgICAqIEByZXR1cm4gdGhlIG11bHRpcGxpZWQgbGlzdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBtdWx0aXBseShDb2xsZWN0aW9uIHNlbGYsIE51bWJlciBmYWN0b3IpIHsKKyAgICAgICAgaW50IHNpemUgPSBmYWN0b3IuaW50VmFsdWUoKTsKKyAgICAgICAgTGlzdCBhbnN3ZXIgPSBuZXcgQXJyYXlMaXN0KHNlbGYuc2l6ZSgpICogc2l6ZSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBhbnN3ZXIuYWRkQWxsKHNlbGYpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhbnN3ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgTGlzdCBjb21wb3NlZCBvZiB0aGUgaW50ZXJzZWN0aW9uIG9mIGJvdGggY29sbGVjdGlvbnMuICBBbnkKKyAgICAgKiBlbGVtZW50cyB0aGF0IGV4aXN0IGluIGJvdGggY29sbGVjdGlvbnMgYXJlIGFkZGVkIHRvIHRoZSByZXN1bHRhbnQgbGlzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsZWZ0ICBhIENvbGxlY3Rpb24KKyAgICAgKiBAcGFyYW0gcmlnaHQgYSBDb2xsZWN0aW9uCisgICAgICogQHJldHVybiBhIExpc3QgYXMgYW4gaW50ZXJzZWN0aW9uIG9mIGJvdGggY29sbGVjdGlvbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3QgaW50ZXJzZWN0KENvbGxlY3Rpb24gbGVmdCwgQ29sbGVjdGlvbiByaWdodCkgeworICAgICAgICBpZiAobGVmdC5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdCgpOworCisgICAgICAgIGlmIChsZWZ0LnNpemUoKSA8IHJpZ2h0LnNpemUoKSkgeworICAgICAgICAgICAgQ29sbGVjdGlvbiBzd2FwdGVtcCA9IGxlZnQ7CisgICAgICAgICAgICBsZWZ0ID0gcmlnaHQ7CisgICAgICAgICAgICByaWdodCA9IHN3YXB0ZW1wOworICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETyBvcHRpbWlzZSBpZiBzYW1lIHR5cGU/CisgICAgICAgIC8vIGJvb2xlYW4gbmxnblNvcnQgPSBzYW1lVHlwZShuZXcgQ29sbGVjdGlvbltde2xlZnQsIHJpZ2h0fSk7CisKKyAgICAgICAgTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIC8vY3JlYXRlcyB0aGUgY29sbGVjdGlvbiB0byBsb29rIGZvciB2YWx1ZXMuCisgICAgICAgIENvbGxlY3Rpb24gcGlja0Zyb20gPSBuZXcgVHJlZVNldChuZXcgTnVtYmVyQXdhcmVDb21wYXJhdG9yKCkpOworICAgICAgICBwaWNrRnJvbS5hZGRBbGwobGVmdCk7CisKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gcmlnaHQuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBmaW5hbCBPYmplY3QgbyA9IGl0ZXIubmV4dCgpOworICAgICAgICAgICAgaWYgKHBpY2tGcm9tLmNvbnRhaW5zKG8pKQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQobyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBpbnRlcnNlY3Rpb24gb2YgdHdvIGNvbGxlY3Rpb25zIGlzIGVtcHR5LgorICAgICAqCisgICAgICogQHBhcmFtIGxlZnQgIGEgQ29sbGVjdGlvbgorICAgICAqIEBwYXJhbSByaWdodCBhIENvbGxlY3Rpb24KKyAgICAgKiBAcmV0dXJuIGJvb2xlYW4gICA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgaW50ZXJzZWN0aW9uIG9mIHR3byBjb2xsZWN0aW9ucworICAgICAqICAgICAgICAgaXMgZW1wdHksIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGRpc2pvaW50KENvbGxlY3Rpb24gbGVmdCwgQ29sbGVjdGlvbiByaWdodCkgeworCisgICAgICAgIGlmIChsZWZ0LmlzRW1wdHkoKSB8fCByaWdodC5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICBDb2xsZWN0aW9uIHBpY2tGcm9tID0gbmV3IFRyZWVTZXQobmV3IE51bWJlckF3YXJlQ29tcGFyYXRvcigpKTsKKyAgICAgICAgcGlja0Zyb20uYWRkQWxsKHJpZ2h0KTsKKworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsZWZ0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgZmluYWwgT2JqZWN0IG8gPSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChwaWNrRnJvbS5jb250YWlucyhvKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gRGVmYXVsdCBjb21wYXJhdG9yIGZvciBvYmplY3RzIGFjY291bnRpbmcgZm9yIG51bWJlcnMgb2YgZGlmZmVyZW50IHR5cGVzLgorICAgIC8vIEFsc28gaGFuZGxlcyBudWxscy4gTnVsbCBpcyBsZXNzIHRoYW4gZXZlcnl0aGluZyBlbHNlLgorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE51bWJlckF3YXJlQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IgeworICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKKyAgICAgICAgICAgIGlmIChvMSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG8yID09IG51bGwgPyAwIDogLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobzIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG8xIGluc3RhbmNlb2YgTnVtYmVyICYmIG8yIGluc3RhbmNlb2YgTnVtYmVyKSB7CisgICAgICAgICAgICAgICAgQmlnRGVjaW1hbCB4MSA9IG5ldyBCaWdEZWNpbWFsKFN0cmluZy52YWx1ZU9mKG8xKSk7CisgICAgICAgICAgICAgICAgQmlnRGVjaW1hbCB4MiA9IG5ldyBCaWdEZWNpbWFsKFN0cmluZy52YWx1ZU9mKG8yKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHgxLmNvbXBhcmVUbyh4Mik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobzEgaW5zdGFuY2VvZiBDb21wYXJhYmxlICYmIG8yIGluc3RhbmNlb2YgQ29tcGFyYWJsZSAmJgorICAgICAgICAgICAgICAgICAgICAobzEuZ2V0Q2xhc3MoKS5pc0Fzc2lnbmFibGVGcm9tKG8yLmdldENsYXNzKCkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbzIuZ2V0Q2xhc3MoKS5pc0Fzc2lnbmFibGVGcm9tKG8xLmdldENsYXNzKCkpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiAoKENvbXBhcmFibGUpIG8xKS5jb21wYXJlVG8oKENvbXBhcmFibGUpIG8yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCB4MSA9IG8xLmhhc2hDb2RlKCk7CisgICAgICAgICAgICBpbnQgeDIgPSBvMi5oYXNoQ29kZSgpOworICAgICAgICAgICAgcmV0dXJuICh4MSAtIHgyKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5lcXVhbHMob2JqKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbXBhcmUgdGhlIGNvbnRlbnRzIG9mIHRoaXMgYXJyYXkgdG8gdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiBhcnJheS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsZWZ0IGFuIGludCBhcnJheQorICAgICAqIEBwYXJhbSByaWdodCB0aGUgb3BlcmFuZCBhcnJheS4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbnRlbnRzIG9mIGJvdGggYXJyYXlzIGFyZSBlcXVhbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXF1YWxzKGludFtdIGxlZnQsIGludFtdIHJpZ2h0KSB7CisgICAgICAgIGlmIChsZWZ0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiByaWdodCA9PSBudWxsOworICAgICAgICB9CisgICAgICAgIGlmIChyaWdodCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxlZnQubGVuZ3RoICE9IHJpZ2h0Lmxlbmd0aCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVmdC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGxlZnRbaV0gIT0gcmlnaHRbaV0pIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBjb250ZW50cyBvZiB0aGlzIGFycmF5IGFyZSBlcXVhbCB0byB0aGUKKyAgICAgKiBjb250ZW50cyBvZiB0aGUgZ2l2ZW4gbGlzdCwgaW4gdGhlIHNhbWUgb3JkZXIuICBUaGlzIHJldHVybnMKKyAgICAgKiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgZWl0aGVyIGNvbGxlY3Rpb24gaXMgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGVmdCAgdGhpcyBhcnJheQorICAgICAqIEBwYXJhbSByaWdodCB0aGUgbGlzdCBiZWluZyBjb21wYXJlZAorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29udGVudHMgb2YgYm90aCBjb2xsZWN0aW9ucyBhcmUgZXF1YWwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdFtdIGxlZnQsIExpc3QgcmlnaHQpIHsKKyAgICAgICAgcmV0dXJuIGNvZXJjZWRFcXVhbHMobGVmdCwgcmlnaHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZXMgaWYgdGhlIGNvbnRlbnRzIG9mIHRoaXMgbGlzdCBhcmUgZXF1YWwgdG8gdGhlCisgICAgICogY29udGVudHMgb2YgdGhlIGdpdmVuIGFycmF5IGluIHRoZSBzYW1lIG9yZGVyLiAgVGhpcyByZXR1cm5zCisgICAgICogPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGVpdGhlciBjb2xsZWN0aW9uIGlzIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGxlZnQgIHRoaXMgTGlzdAorICAgICAqIEBwYXJhbSByaWdodCB0aGlzIE9iamVjdFtdIGJlaW5nIGNvbXBhcmVkIHRvCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb250ZW50cyBvZiBib3RoIGNvbGxlY3Rpb25zIGFyZSBlcXVhbAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbHMoTGlzdCBsZWZ0LCBPYmplY3RbXSByaWdodCkgeworICAgICAgICByZXR1cm4gY29lcmNlZEVxdWFscyhyaWdodCwgbGVmdCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb2VyY2VkRXF1YWxzKE9iamVjdFtdIGxlZnQsIExpc3QgcmlnaHQpIHsKKyAgICAgICAgaWYgKGxlZnQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHJpZ2h0ID09IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJpZ2h0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobGVmdC5sZW5ndGggIT0gcmlnaHQuc2l6ZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgTnVtYmVyQXdhcmVDb21wYXJhdG9yIG51bWJlckF3YXJlQ29tcGFyYXRvciA9IG5ldyBOdW1iZXJBd2FyZUNvbXBhcmF0b3IoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IGxlZnQubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgIGZpbmFsIE9iamVjdCBvMSA9IGxlZnRbaV07CisgICAgICAgICAgICBmaW5hbCBPYmplY3QgbzIgPSByaWdodC5nZXQoaSk7CisgICAgICAgICAgICBpZiAobzEgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChvMiAhPSBudWxsKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChvMSBpbnN0YW5jZW9mIE51bWJlcikgeworICAgICAgICAgICAgICAgICAgICBpZiAoIShvMiBpbnN0YW5jZW9mIE51bWJlciAmJiBudW1iZXJBd2FyZUNvbXBhcmF0b3IuY29tcGFyZShvMSwgbzIpID09IDApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoIURlZmF1bHRUeXBlVHJhbnNmb3JtYXRpb24uY29tcGFyZUVxdWFsKG8xLCBvMikpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGFyZSB0aGUgY29udGVudHMgb2YgdHdvIExpc3RzLiAgT3JkZXIgbWF0dGVycy4KKyAgICAgKiBJZiBudW1iZXJzIGV4aXN0IGluIHRoZSBMaXN0cywgdGhlbiB0aGV5IGFyZSBjb21wYXJlZCBhcyBudW1iZXJzLAorICAgICAqIGZvciBleGFtcGxlIDIgPT0gMkwuICBJZiBlaXRoZXIgbGlzdCBpcyA8Y29kZT5udWxsPC9jb2RlPiwgdGhlIHJlc3VsdAorICAgICAqIGlzIDxjb2RlPmZhbHNlPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsZWZ0ICB0aGlzIExpc3QKKyAgICAgKiBAcGFyYW0gcmlnaHQgdGhlIExpc3QgYmVpbmcgY29tcGFyZWQgdG8uCisgICAgICogQHJldHVybiBib29sZWFuICAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbnRlbnRzIG9mIGJvdGggbGlzdHMgYXJlIGlkZW50aWNhbCwKKyAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFscyhMaXN0IGxlZnQsIExpc3QgcmlnaHQpIHsKKyAgICAgICAgaWYgKGxlZnQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHJpZ2h0ID09IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJpZ2h0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobGVmdC5zaXplKCkgIT0gcmlnaHQuc2l6ZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgTnVtYmVyQXdhcmVDb21wYXJhdG9yIG51bWJlckF3YXJlQ29tcGFyYXRvciA9IG5ldyBOdW1iZXJBd2FyZUNvbXBhcmF0b3IoKTsKKyAgICAgICAgZmluYWwgSXRlcmF0b3IgaXQxID0gbGVmdC5pdGVyYXRvcigpLCBpdDIgPSByaWdodC5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoaXQxLmhhc05leHQoKSkgeworICAgICAgICAgICAgZmluYWwgT2JqZWN0IG8xID0gaXQxLm5leHQoKTsKKyAgICAgICAgICAgIGZpbmFsIE9iamVjdCBvMiA9IGl0Mi5uZXh0KCk7CisgICAgICAgICAgICBpZiAobzEgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChvMiAhPSBudWxsKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChvMSBpbnN0YW5jZW9mIE51bWJlcikgeworICAgICAgICAgICAgICAgICAgICBpZiAoIShvMiBpbnN0YW5jZW9mIE51bWJlciAmJiBudW1iZXJBd2FyZUNvbXBhcmF0b3IuY29tcGFyZShvMSwgbzIpID09IDApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoIURlZmF1bHRUeXBlVHJhbnNmb3JtYXRpb24uY29tcGFyZUVxdWFsKG8xLCBvMikpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGFyZSB0aGUgY29udGVudHMgb2YgdHdvIFNldHMgZm9yIGVxdWFsaXR5IHVzaW5nIEdyb292eSdzIGNvZXJjaW9uIHJ1bGVzLgorICAgICAqIFdBUk5JTkc6IG1heSBub3QgYmUgaW5jbHVkZWQgaW4gMS4xCisgICAgICogPHAvPgorICAgICAqIFJldHVybnMgPHR0PnRydWU8L3R0PiBpZiB0aGUgdHdvIHNldHMgaGF2ZSB0aGUgc2FtZSBzaXplLCBhbmQgZXZlcnkgbWVtYmVyCisgICAgICogb2YgdGhlIHNwZWNpZmllZCBzZXQgaXMgY29udGFpbmVkIGluIHRoaXMgc2V0IChvciBlcXVpdmFsZW50bHksIGV2ZXJ5IG1lbWJlcgorICAgICAqIG9mIHRoaXMgc2V0IGlzIGNvbnRhaW5lZCBpbiB0aGUgc3BlY2lmaWVkIHNldCkuCisgICAgICogSWYgbnVtYmVycyBleGlzdCBpbiB0aGUgTGlzdHMsIHRoZW4gdGhleSBhcmUgY29tcGFyZWQgYXMgbnVtYmVycywKKyAgICAgKiBmb3IgZXhhbXBsZSAyID09IDJMLiAgSWYgZWl0aGVyIGxpc3QgaXMgPGNvZGU+bnVsbDwvY29kZT4sIHRoZSByZXN1bHQKKyAgICAgKiBpcyA8Y29kZT5mYWxzZTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgdGhpcyBMaXN0CisgICAgICogQHBhcmFtIG90aGVyIHRoZSBMaXN0IGJlaW5nIGNvbXBhcmVkIHRvCisgICAgICogQHJldHVybiA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoZSBjb250ZW50cyBvZiBib3RoIGxpc3RzIGFyZSBpZGVudGljYWwKKyAgICAgKi8KKyAgICAvKgorICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb2VyY2VkRXF1YWxzKFNldCBzZWxmLCBTZXQgb3RoZXIpIHsKKyAgICAgICAgaWYgKHNlbGYgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG90aGVyID09IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG90aGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2VsZi5zaXplKCkgIT0gb3RoZXIuc2l6ZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgTnVtYmVyQXdhcmVDb21wYXJhdG9yIG51bWJlckF3YXJlQ29tcGFyYXRvciA9IG5ldyBOdW1iZXJBd2FyZUNvbXBhcmF0b3IoKTsKKyAgICAgICAgZmluYWwgSXRlcmF0b3IgaXQxID0gc2VsZi5pdGVyYXRvcigpOworICAgICAgICBDb2xsZWN0aW9uIG90aGVySXRlbXMgPSBuZXcgSGFzaFNldChvdGhlcik7CisgICAgICAgIHdoaWxlIChpdDEuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBmaW5hbCBPYmplY3QgbzEgPSBpdDEubmV4dCgpOworICAgICAgICAgICAgaWYgKG8xID09IG51bGwgJiYgIW90aGVyLmNvbnRhaW5zKG51bGwpKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBmaW5hbCBJdGVyYXRvciBpdDIgPSBvdGhlckl0ZW1zLml0ZXJhdG9yKCk7CisgICAgICAgICAgICBPYmplY3QgZm91bmRJdGVtID0gbnVsbDsKKyAgICAgICAgICAgIHdoaWxlIChpdDIuaGFzTmV4dCgpICYmIGZvdW5kSXRlbSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IG8yID0gaXQyLm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAobzEgaW5zdGFuY2VvZiBOdW1iZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG8yIGluc3RhbmNlb2YgTnVtYmVyICYmIG51bWJlckF3YXJlQ29tcGFyYXRvci5jb21wYXJlKG8xLCBvMikgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRJdGVtID0gbzI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERlZmF1bHRUeXBlVHJhbnNmb3JtYXRpb24uY29tcGFyZUVxdWFsKG8xLCBvMikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEl0ZW0gPSBvMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZvdW5kSXRlbSA9PSBudWxsKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBvdGhlckl0ZW1zLnJlbW92ZShmb3VuZEl0ZW0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBvdGhlckl0ZW1zLnNpemUoKSA9PSAwOworICAgIH0KKyovCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBTZXQgY29tcG9zZWQgb2YgdGhlIGVsZW1lbnRzIG9mIHRoZSBmaXJzdCBzZXQgbWludXMgdGhlCisgICAgICogZWxlbWVudHMgb2YgdGhlIGdpdmVuIGNvbGxlY3Rpb24uCisgICAgICogPHAvPgorICAgICAqIFRPRE86IHJlbW92ZSB1c2luZyBudW1iZXIgY29tcGFyYXRvcj8KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmICAgICBhIHNldCBvYmplY3QKKyAgICAgKiBAcGFyYW0gb3BlcmFuZHMgdGhlIGl0ZW1zIHRvIHJlbW92ZSBmcm9tIHRoZSBzZXQKKyAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHRpbmcgc2V0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTZXQgbWludXMoU2V0IHNlbGYsIENvbGxlY3Rpb24gb3BlcmFuZHMpIHsKKyAgICAgICAgaWYgKHNlbGYuc2l6ZSgpID09IDApCisgICAgICAgICAgICByZXR1cm4gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgU2V0IGFuc1NldCA9IG5ldyBIYXNoU2V0KHNlbGYpOworICAgICAgICBhbnNTZXQucmVtb3ZlQWxsKG9wZXJhbmRzKTsKKyAgICAgICAgcmV0dXJuIGFuc1NldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBTZXQgY29tcG9zZWQgb2YgdGhlIGVsZW1lbnRzIG9mIHRoZSBmaXJzdCBzZXQgbWludXMgdGhlIG9wZXJhbmQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgICBhIHNldCBvYmplY3QKKyAgICAgKiBAcGFyYW0gb3BlcmFuZCB0aGUgb3BlcmFuZCB0byByZW1vdmUgZnJvbSB0aGUgc2V0CisgICAgICogQHJldHVybiB0aGUgcmVzdWx0aW5nIHNldAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU2V0IG1pbnVzKFNldCBzZWxmLCBPYmplY3Qgb3BlcmFuZCkgeworICAgICAgICBTZXQgYW5zU2V0ID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgQ29tcGFyYXRvciBudW1iZXJDb21wYXJhdG9yID0gbmV3IE51bWJlckF3YXJlQ29tcGFyYXRvcigpOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gc2VsZi5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBPYmplY3QgbyA9IGl0Lm5leHQoKTsKKyAgICAgICAgICAgIGlmIChudW1iZXJDb21wYXJhdG9yLmNvbXBhcmUobywgb3BlcmFuZCkgIT0gMCkgYW5zU2V0LmFkZChvKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYW5zU2V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIExpc3QgY29tcG9zZWQgb2YgdGhlIGVsZW1lbnRzIG9mIHRoZSBmaXJzdCBsaXN0IG1pbnVzIHRoZQorICAgICAqIGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBjb2xsZWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgICAgIGEgTGlzdAorICAgICAqIEBwYXJhbSByZW1vdmVNZSBhIENvbGxlY3Rpb24gb2YgZWxlbWVudHMgdG8gcmVtb3ZlCisgICAgICogQHJldHVybiBhIExpc3Qgd2l0aCB0aGUgY29tbW9uIGVsZW1lbnRzIHJlbW92ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3QgbWludXMoTGlzdCBzZWxmLCBDb2xsZWN0aW9uIHJlbW92ZU1lKSB7CisKKyAgICAgICAgaWYgKHNlbGYuc2l6ZSgpID09IDApCisgICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdCgpOworCisgICAgICAgIGJvb2xlYW4gbmxnblNvcnQgPSBzYW1lVHlwZShuZXcgQ29sbGVjdGlvbltde3NlbGYsIHJlbW92ZU1lfSk7CisKKyAgICAgICAgLy8gV2UgY2FuJ3QgdXNlIHRoZSBzYW1lIHRhY3RpYyBhcyBmb3IgaW50ZXJzZWN0aW9uCisgICAgICAgIC8vIHNpbmNlIEFic3RyYWN0Q29sbGVjdGlvbiBvbmx5IGRvZXMgYSByZW1vdmUgb24gdGhlIGZpcnN0CisgICAgICAgIC8vIGVsZW1lbnQgaXQgZW5jb3VudGVycy4KKworICAgICAgICBDb21wYXJhdG9yIG51bWJlckNvbXBhcmF0b3IgPSBuZXcgTnVtYmVyQXdhcmVDb21wYXJhdG9yKCk7CisKKyAgICAgICAgaWYgKG5sZ25Tb3J0ICYmIChzZWxmLmdldCgwKSBpbnN0YW5jZW9mIENvbXBhcmFibGUpKSB7CisgICAgICAgICAgICAvL24qTE9HKG4pIHZlcnNpb24KKyAgICAgICAgICAgIFNldCBhbnN3ZXI7CisgICAgICAgICAgICBpZiAoTnVtYmVyLmNsYXNzLmlzSW5zdGFuY2Uoc2VsZi5nZXQoMCkpKSB7CisgICAgICAgICAgICAgICAgYW5zd2VyID0gbmV3IFRyZWVTZXQobnVtYmVyQ29tcGFyYXRvcik7CisgICAgICAgICAgICAgICAgYW5zd2VyLmFkZEFsbChzZWxmKTsKKyAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gc2VsZi5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgICAgIE9iamVjdCBvID0gaXQubmV4dCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoTnVtYmVyLmNsYXNzLmlzSW5zdGFuY2UobykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQyID0gcmVtb3ZlTWUuaXRlcmF0b3IoKTsgaXQyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgbzIgPSBpdDIubmV4dCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChOdW1iZXIuY2xhc3MuaXNJbnN0YW5jZShvMikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bWJlckNvbXBhcmF0b3IuY29tcGFyZShvLCBvMikgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuc3dlci5yZW1vdmUobyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbW92ZU1lLmNvbnRhaW5zKG8pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuc3dlci5yZW1vdmUobyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFuc3dlciA9IG5ldyBUcmVlU2V0KG51bWJlckNvbXBhcmF0b3IpOworICAgICAgICAgICAgICAgIGFuc3dlci5hZGRBbGwoc2VsZik7CisgICAgICAgICAgICAgICAgYW5zd2VyLnJlbW92ZUFsbChyZW1vdmVNZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIExpc3QgYW5zTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBzZWxmLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBPYmplY3QgbyA9IGl0Lm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoYW5zd2VyLmNvbnRhaW5zKG8pKQorICAgICAgICAgICAgICAgICAgICBhbnNMaXN0LmFkZChvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBhbnNMaXN0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy9uKm4gdmVyc2lvbgorICAgICAgICAgICAgTGlzdCB0bXBBbnN3ZXIgPSBuZXcgTGlua2VkTGlzdChzZWxmKTsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHRtcEFuc3dlci5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIGJvb2xlYW4gZWxlbWVudFJlbW92ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcmVtb3ZlTWUuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpICYmICFlbGVtZW50UmVtb3ZlZDspIHsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGVsdCA9IGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG51bWJlckNvbXBhcmF0b3IuY29tcGFyZShlbGVtZW50LCBlbHQpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXIucmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50UmVtb3ZlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vcmVtb3ZlIGR1cGxpY2F0ZXMKKyAgICAgICAgICAgIC8vY2FuJ3QgdXNlIHRyZWVzZXQgc2luY2UgdGhlIGJhc2UgY2xhc3NlcyBhcmUgZGlmZmVyZW50CisgICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdCh0bXBBbnN3ZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IExpc3QgY29tcG9zZWQgb2YgdGhlIGVsZW1lbnRzIG9mIHRoZSBmaXJzdCBsaXN0IG1pbnVzIHRoZQorICAgICAqIG9wZXJhbmQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgICBhIExpc3Qgb2JqZWN0CisgICAgICogQHBhcmFtIG9wZXJhbmQgYW4gZWxlbWVudCB0byByZW1vdmUgZnJvbSB0aGUgbGlzdAorICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdGluZyBMaXN0IHdpdGggdGhlIG9wZXJhbmQgcmVtb3ZlZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBtaW51cyhMaXN0IHNlbGYsIE9iamVjdCBvcGVyYW5kKSB7CisgICAgICAgIENvbXBhcmF0b3IgbnVtYmVyQ29tcGFyYXRvciA9IG5ldyBOdW1iZXJBd2FyZUNvbXBhcmF0b3IoKTsKKyAgICAgICAgTGlzdCBhbnNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gc2VsZi5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBPYmplY3QgbyA9IGl0Lm5leHQoKTsKKyAgICAgICAgICAgIGlmIChudW1iZXJDb21wYXJhdG9yLmNvbXBhcmUobywgb3BlcmFuZCkgIT0gMCkgYW5zTGlzdC5hZGQobyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFuc0xpc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmxhdHRlbiBhIGxpc3QuICBUaGlzIGNvbGxlY3Rpb24gYW5kIGFueSBuZXN0ZWQgY29sbGVjdGlvbnMgaGF2ZSB0aGVpcgorICAgICAqIGNvbnRlbnRzIChyZWN1cnNpdmVseSkgYWRkZWQgdG8gdGhlIG5ldyBjb2xsZWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgYSBMaXN0CisgICAgICogQHJldHVybiBhIGZsYXR0ZW5lZCBMaXN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMaXN0IGZsYXR0ZW4oTGlzdCBzZWxmKSB7CisgICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0KGZsYXR0ZW4oc2VsZiwgbmV3IExpbmtlZExpc3QoKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZsYXR0ZW4gYSBzZXQuICBUaGlzIGNvbGxlY3Rpb24gYW5kIGFueSBuZXN0ZWQgY29sbGVjdGlvbnMgaGF2ZSB0aGVpcgorICAgICAqIGNvbnRlbnRzIChyZWN1cnNpdmVseSkgYWRkZWQgdG8gdGhlIG5ldyBjb2xsZWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgYSBTZXQKKyAgICAgKiBAcmV0dXJuIGEgZmxhdHRlbmVkIFNldAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU2V0IGZsYXR0ZW4oU2V0IHNlbGYpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBIYXNoU2V0KGZsYXR0ZW4oc2VsZiwgbmV3IExpbmtlZExpc3QoKSkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIExpc3QgZmxhdHRlbihDb2xsZWN0aW9uIGVsZW1lbnRzLCBMaXN0IGFkZFRvKSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIE9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7CisgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbGxlY3Rpb24pIHsKKyAgICAgICAgICAgICAgICBmbGF0dGVuKChDb2xsZWN0aW9uKSBlbGVtZW50LCBhZGRUbyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNYXApIHsKKyAgICAgICAgICAgICAgICBmbGF0dGVuKCgoTWFwKSBlbGVtZW50KS52YWx1ZXMoKSwgYWRkVG8pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhZGRUby5hZGQoZWxlbWVudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFkZFRvOworICAgIH0KKworICAgIC8qKgorICAgICAqIE92ZXJsb2FkcyB0aGUgbGVmdCBzaGlmdCBvcGVyYXRvciB0byBwcm92aWRlIGFuIGVhc3kgd2F5IHRvIGFwcGVuZAorICAgICAqIG9iamVjdHMgdG8gYSBDb2xsZWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgIGEgQ29sbGVjdGlvbgorICAgICAqIEBwYXJhbSB2YWx1ZSBhbiBPYmplY3QgdG8gYmUgYWRkZWQgdG8gdGhlIGNvbGxlY3Rpb24uCisgICAgICogQHJldHVybiBzYW1lIGNvbGxlY3Rpb24sIGFmdGVyIHRoZSB2YWx1ZSB3YXMgYWRkZWQgdG8gaXQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uIGxlZnRTaGlmdChDb2xsZWN0aW9uIHNlbGYsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBzZWxmLmFkZCh2YWx1ZSk7CisgICAgICAgIHJldHVybiBzZWxmOworICAgIH0KKworICAgIC8qKgorICAgICAqIE92ZXJsb2FkcyB0aGUgbGVmdCBzaGlmdCBvcGVyYXRvciB0byBwcm92aWRlIGFuIGVhc3kgd2F5IHRvIGFwcGVuZCBtdWx0aXBsZQorICAgICAqIG9iamVjdHMgYXMgc3RyaW5nIHJlcHJlc2VudGF0aW9ucyB0byBhIFN0cmluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmICBhIFN0cmluZworICAgICAqIEBwYXJhbSB2YWx1ZSBhbiBPYmVjdAorICAgICAqIEByZXR1cm4gYSBTdHJpbmdCdWZmZXIgYnVpbHQgZnJvbSB0aGlzIHN0cmluZworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nQnVmZmVyIGxlZnRTaGlmdChTdHJpbmcgc2VsZiwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nQnVmZmVyKHNlbGYpLmFwcGVuZCh2YWx1ZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmdXcml0ZXIgY3JlYXRlU3RyaW5nV3JpdGVyKFN0cmluZyBzZWxmKSB7CisgICAgICAgIFN0cmluZ1dyaXRlciBhbnN3ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIGFuc3dlci53cml0ZShzZWxmKTsKKyAgICAgICAgcmV0dXJuIGFuc3dlcjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZ0J1ZmZlcldyaXRlciBjcmVhdGVTdHJpbmdCdWZmZXJXcml0ZXIoU3RyaW5nQnVmZmVyIHNlbGYpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdCdWZmZXJXcml0ZXIoc2VsZik7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3ZlcmxvYWRzIHRoZSBsZWZ0IHNoaWZ0IG9wZXJhdG9yIHRvIHByb3ZpZGUgYW4gZWFzeSB3YXkgdG8gYXBwZW5kIG11bHRpcGxlCisgICAgICogb2JqZWN0cyBhcyBzdHJpbmcgcmVwcmVzZW50YXRpb25zIHRvIGEgU3RyaW5nQnVmZmVyLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgIGEgU3RyaW5nQnVmZmVyCisgICAgICogQHBhcmFtIHZhbHVlIGEgdmFsdWUgdG8gYXBwZW5kCisgICAgICogQHJldHVybiB0aGUgU3RyaW5nQnVmZmVyIG9uIHdoaWNoIHRoaXMgb3BlcmF0aW9uIHdhcyBpbnZva2VkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmdCdWZmZXIgbGVmdFNoaWZ0KFN0cmluZ0J1ZmZlciBzZWxmLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgc2VsZi5hcHBlbmQodmFsdWUpOworICAgICAgICByZXR1cm4gc2VsZjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPdmVybG9hZHMgdGhlIGxlZnQgc2hpZnQgb3BlcmF0b3IgdG8gcHJvdmlkZSBhIG1lY2hhbmlzbSB0byBhcHBlbmQKKyAgICAgKiB2YWx1ZXMgdG8gYSB3cml0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgYSBXcml0ZXIKKyAgICAgKiBAcGFyYW0gdmFsdWUgYSB2YWx1ZSB0byBhcHBlbmQKKyAgICAgKiBAcmV0dXJuIHRoZSB3cml0ZXIgb24gd2hpY2ggdGhpcyBvcGVyYXRpb24gd2FzIGludm9rZWQKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBXcml0ZXIgbGVmdFNoaWZ0KFdyaXRlciBzZWxmLCBPYmplY3QgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEludm9rZXJIZWxwZXIud3JpdGUoc2VsZiwgdmFsdWUpOworICAgICAgICByZXR1cm4gc2VsZjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgbGVmdCBzaGlmdCBvcGVyYXRvciBmb3IgaW50ZWdyYWwgdHlwZXMuICBOb24gaW50ZWdyYWwKKyAgICAgKiBOdW1iZXIgdHlwZXMgdGhyb3cgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgICBhIE51bWJlciBvYmplY3QKKyAgICAgKiBAcGFyYW0gb3BlcmFuZCB0aGUgc2hpZnQgZGlzdGFuY2UgYnkgd2hpY2ggdG8gbGVmdCBzaGlmdCB0aGUgbnVtYmVyCisgICAgICogQHJldHVybiB0aGUgcmVzdWx0aW5nIG51bWJlcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTnVtYmVyIGxlZnRTaGlmdChOdW1iZXIgc2VsZiwgTnVtYmVyIG9wZXJhbmQpIHsKKyAgICAgICAgcmV0dXJuIE51bWJlck1hdGgubGVmdFNoaWZ0KHNlbGYsIG9wZXJhbmQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSByaWdodCBzaGlmdCBvcGVyYXRvciBmb3IgaW50ZWdyYWwgdHlwZXMuICBOb24gaW50ZWdyYWwKKyAgICAgKiBOdW1iZXIgdHlwZXMgdGhyb3cgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgICBhIE51bWJlciBvYmplY3QKKyAgICAgKiBAcGFyYW0gb3BlcmFuZCB0aGUgc2hpZnQgZGlzdGFuY2UgYnkgd2hpY2ggdG8gcmlnaHQgc2hpZnQgdGhlIG51bWJlcgorICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdGluZyBudW1iZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE51bWJlciByaWdodFNoaWZ0KE51bWJlciBzZWxmLCBOdW1iZXIgb3BlcmFuZCkgeworICAgICAgICByZXR1cm4gTnVtYmVyTWF0aC5yaWdodFNoaWZ0KHNlbGYsIG9wZXJhbmQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSByaWdodCBzaGlmdCAodW5zaWduZWQpIG9wZXJhdG9yIGZvciBpbnRlZ3JhbCB0eXBlcy4gIE5vbiBpbnRlZ3JhbAorICAgICAqIE51bWJlciB0eXBlcyB0aHJvdyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmICAgIGEgTnVtYmVyIG9iamVjdAorICAgICAqIEBwYXJhbSBvcGVyYW5kIHRoZSBzaGlmdCBkaXN0YW5jZSBieSB3aGljaCB0byByaWdodCBzaGlmdCAodW5zaWduZWQpIHRoZSBudW1iZXIKKyAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHRpbmcgbnVtYmVyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBOdW1iZXIgcmlnaHRTaGlmdFVuc2lnbmVkKE51bWJlciBzZWxmLCBOdW1iZXIgb3BlcmFuZCkgeworICAgICAgICByZXR1cm4gTnVtYmVyTWF0aC5yaWdodFNoaWZ0VW5zaWduZWQoc2VsZiwgb3BlcmFuZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBoZWxwZXIgbWV0aG9kIHNvIHRoYXQgZHluYW1pYyBkaXNwYXRjaCBvZiB0aGUgd3JpdGVyLndyaXRlKG9iamVjdCkgbWV0aG9kCisgICAgICogd2lsbCBhbHdheXMgdXNlIHRoZSBtb3JlIGVmZmljaWVudCBXcml0YWJsZS53cml0ZVRvKHdyaXRlcikgbWVjaGFuaXNtIGlmIHRoZQorICAgICAqIG9iamVjdCBpbXBsZW1lbnRzIHRoZSBXcml0YWJsZSBpbnRlcmZhY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgICAgYSBXcml0ZXIKKyAgICAgKiBAcGFyYW0gd3JpdGFibGUgYW4gb2JqZWN0IGltcGxlbWVudGluZyB0aGUgV3JpdGFibGUgaW50ZXJmYWNlCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBJL08gZXJyb3Igb2NjdXJzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZShXcml0ZXIgc2VsZiwgV3JpdGFibGUgd3JpdGFibGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHdyaXRhYmxlLndyaXRlVG8oc2VsZik7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3ZlcmxvYWRzIHRoZSBsZWZ0U2hpZnQgb3BlcmF0b3IgdG8gcHJvdmlkZSBhbiBhcHBlbmQgbWVjaGFuaXNtIHRvIGFkZCB2YWx1ZXMgdG8gYSBzdHJlYW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgYW4gT3V0cHV0U3RyZWFtCisgICAgICogQHBhcmFtIHZhbHVlIGEgdmFsdWUgdG8gYXBwZW5kCisgICAgICogQHJldHVybiBhIFdyaXRlcgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFdyaXRlciBsZWZ0U2hpZnQoT3V0cHV0U3RyZWFtIHNlbGYsIE9iamVjdCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgT3V0cHV0U3RyZWFtV3JpdGVyIHdyaXRlciA9IG5ldyBGbHVzaGluZ1N0cmVhbVdyaXRlcihzZWxmKTsKKyAgICAgICAgbGVmdFNoaWZ0KHdyaXRlciwgdmFsdWUpOworICAgICAgICByZXR1cm4gd3JpdGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIE92ZXJsb2FkcyB0aGUgbGVmdFNoaWZ0IG9wZXJhdG9yIHRvIGFkZCBvYmplY3RzIHRvIGFuIE9iamVjdE91dHB1dFN0cmVhbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmICBhbiBPYmplY3RPdXRwdXRTdHJlYW0KKyAgICAgKiBAcGFyYW0gdmFsdWUgYW4gb2JqZWN0IHRvIHdyaXRlIHRvIHRoZSBzdHJlYW0KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMuCisgICAgICogQHNpbmNlIDEuMSBiZXRhIDIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbGVmdFNoaWZ0KE9iamVjdE91dHB1dFN0cmVhbSBzZWxmLCBPYmplY3QgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHNlbGYud3JpdGVPYmplY3QodmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBpcGUgYW4gSW5wdXRTdHJlYW0gaW50byBhbiBPdXRwdXRTdHJlYW0gZm9yIGVmZmljaWVudCBzdHJlYW0gY29weWluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmIHN0cmVhbSBvbiB3aGljaCB0byB3cml0ZQorICAgICAqIEBwYXJhbSBpbiAgIHN0cmVhbSB0byByZWFkIGZyb20KKyAgICAgKiBAcmV0dXJuIHRoZSBvdXRwdXRzdHJlYW0gaXRzZWxmCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBJL08gZXJyb3Igb2NjdXJzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT3V0cHV0U3RyZWFtIGxlZnRTaGlmdChPdXRwdXRTdHJlYW0gc2VsZiwgSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVsxMDI0XTsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGludCBjb3VudCA9IGluLnJlYWQoYnVmLCAwLCBidWYubGVuZ3RoKTsKKyAgICAgICAgICAgIGlmIChjb3VudCA9PSAtMSkgYnJlYWs7CisgICAgICAgICAgICBpZiAoY291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgIFRocmVhZC55aWVsZCgpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2VsZi53cml0ZShidWYsIDAsIGNvdW50KTsKKyAgICAgICAgfQorICAgICAgICBzZWxmLmZsdXNoKCk7CisgICAgICAgIHJldHVybiBzZWxmOworICAgIH0KKworICAgIC8qKgorICAgICAqIE92ZXJsb2FkcyB0aGUgbGVmdFNoaWZ0IG9wZXJhdG9yIHRvIHByb3ZpZGUgYW4gYXBwZW5kIG1lY2hhbmlzbSB0byBhZGQgYnl0ZXMgdG8gYSBzdHJlYW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgYW4gT3V0cHV0U3RyZWFtCisgICAgICogQHBhcmFtIHZhbHVlIGEgdmFsdWUgdG8gYXBwZW5kCisgICAgICogQHJldHVybiBhbiBPdXRwdXRTdHJlYW0KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPdXRwdXRTdHJlYW0gbGVmdFNoaWZ0KE91dHB1dFN0cmVhbSBzZWxmLCBieXRlW10gdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHNlbGYud3JpdGUodmFsdWUpOworICAgICAgICBzZWxmLmZsdXNoKCk7CisgICAgICAgIHJldHVybiBzZWxmOworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZXMgaWYgYWxsIGl0ZW1zIG9mIHRoaXMgYXJyYXkgYXJlIG9mIHRoZSBzYW1lIHR5cGUuCisgICAgICogQHBhcmFtIGNvbHMgYW4gYXJyYXkgb2YgY29sbGVjdGlvbnMKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbGxlY3Rpb25zIGFyZSBhbGwgb2YgdGhlIHNhbWUgdHlwZQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gc2FtZVR5cGUoQ29sbGVjdGlvbltdIGNvbHMpIHsKKyAgICAgICAgTGlzdCBhbGwgPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGFsbC5hZGRBbGwoY29sc1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFsbC5zaXplKCkgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgIE9iamVjdCBmaXJzdCA9IGFsbC5nZXQoMCk7CisKKyAgICAgICAgLy90cnlpbmcgdG8gZGV0ZXJtaW5lIHRoZSBiYXNlIGNsYXNzIG9mIHRoZSBjb2xsZWN0aW9ucworICAgICAgICAvL3NwZWNpYWwgY2FzZSBmb3IgTnVtYmVycworICAgICAgICBDbGFzcyBiYXNlQ2xhc3M7CisgICAgICAgIGlmIChmaXJzdCBpbnN0YW5jZW9mIE51bWJlcikgeworICAgICAgICAgICAgYmFzZUNsYXNzID0gTnVtYmVyLmNsYXNzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYmFzZUNsYXNzID0gZmlyc3QuZ2V0Q2xhc3MoKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29scy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gY29sc1tpXS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJhc2VDbGFzcy5pc0luc3RhbmNlKGl0ZXIubmV4dCgpKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIFByaW1pdGl2ZSB0eXBlIGFycmF5IG1ldGhvZHMKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKgorICAgICAqIFN1cHBvcnQgdGhlIHN1YnNjcmlwdCBvcGVyYXRvciBmb3IgYSBieXRlIGFycmF5CisgICAgICoKKyAgICAgKiBAcGFyYW0gYXJyYXkgYSBieXRlIGFycmF5CisgICAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byByZXRyaWV2ZQorICAgICAqIEByZXR1cm4gdGhlIGJ5dGUgYXQgdGhlIGdpdmVuIGluZGV4CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0QXQoYnl0ZVtdIGFycmF5LCBpbnQgaW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIHByaW1pdGl2ZUFycmF5R2V0KGFycmF5LCBpbmRleCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3VwcG9ydCB0aGUgc3Vic2NyaXB0IG9wZXJhdG9yIGZvciBhIGNoYXIgYXJyYXkKKyAgICAgKgorICAgICAqIEBwYXJhbSBhcnJheSBhIGNoYXIgYXJyYXkKKyAgICAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIHRoZSBpdGVtIHRvIHJldHJpZXZlCisgICAgICogQHJldHVybiB0aGUgY2hhciBhdCB0aGUgZ2l2ZW4gaW5kZXgKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRBdChjaGFyW10gYXJyYXksIGludCBpbmRleCkgeworICAgICAgICByZXR1cm4gcHJpbWl0aXZlQXJyYXlHZXQoYXJyYXksIGluZGV4KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdXBwb3J0IHRoZSBzdWJzY3JpcHQgb3BlcmF0b3IgZm9yIGEgc2hvcnQgYXJyYXkKKyAgICAgKgorICAgICAqIEBwYXJhbSBhcnJheSBhIHNob3J0IGFycmF5CisgICAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byByZXRyaWV2ZQorICAgICAqIEByZXR1cm4gdGhlIHNob3J0IGF0IHRoZSBnaXZlbiBpbmRleAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEF0KHNob3J0W10gYXJyYXksIGludCBpbmRleCkgeworICAgICAgICByZXR1cm4gcHJpbWl0aXZlQXJyYXlHZXQoYXJyYXksIGluZGV4KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdXBwb3J0IHRoZSBzdWJzY3JpcHQgb3BlcmF0b3IgZm9yIGFuIGludCBhcnJheQorICAgICAqCisgICAgICogQHBhcmFtIGFycmF5IGFuIGludCBhcnJheQorICAgICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgdGhlIGl0ZW0gdG8gcmV0cmlldmUKKyAgICAgKiBAcmV0dXJuIHRoZSBpbnQgYXQgdGhlIGdpdmVuIGluZGV4CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0QXQoaW50W10gYXJyYXksIGludCBpbmRleCkgeworICAgICAgICByZXR1cm4gcHJpbWl0aXZlQXJyYXlHZXQoYXJyYXksIGluZGV4KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdXBwb3J0IHRoZSBzdWJzY3JpcHQgb3BlcmF0b3IgZm9yIGEgbG9uZyBhcnJheQorICAgICAqCisgICAgICogQHBhcmFtIGFycmF5IGEgbG9uZyBhcnJheQorICAgICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgdGhlIGl0ZW0gdG8gcmV0cmlldmUKKyAgICAgKiBAcmV0dXJuIHRoZSBsb25nIGF0IHRoZSBnaXZlbiBpbmRleAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEF0KGxvbmdbXSBhcnJheSwgaW50IGluZGV4KSB7CisgICAgICAgIHJldHVybiBwcmltaXRpdmVBcnJheUdldChhcnJheSwgaW5kZXgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN1cHBvcnQgdGhlIHN1YnNjcmlwdCBvcGVyYXRvciBmb3IgYSBmbG9hdCBhcnJheQorICAgICAqCisgICAgICogQHBhcmFtIGFycmF5IGEgZmxvYXQgYXJyYXkKKyAgICAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIHRoZSBpdGVtIHRvIHJldHJpZXZlCisgICAgICogQHJldHVybiB0aGUgZmxvYXQgYXQgdGhlIGdpdmVuIGluZGV4CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0QXQoZmxvYXRbXSBhcnJheSwgaW50IGluZGV4KSB7CisgICAgICAgIHJldHVybiBwcmltaXRpdmVBcnJheUdldChhcnJheSwgaW5kZXgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN1cHBvcnQgdGhlIHN1YnNjcmlwdCBvcGVyYXRvciBmb3IgYSBkb3VibGUgYXJyYXkKKyAgICAgKgorICAgICAqIEBwYXJhbSBhcnJheSBhIGRvdWJsZSBhcnJheQorICAgICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgdGhlIGl0ZW0gdG8gcmV0cmlldmUKKyAgICAgKiBAcmV0dXJuIHRoZSBkb3VibGUgYXQgdGhlIGdpdmVuIGluZGV4CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0QXQoZG91YmxlW10gYXJyYXksIGludCBpbmRleCkgeworICAgICAgICByZXR1cm4gcHJpbWl0aXZlQXJyYXlHZXQoYXJyYXksIGluZGV4KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdXBwb3J0IHRoZSBzdWJzY3JpcHQgb3BlcmF0b3IgZm9yIGEgYm9vbGVhbiBhcnJheQorICAgICAqCisgICAgICogQHBhcmFtIGFycmF5IGEgYm9vbGVhbiBhcnJheQorICAgICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgdGhlIGl0ZW0gdG8gcmV0cmlldmUKKyAgICAgKiBAcmV0dXJuIHRoZSBib29sZWFuIGF0IHRoZSBnaXZlbiBpbmRleAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEF0KGJvb2xlYW5bXSBhcnJheSwgaW50IGluZGV4KSB7CisgICAgICAgIHJldHVybiBwcmltaXRpdmVBcnJheUdldChhcnJheSwgaW5kZXgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN1cHBvcnQgdGhlIHN1YnNjcmlwdCBvcGVyYXRvciB3aXRoIGEgcmFuZ2UgZm9yIGEgYnl0ZSBhcnJheQorICAgICAqCisgICAgICogQHBhcmFtIGFycmF5IGEgYnl0ZSBhcnJheQorICAgICAqIEBwYXJhbSByYW5nZSBhIHJhbmdlIGluZGljYXRpbmcgdGhlIGluZGljZXMgZm9yIHRoZSBpdGVtcyB0byByZXRyaWV2ZQorICAgICAqIEByZXR1cm4gbGlzdCBvZiB0aGUgcmV0cmlldmVkIGJ5dGVzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0QXQoYnl0ZVtdIGFycmF5LCBSYW5nZSByYW5nZSkgeworICAgICAgICByZXR1cm4gcHJpbWl0aXZlQXJyYXlHZXQoYXJyYXksIHJhbmdlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdXBwb3J0IHRoZSBzdWJzY3JpcHQgb3BlcmF0b3Igd2l0aCBhIHJhbmdlIGZvciBhIGNoYXIgYXJyYXkKKyAgICAgKgorICAgICAqIEBwYXJhbSBhcnJheSBhIGNoYXIgYXJyYXkKKyAgICAgKiBAcGFyYW0gcmFuZ2UgYSByYW5nZSBpbmRpY2F0aW5nIHRoZSBpbmRpY2VzIGZvciB0aGUgaXRlbXMgdG8gcmV0cmlldmUKKyAgICAgKiBAcmV0dXJuIGxpc3Qgb2YgdGhlIHJldHJpZXZlZCBjaGFycworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEF0KGNoYXJbXSBhcnJheSwgUmFuZ2UgcmFuZ2UpIHsKKyAgICAgICAgcmV0dXJuIHByaW1pdGl2ZUFycmF5R2V0KGFycmF5LCByYW5nZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3VwcG9ydCB0aGUgc3Vic2NyaXB0IG9wZXJhdG9yIHdpdGggYSByYW5nZSBmb3IgYSBzaG9ydCBhcnJheQorICAgICAqCisgICAgICogQHBhcmFtIGFycmF5IGEgc2hvcnQgYXJyYXkKKyAgICAgKiBAcGFyYW0gcmFuZ2UgYSByYW5nZSBpbmRpY2F0aW5nIHRoZSBpbmRpY2VzIGZvciB0aGUgaXRlbXMgdG8gcmV0cmlldmUKKyAgICAgKiBAcmV0dXJuIGxpc3Qgb2YgdGhlIHJldHJpZXZlZCBzaG9ydHMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRBdChzaG9ydFtdIGFycmF5LCBSYW5nZSByYW5nZSkgeworICAgICAgICByZXR1cm4gcHJpbWl0aXZlQXJyYXlHZXQoYXJyYXksIHJhbmdlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdXBwb3J0IHRoZSBzdWJzY3JpcHQgb3BlcmF0b3Igd2l0aCBhIHJhbmdlIGZvciBhbiBpbnQgYXJyYXkKKyAgICAgKgorICAgICAqIEBwYXJhbSBhcnJheSBhbiBpbnQgYXJyYXkKKyAgICAgKiBAcGFyYW0gcmFuZ2UgYSByYW5nZSBpbmRpY2F0aW5nIHRoZSBpbmRpY2VzIGZvciB0aGUgaXRlbXMgdG8gcmV0cmlldmUKKyAgICAgKiBAcmV0dXJuIGxpc3Qgb2YgdGhlIGludHMgYXQgdGhlIGdpdmVuIGluZGljZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRBdChpbnRbXSBhcnJheSwgUmFuZ2UgcmFuZ2UpIHsKKyAgICAgICAgcmV0dXJuIHByaW1pdGl2ZUFycmF5R2V0KGFycmF5LCByYW5nZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3VwcG9ydCB0aGUgc3Vic2NyaXB0IG9wZXJhdG9yIHdpdGggYSByYW5nZSBmb3IgYSBsb25nIGFycmF5CisgICAgICoKKyAgICAgKiBAcGFyYW0gYXJyYXkgYSBsb25nIGFycmF5CisgICAgICogQHBhcmFtIHJhbmdlIGEgcmFuZ2UgaW5kaWNhdGluZyB0aGUgaW5kaWNlcyBmb3IgdGhlIGl0ZW1zIHRvIHJldHJpZXZlCisgICAgICogQHJldHVybiBsaXN0IG9mIHRoZSByZXRyaWV2ZWQgbG9uZ3MKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRBdChsb25nW10gYXJyYXksIFJhbmdlIHJhbmdlKSB7CisgICAgICAgIHJldHVybiBwcmltaXRpdmVBcnJheUdldChhcnJheSwgcmFuZ2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN1cHBvcnQgdGhlIHN1YnNjcmlwdCBvcGVyYXRvciB3aXRoIGEgcmFuZ2UgZm9yIGEgZmxvYXQgYXJyYXkKKyAgICAgKgorICAgICAqIEBwYXJhbSBhcnJheSBhIGZsb2F0IGFycmF5CisgICAgICogQHBhcmFtIHJhbmdlIGEgcmFuZ2UgaW5kaWNhdGluZyB0aGUgaW5kaWNlcyBmb3IgdGhlIGl0ZW1zIHRvIHJldHJpZXZlCisgICAgICogQHJldHVybiBsaXN0IG9mIHRoZSByZXRyaWV2ZWQgZmxvYXRzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0QXQoZmxvYXRbXSBhcnJheSwgUmFuZ2UgcmFuZ2UpIHsKKyAgICAgICAgcmV0dXJuIHByaW1pdGl2ZUFycmF5R2V0KGFycmF5LCByYW5nZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3VwcG9ydCB0aGUgc3Vic2NyaXB0IG9wZXJhdG9yIHdpdGggYSByYW5nZSBmb3IgYSBkb3VibGUgYXJyYXkKKyAgICAgKgorICAgICAqIEBwYXJhbSBhcnJheSBhIGRvdWJsZSBhcnJheQorICAgICAqIEBwYXJhbSByYW5nZSBhIHJhbmdlIGluZGljYXRpbmcgdGhlIGluZGljZXMgZm9yIHRoZSBpdGVtcyB0byByZXRyaWV2ZQorICAgICAqIEByZXR1cm4gbGlzdCBvZiB0aGUgcmV0cmlldmVkIGRvdWJsZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRBdChkb3VibGVbXSBhcnJheSwgUmFuZ2UgcmFuZ2UpIHsKKyAgICAgICAgcmV0dXJuIHByaW1pdGl2ZUFycmF5R2V0KGFycmF5LCByYW5nZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3VwcG9ydCB0aGUgc3Vic2NyaXB0IG9wZXJhdG9yIHdpdGggYSByYW5nZSBmb3IgYSBib29sZWFuIGFycmF5CisgICAgICoKKyAgICAgKiBAcGFyYW0gYXJyYXkgYSBib29sZWFuIGFycmF5CisgICAgICogQHBhcmFtIHJhbmdlIGEgcmFuZ2UgaW5kaWNhdGluZyB0aGUgaW5kaWNlcyBmb3IgdGhlIGl0ZW1zIHRvIHJldHJpZXZlCisgICAgICogQHJldHVybiBsaXN0IG9mIHRoZSByZXRyaWV2ZWQgYm9vbGVhbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRBdChib29sZWFuW10gYXJyYXksIFJhbmdlIHJhbmdlKSB7CisgICAgICAgIHJldHVybiBwcmltaXRpdmVBcnJheUdldChhcnJheSwgcmFuZ2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN1cHBvcnQgdGhlIHN1YnNjcmlwdCBvcGVyYXRvciB3aXRoIGFuIEludFJhbmdlIGZvciBhIGJ5dGUgYXJyYXkKKyAgICAgKgorICAgICAqIEBwYXJhbSBhcnJheSBhIGJ5dGUgYXJyYXkKKyAgICAgKiBAcGFyYW0gcmFuZ2UgYW4gSW50UmFuZ2UgaW5kaWNhdGluZyB0aGUgaW5kaWNlcyBmb3IgdGhlIGl0ZW1zIHRvIHJldHJpZXZlCisgICAgICogQHJldHVybiBsaXN0IG9mIHRoZSByZXRyaWV2ZWQgYnl0ZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRBdChieXRlW10gYXJyYXksIEludFJhbmdlIHJhbmdlKSB7CisgICAgICAgIHJldHVybiBwcmltaXRpdmVBcnJheUdldChhcnJheSwgcmFuZ2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN1cHBvcnQgdGhlIHN1YnNjcmlwdCBvcGVyYXRvciB3aXRoIGFuIEludFJhbmdlIGZvciBhIGNoYXIgYXJyYXkKKyAgICAgKgorICAgICAqIEBwYXJhbSBhcnJheSBhIGNoYXIgYXJyYXkKKyAgICAgKiBAcGFyYW0gcmFuZ2UgYW4gSW50UmFuZ2UgaW5kaWNhdGluZyB0aGUgaW5kaWNlcyBmb3IgdGhlIGl0ZW1zIHRvIHJldHJpZXZlCisgICAgICogQHJldHVybiBsaXN0IG9mIHRoZSByZXRyaWV2ZWQgY2hhcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRBdChjaGFyW10gYXJyYXksIEludFJhbmdlIHJhbmdlKSB7CisgICAgICAgIHJldHVybiBwcmltaXRpdmVBcnJheUdldChhcnJheSwgcmFuZ2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN1cHBvcnQgdGhlIHN1YnNjcmlwdCBvcGVyYXRvciB3aXRoIGFuIEludFJhbmdlIGZvciBhIHNob3J0IGFycmF5CisgICAgICoKKyAgICAgKiBAcGFyYW0gYXJyYXkgYSBzaG9ydCBhcnJheQorICAgICAqIEBwYXJhbSByYW5nZSBhbiBJbnRSYW5nZSBpbmRpY2F0aW5nIHRoZSBpbmRpY2VzIGZvciB0aGUgaXRlbXMgdG8gcmV0cmlldmUKKyAgICAgKiBAcmV0dXJuIGxpc3Qgb2YgdGhlIHJldHJpZXZlZCBzaG9ydHMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRBdChzaG9ydFtdIGFycmF5LCBJbnRSYW5nZSByYW5nZSkgeworICAgICAgICByZXR1cm4gcHJpbWl0aXZlQXJyYXlHZXQoYXJyYXksIHJhbmdlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdXBwb3J0IHRoZSBzdWJzY3JpcHQgb3BlcmF0b3Igd2l0aCBhbiBJbnRSYW5nZSBmb3IgYW4gaW50IGFycmF5CisgICAgICoKKyAgICAgKiBAcGFyYW0gYXJyYXkgYW4gaW50IGFycmF5CisgICAgICogQHBhcmFtIHJhbmdlIGFuIEludFJhbmdlIGluZGljYXRpbmcgdGhlIGluZGljZXMgZm9yIHRoZSBpdGVtcyB0byByZXRyaWV2ZQorICAgICAqIEByZXR1cm4gbGlzdCBvZiB0aGUgcmV0cmlldmVkIGludHMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRBdChpbnRbXSBhcnJheSwgSW50UmFuZ2UgcmFuZ2UpIHsKKyAgICAgICAgcmV0dXJuIHByaW1pdGl2ZUFycmF5R2V0KGFycmF5LCByYW5nZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3VwcG9ydCB0aGUgc3Vic2NyaXB0IG9wZXJhdG9yIHdpdGggYW4gSW50UmFuZ2UgZm9yIGEgbG9uZyBhcnJheQorICAgICAqCisgICAgICogQHBhcmFtIGFycmF5IGEgbG9uZyBhcnJheQorICAgICAqIEBwYXJhbSByYW5nZSBhbiBJbnRSYW5nZSBpbmRpY2F0aW5nIHRoZSBpbmRpY2VzIGZvciB0aGUgaXRlbXMgdG8gcmV0cmlldmUKKyAgICAgKiBAcmV0dXJuIGxpc3Qgb2YgdGhlIHJldHJpZXZlZCBsb25ncworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEF0KGxvbmdbXSBhcnJheSwgSW50UmFuZ2UgcmFuZ2UpIHsKKyAgICAgICAgcmV0dXJuIHByaW1pdGl2ZUFycmF5R2V0KGFycmF5LCByYW5nZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3VwcG9ydCB0aGUgc3Vic2NyaXB0IG9wZXJhdG9yIHdpdGggYW4gSW50UmFuZ2UgZm9yIGEgZmxvYXQgYXJyYXkKKyAgICAgKgorICAgICAqIEBwYXJhbSBhcnJheSBhIGZsb2F0IGFycmF5CisgICAgICogQHBhcmFtIHJhbmdlIGFuIEludFJhbmdlIGluZGljYXRpbmcgdGhlIGluZGljZXMgZm9yIHRoZSBpdGVtcyB0byByZXRyaWV2ZQorICAgICAqIEByZXR1cm4gbGlzdCBvZiB0aGUgcmV0cmlldmVkIGZsb2F0cworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEF0KGZsb2F0W10gYXJyYXksIEludFJhbmdlIHJhbmdlKSB7CisgICAgICAgIHJldHVybiBwcmltaXRpdmVBcnJheUdldChhcnJheSwgcmFuZ2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN1cHBvcnQgdGhlIHN1YnNjcmlwdCBvcGVyYXRvciB3aXRoIGFuIEludFJhbmdlIGZvciBhIGRvdWJsZSBhcnJheQorICAgICAqCisgICAgICogQHBhcmFtIGFycmF5IGEgZG91YmxlIGFycmF5CisgICAgICogQHBhcmFtIHJhbmdlIGFuIEludFJhbmdlIGluZGljYXRpbmcgdGhlIGluZGljZXMgZm9yIHRoZSBpdGVtcyB0byByZXRyaWV2ZQorICAgICAqIEByZXR1cm4gbGlzdCBvZiB0aGUgcmV0cmlldmVkIGRvdWJsZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRBdChkb3VibGVbXSBhcnJheSwgSW50UmFuZ2UgcmFuZ2UpIHsKKyAgICAgICAgcmV0dXJuIHByaW1pdGl2ZUFycmF5R2V0KGFycmF5LCByYW5nZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3VwcG9ydCB0aGUgc3Vic2NyaXB0IG9wZXJhdG9yIHdpdGggYW4gSW50UmFuZ2UgZm9yIGEgYm9vbGVhbiBhcnJheQorICAgICAqCisgICAgICogQHBhcmFtIGFycmF5IGEgYm9vbGVhbiBhcnJheQorICAgICAqIEBwYXJhbSByYW5nZSBhbiBJbnRSYW5nZSBpbmRpY2F0aW5nIHRoZSBpbmRpY2VzIGZvciB0aGUgaXRlbXMgdG8gcmV0cmlldmUKKyAgICAgKiBAcmV0dXJuIGxpc3Qgb2YgdGhlIHJldHJpZXZlZCBib29sZWFucworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEF0KGJvb2xlYW5bXSBhcnJheSwgSW50UmFuZ2UgcmFuZ2UpIHsKKyAgICAgICAgcmV0dXJuIHByaW1pdGl2ZUFycmF5R2V0KGFycmF5LCByYW5nZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3VwcG9ydCB0aGUgc3Vic2NyaXB0IG9wZXJhdG9yIHdpdGggYW4gT2JqZWN0UmFuZ2UgZm9yIGEgYnl0ZSBhcnJheQorICAgICAqCisgICAgICogQHBhcmFtIGFycmF5IGEgYnl0ZSBhcnJheQorICAgICAqIEBwYXJhbSByYW5nZSBhbiBPYmplY3RSYW5nZSBpbmRpY2F0aW5nIHRoZSBpbmRpY2VzIGZvciB0aGUgaXRlbXMgdG8gcmV0cmlldmUKKyAgICAgKiBAcmV0dXJuIGxpc3Qgb2YgdGhlIHJldHJpZXZlZCBieXRlcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEF0KGJ5dGVbXSBhcnJheSwgT2JqZWN0UmFuZ2UgcmFuZ2UpIHsKKyAgICAgICAgcmV0dXJuIHByaW1pdGl2ZUFycmF5R2V0KGFycmF5LCByYW5nZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3VwcG9ydCB0aGUgc3Vic2NyaXB0IG9wZXJhdG9yIHdpdGggYW4gT2JqZWN0UmFuZ2UgZm9yIGEgY2hhciBhcnJheQorICAgICAqCisgICAgICogQHBhcmFtIGFycmF5IGEgY2hhciBhcnJheQorICAgICAqIEBwYXJhbSByYW5nZSBhbiBPYmplY3RSYW5nZSBpbmRpY2F0aW5nIHRoZSBpbmRpY2VzIGZvciB0aGUgaXRlbXMgdG8gcmV0cmlldmUKKyAgICAgKiBAcmV0dXJuIGxpc3Qgb2YgdGhlIHJldHJpZXZlZCBjaGFycworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEF0KGNoYXJbXSBhcnJheSwgT2JqZWN0UmFuZ2UgcmFuZ2UpIHsKKyAgICAgICAgcmV0dXJuIHByaW1pdGl2ZUFycmF5R2V0KGFycmF5LCByYW5nZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3VwcG9ydCB0aGUgc3Vic2NyaXB0IG9wZXJhdG9yIHdpdGggYW4gT2JqZWN0UmFuZ2UgZm9yIGEgc2hvcnQgYXJyYXkKKyAgICAgKgorICAgICAqIEBwYXJhbSBhcnJheSBhIHNob3J0IGFycmF5CisgICAgICogQHBhcmFtIHJhbmdlIGFuIE9iamVjdFJhbmdlIGluZGljYXRpbmcgdGhlIGluZGljZXMgZm9yIHRoZSBpdGVtcyB0byByZXRyaWV2ZQorICAgICAqIEByZXR1cm4gbGlzdCBvZiB0aGUgcmV0cmlldmVkIHNob3J0cworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEF0KHNob3J0W10gYXJyYXksIE9iamVjdFJhbmdlIHJhbmdlKSB7CisgICAgICAgIHJldHVybiBwcmltaXRpdmVBcnJheUdldChhcnJheSwgcmFuZ2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN1cHBvcnQgdGhlIHN1YnNjcmlwdCBvcGVyYXRvciB3aXRoIGFuIE9iamVjdFJhbmdlIGZvciBhbiBpbnQgYXJyYXkKKyAgICAgKgorICAgICAqIEBwYXJhbSBhcnJheSBhbiBpbnQgYXJyYXkKKyAgICAgKiBAcGFyYW0gcmFuZ2UgYW4gT2JqZWN0UmFuZ2UgaW5kaWNhdGluZyB0aGUgaW5kaWNlcyBmb3IgdGhlIGl0ZW1zIHRvIHJldHJpZXZlCisgICAgICogQHJldHVybiBsaXN0IG9mIHRoZSByZXRyaWV2ZWQgaW50cworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEF0KGludFtdIGFycmF5LCBPYmplY3RSYW5nZSByYW5nZSkgeworICAgICAgICByZXR1cm4gcHJpbWl0aXZlQXJyYXlHZXQoYXJyYXksIHJhbmdlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdXBwb3J0IHRoZSBzdWJzY3JpcHQgb3BlcmF0b3Igd2l0aCBhbiBPYmplY3RSYW5nZSBmb3IgYSBsb25nIGFycmF5CisgICAgICoKKyAgICAgKiBAcGFyYW0gYXJyYXkgYSBsb25nIGFycmF5CisgICAgICogQHBhcmFtIHJhbmdlIGFuIE9iamVjdFJhbmdlIGluZGljYXRpbmcgdGhlIGluZGljZXMgZm9yIHRoZSBpdGVtcyB0byByZXRyaWV2ZQorICAgICAqIEByZXR1cm4gbGlzdCBvZiB0aGUgcmV0cmlldmVkIGxvbmdzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0QXQobG9uZ1tdIGFycmF5LCBPYmplY3RSYW5nZSByYW5nZSkgeworICAgICAgICByZXR1cm4gcHJpbWl0aXZlQXJyYXlHZXQoYXJyYXksIHJhbmdlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdXBwb3J0IHRoZSBzdWJzY3JpcHQgb3BlcmF0b3Igd2l0aCBhbiBPYmplY3RSYW5nZSBmb3IgYSBmbG9hdCBhcnJheQorICAgICAqCisgICAgICogQHBhcmFtIGFycmF5IGEgZmxvYXQgYXJyYXkKKyAgICAgKiBAcGFyYW0gcmFuZ2UgYW4gT2JqZWN0UmFuZ2UgaW5kaWNhdGluZyB0aGUgaW5kaWNlcyBmb3IgdGhlIGl0ZW1zIHRvIHJldHJpZXZlCisgICAgICogQHJldHVybiBsaXN0IG9mIHRoZSByZXRyaWV2ZWQgZmxvYXRzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0QXQoZmxvYXRbXSBhcnJheSwgT2JqZWN0UmFuZ2UgcmFuZ2UpIHsKKyAgICAgICAgcmV0dXJuIHByaW1pdGl2ZUFycmF5R2V0KGFycmF5LCByYW5nZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3VwcG9ydCB0aGUgc3Vic2NyaXB0IG9wZXJhdG9yIHdpdGggYW4gT2JqZWN0UmFuZ2UgZm9yIGEgZG91YmxlIGFycmF5CisgICAgICoKKyAgICAgKiBAcGFyYW0gYXJyYXkgYSBkb3VibGUgYXJyYXkKKyAgICAgKiBAcGFyYW0gcmFuZ2UgYW4gT2JqZWN0UmFuZ2UgaW5kaWNhdGluZyB0aGUgaW5kaWNlcyBmb3IgdGhlIGl0ZW1zIHRvIHJldHJpZXZlCisgICAgICogQHJldHVybiBsaXN0IG9mIHRoZSByZXRyaWV2ZWQgZG91YmxlcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEF0KGRvdWJsZVtdIGFycmF5LCBPYmplY3RSYW5nZSByYW5nZSkgeworICAgICAgICByZXR1cm4gcHJpbWl0aXZlQXJyYXlHZXQoYXJyYXksIHJhbmdlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdXBwb3J0IHRoZSBzdWJzY3JpcHQgb3BlcmF0b3Igd2l0aCBhbiBPYmplY3RSYW5nZSBmb3IgYSBieXRlIGFycmF5CisgICAgICoKKyAgICAgKiBAcGFyYW0gYXJyYXkgYSBieXRlIGFycmF5CisgICAgICogQHBhcmFtIHJhbmdlIGFuIE9iamVjdFJhbmdlIGluZGljYXRpbmcgdGhlIGluZGljZXMgZm9yIHRoZSBpdGVtcyB0byByZXRyaWV2ZQorICAgICAqIEByZXR1cm4gbGlzdCBvZiB0aGUgcmV0cmlldmVkIGJ5dGVzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0QXQoYm9vbGVhbltdIGFycmF5LCBPYmplY3RSYW5nZSByYW5nZSkgeworICAgICAgICByZXR1cm4gcHJpbWl0aXZlQXJyYXlHZXQoYXJyYXksIHJhbmdlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdXBwb3J0IHRoZSBzdWJzY3JpcHQgb3BlcmF0b3Igd2l0aCBhIGNvbGxlY3Rpb24gZm9yIGEgYnl0ZSBhcnJheQorICAgICAqCisgICAgICogQHBhcmFtIGFycmF5IGEgYnl0ZSBhcnJheQorICAgICAqIEBwYXJhbSBpbmRpY2VzIGEgY29sbGVjdGlvbiBvZiBpbmRpY2VzIGZvciB0aGUgaXRlbXMgdG8gcmV0cmlldmUKKyAgICAgKiBAcmV0dXJuIGxpc3Qgb2YgdGhlIGJ5dGVzIGF0IHRoZSBnaXZlbiBpbmRpY2VzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0QXQoYnl0ZVtdIGFycmF5LCBDb2xsZWN0aW9uIGluZGljZXMpIHsKKyAgICAgICAgcmV0dXJuIHByaW1pdGl2ZUFycmF5R2V0KGFycmF5LCBpbmRpY2VzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdXBwb3J0IHRoZSBzdWJzY3JpcHQgb3BlcmF0b3Igd2l0aCBhIGNvbGxlY3Rpb24gZm9yIGEgY2hhciBhcnJheQorICAgICAqCisgICAgICogQHBhcmFtIGFycmF5IGEgY2hhciBhcnJheQorICAgICAqIEBwYXJhbSBpbmRpY2VzIGEgY29sbGVjdGlvbiBvZiBpbmRpY2VzIGZvciB0aGUgaXRlbXMgdG8gcmV0cmlldmUKKyAgICAgKiBAcmV0dXJuIGxpc3Qgb2YgdGhlIGNoYXJzIGF0IHRoZSBnaXZlbiBpbmRpY2VzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0QXQoY2hhcltdIGFycmF5LCBDb2xsZWN0aW9uIGluZGljZXMpIHsKKyAgICAgICAgcmV0dXJuIHByaW1pdGl2ZUFycmF5R2V0KGFycmF5LCBpbmRpY2VzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdXBwb3J0IHRoZSBzdWJzY3JpcHQgb3BlcmF0b3Igd2l0aCBhIGNvbGxlY3Rpb24gZm9yIGEgc2hvcnQgYXJyYXkKKyAgICAgKgorICAgICAqIEBwYXJhbSBhcnJheSBhIHNob3J0IGFycmF5CisgICAgICogQHBhcmFtIGluZGljZXMgYSBjb2xsZWN0aW9uIG9mIGluZGljZXMgZm9yIHRoZSBpdGVtcyB0byByZXRyaWV2ZQorICAgICAqIEByZXR1cm4gbGlzdCBvZiB0aGUgc2hvcnRzIGF0IHRoZSBnaXZlbiBpbmRpY2VzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0QXQoc2hvcnRbXSBhcnJheSwgQ29sbGVjdGlvbiBpbmRpY2VzKSB7CisgICAgICAgIHJldHVybiBwcmltaXRpdmVBcnJheUdldChhcnJheSwgaW5kaWNlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3VwcG9ydCB0aGUgc3Vic2NyaXB0IG9wZXJhdG9yIHdpdGggYSBjb2xsZWN0aW9uIGZvciBhbiBpbnQgYXJyYXkKKyAgICAgKgorICAgICAqIEBwYXJhbSBhcnJheSBhbiBpbnQgYXJyYXkKKyAgICAgKiBAcGFyYW0gaW5kaWNlcyBhIGNvbGxlY3Rpb24gb2YgaW5kaWNlcyBmb3IgdGhlIGl0ZW1zIHRvIHJldHJpZXZlCisgICAgICogQHJldHVybiBsaXN0IG9mIHRoZSBpbnRzIGF0IHRoZSBnaXZlbiBpbmRpY2VzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0QXQoaW50W10gYXJyYXksIENvbGxlY3Rpb24gaW5kaWNlcykgeworICAgICAgICByZXR1cm4gcHJpbWl0aXZlQXJyYXlHZXQoYXJyYXksIGluZGljZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN1cHBvcnQgdGhlIHN1YnNjcmlwdCBvcGVyYXRvciB3aXRoIGEgY29sbGVjdGlvbiBmb3IgYSBsb25nIGFycmF5CisgICAgICoKKyAgICAgKiBAcGFyYW0gYXJyYXkgYSBsb25nIGFycmF5CisgICAgICogQHBhcmFtIGluZGljZXMgYSBjb2xsZWN0aW9uIG9mIGluZGljZXMgZm9yIHRoZSBpdGVtcyB0byByZXRyaWV2ZQorICAgICAqIEByZXR1cm4gbGlzdCBvZiB0aGUgbG9uZ3MgYXQgdGhlIGdpdmVuIGluZGljZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRBdChsb25nW10gYXJyYXksIENvbGxlY3Rpb24gaW5kaWNlcykgeworICAgICAgICByZXR1cm4gcHJpbWl0aXZlQXJyYXlHZXQoYXJyYXksIGluZGljZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN1cHBvcnQgdGhlIHN1YnNjcmlwdCBvcGVyYXRvciB3aXRoIGEgY29sbGVjdGlvbiBmb3IgYSBmbG9hdCBhcnJheQorICAgICAqCisgICAgICogQHBhcmFtIGFycmF5IGEgZmxvYXQgYXJyYXkKKyAgICAgKiBAcGFyYW0gaW5kaWNlcyBhIGNvbGxlY3Rpb24gb2YgaW5kaWNlcyBmb3IgdGhlIGl0ZW1zIHRvIHJldHJpZXZlCisgICAgICogQHJldHVybiBsaXN0IG9mIHRoZSBmbG9hdHMgYXQgdGhlIGdpdmVuIGluZGljZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRBdChmbG9hdFtdIGFycmF5LCBDb2xsZWN0aW9uIGluZGljZXMpIHsKKyAgICAgICAgcmV0dXJuIHByaW1pdGl2ZUFycmF5R2V0KGFycmF5LCBpbmRpY2VzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdXBwb3J0IHRoZSBzdWJzY3JpcHQgb3BlcmF0b3Igd2l0aCBhIGNvbGxlY3Rpb24gZm9yIGEgZG91YmxlIGFycmF5CisgICAgICoKKyAgICAgKiBAcGFyYW0gYXJyYXkgYSBkb3VibGUgYXJyYXkKKyAgICAgKiBAcGFyYW0gaW5kaWNlcyBhIGNvbGxlY3Rpb24gb2YgaW5kaWNlcyBmb3IgdGhlIGl0ZW1zIHRvIHJldHJpZXZlCisgICAgICogQHJldHVybiBsaXN0IG9mIHRoZSBkb3VibGVzIGF0IHRoZSBnaXZlbiBpbmRpY2VzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0QXQoZG91YmxlW10gYXJyYXksIENvbGxlY3Rpb24gaW5kaWNlcykgeworICAgICAgICByZXR1cm4gcHJpbWl0aXZlQXJyYXlHZXQoYXJyYXksIGluZGljZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN1cHBvcnQgdGhlIHN1YnNjcmlwdCBvcGVyYXRvciB3aXRoIGEgY29sbGVjdGlvbiBmb3IgYSBib29sZWFuIGFycmF5CisgICAgICoKKyAgICAgKiBAcGFyYW0gYXJyYXkgYSBib29sZWFuIGFycmF5CisgICAgICogQHBhcmFtIGluZGljZXMgYSBjb2xsZWN0aW9uIG9mIGluZGljZXMgZm9yIHRoZSBpdGVtcyB0byByZXRyaWV2ZQorICAgICAqIEByZXR1cm4gbGlzdCBvZiB0aGUgYm9vbGVhbnMgYXQgdGhlIGdpdmVuIGluZGljZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRBdChib29sZWFuW10gYXJyYXksIENvbGxlY3Rpb24gaW5kaWNlcykgeworICAgICAgICByZXR1cm4gcHJpbWl0aXZlQXJyYXlHZXQoYXJyYXksIGluZGljZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN1cHBvcnQgdGhlIHN1YnNjcmlwdCBvcGVyYXRvciBmb3IgYSBCaXRzZXQKKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmICBhIEJpdFNldAorICAgICAqIEBwYXJhbSBpbmRleCBpbmRleCB0byByZXRyaWV2ZQorICAgICAqIEByZXR1cm4gdmFsdWUgb2YgdGhlIGJpdCBhdCB0aGUgZ2l2ZW4gaW5kZXgKKyAgICAgKiBAc2VlIGphdmEudXRpbC5CaXRTZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0QXQoQml0U2V0IHNlbGYsIGludCBpbmRleCkgeworICAgICAgICByZXR1cm4gc2VsZi5nZXQoaW5kZXgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN1cHBvcnQgcmV0cmlldmluZyBhIHN1YnNldCBvZiBhIEJpdFNldCB1c2luZyBhIFJhbmdlCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgYSBCaXRTZXQKKyAgICAgKiBAcGFyYW0gcmFuZ2UgYSBSYW5nZSBkZWZpbmluZyB0aGUgZGVzaXJlZCBzdWJzZXQKKyAgICAgKiBAcmV0dXJuIGEgbmV3IEJpdFNldCB0aGF0IHJlcHJlc2VudHMgdGhlIHJlcXVlc3RlZCBzdWJzZXQKKyAgICAgKiBAc2VlIGphdmEudXRpbC5CaXRTZXQKKyAgICAgKiBAc2VlIGdyb292eS5sYW5nLkludFJhbmdlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBCaXRTZXQgZ2V0QXQoQml0U2V0IHNlbGYsIEludFJhbmdlIHJhbmdlKSB7CisgICAgICAgIGludCBmcm9tID0gRGVmYXVsdFR5cGVUcmFuc2Zvcm1hdGlvbi5pbnRVbmJveChyYW5nZS5nZXRGcm9tKCkpOworICAgICAgICBpbnQgdG8gPSBEZWZhdWx0VHlwZVRyYW5zZm9ybWF0aW9uLmludFVuYm94KHJhbmdlLmdldFRvKCkpOworCisgICAgICAgIEJpdFNldCByZXN1bHQgPSBuZXcgQml0U2V0KCk7CisKKyAgICAgICAgaW50IG51bWJlck9mQml0cyA9IHRvIC0gZnJvbSArIDE7CisgICAgICAgIGludCBhZGp1c3RlciA9IDE7CisgICAgICAgIGludCBvZmZzZXQgPSBmcm9tOworCisgICAgICAgIGlmIChyYW5nZS5pc1JldmVyc2UoKSkgeworICAgICAgICAgICAgYWRqdXN0ZXIgPSAtMTsKKyAgICAgICAgICAgIG9mZnNldCA9IHRvOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXJPZkJpdHM7IGkrKykgeworICAgICAgICAgICAgcmVzdWx0LnNldChpLCBzZWxmLmdldChvZmZzZXQgKyAoYWRqdXN0ZXIgKiBpKSkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEJvb2xlYW4gcHV0QXQoYm9vbGVhbltdIGFycmF5LCBpbnQgaWR4LCBCb29sZWFuIG5ld1ZhbHVlKSB7CisgICAgICAgIHJldHVybiAoQm9vbGVhbikgcHJpbWl0aXZlQXJyYXlQdXQoYXJyYXksIGlkeCwgbmV3VmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQnl0ZSBwdXRBdChieXRlW10gYXJyYXksIGludCBpZHgsIE9iamVjdCBuZXdWYWx1ZSkgeworICAgICAgICBpZiAoIShuZXdWYWx1ZSBpbnN0YW5jZW9mIEJ5dGUpKSB7CisgICAgICAgICAgICBOdW1iZXIgbiA9IChOdW1iZXIpIG5ld1ZhbHVlOworICAgICAgICAgICAgbmV3VmFsdWUgPSBuZXcgQnl0ZShuLmJ5dGVWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKEJ5dGUpIHByaW1pdGl2ZUFycmF5UHV0KGFycmF5LCBpZHgsIG5ld1ZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIENoYXJhY3RlciBwdXRBdChjaGFyW10gYXJyYXksIGludCBpZHgsIE9iamVjdCBuZXdWYWx1ZSkgeworICAgICAgICBpZiAobmV3VmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKyAgICAgICAgICAgIFN0cmluZyBzID0gKFN0cmluZykgbmV3VmFsdWU7CisgICAgICAgICAgICBpZiAocy5sZW5ndGgoKSAhPSAxKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTdHJpbmcgb2YgbGVuZ3RoIDEgZXhwZWN0ZWQgYnV0IGdvdCBhIGJpZ2dlciBvbmUiKTsKKyAgICAgICAgICAgIGNoYXIgYyA9IHMuY2hhckF0KDApOworICAgICAgICAgICAgbmV3VmFsdWUgPSBuZXcgQ2hhcmFjdGVyKGMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoQ2hhcmFjdGVyKSBwcmltaXRpdmVBcnJheVB1dChhcnJheSwgaWR4LCBuZXdWYWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTaG9ydCBwdXRBdChzaG9ydFtdIGFycmF5LCBpbnQgaWR4LCBPYmplY3QgbmV3VmFsdWUpIHsKKyAgICAgICAgaWYgKCEobmV3VmFsdWUgaW5zdGFuY2VvZiBTaG9ydCkpIHsKKyAgICAgICAgICAgIE51bWJlciBuID0gKE51bWJlcikgbmV3VmFsdWU7CisgICAgICAgICAgICBuZXdWYWx1ZSA9IG5ldyBTaG9ydChuLnNob3J0VmFsdWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChTaG9ydCkgcHJpbWl0aXZlQXJyYXlQdXQoYXJyYXksIGlkeCwgbmV3VmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgSW50ZWdlciBwdXRBdChpbnRbXSBhcnJheSwgaW50IGlkeCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisgICAgICAgIGlmICghKG5ld1ZhbHVlIGluc3RhbmNlb2YgSW50ZWdlcikpIHsKKyAgICAgICAgICAgIE51bWJlciBuID0gKE51bWJlcikgbmV3VmFsdWU7CisgICAgICAgICAgICBuZXdWYWx1ZSA9IG5ldyBJbnRlZ2VyKG4uaW50VmFsdWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChJbnRlZ2VyKSBwcmltaXRpdmVBcnJheVB1dChhcnJheSwgaWR4LCBuZXdWYWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMb25nIHB1dEF0KGxvbmdbXSBhcnJheSwgaW50IGlkeCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisgICAgICAgIGlmICghKG5ld1ZhbHVlIGluc3RhbmNlb2YgTG9uZykpIHsKKyAgICAgICAgICAgIE51bWJlciBuID0gKE51bWJlcikgbmV3VmFsdWU7CisgICAgICAgICAgICBuZXdWYWx1ZSA9IG5ldyBMb25nKG4ubG9uZ1ZhbHVlKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoTG9uZykgcHJpbWl0aXZlQXJyYXlQdXQoYXJyYXksIGlkeCwgbmV3VmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRmxvYXQgcHV0QXQoZmxvYXRbXSBhcnJheSwgaW50IGlkeCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisgICAgICAgIGlmICghKG5ld1ZhbHVlIGluc3RhbmNlb2YgRmxvYXQpKSB7CisgICAgICAgICAgICBOdW1iZXIgbiA9IChOdW1iZXIpIG5ld1ZhbHVlOworICAgICAgICAgICAgbmV3VmFsdWUgPSBuZXcgRmxvYXQobi5mbG9hdFZhbHVlKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoRmxvYXQpIHByaW1pdGl2ZUFycmF5UHV0KGFycmF5LCBpZHgsIG5ld1ZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIERvdWJsZSBwdXRBdChkb3VibGVbXSBhcnJheSwgaW50IGlkeCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisgICAgICAgIGlmICghKG5ld1ZhbHVlIGluc3RhbmNlb2YgRG91YmxlKSkgeworICAgICAgICAgICAgTnVtYmVyIG4gPSAoTnVtYmVyKSBuZXdWYWx1ZTsKKyAgICAgICAgICAgIG5ld1ZhbHVlID0gbmV3IERvdWJsZShuLmRvdWJsZVZhbHVlKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoRG91YmxlKSBwcmltaXRpdmVBcnJheVB1dChhcnJheSwgaWR4LCBuZXdWYWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3VwcG9ydCBhc3NpZ25pbmcgYSByYW5nZSBvZiB2YWx1ZXMgd2l0aCBhIHNpbmdsZSBhc3NpZ25tZW50IHN0YXRlbWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmICBhIEJpdFNldAorICAgICAqIEBwYXJhbSByYW5nZSB0aGUgcmFuZ2Ugb2YgdmFsdWVzIHRvIHNldAorICAgICAqIEBwYXJhbSB2YWx1ZSB2YWx1ZQorICAgICAqIEBzZWUgamF2YS51dGlsLkJpdFNldAorICAgICAqIEBzZWUgZ3Jvb3Z5LmxhbmcuUmFuZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHV0QXQoQml0U2V0IHNlbGYsIEludFJhbmdlIHJhbmdlLCBib29sZWFuIHZhbHVlKSB7CisgICAgICAgIGludCBmcm9tID0gRGVmYXVsdFR5cGVUcmFuc2Zvcm1hdGlvbi5pbnRVbmJveChyYW5nZS5nZXRGcm9tKCkpOworICAgICAgICBpbnQgdG8gPSBEZWZhdWx0VHlwZVRyYW5zZm9ybWF0aW9uLmludFVuYm94KHJhbmdlLmdldFRvKCkpOworCisgICAgICAgIC8vIElmIHRoaXMgaXMgYSBiYWNrd2FyZHMgcmFuZ2UsIHJldmVyc2UgdGhlIGFyZ3VtZW50cyB0byBzZXQuCisgICAgICAgIGlmIChmcm9tID4gdG8pIHsKKyAgICAgICAgICAgIGludCB0bXAgPSB0bzsKKyAgICAgICAgICAgIHRvID0gZnJvbTsKKyAgICAgICAgICAgIGZyb20gPSB0bXA7CisgICAgICAgIH0KKyAgICAgICAgc2VsZi5zZXQoZnJvbSwgdG8gKyAxLCB2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3VwcG9ydCBzdWJzY3JpcHQtc3R5bGUgYXNzaWdubWVudCBmb3IgYSBCaXRTZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgYSBCaXRTZXQKKyAgICAgKiBAcGFyYW0gaW5kZXggaW5kZXggb2YgdGhlIGVudHJ5IHRvIHNldAorICAgICAqIEBwYXJhbSB2YWx1ZSB2YWx1ZQorICAgICAqIEBzZWUgamF2YS51dGlsLkJpdFNldAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwdXRBdChCaXRTZXQgc2VsZiwgaW50IGluZGV4LCBib29sZWFuIHZhbHVlKSB7CisgICAgICAgIHNlbGYuc2V0KGluZGV4LCB2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWxsb3dzIGFycmF5cyB0byBiZWhhdmUgc2ltaWxhciB0byBjb2xsZWN0aW9ucy4KKyAgICAgKiBAcGFyYW0gYXJyYXkgYSBib29sZWFuIGFycmF5CisgICAgICogQHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBhcnJheQorICAgICAqIEBzZWUgQXJyYXkjZ2V0TGVuZ3RoKE9iamVjdCkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBzaXplKGJvb2xlYW5bXSBhcnJheSkgeworICAgICAgICByZXR1cm4gQXJyYXkuZ2V0TGVuZ3RoKGFycmF5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbGxvd3MgYXJyYXlzIHRvIGJlaGF2ZSBzaW1pbGFyIHRvIGNvbGxlY3Rpb25zLgorICAgICAqIEBwYXJhbSBhcnJheSBhIGJ5dGUgYXJyYXkKKyAgICAgKiBAcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGFycmF5CisgICAgICogQHNlZSBBcnJheSNnZXRMZW5ndGgoT2JqZWN0KQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IHNpemUoYnl0ZVtdIGFycmF5KSB7CisgICAgICAgIHJldHVybiBBcnJheS5nZXRMZW5ndGgoYXJyYXkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFsbG93cyBhcnJheXMgdG8gYmVoYXZlIHNpbWlsYXIgdG8gY29sbGVjdGlvbnMuCisgICAgICogQHBhcmFtIGFycmF5IGEgY2hhciBhcnJheQorICAgICAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgYXJyYXkKKyAgICAgKiBAc2VlIEFycmF5I2dldExlbmd0aChPYmplY3QpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgc2l6ZShjaGFyW10gYXJyYXkpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5LmdldExlbmd0aChhcnJheSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWxsb3dzIGFycmF5cyB0byBiZWhhdmUgc2ltaWxhciB0byBjb2xsZWN0aW9ucy4KKyAgICAgKiBAcGFyYW0gYXJyYXkgYSBzaG9ydCBhcnJheQorICAgICAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgYXJyYXkKKyAgICAgKiBAc2VlIEFycmF5I2dldExlbmd0aChPYmplY3QpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgc2l6ZShzaG9ydFtdIGFycmF5KSB7CisgICAgICAgIHJldHVybiBBcnJheS5nZXRMZW5ndGgoYXJyYXkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFsbG93cyBhcnJheXMgdG8gYmVoYXZlIHNpbWlsYXIgdG8gY29sbGVjdGlvbnMuCisgICAgICogQHBhcmFtIGFycmF5IGFuIGludCBhcnJheQorICAgICAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgYXJyYXkKKyAgICAgKiBAc2VlIEFycmF5I2dldExlbmd0aChPYmplY3QpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgc2l6ZShpbnRbXSBhcnJheSkgeworICAgICAgICByZXR1cm4gQXJyYXkuZ2V0TGVuZ3RoKGFycmF5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbGxvd3MgYXJyYXlzIHRvIGJlaGF2ZSBzaW1pbGFyIHRvIGNvbGxlY3Rpb25zLgorICAgICAqIEBwYXJhbSBhcnJheSBhIGxvbmcgYXJyYXkKKyAgICAgKiBAcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGFycmF5CisgICAgICogQHNlZSBBcnJheSNnZXRMZW5ndGgoT2JqZWN0KQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IHNpemUobG9uZ1tdIGFycmF5KSB7CisgICAgICAgIHJldHVybiBBcnJheS5nZXRMZW5ndGgoYXJyYXkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFsbG93cyBhcnJheXMgdG8gYmVoYXZlIHNpbWlsYXIgdG8gY29sbGVjdGlvbnMuCisgICAgICogQHBhcmFtIGFycmF5IGEgZmxvYXQgYXJyYXkKKyAgICAgKiBAcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGFycmF5CisgICAgICogQHNlZSBBcnJheSNnZXRMZW5ndGgoT2JqZWN0KQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IHNpemUoZmxvYXRbXSBhcnJheSkgeworICAgICAgICByZXR1cm4gQXJyYXkuZ2V0TGVuZ3RoKGFycmF5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbGxvd3MgYXJyYXlzIHRvIGJlaGF2ZSBzaW1pbGFyIHRvIGNvbGxlY3Rpb25zLgorICAgICAqIEBwYXJhbSBhcnJheSBhIGRvdWJsZSBhcnJheQorICAgICAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgYXJyYXkKKyAgICAgKiBAc2VlIEFycmF5I2dldExlbmd0aChPYmplY3QpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgc2l6ZShkb3VibGVbXSBhcnJheSkgeworICAgICAgICByZXR1cm4gQXJyYXkuZ2V0TGVuZ3RoKGFycmF5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0cyB0aGlzIGFycmF5IHRvIGEgTGlzdCBvZiB0aGUgc2FtZSBzaXplLCB3aXRoIGVhY2ggZWxlbWVudAorICAgICAqIGFkZGVkIHRvIHRoZSBsaXN0LgorICAgICAqCisgICAgICogQHBhcmFtIGFycmF5IGFuIGFycmF5CisgICAgICogQHJldHVybiBhIGxpc3QgY29udGFpbmluZyB0aGUgY29udGVudHMgb2YgdGhpcyBhcnJheS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3QgdG9MaXN0KGJ5dGVbXSBhcnJheSkgeworICAgICAgICByZXR1cm4gRGVmYXVsdFR5cGVUcmFuc2Zvcm1hdGlvbi5wcmltaXRpdmVBcnJheVRvTGlzdChhcnJheSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydHMgdGhpcyBhcnJheSB0byBhIExpc3Qgb2YgdGhlIHNhbWUgc2l6ZSwgd2l0aCBlYWNoIGVsZW1lbnQKKyAgICAgKiBhZGRlZCB0byB0aGUgbGlzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcnJheSBhbiBhcnJheQorICAgICAqIEByZXR1cm4gYSBsaXN0IGNvbnRhaW5pbmcgdGhlIGNvbnRlbnRzIG9mIHRoaXMgYXJyYXkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMaXN0IHRvTGlzdChjaGFyW10gYXJyYXkpIHsKKyAgICAgICAgcmV0dXJuIERlZmF1bHRUeXBlVHJhbnNmb3JtYXRpb24ucHJpbWl0aXZlQXJyYXlUb0xpc3QoYXJyYXkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIHRoaXMgYXJyYXkgdG8gYSBMaXN0IG9mIHRoZSBzYW1lIHNpemUsIHdpdGggZWFjaCBlbGVtZW50CisgICAgICogYWRkZWQgdG8gdGhlIGxpc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXJyYXkgYW4gYXJyYXkKKyAgICAgKiBAcmV0dXJuIGEgbGlzdCBjb250YWluaW5nIHRoZSBjb250ZW50cyBvZiB0aGlzIGFycmF5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlzdCB0b0xpc3Qoc2hvcnRbXSBhcnJheSkgeworICAgICAgICByZXR1cm4gRGVmYXVsdFR5cGVUcmFuc2Zvcm1hdGlvbi5wcmltaXRpdmVBcnJheVRvTGlzdChhcnJheSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydHMgdGhpcyBhcnJheSB0byBhIExpc3Qgb2YgdGhlIHNhbWUgc2l6ZSwgd2l0aCBlYWNoIGVsZW1lbnQKKyAgICAgKiBhZGRlZCB0byB0aGUgbGlzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcnJheSBhbiBhcnJheQorICAgICAqIEByZXR1cm4gYSBsaXN0IGNvbnRhaW5pbmcgdGhlIGNvbnRlbnRzIG9mIHRoaXMgYXJyYXkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMaXN0IHRvTGlzdChpbnRbXSBhcnJheSkgeworICAgICAgICByZXR1cm4gRGVmYXVsdFR5cGVUcmFuc2Zvcm1hdGlvbi5wcmltaXRpdmVBcnJheVRvTGlzdChhcnJheSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydHMgdGhpcyBhcnJheSB0byBhIExpc3Qgb2YgdGhlIHNhbWUgc2l6ZSwgd2l0aCBlYWNoIGVsZW1lbnQKKyAgICAgKiBhZGRlZCB0byB0aGUgbGlzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcnJheSBhbiBhcnJheQorICAgICAqIEByZXR1cm4gYSBsaXN0IGNvbnRhaW5pbmcgdGhlIGNvbnRlbnRzIG9mIHRoaXMgYXJyYXkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMaXN0IHRvTGlzdChsb25nW10gYXJyYXkpIHsKKyAgICAgICAgcmV0dXJuIERlZmF1bHRUeXBlVHJhbnNmb3JtYXRpb24ucHJpbWl0aXZlQXJyYXlUb0xpc3QoYXJyYXkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIHRoaXMgYXJyYXkgdG8gYSBMaXN0IG9mIHRoZSBzYW1lIHNpemUsIHdpdGggZWFjaCBlbGVtZW50CisgICAgICogYWRkZWQgdG8gdGhlIGxpc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXJyYXkgYW4gYXJyYXkKKyAgICAgKiBAcmV0dXJuIGEgbGlzdCBjb250YWluaW5nIHRoZSBjb250ZW50cyBvZiB0aGlzIGFycmF5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlzdCB0b0xpc3QoZmxvYXRbXSBhcnJheSkgeworICAgICAgICByZXR1cm4gRGVmYXVsdFR5cGVUcmFuc2Zvcm1hdGlvbi5wcmltaXRpdmVBcnJheVRvTGlzdChhcnJheSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydHMgdGhpcyBhcnJheSB0byBhIExpc3Qgb2YgdGhlIHNhbWUgc2l6ZSwgd2l0aCBlYWNoIGVsZW1lbnQKKyAgICAgKiBhZGRlZCB0byB0aGUgbGlzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcnJheSBhbiBhcnJheQorICAgICAqIEByZXR1cm4gYSBsaXN0IGNvbnRhaW5pbmcgdGhlIGNvbnRlbnRzIG9mIHRoaXMgYXJyYXkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMaXN0IHRvTGlzdChkb3VibGVbXSBhcnJheSkgeworICAgICAgICByZXR1cm4gRGVmYXVsdFR5cGVUcmFuc2Zvcm1hdGlvbi5wcmltaXRpdmVBcnJheVRvTGlzdChhcnJheSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIFRfVEFCTEUgPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLnRvQ2hhckFycmF5KCk7CisKKyAgICBwdWJsaWMgc3RhdGljIFdyaXRhYmxlIGVuY29kZUJhc2U2NChCeXRlW10gZGF0YSkgeworICAgICAgICByZXR1cm4gZW5jb2RlQmFzZTY0KERlZmF1bHRUeXBlVHJhbnNmb3JtYXRpb24uY29udmVydFRvQnl0ZUFycmF5KGRhdGEpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm9kdWNlIGEgV3JpdGFibGUgb2JqZWN0IHdoaWNoIHdyaXRlcyB0aGUgYmFzZTY0IGVuY29kaW5nIG9mIHRoZSBieXRlIGFycmF5LgorICAgICAqIENhbGxpbmcgdG9TdHJpbmcoKSBvbiB0aGUgcmVzdWx0IHJlcnVybnMgdGhlIGVuY29kaW5nIGFzIGEgU3RyaW5nCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGF0YSBieXRlIGFycmF5IHRvIGJlIGVuY29kZWQKKyAgICAgKiBAcmV0dXJuIG9iamVjdCB3aGljaCB3aWxsIHdyaXRlIHRoZSBiYXNlNjQgZW5jb2Rpbmcgb2YgdGhlIGJ5dGUgYXJyYXkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFdyaXRhYmxlIGVuY29kZUJhc2U2NChmaW5hbCBieXRlW10gZGF0YSkgeworICAgICAgICByZXR1cm4gbmV3IFdyaXRhYmxlKCkgeworICAgICAgICAgICAgcHVibGljIFdyaXRlciB3cml0ZVRvKGZpbmFsIFdyaXRlciB3cml0ZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgaW50IGNoYXJDb3VudCA9IDA7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGRMaW1pdCA9IChkYXRhLmxlbmd0aCAvIDMpICogMzsKKworICAgICAgICAgICAgICAgIGZvciAoaW50IGRJbmRleCA9IDA7IGRJbmRleCAhPSBkTGltaXQ7IGRJbmRleCArPSAzKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBkID0gKChkYXRhW2RJbmRleF0gJiAwWEZGKSA8PCAxNikgfCAoKGRhdGFbZEluZGV4ICsgMV0gJiAwWEZGKSA8PCA4KSB8IChkYXRhW2RJbmRleCArIDJdICYgMFhGRik7CisKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKFRfVEFCTEVbZCA+PiAxOF0pOworICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoVF9UQUJMRVsoZCA+PiAxMikgJiAwWDNGXSk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZShUX1RBQkxFWyhkID4+IDYpICYgMFgzRl0pOworICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoVF9UQUJMRVtkICYgMFgzRl0pOworCisgICAgICAgICAgICAgICAgICAgIGlmICgrK2NoYXJDb3VudCA9PSAxOCkgeworICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKCdcbicpOworICAgICAgICAgICAgICAgICAgICAgICAgY2hhckNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChkTGltaXQgIT0gZGF0YS5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGQgPSAoZGF0YVtkTGltaXRdICYgMFhGRikgPDwgMTY7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRMaW1pdCArIDEgIT0gZGF0YS5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGQgfD0gKGRhdGFbZExpbWl0ICsgMV0gJiAwWEZGKSA8PCA4OworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKFRfVEFCTEVbZCA+PiAxOF0pOworICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoVF9UQUJMRVsoZCA+PiAxMikgJiAwWDNGXSk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgoZExpbWl0ICsgMSA8IGRhdGEubGVuZ3RoKSA/IFRfVEFCTEVbKGQgPj4gNikgJiAwWDNGXSA6ICc9Jyk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgnPScpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiB3cml0ZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nV3JpdGVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlVG8oYnVmZmVyKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdHJpbmdXcml0ZXJJT0V4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIFRSQU5TTEFURV9UQUJMRSA9ICgKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAiXHUwMDQyXHUwMDQyXHUwMDQyXHUwMDQyXHUwMDQyXHUwMDQyXHUwMDQyXHUwMDQyIgorICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgXHQgICAgXG4gICAgICAgICAgICAgICAgXHIKKyAgICAgICAgICAgICAgICAgICAgKyAiXHUwMDQyXHUwMDQyXHUwMDQxXHUwMDQxXHUwMDQyXHUwMDQyXHUwMDQxXHUwMDQyIgorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICArICJcdTAwNDJcdTAwNDJcdTAwNDJcdTAwNDJcdTAwNDJcdTAwNDJcdTAwNDJcdTAwNDIiCisgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgICsgIlx1MDA0Mlx1MDA0Mlx1MDA0Mlx1MDA0Mlx1MDA0Mlx1MDA0Mlx1MDA0Mlx1MDA0MiIKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgIHNwICAgICEgICAgICIgICAgICMgICAgICQgICAgICUgICAgICYgICAgICcKKyAgICAgICAgICAgICAgICAgICAgKyAiXHUwMDQxXHUwMDQyXHUwMDQyXHUwMDQyXHUwMDQyXHUwMDQyXHUwMDQyXHUwMDQyIgorICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICggICAgKSAgICAgKiAgICAgKyAgICAgLCAgICAgLSAgICAgLiAgICAgLworICAgICAgICAgICAgICAgICAgICArICJcdTAwNDJcdTAwNDJcdTAwNDJcdTAwM0VcdTAwNDJcdTAwNDJcdTAwNDJcdTAwM0YiCisgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgMCAgICAxICAgICAyICAgICAzICAgICA0ICAgICA1ICAgICA2ICAgICA3CisgICAgICAgICAgICAgICAgICAgICsgIlx1MDAzNFx1MDAzNVx1MDAzNlx1MDAzN1x1MDAzOFx1MDAzOVx1MDAzQVx1MDAzQiIKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICA4ICAgIDkgICAgIDogICAgIDsgICAgIDwgICAgID0gICAgID4gICAgID8KKyAgICAgICAgICAgICAgICAgICAgKyAiXHUwMDNDXHUwMDNEXHUwMDQyXHUwMDQyXHUwMDQyXHUwMDQwXHUwMDQyXHUwMDQyIgorICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIEAgICAgQSAgICAgQiAgICAgQyAgICAgRCAgICAgRSAgICAgRiAgICAgRworICAgICAgICAgICAgICAgICAgICArICJcdTAwNDJcdTAwMDBcdTAwMDFcdTAwMDJcdTAwMDNcdTAwMDRcdTAwMDVcdTAwMDYiCisgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgSCAgICBJICAgSiBLICAgTCAgICAgTSAgIE4gICBPCisgICAgICAgICAgICAgICAgICAgICsgIlx1MDAwN1x1MDAwOFx0XG5cdTAwMEJcdTAwMENcclx1MDAwRSIKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICBQICAgIFEgICAgIFIgICAgIFMgICAgIFQgICAgIFUgICAgIFYgICAgVworICAgICAgICAgICAgICAgICAgICArICJcdTAwMEZcdTAwMTBcdTAwMTFcdTAwMTJcdTAwMTNcdTAwMTRcdTAwMTVcdTAwMTYiCisgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgWCAgICBZICAgICBaICAgICBbICAgICBcICAgICBdICAgICBeICAgIF8KKyAgICAgICAgICAgICAgICAgICAgKyAiXHUwMDE3XHUwMDE4XHUwMDE5XHUwMDQyXHUwMDQyXHUwMDQyXHUwMDQyXHUwMDQyIgorICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICcgICAgYSAgICAgYiAgICAgYyAgICAgZCAgICAgZSAgICAgZiAgICAgZworICAgICAgICAgICAgICAgICAgICArICJcdTAwNDJcdTAwMUFcdTAwMUJcdTAwMUNcdTAwMURcdTAwMUVcdTAwMUZcdTAwMjAiCisgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICBoICAgaSAgIGogICAgIGsgICAgIGwgICAgIG0gICAgIG4gICAgIG8gICAgcAorICAgICAgICAgICAgICAgICAgICArICJcdTAwMjFcIlx1MDAyM1x1MDAyNFx1MDAyNVx1MDAyNlx1MDAyN1x1MDAyOCIKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgIHAgICAgIHEgICAgIHIgICAgIHMgICAgIHQgICAgIHUgICAgIHYgICAgIHcKKyAgICAgICAgICAgICAgICAgICAgKyAiXHUwMDI5XHUwMDJBXHUwMDJCXHUwMDJDXHUwMDJEXHUwMDJFXHUwMDJGXHUwMDMwIgorICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgeCAgICAgeSAgICAgegorICAgICAgICAgICAgICAgICAgICArICJcdTAwMzFcdTAwMzJcdTAwMzMiKS5nZXRCeXRlcygpOworCisgICAgLyoqCisgICAgICogRGVjb2RlIHRoZSBTdGluZyBmcm9tIGJhc2U2NCBpbnRvIGEgYnl0ZSBhcnJheS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgc3RyaW5nIHRvIGJlIGRlY29kZWQKKyAgICAgKiBAcmV0dXJuIHRoZSBkZWNvZGVkIGJ5dGVzIGFzIGFuIGFycmF5CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBieXRlW10gZGVjb2RlQmFzZTY0KFN0cmluZyB2YWx1ZSkgeworICAgICAgICBpbnQgYnl0ZVNoaWZ0ID0gNDsKKyAgICAgICAgaW50IHRtcCA9IDA7CisgICAgICAgIGJvb2xlYW4gZG9uZSA9IGZhbHNlOworICAgICAgICBmaW5hbCBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpICE9IHZhbHVlLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIGNoYXIgYyA9IHZhbHVlLmNoYXJBdChpKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBzaXhCaXQgPSAoYyA8IDEyMykgPyBUUkFOU0xBVEVfVEFCTEVbY10gOiA2NjsKKworICAgICAgICAgICAgaWYgKHNpeEJpdCA8IDY0KSB7CisgICAgICAgICAgICAgICAgaWYgKGRvbmUpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCI9IGNoYXJhY3RlciBub3QgYXQgZW5kIG9mIGJhc2U2NCB2YWx1ZSIpOyAvLyBUT0RPOiBjaGFuZ2UgdGhpcyBleGNlcHRpb24gdHlwZQorCisgICAgICAgICAgICAgICAgdG1wID0gKHRtcCA8PCA2KSB8IHNpeEJpdDsKKworICAgICAgICAgICAgICAgIGlmIChieXRlU2hpZnQtLSAhPSA0KSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoKGNoYXIpICgodG1wID4+IChieXRlU2hpZnQgKiAyKSkgJiAwWEZGKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9IGVsc2UgaWYgKHNpeEJpdCA9PSA2NCkgeworCisgICAgICAgICAgICAgICAgYnl0ZVNoaWZ0LS07CisgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7CisKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc2l4Qml0ID09IDY2KSB7CisgICAgICAgICAgICAgICAgLy8gUkZDIDIwNDUgc2F5cyB0aGF0IEknbSBhbGxvd2VkIHRvIHRha2UgdGhlIHByZXNlbmNlIG9mCisgICAgICAgICAgICAgICAgLy8gdGhlc2UgY2hhcmFjdGVycyBhcyBldmVkZW5jZSBvZiBkYXRhIGNvcnJ1cHRpb24KKyAgICAgICAgICAgICAgICAvLyBTbyBJIHdpbGwKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiYmFkIGNoYXJhY3RlciBpbiBiYXNlNjQgdmFsdWUiKTsgLy8gVE9ETzogY2hhbmdlIHRoaXMgZXhjZXB0aW9uIHR5cGUKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGJ5dGVTaGlmdCA9PSAwKSBieXRlU2hpZnQgPSA0OworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKS5nZXRCeXRlcygiSVNPLTg4NTktMSIpOworICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJCYXNlIDY0IGRlY29kZSBwcm9kdWNlZCBieXRlIHZhbHVlcyA+IDI1NSIpOyAvLyBUT0RPOiBjaGFuZ2UgdGhpcyBleGNlcHRpb24gdHlwZQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50cyB0aGUgZ2V0QXQoaW50KSBtZXRob2QgZm9yIHByaW1pdHZlIHR5cGUgYXJyYXlzLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgYW4gYXJyYXkgb2JqZWN0CisgICAgICogQHBhcmFtIGlkeCAgdGhlIGluZGV4IG9mIGludGVyZXN0CisgICAgICogQHJldHVybiB0aGUgcmV0dXJuZWQgdmFsdWUgZnJvbSB0aGUgYXJyYXkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIE9iamVjdCBwcmltaXRpdmVBcnJheUdldChPYmplY3Qgc2VsZiwgaW50IGlkeCkgeworICAgICAgICByZXR1cm4gQXJyYXkuZ2V0KHNlbGYsIG5vcm1hbGlzZUluZGV4KGlkeCwgQXJyYXkuZ2V0TGVuZ3RoKHNlbGYpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50cyB0aGUgZ2V0QXQoUmFuZ2UpIG1ldGhvZCBmb3IgcHJpbWl0dmUgdHlwZSBhcnJheXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgYW4gYXJyYXkgb2JqZWN0CisgICAgICogQHBhcmFtIHJhbmdlIHRoZSByYW5nZSBvZiBpbmRpY2VzIG9mIGludGVyZXN0CisgICAgICogQHJldHVybiB0aGUgcmV0dXJuZWQgdmFsdWVzIGZyb20gdGhlIGFycmF5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJhbmdlCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBMaXN0IHByaW1pdGl2ZUFycmF5R2V0KE9iamVjdCBzZWxmLCBSYW5nZSByYW5nZSkgeworICAgICAgICBMaXN0IGFuc3dlciA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gcmFuZ2UuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBpbnQgaWR4ID0gRGVmYXVsdFR5cGVUcmFuc2Zvcm1hdGlvbi5pbnRVbmJveChpdGVyLm5leHQoKSk7CisgICAgICAgICAgICBhbnN3ZXIuYWRkKHByaW1pdGl2ZUFycmF5R2V0KHNlbGYsIGlkeCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhbnN3ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50cyB0aGUgZ2V0QXQoQ29sbGVjdGlvbikgbWV0aG9kIGZvciBwcmltaXR2ZSB0eXBlIGFycmF5cy4gIEVhY2gKKyAgICAgKiB2YWx1ZSBpbiB0aGUgY29sbGVjdGlvbiBhcmd1bWVudCBpcyBhc3N1bWVkIHRvIGJlIGEgdmFsaWQgYXJyYXkgaW5kZXguCisgICAgICogVGhlIHZhbHVlIGF0IGVhY2ggaW5kZXggaXMgdGhlbiBhZGRlZCB0byBhIGxpc3Qgd2hpY2ggaXMgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgICBhbiBhcnJheSBvYmplY3QKKyAgICAgKiBAcGFyYW0gaW5kaWNlcyB0aGUgaW5kaWNlcyBvZiBpbnRlcmVzdAorICAgICAqIEByZXR1cm4gdGhlIHJldHVybmVkIHZhbHVlcyBmcm9tIHRoZSBhcnJheQorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgTGlzdCBwcmltaXRpdmVBcnJheUdldChPYmplY3Qgc2VsZiwgQ29sbGVjdGlvbiBpbmRpY2VzKSB7CisgICAgICAgIExpc3QgYW5zd2VyID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBpbmRpY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gaXRlci5uZXh0KCk7CisgICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBSYW5nZSkgeworICAgICAgICAgICAgICAgIGFuc3dlci5hZGRBbGwocHJpbWl0aXZlQXJyYXlHZXQoc2VsZiwgKFJhbmdlKSB2YWx1ZSkpOworICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExpc3QpIHsKKyAgICAgICAgICAgICAgICBhbnN3ZXIuYWRkQWxsKHByaW1pdGl2ZUFycmF5R2V0KHNlbGYsIChMaXN0KSB2YWx1ZSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgaWR4ID0gRGVmYXVsdFR5cGVUcmFuc2Zvcm1hdGlvbi5pbnRVbmJveCh2YWx1ZSk7CisgICAgICAgICAgICAgICAgYW5zd2VyLmFkZChwcmltaXRpdmVBcnJheUdldChzZWxmLCBpZHgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYW5zd2VyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudHMgdGhlIHNldEF0KGludCBpZHgpIG1ldGhvZCBmb3IgcHJpbWl0dmUgdHlwZSBhcnJheXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgICAgYW4gb2JqZWN0CisgICAgICogQHBhcmFtIGlkeCAgICAgIHRoZSBpbmRleCBvZiBpbnRlcmVzdAorICAgICAqIEBwYXJhbSBuZXdWYWx1ZSB0aGUgbmV3IHZhbHVlIHRvIGJlIHB1dCBpbnRvIHRoZSBpbmRleCBvZiBpbnRlcmVzdAorICAgICAqIEByZXR1cm4gdGhlIGFkZGVkIHZhbHVlCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBPYmplY3QgcHJpbWl0aXZlQXJyYXlQdXQoT2JqZWN0IHNlbGYsIGludCBpZHgsIE9iamVjdCBuZXdWYWx1ZSkgeworICAgICAgICBBcnJheS5zZXQoc2VsZiwgbm9ybWFsaXNlSW5kZXgoaWR4LCBBcnJheS5nZXRMZW5ndGgoc2VsZikpLCBuZXdWYWx1ZSk7CisgICAgICAgIHJldHVybiBuZXdWYWx1ZTsKKyAgICB9CisKKyAgICAvLyBTdHJpbmcgbWV0aG9kcworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLyoqCisgICAgICogQ29udmVydHMgdGhlIGdpdmVuIHN0cmluZyBpbnRvIGEgQ2hhcmFjdGVyIG9iamVjdAorICAgICAqIHVzaW5nIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmIGEgU3RyaW5nCisgICAgICogQHJldHVybiB0aGUgZmlyc3QgQ2hhcmFjdGVyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDaGFyYWN0ZXIgdG9DaGFyYWN0ZXIoU3RyaW5nIHNlbGYpIHsKKyAgICAgICAgLyoqIEB0b2RvIHVzZSBjYWNoZT8gKi8KKyAgICAgICAgcmV0dXJuIG5ldyBDaGFyYWN0ZXIoc2VsZi5jaGFyQXQoMCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIHRoZSBnaXZlbiBzdHJpbmcgaW50byBhIEJvb2xlYW4gb2JqZWN0LgorICAgICAqIElmIHRoZSB0cmltbWVkIHN0cmluZyBpcyAidHJ1ZSIsICJ5IiBvciAiMSIgKGlnbm9yaW5nIGNhc2UpCisgICAgICogdGhlbiB0aGUgcmVzdWx0IGlzIHRydWUgb3RoZXdyd2lzZSBpdCBpcyBmYWxzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmIGEgU3RyaW5nCisgICAgICogQHJldHVybiBUaGUgQm9vbGVhbiB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQm9vbGVhbiB0b0Jvb2xlYW4oU3RyaW5nIHNlbGYpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHRyaW1tZWQgPSBzZWxmLnRyaW0oKTsKKworICAgICAgICBpZiAoInRydWUiLmVxdWFsc0lnbm9yZUNhc2UodHJpbW1lZCkgfHwgInkiLmVxdWFsc0lnbm9yZUNhc2UodHJpbW1lZCkgfHwgIjEiLmVxdWFscyh0cmltbWVkKSkgeworICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBCb29sZWFuLkZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHNwbGl0IGEgc3RyaW5nICh3aXRoIHdoaXRlc3BhY2UgYXMgZGVsaW1pdGVyKQorICAgICAqIExpa2UgdG9rZW5pemUsIGJ1dCByZXR1cm5zIGFuIEFycmF5IG9mIFN0cmluZ3MgaW5zdGVhZCBvZiBhIExpc3QKKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmIHRoZSBzdHJpbmcgdG8gc3BsaXQKKyAgICAgKiBAcmV0dXJuIFN0cmluZ1tdIHJlc3VsdCBvZiBzcGxpdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gc3BsaXQoU3RyaW5nIHNlbGYpIHsKKyAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihzZWxmKTsKKyAgICAgICAgU3RyaW5nW10gc3RyaW5ncyA9IG5ldyBTdHJpbmdbc3QuY291bnRUb2tlbnMoKV07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyaW5ncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgc3RyaW5nc1tpXSA9IHN0Lm5leHRUb2tlbigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdHJpbmdzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRva2VuaXplIGEgU3RyaW5nIGJhc2VkIG9uIHRoZSBnaXZlbiBzdHJpbmcgZGVsaW1pdGVyLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgIGEgU3RyaW5nCisgICAgICogQHBhcmFtIHRva2VuIHRoZSBkZWxpbWl0ZXIKKyAgICAgKiBAcmV0dXJuIGEgTGlzdCBvZiB0b2tlbnMKKyAgICAgKiBAc2VlIGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXIjU3RyaW5nVG9rZW5pemVyKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMaXN0IHRva2VuaXplKFN0cmluZyBzZWxmLCBTdHJpbmcgdG9rZW4pIHsKKyAgICAgICAgcmV0dXJuIEludm9rZXJIZWxwZXIuYXNMaXN0KG5ldyBTdHJpbmdUb2tlbml6ZXIoc2VsZiwgdG9rZW4pKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUb2tlbml6ZSBhIFN0cmluZyAod2l0aCBhIHdoaXRlc3BhY2UgYXMgdGhlIGRlbGltaXRlcikuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiBhIFN0cmluZworICAgICAqIEByZXR1cm4gYSBMaXN0IG9mIHRva2VucworICAgICAqIEBzZWUgU3RyaW5nVG9rZW5pemVyI1N0cmluZ1Rva2VuaXplcihqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlzdCB0b2tlbml6ZShTdHJpbmcgc2VsZikgeworICAgICAgICByZXR1cm4gSW52b2tlckhlbHBlci5hc0xpc3QobmV3IFN0cmluZ1Rva2VuaXplcihzZWxmKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwZW5kcyB0aGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBvcGVyYW5kIHRvIHRoaXMgc3RyaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIGxlZnQgIGEgU3RyaW5nCisgICAgICogQHBhcmFtIHZhbHVlIGFueSBPYmplY3QKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXcgc3RyaW5nIHdpdGggdGhlIG9iamVjdCBhcHBlbmRlZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHBsdXMoU3RyaW5nIGxlZnQsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gbGVmdCArIHRvU3RyaW5nKHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmRzIGEgU3RyaW5nIHRvIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBudW1iZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUgYSBOdW1iZXIKKyAgICAgKiBAcGFyYW0gcmlnaHQgYSBTdHJpbmcKKyAgICAgKiBAcmV0dXJuIGEgU3RyaW5nCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcGx1cyhOdW1iZXIgdmFsdWUsIFN0cmluZyByaWdodCkgeworICAgICAgICByZXR1cm4gdG9TdHJpbmcodmFsdWUpICsgcmlnaHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwZW5kcyBhIFN0cmluZyB0byB0aGlzIFN0cmluZ0J1ZmZlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsZWZ0ICBhIFN0cmluZ0J1ZmZlcgorICAgICAqIEBwYXJhbSB2YWx1ZSBhIFN0cmluZworICAgICAqIEByZXR1cm4gYSBTdHJpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBwbHVzKFN0cmluZ0J1ZmZlciBsZWZ0LCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIGxlZnQgKyB2YWx1ZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIHBhcnQgb2YgYSBTdHJpbmcuICBUaGlzIGVzc2VudGlhbGx5IHJlcGxhY2VzIHRoZSBmaXJzdAorICAgICAqIG9jY3VycmVuY2Ugb2YgdGhlIG9wZXJhbmQgd2l0aCAnJyBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LgorICAgICAqCisgICAgICogQHBhcmFtIGxlZnQgIGEgU3RyaW5nCisgICAgICogQHBhcmFtIHZhbHVlIGEgU3RyaW5nIHBhcnQgdG8gcmVtb3ZlCisgICAgICogQHJldHVybiBhIFN0cmluZyBtaW51cyB0aGUgcGFydCB0byBiZSByZW1vdmVkCisgICAgICogQHNlZSBTdHJpbmcjcmVwbGFjZUZpcnN0KFN0cmluZyxTdHJpbmcpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbWludXMoU3RyaW5nIGxlZnQsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBTdHJpbmcgdGV4dCA9IHRvU3RyaW5nKHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIGxlZnQucmVwbGFjZUZpcnN0KHRleHQsICIiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlIGFuIGltcGxlbWVudGF0aW9uIG9mIGNvbnRhaW5zKCkgbGlrZQorICAgICAqIHtAbGluayBDb2xsZWN0aW9uI2NvbnRhaW5zKE9iamVjdCl9IHRvIG1ha2UgU3RyaW5ncyBtb3JlIHBvbHltb3JwaGljLgorICAgICAqIFRoaXMgbWV0aG9kIGlzIG5vdCByZXF1aXJlZCBvbiBKREsgMS41IG9ud2FyZHMKKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmIGEgU3RyaW5nCisgICAgICogQHBhcmFtIHRleHQgYSBTdHJpbmcgdG8gbG9vayBmb3IKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBzdHJpbmcgY29udGFpbnMgdGhlIGdpdmVuIHRleHQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnMoU3RyaW5nIHNlbGYsIFN0cmluZyB0ZXh0KSB7CisgICAgICAgIGludCBpZHggPSBzZWxmLmluZGV4T2YodGV4dCk7CisgICAgICAgIHJldHVybiBpZHggPj0gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb3VudCB0aGUgbnVtYmVyIG9mIG9jY3VyZW5jaWVzIG9mIGEgc3Vic3RyaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgYSBTdHJpbmcKKyAgICAgKiBAcGFyYW0gdGV4dCBhIHN1YnN0cmluZworICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBvY2N1cnJlbmNpZXMgb2YgdGhlIGdpdmVuIHN0cmluZyBpbnNpZGUgdGhpcyBTdHJpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBjb3VudChTdHJpbmcgc2VsZiwgU3RyaW5nIHRleHQpIHsKKyAgICAgICAgaW50IGFuc3dlciA9IDA7CisgICAgICAgIGZvciAoaW50IGlkeCA9IDA7IHRydWU7IGlkeCsrKSB7CisgICAgICAgICAgICBpZHggPSBzZWxmLmluZGV4T2YodGV4dCwgaWR4KTsKKyAgICAgICAgICAgIGlmIChpZHggPj0gMCkgeworICAgICAgICAgICAgICAgICsrYW5zd2VyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYW5zd2VyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgKysgb3BlcmF0b3IgZm9yIHRoZSBjbGFzcyBTdHJpbmcuCisgICAgICogSXQgaW5jcmVtZW50cyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGdpdmVuIHN0cmluZy4gSWYgdGhlCisgICAgICogY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcgaXMgQ2hhcmFjdGVyLk1BWF9WQUxVRSBhIENoYXJhY3Rlci5NSU5fVkFMVUUKKyAgICAgKiB3aWxsIGJlIGFwcGVuZGVkLiBUaGUgZW1wdHkgc3RyaW5nIGlzIGluY3JlbWVudGVkIHRvIGEgc3RyaW5nCisgICAgICogY29uc2lzdGluZyBvZiB0aGUgY2hhcmFjdGVyIENoYXJhY3Rlci5NSU5fVkFMVUUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiBhIFN0cmluZworICAgICAqIEByZXR1cm4gYW4gaW5jcmVtZW50ZWQgU3RyaW5nCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbmV4dChTdHJpbmcgc2VsZikgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihzZWxmKTsKKyAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKENoYXJhY3Rlci5NSU5fVkFMVUUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2hhciBsYXN0ID0gYnVmZmVyLmNoYXJBdChidWZmZXIubGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgICAgIGlmIChsYXN0ID09IENoYXJhY3Rlci5NQVhfVkFMVUUpIHsKKyAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKENoYXJhY3Rlci5NSU5fVkFMVUUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjaGFyIG5leHQgPSBsYXN0OworICAgICAgICAgICAgICAgIG5leHQrKzsKKyAgICAgICAgICAgICAgICBidWZmZXIuc2V0Q2hhckF0KGJ1ZmZlci5sZW5ndGgoKSAtIDEsIG5leHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIC0tIG9wZXJhdG9yIGZvciB0aGUgY2xhc3MgU3RyaW5nLgorICAgICAqIEl0IGRlY3JlbWVudHMgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBnaXZlbiBzdHJpbmcuIElmIHRoZQorICAgICAqIGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nIGlzIENoYXJhY3Rlci5NSU5fVkFMVUUgaXQgd2lsbCBiZSBkZWxldGVkLgorICAgICAqIFRoZSBlbXB0eSBzdHJpbmcgY2FuJ3QgYmUgZGVjcmVtZW50ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiBhIFN0cmluZworICAgICAqIEByZXR1cm4gYSBTdHJpbmcgd2l0aCBhIGRlY3JlbWVudGVkIGRpZ2l0IGF0IHRoZSBlbmQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBwcmV2aW91cyhTdHJpbmcgc2VsZikgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihzZWxmKTsKKyAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGgoKSA9PSAwKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ0aGUgc3RyaW5nIGlzIGVtcHR5Iik7CisgICAgICAgIGNoYXIgbGFzdCA9IGJ1ZmZlci5jaGFyQXQoYnVmZmVyLmxlbmd0aCgpIC0gMSk7CisgICAgICAgIGlmIChsYXN0ID09IENoYXJhY3Rlci5NSU5fVkFMVUUpIHsKKyAgICAgICAgICAgIGJ1ZmZlci5kZWxldGVDaGFyQXQoYnVmZmVyLmxlbmd0aCgpIC0gMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjaGFyIG5leHQgPSBsYXN0OworICAgICAgICAgICAgbmV4dC0tOworICAgICAgICAgICAgYnVmZmVyLnNldENoYXJBdChidWZmZXIubGVuZ3RoKCkgLSAxLCBuZXh0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZXMgdGhlIGdpdmVuIHN0cmluZyBhcyBhIGNvbW1hbmQgbGluZSBwcm9jZXNzLiBGb3IgbW9yZSBjb250cm9sCisgICAgICogb3ZlciB0aGUgcHJvY2VzcyBtZWNoYW5pc20gaW4gSkRLIDEuNSB5b3UgY2FuIHVzZSBqYXZhLmxhbmcuUHJvY2Vzc0J1aWxkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiBhIGNvbW1hbmQgbGluZSBTdHJpbmcKKyAgICAgKiBAcmV0dXJuIHRoZSBQcm9jZXNzIHdoaWNoIGhhcyBqdXN0IHN0YXJ0ZWQgZm9yIHRoaXMgY29tbWFuZCBsaW5lIHN0cmluZworICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gSU9FeGNlcHRpb24gb2NjdXJzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUHJvY2VzcyBleGVjdXRlKFN0cmluZyBzZWxmKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gUnVudGltZS5nZXRSdW50aW1lKCkuZXhlYyhzZWxmKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlcyB0aGUgY29tbWFuZCBzcGVjaWZpZWQgYnkgdGhlIDxjb2RlPlN0cmluZzwvY29kZT4gYXJyYXkgdGhhdCBpcyB0aGUgcGFyYW1ldGVyLgorICAgICAqIFRoZSBmaXJzdCBpdGVtIGluIHRoZSBhcnJheSBpcyB0aGUgY29tbWFuZCB0aGUgb3RoZXJzIGFyZSB0aGUgcGFyYW1ldGVycy4gRm9yIG1vcmUKKyAgICAgKiBjb250cm9sIG92ZXIgdGhlIHByb2Nlc3MgbWVjaGFuaXNtIGluIEpESyAxLjUgeW91IGNhbiB1c2UKKyAgICAgKiA8Y29kZT5qYXZhLmxhbmcuUHJvY2Vzc0J1aWxkZXI8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbW1hbmRBcnJheSBhbiBhcnJheSBvZiA8Y29kZT5TdHJpbmc8Y29kZT4gY29udGFpbmluZyB0aGUgY29tbWFuZCBuYW1lIGFuZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyBhcyBzZXBhcmF0ZSBpdGVtcyBpbiB0aGUgYXJyYXkuCisgICAgICogQHJldHVybiB0aGUgUHJvY2VzcyB3aGljaCBoYXMganVzdCBzdGFydGVkIGZvciB0aGlzIGNvbW1hbmQgbGluZSBzdHJpbmcuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBJT0V4Y2VwdGlvbiBvY2N1cnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBQcm9jZXNzIGV4ZWN1dGUoU3RyaW5nW10gY29tbWFuZEFycmF5KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gUnVudGltZS5nZXRSdW50aW1lKCkuZXhlYyhjb21tYW5kQXJyYXkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4ZWN1dGVzIHRoZSBjb21tYW5kIHNwZWNpZmllZCBieSB0aGUgPGNvZGU+c2VsZjwvY29kZT4gd2l0aCBlbnZpcm9ubWVudHMgPGNvZGU+ZW52cDwvY29kZT4KKyAgICAgKiB1bmRlciB0aGUgd29ya2luZyBkaXJlY3RvcnkgPGNvZGU+ZGlyPC9jb2RlPi4KKyAgICAgKiBGb3IgbW9yZSBjb250cm9sIG92ZXIgdGhlIHByb2Nlc3MgbWVjaGFuaXNtIGluIEpESyAxLjUgeW91IGNhbiB1c2UgPGNvZGU+amF2YS5sYW5nLlByb2Nlc3NCdWlsZGVyPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmIGEgY29tbWFuZCBsaW5lIFN0cmluZyB0byBiZSBleGVjdXRlZC4KKyAgICAgKiBAcGFyYW0gZW52cCBhbiBhcnJheSBvZiBTdHJpbmdzLCBlYWNoIGVsZW1lbnQgb2Ygd2hpY2gKKyAgICAgKiAgICAgICAgICAgICBoYXMgZW52aXJvbm1lbnQgdmFyaWFibGUgc2V0dGluZ3MgaW4gdGhlIGZvcm1hdAorICAgICAqICAgICAgICAgICAgIDxpPm5hbWU8L2k+PTxpPnZhbHVlPC9pPiwgb3IKKyAgICAgKiAgICAgICAgICAgICA8dHQ+bnVsbDwvdHQ+IGlmIHRoZSBzdWJwcm9jZXNzIHNob3VsZCBpbmhlcml0CisgICAgICogICAgICAgICAgICAgdGhlIGVudmlyb25tZW50IG9mIHRoZSBjdXJyZW50IHByb2Nlc3MuCisgICAgICogQHBhcmFtIGRpciAgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IG9mIHRoZSBzdWJwcm9jZXNzLCBvcgorICAgICAqICAgICAgICAgICAgIDx0dD5udWxsPC90dD4gaWYgdGhlIHN1YnByb2Nlc3Mgc2hvdWxkIGluaGVyaXQKKyAgICAgKiAgICAgICAgICAgICB0aGUgd29ya2luZyBkaXJlY3Rvcnkgb2YgdGhlIGN1cnJlbnQgcHJvY2Vzcy4KKyAgICAgKiBAcmV0dXJuIHRoZSBQcm9jZXNzIHdoaWNoIGhhcyBqdXN0IHN0YXJ0ZWQgZm9yIHRoaXMgY29tbWFuZCBsaW5lIHN0cmluZy4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIElPRXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFByb2Nlc3MgZXhlY3V0ZShTdHJpbmcgc2VsZiwgZmluYWwgU3RyaW5nW10gZW52cCwgRmlsZSBkaXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBSdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKHNlbGYsIGVudnAsIGRpcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZXMgdGhlIGNvbW1hbmQgc3BlY2lmaWVkIGJ5IHRoZSA8Y29kZT5TdHJpbmc8L2NvZGU+IGxpc3QgdGhhdCBpcyB0aGUgcGFyYW1ldGVyLgorICAgICAqIFRoZSBmaXJzdCBpdGVtIGluIHRoZSBhcnJheSBpcyB0aGUgY29tbWFuZCB0aGUgb3RoZXJzIGFyZSB0aGUgcGFyYW1ldGVycy4gQWxsIGVudHJpZXMKKyAgICAgKiBtdXN0IGJlIDxjb2RlPlN0cmluZzwvY29kZT5zLiAgRm9yIG1vcmUgY29udHJvbCBvdmVyIHRoZSBwcm9jZXNzIG1lY2hhbmlzbSBpbiBKREsgMS41IHlvdQorICAgICAqIGNhbiB1c2UgPGNvZGU+amF2YS5sYW5nLlByb2Nlc3NCdWlsZGVyPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb21tYW5kTGlzdCBhIGxpc3Qgb2YgPGNvZGU+U3RyaW5nPGNvZGU+IGNvbnRhaW5pbmcgdGhlIGNvbW1hbmQgbmFtZSBhbmQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyBhcyBzZXBhcmF0ZSBpdGVtcyBpbiB0aGUgbGlzdC4KKyAgICAgKiBAcmV0dXJuIHRoZSBQcm9jZXNzIHdoaWNoIGhhcyBqdXN0IHN0YXJ0ZWQgZm9yIHRoaXMgY29tbWFuZCBsaW5lIHN0cmluZy4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIElPRXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFByb2Nlc3MgZXhlY3V0ZShMaXN0IGNvbW1hbmRMaXN0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmdbXSBjb21tYW5kQXJyYXkgPSBuZXcgU3RyaW5nW2NvbW1hbmRMaXN0LnNpemUoKV07CisgICAgICAgIEl0ZXJhdG9yIGl0ID0gY29tbWFuZExpc3QuaXRlcmF0b3IoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGl0Lmhhc05leHQoKTsgKytpKSB7CisgICAgICAgICAgICBjb21tYW5kQXJyYXlbaV0gPSBpdC5uZXh0KCkudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXhlY3V0ZShjb21tYW5kQXJyYXkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4ZWN1dGVzIHRoZSBjb21tYW5kIHNwZWNpZmllZCBieSB0aGUgPGNvZGU+c2VsZjwvY29kZT4gd2l0aCBlbnZpcm9ubWVudHMgPGNvZGU+ZW52cDwvY29kZT4KKyAgICAgKiB1bmRlciB0aGUgd29ya2luZyBkaXJlY3RvcnkgPGNvZGU+ZGlyPC9jb2RlPi4KKyAgICAgKiBGb3IgbW9yZSBjb250cm9sIG92ZXIgdGhlIHByb2Nlc3MgbWVjaGFuaXNtIGluIEpESyAxLjUgeW91IGNhbiB1c2UgPGNvZGU+amF2YS5sYW5nLlByb2Nlc3NCdWlsZGVyPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmIGEgY29tbWFuZCBsaW5lIFN0cmluZyB0byBiZSBleGVjdXRlZC4KKyAgICAgKiBAcGFyYW0gZW52cCBhIExpc3Qgb2YgU3RyaW5ncywgZWFjaCBtZW1iZXIgb2Ygd2hpY2gKKyAgICAgKiAgICAgICAgICAgICBoYXMgZW52aXJvbm1lbnQgdmFyaWFibGUgc2V0dGluZ3MgaW4gdGhlIGZvcm1hdAorICAgICAqICAgICAgICAgICAgIDxpPm5hbWU8L2k+PTxpPnZhbHVlPC9pPiwgb3IKKyAgICAgKiAgICAgICAgICAgICA8dHQ+bnVsbDwvdHQ+IGlmIHRoZSBzdWJwcm9jZXNzIHNob3VsZCBpbmhlcml0CisgICAgICogICAgICAgICAgICAgdGhlIGVudmlyb25tZW50IG9mIHRoZSBjdXJyZW50IHByb2Nlc3MuCisgICAgICogQHBhcmFtIGRpciAgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IG9mIHRoZSBzdWJwcm9jZXNzLCBvcgorICAgICAqICAgICAgICAgICAgIDx0dD5udWxsPC90dD4gaWYgdGhlIHN1YnByb2Nlc3Mgc2hvdWxkIGluaGVyaXQKKyAgICAgKiAgICAgICAgICAgICB0aGUgd29ya2luZyBkaXJlY3Rvcnkgb2YgdGhlIGN1cnJlbnQgcHJvY2Vzcy4KKyAgICAgKiBAcmV0dXJuIHRoZSBQcm9jZXNzIHdoaWNoIGhhcyBqdXN0IHN0YXJ0ZWQgZm9yIHRoaXMgY29tbWFuZCBsaW5lIHN0cmluZy4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIElPRXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFByb2Nlc3MgZXhlY3V0ZShTdHJpbmcgc2VsZiwgTGlzdCBlbnZwLCBGaWxlIGRpcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGVudnAgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGV4ZWN1dGUoc2VsZiwgKFN0cmluZ1tdKSBudWxsLCBkaXIpOworICAgICAgICB9CisgICAgICAgIFN0cmluZ1tdIGNvbW1hbmRBcnJheSA9IG5ldyBTdHJpbmdbZW52cC5zaXplKCldOworICAgICAgICBJdGVyYXRvciBpdCA9IGVudnAuaXRlcmF0b3IoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGl0Lmhhc05leHQoKTsgKytpKSB7CisgICAgICAgICAgICBjb21tYW5kQXJyYXlbaV0gPSBpdC5uZXh0KCkudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXhlY3V0ZShzZWxmLCBjb21tYW5kQXJyYXksIGRpcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwZWF0IGEgU3RyaW5nIGEgY2VydGFpbiBudW1iZXIgb2YgdGltZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgIGEgU3RyaW5nIHRvIGJlIHJlcGVhdGVkCisgICAgICogQHBhcmFtIGZhY3RvciB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBTdHJpbmcgc2hvdWxkIGJlIHJlcGVhdGVkCisgICAgICogQHJldHVybiBhIFN0cmluZyBjb21wb3NlZCBvZiBhIHJlcGV0aXRpb24KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbnVtYmVyIG9mIHJlcGVhdGl0aW9uIGlzICZsdDsgMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG11bHRpcGx5KFN0cmluZyBzZWxmLCBOdW1iZXIgZmFjdG9yKSB7CisgICAgICAgIGludCBzaXplID0gZmFjdG9yLmludFZhbHVlKCk7CisgICAgICAgIGlmIChzaXplID09IDApCisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIGVsc2UgaWYgKHNpemUgPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtdWx0aXBseSgpIHNob3VsZCBiZSBjYWxsZWQgd2l0aCBhIG51bWJlciBvZiAwIG9yIGdyZWF0ZXIgbm90OiAiICsgc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nQnVmZmVyIGFuc3dlciA9IG5ldyBTdHJpbmdCdWZmZXIoc2VsZik7CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBhbnN3ZXIuYXBwZW5kKHNlbGYpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhbnN3ZXIudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIG1hcC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmIGEgTWFwCisgICAgICogQHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uCisgICAgICogQHNlZSAjdG9NYXBTdHJpbmcoTWFwKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKE1hcCBzZWxmKSB7CisgICAgICAgIHJldHVybiB0b01hcFN0cmluZyhzZWxmKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBtYXAuICBUaGUgc3RyaW5nIGRpc3BsYXlzIHRoZQorICAgICAqIGNvbnRlbnRzIG9mIHRoZSBtYXAsIGkuZS4gPGNvZGU+e29uZT0xLCB0d289MiwgdGhyZWU9M308L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgYSBNYXAKKyAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b01hcFN0cmluZyhNYXAgc2VsZikgeworICAgICAgICByZXR1cm4gKHNlbGYgPT0gbnVsbCkgPyAibnVsbCIgOiBJbnZva2VySGVscGVyLnRvTWFwU3RyaW5nKHNlbGYpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gY29sbGVjdGlvbi4gIFRoZSBzdHJpbmcKKyAgICAgKiBkaXNwbGF5cyB0aGUgY29udGVudHMgb2YgdGhlIGNvbGxlY3Rpb24sIGkuZS4KKyAgICAgKiA8Y29kZT5bMSwgMiwgYV08L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgYSBDb2xsZWN0aW9uCisgICAgICogQHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uCisgICAgICogQHNlZSAjdG9MaXN0U3RyaW5nKENvbGxlY3Rpb24pCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoQ29sbGVjdGlvbiBzZWxmKSB7CisgICAgICAgIHJldHVybiB0b0xpc3RTdHJpbmcoc2VsZik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBsaXN0LiAgVGhlIHN0cmluZworICAgICAqIGRpc3BsYXlzIHRoZSBjb250ZW50cyBvZiB0aGUgbGlzdCwgc2ltaWxhciB0byBhIGxpc3QgbGl0ZXJhbCwgaS5lLgorICAgICAqIDxjb2RlPlsxLCAyLCBhXTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiBhIENvbGxlY3Rpb24KKyAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b0xpc3RTdHJpbmcoQ29sbGVjdGlvbiBzZWxmKSB7CisgICAgICAgIHJldHVybiAoc2VsZiA9PSBudWxsKSA/ICJudWxsIiA6IEludm9rZXJIZWxwZXIudG9MaXN0U3RyaW5nKHNlbGYpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGFycmF5J3MgY29udGVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiBhbiBPYmplY3RbXQorICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbgorICAgICAqIEBzZWUgI3RvQXJyYXlTdHJpbmcoT2JqZWN0W10pCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoT2JqZWN0W10gc2VsZikgeworICAgICAgICByZXR1cm4gdG9BcnJheVN0cmluZyhzZWxmKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIGFycmF5LiAgVGhlIHN0cmluZworICAgICAqIGRpc3BsYXlzIHRoZSBjb250ZW50cyBvZiB0aGUgYXJyYXksIHNpbWlsYXIgdG8gYW4gYXJyYXkgbGl0ZXJhbCwgaS5lLgorICAgICAqIDxjb2RlPnsxLCAyLCAiYSJ9PC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmIGFuIE9iamVjdFtdCisgICAgICogQHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9BcnJheVN0cmluZyhPYmplY3RbXSBzZWxmKSB7CisgICAgICAgIHJldHVybiAoc2VsZiA9PSBudWxsKSA/ICJudWxsIiA6IEludm9rZXJIZWxwZXIudG9BcnJheVN0cmluZyhzZWxmKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCisgICAgICogQHBhcmFtIHZhbHVlIGFuIG9iamVjdAorICAgICAqIEByZXR1cm4gYSBzdHJpbmcuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE1hcCkKKyAgICAgICAgICAgIHJldHVybiB0b01hcFN0cmluZygoTWFwKSB2YWx1ZSk7CisgICAgICAgIGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgQ29sbGVjdGlvbikKKyAgICAgICAgICAgIHJldHVybiB0b0xpc3RTdHJpbmcoKENvbGxlY3Rpb24pIHZhbHVlKTsKKyAgICAgICAgZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBPYmplY3RbXSkKKyAgICAgICAgICAgIHJldHVybiB0b0FycmF5U3RyaW5nKChPYmplY3RbXSkgdmFsdWUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gSW52b2tlckhlbHBlci50b1N0cmluZyh2YWx1ZSk7CisgICAgfQorCisgICAgLy8gTnVtYmVyIGJhc2VkIG1ldGhvZHMKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKgorICAgICAqIEluY3JlbWVudCBhIENoYXJhY3RlciBieSBvbmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiBhIENoYXJhY3RlcgorICAgICAqIEByZXR1cm4gYW4gaW5jcmVtZW50ZWQgTnVtYmVyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBOdW1iZXIgbmV4dChDaGFyYWN0ZXIgc2VsZikgeworICAgICAgICByZXR1cm4gcGx1cyhzZWxmLCBPTkUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluY3JlbWVudCBhIE51bWJlciBieSBvbmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiBhIE51bWJlcgorICAgICAqIEByZXR1cm4gYW4gaW5jcmVtZW50ZWQgTnVtYmVyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBOdW1iZXIgbmV4dChOdW1iZXIgc2VsZikgeworICAgICAgICByZXR1cm4gcGx1cyhzZWxmLCBPTkUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlY3JlbWVudCBhIENoYXJhY3RlciBieSBvbmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiBhIENoYXJhY3RlcgorICAgICAqIEByZXR1cm4gYSBkZWNyZW1lbnRlZCBOdW1iZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE51bWJlciBwcmV2aW91cyhDaGFyYWN0ZXIgc2VsZikgeworICAgICAgICByZXR1cm4gbWludXMoc2VsZiwgT05FKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWNyZW1lbnQgYSBOdW1iZXIgYnkgb25lLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgYSBOdW1iZXIKKyAgICAgKiBAcmV0dXJuIGEgZGVjcmVtZW50ZWQgTnVtYmVyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBOdW1iZXIgcHJldmlvdXMoTnVtYmVyIHNlbGYpIHsKKyAgICAgICAgcmV0dXJuIG1pbnVzKHNlbGYsIE9ORSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgQ2hhcmFjdGVyIGFuZCBhIE51bWJlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsZWZ0ICBhIENoYXJhY3RlcgorICAgICAqIEBwYXJhbSByaWdodCBhIE51bWJlcgorICAgICAqIEByZXR1cm4gdGhlIGFkZGl0aW9uIG9mIHRoZSBDaGFyYWN0ZXIgYW5kIHRoZSBOdW1iZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE51bWJlciBwbHVzKENoYXJhY3RlciBsZWZ0LCBOdW1iZXIgcmlnaHQpIHsKKyAgICAgICAgcmV0dXJuIHBsdXMobmV3IEludGVnZXIobGVmdC5jaGFyVmFsdWUoKSksIHJpZ2h0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBOdW1iZXIgYW5kIGEgQ2hhcmFjdGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGxlZnQgIGEgTnVtYmVyCisgICAgICogQHBhcmFtIHJpZ2h0IGEgQ2hhcmFjdGVyCisgICAgICogQHJldHVybiB0aGUgYWRkaXRpb24gb2YgdGhlIENoYXJhY3RlciBhbmQgdGhlIE51bWJlcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTnVtYmVyIHBsdXMoTnVtYmVyIGxlZnQsIENoYXJhY3RlciByaWdodCkgeworICAgICAgICByZXR1cm4gcGx1cyhsZWZ0LCBuZXcgSW50ZWdlcihyaWdodC5jaGFyVmFsdWUoKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCB0d28gQ2hhcmFjdGVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsZWZ0ICBhIENoYXJhY3RlcgorICAgICAqIEBwYXJhbSByaWdodCBhIENoYXJhY3RlcgorICAgICAqIEByZXR1cm4gdGhlIGFkZGl0aW9uIG9mIGJvdGggQ2hhcmFjdGVycworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTnVtYmVyIHBsdXMoQ2hhcmFjdGVyIGxlZnQsIENoYXJhY3RlciByaWdodCkgeworICAgICAgICByZXR1cm4gcGx1cyhuZXcgSW50ZWdlcihsZWZ0LmNoYXJWYWx1ZSgpKSwgcmlnaHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCB0d28gbnVtYmVycyBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGVmdCAgYSBOdW1iZXIKKyAgICAgKiBAcGFyYW0gcmlnaHQgYW5vdGhlciBOdW1iZXIgdG8gYWRkCisgICAgICogQHJldHVybiB0aGUgYWRkaXRpb24gb2YgYm90aCBOdW1iZXJzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBOdW1iZXIgcGx1cyhOdW1iZXIgbGVmdCwgTnVtYmVyIHJpZ2h0KSB7CisgICAgICAgIHJldHVybiBOdW1iZXJNYXRoLmFkZChsZWZ0LCByaWdodCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGFyZSBhIENoYXJhY3RlciBhbmQgYSBOdW1iZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGVmdCAgYSBDaGFyYWN0ZXIKKyAgICAgKiBAcGFyYW0gcmlnaHQgYSBOdW1iZXIKKyAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGNvbXBhcmlzb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8oQ2hhcmFjdGVyIGxlZnQsIE51bWJlciByaWdodCkgeworICAgICAgICByZXR1cm4gY29tcGFyZVRvKG5ldyBJbnRlZ2VyKGxlZnQuY2hhclZhbHVlKCkpLCByaWdodCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGFyZSBhIE51bWJlciBhbmQgYSBDaGFyYWN0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGVmdCAgYSBOdW1iZXIKKyAgICAgKiBAcGFyYW0gcmlnaHQgYSBDaGFyYWN0ZXIKKyAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGNvbXBhcmlzb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8oTnVtYmVyIGxlZnQsIENoYXJhY3RlciByaWdodCkgeworICAgICAgICByZXR1cm4gY29tcGFyZVRvKGxlZnQsIG5ldyBJbnRlZ2VyKHJpZ2h0LmNoYXJWYWx1ZSgpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGFyZSB0d28gQ2hhcmFjdGVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsZWZ0ICBhIENoYXJhY3RlcgorICAgICAqIEBwYXJhbSByaWdodCBhIENoYXJhY3RlcgorICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgY29tcGFyaXNvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmVUbyhDaGFyYWN0ZXIgbGVmdCwgQ2hhcmFjdGVyIHJpZ2h0KSB7CisgICAgICAgIHJldHVybiBjb21wYXJlVG8obmV3IEludGVnZXIobGVmdC5jaGFyVmFsdWUoKSksIHJpZ2h0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlIHR3byBOdW1iZXJzLiAgRXF1YWxpdHkgKD09KSBmb3IgbnVtYmVycyBkaXNwYXRjaGVzIHRvIHRoaXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGVmdCAgYSBOdW1iZXIKKyAgICAgKiBAcGFyYW0gcmlnaHQgYW5vdGhlciBOdW1iZXIgdG8gY29tcGFyZSB0bworICAgICAqIEByZXR1cm4gdGhlIGNvbXBhcmlzaW9uIG9mIGJvdGggbnVtYmVycworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmVUbyhOdW1iZXIgbGVmdCwgTnVtYmVyIHJpZ2h0KSB7CisgICAgICAgIC8qKiBAdG9kbyBtYXliZSBhIGRvdWJsZSBkaXNwYXRjaCB0aGluZyB0byBoYW5kbGUgbmV3IGxhcmdlIG51bWJlcnM/ICovCisgICAgICAgIHJldHVybiBOdW1iZXJNYXRoLmNvbXBhcmVUbyhsZWZ0LCByaWdodCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3VidHJhY3QgYSBOdW1iZXIgZnJvbSBhIENoYXJhY3Rlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsZWZ0ICBhIENoYXJhY3RlcgorICAgICAqIEBwYXJhbSByaWdodCBhIE51bWJlcgorICAgICAqIEByZXR1cm4gdGhlIGFkZGl0aW9uIG9mIHRoZSBDaGFyYWN0ZXIgYW5kIHRoZSBOdW1iZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE51bWJlciBtaW51cyhDaGFyYWN0ZXIgbGVmdCwgTnVtYmVyIHJpZ2h0KSB7CisgICAgICAgIHJldHVybiBtaW51cyhuZXcgSW50ZWdlcihsZWZ0LmNoYXJWYWx1ZSgpKSwgcmlnaHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN1YnRyYWN0IGEgQ2hhcmFjdGVyIGZyb20gYSBOdW1iZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGVmdCAgYSBOdW1iZXIKKyAgICAgKiBAcGFyYW0gcmlnaHQgYSBDaGFyYWN0ZXIKKyAgICAgKiBAcmV0dXJuIHRoZSBhZGRpdGlvbiBvZiB0aGUgQ2hhcmFjdGVyIGFuZCB0aGUgTnVtYmVyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBOdW1iZXIgbWludXMoTnVtYmVyIGxlZnQsIENoYXJhY3RlciByaWdodCkgeworICAgICAgICByZXR1cm4gbWludXMobGVmdCwgbmV3IEludGVnZXIocmlnaHQuY2hhclZhbHVlKCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdWJ0cmFjdGlvbiB0d28gQ2hhcmFjdGVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsZWZ0ICBhIENoYXJhY3RlcgorICAgICAqIEBwYXJhbSByaWdodCBhIENoYXJhY3RlcgorICAgICAqIEByZXR1cm4gdGhlIGFkZGl0aW9uIG9mIGJvdGggQ2hhcmFjdGVycworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTnVtYmVyIG1pbnVzKENoYXJhY3RlciBsZWZ0LCBDaGFyYWN0ZXIgcmlnaHQpIHsKKyAgICAgICAgcmV0dXJuIG1pbnVzKG5ldyBJbnRlZ2VyKGxlZnQuY2hhclZhbHVlKCkpLCByaWdodCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3Vic3RyYWN0aW9uIG9mIHR3byBOdW1iZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIGxlZnQgIGEgTnVtYmVyCisgICAgICogQHBhcmFtIHJpZ2h0IGFub3RoZXIgTnVtYmVyIHRvIHN1YnN0cmFjdCB0byB0aGUgZmlyc3Qgb25lCisgICAgICogQHJldHVybiB0aGUgc3Vic3RyYWN0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBOdW1iZXIgbWludXMoTnVtYmVyIGxlZnQsIE51bWJlciByaWdodCkgeworICAgICAgICByZXR1cm4gTnVtYmVyTWF0aC5zdWJ0cmFjdChsZWZ0LCByaWdodCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTXVsdGlwbHkgYSBDaGFyYWN0ZXIgYnkgYSBOdW1iZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGVmdCAgYSBDaGFyYWN0ZXIKKyAgICAgKiBAcGFyYW0gcmlnaHQgYSBOdW1iZXIKKyAgICAgKiBAcmV0dXJuIHRoZSBtdWx0aXBsaWNhdGlvbiBvZiBib3RoCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBOdW1iZXIgbXVsdGlwbHkoQ2hhcmFjdGVyIGxlZnQsIE51bWJlciByaWdodCkgeworICAgICAgICByZXR1cm4gbXVsdGlwbHkobmV3IEludGVnZXIobGVmdC5jaGFyVmFsdWUoKSksIHJpZ2h0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNdWx0aXBseSBhIE51bWJlciBieSBhIENoYXJhY3Rlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsZWZ0ICBhIE51bWJlcgorICAgICAqIEBwYXJhbSByaWdodCBhIENoYXJhY3RlcgorICAgICAqIEByZXR1cm4gdGhlIG11bHRpcGxpY2F0aW9uIG9mIGJvdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE51bWJlciBtdWx0aXBseShOdW1iZXIgbGVmdCwgQ2hhcmFjdGVyIHJpZ2h0KSB7CisgICAgICAgIHJldHVybiBtdWx0aXBseShsZWZ0LCBuZXcgSW50ZWdlcihyaWdodC5jaGFyVmFsdWUoKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE11bHRpcGx5IHR3byBDaGFyYWN0ZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIGxlZnQgIGEgQ2hhcmFjdGVyCisgICAgICogQHBhcmFtIHJpZ2h0IGFub3RoZXIgQ2hhcmFjdGVyCisgICAgICogQHJldHVybiB0aGUgbXVsdGlwbGljYXRpb24gb2YgYm90aAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTnVtYmVyIG11bHRpcGx5KENoYXJhY3RlciBsZWZ0LCBDaGFyYWN0ZXIgcmlnaHQpIHsKKyAgICAgICAgcmV0dXJuIG11bHRpcGx5KG5ldyBJbnRlZ2VyKGxlZnQuY2hhclZhbHVlKCkpLCByaWdodCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTXVsdGlwbHkgdHdvIE51bWJlcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGVmdCAgYSBOdW1iZXIKKyAgICAgKiBAcGFyYW0gcmlnaHQgYW5vdGhlciBOdW1iZXIKKyAgICAgKiBAcmV0dXJuIHRoZSBtdWx0aXBsaWNhdGlvbiBvZiBib3RoCisgICAgICovCisgICAgLy9Ob3RlOiAgVGhpcyBtZXRob2QgaXMgTk9UIGNhbGxlZCBpZiBsZWZ0IEFORCByaWdodCBhcmUgYm90aCBCaWdJbnRlZ2VycyBvciBCaWdEZWNpbWFscyBiZWNhdXNlCisgICAgLy90aG9zZSBjbGFzc2VzIGltcGxlbWVudCBhIG1ldGhvZCB3aXRoIGEgYmV0dGVyIGV4YWN0IG1hdGNoLgorICAgIHB1YmxpYyBzdGF0aWMgTnVtYmVyIG11bHRpcGx5KE51bWJlciBsZWZ0LCBOdW1iZXIgcmlnaHQpIHsKKyAgICAgICAgcmV0dXJuIE51bWJlck1hdGgubXVsdGlwbHkobGVmdCwgcmlnaHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE11bHRpcGx5IGEgQmlnRGVjaW1hbCBhbmQgYSBEb3VibGUuCisgICAgICogTm90ZTogVGhpcyBtZXRob2Qgd2FzIGFkZGVkIHRvIGVuZm9yY2UgdGhlIEdyb292eSBydWxlIG9mCisgICAgICogQmlnRGVjaW1hbCpEb3VibGUgPT0gRG91YmxlLiBXaXRob3V0IHRoaXMgbWV0aG9kLCB0aGUKKyAgICAgKiBtdWx0aXBseShCaWdEZWNpbWFsKSBtZXRob2QgaW4gQmlnRGVjaW1hbCB3b3VsZCByZXNwb25kCisgICAgICogYW5kIHJldHVybiBhIEJpZ0RlY2ltYWwgaW5zdGVhZC4gU2luY2UgQmlnRGVjaW1hbCBpcyBwcmVmZXJlZAorICAgICAqIG92ZXIgTnVtYmVyLCB0aGUgTnVtYmVyKk51bWJlciBtZXRob2QgaXMgbm90IGNob29zZW4gYXMgaW4gb2xkZXIKKyAgICAgKiB2ZXJzaW9ucyBvZiBHcm9vdnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGVmdCAgYSBCaWdEZWNpbWFsCisgICAgICogQHBhcmFtIHJpZ2h0IGEgRG91YmxlCisgICAgICogQHJldHVybiB0aGUgbXVsdGlwbGljYXRpb24gb2YgYm90aAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTnVtYmVyIG11bHRpcGx5KEJpZ0RlY2ltYWwgbGVmdCwgRG91YmxlIHJpZ2h0KSB7CisgICAgICAgIHJldHVybiBOdW1iZXJNYXRoLm11bHRpcGx5KGxlZnQsIHJpZ2h0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNdWx0aXBseSBhIEJpZ0RlY2ltYWwgYW5kIGEgQmlnSW50ZWdlci4KKyAgICAgKiBOb3RlOiBUaGlzIG1ldGhvZCB3YXMgYWRkZWQgdG8gZW5mb3JjZSB0aGUgR3Jvb3Z5IHJ1bGUgb2YKKyAgICAgKiBCaWdEZWNpbWFsKmxvbmcgPT0gbG9uZy4gV2l0aG91dCB0aGlzIG1ldGhvZCwgdGhlCisgICAgICogbXVsdGlwbHkoQmlnRGVjaW1hbCkgbWV0aG9kIGluIEJpZ0RlY2ltYWwgd291bGQgcmVzcG9uZAorICAgICAqIGFuZCByZXR1cm4gYSBCaWdEZWNpbWFsIGluc3RlYWQuIFNpbmNlIEJpZ0RlY2ltYWwgaXMgcHJlZmVyZWQKKyAgICAgKiBvdmVyIE51bWJlciwgdGhlIE51bWJlcipOdW1iZXIgbWV0aG9kIGlzIG5vdCBjaG9vc2VuIGFzIGluIG9sZGVyCisgICAgICogdmVyc2lvbnMgb2YgR3Jvb3Z5LiBCaWdpbnRlZ2VyIGlzIHRoZSBmYWxsYmFjayBmb3IgYWxsIGludGVnZXIKKyAgICAgKiB0eXBlcyBpbiBHcm9vdnkKKyAgICAgKgorICAgICAqIEBwYXJhbSBsZWZ0ICBhIEJpZ0RlY2ltYWwKKyAgICAgKiBAcGFyYW0gcmlnaHQgYSBCaWdJbnRlZ2VyCisgICAgICogQHJldHVybiB0aGUgbXVsdGlwbGljYXRpb24gb2YgYm90aAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTnVtYmVyIG11bHRpcGx5KEJpZ0RlY2ltYWwgbGVmdCwgQmlnSW50ZWdlciByaWdodCkgeworICAgICAgICByZXR1cm4gTnVtYmVyTWF0aC5tdWx0aXBseShsZWZ0LCByaWdodCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUG93ZXIgb2YgYSBOdW1iZXIgdG8gYSBjZXJ0YWluIGV4cG9uZW50LiAgQ2FsbGVkIGJ5IHRoZSAnKionIG9wZXJhdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgICAgIGEgTnVtYmVyCisgICAgICogQHBhcmFtIGV4cG9uZW50IGEgTnVtYmVyIGV4cG9uZW50CisgICAgICogQHJldHVybiBhIE51bWJlciB0byB0aGUgcG93ZXIgb2YgYSBjZXJ0YWluIGV4cG9uZW50CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBOdW1iZXIgcG93ZXIoTnVtYmVyIHNlbGYsIE51bWJlciBleHBvbmVudCkgeworICAgICAgICBkb3VibGUgYmFzZSwgZXhwLCBhbnN3ZXI7CisgICAgICAgIGJhc2UgPSBzZWxmLmRvdWJsZVZhbHVlKCk7CisgICAgICAgIGV4cCA9IGV4cG9uZW50LmRvdWJsZVZhbHVlKCk7CisKKyAgICAgICAgYW5zd2VyID0gTWF0aC5wb3coYmFzZSwgZXhwKTsKKyAgICAgICAgaWYgKChkb3VibGUpICgoaW50KSBhbnN3ZXIpID09IGFuc3dlcikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnRlZ2VyKChpbnQpIGFuc3dlcik7CisgICAgICAgIH0gZWxzZSBpZiAoKGRvdWJsZSkgKChsb25nKSBhbnN3ZXIpID09IGFuc3dlcikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBMb25nKChsb25nKSBhbnN3ZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBEb3VibGUoYW5zd2VyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERpdmlkZSBhIENoYXJhY3RlciBieSBhIE51bWJlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsZWZ0ICBhIENoYXJhY3RlcgorICAgICAqIEBwYXJhbSByaWdodCBhIE51bWJlcgorICAgICAqIEByZXR1cm4gdGhlIG11bHRpcGxpY2F0aW9uIG9mIGJvdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE51bWJlciBkaXYoQ2hhcmFjdGVyIGxlZnQsIE51bWJlciByaWdodCkgeworICAgICAgICByZXR1cm4gZGl2KG5ldyBJbnRlZ2VyKGxlZnQuY2hhclZhbHVlKCkpLCByaWdodCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGl2aWRlIGEgTnVtYmVyIGJ5IGEgQ2hhcmFjdGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGxlZnQgIGEgTnVtYmVyCisgICAgICogQHBhcmFtIHJpZ2h0IGEgQ2hhcmFjdGVyCisgICAgICogQHJldHVybiB0aGUgbXVsdGlwbGljYXRpb24gb2YgYm90aAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTnVtYmVyIGRpdihOdW1iZXIgbGVmdCwgQ2hhcmFjdGVyIHJpZ2h0KSB7CisgICAgICAgIHJldHVybiBkaXYobGVmdCwgbmV3IEludGVnZXIocmlnaHQuY2hhclZhbHVlKCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEaXZpZGUgdHdvIENoYXJhY3RlcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGVmdCAgYSBDaGFyYWN0ZXIKKyAgICAgKiBAcGFyYW0gcmlnaHQgYW5vdGhlciBDaGFyYWN0ZXIKKyAgICAgKiBAcmV0dXJuIHRoZSBtdWx0aXBsaWNhdGlvbiBvZiBib3RoCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBOdW1iZXIgZGl2KENoYXJhY3RlciBsZWZ0LCBDaGFyYWN0ZXIgcmlnaHQpIHsKKyAgICAgICAgcmV0dXJuIGRpdihuZXcgSW50ZWdlcihsZWZ0LmNoYXJWYWx1ZSgpKSwgcmlnaHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERpdmlkZSB0d28gTnVtYmVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsZWZ0ICBhIE51bWJlcgorICAgICAqIEBwYXJhbSByaWdodCBhbm90aGVyIE51bWJlcgorICAgICAqIEByZXR1cm4gYSBOdW1iZXIgcmVzdWx0aW5nIG9mIHRoZSBkaXZpZGUgb3BlcmF0aW9uCisgICAgICovCisgICAgLy9NZXRob2QgbmFtZSBjaGFuZ2VkIGZyb20gJ2RpdmlkZScgdG8gYXZvaWQgY29sbGlzaW9uIHdpdGggQmlnSW50ZWdlciBtZXRob2QgdGhhdCBoYXMKKyAgICAvL2RpZmZlcmVudCBzZW1hbnRpY3MuICBXZSB3YW50IGEgQmlnRGVjaW1hbCByZXN1bHQgcmF0aGVyIHRoYW4gYSBCaWdJbnRlZ2VyLgorICAgIHB1YmxpYyBzdGF0aWMgTnVtYmVyIGRpdihOdW1iZXIgbGVmdCwgTnVtYmVyIHJpZ2h0KSB7CisgICAgICAgIHJldHVybiBOdW1iZXJNYXRoLmRpdmlkZShsZWZ0LCByaWdodCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZWdlciBEaXZpZGUgYSBDaGFyYWN0ZXIgYnkgYSBOdW1iZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGVmdCAgYSBDaGFyYWN0ZXIKKyAgICAgKiBAcGFyYW0gcmlnaHQgYSBOdW1iZXIKKyAgICAgKiBAcmV0dXJuIHRoZSBpbnRlZ2VyIGRpdmlzaW9uIG9mIGJvdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE51bWJlciBpbnRkaXYoQ2hhcmFjdGVyIGxlZnQsIE51bWJlciByaWdodCkgeworICAgICAgICByZXR1cm4gaW50ZGl2KG5ldyBJbnRlZ2VyKGxlZnQuY2hhclZhbHVlKCkpLCByaWdodCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZWdlciBEaXZpZGUgYSBOdW1iZXIgYnkgYSBDaGFyYWN0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGVmdCAgYSBOdW1iZXIKKyAgICAgKiBAcGFyYW0gcmlnaHQgYSBDaGFyYWN0ZXIKKyAgICAgKiBAcmV0dXJuIHRoZSBpbnRlZ2VyIGRpdmlzaW9uIG9mIGJvdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE51bWJlciBpbnRkaXYoTnVtYmVyIGxlZnQsIENoYXJhY3RlciByaWdodCkgeworICAgICAgICByZXR1cm4gaW50ZGl2KGxlZnQsIG5ldyBJbnRlZ2VyKHJpZ2h0LmNoYXJWYWx1ZSgpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZWdlciBEaXZpZGUgdHdvIENoYXJhY3RlcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGVmdCAgYSBDaGFyYWN0ZXIKKyAgICAgKiBAcGFyYW0gcmlnaHQgYW5vdGhlciBDaGFyYWN0ZXIKKyAgICAgKiBAcmV0dXJuIHRoZSBpbnRlZ2VyIGRpdmlzaW9uIG9mIGJvdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE51bWJlciBpbnRkaXYoQ2hhcmFjdGVyIGxlZnQsIENoYXJhY3RlciByaWdodCkgeworICAgICAgICByZXR1cm4gaW50ZGl2KG5ldyBJbnRlZ2VyKGxlZnQuY2hhclZhbHVlKCkpLCByaWdodCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZWdlciBEaXZpZGUgdHdvIE51bWJlcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGVmdCAgYSBOdW1iZXIKKyAgICAgKiBAcGFyYW0gcmlnaHQgYW5vdGhlciBOdW1iZXIKKyAgICAgKiBAcmV0dXJuIGEgTnVtYmVyIChhbiBJbnRlZ2VyKSByZXN1bHRpbmcgb2YgdGhlIGludGVnZXIgZGl2aXNpb24gb3BlcmF0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBOdW1iZXIgaW50ZGl2KE51bWJlciBsZWZ0LCBOdW1iZXIgcmlnaHQpIHsKKyAgICAgICAgcmV0dXJuIE51bWJlck1hdGguaW50ZGl2KGxlZnQsIHJpZ2h0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCaXR3aXNlIE9SIHRvZ2V0aGVyIHR3byBudW1iZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIGxlZnQgIGEgTnVtYmVyCisgICAgICogQHBhcmFtIHJpZ2h0IGFub3RoZXIgTnVtYmVyIHRvIGJpdHdpc2UgT1IKKyAgICAgKiBAcmV0dXJuIHRoZSBiaXR3aXNlIE9SIG9mIGJvdGggTnVtYmVycworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTnVtYmVyIG9yKE51bWJlciBsZWZ0LCBOdW1iZXIgcmlnaHQpIHsKKyAgICAgICAgcmV0dXJuIE51bWJlck1hdGgub3IobGVmdCwgcmlnaHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJpdHdpc2UgQU5EIHRvZ2V0aGVyIHR3byBOdW1iZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIGxlZnQgIGEgTnVtYmVyCisgICAgICogQHBhcmFtIHJpZ2h0IGFub3RoZXIgTnVtYmVyIHRvIGJpdHdpc2UgQU5ECisgICAgICogQHJldHVybiB0aGUgYml0d2lzZSBBTkQgb2YgYm90aCBOdW1iZXJzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBOdW1iZXIgYW5kKE51bWJlciBsZWZ0LCBOdW1iZXIgcmlnaHQpIHsKKyAgICAgICAgcmV0dXJuIE51bWJlck1hdGguYW5kKGxlZnQsIHJpZ2h0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCaXR3aXNlIEFORCB0b2dldGhlciB0d28gQml0U2V0cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsZWZ0ICBhIEJpdFNldAorICAgICAqIEBwYXJhbSByaWdodCBhbm90aGVyIEJpdFNldCB0byBiaXR3aXNlIEFORAorICAgICAqIEByZXR1cm4gdGhlIGJpdHdpc2UgQU5EIG9mIGJvdGggQml0U2V0cworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQml0U2V0IGFuZChCaXRTZXQgbGVmdCwgQml0U2V0IHJpZ2h0KSB7CisgICAgICAgIEJpdFNldCByZXN1bHQgPSAoQml0U2V0KSBsZWZ0LmNsb25lKCk7CisgICAgICAgIHJlc3VsdC5hbmQocmlnaHQpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEJpdHdpc2UgWE9SIHRvZ2V0aGVyIHR3byBCaXRTZXRzLiAgQ2FsbGVkIHdoZW4gdGhlICdeJyBvcGVyYXRvciBpcyB1c2VkCisgICAgICogYmV0d2VlbiB0d28gYml0IHNldHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGVmdCAgYSBCaXRTZXQKKyAgICAgKiBAcGFyYW0gcmlnaHQgYW5vdGhlciBCaXRTZXQgdG8gYml0d2lzZSBBTkQKKyAgICAgKiBAcmV0dXJuIHRoZSBiaXR3aXNlIFhPUiBvZiBib3RoIEJpdFNldHMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEJpdFNldCB4b3IoQml0U2V0IGxlZnQsIEJpdFNldCByaWdodCkgeworICAgICAgICBCaXRTZXQgcmVzdWx0ID0gKEJpdFNldCkgbGVmdC5jbG9uZSgpOworICAgICAgICByZXN1bHQueG9yKHJpZ2h0KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCaXR3aXNlIE5FR0FURSBhIEJpdFNldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmIGEgQml0U2V0CisgICAgICogQHJldHVybiB0aGUgYml0d2lzZSBORUdBVEUgb2YgdGhlIEJpdFNldAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQml0U2V0IGJpdHdpc2VOZWdhdGUoQml0U2V0IHNlbGYpIHsKKyAgICAgICAgQml0U2V0IHJlc3VsdCA9IChCaXRTZXQpIHNlbGYuY2xvbmUoKTsKKyAgICAgICAgcmVzdWx0LmZsaXAoMCwgcmVzdWx0LnNpemUoKSAtIDEpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEJpdHdpc2UgT1IgdG9nZXRoZXIgdHdvIEJpdFNldHMuICBDYWxsZWQgd2hlbiB0aGUgJ3wnIG9wZXJhdG9yIGlzIHVzZWQKKyAgICAgKiBiZXR3ZWVuIHR3byBiaXQgc2V0cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsZWZ0ICBhIEJpdFNldAorICAgICAqIEBwYXJhbSByaWdodCBhbm90aGVyIEJpdFNldCB0byBiaXR3aXNlIEFORAorICAgICAqIEByZXR1cm4gdGhlIGJpdHdpc2UgT1Igb2YgYm90aCBCaXRTZXRzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBCaXRTZXQgb3IoQml0U2V0IGxlZnQsIEJpdFNldCByaWdodCkgeworICAgICAgICBCaXRTZXQgcmVzdWx0ID0gKEJpdFNldCkgbGVmdC5jbG9uZSgpOworICAgICAgICByZXN1bHQub3IocmlnaHQpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEJpdHdpc2UgWE9SIHRvZ2V0aGVyIHR3byBOdW1iZXJzLiAgQ2FsbGVkIHdoZW4gdGhlICd8JyBvcGVyYXRvciBpcyB1c2VkLgorICAgICAqCisgICAgICogQHBhcmFtIGxlZnQgIGEgTnVtYmVyCisgICAgICogQHBhcmFtIHJpZ2h0IGFub3RoZXIgTnVtYmVyIHRvIGJpdHdzZSBYT1IKKyAgICAgKiBAcmV0dXJuIHRoZSBiaXR3aXNlIFhPUiBvZiBib3RoIE51bWJlcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE51bWJlciB4b3IoTnVtYmVyIGxlZnQsIE51bWJlciByaWdodCkgeworICAgICAgICByZXR1cm4gTnVtYmVyTWF0aC54b3IobGVmdCwgcmlnaHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm1zIGEgZGl2aXNpb24gbW9kdWx1cyBvcGVyYXRpb24uICBDYWxsZWQgYnkgdGhlICclJyBvcGVyYXRvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsZWZ0ICBhIE51bWJlcgorICAgICAqIEBwYXJhbSByaWdodCBhbm90aGVyIE51bWJlciB0byBtb2QKKyAgICAgKiBAcmV0dXJuIHRoZSBtb2R1bHVzIHJlc3VsdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTnVtYmVyIG1vZChOdW1iZXIgbGVmdCwgTnVtYmVyIHJpZ2h0KSB7CisgICAgICAgIHJldHVybiBOdW1iZXJNYXRoLm1vZChsZWZ0LCByaWdodCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTmVnYXRlcyB0aGUgbnVtYmVyLiAgRXF1aXZhbGVudCB0byB0aGUgJy0nIG9wZXJhdG9yIHdoZW4gaXQgcHJlY2VlZHMKKyAgICAgKiBhIHNpbmdsZSBvcGVyYW5kLCBpLmUuIDxjb2RlPi0xMDwvY29kZT4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsZWZ0IGEgTnVtYmVyCisgICAgICogQHJldHVybiB0aGUgbmVnYXRpb24gb2YgdGhlIG51bWJlcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTnVtYmVyIHVuYXJ5TWludXMoTnVtYmVyIGxlZnQpIHsKKyAgICAgICAgcmV0dXJuIE51bWJlck1hdGgudW5hcnlNaW51cyhsZWZ0KTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEV4ZWN1dGVzIHRoZSBjbG9zdXJlIHRoaXMgbWFueSB0aW1lcywgc3RhcnRpbmcgZnJvbSB6ZXJvLiAgVGhlIGN1cnJlbnQKKyAgICAgKiBpbmRleCBpcyBwYXNzZWQgdG8gdGhlIGNsb3N1cmUgZWFjaCB0aW1lLgorICAgICAqIEV4YW1wbGU6CisgICAgICogPHByZT4xMC50aW1lcyB7CisgICAgICogICBwcmludGxuIGl0CisgICAgICogfTwvcHJlPgorICAgICAqIFByaW50cyB0aGUgbnVtYmVycyAwIHRocm91Z2ggOS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmICAgIGEgTnVtYmVyCisgICAgICogQHBhcmFtIGNsb3N1cmUgdGhlIGNsb3N1cmUgdG8gY2FsbCBhIG51bWJlciBvZiB0aW1lcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0aW1lcyhOdW1iZXIgc2VsZiwgQ2xvc3VyZSBjbG9zdXJlKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwLCBzaXplID0gc2VsZi5pbnRWYWx1ZSgpOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBjbG9zdXJlLmNhbGwobmV3IEludGVnZXIoaSkpOworICAgICAgICAgICAgaWYgKGNsb3N1cmUuZ2V0RGlyZWN0aXZlKCkgPT0gQ2xvc3VyZS5ET05FKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJdGVyYXRlcyBmcm9tIHRoaXMgbnVtYmVyIHVwIHRvIHRoZSBnaXZlbiBudW1iZXIsIGluY2x1c2l2ZSwKKyAgICAgKiBpbmNyZW1lbnRpbmcgYnkgb25lIGVhY2ggdGltZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmICAgIGEgTnVtYmVyCisgICAgICogQHBhcmFtIHRvICAgICAgYW5vdGhlciBOdW1iZXIgdG8gZ28gdXAgdG8KKyAgICAgKiBAcGFyYW0gY2xvc3VyZSB0aGUgY2xvc3VyZSB0byBjYWxsCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHVwdG8oTnVtYmVyIHNlbGYsIE51bWJlciB0bywgQ2xvc3VyZSBjbG9zdXJlKSB7CisgICAgICAgIGludCBzZWxmMSA9IHNlbGYuaW50VmFsdWUoKTsKKyAgICAgICAgaW50IHRvMSA9IHRvLmludFZhbHVlKCk7CisgICAgICAgIGlmIChzZWxmMSA8PSB0bzEpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBzZWxmMTsgaSA8PSB0bzE7IGkrKykgeworICAgICAgICAgICAgICAgIGNsb3N1cmUuY2FsbChuZXcgSW50ZWdlcihpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgdGhyb3cgbmV3IEdyb292eVJ1bnRpbWVFeGNlcHRpb24oIkluZmluaXRlIGxvb3AgaW4gIiArIHNlbGYgKyAiLnVwdG8oIiArIHRvICsgIikiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJdGVyYXRlcyBmcm9tIHRoaXMgbnVtYmVyIHVwIHRvIHRoZSBnaXZlbiBudW1iZXIsIGluY2x1c2l2ZSwKKyAgICAgKiBpbmNyZW1lbnRpbmcgYnkgb25lIGVhY2ggdGltZS4KKyAgCSAqCisgICAgICogQHBhcmFtIHNlbGYgICAgYSBsb25nCisgICAgICogQHBhcmFtIHRvIHRoZSBlbmQgbnVtYmVyCisgICAgICogQHBhcmFtIGNsb3N1cmUgdGhlIGNvZGUgdG8gZXhlY3V0ZSBmb3IgZWFjaCBudW1iZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdXB0byhsb25nIHNlbGYsIE51bWJlciB0bywgQ2xvc3VyZSBjbG9zdXJlKSB7CisgICAgICAgIGxvbmcgdG8xID0gdG8ubG9uZ1ZhbHVlKCk7CisgICAgICAgIGlmIChzZWxmIDw9IHRvMSkgeworICAgICAgICAgICAgZm9yIChsb25nIGkgPSBzZWxmOyBpIDw9IHRvMTsgaSsrKSB7CisgICAgICAgICAgICAgICAgY2xvc3VyZS5jYWxsKG5ldyBMb25nKGkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICB0aHJvdyBuZXcgR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbigiSW5maW5pdGUgbG9vcCBpbiAiICsgc2VsZiArICIudXB0bygiICsgdG8gKyAiKSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEl0ZXJhdGVzIGZyb20gdGhpcyBudW1iZXIgdXAgdG8gdGhlIGdpdmVuIG51bWJlciwgaW5jbHVzaXZlLAorICAgICAqIGluY3JlbWVudGluZyBieSBvbmUgZWFjaCB0aW1lLgorICAJICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgICBhIExvbmcKKyAgICAgKiBAcGFyYW0gdG8gdGhlIGVuZCBudW1iZXIKKyAgICAgKiBAcGFyYW0gY2xvc3VyZSB0aGUgY29kZSB0byBleGVjdXRlIGZvciBlYWNoIG51bWJlcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB1cHRvKExvbmcgc2VsZiwgTnVtYmVyIHRvLCBDbG9zdXJlIGNsb3N1cmUpIHsKKyAgICAgICAgbG9uZyBzZWxmMSA9IHNlbGYubG9uZ1ZhbHVlKCk7CisgICAgICAgIGxvbmcgdG8xID0gdG8ubG9uZ1ZhbHVlKCk7CisgICAgICAgIGlmIChzZWxmMSA8PSB0bzEpIHsKKyAgICAgICAgICAgIGZvciAobG9uZyBpID0gc2VsZjE7IGkgPD0gdG8xOyBpKyspIHsKKyAgICAgICAgICAgICAgICBjbG9zdXJlLmNhbGwobmV3IExvbmcoaSkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHRocm93IG5ldyBHcm9vdnlSdW50aW1lRXhjZXB0aW9uKCJJbmZpbml0ZSBsb29wIGluICIgKyBzZWxmICsgIi51cHRvKCIgKyB0byArICIpIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogSXRlcmF0ZXMgZnJvbSB0aGlzIG51bWJlciB1cCB0byB0aGUgZ2l2ZW4gbnVtYmVyLCBpbmNsdXNpdmUsCisgICAgICogaW5jcmVtZW50aW5nIGJ5IG9uZSBlYWNoIHRpbWUuCisgIAkgKgorICAgICAqIEBwYXJhbSBzZWxmICAgIGEgZmxvYXQKKyAgICAgKiBAcGFyYW0gdG8gdGhlIGVuZCBudW1iZXIKKyAgICAgKiBAcGFyYW0gY2xvc3VyZSB0aGUgY29kZSB0byBleGVjdXRlIGZvciBlYWNoIG51bWJlcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB1cHRvKGZsb2F0IHNlbGYsIE51bWJlciB0bywgQ2xvc3VyZSBjbG9zdXJlKSB7CisgICAgICAgIGZsb2F0IHRvMSA9IHRvLmZsb2F0VmFsdWUoKTsKKyAgICAgICAgaWYgKHNlbGYgPD0gdG8xKSB7CisgICAgICAgICAgICBmb3IgKGZsb2F0IGkgPSBzZWxmOyBpIDw9IHRvMTsgaSsrKSB7CisgICAgICAgICAgICAgICAgY2xvc3VyZS5jYWxsKG5ldyBGbG9hdChpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgdGhyb3cgbmV3IEdyb292eVJ1bnRpbWVFeGNlcHRpb24oIkluZmluaXRlIGxvb3AgaW4gIiArIHNlbGYgKyAiLnVwdG8oIiArIHRvICsgIikiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJdGVyYXRlcyBmcm9tIHRoaXMgbnVtYmVyIHVwIHRvIHRoZSBnaXZlbiBudW1iZXIsIGluY2x1c2l2ZSwKKyAgICAgKiBpbmNyZW1lbnRpbmcgYnkgb25lIGVhY2ggdGltZS4KKyAgCSAqCisgICAgICogQHBhcmFtIHNlbGYgICAgYSBGbG9hdAorICAgICAqIEBwYXJhbSB0byB0aGUgZW5kIG51bWJlcgorICAgICAqIEBwYXJhbSBjbG9zdXJlIHRoZSBjb2RlIHRvIGV4ZWN1dGUgZm9yIGVhY2ggbnVtYmVyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHVwdG8oRmxvYXQgc2VsZiwgTnVtYmVyIHRvLCBDbG9zdXJlIGNsb3N1cmUpIHsKKyAgICAgICAgZmxvYXQgc2VsZjEgPSBzZWxmLmZsb2F0VmFsdWUoKTsKKyAgICAgICAgZmxvYXQgdG8xID0gdG8uZmxvYXRWYWx1ZSgpOworICAgICAgICBpZiAoc2VsZjEgPD0gdG8xKSB7CisgICAgICAgICAgICBmb3IgKGZsb2F0IGkgPSBzZWxmMTsgaSA8PSB0bzE7IGkrKykgeworICAgICAgICAgICAgICAgIGNsb3N1cmUuY2FsbChuZXcgRmxvYXQoaSkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHRocm93IG5ldyBHcm9vdnlSdW50aW1lRXhjZXB0aW9uKCJJbmZpbml0ZSBsb29wIGluICIgKyBzZWxmICsgIi51cHRvKCIgKyB0byArICIpIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogSXRlcmF0ZXMgZnJvbSB0aGlzIG51bWJlciB1cCB0byB0aGUgZ2l2ZW4gbnVtYmVyLCBpbmNsdXNpdmUsCisgICAgICogaW5jcmVtZW50aW5nIGJ5IG9uZSBlYWNoIHRpbWUuCisgIAkgKgorICAgICAqIEBwYXJhbSBzZWxmICAgIGEgZG91YmxlCisgICAgICogQHBhcmFtIHRvIHRoZSBlbmQgbnVtYmVyCisgICAgICogQHBhcmFtIGNsb3N1cmUgdGhlIGNvZGUgdG8gZXhlY3V0ZSBmb3IgZWFjaCBudW1iZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdXB0byhkb3VibGUgc2VsZiwgTnVtYmVyIHRvLCBDbG9zdXJlIGNsb3N1cmUpIHsKKyAgICAgICAgZG91YmxlIHRvMSA9IHRvLmRvdWJsZVZhbHVlKCk7CisgICAgICAgIGlmIChzZWxmIDw9IHRvMSkgeworICAgICAgICAgICAgZm9yIChkb3VibGUgaSA9IHNlbGY7IGkgPD0gdG8xOyBpKyspIHsKKyAgICAgICAgICAgICAgICBjbG9zdXJlLmNhbGwobmV3IERvdWJsZShpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgdGhyb3cgbmV3IEdyb292eVJ1bnRpbWVFeGNlcHRpb24oIkluZmluaXRlIGxvb3AgaW4gIiArIHNlbGYgKyAiLnVwdG8oIiArIHRvICsgIikiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJdGVyYXRlcyBmcm9tIHRoaXMgbnVtYmVyIHVwIHRvIHRoZSBnaXZlbiBudW1iZXIsIGluY2x1c2l2ZSwKKyAgICAgKiBpbmNyZW1lbnRpbmcgYnkgb25lIGVhY2ggdGltZS4KKyAgCSAqCisgICAgICogQHBhcmFtIHNlbGYgICAgYSBEb3VibGUKKyAgICAgKiBAcGFyYW0gdG8gdGhlIGVuZCBudW1iZXIKKyAgICAgKiBAcGFyYW0gY2xvc3VyZSB0aGUgY29kZSB0byBleGVjdXRlIGZvciBlYWNoIG51bWJlcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB1cHRvKERvdWJsZSBzZWxmLCBOdW1iZXIgdG8sIENsb3N1cmUgY2xvc3VyZSkgeworICAgICAgICBkb3VibGUgc2VsZjEgPSBzZWxmLmRvdWJsZVZhbHVlKCk7CisgICAgICAgIGRvdWJsZSB0bzEgPSB0by5kb3VibGVWYWx1ZSgpOworICAgICAgICBpZiAoc2VsZjEgPD0gdG8xKSB7CisgICAgICAgICAgICBmb3IgKGRvdWJsZSBpID0gc2VsZjE7IGkgPD0gdG8xOyBpKyspIHsKKyAgICAgICAgICAgICAgICBjbG9zdXJlLmNhbGwobmV3IERvdWJsZShpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgdGhyb3cgbmV3IEdyb292eVJ1bnRpbWVFeGNlcHRpb24oIkluZmluaXRlIGxvb3AgaW4gIiArIHNlbGYgKyAiLnVwdG8oIiArIHRvICsgIikiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJdGVyYXRlcyBmcm9tIHRoaXMgbnVtYmVyIHVwIHRvIHRoZSBnaXZlbiBudW1iZXIsIGluY2x1c2l2ZSwKKyAgICAgKiBpbmNyZW1lbnRpbmcgYnkgb25lIGVhY2ggdGltZS4gIEV4YW1wbGU6CisgICAgICogPHByZT4wLnVwdG8oIDEwICkgeworICAJICogICBwcmludGxuIGl0CisgIAkgKiB9PC9wcmU+CisgIAkgKiBQcmludHMgbnVtYmVycyAwIHRvIDEwCisgIAkgKgorICAgICAqIEBwYXJhbSBzZWxmICAgIGEgQmlnSW50ZWdlcgorICAgICAqIEBwYXJhbSB0byB0aGUgZW5kIG51bWJlcgorICAgICAqIEBwYXJhbSBjbG9zdXJlIHRoZSBjb2RlIHRvIGV4ZWN1dGUgZm9yIGVhY2ggbnVtYmVyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHVwdG8oQmlnSW50ZWdlciBzZWxmLCBOdW1iZXIgdG8sIENsb3N1cmUgY2xvc3VyZSkgeworICAgICAgICBpZiAodG8gaW5zdGFuY2VvZiBCaWdEZWNpbWFsKSB7CisgICAgICAgICAgICBmaW5hbCBCaWdEZWNpbWFsIG9uZSA9IG5ldyBCaWdEZWNpbWFsKCIxLjAiKTsKKyAgICAgICAgICAgIEJpZ0RlY2ltYWwgc2VsZjEgPSBuZXcgQmlnRGVjaW1hbChzZWxmKTsKKyAgICAgICAgICAgIEJpZ0RlY2ltYWwgdG8xID0gKEJpZ0RlY2ltYWwpIHRvOworICAgICAgICAgICAgaWYgKHNlbGYxLmNvbXBhcmVUbyh0bzEpIDw9IDApIHsKKyAgICAgICAgICAgICAgICBmb3IgKEJpZ0RlY2ltYWwgaSA9IHNlbGYxOyBpLmNvbXBhcmVUbyh0bzEpIDw9IDA7IGkgPSBpLmFkZChvbmUpKSB7CisgICAgICAgICAgICAgICAgICAgIGNsb3N1cmUuY2FsbChpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbigiSW5maW5pdGUgbG9vcCBpbiAiICsgc2VsZiArICIudXB0bygiICsgdG8gKyAiKSIpOworICAgICAgICB9IGVsc2UgaWYgKHRvIGluc3RhbmNlb2YgQmlnSW50ZWdlcikgeworICAgICAgICAgICAgZmluYWwgQmlnSW50ZWdlciBvbmUgPSBuZXcgQmlnSW50ZWdlcigiMSIpOworICAgICAgICAgICAgQmlnSW50ZWdlciB0bzEgPSAoQmlnSW50ZWdlcikgdG87CisgICAgICAgICAgICBpZiAoc2VsZi5jb21wYXJlVG8odG8xKSA8PSAwKSB7CisgICAgICAgICAgICAgICAgZm9yIChCaWdJbnRlZ2VyIGkgPSBzZWxmOyBpLmNvbXBhcmVUbyh0bzEpIDw9IDA7IGkgPSBpLmFkZChvbmUpKSB7CisgICAgICAgICAgICAgICAgICAgIGNsb3N1cmUuY2FsbChpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbigiSW5maW5pdGUgbG9vcCBpbiAiICsgc2VsZiArICIudXB0bygiICsgdG8gKyAiKSIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmluYWwgQmlnSW50ZWdlciBvbmUgPSBuZXcgQmlnSW50ZWdlcigiMSIpOworICAgICAgICAgICAgQmlnSW50ZWdlciB0bzEgPSBuZXcgQmlnSW50ZWdlcigiIiArIHRvKTsKKyAgICAgICAgICAgIGlmIChzZWxmLmNvbXBhcmVUbyh0bzEpIDw9IDApIHsKKyAgICAgICAgICAgICAgICBmb3IgKEJpZ0ludGVnZXIgaSA9IHNlbGY7IGkuY29tcGFyZVRvKHRvMSkgPD0gMDsgaSA9IGkuYWRkKG9uZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2xvc3VyZS5jYWxsKGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBHcm9vdnlSdW50aW1lRXhjZXB0aW9uKCJJbmZpbml0ZSBsb29wIGluICIgKyBzZWxmICsgIi51cHRvKCIgKyB0byArICIpIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJdGVyYXRlcyBmcm9tIHRoaXMgbnVtYmVyIHVwIHRvIHRoZSBnaXZlbiBudW1iZXIsIGluY2x1c2l2ZSwKKyAgICAgKiBpbmNyZW1lbnRpbmcgYnkgb25lIGVhY2ggdGltZS4KKyAgICAgKiA8cHJlPjAudXB0byggMTAgKSB7CisgIAkgKiAgIHByaW50bG4gaXQKKyAgCSAqIH08L3ByZT4KKyAgCSAqIFByaW50cyBudW1iZXJzIDAuMSwgMS4xLCAyLjEuLi4gdG8gOS4xCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgICBhIEJpZ0RlY2ltYWwKKyAgICAgKiBAcGFyYW0gdG8gdGhlIGVuZCBudW1iZXIKKyAgICAgKiBAcGFyYW0gY2xvc3VyZSB0aGUgY29kZSB0byBleGVjdXRlIGZvciBlYWNoIG51bWJlcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB1cHRvKEJpZ0RlY2ltYWwgc2VsZiwgTnVtYmVyIHRvLCBDbG9zdXJlIGNsb3N1cmUpIHsKKyAgICAgICAgZmluYWwgQmlnRGVjaW1hbCBvbmUgPSBuZXcgQmlnRGVjaW1hbCgiMS4wIik7CisgICAgICAgIGlmICh0byBpbnN0YW5jZW9mIEJpZ0RlY2ltYWwpIHsKKyAgICAgICAgICAgIEJpZ0RlY2ltYWwgdG8xID0gKEJpZ0RlY2ltYWwpIHRvOworICAgICAgICAgICAgaWYgKHNlbGYuY29tcGFyZVRvKHRvMSkgPD0gMCkgeworICAgICAgICAgICAgICAgIGZvciAoQmlnRGVjaW1hbCBpID0gc2VsZjsgaS5jb21wYXJlVG8odG8xKSA8PSAwOyBpID0gaS5hZGQob25lKSkgeworICAgICAgICAgICAgICAgICAgICBjbG9zdXJlLmNhbGwoaSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEdyb292eVJ1bnRpbWVFeGNlcHRpb24oIkluZmluaXRlIGxvb3AgaW4gIiArIHNlbGYgKyAiLnVwdG8oIiArIHRvICsgIikiKTsKKyAgICAgICAgfSBlbHNlIGlmICh0byBpbnN0YW5jZW9mIEJpZ0ludGVnZXIpIHsKKyAgICAgICAgICAgIEJpZ0RlY2ltYWwgdG8xID0gbmV3IEJpZ0RlY2ltYWwoKEJpZ0ludGVnZXIpIHRvKTsKKyAgICAgICAgICAgIGlmIChzZWxmLmNvbXBhcmVUbyh0bzEpIDw9IDApIHsKKyAgICAgICAgICAgICAgICBmb3IgKEJpZ0RlY2ltYWwgaSA9IHNlbGY7IGkuY29tcGFyZVRvKHRvMSkgPD0gMDsgaSA9IGkuYWRkKG9uZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2xvc3VyZS5jYWxsKGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBHcm9vdnlSdW50aW1lRXhjZXB0aW9uKCJJbmZpbml0ZSBsb29wIGluICIgKyBzZWxmICsgIi51cHRvKCIgKyB0byArICIpIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBCaWdEZWNpbWFsIHRvMSA9IG5ldyBCaWdEZWNpbWFsKCIiICsgdG8pOworICAgICAgICAgICAgaWYgKHNlbGYuY29tcGFyZVRvKHRvMSkgPD0gMCkgeworICAgICAgICAgICAgICAgIGZvciAoQmlnRGVjaW1hbCBpID0gc2VsZjsgaS5jb21wYXJlVG8odG8xKSA8PSAwOyBpID0gaS5hZGQob25lKSkgeworICAgICAgICAgICAgICAgICAgICBjbG9zdXJlLmNhbGwoaSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEdyb292eVJ1bnRpbWVFeGNlcHRpb24oIkluZmluaXRlIGxvb3AgaW4gIiArIHNlbGYgKyAiLnVwdG8oIiArIHRvICsgIikiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEl0ZXJhdGVzIGZyb20gdGhpcyBudW1iZXIgZG93biB0byB0aGUgZ2l2ZW4gbnVtYmVyLCBpbmNsdXNpdmUsCisgICAgICogZGVjcmVtZW50aW5nIGJ5IG9uZSBlYWNoIHRpbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgICBhIE51bWJlcgorICAgICAqIEBwYXJhbSB0byAgICAgIGFub3RoZXIgTnVtYmVyIHRvIGdvIGRvd24gdG8KKyAgICAgKiBAcGFyYW0gY2xvc3VyZSB0aGUgY2xvc3VyZSB0byBjYWxsCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGRvd250byhOdW1iZXIgc2VsZiwgTnVtYmVyIHRvLCBDbG9zdXJlIGNsb3N1cmUpIHsKKyAgICAgICAgaW50IHNlbGYxID0gc2VsZi5pbnRWYWx1ZSgpOworICAgICAgICBpbnQgdG8xID0gdG8uaW50VmFsdWUoKTsKKyAgICAgICAgaWYgKHNlbGYxID49IHRvMSkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IHNlbGYxOyBpID49IHRvMTsgaS0tKSB7CisgICAgICAgICAgICAgICAgY2xvc3VyZS5jYWxsKG5ldyBJbnRlZ2VyKGkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICB0aHJvdyBuZXcgR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbigiSW5maW5pdGUgbG9vcCBpbiAiICsgc2VsZiArICIuZG93bnRvKCIgKyB0byArICIpIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogSXRlcmF0ZXMgZnJvbSB0aGlzIG51bWJlciBkb3duIHRvIHRoZSBnaXZlbiBudW1iZXIsIGluY2x1c2l2ZSwKKyAgICAgKiBkZWNyZW1lbnRpbmcgYnkgb25lIGVhY2ggdGltZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmICAgIGEgbG9uZworICAgICAqIEBwYXJhbSB0byB0aGUgZW5kIG51bWJlcgorICAgICAqIEBwYXJhbSBjbG9zdXJlIHRoZSBjb2RlIHRvIGV4ZWN1dGUgZm9yIGVhY2ggbnVtYmVyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGRvd250byhsb25nIHNlbGYsIE51bWJlciB0bywgQ2xvc3VyZSBjbG9zdXJlKSB7CisgICAgICAgIGxvbmcgdG8xID0gdG8ubG9uZ1ZhbHVlKCk7CisgICAgICAgIGlmIChzZWxmID49IHRvMSkgeworICAgICAgICAgICAgZm9yIChsb25nIGkgPSBzZWxmOyBpID49IHRvMTsgaS0tKSB7CisgICAgICAgICAgICAgICAgY2xvc3VyZS5jYWxsKG5ldyBMb25nKGkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICB0aHJvdyBuZXcgR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbigiSW5maW5pdGUgbG9vcCBpbiAiICsgc2VsZiArICIuZG93bnRvKCIgKyB0byArICIpIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogSXRlcmF0ZXMgZnJvbSB0aGlzIG51bWJlciBkb3duIHRvIHRoZSBnaXZlbiBudW1iZXIsIGluY2x1c2l2ZSwKKyAgICAgKiBkZWNyZW1lbnRpbmcgYnkgb25lIGVhY2ggdGltZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmICAgIGEgTG9uZworICAgICAqIEBwYXJhbSB0byB0aGUgZW5kIG51bWJlcgorICAgICAqIEBwYXJhbSBjbG9zdXJlIHRoZSBjb2RlIHRvIGV4ZWN1dGUgZm9yIGVhY2ggbnVtYmVyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGRvd250byhMb25nIHNlbGYsIE51bWJlciB0bywgQ2xvc3VyZSBjbG9zdXJlKSB7CisgICAgICAgIGxvbmcgc2VsZjEgPSBzZWxmLmxvbmdWYWx1ZSgpOworICAgICAgICBsb25nIHRvMSA9IHRvLmxvbmdWYWx1ZSgpOworICAgICAgICBpZiAoc2VsZjEgPj0gdG8xKSB7CisgICAgICAgICAgICBmb3IgKGxvbmcgaSA9IHNlbGYxOyBpID49IHRvMTsgaS0tKSB7CisgICAgICAgICAgICAgICAgY2xvc3VyZS5jYWxsKG5ldyBMb25nKGkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICB0aHJvdyBuZXcgR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbigiSW5maW5pdGUgbG9vcCBpbiAiICsgc2VsZiArICIuZG93bnRvKCIgKyB0byArICIpIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogSXRlcmF0ZXMgZnJvbSB0aGlzIG51bWJlciBkb3duIHRvIHRoZSBnaXZlbiBudW1iZXIsIGluY2x1c2l2ZSwKKyAgICAgKiBkZWNyZW1lbnRpbmcgYnkgb25lIGVhY2ggdGltZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmICAgIGEgZmxvYXQKKyAgICAgKiBAcGFyYW0gdG8gdGhlIGVuZCBudW1iZXIKKyAgICAgKiBAcGFyYW0gY2xvc3VyZSB0aGUgY29kZSB0byBleGVjdXRlIGZvciBlYWNoIG51bWJlcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkb3dudG8oZmxvYXQgc2VsZiwgTnVtYmVyIHRvLCBDbG9zdXJlIGNsb3N1cmUpIHsKKyAgICAgICAgZmxvYXQgdG8xID0gdG8uZmxvYXRWYWx1ZSgpOworICAgICAgICBpZiAoc2VsZiA+PSB0bzEpIHsKKyAgICAgICAgICAgIGZvciAoZmxvYXQgaSA9IHNlbGY7IGkgPj0gdG8xOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBjbG9zdXJlLmNhbGwobmV3IEZsb2F0KGkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICB0aHJvdyBuZXcgR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbigiSW5maW5pdGUgbG9vcCBpbiAiICsgc2VsZiArICIuZG93bnRvKCIgKyB0byArICIpIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogSXRlcmF0ZXMgZnJvbSB0aGlzIG51bWJlciBkb3duIHRvIHRoZSBnaXZlbiBudW1iZXIsIGluY2x1c2l2ZSwKKyAgICAgKiBkZWNyZW1lbnRpbmcgYnkgb25lIGVhY2ggdGltZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmICAgIGEgRmxvYXQKKyAgICAgKiBAcGFyYW0gdG8gdGhlIGVuZCBudW1iZXIKKyAgICAgKiBAcGFyYW0gY2xvc3VyZSB0aGUgY29kZSB0byBleGVjdXRlIGZvciBlYWNoIG51bWJlcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkb3dudG8oRmxvYXQgc2VsZiwgTnVtYmVyIHRvLCBDbG9zdXJlIGNsb3N1cmUpIHsKKyAgICAgICAgZmxvYXQgc2VsZjEgPSBzZWxmLmZsb2F0VmFsdWUoKTsKKyAgICAgICAgZmxvYXQgdG8xID0gdG8uZmxvYXRWYWx1ZSgpOworICAgICAgICBpZiAoc2VsZjEgPj0gdG8xKSB7CisgICAgICAgICAgICBmb3IgKGZsb2F0IGkgPSBzZWxmMTsgaSA+PSB0bzE7IGktLSkgeworICAgICAgICAgICAgICAgIGNsb3N1cmUuY2FsbChuZXcgRmxvYXQoaSkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHRocm93IG5ldyBHcm9vdnlSdW50aW1lRXhjZXB0aW9uKCJJbmZpbml0ZSBsb29wIGluICIgKyBzZWxmICsgIi5kb3dudG8oIiArIHRvICsgIikiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJdGVyYXRlcyBmcm9tIHRoaXMgbnVtYmVyIGRvd24gdG8gdGhlIGdpdmVuIG51bWJlciwgaW5jbHVzaXZlLAorICAgICAqIGRlY3JlbWVudGluZyBieSBvbmUgZWFjaCB0aW1lLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgICAgYSBkb3VibGUKKyAgICAgKiBAcGFyYW0gdG8gdGhlIGVuZCBudW1iZXIKKyAgICAgKiBAcGFyYW0gY2xvc3VyZSB0aGUgY29kZSB0byBleGVjdXRlIGZvciBlYWNoIG51bWJlcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkb3dudG8oZG91YmxlIHNlbGYsIE51bWJlciB0bywgQ2xvc3VyZSBjbG9zdXJlKSB7CisgICAgICAgIGRvdWJsZSB0bzEgPSB0by5kb3VibGVWYWx1ZSgpOworICAgICAgICBpZiAoc2VsZiA+PSB0bzEpIHsKKyAgICAgICAgICAgIGZvciAoZG91YmxlIGkgPSBzZWxmOyBpID49IHRvMTsgaS0tKSB7CisgICAgICAgICAgICAgICAgY2xvc3VyZS5jYWxsKG5ldyBEb3VibGUoaSkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHRocm93IG5ldyBHcm9vdnlSdW50aW1lRXhjZXB0aW9uKCJJbmZpbml0ZSBsb29wIGluICIgKyBzZWxmICsgIi5kb3dudG8oIiArIHRvICsgIikiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJdGVyYXRlcyBmcm9tIHRoaXMgbnVtYmVyIGRvd24gdG8gdGhlIGdpdmVuIG51bWJlciwgaW5jbHVzaXZlLAorICAgICAqIGRlY3JlbWVudGluZyBieSBvbmUgZWFjaCB0aW1lLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgICAgYSBEb3VibGUKKyAgICAgKiBAcGFyYW0gdG8gdGhlIGVuZCBudW1iZXIKKyAgICAgKiBAcGFyYW0gY2xvc3VyZSB0aGUgY29kZSB0byBleGVjdXRlIGZvciBlYWNoIG51bWJlcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkb3dudG8oRG91YmxlIHNlbGYsIE51bWJlciB0bywgQ2xvc3VyZSBjbG9zdXJlKSB7CisgICAgICAgIGRvdWJsZSBzZWxmMSA9IHNlbGYuZG91YmxlVmFsdWUoKTsKKyAgICAgICAgZG91YmxlIHRvMSA9IHRvLmRvdWJsZVZhbHVlKCk7CisgICAgICAgIGlmIChzZWxmMSA+PSB0bzEpIHsKKyAgICAgICAgICAgIGZvciAoZG91YmxlIGkgPSBzZWxmMTsgaSA+PSB0bzE7IGktLSkgeworICAgICAgICAgICAgICAgIGNsb3N1cmUuY2FsbChuZXcgRG91YmxlKGkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICB0aHJvdyBuZXcgR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbigiSW5maW5pdGUgbG9vcCBpbiAiICsgc2VsZiArICIuZG93bnRvKCIgKyB0byArICIpIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogSXRlcmF0ZXMgZnJvbSB0aGlzIG51bWJlciBkb3duIHRvIHRoZSBnaXZlbiBudW1iZXIsIGluY2x1c2l2ZSwKKyAgICAgKiBkZWNyZW1lbnRpbmcgYnkgb25lIGVhY2ggdGltZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmICAgIGEgQmlnSW50ZWdlcgorICAgICAqIEBwYXJhbSB0byB0aGUgZW5kIG51bWJlcgorICAgICAqIEBwYXJhbSBjbG9zdXJlIHRoZSBjb2RlIHRvIGV4ZWN1dGUgZm9yIGVhY2ggbnVtYmVyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGRvd250byhCaWdJbnRlZ2VyIHNlbGYsIE51bWJlciB0bywgQ2xvc3VyZSBjbG9zdXJlKSB7CisgICAgICAgIGlmICh0byBpbnN0YW5jZW9mIEJpZ0RlY2ltYWwpIHsKKyAgICAgICAgICAgIGZpbmFsIEJpZ0RlY2ltYWwgb25lID0gbmV3IEJpZ0RlY2ltYWwoIjEuMCIpOworICAgICAgICAgICAgZmluYWwgQmlnRGVjaW1hbCB0bzEgPSAoQmlnRGVjaW1hbCkgdG87CisgICAgICAgICAgICBmaW5hbCBCaWdEZWNpbWFsIHNlbGZEID0gbmV3IEJpZ0RlY2ltYWwoc2VsZik7CisgICAgICAgICAgICBpZiAoc2VsZkQuY29tcGFyZVRvKHRvMSkgPj0gMCkgeworICAgICAgICAgICAgICAgIGZvciAoQmlnRGVjaW1hbCBpID0gc2VsZkQ7IGkuY29tcGFyZVRvKHRvMSkgPj0gMDsgaSA9IGkuc3VidHJhY3Qob25lKSkgeworICAgICAgICAgICAgICAgICAgICBjbG9zdXJlLmNhbGwoaS50b0JpZ0ludGVnZXIoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEdyb292eVJ1bnRpbWVFeGNlcHRpb24oIkluZmluaXRlIGxvb3AgaW4gIiArIHNlbGYgKyAiLmRvd250bygiICsgdG8gKyAiKSIpOworICAgICAgICB9IGVsc2UgaWYgKHRvIGluc3RhbmNlb2YgQmlnSW50ZWdlcikgeworICAgICAgICAgICAgZmluYWwgQmlnSW50ZWdlciBvbmUgPSBuZXcgQmlnSW50ZWdlcigiMSIpOworICAgICAgICAgICAgZmluYWwgQmlnSW50ZWdlciB0bzEgPSAoQmlnSW50ZWdlcikgdG87CisgICAgICAgICAgICBpZiAoc2VsZi5jb21wYXJlVG8odG8xKSA+PSAwKSB7CisgICAgICAgICAgICAgICAgZm9yIChCaWdJbnRlZ2VyIGkgPSBzZWxmOyBpLmNvbXBhcmVUbyh0bzEpID49IDA7IGkgPSBpLnN1YnRyYWN0KG9uZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2xvc3VyZS5jYWxsKGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBHcm9vdnlSdW50aW1lRXhjZXB0aW9uKCJJbmZpbml0ZSBsb29wIGluICIgKyBzZWxmICsgIi5kb3dudG8oIiArIHRvICsgIikiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpbmFsIEJpZ0ludGVnZXIgb25lID0gbmV3IEJpZ0ludGVnZXIoIjEiKTsKKyAgICAgICAgICAgIGZpbmFsIEJpZ0ludGVnZXIgdG8xID0gbmV3IEJpZ0ludGVnZXIoIiIgKyB0byk7CisgICAgICAgICAgICBpZiAoc2VsZi5jb21wYXJlVG8odG8xKSA+PSAwKSB7CisgICAgICAgICAgICAgICAgZm9yIChCaWdJbnRlZ2VyIGkgPSBzZWxmOyBpLmNvbXBhcmVUbyh0bzEpID49IDA7IGkgPSBpLnN1YnRyYWN0KG9uZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2xvc3VyZS5jYWxsKGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBHcm9vdnlSdW50aW1lRXhjZXB0aW9uKCJJbmZpbml0ZSBsb29wIGluICIgKyBzZWxmICsgIi5kb3dudG8oIiArIHRvICsgIikiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEl0ZXJhdGVzIGZyb20gdGhpcyBudW1iZXIgZG93biB0byB0aGUgZ2l2ZW4gbnVtYmVyLCBpbmNsdXNpdmUsCisgICAgICogZGVjcmVtZW50aW5nIGJ5IG9uZSBlYWNoIHRpbWUuICBFYWNoIG51bWJlciBpcyBwYXNzZWQgdG8gdGhlIGNsb3N1cmUuCisgICAgICogRXhhbXBsZToKKyAgICAgKiA8cHJlPjEwLjUuZG93bnRvKDApIHsKKyAgICAgKiAgIHByaW50bG4gaXQKKwkgKiB9PC9wcmU+CisJICogUHJpbnRzIG51bWJlcnMgMTAuNSwgOS41IC4uLiB0byAwLjUuCisJICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgICBhIEJpZ0RlY2ltYWwKKyAgICAgKiBAcGFyYW0gdG8gdGhlIGVuZCBudW1iZXIKKyAgICAgKiBAcGFyYW0gY2xvc3VyZSB0aGUgY29kZSB0byBleGVjdXRlIGZvciBlYWNoIG51bWJlcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkb3dudG8oQmlnRGVjaW1hbCBzZWxmLCBOdW1iZXIgdG8sIENsb3N1cmUgY2xvc3VyZSkgeworICAgICAgICBmaW5hbCBCaWdEZWNpbWFsIG9uZSA9IG5ldyBCaWdEZWNpbWFsKCIxLjAiKTsKKyAgICAgICAgaWYgKHRvIGluc3RhbmNlb2YgQmlnRGVjaW1hbCkgeworICAgICAgICAgICAgQmlnRGVjaW1hbCB0bzEgPSAoQmlnRGVjaW1hbCkgdG87CisgICAgICAgICAgICBpZiAoc2VsZi5jb21wYXJlVG8odG8xKSA+PSAwKSB7CisgICAgICAgICAgICAgICAgZm9yIChCaWdEZWNpbWFsIGkgPSBzZWxmOyBpLmNvbXBhcmVUbyh0bzEpID49IDA7IGkgPSBpLnN1YnRyYWN0KG9uZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2xvc3VyZS5jYWxsKGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBHcm9vdnlSdW50aW1lRXhjZXB0aW9uKCJJbmZpbml0ZSBsb29wIGluICIgKyBzZWxmICsgIi5kb3dudG8oIiArIHRvICsgIikiKTsKKyAgICAgICAgfSBlbHNlIGlmICh0byBpbnN0YW5jZW9mIEJpZ0ludGVnZXIpIHsKKyAgICAgICAgICAgIEJpZ0RlY2ltYWwgdG8xID0gbmV3IEJpZ0RlY2ltYWwoKEJpZ0ludGVnZXIpIHRvKTsKKyAgICAgICAgICAgIGlmIChzZWxmLmNvbXBhcmVUbyh0bzEpID49IDApIHsKKyAgICAgICAgICAgICAgICBmb3IgKEJpZ0RlY2ltYWwgaSA9IHNlbGY7IGkuY29tcGFyZVRvKHRvMSkgPj0gMDsgaSA9IGkuc3VidHJhY3Qob25lKSkgeworICAgICAgICAgICAgICAgICAgICBjbG9zdXJlLmNhbGwoaSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEdyb292eVJ1bnRpbWVFeGNlcHRpb24oIkluZmluaXRlIGxvb3AgaW4gIiArIHNlbGYgKyAiLmRvd250bygiICsgdG8gKyAiKSIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQmlnRGVjaW1hbCB0bzEgPSBuZXcgQmlnRGVjaW1hbCgiIiArIHRvKTsKKyAgICAgICAgICAgIGlmIChzZWxmLmNvbXBhcmVUbyh0bzEpID49IDApIHsKKyAgICAgICAgICAgICAgICBmb3IgKEJpZ0RlY2ltYWwgaSA9IHNlbGY7IGkuY29tcGFyZVRvKHRvMSkgPj0gMDsgaSA9IGkuc3VidHJhY3Qob25lKSkgeworICAgICAgICAgICAgICAgICAgICBjbG9zdXJlLmNhbGwoaSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEdyb292eVJ1bnRpbWVFeGNlcHRpb24oIkluZmluaXRlIGxvb3AgaW4gIiArIHNlbGYgKyAiLmRvd250bygiICsgdG8gKyAiKSIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSXRlcmF0ZXMgZnJvbSB0aGlzIG51bWJlciB1cCB0byB0aGUgZ2l2ZW4gbnVtYmVyIHVzaW5nIGEgc3RlcCBpbmNyZW1lbnQuCisgICAgICogRWFjaCBpbnRlcm1lZGlhdGUgbnVtYmVyIGlzIHBhc3NlZCB0byB0aGUgZ2l2ZW4gY2xvc3VyZS4gIEV4YW1wbGU6CisgICAgICogPHByZT4wLnN0ZXAoIDEwLCAyICkgeworICAgICAqICAgcHJpbnRsbiBpdAorICAgICAqIH08L3ByZT4KKyAgICAgKiBQcmludHMgZXZlbiBudW1iZXJzIDAgdGhyb3VnaCA4LgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgICAgICAgYSBOdW1iZXIgdG8gc3RhcnQgd2l0aAorICAgICAqIEBwYXJhbSB0byAgICAgICAgIGEgTnVtYmVyIHRvIGdvIHVwIHRvLCBleGNsdXNpdmUKKyAgICAgKiBAcGFyYW0gc3RlcE51bWJlciBhIE51bWJlciByZXByZXNlbnRpbmcgdGhlIHN0ZXAgaW5jcmVtZW50CisgICAgICogQHBhcmFtIGNsb3N1cmUgICAgdGhlIGNsb3N1cmUgdG8gY2FsbAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzdGVwKE51bWJlciBzZWxmLCBOdW1iZXIgdG8sIE51bWJlciBzdGVwTnVtYmVyLCBDbG9zdXJlIGNsb3N1cmUpIHsKKyAgICAgICAgaWYgKHNlbGYgaW5zdGFuY2VvZiBCaWdEZWNpbWFsIHx8IHRvIGluc3RhbmNlb2YgQmlnRGVjaW1hbCB8fCBzdGVwTnVtYmVyIGluc3RhbmNlb2YgQmlnRGVjaW1hbCkgeworICAgICAgICAgICAgZmluYWwgQmlnRGVjaW1hbCB6ZXJvID0gbmV3IEJpZ0RlY2ltYWwoIjAuMCIpOworICAgICAgICAgICAgQmlnRGVjaW1hbCBzZWxmMSA9IChzZWxmIGluc3RhbmNlb2YgQmlnRGVjaW1hbCkgPyAoQmlnRGVjaW1hbCkgc2VsZiA6IG5ldyBCaWdEZWNpbWFsKCIiICsgc2VsZik7CisgICAgICAgICAgICBCaWdEZWNpbWFsIHRvMSA9ICh0byBpbnN0YW5jZW9mIEJpZ0RlY2ltYWwpID8gKEJpZ0RlY2ltYWwpIHRvIDogbmV3IEJpZ0RlY2ltYWwoIiIgKyB0byk7CisgICAgICAgICAgICBCaWdEZWNpbWFsIHN0ZXBOdW1iZXIxID0gKHN0ZXBOdW1iZXIgaW5zdGFuY2VvZiBCaWdEZWNpbWFsKSA/IChCaWdEZWNpbWFsKSBzdGVwTnVtYmVyIDogbmV3IEJpZ0RlY2ltYWwoIiIgKyBzdGVwTnVtYmVyKTsKKyAgICAgICAgICAgIGlmIChzdGVwTnVtYmVyMS5jb21wYXJlVG8oemVybykgPiAwICYmIHRvMS5jb21wYXJlVG8oc2VsZjEpID4gMCkgeworICAgICAgICAgICAgICAgIGZvciAoQmlnRGVjaW1hbCBpID0gc2VsZjE7IGkuY29tcGFyZVRvKHRvMSkgPCAwOyBpID0gaS5hZGQoc3RlcE51bWJlcjEpKSB7CisgICAgICAgICAgICAgICAgICAgIGNsb3N1cmUuY2FsbChpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0ZXBOdW1iZXIxLmNvbXBhcmVUbyh6ZXJvKSA8IDAgJiYgdG8xLmNvbXBhcmVUbyhzZWxmMSkgPCAwKSB7CisgICAgICAgICAgICAgICAgZm9yIChCaWdEZWNpbWFsIGkgPSBzZWxmMTsgaS5jb21wYXJlVG8odG8xKSA+IDA7IGkgPSBpLmFkZChzdGVwTnVtYmVyMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2xvc3VyZS5jYWxsKGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBHcm9vdnlSdW50aW1lRXhjZXB0aW9uKCJJbmZpbml0ZSBsb29wIGluICIgKyBzZWxmMSArICIuc3RlcCgiICsgdG8xICsgIiwgIiArIHN0ZXBOdW1iZXIxICsgIikiKTsKKyAgICAgICAgfSBlbHNlIGlmIChzZWxmIGluc3RhbmNlb2YgQmlnSW50ZWdlciB8fCB0byBpbnN0YW5jZW9mIEJpZ0ludGVnZXIgfHwgc3RlcE51bWJlciBpbnN0YW5jZW9mIEJpZ0ludGVnZXIpIHsKKyAgICAgICAgICAgIGZpbmFsIEJpZ0ludGVnZXIgemVybyA9IG5ldyBCaWdJbnRlZ2VyKCIwIik7CisgICAgICAgICAgICBCaWdJbnRlZ2VyIHNlbGYxID0gKHNlbGYgaW5zdGFuY2VvZiBCaWdJbnRlZ2VyKSA/IChCaWdJbnRlZ2VyKSBzZWxmIDogbmV3IEJpZ0ludGVnZXIoIiIgKyBzZWxmKTsKKyAgICAgICAgICAgIEJpZ0ludGVnZXIgdG8xID0gKHRvIGluc3RhbmNlb2YgQmlnSW50ZWdlcikgPyAoQmlnSW50ZWdlcikgdG8gOiBuZXcgQmlnSW50ZWdlcigiIiArIHRvKTsKKyAgICAgICAgICAgIEJpZ0ludGVnZXIgc3RlcE51bWJlcjEgPSAoc3RlcE51bWJlciBpbnN0YW5jZW9mIEJpZ0ludGVnZXIpID8gKEJpZ0ludGVnZXIpIHN0ZXBOdW1iZXIgOiBuZXcgQmlnSW50ZWdlcigiIiArIHN0ZXBOdW1iZXIpOworICAgICAgICAgICAgaWYgKHN0ZXBOdW1iZXIxLmNvbXBhcmVUbyh6ZXJvKSA+IDAgJiYgdG8xLmNvbXBhcmVUbyhzZWxmMSkgPiAwKSB7CisgICAgICAgICAgICAgICAgZm9yIChCaWdJbnRlZ2VyIGkgPSBzZWxmMTsgaS5jb21wYXJlVG8odG8xKSA8IDA7IGkgPSBpLmFkZChzdGVwTnVtYmVyMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2xvc3VyZS5jYWxsKGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RlcE51bWJlcjEuY29tcGFyZVRvKHplcm8pIDwgMCAmJiB0bzEuY29tcGFyZVRvKHNlbGYxKSA8IDApIHsKKyAgICAgICAgICAgICAgICBmb3IgKEJpZ0ludGVnZXIgaSA9IHNlbGYxOyBpLmNvbXBhcmVUbyh0bzEpID4gMDsgaSA9IGkuYWRkKHN0ZXBOdW1iZXIxKSkgeworICAgICAgICAgICAgICAgICAgICBjbG9zdXJlLmNhbGwoaSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEdyb292eVJ1bnRpbWVFeGNlcHRpb24oIkluZmluaXRlIGxvb3AgaW4gIiArIHNlbGYxICsgIi5zdGVwKCIgKyB0bzEgKyAiLCAiICsgc3RlcE51bWJlcjEgKyAiKSIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IHNlbGYxID0gc2VsZi5pbnRWYWx1ZSgpOworICAgICAgICAgICAgaW50IHRvMSA9IHRvLmludFZhbHVlKCk7CisgICAgICAgICAgICBpbnQgc3RlcE51bWJlcjEgPSBzdGVwTnVtYmVyLmludFZhbHVlKCk7CisgICAgICAgICAgICBpZiAoc3RlcE51bWJlcjEgPiAwICYmIHRvMSA+IHNlbGYxKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IHNlbGYxOyBpIDwgdG8xOyBpICs9IHN0ZXBOdW1iZXIxKSB7CisgICAgICAgICAgICAgICAgICAgIGNsb3N1cmUuY2FsbChuZXcgSW50ZWdlcihpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChzdGVwTnVtYmVyMSA8IDAgJiYgdG8xIDwgc2VsZjEpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gc2VsZjE7IGkgPiB0bzE7IGkgKz0gc3RlcE51bWJlcjEpIHsKKyAgICAgICAgICAgICAgICAgICAgY2xvc3VyZS5jYWxsKG5ldyBJbnRlZ2VyKGkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbigiSW5maW5pdGUgbG9vcCBpbiAiICsgc2VsZjEgKyAiLnN0ZXAoIiArIHRvMSArICIsICIgKyBzdGVwTnVtYmVyMSArICIpIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGFic29sdXRlIHZhbHVlCisgICAgICoKKyAgICAgKiBAcGFyYW0gbnVtYmVyIGEgTnVtYmVyCisgICAgICogQHJldHVybiB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhhdCBOdW1iZXIKKyAgICAgKi8KKyAgICAvL05vdGU6ICBUaGlzIG1ldGhvZCBpcyBOT1QgY2FsbGVkIGlmIG51bWJlciBpcyBhIEJpZ0ludGVnZXIgb3IgQmlnRGVjaW1hbCBiZWNhdXNlCisgICAgLy90aG9zZSBjbGFzc2VzIGltcGxlbWVudCBhIG1ldGhvZCB3aXRoIGEgYmV0dGVyIGV4YWN0IG1hdGNoLgorICAgIHB1YmxpYyBzdGF0aWMgaW50IGFicyhOdW1iZXIgbnVtYmVyKSB7CisgICAgICAgIHJldHVybiBNYXRoLmFicyhudW1iZXIuaW50VmFsdWUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBhYnNvbHV0ZSB2YWx1ZQorICAgICAqCisgICAgICogQHBhcmFtIG51bWJlciBhIExvbmcKKyAgICAgKiBAcmV0dXJuIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGF0IExvbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGxvbmcgYWJzKExvbmcgbnVtYmVyKSB7CisgICAgICAgIHJldHVybiBNYXRoLmFicyhudW1iZXIubG9uZ1ZhbHVlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgYWJzb2x1dGUgdmFsdWUKKyAgICAgKgorICAgICAqIEBwYXJhbSBudW1iZXIgYSBGbG9hdAorICAgICAqIEByZXR1cm4gdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoYXQgRmxvYXQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZsb2F0IGFicyhGbG9hdCBudW1iZXIpIHsKKyAgICAgICAgcmV0dXJuIE1hdGguYWJzKG51bWJlci5mbG9hdFZhbHVlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgYWJzb2x1dGUgdmFsdWUKKyAgICAgKgorICAgICAqIEBwYXJhbSBudW1iZXIgYSBEb3VibGUKKyAgICAgKiBAcmV0dXJuIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGF0IERvdWJsZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIGFicyhEb3VibGUgbnVtYmVyKSB7CisgICAgICAgIHJldHVybiBNYXRoLmFicyhudW1iZXIuZG91YmxlVmFsdWUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBhYnNvbHV0ZSB2YWx1ZQorICAgICAqCisgICAgICogQHBhcmFtIG51bWJlciBhIEZsb2F0CisgICAgICogQHJldHVybiB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhhdCBGbG9hdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IHJvdW5kKEZsb2F0IG51bWJlcikgeworICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChudW1iZXIuZmxvYXRWYWx1ZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSb3VuZCB0aGUgdmFsdWUKKyAgICAgKgorICAgICAqIEBwYXJhbSBudW1iZXIgYSBEb3VibGUKKyAgICAgKiBAcmV0dXJuIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGF0IERvdWJsZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgbG9uZyByb3VuZChEb3VibGUgbnVtYmVyKSB7CisgICAgICAgIHJldHVybiBNYXRoLnJvdW5kKG51bWJlci5kb3VibGVWYWx1ZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBhIFN0cmluZyBpbnRvIGFuIEludGVnZXIKKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmIGEgU3RyaW5nCisgICAgICogQHJldHVybiBhbiBJbnRlZ2VyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBJbnRlZ2VyIHRvSW50ZWdlcihTdHJpbmcgc2VsZikgeworICAgICAgICByZXR1cm4gSW50ZWdlci52YWx1ZU9mKHNlbGYudHJpbSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBhIFN0cmluZyBpbnRvIGEgTG9uZworICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgYSBTdHJpbmcKKyAgICAgKiBAcmV0dXJuIGEgTG9uZworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTG9uZyB0b0xvbmcoU3RyaW5nIHNlbGYpIHsKKyAgICAgICAgcmV0dXJuIExvbmcudmFsdWVPZihzZWxmLnRyaW0oKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2UgYSBTdHJpbmcgaW50byBhIEZsb2F0CisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiBhIFN0cmluZworICAgICAqIEByZXR1cm4gYSBGbG9hdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRmxvYXQgdG9GbG9hdChTdHJpbmcgc2VsZikgeworICAgICAgICByZXR1cm4gRmxvYXQudmFsdWVPZihzZWxmLnRyaW0oKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2UgYSBTdHJpbmcgaW50byBhIERvdWJsZQorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgYSBTdHJpbmcKKyAgICAgKiBAcmV0dXJuIGEgRG91YmxlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBEb3VibGUgdG9Eb3VibGUoU3RyaW5nIHNlbGYpIHsKKyAgICAgICAgcmV0dXJuIERvdWJsZS52YWx1ZU9mKHNlbGYudHJpbSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBhIFN0cmluZyBpbnRvIGEgQmlnSW50ZWdlcgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgYSBTdHJpbmcKKyAgICAgKiBAcmV0dXJuIGEgQmlnSW50ZWdlcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQmlnSW50ZWdlciB0b0JpZ0ludGVnZXIoU3RyaW5nIHNlbGYpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBCaWdJbnRlZ2VyKHNlbGYudHJpbSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBhIFN0cmluZyBpbnRvIGEgQmlnRGVjaW1hbAorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgYSBTdHJpbmcKKyAgICAgKiBAcmV0dXJuIGEgQmlnRGVjaW1hbAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQmlnRGVjaW1hbCB0b0JpZ0RlY2ltYWwoU3RyaW5nIHNlbGYpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBCaWdEZWNpbWFsKHNlbGYudHJpbSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmUgaWYgYSBTdHJpbmcgY2FuIGJlIHBhcnNlZCBpbnRvIGFuIEludGVnZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiBhIFN0cmluZworICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3RyaW5nIGNhbiBiZSBwYXJzZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNJbnRlZ2VyKFN0cmluZyBzZWxmKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJbnRlZ2VyLnZhbHVlT2Yoc2VsZi50cmltKCkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZSBpZiBhIFN0cmluZyBjYW4gYmUgcGFyc2VkIGludG8gYSBMb25nLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgYSBTdHJpbmcKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHN0cmluZyBjYW4gYmUgcGFyc2VkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTG9uZyhTdHJpbmcgc2VsZikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgTG9uZy52YWx1ZU9mKHNlbGYudHJpbSgpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmUgaWYgYSBTdHJpbmcgY2FuIGJlIHBhcnNlZCBpbnRvIGEgRmxvYXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiBhIFN0cmluZworICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3RyaW5nIGNhbiBiZSBwYXJzZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNGbG9hdChTdHJpbmcgc2VsZikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgRmxvYXQudmFsdWVPZihzZWxmLnRyaW0oKSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lIGlmIGEgU3RyaW5nIGNhbiBiZSBwYXJzZWQgaW50byBhIERvdWJsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmIGEgU3RyaW5nCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzdHJpbmcgY2FuIGJlIHBhcnNlZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RvdWJsZShTdHJpbmcgc2VsZikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgRG91YmxlLnZhbHVlT2Yoc2VsZi50cmltKCkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZSBpZiBhIFN0cmluZyBjYW4gYmUgcGFyc2VkIGludG8gYSBCaWdJbnRlZ2VyLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgYSBTdHJpbmcKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHN0cmluZyBjYW4gYmUgcGFyc2VkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQmlnSW50ZWdlcihTdHJpbmcgc2VsZikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IEJpZ0ludGVnZXIoc2VsZi50cmltKCkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZSBpZiBhIFN0cmluZyBjYW4gYmUgcGFyc2VkIGludG8gYSBCaWdEZWNpbWFsLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgYSBTdHJpbmcKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHN0cmluZyBjYW4gYmUgcGFyc2VkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQmlnRGVjaW1hbChTdHJpbmcgc2VsZikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IEJpZ0RlY2ltYWwoc2VsZi50cmltKCkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZSBpZiBhIFN0cmluZyBjYW4gYmUgcGFyc2VkIGludG8gYSBOdW1iZXIuCisgICAgICogU3lub255bSBmb3IgJ2lzQmlnRGVjaW1hbCgpJy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmIGEgU3RyaW5nCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzdHJpbmcgY2FuIGJlIHBhcnNlZAorICAgICAqIEBzZWUgI2lzQmlnRGVjaW1hbChTdHJpbmcpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTnVtYmVyKFN0cmluZyBzZWxmKSB7CisgICAgICAgIHJldHVybiBpc0JpZ0RlY2ltYWwoc2VsZik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJhbnNmb3JtIGEgTnVtYmVyIGludG8gYW4gSW50ZWdlcgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgYSBOdW1iZXIKKyAgICAgKiBAcmV0dXJuIGFuIEludGVnZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEludGVnZXIgdG9JbnRlZ2VyKE51bWJlciBzZWxmKSB7CisgICAgICAgIHJldHVybiBuZXcgSW50ZWdlcihzZWxmLmludFZhbHVlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyYW5zZm9ybSBhIE51bWJlciBpbnRvIGEgTG9uZworICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgYSBOdW1iZXIKKyAgICAgKiBAcmV0dXJuIGFuIExvbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExvbmcgdG9Mb25nKE51bWJlciBzZWxmKSB7CisgICAgICAgIHJldHVybiBuZXcgTG9uZyhzZWxmLmxvbmdWYWx1ZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmFuc2Zvcm0gYSBOdW1iZXIgaW50byBhIEZsb2F0CisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiBhIE51bWJlcgorICAgICAqIEByZXR1cm4gYW4gRmxvYXQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEZsb2F0IHRvRmxvYXQoTnVtYmVyIHNlbGYpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGbG9hdChzZWxmLmZsb2F0VmFsdWUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJhbnNmb3JtIGEgTnVtYmVyIGludG8gYSBEb3VibGUKKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmIGEgTnVtYmVyCisgICAgICogQHJldHVybiBhbiBEb3VibGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIERvdWJsZSB0b0RvdWJsZShOdW1iZXIgc2VsZikgeworICAgICAgICByZXR1cm4gbmV3IERvdWJsZShzZWxmLmRvdWJsZVZhbHVlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyYW5zZm9ybSBhIE51bWJlciBpbnRvIGEgQmlnRGVjaW1hbAorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgYSBOdW1iZXIKKyAgICAgKiBAcmV0dXJuIGFuIEJpZ0RlY2ltYWwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEJpZ0RlY2ltYWwgdG9CaWdEZWNpbWFsKE51bWJlciBzZWxmKSB7CisgICAgICAgIHJldHVybiBuZXcgQmlnRGVjaW1hbChzZWxmLmRvdWJsZVZhbHVlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyYW5zZm9ybSB0aGlzIG51bWJlciB0byBhIHRoZSBnaXZlbiB0eXBlLCB1c2luZyB0aGUgJ2FzJyBvcGVyYXRvci4gIFRoZQorICAgICAqIGZvbGxvd2luZyB0eXBlcyBhcmUgc3VwcG9ydGVkIGluIGFkZGl0aW9uIHRvIHRoZSBkZWZhdWx0CisgICAgICoge0BsaW5rICNhc1R5cGUoT2JqZWN0LENsYXNzKX06CisgICAgICogPHVsPgorICAgICAqICA8bGk+QmlnRGVjaW1hbDwvbGk+CisgICAgICogIDxsaT5CaWdJbnRlZ2VyPC9saT4KKyAgICAgKiAgPGxpPkRvdWJsZTwvbGk+CisgICAgICogIDxsaT5GbG9hdDwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiBAcGFyYW0gc2VsZiB0aGlzIG51bWJlcgorICAgICAqIEBwYXJhbSBjIHRoZSBkZXNpcmVkIHR5cGUgb2YgdGhlIHRyYW5zZm9ybWVkIHJlc3VsdAorICAgICAqIEByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgdGhlIGdpdmVuIHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBhc1R5cGUoTnVtYmVyIHNlbGYsIENsYXNzIGMpIHsKKyAgICAgICAgaWYgKGMgPT0gQmlnRGVjaW1hbC5jbGFzcykgeworICAgICAgICAgICAgcmV0dXJuIHRvQmlnRGVjaW1hbChzZWxmKTsKKyAgICAgICAgfSBlbHNlIGlmIChjID09IEJpZ0ludGVnZXIuY2xhc3MpIHsKKyAgICAgICAgICAgIHJldHVybiB0b0JpZ0ludGVnZXIoc2VsZik7CisgICAgICAgIH0gZWxzZSBpZiAoYyA9PSBEb3VibGUuY2xhc3MpIHsKKyAgICAgICAgICAgIHJldHVybiB0b0RvdWJsZShzZWxmKTsKKyAgICAgICAgfSBlbHNlIGlmIChjID09IEZsb2F0LmNsYXNzKSB7CisgICAgICAgICAgICByZXR1cm4gdG9GbG9hdChzZWxmKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYXNUeXBlKChPYmplY3QpIHNlbGYsIGMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyYW5zZm9ybSB0aGlzIE51bWJlciBpbnRvIGEgQmlnSW50ZWdlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmIGEgTnVtYmVyCisgICAgICogQHJldHVybiBhbiBCaWdJbnRlZ2VyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBCaWdJbnRlZ2VyIHRvQmlnSW50ZWdlcihOdW1iZXIgc2VsZikgeworICAgICAgICByZXR1cm4gbmV3IEJpZ0ludGVnZXIoTG9uZy50b1N0cmluZyhzZWxmLmxvbmdWYWx1ZSgpKSk7CisgICAgfQorCisgICAgLy8gRGF0ZSBtZXRob2RzCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvKioKKyAgICAgKiBJbmNyZW1lbnQgYSBEYXRlIGJ5IG9uZSBkYXkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiBhIERhdGUKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IGRheXMgZGF0ZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRGF0ZSBuZXh0KERhdGUgc2VsZikgeworICAgICAgICByZXR1cm4gcGx1cyhzZWxmLCAxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmNyZW1lbnQgYSBqYXZhLnNxbC5EYXRlIGJ5IG9uZSBkYXkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiBhIGphdmEuc3FsLkRhdGUKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IGRheXMgZGF0ZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgamF2YS5zcWwuRGF0ZSBuZXh0KGphdmEuc3FsLkRhdGUgc2VsZikgeworICAgICAgICByZXR1cm4gbmV3IGphdmEuc3FsLkRhdGUobmV4dCgoRGF0ZSkgc2VsZikuZ2V0VGltZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWNyZW1lbnQgYSBEYXRlIGJ5IG9uZSBkYXkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiBhIERhdGUKKyAgICAgKiBAcmV0dXJuIHRoZSBwcmV2aW91cyBkYXlzIGRhdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIERhdGUgcHJldmlvdXMoRGF0ZSBzZWxmKSB7CisgICAgICAgIHJldHVybiBtaW51cyhzZWxmLCAxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWNyZW1lbnQgYSBqYXZhLnNxbC5EYXRlIGJ5IG9uZSBkYXkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiBhIGphdmEuc3FsLkRhdGUKKyAgICAgKiBAcmV0dXJuIHRoZSBwcmV2aW91cyBkYXlzIGRhdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGphdmEuc3FsLkRhdGUgcHJldmlvdXMoamF2YS5zcWwuRGF0ZSBzZWxmKSB7CisgICAgICAgIHJldHVybiBuZXcgamF2YS5zcWwuRGF0ZShwcmV2aW91cygoRGF0ZSkgc2VsZikuZ2V0VGltZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBudW1iZXIgb2YgZGF5cyB0byB0aGlzIGRhdGUgYW5kIHJldHVybnMgdGhlIG5ldyBkYXRlLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgYSBEYXRlCisgICAgICogQHBhcmFtIGRheXMgdGhlIG51bWJlciBvZiBkYXlzIHRvIGluY3JlYXNlCisgICAgICogQHJldHVybiB0aGUgbmV3IGRhdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIERhdGUgcGx1cyhEYXRlIHNlbGYsIGludCBkYXlzKSB7CisgICAgICAgIENhbGVuZGFyIGNhbGVuZGFyID0gKENhbGVuZGFyKSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpLmNsb25lKCk7CisgICAgICAgIGNhbGVuZGFyLnNldFRpbWUoc2VsZik7CisgICAgICAgIGNhbGVuZGFyLmFkZChDYWxlbmRhci5EQVlfT0ZfWUVBUiwgZGF5cyk7CisgICAgICAgIHJldHVybiBjYWxlbmRhci5nZXRUaW1lKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgbnVtYmVyIG9mIGRheXMgdG8gdGhpcyBkYXRlIGFuZCByZXR1cm5zIHRoZSBuZXcgZGF0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmIGEgamF2YS5zcWwuRGF0ZQorICAgICAqIEBwYXJhbSBkYXlzIHRoZSBudW1iZXIgb2YgZGF5cyB0byBpbmNyZWFzZQorICAgICAqIEByZXR1cm4gdGhlIG5ldyBkYXRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBqYXZhLnNxbC5EYXRlIHBsdXMoamF2YS5zcWwuRGF0ZSBzZWxmLCBpbnQgZGF5cykgeworICAgICAgICByZXR1cm4gbmV3IGphdmEuc3FsLkRhdGUocGx1cygoRGF0ZSkgc2VsZiwgZGF5cykuZ2V0VGltZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdWJ0cmFjdCBhIG51bWJlciBvZiBkYXlzIGZyb20gdGhpcyBkYXRlIGFuZCByZXR1cm5zIHRoZSBuZXcgZGF0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmIGEgRGF0ZQorICAgICAqIEBwYXJhbSBkYXlzIHRoZSBudW1iZXIgb2YgZGF5cyB0byBzdWJ0cmFjdAorICAgICAqIEByZXR1cm4gdGhlIG5ldyBkYXRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBEYXRlIG1pbnVzKERhdGUgc2VsZiwgaW50IGRheXMpIHsKKyAgICAgICAgcmV0dXJuIHBsdXMoc2VsZiwgLWRheXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN1YnRyYWN0IGEgbnVtYmVyIG9mIGRheXMgZnJvbSB0aGlzIGRhdGUgYW5kIHJldHVybnMgdGhlIG5ldyBkYXRlLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgYSBqYXZhLnNxbC5EYXRlCisgICAgICogQHBhcmFtIGRheXMgdGhlIG51bWJlciBvZiBkYXlzIHRvIHN1YnRyYWN0CisgICAgICogQHJldHVybiB0aGUgbmV3IGRhdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGphdmEuc3FsLkRhdGUgbWludXMoamF2YS5zcWwuRGF0ZSBzZWxmLCBpbnQgZGF5cykgeworICAgICAgICByZXR1cm4gbmV3IGphdmEuc3FsLkRhdGUobWludXMoKERhdGUpIHNlbGYsIGRheXMpLmdldFRpbWUoKSk7CisgICAgfQorCisgICAgLy8gQm9vbGVhbiBiYXNlZCBtZXRob2RzCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBwdWJsaWMgc3RhdGljIEJvb2xlYW4gYW5kKEJvb2xlYW4gbGVmdCwgQm9vbGVhbiByaWdodCkgeworICAgICAgICByZXR1cm4gQm9vbGVhbi52YWx1ZU9mKGxlZnQuYm9vbGVhblZhbHVlKCkgJiYgcmlnaHQuYm9vbGVhblZhbHVlKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQm9vbGVhbiBvcihCb29sZWFuIGxlZnQsIEJvb2xlYW4gcmlnaHQpIHsKKyAgICAgICAgcmV0dXJuIEJvb2xlYW4udmFsdWVPZihsZWZ0LmJvb2xlYW5WYWx1ZSgpIHx8IHJpZ2h0LmJvb2xlYW5WYWx1ZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEJvb2xlYW4geG9yKEJvb2xlYW4gbGVmdCwgQm9vbGVhbiByaWdodCkgeworICAgICAgICByZXR1cm4gQm9vbGVhbi52YWx1ZU9mKGxlZnQuYm9vbGVhblZhbHVlKCkgXiByaWdodC5ib29sZWFuVmFsdWUoKSk7CisgICAgfQorCisvLyAgICBwdWJsaWMgc3RhdGljIEJvb2xlYW4gbmVnYXRlKEJvb2xlYW4gbGVmdCkgeworLy8gICAgICAgIHJldHVybiBCb29sZWFuLnZhbHVlT2YoIWxlZnQuYm9vbGVhblZhbHVlKCkpOworLy8gICAgfQorCisgICAgLy8gRmlsZSBhbmQgc3RyZWFtIGJhc2VkIG1ldGhvZHMKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbiBvYmplY3QgaW5wdXQgc3RyZWFtIGZvciB0aGlzIGZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZSBhIGZpbGUKKyAgICAgKiBAcmV0dXJuIGFuIG9iamVjdCBpbnB1dCBzdHJlYW0KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIElPRXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdElucHV0U3RyZWFtIG5ld09iamVjdElucHV0U3RyZWFtKEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gb2JqZWN0IG91dHB1dCBzdHJlYW0gZm9yIHRoaXMgZmlsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlIGEgZmlsZQorICAgICAqIEByZXR1cm4gYW4gb2JqZWN0IG91dHB1dCBzdHJlYW0KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIElPRXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdE91dHB1dFN0cmVhbSBuZXdPYmplY3RPdXRwdXRTdHJlYW0oRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IE9iamVjdE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSXRlcmF0ZXMgdGhyb3VnaCB0aGUgZ2l2ZW4gZmlsZSBvYmplY3QgYnkgb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgICAgYSBGaWxlCisgICAgICogQHBhcmFtIGNsb3N1cmUgYSBjbG9zdXJlCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAgICAgICAgICAgIGlmIGFuIElPRXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gaWYgdGhlIGNsYXNzICBpcyBub3QgZm91bmQuCisgICAgICogQHNlZSAjZWFjaE9iamVjdChPYmplY3RJbnB1dFN0cmVhbSxDbG9zdXJlKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBlYWNoT2JqZWN0KEZpbGUgc2VsZiwgQ2xvc3VyZSBjbG9zdXJlKSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBlYWNoT2JqZWN0KG5ld09iamVjdElucHV0U3RyZWFtKHNlbGYpLCBjbG9zdXJlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJdGVyYXRlcyB0aHJvdWdoIHRoZSBnaXZlbiBvYmplY3Qgc3RyZWFtIG9iamVjdCBieSBvYmplY3QuIFRoZQorICAgICAqIE9iamVjdElucHV0U3RyZWFtIGlzIGNsb3NlZCBhZnRlcndhcmRzLgorICAgICAqCisgICAgICogQHBhcmFtIG9pcyAgICAgYW4gT2JqZWN0SW5wdXRTdHJlYW0sIGNsb3NlZCBhZnRlciB0aGUgb3BlcmF0aW9uCisgICAgICogQHBhcmFtIGNsb3N1cmUgYSBjbG9zdXJlCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAgICAgICAgICAgIGlmIGFuIElPRXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gaWYgdGhlIGNsYXNzICBpcyBub3QgZm91bmQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGVhY2hPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gb2lzLCBDbG9zdXJlIGNsb3N1cmUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIE9iamVjdCBvYmogPSBvaXMucmVhZE9iamVjdCgpOworICAgICAgICAgICAgICAgICAgICAvLyB3ZSBhbGxvdyBudWxsIG9iamVjdHMgaW4gdGhlIG9iamVjdCBzdHJlYW0KKyAgICAgICAgICAgICAgICAgICAgY2xvc3VyZS5jYWxsKG9iaik7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRU9GRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgSW5wdXRTdHJlYW0gdGVtcCA9IG9pczsKKyAgICAgICAgICAgIG9pcyA9IG51bGw7CisgICAgICAgICAgICB0ZW1wLmNsb3NlKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAob2lzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBvaXMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB0aGlzIGV4Y2VwdGlvbiBzaW5jZSB0aGVyZQorICAgICAgICAgICAgICAgICAgICAvLyBoYXMgdG8gYmUgYW5vdGhlciBhbHJlYWR5CisgICAgICAgICAgICAgICAgICAgIExPRy53YXJuaW5nKCJDYXVnaHQgZXhjZXB0aW9uIGNsb3NpbmcgT2JqZWN0SW5wdXRTdHJlYW06ICIgKyBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0gZm9yIHRoaXMgZmlsZSBhbmQgcGFzcyBpdCB0byB0aGUgY2xvc3VyZS4KKyAgICAgKiBUaGlzIG1ldGhvZCBlbnN1cmVzIHRoZSBzdHJlYW0gaXMgY2xvc2VkIGFmdGVyIHRoZSBjbG9zdXJlIHJldHVybnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZSAgICBhIEZpbGUKKyAgICAgKiBAcGFyYW0gY2xvc3VyZSBhIGNsb3N1cmUKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIElPRXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgKiBAc2VlICN3aXRoU3RyZWFtKElucHV0U3RyZWFtLENsb3N1cmUpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHdpdGhPYmplY3RJbnB1dFN0cmVhbShGaWxlIGZpbGUsIENsb3N1cmUgY2xvc3VyZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgd2l0aFN0cmVhbShuZXdPYmplY3RJbnB1dFN0cmVhbShmaWxlKSwgY2xvc3VyZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IE9iamVjdE91dHB1dFN0cmVhbSBmb3IgdGhpcyBmaWxlIGFuZCB0aGVuIHBhc3MgaXQgdG8gdGhlCisgICAgICogY2xvc3VyZS4gIFRoaXMgbWV0aG9kIGVuc3VyZXMgdGhlIHN0cmVhbSBpcyBjbG9zZWQgYWZ0ZXIgdGhlIGNsb3N1cmUKKyAgICAgKiByZXR1cm5zLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGUgICAgYSBGaWxlCisgICAgICogQHBhcmFtIGNsb3N1cmUgYSBjbG9zdXJlCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBJT0V4Y2VwdGlvbiBvY2N1cnMuCisgICAgICogQHNlZSAjd2l0aFN0cmVhbShPdXRwdXRTdHJlYW0sQ2xvc3VyZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd2l0aE9iamVjdE91dHB1dFN0cmVhbShGaWxlIGZpbGUsIENsb3N1cmUgY2xvc3VyZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgd2l0aFN0cmVhbShuZXdPYmplY3RPdXRwdXRTdHJlYW0oZmlsZSksIGNsb3N1cmUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEl0ZXJhdGVzIHRocm91Z2ggdGhpcyBmaWxlIGxpbmUgYnkgbGluZS4gIEVhY2ggbGluZSBpcyBwYXNzZWQKKyAgICAgKiB0byB0aGUgZ2l2ZW4gY2xvc3VyZS4gIFRoZSBmaWxlIHJlYWRlciBpcyBjbG9zZWQgYmVmb3JlIHRoaXMgbWV0aG9kCisgICAgICogcmV0dXJucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmICAgIGEgRmlsZQorICAgICAqIEBwYXJhbSBjbG9zdXJlIGEgY2xvc3VyZQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gSU9FeGNlcHRpb24gb2NjdXJzLgorICAgICAqIEBzZWUgI2VhY2hMaW5lKFJlYWRlcixDbG9zdXJlKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBlYWNoTGluZShGaWxlIHNlbGYsIENsb3N1cmUgY2xvc3VyZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZWFjaExpbmUobmV3UmVhZGVyKHNlbGYpLCBjbG9zdXJlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJdGVyYXRlcyB0aHJvdWdoIHRoZSBnaXZlbiByZWFkZXIgbGluZSBieSBsaW5lLiAgRWFjaCBsaW5lIGlzIHBhc3NlZAorICAgICAqIHRvIHRoZSBnaXZlbiBjbG9zdXJlLiAgVGhlIFJlYWRlciBpcyBjbG9zZWQgYmVmb3JlIHRoaXMgbWV0aG9kIHJldHVybnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgICBhIFJlYWRlciwgY2xvc2VkIGFmdGVyIHRoZSBtZXRob2QgcmV0dXJucworICAgICAqIEBwYXJhbSBjbG9zdXJlIGEgY2xvc3VyZQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gSU9FeGNlcHRpb24gb2NjdXJzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBlYWNoTGluZShSZWFkZXIgc2VsZiwgQ2xvc3VyZSBjbG9zdXJlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBCdWZmZXJlZFJlYWRlciBiciAvKiA9IG51bGwgKi87CisKKyAgICAgICAgaWYgKHNlbGYgaW5zdGFuY2VvZiBCdWZmZXJlZFJlYWRlcikKKyAgICAgICAgICAgIGJyID0gKEJ1ZmZlcmVkUmVhZGVyKSBzZWxmOworICAgICAgICBlbHNlCisgICAgICAgICAgICBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihzZWxmKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbGluZSA9IGJyLnJlYWRMaW5lKCk7CisgICAgICAgICAgICAgICAgaWYgKGxpbmUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjbG9zdXJlLmNhbGwobGluZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgUmVhZGVyIHRlbXAgPSBzZWxmOworICAgICAgICAgICAgc2VsZiA9IG51bGw7CisgICAgICAgICAgICB0ZW1wLmNsb3NlKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBjbG9zZVJlYWRlcldpdGhXYXJuaW5nKHNlbGYpOworICAgICAgICAgICAgY2xvc2VSZWFkZXJXaXRoV2FybmluZyhicik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJdGVyYXRlcyB0aHJvdWdoIHRoaXMgZmlsZSBsaW5lIGJ5IGxpbmUsIHNwbGl0dGluZyBvbiB0aGUgc2VwZXJhdG9yLgorICAgICAqIFRoZSBsaXN0IG9mIHRva2VucyBmb3IgZWFjaCBsaW5lIGlzIHRoZW4gcGFzc2VkIHRvIHRoZSBnaXZlbiBjbG9zdXJlLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgICAgYSBGaWxlCisgICAgICogQHBhcmFtIHNlcCAgICAgYSBTdHJpbmcgc2VwYXJhdG9yCisgICAgICogQHBhcmFtIGNsb3N1cmUgYSBjbG9zdXJlCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBJT0V4Y2VwdGlvbiBvY2N1cnMuCisgICAgICogQHNlZSAjc3BsaXRFYWNoTGluZShSZWFkZXIsU3RyaW5nLENsb3N1cmUpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNwbGl0RWFjaExpbmUoRmlsZSBzZWxmLCBTdHJpbmcgc2VwLCBDbG9zdXJlIGNsb3N1cmUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHNwbGl0RWFjaExpbmUobmV3UmVhZGVyKHNlbGYpLCBzZXAsIGNsb3N1cmUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEl0ZXJhdGVzIHRocm91Z2ggdGhlIGdpdmVuIHJlYWRlciBsaW5lIGJ5IGxpbmUsIHNwbGl0dGluZyBlYWNoIGxpbmUgdXNpbmcKKyAgICAgKiB0aGUgZ2l2ZW4gc2VwYXJhdG9yLiAgVGhlIGxpc3Qgb2YgdG9rZW5zIGZvciBlYWNoIGxpbmUgaXMgdGhlbiBwYXNzZWQgdG8KKyAgICAgKiB0aGUgZ2l2ZW4gY2xvc3VyZS4gIFRoZSBSZWFkZXIgaXMgY2xvc2VkIGFmdGVyd2FyZHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgICBhIFJlYWRlciwgY2xvc2VkIGFmdGVyIHRoZSBtZXRob2QgcmV0dXJucworICAgICAqIEBwYXJhbSBzZXAgICAgIGEgU3RyaW5nIHNlcGFyYXRvcgorICAgICAqIEBwYXJhbSBjbG9zdXJlIGEgY2xvc3VyZQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gSU9FeGNlcHRpb24gb2NjdXJzLgorICAgICAqIEBzZWUgU3RyaW5nI3NwbGl0KFN0cmluZykKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc3BsaXRFYWNoTGluZShSZWFkZXIgc2VsZiwgU3RyaW5nIHNlcCwgQ2xvc3VyZSBjbG9zdXJlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBCdWZmZXJlZFJlYWRlciBiciAvKiA9IG51bGwgKi87CisKKyAgICAgICAgaWYgKHNlbGYgaW5zdGFuY2VvZiBCdWZmZXJlZFJlYWRlcikKKyAgICAgICAgICAgIGJyID0gKEJ1ZmZlcmVkUmVhZGVyKSBzZWxmOworICAgICAgICBlbHNlCisgICAgICAgICAgICBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihzZWxmKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbGluZSA9IGJyLnJlYWRMaW5lKCk7CisgICAgICAgICAgICAgICAgaWYgKGxpbmUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBMaXN0IHZhbHMgPSBBcnJheXMuYXNMaXN0KGxpbmUuc3BsaXQoc2VwKSk7CisgICAgICAgICAgICAgICAgICAgIGNsb3N1cmUuY2FsbCh2YWxzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBSZWFkZXIgdGVtcCA9IHNlbGY7CisgICAgICAgICAgICBzZWxmID0gbnVsbDsKKyAgICAgICAgICAgIHRlbXAuY2xvc2UoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGNsb3NlUmVhZGVyV2l0aFdhcm5pbmcoc2VsZik7CisgICAgICAgICAgICBjbG9zZVJlYWRlcldpdGhXYXJuaW5nKGJyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgYSBzaW5nbGUsIHdob2xlIGxpbmUgZnJvbSB0aGUgZ2l2ZW4gUmVhZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgYSBSZWFkZXIKKyAgICAgKiBAcmV0dXJuIGEgbGluZQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gSU9FeGNlcHRpb24gb2NjdXJzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlYWRMaW5lKFJlYWRlciBzZWxmKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoc2VsZiBpbnN0YW5jZW9mIEJ1ZmZlcmVkUmVhZGVyKSB7CisgICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBiciA9IChCdWZmZXJlZFJlYWRlcikgc2VsZjsKKyAgICAgICAgICAgIHJldHVybiBici5yZWFkTGluZSgpOworICAgICAgICB9IGVsc2UgaWYgKHNlbGYubWFya1N1cHBvcnRlZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gcmVhZExpbmVGcm9tUmVhZGVyV2l0aE1hcmsoc2VsZik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlYWRMaW5lRnJvbVJlYWRlcldpdGhvdXRNYXJrKHNlbGYpOworICAgIH0KKworCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGNoYXJCdWZmZXJTaXplID0gNDA5NjsgICAgIC8vIGhhbGYgdGhlIGRlZmF1bHQgc3RyZWFtIGJ1ZmZlciBzaXplCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGV4cGVjdGVkTGluZUxlbmd0aCA9IDE2MDsgIC8vIGRvdWJsZSB0aGUgZGVmYXVsdCBsaW5lIGxlbmd0aAorICAgIHByaXZhdGUgc3RhdGljIGludCBFT0YgPSAtMTsgICAgICAgICAgICAgICAgICAvLyBFbmQgT2YgRmlsZQorCisKKyAgICAvKgorICAgICogVGhpcyBtZXRob2QgdHJpZXMgdG8gcmVhZCBzdWJzZXF1ZW50IGJ1ZmZlcnMgZnJvbSB0aGUgcmVhZGVyIHVzaW5nIGEgbWFyaworICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlYWRMaW5lRnJvbVJlYWRlcldpdGhNYXJrKGZpbmFsIFJlYWRlciBpbnB1dCkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGNoYXJbXSBjYnVmID0gbmV3IGNoYXJbY2hhckJ1ZmZlclNpemVdOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW5wdXQubWFyayhjaGFyQnVmZmVyU2l6ZSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbgorICAgICAgICAgICAgTE9HLndhcm5pbmcoIkNhdWdodCBleGNlcHRpb24gc2V0dGluZyBtYXJrIG9uIHN1cHBvcnRpbmcgcmVhZGVyOiAiICsgZSk7CisgICAgICAgICAgICAvLyBmYWxsYmFjaworICAgICAgICAgICAgcmV0dXJuIHJlYWRMaW5lRnJvbVJlYWRlcldpdGhvdXRNYXJrKGlucHV0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNvdWxkIGJlIGNoYW5nZWQgaW50byBkby4ud2hpbGUsIGJ1dCB0aGVuCisgICAgICAgIC8vIHdlIG1pZ2h0IGNyZWF0ZSBhbiBhZGRpdGlvbmFsIFN0cmluZ0J1ZmZlcgorICAgICAgICAvLyBpbnN0YW5jZSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0KKyAgICAgICAgaW50IGNvdW50ID0gaW5wdXQucmVhZChjYnVmKTsKKyAgICAgICAgaWYgKGNvdW50ID09IEVPRikgLy8gd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0IGRhdGEKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIFN0cmluZ0J1ZmZlciBsaW5lID0gbmV3IFN0cmluZ0J1ZmZlcihleHBlY3RlZExpbmVMZW5ndGgpOworICAgICAgICAvLyBub3cgd29yayBvbiB0aGUgYnVmZmVyKHMpCisgICAgICAgIGludCBscyA9IGxpbmVTZXBhcmF0b3JJbmRleChjYnVmLCBjb3VudCk7CisgICAgICAgIHdoaWxlIChscyA9PSAtMSkgeworICAgICAgICAgICAgbGluZS5hcHBlbmQoY2J1ZiwgMCwgY291bnQpOworICAgICAgICAgICAgY291bnQgPSBpbnB1dC5yZWFkKGNidWYpOworICAgICAgICAgICAgaWYgKGNvdW50ID09IEVPRikgeworICAgICAgICAgICAgICAgIC8vIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBkYXRhCisgICAgICAgICAgICAgICAgcmV0dXJuIGxpbmUudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxzID0gbGluZVNlcGFyYXRvckluZGV4KGNidWYsIGNvdW50KTsKKyAgICAgICAgfQorICAgICAgICBsaW5lLmFwcGVuZChjYnVmLCAwLCBscyk7CisKKyAgICAgICAgLy8gY29ycmVjdCBscyBpZiB3ZSBoYXZlIFxyXG4KKyAgICAgICAgaW50IHNraXBMUyA9IDE7CisgICAgICAgIGlmIChscyArIDEgPCBjb3VudCkgeworICAgICAgICAgICAgLy8gd2UgYXJlIG5vdCBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIKKyAgICAgICAgICAgIGlmIChjYnVmW2xzXSA9PSAnXHInICYmIGNidWZbbHMgKyAxXSA9PSAnXG4nKSB7CisgICAgICAgICAgICAgICAgc2tpcExTKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoY2J1Zltsc10gPT0gJ1xyJyAmJiBpbnB1dC5yZWFkKCkgPT0gJ1xuJykgeworICAgICAgICAgICAgICAgIHNraXBMUysrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy9yZXNldCgpIGFuZCBza2lwIG92ZXIgbGFzdCBsaW5lc2VwCisgICAgICAgIGlucHV0LnJlc2V0KCk7CisgICAgICAgIGlucHV0LnNraXAobGluZS5sZW5ndGgoKSArIHNraXBMUyk7CisgICAgICAgIHJldHVybiBsaW5lLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoKKyAgICAqIFRoaXMgbWV0aG9kIHJlYWRzIHdpdGhvdXQgYSBidWZmZXIuCisgICAgKiBJdCByZXR1cm5zIHRvbyBtYW55IGVtcHR5IGxpbmVzIGlmIFxyXG4gY29tYmluYXRpb25zCisgICAgKiBhcmUgdXNlZC4gTm90aGluZyBjYW4gYmUgZG9uZSBiZWNhdXNlIHdlIGNhbid0IHB1c2gKKyAgICAqIGJhY2sgdGhlIGNoYXJhY3RlciB3ZSBoYXZlIGp1c3QgcmVhZC4KKyAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyByZWFkTGluZUZyb21SZWFkZXJXaXRob3V0TWFyayhSZWFkZXIgaW5wdXQpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGludCBjID0gaW5wdXQucmVhZCgpOworICAgICAgICBpZiAoYyA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBTdHJpbmdCdWZmZXIgbGluZSA9IG5ldyBTdHJpbmdCdWZmZXIoZXhwZWN0ZWRMaW5lTGVuZ3RoKTsKKworICAgICAgICB3aGlsZSAoYyAhPSBFT0YgJiYgYyAhPSAnXG4nICYmIGMgIT0gJ1xyJykgeworICAgICAgICAgICAgY2hhciBjaCA9IChjaGFyKSBjOworICAgICAgICAgICAgbGluZS5hcHBlbmQoY2gpOworICAgICAgICAgICAgYyA9IGlucHV0LnJlYWQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGluZS50b1N0cmluZygpOworICAgIH0KKworICAgIC8qCisgICAgICogc2VhcmNoZXMgZm9yIFxuIG9yIFxyCisgICAgICogUmV0dXJucyAtMSBpZiBub3QgZm91bmQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGxpbmVTZXBhcmF0b3JJbmRleChjaGFyW10gYXJyYXksIGludCBsZW5ndGgpIHsKKyAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBsZW5ndGg7IGsrKykgeworICAgICAgICAgICAgaWYgKGlzTGluZVNlcGFyYXRvcihhcnJheVtrXSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyoKKyAgICAqIHRydWUgaWYgZWl0aGVyIFxuIG9yIFxyCisgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTGluZVNlcGFyYXRvcihjaGFyIGMpIHsKKyAgICAgICAgcmV0dXJuIGMgPT0gJ1xuJyB8fCBjID09ICdccic7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCBhIHNpbmdsZSwgd2hvbGUgbGluZSBmcm9tIHRoZSBnaXZlbiBJbnB1dFN0cmVhbQorICAgICAqCisgICAgICogQHBhcmFtIHN0cmVhbSBhbiBJbnB1dFN0cmVhbQorICAgICAqIEByZXR1cm4gYSBsaW5lCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBJT0V4Y2VwdGlvbiBvY2N1cnMuCisgICAgICogQGRlcHJlY2F0ZWQgdXNlIFJlYWRlciNyZWFkTGluZSBpbnN0ZWFkIHBsZWFzZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlYWRMaW5lKElucHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IERlcHJlY2F0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJyZWFkTGluZSgpIG9uIElucHV0U3RyZWFtIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuICIgKworICAgICAgICAgICAgICAgICAgICAgICAgIkVpdGhlciB1c2UgYSBSZWFkZXIgb3IgZW5jYXBzdWxhdGUgdGhlIElucHV0U3RyZWFtIiArCisgICAgICAgICAgICAgICAgICAgICAgICAid2l0aCBhIEJ1ZmZlcmVkUmVhZGVyIGFuZCBhbiBJbnB1dFN0cmVhbVJlYWRlci4iCisgICAgICAgICk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZHMgdGhlIGZpbGUgaW50byBhIGxpc3Qgb2YgU3RyaW5ncywgd2l0aCBvbmUgaXRlbSBmb3IgZWFjaCBsaW5lLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGUgYSBGaWxlCisgICAgICogQHJldHVybiBhIExpc3Qgb2YgbGluZXMKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIElPRXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3QgcmVhZExpbmVzKEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSXRlcmF0b3JDbG9zdXJlQWRhcHRlciBjbG9zdXJlID0gbmV3IEl0ZXJhdG9yQ2xvc3VyZUFkYXB0ZXIoZmlsZSk7CisgICAgICAgIGVhY2hMaW5lKGZpbGUsIGNsb3N1cmUpOworICAgICAgICByZXR1cm4gY2xvc3VyZS5hc0xpc3QoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIHRoZSBjb250ZW50IG9mIHRoZSBGaWxlIHVzaW5nIHRoZSBzcGVjaWZpZWQgZW5jb2RpbmcgYW5kIHJldHVybiBpdAorICAgICAqIGFzIGEgU3RyaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGUgICAgdGhlIGZpbGUgd2hvc2UgY29udGVudCB3ZSB3YW50IHRvIHJlYWQKKyAgICAgKiBAcGFyYW0gY2hhcnNldCB0aGUgY2hhcnNldCB1c2VkIHRvIHJlYWQgdGhlIGNvbnRlbnQgb2YgdGhlIGZpbGUKKyAgICAgKiBAcmV0dXJuIGEgU3RyaW5nIGNvbnRhaW5pbmcgdGhlIGNvbnRlbnQgb2YgdGhlIGZpbGUKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIElPRXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUZXh0KEZpbGUgZmlsZSwgU3RyaW5nIGNoYXJzZXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ld1JlYWRlcihmaWxlLCBjaGFyc2V0KTsKKyAgICAgICAgcmV0dXJuIGdldFRleHQocmVhZGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIHRoZSBjb250ZW50IG9mIHRoZSBGaWxlIGFuZCByZXR1cm5zIGl0IGFzIGEgU3RyaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGUgdGhlIGZpbGUgd2hvc2UgY29udGVudCB3ZSB3YW50IHRvIHJlYWQKKyAgICAgKiBAcmV0dXJuIGEgU3RyaW5nIGNvbnRhaW5pbmcgdGhlIGNvbnRlbnQgb2YgdGhlIGZpbGUKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIElPRXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUZXh0KEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3UmVhZGVyKGZpbGUpOworICAgICAgICByZXR1cm4gZ2V0VGV4dChyZWFkZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgdGhlIGNvbnRlbnQgb2YgdGhpcyBVUkwgYW5kIHJldHVybnMgaXQgYXMgYSBTdHJpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJsIFVSTCB0byByZWFkIGNvbnRlbnQgZnJvbQorICAgICAqIEByZXR1cm4gdGhlIHRleHQgZnJvbSB0aGF0IFVSTAorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gSU9FeGNlcHRpb24gb2NjdXJzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRleHQoVVJMIHVybCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdldFRleHQodXJsLCBDaGFyc2V0VG9vbGtpdC5nZXREZWZhdWx0U3lzdGVtQ2hhcnNldCgpLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgdGhlIGRhdGEgZnJvbSB0aGlzIFVSTCBhbmQgcmV0dXJuIGl0IGFzIGEgU3RyaW5nLiAgVGhlIGNvbm5lY3Rpb24KKyAgICAgKiBzdHJlYW0gaXMgY2xvc2VkIGJlZm9yZSB0aGlzIG1ldGhvZCByZXR1cm5zLgorICAgICAqCisgICAgICogQHBhcmFtIHVybCAgICAgVVJMIHRvIHJlYWQgY29udGVudCBmcm9tCisgICAgICogQHBhcmFtIGNoYXJzZXQgb3BlbnMgdGhlIHN0cmVhbSB3aXRoIGEgc3BlY2lmaWVkIGNoYXJzZXQKKyAgICAgKiBAcmV0dXJuIHRoZSB0ZXh0IGZyb20gdGhhdCBVUkwKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIElPRXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgKiBAc2VlIFVSTENvbm5lY3Rpb24jZ2V0SW5wdXRTdHJlYW0oKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRleHQoVVJMIHVybCwgU3RyaW5nIGNoYXJzZXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIodXJsLm9wZW5Db25uZWN0aW9uKCkuZ2V0SW5wdXRTdHJlYW0oKSwgY2hhcnNldCkpOworICAgICAgICByZXR1cm4gZ2V0VGV4dChyZWFkZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgdGhlIGNvbnRlbnQgb2YgdGhpcyBJbnB1dFN0cmVhbSBhbmQgcmV0dXJuIGl0IGFzIGEgU3RyaW5nLgorICAgICAqIFRoZSBzdHJlYW0gaXMgY2xvc2VkIGJlZm9yZSB0aGlzIG1ldGhvZCByZXR1cm5zLgorICAgICAqCisgICAgICogQHBhcmFtIGlzIGFuIGlucHV0IHN0cmVhbQorICAgICAqIEByZXR1cm4gdGhlIHRleHQgZnJvbSB0aGF0IFVSTAorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gSU9FeGNlcHRpb24gb2NjdXJzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRleHQoSW5wdXRTdHJlYW0gaXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaXMpKTsKKyAgICAgICAgcmV0dXJuIGdldFRleHQocmVhZGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIHRoZSBjb250ZW50IG9mIHRoaXMgSW5wdXRTdHJlYW0gdXNpbmcgc3BlY2lmaWVkIGNoYXJzZXQgYW5kIHJldHVybgorICAgICAqIGl0IGFzIGEgU3RyaW5nLiAgVGhlIHN0cmVhbSBpcyBjbG9zZWQgYmVmb3JlIHRoaXMgbWV0aG9kIHJldHVybnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaXMgICAgICBhbiBpbnB1dCBzdHJlYW0KKyAgICAgKiBAcGFyYW0gY2hhcnNldCBvcGVucyB0aGUgc3RyZWFtIHdpdGggYSBzcGVjaWZpZWQgY2hhcnNldAorICAgICAqIEByZXR1cm4gdGhlIHRleHQgZnJvbSB0aGF0IFVSTAorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gSU9FeGNlcHRpb24gb2NjdXJzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRleHQoSW5wdXRTdHJlYW0gaXMsIFN0cmluZyBjaGFyc2V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGlzLCBjaGFyc2V0KSk7CisgICAgICAgIHJldHVybiBnZXRUZXh0KHJlYWRlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCB0aGUgY29udGVudCBvZiB0aGUgUmVhZGVyIGFuZCByZXR1cm4gaXQgYXMgYSBTdHJpbmcuICBUaGUgcmVhZGVyCisgICAgICogaXMgY2xvc2VkIGJlZm9yZSB0aGlzIG1ldGhvZCByZXR1cm5zLgorICAgICAqCisgICAgICogQHBhcmFtIHJlYWRlciBhIFJlYWRlciB3aG9zZSBjb250ZW50IHdlIHdhbnQgdG8gcmVhZAorICAgICAqIEByZXR1cm4gYSBTdHJpbmcgY29udGFpbmluZyB0aGUgY29udGVudCBvZiB0aGUgYnVmZmVyZWQgcmVhZGVyCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBJT0V4Y2VwdGlvbiBvY2N1cnMuCisgICAgICogQHNlZSAjZ2V0VGV4dChCdWZmZXJlZFJlYWRlcikKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUZXh0KFJlYWRlciByZWFkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGJ1ZmZlcmVkUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKHJlYWRlcik7CisgICAgICAgIHJldHVybiBnZXRUZXh0KGJ1ZmZlcmVkUmVhZGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIHRoZSBjb250ZW50IG9mIHRoZSBCdWZmZXJlZFJlYWRlciBhbmQgcmV0dXJuIGl0IGFzIGEgU3RyaW5nLgorICAgICAqIFRoZSBCdWZmZXJlZFJlYWRlciBpcyBjbG9zZWQgYWZ0ZXJ3YXJkcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWFkZXIgYSBCdWZmZXJlZFJlYWRlciB3aG9zZSBjb250ZW50IHdlIHdhbnQgdG8gcmVhZAorICAgICAqIEByZXR1cm4gYSBTdHJpbmcgY29udGFpbmluZyB0aGUgY29udGVudCBvZiB0aGUgYnVmZmVyZWQgcmVhZGVyCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBJT0V4Y2VwdGlvbiBvY2N1cnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VGV4dChCdWZmZXJlZFJlYWRlciByZWFkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBhbnN3ZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIC8vIHJlYWRpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIGZpbGUgd2l0aGluIGEgY2hhciBidWZmZXIKKyAgICAgICAgLy8gYWxsb3cgdG8ga2VlcCB0aGUgY29ycmVjdCBsaW5lIGVuZGluZ3MKKyAgICAgICAgY2hhcltdIGNoYXJCdWZmZXIgPSBuZXcgY2hhcls0MDk2XTsKKyAgICAgICAgaW50IG5iQ2hhclJlYWQgLyogPSAwKi87CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3aGlsZSAoKG5iQ2hhclJlYWQgPSByZWFkZXIucmVhZChjaGFyQnVmZmVyKSkgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAvLyBhcHBlbmRzIGJ1ZmZlcgorICAgICAgICAgICAgICAgIGFuc3dlci5hcHBlbmQoY2hhckJ1ZmZlciwgMCwgbmJDaGFyUmVhZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBSZWFkZXIgdGVtcCA9IHJlYWRlcjsKKyAgICAgICAgICAgIHJlYWRlciA9IG51bGw7CisgICAgICAgICAgICB0ZW1wLmNsb3NlKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBjbG9zZVJlYWRlcldpdGhXYXJuaW5nKHJlYWRlcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFuc3dlci50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIHRoZSB0ZXh0IGFuZCBhcHBlbmQgYSBuZXdsaW5lICh1c2luZyB0aGUgcGxhdGZvcm0ncyBsaW5lLWVuZGluZykuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd3JpdGVyIGEgQnVmZmVyZWRXcml0ZXIKKyAgICAgKiBAcGFyYW0gbGluZSAgIHRoZSBsaW5lIHRvIHdyaXRlCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBJT0V4Y2VwdGlvbiBvY2N1cnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlTGluZShCdWZmZXJlZFdyaXRlciB3cml0ZXIsIFN0cmluZyBsaW5lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB3cml0ZXIud3JpdGUobGluZSk7CisgICAgICAgIHdyaXRlci5uZXdMaW5lKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgdGhlIHRleHQgdG8gdGhlIEZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZSBhIEZpbGUKKyAgICAgKiBAcGFyYW0gdGV4dCB0aGUgdGV4dCB0byB3cml0ZSB0byB0aGUgRmlsZQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gSU9FeGNlcHRpb24gb2NjdXJzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZShGaWxlIGZpbGUsIFN0cmluZyB0ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBCdWZmZXJlZFdyaXRlciB3cml0ZXIgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgd3JpdGVyID0gbmV3V3JpdGVyKGZpbGUpOworICAgICAgICAgICAgd3JpdGVyLndyaXRlKHRleHQpOworICAgICAgICAgICAgd3JpdGVyLmZsdXNoKCk7CisKKyAgICAgICAgICAgIFdyaXRlciB0ZW1wID0gd3JpdGVyOworICAgICAgICAgICAgd3JpdGVyID0gbnVsbDsKKyAgICAgICAgICAgIHRlbXAuY2xvc2UoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGNsb3NlV3JpdGVyV2l0aFdhcm5pbmcod3JpdGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIHRoZSB0ZXh0IHRvIHRoZSBGaWxlLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGUgYSBGaWxlCisgICAgICogQHBhcmFtIHRleHQgdGhlIHRleHQgdG8gd3JpdGUgdG8gdGhlIEZpbGUKKyAgICAgKiBAcmV0dXJuIHRoZSBvcmlnaW5hbCBmaWxlCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBJT0V4Y2VwdGlvbiBvY2N1cnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBGaWxlIGxlZnRTaGlmdChGaWxlIGZpbGUsIE9iamVjdCB0ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBhcHBlbmQoZmlsZSwgdGV4dCk7CisgICAgICAgIHJldHVybiBmaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIHRoZSB0ZXh0IHRvIHRoZSBGaWxlLCB1c2luZyB0aGUgc3BlY2lmaWVkIGVuY29kaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGUgICAgYSBGaWxlCisgICAgICogQHBhcmFtIHRleHQgICAgdGhlIHRleHQgdG8gd3JpdGUgdG8gdGhlIEZpbGUKKyAgICAgKiBAcGFyYW0gY2hhcnNldCB0aGUgY2hhcnNldCB1c2VkCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBJT0V4Y2VwdGlvbiBvY2N1cnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlKEZpbGUgZmlsZSwgU3RyaW5nIHRleHQsIFN0cmluZyBjaGFyc2V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBCdWZmZXJlZFdyaXRlciB3cml0ZXIgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgd3JpdGVyID0gbmV3V3JpdGVyKGZpbGUsIGNoYXJzZXQpOworICAgICAgICAgICAgd3JpdGVyLndyaXRlKHRleHQpOworICAgICAgICAgICAgd3JpdGVyLmZsdXNoKCk7CisKKyAgICAgICAgICAgIFdyaXRlciB0ZW1wID0gd3JpdGVyOworICAgICAgICAgICAgd3JpdGVyID0gbnVsbDsKKyAgICAgICAgICAgIHRlbXAuY2xvc2UoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGNsb3NlV3JpdGVyV2l0aFdhcm5pbmcod3JpdGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFwcGVuZCB0aGUgdGV4dCBhdCB0aGUgZW5kIG9mIHRoZSBGaWxlLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGUgYSBGaWxlCisgICAgICogQHBhcmFtIHRleHQgdGhlIHRleHQgdG8gYXBwZW5kIGF0IHRoZSBlbmQgb2YgdGhlIEZpbGUKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIElPRXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYXBwZW5kKEZpbGUgZmlsZSwgT2JqZWN0IHRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEJ1ZmZlcmVkV3JpdGVyIHdyaXRlciA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3cml0ZXIgPSBuZXdXcml0ZXIoZmlsZSwgdHJ1ZSk7CisgICAgICAgICAgICBJbnZva2VySGVscGVyLndyaXRlKHdyaXRlciwgdGV4dCk7CisgICAgICAgICAgICB3cml0ZXIuZmx1c2goKTsKKworICAgICAgICAgICAgV3JpdGVyIHRlbXAgPSB3cml0ZXI7CisgICAgICAgICAgICB3cml0ZXIgPSBudWxsOworICAgICAgICAgICAgdGVtcC5jbG9zZSgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgY2xvc2VXcml0ZXJXaXRoV2FybmluZyh3cml0ZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwZW5kIHRoZSB0ZXh0IGF0IHRoZSBlbmQgb2YgdGhlIEZpbGUsIHVzaW5nIGEgc3BlY2lmaWVkIGVuY29kaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGUgICAgYSBGaWxlCisgICAgICogQHBhcmFtIHRleHQgICAgdGhlIHRleHQgdG8gYXBwZW5kIGF0IHRoZSBlbmQgb2YgdGhlIEZpbGUKKyAgICAgKiBAcGFyYW0gY2hhcnNldCB0aGUgY2hhcnNldCB1c2VkCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBJT0V4Y2VwdGlvbiBvY2N1cnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFwcGVuZChGaWxlIGZpbGUsIE9iamVjdCB0ZXh0LCBTdHJpbmcgY2hhcnNldCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQnVmZmVyZWRXcml0ZXIgd3JpdGVyID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdyaXRlciA9IG5ld1dyaXRlcihmaWxlLCBjaGFyc2V0LCB0cnVlKTsKKyAgICAgICAgICAgIEludm9rZXJIZWxwZXIud3JpdGUod3JpdGVyLCB0ZXh0KTsKKyAgICAgICAgICAgIHdyaXRlci5mbHVzaCgpOworCisgICAgICAgICAgICBXcml0ZXIgdGVtcCA9IHdyaXRlcjsKKyAgICAgICAgICAgIHdyaXRlciA9IG51bGw7CisgICAgICAgICAgICB0ZW1wLmNsb3NlKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBjbG9zZVdyaXRlcldpdGhXYXJuaW5nKHdyaXRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyB0aGUgcmVhZGVyIGludG8gYSBsaXN0IG9mIFN0cmluZ3MsIHdpdGggb25lIGVudHJ5IGZvciBlYWNoIGxpbmUuCisgICAgICogVGhlIHJlYWRlciBpcyBjbG9zZWQgYmVmb3JlIHRoaXMgbWV0aG9kIHJldHVybnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVhZGVyIGEgUmVhZGVyCisgICAgICogQHJldHVybiBhIExpc3Qgb2YgbGluZXMKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIElPRXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3QgcmVhZExpbmVzKFJlYWRlciByZWFkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEl0ZXJhdG9yQ2xvc3VyZUFkYXB0ZXIgY2xvc3VyZSA9IG5ldyBJdGVyYXRvckNsb3N1cmVBZGFwdGVyKHJlYWRlcik7CisgICAgICAgIGVhY2hMaW5lKHJlYWRlciwgY2xvc3VyZSk7CisgICAgICAgIHJldHVybiBjbG9zdXJlLmFzTGlzdCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gdGhyb3cgdXNlZnVsIGV4Y2VwdGlvbnMgd2hlbiB0aGUgZWFjaEZpbGUqIGFuZCBlYWNoRGlyIGNsb3N1cmUgbWV0aG9kcworICAgICAqIGFyZSB1c2VkIGluY29ycmVjdGx5LgorICAgICAqCisgICAgICogQHBhcmFtIGRpciBUaGUgZGlyZWN0b3J5IHRvIGNoZWNrCisgICAgICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gICAgaWYgdGhlIGdpdmVuIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdAorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBwcm92aWRlZCBGaWxlIG9iamVjdCBkb2VzIG5vdCByZXByZXNlbnQgYSBkaXJlY3RvcnkKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrRGlyKEZpbGUgZGlyKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgICAgICBpZiAoIWRpci5leGlzdHMoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oZGlyLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgaWYgKCFkaXIuaXNEaXJlY3RvcnkoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBwcm92aWRlZCBGaWxlIG9iamVjdCBpcyBub3QgYSBkaXJlY3Rvcnk6ICIgKyBkaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbW1vbiBjb2RlIGZvciB7QGxpbmsgI2VhY2hGaWxlKEZpbGUsQ2xvc3VyZSl9IGFuZCB7QGxpbmsgI2VhY2hEaXIoRmlsZSxDbG9zdXJlKX0KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmICAgIGEgZmlsZSBvYmplY3QKKyAgICAgKiBAcGFyYW0gY2xvc3VyZSB0aGUgY2xvc3VyZSB0byBpbnZva2UKKyAgICAgKiBAcGFyYW0gb25seURpciBpZiBub3JtYWwgZmlsZSBzaG91bGQgYmUgc2tpcHBlZAorICAgICAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uICAgIGlmIHRoZSBnaXZlbiBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgcHJvdmlkZWQgRmlsZSBvYmplY3QgZG9lcyBub3QgcmVwcmVzZW50IGEgZGlyZWN0b3J5CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBlYWNoRmlsZShmaW5hbCBGaWxlIHNlbGYsIGZpbmFsIENsb3N1cmUgY2xvc3VyZSwgZmluYWwgYm9vbGVhbiBvbmx5RGlyKQorICAgICAgICAgICAgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICAgICAgY2hlY2tEaXIoc2VsZik7CisgICAgICAgIGZpbmFsIEZpbGVbXSBmaWxlcyA9IHNlbGYubGlzdEZpbGVzKCk7CisgICAgICAgIC8vIG51bGwgY2hlY2sgYmVjYXVzZSBvZiBodHRwOi8vYnVncy5zdW4uY29tL2J1Z2RhdGFiYXNlL3ZpZXdfYnVnLmRvP2J1Z19pZD00ODAzODM2CisgICAgICAgIGlmIChmaWxlcyA9PSBudWxsKSByZXR1cm47CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmICghb25seURpciB8fCBmaWxlc1tpXS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgY2xvc3VyZS5jYWxsKGZpbGVzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEludm9rZXMgdGhlIGNsb3N1cmUgZm9yIGVhY2ggZmlsZSBpbiB0aGUgZ2l2ZW4gZGlyZWN0b3J5CisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgICBhIEZpbGUKKyAgICAgKiBAcGFyYW0gY2xvc3VyZSBhIGNsb3N1cmUKKyAgICAgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiAgICBpZiB0aGUgZ2l2ZW4gZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0CisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHByb3ZpZGVkIEZpbGUgb2JqZWN0IGRvZXMgbm90IHJlcHJlc2VudCBhIGRpcmVjdG9yeQorICAgICAqIEBzZWUgRmlsZSNsaXN0RmlsZXMoKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBlYWNoRmlsZShmaW5hbCBGaWxlIHNlbGYsIGZpbmFsIENsb3N1cmUgY2xvc3VyZSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICAgICAgZWFjaEZpbGUoc2VsZiwgY2xvc3VyZSwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludm9rZXMgdGhlIGNsb3N1cmUgZm9yIGVhY2ggZGlyZWN0b3J5IGluIHRoaXMgZGlyZWN0b3J5LAorICAgICAqIGlnbm9yaW5nIHJlZ3VsYXIgZmlsZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgICBhIGRpcmVjdG9yeQorICAgICAqIEBwYXJhbSBjbG9zdXJlIGEgY2xvc3VyZQorICAgICAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uICAgIGlmIHRoZSBnaXZlbiBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgcHJvdmlkZWQgRmlsZSBvYmplY3QgZG9lcyBub3QgcmVwcmVzZW50IGEgZGlyZWN0b3J5CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGVhY2hEaXIoRmlsZSBzZWxmLCBDbG9zdXJlIGNsb3N1cmUpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgIGVhY2hGaWxlKHNlbGYsIGNsb3N1cmUsIHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbW1vbiBjb2RlIGZvciB7QGxpbmsgI2VhY2hGaWxlUmVjdXJzZShGaWxlLENsb3N1cmUpfSBhbmQge0BsaW5rICNlYWNoRGlyUmVjdXJzZShGaWxlLENsb3N1cmUpfQorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgICAgYSBmaWxlIG9iamVjdAorICAgICAqIEBwYXJhbSBjbG9zdXJlIHRoZSBjbG9zdXJlIHRvIGludm9rZSBvbiBlYWNoIGZpbGUKKyAgICAgKiBAcGFyYW0gb25seURpciBpZiBub3JtYWwgZmlsZSBzaG91bGQgYmUgc2tpcHBlZAorICAgICAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uICAgIGlmIHRoZSBnaXZlbiBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgcHJvdmlkZWQgRmlsZSBvYmplY3QgZG9lcyBub3QgcmVwcmVzZW50IGEgZGlyZWN0b3J5CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBlYWNoRmlsZVJlY3Vyc2UoZmluYWwgRmlsZSBzZWxmLCBmaW5hbCBDbG9zdXJlIGNsb3N1cmUsIGZpbmFsIGJvb2xlYW4gb25seURpcikKKyAgICAgICAgICAgIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgIGNoZWNrRGlyKHNlbGYpOworICAgICAgICBmaW5hbCBGaWxlW10gZmlsZXMgPSBzZWxmLmxpc3RGaWxlcygpOworICAgICAgICAvLyBudWxsIGNoZWNrIGJlY2F1c2Ugb2YgaHR0cDovL2J1Z3Muc3VuLmNvbS9idWdkYXRhYmFzZS92aWV3X2J1Zy5kbz9idWdfaWQ9NDgwMzgzNgorICAgICAgICBpZiAoZmlsZXMgPT0gbnVsbCkgcmV0dXJuOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZmlsZXNbaV0uaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgIGNsb3N1cmUuY2FsbChmaWxlc1tpXSk7CisgICAgICAgICAgICAgICAgZWFjaEZpbGVSZWN1cnNlKGZpbGVzW2ldLCBjbG9zdXJlLCBvbmx5RGlyKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIW9ubHlEaXIpIHsKKyAgICAgICAgICAgICAgICBjbG9zdXJlLmNhbGwoZmlsZXNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW52b2tlcyB0aGUgY2xvc3VyZSBmb3IgZWFjaCBkZXNjZW5kYW50IGZpbGUgaW4gdGhpcyBkaXJlY3RvcnkuCisgICAgICogU3ViLWRpcmVjdG9yaWVzIGFyZSByZWN1cnNpdmVseSBzZWFyY2hlZCBpbiBhIGRlcHRoLWZpcnN0IGZhc2hpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgICBhIEZpbGUKKyAgICAgKiBAcGFyYW0gY2xvc3VyZSBhIGNsb3N1cmUKKyAgICAgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiAgICBpZiB0aGUgZ2l2ZW4gZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0CisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHByb3ZpZGVkIEZpbGUgb2JqZWN0IGRvZXMgbm90IHJlcHJlc2VudCBhIGRpcmVjdG9yeQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBlYWNoRmlsZVJlY3Vyc2UoRmlsZSBzZWxmLCBDbG9zdXJlIGNsb3N1cmUpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgIGVhY2hGaWxlUmVjdXJzZShzZWxmLCBjbG9zdXJlLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW52b2tlcyB0aGUgY2xvc3VyZSBmb3IgZWFjaCBkZXNjZW5kYW50IGRpcmVjdG9yeSBvZiB0aGlzIGRpcmVjdG9yeS4KKyAgICAgKiBTdWItZGlyZWN0b3JpZXMgYXJlIHJlY3Vyc2l2ZWx5IHNlYXJjaGVkIGluIGEgZGVwdGgtZmlyc3QgZmFzaGlvbi4KKyAgICAgKiBPbmx5IGRpcmVjdG9yaWVzIGFyZSBwYXNzZWQgdG8gdGhlIGNsb3N1cmU7IHJlZ3VsYXIgZmlsZXMgYXJlIGlnbm9yZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgICBhIGRpcmVjdG9yeQorICAgICAqIEBwYXJhbSBjbG9zdXJlIGEgY2xvc3VyZQorICAgICAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uICAgIGlmIHRoZSBnaXZlbiBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgcHJvdmlkZWQgRmlsZSBvYmplY3QgZG9lcyBub3QgcmVwcmVzZW50IGEgZGlyZWN0b3J5CisgICAgICogQHNpbmNlIDEuMSBiZXRhIDEKKyAgICAgKiBAc2VlICNlYWNoRmlsZVJlY3Vyc2UoRmlsZSxDbG9zdXJlLGJvb2xlYW4pCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGVhY2hEaXJSZWN1cnNlKGZpbmFsIEZpbGUgc2VsZiwgZmluYWwgQ2xvc3VyZSBjbG9zdXJlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgICAgICBlYWNoRmlsZVJlY3Vyc2Uoc2VsZiwgY2xvc3VyZSwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tbW9uIGNvZGUgZm9yIHtAbGluayAjZWFjaEZpbGVNYXRjaChGaWxlLE9iamVjdCxDbG9zdXJlKX0gYW5kIHtAbGluayAjZWFjaERpck1hdGNoKEZpbGUsT2JqZWN0LENsb3N1cmUpfQorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgICAgYSBmaWxlCisgICAgICogQHBhcmFtIGZpbHRlciAgdGhlIGZpbHRlciB0byBwZXJmb3JtIG9uIHRoZSBkaXJlY3RvcnkgKHVzaW5nIHRoZSBpc0Nhc2Uob2JqZWN0KSBtZXRob2QpCisgICAgICogQHBhcmFtIGNsb3N1cmUgdGhlIGNsb3N1cmUgdG8gaW52b2tlCisgICAgICogQHBhcmFtIG9ubHlEaXIgaWYgbm9ybWFsIGZpbGUgc2hvdWxkIGJlIHNraXBwZWQKKyAgICAgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiAgICBpZiB0aGUgZ2l2ZW4gZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0CisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHByb3ZpZGVkIEZpbGUgb2JqZWN0IGRvZXMgbm90IHJlcHJlc2VudCBhIGRpcmVjdG9yeQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZWFjaEZpbGVNYXRjaChmaW5hbCBGaWxlIHNlbGYsIGZpbmFsIE9iamVjdCBmaWx0ZXIsIGZpbmFsIENsb3N1cmUgY2xvc3VyZSwgZmluYWwgYm9vbGVhbiBvbmx5RGlyKQorICAgICAgICAgICAgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICAgICAgY2hlY2tEaXIoc2VsZik7CisgICAgICAgIGZpbmFsIEZpbGVbXSBmaWxlcyA9IHNlbGYubGlzdEZpbGVzKCk7CisgICAgICAgIC8vIG51bGwgY2hlY2sgYmVjYXVzZSBvZiBodHRwOi8vYnVncy5zdW4uY29tL2J1Z2RhdGFiYXNlL3ZpZXdfYnVnLmRvP2J1Z19pZD00ODAzODM2CisgICAgICAgIGlmIChmaWxlcyA9PSBudWxsKSByZXR1cm47CisgICAgICAgIGZpbmFsIE1ldGFDbGFzcyBtZXRhQ2xhc3MgPSBJbnZva2VySGVscGVyLmdldE1ldGFDbGFzcyhmaWx0ZXIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBGaWxlIGN1cnJlbnRGaWxlID0gZmlsZXNbaV07CisgICAgICAgICAgICBpZiAoKCFvbmx5RGlyIHx8IGN1cnJlbnRGaWxlLmlzRGlyZWN0b3J5KCkpCisgICAgICAgICAgICAgICAgICAgICYmIERlZmF1bHRUeXBlVHJhbnNmb3JtYXRpb24uY2FzdFRvQm9vbGVhbihtZXRhQ2xhc3MuaW52b2tlTWV0aG9kKGZpbHRlciwgImlzQ2FzZSIsIGN1cnJlbnRGaWxlLmdldE5hbWUoKSkpKSB7CisgICAgICAgICAgICAgICAgY2xvc3VyZS5jYWxsKGN1cnJlbnRGaWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEludm9rZXMgdGhlIGNsb3N1cmUgZm9yIGVhY2ggZmlsZSBtYXRjaGluZyB0aGUgZ2l2ZW4gZmlsdGVyIGluIHRoZSBnaXZlbiBkaXJlY3RvcnkKKyAgICAgKiAtIGNhbGxpbmcgdGhlIGlzQ2FzZSgpIG1ldGhvZCB1c2VkIGJ5IHN3aXRjaCBzdGF0ZW1lbnRzLiAgVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQKKyAgICAgKiB3aXRoIGRpZmZlcmVudCBraW5kcyBvZiBmaWx0ZXJzIGxpa2UgcmVndWxhciBleHByZXNpb25zLCBjbGFzc2VzLCByYW5nZXMgZXRjLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgICAgYSBmaWxlCisgICAgICogQHBhcmFtIGZpbHRlciAgdGhlIGZpbHRlciB0byBwZXJmb3JtIG9uIHRoZSBkaXJlY3RvcnkgKHVzaW5nIHRoZSBpc0Nhc2Uob2JqZWN0KSBtZXRob2QpCisgICAgICogQHBhcmFtIGNsb3N1cmUgdGhlIGNsb3N1cmUgdG8gaW52b2tlCisgICAgICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gICAgaWYgdGhlIGdpdmVuIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdAorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBwcm92aWRlZCBGaWxlIG9iamVjdCBkb2VzIG5vdCByZXByZXNlbnQgYSBkaXJlY3RvcnkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZWFjaEZpbGVNYXRjaChmaW5hbCBGaWxlIHNlbGYsIGZpbmFsIE9iamVjdCBmaWx0ZXIsIGZpbmFsIENsb3N1cmUgY2xvc3VyZSkKKyAgICAgICAgICAgIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgIGVhY2hGaWxlTWF0Y2goc2VsZiwgZmlsdGVyLCBjbG9zdXJlLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW52b2tlcyB0aGUgY2xvc3VyZSBmb3IgZWFjaCBkaXJlY3RvcnkgbWF0Y2hpbmcgdGhlIGdpdmVuIGZpbHRlciBpbiB0aGUgZ2l2ZW4gZGlyZWN0b3J5CisgICAgICogLSBjYWxsaW5nIHRoZSBpc0Nhc2UoKSBtZXRob2QgdXNlZCBieSBzd2l0Y2ggc3RhdGVtZW50cy4gIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkCisgICAgICogd2l0aCBkaWZmZXJlbnQga2luZHMgb2YgZmlsdGVycyBsaWtlIHJlZ3VsYXIgZXhwcmVzaW9ucywgY2xhc3NlcywgcmFuZ2VzIGV0Yy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmICAgIGEgZmlsZQorICAgICAqIEBwYXJhbSBmaWx0ZXIgIHRoZSBmaWx0ZXIgdG8gcGVyZm9ybSBvbiB0aGUgZGlyZWN0b3J5ICh1c2luZyB0aGUgaXNDYXNlKG9iamVjdCkgbWV0aG9kKQorICAgICAqIEBwYXJhbSBjbG9zdXJlIHRoZSBjbG9zdXJlIHRvIGludm9rZQorICAgICAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uICAgIGlmIHRoZSBnaXZlbiBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgcHJvdmlkZWQgRmlsZSBvYmplY3QgZG9lcyBub3QgcmVwcmVzZW50IGEgZGlyZWN0b3J5CisgICAgICogQHNpbmNlIDEuMSBiZXRhIDEKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZWFjaERpck1hdGNoKGZpbmFsIEZpbGUgc2VsZiwgZmluYWwgT2JqZWN0IGZpbHRlciwgZmluYWwgQ2xvc3VyZSBjbG9zdXJlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgICAgICBlYWNoRmlsZU1hdGNoKHNlbGYsIGZpbHRlciwgY2xvc3VyZSwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWxsb3dzIGEgc2ltcGxlIHN5bnRheCBmb3IgdXNpbmcgdGltZXJzLiAgVGhpcyB0aW1lciB3aWxsIGV4ZWN1dGUgdGhlCisgICAgICogZ2l2ZW4gY2xvc3VyZSBhZnRlciB0aGUgZ2l2ZW4gZGVsYXkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGltZXIgICBhIHRpbWVyIG9iamVjdAorICAgICAqIEBwYXJhbSBkZWxheSAgIHRoZSBkZWxheSBpbiBtaWxsaXNlY29uZHMgYmVmb3JlIHJ1bm5pbmcgdGhlIGNsb3N1cmUgY29kZQorICAgICAqIEBwYXJhbSBjbG9zdXJlIHRoZSBjbG9zdXJlIHRvIGludm9rZQorICAgICAqIEByZXR1cm4gVGhlIHRpbWVyIHRhc2sgd2hpY2ggaGFzIGJlZW4gc2NoZWR1bGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgVGltZXJUYXNrIHJ1bkFmdGVyKFRpbWVyIHRpbWVyLCBpbnQgZGVsYXksIGZpbmFsIENsb3N1cmUgY2xvc3VyZSkgeworICAgICAgICBUaW1lclRhc2sgdGltZXJUYXNrID0gbmV3IFRpbWVyVGFzaygpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBjbG9zdXJlLmNhbGwoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgdGltZXIuc2NoZWR1bGUodGltZXJUYXNrLCBkZWxheSk7CisgICAgICAgIHJldHVybiB0aW1lclRhc2s7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgYnVmZmVyZWQgcmVhZGVyIGZvciB0aGlzIGZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZSBhIEZpbGUKKyAgICAgKiBAcmV0dXJuIGEgQnVmZmVyZWRSZWFkZXIKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIElPRXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEJ1ZmZlcmVkUmVhZGVyIG5ld1JlYWRlcihGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIENoYXJzZXRUb29sa2l0IHRvb2xraXQgPSBuZXcgQ2hhcnNldFRvb2xraXQoZmlsZSk7CisgICAgICAgIHJldHVybiB0b29sa2l0LmdldFJlYWRlcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIGJ1ZmZlcmVkIHJlYWRlciBmb3IgdGhpcyBmaWxlLCB3aXRoIHVzaW5nIHNwZWNpZmllZAorICAgICAqIGNoYXJzZXQgYXMgdGhlIGVuY29kaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGUgICAgYSBGaWxlCisgICAgICogQHBhcmFtIGNoYXJzZXQgdGhlIGNoYXJzZXQgd2l0aCB3aGljaCB3ZSB3YW50IHRvIHdyaXRlIGluIHRoZSBGaWxlCisgICAgICogQHJldHVybiBhIEJ1ZmZlcmVkUmVhZGVyCisgICAgICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gICAgICAgIGlmIHRoZSBGaWxlIHdhcyBub3QgZm91bmQKKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gaWYgdGhlIGVuY29kaW5nIHNwZWNpZmllZCBpcyBub3Qgc3VwcG9ydGVkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBCdWZmZXJlZFJlYWRlciBuZXdSZWFkZXIoRmlsZSBmaWxlLCBTdHJpbmcgY2hhcnNldCkKKyAgICAgICAgICAgIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpLCBjaGFyc2V0KSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHJlYWRlciBmb3IgdGhpcyBpbnB1dCBzdHJlYW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiBhbiBpbnB1dCBzdHJlYW0KKyAgICAgKiBAcmV0dXJuIGEgcmVhZGVyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBCdWZmZXJlZFJlYWRlciBuZXdSZWFkZXIoSW5wdXRTdHJlYW0gc2VsZikgeworICAgICAgICByZXR1cm4gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihzZWxmKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IEJ1ZmZlcmVkUmVhZGVyIGZvciB0aGlzIGZpbGUgYW5kIHRoZW4KKyAgICAgKiBwYXNzZXMgaXQgaW50byB0aGUgY2xvc3VyZSwgZW5zdXJpbmcgdGhlIHJlYWRlciBpcyBjbG9zZWQgYWZ0ZXIgdGhlCisgICAgICogY2xvc3VyZSByZXR1cm5zLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGUgICAgYSBmaWxlIG9iamVjdAorICAgICAqIEBwYXJhbSBjbG9zdXJlIGEgY2xvc3VyZQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gSU9FeGNlcHRpb24gb2NjdXJzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3aXRoUmVhZGVyKEZpbGUgZmlsZSwgQ2xvc3VyZSBjbG9zdXJlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB3aXRoUmVhZGVyKG5ld1JlYWRlcihmaWxlKSwgY2xvc3VyZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgYnVmZmVyZWQgb3V0cHV0IHN0cmVhbSBmb3IgdGhpcyBmaWxlLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGUgYSBmaWxlIG9iamVjdAorICAgICAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgT3V0cHV0U3RyZWFtCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBJT0V4Y2VwdGlvbiBvY2N1cnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBCdWZmZXJlZE91dHB1dFN0cmVhbSBuZXdPdXRwdXRTdHJlYW0oRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGRhdGEgb3V0cHV0IHN0cmVhbSBmb3IgdGhpcyBmaWxlLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGUgYSBmaWxlIG9iamVjdAorICAgICAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgRGF0YU91dHB1dFN0cmVhbQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gSU9FeGNlcHRpb24gb2NjdXJzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRGF0YU91dHB1dFN0cmVhbSBuZXdEYXRhT3V0cHV0U3RyZWFtKEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEYXRhT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IE91dHB1dFN0cmVhbSBmb3IgdGhpcyBmaWxlIGFuZCBwYXNzZXMgaXQgaW50byB0aGUgY2xvc3VyZS4KKyAgICAgKiBUaGlzIG1ldGhvZCBlbnN1cmVzIHRoZSBzdHJlYW0gaXMgY2xvc2VkIGFmdGVyIHRoZSBjbG9zdXJlIHJldHVybnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZSAgICBhIEZpbGUKKyAgICAgKiBAcGFyYW0gY2xvc3VyZSBhIGNsb3N1cmUKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIElPRXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgKiBAc2VlICN3aXRoU3RyZWFtKE91dHB1dFN0cmVhbSxDbG9zdXJlKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3aXRoT3V0cHV0U3RyZWFtKEZpbGUgZmlsZSwgQ2xvc3VyZSBjbG9zdXJlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB3aXRoU3RyZWFtKG5ld091dHB1dFN0cmVhbShmaWxlKSwgY2xvc3VyZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IElucHV0U3RyZWFtIGZvciB0aGlzIGZpbGUgYW5kIHBhc3NlcyBpdCBpbnRvIHRoZSBjbG9zdXJlLgorICAgICAqIFRoaXMgbWV0aG9kIGVuc3VyZXMgdGhlIHN0cmVhbSBpcyBjbG9zZWQgYWZ0ZXIgdGhlIGNsb3N1cmUgcmV0dXJucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlICAgIGEgRmlsZQorICAgICAqIEBwYXJhbSBjbG9zdXJlIGEgY2xvc3VyZQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gSU9FeGNlcHRpb24gb2NjdXJzLgorICAgICAqIEBzZWUgI3dpdGhTdHJlYW0oSW5wdXRTdHJlYW0sQ2xvc3VyZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd2l0aElucHV0U3RyZWFtKEZpbGUgZmlsZSwgQ2xvc3VyZSBjbG9zdXJlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB3aXRoU3RyZWFtKG5ld0lucHV0U3RyZWFtKGZpbGUpLCBjbG9zdXJlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgRGF0YU91dHB1dFN0cmVhbSBmb3IgdGhpcyBmaWxlIGFuZCBwYXNzZXMgaXQgaW50byB0aGUgY2xvc3VyZS4KKyAgICAgKiBUaGlzIG1ldGhvZCBlbnN1cmVzIHRoZSBzdHJlYW0gaXMgY2xvc2VkIGFmdGVyIHRoZSBjbG9zdXJlIHJldHVybnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZSAgICBhIEZpbGUKKyAgICAgKiBAcGFyYW0gY2xvc3VyZSBhIGNsb3N1cmUKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIElPRXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgKiBAc2VlICN3aXRoU3RyZWFtKE91dHB1dFN0cmVhbSxDbG9zdXJlKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3aXRoRGF0YU91dHB1dFN0cmVhbShGaWxlIGZpbGUsIENsb3N1cmUgY2xvc3VyZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgd2l0aFN0cmVhbShuZXdEYXRhT3V0cHV0U3RyZWFtKGZpbGUpLCBjbG9zdXJlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgRGF0YUlucHV0U3RyZWFtIGZvciB0aGlzIGZpbGUgYW5kIHBhc3NlcyBpdCBpbnRvIHRoZSBjbG9zdXJlLgorICAgICAqIFRoaXMgbWV0aG9kIGVuc3VyZXMgdGhlIHN0cmVhbSBpcyBjbG9zZWQgYWZ0ZXIgdGhlIGNsb3N1cmUgcmV0dXJucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlICAgIGEgRmlsZQorICAgICAqIEBwYXJhbSBjbG9zdXJlIGEgY2xvc3VyZQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gSU9FeGNlcHRpb24gb2NjdXJzLgorICAgICAqIEBzZWUgI3dpdGhTdHJlYW0oSW5wdXRTdHJlYW0sQ2xvc3VyZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd2l0aERhdGFJbnB1dFN0cmVhbShGaWxlIGZpbGUsIENsb3N1cmUgY2xvc3VyZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgd2l0aFN0cmVhbShuZXdEYXRhSW5wdXRTdHJlYW0oZmlsZSksIGNsb3N1cmUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIGJ1ZmZlcmVkIHdyaXRlciBmb3IgdGhpcyBmaWxlLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGUgYSBGaWxlCisgICAgICogQHJldHVybiBhIEJ1ZmZlcmVkV3JpdGVyCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBJT0V4Y2VwdGlvbiBvY2N1cnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBCdWZmZXJlZFdyaXRlciBuZXdXcml0ZXIoRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBGaWxlV3JpdGVyKGZpbGUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgYnVmZmVyZWQgd3JpdGVyIGZvciB0aGlzIGZpbGUsIG9wdGlvbmFsbHkgYXBwZW5kaW5nIHRvIHRoZQorICAgICAqIGV4aXN0aW5nIGZpbGUgY29udGVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlICAgYSBGaWxlCisgICAgICogQHBhcmFtIGFwcGVuZCB0cnVlIGlmIGRhdGEgc2hvdWxkIGJlIGFwcGVuZGVkIHRvIHRoZSBmaWxlCisgICAgICogQHJldHVybiBhIEJ1ZmZlcmVkV3JpdGVyCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBJT0V4Y2VwdGlvbiBvY2N1cnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBCdWZmZXJlZFdyaXRlciBuZXdXcml0ZXIoRmlsZSBmaWxlLCBib29sZWFuIGFwcGVuZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcihmaWxlLCBhcHBlbmQpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIGNyZWF0ZSBhIGJ1ZmZlcmVkIHdyaXRlciBmb3IgYSBmaWxlLiAgSWYgdGhlIGdpdmVuCisgICAgICogY2hhcnNldCBpcyAiVVRGLTE2QkUiIG9yICJVVEYtMTZMRSIsIHRoZSByZXF1aXNpdGUgYnl0ZSBvcmRlciBtYXJrIGlzCisgICAgICogd3JpdHRlbiB0byB0aGUgc3RyZWFtIGJlZm9yZSB0aGUgd3JpdGVyIGlzIHJldHVybmVkLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGUgICAgYSBGaWxlCisgICAgICogQHBhcmFtIGNoYXJzZXQgdGhlIG5hbWUgb2YgdGhlIGVuY29kaW5nIHVzZWQgdG8gd3JpdGUgaW4gdGhpcyBmaWxlCisgICAgICogQHBhcmFtIGFwcGVuZCAgdHJ1ZSBpZiBpbiBhcHBlbmQgbW9kZQorICAgICAqIEByZXR1cm4gYSBCdWZmZXJlZFdyaXRlcgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gSU9FeGNlcHRpb24gb2NjdXJzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQnVmZmVyZWRXcml0ZXIgbmV3V3JpdGVyKEZpbGUgZmlsZSwgU3RyaW5nIGNoYXJzZXQsIGJvb2xlYW4gYXBwZW5kKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoYXBwZW5kKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSwgYXBwZW5kKSwgY2hhcnNldCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gZmlyc3Qgd3JpdGUgdGhlIEJ5dGUgT3JkZXIgTWFyayBmb3IgVW5pY29kZSBlbmNvZGluZ3MKKyAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gc3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSk7CisgICAgICAgICAgICBpZiAoIlVURi0xNkJFIi5lcXVhbHMoY2hhcnNldCkpIHsKKyAgICAgICAgICAgICAgICB3cml0ZVV0ZjE2Qm9tKHN0cmVhbSwgdHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCJVVEYtMTZMRSIuZXF1YWxzKGNoYXJzZXQpKSB7CisgICAgICAgICAgICAgICAgd3JpdGVVdGYxNkJvbShzdHJlYW0sIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihzdHJlYW0sIGNoYXJzZXQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBidWZmZXJlZCB3cml0ZXIgZm9yIHRoaXMgZmlsZSwgd3JpdGluZyBkYXRhIHVzaW5nIHRoZSBnaXZlbgorICAgICAqIGVuY29kaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGUgICAgYSBGaWxlCisgICAgICogQHBhcmFtIGNoYXJzZXQgdGhlIG5hbWUgb2YgdGhlIGVuY29kaW5nIHVzZWQgdG8gd3JpdGUgaW4gdGhpcyBmaWxlCisgICAgICogQHJldHVybiBhIEJ1ZmZlcmVkV3JpdGVyCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBJT0V4Y2VwdGlvbiBvY2N1cnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBCdWZmZXJlZFdyaXRlciBuZXdXcml0ZXIoRmlsZSBmaWxlLCBTdHJpbmcgY2hhcnNldCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ld1dyaXRlcihmaWxlLCBjaGFyc2V0LCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgYSBCeXRlIE9yZGVyIE1hcmsgYXQgdGhlIGJlZ2luaW5nIG9mIHRoZSBmaWxlCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyZWFtICAgIHRoZSBGaWxlT3VwdXRTdHJlYW0gdG8gd3JpdGUgdGhlIEJPTSB0bworICAgICAqIEBwYXJhbSBiaWdFbmRpYW4gdHJ1ZSBpZiBVVEYgMTYgQmlnIEVuZGlhbiBvciBmYWxzZSBpZiBMb3cgRW5kaWFuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBJT0V4Y2VwdGlvbiBvY2N1cnMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZVV0ZjE2Qm9tKEZpbGVPdXRwdXRTdHJlYW0gc3RyZWFtLCBib29sZWFuIGJpZ0VuZGlhbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGJpZ0VuZGlhbikgeworICAgICAgICAgICAgc3RyZWFtLndyaXRlKC0yKTsKKyAgICAgICAgICAgIHN0cmVhbS53cml0ZSgtMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdHJlYW0ud3JpdGUoLTEpOworICAgICAgICAgICAgc3RyZWFtLndyaXRlKC0yKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgQnVmZmVyZWRXcml0ZXIgZm9yIHRoaXMgZmlsZSwgcGFzc2VzIGl0IHRvIHRoZSBjbG9zdXJlLCBhbmQKKyAgICAgKiBlbnN1cmVzIHRoZSBzdHJlYW0gaXMgZmx1c2hlZCBhbmQgY2xvc2VkIGFmdGVyIHRoZSBjbG9zdXJlIHJldHVybnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZSAgICBhIEZpbGUKKyAgICAgKiBAcGFyYW0gY2xvc3VyZSBhIGNsb3N1cmUKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIElPRXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd2l0aFdyaXRlcihGaWxlIGZpbGUsIENsb3N1cmUgY2xvc3VyZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgd2l0aFdyaXRlcihuZXdXcml0ZXIoZmlsZSksIGNsb3N1cmUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgQnVmZmVyZWRXcml0ZXIgZm9yIHRoaXMgZmlsZSwgcGFzc2VzIGl0IHRvIHRoZSBjbG9zdXJlLCBhbmQKKyAgICAgKiBlbnN1cmVzIHRoZSBzdHJlYW0gaXMgZmx1c2hlZCBhbmQgY2xvc2VkIGFmdGVyIHRoZSBjbG9zdXJlIHJldHVybnMuCisgICAgICogVGhlIHdyaXRlciB3aWxsIHVzZSB0aGUgZ2l2ZW4gY2hhcnNldCBlbmNvZGluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlICAgIGEgRmlsZQorICAgICAqIEBwYXJhbSBjaGFyc2V0IHRoZSBjaGFyc2V0IHVzZWQKKyAgICAgKiBAcGFyYW0gY2xvc3VyZSBhIGNsb3N1cmUKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIElPRXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd2l0aFdyaXRlcihGaWxlIGZpbGUsIFN0cmluZyBjaGFyc2V0LCBDbG9zdXJlIGNsb3N1cmUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHdpdGhXcml0ZXIobmV3V3JpdGVyKGZpbGUsIGNoYXJzZXQpLCBjbG9zdXJlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgQnVmZmVyZWRXcml0ZXIgd2hpY2ggd2lsbCBhcHBlbmQgdG8gdGhpcworICAgICAqIGZpbGUuICBUaGUgd3JpdGVyIGlzIHBhc3NlZCB0byB0aGUgY2xvc3VyZSBhbmQgd2lsbCBiZSBjbG9zZWQgYmVmb3JlCisgICAgICogdGhpcyBtZXRob2QgcmV0dXJucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlICAgIGEgRmlsZQorICAgICAqIEBwYXJhbSBjaGFyc2V0IHRoZSBjaGFyc2V0IHVzZWQKKyAgICAgKiBAcGFyYW0gY2xvc3VyZSBhIGNsb3N1cmUKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIElPRXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd2l0aFdyaXRlckFwcGVuZChGaWxlIGZpbGUsIFN0cmluZyBjaGFyc2V0LCBDbG9zdXJlIGNsb3N1cmUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHdpdGhXcml0ZXIobmV3V3JpdGVyKGZpbGUsIGNoYXJzZXQsIHRydWUpLCBjbG9zdXJlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgQnVmZmVyZWRXcml0ZXIgZm9yIHRoaXMgZmlsZSBpbiBhcHBlbmQgbW9kZS4gIFRoZSB3cml0ZXIKKyAgICAgKiBpcyBwYXNzZWQgdG8gdGhlIGNsb3N1cmUgYW5kIGlzIGNsb3NlZCBhZnRlciB0aGUgY2xvc3VyZSByZXR1cm5zLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGUgICAgYSBGaWxlCisgICAgICogQHBhcmFtIGNsb3N1cmUgYSBjbG9zdXJlCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBJT0V4Y2VwdGlvbiBvY2N1cnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHdpdGhXcml0ZXJBcHBlbmQoRmlsZSBmaWxlLCBDbG9zdXJlIGNsb3N1cmUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHdpdGhXcml0ZXIobmV3V3JpdGVyKGZpbGUsIHRydWUpLCBjbG9zdXJlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgUHJpbnRXcml0ZXIgZm9yIHRoaXMgZmlsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlIGEgRmlsZQorICAgICAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgUHJpbnRXcml0ZXIKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIElPRXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFByaW50V3JpdGVyIG5ld1ByaW50V3JpdGVyKEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBQcmludFdyaXRlcihuZXdXcml0ZXIoZmlsZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBQcmludFdyaXRlciBmb3IgdGhpcyBmaWxlLCB1c2luZyBzcGVjaWZpZWQKKyAgICAgKiBjaGFyc2V0LgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGUgICAgYSBGaWxlCisgICAgICogQHBhcmFtIGNoYXJzZXQgdGhlIGNoYXJzZXQKKyAgICAgKiBAcmV0dXJuIGEgUHJpbnRXcml0ZXIKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIElPRXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFByaW50V3JpdGVyIG5ld1ByaW50V3JpdGVyKEZpbGUgZmlsZSwgU3RyaW5nIGNoYXJzZXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgUHJpbnRXcml0ZXIobmV3V3JpdGVyKGZpbGUsIGNoYXJzZXQpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgUHJpbnRXcml0ZXIgZm9yIHRoaXMgZmlsZSB3aGljaCBpcyB0aGVuCisgICAgICogcGFzc2VkIGl0IGludG8gdGhlIGdpdmVuIGNsb3N1cmUuICBUaGlzIG1ldGhvZCBlbnN1cmVzIGl0cyB0aGUgd3JpdGVyCisgICAgICogaXMgY2xvc2VkIGFmdGVyIHRoZSBjbG9zdXJlIHJldHVybnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZSAgICBhIEZpbGUKKyAgICAgKiBAcGFyYW0gY2xvc3VyZSB0aGUgY2xvc3VyZSB0byBpbnZva2Ugd2l0aCB0aGUgUHJpbnRXcml0ZXIKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIElPRXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd2l0aFByaW50V3JpdGVyKEZpbGUgZmlsZSwgQ2xvc3VyZSBjbG9zdXJlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB3aXRoV3JpdGVyKG5ld1ByaW50V3JpdGVyKGZpbGUpLCBjbG9zdXJlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgUHJpbnRXcml0ZXIgd2l0aCBhIHNwZWNpZmllZCBjaGFyc2V0IGZvcgorICAgICAqIHRoaXMgZmlsZS4gIFRoZSB3cml0ZXIgaXMgcGFzc2VkIHRvIHRoZSBjbG9zdXJlLCBhbmQgd2lsbCBiZSBjbG9zZWQKKyAgICAgKiBiZWZvcmUgdGhpcyBtZXRob2QgcmV0dXJucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlICAgIGEgRmlsZQorICAgICAqIEBwYXJhbSBjaGFyc2V0IHRoZSBjaGFyc2V0CisgICAgICogQHBhcmFtIGNsb3N1cmUgdGhlIGNsb3N1cmUgdG8gaW52b2tlIHdpdGggdGhlIFByaW50V3JpdGVyCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBJT0V4Y2VwdGlvbiBvY2N1cnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHdpdGhQcmludFdyaXRlcihGaWxlIGZpbGUsIFN0cmluZyBjaGFyc2V0LCBDbG9zdXJlIGNsb3N1cmUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHdpdGhXcml0ZXIobmV3UHJpbnRXcml0ZXIoZmlsZSwgY2hhcnNldCksIGNsb3N1cmUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFsbG93cyB0aGlzIHdyaXRlciB0byBiZSB1c2VkIHdpdGhpbiB0aGUgY2xvc3VyZSwgZW5zdXJpbmcgdGhhdCBpdAorICAgICAqIGlzIGZsdXNoZWQgYW5kIGNsb3NlZCBiZWZvcmUgdGhpcyBtZXRob2QgcmV0dXJucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3cml0ZXIgIHRoZSB3cml0ZXIgd2hpY2ggaXMgdXNlZCBhbmQgdGhlbiBjbG9zZWQKKyAgICAgKiBAcGFyYW0gY2xvc3VyZSB0aGUgY2xvc3VyZSB0aGF0IHRoZSB3cml0ZXIgaXMgcGFzc2VkIGludG8KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIElPRXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd2l0aFdyaXRlcihXcml0ZXIgd3JpdGVyLCBDbG9zdXJlIGNsb3N1cmUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjbG9zdXJlLmNhbGwod3JpdGVyKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLmZsdXNoKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gdHJ5IHRvIGNvbnRpbnVlIGV2ZW4gaW4gY2FzZSBvZiBlcnJvcgorICAgICAgICAgICAgfQorICAgICAgICAgICAgV3JpdGVyIHRlbXAgPSB3cml0ZXI7CisgICAgICAgICAgICB3cml0ZXIgPSBudWxsOworICAgICAgICAgICAgdGVtcC5jbG9zZSgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgY2xvc2VXcml0ZXJXaXRoV2FybmluZyh3cml0ZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWxsb3dzIHRoaXMgcmVhZGVyIHRvIGJlIHVzZWQgd2l0aGluIHRoZSBjbG9zdXJlLCBlbnN1cmluZyB0aGF0IGl0CisgICAgICogaXMgY2xvc2VkIGJlZm9yZSB0aGlzIG1ldGhvZCByZXR1cm5zLgorICAgICAqCisgICAgICogQHBhcmFtIHJlYWRlciAgdGhlIHJlYWRlciB3aGljaCBpcyB1c2VkIGFuZCB0aGVuIGNsb3NlZAorICAgICAqIEBwYXJhbSBjbG9zdXJlIHRoZSBjbG9zdXJlIHRoYXQgdGhlIHdyaXRlciBpcyBwYXNzZWQgaW50bworICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gSU9FeGNlcHRpb24gb2NjdXJzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3aXRoUmVhZGVyKFJlYWRlciByZWFkZXIsIENsb3N1cmUgY2xvc3VyZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNsb3N1cmUuY2FsbChyZWFkZXIpOworCisgICAgICAgICAgICBSZWFkZXIgdGVtcCA9IHJlYWRlcjsKKyAgICAgICAgICAgIHJlYWRlciA9IG51bGw7CisgICAgICAgICAgICB0ZW1wLmNsb3NlKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBjbG9zZVJlYWRlcldpdGhXYXJuaW5nKHJlYWRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbGxvd3MgdGhpcyBpbnB1dCBzdHJlYW0gdG8gYmUgdXNlZCB3aXRoaW4gdGhlIGNsb3N1cmUsIGVuc3VyaW5nIHRoYXQgaXQKKyAgICAgKiBpcyBmbHVzaGVkIGFuZCBjbG9zZWQgYmVmb3JlIHRoaXMgbWV0aG9kIHJldHVybnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyZWFtICB0aGUgc3RyZWFtIHdoaWNoIGlzIHVzZWQgYW5kIHRoZW4gY2xvc2VkCisgICAgICogQHBhcmFtIGNsb3N1cmUgdGhlIGNsb3N1cmUgdGhhdCB0aGUgc3RyZWFtIGlzIHBhc3NlZCBpbnRvCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBJT0V4Y2VwdGlvbiBvY2N1cnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHdpdGhTdHJlYW0oSW5wdXRTdHJlYW0gc3RyZWFtLCBDbG9zdXJlIGNsb3N1cmUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjbG9zdXJlLmNhbGwoc3RyZWFtKTsKKworICAgICAgICAgICAgSW5wdXRTdHJlYW0gdGVtcCA9IHN0cmVhbTsKKyAgICAgICAgICAgIHN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICB0ZW1wLmNsb3NlKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBjbG9zZUlucHV0U3RyZWFtV2l0aFdhcm5pbmcoc3RyZWFtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWRzIHRoZSBzdHJlYW0gaW50byBhIGxpc3QsIHdpdGggb25lIGVsZW1lbnQgZm9yIGVhY2ggbGluZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJlYW0gYSBzdHJlYW0KKyAgICAgKiBAcmV0dXJuIGEgTGlzdCBvZiBsaW5lcworICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gSU9FeGNlcHRpb24gb2NjdXJzLgorICAgICAqIEBzZWUgI3JlYWRMaW5lcyhSZWFkZXIpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMaXN0IHJlYWRMaW5lcyhJbnB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiByZWFkTGluZXMobmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihzdHJlYW0pKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSXRlcmF0ZXMgdGhyb3VnaCB0aGlzIHN0cmVhbSwgcGFzc2luZyBlYWNoIGxpbmUgdG8gdGhlIGNsb3N1cmUuICBUaGUKKyAgICAgKiBzdHJlYW0gaXMgY2xvc2VkIGFmdGVyIHRoZSBjbG9zdXJlIHJldHVybnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyZWFtICBhIHN0cmVhbQorICAgICAqIEBwYXJhbSBjbG9zdXJlIGEgY2xvc3VyZQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gSU9FeGNlcHRpb24gb2NjdXJzLgorICAgICAqIEBzZWUgI2VhY2hMaW5lKFJlYWRlcixDbG9zdXJlKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBlYWNoTGluZShJbnB1dFN0cmVhbSBzdHJlYW0sIENsb3N1cmUgY2xvc3VyZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZWFjaExpbmUobmV3IElucHV0U3RyZWFtUmVhZGVyKHN0cmVhbSksIGNsb3N1cmUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEl0ZXJhdGVzIHRocm91Z2ggdGhlIGxpbmVzIHJlYWQgZnJvbSB0aGUgVVJMJ3MgYXNzb2NpYXRlZCBpbnB1dCBzdHJlYW0KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmwgICAgIGEgVVJMIHRvIG9wZW4gYW5kIHJlYWQKKyAgICAgKiBAcGFyYW0gY2xvc3VyZSBhIGNsb3N1cmUgdG8gYXBwbHkgb24gZWFjaCBsaW5lCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBJT0V4Y2VwdGlvbiBvY2N1cnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGVhY2hMaW5lKFVSTCB1cmwsIENsb3N1cmUgY2xvc3VyZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZWFjaExpbmUodXJsLm9wZW5Db25uZWN0aW9uKCkuZ2V0SW5wdXRTdHJlYW0oKSwgY2xvc3VyZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSGVscGVyIG1ldGhvZCB0byBjcmVhdGUgYSBuZXcgQnVmZmVyZWRSZWFkZXIgZm9yIGEgVVJMIGFuZCB0aGVuCisgICAgICogcGFzc2VzIGl0IHRvIHRoZSBjbG9zdXJlLiAgVGhlIHJlYWRlciBpcyBjbG9zZWQgYWZ0ZXIgdGhlIGNsb3N1cmUgcmV0dXJucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmwgICAgIGEgVVJMCisgICAgICogQHBhcmFtIGNsb3N1cmUgdGhlIGNsb3N1cmUgdG8gaW52b2tlIHdpdGggdGhlIHJlYWRlcgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gSU9FeGNlcHRpb24gb2NjdXJzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3aXRoUmVhZGVyKFVSTCB1cmwsIENsb3N1cmUgY2xvc3VyZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgd2l0aFJlYWRlcih1cmwub3BlbkNvbm5lY3Rpb24oKS5nZXRJbnB1dFN0cmVhbSgpLCBjbG9zdXJlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBCdWZmZXJlZFJlYWRlciBmb3IgYSBzdHJlYW0gYW5kIHRoZW4KKyAgICAgKiBwYXNzZXMgaXQgaW50byB0aGUgY2xvc3VyZS4gIFRoZSByZWFkZXIgaXMgY2xvc2VkIGFmdGVyIHRoZSBjbG9zdXJlIHJldHVybnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW4gICAgICBhIHN0cmVhbQorICAgICAqIEBwYXJhbSBjbG9zdXJlIHRoZSBjbG9zdXJlIHRvIGludm9rZSB3aXRoIHRoZSBJbnB1dFN0cmVhbQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gSU9FeGNlcHRpb24gb2NjdXJzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3aXRoUmVhZGVyKElucHV0U3RyZWFtIGluLCBDbG9zdXJlIGNsb3N1cmUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHdpdGhSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGluKSwgY2xvc3VyZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHdyaXRlciBmcm9tIHRoaXMgc3RyZWFtLCBwYXNzaW5nIGl0IHRvIHRoZSBnaXZlbiBjbG9zdXJlLgorICAgICAqIFRoaXMgbWV0aG9kIGVuc3VyZXMgdGhlIHN0cmVhbSBpcyBjbG9zZWQgYWZ0ZXIgdGhlIGNsb3N1cmUgcmV0dXJucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJlYW0gIHRoZSBzdHJlYW0gd2hpY2ggaXMgdXNlZCBhbmQgdGhlbiBjbG9zZWQKKyAgICAgKiBAcGFyYW0gY2xvc3VyZSB0aGUgY2xvc3VyZSB0aGF0IHRoZSB3cml0ZXIgaXMgcGFzc2VkIGludG8KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIElPRXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgKiBAc2VlICN3aXRoV3JpdGVyKFdyaXRlcixDbG9zdXJlKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3aXRoV3JpdGVyKE91dHB1dFN0cmVhbSBzdHJlYW0sIENsb3N1cmUgY2xvc3VyZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgd2l0aFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKHN0cmVhbSksIGNsb3N1cmUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSB3cml0ZXIgZnJvbSB0aGlzIHN0cmVhbSwgcGFzc2luZyBpdCB0byB0aGUgZ2l2ZW4gY2xvc3VyZS4KKyAgICAgKiBUaGlzIG1ldGhvZCBlbnN1cmVzIHRoZSBzdHJlYW0gaXMgY2xvc2VkIGFmdGVyIHRoZSBjbG9zdXJlIHJldHVybnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyZWFtICB0aGUgc3RyZWFtIHdoaWNoIGlzIHVzZWQgYW5kIHRoZW4gY2xvc2VkCisgICAgICogQHBhcmFtIGNoYXJzZXQgdGhlIGNoYXJzZXQgdXNlZAorICAgICAqIEBwYXJhbSBjbG9zdXJlIHRoZSBjbG9zdXJlIHRoYXQgdGhlIHdyaXRlciBpcyBwYXNzZWQgaW50bworICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gSU9FeGNlcHRpb24gb2NjdXJzLgorICAgICAqIEBzZWUgI3dpdGhXcml0ZXIoV3JpdGVyLENsb3N1cmUpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHdpdGhXcml0ZXIoT3V0cHV0U3RyZWFtIHN0cmVhbSwgU3RyaW5nIGNoYXJzZXQsIENsb3N1cmUgY2xvc3VyZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgd2l0aFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKHN0cmVhbSwgY2hhcnNldCksIGNsb3N1cmUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhc3NlcyB0aGlzIE91dHB1dFN0cmVhbSB0byB0aGUgY2xvc3VyZSwgZW5zdXJpbmcgdGhhdCB0aGUgc3RyZWFtCisgICAgICogaXMgY2xvc2VkIGFmdGVyIHRoZSBjbG9zdXJlIHJldHVybnMsIHJlZ2FyZGxlc3Mgb2YgZXJyb3JzLgorICAgICAqCisgICAgICogQHBhcmFtIG9zICAgICAgdGhlIHN0cmVhbSB3aGljaCBpcyB1c2VkIGFuZCB0aGVuIGNsb3NlZAorICAgICAqIEBwYXJhbSBjbG9zdXJlIHRoZSBjbG9zdXJlIHRoYXQgdGhlIHN0cmVhbSBpcyBwYXNzZWQgaW50bworICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gSU9FeGNlcHRpb24gb2NjdXJzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3aXRoU3RyZWFtKE91dHB1dFN0cmVhbSBvcywgQ2xvc3VyZSBjbG9zdXJlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2xvc3VyZS5jYWxsKG9zKTsKKyAgICAgICAgICAgIG9zLmZsdXNoKCk7CisKKyAgICAgICAgICAgIE91dHB1dFN0cmVhbSB0ZW1wID0gb3M7CisgICAgICAgICAgICBvcyA9IG51bGw7CisgICAgICAgICAgICB0ZW1wLmNsb3NlKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBjbG9zZU91dHB1dFN0cmVhbVdpdGhXYXJuaW5nKG9zKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBidWZmZXJlZCBpbnB1dCBzdHJlYW0gZm9yIHRoaXMgZmlsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlIGEgRmlsZQorICAgICAqIEByZXR1cm4gYSBCdWZmZXJlZElucHV0U3RyZWFtIG9mIHRoZSBmaWxlCisgICAgICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gaWYgdGhlIGZpbGUgaXMgbm90IGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQnVmZmVyZWRJbnB1dFN0cmVhbSBuZXdJbnB1dFN0cmVhbShGaWxlIGZpbGUpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgZGF0YSBpbnB1dCBzdHJlYW0gZm9yIHRoaXMgZmlsZQorICAgICAqCisgICAgICogQHBhcmFtIGZpbGUgYSBGaWxlCisgICAgICogQHJldHVybiBhIERhdGFJbnB1dFN0cmVhbSBvZiB0aGUgZmlsZQorICAgICAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGlmIHRoZSBmaWxlIGlzIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIERhdGFJbnB1dFN0cmVhbSBuZXdEYXRhSW5wdXRTdHJlYW0oRmlsZSBmaWxlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEYXRhSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJhdmVyc2UgdGhyb3VnaCBlYWNoIGJ5dGUgb2YgdGhpcyBGaWxlCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgICBhIEZpbGUKKyAgICAgKiBAcGFyYW0gY2xvc3VyZSBhIGNsb3N1cmUKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIElPRXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgKiBAc2VlICNlYWNoQnl0ZShJbnB1dFN0cmVhbSxDbG9zdXJlKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBlYWNoQnl0ZShGaWxlIHNlbGYsIENsb3N1cmUgY2xvc3VyZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQnVmZmVyZWRJbnB1dFN0cmVhbSBpcyA9IG5ld0lucHV0U3RyZWFtKHNlbGYpOworICAgICAgICBlYWNoQnl0ZShpcywgY2xvc3VyZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJhdmVyc2UgdGhyb3VnaCBlYWNoIGJ5dGUgb2YgdGhlIHNwZWNpZmllZCBzdHJlYW0uIFRoZQorICAgICAqIHN0cmVhbSBpcyBjbG9zZWQgYWZ0ZXIgdGhlIGNsb3N1cmUgcmV0dXJucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpcyAgICAgIHN0cmVhbSB0byBpdGVyYXRlIG92ZXIsIGNsb3NlZCBhZnRlciB0aGUgbWV0aG9kIGNhbGwKKyAgICAgKiBAcGFyYW0gY2xvc3VyZSBjbG9zdXJlIHRvIGFwcGx5IHRvIGVhY2ggYnl0ZQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gSU9FeGNlcHRpb24gb2NjdXJzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBlYWNoQnl0ZShJbnB1dFN0cmVhbSBpcywgQ2xvc3VyZSBjbG9zdXJlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICBpbnQgYiA9IGlzLnJlYWQoKTsKKyAgICAgICAgICAgICAgICBpZiAoYiA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjbG9zdXJlLmNhbGwobmV3IEJ5dGUoKGJ5dGUpIGIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIElucHV0U3RyZWFtIHRlbXAgPSBpczsKKyAgICAgICAgICAgIGlzID0gbnVsbDsKKyAgICAgICAgICAgIHRlbXAuY2xvc2UoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGNsb3NlSW5wdXRTdHJlYW1XaXRoV2FybmluZyhpcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyB0aGUgSW5wdXRTdHJlYW0gZnJvbSB0aGlzIFVSTCwgcGFzc2luZyBlYWNoIGJ5dGUgdG8gdGhlIGdpdmVuCisgICAgICogY2xvc3VyZS4gIFRoZSBVUkwgc3RyZWFtIHdpbGwgYmUgY2xvc2VkIGJlZm9yZSB0aGlzIG1ldGhvZCByZXR1cm5zLgorICAgICAqCisgICAgICogQHBhcmFtIHVybCAgICAgdXJsIHRvIGl0ZXJhdGUgb3ZlcgorICAgICAqIEBwYXJhbSBjbG9zdXJlIGNsb3N1cmUgdG8gYXBwbHkgdG8gZWFjaCBieXRlCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBJT0V4Y2VwdGlvbiBvY2N1cnMuCisgICAgICogQHNlZSAjZWFjaEJ5dGUoSW5wdXRTdHJlYW0sQ2xvc3VyZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZWFjaEJ5dGUoVVJMIHVybCwgQ2xvc3VyZSBjbG9zdXJlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IHVybC5vcGVuQ29ubmVjdGlvbigpLmdldElucHV0U3RyZWFtKCk7CisgICAgICAgIGVhY2hCeXRlKGlzLCBjbG9zdXJlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmFuc2Zvcm1zIGVhY2ggY2hhcmFjdGVyIGZyb20gdGhpcyByZWFkZXIgYnkgcGFzc2luZyBpdCB0byB0aGUgZ2l2ZW4KKyAgICAgKiBjbG9zdXJlLiAgVGhlIENsb3N1cmUgc2hvdWxkIHJldHVybiBlYWNoIHRyYW5zZm9ybWVkIGNoYXJhY3Rlciwgd2hpY2gKKyAgICAgKiB3aWxsIGJlIHBhc3NlZCB0byB0aGUgV3JpdGVyLiAgVGhlIHJlYWRlciBhbmQgd3JpdGVyIHdpbGwgYmUgYm90aCBiZQorICAgICAqIGNsb3NlZCBiZWZvcmUgdGhpcyBtZXRob2QgcmV0dXJucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmICAgIGEgUmVhZGVyIG9iamVjdAorICAgICAqIEBwYXJhbSB3cml0ZXIgIGEgV3JpdGVyIHRvIHJlY2VpdmUgdGhlIHRyYW5zZm9ybWVkIGNoYXJhY3RlcnMKKyAgICAgKiBAcGFyYW0gY2xvc3VyZSBhIGNsb3N1cmUgdGhhdCBwZXJmb3JtcyB0aGUgcmVxdWlyZWQgdHJhbnNmb3JtYXRpb24KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIElPRXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdHJhbnNmb3JtQ2hhcihSZWFkZXIgc2VsZiwgV3JpdGVyIHdyaXRlciwgQ2xvc3VyZSBjbG9zdXJlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpbnQgYzsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNoYXJbXSBjaGFycyA9IG5ldyBjaGFyWzFdOworICAgICAgICAgICAgd2hpbGUgKChjID0gc2VsZi5yZWFkKCkpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgY2hhcnNbMF0gPSAoY2hhcikgYzsKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoKFN0cmluZykgY2xvc3VyZS5jYWxsKG5ldyBTdHJpbmcoY2hhcnMpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3cml0ZXIuZmx1c2goKTsKKworICAgICAgICAgICAgV3JpdGVyIHRlbXAyID0gd3JpdGVyOworICAgICAgICAgICAgd3JpdGVyID0gbnVsbDsKKyAgICAgICAgICAgIHRlbXAyLmNsb3NlKCk7CisgICAgICAgICAgICBSZWFkZXIgdGVtcDEgPSBzZWxmOworICAgICAgICAgICAgc2VsZiA9IG51bGw7CisgICAgICAgICAgICB0ZW1wMS5jbG9zZSgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgY2xvc2VSZWFkZXJXaXRoV2FybmluZyhzZWxmKTsKKyAgICAgICAgICAgIGNsb3NlV3JpdGVyV2l0aFdhcm5pbmcod3JpdGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRyYW5zZm9ybXMgdGhlIGxpbmVzIGZyb20gYSByZWFkZXIgd2l0aCBhIENsb3N1cmUgYW5kCisgICAgICogd3JpdGUgdGhlbSB0byBhIHdyaXRlci4gQm90aCBSZWFkZXIgYW5kIFdyaXRlciBhcmUKKyAgICAgKiBjbG9zZWQgYWZ0ZXIgdGhlIG9wZXJhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWFkZXIgIExpbmVzIG9mIHRleHQgdG8gYmUgdHJhbnNmb3JtZWQuIFJlYWRlciBpcyBjbG9zZWQgYWZ0ZXJ3YXJkcy4KKyAgICAgKiBAcGFyYW0gd3JpdGVyICBXaGVyZSB0cmFuc2Zvcm1lZCBsaW5lcyBhcmUgd3JpdHRlbi4gV3JpdGVyIGlzIGNsb3NlZCBhZnRlcndhcmRzLgorICAgICAqIEBwYXJhbSBjbG9zdXJlIFNpbmdsZSBwYXJhbWV0ZXIgY2xvc3VyZSB0aGF0IGlzIGNhbGxlZCB0byB0cmFuc2Zvcm0gZWFjaCBsaW5lIG9mCisgICAgICogICAgICAgICAgICAgICAgdGV4dCBmcm9tIHRoZSByZWFkZXIsIGJlZm9yZSB3cml0aW5nIGl0IHRvIHRoZSB3cml0ZXIuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBJT0V4Y2VwdGlvbiBvY2N1cnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHRyYW5zZm9ybUxpbmUoUmVhZGVyIHJlYWRlciwgV3JpdGVyIHdyaXRlciwgQ2xvc3VyZSBjbG9zdXJlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihyZWFkZXIpOworICAgICAgICBCdWZmZXJlZFdyaXRlciBidyA9IG5ldyBCdWZmZXJlZFdyaXRlcih3cml0ZXIpOworICAgICAgICBTdHJpbmcgbGluZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdoaWxlICgobGluZSA9IGJyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBPYmplY3QgbyA9IGNsb3N1cmUuY2FsbChsaW5lKTsKKyAgICAgICAgICAgICAgICBpZiAobyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGJ3LndyaXRlKG8udG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIGJ3Lm5ld0xpbmUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidy5mbHVzaCgpOworCisgICAgICAgICAgICBXcml0ZXIgdGVtcDIgPSB3cml0ZXI7CisgICAgICAgICAgICB3cml0ZXIgPSBudWxsOworICAgICAgICAgICAgdGVtcDIuY2xvc2UoKTsKKyAgICAgICAgICAgIFJlYWRlciB0ZW1wMSA9IHJlYWRlcjsKKyAgICAgICAgICAgIHJlYWRlciA9IG51bGw7CisgICAgICAgICAgICB0ZW1wMS5jbG9zZSgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgY2xvc2VSZWFkZXJXaXRoV2FybmluZyhicik7CisgICAgICAgICAgICBjbG9zZVJlYWRlcldpdGhXYXJuaW5nKHJlYWRlcik7CisgICAgICAgICAgICBjbG9zZVdyaXRlcldpdGhXYXJuaW5nKGJ3KTsKKyAgICAgICAgICAgIGNsb3NlV3JpdGVyV2l0aFdhcm5pbmcod3JpdGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbHRlciB0aGUgbGluZXMgZnJvbSBhIHJlYWRlciBhbmQgd3JpdGUgdGhlbSBvbiB0aGUgd3JpdGVyLAorICAgICAqIGFjY29yZGluZyB0byBhIGNsb3N1cmUgd2hpY2ggcmV0dXJucyB0cnVlIGlmIHRoZSBsaW5lIHNob3VsZCBiZSBpbmNsdWRlZC4KKyAgICAgKiBCb3RoIFJlYWRlciBhbmQgV3JpdGVyIGFyZSBjbG9zZWQgYWZ0ZXIgdGhlIG9wZXJhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWFkZXIgIGEgcmVhZGVyLCBjbG9zZWQgYWZ0ZXIgdGhlIGNhbGwKKyAgICAgKiBAcGFyYW0gd3JpdGVyICBhIHdyaXRlciwgY2xvc2VkIGFmdGVyIHRoZSBjYWxsCisgICAgICogQHBhcmFtIGNsb3N1cmUgdGhlIGNsb3N1cmUgd2hpY2ggcmV0dXJucyBib29sZWFucworICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gSU9FeGNlcHRpb24gb2NjdXJzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBmaWx0ZXJMaW5lKFJlYWRlciByZWFkZXIsIFdyaXRlciB3cml0ZXIsIENsb3N1cmUgY2xvc3VyZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIocmVhZGVyKTsKKyAgICAgICAgQnVmZmVyZWRXcml0ZXIgYncgPSBuZXcgQnVmZmVyZWRXcml0ZXIod3JpdGVyKTsKKyAgICAgICAgU3RyaW5nIGxpbmU7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3aGlsZSAoKGxpbmUgPSBici5yZWFkTGluZSgpKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKERlZmF1bHRUeXBlVHJhbnNmb3JtYXRpb24uY2FzdFRvQm9vbGVhbihjbG9zdXJlLmNhbGwobGluZSkpKSB7CisgICAgICAgICAgICAgICAgICAgIGJ3LndyaXRlKGxpbmUpOworICAgICAgICAgICAgICAgICAgICBidy5uZXdMaW5lKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYncuZmx1c2goKTsKKworICAgICAgICAgICAgV3JpdGVyIHRlbXAyID0gd3JpdGVyOworICAgICAgICAgICAgd3JpdGVyID0gbnVsbDsKKyAgICAgICAgICAgIHRlbXAyLmNsb3NlKCk7CisgICAgICAgICAgICBSZWFkZXIgdGVtcDEgPSByZWFkZXI7CisgICAgICAgICAgICByZWFkZXIgPSBudWxsOworICAgICAgICAgICAgdGVtcDEuY2xvc2UoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGNsb3NlUmVhZGVyV2l0aFdhcm5pbmcoYnIpOworICAgICAgICAgICAgY2xvc2VSZWFkZXJXaXRoV2FybmluZyhyZWFkZXIpOworICAgICAgICAgICAgY2xvc2VXcml0ZXJXaXRoV2FybmluZyhidyk7CisgICAgICAgICAgICBjbG9zZVdyaXRlcldpdGhXYXJuaW5nKHdyaXRlcik7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbHRlcnMgdGhlIGxpbmVzIG9mIGEgRmlsZSBhbmQgY3JlYXRlcyBhIFdyaXRlYWJsZSBpbiByZXR1cm4gdG8KKyAgICAgKiBzdHJlYW0gdGhlIGZpbHRlcmVkIGxpbmVzLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgICAgYSBGaWxlCisgICAgICogQHBhcmFtIGNsb3N1cmUgYSBjbG9zdXJlIHdoaWNoIHJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgdG8gZmlsdGVyCisgICAgICogICAgICAgICAgICAgICAgdGhlIGxpbmUgb3Igbm90CisgICAgICogQHJldHVybiBhIFdyaXRhYmxlIGNsb3N1cmUKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIDxjb2RlPnNlbGY8L2NvZGU+IGlzIG5vdCByZWFkYWJsZQorICAgICAqIEBzZWUgI2ZpbHRlckxpbmUoUmVhZGVyLENsb3N1cmUpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBXcml0YWJsZSBmaWx0ZXJMaW5lKEZpbGUgc2VsZiwgQ2xvc3VyZSBjbG9zdXJlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gZmlsdGVyTGluZShuZXdSZWFkZXIoc2VsZiksIGNsb3N1cmUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbHRlciB0aGUgbGluZXMgZnJvbSB0aGlzIEZpbGUsIGFuZCB3cml0ZSB0aGVtIHRvIHRoZSBnaXZlbiB3cml0ZXIgYmFzZWQKKyAgICAgKiBvbiB0aGUgZ2l2ZW4gY2xvc3VyZSBwcmVkaWNhdGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgICBhIEZpbGUKKyAgICAgKiBAcGFyYW0gd3JpdGVyICBhIHdyaXRlciBkZXN0aW5hdGlvbiB0byB3cml0ZSBmaWx0ZXJlZCBsaW5lcyB0bworICAgICAqIEBwYXJhbSBjbG9zdXJlIGEgY2xvc3VyZSB3aGljaCB0YWtlcyBlYWNoIGxpbmUgYXMgYSBwYXJhbWV0ZXIgYW5kIHJldHVybnMKKyAgICAgKiAgICAgICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbGluZSBzaG91bGQgYmUgd3JpdHRlbiB0byB0aGlzIHdyaXRlci4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIDxjb2RlPnNlbGY8L2NvZGU+IGlzIG5vdCByZWFkYWJsZQorICAgICAqIEBzZWUgI2ZpbHRlckxpbmUoUmVhZGVyLFdyaXRlcixDbG9zdXJlKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBmaWx0ZXJMaW5lKEZpbGUgc2VsZiwgV3JpdGVyIHdyaXRlciwgQ2xvc3VyZSBjbG9zdXJlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaWx0ZXJMaW5lKG5ld1JlYWRlcihzZWxmKSwgd3JpdGVyLCBjbG9zdXJlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaWx0ZXIgdGhlIGxpbmVzIGZyb20gdGhpcyBSZWFkZXIsIGFuZCByZXR1cm4gYSBXcml0YWJsZSB3aGljaCBjYW4gYmUKKyAgICAgKiB1c2VkIHRvIHN0cmVhbSB0aGUgZmlsdGVyZWQgbGluZXMgdG8gYSBkZXN0aW5hdGlvbi4gIFRoZSBjbG9zdXJlIHNob3VsZAorICAgICAqIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbGluZSBzaG91bGQgYmUgcGFzc2VkIHRvIHRoZSB3cml0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVhZGVyICB0aGlzIHJlYWRlcgorICAgICAqIEBwYXJhbSBjbG9zdXJlIGEgY2xvc3VyZSB1c2VkIGZvciBmaWx0ZXJpbmcKKyAgICAgKiBAcmV0dXJuIGEgV3JpdGFibGUgd2hpY2ggd2lsbCB1c2UgdGhlIGNsb3N1cmUgdG8gZmlsdGVyIGVhY2ggbGluZQorICAgICAqICAgICAgICAgZnJvbSB0aGUgcmVhZGVyIHdoZW4gdGhlIFdyaXRhYmxlI3dyaXRlVG8oV3JpdGVyKSBpcyBjYWxsZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBXcml0YWJsZSBmaWx0ZXJMaW5lKFJlYWRlciByZWFkZXIsIGZpbmFsIENsb3N1cmUgY2xvc3VyZSkgeworICAgICAgICBmaW5hbCBCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihyZWFkZXIpOworICAgICAgICByZXR1cm4gbmV3IFdyaXRhYmxlKCkgeworICAgICAgICAgICAgcHVibGljIFdyaXRlciB3cml0ZVRvKFdyaXRlciBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgQnVmZmVyZWRXcml0ZXIgYncgPSBuZXcgQnVmZmVyZWRXcml0ZXIob3V0KTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbGluZTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKGxpbmUgPSBici5yZWFkTGluZSgpKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChEZWZhdWx0VHlwZVRyYW5zZm9ybWF0aW9uLmNhc3RUb0Jvb2xlYW4oY2xvc3VyZS5jYWxsKGxpbmUpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYncud3JpdGUobGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBidy5uZXdMaW5lKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYncuZmx1c2goKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gb3V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgICAgIFN0cmluZ1dyaXRlciBidWZmZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVUbyhidWZmZXIpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN0cmluZ1dyaXRlcklPRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgLyoqCisgICAgICogRmlsdGVyIGxpbmVzIGZyb20gYW4gaW5wdXQgc3RyZWFtIHVzaW5nIGEgY2xvc3VyZSBwcmVkaWNhdGUuICBUaGUgY2xvc3VyZQorICAgICAqIHdpbGwgYmUgcGFzc2VkIGVhY2ggbGluZSBhcyBhIFN0cmluZywgYW5kIGl0IHNob3VsZCByZXR1cm4KKyAgICAgKiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbGluZSBzaG91bGQgYmUgcGFzc2VkIHRvIHRoZSB3cml0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgICAgIGFuIGlucHV0IHN0cmVhbQorICAgICAqIEBwYXJhbSBwcmVkaWNhdGUgYSBjbG9zdXJlIHdoaWNoIHJldHVybnMgYm9vbGVhbiBhbmQgdGFrZXMgYSBsaW5lCisgICAgICogQHJldHVybiBhIHdyaXRhYmxlIHdoaWNoIHdyaXRlcyBvdXQgdGhlIGZpbHRlcmVkIGxpbmVzCisgICAgICogQHNlZSAjZmlsdGVyTGluZShSZWFkZXIsIENsb3N1cmUpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBXcml0YWJsZSBmaWx0ZXJMaW5lKElucHV0U3RyZWFtIHNlbGYsIENsb3N1cmUgcHJlZGljYXRlKSB7CisgICAgICAgIHJldHVybiBmaWx0ZXJMaW5lKG5ld1JlYWRlcihzZWxmKSwgcHJlZGljYXRlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVc2VzIGEgY2xvc3VyZSB0byBmaWx0ZXIgbGluZXMgZnJvbSB0aGlzIElucHV0U3RyZWFtIGFuZCBwYXNzIHRoZW0gdG8KKyAgICAgKiB0aGUgZ2l2ZW4gd3JpdGVyLiBUaGUgY2xvc3VyZSB3aWxsIGJlIHBhc3NlZCBlYWNoIGxpbmUgYXMgYSBTdHJpbmcsIGFuZAorICAgICAqIGl0IHNob3VsZCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGxpbmUgc2hvdWxkIGJlIHBhc3NlZCB0byB0aGUKKyAgICAgKiB3cml0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiAgICAgIHRoZSBJbnB1dFN0cmVhbQorICAgICAqIEBwYXJhbSB3cml0ZXIgICAgYSB3cml0ZXIgdG8gd3JpdGUgb3V0cHV0IHRvCisgICAgICogQHBhcmFtIHByZWRpY2F0ZSBhIGNsb3N1cmUgd2hpY2ggcmV0dXJucyB0cnVlIGlmIGEgbGluZSBzaG91bGQgYmUgYWNjZXB0ZWQKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIElPRXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgKiBAc2VlICNmaWx0ZXJMaW5lKFJlYWRlcixXcml0ZXIsQ2xvc3VyZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZmlsdGVyTGluZShJbnB1dFN0cmVhbSBzZWxmLCBXcml0ZXIgd3JpdGVyLCBDbG9zdXJlIHByZWRpY2F0ZSkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbHRlckxpbmUobmV3UmVhZGVyKHNlbGYpLCB3cml0ZXIsIHByZWRpY2F0ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZHMgdGhlIGNvbnRlbnQgb2YgdGhlIGZpbGUgaW50byBhIGJ5dGUgYXJyYXkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZSBhIEZpbGUKKyAgICAgKiBAcmV0dXJuIGEgYnl0ZSBhcnJheSB3aXRoIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIElPRXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSByZWFkQnl0ZXMoRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVsoaW50KSBmaWxlLmxlbmd0aCgpXTsKKyAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpbGVJbnB1dFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7CisgICAgICAgIERhdGFJbnB1dFN0cmVhbSBkaXMgPSBuZXcgRGF0YUlucHV0U3RyZWFtKGZpbGVJbnB1dFN0cmVhbSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBkaXMucmVhZEZ1bGx5KGJ5dGVzKTsKKworICAgICAgICAgICAgSW5wdXRTdHJlYW0gdGVtcCA9IGRpczsKKyAgICAgICAgICAgIGRpcyA9IG51bGw7CisgICAgICAgICAgICB0ZW1wLmNsb3NlKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoZGlzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBkaXMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExPRy53YXJuaW5nKCJDYXVnaHQgZXhjZXB0aW9uIGNsb3NpbmcgRGF0YUlucHV0U3RyZWFtOiAiICsgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBieXRlczsKKyAgICB9CisKKyAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIC8vIFNvY2tldCBhbmQgU2VydmVyU29ja2V0IG1ldGhvZHMKKworICAgIC8qKgorICAgICAqIFBhc3NlcyB0aGUgU29ja2V0J3MgSW5wdXRTdHJlYW0gYW5kIE91dHB1dFN0cmVhbSB0byB0aGUgY2xvc3VyZS4gIFRoZQorICAgICAqIHN0cmVhbXMgd2lsbCBiZSBjbG9zZWQgYWZ0ZXIgdGhlIGNsb3N1cmUgcmV0dXJucywgZXZlbiBpZiBhbiBleGNlcHRpb24KKyAgICAgKiBpcyB0aHJvd24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc29ja2V0ICBhIFNvY2tldAorICAgICAqIEBwYXJhbSBjbG9zdXJlIGEgQ2xvc3VyZQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gSU9FeGNlcHRpb24gb2NjdXJzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3aXRoU3RyZWFtcyhTb2NrZXQgc29ja2V0LCBDbG9zdXJlIGNsb3N1cmUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIElucHV0U3RyZWFtIGlucHV0ID0gc29ja2V0LmdldElucHV0U3RyZWFtKCk7CisgICAgICAgIE91dHB1dFN0cmVhbSBvdXRwdXQgPSBzb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjbG9zdXJlLmNhbGwobmV3IE9iamVjdFtde2lucHV0LCBvdXRwdXR9KTsKKworICAgICAgICAgICAgSW5wdXRTdHJlYW0gdGVtcDEgPSBpbnB1dDsKKyAgICAgICAgICAgIGlucHV0ID0gbnVsbDsKKyAgICAgICAgICAgIHRlbXAxLmNsb3NlKCk7CisgICAgICAgICAgICBPdXRwdXRTdHJlYW0gdGVtcDIgPSBvdXRwdXQ7CisgICAgICAgICAgICBvdXRwdXQgPSBudWxsOworICAgICAgICAgICAgdGVtcDIuY2xvc2UoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGNsb3NlSW5wdXRTdHJlYW1XaXRoV2FybmluZyhpbnB1dCk7CisgICAgICAgICAgICBjbG9zZU91dHB1dFN0cmVhbVdpdGhXYXJuaW5nKG91dHB1dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIElucHV0T2JqZWN0U3RyZWFtIGFuZCBhbiBPdXRwdXRPYmplY3RTdHJlYW0gZnJvbSBhIFNvY2tldCwgYW5kCisgICAgICogcGFzc2VzIHRoZW0gdG8gdGhlIGNsb3N1cmUuICBUaGUgc3RyZWFtcyB3aWxsIGJlIGNsb3NlZCBhZnRlciB0aGUgY2xvc3VyZQorICAgICAqIHJldHVybnMsIGV2ZW4gaWYgYW4gZXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzb2NrZXQgIHRoaXMgU29ja2V0CisgICAgICogQHBhcmFtIGNsb3N1cmUgYSBDbG9zdXJlCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBJT0V4Y2VwdGlvbiBvY2N1cnMuCisgICAgICogQHNpbmNlIDEuMSBiZXRhIDIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd2l0aE9iamVjdFN0cmVhbXMoU29ja2V0IHNvY2tldCwgQ2xvc3VyZSBjbG9zdXJlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dCA9IHNvY2tldC5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICBPdXRwdXRTdHJlYW0gb3V0cHV0ID0gc29ja2V0LmdldE91dHB1dFN0cmVhbSgpOworICAgICAgICBPYmplY3RPdXRwdXRTdHJlYW0gb29zID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShvdXRwdXQpOworICAgICAgICBPYmplY3RJbnB1dFN0cmVhbSBvaXMgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oaW5wdXQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2xvc3VyZS5jYWxsKG5ldyBPYmplY3RbXXtvaXMsIG9vc30pOworCisgICAgICAgICAgICBJbnB1dFN0cmVhbSB0ZW1wMSA9IG9pczsKKyAgICAgICAgICAgIG9pcyA9IG51bGw7CisgICAgICAgICAgICB0ZW1wMS5jbG9zZSgpOworICAgICAgICAgICAgdGVtcDEgPSBpbnB1dDsKKyAgICAgICAgICAgIGlucHV0ID0gbnVsbDsKKyAgICAgICAgICAgIHRlbXAxLmNsb3NlKCk7CisgICAgICAgICAgICBPdXRwdXRTdHJlYW0gdGVtcDIgPSBvb3M7CisgICAgICAgICAgICBvb3MgPSBudWxsOworICAgICAgICAgICAgdGVtcDIuY2xvc2UoKTsKKyAgICAgICAgICAgIHRlbXAyID0gb3V0cHV0OworICAgICAgICAgICAgb3V0cHV0ID0gbnVsbDsKKyAgICAgICAgICAgIHRlbXAyLmNsb3NlKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBjbG9zZUlucHV0U3RyZWFtV2l0aFdhcm5pbmcob2lzKTsKKyAgICAgICAgICAgIGNsb3NlSW5wdXRTdHJlYW1XaXRoV2FybmluZyhpbnB1dCk7CisgICAgICAgICAgICBjbG9zZU91dHB1dFN0cmVhbVdpdGhXYXJuaW5nKG9vcyk7CisgICAgICAgICAgICBjbG9zZU91dHB1dFN0cmVhbVdpdGhXYXJuaW5nKG91dHB1dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUT0RPIHJlZHVjZSBkdXBsaWNhdGlvbiBieSB1c2luZyBDbG9zYWJsZSBpZiB3ZSByYWlzZSBtaW5pbXVtIHJlcXVpcmVtZW50IHRvIEphdmEgMS41CisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjbG9zZUlucHV0U3RyZWFtV2l0aFdhcm5pbmcoSW5wdXRTdHJlYW0gaW5wdXQpIHsKKyAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaW5wdXQuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMT0cud2FybmluZygiQ2F1Z2h0IGV4Y2VwdGlvbiBjbG9zaW5nIElucHV0U3RyZWFtOiAiICsgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNsb3NlT3V0cHV0U3RyZWFtV2l0aFdhcm5pbmcoT3V0cHV0U3RyZWFtIG91dHB1dCkgeworICAgICAgICBpZiAob3V0cHV0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb3V0cHV0LmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTE9HLndhcm5pbmcoIkNhdWdodCBleGNlcHRpb24gY2xvc2luZyBPdXRwdXRTdHJlYW06ICIgKyBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2xvc2VSZWFkZXJXaXRoV2FybmluZyhSZWFkZXIgcmVhZGVyKSB7CisgICAgICAgIGlmIChyZWFkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gaWdub3JlIHRoaXMgZXhjZXB0aW9uIHNpbmNlIHRoaXMKKyAgICAgICAgICAgICAgICAvLyBpcyBvbmx5IG91ciBpbnRlcm5hbCBwcm9ibGVtCisgICAgICAgICAgICAgICAgTE9HLndhcm5pbmcoIkNhdWdodCBleGNlcHRpb24gY2xvc2luZyBSZWFkZXI6ICIgKyBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2xvc2VXcml0ZXJXaXRoV2FybmluZyhXcml0ZXIgd3JpdGVyKSB7CisgICAgICAgIGlmICh3cml0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMT0cud2FybmluZygiQ2F1Z2h0IGV4Y2VwdGlvbiBjbG9zaW5nIFdyaXRlcjogIiArIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogT3ZlcmxvYWRzIHRoZSBsZWZ0IHNoaWZ0IG9wZXJhdG9yIHRvIHByb3ZpZGUgYW4gYXBwZW5kIG1lY2hhbmlzbSB0bworICAgICAqIGFkZCB0aGluZ3MgdG8gdGhlIG91dHB1dCBzdHJlYW0gb2YgYSBzb2NrZXQKKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmICBhIFNvY2tldAorICAgICAqIEBwYXJhbSB2YWx1ZSBhIHZhbHVlIHRvIGFwcGVuZAorICAgICAqIEByZXR1cm4gYSBXcml0ZXIKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIElPRXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFdyaXRlciBsZWZ0U2hpZnQoU29ja2V0IHNlbGYsIE9iamVjdCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGxlZnRTaGlmdChzZWxmLmdldE91dHB1dFN0cmVhbSgpLCB2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3ZlcmxvYWRzIHRoZSBsZWZ0IHNoaWZ0IG9wZXJhdG9yIHRvIHByb3ZpZGUgYW4gYXBwZW5kIG1lY2hhbmlzbQorICAgICAqIHRvIGFkZCBieXRlcyB0byB0aGUgb3V0cHV0IHN0cmVhbSBvZiBhIHNvY2tldAorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgIGEgU29ja2V0CisgICAgICogQHBhcmFtIHZhbHVlIGEgdmFsdWUgdG8gYXBwZW5kCisgICAgICogQHJldHVybiBhbiBPdXRwdXRTdHJlYW0KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIElPRXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE91dHB1dFN0cmVhbSBsZWZ0U2hpZnQoU29ja2V0IHNlbGYsIGJ5dGVbXSB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGxlZnRTaGlmdChzZWxmLmdldE91dHB1dFN0cmVhbSgpLCB2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWNjZXB0cyBhIGNvbm5lY3Rpb24gYW5kIHBhc3NlcyB0aGUgcmVzdWx0aW5nIFNvY2tldCB0byB0aGUgY2xvc3VyZQorICAgICAqIHdoaWNoIHJ1bnMgaW4gYSBuZXcgVGhyZWFkLgorICAgICAqCisgICAgICogQHBhcmFtIHNlcnZlclNvY2tldCBhIFNlcnZlclNvY2tldAorICAgICAqIEBwYXJhbSBjbG9zdXJlICAgICAgYSBDbG9zdXJlCisgICAgICogQHJldHVybiBhIFNvY2tldAorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gSU9FeGNlcHRpb24gb2NjdXJzLgorICAgICAqIEBzZWUgamF2YS5uZXQuU2VydmVyU29ja2V0I2FjY2VwdCgpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTb2NrZXQgYWNjZXB0KFNlcnZlclNvY2tldCBzZXJ2ZXJTb2NrZXQsIGZpbmFsIENsb3N1cmUgY2xvc3VyZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU29ja2V0IHNvY2tldCA9IHNlcnZlclNvY2tldC5hY2NlcHQoKTsKKyAgICAgICAgbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY2xvc3VyZS5jYWxsKHNvY2tldCk7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldC5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0cud2FybmluZygiQ2F1Z2h0IGV4Y2VwdGlvbiBjbG9zaW5nIHNvY2tldDogIiArIGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KS5zdGFydCgpOworICAgICAgICByZXR1cm4gc29ja2V0OworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29udmVydHMgdGhpcyBGaWxlIHRvIGEge0BsaW5rIFdyaXRhYmxlfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlIGEgRmlsZQorICAgICAqIEByZXR1cm4gYSBGaWxlIHdoaWNoIHdyYXBzIHRoZSBpbnB1dCBmaWxlIGFuZCB3aGljaCBpbXBsZW1lbnRzIFdyaXRhYmxlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBGaWxlIGFzV3JpdGFibGUoRmlsZSBmaWxlKSB7CisgICAgICAgIHJldHVybiBuZXcgV3JpdGFibGVGaWxlKGZpbGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIHRoaXMgRmlsZSB0byBhIHtAbGluayBXcml0YWJsZX0gb3IgZGVsZWdhdGVzIHRvIGRlZmF1bHQKKyAgICAgKiB7QGxpbmsgI2FzVHlwZShPYmplY3QsQ2xhc3MpfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmIGEgRmlsZQorICAgICAqIEBwYXJhbSBjIHRoZSBkZXNpcmVkIGNsYXNzCisgICAgICogQHJldHVybiB0aGUgY29udmVydGVkIG9iamVjdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGFzVHlwZShGaWxlIGYsIENsYXNzIGMpIHsKKyAgICAgICAgaWYgKGMgPT0gV3JpdGFibGUuY2xhc3MpIHsKKyAgICAgICAgICAgIHJldHVybiBhc1dyaXRhYmxlKGYpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhc1R5cGUoKE9iamVjdCkgZiwgYyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWxsb3dzIGEgZmlsZSB0byByZXR1cm4gYSBXcml0YWJsZSBpbXBsZW1lbnRhdGlvbiB0aGF0IGNhbiBvdXRwdXQgaXRzZWxmCisgICAgICogdG8gYSBXcml0ZXIgc3RyZWFtLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGUgICAgIGEgRmlsZQorICAgICAqIEBwYXJhbSBlbmNvZGluZyB0aGUgZW5jb2RpbmcgdG8gYmUgdXNlZCB3aGVuIHJlYWRpbmcgdGhlIGZpbGUncyBjb250ZW50cworICAgICAqIEByZXR1cm4gRmlsZSB3aGljaCB3cmFwcyB0aGUgaW5wdXQgZmlsZSBhbmQgd2hpY2ggaW1wbGVtZW50cyBXcml0YWJsZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRmlsZSBhc1dyaXRhYmxlKEZpbGUgZmlsZSwgU3RyaW5nIGVuY29kaW5nKSB7CisgICAgICAgIHJldHVybiBuZXcgV3JpdGFibGVGaWxlKGZpbGUsIGVuY29kaW5nKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gU3RyaW5nIGludG8gYSBMaXN0IG9mIHN0cmluZ3Mgb2Ygb25lIGNoYXJhY3Rlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmIGEgU3RyaW5nCisgICAgICogQHJldHVybiBhIExpc3Qgb2YgY2hhcmFjdGVycyAoYSAxLWNoYXJhY3RlciBTdHJpbmcpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMaXN0IHRvTGlzdChTdHJpbmcgc2VsZikgeworICAgICAgICBpbnQgc2l6ZSA9IHNlbGYubGVuZ3RoKCk7CisgICAgICAgIExpc3QgYW5zd2VyID0gbmV3IEFycmF5TGlzdChzaXplKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIGFuc3dlci5hZGQoc2VsZi5zdWJzdHJpbmcoaSwgaSArIDEpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYW5zd2VyOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIHRoZSBHU3RyaW5nIHRvIGEgRmlsZSwgb3IgZGVsZWdhdGVzIHRvIHRoZSBkZWZhdWx0CisgICAgICoge0BsaW5rICNhc1R5cGUoT2JqZWN0LENsYXNzKX0KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmIGEgR1N0cmluZworICAgICAqIEBwYXJhbSBjICAgIHRoZSBkZXNpcmVkIGNsYXNzCisgICAgICogQHJldHVybiB0aGUgY29udmVydGVkIG9iamVjdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGFzVHlwZShHU3RyaW5nIHNlbGYsIENsYXNzIGMpIHsKKyAgICAgICAgaWYgKGMgPT0gRmlsZS5jbGFzcykgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWxlKHNlbGYudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFzVHlwZSgoT2JqZWN0KSBzZWxmLCBjKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD5Qcm92aWRlcyBhIG1ldGhvZCB0byBwZXJmb3JtIGN1c3RvbSAnZHluYW1pYycgdHlwZSBjb252ZXJzaW9uCisgICAgICogdG8gdGhlIGdpdmVuIGNsYXNzIHVzaW5nIHRoZSA8Y29kZT5hczwvY29kZT4gb3BlcmF0b3IuPC9wPgorICAgICAqIDxzdHJvbmc+RXhhbXBsZTo8L3N0cm9uZz4gPGNvZGU+JzEyMycgYXMgRG91YmxlPC9jb2RlPgorICAgICAqIDxwPkJ5IGRlZmF1bHQsIHRoZSBmb2xsb3dpbmcgdHlwZXMgYXJlIHN1cHBvcnRlZDoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPkxpc3Q8L2xpPgorICAgICAqIDxsaT5CaWdEZWNpbWFsPC9saT4KKyAgICAgKiA8bGk+QmlnSW50ZWdlcjwvbGk+CisgICAgICogPGxpPkNoYXJhY3RlcjwvbGk+CisgICAgICogPGxpPkNoYXJhY3RlcjwvbGk+CisgICAgICogPGxpPkRvdWJsZTwvbGk+CisgICAgICogPGxpPkZsb2F0PC9saT4KKyAgICAgKiA8bGk+RmlsZTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiBJZiBhbnkgb3RoZXIgdHlwZSBpcyBnaXZlbiwgdGhlIGNhbGwgaXMgZGVsZWdhdGVkIHRvCisgICAgICoge0BsaW5rICNhc1R5cGUoT2JqZWN0LENsYXNzKX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiBhIFN0cmluZworICAgICAqIEBwYXJhbSBjICAgIHRoZSBkZXNpcmVkIGNsYXNzCisgICAgICogQHJldHVybiB0aGUgY29udmVydGVkIG9iamVjdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGFzVHlwZShTdHJpbmcgc2VsZiwgQ2xhc3MgYykgeworICAgICAgICBpZiAoYyA9PSBMaXN0LmNsYXNzKSB7CisgICAgICAgICAgICByZXR1cm4gdG9MaXN0KHNlbGYpOworICAgICAgICB9IGVsc2UgaWYgKGMgPT0gQmlnRGVjaW1hbC5jbGFzcykgeworICAgICAgICAgICAgcmV0dXJuIHRvQmlnRGVjaW1hbChzZWxmKTsKKyAgICAgICAgfSBlbHNlIGlmIChjID09IEJpZ0ludGVnZXIuY2xhc3MpIHsKKyAgICAgICAgICAgIHJldHVybiB0b0JpZ0ludGVnZXIoc2VsZik7CisgICAgICAgIH0gZWxzZSBpZiAoYyA9PSBDaGFyYWN0ZXIuY2xhc3MpIHsKKyAgICAgICAgICAgIHJldHVybiB0b0NoYXJhY3RlcihzZWxmKTsKKyAgICAgICAgfSBlbHNlIGlmIChjID09IERvdWJsZS5jbGFzcykgeworICAgICAgICAgICAgcmV0dXJuIHRvRG91YmxlKHNlbGYpOworICAgICAgICB9IGVsc2UgaWYgKGMgPT0gRmxvYXQuY2xhc3MpIHsKKyAgICAgICAgICAgIHJldHVybiB0b0Zsb2F0KHNlbGYpOworICAgICAgICB9IGVsc2UgaWYgKGMgPT0gRmlsZS5jbGFzcykgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWxlKHNlbGYpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhc1R5cGUoKE9iamVjdCkgc2VsZiwgYyk7CisgICAgfQorCisgICAgLy8gUHJvY2VzcyBtZXRob2RzCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvKioKKyAgICAgKiBBbiBhbGlhcyBtZXRob2Qgc28gdGhhdCBhIHByb2Nlc3MgYXBwZWFycyBzaW1pbGFyIHRvIFN5c3RlbS5vdXQsIFN5c3RlbS5pbiwgU3lzdGVtLmVycjsKKyAgICAgKiB5b3UgY2FuIHVzZSBwcm9jZXNzLmluLCBwcm9jZXNzLm91dCwgcHJvY2Vzcy5lcnIgaW4gYSBzaW1pbGFyIGZhc2hpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiBhIFByb2Nlc3MgaW5zdGFuY2UKKyAgICAgKiBAcmV0dXJuIHRoZSBJbnB1dFN0cmVhbSBmb3IgdGhlIHByb2Nlc3MKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIElucHV0U3RyZWFtIGdldEluKFByb2Nlc3Mgc2VsZikgeworICAgICAgICByZXR1cm4gc2VsZi5nZXRJbnB1dFN0cmVhbSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgdGhlIHRleHQgb2YgdGhlIG91dHB1dCBzdHJlYW0gb2YgdGhlIFByb2Nlc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiBhIFByb2Nlc3MgaW5zdGFuY2UKKyAgICAgKiBAcmV0dXJuIHRoZSB0ZXh0IG9mIHRoZSBvdXRwdXQKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIElPRXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUZXh0KFByb2Nlc3Mgc2VsZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdldFRleHQobmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihzZWxmLmdldElucHV0U3RyZWFtKCkpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQW4gYWxpYXMgbWV0aG9kIHNvIHRoYXQgYSBwcm9jZXNzIGFwcGVhcnMgc2ltaWxhciB0byBTeXN0ZW0ub3V0LCBTeXN0ZW0uaW4sIFN5c3RlbS5lcnI7CisgICAgICogeW91IGNhbiB1c2UgcHJvY2Vzcy5pbiwgcHJvY2Vzcy5vdXQsIHByb2Nlc3MuZXJyIGluIGEgc2ltaWxhciBmYXNoaW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgYSBQcm9jZXNzIGluc3RhbmNlCisgICAgICogQHJldHVybiB0aGUgZXJyb3IgSW5wdXRTdHJlYW0gZm9yIHRoZSBwcm9jZXNzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBJbnB1dFN0cmVhbSBnZXRFcnIoUHJvY2VzcyBzZWxmKSB7CisgICAgICAgIHJldHVybiBzZWxmLmdldEVycm9yU3RyZWFtKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQW4gYWxpYXMgbWV0aG9kIHNvIHRoYXQgYSBwcm9jZXNzIGFwcGVhcnMgc2ltaWxhciB0byBTeXN0ZW0ub3V0LCBTeXN0ZW0uaW4sIFN5c3RlbS5lcnI7CisgICAgICogeW91IGNhbiB1c2UgcHJvY2Vzcy5pbiwgcHJvY2Vzcy5vdXQsIHByb2Nlc3MuZXJyIGluIGEgc2ltaWxhciBmYXNoaW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgYSBQcm9jZXNzIGluc3RhbmNlCisgICAgICogQHJldHVybiB0aGUgT3V0cHV0U3RyZWFtIGZvciB0aGUgcHJvY2VzcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT3V0cHV0U3RyZWFtIGdldE91dChQcm9jZXNzIHNlbGYpIHsKKyAgICAgICAgcmV0dXJuIHNlbGYuZ2V0T3V0cHV0U3RyZWFtKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3ZlcmxvYWRzIHRoZSBsZWZ0IHNoaWZ0IG9wZXJhdG9yICgmbHQ7Jmx0OykgdG8gcHJvdmlkZSBhbiBhcHBlbmQgbWVjaGFuaXNtCisgICAgICogdG8gcGlwZSBkYXRhIHRvIGEgUHJvY2Vzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmICBhIFByb2Nlc3MgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gdmFsdWUgYSB2YWx1ZSB0byBhcHBlbmQKKyAgICAgKiBAcmV0dXJuIGEgV3JpdGVyCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBJT0V4Y2VwdGlvbiBvY2N1cnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBXcml0ZXIgbGVmdFNoaWZ0KFByb2Nlc3Mgc2VsZiwgT2JqZWN0IHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gbGVmdFNoaWZ0KHNlbGYuZ2V0T3V0cHV0U3RyZWFtKCksIHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPdmVybG9hZHMgdGhlIGxlZnQgc2hpZnQgb3BlcmF0b3IgdG8gcHJvdmlkZSBhbiBhcHBlbmQgbWVjaGFuaXNtCisgICAgICogdG8gcGlwZSBpbnRvIGEgUHJvY2VzcworICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgIGEgUHJvY2VzcyBpbnN0YW5jZQorICAgICAqIEBwYXJhbSB2YWx1ZSBkYXRhIHRvIGFwcGVuZAorICAgICAqIEByZXR1cm4gYW4gT3V0cHV0U3RyZWFtCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBJT0V4Y2VwdGlvbiBvY2N1cnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPdXRwdXRTdHJlYW0gbGVmdFNoaWZ0KFByb2Nlc3Mgc2VsZiwgYnl0ZVtdIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gbGVmdFNoaWZ0KHNlbGYuZ2V0T3V0cHV0U3RyZWFtKCksIHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXYWl0IGZvciB0aGUgcHJvY2VzcyB0byBmaW5pc2ggZHVyaW5nIGEgY2VydGFpbiBhbW91bnQgb2YgdGltZSwgb3RoZXJ3aXNlIHN0b3BzIHRoZSBwcm9jZXNzLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgICAgICAgICAgIGEgUHJvY2VzcworICAgICAqIEBwYXJhbSBudW1iZXJPZk1pbGxpcyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IGJlZm9yZSBzdG9wcGluZyB0aGUgcHJvY2VzcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3YWl0Rm9yT3JLaWxsKFByb2Nlc3Mgc2VsZiwgbG9uZyBudW1iZXJPZk1pbGxpcykgeworICAgICAgICBQcm9jZXNzUnVubmVyIHJ1bm5hYmxlID0gbmV3IFByb2Nlc3NSdW5uZXIoc2VsZik7CisgICAgICAgIFRocmVhZCB0aHJlYWQgPSBuZXcgVGhyZWFkKHJ1bm5hYmxlKTsKKyAgICAgICAgdGhyZWFkLnN0YXJ0KCk7CisgICAgICAgIHJ1bm5hYmxlLndhaXRGb3JPcktpbGwobnVtYmVyT2ZNaWxsaXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIG91dHB1dCBhbmQgZXJyb3Igc3RyZWFtcyBmcm9tIGEgcHJvY2VzcyBhbmQgcmVhZHMgdGhlbQorICAgICAqIHRvIGtlZXAgdGhlIHByb2Nlc3MgZnJvbSBibG9ja2luZyBkdWUgdG8gYSBmdWxsIG91cHV0IGJ1ZmZlci4gRm9yIHRoaXMKKyAgICAgKiB0d28gVGhyZWFkcyBhcmUgc3RhcnRlZCwgc28gdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gaW1tZWRpYXRlbHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiBhIFByb2Nlc3MKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29uc3VtZVByb2Nlc3NPdXRwdXQoUHJvY2VzcyBzZWxmKSB7CisgICAgICAgIER1bXBlciBkID0gbmV3IER1bXBlcihzZWxmLmdldEVycm9yU3RyZWFtKCkpOworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQoZCk7CisgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgZCA9IG5ldyBEdW1wZXIoc2VsZi5nZXRJbnB1dFN0cmVhbSgpKTsKKyAgICAgICAgdCA9IG5ldyBUaHJlYWQoZCk7CisgICAgICAgIHQuc3RhcnQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIGVhY2ggcmVnZXggZ3JvdXAgbWF0Y2hlZCBzdWJzdHJpbmcgb2YgdGhlIGdpdmVuIHN0cmluZy4gSWYgdGhlIGNsb3N1cmUKKyAgICAgKiBwYXJhbWV0ZXIgdGFrZXMgb25lIGFyZ3VtZW50LCBhbiBhcnJheSB3aXRoIGFsbCBtYXRjaCBncm91cHMgaXMgcGFzc2VkIHRvIGl0LgorICAgICAqIElmIHRoZSBjbG9zdXJlIHRha2VzIGFzIG1hbnkgYXJndW1lbnRzIGFzIHRoZXJlIGFyZSBtYXRjaCBncm91cHMsIHRoZW4gZWFjaAorICAgICAqIHBhcmFtZXRlciB3aWxsIGJlIG9uZSBtYXRjaCBncm91cC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmICAgIHRoZSBzb3VyY2Ugc3RyaW5nCisgICAgICogQHBhcmFtIHJlZ2V4ICAgYSBSZWdleCBzdHJpbmcKKyAgICAgKiBAcGFyYW0gY2xvc3VyZSBhIGNsb3N1cmUgd2l0aCBvbmUgcGFyYW1ldGVyIG9yIGFzIG11Y2ggcGFyYW1ldGVycyBhcyBncm91cHMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZWFjaE1hdGNoKFN0cmluZyBzZWxmLCBTdHJpbmcgcmVnZXgsIENsb3N1cmUgY2xvc3VyZSkgeworICAgICAgICBQYXR0ZXJuIHAgPSBQYXR0ZXJuLmNvbXBpbGUocmVnZXgpOworICAgICAgICBNYXRjaGVyIG0gPSBwLm1hdGNoZXIoc2VsZik7CisgICAgICAgIHdoaWxlIChtLmZpbmQoKSkgeworICAgICAgICAgICAgaW50IGNvdW50ID0gbS5ncm91cENvdW50KCk7CisgICAgICAgICAgICBMaXN0IGdyb3VwcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBncm91cHMuYWRkKG0uZ3JvdXAoaSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGdyb3Vwcy5zaXplKCkgPT0gMSB8fCBjbG9zdXJlLmdldE1heGltdW1OdW1iZXJPZlBhcmFtZXRlcnMoKSA8IGdyb3Vwcy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBub3QgZW5vdWdoIHBhcmFtZXRlcnMgdGhlcmUgdG8gZ2l2ZSBlYWNoIGdyb3VwIHBhcnQKKyAgICAgICAgICAgICAgICAvLyBpdCdzIG93biBwYXJhbWV0ZXIsIHNvIHRyeSBhIGNsb3N1cmUgd2l0aCBvbmUgcGFyYW1ldGVyCisgICAgICAgICAgICAgICAgLy8gYW5kIGdpdmUgaXQgYWxsIGdyb3VwcyBhcyBhIGFycmF5CisgICAgICAgICAgICAgICAgY2xvc3VyZS5jYWxsKChPYmplY3QpIGdyb3Vwcy50b0FycmF5KCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjbG9zdXJlLmNhbGwoZ3JvdXBzLnRvQXJyYXkoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIGVhY2ggbWF0Y2hlZCBzdWJzdHJpbmcgb2YgdGhlIGdpdmVuIGdyb3VwIG1hdGNoZXIuIFRoZSBvYmplY3QKKyAgICAgKiBwYXNzZWQgdG8gdGhlIGNsb3N1cmUgaXMgYW4gYXJyYXkgb2Ygc3RyaW5ncywgbWF0Y2hlZCBwZXIgYSBzdWNjZXNzZnVsIG1hdGNoLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgICAgdGhlIHNvdXJjZSBtYXRjaGVyCisgICAgICogQHBhcmFtIGNsb3N1cmUgYSBjbG9zdXJlCisgICAgICogQHJldHVybiB0aGUgbWF0Y2hlcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTWF0Y2hlciBlYWNoKE1hdGNoZXIgc2VsZiwgQ2xvc3VyZSBjbG9zdXJlKSB7CisgICAgICAgIHdoaWxlIChzZWxmLmZpbmQoKSkgeworICAgICAgICAgICAgaW50IGNvdW50ID0gc2VsZi5ncm91cENvdW50KCk7CisgICAgICAgICAgICBMaXN0IGdyb3VwcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBncm91cHMuYWRkKHNlbGYuZ3JvdXAoaSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2xvc3VyZS5jYWxsKGdyb3Vwcy50b0FycmF5KCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzZWxmOworICAgIH0KKworICAgIC8qKgorICAgICAqIEl0ZXJhdGVzIG92ZXIgZXZlcnkgZWxlbWVudCBvZiB0aGUgY29sbGVjdGlvbiBhbmQgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG9iamVjdAorICAgICAqIHRoYXQgbWF0Y2hlcyB0aGUgY29uZGl0aW9uIHNwZWNpZmllZCBpbiB0aGUgY2xvc3VyZQorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgICAgdGhlIGl0ZXJhdGlvbiBvYmplY3Qgb3ZlciB3aGljaCB3ZSBpdGVyYXRlCisgICAgICogQHBhcmFtIGNsb3N1cmUgdGhlIGZpbHRlciB0byBwZXJmb3JtIGEgbWF0Y2ggb24gdGhlIGNvbGxlY3Rpb24KKyAgICAgKiBAcmV0dXJuIGFuIGludGVnZXIgdGhhdCBpcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG1hY3RoZWQgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IGZpbmRJbmRleE9mKE9iamVjdCBzZWxmLCBDbG9zdXJlIGNsb3N1cmUpIHsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBJbnZva2VySGVscGVyLmFzSXRlcmF0b3Ioc2VsZik7IGl0ZXIuaGFzTmV4dCgpOyBpKyspIHsKKyAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGl0ZXIubmV4dCgpOworICAgICAgICAgICAgaWYgKERlZmF1bHRUeXBlVHJhbnNmb3JtYXRpb24uY2FzdFRvQm9vbGVhbihjbG9zdXJlLmNhbGwodmFsdWUpKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEl0ZXJhdGVzIHRocm91Z2ggdGhlIGNsYXNzbG9hZGVyIHBhcmVudHMgdW50aWwgaXQgZmluZHMgYSBsb2FkZXIgd2l0aCBhIGNsYXNzCisgICAgICogbmFtZWQgIm9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuUm9vdExvYWRlciIuIElmIHRoZXJlIGlzIG5vIHN1Y2ggY2xhc3MKKyAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiB3aWxsIGJlIHJldHVybmVkLiBUaGUgbmFtZSBpcyB1c2VkIGZvciBjb21wYXJpc29uIGJlY2F1c2UKKyAgICAgKiBhIGRpcmVjdCBjb21wYXJpc29uIHVzaW5nID09IG1heSBmYWlsIGFzIHRoZSBjbGFzcyBtYXkgYmUgbG9hZGVkIHRocm91Z2gKKyAgICAgKiBkaWZmZXJlbnQgY2xhc3Nsb2FkZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgYSBDbGFzc0xvYWRlcgorICAgICAqIEByZXR1cm4gdGhlIHJvb3RMb2FkZXIgZm9yIHRoZSBDbGFzc0xvYWRlcgorICAgICAqIEBzZWUgb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5Sb290TG9hZGVyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDbGFzc0xvYWRlciBnZXRSb290TG9hZGVyKENsYXNzTG9hZGVyIHNlbGYpIHsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGlmIChzZWxmID09IG51bGwpIHJldHVybiBudWxsOworICAgICAgICAgICAgaWYgKGlzUm9vdExvYWRlckNsYXNzT3JTdWJDbGFzcyhzZWxmKSkgcmV0dXJuIHNlbGY7CisgICAgICAgICAgICBzZWxmID0gc2VsZi5nZXRQYXJlbnQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNSb290TG9hZGVyQ2xhc3NPclN1YkNsYXNzKENsYXNzTG9hZGVyIHNlbGYpIHsKKyAgICAgICAgQ2xhc3MgY3VycmVudCA9IHNlbGYuZ2V0Q2xhc3MoKTsKKyAgICAgICAgd2hpbGUoIWN1cnJlbnQuZ2V0TmFtZSgpLmVxdWFscyhPYmplY3QuY2xhc3MuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgaWYoY3VycmVudC5nZXROYW1lKCkuZXF1YWxzKFJvb3RMb2FkZXIuY2xhc3MuZ2V0TmFtZSgpKSkgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5nZXRTdXBlcmNsYXNzKCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIGEgZ2l2ZW4gb2JqZWN0IHRvIGEgdHlwZS4gVGhpcyBtZXRob2QgaXMgdXNlZCB0aHJvdWdoCisgICAgICogdGhlICJhcyIgb3BlcmF0b3IgYW5kIGlzIG92ZXJsb2FkYWJsZSBhcyBhbnkgb3RoZXIgb3BlcmF0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2JqICB0aGUgb2JqZWN0IHRvIGNvbnZlcnQKKyAgICAgKiBAcGFyYW0gdHlwZSB0aGUgZ29hbCB0eXBlCisgICAgICogQHJldHVybiB0aGUgcmVzdWx0aW5nIG9iamVjdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGFzVHlwZShPYmplY3Qgb2JqLCBDbGFzcyB0eXBlKSB7CisgICAgICAgIHJldHVybiBEZWZhdWx0VHlwZVRyYW5zZm9ybWF0aW9uLmNhc3RUb1R5cGUob2JqLCB0eXBlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gZHluYW1pY2FsbHkgY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMKKyAgICAgKiBjbGFzcy4gIENhbGxzIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGMgYSBjbGFzcworICAgICAqIEByZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IG5ld0luc3RhbmNlKENsYXNzIGMpIHsKKyAgICAgICAgcmV0dXJuIEludm9rZXJIZWxwZXIuZ2V0SW5zdGFuY2UoKS5pbnZva2VDb25zdHJ1Y3Rvck9mKGMsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhlbHBlciB0byBjb25zdHJ1Y3QgYSBuZXcgaW5zdGFuY2UgZnJvbSB0aGUgZ2l2ZW4gYXJndW1lbnRzLgorICAgICAqIFRoZSBjb25zdHJ1Y3RvciBpcyBjYWxsZWQgYmFzZWQgb24gdGhlIG51bWJlciBhbmQgdHlwZXMgaW4gdGhlCisgICAgICogYXJncyBhcnJheS4gIFVzZSA8Y29kZT5uZXdJbnN0YW5jZShudWxsKTwvY29kZT4gb3Igc2ltcGx5CisgICAgICogPGNvZGU+bmV3SW5zdGFuY2UoKTwvY29kZT4gZm9yIHRoZSBkZWZhdWx0IChuby1hcmcpIGNvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGMgICAgYSBjbGFzcworICAgICAqIEBwYXJhbSBhcmdzIHRoZSBjb25zdHJ1Y3RvciBhcmd1bWVudHMKKyAgICAgKiBAcmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgbmV3SW5zdGFuY2UoQ2xhc3MgYywgT2JqZWN0W10gYXJncykgeworICAgICAgICBpZiAoYXJncyA9PSBudWxsKSBhcmdzID0gbmV3IE9iamVjdFtde251bGx9OworICAgICAgICByZXR1cm4gSW52b2tlckhlbHBlci5nZXRJbnN0YW5jZSgpLmludm9rZUNvbnN0cnVjdG9yT2YoYywgYXJncyk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgIm1ldGFDbGFzcyIgcHJvcGVydHkgdG8gYWxsIGNsYXNzIG9iamVjdHMgc28geW91IGNhbiB1c2UgdGhlIHN5bnRheAorICAgICAqIDxjb2RlPlN0cmluZy5tZXRhQ2xhc3MubXlNZXRob2QgPSB7IHByaW50bG4gImZvbyIgfTwvY29kZT4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjIFRoZSBqYXZhLmxhbmcuQ2xhc3MgaW5zdGFuY2UKKyAgICAgKiBAcmV0dXJuIEFuIE1ldGFDbGFzcyBpbnN0YW5jZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTWV0YUNsYXNzIGdldE1ldGFDbGFzcyhDbGFzcyBjKSB7CisgICAgICAgIE1ldGFDbGFzc1JlZ2lzdHJ5IG1ldGFDbGFzc1JlZ2lzdHJ5ID0gR3Jvb3Z5U3lzdGVtLmdldE1ldGFDbGFzc1JlZ2lzdHJ5KCk7CisgICAgICAgIE1ldGFDbGFzcyBtYyA9IG1ldGFDbGFzc1JlZ2lzdHJ5LmdldE1ldGFDbGFzcyhjKTsKKyAgICAgICAgaWYgKG1jIGluc3RhbmNlb2YgRXhwYW5kb01ldGFDbGFzcworICAgICAgICAgICAgICAgIHx8IG1jIGluc3RhbmNlb2YgRGVsZWdhdGluZ01ldGFDbGFzcyAmJiAoKERlbGVnYXRpbmdNZXRhQ2xhc3MpIG1jKS5nZXRBZGFwdGVlKCkgaW5zdGFuY2VvZiBFeHBhbmRvTWV0YUNsYXNzKQorICAgICAgICAgICAgcmV0dXJuIG1jOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIE1ldGFDbGFzcyBlbWMgPSBFeHBhbmRvTWV0YUNsYXNzQ3JlYXRpb25IYW5kbGUuaW5zdGFuY2UuY3JlYXRlKGMsIG1ldGFDbGFzc1JlZ2lzdHJ5KTsKKyAgICAgICAgICAgIGVtYy5pbml0aWFsaXplKCk7CisgICAgICAgICAgICBtZXRhQ2xhc3NSZWdpc3RyeS5zZXRNZXRhQ2xhc3MoYywgZW1jKTsKKyAgICAgICAgICAgIHJldHVybiBlbWM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPYnRhaW5zIGEgTWV0YUNsYXNzIGZvciBhbiBvYmplY3QgZWl0aGVyIGZyb20gdGhlIHJlZ2lzdHJ5IG9yIGluIHRoZSBjYXNlIG9mCisgICAgICogYSBHcm9vdnlPYmplY3QgZnJvbSB0aGUgb2JqZWN0IGl0c2VsZi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvYmogVGhlIG9iamVjdCBpbiBxdWVzdGlvbgorICAgICAqIEByZXR1cm4gVGhlIE1ldGFDbGFzcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTWV0YUNsYXNzIGdldE1ldGFDbGFzcyhPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBHcm9vdnlPYmplY3QpIHsKKyAgICAgICAgICAgIHJldHVybiAoKEdyb292eU9iamVjdCkgb2JqKS5nZXRNZXRhQ2xhc3MoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gR3Jvb3Z5U3lzdGVtLmdldE1ldGFDbGFzc1JlZ2lzdHJ5KCkuZ2V0TWV0YUNsYXNzKG9iai5nZXRDbGFzcygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIFJ1bm5hYmxlIHdoaWNoIHdhaXRzIGZvciBhIHByb2Nlc3MgdG8gY29tcGxldGUgdG9nZXRoZXIgd2l0aCBhIG5vdGlmaWNhdGlvbiBzY2hlbWUKKyAgICAgKiBhbGxvd2luZyBhbm90aGVyIHRocmVhZCB0byB3YWl0IGEgbWF4aW11bSBudW1iZXIgb2Ygc2Vjb25kcyBmb3IgdGhlIHByb2Nlc3MgdG8gY29tcGxldGUKKyAgICAgKiBiZWZvcmUga2lsbGluZyBpdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFByb2Nlc3NSdW5uZXIgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisgICAgICAgIFByb2Nlc3MgcHJvY2VzczsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGZpbmlzaGVkOworCisgICAgICAgIHB1YmxpYyBQcm9jZXNzUnVubmVyKFByb2Nlc3MgcHJvY2VzcykgeworICAgICAgICAgICAgdGhpcy5wcm9jZXNzID0gcHJvY2VzczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcHJvY2Vzcy53YWl0Rm9yKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gSWdub3JlCisgICAgICAgICAgICB9CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgICAgICBub3RpZnlBbGwoKTsKKyAgICAgICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgd2FpdEZvck9yS2lsbChsb25nIG1pbGxpcykgeworICAgICAgICAgICAgaWYgKCFmaW5pc2hlZCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHdhaXQobWlsbGlzKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIWZpbmlzaGVkKSB7CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZGVzdHJveSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgUmFuZ2VJbmZvIHsKKyAgICAgICAgcHJvdGVjdGVkIGludCBmcm9tLCB0bzsKKyAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gcmV2ZXJzZTsKKworICAgICAgICBwdWJsaWMgUmFuZ2VJbmZvKGludCBmcm9tLCBpbnQgdG8sIGJvb2xlYW4gcmV2ZXJzZSkgeworICAgICAgICAgICAgdGhpcy5mcm9tID0gZnJvbTsKKyAgICAgICAgICAgIHRoaXMudG8gPSB0bzsKKyAgICAgICAgICAgIHRoaXMucmV2ZXJzZSA9IHJldmVyc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEdW1wZXIgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisgICAgICAgIElucHV0U3RyZWFtIGluOworCisgICAgICAgIHB1YmxpYyBEdW1wZXIoSW5wdXRTdHJlYW0gaW4pIHsKKyAgICAgICAgICAgIHRoaXMuaW4gPSBpbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIElucHV0U3RyZWFtUmVhZGVyIGlzciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbik7CisgICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihpc3IpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoYnIucmVhZExpbmUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBHcm9vdnlSdW50aW1lRXhjZXB0aW9uKCJleGNlcHRpb24gd2hpbGUgcmVhZGluZyBwcm9jZXNzIHN0cmVhbSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQXR0ZW1wdHMgdG8gY3JlYXRlIGFuIEl0ZXJhdG9yIGZvciB0aGUgZ2l2ZW4gb2JqZWN0IGJ5IGZpcnN0CisgICAgICogY29udmVydGluZyBpdCB0byBhIENvbGxlY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbyBhbiBvYmplY3QKKyAgICAgKiBAcmV0dXJuIGFuIEl0ZXJhdG9yIGZvciB0aGUgZ2l2ZW4gT2JqZWN0LgorICAgICAqIEBzZWUgRGVmYXVsdFR5cGVUcmFuc2Zvcm1hdGlvbiNhc0NvbGxlY3Rpb24oT2JqZWN0KQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgSXRlcmF0b3IgaXRlcmF0b3IoT2JqZWN0IG8pIHsKKyAgICAgICAgcmV0dXJuIERlZmF1bHRUeXBlVHJhbnNmb3JtYXRpb24uYXNDb2xsZWN0aW9uKG8pLml0ZXJhdG9yKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWxsb3dzIGFuIEVudW1lcmF0aW9uIHRvIGJlaGF2ZSBsaWtlIGFuIEl0ZXJhdG9yLiAgTm90ZSB0aGF0IHRoZQorICAgICAqIHtAbGluayBJdGVyYXRvciNyZW1vdmUoKSByZW1vdmUoKX0gbWV0aG9kIGlzIHVuc3VwcG9ydGVkIHNpbmNlIHRoZQorICAgICAqIHVuZGVybHlpbmcgRW51bWVyYXRpb24gZG9lcyBub3QgcHJvdmlkZSBhIG1lY2hhbmlzbSBmb3IgcmVtb3ZpbmcgaXRlbXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW51bWVyYXRpb24gYW4gRW51bWVyYXRpb24gb2JqZWN0CisgICAgICogQHJldHVybiBhbiBJdGVyYXRvciBmb3IgdGhlIGdpdmVuIEVudW1lcmF0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBJdGVyYXRvciBpdGVyYXRvcihmaW5hbCBFbnVtZXJhdGlvbiBlbnVtZXJhdGlvbikgeworICAgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCkgeworICAgICAgICAgICAgcHJpdmF0ZSBPYmplY3QgbGFzdDsKKworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsKKyAgICAgICAgICAgICAgICBsYXN0ID0gZW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGFzdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiQ2Fubm90IHJlbW92ZSgpIGZyb20gYW4gRW51bWVyYXRpb24iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICAvLyBUT0RPIG1vdmUgaW50byBET01DYXRlZ29yeSBvbmNlIHdlIGNhbiBtYWtlIHVzZSBvZiBvcHRpb25hbCBjYXRlZ29yaWVzIHRyYW5zcGFyZW50CisKKyAgICAvKioKKyAgICAgKiBNYWtlcyBOb2RlTGlzdCBpdGVyYWJsZSBieSByZXR1cm5pbmcgYSByZWFkLW9ubHkgSXRlcmF0b3Igd2hpY2ggdHJhdmVyc2VzCisgICAgICogb3ZlciBlYWNoIE5vZGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbm9kZUxpc3QgYSBOb2RlTGlzdAorICAgICAqIEByZXR1cm4gYW4gSXRlcmF0b3IgZm9yIGEgTm9kZUxpc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEl0ZXJhdG9yIGl0ZXJhdG9yKGZpbmFsIE5vZGVMaXN0IG5vZGVMaXN0KSB7CisgICAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoKSB7CisgICAgICAgICAgICBwcml2YXRlIGludCBjdXJyZW50IC8qID0gMCAqLzsKKworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudCA8IG5vZGVMaXN0LmdldExlbmd0aCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGVMaXN0Lml0ZW0oY3VycmVudCsrKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiQ2Fubm90IHJlbW92ZSgpIGZyb20gYSBOb2RlTGlzdCBpdGVyYXRvciIpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVucyBhbiB7QGxpbmsgSXRlcmF0b3J9IHdoaWNoIHRyYXZlcnNlcyBlYWNoIG1hdGNoLgorICAgICAqCisgICAgICogQHBhcmFtIG1hdGNoZXIgYSBNYXRjaGVyIG9iamVjdAorICAgICAqIEByZXR1cm4gYW4gSXRlcmF0b3IgZm9yIGEgTWF0Y2hlcgorICAgICAqIEBzZWUgTWF0Y2hlciNncm91cCgpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBJdGVyYXRvciBpdGVyYXRvcihmaW5hbCBNYXRjaGVyIG1hdGNoZXIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcigpIHsKKyAgICAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBmb3VuZCAvKiA9IGZhbHNlICovOworICAgICAgICAgICAgcHJpdmF0ZSBib29sZWFuIGRvbmUgLyogPSBmYWxzZSAqLzsKKworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKyAgICAgICAgICAgICAgICBpZiAoZG9uZSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtYXRjaGVyLmZpbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7CisgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3VuZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaGVyLmdyb3VwKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIGl0ZXJhdG9yIHdoaWNoIHdpbGwgdHJhdmVyc2UgdGhyb3VnaCB0aGUgcmVhZGVyIGEgbGluZSBhdCBhIHRpbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiBhIFJlYWRlciBvYmplY3QKKyAgICAgKiBAcmV0dXJuIGFuIEl0ZXJhdG9yIGZvciB0aGUgUmVhZGVyCisgICAgICogQHNlZSBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyI3JlYWRMaW5lKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEl0ZXJhdG9yIGl0ZXJhdG9yKFJlYWRlciBzZWxmKSB7CisgICAgICAgIGZpbmFsIEJ1ZmZlcmVkUmVhZGVyIGJ1ZmZlcmVkUmVhZGVyOworICAgICAgICBpZiAoc2VsZiBpbnN0YW5jZW9mIEJ1ZmZlcmVkUmVhZGVyKQorICAgICAgICAgICAgYnVmZmVyZWRSZWFkZXIgPSAoQnVmZmVyZWRSZWFkZXIpIHNlbGY7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJ1ZmZlcmVkUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKHNlbGYpOworICAgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKCkgeworICAgICAgICAgICAgU3RyaW5nIG5leHRWYWwgLyogPSBudWxsICovOworICAgICAgICAgICAgYm9vbGVhbiBuZXh0TXVzdFJlYWQgPSB0cnVlOworICAgICAgICAgICAgYm9vbGVhbiBoYXNOZXh0ID0gdHJ1ZTsKKworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKyAgICAgICAgICAgICAgICBpZiAobmV4dE11c3RSZWFkICYmIGhhc05leHQpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHRWYWwgPSByZWFkTmV4dCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dE11c3RSZWFkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhc05leHQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gaGFzTmV4dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIE9iamVjdCBuZXh0KCkgeworICAgICAgICAgICAgICAgIFN0cmluZyByZXR2YWwgPSBudWxsOworICAgICAgICAgICAgICAgIGlmIChuZXh0TXVzdFJlYWQpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IHJlYWROZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhc05leHQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBuZXh0VmFsOworICAgICAgICAgICAgICAgIG5leHRNdXN0UmVhZCA9IHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcmVhZE5leHQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIFN0cmluZyBudiA9IGJ1ZmZlcmVkUmVhZGVyLnJlYWRMaW5lKCk7CisgICAgICAgICAgICAgICAgaWYgKG52ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGhhc05leHQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIkNhbm5vdCByZW1vdmUoKSBmcm9tIGEgUmVhZGVyIEl0ZXJhdG9yIik7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhbmRhcmQgaXRlcmF0b3IgZm9yIGEgaW5wdXQgc3RyZWFtIHdoaWNoIGl0ZXJhdGVzIHRocm91Z2ggdGhlIHN0cmVhbQorICAgICAqIGNvbnRlbnQgaW4gYSBieXRlLWJhc2VkIGZhc2hpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiBhbiBJbnB1dFN0cmVhbSBvYmplY3QKKyAgICAgKiBAcmV0dXJuIGFuIEl0ZXJhdG9yIGZvciB0aGUgSW5wdXRTdHJlYW0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEl0ZXJhdG9yIGl0ZXJhdG9yKElucHV0U3RyZWFtIHNlbGYpIHsKKyAgICAgICAgcmV0dXJuIGl0ZXJhdG9yKG5ldyBEYXRhSW5wdXRTdHJlYW0oc2VsZikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YW5kYXJkIGl0ZXJhdG9yIGZvciBhIGRhdGEgaW5wdXQgc3RyZWFtIHdoaWNoIGl0ZXJhdGVzIHRocm91Z2ggdGhlCisgICAgICogc3RyZWFtIGNvbnRlbnQgYSBieXRlIGF0IGEgdGltZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmIGEgRGF0YUlucHV0U3RyZWFtIG9iamVjdAorICAgICAqIEByZXR1cm4gYW4gSXRlcmF0b3IgZm9yIHRoZSBEYXRhSW5wdXRTdHJlYW0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEl0ZXJhdG9yIGl0ZXJhdG9yKGZpbmFsIERhdGFJbnB1dFN0cmVhbSBzZWxmKSB7CisgICAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoKSB7CisgICAgICAgICAgICBCeXRlIG5leHRWYWw7CisgICAgICAgICAgICBib29sZWFuIG5leHRNdXN0UmVhZCA9IHRydWU7CisgICAgICAgICAgICBib29sZWFuIGhhc05leHQgPSB0cnVlOworCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworICAgICAgICAgICAgICAgIGlmIChuZXh0TXVzdFJlYWQgJiYgaGFzTmV4dCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZSBiUHJpbWl0aXZlID0gc2VsZi5yZWFkQnl0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFZhbCA9IG5ldyBCeXRlKGJQcmltaXRpdmUpOworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dE11c3RSZWFkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhc05leHQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gaGFzTmV4dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIE9iamVjdCBuZXh0KCkgeworICAgICAgICAgICAgICAgIEJ5dGUgcmV0dmFsID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpZiAobmV4dE11c3RSZWFkKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlIGIgPSBzZWxmLnJlYWRCeXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBuZXcgQnl0ZShiKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaGFzTmV4dCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IG5leHRWYWw7CisgICAgICAgICAgICAgICAgbmV4dE11c3RSZWFkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJDYW5ub3QgcmVtb3ZlKCkgZnJvbSBhbiBJbnB1dFN0cmVhbSBJdGVyYXRvciIpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YW5kYXJkIGl0ZXJhdG9yIGZvciBhIHRleHQgZmlsZSB3aGljaCBpdGVyYXRlcyB0aHJvdWdoIHRoZSBmaWxlIGNvbnRlbnQKKyAgICAgKiBvbmUgbGluZSBhdCBhIHRpbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiBhIGZpbGUgb2JqZWN0CisgICAgICogQHJldHVybiBhIGxpbmUtYmFzZWQgaXRlcmF0b3IKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBwcm9jZXNzaW5nIHRoZSBmaWxlIChlLmcuIGZpbGUgaXMgbm90IGZvdW5kKQorICAgICAqIEBkZXByZWNhdGVkIHVzZSBGaWxlI2VhY2hMaW5lIGluc3RlYWQgcGxlYXNlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBJdGVyYXRvciBpdGVyYXRvcihGaWxlIHNlbGYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBEZXByZWNhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiSXRlcmF0b3JzIG9uIGZpbGVzIGFyZSBub3Qgc3VwcG9ydGVkIGFueSBtb3JlLiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJVc2UgRmlsZS5lYWNoTGluZSgpIGluc3RlYWQuIEFsdGVybmF0aXZlbHkgeW91IGNhbiB1c2UgRmlsZVJlYWRlci5pdGVyYXRvcigpICIgKworICAgICAgICAgICAgICAgICAgICAgICAgImFuZCBwcm92aWRlIHlvdXIgb3duIGV4Y2VwdGlvbiBoYW5kbGluZy4iCisgICAgICAgICk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQW4gaWRlbnRpdHkgZnVuY3Rpb24gZm9yIGl0ZXJhdG9ycywgc3VwcG9ydGluZyAnZHVjay10eXBpbmcnIHdoZW4gdHJ5aW5nIHRvIGdldCBhbgorICAgICAqIGl0ZXJhdG9yIGZvciBlYWNoIG9iamVjdCB3aXRoaW4gYSBjb2xsZWN0aW9uLCBzb21lIG9mIHdoaWNoIG1heSBhbHJlYWR5IGJlIGl0ZXJhdG9ycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZWxmIGFuIGl0ZXJhdG9yIG9iamVjdAorICAgICAqIEByZXR1cm4gaXRzZWxmCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBJdGVyYXRvciBpdGVyYXRvcihJdGVyYXRvciBzZWxmKSB7CisgICAgICAgIHJldHVybiBzZWxmOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvRGVmYXVsdEdyb292eVN0YXRpY01ldGhvZHMuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvRGVmYXVsdEdyb292eVN0YXRpY01ldGhvZHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzAxN2EzCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9EZWZhdWx0R3Jvb3Z5U3RhdGljTWV0aG9kcy5qYXZhCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lOworCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuQ2xvc3VyZTsKKworaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLnR5cGVoYW5kbGluZy5EZWZhdWx0VHlwZVRyYW5zZm9ybWF0aW9uOworCisvKioKKyAqIFRoaXMgY2xhc3MgZGVmaW5lcyBhbGwgdGhlIG5ldyBzdGF0aWMgZ3Jvb3Z5IG1ldGhvZHMgd2hpY2ggYXBwZWFyIG9uIG5vcm1hbCBKREsKKyAqIGNsYXNzZXMgaW5zaWRlIHRoZSBHcm9vdnkgZW52aXJvbm1lbnQuIFN0YXRpYyBtZXRob2RzIGFyZSB1c2VkIHdpdGggdGhlCisgKiBmaXJzdCBwYXJhbWV0ZXIgYXMgdGhlIGRlc3RpbmF0aW9uIGNsYXNzLgorICoKKyAqIEBhdXRob3IgR3VpbGxhdW1lIExhZm9yZ2UKKyAqIEBhdXRob3IgRGllcmsgS29lbmlnCisgKiBAYXV0aG9yIEpvYWNoaW0gQmF1bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgRGVmYXVsdEdyb292eVN0YXRpY01ldGhvZHMgeworCisgICAgLyoqCisgICAgICogU3RhcnQgYSBUaHJlYWQgd2l0aCB0aGUgZ2l2ZW4gY2xvc3VyZSBhcyBhIFJ1bm5hYmxlIGluc3RhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgdGhlIHRocmVhZCBvbiB3aGljaCB0aGUgbWV0aG9kIGlzIGNhbGxlZAorICAgICAqIEBwYXJhbSBjbG9zdXJlIHRoZSBSdW5uYWJsZSBjbG9zdXJlCisgICAgICogQHJldHVybiB0aGUgc3RhcnRlZCB0aHJlYWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFRocmVhZCBzdGFydChUaHJlYWQgc2VsZiwgQ2xvc3VyZSBjbG9zdXJlKSB7CisgICAgICAgIFRocmVhZCB0aHJlYWQgPSBuZXcgVGhyZWFkKGNsb3N1cmUpOworICAgICAgICB0aHJlYWQuc3RhcnQoKTsKKyAgICAgICAgcmV0dXJuIHRocmVhZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydCBhIGRhZW1vbiBUaHJlYWQgd2l0aCB0aGUgZ2l2ZW4gY2xvc3VyZSBhcyBhIFJ1bm5hYmxlIGluc3RhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHNlbGYgdGhlIHRocmVhZCBvbiB3aGljaCB0aGUgbWV0aG9kIGlzIGNhbGxlZAorICAgICAqIEBwYXJhbSBjbG9zdXJlIHRoZSBSdW5uYWJsZSBjbG9zdXJlCisgICAgICogQHJldHVybiB0aGUgc3RhcnRlZCB0aHJlYWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFRocmVhZCBzdGFydERhZW1vbihUaHJlYWQgc2VsZiwgQ2xvc3VyZSBjbG9zdXJlKSB7CisgICAgICAgIFRocmVhZCB0aHJlYWQgPSBuZXcgVGhyZWFkKGNsb3N1cmUpOworICAgICAgICB0aHJlYWQuc2V0RGFlbW9uKHRydWUpOworICAgICAgICB0aHJlYWQuc3RhcnQoKTsKKyAgICAgICAgcmV0dXJuIHRocmVhZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGxhc3QgaGlkZGVuIG1hdGNoZXIgdGhhdCBzeXN0ZW0gdXNlZCB0byBkbyBhIG1hdGNoLgorICAgICAqIAorICAgICAqIEBwYXJhbSBtYXRjaGVyCisgICAgICogQHJldHVybiB0aGUgbGFzdCByZWdleCBtYXRjaGVyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBNYXRjaGVyIGdldExhc3RNYXRjaGVyKE1hdGNoZXIgbWF0Y2hlcikgeworICAgICAgICByZXR1cm4gUmVnZXhTdXBwb3J0LmdldExhc3RNYXRjaGVyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgdXNlZCBieSBib3RoIHNsZWVwKCkgbWV0aG9kcyB0byBpbWxlbWVudCBzbGVlcGluZworICAgICAqIGZvciB0aGUgZ2l2ZW4gdGltZSBldmVuIGlmIGludGVycnVwdGVkCisgICAgICogQHBhcmFtIG9iamVjdCByZWNlaXZlcgorICAgICAqIEBwYXJhbSBtaWxsaXMgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gc2xlZXAKKyAgICAgKiBAcGFyYW0gY2xvc3VyZSBvcHRpb25hbCBjbG9zdXJlIGNhbGxlZCB3aGVuIGludGVycnVwdGVkCisgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGNsb3N1cmUgcmV0dXJucyB0cnVlIHRoZSBzbGVlcCBjb250aW51ZXMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgc2xlZXBJbXBsKE9iamVjdCBvYmplY3QsIGxvbmcgbWlsbGlzLCBDbG9zdXJlIGNsb3N1cmUpIHsKKyAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBsb25nIHJlc3QgPSBtaWxsaXM7CisgICAgICAgIGxvbmcgY3VycmVudDsKKyAgICAgICAgd2hpbGUgKHJlc3QgPiAwKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChyZXN0KTsKKyAgICAgICAgICAgICAgICByZXN0ID0gMDsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xvc3VyZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChEZWZhdWx0VHlwZVRyYW5zZm9ybWF0aW9uLmNhc3RUb0Jvb2xlYW4oY2xvc3VyZS5jYWxsKGUpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsgLy8gY29tcGVuc2F0ZSBmb3IgY2xvc3VyZSdzIHRpbWUKKyAgICAgICAgICAgICAgICByZXN0ID0gbWlsbGlzICsgc3RhcnQgLSBjdXJyZW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2xlZXAgZm9yIHNvIG1hbnkgbWlsbGlzZWNvbmRzLCBldmVuIGlmIGludGVycnVwdGVkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBvYmplY3QgcmVjZWl2ZXIKKyAgICAgKiBAcGFyYW0gbWlsbGlzZWNvbmRzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHNsZWVwCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNsZWVwKE9iamVjdCBvYmplY3QsIGxvbmcgbWlsbGlzZWNvbmRzKSB7CisJc2xlZXBJbXBsKG9iamVjdCwgbWlsbGlzZWNvbmRzLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTbGVlcCBmb3Igc28gbWFueSBtaWxsaXNlY29uZHMKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb2JqZWN0IHJlY2VpdmVyCisgICAgICogQHBhcmFtIG1pbGxpc2Vjb25kcyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBzbGVlcAorICAgICAqIEBwYXJhbSBvbkludGVycnVwdCBpbnRlcnJ1cHQgaGFuZGxlciwgSW50ZXJydXB0ZWRFeGNlcHRpb24gaXMgcGFzc2VkIHRvIHRoZSBDbG9zdXJlCisgICAgICogICAgICAgICAgICAgICAgICAgIGlmIGl0IHJldHVybnMgdHJ1ZSwgdGhlIHNsZWVwIGNvbnRpbnVlcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzbGVlcChPYmplY3Qgb2JqZWN0LCBsb25nIG1pbGxpc2Vjb25kcywgQ2xvc3VyZSBvbkludGVycnVwdCl7CisJc2xlZXBJbXBsKG9iamVjdCwgbWlsbGlzZWNvbmRzLCBvbkludGVycnVwdCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9EZWZhdWx0TWV0aG9kS2V5LmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL0RlZmF1bHRNZXRob2RLZXkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzBlMzZlCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9EZWZhdWx0TWV0aG9kS2V5LmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZTsKKworLyoqCisgKiBBIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgTWV0aG9kS2V5CisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIERlZmF1bHRNZXRob2RLZXkgZXh0ZW5kcyBNZXRob2RLZXl7CisKKyAgICBwcml2YXRlIGZpbmFsIENsYXNzW10gcGFyYW1ldGVyVHlwZXM7CisKKyAgICBwdWJsaWMgRGVmYXVsdE1ldGhvZEtleShDbGFzcyBzZW5kZXIsIFN0cmluZyBuYW1lLCBDbGFzc1tdIHBhcmFtZXRlclR5cGVzLCBib29sZWFuIGlzQ2FsbFRvU3VwZXIpIHsKKyAgICAgICAgc3VwZXIoc2VuZGVyLCBuYW1lLGlzQ2FsbFRvU3VwZXIpOworICAgICAgICB0aGlzLnBhcmFtZXRlclR5cGVzID0gcGFyYW1ldGVyVHlwZXM7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRQYXJhbWV0ZXJDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIHBhcmFtZXRlclR5cGVzLmxlbmd0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3MgZ2V0UGFyYW1ldGVyVHlwZShpbnQgaW5kZXgpIHsKKyAgICAgICAgQ2xhc3MgYyA9IHBhcmFtZXRlclR5cGVzW2luZGV4XTsKKyAgICAgICAgaWYgKGM9PW51bGwpIHJldHVybiBPYmplY3QuY2xhc3M7CisgICAgICAgIHJldHVybiBjOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL0ZsdXNoaW5nU3RyZWFtV3JpdGVyLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL0ZsdXNoaW5nU3RyZWFtV3JpdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAxYTIzNAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvRmx1c2hpbmdTdHJlYW1Xcml0ZXIuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lOworCitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBTdHJlYW0gd3JpdGVyIHdoaWNoIGZsdXNoZXMgYWZ0ZXIgZWFjaCB3cml0ZSBvcGVyYXRpb24uCisgKgorICogQGF1dGhvciBHdWlsbGF1bWUgTGFmb3JnZQorICovCitwdWJsaWMgY2xhc3MgRmx1c2hpbmdTdHJlYW1Xcml0ZXIgZXh0ZW5kcyBPdXRwdXRTdHJlYW1Xcml0ZXIgeworCisgICAgcHVibGljIEZsdXNoaW5nU3RyZWFtV3JpdGVyKE91dHB1dFN0cmVhbSBvdXQpIHsKKyAgICAgICAgc3VwZXIob3V0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShjaGFyW10gY2J1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIud3JpdGUoY2J1Ziwgb2ZmLCBsZW4pOworICAgICAgICBmbHVzaCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBjKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBzdXBlci53cml0ZShjKTsKKyAgICAgICAgZmx1c2goKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShTdHJpbmcgc3RyLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBzdXBlci53cml0ZShzdHIsIG9mZiwgbGVuKTsKKyAgICAgICAgZmx1c2goKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL0dTdHJpbmdJbXBsLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL0dTdHJpbmdJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E3YTBmYwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvR1N0cmluZ0ltcGwuamF2YQpAQCAtMCwwICsxLDY0IEBACisvKg0KKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLg0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lOw0KKw0KK2ltcG9ydCBncm9vdnkubGFuZy5HU3RyaW5nOw0KKw0KKy8qKg0KKyAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgYSBHU3RyaW5nIHVzZWQgYnkgdGhlIGNvbXBpbGVyLiBBIEdTdHJpbmcNCisgKiBjb25zaXN0IG9mIGEgbGlzdCBvZiB2YWx1ZXMgYW5kIHN0cmluZ3Mgd2hpY2ggY2FuIGJlIGNvbWJpbmVkIHRvIA0KKyAqIGNyZWF0ZSBhIG5ldyBTdHJpbmcuDQorICogDQorICogQHNlZSBncm9vdnkubGFuZy5HU3RyaW5nDQorICogIA0KKyAqIEBhdXRob3IgSm9jaGVuIFRoZW9kb3JvdQ0KKyAqLw0KK3B1YmxpYyBjbGFzcyBHU3RyaW5nSW1wbCBleHRlbmRzIEdTdHJpbmcgew0KKyAgcHJpdmF0ZSBTdHJpbmdbXSBzdHJpbmdzOw0KKwkNCisgICAvKioNCisgICAgKiBDcmVhdGUgYSBuZXcgR1N0cmluZyB3aXRoIHZhbHVlcyBhbmQgc3RyaW5ncy4NCisgICAgKiA8cD4NCisgICAgKiBFYWNoIHZhbHVlIGlzIHByZWZpeGVkIGJ5IGEgc3RyaW5nLCBhZnRlciB0aGUgbGFzdCB2YWx1ZSANCisgICAgKiBhbiBhZGRpdGlvbmFsIFN0cmluZyBtaWdodCBiZSB1c2VkLiBUaGlzIG1lYW5zIA0KKyAgICAqIDxjb2RlPnN0cmluZ3MubGVuZ3RoPT12YWx1ZXMubGVuZ3RoICB8fCBzdHJpbmdzLmxlbmd0aD09dmFsdWVzLmxlbmd0aCsxPC9jb2RlPi4NCisgICAgKiA8L3A+PHA+DQorICAgICogPGI+Tk9URTo8L2I+IFRoZSBsZW5ndGhzIGFyZSA8Yj5ub3Q8L2I+IGNoZWNrZWQuIFVzaW5nIGRpZmZlcmVudCBsZW5ndGhzIG1pZ2h0IHJlc3VsdCANCisgICAgKiBpbiB1bnByZWRpY3RhYmxlIGJlaGF2aW91ci4NCisgICAgKiA8L3A+DQorICAgICogICANCisgICAgKiBAcGFyYW0gdmFsdWVzIHRoZSB2YWx1ZSBwYXJ0cw0KKyAgICAqIEBwYXJhbSBzdHJpbmdzIHRoZSBzdHJpbmcgcGFydHMNCisgICAgKi8NCisJcHVibGljIEdTdHJpbmdJbXBsKE9iamVjdFtdIHZhbHVlcywgU3RyaW5nW10gc3RyaW5ncykgew0KKwkJc3VwZXIodmFsdWVzKTsNCisJCXRoaXMuc3RyaW5ncyA9IHN0cmluZ3M7DQorCX0NCisJDQorCS8qKg0KKwkgKiBHZXQgdGhlIHN0cmluZ3Mgb2YgdGhpcyBHU3RyaW5nLg0KKwkgKiA8cD4NCisJICogVGhpcyBtZXRob2RzIHJldHVybnMgdGhlIHNhbWUgYXJyYXkgYXMgdXNlZCBpbiB0aGUgY29uc3RydWN0b3IuIENoYW5naW5nDQorCSAqIHRoZSB2YWx1ZXMgd2lsbCByZXN1bHQgaW4gY2hhbmdlcyBvZiB0aGUgR1N0cmluZy4gSXQgaXMgbm90IHJlY29tbWVuZGVkIA0KKwkgKiB0byBkbyBzby4NCisJICogPC9wPg0KKwkgKi8NCisJcHVibGljIFN0cmluZ1tdIGdldFN0cmluZ3MoKSB7DQorCQlyZXR1cm4gc3RyaW5nczsNCisJfQ0KKwkNCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9HZW5lcmF0ZWRDbG9zdXJlLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL0dlbmVyYXRlZENsb3N1cmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjI2M2FhCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9HZW5lcmF0ZWRDbG9zdXJlLmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyoNCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4NCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZTsNCisNCisvKioNCisgKiBNYXJrZXIgaW50ZXJmYWNlIHRvIGlkZW50aWZ5IGNsb3N1cmVzIGdlbmVyYXRlZCBieSB0aGUgZ3Jvb3Z5IGNvbXBpbGVyLg0KKyAqIEZvciBpbnRlcm5hbCB1c2Ugb25seSENCisgKiANCisgKiBAYXV0aG9yIEpvY2hlbiBUaGVvZG9yb3UNCisgKiBAc2luY2UgMS4xDQorICogQHNlZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUubWV0YWNsYXNzLkNsb3N1cmVNZXRhQ2xhc3MNCisgKi8NCitwdWJsaWMgaW50ZXJmYWNlIEdlbmVyYXRlZENsb3N1cmUge30NCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL0dyb292eUNhdGVnb3J5U3VwcG9ydC5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9Hcm9vdnlDYXRlZ29yeVN1cHBvcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzVhZjlhCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9Hcm9vdnlDYXRlZ29yeVN1cHBvcnQuamF2YQpAQCAtMCwwICsxLDI2OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZTsKKworaW1wb3J0IGdyb292eS5sYW5nLkNsb3N1cmU7CitpbXBvcnQgZ3Jvb3Z5LmxhbmcuTWV0YU1ldGhvZDsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJlZmxlY3Rpb24uQ2FjaGVkQ2xhc3M7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5yZWZsZWN0aW9uLkNhY2hlZE1ldGhvZDsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUubWV0YWNsYXNzLk5ld0luc3RhbmNlTWV0YU1ldGhvZDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworLyoqCisgKiBAYXV0aG9yIHNhbQorICogQGF1dGhvciBQYXVsIEtpbmcKKyAqLworcHVibGljIGNsYXNzIEdyb292eUNhdGVnb3J5U3VwcG9ydCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgY2F0ZWdvcmllc0luVXNlID0gMDsKKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gcHVsbCBhbGwgdGhlIG5ldyBtZXRob2RzIG91dCBvZiB0aGUgbG9jYWwgdGhyZWFkIGNvbnRleHQgd2l0aCBhIHBhcnRpY3VsYXIgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjYXRlZ29yaXplZENsYXNzIGEgY2xhc3Mgc3ViamVjdCB0byB0aGUgY2F0ZWdvcnkgbWV0aG9kcyBpbiB0aGUgdGhyZWFkIGNvbnRleHQKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbWV0aG9kIG5hbWUgb2YgaW50ZXJlc3QKKyAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIG1ldGhvZHMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0Q2F0ZWdvcnlNZXRob2RzKENsYXNzIGNhdGVnb3JpemVkQ2xhc3MsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIE1hcCBwcm9wZXJ0aWVzID0gZ2V0UHJvcGVydGllcygpOworICAgICAgICBMaXN0IG1ldGhvZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHByb3BlcnRpZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgeworICAgICAgICAgICAgQ2xhc3MgY3VycmVudCA9IChDbGFzcykgaS5uZXh0KCk7CisgICAgICAgICAgICBpZiAoY3VycmVudC5pc0Fzc2lnbmFibGVGcm9tKGNhdGVnb3JpemVkQ2xhc3MpKSB7CisgICAgICAgICAgICAgICAgTWFwIG1ldGFNZXRob2RzTWFwID0gKE1hcCkgcHJvcGVydGllcy5nZXQoY3VycmVudCk7CisgICAgICAgICAgICAgICAgTGlzdCBuZXdNZXRob2RMaXN0ID0gKExpc3QpIG1ldGFNZXRob2RzTWFwLmdldChuYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAobmV3TWV0aG9kTGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1ldGhvZExpc3QuYWRkQWxsKG5ld01ldGhvZExpc3QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobWV0aG9kTGlzdC5pc0VtcHR5KCkpIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gbWV0aG9kTGlzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIHB1bGwgYWxsIHRoZSBuZXcgbWV0aG9kcyBvdXQgb2YgdGhlIGxvY2FsIHRocmVhZCBjb250ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIGNhdGVnb3JpemVkQ2xhc3MgYSBjbGFzcyBzdWJqZWN0IHRvIHRoZSBjYXRlZ29yeSBtZXRob2RzIGluIHRoZSB0aHJlYWQgY29udGV4dAorICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgbWV0aG9kcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRDYXRlZ29yeU1ldGhvZHMoQ2xhc3MgY2F0ZWdvcml6ZWRDbGFzcykgeworICAgICAgICBNYXAgcHJvcGVydGllcyA9IGdldFByb3BlcnRpZXMoKTsKKyAgICAgICAgTGlzdCBtZXRob2RMaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBwcm9wZXJ0aWVzLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKKyAgICAgICAgICAgIENsYXNzIGN1cnJlbnQgPSAoQ2xhc3MpIGkubmV4dCgpOworICAgICAgICAgICAgaWYgKGN1cnJlbnQuaXNBc3NpZ25hYmxlRnJvbShjYXRlZ29yaXplZENsYXNzKSkgeworICAgICAgICAgICAgICAgIE1hcCBtZXRhTWV0aG9kc01hcCA9IChNYXApIHByb3BlcnRpZXMuZ2V0KGN1cnJlbnQpOworICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gY29sbGVjdGlvbiA9IG1ldGFNZXRob2RzTWFwLnZhbHVlcygpOworICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICAgICAgTGlzdCBuZXdNZXRob2RMaXN0ID0gKExpc3QpIGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld01ldGhvZExpc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kTGlzdC5hZGRBbGwobmV3TWV0aG9kTGlzdCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1ldGhvZExpc3QuaXNFbXB0eSgpKSByZXR1cm4gbnVsbDsKKyAgICAgICAgcmV0dXJuIG1ldGhvZExpc3Q7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0Q2xvc2VzdE1hdGNoaW5nQ2F0ZWdvcnlNZXRob2QoQ2xhc3Mgc2VuZGVyLCBNZXRhTWV0aG9kIG9yaWcsIE1ldGFNZXRob2QgZWxlbWVudCkgeworICAgICAgICAvLyBmb3Igbm93IGp1c3QgY29tcGFyZSBNZXRhTWV0aG9kcworICAgICAgICBpZiAob3JpZyBpbnN0YW5jZW9mIENhdGVnb3J5TWV0aG9kICYmIGVsZW1lbnQgaW5zdGFuY2VvZiBDYXRlZ29yeU1ldGhvZCkgeworICAgICAgICAgICAgQ2F0ZWdvcnlNZXRob2QgbyA9IChDYXRlZ29yeU1ldGhvZCkgb3JpZzsKKyAgICAgICAgICAgIENhdGVnb3J5TWV0aG9kIGUgPSAoQ2F0ZWdvcnlNZXRob2QpIGVsZW1lbnQ7CisgICAgICAgICAgICBpZiAoby5jb21wYXJlVG8oZSkgPCAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG9yaWc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENhdGVnb3J5TWV0aG9kIGV4dGVuZHMgTmV3SW5zdGFuY2VNZXRhTWV0aG9kIGltcGxlbWVudHMgQ29tcGFyYWJsZSB7CisgICAgICAgIHByaXZhdGUgZmluYWwgQ2xhc3MgbWV0YUNsYXNzOworCisgICAgICAgIHB1YmxpYyBDYXRlZ29yeU1ldGhvZChDYWNoZWRNZXRob2QgbWV0YU1ldGhvZCwgQ2xhc3MgbWV0YUNsYXNzKSB7CisgICAgICAgICAgICBzdXBlcihtZXRhTWV0aG9kKTsKKyAgICAgICAgICAgIHRoaXMubWV0YUNsYXNzID0gbWV0YUNsYXNzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDYWNoZWFibGUoKSB7IHJldHVybiBmYWxzZTsgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTb3J0IGJ5IG1vc3Qgc3BlY2lmaWMgdG8gbGVhc3Qgc3BlY2lmaWMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBvIHRoZSBvYmplY3QgdG8gY29tcGFyZSBhZ2FpbnN0CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3QgbykgeworICAgICAgICAgICAgQ2F0ZWdvcnlNZXRob2QgdGhhdE1ldGhvZCA9IChDYXRlZ29yeU1ldGhvZCkgbzsKKyAgICAgICAgICAgIENsYXNzIHRoaXNDbGFzcyA9IG1ldGFDbGFzczsKKyAgICAgICAgICAgIENsYXNzIHRoYXRDbGFzcyA9IHRoYXRNZXRob2QubWV0YUNsYXNzOworICAgICAgICAgICAgaWYgKHRoaXNDbGFzcyA9PSB0aGF0Q2xhc3MpIHJldHVybiAwOworICAgICAgICAgICAgQ2xhc3MgbG9vcCA9IHRoaXNDbGFzczsKKyAgICAgICAgICAgIHdoaWxlKGxvb3AgIT0gbnVsbCAmJiBsb29wICE9IE9iamVjdC5jbGFzcykgeworICAgICAgICAgICAgICAgIGxvb3AgPSB0aGlzQ2xhc3MuZ2V0U3VwZXJjbGFzcygpOworICAgICAgICAgICAgICAgIGlmIChsb29wID09IHRoYXRDbGFzcykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9vcCA9IHRoYXRDbGFzczsKKyAgICAgICAgICAgIHdoaWxlIChsb29wICE9IG51bGwgJiYgbG9vcCAhPSBPYmplY3QuY2xhc3MpIHsKKyAgICAgICAgICAgICAgICBsb29wID0gdGhhdENsYXNzLmdldFN1cGVyY2xhc3MoKTsKKyAgICAgICAgICAgICAgICBpZiAobG9vcCA9PSB0aGlzQ2xhc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBzY29wZSBiYXNlZCBvbiBnaXZlbiBjYXRlZ29yeUNsYXNzIGFuZCBpbnZva2UgY2xvc3VyZSB3aXRoaW4gdGhhdCBzY29wZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjYXRlZ29yeUNsYXNzIHRoZSBjbGFzcyBjb250YWluaW5nIGNhdGVnb3J5IG1ldGhvZHMKKwkgKiBAcGFyYW0gY2xvc3VyZSB0aGUgY2xvc3VyZSBkdXJpbmcgd2hpY2ggdG8gbWFrZSB0aGUgY2F0ZWdvcnkgY2xhc3MgbWV0aG9kcyBhdmFpbGFibGUKKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIHRoZSBjbG9zdXJlCisJICovCisJcHVibGljIHN0YXRpYyBPYmplY3QgdXNlKENsYXNzIGNhdGVnb3J5Q2xhc3MsIENsb3N1cmUgY2xvc3VyZSkgeworCQluZXdTY29wZSgpOworCQl0cnkgeworCQkJdXNlKGNhdGVnb3J5Q2xhc3MpOworCQkJcmV0dXJuIGNsb3N1cmUuY2FsbCgpOworCQl9IGZpbmFsbHkgeworCQkJZW5kU2NvcGUoKTsKKwkJfQorCX0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHNjb3BlIGJhc2VkIG9uIGdpdmVuIGNhdGVnb3J5Q2xhc3NlcyBhbmQgaW52b2tlIGNsb3N1cmUgd2l0aGluIHRoYXQgc2NvcGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2F0ZWdvcnlDbGFzc2VzIHRoZSBsaXN0IG9mIGNsYXNzZXMgY29udGFpbmluZyBjYXRlZ29yeSBtZXRob2RzCisgICAgICogQHBhcmFtIGNsb3N1cmUgdGhlIGNsb3N1cmUgZHVyaW5nIHdoaWNoIHRvIG1ha2UgdGhlIGNhdGVnb3J5IGNsYXNzIG1ldGhvZHMgYXZhaWxhYmxlCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgcmV0dXJuZWQgZnJvbSB0aGUgY2xvc3VyZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHVzZShMaXN0IGNhdGVnb3J5Q2xhc3NlcywgQ2xvc3VyZSBjbG9zdXJlKSB7CisgICAgICAgIG5ld1Njb3BlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjYXRlZ29yeUNsYXNzZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgeworICAgICAgICAgICAgICAgIENsYXNzIGNsYXp6ID0gKENsYXNzKSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICB1c2UoY2xhenopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGNsb3N1cmUuY2FsbCgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZW5kU2NvcGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERlbGVnYXRlZCB0byBmcm9tIHRoZSBnbG9iYWwgdXNlKENhdGVnb3J5Q2xhc3MpIG1ldGhvZC4gIEl0IHNjYW5zIHRoZSBDYXRlZ29yeSBjbGFzcyBmb3Igc3RhdGljIG1ldGhvZHMKKyAgICAgKiB0aGF0IHRha2UgMSBvciBtb3JlIHBhcmFtZXRlcnMuICBUaGUgZmlyc3QgcGFyYW1ldGVyIGlzIHRoZSBjbGFzcyB5b3UgYXJlIGFkZGluZyB0aGUgY2F0ZWdvcnkgbWV0aG9kIHRvLAorICAgICAqIGFkZGl0aW9uYWwgcGFyYW1ldGVycyBhcmUgdGhvc2UgcGFyYW1ldGVycyBuZWVkZWQgYnkgdGhhdCBtZXRob2QuICBBIHVzZSBzdGF0ZW1lbnQgY2Fubm90IGJlIHVuZG9uZSBhbmQKKyAgICAgKiBpcyB2YWxpZCBvbmx5IGZvciB0aGUgY3VycmVudCB0aHJlYWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2F0ZWdvcnlDbGFzcyB0aGUgY2xhc3MgY29udGFpbmluZyBjYXRlZ29yeSBtZXRob2RzCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB1c2UoQ2xhc3MgY2F0ZWdvcnlDbGFzcykgeworICAgICAgICBNYXAgcHJvcGVydGllcyA9IGdldFByb3BlcnRpZXMoKTsKKyAgICAgICAgTGlzdCBzdGFjayA9IChMaXN0KSBMT0NBTC5nZXQoKTsKKyAgICAgICAgTGlua2VkTGlzdCBjbG9uZWRMaXN0cyA9IG5ldyBMaW5rZWRMaXN0KCk7CisgICAgICAgIAorICAgICAgICBNZXRob2RbXSBtZXRob2RzID0gY2F0ZWdvcnlDbGFzcy5nZXRNZXRob2RzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9IG1ldGhvZHNbaV07CisgICAgICAgICAgICBpZiAoTW9kaWZpZXIuaXNTdGF0aWMobWV0aG9kLmdldE1vZGlmaWVycygpKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIENhY2hlZE1ldGhvZCBjYWNoZWRNZXRob2QgPSBDYWNoZWRNZXRob2QuZmluZChtZXRob2QpOworICAgICAgICAgICAgICAgIENhY2hlZENsYXNzW10gcGFyYW1UeXBlcyA9IGNhY2hlZE1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOworICAgICAgICAgICAgICAgIGlmIChwYXJhbVR5cGVzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQ2FjaGVkQ2xhc3MgbWV0YUNsYXNzID0gcGFyYW1UeXBlc1swXTsKKyAgICAgICAgICAgICAgICAgICAgTWFwIG1ldGFNZXRob2RzTWFwID0gZ2V0TWV0YU1ldGhvZHMocHJvcGVydGllcywgbWV0YUNsYXNzLmdldENhY2hlZENsYXNzKCkpOworICAgICAgICAgICAgICAgICAgICBMaXN0IG1ldGhvZExpc3QgPSBnZXRNZXRob2RMaXN0KG1ldGFNZXRob2RzTWFwLCBtZXRob2QuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgTWV0YU1ldGhvZCBtbWV0aG9kID0gbmV3IENhdGVnb3J5TWV0aG9kKGNhY2hlZE1ldGhvZCwgbWV0YUNsYXNzLmdldENhY2hlZENsYXNzKCkpOworICAgICAgICAgICAgICAgICAgICBtZXRob2RMaXN0LmFkZChtbWV0aG9kKTsKKyAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChtZXRob2RMaXN0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUaHJlYWRMb2NhbCBMT0NBTCA9IG5ldyBUaHJlYWRMb2NhbCgpIHsKKyAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBpbml0aWFsVmFsdWUoKSB7CisgICAgICAgIAkJTGlzdCBzdGFjayA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgCQlzdGFjay5hZGQoQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKKyAgICAgICAgCQlyZXR1cm4gc3RhY2s7CisgICAgICAgIAl9CisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIG5ld1Njb3BlKCkgeworICAgICAgICBjYXRlZ29yaWVzSW5Vc2UrKzsKKyAgICAgICAgTGlzdCBzdGFjayA9IChMaXN0KSBMT0NBTC5nZXQoKTsKKyAgICAgICAgTWFwIHByb3BlcnRpZXMgPSAoTWFwKSBzdGFjay5nZXQoc3RhY2suc2l6ZSgpIC0gMSk7CisgICAgICAgIE1hcCBuZXdNYXAgPSBuZXcgV2Vha0hhc2hNYXAocHJvcGVydGllcy5zaXplKCkpOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcHJvcGVydGllcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgIG5ld01hcC5wdXQoZW50cnkuZ2V0S2V5KCksIGNvcHlNYXBPZkxpc3QoKE1hcCkgZW50cnkuZ2V0VmFsdWUoKSkpOworICAgICAgICB9ICAgICAgICAKKyAgICAgICAgc3RhY2suYWRkKG5ld01hcCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgZW5kU2NvcGUoKSB7CisgICAgICAgIExpc3Qgc3RhY2sgPSAoTGlzdCkgTE9DQUwuZ2V0KCk7CisgICAgCXN0YWNrLnJlbW92ZShzdGFjay5zaXplKCkgLSAxKTsKKyAgICAgICAgY2F0ZWdvcmllc0luVXNlLS07CisgICAgfQorICAgIAorICAgIHByaXZhdGUgc3RhdGljIE1hcCBjb3B5TWFwT2ZMaXN0KE1hcCBtKSB7CisgICAgICAgIE1hcCByZXQgPSBuZXcgSGFzaE1hcChtLnNpemUoKSk7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBtLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlcmF0b3IubmV4dCgpOworICAgICAgICAgICAgTGlzdCBsID0gKExpc3QpIGVudHJ5LmdldFZhbHVlKCk7CisgICAgICAgICAgICBsID0gbmV3IEFycmF5TGlzdChsKTsKKyAgICAgICAgICAgIHJldC5wdXQoZW50cnkuZ2V0S2V5KCksIGwpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgc3RhdGljIE1hcCBnZXRQcm9wZXJ0aWVzKCkgeworICAgICAgICBMaXN0IHN0YWNrID0gKExpc3QpIExPQ0FMLmdldCgpOworICAgICAgICByZXR1cm4gKE1hcCkgc3RhY2suZ2V0KHN0YWNrLnNpemUoKSAtIDEpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNDYXRlZ29yeUluQW55VGhyZWFkKCkgeworICAgICAgICByZXR1cm4gY2F0ZWdvcmllc0luVXNlIT0wOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIExpc3QgZ2V0TWV0aG9kTGlzdChNYXAgbWV0YU1ldGhvZHNNYXAsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIExpc3QgbWV0aG9kTGlzdCA9IChMaXN0KSBtZXRhTWV0aG9kc01hcC5nZXQobmFtZSk7CisgICAgICAgIGlmIChtZXRob2RMaXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIG1ldGhvZExpc3QgPSBuZXcgQXJyYXlMaXN0KDEpOworICAgICAgICAgICAgbWV0YU1ldGhvZHNNYXAucHV0KG5hbWUsIG1ldGhvZExpc3QpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtZXRob2RMaXN0OworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIE1hcCBnZXRNZXRhTWV0aG9kcyhNYXAgcHJvcGVydGllcywgQ2xhc3MgbWV0YUNsYXNzKSB7CisgICAgICAgIE1hcCBtZXRhTWV0aG9kc01hcCA9IChNYXApIHByb3BlcnRpZXMuZ2V0KG1ldGFDbGFzcyk7CisgICAgICAgIGlmIChtZXRhTWV0aG9kc01hcCA9PSBudWxsKSB7CisgICAgICAgICAgICBtZXRhTWV0aG9kc01hcCA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgICAgICBwcm9wZXJ0aWVzLnB1dChtZXRhQ2xhc3MsIG1ldGFNZXRob2RzTWFwKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbWV0YU1ldGhvZHNNYXA7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL0ludm9rZXIuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvSW52b2tlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZTJmMTYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL0ludm9rZXIuamF2YQpAQCAtMCwwICsxLDI2MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZTsKKworaW1wb3J0IGdyb292eS5sYW5nLio7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLndyYXBwZXJzLlBvam9XcmFwcGVyOworCisvKioKKyAqIEEgaGVscGVyIGNsYXNzIHRvIGludm9rZSBtZXRob2RzIG9yIGV4dHJhY3QgcHJvcGVydGllcyBvbiBhcmJpdHJhcnkgSmF2YSBvYmplY3RzIGR5bmFtaWNhbGx5CisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIEludm9rZXIgeworCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9BUkdVTUVOVFMgPSB7CisgICAgfTsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzW10gRU1QVFlfVFlQRVMgPSB7CisgICAgfTsKKworICAgIHB1YmxpYyBNZXRhQ2xhc3NSZWdpc3RyeSBnZXRNZXRhUmVnaXN0cnkoKSB7CisgICAgICAgIHJldHVybiBtZXRhUmVnaXN0cnk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBNZXRhQ2xhc3NSZWdpc3RyeSBtZXRhUmVnaXN0cnkgPSBHcm9vdnlTeXN0ZW0uZ2V0TWV0YUNsYXNzUmVnaXN0cnkoKTsKKworICAgIHB1YmxpYyBNZXRhQ2xhc3MgZ2V0TWV0YUNsYXNzKE9iamVjdCBvYmplY3QpIHsKKyAgICAgICAgcmV0dXJuIG1ldGFSZWdpc3RyeS5nZXRNZXRhQ2xhc3Mob2JqZWN0LmdldENsYXNzKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEludm9rZXMgdGhlIGdpdmVuIG1ldGhvZCBvbiB0aGUgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgaW52b2tlTWV0aG9kKE9iamVjdCBvYmplY3QsIFN0cmluZyBtZXRob2ROYW1lLCBPYmplY3QgYXJndW1lbnRzKSB7CisgICAgICAgIC8qCisgICAgICAgIFN5c3RlbQorICAgICAgICAgICAgLm91dAorICAgICAgICAgICAgLnByaW50bG4oCisgICAgICAgICAgICAgICAgIkludm9rZXIgLSBJbnZva2luZyBtZXRob2Qgb24gb2JqZWN0OiAiCisgICAgICAgICAgICAgICAgICAgICsgb2JqZWN0CisgICAgICAgICAgICAgICAgICAgICsgIiBtZXRob2Q6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBtZXRob2ROYW1lCisgICAgICAgICAgICAgICAgICAgICsgIiBhcmd1bWVudHM6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBJbnZva2VySGVscGVyLnRvU3RyaW5nKGFyZ3VtZW50cykpOworICAgICAgICAgICAgICAgICAgICAqLworCisgICAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkgeworICAgICAgICAgICAgb2JqZWN0ID0gTnVsbE9iamVjdC5nZXROdWxsT2JqZWN0KCk7CisgICAgICAgICAgICAvL3Rocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiQ2Fubm90IGludm9rZSBtZXRob2QgIiArIG1ldGhvZE5hbWUgKyAiKCkgb24gbnVsbCBvYmplY3QiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGlmIHRoZSBvYmplY3QgaXMgYSBDbGFzcywgY2FsbCBhIHN0YXRpYyBtZXRob2QgZnJvbSB0aGF0IGNsYXNzCisgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBDbGFzcykgeworICAgICAgICAgICAgQ2xhc3MgdGhlQ2xhc3MgPSAoQ2xhc3MpIG9iamVjdDsKKyAgICAgICAgICAgIE1ldGFDbGFzcyBtZXRhQ2xhc3MgPSBtZXRhUmVnaXN0cnkuZ2V0TWV0YUNsYXNzKHRoZUNsYXNzKTsKKyAgICAgICAgICAgIHJldHVybiBtZXRhQ2xhc3MuaW52b2tlU3RhdGljTWV0aG9kKG9iamVjdCwgbWV0aG9kTmFtZSwgYXNBcnJheShhcmd1bWVudHMpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIC8vIGl0J3MgYW4gaW5zdGFuY2UKKyAgICAgICAgeworICAgICAgICAgICAgLy8gaWYgaXQncyBub3QgYW4gb2JqZWN0IGltcGxlbWVudGluZyBHcm9vdnlPYmplY3QgKHRodXMgbm90IGJ1aWxkZXIsIG5vciBhIGNsb3N1cmUpCisgICAgICAgICAgICBpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBHcm9vdnlPYmplY3QpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGludm9rZVBvam9NZXRob2Qob2JqZWN0LCBtZXRob2ROYW1lLCBhcmd1bWVudHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gaXQncyBhbiBvYmplY3QgaW1wbGVtZW50aW5nIEdyb292eU9iamVjdAorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGludm9rZVBvZ29NZXRob2Qob2JqZWN0LCBtZXRob2ROYW1lLCBhcmd1bWVudHMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBPYmplY3QgaW52b2tlUG9qb01ldGhvZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbWV0aG9kTmFtZSwgT2JqZWN0IGFyZ3VtZW50cykgeworICAgICAgICBDbGFzcyB0aGVDbGFzcyA9IG9iamVjdC5nZXRDbGFzcygpOworICAgICAgICBNZXRhQ2xhc3MgbWV0YUNsYXNzID0gbWV0YVJlZ2lzdHJ5LmdldE1ldGFDbGFzcyh0aGVDbGFzcyk7CisgICAgICAgIHJldHVybiBtZXRhQ2xhc3MuaW52b2tlTWV0aG9kKG9iamVjdCwgbWV0aG9kTmFtZSwgYXNBcnJheShhcmd1bWVudHMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIE9iamVjdCBpbnZva2VQb2dvTWV0aG9kKE9iamVjdCBvYmplY3QsIFN0cmluZyBtZXRob2ROYW1lLCBPYmplY3QgYXJndW1lbnRzKSB7CisgICAgICAgIEdyb292eU9iamVjdCBncm9vdnkgPSAoR3Jvb3Z5T2JqZWN0KSBvYmplY3Q7CisgICAgICAgIGJvb2xlYW4gaW50ZXJjZXB0aW5nID0gZ3Jvb3Z5IGluc3RhbmNlb2YgR3Jvb3Z5SW50ZXJjZXB0YWJsZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIGlmIGl0J3MgYSBwdXJlIGludGVyY2VwdGFibGUgb2JqZWN0IChldmVuIGludGVyY2VwdGluZyB0b1N0cmluZygpLCBjbG9uZSgpLCAuLi4pCisgICAgICAgICAgICBpZiAoaW50ZXJjZXB0aW5nKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdyb292eS5pbnZva2VNZXRob2QobWV0aG9kTmFtZSwgYXNVbndyYXBwZWRBcnJheShhcmd1bWVudHMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vZWxzZSB0cnkgYSBzdGF0aWNhbGx5IHR5cGVkIG1ldGhvZCBvciBhIEdESyBtZXRob2QKKyAgICAgICAgICAgIHJldHVybiBncm9vdnkuZ2V0TWV0YUNsYXNzKCkuaW52b2tlTWV0aG9kKG9iamVjdCwgbWV0aG9kTmFtZSwgYXNBcnJheShhcmd1bWVudHMpKTsKKyAgICAgICAgfSBjYXRjaCAoTWlzc2luZ01ldGhvZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBpZiAoIWludGVyY2VwdGluZyAmJiBlLmdldE1ldGhvZCgpLmVxdWFscyhtZXRob2ROYW1lKSAmJiBvYmplY3QuZ2V0Q2xhc3MoKSA9PSBlLmdldFR5cGUoKSkgeworICAgICAgICAgICAgICAgIC8vIGluIGNhc2UgdGhlcmUncyBub3RoaW5nIGVsc2UsIGludm9rZSB0aGUgb2JqZWN0J3Mgb3duIGludm9rZU1ldGhvZCgpCisgICAgICAgICAgICAgICAgcmV0dXJuIGdyb292eS5pbnZva2VNZXRob2QobWV0aG9kTmFtZSwgYXNVbndyYXBwZWRBcnJheShhcmd1bWVudHMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGludm9rZVN1cGVyTWV0aG9kKE9iamVjdCBvYmplY3QsIFN0cmluZyBtZXRob2ROYW1lLCBPYmplY3QgYXJndW1lbnRzKSB7CisgICAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJDYW5ub3QgaW52b2tlIG1ldGhvZCAiICsgbWV0aG9kTmFtZSArICIoKSBvbiBudWxsIG9iamVjdCIpOworICAgICAgICB9CisKKyAgICAgICAgQ2xhc3MgdGhlQ2xhc3MgPSBvYmplY3QuZ2V0Q2xhc3MoKTsKKworICAgICAgICBNZXRhQ2xhc3MgbWV0YUNsYXNzID0gbWV0YVJlZ2lzdHJ5LmdldE1ldGFDbGFzcyh0aGVDbGFzcy5nZXRTdXBlcmNsYXNzKCkpOworICAgICAgICByZXR1cm4gbWV0YUNsYXNzLmludm9rZU1ldGhvZChvYmplY3QsIG1ldGhvZE5hbWUsIGFzQXJyYXkoYXJndW1lbnRzKSk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBpbnZva2VTdGF0aWNNZXRob2QoQ2xhc3MgdHlwZSwgU3RyaW5nIG1ldGhvZCwgT2JqZWN0IGFyZ3VtZW50cykgeworICAgICAgICBNZXRhQ2xhc3MgbWV0YUNsYXNzID0gbWV0YVJlZ2lzdHJ5LmdldE1ldGFDbGFzcyh0eXBlKTsKKyAgICAgICAgcmV0dXJuIG1ldGFDbGFzcy5pbnZva2VTdGF0aWNNZXRob2QodHlwZSwgbWV0aG9kLCBhc0FycmF5KGFyZ3VtZW50cykpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgaW52b2tlQ29uc3RydWN0b3JPZihDbGFzcyB0eXBlLCBPYmplY3QgYXJndW1lbnRzKSB7CisgICAgICAgIE1ldGFDbGFzcyBtZXRhQ2xhc3MgPSBtZXRhUmVnaXN0cnkuZ2V0TWV0YUNsYXNzKHR5cGUpOworICAgICAgICByZXR1cm4gbWV0YUNsYXNzLmludm9rZUNvbnN0cnVjdG9yKGFzQXJyYXkoYXJndW1lbnRzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydHMgdGhlIGdpdmVuIG9iamVjdCBpbnRvIGFuIGFycmF5OyBpZiBpdHMgYW4gYXJyYXkgdGhlbiBqdXN0CisgICAgICogY2FzdCBvdGhlcndpc2Ugd3JhcCBpdCBpbiBhbiBhcnJheQorICAgICAqLworICAgIHB1YmxpYyBPYmplY3RbXSBhc0FycmF5KE9iamVjdCBhcmd1bWVudHMpIHsKKworICAgIAlpZiAoYXJndW1lbnRzID09IG51bGwpIHsKKyAgICAJCXJldHVybiBFTVBUWV9BUkdVTUVOVFM7CisgICAgCX0KKyAgICAJaWYgKGFyZ3VtZW50cyBpbnN0YW5jZW9mIE9iamVjdFtdKSB7CisgICAgCQlyZXR1cm4gIChPYmplY3RbXSkgYXJndW1lbnRzOworICAgIAl9CisgICAgCXJldHVybiBuZXcgT2JqZWN0W117YXJndW1lbnRzfTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0W10gYXNVbndyYXBwZWRBcnJheShPYmplY3QgYXJndW1lbnRzKSB7CisKKyAgICAgICAgT2JqZWN0W10gYXJncyA9IGFzQXJyYXkoYXJndW1lbnRzKTsKKworICAgICAgICBmb3IgKGludCBpPTA7IGk8YXJncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGFyZ3NbaV0gaW5zdGFuY2VvZiBQb2pvV3JhcHBlcikgeworICAgICAgICAgICAgICAgIGFyZ3NbaV0gPSAoKFBvam9XcmFwcGVyKWFyZ3NbaV0pLnVud3JhcCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGFyZ3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9va3MgdXAgdGhlIGdpdmVuIHByb3BlcnR5IG9mIHRoZSBnaXZlbiBvYmplY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkgeworICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiQ2Fubm90IGdldCBwcm9wZXJ0eTogIiArIHByb3BlcnR5ICsgIiBvbiBudWxsIG9iamVjdCIpOworICAgICAgICB9CisgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBHcm9vdnlPYmplY3QpIHsKKyAgICAgICAgICAgIEdyb292eU9iamVjdCBwb2dvID0gKEdyb292eU9iamVjdCkgb2JqZWN0OworICAgICAgICAgICAgcmV0dXJuIHBvZ28uZ2V0UHJvcGVydHkocHJvcGVydHkpOworICAgICAgICB9CisgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBDbGFzcykgeworICAgICAgICAgICAgQ2xhc3MgYyA9IChDbGFzcykgb2JqZWN0OworICAgICAgICAgICAgcmV0dXJuIG1ldGFSZWdpc3RyeS5nZXRNZXRhQ2xhc3MoYykuZ2V0UHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1ldGFSZWdpc3RyeS5nZXRNZXRhQ2xhc3Mob2JqZWN0LmdldENsYXNzKCkpLmdldFByb3BlcnR5KG9iamVjdCwgcHJvcGVydHkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHByb3BlcnR5IG9uIHRoZSBnaXZlbiBvYmplY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHksIE9iamVjdCBuZXdWYWx1ZSkgeworICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBHcm9vdnlSdW50aW1lRXhjZXB0aW9uKCJDYW5ub3Qgc2V0IHByb3BlcnR5IG9uIG51bGwgb2JqZWN0Iik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEdyb292eU9iamVjdCkgeworICAgICAgICAgICAgR3Jvb3Z5T2JqZWN0IHBvZ28gPSAoR3Jvb3Z5T2JqZWN0KSBvYmplY3Q7CisgICAgICAgICAgICBwb2dvLnNldFByb3BlcnR5KHByb3BlcnR5LCBuZXdWYWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgQ2xhc3MpCisgICAgICAgICAgICAgICAgbWV0YVJlZ2lzdHJ5LmdldE1ldGFDbGFzcygoQ2xhc3MpIG9iamVjdCkuc2V0UHJvcGVydHkoKENsYXNzKSBvYmplY3QsIHByb3BlcnR5LCBuZXdWYWx1ZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbWV0YVJlZ2lzdHJ5LmdldE1ldGFDbGFzcyhvYmplY3QuZ2V0Q2xhc3MoKSkuc2V0UHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eSwgbmV3VmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9va3MgdXAgdGhlIGdpdmVuIGF0dHJpYnV0ZSAoZmllbGQpIG9uIHRoZSBnaXZlbiBvYmplY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgYXR0cmlidXRlKSB7CisgICAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJDYW5ub3QgZ2V0IGF0dHJpYnV0ZTogIiArIGF0dHJpYnV0ZSArICIgb24gbnVsbCBvYmplY3QiKTsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBHcm9vdnlPYmplY3QpIHsKKyAgICAgICAgICAgICBHcm9vdnlPYmplY3QgcG9nbyA9IChHcm9vdnlPYmplY3QpIG9iamVjdDsKKyAgICAgICAgICAgICByZXR1cm4gcG9nby5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKTsKKyAgICAgICAgICAgICB9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1hcCkgeworICAgICAgICAgICAgIE1hcCBtYXAgPSAoTWFwKSBvYmplY3Q7CisgICAgICAgICAgICAgcmV0dXJuIG1hcC5nZXQoYXR0cmlidXRlKTsKKyAgICAgICAgICAgICAqLworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIENsYXNzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGFSZWdpc3RyeS5nZXRNZXRhQ2xhc3MoKENsYXNzKSBvYmplY3QpLmdldEF0dHJpYnV0ZShvYmplY3QsIGF0dHJpYnV0ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEdyb292eU9iamVjdCkgeworICAgICAgICAgICAgICAgIHJldHVybiAoKEdyb292eU9iamVjdClvYmplY3QpLmdldE1ldGFDbGFzcygpLmdldEF0dHJpYnV0ZShvYmplY3QsIGF0dHJpYnV0ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBtZXRhUmVnaXN0cnkuZ2V0TWV0YUNsYXNzKG9iamVjdC5nZXRDbGFzcygpKS5nZXRBdHRyaWJ1dGUob2JqZWN0LCBhdHRyaWJ1dGUpOworICAgICAgICAgICAgfQorCX0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBnaXZlbiBhdHRyaWJ1dGUgKGZpZWxkKSBvbiB0aGUgZ2l2ZW4gb2JqZWN0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKE9iamVjdCBvYmplY3QsIFN0cmluZyBhdHRyaWJ1dGUsIE9iamVjdCBuZXdWYWx1ZSkgeworICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBHcm9vdnlSdW50aW1lRXhjZXB0aW9uKCJDYW5ub3Qgc2V0IGF0dHJpYnV0ZSBvbiBudWxsIG9iamVjdCIpOworICAgICAgICAgICAgLyoKKyAgICAgICAgfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBHcm9vdnlPYmplY3QpIHsKKyAgICAgICAgICAgIEdyb292eU9iamVjdCBwb2dvID0gKEdyb292eU9iamVjdCkgb2JqZWN0OworICAgICAgICAgICAgcG9nby5zZXRQcm9wZXJ0eShhdHRyaWJ1dGUsIG5ld1ZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBNYXApIHsKKyAgICAgICAgICAgIE1hcCBtYXAgPSAoTWFwKSBvYmplY3Q7CisgICAgICAgICAgICBtYXAucHV0KGF0dHJpYnV0ZSwgbmV3VmFsdWUpOworICAgICAgICAgICAgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBDbGFzcykgeworICAgICAgICAgICAgICAgIG1ldGFSZWdpc3RyeS5nZXRNZXRhQ2xhc3MoKENsYXNzKSBvYmplY3QpLnNldEF0dHJpYnV0ZShvYmplY3QsIGF0dHJpYnV0ZSwgbmV3VmFsdWUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBHcm9vdnlPYmplY3QpIHsKKyAgICAgICAgICAgICAgICAoKEdyb292eU9iamVjdClvYmplY3QpLmdldE1ldGFDbGFzcygpLnNldEF0dHJpYnV0ZShvYmplY3QsIGF0dHJpYnV0ZSwgbmV3VmFsdWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtZXRhUmVnaXN0cnkuZ2V0TWV0YUNsYXNzKG9iamVjdC5nZXRDbGFzcygpKS5zZXRBdHRyaWJ1dGUob2JqZWN0LCBhdHRyaWJ1dGUsIG5ld1ZhbHVlKTsKKyAgICAgICAgICAgIH0KKwl9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbWV0aG9kIHBvaW50ZXIgZm9yIHRoZSBnaXZlbiBvYmplY3QgbmFtZQorICAgICAqLworICAgIHB1YmxpYyBDbG9zdXJlIGdldE1ldGhvZFBvaW50ZXIoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1ldGhvZE5hbWUpIHsKKyAgICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkNhbm5vdCBhY2Nlc3MgbWV0aG9kIHBvaW50ZXIgZm9yICciICsgbWV0aG9kTmFtZSArICInIG9uIG51bGwgb2JqZWN0Iik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE1ldGFDbGFzc0hlbHBlci5nZXRNZXRob2RQb2ludGVyKG9iamVjdCwgbWV0aG9kTmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVtb3ZlTWV0YUNsYXNzKENsYXNzIGNsYXp6KSB7CisgICAgICAgIG1ldGFSZWdpc3RyeS5yZW1vdmVNZXRhQ2xhc3MoY2xhenopOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvSW52b2tlckhlbHBlci5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9JbnZva2VySGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU0YjRkZQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvSW52b2tlckhlbHBlci5qYXZhCkBAIC0wLDAgKzEsNjg3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lOworCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuKjsKK2ltcG9ydCBncm9vdnkueG1sLmRvbS5ET01VdGlsOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS50eXBlaGFuZGxpbmcuRGVmYXVsdFR5cGVUcmFuc2Zvcm1hdGlvbjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUudHlwZWhhbmRsaW5nLkludGVnZXJDYWNoZTsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworCitpbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0b3I7CitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCisvKioKKyAqIEEgc3RhdGljIGhlbHBlciBjbGFzcyB0byBtYWtlIGJ5dGVjb2RlIGdlbmVyYXRpb24gZWFzaWVyIGFuZCBhY3QgYXMgYSBmYWNhZGUgb3ZlciB0aGUgSW52b2tlcgorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBJbnZva2VySGVscGVyIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdFtdIEVNUFRZX0FSR1MgPSB7CisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIEVNUFRZX01BSU5fQVJHUyA9IG5ldyBPYmplY3RbXXtuZXcgU3RyaW5nWzBdfTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEludm9rZXIgU0lOR0xFVE9OID0gbmV3IEludm9rZXIoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9PQkpFQ1RfQVJSQVkgPSBuZXcgT2JqZWN0WzBdOworCisKKyAgICBwdWJsaWMgc3RhdGljIE1ldGFDbGFzcyBnZXRNZXRhQ2xhc3MoT2JqZWN0IG9iamVjdCkgeworICAgICAgICByZXR1cm4gZ2V0SW5zdGFuY2UoKS5nZXRNZXRhQ2xhc3Mob2JqZWN0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQ2xhc3MoQ2xhc3MgY2xhenopIHsKKyAgICAgICAgZ2V0SW5zdGFuY2UoKS5yZW1vdmVNZXRhQ2xhc3MoY2xhenopOworICAgICAgICBJbnRyb3NwZWN0b3IuZmx1c2hGcm9tQ2FjaGVzKGNsYXp6KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEludm9rZXIgZ2V0SW5zdGFuY2UoKSB7CisgICAgICAgIHJldHVybiBTSU5HTEVUT047CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW52b2tlTm9Bcmd1bWVudHNNZXRob2QoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1ldGhvZE5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGdldEluc3RhbmNlKCkuaW52b2tlTWV0aG9kKG9iamVjdCwgbWV0aG9kTmFtZSwgRU1QVFlfQVJHUyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW52b2tlTWV0aG9kKE9iamVjdCBvYmplY3QsIFN0cmluZyBtZXRob2ROYW1lLCBPYmplY3QgYXJndW1lbnRzKSB7CisgICAgICAgIHJldHVybiBnZXRJbnN0YW5jZSgpLmludm9rZU1ldGhvZChvYmplY3QsIG1ldGhvZE5hbWUsIGFyZ3VtZW50cyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW52b2tlU3VwZXJNZXRob2QoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1ldGhvZE5hbWUsIE9iamVjdCBhcmd1bWVudHMpIHsKKyAgICAgICAgcmV0dXJuIGdldEluc3RhbmNlKCkuaW52b2tlU3VwZXJNZXRob2Qob2JqZWN0LCBtZXRob2ROYW1lLCBhcmd1bWVudHMpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGludm9rZU1ldGhvZFNhZmUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1ldGhvZE5hbWUsIE9iamVjdCBhcmd1bWVudHMpIHsKKyAgICAgICAgaWYgKG9iamVjdCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SW5zdGFuY2UoKS5pbnZva2VNZXRob2Qob2JqZWN0LCBtZXRob2ROYW1lLCBhcmd1bWVudHMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGludm9rZVN0YXRpY01ldGhvZChDbGFzcyB0eXBlLCBTdHJpbmcgbWV0aG9kTmFtZSwgT2JqZWN0IGFyZ3VtZW50cykgeworICAgICAgICByZXR1cm4gZ2V0SW5zdGFuY2UoKS5pbnZva2VTdGF0aWNNZXRob2QodHlwZSwgbWV0aG9kTmFtZSwgYXJndW1lbnRzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBpbnZva2VTdGF0aWNNZXRob2QoU3RyaW5nIGtsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgT2JqZWN0IGFyZ3VtZW50cykgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBDbGFzcyB0eXBlID0gQ2xhc3MuZm9yTmFtZShrbGFzcyk7CisgICAgICAgIHJldHVybiBnZXRJbnN0YW5jZSgpLmludm9rZVN0YXRpY01ldGhvZCh0eXBlLCBtZXRob2ROYW1lLCBhcmd1bWVudHMpOworICAgIH0KKworCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW52b2tlU3RhdGljTm9Bcmd1bWVudHNNZXRob2QoQ2xhc3MgdHlwZSwgU3RyaW5nIG1ldGhvZE5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGdldEluc3RhbmNlKCkuaW52b2tlU3RhdGljTWV0aG9kKHR5cGUsIG1ldGhvZE5hbWUsIEVNUFRZX0FSR1MpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGludm9rZUNvbnN0cnVjdG9yT2YoQ2xhc3MgdHlwZSwgT2JqZWN0IGFyZ3VtZW50cykgeworICAgICAgICByZXR1cm4gZ2V0SW5zdGFuY2UoKS5pbnZva2VDb25zdHJ1Y3Rvck9mKHR5cGUsIGFyZ3VtZW50cyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW52b2tlQ29uc3RydWN0b3JPZihTdHJpbmcga2xhc3MsIE9iamVjdCBhcmd1bWVudHMpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgQ2xhc3MgdHlwZSA9IENsYXNzLmZvck5hbWUoa2xhc3MpOworICAgICAgICByZXR1cm4gZ2V0SW5zdGFuY2UoKS5pbnZva2VDb25zdHJ1Y3Rvck9mKHR5cGUsIGFyZ3VtZW50cyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW52b2tlTm9Bcmd1bWVudHNDb25zdHJ1Y3Rvck9mKENsYXNzIHR5cGUpIHsKKyAgICAgICAgcmV0dXJuIGdldEluc3RhbmNlKCkuaW52b2tlQ29uc3RydWN0b3JPZih0eXBlLCBFTVBUWV9BUkdTKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBpbnZva2VDbG9zdXJlKE9iamVjdCBjbG9zdXJlLCBPYmplY3QgYXJndW1lbnRzKSB7CisgICAgICAgIHJldHVybiBnZXRJbnN0YW5jZSgpLmludm9rZU1ldGhvZChjbG9zdXJlLCAiZG9DYWxsIiwgYXJndW1lbnRzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExpc3QgYXNMaXN0KE9iamVjdCB2YWx1ZSkgeworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTGlzdCkgeworICAgICAgICAgICAgcmV0dXJuIChMaXN0KSB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWUuZ2V0Q2xhc3MoKS5pc0FycmF5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KChPYmplY3RbXSkgdmFsdWUpOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEVudW1lcmF0aW9uKSB7CisgICAgICAgICAgICBMaXN0IGFuc3dlciA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IChFbnVtZXJhdGlvbikgdmFsdWU7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7CisgICAgICAgICAgICAgICAgYW5zd2VyLmFkZChlLm5leHRFbGVtZW50KCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGFuc3dlcjsKKyAgICAgICAgfQorICAgICAgICAvLyBsZXRzIGFzc3VtZSBpdHMgYSBjb2xsZWN0aW9uIG9mIDEKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QodmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKE9iamVjdCBhcmd1bWVudHMpIHsKKyAgICAgICAgaWYgKGFyZ3VtZW50cyBpbnN0YW5jZW9mIE9iamVjdFtdKQorICAgICAgICAgICAgcmV0dXJuIHRvQXJyYXlTdHJpbmcoKE9iamVjdFtdKSBhcmd1bWVudHMpOworICAgICAgICBpZiAoYXJndW1lbnRzIGluc3RhbmNlb2YgQ29sbGVjdGlvbikKKyAgICAgICAgICAgIHJldHVybiB0b0xpc3RTdHJpbmcoKENvbGxlY3Rpb24pIGFyZ3VtZW50cyk7CisgICAgICAgIGlmIChhcmd1bWVudHMgaW5zdGFuY2VvZiBNYXApCisgICAgICAgICAgICByZXR1cm4gdG9NYXBTdHJpbmcoKE1hcCkgYXJndW1lbnRzKTsKKyAgICAgICAgaWYgKGFyZ3VtZW50cyBpbnN0YW5jZW9mIENvbGxlY3Rpb24pCisgICAgICAgICAgICByZXR1cm4gZm9ybWF0KGFyZ3VtZW50cywgdHJ1ZSk7CisgICAgICAgIHJldHVybiBmb3JtYXQoYXJndW1lbnRzLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgaW5zcGVjdChPYmplY3Qgc2VsZikgeworICAgICAgICByZXR1cm4gZm9ybWF0KHNlbGYsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEF0dHJpYnV0ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgYXR0cmlidXRlKSB7CisgICAgICAgIHJldHVybiBnZXRJbnN0YW5jZSgpLmdldEF0dHJpYnV0ZShvYmplY3QsIGF0dHJpYnV0ZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEF0dHJpYnV0ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgYXR0cmlidXRlLCBPYmplY3QgbmV3VmFsdWUpIHsKKyAgICAgICAgZ2V0SW5zdGFuY2UoKS5zZXRBdHRyaWJ1dGUob2JqZWN0LCBhdHRyaWJ1dGUsIG5ld1ZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRQcm9wZXJ0eShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpIHsKKyAgICAgICAgcmV0dXJuIGdldEluc3RhbmNlKCkuZ2V0UHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0UHJvcGVydHlTYWZlKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkgeworICAgICAgICBpZiAob2JqZWN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRJbnN0YW5jZSgpLmdldFByb3BlcnR5KG9iamVjdCwgcHJvcGVydHkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQcm9wZXJ0eShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHksIE9iamVjdCBuZXdWYWx1ZSkgeworICAgICAgICBnZXRJbnN0YW5jZSgpLnNldFByb3BlcnR5KG9iamVjdCwgcHJvcGVydHksIG5ld1ZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIHNvIHdlIGRvbid0IGhhdmUgdG8gcmVvcmRlciB0aGUgc3RhY2sgd2hlbiB3ZSBjYWxsIHRoaXMgbWV0aG9kLgorICAgICAqIEF0IHNvbWUgcG9pbnQgYSBiZXR0ZXIgbmFtZSBtaWdodCBiZSBpbiBvcmRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0UHJvcGVydHkyKE9iamVjdCBuZXdWYWx1ZSwgT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7CisgICAgICAgIGdldEluc3RhbmNlKCkuc2V0UHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eSwgbmV3VmFsdWUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGhpcyBpcyBzbyB3ZSBkb24ndCBoYXZlIHRvIHJlb3JkZXIgdGhlIHN0YWNrIHdoZW4gd2UgY2FsbCB0aGlzIG1ldGhvZC4KKyAgICAgKiBBdCBzb21lIHBvaW50IGEgYmV0dGVyIG5hbWUgbWlnaHQgYmUgaW4gb3JkZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEdyb292eU9iamVjdFByb3BlcnR5KE9iamVjdCBuZXdWYWx1ZSwgR3Jvb3Z5T2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7CisgICAgICAgIG9iamVjdC5zZXRQcm9wZXJ0eShwcm9wZXJ0eSwgbmV3VmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEdyb292eU9iamVjdFByb3BlcnR5KEdyb292eU9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkgeworICAgICAgICByZXR1cm4gb2JqZWN0LmdldFByb3BlcnR5KHByb3BlcnR5KTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgc28gd2UgZG9uJ3QgaGF2ZSB0byByZW9yZGVyIHRoZSBzdGFjayB3aGVuIHdlIGNhbGwgdGhpcyBtZXRob2QuCisgICAgICogQXQgc29tZSBwb2ludCBhIGJldHRlciBuYW1lIG1pZ2h0IGJlIGluIG9yZGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQcm9wZXJ0eVNhZmUyKE9iamVjdCBuZXdWYWx1ZSwgT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7CisgICAgICAgIGlmIChvYmplY3QgIT0gbnVsbCkgeworICAgICAgICAgICAgc2V0UHJvcGVydHkyKG5ld1ZhbHVlLCBvYmplY3QsIHByb3BlcnR5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG1ldGhvZCBwb2ludGVyIGZvciB0aGUgZ2l2ZW4gb2JqZWN0IG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENsb3N1cmUgZ2V0TWV0aG9kUG9pbnRlcihPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbWV0aG9kTmFtZSkgeworICAgICAgICByZXR1cm4gZ2V0SW5zdGFuY2UoKS5nZXRNZXRob2RQb2ludGVyKG9iamVjdCwgbWV0aG9kTmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgdW5hcnlNaW51cyhPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgSW50ZWdlcikgeworICAgICAgICAgICAgSW50ZWdlciBudW1iZXIgPSAoSW50ZWdlcikgdmFsdWU7CisgICAgICAgICAgICByZXR1cm4gSW50ZWdlckNhY2hlLmludGVnZXJWYWx1ZSgtbnVtYmVyLmludFZhbHVlKCkpOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExvbmcpIHsKKyAgICAgICAgICAgIExvbmcgbnVtYmVyID0gKExvbmcpIHZhbHVlOworICAgICAgICAgICAgcmV0dXJuIG5ldyBMb25nKC1udW1iZXIubG9uZ1ZhbHVlKCkpOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEJpZ0ludGVnZXIpIHsKKyAgICAgICAgICAgIHJldHVybiAoKEJpZ0ludGVnZXIpIHZhbHVlKS5uZWdhdGUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBCaWdEZWNpbWFsKSB7CisgICAgICAgICAgICByZXR1cm4gKChCaWdEZWNpbWFsKSB2YWx1ZSkubmVnYXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRG91YmxlKSB7CisgICAgICAgICAgICBEb3VibGUgbnVtYmVyID0gKERvdWJsZSkgdmFsdWU7CisgICAgICAgICAgICByZXR1cm4gbmV3IERvdWJsZSgtbnVtYmVyLmRvdWJsZVZhbHVlKCkpOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZsb2F0KSB7CisgICAgICAgICAgICBGbG9hdCBudW1iZXIgPSAoRmxvYXQpIHZhbHVlOworICAgICAgICAgICAgcmV0dXJuIG5ldyBGbG9hdCgtbnVtYmVyLmZsb2F0VmFsdWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQXJyYXlMaXN0KSB7CisgICAgICAgICAgICAvLyB2YWx1ZSBpcyBhbiBsaXN0LgorICAgICAgICAgICAgTGlzdCBuZXdsaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgSXRlcmF0b3IgaXQgPSAoKEFycmF5TGlzdCkgdmFsdWUpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICBmb3IgKDsgaXQuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIG5ld2xpc3QuYWRkKHVuYXJ5TWludXMoaXQubmV4dCgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV3bGlzdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kKHZhbHVlLCAibmVnYXRpdmUiLCBFTVBUWV9PQkpFQ1RfQVJSQVkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHVuYXJ5UGx1cyhPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgSW50ZWdlciB8fAorICAgICAgICAgICAgICAgIHZhbHVlIGluc3RhbmNlb2YgTG9uZyB8fAorICAgICAgICAgICAgICAgIHZhbHVlIGluc3RhbmNlb2YgQmlnSW50ZWdlciB8fAorICAgICAgICAgICAgICAgIHZhbHVlIGluc3RhbmNlb2YgQmlnRGVjaW1hbCB8fAorICAgICAgICAgICAgICAgIHZhbHVlIGluc3RhbmNlb2YgRG91YmxlIHx8CisgICAgICAgICAgICAgICAgdmFsdWUgaW5zdGFuY2VvZiBGbG9hdCkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFycmF5TGlzdCkgeworICAgICAgICAgICAgLy8gdmFsdWUgaXMgYW4gbGlzdC4KKyAgICAgICAgICAgIExpc3QgbmV3bGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgIEl0ZXJhdG9yIGl0ID0gKChBcnJheUxpc3QpIHZhbHVlKS5pdGVyYXRvcigpOworICAgICAgICAgICAgZm9yICg7IGl0Lmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBuZXdsaXN0LmFkZCh1bmFyeVBsdXMoaXQubmV4dCgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV3bGlzdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kKHZhbHVlLCAicG9zaXRpdmUiLCBFTVBUWV9PQkpFQ1RfQVJSQVkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgdGhlIHJpZ2h0IGhhbmQgcmVnZXggd2l0aGluIHRoZSBsZWZ0IGhhbmQgc3RyaW5nIGFuZCByZXR1cm4gYSBtYXRjaGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGxlZnQgIHN0cmluZyB0byBjb21wYXJlCisgICAgICogQHBhcmFtIHJpZ2h0IHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBjb21wYXJlIHRoZSBzdHJpbmcgdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE1hdGNoZXIgZmluZFJlZ2V4KE9iamVjdCBsZWZ0LCBPYmplY3QgcmlnaHQpIHsKKyAgICAgICAgU3RyaW5nIHN0cmluZ1RvQ29tcGFyZTsKKyAgICAgICAgaWYgKGxlZnQgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKyAgICAgICAgICAgIHN0cmluZ1RvQ29tcGFyZSA9IChTdHJpbmcpIGxlZnQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdHJpbmdUb0NvbXBhcmUgPSB0b1N0cmluZyhsZWZ0KTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgcmVnZXhUb0NvbXBhcmVUbzsKKyAgICAgICAgaWYgKHJpZ2h0IGluc3RhbmNlb2YgU3RyaW5nKSB7CisgICAgICAgICAgICByZWdleFRvQ29tcGFyZVRvID0gKFN0cmluZykgcmlnaHQ7CisgICAgICAgIH0gZWxzZSBpZiAocmlnaHQgaW5zdGFuY2VvZiBQYXR0ZXJuKSB7CisgICAgICAgICAgICBQYXR0ZXJuIHBhdHRlcm4gPSAoUGF0dGVybikgcmlnaHQ7CisgICAgICAgICAgICByZXR1cm4gcGF0dGVybi5tYXRjaGVyKHN0cmluZ1RvQ29tcGFyZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZWdleFRvQ29tcGFyZVRvID0gdG9TdHJpbmcocmlnaHQpOworICAgICAgICB9CisgICAgICAgIE1hdGNoZXIgbWF0Y2hlciA9IFBhdHRlcm4uY29tcGlsZShyZWdleFRvQ29tcGFyZVRvKS5tYXRjaGVyKHN0cmluZ1RvQ29tcGFyZSk7CisgICAgICAgIHJldHVybiBtYXRjaGVyOworICAgIH0KKworCisgICAgLyoqCisgICAgICogRmluZCB0aGUgcmlnaHQgaGFuZCByZWdleCB3aXRoaW4gdGhlIGxlZnQgaGFuZCBzdHJpbmcgYW5kIHJldHVybiBhIG1hdGNoZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGVmdCAgc3RyaW5nIHRvIGNvbXBhcmUKKyAgICAgKiBAcGFyYW0gcmlnaHQgcmVndWxhciBleHByZXNzaW9uIHRvIGNvbXBhcmUgdGhlIHN0cmluZyB0bworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBtYXRjaFJlZ2V4KE9iamVjdCBsZWZ0LCBPYmplY3QgcmlnaHQpIHsKKyAgICAgICAgUGF0dGVybiBwYXR0ZXJuOworICAgICAgICBpZiAocmlnaHQgaW5zdGFuY2VvZiBQYXR0ZXJuKSB7CisgICAgICAgICAgICBwYXR0ZXJuID0gKFBhdHRlcm4pIHJpZ2h0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSh0b1N0cmluZyhyaWdodCkpOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBzdHJpbmdUb0NvbXBhcmUgPSB0b1N0cmluZyhsZWZ0KTsKKyAgICAgICAgTWF0Y2hlciBtYXRjaGVyID0gcGF0dGVybi5tYXRjaGVyKHN0cmluZ1RvQ29tcGFyZSk7CisgICAgICAgIFJlZ2V4U3VwcG9ydC5zZXRMYXN0TWF0Y2hlcihtYXRjaGVyKTsKKyAgICAgICAgcmV0dXJuIG1hdGNoZXIubWF0Y2hlcygpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgVHVwbGUgY3JlYXRlVHVwbGUoT2JqZWN0W10gYXJyYXkpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUdXBsZShhcnJheSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTcHJlYWRNYXAgc3ByZWFkTWFwKE9iamVjdCB2YWx1ZSkgeworICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBNYXApIHsKKyAgICAgICAgICAgIE9iamVjdFtdIHZhbHVlcyA9IG5ldyBPYmplY3RbKChNYXApIHZhbHVlKS5rZXlTZXQoKS5zaXplKCkgKiAyXTsKKyAgICAgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgICAgICBJdGVyYXRvciBpdCA9ICgoTWFwKSB2YWx1ZSkua2V5U2V0KCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIGZvciAoOyBpdC5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgT2JqZWN0IGtleSA9IGl0Lm5leHQoKTsKKyAgICAgICAgICAgICAgICB2YWx1ZXNbaW5kZXgrK10gPSBrZXk7CisgICAgICAgICAgICAgICAgdmFsdWVzW2luZGV4KytdID0gKChNYXApIHZhbHVlKS5nZXQoa2V5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXcgU3ByZWFkTWFwKHZhbHVlcyk7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IFNwcmVhZE1hcEV2YWx1YXRpbmdFeGNlcHRpb24oIkNhbm5vdCBzcHJlYWQgdGhlIG1hcCAiICsgdmFsdWUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiLCB2YWx1ZSAiICsgdmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBjcmVhdGVMaXN0KE9iamVjdFtdIHZhbHVlcykgeworICAgICAgICBMaXN0IGFuc3dlciA9IG5ldyBBcnJheUxpc3QodmFsdWVzLmxlbmd0aCk7CisgICAgICAgIGFuc3dlci5hZGRBbGwoQXJyYXlzLmFzTGlzdCh2YWx1ZXMpKTsKKyAgICAgICAgcmV0dXJuIGFuc3dlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE1hcCBjcmVhdGVNYXAoT2JqZWN0W10gdmFsdWVzKSB7CisgICAgICAgIE1hcCBhbnN3ZXIgPSBuZXcgTGlua2VkSGFzaE1hcCh2YWx1ZXMubGVuZ3RoIC8gMik7CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgd2hpbGUgKGkgPCB2YWx1ZXMubGVuZ3RoIC0gMSkgeworICAgICAgICAgICAgaWYgKCh2YWx1ZXNbaV0gaW5zdGFuY2VvZiBTcHJlYWRNYXApICYmICh2YWx1ZXNbaSArIDFdIGluc3RhbmNlb2YgTWFwKSkgeworICAgICAgICAgICAgICAgIE1hcCBzbWFwID0gKE1hcCkgdmFsdWVzW2kgKyAxXTsKKyAgICAgICAgICAgICAgICBJdGVyYXRvciBpdGVyID0gc21hcC5rZXlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICAgICAgICAgIGZvciAoOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGtleSA9IGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgICAgICBhbnN3ZXIucHV0KGtleSwgc21hcC5nZXQoa2V5KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYW5zd2VyLnB1dCh2YWx1ZXNbaSsrXSwgdmFsdWVzW2krK10pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBhbnN3ZXI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydEZhaWxlZChPYmplY3QgZXhwcmVzc2lvbiwgT2JqZWN0IG1lc3NhZ2UpIHsKKyAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCB8fCAiIi5lcXVhbHMobWVzc2FnZSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiRXhwcmVzc2lvbjogIiArIGV4cHJlc3Npb24pOworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihTdHJpbmcudmFsdWVPZihtZXNzYWdlKSArICIuIEV4cHJlc3Npb246ICIgKyBleHByZXNzaW9uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBydW5TY3JpcHQoQ2xhc3Mgc2NyaXB0Q2xhc3MsIFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgQmluZGluZyBjb250ZXh0ID0gbmV3IEJpbmRpbmcoYXJncyk7CisgICAgICAgIFNjcmlwdCBzY3JpcHQgPSBjcmVhdGVTY3JpcHQoc2NyaXB0Q2xhc3MsIGNvbnRleHQpOworICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kKHNjcmlwdCwgInJ1biIsIEVNUFRZX0FSR1MpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU2NyaXB0IGNyZWF0ZVNjcmlwdChDbGFzcyBzY3JpcHRDbGFzcywgQmluZGluZyBjb250ZXh0KSB7CisgICAgICAgIFNjcmlwdCBzY3JpcHQgPSBudWxsOworICAgICAgICAvLyBmb3IgZW1wdHkgc2NyaXB0cworICAgICAgICBpZiAoc2NyaXB0Q2xhc3MgPT0gbnVsbCkgeworICAgICAgICAgICAgc2NyaXB0ID0gbmV3IFNjcmlwdCgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZmluYWwgR3Jvb3Z5T2JqZWN0IG9iamVjdCA9IChHcm9vdnlPYmplY3QpIHNjcmlwdENsYXNzCisgICAgICAgICAgICAgICAgICAgICAgICAubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgU2NyaXB0KSB7CisgICAgICAgICAgICAgICAgICAgIHNjcmlwdCA9IChTY3JpcHQpIG9iamVjdDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBpdCBjb3VsZCBqdXN0IGJlIGEgY2xhc3MsIHNvIGxldHMgd3JhcCBpdCBpbiBhIFNjcmlwdAorICAgICAgICAgICAgICAgICAgICAvLyB3cmFwcGVyCisgICAgICAgICAgICAgICAgICAgIC8vIHRob3VnaCB0aGUgYmluZGluZ3Mgd2lsbCBiZSBpZ25vcmVkCisgICAgICAgICAgICAgICAgICAgIHNjcmlwdCA9IG5ldyBTY3JpcHQoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QuaW52b2tlTWV0aG9kKCJtYWluIiwgRU1QVFlfTUFJTl9BUkdTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgc2V0UHJvcGVydGllcyhvYmplY3QsIGNvbnRleHQuZ2V0VmFyaWFibGVzKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEdyb292eVJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGNyZWF0ZSBTY3JpcHQgaW5zdGFuY2UgZm9yIGNsYXNzOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2NyaXB0Q2xhc3MgKyAiLiBSZWFzb246ICIgKyBlLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzY3JpcHQuc2V0QmluZGluZyhjb250ZXh0KTsKKyAgICAgICAgcmV0dXJuIHNjcmlwdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBwcm9wZXJ0aWVzIG9uIHRoZSBnaXZlbiBvYmplY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0UHJvcGVydGllcyhPYmplY3Qgb2JqZWN0LCBNYXAgbWFwKSB7CisgICAgICAgIE1ldGFDbGFzcyBtYyA9IGdldEluc3RhbmNlKCkuZ2V0TWV0YUNsYXNzKG9iamVjdCk7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IG1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7CisgICAgICAgICAgICBTdHJpbmcga2V5ID0gZW50cnkuZ2V0S2V5KCkudG9TdHJpbmcoKTsKKworICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbWMuc2V0UHJvcGVydHkob2JqZWN0LCBrZXksIHZhbHVlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE1pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbiBtcGUpIHsKKyAgICAgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFZlcnNpb24oKSB7CisgICAgICAgIFN0cmluZyB2ZXJzaW9uID0gbnVsbDsKKyAgICAgICAgUGFja2FnZSBwID0gUGFja2FnZS5nZXRQYWNrYWdlKCJncm9vdnkubGFuZyIpOworICAgICAgICBpZiAocCAhPSBudWxsKSB7CisgICAgICAgICAgICB2ZXJzaW9uID0gcC5nZXRJbXBsZW1lbnRhdGlvblZlcnNpb24oKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmVyc2lvbiA9PSBudWxsKSB7CisgICAgICAgICAgICB2ZXJzaW9uID0gIiI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHZlcnNpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIHRoZSBnaXZlbiBvYmplY3QgdG8gdGhlIGdpdmVuIHN0cmVhbQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZShXcml0ZXIgb3V0LCBPYmplY3Qgb2JqZWN0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nKSB7CisgICAgICAgICAgICBvdXQud3JpdGUoKFN0cmluZykgb2JqZWN0KTsKKyAgICAgICAgfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBPYmplY3RbXSkgeworICAgICAgICAgICAgb3V0LndyaXRlKHRvQXJyYXlTdHJpbmcoKE9iamVjdFtdKSBvYmplY3QpKTsKKyAgICAgICAgfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBNYXApIHsKKyAgICAgICAgICAgIG91dC53cml0ZSh0b01hcFN0cmluZygoTWFwKSBvYmplY3QpKTsKKyAgICAgICAgfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSB7CisgICAgICAgICAgICBvdXQud3JpdGUodG9MaXN0U3RyaW5nKChDb2xsZWN0aW9uKSBvYmplY3QpKTsKKyAgICAgICAgfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBXcml0YWJsZSkgeworICAgICAgICAgICAgV3JpdGFibGUgd3JpdGFibGUgPSAoV3JpdGFibGUpIG9iamVjdDsKKyAgICAgICAgICAgIHdyaXRhYmxlLndyaXRlVG8ob3V0KTsKKyAgICAgICAgfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJbnB1dFN0cmVhbSB8fCBvYmplY3QgaW5zdGFuY2VvZiBSZWFkZXIpIHsKKyAgICAgICAgICAgIC8vIENvcHkgc3RyZWFtIHRvIHN0cmVhbQorICAgICAgICAgICAgUmVhZGVyIHJlYWRlcjsKKyAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJbnB1dFN0cmVhbSkgeworICAgICAgICAgICAgICAgIHJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcigoSW5wdXRTdHJlYW0pIG9iamVjdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlYWRlciA9IChSZWFkZXIpIG9iamVjdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoYXJbXSBjaGFycyA9IG5ldyBjaGFyWzgxOTJdOworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICB3aGlsZSAoKGkgPSByZWFkZXIucmVhZChjaGFycykpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgb3V0LndyaXRlKGNoYXJzLCAwLCBpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlYWRlci5jbG9zZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3V0LndyaXRlKHRvU3RyaW5nKG9iamVjdCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBJdGVyYXRvciBhc0l0ZXJhdG9yKE9iamVjdCBvKSB7CisgICAgICAgIHJldHVybiAoSXRlcmF0b3IpIGludm9rZU1ldGhvZChvLCAiaXRlcmF0b3IiLCBFTVBUWV9BUkdTKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBmb3JtYXQoT2JqZWN0IGFyZ3VtZW50cywgYm9vbGVhbiB2ZXJib3NlKSB7CisgICAgICAgIGlmIChhcmd1bWVudHMgPT0gbnVsbCkgeworICAgICAgICAgICAgZmluYWwgTnVsbE9iamVjdCBudWxsT2JqZWN0ID0gTnVsbE9iamVjdC5nZXROdWxsT2JqZWN0KCk7CisgICAgICAgICAgICByZXR1cm4gKFN0cmluZykgbnVsbE9iamVjdC5nZXRNZXRhQ2xhc3MoKS5pbnZva2VNZXRob2QobnVsbE9iamVjdCwgInRvU3RyaW5nIiwgRU1QVFlfQVJHUyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFyZ3VtZW50cy5nZXRDbGFzcygpLmlzQXJyYXkoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZvcm1hdChEZWZhdWx0VHlwZVRyYW5zZm9ybWF0aW9uLmFzQ29sbGVjdGlvbihhcmd1bWVudHMpLCB2ZXJib3NlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXJndW1lbnRzIGluc3RhbmNlb2YgUmFuZ2UpIHsKKyAgICAgICAgICAgIFJhbmdlIHJhbmdlID0gKFJhbmdlKSBhcmd1bWVudHM7CisgICAgICAgICAgICBpZiAodmVyYm9zZSkgeworICAgICAgICAgICAgICAgIHJldHVybiByYW5nZS5pbnNwZWN0KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiByYW5nZS50b1N0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChhcmd1bWVudHMgaW5zdGFuY2VvZiBMaXN0KSB7CisgICAgICAgICAgICBMaXN0IGxpc3QgPSAoTGlzdCkgYXJndW1lbnRzOworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoIlsiKTsKKyAgICAgICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGZvcm1hdChpdGVyLm5leHQoKSwgdmVyYm9zZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiXSIpOworICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworICAgICAgICB9CisgICAgICAgIGlmIChhcmd1bWVudHMgaW5zdGFuY2VvZiBNYXApIHsKKyAgICAgICAgICAgIE1hcCBtYXAgPSAoTWFwKSBhcmd1bWVudHM7CisgICAgICAgICAgICBpZiAobWFwLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiAiWzpdIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCJbIik7CisgICAgICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IG1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoZm9ybWF0KGVudHJ5LmdldEtleSgpLCB2ZXJib3NlKSk7CisgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiOiIpOworICAgICAgICAgICAgICAgIGlmIChlbnRyeS5nZXRWYWx1ZSgpID09IG1hcCkgeworICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCJ0aGlzIE1hcF8iKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGZvcm1hdChlbnRyeS5nZXRWYWx1ZSgpLCB2ZXJib3NlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiXSIpOworICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworICAgICAgICB9CisgICAgICAgIGlmIChhcmd1bWVudHMgaW5zdGFuY2VvZiBFbGVtZW50KSB7CisgICAgICAgICAgICByZXR1cm4gRE9NVXRpbC5zZXJpYWxpemUoKEVsZW1lbnQpIGFyZ3VtZW50cyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFyZ3VtZW50cyBpbnN0YW5jZW9mIFN0cmluZykgeworICAgICAgICAgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgYXJnID0gKChTdHJpbmcpIGFyZ3VtZW50cykucmVwbGFjZUFsbCgiXFxuIiwgIlxcXFxuIik7ICAgIC8vIGxpbmUgZmVlZAorICAgICAgICAgICAgICAgIGFyZyA9IGFyZy5yZXBsYWNlQWxsKCJcXHIiLCAiXFxcXHIiKTsgICAgICAvLyBjYXJyaWFnZSByZXR1cm4KKyAgICAgICAgICAgICAgICBhcmcgPSBhcmcucmVwbGFjZUFsbCgiXFx0IiwgIlxcXFx0Iik7ICAgICAgLy8gdGFiCisgICAgICAgICAgICAgICAgYXJnID0gYXJnLnJlcGxhY2VBbGwoIlxcZiIsICJcXFxcZiIpOyAgICAgIC8vIGZvcm0gZmVlZAorICAgICAgICAgICAgICAgIGFyZyA9IGFyZy5yZXBsYWNlQWxsKCJcXFwiIiwgIlxcXFxcIiIpOyAgICAvLyBkb3VibGUgcXVvdGF0aW9uIGFtcmsKKyAgICAgICAgICAgICAgICBhcmcgPSBhcmcucmVwbGFjZUFsbCgiXFxcXCIsICJcXFxcIik7ICAgICAgLy8gYmFjayBzbGFzaAorICAgICAgICAgICAgICAgIHJldHVybiAiXCIiICsgYXJnICsgIlwiIjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpIGFyZ3VtZW50czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYXJndW1lbnRzLnRvU3RyaW5nKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBIGhlbHBlciBtZXRob2QgdG8gZm9ybWF0IHRoZSBhcmd1bWVudHMgdHlwZXMgYXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvVHlwZVN0cmluZyhPYmplY3RbXSBhcmd1bWVudHMpIHsKKyAgICAgICAgaWYgKGFyZ3VtZW50cyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gIm51bGwiOworICAgICAgICB9CisgICAgICAgIFN0cmluZ0J1ZmZlciBhcmdCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaSA+IDApIHsKKyAgICAgICAgICAgICAgICBhcmdCdWYuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXJnQnVmLmFwcGVuZChhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXS5nZXRDbGFzcygpLmdldE5hbWUoKSA6ICJudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFyZ0J1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgaGVscGVyIG1ldGhvZCB0byByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIG1hcCB3aXRoIGJyYWNrZXQgYm91bmRhcmllcyAiWyIgYW5kICJdIi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b01hcFN0cmluZyhNYXAgYXJnKSB7CisgICAgICAgIHJldHVybiBmb3JtYXQoYXJnLCB0cnVlKTsKKyAgICAgICAgLyppZiAoYXJnID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiAibnVsbCI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFyZy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiAiWzpdIjsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgc2JkcnkgPSAiWyI7CisgICAgICAgIFN0cmluZyBlYmRyeSA9ICJdIjsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoc2JkcnkpOworICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gYXJnLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGZvcm1hdChlbnRyeS5nZXRLZXkoKSwgdHJ1ZSkpOworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiOiIpOworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChmb3JtYXQoZW50cnkuZ2V0VmFsdWUoKSwgdHJ1ZSkpOworICAgICAgICB9CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoZWJkcnkpOworICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ki8KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGhlbHBlciBtZXRob2QgdG8gcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBsaXN0IHdpdGggYnJhY2tldCBib3VuZGFyaWVzICJbIiBhbmQgIl0iLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvTGlzdFN0cmluZyhDb2xsZWN0aW9uIGFyZykgeworICAgICAgICBpZiAoYXJnID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiAibnVsbCI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFyZy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiAiW10iOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBzYmRyeSA9ICJbIjsKKyAgICAgICAgU3RyaW5nIGViZHJ5ID0gIl0iOworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihzYmRyeSk7CisgICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhcmcuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgT2JqZWN0IGVsZW0gPSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoZm9ybWF0KGVsZW0sIHRydWUpKTsKKyAgICAgICAgfQorICAgICAgICBidWZmZXIuYXBwZW5kKGViZHJ5KTsKKyAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgaGVscGVyIG1ldGhvZCB0byByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbiBhcnJyYXkgb2Ygb2JqZWN0cworICAgICAqIHdpdGggYnJhY2UgYm91bmRhcmllcyAieyIgYW5kICJ9Ii4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b0FycmF5U3RyaW5nKE9iamVjdFtdIGFyZ3VtZW50cykgeworICAgICAgICBpZiAoYXJndW1lbnRzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiAibnVsbCI7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHNiZHJ5ID0gInsiOworICAgICAgICBTdHJpbmcgZWJkcnkgPSAifSI7CisgICAgICAgIFN0cmluZ0J1ZmZlciBhcmdCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKHNiZHJ5KTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChpID4gMCkgeworICAgICAgICAgICAgICAgIGFyZ0J1Zi5hcHBlbmQoIiwgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhcmdCdWYuYXBwZW5kKGZvcm1hdChhcmd1bWVudHNbaV0sIHRydWUpKTsKKyAgICAgICAgfQorICAgICAgICBhcmdCdWYuYXBwZW5kKGViZHJ5KTsKKyAgICAgICAgcmV0dXJuIGFyZ0J1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBjcmVhdGVSYW5nZShPYmplY3QgZnJvbSwgT2JqZWN0IHRvLCBib29sZWFuIGluY2x1c2l2ZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIFNjcmlwdEJ5dGVjb2RlQWRhcHRlci5jcmVhdGVSYW5nZShmcm9tLCB0bywgaW5jbHVzaXZlKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgdGhyb3cgcmU7CisgICAgICAgIH0gY2F0Y2ggKEVycm9yIGUpIHsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbih0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGJpdHdpc2VOZWdhdGUoT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEludGVnZXIpIHsKKyAgICAgICAgICAgIEludGVnZXIgbnVtYmVyID0gKEludGVnZXIpIHZhbHVlOworICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnRlZ2VyKH5udW1iZXIuaW50VmFsdWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTG9uZykgeworICAgICAgICAgICAgTG9uZyBudW1iZXIgPSAoTG9uZykgdmFsdWU7CisgICAgICAgICAgICByZXR1cm4gbmV3IExvbmcofm51bWJlci5sb25nVmFsdWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQmlnSW50ZWdlcikgeworICAgICAgICAgICAgcmV0dXJuICgoQmlnSW50ZWdlcikgdmFsdWUpLm5vdCgpOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgeworICAgICAgICAgICAgLy8gdmFsdWUgaXMgYSByZWd1bGFyIGV4cHJlc3Npb24uCisgICAgICAgICAgICByZXR1cm4gRGVmYXVsdEdyb292eU1ldGhvZHMuYml0d2lzZU5lZ2F0ZSh2YWx1ZS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBHU3RyaW5nKSB7CisgICAgICAgICAgICAvLyB2YWx1ZSBpcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICAgICAgICAgIHJldHVybiBEZWZhdWx0R3Jvb3Z5TWV0aG9kcy5iaXR3aXNlTmVnYXRlKHZhbHVlLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFycmF5TGlzdCkgeworICAgICAgICAgICAgLy8gdmFsdWUgaXMgYW4gbGlzdC4KKyAgICAgICAgICAgIExpc3QgbmV3bGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgIEl0ZXJhdG9yIGl0ID0gKChBcnJheUxpc3QpIHZhbHVlKS5pdGVyYXRvcigpOworICAgICAgICAgICAgZm9yICg7IGl0Lmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBuZXdsaXN0LmFkZChiaXR3aXNlTmVnYXRlKGl0Lm5leHQoKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ld2xpc3Q7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZCh2YWx1ZSwgImJpdHdpc2VOZWdhdGUiLCBFTVBUWV9PQkpFQ1RfQVJSQVkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9JbnZva2VySW52b2NhdGlvbkV4Y2VwdGlvbi5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9JbnZva2VySW52b2NhdGlvbkV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMDAwOTIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL0ludm9rZXJJbnZvY2F0aW9uRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZTsKKworaW1wb3J0IGdyb292eS5sYW5nLkdyb292eVJ1bnRpbWVFeGNlcHRpb247CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworCisvKioKKyAqIEFuIGV4Y2VwdGlvbiB0aHJvd24gaWYgYSBtZXRob2QgaXMgY2FsbGVkIGFuZCBhbiBleGNlcHRpb24gb2NjdXJyZWQKKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIEludm9rZXJJbnZvY2F0aW9uRXhjZXB0aW9uIGV4dGVuZHMgR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbiB7CisKKyAgICBwdWJsaWMgSW52b2tlckludm9jYXRpb25FeGNlcHRpb24oSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHN1cGVyKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOworICAgIH0KKworICAgIHB1YmxpYyBJbnZva2VySW52b2NhdGlvbkV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKKyAgICAgICAgc3VwZXIoY2F1c2UpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKKyAgICAgICAgVGhyb3dhYmxlIGNhdXNlID0gZ2V0Q2F1c2UoKTsKKyAgICAgICAgcmV0dXJuIChjYXVzZT09bnVsbCk/ImphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbiI6Y2F1c2UudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL0l0ZXJhdG9yQ2xvc3VyZUFkYXB0ZXIuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvSXRlcmF0b3JDbG9zdXJlQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZGJjZTEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL0l0ZXJhdG9yQ2xvc3VyZUFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWU7CisKK2ltcG9ydCBncm9vdnkubGFuZy5DbG9zdXJlOworaW1wb3J0IGdyb292eS5sYW5nLk1ldGFDbGFzczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQSBjbG9zdXJlIHdoaWNoIHN0b3JlcyBjYWxscyBpbiBhIExpc3Qgc28gdGhhdCBtZXRob2QgY2FsbHMgCisgKiBjYW4gYmUgaXRlcmF0ZWQgb3ZlciBpbiBhICd5aWVsZCcgc3R5bGUgd2F5CisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBJdGVyYXRvckNsb3N1cmVBZGFwdGVyIGV4dGVuZHMgQ2xvc3VyZSB7CisKKyAgICBwcml2YXRlIGZpbmFsIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICBwcml2YXRlIE1ldGFDbGFzcyBtZXRhQ2xhc3MgPSBJbnZva2VySGVscGVyLmdldE1ldGFDbGFzcyh0aGlzKTsKKyAgICAKKyAgICBwdWJsaWMgSXRlcmF0b3JDbG9zdXJlQWRhcHRlcihPYmplY3QgZGVsZWdhdGUpIHsKKyAgICAgICAgc3VwZXIoZGVsZWdhdGUpOworICAgIH0KKworICAgIHB1YmxpYyBNZXRhQ2xhc3MgZ2V0TWV0YUNsYXNzKCkgeworICAgICAgICByZXR1cm4gbWV0YUNsYXNzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1ldGFDbGFzcyhNZXRhQ2xhc3MgbWV0YUNsYXNzKSB7CisgICAgICAgIHRoaXMubWV0YUNsYXNzID0gbWV0YUNsYXNzOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgTGlzdCBhc0xpc3QoKSB7CisgICAgICAgIHJldHVybiBsaXN0OworICAgIH0KKworICAgIHByb3RlY3RlZCBPYmplY3QgZG9DYWxsKE9iamVjdCBhcmd1bWVudCkgeworICAgICAgICBsaXN0LmFkZChhcmd1bWVudCk7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvTWV0YUNsYXNzSGVscGVyLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL01ldGFDbGFzc0hlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjYmRlYzEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL01ldGFDbGFzc0hlbHBlci5qYXZhCkBAIC0wLDAgKzEsODUzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWU7CisKK2ltcG9ydCBncm9vdnkubGFuZy5DbG9zdXJlOworaW1wb3J0IGdyb292eS5sYW5nLkdTdHJpbmc7CitpbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbjsKK2ltcG9ydCBncm9vdnkubGFuZy5NZXRhTWV0aG9kOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucmVmbGVjdGlvbi4qOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS53cmFwcGVycy5XcmFwcGVyOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKK2ltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvKioKKyAqIEBhdXRob3IgSm9obiBXaWxzb24KKyAqIEBhdXRob3IgSm9jaGVuIFRoZW9kb3JvdQorICovCitwdWJsaWMgY2xhc3MgTWV0YUNsYXNzSGVscGVyIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0W10gRU1QVFlfQVJSQVkgPSB7fTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENsYXNzW10gRU1QVFlfVFlQRV9BUlJBWSA9IHt9OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0W10gQVJSQVlfV0lUSF9OVUxMID0ge251bGx9OworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoTWV0YUNsYXNzSGVscGVyLmNsYXNzLmdldE5hbWUoKSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9BUkdfTEVOID0gMTI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZBUkdTX1NISUZUID0gMjg7CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gYWNjZXNzaWJsZVRvQ29uc3RydWN0b3IoZmluYWwgQ2xhc3MgYXQsIGZpbmFsIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yKSB7CisgICAgICAgIGJvb2xlYW4gYWNjZXNzaWJsZSA9IGZhbHNlOworICAgICAgICBmaW5hbCBpbnQgbW9kaWZpZXJzID0gY29uc3RydWN0b3IuZ2V0TW9kaWZpZXJzKCk7CisgICAgICAgIGlmIChNb2RpZmllci5pc1B1YmxpYyhtb2RpZmllcnMpKSB7CisgICAgICAgICAgICBhY2Nlc3NpYmxlID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChNb2RpZmllci5pc1ByaXZhdGUobW9kaWZpZXJzKSkgeworICAgICAgICAgICAgYWNjZXNzaWJsZSA9IGF0LmdldE5hbWUoKS5lcXVhbHMoY29uc3RydWN0b3IuZ2V0TmFtZSgpKTsKKyAgICAgICAgfSBlbHNlIGlmIChNb2RpZmllci5pc1Byb3RlY3RlZChtb2RpZmllcnMpKSB7CisgICAgICAgICAgICBCb29sZWFuIGlzQWNjZXNzaWJsZSA9IGNoZWNrQ29tcGF0aWJsZVBhY2thZ2VzKGF0LCBjb25zdHJ1Y3Rvcik7CisgICAgICAgICAgICBpZiAoaXNBY2Nlc3NpYmxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhY2Nlc3NpYmxlID0gaXNBY2Nlc3NpYmxlLmJvb2xlYW5WYWx1ZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBib29sZWFuIGZsYWcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBDbGFzcyBjbGF6eiA9IGF0OworICAgICAgICAgICAgICAgIHdoaWxlICghZmxhZyAmJiBjbGF6eiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGF6ei5lcXVhbHMoY29uc3RydWN0b3IuZ2V0RGVjbGFyaW5nQ2xhc3MoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsYWcgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXp6LmVxdWFscyhPYmplY3QuY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjbGF6eiA9IGNsYXp6LmdldFN1cGVyY2xhc3MoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYWNjZXNzaWJsZSA9IGZsYWc7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBCb29sZWFuIGlzQWNjZXNzaWJsZSA9IGNoZWNrQ29tcGF0aWJsZVBhY2thZ2VzKGF0LCBjb25zdHJ1Y3Rvcik7CisgICAgICAgICAgICBpZiAoaXNBY2Nlc3NpYmxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhY2Nlc3NpYmxlID0gaXNBY2Nlc3NpYmxlLmJvb2xlYW5WYWx1ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBhY2Nlc3NpYmxlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEJvb2xlYW4gY2hlY2tDb21wYXRpYmxlUGFja2FnZXMoQ2xhc3MgYXQsIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yKSB7CisgICAgICAgIGlmIChhdC5nZXRQYWNrYWdlKCkgPT0gbnVsbCAmJiBjb25zdHJ1Y3Rvci5nZXREZWNsYXJpbmdDbGFzcygpLmdldFBhY2thZ2UoKSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOworICAgICAgICB9CisgICAgICAgIGlmIChhdC5nZXRQYWNrYWdlKCkgPT0gbnVsbCAmJiBjb25zdHJ1Y3Rvci5nZXREZWNsYXJpbmdDbGFzcygpLmdldFBhY2thZ2UoKSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gQm9vbGVhbi5GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXQuZ2V0UGFja2FnZSgpICE9IG51bGwgJiYgY29uc3RydWN0b3IuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXRQYWNrYWdlKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4uRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF0LmdldFBhY2thZ2UoKS5lcXVhbHMoY29uc3RydWN0b3IuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXRQYWNrYWdlKCkpKSB7CisgICAgICAgICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0W10gYXNXcmFwcGVyQXJyYXkoT2JqZWN0IHBhcmFtZXRlcnMsIENsYXNzIGNvbXBvbmVudFR5cGUpIHsKKyAgICAgICAgT2JqZWN0W10gcmV0ID0gbnVsbDsKKyAgICAgICAgaWYgKGNvbXBvbmVudFR5cGUgPT0gYm9vbGVhbi5jbGFzcykgeworICAgICAgICAgICAgYm9vbGVhbltdIGFycmF5ID0gKGJvb2xlYW5bXSkgcGFyYW1ldGVyczsKKyAgICAgICAgICAgIHJldCA9IG5ldyBPYmplY3RbYXJyYXkubGVuZ3RoXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICByZXRbaV0gPSBuZXcgQm9vbGVhbihhcnJheVtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoY29tcG9uZW50VHlwZSA9PSBjaGFyLmNsYXNzKSB7CisgICAgICAgICAgICBjaGFyW10gYXJyYXkgPSAoY2hhcltdKSBwYXJhbWV0ZXJzOworICAgICAgICAgICAgcmV0ID0gbmV3IE9iamVjdFthcnJheS5sZW5ndGhdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIHJldFtpXSA9IG5ldyBDaGFyYWN0ZXIoYXJyYXlbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGNvbXBvbmVudFR5cGUgPT0gYnl0ZS5jbGFzcykgeworICAgICAgICAgICAgYnl0ZVtdIGFycmF5ID0gKGJ5dGVbXSkgcGFyYW1ldGVyczsKKyAgICAgICAgICAgIHJldCA9IG5ldyBPYmplY3RbYXJyYXkubGVuZ3RoXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICByZXRbaV0gPSBuZXcgQnl0ZShhcnJheVtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoY29tcG9uZW50VHlwZSA9PSBpbnQuY2xhc3MpIHsKKyAgICAgICAgICAgIGludFtdIGFycmF5ID0gKGludFtdKSBwYXJhbWV0ZXJzOworICAgICAgICAgICAgcmV0ID0gbmV3IE9iamVjdFthcnJheS5sZW5ndGhdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIHJldFtpXSA9IG5ldyBJbnRlZ2VyKGFycmF5W2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChjb21wb25lbnRUeXBlID09IHNob3J0LmNsYXNzKSB7CisgICAgICAgICAgICBzaG9ydFtdIGFycmF5ID0gKHNob3J0W10pIHBhcmFtZXRlcnM7CisgICAgICAgICAgICByZXQgPSBuZXcgT2JqZWN0W2FycmF5Lmxlbmd0aF07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgcmV0W2ldID0gbmV3IFNob3J0KGFycmF5W2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChjb21wb25lbnRUeXBlID09IGxvbmcuY2xhc3MpIHsKKyAgICAgICAgICAgIGxvbmdbXSBhcnJheSA9IChsb25nW10pIHBhcmFtZXRlcnM7CisgICAgICAgICAgICByZXQgPSBuZXcgT2JqZWN0W2FycmF5Lmxlbmd0aF07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgcmV0W2ldID0gbmV3IExvbmcoYXJyYXlbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGNvbXBvbmVudFR5cGUgPT0gZG91YmxlLmNsYXNzKSB7CisgICAgICAgICAgICBkb3VibGVbXSBhcnJheSA9IChkb3VibGVbXSkgcGFyYW1ldGVyczsKKyAgICAgICAgICAgIHJldCA9IG5ldyBPYmplY3RbYXJyYXkubGVuZ3RoXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICByZXRbaV0gPSBuZXcgRG91YmxlKGFycmF5W2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChjb21wb25lbnRUeXBlID09IGZsb2F0LmNsYXNzKSB7CisgICAgICAgICAgICBmbG9hdFtdIGFycmF5ID0gKGZsb2F0W10pIHBhcmFtZXRlcnM7CisgICAgICAgICAgICByZXQgPSBuZXcgT2JqZWN0W2FycmF5Lmxlbmd0aF07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgcmV0W2ldID0gbmV3IEZsb2F0KGFycmF5W2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gbGlzdCAgICAgICAgICB0aGUgb3JpZ2luYWwgbGlzdAorICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJUeXBlIHRoZSByZXN1bHRpbmcgYXJyYXkgdHlwZQorICAgICAqIEByZXR1cm4gdGhlIGNvbnN0cnVjdGVkIGFycmF5CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgYXNQcmltaXRpdmVBcnJheShMaXN0IGxpc3QsIENsYXNzIHBhcmFtZXRlclR5cGUpIHsKKyAgICAgICAgQ2xhc3MgYXJyYXlUeXBlID0gcGFyYW1ldGVyVHlwZS5nZXRDb21wb25lbnRUeXBlKCk7CisgICAgICAgIE9iamVjdCBvYmpBcnJheSA9IEFycmF5Lm5ld0luc3RhbmNlKGFycmF5VHlwZSwgbGlzdC5zaXplKCkpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIE9iamVjdCBvYmogPSBsaXN0LmdldChpKTsKKyAgICAgICAgICAgIGlmIChhcnJheVR5cGUuaXNQcmltaXRpdmUoKSkgeworICAgICAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBJbnRlZ2VyKSB7CisgICAgICAgICAgICAgICAgICAgIEFycmF5LnNldEludChvYmpBcnJheSwgaSwgKChJbnRlZ2VyKSBvYmopLmludFZhbHVlKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRG91YmxlKSB7CisgICAgICAgICAgICAgICAgICAgIEFycmF5LnNldERvdWJsZShvYmpBcnJheSwgaSwgKChEb3VibGUpIG9iaikuZG91YmxlVmFsdWUoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBCb29sZWFuKSB7CisgICAgICAgICAgICAgICAgICAgIEFycmF5LnNldEJvb2xlYW4ob2JqQXJyYXksIGksICgoQm9vbGVhbikgb2JqKS5ib29sZWFuVmFsdWUoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBMb25nKSB7CisgICAgICAgICAgICAgICAgICAgIEFycmF5LnNldExvbmcob2JqQXJyYXksIGksICgoTG9uZykgb2JqKS5sb25nVmFsdWUoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBGbG9hdCkgeworICAgICAgICAgICAgICAgICAgICBBcnJheS5zZXRGbG9hdChvYmpBcnJheSwgaSwgKChGbG9hdCkgb2JqKS5mbG9hdFZhbHVlKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7CisgICAgICAgICAgICAgICAgICAgIEFycmF5LnNldENoYXIob2JqQXJyYXksIGksICgoQ2hhcmFjdGVyKSBvYmopLmNoYXJWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEJ5dGUpIHsKKyAgICAgICAgICAgICAgICAgICAgQXJyYXkuc2V0Qnl0ZShvYmpBcnJheSwgaSwgKChCeXRlKSBvYmopLmJ5dGVWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFNob3J0KSB7CisgICAgICAgICAgICAgICAgICAgIEFycmF5LnNldFNob3J0KG9iakFycmF5LCBpLCAoKFNob3J0KSBvYmopLnNob3J0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBcnJheS5zZXQob2JqQXJyYXksIGksIG9iaik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG9iakFycmF5OworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzW10gUFJJTUlUSVZFUyA9IHsKKyAgICAgICAgICAgIGJ5dGUuY2xhc3MsIEJ5dGUuY2xhc3MsIHNob3J0LmNsYXNzLCBTaG9ydC5jbGFzcywKKyAgICAgICAgICAgIGludC5jbGFzcywgSW50ZWdlci5jbGFzcywgbG9uZy5jbGFzcywgTG9uZy5jbGFzcywKKyAgICAgICAgICAgIEJpZ0ludGVnZXIuY2xhc3MsIGZsb2F0LmNsYXNzLCBGbG9hdC5jbGFzcywKKyAgICAgICAgICAgIGRvdWJsZS5jbGFzcywgRG91YmxlLmNsYXNzLCBCaWdEZWNpbWFsLmNsYXNzLAorICAgICAgICAgICAgTnVtYmVyLmNsYXNzLCBPYmplY3QuY2xhc3MKKyAgICB9OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdW10gUFJJTUlUSVZFX0RJU1RBTkNFX1RBQkxFID0geworICAgICAgICAgICAgLy8gICAgICAgICAgICAgIGJ5dGUgICAgQnl0ZSAgICBzaG9ydCAgIFNob3J0ICAgaW50ICAgICBJbnRlZ2VyICAgICBsb25nICAgIExvbmcgICAgQmlnSW50ZWdlciAgZmxvYXQgICBGbG9hdCAgIGRvdWJsZSAgRG91YmxlICBCaWdEZWNpbWFsLCBOdW1iZXIsIE9iamVjdAorICAgICAgICAgICAgLyogYnl0ZSovezAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsfSwKKyAgICAgICAgICAgIC8qQnl0ZSovezEsIDAsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsfSwKKyAgICAgICAgICAgIC8qc2hvcnQqL3sxNCwgMTUsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLH0sCisgICAgICAgICAgICAvKlNob3J0Ki97MTQsIDE1LCAxLCAwLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMyx9LAorICAgICAgICAgICAgLyppbnQqL3sxNCwgMTUsIDEyLCAxMywgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLH0sCisgICAgICAgICAgICAvKkludGVnZXIqL3sxNCwgMTUsIDEyLCAxMywgMSwgMCwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLH0sCisgICAgICAgICAgICAvKmxvbmcqL3sxNCwgMTUsIDEyLCAxMywgMTAsIDExLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LH0sCisgICAgICAgICAgICAvKkxvbmcqL3sxNCwgMTUsIDEyLCAxMywgMTAsIDExLCAxLCAwLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LH0sCisgICAgICAgICAgICAvKkJpZ0ludGVnZXIqL3sxNCwgMTUsIDEyLCAxMywgMTAsIDExLCA4LCA5LCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LH0sCisgICAgICAgICAgICAvKmZsb2F0Ki97MTQsIDE1LCAxMiwgMTMsIDEwLCAxMSwgOCwgOSwgNywgMCwgMSwgMiwgMywgNCwgNSwgNix9LAorICAgICAgICAgICAgLypGbG9hdCovezE0LCAxNSwgMTIsIDEzLCAxMCwgMTEsIDgsIDksIDcsIDEsIDAsIDIsIDMsIDQsIDUsIDYsfSwKKyAgICAgICAgICAgIC8qZG91YmxlKi97MTQsIDE1LCAxMiwgMTMsIDEwLCAxMSwgOCwgOSwgNywgNSwgNiwgMCwgMSwgMiwgMywgNCx9LAorICAgICAgICAgICAgLypEb3VibGUqL3sxNCwgMTUsIDEyLCAxMywgMTAsIDExLCA4LCA5LCA3LCA1LCA2LCAxLCAwLCAyLCAzLCA0LH0sCisgICAgICAgICAgICAvKkJpZ0RlY2ltYWwqL3sxNCwgMTUsIDEyLCAxMywgMTAsIDExLCA4LCA5LCA3LCA1LCA2LCAzLCA0LCAwLCAxLCAyLH0sCisgICAgICAgICAgICAvKk51bWVyKi97MTQsIDE1LCAxMiwgMTMsIDEwLCAxMSwgOCwgOSwgNywgNSwgNiwgMywgNCwgMiwgMCwgMSx9LAorICAgICAgICAgICAgLypPYmplY3QqL3sxNCwgMTUsIDEyLCAxMywgMTAsIDExLCA4LCA5LCA3LCA1LCA2LCAzLCA0LCAyLCAxLCAwLH0sCisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGludCBnZXRQcmltaXRpdmVJbmRleChDbGFzcyBjKSB7CisgICAgICAgIGZvciAoYnl0ZSBpID0gMDsgaSA8IFBSSU1JVElWRVMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChQUklNSVRJVkVTW2ldID09IGMpIHJldHVybiBpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0UHJpbWl0aXZlRGlzdGFuY2UoQ2xhc3MgZnJvbSwgQ2xhc3MgdG8pIHsKKyAgICAgICAgLy8gd2Uga25vdyBoZXJlIHRoYXQgZnJvbSE9dG8sIHNvIGEgZGlzdGFuY2Ugb2YgMCBpcyBuZXZlciB2YWxpZAorICAgICAgICAvLyBnZXQgcHJpbWl0aXZlIHR5cGUgaW5kZXhlcworICAgICAgICBpbnQgZnJvbUluZGV4ID0gZ2V0UHJpbWl0aXZlSW5kZXgoZnJvbSk7CisgICAgICAgIGludCB0b0luZGV4ID0gZ2V0UHJpbWl0aXZlSW5kZXgodG8pOworICAgICAgICBpZiAoZnJvbUluZGV4ID09IC0xIHx8IHRvSW5kZXggPT0gLTEpIHJldHVybiAtMTsKKyAgICAgICAgcmV0dXJuIFBSSU1JVElWRV9ESVNUQU5DRV9UQUJMRVt0b0luZGV4XVtmcm9tSW5kZXhdOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGludCBnZXRNYXhpbXVtSW50ZXJmYWNlRGlzdGFuY2UoQ2xhc3MgYywgQ2xhc3MgaW50ZXJmYWNlQ2xhc3MpIHsKKyAgICAgICAgaWYgKGMgPT0gbnVsbCB8fCBjID09IGludGVyZmFjZUNsYXNzKSByZXR1cm4gMDsKKyAgICAgICAgQ2xhc3NbXSBpbnRlcmZhY2VzID0gYy5nZXRJbnRlcmZhY2VzKCk7CisgICAgICAgIGludCBtYXggPSAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGludGVyZmFjZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGludCBzdWIgPSAxICsgZ2V0TWF4aW11bUludGVyZmFjZURpc3RhbmNlKGludGVyZmFjZXNbaV0sIGludGVyZmFjZUNsYXNzKTsKKyAgICAgICAgICAgIG1heCA9IE1hdGgubWF4KG1heCwgc3ViKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTWF0aC5tYXgobWF4LCBnZXRNYXhpbXVtSW50ZXJmYWNlRGlzdGFuY2UoYy5nZXRTdXBlcmNsYXNzKCksIGludGVyZmFjZUNsYXNzKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBjYWxjdWxhdGVQYXJhbWV0ZXJEaXN0YW5jZShDbGFzcyBhcmd1bWVudCwgQ2xhc3MgcGFyYW1ldGVyKSB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBub3RlOiB3aGVuIHNoaWZ0aW5nIHdpdGggMzIgYml0LCB5b3Ugc2hvdWxkIG9ubHkgc2hpZnQgb24gYSBsb25nLiBJZiB5b3UgZG8KKyAgICAgICAgICogICAgICAgdGhhdCB3aXRoIGFuIGludCwgdGhlbiBpPT0oaTw8MzIpLCB3aGljaCBtZWFucyB5b3UgbG9vc2UgdGhlIHNoaWZ0CisgICAgICAgICAqICAgICAgIGluZm9ybWF0aW9uCisgICAgICAgICAqLworCisgICAgICAgIGlmIChwYXJhbWV0ZXIgPT0gYXJndW1lbnQpIHJldHVybiAwOworCisgICAgICAgIGlmIChwYXJhbWV0ZXIuaXNJbnRlcmZhY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuIGdldE1heGltdW1JbnRlcmZhY2VEaXN0YW5jZShhcmd1bWVudCwgcGFyYW1ldGVyKTw8MTsKKyAgICAgICAgfQorCisgICAgICAgIGxvbmcgb2JqZWN0RGlzdGFuY2UgPSAwOworICAgICAgICBpZiAoYXJndW1lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgbG9uZyBwZCA9IGdldFByaW1pdGl2ZURpc3RhbmNlKHBhcmFtZXRlciwgYXJndW1lbnQpOworICAgICAgICAgICAgaWYgKHBkICE9IC0xKSByZXR1cm4gcGQgPDwgMzI7CisKKyAgICAgICAgICAgIC8vIGFkZCBvbmUgdG8gZGlzdCB0byBiZSBzdXJlIGludGVyZmFjZXMgYXJlIHByZWZlcmVkCisgICAgICAgICAgICBvYmplY3REaXN0YW5jZSArPSBQUklNSVRJVkVTLmxlbmd0aCArIDE7CisgICAgICAgICAgICBDbGFzcyBjbGF6eiA9IFJlZmxlY3Rpb25DYWNoZS5hdXRvYm94VHlwZShhcmd1bWVudCk7CisgICAgICAgICAgICB3aGlsZSAoY2xhenogIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChjbGF6eiA9PSBwYXJhbWV0ZXIpIGJyZWFrOworICAgICAgICAgICAgICAgIGlmIChjbGF6eiA9PSBHU3RyaW5nLmNsYXNzICYmIHBhcmFtZXRlciA9PSBTdHJpbmcuY2xhc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgb2JqZWN0RGlzdGFuY2UgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNsYXp6ID0gY2xhenouZ2V0U3VwZXJjbGFzcygpOworICAgICAgICAgICAgICAgIG9iamVjdERpc3RhbmNlICs9IDM7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBjaG9vc2UgdGhlIGRpc3RhbmNlIHRvIE9iamVjdCBpZiBhIHBhcmFtZXRlciBpcyBudWxsCisgICAgICAgICAgICAvLyB0aGlzIHdpbGwgbWVhbiB0aGF0IE9iamVjdCBpcyBwcmVmZXJlZCBvdmVyIGEgbW9yZQorICAgICAgICAgICAgLy8gc3BlY2lmaWMgdHlwZQorICAgICAgICAgICAgLy8gcmVtb3ZlIG9uZSB0byBkaXN0IHRvIGJlIHN1cmUgT2JqZWN0IGlzIHByZWZlcmVkCisgICAgICAgICAgICBvYmplY3REaXN0YW5jZS0tOworICAgICAgICAgICAgQ2xhc3MgY2xhenogPSBwYXJhbWV0ZXI7CisgICAgICAgICAgICBpZiAoY2xhenouaXNQcmltaXRpdmUoKSkgeworICAgICAgICAgICAgICAgIG9iamVjdERpc3RhbmNlICs9IDI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHdoaWxlIChjbGF6eiAhPSBPYmplY3QuY2xhc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgY2xhenogPSBjbGF6ei5nZXRTdXBlcmNsYXNzKCk7CisgICAgICAgICAgICAgICAgICAgIG9iamVjdERpc3RhbmNlICs9IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBvYmplY3REaXN0YW5jZSA8PCAzMjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGxvbmcgY2FsY3VsYXRlUGFyYW1ldGVyRGlzdGFuY2UoQ2xhc3NbXSBhcmd1bWVudHMsIENsYXNzW10gcGFyYW1ldGVycykgeworICAgICAgICBpZiAocGFyYW1ldGVycy5sZW5ndGggPT0gMCkgcmV0dXJuIDA7CisKKyAgICAgICAgbG9uZyByZXQgPSAwOyAgICAgICAgCisgICAgICAgIGludCBub1ZhcmdzTGVuZ3RoID0gcGFyYW1ldGVycy5sZW5ndGgtMTsKKyAgICAgICAgCisgICAgICAgIC8vIGlmIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycyBkb2VzIG5vdCBtYXRjaCB3ZSBoYXZlIAorICAgICAgICAvLyBhIHZhcmdzIHVzYWdlCisgICAgICAgIC8vCisgICAgICAgIC8vIGNhc2UgQTogYXJndW1lbnRzLmxlbmd0aDxwYXJhbWV0ZXJzLmxlbmd0aAorICAgICAgICAvLworICAgICAgICAvLyAgICAgICAgIEluIHRoaXMgY2FzZSBhcmd1bWVudHMubGVuZ3RoIGlzIGFsd2F5cyBlcXVhbCB0bworICAgICAgICAvLyAgICAgICAgIG5vVmFyZ3NMZW5ndGggYmVjYXVzZSBvbmx5IHRoZSBsYXN0IHBhcmFtZXRlcgorICAgICAgICAvLyAgICAgICAgIG1pZ2h0IGJlIGEgb3B0aW9uYWwgdmFyZ3MgcGFyYW1ldGVyCisgICAgICAgIC8vCisgICAgICAgIC8vIGNhc2UgQjogYXJndW1lbnRzLmxlbnRoPnBhcmFtZXRlcnMubGVuZ3RoCisgICAgICAgIC8vCisgICAgICAgIC8vICAgICAgICAgSW4gdGhpcyBjYXNlIGFsbCBhcmd1bWVudHMgd2l0aCBhIGluZGV4IGJpZ2dlciB0aGFuCisgICAgICAgIC8vICAgICAgICAgcGFyYW1NaW51czEgYXJlIHBhcnQgb2YgdGhlIHZhcmdzLCBzbyBhIAorICAgICAgICAvLyAgICAgICAgIGRpc3RhbmNlIGNhbGN1bGFpb24gbmVlZHMgdG8gYmUgZG9uZSBhZ2FpbnN0IAorICAgICAgICAvLyAgICAgICAgIHBhcmFtZXRlcnNbbm9WYXJnc0xlbmd0aF0uZ2V0Q29tcG9uZW50VHlwZSgpCisgICAgICAgIC8vCisgICAgICAgIC8vIGNhc2UgQzogYXJndW1lbnRzLmxlbmd0aD09cGFyYW1ldGVycy5sZW5ndGggJiYgCisgICAgICAgIC8vICAgICAgICAgaXNBc3NpZ25hYmxlRnJvbSggcGFyYW1ldGVyc1tub1ZhcmdzTGVuZ3RoXSwKKyAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHNbbm9WYXJnc0xlbmd0aF0gKQorICAgICAgICAvLworICAgICAgICAvLyAgICAgICAgIEluIHRoaXMgY2FzZSB3ZSBoYXZlIG5vIHZhcmdzLCBzbyBjYWxjdWxhdGUgZGlyZWN0bHkKKyAgICAgICAgLy8KKyAgICAgICAgLy8gY2FzZSBEOiBhcmd1bWVudHMubGVuZ3RoPT1wYXJhbWV0ZXJzLmxlbmd0aCAmJiAKKyAgICAgICAgLy8gICAgICAgICAhaXNBc3NpZ25hYmxlRnJvbSggcGFyYW1ldGVyc1tub1ZhcmdzTGVuZ3RoXSwKKyAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzW25vVmFyZ3NMZW5ndGhdICkKKyAgICAgICAgLy8KKyAgICAgICAgLy8gICAgICAgICBJbiB0aGlzIGNhc2Ugd2UgaGF2ZSBhIHZhcmdzIGNhc2UgYWdhaW4sIHdlIG5lZWQgCisgICAgICAgIC8vICAgICAgICAgdG8gY2FsY3VsYXRlIGFyZ3VtZW50c1tub1ZhcmdzTGVuZ3RoXSBhZ2FpbnN0CisgICAgICAgIC8vICAgICAgICAgcGFyYW1ldGVyc1tub1ZhcmdzTGVuZ3RoXS5nZXRDb21wb25lbnRUeXBlCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIC8vIGZpcnN0IHdlIGNhbGN1bGF0ZSBhbGwgYXJndW1lbnRzLCB0aGF0IGFyZSBmb3Igc3VyZSBub3QgcGFydAorICAgICAgICAvLyBvZiB2YXJncy4gIFNpbmNlIHRoZSBtaW5pbXVtIGZvciBhcmd1bWVudHMgaXMgbm9WYXJnc0xlbmd0aAorICAgICAgICAvLyB3ZSBjYW4gc2FmZWx5IGl0ZXJhdGUgdG8gdGhpcyBwb2ludAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vVmFyZ3NMZW5ndGg7IGkrKykgeworICAgICAgICAgICAgcmV0ICs9IGNhbGN1bGF0ZVBhcmFtZXRlckRpc3RhbmNlKGFyZ3VtZW50c1tpXSwgcGFyYW1ldGVyc1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoPT1wYXJhbWV0ZXJzLmxlbmd0aCkgeworICAgICAgICAgICAgLy8gY2FzZSBDJkQsIHdlIHVzZSBiYXNlVHlwZSB0byBjYWxjdWxhdGUgYW5kIHNldCBpdAorICAgICAgICAgICAgLy8gdG8gdGhlIHZhbHVlIHdlIG5lZWQgYWNjb3JkaW5nIHRvIGNhc2UgQyBhbmQgRAorICAgICAgICAgICAgQ2xhc3MgYmFzZVR5cGUgPSBwYXJhbWV0ZXJzW25vVmFyZ3NMZW5ndGhdOyAvLyBjYXNlIEMKKyAgICAgICAgICAgIGlmICghaXNBc3NpZ25hYmxlRnJvbShwYXJhbWV0ZXJzW25vVmFyZ3NMZW5ndGhdLGFyZ3VtZW50c1tub1ZhcmdzTGVuZ3RoXSkpIHsKKyAgICAgICAgICAgICAgICBiYXNlVHlwZT1iYXNlVHlwZS5nZXRDb21wb25lbnRUeXBlKCk7IC8vIGNhc2UgRAorICAgICAgICAgICAgICAgIHJldCs9Mmw8PFZBUkdTX1NISUZUOyAvLyBwZW5hbHR5IGZvciB2YXJncworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0ICs9IGNhbGN1bGF0ZVBhcmFtZXRlckRpc3RhbmNlKGFyZ3VtZW50c1tub1ZhcmdzTGVuZ3RoXSwgYmFzZVR5cGUpOworICAgICAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGg+cGFyYW1ldGVycy5sZW5ndGgpIHsKKyAgICAgICAgICAgIC8vIGNhc2UgQgorICAgICAgICAgICAgLy8gd2UgZ2l2ZSBvdXIgYSB2YXJncyBwZW5hbHR5IGZvciBlYWNoIGV4Y2VlZGluZyBhcmd1bWVudCBhbmQgaXRlcmF0ZQorICAgICAgICAgICAgLy8gYnkgdXNpbmcgcGFyYW1ldGVyc1tub1ZhcmdzTGVuZ3RoXS5nZXRDb21wb25lbnRUeXBlKCkKKyAgICAgICAgICAgIHJldCArPSAoMithcmd1bWVudHMubGVuZ3RoLXBhcmFtZXRlcnMubGVuZ3RoKTw8VkFSR1NfU0hJRlQ7CisgICAgICAgICAgICBDbGFzcyB2YXJnc1R5cGUgPSBwYXJhbWV0ZXJzW25vVmFyZ3NMZW5ndGhdLmdldENvbXBvbmVudFR5cGUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBub1ZhcmdzTGVuZ3RoOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgcmV0ICs9IGNhbGN1bGF0ZVBhcmFtZXRlckRpc3RhbmNlKGFyZ3VtZW50c1tpXSwgdmFyZ3NUeXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGNhc2UgQQorICAgICAgICAgICAgLy8gd2UgZ2l2ZSBhIHBlbmFsdHkgZm9yIHZhcmdzLCBzaW5jZSB3ZSBoYXZlIG5vIGRpcmVjdAorICAgICAgICAgICAgLy8gbWF0Y2ggZm9yIHRoZSBsYXN0IGFyZ3VtZW50CisgICAgICAgICAgICByZXQrPTFsPDxWQVJHU19TSElGVDsgICAgICAgICAgICAKKyAgICAgICAgfSAgCisKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjYXBpdGFsaXplKFN0cmluZyBwcm9wZXJ0eSkgeworICAgICAgICByZXR1cm4gcHJvcGVydHkuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyBwcm9wZXJ0eS5zdWJzdHJpbmcoMSwgcHJvcGVydHkubGVuZ3RoKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBtZXRob2RzIHRoZSBtZXRob2RzIHRvIGNob29zZSBmcm9tCisgICAgICogQHJldHVybiB0aGUgbWV0aG9kIHdpdGggMSBwYXJhbWV0ZXIgd2hpY2ggdGFrZXMgdGhlIG1vc3QgZ2VuZXJhbCB0eXBlIG9mCisgICAgICogICAgICAgICBvYmplY3QgKGUuZy4gT2JqZWN0KQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNob29zZUVtcHR5TWV0aG9kUGFyYW1zKEZhc3RBcnJheSBtZXRob2RzKSB7CisgICAgICAgIE9iamVjdCB2YXJnc01ldGhvZCA9IG51bGw7CisgICAgICAgIGZpbmFsIGludCBsZW4gPSBtZXRob2RzLnNpemUoKTsKKyAgICAgICAgZmluYWwgT2JqZWN0W10gZGF0YSA9IG1ldGhvZHMuZ2V0QXJyYXkoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgIT0gbGVuOyArK2kpIHsKKyAgICAgICAgICAgIE9iamVjdCBtZXRob2QgPSBkYXRhW2ldOworICAgICAgICAgICAgZmluYWwgUGFyYW1ldGVyVHlwZXMgcHQgPSBnZXRQYXJhbWV0ZXJUeXBlcyhtZXRob2QpOworICAgICAgICAgICAgQ2FjaGVkQ2xhc3NbXSBwYXJhbVR5cGVzID0gcHQuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKKyAgICAgICAgICAgIGludCBwYXJhbUxlbmd0aCA9IHBhcmFtVHlwZXMubGVuZ3RoOworICAgICAgICAgICAgaWYgKHBhcmFtTGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbWV0aG9kOworICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbUxlbmd0aCA9PSAxICYmIHB0LmlzVmFyZ3NNZXRob2QoRU1QVFlfQVJSQVkpKSB7CisgICAgICAgICAgICAgICAgdmFyZ3NNZXRob2QgPSBtZXRob2Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHZhcmdzTWV0aG9kOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBtZXRob2RzIHRoZSBtZXRob2RzIHRvIGNob29zZSBmcm9tCisgICAgICogQHJldHVybiB0aGUgbWV0aG9kIHdpdGggMSBwYXJhbWV0ZXIgd2hpY2ggdGFrZXMgdGhlIG1vc3QgZ2VuZXJhbCB0eXBlIG9mCisgICAgICogICAgICAgICBvYmplY3QgKGUuZy4gT2JqZWN0KSBpZ25vcmluZyBwcmltaXR2ZSB0eXBlcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNob29zZU1vc3RHZW5lcmFsTWV0aG9kV2l0aDFOdWxsUGFyYW0oRmFzdEFycmF5IG1ldGhvZHMpIHsKKyAgICAgICAgLy8gbGV0J3MgbG9vayBmb3IgbWV0aG9kcyB3aXRoIDEgYXJndW1lbnQgd2hpY2ggbWF0Y2hlcyB0aGUgdHlwZSBvZiB0aGUKKyAgICAgICAgLy8gYXJndW1lbnRzCisgICAgICAgIENhY2hlZENsYXNzIGNsb3Nlc3RDbGFzcyA9IG51bGw7CisgICAgICAgIENhY2hlZENsYXNzIGNsb3Nlc3RWYXJnc0NsYXNzID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IGFuc3dlciA9IG51bGw7CisgICAgICAgIGludCBjbG9zZXN0RGlzdCA9IC0xOworICAgICAgICBmaW5hbCBpbnQgbGVuID0gbWV0aG9kcy5zaXplKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpICE9IGxlbjsgKytpKSB7CisgICAgICAgICAgICBmaW5hbCBPYmplY3RbXSBkYXRhID0gbWV0aG9kcy5nZXRBcnJheSgpOworICAgICAgICAgICAgT2JqZWN0IG1ldGhvZCA9IGRhdGFbaV07CisgICAgICAgICAgICBmaW5hbCBQYXJhbWV0ZXJUeXBlcyBwdCA9IGdldFBhcmFtZXRlclR5cGVzKG1ldGhvZCk7CisgICAgICAgICAgICBDYWNoZWRDbGFzc1tdIHBhcmFtVHlwZXMgPSBwdC5nZXRQYXJhbWV0ZXJUeXBlcygpOworICAgICAgICAgICAgaW50IHBhcmFtTGVuZ3RoID0gcGFyYW1UeXBlcy5sZW5ndGg7CisgICAgICAgICAgICBpZiAocGFyYW1MZW5ndGggPT0gMCB8fCBwYXJhbUxlbmd0aCA+IDIpIGNvbnRpbnVlOworCisgICAgICAgICAgICBDYWNoZWRDbGFzcyB0aGVUeXBlID0gcGFyYW1UeXBlc1swXTsKKyAgICAgICAgICAgIGlmICh0aGVUeXBlLmlzUHJpbWl0aXZlKSBjb250aW51ZTsKKworICAgICAgICAgICAgaWYgKHBhcmFtTGVuZ3RoID09IDIpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXB0LmlzVmFyZ3NNZXRob2QoQVJSQVlfV0lUSF9OVUxMKSkgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKGNsb3Nlc3RDbGFzcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNsb3Nlc3RWYXJnc0NsYXNzID0gcGFyYW1UeXBlc1sxXTsKKyAgICAgICAgICAgICAgICAgICAgY2xvc2VzdENsYXNzID0gdGhlVHlwZTsKKyAgICAgICAgICAgICAgICAgICAgYW5zd2VyID0gbWV0aG9kOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2xvc2VzdENsYXNzLmdldENhY2hlZENsYXNzKCkgPT0gdGhlVHlwZS5nZXRDYWNoZWRDbGFzcygpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbG9zZXN0VmFyZ3NDbGFzcyA9PSBudWxsKSBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgQ2FjaGVkQ2xhc3MgbmV3VmFyZ3NDbGFzcyA9IHBhcmFtVHlwZXNbMV07CisgICAgICAgICAgICAgICAgICAgIGlmIChjbG9zZXN0VmFyZ3NDbGFzcyA9PSBudWxsIHx8IGlzQXNzaWduYWJsZUZyb20obmV3VmFyZ3NDbGFzcy5nZXRDYWNoZWRDbGFzcygpLCBjbG9zZXN0VmFyZ3NDbGFzcy5nZXRDYWNoZWRDbGFzcygpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VzdFZhcmdzQ2xhc3MgPSBuZXdWYXJnc0NsYXNzOworICAgICAgICAgICAgICAgICAgICAgICAgYW5zd2VyID0gbWV0aG9kOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc0Fzc2lnbmFibGVGcm9tKHRoZVR5cGUuZ2V0Q2FjaGVkQ2xhc3MoKSwgY2xvc2VzdENsYXNzLmdldENhY2hlZENsYXNzKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGNsb3Nlc3RWYXJnc0NsYXNzID0gcGFyYW1UeXBlc1sxXTsKKyAgICAgICAgICAgICAgICAgICAgY2xvc2VzdENsYXNzID0gdGhlVHlwZTsKKyAgICAgICAgICAgICAgICAgICAgYW5zd2VyID0gbWV0aG9kOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGNsb3Nlc3RDbGFzcyA9PSBudWxsIHx8IGlzQXNzaWduYWJsZUZyb20odGhlVHlwZS5nZXRDYWNoZWRDbGFzcygpLCBjbG9zZXN0Q2xhc3MuZ2V0Q2FjaGVkQ2xhc3MoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2xvc2VzdFZhcmdzQ2xhc3MgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBjbG9zZXN0Q2xhc3MgPSB0aGVUeXBlOworICAgICAgICAgICAgICAgICAgICBhbnN3ZXIgPSBtZXRob2Q7CisgICAgICAgICAgICAgICAgICAgIGNsb3Nlc3REaXN0ID0gLTE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gY2xvc2VzdENsYXNzIGFuZCB0aGVUeXBlIGFyZSBub3QgaW4gYSBzdWJ0eXBlIHJlbGF0aW9uLCB3ZSBuZWVkCisgICAgICAgICAgICAgICAgICAgIC8vIHRvIGNoZWNrIHRoZSBkaXN0YW5jZSB0byBPYmplY3QKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsb3Nlc3REaXN0ID09IC0xKSBjbG9zZXN0RGlzdCA9IGNsb3Nlc3RDbGFzcy5nZXRTdXBlckNsYXNzRGlzdGFuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IG5ld0Rpc3QgPSB0aGVUeXBlLmdldFN1cGVyQ2xhc3NEaXN0YW5jZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAobmV3RGlzdCA8IGNsb3Nlc3REaXN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZXN0RGlzdCA9IG5ld0Rpc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZXN0VmFyZ3NDbGFzcyA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZXN0Q2xhc3MgPSB0aGVUeXBlOworICAgICAgICAgICAgICAgICAgICAgICAgYW5zd2VyID0gbWV0aG9kOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBhbnN3ZXI7CisgICAgfQorCisgICAgLy8gCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGNhbGN1bGF0ZVNpbXBsaWZpZWRDbGFzc0Rpc3RhbmNlVG9PYmplY3QoQ2xhc3MgY2xhenopIHsKKyAgICAgICAgaW50IG9iamVjdERpc3RhbmNlID0gMDsKKyAgICAgICAgd2hpbGUgKGNsYXp6ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNsYXp6ID0gY2xhenouZ2V0U3VwZXJjbGFzcygpOworICAgICAgICAgICAgb2JqZWN0RGlzdGFuY2UrKzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gb2JqZWN0RGlzdGFuY2U7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gbGlzdCAgIGEgbGlzdCBvZiBNZXRhTWV0aG9kcworICAgICAqIEBwYXJhbSBtZXRob2QgdGhlIE1ldGFNZXRob2Qgb2YgaW50ZXJlc3QKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgYSBtZXRob2Qgb2YgdGhlIHNhbWUgbWF0Y2hpbmcgcHJvdG90eXBlIHdhcyBmb3VuZCBpbiB0aGUKKyAgICAgKiAgICAgICAgIGxpc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNNYXRjaGluZ01ldGhvZChMaXN0IGxpc3QsIE1ldGFNZXRob2QgbWV0aG9kKSB7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBNZXRhTWV0aG9kIGFNZXRob2QgPSAoTWV0YU1ldGhvZCkgaXRlci5uZXh0KCk7CisgICAgICAgICAgICBDYWNoZWRDbGFzc1tdIHBhcmFtczEgPSBhTWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7CisgICAgICAgICAgICBDYWNoZWRDbGFzc1tdIHBhcmFtczIgPSBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKKyAgICAgICAgICAgIGlmIChwYXJhbXMxLmxlbmd0aCA9PSBwYXJhbXMyLmxlbmd0aCkgeworICAgICAgICAgICAgICAgIGJvb2xlYW4gbWF0Y2hlcyA9IHRydWU7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbXMxLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbXMxW2ldICE9IHBhcmFtczJbaV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtYXRjaGVzKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogcGFyYW0gaW5zdGFuY2UgYXJyYXkgdG8gdGhlIHR5cGUgYXJyYXkKKyAgICAgKgorICAgICAqIEBwYXJhbSBhcmdzIHRoZSBhcmd1bWVudHMKKyAgICAgKiBAcmV0dXJuIHRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDbGFzc1tdIGNvbnZlcnRUb1R5cGVBcnJheShPYmplY3RbXSBhcmdzKSB7CisgICAgICAgIGlmIChhcmdzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgaW50IHMgPSBhcmdzLmxlbmd0aDsKKyAgICAgICAgQ2xhc3NbXSBhbnMgPSBuZXcgQ2xhc3Nbc107CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgczsgaSsrKSB7CisgICAgICAgICAgICBPYmplY3QgbyA9IGFyZ3NbaV07CisgICAgICAgICAgICBpZiAobyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgYW5zW2ldID0gbnVsbDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIFdyYXBwZXIpIHsKKyAgICAgICAgICAgICAgICBhbnNbaV0gPSAoKFdyYXBwZXIpIG8pLmdldFR5cGUoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYW5zW2ldID0gby5nZXRDbGFzcygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBhbnM7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZG9Db25zdHJ1Y3Rvckludm9rZShDYWNoZWRDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciwgT2JqZWN0W10gYXJndW1lbnRBcnJheSkgeworICAgICAgICBmaW5hbCBDb25zdHJ1Y3RvciBjb25zdHIgPSBjb25zdHJ1Y3Rvci5jYWNoZWRDb25zdHJ1Y3RvcjsKKyAgICAgICAgaWYgKExPRy5pc0xvZ2dhYmxlKExldmVsLkZJTkVSKSkgeworICAgICAgICAgICAgbG9nTWV0aG9kQ2FsbChjb25zdHIuZ2V0RGVjbGFyaW5nQ2xhc3MoKSwgY29uc3RyLmdldE5hbWUoKSwgYXJndW1lbnRBcnJheSk7CisgICAgICAgIH0KKyAgICAgICAgYXJndW1lbnRBcnJheSA9IGNvbnN0cnVjdG9yLmNvZXJjZUFyZ3VtZW50c1RvQ2xhc3Nlcyhhcmd1bWVudEFycmF5KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBjb25zdHIubmV3SW5zdGFuY2UoYXJndW1lbnRBcnJheSk7CisgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludm9rZXJJbnZvY2F0aW9uRXhjZXB0aW9uKGUpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgY3JlYXRlRXhjZXB0aW9uVGV4dCgiZmFpbGVkIHRvIGludm9rZSBjb25zdHJ1Y3RvcjogIiwgY29uc3RyLCBhcmd1bWVudEFycmF5LCBlLCBmYWxzZSk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgY3JlYXRlRXhjZXB0aW9uVGV4dCgiY291bGQgbm90IGFjY2VzcyBjb25zdHJ1Y3RvcjogIiwgY29uc3RyLCBhcmd1bWVudEFycmF5LCBlLCBmYWxzZSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBjcmVhdGVFeGNlcHRpb25UZXh0KCJmYWlsZWQgdG8gaW52b2tlIGNvbnN0cnVjdG9yOiAiLCBjb25zdHIsIGFyZ3VtZW50QXJyYXksIGUsIHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbiBjcmVhdGVFeGNlcHRpb25UZXh0KFN0cmluZyBpbml0LCBDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciwgT2JqZWN0W10gYXJndW1lbnRBcnJheSwgVGhyb3dhYmxlIGUsIGJvb2xlYW4gc2V0UmVhc29uKSB7CisgICAgICAgIHRocm93IG5ldyBHcm9vdnlSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIGluaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICsgY29uc3RydWN0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiB3aXRoIGFyZ3VtZW50czogIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBJbnZva2VySGVscGVyLnRvU3RyaW5nKGFyZ3VtZW50QXJyYXkpCisgICAgICAgICAgICAgICAgICAgICAgICArICIgcmVhc29uOiAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGUsCisgICAgICAgICAgICAgICAgc2V0UmVhc29uID8gZSA6IG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IG1ha2VDb21tb25BcnJheShPYmplY3RbXSBhcmd1bWVudHMsIGludCBvZmZzZXQsIENsYXNzIGZhbGxiYWNrKSB7CisgICAgICAgIC8vIGFyZ3VtZW50cy5sZWdodD4wICYmICE9bnVsbAorICAgICAgICBDbGFzcyBiYXNlQ2xhc3MgPSBudWxsOworICAgICAgICBmb3IgKGludCBpID0gb2Zmc2V0OyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoYXJndW1lbnRzW2ldID09IG51bGwpIGNvbnRpbnVlOworICAgICAgICAgICAgQ2xhc3MgYXJnQ2xhc3MgPSBhcmd1bWVudHNbaV0uZ2V0Q2xhc3MoKTsKKyAgICAgICAgICAgIGlmIChiYXNlQ2xhc3MgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGJhc2VDbGFzcyA9IGFyZ0NsYXNzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKDsgYmFzZUNsYXNzICE9IE9iamVjdC5jbGFzczsgYmFzZUNsYXNzID0gYmFzZUNsYXNzLmdldFN1cGVyY2xhc3MoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoYmFzZUNsYXNzLmlzQXNzaWduYWJsZUZyb20oYXJnQ2xhc3MpKSBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJhc2VDbGFzcyA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBhbGwgYXJndW1lbnRzIHdlcmUgbnVsbAorICAgICAgICAgICAgYmFzZUNsYXNzID0gZmFsbGJhY2s7CisgICAgICAgIH0KKyAgICAgICAgT2JqZWN0IHJlc3VsdCA9IG1ha2VBcnJheShudWxsLCBiYXNlQ2xhc3MsIGFyZ3VtZW50cy5sZW5ndGggLSBvZmZzZXQpOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGFyZ3VtZW50cywgb2Zmc2V0LCByZXN1bHQsIDAsIGFyZ3VtZW50cy5sZW5ndGggLSBvZmZzZXQpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IG1ha2VBcnJheShPYmplY3Qgb2JqLCBDbGFzcyBzZWNvbmRhcnksIGludCBsZW5ndGgpIHsKKyAgICAgICAgQ2xhc3MgYmFzZUNsYXNzID0gc2Vjb25kYXJ5OworICAgICAgICBpZiAob2JqICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJhc2VDbGFzcyA9IG9iai5nZXRDbGFzcygpOworICAgICAgICB9CisgICAgICAgIC8qaWYgKEdTdHJpbmcuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShiYXNlQ2xhc3MpKSB7CisgICAgICAgICAgICAgIGJhc2VDbGFzcyA9IEdTdHJpbmcuY2xhc3M7CisgICAgICAgICAgfSovCisgICAgICAgIHJldHVybiBBcnJheS5uZXdJbnN0YW5jZShiYXNlQ2xhc3MsIGxlbmd0aCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbiBjcmVhdGVFeGNlcHRpb25UZXh0KFN0cmluZyBpbml0LCBNZXRhTWV0aG9kIG1ldGhvZCwgT2JqZWN0IG9iamVjdCwgT2JqZWN0W10gYXJncywgVGhyb3dhYmxlIHJlYXNvbiwgYm9vbGVhbiBzZXRSZWFzb24pIHsKKyAgICAgICAgcmV0dXJuIG5ldyBHcm9vdnlSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIGluaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICsgbWV0aG9kCisgICAgICAgICAgICAgICAgICAgICAgICArICIgb246ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgb2JqZWN0CisgICAgICAgICAgICAgICAgICAgICAgICArICIgd2l0aCBhcmd1bWVudHM6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgSW52b2tlckhlbHBlci50b1N0cmluZyhhcmdzKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHJlYXNvbjogIgorICAgICAgICAgICAgICAgICAgICAgICAgKyByZWFzb24sCisgICAgICAgICAgICAgICAgc2V0UmVhc29uID8gcmVhc29uIDogbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZG9NZXRob2RJbnZva2UoT2JqZWN0IG9iamVjdCwgTWV0YU1ldGhvZCBtZXRob2QsIE9iamVjdFtdIGFyZ3VtZW50QXJyYXkpIHsKKyAgICAgICAgYXJndW1lbnRBcnJheSA9IG1ldGhvZC5nZXRQYXJhbVR5cGVzKCkuY29lcmNlQXJndW1lbnRzVG9DbGFzc2VzKGFyZ3VtZW50QXJyYXkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG1ldGhvZC5pbnZva2Uob2JqZWN0LCBhcmd1bWVudEFycmF5KTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vVE9ETzogdGVzdCBpZiB0aGlzIGlzIG9rIHdpdGggbmV3IE1PUCwgc2hvdWxkIGJlIGNoYW5nZWQhCisgICAgICAgICAgICAvLyB3ZSBkb24ndCB3YW50IHRoZSBleGNlcHRpb24gYmVpbmcgdW53cmFwcGVkIGlmIGl0IGlzIGEgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgICAgICAvLyBidXQgaW4gdGhlIGNhc2UgaXQgaXMgZm9yIGV4YW1wbGUgYSBJbGxlZ2FsVGhyZWFkU3RhdGVFeGNlcHRpb24sIHdlIHdhbnQgdGhlIHVud3JhcHBpbmcKKyAgICAgICAgICAgIC8vIGZyb20gdGhlIHJ1bnRpbWUKKyAgICAgICAgICAgIC8vTm90ZTogdGhlIHJlYXNvbiB3ZSB3YW50IHVud3JhcHBpbmcgc29tZXRpbWVzIGFuZCBzb21ldGltZXMgbm90IGlzIHRoYXQgdGhlIG1ldGhvZAorICAgICAgICAgICAgLy8gaW52b2thdGlvbiB0cmllcyB0byBpbnZva2UgdGhlIG1ldGhvZCB3aXRoIGFuZCB0aGVuIHJlYWN0cyB3aXRoIHR5cGUgdHJhbnNmb3JtYXRpb24KKyAgICAgICAgICAgIC8vIGlmIHRoZSBpbnZva2F0aW9uIGZhaWxlZCBoZXJlLiBUaGlzIGlzIG9rIGZvciBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIGJ1dCBpdCBpcworICAgICAgICAgICAgLy8gcG9zc2libGUgdGhhdCBhIFJlZmxlY3RvciB3aWxsIGJlIHVzZWQgdG8gZXhlY3V0ZSB0aGUgY2FsbCBhbmQgdGhlbiBhbiBFeGNlcHRpb24gZnJvbSBpbnNpZGUKKyAgICAgICAgICAgIC8vIHRoZSBtZXRob2QgaXMgbm90IHdyYXBwZWQgaW4gYSBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGFuZCB3ZSB3aWxsIGVuZCBoZXJlLgorICAgICAgICAgICAgYm9vbGVhbiBzZXRSZWFzb24gPSBlLmdldENsYXNzKCkgIT0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzOworICAgICAgICAgICAgdGhyb3cgY3JlYXRlRXhjZXB0aW9uVGV4dCgiZmFpbGVkIHRvIGludm9rZSBtZXRob2Q6ICIsIG1ldGhvZCwgb2JqZWN0LCBhcmd1bWVudEFycmF5LCBlLCBzZXRSZWFzb24pOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBjcmVhdGVFeGNlcHRpb25UZXh0KCJmYWlsZWQgdG8gaW52b2tlIG1ldGhvZDogIiwgbWV0aG9kLCBvYmplY3QsIGFyZ3VtZW50QXJyYXksIGUsIHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKE9iamVjdCBvYmplY3QpIHsKKyAgICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSByZXR1cm4gbnVsbDsKKyAgICAgICAgcmV0dXJuIChvYmplY3QgaW5zdGFuY2VvZiBDbGFzcykgPyAoKENsYXNzKSBvYmplY3QpLmdldE5hbWUoKSA6IG9iamVjdC5nZXRDbGFzcygpLmdldE5hbWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgY2FsbGFibGUgb2JqZWN0IGZvciB0aGUgZ2l2ZW4gbWV0aG9kIG5hbWUgb24gdGhlIG9iamVjdC4KKyAgICAgKiBUaGUgb2JqZWN0IGFjdHMgbGlrZSBhIENsb3N1cmUgaW4gdGhhdCBpdCBjYW4gYmUgY2FsbGVkLCBsaWtlIGEgY2xvc3VyZQorICAgICAqIGFuZCBwYXNzZWQgYXJvdW5kIC0gdGhvdWdoIHJlYWxseSBpdHMgYSBtZXRob2QgcG9pbnRlciwgbm90IGEgY2xvc3VyZSBwZXIgc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2JqZWN0IHRoZSBvYmplY3QgY29udGFpbmluZyB0aGUgbWV0aG9kCisgICAgICogQHBhcmFtIG1ldGhvZE5hbWUgdGhlIG1ldGhvZCBvZiBpbnRlcmVzdAorICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdGluZyBjbG9zdXJlLWxpa2UgbWV0aG9kIHBvaW50ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENsb3N1cmUgZ2V0TWV0aG9kUG9pbnRlcihPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbWV0aG9kTmFtZSkgeworICAgICAgICByZXR1cm4gbmV3IE1ldGhvZENsb3N1cmUob2JqZWN0LCBtZXRob2ROYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFBhcmFtZXRlclR5cGVzIGdldFBhcmFtZXRlclR5cGVzKE9iamVjdCBtZXRob2RPckNvbnN0cnVjdG9yKSB7CisgICAgICAgIGlmIChtZXRob2RPckNvbnN0cnVjdG9yIGluc3RhbmNlb2YgUGFyYW1ldGVyVHlwZXMpIHsKKyAgICAgICAgICAgIHJldHVybiAoUGFyYW1ldGVyVHlwZXMpIG1ldGhvZE9yQ29uc3RydWN0b3I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1ldGhvZE9yQ29uc3RydWN0b3IgaW5zdGFuY2VvZiBNZXRhTWV0aG9kKSB7CisgICAgICAgICAgICByZXR1cm4gKChNZXRhTWV0aG9kKSBtZXRob2RPckNvbnN0cnVjdG9yKS5nZXRQYXJhbVR5cGVzKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1ldGhvZE9yQ29uc3RydWN0b3IgaW5zdGFuY2VvZiBNZXRob2QpIHsKKyAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSAoTWV0aG9kKSBtZXRob2RPckNvbnN0cnVjdG9yOworICAgICAgICAgICAgcmV0dXJuIENhY2hlZE1ldGhvZC5maW5kKG1ldGhvZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1ldGhvZE9yQ29uc3RydWN0b3IgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikgeworICAgICAgICAgICAgQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSAoQ29uc3RydWN0b3IpIG1ldGhvZE9yQ29uc3RydWN0b3I7CisgICAgICAgICAgICByZXR1cm4gQ2FjaGVkQ29uc3RydWN0b3IuZmluZChjb25zdHJ1Y3Rvcik7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTXVzdCBiZSBhIE1ldGhvZCBvciBDb25zdHJ1Y3RvciIpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Fzc2lnbmFibGVGcm9tKENsYXNzIGNsYXNzVG9UcmFuc2Zvcm1UbywgQ2xhc3MgY2xhc3NUb1RyYW5zZm9ybUZyb20pIHsKKyAgICAgICAgaWYgKGNsYXNzVG9UcmFuc2Zvcm1Gcm9tID09IG51bGwpIHJldHVybiB0cnVlOworICAgICAgICBjbGFzc1RvVHJhbnNmb3JtVG8gPSBSZWZsZWN0aW9uQ2FjaGUuYXV0b2JveFR5cGUoY2xhc3NUb1RyYW5zZm9ybVRvKTsKKyAgICAgICAgY2xhc3NUb1RyYW5zZm9ybUZyb20gPSBSZWZsZWN0aW9uQ2FjaGUuYXV0b2JveFR5cGUoY2xhc3NUb1RyYW5zZm9ybUZyb20pOworCisgICAgICAgIGlmIChjbGFzc1RvVHJhbnNmb3JtVG8gPT0gY2xhc3NUb1RyYW5zZm9ybUZyb20pIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIC8vIG5vdGU6IHRoZXJlIGlzIG5vdCBjb2VyY2lvbiBmb3IgYm9vbGVhbiBhbmQgY2hhci4gUmFuZ2UgbWF0dGVycywgcHJlY2lzaW9uIGRvZXNuJ3QKKyAgICAgICAgZWxzZSBpZiAoY2xhc3NUb1RyYW5zZm9ybVRvID09IEludGVnZXIuY2xhc3MpIHsKKyAgICAgICAgICAgIGlmIChjbGFzc1RvVHJhbnNmb3JtRnJvbSA9PSBJbnRlZ2VyLmNsYXNzCisgICAgICAgICAgICAgICAgICAgIHx8IGNsYXNzVG9UcmFuc2Zvcm1Gcm9tID09IFNob3J0LmNsYXNzCisgICAgICAgICAgICAgICAgICAgIHx8IGNsYXNzVG9UcmFuc2Zvcm1Gcm9tID09IEJ5dGUuY2xhc3MKKyAgICAgICAgICAgICAgICAgICAgfHwgY2xhc3NUb1RyYW5zZm9ybUZyb20gPT0gQmlnSW50ZWdlci5jbGFzcykKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChjbGFzc1RvVHJhbnNmb3JtVG8gPT0gRG91YmxlLmNsYXNzKSB7CisgICAgICAgICAgICBpZiAoY2xhc3NUb1RyYW5zZm9ybUZyb20gPT0gRG91YmxlLmNsYXNzCisgICAgICAgICAgICAgICAgICAgIHx8IGNsYXNzVG9UcmFuc2Zvcm1Gcm9tID09IEludGVnZXIuY2xhc3MKKyAgICAgICAgICAgICAgICAgICAgfHwgY2xhc3NUb1RyYW5zZm9ybUZyb20gPT0gTG9uZy5jbGFzcworICAgICAgICAgICAgICAgICAgICB8fCBjbGFzc1RvVHJhbnNmb3JtRnJvbSA9PSBTaG9ydC5jbGFzcworICAgICAgICAgICAgICAgICAgICB8fCBjbGFzc1RvVHJhbnNmb3JtRnJvbSA9PSBCeXRlLmNsYXNzCisgICAgICAgICAgICAgICAgICAgIHx8IGNsYXNzVG9UcmFuc2Zvcm1Gcm9tID09IEZsb2F0LmNsYXNzCisgICAgICAgICAgICAgICAgICAgIHx8IGNsYXNzVG9UcmFuc2Zvcm1Gcm9tID09IEJpZ0RlY2ltYWwuY2xhc3MKKyAgICAgICAgICAgICAgICAgICAgfHwgY2xhc3NUb1RyYW5zZm9ybUZyb20gPT0gQmlnSW50ZWdlci5jbGFzcykKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChjbGFzc1RvVHJhbnNmb3JtVG8gPT0gQmlnRGVjaW1hbC5jbGFzcykgeworICAgICAgICAgICAgaWYgKGNsYXNzVG9UcmFuc2Zvcm1Gcm9tID09IERvdWJsZS5jbGFzcworICAgICAgICAgICAgICAgICAgICB8fCBjbGFzc1RvVHJhbnNmb3JtRnJvbSA9PSBJbnRlZ2VyLmNsYXNzCisgICAgICAgICAgICAgICAgICAgIHx8IGNsYXNzVG9UcmFuc2Zvcm1Gcm9tID09IExvbmcuY2xhc3MKKyAgICAgICAgICAgICAgICAgICAgfHwgY2xhc3NUb1RyYW5zZm9ybUZyb20gPT0gU2hvcnQuY2xhc3MKKyAgICAgICAgICAgICAgICAgICAgfHwgY2xhc3NUb1RyYW5zZm9ybUZyb20gPT0gQnl0ZS5jbGFzcworICAgICAgICAgICAgICAgICAgICB8fCBjbGFzc1RvVHJhbnNmb3JtRnJvbSA9PSBGbG9hdC5jbGFzcworICAgICAgICAgICAgICAgICAgICB8fCBjbGFzc1RvVHJhbnNmb3JtRnJvbSA9PSBCaWdEZWNpbWFsLmNsYXNzCisgICAgICAgICAgICAgICAgICAgIHx8IGNsYXNzVG9UcmFuc2Zvcm1Gcm9tID09IEJpZ0ludGVnZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoY2xhc3NUb1RyYW5zZm9ybVRvID09IEJpZ0ludGVnZXIuY2xhc3MpIHsKKyAgICAgICAgICAgIGlmIChjbGFzc1RvVHJhbnNmb3JtRnJvbSA9PSBJbnRlZ2VyLmNsYXNzCisgICAgICAgICAgICAgICAgICAgIHx8IGNsYXNzVG9UcmFuc2Zvcm1Gcm9tID09IExvbmcuY2xhc3MKKyAgICAgICAgICAgICAgICAgICAgfHwgY2xhc3NUb1RyYW5zZm9ybUZyb20gPT0gU2hvcnQuY2xhc3MKKyAgICAgICAgICAgICAgICAgICAgfHwgY2xhc3NUb1RyYW5zZm9ybUZyb20gPT0gQnl0ZS5jbGFzcworICAgICAgICAgICAgICAgICAgICB8fCBjbGFzc1RvVHJhbnNmb3JtRnJvbSA9PSBCaWdJbnRlZ2VyLmNsYXNzKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKGNsYXNzVG9UcmFuc2Zvcm1UbyA9PSBMb25nLmNsYXNzKSB7CisgICAgICAgICAgICBpZiAoY2xhc3NUb1RyYW5zZm9ybUZyb20gPT0gTG9uZy5jbGFzcworICAgICAgICAgICAgICAgICAgICB8fCBjbGFzc1RvVHJhbnNmb3JtRnJvbSA9PSBJbnRlZ2VyLmNsYXNzCisgICAgICAgICAgICAgICAgICAgIHx8IGNsYXNzVG9UcmFuc2Zvcm1Gcm9tID09IFNob3J0LmNsYXNzCisgICAgICAgICAgICAgICAgICAgIHx8IGNsYXNzVG9UcmFuc2Zvcm1Gcm9tID09IEJ5dGUuY2xhc3MpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoY2xhc3NUb1RyYW5zZm9ybVRvID09IEZsb2F0LmNsYXNzKSB7CisgICAgICAgICAgICBpZiAoY2xhc3NUb1RyYW5zZm9ybUZyb20gPT0gRmxvYXQuY2xhc3MKKyAgICAgICAgICAgICAgICAgICAgfHwgY2xhc3NUb1RyYW5zZm9ybUZyb20gPT0gSW50ZWdlci5jbGFzcworICAgICAgICAgICAgICAgICAgICB8fCBjbGFzc1RvVHJhbnNmb3JtRnJvbSA9PSBMb25nLmNsYXNzCisgICAgICAgICAgICAgICAgICAgIHx8IGNsYXNzVG9UcmFuc2Zvcm1Gcm9tID09IFNob3J0LmNsYXNzCisgICAgICAgICAgICAgICAgICAgIHx8IGNsYXNzVG9UcmFuc2Zvcm1Gcm9tID09IEJ5dGUuY2xhc3MpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoY2xhc3NUb1RyYW5zZm9ybVRvID09IFNob3J0LmNsYXNzKSB7CisgICAgICAgICAgICBpZiAoY2xhc3NUb1RyYW5zZm9ybUZyb20gPT0gU2hvcnQuY2xhc3MKKyAgICAgICAgICAgICAgICAgICAgfHwgY2xhc3NUb1RyYW5zZm9ybUZyb20gPT0gQnl0ZS5jbGFzcykKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChjbGFzc1RvVHJhbnNmb3JtVG8gPT0gU3RyaW5nLmNsYXNzKSB7CisgICAgICAgICAgICBpZiAoY2xhc3NUb1RyYW5zZm9ybUZyb20gPT0gU3RyaW5nLmNsYXNzIHx8CisgICAgICAgICAgICAgICAgICAgIEdTdHJpbmcuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjbGFzc1RvVHJhbnNmb3JtRnJvbSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBSZWZsZWN0aW9uQ2FjaGUuaXNBc3NpZ25hYmxlRnJvbShjbGFzc1RvVHJhbnNmb3JtVG8sIGNsYXNzVG9UcmFuc2Zvcm1Gcm9tKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNHZW5lcmljU2V0TWV0aG9kKE1ldGFNZXRob2QgbWV0aG9kKSB7CisgICAgICAgIHJldHVybiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoInNldCIpKQorICAgICAgICAgICAgICAgICYmIG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aCA9PSAyOworICAgIH0KKworICAgIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc1N1cGVyY2xhc3MoQ2xhc3MgY2xhc3p6LCBDbGFzcyBzdXBlcmNsYXNzKSB7CisgICAgICAgIHdoaWxlIChjbGFzenogIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGNsYXN6eiA9PSBzdXBlcmNsYXNzKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGNsYXN6eiA9IGNsYXN6ei5nZXRTdXBlcmNsYXNzKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gcGFyYW1ldGVyc0FyZUNvbXBhdGlibGUoQ2xhc3NbXSBhcmd1bWVudHMsIENsYXNzW10gcGFyYW1ldGVycykgeworICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCAhPSBwYXJhbWV0ZXJzLmxlbmd0aCkgcmV0dXJuIGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKCFpc0Fzc2lnbmFibGVGcm9tKHBhcmFtZXRlcnNbaV0sIGFyZ3VtZW50c1tpXSkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZE1ldGhvZChQYXJhbWV0ZXJUeXBlcyBwdCwgQ2xhc3NbXSBhcmd1bWVudHMsIGJvb2xlYW4gaW5jbHVkZUNvZXJjZSkgeworICAgICAgICBpZiAoYXJndW1lbnRzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGludCBzaXplID0gYXJndW1lbnRzLmxlbmd0aDsKKworICAgICAgICBDYWNoZWRDbGFzc1tdIHBhcmFtVHlwZXMgPSBwdC5nZXRQYXJhbWV0ZXJUeXBlcygpOworICAgICAgICBpZiAoKHNpemUgPj0gcGFyYW1UeXBlcy5sZW5ndGggfHwgc2l6ZSA9PSBwYXJhbVR5cGVzLmxlbmd0aCAtIDEpCisgICAgICAgICAgICAgICAgJiYgcGFyYW1UeXBlcy5sZW5ndGggPiAwCisgICAgICAgICAgICAgICAgJiYgcGFyYW1UeXBlc1socGFyYW1UeXBlcy5sZW5ndGggLSAxKV0uaXNBcnJheSkgeworICAgICAgICAgICAgLy8gZmlyc3QgY2hlY2sgbm9ybWFsIG51bWJlciBvZiBwYXJhbWV0ZXJzCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtVHlwZXMubGVuZ3RoIC0gMTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzQXNzaWduYWJsZUZyb20ocGFyYW1UeXBlc1tpXS5nZXRDYWNoZWRDbGFzcygpLCBhcmd1bWVudHNbaV0pKSBjb250aW51ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBjaGVjayB2YXJnZWQKKyAgICAgICAgICAgIENsYXNzIGNsYXp6ID0gcGFyYW1UeXBlc1twYXJhbVR5cGVzLmxlbmd0aCAtIDFdLmdldENhY2hlZENsYXNzKCkuZ2V0Q29tcG9uZW50VHlwZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IHBhcmFtVHlwZXMubGVuZ3RoOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzQXNzaWduYWJsZUZyb20oY2xhenosIGFyZ3VtZW50c1tpXSkpIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKHBhcmFtVHlwZXMubGVuZ3RoID09IHNpemUpIHsKKyAgICAgICAgICAgIC8vIGxldHMgY2hlY2sgdGhlIHBhcmFtZXRlciB0eXBlcyBtYXRjaAorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNBc3NpZ25hYmxlRnJvbShwYXJhbVR5cGVzW2ldLmdldENhY2hlZENsYXNzKCksIGFyZ3VtZW50c1tpXSkpIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKHBhcmFtVHlwZXMubGVuZ3RoID09IDEgJiYgc2l6ZSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZE1ldGhvZChPYmplY3QgbWV0aG9kLCBDbGFzc1tdIGFyZ3VtZW50cywgYm9vbGVhbiBpbmNsdWRlQ29lcmNlKSB7CisgICAgICAgIHJldHVybiBpc1ZhbGlkTWV0aG9kKGdldFBhcmFtZXRlclR5cGVzKG1ldGhvZCksIGFyZ3VtZW50cywgaW5jbHVkZUNvZXJjZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZ01ldGhvZENhbGwoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1ldGhvZE5hbWUsIE9iamVjdFtdIGFyZ3VtZW50cykgeworICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZ2V0Q2xhc3NOYW1lKG9iamVjdCk7CisgICAgICAgIFN0cmluZyBsb2duYW1lID0gIm1ldGhvZENhbGxzLiIgKyBjbGFzc05hbWUgKyAiLiIgKyBtZXRob2ROYW1lOworICAgICAgICBMb2dnZXIgb2JqTG9nID0gTG9nZ2VyLmdldExvZ2dlcihsb2duYW1lKTsKKyAgICAgICAgaWYgKCFvYmpMb2cuaXNMb2dnYWJsZShMZXZlbC5GSU5FUikpIHJldHVybjsKKyAgICAgICAgU3RyaW5nQnVmZmVyIG1zZyA9IG5ldyBTdHJpbmdCdWZmZXIobWV0aG9kTmFtZSk7CisgICAgICAgIG1zZy5hcHBlbmQoIigiKTsKKyAgICAgICAgaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7KSB7CisgICAgICAgICAgICAgICAgbXNnLmFwcGVuZChub3JtYWxpemVkVmFsdWUoYXJndW1lbnRzW2ldKSk7CisgICAgICAgICAgICAgICAgaWYgKCsraSA8IGFyZ3VtZW50cy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgbXNnLmFwcGVuZCgiLCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtc2cuYXBwZW5kKCIpIik7CisgICAgICAgIG9iakxvZy5sb2dwKExldmVsLkZJTkVSLCBjbGFzc05hbWUsIG1zZy50b1N0cmluZygpLCAiY2FsbGVkIGZyb20gTWV0YUNsYXNzLmludm9rZU1ldGhvZCIpOworICAgIH0KKworICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIG5vcm1hbGl6ZWRWYWx1ZShPYmplY3QgYXJndW1lbnQpIHsKKyAgICAgICAgU3RyaW5nIHZhbHVlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdmFsdWUgPSBhcmd1bWVudC50b1N0cmluZygpOworICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCgpID4gTUFYX0FSR19MRU4pIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZygwLCBNQVhfQVJHX0xFTiAtIDIpICsgIi4uIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhcmd1bWVudCBpbnN0YW5jZW9mIFN0cmluZykgeworICAgICAgICAgICAgICAgIHZhbHVlID0gIlwnIiArIHZhbHVlICsgIlwnIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHZhbHVlID0gc2hvcnROYW1lKGFyZ3VtZW50KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgc2hvcnROYW1lKE9iamVjdCBvYmplY3QpIHsKKyAgICAgICAgaWYgKG9iamVjdCA9PSBudWxsIHx8IG9iamVjdC5nZXRDbGFzcygpID09IG51bGwpIHJldHVybiAidW5rbm93bkNsYXNzIjsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBnZXRDbGFzc05hbWUob2JqZWN0KTsKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgcmV0dXJuICJ1bmtub3duQ2xhc3NOYW1lIjsgLy8gKnZlcnkqIGRlZmVuc2l2ZS4uLgorICAgICAgICBpbnQgbGFzdERvdFBvcyA9IG5hbWUubGFzdEluZGV4T2YoJy4nKTsKKyAgICAgICAgaWYgKGxhc3REb3RQb3MgPCAwIHx8IGxhc3REb3RQb3MgPj0gbmFtZS5sZW5ndGgoKSAtIDEpIHJldHVybiBuYW1lOworICAgICAgICByZXR1cm4gbmFtZS5zdWJzdHJpbmcobGFzdERvdFBvcyArIDEpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3NbXSB3cmFwKENsYXNzW10gY2xhc3NlcykgeworICAgICAgICBDbGFzc1tdIHdyYXBwZWRBcmd1bWVudHMgPSBuZXcgQ2xhc3NbY2xhc3Nlcy5sZW5ndGhdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdyYXBwZWRBcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIENsYXNzIGMgPSBjbGFzc2VzW2ldOworICAgICAgICAgICAgaWYgKGMgPT0gbnVsbCkgY29udGludWU7CisgICAgICAgICAgICBpZiAoYy5pc1ByaW1pdGl2ZSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gSW50ZWdlci5UWVBFKSB7CisgICAgICAgICAgICAgICAgICAgIGMgPSBJbnRlZ2VyLmNsYXNzOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSBCeXRlLlRZUEUpIHsKKyAgICAgICAgICAgICAgICAgICAgYyA9IEJ5dGUuY2xhc3M7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjID09IExvbmcuVFlQRSkgeworICAgICAgICAgICAgICAgICAgICBjID0gTG9uZy5jbGFzczsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gRG91YmxlLlRZUEUpIHsKKyAgICAgICAgICAgICAgICAgICAgYyA9IERvdWJsZS5jbGFzczsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gRmxvYXQuVFlQRSkgeworICAgICAgICAgICAgICAgICAgICBjID0gRmxvYXQuY2xhc3M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChpc1N1cGVyY2xhc3MoYywgR1N0cmluZy5jbGFzcykpIHsKKyAgICAgICAgICAgICAgICBjID0gU3RyaW5nLmNsYXNzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JhcHBlZEFyZ3VtZW50c1tpXSA9IGM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHdyYXBwZWRBcmd1bWVudHM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9NZXRob2RDbG9zdXJlLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL01ldGhvZENsb3N1cmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWMxYzUwCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9NZXRob2RDbG9zdXJlLmphdmEKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZTsKKworaW1wb3J0IGdyb292eS5sYW5nLkNsb3N1cmU7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKKworCisvKioKKyAqIFJlcHJlc2VudHMgYSBtZXRob2Qgb24gYW4gb2JqZWN0IHVzaW5nIGEgY2xvc3VyZSB3aGljaCBjYW4gYmUgaW52b2tlZAorICogYXQgYW55IHRpbWUKKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIE1ldGhvZENsb3N1cmUgZXh0ZW5kcyBDbG9zdXJlIHsKKworICAgIHByaXZhdGUgU3RyaW5nIG1ldGhvZDsKKyAgICAKKyAgICBwdWJsaWMgTWV0aG9kQ2xvc3VyZShPYmplY3Qgb3duZXIsIFN0cmluZyBtZXRob2QpIHsKKyAgICAgICAgc3VwZXIob3duZXIpOworICAgICAgICB0aGlzLm1ldGhvZCA9IG1ldGhvZDsKKworICAgICAgICBmaW5hbCBDbGFzcyBjbGF6eiA9IG93bmVyLmdldENsYXNzKCk9PUNsYXNzLmNsYXNzPyhDbGFzcykgb3duZXI6b3duZXIuZ2V0Q2xhc3MoKTsKKyAgICAgICAgCisgICAgICAgIG1heGltdW1OdW1iZXJPZlBhcmFtZXRlcnMgPSAwOworICAgICAgICBwYXJhbWV0ZXJUeXBlcyA9IG5ldyBDbGFzcyBbMF07CisKKyAgICAgICAgTWV0aG9kW10gbWV0aG9kcyA9IChNZXRob2RbXSkgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3ICBQcml2aWxlZ2VkQWN0aW9uKCkgeworICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNsYXp6LmdldE1ldGhvZHMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbWV0aG9kcy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgaWYgKG1ldGhvZC5lcXVhbHMobWV0aG9kc1tqXS5nZXROYW1lKCkpICYmIG1ldGhvZHNbal0uZ2V0UGFyYW1ldGVyVHlwZXMoKS5sZW5ndGggPiBtYXhpbXVtTnVtYmVyT2ZQYXJhbWV0ZXJzKSB7CisgICAgICAgICAgICAgICAgQ2xhc3NbXSBwdCA9IG1ldGhvZHNbal0uZ2V0UGFyYW1ldGVyVHlwZXMoKTsKKyAgICAgICAgICAgICAgICBtYXhpbXVtTnVtYmVyT2ZQYXJhbWV0ZXJzID0gcHQubGVuZ3RoOworICAgICAgICAgICAgICAgIHBhcmFtZXRlclR5cGVzID0gcHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gICAgICAgIAorICAgICAgICBtZXRob2RzID0gKE1ldGhvZFtdKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgIFByaXZpbGVnZWRBY3Rpb24oKSB7CisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY2xhenouZ2V0RGVjbGFyZWRNZXRob2RzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG1ldGhvZHMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgIGlmIChtZXRob2QuZXF1YWxzKG1ldGhvZHNbal0uZ2V0TmFtZSgpKSAmJiBtZXRob2RzW2pdLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoID4gbWF4aW11bU51bWJlck9mUGFyYW1ldGVycykgeworICAgICAgICAgICAgICAgIENsYXNzW10gcHQgPSBtZXRob2RzW2pdLmdldFBhcmFtZXRlclR5cGVzKCk7CisgICAgICAgICAgICAgICAgbWF4aW11bU51bWJlck9mUGFyYW1ldGVycyA9IHB0Lmxlbmd0aDsKKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJUeXBlcyA9IHB0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXRNZXRob2QoKSB7CisgICAgICAgIHJldHVybiBtZXRob2Q7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE9iamVjdCBkb0NhbGwoT2JqZWN0IGFyZ3VtZW50cykgeworICAgICAgICByZXR1cm4gSW52b2tlckhlbHBlci5pbnZva2VNZXRob2QoZ2V0RGVsZWdhdGUoKSwgbWV0aG9kLCBhcmd1bWVudHMpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSkgeworICAgICAgICBpZiAoIm1ldGhvZCIuZXF1YWxzKHByb3BlcnR5KSkgeworICAgICAgICAgICAgcmV0dXJuIGdldE1ldGhvZCgpOworICAgICAgICB9IGVsc2UgIHJldHVybiBzdXBlci5nZXRQcm9wZXJ0eShwcm9wZXJ0eSk7ICAgICAgICAKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL01ldGhvZEtleS5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9NZXRob2RLZXkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjYzODlhCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9NZXRob2RLZXkuamF2YQpAQCAtMCwwICsxLDEzMSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisKKy8qKgorICogQW4gYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYSBrZXkgdXNlZCBmb3IgY29tcGFyYXRvcnMgYW5kIE1hcCBrZXlzIHRvIGxvb2t1cCBhIG1ldGhvZCBieQorICogbmFtZSBhbmQgcGFyYW1ldGVyIHR5cGVzCisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBNZXRob2RLZXkgeworCisgICAgcHJpdmF0ZSBpbnQgaGFzaDsKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworICAgIHByaXZhdGUgQ2xhc3Mgc2VuZGVyOworICAgIHByaXZhdGUgYm9vbGVhbiBpc0NhbGxUb1N1cGVyOworICAgIAorICAgIHB1YmxpYyBNZXRob2RLZXkoQ2xhc3Mgc2VuZGVyLCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBpc0NhbGxUb1N1cGVyKSB7CisgICAgICAgIHRoaXMuc2VuZGVyID0gc2VuZGVyOworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB0aGlzLmlzQ2FsbFRvU3VwZXIgPSBpc0NhbGxUb1N1cGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gaW1tdXRhYmxlIGNvcHkgdGhhdCB3ZSBjYW4gY2FjaGUuIAorICAgICAqLworICAgIHB1YmxpYyBNZXRob2RLZXkgY3JlYXRlQ29weSgpIHsKKyAgICAgICAgaW50IHNpemUgPSBnZXRQYXJhbWV0ZXJDb3VudCgpOworICAgICAgICBDbGFzc1tdIHBhcmFtVHlwZXMgPSBuZXcgQ2xhc3Nbc2l6ZV07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBwYXJhbVR5cGVzW2ldID0gZ2V0UGFyYW1ldGVyVHlwZShpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRNZXRob2RLZXkoc2VuZGVyLCBuYW1lLCBwYXJhbVR5cGVzLCBpc0NhbGxUb1N1cGVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHRoYXQpIHsKKyAgICAgICAgaWYgKHRoaXMgPT0gdGhhdCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodGhhdCBpbnN0YW5jZW9mIE1ldGhvZEtleSkgeworICAgICAgICAgICAgcmV0dXJuIGVxdWFscygoTWV0aG9kS2V5KSB0aGF0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE1ldGhvZEtleSB0aGF0KSB7CisgICAgICBpbnQgc2l6ZTsKKyAgICAgIGlmIChzZW5kZXIhPXRoYXQuc2VuZGVyKSByZXR1cm4gZmFsc2U7CisgICAgICBpZiAoaXNDYWxsVG9TdXBlciE9dGhhdC5pc0NhbGxUb1N1cGVyKSByZXR1cm4gZmFsc2U7CisgICAgICBpZiAoIW5hbWUuZXF1YWxzKHRoYXQubmFtZSkpIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICgoc2l6ZSA9IGdldFBhcmFtZXRlckNvdW50KCkpICE9IHRoYXQuZ2V0UGFyYW1ldGVyQ291bnQoKSkgcmV0dXJuIGZhbHNlOworICAgICAgCisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgIGlmIChnZXRQYXJhbWV0ZXJUeXBlKGkpICE9IHRoYXQuZ2V0UGFyYW1ldGVyVHlwZShpKSkgeworICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaWYgKGhhc2ggPT0gMCkgeworICAgICAgICAgICAgaGFzaCA9IGNyZWF0ZUhhc2hDb2RlKCk7CisgICAgICAgICAgICBpZiAoaGFzaCA9PSAwKSB7CisgICAgICAgICAgICAgICAgaGFzaCA9IDB4Y2FmZWJhYmU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCkgKyAiW25hbWU6IiArIG5hbWUgKyAiOyBwYXJhbXM6IiArIGdldFBhcmFtdGVyVHlwZXMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0IGdldFBhcmFtdGVyVHlwZXMoKSB7CisgICAgICAgIGludCBzaXplID0gZ2V0UGFyYW1ldGVyQ291bnQoKTsKKyAgICAgICAgaWYgKHNpemUgPD0gMCkgeworICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7CisgICAgICAgIH0KKyAgICAgICAgTGlzdCBwYXJhbXMgPSBuZXcgQXJyYXlMaXN0KHNpemUpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgcGFyYW1zLmFkZChnZXRQYXJhbWV0ZXJUeXBlKGkpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGFyYW1zOworICAgIH0KKworICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0UGFyYW1ldGVyQ291bnQoKTsKKyAgICBwdWJsaWMgYWJzdHJhY3QgQ2xhc3MgZ2V0UGFyYW1ldGVyVHlwZShpbnQgaW5kZXgpOworCisgICAgcHJvdGVjdGVkIGludCBjcmVhdGVIYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IGFuc3dlciA9IG5hbWUuaGFzaENvZGUoKTsKKyAgICAgICAgaW50IHNpemUgPSBnZXRQYXJhbWV0ZXJDb3VudCgpOworCisgICAgICAgIC8qKiBAdG9kbyB3ZSBzaG91bGQgdXNlIHRoZSByZWFsIEpvc2ggQmxvY2ggYWxnb3JpdGhtIGhlcmUgKi8KKworICAgICAgICAvLyBjYW4ndCByZW1lbWJlciB0aGUgZXhhY3QgSm9zaCBCbG9jaCBhbGdvcml0aG0gYW5kIEkndmUgbm90IGdvdCB0aGUgYm9vayBoYW5keQorICAgICAgICAvLyBidXQgaXRzIHNvbWV0aGluZyBsaWtlIHRoaXMgSUlSQworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgYW5zd2VyICo9IDM3OworICAgICAgICAgICAgYW5zd2VyICs9IDEgKyBnZXRQYXJhbWV0ZXJUeXBlKGkpLmhhc2hDb2RlKCk7CisgICAgICAgIH0KKyAgICAgICAgYW5zd2VyICo9IDM3OworICAgICAgICBhbnN3ZXIgKz0gaXNDYWxsVG9TdXBlcj8xOjA7CisgICAgICAgIGFuc3dlciAqPSAzNzsKKyAgICAgICAgYW5zd2VyICs9IDEgKyBzZW5kZXIuaGFzaENvZGUoKTsKKyAgICAgICAgcmV0dXJuIGFuc3dlcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL051bGxPYmplY3QuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvTnVsbE9iamVjdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMWNlNzEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL051bGxPYmplY3QuamF2YQpAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZTsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlPYmplY3RTdXBwb3J0OworCitwdWJsaWMgY2xhc3MgTnVsbE9iamVjdCBleHRlbmRzIEdyb292eU9iamVjdFN1cHBvcnQgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE51bGxPYmplY3QgSU5TVEFOQ0UgPSBuZXcgTnVsbE9iamVjdCgpOworCisgICAgLyoqCisgICAgICogcHJpdmF0ZSBjb25zdHJ1Y3RvcgorICAgICAqLworICAgIHByaXZhdGUgTnVsbE9iamVjdCgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXQgdGhlIE51bGxPYmplY3QgcmVmZXJlbmNlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBudWxsIG9iamVjdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTnVsbE9iamVjdCBnZXROdWxsT2JqZWN0KCkgeworICAgICAgICByZXR1cm4gSU5TVEFOQ0U7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2luY2UgdGhpcyBpcyBpbXBsZW1lbnRlZCBhcyBhIHNpbmdsZXRvbiwgd2Ugc2hvdWxkIGF2b2lkIHRoZQorICAgICAqIHVzZSBvZiB0aGUgY2xvbmUgbWV0aG9kCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHRocm93cyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyaWVzIHRvIGdldCBhIHByb3BlcnR5IG9uIG51bGwsIHdoaWNoIHdpbGwgYWx3YXlzIGZhaWwKKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9wZXJ0eSAtIHRoZSBwcm9wZXJ0eSB0byBnZXQKKyAgICAgKiBAcmV0dXJuIGEgTlBFCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHkpIHsKKyAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJDYW5ub3QgZ2V0IHByb3BlcnR5ICIgKyBwcm9wZXJ0eSArICIoKSBvbiBudWxsIG9iamVjdCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyaWVzIHRvIHNldCBhIHByb3BlcnR5IG9uIG51bGwsIHdoaWNoIHdpbGwgYWx3YXlzIGZhaWwKKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9wZXJ0eSAtIHRoZSBwcm9wcnR5IHRvIHNldAorICAgICAqIEBwYXJhbSBuZXdWYWx1ZSAtIHRoZSBuZXcgdmFsdWUgb2YgdGhlIHByb3BlcnR5CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgbmV3VmFsdWUpIHsKKyAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJDYW5ub3Qgc2V0IHByb3BlcnR5ICIgKyBwcm9wZXJ0eSArICIoKSBvbiBudWxsIG9iamVjdCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyaWVzIHRvIGludm9rZSBhIG1ldGhvZCBvbiBudWxsLCB3aGljaCB3aWxsIGFsd2F5cyBmYWlsCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIHRvIGludm9rZQorICAgICAqIEBwYXJhbSBhcmdzIC0gYXJndW1lbnRzIHRvIHRoZSBtZXRob2QKKyAgICAgKiBAcmV0dXJuIGEgTlBFCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBpbnZva2VNZXRob2QoU3RyaW5nIG5hbWUsIE9iamVjdCBhcmdzKSB7CisgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiQ2Fubm90IGludm9rZSBtZXRob2QgIiArIG5hbWUgKyAiKCkgb24gbnVsbCBvYmplY3QiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBudWxsIGlzIG9ubHkgZXF1YWwgdG8gbnVsbAorICAgICAqCisgICAgICogQHBhcmFtIHRvIC0gdGhlIHJlZmVyZW5jZSBvYmplY3Qgd2l0aCB3aGljaCB0byBjb21wYXJlCisgICAgICogQHJldHVybiAtIHRydWUgaWYgdGhpcyBvYmplY3QgaXMgdGhlIHNhbWUgYXMgdGhlIHRvIGFyZ3VtZW50CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCB0bykgeworICAgICAgICByZXR1cm4gdG8gPT0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpdGVyYXRvcigpIG1ldGhvZCB0byBiZSBhYmxlIHRvIGl0ZXJhdGUgb24gbnVsbC4KKyAgICAgKiBOb3RlOiB0aGlzIHBhcnQgaXMgZnJvbSBJbnZva2VyCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yIGZvciBhbiBlbXB0eSBsaXN0CisgICAgICovCisgICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgeworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFsbG93cyB0byBhZGQgYSBTdHJpbmcgdG8gbnVsbC4KKyAgICAgKiBUaGUgcmVzdWx0IGlzIGNvbmNhdGVuYXRlZCBTdHJpbmcgb2YgdGhlIHJlc3VsdCBvZiBjYWxsaW5nCisgICAgICogdG9TdHJpbmcoKSBvbiB0aGlzIG9iamVjdCBhbmQgdGhlIFN0cmluZyBpbiB0aGUgcGFyYW1ldGVyLgorICAgICAqCisgICAgICogQHBhcmFtIHMgLSB0aGUgU3RyaW5nIHRvIGNvbmNhdGVuYXRlCisgICAgICogQHJldHVybiB0aGUgY29uY2F0ZW5hdGVkIHN0cmluZworICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgcGx1cyhTdHJpbmcgcykgeworICAgICAgICByZXR1cm4gZ2V0TWV0YUNsYXNzKCkuaW52b2tlTWV0aG9kKHRoaXMsICJ0b1N0cmluZyIsIG5ldyBPYmplY3RbXXt9KSArIHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG1ldGhvZCAiaXMiIGlzIHVzZWQgdG8gdGVzdCBmb3IgZXF1YWwgcmVmZXJlbmNlcy4KKyAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiB0cnVlIG9ubHkgaWYgdGhlIGdpdmVuIHBhcmFtZXRlcgorICAgICAqIGlzIG51bGwKKyAgICAgKgorICAgICAqIEBwYXJhbSBvdGhlciAtIHRoZSBvYmplY3QgdG8gdGVzdAorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBvdGhlciBpcyBudWxsCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXMoT2JqZWN0IG90aGVyKSB7CisgICAgICAgIHJldHVybiBvdGhlciA9PSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFR5cGUgY29udmVyc2lvbiBtZXRob2QgZm9yIG51bGwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYyAtIHRoZSBjbGFzcyB0byBjb252ZXJ0IHRvCisgICAgICogQHJldHVybiBhbHdheXMgbnVsbAorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgYXNUeXBlKENsYXNzIGMpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJudWxsIjsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImhhc2hDb2RlKCkgbm90IGFsbG93ZWQgb24gbnVsbCIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvUmVmbGVjdGlvbk1ldGhvZEludm9rZXIuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvUmVmbGVjdGlvbk1ldGhvZEludm9rZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTBhODU2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9SZWZsZWN0aW9uTWV0aG9kSW52b2tlci5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWU7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIHRvIGNhbGwgbWV0aG9kcyB0aHJvdWdoIHJlZmxlY3Rpb24sIGFuZCBmYWxscyB0aHJvdWdoIHVzaW5nIHRoZSA8Y29kZT5JbnZva2VyPC9jb2RlPiB0byBjYWxsIHRoZSBtZXRob2QgaWYgaXQgZmFpbHMuCisgKiBUaGUgY2xhc3MgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgR3Jvb3Z5IGNsYXNzZXMgaW1wbGVtZW50aW5nIDxjb2RlPkdyb292eUludGVyY3BldGFibGU8L2NvZGU+LAorICogc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGNhbGwgYW55IG1ldGhvZCBmcm9tIHRoaXMgY2xhc3MsCisgKiBiZWNhdXNlIGl0IGlzIGludGVyY2VwdGVkIGJ5IHRoZSA8Y29kZT5pbnZva2VNZXRob2QoKTwvY29kZT4gbWV0aG9kLgorICoKKyAqIEBhdXRob3IgR3VpbGxhdW1lIExhZm9yZ2UKKyAqLworcHVibGljIGNsYXNzIFJlZmxlY3Rpb25NZXRob2RJbnZva2VyIHsKKworICAgIC8qKgorICAgICAqIEludm9rZSBhIG1ldGhvZCB0aHJvdWdoIHJlZmxlY3Rpb24uCisgICAgICogRmFsbHMgdGhyb3VnaCB0byB1c2luZyB0aGUgSW52b2tlciB0byBjYWxsIHRoZSBtZXRob2QgaW4gY2FzZSB0aGUgcmVmbGVjdGlvbiBjYWxsIGZhaWxzLi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvYmplY3QgdGhlIG9iamVjdCBvbiB3aGljaCB0byBpbnZva2UgYSBtZXRob2QKKyAgICAgKiBAcGFyYW0gbWV0aG9kTmFtZSB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIHRvIGludm9rZQorICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBtZXRob2QgY2FsbAorICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgbWV0aG9kIGNhbGwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBpbnZva2UoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1ldGhvZE5hbWUsIE9iamVjdFtdIHBhcmFtZXRlcnMpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENsYXNzW10gY2xhc3NUeXBlcyA9IG5ldyBDbGFzc1twYXJhbWV0ZXJzLmxlbmd0aF07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzVHlwZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBjbGFzc1R5cGVzW2ldID0gcGFyYW1ldGVyc1tpXS5nZXRDbGFzcygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9IG9iamVjdC5nZXRDbGFzcygpLmdldE1ldGhvZChtZXRob2ROYW1lLCBjbGFzc1R5cGVzKTsKKyAgICAgICAgICAgIHJldHVybiBtZXRob2QuaW52b2tlKG9iamVjdCwgcGFyYW1ldGVycyk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICByZXR1cm4gSW52b2tlckhlbHBlci5pbnZva2VNZXRob2Qob2JqZWN0LCBtZXRob2ROYW1lLCAgcGFyYW1ldGVycyk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvUmVmbGVjdG9yLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL1JlZmxlY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNDE5YzYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL1JlZmxlY3Rvci5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWU7CisKK2ltcG9ydCBncm9vdnkubGFuZy5NaXNzaW5nTWV0aG9kRXhjZXB0aW9uOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucmVmbGVjdGlvbi5DYWNoZWRNZXRob2Q7CisKKworLyoqCisgKiBQcm92aWRlcyBhcyBhbHRlcm5hdGl2ZSB0byByZWZsZWN0aW9uIHVzaW5nIGJ5dGVjb2RlIGdlbmVyYXRpb24uCisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb246IDQyNDcgJAorICovCitwdWJsaWMgY2xhc3MgUmVmbGVjdG9yIHsKKworICAgIHB1YmxpYyBPYmplY3QgaW52b2tlKENhY2hlZE1ldGhvZCBtZXRob2QsIE9iamVjdCBvYmplY3QsIE9iamVjdFtdIGFyZ3VtZW50cykgeworICAgICAgICByZXR1cm4gbm9TdWNoTWV0aG9kKG1ldGhvZCwgb2JqZWN0LCBhcmd1bWVudHMpOworICAgIH0KKworICAgIHByb3RlY3RlZCBPYmplY3Qgbm9TdWNoTWV0aG9kKENhY2hlZE1ldGhvZCBtZXRob2QsIE9iamVjdCBvYmplY3QsIE9iamVjdFtdIGFyZ3VtZW50cykgeworICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ01ldGhvZEV4Y2VwdGlvbihtZXRob2QuZ2V0TmFtZSgpLCBtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKSwgYXJndW1lbnRzLCBmYWxzZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9SZWdleFN1cHBvcnQuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvUmVnZXhTdXBwb3J0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRjYWY2ZAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvUmVnZXhTdXBwb3J0LmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZTsKKworaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOworCisvKioKKyAqIENyZWF0ZWQgYnkgSW50ZWxsaUogSURFQS4KKyAqIFVzZXI6IHNhbQorICovCitwdWJsaWMgY2xhc3MgUmVnZXhTdXBwb3J0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFRocmVhZExvY2FsIENVUlJFTlRfTUFUQ0hFUiA9IG5ldyBUaHJlYWRMb2NhbCgpOworCisgICAgcHVibGljIHN0YXRpYyBNYXRjaGVyIGdldExhc3RNYXRjaGVyKCkgeworICAgICAgICByZXR1cm4gKE1hdGNoZXIpIENVUlJFTlRfTUFUQ0hFUi5nZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0TGFzdE1hdGNoZXIoTWF0Y2hlciBtYXRjaGVyKSB7CisgICAgICAgIENVUlJFTlRfTUFUQ0hFUi5zZXQobWF0Y2hlcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9TY3JpcHRCeXRlY29kZUFkYXB0ZXIuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvU2NyaXB0Qnl0ZWNvZGVBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FkOGQxNgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvU2NyaXB0Qnl0ZWNvZGVBZGFwdGVyLmphdmEKQEAgLTAsMCArMSw4MDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWU7CisKK2ltcG9ydCBncm9vdnkubGFuZy4qOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5tZXRhY2xhc3MuTWlzc2luZ01ldGhvZEV4Y2VwdGlvbk5vU3RhY2s7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLm1ldGFjbGFzcy5NaXNzaW5nUHJvcGVydHlFeGNlcHRpb25Ob1N0YWNrOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS50eXBlaGFuZGxpbmcuRGVmYXVsdFR5cGVUcmFuc2Zvcm1hdGlvbjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUud3JhcHBlcnMuR3Jvb3Z5T2JqZWN0V3JhcHBlcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUud3JhcHBlcnMuUG9qb1dyYXBwZXI7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLndyYXBwZXJzLldyYXBwZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKKworLyoqCisgKiBBIHN0YXRpYyBoZWxwZXIgY2xhc3MgdG8gaW50ZXJmYWNlIGJ5dGVjb2RlIGFuZCBydW50aW1lCisgKgorICogQGF1dGhvciBKb2NoZW4gVGhlb2Rvcm91CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBTY3JpcHRCeXRlY29kZUFkYXB0ZXIgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0W10gRU1QVFlfQVJHUyA9IHt9OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEludGVnZXIgWkVSTyA9IG5ldyBJbnRlZ2VyKDApOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEludGVnZXIgTUlOVVNfT05FID0gbmV3IEludGVnZXIoLTEpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEludGVnZXIgT05FID0gbmV3IEludGVnZXIoMSk7CisKKyAgICAvLyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyAgICAgICAgICAgICAgICAgICBleGNlcHRpb24gaGFuZGxpbmcKKyAgICAvLyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBwcml2YXRlIHN0YXRpYyBUaHJvd2FibGUgdW53cmFwKEdyb292eVJ1bnRpbWVFeGNlcHRpb24gZ3JlKSB7CisgICAgICAgIGlmIChncmUgaW5zdGFuY2VvZiBNaXNzaW5nUHJvcGVydHlFeGNlcHRpb25Ob1N0YWNrKSB7CisgICAgICAgICAgICBNaXNzaW5nUHJvcGVydHlFeGNlcHRpb25Ob1N0YWNrIG5vU3RhY2sgPSAoTWlzc2luZ1Byb3BlcnR5RXhjZXB0aW9uTm9TdGFjaykgZ3JlOworICAgICAgICAgICAgcmV0dXJuIG5ldyBNaXNzaW5nUHJvcGVydHlFeGNlcHRpb24obm9TdGFjay5nZXRQcm9wZXJ0eSgpLCBub1N0YWNrLmdldFR5cGUoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZ3JlIGluc3RhbmNlb2YgTWlzc2luZ01ldGhvZEV4Y2VwdGlvbk5vU3RhY2spIHsKKyAgICAgICAgICAgIE1pc3NpbmdNZXRob2RFeGNlcHRpb25Ob1N0YWNrIG5vU3RhY2sgPSAoTWlzc2luZ01ldGhvZEV4Y2VwdGlvbk5vU3RhY2spIGdyZTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTWlzc2luZ01ldGhvZEV4Y2VwdGlvbihub1N0YWNrLmdldE1ldGhvZCgpLCBub1N0YWNrLmdldFR5cGUoKSwgbm9TdGFjay5nZXRBcmd1bWVudHMoKSwgbm9TdGFjay5pc1N0YXRpYygpKTsKKyAgICAgICAgfQorCisgICAgICAgIFRocm93YWJsZSB0aCA9IGdyZTsKKyAgICAgICAgaWYgKHRoLmdldENhdXNlKCkgIT0gbnVsbCAmJiB0aC5nZXRDYXVzZSgpICE9IGdyZSkgdGggPSB0aC5nZXRDYXVzZSgpOworICAgICAgICBpZiAodGggIT0gZ3JlICYmICh0aCBpbnN0YW5jZW9mIEdyb292eVJ1bnRpbWVFeGNlcHRpb24pKSByZXR1cm4gdW53cmFwKChHcm9vdnlSdW50aW1lRXhjZXB0aW9uKSB0aCk7CisgICAgICAgIHJldHVybiB0aDsKKyAgICB9CisKKyAgICAvLyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kcyBmb3IgdGhpcworICAgIC8vICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGludm9rZU1ldGhvZE9uQ3VycmVudE4oQ2xhc3Mgc2VuZGVyQ2xhc3MsIEdyb292eU9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1lc3NhZ2VOYW1lLCBPYmplY3RbXSBtZXNzYWdlQXJndW1lbnRzKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vIGlmIGl0J3MgYSBwdXJlIGludGVyY2VwdGFibGUgb2JqZWN0IChldmVuIGludGVyY2VwdGluZyB0b1N0cmluZygpLCBjbG9uZSgpLCAuLi4pCisgICAgICAgICAgICAgICAgaWYgKHJlY2VpdmVyIGluc3RhbmNlb2YgR3Jvb3Z5SW50ZXJjZXB0YWJsZSkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZWNlaXZlci5pbnZva2VNZXRob2QobWVzc2FnZU5hbWUsIG1lc3NhZ2VBcmd1bWVudHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvL2Vsc2UgaWYgdGhlcmUncyBhIHN0YXRpY2FsbHkgdHlwZWQgbWV0aG9kIG9yIGEgR0RLIG1ldGhvZAorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZWNlaXZlci5nZXRNZXRhQ2xhc3MoKS5pbnZva2VNZXRob2Qoc2VuZGVyQ2xhc3MsIHJlY2VpdmVyLCBtZXNzYWdlTmFtZSwgbWVzc2FnZUFyZ3VtZW50cywgZmFsc2UsIHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKE1pc3NpbmdNZXRob2RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGlmIChyZWNlaXZlci5nZXRDbGFzcygpID09IGUuZ2V0VHlwZSgpICYmIGUuZ2V0TWV0aG9kKCkuZXF1YWxzKG1lc3NhZ2VOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBpbiBjYXNlIHRoZXJlJ3Mgbm90aGluZyBlbHNlLCBpbnZva2UgdGhlIG9iamVjdCdzIG93biBpbnZva2VNZXRob2QoKQorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZWNlaXZlci5pbnZva2VNZXRob2QobWVzc2FnZU5hbWUsIG1lc3NhZ2VBcmd1bWVudHMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChHcm9vdnlSdW50aW1lRXhjZXB0aW9uIHQpIHsKKyAgICAgICAgICAgIHRocm93IHVud3JhcCh0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGludm9rZU1ldGhvZE9uQ3VycmVudE5TYWZlKENsYXNzIHNlbmRlckNsYXNzLCBHcm9vdnlPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXNzYWdlTmFtZSwgT2JqZWN0W10gbWVzc2FnZUFyZ3VtZW50cykgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIHJldHVybiBpbnZva2VNZXRob2RPbkN1cnJlbnROKHNlbmRlckNsYXNzLCByZWNlaXZlciwgbWVzc2FnZU5hbWUsIG1lc3NhZ2VBcmd1bWVudHMpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGludm9rZU1ldGhvZE9uQ3VycmVudE5TcHJlYWRTYWZlKENsYXNzIHNlbmRlckNsYXNzLCBHcm9vdnlPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXNzYWdlTmFtZSwgT2JqZWN0W10gbWVzc2FnZUFyZ3VtZW50cykgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGlmICghaXNTcHJlYWRhYmxlKHJlY2VpdmVyKSkKKyAgICAgICAgICAgIHJldHVybiBpbnZva2VNZXRob2RPbkN1cnJlbnROKHNlbmRlckNsYXNzLCByZWNlaXZlciwgbWVzc2FnZU5hbWUsIG1lc3NhZ2VBcmd1bWVudHMpOworCisgICAgICAgIExpc3QgYW5zd2VyID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gSW52b2tlckhlbHBlci5hc0l0ZXJhdG9yKHJlY2VpdmVyKTsgaXQuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgYW5zd2VyLmFkZChpbnZva2VNZXRob2ROU2FmZShzZW5kZXJDbGFzcywgaXQubmV4dCgpLCBtZXNzYWdlTmFtZSwgbWVzc2FnZUFyZ3VtZW50cykpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhbnN3ZXI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW52b2tlTWV0aG9kT25DdXJyZW50MChDbGFzcyBzZW5kZXJDbGFzcywgR3Jvb3Z5T2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWVzc2FnZU5hbWUpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kT25DdXJyZW50TihzZW5kZXJDbGFzcywgcmVjZWl2ZXIsIG1lc3NhZ2VOYW1lLCBFTVBUWV9BUkdTKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBpbnZva2VNZXRob2RPbkN1cnJlbnQwU2FmZShDbGFzcyBzZW5kZXJDbGFzcywgR3Jvb3Z5T2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWVzc2FnZU5hbWUsIE9iamVjdFtdIG1lc3NhZ2VBcmd1bWVudHMpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kT25DdXJyZW50TlNhZmUoc2VuZGVyQ2xhc3MsIHJlY2VpdmVyLCBtZXNzYWdlTmFtZSwgRU1QVFlfQVJHUyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW52b2tlTWV0aG9kT25DdXJyZW50MFNwcmVhZFNhZmUoQ2xhc3Mgc2VuZGVyQ2xhc3MsIEdyb292eU9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1lc3NhZ2VOYW1lLCBPYmplY3RbXSBtZXNzYWdlQXJndW1lbnRzKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZE9uQ3VycmVudE5TcHJlYWRTYWZlKHNlbmRlckNsYXNzLCByZWNlaXZlciwgbWVzc2FnZU5hbWUsIEVNUFRZX0FSR1MpOworICAgIH0KKworICAgIC8vICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RzIGZvciBzdXBlcgorICAgIC8vICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGludm9rZU1ldGhvZE9uU3VwZXJOKENsYXNzIHNlbmRlckNsYXNzLCBHcm9vdnlPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXNzYWdlTmFtZSwgT2JqZWN0W10gbWVzc2FnZUFyZ3VtZW50cykgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIE1ldGFDbGFzcyBtZXRhQ2xhc3MgPSByZWNlaXZlci5nZXRNZXRhQ2xhc3MoKTsKKyAgICAgICAgLy8gaWdub3JlIGludGVyY2VwdGlvbiBhbmQgbWlzc2luZyBtZXRob2QgZmFsbGJhY2sKKyAgICAgICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXN1bHQgPSBtZXRhQ2xhc3MuaW52b2tlTWV0aG9kKHNlbmRlckNsYXNzLCByZWNlaXZlciwgbWVzc2FnZU5hbWUsIG1lc3NhZ2VBcmd1bWVudHMsIHRydWUsIHRydWUpOworICAgICAgICB9IGNhdGNoIChHcm9vdnlSdW50aW1lRXhjZXB0aW9uIHQpIHsKKyAgICAgICAgICAgIHRocm93IHVud3JhcCh0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGludm9rZU1ldGhvZE9uU3VwZXJOU2FmZShDbGFzcyBzZW5kZXJDbGFzcywgR3Jvb3Z5T2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWVzc2FnZU5hbWUsIE9iamVjdFtdIG1lc3NhZ2VBcmd1bWVudHMpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kT25TdXBlck4oc2VuZGVyQ2xhc3MsIHJlY2VpdmVyLCBtZXNzYWdlTmFtZSwgbWVzc2FnZUFyZ3VtZW50cyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW52b2tlTWV0aG9kT25TdXBlck5TcHJlYWRTYWZlKENsYXNzIHNlbmRlckNsYXNzLCBHcm9vdnlPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXNzYWdlTmFtZSwgT2JqZWN0W10gbWVzc2FnZUFyZ3VtZW50cykgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGlmICghaXNTcHJlYWRhYmxlKHJlY2VpdmVyKSkKKyAgICAgICAgICAgIHJldHVybiBpbnZva2VNZXRob2RPblN1cGVyTihzZW5kZXJDbGFzcywgcmVjZWl2ZXIsIG1lc3NhZ2VOYW1lLCBtZXNzYWdlQXJndW1lbnRzKTsKKworICAgICAgICBMaXN0IGFuc3dlciA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IEludm9rZXJIZWxwZXIuYXNJdGVyYXRvcihyZWNlaXZlcik7IGl0Lmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIGFuc3dlci5hZGQoaW52b2tlTWV0aG9kTlNhZmUoc2VuZGVyQ2xhc3MsIGl0Lm5leHQoKSwgbWVzc2FnZU5hbWUsIG1lc3NhZ2VBcmd1bWVudHMpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYW5zd2VyOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGludm9rZU1ldGhvZE9uU3VwZXIwKENsYXNzIHNlbmRlckNsYXNzLCBHcm9vdnlPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXNzYWdlTmFtZSkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIHJldHVybiBpbnZva2VNZXRob2RPblN1cGVyTihzZW5kZXJDbGFzcywgcmVjZWl2ZXIsIG1lc3NhZ2VOYW1lLCBFTVBUWV9BUkdTKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBpbnZva2VNZXRob2RPblN1cGVyMFNhZmUoQ2xhc3Mgc2VuZGVyQ2xhc3MsIEdyb292eU9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1lc3NhZ2VOYW1lLCBPYmplY3RbXSBtZXNzYWdlQXJndW1lbnRzKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZE9uU3VwZXJOU2FmZShzZW5kZXJDbGFzcywgcmVjZWl2ZXIsIG1lc3NhZ2VOYW1lLCBFTVBUWV9BUkdTKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBpbnZva2VNZXRob2RPblN1cGVyMFNwcmVhZFNhZmUoQ2xhc3Mgc2VuZGVyQ2xhc3MsIEdyb292eU9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1lc3NhZ2VOYW1lLCBPYmplY3RbXSBtZXNzYWdlQXJndW1lbnRzKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZE9uU3VwZXJOU3ByZWFkU2FmZShzZW5kZXJDbGFzcywgcmVjZWl2ZXIsIG1lc3NhZ2VOYW1lLCBFTVBUWV9BUkdTKTsKKyAgICB9CisKKyAgICAvLyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyAgICAgICAgICAgICAgbm9ybWFsIG1ldGhvZCBpbnZvY2F0aW9uCisgICAgLy8gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgIAorICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGludm9rZU1ldGhvZE4oQ2xhc3Mgc2VuZGVyQ2xhc3MsIE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1lc3NhZ2VOYW1lLCBPYmplY3RbXSBtZXNzYWdlQXJndW1lbnRzKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBJbnZva2VySGVscGVyLmludm9rZU1ldGhvZChyZWNlaXZlciwgbWVzc2FnZU5hbWUsIG1lc3NhZ2VBcmd1bWVudHMpOworICAgICAgICB9IGNhdGNoIChHcm9vdnlSdW50aW1lRXhjZXB0aW9uIGdyZSkgeworICAgICAgICAgICAgdGhyb3cgdW53cmFwKGdyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBpbnZva2VNZXRob2ROU2FmZShDbGFzcyBzZW5kZXJDbGFzcywgT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWVzc2FnZU5hbWUsIE9iamVjdFtdIG1lc3NhZ2VBcmd1bWVudHMpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBpZiAocmVjZWl2ZXIgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisgICAgICAgIHJldHVybiBpbnZva2VNZXRob2ROKHNlbmRlckNsYXNzLCByZWNlaXZlciwgbWVzc2FnZU5hbWUsIG1lc3NhZ2VBcmd1bWVudHMpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGludm9rZU1ldGhvZE5TcHJlYWRTYWZlKENsYXNzIHNlbmRlckNsYXNzLCBPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXNzYWdlTmFtZSwgT2JqZWN0W10gbWVzc2FnZUFyZ3VtZW50cykgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGlmIChyZWNlaXZlciA9PSBudWxsKSByZXR1cm4gbnVsbDsKKyAgICAgICAgaWYgKCFpc1NwcmVhZGFibGUocmVjZWl2ZXIpKQorICAgICAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZE4oc2VuZGVyQ2xhc3MsIHJlY2VpdmVyLCBtZXNzYWdlTmFtZSwgbWVzc2FnZUFyZ3VtZW50cyk7CisKKyAgICAgICAgTGlzdCBhbnN3ZXIgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBJbnZva2VySGVscGVyLmFzSXRlcmF0b3IocmVjZWl2ZXIpOyBpdC5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBhbnN3ZXIuYWRkKGludm9rZU1ldGhvZE5TYWZlKHNlbmRlckNsYXNzLCBpdC5uZXh0KCksIG1lc3NhZ2VOYW1lLCBtZXNzYWdlQXJndW1lbnRzKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFuc3dlcjsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBPYmplY3RbXSBnZXRCb3hlZEl0ZW1zKE9iamVjdCByZWNlaXZlcikgeworICAgICAgICByZXR1cm4gRGVmYXVsdFR5cGVUcmFuc2Zvcm1hdGlvbi5wcmltaXRpdmVBcnJheVRvTGlzdChyZWNlaXZlcikudG9BcnJheSgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGludm9rZU1ldGhvZDAoQ2xhc3Mgc2VuZGVyQ2xhc3MsIE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1lc3NhZ2VOYW1lKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZE4oc2VuZGVyQ2xhc3MsIHJlY2VpdmVyLCBtZXNzYWdlTmFtZSwgRU1QVFlfQVJHUyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW52b2tlTWV0aG9kMFNhZmUoQ2xhc3Mgc2VuZGVyQ2xhc3MsIE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1lc3NhZ2VOYW1lKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgaWYgKHJlY2VpdmVyID09IG51bGwpIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kTlNhZmUoc2VuZGVyQ2xhc3MsIHJlY2VpdmVyLCBtZXNzYWdlTmFtZSwgRU1QVFlfQVJHUyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW52b2tlTWV0aG9kMFNwcmVhZFNhZmUoQ2xhc3Mgc2VuZGVyQ2xhc3MsIE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1lc3NhZ2VOYW1lKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZE5TcHJlYWRTYWZlKHNlbmRlckNsYXNzLCByZWNlaXZlciwgbWVzc2FnZU5hbWUsIEVNUFRZX0FSR1MpOworICAgIH0KKworICAgIC8vICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vICAgICAgICAgICAgICAgIHN0YXRpYyBub3JtYWwgbWV0aG9kIGludm9jYXRpb24KKyAgICAvLyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW52b2tlU3RhdGljTWV0aG9kTihDbGFzcyBzZW5kZXJDbGFzcywgQ2xhc3MgcmVjZWl2ZXIsIFN0cmluZyBtZXNzYWdlTmFtZSwgT2JqZWN0W10gbWVzc2FnZUFyZ3VtZW50cykgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gSW52b2tlckhlbHBlci5pbnZva2VTdGF0aWNNZXRob2QocmVjZWl2ZXIsIG1lc3NhZ2VOYW1lLCBtZXNzYWdlQXJndW1lbnRzKTsKKyAgICAgICAgfSBjYXRjaCAoR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbiBncmUpIHsKKyAgICAgICAgICAgIHRocm93IHVud3JhcChncmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW52b2tlU3RhdGljTWV0aG9kMChDbGFzcyBzZW5kZXJDbGFzcywgQ2xhc3MgcmVjZWl2ZXIsIFN0cmluZyBtZXNzYWdlTmFtZSkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIHJldHVybiBpbnZva2VTdGF0aWNNZXRob2ROKHNlbmRlckNsYXNzLCByZWNlaXZlciwgbWVzc2FnZU5hbWUsIEVNUFRZX0FSR1MpOworICAgIH0KKworICAgIC8vICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vICAgICAgICAgICAgICBub3JtYWwgY29uc3RydWN0b3IgaW52b2NhdGlvbiAodmlhIG5ldykKKyAgICAvLyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW52b2tlTmV3TihDbGFzcyBzZW5kZXJDbGFzcywgQ2xhc3MgcmVjZWl2ZXIsIE9iamVjdCBhcmd1bWVudHMpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIEludm9rZXJIZWxwZXIuaW52b2tlQ29uc3RydWN0b3JPZihyZWNlaXZlciwgYXJndW1lbnRzKTsKKyAgICAgICAgfSBjYXRjaCAoR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbiBncmUpIHsKKyAgICAgICAgICAgIHRocm93IHVud3JhcChncmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW52b2tlTmV3MChDbGFzcyBzZW5kZXJDbGFzcywgQ2xhc3MgcmVjZWl2ZXIpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICByZXR1cm4gaW52b2tlTmV3TihzZW5kZXJDbGFzcywgcmVjZWl2ZXIsIEVNUFRZX0FSR1MpOworICAgIH0KKworICAgIC8vICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vICAgICAgIHNwZWNpYWwgY29uc3RydWN0b3IgaW52b2NhdGlvbiAodmlhIHRoaXMvc3VwZXIpCisgICAgLy8gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgIAorCisgICAgcHVibGljIHN0YXRpYyBpbnQgc2VsZWN0Q29uc3RydWN0b3JBbmRUcmFuc2Zvcm1Bcmd1bWVudHMoT2JqZWN0W10gYXJndW1lbnRzLCBpbnQgbnVtYmVyT2ZDb25zdHJ1Y3RvcnMsIENsYXNzIHdoaWNoKSB7CisgICAgICAgIE1ldGFDbGFzcyBtZXRhQ2xhc3MgPSBHcm9vdnlTeXN0ZW0uZ2V0TWV0YUNsYXNzUmVnaXN0cnkoKS5nZXRNZXRhQ2xhc3Mod2hpY2gpOworICAgICAgICByZXR1cm4gbWV0YUNsYXNzLnNlbGVjdENvbnN0cnVjdG9yQW5kVHJhbnNmb3JtQXJndW1lbnRzKG51bWJlck9mQ29uc3RydWN0b3JzLCBhcmd1bWVudHMpOworICAgIH0KKworICAgIC8vICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vICAgICAgICAgICAgICBmaWVsZCBoYW5kbGluZyBzdXBlcjogZ2V0CisgICAgLy8gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgIAorCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0RmllbGRPblN1cGVyKENsYXNzIHNlbmRlckNsYXNzLCBPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXNzYWdlTmFtZSkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAocmVjZWl2ZXIgaW5zdGFuY2VvZiBDbGFzcykgeworICAgICAgICAgICAgICAgIHJldHVybiBJbnZva2VySGVscGVyLmdldEF0dHJpYnV0ZShyZWNlaXZlciwgbWVzc2FnZU5hbWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBNZXRhQ2xhc3MgbWMgPSAoKEdyb292eU9iamVjdCkgcmVjZWl2ZXIpLmdldE1ldGFDbGFzcygpOworICAgICAgICAgICAgICAgIHJldHVybiBtYy5nZXRBdHRyaWJ1dGUoc2VuZGVyQ2xhc3MsIHJlY2VpdmVyLCBtZXNzYWdlTmFtZSwgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEdyb292eVJ1bnRpbWVFeGNlcHRpb24gZ3JlKSB7CisgICAgICAgICAgICB0aHJvdyB1bndyYXAoZ3JlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEZpZWxkT25TdXBlclNhZmUoQ2xhc3Mgc2VuZGVyQ2xhc3MsIE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1lc3NhZ2VOYW1lKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgcmV0dXJuIGdldEZpZWxkT25TdXBlcihzZW5kZXJDbGFzcywgcmVjZWl2ZXIsIG1lc3NhZ2VOYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRGaWVsZE9uU3VwZXJTcHJlYWRTYWZlKENsYXNzIHNlbmRlckNsYXNzLCBPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXNzYWdlTmFtZSkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGlmICghaXNTcHJlYWRhYmxlKHJlY2VpdmVyKSkKKyAgICAgICAgICAgIHJldHVybiBnZXRGaWVsZE9uU3VwZXIoc2VuZGVyQ2xhc3MsIHJlY2VpdmVyLCBtZXNzYWdlTmFtZSk7CisKKyAgICAgICAgTGlzdCBhbnN3ZXIgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBJbnZva2VySGVscGVyLmFzSXRlcmF0b3IocmVjZWl2ZXIpOyBpdC5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBhbnN3ZXIuYWRkKGdldEZpZWxkT25TdXBlcihzZW5kZXJDbGFzcywgaXQubmV4dCgpLCBtZXNzYWdlTmFtZSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhbnN3ZXI7CisgICAgfQorCisgICAgLy8gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gICAgICAgICAgICAgIGZpZWxkIGhhbmRsaW5nIHN1cGVyOiBzZXQKKyAgICAvLyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgCisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0RmllbGRPblN1cGVyKE9iamVjdCBtZXNzYWdlQXJndW1lbnQsIENsYXNzIHNlbmRlckNsYXNzLCBPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXNzYWdlTmFtZSkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAocmVjZWl2ZXIgaW5zdGFuY2VvZiBDbGFzcykgeworICAgICAgICAgICAgICAgIEludm9rZXJIZWxwZXIuc2V0QXR0cmlidXRlKHJlY2VpdmVyLCBtZXNzYWdlTmFtZSwgbWVzc2FnZUFyZ3VtZW50KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTWV0YUNsYXNzIG1jID0gKChHcm9vdnlPYmplY3QpIHJlY2VpdmVyKS5nZXRNZXRhQ2xhc3MoKTsKKyAgICAgICAgICAgICAgICBtYy5zZXRBdHRyaWJ1dGUoc2VuZGVyQ2xhc3MsIHJlY2VpdmVyLCBtZXNzYWdlTmFtZSwgbWVzc2FnZUFyZ3VtZW50LCB0cnVlLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbiBncmUpIHsKKyAgICAgICAgICAgIHRocm93IHVud3JhcChncmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEZpZWxkT25TdXBlclNhZmUoT2JqZWN0IG1lc3NhZ2VBcmd1bWVudCwgQ2xhc3Mgc2VuZGVyQ2xhc3MsIE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1lc3NhZ2VOYW1lKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgc2V0RmllbGRPblN1cGVyKG1lc3NhZ2VBcmd1bWVudCwgc2VuZGVyQ2xhc3MsIHJlY2VpdmVyLCBtZXNzYWdlTmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEZpZWxkT25TdXBlclNwcmVhZFNhZmUoT2JqZWN0IG1lc3NhZ2VBcmd1bWVudCwgQ2xhc3Mgc2VuZGVyQ2xhc3MsIE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1lc3NhZ2VOYW1lKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgaWYgKCFpc1NwcmVhZGFibGUocmVjZWl2ZXIpKSB7CisgICAgICAgICAgICBzZXRGaWVsZE9uU3VwZXIobWVzc2FnZUFyZ3VtZW50LCBzZW5kZXJDbGFzcywgcmVjZWl2ZXIsIG1lc3NhZ2VOYW1lKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBJbnZva2VySGVscGVyLmFzSXRlcmF0b3IocmVjZWl2ZXIpOyBpdC5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBzZXRGaWVsZE9uU3VwZXIobWVzc2FnZUFyZ3VtZW50LCBzZW5kZXJDbGFzcywgaXQubmV4dCgpLCBtZXNzYWdlTmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyAgICAgICAgICAgICAgbm9ybWFsIGZpZWxkIGhhbmRsaW5nIDogZ2V0CisgICAgLy8gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgIAorCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0RmllbGQoQ2xhc3Mgc2VuZGVyQ2xhc3MsIE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1lc3NhZ2VOYW1lKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBJbnZva2VySGVscGVyLmdldEF0dHJpYnV0ZShyZWNlaXZlciwgbWVzc2FnZU5hbWUpOworICAgICAgICB9IGNhdGNoIChHcm9vdnlSdW50aW1lRXhjZXB0aW9uIGdyZSkgeworICAgICAgICAgICAgdGhyb3cgdW53cmFwKGdyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRGaWVsZFNhZmUoQ2xhc3Mgc2VuZGVyQ2xhc3MsIE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1lc3NhZ2VOYW1lKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgaWYgKHJlY2VpdmVyID09IG51bGwpIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gZ2V0RmllbGQoc2VuZGVyQ2xhc3MsIHJlY2VpdmVyLCBtZXNzYWdlTmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0RmllbGRTcHJlYWRTYWZlKENsYXNzIHNlbmRlckNsYXNzLCBPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXNzYWdlTmFtZSkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGlmIChyZWNlaXZlciA9PSBudWxsKSByZXR1cm4gbnVsbDsKKyAgICAgICAgaWYgKCFpc1NwcmVhZGFibGUocmVjZWl2ZXIpKQorICAgICAgICAgICAgcmV0dXJuIGdldEZpZWxkKHNlbmRlckNsYXNzLCByZWNlaXZlciwgbWVzc2FnZU5hbWUpOworCisgICAgICAgIExpc3QgbGlzdCA9IChMaXN0KSByZWNlaXZlcjsKKyAgICAgICAgTGlzdCBhbnN3ZXIgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIGFuc3dlci5hZGQoZ2V0RmllbGRTYWZlKHNlbmRlckNsYXNzLCBpdC5uZXh0KCksIG1lc3NhZ2VOYW1lKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFuc3dlcjsKKyAgICB9CisKKyAgICAvLyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyAgICAgICAgICAgICAgbm9ybWFsIGZpZWxkIGhhbmRsaW5nIDogc2V0CisgICAgLy8gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgIAorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEZpZWxkKE9iamVjdCBtZXNzYWdlQXJndW1lbnQsIENsYXNzIHNlbmRlckNsYXNzLCBPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXNzYWdlTmFtZSkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJbnZva2VySGVscGVyLnNldEF0dHJpYnV0ZShyZWNlaXZlciwgbWVzc2FnZU5hbWUsIG1lc3NhZ2VBcmd1bWVudCk7CisgICAgICAgIH0gY2F0Y2ggKEdyb292eVJ1bnRpbWVFeGNlcHRpb24gZ3JlKSB7CisgICAgICAgICAgICB0aHJvdyB1bndyYXAoZ3JlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRGaWVsZFNhZmUoT2JqZWN0IG1lc3NhZ2VBcmd1bWVudCwgQ2xhc3Mgc2VuZGVyQ2xhc3MsIE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1lc3NhZ2VOYW1lKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgaWYgKHJlY2VpdmVyID09IG51bGwpIHJldHVybjsKKyAgICAgICAgc2V0RmllbGQobWVzc2FnZUFyZ3VtZW50LCBzZW5kZXJDbGFzcywgcmVjZWl2ZXIsIG1lc3NhZ2VOYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0RmllbGRTcHJlYWRTYWZlKE9iamVjdCBtZXNzYWdlQXJndW1lbnQsIENsYXNzIHNlbmRlckNsYXNzLCBPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXNzYWdlTmFtZSkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGlmIChyZWNlaXZlciA9PSBudWxsKSByZXR1cm47CisgICAgICAgIGlmICghaXNTcHJlYWRhYmxlKHJlY2VpdmVyKSkgeworICAgICAgICAgICAgc2V0RmllbGQobWVzc2FnZUFyZ3VtZW50LCBzZW5kZXJDbGFzcywgcmVjZWl2ZXIsIG1lc3NhZ2VOYW1lKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBJbnZva2VySGVscGVyLmFzSXRlcmF0b3IocmVjZWl2ZXIpOyBpdC5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBzZXRGaWVsZFNhZmUobWVzc2FnZUFyZ3VtZW50LCBzZW5kZXJDbGFzcywgaXQubmV4dCgpLCBtZXNzYWdlTmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyAgICAgICAgICAgICAgbm9ybWFsIEdyb292eU9iamVjdCBmaWVsZCBoYW5kbGluZyA6IGdldAorICAgIC8vICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAKKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEdyb292eU9iamVjdEZpZWxkKENsYXNzIHNlbmRlckNsYXNzLCBHcm9vdnlPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXNzYWdlTmFtZSkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIHJldHVybiByZWNlaXZlci5nZXRNZXRhQ2xhc3MoKS5nZXRBdHRyaWJ1dGUocmVjZWl2ZXIsIG1lc3NhZ2VOYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRHcm9vdnlPYmplY3RGaWVsZFNhZmUoQ2xhc3Mgc2VuZGVyQ2xhc3MsIEdyb292eU9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1lc3NhZ2VOYW1lKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgaWYgKHJlY2VpdmVyID09IG51bGwpIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gcmVjZWl2ZXIuZ2V0TWV0YUNsYXNzKCkuZ2V0QXR0cmlidXRlKHJlY2VpdmVyLCBtZXNzYWdlTmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0R3Jvb3Z5T2JqZWN0RmllbGRTcHJlYWRTYWZlKENsYXNzIHNlbmRlckNsYXNzLCBHcm9vdnlPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXNzYWdlTmFtZSkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGlmIChyZWNlaXZlciA9PSBudWxsKSByZXR1cm4gbnVsbDsKKyAgICAgICAgaWYgKCFpc1NwcmVhZGFibGUocmVjZWl2ZXIpKSByZXR1cm4gZ2V0R3Jvb3Z5T2JqZWN0RmllbGQoc2VuZGVyQ2xhc3MsIHJlY2VpdmVyLCBtZXNzYWdlTmFtZSk7CisKKyAgICAgICAgTGlzdCBhbnN3ZXIgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBJbnZva2VySGVscGVyLmFzSXRlcmF0b3IocmVjZWl2ZXIpOyBpdC5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBhbnN3ZXIuYWRkKGdldEZpZWxkU2FmZShzZW5kZXJDbGFzcywgaXQubmV4dCgpLCBtZXNzYWdlTmFtZSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhbnN3ZXI7CisgICAgfQorCisgICAgLy8gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gICAgICAgICAgICAgIG5vcm1hbCBmaWVsZCBoYW5kbGluZyA6IHNldAorICAgIC8vICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRHcm9vdnlPYmplY3RGaWVsZChPYmplY3QgbWVzc2FnZUFyZ3VtZW50LCBDbGFzcyBzZW5kZXJDbGFzcywgR3Jvb3Z5T2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWVzc2FnZU5hbWUpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICByZWNlaXZlci5nZXRNZXRhQ2xhc3MoKS5zZXRBdHRyaWJ1dGUocmVjZWl2ZXIsIG1lc3NhZ2VOYW1lLCBtZXNzYWdlQXJndW1lbnQpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRHcm9vdnlPYmplY3RGaWVsZFNhZmUoT2JqZWN0IG1lc3NhZ2VBcmd1bWVudCwgQ2xhc3Mgc2VuZGVyQ2xhc3MsIEdyb292eU9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1lc3NhZ2VOYW1lKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgaWYgKHJlY2VpdmVyID09IG51bGwpIHJldHVybjsKKyAgICAgICAgcmVjZWl2ZXIuZ2V0TWV0YUNsYXNzKCkuc2V0QXR0cmlidXRlKHJlY2VpdmVyLCBtZXNzYWdlTmFtZSwgbWVzc2FnZUFyZ3VtZW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0R3Jvb3Z5T2JqZWN0RmllbGRTcHJlYWRTYWZlKE9iamVjdCBtZXNzYWdlQXJndW1lbnQsIENsYXNzIHNlbmRlckNsYXNzLCBHcm9vdnlPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXNzYWdlTmFtZSkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGlmIChyZWNlaXZlciA9PSBudWxsKSByZXR1cm47CisgICAgICAgIGlmICghaXNTcHJlYWRhYmxlKHJlY2VpdmVyKSkgeworICAgICAgICAgICAgc2V0R3Jvb3Z5T2JqZWN0RmllbGQobWVzc2FnZUFyZ3VtZW50LCBzZW5kZXJDbGFzcywgcmVjZWl2ZXIsIG1lc3NhZ2VOYW1lKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBJbnZva2VySGVscGVyLmFzSXRlcmF0b3IocmVjZWl2ZXIpOyBpdC5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBzZXRGaWVsZFNhZmUobWVzc2FnZUFyZ3VtZW50LCBzZW5kZXJDbGFzcywgaXQubmV4dCgpLCBtZXNzYWdlTmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyAgICAgICAgICAgICAgUHJvcGVydHkgaGFuZGxpbmcgc3VwZXI6IGdldAorICAgIC8vICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAKKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldFByb3BlcnR5T25TdXBlcihDbGFzcyBzZW5kZXJDbGFzcywgR3Jvb3Z5T2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWVzc2FnZU5hbWUpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICByZXR1cm4gaW52b2tlTWV0aG9kT25TdXBlck4oc2VuZGVyQ2xhc3MsIHJlY2VpdmVyLCAiZ2V0UHJvcGVydHkiLCBuZXcgT2JqZWN0W117bWVzc2FnZU5hbWV9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRQcm9wZXJ0eU9uU3VwZXJTYWZlKENsYXNzIHNlbmRlckNsYXNzLCBHcm9vdnlPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXNzYWdlTmFtZSkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIHJldHVybiBnZXRQcm9wZXJ0eU9uU3VwZXIoc2VuZGVyQ2xhc3MsIHJlY2VpdmVyLCBtZXNzYWdlTmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0UHJvcGVydHlPblN1cGVyU3ByZWFkU2FmZShDbGFzcyBzZW5kZXJDbGFzcywgR3Jvb3Z5T2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWVzc2FnZU5hbWUpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBpZiAoIWlzU3ByZWFkYWJsZShyZWNlaXZlcikpCisgICAgICAgICAgICByZXR1cm4gZ2V0UHJvcGVydHlPblN1cGVyKHNlbmRlckNsYXNzLCByZWNlaXZlciwgbWVzc2FnZU5hbWUpOworCisgICAgICAgIExpc3QgYW5zd2VyID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gSW52b2tlckhlbHBlci5hc0l0ZXJhdG9yKHJlY2VpdmVyKTsgaXQuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgYW5zd2VyLmFkZChnZXRQcm9wZXJ0eVNhZmUoc2VuZGVyQ2xhc3MsIGl0Lm5leHQoKSwgbWVzc2FnZU5hbWUpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYW5zd2VyOworICAgIH0KKworICAgIC8vICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vICAgICAgICAgICAgICBQcm9wZXJ0eSBoYW5kbGluZyBzdXBlcjogc2V0CisgICAgLy8gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgIAorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFByb3BlcnR5T25TdXBlcihPYmplY3QgbWVzc2FnZUFyZ3VtZW50LCBDbGFzcyBzZW5kZXJDbGFzcywgR3Jvb3Z5T2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWVzc2FnZU5hbWUpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW52b2tlckhlbHBlci5zZXRBdHRyaWJ1dGUocmVjZWl2ZXIsIG1lc3NhZ2VOYW1lLCBtZXNzYWdlQXJndW1lbnQpOworICAgICAgICB9IGNhdGNoIChHcm9vdnlSdW50aW1lRXhjZXB0aW9uIGdyZSkgeworICAgICAgICAgICAgdGhyb3cgdW53cmFwKGdyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0UHJvcGVydHlPblN1cGVyU2FmZShPYmplY3QgbWVzc2FnZUFyZ3VtZW50LCBDbGFzcyBzZW5kZXJDbGFzcywgR3Jvb3Z5T2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWVzc2FnZU5hbWUpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBzZXRQcm9wZXJ0eU9uU3VwZXIobWVzc2FnZUFyZ3VtZW50LCBzZW5kZXJDbGFzcywgcmVjZWl2ZXIsIG1lc3NhZ2VOYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0UHJvcGVydHlPblN1cGVyU3ByZWFkU2FmZShPYmplY3QgbWVzc2FnZUFyZ3VtZW50LCBDbGFzcyBzZW5kZXJDbGFzcywgR3Jvb3Z5T2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWVzc2FnZU5hbWUpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBpZiAoIWlzU3ByZWFkYWJsZShyZWNlaXZlcikpIHsKKyAgICAgICAgICAgIHNldFByb3BlcnR5T25TdXBlcihtZXNzYWdlQXJndW1lbnQsIHNlbmRlckNsYXNzLCByZWNlaXZlciwgbWVzc2FnZU5hbWUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IEludm9rZXJIZWxwZXIuYXNJdGVyYXRvcihyZWNlaXZlcik7IGl0Lmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIHNldFByb3BlcnR5U2FmZShtZXNzYWdlQXJndW1lbnQsIHNlbmRlckNsYXNzLCBpdC5uZXh0KCksIG1lc3NhZ2VOYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vICAgICAgICAgICAgICBub3JtYWwgUHJvcGVydHkgaGFuZGxpbmcgOiBnZXQKKyAgICAvLyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgCisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRQcm9wZXJ0eShDbGFzcyBzZW5kZXJDbGFzcywgT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWVzc2FnZU5hbWUpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIEludm9rZXJIZWxwZXIuZ2V0UHJvcGVydHkocmVjZWl2ZXIsIG1lc3NhZ2VOYW1lKTsKKyAgICAgICAgfSBjYXRjaCAoR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbiBncmUpIHsKKyAgICAgICAgICAgIHRocm93IHVud3JhcChncmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0UHJvcGVydHlTYWZlKENsYXNzIHNlbmRlckNsYXNzLCBPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXNzYWdlTmFtZSkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGlmIChyZWNlaXZlciA9PSBudWxsKSByZXR1cm4gbnVsbDsKKyAgICAgICAgcmV0dXJuIGdldFByb3BlcnR5KHNlbmRlckNsYXNzLCByZWNlaXZlciwgbWVzc2FnZU5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldFByb3BlcnR5U3ByZWFkU2FmZShDbGFzcyBzZW5kZXJDbGFzcywgT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWVzc2FnZU5hbWUpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBpZiAocmVjZWl2ZXIgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisgICAgICAgIGlmICghaXNTcHJlYWRhYmxlKHJlY2VpdmVyKSkKKyAgICAgICAgICAgIHJldHVybiBnZXRQcm9wZXJ0eShzZW5kZXJDbGFzcywgcmVjZWl2ZXIsIG1lc3NhZ2VOYW1lKTsKKworICAgICAgICBMaXN0IGFuc3dlciA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IEludm9rZXJIZWxwZXIuYXNJdGVyYXRvcihyZWNlaXZlcik7IGl0Lmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIGFuc3dlci5hZGQoZ2V0UHJvcGVydHlTYWZlKHNlbmRlckNsYXNzLCBpdC5uZXh0KCksIG1lc3NhZ2VOYW1lKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFuc3dlcjsKKyAgICB9CisKKyAgICAvLyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyAgICAgICAgICAgICAgbm9ybWFsIFByb3BlcnR5IGhhbmRsaW5nIDogc2V0CisgICAgLy8gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgIAorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFByb3BlcnR5KE9iamVjdCBtZXNzYWdlQXJndW1lbnQsIENsYXNzIHNlbmRlckNsYXNzLCBPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXNzYWdlTmFtZSkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJbnZva2VySGVscGVyLnNldFByb3BlcnR5KHJlY2VpdmVyLCBtZXNzYWdlTmFtZSwgbWVzc2FnZUFyZ3VtZW50KTsKKyAgICAgICAgfSBjYXRjaCAoR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbiBncmUpIHsKKyAgICAgICAgICAgIHRocm93IHVud3JhcChncmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFByb3BlcnR5U2FmZShPYmplY3QgbWVzc2FnZUFyZ3VtZW50LCBDbGFzcyBzZW5kZXJDbGFzcywgT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWVzc2FnZU5hbWUpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBpZiAocmVjZWl2ZXIgPT0gbnVsbCkgcmV0dXJuOworICAgICAgICBzZXRQcm9wZXJ0eShtZXNzYWdlQXJndW1lbnQsIHNlbmRlckNsYXNzLCByZWNlaXZlciwgbWVzc2FnZU5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQcm9wZXJ0eVNwcmVhZFNhZmUoT2JqZWN0IG1lc3NhZ2VBcmd1bWVudCwgQ2xhc3Mgc2VuZGVyQ2xhc3MsIE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1lc3NhZ2VOYW1lKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgaWYgKHJlY2VpdmVyID09IG51bGwpIHJldHVybjsKKyAgICAgICAgaWYgKCFpc1NwcmVhZGFibGUocmVjZWl2ZXIpKSB7CisgICAgICAgICAgICBzZXRQcm9wZXJ0eShtZXNzYWdlQXJndW1lbnQsIHNlbmRlckNsYXNzLCByZWNlaXZlciwgbWVzc2FnZU5hbWUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IEludm9rZXJIZWxwZXIuYXNJdGVyYXRvcihyZWNlaXZlcik7IGl0Lmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIHNldFByb3BlcnR5U2FmZShtZXNzYWdlQXJndW1lbnQsIHNlbmRlckNsYXNzLCBpdC5uZXh0KCksIG1lc3NhZ2VOYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vICAgICAgICAgICAgICBub3JtYWwgR3Jvb3Z5T2JqZWN0IFByb3BlcnR5IGhhbmRsaW5nIDogZ2V0CisgICAgLy8gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgIAorCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0R3Jvb3Z5T2JqZWN0UHJvcGVydHkoQ2xhc3Mgc2VuZGVyQ2xhc3MsIEdyb292eU9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1lc3NhZ2VOYW1lKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgcmV0dXJuIHJlY2VpdmVyLmdldFByb3BlcnR5KG1lc3NhZ2VOYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRHcm9vdnlPYmplY3RQcm9wZXJ0eVNhZmUoQ2xhc3Mgc2VuZGVyQ2xhc3MsIEdyb292eU9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1lc3NhZ2VOYW1lKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgaWYgKHJlY2VpdmVyID09IG51bGwpIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gZ2V0R3Jvb3Z5T2JqZWN0UHJvcGVydHkoc2VuZGVyQ2xhc3MsIHJlY2VpdmVyLCBtZXNzYWdlTmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0R3Jvb3Z5T2JqZWN0UHJvcGVydHlTcHJlYWRTYWZlKENsYXNzIHNlbmRlckNsYXNzLCBHcm9vdnlPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXNzYWdlTmFtZSkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGlmIChyZWNlaXZlciA9PSBudWxsKSByZXR1cm4gbnVsbDsKKyAgICAgICAgaWYgKCFpc1NwcmVhZGFibGUocmVjZWl2ZXIpKSByZXR1cm4gZ2V0R3Jvb3Z5T2JqZWN0UHJvcGVydHkoc2VuZGVyQ2xhc3MsIHJlY2VpdmVyLCBtZXNzYWdlTmFtZSk7CisKKyAgICAgICAgTGlzdCBhbnN3ZXIgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBJbnZva2VySGVscGVyLmFzSXRlcmF0b3IocmVjZWl2ZXIpOyBpdC5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBhbnN3ZXIuYWRkKGdldFByb3BlcnR5U2FmZShzZW5kZXJDbGFzcywgaXQubmV4dCgpLCBtZXNzYWdlTmFtZSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhbnN3ZXI7CisgICAgfQorCisgICAgLy8gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gICAgICAgICAgICAgIG5vcm1hbCBHcm9vdnlPYmplY3QgUHJvcGVydHkgaGFuZGxpbmcgOiBzZXQKKyAgICAvLyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgCisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0R3Jvb3Z5T2JqZWN0UHJvcGVydHkoT2JqZWN0IG1lc3NhZ2VBcmd1bWVudCwgQ2xhc3Mgc2VuZGVyQ2xhc3MsIEdyb292eU9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1lc3NhZ2VOYW1lKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgcmVjZWl2ZXIuc2V0UHJvcGVydHkobWVzc2FnZU5hbWUsIG1lc3NhZ2VBcmd1bWVudCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEdyb292eU9iamVjdFByb3BlcnR5U2FmZShPYmplY3QgbWVzc2FnZUFyZ3VtZW50LCBDbGFzcyBzZW5kZXJDbGFzcywgR3Jvb3Z5T2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWVzc2FnZU5hbWUpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBpZiAocmVjZWl2ZXIgPT0gbnVsbCkgcmV0dXJuOworICAgICAgICByZWNlaXZlci5zZXRQcm9wZXJ0eShtZXNzYWdlTmFtZSwgbWVzc2FnZUFyZ3VtZW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0R3Jvb3Z5T2JqZWN0UHJvcGVydHlTcHJlYWRTYWZlKE9iamVjdCBtZXNzYWdlQXJndW1lbnQsIENsYXNzIHNlbmRlckNsYXNzLCBHcm9vdnlPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXNzYWdlTmFtZSkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGlmIChyZWNlaXZlciA9PSBudWxsKSByZXR1cm47CisgICAgICAgIGlmICghaXNTcHJlYWRhYmxlKHJlY2VpdmVyKSkgeworICAgICAgICAgICAgc2V0UHJvcGVydHkobWVzc2FnZUFyZ3VtZW50LCBzZW5kZXJDbGFzcywgcmVjZWl2ZXIsIG1lc3NhZ2VOYW1lKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBJbnZva2VySGVscGVyLmFzSXRlcmF0b3IocmVjZWl2ZXIpOyBpdC5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBzZXRQcm9wZXJ0eVNhZmUobWVzc2FnZUFyZ3VtZW50LCBzZW5kZXJDbGFzcywgaXQubmV4dCgpLCBtZXNzYWdlTmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIC8vICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgLy8gICoqKioqKioqKioqKioqICAgICAgICAgIG1ldGhvZHMgbm90IGNvdmVyZWQgYnkgdGhlIG5ldyBNT1AgICAgICAgICAgKioqKioqKioqKioqKioKKyAgICAvLyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIC8vICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAvLyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyAgICAgICAgICAgICAgICAgICAgIENsb3N1cmVzCisgICAgLy8gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG1ldGhvZCBwb2ludGVyIGZvciB0aGUgZ2l2ZW4gb2JqZWN0IG5hbWUKKyAgICAgKgorICAgICAqIEBwYXJhbSBvYmplY3QgdGhlIG9iamVjdCBjb250YWluaW5nIHRoZSBtZXRob2QKKyAgICAgKiBAcGFyYW0gbWV0aG9kTmFtZSB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIG9mIGludGVyZXN0CisgICAgICogQHJldHVybiB0aGUgcmVzdWx0aW5nIENsb3N1cmUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENsb3N1cmUgZ2V0TWV0aG9kUG9pbnRlcihPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbWV0aG9kTmFtZSkgeworICAgICAgICByZXR1cm4gSW52b2tlckhlbHBlci5nZXRNZXRob2RQb2ludGVyKG9iamVjdCwgbWV0aG9kTmFtZSk7CisgICAgfQorCisgICAgLy8gVE9ETzogc2V0IHNlbmRlciBjbGFzcworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGludm9rZUNsb3N1cmUoT2JqZWN0IGNsb3N1cmUsIE9iamVjdFtdIGFyZ3VtZW50cykgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIHJldHVybiBpbnZva2VNZXRob2ROKGNsb3N1cmUuZ2V0Q2xhc3MoKSwgY2xvc3VyZSwgImNhbGwiLCBhcmd1bWVudHMpOworICAgIH0KKworICAgIC8vICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vICAgICAgICAgICAgICAgICAgICAgdHlwZSBjb252ZXJzaW9uCisgICAgLy8gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAKKworICAgIC8qKgorICAgICAqIFByb3ZpZGVzIGEgaG9vayBmb3IgdHlwZSBjb2VyY2lvbiBvZiB0aGUgZ2l2ZW4gb2JqZWN0IHRvIHRoZSByZXF1aXJlZCB0eXBlCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSAgIG9mIG9iamVjdCB0byBjb252ZXJ0IHRoZSBnaXZlbiBvYmplY3QgdG8KKyAgICAgKiBAcGFyYW0gb2JqZWN0IHRoZSBvYmplY3QgdG8gYmUgY29udmVydGVkCisgICAgICogQHJldHVybiB0aGUgb3JpZ2luYWwgb2JqZWN0IG9yIGEgbmV3IGNvbnZlcnRlZCB2YWx1ZQorICAgICAqIEB0aHJvd3MgVGhyb3dhYmxlIGlmIHRoZSBjb2VyY2lvbiBmYWlscworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGFzVHlwZShPYmplY3Qgb2JqZWN0LCBDbGFzcyB0eXBlKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSBvYmplY3QgPSBOdWxsT2JqZWN0LmdldE51bGxPYmplY3QoKTsKKyAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZE4ob2JqZWN0LmdldENsYXNzKCksIG9iamVjdCwgImFzVHlwZSIsIG5ldyBPYmplY3RbXXt0eXBlfSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvdmlkZXMgYSBob29rIGZvciB0eXBlIGNhc3Rpbmcgb2YgdGhlIGdpdmVuIG9iamVjdCB0byB0aGUgcmVxdWlyZWQgdHlwZQorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUgICBvZiBvYmplY3QgdG8gY29udmVydCB0aGUgZ2l2ZW4gb2JqZWN0IHRvCisgICAgICogQHBhcmFtIG9iamVjdCB0aGUgb2JqZWN0IHRvIGJlIGNvbnZlcnRlZAorICAgICAqIEByZXR1cm4gdGhlIG9yaWdpbmFsIG9iamVjdCBvciBhIG5ldyBjb252ZXJ0ZWQgdmFsdWUKKyAgICAgKiBAdGhyb3dzIFRocm93YWJsZSBpZiB0aGUgdHlwZSBjYXN0aW5nIGZhaWxzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgY2FzdFRvVHlwZShPYmplY3Qgb2JqZWN0LCBDbGFzcyB0eXBlKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBEZWZhdWx0VHlwZVRyYW5zZm9ybWF0aW9uLmNhc3RUb1R5cGUob2JqZWN0LCB0eXBlKTsKKyAgICAgICAgfSBjYXRjaCAoR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbiBncmUpIHsKKyAgICAgICAgICAgIHRocm93IHVud3JhcChncmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBUdXBsZSBjcmVhdGVUdXBsZShPYmplY3RbXSBhcnJheSkgeworICAgICAgICByZXR1cm4gbmV3IFR1cGxlKGFycmF5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExpc3QgY3JlYXRlTGlzdChPYmplY3RbXSB2YWx1ZXMpIHsKKyAgICAgICAgcmV0dXJuIEludm9rZXJIZWxwZXIuY3JlYXRlTGlzdCh2YWx1ZXMpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgV3JhcHBlciBjcmVhdGVQb2pvV3JhcHBlcihPYmplY3QgdmFsLCBDbGFzcyBjbGF6eikgeworICAgICAgICByZXR1cm4gbmV3IFBvam9XcmFwcGVyKHZhbCwgY2xhenopOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgV3JhcHBlciBjcmVhdGVHcm9vdnlPYmplY3RXcmFwcGVyKEdyb292eU9iamVjdCB2YWwsIENsYXNzIGNsYXp6KSB7CisgICAgICAgIHJldHVybiBuZXcgR3Jvb3Z5T2JqZWN0V3JhcHBlcih2YWwsIGNsYXp6KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE1hcCBjcmVhdGVNYXAoT2JqZWN0W10gdmFsdWVzKSB7CisgICAgICAgIHJldHVybiBJbnZva2VySGVscGVyLmNyZWF0ZU1hcCh2YWx1ZXMpOworICAgIH0KKworCisgICAgLy9UT0RPOiByZWZhY3RvcgorICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBjcmVhdGVSYW5nZShPYmplY3QgZnJvbSwgT2JqZWN0IHRvLCBib29sZWFuIGluY2x1c2l2ZSkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGlmICghaW5jbHVzaXZlKSB7CisgICAgICAgICAgICBpZiAoY29tcGFyZUVxdWFsKGZyb20sIHRvKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRW1wdHlSYW5nZSgoQ29tcGFyYWJsZSkgZnJvbSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY29tcGFyZUdyZWF0ZXJUaGFuKGZyb20sIHRvKSkgeworICAgICAgICAgICAgICAgIHRvID0gaW52b2tlTWV0aG9kMChTY3JpcHRCeXRlY29kZUFkYXB0ZXIuY2xhc3MsIHRvLCAibmV4dCIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0byA9IGludm9rZU1ldGhvZDAoU2NyaXB0Qnl0ZWNvZGVBZGFwdGVyLmNsYXNzLCB0bywgInByZXZpb3VzIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZyb20gaW5zdGFuY2VvZiBJbnRlZ2VyICYmIHRvIGluc3RhbmNlb2YgSW50ZWdlcikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnRSYW5nZShEZWZhdWx0VHlwZVRyYW5zZm9ybWF0aW9uLmludFVuYm94KGZyb20pLCBEZWZhdWx0VHlwZVRyYW5zZm9ybWF0aW9uLmludFVuYm94KHRvKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdFJhbmdlKChDb21wYXJhYmxlKSBmcm9tLCAoQ29tcGFyYWJsZSkgdG8pOworICAgICAgICB9CisgICAgfQorCisgICAgLy9hc3NlcnQKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0RmFpbGVkKE9iamVjdCBleHByZXNzaW9uLCBPYmplY3QgbWVzc2FnZSkgeworICAgICAgICBJbnZva2VySGVscGVyLmFzc2VydEZhaWxlZChleHByZXNzaW9uLCBtZXNzYWdlKTsKKyAgICB9CisKKyAgICAvL2lzQ2FzZQorICAgIC8vVE9ETzogc2V0IHNlbmRlciBjbGFzcworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Nhc2UoT2JqZWN0IHN3aXRjaFZhbHVlLCBPYmplY3QgY2FzZUV4cHJlc3Npb24pIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBpZiAoY2FzZUV4cHJlc3Npb24gPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHN3aXRjaFZhbHVlID09IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIERlZmF1bHRUeXBlVHJhbnNmb3JtYXRpb24uY2FzdFRvQm9vbGVhbihpbnZva2VNZXRob2ROKGNhc2VFeHByZXNzaW9uLmdldENsYXNzKCksIGNhc2VFeHByZXNzaW9uLCAiaXNDYXNlIiwgbmV3IE9iamVjdFtde3N3aXRjaFZhbHVlfSkpOworICAgIH0KKworICAgIC8vY29tcGFyZQorICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb21wYXJlSWRlbnRpY2FsKE9iamVjdCBsZWZ0LCBPYmplY3QgcmlnaHQpIHsKKyAgICAgICAgcmV0dXJuIGxlZnQgPT0gcmlnaHQ7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNvbXBhcmVFcXVhbChPYmplY3QgbGVmdCwgT2JqZWN0IHJpZ2h0KSB7CisgICAgICAgIHJldHVybiBEZWZhdWx0VHlwZVRyYW5zZm9ybWF0aW9uLmNvbXBhcmVFcXVhbChsZWZ0LCByaWdodCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNvbXBhcmVOb3RFcXVhbChPYmplY3QgbGVmdCwgT2JqZWN0IHJpZ2h0KSB7CisgICAgICAgIHJldHVybiAhY29tcGFyZUVxdWFsKGxlZnQsIHJpZ2h0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEludGVnZXIgY29tcGFyZVRvKE9iamVjdCBsZWZ0LCBPYmplY3QgcmlnaHQpIHsKKyAgICAgICAgaW50IGFuc3dlciA9IERlZmF1bHRUeXBlVHJhbnNmb3JtYXRpb24uY29tcGFyZVRvKGxlZnQsIHJpZ2h0KTsKKyAgICAgICAgaWYgKGFuc3dlciA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gWkVSTzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBhbnN3ZXIgPiAwID8gT05FIDogTUlOVVNfT05FOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNvbXBhcmVMZXNzVGhhbihPYmplY3QgbGVmdCwgT2JqZWN0IHJpZ2h0KSB7CisgICAgICAgIHJldHVybiBjb21wYXJlVG8obGVmdCwgcmlnaHQpLmludFZhbHVlKCkgPCAwOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb21wYXJlTGVzc1RoYW5FcXVhbChPYmplY3QgbGVmdCwgT2JqZWN0IHJpZ2h0KSB7CisgICAgICAgIHJldHVybiBjb21wYXJlVG8obGVmdCwgcmlnaHQpLmludFZhbHVlKCkgPD0gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29tcGFyZUdyZWF0ZXJUaGFuKE9iamVjdCBsZWZ0LCBPYmplY3QgcmlnaHQpIHsKKyAgICAgICAgcmV0dXJuIGNvbXBhcmVUbyhsZWZ0LCByaWdodCkuaW50VmFsdWUoKSA+IDA7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNvbXBhcmVHcmVhdGVyVGhhbkVxdWFsKE9iamVjdCBsZWZ0LCBPYmplY3QgcmlnaHQpIHsKKyAgICAgICAgcmV0dXJuIGNvbXBhcmVUbyhsZWZ0LCByaWdodCkuaW50VmFsdWUoKSA+PSAwOworICAgIH0KKworICAgIC8vcmVnZXhwcgorICAgIHB1YmxpYyBzdGF0aWMgUGF0dGVybiByZWdleFBhdHRlcm4oT2JqZWN0IHJlZ2V4KSB7CisgICAgICAgIHJldHVybiBEZWZhdWx0R3Jvb3Z5TWV0aG9kcy5iaXR3aXNlTmVnYXRlKHJlZ2V4LnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTWF0Y2hlciBmaW5kUmVnZXgoT2JqZWN0IGxlZnQsIE9iamVjdCByaWdodCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gSW52b2tlckhlbHBlci5maW5kUmVnZXgobGVmdCwgcmlnaHQpOworICAgICAgICB9IGNhdGNoIChHcm9vdnlSdW50aW1lRXhjZXB0aW9uIGdyZSkgeworICAgICAgICAgICAgdGhyb3cgdW53cmFwKGdyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gbWF0Y2hSZWdleChPYmplY3QgbGVmdCwgT2JqZWN0IHJpZ2h0KSB7CisgICAgICAgIHJldHVybiBJbnZva2VySGVscGVyLm1hdGNoUmVnZXgobGVmdCwgcmlnaHQpOworICAgIH0KKworCisgICAgLy9zcHJlYWQgZXhwcmVzc2lvbnMKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdFtdIGRlc3ByZWFkTGlzdChPYmplY3RbXSBhcmdzLCBPYmplY3RbXSBzcHJlYWRzLCBpbnRbXSBwb3NpdGlvbnMpIHsKKyAgICAgICAgTGlzdCByZXQgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGludCBhcmdzUG9zID0gMDsKKyAgICAgICAgaW50IHNwcmVhZFBvcyA9IDA7CisgICAgICAgIGZvciAoaW50IHBvcyA9IDA7IHBvcyA8IHBvc2l0aW9ucy5sZW5ndGg7IHBvcysrKSB7CisgICAgICAgICAgICBmb3IgKDsgYXJnc1BvcyA8IHBvc2l0aW9uc1twb3NdOyBhcmdzUG9zKyspIHsKKyAgICAgICAgICAgICAgICByZXQuYWRkKGFyZ3NbYXJnc1Bvc10pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gc3ByZWFkc1tzcHJlYWRQb3NdOworICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXQuYWRkKG51bGwpOworICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExpc3QpIHsKKyAgICAgICAgICAgICAgICByZXQuYWRkQWxsKChMaXN0KSB2YWx1ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmdldENsYXNzKCkuaXNBcnJheSgpKSB7CisgICAgICAgICAgICAgICAgcmV0LmFkZEFsbChEZWZhdWx0VHlwZVRyYW5zZm9ybWF0aW9uLnByaW1pdGl2ZUFycmF5VG9MaXN0KHZhbHVlKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbm5vdCBzcHJlYWQgdGhlIHR5cGUgIiArIHZhbHVlLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiB3aXRoIHZhbHVlICIgKyB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcHJlYWRQb3MrKzsKKyAgICAgICAgfQorICAgICAgICBmb3IgKDsgYXJnc1BvcyA8IGFyZ3MubGVuZ3RoOyBhcmdzUG9zKyspIHsKKyAgICAgICAgICAgIHJldC5hZGQoYXJnc1thcmdzUG9zXSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldC50b0FycmF5KCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPYmplY3Qgc3ByZWFkTWFwKE9iamVjdCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gSW52b2tlckhlbHBlci5zcHJlYWRNYXAodmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHVuYXJ5TWludXMoT2JqZWN0IHZhbHVlKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBJbnZva2VySGVscGVyLnVuYXJ5TWludXModmFsdWUpOworICAgICAgICB9IGNhdGNoIChHcm9vdnlSdW50aW1lRXhjZXB0aW9uIGdyZSkgeworICAgICAgICAgICAgdGhyb3cgdW53cmFwKGdyZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCB1bmFyeVBsdXMoT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIHJldHVybiBJbnZva2VySGVscGVyLnVuYXJ5UGx1cyh2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgYml0d2lzZU5lZ2F0ZShPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIEludm9rZXJIZWxwZXIuYml0d2lzZU5lZ2F0ZSh2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBNZXRhQ2xhc3MgaW5pdE1ldGFDbGFzcyhPYmplY3Qgb2JqZWN0KSB7CisgICAgICAgIHJldHVybiBJbnZva2VySGVscGVyLmdldE1ldGFDbGFzcyhvYmplY3QpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIE1ldGFDbGFzcyBnZXRNZXRhQ2xhc3NPYmplY3ROb3ROdWxsKE9iamVjdCBvYmplY3QpIHsKKyAgICAgICAgaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgR3Jvb3Z5T2JqZWN0KSkgeworICAgICAgICAgICAgcmV0dXJuIGluaXRNZXRhQ2xhc3Mob2JqZWN0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAoKEdyb292eU9iamVjdCkgb2JqZWN0KS5nZXRNZXRhQ2xhc3MoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNTcHJlYWRhYmxlIChPYmplY3QgcmVjZWl2ZXIpIHsKKyAgICAgICAgcmV0dXJuIChyZWNlaXZlciBpbnN0YW5jZW9mIENvbGxlY3Rpb24pCisgICAgICAgICAgfHwgKHJlY2VpdmVyIGluc3RhbmNlb2YgSXRlcmF0b3IpCisgICAgICAgICAgfHwgcmVjZWl2ZXIuZ2V0Q2xhc3MoKS5pc0FycmF5KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9TY3JpcHRSZWZlcmVuY2UuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvU2NyaXB0UmVmZXJlbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUwNmIwOAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvU2NyaXB0UmVmZXJlbmNlLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZTsKKworaW1wb3J0IGdyb292eS5sYW5nLlJlZmVyZW5jZTsKK2ltcG9ydCBncm9vdnkubGFuZy5TY3JpcHQ7CisKKy8qKgorICogUmVwcmVzZW50cyBhIHJlZmVyZW5jZSB0byBhIHZhcmlhYmxlIGluIGEgc2NyaXB0CisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBTY3JpcHRSZWZlcmVuY2UgZXh0ZW5kcyBSZWZlcmVuY2UgeworCisgICAgcHJpdmF0ZSBTY3JpcHQgc2NyaXB0OworICAgIHByaXZhdGUgU3RyaW5nIHZhcmlhYmxlOworCisgICAgcHVibGljIFNjcmlwdFJlZmVyZW5jZShTY3JpcHQgc2NyaXB0LCBTdHJpbmcgdmFyaWFibGUpIHsKKyAgICAgICAgdGhpcy5zY3JpcHQgPSBzY3JpcHQ7CisgICAgICAgIHRoaXMudmFyaWFibGUgPSB2YXJpYWJsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldCgpIHsKKyAgICAgICAgcmV0dXJuIHNjcmlwdC5nZXRCaW5kaW5nKCkuZ2V0VmFyaWFibGUodmFyaWFibGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldChPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgc2NyaXB0LmdldEJpbmRpbmcoKS5zZXRWYXJpYWJsZSh2YXJpYWJsZSwgdmFsdWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvU2NyaXB0VGVzdEFkYXB0ZXIuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvU2NyaXB0VGVzdEFkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODg0M2JkCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9TY3JpcHRUZXN0QWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0UmVzdWx0OworCisvKioKKyAqIEFuIGFkYXB0ZXIgdG8gbWFrZSBhbnkgR3Jvb3Z5IFNjcmlwdCBjbGFzcyBhbiBpbnN0YW5jZSBvZiBhIEpVbml0IFRlc3QKKyAqCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBTY3JpcHRUZXN0QWRhcHRlciBpbXBsZW1lbnRzIFRlc3QgeworICAgIHByaXZhdGUgQ2xhc3Mgc2NyaXB0Q2xhc3M7CisgICAgcHJpdmF0ZSBTdHJpbmdbXSBhcmd1bWVudHM7CisKKyAgICBwdWJsaWMgU2NyaXB0VGVzdEFkYXB0ZXIoQ2xhc3Mgc2NyaXB0Q2xhc3MsIFN0cmluZ1tdIGFyZ3VtZW50cykgeworICAgICAgICB0aGlzLnNjcmlwdENsYXNzID0gc2NyaXB0Q2xhc3M7CisgICAgICAgIHRoaXMuYXJndW1lbnRzID0gYXJndW1lbnRzOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgY291bnRUZXN0Q2FzZXMoKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJ1bihUZXN0UmVzdWx0IHJlc3VsdCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVzdWx0LnN0YXJ0VGVzdCh0aGlzKTsKKworICAgICAgICAgICAgLy8gbGV0cyBydW4gdGhlIHNjcmlwdAorICAgICAgICAgICAgSW52b2tlckhlbHBlci5ydW5TY3JpcHQoc2NyaXB0Q2xhc3MsIGFyZ3VtZW50cyk7CisgICAgICAgICAgICByZXN1bHQuZW5kVGVzdCh0aGlzKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJlc3VsdC5hZGRFcnJvcih0aGlzLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiVGVzdENhc2UgZm9yIHNjcmlwdDogIiArIHNjcmlwdENsYXNzLmdldE5hbWUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL1N0YWNrVHJhY2VVdGlscy5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9TdGFja1RyYWNlVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjdkOWRjCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9TdGFja1RyYWNlVXRpbHMuamF2YQpAQCAtMCwwICsxLDE1NSBAQAorLyogQ29weXJpZ2h0IDIwMDQtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBjO3BXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lOw0KKw0KK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsNCitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nTWFuYWdlcjsNCitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOw0KKw0KKy8qKg0KKyAqIE9yaWdpbmFsbHkgd2FzIGdyYWlscy51dGlscy5HcmFpbHNVdGlscywgcmVtb3ZlZCBzb21lIGdyYWlscyBzcGVjaWZpYyBzdHVmZi4NCisgKiBVdGlsaXR5IG1ldGhvZHMgcmVtb3ZpbmcgaW50ZXJuYWwgbGluZXMgZnJvbSBzdGFjayB0cmFjZXMNCisgKg0KKyAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcg0KKyAqIEBzaW5jZSAwLjINCisgKg0KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbjogNTU0NCAkDQorICogRmlyc3QgQ3JlYXRlZDogMDItSnVuLTIwMDYNCisgKiBMYXN0IFVwZGF0ZWQ6ICREYXRlOiAyMDA3LTA5LTIxIDEzOjUzOjA3IC0wNTAwIChGcmksIDIxIFNlcCAyMDA3KSAkDQorICovDQorcHVibGljIGNsYXNzIFN0YWNrVHJhY2VVdGlscyB7DQorDQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQUNLX0xPR19OQU1FID0gIlN0YWNrVHJhY2UiOw0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgU1RBQ0tfTE9HOw0KKyAgICAvLyBzZXQgbG9nIHRvIGNvbnN1bWUgdHJhY2VzIGJ5IGRlZmF1bHQsIGVuZCB1c2VyIGNhbiBvdmVycmlkZSBsYXRlcg0KKyAgICBzdGF0aWMgew0KKyAgICAgICAgb3V0ZXI6IGRvIHsNCisgICAgICAgICAgICBFbnVtZXJhdGlvbiBleGlzdGluZ0xvZ3MgPSBMb2dNYW5hZ2VyLmdldExvZ01hbmFnZXIoKS5nZXRMb2dnZXJOYW1lcygpOw0KKyAgICAgICAgICAgIHdoaWxlIChleGlzdGluZ0xvZ3MuaGFzTW9yZUVsZW1lbnRzKCkpIHsNCisgICAgICAgICAgICAgICAgaWYgKFNUQUNLX0xPR19OQU1FLmVxdWFscyhleGlzdGluZ0xvZ3MubmV4dEVsZW1lbnQoKSkpIHsNCisgICAgICAgICAgICAgICAgICAgIFNUQUNLX0xPRyA9IExvZ2dlci5nZXRMb2dnZXIoU1RBQ0tfTE9HX05BTUUpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWsgb3V0ZXI7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgU1RBQ0tfTE9HID0gTG9nZ2VyLmdldExvZ2dlcihTVEFDS19MT0dfTkFNRSk7DQorICAgICAgICAgICAgU1RBQ0tfTE9HLnNldFVzZVBhcmVudEhhbmRsZXJzKGZhbHNlKTsNCisgICAgICAgIH0gd2hpbGUgKGZhbHNlKTsNCisgICAgfQ0KKw0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBHUk9PVllfUEFDS0FHRVMgPQ0KKyAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgiZ3Jvb3Z5LnNhbml0aXplZC5zdGFja3RyYWNlcyIsDQorICAgICAgICAgICAgICAgICJncm9vdnkuLCIgKw0KKyAgICAgICAgICAgICAgICAib3JnLmNvZGVoYXVzLmdyb292eS4sIiArDQorICAgICAgICAgICAgICAgICJqYXZhLiwiICsNCisgICAgICAgICAgICAgICAgImphdmF4LiwiICsNCisgICAgICAgICAgICAgICAgInN1bi4sIiArDQorICAgICAgICAgICAgICAgICJnamRrLmdyb292eS4sIg0KKyAgICAgICAgICAgICkuc3BsaXQoIihcXHN8LCkrIik7DQorDQorICAgIC8qKg0KKyAgICAgKiA8cD5SZW1vdmUgYWxsIGFwcGFyZW50bHkgZ3Jvb3Z5LWludGVybmFsIHRyYWNlIGVudHJpZXMgZnJvbSB0aGUgZXhjZXB0aW9uIGluc3RhbmNlPHA+DQorICAgICAqIDxwPlRoaXMgbW9kaWZpZXMgdGhlIG9yaWdpbmFsIGluc3RhbmNlIGFuZCByZXR1cm5zIGl0LCBpdCBkb2VzIG5vdCBjbG9uZTwvcD4NCisgICAgICogQHBhcmFtIHQNCisgICAgICogQHJldHVybiBUaGUgZXhjZXB0aW9uIHBhc3NlZCBpbiwgYWZ0ZXIgY2xlYW5pbmcgdGhlIHN0YWNrIHRyYWNlDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIFRocm93YWJsZSBzYW5pdGl6ZShUaHJvd2FibGUgdCkgew0KKyAgICAgICAgLy8gTm90ZSB0aGF0IHRoaXMgZ2V0Qm9vbGVhbiBhY2Nlc3MgbWF5IHdlbGwgYmUgc3luY2VkLi4uDQorICAgICAgICBpZiAoIUJvb2xlYW4uZ2V0Qm9vbGVhbigiZ3Jvb3Z5LmZ1bGwuc3RhY2t0cmFjZSIpKSB7DQorICAgICAgICAgICAgU3RhY2tUcmFjZUVsZW1lbnRbXSB0cmFjZSA9IHQuZ2V0U3RhY2tUcmFjZSgpOw0KKyAgICAgICAgICAgIExpc3QgbmV3VHJhY2UgPSBuZXcgQXJyYXlMaXN0KCk7DQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0cmFjZS5sZW5ndGg7IGkrKykgew0KKyAgICAgICAgICAgICAgICBTdGFja1RyYWNlRWxlbWVudCBzdGFja1RyYWNlRWxlbWVudCA9IHRyYWNlW2ldOw0KKyAgICAgICAgICAgICAgICBpZiAoaXNBcHBsaWNhdGlvbkNsYXNzKHN0YWNrVHJhY2VFbGVtZW50LmdldENsYXNzTmFtZSgpKSkgew0KKyAgICAgICAgICAgICAgICAgICAgbmV3VHJhY2UuYWRkKCBzdGFja1RyYWNlRWxlbWVudCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgLy8gV2UgZG9uJ3Qgd2FudCB0byBsb3NlIGFueXRoaW5nLCBzbyBsb2cgaXQNCisgIAkgICAgICAgIFNUQUNLX0xPRy5sb2coTGV2ZWwuV0FSTklORywgIlNhbml0aXppbmcgc3RhY2t0cmFjZToiLCB0KTsNCisNCisNCisgICAgICAgICAgICBTdGFja1RyYWNlRWxlbWVudFtdIGNsZWFuID0gbmV3IFN0YWNrVHJhY2VFbGVtZW50W25ld1RyYWNlLnNpemUoKV07DQorICAgICAgICAgICAgbmV3VHJhY2UudG9BcnJheShjbGVhbik7DQorICAgICAgICAgICAgdC5zZXRTdGFja1RyYWNlKGNsZWFuKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiB0Ow0KKyAgICB9DQorDQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludFNhbml0aXplZFN0YWNrVHJhY2UoVGhyb3dhYmxlIHQsIFByaW50V3JpdGVyIHApIHsNCisgICAgICAgIHQgPSBTdGFja1RyYWNlVXRpbHMuc2FuaXRpemUodCk7DQorDQorICAgICAgICBTdGFja1RyYWNlRWxlbWVudFtdIHRyYWNlID0gdC5nZXRTdGFja1RyYWNlKCk7DQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRyYWNlLmxlbmd0aDsgaSsrKSB7DQorICAgICAgICAgICAgU3RhY2tUcmFjZUVsZW1lbnQgc3RhY2tUcmFjZUVsZW1lbnQgPSB0cmFjZVtpXTsNCisgICAgICAgICAgICBwLnByaW50bG4oICAiYXQgIitzdGFja1RyYWNlRWxlbWVudC5nZXRDbGFzc05hbWUoKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICsiKCIrc3RhY2tUcmFjZUVsZW1lbnQuZ2V0TWV0aG9kTmFtZSgpDQorICAgICAgICAgICAgICAgICAgICAgICAgKyI6IitzdGFja1RyYWNlRWxlbWVudC5nZXRMaW5lTnVtYmVyKCkrIikiKTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRTYW5pdGl6ZWRTdGFja1RyYWNlKFRocm93YWJsZSB0KSB7DQorICAgICAgICBwcmludFNhbml0aXplZFN0YWNrVHJhY2UodCwgbmV3IFByaW50V3JpdGVyKFN5c3RlbS5lcnIpKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBcHBsaWNhdGlvbkNsYXNzKFN0cmluZyBjbGFzc05hbWUpIHsNCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgR1JPT1ZZX1BBQ0tBR0VTLmxlbmd0aDsgaSsrKSB7DQorICAgICAgICAgICAgU3RyaW5nIGdyb292eVBhY2thZ2UgPSBHUk9PVllfUEFDS0FHRVNbaV07DQorICAgICAgICAgICAgaWYgKGNsYXNzTmFtZS5zdGFydHNXaXRoKGdyb292eVBhY2thZ2UpKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogPHA+RXh0cmFjdHMgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbiwgbm8gbWF0dGVyIGhvdyBuZXN0ZWQgaXQgaXM8L3A+DQorICAgICAqIEBwYXJhbSB0DQorICAgICAqIEByZXR1cm4gVGhlIGRlZXBlc3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbiB0aGF0IGNhbiBiZSBmb3VuZA0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyBUaHJvd2FibGUgZXh0cmFjdFJvb3RDYXVzZShUaHJvd2FibGUgdCkgew0KKyAgICAgICAgVGhyb3dhYmxlIHJlc3VsdCA9IHQ7DQorICAgICAgICB3aGlsZSAocmVzdWx0LmdldENhdXNlKCkgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5nZXRDYXVzZSgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogPHA+R2V0IHRoZSByb290IGNhdXNlIG9mIGFuIGV4Y2VwdGlvbiBhbmQgc2FuaXRpemUgaXQgZm9yIGRpc3BsYXkgdG8gdGhlIHVzZXI8L3A+DQorICAgICAqIDxwPlRoaXMgd2lsbCBNT0RJRlkgdGhlIHN0YWNrdHJhY2Ugb2YgdGhlIHJvb3QgY2F1c2UgZXhjZXB0aW9uIG9iamVjdCBhbmQgcmV0dXJuIGl0PC9wPg0KKyAgICAgKiBAcGFyYW0gdA0KKyAgICAgKiBAcmV0dXJuIFRoZSByb290IGNhdXNlIGV4Y2VwdGlvbiBpbnN0YW5jZSwgd2l0aCBpdHMgc3RhY2UgdHJhY2UgbW9kaWZpZWQgdG8gZmlsdGVyIG91dCBncm9vdnkgcnVudGltZSBjbGFzc2VzDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIFRocm93YWJsZSBzYW5pdGl6ZVJvb3RDYXVzZShUaHJvd2FibGUgdCkgew0KKyAgICAgICAgcmV0dXJuIFN0YWNrVHJhY2VVdGlscy5zYW5pdGl6ZShTdGFja1RyYWNlVXRpbHMuZXh0cmFjdFJvb3RDYXVzZSh0KSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIDxwPlNhbml0aXplIHRoZSBleGNlcHRpb24gYW5kIEFMTCBuZXN0ZWQgY2F1c2VzPC9wPg0KKyAgICAgKiA8cD5UaGlzIHdpbGwgTU9ESUZZIHRoZSBzdGFja3RyYWNlIG9mIHRoZSBleGNlcHRpb24gaW5zdGFuY2UgYW5kIGFsbCBpdHMgY2F1c2VzIGlycmV2ZXJzaWJseTwvcD4NCisgICAgICogQHBhcmFtIHQNCisgICAgICogQHJldHVybiBUaGUgcm9vdCBjYXVzZSBleGNlcHRpb24gaW5zdGFuY2VzLCB3aXRoIHN0YWNrIHRyYWNlIG1vZGlmaWVkIHRvIGZpbHRlciBvdXQgZ3Jvb3Z5IHJ1bnRpbWUgY2xhc3Nlcw0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyBUaHJvd2FibGUgZGVlcFNhbml0aXplKFRocm93YWJsZSB0KSB7DQorICAgICAgICBUaHJvd2FibGUgY3VycmVudCA9IHQ7DQorICAgICAgICB3aGlsZSAoY3VycmVudC5nZXRDYXVzZSgpICE9IG51bGwpIHsNCisgICAgICAgICAgICBjdXJyZW50ID0gU3RhY2tUcmFjZVV0aWxzLnNhbml0aXplKGN1cnJlbnQuZ2V0Q2F1c2UoKSk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gU3RhY2tUcmFjZVV0aWxzLnNhbml0aXplKHQpOw0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvU3RyaW5nQnVmZmVyV3JpdGVyLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL1N0cmluZ0J1ZmZlcldyaXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlYzliZGIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL1N0cmluZ0J1ZmZlcldyaXRlci5qYXZhCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKKworLyoqCisgKiBUaGlzIGNsYXNzIGNvZGVzIGFyb3VuZCBhIHNpbGx5IGxpbWlhdGlvbiBvZiBTdHJpbmdXcml0ZXIgd2hpY2ggZG9lc24ndCBhbGxvdyBhIFN0cmluZ0J1ZmZlcgorICogdG8gYmUgcGFzc2VkIGluIGFzIGEgY29uc3RydWN0b3IgZm9yIHNvbWUgYml6emFyZSByZWFzb24uCisgKiBTbyB3ZSByZXBsaWNhdGUgdGhlIGJlaGF2aW91ciBvZiBTdHJpbmdXcml0ZXIgaGVyZSBidXQgYWxsb3cgYSBTdHJpbmdCdWZmZXIgdG8gYmUgcGFzc2VkIGluLgorICogCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgU3RyaW5nQnVmZmVyV3JpdGVyIGV4dGVuZHMgV3JpdGVyIHsKKworICAgIHByaXZhdGUgU3RyaW5nQnVmZmVyIGJ1ZmZlcjsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBzdHJpbmcgd3JpdGVyIHdoaWNoIHdpbGwgYXBwZW5kIHRoZSB0ZXh0IHRvIHRoZSBnaXZlbiBTdHJpbmdCdWZmZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nQnVmZmVyV3JpdGVyKFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKKyAgICAgICAgdGhpcy5idWZmZXIgPSBidWZmZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgYSBzaW5nbGUgY2hhcmFjdGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBjKSB7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoKGNoYXIpIGMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIGEgcG9ydGlvbiBvZiBhbiBhcnJheSBvZiBjaGFyYWN0ZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIHRleHQgQXJyYXkgb2YgY2hhcmFjdGVycworICAgICAqIEBwYXJhbSBvZmZzZXQgT2Zmc2V0IGZyb20gd2hpY2ggdG8gc3RhcnQgd3JpdGluZyBjaGFyYWN0ZXJzCisgICAgICogQHBhcmFtIGxlbmd0aCBOdW1iZXIgb2YgY2hhcmFjdGVycyB0byB3cml0ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdyaXRlKGNoYXIgdGV4dFtdLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIGlmICgob2Zmc2V0IDwgMCkgfHwgKG9mZnNldCA+IHRleHQubGVuZ3RoKSB8fCAobGVuZ3RoIDwgMCkgfHwgKChvZmZzZXQgKyBsZW5ndGgpID4gdGV4dC5sZW5ndGgpIHx8ICgob2Zmc2V0ICsgbGVuZ3RoKSA8IDApKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYnVmZmVyLmFwcGVuZCh0ZXh0LCBvZmZzZXQsIGxlbmd0aCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgYSBzdHJpbmcuCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGUoU3RyaW5nIHRleHQpIHsKKyAgICAgICAgYnVmZmVyLmFwcGVuZCh0ZXh0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhIHBvcnRpb24gb2YgYSBzdHJpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGV4dCB0aGUgdGV4dCB0byBiZSB3cml0dGVuCisgICAgICogQHBhcmFtIG9mZnNldCBvZmZzZXQgZnJvbSB3aGljaCB0byBzdGFydCB3cml0aW5nIGNoYXJhY3RlcnMKKyAgICAgKiBAcGFyYW0gbGVuZ3RoIE51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHdyaXRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGUoU3RyaW5nIHRleHQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKyAgICAgICAgYnVmZmVyLmFwcGVuZCh0ZXh0LnN1YnN0cmluZyhvZmZzZXQsIG9mZnNldCArIGxlbmd0aCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYnVmZmVyJ3MgY3VycmVudCB2YWx1ZSBhcyBhIHN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmx1c2ggdGhlIHN0cmVhbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zaW5nIGEgPHR0PlN0cmluZ1dyaXRlcjwvdHQ+IGhhcyBubyBlZmZlY3QuIFRoZSBtZXRob2RzIGluIHRoaXMKKyAgICAgKiBjbGFzcyBjYW4gYmUgY2FsbGVkIGFmdGVyIHRoZSBzdHJlYW0gaGFzIGJlZW4gY2xvc2VkIHdpdGhvdXQgZ2VuZXJhdGluZworICAgICAqIGFuIDx0dD5JT0V4Y2VwdGlvbjwvdHQ+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL1RpbWVDYXRlZ29yeS5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9UaW1lQ2F0ZWdvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDJjNjIzCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9UaW1lQ2F0ZWdvcnkuamF2YQpAQCAtMCwwICsxLDE1OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZTsKKworaW1wb3J0IGdyb292eS50aW1lLkJhc2VEdXJhdGlvbjsKK2ltcG9ydCBncm9vdnkudGltZS5EYXR1bURlcGVuZGVudER1cmF0aW9uOworaW1wb3J0IGdyb292eS50aW1lLkR1cmF0aW9uOworaW1wb3J0IGdyb292eS50aW1lLlRpbWVEdXJhdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7CisKK3B1YmxpYyBjbGFzcyBUaW1lQ2F0ZWdvcnkgeworICAgIC8qCisgICAgICogTWV0aG9kcyB0byBhbGxvdyBEYXRlIER1cmF0aW9uIGFyaXRobWV0aWMKKyAgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgRGF0ZSBwbHVzKGZpbmFsIERhdGUgZGF0ZSwgZmluYWwgQmFzZUR1cmF0aW9uIGR1cmF0aW9uKSB7CisgICAgICAgIHJldHVybiBkdXJhdGlvbi5wbHVzKGRhdGUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRGF0ZSBtaW51cyhmaW5hbCBEYXRlIGRhdGUsIGZpbmFsIEJhc2VEdXJhdGlvbiBkdXJhdGlvbikgeworICAgICAgICBmaW5hbCBDYWxlbmRhciBjYWwgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOworCisgICAgICAgIGNhbC5zZXRUaW1lKGRhdGUpOworICAgICAgICBjYWwuYWRkKENhbGVuZGFyLllFQVIsIC1kdXJhdGlvbi5nZXRZZWFycygpKTsKKyAgICAgICAgY2FsLmFkZChDYWxlbmRhci5NT05USCwgLWR1cmF0aW9uLmdldE1vbnRocygpKTsKKyAgICAgICAgY2FsLmFkZChDYWxlbmRhci5EQVlfT0ZfWUVBUiwgLWR1cmF0aW9uLmdldERheXMoKSk7CisgICAgICAgIGNhbC5hZGQoQ2FsZW5kYXIuSE9VUl9PRl9EQVksIC1kdXJhdGlvbi5nZXRIb3VycygpKTsKKyAgICAgICAgY2FsLmFkZChDYWxlbmRhci5NSU5VVEUsIC1kdXJhdGlvbi5nZXRNaW51dGVzKCkpOworICAgICAgICBjYWwuYWRkKENhbGVuZGFyLlNFQ09ORCwgLWR1cmF0aW9uLmdldFNlY29uZHMoKSk7CisgICAgICAgIGNhbC5hZGQoQ2FsZW5kYXIuTUlMTElTRUNPTkQsIC1kdXJhdGlvbi5nZXRNaWxsaXMoKSk7CisKKyAgICAgICAgcmV0dXJuIGNhbC5nZXRUaW1lKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBUaW1lWm9uZSBnZXRUaW1lWm9uZShEYXRlIHNlbGYpIHsKKyAgICAgICAgQ2FsZW5kYXIgY2FsZW5kYXIgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOworICAgICAgICBjYWxlbmRhci5zZXRUaW1lKHNlbGYpOworICAgICAgICByZXR1cm4gY2FsZW5kYXIuZ2V0VGltZVpvbmUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIER1cmF0aW9uIGdldERheWxpZ2h0U2F2aW5nc09mZnNldChEYXRlIHNlbGYpIHsKKyAgICAgICAgVGltZVpvbmUgdGltZVpvbmUgPSBnZXRUaW1lWm9uZShzZWxmKTsKKyAgICAgICAgaW50IG1pbGxpcyA9ICh0aW1lWm9uZS51c2VEYXlsaWdodFRpbWUoKSAmJiB0aW1lWm9uZS5pbkRheWxpZ2h0VGltZShzZWxmKSkKKyAgICAgICAgICAgICAgICA/IHRpbWVab25lLmdldERTVFNhdmluZ3MoKSA6IDA7CisgICAgICAgIHJldHVybiBuZXcgVGltZUR1cmF0aW9uKDAsIDAsIDAsIG1pbGxpcyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBEdXJhdGlvbiBnZXREYXlsaWdodFNhdmluZ3NPZmZzZXQoQmFzZUR1cmF0aW9uIHNlbGYpIHsKKyAgICAgICAgcmV0dXJuIGdldERheWxpZ2h0U2F2aW5nc09mZnNldChuZXcgRGF0ZShzZWxmLnRvTWlsbGlzZWNvbmRzKCkgKyAxKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBEdXJhdGlvbiBnZXRSZWxhdGl2ZURheWxpZ2h0U2F2aW5nc09mZnNldChEYXRlIHNlbGYsIERhdGUgb3RoZXIpIHsKKyAgICAgICAgRHVyYXRpb24gZDEgPSBnZXREYXlsaWdodFNhdmluZ3NPZmZzZXQoc2VsZik7CisgICAgICAgIER1cmF0aW9uIGQyID0gZ2V0RGF5bGlnaHRTYXZpbmdzT2Zmc2V0KG90aGVyKTsKKyAgICAgICAgcmV0dXJuIG5ldyBUaW1lRHVyYXRpb24oMCwgMCwgMCwgKGludCkgKGQyLnRvTWlsbGlzZWNvbmRzKCkgLSBkMS50b01pbGxpc2Vjb25kcygpKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBUaW1lRHVyYXRpb24gbWludXMoZmluYWwgRGF0ZSBsaHMsIGZpbmFsIERhdGUgcmhzKSB7CisgICAgICAgIGxvbmcgbWlsbGlzZWNvbmRzID0gbGhzLmdldFRpbWUoKSAtIHJocy5nZXRUaW1lKCk7CisgICAgICAgIGxvbmcgZGF5cyA9IG1pbGxpc2Vjb25kcyAvICgyNCAqIDYwICogNjAgKiAxMDAwKTsKKyAgICAgICAgbWlsbGlzZWNvbmRzIC09IGRheXMgKiAyNCAqIDYwICogNjAgKiAxMDAwOworICAgICAgICBpbnQgaG91cnMgPSAoaW50KSAobWlsbGlzZWNvbmRzIC8gKDYwICogNjAgKiAxMDAwKSk7CisgICAgICAgIG1pbGxpc2Vjb25kcyAtPSBob3VycyAqIDYwICogNjAgKiAxMDAwOworICAgICAgICBpbnQgbWludXRlcyA9IChpbnQpIChtaWxsaXNlY29uZHMgLyAoNjAgKiAxMDAwKSk7CisgICAgICAgIG1pbGxpc2Vjb25kcyAtPSBtaW51dGVzICogNjAgKiAxMDAwOworICAgICAgICBpbnQgc2Vjb25kcyA9IChpbnQpIChtaWxsaXNlY29uZHMgLyAxMDAwKTsKKyAgICAgICAgbWlsbGlzZWNvbmRzIC09IHNlY29uZHMgKiAxMDAwOworCisgICAgICAgIHJldHVybiBuZXcgVGltZUR1cmF0aW9uKChpbnQpIGRheXMsIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCAoaW50KSBtaWxsaXNlY29uZHMpOworICAgIH0KKworICAgIC8qCisgICAgKiBNZXRob2RzIG9uIEludGVnZXIgdG8gaW1wbGVtZW50IDEubW9udGgsIDQueWVhcnMgZXRjLgorICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIERhdHVtRGVwZW5kZW50RHVyYXRpb24gZ2V0TW9udGhzKGZpbmFsIEludGVnZXIgc2VsZikgeworICAgICAgICByZXR1cm4gbmV3IERhdHVtRGVwZW5kZW50RHVyYXRpb24oMCwgc2VsZi5pbnRWYWx1ZSgpLCAwLCAwLCAwLCAwLCAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIERhdHVtRGVwZW5kZW50RHVyYXRpb24gZ2V0TW9udGgoZmluYWwgSW50ZWdlciBzZWxmKSB7CisgICAgICAgIHJldHVybiBnZXRNb250aHMoc2VsZik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBEYXR1bURlcGVuZGVudER1cmF0aW9uIGdldFllYXJzKGZpbmFsIEludGVnZXIgc2VsZikgeworICAgICAgICByZXR1cm4gbmV3IERhdHVtRGVwZW5kZW50RHVyYXRpb24oc2VsZi5pbnRWYWx1ZSgpLCAwLCAwLCAwLCAwLCAwLCAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIERhdHVtRGVwZW5kZW50RHVyYXRpb24gZ2V0WWVhcihmaW5hbCBJbnRlZ2VyIHNlbGYpIHsKKyAgICAgICAgcmV0dXJuIGdldFllYXJzKHNlbGYpOworICAgIH0KKworICAgIC8qCisgICAgKiBNZXRob2RzIG9uIEludGVnZXIgdG8gaW1wbGVtZW50IDEud2VlaywgNC5kYXlzIGV0Yy4KKyAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBEdXJhdGlvbiBnZXRXZWVrcyhmaW5hbCBJbnRlZ2VyIHNlbGYpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEdXJhdGlvbihzZWxmLmludFZhbHVlKCkgKiA3LCAwLCAwLCAwLCAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIER1cmF0aW9uIGdldFdlZWsoZmluYWwgSW50ZWdlciBzZWxmKSB7CisgICAgICAgIHJldHVybiBnZXRXZWVrcyhzZWxmKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIER1cmF0aW9uIGdldERheXMoZmluYWwgSW50ZWdlciBzZWxmKSB7CisgICAgICAgIHJldHVybiBuZXcgRHVyYXRpb24oc2VsZi5pbnRWYWx1ZSgpLCAwLCAwLCAwLCAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIER1cmF0aW9uIGdldERheShmaW5hbCBJbnRlZ2VyIHNlbGYpIHsKKyAgICAgICAgcmV0dXJuIGdldERheXMoc2VsZik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBUaW1lRHVyYXRpb24gZ2V0SG91cnMoZmluYWwgSW50ZWdlciBzZWxmKSB7CisgICAgICAgIHJldHVybiBuZXcgVGltZUR1cmF0aW9uKDAsIHNlbGYuaW50VmFsdWUoKSwgMCwgMCwgMCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBUaW1lRHVyYXRpb24gZ2V0SG91cihmaW5hbCBJbnRlZ2VyIHNlbGYpIHsKKyAgICAgICAgcmV0dXJuIGdldEhvdXJzKHNlbGYpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgVGltZUR1cmF0aW9uIGdldE1pbnV0ZXMoZmluYWwgSW50ZWdlciBzZWxmKSB7CisgICAgICAgIHJldHVybiBuZXcgVGltZUR1cmF0aW9uKDAsIDAsIHNlbGYuaW50VmFsdWUoKSwgMCwgMCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBUaW1lRHVyYXRpb24gZ2V0TWludXRlKGZpbmFsIEludGVnZXIgc2VsZikgeworICAgICAgICByZXR1cm4gZ2V0TWludXRlcyhzZWxmKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFRpbWVEdXJhdGlvbiBnZXRTZWNvbmRzKGZpbmFsIEludGVnZXIgc2VsZikgeworICAgICAgICByZXR1cm4gbmV3IFRpbWVEdXJhdGlvbigwLCAwLCAwLCBzZWxmLmludFZhbHVlKCksIDApOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgVGltZUR1cmF0aW9uIGdldFNlY29uZChmaW5hbCBJbnRlZ2VyIHNlbGYpIHsKKyAgICAgICAgcmV0dXJuIGdldFNlY29uZHMoc2VsZik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBUaW1lRHVyYXRpb24gZ2V0TWlsbGlzZWNvbmRzKGZpbmFsIEludGVnZXIgc2VsZikgeworICAgICAgICByZXR1cm4gbmV3IFRpbWVEdXJhdGlvbigwLCAwLCAwLCAwLCBzZWxmLmludFZhbHVlKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgVGltZUR1cmF0aW9uIGdldE1pbGxpc2Vjb25kKGZpbmFsIEludGVnZXIgc2VsZikgeworICAgICAgICByZXR1cm4gZ2V0TWlsbGlzZWNvbmRzKHNlbGYpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvV3JpdGFibGVGaWxlLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL1dyaXRhYmxlRmlsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMjI1YTIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL1dyaXRhYmxlRmlsZS5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZTsKKworaW1wb3J0IGdyb292eS5sYW5nLldyaXRhYmxlOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CisKKy8qKgorICogQSBXcml0YWJsZSBGaWxlLgorICoKKyAqIEBhdXRob3IgSm9obiBXaWxzb24KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBXcml0YWJsZUZpbGUgZXh0ZW5kcyBGaWxlIGltcGxlbWVudHMgV3JpdGFibGUgeworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGVuY29kaW5nOworCisgICAgcHVibGljIFdyaXRhYmxlRmlsZShmaW5hbCBGaWxlIGRlbGVnYXRlKSB7CisgICAgICAgIHRoaXMoZGVsZWdhdGUsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBXcml0YWJsZUZpbGUoZmluYWwgRmlsZSBkZWxlZ2F0ZSwgZmluYWwgU3RyaW5nIGVuY29kaW5nKSB7CisgICAgICAgIHN1cGVyKGRlbGVnYXRlLnRvVVJJKCkpOworICAgICAgICB0aGlzLmVuY29kaW5nID0gZW5jb2Rpbmc7CisgICAgfQorCisgICAgcHVibGljIFdyaXRlciB3cml0ZVRvKGZpbmFsIFdyaXRlciBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlYWRlciByZWFkZXIgPQorICAgICAgICAgICAgKHRoaXMuZW5jb2RpbmcgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICA/IERlZmF1bHRHcm9vdnlNZXRob2RzLm5ld1JlYWRlcih0aGlzKQorICAgICAgICAgICAgICAgIDogRGVmYXVsdEdyb292eU1ldGhvZHMubmV3UmVhZGVyKHRoaXMsIHRoaXMuZW5jb2RpbmcpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgYyA9IHJlYWRlci5yZWFkKCk7CisKKyAgICAgICAgICAgIHdoaWxlIChjICE9IC0xKSB7CisgICAgICAgICAgICAgICAgb3V0LndyaXRlKGMpOworICAgICAgICAgICAgICAgIGMgPSByZWFkZXIucmVhZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICAgICAgcmVhZGVyLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG91dDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL21ldGFjbGFzcy9DbG9zdXJlTWV0YUNsYXNzLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL21ldGFjbGFzcy9DbG9zdXJlTWV0YUNsYXNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRlMDUzNgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvbWV0YWNsYXNzL0Nsb3N1cmVNZXRhQ2xhc3MuamF2YQpAQCAtMCwwICsxLDY1NCBAQAorLyoNCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4NCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5tZXRhY2xhc3M7DQorDQoraW1wb3J0IGdyb292eS5sYW5nLio7DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucmVmbGVjdGlvbi5DYWNoZWRDbGFzczsNCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5yZWZsZWN0aW9uLkNhY2hlZEZpZWxkOw0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJlZmxlY3Rpb24uQ2FjaGVkTWV0aG9kOw0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJlZmxlY3Rpb24uRmFzdEFycmF5Ow0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuSW52b2tlckhlbHBlcjsNCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLk1ldGFDbGFzc0hlbHBlcjsNCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLndyYXBwZXJzLldyYXBwZXI7DQorDQoraW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOw0KK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7DQoraW1wb3J0IGphdmEudXRpbC4qOw0KK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsNCisNCisvKioNCisgKiBBIE1ldGFjbGFzcyBmb3IgY2xvc3VyZXMgZ2VuZXJhdGVkIGJ5IHRoZSBHcm9vdnkgY29tcGlsZXIuIFRoZXNlIGNsYXNzZXMNCisgKiBoYXZlIHNwZWNpYWwgY2hhcmFjdGVyaXN0aWNzIHRoaXMgTWV0YUNsYXNzIHVzZXMuIE9uZSBvZiB0aGVzZSBpcyB0aGF0IGENCisgKiBnZW5lcmF0ZWQgQ2xvc3VyZSBoYXMgb25seSBhZGRpdGlvbmFsIGRvQ2FsbCBtZXRob2RzLCBhbGwgb3RoZXIgbWV0aG9kcw0KKyAqIGFyZSBpbiB0aGUgQ2xvc3VyZSBjbGFzcyBhcyB3ZWxsLiBUbyB1c2UgdGhpcyBmYWN0IHRoaXMgTWV0YUNsYXNzIHVzZXMNCisgKiBhIE1ldGFDbGFzcyBmb3IgQ2xvc3VyZSBhcyBzdGF0aWMgZmllbGQgQW5kIGRlbGVnYXRlcyBjYWxscyB0byB0aGlzDQorICogTWV0YUNsYXNzIGlmIG5lZWRlZC4gVGhpcyBhbGxvd3MgYSBsZWFuIGltcGxlbWVudGF0aW9uIGZvciB0aGlzIE1ldGFDbGFzcy4NCisgKiBNdWx0aXBsZSBnZW5lcmF0ZWQgY2xvc3VyZXMgd2lsbCB0aGVuIHVzZSB0aGUgc2FtZSBNZXRhQ2xhc3MgZm9yIENsb3N1cmUuDQorICogRm9yIHN0YXRpYyBkaXNwYXRjaGluZyB0aGlzIGNsYXNzIHVzZXMgdGhlIE1ldGFDbGFzcyBvZiBDbGFzcywgYWdhaW4NCisgKiBhbGwgaXNudGFuY2VzIG9mIHRoaXMgY2xhc3Mgd2lsbCBzaGFyZSB0aGF0IE1ldGFDbGFzcy4gVGhlIENsYXNzIE1ldGFDbGFzcw0KKyAqIGlzIGluaXRpYWxpemVkIGxhenksIGJlY2F1c2UgbW9zdCBvcGVyYXRpb25zIGRvIG5vdCBuZWVkIHRoaXMgTWV0YUNsYXNzLg0KKyAqIDxwLz4NCisgKiBUaGUgQ2xvc3VyZSBhbmQgQ2xhc3MgTWV0YUNsYXNzZXMgYXJlIG5vdCByZXBsYWNlYWJsZS4NCisgKiA8cC8+DQorICogVGhpcyBNZXRhQ2xhc3MgaXMgZm9yIGludGVybmFsIHVzYWdlIG9ubHkhDQorICoNCisgKiBAYXV0aG9yIEpvY2hlbiBUaGVvZG9yb3UNCisgKiBAc2luY2UgMS4xDQorICovDQorcHVibGljIGZpbmFsIGNsYXNzIENsb3N1cmVNZXRhQ2xhc3MgZXh0ZW5kcyBNZXRhQ2xhc3NJbXBsIHsNCisgICAgcHJpdmF0ZSBib29sZWFuIGluaXRpYWxpemVkOw0KKyAgICBwcml2YXRlIGZpbmFsIEZhc3RBcnJheSBjbG9zdXJlTWV0aG9kcyA9IG5ldyBGYXN0QXJyYXkoMyk7DQorICAgIHByaXZhdGUgTWFwIGF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcCgpOw0KKyAgICBwcml2YXRlIE1ldGhvZENob29zZXIgY2hvb3NlcjsNCisgICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIGF0dHJpYnV0ZUluaXREb25lID0gZmFsc2U7DQorDQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1ldGFDbGFzc0ltcGwgQ0xPU1VSRV9NRVRBQ0xBU1M7DQorICAgIHByaXZhdGUgc3RhdGljIE1ldGFDbGFzc0ltcGwgY2xhc3NNZXRhQ2xhc3M7DQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIEVNUFRZX0FSR1VNRU5UUyA9IHt9Ow0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xPU1VSRV9DQUxMX01FVEhPRCA9ICJjYWxsIjsNCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMT1NVUkVfRE9fQ0FMTF9NRVRIT0QgPSAiZG9DYWxsIjsNCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMT1NVUkVfQ1VSUllfTUVUSE9EID0gImN1cnJ5IjsNCisNCisgICAgc3RhdGljIHsNCisgICAgICAgIENMT1NVUkVfTUVUQUNMQVNTID0gbmV3IE1ldGFDbGFzc0ltcGwoQ2xvc3VyZS5jbGFzcyk7DQorICAgICAgICBDTE9TVVJFX01FVEFDTEFTUy5pbml0aWFsaXplKCk7DQorICAgIH0NCisNCisgICAgcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIE1ldGFDbGFzcyBnZXRTdGF0aWNNZXRhQ2xhc3MoKSB7DQorICAgICAgICBpZiAoY2xhc3NNZXRhQ2xhc3MgPT0gbnVsbCkgew0KKyAgICAgICAgICAgIGNsYXNzTWV0YUNsYXNzID0gbmV3IE1ldGFDbGFzc0ltcGwoQ2xhc3MuY2xhc3MpOw0KKyAgICAgICAgICAgIGNsYXNzTWV0YUNsYXNzLmluaXRpYWxpemUoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBjbGFzc01ldGFDbGFzczsNCisgICAgfQ0KKw0KKyAgICBwcml2YXRlIHN0YXRpYyBpbnRlcmZhY2UgTWV0aG9kQ2hvb3NlciB7DQorICAgICAgICBPYmplY3QgY2hvb3NlTWV0aG9kKENsYXNzW10gYXJndW1lbnRzLCBib29sZWFuIGNvZXJjZSk7DQorICAgIH0NCisNCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3RhbmRhcmRDbG9zdXJlQ2hvb3NlciBpbXBsZW1lbnRzIE1ldGhvZENob29zZXIgew0KKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBNZXRhTWV0aG9kIGRvQ2FsbDA7DQorICAgICAgICBwcml2YXRlIGZpbmFsIE1ldGFNZXRob2QgZG9DYWxsMTsNCisNCisgICAgICAgIFN0YW5kYXJkQ2xvc3VyZUNob29zZXIoTWV0YU1ldGhvZCBtMCwgTWV0YU1ldGhvZCBtMSkgew0KKyAgICAgICAgICAgIGRvQ2FsbDAgPSBtMDsNCisgICAgICAgICAgICBkb0NhbGwxID0gbTE7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgT2JqZWN0IGNob29zZU1ldGhvZChDbGFzc1tdIGFyZ3VtZW50cywgYm9vbGVhbiBjb2VyY2UpIHsNCisgICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAwKSByZXR1cm4gZG9DYWxsMDsNCisgICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSByZXR1cm4gZG9DYWxsMTsNCisgICAgICAgICAgICByZXR1cm4gbnVsbDsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBOb3JtYWxNZXRob2RDaG9vc2VyIGltcGxlbWVudHMgTWV0aG9kQ2hvb3NlciB7DQorICAgICAgICBwcml2YXRlIGZpbmFsIEZhc3RBcnJheSBtZXRob2RzOw0KKyAgICAgICAgZmluYWwgQ2xhc3MgdGhlQ2xhc3M7DQorDQorICAgICAgICBOb3JtYWxNZXRob2RDaG9vc2VyKENsYXNzIHRoZUNsYXNzLCBGYXN0QXJyYXkgbWV0aG9kcykgew0KKyAgICAgICAgICAgIHRoaXMudGhlQ2xhc3MgPSB0aGVDbGFzczsNCisgICAgICAgICAgICB0aGlzLm1ldGhvZHMgPSBtZXRob2RzOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIE9iamVjdCBjaG9vc2VNZXRob2QoQ2xhc3NbXSBhcmd1bWVudHMsIGJvb2xlYW4gY29lcmNlKSB7DQorICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMCkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gTWV0YUNsYXNzSGVscGVyLmNob29zZUVtcHR5TWV0aG9kUGFyYW1zKG1ldGhvZHMpOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxICYmIGFyZ3VtZW50c1swXSA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBNZXRhQ2xhc3NIZWxwZXIuY2hvb3NlTW9zdEdlbmVyYWxNZXRob2RXaXRoMU51bGxQYXJhbShtZXRob2RzKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBMaXN0IG1hdGNoaW5nTWV0aG9kcyA9IG5ldyBBcnJheUxpc3QoKTsNCisNCisgICAgICAgICAgICAgICAgZmluYWwgaW50IGxlbiA9IG1ldGhvZHMuc2l6ZSgpOw0KKyAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3RbXSBkYXRhID0gbWV0aG9kcy5nZXRBcnJheSgpOw0KKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSAhPSBsZW47ICsraSkgew0KKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG1ldGhvZCA9IGRhdGFbaV07DQorDQorICAgICAgICAgICAgICAgICAgICAvLyBtYWtpbmcgdGhpcyBmYWxzZSBoZWxwcyBmaW5kIG1hdGNoZXMNCisgICAgICAgICAgICAgICAgICAgIGlmIChNZXRhQ2xhc3NIZWxwZXIuaXNWYWxpZE1ldGhvZChtZXRob2QsIGFyZ3VtZW50cywgY29lcmNlKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoaW5nTWV0aG9kcy5hZGQobWV0aG9kKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAobWF0Y2hpbmdNZXRob2RzLmlzRW1wdHkoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWF0Y2hpbmdNZXRob2RzLnNpemUoKSA9PSAxKSB7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hpbmdNZXRob2RzLmdldCgwKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gY2hvb3NlTW9zdFNwZWNpZmljUGFyYW1zKENMT1NVUkVfRE9fQ0FMTF9NRVRIT0QsIG1hdGNoaW5nTWV0aG9kcywgYXJndW1lbnRzKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBwcml2YXRlIE9iamVjdCBjaG9vc2VNb3N0U3BlY2lmaWNQYXJhbXMoU3RyaW5nIG5hbWUsIExpc3QgbWF0Y2hpbmdNZXRob2RzLCBDbGFzc1tdIGFyZ3VtZW50cykgew0KKyAgICAgICAgICAgIGxvbmcgbWF0Y2hlc0Rpc3RhbmNlID0gLTE7DQorICAgICAgICAgICAgTGlua2VkTGlzdCBtYXRjaGVzID0gbmV3IExpbmtlZExpc3QoKTsNCisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtYXRjaGluZ01ldGhvZHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7DQorICAgICAgICAgICAgICAgIE9iamVjdCBtZXRob2QgPSBpdGVyLm5leHQoKTsNCisgICAgICAgICAgICAgICAgQ2xhc3NbXSBwYXJhbVR5cGVzID0gTWV0YUNsYXNzSGVscGVyLmdldFBhcmFtZXRlclR5cGVzKG1ldGhvZCkuZ2V0TmF0aXZlUGFyYW1ldGVyVHlwZXMoKTsNCisgICAgICAgICAgICAgICAgaWYgKCFNZXRhQ2xhc3NIZWxwZXIucGFyYW1ldGVyc0FyZUNvbXBhdGlibGUoYXJndW1lbnRzLCBwYXJhbVR5cGVzKSkgY29udGludWU7DQorICAgICAgICAgICAgICAgIGxvbmcgZGlzdCA9IE1ldGFDbGFzc0hlbHBlci5jYWxjdWxhdGVQYXJhbWV0ZXJEaXN0YW5jZShhcmd1bWVudHMsIHBhcmFtVHlwZXMpOw0KKyAgICAgICAgICAgICAgICBpZiAoZGlzdCA9PSAwKSByZXR1cm4gbWV0aG9kOw0KKyAgICAgICAgICAgICAgICBpZiAobWF0Y2hlcy5pc0VtcHR5KCkpIHsNCisgICAgICAgICAgICAgICAgICAgIG1hdGNoZXMuYWRkKG1ldGhvZCk7DQorICAgICAgICAgICAgICAgICAgICBtYXRjaGVzRGlzdGFuY2UgPSBkaXN0Ow0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRpc3QgPCBtYXRjaGVzRGlzdGFuY2UpIHsNCisgICAgICAgICAgICAgICAgICAgIG1hdGNoZXNEaXN0YW5jZSA9IGRpc3Q7DQorICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLmNsZWFyKCk7DQorICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLmFkZChtZXRob2QpOw0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRpc3QgPT0gbWF0Y2hlc0Rpc3RhbmNlKSB7DQorICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLmFkZChtZXRob2QpOw0KKyAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChtYXRjaGVzLnNpemUoKSA9PSAxKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaGVzLmdldEZpcnN0KCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChtYXRjaGVzLmlzRW1wdHkoKSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgLy9tb3JlIHRoYW4gb25lIG1hdGNoaW5nIG1ldGhvZCBmb3VuZCAtLT4gYW1iaWdvdXMhDQorICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJBbWJpZ3VvdXMgbWV0aG9kIG92ZXJsb2FkaW5nIGZvciBtZXRob2QgIjsNCisgICAgICAgICAgICBtc2cgKz0gdGhlQ2xhc3MuZ2V0TmFtZSgpICsgIiMiICsgbmFtZTsNCisgICAgICAgICAgICBtc2cgKz0gIi5cbkNhbm5vdCByZXNvbHZlIHdoaWNoIG1ldGhvZCB0byBpbnZva2UgZm9yICI7DQorICAgICAgICAgICAgbXNnICs9IEludm9rZXJIZWxwZXIudG9TdHJpbmcoYXJndW1lbnRzKTsNCisgICAgICAgICAgICBtc2cgKz0gIiBkdWUgdG8gb3ZlcmxhcHBpbmcgcHJvdG90eXBlcyBiZXR3ZWVuOiI7DQorICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gbWF0Y2hlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsNCisgICAgICAgICAgICAgICAgQ2FjaGVkQ2xhc3NbXSB0eXBlcyA9IE1ldGFDbGFzc0hlbHBlci5nZXRQYXJhbWV0ZXJUeXBlcyhpdGVyLm5leHQoKSkuZ2V0UGFyYW1ldGVyVHlwZXMoKTsNCisgICAgICAgICAgICAgICAgbXNnICs9ICJcblx0IiArIEludm9rZXJIZWxwZXIudG9TdHJpbmcodHlwZXMpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICB0aHJvdyBuZXcgR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbihtc2cpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorDQorICAgIHB1YmxpYyBDbG9zdXJlTWV0YUNsYXNzKE1ldGFDbGFzc1JlZ2lzdHJ5IHJlZ2lzdHJ5LCBDbGFzcyB0aGVDbGFzcykgew0KKyAgICAgICAgc3VwZXIocmVnaXN0cnksIHRoZUNsYXNzKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgTWV0YVByb3BlcnR5IGdldE1ldGFQcm9wZXJ0eShTdHJpbmcgbmFtZSkgew0KKyAgICAgICAgcmV0dXJuIENMT1NVUkVfTUVUQUNMQVNTLmdldE1ldGFQcm9wZXJ0eShuYW1lKTsNCisgICAgfQ0KKw0KKyAgICBwcml2YXRlIHZvaWQgdW53cmFwKE9iamVjdFtdIGFyZ3VtZW50cykgew0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgIT0gYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7DQorICAgICAgICAgICAgaWYgKGFyZ3VtZW50c1tpXSBpbnN0YW5jZW9mIFdyYXBwZXIpIHsNCisgICAgICAgICAgICAgICAgYXJndW1lbnRzW2ldID0gKChXcmFwcGVyKSBhcmd1bWVudHNbaV0pLnVud3JhcCgpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBwcml2YXRlIE1ldGFNZXRob2QgcGlja0Nsb3N1cmVNZXRob2QoQ2xhc3NbXSBhcmdDbGFzc2VzKSB7DQorICAgICAgICBPYmplY3QgYW5zd2VyID0gY2hvb3Nlci5jaG9vc2VNZXRob2QoYXJnQ2xhc3NlcywgZmFsc2UpOw0KKyAgICAgICAgcmV0dXJuIChNZXRhTWV0aG9kKSBhbnN3ZXI7DQorICAgIH0NCisNCisgICAgcHJpdmF0ZSBNZXRhTWV0aG9kIGdldERlbGVnYXRlTWV0aG9kKENsb3N1cmUgY2xvc3VyZSwgT2JqZWN0IGRlbGVnYXRlLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3NbXSBhcmdDbGFzc2VzKSB7DQorICAgICAgICBpZiAoZGVsZWdhdGUgPT0gY2xvc3VyZSB8fCBkZWxlZ2F0ZSA9PSBudWxsKSByZXR1cm4gbnVsbDsNCisgICAgICAgIE1ldGFDbGFzcyBkZWxlZ2F0ZU1ldGFDbGFzczsNCisgICAgICAgIGlmIChkZWxlZ2F0ZSBpbnN0YW5jZW9mIENsYXNzKSB7DQorICAgICAgICAgICAgZGVsZWdhdGVNZXRhQ2xhc3MgPSByZWdpc3RyeS5nZXRNZXRhQ2xhc3MoKENsYXNzKWRlbGVnYXRlKTsNCisgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGVNZXRhQ2xhc3MuZ2V0U3RhdGljTWV0YU1ldGhvZChtZXRob2ROYW1lLCBhcmdDbGFzc2VzKTsNCisgICAgICAgIH0NCisgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgIGRlbGVnYXRlTWV0YUNsYXNzID0gbG9va3VwT2JqZWN0TWV0YUNsYXNzKGRlbGVnYXRlKTsNCisgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGVNZXRhQ2xhc3MucGlja01ldGhvZChtZXRob2ROYW1lLCBhcmdDbGFzc2VzKTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgT2JqZWN0IGludm9rZU1ldGhvZChDbGFzcyBzZW5kZXIsIE9iamVjdCBvYmplY3QsIFN0cmluZyBtZXRob2ROYW1lLCBPYmplY3RbXSBvcmlnaW5hbEFyZ3VtZW50cywgYm9vbGVhbiBpc0NhbGxUb1N1cGVyLCBib29sZWFuIGZyb21JbnNpZGVDbGFzcykgew0KKyAgICAgICAgY2hlY2tJbml0YWxpc2VkKCk7DQorICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpIHsNCisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkNhbm5vdCBpbnZva2UgbWV0aG9kOiAiICsgbWV0aG9kTmFtZSArICIgb24gbnVsbCBvYmplY3QiKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChMT0cuaXNMb2dnYWJsZShMZXZlbC5GSU5FUikpIHsNCisgICAgICAgICAgICBNZXRhQ2xhc3NIZWxwZXIubG9nTWV0aG9kQ2FsbChvYmplY3QsIG1ldGhvZE5hbWUsIG9yaWdpbmFsQXJndW1lbnRzKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIGZpbmFsIE9iamVjdFtdIGFyZ3VtZW50cyA9IG1ha2VBcmd1bWVudHMob3JpZ2luYWxBcmd1bWVudHMsIG1ldGhvZE5hbWUpOyANCisgICAgICAgIGZpbmFsIENsYXNzW10gYXJnQ2xhc3NlcyA9IE1ldGFDbGFzc0hlbHBlci5jb252ZXJ0VG9UeXBlQXJyYXkoYXJndW1lbnRzKTsNCisgICAgICAgIHVud3JhcChhcmd1bWVudHMpOw0KKw0KKyAgICAgICAgTWV0YU1ldGhvZCBtZXRob2Q7DQorICAgICAgICBmaW5hbCBDbG9zdXJlIGNsb3N1cmUgPSAoQ2xvc3VyZSkgb2JqZWN0Ow0KKw0KKyAgICAgICAgaWYgKENMT1NVUkVfRE9fQ0FMTF9NRVRIT0QuZXF1YWxzKG1ldGhvZE5hbWUpIHx8IENMT1NVUkVfQ0FMTF9NRVRIT0QuZXF1YWxzKG1ldGhvZE5hbWUpKSB7DQorICAgICAgICAgICAgbWV0aG9kID0gcGlja0Nsb3N1cmVNZXRob2QoYXJnQ2xhc3Nlcyk7DQorICAgICAgICAgICAgaWYgKG1ldGhvZD09bnVsbCAmJiBhcmd1bWVudHMubGVuZ3RoPT0xICYmIGFyZ3VtZW50c1swXSBpbnN0YW5jZW9mIExpc3QpIHsNCisgICAgICAgICAgICAgICAgT2JqZWN0W10gbmV3QXJndW1lbnRzID0gKChMaXN0KSBhcmd1bWVudHNbMF0pLnRvQXJyYXkoKTsNCisgICAgICAgICAgICAgICAgQ2xhc3NbXSBuZXdBcmdDbGFzc2VzID0gTWV0YUNsYXNzSGVscGVyLmNvbnZlcnRUb1R5cGVBcnJheShuZXdBcmd1bWVudHMpOw0KKyAgICAgICAgICAgICAgICBtZXRob2QgPSBwaWNrQ2xvc3VyZU1ldGhvZChuZXdBcmdDbGFzc2VzKTsNCisgICAgICAgICAgICAgICAgaWYgKG1ldGhvZCE9bnVsbCkgew0KKyAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gbmV3IFRyYW5zZm9ybU1ldGFNZXRob2QobWV0aG9kKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBpbnZva2UoT2JqZWN0IG9iamVjdCwgT2JqZWN0W10gYXJndW1lbnRzKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBmaXJzdEFyZ3VtZW50ID0gYXJndW1lbnRzWzBdOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0IGxpc3QgPSAoTGlzdCkgZmlyc3RBcmd1bWVudDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzID0gbGlzdC50b0FycmF5KCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5pbnZva2Uob2JqZWN0LCBhcmd1bWVudHMpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH07DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKG1ldGhvZD09bnVsbCkgdGhyb3cgbmV3IE1pc3NpbmdNZXRob2RFeGNlcHRpb24obWV0aG9kTmFtZSwgdGhlQ2xhc3MsIGFyZ3VtZW50cywgZmFsc2UpOw0KKyAgICAgICAgfSBlbHNlIGlmIChDTE9TVVJFX0NVUlJZX01FVEhPRC5lcXVhbHMobWV0aG9kTmFtZSkpIHsNCisgICAgICAgICAgICByZXR1cm4gY2xvc3VyZS5jdXJyeShhcmd1bWVudHMpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBtZXRob2QgPSBDTE9TVVJFX01FVEFDTEFTUy5waWNrTWV0aG9kKG1ldGhvZE5hbWUsIGFyZ0NsYXNzZXMpOw0KKyAgICAgICAgfQ0KKyANCisgICAgICAgIGlmIChtZXRob2QgIT0gbnVsbCkgcmV0dXJuIE1ldGFDbGFzc0hlbHBlci5kb01ldGhvZEludm9rZShvYmplY3QsIG1ldGhvZCwgYXJndW1lbnRzKTsNCisNCisgICAgICAgIE1pc3NpbmdNZXRob2RFeGNlcHRpb24gbGFzdCA9IG51bGw7DQorICAgICAgICBPYmplY3QgY2FsbE9iamVjdCA9IG9iamVjdDsNCisgICAgICAgIGlmIChtZXRob2QgPT0gbnVsbCkgew0KKyAgICAgICAgICAgIGZpbmFsIE9iamVjdCBvd25lciA9IGNsb3N1cmUuZ2V0T3duZXIoKTsNCisgICAgICAgICAgICBmaW5hbCBPYmplY3QgZGVsZWdhdGUgPSBjbG9zdXJlLmdldERlbGVnYXRlKCk7DQorICAgICAgICAgICAgZmluYWwgT2JqZWN0IHRoaXNPYmplY3QgPSBjbG9zdXJlLmdldFRoaXNPYmplY3QoKTsNCisgICAgICAgICAgICBmaW5hbCBpbnQgcmVzb2x2ZVN0cmF0ZWd5ID0gY2xvc3VyZS5nZXRSZXNvbHZlU3RyYXRlZ3koKTsNCisgICAgICAgICAgICBib29sZWFuIGludm9rZU9uRGVsZWdhdGUgPSBmYWxzZTsNCisgICAgICAgICAgICBib29sZWFuIGludm9rZU9uT3duZXIgPSBmYWxzZTsNCisgICAgICAgICAgICBib29sZWFuIG93bmVyRmlyc3QgPSB0cnVlOw0KKw0KKyAgICAgICAgICAgIHN3aXRjaCAocmVzb2x2ZVN0cmF0ZWd5KSB7DQorICAgICAgICAgICAgICAgIGNhc2UgQ2xvc3VyZS5UT19TRUxGOg0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgQ2xvc3VyZS5ERUxFR0FURV9PTkxZOg0KKyAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gZ2V0RGVsZWdhdGVNZXRob2QoY2xvc3VyZSwgZGVsZWdhdGUsIG1ldGhvZE5hbWUsIGFyZ0NsYXNzZXMpOw0KKyAgICAgICAgICAgICAgICAgICAgY2FsbE9iamVjdCA9IGRlbGVnYXRlOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZCA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaW52b2tlT25EZWxlZ2F0ZSA9IGRlbGVnYXRlICE9IGNsb3N1cmUgJiYgKGRlbGVnYXRlIGluc3RhbmNlb2YgR3Jvb3Z5T2JqZWN0KTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlIENsb3N1cmUuT1dORVJfT05MWToNCisgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9IGdldERlbGVnYXRlTWV0aG9kKGNsb3N1cmUsIG93bmVyLCBtZXRob2ROYW1lLCBhcmdDbGFzc2VzKTsNCisgICAgICAgICAgICAgICAgICAgIGNhbGxPYmplY3QgPSBvd25lcjsNCisgICAgICAgICAgICAgICAgICAgIGlmIChtZXRob2QgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludm9rZU9uT3duZXIgPSBvd25lciAhPSBjbG9zdXJlICYmIChvd25lciBpbnN0YW5jZW9mIEdyb292eU9iamVjdCk7DQorICAgICAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgY2FzZSBDbG9zdXJlLkRFTEVHQVRFX0ZJUlNUOg0KKyAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gZ2V0RGVsZWdhdGVNZXRob2QoY2xvc3VyZSwgZGVsZWdhdGUsIG1ldGhvZE5hbWUsIGFyZ0NsYXNzZXMpOw0KKyAgICAgICAgICAgICAgICAgICAgY2FsbE9iamVjdCA9IGRlbGVnYXRlOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZCA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gZ2V0RGVsZWdhdGVNZXRob2QoY2xvc3VyZSwgb3duZXIsIG1ldGhvZE5hbWUsIGFyZ0NsYXNzZXMpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxPYmplY3QgPSBvd25lcjsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGlmIChtZXRob2QgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludm9rZU9uRGVsZWdhdGUgPSBkZWxlZ2F0ZSAhPSBjbG9zdXJlICYmIChkZWxlZ2F0ZSBpbnN0YW5jZW9mIEdyb292eU9iamVjdCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgaW52b2tlT25Pd25lciA9IG93bmVyICE9IGNsb3N1cmUgJiYgKG93bmVyIGluc3RhbmNlb2YgR3Jvb3Z5T2JqZWN0KTsNCisgICAgICAgICAgICAgICAgICAgICAgICBvd25lckZpcnN0ID0gZmFsc2U7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgZGVmYXVsdDogLy8gb3duZXIgZmlyc3QNCisgICAgICAgICAgICAgICAgICAgIC8vIG93bmVyIGZpcnN0IG1lYW5zIHdlIHN0YXJ0IHdpdGggdGhlIG91dGVyIG1vc3Qgb3duZXIgdGhhdCBpcyBub3QgYSBnZW5lcmF0ZWQgY2xvc3VyZQ0KKyAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBvd25lciBpcyBlcXVhbCB0byB0aGUgdGhpcyBvYmplY3QsIHNvIHdlIGNoZWNrIHRoYXQgb25lIGZpcnN0LiAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSBnZXREZWxlZ2F0ZU1ldGhvZChjbG9zdXJlLCB0aGlzT2JqZWN0LCBtZXRob2ROYW1lLCBhcmdDbGFzc2VzKTsNCisgICAgICAgICAgICAgICAgICAgIGNhbGxPYmplY3QgPSB0aGlzT2JqZWN0Ow0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZCA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgLy90cnkgZmluZGluZyBhIGRlbGVnYXRlIHRoYXQgaGFzIHRoYXQgbWV0aG9kLi4uIHdlIHN0YXJ0IGZyb20gDQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0c2lkZSBidWlsZGluZyBhIHN0YWNrIGFuZCB0cnkgZWFjaCBkZWxlZ2F0ZQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIExpbmtlZExpc3QgbGlzdCA9IG5ldyBMaW5rZWRMaXN0KCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChPYmplY3QgY3VycmVudCA9IGNsb3N1cmU7IGN1cnJlbnQhPXRoaXNPYmplY3Q7ICkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbG9zdXJlIGN1cnJlbnRDbG9zdXJlID0gKENsb3N1cmUpIGN1cnJlbnQ7IA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudENsb3N1cmUuZ2V0RGVsZWdhdGUoKSE9bnVsbCkgbGlzdC5hZGQoY3VycmVudCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQ9Y3VycmVudENsb3N1cmUuZ2V0T3duZXIoKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFsaXN0LmlzRW1wdHkoKSAmJiBtZXRob2Q9PW51bGwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xvc3VyZSBjbG9zdXJlV2l0aERlbGVnYXRlID0gKENsb3N1cmUpIGxpc3QucmVtb3ZlTGFzdCgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY3VycmVudERlbGVnYXRlID0gY2xvc3VyZVdpdGhEZWxlZ2F0ZS5nZXREZWxlZ2F0ZSgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSBnZXREZWxlZ2F0ZU1ldGhvZChjbG9zdXJlV2l0aERlbGVnYXRlLGN1cnJlbnREZWxlZ2F0ZSxtZXRob2ROYW1lLGFyZ0NsYXNzZXMpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsT2JqZWN0ID0gY3VycmVudERlbGVnYXRlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIGlmIChtZXRob2QgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludm9rZU9uRGVsZWdhdGUgPSBkZWxlZ2F0ZSAhPSBjbG9zdXJlICYmIChkZWxlZ2F0ZSBpbnN0YW5jZW9mIEdyb292eU9iamVjdCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgaW52b2tlT25Pd25lciA9IG93bmVyICE9IGNsb3N1cmUgJiYgKG93bmVyIGluc3RhbmNlb2YgR3Jvb3Z5T2JqZWN0KTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKG1ldGhvZCA9PSBudWxsICYmIChpbnZva2VPbk93bmVyIHx8IGludm9rZU9uRGVsZWdhdGUpKSB7DQorICAgICAgICAgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAob3duZXJGaXJzdCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnZva2VPbkRlbGVnYXRpb25PYmplY3RzKGludm9rZU9uT3duZXIsIG93bmVyLCBpbnZva2VPbkRlbGVnYXRlLCBkZWxlZ2F0ZSwgbWV0aG9kTmFtZSwgYXJndW1lbnRzKTsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGludm9rZU9uRGVsZWdhdGlvbk9iamVjdHMoaW52b2tlT25EZWxlZ2F0ZSwgZGVsZWdhdGUsIGludm9rZU9uT3duZXIsIG93bmVyLCBtZXRob2ROYW1lLCBhcmd1bWVudHMpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChNaXNzaW5nTWV0aG9kRXhjZXB0aW9uIG1tZSkgew0KKyAgICAgICAgICAgICAgICAgICAgbGFzdCA9IG1tZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIGlmIChtZXRob2QgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIHJldHVybiBNZXRhQ2xhc3NIZWxwZXIuZG9NZXRob2RJbnZva2UoY2FsbE9iamVjdCwgbWV0aG9kLCBhcmd1bWVudHMpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAvLyBpZiBubyBtZXRob2Qgd2FzIGZvdW5kLCB0cnkgdG8gZmluZCBhIGNsb3N1cmUgZGVmaW5lZCBhcyBhIGZpZWxkIG9mIHRoZSBjbGFzcyBhbmQgcnVuIGl0DQorICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gbnVsbDsNCisgICAgICAgICAgICB0cnkgew0KKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuZ2V0UHJvcGVydHkob2JqZWN0LCBtZXRob2ROYW1lKTsNCisgICAgICAgICAgICB9IGNhdGNoIChNaXNzaW5nUHJvcGVydHlFeGNlcHRpb24gbXBlKSB7DQorICAgICAgICAgICAgICAgIC8vIGlnbm9yZQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBDbG9zdXJlKSB7ICAvLyBUaGlzIHRlc3QgZW5zdXJlcyB0aGF0IHZhbHVlICE9IHRoaXMgSWYgeW91IGV2ZXIgY2hhbmdlIHRoaXMgZW5zdXJlIHRoYXQgdmFsdWUgIT0gdGhpcw0KKyAgICAgICAgICAgICAgICBDbG9zdXJlIGNsID0gKENsb3N1cmUpIHZhbHVlOw0KKyAgICAgICAgICAgICAgICBNZXRhQ2xhc3MgZGVsZWdhdGVNZXRhQ2xhc3MgPSBjbC5nZXRNZXRhQ2xhc3MoKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlTWV0YUNsYXNzLmludm9rZU1ldGhvZChjbC5nZXRDbGFzcygpLCBjbG9zdXJlLCBDTE9TVVJFX0RPX0NBTExfTUVUSE9ELCBvcmlnaW5hbEFyZ3VtZW50cywgZmFsc2UsIGZyb21JbnNpZGVDbGFzcyk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaWYgKGxhc3QgIT0gbnVsbCkgdGhyb3cgbGFzdDsNCisgICAgICAgIHRocm93IG5ldyBNaXNzaW5nTWV0aG9kRXhjZXB0aW9uKG1ldGhvZE5hbWUsIHRoZUNsYXNzLCBhcmd1bWVudHMsIGZhbHNlKTsNCisgICAgfQ0KKw0KKyAgICBwcml2YXRlIE9iamVjdFtdIG1ha2VBcmd1bWVudHMoT2JqZWN0W10gYXJndW1lbnRzLCBTdHJpbmcgbWV0aG9kTmFtZSkgew0KKyAgICAgICAgaWYgKGFyZ3VtZW50cyA9PSBudWxsKSByZXR1cm4gRU1QVFlfQVJHVU1FTlRTOw0KKyAgICAgICAgaWYgKENMT1NVUkVfQ0FMTF9NRVRIT0QuZXF1YWxzKG1ldGhvZE5hbWUpKSB7DQorICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGg9PTEgJiYgYXJndW1lbnRzWzBdIGluc3RhbmNlb2YgT2JqZWN0W10pIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIChPYmplY3RbXSkgYXJndW1lbnRzWzBdOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBhcmd1bWVudHM7DQorICAgIH0NCisNCisgICAgcHJpdmF0ZSBPYmplY3QgaW52b2tlT25EZWxlZ2F0aW9uT2JqZWN0cygNCisgICAgICAgICAgICBib29sZWFuIGludm9rZTEsIE9iamVjdCBvMSwNCisgICAgICAgICAgICBib29sZWFuIGludm9rZTIsIE9iamVjdCBvMiwNCisgICAgICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSwgT2JqZWN0W10gYXJncykgew0KKyAgICAgICAgTWlzc2luZ01ldGhvZEV4Y2VwdGlvbiBmaXJzdCA9IG51bGw7DQorICAgICAgICBpZiAoaW52b2tlMSkgew0KKyAgICAgICAgICAgIEdyb292eU9iamVjdCBnbyA9IChHcm9vdnlPYmplY3QpIG8xOw0KKyAgICAgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBnby5pbnZva2VNZXRob2QobWV0aG9kTmFtZSwgYXJncyk7DQorICAgICAgICAgICAgfSBjYXRjaCAoTWlzc2luZ01ldGhvZEV4Y2VwdGlvbiBtbWUpIHsNCisgICAgICAgICAgICAgICAgZmlyc3QgPSBtbWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGludm9rZTIpIHsNCisgICAgICAgICAgICBHcm9vdnlPYmplY3QgZ28gPSAoR3Jvb3Z5T2JqZWN0KSBvMjsNCisgICAgICAgICAgICB0cnkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gZ28uaW52b2tlTWV0aG9kKG1ldGhvZE5hbWUsIGFyZ3MpOw0KKyAgICAgICAgICAgIH0gY2F0Y2ggKE1pc3NpbmdNZXRob2RFeGNlcHRpb24gbW1lKSB7DQorICAgICAgICAgICAgICAgIGlmIChmaXJzdCA9PSBudWxsKSBmaXJzdCA9IG1tZTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICB0aHJvdyBmaXJzdDsNCisgICAgfQ0KKw0KKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGluaXRBdHRyaWJ1dGVzKCkgew0KKyAgICAgICAgaWYgKCFhdHRyaWJ1dGVzLmlzRW1wdHkoKSkgcmV0dXJuOw0KKyAgICAgICAgYXR0cmlidXRlcy5wdXQoIiEiLCBudWxsKTsgLy8ganVzdCBhIGR1bW15IGZvciBsYXRlcg0KKyAgICAgICAgQ2FjaGVkRmllbGRbXSBmaWVsZEFycmF5ID0gdGhlQ2FjaGVkQ2xhc3MuZ2V0RmllbGRzKCk7DQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkQXJyYXkubGVuZ3RoOyBpKyspIHsNCisgICAgICAgICAgICBNZXRhRmllbGRQcm9wZXJ0eSBtZnAgPSBNZXRhRmllbGRQcm9wZXJ0eS5jcmVhdGUoZmllbGRBcnJheVtpXSk7DQorICAgICAgICAgICAgYXR0cmlidXRlcy5wdXQoZmllbGRBcnJheVtpXS5nZXROYW1lKCksIG1mcCk7DQorICAgICAgICB9DQorICAgICAgICBhdHRyaWJ1dGVJbml0RG9uZSA9ICFhdHRyaWJ1dGVzLmlzRW1wdHkoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsNCisgICAgICAgIGlmICghaXNJbml0aWFsaXplZCgpKSB7DQorICAgICAgICAgICAgQ2FjaGVkTWV0aG9kW10gbWV0aG9kQXJyYXkgPSB0aGVDYWNoZWRDbGFzcy5nZXRNZXRob2RzKCk7DQorICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGVDYWNoZWRDbGFzcykgew0KKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZEFycmF5Lmxlbmd0aDsgaSsrKSB7DQorICAgICAgICAgICAgICAgICAgICBmaW5hbCBDYWNoZWRNZXRob2QgY2FjaGVkTWV0aG9kID0gbWV0aG9kQXJyYXlbaV07DQorICAgICAgICAgICAgICAgICAgICBNZXRob2QgcmVmbGVjdGlvbk1ldGhvZCA9IGNhY2hlZE1ldGhvZC5jYWNoZWRNZXRob2Q7DQorICAgICAgICAgICAgICAgICAgICBpZiAoIXJlZmxlY3Rpb25NZXRob2QuZ2V0TmFtZSgpLmVxdWFscyhDTE9TVVJFX0RPX0NBTExfTUVUSE9EKSkgY29udGludWU7DQorICAgICAgICAgICAgICAgICAgICBNZXRhTWV0aG9kIG1ldGhvZCA9IGNhY2hlZE1ldGhvZC5nZXRSZWZsZWN0aW9uTWV0YU1ldGhvZCgpOw0KKyAgICAgICAgICAgICAgICAgICAgY2xvc3VyZU1ldGhvZHMuYWRkKG1ldGhvZCk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYXNzaWduTWV0aG9kQ2hvb3NlcigpOw0KKw0KKyAgICAgICAgICAgIGluaXRpYWxpemVkID0gdHJ1ZTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBwcml2YXRlIHZvaWQgYXNzaWduTWV0aG9kQ2hvb3NlcigpIHsNCisgICAgICAgIGlmIChjbG9zdXJlTWV0aG9kcy5zaXplKCkgPT0gMSkgew0KKyAgICAgICAgICAgIGZpbmFsIE1ldGFNZXRob2QgZG9DYWxsID0gKE1ldGFNZXRob2QpIGNsb3N1cmVNZXRob2RzLmdldCgwKTsNCisgICAgICAgICAgICBmaW5hbCBDYWNoZWRDbGFzc1tdIGMgPSBkb0NhbGwuZ2V0UGFyYW1ldGVyVHlwZXMoKTsNCisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gYy5sZW5ndGg7DQorICAgICAgICAgICAgaWYgKGxlbmd0aCA9PSAwKSB7DQorICAgICAgICAgICAgICAgIC8vIG5vIGFyZyBtZXRob2QNCisgICAgICAgICAgICAgICAgY2hvb3NlciA9IG5ldyBNZXRob2RDaG9vc2VyKCkgew0KKyAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBjaG9vc2VNZXRob2QoQ2xhc3NbXSBhcmd1bWVudHMsIGJvb2xlYW4gY29lcmNlKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMCkgcmV0dXJuIGRvQ2FsbDsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID09IDEgJiYgY1swXS5nZXRDYWNoZWRDbGFzcygpID09IE9iamVjdC5jbGFzcykgew0KKyAgICAgICAgICAgICAgICAgICAgLy8gT2JqZWN0IGZpdHMgYWxsLCBzbyBzaW1wbGUgZGlzcGF0Y2ggcnVsZSBoZXJlDQorICAgICAgICAgICAgICAgICAgICBjaG9vc2VyID0gbmV3IE1ldGhvZENob29zZXIoKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBjaG9vc2VNZXRob2QoQ2xhc3NbXSBhcmd1bWVudHMsIGJvb2xlYW4gY29lcmNlKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDwyLCBiZWNhdXNlIGZvbygpIGlzIHNhbWUgYXMgZm9vKG51bGwpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIGRvQ2FsbDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYWxsT2JqZWN0ID0gdHJ1ZTsNCisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYy5sZW5ndGggLSAxOyBpKyspIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY1tpXS5nZXRDYWNoZWRDbGFzcygpICE9IE9iamVjdC5jbGFzcykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxPYmplY3QgPSBmYWxzZTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGFsbE9iamVjdCAmJiBjW2MubGVuZ3RoIC0gMV0uZ2V0Q2FjaGVkQ2xhc3MoKSA9PSBPYmplY3QuY2xhc3MpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGwgYXJndW1lbnRzIGFyZSBvYmplY3QsIHNvIHRlc3Qgb25seSBpZiBhcmd1bWVudCBudW1iZXIgaXMgY29ycmVjdA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNob29zZXIgPSBuZXcgTWV0aG9kQ2hvb3NlcigpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBjaG9vc2VNZXRob2QoQ2xhc3NbXSBhcmd1bWVudHMsIGJvb2xlYW4gY29lcmNlKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSBjLmxlbmd0aCkgcmV0dXJuIGRvQ2FsbDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgfTsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFsbE9iamVjdCAmJiBjW2MubGVuZ3RoIC0gMV0uZ2V0Q2FjaGVkQ2xhc3MoKSA9PSBPYmplY3RbXS5jbGFzcykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGwgYXJndW1lbnRzIGFyZSBPYmplY3QgYnV0IGxhc3QsIHdoaWNoIGlzIGEgdmFyZ3MgYXJndW1lbnQsIHRoYXQNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCBmaXQgYWxsLCBzbyBqc3V0IHRlc3QgaWYgdGhlIG51bWJlciBvZiBhcmd1bWVudCBpcyBlcXVhbCBvcg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3JlIHRoYW4gdGhlIHBhcmFtZXRlcnMgd2UgaGF2ZS4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG1pbmltdW1MZW5ndGggPSBjLmxlbmd0aCAtIDI7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob29zZXIgPSBuZXcgTWV0aG9kQ2hvb3NlcigpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgY2hvb3NlTWV0aG9kKENsYXNzW10gYXJndW1lbnRzLCBib29sZWFuIGNvZXJjZSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gbWluaW11bUxlbmd0aCkgcmV0dXJuIGRvQ2FsbDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZW5lcmFsIGNhc2UgZm9yIHNpbmdsZSBtZXRob2QNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvb3NlciA9IG5ldyBNZXRob2RDaG9vc2VyKCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBjaG9vc2VNZXRob2QoQ2xhc3NbXSBhcmd1bWVudHMsIGJvb2xlYW4gY29lcmNlKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE1ldGFDbGFzc0hlbHBlci5pc1ZhbGlkTWV0aG9kKGRvQ2FsbCwgYXJndW1lbnRzLCBjb2VyY2UpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkb0NhbGw7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSBpZiAoY2xvc3VyZU1ldGhvZHMuc2l6ZSgpID09IDIpIHsNCisgICAgICAgICAgICBNZXRhTWV0aG9kIG0wID0gbnVsbCwgbTEgPSBudWxsOw0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpICE9IGNsb3N1cmVNZXRob2RzLnNpemUoKTsgKytpKSB7DQorICAgICAgICAgICAgICAgIE1ldGFNZXRob2QgbSA9IChNZXRhTWV0aG9kKSBjbG9zdXJlTWV0aG9kcy5nZXQoaSk7DQorICAgICAgICAgICAgICAgIENhY2hlZENsYXNzW10gYyA9IG0uZ2V0UGFyYW1ldGVyVHlwZXMoKTsNCisgICAgICAgICAgICAgICAgaWYgKGMubGVuZ3RoID09IDApIHsNCisgICAgICAgICAgICAgICAgICAgIG0wID0gbTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChjLmxlbmd0aCA9PSAxICYmIGNbMF0uZ2V0Q2FjaGVkQ2xhc3MoKSA9PSBPYmplY3QuY2xhc3MpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBtMSA9IG07DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKG0wICE9IG51bGwgJiYgbTEgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAvLyBzdGFuZGFyZCBjbG9zdXJlICgyIG1ldGhvZHMgYmVjYXVzZSAiaXQiIGlzIHdpdGggZGVmYXVsdCBudWxsKQ0KKyAgICAgICAgICAgICAgICBjaG9vc2VyID0gbmV3IFN0YW5kYXJkQ2xvc3VyZUNob29zZXIobTAsIG0xKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAoY2hvb3NlciA9PSBudWxsKSB7DQorICAgICAgICAgICAgLy8gc3RhbmRhcmQgY2hvb3NlciBmb3IgY2FzZXMgaWYgaXQgaXMgbm90IGEgc2luZ2xlIG1ldGhvZCBhbmQgaWYgaXQgaXMNCisgICAgICAgICAgICAvLyBub3QgdGhlIHN0YW5kYXJkIGNsb3N1cmUuDQorICAgICAgICAgICAgY2hvb3NlciA9IG5ldyBOb3JtYWxNZXRob2RDaG9vc2VyKHRoZUNsYXNzLCBjbG9zdXJlTWV0aG9kcyk7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlUmVmbGVjdG9yKCkgew0KKy8vICAgICAgICBpZiAoR3Jvb3Z5U3lzdGVtLmlzVXNlUmVmbGVjdGlvbigpKQ0KKy8vICAgICAgICAgIHJldHVybjsNCisvLw0KKy8vICAgICAgICByZWZsZWN0b3IgPSAoKE1ldGFDbGFzc1JlZ2lzdHJ5SW1wbCkgcmVnaXN0cnkpLmxvYWRSZWZsZWN0b3IodGhlQ2xhc3MsIGNsb3N1cmVNZXRob2RzKTsNCisvLyAgICAgICAgaWYgKHJlZmxlY3RvciA9PSBudWxsKSB7DQorLy8gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiU2hvdWxkIGhhdmUgYSByZWZsZWN0b3IgZm9yICIgKyB0aGVDbGFzcy5nZXROYW1lKCkpOw0KKy8vICAgICAgICB9DQorLy8gICAgICAgIC8vIGxldHMgc2V0IHRoZSByZWZsZWN0b3Igb24gYWxsIHRoZSBtZXRob2RzDQorLy8gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGNsb3N1cmVNZXRob2RzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgew0KKy8vICAgICAgICAgICAgU3RkTWV0YU1ldGhvZCBtZXRhTWV0aG9kID0gKFN0ZE1ldGFNZXRob2QpIGl0ZXIubmV4dCgpOw0KKy8vICAgICAgICAgICAgbWV0YU1ldGhvZC5zZXRSZWZsZWN0b3IocmVmbGVjdG9yKTsNCisvLyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHByaXZhdGUgTWV0YUNsYXNzIGxvb2t1cE9iamVjdE1ldGFDbGFzcyhPYmplY3Qgb2JqZWN0KSB7DQorICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgR3Jvb3Z5T2JqZWN0KSB7DQorICAgICAgICAgICAgR3Jvb3Z5T2JqZWN0IGdvID0gKEdyb292eU9iamVjdCkgb2JqZWN0Ow0KKyAgICAgICAgICAgIHJldHVybiBnby5nZXRNZXRhQ2xhc3MoKTsNCisgICAgICAgIH0NCisgICAgICAgIENsYXNzIG93bmVyQ2xhc3MgPSBvYmplY3QuZ2V0Q2xhc3MoKTsNCisgICAgICAgIGlmIChvd25lckNsYXNzID09IENsYXNzLmNsYXNzKSBvd25lckNsYXNzID0gKENsYXNzKSBvYmplY3Q7DQorICAgICAgICBNZXRhQ2xhc3MgbWV0YUNsYXNzID0gcmVnaXN0cnkuZ2V0TWV0YUNsYXNzKG93bmVyQ2xhc3MpOw0KKyAgICAgICAgcmV0dXJuIG1ldGFDbGFzczsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgTGlzdCBnZXRNZXRob2RzKCkgew0KKyAgICAgICAgTGlzdCBhbnN3ZXIgPSBDTE9TVVJFX01FVEFDTEFTUy5nZXRNZXRhTWV0aG9kcygpOw0KKyAgICAgICAgYW5zd2VyLmFkZEFsbChjbG9zdXJlTWV0aG9kcy50b0xpc3QoKSk7DQorICAgICAgICByZXR1cm4gYW5zd2VyOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBMaXN0IGdldE1ldGFNZXRob2RzKCkgew0KKyAgICAgICAgcmV0dXJuIENMT1NVUkVfTUVUQUNMQVNTLmdldE1ldGFNZXRob2RzKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIExpc3QgZ2V0UHJvcGVydGllcygpIHsNCisgICAgICAgIHJldHVybiBDTE9TVVJFX01FVEFDTEFTUy5nZXRQcm9wZXJ0aWVzKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIE1ldGFNZXRob2QgcGlja01ldGhvZChTdHJpbmcgbmFtZSwgQ2xhc3NbXSBhcmdUeXBlcykgew0KKyAgICAgICAgaWYgKGFyZ1R5cGVzID09IG51bGwpIGFyZ1R5cGVzID0gRU1QVFlfQ0xBU1NfQVJSQVk7DQorICAgICAgICBpZiAobmFtZS5lcXVhbHMoQ0xPU1VSRV9DQUxMX01FVEhPRCkgfHwgbmFtZS5lcXVhbHMoQ0xPU1VSRV9ET19DQUxMX01FVEhPRCkpIHsNCisgICAgICAgICAgICByZXR1cm4gcGlja0Nsb3N1cmVNZXRob2QoYXJnVHlwZXMpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIENMT1NVUkVfTUVUQUNMQVNTLmdldE1ldGFNZXRob2QobmFtZSwgYXJnVHlwZXMpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBNZXRhTWV0aG9kIHJldHJpZXZlU3RhdGljTWV0aG9kKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzc1tdIGFyZ3VtZW50cykgew0KKyAgICAgICAgcmV0dXJuIG51bGw7DQorICAgIH0NCisNCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpIHsNCisgICAgICAgIHJldHVybiBpbml0aWFsaXplZDsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgTWV0YU1ldGhvZCBnZXRTdGF0aWNNZXRhTWV0aG9kKFN0cmluZyBuYW1lLCBPYmplY3RbXSBhcmdzKSB7DQorICAgICAgICByZXR1cm4gQ0xPU1VSRV9NRVRBQ0xBU1MuZ2V0U3RhdGljTWV0YU1ldGhvZChuYW1lLCBhcmdzKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgTWV0YU1ldGhvZCBnZXRTdGF0aWNNZXRhTWV0aG9kKFN0cmluZyBuYW1lLCBDbGFzc1tdIGFyZ1R5cGVzKSB7DQorICAgICAgICByZXR1cm4gQ0xPU1VSRV9NRVRBQ0xBU1MuZ2V0U3RhdGljTWV0YU1ldGhvZChuYW1lLCBhcmdUeXBlcyk7DQorICAgIH0NCisNCisgICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShDbGFzcyBzZW5kZXIsIE9iamVjdCBvYmplY3QsIFN0cmluZyBuYW1lLCBib29sZWFuIHVzZVN1cGVyLCBib29sZWFuIGZyb21JbnNpZGVDbGFzcykgew0KKyAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIENsYXNzKSB7DQorICAgICAgICAgICAgcmV0dXJuIGdldFN0YXRpY01ldGFDbGFzcygpLmdldFByb3BlcnR5KHNlbmRlciwgb2JqZWN0LCBuYW1lLCB1c2VTdXBlciwgZnJvbUluc2lkZUNsYXNzKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgcmV0dXJuIENMT1NVUkVfTUVUQUNMQVNTLmdldFByb3BlcnR5KHNlbmRlciwgb2JqZWN0LCBuYW1lLCB1c2VTdXBlciwgZnJvbUluc2lkZUNsYXNzKTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZShDbGFzcyBzZW5kZXIsIE9iamVjdCBvYmplY3QsIFN0cmluZyBhdHRyaWJ1dGUsIGJvb2xlYW4gdXNlU3VwZXIsIGJvb2xlYW4gZnJvbUluc2lkZUNsYXNzKSB7DQorICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgQ2xhc3MpIHsNCisgICAgICAgICAgICByZXR1cm4gZ2V0U3RhdGljTWV0YUNsYXNzKCkuZ2V0QXR0cmlidXRlKHNlbmRlciwgb2JqZWN0LCBhdHRyaWJ1dGUsIHVzZVN1cGVyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaWYgKCFhdHRyaWJ1dGVJbml0RG9uZSkgaW5pdEF0dHJpYnV0ZXMoKTsNCisgICAgICAgICAgICBNZXRhRmllbGRQcm9wZXJ0eSBtZnAgPSAoTWV0YUZpZWxkUHJvcGVydHkpIGF0dHJpYnV0ZXMuZ2V0KGF0dHJpYnV0ZSk7DQorICAgICAgICAgICAgaWYgKG1mcCA9PSBudWxsKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBDTE9TVVJFX01FVEFDTEFTUy5nZXRBdHRyaWJ1dGUoc2VuZGVyLCBvYmplY3QsIGF0dHJpYnV0ZSwgdXNlU3VwZXIpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBtZnAuZ2V0UHJvcGVydHkob2JqZWN0KTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKENsYXNzIHNlbmRlciwgT2JqZWN0IG9iamVjdCwgU3RyaW5nIGF0dHJpYnV0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBuZXdWYWx1ZSwgYm9vbGVhbiB1c2VTdXBlciwgYm9vbGVhbiBmcm9tSW5zaWRlQ2xhc3MpIHsNCisgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBDbGFzcykgew0KKyAgICAgICAgICAgIGdldFN0YXRpY01ldGFDbGFzcygpLnNldEF0dHJpYnV0ZShzZW5kZXIsIG9iamVjdCwgYXR0cmlidXRlLCBuZXdWYWx1ZSwgdXNlU3VwZXIsIGZyb21JbnNpZGVDbGFzcyk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlmICghYXR0cmlidXRlSW5pdERvbmUpIGluaXRBdHRyaWJ1dGVzKCk7DQorICAgICAgICAgICAgTWV0YUZpZWxkUHJvcGVydHkgbWZwID0gKE1ldGFGaWVsZFByb3BlcnR5KSBhdHRyaWJ1dGVzLmdldChhdHRyaWJ1dGUpOw0KKyAgICAgICAgICAgIGlmIChtZnAgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICBDTE9TVVJFX01FVEFDTEFTUy5zZXRBdHRyaWJ1dGUoc2VuZGVyLCBvYmplY3QsIGF0dHJpYnV0ZSwgbmV3VmFsdWUsIHVzZVN1cGVyLCBmcm9tSW5zaWRlQ2xhc3MpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIG1mcC5zZXRQcm9wZXJ0eShvYmplY3QsIG5ld1ZhbHVlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcHVibGljIE9iamVjdCBpbnZva2VTdGF0aWNNZXRob2QoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1ldGhvZE5hbWUsIE9iamVjdFtdIGFyZ3VtZW50cykgew0KKyAgICAgICAgcmV0dXJuIGdldFN0YXRpY01ldGFDbGFzcygpLmludm9rZU1ldGhvZChDbGFzcy5jbGFzcywgb2JqZWN0LCBtZXRob2ROYW1lLCBhcmd1bWVudHMsIGZhbHNlLCBmYWxzZSk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoQ2xhc3Mgc2VuZGVyLCBPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbmFtZSwgT2JqZWN0IG5ld1ZhbHVlLCBib29sZWFuIHVzZVN1cGVyLCBib29sZWFuIGZyb21JbnNpZGVDbGFzcykgew0KKyAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIENsYXNzKSB7DQorICAgICAgICAgICAgZ2V0U3RhdGljTWV0YUNsYXNzKCkuc2V0UHJvcGVydHkoc2VuZGVyLCBvYmplY3QsIG5hbWUsIG5ld1ZhbHVlLCB1c2VTdXBlciwgZnJvbUluc2lkZUNsYXNzKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgQ0xPU1VSRV9NRVRBQ0xBU1Muc2V0UHJvcGVydHkoc2VuZGVyLCBvYmplY3QsIG5hbWUsIG5ld1ZhbHVlLCB1c2VTdXBlciwgZnJvbUluc2lkZUNsYXNzKTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgTWV0YU1ldGhvZCBnZXRNZXRob2RXaXRob3V0Q2FjaGluZyhDbGFzcyBzZW5kZXIsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzc1tdIGFyZ3VtZW50cywgYm9vbGVhbiBpc0NhbGxUb1N1cGVyKSB7DQorICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0aWVzKE9iamVjdCBiZWFuLCBNYXAgbWFwKSB7DQorICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsNCisgICAgfQ0KKw0KKyAgICBwcml2YXRlIE9iamVjdCBpbnZva2VDb25zdHJ1Y3RvcihDbGFzcyBhdCwgT2JqZWN0W10gYXJndW1lbnRzKSB7DQorICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBhZGRNZXRhQmVhblByb3BlcnR5KE1ldGFCZWFuUHJvcGVydHkgbXApIHsNCisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIGFkZE1ldGFNZXRob2QoTWV0YU1ldGhvZCBtZXRob2QpIHsNCisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIGFkZE5ld0luc3RhbmNlTWV0aG9kKE1ldGhvZCBtZXRob2QpIHsNCisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIGFkZE5ld1N0YXRpY01ldGhvZChNZXRob2QgbWV0aG9kKSB7DQorICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgQ29uc3RydWN0b3IgcmV0cmlldmVDb25zdHJ1Y3RvcihDbGFzc1tdIGFyZ3VtZW50cykgew0KKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9tZXRhY2xhc3MvQ2xvc3VyZU1ldGFNZXRob2QuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvbWV0YWNsYXNzL0Nsb3N1cmVNZXRhTWV0aG9kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU4MzQxYgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvbWV0YWNsYXNzL0Nsb3N1cmVNZXRhTWV0aG9kLmphdmEKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5tZXRhY2xhc3M7CisKK2ltcG9ydCBncm9vdnkubGFuZy5DbG9zdXJlOworaW1wb3J0IGdyb292eS5sYW5nLkNsb3N1cmVJbnZva2luZ01ldGhvZDsKK2ltcG9ydCBncm9vdnkubGFuZy5NZXRhTWV0aG9kOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucmVmbGVjdGlvbi5DYWNoZWRDbGFzczsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJlZmxlY3Rpb24uUGFyYW1ldGVyVHlwZXM7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5yZWZsZWN0aW9uLlJlZmxlY3Rpb25DYWNoZTsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOworCisvKioKKyAqCisgKiBBIE1ldGFNZXRob2QgdGhhdCBhY2NlcHRzIGEgY2xvc3VyZSBpbiB0aGUgY29uc3RydWN0b3Igd2hpY2ggaXMgaW52b2tlZCB3aGVuIHRoZSBNZXRhTWV0aG9kIGlzIGNhbGxlZC4KKyAqIFRoZSBkZWxlZ2F0ZSBvZiB0aGUgY2xvc3VyZSBpcyBzZXQgdG8gdGhlIGluc3RhbmNlIHRoYXQgdGhlIE1ldGFNZXRob2QgaXMgaW52b2tlZCBvbiB3aGVuIGNhbGxlZC4KKyAqCisgKiBAYXV0aG9yIEdyYWVtZSBSb2NoZXIKKyAqIEBzaW5jZSAxLjEKKyAqLworcHVibGljIGNsYXNzIENsb3N1cmVNZXRhTWV0aG9kIGV4dGVuZHMgTWV0YU1ldGhvZCBpbXBsZW1lbnRzIENsb3N1cmVJbnZva2luZ01ldGhvZCB7CisKKwlwcml2YXRlIGZpbmFsIENsb3N1cmUgY2FsbGFibGU7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKyAgICBwcml2YXRlIGZpbmFsIFBhcmFtZXRlclR5cGVzIHB0OworICAgIHByaXZhdGUgZmluYWwgQ2FjaGVkQ2xhc3MgZGVjbGFyaW5nQ2xhc3M7CisKKyAgICBwdWJsaWMgQ2xvc3VyZU1ldGFNZXRob2QoU3RyaW5nIG5hbWUsIENsb3N1cmUgYykgeworCQl0aGlzKG5hbWUsIGMuZ2V0T3duZXIoKS5nZXRDbGFzcygpLCBjKTsKKwl9CisKKyAgICBwdWJsaWMgQ2xvc3VyZU1ldGFNZXRob2QoU3RyaW5nIG5hbWUsIENsYXNzIGRlY2xhcmluZ0NsYXNzLENsb3N1cmUgYykgeworCQl0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICBjYWxsYWJsZSA9IGM7CisgICAgICAgIHB0ID0gbmV3IFBhcmFtZXRlclR5cGVzKGMuZ2V0UGFyYW1ldGVyVHlwZXMoKSk7CisgICAgICAgIHRoaXMuZGVjbGFyaW5nQ2xhc3MgPSBSZWZsZWN0aW9uQ2FjaGUuZ2V0Q2FjaGVkQ2xhc3MoZGVjbGFyaW5nQ2xhc3MpOworICAgIH0KKworCisgICAgcHVibGljIGludCBnZXRNb2RpZmllcnMoKSB7CisgICAgICAgIHJldHVybiBNb2RpZmllci5QVUJMSUM7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3MgZ2V0UmV0dXJuVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIE9iamVjdC5jbGFzczsKKyAgICB9CisKKwlwdWJsaWMgQ2FjaGVkQ2xhc3MgZ2V0RGVjbGFyaW5nQ2xhc3MoKSB7CisJCXJldHVybiBkZWNsYXJpbmdDbGFzczsKKwl9CisKKyAgICBwdWJsaWMgUGFyYW1ldGVyVHlwZXMgZ2V0UGFyYW1UeXBlcygpIHsKKyAgICAgICAgcmV0dXJuIHB0OworICAgIH0KKworCXB1YmxpYyBPYmplY3QgaW52b2tlKGZpbmFsIE9iamVjdCBvYmplY3QsIGZpbmFsIE9iamVjdFtdIGFyZ3VtZW50cykgeworCQlDbG9zdXJlIGNsb25lZCA9IChDbG9zdXJlKSBjYWxsYWJsZS5jbG9uZSgpOworCQljbG9uZWQuc2V0RGVsZWdhdGUob2JqZWN0KTsKKworCQlyZXR1cm4gY2xvbmVkLmNhbGwoYXJndW1lbnRzKTsKKwl9CisKKyAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBjbG9zdXJlIHRoYXQgaXMgaW52b2tlZCBieSB0aGlzIE1ldGFNZXRob2QKKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGNsb3N1cmUKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xvc3VyZSBnZXRDbG9zdXJlKCkgeworCQlyZXR1cm4gY2FsbGFibGU7CisJfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9tZXRhY2xhc3MvQ2xvc3VyZVN0YXRpY01ldGFNZXRob2QuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvbWV0YWNsYXNzL0Nsb3N1cmVTdGF0aWNNZXRhTWV0aG9kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZlZTA1YQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvbWV0YWNsYXNzL0Nsb3N1cmVTdGF0aWNNZXRhTWV0aG9kLmphdmEKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5tZXRhY2xhc3M7CisKK2ltcG9ydCBncm9vdnkubGFuZy5DbG9zdXJlOworaW1wb3J0IGdyb292eS5sYW5nLkNsb3N1cmVJbnZva2luZ01ldGhvZDsKK2ltcG9ydCBncm9vdnkubGFuZy5NZXRhTWV0aG9kOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucmVmbGVjdGlvbi5DYWNoZWRDbGFzczsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJlZmxlY3Rpb24uUGFyYW1ldGVyVHlwZXM7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5yZWZsZWN0aW9uLlJlZmxlY3Rpb25DYWNoZTsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOworCisvKioKKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIE1ldGFNZXRob2QgdGhhdCBpcyBhIGNsb3N1cmUgdGhhdCBwcmV0ZW5kcyB0byBiZSBhIHN0YXRpYyBtZXRob2QuCisgKiBJdCBpcyB1c2VkIGJ5IEV4cGFuZG9NZXRhQ2xhc3MgdG8gYWxsb3cgYWRkaXRpb24gb2Ygc3RhdGljIG1ldGhvZHMgZGVmaW5lZCBhcyBjbG9zdXJlcworICoKKyAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgorICogQHNpbmNlIDAxLjEKKyAqLworcHVibGljIGNsYXNzIENsb3N1cmVTdGF0aWNNZXRhTWV0aG9kIGV4dGVuZHMgTWV0YU1ldGhvZCBpbXBsZW1lbnRzIENsb3N1cmVJbnZva2luZ01ldGhvZCB7CisKKwlwcml2YXRlIGZpbmFsIENsb3N1cmUgY2FsbGFibGU7CisJcHJpdmF0ZSBmaW5hbCBDYWNoZWRDbGFzcyBkZWNsYXJpbmdDbGFzczsKKyAgICBwcml2YXRlIGZpbmFsIFBhcmFtZXRlclR5cGVzIHB0OworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisKKyAgICAvKioKKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBNZXRhTWV0aG9kCisgICAgICogQHBhcmFtIGRlY2xhcmluZ0NsYXNzIFRoZSBjbGFzcyB3aGljaCBkZWNsYXJlZCB0aGUgTWV0YU1ldGhvZAorICAgICAqIEBwYXJhbSBjIFRoZSBjbG9zdXJlIHRoYXQgdGhpcyBDbG9zdXJlTWV0YU1ldGhvZCB3aWxsIGludm9rZSB3aGVuIGNhbGxlZAorICAgICAqLworICAgIHB1YmxpYyBDbG9zdXJlU3RhdGljTWV0YU1ldGhvZChTdHJpbmcgbmFtZSwgQ2xhc3MgZGVjbGFyaW5nQ2xhc3MsIENsb3N1cmUgYykgeworICAgICAgICBwdCA9IG5ldyBQYXJhbWV0ZXJUeXBlcyhjLmdldFBhcmFtZXRlclR5cGVzKCkpOworICAgICAgICB0aGlzLmNhbGxhYmxlID0gYzsKKwkJdGhpcy5kZWNsYXJpbmdDbGFzcyA9IFJlZmxlY3Rpb25DYWNoZS5nZXRDYWNoZWRDbGFzcyhkZWNsYXJpbmdDbGFzcyk7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisJfQorCisJcHVibGljIE9iamVjdCBpbnZva2UoT2JqZWN0IG9iamVjdCwgT2JqZWN0W10gYXJndW1lbnRzKSB7CisJCUNsb3N1cmUgY2xvbmVkID0gKENsb3N1cmUpIGNhbGxhYmxlLmNsb25lKCk7CisJCWNsb25lZC5zZXREZWxlZ2F0ZShvYmplY3QpOworCQlyZXR1cm4gY2xvbmVkLmNhbGwoYXJndW1lbnRzKTsKKwl9CisKKyAgICBwdWJsaWMgaW50IGdldE1vZGlmaWVycygpIHsKKyAgICAgICAgcmV0dXJuIE1vZGlmaWVyLlBVQkxJQyB8IE1vZGlmaWVyLlNUQVRJQzsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzcyBnZXRSZXR1cm5UeXBlKCkgeworICAgICAgICByZXR1cm4gT2JqZWN0LmNsYXNzOworICAgIH0KKworICAgIHB1YmxpYyBDYWNoZWRDbGFzcyBnZXREZWNsYXJpbmdDbGFzcygpIHsKKwkJcmV0dXJuIHRoaXMuZGVjbGFyaW5nQ2xhc3M7CisJfQorCisgICAgcHVibGljIFBhcmFtZXRlclR5cGVzIGdldFBhcmFtVHlwZXMoKSB7CisgICAgICAgIHJldHVybiBwdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIGNsb3N1cmUgdGhhdCBpcyBpbnZva2VkIGJ5IHRoaXMgTWV0YU1ldGhvZAorICAgICAqCisgICAgICogQHJldHVybiBUaGUgY2xvc3VyZQorICAgICAqLworICAgIHB1YmxpYyBDbG9zdXJlIGdldENsb3N1cmUoKSB7CisJCXJldHVybiB0aGlzLmNhbGxhYmxlOworCX0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvbWV0YWNsYXNzL0NvbmN1cnJlbnRSZWFkZXJIYXNoTWFwLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL21ldGFjbGFzcy9Db25jdXJyZW50UmVhZGVySGFzaE1hcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxODdlYmIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL21ldGFjbGFzcy9Db25jdXJyZW50UmVhZGVySGFzaE1hcC5qYXZhCkBAIC0wLDAgKzEsMTI4MiBAQAorLyoNCisgIEZpbGU6IENvbmN1cnJlbnRSZWFkZXJIYXNoTWFwDQorDQorICBXcml0dGVuIGJ5IERvdWcgTGVhLiBBZGFwdGVkIGFuZCByZWxlYXNlZCwgdW5kZXIgZXhwbGljaXQNCisgIHBlcm1pc3Npb24sIGZyb20gSkRLMS4yIEhhc2hNYXAuamF2YSBhbmQgSGFzaHRhYmxlLmphdmEgd2hpY2gNCisgIGNhcnJpZXMgdGhlIGZvbGxvd2luZyBjb3B5cmlnaHQ6DQorDQorICAgICAqIENvcHlyaWdodCAxOTk3IGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sDQorICAgICAqIDkwMSBTYW4gQW50b25pbyBSb2FkLCBQYWxvIEFsdG8sIENhbGlmb3JuaWEsIDk0MzAzLCBVLlMuQS4NCisgICAgICogQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisgICAgICoNCisgICAgICogVGhpcyBzb2Z0d2FyZSBpcyB0aGUgY29uZmlkZW50aWFsIGFuZCBwcm9wcmlldGFyeSBpbmZvcm1hdGlvbg0KKyAgICAgKiBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICgiQ29uZmlkZW50aWFsIEluZm9ybWF0aW9uIikuICBZb3UNCisgICAgICogc2hhbGwgbm90IGRpc2Nsb3NlIHN1Y2ggQ29uZmlkZW50aWFsIEluZm9ybWF0aW9uIGFuZCBzaGFsbCB1c2UNCisgICAgICogaXQgb25seSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIHRlcm1zIG9mIHRoZSBsaWNlbnNlIGFncmVlbWVudA0KKyAgICAgKiB5b3UgZW50ZXJlZCBpbnRvIHdpdGggU3VuLg0KKw0KKyAgSGlzdG9yeToNCisgIERhdGUgICAgICAgV2hvICAgICAgICAgICAgICAgIFdoYXQNCisgIDI4b2N0MTk5OSAgZGwgICAgICAgICAgICAgICBDcmVhdGVkDQorICAxNGRlYzE5OTkgIGRsICAgICAgICAgICAgICAgam1tIHNuYXBzaG90DQorICAxOWFwcjIwMDAgIGRsICAgICAgICAgICAgICAgdXNlIGJhcnJpZXJMb2NrDQorICAxMmphbjIwMDEgIGRsICAgICAgICAgICAgICAgcHVibGljIHJlbGVhc2UNCisgIDE3bm92MjAwMSAgZGwgICAgICAgICAgICAgICBNaW5vciB0dW5pbmdzDQorICAyMG1heTIwMDIgIGRsICAgICAgICAgICAgICAgQmFycmllckxvY2sgY2FuIG5vdyBiZSBzZXJpYWxpemVkLg0KKyAgMDlkZWMyMDAyICBkbCAgICAgICAgICAgICAgIEZpeCBpbnRlcmZlcmVuY2UgY2hlY2tzLg0KKyAgMjNqdW4yMDA0ICBkbCAgICAgICAgICAgICAgIEF2b2lkIGJhZCBhcnJheSBzaXppbmdzIGluIHZpZXcgdG9BcnJheSBtZXRob2RzDQorICAwMmp1bDIwMDcgIGJsYWNrZHJhZyAgICAgICAgYWRhcHRpb24gb2YgcGFja2FnZSBuYW1lIHRvIEdyb292eSBwcm9qZWN0DQorKi8NCisNCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5tZXRhY2xhc3M7DQorDQoraW1wb3J0IGphdmEudXRpbC5NYXA7DQoraW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdE1hcDsNCitpbXBvcnQgamF2YS51dGlsLkFic3RyYWN0U2V0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLlNldDsNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247DQoraW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOw0KKw0KK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsNCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCisNCisNCisvKioNCisgKiBBIHZlcnNpb24gb2YgSGFzaHRhYmxlIHRoYXQgc3VwcG9ydHMgbW9zdGx5LWNvbmN1cnJlbnQgcmVhZGluZywgYnV0DQorICogZXhjbHVzaXZlIHdyaXRpbmcuICBCZWNhdXNlIHJlYWRzIGFyZSBub3QgbGltaXRlZCB0byBwZXJpb2RzDQorICogd2l0aG91dCB3cml0ZXMsIGEgY29uY3VycmVudCByZWFkZXIgcG9saWN5IGlzIHdlYWtlciB0aGFuIGEgY2xhc3NpYw0KKyAqIHJlYWRlci93cml0ZXIgcG9saWN5LCBidXQgaXMgZ2VuZXJhbGx5IGZhc3RlciBhbmQgYWxsb3dzIG1vcmUNCisgKiBjb25jdXJyZW5jeS4gVGhpcyBjbGFzcyBpcyBhIGdvb2QgY2hvaWNlIGVzcGVjaWFsbHkgZm9yIHRhYmxlcyB0aGF0DQorICogYXJlIG1haW5seSBjcmVhdGVkIGJ5IG9uZSB0aHJlYWQgZHVyaW5nIHRoZSBzdGFydC11cCBwaGFzZSBvZiBhDQorICogcHJvZ3JhbSwgYW5kIGZyb20gdGhlbiBvbiwgYXJlIG1haW5seSByZWFkICh3aXRoIHBlcmhhcHMgb2NjYXNpb25hbA0KKyAqIGFkZGl0aW9ucyBvciByZW1vdmFscykgaW4gbWFueSB0aHJlYWRzLiAgSWYgeW91IGFsc28gbmVlZCBjb25jdXJyZW5jeQ0KKyAqIGFtb25nIHdyaXRlcywgY29uc2lkZXIgaW5zdGVhZCB1c2luZyBDb25jdXJyZW50SGFzaE1hcC4NCisgKiA8cD4NCisgKg0KKyAqIFN1Y2Nlc3NmdWwgcmV0cmlldmFscyB1c2luZyBnZXQoa2V5KSBhbmQgY29udGFpbnNLZXkoa2V5KSB1c3VhbGx5DQorICogcnVuIHdpdGhvdXQgbG9ja2luZy4gVW5zdWNjZXNzZnVsIG9uZXMgKGkuZS4sIHdoZW4gdGhlIGtleSBpcyBub3QNCisgKiBwcmVzZW50KSBkbyBpbnZvbHZlIGJyaWVmIHN5bmNocm9uaXphdGlvbiAobG9ja2luZykuICBBbHNvLCB0aGUNCisgKiBzaXplIGFuZCBpc0VtcHR5IG1ldGhvZHMgYXJlIGFsd2F5cyBzeW5jaHJvbml6ZWQuDQorICoNCisgKiA8cD4gQmVjYXVzZSByZXRyaWV2YWwgb3BlcmF0aW9ucyBjYW4gb3JkaW5hcmlseSBvdmVybGFwIHdpdGgNCisgKiB3cml0aW5nIG9wZXJhdGlvbnMgKGkuZS4sIHB1dCwgcmVtb3ZlLCBhbmQgdGhlaXIgZGVyaXZhdGl2ZXMpLA0KKyAqIHJldHJpZXZhbHMgY2FuIG9ubHkgYmUgZ3VhcmFudGVlZCB0byByZXR1cm4gdGhlIHJlc3VsdHMgb2YgdGhlIG1vc3QNCisgKiByZWNlbnRseSA8ZW0+Y29tcGxldGVkPC9lbT4gb3BlcmF0aW9ucyBob2xkaW5nIHVwb24gdGhlaXINCisgKiBvbnNldC4gUmV0cmlldmFsIG9wZXJhdGlvbnMgbWF5IG9yIG1heSBub3QgcmV0dXJuIHJlc3VsdHMNCisgKiByZWZsZWN0aW5nIGluLXByb2dyZXNzIHdyaXRpbmcgb3BlcmF0aW9ucy4gIEhvd2V2ZXIsIHRoZSByZXRyaWV2YWwNCisgKiBvcGVyYXRpb25zIGRvIGFsd2F5cyByZXR1cm4gY29uc2lzdGVudCByZXN1bHRzIC0tIGVpdGhlciB0aG9zZQ0KKyAqIGhvbGRpbmcgYmVmb3JlIGFueSBzaW5nbGUgbW9kaWZpY2F0aW9uIG9yIGFmdGVyIGl0LCBidXQgbmV2ZXIgYQ0KKyAqIG5vbnNlbnNlIHJlc3VsdC4gIEZvciBhZ2dyZWdhdGUgb3BlcmF0aW9ucyBzdWNoIGFzIHB1dEFsbCBhbmQNCisgKiBjbGVhciwgY29uY3VycmVudCByZWFkcyBtYXkgcmVmbGVjdCBpbnNlcnRpb24gb3IgcmVtb3ZhbCBvZiBvbmx5DQorICogc29tZSBlbnRyaWVzLiBJbiB0aG9zZSByYXJlIGNvbnRleHRzIGluIHdoaWNoIHlvdSB1c2UgYSBoYXNoIHRhYmxlDQorICogdG8gc3luY2hyb25pemUgb3BlcmF0aW9ucyBhY3Jvc3MgdGhyZWFkcyAoZm9yIGV4YW1wbGUsIHRvIHByZXZlbnQNCisgKiByZWFkcyB1bnRpbCBhZnRlciBjbGVhcnMpLCB5b3Ugc2hvdWxkIGVpdGhlciBlbmNhc2Ugb3BlcmF0aW9ucw0KKyAqIGluIHN5bmNocm9uaXplZCBibG9ja3MsIG9yIGluc3RlYWQgdXNlIGphdmEudXRpbC5IYXNodGFibGUuDQorICoNCisgKiA8cD4NCisgKg0KKyAqIFRoaXMgY2xhc3MgYWxzbyBzdXBwb3J0cyBvcHRpb25hbCBndWFyYW50ZWVkDQorICogZXhjbHVzaXZlIHJlYWRzLCBzaW1wbHkgYnkgc3Vycm91bmRpbmcgYSBjYWxsIHdpdGhpbiBhIHN5bmNocm9uaXplZA0KKyAqIGJsb2NrLCBhcyBpbiA8YnI+IA0KKyAqIDxjb2RlPkNvbmN1cnJlbnRSZWFkZXJIYXNoTWFwIHQ7IC4uLiBPYmplY3QgdjsgPGJyPg0KKyAqIHN5bmNocm9uaXplZCh0KSB7IHYgPSB0LmdldChrKTsgfSA8L2NvZGU+IDxicj4NCisgKg0KKyAqIEJ1dCB0aGlzIGlzIG5vdCB1c3VhbGx5IG5lY2Vzc2FyeSBpbiBwcmFjdGljZS4gRm9yDQorICogZXhhbXBsZSwgaXQgaXMgZ2VuZXJhbGx5IGluZWZmaWNpZW50IHRvIHdyaXRlOg0KKyAqDQorICogPHByZT4NCisgKiAgIENvbmN1cnJlbnRSZWFkZXJIYXNoTWFwIHQ7IC4uLiAgICAgICAgICAgIC8vIEluZWZmaWNpZW50IHZlcnNpb24NCisgKiAgIE9iamVjdCBrZXk7IC4uLg0KKyAqICAgT2JqZWN0IHZhbHVlOyAuLi4NCisgKiAgIHN5bmNocm9uaXplZCh0KSB7IA0KKyAqICAgICBpZiAoIXQuY29udGFpbnNLZXkoa2V5KSkNCisgKiAgICAgICB0LnB1dChrZXksIHZhbHVlKTsNCisgKiAgICAgICAvLyBvdGhlciBjb2RlIGlmIG5vdCBwcmV2aW91c2x5IHByZXNlbnQNCisgKiAgICAgfQ0KKyAqICAgICBlbHNlIHsNCisgKiAgICAgICAvLyBvdGhlciBjb2RlIGlmIGl0IHdhcyBwcmV2aW91c2x5IHByZXNlbnQNCisgKiAgICAgfQ0KKyAqICAgfQ0KKyAqPC9wcmU+DQorICogSW5zdGVhZCwgaWYgdGhlIHZhbHVlcyBhcmUgaW50ZW5kZWQgdG8gYmUgdGhlIHNhbWUgaW4gZWFjaCBjYXNlLCBqdXN0IHRha2UgYWR2YW50YWdlIG9mIHRoZSBmYWN0IHRoYXQgcHV0IHJldHVybnMNCisgKiBudWxsIGlmIHRoZSBrZXkgd2FzIG5vdCBwcmV2aW91c2x5IHByZXNlbnQ6DQorICogPHByZT4NCisgKiAgIENvbmN1cnJlbnRSZWFkZXJIYXNoTWFwIHQ7IC4uLiAgICAgICAgICAgICAgICAvLyBVc2UgdGhpcyBpbnN0ZWFkDQorICogICBPYmplY3Qga2V5OyAuLi4NCisgKiAgIE9iamVjdCB2YWx1ZTsgLi4uDQorICogICBPYmplY3Qgb2xkVmFsdWUgPSB0LnB1dChrZXksIHZhbHVlKTsNCisgKiAgIGlmIChvbGRWYWx1ZSA9PSBudWxsKSB7DQorICogICAgIC8vIG90aGVyIGNvZGUgaWYgbm90IHByZXZpb3VzbHkgcHJlc2VudA0KKyAqICAgfQ0KKyAqICAgZWxzZSB7DQorICogICAgIC8vIG90aGVyIGNvZGUgaWYgaXQgd2FzIHByZXZpb3VzbHkgcHJlc2VudA0KKyAqICAgfQ0KKyAqPC9wcmU+DQorICogPHA+DQorICoNCisgKiBJdGVyYXRvcnMgYW5kIEVudW1lcmF0aW9ucyAoaS5lLiwgdGhvc2UgcmV0dXJuZWQgYnkNCisgKiBrZXlTZXQoKS5pdGVyYXRvcigpLCBlbnRyeVNldCgpLml0ZXJhdG9yKCksIHZhbHVlcygpLml0ZXJhdG9yKCksDQorICoga2V5cygpLCBhbmQgZWxlbWVudHMoKSkgcmV0dXJuIGVsZW1lbnRzIHJlZmxlY3RpbmcgdGhlIHN0YXRlIG9mIHRoZQ0KKyAqIGhhc2ggdGFibGUgYXQgc29tZSBwb2ludCBhdCBvciBzaW5jZSB0aGUgY3JlYXRpb24gb2YgdGhlDQorICogaXRlcmF0b3IvZW51bWVyYXRpb24uICBUaGV5IHdpbGwgcmV0dXJuIGF0IG1vc3Qgb25lIGluc3RhbmNlIG9mDQorICogZWFjaCBlbGVtZW50ICh2aWEgbmV4dCgpL25leHRFbGVtZW50KCkpLCBidXQgbWlnaHQgb3IgbWlnaHQgbm90DQorICogcmVmbGVjdCBwdXRzIGFuZCByZW1vdmVzIHRoYXQgaGF2ZSBiZWVuIHByb2Nlc3NlZCBzaW5jZSB0aGV5IHdlcmUNCisgKiBjcmVhdGVkLiAgVGhleSBkbyA8ZW0+bm90PC9lbT4gdGhyb3cgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbi4NCisgKiBIb3dldmVyLCB0aGVzZSBpdGVyYXRvcnMgYXJlIGRlc2lnbmVkIHRvIGJlIHVzZWQgYnkgb25seSBvbmUNCisgKiB0aHJlYWQgYXQgYSB0aW1lLiBTaGFyaW5nIGFuIGl0ZXJhdG9yIGFjcm9zcyBtdWx0aXBsZSB0aHJlYWRzIG1heQ0KKyAqIGxlYWQgdG8gdW5wcmVkaWN0YWJsZSByZXN1bHRzIGlmIHRoZSB0YWJsZSBpcyBiZWluZyBjb25jdXJyZW50bHkNCisgKiBtb2RpZmllZC4gIEFnYWluLCB5b3UgY2FuIGVuc3VyZSBpbnRlcmZlcmVuY2UtZnJlZSBpdGVyYXRpb24gYnkNCisgKiBlbmNsb3NpbmcgdGhlIGl0ZXJhdGlvbiBpbiBhIHN5bmNocm9uaXplZCBibG9jay4gIDxwPg0KKyAqDQorICogVGhpcyBjbGFzcyBtYXkgYmUgdXNlZCBhcyBhIGRpcmVjdCByZXBsYWNlbWVudCBmb3IgYW55IHVzZSBvZg0KKyAqIGphdmEudXRpbC5IYXNodGFibGUgdGhhdCBkb2VzIG5vdCBkZXBlbmQgb24gcmVhZGVycyBiZWluZyBibG9ja2VkDQorICogZHVyaW5nIHVwZGF0ZXMuIExpa2UgSGFzaHRhYmxlIGJ1dCB1bmxpa2UgamF2YS51dGlsLkhhc2hNYXAsDQorICogdGhpcyBjbGFzcyBkb2VzIE5PVCBhbGxvdyA8dHQ+bnVsbDwvdHQ+IHRvIGJlIHVzZWQgYXMgYSBrZXkgb3INCisgKiB2YWx1ZS4gIFRoaXMgY2xhc3MgaXMgYWxzbyB0eXBpY2FsbHkgZmFzdGVyIHRoYW4gQ29uY3VycmVudEhhc2hNYXANCisgKiB3aGVuIHRoZXJlIGlzIHVzdWFsbHkgb25seSBvbmUgdGhyZWFkIHVwZGF0aW5nIHRoZSB0YWJsZSwgYnV0IA0KKyAqIHBvc3NpYmx5IG1hbnkgcmV0cmlldmluZyB2YWx1ZXMgZnJvbSBpdC4NCisgKiA8cD4NCisgKg0KKyAqIEltcGxlbWVudGF0aW9uIG5vdGU6IEEgc2xpZ2h0bHkgZmFzdGVyIGltcGxlbWVudGF0aW9uIG9mDQorICogdGhpcyBjbGFzcyB3aWxsIGJlIHBvc3NpYmxlIG9uY2UgcGxhbm5lZCBKYXZhIE1lbW9yeSBNb2RlbA0KKyAqIHJldmlzaW9ucyBhcmUgaW4gcGxhY2UuDQorICoNCisgKiA8cD5bPGEgaHJlZj0iaHR0cDovL2dlZS5jcy5vc3dlZ28uZWR1L2RsL2NsYXNzZXMvRURVL29zd2Vnby9jcy9kbC91dGlsL2NvbmN1cnJlbnQvaW50cm8uaHRtbCI+IEludHJvZHVjdGlvbiB0byB0aGlzIHBhY2thZ2UuIDwvYT5dDQorICoqLw0KK3B1YmxpYyBjbGFzcyBDb25jdXJyZW50UmVhZGVySGFzaE1hcCANCisgIGV4dGVuZHMgQWJzdHJhY3RNYXAgDQorICBpbXBsZW1lbnRzIE1hcCwgQ2xvbmVhYmxlLCBTZXJpYWxpemFibGUgew0KKw0KKw0KKyAgLyoNCisgICAgVGhlIGJhc2ljIHN0cmF0ZWd5IGlzIGFuIG9wdGltaXN0aWMtc3R5bGUgc2NoZW1lIGJhc2VkIG9uDQorICAgIHRoZSBndWFyYW50ZWUgdGhhdCB0aGUgaGFzaCB0YWJsZSBhbmQgaXRzIGxpc3RzIGFyZSBhbHdheXMNCisgICAga2VwdCBpbiBhIGNvbnNpc3RlbnQgZW5vdWdoIHN0YXRlIHRvIGJlIHJlYWQgd2l0aG91dCBsb2NraW5nOg0KKw0KKyAgICAqIFJlYWQgb3BlcmF0aW9ucyBmaXJzdCBwcm9jZWVkIHdpdGhvdXQgbG9ja2luZywgYnkgdHJhdmVyc2luZyB0aGUNCisgICAgICAgYXBwYXJlbnRseSBjb3JyZWN0IGxpc3Qgb2YgdGhlIGFwcGFyZW50bHkgY29ycmVjdCBiaW4uIElmIGFuDQorICAgICAgIGVudHJ5IGlzIGZvdW5kLCBidXQgbm90IGludmFsaWRhdGVkICh2YWx1ZSBmaWVsZCBudWxsKSwgaXQgaXMNCisgICAgICAgcmV0dXJuZWQuIElmIG5vdCBmb3VuZCwgb3BlcmF0aW9ucyBtdXN0IHJlY2hlY2sgKGFmdGVyIGEgbWVtb3J5DQorICAgICAgIGJhcnJpZXIpIHRvIG1ha2Ugc3VyZSB0aGV5IGFyZSB1c2luZyBib3RoIHRoZSByaWdodCBsaXN0IGFuZA0KKyAgICAgICB0aGUgcmlnaHQgdGFibGUgKHdoaWNoIGNhbiBjaGFuZ2UgdW5kZXIgcmVzaXplcykuIElmDQorICAgICAgIGludmFsaWRhdGVkLCByZWFkcyBtdXN0IGFjcXVpcmUgbWFpbiB1cGRhdGUgbG9jayB0byB3YWl0IG91dA0KKyAgICAgICB0aGUgdXBkYXRlLCBhbmQgdGhlbiByZS10cmF2ZXJzZS4NCisNCisgICAgKiBBbGwgbGlzdCBhZGRpdGlvbnMgYXJlIGF0IHRoZSBmcm9udCBvZiBlYWNoIGJpbiwgbWFraW5nIGl0IGVhc3kNCisgICAgICAgdG8gY2hlY2sgY2hhbmdlcywgYW5kIGFsc28gZmFzdCB0byB0cmF2ZXJzZS4gIEVudHJ5IG5leHQNCisgICAgICAgcG9pbnRlcnMgYXJlIG5ldmVyIGFzc2lnbmVkLiBSZW1vdmUoKSBidWlsZHMgbmV3IG5vZGVzIHdoZW4NCisgICAgICAgbmVjZXNzYXJ5IHRvIHByZXNlcnZlIHRoaXMuDQorDQorICAgICogUmVtb3ZlKCkgKGFsc28gY2xlYXIoKSkgaW52YWxpZGF0ZXMgcmVtb3ZlZCBub2RlcyB0byBhbGVydCByZWFkDQorICAgICAgIG9wZXJhdGlvbnMgdGhhdCB0aGV5IG11c3Qgd2FpdCBvdXQgdGhlIGZ1bGwgbW9kaWZpY2F0aW9ucy4NCisgDQorICAqLw0KKw0KKyAgLyoqIEEgU2VyaWFsaXphYmxlIGNsYXNzIGZvciBiYXJyaWVyIGxvY2sgKiovDQorICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEJhcnJpZXJMb2NrIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgeyB9DQorDQorICAvKioNCisgICAqIExvY2sgdXNlZCBvbmx5IGZvciBpdHMgbWVtb3J5IGVmZmVjdHMuDQorICAgKiovDQorICBwcm90ZWN0ZWQgZmluYWwgQmFycmllckxvY2sgYmFycmllckxvY2sgPSBuZXcgQmFycmllckxvY2soKTsNCisNCisgIC8qKg0KKyAgICogZmllbGQgd3JpdHRlbiB0byBvbmx5IHRvIGd1YXJhbnRlZSBsb2NrIG9yZGVyaW5nLg0KKyAgICoqLw0KKw0KKyAgcHJvdGVjdGVkIHRyYW5zaWVudCBPYmplY3QgbGFzdFdyaXRlOw0KKw0KKyAgLyoqDQorICAgKiBGb3JjZSBhIG1lbW9yeSBzeW5jaHJvbml6YXRpb24gdGhhdCB3aWxsIGNhdXNlDQorICAgKiBhbGwgcmVhZGVycyB0byBzZWUgdGFibGUuIENhbGwgb25seSB3aGVuIGFscmVhZHkNCisgICAqIGhvbGRpbmcgbWFpbiBzeW5jaCBsb2NrLg0KKyAgICoqLw0KKyAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgcmVjb3JkTW9kaWZpY2F0aW9uKE9iamVjdCB4KSB7IA0KKyAgICBzeW5jaHJvbml6ZWQoYmFycmllckxvY2spIHsNCisgICAgICBsYXN0V3JpdGUgPSB4Ow0KKyAgICB9DQorICB9DQorDQorICAvKioNCisgICAqIEdldCByZWYgdG8gdGFibGU7IHRoZSByZWZlcmVuY2UgYW5kIHRoZSBjZWxscyBpdA0KKyAgICogYWNjZXNzZXMgd2lsbCBiZSBhdCBsZWFzdCBhcyBmcmVzaCBhcyBmcm9tIGxhc3QNCisgICAqIHVzZSBvZiBiYXJyaWVyTG9jaw0KKyAgICoqLw0KKyAgcHJvdGVjdGVkIGZpbmFsIEVudHJ5W10gZ2V0VGFibGVGb3JSZWFkaW5nKCkgeyANCisgICAgc3luY2hyb25pemVkKGJhcnJpZXJMb2NrKSB7DQorICAgICAgcmV0dXJuIHRhYmxlOyANCisgICAgfQ0KKyAgfQ0KKw0KKw0KKyAgLyoqDQorICAgKiBUaGUgZGVmYXVsdCBpbml0aWFsIG51bWJlciBvZiB0YWJsZSBzbG90cyBmb3IgdGhpcyB0YWJsZSAoMzIpLg0KKyAgICogVXNlZCB3aGVuIG5vdCBvdGhlcndpc2Ugc3BlY2lmaWVkIGluIGNvbnN0cnVjdG9yLg0KKyAgICoqLw0KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9JTklUSUFMX0NBUEFDSVRZID0gMzI7IA0KKw0KKw0KKyAgLyoqDQorICAgKiBUaGUgbWluaW11bSBjYXBhY2l0eSwgdXNlZCBpZiBhIGxvd2VyIHZhbHVlIGlzIGltcGxpY2l0bHkgc3BlY2lmaWVkDQorICAgKiBieSBlaXRoZXIgb2YgdGhlIGNvbnN0cnVjdG9ycyB3aXRoIGFyZ3VtZW50cy4gIA0KKyAgICogTVVTVCBiZSBhIHBvd2VyIG9mIHR3by4NCisgICAqLw0KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1JTklNVU1fQ0FQQUNJVFkgPSA0Ow0KKyAgDQorICAvKioNCisgICAqIFRoZSBtYXhpbXVtIGNhcGFjaXR5LCB1c2VkIGlmIGEgaGlnaGVyIHZhbHVlIGlzIGltcGxpY2l0bHkgc3BlY2lmaWVkDQorICAgKiBieSBlaXRoZXIgb2YgdGhlIGNvbnN0cnVjdG9ycyB3aXRoIGFyZ3VtZW50cy4NCisgICAqIE1VU1QgYmUgYSBwb3dlciBvZiB0d28gPD0gMTw8MzAuDQorICAgKi8NCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhJTVVNX0NBUEFDSVRZID0gMSA8PCAzMDsNCisgIA0KKyAgLyoqDQorICAgKiBUaGUgZGVmYXVsdCBsb2FkIGZhY3RvciBmb3IgdGhpcyB0YWJsZSAoMS4wKS4NCisgICAqIFVzZWQgd2hlbiBub3Qgb3RoZXJ3aXNlIHNwZWNpZmllZCBpbiBjb25zdHJ1Y3Rvci4NCisgICAqKi8NCisNCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgZmxvYXQgREVGQVVMVF9MT0FEX0ZBQ1RPUiA9IDAuNzVmOyANCisNCisNCisgIC8qKg0KKyAgICogVGhlIGhhc2ggdGFibGUgZGF0YS4NCisgICAqLw0KKyAgcHJvdGVjdGVkIHRyYW5zaWVudCBFbnRyeVtdIHRhYmxlOw0KKw0KKyAgLyoqDQorICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIG1hcHBpbmdzIGluIHRoZSBoYXNoIHRhYmxlLg0KKyAgICovDQorICBwcm90ZWN0ZWQgdHJhbnNpZW50IGludCBjb3VudDsNCisNCisgIC8qKg0KKyAgICogVGhlIHRhYmxlIGlzIHJlaGFzaGVkIHdoZW4gaXRzIHNpemUgZXhjZWVkcyB0aGlzIHRocmVzaG9sZC4gIChUaGUNCisgICAqIHZhbHVlIG9mIHRoaXMgZmllbGQgaXMgYWx3YXlzIChpbnQpKGNhcGFjaXR5ICogbG9hZEZhY3RvcikuKQ0KKyAgICoNCisgICAqIEBzZXJpYWwNCisgICAqLw0KKyAgcHJvdGVjdGVkIGludCB0aHJlc2hvbGQ7DQorDQorICAvKioNCisgICAqIFRoZSBsb2FkIGZhY3RvciBmb3IgdGhlIGhhc2ggdGFibGUuDQorICAgKg0KKyAgICogQHNlcmlhbA0KKyAgICovDQorICBwcm90ZWN0ZWQgZmxvYXQgbG9hZEZhY3RvcjsNCisNCisgIC8qKg0KKyAgICogUmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgY2FwYWNpdHkgKHBvd2VyIG9mIHR3bykgZm9yIHRoZSBzcGVjaWZpZWQgDQorICAgKiBpbml0aWFsIGNhcGFjaXR5IGFyZ3VtZW50Lg0KKyAgICovDQorICBwcml2YXRlIGludCBwMmNhcGFjaXR5KGludCBpbml0aWFsQ2FwYWNpdHkpIHsNCisgICAgaW50IGNhcCA9IGluaXRpYWxDYXBhY2l0eTsNCisgICAgDQorICAgIC8vIENvbXB1dGUgdGhlIGFwcHJvcHJpYXRlIGNhcGFjaXR5DQorICAgIGludCByZXN1bHQ7DQorICAgIGlmIChjYXAgPiBNQVhJTVVNX0NBUEFDSVRZIHx8IGNhcCA8IDApIHsNCisgICAgICByZXN1bHQgPSBNQVhJTVVNX0NBUEFDSVRZOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHJlc3VsdCA9IE1JTklNVU1fQ0FQQUNJVFk7DQorICAgICAgd2hpbGUgKHJlc3VsdCA8IGNhcCkNCisgICAgICAgIHJlc3VsdCA8PD0gMTsNCisgICAgfQ0KKyAgICByZXR1cm4gcmVzdWx0Ow0KKyAgfQ0KKw0KKyAgLyoqDQorICAgKiBSZXR1cm4gaGFzaCBjb2RlIGZvciBPYmplY3QgeC4gU2luY2Ugd2UgYXJlIHVzaW5nIHBvd2VyLW9mLXR3bw0KKyAgICogdGFibGVzLCBpdCBpcyB3b3J0aCB0aGUgZWZmb3J0IHRvIGltcHJvdmUgaGFzaGNvZGUgdmlhDQorICAgKiB0aGUgc2FtZSBtdWx0aXBsaWNhdGl2ZSBzY2hlbWUgYXMgdXNlZCBpbiBJZGVudGl0eUhhc2hNYXAuDQorICAgKi8NCisgIHByaXZhdGUgc3RhdGljIGludCBoYXNoKE9iamVjdCB4KSB7DQorICAgIGludCBoID0geC5oYXNoQ29kZSgpOw0KKyAgICAvLyBNdWx0aXBseSBieSAxMjcgKHF1aWNrbHksIHZpYSBzaGlmdHMpLCBhbmQgbWl4IGluIHNvbWUgaGlnaA0KKyAgICAvLyBiaXRzIHRvIGhlbHAgZ3VhcmQgYWdhaW5zdCBidW5jaGluZyBvZiBjb2RlcyB0aGF0IGFyZQ0KKyAgICAvLyBjb25zZWN1dGl2ZSBvciBlcXVhbGx5IHNwYWNlZC4NCisgICAgcmV0dXJuICgoaCA8PCA3KSAtIGggKyAoaCA+Pj4gOSkgKyAoaCA+Pj4gMTcpKTsNCisgIH0NCisNCisgIC8qKiANCisgICAqIENoZWNrIGZvciBlcXVhbGl0eSBvZiBub24tbnVsbCByZWZlcmVuY2VzIHggYW5kIHkuIA0KKyAgICoqLw0KKyAgcHJvdGVjdGVkIGJvb2xlYW4gZXEoT2JqZWN0IHgsIE9iamVjdCB5KSB7DQorICAgIHJldHVybiB4ID09IHkgfHwgeC5lcXVhbHMoeSk7DQorICB9DQorDQorICAvKioNCisgICAqIENvbnN0cnVjdHMgYSBuZXcsIGVtcHR5IG1hcCB3aXRoIHRoZSBzcGVjaWZpZWQgaW5pdGlhbCANCisgICAqIGNhcGFjaXR5IGFuZCB0aGUgc3BlY2lmaWVkIGxvYWQgZmFjdG9yLiANCisgICAqDQorICAgKiBAcGFyYW0gaW5pdGlhbENhcGFjaXR5IHRoZSBpbml0aWFsIGNhcGFjaXR5DQorICAgKiAgVGhlIGFjdHVhbCBpbml0aWFsIGNhcGFjaXR5IGlzIHJvdW5kZWQgdG8gdGhlIG5lYXJlc3QgcG93ZXIgb2YgdHdvLg0KKyAgICogQHBhcmFtIGxvYWRGYWN0b3IgIHRoZSBsb2FkIGZhY3RvciBvZiB0aGUgQ29uY3VycmVudFJlYWRlckhhc2hNYXANCisgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBpZiB0aGUgaW5pdGlhbCBtYXhpbXVtIG51bWJlciANCisgICAqICAgICAgICAgICAgICAgb2YgZWxlbWVudHMgaXMgbGVzcw0KKyAgICogICAgICAgICAgICAgICB0aGFuIHplcm8sIG9yIGlmIHRoZSBsb2FkIGZhY3RvciBpcyBub25wb3NpdGl2ZS4NCisgICAqLw0KKyAgcHVibGljIENvbmN1cnJlbnRSZWFkZXJIYXNoTWFwKGludCBpbml0aWFsQ2FwYWNpdHksIGZsb2F0IGxvYWRGYWN0b3IpIHsNCisgICAgaWYgKGxvYWRGYWN0b3IgPD0gMCkNCisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIExvYWQgZmFjdG9yOiAiKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZEZhY3Rvcik7DQorICAgIHRoaXMubG9hZEZhY3RvciA9IGxvYWRGYWN0b3I7DQorDQorICAgIGludCBjYXAgPSBwMmNhcGFjaXR5KGluaXRpYWxDYXBhY2l0eSk7DQorDQorICAgIHRhYmxlID0gbmV3IEVudHJ5W2NhcF07DQorICAgIHRocmVzaG9sZCA9IChpbnQpKGNhcCAqIGxvYWRGYWN0b3IpOw0KKyAgfQ0KKw0KKyAgLyoqDQorICAgKiBDb25zdHJ1Y3RzIGEgbmV3LCBlbXB0eSBtYXAgd2l0aCB0aGUgc3BlY2lmaWVkIGluaXRpYWwgDQorICAgKiBjYXBhY2l0eSBhbmQgZGVmYXVsdCBsb2FkIGZhY3Rvci4NCisgICAqDQorICAgKiBAcGFyYW0gICBpbml0aWFsQ2FwYWNpdHkgICB0aGUgaW5pdGlhbCBjYXBhY2l0eSBvZiB0aGUgDQorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25jdXJyZW50UmVhZGVySGFzaE1hcC4NCisgICAqIEB0aHJvd3MgICAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBpbml0aWFsIG1heGltdW0gbnVtYmVyIA0KKyAgICogICAgICAgICAgICAgIG9mIGVsZW1lbnRzIGlzIGxlc3MNCisgICAqICAgICAgICAgICAgICB0aGFuIHplcm8uDQorICAgKi8NCisgIHB1YmxpYyBDb25jdXJyZW50UmVhZGVySGFzaE1hcChpbnQgaW5pdGlhbENhcGFjaXR5KSB7DQorICAgIHRoaXMoaW5pdGlhbENhcGFjaXR5LCBERUZBVUxUX0xPQURfRkFDVE9SKTsNCisgIH0NCisNCisgIC8qKg0KKyAgICogQ29uc3RydWN0cyBhIG5ldywgZW1wdHkgbWFwIHdpdGggYSBkZWZhdWx0IGluaXRpYWwgY2FwYWNpdHkNCisgICAqIGFuZCBsb2FkIGZhY3Rvci4NCisgICAqLw0KKyAgcHVibGljIENvbmN1cnJlbnRSZWFkZXJIYXNoTWFwKCkgew0KKyAgICB0aGlzKERFRkFVTFRfSU5JVElBTF9DQVBBQ0lUWSwgREVGQVVMVF9MT0FEX0ZBQ1RPUik7DQorICB9DQorDQorICAvKioNCisgICAqIENvbnN0cnVjdHMgYSBuZXcgbWFwIHdpdGggdGhlIHNhbWUgbWFwcGluZ3MgYXMgdGhlIGdpdmVuIG1hcC4gIFRoZQ0KKyAgICogbWFwIGlzIGNyZWF0ZWQgd2l0aCBhIGNhcGFjaXR5IG9mIHR3aWNlIHRoZSBudW1iZXIgb2YgbWFwcGluZ3MgaW4NCisgICAqIHRoZSBnaXZlbiBtYXAgb3IgMTYgKHdoaWNoZXZlciBpcyBncmVhdGVyKSwgYW5kIGEgZGVmYXVsdCBsb2FkIGZhY3Rvci4NCisgICAqLw0KKyAgcHVibGljIENvbmN1cnJlbnRSZWFkZXJIYXNoTWFwKE1hcCB0KSB7DQorICAgICAgICB0aGlzKE1hdGgubWF4KChpbnQpICh0LnNpemUoKSAvIERFRkFVTFRfTE9BRF9GQUNUT1IpICsgMSwgMTYpLA0KKyAgICAgICAgICAgICBERUZBVUxUX0xPQURfRkFDVE9SKTsNCisgICAgcHV0QWxsKHQpOw0KKyAgfQ0KKw0KKyAgLyoqDQorICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Yga2V5LXZhbHVlIG1hcHBpbmdzIGluIHRoaXMgbWFwLg0KKyAgICoNCisgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBrZXktdmFsdWUgbWFwcGluZ3MgaW4gdGhpcyBtYXAuDQorICAgKi8NCisgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IHNpemUoKSB7DQorICAgIHJldHVybiBjb3VudDsNCisgIH0NCisNCisgIC8qKg0KKyAgICogUmV0dXJucyA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoaXMgbWFwIGNvbnRhaW5zIG5vIGtleS12YWx1ZSBtYXBwaW5ncy4NCisgICAqDQorICAgKiBAcmV0dXJuIDx0dD50cnVlPC90dD4gaWYgdGhpcyBtYXAgY29udGFpbnMgbm8ga2V5LXZhbHVlIG1hcHBpbmdzLg0KKyAgICovDQorICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNFbXB0eSgpIHsNCisgICAgcmV0dXJuIGNvdW50ID09IDA7DQorICB9DQorICANCisNCisNCisgIC8qKg0KKyAgICogUmV0dXJucyB0aGUgdmFsdWUgdG8gd2hpY2ggdGhlIHNwZWNpZmllZCBrZXkgaXMgbWFwcGVkIGluIHRoaXMgdGFibGUuDQorICAgKg0KKyAgICogQHBhcmFtICAga2V5ICAgYSBrZXkgaW4gdGhlIHRhYmxlLg0KKyAgICogQHJldHVybiAgdGhlIHZhbHVlIHRvIHdoaWNoIHRoZSBrZXkgaXMgbWFwcGVkIGluIHRoaXMgdGFibGU7DQorICAgKiAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUga2V5IGlzIG5vdCBtYXBwZWQgdG8gYW55IHZhbHVlIGluDQorICAgKiAgICAgICAgICB0aGlzIHRhYmxlLg0KKyAgICogQGV4Y2VwdGlvbiAgTnVsbFBvaW50ZXJFeGNlcHRpb24gIGlmIHRoZSBrZXkgaXMNCisgICAqICAgICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uDQorICAgKiBAc2VlICAgICAjcHV0KE9iamVjdCwgT2JqZWN0KQ0KKyAgICovDQorICBwdWJsaWMgT2JqZWN0IGdldChPYmplY3Qga2V5KSB7DQorDQorICAgIC8vIHRocm93IG51bGwgcG9pbnRlciBleGNlcHRpb24gaWYga2V5IG51bGwNCisgICAgaW50IGhhc2ggPSBoYXNoKGtleSk7DQorDQorICAgIC8qIA0KKyAgICAgICBTdGFydCBvZmYgYXQgdGhlIGFwcGFyZW50bHkgY29ycmVjdCBiaW4uICBJZiBlbnRyeSBpcyBmb3VuZCwgd2UNCisgICAgICAgbmVlZCB0byBjaGVjayBhZnRlciBhIGJhcnJpZXIgYW55d2F5LiAgSWYgbm90IGZvdW5kLCB3ZSBuZWVkIGENCisgICAgICAgYmFycmllciB0byBjaGVjayBpZiB3ZSBhcmUgYWN0dWFsbHkgaW4gcmlnaHQgYmluLiBTbyBlaXRoZXINCisgICAgICAgd2F5LCB3ZSBlbmNvdW50ZXIgb25seSBvbmUgYmFycmllciB1bmxlc3Mgd2UgbmVlZCB0byByZXRyeS4NCisgICAgICAgQW5kIHdlIG9ubHkgbmVlZCB0byBmdWxseSBzeW5jaHJvbml6ZSBpZiB0aGVyZSBoYXZlIGJlZW4NCisgICAgICAgY29uY3VycmVudCBtb2RpZmljYXRpb25zLg0KKyAgICAqLw0KKw0KKyAgICBFbnRyeVtdIHRhYiA9IHRhYmxlOw0KKyAgICBpbnQgaW5kZXggPSBoYXNoICYgKHRhYi5sZW5ndGggLSAxKTsNCisgICAgRW50cnkgZmlyc3QgPSB0YWJbaW5kZXhdOw0KKyAgICBFbnRyeSBlID0gZmlyc3Q7DQorDQorICAgIGZvciAoOzspIHsNCisgICAgICBpZiAoZSA9PSBudWxsKSB7DQorDQorICAgICAgICAvLyBJZiBrZXkgYXBwYXJlbnRseSBub3QgdGhlcmUsIGNoZWNrIHRvDQorICAgICAgICAvLyBtYWtlIHN1cmUgdGhpcyB3YXMgYSB2YWxpZCByZWFkDQorDQorICAgICAgICBFbnRyeVtdIHJlcmVhZCA9IGdldFRhYmxlRm9yUmVhZGluZygpOw0KKyAgICAgICAgaWYgKHRhYiA9PSByZXJlYWQgJiYgZmlyc3QgPT0gdGFiW2luZGV4XSkNCisgICAgICAgICAgcmV0dXJuIG51bGw7DQorICAgICAgICBlbHNlIHsNCisgICAgICAgICAgLy8gV3JvbmcgbGlzdCAtLSBtdXN0IHJlc3RhcnQgdHJhdmVyc2FsIGF0IG5ldyBmaXJzdA0KKyAgICAgICAgICB0YWIgPSByZXJlYWQ7DQorICAgICAgICAgIGUgPSBmaXJzdCA9IHRhYltpbmRleCA9IGhhc2ggJiAodGFiLmxlbmd0aC0xKV07DQorICAgICAgICB9DQorDQorICAgICAgfQ0KKw0KKyAgICAgIGVsc2UgaWYgKGUuaGFzaCA9PSBoYXNoICYmIGVxKGtleSwgZS5rZXkpKSB7DQorICAgICAgICBPYmplY3QgdmFsdWUgPSBlLnZhbHVlOw0KKyAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIA0KKyAgICAgICAgICByZXR1cm4gdmFsdWU7DQorDQorICAgICAgICAvLyBFbnRyeSB3YXMgaW52YWxpZGF0ZWQgZHVyaW5nIGRlbGV0aW9uLiBCdXQgaXQgY291bGQNCisgICAgICAgIC8vIGhhdmUgYmVlbiByZS1pbnNlcnRlZCwgc28gd2UgbXVzdCByZXRyYXZlcnNlLg0KKyAgICAgICAgLy8gVG8gYXZvaWQgdXNlbGVzcyBjb250ZW50aW9uLCBnZXQgbG9jayB0byB3YWl0IG91dCBtb2RpZmljYXRpb25zDQorICAgICAgICAvLyBiZWZvcmUgcmV0cmF2ZXJzaW5nLg0KKw0KKyAgICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsNCisgICAgICAgICAgdGFiID0gdGFibGU7DQorICAgICAgICB9DQorICAgICAgICBlID0gZmlyc3QgPSB0YWJbaW5kZXggPSBoYXNoICYgKHRhYi5sZW5ndGgtMSldOw0KKw0KKyAgICAgIH0NCisgICAgICBlbHNlDQorICAgICAgICBlID0gZS5uZXh0Ow0KKyAgICB9DQorICB9DQorDQorDQorICAvKioNCisgICAqIFRlc3RzIGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGEga2V5IGluIHRoaXMgdGFibGUuDQorICAgKiANCisgICAqIEBwYXJhbSAgIGtleSAgIHBvc3NpYmxlIGtleS4NCisgICAqIEByZXR1cm4gIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFuZCBvbmx5IGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IA0KKyAgICogICAgICAgICAgaXMgYSBrZXkgaW4gdGhpcyB0YWJsZSwgYXMgZGV0ZXJtaW5lZCBieSB0aGUgDQorICAgKiAgICAgICAgICA8dHQ+ZXF1YWxzPC90dD4gbWV0aG9kOyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLg0KKyAgICogQGV4Y2VwdGlvbiAgTnVsbFBvaW50ZXJFeGNlcHRpb24gIGlmIHRoZSBrZXkgaXMNCisgICAqICAgICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uDQorICAgKiBAc2VlICAgICAjY29udGFpbnMoT2JqZWN0KQ0KKyAgICovDQorICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShPYmplY3Qga2V5KSB7DQorICAgIHJldHVybiBnZXQoa2V5KSAhPSBudWxsOw0KKyAgfQ0KKw0KKyAgLyoqDQorICAgKiBNYXBzIHRoZSBzcGVjaWZpZWQgPGNvZGU+a2V5PC9jb2RlPiB0byB0aGUgc3BlY2lmaWVkIA0KKyAgICogPGNvZGU+dmFsdWU8L2NvZGU+IGluIHRoaXMgdGFibGUuIE5laXRoZXIgdGhlIGtleSBub3IgdGhlIA0KKyAgICogdmFsdWUgY2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+LiA8cD4NCisgICAqDQorICAgKiBUaGUgdmFsdWUgY2FuIGJlIHJldHJpZXZlZCBieSBjYWxsaW5nIHRoZSA8Y29kZT5nZXQ8L2NvZGU+IG1ldGhvZCANCisgICAqIHdpdGggYSBrZXkgdGhhdCBpcyBlcXVhbCB0byB0aGUgb3JpZ2luYWwga2V5LiANCisgICAqDQorICAgKiBAcGFyYW0gICAgICBrZXkgICAgIHRoZSB0YWJsZSBrZXkuDQorICAgKiBAcGFyYW0gICAgICB2YWx1ZSAgIHRoZSB2YWx1ZS4NCisgICAqIEByZXR1cm4gICAgIHRoZSBwcmV2aW91cyB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGtleSBpbiB0aGlzIHRhYmxlLA0KKyAgICogICAgICAgICAgICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgZGlkIG5vdCBoYXZlIG9uZS4NCisgICAqIEBleGNlcHRpb24gIE51bGxQb2ludGVyRXhjZXB0aW9uICBpZiB0aGUga2V5IG9yIHZhbHVlIGlzDQorICAgKiAgICAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+Lg0KKyAgICogQHNlZSAgICAgT2JqZWN0I2VxdWFscyhPYmplY3QpDQorICAgKiBAc2VlICAgICAjZ2V0KE9iamVjdCkNCisgICAqLw0KKyAgcHVibGljIE9iamVjdCBwdXQoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7DQorICAgIGlmICh2YWx1ZSA9PSBudWxsKSANCisgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsNCisgICAgDQorICAgIGludCBoYXNoID0gaGFzaChrZXkpOw0KKyAgICBFbnRyeVtdIHRhYiA9IHRhYmxlOw0KKyAgICBpbnQgaW5kZXggPSBoYXNoICYgKHRhYi5sZW5ndGgtMSk7DQorICAgIEVudHJ5IGZpcnN0ID0gdGFiW2luZGV4XTsNCisgICAgRW50cnkgZTsNCisNCisgICAgZm9yIChlID0gZmlyc3Q7IGUgIT0gbnVsbDsgZSA9IGUubmV4dCkNCisgICAgICBpZiAoZS5oYXNoID09IGhhc2ggJiYgZXEoa2V5LCBlLmtleSkpDQorICAgICAgICBicmVhazsNCisNCisgICAgc3luY2hyb25pemVkKHRoaXMpIHsNCisgICAgICBpZiAodGFiID09IHRhYmxlKSB7DQorICAgICAgICBpZiAoZSA9PSBudWxsKSB7DQorICAgICAgICAgIC8vICBtYWtlIHN1cmUgd2UgYXJlIGFkZGluZyB0byBjb3JyZWN0IGxpc3QNCisgICAgICAgICAgaWYgKGZpcnN0ID09IHRhYltpbmRleF0pIHsNCisgICAgICAgICAgICAvLyAgQWRkIHRvIGZyb250IG9mIGxpc3QNCisgICAgICAgICAgICBFbnRyeSBuZXdFbnRyeSA9IG5ldyBFbnRyeShoYXNoLCBrZXksIHZhbHVlLCBmaXJzdCk7DQorICAgICAgICAgICAgdGFiW2luZGV4XSA9IG5ld0VudHJ5Ow0KKyAgICAgICAgICAgIGlmICgrK2NvdW50ID49IHRocmVzaG9sZCkgcmVoYXNoKCk7DQorICAgICAgICAgICAgZWxzZSByZWNvcmRNb2RpZmljYXRpb24obmV3RW50cnkpOw0KKyAgICAgICAgICAgIHJldHVybiBudWxsOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBlbHNlIHsNCisgICAgICAgICAgT2JqZWN0IG9sZFZhbHVlID0gZS52YWx1ZTsgDQorICAgICAgICAgIGlmIChmaXJzdCA9PSB0YWJbaW5kZXhdICYmIG9sZFZhbHVlICE9IG51bGwpIHsNCisgICAgICAgICAgICBlLnZhbHVlID0gdmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIG9sZFZhbHVlOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIA0KKyAgICAgIC8vIHJldHJ5IGlmIHdyb25nIGxpc3Qgb3IgbG9zdCByYWNlIGFnYWluc3QgY29uY3VycmVudCByZW1vdmUNCisgICAgICByZXR1cm4gc3B1dChrZXksIHZhbHVlLCBoYXNoKTsNCisgICAgfQ0KKyAgfQ0KKw0KKw0KKyAgLyoqDQorICAgKiBDb250aW51YXRpb24gb2YgcHV0KCksIGNhbGxlZCBvbmx5IHdoZW4gc3luY2ggbG9jayBpcw0KKyAgICogaGVsZCBhbmQgaW50ZXJmZXJlbmNlIGhhcyBiZWVuIGRldGVjdGVkLg0KKyAgICoqLw0KKyAgcHJvdGVjdGVkIE9iamVjdCBzcHV0KE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSwgaW50IGhhc2gpIHsgDQorDQorICAgIEVudHJ5W10gdGFiID0gdGFibGU7DQorICAgIGludCBpbmRleCA9IGhhc2ggJiAodGFiLmxlbmd0aC0xKTsNCisgICAgRW50cnkgZmlyc3QgPSB0YWJbaW5kZXhdOw0KKyAgICBFbnRyeSBlID0gZmlyc3Q7DQorDQorICAgIGZvciAoOzspIHsNCisgICAgICBpZiAoZSA9PSBudWxsKSB7DQorICAgICAgICBFbnRyeSBuZXdFbnRyeSA9IG5ldyBFbnRyeShoYXNoLCBrZXksIHZhbHVlLCBmaXJzdCk7DQorICAgICAgICB0YWJbaW5kZXhdID0gbmV3RW50cnk7DQorICAgICAgICBpZiAoKytjb3VudCA+PSB0aHJlc2hvbGQpIHJlaGFzaCgpOw0KKyAgICAgICAgZWxzZSByZWNvcmRNb2RpZmljYXRpb24obmV3RW50cnkpOw0KKyAgICAgICAgcmV0dXJuIG51bGw7DQorICAgICAgfQ0KKyAgICAgIGVsc2UgaWYgKGUuaGFzaCA9PSBoYXNoICYmIGVxKGtleSwgZS5rZXkpKSB7DQorICAgICAgICBPYmplY3Qgb2xkVmFsdWUgPSBlLnZhbHVlOyANCisgICAgICAgIGUudmFsdWUgPSB2YWx1ZTsNCisgICAgICAgIHJldHVybiBvbGRWYWx1ZTsNCisgICAgICB9DQorICAgICAgZWxzZQ0KKyAgICAgICAgZSA9IGUubmV4dDsNCisgICAgfQ0KKyAgfQ0KKw0KKw0KKyAgLyoqDQorICAgKiBSZWhhc2hlcyB0aGUgY29udGVudHMgb2YgdGhpcyBtYXAgaW50byBhIG5ldyB0YWJsZQ0KKyAgICogd2l0aCBhIGxhcmdlciBjYXBhY2l0eS4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUNCisgICAqIG51bWJlciBvZiBrZXlzIGluIHRoaXMgbWFwIGV4Y2VlZHMgaXRzIGNhcGFjaXR5IGFuZCBsb2FkIGZhY3Rvci4NCisgICAqLw0KKyAgcHJvdGVjdGVkIHZvaWQgcmVoYXNoKCkgeyANCisgICAgRW50cnlbXSBvbGRUYWJsZSA9IHRhYmxlOw0KKyAgICBpbnQgb2xkQ2FwYWNpdHkgPSBvbGRUYWJsZS5sZW5ndGg7DQorICAgIGlmIChvbGRDYXBhY2l0eSA+PSBNQVhJTVVNX0NBUEFDSVRZKSB7DQorICAgICAgdGhyZXNob2xkID0gSW50ZWdlci5NQVhfVkFMVUU7IC8vIGF2b2lkIHJldHJpZ2dlcmluZw0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKw0KKyAgICBpbnQgbmV3Q2FwYWNpdHkgPSBvbGRDYXBhY2l0eSA8PCAxOw0KKyAgICBpbnQgbWFzayA9IG5ld0NhcGFjaXR5IC0gMTsNCisgICAgdGhyZXNob2xkID0gKGludCkobmV3Q2FwYWNpdHkgKiBsb2FkRmFjdG9yKTsNCisNCisgICAgRW50cnlbXSBuZXdUYWJsZSA9IG5ldyBFbnRyeVtuZXdDYXBhY2l0eV07DQorICAgIC8qDQorICAgICAqIFJlY2xhc3NpZnkgbm9kZXMgaW4gZWFjaCBsaXN0IHRvIG5ldyBNYXAuICBCZWNhdXNlIHdlIGFyZQ0KKyAgICAgKiB1c2luZyBwb3dlci1vZi10d28gZXhwYW5zaW9uLCB0aGUgZWxlbWVudHMgZnJvbSBlYWNoIGJpbg0KKyAgICAgKiBtdXN0IGVpdGhlciBzdGF5IGF0IHNhbWUgaW5kZXgsIG9yIG1vdmUgdG8NCisgICAgICogb2xkQ2FwYWNpdHkraW5kZXguIFdlIGFsc28gZWxpbWluYXRlIHVubmVjZXNzYXJ5IG5vZGUNCisgICAgICogY3JlYXRpb24gYnkgY2F0Y2hpbmcgY2FzZXMgd2hlcmUgb2xkIG5vZGVzIGNhbiBiZSByZXVzZWQNCisgICAgICogYmVjYXVzZSB0aGVpciBuZXh0IGZpZWxkcyB3b24ndCBjaGFuZ2UuIFN0YXRpc3RpY2FsbHksIGF0DQorICAgICAqIHRoZSBkZWZhdWx0IHRocmVzaGhvbGQsIG9ubHkgYWJvdXQgb25lLXNpeHRoIG9mIHRoZW0gbmVlZA0KKyAgICAgKiBjbG9uaW5nLiAoVGhlIG5vZGVzIHRoZXkgcmVwbGFjZSB3aWxsIGJlIGdhcmJhZ2UNCisgICAgICogY29sbGVjdGFibGUgYXMgc29vbiBhcyB0aGV5IGFyZSBubyBsb25nZXIgcmVmZXJlbmNlZCBieSBhbnkNCisgICAgICogcmVhZGVyIHRocmVhZCB0aGF0IG1heSBiZSBpbiB0aGUgbWlkc3Qgb2YgdHJhdmVyc2luZyB0YWJsZQ0KKyAgICAgKiByaWdodCBub3cuKQ0KKyAgICAgKi8NCisgICAgDQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb2xkQ2FwYWNpdHkgOyBpKyspIHsNCisgICAgICAvLyBXZSBuZWVkIHRvIGd1YXJhbnRlZSB0aGF0IGFueSBleGlzdGluZyByZWFkcyBvZiBvbGQgTWFwIGNhbg0KKyAgICAgIC8vICBwcm9jZWVkLiBTbyB3ZSBjYW5ub3QgeWV0IG51bGwgb3V0IGVhY2ggYmluLiAgDQorICAgICAgRW50cnkgZSA9IG9sZFRhYmxlW2ldOw0KKyAgICAgIA0KKyAgICAgIGlmIChlICE9IG51bGwpIHsNCisgICAgICAgIGludCBpZHggPSBlLmhhc2ggJiBtYXNrOw0KKyAgICAgICAgRW50cnkgbmV4dCA9IGUubmV4dDsNCisgICAgICAgIA0KKyAgICAgICAgLy8gIFNpbmdsZSBub2RlIG9uIGxpc3QNCisgICAgICAgIGlmIChuZXh0ID09IG51bGwpIA0KKyAgICAgICAgICBuZXdUYWJsZVtpZHhdID0gZTsNCisgICAgICAgIA0KKyAgICAgICAgZWxzZSB7ICAgIA0KKyAgICAgICAgICAvLyBSZXVzZSB0cmFpbGluZyBjb25zZWN1dGl2ZSBzZXF1ZW5jZSBvZiBhbGwgc2FtZSBiaXQNCisgICAgICAgICAgRW50cnkgbGFzdFJ1biA9IGU7DQorICAgICAgICAgIGludCBsYXN0SWR4ID0gaWR4Ow0KKyAgICAgICAgICBmb3IgKEVudHJ5IGxhc3QgPSBuZXh0OyBsYXN0ICE9IG51bGw7IGxhc3QgPSBsYXN0Lm5leHQpIHsNCisgICAgICAgICAgICBpbnQgayA9IGxhc3QuaGFzaCAmIG1hc2s7DQorICAgICAgICAgICAgaWYgKGsgIT0gbGFzdElkeCkgew0KKyAgICAgICAgICAgICAgbGFzdElkeCA9IGs7DQorICAgICAgICAgICAgICBsYXN0UnVuID0gbGFzdDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgbmV3VGFibGVbbGFzdElkeF0gPSBsYXN0UnVuOw0KKyAgICAgICAgICANCisgICAgICAgICAgLy8gQ2xvbmUgYWxsIHJlbWFpbmluZyBub2Rlcw0KKyAgICAgICAgICBmb3IgKEVudHJ5IHAgPSBlOyBwICE9IGxhc3RSdW47IHAgPSBwLm5leHQpIHsNCisgICAgICAgICAgICBpbnQgayA9IHAuaGFzaCAmIG1hc2s7DQorICAgICAgICAgICAgbmV3VGFibGVba10gPSBuZXcgRW50cnkocC5oYXNoLCBwLmtleSwgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC52YWx1ZSwgbmV3VGFibGVba10pOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorDQorICAgIHRhYmxlID0gbmV3VGFibGU7DQorICAgIHJlY29yZE1vZGlmaWNhdGlvbihuZXdUYWJsZSk7DQorICB9DQorDQorICAvKioNCisgICAqIFJlbW92ZXMgdGhlIGtleSAoYW5kIGl0cyBjb3JyZXNwb25kaW5nIHZhbHVlKSBmcm9tIHRoaXMgDQorICAgKiB0YWJsZS4gVGhpcyBtZXRob2QgZG9lcyBub3RoaW5nIGlmIHRoZSBrZXkgaXMgbm90IGluIHRoZSB0YWJsZS4NCisgICAqDQorICAgKiBAcGFyYW0gICBrZXkgICB0aGUga2V5IHRoYXQgbmVlZHMgdG8gYmUgcmVtb3ZlZC4NCisgICAqIEByZXR1cm4gIHRoZSB2YWx1ZSB0byB3aGljaCB0aGUga2V5IGhhZCBiZWVuIG1hcHBlZCBpbiB0aGlzIHRhYmxlLA0KKyAgICogICAgICAgICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGtleSBkaWQgbm90IGhhdmUgYSBtYXBwaW5nLg0KKyAgICogQGV4Y2VwdGlvbiAgTnVsbFBvaW50ZXJFeGNlcHRpb24gIGlmIHRoZSBrZXkgaXMNCisgICAqICAgICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uDQorICAgKi8NCisgIHB1YmxpYyBPYmplY3QgcmVtb3ZlKE9iamVjdCBrZXkpIHsNCisgICAgLyoNCisgICAgICBGaW5kIHRoZSBlbnRyeSwgdGhlbiANCisgICAgICAgIDEuIFNldCB2YWx1ZSBmaWVsZCB0byBudWxsLCB0byBmb3JjZSBnZXQoKSB0byByZXRyeQ0KKyAgICAgICAgMi4gUmVidWlsZCB0aGUgbGlzdCB3aXRob3V0IHRoaXMgZW50cnkuDQorICAgICAgICAgICBBbGwgZW50cmllcyBmb2xsb3dpbmcgcmVtb3ZlZCBub2RlIGNhbiBzdGF5IGluIGxpc3QsIGJ1dA0KKyAgICAgICAgICAgYWxsIHByZWNlZWRpbmcgb25lcyBuZWVkIHRvIGJlIGNsb25lZC4gIFRyYXZlcnNhbHMgcmVseQ0KKyAgICAgICAgICAgb24gdGhpcyBzdHJhdGVneSB0byBlbnN1cmUgdGhhdCBlbGVtZW50cyB3aWxsIG5vdCBiZQ0KKyAgICAgICAgICByZXBlYXRlZCBkdXJpbmcgaXRlcmF0aW9uLg0KKyAgICAqLw0KKyAgICAgICAgICANCisNCisgICAgaW50IGhhc2ggPSBoYXNoKGtleSk7DQorICAgIEVudHJ5W10gdGFiID0gdGFibGU7DQorICAgIGludCBpbmRleCA9IGhhc2ggJiAodGFiLmxlbmd0aC0xKTsNCisgICAgRW50cnkgZmlyc3QgPSB0YWJbaW5kZXhdOw0KKyAgICBFbnRyeSBlID0gZmlyc3Q7DQorICAgICAgDQorICAgIGZvciAoZSA9IGZpcnN0OyBlICE9IG51bGw7IGUgPSBlLm5leHQpIA0KKyAgICAgIGlmIChlLmhhc2ggPT0gaGFzaCAmJiBlcShrZXksIGUua2V5KSkgDQorICAgICAgICBicmVhazsNCisNCisNCisgICAgc3luY2hyb25pemVkKHRoaXMpIHsNCisgICAgICBpZiAodGFiID09IHRhYmxlKSB7DQorICAgICAgICBpZiAoZSA9PSBudWxsKSB7DQorICAgICAgICAgIGlmIChmaXJzdCA9PSB0YWJbaW5kZXhdKQ0KKyAgICAgICAgICAgIHJldHVybiBudWxsOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZSB7DQorICAgICAgICAgIE9iamVjdCBvbGRWYWx1ZSA9IGUudmFsdWU7DQorICAgICAgICAgIGlmIChmaXJzdCA9PSB0YWJbaW5kZXhdICYmIG9sZFZhbHVlICE9IG51bGwpIHsNCisgICAgICAgICAgICBlLnZhbHVlID0gbnVsbDsNCisgICAgICAgICAgICBjb3VudC0tOw0KKyAgICAgICAgICAgIA0KKyAgICAgICAgICAgIEVudHJ5IGhlYWQgPSBlLm5leHQ7DQorICAgICAgICAgICAgZm9yIChFbnRyeSBwID0gZmlyc3Q7IHAgIT0gZTsgcCA9IHAubmV4dCkgDQorICAgICAgICAgICAgICBoZWFkID0gbmV3IEVudHJ5KHAuaGFzaCwgcC5rZXksIHAudmFsdWUsIGhlYWQpOw0KKyAgICAgICAgICAgIA0KKyAgICAgICAgICAgIHRhYltpbmRleF0gPSBoZWFkOw0KKyAgICAgICAgICAgIHJlY29yZE1vZGlmaWNhdGlvbihoZWFkKTsNCisgICAgICAgICAgICByZXR1cm4gb2xkVmFsdWU7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9DQorICAgIA0KKyAgICAgIC8vIFdyb25nIGxpc3Qgb3IgaW50ZXJmZXJlbmNlDQorICAgICAgcmV0dXJuIHNyZW1vdmUoa2V5LCBoYXNoKTsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgLyoqDQorICAgKiBDb250aW51YXRpb24gb2YgcmVtb3ZlKCksIGNhbGxlZCBvbmx5IHdoZW4gc3luY2ggbG9jayBpcw0KKyAgICogaGVsZCBhbmQgaW50ZXJmZXJlbmNlIGhhcyBiZWVuIGRldGVjdGVkLg0KKyAgICoqLw0KKyAgcHJvdGVjdGVkIE9iamVjdCBzcmVtb3ZlKE9iamVjdCBrZXksIGludCBoYXNoKSB7DQorICAgIEVudHJ5W10gdGFiID0gdGFibGU7DQorICAgIGludCBpbmRleCA9IGhhc2ggJiAodGFiLmxlbmd0aC0xKTsNCisgICAgRW50cnkgZmlyc3QgPSB0YWJbaW5kZXhdOw0KKyAgICAgIA0KKyAgICBmb3IgKEVudHJ5IGUgPSBmaXJzdDsgZSAhPSBudWxsOyBlID0gZS5uZXh0KSB7DQorICAgICAgaWYgKGUuaGFzaCA9PSBoYXNoICYmIGVxKGtleSwgZS5rZXkpKSB7DQorICAgICAgICBPYmplY3Qgb2xkVmFsdWUgPSBlLnZhbHVlOw0KKyAgICAgICAgZS52YWx1ZSA9IG51bGw7DQorICAgICAgICBjb3VudC0tOw0KKyAgICAgICAgRW50cnkgaGVhZCA9IGUubmV4dDsNCisgICAgICAgIGZvciAoRW50cnkgcCA9IGZpcnN0OyBwICE9IGU7IHAgPSBwLm5leHQpIA0KKyAgICAgICAgICBoZWFkID0gbmV3IEVudHJ5KHAuaGFzaCwgcC5rZXksIHAudmFsdWUsIGhlYWQpOw0KKyAgICAgICAgDQorICAgICAgICB0YWJbaW5kZXhdID0gaGVhZDsNCisgICAgICAgIHJlY29yZE1vZGlmaWNhdGlvbihoZWFkKTsNCisgICAgICAgIHJldHVybiBvbGRWYWx1ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIG51bGw7DQorICB9DQorDQorDQorICAvKioNCisgICAqIFJldHVybnMgPHR0PnRydWU8L3R0PiBpZiB0aGlzIG1hcCBtYXBzIG9uZSBvciBtb3JlIGtleXMgdG8gdGhlDQorICAgKiBzcGVjaWZpZWQgdmFsdWUuIE5vdGU6IFRoaXMgbWV0aG9kIHJlcXVpcmVzIGEgZnVsbCBpbnRlcm5hbA0KKyAgICogdHJhdmVyc2FsIG9mIHRoZSBoYXNoIHRhYmxlLCBhbmQgc28gaXMgbXVjaCBzbG93ZXIgdGhhbg0KKyAgICogbWV0aG9kIDx0dD5jb250YWluc0tleTwvdHQ+Lg0KKyAgICoNCisgICAqIEBwYXJhbSB2YWx1ZSB2YWx1ZSB3aG9zZSBwcmVzZW5jZSBpbiB0aGlzIG1hcCBpcyB0byBiZSB0ZXN0ZWQuDQorICAgKiBAcmV0dXJuIDx0dD50cnVlPC90dD4gaWYgdGhpcyBtYXAgbWFwcyBvbmUgb3IgbW9yZSBrZXlzIHRvIHRoZQ0KKyAgICogc3BlY2lmaWVkIHZhbHVlLiAgDQorICAgKiBAZXhjZXB0aW9uICBOdWxsUG9pbnRlckV4Y2VwdGlvbiAgaWYgdGhlIHZhbHVlIGlzIDxjb2RlPm51bGw8L2NvZGU+Lg0KKyAgICovDQorICBwdWJsaWMgYm9vbGVhbiBjb250YWluc1ZhbHVlKE9iamVjdCB2YWx1ZSkgew0KKyAgICBpZiAodmFsdWUgPT0gbnVsbCkgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7DQorDQorICAgIEVudHJ5IHRhYltdID0gZ2V0VGFibGVGb3JSZWFkaW5nKCk7DQorICAgIA0KKyAgICBmb3IgKGludCBpID0gMCA7IGkgPCB0YWIubGVuZ3RoOyArK2kpIHsNCisgICAgICBmb3IgKEVudHJ5IGUgPSB0YWJbaV0gOyBlICE9IG51bGwgOyBlID0gZS5uZXh0KSANCisgICAgICAgIGlmICh2YWx1ZS5lcXVhbHMoZS52YWx1ZSkpDQorICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICB9DQorDQorICAgIHJldHVybiBmYWxzZTsNCisgIH0NCisNCisgIC8qKg0KKyAgICogVGVzdHMgaWYgc29tZSBrZXkgbWFwcyBpbnRvIHRoZSBzcGVjaWZpZWQgdmFsdWUgaW4gdGhpcyB0YWJsZS4NCisgICAqIFRoaXMgb3BlcmF0aW9uIGlzIG1vcmUgZXhwZW5zaXZlIHRoYW4gdGhlIDxjb2RlPmNvbnRhaW5zS2V5PC9jb2RlPg0KKyAgICogbWV0aG9kLjxwPg0KKyAgICoNCisgICAqIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBpcyBpZGVudGljYWwgaW4gZnVuY3Rpb25hbGl0eSB0byBjb250YWluc1ZhbHVlLA0KKyAgICogKHdoaWNoIGlzIHBhcnQgb2YgdGhlIE1hcCBpbnRlcmZhY2UgaW4gdGhlIGNvbGxlY3Rpb25zIGZyYW1ld29yaykuDQorICAgKiANCisgICAqIEBwYXJhbSAgICAgIHZhbHVlICAgYSB2YWx1ZSB0byBzZWFyY2ggZm9yLg0KKyAgICogQHJldHVybiAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYW5kIG9ubHkgaWYgc29tZSBrZXkgbWFwcyB0byB0aGUNCisgICAqICAgICAgICAgICAgIDxjb2RlPnZhbHVlPC9jb2RlPiBhcmd1bWVudCBpbiB0aGlzIHRhYmxlIGFzIA0KKyAgICogICAgICAgICAgICAgZGV0ZXJtaW5lZCBieSB0aGUgPHR0PmVxdWFsczwvdHQ+IG1ldGhvZDsNCisgICAqICAgICAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuDQorICAgKiBAZXhjZXB0aW9uICBOdWxsUG9pbnRlckV4Y2VwdGlvbiAgaWYgdGhlIHZhbHVlIGlzIDxjb2RlPm51bGw8L2NvZGU+Lg0KKyAgICogQHNlZSAgICAgICAgI2NvbnRhaW5zS2V5KE9iamVjdCkNCisgICAqIEBzZWUgICAgICAgICNjb250YWluc1ZhbHVlKE9iamVjdCkNCisgICAqIEBzZWUgICAgICBNYXANCisgICAqLw0KKyAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IHZhbHVlKSB7DQorICAgIHJldHVybiBjb250YWluc1ZhbHVlKHZhbHVlKTsNCisgIH0NCisNCisNCisgIC8qKg0KKyAgICogQ29waWVzIGFsbCBvZiB0aGUgbWFwcGluZ3MgZnJvbSB0aGUgc3BlY2lmaWVkIG1hcCB0byB0aGlzIG9uZS4NCisgICAqIA0KKyAgICogVGhlc2UgbWFwcGluZ3MgcmVwbGFjZSBhbnkgbWFwcGluZ3MgdGhhdCB0aGlzIG1hcCBoYWQgZm9yIGFueSBvZiB0aGUNCisgICAqIGtleXMgY3VycmVudGx5IGluIHRoZSBzcGVjaWZpZWQgTWFwLg0KKyAgICoNCisgICAqIEBwYXJhbSB0IE1hcHBpbmdzIHRvIGJlIHN0b3JlZCBpbiB0aGlzIG1hcC4NCisgICAqLw0KKyAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHB1dEFsbChNYXAgdCkgew0KKyAgICBpbnQgbiA9IHQuc2l6ZSgpOw0KKyAgICBpZiAobiA9PSAwKQ0KKyAgICAgIHJldHVybjsNCisNCisgICAgLy8gRXhwYW5kIGVub3VnaCB0byBob2xkIGF0IGxlYXN0IG4gZWxlbWVudHMgd2l0aG91dCByZXNpemluZy4NCisgICAgLy8gV2UgY2FuIG9ubHkgcmVzaXplIHRhYmxlIGJ5IGZhY3RvciBvZiB0d28gYXQgYSB0aW1lLg0KKyAgICAvLyBJdCBpcyBmYXN0ZXIgdG8gcmVoYXNoIHdpdGggZmV3ZXIgZWxlbWVudHMsIHNvIGRvIGl0IG5vdy4NCisgICAgd2hpbGUgKG4gPj0gdGhyZXNob2xkKQ0KKyAgICAgIHJlaGFzaCgpOw0KKw0KKyAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gdC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsNCisgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7DQorICAgICAgT2JqZWN0IGtleSA9IGVudHJ5LmdldEtleSgpOw0KKyAgICAgIE9iamVjdCB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7DQorICAgICAgcHV0KGtleSwgdmFsdWUpOw0KKyAgICB9DQorICB9DQorDQorDQorICAvKioNCisgICAqIFJlbW92ZXMgYWxsIG1hcHBpbmdzIGZyb20gdGhpcyBtYXAuDQorICAgKi8NCisgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjbGVhcigpIHsNCisgICAgRW50cnkgdGFiW10gPSB0YWJsZTsNCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YWIubGVuZ3RoIDsgKytpKSB7IA0KKw0KKyAgICAgIC8vIG11c3QgaW52YWxpZGF0ZSBhbGwgdG8gZm9yY2UgY29uY3VycmVudCBnZXQncyB0byB3YWl0IGFuZCB0aGVuIHJldHJ5DQorICAgICAgZm9yIChFbnRyeSBlID0gdGFiW2ldOyBlICE9IG51bGw7IGUgPSBlLm5leHQpIA0KKyAgICAgICAgZS52YWx1ZSA9IG51bGw7IA0KKw0KKyAgICAgIHRhYltpXSA9IG51bGw7DQorICAgIH0NCisgICAgY291bnQgPSAwOw0KKyAgICByZWNvcmRNb2RpZmljYXRpb24odGFiKTsNCisgIH0NCisNCisgIC8qKg0KKyAgICogUmV0dXJucyBhIHNoYWxsb3cgY29weSBvZiB0aGlzIA0KKyAgICogPHR0PkNvbmN1cnJlbnRSZWFkZXJIYXNoTWFwPC90dD4gaW5zdGFuY2U6IHRoZSBrZXlzIGFuZA0KKyAgICogdmFsdWVzIHRoZW1zZWx2ZXMgYXJlIG5vdCBjbG9uZWQuDQorICAgKg0KKyAgICogQHJldHVybiBhIHNoYWxsb3cgY29weSBvZiB0aGlzIG1hcC4NCisgICAqLw0KKyAgcHVibGljIHN5bmNocm9uaXplZCBPYmplY3QgY2xvbmUoKSB7DQorICAgIHRyeSB7IA0KKyAgICAgIENvbmN1cnJlbnRSZWFkZXJIYXNoTWFwIHQgPSAoQ29uY3VycmVudFJlYWRlckhhc2hNYXApc3VwZXIuY2xvbmUoKTsNCisNCisgICAgICB0LmtleVNldCA9IG51bGw7DQorICAgICAgdC5lbnRyeVNldCA9IG51bGw7DQorICAgICAgdC52YWx1ZXMgPSBudWxsOw0KKw0KKyAgICAgIEVudHJ5W10gdGFiID0gdGFibGU7DQorICAgICAgdC50YWJsZSA9IG5ldyBFbnRyeVt0YWIubGVuZ3RoXTsNCisgICAgICBFbnRyeVtdIHR0YWIgPSB0LnRhYmxlOw0KKw0KKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFiLmxlbmd0aDsgKytpKSB7DQorICAgICAgICBFbnRyeSBmaXJzdCA9IG51bGw7DQorICAgICAgICBmb3IgKEVudHJ5IGUgPSB0YWJbaV07IGUgIT0gbnVsbDsgZSA9IGUubmV4dCkgDQorICAgICAgICAgIGZpcnN0ID0gbmV3IEVudHJ5KGUuaGFzaCwgZS5rZXksIGUudmFsdWUsIGZpcnN0KTsNCisgICAgICAgIHR0YWJbaV0gPSBmaXJzdDsNCisgICAgICB9DQorDQorICAgICAgcmV0dXJuIHQ7DQorICAgIH0gDQorICAgIGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7IA0KKyAgICAgIC8vIHRoaXMgc2hvdWxkbid0IGhhcHBlbiwgc2luY2Ugd2UgYXJlIENsb25lYWJsZQ0KKyAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7DQorICAgIH0NCisgIH0NCisNCisgIC8vIFZpZXdzDQorDQorICBwcm90ZWN0ZWQgdHJhbnNpZW50IFNldCBrZXlTZXQgPSBudWxsOw0KKyAgcHJvdGVjdGVkIHRyYW5zaWVudCBTZXQgZW50cnlTZXQgPSBudWxsOw0KKyAgcHJvdGVjdGVkIHRyYW5zaWVudCBDb2xsZWN0aW9uIHZhbHVlcyA9IG51bGw7DQorDQorICAvKioNCisgICAqIFJldHVybnMgYSBzZXQgdmlldyBvZiB0aGUga2V5cyBjb250YWluZWQgaW4gdGhpcyBtYXAuICBUaGUgc2V0IGlzDQorICAgKiBiYWNrZWQgYnkgdGhlIG1hcCwgc28gY2hhbmdlcyB0byB0aGUgbWFwIGFyZSByZWZsZWN0ZWQgaW4gdGhlIHNldCwgYW5kDQorICAgKiB2aWNlLXZlcnNhLiAgVGhlIHNldCBzdXBwb3J0cyBlbGVtZW50IHJlbW92YWwsIHdoaWNoIHJlbW92ZXMgdGhlDQorICAgKiBjb3JyZXNwb25kaW5nIG1hcHBpbmcgZnJvbSB0aGlzIG1hcCwgdmlhIHRoZSA8dHQ+SXRlcmF0b3IucmVtb3ZlPC90dD4sDQorICAgKiA8dHQ+U2V0LnJlbW92ZTwvdHQ+LCA8dHQ+cmVtb3ZlQWxsPC90dD4sIDx0dD5yZXRhaW5BbGw8L3R0PiwgYW5kDQorICAgKiA8dHQ+Y2xlYXI8L3R0PiBvcGVyYXRpb25zLiAgSXQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgPHR0PmFkZDwvdHQ+IG9yDQorICAgKiA8dHQ+YWRkQWxsPC90dD4gb3BlcmF0aW9ucy4NCisgICAqDQorICAgKiBAcmV0dXJuIGEgc2V0IHZpZXcgb2YgdGhlIGtleXMgY29udGFpbmVkIGluIHRoaXMgbWFwLg0KKyAgICovDQorICBwdWJsaWMgU2V0IGtleVNldCgpIHsNCisgICAgU2V0IGtzID0ga2V5U2V0Ow0KKyAgICByZXR1cm4gKGtzICE9IG51bGwpPyBrcyA6IChrZXlTZXQgPSBuZXcgS2V5U2V0KCkpOw0KKyAgfQ0KKyAgDQorICBwcml2YXRlIGNsYXNzIEtleVNldCBleHRlbmRzIEFic3RyYWN0U2V0IHsNCisgICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgew0KKyAgICAgIHJldHVybiBuZXcgS2V5SXRlcmF0b3IoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IHNpemUoKSB7DQorICAgICAgcmV0dXJuIENvbmN1cnJlbnRSZWFkZXJIYXNoTWFwLnRoaXMuc2l6ZSgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKSB7DQorICAgICAgcmV0dXJuIENvbmN1cnJlbnRSZWFkZXJIYXNoTWFwLnRoaXMuY29udGFpbnNLZXkobyk7DQorICAgIH0NCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvKSB7DQorICAgICAgcmV0dXJuIENvbmN1cnJlbnRSZWFkZXJIYXNoTWFwLnRoaXMucmVtb3ZlKG8pICE9IG51bGw7DQorICAgIH0NCisgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7DQorICAgICAgQ29uY3VycmVudFJlYWRlckhhc2hNYXAudGhpcy5jbGVhcigpOw0KKyAgICB9DQorICAgIHB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgew0KKyAgICAgIENvbGxlY3Rpb24gYyA9IG5ldyBBcnJheUxpc3QoKTsNCisgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBpdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQ0KKyAgICAgICAgICBjLmFkZChpLm5leHQoKSk7DQorICAgICAgcmV0dXJuIGMudG9BcnJheSgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBPYmplY3RbXSB0b0FycmF5KE9iamVjdFtdIGEpIHsNCisgICAgICBDb2xsZWN0aW9uIGMgPSBuZXcgQXJyYXlMaXN0KCk7DQorICAgICAgZm9yIChJdGVyYXRvciBpID0gaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkNCisgICAgICAgICAgYy5hZGQoaS5uZXh0KCkpOw0KKyAgICAgIHJldHVybiBjLnRvQXJyYXkoYSk7DQorICAgIH0NCisgIH0NCisNCisgIC8qKg0KKyAgICogUmV0dXJucyBhIGNvbGxlY3Rpb24gdmlldyBvZiB0aGUgdmFsdWVzIGNvbnRhaW5lZCBpbiB0aGlzIG1hcC4gIFRoZQ0KKyAgICogY29sbGVjdGlvbiBpcyBiYWNrZWQgYnkgdGhlIG1hcCwgc28gY2hhbmdlcyB0byB0aGUgbWFwIGFyZSByZWZsZWN0ZWQgaW4NCisgICAqIHRoZSBjb2xsZWN0aW9uLCBhbmQgdmljZS12ZXJzYS4gIFRoZSBjb2xsZWN0aW9uIHN1cHBvcnRzIGVsZW1lbnQNCisgICAqIHJlbW92YWwsIHdoaWNoIHJlbW92ZXMgdGhlIGNvcnJlc3BvbmRpbmcgbWFwcGluZyBmcm9tIHRoaXMgbWFwLCB2aWEgdGhlDQorICAgKiA8dHQ+SXRlcmF0b3IucmVtb3ZlPC90dD4sIDx0dD5Db2xsZWN0aW9uLnJlbW92ZTwvdHQ+LA0KKyAgICogPHR0PnJlbW92ZUFsbDwvdHQ+LCA8dHQ+cmV0YWluQWxsPC90dD4sIGFuZCA8dHQ+Y2xlYXI8L3R0PiBvcGVyYXRpb25zLg0KKyAgICogSXQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgPHR0PmFkZDwvdHQ+IG9yIDx0dD5hZGRBbGw8L3R0PiBvcGVyYXRpb25zLg0KKyAgICoNCisgICAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIHZpZXcgb2YgdGhlIHZhbHVlcyBjb250YWluZWQgaW4gdGhpcyBtYXAuDQorICAgKi8NCisgIHB1YmxpYyBDb2xsZWN0aW9uIHZhbHVlcygpIHsNCisgICAgQ29sbGVjdGlvbiB2cyA9IHZhbHVlczsNCisgICAgcmV0dXJuICh2cyAhPSBudWxsKT8gdnMgOiAodmFsdWVzID0gbmV3IFZhbHVlcygpKTsNCisgIH0NCisgIA0KKyAgcHJpdmF0ZSBjbGFzcyBWYWx1ZXMgZXh0ZW5kcyBBYnN0cmFjdENvbGxlY3Rpb24gew0KKyAgICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7DQorICAgICAgcmV0dXJuIG5ldyBWYWx1ZUl0ZXJhdG9yKCk7DQorICAgIH0NCisgICAgcHVibGljIGludCBzaXplKCkgew0KKyAgICAgIHJldHVybiBDb25jdXJyZW50UmVhZGVySGFzaE1hcC50aGlzLnNpemUoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3Qgbykgew0KKyAgICAgIHJldHVybiBDb25jdXJyZW50UmVhZGVySGFzaE1hcC50aGlzLmNvbnRhaW5zVmFsdWUobyk7DQorICAgIH0NCisgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7DQorICAgICAgQ29uY3VycmVudFJlYWRlckhhc2hNYXAudGhpcy5jbGVhcigpOw0KKyAgICB9DQorICAgIHB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgew0KKyAgICAgIENvbGxlY3Rpb24gYyA9IG5ldyBBcnJheUxpc3QoKTsNCisgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBpdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQ0KKyAgICAgICAgICBjLmFkZChpLm5leHQoKSk7DQorICAgICAgcmV0dXJuIGMudG9BcnJheSgpOw0KKyAgICB9DQorICAgIHB1YmxpYyBPYmplY3RbXSB0b0FycmF5KE9iamVjdFtdIGEpIHsNCisgICAgICBDb2xsZWN0aW9uIGMgPSBuZXcgQXJyYXlMaXN0KCk7DQorICAgICAgZm9yIChJdGVyYXRvciBpID0gaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkNCisgICAgICAgICAgYy5hZGQoaS5uZXh0KCkpOw0KKyAgICAgIHJldHVybiBjLnRvQXJyYXkoYSk7DQorICAgIH0NCisgIH0NCisNCisgIC8qKg0KKyAgICogUmV0dXJucyBhIGNvbGxlY3Rpb24gdmlldyBvZiB0aGUgbWFwcGluZ3MgY29udGFpbmVkIGluIHRoaXMgbWFwLiAgRWFjaA0KKyAgICogZWxlbWVudCBpbiB0aGUgcmV0dXJuZWQgY29sbGVjdGlvbiBpcyBhIDx0dD5NYXAuRW50cnk8L3R0Pi4gIFRoZQ0KKyAgICogY29sbGVjdGlvbiBpcyBiYWNrZWQgYnkgdGhlIG1hcCwgc28gY2hhbmdlcyB0byB0aGUgbWFwIGFyZSByZWZsZWN0ZWQgaW4NCisgICAqIHRoZSBjb2xsZWN0aW9uLCBhbmQgdmljZS12ZXJzYS4gIFRoZSBjb2xsZWN0aW9uIHN1cHBvcnRzIGVsZW1lbnQNCisgICAqIHJlbW92YWwsIHdoaWNoIHJlbW92ZXMgdGhlIGNvcnJlc3BvbmRpbmcgbWFwcGluZyBmcm9tIHRoZSBtYXAsIHZpYSB0aGUNCisgICAqIDx0dD5JdGVyYXRvci5yZW1vdmU8L3R0PiwgPHR0PkNvbGxlY3Rpb24ucmVtb3ZlPC90dD4sDQorICAgKiA8dHQ+cmVtb3ZlQWxsPC90dD4sIDx0dD5yZXRhaW5BbGw8L3R0PiwgYW5kIDx0dD5jbGVhcjwvdHQ+IG9wZXJhdGlvbnMuDQorICAgKiBJdCBkb2VzIG5vdCBzdXBwb3J0IHRoZSA8dHQ+YWRkPC90dD4gb3IgPHR0PmFkZEFsbDwvdHQ+IG9wZXJhdGlvbnMuDQorICAgKg0KKyAgICogQHJldHVybiBhIGNvbGxlY3Rpb24gdmlldyBvZiB0aGUgbWFwcGluZ3MgY29udGFpbmVkIGluIHRoaXMgbWFwLg0KKyAgICovDQorICBwdWJsaWMgU2V0IGVudHJ5U2V0KCkgew0KKyAgICBTZXQgZXMgPSBlbnRyeVNldDsNCisgICAgcmV0dXJuIChlcyAhPSBudWxsKSA/IGVzIDogKGVudHJ5U2V0ID0gbmV3IEVudHJ5U2V0KCkpOw0KKyAgfQ0KKw0KKyAgcHJpdmF0ZSBjbGFzcyBFbnRyeVNldCBleHRlbmRzIEFic3RyYWN0U2V0IHsNCisgICAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgew0KKyAgICAgIHJldHVybiBuZXcgSGFzaEl0ZXJhdG9yKCk7DQorICAgIH0NCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG8pIHsNCisgICAgICBpZiAoIShvIGluc3RhbmNlb2YgTWFwLkVudHJ5KSkNCisgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KW87DQorICAgICAgT2JqZWN0IHYgPSBDb25jdXJyZW50UmVhZGVySGFzaE1hcC50aGlzLmdldChlbnRyeS5nZXRLZXkoKSk7DQorICAgICAgcmV0dXJuIHYgIT0gbnVsbCAmJiB2LmVxdWFscyhlbnRyeS5nZXRWYWx1ZSgpKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pIHsNCisgICAgICBpZiAoIShvIGluc3RhbmNlb2YgTWFwLkVudHJ5KSkNCisgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICByZXR1cm4gQ29uY3VycmVudFJlYWRlckhhc2hNYXAudGhpcy5maW5kQW5kUmVtb3ZlRW50cnkoKE1hcC5FbnRyeSlvKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgaW50IHNpemUoKSB7DQorICAgICAgcmV0dXJuIENvbmN1cnJlbnRSZWFkZXJIYXNoTWFwLnRoaXMuc2l6ZSgpOw0KKyAgICB9DQorICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgew0KKyAgICAgIENvbmN1cnJlbnRSZWFkZXJIYXNoTWFwLnRoaXMuY2xlYXIoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsNCisgICAgICBDb2xsZWN0aW9uIGMgPSBuZXcgQXJyYXlMaXN0KCk7DQorICAgICAgZm9yIChJdGVyYXRvciBpID0gaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkNCisgICAgICAgICAgYy5hZGQoaS5uZXh0KCkpOw0KKyAgICAgIHJldHVybiBjLnRvQXJyYXkoKTsNCisgICAgfQ0KKyAgICBwdWJsaWMgT2JqZWN0W10gdG9BcnJheShPYmplY3RbXSBhKSB7DQorICAgICAgQ29sbGVjdGlvbiBjID0gbmV3IEFycmF5TGlzdCgpOw0KKyAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGl0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApDQorICAgICAgICAgIGMuYWRkKGkubmV4dCgpKTsNCisgICAgICByZXR1cm4gYy50b0FycmF5KGEpOw0KKyAgICB9DQorICB9DQorDQorICAvKioNCisgICAqIEhlbHBlciBtZXRob2QgZm9yIGVudHJ5U2V0LnJlbW92ZQ0KKyAgICoqLw0KKyAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCBib29sZWFuIGZpbmRBbmRSZW1vdmVFbnRyeShNYXAuRW50cnkgZW50cnkpIHsNCisgICAgT2JqZWN0IGtleSA9IGVudHJ5LmdldEtleSgpOw0KKyAgICBPYmplY3QgdiA9IGdldChrZXkpOw0KKyAgICBpZiAodiAhPSBudWxsICYmIHYuZXF1YWxzKGVudHJ5LmdldFZhbHVlKCkpKSB7DQorICAgICAgcmVtb3ZlKGtleSk7DQorICAgICAgcmV0dXJuIHRydWU7DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgIH0NCisNCisgIC8qKg0KKyAgICogUmV0dXJucyBhbiBlbnVtZXJhdGlvbiBvZiB0aGUga2V5cyBpbiB0aGlzIHRhYmxlLg0KKyAgICoNCisgICAqIEByZXR1cm4gIGFuIGVudW1lcmF0aW9uIG9mIHRoZSBrZXlzIGluIHRoaXMgdGFibGUuDQorICAgKiBAc2VlICAgICBFbnVtZXJhdGlvbg0KKyAgICogQHNlZSAgICAgI2VsZW1lbnRzKCkNCisgICAqIEBzZWUgICAja2V5U2V0KCkNCisgICAqIEBzZWUgICBNYXANCisgICAqLw0KKyAgcHVibGljIEVudW1lcmF0aW9uIGtleXMoKSB7DQorICAgIHJldHVybiBuZXcgS2V5SXRlcmF0b3IoKTsNCisgIH0NCisNCisgIC8qKg0KKyAgICogUmV0dXJucyBhbiBlbnVtZXJhdGlvbiBvZiB0aGUgdmFsdWVzIGluIHRoaXMgdGFibGUuDQorICAgKiBVc2UgdGhlIEVudW1lcmF0aW9uIG1ldGhvZHMgb24gdGhlIHJldHVybmVkIG9iamVjdCB0byBmZXRjaCB0aGUgZWxlbWVudHMNCisgICAqIHNlcXVlbnRpYWxseS4NCisgICAqDQorICAgKiBAcmV0dXJuICBhbiBlbnVtZXJhdGlvbiBvZiB0aGUgdmFsdWVzIGluIHRoaXMgdGFibGUuDQorICAgKiBAc2VlICAgICBqYXZhLnV0aWwuRW51bWVyYXRpb24NCisgICAqIEBzZWUgICAgICNrZXlzKCkNCisgICAqIEBzZWUgICAjdmFsdWVzKCkNCisgICAqIEBzZWUgICBNYXANCisgICAqLw0KKyAgcHVibGljIEVudW1lcmF0aW9uIGVsZW1lbnRzKCkgew0KKyAgICByZXR1cm4gbmV3IFZhbHVlSXRlcmF0b3IoKTsNCisgIH0NCisNCisNCisgIC8qKg0KKyAgICogQ29uY3VycmVudFJlYWRlckhhc2hNYXAgY29sbGlzaW9uIGxpc3QgZW50cnkuDQorICAgKi8NCisgIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgRW50cnkgaW1wbGVtZW50cyBNYXAuRW50cnkgew0KKw0KKyAgICAvKiANCisgICAgICAgVGhlIHVzZSBvZiB2b2xhdGlsZSBmb3IgdmFsdWUgZmllbGQgZW5zdXJlcyB0aGF0DQorICAgICAgIHdlIGNhbiBkZXRlY3Qgc3RhdHVzIGNoYW5nZXMgd2l0aG91dCBzeW5jaHJvbml6YXRpb24uDQorICAgICAgIFRoZSBvdGhlciBmaWVsZHMgYXJlIG5ldmVyIGNoYW5nZWQsIGFuZCBhcmUNCisgICAgICAgbWFya2VkIGFzIGZpbmFsLiANCisgICAgKi8NCisgICAgcHJvdGVjdGVkIGZpbmFsIGludCBoYXNoOw0KKyAgICBwcm90ZWN0ZWQgZmluYWwgT2JqZWN0IGtleTsNCisgICAgcHJvdGVjdGVkIGZpbmFsIEVudHJ5IG5leHQ7DQorICAgIHByb3RlY3RlZCB2b2xhdGlsZSBPYmplY3QgdmFsdWU7DQorDQorICAgIEVudHJ5KGludCBoYXNoLCBPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUsIEVudHJ5IG5leHQpIHsNCisgICAgICB0aGlzLmhhc2ggPSBoYXNoOw0KKyAgICAgIHRoaXMua2V5ID0ga2V5Ow0KKyAgICAgIHRoaXMubmV4dCA9IG5leHQ7DQorICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOw0KKyAgICB9DQorDQorICAgIC8vIE1hcC5FbnRyeSBPcHMgDQorDQorICAgIHB1YmxpYyBPYmplY3QgZ2V0S2V5KCkgew0KKyAgICAgIHJldHVybiBrZXk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEdldCB0aGUgdmFsdWUuICBOb3RlOiBJbiBhbiBlbnRyeVNldCBvciBlbnRyeVNldC5pdGVyYXRvciwNCisgICAgICogdW5sZXNzIHRoZSBzZXQgb3IgaXRlcmF0b3IgaXMgdXNlZCB1bmRlciBzeW5jaHJvbml6YXRpb24gb2YgdGhlDQorICAgICAqIHRhYmxlIGFzIGEgd2hvbGUgKG9yIHlvdSBjYW4gb3RoZXJ3aXNlIGd1YXJhbnRlZSBsYWNrIG9mDQorICAgICAqIGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uKSwgPHR0PmdldFZhbHVlPC90dD4gPGVtPm1pZ2h0PC9lbT4NCisgICAgICogcmV0dXJuIG51bGwsIHJlZmxlY3RpbmcgdGhlIGZhY3QgdGhhdCB0aGUgZW50cnkgaGFzIGJlZW4NCisgICAgICogY29uY3VycmVudGx5IHJlbW92ZWQuIEhvd2V2ZXIsIHRoZXJlIGFyZSBubyBhc3N1cmFuY2VzIHRoYXQNCisgICAgICogY29uY3VycmVudCByZW1vdmFscyB3aWxsIGJlIHJlZmxlY3RlZCB1c2luZyB0aGlzIG1ldGhvZC4NCisgICAgICogDQorICAgICAqIEByZXR1cm4gICAgIHRoZSBjdXJyZW50IHZhbHVlLCBvciBudWxsIGlmIHRoZSBlbnRyeSBoYXMgYmVlbiANCisgICAgICogZGV0ZWN0YWJseSByZW1vdmVkLg0KKyAgICAgKiovDQorICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7DQorICAgICAgcmV0dXJuIHZhbHVlOyANCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogU2V0IHRoZSB2YWx1ZSBvZiB0aGlzIGVudHJ5LiAgTm90ZTogSW4gYW4gZW50cnlTZXQgb3INCisgICAgICogZW50cnlTZXQuaXRlcmF0b3IpLCB1bmxlc3MgdGhlIHNldCBvciBpdGVyYXRvciBpcyB1c2VkIHVuZGVyDQorICAgICAqIHN5bmNocm9uaXphdGlvbiBvZiB0aGUgdGFibGUgYXMgYSB3aG9sZSAob3IgeW91IGNhbiBvdGhlcndpc2UNCisgICAgICogZ3VhcmFudGVlIGxhY2sgb2YgY29uY3VycmVudCBtb2RpZmljYXRpb24pLCA8dHQ+c2V0VmFsdWU8L3R0Pg0KKyAgICAgKiBpcyBub3Qgc3RyaWN0bHkgZ3VhcmFudGVlZCB0byBhY3R1YWxseSByZXBsYWNlIHRoZSB2YWx1ZSBmaWVsZA0KKyAgICAgKiBvYnRhaW5lZCB2aWEgdGhlIDx0dD5nZXQ8L3R0PiBvcGVyYXRpb24gb2YgdGhlIHVuZGVybHlpbmcgaGFzaA0KKyAgICAgKiB0YWJsZSBpbiBtdWx0aXRocmVhZGVkIGFwcGxpY2F0aW9ucy4gIElmIGl0ZXJhdG9yLXdpZGUNCisgICAgICogc3luY2hyb25pemF0aW9uIGlzIG5vdCB1c2VkLCBhbmQgYW55IG90aGVyIGNvbmN1cnJlbnQNCisgICAgICogPHR0PnB1dDwvdHQ+IG9yIDx0dD5yZW1vdmU8L3R0PiBvcGVyYXRpb25zIG9jY3VyLCBzb21ldGltZXMNCisgICAgICogZXZlbiB0byA8ZW0+b3RoZXI8L2VtPiBlbnRyaWVzLCB0aGVuIHRoaXMgY2hhbmdlIGlzIG5vdA0KKyAgICAgKiBndWFyYW50ZWVkIHRvIGJlIHJlZmxlY3RlZCBpbiB0aGUgaGFzaCB0YWJsZS4gKEl0IG1pZ2h0LCBvciBpdA0KKyAgICAgKiBtaWdodCBub3QuIFRoZXJlIGFyZSBubyBhc3N1cmFuY2VzIGVpdGhlciB3YXkuKQ0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gICAgICB2YWx1ZSAgIHRoZSBuZXcgdmFsdWUuDQorICAgICAqIEByZXR1cm4gICAgIHRoZSBwcmV2aW91cyB2YWx1ZSwgb3IgbnVsbCBpZiBlbnRyeSBoYXMgYmVlbiBkZXRlY3RhYmx5DQorICAgICAqIHJlbW92ZWQuDQorICAgICAqIEBleGNlcHRpb24gIE51bGxQb2ludGVyRXhjZXB0aW9uICBpZiB0aGUgdmFsdWUgaXMgPGNvZGU+bnVsbDwvY29kZT4uDQorICAgICAqIA0KKyAgICAgKiovDQorICAgIHB1YmxpYyBPYmplY3Qgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7DQorICAgICAgaWYgKHZhbHVlID09IG51bGwpDQorICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsNCisgICAgICBPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLnZhbHVlOw0KKyAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsNCisgICAgICByZXR1cm4gb2xkVmFsdWU7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7DQorICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIE1hcC5FbnRyeSkpDQorICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgTWFwLkVudHJ5IGUgPSAoTWFwLkVudHJ5KW87DQorICAgICAgcmV0dXJuIChrZXkuZXF1YWxzKGUuZ2V0S2V5KCkpICYmIHZhbHVlLmVxdWFscyhlLmdldFZhbHVlKCkpKTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsNCisgICAgICByZXR1cm4gIGtleS5oYXNoQ29kZSgpIF4gdmFsdWUuaGFzaENvZGUoKTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCisgICAgICByZXR1cm4ga2V5ICsgIj0iICsgdmFsdWU7DQorICAgIH0NCisNCisgIH0NCisNCisgIHByb3RlY3RlZCBjbGFzcyBIYXNoSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvciwgRW51bWVyYXRpb24gew0KKyAgICBwcm90ZWN0ZWQgZmluYWwgRW50cnlbXSB0YWI7ICAgICAgICAgICAvLyBzbmFwc2hvdCBvZiB0YWJsZQ0KKyAgICBwcm90ZWN0ZWQgaW50IGluZGV4OyAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IHNsb3QgDQorICAgIHByb3RlY3RlZCBFbnRyeSBlbnRyeSA9IG51bGw7ICAgICAgICAgIC8vIGN1cnJlbnQgbm9kZSBvZiBzbG90DQorICAgIHByb3RlY3RlZCBPYmplY3QgY3VycmVudEtleTsgICAgICAgICAgIC8vIGtleSBmb3IgY3VycmVudCBub2RlDQorICAgIHByb3RlY3RlZCBPYmplY3QgY3VycmVudFZhbHVlOyAgICAgICAgIC8vIHZhbHVlIGZvciBjdXJyZW50IG5vZGUNCisgICAgcHJvdGVjdGVkIEVudHJ5IGxhc3RSZXR1cm5lZCA9IG51bGw7ICAgLy8gbGFzdCBub2RlIHJldHVybmVkIGJ5IG5leHQNCisNCisgICAgcHJvdGVjdGVkIEhhc2hJdGVyYXRvcigpIHsNCisgICAgICB0YWIgPSBDb25jdXJyZW50UmVhZGVySGFzaE1hcC50aGlzLmdldFRhYmxlRm9yUmVhZGluZygpOw0KKyAgICAgIGluZGV4ID0gdGFiLmxlbmd0aCAtIDE7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gaGFzTW9yZUVsZW1lbnRzKCkgeyByZXR1cm4gaGFzTmV4dCgpOyB9DQorICAgIHB1YmxpYyBPYmplY3QgbmV4dEVsZW1lbnQoKSB7IHJldHVybiBuZXh0KCk7IH0NCisNCisNCisgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsNCisNCisgICAgICAvKg0KKyAgICAgICAgY3VycmVudGtleSBhbmQgY3VycmVudFZhbHVlIGFyZSBzZXQgaGVyZSB0byBlbnN1cmUgdGhhdCBuZXh0KCkNCisgICAgICAgIHJldHVybnMgbm9ybWFsbHkgaWYgaGFzTmV4dCgpIHJldHVybnMgdHJ1ZS4gVGhpcyBhdm9pZHMNCisgICAgICAgIHN1cnByaXNlcyBlc3BlY2lhbGx5IHdoZW4gZmluYWwgZWxlbWVudCBpcyByZW1vdmVkIGR1cmluZw0KKyAgICAgICAgdHJhdmVyc2FsIC0tIGluc3RlYWQsIHdlIGp1c3QgaWdub3JlIHRoZSByZW1vdmFsIGR1cmluZw0KKyAgICAgICAgY3VycmVudCB0cmF2ZXJzYWwuICANCisgICAgICAqLw0KKw0KKyAgICAgIGZvciAoOzspIHsNCisgICAgICAgIGlmIChlbnRyeSAhPSBudWxsKSB7DQorICAgICAgICAgIE9iamVjdCB2ID0gZW50cnkudmFsdWU7DQorICAgICAgICAgIGlmICh2ICE9IG51bGwpIHsNCisgICAgICAgICAgICBjdXJyZW50S2V5ID0gZW50cnkua2V5Ow0KKyAgICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IHY7DQorICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIGVudHJ5ID0gZW50cnkubmV4dDsNCisgICAgICAgIH0NCisNCisgICAgICAgIHdoaWxlIChlbnRyeSA9PSBudWxsICYmIGluZGV4ID49IDApDQorICAgICAgICAgIGVudHJ5ID0gdGFiW2luZGV4LS1dOw0KKw0KKyAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpIHsNCisgICAgICAgICAgY3VycmVudEtleSA9IGN1cnJlbnRWYWx1ZSA9IG51bGw7DQorICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisNCisgICAgcHJvdGVjdGVkIE9iamVjdCByZXR1cm5WYWx1ZU9mTmV4dCgpIHsgcmV0dXJuIGVudHJ5OyB9DQorDQorICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsNCisgICAgICBpZiAoY3VycmVudEtleSA9PSBudWxsICYmICFoYXNOZXh0KCkpDQorICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOw0KKw0KKyAgICAgIE9iamVjdCByZXN1bHQgPSByZXR1cm5WYWx1ZU9mTmV4dCgpOw0KKyAgICAgIGxhc3RSZXR1cm5lZCA9IGVudHJ5Ow0KKyAgICAgIGN1cnJlbnRLZXkgPSBjdXJyZW50VmFsdWUgPSBudWxsOw0KKyAgICAgIGVudHJ5ID0gZW50cnkubmV4dDsNCisgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsNCisgICAgICBpZiAobGFzdFJldHVybmVkID09IG51bGwpDQorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7DQorICAgICAgQ29uY3VycmVudFJlYWRlckhhc2hNYXAudGhpcy5yZW1vdmUobGFzdFJldHVybmVkLmtleSk7DQorICAgICAgbGFzdFJldHVybmVkID0gbnVsbDsNCisgICAgfQ0KKw0KKyAgfQ0KKw0KKw0KKyAgcHJvdGVjdGVkIGNsYXNzIEtleUl0ZXJhdG9yIGV4dGVuZHMgSGFzaEl0ZXJhdG9yIHsNCisgICAgcHJvdGVjdGVkIE9iamVjdCByZXR1cm5WYWx1ZU9mTmV4dCgpIHsgcmV0dXJuIGN1cnJlbnRLZXk7IH0NCisgIH0NCisgIA0KKyAgcHJvdGVjdGVkIGNsYXNzIFZhbHVlSXRlcmF0b3IgZXh0ZW5kcyBIYXNoSXRlcmF0b3Igew0KKyAgICBwcm90ZWN0ZWQgT2JqZWN0IHJldHVyblZhbHVlT2ZOZXh0KCkgeyByZXR1cm4gY3VycmVudFZhbHVlOyB9DQorICB9DQorICANCisNCisNCisgIC8qKg0KKyAgICogU2F2ZSB0aGUgc3RhdGUgb2YgdGhlIDx0dD5Db25jdXJyZW50UmVhZGVySGFzaE1hcDwvdHQ+IA0KKyAgICogaW5zdGFuY2UgdG8gYSBzdHJlYW0gKGkuZS4sDQorICAgKiBzZXJpYWxpemUgaXQpLg0KKyAgICoNCisgICAqIEBzZXJpYWxEYXRhIFRoZSA8aT5jYXBhY2l0eTwvaT4gb2YgdGhlIA0KKyAgICogQ29uY3VycmVudFJlYWRlckhhc2hNYXAgKHRoZSBsZW5ndGggb2YgdGhlDQorICAgKiBidWNrZXQgYXJyYXkpIGlzIGVtaXR0ZWQgKGludCksIGZvbGxvd2VkICBieSB0aGUNCisgICAqIDxpPnNpemU8L2k+IG9mIHRoZSBDb25jdXJyZW50UmVhZGVySGFzaE1hcCAodGhlIG51bWJlciBvZiBrZXktdmFsdWUNCisgICAqIG1hcHBpbmdzKSwgZm9sbG93ZWQgYnkgdGhlIGtleSAoT2JqZWN0KSBhbmQgdmFsdWUgKE9iamVjdCkNCisgICAqIGZvciBlYWNoIGtleS12YWx1ZSBtYXBwaW5nIHJlcHJlc2VudGVkIGJ5IHRoZSBDb25jdXJyZW50UmVhZGVySGFzaE1hcA0KKyAgICogVGhlIGtleS12YWx1ZSBtYXBwaW5ncyBhcmUgZW1pdHRlZCBpbiBubyBwYXJ0aWN1bGFyIG9yZGVyLg0KKyAgICovDQorICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHdyaXRlT2JqZWN0KGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIHMpDQorICAgIHRocm93cyBJT0V4Y2VwdGlvbiAgew0KKyAgICAvLyBXcml0ZSBvdXQgdGhlIHRocmVzaG9sZCwgbG9hZGZhY3RvciwgYW5kIGFueSBoaWRkZW4gc3R1ZmYNCisgICAgcy5kZWZhdWx0V3JpdGVPYmplY3QoKTsNCisgICAgDQorICAgIC8vIFdyaXRlIG91dCBudW1iZXIgb2YgYnVja2V0cw0KKyAgICBzLndyaXRlSW50KHRhYmxlLmxlbmd0aCk7DQorICAgIA0KKyAgICAvLyBXcml0ZSBvdXQgc2l6ZSAobnVtYmVyIG9mIE1hcHBpbmdzKQ0KKyAgICBzLndyaXRlSW50KGNvdW50KTsNCisgICAgDQorICAgIC8vIFdyaXRlIG91dCBrZXlzIGFuZCB2YWx1ZXMgKGFsdGVybmF0aW5nKQ0KKyAgICBmb3IgKGludCBpbmRleCA9IHRhYmxlLmxlbmd0aC0xOyBpbmRleCA+PSAwOyBpbmRleC0tKSB7DQorICAgICAgRW50cnkgZW50cnkgPSB0YWJsZVtpbmRleF07DQorICAgICAgDQorICAgICAgd2hpbGUgKGVudHJ5ICE9IG51bGwpIHsNCisgICAgICAgIHMud3JpdGVPYmplY3QoZW50cnkua2V5KTsNCisgICAgICAgIHMud3JpdGVPYmplY3QoZW50cnkudmFsdWUpOw0KKyAgICAgICAgZW50cnkgPSBlbnRyeS5uZXh0Ow0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKw0KKyAgLyoqDQorICAgKiBSZWNvbnN0aXR1dGUgdGhlIDx0dD5Db25jdXJyZW50UmVhZGVySGFzaE1hcDwvdHQ+IA0KKyAgICogaW5zdGFuY2UgZnJvbSBhIHN0cmVhbSAoaS5lLiwNCisgICAqIGRlc2VyaWFsaXplIGl0KS4NCisgICAqLw0KKyAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCByZWFkT2JqZWN0KGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0gcykNCisgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uICB7DQorICAgIC8vIFJlYWQgaW4gdGhlIHRocmVzaG9sZCwgbG9hZGZhY3RvciwgYW5kIGFueSBoaWRkZW4gc3R1ZmYNCisgICAgcy5kZWZhdWx0UmVhZE9iamVjdCgpOw0KKw0KKyAgICAvLyBSZWFkIGluIG51bWJlciBvZiBidWNrZXRzIGFuZCBhbGxvY2F0ZSB0aGUgYnVja2V0IGFycmF5Ow0KKyAgICBpbnQgbnVtQnVja2V0cyA9IHMucmVhZEludCgpOw0KKyAgICB0YWJsZSA9IG5ldyBFbnRyeVtudW1CdWNrZXRzXTsNCisgICAgDQorICAgIC8vIFJlYWQgaW4gc2l6ZSAobnVtYmVyIG9mIE1hcHBpbmdzKQ0KKyAgICBpbnQgc2l6ZSA9IHMucmVhZEludCgpOw0KKyAgICANCisgICAgLy8gUmVhZCB0aGUga2V5cyBhbmQgdmFsdWVzLCBhbmQgcHV0IHRoZSBtYXBwaW5ncyBpbiB0aGUgdGFibGUNCisgICAgZm9yIChpbnQgaT0wOyBpPHNpemU7IGkrKykgew0KKyAgICAgIE9iamVjdCBrZXkgPSBzLnJlYWRPYmplY3QoKTsNCisgICAgICBPYmplY3QgdmFsdWUgPSBzLnJlYWRPYmplY3QoKTsNCisgICAgICBwdXQoa2V5LCB2YWx1ZSk7DQorICAgIH0NCisgIH0NCisgIA0KKyAgLyoqIA0KKyAgICogUmV0dXJuIHRoZSBudW1iZXIgb2Ygc2xvdHMgaW4gdGhpcyB0YWJsZSANCisgICAqKi8NCisgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGNhcGFjaXR5KCkgew0KKyAgICByZXR1cm4gdGFibGUubGVuZ3RoOw0KKyAgfQ0KKw0KKyAgLyoqIA0KKyAgICogUmV0dXJuIHRoZSBsb2FkIGZhY3RvciANCisgICAqKi8NCisgIHB1YmxpYyBmbG9hdCBsb2FkRmFjdG9yKCkgew0KKyAgICByZXR1cm4gbG9hZEZhY3RvcjsNCisgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9tZXRhY2xhc3MvTWVtb3J5QXdhcmVDb25jdXJyZW50UmVhZE1hcC5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9tZXRhY2xhc3MvTWVtb3J5QXdhcmVDb25jdXJyZW50UmVhZE1hcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMTE3MTIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL21ldGFjbGFzcy9NZW1vcnlBd2FyZUNvbmN1cnJlbnRSZWFkTWFwLmphdmEKQEAgLTAsMCArMSw3NTIgQEAKKy8qDQorICBGaWxlOiBDb25jdXJyZW50UmVhZGVySGFzaE1hcA0KKw0KKyAgV3JpdHRlbiBieSBEb3VnIExlYS4gQWRhcHRlZCBhbmQgcmVsZWFzZWQsIHVuZGVyIGV4cGxpY2l0DQorICBwZXJtaXNzaW9uLCBmcm9tIEpESzEuMiBIYXNoTWFwLmphdmEgYW5kIEhhc2h0YWJsZS5qYXZhIHdoaWNoDQorICBjYXJyaWVzIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0Og0KKw0KKyAqIENvcHlyaWdodCAxOTk3IGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sDQorICogOTAxIFNhbiBBbnRvbmlvIFJvYWQsIFBhbG8gQWx0bywgQ2FsaWZvcm5pYSwgOTQzMDMsIFUuUy5BLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorICoNCisgKiBUaGlzIHNvZnR3YXJlIGlzIHRoZSBjb25maWRlbnRpYWwgYW5kIHByb3ByaWV0YXJ5IGluZm9ybWF0aW9uDQorICogb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAoIkNvbmZpZGVudGlhbCBJbmZvcm1hdGlvbiIpLiAgWW91DQorICogc2hhbGwgbm90IGRpc2Nsb3NlIHN1Y2ggQ29uZmlkZW50aWFsIEluZm9ybWF0aW9uIGFuZCBzaGFsbCB1c2UNCisgKiBpdCBvbmx5IGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgdGVybXMgb2YgdGhlIGxpY2Vuc2UgYWdyZWVtZW50DQorICogeW91IGVudGVyZWQgaW50byB3aXRoIFN1bi4NCisNCisgIEhpc3Rvcnk6DQorICBEYXRlICAgICAgIFdobyAgICAgICAgICAgICAgICBXaGF0DQorICAyOG9jdDE5OTkgIGRsICAgICAgICAgICAgICAgQ3JlYXRlZA0KKyAgMTRkZWMxOTk5ICBkbCAgICAgICAgICAgICAgIGptbSBzbmFwc2hvdA0KKyAgMTlhcHIyMDAwICBkbCAgICAgICAgICAgICAgIHVzZSBiYXJyaWVyTG9jaw0KKyAgMTJqYW4yMDAxICBkbCAgICAgICAgICAgICAgIHB1YmxpYyByZWxlYXNlDQorICAxN25vdjIwMDEgIGRsICAgICAgICAgICAgICAgTWlub3IgdHVuaW5ncw0KKyAgMjBtYXkyMDAyICBkbCAgICAgICAgICAgICAgIEJhcnJpZXJMb2NrIGNhbiBub3cgYmUgc2VyaWFsaXplZC4NCisgIDA5ZGVjMjAwMiAgZGwgICAgICAgICAgICAgICBGaXggaW50ZXJmZXJlbmNlIGNoZWNrcy4NCisgIDIzanVuMjAwNCAgZGwgICAgICAgICAgICAgICBBdm9pZCBiYWQgYXJyYXkgc2l6aW5ncyBpbiB2aWV3IHRvQXJyYXkgbWV0aG9kcw0KKyAgMDJqdWwyMDA3ICBibGFja2RyYWcgICAgICAgIGFkYXB0aW9uIG9mIHBhY2thZ2UgbmFtZSB0byBHcm9vdnkgcHJvamVjdA0KKyAqLw0KKw0KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLm1ldGFjbGFzczsNCisNCisNCitpbXBvcnQgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2VRdWV1ZTsNCitpbXBvcnQgamF2YS5sYW5nLnJlZi5Tb2Z0UmVmZXJlbmNlOw0KKw0KKw0KKy8qKg0KKyAqIFRoaXMgTWFwIGlzIGFzdHJpcHBlZCBkb3duIHZlcnNpb24gb2YgQ29uY3VycmVudFJlYWRlckhhc2hNYXAgd2l0aA0KKyAqIHNtYWxsIG1vZGlmaWNhdGlvbnMgaGVyZSBhbmQgdGhlcmUuDQorICogSXQgaXMgbm8gZnVsbCBNYXAsIGl0IGRvZXMgaGF2ZSBwdXQvZ2V0L3JlbW92ZSwgYnV0IG5vIGl0ZXJhdG9ycy4NCisgKiBUaGlzIG1hcCBpcyBpbnRlbmRlZCB0byBob2xkIHZhbHVlcyBhbmQga2V5cyBhcyBTb2Z0UmVmZXJlbmNlLiBJZg0KKyAqIG9uZSBvZiB2YWx1ZSBvciBrZXkgYXJlIHJlbW92ZWQsIHNvIHdpbGwgYmUgY29tcGxldGUgZW50cnkuIFRoaXMgbWFwDQorICogd2lsbCBub3QgdXNlIHRoZSBlcXVhbHMgbWV0aG9kIHRvIGNvbXBhcmUga2V5cywgdGhpbmsgb2YgaXQgYXMgYQ0KKyAqIElkZW50aXR5SGFzaE1hcCB3aXRoIGZlYXR1cmVzIG9mIGNvbmN1cnJlbmN5IGFuZCBtZW1vcnkgYXdhcmUgY2FjaGluZy4NCisgKiBBcyAgQ29uY3VycmVudFJlYWRlckhhc2hNYXAgYWxzbyBkb2VzIHRoaXMgaW1wbGVtZW50YXRpb24gcHJlZmVyZSByZWFkDQorICogb3BlcmF0aW9ucyBhbmQgdHJpZXMgbm90IHRvIGxvY2sgaWYgcG9zc2libGUuIFNvZnRSZWZlcmVuY2VkIHZhbHVlcw0KKyAqIGFyZSBvbmx5IHJlbW92ZWQgZnJvbSB0aGUgbWFwIGlmIHRoZSBtYXAgZ29lcyBpbnRvIGEgc3luY2hyb25pemF0aW9uDQorICogYmxvY2sgb24gdGhpcy4gVGhpcyBtYXkgYWZmZWN0IHJlYWRzLCBidXQgb25seSBpbiByYXJlIGNhc2VzLg0KKyAqKi8NCitwdWJsaWMgY2xhc3MgTWVtb3J5QXdhcmVDb25jdXJyZW50UmVhZE1hcCB7DQorDQorDQorICAgIC8qDQorICAgIFRoZSBiYXNpYyBzdHJhdGVneSBpcyBhbiBvcHRpbWlzdGljLXN0eWxlIHNjaGVtZSBiYXNlZCBvbg0KKyAgICB0aGUgZ3VhcmFudGVlIHRoYXQgdGhlIGhhc2ggdGFibGUgYW5kIGl0cyBsaXN0cyBhcmUgYWx3YXlzDQorICAgIGtlcHQgaW4gYSBjb25zaXN0ZW50IGVub3VnaCBzdGF0ZSB0byBiZSByZWFkIHdpdGhvdXQgbG9ja2luZzoNCisNCisgICAgICogUmVhZCBvcGVyYXRpb25zIGZpcnN0IHByb2NlZWQgd2l0aG91dCBsb2NraW5nLCBieSB0cmF2ZXJzaW5nIHRoZQ0KKyAgICAgICBhcHBhcmVudGx5IGNvcnJlY3QgbGlzdCBvZiB0aGUgYXBwYXJlbnRseSBjb3JyZWN0IGJpbi4gSWYgYW4NCisgICAgICAgZW50cnkgaXMgZm91bmQsIGJ1dCBub3QgaW52YWxpZGF0ZWQgKHZhbHVlIGZpZWxkIG51bGwpLCBpdCBpcw0KKyAgICAgICByZXR1cm5lZC4gSWYgbm90IGZvdW5kLCBvcGVyYXRpb25zIG11c3QgcmVjaGVjayAoYWZ0ZXIgYSBtZW1vcnkNCisgICAgICAgYmFycmllcikgdG8gbWFrZSBzdXJlIHRoZXkgYXJlIHVzaW5nIGJvdGggdGhlIHJpZ2h0IGxpc3QgYW5kDQorICAgICAgIHRoZSByaWdodCB0YWJsZSAod2hpY2ggY2FuIGNoYW5nZSB1bmRlciByZXNpemVzKS4gSWYNCisgICAgICAgaW52YWxpZGF0ZWQsIHJlYWRzIG11c3QgYWNxdWlyZSBtYWluIHVwZGF0ZSBsb2NrIHRvIHdhaXQgb3V0DQorICAgICAgIHRoZSB1cGRhdGUsIGFuZCB0aGVuIHJlLXRyYXZlcnNlLg0KKw0KKyAgICAgKiBBbGwgbGlzdCBhZGRpdGlvbnMgYXJlIGF0IHRoZSBmcm9udCBvZiBlYWNoIGJpbiwgbWFraW5nIGl0IGVhc3kNCisgICAgICAgdG8gY2hlY2sgY2hhbmdlcywgYW5kIGFsc28gZmFzdCB0byB0cmF2ZXJzZS4gIEVudHJ5IG5leHQNCisgICAgICAgcG9pbnRlcnMgYXJlIG5ldmVyIGFzc2lnbmVkLiBSZW1vdmUoKSBidWlsZHMgbmV3IG5vZGVzIHdoZW4NCisgICAgICAgbmVjZXNzYXJ5IHRvIHByZXNlcnZlIHRoaXMuDQorDQorICAgICAqIFJlbW92ZSgpIChhbHNvIGNsZWFyKCkpIGludmFsaWRhdGVzIHJlbW92ZWQgbm9kZXMgdG8gYWxlcnQgcmVhZA0KKyAgICAgICBvcGVyYXRpb25zIHRoYXQgdGhleSBtdXN0IHdhaXQgb3V0IHRoZSBmdWxsIG1vZGlmaWNhdGlvbnMuDQorDQorICAgICAqLw0KKw0KKyAgICAvKiogQSBTZXJpYWxpemFibGUgY2xhc3MgZm9yIGJhcnJpZXIgbG9jayAqKi8NCisgICAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBCYXJyaWVyTG9jayBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsgfQ0KKw0KKyAgICAvKioNCisgICAgICogTG9jayB1c2VkIG9ubHkgZm9yIGl0cyBtZW1vcnkgZWZmZWN0cy4NCisgICAgICoqLw0KKyAgICBwcm90ZWN0ZWQgZmluYWwgQmFycmllckxvY2sgYmFycmllckxvY2sgPSBuZXcgQmFycmllckxvY2soKTsNCisNCisgICAgLyoqDQorICAgICAqIGZpZWxkIHdyaXR0ZW4gdG8gb25seSB0byBndWFyYW50ZWUgbG9jayBvcmRlcmluZy4NCisgICAgICoqLw0KKyAgICBwcm90ZWN0ZWQgdHJhbnNpZW50IE9iamVjdCBsYXN0V3JpdGU7DQorDQorICAgIC8qKg0KKyAgICAgKiBGb3JjZSBhIG1lbW9yeSBzeW5jaHJvbml6YXRpb24gdGhhdCB3aWxsIGNhdXNlDQorICAgICAqIGFsbCByZWFkZXJzIHRvIHNlZSB0YWJsZS4gQ2FsbCBvbmx5IHdoZW4gYWxyZWFkeQ0KKyAgICAgKiBob2xkaW5nIG1haW4gc3luY2ggbG9jay4NCisgICAgICoqLw0KKyAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCByZWNvcmRNb2RpZmljYXRpb24oT2JqZWN0IHgpIHsgDQorICAgICAgICBzeW5jaHJvbml6ZWQoYmFycmllckxvY2spIHsNCisgICAgICAgICAgICBsYXN0V3JpdGUgPSB4Ow0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBHZXQgcmVmIHRvIHRhYmxlOyB0aGUgcmVmZXJlbmNlIGFuZCB0aGUgY2VsbHMgaXQNCisgICAgICogYWNjZXNzZXMgd2lsbCBiZSBhdCBsZWFzdCBhcyBmcmVzaCBhcyBmcm9tIGxhc3QNCisgICAgICogdXNlIG9mIGJhcnJpZXJMb2NrDQorICAgICAqKi8NCisgICAgcHJvdGVjdGVkIGZpbmFsIEVudHJ5W10gZ2V0VGFibGVGb3JSZWFkaW5nKCkgeyANCisgICAgICAgIHN5bmNocm9uaXplZChiYXJyaWVyTG9jaykgew0KKyAgICAgICAgICAgIHJldHVybiB0YWJsZTsgDQorICAgICAgICB9DQorICAgIH0NCisNCisNCisgICAgLyoqDQorICAgICAqIFRoZSBkZWZhdWx0IGluaXRpYWwgbnVtYmVyIG9mIHRhYmxlIHNsb3RzIGZvciB0aGlzIHRhYmxlICgzMikuDQorICAgICAqIFVzZWQgd2hlbiBub3Qgb3RoZXJ3aXNlIHNwZWNpZmllZCBpbiBjb25zdHJ1Y3Rvci4NCisgICAgICoqLw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0lOSVRJQUxfQ0FQQUNJVFkgPSAzMjsgDQorDQorDQorICAgIC8qKg0KKyAgICAgKiBUaGUgbWluaW11bSBjYXBhY2l0eSwgdXNlZCBpZiBhIGxvd2VyIHZhbHVlIGlzIGltcGxpY2l0bHkgc3BlY2lmaWVkDQorICAgICAqIGJ5IGVpdGhlciBvZiB0aGUgY29uc3RydWN0b3JzIHdpdGggYXJndW1lbnRzLiAgDQorICAgICAqIE1VU1QgYmUgYSBwb3dlciBvZiB0d28uDQorICAgICAqLw0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUlOSU1VTV9DQVBBQ0lUWSA9IDQ7DQorDQorICAgIC8qKg0KKyAgICAgKiBUaGUgbWF4aW11bSBjYXBhY2l0eSwgdXNlZCBpZiBhIGhpZ2hlciB2YWx1ZSBpcyBpbXBsaWNpdGx5IHNwZWNpZmllZA0KKyAgICAgKiBieSBlaXRoZXIgb2YgdGhlIGNvbnN0cnVjdG9ycyB3aXRoIGFyZ3VtZW50cy4NCisgICAgICogTVVTVCBiZSBhIHBvd2VyIG9mIHR3byA8PSAxPDwzMC4NCisgICAgICovDQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhJTVVNX0NBUEFDSVRZID0gMSA8PCAzMDsNCisNCisgICAgLyoqDQorICAgICAqIFRoZSBkZWZhdWx0IGxvYWQgZmFjdG9yIGZvciB0aGlzIHRhYmxlICgxLjApLg0KKyAgICAgKiBVc2VkIHdoZW4gbm90IG90aGVyd2lzZSBzcGVjaWZpZWQgaW4gY29uc3RydWN0b3IuDQorICAgICAqKi8NCisNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBmbG9hdCBERUZBVUxUX0xPQURfRkFDVE9SID0gMC43NWY7IA0KKw0KKw0KKyAgICAvKioNCisgICAgICogVGhlIGhhc2ggdGFibGUgZGF0YS4NCisgICAgICovDQorICAgIHByb3RlY3RlZCB0cmFuc2llbnQgRW50cnlbXSB0YWJsZTsNCisNCisgICAgLyoqDQorICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgbWFwcGluZ3MgaW4gdGhlIGhhc2ggdGFibGUuDQorICAgICAqLw0KKyAgICBwcm90ZWN0ZWQgdHJhbnNpZW50IGludCBjb3VudDsNCisNCisgICAgLyoqDQorICAgICAqIFRoZSB0YWJsZSBpcyByZWhhc2hlZCB3aGVuIGl0cyBzaXplIGV4Y2VlZHMgdGhpcyB0aHJlc2hvbGQuICAoVGhlDQorICAgICAqIHZhbHVlIG9mIHRoaXMgZmllbGQgaXMgYWx3YXlzIChpbnQpKGNhcGFjaXR5ICogbG9hZEZhY3RvcikuKQ0KKyAgICAgKg0KKyAgICAgKiBAc2VyaWFsDQorICAgICAqLw0KKyAgICBwcm90ZWN0ZWQgaW50IHRocmVzaG9sZDsNCisNCisgICAgLyoqDQorICAgICAqIFRoZSBsb2FkIGZhY3RvciBmb3IgdGhlIGhhc2ggdGFibGUuDQorICAgICAqDQorICAgICAqIEBzZXJpYWwNCisgICAgICovDQorICAgIHByb3RlY3RlZCBmbG9hdCBsb2FkRmFjdG9yOw0KKw0KKyAgICANCisgICAgcHJpdmF0ZSBSZWZlcmVuY2VRdWV1ZSBxdWV1ZTsNCisgICAgDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSBjYXBhY2l0eSAocG93ZXIgb2YgdHdvKSBmb3IgdGhlIHNwZWNpZmllZCANCisgICAgICogaW5pdGlhbCBjYXBhY2l0eSBhcmd1bWVudC4NCisgICAgICovDQorICAgIHByaXZhdGUgaW50IHAyY2FwYWNpdHkoaW50IGluaXRpYWxDYXBhY2l0eSkgew0KKyAgICAgICAgaW50IGNhcCA9IGluaXRpYWxDYXBhY2l0eTsNCisNCisgICAgICAgIC8vIENvbXB1dGUgdGhlIGFwcHJvcHJpYXRlIGNhcGFjaXR5DQorICAgICAgICBpbnQgcmVzdWx0Ow0KKyAgICAgICAgaWYgKGNhcCA+IE1BWElNVU1fQ0FQQUNJVFkgfHwgY2FwIDwgMCkgew0KKyAgICAgICAgICAgIHJlc3VsdCA9IE1BWElNVU1fQ0FQQUNJVFk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHJlc3VsdCA9IE1JTklNVU1fQ0FQQUNJVFk7DQorICAgICAgICAgICAgd2hpbGUgKHJlc3VsdCA8IGNhcCkNCisgICAgICAgICAgICAgICAgcmVzdWx0IDw8PSAxOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogUmV0dXJuIGhhc2ggY29kZSBmb3IgT2JqZWN0IHguIFNpbmNlIHdlIGFyZSB1c2luZyBwb3dlci1vZi10d28NCisgICAgICogdGFibGVzLCBpdCBpcyB3b3J0aCB0aGUgZWZmb3J0IHRvIGltcHJvdmUgaGFzaGNvZGUgdmlhDQorICAgICAqIHRoZSBzYW1lIG11bHRpcGxpY2F0aXZlIHNjaGVtZSBhcyB1c2VkIGluIElkZW50aXR5SGFzaE1hcC4NCisgICAgICovDQorICAgIHByaXZhdGUgc3RhdGljIGludCBoYXNoKE9iamVjdCB4KSB7DQorICAgICAgICBpbnQgaCA9IHguaGFzaENvZGUoKTsNCisgICAgICAgIC8vIE11bHRpcGx5IGJ5IDEyNyAocXVpY2tseSwgdmlhIHNoaWZ0cyksIGFuZCBtaXggaW4gc29tZSBoaWdoDQorICAgICAgICAvLyBiaXRzIHRvIGhlbHAgZ3VhcmQgYWdhaW5zdCBidW5jaGluZyBvZiBjb2RlcyB0aGF0IGFyZQ0KKyAgICAgICAgLy8gY29uc2VjdXRpdmUgb3IgZXF1YWxseSBzcGFjZWQuDQorICAgICAgICByZXR1cm4gKChoIDw8IDcpIC0gaCArIChoID4+PiA5KSArIChoID4+PiAxNykpOw0KKyAgICB9DQorDQorICAgIC8qKiANCisgICAgICogQ2hlY2sgZm9yIHJlZmVyZW50aWFsIGVxdWFsaXR5LCBudWxsIGFsbG93ZWQgDQorICAgICAqKi8NCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZXEoT2JqZWN0IHgsIE9iamVjdCB5KSB7DQorICAgICAgICByZXR1cm4geCA9PSB5Ow0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3LCBlbXB0eSBtYXAgd2l0aCB0aGUgc3BlY2lmaWVkIGluaXRpYWwgDQorICAgICAqIGNhcGFjaXR5IGFuZCB0aGUgc3BlY2lmaWVkIGxvYWQgZmFjdG9yLiANCisgICAgICoNCisgICAgICogQHBhcmFtIGluaXRpYWxDYXBhY2l0eSB0aGUgaW5pdGlhbCBjYXBhY2l0eQ0KKyAgICAgKiAgVGhlIGFjdHVhbCBpbml0aWFsIGNhcGFjaXR5IGlzIHJvdW5kZWQgdG8gdGhlIG5lYXJlc3QgcG93ZXIgb2YgdHdvLg0KKyAgICAgKiBAcGFyYW0gbG9hZEZhY3RvciAgdGhlIGxvYWQgZmFjdG9yIG9mIHRoZSBDb25jdXJyZW50UmVhZGVySGFzaE1hcA0KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgaWYgdGhlIGluaXRpYWwgbWF4aW11bSBudW1iZXIgDQorICAgICAqICAgICAgICAgICAgICAgb2YgZWxlbWVudHMgaXMgbGVzcw0KKyAgICAgKiAgICAgICAgICAgICAgIHRoYW4gemVybywgb3IgaWYgdGhlIGxvYWQgZmFjdG9yIGlzIG5vbnBvc2l0aXZlLg0KKyAgICAgKi8NCisgICAgcHVibGljIE1lbW9yeUF3YXJlQ29uY3VycmVudFJlYWRNYXAoaW50IGluaXRpYWxDYXBhY2l0eSwgZmxvYXQgbG9hZEZhY3Rvcikgew0KKyAgICAgICAgaWYgKGxvYWRGYWN0b3IgPD0gMCkNCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIExvYWQgZmFjdG9yOiAiKw0KKyAgICAgICAgICAgICAgICAgICAgbG9hZEZhY3Rvcik7DQorICAgICAgICB0aGlzLmxvYWRGYWN0b3IgPSBsb2FkRmFjdG9yOw0KKw0KKyAgICAgICAgaW50IGNhcCA9IHAyY2FwYWNpdHkoaW5pdGlhbENhcGFjaXR5KTsNCisNCisgICAgICAgIHRhYmxlID0gbmV3IEVudHJ5W2NhcF07DQorICAgICAgICB0aHJlc2hvbGQgPSAoaW50KShjYXAgKiBsb2FkRmFjdG9yKTsNCisgICAgICAgIA0KKyAgICAgICAgcXVldWUgPSBuZXcgUmVmZXJlbmNlUXVldWUoKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQ29uc3RydWN0cyBhIG5ldywgZW1wdHkgbWFwIHdpdGggdGhlIHNwZWNpZmllZCBpbml0aWFsIA0KKyAgICAgKiBjYXBhY2l0eSBhbmQgZGVmYXVsdCBsb2FkIGZhY3Rvci4NCisgICAgICoNCisgICAgICogQHBhcmFtICAgaW5pdGlhbENhcGFjaXR5ICAgdGhlIGluaXRpYWwgY2FwYWNpdHkgb2YgdGhlIA0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25jdXJyZW50UmVhZGVySGFzaE1hcC4NCisgICAgICogQHRocm93cyAgICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGluaXRpYWwgbWF4aW11bSBudW1iZXIgDQorICAgICAqICAgICAgICAgICAgICBvZiBlbGVtZW50cyBpcyBsZXNzDQorICAgICAqICAgICAgICAgICAgICB0aGFuIHplcm8uDQorICAgICAqLw0KKyAgICBwdWJsaWMgTWVtb3J5QXdhcmVDb25jdXJyZW50UmVhZE1hcChpbnQgaW5pdGlhbENhcGFjaXR5KSB7DQorICAgICAgICB0aGlzKGluaXRpYWxDYXBhY2l0eSwgREVGQVVMVF9MT0FEX0ZBQ1RPUik7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIENvbnN0cnVjdHMgYSBuZXcsIGVtcHR5IG1hcCB3aXRoIGEgZGVmYXVsdCBpbml0aWFsIGNhcGFjaXR5DQorICAgICAqIGFuZCBsb2FkIGZhY3Rvci4NCisgICAgICovDQorICAgIHB1YmxpYyBNZW1vcnlBd2FyZUNvbmN1cnJlbnRSZWFkTWFwKCkgew0KKyAgICAgICAgdGhpcyhERUZBVUxUX0lOSVRJQUxfQ0FQQUNJVFksIERFRkFVTFRfTE9BRF9GQUNUT1IpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Yga2V5LXZhbHVlIG1hcHBpbmdzIGluIHRoaXMgbWFwLg0KKyAgICAgKg0KKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2Yga2V5LXZhbHVlIG1hcHBpbmdzIGluIHRoaXMgbWFwLg0KKyAgICAgKi8NCisgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgc2l6ZSgpIHsNCisgICAgICAgIHJldHVybiBjb3VudDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogUmV0dXJucyA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoaXMgbWFwIGNvbnRhaW5zIG5vIGtleS12YWx1ZSBtYXBwaW5ncy4NCisgICAgICoNCisgICAgICogQHJldHVybiA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoaXMgbWFwIGNvbnRhaW5zIG5vIGtleS12YWx1ZSBtYXBwaW5ncy4NCisgICAgICovDQorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0VtcHR5KCkgew0KKyAgICAgICAgcmV0dXJuIGNvdW50ID09IDA7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIHRvIHdoaWNoIHRoZSBzcGVjaWZpZWQga2V5IGlzIG1hcHBlZCBpbiB0aGlzIHRhYmxlLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gICBrZXkgICBhIGtleSBpbiB0aGUgdGFibGUuDQorICAgICAqIEByZXR1cm4gIHRoZSB2YWx1ZSB0byB3aGljaCB0aGUga2V5IGlzIG1hcHBlZCBpbiB0aGlzIHRhYmxlOw0KKyAgICAgKiAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUga2V5IGlzIG5vdCBtYXBwZWQgdG8gYW55IHZhbHVlIGluDQorICAgICAqICAgICAgICAgIHRoaXMgdGFibGUuDQorICAgICAqIEBleGNlcHRpb24gIE51bGxQb2ludGVyRXhjZXB0aW9uICBpZiB0aGUga2V5IGlzDQorICAgICAqICAgICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uDQorICAgICAqIEBzZWUgICAgICNwdXQoT2JqZWN0LCBPYmplY3QpDQorICAgICAqLw0KKyAgICBwdWJsaWMgT2JqZWN0IGdldChPYmplY3Qga2V5KSB7DQorDQorICAgICAgICAvLyB0aHJvdyBudWxsIHBvaW50ZXIgZXhjZXB0aW9uIGlmIGtleSBudWxsDQorICAgICAgICBpbnQgaGFzaCA9IGhhc2goa2V5KTsNCisNCisgICAgICAgIC8qIA0KKyAgICAgICBTdGFydCBvZmYgYXQgdGhlIGFwcGFyZW50bHkgY29ycmVjdCBiaW4uICBJZiBlbnRyeSBpcyBmb3VuZCwgd2UNCisgICAgICAgbmVlZCB0byBjaGVjayBhZnRlciBhIGJhcnJpZXIgYW55d2F5LiAgSWYgbm90IGZvdW5kLCB3ZSBuZWVkIGENCisgICAgICAgYmFycmllciB0byBjaGVjayBpZiB3ZSBhcmUgYWN0dWFsbHkgaW4gcmlnaHQgYmluLiBTbyBlaXRoZXINCisgICAgICAgd2F5LCB3ZSBlbmNvdW50ZXIgb25seSBvbmUgYmFycmllciB1bmxlc3Mgd2UgbmVlZCB0byByZXRyeS4NCisgICAgICAgQW5kIHdlIG9ubHkgbmVlZCB0byBmdWxseSBzeW5jaHJvbml6ZSBpZiB0aGVyZSBoYXZlIGJlZW4NCisgICAgICAgY29uY3VycmVudCBtb2RpZmljYXRpb25zLg0KKyAgICAgICAgICovDQorDQorICAgICAgICBFbnRyeVtdIHRhYiA9IHRhYmxlOw0KKyAgICAgICAgaW50IGluZGV4ID0gaGFzaCAmICh0YWIubGVuZ3RoIC0gMSk7DQorICAgICAgICBFbnRyeSBmaXJzdCA9IHRhYltpbmRleF07DQorICAgICAgICBFbnRyeSBlID0gZmlyc3Q7DQorDQorICAgICAgICBmb3IgKDs7KSB7DQorICAgICAgICAgICAgaWYgKGUgPT0gbnVsbCkgew0KKw0KKyAgICAgICAgICAgICAgICAvLyBJZiBrZXkgYXBwYXJlbnRseSBub3QgdGhlcmUsIGNoZWNrIHRvDQorICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGlzIHdhcyBhIHZhbGlkIHJlYWQNCisNCisgICAgICAgICAgICAgICAgRW50cnlbXSByZXJlYWQgPSBnZXRUYWJsZUZvclJlYWRpbmcoKTsNCisgICAgICAgICAgICAgICAgaWYgKHRhYiA9PSByZXJlYWQgJiYgZmlyc3QgPT0gdGFiW2luZGV4XSkNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KKyAgICAgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIC8vIFdyb25nIGxpc3QgLS0gbXVzdCByZXN0YXJ0IHRyYXZlcnNhbCBhdCBuZXcgZmlyc3QNCisgICAgICAgICAgICAgICAgICAgIHRhYiA9IHJlcmVhZDsNCisgICAgICAgICAgICAgICAgICAgIGUgPSBmaXJzdCA9IHRhYltpbmRleCA9IGhhc2ggJiAodGFiLmxlbmd0aC0xKV07DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIA0KKyAgICAgICAgICAgIE9iamVjdCBlS2V5ID0gZS5nZXRLZXkoKTsNCisgICAgICAgICAgICBPYmplY3QgZVZhbHVlID0gZS5nZXRWYWx1ZSgpOw0KKw0KKyAgICAgICAgICAgIGlmIChlLmhhc2ggPT0gaGFzaCAmJiBlcShrZXksIGVLZXkpKSB7DQorICAgICAgICAgICAgICAgIGlmIChlLnZhbHVlICE9IERVTU1ZX1JFRikgcmV0dXJuIGVWYWx1ZTsNCisNCisgICAgICAgICAgICAgICAgLy8gRW50cnkgd2FzIGludmFsaWRhdGVkIGR1cmluZyBkZWxldGlvbi4gQnV0IGl0IGNvdWxkDQorICAgICAgICAgICAgICAgIC8vIGhhdmUgYmVlbiByZS1pbnNlcnRlZCwgc28gd2UgbXVzdCByZXRyYXZlcnNlLg0KKyAgICAgICAgICAgICAgICAvLyBUbyBhdm9pZCB1c2VsZXNzIGNvbnRlbnRpb24sIGdldCBsb2NrIHRvIHdhaXQgb3V0IG1vZGlmaWNhdGlvbnMNCisgICAgICAgICAgICAgICAgLy8gYmVmb3JlIHJldHJhdmVyc2luZy4NCisgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGVLZXk9PW51bGwgJiYgZVZhbHVlPT1udWxsKSBleHB1bmdlU3RhbGVFbnRyaWVzKCk7DQorICAgICAgICAgICAgICAgICAgICB0YWIgPSB0YWJsZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBlID0gZmlyc3QgPSB0YWJbaW5kZXggPSBoYXNoICYgKHRhYi5sZW5ndGgtMSldOw0KKw0KKyAgICAgICAgICAgIH0gDQorICAgICAgICAgICAgZWxzZSANCisgICAgICAgICAgICAgICAgZSA9IGUubmV4dDsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgLyoqDQorICAgICAqIE1hcHMgdGhlIHNwZWNpZmllZCA8Y29kZT5rZXk8L2NvZGU+IHRvIHRoZSBzcGVjaWZpZWQgDQorICAgICAqIDxjb2RlPnZhbHVlPC9jb2RlPiBpbiB0aGlzIHRhYmxlLiBOZWl0aGVyIHRoZSBrZXkgbm9yIHRoZSANCisgICAgICogdmFsdWUgY2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+LiA8cD4NCisgICAgICoNCisgICAgICogVGhlIHZhbHVlIGNhbiBiZSByZXRyaWV2ZWQgYnkgY2FsbGluZyB0aGUgPGNvZGU+Z2V0PC9jb2RlPiBtZXRob2QgDQorICAgICAqIHdpdGggYSBrZXkgdGhhdCBpcyBlcXVhbCB0byB0aGUgb3JpZ2luYWwga2V5LiANCisgICAgICoNCisgICAgICogQHBhcmFtICAgICAga2V5ICAgICB0aGUgdGFibGUga2V5Lg0KKyAgICAgKiBAcGFyYW0gICAgICB2YWx1ZSAgIHRoZSB2YWx1ZS4NCisgICAgICogQHJldHVybiAgICAgdGhlIHByZXZpb3VzIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQga2V5IGluIHRoaXMgdGFibGUsDQorICAgICAqICAgICAgICAgICAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0IGRpZCBub3QgaGF2ZSBvbmUuDQorICAgICAqIEBleGNlcHRpb24gIE51bGxQb2ludGVyRXhjZXB0aW9uICBpZiB0aGUga2V5IG9yIHZhbHVlIGlzDQorICAgICAqICAgICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uDQorICAgICAqIEBzZWUgICAgICNnZXQoT2JqZWN0KQ0KKyAgICAgKi8NCisgICAgcHVibGljIE9iamVjdCBwdXQoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7DQorICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgDQorICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7DQorDQorICAgICAgICBpbnQgaGFzaCA9IGhhc2goa2V5KTsNCisgICAgICAgIEVudHJ5W10gdGFiID0gdGFibGU7DQorICAgICAgICBpbnQgaW5kZXggPSBoYXNoICYgKHRhYi5sZW5ndGgtMSk7DQorICAgICAgICBFbnRyeSBmaXJzdCA9IHRhYltpbmRleF07DQorICAgICAgICBFbnRyeSBlOw0KKw0KKyAgICAgICAgZm9yIChlID0gZmlyc3Q7IGUgIT0gbnVsbDsgZSA9IGUubmV4dCkNCisgICAgICAgICAgICBpZiAoZS5oYXNoID09IGhhc2ggJiYgZXEoa2V5LCBlLmdldEtleSgpKSkNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgew0KKyAgICAgICAgICAgIGlmICh0YWIgPT0gdGFibGUpIHsNCisgICAgICAgICAgICAgICAgaWYgKGUgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgICAgLy8gIG1ha2Ugc3VyZSB3ZSBhcmUgYWRkaW5nIHRvIGNvcnJlY3QgbGlzdA0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0ID09IHRhYltpbmRleF0pIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgQWRkIHRvIGZyb250IG9mIGxpc3QNCisgICAgICAgICAgICAgICAgICAgICAgICBFbnRyeSBuZXdFbnRyeSA9IG5ldyBFbnRyeShoYXNoLCBrZXksIHZhbHVlLCBmaXJzdCwgcXVldWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRhYltpbmRleF0gPSBuZXdFbnRyeTsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKytjb3VudCA+PSB0aHJlc2hvbGQpIHJlaGFzaCgpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgcmVjb3JkTW9kaWZpY2F0aW9uKG5ld0VudHJ5KTsNCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIE9iamVjdCBvbGRWYWx1ZSA9IGUuZ2V0VmFsdWUoKTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCA9PSB0YWJbaW5kZXhdICYmIG9sZFZhbHVlICE9IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBlLnNldFZhbHVlKGUudmFsdWUpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvbGRWYWx1ZTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAvLyByZXRyeSBpZiB3cm9uZyBsaXN0IG9yIGxvc3QgcmFjZSBhZ2FpbnN0IGNvbmN1cnJlbnQgcmVtb3ZlDQorICAgICAgICAgICAgcmV0dXJuIHNwdXQoa2V5LCB2YWx1ZSwgaGFzaCk7DQorICAgICAgICB9DQorICAgIH0NCisNCisNCisgICAgLyoqDQorICAgICAqIENvbnRpbnVhdGlvbiBvZiBwdXQoKSwgY2FsbGVkIG9ubHkgd2hlbiBzeW5jaCBsb2NrIGlzDQorICAgICAqIGhlbGQgYW5kIGludGVyZmVyZW5jZSBoYXMgYmVlbiBkZXRlY3RlZC4NCisgICAgICoqLw0KKyAgICBwcm90ZWN0ZWQgT2JqZWN0IHNwdXQoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlLCBpbnQgaGFzaCkgeyANCisgICAgICAgIGV4cHVuZ2VTdGFsZUVudHJpZXMoKTsNCisNCisgICAgICAgIEVudHJ5W10gdGFiID0gdGFibGU7DQorICAgICAgICBpbnQgaW5kZXggPSBoYXNoICYgKHRhYi5sZW5ndGgtMSk7DQorICAgICAgICBFbnRyeSBmaXJzdCA9IHRhYltpbmRleF07DQorICAgICAgICBFbnRyeSBlID0gZmlyc3Q7DQorDQorICAgICAgICBmb3IgKDs7KSB7DQorICAgICAgICAgICAgaWYgKGUgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICBFbnRyeSBuZXdFbnRyeSA9IG5ldyBFbnRyeShoYXNoLCBrZXksIHZhbHVlLCBmaXJzdCwgcXVldWUpOw0KKyAgICAgICAgICAgICAgICB0YWJbaW5kZXhdID0gbmV3RW50cnk7DQorICAgICAgICAgICAgICAgIGlmICgrK2NvdW50ID49IHRocmVzaG9sZCkgcmVoYXNoKCk7DQorICAgICAgICAgICAgICAgIGVsc2UgcmVjb3JkTW9kaWZpY2F0aW9uKG5ld0VudHJ5KTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UgaWYgKGUuaGFzaCA9PSBoYXNoICYmIGVxKGtleSwgZS5nZXRLZXkoKSkpIHsNCisgICAgICAgICAgICAgICAgT2JqZWN0IG9sZFZhbHVlID0gZS5nZXRWYWx1ZSgpOyANCisgICAgICAgICAgICAgICAgZS5zZXRWYWx1ZShlLnZhbHVlKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIG9sZFZhbHVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgIGUgPSBlLm5leHQ7DQorICAgICAgICB9DQorICAgIH0NCisNCisNCisgICAgLyoqDQorICAgICAqIFJlaGFzaGVzIHRoZSBjb250ZW50cyBvZiB0aGlzIG1hcCBpbnRvIGEgbmV3IHRhYmxlDQorICAgICAqIHdpdGggYSBsYXJnZXIgY2FwYWNpdHkuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlDQorICAgICAqIG51bWJlciBvZiBrZXlzIGluIHRoaXMgbWFwIGV4Y2VlZHMgaXRzIGNhcGFjaXR5IGFuZCBsb2FkIGZhY3Rvci4NCisgICAgICovDQorICAgIHByb3RlY3RlZCB2b2lkIHJlaGFzaCgpIHsgDQorICAgICAgICBFbnRyeVtdIG9sZFRhYmxlID0gdGFibGU7DQorICAgICAgICBpbnQgb2xkQ2FwYWNpdHkgPSBvbGRUYWJsZS5sZW5ndGg7DQorICAgICAgICBpZiAob2xkQ2FwYWNpdHkgPj0gTUFYSU1VTV9DQVBBQ0lUWSkgew0KKyAgICAgICAgICAgIHRocmVzaG9sZCA9IEludGVnZXIuTUFYX1ZBTFVFOyAvLyBhdm9pZCByZXRyaWdnZXJpbmcNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorDQorICAgICAgICBpbnQgbmV3Q2FwYWNpdHkgPSBvbGRDYXBhY2l0eSA8PCAxOw0KKyAgICAgICAgaW50IG1hc2sgPSBuZXdDYXBhY2l0eSAtIDE7DQorICAgICAgICB0aHJlc2hvbGQgPSAoaW50KShuZXdDYXBhY2l0eSAqIGxvYWRGYWN0b3IpOw0KKw0KKyAgICAgICAgRW50cnlbXSBuZXdUYWJsZSA9IG5ldyBFbnRyeVtuZXdDYXBhY2l0eV07DQorICAgICAgICAvKg0KKyAgICAgICAgICogUmVjbGFzc2lmeSBub2RlcyBpbiBlYWNoIGxpc3QgdG8gbmV3IE1hcC4gIEJlY2F1c2Ugd2UgYXJlDQorICAgICAgICAgKiB1c2luZyBwb3dlci1vZi10d28gZXhwYW5zaW9uLCB0aGUgZWxlbWVudHMgZnJvbSBlYWNoIGJpbg0KKyAgICAgICAgICogbXVzdCBlaXRoZXIgc3RheSBhdCBzYW1lIGluZGV4LCBvciBtb3ZlIHRvDQorICAgICAgICAgKiBvbGRDYXBhY2l0eStpbmRleC4gV2UgYWxzbyBlbGltaW5hdGUgdW5uZWNlc3Nhcnkgbm9kZQ0KKyAgICAgICAgICogY3JlYXRpb24gYnkgY2F0Y2hpbmcgY2FzZXMgd2hlcmUgb2xkIG5vZGVzIGNhbiBiZSByZXVzZWQNCisgICAgICAgICAqIGJlY2F1c2UgdGhlaXIgbmV4dCBmaWVsZHMgd29uJ3QgY2hhbmdlLiBTdGF0aXN0aWNhbGx5LCBhdA0KKyAgICAgICAgICogdGhlIGRlZmF1bHQgdGhyZXNoaG9sZCwgb25seSBhYm91dCBvbmUtc2l4dGggb2YgdGhlbSBuZWVkDQorICAgICAgICAgKiBjbG9uaW5nLiAoVGhlIG5vZGVzIHRoZXkgcmVwbGFjZSB3aWxsIGJlIGdhcmJhZ2UNCisgICAgICAgICAqIGNvbGxlY3RhYmxlIGFzIHNvb24gYXMgdGhleSBhcmUgbm8gbG9uZ2VyIHJlZmVyZW5jZWQgYnkgYW55DQorICAgICAgICAgKiByZWFkZXIgdGhyZWFkIHRoYXQgbWF5IGJlIGluIHRoZSBtaWRzdCBvZiB0cmF2ZXJzaW5nIHRhYmxlDQorICAgICAgICAgKiByaWdodCBub3cuKQ0KKyAgICAgICAgICovDQorDQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9sZENhcGFjaXR5IDsgaSsrKSB7DQorICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBndWFyYW50ZWUgdGhhdCBhbnkgZXhpc3RpbmcgcmVhZHMgb2Ygb2xkIE1hcCBjYW4NCisgICAgICAgICAgICAvLyAgcHJvY2VlZC4gU28gd2UgY2Fubm90IHlldCBudWxsIG91dCBlYWNoIGJpbi4gIA0KKyAgICAgICAgICAgIEVudHJ5IGUgPSBvbGRUYWJsZVtpXTsNCisNCisgICAgICAgICAgICBpZiAoZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgIGludCBpZHggPSBlLmhhc2ggJiBtYXNrOw0KKyAgICAgICAgICAgICAgICBFbnRyeSBuZXh0ID0gZS5uZXh0Ow0KKw0KKyAgICAgICAgICAgICAgICAvLyAgU2luZ2xlIG5vZGUgb24gbGlzdA0KKyAgICAgICAgICAgICAgICBpZiAobmV4dCA9PSBudWxsKSANCisgICAgICAgICAgICAgICAgICAgIG5ld1RhYmxlW2lkeF0gPSBlOw0KKw0KKyAgICAgICAgICAgICAgICBlbHNlIHsgICAgDQorICAgICAgICAgICAgICAgICAgICAvLyBSZXVzZSB0cmFpbGluZyBjb25zZWN1dGl2ZSBzZXF1ZW5jZSBvZiBhbGwgc2FtZSBiaXQNCisgICAgICAgICAgICAgICAgICAgIEVudHJ5IGxhc3RSdW4gPSBlOw0KKyAgICAgICAgICAgICAgICAgICAgaW50IGxhc3RJZHggPSBpZHg7DQorICAgICAgICAgICAgICAgICAgICBmb3IgKEVudHJ5IGxhc3QgPSBuZXh0OyBsYXN0ICE9IG51bGw7IGxhc3QgPSBsYXN0Lm5leHQpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgayA9IGxhc3QuaGFzaCAmIG1hc2s7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGsgIT0gbGFzdElkeCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0SWR4ID0gazsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFJ1biA9IGxhc3Q7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgbmV3VGFibGVbbGFzdElkeF0gPSBsYXN0UnVuOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgLy8gQ2xvbmUgYWxsIHJlbWFpbmluZyBub2Rlcw0KKyAgICAgICAgICAgICAgICAgICAgZm9yIChFbnRyeSBwID0gZTsgcCAhPSBsYXN0UnVuOyBwID0gcC5uZXh0KSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGsgPSBwLmhhc2ggJiBtYXNrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld1RhYmxlW2tdID0gbmV3IEVudHJ5KHAuaGFzaCwgcC5nZXRLZXkoKSwgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLmdldFZhbHVlKCksIG5ld1RhYmxlW2tdLCBxdWV1ZSk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICB0YWJsZSA9IG5ld1RhYmxlOw0KKyAgICAgICAgcmVjb3JkTW9kaWZpY2F0aW9uKG5ld1RhYmxlKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogUmVtb3ZlcyB0aGUga2V5IChhbmQgaXRzIGNvcnJlc3BvbmRpbmcgdmFsdWUpIGZyb20gdGhpcyANCisgICAgICogdGFibGUuIFRoaXMgbWV0aG9kIGRvZXMgbm90aGluZyBpZiB0aGUga2V5IGlzIG5vdCBpbiB0aGUgdGFibGUuDQorICAgICAqDQorICAgICAqIEBwYXJhbSAgIGtleSAgIHRoZSBrZXkgdGhhdCBuZWVkcyB0byBiZSByZW1vdmVkLg0KKyAgICAgKiBAcmV0dXJuICB0aGUgdmFsdWUgdG8gd2hpY2ggdGhlIGtleSBoYWQgYmVlbiBtYXBwZWQgaW4gdGhpcyB0YWJsZSwNCisgICAgICogICAgICAgICAgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGtleSBkaWQgbm90IGhhdmUgYSBtYXBwaW5nLg0KKyAgICAgKiBAZXhjZXB0aW9uICBOdWxsUG9pbnRlckV4Y2VwdGlvbiAgaWYgdGhlIGtleSBpcw0KKyAgICAgKiAgICAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+Lg0KKyAgICAgKi8NCisgICAgcHVibGljIE9iamVjdCByZW1vdmUoT2JqZWN0IGtleSkgew0KKyAgICAgICAgLyoNCisgICAgICBGaW5kIHRoZSBlbnRyeSwgdGhlbiANCisgICAgICAgIDEuIFNldCB2YWx1ZSBmaWVsZCB0byBudWxsLCB0byBmb3JjZSBnZXQoKSB0byByZXRyeQ0KKyAgICAgICAgMi4gUmVidWlsZCB0aGUgbGlzdCB3aXRob3V0IHRoaXMgZW50cnkuDQorICAgICAgICAgICBBbGwgZW50cmllcyBmb2xsb3dpbmcgcmVtb3ZlZCBub2RlIGNhbiBzdGF5IGluIGxpc3QsIGJ1dA0KKyAgICAgICAgICAgYWxsIHByZWNlZWRpbmcgb25lcyBuZWVkIHRvIGJlIGNsb25lZC4gIFRyYXZlcnNhbHMgcmVseQ0KKyAgICAgICAgICAgb24gdGhpcyBzdHJhdGVneSB0byBlbnN1cmUgdGhhdCBlbGVtZW50cyB3aWxsIG5vdCBiZQ0KKyAgICAgICAgICByZXBlYXRlZCBkdXJpbmcgaXRlcmF0aW9uLg0KKyAgICAgICAgICovDQorDQorDQorICAgICAgICBpbnQgaGFzaCA9IGhhc2goa2V5KTsNCisgICAgICAgIEVudHJ5W10gdGFiID0gdGFibGU7DQorICAgICAgICBpbnQgaW5kZXggPSBoYXNoICYgKHRhYi5sZW5ndGgtMSk7DQorICAgICAgICBFbnRyeSBmaXJzdCA9IHRhYltpbmRleF07DQorICAgICAgICBFbnRyeSBlID0gZmlyc3Q7DQorDQorICAgICAgICBmb3IgKGUgPSBmaXJzdDsgZSAhPSBudWxsOyBlID0gZS5uZXh0KSANCisgICAgICAgICAgICBpZiAoZS5oYXNoID09IGhhc2ggJiYgZXEoa2V5LCBlLmdldEtleSgpKSkgDQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKw0KKw0KKyAgICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsNCisgICAgICAgICAgICBpZiAodGFiID09IHRhYmxlKSB7DQorICAgICAgICAgICAgICAgIGlmIChlID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCA9PSB0YWJbaW5kZXhdKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG9sZFZhbHVlID0gZS5nZXRWYWx1ZSgpOw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0ID09IHRhYltpbmRleF0gJiYgb2xkVmFsdWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGUuc2V0VmFsdWUobnVsbCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgY291bnQtLTsNCisNCisgICAgICAgICAgICAgICAgICAgICAgICBFbnRyeSBoZWFkID0gZS5uZXh0Ow0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoRW50cnkgcCA9IGZpcnN0OyBwICE9IGU7IHAgPSBwLm5leHQpIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkID0gbmV3IEVudHJ5KHAuaGFzaCwgcC5rZXksIHAudmFsdWUsIGhlYWQsIHF1ZXVlKTsNCisNCisgICAgICAgICAgICAgICAgICAgICAgICB0YWJbaW5kZXhdID0gaGVhZDsNCisgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRNb2RpZmljYXRpb24oaGVhZCk7DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9sZFZhbHVlOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIC8vIFdyb25nIGxpc3Qgb3IgaW50ZXJmZXJlbmNlDQorICAgICAgICAgICAgcmV0dXJuIHNyZW1vdmUoa2V5LCBoYXNoKTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQ29udGludWF0aW9uIG9mIHJlbW92ZSgpLCBjYWxsZWQgb25seSB3aGVuIHN5bmNoIGxvY2sgaXMNCisgICAgICogaGVsZCBhbmQgaW50ZXJmZXJlbmNlIGhhcyBiZWVuIGRldGVjdGVkLg0KKyAgICAgKiovDQorICAgIHByb3RlY3RlZCBPYmplY3Qgc3JlbW92ZShPYmplY3Qga2V5LCBpbnQgaGFzaCkgew0KKyAgICAgICAgZXhwdW5nZVN0YWxlRW50cmllcygpOw0KKyAgICAgICAgDQorICAgICAgICBFbnRyeVtdIHRhYiA9IHRhYmxlOw0KKyAgICAgICAgaW50IGluZGV4ID0gaGFzaCAmICh0YWIubGVuZ3RoLTEpOw0KKyAgICAgICAgRW50cnkgZmlyc3QgPSB0YWJbaW5kZXhdOw0KKw0KKyAgICAgICAgZm9yIChFbnRyeSBlID0gZmlyc3Q7IGUgIT0gbnVsbDsgZSA9IGUubmV4dCkgew0KKyAgICAgICAgICAgIGlmIChlLmhhc2ggPT0gaGFzaCAmJiBlcShrZXksIGUuZ2V0S2V5KCkpKSB7DQorICAgICAgICAgICAgICAgIE9iamVjdCBvbGRWYWx1ZSA9IGUuZ2V0VmFsdWUoKTsNCisgICAgICAgICAgICAgICAgZS5zZXRWYWx1ZShudWxsKTsNCisgICAgICAgICAgICAgICAgY291bnQtLTsNCisgICAgICAgICAgICAgICAgRW50cnkgaGVhZCA9IGUubmV4dDsNCisgICAgICAgICAgICAgICAgZm9yIChFbnRyeSBwID0gZmlyc3Q7IHAgIT0gZTsgcCA9IHAubmV4dCkgDQorICAgICAgICAgICAgICAgICAgICBoZWFkID0gbmV3IEVudHJ5KHAuaGFzaCwgcC5nZXRLZXkoKSwgcC5nZXRWYWx1ZSgpLCBoZWFkLCBxdWV1ZSk7DQorDQorICAgICAgICAgICAgICAgIHRhYltpbmRleF0gPSBoZWFkOw0KKyAgICAgICAgICAgICAgICByZWNvcmRNb2RpZmljYXRpb24oaGVhZCk7DQorICAgICAgICAgICAgICAgIHJldHVybiBvbGRWYWx1ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gbnVsbDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogUmVtb3ZlcyBhbGwgbWFwcGluZ3MgZnJvbSB0aGlzIG1hcC4NCisgICAgICovDQorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjbGVhcigpIHsNCisgICAgICAgIEVudHJ5IHRhYltdID0gdGFibGU7DQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhYi5sZW5ndGggOyArK2kpIHsgDQorDQorICAgICAgICAgICAgLy8gbXVzdCBpbnZhbGlkYXRlIGFsbCB0byBmb3JjZSBjb25jdXJyZW50IGdldCdzIHRvIHdhaXQgYW5kIHRoZW4gcmV0cnkNCisgICAgICAgICAgICBmb3IgKEVudHJ5IGUgPSB0YWJbaV07IGUgIT0gbnVsbDsgZSA9IGUubmV4dCkgDQorICAgICAgICAgICAgICAgIGUuc2V0VmFsdWUobnVsbCk7IA0KKw0KKyAgICAgICAgICAgIHRhYltpXSA9IG51bGw7DQorICAgICAgICB9DQorICAgICAgICBjb3VudCA9IDA7DQorICAgICAgICByZWNvcmRNb2RpZmljYXRpb24odGFiKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogUmVtb3ZlcyBlbnRyaWVzIGZyb20gdGhlIFJlZmVyZW5jZVF1ZXVlIGZvciBrZXlzIGFuZCB2YWx1ZXMNCisgICAgICogb2YgdGhpcyBtYXAuIFRoaXMgbWV0aG9kIGlzIHRob3VnaHQgdG8gYmUgY2FsbGVkIG9ubHkgd2l0aA0KKyAgICAgKiBhbiBhbHJlYWR5IGV4aXN0aW5nIGxvY2sgb24gInRoaXMiLiANCisgICAgICogDQorICAgICAqIFRoZSBtZXRob2QgZXhwZWN0cyBTb2Z0UmVmIGluc3RhbmNlcyBpbiB0aGUgcXVldWUuIEl0IHVzZXMNCisgICAgICogdGhlIGVudHJ5IGZpZWxkIHRvIGNvbnRyb2wgaWYgdGhlIEVudHJ5IGlzIGFscmVhZHkgcmVtb3ZlZA0KKyAgICAgKiBtYXAuIElmIHRoZSBlbnRyeSBpcyBudWxsIHRoZSByZW1vdmFsIGlzIHNraXBwZWQuIA0KKyAgICAgKi8NCisgICAgcHJpdmF0ZSB2b2lkIGV4cHVuZ2VTdGFsZUVudHJpZXMoKSB7DQorICAgICAgICBTb2Z0UmVmIHJlZjsNCisgICAgICAgIEVudHJ5W10gdGFiID0gdGFibGU7DQorICAgICAgICANCisgICAgICAgIHdoaWxlICgocmVmPShTb2Z0UmVmKXF1ZXVlLnBvbGwoKSkhPW51bGwpIHsNCisgICAgICAgICAgICBFbnRyeSBlbnRyeSA9IHJlZi5lbnRyeTsNCisgICAgICAgICAgICAvLyBpZiBlbnRyeT09IG51bGwsIHRoZW4gaXQgaXMgYWxyZWFkeSBkZWxldGVkDQorICAgICAgICAgICAgLy8gZm9ybSB0aGUgbWFwDQorICAgICAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIHJlZi5lbnRyeSA9IG51bGw7DQorICAgICAgICAgICAgLy8gaWYgbmVpdGhlciBlbnRyeS5rZXkgbm9yIGVudHJ5LnZhbHVlID09IHJlZiB0aGVuDQorICAgICAgICAgICAgLy8gdGhlIGVudHJ5IHdhcyByZXVzZWQsIGJ1dCB0aGUgdmFsdWUgaGFzIGJlY29tZSBpbnZhbGlkDQorICAgICAgICAgICAgaWYgKGVudHJ5LmtleSE9cmVmICYmIGVudHJ5LnZhbHVlIT1yZWYpIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIGludCBoYXNoID0gZW50cnkuaGFzaDsNCisgICAgICAgICAgICBpbnQgaW5kZXggPSBoYXNoICYgKHRhYi5sZW5ndGgtMSk7DQorICAgICAgICAgICAgRW50cnkgZmlyc3QgPSB0YWJbaW5kZXhdOw0KKw0KKyAgICAgICAgICAgIGZvciAoRW50cnkgZSA9IGZpcnN0OyBlICE9IG51bGw7IGUgPSBlLm5leHQpIHsNCisgICAgICAgICAgICAgICAgaWYgKGU9PWVudHJ5KSB7DQorICAgICAgICAgICAgICAgICAgICBlbnRyeS5rZXkuY2xlYXIoKTsNCisgICAgICAgICAgICAgICAgICAgIGVudHJ5LnNldFZhbHVlKG51bGwpOw0KKyAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgICAgICBjb3VudC0tOw0KKyAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgICAgICBFbnRyeSBoZWFkID0gZS5uZXh0Ow0KKyAgICAgICAgICAgICAgICAgICAgZm9yIChFbnRyeSBwID0gZmlyc3Q7IHAgIT0gZTsgcCA9IHAubmV4dCkgDQorICAgICAgICAgICAgICAgICAgICAgICAgaGVhZCA9IG5ldyBFbnRyeShwLmhhc2gsIHAua2V5LCBwLnZhbHVlLCBoZWFkKTsNCisgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgICAgICAgdGFiW2luZGV4XSA9IGhlYWQ7DQorICAgICAgICAgICAgICAgICAgICByZWNvcmRNb2RpZmljYXRpb24oaGVhZCk7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0gDQorICAgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIC8qKg0KKyAgICAgKiBSZWZlcmVuY2UgY2xhc3MgdXNlZCB0byBzdXBwb3J0IGdldCgpDQorICAgICAqLw0KKyAgICBwcml2YXRlIHN0YXRpYyBpbnRlcmZhY2UgUmVmZXJlbmNlIHsNCisgICAgICAgIE9iamVjdCBnZXQoKTsNCisgICAgfQ0KKyAgICANCisgICAgLyoqDQorICAgICAqIEEgZHVtbXkgdG8gcmVwbGFjZSB0aGUgU29mdFJlZmVyZW5jZSBpZiBuZWVkZWQNCisgICAgICovDQorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIER1bW15UmVmIGltcGxlbWVudHMgUmVmZXJlbmNlIHsNCisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0KCkgew0KKyAgICAgICAgICAgIHJldHVybiBudWxsOw0KKyAgICAgICAgfQ0KKyAgICB9ICAgIA0KKyAgICANCisgICAgLy8gY29uc3RhbnQgZm9yIER1bW15UmVmLCBubyBuZWVkIHRvIGtlZXAgbW9yZSB0aGFuIG9uZQ0KKyAgICAvLyBpdCBpcyBub3QgY3JpdGljYWwgaWYgbW9yZSB0aGFuIG9uZSBpcyBjcmVhdGVkIGhlcmUNCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVmZXJlbmNlIERVTU1ZX1JFRiA9IG5ldyBEdW1teVJlZigpOw0KKyAgICANCisgICAgLyoqDQorICAgICAqIEEgU29mdFJlZmVyZW5jZSByZXByZXNlbnRpbmcgYSBrZXkgb3IgdmFsdWUgb2YgdGhlIG1hcC4gVGhlDQorICAgICAqIGluc3RhbmNlIGtlZXBzIGEgcG9pbnRlciB0byB0aGUgZW50cnkgaXQgaXMgc290cmluZyBhIA0KKyAgICAgKiBrZXkgb3IgdmFsdWUgZm9yLiBUaGlzIGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlIGVudHJ5IHdlIA0KKyAgICAgKiBuZWVkIHRvIHJlbW92ZSANCisgICAgICogQHNlZSBDb3B5T2ZNZW1vcnlBd2FyZUNvbmN1cnJlbnRSZWFkTWFwI2V4cHVuZ2VTdGFsZUVudHJpZXMoKSANCisgICAgICovDQorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNvZnRSZWYgZXh0ZW5kcyBTb2Z0UmVmZXJlbmNlIGltcGxlbWVudHMgUmVmZXJlbmNlIHsNCisgICAgICAgIHByaXZhdGUgdm9sYXRpbGUgRW50cnkgZW50cnk7DQorICAgICAgICBwdWJsaWMgU29mdFJlZihFbnRyeSBlLCBPYmplY3QgdiwgUmVmZXJlbmNlUXVldWUgcSkgew0KKyAgICAgICAgICAgIHN1cGVyKHYscSk7DQorICAgICAgICAgICAgZW50cnkgPSBlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7DQorICAgICAgICAgICAgc3VwZXIuY2xlYXIoKTsNCisgICAgICAgICAgICBlbnRyeT1udWxsOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBDb25jdXJyZW50UmVhZGVySGFzaE1hcCBjb2xsaXNpb24gbGlzdCBlbnRyeS4NCisgICAgICovDQorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEVudHJ5IHsNCisNCisgICAgICAgIC8qIA0KKyAgICAgICBUaGUgdXNlIG9mIHZvbGF0aWxlIGZvciB2YWx1ZSBmaWVsZCBlbnN1cmVzIHRoYXQNCisgICAgICAgd2UgY2FuIGRldGVjdCBzdGF0dXMgY2hhbmdlcyB3aXRob3V0IHN5bmNocm9uaXphdGlvbi4NCisgICAgICAgVGhlIG90aGVyIGZpZWxkcyBhcmUgbmV2ZXIgY2hhbmdlZCwgYW5kIGFyZQ0KKyAgICAgICBtYXJrZWQgYXMgZmluYWwuIA0KKyAgICAgICAgICovDQorICAgICAgICBwcml2YXRlIGZpbmFsIGludCBoYXNoOw0KKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTb2Z0UmVmIGtleTsNCisgICAgICAgIHByaXZhdGUgZmluYWwgRW50cnkgbmV4dDsNCisgICAgICAgIHByaXZhdGUgdm9sYXRpbGUgUmVmZXJlbmNlIHZhbHVlOw0KKw0KKyAgICAgICAgRW50cnkoaW50IGhhc2gsIE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSwgRW50cnkgbmV4dCwgUmVmZXJlbmNlUXVldWUgcXVldWUpIHsNCisgICAgICAgICAgICB0aGlzLmhhc2ggPSBoYXNoOw0KKyAgICAgICAgICAgIHRoaXMua2V5ID0gbmV3IFNvZnRSZWYodGhpcyxrZXkscXVldWUpOw0KKyAgICAgICAgICAgIHRoaXMubmV4dCA9IG5leHQ7DQorICAgICAgICAgICAgdGhpcy52YWx1ZSA9IG5ldyBTb2Z0UmVmKHRoaXMsdmFsdWUscXVldWUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgRW50cnkoaW50IGhhc2gsIFNvZnRSZWYga2V5LCBSZWZlcmVuY2UgdmFsdWUsIEVudHJ5IG5leHQpIHsNCisgICAgICAgICAgICB0aGlzLmhhc2ggPSBoYXNoOw0KKyAgICAgICAgICAgIHRoaXMua2V5ID0ga2V5Ow0KKyAgICAgICAgICAgIGtleS5lbnRyeSA9IHRoaXM7DQorICAgICAgICAgICAgdGhpcy5uZXh0ID0gbmV4dDsNCisgICAgICAgICAgICB0aGlzLnZhbHVlID0gRFVNTVlfUkVGOw0KKyAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUodmFsdWUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICAvLyBNYXAuRW50cnkgT3BzIA0KKw0KKyAgICAgICAgcHVibGljIE9iamVjdCBnZXRLZXkoKSB7DQorICAgICAgICAgICAgcmV0dXJuIGtleS5nZXQoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7DQorICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmdldCgpOyANCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBPYmplY3Qgc2V0VmFsdWUoUmVmZXJlbmNlIHZhbHVlKSB7DQorICAgICAgICAgICAgT2JqZWN0IG9sZFZhbHVlID0gdGhpcy52YWx1ZS5nZXQoKTsNCisgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSA9PSBEVU1NWV9SRUYpIHsNCisgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IERVTU1ZX1JFRjsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBTb2Z0UmVmIHJlZiA9IChTb2Z0UmVmKSB2YWx1ZTsNCisgICAgICAgICAgICAgICAgcmVmLmVudHJ5ID0gdGhpczsNCisgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gb2xkVmFsdWU7DQorICAgICAgICB9DQorICAgIH0NCisgICAgICAgDQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvbWV0YWNsYXNzL01ldGFDbGFzc1JlZ2lzdHJ5SW1wbC5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9tZXRhY2xhc3MvTWV0YUNsYXNzUmVnaXN0cnlJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQzZWQ1MQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvbWV0YWNsYXNzL01ldGFDbGFzc1JlZ2lzdHJ5SW1wbC5qYXZhCkBAIC0wLDAgKzEsMzM0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLm1ldGFjbGFzczsKKworaW1wb3J0IGdyb292eS5sYW5nLio7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbi5SZWZsZWN0b3JHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5yZWZsZWN0aW9uLkNhY2hlZENsYXNzOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucmVmbGVjdGlvbi5DYWNoZWRNZXRob2Q7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5yZWZsZWN0aW9uLkZhc3RBcnJheTsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJlZmxlY3Rpb24uUmVmbGVjdGlvbkNhY2hlOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5EZWZhdWx0R3Jvb3Z5TWV0aG9kczsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuRGVmYXVsdEdyb292eVN0YXRpY01ldGhvZHM7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLlJlZmxlY3RvcjsKK2ltcG9ydCBvcmcub2JqZWN0d2ViLmFzbS5DbGFzc1dyaXRlcjsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247CitpbXBvcnQgamF2YS51dGlsLio7CisKKy8qKgorICogQSByZWdpc3RyeSBvZiBNZXRhQ2xhc3MgaW5zdGFuY2VzIHdoaWNoIGNhY2hlcyBpbnRyb3NwZWN0aW9uICYKKyAqIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24gYW5kIGFsbG93cyBtZXRob2RzIHRvIGJlIGR5bmFtaWNhbGx5IGFkZGVkIHRvCisgKiBleGlzdGluZyBjbGFzc2VzIGF0IHJ1bnRpbWUKKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQGF1dGhvciBKb2huIFdpbHNvbgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86YmxhY2tkcmFnQGdteC5vcmciPkpvY2hlbiBUaGVvZG9yb3U8L2E+CisgKiBAYXV0aG9yIEdyYWVtZSBSb2NoZXIKKyAqCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBNZXRhQ2xhc3NSZWdpc3RyeUltcGwgaW1wbGVtZW50cyBNZXRhQ2xhc3NSZWdpc3RyeXsKKyAgICBwcml2YXRlIHZvbGF0aWxlIGludCBjb25zdGFudE1ldGFDbGFzc0NvdW50ID0gMDsKKyAgICBwcml2YXRlIENvbmN1cnJlbnRSZWFkZXJIYXNoTWFwIGNvbnN0YW50TWV0YUNsYXNzZXMgPSBuZXcgQ29uY3VycmVudFJlYWRlckhhc2hNYXAoKTsKKyAgICBwcml2YXRlIE1lbW9yeUF3YXJlQ29uY3VycmVudFJlYWRNYXAgd2Vha01ldGFDbGFzc2VzID0gbmV3IE1lbW9yeUF3YXJlQ29uY3VycmVudFJlYWRNYXAoKTsKKyAgICBwcml2YXRlIE1lbW9yeUF3YXJlQ29uY3VycmVudFJlYWRNYXAgbG9hZGVyTWFwID0gbmV3IE1lbW9yeUF3YXJlQ29uY3VycmVudFJlYWRNYXAoKTsKKyAgICBwcml2YXRlIGJvb2xlYW4gdXNlQWNjZXNzaWJsZTsKKyAgICAKKyAgICBwcml2YXRlIEZhc3RBcnJheSBpbnN0YW5jZU1ldGhvZHMgPSBuZXcgRmFzdEFycmF5KCk7CisgICAgcHJpdmF0ZSBGYXN0QXJyYXkgc3RhdGljTWV0aG9kcyA9IG5ldyBGYXN0QXJyYXkoKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQURfREVGQVVMVCA9IDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRE9OVF9MT0FEX0RFRkFVTFQgPSAxOworICAgIHByaXZhdGUgc3RhdGljIE1ldGFDbGFzc1JlZ2lzdHJ5IGluc3RhbmNlSW5jbHVkZTsKKyAgICBwcml2YXRlIHN0YXRpYyBNZXRhQ2xhc3NSZWdpc3RyeSBpbnN0YW5jZUV4Y2x1ZGU7CisKKyAgICBwdWJsaWMgTWV0YUNsYXNzUmVnaXN0cnlJbXBsKCkgeworICAgICAgICB0aGlzKExPQURfREVGQVVMVCwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIE1ldGFDbGFzc1JlZ2lzdHJ5SW1wbChpbnQgbG9hZERlZmF1bHQpIHsKKyAgICAgICAgdGhpcyhsb2FkRGVmYXVsdCwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHVzZUFjY2Vzc2libGUgZGVmaW5lcyB3aGV0aGVyIG9yIG5vdCB0aGUge0BsaW5rIGphdmEubGFuZy5yZWZsZWN0LkFjY2Vzc2libGVPYmplY3Qjc2V0QWNjZXNzaWJsZShib29sZWFuKX0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgdG8gZW5hYmxlIGFjY2VzcyB0byBhbGwgbWV0aG9kcyB3aGVuIHVzaW5nIHJlZmxlY3Rpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0YUNsYXNzUmVnaXN0cnlJbXBsKGJvb2xlYW4gdXNlQWNjZXNzaWJsZSkgeworICAgICAgICB0aGlzKExPQURfREVGQVVMVCwgdXNlQWNjZXNzaWJsZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBNZXRhQ2xhc3NSZWdpc3RyeUltcGwoZmluYWwgaW50IGxvYWREZWZhdWx0LCBmaW5hbCBib29sZWFuIHVzZUFjY2Vzc2libGUpIHsKKyAgICAgICAgdGhpcy51c2VBY2Nlc3NpYmxlID0gdXNlQWNjZXNzaWJsZTsKKworICAgICAgICBpZiAobG9hZERlZmF1bHQgPT0gTE9BRF9ERUZBVUxUKSB7CisgICAgICAgICAgICBIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7CisKKyAgICAgICAgICAgIC8vIGxldHMgcmVnaXN0ZXIgdGhlIGRlZmF1bHQgbWV0aG9kcworICAgICAgICAgICAgcmVnaXN0ZXJNZXRob2RzKERlZmF1bHRHcm9vdnlNZXRob2RzLmNsYXNzLCB0cnVlLCBtYXApOworICAgICAgICAgICAgcmVnaXN0ZXJNZXRob2RzKERlZmF1bHRHcm9vdnlTdGF0aWNNZXRob2RzLmNsYXNzLCBmYWxzZSwgbWFwKTsKKworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IG1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7CisgICAgICAgICAgICAgICAgTWFwLkVudHJ5IGUgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7CisgICAgICAgICAgICAgICAgQ2FjaGVkQ2xhc3MgY2xzID0gKENhY2hlZENsYXNzKSBlLmdldEtleSgpOworICAgICAgICAgICAgICAgIEFycmF5TGlzdCBsaXN0ID0gKEFycmF5TGlzdCkgZS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgICAgIGNscy5zZXROZXdNb3BNZXRob2RzKGxpc3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW5zdGFsbE1ldGFDbGFzc0NyZWF0aW9uSGFuZGxlKCk7CisKKyAgICAgICAgZmluYWwgTWV0YUNsYXNzIGVtY01ldGFDbGFzcyA9IGdldE1ldGFDbGFzc0ZvcihFeHBhbmRvTWV0YUNsYXNzLmNsYXNzKTsKKyAgICAgICAgZW1jTWV0YUNsYXNzLmluaXRpYWxpemUoKTsKKyAgICAgICAgY29uc3RhbnRNZXRhQ2xhc3Nlcy5wdXQoRXhwYW5kb01ldGFDbGFzcy5jbGFzcyxlbWNNZXRhQ2xhc3MpOworICAgICAgICBjb25zdGFudE1ldGFDbGFzc0NvdW50ID0gMTsKKworCisgICB9CisKKyAgICAvKioKKyAgICAgKiBMb29rcyBmb3IgYSBjbGFzcyBjYWxsZWQgJ2dyb292eS5ydW50aW1lLm1ldGFjbGFzcy5DdXN0b21NZXRhQ2xhc3NDcmVhdGlvbkhhbmRsZScgYW5kIGlmIGl0IGV4aXN0cyB1c2VzIGl0IGFzIHRoZSBNZXRhQ2xhc3NDcmVhdGlvbkhhbmRsZQorICAgICAqIG90aGVyd2lzZSB1c2VzIHRoZSBkZWZhdWx0CisgICAgICoKKyAgICAgKiBAc2VlIGdyb292eS5sYW5nLk1ldGFDbGFzc1JlZ2lzdHJ5Lk1ldGFDbGFzc0NyZWF0aW9uSGFuZGxlCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGluc3RhbGxNZXRhQ2xhc3NDcmVhdGlvbkhhbmRsZSgpIHsKKwkgICAgICAgdHJ5IHsKKwkgICAgICAgICAgIGZpbmFsIENsYXNzIGN1c3RvbU1ldGFDbGFzc0hhbmRsZSA9IENsYXNzLmZvck5hbWUoImdyb292eS5ydW50aW1lLm1ldGFjbGFzcy5DdXN0b21NZXRhQ2xhc3NDcmVhdGlvbkhhbmRsZSIpOworCSAgICAgICAgICAgZmluYWwgQ29uc3RydWN0b3IgY3VzdG9tTWV0YUNsYXNzSGFuZGxlQ29uc3RydWN0b3IgPSBjdXN0b21NZXRhQ2xhc3NIYW5kbGUuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW117fSk7CisJCQkJIHRoaXMubWV0YUNsYXNzQ3JlYXRpb25IYW5kbGUgPSAoTWV0YUNsYXNzQ3JlYXRpb25IYW5kbGUpY3VzdG9tTWV0YUNsYXNzSGFuZGxlQ29uc3RydWN0b3IubmV3SW5zdGFuY2UobmV3IE9iamVjdFtde30pOworCSAgICAgICB9IGNhdGNoIChmaW5hbCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKwkgICAgICAgICAgIHRoaXMubWV0YUNsYXNzQ3JlYXRpb25IYW5kbGUgPSBuZXcgTWV0YUNsYXNzQ3JlYXRpb25IYW5kbGUoKTsKKwkgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsKKwkgICAgICAgICAgIHRocm93IG5ldyBHcm9vdnlSdW50aW1lRXhjZXB0aW9uKCJDb3VsZCBub3QgaW5zdGFudGlhdGUgY3VzdG9tIE1ldGFjbGFzcyBjcmVhdGlvbiBoYW5kbGU6ICIrIGUsIGUpOworCSAgICAgICB9CisgICAgfQorICAgIAorICAgIHByaXZhdGUgdm9pZCByZWdpc3Rlck1ldGhvZHMoZmluYWwgQ2xhc3MgdGhlQ2xhc3MsIGZpbmFsIGJvb2xlYW4gdXNlSW5zdGFuY2VNZXRob2RzLCBNYXAgbWFwKSB7CisgICAgICAgIENhY2hlZE1ldGhvZFtdIG1ldGhvZHMgPSBSZWZsZWN0aW9uQ2FjaGUuZ2V0Q2FjaGVkQ2xhc3ModGhlQ2xhc3MpLmdldE1ldGhvZHMoKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIENhY2hlZE1ldGhvZCBtZXRob2QgPSBtZXRob2RzW2ldOworICAgICAgICAgICAgZmluYWwgaW50IG1vZCA9IG1ldGhvZC5nZXRNb2RpZmllcnMoKTsKKyAgICAgICAgICAgIGlmIChNb2RpZmllci5pc1N0YXRpYyhtb2QpICYmIE1vZGlmaWVyLmlzUHVibGljKG1vZCkpIHsKKyAgICAgICAgICAgICAgICBDYWNoZWRDbGFzc1tdIHBhcmFtVHlwZXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKKyAgICAgICAgICAgICAgICBpZiAocGFyYW1UeXBlcy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdCBhcnIgPSAoQXJyYXlMaXN0KSBtYXAuZ2V0KHBhcmFtVHlwZXNbMF0pOworICAgICAgICAgICAgICAgICAgICBpZiAoYXJyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyciA9IG5ldyBBcnJheUxpc3QoNCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXAucHV0KHBhcmFtVHlwZXNbMF0sYXJyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAodXNlSW5zdGFuY2VNZXRob2RzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBOZXdJbnN0YW5jZU1ldGFNZXRob2QgbWV0YU1ldGhvZCA9IG5ldyBOZXdJbnN0YW5jZU1ldGFNZXRob2QobWV0aG9kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyci5hZGQobWV0YU1ldGhvZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZU1ldGhvZHMuYWRkKG1ldGFNZXRob2QpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTmV3U3RhdGljTWV0YU1ldGhvZCBtZXRhTWV0aG9kID0gbmV3IE5ld1N0YXRpY01ldGFNZXRob2QobWV0aG9kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyci5hZGQobWV0YU1ldGhvZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNNZXRob2RzLmFkZChtZXRhTWV0aG9kKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBNZXRhQ2xhc3MgZ2V0TWV0YUNsYXNzKENsYXNzIHRoZUNsYXNzKSB7CisgICAgICAgIE1ldGFDbGFzcyBhbnN3ZXI9bnVsbDsKKyAgICAgICAgaWYgKGNvbnN0YW50TWV0YUNsYXNzQ291bnQhPTApIGFuc3dlciA9IChNZXRhQ2xhc3MpIGNvbnN0YW50TWV0YUNsYXNzZXMuZ2V0KHRoZUNsYXNzKTsKKyAgICAgICAgaWYgKGFuc3dlciE9bnVsbCkgcmV0dXJuIGFuc3dlcjsKKyAgICAgICAgYW5zd2VyID0gKE1ldGFDbGFzcykgd2Vha01ldGFDbGFzc2VzLmdldCh0aGVDbGFzcyk7CisgICAgICAgIGlmIChhbnN3ZXIhPW51bGwpIHJldHVybiBhbnN3ZXI7CisKKyAgICAgICAgc3luY2hyb25pemVkICh0aGVDbGFzcykgeworICAgICAgICAgICAgYW5zd2VyID0gKE1ldGFDbGFzcykgd2Vha01ldGFDbGFzc2VzLmdldCh0aGVDbGFzcyk7CisgICAgICAgICAgICBpZiAoYW5zd2VyIT1udWxsKSByZXR1cm4gYW5zd2VyOworICAgICAgICAgICAgCisgICAgICAgICAgICBhbnN3ZXIgPSBnZXRNZXRhQ2xhc3NGb3IodGhlQ2xhc3MpOworICAgICAgICAgICAgYW5zd2VyLmluaXRpYWxpemUoKTsKKyAgICAgICAgICAgIGlmIChHcm9vdnlTeXN0ZW0uaXNLZWVwSmF2YU1ldGFDbGFzc2VzKCkpIHsKKyAgICAgICAgICAgICAgICBjb25zdGFudE1ldGFDbGFzc0NvdW50Kys7CisgICAgICAgICAgICAgICAgY29uc3RhbnRNZXRhQ2xhc3Nlcy5wdXQodGhlQ2xhc3MsYW5zd2VyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgd2Vha01ldGFDbGFzc2VzLnB1dCh0aGVDbGFzcywgYW5zd2VyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBhbnN3ZXI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVNZXRhQ2xhc3MoQ2xhc3MgdGhlQ2xhc3MpIHsKKyAgICAgICAgT2JqZWN0IGFuc3dlcj1udWxsOworICAgICAgICBpZiAoY29uc3RhbnRNZXRhQ2xhc3NDb3VudCE9MCkgYW5zd2VyID0gY29uc3RhbnRNZXRhQ2xhc3Nlcy5yZW1vdmUodGhlQ2xhc3MpOworICAgICAgICBpZiAoYW5zd2VyPT1udWxsKSB7CisgICAgICAgICAgICB3ZWFrTWV0YUNsYXNzZXMucmVtb3ZlKHRoZUNsYXNzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCh0aGVDbGFzcykgeworICAgICAgICAgICAgICAgIGNvbnN0YW50TWV0YUNsYXNzQ291bnQtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVycyBhIG5ldyBNZXRhQ2xhc3MgaW4gdGhlIHJlZ2lzdHJ5IHRvIGN1c3RvbWl6ZSB0aGUgdHlwZQorICAgICAqCisgICAgICogQHBhcmFtIHRoZUNsYXNzCisgICAgICogQHBhcmFtIHRoZU1ldGFDbGFzcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1ldGFDbGFzcyhDbGFzcyB0aGVDbGFzcywgTWV0YUNsYXNzIHRoZU1ldGFDbGFzcykgeworICAgICAgICBzeW5jaHJvbml6ZWQodGhlQ2xhc3MpIHsKKyAgICAgICAgICAgIGNvbnN0YW50TWV0YUNsYXNzQ291bnQrKzsKKyAgICAgICAgICAgIGNvbnN0YW50TWV0YUNsYXNzZXMucHV0KHRoZUNsYXNzLCB0aGVNZXRhQ2xhc3MpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gdXNlQWNjZXNzaWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIHVzZUFjY2Vzc2libGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogY3JlYXRlIFJlZmxlY3RvciBsb2FkZXIgaW5zdGFuY2UgaWYgbm90IGluIG1hcC4gVGhpcyBtZXRob2QKKyAgICAgKiBpcyBvbmx5IHVzZWQgd2l0aCBhIGxvY2sgb24gInRoaXMiIGFuZCBzaW5jZSBsb2FkZXJNYXAgaXMgbm90CisgICAgICogdXNlZCBhbnl3aGVyZSBlbHNlIG5vIHN5bmMgaXMgbmVlZGVkIGhlcmUKKyAgICAgKi8KKyAgICBwcml2YXRlIFJlZmxlY3RvckxvYWRlciBnZXRSZWZsZWN0b3JMb2FkZXIoZmluYWwgQ2xhc3NMb2FkZXIgbG9hZGVyKSB7CisgICAgICAgIFJlZmxlY3RvckxvYWRlciByZWZsZWN0b3JMb2FkZXIgPSAoUmVmbGVjdG9yTG9hZGVyKSBsb2FkZXJNYXAuZ2V0KGxvYWRlcik7CisgICAgICAgIGlmIChyZWZsZWN0b3JMb2FkZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgcmVmbGVjdG9yTG9hZGVyID0gKFJlZmxlY3RvckxvYWRlcikgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVmbGVjdG9yTG9hZGVyKGxvYWRlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7IAorICAgICAgICAgICAgbG9hZGVyTWFwLnB1dChsb2FkZXIsIHJlZmxlY3RvckxvYWRlcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlZmxlY3RvckxvYWRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kIGEgTWV0YUNsYXNzIGZvciB0aGUgY2xhc3MKKyAgICAgKiBVc2UgdGhlIE1ldGFDbGFzcyBvZiB0aGUgc3VwZXJjbGFzcyBvZiB0aGUgY2xhc3MgdG8gY3JlYXRlIHRoZSBNZXRhQ2xhc3MKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdGhlQ2xhc3MKKyAgICAgKiBAcmV0dXJuIEFuIGluc3RhbmNlIG9mIHRoZSBNZXRhQ2xhc3Mgd2hpY2ggd2lsbCBoYW5kbGUgdGhpcyBjbGFzcworICAgICAqLworICAgIHByaXZhdGUgTWV0YUNsYXNzIGdldE1ldGFDbGFzc0ZvcihmaW5hbCBDbGFzcyB0aGVDbGFzcykgeworICAgICAgICByZXR1cm4gbWV0YUNsYXNzQ3JlYXRpb25IYW5kbGUuY3JlYXRlKHRoZUNsYXNzLHRoaXMpOworICAgIH0KKworICAgIC8vIHRoZSBmb2xsb3dpbmcgaXMgZXhwZXJpbWVudGFsIGNvZGUsIG5vdCBpbnRlbmRlZCBmb3Igc3RhYmxlIHVzZSB5ZXQKKyAgICBwcml2YXRlIE1ldGFDbGFzc0NyZWF0aW9uSGFuZGxlIG1ldGFDbGFzc0NyZWF0aW9uSGFuZGxlID0gbmV3IE1ldGFDbGFzc0NyZWF0aW9uSGFuZGxlKCk7CisgICAgLyoqCisgICAgICogR2V0cyBhIGhhbmRsZSBpbnRlcm5hbGx5IHVzZWQgdG8gY3JlYXRlIE1ldGFDbGFzcyBpbXBsZW1lbnRhdGlvbnMKKyAgICAgKiBXQVJOSU5HOiBleHBlcmltZW50YWwgY29kZSwgbGlrZWx5IHRvIGNoYW5nZSBzb29uCisgICAgICogQHJldHVybiB0aGUgaGFuZGxlCisgICAgICovCisgICAgcHVibGljIE1ldGFDbGFzc0NyZWF0aW9uSGFuZGxlIGdldE1ldGFDbGFzc0NyZWF0aW9uSGFuZGxlcigpIHsKKyAgICAgICAgcmV0dXJuIG1ldGFDbGFzc0NyZWF0aW9uSGFuZGxlOworICAgIH0KKyAgICAvKioKKyAgICAgKiBTZXRzIGEgaGFuZGxlIGludGVybmFsbHkgdXNlZCB0byBjcmVhdGUgTWV0YUNsYXNzIGltcGxlbWVudGF0aW9ucy4KKyAgICAgKiBXaGVuIHJlcGxhY2luZyB0aGUgaGFuZGxlIHdpdGggYSBjdXN0b20gdmVyc2lvbiwgeW91IHNob3VsZAorICAgICAqIHJlc3VzZSB0aGUgb2xkIGhhbmRsZSB0byBrZWVwIGN1c3RvbSBsb2dpYyBhbmQgdG8gdXNlIHRoZQorICAgICAqIGRlZmF1bHQgbG9naWMgYXMgZmFsbGJhY2suCisgICAgICogV0FSTklORzogZXhwZXJpbWVudGFsIGNvZGUsIGxpa2VseSB0byBjaGFuZ2Ugc29vbgorICAgICAqIEBwYXJhbSBoYW5kbGUgdGhlIGhhbmRsZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1ldGFDbGFzc0NyZWF0aW9uSGFuZGxlKE1ldGFDbGFzc0NyZWF0aW9uSGFuZGxlIGhhbmRsZSkgeworCQlpZihoYW5kbGUgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IHNldCBNZXRhQ2xhc3NDcmVhdGlvbkhhbmRsZSB0byBudWxsIHZhbHVlISIpOworICAgICAgICBtZXRhQ2xhc3NDcmVhdGlvbkhhbmRsZSA9IGhhbmRsZTsKKyAgICB9ICAgIAorCisgICAgLyoqCisgICAgICogU2luZ2xldG9uIG9mIE1ldGFDbGFzc1JlZ2lzdHJ5LiBTaGFsbCB3ZSB1c2UgdGhyZWFkbG9jYWwgdG8gc3RvcmUgdGhlIGluc3RhbmNlPworICAgICAqCisgICAgICogQHBhcmFtIGluY2x1ZGVFeHRlbnNpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE1ldGFDbGFzc1JlZ2lzdHJ5IGdldEluc3RhbmNlKGludCBpbmNsdWRlRXh0ZW5zaW9uKSB7CisgICAgICAgIGlmIChpbmNsdWRlRXh0ZW5zaW9uICE9IERPTlRfTE9BRF9ERUZBVUxUKSB7CisgICAgICAgICAgICBpZiAoaW5zdGFuY2VJbmNsdWRlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbnN0YW5jZUluY2x1ZGUgPSBuZXcgTWV0YUNsYXNzUmVnaXN0cnlJbXBsKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2VJbmNsdWRlOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKGluc3RhbmNlRXhjbHVkZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW5zdGFuY2VFeGNsdWRlID0gbmV3IE1ldGFDbGFzc1JlZ2lzdHJ5SW1wbChET05UX0xPQURfREVGQVVMVCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2VFeGNsdWRlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBSZWZsZWN0b3IgbG9hZFJlZmxlY3RvcihmaW5hbCBDbGFzcyB0aGVDbGFzcywgTGlzdCBtZXRob2RzKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gZ2V0UmVmbGVjdG9yTmFtZSh0aGVDbGFzcyk7CisgICAgICAgIENsYXNzTG9hZGVyIGxvYWRlciA9IChDbGFzc0xvYWRlcikgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7CisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKKyAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyID0gdGhlQ2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgaWYgKGxvYWRlciA9PSBudWxsKSBsb2FkZXIgPSB0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbG9hZGVyOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgZmluYWwgUmVmbGVjdG9yTG9hZGVyIHJsb2FkZXIgPSBnZXRSZWZsZWN0b3JMb2FkZXIobG9hZGVyKTsKKyAgICAgICAgQ2xhc3MgcmVmID0gcmxvYWRlci5nZXRMb2FkZWRDbGFzcyhuYW1lKTsKKyAgICAgICAgaWYgKHJlZiA9PSBudWxsKSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogTGV0cyBnZW5lcmF0ZSBpdCAmJiBsb2FkIGl0LgorICAgICAgICAgICAgICovICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBSZWZsZWN0b3JHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IFJlZmxlY3RvckdlbmVyYXRvcihtZXRob2RzKTsKKyAgICAgICAgICAgIENsYXNzV3JpdGVyIGN3ID0gbmV3IENsYXNzV3JpdGVyKHRydWUpOworICAgICAgICAgICAgZ2VuZXJhdG9yLmdlbmVyYXRlKGN3LCBuYW1lKTsKKyAgICAgICAgICAgIGZpbmFsIGJ5dGVbXSBieXRlY29kZSA9IGN3LnRvQnl0ZUFycmF5KCk7CisgICAgICAgICAgICByZWYgPSAoQ2xhc3MpIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmxvYWRlci5kZWZpbmVDbGFzcyhuYW1lLCBieXRlY29kZSwgZ2V0Q2xhc3MoKS5nZXRQcm90ZWN0aW9uRG9tYWluKCkpOworICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgIHJldHVybiAoUmVmbGVjdG9yKSByZWYubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UmVmbGVjdG9yTmFtZShDbGFzcyB0aGVDbGFzcykgeworICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gdGhlQ2xhc3MuZ2V0TmFtZSgpOworICAgICAgICBTdHJpbmcgcGFja2FnZVByZWZpeCA9ICJnamRrLiI7CisgICAgICAgIFN0cmluZyBuYW1lID0gcGFja2FnZVByZWZpeCArIGNsYXNzTmFtZSArICJfR3Jvb3Z5UmVmbGVjdG9yIjsKKyAgICAgICAgaWYgKHRoZUNsYXNzLmlzQXJyYXkoKSkgeworICAgICAgICAgICAgICAgQ2xhc3MgY2xhenogPSB0aGVDbGFzczsKKyAgICAgICAgICAgICAgIG5hbWUgPSBwYWNrYWdlUHJlZml4OworICAgICAgICAgICAgICAgaW50IGxldmVsID0gMDsKKyAgICAgICAgICAgICAgIHdoaWxlIChjbGF6ei5pc0FycmF5KCkpIHsKKyAgICAgICAgICAgICAgICAgIGNsYXp6ID0gY2xhenouZ2V0Q29tcG9uZW50VHlwZSgpOworICAgICAgICAgICAgICAgICAgbGV2ZWwrKzsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZyBjb21wb25lbnROYW1lID0gY2xhenouZ2V0TmFtZSgpOworICAgICAgICAgICAgbmFtZSA9IHBhY2thZ2VQcmVmaXggKyBjb21wb25lbnROYW1lICsgIl9Hcm9vdnlSZWZsZWN0b3JBcnJheSI7CisgICAgICAgICAgICBpZiAobGV2ZWw+MSkgbmFtZSArPSBsZXZlbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgRmFzdEFycmF5IGdldEluc3RhbmNlTWV0aG9kcygpIHsKKyAgICAgICAgcmV0dXJuIGluc3RhbmNlTWV0aG9kczsKKyAgICB9CisKKyAgICBwdWJsaWMgRmFzdEFycmF5IGdldFN0YXRpY01ldGhvZHMoKSB7CisgICAgICAgIHJldHVybiBzdGF0aWNNZXRob2RzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvbWV0YWNsYXNzL01ldGFNZXRob2RJbmRleC5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9tZXRhY2xhc3MvTWV0YU1ldGhvZEluZGV4LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFiOWYzYwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvbWV0YWNsYXNzL01ldGFNZXRob2RJbmRleC5qYXZhCkBAIC0wLDAgKzEsNTA5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLm1ldGFjbGFzczsKKworaW1wb3J0IGdyb292eS5sYW5nLk1ldGFNZXRob2Q7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5yZWZsZWN0aW9uLkNhY2hlZENsYXNzOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucmVmbGVjdGlvbi5GYXN0QXJyYXk7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5yZWZsZWN0aW9uLlNpbmdsZUtleUhhc2hNYXA7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLk1ldGFDbGFzc0hlbHBlcjsKKworaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOworCitwdWJsaWMgY2xhc3MgTWV0YU1ldGhvZEluZGV4IHsKKyAgICBwdWJsaWMgU2luZ2xlS2V5SGFzaE1hcCBtZXRob2RIZWFkZXJzID0gbmV3IFNpbmdsZUtleUhhc2hNYXAoKTsKKyAgICBwcml2YXRlIENhY2hlZENsYXNzIHRoZUNhY2hlZENsYXNzOworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBIZWFkZXIgeworICAgICAgICBwdWJsaWMgRW50cnkgaGVhZDsKKyAgICAgICAgQ2xhc3MgY2xzOworICAgICAgICBwdWJsaWMgaW50IGNsc0hhc2hDb2RlMzE7CisgICAgICAgIHB1YmxpYyBDbGFzcyBzdWJjbGFzczsKKworICAgICAgICBwdWJsaWMgSGVhZGVyKENsYXNzIGNscykgeworICAgICAgICAgICAgdGhpcyAoY2xzLCBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBIZWFkZXIoQ2xhc3MgY2xzLCBDbGFzcyBzdWJjbGFzcykgeworICAgICAgICAgICAgdGhpcy5jbHMgPSBjbHM7CisgICAgICAgICAgICB0aGlzLnN1YmNsYXNzID0gc3ViY2xhc3M7CisgICAgICAgICAgICB0aGlzLmNsc0hhc2hDb2RlMzEgPSAzMSAqIGNscy5oYXNoQ29kZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFbnRyeSB7CisgICAgICAgIHB1YmxpYyBpbnQgaGFzaDsKKworICAgICAgICBwdWJsaWMgRW50cnkgbmV4dEhhc2hFbnRyeSwgbmV4dENsYXNzRW50cnk7CisKKyAgICAgICAgcHVibGljIFN0cmluZyBuYW1lOworICAgICAgICBwdWJsaWMgQ2xhc3MgY2xzOworCisgICAgICAgIHB1YmxpYyBPYmplY3QgbWV0aG9kcywgbWV0aG9kc0ZvclN1cGVyLCBzdGF0aWNNZXRob2RzOworCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcgKCkgeworICAgICAgICAgICAgcmV0dXJuICJbIiArIG5hbWUgKyAiLCAiICsgY2xzLmdldE5hbWUoKSArICJdIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBNZXRhTWV0aG9kSW5kZXgoQ2FjaGVkQ2xhc3MgdGhlQ2FjaGVkQ2xhc3MpIHsKKyAgICAgICAgdGhpcy50aGVDYWNoZWRDbGFzcyA9IHRoZUNhY2hlZENsYXNzOworICAgICAgICBpbml0KERFRkFVTFRfQ0FQQUNJVFkpOworCisgICAgICAgIENhY2hlZENsYXNzIGxhc3QgPSBudWxsOworICAgICAgICBpZiAoIXRoZUNhY2hlZENsYXNzLmlzSW50ZXJmYWNlKCkpIHsKKyAgICAgICAgICAgIGZvciAoQ2FjaGVkQ2xhc3MgYyA9IHRoZUNhY2hlZENsYXNzOyBjICE9IG51bGw7IGMgPSBjLmdldENhY2hlZFN1cGVyQ2xhc3MoKSkgeworICAgICAgICAgICAgICBmaW5hbCBTaW5nbGVLZXlIYXNoTWFwLkVudHJ5IGUgPSBtZXRob2RIZWFkZXJzLmdldE9yUHV0KGMuZ2V0Q2FjaGVkQ2xhc3MoKSk7CisgICAgICAgICAgICAgIGUudmFsdWUgPSBuZXcgSGVhZGVyIChjLmdldENhY2hlZENsYXNzKCksIGxhc3QgPT0gbnVsbCA/IG51bGwgOiBsYXN0LmdldENhY2hlZENsYXNzKCkpOworICAgICAgICAgICAgICBsYXN0ID0gYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGZpbmFsIFNpbmdsZUtleUhhc2hNYXAuRW50cnkgZSA9IG1ldGhvZEhlYWRlcnMuZ2V0T3JQdXQoT2JqZWN0LmNsYXNzKTsKKyAgICAgICAgICAgIGUudmFsdWUgPSBuZXcgSGVhZGVyIChPYmplY3QuY2xhc3MsIHRoZUNhY2hlZENsYXNzLmdldENhY2hlZENsYXNzKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIEVudHJ5IHRhYmxlW107CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0NBUEFDSVRZID0gMzI7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTUlOSU1VTV9DQVBBQ0lUWSA9IDQ7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTUFYSU1VTV9DQVBBQ0lUWSA9IDEgPDwgMjg7CisKKyAgICBwcm90ZWN0ZWQgaW50IHNpemU7CisgICAgcHJvdGVjdGVkIHRyYW5zaWVudCBpbnQgdGhyZXNob2xkOworCisgICAgcHVibGljIHN0YXRpYyBpbnQgaGFzaChpbnQgaCkgeworICAgICAgICBoICs9IH4oaCA8PCA5KTsKKyAgICAgICAgaCBePSAoaCA+Pj4gMTQpOworICAgICAgICBoICs9IChoIDw8IDQpOworICAgICAgICBoIF49IChoID4+PiAxMCk7CisgICAgICAgIHJldHVybiBoOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIHNpemU7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKKyAgICAgICAgcmV0dXJuIHNpemUgPT0gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgT2JqZWN0W10gdGFiID0gdGFibGU7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFiLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgdGFiW2ldID0gbnVsbDsKKyAgICAgICAgc2l6ZSA9IDA7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5pdChpbnQgaW5pdENhcGFjaXR5KSB7CisgICAgICAgIHRocmVzaG9sZCA9IChpbml0Q2FwYWNpdHkgKiA2KSAvIDg7CisgICAgICAgIHRhYmxlID0gbmV3IEVudHJ5W2luaXRDYXBhY2l0eV07CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVzaXplKGludCBuZXdMZW5ndGgpIHsKKyAgICAgICAgRW50cnlbXSBvbGRUYWJsZSA9IHRhYmxlOworICAgICAgICBpbnQgb2xkTGVuZ3RoID0gdGFibGUubGVuZ3RoOworCisgICAgICAgIEVudHJ5W10gbmV3VGFibGUgPSBuZXcgRW50cnlbbmV3TGVuZ3RoXTsKKworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG9sZExlbmd0aDsgaisrKSB7CisKKyAgICAgICAgICAgIGZvciAoRW50cnkgZSA9IG9sZFRhYmxlW2pdOyBlICE9IG51bGw7KSB7CisgICAgICAgICAgICAgICAgRW50cnkgbmV4dCA9IGUubmV4dEhhc2hFbnRyeTsKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBlLmhhc2ggJiAobmV3TGVuZ3RoIC0gMSk7CisKKyAgICAgICAgICAgICAgICBlLm5leHRIYXNoRW50cnkgPSBuZXdUYWJsZVtpbmRleF07CisgICAgICAgICAgICAgICAgbmV3VGFibGVbaW5kZXhdID0gZTsKKworICAgICAgICAgICAgICAgIGUgPSBuZXh0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdGFibGUgPSBuZXdUYWJsZTsKKyAgICAgICAgdGhyZXNob2xkID0gKDYgKiBuZXdMZW5ndGgpIC8gODsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50ZXJmYWNlIEVudHJ5SXRlcmF0b3IgeworICAgICAgICBib29sZWFuIGhhc05leHQoKTsKKworICAgICAgICBFbnRyeSBuZXh0KCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgRW50cnlbXSBnZXRUYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIHRhYmxlOworICAgIH0KKworICAgIHB1YmxpYyBFbnRyeUl0ZXJhdG9yIGdldEVudHJ5U2V0SXRlcmF0b3IoKSB7CisgICAgICAgIHJldHVybiBuZXcgRW50cnlJdGVyYXRvcigpIHsKKyAgICAgICAgICAgIEVudHJ5IG5leHQ7ICAgIC8vIG5leHQgZW50cnkgdG8gcmV0dXJuCisgICAgICAgICAgICBpbnQgaW5kZXg7ICAgICAgICAvLyBjdXJyZW50IHNsb3QKKyAgICAgICAgICAgIEVudHJ5IGN1cnJlbnQ7ICAgIC8vIGN1cnJlbnQgZW50cnkKKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVudHJ5W10gdCA9IHRhYmxlOworICAgICAgICAgICAgICAgIGludCBpID0gdC5sZW5ndGg7CisgICAgICAgICAgICAgICAgRW50cnkgbiA9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKHNpemUgIT0gMCkgeyAvLyBhZHZhbmNlIHRvIGZpcnN0IGVudHJ5CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpID4gMCAmJiAobiA9IHRbLS1pXSkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5leHQgPSBuOworICAgICAgICAgICAgICAgIGluZGV4ID0gaTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV4dCAhPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgRW50cnkgbmV4dCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV4dEVudHJ5KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEVudHJ5IG5leHRFbnRyeSgpIHsKKyAgICAgICAgICAgICAgICBFbnRyeSBlID0gbmV4dDsKKyAgICAgICAgICAgICAgICBpZiAoZSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOworCisgICAgICAgICAgICAgICAgRW50cnkgbiA9IGUubmV4dEhhc2hFbnRyeTsKKyAgICAgICAgICAgICAgICBFbnRyeVtdIHQgPSB0YWJsZTsKKyAgICAgICAgICAgICAgICBpbnQgaSA9IGluZGV4OworICAgICAgICAgICAgICAgIHdoaWxlIChuID09IG51bGwgJiYgaSA+IDApCisgICAgICAgICAgICAgICAgICAgIG4gPSB0Wy0taV07CisgICAgICAgICAgICAgICAgaW5kZXggPSBpOworICAgICAgICAgICAgICAgIG5leHQgPSBuOworICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50ID0gZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgRW50cnkgZ2V0TWV0aG9kcyhDbGFzcyBjbHMsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIGludCBoID0gaGFzaCgzMSAqIGNscy5oYXNoQ29kZSgpICsgbmFtZS5oYXNoQ29kZSgpKTsKKyAgICAgICAgRW50cnkgZSA9IHRhYmxlW2ggJiAodGFibGUubGVuZ3RoIC0gMSldOworICAgICAgICBmb3IgKDsgZSAhPSBudWxsOyBlID0gZS5uZXh0SGFzaEVudHJ5KQorICAgICAgICAgICAgaWYgKGUuaGFzaCA9PSBoICYmIGNscyA9PSBlLmNscyAmJiBlLm5hbWUuZXF1YWxzKG5hbWUpKQorICAgICAgICAgICAgICAgIHJldHVybiBlOworCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBFbnRyeSBnZXRPclB1dE1ldGhvZHMoU3RyaW5nIG5hbWUsIEhlYWRlciBoZWFkZXIpIHsKKyAgICAgICAgZmluYWwgQ2xhc3MgY2xzID0gaGVhZGVyLmNsczsKKyAgICAgICAgaW50IGggPSBoYXNoKGhlYWRlci5jbHNIYXNoQ29kZTMxICsgbmFtZS5oYXNoQ29kZSgpKTsKKyAgICAgICAgZmluYWwgRW50cnlbXSB0ID0gdGFibGU7CisgICAgICAgIGZpbmFsIGludCBpbmRleCA9IGggJiAodC5sZW5ndGggLSAxKTsKKyAgICAgICAgRW50cnkgZSA9IHRbaW5kZXhdOworICAgICAgICBmb3IgKDsgZSAhPSBudWxsOyBlID0gZS5uZXh0SGFzaEVudHJ5KQorICAgICAgICAgICAgaWYgKGUuaGFzaCA9PSBoICYmIGNscyA9PSBlLmNscyAmJiBlLm5hbWUuZXF1YWxzKG5hbWUpKQorICAgICAgICAgICAgICAgIHJldHVybiBlOworCisgICAgICAgIEVudHJ5IGVudHJ5ID0gbmV3IEVudHJ5KCk7CisgICAgICAgIGVudHJ5Lm5leHRIYXNoRW50cnkgPSB0W2luZGV4XTsKKyAgICAgICAgZW50cnkuaGFzaCA9IGg7CisgICAgICAgIGVudHJ5Lm5hbWUgPSBuYW1lOworICAgICAgICBlbnRyeS5jbHMgPSBjbHM7CisgICAgICAgIHRbaW5kZXhdID0gZW50cnk7CisKKyAgICAgICAgZW50cnkubmV4dENsYXNzRW50cnkgPSBoZWFkZXIuaGVhZDsKKyAgICAgICAgaGVhZGVyLmhlYWQgPSBlbnRyeTsKKworICAgICAgICBpZiAoKytzaXplID09IHRocmVzaG9sZCkKKyAgICAgICAgICAgIHJlc2l6ZSgyICogdC5sZW5ndGgpOworCisgICAgICAgIHJldHVybiBlbnRyeTsKKyAgICB9CisKKyAgICBwdWJsaWMgSGVhZGVyIGdldEhlYWRlcihDbGFzcyBjbHMpIHsKKyAgICAgICAgSGVhZGVyIGhlYWRlcjsKKyAgICAgICAgZmluYWwgU2luZ2xlS2V5SGFzaE1hcC5FbnRyeSBoZWFkID0gbWV0aG9kSGVhZGVycy5nZXRPclB1dChjbHMpOworICAgICAgICBpZiAoaGVhZC52YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICBoZWFkLnZhbHVlID0gbmV3IEhlYWRlcihjbHMpOworICAgICAgICB9CisgICAgICAgIGhlYWRlciA9IChIZWFkZXIpIGhlYWQudmFsdWU7CisgICAgICAgIHJldHVybiBoZWFkZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY29weU5vblByaXZhdGVNZXRob2RzKENsYXNzIGZyb20sIENsYXNzIHRvKSB7CisgICAgICAgIGNvcHlOb25Qcml2YXRlTWV0aG9kcyhnZXRIZWFkZXIoZnJvbSksIGdldEhlYWRlcih0bykpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNvcHlOb25Qcml2YXRlTWV0aG9kcyhIZWFkZXIgZnJvbSwgSGVhZGVyIHRvKSB7CisgICAgICAgIGZvciAoRW50cnkgZSA9IGZyb20uaGVhZDsgZSAhPSBudWxsOyBlID0gZS5uZXh0Q2xhc3NFbnRyeSkKKyAgICAgICAgICAgIGNvcHlOb25Qcml2YXRlTWV0aG9kcyhlLCB0byk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY29weUFsbE1ldGhvZHNUb1N1cGVyKEhlYWRlciBmcm9tLCBIZWFkZXIgdG8pIHsKKyAgICAgICAgZm9yIChFbnRyeSBlID0gZnJvbS5oZWFkOyBlICE9IG51bGw7IGUgPSBlLm5leHRDbGFzc0VudHJ5KQorICAgICAgICAgICAgY29weUFsbE1ldGhvZHNUb1N1cGVyKGUsIHRvKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjb3B5Tm9uUHJpdmF0ZU1ldGhvZHNGcm9tU3VwZXIoSGVhZGVyIGZyb20pIHsKKyAgICAgICAgZm9yIChFbnRyeSBlID0gZnJvbS5oZWFkOyBlICE9IG51bGw7IGUgPSBlLm5leHRDbGFzc0VudHJ5KQorICAgICAgICAgICAgY29weU5vblByaXZhdGVNZXRob2RzRnJvbVN1cGVyKGUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjb3B5Tm9uUHJpdmF0ZU1ldGhvZHMoRW50cnkgZnJvbSwgSGVhZGVyIHRvKSB7CisgICAgICAgIE9iamVjdCBvbGRMaXN0T3JNZXRob2QgPSBmcm9tLm1ldGhvZHM7CisgICAgICAgIGlmIChvbGRMaXN0T3JNZXRob2QgaW5zdGFuY2VvZiBGYXN0QXJyYXkpIHsKKyAgICAgICAgICAgIEZhc3RBcnJheSBvbGRMaXN0ID0gKEZhc3RBcnJheSkgb2xkTGlzdE9yTWV0aG9kOworICAgICAgICAgICAgRW50cnkgZSA9IG51bGw7CisgICAgICAgICAgICBpbnQgbGVuMSA9IG9sZExpc3Quc2l6ZSgpOworICAgICAgICAgICAgT2JqZWN0IGxpc3RbXSA9IG9sZExpc3QuZ2V0QXJyYXkoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqICE9IGxlbjE7ICsraikgeworICAgICAgICAgICAgICAgIE1ldGFNZXRob2QgbWV0aG9kID0gKE1ldGFNZXRob2QpIGxpc3Rbal07CisgICAgICAgICAgICAgICAgaWYgKG1ldGhvZC5pc1ByaXZhdGUoKSkgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgZSA9IGdldE9yUHV0TWV0aG9kcyhmcm9tLm5hbWUsIHRvKTsKKyAgICAgICAgICAgICAgICBlLm1ldGhvZHMgPSBhZGRNZXRob2RUb0xpc3QoZS5tZXRob2RzLCBtZXRob2QpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTWV0YU1ldGhvZCBtZXRob2QgPSAoTWV0YU1ldGhvZCkgb2xkTGlzdE9yTWV0aG9kOworICAgICAgICAgICAgaWYgKCFtZXRob2QuaXNQcml2YXRlKCkpIHsKKyAgICAgICAgICAgICAgICBFbnRyeSBlID0gZ2V0T3JQdXRNZXRob2RzKGZyb20ubmFtZSwgdG8pOworICAgICAgICAgICAgICAgIGUubWV0aG9kcyA9IGFkZE1ldGhvZFRvTGlzdChlLm1ldGhvZHMsIG1ldGhvZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY29weUFsbE1ldGhvZHNUb1N1cGVyKEVudHJ5IGZyb20sIEhlYWRlciB0bykgeworICAgICAgICBPYmplY3Qgb2xkTGlzdE9yTWV0aG9kID0gZnJvbS5tZXRob2RzOworICAgICAgICBpZiAob2xkTGlzdE9yTWV0aG9kIGluc3RhbmNlb2YgRmFzdEFycmF5KSB7CisgICAgICAgICAgICBGYXN0QXJyYXkgb2xkTGlzdCA9IChGYXN0QXJyYXkpIG9sZExpc3RPck1ldGhvZDsKKyAgICAgICAgICAgIEVudHJ5IGUgPSBudWxsOworICAgICAgICAgICAgaW50IGxlbjEgPSBvbGRMaXN0LnNpemUoKTsKKyAgICAgICAgICAgIE9iamVjdCBsaXN0W10gPSBvbGRMaXN0LmdldEFycmF5KCk7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiAhPSBsZW4xOyArK2opIHsKKyAgICAgICAgICAgICAgICBNZXRhTWV0aG9kIG1ldGhvZCA9IChNZXRhTWV0aG9kKSBsaXN0W2pdOworICAgICAgICAgICAgICAgIGlmIChlID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGUgPSBnZXRPclB1dE1ldGhvZHMoZnJvbS5uYW1lLCB0byk7CisgICAgICAgICAgICAgICAgZS5tZXRob2RzRm9yU3VwZXIgPSBhZGRNZXRob2RUb0xpc3QoZS5tZXRob2RzRm9yU3VwZXIsIG1ldGhvZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBNZXRhTWV0aG9kIG1ldGhvZCA9IChNZXRhTWV0aG9kKSBvbGRMaXN0T3JNZXRob2Q7CisgICAgICAgICAgICBFbnRyeSBlID0gZ2V0T3JQdXRNZXRob2RzKGZyb20ubmFtZSwgdG8pOworICAgICAgICAgICAgZS5tZXRob2RzRm9yU3VwZXIgPSBhZGRNZXRob2RUb0xpc3QoZS5tZXRob2RzRm9yU3VwZXIsIG1ldGhvZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY29weU5vblByaXZhdGVNZXRob2RzRnJvbVN1cGVyKEVudHJ5IGUpIHsKKyAgICAgICAgT2JqZWN0IG9sZExpc3RPck1ldGhvZCA9IGUubWV0aG9kc0ZvclN1cGVyOworICAgICAgICBpZiAob2xkTGlzdE9yTWV0aG9kID09IG51bGwpCisgICAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICAgICAgaWYgKG9sZExpc3RPck1ldGhvZCBpbnN0YW5jZW9mIEZhc3RBcnJheSkgeworICAgICAgICAgICAgRmFzdEFycmF5IG9sZExpc3QgPSAoRmFzdEFycmF5KSBvbGRMaXN0T3JNZXRob2Q7CisgICAgICAgICAgICBpbnQgbGVuMSA9IG9sZExpc3Quc2l6ZSgpOworICAgICAgICAgICAgT2JqZWN0IGxpc3RbXSA9IG9sZExpc3QuZ2V0QXJyYXkoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqICE9IGxlbjE7ICsraikgeworICAgICAgICAgICAgICAgIE1ldGFNZXRob2QgbWV0aG9kID0gKE1ldGFNZXRob2QpIGxpc3Rbal07CisgICAgICAgICAgICAgICAgaWYgKG1ldGhvZC5pc1ByaXZhdGUoKSkgY29udGludWU7CisgICAgICAgICAgICAgICAgZS5tZXRob2RzID0gYWRkTWV0aG9kVG9MaXN0KGUubWV0aG9kcywgbWV0aG9kKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE1ldGFNZXRob2QgbWV0aG9kID0gKE1ldGFNZXRob2QpIG9sZExpc3RPck1ldGhvZDsKKyAgICAgICAgICAgIGlmICghbWV0aG9kLmlzUHJpdmF0ZSgpKSB7CisgICAgICAgICAgICAgICAgZS5tZXRob2RzID0gYWRkTWV0aG9kVG9MaXN0KGUubWV0aG9kcywgbWV0aG9kKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNvcHlOb25Qcml2YXRlTWV0aG9kc0Rvd24oQ2xhc3MgZnJvbSwgQ2xhc3MgdG8pIHsKKyAgICAgICAgY29weU5vblByaXZhdGVOb25OZXdNZXRhTWV0aG9kcyhnZXRIZWFkZXIoZnJvbSksIGdldEhlYWRlcih0bykpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNvcHlOb25Qcml2YXRlTm9uTmV3TWV0YU1ldGhvZHMoSGVhZGVyIGZyb20sIEhlYWRlciB0bykgeworICAgICAgICBmb3IgKEVudHJ5IGUgPSBmcm9tLmhlYWQ7IGUgIT0gbnVsbDsgZSA9IGUubmV4dENsYXNzRW50cnkpCisgICAgICAgICAgICBjb3B5Tm9uUHJpdmF0ZU5vbk5ld01ldGFNZXRob2RzKGUsIHRvKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY29weU5vblByaXZhdGVOb25OZXdNZXRhTWV0aG9kcyhFbnRyeSBmcm9tLCBIZWFkZXIgdG8pIHsKKyAgICAgICAgT2JqZWN0IG9sZExpc3RPck1ldGhvZCA9IGZyb20ubWV0aG9kczsKKyAgICAgICAgaWYgKG9sZExpc3RPck1ldGhvZCA9PSBudWxsKQorICAgICAgICAgIHJldHVybjsKKyAgICAgICAgCisgICAgICAgIGlmIChvbGRMaXN0T3JNZXRob2QgaW5zdGFuY2VvZiBGYXN0QXJyYXkpIHsKKyAgICAgICAgICAgIEZhc3RBcnJheSBvbGRMaXN0ID0gKEZhc3RBcnJheSkgb2xkTGlzdE9yTWV0aG9kOworICAgICAgICAgICAgRW50cnkgZSA9IG51bGw7CisgICAgICAgICAgICBpbnQgbGVuMSA9IG9sZExpc3Quc2l6ZSgpOworICAgICAgICAgICAgT2JqZWN0IGxpc3RbXSA9IG9sZExpc3QuZ2V0QXJyYXkoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqICE9IGxlbjE7ICsraikgeworICAgICAgICAgICAgICAgIE1ldGFNZXRob2QgbWV0aG9kID0gKE1ldGFNZXRob2QpIGxpc3Rbal07CisgICAgICAgICAgICAgICAgaWYgKG1ldGhvZCBpbnN0YW5jZW9mIE5ld01ldGFNZXRob2QgfHwgbWV0aG9kLmlzUHJpdmF0ZSgpKSBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpZiAoZSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBlID0gZ2V0T3JQdXRNZXRob2RzKGZyb20ubmFtZSwgdG8pOworICAgICAgICAgICAgICAgIGUubWV0aG9kcyA9IGFkZE1ldGhvZFRvTGlzdChlLm1ldGhvZHMsIG1ldGhvZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBNZXRhTWV0aG9kIG1ldGhvZCA9IChNZXRhTWV0aG9kKSBvbGRMaXN0T3JNZXRob2Q7CisgICAgICAgICAgICBpZiAobWV0aG9kIGluc3RhbmNlb2YgTmV3TWV0YU1ldGhvZCB8fCBtZXRob2QuaXNQcml2YXRlKCkpIHJldHVybjsKKyAgICAgICAgICAgIEVudHJ5IGUgPSBnZXRPclB1dE1ldGhvZHMoZnJvbS5uYW1lLCB0byk7CisgICAgICAgICAgICBlLm1ldGhvZHMgPSBhZGRNZXRob2RUb0xpc3QoZS5tZXRob2RzLCBtZXRob2QpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBhZGRNZXRob2RUb0xpc3QoT2JqZWN0IG8sIE1ldGFNZXRob2QgbWV0aG9kKSB7CisgICAgICAgIGlmIChvID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtZXRob2Q7CisgICAgICAgIH0KKworICAgICAgICBpZiAobyBpbnN0YW5jZW9mIE1ldGFNZXRob2QpIHsKKyAgICAgICAgICAgIE1ldGFNZXRob2QgbWF0Y2ggPSAoTWV0YU1ldGhvZCkgbzsKKyAgICAgICAgICAgIGlmICghaXNNYXRjaGluZ01ldGhvZChtYXRjaCwgbWV0aG9kKSkgeworICAgICAgICAgICAgICAgIEZhc3RBcnJheSBsaXN0ID0gbmV3IEZhc3RBcnJheSgyKTsKKyAgICAgICAgICAgICAgICBsaXN0LmFkZChtYXRjaCk7CisgICAgICAgICAgICAgICAgbGlzdC5hZGQobWV0aG9kKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGlzdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKG1hdGNoLmlzUHJpdmF0ZSgpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAobWF0Y2guZ2V0RGVjbGFyaW5nQ2xhc3MoKS5pc0ludGVyZmFjZSgpICYmICFtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5pc0ludGVyZmFjZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3Qgb3ZlcndyaXRlIGludGVyZmFjZSBtZXRob2RzIHdpdGggaW5zdGFuY2UgbWV0aG9kcworICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3Qgb3ZlcndyaXRlIHByaXZhdGUgbWV0aG9kcworICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiBwcml2YXRlIG1ldGhvZHMgZnJvbSBwYXJlbnQgY2xhc3NlcyBhcmUgbm90IHNob3duIGhlcmUsCisgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCB3aGVuIGRvaW5nIHRoZSBtdWx0aW1ldGhvZCBjb25uZWN0aW9uIHN0ZXAsIHdlIG92ZXJ3cml0ZQorICAgICAgICAgICAgICAgICAgICAvLyBtZXRob2RzIG9mIHRoZSBwYXJlbnQgY2xhc3Mgd2l0aCBtZXRob2RzIG9mIGEgc3ViY2xhc3MgYW5kCisgICAgICAgICAgICAgICAgICAgIC8vIGluIHRoYXQgY2FzZSB3ZSB3YW50IHRvIGtlZXAgdGhlIHByaXZhdGUgbWV0aG9kcworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIENsYXNzIG1ldGhvZEMgPSBtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXRDYWNoZWRDbGFzcygpOworICAgICAgICAgICAgICAgICAgICBDbGFzcyBtYXRjaEMgPSBtYXRjaC5nZXREZWNsYXJpbmdDbGFzcygpLmdldENhY2hlZENsYXNzKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtZXRob2RDID09IG1hdGNoQykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZCBpbnN0YW5jZW9mIE5ld0luc3RhbmNlTWV0YU1ldGhvZCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgaW5zdGFuY2VvZiBOZXdTdGF0aWNNZXRhTWV0aG9kIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCBpbnN0YW5jZW9mIENsb3N1cmVNZXRhTWV0aG9kIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCBpbnN0YW5jZW9mIENsb3N1cmVTdGF0aWNNZXRhTWV0aG9kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghTWV0YUNsYXNzSGVscGVyLmlzQXNzaWduYWJsZUZyb20obWV0aG9kQywgbWF0Y2hDKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBvOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBGYXN0QXJyYXkpIHsKKyAgICAgICAgICAgIEZhc3RBcnJheSBsaXN0ID0gKEZhc3RBcnJheSkgbzsKKyAgICAgICAgICAgIGludCBmb3VuZCA9IGZpbmRNYXRjaGluZ01ldGhvZChsaXN0LCBtZXRob2QpOworCisgICAgICAgICAgICBpZiAoZm91bmQgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBsaXN0LmFkZChtZXRob2QpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBNZXRhTWV0aG9kIG1hdGNoID0gKE1ldGFNZXRob2QpIGxpc3QuZ2V0KGZvdW5kKTsKKyAgICAgICAgICAgICAgICBpZiAobWF0Y2g9PW1ldGhvZCkgcmV0dXJuIG87CisgICAgICAgICAgICAgICAgaWYgKG1hdGNoLmlzUHJpdmF0ZSgpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAobWF0Y2guZ2V0RGVjbGFyaW5nQ2xhc3MoKS5pc0ludGVyZmFjZSgpICYmICFtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5pc0ludGVyZmFjZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3Qgb3ZlcndyaXRlIGludGVyZmFjZSBtZXRob2RzIHdpdGggaW5zdGFuY2UgbWV0aG9kcworICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3Qgb3ZlcndyaXRlIHByaXZhdGUgbWV0aG9kcworICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiBwcml2YXRlIG1ldGhvZHMgZnJvbSBwYXJlbnQgY2xhc3NlcyBhcmUgbm90IHNob3duIGhlcmUsCisgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCB3aGVuIGRvaW5nIHRoZSBtdWx0aW1ldGhvZCBjb25uZWN0aW9uIHN0ZXAsIHdlIG92ZXJ3cml0ZQorICAgICAgICAgICAgICAgICAgICAvLyBtZXRob2RzIG9mIHRoZSBwYXJlbnQgY2xhc3Mgd2l0aCBtZXRob2RzIG9mIGEgc3ViY2xhc3MgYW5kCisgICAgICAgICAgICAgICAgICAgIC8vIGluIHRoYXQgY2FzZSB3ZSB3YW50IHRvIGtlZXAgdGhlIHByaXZhdGUgbWV0aG9kcworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIENsYXNzIG1ldGhvZEMgPSBtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXRDYWNoZWRDbGFzcygpOworICAgICAgICAgICAgICAgICAgICBDbGFzcyBtYXRjaEMgPSBtYXRjaC5nZXREZWNsYXJpbmdDbGFzcygpLmdldENhY2hlZENsYXNzKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtZXRob2RDID09IG1hdGNoQykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZCBpbnN0YW5jZW9mIE5ld0luc3RhbmNlTWV0YU1ldGhvZCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgaW5zdGFuY2VvZiBOZXdTdGF0aWNNZXRhTWV0aG9kIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCBpbnN0YW5jZW9mIENsb3N1cmVNZXRhTWV0aG9kIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCBpbnN0YW5jZW9mIENsb3N1cmVTdGF0aWNNZXRhTWV0aG9kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5zZXQoZm91bmQsIG1ldGhvZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIU1ldGFDbGFzc0hlbHBlci5pc0Fzc2lnbmFibGVGcm9tKG1ldGhvZEMsIG1hdGNoQykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3Quc2V0KGZvdW5kLCBtZXRob2QpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG87CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzTWF0Y2hpbmdNZXRob2QoTWV0YU1ldGhvZCBhTWV0aG9kLCBNZXRhTWV0aG9kIG1ldGhvZCkgeworICAgICAgICBpZiAoYU1ldGhvZD09bWV0aG9kKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgQ2FjaGVkQ2xhc3NbXSBwYXJhbXMxID0gYU1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOworICAgICAgICBDYWNoZWRDbGFzc1tdIHBhcmFtczIgPSBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKKyAgICAgICAgaWYgKHBhcmFtczEubGVuZ3RoICE9IHBhcmFtczIubGVuZ3RoKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIG1hdGNoZXMgPSB0cnVlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtczEubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChwYXJhbXMxW2ldICE9IHBhcmFtczJbaV0pIHsKKyAgICAgICAgICAgICAgICBtYXRjaGVzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1hdGNoZXM7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgZmluZE1hdGNoaW5nTWV0aG9kKEZhc3RBcnJheSBsaXN0LCBNZXRhTWV0aG9kIG1ldGhvZCkgeworICAgICAgICBpbnQgbGVuID0gbGlzdC5zaXplKCk7CisgICAgICAgIE9iamVjdCBkYXRhW10gPSBsaXN0LmdldEFycmF5KCk7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqICE9IGxlbjsgKytqKSB7CisgICAgICAgICAgICBNZXRhTWV0aG9kIGFNZXRob2QgPSAoTWV0YU1ldGhvZCkgZGF0YVtqXTsKKyAgICAgICAgICAgIGlmIChpc01hdGNoaW5nTWV0aG9kKGFNZXRob2QsIG1ldGhvZCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGo7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNvcHlNZXRob2RzVG9TdXBlcigpIHsKKyAgICAgICAgRW50cnlbXSB0YWJsZSA9IHRoaXMudGFibGU7CisgICAgICAgIGludCBsZW5ndGggPSB0YWJsZS5sZW5ndGg7CisKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBsZW5ndGg7IGorKykgeworICAgICAgICAgICAgZm9yIChFbnRyeSBlID0gdGFibGVbal07IGUgIT0gbnVsbDsgZSA9IGUubmV4dEhhc2hFbnRyeSkgeworICAgICAgICAgICAgICAgIGlmIChlLm1ldGhvZHMgaW5zdGFuY2VvZiBGYXN0QXJyYXkpCisgICAgICAgICAgICAgICAgICAgIGUubWV0aG9kc0ZvclN1cGVyID0gKChGYXN0QXJyYXkpIGUubWV0aG9kcykuY29weSgpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZS5tZXRob2RzRm9yU3VwZXIgPSBlLm1ldGhvZHM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNvcHkoQ2xhc3MgYywgSGVhZGVyIGluZGV4KSB7CisgICAgICAgIGNvcHkoZ2V0SGVhZGVyKGMpLCBpbmRleCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY29weShIZWFkZXIgZnJvbSwgSGVhZGVyIHRvKSB7CisgICAgICAgIGZvciAoRW50cnkgZSA9IGZyb20uaGVhZDsgZSAhPSBudWxsOyBlID0gZS5uZXh0Q2xhc3NFbnRyeSkKKyAgICAgICAgICAgIGNvcHlBbGxNZXRob2RzKGUsIHRvKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY29weUFsbE1ldGhvZHMoRW50cnkgZnJvbSwgSGVhZGVyIHRvKSB7CisgICAgICAgIE9iamVjdCBvbGRMaXN0T3JNZXRob2QgPSBmcm9tLm1ldGhvZHM7CisgICAgICAgIGlmIChvbGRMaXN0T3JNZXRob2QgaW5zdGFuY2VvZiBGYXN0QXJyYXkpIHsKKyAgICAgICAgICAgIEZhc3RBcnJheSBvbGRMaXN0ID0gKEZhc3RBcnJheSkgb2xkTGlzdE9yTWV0aG9kOworICAgICAgICAgICAgRW50cnkgZSA9IG51bGw7CisgICAgICAgICAgICBpbnQgbGVuMSA9IG9sZExpc3Quc2l6ZSgpOworICAgICAgICAgICAgT2JqZWN0IGxpc3RbXSA9IG9sZExpc3QuZ2V0QXJyYXkoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqICE9IGxlbjE7ICsraikgeworICAgICAgICAgICAgICAgIE1ldGFNZXRob2QgbWV0aG9kID0gKE1ldGFNZXRob2QpIGxpc3Rbal07CisgICAgICAgICAgICAgICAgaWYgKGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgZSA9IGdldE9yUHV0TWV0aG9kcyhmcm9tLm5hbWUsIHRvKTsKKyAgICAgICAgICAgICAgICBlLm1ldGhvZHMgPSBhZGRNZXRob2RUb0xpc3QoZS5tZXRob2RzLCBtZXRob2QpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTWV0YU1ldGhvZCBtZXRob2QgPSAoTWV0YU1ldGhvZCkgb2xkTGlzdE9yTWV0aG9kOworICAgICAgICAgICAgaWYgKCFtZXRob2QuaXNQcml2YXRlKCkpIHsKKyAgICAgICAgICAgICAgICBFbnRyeSBlID0gZ2V0T3JQdXRNZXRob2RzKGZyb20ubmFtZSwgdG8pOworICAgICAgICAgICAgICAgIGUubWV0aG9kcyA9IGFkZE1ldGhvZFRvTGlzdChlLm1ldGhvZHMsIG1ldGhvZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvbWV0YWNsYXNzL01ldGhvZEhlbHBlci5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9tZXRhY2xhc3MvTWV0aG9kSGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMyNDA1NwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvbWV0YWNsYXNzL01ldGhvZEhlbHBlci5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUubWV0YWNsYXNzOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOworCisvKioKKyAqIFNvbWUgcmVmbGVjdGlvbiBoZWxwZXIgbWV0aG9kcworICogCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgTWV0aG9kSGVscGVyIHsKKyAKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTdGF0aWMoTWV0aG9kIG1ldGhvZCkgeworICAgICAgICBpbnQgZmxhZ3MgPSBNb2RpZmllci5TVEFUSUM7CisgICAgICAgIHJldHVybiAobWV0aG9kLmdldE1vZGlmaWVycygpICYgKGZsYWdzKSkgPT0gZmxhZ3M7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUHVibGljKE1ldGhvZCBtZXRob2QpIHsKKyAgICAgICAgaW50IGZsYWdzID0gTW9kaWZpZXIuUFVCTElDOworICAgICAgICByZXR1cm4gKG1ldGhvZC5nZXRNb2RpZmllcnMoKSAmIChmbGFncykpID09IGZsYWdzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvbWV0YWNsYXNzL01ldGhvZFNlbGVjdGlvbkV4Y2VwdGlvbi5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9tZXRhY2xhc3MvTWV0aG9kU2VsZWN0aW9uRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQwOGI0MwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvbWV0YWNsYXNzL01ldGhvZFNlbGVjdGlvbkV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsOTkgQEAKKy8qDQorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUubWV0YWNsYXNzOw0KKw0KK2ltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlSdW50aW1lRXhjZXB0aW9uOw0KK2ltcG9ydCBncm9vdnkubGFuZy5NZXRhTWV0aG9kOw0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJlZmxlY3Rpb24uQ2FjaGVkQ29uc3RydWN0b3I7DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucmVmbGVjdGlvbi5GYXN0QXJyYXk7DQorDQoraW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOw0KKw0KKy8qKg0KKyAqIFRoaXMgZXhjZXB0aW9uIGlzIHRocm93biBpZiB0aGUgcnVudGltZSBpcyB1bmFibGUgdG8gc2VsZWN0DQorICogYSBtZXRob2QuIFRoaXMgY2xhc3MgYnVpbGRzIHRoZSBleGNlcHRpb24gdGV4dCB3aGVuIGNhbGxpbmcgDQorICogZ2V0TWVzc2FnZS4gPGJyLz4NCisgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBleGNlcHRpb24gYXMgZm9yIGludGVybmFsIHVzZSBvbmx5IQ0KKyAqIA0KKyAqIEBhdXRob3IgSm9jaGVuIFRoZW9kb3JvdQ0KKyAqIEBzaW5jZSBHcm9vdnkgMS4xDQorICovDQorcHVibGljIGNsYXNzIE1ldGhvZFNlbGVjdGlvbkV4Y2VwdGlvbiBleHRlbmRzIEdyb292eVJ1bnRpbWVFeGNlcHRpb24gew0KKw0KKyAgICBwcml2YXRlIFN0cmluZyBtZXRob2ROYW1lOw0KKyAgICBwcml2YXRlIEZhc3RBcnJheSBtZXRob2RzOw0KKyAgICBwcml2YXRlIENsYXNzW10gYXJndW1lbnRzOw0KKyAgICANCisgICAgLyoqDQorICAgICAqIENyZWF0ZXMgYSBuZXcgTWV0aG9kU2VsZWN0aW9uRXhjZXB0aW9uLg0KKyAgICAgKiBAcGFyYW0gbWV0aG9kTmFtZSBuYW1lIG9mIHRoZSBtZXRob2QNCisgICAgICogQHBhcmFtIG1ldGhvZHMgICAgYSBGYXN0QXJyYXkgb2YgbWV0aG9kcw0KKyAgICAgKiBAcGFyYW0gYXJndW1lbnRzICB0aGUgbWV0aG9kIGNhbGwgYXJndW1lbnQgY2xhc3Nlcw0KKyAgICAgKi8NCisgICAgcHVibGljIE1ldGhvZFNlbGVjdGlvbkV4Y2VwdGlvbihTdHJpbmcgbWV0aG9kTmFtZSwgRmFzdEFycmF5IG1ldGhvZHMsIENsYXNzW10gYXJndW1lbnRzKSB7DQorICAgICAgICBzdXBlcihtZXRob2ROYW1lKTsNCisgICAgICAgIHRoaXMubWV0aG9kTmFtZSA9IG1ldGhvZE5hbWU7DQorICAgICAgICB0aGlzLmFyZ3VtZW50cyA9IGFyZ3VtZW50czsNCisgICAgICAgIHRoaXMubWV0aG9kcyA9IG1ldGhvZHM7DQorICAgIH0NCisNCisgICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgew0KKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsNCisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIkNvdWxkIG5vdCBmaW5kIHdoaWNoIG1ldGhvZCAiKS5hcHBlbmQobWV0aG9kTmFtZSk7DQorICAgICAgICBhcHBlbmRDbGFzc05hbWVzKGJ1ZmZlcixhcmd1bWVudHMpOw0KKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiIHRvIGludm9rZSBmcm9tIHRoaXMgbGlzdDoiKTsNCisgICAgICAgIGFwcGVuZE1ldGhvZHMoYnVmZmVyKTsNCisgICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsNCisgICAgfQ0KKyAgICANCisgICAgDQorICAgIHByaXZhdGUgdm9pZCBhcHBlbmRDbGFzc05hbWVzKFN0cmluZ0J1ZmZlciBhcmdCdWYsIENsYXNzW10gY2xhc3Nlcykgew0KKyAgICAgICAgYXJnQnVmLmFwcGVuZCgiKCIpOw0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc2VzLmxlbmd0aDsgaSsrKSB7DQorICAgICAgICAgICAgaWYgKGkgPiAwKSB7DQorICAgICAgICAgICAgICAgIGFyZ0J1Zi5hcHBlbmQoIiwgIik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIENsYXNzIGNsYXp6ID0gY2xhc3Nlc1tpXTsNCisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGNsYXp6PT1udWxsPyAibnVsbCI6IGNsYXp6LmdldE5hbWUoKTsNCisgICAgICAgICAgICBhcmdCdWYuYXBwZW5kKG5hbWUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYXJnQnVmLmFwcGVuZCgiKSIpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIHZvaWQgYXBwZW5kTWV0aG9kcyhTdHJpbmdCdWZmZXIgYnVmZmVyKSB7DQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMuc2l6ZTsgaSsrKSB7DQorICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiXG4gICIpOw0KKyAgICAgICAgICAgIE9iamVjdCBtZXRob2RPckNvbnN0cnVjdG9yID0gbWV0aG9kcy5nZXQoaSk7DQorICAgICAgICAgICAgaWYgKG1ldGhvZE9yQ29uc3RydWN0b3IgaW5zdGFuY2VvZiBNZXRhTWV0aG9kKSB7DQorICAgICAgICAgICAgICAgIE1ldGFNZXRob2QgbWV0aG9kID0gKE1ldGFNZXRob2QpIG1ldGhvZE9yQ29uc3RydWN0b3I7DQorICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoTW9kaWZpZXIudG9TdHJpbmcobWV0aG9kLmdldE1vZGlmaWVycygpKSk7DQorICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiAiKS5hcHBlbmQobWV0aG9kLmdldFJldHVyblR5cGUoKS5nZXROYW1lKCkpOw0KKyAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIgIikuYXBwZW5kKG1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpLmdldE5hbWUoKSk7DQorICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiMiKTsNCisgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChtZXRob2QuZ2V0TmFtZSgpKTsNCisgICAgICAgICAgICAgICAgYXBwZW5kQ2xhc3NOYW1lcyhidWZmZXIsbWV0aG9kLmdldE5hdGl2ZVBhcmFtZXRlclR5cGVzKCkpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgICAgQ2FjaGVkQ29uc3RydWN0b3IgbWV0aG9kID0gKENhY2hlZENvbnN0cnVjdG9yKSBtZXRob2RPckNvbnN0cnVjdG9yOw0KKyAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKE1vZGlmaWVyLnRvU3RyaW5nKG1ldGhvZC5jYWNoZWRDb25zdHJ1Y3Rvci5nZXRNb2RpZmllcnMoKSkpOw0KKyAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIgIikuYXBwZW5kKG1ldGhvZC5jYWNoZWRDb25zdHJ1Y3Rvci5nZXREZWNsYXJpbmdDbGFzcygpLmdldE5hbWUoKSk7DQorICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiM8aW5pdD4iKTsNCisgICAgICAgICAgICAgICAgYXBwZW5kQ2xhc3NOYW1lcyhidWZmZXIsbWV0aG9kLmdldE5hdGl2ZVBhcmFtZXRlclR5cGVzKCkpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL21ldGFjbGFzcy9NaXNzaW5nTWV0aG9kRXhjZXB0aW9uTm9TdGFjay5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9tZXRhY2xhc3MvTWlzc2luZ01ldGhvZEV4Y2VwdGlvbk5vU3RhY2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjAzYmY1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9tZXRhY2xhc3MvTWlzc2luZ01ldGhvZEV4Y2VwdGlvbk5vU3RhY2suamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLm1ldGFjbGFzczsKKworaW1wb3J0IGdyb292eS5sYW5nLk1pc3NpbmdNZXRob2RFeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBNaXNzaW5nTWV0aG9kRXhjZXB0aW9uTm9TdGFjayBleHRlbmRzIE1pc3NpbmdNZXRob2RFeGNlcHRpb24geworCisgICAgcHVibGljIE1pc3NpbmdNZXRob2RFeGNlcHRpb25Ob1N0YWNrKFN0cmluZyBtZXRob2QsIENsYXNzIHR5cGUsIE9iamVjdFtdIGFyZ3VtZW50cykgeworICAgICAgICB0aGlzKG1ldGhvZCx0eXBlLGFyZ3VtZW50cyxmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIE1pc3NpbmdNZXRob2RFeGNlcHRpb25Ob1N0YWNrKFN0cmluZyBtZXRob2QsIENsYXNzIHR5cGUsIE9iamVjdFtdIGFyZ3VtZW50cywgYm9vbGVhbiBpc1N0YXRpYykgeworICAgICAgICBzdXBlciAobWV0aG9kLCB0eXBlLCBhcmd1bWVudHMsIGlzU3RhdGljKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVGhyb3dhYmxlIGZpbGxJblN0YWNrVHJhY2UoKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL21ldGFjbGFzcy9NaXNzaW5nUHJvcGVydHlFeGNlcHRpb25Ob1N0YWNrLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL21ldGFjbGFzcy9NaXNzaW5nUHJvcGVydHlFeGNlcHRpb25Ob1N0YWNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZkODNlMwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvbWV0YWNsYXNzL01pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbk5vU3RhY2suamF2YQpAQCAtMCwwICsxLDI5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLm1ldGFjbGFzczsKKworaW1wb3J0IGdyb292eS5sYW5nLk1pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbjsKKworcHVibGljIGNsYXNzIE1pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbk5vU3RhY2sgZXh0ZW5kcyBNaXNzaW5nUHJvcGVydHlFeGNlcHRpb24geworCisgICAgcHVibGljIE1pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbk5vU3RhY2soU3RyaW5nIHByb3BlcnR5TmFtZSwgQ2xhc3MgdGhlQ2xhc3MpIHsKKyAgICAgICAgc3VwZXIocHJvcGVydHlOYW1lLCB0aGVDbGFzcyk7CisgICAgfQorCisgICAgcHVibGljIFRocm93YWJsZSBmaWxsSW5TdGFja1RyYWNlKCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL21ldGFjbGFzcy9OZXdJbnN0YW5jZU1ldGFNZXRob2QuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvbWV0YWNsYXNzL05ld0luc3RhbmNlTWV0YU1ldGhvZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjZTBhMjgKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL21ldGFjbGFzcy9OZXdJbnN0YW5jZU1ldGFNZXRob2QuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLm1ldGFjbGFzczsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucmVmbGVjdGlvbi5DYWNoZWRNZXRob2Q7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKKworLyoqCisgKiBBIE1ldGFNZXRob2QgaW1wbGVtZW50YXRpb24gd2hlcmUgdGhlIHVuZGVybHlpbmcgbWV0aG9kIGlzIHJlYWxseSBhIHN0YXRpYworICogaGVscGVyIG1ldGhvZCBvbiBzb21lIGNsYXNzIGJ1dCBpdCBhcHBlYXJzIHRvIGJlIGFuIGluc3RhbmNlIG1ldGhvZCBvbiBhIGNsYXNzLgorICoKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgdXNlZCB0byBhZGQgbmV3IG1ldGhvZHMgdG8gdGhlIEpESyB3cml0aW5nIHRoZW0gYXMgbm9ybWFsCisgKiBzdGF0aWMgbWV0aG9kcyB3aXRoIHRoZSBmaXJzdCBwYXJhbWV0ZXIgYmVpbmcgdGhlIGNsYXNzIG9uIHdoaWNoIHRoZSBtZXRob2QgaXMgYWRkZWQuCisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIE5ld0luc3RhbmNlTWV0YU1ldGhvZCBleHRlbmRzIE5ld01ldGFNZXRob2QgeworCisKKyAgICBwdWJsaWMgTmV3SW5zdGFuY2VNZXRhTWV0aG9kKENhY2hlZE1ldGhvZCBtZXRob2QpIHsKKyAgICAgICAgc3VwZXIobWV0aG9kKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YXRpYygpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0TW9kaWZpZXJzKCkgeworICAgICAgICAvLyBsZXRzIGNsZWFyIHRoZSBzdGF0aWMgYml0CisgICAgICAgIHJldHVybiBNb2RpZmllci5QVUJMSUM7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBpbnZva2UoT2JqZWN0IG9iamVjdCwgT2JqZWN0W10gYXJndW1lbnRzKSAgeworICAgICAgICAvLyB3ZSBuZWVkIHRvIGNoZWF0IHVzaW5nIHRoZSB0eXBlCisgICAgICAgIGludCBzaXplID0gYXJndW1lbnRzLmxlbmd0aDsKKyAgICAgICAgT2JqZWN0W10gbmV3QXJndW1lbnRzID0gbmV3IE9iamVjdFtzaXplICsgMV07CisgICAgICAgIG5ld0FyZ3VtZW50c1swXSA9IG9iamVjdDsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShhcmd1bWVudHMsIDAsIG5ld0FyZ3VtZW50cywgMSwgc2l6ZSk7CisgICAgICAgIHJldHVybiBzdXBlci5pbnZva2UobnVsbCwgbmV3QXJndW1lbnRzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL21ldGFjbGFzcy9OZXdNZXRhTWV0aG9kLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL21ldGFjbGFzcy9OZXdNZXRhTWV0aG9kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZkZmVmYQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvbWV0YWNsYXNzL05ld01ldGFNZXRob2QuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLm1ldGFjbGFzczsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucmVmbGVjdGlvbi5DYWNoZWRDbGFzczsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJlZmxlY3Rpb24uQ2FjaGVkTWV0aG9kOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucmVmbGVjdGlvbi5QYXJhbWV0ZXJUeXBlczsKKworLyoqCisgKiBCYXNlIGNsYXNzIGZvciBOZXdJbnN0YW5jZU1ldGFNZXRob2QgYW5kIE5ld1N0YXRpY01ldGFNZXRob2QKKyAqLworcHVibGljIGNsYXNzIE5ld01ldGFNZXRob2QgZXh0ZW5kcyBSZWZsZWN0aW9uTWV0YU1ldGhvZCB7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDYWNoZWRDbGFzc1tdIEVNUFRZX1RZUEVfQVJSQVkgPSB7fTsKKyAgICBwcm90ZWN0ZWQgQ2FjaGVkQ2xhc3NbXSBieXRlY29kZVBhcmFtZXRlclR5cGVzIDsKKyAgICBwcm90ZWN0ZWQgUGFyYW1ldGVyVHlwZXMgcGFyYW1UeXBlczsKKworICAgIHB1YmxpYyBOZXdNZXRhTWV0aG9kKENhY2hlZE1ldGhvZCBtZXRob2QpIHsKKyAgICAgICAgc3VwZXIobWV0aG9kKTsKKyAgICAgICAgYnl0ZWNvZGVQYXJhbWV0ZXJUeXBlcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOworCisgICAgICAgIGludCBzaXplID0gYnl0ZWNvZGVQYXJhbWV0ZXJUeXBlcy5sZW5ndGg7CisgICAgICAgIENhY2hlZENsYXNzW10gbG9naWNhbFBhcmFtZXRlclR5cGVzOworICAgICAgICBpZiAoc2l6ZSA8PSAxKSB7CisgICAgICAgICAgICBsb2dpY2FsUGFyYW1ldGVyVHlwZXMgPSBFTVBUWV9UWVBFX0FSUkFZOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbG9naWNhbFBhcmFtZXRlclR5cGVzID0gbmV3IENhY2hlZENsYXNzWy0tc2l6ZV07CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ5dGVjb2RlUGFyYW1ldGVyVHlwZXMsIDEsIGxvZ2ljYWxQYXJhbWV0ZXJUeXBlcywgMCwgc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgcGFyYW1UeXBlcyA9IG5ldyBQYXJhbWV0ZXJUeXBlcyhsb2dpY2FsUGFyYW1ldGVyVHlwZXMpOworICAgIH0KKworICAgIHB1YmxpYyBQYXJhbWV0ZXJUeXBlcyBnZXRQYXJhbVR5cGVzKCkgeworICAgICAgICByZXR1cm4gcGFyYW1UeXBlczsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2FjaGVkQ2xhc3MgZ2V0RGVjbGFyaW5nQ2xhc3MoKSB7CisgICAgICAgIHJldHVybiBnZXRCeXRlY29kZVBhcmFtZXRlclR5cGVzKClbMF07CisgICAgfQorCisgICAgcHVibGljIENhY2hlZENsYXNzW10gZ2V0Qnl0ZWNvZGVQYXJhbWV0ZXJUeXBlcygpIHsKKyAgICAgICAgcmV0dXJuIGJ5dGVjb2RlUGFyYW1ldGVyVHlwZXM7CisgICAgfQorCisgICAgcHVibGljIENhY2hlZENsYXNzIGdldE93bmVyQ2xhc3MoKSB7CisgICAgICAgIHJldHVybiBnZXRCeXRlY29kZVBhcmFtZXRlclR5cGVzKClbMF07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9tZXRhY2xhc3MvTmV3U3RhdGljTWV0YU1ldGhvZC5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9tZXRhY2xhc3MvTmV3U3RhdGljTWV0YU1ldGhvZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNGRjZWEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL21ldGFjbGFzcy9OZXdTdGF0aWNNZXRhTWV0aG9kLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5tZXRhY2xhc3M7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJlZmxlY3Rpb24uQ2FjaGVkTWV0aG9kOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7CisKKy8qKgorICogQSBNZXRhTWV0aG9kIGltcGxlbWVudGF0aW9uIHdoZXJlIHRoZSB1bmRlcmx5aW5nIG1ldGhvZCBpcyByZWFsbHkgYSBzdGF0aWMKKyAqIGhlbHBlciBtZXRob2Qgb24gc29tZSBjbGFzcy4KKyAqCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIHVzZWQgdG8gYWRkIG5ldyBzdGF0aWMgbWV0aG9kcyB0byB0aGUgSkRLIHdyaXRpbmcgdGhlbSBhcyBub3JtYWwKKyAqIHN0YXRpYyBtZXRob2RzIHdpdGggdGhlIGZpcnN0IHBhcmFtZXRlciBiZWluZyB0aGUgY2xhc3Mgb24gd2hpY2ggdGhlIG1ldGhvZCBpcyBhZGRlZC4KKyAqCisgKiBAYXV0aG9yIEd1aWxsYXVtZSBMYWZvcmdlCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBOZXdTdGF0aWNNZXRhTWV0aG9kIGV4dGVuZHMgTmV3TWV0YU1ldGhvZCB7CisKKyAgICBwdWJsaWMgTmV3U3RhdGljTWV0YU1ldGhvZChDYWNoZWRNZXRob2QgbWV0aG9kKSB7CisgICAgICAgIHN1cGVyKG1ldGhvZCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNTdGF0aWMoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0TW9kaWZpZXJzKCkgeworICAgICAgICByZXR1cm4gTW9kaWZpZXIuUFVCTElDIHwgTW9kaWZpZXIuU1RBVElDOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgaW52b2tlKE9iamVjdCBvYmplY3QsIE9iamVjdFtdIGFyZ3VtZW50cykgeworICAgICAgICBpbnQgc2l6ZSA9IGFyZ3VtZW50cy5sZW5ndGg7CisgICAgICAgIE9iamVjdFtdIG5ld0FyZ3VtZW50cyA9IG5ldyBPYmplY3Rbc2l6ZSArIDFdOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGFyZ3VtZW50cywgMCwgbmV3QXJndW1lbnRzLCAxLCBzaXplKTsKKyAgICAgICAgbmV3QXJndW1lbnRzWzBdID0gbnVsbDsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmludm9rZShudWxsLCBuZXdBcmd1bWVudHMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvbWV0YWNsYXNzL1JlZmxlY3Rpb25NZXRhTWV0aG9kLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL21ldGFjbGFzcy9SZWZsZWN0aW9uTWV0YU1ldGhvZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MmNiM2QKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL21ldGFjbGFzcy9SZWZsZWN0aW9uTWV0YU1ldGhvZC5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUubWV0YWNsYXNzOworCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuTWV0YU1ldGhvZDsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJlZmxlY3Rpb24uQ2FjaGVkQ2xhc3M7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5yZWZsZWN0aW9uLkNhY2hlZE1ldGhvZDsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJlZmxlY3Rpb24uUGFyYW1ldGVyVHlwZXM7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLkludm9rZXJJbnZvY2F0aW9uRXhjZXB0aW9uOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisKK3B1YmxpYyBjbGFzcyBSZWZsZWN0aW9uTWV0YU1ldGhvZCBleHRlbmRzIE1ldGFNZXRob2QgeworICAgIHByb3RlY3RlZCBmaW5hbCBDYWNoZWRNZXRob2QgbWV0aG9kOworCisgICAgcHVibGljIFJlZmxlY3Rpb25NZXRhTWV0aG9kKENhY2hlZE1ldGhvZCBtZXRob2QpIHsKKyAgICAgICAgdGhpcy5tZXRob2QgPSBtZXRob2Q7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRNb2RpZmllcnMoKSB7CisgICAgICAgIHJldHVybiBtZXRob2QuZ2V0TW9kaWZpZXJzKCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbWV0aG9kLmdldE5hbWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3MgZ2V0UmV0dXJuVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIG1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7CisgICAgfQorCisgICAgcHVibGljIENhY2hlZENsYXNzIGdldERlY2xhcmluZ0NsYXNzKCkgeworICAgICAgICByZXR1cm4gbWV0aG9kLmNhY2hlZENsYXNzOworICAgIH0KKworICAgIHB1YmxpYyBQYXJhbWV0ZXJUeXBlcyBnZXRQYXJhbVR5cGVzKCkgeworICAgICAgICByZXR1cm4gbWV0aG9kOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgaW52b2tlKE9iamVjdCBvYmplY3QsIE9iamVjdFtdIGFyZ3VtZW50cykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG1ldGhvZC5zZXRBY2Nlc3NpYmxlKCkuaW52b2tlKG9iamVjdCwgYXJndW1lbnRzKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnZva2VySW52b2NhdGlvbkV4Y2VwdGlvbihlKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW52b2tlckludm9jYXRpb25FeGNlcHRpb24oZSk7CisgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludm9rZXJJbnZvY2F0aW9uRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNNZXRob2QoTWV0aG9kIG1ldGhvZCkgeworICAgICAgICByZXR1cm4gbWV0aG9kID09IHRoaXMubWV0aG9kLmNhY2hlZE1ldGhvZCB8fCBzdXBlci5pc01ldGhvZChtZXRob2QpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcgKCkgeworICAgICAgICByZXR1cm4gbWV0aG9kLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9tZXRhY2xhc3MvUmVmbGVjdG9yTG9hZGVyLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL21ldGFjbGFzcy9SZWZsZWN0b3JMb2FkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDE1Y2FiCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9tZXRhY2xhc3MvUmVmbGVjdG9yTG9hZGVyLmphdmEKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5tZXRhY2xhc3M7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuUmVmbGVjdG9yOworCitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcm90ZWN0aW9uRG9tYWluOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogUmVmbGVjdG9yIGNyZWF0aW9uIGhlbHBlci4gVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGRlZmluZSB0aGUgUmVmbG9jdG9yIGNsYXNzZXMuCisgKiBGb3IgZWFjaCBDbGFzc0xvYWRlciBzdWNoIGEgbG9hZGVyIHdpbGwgYmUgY3JlYXRlZCBieSBNZXRhQ2xhc3MuCisgKiBTcGVjaWFsIGFib3V0IHRoaXMgbG9hZGVyIGlzLCB0aGF0IGl0IGtub3dzIHRoZSBjbGFzc2VzIGZvcm0gdGhlIAorICogR3Jvb3Z5IFJ1bnRpbWUuIFRoZSBSZWZsZWN0b3IgY2xhc3MgaXMgcmVzb2x2ZWQgaW4gZGlmZmVyZW50IHdheXM6IER1cmluZworICogdGhlIGRlZmluaXRpb24gb2YgYSBjbGFzcyBSZWZsZWN0b3Igd2lsbCByZXNvbHZlIHRvIHRoZSBSZWZsZWN0b3IgY2xhc3Mgb2YKKyAqIHRoZSBydW50aW1lLCBldmVuIGlmIHRoZXJlIGlzIGFub3RoZXIgUmVmbGVjdG9yIGNsYXNzIGluIHRoZSBwYXJlbnQgbG9hZGVyLgorICogQWZ0ZXIgdGhlIG5ldyBjbGFzcyBpcyBkZWZpbmVkIFJlZmxlY3RvciB3aWxsIHJlc29sdmUgbGlrZSBvdGhlciBHcm9vdnkKKyAqIGNsYXNzZXMuIFRoaXMgbG9hZGVyIGlzIGFibGUgdG8gcmVzb2x2ZSBhbGwgR3Jvb3Z5IGNsYXNzZXMgZXZlbiBpZiB0aGUKKyAqIHBhcmVudCBkb2VzIG5vdCBrbm93IHRoZW0sIGJ1dCB0aGUgcGFyZW50IHNlcnZlcyBmaXJzdCAoUmVmbGVjdG9yIGR1cmluZyBhCisgKiBjbGFzcyBkZWZpbnRpb24gaXMgZGlmZmVyZW50KS4gCisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmJsYWNrZHJhZ0BnbXgub3JnIj5Kb2NoZW4gVGhlb2Rvcm91PC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgUmVmbGVjdG9yTG9hZGVyIGV4dGVuZHMgQ2xhc3NMb2FkZXIgeworICAgIHByaXZhdGUgYm9vbGVhbiBpbkRlZmluZSA9IGZhbHNlOworICAgIHByaXZhdGUgZmluYWwgTWFwIGxvYWRlZENsYXNzZXMgPSBuZXcgSGFzaE1hcCgpOworICAgIHByaXZhdGUgZmluYWwgQ2xhc3NMb2FkZXIgZGVsZWdhdGF0aW9uTG9hZGVyOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRkxFQ1RPUiA9IFJlZmxlY3Rvci5jbGFzcy5nZXROYW1lKCk7CisgICAgCisgICAgLyoqCisgICAgICogVHJpZXMgdG8gZmluZCBhIEdyb292eSBjbGFzcy4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBjbGFzcyBpZiBmb3VuZAorICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZiBub3QgZm91bmQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ2xhc3MgZmluZENsYXNzKFN0cmluZyBuYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChkZWxlZ2F0YXRpb25Mb2FkZXI9PW51bGwpIHJldHVybiBzdXBlci5maW5kQ2xhc3MobmFtZSk7CisgICAgICAgIHJldHVybiBkZWxlZ2F0YXRpb25Mb2FkZXIubG9hZENsYXNzKG5hbWUpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBMb2FkcyBhIGNsYXNzIHBlciBuYW1lLiBVbmxpa2UgYSBub3JtYWwgbG9hZENsYXNzIHRoaXMgdmVyc2lvbgorICAgICAqIGJlaGF2ZXMgZGlmZmVyZW50IGR1cmluZyBhIGNsYXNzIGRlZmluaXRpb24uIEluIHRoYXQgY2FzZSBpdAorICAgICAqIGNoZWNrcyBpZiB0aGUgY2xhc3Mgd2Ugd2FudCB0byBsb2FkIGlzIFJlZmxlY3RvciBhbmQgcmV0dXJucyAKKyAgICAgKiBjbGFzcyBpZiB0aGUgY2hlY2sgaXMgc3VjY2Vzc2Z1bC4gSWYgaXQgaXMgbm90IGR1cmluZyBhIGNsYXNzCisgICAgICogZGVmaW5pdGlvbiBpdCBqdXN0IGNhbGxzIHRoZSBzdXBlciBjbGFzcyB2ZXJzaW9uIG9mIGxvYWRDbGFzcy4gCisgICAgICogCisgICAgICogQHBhcmFtIG5hbWUgb2YgdGhlIGNsYXNzIHRvIGxvYWQKKyAgICAgKiBAcGFyYW0gcmVzb2x2ZSBpcyB0cnVlIGlmIHRoZSBjbGFzcyBzaG91bGQgYmUgcmVzb2x2ZWQKKyAgICAgKiBAc2VlIFJlZmxlY3RvcgorICAgICAqIEBzZWUgQ2xhc3NMb2FkZXIjbG9hZENsYXNzKFN0cmluZywgYm9vbGVhbikKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIENsYXNzIGxvYWRDbGFzcyhTdHJpbmcgbmFtZSwgYm9vbGVhbiByZXNvbHZlKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpbkRlZmluZSkgeworICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKFJFRkxFQ1RPUikpIHJldHVybiBSZWZsZWN0b3IuY2xhc3M7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLmxvYWRDbGFzcyhuYW1lLCByZXNvbHZlKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogaGVscGVyIG1ldGhvZCB0byBkZWZpbmUgUmVmbGVjdG9yIGNsYXNzZXMuCisgICAgICogQHBhcmFtIG5hbWUgb2YgdGhlIFJlZmxlY3RvcgorICAgICAqIEBwYXJhbSBieXRlY29kZSB0aGUgYnl0ZWNvZGUKKyAgICAgKiBAcGFyYW0gZG9tYWluICB0aGUgcHJvdGVjdGlvbiBkb21haW4KKyAgICAgKiBAcmV0dXJuIHRoZSBnZW5lcmF0ZWQgY2xhc3MKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIENsYXNzIGRlZmluZUNsYXNzKFN0cmluZyBuYW1lLCBieXRlW10gYnl0ZWNvZGUsIFByb3RlY3Rpb25Eb21haW4gZG9tYWluKSB7CisgICAgICAgIGluRGVmaW5lID0gdHJ1ZTsKKyAgICAgICAgQ2xhc3MgYyA9IGRlZmluZUNsYXNzKG5hbWUsIGJ5dGVjb2RlLCAwLCBieXRlY29kZS5sZW5ndGgsIGRvbWFpbik7CisgICAgICAgIGxvYWRlZENsYXNzZXMucHV0KG5hbWUsYyk7IAorICAgICAgICByZXNvbHZlQ2xhc3MoYyk7CisgICAgICAgIGluRGVmaW5lID0gZmFsc2U7CisgICAgICAgIHJldHVybiBjOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBjcmVhdGVzIGEgUmVsZmVjdG9yTG9hZGVyLiAKKyAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgbG9hZGVyLiBUaGlzIHNob3VsZCBuZXZlciBiZSBudWxsIQorICAgICAqLworICAgIHB1YmxpYyBSZWZsZWN0b3JMb2FkZXIoQ2xhc3NMb2FkZXIgcGFyZW50KSB7CisgICAgICAgIHN1cGVyKHBhcmVudCk7CisgICAgICAgIGRlbGVnYXRhdGlvbkxvYWRlciA9IGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogdHJ5IHRvIGxvYWQgb25lIG9mIHRoZSBkZWZpbmVkIFJlZmxlY3RvciBjbGFzc2VzIGJ5IG5hbWUuCisgICAgICogQHBhcmFtIG5hbWUgb2YgdGhlIFJlZmxlY3RvciBjbGFzcworICAgICAqIEByZXR1cm4gdGhlIFJlZmxlY3RvciBjbGFzcyBpZiBkZWZpbmVkIGVsc2UgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIENsYXNzIGdldExvYWRlZENsYXNzKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiAoQ2xhc3MpbG9hZGVkQ2xhc3Nlcy5nZXQobmFtZSk7CisgICAgfQorCisgICAgc3RhdGljIFN0cmluZyBnZXRSZWZsZWN0b3JOYW1lKENsYXNzIHRoZUNsYXNzKSB7CisgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSB0aGVDbGFzcy5nZXROYW1lKCk7CisgICAgICAgIGlmIChjbGFzc05hbWUuc3RhcnRzV2l0aCgiamF2YS4iKSkgeworICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VQcmVmaXggPSAiZ2pkay4iOworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBwYWNrYWdlUHJlZml4ICsgY2xhc3NOYW1lICsgIl9Hcm9vdnlSZWZsZWN0b3IiOworICAgICAgICAgICAgaWYgKHRoZUNsYXNzLmlzQXJyYXkoKSkgeworICAgICAgICAgICAgICAgICAgIENsYXNzIGNsYXp6ID0gdGhlQ2xhc3M7CisgICAgICAgICAgICAgICAgICAgbmFtZSA9IHBhY2thZ2VQcmVmaXg7CisgICAgICAgICAgICAgICAgICAgaW50IGxldmVsID0gMDsKKyAgICAgICAgICAgICAgICAgICB3aGlsZSAoY2xhenouaXNBcnJheSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgY2xhenogPSBjbGF6ei5nZXRDb21wb25lbnRUeXBlKCk7CisgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwrKzsKKyAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU3RyaW5nIGNvbXBvbmVudE5hbWUgPSBjbGF6ei5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgbmFtZSA9IHBhY2thZ2VQcmVmaXggKyBjb21wb25lbnROYW1lICsgIl9Hcm9vdnlSZWZsZWN0b3JBcnJheSI7CisgICAgICAgICAgICAgICAgaWYgKGxldmVsPjEpIG5hbWUgKz0gbGV2ZWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gY2xhc3NOYW1lLnJlcGxhY2UoJyQnLCdfJykgKyAiX0dyb292eVJlZmxlY3RvciI7CisgICAgICAgICAgICBpZiAodGhlQ2xhc3MuaXNBcnJheSgpKSB7CisgICAgICAgICAgICAgICAgICAgQ2xhc3MgY2xhenogPSB0aGVDbGFzczsKKyAgICAgICAgICAgICAgICAgICBpbnQgbGV2ZWwgPSAwOworICAgICAgICAgICAgICAgICAgIHdoaWxlIChjbGF6ei5pc0FycmF5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICBjbGF6eiA9IGNsYXp6LmdldENvbXBvbmVudFR5cGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICBsZXZlbCsrOworICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTdHJpbmcgY29tcG9uZW50TmFtZSA9IGNsYXp6LmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICBuYW1lID0gY29tcG9uZW50TmFtZS5yZXBsYWNlKCckJywnXycpICsgIl9Hcm9vdnlSZWZsZWN0b3JBcnJheSI7CisgICAgICAgICAgICAgICAgaWYgKGxldmVsPjEpIG5hbWUgKz0gbGV2ZWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvbWV0YWNsYXNzL1RlbXBvcmFyeU1ldGhvZEtleS5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9tZXRhY2xhc3MvVGVtcG9yYXJ5TWV0aG9kS2V5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTliNmI3MAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvbWV0YWNsYXNzL1RlbXBvcmFyeU1ldGhvZEtleS5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUubWV0YWNsYXNzOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLk1ldGhvZEtleTsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuTWV0YUNsYXNzSGVscGVyOworCisKKy8qKgorICogQSB0ZW1wb3JhcnkgaW1wbGVtZW50YXRpb24gb2YgTWV0aG9kS2V5IHVzZWQgdG8gcGVyZm9ybSBhIGZhc3QgbG9va3VwCisgKiBmb3IgYSBtZXRob2QgdXNpbmcgYSBzZXQgb2YgYXJndW1lbnRzIHRvIGEgbWV0aG9kCisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBUZW1wb3JhcnlNZXRob2RLZXkgZXh0ZW5kcyBNZXRob2RLZXkgeworCisgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3RbXSBwYXJhbWV0ZXJWYWx1ZXM7CisKKyAgICBwdWJsaWMgVGVtcG9yYXJ5TWV0aG9kS2V5KENsYXNzIHNlbmRlciwgU3RyaW5nIG5hbWUsIE9iamVjdFtdIHBhcmFtZXRlclZhbHVlcywgYm9vbGVhbiBpc0NhbGxUb1N1cGVyKSB7CisgICAgICAgIHN1cGVyKHNlbmRlciwgbmFtZSwgaXNDYWxsVG9TdXBlcik7CisgICAgICAgIGlmIChwYXJhbWV0ZXJWYWx1ZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgcGFyYW1ldGVyVmFsdWVzID0gTWV0YUNsYXNzSGVscGVyLkVNUFRZX0FSUkFZOworICAgICAgICB9CisgICAgICAgIHRoaXMucGFyYW1ldGVyVmFsdWVzID0gcGFyYW1ldGVyVmFsdWVzOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UGFyYW1ldGVyQ291bnQoKSB7CisgICAgICAgIHJldHVybiBwYXJhbWV0ZXJWYWx1ZXMubGVuZ3RoOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzcyBnZXRQYXJhbWV0ZXJUeXBlKGludCBpbmRleCkgeworICAgICAgICBPYmplY3QgdmFsdWUgPSBwYXJhbWV0ZXJWYWx1ZXNbaW5kZXhdOworCisgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICkgeworICAgICAgICAgICAgQ2xhc3MgdHlwZSA9IChDbGFzcykoKHZhbHVlLmdldENsYXNzKCkgPT0gamF2YS5sYW5nLkNsYXNzLmNsYXNzKSA/CisgICAgICAgICAgICAgICAgICAgIHZhbHVlIDoKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICByZXR1cm4gdHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBPYmplY3QuY2xhc3M7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9tZXRhY2xhc3MvVGhyZWFkTWFuYWdlZE1ldGFCZWFuUHJvcGVydHkuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvbWV0YWNsYXNzL1RocmVhZE1hbmFnZWRNZXRhQmVhblByb3BlcnR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVlMDM2MwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvbWV0YWNsYXNzL1RocmVhZE1hbmFnZWRNZXRhQmVhblByb3BlcnR5LmphdmEKQEAgLTAsMCArMSwyNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUubWV0YWNsYXNzOworCisKK2ltcG9ydCBncm9vdnkubGFuZy5DbG9zdXJlOworaW1wb3J0IGdyb292eS5sYW5nLk1ldGFCZWFuUHJvcGVydHk7CitpbXBvcnQgZ3Jvb3Z5LmxhbmcuTWV0YU1ldGhvZDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLldlYWtIYXNoTWFwOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5yZWZsZWN0aW9uLkNhY2hlZENsYXNzOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucmVmbGVjdGlvbi5SZWZsZWN0aW9uQ2FjaGU7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5yZWZsZWN0aW9uLlBhcmFtZXRlclR5cGVzOworCisvKioKKyAqIFRoaXMgTWV0YUJlYW5Qcm9wZXJ0eSB3aWxsIGNyZWF0ZSBhIHBzZXVkbyBwcm9wZXJ0eSB3aG9zZSB2YWx1ZSBpcyBib3VuZCB0byB0aGUgY3VycmVudAorICogVGhyZWFkIHVzaW5nIHNvZnQgcmVmZXJlbmNlcy4gVGhlIHZhbHVlcyB3aWxsIGdvIG91dCBvZiBzY29wZSBhbmQgYmUgZ2FyYWJhZ2UgY29sbGVjdGVkIHdoZW4KKyAqIHRoZSBUaHJlYWQgZGllcyBvciB3aGVuIG1lbW9yeSBpcyByZXF1aXJlZCBieSB0aGUgSlZNCisgKiA8cC8+CisgKiBUaGUgcHJvcGVydHkgdXNlcyBhbiBJbmhlcml0YWJsZVRocmVhZExvY2FsIGluc3RhbmNlIGludGVybmFsbHkgc28gY2hpbGQgdGhyZWFkcyB3aWxsIHN0aWxsIGJlIGFibGUKKyAqIHRvIHNlZSB0aGUgcHJvcGVydHkKKyAqCisgKiBAYXV0aG9yIEdyYWVtZSBSb2NoZXIKKyAqIEBzaW5jZSAxLjEKKyAqLworcHVibGljIGNsYXNzIFRocmVhZE1hbmFnZWRNZXRhQmVhblByb3BlcnR5IGV4dGVuZHMgTWV0YUJlYW5Qcm9wZXJ0eSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2FjaGVkQ2xhc3NbXSBaRVJPX0FSR1VNRU5UX0xJU1QgPSBuZXcgQ2FjaGVkQ2xhc3NbMF07CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGhyZWFkTG9jYWwgUFJPUEVSVFlfSU5TVEFOQ0VfSE9MREVSID0gbmV3IEluaGVyaXRhYmxlVGhyZWFkTG9jYWwoKTsKKworICAgIHByaXZhdGUgQ2xhc3MgZGVjbGFyaW5nQ2xhc3M7CisgICAgcHJpdmF0ZSBUaHJlYWRCb3VuZEdldHRlciBnZXR0ZXI7CisgICAgcHJpdmF0ZSBUaHJlYWRCb3VuZFNldHRlciBzZXR0ZXI7CisgICAgcHJpdmF0ZSBPYmplY3QgaW5pdGlhbFZhbHVlOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9TRVRfUFJFRklYID0gInNldCI7CisgICAgcHJpdmF0ZSBDbG9zdXJlIGluaXRpYWxWYWx1ZUNyZWF0b3I7CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIFRocmVhZEJvdW5kIHByb3BlcnR5CisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBpbml0aWFsIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBPYmplY3QgZ2V0SW5pdGlhbFZhbHVlKCkgeworICAgICAgICByZXR1cm4gZ2V0SW5pdGlhbFZhbHVlKG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0IGdldEluaXRpYWxWYWx1ZShPYmplY3Qgb2JqZWN0KSB7CisgICAgICAgIGlmIChpbml0aWFsVmFsdWVDcmVhdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBpbml0aWFsVmFsdWVDcmVhdG9yLmNhbGwob2JqZWN0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW5pdGlhbFZhbHVlOworCisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc3VyZSByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhlIGluaXRpYWwgdmFsdWUgb2YgdGhyZWFkLW1hbmFnZWQgYmVhbiBwcm9wZXJ0aWVzCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2FsbGFibGUgVGhlIGNsb3N1cmUgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoZSBpbml0aWFsIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW5pdGlhbFZhbHVlQ3JlYXRvcihDbG9zdXJlIGNhbGxhYmxlKSB7CisgICAgICAgIHRoaXMuaW5pdGlhbFZhbHVlQ3JlYXRvciA9IGNhbGxhYmxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgVGhyZWFkTWFuYWdlZEJlYW5Qcm9wZXJ0eSBmb3IgdGhlIGdpdmVuIGFyZ3VtZW50cworICAgICAqCisgICAgICogQHBhcmFtIGRlY2xhcmluZ0NsYXNzIFRoZSBjbGFzcyB0aGF0IGRlY2xhcmVzIHRoZSBwcm9wZXJ0eQorICAgICAqIEBwYXJhbSBuYW1lICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkKKyAgICAgKiBAcGFyYW0gdHlwZSAgICAgICAgICAgVGhlIHR5cGUgb2YgdGhlIHByb3BlcnR5CisgICAgICogQHBhcmFtIGl2ICAgICAgICAgICAgIFRoZSBwcm9wZXJ0aWVzIGluaXRpYWwgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgVGhyZWFkTWFuYWdlZE1ldGFCZWFuUHJvcGVydHkoQ2xhc3MgZGVjbGFyaW5nQ2xhc3MsIFN0cmluZyBuYW1lLCBDbGFzcyB0eXBlLCBPYmplY3QgaXYpIHsKKyAgICAgICAgc3VwZXIobmFtZSwgdHlwZSwgbnVsbCwgbnVsbCk7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgIHRoaXMuZGVjbGFyaW5nQ2xhc3MgPSBkZWNsYXJpbmdDbGFzczsKKworICAgICAgICB0aGlzLmdldHRlciA9IG5ldyBUaHJlYWRCb3VuZEdldHRlcihuYW1lKTsKKyAgICAgICAgdGhpcy5zZXR0ZXIgPSBuZXcgVGhyZWFkQm91bmRTZXR0ZXIobmFtZSk7CisgICAgICAgIGluaXRpYWxWYWx1ZSA9IGl2OworCisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBUaHJlYWRNYW5hZ2VkQmVhblByb3BlcnR5IGZvciB0aGUgZ2l2ZW4gYXJndW1lbnRzCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVjbGFyaW5nQ2xhc3MgICAgICBUaGUgY2xhc3MgdGhhdCBkZWNsYXJlcyB0aGUgcHJvcGVydHkKKyAgICAgKiBAcGFyYW0gbmFtZSAgICAgICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkKKyAgICAgKiBAcGFyYW0gdHlwZSAgICAgICAgICAgICAgICBUaGUgdHlwZSBvZiB0aGUgcHJvcGVydHkKKyAgICAgKiBAcGFyYW0gaW5pdGlhbFZhbHVlQ3JlYXRvciBUaGUgY2xvc3VyZSByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhlIGluaXRpYWwgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgVGhyZWFkTWFuYWdlZE1ldGFCZWFuUHJvcGVydHkoQ2xhc3MgZGVjbGFyaW5nQ2xhc3MsIFN0cmluZyBuYW1lLCBDbGFzcyB0eXBlLCBDbG9zdXJlIGluaXRpYWxWYWx1ZUNyZWF0b3IpIHsKKyAgICAgICAgc3VwZXIobmFtZSwgdHlwZSwgbnVsbCwgbnVsbCk7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgIHRoaXMuZGVjbGFyaW5nQ2xhc3MgPSBkZWNsYXJpbmdDbGFzczsKKworICAgICAgICB0aGlzLmdldHRlciA9IG5ldyBUaHJlYWRCb3VuZEdldHRlcihuYW1lKTsKKyAgICAgICAgdGhpcy5zZXR0ZXIgPSBuZXcgVGhyZWFkQm91bmRTZXR0ZXIobmFtZSk7CisgICAgICAgIHRoaXMuaW5pdGlhbFZhbHVlQ3JlYXRvciA9IGluaXRpYWxWYWx1ZUNyZWF0b3I7CisKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBPYmplY3QgZ2V0VGhyZWFkQm91bmRQcm9wZXJ0eVZhbHVlKE9iamVjdCBvYmosIFN0cmluZyBuYW1lLCBPYmplY3QgaW5pdGlhbFZhbHVlKSB7CisgICAgICAgIE1hcCBwcm9wZXJ0eU1hcCA9IGdldFRocmVhZEJvdW5kUHJvcGVydE1hcCgpOworICAgICAgICBTdHJpbmcga2V5ID0gU3lzdGVtLmlkZW50aXR5SGFzaENvZGUob2JqKSArIG5hbWU7CisgICAgICAgIGlmIChwcm9wZXJ0eU1hcC5jb250YWluc0tleShrZXkpKSB7CisgICAgICAgICAgICByZXR1cm4gcHJvcGVydHlNYXAuZ2V0KGtleSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcm9wZXJ0eU1hcC5wdXQoa2V5LCBpbml0aWFsVmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIGluaXRpYWxWYWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIE1hcCBnZXRUaHJlYWRCb3VuZFByb3BlcnRNYXAoKSB7CisgICAgICAgIE1hcCBwcm9wZXJ0eU1hcCA9IChNYXApIFBST1BFUlRZX0lOU1RBTkNFX0hPTERFUi5nZXQoKTsKKyAgICAgICAgaWYgKHByb3BlcnR5TWFwID09IG51bGwpIHsKKyAgICAgICAgICAgIHByb3BlcnR5TWFwID0gbmV3IFdlYWtIYXNoTWFwKCk7CisgICAgICAgICAgICBQUk9QRVJUWV9JTlNUQU5DRV9IT0xERVIuc2V0KHByb3BlcnR5TWFwKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcHJvcGVydHlNYXA7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IHNldFRocmVhZEJvdW5kUHJvcGVydHlWYWx1ZShPYmplY3Qgb2JqLCBTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIE1hcCBwcm9wZXJ0eU1hcCA9IGdldFRocmVhZEJvdW5kUHJvcGVydE1hcCgpOworICAgICAgICBTdHJpbmcga2V5ID0gU3lzdGVtLmlkZW50aXR5SGFzaENvZGUob2JqKSArIG5hbWU7CisgICAgICAgIHJldHVybiBwcm9wZXJ0eU1hcC5wdXQoa2V5LCB2YWx1ZSk7CisgICAgfQorCisgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAgKiBAc2VlIGdyb292eS5sYW5nLk1ldGFCZWFuUHJvcGVydHkjZ2V0R2V0dGVyKCkKKyAgICAgICovCisgICAgcHVibGljIE1ldGFNZXRob2QgZ2V0R2V0dGVyKCkgeworICAgICAgICByZXR1cm4gdGhpcy5nZXR0ZXI7CisgICAgfQorCisgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAgKiBAc2VlIGdyb292eS5sYW5nLk1ldGFCZWFuUHJvcGVydHkjZ2V0U2V0dGVyKCkKKyAgICAgICovCisgICAgcHVibGljIE1ldGFNZXRob2QgZ2V0U2V0dGVyKCkgeworICAgICAgICByZXR1cm4gdGhpcy5zZXR0ZXI7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBBY2Nlc3NlcyB0aGUgVGhyZWFkQm91bmQgc3RhdGUgb2YgdGhlIHByb3BlcnR5IGFzIGEgZ2V0dGVyCisgICAgICoKKyAgICAgKiBAYXV0aG9yIEdyYWVtZSBSb2NoZXIKKyAgICAgKi8KKyAgICBjbGFzcyBUaHJlYWRCb3VuZEdldHRlciBleHRlbmRzIE1ldGFNZXRob2QgeworCisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZSwgbmFtZTA7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFyYW1ldGVyVHlwZXMgcHQgPSBuZXcgUGFyYW1ldGVyVHlwZXMobmV3IENhY2hlZENsYXNzWzBdKTsKKworCisgICAgICAgIHB1YmxpYyBUaHJlYWRCb3VuZEdldHRlcihTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgdGhpcy5uYW1lID0gZ2V0R2V0dGVyTmFtZShuYW1lLCB0eXBlKTsKKyAgICAgICAgICAgIHRoaXMubmFtZTAgPSBuYW1lOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgaW50IGdldE1vZGlmaWVycygpIHsKKyAgICAgICAgICAgIHJldHVybiBNb2RpZmllci5QVUJMSUM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDbGFzcyBnZXRSZXR1cm5UeXBlKCkgeworICAgICAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ2FjaGVkQ2xhc3MgZ2V0RGVjbGFyaW5nQ2xhc3MoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVmbGVjdGlvbkNhY2hlLmdldENhY2hlZENsYXNzKGRlY2xhcmluZ0NsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBQYXJhbWV0ZXJUeXBlcyBnZXRQYXJhbVR5cGVzKCkgeworICAgICAgICAgICAgcmV0dXJuIHB0OworICAgICAgICB9CisKKworICAgICAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICAgICAgICogQHNlZSBncm9vdnkubGFuZy5NZXRhTWV0aG9kI2ludm9rZShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0W10pCisgICAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBPYmplY3QgaW52b2tlKE9iamVjdCBvYmplY3QsIE9iamVjdFtdIGFyZ3VtZW50cykgeworICAgICAgICAgICAgcmV0dXJuIGdldFRocmVhZEJvdW5kUHJvcGVydHlWYWx1ZShvYmplY3QsIG5hbWUwLCBnZXRJbml0aWFsVmFsdWUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBUaHJlYWRCb3VuZCBzdGF0ZSBvZiB0aGUgcHJvcGVydHkgbGlrZSBhIHNldHRlcgorICAgICAqCisgICAgICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBUaHJlYWRCb3VuZFNldHRlciBleHRlbmRzIE1ldGFNZXRob2QgeworCisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZSwgbmFtZTA7CisgICAgICAgIHByaXZhdGUgUGFyYW1ldGVyVHlwZXMgcHQgPSBuZXcgUGFyYW1ldGVyVHlwZXMobmV3IENhY2hlZENsYXNzW117UmVmbGVjdGlvbkNhY2hlLmdldENhY2hlZENsYXNzKHR5cGUpfSk7CisKKyAgICAgICAgcHVibGljIFRocmVhZEJvdW5kU2V0dGVyKFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICB0aGlzLm5hbWUgPSBnZXRTZXR0ZXJOYW1lKG5hbWUpOworICAgICAgICAgICAgdGhpcy5uYW1lMCA9IG5hbWU7CisgICAgICAgIH0KKworCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0TW9kaWZpZXJzKCkgeworICAgICAgICAgICAgcmV0dXJuIE1vZGlmaWVyLlBVQkxJQzsKKyAgICAgICAgfS8qIChub24tSmF2YWRvYykKKwkJICogQHNlZSBncm9vdnkubGFuZy5NZXRhTWV0aG9kI2dldE5hbWUoKQorCQkgKi8KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDbGFzcyBnZXRSZXR1cm5UeXBlKCkgeworICAgICAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ2FjaGVkQ2xhc3MgZ2V0RGVjbGFyaW5nQ2xhc3MoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVmbGVjdGlvbkNhY2hlLmdldENhY2hlZENsYXNzKGRlY2xhcmluZ0NsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBQYXJhbWV0ZXJUeXBlcyBnZXRQYXJhbVR5cGVzKCkgeworICAgICAgICAgICAgcmV0dXJuIHB0OworICAgICAgICB9CisKKyAgICAgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAgICAgICAqIEBzZWUgZ3Jvb3Z5LmxhbmcuTWV0YU1ldGhvZCNpbnZva2UoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdFtdKQorICAgICAgICAgICAqLworICAgICAgICBwdWJsaWMgT2JqZWN0IGludm9rZShPYmplY3Qgb2JqZWN0LCBPYmplY3RbXSBhcmd1bWVudHMpIHsKKyAgICAgICAgICAgIHJldHVybiBzZXRUaHJlYWRCb3VuZFByb3BlcnR5VmFsdWUob2JqZWN0LCBuYW1lMCwgYXJndW1lbnRzWzBdKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldEdldHRlck5hbWUoU3RyaW5nIHByb3BlcnR5TmFtZSwgQ2xhc3MgdHlwZSkgeworICAgICAgICBTdHJpbmcgcHJlZml4ID0gdHlwZSA9PSBib29sZWFuLmNsYXNzIHx8IHR5cGUgPT0gQm9vbGVhbi5jbGFzcyA/ICJpcyIgOiAiZ2V0IjsKKyAgICAgICAgcmV0dXJuIHByZWZpeCArIENoYXJhY3Rlci50b1VwcGVyQ2FzZShwcm9wZXJ0eU5hbWUuY2hhckF0KDApKQorICAgICAgICAgICAgICAgICsgcHJvcGVydHlOYW1lLnN1YnN0cmluZygxKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRTZXR0ZXJOYW1lKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKyAgICAgICAgcmV0dXJuIFBST1BFUlRZX1NFVF9QUkVGSVggKyBwcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyBwcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKDEpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9tZXRhY2xhc3MvVHJhbnNmb3JtTWV0YU1ldGhvZC5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9tZXRhY2xhc3MvVHJhbnNmb3JtTWV0YU1ldGhvZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NzYyZDcKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL21ldGFjbGFzcy9UcmFuc2Zvcm1NZXRhTWV0aG9kLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5tZXRhY2xhc3M7CisKK2ltcG9ydCBncm9vdnkubGFuZy5NZXRhTWV0aG9kOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucmVmbGVjdGlvbi5DYWNoZWRDbGFzczsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJlZmxlY3Rpb24uUGFyYW1ldGVyVHlwZXM7CisKKy8qKgorICogQSBNZXRhTWV0aG9kIGltcGxlbWVudGF0aW9uIHVzZWZ1bCBmb3IgaW1wbGVtZW50aW5nIGNvZXJjaW9uIGJhc2VkIGludm9jYXRpb25zCisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KKworcHVibGljIGNsYXNzIFRyYW5zZm9ybU1ldGFNZXRob2QgZXh0ZW5kcyBNZXRhTWV0aG9kIHsKKyAgICAKKyAgICBwcml2YXRlIE1ldGFNZXRob2QgbWV0YU1ldGhvZDsKKworICAgIHB1YmxpYyBUcmFuc2Zvcm1NZXRhTWV0aG9kKE1ldGFNZXRob2QgbWV0YU1ldGhvZCkgeworICAgICAgICB0aGlzLm1ldGFNZXRob2QgPSBtZXRhTWV0aG9kOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0TW9kaWZpZXJzKCkgeworICAgICAgICByZXR1cm4gbWV0YU1ldGhvZC5nZXRNb2RpZmllcnMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBtZXRhTWV0aG9kLmdldE5hbWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3MgZ2V0UmV0dXJuVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIG1ldGFNZXRob2QuZ2V0UmV0dXJuVHlwZSgpOworICAgIH0KKworICAgIHB1YmxpYyBDYWNoZWRDbGFzcyBnZXREZWNsYXJpbmdDbGFzcygpIHsKKyAgICAgICAgcmV0dXJuIG1ldGFNZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUGFyYW1ldGVyVHlwZXMgZ2V0UGFyYW1UeXBlcygpIHsKKyAgICAgICAgcmV0dXJuIG1ldGFNZXRob2QuZ2V0UGFyYW1UeXBlcygpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgaW52b2tlKE9iamVjdCBvYmplY3QsIE9iamVjdFtdIGFyZ3VtZW50cykgeworICAgICAgICByZXR1cm4gbWV0YU1ldGhvZC5pbnZva2Uob2JqZWN0LCBhcmd1bWVudHMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvbWV0YWNsYXNzL3BhY2thZ2UuaHRtbCBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvbWV0YWNsYXNzL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzVmOGYyCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9tZXRhY2xhc3MvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsOCBAQAorPGh0bWw+CisgIDxoZWFkPgorICAgIDx0aXRsZT5wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5tZXRhY2xhc3MuKjwvdGl0bGU+CisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgPHA+SW50ZXJuYWwgY2xhc3NlcyByZWxhdGVkIHRvIEdyb292eSdzIG1ldGFjbGFzcyBpbXBsZW1lbnRhdGlvbi48L3A+CisgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvcGFja2FnZS5odG1sIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM4NmNkYwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsOCBAQAorPGh0bWw+CisgIDxoZWFkPgorICAgIDx0aXRsZT5wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS4qPC90aXRsZT4KKyAgPC9oZWFkPgorICA8Ym9keT4KKyAgICA8cD5SdW50aW1lIGNsYXNzZXMgZm9yIEdyb292eSAtIHdoZXRoZXIgdGhlIGR5bmFtaWMgaW50ZXJwcmV0ZXIgaXMgYmVpbmcgdXNlZCwgdGhlIGNvbXBpbGVyIG9yIHRoZSBieXRlY29kZSBnZW5lcmF0b3IuPC9wPgorICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL3R5cGVoYW5kbGluZy9CaWdEZWNpbWFsTWF0aC5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS90eXBlaGFuZGxpbmcvQmlnRGVjaW1hbE1hdGguamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzdiOWM0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS90eXBlaGFuZGxpbmcvQmlnRGVjaW1hbE1hdGguamF2YQpAQCAtMCwwICsxLDg4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUudHlwZWhhbmRsaW5nOworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CisKKy8qKgorICogQmlnRGVjaW1hbCBOdW1iZXJNYXRoIG9wZXJhdGlvbnMKKyAqIAorICogQGF1dGhvciBTdGV2ZSBHb2V0emUKKyAqLworcHVibGljIGNsYXNzIEJpZ0RlY2ltYWxNYXRoIGV4dGVuZHMgTnVtYmVyTWF0aCB7CisKKwkvL1RoaXMgaXMgYW4gYXJiaXRyYXJ5IHZhbHVlLCBwaWNrZWQgYXMgYSByZWFzb25hYmxlIGNob2ljZSBmb3IgYSByb3VuZGluZyBwb2ludAorCS8vZm9yIHR5cGljYWwgdXNlciBtYXRoLgorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9ESVZJU0lPTl9TQ0FMRSA9IDEwOworCQorCXB1YmxpYyBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbE1hdGggSU5TVEFOQ0UgPSBuZXcgQmlnRGVjaW1hbE1hdGgoKTsKKwkKKwlwcml2YXRlIEJpZ0RlY2ltYWxNYXRoKCkge30KKworCXByb3RlY3RlZCBOdW1iZXIgYWJzSW1wbChOdW1iZXIgbnVtYmVyKSB7CisJCXJldHVybiB0b0JpZ0RlY2ltYWwobnVtYmVyKS5hYnMoKTsKKwl9CisJCisJcHJvdGVjdGVkIE51bWJlciBhZGRJbXBsKE51bWJlciBsZWZ0LCBOdW1iZXIgcmlnaHQpIHsKKwkJcmV0dXJuIHRvQmlnRGVjaW1hbChsZWZ0KS5hZGQodG9CaWdEZWNpbWFsKHJpZ2h0KSk7CisJfQorCisJcHJvdGVjdGVkIE51bWJlciBzdWJ0cmFjdEltcGwoTnVtYmVyIGxlZnQsIE51bWJlciByaWdodCkgeworCQlyZXR1cm4gdG9CaWdEZWNpbWFsKGxlZnQpLnN1YnRyYWN0KHRvQmlnRGVjaW1hbChyaWdodCkpOworCX0KKworCXByb3RlY3RlZCBOdW1iZXIgbXVsdGlwbHlJbXBsKE51bWJlciBsZWZ0LCBOdW1iZXIgcmlnaHQpIHsKKwkJcmV0dXJuIHRvQmlnRGVjaW1hbChsZWZ0KS5tdWx0aXBseSh0b0JpZ0RlY2ltYWwocmlnaHQpKTsKKwl9CisKKwlwcm90ZWN0ZWQgTnVtYmVyIGRpdmlkZUltcGwoTnVtYmVyIGxlZnQsIE51bWJlciByaWdodCkgeworCQkvL0hhY2sgdW50aWwgSmF2YSAxLjUgQmlnRGVjaW1hbCBpcyBhdmFpbGFibGUuICBGb3Igbm93LCBwaWNrCisJCS8vYSByZXN1bHQgc2NhbGUgd2hpY2ggaXMgdGhlIG1heGltdW0gb2YgdGhlIHNjYWxlIG9mIHRoZQorCQkvL3R3byBvcGVyYW5kcyBhbmQgYW4gYXJiaXRyYXJ5IG1heGltdW0gKHNpbWlsYXIgdG8gd2hhdCBhCisJCS8vaGFuZGhlbGQgY2FsY3VsYXRvciB3b3VsZCBkbykuICBUaGVuLCBub3JtYWxpemUgdGhlIHJlc3VsdAorCQkvL2J5IHJlbW92aW5nIGFueSB0cmFpbGluZyB6ZXJvcy4KKwkJQmlnRGVjaW1hbCBiaWdMZWZ0ID0gdG9CaWdEZWNpbWFsKGxlZnQpOworCQlCaWdEZWNpbWFsIGJpZ1JpZ2h0ID0gdG9CaWdEZWNpbWFsKHJpZ2h0KTsKKwkJaW50IHNjYWxlID0gTWF0aC5tYXgoYmlnTGVmdC5zY2FsZSgpLCBiaWdSaWdodC5zY2FsZSgpKTsKKwkJcmV0dXJuIG5vcm1hbGl6ZShiaWdMZWZ0LmRpdmlkZShiaWdSaWdodCwgTWF0aC5tYXgoc2NhbGUsIE1BWF9ESVZJU0lPTl9TQ0FMRSksIEJpZ0RlY2ltYWwuUk9VTkRfSEFMRl9VUCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgaW50IGNvbXBhcmVUb0ltcGwoTnVtYmVyIGxlZnQsIE51bWJlciByaWdodCkgeworCQlyZXR1cm4gdG9CaWdEZWNpbWFsKGxlZnQpLmNvbXBhcmVUbyh0b0JpZ0RlY2ltYWwocmlnaHQpKTsKKwl9CisJCisJcHJpdmF0ZSBCaWdEZWNpbWFsIG5vcm1hbGl6ZShCaWdEZWNpbWFsIG51bWJlcikgeworICAgICAgICAvLyB3ZSBoYXZlIHRvIHRha2UgY2FyZSBvZiB0aGUgY2FzZSBudW1iZXI9PTAsIGJlY2F1c2UgMCBjYW4gaGF2ZSBldmVyeQorICAgICAgICAvLyBzY2FsZSBhbmQgdGhlIHRlc3QgaW4gdGhlIHdoaWxlIGxvb3Agd291bGQgbmV2ZXIgZW5kCisgICAgICAgIGlmIChudW1iZXIuc2lnbnVtKCk9PTApIHsKKyAgICAgICAgICAgIC8vIHRoZSBzbWFsbGVzdCBzY2FsZSBmb3IgMCBpcyAwCisgICAgICAgICAgICByZXR1cm4gbnVtYmVyLnNldFNjYWxlKDApOworICAgICAgICB9CisgICAgICAgIC8vIHJlc2NhbGUgdW50aWwgd2UgZm91bmQgdGhlIHNtYWxsZXN0IHBvc3NpYmxlIHNjYWxlCisJCXRyeSB7CisJCQl3aGlsZSAodHJ1ZSkgeworCQkJCW51bWJlciA9IG51bWJlci5zZXRTY2FsZShudW1iZXIuc2NhbGUoKS0xKTsKKwkJCX0gCisJCX0gY2F0Y2ggKEFyaXRobWV0aWNFeGNlcHRpb24gZSkgeworCQkJcmV0dXJuIG51bWJlcjsKKwkJfQorCX0KKworICAgIHByb3RlY3RlZCBOdW1iZXIgdW5hcnlNaW51c0ltcGwoTnVtYmVyIGxlZnQpIHsKKyAgICAgICAgcmV0dXJuIHRvQmlnRGVjaW1hbChsZWZ0KS5uZWdhdGUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL3R5cGVoYW5kbGluZy9CaWdJbnRlZ2VyTWF0aC5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS90eXBlaGFuZGxpbmcvQmlnSW50ZWdlck1hdGguamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTg3MGMyCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS90eXBlaGFuZGxpbmcvQmlnSW50ZWdlck1hdGguamF2YQpAQCAtMCwwICsxLDgwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUudHlwZWhhbmRsaW5nOworCisvKioKKyAqIEJpZ0ludGVnZXIgTnVtYmVyTWF0aCBvcGVyYXRpb25zCisgKiAKKyAqIEBhdXRob3IgU3RldmUgR29ldHplCisgKi8KK3B1YmxpYyBjbGFzcyBCaWdJbnRlZ2VyTWF0aCBleHRlbmRzIE51bWJlck1hdGggeworCisJcHVibGljIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyTWF0aCBJTlNUQU5DRSA9IG5ldyBCaWdJbnRlZ2VyTWF0aCgpOworCQorCXByaXZhdGUgQmlnSW50ZWdlck1hdGgoKSB7fQorCisJcHJvdGVjdGVkIE51bWJlciBhYnNJbXBsKE51bWJlciBudW1iZXIpIHsKKwkJcmV0dXJuIHRvQmlnSW50ZWdlcihudW1iZXIpLmFicygpOworCX0KKwkKKwlwcm90ZWN0ZWQgTnVtYmVyIGFkZEltcGwoTnVtYmVyIGxlZnQsIE51bWJlciByaWdodCkgeworCQlyZXR1cm4gdG9CaWdJbnRlZ2VyKGxlZnQpLmFkZCh0b0JpZ0ludGVnZXIocmlnaHQpKTsKKwl9CisJcHJvdGVjdGVkIE51bWJlciBzdWJ0cmFjdEltcGwoTnVtYmVyIGxlZnQsIE51bWJlciByaWdodCkgeworCQlyZXR1cm4gdG9CaWdJbnRlZ2VyKGxlZnQpLnN1YnRyYWN0KHRvQmlnSW50ZWdlcihyaWdodCkpOworCX0KKworCXByb3RlY3RlZCBOdW1iZXIgbXVsdGlwbHlJbXBsKE51bWJlciBsZWZ0LCBOdW1iZXIgcmlnaHQpIHsKKwkJcmV0dXJuIHRvQmlnSW50ZWdlcihsZWZ0KS5tdWx0aXBseSh0b0JpZ0ludGVnZXIocmlnaHQpKTsKKwl9CisKKwlwcm90ZWN0ZWQgTnVtYmVyIGRpdmlkZUltcGwoTnVtYmVyIGxlZnQsIE51bWJlciByaWdodCkgeworCQlyZXR1cm4gQmlnRGVjaW1hbE1hdGguSU5TVEFOQ0UuZGl2aWRlSW1wbChsZWZ0LCByaWdodCk7CisJfQorCQorCXByb3RlY3RlZCBpbnQgY29tcGFyZVRvSW1wbChOdW1iZXIgbGVmdCwgTnVtYmVyIHJpZ2h0KSB7CisJCXJldHVybiB0b0JpZ0ludGVnZXIobGVmdCkuY29tcGFyZVRvKHRvQmlnSW50ZWdlcihyaWdodCkpOworCX0KKworICAgIHByb3RlY3RlZCBOdW1iZXIgaW50ZGl2SW1wbChOdW1iZXIgbGVmdCwgTnVtYmVyIHJpZ2h0KSB7CisgICAgICAgIHJldHVybiB0b0JpZ0ludGVnZXIobGVmdCkuZGl2aWRlKHRvQmlnSW50ZWdlcihyaWdodCkpOworICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgTnVtYmVyIG1vZEltcGwoTnVtYmVyIGxlZnQsIE51bWJlciByaWdodCkgeworICAgICAgICByZXR1cm4gdG9CaWdJbnRlZ2VyKGxlZnQpLm1vZCh0b0JpZ0ludGVnZXIocmlnaHQpKTsKKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIE51bWJlciB1bmFyeU1pbnVzSW1wbChOdW1iZXIgbGVmdCkgeworICAgICAgICByZXR1cm4gdG9CaWdJbnRlZ2VyKGxlZnQpLm5lZ2F0ZSgpOworICAgIH0KKworICAgIHByb3RlY3RlZCBOdW1iZXIgYml0d2lzZU5lZ2F0ZUltcGwoTnVtYmVyIGxlZnQpIHsKKyAgICAgICAgcmV0dXJuIHRvQmlnSW50ZWdlcihsZWZ0KS5ub3QoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgTnVtYmVyIG9ySW1wbChOdW1iZXIgbGVmdCwgTnVtYmVyIHJpZ2h0KSB7CisgICAgICAgIHJldHVybiB0b0JpZ0ludGVnZXIobGVmdCkub3IodG9CaWdJbnRlZ2VyKHJpZ2h0KSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE51bWJlciBhbmRJbXBsKE51bWJlciBsZWZ0LCBOdW1iZXIgcmlnaHQpIHsKKyAgICAgICAgcmV0dXJuIHRvQmlnSW50ZWdlcihsZWZ0KS5hbmQodG9CaWdJbnRlZ2VyKHJpZ2h0KSk7CisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCBOdW1iZXIgeG9ySW1wbChOdW1iZXIgbGVmdCwgTnVtYmVyIHJpZ2h0KSB7CisgICAgICAgIHJldHVybiB0b0JpZ0ludGVnZXIobGVmdCkueG9yKHRvQmlnSW50ZWdlcihyaWdodCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvdHlwZWhhbmRsaW5nL0NsYXNzRGlzdGFuY2UuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvdHlwZWhhbmRsaW5nL0NsYXNzRGlzdGFuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDZjMjc3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS90eXBlaGFuZGxpbmcvQ2xhc3NEaXN0YW5jZS5qYXZhCkBAIC0wLDAgKzEsMTYwIEBACisvKg0KKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLg0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLnR5cGVoYW5kbGluZzsNCisNCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7DQoraW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOw0KK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsNCitpbXBvcnQgamF2YS51dGlsLldlYWtIYXNoTWFwOw0KKw0KKw0KKy8qDQorICogQ2xhc3MgZm9yIGNhbGN1bGF0aW5nICJkaXN0YW5jZXMiIGJldHdlZW4gY2xhc3Nlcy4gU3VjaCBhIGRpc3RhbmNlDQorICogaXMgbm90IGEgcmVhbCBkaXN0YW5jZSB0byBzb21ldGhpbmcgYnV0IHNob3VsZCBiZSBzZWVuIGFzIHRoZSBvcmRlcg0KKyAqIGNsYXNzZXMgYW5kIGludGVyZmFjZXMgYXJlIGNob29zZW4gZm9yIG1ldGhvZCBzZWxlY3Rpb24uIFRoZSBjbGFzcw0KKyAqIHdpbGwga2VlcCBhIHdlYWsgY2FjaGUgYW5kIHJlY2FsY3VsYXRlIHRoZSBkaXN0YW5jZXMgb24gZGVtYW5kLg0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDbGFzc0Rpc3RhbmNlIHsNCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgV2Vha0hhc2hNYXAgQ0xBU1NfRElTVEFOQ0VTOw0KKyAgICANCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRW50cnkgew0KKyAgICAgICAgDQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIExpbmVhckVudHJ5ICBleHRlbmRzIEVudHJ5ew0KKyAgICAgICAgQ2xhc3NbXSBlbnRyaWVzOw0KKyAgICAgICAgdm9pZCBjb25jYXQoQ2xhc3NbXSBjLExpbmVhckVudHJ5IGxlKXsNCisgICAgICAgICAgICBlbnRyaWVzID0gbmV3IENsYXNzW2MubGVuZ3RoK2xlLmVudHJpZXMubGVuZ3RoXTsNCisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGMsMCxlbnRyaWVzLDAsYy5sZW5ndGgpOw0KKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobGUuZW50cmllcywwLGVudHJpZXMsYy5sZW5ndGgsbGUuZW50cmllcy5sZW5ndGgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgdm9pZCBjb25jYXQoQ2xhc3MgYyxMaW5lYXJFbnRyeSBsZSl7DQorICAgICAgICAgICAgZW50cmllcyA9IG5ldyBDbGFzc1sxK2xlLmVudHJpZXMubGVuZ3RoXTsNCisgICAgICAgICAgICBlbnRyaWVzWzBdID0gYzsNCisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGxlLmVudHJpZXMsMCxlbnRyaWVzLDEsbGUuZW50cmllcy5sZW5ndGgpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBzdGF0aWMgew0KKyAgICAgICAgQ0xBU1NfRElTVEFOQ0VTID0gbmV3IFdlYWtIYXNoTWFwKCk7DQorICAgICAgICBpbml0aWFsUG9wdWxhdGUoKTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbml0aWFsUG9wdWxhdGUoKSB7DQorICAgICAgICAvLyBpbnQsIGRvdWJsZSwgYnl0ZSwgZmxvYXQsIEJpZ0ludGVnZXIsIEJpZ0RlY2ltYWwsIGxvbmcsIHNob3J0DQorICAgICAgICAvLyBHU3RyaW5nLCBjaGFyDQorICAgICAgICANCisgICAgICAgIA0KKyAgICAgICAgTGluZWFyRW50cnkgb2JqZWN0ID0gbmV3IExpbmVhckVudHJ5KCk7DQorICAgICAgICBvYmplY3QuZW50cmllcyA9IG5ldyBDbGFzc1tde09iamVjdC5jbGFzc307DQorICAgICAgICBDTEFTU19ESVNUQU5DRVMucHV0KE9iamVjdC5jbGFzcyxvYmplY3QpOw0KKyAgICAgICAgDQorICAgICAgICBMaW5lYXJFbnRyeSBudW1iZXIgPSBuZXcgTGluZWFyRW50cnkoKTsNCisgICAgICAgIG51bWJlci5jb25jYXQobmV3IENsYXNzW117TnVtYmVyLmNsYXNzLFNlcmlhbGl6YWJsZS5jbGFzc30sb2JqZWN0KTsNCisgICAgICAgIENMQVNTX0RJU1RBTkNFUy5wdXQoTnVtYmVyLmNsYXNzLG51bWJlcik7DQorDQorICAgICAgICBMaW5lYXJFbnRyeSBjb21wYXJlYWJsZU51bWJlciA9IG5ldyBMaW5lYXJFbnRyeSgpOw0KKyAgICAgICAgY29tcGFyZWFibGVOdW1iZXIuY29uY2F0KENvbXBhcmFibGUuY2xhc3MsbnVtYmVyKTsNCisgICAgICAgIA0KKyAgICAgICAgTGluZWFyRW50cnkgYmludGVnZXIgPSBuZXcgTGluZWFyRW50cnkoKTsNCisgICAgICAgIGJpbnRlZ2VyLmNvbmNhdChuZXcgQ2xhc3NbXXtCaWdJbnRlZ2VyLmNsYXNzLCBCaWdEZWNpbWFsLmNsYXNzfSwgY29tcGFyZWFibGVOdW1iZXIpOw0KKyAgICAgICAgQ0xBU1NfRElTVEFOQ0VTLnB1dChCaWdJbnRlZ2VyLmNsYXNzLG9iamVjdCk7DQorICAgICAgICANCisgICAgICAgIExpbmVhckVudHJ5IGJkZWMgPSBuZXcgTGluZWFyRW50cnkoKTsNCisgICAgICAgIGJpbnRlZ2VyLmNvbmNhdChuZXcgQ2xhc3NbXXtCaWdEZWNpbWFsLmNsYXNzLCBCaWdJbnRlZ2VyLmNsYXNzfSwgY29tcGFyZWFibGVOdW1iZXIpOw0KKyAgICAgICAgQ0xBU1NfRElTVEFOQ0VTLnB1dChCaWdEZWNpbWFsLmNsYXNzLG9iamVjdCk7DQorICAgICAgICANCisgICAgICAgIA0KKyAgICAgICAgDQorICAgICAgICAvLyBieXRlOg0KKyAgICAgICAgTGluZWFyRW50cnkgc3RhcnQgPSBuZXcgTGluZWFyRW50cnkoKTsNCisgICAgICAgIHN0YXJ0LmVudHJpZXMgPSAgbmV3IENsYXNzW117DQorICAgICAgICAgICAgICAgIGJ5dGUuY2xhc3MsIEJ5dGUuY2xhc3MsIHNob3J0LmNsYXNzLCBTaG9ydC5jbGFzcywNCisgICAgICAgICAgICAgICAgaW50LmNsYXNzLCBJbnRlZ2VyLmNsYXNzLCBsb25nLmNsYXNzLCBMb25nLmNsYXNzLA0KKyAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLmNsYXNzLA0KKyAgICAgICAgICAgICAgICBmbG9hdC5jbGFzcywgRmxvYXQuY2xhc3MsICBkb3VibGUuY2xhc3MsIERvdWJsZS5jbGFzcywgDQorICAgICAgICAgICAgICAgIEJpZ0RlY2ltYWwuY2xhc3MsDQorICAgICAgICAgICAgICAgIE51bWJlci5jbGFzcyxPYmplY3QuY2xhc3N9Ow0KKyAgICAgICAgQ0xBU1NfRElTVEFOQ0VTLnB1dChieXRlLmNsYXNzLHN0YXJ0KTsNCisgICAgICAgIA0KKyAgICAgICAgLy8gc2hvcnQ6DQorICAgICAgICBzdGFydCA9IG5ldyBMaW5lYXJFbnRyeSgpOw0KKyAgICAgICAgc3RhcnQuZW50cmllcyA9ICBuZXcgQ2xhc3NbXXsNCisgICAgICAgICAgICAgICAgc2hvcnQuY2xhc3MsIFNob3J0LmNsYXNzLA0KKyAgICAgICAgICAgICAgICBpbnQuY2xhc3MsIEludGVnZXIuY2xhc3MsIGxvbmcuY2xhc3MsIExvbmcuY2xhc3MsDQorICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuY2xhc3MsDQorICAgICAgICAgICAgICAgIGZsb2F0LmNsYXNzLCBGbG9hdC5jbGFzcywgIGRvdWJsZS5jbGFzcywgRG91YmxlLmNsYXNzLCANCisgICAgICAgICAgICAgICAgQmlnRGVjaW1hbC5jbGFzcywNCisgICAgICAgICAgICAgICAgTnVtYmVyLmNsYXNzLE9iamVjdC5jbGFzc307DQorICAgICAgICBDTEFTU19ESVNUQU5DRVMucHV0KHNob3J0LmNsYXNzLHN0YXJ0KTsNCisgICAgICAgIA0KKyAgICAgICAgLy8gaW50Og0KKyAgICAgICAgc3RhcnQgPSBuZXcgTGluZWFyRW50cnkoKTsNCisgICAgICAgIHN0YXJ0LmVudHJpZXMgPSAgbmV3IENsYXNzW117DQorICAgICAgICAgICAgICAgIGludC5jbGFzcywgSW50ZWdlci5jbGFzcywgbG9uZy5jbGFzcywgTG9uZy5jbGFzcywNCisgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5jbGFzcywNCisgICAgICAgICAgICAgICAgZmxvYXQuY2xhc3MsIEZsb2F0LmNsYXNzLCAgZG91YmxlLmNsYXNzLCBEb3VibGUuY2xhc3MsIA0KKyAgICAgICAgICAgICAgICBCaWdEZWNpbWFsLmNsYXNzLA0KKyAgICAgICAgICAgICAgICBOdW1iZXIuY2xhc3MsT2JqZWN0LmNsYXNzfTsNCisgICAgICAgIENMQVNTX0RJU1RBTkNFUy5wdXQoaW50LmNsYXNzLHN0YXJ0KTsNCisgICAgICAgIA0KKyAgICAgICAgLy8gbG9uZzoNCisgICAgICAgIHN0YXJ0ID0gbmV3IExpbmVhckVudHJ5KCk7DQorICAgICAgICBzdGFydC5lbnRyaWVzID0gIG5ldyBDbGFzc1tdew0KKyAgICAgICAgICAgICAgICBsb25nLmNsYXNzLCBMb25nLmNsYXNzLA0KKyAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLmNsYXNzLA0KKyAgICAgICAgICAgICAgICBmbG9hdC5jbGFzcywgRmxvYXQuY2xhc3MsICBkb3VibGUuY2xhc3MsIERvdWJsZS5jbGFzcywgDQorICAgICAgICAgICAgICAgIEJpZ0RlY2ltYWwuY2xhc3MsDQorICAgICAgICAgICAgICAgIE51bWJlci5jbGFzcyxPYmplY3QuY2xhc3N9Ow0KKyAgICAgICAgQ0xBU1NfRElTVEFOQ0VTLnB1dChsb25nLmNsYXNzLHN0YXJ0KTsNCisgICAgICAgIA0KKyAgICAgICAgLy8gQmlnaW50ZWdlcjoNCisgICAgICAgIHN0YXJ0ID0gbmV3IExpbmVhckVudHJ5KCk7DQorICAgICAgICBzdGFydC5lbnRyaWVzID0gIG5ldyBDbGFzc1tdew0KKyAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLmNsYXNzLA0KKyAgICAgICAgICAgICAgICBmbG9hdC5jbGFzcywgRmxvYXQuY2xhc3MsICBkb3VibGUuY2xhc3MsIERvdWJsZS5jbGFzcywgDQorICAgICAgICAgICAgICAgIEJpZ0RlY2ltYWwuY2xhc3MsDQorICAgICAgICAgICAgICAgIE51bWJlci5jbGFzcyxPYmplY3QuY2xhc3N9Ow0KKyAgICAgICAgQ0xBU1NfRElTVEFOQ0VTLnB1dChsb25nLmNsYXNzLHN0YXJ0KTsNCisgICAgICAgIA0KKyAgICAgICAgLy8gZmxvYXQ6DQorICAgICAgICBzdGFydCA9IG5ldyBMaW5lYXJFbnRyeSgpOw0KKyAgICAgICAgc3RhcnQuZW50cmllcyA9ICBuZXcgQ2xhc3NbXXsgDQorICAgICAgICAgICAgICAgIGJ5dGUuY2xhc3MsIEJ5dGUuY2xhc3MsIHNob3J0LmNsYXNzLCBTaG9ydC5jbGFzcywNCisgICAgICAgICAgICAgICAgaW50LmNsYXNzLCBJbnRlZ2VyLmNsYXNzLCBsb25nLmNsYXNzLCBMb25nLmNsYXNzLA0KKyAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLmNsYXNzLA0KKyAgICAgICAgICAgICAgICBmbG9hdC5jbGFzcywgRmxvYXQuY2xhc3MsICBkb3VibGUuY2xhc3MsIERvdWJsZS5jbGFzcywgDQorICAgICAgICAgICAgICAgIEJpZ0RlY2ltYWwuY2xhc3MsDQorICAgICAgICAgICAgICAgIE51bWJlci5jbGFzcyxPYmplY3QuY2xhc3N9Ow0KKyAgICAgICAgQ0xBU1NfRElTVEFOQ0VTLnB1dChmbG9hdC5jbGFzcyxzdGFydCk7DQorICAgICAgICANCisgICAgICAgIC8vIGRvdWJsZToNCisgICAgICAgIHN0YXJ0ID0gbmV3IExpbmVhckVudHJ5KCk7DQorICAgICAgICBzdGFydC5lbnRyaWVzID0gIG5ldyBDbGFzc1tdeyANCisgICAgICAgICAgICAgICAgZG91YmxlLmNsYXNzLA0KKyAgICAgICAgICAgICAgICBEb3VibGUuY2xhc3MsIEJpZ0RlY2ltYWwuY2xhc3MsDQorICAgICAgICAgICAgICAgIE51bWJlci5jbGFzcyxPYmplY3QuY2xhc3N9Ow0KKyAgICAgICAgQ0xBU1NfRElTVEFOQ0VTLnB1dChkb3VibGUuY2xhc3Msc3RhcnQpOw0KKw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBwb3B1bHRhdGUoQ2xhc3MgY2xhenopIHsNCisgICAgICAgIGlmIChDTEFTU19ESVNUQU5DRVMuZ2V0KGNsYXp6KSAhPSBudWxsKSByZXR1cm47DQorICAgICAgICANCisgICAgfQ0KKyAgICANCit9DQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS90eXBlaGFuZGxpbmcvRGVmYXVsdFR5cGVUcmFuc2Zvcm1hdGlvbi5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS90eXBlaGFuZGxpbmcvRGVmYXVsdFR5cGVUcmFuc2Zvcm1hdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0OTcxMGIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL3R5cGVoYW5kbGluZy9EZWZhdWx0VHlwZVRyYW5zZm9ybWF0aW9uLmphdmEKQEAgLTAsMCArMSw3NjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUudHlwZWhhbmRsaW5nOworCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuR1N0cmluZzsKK2ltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlSdW50aW1lRXhjZXB0aW9uOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucmVmbGVjdGlvbi5SZWZsZWN0aW9uQ2FjaGU7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLio7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKK2ltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKKworcHVibGljIGNsYXNzIERlZmF1bHRUeXBlVHJhbnNmb3JtYXRpb24geworICAgIAorICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0W10gRU1QVFlfQVJHVU1FTlRTID0ge307CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIE9ORV9ORUcgPSBuZXcgQmlnSW50ZWdlcigiLTEiKTsKKyAgICAKKyAgICAvLyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyAgICAgICAgICAgICAgICAgIHVuYm94aW5nIG1ldGhvZHMKKyAgICAvLyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgCisgICAgCisgICAgcHVibGljIHN0YXRpYyBieXRlIGJ5dGVVbmJveChPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgTnVtYmVyIG4gPSBjYXN0VG9OdW1iZXIodmFsdWUpOworICAgICAgICByZXR1cm4gbi5ieXRlVmFsdWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNoYXIgY2hhclVuYm94KE9iamVjdCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gY2FzdFRvQ2hhcih2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBzaG9ydCBzaG9ydFVuYm94KE9iamVjdCB2YWx1ZSkgeworICAgICAgICBOdW1iZXIgbiA9IGNhc3RUb051bWJlcih2YWx1ZSk7CisgICAgICAgIHJldHVybiBuLnNob3J0VmFsdWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGludCBpbnRVbmJveChPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgTnVtYmVyIG4gPSBjYXN0VG9OdW1iZXIodmFsdWUpOworICAgICAgICByZXR1cm4gbi5pbnRWYWx1ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBib29sZWFuVW5ib3goT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIHJldHVybiBjYXN0VG9Cb29sZWFuKHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGxvbmcgbG9uZ1VuYm94KE9iamVjdCB2YWx1ZSkgeworICAgICAgICBOdW1iZXIgbiA9IGNhc3RUb051bWJlcih2YWx1ZSk7CisgICAgICAgIHJldHVybiBuLmxvbmdWYWx1ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmxvYXQgZmxvYXRVbmJveChPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgTnVtYmVyIG4gPSBjYXN0VG9OdW1iZXIodmFsdWUpOworICAgICAgICByZXR1cm4gbi5mbG9hdFZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBkb3VibGUgZG91YmxlVW5ib3goT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIE51bWJlciBuID0gY2FzdFRvTnVtYmVyKHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIG4uZG91YmxlVmFsdWUoKTsKKyAgICB9IAorCisgICAgLy8gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gICAgICAgICAgICAgICAgICBib3hpbmcgbWV0aG9kcworICAgIC8vICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAKKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBib3goYm9vbGVhbiB2YWx1ZSkgeworICAgICAgICByZXR1cm4gdmFsdWUgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGJveChieXRlIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBuZXcgQnl0ZSh2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgYm94KGNoYXIgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDaGFyYWN0ZXIodmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGJveChzaG9ydCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gbmV3IFNob3J0KHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBib3goaW50IHZhbHVlKSB7CisgICAgICAgIHJldHVybiBJbnRlZ2VyQ2FjaGUuaW50ZWdlclZhbHVlKHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBib3gobG9uZyB2YWx1ZSkgeworICAgICAgICByZXR1cm4gbmV3IExvbmcodmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGJveChmbG9hdCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gbmV3IEZsb2F0KHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBib3goZG91YmxlIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBuZXcgRG91YmxlKHZhbHVlKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBOdW1iZXIgY2FzdFRvTnVtYmVyKE9iamVjdCBvYmplY3QpIHsKKyAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE51bWJlcikgcmV0dXJuIChOdW1iZXIpIG9iamVjdDsKKyAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIENoYXJhY3RlcikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnRlZ2VyKCgoQ2hhcmFjdGVyKSBvYmplY3QpLmNoYXJWYWx1ZSgpKTsKKyAgICAgICAgfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKyAgICAgICAgICAgIFN0cmluZyBjID0gKFN0cmluZykgb2JqZWN0OworICAgICAgICAgICAgaWYgKGMubGVuZ3RoKCkgPT0gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW50ZWdlcihjLmNoYXJBdCgwKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgR3Jvb3Z5Q2FzdEV4Y2VwdGlvbihjLEludGVnZXIuY2xhc3MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBHcm9vdnlDYXN0RXhjZXB0aW9uKG9iamVjdCxOdW1iZXIuY2xhc3MpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FzdFRvQm9vbGVhbihPYmplY3Qgb2JqZWN0KSB7CisgICAgCWlmIChvYmplY3QgPT0gbnVsbCkgeworICAgIAkJcmV0dXJuIGZhbHNlOworICAgIAl9CisgICAgCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEJvb2xlYW4pIHsKKyAgICAgICAgICAgIEJvb2xlYW4gYm9vbGVhblZhbHVlID0gKEJvb2xlYW4pIG9iamVjdDsKKyAgICAgICAgICAgIHJldHVybiBib29sZWFuVmFsdWUuYm9vbGVhblZhbHVlKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgTWF0Y2hlcikgeworICAgICAgICAgICAgTWF0Y2hlciBtYXRjaGVyID0gKE1hdGNoZXIpIG9iamVjdDsKKyAgICAgICAgICAgIFJlZ2V4U3VwcG9ydC5zZXRMYXN0TWF0Y2hlcihtYXRjaGVyKTsKKyAgICAgICAgICAgIHJldHVybiBtYXRjaGVyLmZpbmQoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSB7CisgICAgICAgICAgICBDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgb2JqZWN0OworICAgICAgICAgICAgcmV0dXJuICFjb2xsZWN0aW9uLmlzRW1wdHkoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBNYXApIHsKKyAgICAgICAgICAgIE1hcCBtYXAgPSAoTWFwKSBvYmplY3Q7CisgICAgICAgICAgICByZXR1cm4gIW1hcC5pc0VtcHR5KCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgQ2hhclNlcXVlbmNlKSB7CisgICAgICAgIAlDaGFyU2VxdWVuY2Ugc3RyaW5nID0gIChDaGFyU2VxdWVuY2UpIG9iamVjdDsKKyAgICAgICAgICAgIHJldHVybiBzdHJpbmcubGVuZ3RoKCkgPiAwOworICAgICAgICB9IAorICAgICAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBPYmplY3RbXSkgeworICAgICAgICAJT2JqZWN0W10gYXJyYXkgPSAgKE9iamVjdFtdKSBvYmplY3Q7CisgICAgICAgICAgICByZXR1cm4gYXJyYXkubGVuZ3RoID4gMDsKKyAgICAgICAgfSAKKyAgICAgICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7CisgICAgICAgICAgICBDaGFyYWN0ZXIgYyA9IChDaGFyYWN0ZXIpIG9iamVjdDsKKyAgICAgICAgICAgIHJldHVybiBjLmNoYXJWYWx1ZSgpICE9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgTnVtYmVyKSB7CisgICAgICAgICAgICBOdW1iZXIgbiA9IChOdW1iZXIpIG9iamVjdDsKKyAgICAgICAgICAgIHJldHVybiBuLmRvdWJsZVZhbHVlKCkgIT0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgY2hhciBjYXN0VG9DaGFyKE9iamVjdCBvYmplY3QpIHsKKyAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIENoYXJhY3RlcikgeworICAgICAgICAgICAgcmV0dXJuICgoQ2hhcmFjdGVyKSBvYmplY3QpLmNoYXJWYWx1ZSgpOyAgICAgICAgICAgIAorICAgICAgICB9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE51bWJlcikgeworICAgICAgICAgICAgTnVtYmVyIHZhbHVlID0gKE51bWJlcikgb2JqZWN0OworICAgICAgICAgICAgcmV0dXJuIChjaGFyKSB2YWx1ZS5pbnRWYWx1ZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU3RyaW5nIHRleHQgPSBvYmplY3QudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIGlmICh0ZXh0Lmxlbmd0aCgpID09IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGV4dC5jaGFyQXQoMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgR3Jvb3Z5Q2FzdEV4Y2VwdGlvbih0ZXh0LGNoYXIuY2xhc3MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNhc3RUb1R5cGUoT2JqZWN0IG9iamVjdCwgQ2xhc3MgdHlwZSkgeworICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAodHlwZSA9PSBvYmplY3QuZ2V0Q2xhc3MoKSkgcmV0dXJuIG9iamVjdDsKKyAgICAgICAgLy8gVE9ETyB3ZSBzaG91bGQgbW92ZSB0aGVzZSBtZXRob2RzIHRvIGdyb292eSBtZXRob2QsIGxpa2UgZyRhc1R5cGUoKSBzbyB0aGF0CisgICAgICAgIC8vIHdlIGNhbiB1c2Ugb3BlcmF0b3Igb3ZlcmxvYWRpbmcgdG8gY3VzdG9taXplIG9uIGEgcGVyLXR5cGUgYmFzaXMKKyAgICAgICAgaWYgKFJlZmxlY3Rpb25DYWNoZS5pc0FycmF5KHR5cGUpKSB7CisgICAgICAgICAgICByZXR1cm4gYXNBcnJheShvYmplY3QsIHR5cGUpOworCisgICAgICAgIH0KKyAgICAgICAgaWYgKFJlZmxlY3Rpb25DYWNoZS5pc0Fzc2lnbmFibGVGcm9tKHR5cGUsb2JqZWN0LmdldENsYXNzKCkpKSB7CisgICAgICAgICAgICByZXR1cm4gb2JqZWN0OworICAgICAgICB9CisgICAgICAgIGlmIChDb2xsZWN0aW9uLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZSkpIHsKKyAgICAgICAgICAgIGludCBtb2RpZmllcnMgPSB0eXBlLmdldE1vZGlmaWVycygpOworICAgICAgICAgICAgQ29sbGVjdGlvbiBhbnN3ZXI7CisgICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgQ29sbGVjdGlvbiAmJiB0eXBlLmlzQXNzaWduYWJsZUZyb20oSGFzaFNldC5jbGFzcykgJiYKKyAgICAgICAgICAgICAgICAgICAgKHR5cGUgPT0gSGFzaFNldC5jbGFzcyB8fCBNb2RpZmllci5pc0Fic3RyYWN0KG1vZGlmaWVycykgfHwgTW9kaWZpZXIuaXNJbnRlcmZhY2UobW9kaWZpZXJzKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEhhc2hTZXQoKENvbGxlY3Rpb24pb2JqZWN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvYmplY3QuZ2V0Q2xhc3MoKS5pc0FycmF5KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAodHlwZS5pc0Fzc2lnbmFibGVGcm9tKEFycmF5TGlzdC5jbGFzcykgJiYgKE1vZGlmaWVyLmlzQWJzdHJhY3QobW9kaWZpZXJzKSB8fCBNb2RpZmllci5pc0ludGVyZmFjZShtb2RpZmllcnMpKSkgeworICAgICAgICAgICAgICAgICAgICBhbnN3ZXIgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbGV0cyBjYWxsIHRoZSBjb2xsZWN0aW9ucyBjb25zdHJ1Y3RvcgorICAgICAgICAgICAgICAgICAgICAvLyBwYXNzaW5nIGluIHRoZSBsaXN0IHdyYXBwZXIKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuc3dlciA9IChDb2xsZWN0aW9uKSB0eXBlLm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgR3Jvb3Z5Q2FzdEV4Y2VwdGlvbigiQ291bGQgbm90IGluc3RhbnRpYXRlIGluc3RhbmNlIG9mOiAiICsgdHlwZS5nZXROYW1lKCkgKyAiLiBSZWFzb246ICIgKyBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIHdlIGNhbm5vdCBqdXN0IHdyYXAgaW4gYSBMaXN0IGFzIHdlIHN1cHBvcnQgcHJpbWl0aXZlIHR5cGUgYXJyYXlzCisgICAgICAgICAgICAgICAgaW50IGxlbmd0aCA9IEFycmF5LmdldExlbmd0aChvYmplY3QpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGVsZW1lbnQgPSBBcnJheS5nZXQob2JqZWN0LCBpKTsKKyAgICAgICAgICAgICAgICAgICAgYW5zd2VyLmFkZChlbGVtZW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGFuc3dlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAodHlwZSA9PSBTdHJpbmcuY2xhc3MpIHsKKyAgICAgICAgICAgIHJldHVybiBvYmplY3QudG9TdHJpbmcoKTsKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IENoYXJhY3Rlci5jbGFzcykgeworICAgICAgICAgICAgcmV0dXJuIGJveChjYXN0VG9DaGFyKG9iamVjdCkpOworICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gQm9vbGVhbi5jbGFzcykgeworICAgICAgICAgICAgcmV0dXJuIGJveChjYXN0VG9Cb29sZWFuKG9iamVjdCkpOworICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gQ2xhc3MuY2xhc3MpIHsKKyAgICAgICAgICAgIHJldHVybiBjYXN0VG9DbGFzcyhvYmplY3QpOworICAgICAgICB9IGVsc2UgaWYgKE51bWJlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpKSB7CisgICAgICAgICAgICBOdW1iZXIgbiA9IGNhc3RUb051bWJlcihvYmplY3QpOworICAgICAgICAgICAgaWYgKHR5cGUgPT0gQnl0ZS5jbGFzcykgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQnl0ZShuLmJ5dGVWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBDaGFyYWN0ZXIuY2xhc3MpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENoYXJhY3RlcigoY2hhcikgbi5pbnRWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBTaG9ydC5jbGFzcykgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2hvcnQobi5zaG9ydFZhbHVlKCkpOworICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IEludGVnZXIuY2xhc3MpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEludGVnZXIobi5pbnRWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBMb25nLmNsYXNzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMb25nKG4ubG9uZ1ZhbHVlKCkpOworICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IEZsb2F0LmNsYXNzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGbG9hdChuLmZsb2F0VmFsdWUoKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gRG91YmxlLmNsYXNzKSB7CisgICAgICAgICAgICAgICAgRG91YmxlIGFuc3dlciA9IG5ldyBEb3VibGUobi5kb3VibGVWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAvL3Rocm93IGEgcnVudGltZSBleGNlcHRpb24gaWYgY29udmVyc2lvbiB3b3VsZCBiZSBvdXQtb2YtcmFuZ2UgZm9yIHRoZSB0eXBlLgorICAgICAgICAgICAgICAgIGlmICghKG4gaW5zdGFuY2VvZiBEb3VibGUpICYmIChhbnN3ZXIuZG91YmxlVmFsdWUoKSA9PSBEb3VibGUuTkVHQVRJVkVfSU5GSU5JVFkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGFuc3dlci5kb3VibGVWYWx1ZSgpID09IERvdWJsZS5QT1NJVElWRV9JTkZJTklUWSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEdyb292eVJ1bnRpbWVFeGNlcHRpb24oIkF1dG9tYXRpYyBjb2VyY2lvbiBvZiAiICsgbi5nZXRDbGFzcygpLmdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB2YWx1ZSAiICsgbiArICIgdG8gZG91YmxlIGZhaWxlZC4gIFZhbHVlIGlzIG91dCBvZiByYW5nZS4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGFuc3dlcjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBCaWdEZWNpbWFsLmNsYXNzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCaWdEZWNpbWFsKG4udG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gQmlnSW50ZWdlci5jbGFzcykgeworICAgICAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBGbG9hdCB8fCBvYmplY3QgaW5zdGFuY2VvZiBEb3VibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgQmlnRGVjaW1hbCBiZCA9IG5ldyBCaWdEZWNpbWFsKG4uZG91YmxlVmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBiZC50b0JpZ0ludGVnZXIoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEJpZ0RlY2ltYWwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoQmlnRGVjaW1hbCkgb2JqZWN0KS50b0JpZ0ludGVnZXIoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJpZ0ludGVnZXIobi50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAodHlwZS5pc1ByaW1pdGl2ZSgpKSB7CisgICAgICAgICAgICBpZiAodHlwZSA9PSBib29sZWFuLmNsYXNzKSB7CisgICAgICAgICAgICAgICByZXR1cm4gYm94KGJvb2xlYW5VbmJveChvYmplY3QpKTsgCisgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gYnl0ZS5jbGFzcykgeworICAgICAgICAgICAgICAgIHJldHVybiBib3goYnl0ZVVuYm94KG9iamVjdCkpOworICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IGNoYXIuY2xhc3MpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYm94KGNoYXJVbmJveChvYmplY3QpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBzaG9ydC5jbGFzcykgeworICAgICAgICAgICAgICAgIHJldHVybiBib3goc2hvcnRVbmJveChvYmplY3QpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBpbnQuY2xhc3MpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYm94KGludFVuYm94KG9iamVjdCkpOworICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IGxvbmcuY2xhc3MpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYm94KGxvbmdVbmJveChvYmplY3QpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBmbG9hdC5jbGFzcykgeworICAgICAgICAgICAgICAgIHJldHVybiBib3goZmxvYXRVbmJveChvYmplY3QpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBkb3VibGUuY2xhc3MpIHsKKyAgICAgICAgICAgICAgICBEb3VibGUgYW5zd2VyID0gbmV3IERvdWJsZShkb3VibGVVbmJveChvYmplY3QpKTsKKyAgICAgICAgICAgICAgICAvL3Rocm93IGEgcnVudGltZSBleGNlcHRpb24gaWYgY29udmVyc2lvbiB3b3VsZCBiZSBvdXQtb2YtcmFuZ2UgZm9yIHRoZSB0eXBlLgorICAgICAgICAgICAgICAgIGlmICghKG9iamVjdCBpbnN0YW5jZW9mIERvdWJsZSkgJiYgKGFuc3dlci5kb3VibGVWYWx1ZSgpID09IERvdWJsZS5ORUdBVElWRV9JTkZJTklUWQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgYW5zd2VyLmRvdWJsZVZhbHVlKCkgPT0gRG91YmxlLlBPU0lUSVZFX0lORklOSVRZKSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbigiQXV0b21hdGljIGNvZXJjaW9uIG9mICIgKyBvYmplY3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgdmFsdWUgIiArIG9iamVjdCArICIgdG8gZG91YmxlIGZhaWxlZC4gIFZhbHVlIGlzIG91dCBvZiByYW5nZS4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGFuc3dlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBPYmplY3RbXSBhcmdzID0gbnVsbDsKKyAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIENvbGxlY3Rpb24pIHsKKyAgICAgICAgICAgIENvbGxlY3Rpb24gbGlzdCA9IChDb2xsZWN0aW9uKSBvYmplY3Q7CisgICAgICAgICAgICBhcmdzID0gbGlzdC50b0FycmF5KCk7CisgICAgICAgIH0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgT2JqZWN0W10pIHsKKyAgICAgICAgICAgIGFyZ3MgPSAoT2JqZWN0W10pIG9iamVjdDsKKyAgICAgICAgfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBNYXApIHsKKyAgICAgICAgICAgIC8vIGVtdWxhdGUgbmFtZWQgcGFyYW1zIGNvbnN0cnVjdG9yCisgICAgICAgICAgICBhcmdzID0gbmV3IE9iamVjdFsxXTsKKyAgICAgICAgICAgIGFyZ3NbMF0gPSBvYmplY3Q7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFyZ3MgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gbGV0cyB0cnkgaW52b2tlIHRoZSBjb25zdHJ1Y3RvciB3aXRoIHRoZSBsaXN0IGFzIGFyZ3VtZW50cworICAgICAgICAgICAgLy8gc3VjaCBhcyBmb3IgY3JlYXRpbmcgYSBEaW1lbnNpb24sIFBvaW50LCBDb2xvciBldGMuCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBJbnZva2VySGVscGVyLmludm9rZUNvbnN0cnVjdG9yT2YodHlwZSwgYXJncyk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnZva2VySW52b2NhdGlvbkV4Y2VwdGlvbiBpaWUpeworICAgICAgICAgICAgICAgIHRocm93IGlpZTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gbGV0cyBpZ25vcmUgZXhjZXB0aW9uIGFuZCByZXR1cm4gdGhlIG9yaWdpbmFsIG9iamVjdAorICAgICAgICAgICAgICAgIC8vIGFzIHRoZSBjYWxsZXIgaGFzIG1vcmUgY29udGV4dCB0byBiZSBhYmxlIHRvIHRocm93IGEgbW9yZQorICAgICAgICAgICAgICAgIC8vIG1lYW5pbmdmdWwgZXhjZXB0aW9uCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IEdyb292eUNhc3RFeGNlcHRpb24ob2JqZWN0LHR5cGUpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIENsYXNzIGNhc3RUb0NsYXNzKE9iamVjdCBvYmplY3QpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lIChvYmplY3QudG9TdHJpbmcoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgR3Jvb3Z5Q2FzdEV4Y2VwdGlvbihvYmplY3QsQ2xhc3MuY2xhc3MpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgYXNBcnJheShPYmplY3Qgb2JqZWN0LCBDbGFzcyB0eXBlKSB7CisgICAgICAgIENvbGxlY3Rpb24gbGlzdCA9IGFzQ29sbGVjdGlvbihvYmplY3QpOworICAgICAgICBpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOworICAgICAgICBDbGFzcyBlbGVtZW50VHlwZSA9IHR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpOworICAgICAgICBPYmplY3QgYXJyYXkgPSBBcnJheS5uZXdJbnN0YW5jZShlbGVtZW50VHlwZSwgc2l6ZSk7CisgICAgICAgIGludCBpZHggPSAwOworCisgICAgICAgIGlmIChib29sZWFuLmNsYXNzLmVxdWFscyhlbGVtZW50VHlwZSkpIHsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7IGlkeCsrKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICBBcnJheS5zZXRCb29sZWFuKGFycmF5LCBpZHgsIGJvb2xlYW5VbmJveChlbGVtZW50KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYnl0ZS5jbGFzcy5lcXVhbHMoZWxlbWVudFR5cGUpKSB7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyBpZHgrKykgeworICAgICAgICAgICAgICAgIE9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgQXJyYXkuc2V0Qnl0ZShhcnJheSwgaWR4LCBieXRlVW5ib3goZWxlbWVudCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGNoYXIuY2xhc3MuZXF1YWxzKGVsZW1lbnRUeXBlKSkgeworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgaWR4KyspIHsKKyAgICAgICAgICAgICAgICBPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIEFycmF5LnNldENoYXIoYXJyYXksIGlkeCwgY2hhclVuYm94KGVsZW1lbnQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChkb3VibGUuY2xhc3MuZXF1YWxzKGVsZW1lbnRUeXBlKSkgeworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgaWR4KyspIHsKKyAgICAgICAgICAgICAgICBPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIEFycmF5LnNldERvdWJsZShhcnJheSwgaWR4LCBkb3VibGVVbmJveChlbGVtZW50KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZmxvYXQuY2xhc3MuZXF1YWxzKGVsZW1lbnRUeXBlKSkgeworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgaWR4KyspIHsKKyAgICAgICAgICAgICAgICBPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIEFycmF5LnNldEZsb2F0KGFycmF5LCBpZHgsIGZsb2F0VW5ib3goZWxlbWVudCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGludC5jbGFzcy5lcXVhbHMoZWxlbWVudFR5cGUpKSB7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyBpZHgrKykgeworICAgICAgICAgICAgICAgIE9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgQXJyYXkuc2V0SW50KGFycmF5LCBpZHgsIGludFVuYm94KGVsZW1lbnQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChsb25nLmNsYXNzLmVxdWFscyhlbGVtZW50VHlwZSkpIHsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7IGlkeCsrKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICBBcnJheS5zZXRMb25nKGFycmF5LCBpZHgsIGxvbmdVbmJveChlbGVtZW50KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc2hvcnQuY2xhc3MuZXF1YWxzKGVsZW1lbnRUeXBlKSkgeworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgaWR4KyspIHsKKyAgICAgICAgICAgICAgICBPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIEFycmF5LnNldFNob3J0KGFycmF5LCBpZHgsIHNob3J0VW5ib3goZWxlbWVudCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgaWR4KyspIHsKKyAgICAgICAgICAgICAgICBPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIE9iamVjdCBjb2VyY2VkRWxlbWVudCA9IGNhc3RUb1R5cGUoZWxlbWVudCwgZWxlbWVudFR5cGUpOworICAgICAgICAgICAgICAgIEFycmF5LnNldChhcnJheSwgaWR4LCBjb2VyY2VkRWxlbWVudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFycmF5OworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb24gYXNDb2xsZWN0aW9uKE9iamVjdCB2YWx1ZSkgeworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gKENvbGxlY3Rpb24pIHZhbHVlOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTWFwKSB7CisgICAgICAgICAgICBNYXAgbWFwID0gKE1hcCkgdmFsdWU7CisgICAgICAgICAgICByZXR1cm4gbWFwLmVudHJ5U2V0KCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodmFsdWUuZ2V0Q2xhc3MoKS5pc0FycmF5KCkpIHsKKyAgICAgICAgICAgIGlmICh2YWx1ZS5nZXRDbGFzcygpLmdldENvbXBvbmVudFR5cGUoKS5pc1ByaW1pdGl2ZSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHByaW1pdGl2ZUFycmF5VG9MaXN0KHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KChPYmplY3RbXSkgdmFsdWUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTWV0aG9kQ2xvc3VyZSkgeworICAgICAgICAgICAgTWV0aG9kQ2xvc3VyZSBtZXRob2QgPSAoTWV0aG9kQ2xvc3VyZSkgdmFsdWU7CisgICAgICAgICAgICBJdGVyYXRvckNsb3N1cmVBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgSXRlcmF0b3JDbG9zdXJlQWRhcHRlcihtZXRob2QuZ2V0RGVsZWdhdGUoKSk7CisgICAgICAgICAgICBtZXRob2QuY2FsbChhZGFwdGVyKTsKKyAgICAgICAgICAgIHJldHVybiBhZGFwdGVyLmFzTGlzdCgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7CisgICAgICAgICAgICByZXR1cm4gRGVmYXVsdEdyb292eU1ldGhvZHMudG9MaXN0KChTdHJpbmcpIHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEdTdHJpbmcpIHsKKyAgICAgICAgICAgIHJldHVybiBEZWZhdWx0R3Jvb3Z5TWV0aG9kcy50b0xpc3QodmFsdWUudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBGaWxlKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBEZWZhdWx0R3Jvb3Z5TWV0aG9kcy5yZWFkTGluZXMoKEZpbGUpIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEdyb292eVJ1bnRpbWVFeGNlcHRpb24oIkVycm9yIHJlYWRpbmcgZmlsZTogIiArIHZhbHVlLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIGxldHMgYXNzdW1lIGl0cyBhIGNvbGxlY3Rpb24gb2YgMQorICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QodmFsdWUpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEFsbG93cyBjb252ZXJzaW9uIG9mIGFycmF5cyBpbnRvIGEgbXV0YWJsZSBMaXN0CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBhcyBhIExpc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3QgcHJpbWl0aXZlQXJyYXlUb0xpc3QoT2JqZWN0IGFycmF5KSB7CisgICAgICAgIGludCBzaXplID0gQXJyYXkuZ2V0TGVuZ3RoKGFycmF5KTsKKyAgICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdChzaXplKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIE9iamVjdCBpdGVtID0gQXJyYXkuZ2V0KGFycmF5LCBpKTsKKyAgICAgICAgICAgIGlmIChpdGVtICE9IG51bGwgJiYgaXRlbS5nZXRDbGFzcygpLmlzQXJyYXkoKSAmJiBpdGVtLmdldENsYXNzKCkuZ2V0Q29tcG9uZW50VHlwZSgpLmlzUHJpbWl0aXZlKCkpIHsKKyAgICAgICAgICAgICAgICBpdGVtID0gcHJpbWl0aXZlQXJyYXlUb0xpc3QoaXRlbSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsaXN0LmFkZChpdGVtKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGlzdDsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBPYmplY3RbXSBwcmltaXRpdmVBcnJheUJveChPYmplY3QgYXJyYXkpIHsKKyAgICAgICAgaW50IHNpemUgPSBBcnJheS5nZXRMZW5ndGgoYXJyYXkpOworICAgICAgICBPYmplY3RbXSByZXQgPSAoT2JqZWN0W10pIEFycmF5Lm5ld0luc3RhbmNlKFJlZmxlY3Rpb25DYWNoZS5hdXRvYm94VHlwZShhcnJheS5nZXRDbGFzcygpLmdldENvbXBvbmVudFR5cGUoKSksIHNpemUpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgcmV0W2ldPUFycmF5LmdldChhcnJheSwgaSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ29tcGFyZXMgdGhlIHR3byBvYmplY3RzIGhhbmRsaW5nIG51bGxzIGdyYWNlZnVsbHkgYW5kIHBlcmZvcm1pbmcgbnVtZXJpYyB0eXBlIGNvZXJjaW9uIGlmIHJlcXVpcmVkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBsZWZ0LCBPYmplY3QgcmlnaHQpIHsKKyAgICAgICAgaWYgKGxlZnQgPT0gcmlnaHQpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGlmIChsZWZ0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChyaWdodCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAobGVmdCBpbnN0YW5jZW9mIENvbXBhcmFibGUpIHsKKyAgICAgICAgICAgIGlmIChsZWZ0IGluc3RhbmNlb2YgTnVtYmVyKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzVmFsaWRDaGFyYWN0ZXJTdHJpbmcocmlnaHQpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYXN0VG9DaGFyKGxlZnQpIC0gY2FzdFRvQ2hhcihyaWdodCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyaWdodCBpbnN0YW5jZW9mIENoYXJhY3RlciB8fCByaWdodCBpbnN0YW5jZW9mIE51bWJlcikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRGVmYXVsdEdyb292eU1ldGhvZHMuY29tcGFyZVRvKChOdW1iZXIpIGxlZnQsIGNhc3RUb051bWJlcihyaWdodCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGxlZnQgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNWYWxpZENoYXJhY3RlclN0cmluZyhyaWdodCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhc3RUb0NoYXIobGVmdCkgLSBjYXN0VG9DaGFyKHJpZ2h0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocmlnaHQgaW5zdGFuY2VvZiBOdW1iZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhc3RUb0NoYXIobGVmdCkgLSBjYXN0VG9DaGFyKHJpZ2h0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChyaWdodCBpbnN0YW5jZW9mIE51bWJlcikgeworICAgICAgICAgICAgICAgIGlmIChpc1ZhbGlkQ2hhcmFjdGVyU3RyaW5nKGxlZnQpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYXN0VG9DaGFyKGxlZnQpIC0gY2FzdFRvQ2hhcihyaWdodCk7CisgICAgICAgICAgICAgICAgfSAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGxlZnQgaW5zdGFuY2VvZiBTdHJpbmcgJiYgcmlnaHQgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKChTdHJpbmcpIGxlZnQpLmNvbXBhcmVUbyhyaWdodC50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGxlZnQgaW5zdGFuY2VvZiBTdHJpbmcgJiYgcmlnaHQgaW5zdGFuY2VvZiBHU3RyaW5nKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICgoU3RyaW5nKSBsZWZ0KS5jb21wYXJlVG8ocmlnaHQudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb21wYXJhYmxlIGNvbXBhcmFibGUgPSAoQ29tcGFyYWJsZSkgbGVmdDsKKyAgICAgICAgICAgIHJldHVybiBjb21wYXJhYmxlLmNvbXBhcmVUbyhyaWdodCk7CisgICAgICAgIH0KKworICAgICAgICB0aHJvdyBuZXcgR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbigiQ2Fubm90IGNvbXBhcmUgIiArIGxlZnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHdpdGggdmFsdWUgJyIgKworICAgICAgICAgICAgICAgIGxlZnQgKyAiJyBhbmQgIiArIHJpZ2h0LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiB3aXRoIHZhbHVlICciICsgcmlnaHQgKyAiJyIpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29tcGFyZUVxdWFsKE9iamVjdCBsZWZ0LCBPYmplY3QgcmlnaHQpIHsKKyAgICAgICAgaWYgKGxlZnQgPT0gcmlnaHQpIHJldHVybiB0cnVlOworICAgICAgICBpZiAobGVmdCA9PSBudWxsIHx8IHJpZ2h0ID09IG51bGwpIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKGxlZnQgaW5zdGFuY2VvZiBDb21wYXJhYmxlKSB7CisgICAgICAgICAgICByZXR1cm4gY29tcGFyZVRvKGxlZnQsIHJpZ2h0KSA9PSAwOworICAgICAgICB9CisgICAgICAgIC8vIGhhbmRsZSBhcnJheXMgb24gYm90aCBzaWRlcyBhcyBzcGVjaWFsIGNhc2UgZm9yIGVmZmljaWVuY3kKKyAgICAgICAgQ2xhc3MgbGVmdENsYXNzID0gbGVmdC5nZXRDbGFzcygpOworICAgICAgICBDbGFzcyByaWdodENsYXNzID0gcmlnaHQuZ2V0Q2xhc3MoKTsKKyAgICAgICAgaWYgKGxlZnRDbGFzcy5pc0FycmF5KCkgJiYgcmlnaHRDbGFzcy5pc0FycmF5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBjb21wYXJlQXJyYXlFcXVhbChsZWZ0LCByaWdodCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxlZnRDbGFzcy5pc0FycmF5KCkgJiYgbGVmdENsYXNzLmdldENvbXBvbmVudFR5cGUoKS5pc1ByaW1pdGl2ZSgpKSB7CisgICAgICAgICAgICBsZWZ0ID0gcHJpbWl0aXZlQXJyYXlUb0xpc3QobGVmdCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJpZ2h0Q2xhc3MuaXNBcnJheSgpICYmIHJpZ2h0Q2xhc3MuZ2V0Q29tcG9uZW50VHlwZSgpLmlzUHJpbWl0aXZlKCkpIHsKKyAgICAgICAgICAgIHJpZ2h0ID0gcHJpbWl0aXZlQXJyYXlUb0xpc3QocmlnaHQpOworICAgICAgICB9CisgICAgICAgIGlmIChsZWZ0IGluc3RhbmNlb2YgT2JqZWN0W10gJiYgcmlnaHQgaW5zdGFuY2VvZiBMaXN0KSB7CisgICAgICAgICAgICByZXR1cm4gRGVmYXVsdEdyb292eU1ldGhvZHMuZXF1YWxzKChPYmplY3RbXSkgbGVmdCwgKExpc3QpIHJpZ2h0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAobGVmdCBpbnN0YW5jZW9mIExpc3QgJiYgcmlnaHQgaW5zdGFuY2VvZiBPYmplY3RbXSkgeworICAgICAgICAgICAgcmV0dXJuIERlZmF1bHRHcm9vdnlNZXRob2RzLmVxdWFscygoTGlzdCkgbGVmdCwgKE9iamVjdFtdKSByaWdodCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxlZnQgaW5zdGFuY2VvZiBMaXN0ICYmIHJpZ2h0IGluc3RhbmNlb2YgTGlzdCkgeworICAgICAgICAgICAgcmV0dXJuIERlZmF1bHRHcm9vdnlNZXRob2RzLmVxdWFscygoTGlzdCkgbGVmdCwgKExpc3QpIHJpZ2h0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKChCb29sZWFuKSBJbnZva2VySGVscGVyLmludm9rZU1ldGhvZChsZWZ0LCAiZXF1YWxzIiwgcmlnaHQpKS5ib29sZWFuVmFsdWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29tcGFyZUFycmF5RXF1YWwoT2JqZWN0IGxlZnQsIE9iamVjdCByaWdodCkgeworICAgICAgICBpZiAobGVmdCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gcmlnaHQgPT0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAocmlnaHQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChBcnJheS5nZXRMZW5ndGgobGVmdCkgIT0gQXJyYXkuZ2V0TGVuZ3RoKHJpZ2h0KSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQXJyYXkuZ2V0TGVuZ3RoKGxlZnQpOyBpKyspIHsKKyAgICAgICAgICAgIE9iamVjdCBsID0gQXJyYXkuZ2V0KGxlZnQsIGkpOworICAgICAgICAgICAgT2JqZWN0IHIgPSBBcnJheS5nZXQocmlnaHQsIGkpOworICAgICAgICAgICAgaWYgKCFjb21wYXJlRXF1YWwobCwgcikpIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHZhbHVlIGlzIGEgdmFsaWQgY2hhcmFjdGVyIHN0cmluZyAoaS5lLiBoYXMgbGVuZ3RoIG9mIDEpCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkQ2hhcmFjdGVyU3RyaW5nKE9iamVjdCB2YWx1ZSkgeworICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKyAgICAgICAgICAgIFN0cmluZyBzID0gKFN0cmluZykgdmFsdWU7CisgICAgICAgICAgICBpZiAocy5sZW5ndGgoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgaW50W10gY29udmVydFRvSW50QXJyYXkoT2JqZWN0IGEpIHsKKyAgICAgICAgaW50W10gYW5zID0gbnVsbDsKKworICAgICAgICAvLyBjb25zZXJ2YXRpdmUgY29kaW5nCisgICAgICAgIGlmIChhLmdldENsYXNzKCkuZ2V0TmFtZSgpLmVxdWFscygiW0kiKSkgeworICAgICAgICAgICAgYW5zID0gKGludFtdKSBhOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgT2JqZWN0W10gaWEgPSAoT2JqZWN0W10pIGE7CisgICAgICAgICAgICBhbnMgPSBuZXcgaW50W2lhLmxlbmd0aF07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlhLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGlhW2ldID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFuc1tpXSA9ICgoTnVtYmVyKSBpYVtpXSkuaW50VmFsdWUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYW5zOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbltdIGNvbnZlcnRUb0Jvb2xlYW5BcnJheShPYmplY3QgYSkgeworICAgICAgICBib29sZWFuW10gYW5zID0gbnVsbDsKKworICAgICAgICAvLyBjb25zZXJ2YXRpdmUgY29kaW5nCisgICAgICAgIGlmIChhLmdldENsYXNzKCkuZ2V0TmFtZSgpLmVxdWFscygiW1oiKSkgeworICAgICAgICAgICAgYW5zID0gKGJvb2xlYW5bXSkgYTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIE9iamVjdFtdIGlhID0gKE9iamVjdFtdKSBhOworICAgICAgICAgICAgYW5zID0gbmV3IGJvb2xlYW5baWEubGVuZ3RoXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaWEubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoaWFbaV0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYW5zW2ldID0gKChCb29sZWFuKSBpYVtpXSkuYm9vbGVhblZhbHVlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFuczsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBjb252ZXJ0VG9CeXRlQXJyYXkoT2JqZWN0IGEpIHsKKyAgICAgICAgYnl0ZVtdIGFucyA9IG51bGw7CisKKyAgICAgICAgLy8gY29uc2VydmF0aXZlIGNvZGluZworICAgICAgICBpZiAoYS5nZXRDbGFzcygpLmdldE5hbWUoKS5lcXVhbHMoIltCIikpIHsKKyAgICAgICAgICAgIGFucyA9IChieXRlW10pIGE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBPYmplY3RbXSBpYSA9IChPYmplY3RbXSkgYTsKKyAgICAgICAgICAgIGFucyA9IG5ldyBieXRlW2lhLmxlbmd0aF07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlhLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGlhW2ldICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYW5zW2ldID0gKChOdW1iZXIpIGlhW2ldKS5ieXRlVmFsdWUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFuczsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHNob3J0W10gY29udmVydFRvU2hvcnRBcnJheShPYmplY3QgYSkgeworICAgICAgICBzaG9ydFtdIGFucyA9IG51bGw7CisKKyAgICAgICAgLy8gY29uc2VydmF0aXZlIGNvZGluZworICAgICAgICBpZiAoYS5nZXRDbGFzcygpLmdldE5hbWUoKS5lcXVhbHMoIltTIikpIHsKKyAgICAgICAgICAgIGFucyA9IChzaG9ydFtdKSBhOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgT2JqZWN0W10gaWEgPSAoT2JqZWN0W10pIGE7CisgICAgICAgICAgICBhbnMgPSBuZXcgc2hvcnRbaWEubGVuZ3RoXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaWEubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBhbnNbaV0gPSAoKE51bWJlcikgaWFbaV0pLnNob3J0VmFsdWUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYW5zOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2hhcltdIGNvbnZlcnRUb0NoYXJBcnJheShPYmplY3QgYSkgeworICAgICAgICBjaGFyW10gYW5zID0gbnVsbDsKKworICAgICAgICAvLyBjb25zZXJ2YXRpdmUgY29kaW5nCisgICAgICAgIGlmIChhLmdldENsYXNzKCkuZ2V0TmFtZSgpLmVxdWFscygiW0MiKSkgeworICAgICAgICAgICAgYW5zID0gKGNoYXJbXSkgYTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIE9iamVjdFtdIGlhID0gKE9iamVjdFtdKSBhOworICAgICAgICAgICAgYW5zID0gbmV3IGNoYXJbaWEubGVuZ3RoXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaWEubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoaWFbaV0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYW5zW2ldID0gKChDaGFyYWN0ZXIpIGlhW2ldKS5jaGFyVmFsdWUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYW5zOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgbG9uZ1tdIGNvbnZlcnRUb0xvbmdBcnJheShPYmplY3QgYSkgeworICAgICAgICBsb25nW10gYW5zID0gbnVsbDsKKworICAgICAgICAvLyBjb25zZXJ2YXRpdmUgY29kaW5nCisgICAgICAgIGlmIChhLmdldENsYXNzKCkuZ2V0TmFtZSgpLmVxdWFscygiW0oiKSkgeworICAgICAgICAgICAgYW5zID0gKGxvbmdbXSkgYTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIE9iamVjdFtdIGlhID0gKE9iamVjdFtdKSBhOworICAgICAgICAgICAgYW5zID0gbmV3IGxvbmdbaWEubGVuZ3RoXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaWEubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoaWFbaV0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYW5zW2ldID0gKChOdW1iZXIpIGlhW2ldKS5sb25nVmFsdWUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYW5zOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmxvYXRbXSBjb252ZXJ0VG9GbG9hdEFycmF5KE9iamVjdCBhKSB7CisgICAgICAgIGZsb2F0W10gYW5zID0gbnVsbDsKKworICAgICAgICAvLyBjb25zZXJ2YXRpdmUgY29kaW5nCisgICAgICAgIGlmIChhLmdldENsYXNzKCkuZ2V0TmFtZSgpLmVxdWFscygiW0YiKSkgeworICAgICAgICAgICAgYW5zID0gKGZsb2F0W10pIGE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBPYmplY3RbXSBpYSA9IChPYmplY3RbXSkgYTsKKyAgICAgICAgICAgIGFucyA9IG5ldyBmbG9hdFtpYS5sZW5ndGhdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpYS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChpYVtpXSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhbnNbaV0gPSAoKE51bWJlcikgaWFbaV0pLmZsb2F0VmFsdWUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYW5zOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlW10gY29udmVydFRvRG91YmxlQXJyYXkoT2JqZWN0IGEpIHsKKyAgICAgICAgZG91YmxlW10gYW5zID0gbnVsbDsKKworICAgICAgICAvLyBjb25zZXJ2YXRpdmUgY29kaW5nCisgICAgICAgIGlmIChhLmdldENsYXNzKCkuZ2V0TmFtZSgpLmVxdWFscygiW0QiKSkgeworICAgICAgICAgICAgYW5zID0gKGRvdWJsZVtdKSBhOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgT2JqZWN0W10gaWEgPSAoT2JqZWN0W10pIGE7CisgICAgICAgICAgICBhbnMgPSBuZXcgZG91YmxlW2lhLmxlbmd0aF07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlhLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGlhW2ldID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFuc1tpXSA9ICgoTnVtYmVyKSBpYVtpXSkuZG91YmxlVmFsdWUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYW5zOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNvbnZlcnRUb1ByaW1pdGl2ZUFycmF5KE9iamVjdCBhLCBDbGFzcyB0eXBlKSB7CisgICAgICAgIGlmICh0eXBlID09IEJ5dGUuVFlQRSkgeworICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRUb0J5dGVBcnJheShhKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodHlwZSA9PSBCb29sZWFuLlRZUEUpIHsKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0VG9Cb29sZWFuQXJyYXkoYSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHR5cGUgPT0gU2hvcnQuVFlQRSkgeworICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRUb1Nob3J0QXJyYXkoYSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHR5cGUgPT0gQ2hhcmFjdGVyLlRZUEUpIHsKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0VG9DaGFyQXJyYXkoYSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHR5cGUgPT0gSW50ZWdlci5UWVBFKSB7CisgICAgICAgICAgICByZXR1cm4gY29udmVydFRvSW50QXJyYXkoYSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHR5cGUgPT0gTG9uZy5UWVBFKSB7CisgICAgICAgICAgICByZXR1cm4gY29udmVydFRvTG9uZ0FycmF5KGEpOworICAgICAgICB9CisgICAgICAgIGlmICh0eXBlID09IEZsb2F0LlRZUEUpIHsKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0VG9GbG9hdEFycmF5KGEpOworICAgICAgICB9CisgICAgICAgIGlmICh0eXBlID09IERvdWJsZS5UWVBFKSB7CisgICAgICAgICAgICByZXR1cm4gY29udmVydFRvRG91YmxlQXJyYXkoYSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gYTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS90eXBlaGFuZGxpbmcvRmxvYXRpbmdQb2ludE1hdGguamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvdHlwZWhhbmRsaW5nL0Zsb2F0aW5nUG9pbnRNYXRoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJiNTI3ZAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvdHlwZWhhbmRsaW5nL0Zsb2F0aW5nUG9pbnRNYXRoLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLnR5cGVoYW5kbGluZzsKKworLyoqCisgKiBGbG9hdGluZ1BvaW50IChEb3VibGUgYW5kIEZsb2F0KSBOdW1iZXJNYXRoIG9wZXJhdGlvbnMKKyAqIAorICogQGF1dGhvciBTdGV2ZSBHb2V0emUKKyAqLworcHVibGljIGNsYXNzIEZsb2F0aW5nUG9pbnRNYXRoIGV4dGVuZHMgTnVtYmVyTWF0aCB7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEZsb2F0aW5nUG9pbnRNYXRoIElOU1RBTkNFID0gbmV3IEZsb2F0aW5nUG9pbnRNYXRoKCk7CisJCisJcHJpdmF0ZSBGbG9hdGluZ1BvaW50TWF0aCgpIHt9CisJCQkJCisJcHJvdGVjdGVkIE51bWJlciBhYnNJbXBsKE51bWJlciBudW1iZXIpIHsKKwkJcmV0dXJuIG5ldyBEb3VibGUoTWF0aC5hYnMobnVtYmVyLmRvdWJsZVZhbHVlKCkpKTsKKwl9CisJCisJcHJvdGVjdGVkIE51bWJlciBhZGRJbXBsKE51bWJlciBsZWZ0LCBOdW1iZXIgcmlnaHQpIHsKKwkJcmV0dXJuIG5ldyBEb3VibGUobGVmdC5kb3VibGVWYWx1ZSgpICsgcmlnaHQuZG91YmxlVmFsdWUoKSk7CisJfQorCisJcHJvdGVjdGVkIE51bWJlciBzdWJ0cmFjdEltcGwoTnVtYmVyIGxlZnQsIE51bWJlciByaWdodCkgeworCQlyZXR1cm4gbmV3IERvdWJsZShsZWZ0LmRvdWJsZVZhbHVlKCkgLSByaWdodC5kb3VibGVWYWx1ZSgpKTsKKwl9CisKKwlwcm90ZWN0ZWQgTnVtYmVyIG11bHRpcGx5SW1wbChOdW1iZXIgbGVmdCwgTnVtYmVyIHJpZ2h0KSB7CisJCXJldHVybiBuZXcgRG91YmxlKGxlZnQuZG91YmxlVmFsdWUoKSAqIHJpZ2h0LmRvdWJsZVZhbHVlKCkpOworCX0KKworCXByb3RlY3RlZCBOdW1iZXIgZGl2aWRlSW1wbChOdW1iZXIgbGVmdCwgTnVtYmVyIHJpZ2h0KSB7CisJCXJldHVybiBuZXcgRG91YmxlKGxlZnQuZG91YmxlVmFsdWUoKSAvIHJpZ2h0LmRvdWJsZVZhbHVlKCkpOworCX0KKwlwcm90ZWN0ZWQgaW50IGNvbXBhcmVUb0ltcGwoTnVtYmVyIGxlZnQsIE51bWJlciByaWdodCkgeworCQlyZXR1cm4gRG91YmxlLmNvbXBhcmUobGVmdC5kb3VibGVWYWx1ZSgpLCByaWdodC5kb3VibGVWYWx1ZSgpKTsKKwl9CisgICAgCisgICAgcHJvdGVjdGVkIE51bWJlciBtb2RJbXBsKE51bWJlciBsZWZ0LCBOdW1iZXIgcmlnaHQpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEb3VibGUobGVmdC5kb3VibGVWYWx1ZSgpICUgcmlnaHQuZG91YmxlVmFsdWUoKSk7CisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCBOdW1iZXIgdW5hcnlNaW51c0ltcGwoTnVtYmVyIGxlZnQpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEb3VibGUoLWxlZnQuZG91YmxlVmFsdWUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS90eXBlaGFuZGxpbmcvR3Jvb3Z5Q2FzdEV4Y2VwdGlvbi5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS90eXBlaGFuZGxpbmcvR3Jvb3Z5Q2FzdEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlN2MzODQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL3R5cGVoYW5kbGluZy9Hcm9vdnlDYXN0RXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoNCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4NCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS50eXBlaGFuZGxpbmc7DQorDQorcHVibGljIGNsYXNzIEdyb292eUNhc3RFeGNlcHRpb24gZXh0ZW5kcyBDbGFzc0Nhc3RFeGNlcHRpb24gew0KKw0KKyAgICBwdWJsaWMgR3Jvb3Z5Q2FzdEV4Y2VwdGlvbihPYmplY3Qgb2JqZWN0VG9DYXN0LCBDbGFzcyBjbGFzc1RvQ2FzdFRvKSB7DQorICAgICAgICBzdXBlcihtYWtlTWVzc2FnZShvYmplY3RUb0Nhc3QsY2xhc3NUb0Nhc3RUbykpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBHcm9vdnlDYXN0RXhjZXB0aW9uKFN0cmluZyBzdHJpbmcpIHsNCisgICAgICAgIHN1cGVyKHN0cmluZyk7DQorICAgIH0NCisNCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG1ha2VNZXNzYWdlKE9iamVjdCBvYmplY3RUb0Nhc3QsIENsYXNzIGNsYXNzVG9DYXN0VG8pIHsNCisgICAgICAgU3RyaW5nIGNsYXNzVG9DYXN0RnJvbTsNCisgICAgICAgaWYgKG9iamVjdFRvQ2FzdCE9bnVsbCkgew0KKyAgICAgICAgICAgY2xhc3NUb0Nhc3RGcm9tID0gb2JqZWN0VG9DYXN0LmdldENsYXNzKCkuZ2V0TmFtZSgpOw0KKyAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgb2JqZWN0VG9DYXN0ID0gIm51bGwiOw0KKyAgICAgICAgICAgY2xhc3NUb0Nhc3RGcm9tID0gIm51bGwiOw0KKyAgICAgICB9DQorICAgICAgIHJldHVybiAiQ2Fubm90IGNhc3Qgb2JqZWN0ICciICsgb2JqZWN0VG9DYXN0ICsgIicgIiArDQorICAgICAgICAgICAgICAid2l0aCBjbGFzcyAnIiArIGNsYXNzVG9DYXN0RnJvbSArICInICIgKw0KKyAgICAgICAgICAgICAgInRvIGNsYXNzICciICsgY2xhc3NUb0Nhc3RUby5nZXROYW1lKCkgKyAiJyI7DQorICAgIH0NCisNCit9DQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS90eXBlaGFuZGxpbmcvSW50ZWdlckNhY2hlLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL3R5cGVoYW5kbGluZy9JbnRlZ2VyQ2FjaGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmY2MTA1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS90eXBlaGFuZGxpbmcvSW50ZWdlckNhY2hlLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoNCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4NCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS50eXBlaGFuZGxpbmc7DQorDQorcHVibGljIGNsYXNzIEludGVnZXJDYWNoZSB7DQorICAgIHByaXZhdGUgSW50ZWdlckNhY2hlKCl7fQ0KKyAgICANCisgICAgc3RhdGljIGZpbmFsIEludGVnZXIgQ0FDSEVbXSA9IG5ldyBJbnRlZ2VyWy0oLTEyOCkgKyAxMjcgKyAxXTsNCisgICAgDQorICAgIHN0YXRpYyB7DQorICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgQ0FDSEUubGVuZ3RoOyBpKyspDQorICAgICAgICAgICAgQ0FDSEVbaV0gPSBuZXcgSW50ZWdlcihpIC0gMTI4KTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBJbnRlZ2VyIGludGVnZXJWYWx1ZShpbnQgaSkgew0KKyAgICAgICAgZmluYWwgaW50IG9mZnNldCA9IDEyODsNCisgICAgICAgIGlmIChpID49IC0xMjggJiYgaSA8PSAxMjcpIHsgLy8gbXVzdCBjYWNoZSANCisgICAgICAgICAgICByZXR1cm4gQ0FDSEVbaSArIG9mZnNldF07DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gbmV3IEludGVnZXIoaSk7DQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS90eXBlaGFuZGxpbmcvSW50ZWdlck1hdGguamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvdHlwZWhhbmRsaW5nL0ludGVnZXJNYXRoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZkZjVlMgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvdHlwZWhhbmRsaW5nL0ludGVnZXJNYXRoLmphdmEKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS50eXBlaGFuZGxpbmc7CisKKy8qKgorICogSW50ZWdlciBOdW1iZXJNYXRoIG9wZXJhdGlvbnMKKyAqIAorICogQGF1dGhvciBTdGV2ZSBHb2V0emUKKyAqLworcHVibGljIGNsYXNzIEludGVnZXJNYXRoIGV4dGVuZHMgTnVtYmVyTWF0aCB7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEludGVnZXJNYXRoIElOU1RBTkNFID0gbmV3IEludGVnZXJNYXRoKCk7CisKKwlwcml2YXRlIEludGVnZXJNYXRoKCkge30KKwkJCQkJCisJcHJvdGVjdGVkIE51bWJlciBhYnNJbXBsKE51bWJlciBudW1iZXIpIHsKKwkJcmV0dXJuIG5ldyBJbnRlZ2VyKE1hdGguYWJzKG51bWJlci5pbnRWYWx1ZSgpKSk7CisJfQorCQorCXByb3RlY3RlZCBOdW1iZXIgYWRkSW1wbChOdW1iZXIgbGVmdCwgTnVtYmVyIHJpZ2h0KSB7CisJCXJldHVybiBuZXcgSW50ZWdlcihsZWZ0LmludFZhbHVlKCkgKyByaWdodC5pbnRWYWx1ZSgpKTsKKwl9CisKKwlwcm90ZWN0ZWQgTnVtYmVyIHN1YnRyYWN0SW1wbChOdW1iZXIgbGVmdCwgTnVtYmVyIHJpZ2h0KSB7CisJCXJldHVybiBuZXcgSW50ZWdlcihsZWZ0LmludFZhbHVlKCkgLSByaWdodC5pbnRWYWx1ZSgpKTsKKwl9CisKKwlwcm90ZWN0ZWQgTnVtYmVyIG11bHRpcGx5SW1wbChOdW1iZXIgbGVmdCwgTnVtYmVyIHJpZ2h0KSB7CisJCXJldHVybiBuZXcgSW50ZWdlcihsZWZ0LmludFZhbHVlKCkgKiByaWdodC5pbnRWYWx1ZSgpKTsKKwl9CisKKwlwcm90ZWN0ZWQgTnVtYmVyIGRpdmlkZUltcGwoTnVtYmVyIGxlZnQsIE51bWJlciByaWdodCkgeworCQlyZXR1cm4gQmlnRGVjaW1hbE1hdGguSU5TVEFOQ0UuZGl2aWRlSW1wbChsZWZ0LCByaWdodCk7CisJfQorCQorCXByb3RlY3RlZCBpbnQgY29tcGFyZVRvSW1wbChOdW1iZXIgbGVmdCwgTnVtYmVyIHJpZ2h0KSB7CisJCWludCBsZWZ0VmFsID0gbGVmdC5pbnRWYWx1ZSgpOworCQlpbnQgcmlnaHRWYWwgPSByaWdodC5pbnRWYWx1ZSgpOworCQlyZXR1cm4gKGxlZnRWYWw8cmlnaHRWYWwgPyAtMSA6IChsZWZ0VmFsPT1yaWdodFZhbCA/IDAgOiAxKSk7CisJfQorCisgICAgcHJvdGVjdGVkIE51bWJlciBvckltcGwoTnVtYmVyIGxlZnQsIE51bWJlciByaWdodCkgeworICAgICAgICByZXR1cm4gbmV3IEludGVnZXIobGVmdC5pbnRWYWx1ZSgpIHwgcmlnaHQuaW50VmFsdWUoKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE51bWJlciBhbmRJbXBsKE51bWJlciBsZWZ0LCBOdW1iZXIgcmlnaHQpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJbnRlZ2VyKGxlZnQuaW50VmFsdWUoKSAmIHJpZ2h0LmludFZhbHVlKCkpOworICAgIH0KKworICAgIHByb3RlY3RlZCBOdW1iZXIgeG9ySW1wbChOdW1iZXIgbGVmdCwgTnVtYmVyIHJpZ2h0KSB7CisgICAgICAgIHJldHVybiBuZXcgSW50ZWdlcihsZWZ0LmludFZhbHVlKCkgXiByaWdodC5pbnRWYWx1ZSgpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgTnVtYmVyIGludGRpdkltcGwoTnVtYmVyIGxlZnQsIE51bWJlciByaWdodCkgeworICAgICAgICByZXR1cm4gbmV3IEludGVnZXIobGVmdC5pbnRWYWx1ZSgpIC8gcmlnaHQuaW50VmFsdWUoKSk7CisgICAgfQorCQorICAgIHByb3RlY3RlZCBOdW1iZXIgbW9kSW1wbChOdW1iZXIgbGVmdCwgTnVtYmVyIHJpZ2h0KSB7CisgICAgICAgIHJldHVybiBuZXcgSW50ZWdlcihsZWZ0LmludFZhbHVlKCkgJSByaWdodC5pbnRWYWx1ZSgpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgTnVtYmVyIHVuYXJ5TWludXNJbXBsKE51bWJlciBsZWZ0KSB7CisgICAgICAgIHJldHVybiBuZXcgSW50ZWdlcigtbGVmdC5pbnRWYWx1ZSgpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgTnVtYmVyIGJpdHdpc2VOZWdhdGVJbXBsKE51bWJlciBsZWZ0KSB7CisgICAgICAgIHJldHVybiBuZXcgSW50ZWdlcih+bGVmdC5pbnRWYWx1ZSgpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgTnVtYmVyIGxlZnRTaGlmdEltcGwoTnVtYmVyIGxlZnQsIE51bWJlciByaWdodCkgeworICAgICAgICByZXR1cm4gbmV3IEludGVnZXIobGVmdC5pbnRWYWx1ZSgpIDw8IHJpZ2h0LmludFZhbHVlKCkpOworICAgIH0KKworICAgIHByb3RlY3RlZCBOdW1iZXIgcmlnaHRTaGlmdEltcGwoTnVtYmVyIGxlZnQsIE51bWJlciByaWdodCkgeworICAgICAgICByZXR1cm4gbmV3IEludGVnZXIobGVmdC5pbnRWYWx1ZSgpID4+IHJpZ2h0LmludFZhbHVlKCkpOworICAgIH0KKworICAgIHByb3RlY3RlZCBOdW1iZXIgcmlnaHRTaGlmdFVuc2lnbmVkSW1wbChOdW1iZXIgbGVmdCwgTnVtYmVyIHJpZ2h0KSB7CisgICAgICAgIHJldHVybiBuZXcgSW50ZWdlcihsZWZ0LmludFZhbHVlKCkgPj4+IHJpZ2h0LmludFZhbHVlKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvdHlwZWhhbmRsaW5nL0xvbmdNYXRoLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL3R5cGVoYW5kbGluZy9Mb25nTWF0aC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZGI4NmQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL3R5cGVoYW5kbGluZy9Mb25nTWF0aC5qYXZhCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUudHlwZWhhbmRsaW5nOworCisvKioKKyAqIExvbmcgTnVtYmVyTWF0aCBvcGVyYXRpb25zCisgKiAKKyAqIEBhdXRob3IgU3RldmUgR29ldHplCisgKi8KK3B1YmxpYyBjbGFzcyBMb25nTWF0aCBleHRlbmRzIE51bWJlck1hdGggeworCisJcHVibGljIHN0YXRpYyBmaW5hbCBMb25nTWF0aCBJTlNUQU5DRSA9IG5ldyBMb25nTWF0aCgpOworCisJcHJpdmF0ZSBMb25nTWF0aCgpIHt9CisJCQkJCQorCXByb3RlY3RlZCBOdW1iZXIgYWJzSW1wbChOdW1iZXIgbnVtYmVyKSB7CisJCXJldHVybiBuZXcgTG9uZyhNYXRoLmFicyhudW1iZXIubG9uZ1ZhbHVlKCkpKTsKKwl9CisJCisJcHJvdGVjdGVkIE51bWJlciBhZGRJbXBsKE51bWJlciBsZWZ0LCBOdW1iZXIgcmlnaHQpIHsKKwkJcmV0dXJuIG5ldyBMb25nKGxlZnQubG9uZ1ZhbHVlKCkgKyByaWdodC5sb25nVmFsdWUoKSk7CisJfQorCisJcHJvdGVjdGVkIE51bWJlciBzdWJ0cmFjdEltcGwoTnVtYmVyIGxlZnQsIE51bWJlciByaWdodCkgeworCQlyZXR1cm4gbmV3IExvbmcobGVmdC5sb25nVmFsdWUoKSAtIHJpZ2h0LmxvbmdWYWx1ZSgpKTsKKwl9CisKKwlwcm90ZWN0ZWQgTnVtYmVyIG11bHRpcGx5SW1wbChOdW1iZXIgbGVmdCwgTnVtYmVyIHJpZ2h0KSB7CisJCXJldHVybiBuZXcgTG9uZyhsZWZ0LmxvbmdWYWx1ZSgpICogcmlnaHQubG9uZ1ZhbHVlKCkpOworCX0KKworCXByb3RlY3RlZCBOdW1iZXIgZGl2aWRlSW1wbChOdW1iZXIgbGVmdCwgTnVtYmVyIHJpZ2h0KSB7CisJCXJldHVybiBCaWdEZWNpbWFsTWF0aC5JTlNUQU5DRS5kaXZpZGVJbXBsKGxlZnQsIHJpZ2h0KTsKKwl9CisJCisJcHJvdGVjdGVkIGludCBjb21wYXJlVG9JbXBsKE51bWJlciBsZWZ0LCBOdW1iZXIgcmlnaHQpIHsKKwkJbG9uZyBsZWZ0VmFsID0gbGVmdC5sb25nVmFsdWUoKTsKKwkJbG9uZyByaWdodFZhbCA9IHJpZ2h0LmxvbmdWYWx1ZSgpOworCQlyZXR1cm4gKGxlZnRWYWw8cmlnaHRWYWwgPyAtMSA6IChsZWZ0VmFsPT1yaWdodFZhbCA/IDAgOiAxKSk7CisJfQorCisJcHJvdGVjdGVkIE51bWJlciBpbnRkaXZJbXBsKE51bWJlciBsZWZ0LCBOdW1iZXIgcmlnaHQpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBMb25nKGxlZnQubG9uZ1ZhbHVlKCkgLyByaWdodC5sb25nVmFsdWUoKSk7CisJfQorCQorICAgIHByb3RlY3RlZCBOdW1iZXIgbW9kSW1wbChOdW1iZXIgbGVmdCwgTnVtYmVyIHJpZ2h0KSB7CisgICAgICAgIHJldHVybiBuZXcgTG9uZyhsZWZ0LmxvbmdWYWx1ZSgpICUgcmlnaHQubG9uZ1ZhbHVlKCkpOworICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgTnVtYmVyIHVuYXJ5TWludXNJbXBsKE51bWJlciBsZWZ0KSB7CisgICAgICAgIHJldHVybiBuZXcgTG9uZygtbGVmdC5sb25nVmFsdWUoKSk7CisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCBOdW1iZXIgYml0d2lzZU5lZ2F0ZUltcGwoTnVtYmVyIGxlZnQpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBMb25nKH5sZWZ0LmxvbmdWYWx1ZSgpKTsKKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIE51bWJlciBvckltcGwoTnVtYmVyIGxlZnQsIE51bWJlciByaWdodCkgeworICAgICAgICByZXR1cm4gbmV3IExvbmcobGVmdC5sb25nVmFsdWUoKSB8IHJpZ2h0LmxvbmdWYWx1ZSgpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgTnVtYmVyIGFuZEltcGwoTnVtYmVyIGxlZnQsIE51bWJlciByaWdodCkgeworICAgICAgICByZXR1cm4gbmV3IExvbmcobGVmdC5sb25nVmFsdWUoKSAmIHJpZ2h0LmxvbmdWYWx1ZSgpKTsKKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIE51bWJlciB4b3JJbXBsKE51bWJlciBsZWZ0LCBOdW1iZXIgcmlnaHQpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBMb25nKGxlZnQubG9uZ1ZhbHVlKCkgXiByaWdodC5sb25nVmFsdWUoKSk7CisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCBOdW1iZXIgbGVmdFNoaWZ0SW1wbChOdW1iZXIgbGVmdCwgTnVtYmVyIHJpZ2h0KSB7CisgICAgICAgIHJldHVybiBuZXcgTG9uZyhsZWZ0LmxvbmdWYWx1ZSgpIDw8IHJpZ2h0LmxvbmdWYWx1ZSgpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgTnVtYmVyIHJpZ2h0U2hpZnRJbXBsKE51bWJlciBsZWZ0LCBOdW1iZXIgcmlnaHQpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBMb25nKGxlZnQubG9uZ1ZhbHVlKCkgPj4gcmlnaHQubG9uZ1ZhbHVlKCkpOworICAgIH0KKworICAgIHByb3RlY3RlZCBOdW1iZXIgcmlnaHRTaGlmdFVuc2lnbmVkSW1wbChOdW1iZXIgbGVmdCwgTnVtYmVyIHJpZ2h0KSB7CisgICAgICAgIHJldHVybiBuZXcgTG9uZyhsZWZ0LmxvbmdWYWx1ZSgpID4+PiByaWdodC5sb25nVmFsdWUoKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE51bWJlciBiaXRBbmRJbXBsKE51bWJlciBsZWZ0LCBOdW1iZXIgcmlnaHQpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBMb25nKGxlZnQubG9uZ1ZhbHVlKCkgJiByaWdodC5sb25nVmFsdWUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS90eXBlaGFuZGxpbmcvTnVtYmVyTWF0aC5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS90eXBlaGFuZGxpbmcvTnVtYmVyTWF0aC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5Yzk5ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL3R5cGVoYW5kbGluZy9OdW1iZXJNYXRoLmphdmEKQEAgLTAsMCArMSwyNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUudHlwZWhhbmRsaW5nOworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CisKKworLyoqCisgKiBTdGF0ZWxlc3Mgb2JqZWN0cyB1c2VkIHRvIHBlcmZvcm0gbWF0aCBvbiB0aGUgdmFyaW91cyBOdW1iZXIgc3ViY2xhc3Nlcy4KKyAqIEluc3RhbmNlcyBhcmUgcmVxdWlyZWQgc28gdGhhdCBwb2x5bW9ycGhpYyBjYWxscyB3b3JrIHByb3Blcmx5LCBidXQgZWFjaAorICogc3ViY2xhc3MgY3JlYXRlcyBhIHNpbmdsZXRvbiBpbnN0YW5jZSB0byBtaW5pbWl6ZSBnYXJiYWdlLiAgQWxsIG1ldGhvZHMKKyAqIG11c3QgYmUgdGhyZWFkLXNhZmUuCisgKiAKKyAqIFRoZSBkZXNpZ24gZ29hbHMgb2YgdGhpcyBjbGFzcyBhcmUgYXMgZm9sbG93czoKKyAqIDxvbD4KKyAqIDxsaT5TdXBwb3J0IGEgJ2xlYXN0IHN1cnByaXNpbmcnIG1hdGggbW9kZWwgdG8gc2NyaXB0aW5nIGxhbmd1YWdlIHVzZXJzLiAgVGhpcworICogbWVhbnMgdGhhdCBleGFjdCwgb3IgZGVjaW1hbCBtYXRoIHNob3VsZCBiZSB1c2VkIGZvciBkZWZhdWx0IGNhbGN1bGF0aW9ucy4gIFRoaXMKKyAqIHNjaGVtZSBhc3N1bWVzIHRoYXQgYnkgZGVmYXVsdCwgZ3Jvb3Z5IGxpdGVyYWxzIHdpdGggZGVjaW1hbCBwb2ludHMgYXJlIGluc3RhbnRpYXRlZAorICogYXMgQmlnRGVjaW1hbCBvYmplY3RzIHJhdGhlciB0aGFuIGJpbmFyeSBmbG9hdGluZyBwb2ludHMgKEZsb2F0LCBEb3VibGUpLiAKKyAqIDxsaT5EbyBub3QgZm9yY2UgdGhlIGFwcGVhcmFuY2Ugb2YgZXhhY3RuZXNzIG9uIGEgbnVtYmVyIHRoYXQgaXMgYnkgZGVmaW5pdGlvbiBub3QgCisgKiBndWFyYW50ZWVkIHRvIGJlIGV4YWN0LiAgSW4gcGFydGljdWxhciB0aGlzIG1lYW5zIHRoYXQgaWYgYW4gb3BlcmFuZCBpbiBhIE51bWJlck1hdGggCisgKiBvcGVyYXRpb24gaXMgYSBiaW5hcnkgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLCBlbnN1cmUgdGhhdCB0aGUgcmVzdWx0IHJlbWFpbnMgYSBiaW5hcnkgZmxvYXRpbmcgcG9pbnQgCisgKiBudW1iZXIgKGkuZS4gbmV2ZXIgYXV0b21hdGljYWxseSBwcm9tb3RlIGEgYmluYXJ5IGZsb2F0aW5nIHBvaW50IG51bWJlciB0byBhIEJpZ0RlY2ltYWwpLiAgCisgKiBUaGlzIGhhcyB0aGUgZWZmZWN0IG9mIHByZXNlcnZpbmcgdGhlIGV4cGVjdGF0aW9ucyBvZiBiaW5hcnkgZmxvYXRpbmcgcG9pbnQgdXNlcnMgYW5kIGhlbHBzIHBlcmZvcm1hbmNlLgorICogPGxpPlByb3ZpZGUgYW4gaW1wbGVtZW50YXRpb24gdGhhdCBpcyBhcyBjbG9zZSBhcyBwcmFjdGljYWwgdG8gdGhlIEphdmEgMS41IEJpZ0RlY2ltYWwgbWF0aCBtb2RlbCAKKyAqIHdoaWNoIGltcGxlbWVudHMgcHJlY2lzaW9uIGJhc2VkIGZsb2F0aW5nIHBvaW50IGRlY2ltYWwgbWF0aCAoQU5TSSBYMy4yNzQtMTk5NiBhbmQgCisgKiBBTlNJIFgzLjI3NC0xOTk2L0FNIDEtMjAwMCAoc2VjdGlvbiA3LjQpLiAgCisgKiA8L29sPgorICogCisgKiBAYXV0aG9yIFN0ZXZlIEdvZXR6ZQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTnVtYmVyTWF0aCB7CisJCQorCXB1YmxpYyBzdGF0aWMgTnVtYmVyIGFicyhOdW1iZXIgbnVtYmVyKSB7CisJCXJldHVybiBnZXRNYXRoKG51bWJlcikuYWJzSW1wbChudW1iZXIpOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIE51bWJlciBhZGQoTnVtYmVyIGxlZnQsIE51bWJlciByaWdodCkgeworCQlyZXR1cm4gZ2V0TWF0aChsZWZ0LCByaWdodCkuYWRkSW1wbChsZWZ0LHJpZ2h0KTsKKwl9CisJCisJcHVibGljIHN0YXRpYyBOdW1iZXIgc3VidHJhY3QoTnVtYmVyIGxlZnQsIE51bWJlciByaWdodCkgeworCQlyZXR1cm4gZ2V0TWF0aChsZWZ0LHJpZ2h0KS5zdWJ0cmFjdEltcGwobGVmdCxyaWdodCk7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgTnVtYmVyIG11bHRpcGx5KE51bWJlciBsZWZ0LCBOdW1iZXIgcmlnaHQpIHsKKwkJcmV0dXJuIGdldE1hdGgobGVmdCxyaWdodCkubXVsdGlwbHlJbXBsKGxlZnQscmlnaHQpOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIE51bWJlciBkaXZpZGUoTnVtYmVyIGxlZnQsIE51bWJlciByaWdodCkgeworCQlyZXR1cm4gZ2V0TWF0aChsZWZ0LHJpZ2h0KS5kaXZpZGVJbXBsKGxlZnQscmlnaHQpOworIAl9CisgCSAKKwlwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8oTnVtYmVyIGxlZnQsIE51bWJlciByaWdodCkgeworCQlyZXR1cm4gZ2V0TWF0aChsZWZ0LHJpZ2h0KS5jb21wYXJlVG9JbXBsKGxlZnQsIHJpZ2h0KTsKKwl9CisJCisgICAgcHVibGljIHN0YXRpYyBOdW1iZXIgb3IoTnVtYmVyIGxlZnQsIE51bWJlciByaWdodCkgeworICAgICAgICByZXR1cm4gZ2V0TWF0aChsZWZ0LHJpZ2h0KS5vckltcGwobGVmdCwgcmlnaHQpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIE51bWJlciBhbmQoTnVtYmVyIGxlZnQsIE51bWJlciByaWdodCkgeworICAgICAgICByZXR1cm4gZ2V0TWF0aChsZWZ0LHJpZ2h0KS5hbmRJbXBsKGxlZnQsIHJpZ2h0KTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBOdW1iZXIgeG9yKE51bWJlciBsZWZ0LCBOdW1iZXIgcmlnaHQpIHsKKyAgICAgICAgcmV0dXJuIGdldE1hdGgobGVmdCxyaWdodCkueG9ySW1wbChsZWZ0LCByaWdodCk7CisgICAgfQorICAgIAorCXB1YmxpYyBzdGF0aWMgTnVtYmVyIGludGRpdihOdW1iZXIgbGVmdCwgTnVtYmVyIHJpZ2h0KSB7CisJCXJldHVybiBnZXRNYXRoKGxlZnQscmlnaHQpLmludGRpdkltcGwobGVmdCxyaWdodCk7CisgCX0KKworCXB1YmxpYyBzdGF0aWMgTnVtYmVyIG1vZChOdW1iZXIgbGVmdCwgTnVtYmVyIHJpZ2h0KSB7CisgICAgICAgIHJldHVybiBnZXRNYXRoKGxlZnQscmlnaHQpLm1vZEltcGwobGVmdCwgcmlnaHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZvciB0aGlzIG9wZXJhdGlvbiwgY29uc2lkZXIgdGhlIG9wZXJhbmRzIGluZGVwZW5kZW50bHkuICBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIHJpZ2h0IG9wZXJhbmQKKyAgICAgKiAoc2hpZnQgZGlzdGFuY2UpIGlzIG5vdCBhbiBpbnRlZ3JhbCB0eXBlLiAgRm9yIHRoZSBsZWZ0IG9wZXJhbmQgKHNoaWZ0IHZhbHVlKSBhbHNvIHJlcXVpcmUgYW4gaW50ZWdyYWwKKyAgICAgKiB0eXBlLCBidXQgZG8gTk9UIHByb21vdGUgZnJvbSBJbnRlZ2VyIHRvIExvbmcuICBUaGlzIGlzIGNvbnNpc3RlbnQgd2l0aCBKYXZhLCBhbmQgbWFrZXMgc2Vuc2UgZm9yIHRoZQorICAgICAqIHNoaWZ0IG9wZXJhdG9ycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE51bWJlciBsZWZ0U2hpZnQoTnVtYmVyIGxlZnQsIE51bWJlciByaWdodCkgeworCQlpZiAoaXNGbG9hdGluZ1BvaW50KHJpZ2h0KSB8fCBpc0JpZ0RlY2ltYWwocmlnaHQpKSB7CisJICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlNoaWZ0IGRpc3RhbmNlIG11c3QgYmUgYW4gaW50ZWdyYWwgdHlwZSwgYnV0ICIgKyAgcmlnaHQgKyAiICgiICsgcmlnaHQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiKSB3YXMgc3VwcGxpZWQiKTsKKwkJfQorICAgIAlyZXR1cm4gZ2V0TWF0aChsZWZ0KS5sZWZ0U2hpZnRJbXBsKGxlZnQscmlnaHQpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBGb3IgdGhpcyBvcGVyYXRpb24sIGNvbnNpZGVyIHRoZSBvcGVyYW5kcyBpbmRlcGVuZGVudGx5LiAgVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSByaWdodCBvcGVyYW5kCisgICAgICogKHNoaWZ0IGRpc3RhbmNlKSBpcyBub3QgYW4gaW50ZWdyYWwgdHlwZS4gIEZvciB0aGUgbGVmdCBvcGVyYW5kIChzaGlmdCB2YWx1ZSkgYWxzbyByZXF1aXJlIGFuIGludGVncmFsCisgICAgICogdHlwZSwgYnV0IGRvIE5PVCBwcm9tb3RlIGZyb20gSW50ZWdlciB0byBMb25nLiAgVGhpcyBpcyBjb25zaXN0ZW50IHdpdGggSmF2YSwgYW5kIG1ha2VzIHNlbnNlIGZvciB0aGUKKyAgICAgKiBzaGlmdCBvcGVyYXRvcnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBOdW1iZXIgcmlnaHRTaGlmdChOdW1iZXIgbGVmdCwgTnVtYmVyIHJpZ2h0KSB7CisJCWlmIChpc0Zsb2F0aW5nUG9pbnQocmlnaHQpIHx8IGlzQmlnRGVjaW1hbChyaWdodCkpIHsKKwkgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiU2hpZnQgZGlzdGFuY2UgbXVzdCBiZSBhbiBpbnRlZ3JhbCB0eXBlLCBidXQgIiArICByaWdodCArICIgKCIgKyByaWdodC5nZXRDbGFzcygpLmdldE5hbWUoKSArICIpIHdhcyBzdXBwbGllZCIpOworCQl9CisgICAgCXJldHVybiBnZXRNYXRoKGxlZnQpLnJpZ2h0U2hpZnRJbXBsKGxlZnQscmlnaHQpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBGb3IgdGhpcyBvcGVyYXRpb24sIGNvbnNpZGVyIHRoZSBvcGVyYW5kcyBpbmRlcGVuZGVudGx5LiAgVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSByaWdodCBvcGVyYW5kCisgICAgICogKHNoaWZ0IGRpc3RhbmNlKSBpcyBub3QgYW4gaW50ZWdyYWwgdHlwZS4gIEZvciB0aGUgbGVmdCBvcGVyYW5kIChzaGlmdCB2YWx1ZSkgYWxzbyByZXF1aXJlIGFuIGludGVncmFsCisgICAgICogdHlwZSwgYnV0IGRvIE5PVCBwcm9tb3RlIGZyb20gSW50ZWdlciB0byBMb25nLiAgVGhpcyBpcyBjb25zaXN0ZW50IHdpdGggSmF2YSwgYW5kIG1ha2VzIHNlbnNlIGZvciB0aGUKKyAgICAgKiBzaGlmdCBvcGVyYXRvcnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBOdW1iZXIgcmlnaHRTaGlmdFVuc2lnbmVkKE51bWJlciBsZWZ0LCBOdW1iZXIgcmlnaHQpIHsKKwkJaWYgKGlzRmxvYXRpbmdQb2ludChyaWdodCkgfHwgaXNCaWdEZWNpbWFsKHJpZ2h0KSkgeworCSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJTaGlmdCBkaXN0YW5jZSBtdXN0IGJlIGFuIGludGVncmFsIHR5cGUsIGJ1dCAiICsgIHJpZ2h0ICsgIiAoIiArIHJpZ2h0LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIikgd2FzIHN1cHBsaWVkIik7CisJCX0KKyAgICAJcmV0dXJuIGdldE1hdGgobGVmdCkucmlnaHRTaGlmdFVuc2lnbmVkSW1wbChsZWZ0LHJpZ2h0KTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBOdW1iZXIgdW5hcnlNaW51cyhOdW1iZXIgbGVmdCkgeworICAgICAgICByZXR1cm4gZ2V0TWF0aChsZWZ0KS51bmFyeU1pbnVzSW1wbChsZWZ0KTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRmxvYXRpbmdQb2ludChOdW1iZXIgbnVtYmVyKSB7CisJCXJldHVybiBudW1iZXIgaW5zdGFuY2VvZiBEb3VibGUgfHwgbnVtYmVyIGluc3RhbmNlb2YgRmxvYXQ7CisJfQorCisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzSW50ZWdlcihOdW1iZXIgbnVtYmVyKSB7CisJCXJldHVybiBudW1iZXIgaW5zdGFuY2VvZiBJbnRlZ2VyOworCX0KKworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0xvbmcoTnVtYmVyIG51bWJlcikgeworCQlyZXR1cm4gbnVtYmVyIGluc3RhbmNlb2YgTG9uZzsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNCaWdEZWNpbWFsKE51bWJlciBudW1iZXIpIHsKKwkJcmV0dXJuIG51bWJlciBpbnN0YW5jZW9mIEJpZ0RlY2ltYWw7CisJfQorCisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzQmlnSW50ZWdlcihOdW1iZXIgbnVtYmVyKSB7CisJCXJldHVybiBudW1iZXIgaW5zdGFuY2VvZiBCaWdJbnRlZ2VyOworCX0KKworCXB1YmxpYyBzdGF0aWMgQmlnRGVjaW1hbCB0b0JpZ0RlY2ltYWwoTnVtYmVyIG4pIHsKKwkJcmV0dXJuIChuIGluc3RhbmNlb2YgQmlnRGVjaW1hbCA/IChCaWdEZWNpbWFsKSBuIDogbmV3IEJpZ0RlY2ltYWwobi50b1N0cmluZygpKSk7CisJfQorCQkJCQorCXB1YmxpYyBzdGF0aWMgQmlnSW50ZWdlciB0b0JpZ0ludGVnZXIoTnVtYmVyIG4pIHsKKwkJcmV0dXJuIChuIGluc3RhbmNlb2YgQmlnSW50ZWdlciA/IChCaWdJbnRlZ2VyKSBuIDogbmV3IEJpZ0ludGVnZXIobi50b1N0cmluZygpKSk7CisJfQorCQkJCQkKKwkvKioKKwkgKiBEZXRlcm1pbmUgd2hpY2ggTnVtYmVyTWF0aCBpbnN0YW5jZSB0byB1c2UsIGdpdmVuIHRoZSBzdXBwbGllZCBvcGVyYW5kcy4gIFRoaXMgbWV0aG9kIGltcGxlbWVudHMKKwkgKiB0aGUgdHlwZSBwcm9tb3Rpb24gcnVsZXMgZGlzY3Vzc2VkIGluIHRoZSBkb2N1bWVudGF0aW9uLiAgTm90ZSB0aGF0IGJ5IHRoZSB0aW1lIHRoaXMgbWV0aG9kIGlzCisJICogY2FsbGVkLCBhbnkgQnl0ZSwgQ2hhcmFjdGVyIG9yIFNob3J0IG9wZXJhbmRzIHdpbGwgaGF2ZSBiZWVuIHByb21vdGVkIHRvIEludGVnZXIuICBGb3IgcmVmZXJlbmNlLAorCSAqIGhlcmUgaXMgdGhlIHByb21vdGlvbiBtYXRyaXg6CisJICogICAgYkQgYkkgIEQgIEYgIEwgIEkKKwkgKiBiRCBiRCBiRCAgRCAgRCBiRCBiRAorCSAqIGJJIGJEIGJJICBEICBEIGJJIGJJCisJICogIEQgIEQgIEQgIEQgIEQgIEQgIEQKKwkgKiAgRiAgRCAgRCAgRCAgRCAgRCAgRAorCSAqICBMIGJEIGJJICBEICBEICBMICBMCisJICogIEkgYkQgYkkgIEQgIEQgIEwgIEkKKwkgKiAKKwkgKiBOb3RlIHRoYXQgZm9yIGRpdmlzaW9uLCBpZiBlaXRoZXIgb3BlcmFuZCBpc0Zsb2F0aW5nUG9pbnQsIHRoZSByZXN1bHQgd2lsbCBiZSBmbG9hdGluZy4gIE90aGVyd2lzZSwKKwkgKiB0aGUgcmVzdWx0IGlzIEJpZ0RlY2ltYWwKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBOdW1iZXJNYXRoIGdldE1hdGgoTnVtYmVyIGxlZnQsIE51bWJlciByaWdodCkgeworCQlpZiAoaXNGbG9hdGluZ1BvaW50KGxlZnQpIHx8IGlzRmxvYXRpbmdQb2ludChyaWdodCkpIHsKKwkJCXJldHVybiBGbG9hdGluZ1BvaW50TWF0aC5JTlNUQU5DRTsKKwkJfQorCQllbHNlIGlmIChpc0JpZ0RlY2ltYWwobGVmdCkgfHwgaXNCaWdEZWNpbWFsKHJpZ2h0KSkgeworCQkJcmV0dXJuIEJpZ0RlY2ltYWxNYXRoLklOU1RBTkNFOworCQl9CisJCWVsc2UgaWYgKGlzQmlnSW50ZWdlcihsZWZ0KSB8fCBpc0JpZ0ludGVnZXIocmlnaHQpKSB7CisJCQlyZXR1cm4gQmlnSW50ZWdlck1hdGguSU5TVEFOQ0U7CisJCX0KKwkJZWxzZSBpZiAoaXNMb25nKGxlZnQpIHx8IGlzTG9uZyhyaWdodCkpeworCQkJcmV0dXJuIExvbmdNYXRoLklOU1RBTkNFOworCQl9CisJCXJldHVybiBJbnRlZ2VyTWF0aC5JTlNUQU5DRTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBOdW1iZXJNYXRoIGdldE1hdGgoTnVtYmVyIG51bWJlcikgeworCQlpZiAoaXNJbnRlZ2VyKG51bWJlcikpIHsKKwkJCXJldHVybiBJbnRlZ2VyTWF0aC5JTlNUQU5DRTsKKwkJfQorCQllbHNlIGlmIChpc0xvbmcobnVtYmVyKSkgeworCQkJcmV0dXJuIExvbmdNYXRoLklOU1RBTkNFOworCQl9CisJCWVsc2UgaWYgKGlzRmxvYXRpbmdQb2ludChudW1iZXIpKSB7CisJCQlyZXR1cm4gRmxvYXRpbmdQb2ludE1hdGguSU5TVEFOQ0U7CisJCX0JCQkKKwkJZWxzZSBpZiAoaXNCaWdEZWNpbWFsKG51bWJlcikpIHsKKwkJCXJldHVybiBCaWdEZWNpbWFsTWF0aC5JTlNUQU5DRTsKKwkJfQorCQllbHNlIGlmIChpc0JpZ0ludGVnZXIobnVtYmVyKSkgeworCQkJcmV0dXJuIEJpZ0ludGVnZXJNYXRoLklOU1RBTkNFOworCQl9CisJCWVsc2UgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQW4gdW5leHBlY3RlZCBOdW1iZXIgc3ViY2xhc3Mgd2FzIHN1cHBsaWVkLiIpOworCQl9CisJfQorCQorCS8vU3ViY2xhc3NlcyBpbXBsZW1lbnQgYWNjb3JkaW5nIHRvIHRoZSB0eXBlIHByb21vdGlvbiBoaWVyYXJjaHkgcnVsZXMKKwlwcm90ZWN0ZWQgYWJzdHJhY3QgTnVtYmVyIGFic0ltcGwoTnVtYmVyIG51bWJlcik7CisJcHJvdGVjdGVkIGFic3RyYWN0IE51bWJlciBhZGRJbXBsKE51bWJlciBsZWZ0LCBOdW1iZXIgcmlnaHQpOworCXByb3RlY3RlZCBhYnN0cmFjdCBOdW1iZXIgc3VidHJhY3RJbXBsKE51bWJlciBsZWZ0LCBOdW1iZXIgcmlnaHQpOworCXByb3RlY3RlZCBhYnN0cmFjdCBOdW1iZXIgbXVsdGlwbHlJbXBsKE51bWJlciBsZWZ0LCBOdW1iZXIgcmlnaHQpOworCXByb3RlY3RlZCBhYnN0cmFjdCBOdW1iZXIgZGl2aWRlSW1wbChOdW1iZXIgbGVmdCwgTnVtYmVyIHJpZ2h0KTsKKwlwcm90ZWN0ZWQgYWJzdHJhY3QgaW50IGNvbXBhcmVUb0ltcGwoTnVtYmVyIGxlZnQsIE51bWJlciByaWdodCk7CisgICAgcHJvdGVjdGVkIGFic3RyYWN0IE51bWJlciB1bmFyeU1pbnVzSW1wbChOdW1iZXIgbGVmdCk7CisKKworICAgIHByb3RlY3RlZCBOdW1iZXIgb3JJbXBsKE51bWJlciBsZWZ0LCBOdW1iZXIgcmlnaHQpIHsKKyAgICAgICAgdGhyb3cgY3JlYXRlVW5zdXBwb3J0ZWRFeGNlcHRpb24oIm9yKCkiLCBsZWZ0KTsKKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIE51bWJlciBhbmRJbXBsKE51bWJlciBsZWZ0LCBOdW1iZXIgcmlnaHQpIHsKKyAgICAgICAgdGhyb3cgY3JlYXRlVW5zdXBwb3J0ZWRFeGNlcHRpb24oImFuZCgpIiwgbGVmdCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE51bWJlciB4b3JJbXBsKE51bWJlciBsZWZ0LCBOdW1iZXIgcmlnaHQpIHsKKyAgICAgICAgdGhyb3cgY3JlYXRlVW5zdXBwb3J0ZWRFeGNlcHRpb24oInhvcigpIiwgbGVmdCk7CisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCBOdW1iZXIgbW9kSW1wbChOdW1iZXIgbGVmdCwgTnVtYmVyIHJpZ2h0KSB7CisgICAgICAgIHRocm93IGNyZWF0ZVVuc3VwcG9ydGVkRXhjZXB0aW9uKCJtb2QoKSIsIGxlZnQpOworICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgTnVtYmVyIGludGRpdkltcGwoTnVtYmVyIGxlZnQsIE51bWJlciByaWdodCkgeworICAgICAgICB0aHJvdyBjcmVhdGVVbnN1cHBvcnRlZEV4Y2VwdGlvbigiaW50ZGl2KCkiLCBsZWZ0KTsKKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIE51bWJlciBsZWZ0U2hpZnRJbXBsKE51bWJlciBsZWZ0LCBOdW1iZXIgcmlnaHQpIHsKKyAgICAgICAgdGhyb3cgY3JlYXRlVW5zdXBwb3J0ZWRFeGNlcHRpb24oImxlZnRTaGlmdCgpIiwgbGVmdCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE51bWJlciByaWdodFNoaWZ0SW1wbChOdW1iZXIgbGVmdCwgTnVtYmVyIHJpZ2h0KSB7CisgICAgICAgIHRocm93IGNyZWF0ZVVuc3VwcG9ydGVkRXhjZXB0aW9uKCJyaWdodFNoaWZ0KCkiLCBsZWZ0KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgTnVtYmVyIHJpZ2h0U2hpZnRVbnNpZ25lZEltcGwoTnVtYmVyIGxlZnQsIE51bWJlciByaWdodCkgeworICAgICAgICB0aHJvdyBjcmVhdGVVbnN1cHBvcnRlZEV4Y2VwdGlvbigicmlnaHRTaGlmdFVuc2lnbmVkKCkiLCBsZWZ0KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gY3JlYXRlVW5zdXBwb3J0ZWRFeGNlcHRpb24oU3RyaW5nIG9wZXJhdGlvbiwgTnVtYmVyIGxlZnQpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiQ2Fubm90IHVzZSAiICsgb3BlcmF0aW9uICsgIiBvbiB0aGlzIG51bWJlciB0eXBlOiAiICsgbGVmdC5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgd2l0aCB2YWx1ZTogIiArIGxlZnQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvdHlwZWhhbmRsaW5nL3BhY2thZ2UuaHRtbCBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvdHlwZWhhbmRsaW5nL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWU3YTkyCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS90eXBlaGFuZGxpbmcvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsMTAgQEAKKzxodG1sPg0KKyAgPGhlYWQ+DQorICAgIDx0aXRsZT5wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS50eXBlaGFuZGxpbmcqPC90aXRsZT4NCisgIDwvaGVhZD4NCisgIDxib2R5Pg0KKyAgICA8cD5DbGFzc2VzIHVzZWQgdG8gZXhlY3V0ZSBzcGVjaWFsIGFjdGlvbnMgYmFzZWQgb24gdGhlIHR5cGUuIA0KKyAgICBUaGlzIGluY2x1ZGVzIG1hdGhlbWF0aWMgb3BlcmF0aW9ucyBhbmQgd3JhcHBlciBjbGFzc2VzLg0KKyAgICA8L3A+DQorICA8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvd3JhcHBlcnMvQm9vbGVhbldyYXBwZXIuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvd3JhcHBlcnMvQm9vbGVhbldyYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzNhYTAxCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS93cmFwcGVycy9Cb29sZWFuV3JhcHBlci5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS53cmFwcGVyczsKKworLyoqCisgKiBAYXV0aG9yIEpvaG4gV2lsc29uCisgKgorICovCisKK3B1YmxpYyBjbGFzcyBCb29sZWFuV3JhcHBlciBleHRlbmRzIFBvam9XcmFwcGVyIHsKKyAgcHVibGljIEJvb2xlYW5XcmFwcGVyKGZpbmFsIGJvb2xlYW4gd3JhcHBlZCkgeworICAgIHN1cGVyKHdyYXBwZWQgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFLCBib29sZWFuLmNsYXNzKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS93cmFwcGVycy9CeXRlV3JhcHBlci5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS93cmFwcGVycy9CeXRlV3JhcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMTNlZDgKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL3dyYXBwZXJzL0J5dGVXcmFwcGVyLmphdmEKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLndyYXBwZXJzOworCisKKy8qKgorICogQGF1dGhvciBKb2huIFdpbHNvbgorICoKKyAqLworCitwdWJsaWMgY2xhc3MgQnl0ZVdyYXBwZXIgZXh0ZW5kcyBQb2pvV3JhcHBlciB7CisgIHB1YmxpYyBCeXRlV3JhcHBlcihmaW5hbCBieXRlIHdyYXBwZWQpIHsKKyAgICBzdXBlcihuZXcgQnl0ZSh3cmFwcGVkKSwgYnl0ZS5jbGFzcyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvd3JhcHBlcnMvQ2hhcldyYXBwZXIuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvd3JhcHBlcnMvQ2hhcldyYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTcxODM5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS93cmFwcGVycy9DaGFyV3JhcHBlci5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS53cmFwcGVyczsKKworLyoqCisgKiBAYXV0aG9yIEpvaG4gV2lsc29uCisgKgorICovCisKK3B1YmxpYyBjbGFzcyBDaGFyV3JhcHBlciBleHRlbmRzIFBvam9XcmFwcGVyIHsKKyAgcHVibGljIENoYXJXcmFwcGVyKGZpbmFsIGNoYXIgd3JhcHBlZCkgeworICAgIHN1cGVyKG5ldyBDaGFyYWN0ZXIod3JhcHBlZCksIGNoYXIuY2xhc3MpOworICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL3dyYXBwZXJzL0RvdWJsZVdyYXBwZXIuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvd3JhcHBlcnMvRG91YmxlV3JhcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlY2JiMzUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL3dyYXBwZXJzL0RvdWJsZVdyYXBwZXIuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUud3JhcHBlcnM7CisKKy8qKgorICogQGF1dGhvciBKb2huIFdpbHNvbgorICoKKyAqLworCitwdWJsaWMgY2xhc3MgRG91YmxlV3JhcHBlciBleHRlbmRzIFBvam9XcmFwcGVyIHsKKyAgcHVibGljIERvdWJsZVdyYXBwZXIoZmluYWwgZG91YmxlIHdyYXBwZWQpIHsKKyAgICBzdXBlcihuZXcgRG91YmxlKHdyYXBwZWQpLCBkb3VibGUuY2xhc3MpOworICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL3dyYXBwZXJzL0Zsb2F0V3JhcHBlci5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS93cmFwcGVycy9GbG9hdFdyYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjQ1ZTVlCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS93cmFwcGVycy9GbG9hdFdyYXBwZXIuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUud3JhcHBlcnM7CisKKy8qKgorICogQGF1dGhvciBKb2huIFdpbHNvbgorICoKKyAqLworCitwdWJsaWMgY2xhc3MgRmxvYXRXcmFwcGVyIGV4dGVuZHMgUG9qb1dyYXBwZXIgeworICBwdWJsaWMgRmxvYXRXcmFwcGVyKGZpbmFsIGZsb2F0IHdyYXBwZWQpIHsKKyAgICBzdXBlcihuZXcgRmxvYXQod3JhcHBlZCksIGZsb2F0LmNsYXNzKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS93cmFwcGVycy9Hcm9vdnlPYmplY3RXcmFwcGVyLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL3dyYXBwZXJzL0dyb292eU9iamVjdFdyYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTlkNDVmCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS93cmFwcGVycy9Hcm9vdnlPYmplY3RXcmFwcGVyLmphdmEKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLndyYXBwZXJzOworCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0OworaW1wb3J0IGdyb292eS5sYW5nLk1ldGFDbGFzczsKKworLyoqCisgKiBAYXV0aG9yIEpvaG4gV2lsc29uCisgKgorICovCisKK3B1YmxpYyBjbGFzcyBHcm9vdnlPYmplY3RXcmFwcGVyIGV4dGVuZHMgV3JhcHBlciB7CisgIHByb3RlY3RlZCBmaW5hbCBHcm9vdnlPYmplY3Qgd3JhcHBlZDsKKyAgCisgIHB1YmxpYyBHcm9vdnlPYmplY3RXcmFwcGVyKGZpbmFsIEdyb292eU9iamVjdCB3cmFwcGVkLCBmaW5hbCBDbGFzcyBjb25zdHJhaW5lZFR5cGUpIHsKKyAgICBzdXBlcihjb25zdHJhaW5lZFR5cGUpOworICAgIHRoaXMud3JhcHBlZCA9IHdyYXBwZWQ7CisgIH0KKyAgCisgIHB1YmxpYyBPYmplY3QgdW53cmFwKCkgeworICAgIHJldHVybiB0aGlzLndyYXBwZWQ7CisgIH0KKyAgCisgIC8qKgorICAgKiBOb3RlIHRoZSByZXN0IG9mIHRoZXNlIG1ldGhvZCB3aWxsIG9ubHkgYmUgdXNlZCBwb3N0IDEuMAorICAgKi8KKworICAvKiAobm9uLUphdmFkb2MpCisgICAqIEBzZWUgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0I2dldFByb3BlcnR5KGphdmEubGFuZy5TdHJpbmcpCisgICAqLworICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KGZpbmFsIFN0cmluZyBwcm9wZXJ0eSkgeworICAgIHJldHVybiB0aGlzLndyYXBwZWQuZ2V0UHJvcGVydHkocHJvcGVydHkpOworICB9CisKKyAgLyogKG5vbi1KYXZhZG9jKQorICAgKiBAc2VlIGdyb292eS5sYW5nLkdyb292eU9iamVjdCNpbnZva2VNZXRob2QoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkKKyAgICovCisgIHB1YmxpYyBPYmplY3QgaW52b2tlTWV0aG9kKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBPYmplY3QgYXJncykgeworICAgIHJldHVybiB0aGlzLndyYXBwZWQuaW52b2tlTWV0aG9kKG5hbWUsIGFyZ3MpOworICB9CisKKyAgLyogKG5vbi1KYXZhZG9jKQorICAgKiBAc2VlIGdyb292eS5sYW5nLkdyb292eU9iamVjdCNzZXRNZXRhQ2xhc3MoZ3Jvb3Z5LmxhbmcuTWV0YUNsYXNzKQorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0TWV0YUNsYXNzKGZpbmFsIE1ldGFDbGFzcyBtZXRhQ2xhc3MpIHsKKyAgICB0aGlzLndyYXBwZWQuc2V0TWV0YUNsYXNzKG1ldGFDbGFzcyk7CisgIH0KKworICAvKiAobm9uLUphdmFkb2MpCisgICAqIEBzZWUgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0I3NldFByb3BlcnR5KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpCisgICAqLworICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShmaW5hbCBTdHJpbmcgcHJvcGVydHksIGZpbmFsIE9iamVjdCBuZXdWYWx1ZSkgeworICAgIHRoaXMud3JhcHBlZC5zZXRQcm9wZXJ0eShwcm9wZXJ0eSwgbmV3VmFsdWUpOworICB9CisKKyAgcHJvdGVjdGVkIE9iamVjdCBnZXRXcmFwcGVkKCkgeworICAgIHJldHVybiB0aGlzLndyYXBwZWQ7CisgIH0KKworICBwcm90ZWN0ZWQgTWV0YUNsYXNzIGdldERlbGVnYXRlZE1ldGFDbGFzcygpIHsKKyAgICByZXR1cm4gdGhpcy53cmFwcGVkLmdldE1ldGFDbGFzcygpOworICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL3dyYXBwZXJzL0ludFdyYXBwZXIuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvd3JhcHBlcnMvSW50V3JhcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjZDFjYWUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL3dyYXBwZXJzL0ludFdyYXBwZXIuamF2YQpAQCAtMCwwICsxLDI5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUud3JhcHBlcnM7CisKKworLyoqCisgKiBAYXV0aG9yIEpvaG4gV2lsc29uCisgKgorICovCisKK3B1YmxpYyBjbGFzcyBJbnRXcmFwcGVyIGV4dGVuZHMgUG9qb1dyYXBwZXIgeworICBwdWJsaWMgSW50V3JhcHBlcihmaW5hbCBpbnQgd3JhcHBlZCkgeworICAgIHN1cGVyKG5ldyBJbnRlZ2VyKHdyYXBwZWQpLCBpbnQuY2xhc3MpOworICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL3dyYXBwZXJzL0xvbmdXcmFwcGVyLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL3dyYXBwZXJzL0xvbmdXcmFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTlkMjU3NgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvd3JhcHBlcnMvTG9uZ1dyYXBwZXIuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUud3JhcHBlcnM7CisKKy8qKgorICogQGF1dGhvciBKb2huIFdpbHNvbgorICoKKyAqLworCitwdWJsaWMgY2xhc3MgTG9uZ1dyYXBwZXIgZXh0ZW5kcyBQb2pvV3JhcHBlciB7CisgIHB1YmxpYyBMb25nV3JhcHBlcihmaW5hbCBsb25nIHdyYXBwZWQpIHsKKyAgICBzdXBlcihuZXcgTG9uZyh3cmFwcGVkKSwgbG9uZy5jbGFzcyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvd3JhcHBlcnMvUG9qb1dyYXBwZXIuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvd3JhcHBlcnMvUG9qb1dyYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTJhOWY1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS93cmFwcGVycy9Qb2pvV3JhcHBlci5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS53cmFwcGVyczsKKworaW1wb3J0IGdyb292eS5sYW5nLk1ldGFDbGFzczsKKworCisvKioKKyAqIEBhdXRob3IgSm9obiBXaWxzb24KKyAqCisgKi8KKworcHVibGljIGNsYXNzIFBvam9XcmFwcGVyIGV4dGVuZHMgV3JhcHBlciB7CisgIHByb3RlY3RlZCBNZXRhQ2xhc3MgZGVsZWdhdGU7CisgIHByb3RlY3RlZCBmaW5hbCBPYmplY3Qgd3JhcHBlZDsKKyAgCisgIHB1YmxpYyBQb2pvV3JhcHBlcihmaW5hbCBPYmplY3Qgd3JhcHBlZCwgZmluYWwgQ2xhc3MgY29uc3RyYWluZWRUeXBlKSB7CisgICAgc3VwZXIoY29uc3RyYWluZWRUeXBlKTsKKyAgICB0aGlzLndyYXBwZWQgPSB3cmFwcGVkOworICAgIAorICAgIC8qCisgICAgICogVGhpcyBjaGVjayBpcyB0ZW1wb3JhcnkgLSByZW1vdmUgYmVmb3JlIDEuMCByZWxlYXNlCisgICAgICovCisvLyAgICBpZiAod3JhcHBlZCBpbnN0YW5jZW9mIEdyb292eU9iamVjdCkgeworLy8gICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigidHJ5aW5nIHRvIHdyYXAgdGhlIGdyb292eU9iamVjdCAiCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgd3JhcHBlZC5nZXRDbGFzcygpLmdldE5hbWUoKQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaW4gYSBQb2pvV3JhcHBlciIpOworLy8gICAgfQorICB9CisgIAorICBwdWJsaWMgT2JqZWN0IHVud3JhcCgpIHsKKyAgICByZXR1cm4gdGhpcy53cmFwcGVkOworICB9CisgIAorICAvKioKKyAgICogTm90ZSB0aGUgcmVzdCBvZiB0aGVzZSBtZXRob2Qgd2lsbCBvbmx5IGJlIHVzZWQgcG9zdCAxLjAKKyAgICovCisKKyAgLyogKG5vbi1KYXZhZG9jKQorICAgKiBAc2VlIGdyb292eS5sYW5nLkdyb292eU9iamVjdCNnZXRQcm9wZXJ0eShqYXZhLmxhbmcuU3RyaW5nKQorICAgKi8KKyAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShmaW5hbCBTdHJpbmcgcHJvcGVydHkpIHsKKyAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZS5nZXRQcm9wZXJ0eSh0aGlzLndyYXBwZWQsIHByb3BlcnR5KTsKKyAgfQorCisgIC8qIChub24tSmF2YWRvYykKKyAgICogQHNlZSBncm9vdnkubGFuZy5Hcm9vdnlPYmplY3QjaW52b2tlTWV0aG9kKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpCisgICAqLworICBwdWJsaWMgT2JqZWN0IGludm9rZU1ldGhvZChmaW5hbCBTdHJpbmcgbWV0aG9kTmFtZSwgZmluYWwgT2JqZWN0IGFyZ3VtZW50cykgeworICAgIHJldHVybiB0aGlzLmRlbGVnYXRlLmludm9rZU1ldGhvZCh0aGlzLndyYXBwZWQsIG1ldGhvZE5hbWUsIGFyZ3VtZW50cyk7CisgIH0KKworICAvKiAobm9uLUphdmFkb2MpCisgICAqIEBzZWUgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0I3NldE1ldGFDbGFzcyhncm9vdnkubGFuZy5NZXRhQ2xhc3MpCisgICAqLworICBwdWJsaWMgdm9pZCBzZXRNZXRhQ2xhc3MoZmluYWwgTWV0YUNsYXNzIG1ldGFDbGFzcykgeworICAgIHRoaXMuZGVsZWdhdGUgPSBtZXRhQ2xhc3M7CisgIH0KKworICAvKiAobm9uLUphdmFkb2MpCisgICAqIEBzZWUgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0I3NldFByb3BlcnR5KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpCisgICAqLworICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShmaW5hbCBTdHJpbmcgcHJvcGVydHksIGZpbmFsIE9iamVjdCBuZXdWYWx1ZSkgeworICAgIHRoaXMuZGVsZWdhdGUuc2V0UHJvcGVydHkodGhpcy53cmFwcGVkLCBwcm9wZXJ0eSwgbmV3VmFsdWUpOworICB9CisKKyAgcHJvdGVjdGVkIE9iamVjdCBnZXRXcmFwcGVkKCkgeworICAgIHJldHVybiB0aGlzLndyYXBwZWQ7CisgIH0KKworICBwcm90ZWN0ZWQgTWV0YUNsYXNzIGdldERlbGVnYXRlZE1ldGFDbGFzcygpIHsKKyAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS93cmFwcGVycy9TaG9ydFdyYXBwZXIuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvd3JhcHBlcnMvU2hvcnRXcmFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU0ZDc0YgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvd3JhcHBlcnMvU2hvcnRXcmFwcGVyLmphdmEKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLndyYXBwZXJzOworCisvKioKKyAqIEBhdXRob3IgSm9obiBXaWxzb24KKyAqCisgKi8KKworcHVibGljIGNsYXNzIFNob3J0V3JhcHBlciBleHRlbmRzIFBvam9XcmFwcGVyIHsKKyAgcHVibGljIFNob3J0V3JhcHBlcihmaW5hbCBzaG9ydCB3cmFwcGVkKSB7CisgICAgc3VwZXIobmV3IFNob3J0KHdyYXBwZWQpLCBzaG9ydC5jbGFzcyk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS93cmFwcGVycy9XcmFwcGVyLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL3dyYXBwZXJzL1dyYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmZhNzdjCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS93cmFwcGVycy9XcmFwcGVyLmphdmEKQEAgLTAsMCArMSwyNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS53cmFwcGVyczsKKworLy9pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CisvL2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisvL2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKy8vaW1wb3J0IGphdmEudXRpbC5NYXA7CisvLworLy9pbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuQ2xhc3NOb2RlOworCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0OworaW1wb3J0IGdyb292eS5sYW5nLk1ldGFDbGFzczsKKy8vaW1wb3J0IGdyb292eS5sYW5nLk1ldGFNZXRob2Q7CisKKy8qKgorICogQGF1dGhvciBKb2huIFdpbHNvbgorICoKKyAqLworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgV3JhcHBlciBpbXBsZW1lbnRzIEdyb292eU9iamVjdCB7CisgICAgcHJvdGVjdGVkIE1ldGFDbGFzcyBkZWxlZ2F0aW5nTWV0YUNsYXNzOworICAgIAorLy8gIHByb3RlY3RlZCBNZXRhQ2xhc3MgZGVsZWdhdGluZ01ldGFDbGFzcyA9IG5ldyBNZXRhQ2xhc3MoT2JqZWN0LmNsYXNzKSB7CisvLyAgICAvKioKKy8vICAgICAqIEBwYXJhbSBvYmoKKy8vICAgICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKy8vICAgICAqLworLy8gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKy8vICAgICAgcmV0dXJuIFdyYXBwZXIudGhpcy5nZXREZWxlZ2F0ZWRNZXRhQ2xhc3MoKS5lcXVhbHMob2JqKTsKKy8vICAgIH0KKy8vCisvLyAgICAvKioKKy8vICAgICAqIEBwYXJhbSBvYmplY3QKKy8vICAgICAqIEBwYXJhbSBhdHRyaWJ1dGUKKy8vICAgICAqIEBzZWUgZ3Jvb3Z5LmxhbmcuTWV0YUNsYXNzI2dldEF0dHJpYnV0ZShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nKQorLy8gICAgICovCisvLyAgICBwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgYXR0cmlidXRlKSB7CisvLyAgICAgIHJldHVybiBXcmFwcGVyLnRoaXMuZ2V0RGVsZWdhdGVkTWV0YUNsYXNzKCkuZ2V0QXR0cmlidXRlKFdyYXBwZXIudGhpcy5nZXRXcmFwcGVkKCksIGF0dHJpYnV0ZSk7CisvLyAgICB9CisvLworLy8gICAgLyoqCisvLyAgICAgKiBAc2VlIGdyb292eS5sYW5nLk1ldGFDbGFzcyNnZXRDbGFzc05vZGUoKQorLy8gICAgICovCisvLyAgICBwdWJsaWMgQ2xhc3NOb2RlIGdldENsYXNzTm9kZSgpIHsKKy8vICAgICAgcmV0dXJuIFdyYXBwZXIudGhpcy5nZXREZWxlZ2F0ZWRNZXRhQ2xhc3MoKS5nZXRDbGFzc05vZGUoKTsKKy8vICAgIH0KKy8vCisvLyAgICAvKioKKy8vICAgICAqIEBzZWUgZ3Jvb3Z5LmxhbmcuTWV0YUNsYXNzI2dldE1ldGFNZXRob2RzKCkKKy8vICAgICAqLworLy8gICAgcHVibGljIExpc3QgZ2V0TWV0YU1ldGhvZHMoKSB7CisvLyAgICAgIHJldHVybiBXcmFwcGVyLnRoaXMuZ2V0RGVsZWdhdGVkTWV0YUNsYXNzKCkuZ2V0TWV0YU1ldGhvZHMoKTsKKy8vICAgIH0KKy8vCisvLyAgICAvKioKKy8vICAgICAqIEBzZWUgZ3Jvb3Z5LmxhbmcuTWV0YUNsYXNzI2dldE1ldGhvZHMoKQorLy8gICAgICovCisvLyAgICBwdWJsaWMgTGlzdCBnZXRNZXRob2RzKCkgeworLy8gICAgICByZXR1cm4gV3JhcHBlci50aGlzLmdldERlbGVnYXRlZE1ldGFDbGFzcygpLmdldE1ldGhvZHMoKTsKKy8vICAgIH0KKy8vCisvLyAgICAvKioKKy8vICAgICAqIEBzZWUgZ3Jvb3Z5LmxhbmcuTWV0YUNsYXNzI2dldFByb3BlcnRpZXMoKQorLy8gICAgICovCisvLyAgICBwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0aWVzKCkgeworLy8gICAgICByZXR1cm4gV3JhcHBlci50aGlzLmdldERlbGVnYXRlZE1ldGFDbGFzcygpLmdldFByb3BlcnRpZXMoKTsKKy8vICAgIH0KKy8vCisvLyAgICAvKioKKy8vICAgICAqIEBwYXJhbSBvYmplY3QKKy8vICAgICAqIEBwYXJhbSBwcm9wZXJ0eQorLy8gICAgICogQHNlZSBncm9vdnkubGFuZy5NZXRhQ2xhc3MjZ2V0UHJvcGVydHkoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZykKKy8vICAgICAqLworLy8gICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpIHsKKy8vICAgICAgcmV0dXJuIFdyYXBwZXIudGhpcy5nZXREZWxlZ2F0ZWRNZXRhQ2xhc3MoKS5nZXRQcm9wZXJ0eShXcmFwcGVyLnRoaXMuZ2V0V3JhcHBlZCgpLCBwcm9wZXJ0eSk7CisvLyAgICB9CisvLworLy8gICAgLyoqCisvLyAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKQorLy8gICAgICovCisvLyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworLy8gICAgICByZXR1cm4gV3JhcHBlci50aGlzLmdldERlbGVnYXRlZE1ldGFDbGFzcygpLmhhc2hDb2RlKCk7CisvLyAgICB9CisvLworLy8gICAgLyoqCisvLyAgICAgKiBAcGFyYW0gYXJndW1lbnRzCisvLyAgICAgKiBAc2VlIGdyb292eS5sYW5nLk1ldGFDbGFzcyNpbnZva2VDb25zdHJ1Y3RvcihqYXZhLmxhbmcuT2JqZWN0W10pCisvLyAgICAgKi8KKy8vICAgIHB1YmxpYyBPYmplY3QgaW52b2tlQ29uc3RydWN0b3IoT2JqZWN0W10gYXJndW1lbnRzKSB7CisvLyAgICAgIHJldHVybiBXcmFwcGVyLnRoaXMuZ2V0RGVsZWdhdGVkTWV0YUNsYXNzKCkuaW52b2tlQ29uc3RydWN0b3IoYXJndW1lbnRzKTsKKy8vICAgIH0KKy8vCisvLyAgICAvKioKKy8vICAgICAqIEBwYXJhbSBhdAorLy8gICAgICogQHBhcmFtIGFyZ3VtZW50cworLy8gICAgICogQHNlZSBncm9vdnkubGFuZy5NZXRhQ2xhc3MjaW52b2tlQ29uc3RydWN0b3JBdChqYXZhLmxhbmcuQ2xhc3MsIGphdmEubGFuZy5PYmplY3RbXSkKKy8vICAgICAqLworLy8gICAgcHVibGljIE9iamVjdCBpbnZva2VDb25zdHJ1Y3RvckF0KENsYXNzIGF0LCBPYmplY3RbXSBhcmd1bWVudHMpIHsKKy8vICAgICAgcmV0dXJuIFdyYXBwZXIudGhpcy5nZXREZWxlZ2F0ZWRNZXRhQ2xhc3MoKS5pbnZva2VDb25zdHJ1Y3RvckF0KGF0LCBhcmd1bWVudHMpOworLy8gICAgfQorLy8KKy8vICAgIC8qKgorLy8gICAgICogQHBhcmFtIG9iamVjdAorLy8gICAgICogQHBhcmFtIG1ldGhvZE5hbWUKKy8vICAgICAqIEBwYXJhbSBhcmd1bWVudHMKKy8vICAgICAqIEBzZWUgZ3Jvb3Z5LmxhbmcuTWV0YUNsYXNzI2ludm9rZU1ldGhvZChqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KQorLy8gICAgICovCisvLyAgICBwdWJsaWMgT2JqZWN0IGludm9rZU1ldGhvZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbWV0aG9kTmFtZSwgT2JqZWN0IGFyZ3VtZW50cykgeworLy8gICAgICByZXR1cm4gV3JhcHBlci50aGlzLmdldERlbGVnYXRlZE1ldGFDbGFzcygpLmludm9rZU1ldGhvZChXcmFwcGVyLnRoaXMuZ2V0V3JhcHBlZCgpLCBtZXRob2ROYW1lLCBhcmd1bWVudHMpOworLy8gICAgfQorLy8KKy8vICAgIC8qKgorLy8gICAgICogQHBhcmFtIG9iamVjdAorLy8gICAgICogQHBhcmFtIG1ldGhvZE5hbWUKKy8vICAgICAqIEBwYXJhbSBhcmd1bWVudHMKKy8vICAgICAqIEBzZWUgZ3Jvb3Z5LmxhbmcuTWV0YUNsYXNzI2ludm9rZU1ldGhvZChqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0W10pCisvLyAgICAgKi8KKy8vICAgIHB1YmxpYyBPYmplY3QgaW52b2tlTWV0aG9kKE9iamVjdCBvYmplY3QsIFN0cmluZyBtZXRob2ROYW1lLCBPYmplY3RbXSBhcmd1bWVudHMpIHsKKy8vICAgICAgcmV0dXJuIFdyYXBwZXIudGhpcy5nZXREZWxlZ2F0ZWRNZXRhQ2xhc3MoKS5pbnZva2VNZXRob2QoV3JhcHBlci50aGlzLmdldFdyYXBwZWQoKSwgbWV0aG9kTmFtZSwgYXJndW1lbnRzKTsKKy8vICAgIH0KKy8vCisvLyAgICAvKioKKy8vICAgICAqIEBwYXJhbSBvYmplY3QKKy8vICAgICAqIEBwYXJhbSBtZXRob2ROYW1lCisvLyAgICAgKiBAcGFyYW0gYXJndW1lbnRzCisvLyAgICAgKiBAc2VlIGdyb292eS5sYW5nLk1ldGFDbGFzcyNpbnZva2VTdGF0aWNNZXRob2QoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdFtdKQorLy8gICAgICovCisvLyAgICBwdWJsaWMgT2JqZWN0IGludm9rZVN0YXRpY01ldGhvZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbWV0aG9kTmFtZSwgT2JqZWN0W10gYXJndW1lbnRzKSB7CisvLyAgICAgIHJldHVybiBXcmFwcGVyLnRoaXMuZ2V0RGVsZWdhdGVkTWV0YUNsYXNzKCkuaW52b2tlU3RhdGljTWV0aG9kKFdyYXBwZXIudGhpcy5nZXRXcmFwcGVkKCksIG1ldGhvZE5hbWUsIGFyZ3VtZW50cyk7CisvLyAgICB9CisvLworLy8gICAgLyoqCisvLyAgICAgKiBAcGFyYW0gYXJndW1lbnRzCisvLyAgICAgKiBAc2VlIGdyb292eS5sYW5nLk1ldGFDbGFzcyNyZXRyaWV2ZUNvbnN0cnVjdG9yKGphdmEubGFuZy5DbGFzc1tdKQorLy8gICAgICovCisvLyAgICBwdWJsaWMgQ29uc3RydWN0b3IgcmV0cmlldmVDb25zdHJ1Y3RvcihDbGFzc1tdIGFyZ3VtZW50cykgeworLy8gICAgICByZXR1cm4gV3JhcHBlci50aGlzLmdldERlbGVnYXRlZE1ldGFDbGFzcygpLnJldHJpZXZlQ29uc3RydWN0b3IoYXJndW1lbnRzKTsKKy8vICAgIH0KKy8vCisvLyAgICAvKioKKy8vICAgICAqIEBwYXJhbSBvd25lcgorLy8gICAgICogQHBhcmFtIG1ldGhvZE5hbWUKKy8vICAgICAqIEBwYXJhbSBhcmd1bWVudHMKKy8vICAgICAqIEBzZWUgZ3Jvb3Z5LmxhbmcuTWV0YUNsYXNzI3JldHJpZXZlTWV0aG9kKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3RbXSkKKy8vICAgICAqLworLy8gICAgcHVibGljIE1ldGFNZXRob2QgcmV0cmlldmVNZXRob2QoT2JqZWN0IG93bmVyLCBTdHJpbmcgbWV0aG9kTmFtZSwgT2JqZWN0W10gYXJndW1lbnRzKSB7CisvLyAgICAgIHJldHVybiBXcmFwcGVyLnRoaXMuZ2V0RGVsZWdhdGVkTWV0YUNsYXNzKCkucmV0cmlldmVNZXRob2Qob3duZXIsIG1ldGhvZE5hbWUsIGFyZ3VtZW50cyk7CisvLyAgICB9CisvLworLy8gICAgLyoqCisvLyAgICAgKiBAcGFyYW0gbWV0aG9kTmFtZQorLy8gICAgICogQHBhcmFtIGFyZ3VtZW50cworLy8gICAgICogQHNlZSBncm9vdnkubGFuZy5NZXRhQ2xhc3MjcmV0cmlldmVNZXRob2QoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLkNsYXNzW10pCisvLyAgICAgKi8KKy8vICAgIHB1YmxpYyBNZXRhTWV0aG9kIHJldHJpZXZlTWV0aG9kKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzc1tdIGFyZ3VtZW50cykgeworLy8gICAgICByZXR1cm4gV3JhcHBlci50aGlzLmdldERlbGVnYXRlZE1ldGFDbGFzcygpLnJldHJpZXZlTWV0aG9kKG1ldGhvZE5hbWUsIGFyZ3VtZW50cyk7CisvLyAgICB9CisvLworLy8gICAgLyoqCisvLyAgICAgKiBAcGFyYW0gbWV0aG9kTmFtZQorLy8gICAgICogQHBhcmFtIGFyZ3VtZW50cworLy8gICAgICogQHNlZSBncm9vdnkubGFuZy5NZXRhQ2xhc3MjcmV0cmlldmVTdGF0aWNNZXRob2QoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLkNsYXNzW10pCisvLyAgICAgKi8KKy8vICAgIHB1YmxpYyBNZXRhTWV0aG9kIHJldHJpZXZlU3RhdGljTWV0aG9kKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzc1tdIGFyZ3VtZW50cykgeworLy8gICAgICByZXR1cm4gV3JhcHBlci50aGlzLmdldERlbGVnYXRlZE1ldGFDbGFzcygpLnJldHJpZXZlU3RhdGljTWV0aG9kKG1ldGhvZE5hbWUsIGFyZ3VtZW50cyk7CisvLyAgICB9CisvLworLy8gICAgLyoqCisvLyAgICAgKiBAcGFyYW0gb2JqZWN0CisvLyAgICAgKiBAcGFyYW0gYXR0cmlidXRlCisvLyAgICAgKiBAcGFyYW0gbmV3VmFsdWUKKy8vICAgICAqIEBzZWUgZ3Jvb3Z5LmxhbmcuTWV0YUNsYXNzI3NldEF0dHJpYnV0ZShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KQorLy8gICAgICovCisvLyAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGF0dHJpYnV0ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7CisvLyAgICAgIFdyYXBwZXIudGhpcy5nZXREZWxlZ2F0ZWRNZXRhQ2xhc3MoKS5zZXRBdHRyaWJ1dGUoV3JhcHBlci50aGlzLmdldFdyYXBwZWQoKSwgYXR0cmlidXRlLCBuZXdWYWx1ZSk7CisvLyAgICB9CisvLworLy8gICAgLyoqCisvLyAgICAgKiBAcGFyYW0gYmVhbgorLy8gICAgICogQHBhcmFtIG1hcAorLy8gICAgICogQHNlZSBncm9vdnkubGFuZy5NZXRhQ2xhc3Mjc2V0UHJvcGVydGllcyhqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLnV0aWwuTWFwKQorLy8gICAgICovCisvLyAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0aWVzKE9iamVjdCBiZWFuLCBNYXAgbWFwKSB7CisvLyAgICAgIFdyYXBwZXIudGhpcy5nZXREZWxlZ2F0ZWRNZXRhQ2xhc3MoKS5zZXRQcm9wZXJ0aWVzKFdyYXBwZXIudGhpcy5nZXRXcmFwcGVkKCksIG1hcCk7CisvLyAgICB9CisvLworLy8gICAgLyoqCisvLyAgICAgKiBAcGFyYW0gb2JqZWN0CisvLyAgICAgKiBAcGFyYW0gcHJvcGVydHkKKy8vICAgICAqIEBwYXJhbSBuZXdWYWx1ZQorLy8gICAgICogQHNlZSBncm9vdnkubGFuZy5NZXRhQ2xhc3Mjc2V0UHJvcGVydHkoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkKKy8vICAgICAqLworLy8gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgbmV3VmFsdWUpIHsKKy8vICAgICAgV3JhcHBlci50aGlzLmdldERlbGVnYXRlZE1ldGFDbGFzcygpLnNldFByb3BlcnR5KFdyYXBwZXIudGhpcy5nZXRXcmFwcGVkKCksIHByb3BlcnR5LCBuZXdWYWx1ZSk7CisvLyAgICB9CisvLworLy8gICAgLyoqCisvLyAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQorLy8gICAgICovCisvLyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworLy8gICAgICByZXR1cm4gV3JhcHBlci50aGlzLmdldERlbGVnYXRlZE1ldGFDbGFzcygpLnRvU3RyaW5nKCk7CisvLyAgICB9CisvLworLy8gICAgLyogKG5vbi1KYXZhZG9jKQorLy8gICAgICogQHNlZSBncm9vdnkubGFuZy5NZXRhQ2xhc3MjYWRkTmV3SW5zdGFuY2VNZXRob2QoamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kKQorLy8gICAgICovCisvLyAgICBwdWJsaWMgdm9pZCBhZGROZXdJbnN0YW5jZU1ldGhvZChNZXRob2QgbWV0aG9kKSB7CisvLyAgICAgIFdyYXBwZXIudGhpcy5nZXREZWxlZ2F0ZWRNZXRhQ2xhc3MoKS5hZGROZXdJbnN0YW5jZU1ldGhvZChtZXRob2QpOworLy8gICAgfQorLy8KKy8vICAgIC8qIChub24tSmF2YWRvYykKKy8vICAgICAqIEBzZWUgZ3Jvb3Z5LmxhbmcuTWV0YUNsYXNzI2FkZE5ld1N0YXRpY01ldGhvZChqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QpCisvLyAgICAgKi8KKy8vICAgIHB1YmxpYyB2b2lkIGFkZE5ld1N0YXRpY01ldGhvZChNZXRob2QgbWV0aG9kKSB7CisvLyAgICAgIFdyYXBwZXIudGhpcy5nZXREZWxlZ2F0ZWRNZXRhQ2xhc3MoKS5hZGROZXdTdGF0aWNNZXRob2QobWV0aG9kKTsKKy8vICAgIH0KKy8vCisvLyAgICAvKiAobm9uLUphdmFkb2MpCisvLyAgICAgKiBAc2VlIGdyb292eS5sYW5nLk1ldGFDbGFzcyNjaGVja0luaXRpYWxpc2VkKCkKKy8vICAgICAqLworLy8gICAgcHVibGljIHZvaWQgY2hlY2tJbml0aWFsaXNlZCgpIHsKKy8vICAgICAgV3JhcHBlci50aGlzLmdldERlbGVnYXRlZE1ldGFDbGFzcygpLmNoZWNrSW5pdGlhbGlzZWQoKTsKKy8vICAgIH0KKy8vCisvLyAgICAvKiAobm9uLUphdmFkb2MpCisvLyAgICAgKiBAc2VlIGdyb292eS5sYW5nLk1ldGFDbGFzcyNwaWNrTWV0aG9kKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3RbXSkKKy8vICAgICAqLworLy8gICAgcHVibGljIE1ldGFNZXRob2QgcGlja01ldGhvZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbWV0aG9kTmFtZSwgT2JqZWN0W10gYXJndW1lbnRzKSB7CisvLyAgICAgIHJldHVybiBXcmFwcGVyLnRoaXMuZ2V0RGVsZWdhdGVkTWV0YUNsYXNzKCkucGlja01ldGhvZChvYmplY3QsIG1ldGhvZE5hbWUsIGFyZ3VtZW50cyk7CisvLyAgICB9CisvLworLy8gICAgLyogKG5vbi1KYXZhZG9jKQorLy8gICAgICogQHNlZSBncm9vdnkubGFuZy5NZXRhQ2xhc3MjcGlja01ldGhvZChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuQ2xhc3NbXSkKKy8vICAgICAqLworLy8gICAgcHVibGljIE1ldGFNZXRob2QgcGlja01ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3NbXSBhcmd1bWVudHMpIHsKKy8vICAgICAgcmV0dXJuIFdyYXBwZXIudGhpcy5nZXREZWxlZ2F0ZWRNZXRhQ2xhc3MoKS5waWNrTWV0aG9kKG1ldGhvZE5hbWUsIGFyZ3VtZW50cyk7CisvLyAgICB9CisvLyAgfTsKKyAgCisgIHByb3RlY3RlZCBmaW5hbCBDbGFzcyBjb25zdHJhaW5lZFR5cGU7CisgIAorICBwdWJsaWMgV3JhcHBlcihmaW5hbCBDbGFzcyBjb25zdHJhaW5lZFR5cGUpIHsKKyAgICB0aGlzLmNvbnN0cmFpbmVkVHlwZSA9IGNvbnN0cmFpbmVkVHlwZTsKKyAgfQorCisgIC8qIChub24tSmF2YWRvYykKKyAgICogQHNlZSBncm9vdnkubGFuZy5Hcm9vdnlPYmplY3QjZ2V0TWV0YUNsYXNzKCkKKyAgICogCisgICAqIFRoaXMgd2lsbCBvbmx5IGJlIHVzZWZ1bCBwb3N0IDEuMAorICAgKi8KKyAgcHVibGljIE1ldGFDbGFzcyBnZXRNZXRhQ2xhc3MoKSB7CisgICAgcmV0dXJuIHRoaXMuZGVsZWdhdGluZ01ldGFDbGFzczsKKyAgfQorICAKKyAgcHVibGljIGFic3RyYWN0IE9iamVjdCB1bndyYXAoKTsKKyAgCisgIHB1YmxpYyBDbGFzcyBnZXRUeXBlKCkgeworICAgIHJldHVybiB0aGlzLmNvbnN0cmFpbmVkVHlwZTsKKyAgfQorICAKKyAgcHJvdGVjdGVkIGFic3RyYWN0IE9iamVjdCBnZXRXcmFwcGVkKCk7CisgIHByb3RlY3RlZCBhYnN0cmFjdCBNZXRhQ2xhc3MgZ2V0RGVsZWdhdGVkTWV0YUNsYXNzKCk7Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL3dyYXBwZXJzL3BhY2thZ2UuaHRtbCBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvd3JhcHBlcnMvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZDU1YWYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL3dyYXBwZXJzL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDggQEAKKzxodG1sPgorICA8aGVhZD4KKyAgICA8dGl0bGU+cGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUud3JhcHBlcnMuKjwvdGl0bGU+CisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgPHA+R3Jvb3Z5IHdyYXBwZXIgY2xhc3NlcyBmb3IgcHJpbWl0aXZlIHR5cGVzLjwvcD4KKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L0FTVEhlbHBlci5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L0FTVEhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNzRiMDIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvQVNUSGVscGVyLmphdmEKQEAgLTAsMCArMSwzMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheDsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LkNsYXNzTm9kZTsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5Nb2R1bGVOb2RlOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5Tb3VyY2VVbml0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIEEgY29tbW9uIGJhc2UgY2xhc3Mgb2YgQVNUIGhlbHBlciBtZXRob2RzIHdoaWNoIGNhbiBiZSBzaGFyZWQgYWNyb3NzIHRoZSBjbGFzc2ljIGFuZCBuZXcgcGFyc2VycworICoKKyAqIEBhdXRob3IgSm9jaGVuIFRoZW9kb3JvdQorICogQGF1dGhvciBKYW1lcyBTdHJhY2hhbgorICogQGF1dGhvciBCb2IgTWNXaGlydGVyCisgKiBAYXV0aG9yIFNhbSBQdWxsYXJhCisgKiBAYXV0aG9yIENocmlzIFBvaXJpZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIEFTVEhlbHBlciB7CisKKyAgICAvKiogVGhlIFNvdXJjZVVuaXQgY29udHJvbGxpbmcgdXMgKi8KKyAgICBwcml2YXRlIFNvdXJjZVVuaXQgY29udHJvbGxlcjsKKworICAgIC8qKiBPdXIgQ2xhc3NMb2FkZXIsIHdoaWNoIHByb3ZpZGVzIGluZm9ybWF0aW9uIG9uIGV4dGVybmFsIHR5cGVzICovCisgICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcjsKKworICAgIC8qKiBPdXIgaW1wb3J0cywgc2ltcGxlIG5hbWUgPT4gZnVsbHkgcXVhbGlmaWVkIG5hbWUgKi8KKyAgICBwcm90ZWN0ZWQgTWFwIGltcG9ydHM7CisgICAgLyoqIE91ciBleHBsaWNpdCBzdGF0aWMgaW1wb3J0cywgc2ltcGxlIG5hbWUgPT4gZnVsbHkgcXVhbGlmaWVkIG5hbWUgKi8KKyAgICBwcm90ZWN0ZWQgTWFwIHN0YXRpY0ltcG9ydHM7CisgICAgLyoqIE91ciBpbXBsaWNpdCBzdGF0aWMgaW1wb3J0cyAqLworICAgIHByb3RlY3RlZCBMaXN0IHN0YXRpY0RvdEltcG9ydHM7CisgICAgcHJvdGVjdGVkIE1vZHVsZU5vZGUgb3V0cHV0OworCisgICAgLyoqIFRoZSBwYWNrYWdlIG5hbWUgaW4gd2hpY2ggdGhlIG1vZHVsZSBzaXRzICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcGFja2FnZU5hbWU7ICAgLy8KKworICAgIC8vIFRPRE8gc2hvdWxkIHRoaXMgcmVhbGx5IGJlIHN0YXRpYz8/PworICAgIHByb3RlY3RlZCBzdGF0aWMgTWFwIHJlc29sdXRpb25zID0gbmV3IEhhc2hNYXAoKTsgIC8vIGNsZWFyZWQgb24gYnVpbGQoKSwgdG8gYmUgc2FmZQorCisvLyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgTk9UX1JFU09MVkVEID0gbmV3IFN0cmluZygpOworCisgICAgLyoqIHRlbXBvcmFyaWx5IHN0b3JlIHRoZSBjbGFzcyBuYW1lcyB0aGF0IHRoZSBjdXJyZW50IG1vZHVsZW5vZGUgY29udGFpbnMgKi8KKyAgICBwcml2YXRlIGZpbmFsIExpc3QgbmV3Q2xhc3NlcyA9IG5ldyBBcnJheUxpc3QoKTsKKworICAgIHB1YmxpYyBBU1RIZWxwZXIoU291cmNlVW5pdCBjb250cm9sbGVyLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgeworICAgICAgICB0aGlzKCk7CisgICAgICAgIHRoaXMuY29udHJvbGxlciA9IGNvbnRyb2xsZXI7CisgICAgICAgIHRoaXMuY2xhc3NMb2FkZXIgPSBjbGFzc0xvYWRlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgQVNUSGVscGVyKCkgeworICAgICAgICBpbXBvcnRzID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgc3RhdGljSW1wb3J0cyA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIHN0YXRpY0RvdEltcG9ydHMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHBhY2thZ2VOYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhY2thZ2VOYW1lKFN0cmluZyBwYWNrYWdlTmFtZSkgeworICAgICAgICB0aGlzLnBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU7CisgICAgICAgIGlmIChwYWNrYWdlTmFtZSE9bnVsbCAmJiBwYWNrYWdlTmFtZS5sZW5ndGgoKT4wKXsKKyAgICAgICAgICAgIHBhY2thZ2VOYW1lKz0nLic7CisgICAgICAgIH0KKyAgICAgICAgb3V0cHV0LnNldFBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgb3VyIGNsYXNzIGxvYWRlciAoYXMgc3VwcGxpZWQgb24gY29uc3RydWN0aW9uKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXIoKSB7CisgICAgICAgIHJldHVybiBjbGFzc0xvYWRlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc0xvYWRlcihDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgeworICAgICAgICB0aGlzLmNsYXNzTG9hZGVyID0gY2xhc3NMb2FkZXI7CisgICAgfQorCisgICAgcHVibGljIFNvdXJjZVVuaXQgZ2V0Q29udHJvbGxlcigpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29udHJvbGxlcihTb3VyY2VVbml0IGNvbnRyb2xsZXIpIHsKKyAgICAgICAgdGhpcy5jb250cm9sbGVyID0gY29udHJvbGxlcjsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIGZvciBhbnkgZ2l2ZW4gcG90ZW50aWFsIHR5cGUKKyAgICAgKiBuYW1lLiAgUmV0dXJucyBudWxsIGlmIG5vIHF1YWxpZmllZCBuYW1lIGNvdWxkIGJlIGRldGVybWluZWQuCisgICAgICovCisvKiAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVOYW1lKFN0cmluZyBuYW1lLCBib29sZWFuIHNhZmUpIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVXNlIG91ciBjYWNoZSBvZiByZXNvbHV0aW9ucywgaWYgcG9zc2libGUKKworICAgICAgICBTdHJpbmcgcmVzb2x1dGlvbiA9IChTdHJpbmcpIHJlc29sdXRpb25zLmdldChuYW1lKTsKKyAgICAgICAgaWYgKE5PVF9SRVNPTFZFRC5lcXVhbHMocmVzb2x1dGlvbikpIHsKKyAgICAgICAgICAgIHJldHVybiAoc2FmZSA/IG5hbWUgOiBudWxsKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChyZXNvbHV0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKSByZXNvbHV0aW9uOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGdldENsYXNzTG9hZGVyKCkubG9hZENsYXNzKG5hbWUpOworICAgICAgICAgICAgcmVzb2x1dGlvbnMucHV0KG5hbWUsbmFtZSk7CisgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjbmZlKXsKKyAgICAgICAgICAgIGlmIChjbmZlLmdldENhdXNlKCkgaW5zdGFuY2VvZiBNdWx0aXBsZUNvbXBpbGF0aW9uRXJyb3JzRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgTXVsdGlwbGVDb21waWxhdGlvbkVycm9yc0V4Y2VwdGlvbiBtY2VlID0gKE11bHRpcGxlQ29tcGlsYXRpb25FcnJvcnNFeGNlcHRpb24pIGNuZmUuZ2V0Q2F1c2UoKTsKKyAgICAgICAgICAgICAgICBjb250cm9sbGVyLmdldEVycm9yQ29sbGVjdG9yKCkuYWRkQ29sbGVjdG9yQ29udGVudHMobWNlZS5nZXRFcnJvckNvbGxlY3RvcigpKTsKKyAgICAgICAgICAgICAgICByZXNvbHV0aW9ucy5wdXQobmFtZSxuYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoTm9DbGFzc0RlZkZvdW5kRXJyb3IgbmNkZmUpIHsKKyAgICAgICAgICAgIC8vZmFsbCB0aHJvdWdoCisgICAgICAgIH0KKworICAgICAgICBkbyB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gSWYgdGhlIHR5cGUgbmFtZSBjb250YWlucyBhICIuIiwgaXQncyBwcm9iYWJseSBmdWxseQorICAgICAgICAgICAgLy8gcXVhbGlmaWVkLCBhbmQgd2UgZG9uJ3QgdGFrZSBpdCB0byB2ZXJpZmljYXRpb24gaGVyZS4KKworICAgICAgICAgICAgaWYgKG5hbWUuaW5kZXhPZigiLiIpID49IDApIHsKKyAgICAgICAgICAgICAgICByZXNvbHV0aW9uID0gbmFtZTsKKyAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDw8PCBGTE9XIENPTlRST0wgPDw8PDw8PDw8CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgd2UnbGwgbmVlZCB0aGUgc2NhbGFyIHR5cGUgZm9yIGNoZWNraW5nLCBhbmQKKyAgICAgICAgICAgIC8vIHRoZSBwb3N0Zml4IGZvciByZWFzc2VtYmx5LgorCisgICAgICAgICAgICBTdHJpbmcgc2NhbGFyID0gbmFtZSwgcG9zdGZpeCA9ICIiOworICAgICAgICAgICAgd2hpbGUgKHNjYWxhci5lbmRzV2l0aCgiW10iKSkgeworICAgICAgICAgICAgICAgIHNjYWxhciA9IHNjYWxhci5zdWJzdHJpbmcoMCwgc2NhbGFyLmxlbmd0aCgpIC0gMik7CisgICAgICAgICAgICAgICAgcG9zdGZpeCArPSAiW10iOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBQcmltaXRpdmUgdHlwZXMgYXJlIGFsbCB2YWxpZC4uLgorCisgICAgICAgICAgICBpZiAoVHlwZXMub2ZUeXBlKFR5cGVzLmxvb2t1cEtleXdvcmQoc2NhbGFyKSwgVHlwZXMuUFJJTUlUSVZFX1RZUEUpKSB7CisgICAgICAgICAgICAgICAgcmVzb2x1dGlvbiA9IG5hbWU7CisgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA8PDwgRkxPVyBDT05UUk9MIDw8PDw8PDw8PAorICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBOZXh0LCBjaGVjayBvdXIgaW1wb3J0cyBhbmQgcmV0dXJuIHRoZSBxdWFsaWZpZWQgbmFtZSwKKyAgICAgICAgICAgIC8vIGlmIGF2YWlsYWJsZS4KKworICAgICAgICAgICAgaWYgKHRoaXMuaW1wb3J0cy5jb250YWluc0tleShzY2FsYXIpKSB7CisgICAgICAgICAgICAgICAgcmVzb2x1dGlvbiA9ICgoU3RyaW5nKSB0aGlzLmltcG9ydHMuZ2V0KHNjYWxhcikpICsgcG9zdGZpeDsKKyAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDw8PCBGTE9XIENPTlRST0wgPDw8PDw8PDw8CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIE5leHQsIHNlZSBpZiBvdXIgY2xhc3MgbG9hZGVyIGNhbiByZXNvbHZlIGl0IGluIHRoZSBjdXJyZW50IHBhY2thZ2UuCisKKyAgICAgICAgICAgIGlmIChwYWNrYWdlTmFtZSAhPSBudWxsICYmIHBhY2thZ2VOYW1lLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGdldENsYXNzTG9hZGVyKCkubG9hZENsYXNzKGRvdChwYWNrYWdlTmFtZSwgc2NhbGFyKSk7CisgICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24gPSBkb3QocGFja2FnZU5hbWUsIG5hbWUpOworCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA8PDwgRkxPVyBDT05UUk9MIDw8PDw8PDw8PAorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gY25mZSl7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbmZlLmdldENhdXNlKCkgaW5zdGFuY2VvZiBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbiA9IGRvdChwYWNrYWdlTmFtZSwgbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIG5jZGZlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vZmFsbCB0aHJvdWdoCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBzZWFyY2ggdGhlIHBhY2thZ2UgaW1wb3J0cyBwYXRoCisgICAgICAgICAgICBMaXN0IHBhY2thZ2VJbXBvcnRzID0gb3V0cHV0LmdldEltcG9ydFBhY2thZ2VzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhY2thZ2VJbXBvcnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHBhY2sgPSAoU3RyaW5nKSBwYWNrYWdlSW1wb3J0cy5nZXQoaSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGNsc05hbWUgPSBwYWNrICsgbmFtZTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBnZXRDbGFzc0xvYWRlcigpLmxvYWRDbGFzcyhjbHNOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbiA9IGNsc05hbWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gY25mZSl7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbmZlLmdldENhdXNlKCkgaW5zdGFuY2VvZiBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbiA9IGNsc05hbWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIG5jZGZlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vZmFsbCB0aHJvdWdoCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJlc29sdXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gTGFzdCBjaGFuY2UsIGNoZWNrIHRoZSBkZWZhdWx0IGltcG9ydHMuCisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgREVGQVVMVF9JTVBPUlRTLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHF1YWxpZmllZCA9IERFRkFVTFRfSU1QT1JUU1tpXSArIHNjYWxhcjsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBnZXRDbGFzc0xvYWRlcigpLmxvYWRDbGFzcyhxdWFsaWZpZWQpOworCisgICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24gPSBxdWFsaWZpZWQgKyBwb3N0Zml4OworICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPDw8IEZMT1cgQ09OVFJPTCA8PDw8PDw8PDwKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGNuZmUpeworICAgICAgICAgICAgICAgICAgICBpZiAoY25mZS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24gPSBxdWFsaWZpZWQgKyBwb3N0Zml4OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBuY2RmZWUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKGZhbHNlKTsKKworCisgICAgICAgIC8vCisgICAgICAgIC8vIENhY2hlIHRoZSBzb2x1dGlvbiBhbmQgcmV0dXJuIGl0CisKKyAgICAgICAgaWYgKHJlc29sdXRpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgcmVzb2x1dGlvbnMucHV0KG5hbWUsIE5PVF9SRVNPTFZFRCk7CisgICAgICAgICAgICByZXR1cm4gKHNhZmUgPyBuYW1lIDogbnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByZXNvbHV0aW9ucy5wdXQobmFtZSwgcmVzb2x1dGlvbik7CisgICAgICAgICAgICByZXR1cm4gcmVzb2x1dGlvbjsKKyAgICAgICAgfQorICAgIH0KKyovCisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0d28gbmFtZXMgam9pbmVkIGJ5IGEgZG90LiAgSWYgdGhlIGJhc2UgbmFtZSBpcworICAgICAqIGVtcHR5LCByZXR1cm5zIHRoZSBuYW1lIHVuY2hhbmdlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBkb3QoU3RyaW5nIGJhc2UsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIGlmIChiYXNlICE9IG51bGwgJiYgYmFzZS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIHJldHVybiBiYXNlICsgIi4iICsgbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIG1ha2VNb2R1bGUoKSB7CisgICAgICAgIHRoaXMubmV3Q2xhc3Nlcy5jbGVhcigpOworICAgICAgICB0aGlzLm91dHB1dCA9IG5ldyBNb2R1bGVOb2RlKGNvbnRyb2xsZXIpOworICAgICAgICByZXNvbHV0aW9ucy5jbGVhcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgc3lub255bSBmb3IgPGNvZGU+ZG90KCBiYXNlLCAiIiApPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGRvdChTdHJpbmcgYmFzZSkgeworICAgICAgICByZXR1cm4gZG90KGJhc2UsICIiKTsKKyAgICB9CisKKyAgICAvKnByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZU5ld0NsYXNzT3JOYW1lKFN0cmluZyBuYW1lLCBib29sZWFuIHNhZmUpIHsKKyAgICAgICAgaWYgKHRoaXMubmV3Q2xhc3Nlcy5jb250YWlucyhuYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuIGRvdChwYWNrYWdlTmFtZSwgbmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZU5hbWUobmFtZSwgc2FmZSk7CisgICAgICAgIH0KKyAgICB9Ki8KKworICAgIHByb3RlY3RlZCB2b2lkIGFkZE5ld0NsYXNzTmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLm5ld0NsYXNzZXMuYWRkKG5hbWUpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGltcG9ydENsYXNzKENsYXNzTm9kZSB0eXBlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGFzKSB7CisgICAgICAgIGlmIChhcyA9PSBudWxsKSBhcz1uYW1lOworCisgICAgICAgIG91dHB1dC5hZGRJbXBvcnQoYXMsIHR5cGUpOyAKKyAgICAgICAgaW1wb3J0cy5wdXQoYXMsIHR5cGUpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHN0YXRpY0ltcG9ydE1ldGhvZE9yRmllbGQoQ2xhc3NOb2RlIHR5cGUsIFN0cmluZyBuYW1lLCBTdHJpbmcgYWxpYXMpIHsKKyAgICAgICAgaWYgKGFsaWFzID09IG51bGwpIGFsaWFzID0gbmFtZTsKKyAgICAgICAgb3V0cHV0LmFkZFN0YXRpY01ldGhvZE9yRmllbGQodHlwZSwgbmFtZSwgYWxpYXMpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHN0YXRpY0ltcG9ydENsYXNzV2l0aFN0YXIoQ2xhc3NOb2RlIHR5cGUsIFN0cmluZyBpbXBvcnRDbGFzcykgeworICAgICAgICAvLyBrZWVwIHRyYWNrIG9mIHRoZSBmYWN0IHRoYXQgaXQgd2FzIGEgc3RhdGljIGltcG9ydAorICAgICAgICBvdXRwdXQuYWRkU3RhdGljSW1wb3J0Q2xhc3MoaW1wb3J0Q2xhc3MsIHR5cGUpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGltcG9ydFBhY2thZ2VXaXRoU3RhcihTdHJpbmcgaW1wb3J0UGFja2FnZSkgeworICAgICAgICBTdHJpbmdbXSBjbGFzc2VzID0gb3V0cHV0LmFkZEltcG9ydFBhY2thZ2UoIGRvdChpbXBvcnRQYWNrYWdlKSApOworICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGNsYXNzZXMubGVuZ3RoOyBpKysgKSB7CisgICAgICAgICAgICBpbXBvcnRzLnB1dCggY2xhc3Nlc1tpXSwgZG90KGltcG9ydFBhY2thZ2UsIGNsYXNzZXNbaV0pICk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvQ1NUTm9kZS5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L0NTVE5vZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTllOTIxCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L0NTVE5vZGUuamF2YQpAQCAtMCwwICsxLDU4MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXg7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5Lkdyb292eUJ1Z0Vycm9yOworCitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKKworCisvKioKKyAqICBBbiBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBub2RlcyBpbiB0aGUgY29uY3JldGUgc3ludGF4IHRyZWUgdGhhdCBpcworICogIHRoZSByZXN1bHQgb2YgcGFyc2luZy4gIE5vdGUgdGhhdCB0aGUgQ1NUTm9kZSBpcyBpbmV4dHJpY2FibHkgbGlua2VkCisgKiAgd2l0aCB0aGUgVG9rZW4gaW4gdGhhdCBldmVyeSBDU1ROb2RlIGhhcyBhIFRva2VuIGFzIGl0J3Mgcm9vdC4KKyAqCisgKiAgQHNlZSBhbnRsci5QYXJzZXIKKyAqICBAc2VlIFRva2VuCisgKiAgQHNlZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5SZWR1Y3Rpb24KKyAqICBAc2VlIG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LlR5cGVzCisgKgorICogIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmJvYkB3ZXJrZW4uY29tIj5ib2IgbWN3aGlydGVyPC9hPgorICogIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNwb2lyaWVyQGRyZWFtaW5nLm9yZyI+Q2hyaXMgUG9pcmllcjwvYT4KKyAqCisgKiAgQHZlcnNpb24gJElkJAorICovCisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBDU1ROb2RlCit7CisKKyAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gTk9ERSBJREVOVElGSUNBVElPTiBBTkQgTUVBTklORworCisKKyAgIC8qKgorICAgICogIFJldHVybnMgdGhlIG1lYW5pbmcgb2YgdGhpcyBub2RlLiAgSWYgdGhlIG5vZGUgaXNFbXB0eSgpLCByZXR1cm5zCisgICAgKiAgdGhlIHR5cGUgb2YgVG9rZW4uTlVMTC4KKyAgICAqLworCisgICAgcHVibGljIGludCBnZXRNZWFuaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiBnZXRSb290KCB0cnVlICkuZ2V0TWVhbmluZygpOworICAgIH0KKworCisKKyAgIC8qKgorICAgICogIFNldHMgdGhlIG1lYW5pbmcgZm9yIHRoaXMgbm9kZSAoYW5kIGl0J3Mgcm9vdCBUb2tlbikuICBOb3QKKyAgICAqICB2YWxpZCBpZiB0aGUgbm9kZSBpc0VtcHR5KCkuICBSZXR1cm5zIHRoZSBub2RlLCBmb3IgY29udmVuaWVuY2UuCisgICAgKi8KKworICAgIHB1YmxpYyBDU1ROb2RlIHNldE1lYW5pbmcoIGludCBtZWFuaW5nICkKKyAgICB7CisgICAgICAgIGdldFJvb3QoKS5zZXRNZWFuaW5nKCBtZWFuaW5nICk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworCisKKyAgIC8qKgorICAgICogIFJldHVybnMgdGhlIGFjdHVhbCB0eXBlIG9mIHRoZSBub2RlLiAgSWYgdGhlIG5vZGUgaXNFbXB0eSgpLCByZXR1cm5zCisgICAgKiAgdGhlIHR5cGUgb2YgVG9rZW4uTlVMTC4KKyAgICAqLworCisgICAgcHVibGljIGludCBnZXRUeXBlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBnZXRSb290KCB0cnVlICkuZ2V0VHlwZSgpOworICAgIH0KKworCisKKyAgIC8qKgorICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGUgbm9kZSBjYW4gYmUgY29lcmNlZCB0byB0aGUgc3BlY2lmaWVkIHR5cGUuCisgICAgKi8KKworICAgIHB1YmxpYyBib29sZWFuIGNhbk1lYW4oIGludCB0eXBlICkKKyAgICB7CisgICAgICAgIHJldHVybiBUeXBlcy5jYW5NZWFuKCBnZXRNZWFuaW5nKCksIHR5cGUgKTsKKyAgICB9CisKKworCisgICAvKioKKyAgICAqICBSZXR1cm5zIHRydWUgaWYgdGhlIG5vZGUncyBtZWFuaW5nIG1hdGNoZXMgdGhlIHNwZWNpZmllZCB0eXBlLgorICAgICovCisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0EoIGludCB0eXBlICkKKyAgICB7CisgICAgICAgIHJldHVybiBUeXBlcy5vZlR5cGUoIGdldE1lYW5pbmcoKSwgdHlwZSApOworICAgIH0KKworCisKKyAgIC8qKgorICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGUgbm9kZSdzIG1lYW5pbmcgbWF0Y2hlcyBhbnkgb2YgdGhlIHNwZWNpZmllZCB0eXBlcy4KKyAgICAqLworCisgICAgcHVibGljIGJvb2xlYW4gaXNPbmVPZiggaW50W10gdHlwZXMgKQorICAgIHsKKyAgICAgICAgaW50IG1lYW5pbmcgPSBnZXRNZWFuaW5nKCk7CisgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggVHlwZXMub2ZUeXBlKG1lYW5pbmcsIHR5cGVzW2ldKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisKKworICAgLyoqCisgICAgKiAgUmV0dXJucyB0cnVlIGlmIHRoZSBub2RlJ3MgbWVhbmluZyBtYXRjaGVzIGFsbCBvZiB0aGUgc3BlY2lmaWVkIHR5cGVzLgorICAgICovCisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FsbE9mKCBpbnRbXSB0eXBlcyApCisgICAgeworICAgICAgICBpbnQgbWVhbmluZyA9IGdldE1lYW5pbmcoKTsKKyAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCAhVHlwZXMub2ZUeXBlKG1lYW5pbmcsIHR5cGVzW2ldKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisKKworICAgLyoqCisgICAgKiAgUmV0dXJucyB0aGUgZmlyc3QgbWF0Y2hpbmcgbWVhbmluZyBvZiB0aGUgc3BlY2lmaWVkIHR5cGVzLgorICAgICogIFJldHVybnMgVHlwZXMuVU5LTk9XTiBpZiB0aGVyZSBhcmUgbm8gbWF0Y2hlcy4KKyAgICAqLworCisgICAgcHVibGljIGludCBnZXRNZWFuaW5nQXMoIGludFtdIHR5cGVzICkKKyAgICB7CisKKyAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBpc0EodHlwZXNbaV0pICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHlwZXNbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gVHlwZXMuVU5LTk9XTjsKKyAgICB9CisKKworCisKKyAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gVFlQRSBTVUdBUgorCisKKyAgIC8qKgorICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGUgbm9kZSBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgdHlwZS4gIEVmZmVjdGl2ZWx5CisgICAgKiAgYSBzeW5vbnltIGZvciA8Y29kZT5pc0EoKTwvY29kZT4uICBNaXNzaW5nIG5vZGVzIGFyZSBUb2tlbi5OVUxMLgorICAgICovCisKKyAgICBib29sZWFuIG1hdGNoZXMoIGludCB0eXBlICkKKyAgICB7CisgICAgICAgIHJldHVybiBpc0EodHlwZSk7CisgICAgfQorCisKKworICAgLyoqCisgICAgKiAgUmV0dXJucyB0cnVlIGlmIHRoZSBub2RlIGFuZCBpdCdzIGZpcnN0IGNoaWxkIG1hdGNoIHRoZSBzcGVjaWZpZWQKKyAgICAqICB0eXBlcy4gIE1pc3Npbmcgbm9kZXMgYXJlIFRva2VuLk5VTEwuCisgICAgKi8KKworICAgIGJvb2xlYW4gbWF0Y2hlcyggaW50IHR5cGUsIGludCBjaGlsZDEgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzQSh0eXBlKSAmJiBnZXQoMSwgdHJ1ZSkuaXNBKGNoaWxkMSk7CisgICAgfQorCisKKworICAgLyoqCisgICAgKiAgUmV0dXJucyB0cnVlIGlmIHRoZSBub2RlIGFuZCBpdCdzIGZpcnN0IGFuZCBzZWNvbmQgY2hpbGQgbWF0Y2ggdGhlCisgICAgKiAgc3BlY2lmaWVkIHR5cGVzLiAgTWlzc2luZyBub2RlcyBhcmUgVG9rZW4uTlVMTC4KKyAgICAqLworCisgICAgYm9vbGVhbiBtYXRjaGVzKCBpbnQgdHlwZSwgaW50IGNoaWxkMSwgaW50IGNoaWxkMiApCisgICAgeworICAgICAgICByZXR1cm4gbWF0Y2hlcyggdHlwZSwgY2hpbGQxICkgJiYgZ2V0KDIsIHRydWUpLmlzQShjaGlsZDIpOworICAgIH0KKworCisKKyAgIC8qKgorICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGUgbm9kZSBhbmQgaXQncyBmaXJzdCB0aHJlZSBjaGlsZHJlbiBtYXRjaCB0aGUKKyAgICAqICBzcGVjaWZpZWQgdHlwZXMuICBNaXNzaW5nIG5vZGVzIGFyZSBUb2tlbi5OVUxMLgorICAgICovCisKKyAgICBib29sZWFuIG1hdGNoZXMoIGludCB0eXBlLCBpbnQgY2hpbGQxLCBpbnQgY2hpbGQyLCBpbnQgY2hpbGQzICkKKyAgICB7CisgICAgICAgIHJldHVybiBtYXRjaGVzKCB0eXBlLCBjaGlsZDEsIGNoaWxkMiApICYmIGdldCgzLCB0cnVlKS5pc0EoY2hpbGQzKTsKKyAgICB9CisKKworCisgICAvKioKKyAgICAqICBSZXR1cm5zIHRydWUgaWYgdGhlIG5vZGUgYW4gaXQncyBmaXJzdCBmb3VyIGNoaWxkcmVuIG1hdGNoIHRoZQorICAgICogIHNwZWNpZmllZCB0eXBlcy4gIE1pc3Npbmcgbm9kZXMgaGF2ZSB0eXBlIFR5cGVzLk5VTEwuCisgICAgKi8KKworICAgIGJvb2xlYW4gbWF0Y2hlcyggaW50IHR5cGUsIGludCBjaGlsZDEsIGludCBjaGlsZDIsIGludCBjaGlsZDMsIGludCBjaGlsZDQgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1hdGNoZXMoIHR5cGUsIGNoaWxkMSwgY2hpbGQyLCBjaGlsZDMgKSAmJiBnZXQoNCwgdHJ1ZSkuaXNBKGNoaWxkNCk7CisgICAgfQorCisKKworCisKKyAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gTUVNQkVSIEFDQ0VTUworCisKKyAgIC8qKgorICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGUgbm9kZSBpcyBjb21wbGV0ZWx5IGVtcHR5IChubyByb290LCBldmVuKS4KKyAgICAqLworCisgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpCisgICAgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisKKworICAgLyoqCisgICAgKiAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBub2RlIChpbmNsdWRpbmcgcm9vdCkuCisgICAgKi8KKworICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgc2l6ZSgpOworCisKKworICAgLyoqCisgICAgKiAgUmV0dXJucyB0cnVlIGlmIHRoZSBub2RlIGhhcyBhbnkgbm9uLXJvb3QgZWxlbWVudHMuCisgICAgKi8KKworICAgIHB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKCkKKyAgICB7CisgICAgICAgIHJldHVybiBjaGlsZHJlbigpID4gMDsKKyAgICB9CisKKworCisgICAvKioKKyAgICAqICBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygbm9uLXJvb3QgZWxlbWVudHMgaW4gdGhlIG5vZGUuCisgICAgKi8KKworICAgIHB1YmxpYyBpbnQgY2hpbGRyZW4oKQorICAgIHsKKyAgICAgICAgaW50IHNpemUgPSBzaXplKCk7CisgICAgICAgIGlmKCBzaXplID4gMSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzaXplIC0gMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKworCisgICAvKioKKyAgICAqICBSZXR1cm5zIHRoZSBzcGVjaWZpZWQgZWxlbWVudCwgb3IgbnVsbC4KKyAgICAqLworCisgICAgcHVibGljIGFic3RyYWN0IENTVE5vZGUgZ2V0KCBpbnQgaW5kZXggKTsKKworCisKKyAgIC8qKgorICAgICogIFJldHVybnMgdGhlIHNwZWNpZmllZCBlbGVtZW50LCBvciBUb2tlbi5OVUxMIGlmCisgICAgKiAgc2FmZSBpcyBzZXQgYW5kIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBpcyBudWxsIChvciBkb2Vzbid0CisgICAgKiAgZXhpc3QpLgorICAgICovCisKKyAgICBwdWJsaWMgQ1NUTm9kZSBnZXQoIGludCBpbmRleCwgYm9vbGVhbiBzYWZlICkKKyAgICB7CisgICAgICAgIENTVE5vZGUgZWxlbWVudCA9IGdldCggaW5kZXggKTsKKworICAgICAgICBpZiggZWxlbWVudCA9PSBudWxsICYmIHNhZmUgKQorICAgICAgICB7CisgICAgICAgICAgICBlbGVtZW50ID0gVG9rZW4uTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBlbGVtZW50OworICAgIH0KKworCisKKyAgIC8qKgorICAgICogIFJldHVybnMgdGhlIHJvb3Qgb2YgdGhlIG5vZGUuICBCeSBjb252ZW50aW9uLCBhbGwgbm9kZXMgaGF2ZQorICAgICogIGEgVG9rZW4gYXMgdGhlIGZpcnN0IGVsZW1lbnQgKG9yIHJvb3QpLCB3aGljaCBpbmRpY2F0ZXMgdGhlIHR5cGUKKyAgICAqICBvZiB0aGUgbm9kZS4gIE1heSByZXR1cm4gbnVsbCBpZiB0aGUgbm9kZSA8Y29kZT5pc0VtcHR5KCk8L2NvZGU+LgorICAgICovCisKKyAgICBwdWJsaWMgYWJzdHJhY3QgVG9rZW4gZ2V0Um9vdCgpOworCisKKworICAgLyoqCisgICAgKiAgUmV0dXJucyB0aGUgcm9vdCBvZiB0aGUgbm9kZSwgdGhlIFRva2VuIHRoYXQgaW5kaWNhdGVzIGl0J3MKKyAgICAqICB0eXBlLiAgUmV0dXJucyBhIFRva2VuLk5VTEwgaWYgc2FmZSBhbmQgdGhlIGFjdHVhbCByb290IGlzIG51bGwuCisgICAgKi8KKworICAgIHB1YmxpYyBUb2tlbiBnZXRSb290KCBib29sZWFuIHNhZmUgKQorICAgIHsKKyAgICAgICAgVG9rZW4gcm9vdCA9IGdldFJvb3QoKTsKKworICAgICAgICBpZiggcm9vdCA9PSBudWxsICYmIHNhZmUgKQorICAgICAgICB7CisgICAgICAgICAgICByb290ID0gVG9rZW4uTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByb290OworICAgIH0KKworCisKKyAgIC8qKgorICAgICogIFJldHVybnMgdGhlIHRleHQgb2YgdGhlIHJvb3QuICBVc2VzIDxjb2RlPmdldFJvb3QodHJ1ZSk8L2NvZGU+CisgICAgKiAgdG8gZ2V0IHRoZSByb290LCBzbyB5b3Ugd2lsbCBvbmx5IHJlY2VpdmUgbnVsbCBpbiByZXR1cm4gaWYgdGhlCisgICAgKiAgcm9vdCB0b2tlbiByZXR1cm5zIGl0LgorICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJvb3RUZXh0KCkKKyAgICB7CisgICAgICAgIFRva2VuIHJvb3QgPSBnZXRSb290KCB0cnVlICk7CisgICAgICAgIHJldHVybiByb290LmdldFRleHQoKTsKKyAgICB9CisKKworCisgICAvKioKKyAgICAqICBSZXR1cm5zIGEgZGVzY3JpcHRpb24gb2YgdGhlIG5vZGUuCisgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFR5cGVzLmdldERlc2NyaXB0aW9uKCBnZXRNZWFuaW5nKCkgKTsKKyAgICB9CisKKworCisgICAvKioKKyAgICAqICBSZXR1cm5zIHRoZSBzdGFydGluZyBsaW5lIG9mIHRoZSBub2RlLiAgUmV0dXJucyAtMQorICAgICogIGlmIG5vdCBrbm93bi4KKyAgICAqLworCisgICAgcHVibGljIGludCBnZXRTdGFydExpbmUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdldFJvb3QodHJ1ZSkuZ2V0U3RhcnRMaW5lKCk7CisgICAgfQorCisKKworICAgLyoqCisgICAgKiAgUmV0dXJucyB0aGUgc3RhcnRpbmcgY29sdW1uIG9mIHRoZSBub2RlLiAgUmV0dXJucyAtMQorICAgICogIGlmIG5vdCBrbm93bi4KKyAgICAqLworCisgICAgcHVibGljIGludCBnZXRTdGFydENvbHVtbigpCisgICAgeworICAgICAgICByZXR1cm4gZ2V0Um9vdCh0cnVlKS5nZXRTdGFydENvbHVtbigpOworICAgIH0KKworCisKKyAgIC8qKgorICAgICogIE1hcmtzIHRoZSBub2RlIGEgY29tcGxldGUgZXhwcmVzc2lvbi4gIE5vdCBhbGwgbm9kZXMgc3VwcG9ydAorICAgICogIHRoaXMgb3BlcmF0aW9uIQorICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBtYXJrQXNFeHByZXNzaW9uKCkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBHcm9vdnlCdWdFcnJvciggIm1hcmtBc0V4cHJlc3Npb24oKSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIENTVE5vZGUgdHlwZSIgKTsKKyAgICB9CisKKworCisgICAvKioKKyAgICAqICBSZXR1cm5zIHRydWUgaWYgdGhlIG5vZGUgaXMgYSBjb21wbGV0ZSBleHByZXNzaW9uLgorICAgICovCisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FuRXhwcmVzc2lvbigpCisgICAgeworICAgICAgICByZXR1cm4gaXNBKFR5cGVzLlNJTVBMRV9FWFBSRVNTSU9OKTsKKyAgICB9CisKKworCisKKworICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBPUEVSQVRJT05TCisKKworICAgLyoqCisgICAgKiAgQWRkcyBhbiBlbGVtZW50IHRvIHRoZSBub2RlLiAgUmV0dXJucyB0aGUgZWxlbWVudCBmb3IgY29udmVuaWVuY2UuCisgICAgKiAgTm90IGFsbCBub2RlcyBzdXBwb3J0IHRoaXMgb3BlcmF0aW9uIQorICAgICovCisKKyAgICBwdWJsaWMgQ1NUTm9kZSBhZGQoIENTVE5vZGUgZWxlbWVudCApCisgICAgeworICAgICAgICB0aHJvdyBuZXcgR3Jvb3Z5QnVnRXJyb3IoICJhZGQoKSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIENTVE5vZGUgdHlwZSIgKTsKKyAgICB9CisKKworCisgICAvKioKKyAgICAqICBBZGRzIGFsbCBjaGlsZHJlbiBvZiB0aGUgc3BlY2lmaWVkIG5vZGUgdG8gdGhpcyBvbmUuICBOb3QgYWxsCisgICAgKiAgbm9kZXMgc3VwcG9ydCB0aGlzIG9wZXJhdGlvbiEKKyAgICAqLworCisgICAgcHVibGljIHZvaWQgYWRkQ2hpbGRyZW5PZiggQ1NUTm9kZSBvZiApCisgICAgeworICAgICAgICBmb3IoIGludCBpID0gMTsgaSA8IG9mLnNpemUoKTsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgYWRkKCBvZi5nZXQoaSkgKTsKKyAgICAgICAgfQorICAgIH0KKworCisKKyAgIC8qKgorICAgICogIFNldHMgYW4gZWxlbWVudCBub2RlIGluIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguICBSZXR1cm5zIHRoZSBlbGVtZW50CisgICAgKiAgZm9yIGNvbnZlbmllbmNlLiAgTm90IGFsbCBub2RlcyBzdXBwb3J0IHRoaXMgb3BlcmF0aW9uIQorICAgICovCisKKyAgICBwdWJsaWMgQ1NUTm9kZSBzZXQoIGludCBpbmRleCwgQ1NUTm9kZSBlbGVtZW50ICkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBHcm9vdnlCdWdFcnJvciggInNldCgpIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgQ1NUTm9kZSB0eXBlIiApOworICAgIH0KKworCisKKyAgIC8qKgorICAgICogIENyZWF0ZXMgYSA8Y29kZT5SZWR1Y3Rpb248L2NvZGU+IGZyb20gdGhpcyBub2RlLiAgUmV0dXJucyBzZWxmIGlmIHRoZQorICAgICogIG5vZGUgaXMgYWxyZWFkeSBhIDxjb2RlPlJlZHVjdGlvbjwvY29kZT4uCisgICAgKi8KKworICAgIHB1YmxpYyBhYnN0cmFjdCBSZWR1Y3Rpb24gYXNSZWR1Y3Rpb24oKTsKKworCisKKworICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBTVFJJTkcgQ09OVkVSU0lPTgorCisKKyAgIC8qKgorICAgICogIEZvcm1hdHMgdGhlIG5vZGUgYXMgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IGFuZCByZXR1cm5zIGl0LgorICAgICovCisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmcgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIHdyaXRlKCBuZXcgUHJpbnRXcml0ZXIoc3RyaW5nKSApOworCisgICAgICAgIHN0cmluZy5mbHVzaCgpOworICAgICAgICByZXR1cm4gc3RyaW5nLnRvU3RyaW5nKCk7CisgICAgfQorCisKKyAgIC8qKgorICAgICogIEZvcm1hdHMgdGhlIG5vZGUgYW5kIHdyaXRlcyBpdCB0byB0aGUgc3BlY2lmaWVkIDxjb2RlPldyaXRlcjwvY29kZT4uCisgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlKCBQcmludFdyaXRlciB3cml0ZXIgKQorICAgIHsKKyAgICAgICAgd3JpdGUoIHdyaXRlciwgIiIgKTsKKyAgICB9CisKKworICAgLyoqCisgICAgKiAgRm9ybWF0cyB0aGUgbm9kZSBhbmQgd3JpdGVzIGl0IHRvIHRoZSBzcGVjaWZpZWQgPGNvZGU+V3JpdGVyPC9jb2RlPi4KKyAgICAqICBUaGUgaW5kZW50IGlzIHByZXBlbmRlZCB0byBlYWNoIG91dHB1dCBsaW5lLCBhbmQgaXMgaW5jcmVhc2VkIGZvciBlYWNoCisgICAgKiAgcmVjdXJzaW9uLgorICAgICovCisKKyAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZSggUHJpbnRXcml0ZXIgd3JpdGVyLCBTdHJpbmcgaW5kZW50ICkKKyAgICB7CisgICAgICAgIHdyaXRlci5wcmludCggIigiICk7CisKKyAgICAgICAgaWYoICFpc0VtcHR5KCkgKQorICAgICAgICB7CisgICAgICAgICAgICBUb2tlbiAgcm9vdCA9IGdldFJvb3QoIHRydWUgKTsKKyAgICAgICAgICAgIGludCAgICB0eXBlID0gcm9vdC5nZXRUeXBlKCk7CisgICAgICAgICAgICBpbnQgbWVhbmluZyA9IHJvb3QuZ2V0TWVhbmluZygpOworCisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBEaXNwbGF5IG91ciB0eXBlLCB0ZXh0LCBhbmQgKG9wdGlvbmFsKSBtZWFuaW5nCisKKyAgICAgICAgICAgIHdyaXRlci5wcmludCggVHlwZXMuZ2V0RGVzY3JpcHRpb24odHlwZSkgKTsKKworICAgICAgICAgICAgaWYoIG1lYW5pbmcgIT0gdHlwZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KCAiIGFzICIgKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoIFR5cGVzLmdldERlc2NyaXB0aW9uKG1lYW5pbmcpICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCBnZXRTdGFydExpbmUoKSA+IC0xICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoICIgYXQgIiArIGdldFN0YXJ0TGluZSgpICsgIjoiICsgZ2V0U3RhcnRDb2x1bW4oKSApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgdGV4dCA9IHJvb3QuZ2V0VGV4dCgpOworICAgICAgICAgICAgaW50ICBsZW5ndGggPSB0ZXh0Lmxlbmd0aCgpOworICAgICAgICAgICAgaWYoIGxlbmd0aCA+IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCggIjogIiApOworICAgICAgICAgICAgICAgIGlmKCBsZW5ndGggPiA0MCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cmluZyggMCwgMTcgKSArICIuLi4iICsgdGV4dC5zdWJzdHJpbmcoIGxlbmd0aCAtIDE3LCBsZW5ndGggKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoICIgXCIiICk7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KCB0ZXh0ICk7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KCAiXCIgIiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggY2hpbGRyZW4oKSA+IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCggIjogIiApOworICAgICAgICAgICAgfQorCisKKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFJlY3Vyc2UgdG8gZGlzcGxheSB0aGUgY2hpbGRyZW4uCisKKyAgICAgICAgICAgIGludCBjb3VudCA9IHNpemUoKTsKKyAgICAgICAgICAgIGlmKCBjb3VudCA+IDEgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCAiIiApOworCisgICAgICAgICAgICAgICAgU3RyaW5nIGluZGVudDEgPSBpbmRlbnQgKyAiICAiOworICAgICAgICAgICAgICAgIFN0cmluZyBpbmRlbnQyID0gaW5kZW50ICsgIiAgICI7CisgICAgICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDE7IGkgPCBjb3VudDsgaSsrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCggaW5kZW50MSApOworICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoIGkgKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KCAiOiAiICk7CisKKyAgICAgICAgICAgICAgICAgICAgZ2V0KCBpLCB0cnVlICkud3JpdGUoIHdyaXRlciwgaW5kZW50MiApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCggaW5kZW50ICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiggaW5kZW50Lmxlbmd0aCgpID4gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCAiKSIgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCggIikiICk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvTnVtYmVycy5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L051bWJlcnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjBlM2QxCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L051bWJlcnMuamF2YQpAQCAtMCwwICsxLDI5NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXg7CisKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKK2ltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKKworLyoqCisgKiAgSGVscGVyIGNsYXNzIGZvciBwcm9jZXNzaW5nIEdyb292eSBudW1lcmljIGxpdGVyYWxzLgorICoKKyAqICBAYXV0aG9yIEJyaWFuIExhcnNvbgorICogIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNwb2lyaWVyQGRyZWFtaW5nLm9yZyI+Q2hyaXMgUG9pcmllcjwvYT4KKyAqCisgKiAgQHZlcnNpb24gJElkJAorICovCisKK3B1YmxpYyBjbGFzcyBOdW1iZXJzCit7CisKKworCisgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIExFWElORyBTVVBQT1JUCisKKworICAgLyoqCisgICAgKiAgUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGlzIGEgYmFzZS0xMCBkaWdpdC4KKyAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGlnaXQoIGNoYXIgYyApCisgICAgeworICAgICAgICByZXR1cm4gYyA+PSAnMCcgJiYgYyA8PSAnOSc7CisgICAgfQorCisKKyAgIC8qKgorICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWMgY2hhcmFjdGVyIGlzIGEgYmFzZS04IGRpZ2l0LgorICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNPY3RhbERpZ2l0KCBjaGFyIGMgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGMgPj0gJzAnICYmIGMgPD0gJzcnOworICAgIH0KKworCisgICAvKioKKyAgICAqICBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgYSBiYXNlLTE2IGRpZ2l0LgorICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNIZXhEaWdpdCggY2hhciBjICkKKyAgICB7CisgICAgICAgIHJldHVybiBpc0RpZ2l0KGMpIHx8IChjID49ICdBJyAmJiBjIDw9ICdGJykgfHwgKGMgPj0gJ2EnICYmIGMgPD0gJ2YnKTsKKyAgICB9CisKKworCisgICAvKioKKyAgICAqICBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgYSB2YWxpZCB0eXBlIHNwZWNpZmllcgorICAgICogIGZvciBhIG51bWVyaWMgdmFsdWUuCisgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc051bWVyaWNUeXBlU3BlY2lmaWVyKCBjaGFyIGMsIGJvb2xlYW4gaXNEZWNpbWFsICkKKyAgICB7CisgICAgICAgIGlmKCBpc0RlY2ltYWwgKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2goIGMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgJ0cnOgorICAgICAgICAgICAgICAgIGNhc2UgJ2cnOgorICAgICAgICAgICAgICAgIGNhc2UgJ0QnOgorICAgICAgICAgICAgICAgIGNhc2UgJ2QnOgorICAgICAgICAgICAgICAgIGNhc2UgJ0YnOgorICAgICAgICAgICAgICAgIGNhc2UgJ2YnOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCggYyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAnRyc6CisgICAgICAgICAgICAgICAgY2FzZSAnZyc6CisgICAgICAgICAgICAgICAgY2FzZSAnSSc6CisgICAgICAgICAgICAgICAgY2FzZSAnaSc6CisgICAgICAgICAgICAgICAgY2FzZSAnTCc6CisgICAgICAgICAgICAgICAgY2FzZSAnbCc6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworCisKKworCisgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIFBBUlNJTkcgU1VQUE9SVAorCisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIE1BWF9MT05HICAgID0gQmlnSW50ZWdlci52YWx1ZU9mKExvbmcuTUFYX1ZBTFVFKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIE1JTl9MT05HICAgID0gQmlnSW50ZWdlci52YWx1ZU9mKExvbmcuTUlOX1ZBTFVFKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgTUFYX0lOVEVHRVIgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoSW50ZWdlci5NQVhfVkFMVUUpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgTUlOX0lOVEVHRVIgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoSW50ZWdlci5NSU5fVkFMVUUpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBNQVhfRE9VQkxFICA9IG5ldyBCaWdEZWNpbWFsKFN0cmluZy52YWx1ZU9mKERvdWJsZS5NQVhfVkFMVUUpKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIE1JTl9ET1VCTEUgID0gTUFYX0RPVUJMRS5uZWdhdGUoKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJpZ0RlY2ltYWwgTUFYX0ZMT0FUICAgPSBuZXcgQmlnRGVjaW1hbChTdHJpbmcudmFsdWVPZihGbG9hdC5NQVhfVkFMVUUpKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIE1JTl9GTE9BVCAgID0gTUFYX0ZMT0FULm5lZ2F0ZSgpOworCisKKworICAgLyoqCisgICAgKiAgQnVpbGRzIGEgTnVtYmVyIGZyb20gdGhlIGdpdmVuIGludGVnZXIgZGVzY3JpcHRvci4gIENyZWF0ZXMgdGhlIG5hcnJvd2VzdAorICAgICogIHR5cGUgcG9zc2libGUsIG9yIGEgc3BlY2lmaWMgdHlwZSwgaWYgc3BlY2lmaWVkLgorICAgICoKKyAgICAqICBAcGFyYW0gIHRleHQgbGl0ZXJhbCB0ZXh0IHRvIHBhcnNlCisgICAgKiAgQHJldHVybiBpbnN0YW50aWF0ZWQgTnVtYmVyIG9iamVjdAorICAgICogIEB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlmIHRoZSBudW1iZXIgZG9lcyBub3QgZml0IHdpdGhpbiB0aGUgdHlwZQorICAgICogICAgICAgICAgcmVxdWVzdGVkIGJ5IHRoZSB0eXBlIHNwZWNpZmllciBzdWZmaXggKGludmFsaWQgbnVtYmVycyBkb24ndCBtYWtlCisgICAgKiAgICAgICAgICBpdCBoZXJlKQorICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIE51bWJlciBwYXJzZUludGVnZXIoIFN0cmluZyB0ZXh0ICkKKyAgICB7CisgICAgICAgIGNoYXIgYyA9ICcgJzsKKyAgICAgICAgaW50IGxlbmd0aCA9IHRleHQubGVuZ3RoKCk7CisKKworICAgICAgICAvLworICAgICAgICAvLyBTdHJpcCBvZmYgdGhlIHNpZ24sIGlmIHByZXNlbnQKKworICAgICAgICBib29sZWFuIG5lZ2F0aXZlID0gZmFsc2U7CisgICAgICAgIGlmKCAoYyA9IHRleHQuY2hhckF0KDApKSA9PSAnLScgfHwgYyA9PSAnKycgKQorICAgICAgICB7CisgICAgICAgICAgICBuZWdhdGl2ZSA9IChjID09ICctJyk7CisgICAgICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoIDEsIGxlbmd0aCApOworICAgICAgICAgICAgbGVuZ3RoIC09IDE7CisgICAgICAgIH0KKworCisgICAgICAgIC8vCisgICAgICAgIC8vIERldGVybWluZSByYWRpeCAoZGVmYXVsdCBpcyAxMCkuCisKKyAgICAgICAgaW50IHJhZGl4ID0gMTA7CisgICAgICAgIGlmKCB0ZXh0LmNoYXJBdCgwKSA9PSAnMCcgJiYgbGVuZ3RoID4gMSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCAoYyA9IHRleHQuY2hhckF0KDEpKSA9PSAnWCcgfHwgYyA9PSAneCcgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJhZGl4ID0gMTY7CisgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKCAyLCBsZW5ndGgpOworICAgICAgICAgICAgICAgIGxlbmd0aCAtPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJhZGl4ID0gODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gU3RyaXAgb2ZmIGFueSB0eXBlIHNwZWNpZmllciBhbmQgY29udmVydCBpdCB0byBsb3dlcgorICAgICAgICAvLyBjYXNlLCBpZiBwcmVzZW50LgorCisgICAgICAgIGNoYXIgdHlwZSA9ICd4JzsgIC8vIHBpY2sgYmVzdCBmaXQKKyAgICAgICAgaWYoIGlzTnVtZXJpY1R5cGVTcGVjaWZpZXIodGV4dC5jaGFyQXQobGVuZ3RoLTEpLCBmYWxzZSkgKQorICAgICAgICB7CisgICAgICAgICAgICB0eXBlID0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKCB0ZXh0LmNoYXJBdChsZW5ndGgtMSkgKTsKKyAgICAgICAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cmluZyggMCwgbGVuZ3RoLTEpOworCisgICAgICAgICAgICBsZW5ndGggLT0gMTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQWRkIHRoZSBzaWduIGJhY2ssIGlmIG5lY2Vzc2FyeQorCisgICAgICAgIGlmKCBuZWdhdGl2ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRleHQgPSAiLSIgKyB0ZXh0OworICAgICAgICB9CisKKworICAgICAgICAvLworICAgICAgICAvLyBCdWlsZCB0aGUgc3BlY2lmaWVkIHR5cGUgb3IsIGlmIG5vIHR5cGUgd2FzIHNwZWNpZmllZCwgdGhlCisgICAgICAgIC8vIHNtYWxsZXN0IHR5cGUgaW4gd2hpY2ggdGhlIG51bWJlciB3aWxsIGZpdC4KKworICAgICAgICBzd2l0Y2ggKHR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgJ2knOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW50ZWdlciggSW50ZWdlci5wYXJzZUludCh0ZXh0LCByYWRpeCkgKTsKKworICAgICAgICAgICAgY2FzZSAnbCc6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMb25nKCBMb25nLnBhcnNlTG9uZyh0ZXh0LCByYWRpeCkgKTsKKworICAgICAgICAgICAgY2FzZSAnZyc6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCaWdJbnRlZ2VyKCB0ZXh0LCByYWRpeCApOworCisgICAgICAgICAgICBkZWZhdWx0OgorCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBJZiBub3Qgc3BlY2lmaWVkLCB3ZSB3aWxsIHJldHVybiB0aGUgbmFycm93ZXN0IHBvc3NpYmxlCisgICAgICAgICAgICAgICAgLy8gb2YgSW50ZWdlciwgTG9uZywgYW5kIEJpZ0ludGVnZXIuCisKKyAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIHZhbHVlID0gbmV3IEJpZ0ludGVnZXIoIHRleHQsIHJhZGl4ICk7CisKKyAgICAgICAgICAgICAgICBpZiggdmFsdWUuY29tcGFyZVRvKE1BWF9JTlRFR0VSKSA8PSAwICYmIHZhbHVlLmNvbXBhcmVUbyhNSU5fSU5URUdFUikgPj0gMCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEludGVnZXIodmFsdWUuaW50VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYoIHZhbHVlLmNvbXBhcmVUbyhNQVhfTE9ORykgPD0gMCAmJiB2YWx1ZS5jb21wYXJlVG8oTUlOX0xPTkcpID49IDAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMb25nKHZhbHVlLmxvbmdWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKworCisgICAvKioKKyAgICAqICBCdWlsZHMgYSBOdW1iZXIgZnJvbSB0aGUgZ2l2ZW4gZGVjaW1hbCBkZXNjcmlwdG9yLiAgVXNlcyBCaWdEZWNpbWFsLAorICAgICogIHVubGVzcywgRG91YmxlIG9yIEZsb2F0IGlzIHJlcXVlc3RlZC4KKyAgICAqCisgICAgKiAgQHBhcmFtICB0ZXh0IGxpdGVyYWwgdGV4dCB0byBwYXJzZQorICAgICogIEByZXR1cm4gaW5zdGFudGlhdGVkIE51bWJlciBvYmplY3QKKyAgICAqICBAdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiBpZiB0aGUgbnVtYmVyIGRvZXMgbm90IGZpdCB3aXRoaW4gdGhlIHR5cGUKKyAgICAqICAgICAgICAgIHJlcXVlc3RlZCBieSB0aGUgdHlwZSBzcGVjaWZpZXIgc3VmZml4IChpbnZhbGlkIG51bWJlcnMgZG9uJ3QgbWFrZQorICAgICogICAgICAgICAgaXQgaGVyZSkKKyAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBOdW1iZXIgcGFyc2VEZWNpbWFsKCBTdHJpbmcgdGV4dCApCisgICAgeworICAgICAgICBpbnQgbGVuZ3RoID0gdGV4dC5sZW5ndGgoKTsKKworCisgICAgICAgIC8vCisgICAgICAgIC8vIFN0cmlwIG9mZiBhbnkgdHlwZSBzcGVjaWZpZXIgYW5kIGNvbnZlcnQgaXQgdG8gbG93ZXIKKyAgICAgICAgLy8gY2FzZSwgaWYgcHJlc2VudC4KKworICAgICAgICBjaGFyIHR5cGUgPSAneCc7CisgICAgICAgIGlmKCBpc051bWVyaWNUeXBlU3BlY2lmaWVyKHRleHQuY2hhckF0KGxlbmd0aC0xKSwgdHJ1ZSkgKQorICAgICAgICB7CisgICAgICAgICAgICB0eXBlID0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKCB0ZXh0LmNoYXJBdChsZW5ndGgtMSkgKTsKKyAgICAgICAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cmluZyggMCwgbGVuZ3RoLTEgKTsKKworICAgICAgICAgICAgbGVuZ3RoIC09IDE7CisgICAgICAgIH0KKworCisgICAgICAgIC8vCisgICAgICAgIC8vIEJ1aWxkIHRoZSBzcGVjaWZpZWQgdHlwZSBvciBkZWZhdWx0IHRvIEJpZ0RlY2ltYWwKKworICAgICAgICBCaWdEZWNpbWFsIHZhbHVlID0gbmV3IEJpZ0RlY2ltYWwoIHRleHQgKTsKKyAgICAgICAgc3dpdGNoKCB0eXBlICkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSAnZic6CisgICAgICAgICAgICAgICAgaWYoIHZhbHVlLmNvbXBhcmVUbyhNQVhfRkxPQVQpIDw9IDAgJiYgdmFsdWUuY29tcGFyZVRvKE1JTl9GTE9BVCkgPj0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmxvYXQoIHRleHQgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbiggIm91dCBvZiByYW5nZSIgKTsKKworICAgICAgICAgICAgY2FzZSAnZCc6CisgICAgICAgICAgICAgICAgaWYoIHZhbHVlLmNvbXBhcmVUbyhNQVhfRE9VQkxFKSA8PSAwICYmIHZhbHVlLmNvbXBhcmVUbyhNSU5fRE9VQkxFKSA+PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEb3VibGUoIHRleHQgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbiggIm91dCBvZiByYW5nZSIgKTsKKworICAgICAgICAgICAgY2FzZSAnZyc6CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L1BhcnNlckV4Y2VwdGlvbi5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L1BhcnNlckV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1OTEyNzIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvUGFyc2VyRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXg7CisKK3B1YmxpYyBjbGFzcyBQYXJzZXJFeGNlcHRpb24gZXh0ZW5kcyBUb2tlbkV4Y2VwdGlvbiB7CisgICAgcHVibGljIFBhcnNlckV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVG9rZW4gdG9rZW4pIHsKKyAgICAgICAgc3VwZXIobWVzc2FnZSwgdG9rZW4pOworICAgIH0KKworICAgIHB1YmxpYyBQYXJzZXJFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSwgaW50IGxpbmVOdW1iZXIsIGludCBjb2x1bW5OdW1iZXIpIHsKKyAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UsIGxpbmVOdW1iZXIsIGNvbHVtbk51bWJlcik7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvUmVhZEV4Y2VwdGlvbi5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L1JlYWRFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDIyODNkCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L1JlYWRFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheDsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuR3Jvb3Z5RXhjZXB0aW9uOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBFbmNhcHN1bGF0ZXMgbm9uLXNwZWNpZmljIGkvbyBleGNlcHRpb25zLgorICovCisKK3B1YmxpYyBjbGFzcyBSZWFkRXhjZXB0aW9uIGV4dGVuZHMgR3Jvb3Z5RXhjZXB0aW9uIHsKKyAgICBwcml2YXRlIGZpbmFsIElPRXhjZXB0aW9uIGNhdXNlOworCisgICAgcHVibGljIFJlYWRFeGNlcHRpb24oSU9FeGNlcHRpb24gY2F1c2UpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgdGhpcy5jYXVzZSA9IGNhdXNlOworICAgIH0KKworICAgIHB1YmxpYyBSZWFkRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBJT0V4Y2VwdGlvbiBjYXVzZSkgeworICAgICAgICBzdXBlcihtZXNzYWdlKTsKKyAgICAgICAgdGhpcy5jYXVzZSA9IGNhdXNlOworICAgIH0KKworICAgIHB1YmxpYyBJT0V4Y2VwdGlvbiBnZXRJT0NhdXNlKCkgeworICAgICAgICByZXR1cm4gdGhpcy5jYXVzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IHN1cGVyLmdldE1lc3NhZ2UoKTsKKyAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCB8fCBtZXNzYWdlLnRyaW0oKS5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICBtZXNzYWdlID0gY2F1c2UuZ2V0TWVzc2FnZSgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2U7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgeworICAgICAgICByZXR1cm4gdG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvUmVkdWN0aW9uLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvUmVkdWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQxYWVkMAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9SZWR1Y3Rpb24uamF2YQpAQCAtMCwwICsxLDI2NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXg7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5Lkdyb292eUJ1Z0Vycm9yOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CisKKworLyoqIAorICogIEEgc3ludGF4IHJlZHVjdGlvbiwgcHJvZHVjZWQgYnkgdGhlIDxjb2RlPlBhcnNlcjwvY29kZT4uCisgKgorICogIEBzZWUgYW50bHIuUGFyc2VyCisgKiAgQHNlZSBUb2tlbgorICogIEBzZWUgQ1NUTm9kZQorICogIEBzZWUgVHlwZXMKKyAqCisgKiAgQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Ym9iQHdlcmtlbi5jb20iPmJvYiBtY3doaXJ0ZXI8L2E+CisgKiAgQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y3BvaXJpZXJAZHJlYW1pbmcub3JnIj5DaHJpcyBQb2lyaWVyPC9hPgorICoKKyAqICBAdmVyc2lvbiAkSWQkCisgKi8KKworcHVibGljIGNsYXNzIFJlZHVjdGlvbiBleHRlbmRzIENTVE5vZGUKK3sKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFJlZHVjdGlvbiBFTVBUWSA9IG5ldyBSZWR1Y3Rpb24oKTsKKworCisgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIElOSVRJQUxJWkFUSU9OIEFORCBTVUNICisKKyAgICBwcml2YXRlIExpc3QgICAgZWxlbWVudHMgID0gbnVsbDsgICAgLy8gVGhlIHNldCBvZiBjaGlsZCBub2RlcyAgIAorICAgIHByaXZhdGUgYm9vbGVhbiBtYXJrZWQgICAgPSBmYWxzZTsgICAvLyBVc2VkIGZvciBjb21wbGV0aW9uIG1hcmtpbmcgYnkgc29tZSBwYXJ0cyBvZiB0aGUgcGFyc2VyCisKKworICAgLyoqCisgICAgKiAgSW5pdGlhbGl6ZXMgdGhlIDxjb2RlPlJlZHVjdGlvbjwvY29kZT4gd2l0aCB0aGUgc3BlY2lmaWVkIHJvb3QuCisgICAgKi8KKworICAgIHB1YmxpYyBSZWR1Y3Rpb24oIFRva2VuIHJvb3QgKSAKKyAgICB7CisgICAgICAgIGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBzZXQoIDAsIHJvb3QgKTsKKyAgICB9CisKKworICAgLyoqCisgICAgKiAgSW5pdGlhbGl6ZXMgdGhlIDxjb2RlPlJlZHVjdGlvbjwvY29kZT4gdG8gZW1wdHkuCisgICAgKi8KKworICAgIHByaXZhdGUgUmVkdWN0aW9uKCkgCisgICAgeworICAgICAgICBlbGVtZW50cyA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7CisgICAgfQorCisKKyAgIC8qKgorICAgICogIENyZWF0ZXMgYSBuZXcgPGNvZGU+UmVkdWN0aW9uPC9jb2RlPiB3aXRoIDxjb2RlPlRva2VuLk5VTEw8L2NvZGU+CisgICAgKiAgYXMgaXQncyByb290LgorICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIFJlZHVjdGlvbiBuZXdDb250YWluZXIoKSAKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgUmVkdWN0aW9uKCBUb2tlbi5OVUxMICk7CisgICAgfQorCisKKworCisgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIE1FTUJFUiBBQ0NFU1MKKworCisgICAvKioKKyAgICAqICBSZXR1cm5zIHRydWUgaWYgdGhlIG5vZGUgaXMgY29tcGxldGVseSBlbXB0eSAobm8gcm9vdCwgZXZlbikuCisgICAgKi8KKworICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSAKKyAgICB7CisgICAgICAgIHJldHVybiBzaXplKCkgPT0gMDsKKyAgICB9CisKKworCisgICAvKioKKyAgICAqICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIG5vZGUuCisgICAgKi8KKworICAgIHB1YmxpYyBpbnQgc2l6ZSgpIAorICAgIHsKKyAgICAgICAgcmV0dXJuIGVsZW1lbnRzLnNpemUoKTsKKyAgICB9CisKKworCisgICAvKioKKyAgICAqICBSZXR1cm5zIHRoZSBzcGVjaWZpZWQgZWxlbWVudCwgb3IgbnVsbC4KKyAgICAqLworCisgICAgcHVibGljIENTVE5vZGUgZ2V0KCBpbnQgaW5kZXggKSAKKyAgICB7CisgICAgICAgIENTVE5vZGUgZWxlbWVudCA9IG51bGw7CisKKyAgICAgICAgaWYoIGluZGV4IDwgc2l6ZSgpICkgCisgICAgICAgIHsKKyAgICAgICAgICAgIGVsZW1lbnQgPSAoQ1NUTm9kZSllbGVtZW50cy5nZXQoIGluZGV4ICk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZWxlbWVudDsKKyAgICB9CisKKworCisgICAvKioKKyAgICAqICBSZXR1cm5zIHRoZSByb290IG9mIHRoZSBub2RlLCB0aGUgVG9rZW4gdGhhdCBpbmRpY2F0ZXMgaXQncworICAgICogIHR5cGUuICBSZXR1cm5zIG51bGwgaWYgdGhlcmUgaXMgbm8gcm9vdCAodXN1YWxseSBvbmx5IGlmIHRoZQorICAgICogIG5vZGUgaXMgYSBwbGFjZWhvbGRlciBvZiBzb21lIGtpbmQgLS0gc2VlIGlzRW1wdHkoKSkuCisgICAgKi8KKworICAgIHB1YmxpYyBUb2tlbiBnZXRSb290KCkgCisgICAgeworICAgICAgICBpZiggc2l6ZSgpID4gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoVG9rZW4pZWxlbWVudHMuZ2V0KDApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKworCisgICAvKioKKyAgICAqICBNYXJrcyB0aGUgbm9kZSBhIGNvbXBsZXRlIGV4cHJlc3Npb24uCisgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIG1hcmtBc0V4cHJlc3Npb24oKSAKKyAgICB7CisgICAgICAgIG1hcmtlZCA9IHRydWU7CisgICAgfQorCisKKworICAgLyoqCisgICAgKiAgUmV0dXJucyB0cnVlIGlmIHRoZSBub2RlIGlzIGEgY29tcGxldGUgZXhwcmVzc2lvbi4KKyAgICAqLworCisgICAgcHVibGljIGJvb2xlYW4gaXNBbkV4cHJlc3Npb24oKSAKKyAgICB7CisgICAgICAgIGlmKCBpc0EoVHlwZXMuQ09NUExFWF9FWFBSRVNTSU9OKSApIAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtYXJrZWQ7CisgICAgfQorCisKKworCisgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIE9QRVJBVElPTlMKKworCisgICAvKioKKyAgICAqICBBZGRzIGFuIGVsZW1lbnQgdG8gdGhlIG5vZGUuCisgICAgKi8KKworICAgIHB1YmxpYyBDU1ROb2RlIGFkZCggQ1NUTm9kZSBlbGVtZW50ICkgCisgICAgeworICAgICAgICByZXR1cm4gc2V0KCBzaXplKCksIGVsZW1lbnQgKTsKKyAgICB9CisKKworCisgICAvKioKKyAgICAqICBTZXRzIGFuIGVsZW1lbnQgaW4gYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KKyAgICAqLworCisgICAgcHVibGljIENTVE5vZGUgc2V0KCBpbnQgaW5kZXgsIENTVE5vZGUgZWxlbWVudCApIAorICAgIHsKKyAgICAgICAgCisgICAgICAgIGlmKCBlbGVtZW50cyA9PSBudWxsICkgCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBHcm9vdnlCdWdFcnJvciggImF0dGVtcHQgdG8gc2V0KCkgb24gYSBFTVBUWSBSZWR1Y3Rpb24iICk7CisgICAgICAgIH0KKworICAgICAgICBpZiggaW5kZXggPT0gMCAmJiAhKGVsZW1lbnQgaW5zdGFuY2VvZiBUb2tlbikgKSAKKyAgICAgICAgeworCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gSXQncyBub3QgdGhlIGdyZWF0ZXN0IG9mIGRlc2lnbiB0aGF0IHRoZSBpbnRlcmZhY2UgYWxsb3dzIHRoaXMsIGJ1dCBpdAorICAgICAgICAgICAgLy8gaXMgYSB0cmFkZW9mZiB3aXRoIGNvbnZlbmllbmNlLCBhbmQgdGhlIGNvbnZlbmllbmNlIGlzIG1vcmUgaW1wb3J0YW50LgorCisgICAgICAgICAgICB0aHJvdyBuZXcgR3Jvb3Z5QnVnRXJyb3IoICJhdHRlbXB0IHRvIHNldCgpIGEgbm9uLVRva2VuIGFzIHJvb3Qgb2YgYSBSZWR1Y3Rpb24iICk7CisgICAgICAgIH0KKworCisgICAgICAgIC8vCisgICAgICAgIC8vIEZpbGwgc2xvdHMgd2l0aCBudWxscywgaWYgbmVjZXNzYXJ5LgorCisgICAgICAgIGludCBjb3VudCA9IGVsZW1lbnRzLnNpemUoKTsKKyAgICAgICAgaWYoIGluZGV4ID49IGNvdW50ICkgCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggaW50IGkgPSBjb3VudDsgaSA8PSBpbmRleDsgaSsrICkgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZWxlbWVudHMuYWRkKCBudWxsICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBUaGVuIHNldCBpbiB0aGUgZWxlbWVudC4KKworICAgICAgICBlbGVtZW50cy5zZXQoIGluZGV4LCBlbGVtZW50ICk7CisKKyAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CisgICAgfQorCisKKworICAgLyoqCisgICAgKiAgUmVtb3ZlcyBhIG5vZGUgZnJvbSB0aGUgPGNvZGU+UmVkdWN0aW9uPC9jb2RlPi4gIFlvdSBjYW5ub3QgcmVtb3ZlIAorICAgICogIHRoZSByb290IG5vZGUgKGluZGV4IDApLgorICAgICovCisKKyAgICBwdWJsaWMgQ1NUTm9kZSByZW1vdmUoIGludCBpbmRleCApCisgICAgeworICAgICAgICBpZiggaW5kZXggPCAxICkgCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBHcm9vdnlCdWdFcnJvciggImF0dGVtcHQgdG8gcmVtb3ZlKCkgcm9vdCBub2RlIG9mIFJlZHVjdGlvbiIgKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoQ1NUTm9kZSllbGVtZW50cy5yZW1vdmUoIGluZGV4ICk7CisgICAgfQorCisKKworICAgLyoqCisgICAgKiAgQ3JlYXRlcyBhIDxjb2RlPlJlZHVjdGlvbjwvY29kZT4gZnJvbSB0aGlzIG5vZGUuICBSZXR1cm5zIHNlbGYgaWYgdGhlCisgICAgKiAgbm9kZSBpcyBhbHJlYWR5IGEgPGNvZGU+UmVkdWN0aW9uPC9jb2RlPi4KKyAgICAqLworCisgICAgcHVibGljIFJlZHVjdGlvbiBhc1JlZHVjdGlvbigpIAorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9SdW50aW1lUGFyc2VyRXhjZXB0aW9uLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvUnVudGltZVBhcnNlckV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MGQ1NTIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvUnVudGltZVBhcnNlckV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4OworCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LkFTVE5vZGU7CisKKy8qKgorICogQSBoZWxwZXIgY2xhc3MgdG8gYWxsb3cgcGFyc2VyIGV4Y2VwdGlvbnMgdG8gYmUgdGhyb3duIGFueXdoZXJlIGluIHRoZSBjb2RlLgorICogU2hvdWxkIGJlIHJlcGxhY2VkIHdoZW4gbm8gbG9uZ2VyIHJlcXVpcmVkLgorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBSdW50aW1lUGFyc2VyRXhjZXB0aW9uIGV4dGVuZHMgR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbiB7CisKKyAgICBwdWJsaWMgUnVudGltZVBhcnNlckV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgQVNUTm9kZSBub2RlKSB7CisgICAgICAgIHN1cGVyKG1lc3NhZ2UgKyAiLlxuTm9kZTogIiArIG5vZGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCksIG5vZGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRocm93UGFyc2VyRXhjZXB0aW9uKCkgdGhyb3dzIFN5bnRheEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBTeW50YXhFeGNlcHRpb24oZ2V0TWVzc2FnZSgpLCBnZXROb2RlKCkuZ2V0TGluZU51bWJlcigpLCBnZXROb2RlKCkuZ2V0Q29sdW1uTnVtYmVyKCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L1N5bnRheEV4Y2VwdGlvbi5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L1N5bnRheEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZDc1OTgKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvU3ludGF4RXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4OworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5Hcm9vdnlFeGNlcHRpb247CisKKy8qKiBCYXNlIGV4Y2VwdGlvbiBpbmRpY2F0aW5nIGEgc3ludGF4IGVycm9yLgorICoKKyAqICBAYXV0aG9yIDxhIGhyZWY9ImJvYkB3ZXJrZW4uY29tIj5ib2IgbWN3aGlydGVyPC9hPgorICoKKyAqICBAdmVyc2lvbiAkSWQkCisgKi8KK3B1YmxpYyBjbGFzcyBTeW50YXhFeGNlcHRpb24gZXh0ZW5kcyBHcm9vdnlFeGNlcHRpb24geworCisgICAgLyoqIExpbmUgdXBvbiB3aGljaCB0aGUgZXJyb3Igb2NjdXJyZWQuICovCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbGluZTsKKworICAgIC8qKiBDb2x1bW4gdXBvbiB3aGljaCB0aGUgZXJyb3Igb2NjdXJyZWQuICovCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgY29sdW1uOworCisgICAgcHJpdmF0ZSBTdHJpbmcgc291cmNlTG9jYXRvcjsKKworICAgIHB1YmxpYyBTeW50YXhFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIGludCBsaW5lLCBpbnQgY29sdW1uKSB7CisgICAgICAgIHN1cGVyKG1lc3NhZ2UsIGZhbHNlKTsKKyAgICAgICAgdGhpcy5saW5lID0gbGluZTsKKyAgICAgICAgdGhpcy5jb2x1bW4gPSBjb2x1bW47CisgICAgfQorCisgICAgcHVibGljIFN5bnRheEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlLCBpbnQgbGluZSwgaW50IGNvbHVtbikgeworICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7CisgICAgICAgIHRoaXMubGluZSA9IGxpbmU7CisgICAgICAgIHRoaXMuY29sdW1uID0gY29sdW1uOworICAgIH0KKworICAgIC8vIFByb3BlcnRpZXMKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgcHVibGljIHZvaWQgc2V0U291cmNlTG9jYXRvcihTdHJpbmcgc291cmNlTG9jYXRvcikgeworICAgICAgICB0aGlzLnNvdXJjZUxvY2F0b3IgPSBzb3VyY2VMb2NhdG9yOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U291cmNlTG9jYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlTG9jYXRvcjsKKyAgICB9CisKKyAgICAvKiogUmV0cmlldmUgdGhlIGxpbmUgdXBvbiB3aGljaCB0aGUgZXJyb3Igb2NjdXJyZWQuCisgICAgICoKKyAgICAgKiAgQHJldHVybiBUaGUgbGluZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldExpbmUoKSB7CisgICAgICAgIHJldHVybiBsaW5lOworICAgIH0KKworICAgIC8qKiBSZXRyaWV2ZSB0aGUgY29sdW1uIHVwb24gd2hpY2ggdGhlIGVycm9yIG9jY3VycmVkLgorICAgICAqCisgICAgICogIEByZXR1cm4gVGhlIGNvbHVtbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFN0YXJ0Q29sdW1uKCkgeworICAgICAgICByZXR1cm4gY29sdW1uOworICAgIH0KKyAgICAKKyAgICAvKiogCisgICAgICogQHJldHVybiB0aGUgZW5kIG9mIHRoZSBsaW5lIG9uIHdoaWNoIHRoZSBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFN0YXJ0TGluZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldExpbmUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBlbmQgY29sdW1uIG9uIHdoaWNoIHRoZSBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEVuZENvbHVtbigpIHsKKyAgICAgICAgcmV0dXJuIGdldFN0YXJ0Q29sdW1uKCkgKyAxOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmdldE1lc3NhZ2UoKSArICIgQCBsaW5lICIgKyBsaW5lICsgIiwgY29sdW1uICIgKyBjb2x1bW4gKyAiLiI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L1Rva2VuLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvVG9rZW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTAwMzFmCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L1Rva2VuLmphdmEKQEAgLTAsMCArMSwzOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4OworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5Hcm9vdnlCdWdFcnJvcjsKKworCisvKioKKyAqICBBIDxjb2RlPkNTVE5vZGU8L2NvZGU+IHByb2R1Y2VkIGJ5IHRoZSA8Y29kZT5MZXhlcjwvY29kZT4uCisgKgorICogIEBzZWUgYW50bHIuUGFyc2VyCisgKiAgQHNlZSBhbnRsci5Ub2tlbgorICogIEBzZWUgUmVkdWN0aW9uCisgKiAgQHNlZSBUeXBlcworICoKKyAqICBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpib2JAd2Vya2VuLmNvbSI+Ym9iIG1jd2hpcnRlcjwvYT4KKyAqICBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpjcG9pcmllckBkcmVhbWluZy5vcmciPkNocmlzIFBvaXJpZXI8L2E+CisgKgorICogIEB2ZXJzaW9uICRJZCQKKyAqLworCitwdWJsaWMgY2xhc3MgVG9rZW4gZXh0ZW5kcyBDU1ROb2RlCit7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUb2tlbiBOVUxMID0gbmV3IFRva2VuKCk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUb2tlbiBFT0YgID0gbmV3IFRva2VuKCBUeXBlcy5FT0YsICIiLCAtMSwgLTEgKTsKKworCisgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIFRPS0VOIElOSVRJQUxJWkFUSU9OIEFORCBTVUNICisKKyAgICBwcml2YXRlIGludCB0eXBlICAgICAgICA9IFR5cGVzLlVOS05PV047ICAvLyB0aGUgYWN0dWFsIHR5cGUgaWRlbnRpZmllZCBieSB0aGUgbGV4ZXIKKyAgICBwcml2YXRlIGludCBtZWFuaW5nICAgICA9IFR5cGVzLlVOS05PV047ICAvLyBhbiBpbnRlcnByZXRhdGlvbiBhcHBsaWVkIHRvIHRoZSB0b2tlbiBhZnRlciB0aGUgZmFjdAorCisgICAgcHJpdmF0ZSBTdHJpbmcgICAgIHRleHQgPSAiIjsgICAgICAgICAgICAgLy8gdGhlIHRleHQgb2YgdGhlIHRva2VuCisgICAgcHJpdmF0ZSBpbnQgICBzdGFydExpbmUgPSAtMTsgICAgICAgICAgICAgLy8gdGhlIHNvdXJjZSBsaW5lIG9uIHdoaWNoIHRoZSB0b2tlbiBiZWdpbnMKKyAgICBwcml2YXRlIGludCBzdGFydENvbHVtbiA9IC0xOyAgICAgICAgICAgICAvLyB0aGUgc291cmNlIGNvbHVtbiBvbiB3aGljaCB0aGUgdG9rZW4gYmVnaW5zCisKKworICAgLyoqCisgICAgKiAgSW5pdGlhbGl6ZXMgdGhlIFRva2VuIHdpdGggdGhlIHNwZWNpZmllZCBpbmZvcm1hdGlvbi4KKyAgICAqLworCisgICAgcHVibGljIFRva2VuKCBpbnQgdHlwZSwgU3RyaW5nIHRleHQsIGludCBzdGFydExpbmUsIGludCBzdGFydENvbHVtbiApCisgICAgeworICAgICAgICB0aGlzLnR5cGUgICAgICAgID0gdHlwZTsKKyAgICAgICAgdGhpcy5tZWFuaW5nICAgICA9IHR5cGU7CisgICAgICAgIHRoaXMudGV4dCAgICAgICAgPSB0ZXh0OworICAgICAgICB0aGlzLnN0YXJ0TGluZSAgID0gc3RhcnRMaW5lOworICAgICAgICB0aGlzLnN0YXJ0Q29sdW1uID0gc3RhcnRDb2x1bW47CisgICAgfQorCisKKyAgIC8qKgorICAgICogIEluaXRpYWxpemVzIHRoZSBOVUxMIFRva2VuLgorICAgICovCisKKyAgICBwcml2YXRlIFRva2VuKCkgeyB9CisKKworCisgICAvKioKKyAgICAqICBSZXR1cm5zIGEgY29weSBvZiB0aGlzIFRva2VuLgorICAgICovCisKKyAgICBwdWJsaWMgVG9rZW4gZHVwKCkKKyAgICB7CisgICAgICAgIFRva2VuIHRva2VuID0gbmV3IFRva2VuKCB0aGlzLnR5cGUsIHRoaXMudGV4dCwgdGhpcy5zdGFydExpbmUsIHRoaXMuc3RhcnRDb2x1bW4gKTsKKyAgICAgICAgdG9rZW4uc2V0TWVhbmluZyggdGhpcy5tZWFuaW5nICk7CisKKyAgICAgICAgcmV0dXJuIHRva2VuOworICAgIH0KKworCisKKworICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBOT0RFIElERU5USUZJQ0FUSU9OIEFORCBNRUFOSU5HCisKKworICAgLyoqCisgICAgKiAgUmV0dXJucyB0aGUgbWVhbmluZyBvZiB0aGlzIG5vZGUuICBJZiB0aGUgbm9kZSBpc0VtcHR5KCksIHJldHVybnMKKyAgICAqICB0aGUgdHlwZSBvZiBUb2tlbi5OVUxMLgorICAgICovCisKKyAgICBwdWJsaWMgaW50IGdldE1lYW5pbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1lYW5pbmc7CisgICAgfQorCisKKworICAgLyoqCisgICAgKiAgU2V0cyB0aGUgbWVhbmluZyBmb3IgdGhpcyBub2RlIChhbmQgaXQncyByb290IFRva2VuKS4gIE5vdAorICAgICogIHZhbGlkIGlmIHRoZSBub2RlIGlzRW1wdHkoKS4gIFJldHVybnMgdGhpcyB0b2tlbiwgZm9yCisgICAgKiAgY29udmVuaWVuY2UuCisgICAgKi8KKworICAgIHB1YmxpYyBDU1ROb2RlIHNldE1lYW5pbmcoIGludCBtZWFuaW5nICkKKyAgICB7CisgICAgICAgIHRoaXMubWVhbmluZyA9IG1lYW5pbmc7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworCisKKyAgIC8qKgorICAgICogIFJldHVybnMgdGhlIGFjdHVhbCB0eXBlIG9mIHRoZSBub2RlLiAgSWYgdGhlIG5vZGUgaXNFbXB0eSgpLCByZXR1cm5zCisgICAgKiAgdGhlIHR5cGUgb2YgVG9rZW4uTlVMTC4KKyAgICAqLworCisgICAgcHVibGljIGludCBnZXRUeXBlKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0eXBlOworICAgIH0KKworCisKKworICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBNRU1CRVIgQUNDRVNTCisKKworICAgLyoqCisgICAgKiAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBub2RlIChpbmNsdWRpbmcgcm9vdCkuCisgICAgKi8KKworICAgIHB1YmxpYyBpbnQgc2l6ZSgpCisgICAgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKworCisgICAvKioKKyAgICAqICBSZXR1cm5zIHRoZSBzcGVjaWZpZWQgZWxlbWVudCwgb3IgbnVsbC4KKyAgICAqLworCisgICAgcHVibGljIENTVE5vZGUgZ2V0KCBpbnQgaW5kZXggKQorICAgIHsKKyAgICAgICAgaWYoIGluZGV4ID4gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBHcm9vdnlCdWdFcnJvciggImF0dGVtcHQgdG8gYWNjZXNzIFRva2VuIGVsZW1lbnQgb3RoZXIgdGhhbiByb290IiApOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisKKworICAgLyoqCisgICAgKiAgUmV0dXJucyB0aGUgcm9vdCBvZiB0aGUgbm9kZS4gIEJ5IGNvbnZlbnRpb24sIGFsbCBub2RlcyBoYXZlCisgICAgKiAgYSBUb2tlbiBhcyB0aGUgZmlyc3QgZWxlbWVudCAob3Igcm9vdCksIHdoaWNoIGluZGljYXRlcyB0aGUgdHlwZQorICAgICogIG9mIHRoZSBub2RlLiAgTWF5IHJldHVybiBudWxsIGlmIHRoZSBub2RlIDxjb2RlPmlzRW1wdHkoKTwvY29kZT4uCisgICAgKi8KKworICAgIHB1YmxpYyBUb2tlbiBnZXRSb290KCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworCisKKyAgIC8qKgorICAgICogIFJldHVybnMgdGhlIHRleHQgb2YgdGhlIHJvb3Qgbm9kZS4gIFVzZXMgPGNvZGU+Z2V0Um9vdCh0cnVlKTwvY29kZT4KKyAgICAqICB0byBnZXQgdGhlIHJvb3QsIHNvIHlvdSB3aWxsIG9ubHkgcmVjZWl2ZSBudWxsIGluIHJldHVybiBpZiB0aGUKKyAgICAqICByb290IHRva2VuIHJldHVybnMgaXQuCisgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Um9vdFRleHQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRleHQ7CisgICAgfQorCisKKworICAgLyoqCisgICAgKiAgUmV0dXJucyB0aGUgdGV4dCBvZiB0aGUgdG9rZW4uICBFcXVpdmFsZW50IHRvCisgICAgKiAgPGNvZGU+Z2V0Um9vdFRleHQoKTwvY29kZT4gd2hlbiBjYWxsZWQgZGlyZWN0bHkuCisgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpCisgICAgeworICAgICAgICByZXR1cm4gdGV4dDsKKyAgICB9CisKKworCisgICAvKioKKyAgICAqICBOb3QgYWR2aXNhYmxlLCBidXQgaWYgeW91IG5lZWQgdG8gYWRqdXN0IHRoZSB0b2tlbidzIHRleHQsIHRoaXMKKyAgICAqICB3aWxsIGRvIGl0LgorICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBzZXRUZXh0KCBTdHJpbmcgdGV4dCApCisgICAgeworICAgICAgICB0aGlzLnRleHQgPSB0ZXh0OworICAgIH0KKworCisKKyAgIC8qKgorICAgICogIFJldHVybnMgdGhlIHN0YXJ0aW5nIGxpbmUgb2YgdGhlIG5vZGUuICBSZXR1cm5zIC0xCisgICAgKiAgaWYgbm90IGtub3duLgorICAgICovCisKKyAgICBwdWJsaWMgaW50IGdldFN0YXJ0TGluZSgpCisgICAgeworICAgICAgICByZXR1cm4gc3RhcnRMaW5lOworICAgIH0KKworCisKKyAgIC8qKgorICAgICogIFJldHVybnMgdGhlIHN0YXJ0aW5nIGNvbHVtbiBvZiB0aGUgbm9kZS4gIFJldHVybnMgLTEKKyAgICAqICBpZiBub3Qga25vd24uCisgICAgKi8KKworICAgIHB1YmxpYyBpbnQgZ2V0U3RhcnRDb2x1bW4oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0YXJ0Q29sdW1uOworICAgIH0KKworCisKKworICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBPUEVSQVRJT05TCisKKworICAgLyoqCisgICAgKiAgQ3JlYXRlcyBhIDxjb2RlPlJlZHVjdGlvbjwvY29kZT4gZnJvbSB0aGlzIHRva2VuLiAgUmV0dXJucyBzZWxmIGlmIHRoZQorICAgICogIG5vZGUgaXMgYWxyZWFkeSBhIDxjb2RlPlJlZHVjdGlvbjwvY29kZT4uCisgICAgKi8KKworICAgIHB1YmxpYyBSZWR1Y3Rpb24gYXNSZWR1Y3Rpb24oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZWR1Y3Rpb24oIHRoaXMgKTsKKyAgICB9CisKKworCisgICAvKioKKyAgICAqICBDcmVhdGVzIGEgPGNvZGU+UmVkdWN0aW9uPC9jb2RlPiBmcm9tIHRoaXMgdG9rZW4sIGFkZGluZyB0aGUgc3VwcGxpZWQKKyAgICAqICBub2RlIGFzIHRoZSBzZWNvbmQgZWxlbWVudC4KKyAgICAqLworCisgICAgcHVibGljIFJlZHVjdGlvbiBhc1JlZHVjdGlvbiggQ1NUTm9kZSBzZWNvbmQgKQorICAgIHsKKyAgICAgICAgUmVkdWN0aW9uIGNyZWF0ZWQgPSBhc1JlZHVjdGlvbigpOworICAgICAgICBjcmVhdGVkLmFkZCggc2Vjb25kICk7CisgICAgICAgIHJldHVybiBjcmVhdGVkOworICAgIH0KKworCisKKyAgIC8qKgorICAgICogIENyZWF0ZXMgYSA8Y29kZT5SZWR1Y3Rpb248L2NvZGU+IGZyb20gdGhpcyB0b2tlbiwgYWRkaW5nIHRoZSBzdXBwbGllZAorICAgICogIG5vZGVzIGFzIHRoZSBzZWNvbmQgYW5kIHRoaXJkIGVsZW1lbnQsIHJlc3BlY3RpdmVseS4KKyAgICAqLworCisgICAgcHVibGljIFJlZHVjdGlvbiBhc1JlZHVjdGlvbiggQ1NUTm9kZSBzZWNvbmQsIENTVE5vZGUgdGhpcmQgKQorICAgIHsKKyAgICAgICAgUmVkdWN0aW9uIGNyZWF0ZWQgPSBhc1JlZHVjdGlvbiggc2Vjb25kICk7CisgICAgICAgIGNyZWF0ZWQuYWRkKCB0aGlyZCApOworICAgICAgICByZXR1cm4gY3JlYXRlZDsKKyAgICB9CisKKworCisgICAvKioKKyAgICAqICBDcmVhdGVzIGEgPGNvZGU+UmVkdWN0aW9uPC9jb2RlPiBmcm9tIHRoaXMgdG9rZW4sIGFkZGluZyB0aGUgc3VwcGxpZWQKKyAgICAqICBub2RlcyBhcyB0aGUgc2Vjb25kLCB0aGlyZCwgYW5kIGZvdXJ0aCBlbGVtZW50LCByZXNwZWN0aXZlbHkuCisgICAgKi8KKworICAgIHB1YmxpYyBSZWR1Y3Rpb24gYXNSZWR1Y3Rpb24oIENTVE5vZGUgc2Vjb25kLCBDU1ROb2RlIHRoaXJkLCBDU1ROb2RlIGZvdXJ0aCApCisgICAgeworICAgICAgICBSZWR1Y3Rpb24gY3JlYXRlZCA9IGFzUmVkdWN0aW9uKCBzZWNvbmQsIHRoaXJkICk7CisgICAgICAgIGNyZWF0ZWQuYWRkKCBmb3VydGggKTsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZWQ7CisgICAgfQorCisKKworCisgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIFRPS0VOIEZBQ1RPUklFUworCisKKyAgIC8qKgorICAgICogIENyZWF0ZXMgYSB0b2tlbiB0aGF0IHJlcHJlc2VudHMgYSBrZXl3b3JkLiAgUmV0dXJucyBudWxsIGlmIHRoZQorICAgICogIHNwZWNpZmllZCB0ZXh0IGlzbid0IGEga2V5d29yZC4KKyAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBUb2tlbiBuZXdLZXl3b3JkKCBTdHJpbmcgdGV4dCwgaW50IHN0YXJ0TGluZSwgaW50IHN0YXJ0Q29sdW1uICkKKyAgICB7CisKKyAgICAgICAgaW50IHR5cGUgPSBUeXBlcy5sb29rdXBLZXl3b3JkKCB0ZXh0ICk7CisgICAgICAgIGlmKCB0eXBlICE9IFR5cGVzLlVOS05PV04gKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFRva2VuKCB0eXBlLCB0ZXh0LCBzdGFydExpbmUsIHN0YXJ0Q29sdW1uICk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsKKworICAgIH0KKworCisgICAvKioKKyAgICAqICBDcmVhdGVzIGEgdG9rZW4gdGhhdCByZXByZXNlbnRzIGEgZG91YmxlLXF1b3RlZCBzdHJpbmcuCisgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgVG9rZW4gbmV3U3RyaW5nKCBTdHJpbmcgdGV4dCwgaW50IHN0YXJ0TGluZSwgaW50IHN0YXJ0Q29sdW1uICkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgVG9rZW4oIFR5cGVzLlNUUklORywgdGV4dCwgc3RhcnRMaW5lLCBzdGFydENvbHVtbiApOworICAgIH0KKworCisgICAvKioKKyAgICAqICBDcmVhdGVzIGEgdG9rZW4gdGhhdCByZXByZXNlbnRzIGFuIGlkZW50aWZpZXIuCisgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgVG9rZW4gbmV3SWRlbnRpZmllciggU3RyaW5nIHRleHQsIGludCBzdGFydExpbmUsIGludCBzdGFydENvbHVtbiApCisgICAgeworICAgICAgICByZXR1cm4gbmV3IFRva2VuKCBUeXBlcy5JREVOVElGSUVSLCB0ZXh0LCBzdGFydExpbmUsIHN0YXJ0Q29sdW1uICk7CisgICAgfQorCisKKyAgIC8qKgorICAgICogIENyZWF0ZXMgYSB0b2tlbiB0aGF0IHJlcHJlc2VudHMgYW4gaW50ZWdlci4KKyAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBUb2tlbiBuZXdJbnRlZ2VyKCBTdHJpbmcgdGV4dCwgaW50IHN0YXJ0TGluZSwgaW50IHN0YXJ0Q29sdW1uICkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgVG9rZW4oIFR5cGVzLklOVEVHRVJfTlVNQkVSLCB0ZXh0LCBzdGFydExpbmUsIHN0YXJ0Q29sdW1uICk7CisgICAgfQorCisKKyAgIC8qKgorICAgICogIENyZWF0ZXMgYSB0b2tlbiB0aGF0IHJlcHJlc2VudHMgYSBkZWNpbWFsIG51bWJlci4KKyAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBUb2tlbiBuZXdEZWNpbWFsKCBTdHJpbmcgdGV4dCwgaW50IHN0YXJ0TGluZSwgaW50IHN0YXJ0Q29sdW1uICkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgVG9rZW4oIFR5cGVzLkRFQ0lNQUxfTlVNQkVSLCB0ZXh0LCBzdGFydExpbmUsIHN0YXJ0Q29sdW1uICk7CisgICAgfQorCisKKyAgIC8qKgorICAgICogIENyZWF0ZXMgYSB0b2tlbiB0aGF0IHJlcHJlc2VudHMgYSBzeW1ib2wsIHVzaW5nIGEgbGlicmFyeSBmb3IgdGhlIHRleHQuCisgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgVG9rZW4gbmV3U3ltYm9sKCBpbnQgdHlwZSwgaW50IHN0YXJ0TGluZSwgaW50IHN0YXJ0Q29sdW1uICkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgVG9rZW4oIHR5cGUsIFR5cGVzLmdldFRleHQodHlwZSksIHN0YXJ0TGluZSwgc3RhcnRDb2x1bW4gKTsKKyAgICB9CisKKworICAgLyoqCisgICAgKiAgQ3JlYXRlcyBhIHRva2VuIHRoYXQgcmVwcmVzZW50cyBhIHN5bWJvbCwgdXNpbmcgYSBsaWJyYXJ5IGZvciB0aGUgdHlwZS4KKyAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBUb2tlbiBuZXdTeW1ib2woIFN0cmluZyB0eXBlLCBpbnQgc3RhcnRMaW5lLCBpbnQgc3RhcnRDb2x1bW4gKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUb2tlbiggVHlwZXMubG9va3VwU3ltYm9sKHR5cGUpLCB0eXBlLCBzdGFydExpbmUsIHN0YXJ0Q29sdW1uICk7CisgICAgfQorCisKKyAgIC8qKgorICAgICogIENyZWF0ZXMgYSB0b2tlbiB3aXRoIHRoZSBzcGVjaWZpZWQgbWVhbmluZy4KKyAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBUb2tlbiBuZXdQbGFjZWhvbGRlciggaW50IHR5cGUgKQorICAgIHsKKyAgICAgICAgVG9rZW4gdG9rZW4gPSBuZXcgVG9rZW4oIFR5cGVzLlVOS05PV04sICIiLCAtMSwgLTEgKTsKKyAgICAgICAgdG9rZW4uc2V0TWVhbmluZyggdHlwZSApOworCisgICAgICAgIHJldHVybiB0b2tlbjsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9Ub2tlbkV4Y2VwdGlvbi5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L1Rva2VuRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBkYTBhOQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9Ub2tlbkV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4OworCisKK3B1YmxpYyBjbGFzcyBUb2tlbkV4Y2VwdGlvbiBleHRlbmRzIFN5bnRheEV4Y2VwdGlvbiB7CisgICAgcHVibGljIFRva2VuRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUb2tlbiB0b2tlbikgeworICAgICAgICBzdXBlcigKKyAgICAgICAgICAgICh0b2tlbiA9PSBudWxsKQorICAgICAgICAgICAgICAgID8gbWVzc2FnZSArICIuIE5vIHRva2VuIgorICAgICAgICAgICAgICAgIDogbWVzc2FnZSwKKyAgICAgICAgICAgIGdldExpbmUodG9rZW4pLAorICAgICAgICAgICAgZ2V0Q29sdW1uKHRva2VuKSk7CisgICAgfQorCisgICAgcHVibGljIFRva2VuRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UsIGludCBsaW5lLCBpbnQgY29sdW1uKSB7CisgICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlLCBsaW5lLCBjb2x1bW4pOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0RW5kQ29sdW1uKCkgeworICAgICAgICBpbnQgbGVuZ3RoID0gMTsKKyAgICAgICAgcmV0dXJuIGdldFN0YXJ0Q29sdW1uKCkgKyBsZW5ndGg7CisgICAgfQorCisKKyAgICAvLyBJbXBsZW1lbnRhdGlvbiBtZXRob2RzCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHByaXZhdGUgc3RhdGljIGludCBnZXRDb2x1bW4oVG9rZW4gdG9rZW4pIHsKKyAgICAgICAgcmV0dXJuICh0b2tlbiAhPSBudWxsKSA/IHRva2VuLmdldFN0YXJ0Q29sdW1uKCkgOiAtMTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0TGluZShUb2tlbiB0b2tlbikgeworICAgICAgICByZXR1cm4gKHRva2VuICE9IG51bGwpID8gdG9rZW4uZ2V0U3RhcnRMaW5lKCkgOiAtMTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9Ub2tlbk1pc21hdGNoRXhjZXB0aW9uLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvVG9rZW5NaXNtYXRjaEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZTA1YTQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvVG9rZW5NaXNtYXRjaEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4OworCitwdWJsaWMgY2xhc3MgVG9rZW5NaXNtYXRjaEV4Y2VwdGlvbiBleHRlbmRzIFRva2VuRXhjZXB0aW9uIHsKKyAgICBwcml2YXRlIGZpbmFsIFRva2VuIHVuZXhwZWN0ZWRUb2tlbjsKKyAgICBwcml2YXRlIGZpbmFsIGludCBleHBlY3RlZFR5cGU7CisKKyAgICBwdWJsaWMgVG9rZW5NaXNtYXRjaEV4Y2VwdGlvbihUb2tlbiB0b2tlbiwgaW50IGV4cGVjdGVkVHlwZSkgeworICAgICAgICBzdXBlcigiRXhwZWN0ZWQgdG9rZW46ICIgKyBleHBlY3RlZFR5cGUgKyAiIGJ1dCBmb3VuZDogIiArIHRva2VuLCB0b2tlbik7CisgICAgICAgIHRoaXMudW5leHBlY3RlZFRva2VuID0gdG9rZW47CisgICAgICAgIHRoaXMuZXhwZWN0ZWRUeXBlID0gZXhwZWN0ZWRUeXBlOworICAgIH0KKworICAgIHB1YmxpYyBUb2tlbiBnZXRVbmV4cGVjdGVkVG9rZW4oKSB7CisgICAgICAgIHJldHVybiB0aGlzLnVuZXhwZWN0ZWRUb2tlbjsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEV4cGVjdGVkVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZXhwZWN0ZWRUeXBlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9UeXBlcy5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L1R5cGVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFkMTkxMwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9UeXBlcy5qYXZhCkBAIC0wLDAgKzEsMTQ0MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXg7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuR3Jvb3Z5QnVnRXJyb3I7CisKKworLyoqCisgKiAgVHlwaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgQ1NUIHN5c3RlbS4gIFRoZSB0eXBlcyBoZXJlIGFyZSB0aG9zZQorICogIHVzZWQgYnkgQ1NUTm9kZSwgVG9rZW4sIGFuZCBSZWR1Y3Rpb24uCisgKgorICogIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmJvYkB3ZXJrZW4uY29tIj5ib2IgbWN3aGlydGVyPC9hPgorICogIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNwb2lyaWVyQGRyZWFtaW5nLm9yZyI+Q2hyaXMgUG9pcmllcjwvYT4KKyAqCisgKiAgQHZlcnNpb24gJElkJAorICovCisKK3B1YmxpYyBjbGFzcyBUeXBlcworeworCisKKyAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gVFlQRVM6IE5PVEUgVEhBVCBPUkRFUklORyBBTkQgVkFMVUVTIEFSRSBJTVBPUlRBTlQgVE8gTE9DQUwgUk9VVElORVMhCisKKworICAgIC8vCisgICAgLy8gU1BFQ0lBTCBUT0tFTlMKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVPRiAgICAgICAgICAgICAgICAgICAgICAgICA9IC0xOyAgICAvLyBlbmQgb2YgZmlsZQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOS05PV04gICAgICAgICAgICAgICAgICAgICA9IDA7ICAgICAvLyB0aGUgdW5rbm93biB0b2tlbgorCisKKyAgICAvLworICAgIC8vIFJFTEVWQU5UIFdISVRFU1BBQ0UKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5FV0xJTkUgICAgICAgICAgICAgICAgICAgICA9IDU7ICAgICAvLyBcbgorCisKKyAgICAvLworICAgIC8vIE9QRVJBVE9SUyBBTkQgT1RIRVIgTUFSS0VSUworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVGVF9DVVJMWV9CUkFDRSAgICAgICAgICAgID0gMTA7ICAgIC8vIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUdIVF9DVVJMWV9CUkFDRSAgICAgICAgICAgPSAyMDsgICAgLy8gfQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFRlRfU1FVQVJFX0JSQUNLRVQgICAgICAgICA9IDMwOyAgICAvLyBbCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklHSFRfU1FVQVJFX0JSQUNLRVQgICAgICAgID0gNDA7ICAgIC8vIF0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRUZUX1BBUkVOVEhFU0lTICAgICAgICAgICAgPSA1MDsgICAgLy8gKAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJR0hUX1BBUkVOVEhFU0lTICAgICAgICAgICA9IDYwOyAgICAvLyApCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBET1QgICAgICAgICAgICAgICAgICAgICAgICAgPSA3MDsgICAgLy8gLgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERPVF9ET1QgICAgICAgICAgICAgICAgICAgICA9IDc1OyAgICAvLyAuLgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERPVF9ET1RfRE9UICAgICAgICAgICAgICAgICA9IDc3OyAgICAvLyAuLi4KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5BVklHQVRFICAgICAgICAgICAgICAgICAgICA9IDgwOyAgICAvLyAtPgorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklORF9SRUdFWCAgICAgICAgICAgICAgICAgID0gOTA7ICAgIC8vID1+CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFUQ0hfUkVHRVggICAgICAgICAgICAgICAgID0gOTQ7ICAgIC8vID09fgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFR0VYX1BBVFRFUk4gICAgICAgICAgICAgICA9IDk3OyAgICAvLyB+CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUVVBTCAgICAgICAgICAgICAgICAgICAgICAgPSAxMDA7ICAgLy8gPQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVRVUFMUyAgICAgICAgICAgICAgICAgICAgICA9IEVRVUFMOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFTU0lHTiAgICAgICAgICAgICAgICAgICAgICA9IEVRVUFMOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NUEFSRV9OT1RfRVFVQUwgICAgICAgICAgID0gMTIwOyAgIC8vICE9CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NUEFSRV9JREVOVElDQUwgICAgICAgICAgID0gMTIxOyAgIC8vID09PQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTVBBUkVfTk9UX0lERU5USUNBTCAgICAgICA9IDEyMjsgICAvLyAhPT0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01QQVJFX0VRVUFMICAgICAgICAgICAgICAgPSAxMjM7ICAgLy8gPT0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01QQVJFX0xFU1NfVEhBTiAgICAgICAgICAgPSAxMjQ7ICAgLy8gPAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTVBBUkVfTEVTU19USEFOX0VRVUFMICAgICA9IDEyNTsgICAvLyA8PQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTVBBUkVfR1JFQVRFUl9USEFOICAgICAgICA9IDEyNjsgICAvLyA+CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NUEFSRV9HUkVBVEVSX1RIQU5fRVFVQUwgID0gMTI3OyAgIC8vID49CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NUEFSRV9UTyAgICAgICAgICAgICAgICAgID0gMTI4OyAgIC8vIDw9PgorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9UICAgICAgICAgICAgICAgICAgICAgICAgID0gMTYwOyAgIC8vICEKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0dJQ0FMX09SICAgICAgICAgICAgICAgICAgPSAxNjI7ICAgLy8gfHwKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0dJQ0FMX0FORCAgICAgICAgICAgICAgICAgPSAxNjQ7ICAgLy8gJiYKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPR0lDQUxfT1JfRVFVQUwgICAgICAgICAgICA9IDE2NjsgICAvLyB8fD0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0dJQ0FMX0FORF9FUVVBTCAgICAgICAgICAgPSAxNjg7ICAgLy8gJiY9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTFVTICAgICAgICAgICAgICAgICAgICAgICAgPSAyMDA7ICAgLy8gKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JTlVTICAgICAgICAgICAgICAgICAgICAgICA9IDIwMTsgICAvLyAtCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVVMVElQTFkgICAgICAgICAgICAgICAgICAgID0gMjAyOyAgIC8vICoKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVZJREUgICAgICAgICAgICAgICAgICAgICAgPSAyMDM7ICAgLy8gLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVERJViAgICAgICAgICAgICAgICAgICAgICA9IDIwNDsgICAvLyBcCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9EICAgICAgICAgICAgICAgICAgICAgICAgID0gMjA1OyAgIC8vICUKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFSX1NUQVIgICAgICAgICAgICAgICAgICAgPSAyMDY7ICAgLy8gKioKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT1dFUiAgICAgICAgICAgICAgICAgICAgICAgPSBTVEFSX1NUQVI7ICAgLy8gKioKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMVVNfRVFVQUwgICAgICAgICAgICAgICAgICA9IDIxMDsgICAvLyArPQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JTlVTX0VRVUFMICAgICAgICAgICAgICAgICA9IDIxMTsgICAvLyAtPQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1VTFRJUExZX0VRVUFMICAgICAgICAgICAgICA9IDIxMjsgICAvLyAqPQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJVklERV9FUVVBTCAgICAgICAgICAgICAgICA9IDIxMzsgICAvLyAvPQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVERJVl9FUVVBTCAgICAgICAgICAgICAgICA9IDIxNDsgICAvLyBcPQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PRF9FUVVBTCAgICAgICAgICAgICAgICAgICA9IDIxNTsgICAvLyAlPQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPV0VSX0VRVUFMICAgICAgICAgICAgICAgICA9IDIxNjsgICAvLyAqKj0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMVVNfUExVUyAgICAgICAgICAgICAgICAgICA9IDI1MDsgICAvLyArKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRUZJWF9QTFVTX1BMVVMgICAgICAgICAgICA9IDI1MTsgICAvLyArKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPU1RGSVhfUExVU19QTFVTICAgICAgICAgICA9IDI1MjsgICAvLyArKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRUZJWF9QTFVTICAgICAgICAgICAgICAgICA9IDI1MzsgICAvLyArCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSU5VU19NSU5VUyAgICAgICAgICAgICAgICAgPSAyNjA7ICAgLy8gLS0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUkVGSVhfTUlOVVNfTUlOVVMgICAgICAgICAgPSAyNjE7ICAgLy8gLS0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT1NURklYX01JTlVTX01JTlVTICAgICAgICAgPSAyNjI7ICAgLy8gLS0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUkVGSVhfTUlOVVMgICAgICAgICAgICAgICAgPSAyNjM7ICAgLy8gLSAobmVnYXRpb24pCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRUZUX1NISUZUICAgICAgICAgICAgICAgICAgPSAyODA7ICAgLy8gPDwKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUdIVF9TSElGVCAgICAgICAgICAgICAgICAgPSAyODE7ICAgLy8gPj4KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUdIVF9TSElGVF9VTlNJR05FRCAgICAgICAgPSAyODI7ICAgLy8gPj4+CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRUZUX1NISUZUX0VRVUFMICAgICAgICAgICAgPSAyODU7ICAgLy8gPDw9CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklHSFRfU0hJRlRfRVFVQUwgICAgICAgICAgID0gMjg2OyAgIC8vID4+PQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJR0hUX1NISUZUX1VOU0lHTkVEX0VRVUFMICA9IDI4NzsgICAvLyA+Pj49CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFSICAgICAgICAgICAgICAgICAgICAgICAgPSBNVUxUSVBMWTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTU1BICAgICAgICAgICAgICAgICAgICAgICA9IDMwMDsgICAvLyAtCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09MT04gICAgICAgICAgICAgICAgICAgICAgID0gMzEwOyAgIC8vIDoKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRU1JQ09MT04gICAgICAgICAgICAgICAgICAgPSAzMjA7ICAgLy8gOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFFVRVNUSU9OICAgICAgICAgICAgICAgICAgICA9IDMzMDsgICAvLyA/CisKKyAgICAvLyBUT0RPIHJlZmFjdG9yIFBJUEUgdG8gYmUgQklUV0lTRV9PUgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBJUEUgICAgICAgICAgICAgICAgICAgICAgICA9IDM0MDsgICAvLyB8CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRE9VQkxFX1BJUEUgICAgICAgICAgICAgICAgID0gTE9HSUNBTF9PUjsgICAvLyB8fAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJJVFdJU0VfT1IgICAgICAgICAgICAgICAgICA9IFBJUEU7ICAvLyB8CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklUV0lTRV9BTkQgICAgICAgICAgICAgICAgID0gMzQxOyAgIC8vICYKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCSVRXSVNFX1hPUiAgICAgICAgICAgICAgICAgPSAzNDI7ICAgLy8gXgorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklUV0lTRV9PUl9FUVVBTCAgICAgICAgICAgID0gMzUwOyAgIC8vIHw9CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklUV0lTRV9BTkRfRVFVQUwgICAgICAgICAgID0gMzUxOyAgIC8vICY9CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklUV0lTRV9YT1JfRVFVQUwgICAgICAgICAgID0gMzUyOyAgIC8vIF49CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklUV0lTRV9ORUdBVElPTiAgICAgICAgICAgID0gUkVHRVhfUEFUVEVSTjsgICAgLy8gfgorCisKKyAgICAvLworICAgIC8vIExJVEVSQUxTCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVFJJTkcgICAgICAgICAgICAgICAgICAgICAgPSA0MDA7ICAgLy8gYW55IGJhcmUgc3RyaW5nIGRhdGEKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElERU5USUZJRVIgICAgICAgICAgICAgICAgICA9IDQ0MDsgICAvLyBhbnl0aGluZyB0ZXh0IGFuZCBub3QgYSBrZXl3b3JkCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFR0VSX05VTUJFUiAgICAgICAgICAgICAgPSA0NTA7ICAgLy8gaW50ZWdlcgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFQ0lNQUxfTlVNQkVSICAgICAgICAgICAgICA9IDQ1MTsgICAvLyBkZWNpbWFsCisKKworICAgIC8vCisgICAgLy8gS0VZV09SRFM6IChQUklNQVJJTFkpIENMQVNTL01FVEhPRCBERUNMQVJBVElPTiBNT0RJRklFUlMKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWVdPUkRfUFJJVkFURSAgICAgICAgICAgICA9IDUwMDsgICAvLyBkZWNsYXJhdGlvbiB2aXNpYmlsaXR5CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZV09SRF9QUk9URUNURUQgICAgICAgICAgID0gNTAxOyAgIC8vIGRlY2xhcmF0aW9uIHZpc2liaWxpdHkKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlXT1JEX1BVQkxJQyAgICAgICAgICAgICAgPSA1MDI7ICAgLy8gZGVjbGFyYXRpb24gdmlzaWJpbGl0eQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZV09SRF9BQlNUUkFDVCAgICAgICAgICAgID0gNTEwOyAgIC8vIG1ldGhvZCBib2R5IG1pc3NpbmcKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlXT1JEX0ZJTkFMICAgICAgICAgICAgICAgPSA1MTE7ICAgLy8gZGVjbGFyYXRpb24gY2Fubm90IGJlIG92ZXJyaWRkZW4KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlXT1JEX05BVElWRSAgICAgICAgICAgICAgPSA1MTI7ICAgLy8gYSBuYXRpdmUgY29kZSBlbnRyeSBwb2ludAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWVdPUkRfVFJBTlNJRU5UICAgICAgICAgICA9IDUxMzsgICAvLyBwcm9wZXJ0eSBzaG91bGQgbm90IGJlIHBlcnNpc3RlZAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWVdPUkRfVk9MQVRJTEUgICAgICAgICAgICA9IDUxNDsgICAvLyBjb21waWxlciBzaG91bGQgbmV2ZXIgY2FjaGUgcHJvcGVydHkKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWVdPUkRfU1lOQ0hST05JWkVEICAgICAgICA9IDUyMDsgICAvLyBtb2RpZmllciBhbmQgYmxvY2sgdHlwZQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWVdPUkRfU1RBVElDICAgICAgICAgICAgICA9IDUyMTsgICAvLyBtb2RpZmllciBhbmQgYmxvY2sgdHlwZQorCisKKyAgICAvLworICAgIC8vIEtFWVdPUkRTOiBUWVBFIFNZU1RFTQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZV09SRF9ERUYgICAgICAgICAgICAgICAgID0gNTMwOyAgIC8vIGlkZW50aWZpZXMgYSBmdW5jdGlvbiBkZWNsYXJhdGlvbgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWVdPUkRfREVGTUFDUk8gICAgICAgICAgICA9IDUzOTsgICAvLyBYWFggYnIgaWRlbnRpZmllcyBhIG1hY3JvIGRlY2xhcmF0aW9uCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZV09SRF9DTEFTUyAgICAgICAgICAgICAgID0gNTMxOyAgIC8vIGlkZW50aWZpZXMgYSBjbGFzcyBkZWNsYXJhdGlvbgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWVdPUkRfSU5URVJGQUNFICAgICAgICAgICA9IDUzMjsgICAvLyBpZGVudGlmaWVzIGFuIGludGVyZmFjZSBkZWNsYXJhdGlvbgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWVdPUkRfTUlYSU4gICAgICAgICAgICAgICA9IDUzMzsgICAvLyBpZGVudGlmaWVzIGEgbWl4aW4gZGVjbGFyYXRpb24KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWVdPUkRfSU1QTEVNRU5UUyAgICAgICAgICA9IDU0MDsgICAvLyBzcGVjaWZpZXMgdGhlIGludGVyZmFjZXMgaW1wbGVtZW50ZWQgYnkgYSBjbGFzcworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWVdPUkRfRVhURU5EUyAgICAgICAgICAgICA9IDU0MTsgICAvLyBzcGVjaWZpZXMgdGhlIGJhc2UgY2xhc3MvaW50ZXJmYWNlIGZvciBhIG5ldyBvbmUKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlXT1JEX1RISVMgICAgICAgICAgICAgICAgPSA1NDI7ICAgLy8gbWV0aG9kIHZhcmlhYmxlIHBvaW50cyB0byB0aGUgY3VycmVudCBpbnN0YW5jZQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWVdPUkRfU1VQRVIgICAgICAgICAgICAgICA9IDU0MzsgICAvLyBtZXRob2QgdmFyaWFibGUgcG9pbnRzIHRvIHRoZSBiYXNlIGluc3RhbmNlCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZV09SRF9JTlNUQU5DRU9GICAgICAgICAgID0gNTQ0OyAgIC8vIHR5cGUgY29tcGFyYXRvcgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWVdPUkRfUFJPUEVSVFkgICAgICAgICAgICA9IDU0NTsgICAvLyBkZXByZWNhdGVkOyBpZGVudGlmaWVzIGEgcHJvcGVydHkKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlXT1JEX05FVyAgICAgICAgICAgICAgICAgPSA1NDY7ICAgLy8gdXNlZCB0byBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgYSBjbGFzcworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZV09SRF9QQUNLQUdFICAgICAgICAgICAgID0gNTUwOyAgIC8vIGRlY2xhcmVzIHRoZSBwYWNrYWdlIHNjb3BlCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZV09SRF9JTVBPUlQgICAgICAgICAgICAgID0gNTUxOyAgIC8vIGRlY2xhcmVzIGFuIGV4dGVybmFsIGNsYXNzCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZV09SRF9BUyAgICAgICAgICAgICAgICAgID0gNTUyOyAgIC8vIHVzZWQgaW4gaW1wb3J0IHN0YXRlbWVudHMgdG8gY3JlYXRlIGFuIGFsaWFzCisKKworICAgIC8vCisgICAgLy8gS0VZV09SRFM6IENPTlRST0wgU1RSVUNUVVJFUworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZV09SRF9SRVRVUk4gICAgICAgICAgICAgID0gNTYwOyAgIC8vIHJldHVybnMgZnJvbSBhIGNsb3N1cmUgb3IgbWV0aG9kCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZV09SRF9JRiAgICAgICAgICAgICAgICAgID0gNTYxOyAgIC8vIGlmCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZV09SRF9FTFNFICAgICAgICAgICAgICAgID0gNTYyOyAgIC8vIGVsc2UKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlXT1JEX0RPICAgICAgICAgICAgICAgICAgPSA1NzA7ICAgLy8gZG8gbG9vcAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWVdPUkRfV0hJTEUgICAgICAgICAgICAgICA9IDU3MTsgICAvLyB3aGlsZSBsb29wCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZV09SRF9GT1IgICAgICAgICAgICAgICAgID0gNTcyOyAgIC8vIGZvciBsb29wCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZV09SRF9JTiAgICAgICAgICAgICAgICAgID0gNTczOyAgIC8vIGZvciAoZWFjaCkgbG9vcCBzZXBhcmF0b3IKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlXT1JEX0JSRUFLICAgICAgICAgICAgICAgPSA1NzQ7ICAgLy8gZXhpdHMgYSBsb29wIG9yIGJsb2NrCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZV09SRF9DT05USU5VRSAgICAgICAgICAgID0gNTc1OyAgIC8vIHJlc3RhcnRzIGEgbG9vcCBvbiB0aGUgbmV4dCBpdGVyYXRpb24KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlXT1JEX1NXSVRDSCAgICAgICAgICAgICAgPSA1NzY7ICAgLy8gc3dpdGNoIGJsb2NrCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZV09SRF9DQVNFICAgICAgICAgICAgICAgID0gNTc3OyAgIC8vIGl0ZW0gaW4gYSBzd2l0Y2ggYmxvY2sKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlXT1JEX0RFRkFVTFQgICAgICAgICAgICAgPSA1Nzg7ICAgLy8gY2F0Y2gtYWxsIGl0ZW0gaW4gYSBzd2l0Y2ggYmxvY2sKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWVdPUkRfVFJZICAgICAgICAgICAgICAgICA9IDU4MDsgICAvLyBibG9jayB0byBtb25pdG9yIGZvciBleGNlcHRpb25zCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZV09SRF9DQVRDSCAgICAgICAgICAgICAgID0gNTgxOyAgIC8vIGNhdGNoIGJsb2NrIGZvciBhIHBhcnRpY3VsYXIgZXhjZXB0aW9uCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZV09SRF9GSU5BTExZICAgICAgICAgICAgID0gNTgyOyAgIC8vIGJsb2NrIHRvIGFsd2F5cyBleGVjdXRlIG9uIGV4aXQgb2YgdGhlIHRyeQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWVdPUkRfVEhST1cgICAgICAgICAgICAgICA9IDU4MzsgICAvLyBzdGF0ZW1lbnQgdG8gdGhyb3cgYW4gZXhjZXB0aW9uCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZV09SRF9USFJPV1MgICAgICAgICAgICAgID0gNTg0OyAgIC8vIG1ldGhvZCBtb2RpZmllciB0byBkZWNsYXJlIHRocm93biB0cmFuc2FjdGlvbnMKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlXT1JEX0FTU0VSVCAgICAgICAgICAgICAgPSA1ODU7ICAgLy8gYWx0ZXJuYXRlIHRocm93IGZvciBjb2RlIGludmFyaWFudHMKKworCisgICAgLy8KKyAgICAvLyBLRVlXT1JEUzogUFJJTUlUSVZFIFRZUEVTCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlXT1JEX1ZPSUQgICAgICAgICAgICAgICAgPSA2MDA7ICAgLy8gdm9pZAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWVdPUkRfQk9PTEVBTiAgICAgICAgICAgICA9IDYwMTsgICAvLyBib29sZWFuCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZV09SRF9CWVRFICAgICAgICAgICAgICAgID0gNjAyOyAgIC8vIDEgYnl0ZSBpbnRlZ2VyCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZV09SRF9TSE9SVCAgICAgICAgICAgICAgID0gNjAzOyAgIC8vIDIgYnl0ZSBpbnRlZ2VyCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZV09SRF9JTlQgICAgICAgICAgICAgICAgID0gNjA0OyAgIC8vIDQgYnl0ZSBpbnRlZ2VyCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZV09SRF9MT05HICAgICAgICAgICAgICAgID0gNjA1OyAgIC8vIDggYnl0ZSBpbnRlZ2VyCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZV09SRF9GTE9BVCAgICAgICAgICAgICAgID0gNjA2OyAgIC8vIDMyIGJpdCBmbG9hdGluZyBwb2ludCBudW1iZXIKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlXT1JEX0RPVUJMRSAgICAgICAgICAgICAgPSA2MDc7ICAgLy8gNjQgYml0IGZsb2F0aW5nIHBvaW50IG51bWJlcgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWVdPUkRfQ0hBUiAgICAgICAgICAgICAgICA9IDYwODsgICAvLyB1bmljb2RlIGNoYXJhY3RlciBjb2RlCisKKworICAgIC8vCisgICAgLy8gS0VZV09SRFM6IFNQRUNJQUwgVkFMVUVTCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlXT1JEX1RSVUUgICAgICAgICAgICAgICAgPSA2MTA7ICAgLy8gYm9vbGVhbiB0cnV0aAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWVdPUkRfRkFMU0UgICAgICAgICAgICAgICA9IDYxMTsgICAvLyBib29sZWFuIGZhbHNlCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZV09SRF9OVUxMICAgICAgICAgICAgICAgID0gNjEyOyAgIC8vIG1pc3NpbmcgaW5zdGFuY2UKKworCisgICAgLy8KKyAgICAvLyBLRVlXT1JEUzogUkVTRVJWRUQKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWVdPUkRfQ09OU1QgICAgICAgICAgICAgICA9IDcwMDsgICAvLyByZXNlcnZlZCBpbiBqYXZhIGFuZCBncm9vdnkKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlXT1JEX0dPVE8gICAgICAgICAgICAgICAgPSA3MDE7ICAgLy8gcmVzZXJ2ZWQgaW4gamF2YSBhbmQgZ3Jvb3Z5CisKKworICAgIC8vCisgICAgLy8gU1BFQ0lBTCAoQ0FMQ1VMQVRFRCkgTUVBTklOR1MKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNZTlRIX0NPTVBJTEFUSU9OX1VOSVQgICAgICA9IDgwMDsgICAvLyByZXNlcnZlZDogYSBzeW50aGV0aWMgcm9vdCBmb3IgYSBDU1QKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNZTlRIX0NMQVNTICAgICAgICAgICAgICAgICA9IDgwMTsgICAvLyBhcHBsaWVkIHRvIGNsYXNzIG5hbWVzCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1lOVEhfSU5URVJGQUNFICAgICAgICAgICAgID0gODAyOyAgIC8vIGFwcGxpZWQgdG8gaW50ZXJmYWNlIG5hbWVzCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1lOVEhfTUlYSU4gICAgICAgICAgICAgICAgID0gODAzOyAgIC8vIGFwcGxpZWQgdG8gbWl4aW4gbmFtZXMKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTWU5USF9NRVRIT0QgICAgICAgICAgICAgICAgPSA4MDQ7ICAgLy8gYXBwbGllZCB0byBtZXRob2QgbmFtZXMKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTWU5USF9QUk9QRVJUWSAgICAgICAgICAgICAgPSA4MDU7ICAgLy8gYXBwbGllZCB0byBwcm9wZXJ0eSBuYW1lcworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNZTlRIX1BBUkFNRVRFUl9ERUNMQVJBVElPTiA9IDgwNjsgICAvLyBhcHBsaWVkIHRvIG1ldGhvZC9jbG9zdXJlIHBhcmFtZXRlciBuYW1lcworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1lOVEhfTElTVCAgICAgICAgICAgICAgICAgID0gODEwOyAgIC8vIGFwcGxpZWQgdG8gIlsiIHRoYXQgbWFya3MgYSBsaXN0CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1lOVEhfTUFQICAgICAgICAgICAgICAgICAgID0gODExOyAgIC8vIGFwcGxpZWQgdG8gIlsiIHRoYXQgbWFya3MgYSBtYXAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTWU5USF9HU1RSSU5HICAgICAgICAgICAgICAgPSA4MTI7ICAgLy8gYSBjb21wbGV0ZSBHU3RyaW5nCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTWU5USF9NRVRIT0RfQ0FMTCAgICAgICAgICAgPSA4MTQ7ICAgLy8gYXBwbGllZCB0byB0aGUgb3B0aW9uYWwgIigiIHRoYXQgbWFya3MgYSBjYWxsIHRvIGEgbWV0aG9kCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1lOVEhfQ0FTVCAgICAgICAgICAgICAgICAgID0gODE1OyAgIC8vIGFwcGxpZWQgdG8gIigiIHRoYXQgbWFya3MgYSB0eXBlIGNhc3QKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTWU5USF9CTE9DSyAgICAgICAgICAgICAgICAgPSA4MTY7ICAgLy8gYXBwbGllZCB0byAieyIgdGhhdCBtYXJrcyBhIGJsb2NrCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1lOVEhfQ0xPU1VSRSAgICAgICAgICAgICAgID0gODE3OyAgIC8vIGFwcGxpZWQgdG8gInsiIHRoYXQgbWFya3MgYSBjbG9zdXJlCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1lOVEhfTEFCRUwgICAgICAgICAgICAgICAgID0gODE4OyAgIC8vIGFwcGxpZWQgdG8gYSBzdGF0ZW1lbnQgbGFiZWwKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTWU5USF9URVJOQVJZICAgICAgICAgICAgICAgPSA4MTk7ICAgLy8gYXBwbGllZCB0byAiPyIgdGhhdCBtYXJrcyBhIHRlcm5hcnkgZXhwcmVzc2lvbgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNZTlRIX1RVUExFICAgICAgICAgICAgICAgICA9IDgyMDsgICAvLyBhcHBsaWVkIHRvICJ7IiB0aGF0IG1hcmtzIGFuIGFycmF5IGluaXRpYWxpemVyCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTWU5USF9WQVJJQUJMRV9ERUNMQVJBVElPTiAgPSA4MzA7ICAgLy8gYXBwbGllZCB0byBhbiBpZGVudGlmaWVyIHRoYXQgc3BlY2lmaWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0eXBlIG9mIGEgdmFyaWFibGUgZGVjbGFyYXRpb24KKworICAgIC8vCisgICAgLy8gR1NUUklORyBUT0tFTlMKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdTVFJJTkdfU1RBUlQgICAgICAgICAgICAgICA9IDkwMTsgICAvLyBhbnkgbWFya2VyIHRoYSBiZWdpbnMgYSBHU3RyaW5nCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR1NUUklOR19FTkQgICAgICAgICAgICAgICAgID0gOTAyOyAgIC8vIGFueSBtYXRjaGluZyBtYXJrZXIgdGhhdCBlbmRzIGEgR1N0cmluZworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdTVFJJTkdfRVhQUkVTU0lPTl9TVEFSVCAgICA9IDkwMzsgICAvLyB0aGUgJHsgbWFya2VyIHRoYXQgc3RhcnRzIGEgR1N0cmluZyBleHByZXNzaW9uCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR1NUUklOR19FWFBSRVNTSU9OX0VORCAgICAgID0gOTA0OyAgIC8vIHRoZSB9IG1hcmtlciB0aGF0IGVuZHMgYSBHU3RyaW5nIGV4cHJlc3NzaW9uCisKKworICAgIC8vCisgICAgLy8gVFlQRSBDTEFTU0VTCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTlkgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMDAwOyAgLy8gYW55dGhpbmcKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1RfRU9GICAgICAgICAgICAgICAgICAgICAgPSAxMDAxOyAgLy8gYW55dGhpbmcgYnV0IEVPRgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdFTkVSQUxfRU5EX09GX1NUQVRFTUVOVCAgICA9IDEwMDI7ICAvLyAiOyIsICJcbiIsIEVPRgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFOWV9FTkRfT0ZfU1RBVEVNRU5UICAgICAgICA9IDEwMDM7ICAvLyAiOyIsICJcbiIsIEVPRiwgIn0iCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBU1NJR05NRU5UX09QRVJBVE9SICAgICAgICAgPSAxMTAwOyAgLy8gPSwgKz0sIGV0Yy4KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01QQVJJU09OX09QRVJBVE9SICAgICAgICAgPSAxMTAxOyAgLy8gPT0sID09PSwgPiwgPCwgZXRjLgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BVEhfT1BFUkFUT1IgICAgICAgICAgICAgICA9IDExMDI7ICAvLyArLCAtLCAvICosICUsIHBsdXMgdGhlIExPR0lDQUxfT1BFUkFUT1JTCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9HSUNBTF9PUEVSQVRPUiAgICAgICAgICAgID0gMTEwMzsgIC8vIHx8LCAmJiwgIQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJBTkdFX09QRVJBVE9SICAgICAgICAgICAgICA9IDExMDQ7ICAvLyAuLiwgLi4uCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVHRVhfQ09NUEFSSVNPTl9PUEVSQVRPUiAgID0gMTEwNTsgIC8vID1+LCBldGMuCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVSRUZFUkVOQ0VfT1BFUkFUT1IgICAgICAgID0gMTEwNjsgIC8vIC4sIC0+CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklUV0lTRV9PUEVSQVRPUiAgICAgICAgICAgID0gMTEwNzsgIC8vIHwsICYsIDw8LCA+PiwgPj4+LCBeLCB+CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUkVGSVhfT1BFUkFUT1IgICAgICAgICAgICAgPSAxMjAwOyAgLy8gKyssICEsIGV0Yy4KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT1NURklYX09QRVJBVE9SICAgICAgICAgICAgPSAxMjEwOyAgLy8gKyssIGV0Yy4KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZJWF9PUEVSQVRPUiAgICAgICAgICAgICAgPSAxMjIwOyAgLy8gKywgLSwgPSwgZXRjLgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRUZJWF9PUl9JTkZJWF9PUEVSQVRPUiAgICA9IDEyMzA7ICAvLyArLCAtCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFVSRV9QUkVGSVhfT1BFUkFUT1IgICAgICAgID0gMTIzNTsgIC8vIHByZWZpeCArLCBwcmVmaXggLQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZV09SRCAgICAgICAgICAgICAgICAgICAgID0gMTMwMDsgIC8vIGFueSBrZXl3b3JkCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1lNQk9MICAgICAgICAgICAgICAgICAgICAgID0gMTMwMTsgIC8vIGFueSBzeW1ib2wKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMSVRFUkFMICAgICAgICAgICAgICAgICAgICAgPSAxMzEwOyAgLy8gc3RyaW5ncywgbnVtYmVycywgaWRlbnRpZmllcnMKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOVU1CRVIgICAgICAgICAgICAgICAgICAgICAgPSAxMzIwOyAgLy8gaW50ZWdlcnMgYW5kIGRlY2ltYWxzCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0lHTiAgICAgICAgICAgICAgICAgICAgICAgID0gMTMyNTsgIC8vICIrIiwgIi0iCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFNRURfVkFMVUUgICAgICAgICAgICAgICAgID0gMTMzMDsgIC8vIHRydWUsIGZhbHNlLCBudWxsCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFJVVEhfVkFMVUUgICAgICAgICAgICAgICAgID0gMTMzMTsgIC8vIHRydWUsIGZhbHNlCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJTUlUSVZFX1RZUEUgICAgICAgICAgICAgID0gMTM0MDsgIC8vIHZvaWQsIGJ5dGUsIHNob3J0LCBpbnQsIGV0Yy4KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDUkVBVEFCTEVfUFJJTUlUSVZFX1RZUEUgICAgPSAxMzQxOyAgLy8gYW55IFBSSU1JVElWRV9UWVBFIGV4Y2VwdCB2b2lkCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9PUCAgICAgICAgICAgICAgICAgICAgICAgID0gMTM1MDsgIC8vIGRvLCB3aGlsZSwgZXRjLgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU0VSVkVEX0tFWVdPUkQgICAgICAgICAgICA9IDEzNjA7ICAvLyBjb25zdCwgZ290bywgZXRjLgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWVdPUkRfSURFTlRJRklFUiAgICAgICAgICA9IDEzNjE7ICAvLyBrZXl3b3JkcyB0aGF0IGNhbiBhcHBlYXIgYXMgaWRlbnRpZmllcnMKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTWU5USEVUSUMgICAgICAgICAgICAgICAgICAgPSAxMzcwOyAgLy8gYW55IG9mIHRoZSBTWU5USCB0eXBlcworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9ERUNMQVJBVElPTiAgICAgICAgICAgID0gMTQwMDsgIC8vIGNsYXNzLCBpbnRlcmZhY2UsIG1peGluCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVDTEFSQVRJT05fTU9ESUZJRVIgICAgICAgID0gMTQxMDsgIC8vIHB1YmxpYywgcHJpdmF0ZSwgYWJzdHJhY3QsIGV0Yy4KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfTkFNRSAgICAgICAgICAgICAgICAgICA9IDE0MjA7ICAvLyBpZGVudGlmaWVycywgcHJpbWl0aXZlIHR5cGVzCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ1JFQVRBQkxFX1RZUEVfTkFNRSAgICAgICAgID0gMTQzMDsgIC8vIGlkZW50aWZpZXJzLCBwcmltaXRpdmUgdHlwZXMgZXhjZXB0IHZvaWQKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BVENIRURfQ09OVEFJTkVSICAgICAgICAgICA9IDE1MDA7ICAvLyAoLCApLCBbLCBdLCB7LCB9CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVGVF9PRl9NQVRDSEVEX0NPTlRBSU5FUiAgID0gMTUwMTsgIC8vICgsIFssIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUdIVF9PRl9NQVRDSEVEX0NPTlRBSU5FUiAgPSAxNTAyOyAgLy8gKSwgXSwgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhQUkVTU0lPTiAgICAgICAgICAgICAgICAgID0gMTkwMDsgIC8vIGFsbCBvZiB0aGUgYmVsb3cgMTkwMCBzZXJpZXMKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QRVJBVE9SX0VYUFJFU1NJT04gICAgICAgICA9IDE5MDE7ICAvLyAiLiItIjw8IgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNZTlRIX0VYUFJFU1NJT04gICAgICAgICAgICA9IDE5MDI7ICAvLyBjYXN0LCB0ZXJuYXJ5LCBhbmQgY2xvc3VyZSBleHByZXNzaW9uCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZV09SRF9FWFBSRVNTSU9OICAgICAgICAgID0gMTkwMzsgIC8vIG5ldywgdGhpcywgc3VwZXIsIGluc3RhbmNlb2YsIHRydWUsIGZhbHNlLCBudWxsCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTElURVJBTF9FWFBSRVNTSU9OICAgICAgICAgID0gMTkwNDsgIC8vIExJVEVSQUwKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUlJBWV9FWFBSRVNTSU9OICAgICAgICAgICAgPSAxOTA1OyAgLy8gIlsiCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSU1QTEVfRVhQUkVTU0lPTiAgICAgICAgICAgPSAxOTEwOyAgLy8gTElURVJBTCwgdGhpcywgdHJ1ZSwgZmFsc2UsIG51bGwKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01QTEVYX0VYUFJFU1NJT04gICAgICAgICAgPSAxOTExOyAgLy8gU0lNUExFX0VYUFJFU1NJT04sIGFuZCB2YXJpb3VzIG1vbGVjdWxlcworCisKKworICAgIC8vCisgICAgLy8gVFlQRSBHUk9VUFMgKE9QRVJBVElPTlMgU1VQUE9SVCkKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBUkFNRVRFUl9URVJNSU5BVE9SUyAgICAgICA9IDIwMDA7ICAvLyAiKSIsICIsIgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFSUkFZX0lURU1fVEVSTUlOQVRPUlMgICAgICA9IDIwMDE7ICAvLyAiXSIsICIsIgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfTElTVF9URVJNSU5BVE9SUyAgICAgICA9IDIwMDI7ICAvLyAiaW1wbGVtZW50cyIsICJ0aHJvd3MiLCAieyIsICIsIgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QVElPTkFMX0RBVEFUWVBFX0ZPTExPV0VSUyA9IDIwMDM7ICAvLyBpZGVudGlmaWVyLCAiWyIsICIuIgorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1dJVENIX0JMT0NLX1RFUk1JTkFUT1JTICAgID0gMjAwNDsgIC8vICJjYXNlIiwgImRlZmF1bHQiLCAifSIKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTV0lUQ0hfRU5UUklFUyAgICAgICAgICAgICAgPSAyMDA1OyAgLy8gImNhc2UiLCAiZGVmYXVsdCIKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FVEhPRF9DQUxMX1NUQVJURVJTICAgICAgICA9IDIwMDY7ICAvLyBMSVRFUkFMLCAiKCIsICJ7IgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOU0FGRV9PVkVSX05FV0xJTkVTICAgICAgICA9IDIwMDc7ICAvLyB0aGluZ3MgdGhlIGV4cHJlc3Npb24gcGFyc2VyIHNob3VsZCBjcm9zcyBsaW5lcyBmb3IgaW4gaXQgZG9lc24ndCBoYXZlIHRvCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUkVDTFVERVNfQ0FTVF9PUEVSQVRPUiAgICAgPSAyMDA4OyAgLy8gYW55dGhpbmcgdGhhdCBwcmV2ZW50cyAoWCkgZnJvbSBiZWluZyBhIGNhc3QKKworCisKKworCisgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIFRZUEUgSElFUkFSQ0hJRVMKKworCisgICAvKioKKyAgICAqICBHaXZlbiB0d28gdHlwZXMsIHJldHVybnMgdHJ1ZSBpZiB0aGUgc2Vjb25kIGRlc2NyaWJlcyB0aGUgZmlyc3QuCisgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvZlR5cGUoIGludCBzcGVjaWZpYywgaW50IGdlbmVyYWwgKQorICAgIHsKKworICAgICAgICBpZiggZ2VuZXJhbCA9PSBzcGVjaWZpYyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoKCBnZW5lcmFsICkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBBTlk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgICAgIGNhc2UgTk9UX0VPRjoKKyAgICAgICAgICAgICAgICByZXR1cm4gc3BlY2lmaWMgPj0gVU5LTk9XTiAmJiBzcGVjaWZpYyA8PSBTWU5USF9WQVJJQUJMRV9ERUNMQVJBVElPTjsKKworICAgICAgICAgICAgY2FzZSBHRU5FUkFMX0VORF9PRl9TVEFURU1FTlQ6CisgICAgICAgICAgICAgICAgc3dpdGNoKCBzcGVjaWZpYyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEVPRjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBORVdMSU5FOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFNFTUlDT0xPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBBTllfRU5EX09GX1NUQVRFTUVOVDoKKyAgICAgICAgICAgICAgICBzd2l0Y2goIHNwZWNpZmljICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRU9GOgorICAgICAgICAgICAgICAgICAgICBjYXNlIE5FV0xJTkU6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU0VNSUNPTE9OOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFJJR0hUX0NVUkxZX0JSQUNFOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIEFTU0lHTk1FTlRfT1BFUkFUT1I6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNwZWNpZmljID09IEVRVUFMIHx8IChzcGVjaWZpYyA+PSBQTFVTX0VRVUFMICYmIHNwZWNpZmljIDw9IFBPV0VSX0VRVUFMKSB8fCAoc3BlY2lmaWMgPj0gTE9HSUNBTF9PUl9FUVVBTCAmJiBzcGVjaWZpYyA8PSBMT0dJQ0FMX0FORF9FUVVBTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHNwZWNpZmljID49IExFRlRfU0hJRlRfRVFVQUwgJiYgc3BlY2lmaWMgPD0gUklHSFRfU0hJRlRfVU5TSUdORURfRVFVQUwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChzcGVjaWZpYyA+PSBCSVRXSVNFX09SX0VRVUFMICYmIHNwZWNpZmljIDw9IEJJVFdJU0VfWE9SX0VRVUFMKTsKKworICAgICAgICAgICAgY2FzZSBDT01QQVJJU09OX09QRVJBVE9SOgorICAgICAgICAgICAgICAgIHJldHVybiBzcGVjaWZpYyA+PSBDT01QQVJFX05PVF9FUVVBTCAmJiBzcGVjaWZpYyA8PSBDT01QQVJFX1RPOworCisgICAgICAgICAgICBjYXNlIE1BVEhfT1BFUkFUT1I6CisgICAgICAgICAgICAgICAgcmV0dXJuIChzcGVjaWZpYyA+PSBQTFVTICYmIHNwZWNpZmljIDw9IFJJR0hUX1NISUZUX1VOU0lHTkVEKSB8fCAoc3BlY2lmaWMgPj0gTk9UICYmIHNwZWNpZmljIDw9IExPR0lDQUxfQU5EKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHNwZWNpZmljID49IEJJVFdJU0VfT1IgJiYgc3BlY2lmaWMgPD0gQklUV0lTRV9YT1IpOworCisgICAgICAgICAgICBjYXNlIExPR0lDQUxfT1BFUkFUT1I6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNwZWNpZmljID49IE5PVCAmJiBzcGVjaWZpYyA8PSBMT0dJQ0FMX0FORDsKKworICAgICAgICAgICAgY2FzZSBCSVRXSVNFX09QRVJBVE9SOgorICAgICAgICAgICAgICAgIHJldHVybiAoc3BlY2lmaWMgPj0gQklUV0lTRV9PUiAmJiBzcGVjaWZpYyA8PSBCSVRXSVNFX1hPUikgfHwgc3BlY2lmaWMgPT0gQklUV0lTRV9ORUdBVElPTjsKKworICAgICAgICAgICAgY2FzZSBSQU5HRV9PUEVSQVRPUjoKKyAgICAgICAgICAgICAgICByZXR1cm4gc3BlY2lmaWMgPT0gRE9UX0RPVCB8fCBzcGVjaWZpYyA9PSBET1RfRE9UX0RPVDsKKworICAgICAgICAgICAgY2FzZSBSRUdFWF9DT01QQVJJU09OX09QRVJBVE9SOgorICAgICAgICAgICAgICAgIHJldHVybiBzcGVjaWZpYyA9PSBGSU5EX1JFR0VYIHx8IHNwZWNpZmljID09IE1BVENIX1JFR0VYOworCisgICAgICAgICAgICBjYXNlIERFUkVGRVJFTkNFX09QRVJBVE9SOgorICAgICAgICAgICAgICAgIHJldHVybiBzcGVjaWZpYyA9PSBET1QgfHwgc3BlY2lmaWMgPT0gTkFWSUdBVEU7CisKKyAgICAgICAgICAgIGNhc2UgUFJFRklYX09QRVJBVE9SOgorICAgICAgICAgICAgICAgIHN3aXRjaCggc3BlY2lmaWMgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBNSU5VUzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBQTFVTX1BMVVM6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTUlOVVNfTUlOVVM6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBGQUxMIFRIUk9VR0ggKi8KKworICAgICAgICAgICAgY2FzZSBQVVJFX1BSRUZJWF9PUEVSQVRPUjoKKyAgICAgICAgICAgICAgICBzd2l0Y2goIHNwZWNpZmljICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUkVHRVhfUEFUVEVSTjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBOT1Q6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUFJFRklYX1BMVVM6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUFJFRklYX1BMVVNfUExVUzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBQUkVGSVhfTUlOVVM6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUFJFRklYX01JTlVTX01JTlVTOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFNZTlRIX0NBU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgUE9TVEZJWF9PUEVSQVRPUjoKKyAgICAgICAgICAgICAgICBzd2l0Y2goIHNwZWNpZmljICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUExVU19QTFVTOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFBPU1RGSVhfUExVU19QTFVTOgorICAgICAgICAgICAgICAgICAgICBjYXNlIE1JTlVTX01JTlVTOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFBPU1RGSVhfTUlOVVNfTUlOVVM6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgSU5GSVhfT1BFUkFUT1I6CisgICAgICAgICAgICAgICAgc3dpdGNoKCBzcGVjaWZpYyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIERPVDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBOQVZJR0FURToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBMT0dJQ0FMX09SOgorICAgICAgICAgICAgICAgICAgICBjYXNlIExPR0lDQUxfQU5EOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEJJVFdJU0VfT1I6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQklUV0lTRV9BTkQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQklUV0lTRV9YT1I6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTEVGVF9TSElGVDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSSUdIVF9TSElGVDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSSUdIVF9TSElGVF9VTlNJR05FRDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGSU5EX1JFR0VYOgorICAgICAgICAgICAgICAgICAgICBjYXNlIE1BVENIX1JFR0VYOgorICAgICAgICAgICAgICAgICAgICBjYXNlIERPVF9ET1Q6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRE9UX0RPVF9ET1Q6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgS0VZV09SRF9JTlNUQU5DRU9GOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIChzcGVjaWZpYyA+PSBDT01QQVJFX05PVF9FUVVBTCAmJiBzcGVjaWZpYyA8PSBDT01QQVJFX1RPKSB8fCAoc3BlY2lmaWMgPj0gUExVUyAmJiBzcGVjaWZpYyA8PSBNT0RfRVFVQUwpIHx8IHNwZWNpZmljID09IEVRVUFMIHx8IChzcGVjaWZpYyA+PSBQTFVTX0VRVUFMICYmIHNwZWNpZmljIDw9IFBPV0VSX0VRVUFMKSB8fCAoc3BlY2lmaWMgPj0gTE9HSUNBTF9PUl9FUVVBTCAmJiBzcGVjaWZpYyA8PSBMT0dJQ0FMX0FORF9FUVVBTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChzcGVjaWZpYyA+PSBMRUZUX1NISUZUX0VRVUFMICYmIHNwZWNpZmljIDw9IFJJR0hUX1NISUZUX1VOU0lHTkVEX0VRVUFMKSB8fCAoc3BlY2lmaWMgPj0gQklUV0lTRV9PUl9FUVVBTCAmJiBzcGVjaWZpYyA8PSBCSVRXSVNFX1hPUl9FUVVBTCk7CisKKyAgICAgICAgICAgIGNhc2UgUFJFRklYX09SX0lORklYX09QRVJBVE9SOgorICAgICAgICAgICAgICAgIHN3aXRjaCggc3BlY2lmaWMgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBQT1dFUjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBQTFVTOgorICAgICAgICAgICAgICAgICAgICBjYXNlIE1JTlVTOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFBSRUZJWF9QTFVTOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFBSRUZJWF9NSU5VUzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworCisgICAgICAgICAgICBjYXNlIEtFWVdPUkQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNwZWNpZmljID49IEtFWVdPUkRfUFJJVkFURSAmJiBzcGVjaWZpYyA8PSBLRVlXT1JEX0dPVE87CisKKyAgICAgICAgICAgIGNhc2UgU1lNQk9MOgorICAgICAgICAgICAgICAgIHJldHVybiBzcGVjaWZpYyA+PSBORVdMSU5FICYmIHNwZWNpZmljIDw9IFBJUEU7CisKKyAgICAgICAgICAgIGNhc2UgTElURVJBTDoKKyAgICAgICAgICAgICAgICByZXR1cm4gc3BlY2lmaWMgPj0gU1RSSU5HICYmIHNwZWNpZmljIDw9IERFQ0lNQUxfTlVNQkVSOworCisgICAgICAgICAgICBjYXNlIE5VTUJFUjoKKyAgICAgICAgICAgICAgICByZXR1cm4gc3BlY2lmaWMgPT0gSU5URUdFUl9OVU1CRVIgfHwgc3BlY2lmaWMgPT0gREVDSU1BTF9OVU1CRVI7CisKKyAgICAgICAgICAgIGNhc2UgU0lHTjoKKyAgICAgICAgICAgICAgICBzd2l0Y2goIHNwZWNpZmljICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUExVUzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBNSU5VUzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBOQU1FRF9WQUxVRToKKyAgICAgICAgICAgICAgICByZXR1cm4gc3BlY2lmaWMgPj0gS0VZV09SRF9UUlVFICYmIHNwZWNpZmljIDw9IEtFWVdPUkRfTlVMTDsKKworICAgICAgICAgICAgY2FzZSBUUlVUSF9WQUxVRToKKyAgICAgICAgICAgICAgICByZXR1cm4gc3BlY2lmaWMgPT0gS0VZV09SRF9UUlVFIHx8IHNwZWNpZmljID09IEtFWVdPUkRfRkFMU0U7CisKKyAgICAgICAgICAgIGNhc2UgVFlQRV9OQU1FOgorICAgICAgICAgICAgICAgIGlmKCBzcGVjaWZpYyA9PSBJREVOVElGSUVSICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIEZBTEwgVEhST1VHSCAqLworCisgICAgICAgICAgICBjYXNlIFBSSU1JVElWRV9UWVBFOgorICAgICAgICAgICAgICAgIHJldHVybiBzcGVjaWZpYyA+PSBLRVlXT1JEX1ZPSUQgJiYgc3BlY2lmaWMgPD0gS0VZV09SRF9DSEFSOworCisgICAgICAgICAgICBjYXNlIENSRUFUQUJMRV9UWVBFX05BTUU6CisgICAgICAgICAgICAgICAgaWYoIHNwZWNpZmljID09IElERU5USUZJRVIgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogRkFMTCBUSFJPVUdIICovCisKKyAgICAgICAgICAgIGNhc2UgQ1JFQVRBQkxFX1BSSU1JVElWRV9UWVBFOgorICAgICAgICAgICAgICAgIHJldHVybiBzcGVjaWZpYyA+PSBLRVlXT1JEX0JPT0xFQU4gJiYgc3BlY2lmaWMgPD0gS0VZV09SRF9DSEFSOworCisgICAgICAgICAgICBjYXNlIExPT1A6CisgICAgICAgICAgICAgICAgc3dpdGNoKCBzcGVjaWZpYyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEtFWVdPUkRfRE86CisgICAgICAgICAgICAgICAgICAgIGNhc2UgS0VZV09SRF9XSElMRToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBLRVlXT1JEX0ZPUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBSRVNFUlZFRF9LRVlXT1JEOgorICAgICAgICAgICAgICAgIHJldHVybiBzcGVjaWZpYyA+PSBLRVlXT1JEX0NPTlNUICYmIHNwZWNpZmljIDw9IEtFWVdPUkRfR09UTzsKKworICAgICAgICAgICAgY2FzZSBLRVlXT1JEX0lERU5USUZJRVI6CisgICAgICAgICAgICAgICAgc3dpdGNoKCBzcGVjaWZpYyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEtFWVdPUkRfQ0xBU1M6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgS0VZV09SRF9JTlRFUkZBQ0U6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgS0VZV09SRF9NSVhJTjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBLRVlXT1JEX0RFRjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBLRVlXT1JEX0RFRk1BQ1JPOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEtFWVdPUkRfSU46CisgICAgICAgICAgICAgICAgICAgIGNhc2UgS0VZV09SRF9QUk9QRVJUWToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTWU5USEVUSUM6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNwZWNpZmljID49IFNZTlRIX0NPTVBJTEFUSU9OX1VOSVQgJiYgc3BlY2lmaWMgPD0gU1lOVEhfVkFSSUFCTEVfREVDTEFSQVRJT047CisKKyAgICAgICAgICAgIGNhc2UgVFlQRV9ERUNMQVJBVElPTjoKKyAgICAgICAgICAgICAgICByZXR1cm4gc3BlY2lmaWMgPj0gS0VZV09SRF9DTEFTUyAmJiBzcGVjaWZpYyA8PSBLRVlXT1JEX01JWElOOworCisgICAgICAgICAgICBjYXNlIERFQ0xBUkFUSU9OX01PRElGSUVSOgorICAgICAgICAgICAgICAgIHJldHVybiBzcGVjaWZpYyA+PSBLRVlXT1JEX1BSSVZBVEUgJiYgc3BlY2lmaWMgPD0gS0VZV09SRF9TVEFUSUM7CisKKyAgICAgICAgICAgIGNhc2UgTUFUQ0hFRF9DT05UQUlORVI6CisgICAgICAgICAgICAgICAgc3dpdGNoKCBzcGVjaWZpYyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIExFRlRfQ1VSTFlfQlJBQ0U6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUklHSFRfQ1VSTFlfQlJBQ0U6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTEVGVF9TUVVBUkVfQlJBQ0tFVDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSSUdIVF9TUVVBUkVfQlJBQ0tFVDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBMRUZUX1BBUkVOVEhFU0lTOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFJJR0hUX1BBUkVOVEhFU0lTOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIExFRlRfT0ZfTUFUQ0hFRF9DT05UQUlORVI6CisgICAgICAgICAgICAgICAgc3dpdGNoKCBzcGVjaWZpYyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIExFRlRfQ1VSTFlfQlJBQ0U6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTEVGVF9TUVVBUkVfQlJBQ0tFVDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBMRUZUX1BBUkVOVEhFU0lTOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFJJR0hUX09GX01BVENIRURfQ09OVEFJTkVSOgorICAgICAgICAgICAgICAgIHN3aXRjaCggc3BlY2lmaWMgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSSUdIVF9DVVJMWV9CUkFDRToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSSUdIVF9TUVVBUkVfQlJBQ0tFVDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSSUdIVF9QQVJFTlRIRVNJUzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworCisgICAgICAgICAgICBjYXNlIFBBUkFNRVRFUl9URVJNSU5BVE9SUzoKKyAgICAgICAgICAgICAgICByZXR1cm4gc3BlY2lmaWMgPT0gUklHSFRfUEFSRU5USEVTSVMgfHwgc3BlY2lmaWMgPT0gQ09NTUE7CisKKyAgICAgICAgICAgIGNhc2UgQVJSQVlfSVRFTV9URVJNSU5BVE9SUzoKKyAgICAgICAgICAgICAgICByZXR1cm4gc3BlY2lmaWMgPT0gUklHSFRfU1FVQVJFX0JSQUNLRVQgfHwgc3BlY2lmaWMgPT0gQ09NTUE7CisKKyAgICAgICAgICAgIGNhc2UgVFlQRV9MSVNUX1RFUk1JTkFUT1JTOgorICAgICAgICAgICAgICAgIHN3aXRjaCggc3BlY2lmaWMgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBLRVlXT1JEX0lNUExFTUVOVFM6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgS0VZV09SRF9USFJPV1M6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTEVGVF9DVVJMWV9CUkFDRToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT01NQToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBPUFRJT05BTF9EQVRBVFlQRV9GT0xMT1dFUlM6CisgICAgICAgICAgICAgICAgc3dpdGNoKCBzcGVjaWZpYyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIElERU5USUZJRVI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTEVGVF9TUVVBUkVfQlJBQ0tFVDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBET1Q6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU1dJVENIX0JMT0NLX1RFUk1JTkFUT1JTOgorICAgICAgICAgICAgICAgIGlmKCBzcGVjaWZpYyA9PSBSSUdIVF9DVVJMWV9CUkFDRSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBGQUxMIFRIUk9VR0ggKi8KKworICAgICAgICAgICAgY2FzZSBTV0lUQ0hfRU5UUklFUzoKKyAgICAgICAgICAgICAgICByZXR1cm4gc3BlY2lmaWMgPT0gS0VZV09SRF9DQVNFIHx8IHNwZWNpZmljID09IEtFWVdPUkRfREVGQVVMVDsKKworICAgICAgICAgICAgY2FzZSBNRVRIT0RfQ0FMTF9TVEFSVEVSUzoKKyAgICAgICAgICAgICAgICBpZiggc3BlY2lmaWMgPj0gU1RSSU5HICYmIHNwZWNpZmljIDw9IERFQ0lNQUxfTlVNQkVSICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzd2l0Y2goIHNwZWNpZmljICkKKwkJCQl7CisgICAgICAgICAgICAgICAgCWNhc2UgTEVGVF9QQVJFTlRIRVNJUzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBHU1RSSU5HX1NUQVJUOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFNZTlRIX0dTVFJJTkc6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgS0VZV09SRF9ORVc6CisgICAgICAgICAgICAgICAgICAgIAlyZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgVU5TQUZFX09WRVJfTkVXTElORVM6CisgICAgICAgICAgICAgICAgaWYoIG9mVHlwZShzcGVjaWZpYywgU1lNQk9MKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIHNwZWNpZmljICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBMRUZUX0NVUkxZX0JSQUNFOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBMRUZUX1BBUkVOVEhFU0lTOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBMRUZUX1NRVUFSRV9CUkFDS0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQTFVTOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQTFVTX1BMVVM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1JTlVTOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNSU5VU19NSU5VUzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUkVHRVhfUEFUVEVSTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTk9UOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCggc3BlY2lmaWMgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBLRVlXT1JEX0lOU1RBTkNFT0Y6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgR1NUUklOR19FWFBSRVNTSU9OX1NUQVJUOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEdTVFJJTkdfRVhQUkVTU0lPTl9FTkQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgR1NUUklOR19FTkQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgICAgIGNhc2UgUFJFQ0xVREVTX0NBU1RfT1BFUkFUT1I6CisgICAgICAgICAgICAgICAgc3dpdGNoKCBzcGVjaWZpYyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFBMVVM6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTUlOVVM6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUFJFRklYX01JTlVTOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFBSRUZJWF9NSU5VU19NSU5VUzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBQUkVGSVhfUExVUzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBQUkVGSVhfUExVU19QTFVTOgorICAgICAgICAgICAgICAgICAgICBjYXNlIExFRlRfUEFSRU5USEVTSVM6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuICFvZlR5cGUoIHNwZWNpZmljLCBDT01QTEVYX0VYUFJFU1NJT04gKTsKKworCisKKworICAgICAgICAgICAgY2FzZSBPUEVSQVRPUl9FWFBSRVNTSU9OOgorICAgICAgICAgICAgICAgIHJldHVybiBzcGVjaWZpYyA+PSBET1QgJiYgc3BlY2lmaWMgPD0gUklHSFRfU0hJRlRfVU5TSUdORUQ7CisKKyAgICAgICAgICAgIGNhc2UgU1lOVEhfRVhQUkVTU0lPTjoKKyAgICAgICAgICAgICAgICBzd2l0Y2goIHNwZWNpZmljICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU1lOVEhfQ0FTVDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTWU5USF9DTE9TVVJFOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFNZTlRIX1RFUk5BUlk6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgS0VZV09SRF9FWFBSRVNTSU9OOgorICAgICAgICAgICAgICAgIHN3aXRjaCggc3BlY2lmaWMgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBLRVlXT1JEX05FVzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBLRVlXT1JEX1RISVM6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgS0VZV09SRF9TVVBFUjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBLRVlXT1JEX0lOU1RBTkNFT0Y6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgS0VZV09SRF9UUlVFOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEtFWVdPUkRfRkFMU0U6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgS0VZV09SRF9OVUxMOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIExJVEVSQUxfRVhQUkVTU0lPTjoKKyAgICAgICAgICAgICAgICByZXR1cm4gc3BlY2lmaWMgPj0gU1RSSU5HICYmIHNwZWNpZmljIDw9IERFQ0lNQUxfTlVNQkVSOworCisgICAgICAgICAgICBjYXNlIEFSUkFZX0VYUFJFU1NJT046CisgICAgICAgICAgICAgICAgcmV0dXJuIHNwZWNpZmljID09IExFRlRfU1FVQVJFX0JSQUNLRVQ7CisKKyAgICAgICAgICAgIGNhc2UgRVhQUkVTU0lPTjoKKyAgICAgICAgICAgICAgICBpZiggc3BlY2lmaWMgPj0gRE9UICYmIHNwZWNpZmljIDw9IFJJR0hUX1NISUZUX1VOU0lHTkVEICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmKCBzcGVjaWZpYyA+PSBTVFJJTkcgJiYgc3BlY2lmaWMgPD0gREVDSU1BTF9OVU1CRVIgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoKCBzcGVjaWZpYyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFNZTlRIX0NBU1Q6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU1lOVEhfQ0xPU1VSRToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTWU5USF9URVJOQVJZOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFNZTlRIX0dTVFJJTkc6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgS0VZV09SRF9ORVc6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgS0VZV09SRF9USElTOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEtFWVdPUkRfU1VQRVI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgS0VZV09SRF9JTlNUQU5DRU9GOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEtFWVdPUkRfVFJVRToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBLRVlXT1JEX0ZBTFNFOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEtFWVdPUkRfTlVMTDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBMRUZUX1NRVUFSRV9CUkFDS0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIENPTVBMRVhfRVhQUkVTU0lPTjoKKyAgICAgICAgICAgICAgICBzd2l0Y2goIHNwZWNpZmljICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgS0VZV09SRF9ORVc6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU1lOVEhfTUVUSE9EX0NBTEw6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU1lOVEhfR1NUUklORzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTWU5USF9MSVNUOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFNZTlRIX01BUDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTWU5USF9DTE9TVVJFOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFNZTlRIX1RFUk5BUlk6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU1lOVEhfVkFSSUFCTEVfREVDTEFSQVRJT046CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBGQUxMIFRIUk9VR0ggKi8KKworICAgICAgICAgICAgY2FzZSBTSU1QTEVfRVhQUkVTU0lPTjoKKyAgICAgICAgICAgICAgICBpZiggc3BlY2lmaWMgPj0gU1RSSU5HICYmIHNwZWNpZmljIDw9IERFQ0lNQUxfTlVNQkVSICkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2goIHNwZWNpZmljICkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEtFWVdPUkRfU1VQRVI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgS0VZV09SRF9USElTOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEtFWVdPUkRfVFJVRToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBLRVlXT1JEX0ZBTFNFOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEtFWVdPUkRfTlVMTDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworCisKKworICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBUWVBFIENPRVJTSU9OUworCisKKyAgIC8qKgorICAgICogIEdpdmVuIHR3byB0eXBlcywgcmV0dXJucyB0cnVlIGlmIHRoZSBmaXJzdCBjYW4gYmUgdmlld2VkIGFzIHRoZSBzZWNvbmQuCisgICAgKiAgTk9URSB0aGF0IDxjb2RlPmNhbk1lYW4oKTwvY29kZT4gaXMgb3J0aG9nb25hbCB0byA8Y29kZT5vZlR5cGUoKTwvY29kZT4uCisgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjYW5NZWFuKCBpbnQgYWN0dWFsLCBpbnQgcHJlZmVycmVkICkgeworCisgICAgICAgIGlmKCBhY3R1YWwgPT0gcHJlZmVycmVkICkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2goIHByZWZlcnJlZCApIHsKKworICAgICAgICAgICAgY2FzZSBTWU5USF9QQVJBTUVURVJfREVDTEFSQVRJT046CisgICAgICAgICAgICBjYXNlIElERU5USUZJRVI6CisgICAgICAgICAgICAgICAgc3dpdGNoKCBhY3R1YWwgKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgSURFTlRJRklFUjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBLRVlXT1JEX0RFRjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBLRVlXT1JEX0RFRk1BQ1JPOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEtFWVdPUkRfQ0xBU1M6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgS0VZV09SRF9JTlRFUkZBQ0U6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgS0VZV09SRF9NSVhJTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTWU5USF9DTEFTUzoKKyAgICAgICAgICAgIGNhc2UgU1lOVEhfSU5URVJGQUNFOgorICAgICAgICAgICAgY2FzZSBTWU5USF9NSVhJTjoKKyAgICAgICAgICAgIGNhc2UgU1lOVEhfTUVUSE9EOgorICAgICAgICAgICAgY2FzZSBTWU5USF9QUk9QRVJUWToKKyAgICAgICAgICAgICAgICByZXR1cm4gYWN0dWFsID09IElERU5USUZJRVI7CisKKyAgICAgICAgICAgIGNhc2UgU1lOVEhfTElTVDoKKyAgICAgICAgICAgIGNhc2UgU1lOVEhfTUFQOgorICAgICAgICAgICAgICAgIHJldHVybiBhY3R1YWwgPT0gTEVGVF9TUVVBUkVfQlJBQ0tFVDsKKworICAgICAgICAgICAgY2FzZSBTWU5USF9DQVNUOgorICAgICAgICAgICAgICAgIHJldHVybiBhY3R1YWwgPT0gTEVGVF9QQVJFTlRIRVNJUzsKKworICAgICAgICAgICAgY2FzZSBTWU5USF9CTE9DSzoKKyAgICAgICAgICAgIGNhc2UgU1lOVEhfQ0xPU1VSRToKKyAgICAgICAgICAgICAgICByZXR1cm4gYWN0dWFsID09IExFRlRfQ1VSTFlfQlJBQ0U7CisKKyAgICAgICAgICAgIGNhc2UgU1lOVEhfTEFCRUw6CisgICAgICAgICAgICAgICAgcmV0dXJuIGFjdHVhbCA9PSBDT0xPTjsKKworICAgICAgICAgICAgY2FzZSBTWU5USF9WQVJJQUJMRV9ERUNMQVJBVElPTjoKKyAgICAgICAgICAgICAgICByZXR1cm4gYWN0dWFsID09IElERU5USUZJRVI7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisKKworICAgLyoqCisgICAgKiAgQ29udmVydHMgYSBub2RlIGZyb20gYSBnZW5lcmljIHR5cGUgdG8gYSBzcGVjaWZpYyBwcmVmaXggdHlwZS4KKyAgICAqICBUaHJvd3MgYSA8Y29kZT5Hcm9vdnlCdWdFcnJvcjwvY29kZT4gaWYgdGhlIHR5cGUgY2FuJ3QgYmUgY29udmVydGVkCisgICAgKiAgYW5kIHJlcXVlc3RlZC4KKyAgICAqLworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1ha2VQcmVmaXgoIENTVE5vZGUgbm9kZSwgYm9vbGVhbiB0aHJvd0lmSW52YWxpZCApIHsKKworICAgICAgICBzd2l0Y2goIG5vZGUuZ2V0TWVhbmluZygpICkgeworICAgICAgICAgICAgY2FzZSBQTFVTOgorICAgICAgICAgICAgICAgIG5vZGUuc2V0TWVhbmluZyggUFJFRklYX1BMVVMgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBNSU5VUzoKKyAgICAgICAgICAgICAgICBub2RlLnNldE1lYW5pbmcoIFBSRUZJWF9NSU5VUyApOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFBMVVNfUExVUzoKKyAgICAgICAgICAgICAgICBub2RlLnNldE1lYW5pbmcoIFBSRUZJWF9QTFVTX1BMVVMgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBNSU5VU19NSU5VUzoKKyAgICAgICAgICAgICAgICBub2RlLnNldE1lYW5pbmcoIFBSRUZJWF9NSU5VU19NSU5VUyApOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmKCB0aHJvd0lmSW52YWxpZCApIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEdyb292eUJ1Z0Vycm9yKCAiY2Fubm90IGNvbnZlcnQgdG8gcHJlZml4IGZvciB0eXBlIFsiICsgbm9kZS5nZXRNZWFuaW5nKCkgKyAiXSIgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCisKKyAgIC8qKgorICAgICogIENvbnZlcnRzIGEgbm9kZSBmcm9tIGEgZ2VuZXJpYyB0eXBlIHRvIGEgc3BlY2lmaWMgcG9zdGZpeCB0eXBlLgorICAgICogIFRocm93cyBhIDxjb2RlPkdyb292eUJ1Z0Vycm9yPC9jb2RlPiBpZiB0aGUgdHlwZSBjYW4ndCBiZSBjb252ZXJ0ZWQuCisgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWtlUG9zdGZpeCggQ1NUTm9kZSBub2RlLCBib29sZWFuIHRocm93SWZJbnZhbGlkICkgeworCisgICAgICAgIHN3aXRjaCggbm9kZS5nZXRNZWFuaW5nKCkgKSB7CisgICAgICAgICAgICBjYXNlIFBMVVNfUExVUzoKKyAgICAgICAgICAgICAgICBub2RlLnNldE1lYW5pbmcoIFBPU1RGSVhfUExVU19QTFVTICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgTUlOVVNfTUlOVVM6CisgICAgICAgICAgICAgICAgbm9kZS5zZXRNZWFuaW5nKCBQT1NURklYX01JTlVTX01JTlVTICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYoIHRocm93SWZJbnZhbGlkICkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgR3Jvb3Z5QnVnRXJyb3IoICJjYW5ub3QgY29udmVydCB0byBwb3N0Zml4IGZvciB0eXBlIFsiICsgbm9kZS5nZXRNZWFuaW5nKCkgKyAiXSIgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworCisKKworICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBPUEVSQVRPUiBQUkVDRURFTkNFCisKKworICAgLyoqCisgICAgKiAgUmV0dXJucyB0aGUgcHJlY2VuZGVuY2Ugb2YgdGhlIHNwZWNpZmllZCBvcGVyYXRvci4gIE5vbi1vcGVyYXRvcidzIHdpbGwKKyAgICAqICByZWNlaXZlIC0xIG9yIGEgR3Jvb3Z5QnVnRXJyb3IsIGRlcGVuZGluZyBvbiB5b3VyIHByZWZlcmVuY2UuCisgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFByZWNlZGVuY2UoIGludCB0eXBlLCBib29sZWFuIHRocm93SWZJbnZhbGlkICkgeworCisgICAgICAgIHN3aXRjaCggdHlwZSApIHsKKworICAgICAgICAgICAgY2FzZSBMRUZUX1BBUkVOVEhFU0lTOgorICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgICAgICBjYXNlIEVRVUFMOgorICAgICAgICAgICAgY2FzZSBQTFVTX0VRVUFMOgorICAgICAgICAgICAgY2FzZSBNSU5VU19FUVVBTDoKKyAgICAgICAgICAgIGNhc2UgTVVMVElQTFlfRVFVQUw6CisgICAgICAgICAgICBjYXNlIERJVklERV9FUVVBTDoKKyAgICAgICAgICAgIGNhc2UgSU5URElWX0VRVUFMOgorICAgICAgICAgICAgY2FzZSBNT0RfRVFVQUw6CisgICAgICAgICAgICBjYXNlIFBPV0VSX0VRVUFMOgorICAgICAgICAgICAgY2FzZSBMT0dJQ0FMX09SX0VRVUFMOgorICAgICAgICAgICAgY2FzZSBMT0dJQ0FMX0FORF9FUVVBTDoKKyAgICAgICAgICAgIGNhc2UgTEVGVF9TSElGVF9FUVVBTDoKKyAgICAgICAgICAgIGNhc2UgUklHSFRfU0hJRlRfRVFVQUw6CisgICAgICAgICAgICBjYXNlIFJJR0hUX1NISUZUX1VOU0lHTkVEX0VRVUFMOgorICAgICAgICAgICAgY2FzZSBCSVRXSVNFX09SX0VRVUFMOgorICAgICAgICAgICAgY2FzZSBCSVRXSVNFX0FORF9FUVVBTDoKKyAgICAgICAgICAgIGNhc2UgQklUV0lTRV9YT1JfRVFVQUw6CisgICAgICAgICAgICAgICAgcmV0dXJuIDU7CisKKyAgICAgICAgICAgIGNhc2UgUVVFU1RJT046CisgICAgICAgICAgICAgICAgcmV0dXJuIDEwOworCisgICAgICAgICAgICBjYXNlIExPR0lDQUxfT1I6CisgICAgICAgICAgICAgICAgcmV0dXJuIDE1OworCisgICAgICAgICAgICBjYXNlIExPR0lDQUxfQU5EOgorICAgICAgICAgICAgICAgIHJldHVybiAyMDsKKworICAgICAgICAgICAgY2FzZSBCSVRXSVNFX09SOgorCSAgICBjYXNlIEJJVFdJU0VfQU5EOgorICAgICAgICAgICAgY2FzZSBCSVRXSVNFX1hPUjoKKyAgICAgICAgICAgICAgICByZXR1cm4gMjI7CisKKyAgICAgICAgICAgIGNhc2UgQ09NUEFSRV9JREVOVElDQUw6CisgICAgICAgICAgICBjYXNlIENPTVBBUkVfTk9UX0lERU5USUNBTDoKKyAgICAgICAgICAgICAgICByZXR1cm4gMjQ7CisKKyAgICAgICAgICAgIGNhc2UgQ09NUEFSRV9OT1RfRVFVQUw6CisgICAgICAgICAgICBjYXNlIENPTVBBUkVfRVFVQUw6CisgICAgICAgICAgICBjYXNlIENPTVBBUkVfTEVTU19USEFOOgorICAgICAgICAgICAgY2FzZSBDT01QQVJFX0xFU1NfVEhBTl9FUVVBTDoKKyAgICAgICAgICAgIGNhc2UgQ09NUEFSRV9HUkVBVEVSX1RIQU46CisgICAgICAgICAgICBjYXNlIENPTVBBUkVfR1JFQVRFUl9USEFOX0VRVUFMOgorICAgICAgICAgICAgY2FzZSBDT01QQVJFX1RPOgorICAgICAgICAgICAgY2FzZSBGSU5EX1JFR0VYOgorICAgICAgICAgICAgY2FzZSBNQVRDSF9SRUdFWDoKKyAgICAgICAgICAgIGNhc2UgS0VZV09SRF9JTlNUQU5DRU9GOgorICAgICAgICAgICAgICAgIHJldHVybiAyNTsKKworICAgICAgICAgICAgY2FzZSBET1RfRE9UOgorICAgICAgICAgICAgY2FzZSBET1RfRE9UX0RPVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gMzA7CisKKyAgICAgICAgICAgIGNhc2UgTEVGVF9TSElGVDoKKyAgICAgICAgICAgIGNhc2UgUklHSFRfU0hJRlQ6CisgICAgICAgICAgICBjYXNlIFJJR0hUX1NISUZUX1VOU0lHTkVEOgorICAgICAgICAgICAgICAgIHJldHVybiAzNTsKKworICAgICAgICAgICAgY2FzZSBQTFVTOgorICAgICAgICAgICAgY2FzZSBNSU5VUzoKKyAgICAgICAgICAgICAgICByZXR1cm4gNDA7CisKKyAgICAgICAgICAgIGNhc2UgTVVMVElQTFk6CisgICAgICAgICAgICBjYXNlIERJVklERToKKyAgICAgICAgICAgIGNhc2UgSU5URElWOgorICAgICAgICAgICAgY2FzZSBNT0Q6CisgICAgICAgICAgICAgICAgcmV0dXJuIDQ1OworCisgICAgICAgICAgICBjYXNlIE5PVDoKKyAgICAgICAgICAgIGNhc2UgUkVHRVhfUEFUVEVSTjoKKyAgICAgICAgICAgICAgICByZXR1cm4gNTA7CisKKyAgICAgICAgICAgIGNhc2UgU1lOVEhfQ0FTVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gNTU7CisKKyAgICAgICAgICAgIGNhc2UgUExVU19QTFVTOgorICAgICAgICAgICAgY2FzZSBNSU5VU19NSU5VUzoKKyAgICAgICAgICAgIGNhc2UgUFJFRklYX1BMVVNfUExVUzoKKyAgICAgICAgICAgIGNhc2UgUFJFRklYX01JTlVTX01JTlVTOgorICAgICAgICAgICAgY2FzZSBQT1NURklYX1BMVVNfUExVUzoKKyAgICAgICAgICAgIGNhc2UgUE9TVEZJWF9NSU5VU19NSU5VUzoKKyAgICAgICAgICAgICAgICByZXR1cm4gNjU7CisKKyAgICAgICAgICAgIGNhc2UgUFJFRklYX1BMVVM6CisgICAgICAgICAgICBjYXNlIFBSRUZJWF9NSU5VUzoKKyAgICAgICAgICAgICAgICByZXR1cm4gNzA7CisKKyAgICAgICAgICAgIGNhc2UgUE9XRVI6CisgICAgICAgICAgICAgICAgcmV0dXJuIDcyOworCisgICAgICAgICAgICBjYXNlIFNZTlRIX01FVEhPRDoKKyAgICAgICAgICAgIGNhc2UgTEVGVF9TUVVBUkVfQlJBQ0tFVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gNzU7CisKKyAgICAgICAgICAgIGNhc2UgRE9UOgorICAgICAgICAgICAgY2FzZSBOQVZJR0FURToKKyAgICAgICAgICAgICAgICByZXR1cm4gODA7CisKKyAgICAgICAgICAgIGNhc2UgS0VZV09SRF9ORVc6CisgICAgICAgICAgICAgICAgcmV0dXJuIDg1OworICAgICAgICB9CisKKyAgICAgICAgaWYoIHRocm93SWZJbnZhbGlkICkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEdyb292eUJ1Z0Vycm9yKCAicHJlY2VkZW5jZSByZXF1ZXN0ZWQgZm9yIG5vbi1vcGVyYXRvciIgKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKworCisKKyAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gVEVYVFMKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBURVhUUyAgPSBuZXcgSGFzaE1hcCgpOyAgLy8gc3ltYm9sL2tleXdvcmQgdHlwZSAtPiB0ZXh0CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIExPT0tVUCA9IG5ldyBIYXNoTWFwKCk7ICAvLyB0ZXh0IC0+IHN5bWJvbC9rZXl3b3JkIHR5cGUKKworCisgICAvKioKKyAgICAqICBSZXR1cm5zIHRoZSB0eXBlIGZvciB0aGUgc3BlY2lmaWVkIHN5bWJvbC9rZXl3b3JkIHRleHQuICBSZXR1cm5zIFVOS05PV04KKyAgICAqICBpZiB0aGUgdGV4dCBpc24ndCBmb3VuZC4gIFlvdSBjYW4gZmlsdGVyIGZpbmRzIG9uIGEgdHlwZS4KKyAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBpbnQgbG9va3VwKCBTdHJpbmcgdGV4dCwgaW50IGZpbHRlciApIHsKKyAgICAgICAgaW50IHR5cGUgPSBVTktOT1dOOworCisgICAgICAgIGlmKCBMT09LVVAuY29udGFpbnNLZXkodGV4dCkgKSB7CisgICAgICAgICAgICB0eXBlID0gKChJbnRlZ2VyKUxPT0tVUC5nZXQodGV4dCkpLmludFZhbHVlKCk7CisgICAgICAgICAgICBpZiggZmlsdGVyICE9IFVOS05PV04gJiYgIW9mVHlwZSh0eXBlLCBmaWx0ZXIpICkgeworICAgICAgICAgICAgICAgIHR5cGUgPSBVTktOT1dOOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQorCisKKyAgIC8qKgorICAgICogIFJldHVybnMgdGhlIHR5cGUgZm9yIHRoZSBzcGVjaWZpZWQga2V5d29yZCB0ZXh0LiAgUmV0dXJucyBVTktOT1dOCisgICAgKiAgaWYgdGhlIHRleHQgaXNuJ3QgZm91bmQuCisgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgaW50IGxvb2t1cEtleXdvcmQoIFN0cmluZyB0ZXh0ICkgeworICAgICAgICByZXR1cm4gbG9va3VwKCB0ZXh0LCBLRVlXT1JEICk7CisgICAgfQorCisKKyAgIC8qKgorICAgICogIFJldHVybnMgdGhlIHR5cGUgZm9yIHRoZSBzcGVjaWZpZWQgc3ltYm9sIHRleHQuICBSZXR1cm5zIFVOS05PV04KKyAgICAqICBpZiB0aGUgdGV4dCBpc24ndCBmb3VuZC4KKyAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBpbnQgbG9va3VwU3ltYm9sKCBTdHJpbmcgdGV4dCApIHsKKyAgICAgICAgcmV0dXJuIGxvb2t1cCggdGV4dCwgU1lNQk9MICk7CisgICAgfQorCisKKyAgIC8qKgorICAgICogIFJldHVybnMgdGhlIHRleHQgZm9yIHRoZSBzcGVjaWZpZWQgdHlwZS4gIFJldHVybnMgIiIgaWYgdGhlCisgICAgKiAgdGV4dCBpc24ndCBmb3VuZC4KKyAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VGV4dCggaW50IHR5cGUgKSB7CisgICAgICAgIEludGVnZXIga2V5ID0gbmV3IEludGVnZXIoIHR5cGUgKTsKKyAgICAgICAgU3RyaW5nIHRleHQgPSAiIjsKKworICAgICAgICBpZiggVEVYVFMuY29udGFpbnNLZXkoa2V5KSApIHsKKyAgICAgICAgICAgIHRleHQgPSAoU3RyaW5nKVRFWFRTLmdldCgga2V5ICk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdGV4dDsKKyAgICB9CisKKworICAgLyoqCisgICAgKiAgQWRkcyBhIGVsZW1lbnQgdG8gdGhlIFRFWFRTIGFuZCBMT09LVVAuCisgICAgKi8KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkVHJhbnNsYXRpb24oIFN0cmluZyB0ZXh0LCBpbnQgdHlwZSApIHsKKyAgICAgICAgSW50ZWdlciBrZXkgPSBuZXcgSW50ZWdlciggdHlwZSApOworCisgICAgICAgIFRFWFRTLnB1dCgga2V5LCB0ZXh0ICk7CisgICAgICAgIExPT0tVUC5wdXQoIHRleHQsIGtleSApOworICAgIH0KKworCisgICAgc3RhdGljIHsKKworICAgICAgICAvLworICAgICAgICAvLyBTWU1CT0xTCisKKyAgICAgICAgYWRkVHJhbnNsYXRpb24oICJcbiIgICAgICAgICAgLCBORVdMSU5FICAgICAgICAgICAgICAgICAgICAgKTsKKworICAgICAgICBhZGRUcmFuc2xhdGlvbiggInsiICAgICAgICAgICAsIExFRlRfQ1VSTFlfQlJBQ0UgICAgICAgICAgICApOworICAgICAgICBhZGRUcmFuc2xhdGlvbiggIn0iICAgICAgICAgICAsIFJJR0hUX0NVUkxZX0JSQUNFICAgICAgICAgICApOworICAgICAgICBhZGRUcmFuc2xhdGlvbiggIlsiICAgICAgICAgICAsIExFRlRfU1FVQVJFX0JSQUNLRVQgICAgICAgICApOworICAgICAgICBhZGRUcmFuc2xhdGlvbiggIl0iICAgICAgICAgICAsIFJJR0hUX1NRVUFSRV9CUkFDS0VUICAgICAgICApOworICAgICAgICBhZGRUcmFuc2xhdGlvbiggIigiICAgICAgICAgICAsIExFRlRfUEFSRU5USEVTSVMgICAgICAgICAgICApOworICAgICAgICBhZGRUcmFuc2xhdGlvbiggIikiICAgICAgICAgICAsIFJJR0hUX1BBUkVOVEhFU0lTICAgICAgICAgICApOworCisgICAgICAgIGFkZFRyYW5zbGF0aW9uKCAiLiIgICAgICAgICAgICwgRE9UICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIGFkZFRyYW5zbGF0aW9uKCAiLi4iICAgICAgICAgICwgRE9UX0RPVCAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIGFkZFRyYW5zbGF0aW9uKCAiLi4uIiAgICAgICAgICwgRE9UX0RPVF9ET1QgICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgYWRkVHJhbnNsYXRpb24oICItPiIgICAgICAgICAgLCBOQVZJR0FURSAgICAgICAgICAgICAgICAgICAgKTsKKworICAgICAgICBhZGRUcmFuc2xhdGlvbiggIj1+IiAgICAgICAgICAsIEZJTkRfUkVHRVggICAgICAgICAgICAgICAgICApOworICAgICAgICBhZGRUcmFuc2xhdGlvbiggIj09fiIgICAgICAgICAsIE1BVENIX1JFR0VYICAgICAgICAgICAgICAgICApOworICAgICAgICBhZGRUcmFuc2xhdGlvbiggIn4iICAgICAgICAgICAsIFJFR0VYX1BBVFRFUk4gICAgICAgICAgICAgICApOworCisgICAgICAgIGFkZFRyYW5zbGF0aW9uKCAiPSIgICAgICAgICAgICwgRVFVQUwgICAgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgYWRkVHJhbnNsYXRpb24oICIhPSIgICAgICAgICAgLCBDT01QQVJFX05PVF9FUVVBTCAgICAgICAgICAgKTsKKyAgICAgICAgYWRkVHJhbnNsYXRpb24oICI9PT0iICAgICAgICAgLCBDT01QQVJFX0lERU5USUNBTCAgICAgICAgICAgKTsKKyAgICAgICAgYWRkVHJhbnNsYXRpb24oICIhPT0iICAgICAgICAgLCBDT01QQVJFX05PVF9JREVOVElDQUwgICAgICAgKTsKKyAgICAgICAgYWRkVHJhbnNsYXRpb24oICI9PSIgICAgICAgICAgLCBDT01QQVJFX0VRVUFMICAgICAgICAgICAgICAgKTsKKyAgICAgICAgYWRkVHJhbnNsYXRpb24oICI8IiAgICAgICAgICAgLCBDT01QQVJFX0xFU1NfVEhBTiAgICAgICAgICAgKTsKKyAgICAgICAgYWRkVHJhbnNsYXRpb24oICI8PSIgICAgICAgICAgLCBDT01QQVJFX0xFU1NfVEhBTl9FUVVBTCAgICAgKTsKKyAgICAgICAgYWRkVHJhbnNsYXRpb24oICI+IiAgICAgICAgICAgLCBDT01QQVJFX0dSRUFURVJfVEhBTiAgICAgICAgKTsKKyAgICAgICAgYWRkVHJhbnNsYXRpb24oICI+PSIgICAgICAgICAgLCBDT01QQVJFX0dSRUFURVJfVEhBTl9FUVVBTCAgKTsKKyAgICAgICAgYWRkVHJhbnNsYXRpb24oICI8PT4iICAgICAgICAgLCBDT01QQVJFX1RPICAgICAgICAgICAgICAgICAgKTsKKworICAgICAgICBhZGRUcmFuc2xhdGlvbiggIiEiICAgICAgICAgICAsIE5PVCAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICBhZGRUcmFuc2xhdGlvbiggInx8IiAgICAgICAgICAsIExPR0lDQUxfT1IgICAgICAgICAgICAgICAgICApOworICAgICAgICBhZGRUcmFuc2xhdGlvbiggIiYmIiAgICAgICAgICAsIExPR0lDQUxfQU5EICAgICAgICAgICAgICAgICApOworCisgICAgICAgIGFkZFRyYW5zbGF0aW9uKCAifHw9IiAgICAgICAgICwgTE9HSUNBTF9PUl9FUVVBTCAgICAgICAgICAgICk7CisgICAgICAgIGFkZFRyYW5zbGF0aW9uKCAiJiY9IiAgICAgICAgICwgTE9HSUNBTF9BTkRfRVFVQUwgICAgICAgICAgICk7CisKKyAgICAgICAgYWRkVHJhbnNsYXRpb24oICIrIiAgICAgICAgICAgLCBQTFVTICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgYWRkVHJhbnNsYXRpb24oICItIiAgICAgICAgICAgLCBNSU5VUyAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgYWRkVHJhbnNsYXRpb24oICIqIiAgICAgICAgICAgLCBNVUxUSVBMWSAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgYWRkVHJhbnNsYXRpb24oICIvIiAgICAgICAgICAgLCBESVZJREUgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgYWRkVHJhbnNsYXRpb24oICJcXCIgICAgICAgICAgLCBJTlRESVYgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgYWRkVHJhbnNsYXRpb24oICIlIiAgICAgICAgICAgLCBNT0QgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworCWFkZFRyYW5zbGF0aW9uKCAiKioiICAgICAgICAgICwgUE9XRVIgICAgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgYWRkVHJhbnNsYXRpb24oICIrPSIgICAgICAgICAgLCBQTFVTX0VRVUFMICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgYWRkVHJhbnNsYXRpb24oICItPSIgICAgICAgICAgLCBNSU5VU19FUVVBTCAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgYWRkVHJhbnNsYXRpb24oICIqPSIgICAgICAgICAgLCBNVUxUSVBMWV9FUVVBTCAgICAgICAgICAgICAgKTsKKyAgICAgICAgYWRkVHJhbnNsYXRpb24oICIvPSIgICAgICAgICAgLCBESVZJREVfRVFVQUwgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgYWRkVHJhbnNsYXRpb24oICJcXD0iICAgICAgICAgLCBJTlRESVZfRVFVQUwgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgYWRkVHJhbnNsYXRpb24oICIlPSIgICAgICAgICAgLCBNT0RfRVFVQUwgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgYWRkVHJhbnNsYXRpb24oICIqKj0iICAgICAgICAgLCBQT1dFUl9FUVVBTCAgICAgICAgICAgICAgICAgKTsKKworICAgICAgICBhZGRUcmFuc2xhdGlvbiggIisrIiAgICAgICAgICAsIFBMVVNfUExVUyAgICAgICAgICAgICAgICAgICApOworICAgICAgICBhZGRUcmFuc2xhdGlvbiggIi0tIiAgICAgICAgICAsIE1JTlVTX01JTlVTICAgICAgICAgICAgICAgICApOworCisgICAgICAgIGFkZFRyYW5zbGF0aW9uKCAiPDwiICAgICAgICAgICwgTEVGVF9TSElGVCAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIGFkZFRyYW5zbGF0aW9uKCAiPj4iICAgICAgICAgICwgUklHSFRfU0hJRlQgICAgICAgICAgICAgICAgICk7CisgICAgICAgIGFkZFRyYW5zbGF0aW9uKCAiPj4+IiAgICAgICAgICwgUklHSFRfU0hJRlRfVU5TSUdORUQgICAgICAgICk7CisKKyAgICAgICAgYWRkVHJhbnNsYXRpb24oICI8PD0iICAgICAgICAgLCBMRUZUX1NISUZUX0VRVUFMICAgICAgICAgICAgKTsKKyAgICAgICAgYWRkVHJhbnNsYXRpb24oICI+Pj0iICAgICAgICAgLCBSSUdIVF9TSElGVF9FUVVBTCAgICAgICAgICAgKTsKKyAgICAgICAgYWRkVHJhbnNsYXRpb24oICI+Pj49IiAgICAgICAgLCBSSUdIVF9TSElGVF9VTlNJR05FRF9FUVVBTCAgKTsKKworICAgICAgICBhZGRUcmFuc2xhdGlvbiggIiYiICAgICAgICAgICAsIEJJVFdJU0VfQU5EICAgICAgICAgICAgICAgICApOworICAgICAgICBhZGRUcmFuc2xhdGlvbiggIl4iICAgICAgICAgICAsIEJJVFdJU0VfWE9SICAgICAgICAgICAgICAgICApOworCisgICAgICAgIGFkZFRyYW5zbGF0aW9uKCAifD0iICAgICAgICAgICwgQklUV0lTRV9PUl9FUVVBTCAgICAgICAgICAgKTsKKyAgICAgICAgYWRkVHJhbnNsYXRpb24oICImPSIgICAgICAgICAgLCBCSVRXSVNFX0FORF9FUVVBTCAgICAgICAgICAgKTsKKyAgICAgICAgYWRkVHJhbnNsYXRpb24oICJePSIgICAgICAgICAgLCBCSVRXSVNFX1hPUl9FUVVBTCAgICAgICAgICAgKTsKKworICAgICAgICBhZGRUcmFuc2xhdGlvbiggIiwiICAgICAgICAgICAsIENPTU1BICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICBhZGRUcmFuc2xhdGlvbiggIjoiICAgICAgICAgICAsIENPTE9OICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICBhZGRUcmFuc2xhdGlvbiggIjsiICAgICAgICAgICAsIFNFTUlDT0xPTiAgICAgICAgICAgICAgICAgICApOworICAgICAgICBhZGRUcmFuc2xhdGlvbiggIj8iICAgICAgICAgICAsIFFVRVNUSU9OICAgICAgICAgICAgICAgICAgICApOworICAgICAgICBhZGRUcmFuc2xhdGlvbiggInwiICAgICAgICAgICAsIFBJUEUgICAgICAgICAgICAgICAgICAgICAgICApOworCisgICAgICAgIGFkZFRyYW5zbGF0aW9uKCAiJHt9IiAgICAgICAgICwgR1NUUklOR19FWFBSRVNTSU9OX1NUQVJUICAgICk7CisKKworICAgICAgICAvLworICAgICAgICAvLyBLZXl3b3JkcworCisgICAgICAgIGFkZFRyYW5zbGF0aW9uKCAiYWJzdHJhY3QiICAgICwgS0VZV09SRF9BQlNUUkFDVCAgICAgICAgICAgICk7CisgICAgICAgIGFkZFRyYW5zbGF0aW9uKCAiYXMiICAgICAgICAgICwgS0VZV09SRF9BUyAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIGFkZFRyYW5zbGF0aW9uKCAiYXNzZXJ0IiAgICAgICwgS0VZV09SRF9BU1NFUlQgICAgICAgICAgICAgICk7CisgICAgICAgIGFkZFRyYW5zbGF0aW9uKCAiYnJlYWsiICAgICAgICwgS0VZV09SRF9CUkVBSyAgICAgICAgICAgICAgICk7CisgICAgICAgIGFkZFRyYW5zbGF0aW9uKCAiY2FzZSIgICAgICAgICwgS0VZV09SRF9DQVNFICAgICAgICAgICAgICAgICk7CisgICAgICAgIGFkZFRyYW5zbGF0aW9uKCAiY2F0Y2giICAgICAgICwgS0VZV09SRF9DQVRDSCAgICAgICAgICAgICAgICk7CisgICAgICAgIGFkZFRyYW5zbGF0aW9uKCAiY2xhc3MiICAgICAgICwgS0VZV09SRF9DTEFTUyAgICAgICAgICAgICAgICk7CisgICAgICAgIGFkZFRyYW5zbGF0aW9uKCAiY29uc3QiICAgICAgICwgS0VZV09SRF9DT05TVCAgICAgICAgICAgICAgICk7CisgICAgICAgIGFkZFRyYW5zbGF0aW9uKCAiY29udGludWUiICAgICwgS0VZV09SRF9DT05USU5VRSAgICAgICAgICAgICk7CisgICAgICAgIGFkZFRyYW5zbGF0aW9uKCAiZGVmIiAgICAgICAgICwgS0VZV09SRF9ERUYgICAgICAgICAgICAgICAgICk7CisgICAgICAgIGFkZFRyYW5zbGF0aW9uKCAiZGVmbWFjcm8iICAgICwgS0VZV09SRF9ERUYgICAgICAgICAgICAgICAgICk7IC8vIHh4eCBiciBkZWZtYWNybworICAgICAgICBhZGRUcmFuc2xhdGlvbiggImRlZmF1bHQiICAgICAsIEtFWVdPUkRfREVGQVVMVCAgICAgICAgICAgICApOworICAgICAgICBhZGRUcmFuc2xhdGlvbiggImRvIiAgICAgICAgICAsIEtFWVdPUkRfRE8gICAgICAgICAgICAgICAgICApOworICAgICAgICBhZGRUcmFuc2xhdGlvbiggImVsc2UiICAgICAgICAsIEtFWVdPUkRfRUxTRSAgICAgICAgICAgICAgICApOworICAgICAgICBhZGRUcmFuc2xhdGlvbiggImV4dGVuZHMiICAgICAsIEtFWVdPUkRfRVhURU5EUyAgICAgICAgICAgICApOworICAgICAgICBhZGRUcmFuc2xhdGlvbiggImZpbmFsIiAgICAgICAsIEtFWVdPUkRfRklOQUwgICAgICAgICAgICAgICApOworICAgICAgICBhZGRUcmFuc2xhdGlvbiggImZpbmFsbHkiICAgICAsIEtFWVdPUkRfRklOQUxMWSAgICAgICAgICAgICApOworICAgICAgICBhZGRUcmFuc2xhdGlvbiggImZvciIgICAgICAgICAsIEtFWVdPUkRfRk9SICAgICAgICAgICAgICAgICApOworICAgICAgICBhZGRUcmFuc2xhdGlvbiggImdvdG8iICAgICAgICAsIEtFWVdPUkRfR09UTyAgICAgICAgICAgICAgICApOworICAgICAgICBhZGRUcmFuc2xhdGlvbiggImlmIiAgICAgICAgICAsIEtFWVdPUkRfSUYgICAgICAgICAgICAgICAgICApOworICAgICAgICBhZGRUcmFuc2xhdGlvbiggImluIiAgICAgICAgICAsIEtFWVdPUkRfSU4gICAgICAgICAgICAgICAgICApOworICAgICAgICBhZGRUcmFuc2xhdGlvbiggImltcGxlbWVudHMiICAsIEtFWVdPUkRfSU1QTEVNRU5UUyAgICAgICAgICApOworICAgICAgICBhZGRUcmFuc2xhdGlvbiggImltcG9ydCIgICAgICAsIEtFWVdPUkRfSU1QT1JUICAgICAgICAgICAgICApOworICAgICAgICBhZGRUcmFuc2xhdGlvbiggImluc3RhbmNlb2YiICAsIEtFWVdPUkRfSU5TVEFOQ0VPRiAgICAgICAgICApOworICAgICAgICBhZGRUcmFuc2xhdGlvbiggImludGVyZmFjZSIgICAsIEtFWVdPUkRfSU5URVJGQUNFICAgICAgICAgICApOworICAgICAgICBhZGRUcmFuc2xhdGlvbiggIm1peGluIiAgICAgICAsIEtFWVdPUkRfTUlYSU4gICAgICAgICAgICAgICApOworICAgICAgICBhZGRUcmFuc2xhdGlvbiggIm5hdGl2ZSIgICAgICAsIEtFWVdPUkRfTkFUSVZFICAgICAgICAgICAgICApOworICAgICAgICBhZGRUcmFuc2xhdGlvbiggIm5ldyIgICAgICAgICAsIEtFWVdPUkRfTkVXICAgICAgICAgICAgICAgICApOworICAgICAgICBhZGRUcmFuc2xhdGlvbiggInBhY2thZ2UiICAgICAsIEtFWVdPUkRfUEFDS0FHRSAgICAgICAgICAgICApOworICAgICAgICBhZGRUcmFuc2xhdGlvbiggInByaXZhdGUiICAgICAsIEtFWVdPUkRfUFJJVkFURSAgICAgICAgICAgICApOworICAgICAgICBhZGRUcmFuc2xhdGlvbiggInByb3BlcnR5IiAgICAsIEtFWVdPUkRfUFJPUEVSVFkgICAgICAgICAgICApOworICAgICAgICBhZGRUcmFuc2xhdGlvbiggInByb3RlY3RlZCIgICAsIEtFWVdPUkRfUFJPVEVDVEVEICAgICAgICAgICApOworICAgICAgICBhZGRUcmFuc2xhdGlvbiggInB1YmxpYyIgICAgICAsIEtFWVdPUkRfUFVCTElDICAgICAgICAgICAgICApOworICAgICAgICBhZGRUcmFuc2xhdGlvbiggInJldHVybiIgICAgICAsIEtFWVdPUkRfUkVUVVJOICAgICAgICAgICAgICApOworICAgICAgICBhZGRUcmFuc2xhdGlvbiggInN0YXRpYyIgICAgICAsIEtFWVdPUkRfU1RBVElDICAgICAgICAgICAgICApOworICAgICAgICBhZGRUcmFuc2xhdGlvbiggInN1cGVyIiAgICAgICAsIEtFWVdPUkRfU1VQRVIgICAgICAgICAgICAgICApOworICAgICAgICBhZGRUcmFuc2xhdGlvbiggInN3aXRjaCIgICAgICAsIEtFWVdPUkRfU1dJVENIICAgICAgICAgICAgICApOworICAgICAgICBhZGRUcmFuc2xhdGlvbiggInN5bmNocm9uaXplZCIsIEtFWVdPUkRfU1lOQ0hST05JWkVEICAgICAgICApOworICAgICAgICBhZGRUcmFuc2xhdGlvbiggInRoaXMiICAgICAgICAsIEtFWVdPUkRfVEhJUyAgICAgICAgICAgICAgICApOworICAgICAgICBhZGRUcmFuc2xhdGlvbiggInRocm93IiAgICAgICAsIEtFWVdPUkRfVEhST1cgICAgICAgICAgICAgICApOworICAgICAgICBhZGRUcmFuc2xhdGlvbiggInRocm93cyIgICAgICAsIEtFWVdPUkRfVEhST1dTICAgICAgICAgICAgICApOworICAgICAgICBhZGRUcmFuc2xhdGlvbiggInRyYW5zaWVudCIgICAsIEtFWVdPUkRfVFJBTlNJRU5UICAgICAgICAgICApOworICAgICAgICBhZGRUcmFuc2xhdGlvbiggInRyeSIgICAgICAgICAsIEtFWVdPUkRfVFJZICAgICAgICAgICAgICAgICApOworICAgICAgICBhZGRUcmFuc2xhdGlvbiggInZvbGF0aWxlIiAgICAsIEtFWVdPUkRfVk9MQVRJTEUgICAgICAgICAgICApOworICAgICAgICBhZGRUcmFuc2xhdGlvbiggIndoaWxlIiAgICAgICAsIEtFWVdPUkRfV0hJTEUgICAgICAgICAgICAgICApOworCisgICAgICAgIGFkZFRyYW5zbGF0aW9uKCAidHJ1ZSIgICAgICAgICwgS0VZV09SRF9UUlVFICAgICAgICAgICAgICAgICk7CisgICAgICAgIGFkZFRyYW5zbGF0aW9uKCAiZmFsc2UiICAgICAgICwgS0VZV09SRF9GQUxTRSAgICAgICAgICAgICAgICk7CisgICAgICAgIGFkZFRyYW5zbGF0aW9uKCAibnVsbCIgICAgICAgICwgS0VZV09SRF9OVUxMICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgYWRkVHJhbnNsYXRpb24oICJ2b2lkIiAgICAgICAgLCBLRVlXT1JEX1ZPSUQgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgYWRkVHJhbnNsYXRpb24oICJib29sZWFuIiAgICAgLCBLRVlXT1JEX0JPT0xFQU4gICAgICAgICAgICAgKTsKKyAgICAgICAgYWRkVHJhbnNsYXRpb24oICJieXRlIiAgICAgICAgLCBLRVlXT1JEX0JZVEUgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgYWRkVHJhbnNsYXRpb24oICJpbnQiICAgICAgICAgLCBLRVlXT1JEX0lOVCAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgYWRkVHJhbnNsYXRpb24oICJzaG9ydCIgICAgICAgLCBLRVlXT1JEX1NIT1JUICAgICAgICAgICAgICAgKTsKKyAgICAgICAgYWRkVHJhbnNsYXRpb24oICJsb25nIiAgICAgICAgLCBLRVlXT1JEX0xPTkcgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgYWRkVHJhbnNsYXRpb24oICJmbG9hdCIgICAgICAgLCBLRVlXT1JEX0ZMT0FUICAgICAgICAgICAgICAgKTsKKyAgICAgICAgYWRkVHJhbnNsYXRpb24oICJkb3VibGUiICAgICAgLCBLRVlXT1JEX0RPVUJMRSAgICAgICAgICAgICAgKTsKKyAgICAgICAgYWRkVHJhbnNsYXRpb24oICJjaGFyIiAgICAgICAgLCBLRVlXT1JEX0NIQVIgICAgICAgICAgICAgICAgKTsKKyAgICB9CisKKworCisKKyAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gREVTQ1JJUFRJT05TCisKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBERVNDUklQVElPTlMgPSBuZXcgSGFzaE1hcCgpOworCisKKyAgIC8qKgorICAgICogIEdldHMgdGhlIGRlc2NyaXB0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHR5cGUuCisgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCBpbnQgdHlwZSApIHsKKyAgICAgICAgSW50ZWdlciB0eXBlS2V5ID0gbmV3IEludGVnZXIodHlwZSk7CisKKyAgICAgICAgaWYgKERFU0NSSVBUSU9OUy5jb250YWluc0tleSh0eXBlS2V5KSkgeworICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpREVTQ1JJUFRJT05TLmdldCh0eXBlS2V5KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAiPD4iOworICAgIH0KKworCisgICAvKioKKyAgICAqICBBZGRzIGEgZGVzY3JpcHRpb24gdG8gdGhlIHNldC4KKyAgICAqLworCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGREZXNjcmlwdGlvbihpbnQgdHlwZSwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisgICAgICAgIGFkZERlc2NyaXB0aW9uKG5ldyBJbnRlZ2VyKHR5cGUpLCBkZXNjcmlwdGlvbik7CisgICAgfQorCisKKyAgIC8qKgorICAgICogIEFkZHMgYSBkZXNjcmlwdGlvbiB0byB0aGUgc2V0LgorICAgICovCisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZERlc2NyaXB0aW9uKEludGVnZXIgdHlwZSwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisgICAgICAgIGlmIChkZXNjcmlwdGlvbi5zdGFydHNXaXRoKCI8IikgJiYgZGVzY3JpcHRpb24uZW5kc1dpdGgoIj4iKSkgeworICAgICAgICAgICAgREVTQ1JJUFRJT05TLnB1dCh0eXBlLCBkZXNjcmlwdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBERVNDUklQVElPTlMucHV0KHR5cGUsICciJyArIGRlc2NyaXB0aW9uICsgJyInKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgc3RhdGljIHsKKworICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IExPT0tVUC5rZXlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSggaXRlcmF0b3IuaGFzTmV4dCgpICkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIHRleHQgPSAoU3RyaW5nKWl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgIEludGVnZXIga2V5ID0gKEludGVnZXIpTE9PS1VQLmdldCh0ZXh0KTsKKworICAgICAgICAgICAgYWRkRGVzY3JpcHRpb24oIGtleSwgdGV4dCApOworICAgICAgICB9CisKKyAgICAgICAgYWRkRGVzY3JpcHRpb24oIE5FV0xJTkUgICAgICAgICAgICAgICAgICAgICAsICI8bmV3bGluZT4iICAgICAgICApOworICAgICAgICBhZGREZXNjcmlwdGlvbiggUFJFRklYX1BMVVNfUExVUyAgICAgICAgICAgICwgIjxwcmVmaXggKys+IiAgICAgICk7CisgICAgICAgIGFkZERlc2NyaXB0aW9uKCBQT1NURklYX1BMVVNfUExVUyAgICAgICAgICAgLCAiPHBvc3RmaXggKys+IiAgICAgKTsKKyAgICAgICAgYWRkRGVzY3JpcHRpb24oIFBSRUZJWF9NSU5VU19NSU5VUyAgICAgICAgICAsICI8cHJlZml4IC0tPiIgICAgICApOworICAgICAgICBhZGREZXNjcmlwdGlvbiggUE9TVEZJWF9NSU5VU19NSU5VUyAgICAgICAgICwgIjxwb3N0Zml4IC0tPiIgICAgICk7CisgICAgICAgIGFkZERlc2NyaXB0aW9uKCBQUkVGSVhfUExVUyAgICAgICAgICAgICAgICAgLCAiPHBvc2l0aXZlPiIgICAgICAgKTsKKyAgICAgICAgYWRkRGVzY3JpcHRpb24oIFBSRUZJWF9NSU5VUyAgICAgICAgICAgICAgICAsICI8bmVnYXRpdmU+IiAgICAgICApOworCisgICAgICAgIGFkZERlc2NyaXB0aW9uKCBTVFJJTkcgICAgICAgICAgICAgICAgICAgICAgLCAiPHN0cmluZyBsaXRlcmFsPiIgKTsKKyAgICAgICAgYWRkRGVzY3JpcHRpb24oIElERU5USUZJRVIgICAgICAgICAgICAgICAgICAsICI8aWRlbnRpZmllcj4iICAgICApOworICAgICAgICBhZGREZXNjcmlwdGlvbiggSU5URUdFUl9OVU1CRVIgICAgICAgICAgICAgICwgIjxpbnRlZ2VyPiIgICAgICAgICk7CisgICAgICAgIGFkZERlc2NyaXB0aW9uKCBERUNJTUFMX05VTUJFUiAgICAgICAgICAgICAgLCAiPGRlY2ltYWw+IiAgICAgICAgKTsKKworICAgICAgICBhZGREZXNjcmlwdGlvbiggU1lOVEhfQ09NUElMQVRJT05fVU5JVCAgICAgICwgIjxjb21waWxhdGlvbiB1bml0PiIgKTsKKyAgICAgICAgYWRkRGVzY3JpcHRpb24oIFNZTlRIX0NMQVNTICAgICAgICAgICAgICAgICAsICI8Y2xhc3M+IiAgICAgICAgICApOworICAgICAgICBhZGREZXNjcmlwdGlvbiggU1lOVEhfSU5URVJGQUNFICAgICAgICAgICAgICwgIjxpbnRlcmZhY2U+IiAgICAgICk7CisgICAgICAgIGFkZERlc2NyaXB0aW9uKCBTWU5USF9NSVhJTiAgICAgICAgICAgICAgICAgLCAiPG1peGluPiIgICAgICAgICAgKTsKKyAgICAgICAgYWRkRGVzY3JpcHRpb24oIFNZTlRIX01FVEhPRCAgICAgICAgICAgICAgICAsICI8bWV0aG9kPiIgICAgICAgICApOworICAgICAgICBhZGREZXNjcmlwdGlvbiggU1lOVEhfTUVUSE9EX0NBTEwgICAgICAgICAgICwgIjxtZXRob2QgY2FsbD4iICAgICk7CisgICAgICAgIGFkZERlc2NyaXB0aW9uKCBTWU5USF9QUk9QRVJUWSAgICAgICAgICAgICAgLCAiPHByb3BlcnR5PiIgICAgICAgKTsKKyAgICAgICAgYWRkRGVzY3JpcHRpb24oIFNZTlRIX1BBUkFNRVRFUl9ERUNMQVJBVElPTiAsICI8cGFyYW1ldGVyPiIgICAgICApOworICAgICAgICBhZGREZXNjcmlwdGlvbiggU1lOVEhfTElTVCAgICAgICAgICAgICAgICAgICwgIjxsaXN0PiIgICAgICAgICAgICk7CisgICAgICAgIGFkZERlc2NyaXB0aW9uKCBTWU5USF9NQVAgICAgICAgICAgICAgICAgICAgLCAiPG1hcD4iICAgICAgICAgICAgKTsKKyAgICAgICAgYWRkRGVzY3JpcHRpb24oIFNZTlRIX1RVUExFICAgICAgICAgICAgICAgICAsICI8dHVwbGU+IiAgICAgICAgICApOworICAgICAgICBhZGREZXNjcmlwdGlvbiggU1lOVEhfR1NUUklORyAgICAgICAgICAgICAgICwgIjxnc3RyaW5nPiIgICAgICAgICk7CisgICAgICAgIGFkZERlc2NyaXB0aW9uKCBTWU5USF9DQVNUICAgICAgICAgICAgICAgICAgLCAiPGNhc3Q+IiAgICAgICAgICAgKTsKKyAgICAgICAgYWRkRGVzY3JpcHRpb24oIFNZTlRIX0JMT0NLICAgICAgICAgICAgICAgICAsICI8YmxvY2s+IiAgICAgICAgICApOworICAgICAgICBhZGREZXNjcmlwdGlvbiggU1lOVEhfQ0xPU1VSRSAgICAgICAgICAgICAgICwgIjxjbG9zdXJlPiIgICAgICAgICk7CisgICAgICAgIGFkZERlc2NyaXB0aW9uKCBTWU5USF9URVJOQVJZICAgICAgICAgICAgICAgLCAiPHRlcm5hcnk+IiAgICAgICAgKTsKKyAgICAgICAgYWRkRGVzY3JpcHRpb24oIFNZTlRIX0xBQkVMICAgICAgICAgICAgICAgICAsICI8bGFiZWw+IiAgICAgICAgICApOworICAgICAgICBhZGREZXNjcmlwdGlvbiggU1lOVEhfVkFSSUFCTEVfREVDTEFSQVRJT04gICwgIjx2YXJpYWJsZSBkZWNsYXJhdGlvbj4iICAgICAgICk7CisKKyAgICAgICAgYWRkRGVzY3JpcHRpb24oIEdTVFJJTkdfU1RBUlQgICAgICAgICAgICAgICAsICI8c3RhcnQgb2YgZ3N0cmluZyB0b2tlbnM+IiAgICApOworICAgICAgICBhZGREZXNjcmlwdGlvbiggR1NUUklOR19FTkQgICAgICAgICAgICAgICAgICwgIjxlbmQgb2YgZ3N0cmluZyB0b2tlbnM+IiAgICAgICk7CisgICAgICAgIGFkZERlc2NyaXB0aW9uKCBHU1RSSU5HX0VYUFJFU1NJT05fU1RBUlQgICAgLCAiPHN0YXJ0IG9mIGdzdHJpbmcgZXhwcmVzc2lvbj4iKTsKKyAgICAgICAgYWRkRGVzY3JpcHRpb24oIEdTVFJJTkdfRVhQUkVTU0lPTl9FTkQgICAgICAsICI8ZW5kIG9mIGdzdHJpbmcgZXhwcmVzc2lvbj4iICApOworCisgICAgICAgIGFkZERlc2NyaXB0aW9uKCBBU1NJR05NRU5UX09QRVJBVE9SICAgICAgICAgLCAiPGFzc2lnbm1lbnQgb3BlcmF0b3I+IiAgICAgICAgKTsKKyAgICAgICAgYWRkRGVzY3JpcHRpb24oIENPTVBBUklTT05fT1BFUkFUT1IgICAgICAgICAsICI8Y29tcGFyaXNvbiBvcGVyYXRvcj4iICAgICAgICApOworICAgICAgICBhZGREZXNjcmlwdGlvbiggTUFUSF9PUEVSQVRPUiAgICAgICAgICAgICAgICwgIjxtYXRoIG9wZXJhdG9yPiIgICAgICAgICAgICAgICk7CisgICAgICAgIGFkZERlc2NyaXB0aW9uKCBMT0dJQ0FMX09QRVJBVE9SICAgICAgICAgICAgLCAiPGxvZ2ljYWwgb3BlcmF0b3I+IiAgICAgICAgICAgKTsKKyAgICAgICAgYWRkRGVzY3JpcHRpb24oIEJJVFdJU0VfT1BFUkFUT1IgICAgICAgICAgICAsICI8Yml0d2lzZSBvcGVyYXRvcj4iICAgICAgICAgICApOworICAgICAgICBhZGREZXNjcmlwdGlvbiggUkFOR0VfT1BFUkFUT1IgICAgICAgICAgICAgICwgIjxyYW5nZSBvcGVyYXRvcj4iICAgICAgICAgICAgICk7CisgICAgICAgIGFkZERlc2NyaXB0aW9uKCBSRUdFWF9DT01QQVJJU09OX09QRVJBVE9SICAgLCAiPHJlZ2V4IGNvbXBhcmlzb24gb3BlcmF0b3I+IiAgKTsKKyAgICAgICAgYWRkRGVzY3JpcHRpb24oIERFUkVGRVJFTkNFX09QRVJBVE9SICAgICAgICAsICI8ZGVyZWZlcmVuY2Ugb3BlcmF0b3I+IiAgICAgICApOworICAgICAgICBhZGREZXNjcmlwdGlvbiggUFJFRklYX09QRVJBVE9SICAgICAgICAgICAgICwgIjxwcmVmaXggb3BlcmF0b3I+IiAgICAgICAgICAgICk7CisgICAgICAgIGFkZERlc2NyaXB0aW9uKCBQT1NURklYX09QRVJBVE9SICAgICAgICAgICAgLCAiPHBvc3RmaXggb3BlcmF0b3I+IiAgICAgICAgICAgKTsKKyAgICAgICAgYWRkRGVzY3JpcHRpb24oIElORklYX09QRVJBVE9SICAgICAgICAgICAgICAsICI8aW5maXggb3BlcmF0b3I+IiAgICAgICAgICAgICApOworICAgICAgICBhZGREZXNjcmlwdGlvbiggS0VZV09SRCAgICAgICAgICAgICAgICAgICAgICwgIjxrZXl3b3JkPiIgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIGFkZERlc2NyaXB0aW9uKCBMSVRFUkFMICAgICAgICAgICAgICAgICAgICAgLCAiPGxpdGVyYWw+IiAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgYWRkRGVzY3JpcHRpb24oIE5VTUJFUiAgICAgICAgICAgICAgICAgICAgICAsICI8bnVtYmVyPiIgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICBhZGREZXNjcmlwdGlvbiggTkFNRURfVkFMVUUgICAgICAgICAgICAgICAgICwgIjxuYW1lZCB2YWx1ZT4iICAgICAgICAgICAgICAgICk7CisgICAgICAgIGFkZERlc2NyaXB0aW9uKCBUUlVUSF9WQUxVRSAgICAgICAgICAgICAgICAgLCAiPHRydXRoIHZhbHVlPiIgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgYWRkRGVzY3JpcHRpb24oIFBSSU1JVElWRV9UWVBFICAgICAgICAgICAgICAsICI8cHJpbWl0aXZlIHR5cGU+IiAgICAgICAgICAgICApOworICAgICAgICBhZGREZXNjcmlwdGlvbiggQ1JFQVRBQkxFX1BSSU1JVElWRV9UWVBFICAgICwgIjxjcmVhdGFibGUgcHJpbWl0aXZlIHR5cGU+IiAgICk7CisgICAgICAgIGFkZERlc2NyaXB0aW9uKCBMT09QICAgICAgICAgICAgICAgICAgICAgICAgLCAiPGxvb3A+IiAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgYWRkRGVzY3JpcHRpb24oIFJFU0VSVkVEX0tFWVdPUkQgICAgICAgICAgICAsICI8cmVzZXJ2ZWQga2V5d29yZD4iICAgICAgICAgICApOworICAgICAgICBhZGREZXNjcmlwdGlvbiggU1lOVEhFVElDICAgICAgICAgICAgICAgICAgICwgIjxzeW50aGV0aWM+IiAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIGFkZERlc2NyaXB0aW9uKCBUWVBFX0RFQ0xBUkFUSU9OICAgICAgICAgICAgLCAiPHR5cGUgZGVjbGFyYXRpb24+IiAgICAgICAgICAgKTsKKyAgICAgICAgYWRkRGVzY3JpcHRpb24oIERFQ0xBUkFUSU9OX01PRElGSUVSICAgICAgICAsICI8ZGVjbGFyYXRpb24gbW9kaWZpZXI+IiAgICAgICApOworICAgICAgICBhZGREZXNjcmlwdGlvbiggVFlQRV9OQU1FICAgICAgICAgICAgICAgICAgICwgIjx0eXBlIG5hbWU+IiAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIGFkZERlc2NyaXB0aW9uKCBDUkVBVEFCTEVfVFlQRV9OQU1FICAgICAgICAgLCAiPGNyZWF0YWJsZSB0eXBlIG5hbWU+IiAgICAgICAgKTsKKyAgICAgICAgYWRkRGVzY3JpcHRpb24oIE1BVENIRURfQ09OVEFJTkVSICAgICAgICAgICAsICI8bWF0Y2hlZCBjb250YWluZXI+IiAgICAgICAgICApOworICAgICAgICBhZGREZXNjcmlwdGlvbiggTEVGVF9PRl9NQVRDSEVEX0NPTlRBSU5FUiAgICwgIjxsZWZ0IG9mIG1hdGNoZWQgY29udGFpbmVyPiIgICk7CisgICAgICAgIGFkZERlc2NyaXB0aW9uKCBSSUdIVF9PRl9NQVRDSEVEX0NPTlRBSU5FUiAgLCAiPHJpZ2h0IG9mIG1hdGNoZWQgY29udGFpbmVyPiIgKTsKKyAgICAgICAgYWRkRGVzY3JpcHRpb24oIFNXSVRDSF9FTlRSSUVTICAgICAgICAgICAgICAsICI8dmFsaWQgaW4gYSBzd2l0Y2ggYm9keT4iICAgICApOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L3BhY2thZ2UuaHRtbCBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDViNzA0MgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSw4IEBACis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPHRpdGxlPnBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXguKjwvdGl0bGU+CisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgPHA+TGV4ZXIsIHBhcnNlciBhbmQgdHJlZXMuPC9wPgorICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9Db21waWxlci5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvQ29tcGlsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2EzMTkxCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvQ29tcGlsZXIuamF2YQpAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLkNvbXBpbGF0aW9uVW5pdDsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuQ29tcGlsZXJDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5Tb3VyY2VVbml0OworCisvKioKKyAqICBBIGNvbnZlbmllbmNlIGZyb250IGVuZCBmb3IgZ2V0dGluZyBzdGFuZGFyZCBjb21waWxhdGlvbnMgZG9uZS4KKyAqICBBbGwgY29tcGlsZSgpIHJvdXRpbmVzIGdlbmVyYXRlIGNsYXNzZXMgdG8gdGhlIGZpbGVzeXN0ZW0uCisgKgorICogIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNwb2lyaWVyQGRyZWFtaW5nLm9yZyI+Q2hyaXMgUG9pcmllcjwvYT4KKyAqCisgKiAgQHZlcnNpb24gJElkJAorICovCisKK3B1YmxpYyBjbGFzcyBDb21waWxlciB7CisgICAgLy8gVE9ETzogZGVsZXRlIHRoaXMgY29uc3RhbnQ/CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21waWxlciBERUZBVUxUID0gbmV3IENvbXBpbGVyKCk7CisgICAgCisgICAgcHJpdmF0ZSBDb21waWxlckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IG51bGw7ICAvLyBPcHRpb25hbCBjb25maWd1cmF0aW9uIGRhdGEKKyAgICAKKyAgIC8qKgorICAgICogIEluaXRpYWxpemVzIHRoZSBDb21waWxlciB3aXRoIGRlZmF1bHQgY29uZmlndXJhdGlvbi4KKyAgICAqLworICAgIAorICAgIHB1YmxpYyBDb21waWxlcigpCisgICAgeworICAgICAgICBjb25maWd1cmF0aW9uID0gbnVsbDsKKyAgICB9CisgICAgCisgICAgCisgICAvKioKKyAgICAqICBJbml0aWFsaXplcyB0aGUgQ29tcGlsZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGNvbmZpZ3VyYXRpb24uCisgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgQ29tcGlsZXIoIENvbXBpbGVyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uICkKKyAgICB7CisgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247CisgICAgfQorCisgICAgCisgICAKKyAgIC8qKgorICAgICogIENvbXBpbGVzIGEgc2luZ2xlIEZpbGUuCisgICAgKi8KKyAgIAorICAgIHB1YmxpYyB2b2lkIGNvbXBpbGUoIEZpbGUgZmlsZSApIHRocm93cyBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgQ29tcGlsYXRpb25Vbml0IHVuaXQgPSBuZXcgQ29tcGlsYXRpb25Vbml0KCBjb25maWd1cmF0aW9uICk7CisgICAgICAgIHVuaXQuYWRkU291cmNlKCBmaWxlICk7CisgICAgICAgIHVuaXQuY29tcGlsZSgpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAKKyAgIC8qKgorICAgICogIENvbXBpbGVzIGEgc2VyaWVzIG9mIEZpbGVzLgorICAgICovCisgICAgCisgICAgcHVibGljIHZvaWQgY29tcGlsZSggRmlsZVtdIGZpbGVzICkgdGhyb3dzIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uCisgICAgeworICAgICAgICBDb21waWxhdGlvblVuaXQgdW5pdCA9IG5ldyBDb21waWxhdGlvblVuaXQoIGNvbmZpZ3VyYXRpb24gKTsKKyAgICAgICAgdW5pdC5hZGRTb3VyY2VzKCBmaWxlcyApOworICAgICAgICB1bml0LmNvbXBpbGUoKTsKKyAgICB9CisKKyAgICAKKyAgICAKKyAgIC8qKgorICAgICogIENvbXBpbGVzIGEgc2VyaWVzIG9mIEZpbGVzIGZyb20gZmlsZSBuYW1lcy4KKyAgICAqLworICAgIAorICAgIHB1YmxpYyB2b2lkIGNvbXBpbGUoIFN0cmluZ1tdIGZpbGVzICkgdGhyb3dzIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uCisgICAgeworICAgICAgICBDb21waWxhdGlvblVuaXQgdW5pdCA9IG5ldyBDb21waWxhdGlvblVuaXQoIGNvbmZpZ3VyYXRpb24gKTsKKyAgICAgICAgdW5pdC5hZGRTb3VyY2VzKCBmaWxlcyApOworICAgICAgICB1bml0LmNvbXBpbGUoKTsKKyAgICB9CisKKyAgICAKKyAgICAKKyAgIC8qKgorICAgICogIENvbXBpbGVzIGEgc3RyaW5nIG9mIGNvZGUuCisgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBjb21waWxlKCBTdHJpbmcgbmFtZSwgU3RyaW5nIGNvZGUgKSB0aHJvd3MgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIENvbXBpbGF0aW9uVW5pdCB1bml0ID0gbmV3IENvbXBpbGF0aW9uVW5pdCggY29uZmlndXJhdGlvbiApOworICAgICAgICB1bml0LmFkZFNvdXJjZSggbmV3IFNvdXJjZVVuaXQobmFtZSwgY29kZSwgY29uZmlndXJhdGlvbiwgdW5pdC5nZXRDbGFzc0xvYWRlcigpLCB1bml0LmdldEVycm9yQ29sbGVjdG9yKCkpICk7CisgICAgICAgIHVuaXQuY29tcGlsZSgpOworICAgIH0KKworfQorCisKKworCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9FcnJvclJlcG9ydGVyLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9FcnJvclJlcG9ydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTlkNDRkYgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL0Vycm9yUmVwb3J0ZXIuamF2YQpAQCAtMCwwICsxLDIzNCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzOworCitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5Hcm9vdnlFeGNlcHRpb25JbnRlcmZhY2U7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLkNvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uOworaW1wb3J0IGdyb292eS5sYW5nLkdyb292eVJ1bnRpbWVFeGNlcHRpb247CisKKworLyoqCisgKiAgUHJvdmlkZXMgc2VydmljZXMgZm9yIHJlcG9ydGluZyBjb21waWxhdGlvbiBlcnJvcnMgdG8gdGhlCisgKiAgdXNlci4gIFByaW1hcnkgZW50cnkgcG9pbnQgaXMgPGNvZGU+d3JpdGUoKTwvY29kZT4uCisgKgorICogIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmNwb2lyaWVyJTIwQVQlMjB0YXBlc3RyeV9vcyUyMERPVCUyMG9yZyI+Q2hyaXMgUG9pcmllcjwvYT4KKyAqICBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KKworcHVibGljIGNsYXNzIEVycm9yUmVwb3J0ZXIKK3sKKyAgICBwcml2YXRlIFRocm93YWJsZSAgIGJhc2UgICAgID0gbnVsbDsgICAgLy8gVGhlIGV4Y2VwdGlvbiBvbiB3aGljaCB0byByZXBvcnQKKyAgICBwcml2YXRlIGJvb2xlYW4gICAgIGRlYnVnICAgID0gZmFsc2U7ICAgLy8gSWYgdHJ1ZSwgc3RhY2sgdHJhY2VzIGFyZSBhbHdheXMgb3V0cHV0CisKKyAgICBwcml2YXRlIE9iamVjdCAgICAgIG91dHB1dCAgID0gbnVsbDsgICAgLy8gVGhlIHN0cmVhbS93cml0ZXIgdG8gd2hpY2ggdG8gb3V0cHV0CisKKworICAgLyoqCisgICAgKiAgQ29uZmlndXJlcyBhIG5ldyBSZXBvcnRlci4gIERlZmF1bHQgbW9kZSBpcyBub3QgdG8gcmVwb3J0IGEgc3RhY2sgdHJhY2UgdW5sZXNzCisgICAgKiAgdGhlIGVycm9yIHdhcyBub3Qgb2Ygb25lIG9mIHRoZSBzdXBwb3J0ZWQgdHlwZXMuCisgICAgKgorICAgICogIEBwYXJhbSBlICB0aGUgZXhjZXB0aW9uIG9uIHdoaWNoIHRvIHJlcG9ydAorICAgICovCisKKyAgICBwdWJsaWMgRXJyb3JSZXBvcnRlciggVGhyb3dhYmxlIGUgKQorICAgIHsKKyAgICAgICAgdGhpcy5iYXNlICAgICA9IGU7CisgICAgfQorCisKKyAgIC8qKgorICAgICogIENvbmZpZ3VyZXMgYSBuZXcgUmVwb3J0ZXIuICAKKyAgICAqCisgICAgKiAgQHBhcmFtIGUgICAgICB0aGUgZXhjZXB0aW9uIG9uIHdoaWNoIHRvIHJlcG9ydAorICAgICogIEBwYXJhbSBkZWJ1ZyAgaWYgc2V0LCBzdGFjayB0cmFjZXMgd2lsbCBiZSBvdXRwdXQgZm9yIGFsbCByZXBvcnRzCisgICAgKi8KKworICAgIHB1YmxpYyBFcnJvclJlcG9ydGVyKCBUaHJvd2FibGUgZSwgYm9vbGVhbiBkZWJ1ZyApCisgICAgeworICAgICAgICB0aGlzLmJhc2UgID0gZTsKKyAgICAgICAgdGhpcy5kZWJ1ZyA9IGRlYnVnOworICAgIH0KKworCisgICAvKioKKyAgICAqICBXcml0ZXMgdGhlIGVycm9yIHRvIHRoZSBzcGVjaWZpZWQgPGNvZGU+UHJpbnRTdHJlYW08L2NvZGU+LgorICAgICovCisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZSggUHJpbnRTdHJlYW0gc3RyZWFtICkKKyAgICB7CisgICAgICAgIHRoaXMub3V0cHV0ID0gc3RyZWFtOworICAgICAgICBkaXNwYXRjaCggYmFzZSwgZmFsc2UgKTsKKyAgICAgICAgc3RyZWFtLmZsdXNoKCk7CisgICAgfQorCisKKyAgIC8qKgorICAgICogIFdyaXRlcyB0aGUgZXJyb3IgdG8gdGhlIHNwZWNpZmllZCA8Y29kZT5QcmludFdyaXRlcjwvY29kZT4uCisgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlKCBQcmludFdyaXRlciB3cml0ZXIgKQorICAgIHsKKyAgICAgICAgdGhpcy5vdXRwdXQgPSB3cml0ZXI7CisgICAgICAgIGRpc3BhdGNoKCBiYXNlLCBmYWxzZSApOworICAgICAgICB3cml0ZXIuZmx1c2goKTsKKyAgICB9CisKKworICAgLyoqCisgICAgKiAgUnVucyB0aGUgcmVwb3J0IG9uY2UgYWxsIGluaXRpYWxpemF0aW9uIGlzIGNvbXBsZXRlLgorICAgICovCisKKyAgICBwcm90ZWN0ZWQgdm9pZCBkaXNwYXRjaCggVGhyb3dhYmxlIG9iamVjdCwgYm9vbGVhbiBjaGlsZCApCisgICAgeworICAgICAgICBpZiggb2JqZWN0IGluc3RhbmNlb2YgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24gKQorICAgICAgICB7CisgICAgICAgICAgICByZXBvcnQoIChDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbilvYmplY3QsIGNoaWxkICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiggb2JqZWN0IGluc3RhbmNlb2YgR3Jvb3Z5RXhjZXB0aW9uSW50ZXJmYWNlICkKKyAgICAgICAgeworICAgICAgICAgICAgcmVwb3J0KCAoR3Jvb3Z5RXhjZXB0aW9uSW50ZXJmYWNlKW9iamVjdCwgY2hpbGQgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCBvYmplY3QgaW5zdGFuY2VvZiBHcm9vdnlSdW50aW1lRXhjZXB0aW9uICkKKyAgICAgICAgeworICAgICAgICAgICAgcmVwb3J0KCAoR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbilvYmplY3QsIGNoaWxkICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiggb2JqZWN0IGluc3RhbmNlb2YgRXhjZXB0aW9uICkKKyAgICAgICAgeworICAgICAgICAgICAgcmVwb3J0KCAoRXhjZXB0aW9uKW9iamVjdCwgY2hpbGQgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlcG9ydCggb2JqZWN0LCBjaGlsZCApOworICAgICAgICB9CisKKyAgICB9CisKKworCisgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIFJFUE9SVElORyBST1VUSU5FUworCisKKyAgIC8qKgorICAgICogIEZvciBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbi4KKyAgICAqLworCisgICAgcHJvdGVjdGVkIHZvaWQgcmVwb3J0KCBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbiBlLCBib29sZWFuIGNoaWxkICkKKyAgICB7CisgICAgICAgIHByaW50bG4oIGUudG9TdHJpbmcoKSApOworICAgICAgICBzdGFja3RyYWNlKCBlLCBmYWxzZSApOworICAgIH0KKworCisKKyAgIC8qKgorICAgICogIEZvciBHcm9vdnlFeGNlcHRpb24uCisgICAgKi8KKworICAgIHByb3RlY3RlZCB2b2lkIHJlcG9ydCggR3Jvb3Z5RXhjZXB0aW9uSW50ZXJmYWNlIGUsIGJvb2xlYW4gY2hpbGQgKQorICAgIHsKKyAgICAgICAgcHJpbnRsbiggKChFeGNlcHRpb24pZSkuZ2V0TWVzc2FnZSgpICk7CisgICAgICAgIHN0YWNrdHJhY2UoIChFeGNlcHRpb24pZSwgZmFsc2UgKTsKKyAgICB9CisKKworCisgICAvKioKKyAgICAqICBGb3IgRXhjZXB0aW9uLgorICAgICovCisKKyAgICBwcm90ZWN0ZWQgdm9pZCByZXBvcnQoIEV4Y2VwdGlvbiBlLCBib29sZWFuIGNoaWxkICkKKyAgICB7CisgICAgICAgIHByaW50bG4oIGUuZ2V0TWVzc2FnZSgpICk7CisgICAgICAgIHN0YWNrdHJhY2UoIGUsIGZhbHNlICk7CisgICAgfQorCisKKworICAgLyoqCisgICAgKiAgRm9yIGV2ZXJ5dGhpbmcgZWxzZS4KKyAgICAqLworCisgICAgcHJvdGVjdGVkIHZvaWQgcmVwb3J0KCBUaHJvd2FibGUgZSwgYm9vbGVhbiBjaGlsZCApCisgICAgeworICAgICAgICBwcmludGxuKCAiPj4+IGEgc2VyaW91cyBlcnJvciBvY2N1cnJlZDogIiArIGUuZ2V0TWVzc2FnZSgpICk7CisgICAgICAgIHN0YWNrdHJhY2UoIGUsIHRydWUgKTsKKyAgICB9CisKKworCisgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIEdFTkVSQUwgU1VQUE9SVCBST1VUSU5FUworCisKKyAgIC8qKgorICAgICogIFByaW50cyBhIGxpbmUgdG8gdGhlIHVuZGVybHlpbmcgPGNvZGU+UHJpbnRTdHJlYW08L2NvZGU+CisgICAgKi8KKworICAgIHByb3RlY3RlZCB2b2lkIHByaW50bG4oIFN0cmluZyBsaW5lICkKKyAgICB7CisgICAgICAgIGlmKCBvdXRwdXQgaW5zdGFuY2VvZiBQcmludFN0cmVhbSApCisgICAgICAgIHsKKyAgICAgICAgICAgICgoUHJpbnRTdHJlYW0pb3V0cHV0KS5wcmludGxuKCBsaW5lICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAoKFByaW50V3JpdGVyKW91dHB1dCkucHJpbnRsbiggbGluZSApOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgcHJpbnRsbiggU3RyaW5nQnVmZmVyIGxpbmUgKQorICAgIHsKKyAgICAgICAgaWYoIG91dHB1dCBpbnN0YW5jZW9mIFByaW50U3RyZWFtICkKKyAgICAgICAgeworICAgICAgICAgICAgKChQcmludFN0cmVhbSlvdXRwdXQpLnByaW50bG4oIGxpbmUgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICgoUHJpbnRXcml0ZXIpb3V0cHV0KS5wcmludGxuKCBsaW5lICk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgLyoqCisgICAgKiAgRGlzcGxheXMgYW4gZXhjZXB0aW9uJ3Mgc3RhY2sgdHJhY2UsIGlmIDxjb2RlPmRlYnVnPC9jb2RlPiBvciAKKyAgICAqICA8Y29kZT5hbHdheXM8L2NvZGU+LgorICAgICovCisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzdGFja3RyYWNlKCBUaHJvd2FibGUgZSwgYm9vbGVhbiBhbHdheXMgKQorICAgIHsKKyAgICAgICAgaWYoIGRlYnVnIHx8IGFsd2F5cyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50bG4oICI+Pj4gc3RhY2t0cmFjZToiICk7CisgICAgICAgICAgICBpZiggb3V0cHV0IGluc3RhbmNlb2YgUHJpbnRTdHJlYW0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCAoUHJpbnRTdHJlYW0pb3V0cHV0ICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoIChQcmludFdyaXRlcilvdXRwdXQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL0ZpbGVTeXN0ZW1Db21waWxlci5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvRmlsZVN5c3RlbUNvbXBpbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY1ZjE2YgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL0ZpbGVTeXN0ZW1Db21waWxlci5qYXZhCkBAIC0wLDAgKzEsMjM1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jbGkuQ29tbWFuZExpbmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNsaS5IZWxwRm9ybWF0dGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jbGkuT3B0aW9uQnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY2xpLk9wdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNsaS5Qb3NpeFBhcnNlcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5Db21waWxlckNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5qYXZhYy5KYXZhQXdhcmVDb21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLkludm9rZXJIZWxwZXI7CisKKy8qKgorICogQ29tbWFuZC1saW5lIGNvbXBpbGVyIChha2EuIDx0dD5ncm9vdnljPC90dD4pLgorICogCisgKiBAdmVyc2lvbiAkSWQkCisgKi8KK3B1YmxpYyBjbGFzcyBGaWxlU3lzdGVtQ29tcGlsZXIKK3sKKyAgICBwcml2YXRlIGZpbmFsIENvbXBpbGF0aW9uVW5pdCB1bml0OworCisgICAgcHVibGljIEZpbGVTeXN0ZW1Db21waWxlciggQ29tcGlsZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24uZ2V0Sm9pbnRDb21waWxhdGlvbk9wdGlvbnMoKSE9bnVsbCkgeworICAgICAgICAgICAgdGhpcy51bml0ID0gbmV3IEphdmFBd2FyZUNvbXBpbGF0aW9uVW5pdChjb25maWd1cmF0aW9uKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRoaXMudW5pdCA9IG5ldyBDb21waWxhdGlvblVuaXQoY29uZmlndXJhdGlvbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAKKyAgICBwdWJsaWMgdm9pZCBjb21waWxlKCBTdHJpbmdbXSBwYXRocyApIHRocm93cyBFeGNlcHRpb24gCisgICAgeworICAgICAgICB1bml0LmFkZFNvdXJjZXMoIHBhdGhzICk7CisgICAgICAgIHVuaXQuY29tcGlsZSggKTsKKyAgICB9CisKKyAgICAKKyAgICBwdWJsaWMgdm9pZCBjb21waWxlKCBGaWxlW10gZmlsZXMgKSB0aHJvd3MgRXhjZXB0aW9uIAorICAgIHsKKyAgICAgICAgdW5pdC5hZGRTb3VyY2VzKCBmaWxlcyApOworICAgICAgICB1bml0LmNvbXBpbGUoICk7CisgICAgfQorCisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGlzcGxheUhlbHAoZmluYWwgT3B0aW9ucyBvcHRpb25zKQorICAgIHsKKyAgICAgICAgZmluYWwgSGVscEZvcm1hdHRlciBmb3JtYXR0ZXIgPSBuZXcgSGVscEZvcm1hdHRlciAoICkgOworICAgICAgICBmb3JtYXR0ZXIucHJpbnRIZWxwICggODAgLCAiZ3Jvb3Z5YyBbb3B0aW9uc10gPHNvdXJjZS1maWxlcz4iICwgIm9wdGlvbnM6Iiwgb3B0aW9ucyAsICIiICkgOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkaXNwbGF5VmVyc2lvbigpIAorICAgIHsKKyAgICAgICAgU3RyaW5nIHZlcnNpb24gPSBJbnZva2VySGVscGVyLmdldFZlcnNpb24oKTsKKyAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJHcm9vdnkgY29tcGlsZXIgdmVyc2lvbiAiICsgdmVyc2lvbik7CisgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQ29weXJpZ2h0IDIwMDMtMjAwNyBUaGUgQ29kZWhhdXMuIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLyIpOworICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIiIpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgaW50IGNoZWNrRmlsZXMoIFN0cmluZ1tdIGZpbGVuYW1lcyApIAorICAgIHsKKyAgICAgICAgaW50IGVycm9ycyA9IDA7CisKKyAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IGZpbGVuYW1lcy5sZW5ndGg7ICsraSApIAorICAgICAgICB7CisgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZSggZmlsZW5hbWVzW2ldICk7CisKKyAgICAgICAgICAgIGlmKCAhZmlsZS5leGlzdHMoKSApIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggImVycm9yOiBmaWxlIG5vdCBmb3VuZDogIiArIGZpbGUgKTsKKyAgICAgICAgICAgICAgICArK2Vycm9yczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoICFmaWxlLmNhblJlYWQoKSApIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggImVycm9yOiBmaWxlIG5vdCByZWFkYWJsZTogIiArIGZpbGUgKTsKKyAgICAgICAgICAgICAgICArK2Vycm9yczsKKyAgICAgICAgICAgIH0gCisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZXJyb3JzOworICAgIH0KKworICAgIAorICAgIAorICAgLyoqCisgICAgKiAgUHJpbWFyeSBlbnRyeSBwb2ludCBmb3IgY29tcGlsaW5nIGZyb20gdGhlIGNvbW1hbmQgbGluZQorICAgICogICh1c2luZyB0aGUgZ3Jvb3Z5YyBzY3JpcHQpLgorICAgICovCisgICAgCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKQorICAgIHsKKyAgICAgICAgYm9vbGVhbiBkaXNwbGF5U3RhY2tUcmFjZU9uRXJyb3IgPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBqb2ludENvbXBpbGF0aW9uOworICAgICAgICAKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBQYXJzZSB0aGUgY29tbWFuZCBsaW5lCisgICAgICAgICAgICAKKyAgICAgICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7CisgICAgCisgICAgICAgICAgICBvcHRpb25zLmFkZE9wdGlvbihPcHRpb25CdWlsZGVyLndpdGhMb25nT3B0KCJjbGFzc3BhdGgiKS5oYXNBcmcoKS53aXRoQXJnTmFtZSgicGF0aCIpLndpdGhEZXNjcmlwdGlvbigiU3BlY2lmeSB3aGVyZSB0byBmaW5kIHRoZSBjbGFzcyBmaWxlcy4iKS5jcmVhdGUoKSk7CisgICAgICAgICAgICBvcHRpb25zLmFkZE9wdGlvbihPcHRpb25CdWlsZGVyLndpdGhMb25nT3B0KCJzb3VyY2VwYXRoIikuaGFzQXJnKCkud2l0aEFyZ05hbWUoInBhdGgiKS53aXRoRGVzY3JpcHRpb24oIlNwZWNpZnkgd2hlcmUgdG8gZmluZCB0aGUgc291cmNlIGZpbGVzLiIpLmNyZWF0ZSgpKTsKKyAgICAgICAgICAgIG9wdGlvbnMuYWRkT3B0aW9uKE9wdGlvbkJ1aWxkZXIud2l0aExvbmdPcHQoInRlbXAiKS5oYXNBcmcoKS53aXRoQXJnTmFtZSgidGVtcCIpLndpdGhEZXNjcmlwdGlvbigiIikuY3JlYXRlKCkpOworICAgICAgICAgICAgb3B0aW9ucy5hZGRPcHRpb24oT3B0aW9uQnVpbGRlci53aXRoTG9uZ09wdCgiZW5jb2RpbmciKS5oYXNBcmcoKS53aXRoQXJnTmFtZSgiZW5jb2RpbmciKS53aXRoRGVzY3JpcHRpb24oIlNwZWNpZnkgdGhlIGVuY29kaW5nIG9mIHRoZSB1c2VyIGNsYXNzIGZpbGVzLiIpLmNyZWF0ZSgpKTsKKyAgICAgICAgICAgIG9wdGlvbnMuYWRkT3B0aW9uKE9wdGlvbkJ1aWxkZXIuaGFzQXJnKCkud2l0aERlc2NyaXB0aW9uKCJTcGVjaWZ5IHdoZXJlIHRvIHBsYWNlIGdlbmVyYXRlZCBjbGFzcyBmaWxlcy4iKS5jcmVhdGUoJ2QnKSk7CisvLyAgICAgICAgICAgIG9wdGlvbnMuYWRkT3B0aW9uKE9wdGlvbkJ1aWxkZXIud2l0aExvbmdPcHQoInN0cmljdCIpLndpdGhEZXNjcmlwdGlvbigiVHVybiBvbiBzdHJpY3QgdHlwZSBzYWZldHkuIikuY3JlYXRlKCdzJykpOworICAgICAgICAgICAgb3B0aW9ucy5hZGRPcHRpb24oT3B0aW9uQnVpbGRlci53aXRoTG9uZ09wdCgiaGVscCIpLndpdGhEZXNjcmlwdGlvbigiUHJpbnQgYSBzeW5vcHNpcyBvZiBzdGFuZGFyZCBvcHRpb25zLiIpLmNyZWF0ZSgnaCcpKTsKKyAgICAgICAgICAgIG9wdGlvbnMuYWRkT3B0aW9uKE9wdGlvbkJ1aWxkZXIud2l0aExvbmdPcHQoInZlcnNpb24iKS53aXRoRGVzY3JpcHRpb24oIlByaW50IHRoZSB2ZXJzaW9uLiIpLmNyZWF0ZSgndicpKTsKKyAgICAgICAgICAgIG9wdGlvbnMuYWRkT3B0aW9uKE9wdGlvbkJ1aWxkZXIud2l0aExvbmdPcHQoImV4Y2VwdGlvbiIpLndpdGhEZXNjcmlwdGlvbigiUHJpbnQgc3RhY2sgdHJhY2Ugb24gZXJyb3IuIikuY3JlYXRlKCdlJykpOworICAgICAgICAgICAgb3B0aW9ucy5hZGRPcHRpb24oT3B0aW9uQnVpbGRlci53aXRoTG9uZ09wdCgiam9pbnRDb21waWxhdGlvbiIpLndpdGhEZXNjcmlwdGlvbigiQXR0YWNoIGphdmFjIGNvbXBpbGVyIHRvIGNvbXBpbGUgLmphdmEgZmlsZXMuIikuY3JlYXRlKCdqJykpOworICAgIAorICAgICAgICAgICAgb3B0aW9ucy5hZGRPcHRpb24oCisgICAgICAgICAgICAgICAgICAgIE9wdGlvbkJ1aWxkZXIud2l0aEFyZ05hbWUoICJwcm9wZXJ0eT12YWx1ZSIgKQorICAgICAgICAgICAgICAgICAgICAud2l0aFZhbHVlU2VwYXJhdG9yKCkKKyAgICAgICAgICAgICAgICAgICAgLmhhc0FyZ3MoMikKKyAgICAgICAgICAgICAgICAgICAgLndpdGhEZXNjcmlwdGlvbigiIikKKyAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZSggIkoiICkpOworICAgICAgICAgICAgb3B0aW9ucy5hZGRPcHRpb24oCisgICAgICAgICAgICAgICAgICAgIE9wdGlvbkJ1aWxkZXIud2l0aEFyZ05hbWUoICJmbGFnIiApCisgICAgICAgICAgICAgICAgICAgIC5oYXNBcmcoKQorICAgICAgICAgICAgICAgICAgICAud2l0aERlc2NyaXB0aW9uKCIiKQorICAgICAgICAgICAgICAgICAgICAuY3JlYXRlKCAiRiIgKSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFBvc2l4UGFyc2VyIGNsaVBhcnNlciA9IG5ldyBQb3NpeFBhcnNlcigpOworICAgIAorICAgICAgICAgICAgQ29tbWFuZExpbmUgY2xpID0gY2xpUGFyc2VyLnBhcnNlKG9wdGlvbnMsIGFyZ3MpOworICAgIAorICAgICAgICAgICAgaWYoIGNsaS5oYXNPcHRpb24oJ2gnKSApIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRpc3BsYXlIZWxwKG9wdGlvbnMpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAKKyAgICAgICAgICAgIGlmKCBjbGkuaGFzT3B0aW9uKCd2JykgKSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkaXNwbGF5VmVyc2lvbigpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFNldHVwIHRoZSBjb25maWd1cmF0aW9uIGRhdGEKKyAgICAgICAgICAgIAorICAgICAgICAgICAgQ29tcGlsZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBuZXcgQ29tcGlsZXJDb25maWd1cmF0aW9uKCk7CisgICAgCisgICAgICAgICAgICBpZiggY2xpLmhhc09wdGlvbigiY2xhc3NwYXRoIikgKSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLnNldENsYXNzcGF0aCggY2xpLmdldE9wdGlvblZhbHVlKCJjbGFzc3BhdGgiKSApOworICAgICAgICAgICAgfQorICAgIAorICAgICAgICAgICAgaWYoIGNsaS5oYXNPcHRpb24oJ2QnKSApIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0VGFyZ2V0RGlyZWN0b3J5KCBjbGkuZ2V0T3B0aW9uVmFsdWUoJ2QnKSApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY2xpLmhhc09wdGlvbigiZW5jb2RpbmciKSkgeworICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0U291cmNlRW5jb2RpbmcoY2xpLmdldE9wdGlvblZhbHVlKCJlbmNvZGluZyIpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGlzcGxheVN0YWNrVHJhY2VPbkVycm9yID0gY2xpLmhhc09wdGlvbignZScpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBqb2ludCBjb21waWxhdGlvbiBwYXJhbWV0ZXJzCisgICAgICAgICAgICBqb2ludENvbXBpbGF0aW9uID0gY2xpLmhhc09wdGlvbignaicpOworICAgICAgICAgICAgaWYgKGpvaW50Q29tcGlsYXRpb24pIHsKKyAgICAgICAgICAgICAgICBNYXAgY29tcGlsZXJPcHRpb25zID0gIG5ldyBIYXNoTWFwKCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgU3RyaW5nW10gb3B0cyA9IGNsaS5nZXRPcHRpb25WYWx1ZXMoIkoiKTsKKyAgICAgICAgICAgICAgICBjb21waWxlck9wdGlvbnMucHV0KCJuYW1lZFZhbHVlcyIsIG9wdHMpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIG9wdHMgPSBjbGkuZ2V0T3B0aW9uVmFsdWVzKCJGIik7CisgICAgICAgICAgICAgICAgY29tcGlsZXJPcHRpb25zLnB1dCgiZmxhZ3MiLCBvcHRzKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLnNldEpvaW50Q29tcGlsYXRpb25PcHRpb25zKGNvbXBpbGVyT3B0aW9ucyk7CisgICAgICAgICAgICB9ICAgICAgICAgICAgCisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBMb2FkIHRoZSBmaWxlIG5hbWUgbGlzdAorICAgICAgICAgICAgCisgICAgICAgICAgICBTdHJpbmdbXSBmaWxlbmFtZXMgPSBjbGkuZ2V0QXJncygpOworICAgICAgICAgICAgaWYoIGZpbGVuYW1lcy5sZW5ndGggPT0gMCApIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRpc3BsYXlIZWxwKG9wdGlvbnMpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAKKyAgICAgICAgICAgIGludCBlcnJvcnMgPSBjaGVja0ZpbGVzKCBmaWxlbmFtZXMgKTsKKyAgICAKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBDcmVhdGUgYW5kIHN0YXJ0IHRoZSBjb21waWxlcgorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiggZXJyb3JzID09IDAgKSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoam9pbnRDb21waWxhdGlvbikgeworICAgICAgICAgICAgICAgICAgICBGaWxlIHRtcERpciA9IGNyZWF0ZVRlbXBEaXIoKTsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbi5nZXRKb2ludENvbXBpbGF0aW9uT3B0aW9ucygpLnB1dCgic3R1YkRpciIsdG1wRGlyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRmlsZVN5c3RlbUNvbXBpbGVyIGNvbXBpbGVyID0gbmV3IEZpbGVTeXN0ZW1Db21waWxlcihjb25maWd1cmF0aW9uKTsKKyAgICAgICAgICAgICAgICBjb21waWxlci5jb21waWxlKCBmaWxlbmFtZXMgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYXRjaCggVGhyb3dhYmxlIGUgKSAKKyAgICAgICAgeworICAgICAgICAgICAgbmV3IEVycm9yUmVwb3J0ZXIoIGUsIGRpc3BsYXlTdGFja1RyYWNlT25FcnJvciApLndyaXRlKCBTeXN0ZW0uZXJyICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBGaWxlIGNyZWF0ZVRlbXBEaXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBGaWxlIHRlbXBGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiZ2VuZXJhdGVkLSIsICJqYXZhLXNvdXJjZSIpOworICAgICAgICB0ZW1wRmlsZS5kZWxldGUoKTsKKyAgICAgICAgdGVtcEZpbGUubWtkaXJzKCk7CisgICAgICAgIHJldHVybiB0ZW1wRmlsZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9Hcm9vdnlDbGFzcy5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvR3Jvb3Z5Q2xhc3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWJjOTg3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvR3Jvb3Z5Q2xhc3MuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzOworCitwdWJsaWMgY2xhc3MgR3Jvb3Z5Q2xhc3MKK3sKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEdyb292eUNsYXNzW10gRU1QVFlfQVJSQVkgPSBuZXcgR3Jvb3Z5Q2xhc3NbIDAgXTsKKworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisgICAgcHJpdmF0ZSBieXRlW10gYnl0ZXM7CisKKyAgICBwdWJsaWMgR3Jvb3Z5Q2xhc3MoU3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBieXRlcykKKyAgICB7CisgICAgICAgIHRoaXMubmFtZSAgPSBuYW1lOworICAgICAgICB0aGlzLmJ5dGVzID0gYnl0ZXM7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLm5hbWU7CisgICAgfQorCisgICAgcHVibGljIGJ5dGVbXSBnZXRCeXRlcygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5ieXRlczsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL0dyb292eVN0YXJ0ZXIuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL0dyb292eVN0YXJ0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWU5NzRiCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvR3Jvb3Z5U3RhcnRlci5qYXZhCkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS50b29sczsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0IC4qOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworCisKKworLyoqCisgKiBIZWxwZXIgY2xhc3MgdG8gaGVscCBjbGFzc3dvcmxkcyB0byBsb2FkIGNsYXNzZXMuIAorICovCitwdWJsaWMgY2xhc3MgR3Jvb3Z5U3RhcnRlciB7CisKKyAgICBzdGF0aWMgdm9pZCBwcmludFVzYWdlKCkgeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInBvc3NpYmxlIHByb2dyYW1zIGFyZSAnZ3Jvb3Z5YycsJ2dyb292eScsJ2NvbnNvbGUnLCBhbmQgJ2dyb292eXNoJyIpOworICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICB9CisgICAgCisgICAgCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHJvb3RMb2FkZXIoU3RyaW5nIGFyZ3NbXSkgeworICAgICAgICBTdHJpbmcgY29uZiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiZ3Jvb3Z5LnN0YXJ0ZXIuY29uZiIsbnVsbCk7CisgICAgICAgIExvYWRlckNvbmZpZ3VyYXRpb24gbGMgPSBuZXcgTG9hZGVyQ29uZmlndXJhdGlvbigpOworICAgICAgICAKKyAgICAgICAgLy8gZXZhbHVhdGUgcGFyYW1ldGVycworICAgICAgICBib29sZWFuIGhhZE1haW49ZmFsc2UsIGhhZENvbmY9ZmFsc2UsIGhhZENQPWZhbHNlOworICAgICAgICBpbnQgYXJnc09mZnNldCA9IDA7CisgICAgICAgIHdoaWxlIChhcmdzLmxlbmd0aC1hcmdzT2Zmc2V0PjAgJiYgIShoYWRNYWluICYmIGhhZENvbmYgJiYgaGFkQ1ApKSB7CisgICAgICAgICAgICBpZiAoYXJnc1thcmdzT2Zmc2V0XS5lcXVhbHMoIi0tY2xhc3NwYXRoIikpIHsKKyAgICAgICAgICAgICAgICBpZiAoaGFkQ1ApIGJyZWFrOworICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aD09YXJnc09mZnNldCsxKSB7CisgICAgICAgICAgICAgICAgICAgIGV4aXQoImNsYXNzcGF0aCBwYXJhbWV0ZXIgbmVlZHMgYXJndW1lbnQiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGMuYWRkQ2xhc3NQYXRoKGFyZ3NbYXJnc09mZnNldCsxXSk7CisgICAgICAgICAgICAgICAgYXJnc09mZnNldCs9MjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1thcmdzT2Zmc2V0XS5lcXVhbHMoIi0tbWFpbiIpKSB7CisgICAgICAgICAgICAgICAgaWYgKGhhZE1haW4pIGJyZWFrOworICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aD09YXJnc09mZnNldCsxKSB7CisgICAgICAgICAgICAgICAgICAgIGV4aXQoIm1haW4gcGFyYW1ldGVyIG5lZWRzIGFyZ3VtZW50Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxjLnNldE1haW5DbGFzcyhhcmdzW2FyZ3NPZmZzZXQrMV0pOworICAgICAgICAgICAgICAgIGFyZ3NPZmZzZXQrPTI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbYXJnc09mZnNldF0uZXF1YWxzKCItLWNvbmYiKSkgeworICAgICAgICAgICAgICAgIGlmIChoYWRDb25mKSBicmVhazsKKyAgICAgICAgICAgICAgICBpZiAoYXJncy5sZW5ndGg9PWFyZ3NPZmZzZXQrMSkgeworICAgICAgICAgICAgICAgICAgICBleGl0KCJjb25mIHBhcmFtZXRlciBuZWVkcyBhcmd1bWVudCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb25mPWFyZ3NbYXJnc09mZnNldCsxXTsKKyAgICAgICAgICAgICAgICBhcmdzT2Zmc2V0Kz0yOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gICAgICAgICAgICAKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gd2UgbmVlZCB0byBrbm93IHRoZSBjbGFzcyB3ZSB3YW50IHRvIHN0YXJ0CisgICAgICAgIGlmIChsYy5nZXRNYWluQ2xhc3MoKT09bnVsbCAmJiBjb25mPT1udWxsKSB7CisgICAgICAgICAgICBleGl0KCJubyBjb25maWd1cmF0aW9uIGZpbGUgb3IgbWFpbiBjbGFzcyBzcGVjaWZpZWQiKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gY29weSBhcmd1bWVudHMgZm9yIG1haW4gY2xhc3MgCisgICAgICAgIFN0cmluZ1tdIG5ld0FyZ3MgPSBuZXcgU3RyaW5nW2FyZ3MubGVuZ3RoLWFyZ3NPZmZzZXRdOworICAgICAgICBmb3IgKGludCBpPTA7IGk8bmV3QXJncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgbmV3QXJnc1tpXSA9IGFyZ3NbaSthcmdzT2Zmc2V0XTsKKyAgICAgICAgfSAgICAgICAgCisgICAgICAgIC8vIGxvYWQgY29uZmlndXJhdGlvbiBmaWxlCisgICAgICAgIGlmIChjb25mIT1udWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGxjLmNvbmZpZ3VyZShuZXcgRmlsZUlucHV0U3RyZWFtKGNvbmYpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJleGNlcHRpb24gd2hpbGUgY29uZmlndXJpbmcgbWFpbiBjbGFzcyBsb2FkZXI6Iik7CisgICAgICAgICAgICAgICAgZXhpdChlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBjcmVhdGUgbG9hZGVyIGFuZCBleGVjdXRlIG1haW4gY2xhc3MKKyAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyID0gbmV3IFJvb3RMb2FkZXIobGMpOworICAgICAgICBNZXRob2QgbT1udWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2xhc3MgYyA9IGxvYWRlci5sb2FkQ2xhc3MobGMuZ2V0TWFpbkNsYXNzKCkpOworICAgICAgICAgICAgbSA9IGMuZ2V0TWV0aG9kKCJtYWluIiwgbmV3IENsYXNzW117U3RyaW5nW10uY2xhc3N9KTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlMSkgeworICAgICAgICAgICAgZXhpdChlMSk7CisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUyKSB7CisgICAgICAgICAgICBleGl0KGUyKTsKKyAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUyKSB7CisgICAgICAgICAgICBleGl0KGUyKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbS5pbnZva2UobnVsbCwgbmV3IE9iamVjdFtde25ld0FyZ3N9KTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUzKSB7CisgICAgICAgICAgICBleGl0KGUzKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlMykgeworICAgICAgICAgICAgZXhpdChlMyk7CisgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZTMpIHsKKyAgICAgICAgICAgIGV4aXQoZTMpOworICAgICAgICB9IAorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGV4aXQoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZXhpdChTdHJpbmcgbXNnKSB7CisgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihtc2cpOworICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICB9CisgCisgICAgLy8gYWZ0ZXIgbWlncmF0aW9uIGZyb20gY2xhc3N3b3JsZHMgdG8gdGhlIHJvb3Rsb2FkZXIgcmVuYW1lCisgICAgLy8gdGhlIHJvb3RMb2FkZXIgbWV0aG9kIHRvIG1haW4gYW5kIHJlbW92ZSB0aGlzIG1ldGhvZCBhcyAKKyAgICAvLyB3ZWxsIGFzIHRoZSBjbGFzc3dvcmxkcyBtZXRob2QKKyAgIC8qIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10sQ2xhc3NXb3JsZCBjbGFzc1dvcmxkICkgeworICAgICAgICBjbGFzc3dvcmxkcyhhcmdzLGNsYXNzV29ybGQpOworICAgIH0qLworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJvb3RMb2FkZXIoYXJncyk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB0LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLypwdWJsaWMgc3RhdGljIHZvaWQgY2xhc3N3b3JsZHMoU3RyaW5nIG9sZEFyZ3NbXSxDbGFzc1dvcmxkIGNsYXNzV29ybGQgKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBDcmVhdGVzIGEgcmVhbG0gd2l0aCAqanVzdCogdGhlIHN5c3RlbSBjbGFzc2xvYWRlcgorICAgICAgICAgICAgQ2xhc3NSZWFsbSBzeXN0ZW0gPSBjbGFzc1dvcmxkLm5ld1JlYWxtKCJzeXN0ZW0iKTsKKyAgICAgCisgICAgICAgICAgICAvLyBHZXQgdGhlIGdyb292eSByZWFsbQorICAgICAgICAgICAgQ2xhc3NSZWFsbSBncm9vdnkgPSBjbGFzc1dvcmxkLmdldFJlYWxtKCJncm9vdnkiKTsKKyAgICAgICAgICAgCisgICAgICAgICAgICAvLyBpbXBvcnQgZXZlcnl0aGluZyBmcm9tIHRoZSBzeXN0ZW0gcmVhbG0sIGJlY2F1c2UgaW1wb3J0cworICAgICAgICAgICAgLy8gYXJlIHNlYXJjaGVkICpmaXJzdCogaW4gQ2xhc3N3b3JsZHMKKyAgICAgICAgICAgIGdyb292eS5pbXBvcnRGcm9tKCJzeXN0ZW0iLCAiIik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vYWRkIHRvb2xzLmphciB0byBjbGFzc3BhdGgKKyAgICAgICAgICAgIFN0cmluZyB0b29scyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidG9vbHMuamFyIik7CisgICAgICAgICAgICBpZiAodG9vbHMhPW51bGwpIHsKKyAgICAgICAgICAgIAlVUkwgcmVmID0gKG5ldyBGaWxlKHRvb2xzKSkudG9VUkkoKS50b1VSTCgpOworICAgICAgICAgICAgCWdyb292eS5hZGRDb25zdGl0dWVudChyZWYpOworICAgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgICAgIGlmIChvbGRBcmdzLmxlbmd0aD09MCkgeworICAgICAgICAgICAgICAgIHByaW50VXNhZ2UoKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgU3RyaW5nIHByb2dyYW0gPSBvbGRBcmdzWzBdLnRvTG93ZXJDYXNlKCk7CisgICAgICAgICAgICBTdHJpbmdbXSBhcmdzID0gbmV3IFN0cmluZ1tvbGRBcmdzLmxlbmd0aC0xXTsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxhcmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgYXJnc1tpXSA9IG9sZEFyZ3NbaSsxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKHByb2dyYW0uZXF1YWxzKCJncm9vdnljIikpIHsKKyAgICAgICAgICAgICAgICBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLkZpbGVTeXN0ZW1Db21waWxlci5tYWluKGFyZ3MpOworICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9ncmFtLmVxdWFscygiZ3Jvb3Z5IikpIHsKKyAgICAgICAgICAgICAgICBHcm9vdnlNYWluLm1haW4oYXJncyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHByb2dyYW0uZXF1YWxzKCJjb25zb2xlIikpIHsKKyAgICAgICAgICAgICAgICAvLyB3b3JrIGFyb3VuZCBuZWVkZWQsIGJlY2F1c2UgdGhlIGNvbnNvbGUgaXMgY29tcGlsZWQgYWZ0ZXIgdGhpcyBmaWxlcworICAgICAgICAgICAgICAgIENsYXNzIGMgPSBDbGFzcy5mb3JOYW1lKCJncm9vdnkudWkuQ29uc29sZSIpOworICAgICAgICAgICAgICAgIE1ldGhvZCBtPSBjLmdldE1ldGhvZCgibWFpbiIsIG5ldyBDbGFzc1tde1N0cmluZ1tdLmNsYXNzfSk7CisgICAgICAgICAgICAgICAgbS5pbnZva2UobnVsbCwgbmV3IE9iamVjdFtde2FyZ3N9KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvZ3JhbS5lcXVhbHMoImdyb292eXNoIikpIHsKKyAgICAgICAgICAgICAgICBJbnRlcmFjdGl2ZVNoZWxsLm1haW4oYXJncyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigidW5rbm93biBwcm9ncmFtICIrcHJvZ3JhbSk7CisgICAgICAgICAgICAgICAgcHJpbnRVc2FnZSgpOworICAgICAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOworICAgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICB9Ki8KKyAgICAKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL0xvYWRlckNvbmZpZ3VyYXRpb24uamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL0xvYWRlckNvbmZpZ3VyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTllZjFjCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvTG9hZGVyQ29uZmlndXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzM0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS50b29sczsKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKKy8qKgorICogY2xhc3MgdXNlZCB0byBjb25maWd1cmUgYSBSb290TG9hZGVyIGZyb20gYSBzdHJlYW0gb3IgYnkgdXNpbmcKKyAqIGl0J3MgbWV0aG9kcy4KKyAqIDxwLz4KKyAqIFRoZSBzdHJlYW0gY2FuIGJlIGZvciBleGFtcGxlIGEgRmlsZUlucHV0U3RyZWFtIGZyb20gYSBmaWxlIHdpdGgKKyAqIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgorICogPHAvPgorICogPHByZT4KKyAqICMgY29tbWVudAorICogbWFpbiBpcyBjbGFzc25hbWUKKyAqIGxvYWQgcGF0aAorICogbG9hZCBmaWxlCisgKiBsb2FkIHBhdGhXaXRoJHtwcm9wZXJ0eX0KKyAqIGxvYWQgcGF0aFdpdGghe3JlcXVpcmVkLnByb3BlcnR5fQorICogbG9hZCBwYXRoLyouamFyCisgKiBsb2FkIHBhdGgvJiM0MjsmIzQyOy8mIzQyOy5qYXIKKyAqIDwvcHJlPgorICogPHVsPgorICogPGxpPkFsbCBsaW5lcyBzdGFydGluZyB3aXRoICIjIiBhcmUgaWdub3JlZC48L2xpPgorICogPGxpPlRoZSAibWFpbiBpcyIgcGFydCBtYXkgb25seSBiZSBvbmNlIGluIHRoZSBmaWxlLiBUaGUgU3RyaW5nCisgKiBhZnRlcndhcmRzIGlzIHRoZSBuYW1lIG9mIGEgY2xhc3Mgd2l0aCBhIG1haW4gbWV0aG9kLiA8L2xpPgorICogPGxpPlRoZSAibG9hZCIgY29tbWFuZCB3aWxsIGFkZCB0aGUgZ2l2ZW4gZmlsZSBvciBwYXRoIHRvIHRoZQorICogY2xhc3NwYXRoIGluIHRoaXMgY29uZmlndXJhdGlvbiBvYmplY3QuIElmIHRoZSBwYXRoIGRvZXMgbm90IAorICogZXhpc3QsIHRoZSBwYXRoIHdpbGwgYmUgaWdub3JlZC4KKyAqIDwvbGk+CisgKiA8bGk+cHJvcGVydGllcyByZWZlcmVuY2VkIHVzaW5nICF7eH0gYXJlIHJlcXVpcmVkLjwvbGk+CisgKiA8bGk+cHJvcGVydGllcyByZWZlcmVuY2VkIHVzaW5nICR7eH0gYXJlIG5vdCByZXF1aXJlZC4gSWYgdGhlIAorICogcHJvcGVydHkgZG9lcyBub3QgZXhpc3QgdGhlIHdob2xlIGxvYWQgaW5zdHJ1Y3Rpb24gbGluZSB3aWxsIAorICogYmUgaWdub3JlZC48L2xpPgorICogPGxpPiogaXMgdXNlZCB0byBtYXRjaCB6ZXJvIG9yIG1vcmUgY2hhcmFjdGVycyBpbiBhIGZpbGUuPC9saT4KKyAqIDxsaT4qKiBpcyB1c2VkIHRvIG1hdGNoIHplcm8gb3IgbW9yZSBkaXJlY3Rvcmllcy48L2xpPiAKKyAqIDwvdWw+CisgKiA8cC8+CisgKiBEZWZpbmluZyB0aGUgbWFpbiBjbGFzcyBpcyBvcHRpb25hbCBpZiBzZXRSZXF1aXJlTWFpbihib29sZWFuKSB3YXMKKyAqIGNhbGxlZCB3aXRoIGZhbHNlLCBiZWZvcmUgcmVhZGluZyB0aGUgY29uZmlndXJhdGlvbi4KKyAqIFlvdSBjYW4gdXNlIHRoZSB3aWxkY2FyZCAiKiIgdG8gZmlsdGVyIHRoZSBwYXRoLCBidXQgb25seSBmb3IgZmlsZXMsIG5vdAorICogZGlyZWN0b3JpZXMuIHRvIG1hdGNoIGRpcmVjdG9yaWVzIHVzZSAiKioiLiBUaGUgICR7cHJvcGVydHluYW1lfSBpcyByZXBsYWNlZCBieSB0aGUgdmFsdWUgb2YgdGhlIHN5c3RlbSdzCisgKiBwcm9wZXJ0eSBuYW1lLiBZb3UgY2FuIHVzZSB1c2VyLmhvbWUgaGVyZSBmb3IgZXhhbXBsZS4gSWYgdGhlIHByb3BlcnR5IGRvZXMKKyAqIG5vdCBleGlzdCwgYW4gZW1wdHkgc3RyaW5nIHdpbGwgYmUgdXNlZC4gSWYgdGhlIHBhdGggb3IgZmlsZSBhZnRlciB0aGUgbG9hZAorICogY29tbWFuZCBkb2VzIG5vdCBleGlzdCwgdGhlIHBhdGggd2lsbCBiZSBpZ25vcmVkLgorICoKKyAqIEBhdXRob3IgSm9jaGVuIFRoZW9kb3JvdQorICogQHZlcnNpb24gJFJldmlzaW9uJAorICogQHNlZSBSb290TG9hZGVyCisgKi8KK3B1YmxpYyBjbGFzcyBMb2FkZXJDb25maWd1cmF0aW9uIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNQUlOX1BSRUZJWCA9ICJtYWluIGlzIiwgTE9BRF9QUkVGSVggPSAibG9hZCI7CisgICAgcHJpdmF0ZSBMaXN0IGNsYXNzUGF0aCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICBwcml2YXRlIFN0cmluZyBtYWluOworICAgIHByaXZhdGUgYm9vbGVhbiByZXF1aXJlTWFpbjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFdJTERDQVJEID0gJyonOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTExfV0lMRENBUkQgPSAiIitXSUxEQ0FSRCtXSUxEQ0FSRDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFUQ0hfRklMRV9OQU1FID0gIlxcXFxFW14vXSs/XFxcXFEiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNQVRDSF9BTEwgPSAiXFxcXEUuKz9cXFxcUSI7CisKKyAgICAvKioKKyAgICAgKiBjcmVhdGVzIGEgbmV3IGxvYWRlciBjb25maWd1cmF0aW9uCisgICAgICovCisgICAgcHVibGljIExvYWRlckNvbmZpZ3VyYXRpb24oKSB7CisgICAgICAgIHRoaXMucmVxdWlyZU1haW4gPSB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIGNvbmZpZ3VyZXMgdGhpcyBsb2FkZXIgd2l0aCBhIHN0cmVhbQorICAgICAqCisgICAgICogQHBhcmFtIGlzIHN0cmVhbSB1c2VkIHRvIHJlYWQgdGhlIGNvbmZpZ3VyYXRpb24KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHJlYWRpbmcgb3IgcGFyc2luZyB0aGUgY29udGVudHMgb2YgdGhlIHN0cmVhbSBmYWlscworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShJbnB1dFN0cmVhbSBpcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcykpOworICAgICAgICBpbnQgbGluZU51bWJlciA9IDA7CisKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFN0cmluZyBsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCk7CisgICAgICAgICAgICBpZiAobGluZSA9PSBudWxsKSBicmVhazsKKworICAgICAgICAgICAgbGluZSA9IGxpbmUudHJpbSgpOworICAgICAgICAgICAgbGluZU51bWJlcisrOworCisgICAgICAgICAgICBpZiAobGluZS5zdGFydHNXaXRoKCIjIikgfHwgbGluZS5sZW5ndGgoKSA9PSAwKSBjb250aW51ZTsKKworICAgICAgICAgICAgaWYgKGxpbmUuc3RhcnRzV2l0aChMT0FEX1BSRUZJWCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbG9hZFBhdGggPSBsaW5lLnN1YnN0cmluZyhMT0FEX1BSRUZJWC5sZW5ndGgoKSkudHJpbSgpOworICAgICAgICAgICAgICAgIGxvYWRQYXRoID0gYXNzaWduUHJvcGVydGllcyhsb2FkUGF0aCk7CisgICAgICAgICAgICAgICAgbG9hZEZpbHRlcmVkUGF0aChsb2FkUGF0aCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aChNQUlOX1BSRUZJWCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobWFpbiAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oImR1cGxpY2F0ZSBkZWZpbml0aW9uIG9mIG1haW4gaW4gbGluZSAiICsgbGluZU51bWJlciArICIgOiAiICsgbGluZSk7CisgICAgICAgICAgICAgICAgbWFpbiA9IGxpbmUuc3Vic3RyaW5nKE1BSU5fUFJFRklYLmxlbmd0aCgpKS50cmltKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigidW5leHBlY3RlZCBsaW5lIGluICIgKyBsaW5lTnVtYmVyICsgIiA6ICIgKyBsaW5lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXF1aXJlTWFpbiAmJiBtYWluID09IG51bGwpIHRocm93IG5ldyBJT0V4Y2VwdGlvbigibWlzc2luZyBtYWluIGNsYXNzIGRlZmluaXRpb24gaW4gY29uZmlnIGZpbGUiKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogZXhhcGFuZHMgdGhlIHByb3BlcnRpZXMgaW5zaWRlIHRoZSBnaXZlbiBzdHJpbmcgdG8gaXQncyB2YWx1ZXMKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBhc3NpZ25Qcm9wZXJ0aWVzKFN0cmluZyBzdHIpIHsKKyAgICAgICAgaW50IHByb3BlcnR5SW5kZXhTdGFydCA9IDAsIHByb3BlcnR5SW5kZXhFbmQgPSAwOworICAgICAgICBib29sZWFuIHJlcXVpcmVQcm9wZXJ0eSA9IGZhbHNlOworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gIiI7CisKKyAgICAgICAgd2hpbGUgKHByb3BlcnR5SW5kZXhTdGFydCA8IHN0ci5sZW5ndGgoKSkgeworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpMSA9IHN0ci5pbmRleE9mKCIkeyIsIHByb3BlcnR5SW5kZXhTdGFydCk7CisgICAgICAgICAgICAgICAgaW50IGkyID0gc3RyLmluZGV4T2YoIiF7IiwgcHJvcGVydHlJbmRleFN0YXJ0KTsKKyAgICAgICAgICAgICAgICBpZiAoaTE9PS0xKSB7CisgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5SW5kZXhTdGFydCA9IGkyOyAKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGkyPT0tMSkgeworICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eUluZGV4U3RhcnQgPSBpMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eUluZGV4U3RhcnQgPSBNYXRoLm1pbihpMSxpMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlcXVpcmVQcm9wZXJ0eT1wcm9wZXJ0eUluZGV4U3RhcnQ9PWkyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHByb3BlcnR5SW5kZXhTdGFydCA9PSAtMSkgYnJlYWs7CisgICAgICAgICAgICByZXN1bHQgKz0gc3RyLnN1YnN0cmluZyhwcm9wZXJ0eUluZGV4RW5kLCBwcm9wZXJ0eUluZGV4U3RhcnQpOworCisgICAgICAgICAgICBwcm9wZXJ0eUluZGV4RW5kID0gc3RyLmluZGV4T2YoIn0iLCBwcm9wZXJ0eUluZGV4U3RhcnQpOworICAgICAgICAgICAgaWYgKHByb3BlcnR5SW5kZXhFbmQgPT0gLTEpIGJyZWFrOworCisgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHlLZXkgPSBzdHIuc3Vic3RyaW5nKHByb3BlcnR5SW5kZXhTdGFydCArIDIsIHByb3BlcnR5SW5kZXhFbmQpOworICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5VmFsdWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkocHJvcGVydHlLZXkpOworICAgICAgICAgICAgLy8gYXNzdW1lIHByb3BlcnRpZXMgY29udGFpbiBwYXRocworICAgICAgICAgICAgaWYgKHByb3BlcnR5VmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlUHJvcGVydHkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVmFyaWFibGUgIiArIHByb3BlcnR5S2V5ICsgIiBpbiBncm9vdnktc3RhcnRlci5jb25mIHJlZmVyZW5jZXMgYSBub24tZXhpc3RlbnQgU3lzdGVtIHByb3BlcnR5ISBUcnkgcGFzc2luZyB0aGUgcHJvcGVydHkgdG8gdGhlIFZNIHVzaW5nIC1EIiArIHByb3BlcnR5S2V5ICsgIj1teVZhbHVlIGluIEpBVkFfT1BUUyIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByb3BlcnR5VmFsdWUgPSBnZXRTbGFzaHlQYXRoKHByb3BlcnR5VmFsdWUpOworICAgICAgICAgICAgcmVzdWx0ICs9IHByb3BlcnR5VmFsdWU7CisKKyAgICAgICAgICAgIHByb3BlcnR5SW5kZXhFbmQrKzsKKyAgICAgICAgICAgIHByb3BlcnR5SW5kZXhTdGFydCA9IHByb3BlcnR5SW5kZXhFbmQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAocHJvcGVydHlJbmRleFN0YXJ0ID09IC0xIHx8IHByb3BlcnR5SW5kZXhTdGFydCA+PSBzdHIubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgIHJlc3VsdCArPSBzdHIuc3Vic3RyaW5nKHByb3BlcnR5SW5kZXhFbmQpOworICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5SW5kZXhFbmQgPT0gLTEpIHsKKyAgICAgICAgICAgIHJlc3VsdCArPSBzdHIuc3Vic3RyaW5nKHByb3BlcnR5SW5kZXhTdGFydCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworCisgICAgLyoqCisgICAgICogbG9hZCBhIHBvc3NpYmxlIGZpbHRlcmVkIHBhdGguIEZpbHRlcnMgYXJlIGRlZmluZWQKKyAgICAgKiBieSB1c2luZyB0aGUgKiB3aWxkY2FyZCBsaWtlIGluIGFueSBzaGVsbAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBsb2FkRmlsdGVyZWRQYXRoKFN0cmluZyBmaWx0ZXIpIHsKKyAgICAgICAgaWYgKGZpbHRlcj09bnVsbCkgcmV0dXJuOworICAgICAgICBpbnQgc3RhckluZGV4ID0gZmlsdGVyLmluZGV4T2YoV0lMRENBUkQpOworICAgICAgICBpZiAoc3RhckluZGV4ID09IC0xKSB7CisgICAgICAgICAgICBhZGRGaWxlKG5ldyBGaWxlKGZpbHRlcikpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gcmVjdXJzaXZlID0gZmlsdGVyLmluZGV4T2YoQUxMX1dJTERDQVJEKSAhPSAtMTsKKyAgICAgICAgCisgICAgICAgIFN0cmluZyBzdGFydERpciA9IGZpbHRlci5zdWJzdHJpbmcoMCwgc3RhckluZGV4IC0gMSk7CisgICAgICAgIEZpbGUgcm9vdCA9IG5ldyBGaWxlKHN0YXJ0RGlyKTsKKworICAgICAgICBmaWx0ZXIgPSBxdW90ZShmaWx0ZXIpOworICAgICAgICBmaWx0ZXIgPSBmaWx0ZXIucmVwbGFjZUFsbCgiXFwiK1dJTERDQVJEKyJcXCIrV0lMRENBUkQsIE1BVENIX0FMTCk7CisgICAgICAgIGZpbHRlciA9IGZpbHRlci5yZXBsYWNlQWxsKCJcXCIgKyBXSUxEQ0FSRCwgTUFUQ0hfRklMRV9OQU1FKTsKKyAgICAgICAgUGF0dGVybiBwYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKGZpbHRlcik7CisKKyAgICAgICAgZmluYWwgRmlsZVtdIGZpbGVzID0gcm9vdC5saXN0RmlsZXMoKTsKKyAgICAgICAgaWYgKGZpbGVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZpbmRNYXRjaGluZ0ZpbGVzKGZpbGVzLCBwYXR0ZXJuLCByZWN1cnNpdmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGZpbmRNYXRjaGluZ0ZpbGVzKEZpbGVbXSBmaWxlcywgUGF0dGVybiBwYXR0ZXJuLCBib29sZWFuIHJlY3Vyc2l2ZSkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBGaWxlIGZpbGUgPSBmaWxlc1tpXTsKKyAgICAgICAgICAgIFN0cmluZyBmaWxlU3RyaW5nID0gZ2V0U2xhc2h5UGF0aChmaWxlLmdldFBhdGgoKSk7CisgICAgICAgICAgICBNYXRjaGVyIG0gPSBwYXR0ZXJuLm1hdGNoZXIoZmlsZVN0cmluZyk7CisgICAgICAgICAgICBpZiAobS5tYXRjaGVzKCkgJiYgZmlsZS5pc0ZpbGUoKSkgeworICAgICAgICAgICAgICAgIGFkZEZpbGUoZmlsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZmlsZS5pc0RpcmVjdG9yeSgpICYmIHJlY3Vyc2l2ZSkgeworICAgICAgICAgICAgICAgIGZpbmFsIEZpbGVbXSBkaXJGaWxlcyA9IGZpbGUubGlzdEZpbGVzKCk7CisgICAgICAgICAgICAgICAgaWYgKGRpckZpbGVzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluZE1hdGNoaW5nRmlsZXMoZGlyRmlsZXMsIHBhdHRlcm4sIHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGNoYW5nZSBwYXRoIHJlcHJlc2VudGF0aW9uIHRvIHNvbWV0aGluZyBtb3JlIHN5c3RlbSBpbmRlcGVuZGVudC4KKyAgICAvLyBUaGlzIHNvbHV0aW9uIGlzIGJhc2VkIG9uIGFuIGFic29sdXRlIHBhdGgKKyAgICBwcml2YXRlIFN0cmluZyBnZXRTbGFzaHlQYXRoKGZpbmFsIFN0cmluZyBwYXRoKSB7CisgICAgICAgIFN0cmluZyBjaGFuZ2VkUGF0aCA9IHBhdGg7CisgICAgICAgIGlmIChGaWxlLnNlcGFyYXRvckNoYXIgIT0gJy8nKQorICAgICAgICAgICAgY2hhbmdlZFBhdGggPSBjaGFuZ2VkUGF0aC5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsKKworICAgICAgICByZXR1cm4gY2hhbmdlZFBhdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogcmV0dXJuIHRydWUgaWYgdGhlIHBhcmVudCBvZiB0aGUgcGF0aCBpbnNpZGUgdGhlIGdpdmVuCisgICAgICogc3RyaW5nIGRvZXMgZXhpc3QKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gcGFyZW50UGF0aERvZXNFeGlzdChTdHJpbmcgcGF0aCkgeworICAgICAgICBGaWxlIGRpciA9IG5ldyBGaWxlKHBhdGgpLmdldFBhcmVudEZpbGUoKTsKKyAgICAgICAgcmV0dXJuIGRpci5leGlzdHMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZXBlcmF0ZXMgdGhlIGdpdmVuIHBhdGggYXQgdGhlIGxhc3QgJy8nCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UGFyZW50UGF0aChTdHJpbmcgZmlsdGVyKSB7CisgICAgICAgIGludCBpbmRleCA9IGZpbHRlci5sYXN0SW5kZXhPZignLycpOworICAgICAgICBpZiAoaW5kZXggPT0gLTEpIHJldHVybiAiIjsKKyAgICAgICAgcmV0dXJuIGZpbHRlci5zdWJzdHJpbmcoaW5kZXggKyAxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGRzIGEgZmlsZSB0byB0aGUgY2xhc3NwYXRoIGlmIGl0IGRvZXMgZXhpc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRGaWxlKEZpbGUgZikgeworICAgICAgICBpZiAoZiAhPSBudWxsICYmIGYuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY2xhc3NQYXRoLmFkZChmLnRvVVJJKCkudG9VUkwoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiY29udmVydGluZyBhbiBleGlzdGluZyBmaWxlIHRvIGFuIHVybCBzaG91bGQgaGF2ZSBuZXZlciB0aHJvd24gYW4gZXhjZXB0aW9uISIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkcyBhIGZpbGUgdG8gdGhlIGNsYXNzcGF0aCBpZiBpdCBkb2VzIGV4aXN0CisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRmlsZShTdHJpbmcgcykgeworICAgICAgICBpZiAocyAhPSBudWxsKSBhZGRGaWxlKG5ldyBGaWxlKHMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGRzIGEgY2xhc3NwYXRoIHRvIHRoaXMgY29uZmlndXJhdGlvbi4gSXQgZXhwZWN0cyBhIHN0cmluZworICAgICAqIHdpdGggbXVsdGlwbGUgcGF0aHMsIHNlcGVyYXRlZCBieSB0aGUgc3lzdGVtIGRlcGVuZGVudAorICAgICAqCisgICAgICogQHNlZSBqYXZhLmlvLkZpbGUjcGF0aFNlcGFyYXRvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENsYXNzUGF0aChTdHJpbmcgcGF0aCkgeworICAgICAgICBTdHJpbmdbXSBwYXRocyA9IHBhdGguc3BsaXQoRmlsZS5wYXRoU2VwYXJhdG9yKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXRocy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgYWRkRmlsZShuZXcgRmlsZShwYXRoc1tpXSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogZ2V0cyBhIGNsYXNzcGF0aCBhcyBVUkxbXSBmcm9tIHRoaXMgY29uZmlndXJhdGlvbi4KKyAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGNvbnN0cnVjdCBhIEBzZWUgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgVVJMW10gZ2V0Q2xhc3NQYXRoVXJscygpIHsKKyAgICAgICAgcmV0dXJuIChVUkxbXSkgY2xhc3NQYXRoLnRvQXJyYXkobmV3IFVSTFtjbGFzc1BhdGguc2l6ZSgpXSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogcmV0dXJucyB0aGUgbWFpbiBjbGFzcyBvciBudWxsIGlzIG5vIGlzIGRlZmluZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE1haW5DbGFzcygpIHsKKyAgICAgICAgcmV0dXJuIG1haW47CisgICAgfQorCisgICAgLyoqCisgICAgICogc2V0cyB0aGUgbWFpbiBjbGFzcy4gSWYgdGhlcmUgaXMgYWxyZWFkeSBhIG1haW4gY2xhc3MKKyAgICAgKiBpdCBpcyBvdmVyd3JpdHRlbi4gQ2FsbGluZyBAc2VlICNjb25maWd1cmUoSW5wdXRTdHJlYW0pCisgICAgICogYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCBkb2VzIG5vdCByZXF1aXJlIGEgbWFpbiBjbGFzcworICAgICAqIGRlZmluaXRpb24gaW5zaWRlIHRoZSBzdHJlYW0KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYWluQ2xhc3MoU3RyaW5nIGNsYXp6KSB7CisgICAgICAgIG1haW4gPSBjbGF6ejsKKyAgICAgICAgcmVxdWlyZU1haW4gPSBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpZiBzZXQgdG8gZmFsc2Ugbm8gbWFpbiBjbGFzcyBpcyByZXF1aXJlZCB3aGVuIGNhbGxpbmcKKyAgICAgKgorICAgICAqIEBzZWUgI2NvbmZpZ3VyZShJbnB1dFN0cmVhbSkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXF1aXJlTWFpbihib29sZWFuIHJlcXVpcmVNYWluKSB7CisgICAgICAgIHRoaXMucmVxdWlyZU1haW4gPSByZXF1aXJlTWFpbjsKKyAgICB9CisKKyAgICAvLyBSZXBsYWNlbWVudCBmb3IgUGF0dGVybi5xdW90ZSBmcm9tIEpESyAxLjUKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcXVvdGUoU3RyaW5nIHMpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihzLmxlbmd0aCgpICogMik7CisgICAgICAgIGludCBlSW5kZXggPSBzLmluZGV4T2YoIlxcRSIpOworICAgICAgICBpZiAoZUluZGV4ID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIHNiLmFwcGVuZCgiXFxRIikuYXBwZW5kKHMpLmFwcGVuZCgiXFxFIikudG9TdHJpbmcoKTsKKworICAgICAgICBzYi5hcHBlbmQoIlxcUSIpOworICAgICAgICBlSW5kZXggPSAwOworICAgICAgICBpbnQgY3VyID0gMDsKKyAgICAgICAgd2hpbGUgKChlSW5kZXggPSBzLmluZGV4T2YoIlxcRSIsIGN1cikpICE9IC0xKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQocy5zdWJzdHJpbmcoY3VyLCBlSW5kZXgpKS5hcHBlbmQoIlxcRVxcXFxFXFxRIik7CisgICAgICAgICAgICBjdXIgPSBlSW5kZXggKyAyOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzYi5hcHBlbmQocy5zdWJzdHJpbmcoY3VyLCBzLmxlbmd0aCgpKSkuYXBwZW5kKCJcXEUiKS50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL1Jvb3RMb2FkZXIuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL1Jvb3RMb2FkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTYwOGU5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvUm9vdExvYWRlci5qYXZhCkBAIC0wLDAgKzEsMTQ4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS50b29sczsKKworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKKworLyoqCisgKiBUaGlzIENsYXNzTG9hZGVyIHNob3VsZCBiZSB1c2VkIGFzIHJvb3Qgb2YgY2xhc3MgbG9hZGVycy4gQW55CisgKiBSb290TG9hZGVyIGRvZXMgaGF2ZSBpdCdzIG93biBjbGFzc3BhdGguIFdoZW4gc2VhcmNoaW5nIGZvciBhCisgKiBjbGFzcyBvciByZXNvdXJjZSB0aGlzIGNsYXNzcGF0aCB3aWxsIGJlIHVzZWQuIFBhcmVudAorICogQ2xhc3Nsb2FkZXJzIGFyZSBpZ25vcmVkIGZpcnN0LiBJZiBhIGNsYXNzIG9yIHJlc291cmNlCisgKiBjYW4ndCBiZSBmb3VuZCBpbiB0aGUgY2xhc3NwYXRoIG9mIHRoZSBSb290TG9hZGVyLCB0aGVuIHBhcmVudCBpcworICogY2hlY2tlZC4KKyAqIDxwLz4KKyAqIDxiPk5vdGU6PC9iPiB0aGlzIGlzIHZlcnkgYWdhaW5zdCB0aGUgbm9ybWFsIGJlaGF2aW9yIG9mCisgKiBjbGFzc2xvYWRlcnMuIE5vcm1hbCBpcyB0byBmaXJzdCBjaGVjayBwYXJlbnQgYW5kIHRoZW4gbG9vayBpbgorICogdGhlIHJlc291cmNlcyB5b3UgZ2F2ZSB0aGlzIGNsYXNzbG9hZGVyLgorICogPHAvPgorICogSXQncyBwb3NzaWJsZSB0byBhZGQgdXJscyB0byB0aGUgY2xhc3NwYXRoIGF0IHJ1bnRpbWUgdGhyb3VnaAorICogQHNlZSAjYWRkVVJMKFVSTCkKKyAqICAgICAgPHAvPgorICogICAgICA8Yj5XaHkgdXNpbmcgUm9vdExvYWRlcj88L2I+CisgKiAgICAgIElmIHlvdSBoYXZlIHRvIGxvYWQgY2xhc3NlcyB3aXRoIG11bHRpcGxlIGNsYXNzbG9hZGVycyBhbmQgYQorICogICAgICBjbGFzc2xvYWRlciBkb2VzIGtub3cgYSBjbGFzcyB3aGljaCBkZXBlbmRzIG9uIGEgY2xhc3Mgb25seQorICogICAgICBhIGNoaWxkIG9mIHRoaXMgbG9hZGVyIGRvZXMga25vdywgdGhlbiB5b3Ugd29uJ3QgYmUgYWJsZSB0bworICogICAgICBsb2FkIHRoZSBjbGFzcy4gVG8gbG9hZCB0aGUgY2xhc3MgdGhlIGNoaWxkIGlzIG5vdCBhbGxvd2VkCisgKiAgICAgIHRvIHJlZGlyZWN0IGl0J3Mgc2VhcmNoIGZvciB0aGUgY2xhc3MgdG8gdGhlIHBhcmVudCBmaXJzdC4KKyAqICAgICAgVGhhdCB3YXkgdGhlIGNoaWxkIGNhbiBsb2FkIHRoZSBjbGFzcy4gSWYgdGhlIGNoaWxkIGRvZXMgbm90CisgKiAgICAgIGhhdmUgYWxsIGNsYXNzZXMgdG8gZG8gdGhpcywgdGhpcyBmYWlscyBvZiBjb3Vyc2UuCisgKiAgICAgIDxwLz4KKyAqICAgICAgRm9yIGV4YW1wbGU6CisgKiAgICAgIDxwLz4KKyAqICAgICAgPHByZT4KKyAqICAgICAgIHBhcmVudExvYWRlciAgIChoYXMgY2xhc3NwYXRoOiBhLmphcjtjLmphcikKKyAqICAgICAgICAgICB8CisgKiAgICAgICAgICAgfAorICogICAgICAgY2hpbGRMb2FkZXIgICAgKGhhcyBjbGFzc3BhdGg6IGEuamFyO2IuamFyO2MuamFyKQorICogICAgICAgPC9wcmU+CisgKiAgICAgIDxwLz4KKyAqICAgICAgY2xhc3MgQyAoZnJvbSBjLmphcikgZXh0ZW5kcyBCIChmcm9tIGIuamFyKQorICogICAgICA8cC8+CisgKiAgICAgIGNoaWxkTG9hZGVyLmZpbmQoIkMiKQorICogICAgICAtLT4gcGFyZW50TG9hZGVyIGRvZXMga25vdyBDLmNsYXNzLCB0cnkgdG8gbG9hZCBpdAorICogICAgICAtLT4gdG8gbG9hZCBDLmNsYXNzIGl0IGhhcyB0byBsb2FkIEIuY2xhc3MKKyAqICAgICAgLS0+IHBhcmVudExvYWRlciBpcyB1bmFibGUgdG8gZmluZCBCLmNsYXNzIGluIGEuamFyIG9yIGMuamFyCisgKiAgICAgIC0tPiBOb0NsYXNzRGVmRm91bmRFeGNlcHRpb24hCisgKiAgICAgIDxwLz4KKyAqICAgICAgaWYgY2hpbGRMb2FkZXIgaGFkIHRyaWVkIHRvIGxvYWQgdGhlIGNsYXNzIGJ5IGl0c2VsZiwgdGhlcmUKKyAqICAgICAgd291bGQgYmUgbm8gcHJvYmxlbS4gQ2hhbmdpbmcgY2hpbGRMb2FkZXIgdG8gYmUgYSBSb290TG9hZGVyCisgKiAgICAgIGluc3RhbmNlIHdpbGwgc29sdmUgdGhhdCBwcm9ibGVtLgorICoKKyAqIEBhdXRob3IgSm9jaGVuIFRoZW9kb3JvdQorICovCitwdWJsaWMgY2xhc3MgUm9vdExvYWRlciBleHRlbmRzIFVSTENsYXNzTG9hZGVyIHsKKworICAgIC8qKgorICAgICAqIGNvbnN0cnVjdHMgYSBuZXcgUm9vdExvYWRlciB3aXRob3V0IGNsYXNzcGF0aAorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IExvYWRlcgorICAgICAqLworICAgIHByaXZhdGUgUm9vdExvYWRlcihDbGFzc0xvYWRlciBwYXJlbnQpIHsKKyAgICAgICAgdGhpcyhuZXcgVVJMWzBdLCBwYXJlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGNvbnN0cnVjdHMgYSBuZXcgUm9vdExvYWRlciB3aXRoIGEgcGFyZW50IGxvYWRlciBhbmQgYW4KKyAgICAgKiBhcnJheSBvZiBVUkxzIGFzIGNsYXNzcGF0aAorICAgICAqLworICAgIHB1YmxpYyBSb290TG9hZGVyKFVSTFtdIHVybHMsIENsYXNzTG9hZGVyIHBhcmVudCkgeworICAgICAgICBzdXBlcih1cmxzLCBwYXJlbnQpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIENsYXNzTG9hZGVyIGNob29zZVBhcmVudCgpIHsKKyAgICAgICAgQ2xhc3NMb2FkZXIgY2wgPSBSb290TG9hZGVyLmNsYXNzLmdldENsYXNzTG9hZGVyKCk7CisgICAgICAgIGlmIChjbCAhPSBudWxsKSByZXR1cm4gY2w7CisgICAgICAgIHJldHVybiBDbGFzc0xvYWRlci5nZXRTeXN0ZW1DbGFzc0xvYWRlcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGNvbnN0cnVjdHMgYSBuZXcgUm9vdExvYWRlciB3aXRoIGEgQHNlZSBMb2FkZXJDb25maWd1cmF0aW9uCisgICAgICogb2JqZWN0IHdoaWNoIGhvbGRzIHRoZSBjbGFzc3BhdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgUm9vdExvYWRlcihMb2FkZXJDb25maWd1cmF0aW9uIGxjKSB7CisgICAgICAgIHRoaXMoY2hvb3NlUGFyZW50KCkpOworICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcih0aGlzKTsKKyAgICAgICAgVVJMW10gdXJscyA9IGxjLmdldENsYXNzUGF0aFVybHMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1cmxzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBhZGRVUkwodXJsc1tpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBsb2FkcyBhIGNsYXNzIHVzaW5nIHRoZSBuYW1lIG9mIHRoZSBjbGFzcworICAgICAqLworICAgIHByb3RlY3RlZCBDbGFzcyBsb2FkQ2xhc3MoZmluYWwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gcmVzb2x2ZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBDbGFzcyBjID0gdGhpcy5maW5kTG9hZGVkQ2xhc3MobmFtZSk7CisgICAgICAgIGlmIChjICE9IG51bGwpIHJldHVybiBjOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjID0gb2xkRmluZENsYXNzKG5hbWUpOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGNuZmUpIHsKKyAgICAgICAgICAgIC8vIElHTk9SRQorICAgICAgICB9CisgICAgICAgIGlmIChjID09IG51bGwpIGMgPSBzdXBlci5sb2FkQ2xhc3MobmFtZSwgcmVzb2x2ZSk7CisKKyAgICAgICAgaWYgKHJlc29sdmUpIHJlc29sdmVDbGFzcyhjKTsKKworICAgICAgICByZXR1cm4gYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiByZXR1cm5zIHRoZSBVUkwgb2YgYSByZXNvdXJjZSwgb3IgbnVsbCBpZiBpdCBpcyBub3QgZm91bmQKKyAgICAgKi8KKyAgICBwdWJsaWMgVVJMIGdldFJlc291cmNlKFN0cmluZyBuYW1lKSB7CisgICAgICAgIFVSTCB1cmwgPSBmaW5kUmVzb3VyY2UobmFtZSk7CisgICAgICAgIGlmICh1cmwgPT0gbnVsbCkgdXJsID0gc3VwZXIuZ2V0UmVzb3VyY2UobmFtZSk7CisgICAgICAgIHJldHVybiB1cmw7CisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkcyBhbiB1cmwgdG8gdGhlIGNsYXNzcGF0aCBvZiB0aGlzIGNsYXNzbG9hZGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkVVJMKFVSTCB1cmwpIHsKKyAgICAgICAgc3VwZXIuYWRkVVJMKHVybCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBDbGFzcyBvbGRGaW5kQ2xhc3MoU3RyaW5nIG5hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmZpbmRDbGFzcyhuYW1lKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQ2xhc3MgZmluZENsYXNzKFN0cmluZyBuYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKG5hbWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL1N0cmluZ0hlbHBlci5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvU3RyaW5nSGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ5MTAyNAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL1N0cmluZ0hlbHBlci5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS50b29sczsNCisNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK3B1YmxpYyBjbGFzcyBTdHJpbmdIZWxwZXIgew0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIA0KKyAgICAgICAgU1BBQ0UgPSAnICcsIFNJTkdMRV9RVU9URSA9ICdcJycsIERPVUJMRV9RVU9URSA9ICciJzsNCisgICAgDQorICAgIC8qKg0KKyAgICAgKiBUaGlzIG1ldGhvZCB0b2tlbml6ZXMgYSBzdHJpbmcgYnkgc3BhY2UgY2hhcmFjdGVycywgDQorICAgICAqIGJ1dCBpZ25vcmVzIHNwYWNlcyBpbiBxdW90ZWQgcGFydHMsdGhhdCBhcmUgcGFydHMgaW4gDQorICAgICAqICcnIG9yICIiLiBUaGUgbWV0aG9kIGRvZXMgYWxsb3dzIHRoZSB1c2FnZSBvZiAiIiBpbiAnJyANCisgICAgICogYW5kICcnIGluICIiLiBUaGUgc3BhY2UgY2hhcmFjdGVyIGJldHdlZW4gdG9rZW5zIGlzIG5vdCANCisgICAgICogcmV0dXJuZWQuIA0KKyAgICAgKiANCisgICAgICogQHBhcmFtIHMgdGhlIHN0cmluZyB0byB0b2tlbml6ZQ0KKyAgICAgKiBAcmV0dXJuIHRoZSB0b2tlbnMNCisgICAgICovDQorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gdG9rZW5pemVVbnF1b3RlZChTdHJpbmcgcykgew0KKyAgICAgICAgTGlzdCB0b2tlbnMgPSBuZXcgTGlua2VkTGlzdCgpOw0KKyAgICAgICAgaW50IGZpcnN0ID0gMDsNCisgICAgICAgIHdoaWxlIChmaXJzdCA8IHMubGVuZ3RoKCkpIHsNCisgICAgICAgICAgICBmaXJzdCA9IHNraXBXaGl0ZXNwYWNlKHMsIGZpcnN0KTsNCisgICAgICAgICAgICBpbnQgbGFzdCA9IHNjYW5Ub2tlbihzLCBmaXJzdCk7DQorICAgICAgICAgICAgaWYgKGZpcnN0IDwgbGFzdCkgew0KKyAgICAgICAgICAgICAgICB0b2tlbnMuYWRkKHMuc3Vic3RyaW5nKGZpcnN0LCBsYXN0KSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGZpcnN0ID0gbGFzdDsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiAoU3RyaW5nW10pdG9rZW5zLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7DQorICAgIH0NCisNCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHNjYW5Ub2tlbihTdHJpbmcgcywgaW50IHBvczApIHsNCisgICAgICAgIGludCBwb3MgPSBwb3MwOw0KKyAgICAgICAgd2hpbGUgKHBvcyA8IHMubGVuZ3RoKCkpIHsNCisgICAgICAgICAgICBjaGFyIGMgPSBzLmNoYXJBdChwb3MpOw0KKyAgICAgICAgICAgIGlmIChTUEFDRT09YykgYnJlYWs7DQorICAgICAgICAgICAgcG9zKys7DQorICAgICAgICAgICAgaWYgKFNJTkdMRV9RVU9URSA9PSBjKSB7DQorICAgICAgICAgICAgICAgIHBvcyA9IHNjYW5RdW90ZWQocywgcG9zLCBTSU5HTEVfUVVPVEUpOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoRE9VQkxFX1FVT1RFID09IGMpIHsNCisgICAgICAgICAgICAgICAgcG9zID0gc2NhblF1b3RlZChzLCBwb3MsIERPVUJMRV9RVU9URSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHBvczsNCisgICAgfQ0KKw0KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgc2NhblF1b3RlZChTdHJpbmcgcywgaW50IHBvczAsIGNoYXIgcXVvdGUpIHsNCisgICAgICAgIGludCBwb3MgPSBwb3MwOw0KKyAgICAgICAgd2hpbGUgKHBvcyA8IHMubGVuZ3RoKCkpIHsNCisgICAgICAgICAgICBjaGFyIGMgPSBzLmNoYXJBdChwb3MrKyk7DQorICAgICAgICAgICAgaWYgKHF1b3RlID09IGMpIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHBvczsNCisgICAgfQ0KKw0KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgc2tpcFdoaXRlc3BhY2UoU3RyaW5nIHMsIGludCBwb3MwKSB7DQorICAgICAgICBpbnQgcG9zID0gcG9zMDsNCisgICAgICAgIHdoaWxlIChwb3MgPCBzLmxlbmd0aCgpKSB7DQorICAgICAgICAgICAgY2hhciBjID0gcy5jaGFyQXQocG9zKTsNCisgICAgICAgICAgICBpZiAoU1BBQ0UhPWMpIGJyZWFrOw0KKyAgICAgICAgICAgIHBvcysrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHBvczsNCisgICAgfSANCit9DQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvVXRpbGl0aWVzLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9VdGlsaXRpZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDkyMzhkCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvVXRpbGl0aWVzLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS50b29sczsKKworLyoqCisgKiAgVmFyaW91cyB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgdXNlIGluIHRoZSBjb21waWxlci4KKyAqLworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVXRpbGl0aWVzCit7CisgICAvKioKKyAgICAqICBSZXR1cm5zIGEgc3RyaW5nIG1hZGUgdXAgb2YgcmVwZXRpdGlvbnMgb2YgdGhlIHNwZWNpZmllZCBzdHJpbmcuCisgICAgKi8KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcGVhdFN0cmluZyggU3RyaW5nIHBhdHRlcm4sIGludCByZXBlYXRzICkKKyAgICB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCBwYXR0ZXJuLmxlbmd0aCgpICogcmVwZWF0cyApOworICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IHJlcGVhdHM7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIHBhdHRlcm4gKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKCBidWZmZXIgKTsKKyAgICB9CisKKworICAgLyoqCisgICAgKiAgUmV0dXJucyB0aGUgZW5kLW9mLWxpbmUgbWFya2VyLgorICAgICovCisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBlb2woKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVvbDsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGVvbCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSggImxpbmUuc2VwYXJhdG9yIiwgIlxuIiApOyAKKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvZ3Jvb3Z5ZG9jL0NsYXNzcGF0aFJlc291cmNlTWFuYWdlci5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvZ3Jvb3Z5ZG9jL0NsYXNzcGF0aFJlc291cmNlTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MGY4ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9ncm9vdnlkb2MvQ2xhc3NwYXRoUmVzb3VyY2VNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuZ3Jvb3Z5ZG9jOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5EZWZhdWx0R3Jvb3Z5TWV0aG9kczsKKworcHVibGljIGNsYXNzIENsYXNzcGF0aFJlc291cmNlTWFuYWdlciBpbXBsZW1lbnRzIFJlc291cmNlTWFuYWdlciB7CisJQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXI7CisJcHVibGljIENsYXNzcGF0aFJlc291cmNlTWFuYWdlcigpIHsKKwkJY2xhc3NMb2FkZXIgPSBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7CisJfQorCQorCXB1YmxpYyBDbGFzc3BhdGhSZXNvdXJjZU1hbmFnZXIoQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKKwkJdGhpcy5jbGFzc0xvYWRlciA9IGNsYXNzTG9hZGVyOworCX0KKwkKKwlwdWJsaWMgUmVhZGVyIGdldFJlYWRlcihTdHJpbmcgcmVzb3VyY2VOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSBjbGFzc0xvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKHJlc291cmNlTmFtZSk7CisgICAgICAgIHJldHVybiBEZWZhdWx0R3Jvb3Z5TWV0aG9kcy5uZXdSZWFkZXIoc3RyZWFtKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2dyb292eWRvYy9GaWxlT3V0cHV0VG9vbC5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvZ3Jvb3Z5ZG9jL0ZpbGVPdXRwdXRUb29sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNiOGY5NwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2dyb292eWRvYy9GaWxlT3V0cHV0VG9vbC5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLmdyb292eWRvYzsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuRGVmYXVsdEdyb292eU1ldGhvZHM7CisKK3B1YmxpYyBjbGFzcyBGaWxlT3V0cHV0VG9vbCBpbXBsZW1lbnRzIE91dHB1dFRvb2wgeworCXB1YmxpYyB2b2lkIG1ha2VPdXRwdXRBcmVhKFN0cmluZyBmaWxlbmFtZSkgeworCQlGaWxlIGRpciA9IG5ldyBGaWxlKGZpbGVuYW1lKTsKKwkJZGlyLm1rZGlycygpOworCX0KKworCXB1YmxpYyB2b2lkIHdyaXRlVG9PdXRwdXQoU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgdGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGZpbGVOYW1lKTsKKyAgICAgICAgZmlsZS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7CisgICAgICAgIERlZmF1bHRHcm9vdnlNZXRob2RzLndyaXRlKGZpbGUsIHRleHQpOworCX0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2dyb292eWRvYy9GaWxlU3lzdGVtUmVzb3VyY2VNYW5hZ2VyLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9ncm9vdnlkb2MvRmlsZVN5c3RlbVJlc291cmNlTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4YTAxNWUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9ncm9vdnlkb2MvRmlsZVN5c3RlbVJlc291cmNlTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLmdyb292eWRvYzsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5EZWZhdWx0R3Jvb3Z5TWV0aG9kczsKKworcHVibGljIGNsYXNzIEZpbGVTeXN0ZW1SZXNvdXJjZU1hbmFnZXIgaW1wbGVtZW50cyBSZXNvdXJjZU1hbmFnZXIgeworCXByaXZhdGUgU3RyaW5nIGJhc2VkaXI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZTID0gIi8iOworCQorCXB1YmxpYyBGaWxlU3lzdGVtUmVzb3VyY2VNYW5hZ2VyKCkgeworCQliYXNlZGlyID0gIiI7CisJfQorCQorCXB1YmxpYyBGaWxlU3lzdGVtUmVzb3VyY2VNYW5hZ2VyKFN0cmluZyBiYXNlZGlyKSB7CisJCXRoaXMuYmFzZWRpciA9IGJhc2VkaXIgKyBGUzsKKwl9CisJcHVibGljIFJlYWRlciBnZXRSZWFkZXIoU3RyaW5nIHJlc291cmNlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJcmV0dXJuIERlZmF1bHRHcm9vdnlNZXRob2RzLm5ld1JlYWRlcihuZXcgRmlsZShiYXNlZGlyICsgcmVzb3VyY2VOYW1lKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvZ3Jvb3Z5ZG9jL0dyb292eURvY1RlbXBsYXRlRW5naW5lLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9ncm9vdnlkb2MvR3Jvb3Z5RG9jVGVtcGxhdGVFbmdpbmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDc1YTNiCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvZ3Jvb3Z5ZG9jL0dyb292eURvY1RlbXBsYXRlRW5naW5lLmphdmEKQEAgLTAsMCArMSwxNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLmdyb292eWRvYzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5Lmdyb292eWRvYy5Hcm9vdnlDbGFzc0RvYzsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5Lmdyb292eWRvYy5Hcm9vdnlQYWNrYWdlRG9jOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3Jvb3Z5ZG9jLkdyb292eVJvb3REb2M7CisKK2ltcG9ydCBncm9vdnkudGV4dC5HU3RyaW5nVGVtcGxhdGVFbmdpbmU7CitpbXBvcnQgZ3Jvb3Z5LnRleHQuVGVtcGxhdGU7CitpbXBvcnQgZ3Jvb3Z5LnRleHQuVGVtcGxhdGVFbmdpbmU7CisKKy8qCisgKiB0b2RvCisgKiAgY29tbWEgYXQgdGhlIGVuZCBvZiBtZXRob2QgcGFyYW1ldGVycworICogIGFkZCBjb21tZW50cworICogIHN0YXRpYyBtb2RpZmllcgorICogIG9yZGVyIG1ldGhvZHMgYWxwaGFiZXRpY2FsbHkgKGltcGxlbWVudCBjb21wYXJlVG8gZW5vdWdoPykKKyAqICBwcm92aWRlIGxpbmtzIHRvIG90aGVyIGh0bWwgZmlsZXMgKGUuZy4gcmV0dXJuIHR5cGUgb2YgYSBtZXRob2QpCisgKi8KK3B1YmxpYyBjbGFzcyBHcm9vdnlEb2NUZW1wbGF0ZUVuZ2luZSB7CisJcHJpdmF0ZSBUZW1wbGF0ZUVuZ2luZSBlbmdpbmU7CisJcHJpdmF0ZSBHcm9vdnlEb2NUb29sIHRvb2w7CisJcHJpdmF0ZSBSZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNYW5hZ2VyOworLy8JcHJpdmF0ZSBTdHJpbmcgcmVsYXRpdmVUZW1wbGF0ZVBhdGg7CisJcHJpdmF0ZSBNYXAgZG9jVGVtcGxhdGVzOyAvLyBjYWNoZQorCXByaXZhdGUgTGlzdCBkb2NUZW1wbGF0ZVBhdGhzOyAvLyBvbmNlIHBlciBkb2N1bWVudGF0aW9uIHNldAorCXByaXZhdGUgTWFwIHBhY2thZ2VUZW1wbGF0ZXM7IC8vIGNhY2hlCisJcHJpdmF0ZSBMaXN0IHBhY2thZ2VUZW1wbGF0ZVBhdGhzOyAvLyBvbmNlIHBlciBwYWNrYWdlCisJcHJpdmF0ZSBNYXAgY2xhc3NUZW1wbGF0ZXM7IC8vIGNhY2hlCisJcHJpdmF0ZSBMaXN0IGNsYXNzVGVtcGxhdGVQYXRoczsgLy8gb25jZSBwZXIgY2xhc3MKKwkKKwkKKwlwdWJsaWMgR3Jvb3Z5RG9jVGVtcGxhdGVFbmdpbmUoR3Jvb3Z5RG9jVG9vbCB0b29sLCBSZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNYW5hZ2VyLCBTdHJpbmcgY2xhc3NUZW1wbGF0ZSkgeworCQl0aGlzKHRvb2wsIHJlc291cmNlTWFuYWdlciwgbmV3IFN0cmluZ1tde30sIG5ldyBTdHJpbmdbXXt9LCBuZXcgU3RyaW5nW10ge2NsYXNzVGVtcGxhdGV9KTsKKwl9CisKKwlwdWJsaWMgR3Jvb3Z5RG9jVGVtcGxhdGVFbmdpbmUoR3Jvb3Z5RG9jVG9vbCB0b29sLCBSZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNYW5hZ2VyLAorCQkJU3RyaW5nW10gZG9jVGVtcGxhdGVzLCAKKwkJCVN0cmluZ1tdIHBhY2thZ2VUZW1wbGF0ZXMsIAorCQkJU3RyaW5nW10gY2xhc3NUZW1wbGF0ZXMpIHsKKwkJdGhpcy50b29sID0gdG9vbDsKKwkJdGhpcy5yZXNvdXJjZU1hbmFnZXIgPSByZXNvdXJjZU1hbmFnZXI7CisJCXRoaXMuZG9jVGVtcGxhdGVQYXRocyA9IEFycmF5cy5hc0xpc3QoZG9jVGVtcGxhdGVzKTsKKwkJdGhpcy5wYWNrYWdlVGVtcGxhdGVQYXRocyA9IEFycmF5cy5hc0xpc3QocGFja2FnZVRlbXBsYXRlcyk7CisJCXRoaXMuY2xhc3NUZW1wbGF0ZVBhdGhzID0gQXJyYXlzLmFzTGlzdChjbGFzc1RlbXBsYXRlcyk7CisJCXRoaXMuZG9jVGVtcGxhdGVzID0gbmV3IEhhc2hNYXAoKTsKKwkJdGhpcy5wYWNrYWdlVGVtcGxhdGVzID0gbmV3IEhhc2hNYXAoKTsKKwkJdGhpcy5jbGFzc1RlbXBsYXRlcyA9IG5ldyBIYXNoTWFwKCk7CisJCWVuZ2luZSA9IG5ldyBHU3RyaW5nVGVtcGxhdGVFbmdpbmUoKTsKKwkJCisJfQorCQorCVN0cmluZyBhcHBseUNsYXNzVGVtcGxhdGVzKEdyb292eUNsYXNzRG9jIGNsYXNzRG9jKSB7CisJCVN0cmluZyB0ZW1wbGF0ZVBhdGggPSAoU3RyaW5nKSBjbGFzc1RlbXBsYXRlUGF0aHMuZ2V0KDApOyAvLyB0b2RvIChpdGVyYXRlKQorCQkJCisJCVN0cmluZyB0ZW1wbGF0ZVdpdGhCaW5kaW5nQXBwbGllZCA9ICIiOworCQl0cnkgeworCQkJVGVtcGxhdGUgdCA9IChUZW1wbGF0ZSkgY2xhc3NUZW1wbGF0ZXMuZ2V0KHRlbXBsYXRlUGF0aCk7CisJCQlpZiAodCA9PSBudWxsKSB7CisJCQkJdCA9IGVuZ2luZS5jcmVhdGVUZW1wbGF0ZShyZXNvdXJjZU1hbmFnZXIuZ2V0UmVhZGVyKHRlbXBsYXRlUGF0aCkpOworCQkJCWNsYXNzVGVtcGxhdGVzLnB1dCh0ZW1wbGF0ZVBhdGgsIHQpOworCQkJfQorCQkJTWFwIGJpbmRpbmcgPSBuZXcgSGFzaE1hcCgpOworCSAgICAgICAgYmluZGluZy5wdXQoImNsYXNzRG9jIiwgY2xhc3NEb2MpOworCSAgICAgICAgCisJICAgICAgICB0ZW1wbGF0ZVdpdGhCaW5kaW5nQXBwbGllZCA9IHQubWFrZShiaW5kaW5nKS50b1N0cmluZygpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCQlyZXR1cm4gdGVtcGxhdGVXaXRoQmluZGluZ0FwcGxpZWQ7CisJfQorCisJU3RyaW5nIGFwcGx5UGFja2FnZVRlbXBsYXRlKFN0cmluZyB0ZW1wbGF0ZSwgR3Jvb3Z5UGFja2FnZURvYyBwYWNrYWdlRG9jKSB7CisJCVN0cmluZyB0ZW1wbGF0ZVBhdGggPSB0ZW1wbGF0ZTsKKwkJCQorCQlTdHJpbmcgdGVtcGxhdGVXaXRoQmluZGluZ0FwcGxpZWQgPSAiIjsKKwkJdHJ5IHsKKwkJCVRlbXBsYXRlIHQgPSAoVGVtcGxhdGUpIHBhY2thZ2VUZW1wbGF0ZXMuZ2V0KHRlbXBsYXRlUGF0aCk7CisJCQlpZiAodCA9PSBudWxsKSB7CisJCQkJdCA9IGVuZ2luZS5jcmVhdGVUZW1wbGF0ZShyZXNvdXJjZU1hbmFnZXIuZ2V0UmVhZGVyKHRlbXBsYXRlUGF0aCkpOworCQkJCXBhY2thZ2VUZW1wbGF0ZXMucHV0KHRlbXBsYXRlUGF0aCwgdCk7CisJCQl9CisKKwkJCU1hcCBiaW5kaW5nID0gbmV3IEhhc2hNYXAoKTsKKwkgICAgICAgIGJpbmRpbmcucHV0KCJwYWNrYWdlRG9jIiwgcGFja2FnZURvYyk7CisJICAgICAgICAKKwkgICAgICAgIHRlbXBsYXRlV2l0aEJpbmRpbmdBcHBsaWVkID0gdC5tYWtlKGJpbmRpbmcpLnRvU3RyaW5nKCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisJCXJldHVybiB0ZW1wbGF0ZVdpdGhCaW5kaW5nQXBwbGllZDsKKwl9CisKKwlTdHJpbmcgYXBwbHlSb290RG9jVGVtcGxhdGUoU3RyaW5nIHRlbXBsYXRlLCBHcm9vdnlSb290RG9jIHJvb3REb2MpIHsKKwkJU3RyaW5nIHRlbXBsYXRlUGF0aCA9IHRlbXBsYXRlOworCQkJCisJCVN0cmluZyB0ZW1wbGF0ZVdpdGhCaW5kaW5nQXBwbGllZCA9ICIiOworCQl0cnkgeworCQkJVGVtcGxhdGUgdCA9IChUZW1wbGF0ZSkgZG9jVGVtcGxhdGVzLmdldCh0ZW1wbGF0ZVBhdGgpOworCQkJaWYgKHQgPT0gbnVsbCkgeworCQkJCXQgPSBlbmdpbmUuY3JlYXRlVGVtcGxhdGUocmVzb3VyY2VNYW5hZ2VyLmdldFJlYWRlcih0ZW1wbGF0ZVBhdGgpKTsKKwkJCQlkb2NUZW1wbGF0ZXMucHV0KHRlbXBsYXRlUGF0aCwgdCk7CisJCQl9CisKKwkJCU1hcCBiaW5kaW5nID0gbmV3IEhhc2hNYXAoKTsKKwkgICAgICAgIGJpbmRpbmcucHV0KCJyb290RG9jIiwgcm9vdERvYyk7CisJICAgICAgICAKKwkgICAgICAgIHRlbXBsYXRlV2l0aEJpbmRpbmdBcHBsaWVkID0gdC5tYWtlKGJpbmRpbmcpLnRvU3RyaW5nKCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisJCXJldHVybiB0ZW1wbGF0ZVdpdGhCaW5kaW5nQXBwbGllZDsKKwl9CisKKwlJdGVyYXRvciBjbGFzc1RlbXBsYXRlc0l0ZXJhdG9yKCkgeworCQlyZXR1cm4gY2xhc3NUZW1wbGF0ZVBhdGhzLml0ZXJhdG9yKCk7CisJfQorCUl0ZXJhdG9yIHBhY2thZ2VUZW1wbGF0ZXNJdGVyYXRvcigpIHsKKwkJcmV0dXJuIHBhY2thZ2VUZW1wbGF0ZVBhdGhzLml0ZXJhdG9yKCk7CisJfQorCUl0ZXJhdG9yIGRvY1RlbXBsYXRlc0l0ZXJhdG9yKCkgeworCQlyZXR1cm4gZG9jVGVtcGxhdGVQYXRocy5pdGVyYXRvcigpOworCX0KKworLyoKKwlTdHJpbmcgYXBwbHlDbGFzc1RlbXBsYXRlc1dpdGhWZWxvY2l0eShHcm9vdnlDbGFzc0RvYyBjbGFzc0RvYykgeworLy8JCUl0ZXJhdG9yIHRlbXBsYXRlcyA9IGNsYXNzVGVtcGxhdGVzLml0ZXJhdG9yKCk7CisvLwkJd2hpbGUgKHRlbXBsYXRlcy5oYXNOZXh0KQorCQlTdHJpbmcgdGVtcGxhdGVQYXRoID0gKFN0cmluZykgY2xhc3NUZW1wbGF0ZXMuZ2V0KDApOyAvLyB0b2RvIChpdGVyYXRlKQorCQkJCisJCVN0cmluZyB0ZW1wbGF0ZVdpdGhCaW5kaW5nQXBwbGllZCA9ICIiOworCQl0cnkgeworLy8JCQlUZW1wbGF0ZSB0ID0gbmV3IEdTdHJpbmdUZW1wbGF0ZUVuZ2luZSgpLmNyZWF0ZVRlbXBsYXRlKHRlbXBsYXRlKTsKKwkJCVZlbG9jaXR5VGVtcGxhdGVFbmdpbmUgdCA9IG5ldyBWZWxvY2l0eVRlbXBsYXRlRW5naW5lKG5ldyBGaWxlKCIuIikuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisJCQlNYXAgYmluZGluZyA9IG5ldyBIYXNoTWFwKCk7CisJICAgICAgICBiaW5kaW5nLnB1dCgiY2xhc3NEb2MiLCBjbGFzc0RvYyk7CisJICAgICAgICAKKy8vCSAgICAgICAgdGVtcGxhdGVXaXRoQmluZGluZ0FwcGxpZWQgPSB0Lm1ha2UoYmluZGluZykudG9TdHJpbmcoKTsKKwkgICAgICAgIHRlbXBsYXRlV2l0aEJpbmRpbmdBcHBsaWVkID0gdC5hcHBseSh0ZW1wbGF0ZVBhdGgsYmluZGluZyk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisJCXJldHVybiB0ZW1wbGF0ZVdpdGhCaW5kaW5nQXBwbGllZDsKKwl9CisqLworCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9ncm9vdnlkb2MvR3Jvb3Z5RG9jVG9vbC5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvZ3Jvb3Z5ZG9jL0dyb292eURvY1Rvb2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDY4Yjg2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvZ3Jvb3Z5ZG9jL0dyb292eURvY1Rvb2wuamF2YQpAQCAtMCwwICsxLDg4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDcgSmVyZW15IFJheW5lcgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuZ3Jvb3Z5ZG9jOworCitpbXBvcnQgYW50bHIuUmVjb2duaXRpb25FeGNlcHRpb247CitpbXBvcnQgYW50bHIuVG9rZW5TdHJlYW1FeGNlcHRpb247CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncm9vdnlkb2MuR3Jvb3Z5Um9vdERvYzsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitwdWJsaWMgY2xhc3MgR3Jvb3Z5RG9jVG9vbCB7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgdXNlIGJ5IHBlb3BsZSB3aG8gb25seSB3YW50IHRvIGludGVyYWN0IHdpdGggdGhlIEdyb292eSBEb2NsZXQgVHJlZSAocm9vdERvYykKKyAgICAgKiBAcGFyYW0gc291cmNlcGF0aCB3aGVyZSB0aGUgc291cmNlcyB0byBiZSBhZGRlZCBjYW4gYmUgZm91bmQKKyAgICAgKi8KKyAgICBwdWJsaWMgR3Jvb3Z5RG9jVG9vbChTdHJpbmcgc291cmNlcGF0aCkgeworICAgICAgICB0aGlzKG51bGwsc291cmNlcGF0aCxudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgR3Jvb3Z5RG9jVG9vbChSZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNYW5hZ2VyLCBTdHJpbmcgc291cmNlcGF0aCwgU3RyaW5nIGNsYXNzVGVtcGxhdGUpIHsKKwkJdGhpcyhyZXNvdXJjZU1hbmFnZXIsIHNvdXJjZXBhdGgsIG5ldyBTdHJpbmdbXXt9LCBuZXcgU3RyaW5nW117fSwgbmV3IFN0cmluZ1tdIHtjbGFzc1RlbXBsYXRlfSk7CisJfQorCisJcHVibGljIEdyb292eURvY1Rvb2woUmVzb3VyY2VNYW5hZ2VyIHJlc291cmNlTWFuYWdlciwgU3RyaW5nIHNvdXJjZXBhdGgsIFN0cmluZ1tdIGRvY1RlbXBsYXRlcywgU3RyaW5nW10gcGFja2FnZVRlbXBsYXRlcywgU3RyaW5nW10gY2xhc3NUZW1wbGF0ZXMpIHsKKwkJcm9vdERvY0J1aWxkZXIgPSBuZXcgR3Jvb3Z5Um9vdERvY0J1aWxkZXIodGhpcywgc291cmNlcGF0aCk7CisJCWlmIChyZXNvdXJjZU1hbmFnZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGVtcGxhdGVFbmdpbmUgPSBudWxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGVtcGxhdGVFbmdpbmUgPSBuZXcgR3Jvb3Z5RG9jVGVtcGxhdGVFbmdpbmUodGhpcywgcmVzb3VyY2VNYW5hZ2VyLCBkb2NUZW1wbGF0ZXMsIHBhY2thZ2VUZW1wbGF0ZXMsIGNsYXNzVGVtcGxhdGVzKTsKKyAgICAgICAgfQorCX0KKwkKKwlwdWJsaWMgdm9pZCBhZGQoU3RyaW5nIGZpbGVuYW1lKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCWlmICh0ZW1wbGF0ZUVuZ2luZSAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBvbmx5IHByaW50IG91dCBpZiB3ZSBhcmUgYmVpbmcgdXNlZCBmb3IgdGVtcGxhdGUgZ2VuZXJhdGlvbgorICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJMb2FkaW5nIHNvdXJjZSBmaWxlcyBmb3IgIiArIGZpbGVuYW1lKTsKKyAgICAgICAgfQorCQlyb290RG9jQnVpbGRlci5idWlsZFRyZWUoZmlsZW5hbWUpOworCX0KKwkKKwlwdWJsaWMgR3Jvb3Z5Um9vdERvYyBnZXRSb290RG9jKCkgeworCQlyZXR1cm4gcm9vdERvY0J1aWxkZXIuZ2V0Um9vdERvYygpOworCX0KKworCXB1YmxpYyB2b2lkIHJlbmRlclRvT3V0cHV0KE91dHB1dFRvb2wgb3V0cHV0LCBTdHJpbmcgZGVzdGRpcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWlmICh0ZW1wbGF0ZUVuZ2luZSAhPSBudWxsKSB7CisgICAgICAgICAgICBHcm9vdnlEb2NXcml0ZXIgd3JpdGVyID0gbmV3IEdyb292eURvY1dyaXRlcih0aGlzLCBvdXRwdXQsIHRlbXBsYXRlRW5naW5lKTsKKyAgICAgICAgICAgIEdyb292eVJvb3REb2Mgcm9vdERvYyA9IHJvb3REb2NCdWlsZGVyLmdldFJvb3REb2MoKTsKKyAgICAgICAgICAgIHdyaXRlci53cml0ZVJvb3Qocm9vdERvYywgZGVzdGRpcik7CisgICAgICAgICAgICB3cml0ZXIud3JpdGVQYWNrYWdlcyhyb290RG9jLCBkZXN0ZGlyKTsKKyAgICAgICAgICAgIHdyaXRlci53cml0ZUNsYXNzZXMocm9vdERvYywgZGVzdGRpcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vIHRlbXBsYXRlIGVuZ2luZSB3YXMgZm91bmQiKTsKKyAgICAgICAgfQorCX0KKwkKKwlwcml2YXRlIGZpbmFsIEdyb292eVJvb3REb2NCdWlsZGVyIHJvb3REb2NCdWlsZGVyOworCXByaXZhdGUgZmluYWwgR3Jvb3Z5RG9jVGVtcGxhdGVFbmdpbmUgdGVtcGxhdGVFbmdpbmU7CisKKwlTdHJpbmcgZ2V0UGF0aChTdHJpbmcgZmlsZW5hbWUpIHsKKwkJU3RyaW5nIHBhdGggPSBuZXcgRmlsZShmaWxlbmFtZSkuZ2V0UGFyZW50KCk7CisJCS8vIHBhdGggbGVuZ3RoIG9mIDEgaW5kaWNhdGVzIHRoYXQgcHJvYmFibHkgaXMgJ2RlZmF1bHQgcGFja2FnZScgaS5lLiAiLyIKKwkJaWYgKHBhdGggPT0gbnVsbCB8fCBwYXRoLmxlbmd0aCgpID09IDEpIHsKKwkJCXBhdGggPSAiRGVmYXVsdFBhY2thZ2UiOyAvLyAiRGVmYXVsdFBhY2thZ2UiIGZvciAnZGVmYXVsdCBwYWNrYWdlJyBwYXRoLCByYXRoZXIgdGhhbiBudWxsLi4uCisJCX0KKwkJcmV0dXJuIHBhdGg7CisJfQorCVN0cmluZyBnZXRGaWxlKFN0cmluZyBmaWxlbmFtZSkgeworICAgICAgICByZXR1cm4gbmV3IEZpbGUoZmlsZW5hbWUpLmdldE5hbWUoKTsgICAgICAgIAorCX0KKwkJCisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2dyb292eWRvYy9Hcm9vdnlEb2NXcml0ZXIuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2dyb292eWRvYy9Hcm9vdnlEb2NXcml0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Yjc2NDZhCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvZ3Jvb3Z5ZG9jL0dyb292eURvY1dyaXRlci5qYXZhCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLmdyb292eWRvYzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncm9vdnlkb2MuR3Jvb3Z5Q2xhc3NEb2M7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncm9vdnlkb2MuR3Jvb3Z5UGFja2FnZURvYzsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5Lmdyb292eWRvYy5Hcm9vdnlSb290RG9jOworCisvKgorICogdG9kbworICogIGNvbW1hIGF0IHRoZSBlbmQgb2YgbWV0aG9kIHBhcmFtZXRlcnMKKyAqICBzdGF0aWMgbW9kaWZpZXIKKyAqICBvcmRlciBtZXRob2RzIGFscGhhYmV0aWNhbGx5IChpbXBsZW1lbnQgY29tcGFyZVRvIGVub3VnaD8pCisgKiAgcHJvdmlkZSBsaW5rcyB0byBvdGhlciBodG1sIGZpbGVzIChlLmcuIHJldHVybiB0eXBlIG9mIGEgbWV0aG9kKQorICovCitwdWJsaWMgY2xhc3MgR3Jvb3Z5RG9jV3JpdGVyIHsKKwlwcml2YXRlIEdyb292eURvY1Rvb2wgdG9vbDsKKwlwcml2YXRlIE91dHB1dFRvb2wgb3V0cHV0OworCXByaXZhdGUgR3Jvb3Z5RG9jVGVtcGxhdGVFbmdpbmUgdGVtcGxhdGVFbmdpbmU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZTID0gIi8iOworCisgICAgcHVibGljIEdyb292eURvY1dyaXRlcihHcm9vdnlEb2NUb29sIHRvb2wsIE91dHB1dFRvb2wgb3V0cHV0LCBHcm9vdnlEb2NUZW1wbGF0ZUVuZ2luZSB0ZW1wbGF0ZUVuZ2luZSkgeworCQl0aGlzLnRvb2wgPSB0b29sOworCQl0aGlzLm91dHB1dCA9IG91dHB1dDsKKwkJdGhpcy50ZW1wbGF0ZUVuZ2luZSA9IHRlbXBsYXRlRW5naW5lOworCX0KKworCXB1YmxpYyB2b2lkIHdyaXRlQ2xhc3NlcyhHcm9vdnlSb290RG9jIHJvb3REb2MsIFN0cmluZyBkZXN0ZGlyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSXRlcmF0b3IgY2xhc3NEb2NzID0gQXJyYXlzLmFzTGlzdChyb290RG9jLmNsYXNzZXMoKSkuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKGNsYXNzRG9jcy5oYXNOZXh0KCkpIHsKKwkJCUdyb292eUNsYXNzRG9jIGNsYXNzRG9jID0gKEdyb292eUNsYXNzRG9jKSBjbGFzc0RvY3MubmV4dCgpOworCQkJd3JpdGVDbGFzc1RvT3V0cHV0KGNsYXNzRG9jLCBkZXN0ZGlyKTsKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIHdyaXRlUm9vdChHcm9vdnlSb290RG9jIHJvb3REb2MsIFN0cmluZyBkZXN0ZGlyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJb3V0cHV0Lm1ha2VPdXRwdXRBcmVhKGRlc3RkaXIpOworCQl3cml0ZVJvb3REb2NUb091dHB1dChyb290RG9jLCBkZXN0ZGlyKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB3cml0ZUNsYXNzVG9PdXRwdXQoR3Jvb3Z5Q2xhc3NEb2MgY2xhc3NEb2MsIFN0cmluZyBkZXN0ZGlyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGRlc3RGaWxlTmFtZSA9IGRlc3RkaXIgKyBGUyArIGNsYXNzRG9jLmdldEZ1bGxQYXRoTmFtZSgpICsgIi5odG1sIjsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJHZW5lcmF0aW5nICIgKyBkZXN0RmlsZU5hbWUpOworCQlTdHJpbmcgcmVuZGVyZWRTcmMgPSB0ZW1wbGF0ZUVuZ2luZS5hcHBseUNsYXNzVGVtcGxhdGVzKGNsYXNzRG9jKTsvLyB0b2RvCQkKKwkJb3V0cHV0LndyaXRlVG9PdXRwdXQoZGVzdEZpbGVOYW1lLCByZW5kZXJlZFNyYyk7CisJfQkKKworCXB1YmxpYyB2b2lkIHdyaXRlUGFja2FnZXMoR3Jvb3Z5Um9vdERvYyByb290RG9jLCBTdHJpbmcgZGVzdGRpcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUl0ZXJhdG9yIHBhY2thZ2VEb2NzID0gQXJyYXlzLmFzTGlzdChyb290RG9jLnNwZWNpZmllZFBhY2thZ2VzKCkpLml0ZXJhdG9yKCk7CisJCXdoaWxlIChwYWNrYWdlRG9jcy5oYXNOZXh0KCkpIHsKKwkJCUdyb292eVBhY2thZ2VEb2MgcGFja2FnZURvYyA9IChHcm9vdnlQYWNrYWdlRG9jKSBwYWNrYWdlRG9jcy5uZXh0KCk7CisJCQlvdXRwdXQubWFrZU91dHB1dEFyZWEoZGVzdGRpciArIEZTICsgcGFja2FnZURvYy5uYW1lKCkpOworCQkJd3JpdGVQYWNrYWdlVG9PdXRwdXQocGFja2FnZURvYywgZGVzdGRpcik7CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCB3cml0ZVBhY2thZ2VUb091dHB1dChHcm9vdnlQYWNrYWdlRG9jIHBhY2thZ2VEb2MsIFN0cmluZyBkZXN0ZGlyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSXRlcmF0b3IgdGVtcGxhdGVzID0gdGVtcGxhdGVFbmdpbmUucGFja2FnZVRlbXBsYXRlc0l0ZXJhdG9yKCk7CisJCXdoaWxlICh0ZW1wbGF0ZXMuaGFzTmV4dCgpKSB7CisJCQlTdHJpbmcgdGVtcGxhdGUgPSAoU3RyaW5nKSB0ZW1wbGF0ZXMubmV4dCgpOworCisJCQlTdHJpbmcgcmVuZGVyZWRTcmMgPSB0ZW1wbGF0ZUVuZ2luZS5hcHBseVBhY2thZ2VUZW1wbGF0ZSh0ZW1wbGF0ZSwgcGFja2FnZURvYyk7IC8vIHRvZG8KKwkJCQorCQkJU3RyaW5nIGRlc3RGaWxlTmFtZSA9IGRlc3RkaXIgKyBGUyArIHBhY2thZ2VEb2MubmFtZSgpICsgRlMgKyB0b29sLmdldEZpbGUodGVtcGxhdGUpOworCQkJU3lzdGVtLm91dC5wcmludGxuKCJHZW5lcmF0aW5nICIgKyBkZXN0RmlsZU5hbWUpOworCQkJb3V0cHV0LndyaXRlVG9PdXRwdXQoZGVzdEZpbGVOYW1lLCByZW5kZXJlZFNyYyk7CisJCX0KKwl9CQorCisJcHVibGljIHZvaWQgd3JpdGVSb290RG9jVG9PdXRwdXQoR3Jvb3Z5Um9vdERvYyByb290RG9jLCBTdHJpbmcgZGVzdGRpcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUl0ZXJhdG9yIHRlbXBsYXRlcyA9IHRlbXBsYXRlRW5naW5lLmRvY1RlbXBsYXRlc0l0ZXJhdG9yKCk7CisJCXdoaWxlICh0ZW1wbGF0ZXMuaGFzTmV4dCgpKSB7CisJCQlTdHJpbmcgdGVtcGxhdGUgPSAoU3RyaW5nKSB0ZW1wbGF0ZXMubmV4dCgpOworCisJCQlTdHJpbmcgcmVuZGVyZWRTcmMgPSB0ZW1wbGF0ZUVuZ2luZS5hcHBseVJvb3REb2NUZW1wbGF0ZSh0ZW1wbGF0ZSwgcm9vdERvYyk7IC8vIHRvZG8KKwkJCQorCQkJU3RyaW5nIGRlc3RGaWxlTmFtZSA9IGRlc3RkaXIgKyBGUyArIHRvb2wuZ2V0RmlsZSh0ZW1wbGF0ZSk7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkdlbmVyYXRpbmcgIiArIGRlc3RGaWxlTmFtZSk7CisJCQlvdXRwdXQud3JpdGVUb091dHB1dChkZXN0RmlsZU5hbWUsIHJlbmRlcmVkU3JjKTsKKwkJfQorCX0JCisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2dyb292eWRvYy9Hcm9vdnlSb290RG9jQnVpbGRlci5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvZ3Jvb3Z5ZG9jL0dyb292eVJvb3REb2NCdWlsZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdkOWYyMQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2dyb292eWRvYy9Hcm9vdnlSb290RG9jQnVpbGRlci5qYXZhCkBAIC0wLDAgKzEsMTc3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5ncm9vdnlkb2M7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hbnRsci5BbnRsckFTVFByb2Nlc3NvcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudGxyLlNvdXJjZUJ1ZmZlcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudGxyLlVuaWNvZGVFc2NhcGluZ1JlYWRlcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudGxyLmphdmEuR3Jvb3ZpZmllcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudGxyLmphdmEuSmF2YTJHcm9vdnlDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hbnRsci5qYXZhLkphdmFMZXhlcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudGxyLmphdmEuSmF2YVJlY29nbml6ZXI7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hbnRsci5wYXJzZXIuR3Jvb3Z5TGV4ZXI7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hbnRsci5wYXJzZXIuR3Jvb3Z5UmVjb2duaXplcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudGxyLnRyZWV3YWxrZXIuUHJlT3JkZXJUcmF2ZXJzYWw7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hbnRsci50cmVld2Fsa2VyLlNvdXJjZUNvZGVUcmF2ZXJzYWw7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hbnRsci50cmVld2Fsa2VyLlZpc2l0b3I7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncm9vdnlkb2MuR3Jvb3Z5Um9vdERvYzsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuRGVmYXVsdEdyb292eU1ldGhvZHM7CisKKworaW1wb3J0IGFudGxyLlJlY29nbml0aW9uRXhjZXB0aW9uOworaW1wb3J0IGFudGxyLlRva2VuU3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IGFudGxyLmNvbGxlY3Rpb25zLkFTVDsKKworLyoKKyAqIHRvZG8KKyAqICBjb21tYSBhdCB0aGUgZW5kIG9mIG1ldGhvZCBwYXJhbWV0ZXJzCisgKiAgYWRkIGNvbW1lbnRzCisgKiAgc3RhdGljIG1vZGlmaWVyCisgKiAgb3JkZXIgbWV0aG9kcyBhbHBoYWJldGljYWxseSAoaW1wbGVtZW50IGNvbXBhcmVUbyBlbm91Z2g/KQorICogIHByb3ZpZGUgbGlua3MgdG8gb3RoZXIgaHRtbCBmaWxlcyAoZS5nLiByZXR1cm4gdHlwZSBvZiBhIG1ldGhvZCkKKyAqLworcHVibGljIGNsYXNzIEdyb292eVJvb3REb2NCdWlsZGVyIHsKKwlwcml2YXRlIGZpbmFsIEdyb292eURvY1Rvb2wgdG9vbDsKKwlwcml2YXRlIGZpbmFsIFN0cmluZyBzb3VyY2VwYXRoOworCXByaXZhdGUgZmluYWwgU2ltcGxlR3Jvb3Z5Um9vdERvYyByb290RG9jOworCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgRlMgPSAnLyc7CisKKwkKKwlwdWJsaWMgR3Jvb3Z5Um9vdERvY0J1aWxkZXIoR3Jvb3Z5RG9jVG9vbCB0b29sLAorCQkJU3RyaW5nIHNvdXJjZXBhdGgpIHsKKwkJdGhpcy50b29sID0gdG9vbDsKKwkJdGhpcy5zb3VyY2VwYXRoID0gc291cmNlcGF0aDsKKwkJCisJCXRoaXMucm9vdERvYyA9IG5ldyBTaW1wbGVHcm9vdnlSb290RG9jKCJyb290Iik7CisJfQorCisJCisJLy8gcGFyc2luZworCXB1YmxpYyBNYXAgZ2V0Q2xhc3NEb2NzRnJvbVNpbmdsZVNvdXJjZShTdHJpbmcgcGFja2FnZVBhdGgsIFN0cmluZyBmaWxlLCBTdHJpbmcgc3JjKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsKKwkJTWFwIGNsYXNzRG9jc0Zyb21TcmMgPSBudWxsOworCQlpZiAoZmlsZS5pbmRleE9mKCIuamF2YSIpID4gMCkgeyAvLyBzaW1wbGUgKGZvciBub3cpIGRlY2lzaW9uIG9uIGphdmEgb3IgZ3Jvb3Z5CisJCQkvLyBqYXZhCisJCQljbGFzc0RvY3NGcm9tU3JjID0gcGFyc2VKYXZhKHBhY2thZ2VQYXRoLCBmaWxlLCBzcmMpOworCQl9IGVsc2UgaWYgKGZpbGUuaW5kZXhPZigiLnNvdXJjZWZpbGUiKSA+IDApeworCQkJLy8gamF2YSAoc3BlY2lhbCBuYW1lIHVzZWQgZm9yIHRlc3RpbmcpCisJCQljbGFzc0RvY3NGcm9tU3JjID0gcGFyc2VKYXZhKHBhY2thZ2VQYXRoLCBmaWxlLCBzcmMpOworCQl9IGVsc2UgeworCQkJLy8gbm90IGphdmEsIHRyeSBncm9vdnkgaW5zdGVhZCA6LSkKKwkJCWNsYXNzRG9jc0Zyb21TcmMgPSBwYXJzZUdyb292eShwYWNrYWdlUGF0aCwgZmlsZSwgc3JjKTsKKwkJfQkJCisJCXJldHVybiBjbGFzc0RvY3NGcm9tU3JjOworCX0KKworCXByaXZhdGUgTWFwIHBhcnNlSmF2YShTdHJpbmcgcGFja2FnZVBhdGgsIFN0cmluZyBmaWxlLCBTdHJpbmcgc3JjKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgU291cmNlQnVmZmVyIHNvdXJjZUJ1ZmZlciA9IG5ldyBTb3VyY2VCdWZmZXIoKTsKKyAgICAgICAgSmF2YVJlY29nbml6ZXIgcGFyc2VyID0gZ2V0SmF2YVBhcnNlcihzcmMsIHNvdXJjZUJ1ZmZlcik7CisgICAgICAgIFN0cmluZ1tdIHRva2VuTmFtZXMgPSBwYXJzZXIuZ2V0VG9rZW5OYW1lcygpOworICAgICAgICBwYXJzZXIuY29tcGlsYXRpb25Vbml0KCk7CisgICAgICAgIEFTVCBhc3QgPSBwYXJzZXIuZ2V0QVNUKCk7CisKKyAgICAgICAgLy8gbW9kaWZ5IHRoZSBKYXZhIEFTVCBpbnRvIGEgR3Jvb3Z5IEFTVCAoanVzdCB0b2tlbiB0eXBlcykKKwkJVmlzaXRvciBqYXZhMmdyb292eUNvbnZlcnRlciA9IG5ldyBKYXZhMkdyb292eUNvbnZlcnRlcih0b2tlbk5hbWVzKTsKKyAgICAgICAgQW50bHJBU1RQcm9jZXNzb3IgamF2YTJncm9vdnlUcmF2ZXJzZXIgPSBuZXcgUHJlT3JkZXJUcmF2ZXJzYWwoamF2YTJncm9vdnlDb252ZXJ0ZXIpOworICAgICAgICBqYXZhMmdyb292eVRyYXZlcnNlci5wcm9jZXNzKGFzdCk7CisKKyAgICAgICAgLy8gbm93IG11dGF0ZSAoZ3Jvb3ZpZnkpIHRoZSBhc3QgaW50byBncm9vdnkKKwkJVmlzaXRvciBncm9vdmlmaWVyID0gbmV3IEdyb292aWZpZXIodG9rZW5OYW1lcyk7CisgICAgICAgIEFudGxyQVNUUHJvY2Vzc29yIGdyb292aWZpZXJUcmF2ZXJzZXIgPSBuZXcgUHJlT3JkZXJUcmF2ZXJzYWwoZ3Jvb3ZpZmllcik7CisgICAgICAgIGdyb292aWZpZXJUcmF2ZXJzZXIucHJvY2Vzcyhhc3QpOworCisgICAgICAgIAorICAgICAgICAvLyBub3cgZG8gdGhlIGJ1c2luZXNzICAgICAKKyAgICAgICAgVmlzaXRvciB2aXNpdG9yID0gbmV3IFNpbXBsZUdyb292eUNsYXNzRG9jQXNzZW1ibGVyKHBhY2thZ2VQYXRoLCBmaWxlLCBzb3VyY2VCdWZmZXIpOworICAgICAgICBBbnRsckFTVFByb2Nlc3NvciB0cmF2ZXJzZXIgPSBuZXcgU291cmNlQ29kZVRyYXZlcnNhbCh2aXNpdG9yKTsKKworICAgICAgICB0cmF2ZXJzZXIucHJvY2Vzcyhhc3QpOworICAgICAgICAKKyAgICAgICAgcmV0dXJuICgoU2ltcGxlR3Jvb3Z5Q2xhc3NEb2NBc3NlbWJsZXIpIHZpc2l0b3IpLmdldEdyb292eUNsYXNzRG9jcygpOworCX0KKwkKKwlwcml2YXRlIE1hcCBwYXJzZUdyb292eShTdHJpbmcgcGFja2FnZVBhdGgsIFN0cmluZyBmaWxlLCBTdHJpbmcgc3JjKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgU291cmNlQnVmZmVyIHNvdXJjZUJ1ZmZlciA9IG5ldyBTb3VyY2VCdWZmZXIoKTsKKyAgICAgICAgR3Jvb3Z5UmVjb2duaXplciBwYXJzZXIgPSBnZXRHcm9vdnlQYXJzZXIoc3JjLCBzb3VyY2VCdWZmZXIpOworICAgICAgICBTdHJpbmdbXSB0b2tlbk5hbWVzID0gcGFyc2VyLmdldFRva2VuTmFtZXMoKTsKKyAgICAgICAgcGFyc2VyLmNvbXBpbGF0aW9uVW5pdCgpOworICAgICAgICBBU1QgYXN0ID0gcGFyc2VyLmdldEFTVCgpOworCisgICAgICAgIC8vIG5vdyBkbyB0aGUgYnVzaW5lc3MgICAgIAorICAgICAgICBWaXNpdG9yIHZpc2l0b3IgPSBuZXcgU2ltcGxlR3Jvb3Z5Q2xhc3NEb2NBc3NlbWJsZXIocGFja2FnZVBhdGgsIGZpbGUsIHNvdXJjZUJ1ZmZlcik7CisgICAgICAgIEFudGxyQVNUUHJvY2Vzc29yIHRyYXZlcnNlciA9IG5ldyBTb3VyY2VDb2RlVHJhdmVyc2FsKHZpc2l0b3IpOworCisgICAgICAgIHRyYXZlcnNlci5wcm9jZXNzKGFzdCk7CisgICAgICAgIAorICAgICAgICByZXR1cm4gKChTaW1wbGVHcm9vdnlDbGFzc0RvY0Fzc2VtYmxlcikgdmlzaXRvcikuZ2V0R3Jvb3Z5Q2xhc3NEb2NzKCk7CisJfQorCQorCXByaXZhdGUgSmF2YVJlY29nbml6ZXIgZ2V0SmF2YVBhcnNlcihTdHJpbmcgaW5wdXQsIFNvdXJjZUJ1ZmZlciBzb3VyY2VCdWZmZXIpIHsKKwkJSmF2YVJlY29nbml6ZXIgcGFyc2VyID0gbnVsbDsKKyAgICAgICAgVW5pY29kZUVzY2FwaW5nUmVhZGVyIHVuaWNvZGVSZWFkZXIgPSBuZXcgVW5pY29kZUVzY2FwaW5nUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoaW5wdXQpLHNvdXJjZUJ1ZmZlcik7CisgICAgICAgIEphdmFMZXhlciBsZXhlciA9IG5ldyBKYXZhTGV4ZXIodW5pY29kZVJlYWRlcik7CisgICAgICAgIHVuaWNvZGVSZWFkZXIuc2V0TGV4ZXIobGV4ZXIpOworICAgICAgICBwYXJzZXIgPSBKYXZhUmVjb2duaXplci5tYWtlKGxleGVyKTsKKyAgICAgICAgcGFyc2VyLnNldFNvdXJjZUJ1ZmZlcihzb3VyY2VCdWZmZXIpOworCQlyZXR1cm4gcGFyc2VyOworCX0KKworCXByaXZhdGUgR3Jvb3Z5UmVjb2duaXplciBnZXRHcm9vdnlQYXJzZXIoU3RyaW5nIGlucHV0LCBTb3VyY2VCdWZmZXIgc291cmNlQnVmZmVyKSB7CisJCUdyb292eVJlY29nbml6ZXIgcGFyc2VyID0gbnVsbDsKKyAgICAgICAgVW5pY29kZUVzY2FwaW5nUmVhZGVyIHVuaWNvZGVSZWFkZXIgPSBuZXcgVW5pY29kZUVzY2FwaW5nUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoaW5wdXQpLHNvdXJjZUJ1ZmZlcik7CisgICAgICAgIEdyb292eUxleGVyIGxleGVyID0gbmV3IEdyb292eUxleGVyKHVuaWNvZGVSZWFkZXIpOworICAgICAgICB1bmljb2RlUmVhZGVyLnNldExleGVyKGxleGVyKTsKKyAgICAgICAgcGFyc2VyID0gR3Jvb3Z5UmVjb2duaXplci5tYWtlKGxleGVyKTsKKyAgICAgICAgcGFyc2VyLnNldFNvdXJjZUJ1ZmZlcihzb3VyY2VCdWZmZXIpOworCQlyZXR1cm4gcGFyc2VyOworCX0KKworCXB1YmxpYyB2b2lkIGJ1aWxkVHJlZShTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiwgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsKKwkJU3RyaW5nIHNyY0ZpbGVOYW1lID0gc291cmNlcGF0aCArIEZTICsgZmlsZW5hbWU7CisJCVN0cmluZyBzcmMgPSBEZWZhdWx0R3Jvb3Z5TWV0aG9kcy5nZXRUZXh0KG5ldyBGaWxlKHNyY0ZpbGVOYW1lKSk7CisKKwkJU3RyaW5nIHBhY2thZ2VQYXRoID0gdG9vbC5nZXRQYXRoKGZpbGVuYW1lKTsKKwkJcGFja2FnZVBhdGggPSBwYWNrYWdlUGF0aC5yZXBsYWNlKCdcXCcsIEZTKTsKKwkJU3RyaW5nIGZpbGUgPSB0b29sLmdldEZpbGUoZmlsZW5hbWUpOworCQl0cnkgeworCQkJTWFwIGNsYXNzRG9jcyA9IGdldENsYXNzRG9jc0Zyb21TaW5nbGVTb3VyY2UocGFja2FnZVBhdGgsIGZpbGUsIHNyYyk7CisJCQorCQkJcm9vdERvYy5wdXRBbGxDbGFzc2VzKGNsYXNzRG9jcyk7CisKKwkJCVNpbXBsZUdyb292eVBhY2thZ2VEb2MgcGFja2FnZURvYyA9IChTaW1wbGVHcm9vdnlQYWNrYWdlRG9jKSByb290RG9jLnBhY2thZ2VOYW1lZChwYWNrYWdlUGF0aCk7CisJCQlpZiAocGFja2FnZURvYyA9PSBudWxsKSB7CisJCQkJcGFja2FnZURvYyA9IG5ldyBTaW1wbGVHcm9vdnlQYWNrYWdlRG9jKHBhY2thZ2VQYXRoKTsKKwkJCX0KKwkJCXBhY2thZ2VEb2MucHV0QWxsKGNsYXNzRG9jcyk7CQkKKwkJCXJvb3REb2MucHV0KHBhY2thZ2VQYXRoLCBwYWNrYWdlRG9jKTsKKwkJfSBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZSkgeworCQkJU3lzdGVtLm91dC5wcmludGxuKCJpZ25vcmVkIGR1ZSB0byBSZWNvZ25pdGlvbkV4Y2VwdGlvbjogIiArIGZpbGVuYW1lKTsKKwkJfSBjYXRjaCAoVG9rZW5TdHJlYW1FeGNlcHRpb24gZSkgeworCQkJU3lzdGVtLm91dC5wcmludGxuKCJpZ25vcmVkIGR1ZSB0byBUb2tlblN0cmVhbUV4Y2VwdGlvbjogIiArIGZpbGVuYW1lKTsKKwkJfQorCX0KKworCisJcHVibGljIEdyb292eVJvb3REb2MgZ2V0Um9vdERvYygpIHsKKwkJcm9vdERvYy5yZXNvbHZlKCk7CisJCQorCQlyZXR1cm4gcm9vdERvYzsKKwl9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9ncm9vdnlkb2MvTW9ja091dHB1dFRvb2wuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2dyb292eWRvYy9Nb2NrT3V0cHV0VG9vbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ODNiMDcKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9ncm9vdnlkb2MvTW9ja091dHB1dFRvb2wuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5ncm9vdnlkb2M7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK3B1YmxpYyBjbGFzcyBNb2NrT3V0cHV0VG9vbCBpbXBsZW1lbnRzIE91dHB1dFRvb2wgeworCVNldCBvdXRwdXRBcmVhczsgLy8gZGlycworCU1hcCBvdXRwdXQ7CisJCisJcHVibGljIE1vY2tPdXRwdXRUb29sKCkgeworCQlvdXRwdXRBcmVhcyA9IG5ldyBIYXNoU2V0KCk7CisJCW91dHB1dCA9IG5ldyBIYXNoTWFwKCk7CisJfQorCQorCXB1YmxpYyB2b2lkIG1ha2VPdXRwdXRBcmVhKFN0cmluZyBmaWxlbmFtZSkgeworCQlvdXRwdXRBcmVhcy5hZGQoZmlsZW5hbWUpOworCX0KKworCXB1YmxpYyB2b2lkIHdyaXRlVG9PdXRwdXQoU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgdGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCW91dHB1dC5wdXQoZmlsZU5hbWUsIHRleHQpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkT3V0cHV0QXJlYShTdHJpbmcgZmlsZU5hbWUpIHsKKwkJcmV0dXJuIG91dHB1dEFyZWFzLmNvbnRhaW5zKGZpbGVOYW1lKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoU3RyaW5nIGZpbGVOYW1lKSB7CisJCXJldHVybiAoU3RyaW5nKSBvdXRwdXQuZ2V0KGZpbGVOYW1lKTsKKwl9CisJCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJkaXJzOiIgKyBvdXRwdXRBcmVhcyArICIsIGZpbGVzOiIgKyBvdXRwdXQua2V5U2V0KCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvZ3Jvb3Z5ZG9jL091dHB1dFRvb2wuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2dyb292eWRvYy9PdXRwdXRUb29sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk5YWExYQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2dyb292eWRvYy9PdXRwdXRUb29sLmphdmEKQEAgLTAsMCArMSwyMSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuZ3Jvb3Z5ZG9jOworCitwdWJsaWMgaW50ZXJmYWNlIE91dHB1dFRvb2wgeworCXZvaWQgbWFrZU91dHB1dEFyZWEoU3RyaW5nIGZpbGVuYW1lKTsKKwl2b2lkIHdyaXRlVG9PdXRwdXQoU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgdGV4dCkgdGhyb3dzIEV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2dyb292eWRvYy9SZXNvdXJjZU1hbmFnZXIuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2dyb292eWRvYy9SZXNvdXJjZU1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmEzMzM2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvZ3Jvb3Z5ZG9jL1Jlc291cmNlTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLmdyb292eWRvYzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CisKK3B1YmxpYyBpbnRlcmZhY2UgUmVzb3VyY2VNYW5hZ2VyIHsKKwlSZWFkZXIgZ2V0UmVhZGVyKFN0cmluZyByZXNvdXJjZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2dyb292eWRvYy9TaW1wbGVHcm9vdnlDbGFzc0RvYy5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvZ3Jvb3Z5ZG9jL1NpbXBsZUdyb292eUNsYXNzRG9jLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUzZjJlNAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2dyb292eWRvYy9TaW1wbGVHcm9vdnlDbGFzc0RvYy5qYXZhCkBAIC0wLDAgKzEsMTQ5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5ncm9vdnlkb2M7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncm9vdnlkb2MuKjsKKworcHVibGljIGNsYXNzIFNpbXBsZUdyb292eUNsYXNzRG9jIGV4dGVuZHMgU2ltcGxlR3Jvb3Z5UHJvZ3JhbUVsZW1lbnREb2MgaW1wbGVtZW50cyBHcm9vdnlDbGFzc0RvYyB7CisJcHJpdmF0ZSBmaW5hbCBMaXN0IGNvbnN0cnVjdG9yczsKKwlwcml2YXRlIGZpbmFsIExpc3QgZmllbGRzOworCXByaXZhdGUgZmluYWwgTGlzdCBtZXRob2RzOworCXByaXZhdGUgU3RyaW5nIGZ1bGxQYXRoTmFtZTsKKworCXByaXZhdGUgU3RyaW5nIHN1cGVyQ2xhc3NOYW1lOworCXByaXZhdGUgR3Jvb3Z5Q2xhc3NEb2Mgc3VwZXJDbGFzczsKKwkKKwlwdWJsaWMgU2ltcGxlR3Jvb3Z5Q2xhc3NEb2MoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJCWNvbnN0cnVjdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJZmllbGRzID0gbmV3IEFycmF5TGlzdCgpOworCQltZXRob2RzID0gbmV3IEFycmF5TGlzdCgpOworCX0KKworCS8qKgorCSAqIHJldHVybnMgYSBzb3J0ZWQgYXJyYXkgb2YgY29uc3RydWN0b3JzCisJICovCisJcHVibGljIEdyb292eUNvbnN0cnVjdG9yRG9jW10gY29uc3RydWN0b3JzKCkgeworCQlDb2xsZWN0aW9ucy5zb3J0KGNvbnN0cnVjdG9ycyk7IC8vIHRvZG8gLSBwZXJmb3JtYW5jZSAvIG1heWJlIG1vdmUgaW50byBhIHNvcnRNZSgpIG1ldGhvZAorCQlyZXR1cm4gKEdyb292eUNvbnN0cnVjdG9yRG9jW10pIGNvbnN0cnVjdG9ycy50b0FycmF5KG5ldyBHcm9vdnlDb25zdHJ1Y3RvckRvY1tjb25zdHJ1Y3RvcnMuc2l6ZSgpXSk7CisJfQorCXB1YmxpYyBib29sZWFuIGFkZChHcm9vdnlDb25zdHJ1Y3RvckRvYyBjb25zdHJ1Y3RvcikgeworCQlyZXR1cm4gY29uc3RydWN0b3JzLmFkZChjb25zdHJ1Y3Rvcik7CisJfQorCisJLyoqCisJICogcmV0dXJucyBhIHNvcnRlZCBhcnJheSBvZiBmaWVsZHMKKwkgKi8KKwlwdWJsaWMgR3Jvb3Z5RmllbGREb2NbXSBmaWVsZHMoKSB7CisJCUNvbGxlY3Rpb25zLnNvcnQoZmllbGRzKTsgLy8gdG9kbyAtIHBlcmZvcm1hbmNlIC8gbWF5YmUgbW92ZSBpbnRvIGEgc29ydE1lKCkgbWV0aG9kCisJCXJldHVybiAoR3Jvb3Z5RmllbGREb2NbXSkgZmllbGRzLnRvQXJyYXkobmV3IEdyb292eUZpZWxkRG9jW2ZpZWxkcy5zaXplKCldKTsKKwl9CisJcHVibGljIGJvb2xlYW4gYWRkKEdyb292eUZpZWxkRG9jIGZpZWxkKSB7CisJCXJldHVybiBmaWVsZHMuYWRkKGZpZWxkKTsKKwl9CisKKwkvKioKKwkgKiByZXR1cm5zIGEgc29ydGVkIGFycmF5IG9mIG1ldGhvZHMKKwkgKi8KKwlwdWJsaWMgR3Jvb3Z5TWV0aG9kRG9jW10gbWV0aG9kcygpIHsKKwkJQ29sbGVjdGlvbnMuc29ydChtZXRob2RzKTsgLy8gdG9kbyAtIHBlcmZvcm1hbmNlIC8gbWF5YmUgbW92ZSBpbnRvIGEgc29ydE1lKCkgbWV0aG9kCisJCXJldHVybiAoR3Jvb3Z5TWV0aG9kRG9jW10pIG1ldGhvZHMudG9BcnJheShuZXcgR3Jvb3Z5TWV0aG9kRG9jW21ldGhvZHMuc2l6ZSgpXSk7CisJfQorCXB1YmxpYyBib29sZWFuIGFkZChHcm9vdnlNZXRob2REb2MgbWV0aG9kKSB7CisJCXJldHVybiBtZXRob2RzLmFkZChtZXRob2QpOworCX0KKwkJCisJcHVibGljIFN0cmluZyBnZXRGdWxsUGF0aE5hbWUoKSB7CisJCXJldHVybiBmdWxsUGF0aE5hbWU7CisJfQorCXB1YmxpYyB2b2lkIHNldEZ1bGxQYXRoTmFtZShTdHJpbmcgZnVsbFBhdGhOYW1lKSB7CisJCXRoaXMuZnVsbFBhdGhOYW1lID0gZnVsbFBhdGhOYW1lOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldFJlbGF0aXZlUm9vdFBhdGgoKSB7CisJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGZ1bGxQYXRoTmFtZSwgIi8iKTsgLy8gdG9kbyB3aW5kb3dzPz8KKwkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgeworCQkJdG9rZW5pemVyLm5leHRUb2tlbigpOworCQkJc2IuYXBwZW5kKCIuLi8iKTsKKwkJfQorCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKKwl9CQorCQorCXB1YmxpYyB2b2lkIHNldFN1cGVyQ2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKKwkJc3VwZXJDbGFzc05hbWUgPSBjbGFzc05hbWU7CisJfQorCXB1YmxpYyBHcm9vdnlDbGFzc0RvYyBzdXBlcmNsYXNzKCkgeworCQlyZXR1cm4gc3VwZXJDbGFzczsKKwl9CisJCisJdm9pZCByZXNvbHZlKEdyb292eVJvb3REb2Mgcm9vdERvYykgeworCQkvL3Jlc29sdmUgdHlwZSByZWZlcmVuY2VzCisJCWlmIChzdXBlckNsYXNzTmFtZSAhPSBudWxsKSB7CisJCQlzdXBlckNsYXNzID0gcm9vdERvYy5jbGFzc05hbWVkKHN1cGVyQ2xhc3NOYW1lKTsgLy8gdG9kbyAtIHRha2UgcGFja2FnZSBuYW1lcyBpbnRvIGFjY291bnQgPyEKKwkJCWlmIChzdXBlckNsYXNzID09IG51bGwpIHsKKwkJCQkvLyBUaGUgc3VwZXJDbGFzcyBpcyBub3QgaW4gdGhlIHRyZWUgYmVpbmcgZG9jdW1lbnRlZAorCQkJCXN1cGVyQ2xhc3MgPSBuZXcgU2ltcGxlR3Jvb3Z5Q2xhc3NEb2Moc3VwZXJDbGFzc05hbWUpOyAvLyBkdW1teSBjbGFzcyB3aXRoIG5hbWUsIG5vdCB0byBiZSBwdXQgaW50byBtYWluIHRyZWUKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXN1cGVyQ2xhc3MgPSBuZXcgU2ltcGxlR3Jvb3Z5Q2xhc3NEb2MoIk9iamVjdCIpOyAvLyBkdW1teSBjbGFzcyByZXByZXNlbnRpbmcgamF2YS5sYW5nLk9iamVjdCwgbm90IHRvIGJlIHB1dCBpbnRvIG1haW4gdHJlZQorCQl9CisJfQorCS8vIG1ldGhvZHMgZnJvbSBHcm9vdnlDbGFzc0RvYworCQorCXB1YmxpYyBHcm9vdnlDb25zdHJ1Y3RvckRvY1tdIGNvbnN0cnVjdG9ycyhib29sZWFuIGZpbHRlcikgey8qdG9kbyovcmV0dXJuIG51bGw7fQorCXB1YmxpYyBib29sZWFuIGRlZmluZXNTZXJpYWxpemFibGVGaWVsZHMoKSB7Lyp0b2RvKi9yZXR1cm4gZmFsc2U7fQorCXB1YmxpYyBHcm9vdnlGaWVsZERvY1tdIGVudW1Db25zdGFudHMoKSB7Lyp0b2RvKi9yZXR1cm4gbnVsbDt9CisJcHVibGljIEdyb292eUZpZWxkRG9jW10gZmllbGRzKGJvb2xlYW4gZmlsdGVyKSB7Lyp0b2RvKi9yZXR1cm4gbnVsbDt9CisJcHVibGljIEdyb292eUNsYXNzRG9jIGZpbmRDbGFzcyhTdHJpbmcgY2xhc3NOYW1lKSB7Lyp0b2RvKi9yZXR1cm4gbnVsbDt9CisJcHVibGljIEdyb292eUNsYXNzRG9jW10gaW1wb3J0ZWRDbGFzc2VzKCkgey8qdG9kbyovcmV0dXJuIG51bGw7fQorCXB1YmxpYyBHcm9vdnlQYWNrYWdlRG9jW10gaW1wb3J0ZWRQYWNrYWdlcygpIHsvKnRvZG8qL3JldHVybiBudWxsO30KKwlwdWJsaWMgR3Jvb3Z5Q2xhc3NEb2NbXSBpbm5lckNsYXNzZXMoKSB7Lyp0b2RvKi9yZXR1cm4gbnVsbDt9IC8vIG5vdCBzdXBwb3J0ZWQgaW4gZ3Jvb3Z5CisJcHVibGljIEdyb292eUNsYXNzRG9jW10gaW5uZXJDbGFzc2VzKGJvb2xlYW4gZmlsdGVyKSB7Lyp0b2RvKi9yZXR1cm4gbnVsbDt9IC8vIG5vdCBzdXBwb3J0ZWQgaW4gZ3Jvb3Z5CisJcHVibGljIEdyb292eUNsYXNzRG9jW10gaW50ZXJmYWNlcygpIHsvKnRvZG8qL3JldHVybiBudWxsO30KKwlwdWJsaWMgR3Jvb3Z5VHlwZVtdIGludGVyZmFjZVR5cGVzKCkgey8qdG9kbyovcmV0dXJuIG51bGw7fQorCXB1YmxpYyBib29sZWFuIGlzQWJzdHJhY3QoKSB7Lyp0b2RvKi9yZXR1cm4gZmFsc2U7fQorCXB1YmxpYyBib29sZWFuIGlzRXh0ZXJuYWxpemFibGUoKSB7Lyp0b2RvKi9yZXR1cm4gZmFsc2U7fQorCXB1YmxpYyBib29sZWFuIGlzU2VyaWFsaXphYmxlKCkgey8qdG9kbyovcmV0dXJuIGZhbHNlO30KKwlwdWJsaWMgR3Jvb3Z5TWV0aG9kRG9jW10gbWV0aG9kcyhib29sZWFuIGZpbHRlcikgey8qdG9kbyovcmV0dXJuIG51bGw7fQorCXB1YmxpYyBHcm9vdnlGaWVsZERvY1tdIHNlcmlhbGl6YWJsZUZpZWxkcygpIHsvKnRvZG8qL3JldHVybiBudWxsO30KKwlwdWJsaWMgR3Jvb3Z5TWV0aG9kRG9jW10gc2VyaWFsaXphdGlvbk1ldGhvZHMoKSB7Lyp0b2RvKi9yZXR1cm4gbnVsbDt9CisJcHVibGljIGJvb2xlYW4gc3ViY2xhc3NPZihHcm9vdnlDbGFzc0RvYyBnY2QpIHsvKnRvZG8qL3JldHVybiBmYWxzZTt9CisJcHVibGljIEdyb292eVR5cGUgc3VwZXJjbGFzc1R5cGUoKSB7Lyp0b2RvKi9yZXR1cm4gbnVsbDt9CisvLwlwdWJsaWMgR3Jvb3Z5VHlwZVZhcmlhYmxlW10gdHlwZVBhcmFtZXRlcnMoKSB7Lyp0b2RvKi9yZXR1cm4gbnVsbDt9IC8vIG5vdCBzdXBwb3J0ZWQgaW4gZ3Jvb3Z5CisvLwlwdWJsaWMgR3Jvb3Z5UGFyYW1UYWdbXSB0eXBlUGFyYW1UYWdzKCkgey8qdG9kbyovcmV0dXJuIG51bGw7fSAvLyBub3Qgc3VwcG9ydGVkIGluIGdyb292eQorCisJCisJCisJLy8gbWV0aG9kcyBmcm9tIEdyb292eVR5cGUgKHRvZG86IHJlbW92ZSB0aGlzIGhvcnJpYmxlIGNvcHkgb2YgU2ltcGxlR3Jvb3Z5VHlwZS5qYXZhKQorCisvLwlwdWJsaWMgR3Jvb3Z5QW5ub3RhdGlvblR5cGVEb2MgYXNBbm5vdGF0aW9uVHlwZURvYygpIHsvKnRvZG8qL3JldHVybiBudWxsO30KKwlwdWJsaWMgR3Jvb3Z5Q2xhc3NEb2MgYXNDbGFzc0RvYygpIHsvKnRvZG8qL3JldHVybiBudWxsO30KKy8vCXB1YmxpYyBHcm9vdnlQYXJhbWV0ZXJpemVkVHlwZSBhc1BhcmFtZXRlcml6ZWRUeXBlKCkgey8qdG9kbyovcmV0dXJuIG51bGw7fQorLy8JcHVibGljIEdyb292eVR5cGVWYXJpYWJsZSBhc1R5cGVWYXJpYWJsZSgpIHsvKnRvZG8qL3JldHVybiBudWxsO30KKy8vCXB1YmxpYyBHcm9vdnlXaWxkY2FyZFR5cGUgYXNXaWxkY2FyZFR5cGUoKSB7Lyp0b2RvKi9yZXR1cm4gbnVsbDt9CisJcHVibGljIFN0cmluZyBkaW1lbnNpb24oKSB7Lyp0b2RvKi9yZXR1cm4gbnVsbDt9CisJcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoKSB7Lyp0b2RvKi9yZXR1cm4gZmFsc2U7fQorCXB1YmxpYyBTdHJpbmcgcXVhbGlmaWVkVHlwZU5hbWUoKSB7Lyp0b2RvKi9yZXR1cm4gbnVsbDt9CisJcHVibGljIFN0cmluZyBzaW1wbGVUeXBlTmFtZSgpIHsvKnRvZG8qL3JldHVybiBudWxsO30KKwlwdWJsaWMgU3RyaW5nIHR5cGVOYW1lKCkgey8qdG9kbyovcmV0dXJuIG51bGw7fQorCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9ncm9vdnlkb2MvU2ltcGxlR3Jvb3Z5Q2xhc3NEb2NBc3NlbWJsZXIuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2dyb292eWRvYy9TaW1wbGVHcm9vdnlDbGFzc0RvY0Fzc2VtYmxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NTIyMTQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9ncm9vdnlkb2MvU2ltcGxlR3Jvb3Z5Q2xhc3NEb2NBc3NlbWJsZXIuamF2YQpAQCAtMCwwICsxLDI1MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuZ3Jvb3Z5ZG9jOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlN0YWNrOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hbnRsci5Hcm9vdnlTb3VyY2VBU1Q7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hbnRsci5MaW5lQ29sdW1uOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50bHIuU291cmNlQnVmZmVyOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50bHIucGFyc2VyLkdyb292eVRva2VuVHlwZXM7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hbnRsci50cmVld2Fsa2VyLlZpc2l0b3JBZGFwdGVyOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3Jvb3Z5ZG9jLkdyb292eUNvbnN0cnVjdG9yRG9jOworCitwdWJsaWMgY2xhc3MgU2ltcGxlR3Jvb3Z5Q2xhc3NEb2NBc3NlbWJsZXIgZXh0ZW5kcyBWaXNpdG9yQWRhcHRlciB7CisgICAgcHJpdmF0ZSBTdGFjayBzdGFjazsKKwlwcml2YXRlIE1hcCBjbGFzc0RvY3M7CisJcHJpdmF0ZSBTaW1wbGVHcm9vdnlDbGFzc0RvYyBjdXJyZW50Q2xhc3NEb2M7IC8vIHRvZG8gLSBzdGFjaz8KKwlwcml2YXRlIFNpbXBsZUdyb292eUNvbnN0cnVjdG9yRG9jIGN1cnJlbnRDb25zdHJ1Y3RvckRvYzsgLy8gdG9kbyAtIHN0YWNrPworCXByaXZhdGUgU2ltcGxlR3Jvb3Z5TWV0aG9kRG9jIGN1cnJlbnRNZXRob2REb2M7IC8vIHRvZG8gLSBzdGFjaz8KKwlwcml2YXRlIFNvdXJjZUJ1ZmZlciBzb3VyY2VCdWZmZXI7CisJcHJpdmF0ZSBTdHJpbmcgcGFja2FnZVBhdGg7CisJcHJpdmF0ZSBQYXR0ZXJuIHByZXZpb3VzSmF2YURvY0NvbW1lbnRQYXR0ZXJuOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGUyA9ICIvIjsKKwkKKwlwdWJsaWMgU2ltcGxlR3Jvb3Z5Q2xhc3NEb2NBc3NlbWJsZXIoU3RyaW5nIHBhY2thZ2VQYXRoLCBTdHJpbmcgZmlsZSwgU291cmNlQnVmZmVyIHNvdXJjZUJ1ZmZlcikgeworCQl0aGlzLnNvdXJjZUJ1ZmZlciA9IHNvdXJjZUJ1ZmZlcjsKKwkJdGhpcy5wYWNrYWdlUGF0aCA9IHBhY2thZ2VQYXRoOwkJCisJCQorCQlzdGFjayA9IG5ldyBTdGFjaygpOworICAgICAgICBjbGFzc0RvY3MgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZmlsZTsKKyAgICAgICAgaWYgKGZpbGUgIT0gbnVsbCkgeworICAgICAgICAJLy8gdG9kbzogcmVwbGFjZSB0aGlzIHNpbXBsZSBpZGVhIG9mIGRlZmF1bHQgY2xhc3MgbmFtZQorICAgICAgICAJaW50IGlkeCA9IGZpbGUubGFzdEluZGV4T2YoIi4iKTsKKyAgICAgICAgCWNsYXNzTmFtZSA9IGZpbGUuc3Vic3RyaW5nKDAsaWR4KTsKKyAgICAgICAgfQorCQljdXJyZW50Q2xhc3NEb2MgPSBuZXcgU2ltcGxlR3Jvb3Z5Q2xhc3NEb2MoY2xhc3NOYW1lKTsKKwkJY3VycmVudENsYXNzRG9jLnNldEZ1bGxQYXRoTmFtZShwYWNrYWdlUGF0aCArIEZTICsgY2xhc3NOYW1lKTsKKwkJY2xhc3NEb2NzLnB1dChjdXJyZW50Q2xhc3NEb2MuZ2V0RnVsbFBhdGhOYW1lKCksY3VycmVudENsYXNzRG9jKTsKKwkJCisJCXByZXZpb3VzSmF2YURvY0NvbW1lbnRQYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCIoP3MpL1xcKlxcKiguKj8pXFwqLyIpOworCX0KKwkKKwlwdWJsaWMgTWFwIGdldEdyb292eUNsYXNzRG9jcygpIHsKKwkJcG9zdFByb2Nlc3NDbGFzc0RvY3MoKTsKKwkJcmV0dXJuIGNsYXNzRG9jczsKKwl9CisJCisJLy8gU3RlcCB0aHJvdWdoIENsYXNzRG9jcyBhbmQgdGllIHVwIGxvb3NlIGVuZHMKKwlwcml2YXRlIHZvaWQgcG9zdFByb2Nlc3NDbGFzc0RvY3MoKSB7CisJCUl0ZXJhdG9yIGNsYXNzRG9jSXRlcmF0b3IgPSBjbGFzc0RvY3MudmFsdWVzKCkuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKGNsYXNzRG9jSXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQlTaW1wbGVHcm9vdnlDbGFzc0RvYyBjbGFzc0RvYyA9IChTaW1wbGVHcm9vdnlDbGFzc0RvYykgY2xhc3NEb2NJdGVyYXRvci5uZXh0KCk7CisJCQkKKwkJCUdyb292eUNvbnN0cnVjdG9yRG9jW10gY29uc3RydWN0b3JzID0gY2xhc3NEb2MuY29uc3RydWN0b3JzKCk7CisJCQlpZiAoY29uc3RydWN0b3JzICE9IG51bGwgJiYgY29uc3RydWN0b3JzLmxlbmd0aCA9PSAwKSB7IC8vIGFkZCBkZWZhdWx0IGNvbnN0cnVjdG9yIHRvIGRvYworCSAgICAJCS8vIG5hbWUgb2YgY2xhc3MgZm9yIHRoZSBjb25zdHJ1Y3RvcgorCSAgICAJCUdyb292eUNvbnN0cnVjdG9yRG9jIGNvbnN0cnVjdG9yRG9jID0gbmV3IFNpbXBsZUdyb292eUNvbnN0cnVjdG9yRG9jKGNsYXNzRG9jLm5hbWUoKSk7CisJICAgICAgICAJLy8gZG9uJ3QgZm9yZ2V0IHRvIHRlbGwgdGhlIGNsYXNzIGFib3V0IHRoaXMgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KKwkgICAgICAgIAljbGFzc0RvYy5hZGQoY29uc3RydWN0b3JEb2MpOwkJCQkKKwkJCX0KKwkJfQorCX0KKwkKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEV4dGVuZHNDbGF1c2UoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7CisgICAgICAgIGlmICh2aXNpdCA9PSBPUEVOSU5HX1ZJU0lUKSB7CisgICAgICAgIAlHcm9vdnlTb3VyY2VBU1Qgc3VwZXJDbGFzc05vZGUgPSB0LmNoaWxkT2ZUeXBlKEdyb292eVRva2VuVHlwZXMuSURFTlQpOworICAgICAgICAJaWYgKHN1cGVyQ2xhc3NOb2RlICE9IG51bGwpIHsKKyAgICAgICAgCQlTdHJpbmcgc3VwZXJDbGFzc05hbWUgPSBzdXBlckNsYXNzTm9kZS5nZXRUZXh0KCk7CisgICAgICAgIAkJY3VycmVudENsYXNzRG9jLnNldFN1cGVyQ2xhc3NOYW1lKHN1cGVyQ2xhc3NOYW1lKTsgLy8gdW4gJ3BhY2thZ2VkJyBjbGFzcyBuYW1lCisgICAgICAgIAl9CisgICAgICAgIH0KKyAgICB9CisJCisJcHVibGljIHZvaWQgdmlzaXRDbGFzc0RlZihHcm9vdnlTb3VyY2VBU1QgdCxpbnQgdmlzaXQpIHsKKyAgICAgICAgaWYgKHZpc2l0ID09IE9QRU5JTkdfVklTSVQpIHsKKyAgICAgICAgICAgIC8vIHRvZG8gaXMgdGhpcyBjb3JyZWN0IGZvciBqYXZhICsgZ3Jvb3Z5IHNyYz8KKyAgICAgICAgCVN0cmluZyBjbGFzc05hbWUgPSB0LmNoaWxkT2ZUeXBlKEdyb292eVRva2VuVHlwZXMuSURFTlQpLmdldFRleHQoKTsKKyAgICAgICAgCWN1cnJlbnRDbGFzc0RvYyA9IChTaW1wbGVHcm9vdnlDbGFzc0RvYykgY2xhc3NEb2NzLmdldChwYWNrYWdlUGF0aCArIEZTICsgY2xhc3NOYW1lKTsKKyAgICAgICAgCWlmIChjdXJyZW50Q2xhc3NEb2MgPT0gbnVsbCkgeworICAgICAgICAJCWN1cnJlbnRDbGFzc0RvYyA9IG5ldyBTaW1wbGVHcm9vdnlDbGFzc0RvYyhjbGFzc05hbWUpOworICAgICAgICAJfQorICAgIAkJLy8gY29tbWVudHMKKyAgICAJCVN0cmluZyBjb21tZW50VGV4dCA9IGdldEphdmFEb2NDb21tZW50c0JlZm9yZU5vZGUodCk7CisgICAgCQljdXJyZW50Q2xhc3NEb2Muc2V0UmF3Q29tbWVudFRleHQoY29tbWVudFRleHQpOworCisgICAgCQljdXJyZW50Q2xhc3NEb2Muc2V0RnVsbFBhdGhOYW1lKHBhY2thZ2VQYXRoICsgRlMgKyBjdXJyZW50Q2xhc3NEb2MubmFtZSgpKTsKKyAgICAgICAgCWNsYXNzRG9jcy5wdXQoY3VycmVudENsYXNzRG9jLmdldEZ1bGxQYXRoTmFtZSgpLCBjdXJyZW50Q2xhc3NEb2MpOworICAgICAgICB9CisgICAgfQorCisJcHVibGljIHZvaWQgdmlzaXRDdG9ySWRlbnQoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7CisgICAgCWlmICh2aXNpdCA9PSBPUEVOSU5HX1ZJU0lUKSB7CisgICAgICAgIAkvLyBub3cuLi4gZ2V0IHJlbGV2YW50IHZhbHVlcyBmcm9tIHRoZSBBU1QKKworICAgIAkJLy8gbmFtZSBvZiBjbGFzcyBmb3IgdGhlIGNvbnN0cnVjdG9yCisgICAgCQljdXJyZW50Q29uc3RydWN0b3JEb2MgPSBuZXcgU2ltcGxlR3Jvb3Z5Q29uc3RydWN0b3JEb2MoY3VycmVudENsYXNzRG9jLm5hbWUoKSk7CisKKyAgICAJCS8vIGNvbW1lbnRzCisgICAgCQlTdHJpbmcgY29tbWVudFRleHQgPSBnZXRKYXZhRG9jQ29tbWVudHNCZWZvcmVOb2RlKHQpOworICAgIAkJY3VycmVudENvbnN0cnVjdG9yRG9jLnNldFJhd0NvbW1lbnRUZXh0KGNvbW1lbnRUZXh0KTsKKyAgICAJCQorICAgIAkJYWRkUGFyYW1ldGVyc1RvKGN1cnJlbnRDb25zdHJ1Y3RvckRvYywgdCwgdmlzaXQpOworICAgIAkJCisgICAgICAgIAkvLyBkb24ndCBmb3JnZXQgdG8gdGVsbCB0aGUgY2xhc3MgYWJvdXQgdGhpcyBjb25zdHJ1Y3Rvci4KKyAgICAgICAgCWN1cnJlbnRDbGFzc0RvYy5hZGQoY3VycmVudENvbnN0cnVjdG9yRG9jKTsKKyAgICAJfQkJCisJfQorCisKKwlwdWJsaWMgdm9pZCB2aXNpdE1ldGhvZERlZihHcm9vdnlTb3VyY2VBU1QgdCwgaW50IHZpc2l0KSB7CisgICAgCWlmICh2aXNpdCA9PSBPUEVOSU5HX1ZJU0lUKSB7CisgICAgICAgIAkvLyBpbml0CisKKyAgICAgICAgCS8vIG5vdy4uLiBnZXQgcmVsZXZhbnQgdmFsdWVzIGZyb20gdGhlIEFTVAorCisgICAgCQkvLyBtZXRob2QgbmFtZQorICAgIAkJU3RyaW5nIG1ldGhvZE5hbWUgPSB0LmNoaWxkT2ZUeXBlKEdyb292eVRva2VuVHlwZXMuSURFTlQpLmdldFRleHQoKTsKKyAgICAJCWN1cnJlbnRNZXRob2REb2MgPSBuZXcgU2ltcGxlR3Jvb3Z5TWV0aG9kRG9jKG1ldGhvZE5hbWUpOworCisgICAgCQkvLyBjb21tZW50cworICAgIAkJU3RyaW5nIGNvbW1lbnRUZXh0ID0gZ2V0SmF2YURvY0NvbW1lbnRzQmVmb3JlTm9kZSh0KTsKKyAgICAJCWN1cnJlbnRNZXRob2REb2Muc2V0UmF3Q29tbWVudFRleHQoY29tbWVudFRleHQpOworICAgIAkJCisgICAgCQkvLyByZXR1cm4gdHlwZQorICAgIAkJU3RyaW5nIHJldHVyblR5cGVOYW1lID0gZ2V0VHlwZU5vZGVBc1RleHQodC5jaGlsZE9mVHlwZShHcm9vdnlUb2tlblR5cGVzLlRZUEUpLCJkZWYiKTsKKyAgICAgICAgCVNpbXBsZUdyb292eVR5cGUgcmV0dXJuVHlwZSA9IG5ldyBTaW1wbGVHcm9vdnlUeXBlKHJldHVyblR5cGVOYW1lKTsgLy8gdG9kbyAhISEKKyAgICAgICAgCWN1cnJlbnRNZXRob2REb2Muc2V0UmV0dXJuVHlwZShyZXR1cm5UeXBlKTsKKworICAgIAkJYWRkUGFyYW1ldGVyc1RvKGN1cnJlbnRNZXRob2REb2MsIHQsIHZpc2l0KTsKKyAgICAJCQorICAgICAgICAJLy8gZG9uJ3QgZm9yZ2V0IHRvIHRlbGwgdGhlIGNsYXNzIGFib3V0IHRoaXMgbWV0aG9kIHNvIGNhcmVmdWxseSBjb25zdHJ1Y3RlZC4KKyAgICAgICAgCWN1cnJlbnRDbGFzc0RvYy5hZGQoY3VycmVudE1ldGhvZERvYyk7CisgICAgCX0KKwl9CisJCisJLy8gdG9kbyAtIElmIG5vIGNvbW1lbnQgYmVmb3JlIG5vZGUsIHRoZW4gZ2V0IGNvbW1lbnQgZnJvbSBzYW1lIG5vZGUgb24gcGFyZW50IGNsYXNzIC0gb3VjaCEKKwkKKwlwcml2YXRlIFN0cmluZyBnZXRKYXZhRG9jQ29tbWVudHNCZWZvcmVOb2RlKEdyb292eVNvdXJjZUFTVCB0KSB7CisJCVN0cmluZyByZXR1cm5WYWx1ZSA9ICIiOworCQkKKwkJU3RyaW5nIHRleHQgPSBzb3VyY2VCdWZmZXIuZ2V0U25pcHBldChuZXcgTGluZUNvbHVtbigxLDEpLCBuZXcgTGluZUNvbHVtbih0LmdldExpbmUoKSwgdC5nZXRDb2x1bW4oKSkpOworICAgICAgICBpZiAodGV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICBpbnQgb3BlbkJsb2NrSW5kZXggPSB0ZXh0Lmxhc3RJbmRleE9mKCJ7Iik7CisgICAgICAgICAgICBpbnQgY2xvc2luZ0Jsb2NrSW5kZXggPSB0ZXh0Lmxhc3RJbmRleE9mKCJ9Iik7CisgICAgICAgICAgICBpbnQgbGFzdEJsb2NrSW5kZXggPSBNYXRoLm1heChvcGVuQmxvY2tJbmRleCwgY2xvc2luZ0Jsb2NrSW5kZXgpOworICAgICAgICAgICAgaWYgKGxhc3RCbG9ja0luZGV4ID4gMCkgeworICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cmluZyhsYXN0QmxvY2tJbmRleCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE1hdGNoZXIgbSA9IHByZXZpb3VzSmF2YURvY0NvbW1lbnRQYXR0ZXJuLm1hdGNoZXIodGV4dCk7CisgICAgICAgICAgICBpZiAobS5maW5kKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IG0uZ3JvdXAoMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwkJCisJCXJldHVybiByZXR1cm5WYWx1ZTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBnZXRUZXh0KEdyb292eVNvdXJjZUFTVCBub2RlKSB7CisJCVN0cmluZyByZXR1cm5WYWx1ZSA9IG51bGw7CisJCWlmIChub2RlICE9IG51bGwpIHsKKwkJCXJldHVyblZhbHVlID0gbm9kZS5nZXRUZXh0KCk7CisJCX0KKwkJcmV0dXJuIHJldHVyblZhbHVlOworCX0KKworCXByaXZhdGUgU3RyaW5nIGdldFR5cGVOb2RlQXNUZXh0KEdyb292eVNvdXJjZUFTVCB0eXBlTm9kZSwgU3RyaW5nIGRlZmF1bHRUZXh0KSB7CisJCVN0cmluZyByZXR1cm5WYWx1ZSA9IGRlZmF1bHRUZXh0OworCQlpZiAodHlwZU5vZGUgIT0gbnVsbCAmJiAKKwkJCQl0eXBlTm9kZS5nZXRUeXBlKCkgPT0gR3Jvb3Z5VG9rZW5UeXBlcy5UWVBFICYmIAorCQkJCXR5cGVOb2RlLmdldE51bWJlck9mQ2hpbGRyZW4oKSA+IDApIHsKKwkJCUdyb292eVNvdXJjZUFTVCBjaGlsZCA9IChHcm9vdnlTb3VyY2VBU1QpIHR5cGVOb2RlLmdldEZpcnN0Q2hpbGQoKTsgLy8gYXNzdW1lIHR5cGUgaGFzIG9ubHkgb25lIGNoaWxkIC8vIHRvZG8gdHlwZSBvZiAiZm9vLmJhci5XaWJibGUiCisJCQlzd2l0Y2ggKGNoaWxkLmdldFR5cGUoKSkgeworCQkJCS8vIGxpdGVyYWxzCisJCQkJY2FzZSBHcm9vdnlUb2tlblR5cGVzLkxJVEVSQUxfYm9vbGVhbjogcmV0dXJuVmFsdWUgPSAiYm9vbGVhbiI7IGJyZWFrOwkKKwkJCQljYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF9ieXRlOiByZXR1cm5WYWx1ZSA9ICJieXRlIjsgYnJlYWs7CQorCQkJCWNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX2NoYXI6IHJldHVyblZhbHVlID0gImNoYXIiOyBicmVhazsJCisJCQkJLy8gbm90ZTogTElURVJBTF9kZWYgbmV2ZXIgY3JlYXRlZAorCQkJCWNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX2RvdWJsZTogcmV0dXJuVmFsdWUgPSAiZG91YmxlIjsgYnJlYWs7CQorCQkJCWNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX2Zsb2F0OiByZXR1cm5WYWx1ZSA9ICJmbG9hdCI7IGJyZWFrOwkKKwkJCQljYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF9pbnQ6IHJldHVyblZhbHVlID0gImludCI7IGJyZWFrOwkKKwkJCQljYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF9sb25nOiByZXR1cm5WYWx1ZSA9ICJsb25nIjsgYnJlYWs7CQorCQkJCWNhc2UgR3Jvb3Z5VG9rZW5UeXBlcy5MSVRFUkFMX3Nob3J0OiByZXR1cm5WYWx1ZSA9ICJzaG9ydCI7IGJyZWFrOwkKKwkJCQljYXNlIEdyb292eVRva2VuVHlwZXMuTElURVJBTF92b2lkOiByZXR1cm5WYWx1ZSA9ICJ2b2lkIjsgYnJlYWs7CQorCQkJCQorCQkJCS8vIGlkZW50aWZpZXJzCisJCQkJY2FzZSBHcm9vdnlUb2tlblR5cGVzLklERU5UOiByZXR1cm5WYWx1ZSA9IGNoaWxkLmdldFRleHQoKTsgYnJlYWs7CQorCQkJfQorCQl9CisJCXJldHVybiByZXR1cm5WYWx1ZTsKKwl9CisKKwkKKwlwcml2YXRlIHZvaWQgYWRkUGFyYW1ldGVyc1RvKFNpbXBsZUdyb292eUV4ZWN1dGFibGVNZW1iZXJEb2MgZXhlY3V0YWJsZU1lbWJlckRvYywgR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7CisJCS8vIHBhcmFtZXRlcnMKKwkJR3Jvb3Z5U291cmNlQVNUIHBhcmFtZXRlcnNOb2RlID0gdC5jaGlsZE9mVHlwZShHcm9vdnlUb2tlblR5cGVzLlBBUkFNRVRFUlMpOworCQlpZiAocGFyYW1ldGVyc05vZGUgIT0gbnVsbCAmJiBwYXJhbWV0ZXJzTm9kZS5nZXROdW1iZXJPZkNoaWxkcmVuKCkgPiAwKSB7CisJCQlHcm9vdnlTb3VyY2VBU1QgY3VycmVudE5vZGUgPSAoR3Jvb3Z5U291cmNlQVNUKSBwYXJhbWV0ZXJzTm9kZS5nZXRGaXJzdENoaWxkKCk7CisgICAgCQl3aGlsZSAoY3VycmVudE5vZGUgIT0gbnVsbCkgeworICAgIAkJCVN0cmluZyBwYXJhbWV0ZXJUeXBlTmFtZSA9IGdldFR5cGVOb2RlQXNUZXh0KGN1cnJlbnROb2RlLmNoaWxkT2ZUeXBlKEdyb292eVRva2VuVHlwZXMuVFlQRSksImRlZiIpOworICAgICAgICAJCVN0cmluZyBwYXJhbWV0ZXJOYW1lID0gZ2V0VGV4dChjdXJyZW50Tm9kZS5jaGlsZE9mVHlwZShHcm9vdnlUb2tlblR5cGVzLklERU5UKSk7CisgICAgICAgIAkJU2ltcGxlR3Jvb3Z5UGFyYW1ldGVyIHBhcmFtZXRlciA9IG5ldyBTaW1wbGVHcm9vdnlQYXJhbWV0ZXIocGFyYW1ldGVyTmFtZSk7CisgICAgICAgIAkJcGFyYW1ldGVyLnNldFR5cGVOYW1lKHBhcmFtZXRlclR5cGVOYW1lKTsKKyAgICAgICAgCQkKKyAgICAgICAgCQlleGVjdXRhYmxlTWVtYmVyRG9jLmFkZChwYXJhbWV0ZXIpOworICAgICAgICAJCQorICAgICAgICAJCWN1cnJlbnROb2RlID0gKEdyb292eVNvdXJjZUFTVCljdXJyZW50Tm9kZS5nZXROZXh0U2libGluZygpOworICAgIAkJfQorCQl9CisJfQorCisJCisJCisJcHVibGljIHZvaWQgcHVzaChHcm9vdnlTb3VyY2VBU1QgdCkgeworICAgICAgICBzdGFjay5wdXNoKHQpOworICAgIH0KKyAgICBwdWJsaWMgR3Jvb3Z5U291cmNlQVNUIHBvcCgpIHsKKyAgICAgICAgaWYgKCFzdGFjay5lbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gKEdyb292eVNvdXJjZUFTVCkgc3RhY2sucG9wKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSBHcm9vdnlTb3VyY2VBU1QgZ2V0UGFyZW50Tm9kZSgpIHsKKyAgICAJT2JqZWN0IHBhcmVudE5vZGUgPSBudWxsOworICAgIAlPYmplY3QgY3VycmVudE5vZGUgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgaWYgKCFzdGFjay5lbXB0eSgpKSB7CisgICAgICAgIAlwYXJlbnROb2RlID0gc3RhY2sucGVlaygpOworICAgICAgICB9CisgICAgCXN0YWNrLnB1c2goY3VycmVudE5vZGUpOworICAgICAgICByZXR1cm4gKEdyb292eVNvdXJjZUFTVCkgcGFyZW50Tm9kZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9ncm9vdnlkb2MvU2ltcGxlR3Jvb3Z5Q29uc3RydWN0b3JEb2MuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2dyb292eWRvYy9TaW1wbGVHcm9vdnlDb25zdHJ1Y3RvckRvYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZTIzNmUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9ncm9vdnlkb2MvU2ltcGxlR3Jvb3Z5Q29uc3RydWN0b3JEb2MuamF2YQpAQCAtMCwwICsxLDI0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5ncm9vdnlkb2M7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5Lmdyb292eWRvYy4qOworCitwdWJsaWMgY2xhc3MgU2ltcGxlR3Jvb3Z5Q29uc3RydWN0b3JEb2MgZXh0ZW5kcyBTaW1wbGVHcm9vdnlFeGVjdXRhYmxlTWVtYmVyRG9jIGltcGxlbWVudHMgR3Jvb3Z5Q29uc3RydWN0b3JEb2MgeworCXB1YmxpYyBTaW1wbGVHcm9vdnlDb25zdHJ1Y3RvckRvYyhTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvZ3Jvb3Z5ZG9jL1NpbXBsZUdyb292eURvYy5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvZ3Jvb3Z5ZG9jL1NpbXBsZUdyb292eURvYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMzZkNzYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9ncm9vdnlkb2MvU2ltcGxlR3Jvb3Z5RG9jLmphdmEKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLmdyb292eWRvYzsKKworaW1wb3J0IGphdmEudGV4dC5CcmVha0l0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5Lmdyb292eWRvYy4qOworCitwdWJsaWMgY2xhc3MgU2ltcGxlR3Jvb3Z5RG9jIGltcGxlbWVudHMgR3Jvb3Z5RG9jIHsKKwlwdWJsaWMgU2ltcGxlR3Jvb3Z5RG9jKFN0cmluZyBuYW1lKSB7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJfQorCXByaXZhdGUgU3RyaW5nIG5hbWU7CisJcHJpdmF0ZSBTdHJpbmcgY29tbWVudFRleHQ7CisJcHJpdmF0ZSBTdHJpbmcgcmF3Q29tbWVudFRleHQ7CisJcHJpdmF0ZSBTdHJpbmcgZmlyc3RTZW50ZW5jZUNvbW1lbnRUZXh0OworCXB1YmxpYyBTdHJpbmcgbmFtZSgpIHsKKwkJcmV0dXJuIG5hbWU7CisJfQorCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICIiICsgZ2V0Q2xhc3MoKSArICIoIiArIG5hbWUgKyAiKSI7CisJfQorCXB1YmxpYyBTdHJpbmcgY29tbWVudFRleHQoKSB7CisJCXJldHVybiBjb21tZW50VGV4dDsgLy8gZGVyaXZlZCBmcm9tIHJhd0NvbW1lbnRUZXh0CisJfQorCXB1YmxpYyBTdHJpbmcgZ2V0UmF3Q29tbWVudFRleHQoKSB7CisJCXJldHVybiByYXdDb21tZW50VGV4dDsKKwl9CisJcHVibGljIFN0cmluZyBmaXJzdFNlbnRlbmNlQ29tbWVudFRleHQoKSB7CisJCXJldHVybiBmaXJzdFNlbnRlbmNlQ29tbWVudFRleHQ7IC8vIGRlcml2ZWQgZnJvbSByYXdDb21tZW50VGV4dAorCX0KKworCXB1YmxpYyB2b2lkIHNldFJhd0NvbW1lbnRUZXh0KFN0cmluZyByYXdDb21tZW50VGV4dCkgeworCQl0aGlzLnJhd0NvbW1lbnRUZXh0ID0gcmF3Q29tbWVudFRleHQ7CisJCQorCQkvLyByZW1vdmUgYWxsIHRoZSAqIGZyb20gYmVnaW5uaW5nIG9mIGxpbmVzCisJCXRoaXMuY29tbWVudFRleHQgPSByYXdDb21tZW50VGV4dC5yZXBsYWNlQWxsKCIoP20pXlxccypcXCoiLCAiIik7IC8vIHRvZG8gcHJlY29tcGlsZSByZWdleCBQYXR0ZXJucworCisJCS8vIENvbW1lbnQgU3VtbWFyeSB1c2luZyBmaXJzdCBzZW50ZW5jZSAoTG9jYWxlIHNlbnNpdGl2ZSkKKwkJQnJlYWtJdGVyYXRvciBib3VuZGFyeSA9IEJyZWFrSXRlcmF0b3IuZ2V0U2VudGVuY2VJbnN0YW5jZShMb2NhbGUuZ2V0RGVmYXVsdCgpKTsgLy8gdG9kbyAtIGFsbG93IGxvY2FsZSB0byBiZSBwYXNzZWQgaW4KKyAgICAgICAgYm91bmRhcnkuc2V0VGV4dChjb21tZW50VGV4dCk7CisgICAgICAgIGludCBzdGFydCA9IGJvdW5kYXJ5LmZpcnN0KCk7CisgICAgICAgIGludCBlbmQgPSBib3VuZGFyeS5uZXh0KCk7CisgICAgICAgIGlmIChzdGFydCA+IC0xICYmIGVuZCA+IC0xKSB7CisgICAgICAgIAkvLyBuZWVkIHRvIGFiYnJldmlhdGUgdGhpcyBjb21tZW50IGZvciB0aGUgc3VtbWFyeQorICAgICAgICAJdGhpcy5maXJzdFNlbnRlbmNlQ29tbWVudFRleHQgPSBjb21tZW50VGV4dC5zdWJzdHJpbmcoc3RhcnQsZW5kKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgCXRoaXMuZmlyc3RTZW50ZW5jZUNvbW1lbnRUZXh0ID0gY29tbWVudFRleHQ7CisgICAgICAgIH0KKwkJLy8gaGFjayB0byByZWZvcm1hdCBncm9vdnlkb2MgdGFncyBpbnRvIGh0bWwgKHRvZG86IHRhZ3MpCisJCXRoaXMuY29tbWVudFRleHQgPSB0aGlzLmNvbW1lbnRUZXh0LnJlcGxhY2VBbGwoIig/bSlAKFthLXpdKilcXHMqKC4qKSQiLCI8REw+PERUPjxCPiQxOjwvQj48L0RUPjxERD4kMjwvREQ+PC9ETD4iKTsJCQkvLyBub3RlOiB1c2Ugb2YgJCBoZXJlIGlzIGEgcmVmZXJlbmNlIHRvIGEgc3Vic2VxdWVuY2UgKGFzIGRlZmluZWQgaW4gTWF0Y2hlci5hcHBlbmRSZXBsYWNlbWVudCgpKQorCisJCS8vIGhhY2sgdG8gaGlkZSBncm9vdnlkb2MgdGFncyBpbiBzdW1tYXJpZXMKKwkJdGhpcy5maXJzdFNlbnRlbmNlQ29tbWVudFRleHQgPSB0aGlzLmZpcnN0U2VudGVuY2VDb21tZW50VGV4dC5yZXBsYWNlQWxsKCIoP20pQChbYS16XSpcXHMqLiopJCIsIiIpOyAvLyByZW1vdmUgQHJldHVybiBldGMgZnJvbSBzdW1tYXJpZXMKKyAgICAgICAgCisJfQorCisJCisJCisJCisJLy8gTWV0aG9kcyBmcm9tIENvbXBhcmFibGUKKwlwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3QgdGhhdCkgeworCQlpZiAodGhhdCBpbnN0YW5jZW9mIFNpbXBsZUdyb292eURvYykgeworCQkJcmV0dXJuIG5hbWUuY29tcGFyZVRvKCgoU2ltcGxlR3Jvb3Z5RG9jKSB0aGF0KS5uYW1lKTsKKwkJfSBlbHNlIHsKKwkJCXRocm93IG5ldyBDbGFzc0Nhc3RFeGNlcHRpb24oKTsKKwkJfQorCX0KKworCS8vIE1ldGhvZHMgZnJvbSBHcm9vdnlEb2MKKy8vCXB1YmxpYyBHcm9vdnlUYWdbXSBmaXJzdFNlbnRlbmNlVGFncygpIHsvKnRvZG8qL3JldHVybiBudWxsO30KKy8vCXB1YmxpYyBHcm9vdnlUYWdbXSBpbmxpbmVUYWdzKCkgey8qdG9kbyovcmV0dXJuIG51bGw7fQorCXB1YmxpYyBib29sZWFuIGlzQW5ub3RhdGlvblR5cGUoKSB7Lyp0b2RvKi9yZXR1cm4gZmFsc2U7fQorCXB1YmxpYyBib29sZWFuIGlzQW5ub3RhdGlvblR5cGVFbGVtZW50KCkgey8qdG9kbyovcmV0dXJuIGZhbHNlO30KKwlwdWJsaWMgYm9vbGVhbiBpc0NsYXNzKCkgey8qdG9kbyovcmV0dXJuIGZhbHNlO30KKwlwdWJsaWMgYm9vbGVhbiBpc0NvbnN0cnVjdG9yKCkgey8qdG9kbyovcmV0dXJuIGZhbHNlO30KKwlwdWJsaWMgYm9vbGVhbiBpc0VudW0oKSB7Lyp0b2RvKi9yZXR1cm4gZmFsc2U7fQorCXB1YmxpYyBib29sZWFuIGlzRW51bUNvbnN0YW50KCkgey8qdG9kbyovcmV0dXJuIGZhbHNlO30KKwlwdWJsaWMgYm9vbGVhbiBpc0Vycm9yKCkgey8qdG9kbyovcmV0dXJuIGZhbHNlO30KKwlwdWJsaWMgYm9vbGVhbiBpc0V4Y2VwdGlvbigpIHsvKnRvZG8qL3JldHVybiBmYWxzZTt9CisJcHVibGljIGJvb2xlYW4gaXNGaWVsZCgpIHsvKnRvZG8qL3JldHVybiBmYWxzZTt9CisJcHVibGljIGJvb2xlYW4gaXNJbmNsdWRlZCgpIHsvKnRvZG8qL3JldHVybiBmYWxzZTt9CisJcHVibGljIGJvb2xlYW4gaXNJbnRlcmZhY2UoKSB7Lyp0b2RvKi9yZXR1cm4gZmFsc2U7fQorCXB1YmxpYyBib29sZWFuIGlzTWV0aG9kKCkgey8qdG9kbyovcmV0dXJuIGZhbHNlO30KKwlwdWJsaWMgYm9vbGVhbiBpc09yZGluYXJ5Q2xhc3MoKSB7Lyp0b2RvKi9yZXR1cm4gZmFsc2U7fQorLy8JcHVibGljIEdyb292eVNvdXJjZVBvc2l0aW9uIHBvc2l0aW9uKCkgey8qdG9kbyovcmV0dXJuIG51bGw7fQorLy8JcHVibGljIEdyb292eVNlZVRhZ1tdIHNlZVRhZ3MoKSB7Lyp0b2RvKi9yZXR1cm4gbnVsbDt9CisvLwlwdWJsaWMgR3Jvb3Z5VGFnW10gdGFncygpIHsvKnRvZG8qL3JldHVybiBudWxsO30KKy8vCXB1YmxpYyBHcm9vdnlUYWdbXSB0YWdzKFN0cmluZyBhcmcwKSB7Lyp0b2RvKi9yZXR1cm4gbnVsbDt9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2dyb292eWRvYy9TaW1wbGVHcm9vdnlFeGVjdXRhYmxlTWVtYmVyRG9jLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9ncm9vdnlkb2MvU2ltcGxlR3Jvb3Z5RXhlY3V0YWJsZU1lbWJlckRvYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZTIwYWMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9ncm9vdnlkb2MvU2ltcGxlR3Jvb3Z5RXhlY3V0YWJsZU1lbWJlckRvYy5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLmdyb292eWRvYzsKKworaW1wb3J0IGphdmEudXRpbC4qOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncm9vdnlkb2MuKjsKKworcHVibGljIGNsYXNzIFNpbXBsZUdyb292eUV4ZWN1dGFibGVNZW1iZXJEb2MgZXh0ZW5kcyBTaW1wbGVHcm9vdnlNZW1iZXJEb2MgaW1wbGVtZW50cyBHcm9vdnlFeGVjdXRhYmxlTWVtYmVyRG9jIHsKKwlMaXN0IHBhcmFtZXRlcnM7CisJCisJcHVibGljIFNpbXBsZUdyb292eUV4ZWN1dGFibGVNZW1iZXJEb2MoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJCXBhcmFtZXRlcnMgPSBuZXcgQXJyYXlMaXN0KCk7CisJfQorCXB1YmxpYyBHcm9vdnlQYXJhbWV0ZXJbXSBwYXJhbWV0ZXJzKCkgeworCQlyZXR1cm4gKEdyb292eVBhcmFtZXRlcltdKSBwYXJhbWV0ZXJzLnRvQXJyYXkobmV3IEdyb292eVBhcmFtZXRlcltwYXJhbWV0ZXJzLnNpemUoKV0pOworCX0KKwlwdWJsaWMgdm9pZCBhZGQoR3Jvb3Z5UGFyYW1ldGVyIHBhcmFtZXRlcikgeworCQlwYXJhbWV0ZXJzLmFkZChwYXJhbWV0ZXIpOworCX0KKworCQorCXB1YmxpYyBTdHJpbmcgZmxhdFNpZ25hdHVyZSgpIHsvKnRvZG8qL3JldHVybiBudWxsO30KKwlwdWJsaWMgYm9vbGVhbiBpc05hdGl2ZSgpIHsvKnRvZG8qL3JldHVybiBmYWxzZTt9CisJcHVibGljIGJvb2xlYW4gaXNTeW5jaHJvbml6ZWQoKSB7Lyp0b2RvKi9yZXR1cm4gZmFsc2U7fQorCXB1YmxpYyBib29sZWFuIGlzVmFyQXJncygpIHsvKnRvZG8qL3JldHVybiBmYWxzZTt9CisvLwlwdWJsaWMgR3Jvb3Z5UGFyYW1UYWdbXSBwYXJhbVRhZ3MoKSB7Lyp0b2RvKi9yZXR1cm4gbnVsbDt9CisJcHVibGljIFN0cmluZyBzaWduYXR1cmUoKSB7Lyp0b2RvKi9yZXR1cm4gbnVsbDt9CisJcHVibGljIEdyb292eUNsYXNzRG9jW10gdGhyb3duRXhjZXB0aW9ucygpIHsvKnRvZG8qL3JldHVybiBudWxsO30KKwlwdWJsaWMgR3Jvb3Z5VHlwZVtdIHRocm93bkV4Y2VwdGlvblR5cGVzKCkgey8qdG9kbyovcmV0dXJuIG51bGw7fQorLy8JcHVibGljIEdyb292eVRocm93c1RhZ1tdIHRocm93c1RhZ3MoKSB7Lyp0b2RvKi9yZXR1cm4gbnVsbDt9CisvLwlwdWJsaWMgR3Jvb3Z5VHlwZVZhcmlhYmxlW10gdHlwZVBhcmFtZXRlcnMoKSB7Lyp0b2RvKi9yZXR1cm4gbnVsbDt9CisvLwlwdWJsaWMgR3Jvb3Z5UGFyYW1UYWdbXSB0eXBlUGFyYW1UYWdzKCkgey8qdG9kbyovcmV0dXJuIG51bGw7fQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvZ3Jvb3Z5ZG9jL1NpbXBsZUdyb292eUZpZWxkRG9jLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9ncm9vdnlkb2MvU2ltcGxlR3Jvb3Z5RmllbGREb2MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjUwNmY2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvZ3Jvb3Z5ZG9jL1NpbXBsZUdyb292eUZpZWxkRG9jLmphdmEKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuZ3Jvb3Z5ZG9jOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3Jvb3Z5ZG9jLio7CisKK3B1YmxpYyBjbGFzcyBTaW1wbGVHcm9vdnlGaWVsZERvYyBleHRlbmRzIFNpbXBsZUdyb292eU1lbWJlckRvYyBpbXBsZW1lbnRzIEdyb292eUZpZWxkRG9jIHsKKwlwdWJsaWMgU2ltcGxlR3Jvb3Z5RmllbGREb2MoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCXB1YmxpYyBPYmplY3QgY29uc3RhbnRWYWx1ZSgpIHsvKnRvZG8qL3JldHVybiBudWxsO30KKwlwdWJsaWMgU3RyaW5nIGNvbnN0YW50VmFsdWVFeHByZXNzaW9uKCkgey8qdG9kbyovcmV0dXJuIG51bGw7fQorCXB1YmxpYyBib29sZWFuIGlzVHJhbnNpZW50KCkgey8qdG9kbyovcmV0dXJuIGZhbHNlO30KKwlwdWJsaWMgYm9vbGVhbiBpc1ZvbGF0aWxlKCkgey8qdG9kbyovcmV0dXJuIGZhbHNlO30KKy8vCXB1YmxpYyBHcm9vdnlTZXJpYWxGaWVsZFRhZ1tdIHNlcmlhbEZpZWxkVGFncygpIHsvKnRvZG8qL3JldHVybiBudWxsO30KKwlwdWJsaWMgR3Jvb3Z5VHlwZSB0eXBlKCkgey8qdG9kbyovcmV0dXJuIG51bGw7fQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvZ3Jvb3Z5ZG9jL1NpbXBsZUdyb292eU1lbWJlckRvYy5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvZ3Jvb3Z5ZG9jL1NpbXBsZUdyb292eU1lbWJlckRvYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyYTdmOTkKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9ncm9vdnlkb2MvU2ltcGxlR3Jvb3Z5TWVtYmVyRG9jLmphdmEKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuZ3Jvb3Z5ZG9jOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3Jvb3Z5ZG9jLio7CisKK3B1YmxpYyBjbGFzcyBTaW1wbGVHcm9vdnlNZW1iZXJEb2MgZXh0ZW5kcyBTaW1wbGVHcm9vdnlQcm9ncmFtRWxlbWVudERvYyBpbXBsZW1lbnRzIEdyb292eU1lbWJlckRvY3sKKwlwdWJsaWMgU2ltcGxlR3Jvb3Z5TWVtYmVyRG9jKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKwlwdWJsaWMgYm9vbGVhbiBpc1N5bnRoZXRpYygpIHsvKnRvZG8qL3JldHVybiBmYWxzZTt9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9ncm9vdnlkb2MvU2ltcGxlR3Jvb3Z5TWV0aG9kRG9jLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9ncm9vdnlkb2MvU2ltcGxlR3Jvb3Z5TWV0aG9kRG9jLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzljZGZlNgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2dyb292eWRvYy9TaW1wbGVHcm9vdnlNZXRob2REb2MuamF2YQpAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5ncm9vdnlkb2M7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5Lmdyb292eWRvYy4qOworCitwdWJsaWMgY2xhc3MgU2ltcGxlR3Jvb3Z5TWV0aG9kRG9jIGV4dGVuZHMgU2ltcGxlR3Jvb3Z5RXhlY3V0YWJsZU1lbWJlckRvYyBpbXBsZW1lbnRzIEdyb292eU1ldGhvZERvYyB7CisJcHVibGljIFNpbXBsZUdyb292eU1ldGhvZERvYyhTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisJcHJpdmF0ZSBHcm9vdnlUeXBlIHJldHVyblR5cGU7CisJcHVibGljIEdyb292eVR5cGUgcmV0dXJuVHlwZSgpIHtyZXR1cm4gcmV0dXJuVHlwZTt9CisJcHVibGljIHZvaWQgc2V0UmV0dXJuVHlwZShHcm9vdnlUeXBlIHJldHVyblR5cGUpIHsKKwkJdGhpcy5yZXR1cm5UeXBlID0gcmV0dXJuVHlwZTsKKwl9CisJCisKKwlwdWJsaWMgYm9vbGVhbiBpc0Fic3RyYWN0KCkgey8qdG9kbyovcmV0dXJuIGZhbHNlO30KKwlwdWJsaWMgR3Jvb3Z5Q2xhc3NEb2Mgb3ZlcnJpZGRlbkNsYXNzKCkgey8qdG9kbyovcmV0dXJuIG51bGw7fQorCXB1YmxpYyBHcm9vdnlNZXRob2REb2Mgb3ZlcnJpZGRlbk1ldGhvZCgpIHsvKnRvZG8qL3JldHVybiBudWxsO30KKwlwdWJsaWMgR3Jvb3Z5VHlwZSBvdmVycmlkZGVuVHlwZSgpIHsvKnRvZG8qL3JldHVybiBudWxsO30KKwlwdWJsaWMgYm9vbGVhbiBvdmVycmlkZXMoR3Jvb3Z5TWV0aG9kRG9jIGFyZzApIHsvKnRvZG8qL3JldHVybiBmYWxzZTt9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9ncm9vdnlkb2MvU2ltcGxlR3Jvb3Z5UGFja2FnZURvYy5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvZ3Jvb3Z5ZG9jL1NpbXBsZUdyb292eVBhY2thZ2VEb2MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWMyOTdjCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvZ3Jvb3Z5ZG9jL1NpbXBsZUdyb292eVBhY2thZ2VEb2MuamF2YQpAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5ncm9vdnlkb2M7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncm9vdnlkb2MuR3Jvb3Z5Q2xhc3NEb2M7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncm9vdnlkb2MuR3Jvb3Z5UGFja2FnZURvYzsKKworcHVibGljIGNsYXNzIFNpbXBsZUdyb292eVBhY2thZ2VEb2MgZXh0ZW5kcyBTaW1wbGVHcm9vdnlEb2MgaW1wbGVtZW50cyBHcm9vdnlQYWNrYWdlRG9jIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIEZTID0gJy8nOworCWZpbmFsIE1hcCBjbGFzc0RvY3M7CisJcHVibGljIFNpbXBsZUdyb292eVBhY2thZ2VEb2MoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJCWNsYXNzRG9jcyA9IG5ldyBIYXNoTWFwKCk7CisJfQorCXB1YmxpYyBHcm9vdnlDbGFzc0RvY1tdIGFsbENsYXNzZXMoKSB7CisJCXJldHVybiAoR3Jvb3Z5Q2xhc3NEb2NbXSkgY2xhc3NEb2NzLnZhbHVlcygpLnRvQXJyYXkobmV3IEdyb292eUNsYXNzRG9jW2NsYXNzRG9jcy52YWx1ZXMoKS5zaXplKCldKTsgLy8gdG9kbyBwZXJmb3JtYW5jZT8gc29ydGluZz8KKwl9CisJcHVibGljIHZvaWQgcHV0QWxsKE1hcCBjbGFzc2VzKSB7CisJCS8vIDIgd2F5IHJlbGF0aW9uc2hpcAorCQkvLyBhZGQgcmVmZXJlbmNlIHRvIGNsYXNzZXMgaW5zaWRlIHRoaXMgcGFja2FnZQorCQljbGFzc0RvY3MucHV0QWxsKGNsYXNzZXMpOworCQkKKwkJLy8gYWRkIHJlZmVyZW5jZSB0byB0aGlzIHBhY2thZ2UgaW5zaWRlIGNsYXNzZXMKKwkJSXRlcmF0b3IgaXRyID0gY2xhc3Nlcy52YWx1ZXMoKS5pdGVyYXRvcigpOworCQl3aGlsZSAoaXRyLmhhc05leHQoKSkgeworCQkJU2ltcGxlR3Jvb3Z5UHJvZ3JhbUVsZW1lbnREb2MgcHJvZ3JhbUVsZW1lbnQgPSAoU2ltcGxlR3Jvb3Z5UHJvZ3JhbUVsZW1lbnREb2MpaXRyLm5leHQoKTsKKwkJCXByb2dyYW1FbGVtZW50LnNldENvbnRhaW5pbmdQYWNrYWdlKHRoaXMpOworCQl9CisJfQorCXB1YmxpYyBTdHJpbmcgbmFtZVdpdGhEb3RzKCkgeworCQlyZXR1cm4gbmFtZSgpLnJlcGxhY2UoRlMsICcuJyk7CisJfQorCQorCXB1YmxpYyBHcm9vdnlDbGFzc0RvY1tdIGFsbENsYXNzZXMoYm9vbGVhbiBhcmcwKSB7Lyp0b2RvKi9yZXR1cm4gbnVsbDt9CisJcHVibGljIEdyb292eUNsYXNzRG9jW10gZW51bXMoKSB7Lyp0b2RvKi9yZXR1cm4gbnVsbDt9CisJcHVibGljIEdyb292eUNsYXNzRG9jW10gZXJyb3JzKCkgey8qdG9kbyovcmV0dXJuIG51bGw7fQorCXB1YmxpYyBHcm9vdnlDbGFzc0RvY1tdIGV4Y2VwdGlvbnMoKSB7Lyp0b2RvKi9yZXR1cm4gbnVsbDt9CisJcHVibGljIEdyb292eUNsYXNzRG9jIGZpbmRDbGFzcyhTdHJpbmcgYXJnMCkgey8qdG9kbyovcmV0dXJuIG51bGw7fQorCXB1YmxpYyBHcm9vdnlDbGFzc0RvY1tdIGludGVyZmFjZXMoKSB7Lyp0b2RvKi9yZXR1cm4gbnVsbDt9CisJcHVibGljIEdyb292eUNsYXNzRG9jW10gb3JkaW5hcnlDbGFzc2VzKCkgeworCQlMaXN0IGNsYXNzRG9jVmFsdWVzID0gbmV3IEFycmF5TGlzdChjbGFzc0RvY3MudmFsdWVzKCkpOworCQlDb2xsZWN0aW9ucy5zb3J0KGNsYXNzRG9jVmFsdWVzKTsgLy8gdG9kbyAtIHBlcmZvcm1hbmNlIC8gbWF5YmUgbW92ZSBpbnRvIGEgc29ydE1lKCkgbWV0aG9kCisJCXJldHVybiAoR3Jvb3Z5Q2xhc3NEb2NbXSkgY2xhc3NEb2NWYWx1ZXMudG9BcnJheShuZXcgR3Jvb3Z5Q2xhc3NEb2NbY2xhc3NEb2NWYWx1ZXMuc2l6ZSgpXSk7IC8vIHRvZG8gQ1VSUkVOVExZIEFMTCBDTEFTU0VTIQorCX0KKwlwdWJsaWMgU3RyaW5nIGdldFJlbGF0aXZlUm9vdFBhdGgoKSB7CisJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKG5hbWUoKSwgIiIgKyBGUyk7CisJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKKwkJCXRva2VuaXplci5uZXh0VG9rZW4oKTsKKwkJCXNiLmFwcGVuZCgiLi4vIik7CisJCX0KKwkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisJfQkKKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvZ3Jvb3Z5ZG9jL1NpbXBsZUdyb292eVBhcmFtZXRlci5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvZ3Jvb3Z5ZG9jL1NpbXBsZUdyb292eVBhcmFtZXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmYmU2YzEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9ncm9vdnlkb2MvU2ltcGxlR3Jvb3Z5UGFyYW1ldGVyLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuZ3Jvb3Z5ZG9jOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncm9vdnlkb2MuKjsKKworcHVibGljIGNsYXNzIFNpbXBsZUdyb292eVBhcmFtZXRlciBpbXBsZW1lbnRzIEdyb292eVBhcmFtZXRlciB7CisJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKwlwcml2YXRlIFN0cmluZyB0eXBlTmFtZTsKKworCXB1YmxpYyBTaW1wbGVHcm9vdnlQYXJhbWV0ZXIoU3RyaW5nIG5hbWUpIHsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwl9CisJcHVibGljIFN0cmluZyBuYW1lKCkge3JldHVybiBuYW1lO30KKwlwdWJsaWMgU3RyaW5nIHR5cGVOYW1lKCkge3JldHVybiB0eXBlTmFtZTt9CisJCisJcHVibGljIHZvaWQgc2V0VHlwZU5hbWUoU3RyaW5nIHR5cGVOYW1lKSB7CisJCXRoaXMudHlwZU5hbWUgPSB0eXBlTmFtZTsKKwl9CisKKworCQorCQorLy8JcHVibGljIEdyb292eUFubm90YXRpb25EZXNjW10gYW5ub3RhdGlvbnMoKSB7Lyp0b2RvKi9yZXR1cm4gbnVsbDt9CisJcHVibGljIEdyb292eVR5cGUgdHlwZSgpIHsvKnRvZG8qL3JldHVybiBudWxsO30KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2dyb292eWRvYy9TaW1wbGVHcm9vdnlQcm9ncmFtRWxlbWVudERvYy5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvZ3Jvb3Z5ZG9jL1NpbXBsZUdyb292eVByb2dyYW1FbGVtZW50RG9jLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZkNzcwMAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2dyb292eWRvYy9TaW1wbGVHcm9vdnlQcm9ncmFtRWxlbWVudERvYy5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLmdyb292eWRvYzsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5Lmdyb292eWRvYy4qOworCitwdWJsaWMgY2xhc3MgU2ltcGxlR3Jvb3Z5UHJvZ3JhbUVsZW1lbnREb2MgZXh0ZW5kcyBTaW1wbGVHcm9vdnlEb2MgaW1wbGVtZW50cyBHcm9vdnlQcm9ncmFtRWxlbWVudERvYyB7CisJcHJpdmF0ZSBHcm9vdnlQYWNrYWdlRG9jIHBhY2thZ2VEb2M7CisJCisJcHVibGljIFNpbXBsZUdyb292eVByb2dyYW1FbGVtZW50RG9jKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKwkKKwlwdWJsaWMgR3Jvb3Z5UGFja2FnZURvYyBjb250YWluaW5nUGFja2FnZSgpIHsKKwkJcmV0dXJuIHBhY2thZ2VEb2M7CisJfQorCXB1YmxpYyB2b2lkIHNldENvbnRhaW5pbmdQYWNrYWdlKEdyb292eVBhY2thZ2VEb2MgcGFja2FnZURvYykgeworCQl0aGlzLnBhY2thZ2VEb2MgPSBwYWNrYWdlRG9jOworCX0KKwkvLwlwdWJsaWMgR3Jvb3Z5QW5ub3RhdGlvbkRlc2NbXSBhbm5vdGF0aW9ucygpIHsvKnRvZG8qL3JldHVybiBudWxsO30KKwlwdWJsaWMgR3Jvb3Z5Q2xhc3NEb2MgY29udGFpbmluZ0NsYXNzKCkgey8qdG9kbyovcmV0dXJuIG51bGw7fQorCXB1YmxpYyBib29sZWFuIGlzRmluYWwoKSB7Lyp0b2RvKi9yZXR1cm4gZmFsc2U7fQorCXB1YmxpYyBib29sZWFuIGlzUGFja2FnZVByaXZhdGUoKSB7Lyp0b2RvKi9yZXR1cm4gZmFsc2U7fQorCXB1YmxpYyBib29sZWFuIGlzUHJpdmF0ZSgpIHsvKnRvZG8qL3JldHVybiBmYWxzZTt9CisJcHVibGljIGJvb2xlYW4gaXNQcm90ZWN0ZWQoKSB7Lyp0b2RvKi9yZXR1cm4gZmFsc2U7fQorCXB1YmxpYyBib29sZWFuIGlzUHVibGljKCkgey8qdG9kbyovcmV0dXJuIGZhbHNlO30KKwlwdWJsaWMgYm9vbGVhbiBpc1N0YXRpYygpIHsvKnRvZG8qL3JldHVybiBmYWxzZTt9CisJcHVibGljIFN0cmluZyBtb2RpZmllcnMoKSB7Lyp0b2RvKi9yZXR1cm4gbnVsbDt9CisJcHVibGljIGludCBtb2RpZmllclNwZWNpZmllcigpIHsvKnRvZG8qL3JldHVybiAwO30KKwlwdWJsaWMgU3RyaW5nIHF1YWxpZmllZE5hbWUoKSB7Lyp0b2RvKi9yZXR1cm4gbnVsbDt9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2dyb292eWRvYy9TaW1wbGVHcm9vdnlSb290RG9jLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9ncm9vdnlkb2MvU2ltcGxlR3Jvb3Z5Um9vdERvYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjOWU4ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9ncm9vdnlkb2MvU2ltcGxlR3Jvb3Z5Um9vdERvYy5qYXZhCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLmdyb292eWRvYzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncm9vdnlkb2MuR3Jvb3Z5Q2xhc3NEb2M7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ncm9vdnlkb2MuR3Jvb3Z5UGFja2FnZURvYzsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5Lmdyb292eWRvYy5Hcm9vdnlSb290RG9jOworCitwdWJsaWMgY2xhc3MgU2ltcGxlR3Jvb3Z5Um9vdERvYyBleHRlbmRzIFNpbXBsZUdyb292eURvYyBpbXBsZW1lbnRzIEdyb292eVJvb3REb2MgeworCXByaXZhdGUgTWFwIHBhY2thZ2VEb2NzOworCXByaXZhdGUgTWFwIGNsYXNzRG9jczsKKworCXB1YmxpYyBTaW1wbGVHcm9vdnlSb290RG9jKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCQlwYWNrYWdlRG9jcyA9IG5ldyBIYXNoTWFwKCk7CisJCWNsYXNzRG9jcyA9IG5ldyBIYXNoTWFwKCk7CisJfQorCisJLy8gdG9kbyAtIHRha2UgYWNjb3VudCBvZiBwYWNrYWdlIG5hbWVzICEKKwlwdWJsaWMgR3Jvb3Z5Q2xhc3NEb2MgY2xhc3NOYW1lZChTdHJpbmcgbmFtZSkgeworCQlJdGVyYXRvciBpdHIgPSBjbGFzc0RvY3Mua2V5U2V0KCkuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKKwkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBpdHIubmV4dCgpOworCQkJaW50IGxhc3RTbGFzaElkeCA9IGtleS5sYXN0SW5kZXhPZignLycpOworCQkJaWYgKGxhc3RTbGFzaElkeCA+IDApIHsKKwkJCQlTdHJpbmcgc2hvcnRLZXkgPSBrZXkuc3Vic3RyaW5nKGxhc3RTbGFzaElkeCArIDEpOworCQkJCWlmIChzaG9ydEtleS5lcXVhbHMobmFtZSkpIHsKKwkJCQkJcmV0dXJuIChHcm9vdnlDbGFzc0RvYykgY2xhc3NEb2NzLmdldChrZXkpOworCQkJCX0KKwkJCX0KKwkJfQkJCisJCXJldHVybiBudWxsOworCX0KKwlwdWJsaWMgR3Jvb3Z5Q2xhc3NEb2NbXSBjbGFzc2VzKCkgeworCQlMaXN0IGNsYXNzRG9jVmFsdWVzID0gbmV3IEFycmF5TGlzdChjbGFzc0RvY3MudmFsdWVzKCkpOworCQlDb2xsZWN0aW9ucy5zb3J0KGNsYXNzRG9jVmFsdWVzKTsgLy8gdG9kbyAtIHBlcmZvcm1hbmNlIC8gbWF5YmUgbW92ZSBpbnRvIGEgc29ydE1lKCkgbWV0aG9kCisJCXJldHVybiAoR3Jvb3Z5Q2xhc3NEb2NbXSkgY2xhc3NEb2NWYWx1ZXMudG9BcnJheShuZXcgR3Jvb3Z5Q2xhc3NEb2NbY2xhc3NEb2NWYWx1ZXMuc2l6ZSgpXSk7CQkKKwl9CisJcHVibGljIFN0cmluZ1tdW10gb3B0aW9ucygpIHsvKnRvZG8qL3JldHVybiBudWxsO30KKwlwdWJsaWMgR3Jvb3Z5UGFja2FnZURvYyBwYWNrYWdlTmFtZWQoU3RyaW5nIHBhY2thZ2VOYW1lKSB7CisJCXJldHVybiAoR3Jvb3Z5UGFja2FnZURvYykgcGFja2FnZURvY3MuZ2V0KHBhY2thZ2VOYW1lKTsKKwl9CisJcHVibGljIHZvaWQgcHV0QWxsQ2xhc3NlcyhNYXAgY2xhc3NlcykgeworCQljbGFzc0RvY3MucHV0QWxsKGNsYXNzZXMpOworCX0KKwlwdWJsaWMgdm9pZCBwdXQoU3RyaW5nIHBhY2thZ2VOYW1lLCBHcm9vdnlQYWNrYWdlRG9jIHBhY2thZ2VEb2MpIHsKKwkJcGFja2FnZURvY3MucHV0KHBhY2thZ2VOYW1lLCBwYWNrYWdlRG9jKTsKKwl9CisJCisJcHVibGljIEdyb292eUNsYXNzRG9jW10gc3BlY2lmaWVkQ2xhc3NlcygpIHsvKnRvZG8qL3JldHVybiBudWxsO30KKwlwdWJsaWMgR3Jvb3Z5UGFja2FnZURvY1tdIHNwZWNpZmllZFBhY2thZ2VzKCkgeworCQlMaXN0IHBhY2thZ2VEb2NWYWx1ZXMgPSBuZXcgQXJyYXlMaXN0KHBhY2thZ2VEb2NzLnZhbHVlcygpKTsKKwkJQ29sbGVjdGlvbnMuc29ydChwYWNrYWdlRG9jVmFsdWVzKTsKKwkJcmV0dXJuIChHcm9vdnlQYWNrYWdlRG9jW10pIHBhY2thZ2VEb2NWYWx1ZXMudG9BcnJheShuZXcgR3Jvb3Z5UGFja2FnZURvY1twYWNrYWdlRG9jVmFsdWVzLnNpemUoKV0pOworCX0KKworCQorCQorLy8gR3Jvb3Z5RG9jRXJyb3JSZXBvcnRlciBpbnRlcmZhY2UKKwlwdWJsaWMgdm9pZCBwcmludEVycm9yKFN0cmluZyBhcmcwKSB7Lyp0b2RvKi99CisvLwlwdWJsaWMgdm9pZCBwcmludEVycm9yKEdyb292eVNvdXJjZVBvc2l0aW9uIGFyZzAsIFN0cmluZyBhcmcxKSB7Lyp0b2RvKi99CisJcHVibGljIHZvaWQgcHJpbnROb3RpY2UoU3RyaW5nIGFyZzApIHsvKnRvZG8qL30KKy8vCXB1YmxpYyB2b2lkIHByaW50Tm90aWNlKEdyb292eVNvdXJjZVBvc2l0aW9uIGFyZzAsIFN0cmluZyBhcmcxKSB7Lyp0b2RvKi99CisJcHVibGljIHZvaWQgcHJpbnRXYXJuaW5nKFN0cmluZyBhcmcwKSB7Lyp0b2RvKi99CisvLwlwdWJsaWMgdm9pZCBwcmludFdhcm5pbmcoR3Jvb3Z5U291cmNlUG9zaXRpb24gYXJnMCwgU3RyaW5nIGFyZzEpIHsvKnRvZG8qL30KKworCXB1YmxpYyB2b2lkIHJlc29sdmUoKSB7CisJCS8vcmVzb2x2ZSBjbGFzcyBuYW1lcyBhdCB0aGUgZW5kIG9mIGFkZGluZyBhbGwgZmlsZXMgdG8gdGhlIHRyZWUKKwkJSXRlcmF0b3IgaXRyID0gY2xhc3NEb2NzLnZhbHVlcygpLml0ZXJhdG9yKCk7CisJCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7CisJCQlTaW1wbGVHcm9vdnlDbGFzc0RvYyBjbGFzc0RvYyA9IChTaW1wbGVHcm9vdnlDbGFzc0RvYykgaXRyLm5leHQoKTsKKwkJCWNsYXNzRG9jLnJlc29sdmUodGhpcyk7CisJCX0KKwkJCisJfQorCisKK30KKwpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvZ3Jvb3Z5ZG9jL1NpbXBsZUdyb292eVR5cGUuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2dyb292eWRvYy9TaW1wbGVHcm9vdnlUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYzMWVmOQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2dyb292eWRvYy9TaW1wbGVHcm9vdnlUeXBlLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuZ3Jvb3Z5ZG9jOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3Jvb3Z5ZG9jLio7CisKK3B1YmxpYyBjbGFzcyBTaW1wbGVHcm9vdnlUeXBlIGltcGxlbWVudHMgR3Jvb3Z5VHlwZSB7CisJcHVibGljIFNpbXBsZUdyb292eVR5cGUoU3RyaW5nIHR5cGVOYW1lKSB7CisJCXRoaXMudHlwZU5hbWUgPSB0eXBlTmFtZTsKKwl9CisJcHJpdmF0ZSBTdHJpbmcgdHlwZU5hbWU7CisJcHVibGljIFN0cmluZyB0eXBlTmFtZSgpIHtyZXR1cm4gdHlwZU5hbWU7fQorCQorLy8JcHVibGljIEdyb292eUFubm90YXRpb25UeXBlRG9jIGFzQW5ub3RhdGlvblR5cGVEb2MoKSB7Lyp0b2RvKi9yZXR1cm4gbnVsbDt9CisJcHVibGljIEdyb292eUNsYXNzRG9jIGFzQ2xhc3NEb2MoKSB7Lyp0b2RvKi9yZXR1cm4gbnVsbDt9CisvLwlwdWJsaWMgR3Jvb3Z5UGFyYW1ldGVyaXplZFR5cGUgYXNQYXJhbWV0ZXJpemVkVHlwZSgpIHsvKnRvZG8qL3JldHVybiBudWxsO30KKy8vCXB1YmxpYyBHcm9vdnlUeXBlVmFyaWFibGUgYXNUeXBlVmFyaWFibGUoKSB7Lyp0b2RvKi9yZXR1cm4gbnVsbDt9CisvLwlwdWJsaWMgR3Jvb3Z5V2lsZGNhcmRUeXBlIGFzV2lsZGNhcmRUeXBlKCkgey8qdG9kbyovcmV0dXJuIG51bGw7fQorCXB1YmxpYyBTdHJpbmcgZGltZW5zaW9uKCkgey8qdG9kbyovcmV0dXJuIG51bGw7fQorCXB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlKCkgey8qdG9kbyovcmV0dXJuIGZhbHNlO30KKwlwdWJsaWMgU3RyaW5nIHF1YWxpZmllZFR5cGVOYW1lKCkgey8qdG9kbyovcmV0dXJuIG51bGw7fQorCXB1YmxpYyBTdHJpbmcgc2ltcGxlVHlwZU5hbWUoKSB7Lyp0b2RvKi9yZXR1cm4gbnVsbDt9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9ncm9vdnlkb2MvZ3N0cmluZy10ZW1wbGF0ZXMvY2xhc3MtbGV2ZWwvY2xhc3NEb2NOYW1lLmh0bWwgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9ncm9vdnlkb2MvZ3N0cmluZy10ZW1wbGF0ZXMvY2xhc3MtbGV2ZWwvY2xhc3NEb2NOYW1lLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg1NDBiMQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2dyb292eWRvYy9nc3RyaW5nLXRlbXBsYXRlcy9jbGFzcy1sZXZlbC9jbGFzc0RvY05hbWUuaHRtbApAQCAtMCwwICsxLDE1NiBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Cis8IS0tTmV3UGFnZS0tPgorPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorPCEtLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIC0tPgorPCEtLSAqICBQTEVBU0UgS0VFUCBDT01QTElDQVRFRCBFWFBSRVNTSU9OUyAqIC0tPgorPCEtLSAqICBPVVQgT0YgVEhFU0UgVEVNUExBVEVTLiAgICAgICAgICAgICAqIC0tPgorPCEtLSAqICBpLmUuIG9ubHkgaXRlcmF0ZSAmIHByaW50IGRhdGEgICAgICAqIC0tPgorPCEtLSAqICBUaGFua3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIC0tPgorPCEtLSAqICBKZXouICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIC0tPgorPCEtLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIC0tPgorPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorPEhUTUw+Cis8SEVBRD4KKzwhLS0gR2VuZXJhdGVkIGJ5IGdyb292eWRvYyAoSmVyZW15IFJheW5lciAyMDA3KSAtLT4KKzxUSVRMRT4KKyR7Y2xhc3NEb2MubmFtZSgpfQorPC9USVRMRT4KKworPE1FVEEgTkFNRT0ia2V5d29yZHMiIENPTlRFTlQ9ImdldFRpbWV6b25lT2Zmc2V0KCkiPgorCis8IS0tIHRvZG8gc3R5bGVzaGVldCByZWxhdGl2ZSBwYXRoIC0tPgorPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9IiR7Y2xhc3NEb2MuZ2V0UmVsYXRpdmVSb290UGF0aCgpfXN0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgorCis8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+CitmdW5jdGlvbiB3aW5kb3dUaXRsZSgpCit7CisgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPSIke2NsYXNzRG9jLm5hbWUoKX0iOworfQorPC9TQ1JJUFQ+Cis8Tk9TQ1JJUFQ+Cis8L05PU0NSSVBUPgorCis8L0hFQUQ+CisKKzxCT0RZIEJHQ09MT1I9IndoaXRlIiBvbmxvYWQ9IndpbmRvd1RpdGxlKCk7Ij4KKworCisKKzxIUj4KKzwhLS0gPT09PT09PT0gU1RBUlQgT0YgQ0xBU1MgREFUQSA9PT09PT09PSAtLT4KKzxIMj4KKzxGT05UIFNJWkU9Ii0xIj4KKyR7Y2xhc3NEb2MuY29udGFpbmluZ1BhY2thZ2UoKS5uYW1lV2l0aERvdHMoKX08L0ZPTlQ+Cis8QlI+Cis8Rk9OVCBDTEFTUz0iQ2xhc3NUaXRsZUZvbnQiPkNsYXNzICR7Y2xhc3NEb2MubmFtZSgpfTwvRk9OVD48L0gyPgorPFA+Ciske2NsYXNzRG9jLmNvbW1lbnRUZXh0KCl9Cis8L1A+Cis8IS0tID09PT09PT09IENPTlNUUlVDVE9SIFNVTU1BUlkgPT09PT09PT0gLS0+CisKKzxBIE5BTUU9ImNvbnN0cnVjdG9yX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgorPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KKzxUUiBCR0NPTE9SPSIjRDVENUZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgorPFREIENPTFNQQU49Mj48Rk9OVCBTSVpFPSIrMiI+Cis8Qj5Db25zdHJ1Y3RvciBTdW1tYXJ5PC9CPjwvRk9OVD48L1REPgorCis8L1RSPgorPCUgZm9yIChjb25zdHJ1Y3RvciBpbiBjbGFzc0RvYy5jb25zdHJ1Y3RvcnMoKSkgeyAlPgorPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Cis8VEQ+PENPREU+PEI+PGEgaHJlZj0iIj4ke2NvbnN0cnVjdG9yLm5hbWUoKX08L2E+PC9CPig8JT0gY29uc3RydWN0b3IucGFyYW1ldGVycygpLmNvbGxlY3R7IHBhcmFtIC0+ICIke3BhcmFtLnR5cGVOYW1lKCl9ICR7cGFyYW0ubmFtZSgpfSIgfS5qb2luKCIsICIpICU+KTwvQ09ERT4KKworPEJSPgorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7JHtjb25zdHJ1Y3Rvci5maXJzdFNlbnRlbmNlQ29tbWVudFRleHQoKX08L1REPgorPC9UUj4KKzwlIH0gJT4KKzwvVEFCTEU+CismbmJzcDsKKzwhLS0gPT09PT09PT09PSBNRVRIT0QgU1VNTUFSWSA9PT09PT09PT09PSAtLT4KKworPEEgTkFNRT0ibWV0aG9kX3N1bW1hcnkiPjwhLS0gLS0+PC9BPgorPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KKzxUUiBCR0NPTE9SPSIjRDVENUZGIiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgorPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiIgQ0xBU1M9IkNsYXNzSGVhZGluZ0ZvbnQiPgorPEI+TWV0aG9kIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Cis8L1RSPgorCis8JSBmb3IgKG1ldGhvZCBpbiBjbGFzc0RvYy5tZXRob2RzKCkpIHsgJT4KKworICA8VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KKyAgICA8VEQgQUxJR049InJpZ2h0IiBWQUxJR049InRvcCIgV0lEVEg9IjElIj48Rk9OVCBTSVpFPSItMSIgQ0xBU1M9IkNsYXNzSXRlbUZvbnQiPgorICAgIDxDT0RFPiZuYnNwOyR7bWV0aG9kLnJldHVyblR5cGUoKS50eXBlTmFtZSgpfTwvQ09ERT48L0ZPTlQ+PC9URD4KKyAgICA8VEQ+PEZPTlQgQ0xBU1M9IkNsYXNzSXRlbUZvbnQiPjxDT0RFPjxCPjxhIGhyZWY9IiI+JHttZXRob2QubmFtZSgpfTwvYT48L0I+KDwlPSBtZXRob2QucGFyYW1ldGVycygpLmNvbGxlY3R7IHBhcmFtIC0+ICIke3BhcmFtLnR5cGVOYW1lKCl9ICR7cGFyYW0ubmFtZSgpfSIgfS5qb2luKCIsICIpICU+KTwvQ09ERT48L0ZPTlQ+CisKKyAgICA8QlI+CisgICAgPEZPTlQgQ0xBU1M9IkNsYXNzSXRlbUZvbnQiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyR7bWV0aG9kLmZpcnN0U2VudGVuY2VDb21tZW50VGV4dCgpfTwvRk9OVD4KKyAgICA8L1REPgorICA8L1RSPgorCis8JSB9ICU+CisKKworCisKKworPC9UQUJMRT4KKyZuYnNwOworPFA+Cis8IS0tID09PT09PT09PSBDT05TVFJVQ1RPUiBERVRBSUwgPT09PT09PT0gLS0+CisKKzxBIE5BTUU9ImNvbnN0cnVjdG9yX2RldGFpbCI+PCEtLSAtLT48L0E+Cis8VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgorPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Cis8VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KKzxCPkNvbnN0cnVjdG9yIERldGFpbDwvQj48L0ZPTlQ+PC9USD4KKzwvVFI+Cis8L1RBQkxFPgorPCUgZm9yIChjb25zdHJ1Y3RvciBpbiBjbGFzc0RvYy5jb25zdHJ1Y3RvcnMoKSkgeyAlPgorPEEgTkFNRT0iUU5hbWUoamF2YS5sYW5nLlN0cmluZykiPjwhLS0gLS0+PC9BPjxIMz4KKyR7Y29uc3RydWN0b3IubmFtZSgpfTwvSDM+Cis8UFJFPgorPCEtLSB0b2RvIC0gcHVibGljLS0+IDxCPiR7Y29uc3RydWN0b3IubmFtZSgpfTwvQj4oPCU9IGNvbnN0cnVjdG9yLnBhcmFtZXRlcnMoKS5jb2xsZWN0eyBwYXJhbSAtPiAiJHtwYXJhbS50eXBlTmFtZSgpfSAke3BhcmFtLm5hbWUoKX0iIH0uam9pbigiLCAiKSAlPik8L1BSRT4KKzxETD4KKzxERD4ke2NvbnN0cnVjdG9yLmNvbW1lbnRUZXh0KCl9Cis8UD4KKzwhLS08REw+Cis8RFQ+IHRvZG8gPEI+UGFyYW1ldGVyczo8L0I+PEREPjxDT0RFPmxvY2FsUGFydDwvQ09ERT4gLSBMb2NhbCBwYXJ0IG9mIHRoZSBRTmFtZTwvREw+LS0+CisKKzwvREw+Cis8SFI+Cis8JSB9ICU+CisKKzwhLS0gPT09PT09PT09PT09IE1FVEhPRCBERVRBSUwgPT09PT09PT09PSAtLT4KKworPEEgTkFNRT0ibWV0aG9kX2RldGFpbCI+PCEtLSAtLT48L0E+Cis8VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgorPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Cis8VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KKzxCPk1ldGhvZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Cis8L1RSPgorPC9UQUJMRT4KKzwlIGZvciAobWV0aG9kIGluIGNsYXNzRG9jLm1ldGhvZHMoKSkgeyAlPgorPEEgTkFNRT0iJHttZXRob2QubmFtZSgpfSI+PCEtLSAtLT48L0E+PEgzPgorJHttZXRob2QubmFtZSgpfTwvSDM+Cis8UFJFPgorPCEtLSB0b2RvIC0gcHVibGljLS0+ICR7bWV0aG9kLnJldHVyblR5cGUoKS50eXBlTmFtZSgpfSA8Qj4ke21ldGhvZC5uYW1lKCl9PC9CPig8JT0gbWV0aG9kLnBhcmFtZXRlcnMoKS5jb2xsZWN0eyBwYXJhbSAtPiAiJHtwYXJhbS50eXBlTmFtZSgpfSAke3BhcmFtLm5hbWUoKX0iIH0uam9pbigiLCAiKSAlPik8L1BSRT4KKworPERMPgorPEREPiR7bWV0aG9kLmNvbW1lbnRUZXh0KCl9Cis8UD4KKzxERD48REw+Cis8L0RMPgorPC9ERD4KKzxERD48REw+CisKKzxEVD48Qj48IS0tdG9kbyBSZXR1cm5zOi0tPjwvQj48REQ+PCEtLSB0b2RvIC0tPjwvREw+Cis8L0REPgorPC9ETD4KKzxIUj4KKzwlIH0gJT4KKwkKKzwhLS0gPT09PT09PT09IEVORCBPRiBDTEFTUyBEQVRBID09PT09PT09PSAtLT4KKzxIUj4KKworCis8L0JPRFk+Cis8L0hUTUw+CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9ncm9vdnlkb2MvZ3N0cmluZy10ZW1wbGF0ZXMvY2xhc3MtbGV2ZWwvY2xhc3NEb2NTdHJ1Y3R1cmVkRGF0YS54bWwgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9ncm9vdnlkb2MvZ3N0cmluZy10ZW1wbGF0ZXMvY2xhc3MtbGV2ZWwvY2xhc3NEb2NTdHJ1Y3R1cmVkRGF0YS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY5ZWU5OQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2dyb292eWRvYy9nc3RyaW5nLXRlbXBsYXRlcy9jbGFzcy1sZXZlbC9jbGFzc0RvY1N0cnVjdHVyZWREYXRhLnhtbApAQCAtMCwwICsxLDI0IEBACis8Y2xhc3MgbmFtZT0iJHtjbGFzc0RvYy5uYW1lKCl9Ij4KKyAgPGNvbnRhaW5pbmdQYWNrYWdlIG5hbWU9IiR7Y2xhc3NEb2MuY29udGFpbmluZ1BhY2thZ2UoKS5uYW1lKCl9Ij4ke2NsYXNzRG9jLmNvbnRhaW5pbmdQYWNrYWdlKCkubmFtZVdpdGhEb3RzKCl9PC9jb250YWluaW5nUGFja2FnZT4KKyAgPGV4dGVuZHM+JHtjbGFzc0RvYy5zdXBlcmNsYXNzKCkubmFtZSgpfTwvZXh0ZW5kcz4KKyAgPGNvbW1lbnQ+JHtjbGFzc0RvYy5jb21tZW50VGV4dCgpfTwvY29tbWVudD4KKyAgPGNvbnN0cnVjdG9ycz48JSBmb3IgKGNvbnN0cnVjdG9yIGluIGNsYXNzRG9jLmNvbnN0cnVjdG9ycygpKSB7ICU+CisgICAgPGNvbnN0cnVjdG9yIG5hbWU9IiR7Y29uc3RydWN0b3IubmFtZSgpfSI+CisgICAgICA8cGFyYW1ldGVycz48JSBmb3IgKHBhcmFtZXRlciBpbiBjb25zdHJ1Y3Rvci5wYXJhbWV0ZXJzKCkpIHsgJT4KKyAgICAgICAgPHBhcmFtZXRlciB0eXBlPSIke3BhcmFtZXRlci50eXBlTmFtZSgpfSIgbmFtZT0iJHtwYXJhbWV0ZXIubmFtZSgpfSIgLz48JSB9ICU+CisgICAgICA8L3BhcmFtZXRlcnM+CisgICAgICA8Y29tbWVudD4ke2NvbnN0cnVjdG9yLmNvbW1lbnRUZXh0KCl9PC9jb21tZW50PgorICAgIDwvY29uc3RydWN0b3I+Cis8JSB9ICU+CisgIDwvY29uc3RydWN0b3JzPgorCisgIDxtZXRob2RzPjwlIGZvciAobWV0aG9kIGluIGNsYXNzRG9jLm1ldGhvZHMoKSkgeyAlPgorICAgIDxtZXRob2QgcmV0dXJucz0iJHttZXRob2QucmV0dXJuVHlwZSgpLnR5cGVOYW1lKCl9IiBuYW1lPSIke21ldGhvZC5uYW1lKCl9Ij4KKyAgICAgIDxwYXJhbWV0ZXJzPjwlIGZvciAocGFyYW1ldGVyIGluIG1ldGhvZC5wYXJhbWV0ZXJzKCkpIHsgJT4KKyAgICAgICAgPHBhcmFtZXRlciB0eXBlPSIke3BhcmFtZXRlci50eXBlTmFtZSgpfSIgbmFtZT0iJHtwYXJhbWV0ZXIubmFtZSgpfSIgLz48JSB9ICU+CisgICAgICA8L3BhcmFtZXRlcnM+CisgICAgICA8Y29tbWVudD4ke21ldGhvZC5jb21tZW50VGV4dCgpfTwvY29tbWVudD4KKyAgICA8L21ldGhvZD4KKzwlIH0gJT4KKyAgPC9tZXRob2RzPgorPC9jbGFzcz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9ncm9vdnlkb2MvZ3N0cmluZy10ZW1wbGF0ZXMvcGFja2FnZS1sZXZlbC9wYWNrYWdlLWZyYW1lLmh0bWwgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9ncm9vdnlkb2MvZ3N0cmluZy10ZW1wbGF0ZXMvcGFja2FnZS1sZXZlbC9wYWNrYWdlLWZyYW1lLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJkOTliNQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2dyb292eWRvYy9nc3RyaW5nLXRlbXBsYXRlcy9wYWNrYWdlLWxldmVsL3BhY2thZ2UtZnJhbWUuaHRtbApAQCAtMCwwICsxLDQ2IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KKzxIVE1MPgorPEhFQUQ+Cis8VElUTEU+Ciske3BhY2thZ2VEb2MubmFtZVdpdGhEb3RzKCl9Cis8L1RJVExFPgorCis8TUVUQSBOQU1FPSJrZXl3b3JkcyIgQ09OVEVOVD0iJHtwYWNrYWdlRG9jLm5hbWUoKX0gcGFja2FnZSI+CisKKzxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSIke3BhY2thZ2VEb2MuZ2V0UmVsYXRpdmVSb290UGF0aCgpfXN0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgorCisKKzwvSEVBRD4KKworPEJPRFkgQkdDT0xPUj0id2hpdGUiPgorPEZPTlQgc2l6ZT0iKzEiIENMQVNTPSJGcmFtZVRpdGxlRm9udCI+Cis8QSBIUkVGPSJwYWNrYWdlLXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj4ke3BhY2thZ2VEb2MubmFtZVdpdGhEb3RzKCl9PC9BPjwvRk9OVD4KKzxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBTVU1NQVJZPSIiPgorPFRSPgorPFREIE5PV1JBUD48Rk9OVCBzaXplPSIrMSIgQ0xBU1M9IkZyYW1lSGVhZGluZ0ZvbnQiPgorSW50ZXJmYWNlczwvRk9OVD4mbmJzcDsKKzxGT05UIENMQVNTPSJGcmFtZUl0ZW1Gb250Ij4KKzxCUj4KKzwhLS08QSBIUkVGPSJQYXVzYWJsZS5odG1sIiB0aXRsZT0iaW50ZXJmYWNlIGluIGNvbS5qYXZhbmljdXMucmVkYm9vayIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj48ST5QYXVzYWJsZTwvST48L0E+LS0+Cis8L0ZPTlQ+PC9URD4KKzwvVFI+Cis8L1RBQkxFPgorCisKKzxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBTVU1NQVJZPSIiPgorPFRSPgorPFREIE5PV1JBUD48Rk9OVCBzaXplPSIrMSIgQ0xBU1M9IkZyYW1lSGVhZGluZ0ZvbnQiPgorQ2xhc3NlczwvRk9OVD4mbmJzcDsKKzxGT05UIENMQVNTPSJGcmFtZUl0ZW1Gb250Ij4KKzwhLS08QlI+Cis8QSBIUkVGPSJTaW1wbGVGcmFtZS5odG1sIiB0aXRsZT0iY2xhc3MgaW4gY29tLmphdmFuaWN1cy5yZWRib29rIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPlNpbXBsZUZyYW1lPC9BPi0tPgorPCUgZm9yIChjbGFzc0RvYyBpbiBwYWNrYWdlRG9jLm9yZGluYXJ5Q2xhc3NlcygpKSB7ICU+Cis8QlI+Cis8QSBIUkVGPSIke2NsYXNzRG9jLm5hbWUoKX0uaHRtbCIgdGl0bGU9ImNsYXNzIGluICR7cGFja2FnZURvYy5uYW1lKCl9IiB0YXJnZXQ9ImNsYXNzRnJhbWUiPiR7Y2xhc3NEb2MubmFtZSgpfTwvQT4KKzwlIH0gJT4KKzwvVFI+Cis8L1RBQkxFPgorCisKKzwvQk9EWT4KKzwvSFRNTD4KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2dyb292eWRvYy9nc3RyaW5nLXRlbXBsYXRlcy9wYWNrYWdlLWxldmVsL3BhY2thZ2Utc3VtbWFyeS5odG1sIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvZ3Jvb3Z5ZG9jL2dzdHJpbmctdGVtcGxhdGVzL3BhY2thZ2UtbGV2ZWwvcGFja2FnZS1zdW1tYXJ5Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYwZGUzMQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2dyb292eWRvYy9nc3RyaW5nLXRlbXBsYXRlcy9wYWNrYWdlLWxldmVsL3BhY2thZ2Utc3VtbWFyeS5odG1sCkBAIC0wLDAgKzEsNjggQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgorPEhUTUw+Cis8SEVBRD4KKzxUSVRMRT4KKyR7cGFja2FnZURvYy5uYW1lV2l0aERvdHMoKX0gKHt0b2RvLnRpdGxlfSkKKzwvVElUTEU+CisKKzxNRVRBIE5BTUU9ImtleXdvcmRzIiBDT05URU5UPSIke3BhY2thZ2VEb2MubmFtZVdpdGhEb3RzKCl9IHBhY2thZ2UiPgorCis8TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0iJHtwYWNrYWdlRG9jLmdldFJlbGF0aXZlUm9vdFBhdGgoKX1zdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KKworPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorZnVuY3Rpb24gd2luZG93VGl0bGUoKQoreworICAgIHBhcmVudC5kb2N1bWVudC50aXRsZT0iJHtwYWNrYWdlRG9jLm5hbWVXaXRoRG90cygpfSAoe3RvZG8udGl0bGV9KSI7Cit9Cis8L1NDUklQVD4KKzxOT1NDUklQVD4KKzwvTk9TQ1JJUFQ+CisKKzwvSEVBRD4KKworPEJPRFkgQkdDT0xPUj0id2hpdGUiIG9ubG9hZD0id2luZG93VGl0bGUoKTsiPgorCisKKworPEhSPgorPEgyPgorUGFja2FnZSAke3BhY2thZ2VEb2MubmFtZVdpdGhEb3RzKCl9Cis8L0gyPgorCis8VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgorPFRSIEJHQ09MT1I9IiM5MERERjciIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Cis8VEggQUxJR049ImxlZnQiIENPTFNQQU49IjIiPjxGT05UIFNJWkU9IisyIj4KKzxCPkludGVyZmFjZSBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgorPC9UUj4KKzwhLS08VFIgQkdDT0xPUj0id2hpdGUiIENMQVNTPSJUYWJsZVJvd0NvbG9yIj4KKzxURCBXSURUSD0iMTUlIj48Qj48QSBIUkVGPSIuLi8uLi8uLi9jb20vamF2YW5pY3VzL3JlZGJvb2svUGF1c2FibGUuaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBjb20uamF2YW5pY3VzLnJlZGJvb2siPlBhdXNhYmxlPC9BPjwvQj48L1REPgorPFREPiZuYnNwOzwvVEQ+Cis8L1RSPi0tPgorPC9UQUJMRT4KKyZuYnNwOworCis8UD4KKworPFRBQkxFIEJPUkRFUj0iMSIgV0lEVEg9IjEwMCUiIENFTExQQURESU5HPSIzIiBDRUxMU1BBQ0lORz0iMCIgU1VNTUFSWT0iIj4KKzxUUiBCR0NPTE9SPSIjOTBEREY3IiBDTEFTUz0iVGFibGVIZWFkaW5nQ29sb3IiPgorPFRIIEFMSUdOPSJsZWZ0IiBDT0xTUEFOPSIyIj48Rk9OVCBTSVpFPSIrMiI+Cis8Qj5DbGFzcyBTdW1tYXJ5PC9CPjwvRk9OVD48L1RIPgorPC9UUj4KKzwlIGZvciAoY2xhc3NEb2MgaW4gcGFja2FnZURvYy5vcmRpbmFyeUNsYXNzZXMoKSkgeyAlPgorPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Cis8VEQgV0lEVEg9IjE1JSI+PEI+PEEgSFJFRj0iJHtjbGFzc0RvYy5uYW1lKCl9Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiAke3BhY2thZ2VEb2MubmFtZSgpfSI+JHtjbGFzc0RvYy5uYW1lKCl9PC9BPjwvQj48L1REPgorPFREPiZuYnNwOzwvVEQ+Cis8L1RSPgorPCUgfSAlPgorPC9UQUJMRT4KKyZuYnNwOworCis8UD4KKzxETD4KKzwvREw+CisKKworPEhSPgorCis8L0JPRFk+Cis8L0hUTUw+CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9ncm9vdnlkb2MvZ3N0cmluZy10ZW1wbGF0ZXMvcGFja2FnZS1sZXZlbC9wYWNrYWdlRG9jU3RydWN0dXJlZERhdGEueG1sIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvZ3Jvb3Z5ZG9jL2dzdHJpbmctdGVtcGxhdGVzL3BhY2thZ2UtbGV2ZWwvcGFja2FnZURvY1N0cnVjdHVyZWREYXRhLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjBjN2Y4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvZ3Jvb3Z5ZG9jL2dzdHJpbmctdGVtcGxhdGVzL3BhY2thZ2UtbGV2ZWwvcGFja2FnZURvY1N0cnVjdHVyZWREYXRhLnhtbApAQCAtMCwwICsxLDYgQEAKKzxwYWNrYWdlPgorICA8Y2xhc3Nlcz48JSBmb3IgKGNsYXNzRG9jIGluIHBhY2thZ2VEb2Mub3JkaW5hcnlDbGFzc2VzKCkpIHsgJT4KKyAgICA8Y2xhc3MgbmFtZT0iJHtjbGFzc0RvYy5uYW1lKCl9IiAvPgorPCUgfSAlPgorICA8L2NsYXNzZXM+Cis8L3BhY2thZ2U+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvZ3Jvb3Z5ZG9jL2dzdHJpbmctdGVtcGxhdGVzL3RvcC1sZXZlbC9hbGxjbGFzc2VzLWZyYW1lLmh0bWwgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9ncm9vdnlkb2MvZ3N0cmluZy10ZW1wbGF0ZXMvdG9wLWxldmVsL2FsbGNsYXNzZXMtZnJhbWUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjI3ZjY5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvZ3Jvb3Z5ZG9jL2dzdHJpbmctdGVtcGxhdGVzL3RvcC1sZXZlbC9hbGxjbGFzc2VzLWZyYW1lLmh0bWwKQEAgLTAsMCArMSwzMyBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Cis8SFRNTD4KKzxIRUFEPgorPFRJVExFPgorQWxsIENsYXNzZXMKKzwvVElUTEU+CisKKzxMSU5LIFJFTCA9InN0eWxlc2hlZXQiIFRZUEU9InRleHQvY3NzIiBIUkVGPSJzdHlsZXNoZWV0LmNzcyIgVElUTEU9IlN0eWxlIj4KKworPC9IRUFEPgorCis8Qk9EWSBCR0NPTE9SPSJ3aGl0ZSI+Cis8Rk9OVCBzaXplPSIrMSIgQ0xBU1M9IkZyYW1lSGVhZGluZ0ZvbnQiPgorPEI+QWxsIENsYXNzZXM8L0I+PC9GT05UPgorCis8QlI+CisKKzxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBTVU1NQVJZPSIiPgorPFRSPgorPFREIE5PV1JBUD48Rk9OVCBDTEFTUz0iRnJhbWVJdGVtRm9udCI+Cis8IS0tPEEgSFJFRj0ib3JnL29tZy9DT1JCQS9BUkdfSU4uaHRtbCIgdGl0bGU9ImludGVyZmFjZSBpbiBvcmcub21nLkNPUkJBIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPjxJPkFSR19JTjwvST48L0E+LS0+Cis8IS0tPEJSPi0tPgorPCUgZm9yIChjbGFzc0RvYyBpbiByb290RG9jLmNsYXNzZXMoKSkgeyAlPgorPEEgSFJFRj0iJHtjbGFzc0RvYy5nZXRGdWxsUGF0aE5hbWUoKX0uaHRtbCIgdGl0bGU9InRvZG8gY2xhc3NEb2MuZ2V0VGl0bGUoKSIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj4ke2NsYXNzRG9jLm5hbWUoKX08L0E+Cis8QlI+Cis8JSB9ICU+CisJICAKKzwvRk9OVD48L1REPgorPC9UUj4KKzwvVEFCTEU+CisKKzwvQk9EWT4KKzwvSFRNTD4KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2dyb292eWRvYy9nc3RyaW5nLXRlbXBsYXRlcy90b3AtbGV2ZWwvaW5kZXguaHRtbCBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2dyb292eWRvYy9nc3RyaW5nLXRlbXBsYXRlcy90b3AtbGV2ZWwvaW5kZXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2U3ZmQwCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvZ3Jvb3Z5ZG9jL2dzdHJpbmctdGVtcGxhdGVzL3RvcC1sZXZlbC9pbmRleC5odG1sCkBAIC0wLDAgKzEsMzUgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIEZyYW1lc2V0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2ZyYW1lc2V0LmR0ZCI+Cis8SFRNTD4KKzxIRUFEPgorPFRJVExFPgore3RvZG8udGl0bGV9Cis8L1RJVExFPgorPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorICAgIHRhcmdldFBhZ2UgPSAiIiArIHdpbmRvdy5sb2NhdGlvbi5zZWFyY2g7CisgICAgaWYgKHRhcmdldFBhZ2UgIT0gIiIgJiYgdGFyZ2V0UGFnZSAhPSAidW5kZWZpbmVkIikKKyAgICAgICB0YXJnZXRQYWdlID0gdGFyZ2V0UGFnZS5zdWJzdHJpbmcoMSk7CisgICAgZnVuY3Rpb24gbG9hZEZyYW1lcygpIHsKKyAgICAgICAgaWYgKHRhcmdldFBhZ2UgIT0gIiIgJiYgdGFyZ2V0UGFnZSAhPSAidW5kZWZpbmVkIikKKyAgICAgICAgICAgICB0b3AuY2xhc3NGcmFtZS5sb2NhdGlvbiA9IHRvcC50YXJnZXRQYWdlOworICAgIH0KKzwvU0NSSVBUPgorPE5PU0NSSVBUPgorPC9OT1NDUklQVD4KKzwvSEVBRD4KKzxGUkFNRVNFVCBjb2xzPSIyMCUsODAlIiB0aXRsZT0iIiBvbkxvYWQ9InRvcC5sb2FkRnJhbWVzKCkiPgorPEZSQU1FU0VUIHJvd3M9IjMwJSw3MCUiIHRpdGxlPSIiIG9uTG9hZD0idG9wLmxvYWRGcmFtZXMoKSI+Cis8RlJBTUUgc3JjPSJvdmVydmlldy1mcmFtZS5odG1sIiBuYW1lPSJwYWNrYWdlTGlzdEZyYW1lIiB0aXRsZT0iQWxsIFBhY2thZ2VzIj4KKzxGUkFNRSBzcmM9ImFsbGNsYXNzZXMtZnJhbWUuaHRtbCIgbmFtZT0icGFja2FnZUZyYW1lIiB0aXRsZT0iQWxsIGNsYXNzZXMgYW5kIGludGVyZmFjZXMgKGV4Y2VwdCBub24tc3RhdGljIG5lc3RlZCB0eXBlcykiPgorPC9GUkFNRVNFVD4KKzxGUkFNRSBzcmM9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCIgbmFtZT0iY2xhc3NGcmFtZSIgdGl0bGU9IlBhY2thZ2UsIGNsYXNzIGFuZCBpbnRlcmZhY2UgZGVzY3JpcHRpb25zIiBzY3JvbGxpbmc9InllcyI+Cis8Tk9GUkFNRVM+Cis8SDI+CitGcmFtZSBBbGVydDwvSDI+CisKKzxQPgorVGhpcyBkb2N1bWVudCBpcyBkZXNpZ25lZCB0byBiZSB2aWV3ZWQgdXNpbmcgdGhlIGZyYW1lcyBmZWF0dXJlLiBJZiB5b3Ugc2VlIHRoaXMgbWVzc2FnZSwgeW91IGFyZSB1c2luZyBhIG5vbi1mcmFtZS1jYXBhYmxlIHdlYiBjbGllbnQuCis8QlI+CitMaW5rIHRvPEEgSFJFRj0ib3ZlcnZpZXctc3VtbWFyeS5odG1sIj5Ob24tZnJhbWUgdmVyc2lvbi48L0E+Cis8L05PRlJBTUVTPgorPC9GUkFNRVNFVD4KKzwvSFRNTD4KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2dyb292eWRvYy9nc3RyaW5nLXRlbXBsYXRlcy90b3AtbGV2ZWwvb3ZlcnZpZXctZnJhbWUuaHRtbCBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2dyb292eWRvYy9nc3RyaW5nLXRlbXBsYXRlcy90b3AtbGV2ZWwvb3ZlcnZpZXctZnJhbWUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzRiMWE2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvZ3Jvb3Z5ZG9jL2dzdHJpbmctdGVtcGxhdGVzL3RvcC1sZXZlbC9vdmVydmlldy1mcmFtZS5odG1sCkBAIC0wLDAgKzEsNDMgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgorPEhUTUw+Cis8SEVBRD4KKzxUSVRMRT4KK092ZXJ2aWV3ICh7dG9kby50aXRsZX0pCis8L1RJVExFPgorCis8TUVUQSBOQU1FPSJrZXl3b3JkcyIgQ09OVEVOVD0iT3ZlcnZpZXciPgorCis8TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0ic3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+CisKKworPC9IRUFEPgorCis8Qk9EWSBCR0NPTE9SPSJ3aGl0ZSI+CisKKzxUQUJMRSBCT1JERVI9IjAiIFdJRFRIPSIxMDAlIiBTVU1NQVJZPSIiPgorPFRSPgorPFRIIEFMSUdOPSJsZWZ0IiBOT1dSQVA+PEZPTlQgc2l6ZT0iKzEiIENMQVNTPSJGcmFtZVRpdGxlRm9udCI+Cis8Qj48L0I+PC9GT05UPjwvVEg+Cis8L1RSPgorPC9UQUJMRT4KKworPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIFNVTU1BUlk9IiI+Cis8VFI+Cis8VEQgTk9XUkFQPjxGT05UIENMQVNTPSJGcmFtZUl0ZW1Gb250Ij48QSBIUkVGPSJhbGxjbGFzc2VzLWZyYW1lLmh0bWwiIHRhcmdldD0icGFja2FnZUZyYW1lIj5BbGwgQ2xhc3NlczwvQT48L0ZPTlQ+Cis8UD4KKzxGT05UIHNpemU9IisxIiBDTEFTUz0iRnJhbWVIZWFkaW5nRm9udCI+CitQYWNrYWdlczwvRk9OVD4KKzxCUj4KKzwhLS08Rk9OVCBDTEFTUz0iRnJhbWVJdGVtRm9udCI+PEEgSFJFRj0iY29tL2phdmFuaWN1cy9yZWRib29rL2RlY29yYXRvci9wYWNrYWdlLWZyYW1lLmh0bWwiIHRhcmdldD0icGFja2FnZUZyYW1lIj5jb20uamF2YW5pY3VzLnJlZGJvb2suZGVjb3JhdG9yPC9BPjwvRk9OVD4tLT4KKzwlIGZvciAocGFja2FnZURvYyBpbiByb290RG9jLnNwZWNpZmllZFBhY2thZ2VzKCkpIHsgJT4KKzxGT05UIENMQVNTPSJGcmFtZUl0ZW1Gb250Ij48QSBIUkVGPSIke3BhY2thZ2VEb2MubmFtZSgpfS9wYWNrYWdlLWZyYW1lLmh0bWwiIHRhcmdldD0icGFja2FnZUZyYW1lIj4ke3BhY2thZ2VEb2MubmFtZVdpdGhEb3RzKCl9PC9BPjwvRk9OVD4KKzxCUj4KKzwlIH0gJT4KKzwvVEQ+Cis8L1RSPgorPC9UQUJMRT4KKworPFA+CismbmJzcDsKKzwvQk9EWT4KKzwvSFRNTD4KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2dyb292eWRvYy9nc3RyaW5nLXRlbXBsYXRlcy90b3AtbGV2ZWwvb3ZlcnZpZXctc3VtbWFyeS5odG1sIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvZ3Jvb3Z5ZG9jL2dzdHJpbmctdGVtcGxhdGVzL3RvcC1sZXZlbC9vdmVydmlldy1zdW1tYXJ5Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjViMTI1MwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2dyb292eWRvYy9nc3RyaW5nLXRlbXBsYXRlcy90b3AtbGV2ZWwvb3ZlcnZpZXctc3VtbWFyeS5odG1sCkBAIC0wLDAgKzEsNTAgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgorPEhUTUw+Cis8SEVBRD4KKzxUSVRMRT4KK092ZXJ2aWV3ICh7dG9kby50aXRsZX0pCis8L1RJVExFPgorCis8TUVUQSBOQU1FPSJrZXl3b3JkcyIgQ09OVEVOVD0iT3ZlcnZpZXciPgorCis8TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0ic3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+CisKKzxTQ1JJUFQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KK2Z1bmN0aW9uIHdpbmRvd1RpdGxlKCkKK3sKKyAgICBwYXJlbnQuZG9jdW1lbnQudGl0bGU9Ik92ZXJ2aWV3ICh7dG9kby50aXRsZX0pIjsKK30KKzwvU0NSSVBUPgorPE5PU0NSSVBUPgorPC9OT1NDUklQVD4KKworPC9IRUFEPgorCis8Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+CisKKworCis8SFI+CisKKzxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Cis8VFIgQkdDT0xPUj0iIzkwRERGNyIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KKzxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgorPEI+UGFja2FnZXM8L0I+PC9GT05UPjwvVEg+Cis8L1RSPgorPCUgZm9yIChwYWNrYWdlRG9jIGluIHJvb3REb2Muc3BlY2lmaWVkUGFja2FnZXMoKSkgeyAlPgorPFRSIEJHQ09MT1I9IndoaXRlIiBDTEFTUz0iVGFibGVSb3dDb2xvciI+Cis8VEQgV0lEVEg9IjIwJSI+PEI+PEEgSFJFRj0iJHtwYWNrYWdlRG9jLm5hbWUoKX0vcGFja2FnZS1zdW1tYXJ5Lmh0bWwiPiR7cGFja2FnZURvYy5uYW1lKCl9PC9BPjwvQj48L1REPgorPFREPiZuYnNwOzwvVEQ+Cis8L1RSPgorPCUgfSAlPgorPC9UQUJMRT4KKworPFA+CismbmJzcDsKKworCisKKzxIUj4KKworPC9CT0RZPgorPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvZ3Jvb3Z5ZG9jL2dzdHJpbmctdGVtcGxhdGVzL3RvcC1sZXZlbC9yb290RG9jU3RydWN0dXJlZERhdGEueG1sIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvZ3Jvb3Z5ZG9jL2dzdHJpbmctdGVtcGxhdGVzL3RvcC1sZXZlbC9yb290RG9jU3RydWN0dXJlZERhdGEueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMzZlYWMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9ncm9vdnlkb2MvZ3N0cmluZy10ZW1wbGF0ZXMvdG9wLWxldmVsL3Jvb3REb2NTdHJ1Y3R1cmVkRGF0YS54bWwKQEAgLTAsMCArMSwxMCBAQAorPHJvb3Q+CisgIDxwYWNrYWdlcz48JSBmb3IgKHBhY2thZ2VEb2MgaW4gcm9vdERvYy5zcGVjaWZpZWRQYWNrYWdlcygpKSB7ICU+CisgIDxwYWNrYWdlIG5hbWU9IiR7cGFja2FnZURvYy5uYW1lKCl9IiAvPgorPCUgfSAlPgorPHBhY2thZ2VzPgorICA8Y2xhc3Nlcz48JSBmb3IgKGNsYXNzRG9jIGluIHJvb3REb2MuY2xhc3NlcygpKSB7ICU+CisgICAgPGNsYXNzIHBhdGg9IiR7Y2xhc3NEb2MuZ2V0RnVsbFBhdGhOYW1lKCl9IiBuYW1lPSIke2NsYXNzRG9jLm5hbWUoKX0iIC8+Cis8JSB9ICU+CisgIDwvY2xhc3Nlcz4KKzwvcm9vdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9ncm9vdnlkb2MvZ3N0cmluZy10ZW1wbGF0ZXMvdG9wLWxldmVsL3N0eWxlc2hlZXQuY3NzIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvZ3Jvb3Z5ZG9jL2dzdHJpbmctdGVtcGxhdGVzL3RvcC1sZXZlbC9zdHlsZXNoZWV0LmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTE5ODI3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvZ3Jvb3Z5ZG9jL2dzdHJpbmctdGVtcGxhdGVzL3RvcC1sZXZlbC9zdHlsZXNoZWV0LmNzcwpAQCAtMCwwICsxLDM0IEBACisvKiBHcm9vdnlkb2Mgc3R5bGUgc2hlZXQgKi8KKworLyogRGVmaW5lIGNvbG9ycywgZm9udHMgYW5kIG90aGVyIHN0eWxlIGF0dHJpYnV0ZXMgaGVyZSB0byBvdmVycmlkZSB0aGUgZGVmYXVsdHMgKi8KKworLyogUGFnZSBiYWNrZ3JvdW5kIGNvbG9yICovCitib2R5IHsgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRiB9CisKKy8qIEhlYWRpbmdzICovCitoMSB7IGZvbnQtc2l6ZTogMTQ1JSB9CisKKy8qIFRhYmxlIGNvbG9ycyAqLworLlRhYmxlSGVhZGluZ0NvbG9yICAgICB7IGJhY2tncm91bmQ6ICM2Mzk4QUEgfSAvKiBEYXJrIGN5YW4gKi8KKy5UYWJsZVN1YkhlYWRpbmdDb2xvciAgeyBiYWNrZ3JvdW5kOiAjOTBEREY3IH0gLyogTGlnaHQgY3lhbiAqLworLlRhYmxlUm93Q29sb3IgICAgICAgICB7IGJhY2tncm91bmQ6ICNGRkZGRkYgfSAvKiBXaGl0ZSAqLworCisvKiBGb250IHVzZWQgaW4gbGVmdC1oYW5kIGZyYW1lIGxpc3RzICovCisuRnJhbWVUaXRsZUZvbnQgICB7IGZvbnQtc2l6ZTogMTAwJTsgZm9udC1mYW1pbHk6IEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWYgfQorLkZyYW1lSGVhZGluZ0ZvbnQgeyBmb250LXNpemU6ICA5MCU7IGZvbnQtZmFtaWx5OiBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmIH0KKy5GcmFtZUl0ZW1Gb250ICAgIHsgZm9udC1zaXplOiAgOTAlOyBmb250LWZhbWlseTogSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZiB9CisKKy8qIEZvbnQgdXNlZCBpbiBjbGFzcyBkZXRhaWwgcGFuZSAqLworLkNsYXNzVGl0bGVGb250ICAgeyBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZiB9CisuQ2xhc3NIZWFkaW5nRm9udCB7IGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmIH0KKy5DbGFzc0l0ZW1Gb250ICAgIHsgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWYgfQorCisvKiBOYXZpZ2F0aW9uIGJhciBmb250cyBhbmQgY29sb3JzICovCisuTmF2QmFyQ2VsbDEgICAgeyBiYWNrZ3JvdW5kLWNvbG9yOiM5MERERjc7fSAvKiBMaWdodCBjeWFuICovCisuTmF2QmFyQ2VsbDFSZXYgeyBiYWNrZ3JvdW5kLWNvbG9yOiMwMDAwOEI7fSAvKiBEYXJrIEJsdWUgKi8KKy5OYXZCYXJGb250MSAgICB7IGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBjb2xvcjojMDAwMDAwO30KKy5OYXZCYXJGb250MVJldiB7IGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBjb2xvcjojRkZGRkZGO30KKworLk5hdkJhckNlbGwyICAgIHsgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IGJhY2tncm91bmQtY29sb3I6I0ZGRkZGRjt9CisuTmF2QmFyQ2VsbDMgICAgeyBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgYmFja2dyb3VuZC1jb2xvcjojRkZGRkZGO30KKwpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvZ3Jvb3Z5ZG9jL3BhY2thZ2UuaHRtbCBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2dyb292eWRvYy9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM1MzA1MAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2dyb292eWRvYy9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSw4IEBACis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPHRpdGxlPnBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5ncm9vdnlkb2MuKjwvdGl0bGU+CisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgPHA+R3Jvb3Z5RG9jIHRvb2wuPC9wPgorICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9qYXZhYy9KYXZhQXdhcmVDb21waWxhdGlvblVuaXQuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2phdmFjL0phdmFBd2FyZUNvbXBpbGF0aW9uVW5pdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNTI1NjgKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9qYXZhYy9KYXZhQXdhcmVDb21waWxhdGlvblVuaXQuamF2YQpAQCAtMCwwICsxLDE0MCBAQAorLyoNCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4NCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuamF2YWM7DQorDQoraW1wb3J0IGdyb292eS5sYW5nLkdyb292eUNsYXNzTG9hZGVyOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KK2ltcG9ydCBqYXZhLmlvLkZpbGU7DQoraW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOw0KKw0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5DbGFzc05vZGU7DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0Lk1vZHVsZU5vZGU7DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW4uR2VuZXJhdG9yQ29udGV4dDsNCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLkNvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuQ29tcGlsYXRpb25Vbml0Ow0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuQ29tcGlsZXJDb25maWd1cmF0aW9uOw0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuUGhhc2VzOw0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuU291cmNlVW5pdDsNCisNCisvKioNCisgKiBDcmVhdGVkIGJ5IEludGVsbGlKIElERUEuIA0KKyAqIFVzZXI6IEFsZXguVGthY2htYW4gDQorICogRGF0ZTogTWF5IDMxLCAyMDA3IFRpbWU6IDY6NDg6MjggUE0gDQorICovDQorcHVibGljIGNsYXNzIEphdmFBd2FyZUNvbXBpbGF0aW9uVW5pdCBleHRlbmRzIENvbXBpbGF0aW9uVW5pdCB7DQorICAgIHByaXZhdGUgTGlua2VkTGlzdCBqYXZhU291cmNlczsgLy8gamF2YSBzb3VyY2VzDQorICAgIHByaXZhdGUgSmF2YVN0dWJHZW5lcmF0b3Igc3R1YkdlbmVyYXRvcjsNCisgICAgcHJpdmF0ZSBKYXZhQ29tcGlsZXJGYWN0b3J5IGNvbXBpbGVyRmFjdG9yeSA9IG5ldyBKYXZhY0NvbXBpbGVyRmFjdG9yeSgpOw0KKyAgICBwcml2YXRlIEZpbGUgZ2VuZXJhdGlvbkdvYWw7DQorICAgIA0KKyAgICBwdWJsaWMgSmF2YUF3YXJlQ29tcGlsYXRpb25Vbml0KENvbXBpbGVyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7DQorICAgICAgICB0aGlzKGNvbmZpZ3VyYXRpb24sbnVsbCk7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBKYXZhQXdhcmVDb21waWxhdGlvblVuaXQoQ29tcGlsZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sIEdyb292eUNsYXNzTG9hZGVyIGdyb292eUNsYXNzTG9hZGVyKSB7DQorICAgICAgICBzdXBlcihjb25maWd1cmF0aW9uLG51bGwsZ3Jvb3Z5Q2xhc3NMb2FkZXIpOw0KKyAgICAgICAgamF2YVNvdXJjZXMgPSBuZXcgTGlua2VkTGlzdCgpOw0KKyAgICAgICAgZ2VuZXJhdGlvbkdvYWwgPSAoRmlsZSkgY29uZmlndXJhdGlvbi5nZXRKb2ludENvbXBpbGF0aW9uT3B0aW9ucygpLmdldCgic3R1YkRpciIpOw0KKyAgICAgICAgYm9vbGVhbiB1c2VKYXZhNSA9IGNvbmZpZ3VyYXRpb24uZ2V0VGFyZ2V0Qnl0ZWNvZGUoKS5lcXVhbHMoQ29tcGlsZXJDb25maWd1cmF0aW9uLlBPU1RfSkRLNSk7DQorICAgICAgICBzdHViR2VuZXJhdG9yID0gbmV3IEphdmFTdHViR2VuZXJhdG9yKGdlbmVyYXRpb25Hb2FsLGZhbHNlLHVzZUphdmE1KTsNCisgICAgICAgIA0KKyAgICAgICAgYWRkUGhhc2VPcGVyYXRpb24obmV3IFByaW1hcnlDbGFzc05vZGVPcGVyYXRpb24oKSB7DQorICAgICAgICAgICAgcHVibGljIHZvaWQgY2FsbChTb3VyY2VVbml0IHNvdXJjZSwgR2VuZXJhdG9yQ29udGV4dCBjb250ZXh0LCBDbGFzc05vZGUgbm9kZSkgdGhyb3dzIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uIHsNCisgICAgICAgICAgICAgICAgaWYgKGphdmFTb3VyY2VzLnNpemUoKSAhPSAwKSBuZXcgSmF2YUF3YXJlUmVzb2x2ZVZpc2l0b3IoSmF2YUF3YXJlQ29tcGlsYXRpb25Vbml0LnRoaXMpLnN0YXJ0UmVzb2x2aW5nKG5vZGUsc291cmNlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9LFBoYXNlcy5DT05WRVJTSU9OKTsNCisNCisgICAgICAgIGFkZFBoYXNlT3BlcmF0aW9uKG5ldyBQcmltYXJ5Q2xhc3NOb2RlT3BlcmF0aW9uKCkgew0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNhbGwoU291cmNlVW5pdCBzb3VyY2UsIEdlbmVyYXRvckNvbnRleHQgY29udGV4dCwgQ2xhc3NOb2RlIGNsYXNzTm9kZSkgdGhyb3dzIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uIHsNCisgICAgICAgICAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICAgICAgICAgIGlmIChqYXZhU291cmNlcy5zaXplKCkgIT0gMCkgc3R1YkdlbmVyYXRvci5nZW5lcmF0ZUNsYXNzKGNsYXNzTm9kZSk7DQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBmbmZlKSB7DQorICAgICAgICAgICAgICAgICAgICBzb3VyY2UuYWRkRXhjZXB0aW9uKGZuZmUpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSxQaGFzZXMuQ09OVkVSU0lPTik7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgZ290b1BoYXNlKGludCBwaGFzZSkgdGhyb3dzIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uIHsNCisgICAgICAgIHN1cGVyLmdvdG9QaGFzZShwaGFzZSk7DQorICAgICAgICAvLyBjb21waWxlIEphdmEgYW5kIGNsZWFuIHVwDQorICAgICAgICBpZiAocGhhc2U9PVBoYXNlcy5TRU1BTlRJQ19BTkFMWVNJUyAmJiBqYXZhU291cmNlcy5zaXplKCk+MCkgew0KKyAgICAgICAgICAgIEl0ZXJhdG9yIG1vZHVsZXMgPSBnZXRBU1QoKS5nZXRNb2R1bGVzKCkuaXRlcmF0b3IoKTsNCisgICAgICAgICAgICB3aGlsZSAobW9kdWxlcy5oYXNOZXh0KCkpIHsNCisgICAgICAgICAgICAgICAgTW9kdWxlTm9kZSBtb2R1bGUgPSAoTW9kdWxlTm9kZSkgbW9kdWxlcy5uZXh0KCk7DQorICAgICAgICAgICAgICAgIG1vZHVsZS5zZXRJbXBvcnRzUmVzb2x2ZWQoZmFsc2UpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICB0cnkgew0KKyAgICAgICAgICAgICAgICBKYXZhQ29tcGlsZXIgY29tcGlsZXIgPSBjb21waWxlckZhY3RvcnkuY3JlYXRlQ29tcGlsZXIoZ2V0Q29uZmlndXJhdGlvbigpKTsNCisgICAgICAgICAgICAgICAgY29tcGlsZXIuY29tcGlsZShqYXZhU291cmNlcywgdGhpcyk7DQorICAgICAgICAgICAgfSBmaW5hbGx5IHsNCisgICAgICAgICAgICAgICAgc3R1YkdlbmVyYXRvci5jbGVhbigpOw0KKyAgICAgICAgICAgICAgICBqYXZhU291cmNlcy5jbGVhcigpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHZvaWQgY29uZmlndXJlKENvbXBpbGVyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7DQorICAgICAgICBzdXBlci5jb25maWd1cmUoY29uZmlndXJhdGlvbik7DQorICAgICAgICAvLyBHcm9vdnlDbGFzc0xvYWRlciBzaG91bGQgYmUgYWJsZSB0byBmaW5kIGNsYXNzZXMgY29tcGlsZWQgZnJvbSBqYXZhDQorICAgICAgICAvLyBzb3VyY2VzDQorICAgICAgICBGaWxlIHRhcmdldERpciA9IGNvbmZpZ3VyYXRpb24uZ2V0VGFyZ2V0RGlyZWN0b3J5KCk7DQorICAgICAgICBpZiAodGFyZ2V0RGlyICE9IG51bGwpIHsNCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2xhc3NPdXRwdXQgPSB0YXJnZXREaXIuZ2V0QWJzb2x1dGVQYXRoKCk7DQorICAgICAgICAgICAgZ2V0Q2xhc3NMb2FkZXIoKS5hZGRDbGFzc3BhdGgoY2xhc3NPdXRwdXQpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHByaXZhdGUgdm9pZCBhZGRKYXZhU291cmNlKEZpbGUgZmlsZSkgew0KKyAgICAgICAgU3RyaW5nIHBhdGggPSBmaWxlLmdldEFic29sdXRlUGF0aCgpOw0KKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gamF2YVNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7DQorICAgICAgICAgICAgU3RyaW5nIHN1ID0gKFN0cmluZykgaXRlci5uZXh0KCk7DQorICAgICAgICAgICAgaWYgKHBhdGguZXF1YWxzKHN1KSkNCisgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICAgICAgamF2YVNvdXJjZXMuYWRkKHBhdGgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIGFkZFNvdXJjZXMoU3RyaW5nW10gcGF0aHMpIHsNCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGF0aHMubGVuZ3RoOyBpKyspIHsNCisgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXRoc1tpXSk7DQorICAgICAgICAgICAgaWYgKGZpbGUuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuamF2YSIpKQ0KKyAgICAgICAgICAgICAgICBhZGRKYXZhU291cmNlKGZpbGUpOw0KKyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgYWRkU291cmNlKGZpbGUpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIGFkZFNvdXJjZXMoRmlsZVtdIGZpbGVzKSB7DQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7DQorICAgICAgICAgICAgaWYgKGZpbGVzW2ldLmdldE5hbWUoKS5lbmRzV2l0aCgiLmphdmEiKSkNCisgICAgICAgICAgICAgICAgYWRkSmF2YVNvdXJjZShmaWxlc1tpXSk7DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICBhZGRTb3VyY2UoZmlsZXNbaV0pOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHB1YmxpYyBKYXZhQ29tcGlsZXJGYWN0b3J5IGdldENvbXBpbGVyRmFjdG9yeSgpIHsNCisgICAgICAgIHJldHVybiBjb21waWxlckZhY3Rvcnk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgc2V0Q29tcGlsZXJGYWN0b3J5KEphdmFDb21waWxlckZhY3RvcnkgY29tcGlsZXJGYWN0b3J5KSB7DQorICAgICAgICB0aGlzLmNvbXBpbGVyRmFjdG9yeSA9IGNvbXBpbGVyRmFjdG9yeTsNCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9qYXZhYy9KYXZhQXdhcmVSZXNvbHZlVmlzaXRvci5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvamF2YWMvSmF2YUF3YXJlUmVzb2x2ZVZpc2l0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGU4ZWFiCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvamF2YWMvSmF2YUF3YXJlUmVzb2x2ZVZpc2l0b3IuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKg0KKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLg0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5qYXZhYzsNCisNCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuQVNUTm9kZTsNCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3Quc3RtdC5TdGF0ZW1lbnQ7DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5Db21waWxhdGlvblVuaXQ7DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5SZXNvbHZlVmlzaXRvcjsNCisNCitwdWJsaWMgY2xhc3MgSmF2YUF3YXJlUmVzb2x2ZVZpc2l0b3IgZXh0ZW5kcyBSZXNvbHZlVmlzaXRvciB7DQorDQorICAgIHB1YmxpYyBKYXZhQXdhcmVSZXNvbHZlVmlzaXRvcihDb21waWxhdGlvblVuaXQgY3UpIHsNCisgICAgICAgIHN1cGVyKGN1KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIHZvaWQgdmlzaXRDbGFzc0NvZGVDb250YWluZXIoU3RhdGVtZW50IGNvZGUpIHsNCisgICAgICAgIC8vIGRvIG5vdGhpbmcgaGVyZSwgbGVhdmUgaXQgdG8gdGhlIG5vcm1hbCByZXNvbHZpbmcNCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIHZvaWQgYWRkRXJyb3IoU3RyaW5nIG1zZywgQVNUTm9kZSBleHByKSB7DQorICAgICAgICAvLyBkbyBub3RoaW5nIGhlcmUsIGxlYXZlIGl0IHRvIHRoZSBub3JtYWwgcmVzb2x2aW5nICAgICAgICANCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9qYXZhYy9KYXZhQ29tcGlsZXIuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2phdmFjL0phdmFDb21waWxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjYWQzMjMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9qYXZhYy9KYXZhQ29tcGlsZXIuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKg0KKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLg0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5qYXZhYzsNCisNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5Db21waWxhdGlvblVuaXQ7DQorDQorLyoqDQorICogQGF1dGhvciBBbGV4LlRrYWNobWFuDQorICovDQorcHVibGljIGludGVyZmFjZSBKYXZhQ29tcGlsZXIgew0KKyAgICB2b2lkIGNvbXBpbGUoTGlzdCBmaWxlcywgQ29tcGlsYXRpb25Vbml0IGN1KTsNCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvamF2YWMvSmF2YUNvbXBpbGVyRmFjdG9yeS5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvamF2YWMvSmF2YUNvbXBpbGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwN2UxYzAKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9qYXZhYy9KYXZhQ29tcGlsZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwyMyBAQAorLyoNCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4NCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuamF2YWM7DQorDQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5Db21waWxlckNvbmZpZ3VyYXRpb247DQorDQorcHVibGljIGludGVyZmFjZSBKYXZhQ29tcGlsZXJGYWN0b3J5IHsNCisgICAgSmF2YUNvbXBpbGVyIGNyZWF0ZUNvbXBpbGVyKENvbXBpbGVyQ29uZmlndXJhdGlvbiBjb25maWcpOw0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9qYXZhYy9KYXZhU3R1YkNvbXBpbGF0aW9uVW5pdC5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvamF2YWMvSmF2YVN0dWJDb21waWxhdGlvblVuaXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWE2OGJkCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvamF2YWMvSmF2YVN0dWJDb21waWxhdGlvblVuaXQuamF2YQpAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5qYXZhYzsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlDbGFzc0xvYWRlcjsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LkNsYXNzTm9kZTsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuLkdlbmVyYXRvckNvbnRleHQ7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLkNvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5Db21waWxhdGlvblVuaXQ7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLkNvbXBpbGVyQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuUGhhc2VzOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5SZXNvbHZlVmlzaXRvcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuU291cmNlVW5pdDsKKworLyoqCisgKiBDb21waWxhdGlvbiB1bml0IHRvIDxlbT5vbmx5PC9lbT4gZ2VuZXJhdGUgSmF2YSBzdHVicyBmb3IgR3Jvb3Z5IHNvdXJjZXMuCisgKgorICogQHZlcnNpb24gJElkJAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFzb25AcGxhbmV0NTcuY29tIj5KYXNvbiBEaWxsb248L2E+CisgKi8KK3B1YmxpYyBjbGFzcyBKYXZhU3R1YkNvbXBpbGF0aW9uVW5pdAorICAgIGV4dGVuZHMgQ29tcGlsYXRpb25Vbml0Cit7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0IGphdmFTb3VyY2VzID0gbmV3IExpbmtlZExpc3QoKTsKKworICAgIHB1YmxpYyBKYXZhU3R1YkNvbXBpbGF0aW9uVW5pdChmaW5hbCBDb21waWxlckNvbmZpZ3VyYXRpb24gY29uZmlnLCBmaW5hbCBHcm9vdnlDbGFzc0xvYWRlciBjbGFzc0xvYWRlciwgZmluYWwgRmlsZSBvdXRwdXREaXJlY3RvcnkpIHsKKyAgICAgICAgc3VwZXIoY29uZmlnLCBudWxsLCBjbGFzc0xvYWRlcik7CisKKyAgICAgICAgYWRkUGhhc2VPcGVyYXRpb24obmV3IEphdmFSZXNvbHZlck9wZXJhdGlvbigpLCBQaGFzZXMuQ09OVkVSU0lPTik7CisgICAgICAgIGFkZFBoYXNlT3BlcmF0aW9uKG5ldyBTdHViR2VuZXJhdG9yT3BlcmF0aW9uKG91dHB1dERpcmVjdG9yeSksIFBoYXNlcy5DT05WRVJTSU9OKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnb3RvUGhhc2UoZmluYWwgaW50IHBoYXNlKSB0aHJvd3MgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24geworICAgICAgICBzdXBlci5nb3RvUGhhc2UocGhhc2UpOworCisgICAgICAgIGlmIChwaGFzZSA9PSBQaGFzZXMuU0VNQU5USUNfQU5BTFlTSVMpIHsKKyAgICAgICAgICAgIGphdmFTb3VyY2VzLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRTb3VyY2VGaWxlKGZpbmFsIEZpbGUgZmlsZSkgeworICAgICAgICBpZiAoZmlsZS5nZXROYW1lKCkuZW5kc1dpdGgoIi5qYXZhIikpIHsKKyAgICAgICAgICAgIGFkZEphdmFTb3VyY2UoZmlsZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBhZGRTb3VyY2UoZmlsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWRkSmF2YVNvdXJjZShmaW5hbCBGaWxlIGZpbGUpIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRklYTUU6IFVtLi4uIG5vdCByZWFsbHkgc3VyZSB3aGF0IHRoaXMgaXMgZG9pbmcuLi4KKyAgICAgICAgLy8gICAgICAgIFNvIGVpdGhlciBkb2N1bWVudCB3aGF0IGl0cyBqb2IgaXMuLi4gb3Igd2hhY2sgaXQgOy0pCisgICAgICAgIC8vCisKKyAgICAgICAgU3RyaW5nIHBhdGggPSBmaWxlLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICBJdGVyYXRvciBpdGVyID0gamF2YVNvdXJjZXMuaXRlcmF0b3IoKTsKKworICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIGlmIChwYXRoLmVxdWFscyhpdGVyLm5leHQoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBqYXZhU291cmNlcy5hZGQocGF0aCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGhhdmVKYXZhU291cmNlcygpIHsKKyAgICAgICAgcmV0dXJuICFqYXZhU291cmNlcy5pc0VtcHR5KCk7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBDdXN0b20gT3BlcmF0aW9ucworICAgIC8vCisKKyAgICAvKioKKyAgICAgKiBPcGVyYXRpb24gdG8gcmVzb2x2ZSBKYXZhIHNvdXJjZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBKYXZhUmVzb2x2ZXJPcGVyYXRpb24KKyAgICAgICAgZXh0ZW5kcyBQcmltYXJ5Q2xhc3NOb2RlT3BlcmF0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgdm9pZCBjYWxsKGZpbmFsIFNvdXJjZVVuaXQgc291cmNlLCBmaW5hbCBHZW5lcmF0b3JDb250ZXh0IGNvbnRleHQsIGZpbmFsIENsYXNzTm9kZSBub2RlKSB0aHJvd3MgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24geworICAgICAgICAgICAgaWYgKGhhdmVKYXZhU291cmNlcygpKSB7CisgICAgICAgICAgICAgICAgUmVzb2x2ZVZpc2l0b3IgdiA9IG5ldyBKYXZhQXdhcmVSZXNvbHZlVmlzaXRvcihKYXZhU3R1YkNvbXBpbGF0aW9uVW5pdC50aGlzKTsKKyAgICAgICAgICAgICAgICB2LnN0YXJ0UmVzb2x2aW5nKG5vZGUsIHNvdXJjZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcGVyYXRpb24gdG8gZ2VuZXJhdGUgSmF2YSBzdHVicyBmcm9tIEdyb292eSBzb3VyY2VzLgorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgU3R1YkdlbmVyYXRvck9wZXJhdGlvbgorICAgICAgICBleHRlbmRzIFByaW1hcnlDbGFzc05vZGVPcGVyYXRpb24KKyAgICB7CisgICAgICAgIHByaXZhdGUgZmluYWwgSmF2YVN0dWJHZW5lcmF0b3IgZ2VuZXJhdG9yOworCisgICAgICAgIHB1YmxpYyBTdHViR2VuZXJhdG9yT3BlcmF0aW9uKGZpbmFsIEZpbGUgb3V0cHV0RGlyZWN0b3J5KSB7CisgICAgICAgICAgICBvdXRwdXREaXJlY3RvcnkubWtkaXJzKCk7CisKKyAgICAgICAgICAgIGJvb2xlYW4gamF2YTUgPSBmYWxzZTsKKyAgICAgICAgICAgIFN0cmluZyB0YXJnZXQgPSBKYXZhU3R1YkNvbXBpbGF0aW9uVW5pdC50aGlzLmdldENvbmZpZ3VyYXRpb24oKS5nZXRUYXJnZXRCeXRlY29kZSgpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBFbmFibGUgamF2YTUgbW9kZSBpZiB0aGUgY29uZmlndXJhdGlvbiBsZXRzIHVzCisgICAgICAgICAgICBpZiAodGFyZ2V0ICE9IG51bGwgJiYgdGFyZ2V0LnRyaW0oKS5lcXVhbHMoIjEuNSIpKSB7CisgICAgICAgICAgICAgICAgamF2YTUgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBnZW5lcmF0b3IgPSBuZXcgSmF2YVN0dWJHZW5lcmF0b3Iob3V0cHV0RGlyZWN0b3J5LCB0cnVlLCBqYXZhNSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjYWxsKGZpbmFsIFNvdXJjZVVuaXQgc291cmNlLCBmaW5hbCBHZW5lcmF0b3JDb250ZXh0IGNvbnRleHQsIGZpbmFsIENsYXNzTm9kZSBub2RlKSB0aHJvd3MgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24geworICAgICAgICAgICAgaWYgKGhhdmVKYXZhU291cmNlcygpKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdG9yLmdlbmVyYXRlQ2xhc3Mobm9kZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBzb3VyY2UuYWRkRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9qYXZhYy9KYXZhU3R1YkdlbmVyYXRvci5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvamF2YWMvSmF2YVN0dWJHZW5lcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDJlNDczCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvamF2YWMvSmF2YVN0dWJHZW5lcmF0b3IuamF2YQpAQCAtMCwwICsxLDYyNCBAQAorLyoNCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4NCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuamF2YWM7DQorDQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0Lio7DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHIuQXJndW1lbnRMaXN0RXhwcmVzc2lvbjsNCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuZXhwci5Db25zdGFudEV4cHJlc3Npb247DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LmV4cHIuQ29uc3RydWN0b3JDYWxsRXhwcmVzc2lvbjsNCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuZXhwci5FeHByZXNzaW9uOw0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5zdG10LkJsb2NrU3RhdGVtZW50Ow0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5zdG10LkV4cHJlc3Npb25TdGF0ZW1lbnQ7DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuU3RhdGVtZW50Ow0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuLlZlcmlmaWVyOw0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuUmVzb2x2ZVZpc2l0b3I7DQoraW1wb3J0IG9yZy5vYmplY3R3ZWIuYXNtLk9wY29kZXM7DQorDQoraW1wb3J0IGphdmEuaW8uKjsNCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7DQoraW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOw0KK2ltcG9ydCBqYXZhLnV0aWwuKjsNCisNCitwdWJsaWMgY2xhc3MgSmF2YVN0dWJHZW5lcmF0b3INCit7DQorICAgIHByaXZhdGUgYm9vbGVhbiBqYXZhNSA9IGZhbHNlOw0KKyAgICBwcml2YXRlIGJvb2xlYW4gcmVxdWlyZVN1cGVyUmVzb2x2ZWQgPSBmYWxzZTsNCisgICAgcHJpdmF0ZSBGaWxlIG91dHB1dFBhdGg7DQorICAgIHByaXZhdGUgTGlzdCB0b0NvbXBpbGUgPSBuZXcgQXJyYXlMaXN0KCk7DQorDQorICAgIHB1YmxpYyBKYXZhU3R1YkdlbmVyYXRvcihmaW5hbCBGaWxlIG91dHB1dFBhdGgsIGZpbmFsIGJvb2xlYW4gcmVxdWlyZVN1cGVyUmVzb2x2ZWQsIGZpbmFsIGJvb2xlYW4gamF2YTUpIHsNCisgICAgICAgIHRoaXMub3V0cHV0UGF0aCA9IG91dHB1dFBhdGg7DQorICAgICAgICB0aGlzLnJlcXVpcmVTdXBlclJlc29sdmVkID0gcmVxdWlyZVN1cGVyUmVzb2x2ZWQ7DQorICAgICAgICB0aGlzLmphdmE1ID0gamF2YTU7DQorICAgIH0NCisNCisgICAgcHVibGljIEphdmFTdHViR2VuZXJhdG9yKGZpbmFsIEZpbGUgb3V0cHV0UGF0aCkgew0KKyAgICAgICAgdGhpcyhvdXRwdXRQYXRoLCBmYWxzZSwgZmFsc2UpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIHZvaWQgbWtkaXJzKEZpbGUgcGFyZW50LCBTdHJpbmcgcmVsYXRpdmVGaWxlKSB7DQorICAgICAgICBpbnQgaW5kZXggPSByZWxhdGl2ZUZpbGUubGFzdEluZGV4T2YoJy8nKTsNCisgICAgICAgIGlmIChpbmRleD09LTEpIHJldHVybjsNCisgICAgICAgIEZpbGUgZGlyID0gbmV3IEZpbGUocGFyZW50LHJlbGF0aXZlRmlsZS5zdWJzdHJpbmcoMCxpbmRleCkpOw0KKyAgICAgICAgZGlyLm1rZGlycygpOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZUNsYXNzKENsYXNzTm9kZSBjbGFzc05vZGUpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gew0KKyAgICAgICAgLy8gT25seSBhdHRlbXB0IHRvIHJlbmRlciBvdXIgc2VsZiBpZiBvdXIgc3VwZXItY2xhc3MgaXMgcmVzb2x2ZWQsIGVsc2Ugd2FpdCBmb3IgaXQNCisgICAgICAgIGlmIChyZXF1aXJlU3VwZXJSZXNvbHZlZCAmJiAhY2xhc3NOb2RlLmdldFN1cGVyQ2xhc3MoKS5pc1Jlc29sdmVkKCkpIHsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorDQorICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBjbGFzc05vZGUuZ2V0TmFtZSgpLnJlcGxhY2UoJy4nLCAnLycpOw0KKyAgICAgICAgbWtkaXJzKG91dHB1dFBhdGgsZmlsZU5hbWUpOw0KKyAgICAgICAgdG9Db21waWxlLmFkZChmaWxlTmFtZSk7DQorDQorICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShvdXRwdXRQYXRoLCBmaWxlTmFtZSArICIuamF2YSIpOw0KKyAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKTsNCisgICAgICAgIFByaW50V3JpdGVyIG91dCA9IG5ldyBQcmludFdyaXRlcihmb3MpOw0KKw0KKyAgICAgICAgVmVyaWZpZXIgdmVyaWZpZXIgPSBuZXcgVmVyaWZpZXIoKSB7DQorICAgICAgICAgICAgcHVibGljIHZvaWQgYWRkQ292YXJpYW50TWV0aG9kcyhDbGFzc05vZGUgY24pIHt9DQorICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgYWRkVGltZVN0YW1wKENsYXNzTm9kZSBub2RlKSB7fQ0KKyAgICAgICAgfTsNCisgICAgICAgIHZlcmlmaWVyLnZpc2l0Q2xhc3MoY2xhc3NOb2RlKTsNCisgICAgICAgIA0KKyAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBjbGFzc05vZGUuZ2V0UGFja2FnZU5hbWUoKTsNCisgICAgICAgICAgICBpZiAocGFja2FnZU5hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigicGFja2FnZSAiICsgcGFja2FnZU5hbWUgKyAiO1xuIik7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGdlbkltcG9ydHMoY2xhc3NOb2RlLCBvdXQpOw0KKw0KKyAgICAgICAgICAgIGJvb2xlYW4gaXNJbnRlcmZhY2UgPSBjbGFzc05vZGUuaXNJbnRlcmZhY2UoKTsNCisgICAgICAgICAgICBib29sZWFuIGlzRW51bSA9IChjbGFzc05vZGUuZ2V0TW9kaWZpZXJzKCkgJiBPcGNvZGVzLkFDQ19FTlVNKSAhPTA7DQorICAgICAgICAgICAgcHJpbnRNb2RpZmllcnMob3V0LCBjbGFzc05vZGUuZ2V0TW9kaWZpZXJzKCkNCisgICAgICAgICAgICAgICAgICAgICYgfihpc0ludGVyZmFjZSA/IE9wY29kZXMuQUNDX0FCU1RSQUNUIDogMCkpOw0KKyAgICAgICAgICAgIA0KKyAgICAgICAgICAgIGlmIChpc0ludGVyZmFjZSkgew0KKyAgICAgICAgICAgICAgICBvdXQucHJpbnQgKCJpbnRlcmZhY2UgIik7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChpc0VudW0pIHsNCisgICAgICAgICAgICAgICAgb3V0LnByaW50ICgiZW51bSAiKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBvdXQucHJpbnQgKCJjbGFzcyAiKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgb3V0LnByaW50bG4oY2xhc3NOb2RlLmdldE5hbWVXaXRob3V0UGFja2FnZSgpKTsNCisgICAgICAgICAgICB3cml0ZUdlbmVyaWNzQm91bmRzKG91dCwgY2xhc3NOb2RlLCB0cnVlKTsNCisNCisgICAgICAgICAgICBDbGFzc05vZGUgc3VwZXJDbGFzcyA9IGNsYXNzTm9kZS5nZXRVbnJlc29sdmVkU3VwZXJDbGFzcyhmYWxzZSk7DQorDQorICAgICAgICAgICAgaWYgKCFpc0ludGVyZmFjZSAmJiAhaXNFbnVtKSB7DQorICAgICAgICAgICAgICAgIG91dC5wcmludCgiICBleHRlbmRzICIpOw0KKyAgICAgICAgICAgICAgICBwcmludFR5cGUoc3VwZXJDbGFzcyxvdXQpOw0KKyAgICAgICAgICAgIH0gDQorDQorICAgICAgICAgICAgQ2xhc3NOb2RlW10gaW50ZXJmYWNlcyA9IGNsYXNzTm9kZS5nZXRJbnRlcmZhY2VzKCk7DQorICAgICAgICAgICAgaWYgKGludGVyZmFjZXMgIT0gbnVsbCAmJiBpbnRlcmZhY2VzLmxlbmd0aCA+IDApIHsNCisgICAgICAgICAgICAgICAgaWYgKGlzSW50ZXJmYWNlKSB7DQorICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiICBleHRlbmRzIik7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiICBpbXBsZW1lbnRzIik7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcmZhY2VzLmxlbmd0aCAtIDE7ICsraSkgew0KKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCIgICAgIik7DQorICAgICAgICAgICAgICAgICAgICBwcmludFR5cGUoaW50ZXJmYWNlc1tpXSwgb3V0KTsNCisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludCgiLCIpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIG91dC5wcmludCgiICAgICIpOw0KKyAgICAgICAgICAgICAgICBwcmludFR5cGUoaW50ZXJmYWNlc1tpbnRlcmZhY2VzLmxlbmd0aCAtIDFdLG91dCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIG91dC5wcmludGxuKCIgeyIpOw0KKw0KKyAgICAgICAgICAgIGdlbkZpZWxkcyhjbGFzc05vZGUsIG91dCwgaXNFbnVtKTsNCisgICAgICAgICAgICBnZW5NZXRob2RzKGNsYXNzTm9kZSwgb3V0LCBpc0VudW0pOw0KKyAgICAgICAgICAgIGdlblByb3BzKGNsYXNzTm9kZSwgb3V0KTsNCisNCisgICAgICAgICAgICBvdXQucHJpbnRsbigifSIpOw0KKyAgICAgICAgfSBmaW5hbGx5IHsNCisgICAgICAgICAgICB0cnkgew0KKyAgICAgICAgICAgICAgICBvdXQuY2xvc2UoKTsNCisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KKyAgICAgICAgICAgICAgICAvLyBpZ25vcmUNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICAgICAgZm9zLmNsb3NlKCk7DQorICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KKyAgICAgICAgICAgICAgICAvLyBpZ25vcmUNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcHJpdmF0ZSB2b2lkIGdlbk1ldGhvZHMoQ2xhc3NOb2RlIGNsYXNzTm9kZSwgUHJpbnRXcml0ZXIgb3V0LCBib29sZWFuIGlzRW51bSkgew0KKyAgICAgICAgaWYgKCFpc0VudW0pIGdldENvbnN0cnVjdG9ycyhjbGFzc05vZGUsIG91dCk7DQorDQorICAgICAgICBMaXN0IG1ldGhvZHMgPSBjbGFzc05vZGUuZ2V0TWV0aG9kcygpOw0KKyAgICAgICAgaWYgKG1ldGhvZHMgIT0gbnVsbCkNCisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gbWV0aG9kcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7DQorICAgICAgICAgICAgICAgIE1ldGhvZE5vZGUgbWV0aG9kTm9kZSA9IChNZXRob2ROb2RlKSBpdC5uZXh0KCk7DQorICAgICAgICAgICAgICAgIGlmKGlzRW51bSAmJiBtZXRob2ROb2RlLmlzU3ludGhldGljKCkpIHsNCisgICAgICAgICAgICAgICAgICAgIC8vIHNraXAgdmFsdWVzKCkgbWV0aG9kIGFuZCB2YWx1ZU9mKFN0cmluZykNCisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbWV0aG9kTm9kZS5nZXROYW1lKCk7DQorICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJbXSBwYXJhbXMgPSBtZXRob2ROb2RlLmdldFBhcmFtZXRlcnMoKTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscygidmFsdWVzIikgJiYgcGFyYW1zLmxlbmd0aD09MCkgY29udGludWU7DQorICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoInZhbHVlT2YiKSAmJiANCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMubGVuZ3RoPT0xICYmDQorICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zWzBdLmdldFR5cGUoKS5lcXVhbHMoQ2xhc3NIZWxwZXIuU1RSSU5HX1RZUEUpKQ0KKyAgICAgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGdlbk1ldGhvZChjbGFzc05vZGUsIG1ldGhvZE5vZGUsIG91dCk7DQorICAgICAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHByaXZhdGUgdm9pZCBnZXRDb25zdHJ1Y3RvcnMoQ2xhc3NOb2RlIGNsYXNzTm9kZSwgUHJpbnRXcml0ZXIgb3V0KSB7DQorICAgICAgICBMaXN0IGNvbnN0cnMgPSBjbGFzc05vZGUuZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcnMoKTsNCisgICAgICAgIGlmIChjb25zdHJzICE9IG51bGwpDQorICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGNvbnN0cnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgew0KKyAgICAgICAgICAgICAgICBDb25zdHJ1Y3Rvck5vZGUgY29uc3RyTm9kZSA9IChDb25zdHJ1Y3Rvck5vZGUpIGl0Lm5leHQoKTsNCisgICAgICAgICAgICAgICAgZ2VuQ29uc3RydWN0b3IoY2xhc3NOb2RlLCBjb25zdHJOb2RlLCBvdXQpOw0KKyAgICAgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBwcml2YXRlIHZvaWQgZ2VuRmllbGRzKENsYXNzTm9kZSBjbGFzc05vZGUsIFByaW50V3JpdGVyIG91dCwgYm9vbGVhbiBpc0VudW0pIHsNCisgICAgICAgIExpc3QgZmllbGRzID0gY2xhc3NOb2RlLmdldEZpZWxkcygpOw0KKyAgICAgICAgaWYgKGZpZWxkcyA9PSBudWxsKSByZXR1cm47DQorICAgICAgICBBcnJheUxpc3QgZW51bUZpZWxkcyA9IG5ldyBBcnJheUxpc3QoZmllbGRzLnNpemUoKSk7DQorICAgICAgICBBcnJheUxpc3Qgbm9ybWFsRmllbGRzID0gbmV3IEFycmF5TGlzdChmaWVsZHMuc2l6ZSgpKTsNCisgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBmaWVsZHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgew0KKyAgICAgICAgICAgIEZpZWxkTm9kZSBmaWVsZE5vZGUgPSAoRmllbGROb2RlKSBpdC5uZXh0KCk7DQorICAgICAgICAgICAgYm9vbGVhbiBpc0VudW1GaWVsZCA9IChmaWVsZE5vZGUuZ2V0TW9kaWZpZXJzKCkgJiBPcGNvZGVzLkFDQ19FTlVNKSAhPTA7DQorICAgICAgICAgICAgYm9vbGVhbiBpc1N5bnRoZXRpYyA9IChmaWVsZE5vZGUuZ2V0TW9kaWZpZXJzKCkgJiBPcGNvZGVzLkFDQ19TWU5USEVUSUMpICE9MDsNCisgICAgICAgICAgICBpZiAoaXNFbnVtRmllbGQpIHsNCisgICAgICAgICAgICAgICAgZW51bUZpZWxkcy5hZGQoZmllbGROb2RlKTsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKCFpc1N5bnRoZXRpYykgew0KKyAgICAgICAgICAgICAgICBub3JtYWxGaWVsZHMuYWRkKGZpZWxkTm9kZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgZ2VuRW51bUZpZWxkcyhlbnVtRmllbGRzLCBvdXQpOw0KKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG5vcm1hbEZpZWxkcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorICAgICAgICAgICAgRmllbGROb2RlIGZpZWxkTm9kZSA9IChGaWVsZE5vZGUpIGl0ZXJhdG9yLm5leHQoKTsNCisgICAgICAgICAgICBnZW5GaWVsZChmaWVsZE5vZGUsIG91dCk7ICAgICAgICAgICAgDQorICAgICAgICB9IA0KKyAgICB9DQorDQorICAgIHByaXZhdGUgdm9pZCBnZW5Qcm9wcyhDbGFzc05vZGUgY2xhc3NOb2RlLCBQcmludFdyaXRlciBvdXQpIHsNCisgICAgICAgIExpc3QgcHJvcHMgPSBjbGFzc05vZGUuZ2V0UHJvcGVydGllcygpOw0KKyAgICAgICAgaWYgKHByb3BzICE9IG51bGwpDQorICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IHByb3BzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsNCisgICAgICAgICAgICAgICAgUHJvcGVydHlOb2RlIHByb3BOb2RlID0gKFByb3BlcnR5Tm9kZSkgaXQubmV4dCgpOw0KKyAgICAgICAgICAgICAgICBnZW5Qcm9wKHByb3BOb2RlLCBvdXQpOw0KKyAgICAgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBwcml2YXRlIHZvaWQgZ2VuUHJvcChQcm9wZXJ0eU5vZGUgcHJvcE5vZGUsIFByaW50V3JpdGVyIG91dCkgew0KKyAgICAgICAgU3RyaW5nIG5hbWUgPSBwcm9wTm9kZS5nZXROYW1lKCkuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkNCisgICAgICAgICAgICAgICAgKyBwcm9wTm9kZS5nZXROYW1lKCkuc3Vic3RyaW5nKDEpOw0KKw0KKyAgICAgICAgU3RyaW5nIGdldHRlck5hbWUgPSAiZ2V0IiArIG5hbWU7DQorDQorICAgICAgICBib29sZWFuIHNraXBHZXR0ZXIgPSBmYWxzZTsNCisgICAgICAgIExpc3QgZ2V0dGVyQ2FuZGlkYXRlcyA9IHByb3BOb2RlLmdldEZpZWxkKCkuZ2V0T3duZXIoKS5nZXRNZXRob2RzKGdldHRlck5hbWUpOw0KKyAgICAgICAgaWYgKGdldHRlckNhbmRpZGF0ZXMgIT0gbnVsbCkNCisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gZ2V0dGVyQ2FuZGlkYXRlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7DQorICAgICAgICAgICAgICAgIE1ldGhvZE5vZGUgbWV0aG9kID0gKE1ldGhvZE5vZGUpIGl0Lm5leHQoKTsNCisgICAgICAgICAgICAgICAgaWYgKG1ldGhvZC5nZXRQYXJhbWV0ZXJzKCkubGVuZ3RoID09IDApIHsNCisgICAgICAgICAgICAgICAgICAgIHNraXBHZXR0ZXIgPSB0cnVlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgaWYgKCFza2lwR2V0dGVyKSB7DQorICAgICAgICAgICAgcHJpbnRNb2RpZmllcnMob3V0LCBwcm9wTm9kZS5nZXRNb2RpZmllcnMoKSk7DQorDQorICAgICAgICAgICAgcHJpbnRUeXBlKHByb3BOb2RlLmdldFR5cGUoKSwgb3V0KTsNCisgICAgICAgICAgICBvdXQucHJpbnQoIiAiKTsNCisgICAgICAgICAgICBvdXQucHJpbnQoZ2V0dGVyTmFtZSk7DQorICAgICAgICAgICAgb3V0LnByaW50KCIoKSB7ICIpOw0KKw0KKyAgICAgICAgICAgIHByaW50UmV0dXJuKG91dCwgcHJvcE5vZGUuZ2V0VHlwZSgpKTsNCisNCisgICAgICAgICAgICBvdXQucHJpbnRsbigiIH0iKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIFN0cmluZyBzZXR0ZXJOYW1lID0gInNldCIgKyBuYW1lOw0KKw0KKyAgICAgICAgYm9vbGVhbiBza2lwU2V0dGVyID0gZmFsc2U7DQorICAgICAgICBMaXN0IHNldHRlckNhbmRpZGF0ZXMgPSBwcm9wTm9kZS5nZXRGaWVsZCgpLmdldE93bmVyKCkuZ2V0TWV0aG9kcyggc2V0dGVyTmFtZSk7DQorICAgICAgICBpZiAoc2V0dGVyQ2FuZGlkYXRlcyAhPSBudWxsKQ0KKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBzZXR0ZXJDYW5kaWRhdGVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsNCisgICAgICAgICAgICAgICAgTWV0aG9kTm9kZSBtZXRob2QgPSAoTWV0aG9kTm9kZSkgaXQubmV4dCgpOw0KKyAgICAgICAgICAgICAgICBpZiAobWV0aG9kLmdldFBhcmFtZXRlcnMoKS5sZW5ndGggPT0gMSkgew0KKyAgICAgICAgICAgICAgICAgICAgc2tpcFNldHRlciA9IHRydWU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorDQorICAgICAgICBpZiAoIXNraXBTZXR0ZXIpIHsNCisgICAgICAgICAgICBwcmludE1vZGlmaWVycyhvdXQsIHByb3BOb2RlLmdldE1vZGlmaWVycygpKTsNCisgICAgICAgICAgICBvdXQucHJpbnQoInZvaWQgIik7DQorICAgICAgICAgICAgb3V0LnByaW50KHNldHRlck5hbWUpOw0KKyAgICAgICAgICAgIG91dC5wcmludCgiKCIpOw0KKyAgICAgICAgICAgIHByaW50VHlwZShwcm9wTm9kZS5nZXRUeXBlKCksIG91dCk7DQorICAgICAgICAgICAgb3V0LnByaW50bG4oIiB2YWx1ZSkge30iKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSB2b2lkIGdlbkVudW1GaWVsZHMoTGlzdCBmaWVsZHMsIFByaW50V3JpdGVyIG91dCkgew0KKyAgICAgICAgaWYgKGZpZWxkcy5zaXplKCk9PTApIHJldHVybjsNCisgICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOw0KKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGZpZWxkcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7DQorICAgICAgICAgICAgRmllbGROb2RlIGZpZWxkTm9kZSA9IChGaWVsZE5vZGUpIGl0ZXJhdG9yLm5leHQoKTsNCisgICAgICAgICAgICBpZiAoIWZpcnN0KSB7DQorICAgICAgICAgICAgICAgIG91dC5wcmludCgiLCAiKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBvdXQucHJpbnQoZmllbGROb2RlLmdldE5hbWUoKSk7ICAgICAgICAgICAgDQorICAgICAgICB9DQorICAgICAgICBvdXQucHJpbnRsbigiOyIpOw0KKyAgICB9DQorDQorICAgIHByaXZhdGUgdm9pZCBnZW5GaWVsZChGaWVsZE5vZGUgZmllbGROb2RlLCBQcmludFdyaXRlciBvdXQpIHsNCisgICAgICAgIGlmICgoZmllbGROb2RlLmdldE1vZGlmaWVycygpJk9wY29kZXMuQUNDX1BSSVZBVEUpIT0wKSByZXR1cm47DQorICAgICAgICBwcmludE1vZGlmaWVycyhvdXQsIGZpZWxkTm9kZS5nZXRNb2RpZmllcnMoKSk7DQorDQorICAgICAgICBwcmludFR5cGUoZmllbGROb2RlLmdldFR5cGUoKSwgb3V0KTsNCisNCisgICAgICAgIG91dC5wcmludCgiICIpOw0KKyAgICAgICAgb3V0LnByaW50KGZpZWxkTm9kZS5nZXROYW1lKCkpOw0KKyAgICAgICAgb3V0LnByaW50bG4oIjsiKTsNCisgICAgfQ0KKw0KKyAgICBwcml2YXRlIENvbnN0cnVjdG9yQ2FsbEV4cHJlc3Npb24gZ2V0Q29uc3RydWN0b3JDYWxsRXhwcmVzc2lvbigNCisgICAgICAgICAgICBDb25zdHJ1Y3Rvck5vZGUgY29uc3RydWN0b3JOb2RlKSB7DQorICAgICAgICBTdGF0ZW1lbnQgY29kZSA9IGNvbnN0cnVjdG9yTm9kZS5nZXRDb2RlKCk7DQorICAgICAgICBpZiAoIShjb2RlIGluc3RhbmNlb2YgQmxvY2tTdGF0ZW1lbnQpKQ0KKyAgICAgICAgICAgIHJldHVybiBudWxsOw0KKw0KKyAgICAgICAgQmxvY2tTdGF0ZW1lbnQgYmxvY2sgPSAoQmxvY2tTdGF0ZW1lbnQpIGNvZGU7DQorICAgICAgICBMaXN0IHN0YXRzID0gYmxvY2suZ2V0U3RhdGVtZW50cygpOw0KKyAgICAgICAgaWYgKHN0YXRzID09IG51bGwgfHwgc3RhdHMuc2l6ZSgpID09IDApDQorICAgICAgICAgICAgcmV0dXJuIG51bGw7DQorDQorICAgICAgICBTdGF0ZW1lbnQgc3RhdCA9IChTdGF0ZW1lbnQpIHN0YXRzLmdldCgwKTsNCisgICAgICAgIGlmICghKHN0YXQgaW5zdGFuY2VvZiBFeHByZXNzaW9uU3RhdGVtZW50KSkNCisgICAgICAgICAgICByZXR1cm4gbnVsbDsNCisNCisgICAgICAgIEV4cHJlc3Npb24gZXhwciA9ICgoRXhwcmVzc2lvblN0YXRlbWVudCkgc3RhdCkuZ2V0RXhwcmVzc2lvbigpOw0KKyAgICAgICAgaWYgKCEoZXhwciBpbnN0YW5jZW9mIENvbnN0cnVjdG9yQ2FsbEV4cHJlc3Npb24pKQ0KKyAgICAgICAgICAgIHJldHVybiBudWxsOw0KKw0KKyAgICAgICAgcmV0dXJuIChDb25zdHJ1Y3RvckNhbGxFeHByZXNzaW9uKSBleHByOw0KKyAgICB9DQorDQorICAgIHByaXZhdGUgdm9pZCBnZW5Db25zdHJ1Y3RvcihDbGFzc05vZGUgY2xhenosIENvbnN0cnVjdG9yTm9kZSBjb25zdHJ1Y3Rvck5vZGUsIFByaW50V3JpdGVyIG91dCkgew0KKyAgICAgICAgLy8gcHJpbnRNb2RpZmllcnMob3V0LCBjb25zdHJ1Y3Rvck5vZGUuZ2V0TW9kaWZpZXJzKCkpOw0KKw0KKyAgICAgICAgb3V0LnByaW50KCJwdWJsaWMgIik7IC8vIHRlbXBvcmFyeSBoYWNrDQorICAgICAgICBvdXQucHJpbnQoY2xhenouZ2V0TmFtZVdpdGhvdXRQYWNrYWdlKCkpOw0KKw0KKyAgICAgICAgcHJpbnRQYXJhbXMoY29uc3RydWN0b3JOb2RlLCBvdXQpOw0KKw0KKyAgICAgICAgQ29uc3RydWN0b3JDYWxsRXhwcmVzc2lvbiBjb25zdHJDYWxsID0gZ2V0Q29uc3RydWN0b3JDYWxsRXhwcmVzc2lvbihjb25zdHJ1Y3Rvck5vZGUpOw0KKyAgICAgICAgaWYgKGNvbnN0ckNhbGwgPT0gbnVsbCB8fCAhY29uc3RyQ2FsbC5pc1NwZWNpYWxDYWxsKCkpIHsNCisgICAgICAgICAgICBvdXQucHJpbnRsbigiIHt9Iik7DQorICAgICAgICB9DQorICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICBvdXQucHJpbnRsbigiIHsiKTsNCisNCisgICAgICAgICAgICBnZW5TcGVjaWFsQ29uc3RydWN0b3JBcmdzKG91dCwgY29uc3RydWN0b3JOb2RlLCBjb25zdHJDYWxsKTsNCisNCisgICAgICAgICAgICBvdXQucHJpbnRsbigifSIpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHByaXZhdGUgQ29uc3RydWN0b3JOb2RlIHNlbGVjdEFjY2Vzc2libGVDb25zdHJ1Y3RvckZyb21TdXBlcihDb25zdHJ1Y3Rvck5vZGUgbm9kZSkgew0KKyAgICAgICAgQ2xhc3NOb2RlIHR5cGUgPSBub2RlLmdldERlY2xhcmluZ0NsYXNzKCk7DQorICAgICAgICBDbGFzc05vZGUgc3VwZXJUeXBlID0gdHlwZS5nZXRTdXBlckNsYXNzKCk7DQorDQorICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzdXBlclR5cGUuZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsNCisgICAgICAgICAgICBDb25zdHJ1Y3Rvck5vZGUgYyA9IChDb25zdHJ1Y3Rvck5vZGUpaXRlci5uZXh0KCk7DQorDQorICAgICAgICAgICAgLy8gT25seSBsb29rIGF0IHRoaW5ncyB3ZSBjYW4gYWN0dWFsbHkgY2FsbA0KKyAgICAgICAgICAgIGlmIChjLmlzUHVibGljKCkgfHwgYy5pc1Byb3RlY3RlZCgpKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBjOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIGlmICghc3VwZXJUeXBlLmlzUmVzb2x2ZWQoKSkgew0KKyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiU3VwZXItY2xhc3MgKCIgKyBzdXBlclR5cGUuZ2V0TmFtZSgpICsgIilzaG91bGQgaGF2ZSBiZWVuIHJlc29sdmVkIGFscmVhZHkgZm9yIHR5cGU6ICIgKyB0eXBlLmdldE5hbWUoKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBDb25zdHJ1Y3RvcltdIGNvbnN0cnVjdG9ycyA9IHN1cGVyVHlwZS5nZXRUeXBlQ2xhc3MoKS5nZXREZWNsYXJlZENvbnN0cnVjdG9ycygpOw0KKw0KKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPGNvbnN0cnVjdG9ycy5sZW5ndGg7IGkrKykgew0KKyAgICAgICAgICAgIGludCBtb2QgPSBjb25zdHJ1Y3RvcnNbaV0uZ2V0TW9kaWZpZXJzKCk7DQorDQorICAgICAgICAgICAgLy8gT25seSBsb29rIGF0IHRoaW5ncyB3ZSBjYW4gYWN0dWFseSBjYWxsDQorICAgICAgICAgICAgaWYgKE1vZGlmaWVyLmlzUHVibGljKG1vZCkgfHwgTW9kaWZpZXIuaXNQcm90ZWN0ZWQobW9kKSkgew0KKyAgICAgICAgICAgICAgICBDbGFzc1tdIHR5cGVzID0gY29uc3RydWN0b3JzW2ldLmdldFBhcmFtZXRlclR5cGVzKCk7DQorICAgICAgICAgICAgICAgIFBhcmFtZXRlcltdIHBhcmFtcyA9IG5ldyBQYXJhbWV0ZXJbdHlwZXMubGVuZ3RoXTsNCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaj0wOyBqPHR5cGVzLmxlbmd0aDsgaisrKSB7DQorICAgICAgICAgICAgICAgICAgICBDbGFzc05vZGUgcHR5cGUgPSBDbGFzc0hlbHBlci5tYWtlKHR5cGVzW2pdKTsNCisgICAgICAgICAgICAgICAgICAgIHBhcmFtc1tqXSA9IG5ldyBQYXJhbWV0ZXIocHR5cGUsIHR5cGVzW2pdLmdldE5hbWUoKSk7DQorICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvck5vZGUobW9kLCBwYXJhbXMsIG51bGwsIG51bGwpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcmV0dXJuIG51bGw7DQorICAgIH0NCisNCisgICAgcHJpdmF0ZSB2b2lkIGdlblNwZWNpYWxDb25zdHJ1Y3RvckFyZ3MoUHJpbnRXcml0ZXIgb3V0LCBDb25zdHJ1Y3Rvck5vZGUgbm9kZSwgQ29uc3RydWN0b3JDYWxsRXhwcmVzc2lvbiBjb25zdHJDYWxsKSB7DQorICAgICAgICAvLyBTZWxlY3QgYSBjb25zdHJ1Y3RvciBmcm9tIG91ciBjbGFzcywgb3Igc3VwZXItY2xhc3Mgd2hpY2ggaXMgbGVnYWwgdG8gY2FsbCwNCisgICAgICAgIC8vIHRoZW4gd3JpdGUgb3V0IGFuIGludm9rZSB3L251bGxzIHVzaW5nIGNhc3RzIHRvIGF2b2lkIGFiaWdvdXMgY3JhcG8NCisNCisgICAgICAgIENvbnN0cnVjdG9yTm9kZSBjID0gc2VsZWN0QWNjZXNzaWJsZUNvbnN0cnVjdG9yRnJvbVN1cGVyKG5vZGUpOw0KKyAgICAgICAgaWYgKGMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIG91dC5wcmludCgic3VwZXIgKCIpOw0KKw0KKyAgICAgICAgICAgIFBhcmFtZXRlcltdIHBhcmFtcyA9IGMuZ2V0UGFyYW1ldGVycygpOw0KKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxwYXJhbXMubGVuZ3RoOyBpKyspIHsNCisgICAgICAgICAgICAgICAgcHJpbnREZWZhdWx0VmFsdWUob3V0LCBwYXJhbXNbaV0uZ2V0VHlwZSgpKTsNCisgICAgICAgICAgICAgICAgaWYgKGkgKyAxIDwgcGFyYW1zLmxlbmd0aCkgew0KKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCIsICIpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIA0KKyAgICAgICAgICAgIG91dC5wcmludGxuKCIpOyIpOw0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8vIE90aGVyd2lzZSB0cnkgdGhlIG9sZGVyIG1ldGhvZCBiYXNlZCBvbiB0aGUgY29uc3RydWN0b3IncyBjYWxsIGV4cHJlc3Npb24NCisgICAgICAgIEV4cHJlc3Npb24gYXJndW1lbnRzID0gY29uc3RyQ2FsbC5nZXRBcmd1bWVudHMoKTsNCisNCisgICAgICAgIGlmIChjb25zdHJDYWxsLmlzU3VwZXJDYWxsKCkpIHsNCisgICAgICAgICAgICBvdXQucHJpbnQoInN1cGVyKCIpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgb3V0LnByaW50KCJ0aGlzKCIpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8gRWxzZSB0cnkgdG8gcmVuZGVyIHNvbWUgYXJndW1lbnRzDQorICAgICAgICBpZiAoYXJndW1lbnRzIGluc3RhbmNlb2YgQXJndW1lbnRMaXN0RXhwcmVzc2lvbikgew0KKyAgICAgICAgICAgIEFyZ3VtZW50TGlzdEV4cHJlc3Npb24gYXJndW1lbnRMaXN0RXhwcmVzc2lvbiA9IChBcmd1bWVudExpc3RFeHByZXNzaW9uKSBhcmd1bWVudHM7DQorICAgICAgICAgICAgTGlzdCBhcmdzID0gYXJndW1lbnRMaXN0RXhwcmVzc2lvbi5nZXRFeHByZXNzaW9ucygpOw0KKw0KKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBhcmdzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsNCisgICAgICAgICAgICAgICAgRXhwcmVzc2lvbiBhcmcgPSAoRXhwcmVzc2lvbikgaXQubmV4dCgpOw0KKw0KKyAgICAgICAgICAgICAgICBpZiAoYXJnIGluc3RhbmNlb2YgQ29uc3RhbnRFeHByZXNzaW9uKSB7DQorICAgICAgICAgICAgICAgICAgICBDb25zdGFudEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IChDb25zdGFudEV4cHJlc3Npb24pIGFyZzsNCisgICAgICAgICAgICAgICAgICAgIE9iamVjdCBvID0gZXhwcmVzc2lvbi5nZXRWYWx1ZSgpOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBTdHJpbmcpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIihTdHJpbmcpbnVsbCIpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KGV4cHJlc3Npb24uZ2V0VGV4dCgpKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgIHByaW50RGVmYXVsdFZhbHVlKG91dCwgYXJnLmdldFR5cGUoKSk7DQorICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgaWYgKGFyZyAhPSBhcmdzLmdldChhcmdzLnNpemUoKSAtIDEpKSB7DQorICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiwgIik7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBvdXQucHJpbnRsbigiKTsiKTsNCisgICAgfQ0KKw0KKyAgICBwcml2YXRlIHZvaWQgZ2VuTWV0aG9kKENsYXNzTm9kZSBjbGF6eiwgTWV0aG9kTm9kZSBtZXRob2ROb2RlLCBQcmludFdyaXRlciBvdXQpIHsNCisgICAgICAgIGlmIChtZXRob2ROb2RlLmdldE5hbWUoKS5lcXVhbHMoIjxjbGluaXQ+IikpIHJldHVybjsNCisgICAgICAgIA0KKyAgICAgICAgaWYgKCFjbGF6ei5pc0ludGVyZmFjZSgpKSBwcmludE1vZGlmaWVycyhvdXQsIG1ldGhvZE5vZGUuZ2V0TW9kaWZpZXJzKCkpOw0KKw0KKyAgICAgICAgcHJpbnRUeXBlKG1ldGhvZE5vZGUuZ2V0UmV0dXJuVHlwZSgpLCBvdXQpOw0KKyAgICAgICAgb3V0LnByaW50KCIgIik7DQorICAgICAgICBvdXQucHJpbnQobWV0aG9kTm9kZS5nZXROYW1lKCkpOw0KKw0KKyAgICAgICAgcHJpbnRQYXJhbXMobWV0aG9kTm9kZSwgb3V0KTsNCisNCisgICAgICAgIGlmICgobWV0aG9kTm9kZS5nZXRNb2RpZmllcnMoKSAmIE9wY29kZXMuQUNDX0FCU1RSQUNUKSAhPSAwKSB7DQorICAgICAgICAgICAgb3V0LnByaW50bG4oIjsiKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgb3V0LnByaW50KCIgeyAiKTsNCisgICAgICAgICAgICBDbGFzc05vZGUgcmV0VHlwZSA9IG1ldGhvZE5vZGUuZ2V0UmV0dXJuVHlwZSgpOw0KKyAgICAgICAgICAgIHByaW50UmV0dXJuKG91dCwgcmV0VHlwZSk7DQorICAgICAgICAgICAgb3V0LnByaW50bG4oIn0iKTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBwcml2YXRlIHZvaWQgcHJpbnRSZXR1cm4oUHJpbnRXcml0ZXIgb3V0LCBDbGFzc05vZGUgcmV0VHlwZSkgew0KKyAgICAgICAgU3RyaW5nIHJldE5hbWUgPSByZXRUeXBlLmdldE5hbWUoKTsNCisgICAgICAgIGlmICghcmV0TmFtZS5lcXVhbHMoInZvaWQiKSkgew0KKyAgICAgICAgICAgIG91dC5wcmludCgicmV0dXJuICIpOw0KKw0KKyAgICAgICAgICAgIHByaW50RGVmYXVsdFZhbHVlKG91dCwgcmV0VHlwZSk7DQorDQorICAgICAgICAgICAgb3V0LnByaW50KCI7Iik7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcHJpdmF0ZSB2b2lkIHByaW50RGVmYXVsdFZhbHVlKFByaW50V3JpdGVyIG91dCwgQ2xhc3NOb2RlIHR5cGUpIHsNCisgICAgICAgIG91dC5wcmludCgiKCIpOw0KKyAgICAgICAgcHJpbnRUeXBlKHR5cGUsb3V0KTsNCisgICAgICAgIG91dC5wcmludCgiKSIpOw0KKw0KKyAgICAgICAgaWYgKENsYXNzSGVscGVyLmlzUHJpbWl0aXZlVHlwZSh0eXBlKSkgew0KKyAgICAgICAgICAgIGlmICh0eXBlPT1DbGFzc0hlbHBlci5ib29sZWFuX1RZUEUpew0KKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoImZhbHNlIik7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgb3V0LnByaW50KCIwIik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBvdXQucHJpbnQoIm51bGwiKTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBwcml2YXRlIHZvaWQgcHJpbnRUeXBlKENsYXNzTm9kZSB0eXBlLCBQcmludFdyaXRlciBvdXQpIHsNCisgICAgICAgIGlmICh0eXBlLmlzQXJyYXkoKSkgew0KKyAgICAgICAgICAgIHByaW50VHlwZSh0eXBlLmdldENvbXBvbmVudFR5cGUoKSxvdXQpOw0KKyAgICAgICAgICAgIG91dC5wcmludCgiW10iKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgd3JpdGVHZW5lcmljc0JvdW5kcyhvdXQsdHlwZSxmYWxzZSk7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcHJpdmF0ZSB2b2lkIHByaW50VHlwZU5hbWUoQ2xhc3NOb2RlIHR5cGUsIFByaW50V3JpdGVyIG91dCkgew0KKyAgICAgICAgaWYgKENsYXNzSGVscGVyLmlzUHJpbWl0aXZlVHlwZSh0eXBlKSkgew0KKyAgICAgICAgICAgIGlmICh0eXBlPT1DbGFzc0hlbHBlci5ib29sZWFuX1RZUEUpIHsNCisgICAgICAgICAgICAgICAgb3V0LnByaW50KCJib29sZWFuIik7DQorICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlPT1DbGFzc0hlbHBlci5jaGFyX1RZUEUpIHsNCisgICAgICAgICAgICAgICAgb3V0LnByaW50KCJjaGFyIik7DQorICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlPT1DbGFzc0hlbHBlci5pbnRfVFlQRSkgew0KKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoImludCIpOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZT09Q2xhc3NIZWxwZXIuc2hvcnRfVFlQRSkgew0KKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoInNob3J0Iik7DQorICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlPT1DbGFzc0hlbHBlci5sb25nX1RZUEUpIHsNCisgICAgICAgICAgICAgICAgb3V0LnByaW50KCJsb25nIik7DQorICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlPT1DbGFzc0hlbHBlci5mbG9hdF9UWVBFKSB7DQorICAgICAgICAgICAgICAgIG91dC5wcmludCgiZmxvYXQiKTsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGU9PUNsYXNzSGVscGVyLmRvdWJsZV9UWVBFKSB7DQorICAgICAgICAgICAgICAgIG91dC5wcmludCgiZG91YmxlIik7DQorICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlPT1DbGFzc0hlbHBlci5ieXRlX1RZUEUpIHsNCisgICAgICAgICAgICAgICAgb3V0LnByaW50KCJieXRlIik7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgb3V0LnByaW50KCJ2b2lkIik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBvdXQucHJpbnQodHlwZS5yZWRpcmVjdCgpLmdldE5hbWUoKS5yZXBsYWNlKCckJywgJy4nKSk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIA0KKyAgICBwcml2YXRlIHZvaWQgd3JpdGVHZW5lcmljc0JvdW5kcyhQcmludFdyaXRlciBvdXQsIENsYXNzTm9kZSB0eXBlLCBib29sZWFuIHNraXBOYW1lKSB7DQorICAgICAgICBpZiAoIXNraXBOYW1lKSBwcmludFR5cGVOYW1lKHR5cGUsb3V0KTsNCisgICAgICAgIGlmIChqYXZhNSAmJiAhdHlwZS5pc0dlbmVyaWNzUGxhY2VIb2xkZXIoKSkgd3JpdGVHZW5lcmljc0JvdW5kcyhvdXQsdHlwZS5nZXRHZW5lcmljc1R5cGVzKCkpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIHZvaWQgd3JpdGVHZW5lcmljc0JvdW5kcyhQcmludFdyaXRlciBvdXQsIEdlbmVyaWNzVHlwZVtdIGdlbmVyaWNzVHlwZXMpIHsNCisgICAgICAgIGlmIChnZW5lcmljc1R5cGVzPT1udWxsIHx8IGdlbmVyaWNzVHlwZXMubGVuZ3RoPT0wKSByZXR1cm47DQorICAgICAgICBvdXQucHJpbnQoJzwnKTsNCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ2VuZXJpY3NUeXBlcy5sZW5ndGg7IGkrKykgew0KKyAgICAgICAgICAgIGlmIChpIT0wKSBvdXQucHJpbnQoIiwgIik7DQorICAgICAgICAgICAgd3JpdGVHZW5lcmljc0JvdW5kcyhvdXQsZ2VuZXJpY3NUeXBlc1tpXSk7DQorICAgICAgICB9DQorICAgICAgICBvdXQucHJpbnQoJz4nKTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlR2VuZXJpY3NCb3VuZHMoUHJpbnRXcml0ZXIgb3V0LCBHZW5lcmljc1R5cGUgZ2VuZXJpY3NUeXBlKSB7DQorICAgICAgICBpZiAoZ2VuZXJpY3NUeXBlLmlzUGxhY2Vob2xkZXIoKSkgew0KKyAgICAgICAgICAgIG91dC5wcmludChnZW5lcmljc1R5cGUuZ2V0TmFtZSgpKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgcHJpbnRUeXBlTmFtZShnZW5lcmljc1R5cGUuZ2V0VHlwZSgpLCBvdXQpOw0KKyAgICAgICAgICAgIENsYXNzTm9kZVtdIHVwcGVyQm91bmRzID0gZ2VuZXJpY3NUeXBlLmdldFVwcGVyQm91bmRzKCk7DQorICAgICAgICAgICAgQ2xhc3NOb2RlIGxvd2VyQm91bmQgPSBnZW5lcmljc1R5cGUuZ2V0TG93ZXJCb3VuZCgpOw0KKyAgICAgICAgICAgIGlmICh1cHBlckJvdW5kcyE9bnVsbCkgew0KKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiBleHRlbmRzICIpOw0KKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHVwcGVyQm91bmRzLmxlbmd0aDsgaSsrKSB7DQorICAgICAgICAgICAgICAgICAgICBwcmludFR5cGUodXBwZXJCb3VuZHNbaV0sb3V0KTsNCisgICAgICAgICAgICAgICAgICAgIGlmIChpKzE8dXBwZXJCb3VuZHMubGVuZ3RoKSBvdXQucHJpbnQoIiAmICIpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfSBlbHNlIGlmIChsb3dlckJvdW5kIT1udWxsKSB7DQorICAgICAgICAgICAgICAgIG91dC5wcmludCgiIHN1cGVyICIpOw0KKyAgICAgICAgICAgICAgICBwcmludFR5cGUobG93ZXJCb3VuZCxvdXQpOw0KKyAgICAgICAgICAgIH0gICAgICAgDQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcHJpdmF0ZSB2b2lkIHByaW50UGFyYW1zKE1ldGhvZE5vZGUgbWV0aG9kTm9kZSwgUHJpbnRXcml0ZXIgb3V0KSB7DQorICAgICAgICBvdXQucHJpbnQoIigiKTsNCisgICAgICAgIFBhcmFtZXRlcltdIHBhcmFtZXRlcnMgPSBtZXRob2ROb2RlLmdldFBhcmFtZXRlcnMoKTsNCisNCisgICAgICAgIGlmIChwYXJhbWV0ZXJzICE9IG51bGwgJiYgcGFyYW1ldGVycy5sZW5ndGggIT0gMCkgew0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpICE9IHBhcmFtZXRlcnMubGVuZ3RoOyArK2kpIHsNCisgICAgICAgICAgICAgICAgcHJpbnRUeXBlKHBhcmFtZXRlcnNbaV0uZ2V0VHlwZSgpLCBvdXQpOw0KKyAgICAgICAgICAgICAgICANCisgICAgICAgICAgICAgICAgb3V0LnByaW50KCIgIik7DQorICAgICAgICAgICAgICAgIG91dC5wcmludChwYXJhbWV0ZXJzW2ldLmdldE5hbWUoKSk7DQorDQorICAgICAgICAgICAgICAgIGlmIChpICsgMSA8IHBhcmFtZXRlcnMubGVuZ3RoKSB7DQorICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiwgIik7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIG91dC5wcmludCgiKSIpOw0KKyAgICB9DQorDQorICAgIHByaXZhdGUgdm9pZCBwcmludE1vZGlmaWVycyhQcmludFdyaXRlciBvdXQsIGludCBtb2RpZmllcnMpIHsNCisgICAgICAgIGlmICgobW9kaWZpZXJzICYgT3Bjb2Rlcy5BQ0NfUFVCTElDKSAhPSAwKQ0KKyAgICAgICAgICAgIG91dC5wcmludCgicHVibGljICIpOw0KKw0KKyAgICAgICAgaWYgKChtb2RpZmllcnMgJiBPcGNvZGVzLkFDQ19QUk9URUNURUQpICE9IDApDQorICAgICAgICAgICAgb3V0LnByaW50KCJwcm90ZWN0ZWQgIik7DQorDQorICAgICAgICBpZiAoKG1vZGlmaWVycyAmIE9wY29kZXMuQUNDX1BSSVZBVEUpICE9IDApDQorICAgICAgICAgICAgb3V0LnByaW50KCJwcml2YXRlICIpOw0KKyAgICAgICAgDQorICAgICAgICBpZiAoKG1vZGlmaWVycyAmIE9wY29kZXMuQUNDX1NUQVRJQykgIT0gMCkNCisgICAgICAgICAgICBvdXQucHJpbnQoInN0YXRpYyAiKTsNCisNCisgICAgICAgIGlmICgobW9kaWZpZXJzICYgT3Bjb2Rlcy5BQ0NfU1lOQ0hST05JWkVEKSAhPSAwKQ0KKyAgICAgICAgICAgIG91dC5wcmludCgic3luY2hyb25pemVkICIpOw0KKw0KKyAgICAgICAgaWYgKChtb2RpZmllcnMgJiBPcGNvZGVzLkFDQ19BQlNUUkFDVCkgIT0gMCkNCisgICAgICAgICAgICBvdXQucHJpbnQoImFic3RyYWN0ICIpOw0KKyAgICB9DQorDQorICAgIHByaXZhdGUgdm9pZCBnZW5JbXBvcnRzKENsYXNzTm9kZSBjbGFzc05vZGUsIFByaW50V3JpdGVyIG91dCkgew0KKyAgICAgICAgU2V0IGltcG9ydHMgPSBuZXcgSGFzaFNldCgpOw0KKw0KKyAgICAgICAgLy8NCisgICAgICAgIC8vIEhBQ0s6IEFkZCB0aGUgZGVmYXVsdCBpbXBvcnRzLi4uIHNpbmNlIHRoaW5ncyBsaWtlIENsb3N1cmUgYW5kIEdyb292eU9iamVjdCBzZWVtIHRvIHBhcnNlIG91dCB3L28gZnVsbHkgcXVhbGlmaWVkIGNsYXNzbmFtZXMuDQorICAgICAgICAvLw0KKyAgICAgICAgaW1wb3J0cy5hZGRBbGwoQXJyYXlzLmFzTGlzdChSZXNvbHZlVmlzaXRvci5ERUZBVUxUX0lNUE9SVFMpKTsNCisgICAgICAgIA0KKyAgICAgICAgTW9kdWxlTm9kZSBtb2R1bGVOb2RlID0gY2xhc3NOb2RlLmdldE1vZHVsZSgpOw0KKyAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IG1vZHVsZU5vZGUuZ2V0SW1wb3J0UGFja2FnZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7DQorICAgICAgICAgICAgaW1wb3J0cy5hZGQoaXQubmV4dCgpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBtb2R1bGVOb2RlLmdldEltcG9ydHMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7DQorICAgICAgICAgICAgSW1wb3J0Tm9kZSBpbXAgPSAoSW1wb3J0Tm9kZSkgaXQubmV4dCgpOw0KKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gaW1wLmdldFR5cGUoKS5nZXROYW1lKCk7DQorICAgICAgICAgICAgaW50IGxhc3REb3QgPSBuYW1lLmxhc3RJbmRleE9mKCcuJyk7DQorICAgICAgICAgICAgaWYgKGxhc3REb3QgIT0gLTEpDQorICAgICAgICAgICAgICAgIGltcG9ydHMuYWRkKG5hbWUuc3Vic3RyaW5nKDAsIGxhc3REb3QgKyAxKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gaW1wb3J0cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7DQorICAgICAgICAgICAgU3RyaW5nIGltcCA9IChTdHJpbmcpIGl0Lm5leHQoKTsNCisgICAgICAgICAgICBvdXQucHJpbnQoImltcG9ydCAiKTsNCisgICAgICAgICAgICBvdXQucHJpbnQoaW1wKTsNCisgICAgICAgICAgICBvdXQucHJpbnRsbigiKjsiKTsNCisgICAgICAgIH0NCisgICAgICAgIG91dC5wcmludGxuKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgY2xlYW4oKSB7DQorICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gdG9Db21waWxlLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsNCisgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IChTdHJpbmcpIGl0Lm5leHQoKTsNCisgICAgICAgICAgICBuZXcgRmlsZShvdXRwdXRQYXRoLCBwYXRoICsgIi5qYXZhIikuZGVsZXRlKCk7DQorICAgICAgICB9DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvamF2YWMvSmF2YWNDb21waWxlckZhY3RvcnkuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2phdmFjL0phdmFjQ29tcGlsZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNiODZlNgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2phdmFjL0phdmFjQ29tcGlsZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwyNSBAQAorLyoNCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4NCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuamF2YWM7DQorDQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5Db21waWxlckNvbmZpZ3VyYXRpb247DQorDQorcHVibGljIGNsYXNzIEphdmFjQ29tcGlsZXJGYWN0b3J5IGltcGxlbWVudHMgSmF2YUNvbXBpbGVyRmFjdG9yeSB7DQorICAgIHB1YmxpYyBKYXZhQ29tcGlsZXIgY3JlYXRlQ29tcGlsZXIoQ29tcGlsZXJDb25maWd1cmF0aW9uIGNvbmZpZykgew0KKyAgICAgICAgcmV0dXJuIG5ldyBKYXZhY0phdmFDb21waWxlcihjb25maWcpOw0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2phdmFjL0phdmFjSmF2YUNvbXBpbGVyLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9qYXZhYy9KYXZhY0phdmFDb21waWxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2N2EyYmEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9qYXZhYy9KYXZhY0phdmFDb21waWxlci5qYXZhCkBAIC0wLDAgKzEsMTcyIEBACisvKg0KKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLg0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5qYXZhYzsNCisNCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5Q2xhc3NMb2FkZXI7DQorDQoraW1wb3J0IGphdmEuaW8uRmlsZTsNCitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsNCitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7DQoraW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOw0KK2ltcG9ydCBqYXZhLnV0aWwuTWFwOw0KKw0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuQ29tcGlsYXRpb25Vbml0Ow0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuQ29tcGlsZXJDb25maWd1cmF0aW9uOw0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wubWVzc2FnZXMuRXhjZXB0aW9uTWVzc2FnZTsNCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLm1lc3NhZ2VzLlNpbXBsZU1lc3NhZ2U7DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5EZWZhdWx0R3Jvb3Z5TWV0aG9kczsNCisNCitwdWJsaWMgY2xhc3MgSmF2YWNKYXZhQ29tcGlsZXIgaW1wbGVtZW50cyBKYXZhQ29tcGlsZXIgew0KKyAgICBwcml2YXRlIENvbXBpbGVyQ29uZmlndXJhdGlvbiBjb25maWc7DQorDQorICAgIHB1YmxpYyBKYXZhY0phdmFDb21waWxlcihDb21waWxlckNvbmZpZ3VyYXRpb24gY29uZmlnKSB7DQorICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZzsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBjb21waWxlKExpc3QgZmlsZXMsIENvbXBpbGF0aW9uVW5pdCBjdSkgew0KKyAgICAgICAgU3RyaW5nW10gamF2YWNQYXJhbWV0ZXJzID0gbWFrZVBhcmFtZXRlcnMoZmlsZXMpOw0KKyAgICAgICAgU3RyaW5nV3JpdGVyIGphdmFjT3V0cHV0PW51bGw7DQorICAgICAgICBpbnQgamF2YWNSZXR1cm5WYWx1ZSA9IDA7DQorICAgICAgICB0cnkgew0KKyAgICAgICAgICAgIENsYXNzIGphdmFjID0gZmluZEphdmFjKGN1KTsNCisgICAgICAgICAgICBNZXRob2QgbWV0aG9kPW51bGw7DQorICAgICAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICAgICAgbWV0aG9kID0gamF2YWMuZ2V0TWV0aG9kKCJjb21waWxlIiwgbmV3IENsYXNzW117U3RyaW5nW10uY2xhc3MsIFByaW50V3JpdGVyLmNsYXNzfSk7DQorICAgICAgICAgICAgICAgIGphdmFjT3V0cHV0ID0gbmV3IFN0cmluZ1dyaXRlcigpOw0KKyAgICAgICAgICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoamF2YWNPdXRwdXQpOw0KKyAgICAgICAgICAgICAgICBPYmplY3QgcmV0ID0gbWV0aG9kLmludm9rZShudWxsLCBuZXcgT2JqZWN0W117amF2YWNQYXJhbWV0ZXJzLHdyaXRlcn0pOw0KKyAgICAgICAgICAgICAgICBqYXZhY1JldHVyblZhbHVlID0gKChJbnRlZ2VyKSByZXQpLmludFZhbHVlKCk7DQorICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHt9DQorICAgICAgICAgICAgaWYgKG1ldGhvZD09bnVsbCkgew0KKyAgICAgICAgICAgICAgICBtZXRob2QgPSBqYXZhYy5nZXRNZXRob2QoImNvbXBpbGUiLCBuZXcgQ2xhc3NbXXtTdHJpbmdbXS5jbGFzc30pOw0KKyAgICAgICAgICAgICAgICBPYmplY3QgcmV0ID0gbWV0aG9kLmludm9rZShudWxsLCBuZXcgT2JqZWN0W117amF2YWNQYXJhbWV0ZXJzfSk7DQorICAgICAgICAgICAgICAgIGphdmFjUmV0dXJuVmFsdWUgPSAoKEludGVnZXIpIHJldCkuaW50VmFsdWUoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY3UuZ2V0Q29uZmlndXJhdGlvbigpLmdldE91dHB1dCgpOw0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCisgICAgICAgICAgICBjdS5nZXRFcnJvckNvbGxlY3RvcigpLmFkZEZhdGFsRXJyb3IobmV3IEV4Y2VwdGlvbk1lc3NhZ2UoZSwgdHJ1ZSwgY3UpKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChqYXZhY1JldHVyblZhbHVlIT0wKSB7DQorICAgICAgICAgICAgc3dpdGNoIChqYXZhY1JldHVyblZhbHVlKSB7DQorICAgICAgICAgICAgICAgIGNhc2UgMTogYWRkSmF2YWNFcnJvcigiQ29tcGlsZSBlcnJvciBkdXJpbmcgY29tcGlsYXRpb24gd2l0aCBqYXZhYy4iLGN1LGphdmFjT3V0cHV0KTsgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgMjogYWRkSmF2YWNFcnJvcigiSW52YWxpZCBjb21tYW5kbGluZSB1c2FnZSBmb3IgamF2YWMuIixjdSxqYXZhY091dHB1dCk7IGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlIDM6IGFkZEphdmFjRXJyb3IoIlN5c3RlbSBlcnJvciBkdXJpbmcgY29tcGlsYXRpb24gd2l0aCBqYXZhYy4iLGN1LGphdmFjT3V0cHV0KTsgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgNDogYWRkSmF2YWNFcnJvcigiQWJub3JtYWwgdGVybWluYXRpb24gb2YgamF2YWMuIixjdSxqYXZhY091dHB1dCk7IGJyZWFrOw0KKyAgICAgICAgICAgICAgICBkZWZhdWx0OiBhZGRKYXZhY0Vycm9yKCJ1bmV4cGVjdGVkIHJldHVybiB2YWx1ZSBieSBqYXZhYy4iLGN1LGphdmFjT3V0cHV0KTsgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSAgICAgICAgDQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgdm9pZCBhZGRKYXZhY0Vycm9yKFN0cmluZyBoZWFkZXIsIENvbXBpbGF0aW9uVW5pdCBjdSwgU3RyaW5nV3JpdGVyIG1zZykgew0KKyAgICAgICAgaWYgKG1zZyE9bnVsbCkgIHsNCisgICAgICAgICAgICBoZWFkZXIgPSBoZWFkZXIrIlxuIittc2cuZ2V0QnVmZmVyKCkudG9TdHJpbmcoKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaGVhZGVyID0gaGVhZGVyKw0KKyAgICAgICAgICAgICJcblRoaXMgamF2YWMgdmVyc2lvbiBkb2VzIG5vdCBzdXBwb3J0IGNvbXBpbGUoU3RyaW5nW10sUHJpbnRXcml0ZXIpLCAiKw0KKyAgICAgICAgICAgICJzbyBubyBmdXJ0aGVyIGRldGFpbHMgb2YgdGhlIGVycm9yIGFyZSBhdmFpbGFibGUuIFRoZSBtZXNzYWdlIGVycm9yIHRleHQgIisNCisgICAgICAgICAgICAic2hvdWxkIGJlIGZvdW5kIG9uIFN5c3RlbS5lcnIuXG4iOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY3UuZ2V0RXJyb3JDb2xsZWN0b3IoKS5hZGRGYXRhbEVycm9yKG5ldyBTaW1wbGVNZXNzYWdlKGhlYWRlcixjdSkpOw0KKyAgICB9DQorICAgIA0KKw0KKyAgICBwcml2YXRlIFN0cmluZ1tdIG1ha2VQYXJhbWV0ZXJzKExpc3QgZmlsZXMpIHsNCisgICAgICAgIE1hcCBvcHRpb25zID0gY29uZmlnLmdldEpvaW50Q29tcGlsYXRpb25PcHRpb25zKCk7DQorICAgICAgICBMaW5rZWRMaXN0IHBhcmFzID0gbmV3IExpbmtlZExpc3QoKTsNCisNCisgICAgICAgIEZpbGUgdGFyZ2V0ID0gY29uZmlnLmdldFRhcmdldERpcmVjdG9yeSgpOw0KKyAgICAgICAgaWYgKHRhcmdldCA9PSBudWxsKSB0YXJnZXQgPSBuZXcgRmlsZSgiLiIpOw0KKw0KKyAgICAgICAgLy8gZGVmYXVsdHMNCisgICAgICAgIHBhcmFzLmFkZCgiLWQiKTsNCisgICAgICAgIHBhcmFzLmFkZCh0YXJnZXQuZ2V0QWJzb2x1dGVQYXRoKCkpOw0KKyAgICAgICAgcGFyYXMuYWRkKCItc291cmNlcGF0aCIpOw0KKyAgICAgICAgcGFyYXMuYWRkKCgoRmlsZSkgb3B0aW9ucy5nZXQoInN0dWJEaXIiKSkuZ2V0QWJzb2x1dGVQYXRoKCkpOw0KKyAgICAgICAgDQorICAgICAgICAvLyBhZGQgZmxhZ3MNCisgICAgICAgIFN0cmluZ1tdIGZsYWdzID0gKFN0cmluZ1tdKSBvcHRpb25zLmdldCgiZmxhZ3MiKTsNCisgICAgICAgIGlmIChmbGFncyAhPSBudWxsKSB7DQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmbGFncy5sZW5ndGg7IGkrKykgew0KKyAgICAgICAgICAgICAgICBwYXJhcy5hZGQoJy0nICsgZmxhZ3NbaV0pOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIGJvb2xlYW4gaGFkQ2xhc3NwYXRoPWZhbHNlOw0KKyAgICAgICAgLy8gYWRkIG5hbWVkVmFsdWVzDQorICAgICAgICBTdHJpbmdbXSBuYW1lZFZhbHVlcyA9IChTdHJpbmdbXSkgb3B0aW9ucy5nZXQoIm5hbWVkVmFsdWVzIik7DQorICAgICAgICBpZiAobmFtZWRWYWx1ZXMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZWRWYWx1ZXMubGVuZ3RoOyBpICs9IDIpIHsNCisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBuYW1lZFZhbHVlc1tpXTsNCisgICAgICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKCJjbGFzc3BhdGgiKSkgaGFkQ2xhc3NwYXRoID0gdHJ1ZTsNCisgICAgICAgICAgICAgICAgcGFyYXMuYWRkKCctJyArIG5hbWUpOw0KKyAgICAgICAgICAgICAgICBwYXJhcy5hZGQobmFtZWRWYWx1ZXNbaSArIDFdKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIC8vIGFwcGVuZCBjbGFzc3BhdGggaWYgbm90IGFscmVhZHkgZGVmaW5lZA0KKyAgICAgICAgaWYgKCFoYWRDbGFzc3BhdGgpIHsNCisgICAgICAgICAgICBwYXJhcy5hZGQoIi1jbGFzc3BhdGgiKTsNCisgICAgICAgICAgICBMaXN0IGNsYXNzcGF0aCA9IGNvbmZpZy5nZXRDbGFzc3BhdGgoKTsNCisgICAgICAgICAgICBTdHJpbmcgcmVzdWx0UGF0aCA9IERlZmF1bHRHcm9vdnlNZXRob2RzLmpvaW4oY2xhc3NwYXRoLCBGaWxlLnBhdGhTZXBhcmF0b3IpOw0KKyAgICAgICAgICAgIHBhcmFzLmFkZChyZXN1bHRQYXRoKTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgLy8gZmlsZXMgdG8gY29tcGlsZQ0KKyAgICAgICAgcGFyYXMuYWRkQWxsKGZpbGVzKTsNCisNCisgICAgICAgIHJldHVybiAoU3RyaW5nW10pIHBhcmFzLnRvQXJyYXkobmV3IFN0cmluZ1twYXJhcy5zaXplKCldKTsNCisgICAgfQ0KKw0KKyAgICBwcml2YXRlIENsYXNzIGZpbmRKYXZhYyhDb21waWxhdGlvblVuaXQgY3UpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsNCisgICAgICAgIFN0cmluZyBtYWluID0gImNvbS5zdW4udG9vbHMuamF2YWMuTWFpbiI7DQorICAgICAgICB0cnkgew0KKyAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKG1haW4pOw0KKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7fQ0KKyAgICAgICAgICAgIA0KKyAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICBDbGFzc0xvYWRlciBjbCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOw0KKyAgICAgICAgICAgIHJldHVybiBjbC5sb2FkQ2xhc3MobWFpbik7DQorICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHt9DQorICAgICAgICANCisgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgcmV0dXJuIENsYXNzTG9hZGVyLmdldFN5c3RlbUNsYXNzTG9hZGVyKCkubG9hZENsYXNzKG1haW4pOw0KKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7fQ0KKyAgICAgICAgDQorICAgICAgICB0cnkgew0KKyAgICAgICAgICAgIHJldHVybiBjdS5nZXRDbGFzc0xvYWRlcigpLmdldFBhcmVudCgpLmxvYWRDbGFzcyhtYWluKTsNCisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZTMpIHt9DQorICAgICAgICANCisgICAgICAgIA0KKyAgICAgICAgLy8gY291bGRuJ3QgZmluZCBjb21waWxlciAtIHRyeSB0byBmaW5kIHRvb2xzLmphcg0KKyAgICAgICAgLy8gYmFzZWQgb24gamF2YS5ob21lIHNldHRpbmcNCisgICAgICAgIFN0cmluZyBqYXZhSG9tZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIik7DQorICAgICAgICBpZiAoamF2YUhvbWUudG9Mb3dlckNhc2UoTG9jYWxlLlVTKS5lbmRzV2l0aCgianJlIikpIHsNCisgICAgICAgICAgICBqYXZhSG9tZSA9IGphdmFIb21lLnN1YnN0cmluZygwLCBqYXZhSG9tZS5sZW5ndGgoKSAtIDQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRmlsZSB0b29sc0phciA9IG5ldyBGaWxlKChqYXZhSG9tZSArICIvbGliL3Rvb2xzLmphciIpKTsNCisgICAgICAgIGlmICh0b29sc0phci5leGlzdHMoKSkgew0KKyAgICAgICAgICAgIEdyb292eUNsYXNzTG9hZGVyIGxvYWRlciA9IGN1LmdldENsYXNzTG9hZGVyKCk7DQorICAgICAgICAgICAgbG9hZGVyLmFkZENsYXNzcGF0aCh0b29sc0phci5nZXRBYnNvbHV0ZVBhdGgoKSk7DQorICAgICAgICAgICAgcmV0dXJuIGxvYWRlci5sb2FkQ2xhc3MobWFpbik7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKCJ1bmFibGUgdG8gbG9jYXRlIHRoZSBqYXZhIGNvbXBpbGVyIGNvbS5zdW4udG9vbHMuamF2YWMuTWFpbiwgcGxlYXNlIGNoYW5nZSB5b3VyIGNsYXNzbG9hZGVyIHNldHRpbmdzIik7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvamF2YWMvcGFja2FnZS5odG1sIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvamF2YWMvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMzIxZGEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9qYXZhYy9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSw4IEBACis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPHRpdGxlPnBhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5qYXZhYy4qPC90aXRsZT4KKyAgPC9oZWFkPgorICA8Ym9keT4KKyAgICA8cD5DbGFzc2VzIHJlbGF0ZWQgdG8gdGhlIGpvaW50IGNvbXBpbGVyLjwvcD4KKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvcGFja2FnZS5odG1sIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzODhiNWMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSwxMCBAQAorPGh0bWw+CisgIDxoZWFkPgorICAgIDx0aXRsZT5wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuKjwvdGl0bGU+CisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgPHA+CisgICAgICBDb21waWxlciBlbnRyeSBwb2ludHMgYW5kIG1pc2NlbGxhbmVvdXMgZGV2ZWxvcG1lbnQgdG9vbHMuCisgICAgPC9wPgorICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9CdWZmZXJNYW5hZ2VyLmdyb292eSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL0J1ZmZlck1hbmFnZXIuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhY2JiMmQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9CdWZmZXJNYW5hZ2VyLmdyb292eQpAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbAorCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC51dGlsLkxvZ2dlcgorCisvKioKKyAqIE1hbmFnZXMgdGhlIHNoZWxscyBidWZmZXJzLgorICoKKyAqIEB2ZXJzaW9uICRJZCQKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphc29uQHBsYW5ldDU3LmNvbSI+SmFzb24gRGlsbG9uPC9hPgorICovCitjbGFzcyBCdWZmZXJNYW5hZ2VyCit7CisgICAgcHJvdGVjdGVkIGZpbmFsIExvZ2dlciBsb2cgPSBMb2dnZXIuY3JlYXRlKHRoaXMuY2xhc3MpCisgICAgCisgICAgZmluYWwgTGlzdCBidWZmZXJzID0gW10KKworICAgIGludCBzZWxlY3RlZAorCisgICAgQnVmZmVyTWFuYWdlcigpIHsKKyAgICAgICAgcmVzZXQoKQorICAgIH0KKyAgICAKKyAgICB2b2lkIHJlc2V0KCkgeworICAgICAgICBidWZmZXJzLmNsZWFyKCkKKyAgICAgICAgCisgICAgICAgIGNyZWF0ZSh0cnVlKQorICAgICAgICAKKyAgICAgICAgbG9nLmRlYnVnKCdCdWZmZXJzIHJlc2V0JykKKyAgICB9CisgICAgCisgICAgTGlzdCBjdXJyZW50KCkgeworICAgICAgICBhc3NlcnQgIWJ1ZmZlcnMuaXNFbXB0eSgpCisgICAgICAgIAorICAgICAgICByZXR1cm4gYnVmZmVyc1tzZWxlY3RlZF0KKyAgICB9CisgICAgCisgICAgdm9pZCBzZWxlY3QoZmluYWwgaW50IGluZGV4KSB7CisgICAgICAgIGFzc2VydCBpbmRleCA+PSAwICYmIGluZGV4IDwgYnVmZmVycy5zaXplKCkKKyAgICAgICAgCisgICAgICAgIHNlbGVjdGVkID0gaW5kZXgKKyAgICB9CisKKyAgICBpbnQgY3JlYXRlKGZpbmFsIGJvb2xlYW4gc2VsZWN0KSB7CisgICAgICAgIGJ1ZmZlcnMgPDwgW10KKworICAgICAgICBkZWYgaSA9IGJ1ZmZlcnMuc2l6ZSgpIC0gMQorCisgICAgICAgIGlmIChzZWxlY3QpIHsKKyAgICAgICAgICAgIHNlbGVjdChpKQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAobG9nLmRlYnVnRW5hYmxlZCkgeworICAgICAgICAgICAgbG9nLmRlYnVnKCJDcmVhdGVkIG5ldyBidWZmZXIgd2l0aCBpbmRleDogJGkiKQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gaQorICAgIH0KKworICAgIHZvaWQgZGVsZXRlKGZpbmFsIGludCBpbmRleCkgeworICAgICAgICBhc3NlcnQgaW5kZXggPj0gMCAmJiBpbmRleCA8IGJ1ZmZlcnMuc2l6ZSgpCisKKyAgICAgICAgYnVmZmVycy5yZW1vdmUoaW5kZXgpCisgICAgICAgIAorICAgICAgICBpZiAobG9nLmRlYnVnRW5hYmxlZCkgeworICAgICAgICAgICAgbG9nLmRlYnVnKCJEZWxldGVkIGJ1ZmZlciB3aXRoIGluZGV4OiAkaW5kZXgiKQorICAgICAgICB9CisgICAgfQorCisgICAgaW50IHNpemUoKSB7CisgICAgICAgIHJldHVybiBidWZmZXJzLnNpemUoKQorICAgIH0KKworICAgIC8vCisgICAgLy8gU2VsZWN0ZWQgb3BlcmF0b3JzCisgICAgLy8KKyAgICAKKyAgICB2b2lkIGRlbGV0ZVNlbGVjdGVkKCkgeworICAgICAgICBkZWxldGUoc2VsZWN0ZWQpCisKKyAgICAgICAgZGVmIGkgPSBzZWxlY3RlZCAtIDEKKworICAgICAgICBpZiAoaSA8IDApIHsKKyAgICAgICAgICAgIHNlbGVjdCgwKQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgc2VsZWN0KGkpCisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGNsZWFyU2VsZWN0ZWQoKSB7CisgICAgICAgIGN1cnJlbnQoKS5jbGVhcigpCisgICAgfQorCisgICAgdm9pZCB1cGRhdGVTZWxlY3RlZChmaW5hbCBMaXN0IGJ1ZmZlcikgeworICAgICAgICBhc3NlcnQgYnVmZmVyICE9IG51bGwKKyAgICAgICAgCisgICAgICAgIGJ1ZmZlcnNbc2VsZWN0ZWRdID0gYnVmZmVyCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL0NvbW1hbmQuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvQ29tbWFuZC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkyMzA3MQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL0NvbW1hbmQuZ3Jvb3Z5CkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwKKworaW1wb3J0IGpsaW5lLkNvbXBsZXRvcgorCisvKioKKyAqIFByb3ZpZGVzIHRoZSBpbnRlcmZhY2UgcmVxdWlyZWQgZm9yIGNvbW1hbmQgZXh0ZW50aW9ucy4KKyAqCisgKiBAdmVyc2lvbiAkSWQkCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYXNvbkBwbGFuZXQ1Ny5jb20iPkphc29uIERpbGxvbjwvYT4KKyAqLworaW50ZXJmYWNlIENvbW1hbmQKK3sKKyAgICBTdHJpbmcgZ2V0TmFtZSgpCisKKyAgICBTdHJpbmcgZ2V0U2hvcnRjdXQoKQorCisgICAgQ29tcGxldG9yIGdldENvbXBsZXRvcigpCisKKyAgICBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKQorCisgICAgU3RyaW5nIGdldFVzYWdlKCkKKworICAgIFN0cmluZyBnZXRIZWxwKCkKKworICAgIExpc3QvKjxDb21tYW5kQWxpYXM+Ki8gZ2V0QWxpYXNlcygpCisKKyAgICBPYmplY3QgZXhlY3V0ZShMaXN0IGFyZ3MpCisgICAgCisgICAgYm9vbGVhbiBnZXRIaWRkZW4oKQorfQorCisvKioKKyAqIFRocm93biB0byBpbmRpY2F0ZSBhIHByb2JsZW0gd2l0aCBjb21tYW5kIGV4ZWN1dGlvbi4KKyAqCisgKiBAdmVyc2lvbiAkSWQkCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYXNvbkBwbGFuZXQ1Ny5jb20iPkphc29uIERpbGxvbjwvYT4KKyAqLworY2xhc3MgQ29tbWFuZEV4Y2VwdGlvbgorICAgIGV4dGVuZHMgRXhjZXB0aW9uCit7CisgICAgZmluYWwgQ29tbWFuZCBjb21tYW5kCisgICAgCisgICAgQ29tbWFuZEV4Y2VwdGlvbihmaW5hbCBDb21tYW5kIGNvbW1hbmQsIGZpbmFsIFN0cmluZyBtc2cpIHsKKyAgICAgICAgc3VwZXIobXNnKQorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IGNvbW1hbmQKKyAgICAgICAgCisgICAgICAgIHRoaXMuY29tbWFuZCA9IGNvbW1hbmQKKyAgICB9CisgICAgCisgICAgQ29tbWFuZEV4Y2VwdGlvbihmaW5hbCBDb21tYW5kIGNvbW1hbmQsIGZpbmFsIFN0cmluZyBtc2csIGZpbmFsIFRocm93YWJsZSBjYXVzZSkgeworICAgICAgICBzdXBlcihtc2csIGNhdXNlKQorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IGNvbW1hbmQKKyAgICAgICAgCisgICAgICAgIHRoaXMuY29tbWFuZCA9IGNvbW1hbmQKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvQ29tbWFuZEFsaWFzLmdyb292eSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL0NvbW1hbmRBbGlhcy5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI1YjE1MQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL0NvbW1hbmRBbGlhcy5ncm9vdnkKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbAorCisvKioKKyAqIFByb3ZpZGVzIHNpbXBsZSBjb21tYW5kIGFsaWFzaW5nLgorICoKKyAqIEB2ZXJzaW9uICRJZCQKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphc29uQHBsYW5ldDU3LmNvbSI+SmFzb24gRGlsbG9uPC9hPgorICovCitjbGFzcyBDb21tYW5kQWxpYXMKKyAgICBleHRlbmRzIENvbW1hbmRTdXBwb3J0Cit7CisgICAgZmluYWwgU3RyaW5nIHRhcmdldE5hbWUKKyAgICAKKyAgICBDb21tYW5kQWxpYXMoZmluYWwgU2hlbGwgc2hlbGwsIGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgc2hvcnRjdXQsIGZpbmFsIFN0cmluZyB0YXJnZXQpIHsKKyAgICAgICAgc3VwZXIoc2hlbGwsIG5hbWUsIHNob3J0Y3V0KQorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IHRhcmdldAorCisgICAgICAgIHRoaXMudGFyZ2V0TmFtZSA9IHRhcmdldAorICAgIH0KKyAgICAKKyAgICBDb21tYW5kIGdldFRhcmdldCgpIHsKKyAgICAgICAgZGVmIGNvbW1hbmQgPSByZWdpc3RyeVt0YXJnZXROYW1lXQorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IGNvbW1hbmQgIT0gbnVsbAorICAgICAgICAKKyAgICAgICAgcmV0dXJuIGNvbW1hbmQKKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIExpc3QgY3JlYXRlQ29tcGxldG9ycygpIHsKKyAgICAgICAgcmV0dXJuIHRhcmdldC5jcmVhdGVDb21wbGV0b3JzKCkKKyAgICB9CisgICAgCisgICAgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZXMuZm9ybWF0KCdpbmZvLmFsaWFzX3RvJywgdGFyZ2V0TmFtZSkKKyAgICB9CisKKyAgICBTdHJpbmcgZ2V0VXNhZ2UoKSB7CisgICAgICAgIHJldHVybiB0YXJnZXQudXNhZ2UKKyAgICB9CisgICAgCisgICAgU3RyaW5nIGdldEhlbHAoKSB7CisgICAgICAgIHJldHVybiB0YXJnZXQuaGVscAorICAgIH0KKyAgICAKKyAgICBib29sZWFuIGdldEhpZGRlbigpIHsKKyAgICAgICAgcmV0dXJuIHRhcmdldC5oaWRkZW4KKyAgICB9CisgICAgCisgICAgT2JqZWN0IGV4ZWN1dGUoZmluYWwgTGlzdCBhcmdzKSB7CisgICAgICAgIHRhcmdldC5leGVjdXRlKGFyZ3MpCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvQ29tbWFuZEFsaWFzLnByb3BlcnRpZXMgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9Db21tYW5kQWxpYXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTgzODgzCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvQ29tbWFuZEFsaWFzLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyMiBAQAorIworIyBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjCisjICRJZCQKKyMKKworaW5mby5hbGlhc190bz1BbGlhcyB0bzogQHxib2xkIHswfXwKKwpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvQ29tbWFuZFJlZ2lzdHJ5Lmdyb292eSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL0NvbW1hbmRSZWdpc3RyeS5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM4MTM0YwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL0NvbW1hbmRSZWdpc3RyeS5ncm9vdnkKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwudXRpbC5Mb2dnZXIKKworLyoqCisgKiBBIHJlZ2lzdHJ5IG9mIHNoZWxsIHtAbGluayBDb21tYW5kfSBpbnN0YW5jZXMgd2hpY2ggbWF5IGJlIGV4ZWN1dGVkLgorICoKKyAqIEB2ZXJzaW9uICRJZCQKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphc29uQHBsYW5ldDU3LmNvbSI+SmFzb24gRGlsbG9uPC9hPgorICovCitjbGFzcyBDb21tYW5kUmVnaXN0cnkKK3sKKyAgICBwcm90ZWN0ZWQgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlci5jcmVhdGUoQ29tbWFuZFJlZ2lzdHJ5LmNsYXNzKQorICAgIAorICAgIC8vCisgICAgLy8gVE9ETzogSG9vayB1cCBzdXBwb3J0IHNvIG9uZSBjYW4gZm9yIChjb21tYW5kIGluIHJlZ2lzdHJ5KSB7IH0KKyAgICAvLworICAgIAorICAgIC8qKiBBIGxpc3Qgb2YgYWxsIG9mIHRoZSByZWdpc3RlcmVkIGNvbW1hbmRzLiAqLworICAgIGZpbmFsIExpc3QgY29tbWFuZHMgPSBbXQorCisgICAgLyoqIEEgc2V0IG9mIGFsbCBvZiB0aGUgY29tbWFuZCBuYW1lcyBhbmQgc2hvcnRjdXRzIHRvIGVuc3VyZSB0aGV5IGFyZSB1bmlxdWUuICovCisgICAgcHJpdmF0ZSBmaW5hbCBTZXQgbmFtZXMgPSBuZXcgVHJlZVNldCgpCisgICAgCisgICAgQ29tbWFuZCByZWdpc3RlcihmaW5hbCBDb21tYW5kIGNvbW1hbmQpIHsKKyAgICAgICAgYXNzZXJ0IGNvbW1hbmQKKworICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgY29tbWFuZCBuYW1lIGFuZCBzaG9ydGN1dCBhcmUgdW5pcXVlCisgICAgICAgIGFzc2VydCAhbmFtZXMuY29udGFpbnMoY29tbWFuZC5uYW1lKSA6ICJEdXBsaWNhdGUgY29tYW1uZCBuYW1lOiAkY29tbWFuZC5uYW1lIgorICAgICAgICBuYW1lcyA8PCBjb21tYW5kLm5hbWUKKyAgICAgICAgCisgICAgICAgIGFzc2VydCAhbmFtZXMuY29udGFpbnMoY29tbWFuZC5zaG9ydGN1dCkgOiAiRHVwbGljYXRlIGNvbW1hbmQgc2hvcnRjdXQ6ICRjb21tYW5kLnNob3J0Y3V0IgorICAgICAgICBuYW1lcyA8PCBjb21tYW5kLnNob3J0Y3V0CisKKyAgICAgICAgLy8gSG9sZCBvbiB0byB0aGUgY29tbWFuZCBpbiBvcmRlcgorICAgICAgICBjb21tYW5kcyA8PCBjb21tYW5kCisgICAgICAgIAorICAgICAgICAvLyBIb29rdXAgY29udGV4dCBmb3IgYWxpYXMgY29tbWFuZHMKKyAgICAgICAgY29tbWFuZC5yZWdpc3RyeSA9IHRoaXMKKworICAgICAgICAvLyBBZGQgYW55IHN0YW5kYXJkIGFsaWFzZXMgZm9yIHRoZSBjb21tYW5kIGlmIGFueQorICAgICAgICBjb21tYW5kLmFsaWFzZXM/LmVhY2ggeyB0aGlzIDw8IGl0IH0KKyAgICAgICAgCisgICAgICAgIGlmIChsb2cuZGVidWdFbmFibGVkKSB7CisgICAgICAgICAgICBsb2cuZGVidWcoIlJlZ2lzdGVyZWQgY29tbWFuZDogJGNvbW1hbmQubmFtZSIpCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiBjb21tYW5kCisgICAgfQorCisgICAgZGVmIGxlZnRTaGlmdChmaW5hbCBDb21tYW5kIGNvbW1hbmQpIHsKKyAgICAgICAgcmV0dXJuIHJlZ2lzdGVyKGNvbW1hbmQpCisgICAgfQorICAgIAorICAgIENvbW1hbmQgZmluZChmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICBhc3NlcnQgbmFtZQorICAgICAgICAKKyAgICAgICAgZm9yIChjIGluIGNvbW1hbmRzKSB7CisgICAgICAgICAgICBpZiAobmFtZSBpbiBbIGMubmFtZSwgYy5zaG9ydGN1dCBdKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGMKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIG51bGwKKyAgICB9CisgICAgCisgICAgdm9pZCByZW1vdmUoZmluYWwgQ29tbWFuZCBjb21tYW5kKSB7CisgICAgICAgIGFzc2VydCBjb21tYW5kCisgICAgICAgIAorICAgICAgICBjb21tYW5kcy5yZW1vdmUoY29tbWFuZCkKKyAgICAgICAgCisgICAgICAgIG5hbWVzLnJlbW92ZShjb21tYW5kLm5hbWUpCisgICAgICAgIG5hbWVzLnJlbW92ZShjb21tYW5kLnNob3J0Y3V0KQorICAgICAgICAKKyAgICAgICAgaWYgKGxvZy5kZWJ1Z0VuYWJsZWQpIHsKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmVtb3ZlZCBjb21tYW5kOiAkY29tbWFuZC5uYW1lIikKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBMaXN0IGNvbW1hbmRzKCkgeworICAgICAgICByZXR1cm4gY29tbWFuZHMKKyAgICB9CisgICAgCisgICAgZGVmIGdldFByb3BlcnR5KGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiBmaW5kKG5hbWUpCisgICAgfQorICAgIAorICAgIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgeworICAgICAgICByZXR1cm4gY29tbWFuZHMoKS5pdGVyYXRvcigpCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL0NvbW1hbmRTdXBwb3J0Lmdyb292eSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL0NvbW1hbmRTdXBwb3J0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2I1ODkyCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvQ29tbWFuZFN1cHBvcnQuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTg1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsCisKK2ltcG9ydCBqbGluZS5Db21wbGV0b3IKK2ltcG9ydCBqbGluZS5OdWxsQ29tcGxldG9yCitpbXBvcnQgamxpbmUuQXJndW1lbnRDb21wbGV0b3IKK2ltcG9ydCBqbGluZS5IaXN0b3J5CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLnV0aWwuTWVzc2FnZVNvdXJjZQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwudXRpbC5Mb2dnZXIKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLnV0aWwuU2ltcGxlQ29tcGxldG9yCisKKy8qKgorICogU3VwcG9ydCBmb3Ige0BsaW5rIENvbW1hbmR9IGluc3RhbmNlcy4KKyAqCisgKiBAdmVyc2lvbiAkSWQkCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYXNvbkBwbGFuZXQ1Ny5jb20iPkphc29uIERpbGxvbjwvYT4KKyAqLworYWJzdHJhY3QgY2xhc3MgQ29tbWFuZFN1cHBvcnQKKyAgICBpbXBsZW1lbnRzIENvbW1hbmQKK3sKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBORVdMSU5FID0gU3lzdGVtLnByb3BlcnRpZXNbJ2xpbmUuc2VwYXJhdG9yJ10KKyAgICAKKyAgICAvKiogSW5zdGFuY2UgbG9nZ2VyIGZvciB0aGUgY29tbWFuZCwgaW5pdGlhbGl6ZWQgbGF0ZSB0byBpbmNsdWRlIHRoZSBjb21tYW5kIG5hbWUuICovCisgICAgcHJvdGVjdGVkIGZpbmFsIExvZ2dlciBsb2cKKworICAgIC8qKiBpMThuIG1lc3NhZ2Ugc291cmNlIGZvciB0aGUgY29tbWFuZC4gKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgTWVzc2FnZVNvdXJjZSBtZXNzYWdlcyA9IG5ldyBNZXNzYWdlU291cmNlKHRoaXMuY2xhc3MsIENvbW1hbmRTdXBwb3J0LmNsYXNzKQorCisgICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBjb21tYW5kLiAqLworICAgIGZpbmFsIFN0cmluZyBuYW1lCisKKyAgICAvKiogVGhlIHNob3J0Y3V0IHN3aXRjaCAqLworICAgIGZpbmFsIFN0cmluZyBzaG9ydGN1dAorICAgIAorICAgIC8qKiBUaGUgb3duaW5nIHNoZWxsLiAqLworICAgIHByb3RlY3RlZCBmaW5hbCBTaGVsbCBzaGVsbAorCisgICAgLyoqIFRoZSBJL08gY29udGFpbmVyIGZvciB0aGUgY29tbWFuZCB0byBzcGl0IHN0dWZmIG91dC4gKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgSU8gaW8KKworICAgIC8qKiBQcm92aWRlcyB0aGUgY29tbWFuZCBpbnN0YW5jZSB3aXRoIHRoZSByZWdpc3RyeSwgZm9yIGFsaWFzaW5nIHN1cHBvcnQuICovCisgICAgcHJvdGVjdGVkIENvbW1hbmRSZWdpc3RyeSByZWdpc3RyeQorICAgIAorICAgIC8qKiBTdGFuZGFyZCBhbGlhc2VzIGZvciB0aGUgY29tbWFuZC4gKi8KKyAgICBmaW5hbCBMaXN0Lyo8Q29tbWFuZEFsaWFzPiovIGFsaWFzZXMgPSBbXQorICAgIAorICAgIC8qKiBGbGFnIHRvIGluZGljYXRlIGlmIHRoZSBjb21tYW5kIHNob3VsZCBiZSBoaWRkZW4gb3Igbm90LiAqLworICAgIGJvb2xlYW4gaGlkZGVuID0gZmFsc2UKKyAgICAKKyAgICBwcm90ZWN0ZWQgQ29tbWFuZFN1cHBvcnQoZmluYWwgU2hlbGwgc2hlbGwsIGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgc2hvcnRjdXQpIHsKKyAgICAgICAgYXNzZXJ0IHNoZWxsCisgICAgICAgIGFzc2VydCBuYW1lCisgICAgICAgIGFzc2VydCBzaG9ydGN1dAorICAgICAgICAKKyAgICAgICAgdGhpcy5sb2cgPSBMb2dnZXIuY3JlYXRlKHRoaXMuY2xhc3MsIG5hbWUpCisgICAgICAgIHRoaXMuc2hlbGwgPSBzaGVsbAorICAgICAgICB0aGlzLmlvID0gc2hlbGwuaW8KKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZQorICAgICAgICB0aGlzLnNob3J0Y3V0ID0gc2hvcnRjdXQKKyAgICAgICAgCisgICAgICAgIC8vCisgICAgICAgIC8vIE5PVEU6IFJlZ2lzdHJ5IHdpbGwgYmUgYWRkZWQgb25jZSByZWdpc3RlcmVkLgorICAgICAgICAvLworICAgIH0KKworICAgIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VzWydjb21tYW5kLmRlc2NyaXB0aW9uJ10KKyAgICB9CisKKyAgICBTdHJpbmcgZ2V0VXNhZ2UoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlc1snY29tbWFuZC51c2FnZSddCisgICAgfQorCisgICAgU3RyaW5nIGdldEhlbHAoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlc1snY29tbWFuZC5oZWxwJ10KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZSB0byBwcm92aWRlIGN1c3RvbSBjb21wbGV0aW9uIHNlbWFudGljcyBmb3IgdGhlIGNvbW1hbmQuCisgICAgICovCisgICAgcHJvdGVjdGVkIExpc3QgY3JlYXRlQ29tcGxldG9ycygpIHsKKyAgICAgICAgcmV0dXJuIG51bGwKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXR1cCB0aGUgY29tcGxldG9yIGZvciB0aGUgY29tbWFuZC4KKyAgICAgKi8KKyAgICBDb21wbGV0b3IgZ2V0Q29tcGxldG9yKCkgeworICAgICAgICBpZiAoaGlkZGVuKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbAorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBkZWYgbGlzdCA9IFsgbmV3IFNpbXBsZUNvbXBsZXRvcihuYW1lLCBzaG9ydGN1dCkgXQorCisgICAgICAgIGRlZiBjb21wbGV0b3JzID0gY3JlYXRlQ29tcGxldG9ycygpCisgICAgICAgIAorICAgICAgICBpZiAoY29tcGxldG9ycykgeworICAgICAgICAgICAgY29tcGxldG9ycy5lYWNoIHsKKyAgICAgICAgICAgICAgICBpZiAoaXQpIHsKKyAgICAgICAgICAgICAgICAgICAgbGlzdCA8PCBpdAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbGlzdCA8PCBuZXcgTnVsbENvbXBsZXRvcigpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbGlzdCA8PCBuZXcgTnVsbENvbXBsZXRvcigpCisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV3IEFyZ3VtZW50Q29tcGxldG9yKGxpc3QpCisgICAgfQorICAgIAorICAgIC8vCisgICAgLy8gSGVscGVycworICAgIC8vCisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhbGlhcyhmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIHNob3J0Y3V0KSB7CisgICAgICAgIGFsaWFzZXMgPDwgbmV3IENvbW1hbmRBbGlhcyhzaGVsbCwgbmFtZSwgc2hvcnRjdXQsIHRoaXMubmFtZSkKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBmYWlsKGZpbmFsIFN0cmluZyBtc2cpIHsKKyAgICAgICAgdGhyb3cgbmV3IENvbW1hbmRFeGNlcHRpb24odGhpcywgbXNnKQorICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgdm9pZCBmYWlsKGZpbmFsIFN0cmluZyBtc2csIGZpbmFsIFRocm93YWJsZSBjYXVzZSkgeworICAgICAgICB0aHJvdyBuZXcgQ29tbWFuZEV4Y2VwdGlvbih0aGlzLCBtc2csIGNhdXNlKQorICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnROb0FyZ3VtZW50cyhmaW5hbCBMaXN0IGFyZ3MpIHsKKyAgICAgICAgYXNzZXJ0IGFyZ3MgIT0gbnVsbAorICAgICAgICAKKyAgICAgICAgaWYgKGFyZ3Muc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgZmFpbChtZXNzYWdlcy5mb3JtYXQoJ2Vycm9yLnVuZXhwZWN0ZWRfYXJncycsIGFyZ3Muam9pbignICcpKSkKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvLworICAgIC8vIFNoZWxsIGFjY2VzcyBoZWxwZXJzCisgICAgLy8KKworICAgIHByb3RlY3RlZCBCdWZmZXJNYW5hZ2VyIGdldEJ1ZmZlcnMoKSB7CisgICAgICAgIHJldHVybiBzaGVsbC5idWZmZXJzCisgICAgfQorCisgICAgcHJvdGVjdGVkIExpc3QgZ2V0QnVmZmVyKCkgeworICAgICAgICByZXR1cm4gc2hlbGwuYnVmZmVycy5jdXJyZW50KCkKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgTGlzdCBnZXRJbXBvcnRzKCkgeworICAgICAgICByZXR1cm4gc2hlbGwuaW1wb3J0cworICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgQmluZGluZyBnZXRCaW5kaW5nKCkgeworICAgICAgICByZXR1cm4gc2hlbGwuaW50ZXJwLmNvbnRleHQKKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIE1hcCBnZXRWYXJpYWJsZXMoKSB7CisgICAgICAgIHJldHVybiBiaW5kaW5nLnZhcmlhYmxlcworICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgSGlzdG9yeSBnZXRIaXN0b3J5KCkgeworICAgICAgICByZXR1cm4gc2hlbGwuaGlzdG9yeQorICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgR3Jvb3Z5Q2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXIoKSB7CisgICAgICAgIHJldHVybiBzaGVsbC5pbnRlcnAuY2xhc3NMb2FkZXIKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvQ29tbWFuZFN1cHBvcnQucHJvcGVydGllcyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL0NvbW1hbmRTdXBwb3J0LnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRlNjQ0MQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL0NvbW1hbmRTdXBwb3J0LnByb3BlcnRpZXMKQEAgLTAsMCArMSwyMiBAQAorIworIyBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjCisjICRJZCQKKyMKKworZXJyb3IudW5leHBlY3RlZF9hcmdzPVVuZXhwZWN0ZWQgYXJndW1lbnRzOiB7MH0KKwpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvQ29tcGxleENvbW1hbmRTdXBwb3J0Lmdyb292eSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL0NvbXBsZXhDb21tYW5kU3VwcG9ydC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU5MWQ0MwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL0NvbXBsZXhDb21tYW5kU3VwcG9ydC5ncm9vdnkKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwudXRpbC5TaW1wbGVDb21wbGV0b3IKKworLyoqCisgKiBTdXBwb3J0IGZvciBtb3JlIGNvbXBsZXggY29tbWFuZHMuCisgKgorICogQHZlcnNpb24gJElkJAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFzb25AcGxhbmV0NTcuY29tIj5KYXNvbiBEaWxsb248L2E+CisgKi8KK2Fic3RyYWN0IGNsYXNzIENvbXBsZXhDb21tYW5kU3VwcG9ydAorICAgIGV4dGVuZHMgQ29tbWFuZFN1cHBvcnQKK3sKKyAgICBwcm90ZWN0ZWQgTGlzdC8qPFN0cmluZz4qLyBmdW5jdGlvbnMKKyAgICAKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRGdW5jdGlvbgorICAgIAorICAgIENvbXBsZXhDb21tYW5kU3VwcG9ydChmaW5hbCBTaGVsbCBzaGVsbCwgZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFN0cmluZyBzaG9ydGN1dCkgeworICAgICAgICBzdXBlcihzaGVsbCwgbmFtZSwgc2hvcnRjdXQpCisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCBMaXN0IGNyZWF0ZUNvbXBsZXRvcnMoKSB7CisgICAgICAgIGRlZiBjID0gbmV3IFNpbXBsZUNvbXBsZXRvcigpCisgICAgICAgIAorICAgICAgICBmdW5jdGlvbnMuZWFjaCB7IGMuYWRkKGl0KSB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gWyBjLCBudWxsIF0KKyAgICB9CisgICAgCisgICAgT2JqZWN0IGV4ZWN1dGUoTGlzdCBhcmdzKSB7CisgICAgICAgIGFzc2VydCBhcmdzICE9IG51bGwKKyAgICAgICAgCisgICAgICAgIGlmIChhcmdzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAoZGVmYXVsdEZ1bmN0aW9uKSB7CisgICAgICAgICAgICAgICAgYXJncyA9IFsgZGVmYXVsdEZ1bmN0aW9uIF0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGZhaWwoIkNvbW1hbmQgJyRuYW1lJyByZXF1aXJlcyBhdCBsZWFzdCBvbmUgYXJndW1lbnQiKQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gZXhlY3V0ZUZ1bmN0aW9uKGFyZ3MpCisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCBleGVjdXRlRnVuY3Rpb24oTGlzdCBhcmdzKSB7CisgICAgICAgIGFzc2VydCBhcmdzICE9IG51bGwKKyAgICAgICAgCisgICAgICAgIGFzc2VydCBmdW5jdGlvbnMKKyAgICAgICAgCisgICAgICAgIGRlZiBmbmFtZSA9IGFyZ3NbMF0KKyAgICAgICAgCisgICAgICAgIGlmIChhcmdzLnNpemUoKSA+IDEpIHsKKyAgICAgICAgICAgIGFyZ3MgPSBhcmdzWzEuLi0xXQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgYXJncyA9IFtdCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChmbmFtZSBpbiBmdW5jdGlvbnMpIHsKKyAgICAgICAgICAgIGRlZiBmdW5jID0gbG9hZEZ1bmN0aW9uKGZuYW1lKQorICAgICAgICAgICAgCisgICAgICAgICAgICBsb2cuZGVidWcoIkludm9raW5nIGZ1bmN0aW9uICckZm5hbWUnIHcvYXJnczogJGFyZ3MiKQorICAgICAgICAgICAgCisgICAgICAgICAgICByZXR1cm4gZnVuYy5jYWxsKGFyZ3MpCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBmYWlsKCJVbmtub3duIGZ1bmN0aW9uIG5hbWU6ICRmbmFtZSIpCisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIENsb3N1cmUgbG9hZEZ1bmN0aW9uKGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIGFzc2VydCBuYW1lCisgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMuImRvXyR7bmFtZX0iCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKE1pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJGYWlsZWQgdG8gbG9hZCBkZWxnYXRlIGZ1bmN0aW9uOiAkZSIpCisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgZGVmIGRvX2FsbCA9IHsKKyAgICAgICAgZnVuY3Rpb25zLmVhY2ggeyBmbmFtZSAtPgorICAgICAgICAgICAgaWYgKGZuYW1lICE9ICdhbGwnKSB7CisgICAgICAgICAgICAgICAgZXhlY3V0ZUZ1bmN0aW9uKFsgZm5hbWUgXSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvRXhpdE5vdGlmaWNhdGlvbi5ncm9vdnkgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9FeGl0Tm90aWZpY2F0aW9uLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWNiM2QyCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvRXhpdE5vdGlmaWNhdGlvbi5ncm9vdnkKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbAorCisvKioKKyAqIE5vdGlmaWNhdGlvbiB0byBzaWduYWwgdGhlIHNoZWxsIHRvIGV4aXQuCisgKgorICogQHZlcnNpb24gJElkJAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFzb25AcGxhbmV0NTcuY29tIj5KYXNvbiBEaWxsb248L2E+CisgKi8KK2NsYXNzIEV4aXROb3RpZmljYXRpb24KKyAgICBleHRlbmRzIEVycm9yCit7CisgICAgLyoqIFRoZSBleGl0IGNvZGUuICovCisgICAgZmluYWwgaW50IGNvZGUKKworICAgIEV4aXROb3RpZmljYXRpb24oZmluYWwgaW50IGNvZGUpIHsKKyAgICAgICAgdGhpcy5jb2RlID0gY29kZQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9Hcm9vdnlzaC5ncm9vdnkgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9Hcm9vdnlzaC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAyNjIzNQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL0dyb292eXNoLmdyb292eQpAQCAtMCwwICsxLDYwMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbAorCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kCisKK2ltcG9ydCBqbGluZS5UZXJtaW5hbAoraW1wb3J0IGpsaW5lLkhpc3RvcnkKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5JbnZva2VySGVscGVyCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLk1ldGhvZENsb3N1cmUKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5Tb3VyY2VVbml0CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLkNvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uCisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLnV0aWwuTWVzc2FnZVNvdXJjZQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwudXRpbC5BTlNJLlJlbmRlcmVyIGFzIEFuc2lSZW5kZXJlcgoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwudXRpbC5YbWxDb21tYW5kUmVnaXN0cmFyCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLlN0YWNrVHJhY2VVdGlscworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwudXRpbC5QcmVmZXJlbmNlcworCisvKioKKyAqIEFuIGludGVyYWN0aXZlIHNoZWxsIGZvciBldmFsdWF0aW5nIEdyb292eSBjb2RlIGZyb20gdGhlIGNvbW1hbmQtbGluZSAoYWthLiBncm9vdnlzaCkuCisgKgorICogQHZlcnNpb24gJElkJAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFzb25AcGxhbmV0NTcuY29tIj5KYXNvbiBEaWxsb248L2E+CisgKi8KK2NsYXNzIEdyb292eXNoCisgICAgZXh0ZW5kcyBTaGVsbAoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBORVdMSU5FID0gU3lzdGVtLnByb3BlcnRpZXNbJ2xpbmUuc2VwYXJhdG9yJ10KKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZXNzYWdlU291cmNlIG1lc3NhZ2VzID0gbmV3IE1lc3NhZ2VTb3VyY2UoR3Jvb3Z5c2guY2xhc3MpCisKKyAgICBwcml2YXRlIGZpbmFsIEJ1ZmZlck1hbmFnZXIgYnVmZmVycyA9IG5ldyBCdWZmZXJNYW5hZ2VyKCkKKworICAgIHByaXZhdGUgZmluYWwgR3Jvb3Z5U2hlbGwgaW50ZXJwCisgICAgCisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0IGltcG9ydHMgPSBbXQorICAgIAorICAgIHByaXZhdGUgSW50ZXJhY3RpdmVTaGVsbFJ1bm5lciBydW5uZXIKKyAgICAKKyAgICBwcml2YXRlIEhpc3RvcnkgaGlzdG9yeQorICAgIAorICAgIEdyb292eXNoKGZpbmFsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyLCBmaW5hbCBCaW5kaW5nIGJpbmRpbmcsIGZpbmFsIElPIGlvKSB7CisgICAgICAgIHN1cGVyKGlvKQorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IGNsYXNzTG9hZGVyCisgICAgICAgIGFzc2VydCBiaW5kaW5nCisgICAgICAgIAorICAgICAgICBpbnRlcnAgPSBuZXcgR3Jvb3Z5U2hlbGwoY2xhc3NMb2FkZXIsIGJpbmRpbmcpCisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVE9ETzogQ2hhbmdlIHRoaXMgdG8gYmUgbW9yZSBlbWJlZC90ZXN0IGZyaWVuZGx5CisgICAgICAgIC8vCisgICAgICAgIAorICAgICAgICBkZWYgcmVnaXN0cmFyID0gbmV3IFhtbENvbW1hbmRSZWdpc3RyYXIodGhpcywgY2xhc3NMb2FkZXIpCisgICAgICAgIHJlZ2lzdHJhci5yZWdpc3RlcihnZXRDbGFzcygpLmdldFJlc291cmNlKCdjb21tYW5kcy54bWwnKSkKKyAgICB9CisKKyAgICBHcm9vdnlzaChmaW5hbCBCaW5kaW5nIGJpbmRpbmcsIGZpbmFsIElPIGlvKSB7CisgICAgICAgIHRoaXMoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5jb250ZXh0Q2xhc3NMb2FkZXIsIGJpbmRpbmcsIGlvKQorICAgIH0KKworICAgIEdyb292eXNoKGZpbmFsIElPIGlvKSB7CisgICAgICAgIHRoaXMobmV3IEJpbmRpbmcoKSwgaW8pCisgICAgfQorICAgIAorICAgIEdyb292eXNoKCkgeworICAgICAgICB0aGlzKG5ldyBJTygpKQorICAgIH0KKworICAgIC8vCisgICAgLy8gRXhlY3V0aW9uCisgICAgLy8KKworICAgIC8qKgorICAgICAqIEV4ZWN1dGUgYSBzaW5nbGUgbGluZSwgd2hlcmUgdGhlIGxpbmUgbWF5IGJlIGEgY29tbWFuZCBvciBHcm9vdnkgY29kZSAoY29tcGxldGUgb3IgaW5jb21wbGV0ZSkuCisgICAgICovCisgICAgT2JqZWN0IGV4ZWN1dGUoZmluYWwgU3RyaW5nIGxpbmUpIHsKKyAgICAgICAgYXNzZXJ0IGxpbmUgIT0gbnVsbAorICAgICAgICAKKyAgICAgICAgLy8gSWdub3JlIGVtcHR5IGxpbmVzCisgICAgICAgIGlmIChsaW5lLnRyaW0oKS5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGwKKyAgICAgICAgfQorCisgICAgICAgIG1heWJlUmVjb3JkSW5wdXQobGluZSkKKworICAgICAgICBkZWYgcmVzdWx0CisgICAgICAgIAorICAgICAgICAvLyBGaXJzdCB0cnkgbm9ybWFsIGNvbW1hbmQgZXhlY3V0aW9uCisgICAgICAgIGlmIChpc0V4ZWN1dGFibGUobGluZSkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGV4ZWN1dGVDb21tYW5kKGxpbmUpCisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIEZvciBjb21tYW5kcywgb25seSBzZXQgdGhlIGxhc3QgcmVzdWx0IHdoZW4gaXRzIG5vbi1udWxsL3RydWUKKyAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKKyAgICAgICAgICAgICAgICBsYXN0UmVzdWx0ID0gcmVzdWx0CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gT3RoZXJ3aXNlIHRyZWF0IHRoZSBsaW5lIGFzIEdyb292eQorICAgICAgICBkZWYgY3VycmVudCA9IFtdCisgICAgICAgIGN1cnJlbnQgKz0gYnVmZmVycy5jdXJyZW50KCkKKworICAgICAgICAvLyBBcHBlbmQgdGhlIGxpbmUgdG8gdGhlIGN1cnJlbnQgYnVmZmVyCisgICAgICAgIGN1cnJlbnQgPDwgbGluZQorCisgICAgICAgIC8vIEF0dGVtcHQgdG8gcGFyc2UgdGhlIGN1cnJlbnQgYnVmZmVyCisgICAgICAgIGRlZiBzdGF0dXMgPSBwYXJzZShjdXJyZW50LCAxKQorCisgICAgICAgIHN3aXRjaCAoc3RhdHVzLmNvZGUpIHsKKyAgICAgICAgICAgIGNhc2UgUGFyc2VDb2RlLkNPTVBMRVRFOgorICAgICAgICAgICAgICAgIC8vIEV2YWx1YXRlIHRoZSBjdXJyZW50IGJ1ZmZlcgorICAgICAgICAgICAgICAgIGxhc3RSZXN1bHQgPSByZXN1bHQgPSBldmFsdWF0ZShjdXJyZW50KQorICAgICAgICAgICAgICAgIGJ1ZmZlcnMuY2xlYXJTZWxlY3RlZCgpCisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAgICAgY2FzZSBQYXJzZUNvZGUuSU5DT01QTEVURToKKyAgICAgICAgICAgICAgICAvLyBTYXZlIHRoZSBjdXJyZW50IGJ1ZmZlciBzbyB1c2VyIGNhbiBidWlsZCB1cCBjb21wbGV4IG11bGktbGluZSBjb2RlIGJsb2NrcworICAgICAgICAgICAgICAgIGJ1ZmZlcnMudXBkYXRlU2VsZWN0ZWQoY3VycmVudCkKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICAgICBjYXNlIFBhcnNlQ29kZS5FUlJPUjoKKyAgICAgICAgICAgICAgICB0aHJvdyBzdGF0dXMuY2F1c2UKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAvLyBTaG91bGQgbmV2ZXIgaGFwcGVuCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHBhcnNlIHN0YXR1czogJHN0YXR1cy5jb2RlIikKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgIH0KKworICAgIHByb3RlY3RlZCBPYmplY3QgZXhlY3V0ZUNvbW1hbmQoZmluYWwgU3RyaW5nIGxpbmUpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmV4ZWN1dGUobGluZSkKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBdHRlbXB0IHRvIHBhcnNlIHRoZSBnaXZlbiBidWZmZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBQYXJzZVN0YXR1cyBwYXJzZShmaW5hbCBMaXN0IGJ1ZmZlciwgZmluYWwgaW50IHRvbGVyYW5jZSkgeworICAgICAgICBhc3NlcnQgYnVmZmVyCisKKyAgICAgICAgU3RyaW5nIHNvdXJjZSA9IChpbXBvcnRzICsgYnVmZmVyKS5qb2luKE5FV0xJTkUpCisKKyAgICAgICAgbG9nLmRlYnVnKCJQYXJzaW5nOiAkc291cmNlIikKKworICAgICAgICBTb3VyY2VVbml0IHBhcnNlcgorICAgICAgICBUaHJvd2FibGUgZXJyb3IKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcGFyc2VyID0gU291cmNlVW5pdC5jcmVhdGUoJ2dyb292eXNoX3BhcnNlJywgc291cmNlLCB0b2xlcmFuY2UpCisgICAgICAgICAgICBwYXJzZXIucGFyc2UoKQorCisgICAgICAgICAgICBsb2cuZGVidWcoJ1BhcnNlIGNvbXBsZXRlJykKKworICAgICAgICAgICAgcmV0dXJuIG5ldyBQYXJzZVN0YXR1cyhQYXJzZUNvZGUuQ09NUExFVEUpCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBGSVhNRTogU2VlbXMgbGlrZSBmYWlsZWRXaXRoVW5leHBlY3RlZEVPRigpIGlzIG5vdCBhbHdheXMgc2V0IGFzIGV4cGVjdGVkLCBhcyBpbjoKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBjbGFzcyBhIHsgICAgICAgICAgICAgICA8LS0tIGlzIHRydWUgaGVyZQorICAgICAgICAgICAgLy8gICAgZGVmIGIoKSB7ICAgICAgICAgICAgPC0tLSBpcyBmYWxzZSBoZXJlIDotKAorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKHBhcnNlci5lcnJvckNvbGxlY3Rvci5lcnJvckNvdW50ID4gMSB8fCAhcGFyc2VyLmZhaWxlZFdpdGhVbmV4cGVjdGVkRU9GKCkpIHsKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIEhBQ0s6IFN1cGVyIGluc2FuZSBoYWNrLi4uIGlmIHdlIGRldGVjdCBhIHN5bnRheCBlcnJvciwgYnV0IHRoZSBsYXN0IGxpbmUgb2YgdGhlCisgICAgICAgICAgICAgICAgLy8gICAgICAgYnVmZmVyIGVuZHMgd2l0aCBhICd7JyBvciAnWycgdGhlbiBpZ25vcmUuLi4gYW5kIHByZXRlbmQgaXRzIG9rYXksIGNhdXNlIGl0IG1pZ2h0IGJlLi4uCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyAgICAgICBUaGlzIHNlZW1zIHRvIGdldCBhcm91bmQgdGhlIHByb2JsZW0gd2l0aCB0aGluZ3MgbGlrZToKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vICAgICAgIGNsYXNzIGEgeyBkZWYgYigpIHsKKyAgICAgICAgICAgICAgICAvLworCisgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlclstMV0udHJpbSgpLmVuZHNXaXRoKCd7JykpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlLCB0aGlzIGJsb3dzCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ1ZmZlclstMV0udHJpbSgpLmVuZHNXaXRoKCdbJykpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlLCB0aGlzIGJsb3dzCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICBlcnJvciA9IGUKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlcnJvcikgeworICAgICAgICAgICAgbG9nLmRlYnVnKCJQYXJzZSBlcnJvcjogJGVycm9yIikKKworICAgICAgICAgICAgcmV0dXJuIG5ldyBQYXJzZVN0YXR1cyhlcnJvcikKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygnUGFyc2UgaW5jb21wbGV0ZScpCisKKyAgICAgICAgICAgIHJldHVybiBuZXcgUGFyc2VTdGF0dXMoUGFyc2VDb2RlLklOQ09NUExFVEUpCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZBTF9TQ1JJUFRfRklMRU5BTUUgPSAnZ3Jvb3Z5c2hfZXZhbHVhdGUnCisKKyAgICAvKioKKyAgICAgKiBFdmFsdWF0ZSB0aGUgZ2l2ZW4gYnVmZmVyLiAgVGhlIGJ1ZmZlciBpcyBhc3N1bWVkIHRvIGJlIGNvbXBsZXRlLgorICAgICAqLworICAgIHByaXZhdGUgT2JqZWN0IGV2YWx1YXRlKGZpbmFsIExpc3QgYnVmZmVyKSB7CisgICAgICAgIGFzc2VydCBidWZmZXIKKyAgICAgICAgCisgICAgICAgIGxvZy5kZWJ1ZygiRXZhbHVhdGluZyBidWZmZXIuLi4iKQorCisgICAgICAgIGlmIChpby52ZXJib3NlKSB7CisgICAgICAgICAgICBkaXNwbGF5QnVmZmVyKGJ1ZmZlcikKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIEhBQ0s6IEZpeCBmb3IgR1JPT1ZZLTIyMTMuICBJbnNlcnQgYSBydW5uYWJsZSBzdGF0ZW1lbnQgKGllLiAndHJ1ZScpIGFmdGVyIGltcG9ydHMgc28gdGhhdCB3ZSBjYW4KKyAgICAgICAgLy8gICAgICAgYWx3YXlzIHJ1biB0aGUgYnVmZmVyIGFuZCBnZXQgYW55IGNsYXNzL2VudW0vd2hhdGV2ZXIgZGVmcyBkZWZpbmVkLgorICAgICAgICAvLworCisgICAgICAgIGRlZiBzb3VyY2UgPSAoaW1wb3J0cyArIFsgJ3RydWUnIF0gKyBidWZmZXIpLmpvaW4oTkVXTElORSkKKyAgICAgICAgZGVmIHJlc3VsdAorCisgICAgICAgIENsYXNzIHR5cGUKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFNjcmlwdCBzY3JpcHQgPSBpbnRlcnAucGFyc2Uoc291cmNlLCBFVkFMX1NDUklQVF9GSUxFTkFNRSkKKyAgICAgICAgICAgIHR5cGUgPSBzY3JpcHQuZ2V0Q2xhc3MoKQorCisgICAgICAgICAgICBsb2cuZGVidWcoIkNvbXBpbGVkIHNjcmlwdDogJHNjcmlwdCIpCisKKyAgICAgICAgICAgIGlmICh0eXBlLmRlY2xhcmVkTWV0aG9kcy5hbnkgeyBpdC5uYW1lID09ICdtYWluJyB9KSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gc2NyaXB0LnJ1bigpCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIE5lZWQgdG8gdXNlIFN0cmluZy52YWx1ZU9mKCkgaGVyZSB0byBhdm9pZCBpY2t5IGV4Y2VwdGlvbnMgY2F1c2VzIGJ5IEdTdHJpbmcgY29lcmNpb24KKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiRXZhbHVhdGlvbiByZXN1bHQ6ICR7U3RyaW5nLnZhbHVlT2YocmVzdWx0KX0gKCR7cmVzdWx0Py5nZXRDbGFzcygpfSkiKQorCisgICAgICAgICAgICAvLyBLZWVwIG9ubHkgdGhlIG1ldGhvZHMgdGhhdCBoYXZlIGJlZW4gZGVmaW5lZCBpbiB0aGUgc2NyaXB0CisgICAgICAgICAgICB0eXBlLmRlY2xhcmVkTWV0aG9kcy5lYWNoIHsgTWV0aG9kIG0gLT4KKyAgICAgICAgICAgICAgICBpZiAoIShtLm5hbWUgaW4gWyAnbWFpbicsICdydW4nIF0gfHwgbS5uYW1lLnN0YXJ0c1dpdGgoJ3N1cGVyJCcpIHx8IG0ubmFtZS5zdGFydHNXaXRoKCdjbGFzcyQnKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJTYXZpbmcgbWV0aG9kIGRlZmluaXRpb246ICRtIikKKyAgICAgICAgICAgICAgICAgICAgaW50ZXJwLmNvbnRleHRbIiR7bS5uYW1lfSJdID0gbmV3IE1ldGhvZENsb3N1cmUodHlwZS5uZXdJbnN0YW5jZSgpLCBtLm5hbWUpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICAgICAgZGVmIGNhY2hlID0gaW50ZXJwLmNsYXNzTG9hZGVyLmNsYXNzQ2FjaGUKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBzY3JpcHQgY2xhc3MgZ2VuZXJhdGVkCisgICAgICAgICAgICBjYWNoZS5yZW1vdmUodHlwZT8ubmFtZSkKKworICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBpbmxpbmUgY2xvc3VyZXMgZnJvbSB0aGUgY2FjaGUgYXMgd2VsbAorICAgICAgICAgICAgY2FjaGUucmVtb3ZlKCckX3J1bl9jbG9zdXJlJykKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgIH0KKworICAgIC8qKgorICAgICAqIERpc3BsYXkgdGhlIGdpdmVuIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZGlzcGxheUJ1ZmZlcihmaW5hbCBMaXN0IGJ1ZmZlcikgeworICAgICAgICBhc3NlcnQgYnVmZmVyCisKKyAgICAgICAgYnVmZmVyLmVhY2hXaXRoSW5kZXggeyBsaW5lLCBpbmRleCAtPgorICAgICAgICAgICAgZGVmIGxpbmVOdW0gPSBmb3JtYXRMaW5lTnVtYmVyKGluZGV4ICsgMSkKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaW8ub3V0LnByaW50bG4oIiAke2xpbmVOdW19QHxib2xkID58ICRsaW5lIikKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vCisgICAgLy8gUHJvbXB0CisgICAgLy8KKworICAgIHByaXZhdGUgQW5zaVJlbmRlcmVyIHByb21wdCA9IG5ldyBBbnNpUmVuZGVyZXIoKQorCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVuZGVyUHJvbXB0KCkgeworICAgICAgICBkZWYgbGluZU51bSA9IGZvcm1hdExpbmVOdW1iZXIoYnVmZmVycy5jdXJyZW50KCkuc2l6ZSgpKQorCisgICAgICAgIHJldHVybiBwcm9tcHQucmVuZGVyKCJAfGJvbGQgZ3Jvb3Z5Onwke2xpbmVOdW19QHxib2xkID58ICIpCisgICAgfQorCisgICAgLyoqCisgICAgICogRm9ybWF0IHRoZSBnaXZlbiBudW1iZXIgc3VpdGFibGUgZm9yIHJlbmRlcmluZyBhcyBhIGxpbmUgbnVtYmVyIGNvbHVtbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBmb3JtYXRMaW5lTnVtYmVyKGZpbmFsIGludCBudW0pIHsKKyAgICAgICAgYXNzZXJ0IG51bSA+PSAwCisKKyAgICAgICAgLy8gTWFrZSBhICUwM2QtbGlrZSBzdHJpbmcgZm9yIHRoZSBsaW5lIG51bWJlcgorICAgICAgICByZXR1cm4gbnVtLnRvU3RyaW5nKCkucGFkTGVmdCgzLCAnMCcpCisgICAgfQorCisgICAgLy8KKyAgICAvLyBVc2VyIFByb2ZpbGUgU2NyaXB0cworICAgIC8vCisKKyAgICBGaWxlIGdldFVzZXJTdGF0ZURpcmVjdG9yeSgpIHsKKyAgICAgICAgZGVmIHVzZXJIb21lID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCd1c2VyLmhvbWUnKSkKKyAgICAgICAgZGVmIGRpciA9IG5ldyBGaWxlKHVzZXJIb21lLCAnLmdyb292eScpCisgICAgICAgIHJldHVybiBkaXIuY2Fub25pY2FsRmlsZQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBsb2FkVXNlclNjcmlwdChmaW5hbCBTdHJpbmcgZmlsZW5hbWUpIHsKKyAgICAgICAgYXNzZXJ0IGZpbGVuYW1lCisgICAgICAgIAorICAgICAgICBkZWYgZmlsZSA9IG5ldyBGaWxlKHVzZXJTdGF0ZURpcmVjdG9yeSwgZmlsZW5hbWUpCisgICAgICAgIAorICAgICAgICBpZiAoZmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgZGVmIGNvbW1hbmQgPSByZWdpc3RyeVsnbG9hZCddCisKKyAgICAgICAgICAgIGlmIChjb21tYW5kKSB7CisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJMb2FkaW5nIHVzZXItc2NyaXB0OiAkZmlsZSIpCisKKyAgICAgICAgICAgICAgICAvLyBEaXNhYmxlIHNob3dMYXN0UmVzdWx0IGZvciBwcm9maWxlIHNjcmlwdHMKKyAgICAgICAgICAgICAgICBib29sZWFuIHRtcCA9IFByZWZlcmVuY2VzLnNob3dMYXN0UmVzdWx0CisgICAgICAgICAgICAgICAgUHJlZmVyZW5jZXMuc2hvd0xhc3RSZXN1bHQgPSBmYWxzZQorCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY29tbWFuZC5sb2FkKGZpbGUudG9VUkkoKS50b1VSTCgpKQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgUHJlZmVyZW5jZXMuc2hvd0xhc3RSZXN1bHQgPSB0bXAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIlVuYWJsZSB0byBsb2FkIHVzZXItc2NyaXB0LCBtaXNzaW5nICdsb2FkJyBjb21tYW5kIikKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vCisgICAgLy8gUmVjb3JkaW5nCisgICAgLy8KKworICAgIHByaXZhdGUgdm9pZCBtYXliZVJlY29yZElucHV0KGZpbmFsIFN0cmluZyBsaW5lKSB7CisgICAgICAgIGRlZiByZWNvcmQgPSByZWdpc3RyeVsncmVjb3JkJ10KKworICAgICAgICBpZiAocmVjb3JkICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlY29yZC5yZWNvcmRJbnB1dChsaW5lKQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG1heWJlUmVjb3JkUmVzdWx0KGZpbmFsIE9iamVjdCByZXN1bHQpIHsKKyAgICAgICAgZGVmIHJlY29yZCA9IHJlZ2lzdHJ5WydyZWNvcmQnXQorCisgICAgICAgIGlmIChyZWNvcmQgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVjb3JkLnJlY29yZFJlc3VsdChyZXN1bHQpCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbWF5YmVSZWNvcmRFcnJvcihUaHJvd2FibGUgY2F1c2UpIHsKKyAgICAgICAgZGVmIHJlY29yZCA9IHJlZ2lzdHJ5WydyZWNvcmQnXQorCisgICAgICAgIGlmIChyZWNvcmQgIT0gbnVsbCkgeworICAgICAgICAgICAgYm9vbGVhbiBzYW5pdGl6ZSA9IFByZWZlcmVuY2VzLnNhbml0aXplU3RhY2tUcmFjZQorCisgICAgICAgICAgICBpZiAoc2FuaXRpemUpIHsKKyAgICAgICAgICAgICAgICBjYXVzZSA9IFN0YWNrVHJhY2VVdGlscy5kZWVwU2FuaXRpemUoY2F1c2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZWNvcmQucmVjb3JkRXJyb3IoY2F1c2UpCisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLy8KKyAgICAvLyBIb29rcworICAgIC8vCisKKyAgICBmaW5hbCBDbG9zdXJlIGRlZmF1bHRSZXN1bHRIb29rID0geyByZXN1bHQgLT4KKyAgICAgICAgYm9vbGVhbiBzaG93TGFzdFJlc3VsdCA9ICFpby5xdWlldCAmJiAoaW8udmVyYm9zZSB8fCBQcmVmZXJlbmNlcy5zaG93TGFzdFJlc3VsdCkKKworICAgICAgICBpZiAoc2hvd0xhc3RSZXN1bHQpIHsKKyAgICAgICAgICAgIC8vIE5lZWQgdG8gdXNlIFN0cmluZy52YWx1ZU9mKCkgaGVyZSB0byBhdm9pZCBpY2t5IGV4Y2VwdGlvbnMgY2F1c2VzIGJ5IEdTdHJpbmcgY29lcmNpb24KKyAgICAgICAgICAgIGlvLm91dC5wcmludGxuKCJAfGJvbGQgPT09PnwgJHtTdHJpbmcudmFsdWVPZihyZXN1bHQpfSIpCisgICAgICAgIH0KKyAgICB9CisKKyAgICBDbG9zdXJlIHJlc3VsdEhvb2sgPSBkZWZhdWx0UmVzdWx0SG9vaworCisgICAgcHJpdmF0ZSB2b2lkIHNldExhc3RSZXN1bHQoZmluYWwgT2JqZWN0IHJlc3VsdCkgeworICAgICAgICBpZiAocmVzdWx0SG9vayA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJSZXN1bHQgaG9vayBpcyBub3Qgc2V0IikKKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdEhvb2suY2FsbChyZXN1bHQpCisKKyAgICAgICAgaW50ZXJwLmNvbnRleHRbJ18nXSA9IHJlc3VsdAorCisgICAgICAgIG1heWJlUmVjb3JkUmVzdWx0KHJlc3VsdCkKKyAgICB9CisKKyAgICBwcml2YXRlIE9iamVjdCBnZXRMYXN0UmVzdWx0KCkgeworICAgICAgICByZXR1cm4gaW50ZXJwLmNvbnRleHRbJ18nXQorICAgIH0KKworICAgIGZpbmFsIENsb3N1cmUgZGVmYXVsdEVycm9ySG9vayA9IHsgVGhyb3dhYmxlIGNhdXNlIC0+CisgICAgICAgIGFzc2VydCBjYXVzZSAhPSBudWxsCisKKyAgICAgICAgaW8uZXJyLnByaW50bG4oIkB8Ym9sZCxyZWQgRVJST1J8ICR7Y2F1c2UuY2xhc3MubmFtZX06IEB8Ym9sZCxyZWQgJHtjYXVzZS5tZXNzYWdlfXwiKQorCisgICAgICAgIG1heWJlUmVjb3JkRXJyb3IoY2F1c2UpCisKKyAgICAgICAgaWYgKGxvZy5kZWJ1ZykgeworICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBkZWJ1ZyBlbmFibGVkIHRoZW4gc2tpcCB0aGUgZmFuY3kgYml0cyBiZWxvdworICAgICAgICAgICAgbG9nLmRlYnVnKGNhdXNlKQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgYm9vbGVhbiBzYW5pdGl6ZSA9IFByZWZlcmVuY2VzLnNhbml0aXplU3RhY2tUcmFjZQorCisgICAgICAgICAgICAvLyBTYW5pdGl6ZSB0aGUgc3RhY2sgdHJhY2UgdW5sZXNzIHdlIGFyZSBpbnZlcmJvc2UgbW9kZSwgb3IgdGhlIHVzZXIgaGFzIHJlcXVlc3Qgb3RoZXJ3aXNlCisgICAgICAgICAgICBpZiAoIWlvLnZlcmJvc2UgJiYgc2FuaXRpemUpIHsKKyAgICAgICAgICAgICAgICBjYXVzZSA9IFN0YWNrVHJhY2VVdGlscy5kZWVwU2FuaXRpemUoY2F1c2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZWYgdHJhY2UgPSBjYXVzZS5zdGFja1RyYWNlCisKKyAgICAgICAgICAgIGRlZiBidWZmID0gbmV3IFN0cmluZ0J1ZmZlcigpCisKKyAgICAgICAgICAgIGZvciAoZSBpbiB0cmFjZSkgeworICAgICAgICAgICAgICAgIGJ1ZmYgPDwgIiAgICAgICAgQHxib2xkIGF0fCAke2UuY2xhc3NOYW1lfS4ke2UubWV0aG9kTmFtZX0gKEB8Ym9sZCAiCisKKyAgICAgICAgICAgICAgICBidWZmIDw8IChlLm5hdGl2ZU1ldGhvZCA/ICdOYXRpdmUgTWV0aG9kJyA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGUuZmlsZU5hbWUgIT0gbnVsbCAmJiBlLmxpbmVOdW1iZXIgIT0gLTEgPyAiJHtlLmZpbGVOYW1lfToke2UubGluZU51bWJlcn0iIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGUuZmlsZU5hbWUgIT0gbnVsbCA/IGUuZmlsZU5hbWUgOiAnVW5rbm93biBTb3VyY2UnKSkpCisKKyAgICAgICAgICAgICAgICBidWZmIDw8ICd8KScKKworICAgICAgICAgICAgICAgIGlvLmVyci5wcmludGxuKGJ1ZmYpCisKKyAgICAgICAgICAgICAgICBidWZmLnNldExlbmd0aCgwKSAvLyBSZXNldCB0aGUgYnVmZmVyCisKKyAgICAgICAgICAgICAgICAvLyBTdG9wIHRoZSB0cmFjZSBvbmNlIHdlIGZpbmQgdGhlIHJvb3Qgb2YgdGhlIGV2YWx1YXRlZCBzY3JpcHQKKyAgICAgICAgICAgICAgICBpZiAoZS5jbGFzc05hbWUgPT0gRVZBTF9TQ1JJUFRfRklMRU5BTUUgJiYgZS5tZXRob2ROYW1lID09ICdydW4nKSB7CisgICAgICAgICAgICAgICAgICAgIGlvLmVyci5wcmludGxuKCcgICAgICAgIEB8Ym9sZCAuLi58JykKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBDbG9zdXJlIGVycm9ySG9vayA9IGRlZmF1bHRFcnJvckhvb2sKKworICAgIHByaXZhdGUgdm9pZCBkaXNwbGF5RXJyb3IoZmluYWwgVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgICAgIGlmIChlcnJvckhvb2sgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRXJyb3IgaG9vayBpcyBub3Qgc2V0IikKKyAgICAgICAgfQorCisgICAgICAgIGVycm9ySG9vay5jYWxsKGNhdXNlKQorICAgIH0KKworICAgIC8vCisgICAgLy8gSW50ZXJhY3RpdmUgU2hlbGwKKyAgICAvLworCisgICAgaW50IHJ1bihmaW5hbCBTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIFN0cmluZyBjb21tYW5kTGluZSA9IG51bGwKKworICAgICAgICBpZiAoYXJncyAhPSBudWxsICYmIGFyZ3MubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgY29tbWFuZExpbmUgPSBhcmdzLmpvaW4oJyAnKQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJ1bihjb21tYW5kTGluZSBhcyBTdHJpbmcpCisgICAgfQorCisgICAgaW50IHJ1bihmaW5hbCBTdHJpbmcgY29tbWFuZExpbmUpIHsKKyAgICAgICAgZGVmIHRlcm0gPSBUZXJtaW5hbC50ZXJtaW5hbAorCisgICAgICAgIGlmIChsb2cuZGVidWcpIHsKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiVGVybWluYWwgKCR0ZXJtKSIpCisgICAgICAgICAgICBsb2cuZGVidWcoIiAgICBTdXBwb3J0ZWQ6ICAkdGVybS5zdXBwb3J0ZWQiKQorICAgICAgICAgICAgbG9nLmRlYnVnKCIgICAgRUNITzogICAgICAgJHRlcm0uZWNobyAoZW5hYmxlZDogJHRlcm0uZWNob0VuYWJsZWQpIikKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiICAgIEggeCBXOiAgICAgICR0ZXJtLnRlcm1pbmFsSGVpZ2h0IHggJHRlcm0udGVybWluYWxXaWR0aCIpCisgICAgICAgICAgICBsb2cuZGVidWcoIiAgICBBTlNJOiAgICAgICAke3Rlcm0uaXNBTlNJU3VwcG9ydGVkKCl9IikKKworICAgICAgICAgICAgaWYgKHRlcm0gaW5zdGFuY2VvZiBqbGluZS5XaW5kb3dzVGVybWluYWwpIHsKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgICBEaXJlY3Q6ICAgICAke3Rlcm0uZGlyZWN0Q29uc29sZX0iKQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZGVmIGNvZGUKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbG9hZFVzZXJTY3JpcHQoJ2dyb292eXNoLnByb2ZpbGUnKQorCisgICAgICAgICAgICBpZiAoY29tbWFuZExpbmUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIFJ1biB0aGUgZ2l2ZW4gY29tbWFuZHMKKyAgICAgICAgICAgICAgICBleGVjdXRlKGNvbW1hbmRMaW5lKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbG9hZFVzZXJTY3JpcHQoJ2dyb292eXNoLnJjJykKKworICAgICAgICAgICAgICAgIC8vIFNldHVwIHRoZSBpbnRlcmFjdGl2ZSBydW5uZXIKKyAgICAgICAgICAgICAgICBydW5uZXIgPSBuZXcgSW50ZXJhY3RpdmVTaGVsbFJ1bm5lcih0aGlzLCB0aGlzLiZyZW5kZXJQcm9tcHQgYXMgQ2xvc3VyZSkKKworICAgICAgICAgICAgICAgIC8vIFNldHVwIHRoZSBoaXN0b3J5CisgICAgICAgICAgICAgICAgcnVubmVyLmhpc3RvcnkgPSBoaXN0b3J5ID0gbmV3IEhpc3RvcnkoKQorICAgICAgICAgICAgICAgIHJ1bm5lci5oaXN0b3J5RmlsZSA9IG5ldyBGaWxlKHVzZXJTdGF0ZURpcmVjdG9yeSwgJ2dyb292eXNoLmhpc3RvcnknKQorCisgICAgICAgICAgICAgICAgLy8gU2V0dXAgdGhlIGVycm9yIGhhbmRsZXIKKyAgICAgICAgICAgICAgICBydW5uZXIuZXJyb3JIYW5kbGVyID0gdGhpcy4mZGlzcGxheUVycm9yCisKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIFRPRE86IFNlZSBpZiB3ZSB3YW50IHRvIGFkZCBhbnkgbW9yZSBsYW5ndWFnZSBzcGVjaWZpYyBjb21wbGV0aW9ucywgbGlrZSBmb3IgcHJpbnRsbiBmb3IgZXhhbXBsZT8KKyAgICAgICAgICAgICAgICAvLworCisgICAgICAgICAgICAgICAgLy8gRGlzcGxheSB0aGUgd2VsY29tZSBiYW5uZXIKKyAgICAgICAgICAgICAgICBpZiAoIWlvLnF1aWV0KSB7CisgICAgICAgICAgICAgICAgICAgIGRlZiB3aWR0aCA9IHRlcm0udGVybWluYWxXaWR0aAorCisgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGNhbid0IHRlbGwsIG9yIGhhdmUgc29tZXRoaW5nIGJvZ3VzIHRoZW4gdXNlIGEgcmVhc29uYWJsZSBkZWZhdWx0CisgICAgICAgICAgICAgICAgICAgIGlmICh3aWR0aCA8IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gODAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlvLm91dC5wcmludGxuKG1lc3NhZ2VzLmZvcm1hdCgnc3RhcnR1cF9iYW5uZXIuMCcsIEludm9rZXJIZWxwZXIudmVyc2lvbiwgU3lzdGVtLnByb3BlcnRpZXNbJ2phdmEudm0udmVyc2lvbiddKSkKKyAgICAgICAgICAgICAgICAgICAgaW8ub3V0LnByaW50bG4obWVzc2FnZXNbJ3N0YXJ0dXBfYmFubmVyLjEnXSkKKyAgICAgICAgICAgICAgICAgICAgaW8ub3V0LnByaW50bG4oJy0nICogKHdpZHRoIC0gMSkpCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gQW5kIGxldCAnZXIgcmlwLi4uIDotKQorICAgICAgICAgICAgICAgIHJ1bm5lci5ydW4oKQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb2RlID0gMAorICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGl0Tm90aWZpY2F0aW9uIG4pIHsKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiRXhpdGluZyB3L2NvZGU6ICR7bi5jb2RlfSIpCisKKyAgICAgICAgICAgIGNvZGUgPSBuLmNvZGUKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGlvLmVyci5wcmludGxuKG1lc3NhZ2VzLmZvcm1hdCgnaW5mby5mYXRhbCcsIHQpKQorICAgICAgICAgICAgdC5wcmludFN0YWNrVHJhY2UoaW8uZXJyKQorCisgICAgICAgICAgICBjb2RlID0gMQorICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0IGNvZGUgIT0gbnVsbCAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4KKworICAgICAgICByZXR1cm4gY29kZQorICAgIH0KK30KKworLyoqCisgKiBDb250YWluZXIgZm9yIHRoZSBwYXJzZSBjb2RlLgorICovCitjbGFzcyBQYXJzZUNvZGUgeworICAgIHN0YXRpYyBmaW5hbCBQYXJzZUNvZGUgQ09NUExFVEUgPSBuZXcgUGFyc2VDb2RlKGNvZGU6IDApCisgICAgc3RhdGljIGZpbmFsIFBhcnNlQ29kZSBJTkNPTVBMRVRFID0gbmV3IFBhcnNlQ29kZShjb2RlOiAxKQorICAgIHN0YXRpYyBmaW5hbCBQYXJzZUNvZGUgRVJST1IgPSBuZXcgUGFyc2VDb2RlKGNvZGU6IDIpCisKKyAgICBpbnQgY29kZQorCisgICAgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gY29kZQorICAgIH0KK30KKworLyoqCisgKiBDb250YWluZXIgZm9yIHBhcnNlIHN0YXR1cyBkZXRhaWxzLgorICovCitjbGFzcyBQYXJzZVN0YXR1cworeworICAgIGZpbmFsIFBhcnNlQ29kZSBjb2RlCisKKyAgICBmaW5hbCBUaHJvd2FibGUgY2F1c2UKKworICAgIFBhcnNlU3RhdHVzKGZpbmFsIFBhcnNlQ29kZSBjb2RlLCBmaW5hbCBUaHJvd2FibGUgY2F1c2UpIHsKKyAgICAgICAgdGhpcy5jb2RlID0gY29kZQorICAgICAgICB0aGlzLmNhdXNlID0gY2F1c2UKKyAgICB9CisKKyAgICBQYXJzZVN0YXR1cyhmaW5hbCBQYXJzZUNvZGUgY29kZSkgeworICAgICAgICB0aGlzKGNvZGUsIG51bGwpCisgICAgfQorCisgICAgUGFyc2VTdGF0dXMoZmluYWwgVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgICAgIHRoaXMoUGFyc2VDb2RlLkVSUk9SLCBjYXVzZSkKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9Hcm9vdnlzaC5wcm9wZXJ0aWVzIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvR3Jvb3Z5c2gucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjE4ZmI2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvR3Jvb3Z5c2gucHJvcGVydGllcwpAQCAtMCwwICsxLDM1IEBACisjCisjIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMKKyMgJElkJAorIworCisjCisjIEluZm9ybWF0aW9uYWwgYW5kIGVycm9yIG1lc3NhZ2VzCisjCisKK2luZm8uZXJyb3I9RVJST1I6IHswfQorCitpbmZvLmZhdGFsPUZBVEFMOiB7MH0KKworIworIyBNaXNjIG1lc3NhZ2VzCisjCisKK3N0YXJ0dXBfYmFubmVyLjA9QHxncmVlbiBHcm9vdnkgU2hlbGx8ICh7MH0sIEpWTTogezF9KQorCitzdGFydHVwX2Jhbm5lci4xPVR5cGUgJ0B8Ym9sZCBoZWxwfCcgb3IgJ0B8Ym9sZCBcXGh8JyBmb3IgaGVscC4KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL0lPLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9JTy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwYzQzMDUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9JTy5qYXZhCkBAIC0wLDAgKzEsMTk0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwudXRpbC5BTlNJLlJlbmRlcldyaXRlcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLnV0aWwuUHJlZmVyZW5jZXM7CisKKy8qKgorICogQ29udGFpbmVyIGZvciBpbnB1dC9vdXRwdXQgaGFuZGxlcy4KKyAqCisgKiBAdmVyc2lvbiAkSWQkCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYXNvbkBwbGFuZXQ1Ny5jb20iPkphc29uIERpbGxvbjwvYT4KKyAqLworcHVibGljIGNsYXNzIElPCit7CisgICAgLyoqIFJhdyBpbnB1dCBzdHJlYW0uICovCisgICAgcHVibGljIGZpbmFsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtOworCisgICAgLyoqIFJhdyBvdXRwdXQgc3RyZWFtLiAqLworICAgIHB1YmxpYyBmaW5hbCBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtOworCisgICAgLyoqIFJhdyBlcnJvciBvdXRwdXQgc3RyZWFtLiAqLworICAgIHB1YmxpYyBmaW5hbCBPdXRwdXRTdHJlYW0gZXJyb3JTdHJlYW07CisKKyAgICAvKiogUHJlZmVyZWQgaW5wdXQgcmVhZGVyLiAqLworICAgIHB1YmxpYyBmaW5hbCBSZWFkZXIgaW47CisKKyAgICAvKiogUHJlZmVyZWQgb3V0cHV0IHdyaXRlci4gKi8KKyAgICBwdWJsaWMgZmluYWwgUHJpbnRXcml0ZXIgb3V0OworCisgICAgLyoqIFByZWZlcmVkIGVycm9yIG91dHB1dCB3cml0ZXIuICovCisgICAgcHVibGljIGZpbmFsIFByaW50V3JpdGVyIGVycjsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBJTyBjb250YWluZXIuCisgICAgICovCisgICAgcHVibGljIElPKGZpbmFsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBmaW5hbCBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtLCBmaW5hbCBPdXRwdXRTdHJlYW0gZXJyb3JTdHJlYW0pIHsKKyAgICAgICAgYXNzZXJ0IGlucHV0U3RyZWFtICE9IG51bGw7CisgICAgICAgIGFzc2VydCBvdXRwdXRTdHJlYW0gIT0gbnVsbDsKKyAgICAgICAgYXNzZXJ0IGVycm9yU3RyZWFtICE9IG51bGw7CisKKyAgICAgICAgdGhpcy5pbnB1dFN0cmVhbSA9IGlucHV0U3RyZWFtOworICAgICAgICB0aGlzLm91dHB1dFN0cmVhbSA9IG91dHB1dFN0cmVhbTsKKyAgICAgICAgdGhpcy5lcnJvclN0cmVhbSA9IGVycm9yU3RyZWFtOworCisgICAgICAgIHRoaXMuaW4gPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW5wdXRTdHJlYW0pOworCisgICAgICAgIC8vCisgICAgICAgIC8vIFRPRE86IE9uY2UgYWxsIHVzZXIgb3V0cHV0IGlzIGluIGkxOG4sIHRoZW4gaXQgd291bGQgYmUgbW9yZSBlZmZpY2VudCB0byBoYXZlIHRoZSBNZXNzYWdlU291cmNlCisgICAgICAgIC8vICAgICAgIGJlIEFOU0ktYXdhcmUgaW5zdGVhZCBvZiB0aGlzLi4uCisgICAgICAgIC8vCisKKyAgICAgICAgdGhpcy5vdXQgPSBuZXcgUmVuZGVyV3JpdGVyKG91dHB1dFN0cmVhbSwgdHJ1ZSk7CisgICAgICAgIHRoaXMuZXJyID0gbmV3IFJlbmRlcldyaXRlcihlcnJvclN0cmVhbSwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IElPIGNvbnRhaW5lciB1c2luZyBzeXN0ZW0gc3RyZWFtcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgSU8oKSB7CisgICAgICAgIHRoaXMoU3lzdGVtLmluLCBTeXN0ZW0ub3V0LCBTeXN0ZW0uZXJyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHZlcmJvc2l0eSBsZXZlbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2ZXJib3NpdHkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWZXJib3NpdHkoZmluYWwgVmVyYm9zaXR5IHZlcmJvc2l0eSkgeworICAgICAgICBhc3NlcnQgdmVyYm9zaXR5ICE9IG51bGw7CisKKyAgICAgICAgUHJlZmVyZW5jZXMudmVyYm9zaXR5ID0gdmVyYm9zaXR5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHZlcmJvc2l0eSBsZXZlbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgVmVyYm9zaXR5IGdldFZlcmJvc2l0eSgpIHsKKyAgICAgICAgcmV0dXJuIFByZWZlcmVuY2VzLnZlcmJvc2l0eTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiB0aGUgdmVyYm9zaXR5IGxldmVsIGlzIHNldCB0byB7QGxpbmsgVmVyYm9zaXR5I1FVSUVUfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1F1aWV0KCkgeworICAgICAgICByZXR1cm4gZ2V0VmVyYm9zaXR5KCkgPT0gVmVyYm9zaXR5LlFVSUVUOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIGlmIHRoZSB2ZXJib3NpdHkgbGV2ZWwgaXMgc2V0IHRvIHtAbGluayBWZXJib3NpdHkjSU5GT30uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNJbmZvKCkgeworICAgICAgICByZXR1cm4gZ2V0VmVyYm9zaXR5KCkgPT0gVmVyYm9zaXR5LklORk87CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgdGhlIHZlcmJvc2l0eSBsZXZlbCBpcyBzZXQgdG8ge0BsaW5rIFZlcmJvc2l0eSNWRVJCT1NFfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ZlcmJvc2UoKSB7CisgICAgICAgIHJldHVybiBnZXRWZXJib3NpdHkoKSA9PSBWZXJib3NpdHkuVkVSQk9TRTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiB0aGUgdmVyYm9zaXR5IGxldmVsIGlzIHNldCB0byB7QGxpbmsgVmVyYm9zaXR5I0RFQlVHfS4KKyAgICAgKgorICAgICAqIDxwPkZvciBnZW5lcmFseSB1c2FnZSwgd2hlbiBkZWJ1ZyBvdXRwdXQgaXMgcmVxdWlyZWQsIGl0IGlzIGJldHRlcgorICAgICAqIHRvIHVzZSB0aGUgbG9nZ2luZyBmYWNpbGl0eSBpbnN0ZWFkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRGVidWcoKSB7CisgICAgICAgIHJldHVybiBnZXRWZXJib3NpdHkoKSA9PSBWZXJib3NpdHkuREVCVUc7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmx1c2ggYm90aCBvdXRwdXQgc3RyZWFtcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG91dC5mbHVzaCgpOworICAgICAgICBlcnIuZmx1c2goKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSBhbGwgc3RyZWFtcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGluLmNsb3NlKCk7CisgICAgICAgIG91dC5jbG9zZSgpOworICAgICAgICBlcnIuY2xvc2UoKTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIFZlcmJvc2l0eQorICAgIC8vCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFZlcmJvc2l0eQorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBWZXJib3NpdHkgUVVJRVQgPSBuZXcgVmVyYm9zaXR5KCJRVUlFVCIpOworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVmVyYm9zaXR5IElORk8gPSBuZXcgVmVyYm9zaXR5KCJJTkZPIik7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBWZXJib3NpdHkgVkVSQk9TRSA9IG5ldyBWZXJib3NpdHkoIlZFUkJPU0UiKTsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFZlcmJvc2l0eSBERUJVRyA9IG5ldyBWZXJib3NpdHkoIkRFQlVHIik7CisKKyAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBuYW1lOworCisgICAgICAgIHByaXZhdGUgVmVyYm9zaXR5KGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBuYW1lOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBWZXJib3NpdHkgZm9yTmFtZShmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgYXNzZXJ0IG5hbWUgIT0gbnVsbDsKKworICAgICAgICAgICAgaWYgKFFVSUVULm5hbWUuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBRVUlFVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChJTkZPLm5hbWUuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBJTkZPOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKFZFUkJPU0UubmFtZS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFZFUkJPU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoREVCVUcubmFtZS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIERFQlVHOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHZlcmJvc2l0eSBuYW1lOiAiICsgbmFtZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9JbnRlcmFjdGl2ZVNoZWxsUnVubmVyLmdyb292eSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL0ludGVyYWN0aXZlU2hlbGxSdW5uZXIuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ZjY0ODEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9JbnRlcmFjdGl2ZVNoZWxsUnVubmVyLmdyb292eQpAQCAtMCwwICsxLDE1MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbAorCitpbXBvcnQgamxpbmUuQ29uc29sZVJlYWRlcgoraW1wb3J0IGpsaW5lLk11bHRpQ29tcGxldG9yCitpbXBvcnQgamxpbmUuSGlzdG9yeQoraW1wb3J0IGpsaW5lLkNvbXBsZXRvcgoraW1wb3J0IGpsaW5lLk11bHRpQ29tcGxldG9yCisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLnV0aWwuTG9nZ2VyCisKKy8qKgorICogU3VwcG9ydCBmb3IgcnVubmluZyBhIHtAbGluayBTaGVsbH0gaW50ZXJhY3Rpdmx5IHVzaW5nIHRoZSBKTGluZSBsaWJyYXJ5LgorICoKKyAqIEB2ZXJzaW9uICRJZCQKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphc29uQHBsYW5ldDU3LmNvbSI+SmFzb24gRGlsbG9uPC9hPgorICovCitjbGFzcyBJbnRlcmFjdGl2ZVNoZWxsUnVubmVyCisgICAgZXh0ZW5kcyBTaGVsbFJ1bm5lcgorICAgIGltcGxlbWVudHMgUnVubmFibGUKK3sKKyAgICBmaW5hbCBDb25zb2xlUmVhZGVyIHJlYWRlcgorICAgIAorICAgIGZpbmFsIENsb3N1cmUgcHJvbXB0CisgICAgCisgICAgZmluYWwgQ29tbWFuZHNNdWx0aUNvbXBsZXRvciBjb21wbGV0b3IKKyAgICAKKyAgICBJbnRlcmFjdGl2ZVNoZWxsUnVubmVyKGZpbmFsIFNoZWxsIHNoZWxsLCBmaW5hbCBDbG9zdXJlIHByb21wdCkgeworICAgICAgICBzdXBlcihzaGVsbCkKKyAgICAgICAgCisgICAgICAgIHRoaXMucHJvbXB0ID0gcHJvbXB0CisgICAgICAgIAorICAgICAgICB0aGlzLnJlYWRlciA9IG5ldyBDb25zb2xlUmVhZGVyKHNoZWxsLmlvLmlucHV0U3RyZWFtLCBuZXcgUHJpbnRXcml0ZXIoc2hlbGwuaW8ub3V0cHV0U3RyZWFtLCB0cnVlKSkKKyAgICAgICAgCisgICAgICAgIHRoaXMuY29tcGxldG9yID0gbmV3IENvbW1hbmRzTXVsdGlDb21wbGV0b3IoKQorICAgICAgICAKKyAgICAgICAgcmVhZGVyLmFkZENvbXBsZXRvcihjb21wbGV0b3IpCisgICAgfQorICAgIAorICAgIHZvaWQgcnVuKCkgeworICAgICAgICBmb3IgKGNvbW1hbmQgaW4gc2hlbGwucmVnaXN0cnkpIHsKKyAgICAgICAgICAgIGNvbXBsZXRvciA8PCBjb21tYW5kCisgICAgICAgIH0KKworICAgICAgICAvLyBGb3JjZSB0aGluZ3MgdG8gYmVjb21lIGNsZWFuCisgICAgICAgIGNvbXBsZXRvci5yZWZyZXNoKCkKKworICAgICAgICAvLyBBbmQgdGhlbiBhY3R1YWxseSBydW4KKyAgICAgICAgc3VwZXIucnVuKCkKKyAgICB9CisgICAgCisgICAgdm9pZCBzZXRIaXN0b3J5KGZpbmFsIEhpc3RvcnkgaGlzdG9yeSkgeworICAgICAgICByZWFkZXIuaGlzdG9yeSA9IGhpc3RvcnkKKyAgICB9CisgICAgCisgICAgdm9pZCBzZXRIaXN0b3J5RmlsZShmaW5hbCBGaWxlIGZpbGUpIHsKKyAgICAgICAgZGVmIGRpciA9IGZpbGUucGFyZW50RmlsZQorICAgICAgICAKKyAgICAgICAgaWYgKCFkaXIuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIGRpci5ta2RpcnMoKQorICAgICAgICAgICAgCisgICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0ZWQgYmFzZSBkaXJlY3RvcnkgZm9yIGhpc3RvcnkgZmlsZTogJGRpciIpCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGxvZy5kZWJ1ZygiVXNpbmcgaGlzdG9yeSBmaWxlOiAkZmlsZSIpCisgICAgICAgIAorICAgICAgICByZWFkZXIuaGlzdG9yeS5oaXN0b3J5RmlsZSA9IGZpbGUKKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIFN0cmluZyByZWFkTGluZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiByZWFkZXIucmVhZExpbmUocHJvbXB0LmNhbGwoKSkKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2cuZGVidWcoIkhBQ0s6IFRyeSBhbmQgd29yayBhcm91bmQgR1JPT1ZZLTIxNTIgZm9yIG5vdyIsIGUpCisKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqCisgKiBDb21wbGV0b3IgZm9yIGludGVyYWN0aXZlIHNoZWxscy4KKyAqCisgKiBAdmVyc2lvbiAkSWQkCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYXNvbkBwbGFuZXQ1Ny5jb20iPkphc29uIERpbGxvbjwvYT4KKyAqLworY2xhc3MgQ29tbWFuZHNNdWx0aUNvbXBsZXRvcgorICAgIGV4dGVuZHMgTXVsdGlDb21wbGV0b3IKK3sKKyAgICBwcm90ZWN0ZWQgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlci5jcmVhdGUodGhpcy5jbGFzcykKKyAgICAKKyAgICBMaXN0Lyo8Q29tcGxldG9yPiovIGxpc3QgPSBbXQorICAgIAorICAgIHByaXZhdGUgYm9vbGVhbiBkaXJ0eSA9IGZhbHNlCisgICAgCisgICAgZGVmIGxlZnRTaGlmdChmaW5hbCBDb21tYW5kIGNvbW1hbmQpIHsKKyAgICAgICAgYXNzZXJ0IGNvbW1hbmQKKyAgICAgICAgCisgICAgICAgIC8vCisgICAgICAgIC8vIEZJWE1FOiBOZWVkIHRvIGhhbmRsZSBjb21wbGV0b3IgcmVtb3ZhbCB3aGVuIHRoaW5ncyBsaWtlIGFsaWFzZXMgYXJlIHJlYm91bmQKKyAgICAgICAgLy8KKyAgICAgICAgCisgICAgICAgIGRlZiBjID0gY29tbWFuZC5jb21wbGV0b3IKKyAgICAgICAgCisgICAgICAgIGlmIChjKSB7CisgICAgICAgICAgICBsaXN0IDw8IGMKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbG9nLmRlYnVnKCJBZGRlZCBjb21wbGV0b3JbJHtsaXN0LnNpemUoKX1dIGZvciBjb21tYW5kOiAkY29tbWFuZC5uYW1lIikKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZGlydHkgPSB0cnVlCisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHJlZnJlc2goKSB7CisgICAgICAgIGxvZy5kZWJ1ZygiUmVmcmVzaGluZyB0aGUgY29tcGxldG9yIGxpc3QiKQorCisgICAgICAgIGNvbXBsZXRvcnMgPSBsaXN0IGFzIENvbXBsZXRvcltdCisgICAgICAgIGRpcnR5ID0gZmFsc2UKKyAgICB9CisKKyAgICBpbnQgY29tcGxldGUoZmluYWwgU3RyaW5nIGJ1ZmZlciwgZmluYWwgaW50IHBvcywgZmluYWwgTGlzdCBjYW5kKSB7CisgICAgICAgIGFzc2VydCBidWZmZXIgIT0gbnVsbAorICAgICAgICAKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRklYTUU6IFRoaXMgaXMgYSBiaXQgb2YgYSBoYWNrLCBJJ20gdG9vIGxhenkgdG8gcmV3cml0ZSBhIG1vcmUgZWZmaWNlbnQKKyAgICAgICAgLy8gICAgICAgIGNvbXBsZXRvciBpbXBsIHRoYXQgaXMgbW9yZSBkeW5hbWljIHRoYW4gdGhlIGpsaW5lLk11bHRpQ29tcGxldG9yIHZlcnNpb24KKyAgICAgICAgLy8gICAgICAgIHNvIGp1c3QgcmUtdXNlIGl0IGFuZCByZXNldCB0aGUgbGlzdCBhcyBuZWVkZWQKKyAgICAgICAgLy8KKworICAgICAgICBpZiAoZGlydHkpIHsKKyAgICAgICAgICAgIHJlZnJlc2goKQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gc3VwZXIuY29tcGxldGUoYnVmZmVyLCBwb3MsIGNhbmQpCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvTWFpbi5ncm9vdnkgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9NYWluLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODQ3OWQxCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvTWFpbi5ncm9vdnkKQEAgLTAsMCArMSwxOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5JbnZva2VySGVscGVyCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC51dGlsLkFOU0kKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLnV0aWwuSGVscEZvcm1hdHRlcgoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwudXRpbC5Mb2dnZXIKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLnV0aWwuTWVzc2FnZVNvdXJjZQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwudXRpbC5Ob0V4aXRTZWN1cml0eU1hbmFnZXIKKworLyoqCisgKiBNYWluIENMSSBlbnRyeS1wb2ludCBmb3IgPHR0Pmdyb292eXNoPC90dD4uCisgKgorICogQHZlcnNpb24gJElkJAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFzb25AcGxhbmV0NTcuY29tIj5KYXNvbiBEaWxsb248L2E+CisgKi8KK2NsYXNzIE1haW4KK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZXNzYWdlU291cmNlIG1lc3NhZ2VzID0gbmV3IE1lc3NhZ2VTb3VyY2UoTWFpbi5jbGFzcykKKworICAgIHN0YXRpYyB2b2lkIG1haW4oZmluYWwgU3RyaW5nW10gYXJncykgeworICAgICAgICBJTyBpbyA9IG5ldyBJTygpCisgICAgICAgIExvZ2dlci5pbyA9IGlvCisKKyAgICAgICAgZGVmIGNsaSA9IG5ldyBDbGlCdWlsZGVyKHVzYWdlIDogJ2dyb292eXNoIFtvcHRpb25zXSBbLi4uXScsIGZvcm1hdHRlcjogbmV3IEhlbHBGb3JtYXR0ZXIoKSwgd3JpdGVyOiBpby5vdXQpCisKKyAgICAgICAgY2xpLmgobG9uZ09wdDogJ2hlbHAnLCBtZXNzYWdlc1snY2xpLm9wdGlvbi5oZWxwLmRlc2NyaXB0aW9uJ10pCisgICAgICAgIGNsaS5WKGxvbmdPcHQ6ICd2ZXJzaW9uJywgbWVzc2FnZXNbJ2NsaS5vcHRpb24udmVyc2lvbi5kZXNjcmlwdGlvbiddKQorICAgICAgICBjbGkudihsb25nT3B0OiAndmVyYm9zZScsIG1lc3NhZ2VzWydjbGkub3B0aW9uLnZlcmJvc2UuZGVzY3JpcHRpb24nXSkKKyAgICAgICAgY2xpLnEobG9uZ09wdDogJ3F1aWV0JywgbWVzc2FnZXNbJ2NsaS5vcHRpb24ucXVpZXQuZGVzY3JpcHRpb24nXSkKKyAgICAgICAgY2xpLmQobG9uZ09wdDogJ2RlYnVnJywgbWVzc2FnZXNbJ2NsaS5vcHRpb24uZGVidWcuZGVzY3JpcHRpb24nXSkKKyAgICAgICAgY2xpLkMobG9uZ09wdDogJ2NvbG9yJywgYXJnczogMSwgYXJnTmFtZTogJ0ZMQUcnLCBvcHRpb25hbEFyZzogdHJ1ZSwgbWVzc2FnZXNbJ2NsaS5vcHRpb24uY29sb3IuZGVzY3JpcHRpb24nXSkKKyAgICAgICAgY2xpLkQobG9uZ09wdDogJ2RlZmluZScsIGFyZ3M6IDEsIGFyZ05hbWU6ICdOQU1FPVZBTFVFJywgbWVzc2FnZXNbJ2NsaS5vcHRpb24uZGVmaW5lLmRlc2NyaXB0aW9uJ10pCisgICAgICAgIGNsaS5UKGxvbmdPcHQ6ICd0ZXJtaW5hbCcsIGFyZ3M6IDEsIGFyZ05hbWU6ICdUWVBFJywgbWVzc2FnZXNbJ2NsaS5vcHRpb24udGVybWluYWwuZGVzY3JpcHRpb24nXSkKKworICAgICAgICBkZWYgb3B0aW9ucyA9IGNsaS5wYXJzZShhcmdzKQorCisgICAgICAgIGlmIChvcHRpb25zLmgpIHsKKyAgICAgICAgICAgIGNsaS51c2FnZSgpCisgICAgICAgICAgICBTeXN0ZW0uZXhpdCgwKQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG9wdGlvbnMuVikgeworICAgICAgICAgICAgaW8ub3V0LnByaW50bG4obWVzc2FnZXMuZm9ybWF0KCdjbGkuaW5mby52ZXJzaW9uJywgSW52b2tlckhlbHBlci52ZXJzaW9uKSkKKyAgICAgICAgICAgIFN5c3RlbS5leGl0KDApCisgICAgICAgIH0KKworICAgICAgICBpZiAob3B0aW9ucy5oYXNPcHRpb24oJ1QnKSkgeworICAgICAgICAgICAgZGVmIHR5cGUgPSBvcHRpb25zLmdldE9wdGlvblZhbHVlKCdUJykKKyAgICAgICAgICAgIHNldFRlcm1pbmFsVHlwZSh0eXBlKQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG9wdGlvbnMuaGFzT3B0aW9uKCdEJykpIHsKKyAgICAgICAgICAgIGRlZiB2YWx1ZXMgPSBvcHRpb25zLmdldE9wdGlvblZhbHVlcygnRCcpCisKKyAgICAgICAgICAgIHZhbHVlcy5lYWNoIHsKKyAgICAgICAgICAgICAgICBzZXRTeXN0ZW1Qcm9wZXJ0eShpdCBhcyBTdHJpbmcpCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAob3B0aW9ucy52KSB7CisgICAgICAgICAgICBpby52ZXJib3NpdHkgPSBJTy5WZXJib3NpdHkuVkVSQk9TRQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG9wdGlvbnMuZCkgeworICAgICAgICAgICAgaW8udmVyYm9zaXR5ID0gSU8uVmVyYm9zaXR5LkRFQlVHCisgICAgICAgIH0KKworICAgICAgICBpZiAob3B0aW9ucy5xKSB7CisgICAgICAgICAgICBpby52ZXJib3NpdHkgPSBJTy5WZXJib3NpdHkuUVVJRVQKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvcHRpb25zLmhhc09wdGlvbignQycpKSB7CisgICAgICAgICAgICBkZWYgdmFsdWUgPSBvcHRpb25zLmdldE9wdGlvblZhbHVlKCdDJykKKyAgICAgICAgICAgIHNldENvbG9yKHZhbHVlKQorICAgICAgICB9CisKKyAgICAgICAgZGVmIGNvZGUKKworICAgICAgICAvLyBBZGQgYSBob29rIHRvIGRpc3BsYXkgc29tZSBzdGF0dXMgd2hlbiBzaHV0dGluZyBkb3duLi4uCisgICAgICAgIGFkZFNodXRkb3duSG9vayB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gRklYTUU6IFdlIG5lZWQgdG8gY29uZmlndXJlIEpMaW5lIHRvIGNhdGNoIENUUkwtQyBmb3IgdXMuLi4gaWYgdGhhdCBpcyBwb3NzaWJsZQorICAgICAgICAgICAgLy8KKworICAgICAgICAgICAgaWYgKGNvZGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIEdpdmUgdGhlIHVzZXIgYSB3YXJuaW5nIHdoZW4gdGhlIEpWTSBzaHV0ZG93biBhYm5vcm1hbGx5LCBub3JtYWwgc2h1dGRvd24KKyAgICAgICAgICAgICAgICAvLyB3aWxsIHNldCBhbiBleGl0IGNvZGUgdGhyb3VnaCB0aGUgcHJvcGVyIGNoYW5uZWxzCisKKyAgICAgICAgICAgICAgICBpby5lcnIucHJpbnRsbigpCisgICAgICAgICAgICAgICAgaW8uZXJyLnByaW50bG4oJ0B8cmVkIFdBUk5JTkc6fCBBYm5vcm1hbCBKVk0gc2h1dGRvd24gZGV0ZWN0ZWQnKQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpby5mbHVzaCgpCisgICAgICAgIH0KKworICAgICAgICAvLyBCb290IHVwIHRoZSBzaGVsbC4uLiA6LSkKKyAgICAgICAgR3Jvb3Z5c2ggc2hlbGwgPSBuZXcgR3Jvb3Z5c2goaW8pCisKKyAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIHBzbSA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKQorICAgICAgICBTeXN0ZW0uc2V0U2VjdXJpdHlNYW5hZ2VyKG5ldyBOb0V4aXRTZWN1cml0eU1hbmFnZXIoKSkKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgY29kZSA9IHNoZWxsLnJ1bihvcHRpb25zLmFyZ3VtZW50cygpIGFzIFN0cmluZ1tdKQorICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICAgICAgU3lzdGVtLnNldFNlY3VyaXR5TWFuYWdlcihwc20pCisgICAgICAgIH0KKworICAgICAgICAvLyBGb3JjZSB0aGUgSlZNIHRvIGV4aXQgYXQgdGhpcyBwb2ludCwgc2luY2Ugc2hlbGwgY291bGQgaGF2ZSBjcmVhdGVkIHRocmVhZHMgb3IKKyAgICAgICAgLy8gcG9wcGVkIHVwIFN3aW5nIGNvbXBvbmVudHMgdGhhdCB3aWxsIGNhdXNlIHRoZSBKVk0gdG8gbGluZ2VyIGFmdGVyIHdlIGhhdmUgYmVlbgorICAgICAgICAvLyBhc2tlZCB0byBzaHV0ZG93bgorCisgICAgICAgIFN5c3RlbS5leGl0KGNvZGUpCisgICAgfQorCisgICAgc3RhdGljIHZvaWQgc2V0VGVybWluYWxUeXBlKFN0cmluZyB0eXBlKSB7CisgICAgICAgIGFzc2VydCB0eXBlICE9IG51bGwKKyAgICAgICAgCisgICAgICAgIHR5cGUgPSB0eXBlLnRvTG93ZXJDYXNlKCk7CisKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICBjYXNlICdhdXRvJzoKKyAgICAgICAgICAgICAgICB0eXBlID0gbnVsbDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAndW5peCc6CisgICAgICAgICAgICAgICAgdHlwZSA9ICdqbGluZS5Vbml4VGVybWluYWwnCisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAgICAgY2FzZSAnd2luJzoKKyAgICAgICAgICAgIGNhc2UgJ3dpbmRvd3MnOgorICAgICAgICAgICAgICAgIHR5cGUgPSAnamxpbmUuV2luZG93c1Rlcm1pbmFsJworICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgIGNhc2UgJ2ZhbHNlJzoKKyAgICAgICAgICAgIGNhc2UgJ29mZic6CisgICAgICAgICAgICBjYXNlICdub25lJzoKKyAgICAgICAgICAgICAgICB0eXBlID0gJ2psaW5lLlVuc3VwcG9ydGVkVGVybWluYWwnCisgICAgICAgICAgICAgICAgLy8gRGlzYWJsZSBBTlNJLCBmb3Igc29tZSByZWFzb24gVW5zdXBwb3J0ZWRUZXJtaW5hbCByZXBvcnRzIEFOU0kgYXMgZW5hYmxlZCwgd2hlbiBpdCBzaG91bGRuJ3QKKyAgICAgICAgICAgICAgICBBTlNJLmVuYWJsZWQgPSBmYWxzZQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgeworICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCdqbGluZS50ZXJtaW5hbCcsIHR5cGUpCisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBzZXRDb2xvcih2YWx1ZSkgeworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdmFsdWUgPSB0cnVlIC8vIC0tY29sb3IgaXMgdGhlIHNhbWUgYXMgLS1jb2xvcj10cnVlCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB2YWx1ZSA9IEJvb2xlYW4udmFsdWVPZih2YWx1ZSkuYm9vbGVhblZhbHVlKCk7IC8vIEZvciBKREsgMS40IGNvbXBhdAorICAgICAgICB9CisKKyAgICAgICAgQU5TSS5lbmFibGVkID0gdmFsdWUKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBzZXRTeXN0ZW1Qcm9wZXJ0eShmaW5hbCBTdHJpbmcgbmFtZVZhbHVlKSB7CisgICAgICAgIFN0cmluZyBuYW1lCisgICAgICAgIFN0cmluZyB2YWx1ZQorCisgICAgICAgIGlmIChuYW1lVmFsdWUuaW5kZXhPZignPScpID4gMCkgeworICAgICAgICAgICAgZGVmIHRtcCA9IG5hbWVWYWx1ZS5zcGxpdCgnPScsIDIpCisgICAgICAgICAgICBuYW1lID0gdG1wWzBdCisgICAgICAgICAgICB2YWx1ZSA9IHRtcFsxXQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbmFtZSA9IG5hbWVWYWx1ZQorICAgICAgICAgICAgdmFsdWUgPSBCb29sZWFuLlRSVUUudG9TdHJpbmcoKQorICAgICAgICB9CisKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KG5hbWUsIHZhbHVlKQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL01haW4ucHJvcGVydGllcyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL01haW4ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzFkNTg4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvTWFpbi5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNDEgQEAKKyMKKyMgQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIworIyAkSWQkCisjCisKKyMKKyMgQ0xJIG1lc3NhZ2VzCisjCisKK2NsaS5vcHRpb24uaGVscC5kZXNjcmlwdGlvbj1EaXNwbGF5IHRoaXMgaGVscCBtZXNzYWdlCisKK2NsaS5vcHRpb24udmVyc2lvbi5kZXNjcmlwdGlvbj1EaXNwbGF5IHRoZSB2ZXJzaW9uCisKK2NsaS5vcHRpb24udmVyYm9zZS5kZXNjcmlwdGlvbj1FbmFibGUgdmVyYm9zZSBvdXRwdXQKKworY2xpLm9wdGlvbi5xdWlldC5kZXNjcmlwdGlvbj1TdXBwcmVzcyBzdXBlcmZsdW91cyBvdXRwdXQKKworY2xpLm9wdGlvbi5kZWJ1Zy5kZXNjcmlwdGlvbj1FbmFibGUgZGVidWcgb3V0cHV0CisKK2NsaS5vcHRpb24uY29sb3IuZGVzY3JpcHRpb249RW5hYmxlIG9yIGRpc2FibGUgdXNlIG9mIEFOU0kgY29sb3JzCisKK2NsaS5vcHRpb24uZGVmaW5lLmRlc2NyaXB0aW9uPURlZmluZSBhIHN5c3RlbSBwcm9wZXJ0eQorCitjbGkub3B0aW9uLnRlcm1pbmFsLmRlc2NyaXB0aW9uPVNwZWNpZnkgdGhlIHRlcm1pbmFsIFRZUEUgdG8gdXNlCisKK2NsaS5pbmZvLnZlcnNpb249QHxncmVlbiBHcm9vdnkgU2hlbGx8IHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL1NoZWxsLmdyb292eSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL1NoZWxsLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTQ1ZGNhCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvU2hlbGwuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTIxIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsCisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLnV0aWwuTG9nZ2VyCisKKy8qKgorICogQSBzaW1wbGUgc2hlbGwgZm9yIGludm9raW5nIGNvbW1hbmRzIGZyb20gYSBjb21tYW5kLWxpbmUuCisgKgorICogQHZlcnNpb24gJElkJAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFzb25AcGxhbmV0NTcuY29tIj5KYXNvbiBEaWxsb248L2E+CisgKi8KK2NsYXNzIFNoZWxsCit7CisgICAgcHJvdGVjdGVkIGZpbmFsIExvZ2dlciBsb2cgPSBMb2dnZXIuY3JlYXRlKHRoaXMuY2xhc3MpCisKKyAgICBmaW5hbCBDb21tYW5kUmVnaXN0cnkgcmVnaXN0cnkgPSBuZXcgQ29tbWFuZFJlZ2lzdHJ5KCkKKworICAgIGZpbmFsIElPIGlvCisKKyAgICBTaGVsbChmaW5hbCBJTyBpbykgeworICAgICAgICBhc3NlcnQgaW8KKyAgICAgICAgCisgICAgICAgIHRoaXMuaW8gPSBpbworICAgIH0KKyAgICAKKyAgICBTaGVsbCgpIHsKKyAgICAgICAgdGhpcyhuZXcgSU8oKSkKKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIExpc3QgcGFyc2VMaW5lKGZpbmFsIFN0cmluZyBsaW5lKSB7CisgICAgICAgIGFzc2VydCBsaW5lICE9IG51bGwKKyAgICAgICAgCisgICAgICAgIHJldHVybiBsaW5lLnRyaW0oKS50b2tlbml6ZSgpCisgICAgfQorICAgIAorICAgIENvbW1hbmQgZmluZENvbW1hbmQoZmluYWwgU3RyaW5nIGxpbmUpIHsKKyAgICAgICAgYXNzZXJ0IGxpbmUKKyAgICAgICAgCisgICAgICAgIC8vCisgICAgICAgIC8vIFRPRE86IEludHJvZHVjZSBzb21ldGhpbmcgbGlrZSAnYm9vbGVhbiBDb21tYW5kLmFjY2VwdHMoU3RyaW5nKScgdG8gYXNrCisgICAgICAgIC8vICAgICAgIGNvbW1hbmRzIGlmIHRoZXkgY2FuIHRha2UgdGhlIGxpbmU/CisgICAgICAgIC8vCisgICAgICAgIC8vICAgICAgIFdvdWxkIGxpa2UgdG8gZ2V0ICchNjYnIHRvIGludm9rZSB0aGUgJ2hpc3RvcnkgcmVjYWxsJyBiaXRzLCBidXQgY3VycmVudGx5IGhhcworICAgICAgICAvLyAgICAgICB0byBiZSAnISA2NicgZm9yIGl0IHRvIHdvcmsgd2l0aCBhbiBhbGlhcyBsaWtlOgorICAgICAgICAvLworICAgICAgICAvLyAgICAgICAgICAgYWxpYXMgISBoaXN0b3J5IHJlY2FsbAorICAgICAgICAvLworICAgICAgICAvLyAgICAgICBPciBtYXliZSBhbGxvdyBjb21tYW5kcyB0byByZWdpc3RlciBzcGVjaWZpYyBzeW50YXggaGFja3MgaW50byB0aGUgcmVnaXN0cnk/CisgICAgICAgIC8vICAgICAgIHRoZW4gYXNrIHRoZSByZWdpc3RyeSBmb3IgdGhlIGNvbW1hbmQgZm9yIGEgZ2l2ZW4gbGluZT8KKyAgICAgICAgLy8KKyAgICAgICAgCisgICAgICAgIGRlZiBhcmdzID0gcGFyc2VMaW5lKGxpbmUpCisgICAgICAgIAorICAgICAgICBhc3NlcnQgYXJncy5zaXplKCkgPiAwCisgICAgICAgIAorICAgICAgICBkZWYgbmFtZSA9IGFyZ3NbMF0KKyAgICAgICAgCisgICAgICAgIGRlZiBjb21tYW5kID0gcmVnaXN0cnlbbmFtZV0KKyAgICAgICAgCisgICAgICAgIHJldHVybiBjb21tYW5kCisgICAgfQorICAgIAorICAgIGJvb2xlYW4gaXNFeGVjdXRhYmxlKGZpbmFsIFN0cmluZyBsaW5lKSB7CisgICAgICAgIHJldHVybiBmaW5kQ29tbWFuZChsaW5lKSAhPSBudWxsCisgICAgfQorICAgIAorICAgIE9iamVjdCBleGVjdXRlKGZpbmFsIFN0cmluZyBsaW5lKSB7CisgICAgICAgIGFzc2VydCBsaW5lCisgICAgICAgIAorICAgICAgICBkZWYgY29tbWFuZCA9IGZpbmRDb21tYW5kKGxpbmUpCisgICAgICAgIAorICAgICAgICBkZWYgcmVzdWx0ID0gbnVsbAorICAgICAgICAKKyAgICAgICAgaWYgKGNvbW1hbmQpIHsKKyAgICAgICAgICAgIGRlZiBhcmdzID0gcGFyc2VMaW5lKGxpbmUpCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChhcmdzLnNpemUoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgYXJncyA9IFtdCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBhcmdzID0gYXJnc1sxLi4tMV0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgbG9nLmRlYnVnKCJFeGVjdXRpbmcgY29tbWFuZCgkY29tbWFuZC5uYW1lKTogJGNvbW1hbmQ7IHcvYXJnczogJGFyZ3MiKQorICAgICAgICAgICAgCisgICAgICAgICAgICByZXN1bHQgPSBjb21tYW5kLmV4ZWN1dGUoYXJncykKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmVzdWx0OiAke1N0cmluZy52YWx1ZU9mKHJlc3VsdCl9IikKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgIH0KKyAgICAKKyAgICBDb21tYW5kIHJlZ2lzdGVyKGZpbmFsIENvbW1hbmQgY29tbWFuZCkgeworICAgICAgICByZXR1cm4gcmVnaXN0cnkgPDwgY29tbWFuZAorICAgIH0KKyAgICAKKyAgICBkZWYgbGVmdFNoaWZ0KGZpbmFsIFN0cmluZyBsaW5lKSB7CisgICAgICAgIHJldHVybiBleGVjdXRlKGxpbmUpCisgICAgfQorICAgIAorICAgIAorICAgIGRlZiBsZWZ0U2hpZnQoZmluYWwgQ29tbWFuZCBjb21tYW5kKSB7CisgICAgICAgIHJldHVybiByZWdpc3Rlcihjb21tYW5kKQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL1NoZWxsUnVubmVyLmdyb292eSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL1NoZWxsUnVubmVyLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTE3NjI1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvU2hlbGxSdW5uZXIuZ3Jvb3Z5CkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwudXRpbC5Mb2dnZXIKKworLyoqCisgKiBTdXBwb3J0IGZvciBydW5uaW5nIGEge0BsaW5rIFNoZWxsfS4KKyAqCisgKiBAdmVyc2lvbiAkSWQkCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYXNvbkBwbGFuZXQ1Ny5jb20iPkphc29uIERpbGxvbjwvYT4KKyAqLworYWJzdHJhY3QgY2xhc3MgU2hlbGxSdW5uZXIKKyAgICBpbXBsZW1lbnRzIFJ1bm5hYmxlCit7CisgICAgcHJvdGVjdGVkIGZpbmFsIExvZ2dlciBsb2cgPSBMb2dnZXIuY3JlYXRlKHRoaXMuY2xhc3MpCisgICAgCisgICAgZmluYWwgU2hlbGwgc2hlbGwKKyAgICAKKyAgICBib29sZWFuIHJ1bm5pbmcgPSBmYWxzZQorICAgIAorICAgIGJvb2xlYW4gYnJlYWtPbk51bGwgPSB0cnVlCisgICAgCisgICAgQ2xvc3VyZSBlcnJvckhhbmRsZXIgPSB7IGUgLT4KKyAgICAgICAgbG9nLmRlYnVnKGUpCisgICAgICAgIAorICAgICAgICBydW5uaW5nID0gZmFsc2UKKyAgICB9CisgICAgCisgICAgU2hlbGxSdW5uZXIoZmluYWwgU2hlbGwgc2hlbGwpIHsKKyAgICAgICAgYXNzZXJ0IHNoZWxsCisgICAgICAgIAorICAgICAgICB0aGlzLnNoZWxsID0gc2hlbGwKKyAgICB9CisgICAgCisgICAgdm9pZCBydW4oKSB7CisgICAgICAgIGxvZy5kZWJ1ZygnUnVubmluZycpCisgICAgICAgIAorICAgICAgICBydW5uaW5nID0gdHJ1ZQorICAgICAgICAKKyAgICAgICAgd2hpbGUgKHJ1bm5pbmcpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcnVubmluZyA9IHdvcmsoKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4aXROb3RpZmljYXRpb24gbikgeworICAgICAgICAgICAgICAgIHRocm93IG4KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiV29yayBmYWlsZWQ6ICR0IikKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAoZXJyb3JIYW5kbGVyKSB7CisgICAgICAgICAgICAgICAgICAgIGVycm9ySGFuZGxlci5jYWxsKHQpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBsb2cuZGVidWcoJ0ZpbmlzaGVkJykKKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gd29yaygpIHsKKyAgICAgICAgZGVmIGxpbmUgPSByZWFkTGluZSgpCisgICAgICAgIAorICAgICAgICBpZiAobG9nLmRlYnVnRW5hYmxlZCkgeworICAgICAgICAgICAgbG9nLmRlYnVnKCJSZWFkIGxpbmU6ICRsaW5lIikKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gU3RvcCBvbiBudWxsIChtYXliZSkKKyAgICAgICAgaWYgKGxpbmUgPT0gbnVsbCAmJiBicmVha09uTnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlIC8vIHN0b3AgdGhlIGxvb3AKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gSW5nb3JlIGVtcHR5IGxpbmVzCisgICAgICAgIGlmIChsaW5lLnRyaW0oKS5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBkZWYgcmVzdWx0ID0gc2hlbGwgPDwgbGluZQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gdHJ1ZQorICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIHJlYWRMaW5lKCkKK30KKwpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvY29tbWFuZHMueG1sIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvY29tbWFuZHMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ODFmYjYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9jb21tYW5kcy54bWwKQEAgLTAsMCArMSw1MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyAgICBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisKKyAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLSAkSWQkIC0tPgorCis8Y29tbWFuZHM+CisgICAgPGNvbW1hbmQ+b3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5jb21tYW5kcy5IZWxwQ29tbWFuZDwvY29tbWFuZD4KKyAgICAKKyAgICA8Y29tbWFuZD5vcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLmNvbW1hbmRzLkV4aXRDb21tYW5kPC9jb21tYW5kPgorICAgIAorICAgIDxjb21tYW5kPm9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwuY29tbWFuZHMuSW1wb3J0Q29tbWFuZDwvY29tbWFuZD4KKyAgICAKKyAgICA8Y29tbWFuZD5vcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLmNvbW1hbmRzLkRpc3BsYXlDb21tYW5kPC9jb21tYW5kPgorICAgIAorICAgIDxjb21tYW5kPm9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwuY29tbWFuZHMuQ2xlYXJDb21tYW5kPC9jb21tYW5kPgorICAgIAorICAgIDxjb21tYW5kPm9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwuY29tbWFuZHMuU2hvd0NvbW1hbmQ8L2NvbW1hbmQ+CisgICAgCisgICAgPGNvbW1hbmQ+b3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5jb21tYW5kcy5JbnNwZWN0Q29tbWFuZDwvY29tbWFuZD4KKyAgICAKKyAgICA8Y29tbWFuZD5vcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLmNvbW1hbmRzLlB1cmdlQ29tbWFuZDwvY29tbWFuZD4KKyAgICAKKyAgICA8Y29tbWFuZD5vcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLmNvbW1hbmRzLkVkaXRDb21tYW5kPC9jb21tYW5kPgorICAgIAorICAgIDxjb21tYW5kPm9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwuY29tbWFuZHMuTG9hZENvbW1hbmQ8L2NvbW1hbmQ+CisgICAgCisgICAgPGNvbW1hbmQ+b3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5jb21tYW5kcy5TYXZlQ29tbWFuZDwvY29tbWFuZD4KKworICAgIDxjb21tYW5kPm9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwuY29tbWFuZHMuUmVjb3JkQ29tbWFuZDwvY29tbWFuZD4KKworICAgIDxjb21tYW5kPm9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwuY29tbWFuZHMuSGlzdG9yeUNvbW1hbmQ8L2NvbW1hbmQ+CisgICAgCisgICAgPGNvbW1hbmQ+b3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5jb21tYW5kcy5BbGlhc0NvbW1hbmQ8L2NvbW1hbmQ+CisgICAgCisgICAgPGNvbW1hbmQ+b3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5jb21tYW5kcy5TZXRDb21tYW5kPC9jb21tYW5kPgorICAgIAorICAgIDxjb21tYW5kPm9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwuY29tbWFuZHMuU2hhZG93Q29tbWFuZDwvY29tbWFuZD4KKzwvY29tbWFuZHM+CisKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL2NvbW1hbmRzL0FsaWFzQ29tbWFuZC5ncm9vdnkgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9jb21tYW5kcy9BbGlhc0NvbW1hbmQuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5YzZiYTEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9jb21tYW5kcy9BbGlhc0NvbW1hbmQuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTEyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLmNvbW1hbmRzCisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLkNvbW1hbmRTdXBwb3J0CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5TaGVsbAorCisvKioKKyAqIFRoZSAnYWxpYXMnIGNvbW1hbmQuCisgKgorICogQHZlcnNpb24gJElkJAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFzb25AcGxhbmV0NTcuY29tIj5KYXNvbiBEaWxsb248L2E+CisgKi8KK2NsYXNzIEFsaWFzQ29tbWFuZAorICAgIGV4dGVuZHMgQ29tbWFuZFN1cHBvcnQKK3sKKyAgICBBbGlhc0NvbW1hbmQoZmluYWwgU2hlbGwgc2hlbGwpIHsKKyAgICAgICAgc3VwZXIoc2hlbGwsICdhbGlhcycsICdcXGEnKQorICAgIH0KKworICAgIE9iamVjdCBleGVjdXRlKGZpbmFsIExpc3QgYXJncykgeworICAgICAgICBhc3NlcnQgYXJncyAhPSBudWxsCisgICAgICAgIAorICAgICAgICBpZiAoYXJncy5zaXplKCkgPCAyKSB7CisgICAgICAgICAgICBmYWlsKCJDb21tYW5kICdhbGlhcycgcmVxdWlyZXMgYXQgbGVhc3QgMiBhcmd1bWVudHMiKSAvLyBUT0RPOiBpMThuCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIFN0cmluZyBuYW1lID0gYXJnc1swXQorICAgICAgICBMaXN0IHRhcmdldCA9IGFyZ3NbMS4uLTFdCisgICAgICAgIAorICAgICAgICBkZWYgY29tbWFuZCA9IHJlZ2lzdHJ5W25hbWVdCisgICAgICAgIAorICAgICAgICBpZiAoY29tbWFuZCkgeworICAgICAgICAgICAgaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBBbGlhc1RhcmdldFByb3h5Q29tbWFuZCkgeworICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmViaW5kaW5nIGFsaWFzOiAkbmFtZSIpCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgcmVnaXN0cnkucmVtb3ZlKGNvbW1hbmQpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJDYW4gbm90IHJlYmluZCBub24tdXNlciBhbGlhc2VkIGNvbW1hbmQ6ICR7Y29tbWFuZC5uYW1lfSIpIC8vIFRPRE86IGkxOG4KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgbG9nLmRlYnVnKCJDcmVhdGluZyBhbGlhcyAnJG5hbWUnIHRvOiAkdGFyZ2V0IikKKyAgICAgICAgCisgICAgICAgIC8vIFJlZ2lzdGVyIHRoZSBjb21tYW5kCisgICAgICAgIGNvbW1hbmQgPSBzaGVsbCA8PCBuZXcgQWxpYXNUYXJnZXRQcm94eUNvbW1hbmQoc2hlbGwsIG5hbWUsIHRhcmdldCkKKyAgICAgICAgCisgICAgICAgIC8vCisgICAgICAgIC8vIFRPRE86IFNob3VsZCB0aGlzIGJlIGhlcmUuLi4gb3Igc2hvdWxkIHRoaXMgYmUgaW4gdGhlIFNoZWxsJ3MgaW1wbD8KKyAgICAgICAgLy8KKyAgICAgICAgCisgICAgICAgIC8vIFRyeSB0byBpbnN0YWxsIHRoZSBjb21wbGV0b3IKKyAgICAgICAgaWYgKHNoZWxsLnJ1bm5lcikgeworICAgICAgICAgICAgc2hlbGwucnVubmVyLmNvbXBsZXRvciA8PCBjb21tYW5kCisgICAgICAgIH0KKyAgICB9Cit9CisKK2NsYXNzIEFsaWFzVGFyZ2V0UHJveHlDb21tYW5kCisgICAgZXh0ZW5kcyBDb21tYW5kU3VwcG9ydAoreworICAgIHByaXZhdGUgc3RhdGljIGludCBjb3VudGVyID0gMAorICAgIAorICAgIGZpbmFsIExpc3QgYXJncworICAgIAorICAgIEFsaWFzVGFyZ2V0UHJveHlDb21tYW5kKGZpbmFsIFNoZWxsIHNoZWxsLCBmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgTGlzdCBhcmdzKSB7CisgICAgICAgIHN1cGVyKHNoZWxsLCBuYW1lLCAnXFxhJyArIGNvdW50ZXIrKykKKyAgICAgICAgCisgICAgICAgIGFzc2VydCBhcmdzCisgICAgICAgIAorICAgICAgICB0aGlzLmFyZ3MgPSBhcmdzCisgICAgfQorICAgIAorICAgIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKyAgICAgICAgcmV0dXJuICJVc2VyIGRlZmluZWQgYWxpYXMgdG86IEB8Ym9sZCAke2FyZ3Muam9pbignICcpfXwiCisgICAgfQorCisgICAgU3RyaW5nIGdldFVzYWdlKCkgeworICAgICAgICByZXR1cm4gJycKKyAgICB9CisgICAgCisgICAgU3RyaW5nIGdldEhlbHAoKSB7CisgICAgICAgIHJldHVybiBkZXNjcmlwdGlvbgorICAgIH0KKyAgICAKKyAgICBPYmplY3QgZXhlY3V0ZShMaXN0IGFyZ3MpIHsKKyAgICAgICAgYXJncyA9IHRoaXMuYXJncyArIGFyZ3MKKyAgICAgICAgCisgICAgICAgIGxvZy5kZWJ1ZygiRXhlY3V0aW5nIHdpdGggYXJnczogJGFyZ3MiKQorICAgICAgICAKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRklYTUU6IFNob3VsZCBnbyBiYWNrIHRocm91Z2ggc2hlbGwuZXhlY3V0ZSgpIHRvIGFsbG93IGFsaWFzZXMgdG8gZ3Jvb3Z5IHNuaXBzIHRvbworICAgICAgICAvLworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHNoZWxsLmV4ZWN1dGVDb21tYW5kKGFyZ3Muam9pbignICcpKQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL2NvbW1hbmRzL0FsaWFzQ29tbWFuZC5wcm9wZXJ0aWVzIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvY29tbWFuZHMvQWxpYXNDb21tYW5kLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E2ZDRmYQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL2NvbW1hbmRzL0FsaWFzQ29tbWFuZC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjQgQEAKKyMKKyMgQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIworIyAkSWQkCisjCisKK2NvbW1hbmQuZGVzY3JpcHRpb249Q3JlYXRlIGFuIGFsaWFzCitjb21tYW5kLnVzYWdlPQorY29tbWFuZC5oZWxwPUNyZWF0ZSBhbiBhbGlhcy4KKwpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvY29tbWFuZHMvQ2xlYXJDb21tYW5kLmdyb292eSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL2NvbW1hbmRzL0NsZWFyQ29tbWFuZC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZlODI1ZgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL2NvbW1hbmRzL0NsZWFyQ29tbWFuZC5ncm9vdnkKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5jb21tYW5kcworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5Db21tYW5kU3VwcG9ydAoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwuU2hlbGwKKworLyoqCisgKiBUaGUgJ2NsZWFyJyBjb21tYW5kLgorICoKKyAqIEB2ZXJzaW9uICRJZCQKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphc29uQHBsYW5ldDU3LmNvbSI+SmFzb24gRGlsbG9uPC9hPgorICovCitjbGFzcyBDbGVhckNvbW1hbmQKKyAgICBleHRlbmRzIENvbW1hbmRTdXBwb3J0Cit7CisgICAgQ2xlYXJDb21tYW5kKGZpbmFsIFNoZWxsIHNoZWxsKSB7CisgICAgICAgIHN1cGVyKHNoZWxsLCAnY2xlYXInLCAnXFxjJykKKyAgICB9CisgICAgCisgICAgT2JqZWN0IGV4ZWN1dGUoZmluYWwgTGlzdCBhcmdzKSB7CisgICAgICAgIGFzc2VydE5vQXJndW1lbnRzKGFyZ3MpCisgICAgICAgIAorICAgICAgICBidWZmZXIuY2xlYXIoKQorCisgICAgICAgIGlmIChpby52ZXJib3NlKSB7CisgICAgICAgICAgICBpby5vdXQucHJpbnRsbignQnVmZmVyIGNsZWFyZWQnKSAvLyAgVE9ETzogaTE4bgorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvY29tbWFuZHMvQ2xlYXJDb21tYW5kLnByb3BlcnRpZXMgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9jb21tYW5kcy9DbGVhckNvbW1hbmQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTc1ZTVmCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvY29tbWFuZHMvQ2xlYXJDb21tYW5kLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyNCBAQAorIworIyBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjCisjICRJZCQKKyMKKworY29tbWFuZC5kZXNjcmlwdGlvbj1DbGVhciB0aGUgYnVmZmVyCitjb21tYW5kLnVzYWdlPQorY29tbWFuZC5oZWxwPUNsZWFyIHRoZSBjdXJyZW50IGJ1ZmZlci4KKwpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvY29tbWFuZHMvRGlzcGxheUNvbW1hbmQuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvY29tbWFuZHMvRGlzcGxheUNvbW1hbmQuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNzg1ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9jb21tYW5kcy9EaXNwbGF5Q29tbWFuZC5ncm9vdnkKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5jb21tYW5kcworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5Db21tYW5kU3VwcG9ydAoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwuU2hlbGwKKworLyoqCisgKiBUaGUgJ2Rpc3BsYXknIGNvbW1hbmQuCisgKgorICogQHZlcnNpb24gJElkJAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFzb25AcGxhbmV0NTcuY29tIj5KYXNvbiBEaWxsb248L2E+CisgKi8KK2NsYXNzIERpc3BsYXlDb21tYW5kCisgICAgZXh0ZW5kcyBDb21tYW5kU3VwcG9ydAoreworICAgIERpc3BsYXlDb21tYW5kKGZpbmFsIFNoZWxsIHNoZWxsKSB7CisgICAgICAgIHN1cGVyKHNoZWxsLCAnZGlzcGxheScsICdcXGQnKQorICAgIH0KKworICAgIE9iamVjdCBleGVjdXRlKGZpbmFsIExpc3QgYXJncykgeworICAgICAgICBhc3NlcnROb0FyZ3VtZW50cyhhcmdzKQorICAgICAgICAKKyAgICAgICAgaWYgKGJ1ZmZlci5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGlvLm91dC5wcmludGxuKCdCdWZmZXIgaXMgZW1wdHknKSAvLyBUT0RPOiBpMThuCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzaGVsbC5kaXNwbGF5QnVmZmVyKGJ1ZmZlcikKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL2NvbW1hbmRzL0Rpc3BsYXlDb21tYW5kLnByb3BlcnRpZXMgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9jb21tYW5kcy9EaXNwbGF5Q29tbWFuZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZGVlZGYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9jb21tYW5kcy9EaXNwbGF5Q29tbWFuZC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjQgQEAKKyMKKyMgQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIworIyAkSWQkCisjCisKK2NvbW1hbmQuZGVzY3JpcHRpb249RGlzcGxheSB0aGUgY3VycmVudCBidWZmZXIKK2NvbW1hbmQudXNhZ2U9Citjb21tYW5kLmhlbHA9RGlzcGxheSB0aGUgY29udGVudHMgb2YgdGhlIGN1cnJlbnQgYnVmZmVyLgorCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9jb21tYW5kcy9FZGl0Q29tbWFuZC5ncm9vdnkgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9jb21tYW5kcy9FZGl0Q29tbWFuZC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZhMDMzYQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL2NvbW1hbmRzL0VkaXRDb21tYW5kLmdyb292eQpAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLmNvbW1hbmRzCisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLkNvbW1hbmRTdXBwb3J0CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5TaGVsbAorCisvKioKKyAqIFRoZSAnZWRpdCcgY29tbWFuZC4KKyAqCisgKiBAdmVyc2lvbiAkSWQkCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYXNvbkBwbGFuZXQ1Ny5jb20iPkphc29uIERpbGxvbjwvYT4KKyAqLworY2xhc3MgRWRpdENvbW1hbmQKKyAgICBleHRlbmRzIENvbW1hbmRTdXBwb3J0Cit7CisgICAgRWRpdENvbW1hbmQoZmluYWwgU2hlbGwgc2hlbGwpIHsKKyAgICAgICAgc3VwZXIoc2hlbGwsICdlZGl0JywgJ1xcZScpCisgICAgfQorICAgIAorICAgIHByaXZhdGUgU3RyaW5nIGdldEVkaXRvckNvbW1hbmQoKSB7CisgICAgICAgIGRlZiBlZGl0b3IgPSBTeXN0ZW0uZ2V0ZW52KCdFRElUT1InKQorICAgICAgICAKKyAgICAgICAgaWYgKCFlZGl0b3IpIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBUT0RPOiBNYXliZSBwb3B1cCBhIFN3aW5nIGVkaXRvciBoZXJlPyAgT3IgbG9vayBmb3Igb3RoZXIgZW52IHZhcnM/ICBPciB1c2Ugbm90ZXBhZCBvbiB3aW5ibG93cz8KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZhaWwoIlVuYWJsZSB0byBkZXRlcm1pbmUgd2hpY2ggZWRpdG9yIHRvIHVzZTsgY2hlY2sgXCRFRElUT1IiKSAvLyBUT0RPOiBpMThuCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiBlZGl0b3IKKyAgICB9CisgICAgCisgICAgT2JqZWN0IGV4ZWN1dGUoZmluYWwgTGlzdCBhcmdzKSB7CisgICAgICAgIGFzc2VydE5vQXJndW1lbnRzKGFyZ3MpCisgICAgICAgIAorICAgICAgICBkZWYgZmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoJ2dyb292eXNoLWJ1ZmZlcicsICcuZ3Jvb3Z5JykKKyAgICAgICAgZmlsZS5kZWxldGVPbkV4aXQoKQorICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIFdyaXRlIHRoZSBjdXJyZW50IGJ1ZmZlciB0byBhIHRtcCBmaWxlCisgICAgICAgICAgICBmaWxlLndyaXRlKGJ1ZmZlci5qb2luKE5FV0xJTkUpKQorICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBUcnkgdG8gbGF1bmNoIHRoZSBlZGl0b3IKKyAgICAgICAgICAgIGRlZiBjbWQgPSAiJGVkaXRvckNvbW1hbmQgJGZpbGUiCisgICAgICAgICAgICBsb2cuZGVidWcoIkV4ZWN1dGluZzogJGNtZCIpCisgICAgICAgICAgICBkZWYgcCA9IGNtZC5leGVjdXRlKCkKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gV2FpdCBmb3IgaXQgdG8gZmluaXNoZQorICAgICAgICAgICAgbG9nLmRlYnVnKCJXYWl0aW5nIGZvciBwcm9jZXNzOiAkcCIpCisgICAgICAgICAgICBwLndhaXRGb3IoKQorICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBMb2FkIHRoZSBuZXcgbGluZXMuLi4KKyAgICAgICAgICAgIGZpbGUuZWFjaExpbmUgeworICAgICAgICAgICAgICAgIHNoZWxsIDw8IGl0CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgICBmaWxlLmRlbGV0ZSgpCisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9jb21tYW5kcy9FZGl0Q29tbWFuZC5wcm9wZXJ0aWVzIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvY29tbWFuZHMvRWRpdENvbW1hbmQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTU5N2I3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvY29tbWFuZHMvRWRpdENvbW1hbmQucHJvcGVydGllcwpAQCAtMCwwICsxLDIzIEBACisjCisjIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMKKyMgJElkJAorIworCitjb21tYW5kLmRlc2NyaXB0aW9uPUVkaXQgdGhlIGN1cnJlbnQgYnVmZmVyCitjb21tYW5kLnVzYWdlPQorY29tbWFuZC5oZWxwPUVkaXQgdGhlIGN1cnJlbnQgYnVmZmVyLgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvY29tbWFuZHMvRXhpdENvbW1hbmQuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvY29tbWFuZHMvRXhpdENvbW1hbmQuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMWU1NTYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9jb21tYW5kcy9FeGl0Q29tbWFuZC5ncm9vdnkKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5jb21tYW5kcworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5Db21tYW5kU3VwcG9ydAoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwuU2hlbGwKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLkV4aXROb3RpZmljYXRpb24KKworLyoqCisgKiBUaGUgJ2V4aXQnIGNvbW1hbmQuCisgKgorICogQHZlcnNpb24gJElkJAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFzb25AcGxhbmV0NTcuY29tIj5KYXNvbiBEaWxsb248L2E+CisgKi8KK2NsYXNzIEV4aXRDb21tYW5kCisgICAgZXh0ZW5kcyBDb21tYW5kU3VwcG9ydAoreworICAgIEV4aXRDb21tYW5kKGZpbmFsIFNoZWxsIHNoZWxsKSB7CisgICAgICAgIHN1cGVyKHNoZWxsLCAnZXhpdCcsICdcXHgnKQorCisgICAgICAgIGFsaWFzKCdxdWl0JywgJ1xccScpCisgICAgfQorCisgICAgT2JqZWN0IGV4ZWN1dGUoZmluYWwgTGlzdCBhcmdzKSB7CisgICAgICAgIGFzc2VydE5vQXJndW1lbnRzKGFyZ3MpCisgICAgICAgIAorICAgICAgICAvLworICAgICAgICAvLyBUT0RPOiBNYXliZSBzdXBwb3J0IGEgc2luZ2xlIGFyZyBmb3IgdGhlIGNvZGU/CisgICAgICAgIC8vCisgICAgICAgIAorICAgICAgICBpZiAoaW8udmVyYm9zZSkgeworICAgICAgICAgICAgaW8ub3V0LnByaW50bG4obWVzc2FnZXNbJ2luZm8uYnllJ10pCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHRocm93IG5ldyBFeGl0Tm90aWZpY2F0aW9uKDApCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvY29tbWFuZHMvRXhpdENvbW1hbmQucHJvcGVydGllcyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL2NvbW1hbmRzL0V4aXRDb21tYW5kLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ5NDYyYgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL2NvbW1hbmRzL0V4aXRDb21tYW5kLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyNiBAQAorIworIyBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjCisjICRJZCQKKyMKKworY29tbWFuZC5kZXNjcmlwdGlvbj1FeGl0IHRoZSBzaGVsbAorY29tbWFuZC51c2FnZT0KK2NvbW1hbmQuaGVscD1FeGl0IHRoZSBzaGVsbC4KKworaW5mby5ieWU9QnllIQorCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9jb21tYW5kcy9IZWxwQ29tbWFuZC5ncm9vdnkgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9jb21tYW5kcy9IZWxwQ29tbWFuZC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZjY2Y0ZgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL2NvbW1hbmRzL0hlbHBDb21tYW5kLmdyb292eQpAQCAtMCwwICsxLDE1OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5jb21tYW5kcworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5Db21tYW5kU3VwcG9ydAoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwuQ29tbWFuZAoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwuU2hlbGwKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLkNvbW1hbmRSZWdpc3RyeQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwudXRpbC5TaW1wbGVDb21wbGV0b3IKKworLyoqCisgKiBUaGUgJ2hlbHAnIGNvbW1hbmQuCisgKgorICogQHZlcnNpb24gJElkJAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFzb25AcGxhbmV0NTcuY29tIj5KYXNvbiBEaWxsb248L2E+CisgKi8KK2NsYXNzIEhlbHBDb21tYW5kCisgICAgZXh0ZW5kcyBDb21tYW5kU3VwcG9ydAoreworICAgIEhlbHBDb21tYW5kKGZpbmFsIFNoZWxsIHNoZWxsKSB7CisgICAgICAgIHN1cGVyKHNoZWxsLCAnaGVscCcsICdcXGgnKQorCisgICAgICAgIGFsaWFzKCc/JywgJ1xcPycpCisgICAgfQorCisgICAgcHJvdGVjdGVkIExpc3QgY3JlYXRlQ29tcGxldG9ycygpIHsKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgIG5ldyBIZWxwQ29tbWFuZENvbXBsZXRvcihyZWdpc3RyeSksCisgICAgICAgICAgICBudWxsCisgICAgICAgIF0KKyAgICB9CisKKyAgICBPYmplY3QgZXhlY3V0ZShmaW5hbCBMaXN0IGFyZ3MpIHsKKyAgICAgICAgYXNzZXJ0IGFyZ3MgIT0gbnVsbAorCisgICAgICAgIGlmIChhcmdzLnNpemUoKSA+IDEpIHsKKyAgICAgICAgICAgIGZhaWwobWVzc2FnZXMuZm9ybWF0KCdlcnJvci51bmV4cGVjdGVkX2FyZ3MnLCBhcmdzLmpvaW4oJyAnKSkpCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChhcmdzLnNpemUoKSA9PSAxKSB7CisgICAgICAgICAgICBoZWxwKGFyZ3NbMF0pCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBsaXN0KCkKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBoZWxwKGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIGFzc2VydCBuYW1lCisgICAgICAgIAorICAgICAgICBDb21tYW5kIGNvbW1hbmQgPSByZWdpc3RyeVtuYW1lXQorICAgICAgICBpZiAoIWNvbW1hbmQpIHsKKyAgICAgICAgICAgIGZhaWwoIk5vIHN1Y2ggY29tbWFuZDogJG5hbWUiKSAvLyBUT0RPOiBpMThuCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlvLm91dC5wcmludGxuKCkKKyAgICAgICAgaW8ub3V0LnByaW50bG4oInVzYWdlOiBAfGJvbGQgJHtjb21tYW5kLm5hbWV9fCAkY29tbWFuZC51c2FnZSIpIC8vIFRPRE86IGkxOG4KKyAgICAgICAgaW8ub3V0LnByaW50bG4oKQorICAgICAgICBpby5vdXQucHJpbnRsbihjb21tYW5kLmhlbHApCisgICAgICAgIGlvLm91dC5wcmludGxuKCkKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbGlzdCgpIHsKKyAgICAgICAgLy8gRmlndXJlIG91dCB0aGUgbWF4IGNvbW1hbmQgbmFtZSBhbmQgc2hvcnRjdXQgbGVuZ3RoIGR5bmFtaWNhbGx5CisgICAgICAgIGludCBtYXhOYW1lID0gMAorICAgICAgICBpbnQgbWF4U2hvcnRjdXQKKyAgICAgICAgCisgICAgICAgIGZvciAoY29tbWFuZCBpbiByZWdpc3RyeSkgeworICAgICAgICAgICAgaWYgKGNvbW1hbmQuaGlkZGVuKSB7CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGNvbW1hbmQubmFtZS5zaXplKCkgPiBtYXhOYW1lKSB7CisgICAgICAgICAgICAgICAgbWF4TmFtZSA9IGNvbW1hbmQubmFtZS5zaXplKCkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGNvbW1hbmQuc2hvcnRjdXQuc2l6ZSgpID4gbWF4U2hvcnRjdXQpIHsKKyAgICAgICAgICAgICAgICBtYXhTaG9ydGN1dCA9IGNvbW1hbmQuc2hvcnRjdXQuc2l6ZSgpCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlvLm91dC5wcmludGxuKCkKKyAgICAgICAgaW8ub3V0LnByaW50bG4oJ0ZvciBpbmZvcm1hdGlvbiBhYm91dCBAfGdyZWVuIEdyb292eXwsIHZpc2l0OicpIC8vIFRPRE86IGkxOG4KKyAgICAgICAgaW8ub3V0LnByaW50bG4oJyAgICBAfGN5YW4gaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmd8ICcpIC8vIEZJWE1FOiBwYXJzaW5nIGZyZWFrcyBvdXQgaWYgZW5kIHRvayBpcyBhdCB0aGUgbGFzdCBjaGFyLi4uCisgICAgICAgIGlvLm91dC5wcmludGxuKCkKKworICAgICAgICAvLyBMaXN0IHRoZSBjb21tYW5kcyB3ZSBrbm93IGFib3V0CisgICAgICAgIGlvLm91dC5wcmludGxuKCdBdmFpbGFibGUgY29tbWFuZHM6JykgLy8gVE9ETzogaTE4bgorCisgICAgICAgIGZvciAoY29tbWFuZCBpbiByZWdpc3RyeSkgeworICAgICAgICAgICAgaWYgKGNvbW1hbmQuaGlkZGVuKSB7CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgZGVmIG4gPSBjb21tYW5kLm5hbWUucGFkUmlnaHQobWF4TmFtZSwgJyAnKQorICAgICAgICAgICAgZGVmIHMgPSBjb21tYW5kLnNob3J0Y3V0LnBhZFJpZ2h0KG1heFNob3J0Y3V0LCAnICcpCisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBUT0RPOiBXcmFwIGRlc2NyaXB0aW9uIGlmIG5lZWRlZAorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIAorICAgICAgICAgICAgZGVmIGQgPSBjb21tYW5kLmRlc2NyaXB0aW9uCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlvLm91dC5wcmludGxuKCIgIEB8Ym9sZCAke259fCAgKEB8Ym9sZCAke3N9fCkgJGQiKQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpby5vdXQucHJpbnRsbigpCisgICAgICAgIGlvLm91dC5wcmludGxuKCdGb3IgaGVscCBvbiBhIHNwZWNpZmljIGNvbW1hbmQgdHlwZTonKSAvLyBUT0RPOiBpMThuCisgICAgICAgIGlvLm91dC5wcmludGxuKCcgICAgaGVscCBAfGJvbGQgY29tbWFuZHwgJykKKyAgICAgICAgaW8ub3V0LnByaW50bG4oKQorICAgIH0KK30KKworLyoqCisgKiBDb21wbGV0b3IgZm9yIHRoZSAnaGVscCcgY29tbWFuZC4KKyAqCisgKiBAdmVyc2lvbiAkSWQkCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYXNvbkBwbGFuZXQ1Ny5jb20iPkphc29uIERpbGxvbjwvYT4KKyAqLworY2xhc3MgSGVscENvbW1hbmRDb21wbGV0b3IKKyAgICBleHRlbmRzIFNpbXBsZUNvbXBsZXRvcgoreworICAgIHByaXZhdGUgZmluYWwgQ29tbWFuZFJlZ2lzdHJ5IHJlZ2lzdHJ5CisKKyAgICBIZWxwQ29tbWFuZENvbXBsZXRvcihmaW5hbCBDb21tYW5kUmVnaXN0cnkgcmVnaXN0cnkpIHsKKyAgICAgICAgYXNzZXJ0IHJlZ2lzdHJ5CisKKyAgICAgICAgdGhpcy5yZWdpc3RyeSA9IHJlZ2lzdHJ5CisgICAgfQorCisgICAgU29ydGVkU2V0IGdldENhbmRpZGF0ZXMoKSB7CisgICAgICAgIGRlZiBzZXQgPSBuZXcgVHJlZVNldCgpCisKKyAgICAgICAgZm9yIChjb21tYW5kIGluIHJlZ2lzdHJ5KSB7CisgICAgICAgICAgICBpZiAoY29tbWFuZC5oaWRkZW4pIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBzZXQgPDwgY29tbWFuZC5uYW1lCisgICAgICAgICAgICBzZXQgPDwgY29tbWFuZC5zaG9ydGN1dAorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNldAorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9jb21tYW5kcy9IZWxwQ29tbWFuZC5wcm9wZXJ0aWVzIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvY29tbWFuZHMvSGVscENvbW1hbmQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWRjZGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvY29tbWFuZHMvSGVscENvbW1hbmQucHJvcGVydGllcwpAQCAtMCwwICsxLDIzIEBACisjCisjIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMKKyMgJElkJAorIworCitjb21tYW5kLmRlc2NyaXB0aW9uPURpc3BsYXkgdGhpcyBoZWxwIG1lc3NhZ2UKK2NvbW1hbmQudXNhZ2U9Wzxjb21tYW5kPl0KK2NvbW1hbmQuaGVscD1EaXNwbGF5IHRoZSBsaXN0IG9mIGNvbW1hbmRzIG9yIHRoZSBoZWxwIHRleHQgZm9yIEB8Qk9MRCBjb21tYW5kfC4KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL2NvbW1hbmRzL0hpc3RvcnlDb21tYW5kLmdyb292eSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL2NvbW1hbmRzL0hpc3RvcnlDb21tYW5kLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzE1OTg1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvY29tbWFuZHMvSGlzdG9yeUNvbW1hbmQuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLmNvbW1hbmRzCisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLkNvbXBsZXhDb21tYW5kU3VwcG9ydAoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwuU2hlbGwKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwudXRpbC5TaW1wbGVDb21wbGV0b3IKKworLyoqCisgKiBUaGUgJ2hpc3RvcnknIGNvbW1hbmQuCisgKgorICogQHZlcnNpb24gJElkJAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFzb25AcGxhbmV0NTcuY29tIj5KYXNvbiBEaWxsb248L2E+CisgKi8KK2NsYXNzIEhpc3RvcnlDb21tYW5kCisgICAgZXh0ZW5kcyBDb21wbGV4Q29tbWFuZFN1cHBvcnQKK3sKKyAgICBIaXN0b3J5Q29tbWFuZChmaW5hbCBTaGVsbCBzaGVsbCkgeworICAgICAgICBzdXBlcihzaGVsbCwgJ2hpc3RvcnknLCAnXFxIJykKKyAgICAgICAgCisgICAgICAgIHRoaXMuZnVuY3Rpb25zID0gWyAnc2hvdycsICdjbGVhcicsICdmbHVzaCcsICdyZWNhbGwnIF0KKyAgICAgICAgCisgICAgICAgIHRoaXMuZGVmYXVsdEZ1bmN0aW9uID0gJ3Nob3cnCisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCBMaXN0IGNyZWF0ZUNvbXBsZXRvcnMoKSB7CisgICAgICAgIGRlZiBsb2FkZXIgPSB7CisgICAgICAgICAgICBkZWYgbGlzdCA9IFtdCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZ1bmN0aW9ucy5lYWNoIHsgbGlzdCA8PCBpdCB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJldHVybiBsaXN0CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICBuZXcgU2ltcGxlQ29tcGxldG9yKGxvYWRlciksCisgICAgICAgICAgICBudWxsCisgICAgICAgIF0KKyAgICB9CisgICAgCisgICAgT2JqZWN0IGV4ZWN1dGUoTGlzdCBhcmdzKSB7CisgICAgICAgIGlmICghaGlzdG9yeSkgeworICAgICAgICAgICAgZmFpbCgiU2hlbGwgZG9lcyBub3QgYXBwZWFyIHRvIGJlIGludGVyYWN0aXZlOyBDYW4gbm90IHF1ZXJ5IGhpc3RvcnkiKQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBzdXBlci5leGVjdXRlKGFyZ3MpCisKKyAgICAgICAgLy8gRG9uJ3QgcmV0dXJuIGFueXRoaW5nCisgICAgICAgIHJldHVybiBudWxsCisgICAgfQorICAgIAorICAgIGRlZiBkb19zaG93ID0geworICAgICAgICBoaXN0b3J5Lmhpc3RvcnlMaXN0LmVhY2hXaXRoSW5kZXggeyBpdGVtLCBpIC0+CisgICAgICAgICAgICBpID0gaS50b1N0cmluZygpLnBhZExlZnQoMywgJyAnKQorICAgICAgICAgICAgCisgICAgICAgICAgICBpby5vdXQucHJpbnRsbigiIEB8Ym9sZCAkaXwgICRpdGVtIikKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBkZWYgZG9fY2xlYXIgPSB7CisgICAgICAgIGhpc3RvcnkuY2xlYXIoKQorICAgICAgICAKKyAgICAgICAgaWYgKGlvLnZlcmJvc2UpIHsKKyAgICAgICAgICAgIGlvLm91dC5wcmludGxuKCdIaXN0b3J5IGNsZWFyZWQnKQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIGRlZiBkb19mbHVzaCA9IHsKKyAgICAgICAgaGlzdG9yeS5mbHVzaEJ1ZmZlcigpCisgICAgICAgIAorICAgICAgICBpZiAoaW8udmVyYm9zZSkgeworICAgICAgICAgICAgaW8ub3V0LnByaW50bG4oJ0hpc3RvcnkgZmx1c2hlZCcpCisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgZGVmIGRvX3JlY2FsbCA9IHsgYXJncyAtPgorICAgICAgICBkZWYgbGluZQorICAgICAgICAKKyAgICAgICAgaWYgKGFyZ3Muc2l6ZSgpICE9IDEpIHsKKyAgICAgICAgICAgIGZhaWwoIkhpc3RvcnkgcmVjYWxsIHJlcXVpcmVzIGEgc2luZ2xlIGhpc3RvcnkgaWRlbnRpZmVyIikKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgZGVmIGlkID0gYXJnc1swXQorCisgICAgICAgIC8vCisgICAgICAgIC8vIEZJWE1FOiBUaGlzIHdvbid0IHdvcmsgYXMgZGVzaXJlZCBiZWNhdXNlIHRoZSBoaXN0b3J5IHNoaWZ0cyB3aGVuIHdlIHJ1biByZWNhbGwgYW5kIGNvdWxkIGludGVybmFsbHkgc2hpZnQgbW9yZSBmcm9tIGFsaWFzIHJlZGlyZWN0aW9uCisgICAgICAgIC8vCisgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgaWQgPSBJbnRlZ2VyLnBhcnNlSW50KGlkKQorICAgICAgICAgICAgCisgICAgICAgICAgICBsaW5lID0gaGlzdG9yeS5oaXN0b3J5TGlzdFtpZF0KKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkludmFsaWQgaGlzdG9yeSBpZGVudGlmaWVyOiAkaWQiLCBlKQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBsb2cuZGVidWcoIlJlY2FsbGluZyBoaXN0b3J5IGl0ZW0gIyRpZDogJGxpbmUiKQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIHNoZWxsLmV4ZWN1dGUobGluZSkKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9jb21tYW5kcy9IaXN0b3J5Q29tbWFuZC5wcm9wZXJ0aWVzIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvY29tbWFuZHMvSGlzdG9yeUNvbW1hbmQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGZiZjhhCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvY29tbWFuZHMvSGlzdG9yeUNvbW1hbmQucHJvcGVydGllcwpAQCAtMCwwICsxLDIzIEBACisjCisjIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMKKyMgJElkJAorIworCitjb21tYW5kLmRlc2NyaXB0aW9uPURpc3BsYXksIG1hbmFnZSBhbmQgcmVjYWxsIGVkaXQtbGluZSBoaXN0b3J5Citjb21tYW5kLnVzYWdlPVtzaG93fGNsZWFyfGZsdXNofHJlY2FsbCA8aWQ+XQorY29tbWFuZC5oZWxwPURpc3BsYXksIG1hbmFnZSBhbmQgcmVjYWxsIGVkaXQtbGluZSBoaXN0b3J5LgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvY29tbWFuZHMvSW1wb3J0Q29tbWFuZC5ncm9vdnkgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9jb21tYW5kcy9JbXBvcnRDb21tYW5kLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTUyMmY0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvY29tbWFuZHMvSW1wb3J0Q29tbWFuZC5ncm9vdnkKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwuY29tbWFuZHMKKworaW1wb3J0IGpsaW5lLkFyZ3VtZW50Q29tcGxldG9yCitpbXBvcnQgamxpbmUuTnVsbENvbXBsZXRvcgorCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLkNvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uCisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLkNvbW1hbmRTdXBwb3J0CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5TaGVsbAoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwudXRpbC5TaW1wbGVDb21wbGV0b3IKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLnV0aWwuQ2xhc3NOYW1lQ29tcGxldG9yCisKKy8qKgorICogVGhlICdpbXBvcnQnIGNvbW1hbmQuCisgKgorICogQHZlcnNpb24gJElkJAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFzb25AcGxhbmV0NTcuY29tIj5KYXNvbiBEaWxsb248L2E+CisgKi8KK2NsYXNzIEltcG9ydENvbW1hbmQKKyAgICBleHRlbmRzIENvbW1hbmRTdXBwb3J0Cit7CisgICAgSW1wb3J0Q29tbWFuZChmaW5hbCBTaGVsbCBzaGVsbCkgeworICAgICAgICBzdXBlcihzaGVsbCwgJ2ltcG9ydCcsICdcXGknKQorICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgTGlzdCBjcmVhdGVDb21wbGV0b3JzKCkgeworICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgbmV3IEltcG9ydENvbW1hbmRDb21wbGV0b3Ioc2hlbGwuaW50ZXJwLmNsYXNzTG9hZGVyKSwKKyAgICAgICAgICAgIG51bGwKKyAgICAgICAgXQorICAgIH0KKyAgICAKKyAgICBPYmplY3QgZXhlY3V0ZShmaW5hbCBMaXN0IGFyZ3MpIHsKKyAgICAgICAgYXNzZXJ0IGFyZ3MgIT0gbnVsbAorCisgICAgICAgIGlmIChhcmdzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgZmFpbCgiQ29tbWFuZCAnaW1wb3J0JyByZXF1aXJlcyBvbmUgb3IgbW9yZSBhcmd1bWVudHMiKSAvLyBUT0RPOiBpMThuCisgICAgICAgIH0KKworICAgICAgICBkZWYgYnVmZiA9IFsgJ2ltcG9ydCAnICsgYXJncy5qb2luKCcgJykgXQorICAgICAgICBidWZmIDw8ICdkZWYgZHVtbXAgPSBmYWxzZScKKyAgICAgICAgCisgICAgICAgIGRlZiB0eXBlCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0eXBlID0gY2xhc3NMb2FkZXIucGFyc2VDbGFzcyhidWZmLmpvaW4oTkVXTElORSkpCisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8ga2VlcCBkdXBsaWNhdGVzLCBidXQgb3JkZXIgbWF5IGJlIGltcG9ydGFudCBzbyByZW1vdmUgdGhlIHByZXZpb3VzIGRlZiwgc2luY2UKKyAgICAgICAgICAgIC8vIHRoZSBsYXN0IGRlZmluZWQgaW1wb3J0IHdpbGwgd2luIGFueXdheXMKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGltcG9ydHMucmVtb3ZlKGJ1ZmZbMF0pKSB7CisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJSZW1vdmVkIGR1cGxpY2F0ZSBpbXBvcnQgZnJvbSBsaXN0IikKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgbG9nLmRlYnVnKCJBZGRpbmcgaW1wb3J0OiAke2J1ZmZbMF19IikKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaW1wb3J0cyA8PCBidWZmWzBdCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGRlZiBtc2cgPSAiSW52YWxpZCBpbXBvcnQgZGVmaW5pdGlvbjogJyR7YnVmZlswXX0nOyByZWFzb246ICRlLm1lc3NhZ2UiIC8vIFRPRE86IGkxOG4KKyAgICAgICAgICAgIGxvZy5kZWJ1Zyhtc2csIGUpCisgICAgICAgICAgICBmYWlsKG1zZykKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgY2xhc3MgZ2VuZXJhdGVkIHdoaWxlIHRlc3RpbmcgdGhlIGltcG9ydCBzeW50YXgKKyAgICAgICAgICAgIGNsYXNzTG9hZGVyLmNsYXNzQ2FjaGUucmVtb3ZlKHR5cGU/Lm5hbWUpCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICogQ29tcGxldG9yIGZvciB0aGUgJ2ltcG9ydCcgY29tbWFuZC4KKyAqCisgKiBAdmVyc2lvbiAkSWQkCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYXNvbkBwbGFuZXQ1Ny5jb20iPkphc29uIERpbGxvbjwvYT4KKyAqLworY2xhc3MgSW1wb3J0Q29tbWFuZENvbXBsZXRvcgorICAgIGV4dGVuZHMgQXJndW1lbnRDb21wbGV0b3IKK3sKKyAgICBJbXBvcnRDb21tYW5kQ29tcGxldG9yKGZpbmFsIEdyb292eUNsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB7CisgICAgICAgIHN1cGVyKFsKKyAgICAgICAgICAgIG5ldyBDbGFzc05hbWVDb21wbGV0b3IoY2xhc3NMb2FkZXIpLAorICAgICAgICAgICAgbmV3IFNpbXBsZUNvbXBsZXRvcignYXMnKSwKKyAgICAgICAgICAgIG5ldyBOdWxsQ29tcGxldG9yKCkKKyAgICAgICAgXSkKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9jb21tYW5kcy9JbXBvcnRDb21tYW5kLnByb3BlcnRpZXMgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9jb21tYW5kcy9JbXBvcnRDb21tYW5kLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEyMDZjMAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL2NvbW1hbmRzL0ltcG9ydENvbW1hbmQucHJvcGVydGllcwpAQCAtMCwwICsxLDI0IEBACisjCisjIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMKKyMgJElkJAorIworCitjb21tYW5kLmRlc2NyaXB0aW9uPUltcG9ydCBhIGNsYXNzIGludG8gdGhlIG5hbWVzcGFjZQorY29tbWFuZC51c2FnZT1bc3RhdGljXSA8Y2xhc3NuYW1lPiBbYXMgPG5hbWU+XQorY29tbWFuZC5oZWxwPUFkZCBhIGN1c3RvbSBpbXBvcnQgd2hpY2ggd2lsbCBiZSBpbmNsdWRlZCBmb3IgYWxsIHNoZWxsIGV2YWx1YXRpb25zLgorCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9jb21tYW5kcy9JbnNwZWN0Q29tbWFuZC5ncm9vdnkgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9jb21tYW5kcy9JbnNwZWN0Q29tbWFuZC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE4ZmE1MAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL2NvbW1hbmRzL0luc3BlY3RDb21tYW5kLmdyb292eQpAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5jb21tYW5kcworCitpbXBvcnQgZ3Jvb3Z5Lmluc3BlY3Quc3dpbmd1aS5PYmplY3RCcm93c2VyCisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLkNvbW1hbmRTdXBwb3J0CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5TaGVsbAoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwudXRpbC5TaW1wbGVDb21wbGV0b3IKKworLyoqCisgKiBUaGUgJ2luc3BlY3QnIGNvbW1hbmQuCisgKgorICogQHZlcnNpb24gJElkJAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFzb25AcGxhbmV0NTcuY29tIj5KYXNvbiBEaWxsb248L2E+CisgKi8KK2NsYXNzIEluc3BlY3RDb21tYW5kCisgICAgZXh0ZW5kcyBDb21tYW5kU3VwcG9ydAoreworICAgIEluc3BlY3RDb21tYW5kKGZpbmFsIFNoZWxsIHNoZWxsKSB7CisgICAgICAgIHN1cGVyKHNoZWxsLCAnaW5zcGVjdCcsICdcXG4nKQorICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgTGlzdCBjcmVhdGVDb21wbGV0b3JzKCkgeworICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgbmV3IEluc3BlY3RDb21tYW5kQ29tcGxldG9yKGJpbmRpbmcpLAorICAgICAgICAgICAgbnVsbAorICAgICAgICBdCisgICAgfQorCisgICAgT2JqZWN0IGV4ZWN1dGUoZmluYWwgTGlzdCBhcmdzKSB7CisgICAgICAgIGFzc2VydCBhcmdzICE9IG51bGwKKyAgICAgICAgCisgICAgICAgIGxvZy5kZWJ1ZygiSW5zcGVjdGluZyB3L2FyZ3M6ICRhcmdzIikKKyAgICAgICAgCisgICAgICAgIGlmIChhcmdzLnNpemUoKSA+IDEpIHsKKyAgICAgICAgICAgIGZhaWwobWVzc2FnZXMuZm9ybWF0KCdlcnJvci51bmV4cGVjdGVkX2FyZ3MnLCBhcmdzLmpvaW4oJyAnKSkpCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGRlZiBzdWJqZWN0CisgICAgICAgIAorICAgICAgICBpZiAoYXJncy5zaXplKCkgPT0gMSkgeworICAgICAgICAgICAgc3ViamVjdCA9IGJpbmRpbmcudmFyaWFibGVzW2FyZ3NbMF1dCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzdWJqZWN0ID0gYmluZGluZy52YXJpYWJsZXNbJ18nXQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFzdWJqZWN0KSB7CisgICAgICAgICAgICBpby5vdXQucHJpbnRsbignU3ViamVjdCBpcyBudWxsOyBub3RoaW5nIHRvIGluc3BlY3QnKSAvLyBUT0RPOiBpMThuCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoaW8udmVyYm9zZSkgeworICAgICAgICAgICAgICAgIGlvLm91dC5wcmludGxuKCJMYXVuY2hpbmcgb2JqZWN0IGJyb3dzZXIgdG8gaW5zcGVjdDogJHN1YmplY3QiKSAvLyBUT0RPOiBpMThuCisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIE9iamVjdEJyb3dzZXIuaW5zcGVjdChzdWJqZWN0KQorICAgICAgICB9CisgICAgfQorfQorCisvKioKKyAqIENvbXBsZXRvciBmb3IgdGhlICdpbnNwZWN0JyBjb21tYW5kLgorICoKKyAqIEB2ZXJzaW9uICRJZCQKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphc29uQHBsYW5ldDU3LmNvbSI+SmFzb24gRGlsbG9uPC9hPgorICovCitjbGFzcyBJbnNwZWN0Q29tbWFuZENvbXBsZXRvcgorICAgIGV4dGVuZHMgU2ltcGxlQ29tcGxldG9yCit7CisgICAgcHJpdmF0ZSBmaW5hbCBCaW5kaW5nIGJpbmRpbmcKKyAgICAKKyAgICBJbnNwZWN0Q29tbWFuZENvbXBsZXRvcihmaW5hbCBCaW5kaW5nIGJpbmRpbmcpIHsKKyAgICAgICAgYXNzZXJ0IGJpbmRpbmcKKworICAgICAgICB0aGlzLmJpbmRpbmcgPSBiaW5kaW5nCisgICAgfQorCisgICAgU29ydGVkU2V0IGdldENhbmRpZGF0ZXMoKSB7CisgICAgICAgIGRlZiBzZXQgPSBuZXcgVHJlZVNldCgpCisKKyAgICAgICAgYmluZGluZy52YXJpYWJsZXMua2V5U2V0KCkuZWFjaCB7CisgICAgICAgICAgICBzZXQgPDwgaXQKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzZXQKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9jb21tYW5kcy9JbnNwZWN0Q29tbWFuZC5wcm9wZXJ0aWVzIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvY29tbWFuZHMvSW5zcGVjdENvbW1hbmQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTU4ZTg0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvY29tbWFuZHMvSW5zcGVjdENvbW1hbmQucHJvcGVydGllcwpAQCAtMCwwICsxLDI0IEBACisjCisjIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMKKyMgJElkJAorIworCitjb21tYW5kLmRlc2NyaXB0aW9uPUluc3BlY3QgYSB2YXJpYWJsZSBvciB0aGUgbGFzdCByZXN1bHQgd2l0aCB0aGUgR1VJIG9iamVjdCBicm93c2VyCitjb21tYW5kLnVzYWdlPVs8dmFyaWFibGU+XQorY29tbWFuZC5oZWxwPU9wZW5zIHRoZSBHVUkgb2JqZWN0IGJyb3dzZXIgdG8gaW5zcGVjdCBhIHZhcmlhYmxlIG9yIHRoZSByZXN1bHQgb2YgdGhlIGxhc3QgZXZhbHVhdGlvbi4KKwpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvY29tbWFuZHMvTG9hZENvbW1hbmQuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvY29tbWFuZHMvTG9hZENvbW1hbmQuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjOTNjYmIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9jb21tYW5kcy9Mb2FkQ29tbWFuZC5ncm9vdnkKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5jb21tYW5kcworCitpbXBvcnQgamxpbmUuRmlsZU5hbWVDb21wbGV0b3IKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwuQ29tbWFuZFN1cHBvcnQKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLlNoZWxsCisKKy8qKgorICogVGhlICdsb2FkJyBjb21tYW5kLgorICoKKyAqIEB2ZXJzaW9uICRJZCQKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphc29uQHBsYW5ldDU3LmNvbSI+SmFzb24gRGlsbG9uPC9hPgorICovCitjbGFzcyBMb2FkQ29tbWFuZAorICAgIGV4dGVuZHMgQ29tbWFuZFN1cHBvcnQKK3sKKyAgICBMb2FkQ29tbWFuZChmaW5hbCBTaGVsbCBzaGVsbCkgeworICAgICAgICBzdXBlcihzaGVsbCwgJ2xvYWQnLCAnXFxsJykKKworICAgICAgICBhbGlhcygnLicsICdcXC4nKQorICAgIH0KKworICAgIHByb3RlY3RlZCBMaXN0IGNyZWF0ZUNvbXBsZXRvcnMoKSB7CisgICAgICAgIHJldHVybiBbIG5ldyBGaWxlTmFtZUNvbXBsZXRvcigpIF0KKyAgICB9CisKKyAgICBPYmplY3QgZXhlY3V0ZShmaW5hbCBMaXN0IGFyZ3MpIHsKKyAgICAgICAgYXNzZXJ0IGFyZ3MgIT0gbnVsbAorICAgICAgICAKKyAgICAgICAgaWYgKGFyZ3Muc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIGZhaWwoIkNvbW1hbmQgJ2xvYWQnIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBhcmd1bWVudCIpIC8vIFRPRE86IGkxOG4KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoc291cmNlIGluIGFyZ3MpIHsKKyAgICAgICAgICAgIFVSTCB1cmwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbG9nLmRlYnVnKCJBdHRlbXB0aW5nIHRvIGxvYWQ6ICR1cmwiKQorICAgICAgICAgICAgCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHVybCA9IG5ldyBVUkwoIiRzb3VyY2UiKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZGVmIGZpbGUgPSBuZXcgRmlsZSgiJHNvdXJjZSIpCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKCFmaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgICAgIGZhaWwoIkZpbGUgbm90IGZvdW5kOiAkZmlsZSIpIC8vIFRPRE86IGkxOG4KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgdXJsID0gZmlsZS50b1VSSSgpLnRvVVJMKCkKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbG9hZCh1cmwpCisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGxvYWQoZmluYWwgVVJMIHVybCkgeworICAgICAgICBhc3NlcnQgdXJsICE9IG51bGwKKworICAgICAgICBpZiAoaW8udmVyYm9zZSkgeworICAgICAgICAgICAgaW8ub3V0LnByaW50bG4oIkxvYWRpbmc6ICR1cmwiKQorICAgICAgICB9CisKKyAgICAgICAgdXJsLmVhY2hMaW5lIHsKKyAgICAgICAgICAgIHNoZWxsIDw8IGl0CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9jb21tYW5kcy9Mb2FkQ29tbWFuZC5wcm9wZXJ0aWVzIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvY29tbWFuZHMvTG9hZENvbW1hbmQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTlhNzljCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvY29tbWFuZHMvTG9hZENvbW1hbmQucHJvcGVydGllcwpAQCAtMCwwICsxLDI0IEBACisjCisjIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMKKyMgJElkJAorIworCitjb21tYW5kLmRlc2NyaXB0aW9uPUxvYWQgYSBmaWxlIG9yIFVSTCBpbnRvIHRoZSBidWZmZXIKK2NvbW1hbmQudXNhZ2U9KDxmaWxlfHVybD4pKworY29tbWFuZC5oZWxwPUxvYWQgb25lIG9yIG1vcmUgZmlsZXMgKG9yIHVybHMpIGludG8gdGhlIGJ1ZmZlci4KKwpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvY29tbWFuZHMvUHVyZ2VDb21tYW5kLmdyb292eSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL2NvbW1hbmRzL1B1cmdlQ29tbWFuZC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRkZTdhNQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL2NvbW1hbmRzL1B1cmdlQ29tbWFuZC5ncm9vdnkKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5jb21tYW5kcworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5Db21wbGV4Q29tbWFuZFN1cHBvcnQKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLlNoZWxsCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC51dGlsLlByZWZlcmVuY2VzCisKKy8qKgorICogVGhlICdwdXJnZScgY29tbWFuZC4KKyAqCisgKiBAdmVyc2lvbiAkSWQkCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYXNvbkBwbGFuZXQ1Ny5jb20iPkphc29uIERpbGxvbjwvYT4KKyAqLworY2xhc3MgUHVyZ2VDb21tYW5kCisgICAgZXh0ZW5kcyBDb21wbGV4Q29tbWFuZFN1cHBvcnQKK3sKKyAgICBQdXJnZUNvbW1hbmQoZmluYWwgU2hlbGwgc2hlbGwpIHsKKyAgICAgICAgc3VwZXIoc2hlbGwsICdwdXJnZScsICdcXHAnKQorICAgICAgICAKKyAgICAgICAgdGhpcy5mdW5jdGlvbnMgPSBbICd2YXJpYWJsZXMnLCAnY2xhc3NlcycsICdpbXBvcnRzJywgJ3ByZWZlcmVuY2VzJywgJ2FsbCcgXQorICAgIH0KKyAgICAKKyAgICBkZWYgZG9fdmFyaWFibGVzID0geworICAgICAgICBpZiAodmFyaWFibGVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgaW8ub3V0LnByaW50bG4oJ05vIHZhcmlhYmxlcyBkZWZpbmVkJykgLy8gVE9ETzogaTE4bgorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdmFyaWFibGVzLmNsZWFyKCkKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGlvLnZlcmJvc2UpIHsKKyAgICAgICAgICAgICAgICBpby5vdXQucHJpbnRsbigiQ3VzdG9tIHZhcmlhYmxlcyBwdXJnZWQiKSAvLyBUT0RPOiBpMThuCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgZGVmIGRvX2NsYXNzZXMgPSB7CisgICAgICAgIGlmIChjbGFzc0xvYWRlci5sb2FkZWRDbGFzc2VzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBpby5vdXQucHJpbnRsbigiTm8gY2xhc3NlcyBoYXZlIGJlZW4gbG9hZGVkIikgLy8gVE9ETzogaTE4bgorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY2xhc3NMb2FkZXIuY2xlYXJDYWNoZSgpCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChpby52ZXJib3NlKSB7CisgICAgICAgICAgICAgICAgaW8ub3V0LnByaW50bG4oJ0xvYWRlZCBjbGFzc2VzIHB1cmdlZCcpIC8vIFRPRE86IGkxOG4KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBkZWYgZG9faW1wb3J0cyA9IHsKKyAgICAgICAgaWYgKGltcG9ydHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBpby5vdXQucHJpbnRsbigiTm8gY3VzdG9tIGltcG9ydHMgaGF2ZSBiZWVuIGRlZmluZWQiKSAvLyBUT0RPOiBpMThuCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpbXBvcnRzLmNsZWFyKCkKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGlvLnZlcmJvc2UpIHsKKyAgICAgICAgICAgICAgICBpby5vdXQucHJpbnRsbigiQ3VzdG9tIGltcG9ydHMgcHVyZ2VkIikgLy8gVE9ETzogaTE4bgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZGVmIGRvX3ByZWZlcmVuY2VzID0geworICAgICAgICBQcmVmZXJlbmNlcy5jbGVhcigpCisgICAgICAgIAorICAgICAgICBpZiAoaW8udmVyYm9zZSkgeworICAgICAgICAgICAgaW8ub3V0LnByaW50bG4oIlByZWZlcmVuY2VzIHB1cmdlZCIpIC8vIFRPRE86IGkxOG4KKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvY29tbWFuZHMvUHVyZ2VDb21tYW5kLnByb3BlcnRpZXMgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9jb21tYW5kcy9QdXJnZUNvbW1hbmQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODkyYzQyCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvY29tbWFuZHMvUHVyZ2VDb21tYW5kLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyNCBAQAorIworIyBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjCisjICRJZCQKKyMKKworY29tbWFuZC5kZXNjcmlwdGlvbj1QdXJnZSB2YXJpYWJsZXMsIGNsYXNzZXMsIGltcG9ydHMgb3IgcHJlZmVyZW5jZXMKK2NvbW1hbmQudXNhZ2U9KDx2YXJpYWJsZXN8Y2xhc3Nlc3xpbXBvcnRzfHByZWZlcmVuY2VzfGFsbD4pKworY29tbWFuZC5oZWxwPVB1cmdlcyBvYmplY3RzIGZyb20gdGhlIHNoZWxsLgorCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9jb21tYW5kcy9SZWNvcmRDb21tYW5kLmdyb292eSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL2NvbW1hbmRzL1JlY29yZENvbW1hbmQuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhN2JiMTcKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9jb21tYW5kcy9SZWNvcmRDb21tYW5kLmdyb292eQpAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5jb21tYW5kcworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5Db21wbGV4Q29tbWFuZFN1cHBvcnQKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLlNoZWxsCisKKy8qKgorICogVGhlICdyZWNvcmQnIGNvbW1hbmQuCisgKgorICogQHZlcnNpb24gJElkJAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFzb25AcGxhbmV0NTcuY29tIj5KYXNvbiBEaWxsb248L2E+CisgKi8KK2NsYXNzIFJlY29yZENvbW1hbmQKKyAgICBleHRlbmRzIENvbXBsZXhDb21tYW5kU3VwcG9ydAoreworICAgIFJlY29yZENvbW1hbmQoZmluYWwgU2hlbGwgc2hlbGwpIHsKKyAgICAgICAgc3VwZXIoc2hlbGwsICdyZWNvcmQnLCAnXFxyJykKKworICAgICAgICB0aGlzLmZ1bmN0aW9ucyA9IFsgJ3N0YXJ0JywgJ3N0b3AnLCAnc3RhdHVzJyBdCisKKyAgICAgICAgdGhpcy5kZWZhdWx0RnVuY3Rpb24gPSAnc3RhdHVzJworCisgICAgICAgIGFkZFNodXRkb3duSG9vayB7CisgICAgICAgICAgICBpZiAocmVjb3JkaW5nKSB7CisgICAgICAgICAgICAgICAgZG9fc3RvcCgpCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIEZpbGUgZmlsZQorCisgICAgcHJpdmF0ZSBQcmludFdyaXRlciB3cml0ZXIKKworICAgIGJvb2xlYW4gaXNSZWNvcmRpbmcoKSB7CisgICAgICAgIHJldHVybiBmaWxlICE9IG51bGwKKyAgICB9CisKKyAgICBkZWYgcmVjb3JkSW5wdXQoZmluYWwgU3RyaW5nIGxpbmUpIHsKKyAgICAgICAgYXNzZXJ0IGxpbmUgIT0gbnVsbAorCisgICAgICAgIGlmIChyZWNvcmRpbmcpIHsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKGxpbmUpCisgICAgICAgICAgICB3cml0ZXIuZmx1c2goKQorICAgICAgICB9CisgICAgfQorCisgICAgZGVmIHJlY29yZFJlc3VsdChmaW5hbCBPYmplY3QgcmVzdWx0KSB7CisgICAgICAgIC8vIHJlc3VsdCBtYXliZSBudWxsCisKKyAgICAgICAgaWYgKHJlY29yZGluZykgeworICAgICAgICAgICAgLy8gVXNlaW5nIFN0cmluZy52YWx1ZU9mKCkgdG8gcHJldmVudCBjcmF6eSBleGNlcHRpb25zCisgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiLy8gUkVTVUxUOiAke1N0cmluZy52YWx1ZU9mKHJlc3VsdCl9IikKKyAgICAgICAgICAgIHdyaXRlci5mbHVzaCgpCisgICAgICAgIH0KKyAgICB9CisKKyAgICBkZWYgcmVjb3JkRXJyb3IoZmluYWwgVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgICAgIGFzc2VydCBjYXVzZSAhPSBudWxsCisKKyAgICAgICAgaWYgKHJlY29yZGluZykgeworICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oIi8vIEVSUk9SOiAkY2F1c2UiKQorCisgICAgICAgICAgICBjYXVzZS5zdGFja1RyYWNlLmVhY2ggeworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCIvLyAgICAkaXQiKQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3cml0ZXIuZmx1c2goKQorICAgICAgICB9CisgICAgfQorCisgICAgZGVmIGRvX3N0YXJ0ID0geyBhcmdzIC0+CisgICAgICAgIGlmIChyZWNvcmRpbmcpIHsKKyAgICAgICAgICAgIGZhaWwoIkFscmVhZHkgcmVjb3JkaW5nIHRvOiAkZmlsZSIpCisgICAgICAgIH0KKworICAgICAgICBpZiAoYXJncy5zaXplKCkgIT0gMSkgeworICAgICAgICAgICAgZmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoJ2dyb292eXNoLScsICcudHh0JykKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGZpbGUgPSBuZXcgRmlsZShhcmdzWzBdIGFzIFN0cmluZykKKyAgICAgICAgfQorCisgICAgICAgIGZpbGUucGFyZW50RmlsZS5ta2RpcnMoKQorCisgICAgICAgIHdyaXRlciA9IGZpbGUubmV3UHJpbnRXcml0ZXIoKQorICAgICAgICB3cml0ZXIucHJpbnRsbigiLy8gT1BFTkVEOiAiICsgbmV3IERhdGUoKSkKKyAgICAgICAgd3JpdGVyLmZsdXNoKCkKKyAgICAgICAgCisgICAgICAgIGlvLm91dC5wcmludGxuKCJSZWNvcmRpbmcgc2Vzc2lvbiB0bzogJGZpbGUiKQorCisgICAgICAgIHJldHVybiBmaWxlCisgICAgfQorCisgICAgZGVmIGRvX3N0b3AgPSB7CisgICAgICAgIGlmICghcmVjb3JkaW5nKSB7CisgICAgICAgICAgICBmYWlsKCJOb3QgcmVjb3JkaW5nIikKKyAgICAgICAgfQorCisgICAgICAgIHdyaXRlci5wcmludGxuKCIvLyBDTE9TRUQ6ICIgKyBuZXcgRGF0ZSgpKQorICAgICAgICB3cml0ZXIuZmx1c2goKQorCisgICAgICAgIHdyaXRlci5jbG9zZSgpCisgICAgICAgIHdyaXRlciA9IG51bGwKKworICAgICAgICBpby5vdXQucHJpbnRsbigiUmVjb3JkaW5nIHN0b3BwZWQ7IHNlc3Npb24gc2F2ZWQgYXM6ICRmaWxlICgke2ZpbGUubGVuZ3RoKCl9IGJ5dGVzKSIpCisKKyAgICAgICAgZGVmIHRtcCA9IGZpbGUKKyAgICAgICAgZmlsZSA9IG51bGwKKworICAgICAgICByZXR1cm4gdG1wCisgICAgfQorCisgICAgZGVmIGRvX3N0YXR1cyA9IHsKKyAgICAgICAgaWYgKCFyZWNvcmRpbmcpIHsKKyAgICAgICAgICAgIGlvLm91dC5wcmludGxuKCJOb3QgcmVjb3JkaW5nIikKKworICAgICAgICAgICAgcmV0dXJuIG51bGwKKyAgICAgICAgfQorCisgICAgICAgIGlvLm91dC5wcmludGxuKCJSZWNvcmRpbmcgdG8gZmlsZTogJGZpbGUgKCR7ZmlsZS5sZW5ndGgoKX0gYnl0ZXMpIikKKworICAgICAgICByZXR1cm4gZmlsZQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvY29tbWFuZHMvUmVjb3JkQ29tbWFuZC5wcm9wZXJ0aWVzIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvY29tbWFuZHMvUmVjb3JkQ29tbWFuZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyYzkxZjUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9jb21tYW5kcy9SZWNvcmRDb21tYW5kLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyNCBAQAorIworIyBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjCisjICRJZCQKKyMKKworY29tbWFuZC5kZXNjcmlwdGlvbj1SZWNvcmQgdGhlIGN1cnJlbnQgc2Vzc2lvbiB0byBhIGZpbGUKK2NvbW1hbmQudXNhZ2U9W3N0YXJ0IFs8ZmlsZT5dfHN0b3B8c3RhdHVzXQorY29tbWFuZC5oZWxwPVJlY29yZCB0aGUgY3VycmVudCBzZXNzaW9uIHRvIGEgZmlsZS4KKwpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvY29tbWFuZHMvU2F2ZUNvbW1hbmQuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvY29tbWFuZHMvU2F2ZUNvbW1hbmQuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNjRjZGUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9jb21tYW5kcy9TYXZlQ29tbWFuZC5ncm9vdnkKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5jb21tYW5kcworCitpbXBvcnQgamxpbmUuRmlsZU5hbWVDb21wbGV0b3IKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwuQ29tbWFuZFN1cHBvcnQKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLlNoZWxsCisKKy8qKgorICogVGhlICdzYXZlJyBjb21tYW5kLgorICoKKyAqIEB2ZXJzaW9uICRJZCQKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphc29uQHBsYW5ldDU3LmNvbSI+SmFzb24gRGlsbG9uPC9hPgorICovCitjbGFzcyBTYXZlQ29tbWFuZAorICAgIGV4dGVuZHMgQ29tbWFuZFN1cHBvcnQKK3sKKyAgICBTYXZlQ29tbWFuZChmaW5hbCBTaGVsbCBzaGVsbCkgeworICAgICAgICBzdXBlcihzaGVsbCwgJ3NhdmUnLCAnXFxzJykKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgTGlzdCBjcmVhdGVDb21wbGV0b3JzKCkgeworICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgbmV3IEZpbGVOYW1lQ29tcGxldG9yKCksCisgICAgICAgICAgICBudWxsCisgICAgICAgIF0KKyAgICB9CisKKyAgICBPYmplY3QgZXhlY3V0ZShmaW5hbCBMaXN0IGFyZ3MpIHsKKyAgICAgICAgYXNzZXJ0IGFyZ3MgIT0gbnVsbAorICAgICAgICAKKyAgICAgICAgaWYgKGFyZ3Muc2l6ZSgpICE9IDEpIHsKKyAgICAgICAgICAgIGZhaWwoIkNvbW1hbmQgJ3NhdmUnIHJlcXVpcmVzIGEgc2luZ2xlIGZpbGUgYXJndW1lbnQiKSAvLyBUT0RPOiBpMThuCisgICAgICAgIH0KKworICAgICAgICBpZiAoYnVmZmVyLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgaW8ub3V0LnByaW50bG4oJ0J1ZmZlciBpcyBlbXB0eScpIC8vIFRPRE86IGkxOG4KKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVE9ETzogU3VwcG9ydCBzcGVjaWFsICctJyBmaWxlIHRvIHNpbXBseSBkdW1wIHRleHQgdG8gaW8ub3V0CisgICAgICAgIC8vCisgICAgICAgIAorICAgICAgICBkZWYgZmlsZSA9IG5ldyBGaWxlKCIke2FyZ3NbMF19IikKKworICAgICAgICBpZiAoaW8udmVyYm9zZSkgeworICAgICAgICAgICAgaW8ub3V0LnByaW50bG4oIlNhdmluZyBjdXJyZW50IGJ1ZmZlciB0byBmaWxlOiAkZmlsZSIpIC8vIFRPRE86IGkxOG4KKyAgICAgICAgfQorCisgICAgICAgIGRlZiBkaXIgPSBmaWxlLnBhcmVudEZpbGUKKyAgICAgICAgaWYgKGRpciAmJiAhZGlyLmV4aXN0cygpKSB7CisgICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0aW5nIHBhcmVudCBkaXJlY3RvcnkgcGF0aDogJGRpciIpCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGRpci5ta2RpcnMoKQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBmaWxlLndyaXRlKGJ1ZmZlci5qb2luKE5FV0xJTkUpKQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL2NvbW1hbmRzL1NhdmVDb21tYW5kLnByb3BlcnRpZXMgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9jb21tYW5kcy9TYXZlQ29tbWFuZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2M2MzYTQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9jb21tYW5kcy9TYXZlQ29tbWFuZC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjQgQEAKKyMKKyMgQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIworIyAkSWQkCisjCisKK2NvbW1hbmQuZGVzY3JpcHRpb249U2F2ZSB0aGUgY3VycmVudCBidWZmZXIgdG8gYSBmaWxlCitjb21tYW5kLnVzYWdlPTxmaWxlPgorY29tbWFuZC5oZWxwPVNhdmVzIHRoZSBidWZmZXIncyBjb250ZW50cyB0byBAfEJPTEQgZmlsZXwuCisKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL2NvbW1hbmRzL1NldENvbW1hbmQuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvY29tbWFuZHMvU2V0Q29tbWFuZC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE1OTAyYQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL2NvbW1hbmRzL1NldENvbW1hbmQuZ3Jvb3Z5CkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwuY29tbWFuZHMKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwuQ29tbWFuZFN1cHBvcnQKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLlNoZWxsCisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLnV0aWwuU2ltcGxlQ29tcGxldG9yCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC51dGlsLlByZWZlcmVuY2VzCisKKy8qKgorICogVGhlICdzZXQnIGNvbW1hbmQsIHVzZWQgdG8gc2V0IHByZWZlcmVuY2VzLgorICoKKyAqIEB2ZXJzaW9uICRJZCQKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphc29uQHBsYW5ldDU3LmNvbSI+SmFzb24gRGlsbG9uPC9hPgorICovCitjbGFzcyBTZXRDb21tYW5kCisgICAgZXh0ZW5kcyBDb21tYW5kU3VwcG9ydAoreworICAgIFNldENvbW1hbmQoZmluYWwgU2hlbGwgc2hlbGwpIHsKKyAgICAgICAgc3VwZXIoc2hlbGwsICdzZXQnLCAnXFw9JykKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgTGlzdCBjcmVhdGVDb21wbGV0b3JzKCkgeworICAgICAgICBkZWYgbG9hZGVyID0geworICAgICAgICAgICAgZGVmIGxpc3QgPSBbXQorCisgICAgICAgICAgICBkZWYga2V5cyA9IFByZWZlcmVuY2VzLmtleXMoKQorCisgICAgICAgICAgICBrZXlzLmVhY2ggeyBsaXN0IDw8IGl0IH0KKworICAgICAgICAgICAgcmV0dXJuIGxpc3QKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICBuZXcgU2ltcGxlQ29tcGxldG9yKGxvYWRlciksCisgICAgICAgICAgICBudWxsCisgICAgICAgIF0KKyAgICB9CisKKyAgICBPYmplY3QgZXhlY3V0ZShmaW5hbCBMaXN0IGFyZ3MpIHsKKyAgICAgICAgYXNzZXJ0IGFyZ3MgIT0gbnVsbAorICAgICAgICAKKyAgICAgICAgaWYgKGFyZ3Muc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIGRlZiBrZXlzID0gUHJlZmVyZW5jZXMua2V5cygpCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChrZXlzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgaW8ub3V0LnByaW50bG4oJ05vIHByZWZlcmVuY2VzIGFyZSBzZXQnKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaW8ub3V0LnByaW50bG4oJ1ByZWZlcmVuY2VzOicpCisgICAgICAgICAgICAgICAga2V5cy5lYWNoIHsKKyAgICAgICAgICAgICAgICAgICAgZGVmIHZhbHVlID0gUHJlZmVyZW5jZXMuZ2V0KGl0LCBudWxsKQorICAgICAgICAgICAgICAgICAgICBwcmludGxuKCIgICAgJGl0PSR2YWx1ZSIpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChhcmdzLnNpemUoKSA+IDIpIHsKKyAgICAgICAgICAgIGZhaWwoIkNvbW1hbmQgJyRuYW1lJyByZXF1aXJlcyBhcmd1bWVudHM6IDxuYW1lPiBbPHZhbHVlPl0iKQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBkZWYgbmFtZSA9IGFyZ3NbMF0KKyAgICAgICAgZGVmIHZhbHVlCisgICAgICAgIAorICAgICAgICBpZiAoYXJncy5zaXplKCkgPT0gMSkgeworICAgICAgICAgICAgdmFsdWUgPSB0cnVlCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB2YWx1ZSA9IGFyZ3NbMV0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgbG9nLmRlYnVnKCJTZXR0aW5nIHByZWZlcmVuY2U6ICRuYW1lPSR2YWx1ZSIpCisgICAgICAgIAorICAgICAgICBQcmVmZXJlbmNlcy5wdXQobmFtZSwgU3RyaW5nLnZhbHVlT2YodmFsdWUpKQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL2NvbW1hbmRzL1NldENvbW1hbmQucHJvcGVydGllcyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL2NvbW1hbmRzL1NldENvbW1hbmQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWI2ZmFlCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvY29tbWFuZHMvU2V0Q29tbWFuZC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjQgQEAKKyMKKyMgQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIworIyAkSWQkCisjCisKK2NvbW1hbmQuZGVzY3JpcHRpb249U2V0IChvciBsaXN0KSBwcmVmZXJlbmNlcworY29tbWFuZC51c2FnZT1bPG5hbWU+IFs8dmFsdWU+XV0KK2NvbW1hbmQuaGVscD1TZXQgb3IgbGlzdCBwcmVmZXJlbmNlcy4KKwpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvY29tbWFuZHMvU2hhZG93Q29tbWFuZC5ncm9vdnkgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9jb21tYW5kcy9TaGFkb3dDb21tYW5kLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTNiYWNkCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvY29tbWFuZHMvU2hhZG93Q29tbWFuZC5ncm9vdnkKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5jb21tYW5kcworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5Db21wbGV4Q29tbWFuZFN1cHBvcnQKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLlNoZWxsCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC51dGlsLlByZWZlcmVuY2VzCisKKy8qKgorICogVGhlICdzaGFkb3cnIGNvbW1hbmQuCisgKgorICogQHZlcnNpb24gJElkJAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFzb25AcGxhbmV0NTcuY29tIj5KYXNvbiBEaWxsb248L2E+CisgKi8KK2NsYXNzIFNoYWRvd0NvbW1hbmQKKyAgICBleHRlbmRzIENvbXBsZXhDb21tYW5kU3VwcG9ydAoreworICAgIFNoYWRvd0NvbW1hbmQoZmluYWwgU2hlbGwgc2hlbGwpIHsKKyAgICAgICAgc3VwZXIoc2hlbGwsICdzaGFkb3cnLCAnXFwmJykKKyAgICAgICAgCisgICAgICAgIHRoaXMuaGlkZGVuID0gdHJ1ZQorICAgICAgICAKKyAgICAgICAgdGhpcy5mdW5jdGlvbnMgPSBbICdkZWJ1ZycsICd2ZXJib3NlJywgJ2luZm8nLCAndGhpcycgXQorICAgIH0KKyAgICAKKyAgICBkZWYgZG9fZGVidWcgPSB7CisgICAgICAgIFByZWZlcmVuY2VzLnZlcmJvc2l0eSA9IElPLlZlcmJvc2l0eS5ERUJVRworICAgIH0KKyAgICAKKyAgICBkZWYgZG9fdmVyYm9zZSA9IHsKKyAgICAgICAgUHJlZmVyZW5jZXMudmVyYm9zaXR5ID0gSU8uVmVyYm9zaXR5LlZFUkJPU0UKKyAgICB9CisKKyAgICBkZWYgZG9faW5mbyA9IHsKKyAgICAgICAgUHJlZmVyZW5jZXMudmVyYm9zaXR5ID0gSU8uVmVyYm9zaXR5LklORk8KKyAgICB9CisKKyAgICBkZWYgZG9fdGhpcyA9IHsKKyAgICAgICAgcmV0dXJuIHRoaXMKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL2NvbW1hbmRzL1NoYWRvd0NvbW1hbmQucHJvcGVydGllcyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL2NvbW1hbmRzL1NoYWRvd0NvbW1hbmQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTgxYmU1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvY29tbWFuZHMvU2hhZG93Q29tbWFuZC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjQgQEAKKyMKKyMgQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIworIyAkSWQkCisjCisKK2NvbW1hbmQuZGVzY3JpcHRpb249VWJlciBmb28sIG11Y2sgJiBmbHVmZgorY29tbWFuZC51c2FnZT0KK2NvbW1hbmQuaGVscD1VYmVyIGZvbywgbXVjayAmIGZsdWZmLgorCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9jb21tYW5kcy9TaG93Q29tbWFuZC5ncm9vdnkgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9jb21tYW5kcy9TaG93Q29tbWFuZC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI4ZmViNgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL2NvbW1hbmRzL1Nob3dDb21tYW5kLmdyb292eQpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5jb21tYW5kcworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLk1ldGhvZENsb3N1cmUKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwuQ29tcGxleENvbW1hbmRTdXBwb3J0CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5TaGVsbAoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwudXRpbC5QcmVmZXJlbmNlcworCisvKioKKyAqIFRoZSAnc2hvdycgY29tbWFuZC4KKyAqCisgKiBAdmVyc2lvbiAkSWQkCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYXNvbkBwbGFuZXQ1Ny5jb20iPkphc29uIERpbGxvbjwvYT4KKyAqLworY2xhc3MgU2hvd0NvbW1hbmQKKyAgICBleHRlbmRzIENvbXBsZXhDb21tYW5kU3VwcG9ydAoreworICAgIFNob3dDb21tYW5kKGZpbmFsIFNoZWxsIHNoZWxsKSB7CisgICAgICAgIHN1cGVyKHNoZWxsLCAnc2hvdycsICdcXFMnKQorICAgICAgICAKKyAgICAgICAgdGhpcy5mdW5jdGlvbnMgPSBbICd2YXJpYWJsZXMnLCAnY2xhc3NlcycsICdpbXBvcnRzJywgJ3ByZWZlcmVuY2VzJywgJ2FsbCcgXQorICAgIH0KKyAgICAKKyAgICBkZWYgZG9fdmFyaWFibGVzID0geworICAgICAgICBpZiAodmFyaWFibGVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgaW8ub3V0LnByaW50bG4oJ05vIHZhcmlhYmxlcyBkZWZpbmVkJykgLy8gVE9ETzogaTE4bgorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaW8ub3V0LnByaW50bG4oJ1ZhcmlhYmxlczonKSAvLyBUT0RPOiBpMThuCisgICAgICAgICAgICAKKyAgICAgICAgICAgIHZhcmlhYmxlcy5lYWNoIHsga2V5LCB2YWx1ZSAtPgorICAgICAgICAgICAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGRlZmluZWQgbWV0aG9kcywganVzdCBzaG93IHRoZSBzaWcKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBNZXRob2RDbG9zdXJlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IFdvdWxkIGJlIG5pY2UgdG8gc2hvdyB0aGUgYXJndW1lbnQgdHlwZXMgaXQgd2lsbCBhY2NlcHQuLi4KKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAibWV0aG9kICR7dmFsdWUubWV0aG9kfSgpIgorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gdXNlIFN0cmluZy52YWx1ZU9mKCkgaGVyZSB0byBhdm9pZCBpY2t5IGV4Y2VwdGlvbnMgY2F1c2VzIGJ5IEdTdHJpbmcgY29lcmNpb24KKyAgICAgICAgICAgICAgICBpby5vdXQucHJpbnRsbigiICAka2V5ID0gJHtTdHJpbmcudmFsdWVPZih2YWx1ZSl9IikKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBkZWYgZG9fY2xhc3NlcyA9IHsKKyAgICAgICAgZGVmIGNsYXNzZXMgPSBjbGFzc0xvYWRlci5sb2FkZWRDbGFzc2VzCisgICAgICAgIAorICAgICAgICBpZiAoY2xhc3Nlcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgaW8ub3V0LnByaW50bG4oIk5vIGNsYXNzZXMgaGF2ZSBiZWVuIGxvYWRlZCIpIC8vIFRPRE86IGkxOG4KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlvLm91dC5wcmludGxuKCdDbGFzc2VzOicpIC8vIFRPRE86IGkxOG4KKyAgICAgICAgICAgIAorICAgICAgICAgICAgY2xhc3Nlcy5lYWNoIHsKKyAgICAgICAgICAgICAgICBpby5vdXQucHJpbnRsbigiICAkaXQiKQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIGRlZiBkb19pbXBvcnRzID0geworICAgICAgICBpZiAoaW1wb3J0cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGlvLm91dC5wcmludGxuKCJObyBjdXN0b20gaW1wb3J0cyBoYXZlIGJlZW4gZGVmaW5lZCIpIC8vIFRPRE86IGkxOG4KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlvLm91dC5wcmludGxuKCJDdXN0b20gaW1wb3J0czoiKSAvLyBUT0RPOiBpMThuCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGltcG9ydHMuZWFjaCB7CisgICAgICAgICAgICAgICAgaW8ub3V0LnByaW50bG4oIiAgJGl0IikKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGRlZiBkb19wcmVmZXJlbmNlcyA9IHsKKyAgICAgICAgZGVmIGtleXMgPSBQcmVmZXJlbmNlcy5rZXlzKCkKKworICAgICAgICBpZiAoa2V5cy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgaW8ub3V0LnByaW50bG4oJ05vIHByZWZlcmVuY2VzIGFyZSBzZXQnKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpby5vdXQucHJpbnRsbignUHJlZmVyZW5jZXM6JykKKyAgICAgICAgICAgIGtleXMuZWFjaCB7CisgICAgICAgICAgICAgICAgZGVmIHZhbHVlID0gUHJlZmVyZW5jZXMuZ2V0KGl0LCBudWxsKQorICAgICAgICAgICAgICAgIHByaW50bG4oIiAgICAkaXQ9JHZhbHVlIikKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL2NvbW1hbmRzL1Nob3dDb21tYW5kLnByb3BlcnRpZXMgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9jb21tYW5kcy9TaG93Q29tbWFuZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNzQ5OTgKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9jb21tYW5kcy9TaG93Q29tbWFuZC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjQgQEAKKyMKKyMgQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIworIyAkSWQkCisjCisKK2NvbW1hbmQuZGVzY3JpcHRpb249U2hvdyB2YXJpYWJsZXMsIGNsYXNzZXMgb3IgaW1wb3J0cworY29tbWFuZC51c2FnZT1bPHZhcmlhYmxlc3xjbGFzc2VzfGltcG9ydHN8cHJlZmVyZW5jZXN8YWxsPl0KK2NvbW1hbmQuaGVscD1TaG93IHZhcmlhYmxlcywgY2xhc3NlcywgaW1wb3J0cyBvciBwcmVmZXJlbmNlcy4KKwpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvcGFja2FnZS5odG1sIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyNzgwZTUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSwyNiBAQAorPCEtLQorICAgIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICAgIAorICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgICAKKyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgIAorICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tICRJZCQgLS0+CisKKzxodG1sPgorICAgIDxib2R5PgorICAgICAgICA8cD4KKyAgICAgICAgICAgIFByb3ZpZGVzIHN1cHBvcnQgZm9yIHRoZSBHcm9vdnkgU2hlbGwgKGFrYS4gPHR0Pmdyb292eXNoPC90dD4pLgorICAgICAgICA8L3A+CisgICAgPC9ib2R5PgorPC9odG1sPgorCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC91dGlsL0FOU0kuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL3V0aWwvQU5TSS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZTkwNTMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC91dGlsL0FOU0kuamF2YQpAQCAtMCwwICsxLDQyMSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC51dGlsOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7CisKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGpsaW5lLkFOU0lCdWZmZXIuQU5TSUNvZGVzOworaW1wb3J0IGpsaW5lLlRlcm1pbmFsOworCisvKioKKyAqIFByb3ZpZGVzIHN1cHBvcnQgZm9yIHVzaW5nIEFOU0kgY29sb3IgZXNjYXBlIGNvZGVzLgorICoKKyAqIEB2ZXJzaW9uICRJZCQKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphc29uQHBsYW5ldDU3LmNvbSI+SmFzb24gRGlsbG9uPC9hPgorICovCitwdWJsaWMgY2xhc3MgQU5TSQoreworICAgIC8vCisgICAgLy8gRGV0ZWN0aW9uL0VuYWJsZWQgTXVjaworICAgIC8vCisKKyAgICAvKioKKyAgICAgKiBUcmllcyB0byBkZXRlY3QgaWYgdGhlIGN1cnJlbnQgc3lzdGVtIHN1cHBvcnRzIEFOU0kuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkZXRlY3QoKSB7CisgICAgICAgIGJvb2xlYW4gZW5hYmxlZCA9IFRlcm1pbmFsLmdldFRlcm1pbmFsKCkuaXNBTlNJU3VwcG9ydGVkKCk7CisKKyAgICAgICAgaWYgKCFlbmFibGVkKSB7CisgICAgICAgICAgICBTdHJpbmcgZm9yY2UgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoQU5TSS5jbGFzcy5nZXROYW1lKCkgKyAiLmZvcmNlIiwgImZhbHNlIik7CisgICAgICAgICAgICBlbmFibGVkID0gQm9vbGVhbi52YWx1ZU9mKGZvcmNlKS5ib29sZWFuVmFsdWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBlbmFibGVkOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RldGVjdGVkKCkgeworICAgICAgICByZXR1cm4gZGV0ZWN0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgQm9vbGVhbiBlbmFibGVkOworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEVuYWJsZWQoZmluYWwgYm9vbGVhbiBmbGFnKSB7CisgICAgICAgIGVuYWJsZWQgPSBCb29sZWFuLnZhbHVlT2YoZmxhZyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKKyAgICAgICAgaWYgKGVuYWJsZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgZW5hYmxlZCA9IEJvb2xlYW4udmFsdWVPZihpc0RldGVjdGVkKCkpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gZW5hYmxlZC5ib29sZWFuVmFsdWUoKTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIENvZGUKKyAgICAvLworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb2RlCisgICAgeworICAgICAgICAvLworICAgICAgICAvLyBOT1RFOiBTb21lIGZpZWxkcyBkdXBsaWNhdGVkIGZyb20gamxpbmUuQU5TSUJ1ZmZlci5BTlNJQ29kZXMgdG8gY2hhbmdlIGFjY2VzcyBtb2RpZmllcnMKKyAgICAgICAgLy8KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9GRiA9IDA7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJPTEQgPSAxOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTkRFUlNDT1JFID0gNDsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkxJTksgPSA1OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVZFUlNFID0gNzsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OQ0VBTEVEID0gODsKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZHX0JMQUNLID0gMzA7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZHX1JFRCA9IDMxOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGR19HUkVFTiA9IDMyOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGR19ZRUxMT1cgPSAzMzsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkdfQkxVRSA9IDM0OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGR19NQUdFTlRBID0gMzU7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZHX0NZQU4gPSAzNjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkdfV0hJVEUgPSAzNzsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCTEFDSyA9IEZHX0JMQUNLOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUQgPSBGR19SRUQ7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdSRUVOID0gRkdfR1JFRU47CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFlFTExPVyA9IEZHX1lFTExPVzsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkxVRSA9IEZHX0JMVUU7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BR0VOVEEgPSBGR19NQUdFTlRBOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDWUFOID0gRkdfQ1lBTjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0hJVEUgPSBGR19XSElURTsKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJHX0JMQUNLID0gNDA7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJHX1JFRCA9IDQxOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCR19HUkVFTiA9IDQyOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCR19ZRUxMT1cgPSA0MzsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkdfQkxVRSA9IDQ0OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCR19NQUdFTlRBID0gNDU7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJHX0NZQU4gPSA0NjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkdfV0hJVEUgPSA0NzsKKworICAgICAgICAvKiogQSBtYXAgb2YgY29kZSBuYW1lcyB0byB2YWx1ZXMuICovCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBOQU1FU19UT19DT0RFUzsKKworICAgICAgICAvKiogQSBtYXAgb2YgY29kZXMgdG8gbmFtZS4gKi8KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIENPREVTX1RPX05BTUVTOworCisgICAgICAgIHN0YXRpYyB7CisgICAgICAgICAgICBGaWVsZFtdIGZpZWxkcyA9IENvZGUuY2xhc3MuZ2V0RGVjbGFyZWRGaWVsZHMoKTsKKyAgICAgICAgICAgIE1hcCBuYW1lcyA9IG5ldyBIYXNoTWFwKGZpZWxkcy5sZW5ndGgpOworICAgICAgICAgICAgTWFwIGNvZGVzID0gbmV3IEhhc2hNYXAoZmllbGRzLmxlbmd0aCk7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGZpZWxkcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIGFueXRoaW5nIG5vbi1wdWJsaWMsIGFsbCBwdWJsaWMgZmllbGRzIGFyZSBjb2RlcworICAgICAgICAgICAgICAgICAgICBpbnQgbW9kcyA9IGZpZWxkc1tpXS5nZXRNb2RpZmllcnMoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFNb2RpZmllci5pc1B1YmxpYyhtb2RzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZmllbGRzW2ldLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgTnVtYmVyIGNvZGUgPSAoTnVtYmVyKSBmaWVsZHNbaV0uZ2V0KENvZGUuY2xhc3MpOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgbmFtZXMucHV0KG5hbWUsIGNvZGUpOworICAgICAgICAgICAgICAgICAgICBjb2Rlcy5wdXQoY29kZSwgbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTkFNRVNfVE9fQ09ERVMgPSBuYW1lczsKKyAgICAgICAgICAgIENPREVTX1RPX05BTUVTID0gY29kZXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgQU5TSSBjb2RlIGZvciB0aGUgZ2l2ZW4gc3ltYm9saWMgbmFtZS4gIFN1cHBvcnRlZCBzeW1ib2xpYyBuYW1lcyBhcmUgYWxsIGRlZmluZWQgYXMKKyAgICAgICAgICogZmllbGRzIGluIHtAbGluayBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLnV0aWwuQU5TSS5Db2RlfSB3aGVyZSB0aGUgY2FzZSBpcyBub3Qgc2lnbmlmaWNhbnQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGludCBmb3JOYW1lKGZpbmFsIFN0cmluZyBuYW1lKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGFzc2VydCBuYW1lICE9IG51bGw7CisKKyAgICAgICAgICAgIC8vIEFsbCBuYW1lcyBpbiB0aGUgbWFwIGFyZSB1cHBlci1jYXNlCisgICAgICAgICAgICBTdHJpbmcgdG1wID0gbmFtZS50b1VwcGVyQ2FzZSgpOworICAgICAgICAgICAgTnVtYmVyIGNvZGUgPSAoTnVtYmVyKSBOQU1FU19UT19DT0RFUy5nZXQodG1wKTsKKworICAgICAgICAgICAgaWYgKGNvZGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgQU5TSSBjb2RlIG5hbWU6ICIgKyBuYW1lKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGNvZGUuaW50VmFsdWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBzeW1ib2xpYyBuYW1lIGZvciB0aGUgZ2l2ZW4gQU5TSSBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbmFtZShmaW5hbCBpbnQgY29kZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIENPREVTX1RPX05BTUVTLmdldChuZXcgSW50ZWdlcihjb2RlKSk7CisKKyAgICAgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIEFOU0kgY29kZTogIiArIGNvZGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vCisgICAgLy8gQnVmZmVyCisgICAgLy8KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVmZmVyCisgICAgeworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZ0J1ZmZlciBidWZmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCisgICAgICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGF1dG9DbGVhciA9IHRydWU7CisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZmYudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlmIChhdXRvQ2xlYXIpIGNsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgICAgIGJ1ZmYuc2V0TGVuZ3RoKDApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICAgICAgcmV0dXJuIGJ1ZmYubGVuZ3RoKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQnVmZmVyIGFwcGVuZChmaW5hbCBTdHJpbmcgdGV4dCkgeworICAgICAgICAgICAgYnVmZi5hcHBlbmQodGV4dCk7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJ1ZmZlciBhcHBlbmQoZmluYWwgT2JqZWN0IG9iaikgeworICAgICAgICAgICAgcmV0dXJuIGFwcGVuZChTdHJpbmcudmFsdWVPZihvYmopKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCdWZmZXIgYXR0cmliKGZpbmFsIGludCBjb2RlKSB7CisgICAgICAgICAgICBpZiAoaXNFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBidWZmLmFwcGVuZChBTlNJQ29kZXMuYXR0cmliKGNvZGUpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQnVmZmVyIGF0dHJpYihmaW5hbCBTdHJpbmcgdGV4dCwgZmluYWwgaW50IGNvZGUpIHsKKyAgICAgICAgICAgIGFzc2VydCB0ZXh0ICE9IG51bGw7CisKKyAgICAgICAgICAgIGlmIChpc0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKEFOU0lDb2Rlcy5hdHRyaWIoY29kZSkpLmFwcGVuZCh0ZXh0KS5hcHBlbmQoQU5TSUNvZGVzLmF0dHJpYihDb2RlLk9GRikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgYnVmZi5hcHBlbmQodGV4dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJ1ZmZlciBhdHRyaWIoZmluYWwgU3RyaW5nIHRleHQsIGZpbmFsIFN0cmluZyBjb2RlTmFtZSkgeworICAgICAgICAgICAgcmV0dXJuIGF0dHJpYih0ZXh0LCBDb2RlLmZvck5hbWUoY29kZU5hbWUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vCisgICAgLy8gUmVuZGVyZXIKKyAgICAvLworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZW5kZXJlcgorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVHSU5fVE9LRU4gPSAiQHwiOworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCRUdJTl9UT0tFTl9TSVpFID0gQkVHSU5fVE9LRU4ubGVuZ3RoKCk7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5EX1RPS0VOID0gInwiOworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTkRfVE9LRU5fU0laRSA9IEVORF9UT0tFTi5sZW5ndGgoKTsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0RFX1RFWFRfU0VQQVJBVE9SICA9ICIgIjsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0RFX0xJU1RfU0VQQVJBVE9SICA9ICIsIjsKKworICAgICAgICBwcml2YXRlIGZpbmFsIEJ1ZmZlciBidWZmID0gbmV3IEJ1ZmZlcigpOworCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcmVuZGVyKGZpbmFsIFN0cmluZyBpbnB1dCkgdGhyb3dzIFJlbmRlckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBhc3NlcnQgaW5wdXQgIT0gbnVsbDsKKworICAgICAgICAgICAgLy8gY3VycmVudCwgcHJlZml4IGFuZCBzdWZmaXggcG9zaXRpb25zCisgICAgICAgICAgICBpbnQgYyA9IDAsIHAsIHM7CisKKyAgICAgICAgICAgIHdoaWxlIChjIDwgaW5wdXQubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgICAgICBwID0gaW5wdXQuaW5kZXhPZihCRUdJTl9UT0tFTiwgYyk7CisgICAgICAgICAgICAgICAgaWYgKHAgPCAwKSB7IGJyZWFrOyB9CisKKyAgICAgICAgICAgICAgICBzID0gaW5wdXQuaW5kZXhPZihFTkRfVE9LRU4sIHAgKyBCRUdJTl9UT0tFTl9TSVpFKTsKKyAgICAgICAgICAgICAgICBpZiAocyA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlbmRlckV4Y2VwdGlvbigiTWlzc2luZyAnIiArIEVORF9UT0tFTiArICInOiAiICsgaW5wdXQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFN0cmluZyBleHByID0gaW5wdXQuc3Vic3RyaW5nKHAgKyBCRUdJTl9UT0tFTl9TSVpFLCBzKTsKKworICAgICAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKGlucHV0LnN1YnN0cmluZyhjLCBwKSk7CisKKyAgICAgICAgICAgICAgICBldmFsdWF0ZShleHByKTsKKworICAgICAgICAgICAgICAgIGMgPSBzICsgRU5EX1RPS0VOX1NJWkU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKGlucHV0LnN1YnN0cmluZyhjKSk7CisKKyAgICAgICAgICAgIHJldHVybiBidWZmLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgZXZhbHVhdGUoZmluYWwgU3RyaW5nIGlucHV0KSB0aHJvd3MgUmVuZGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGFzc2VydCBpbnB1dCAhPSBudWxsOworCisgICAgICAgICAgICBpbnQgaSA9IGlucHV0LmluZGV4T2YoQ09ERV9URVhUX1NFUEFSQVRPUik7CisgICAgICAgICAgICBpZiAoaSA8IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmVuZGVyRXhjZXB0aW9uKCJNaXNzaW5nIEFOU0kgY29kZS90ZXh0IHNlcGFyYXRvciAnIiArIENPREVfVEVYVF9TRVBBUkFUT1IgKyAiJzogIiArIGlucHV0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIHRtcCA9IGlucHV0LnN1YnN0cmluZygwLCBpKTsKKyAgICAgICAgICAgIFN0cmluZ1tdIGNvZGVzID0gdG1wLnNwbGl0KENPREVfTElTVF9TRVBBUkFUT1IpOworICAgICAgICAgICAgU3RyaW5nIHRleHQgPSBpbnB1dC5zdWJzdHJpbmcoaSArIDEsIGlucHV0Lmxlbmd0aCgpKTsKKworICAgICAgICAgICAgZm9yIChpbnQgaj0wOyBqPGNvZGVzLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgaW50IGNvZGUgPSBDb2RlLmZvck5hbWUoY29kZXNbal0pOworICAgICAgICAgICAgICAgIGJ1ZmYuYXR0cmliKGNvZGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBidWZmLmFwcGVuZCh0ZXh0KTsKKworICAgICAgICAgICAgYnVmZi5hdHRyaWIoQ29kZS5PRkYpOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gUmVuZGVyRXhjZXB0aW9uCisgICAgICAgIC8vCisKKyAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZW5kZXJFeGNlcHRpb24KKyAgICAgICAgICAgIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgUmVuZGVyRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBtc2cpIHsKKyAgICAgICAgICAgICAgICBzdXBlcihtc2cpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gSGVscGVycworICAgICAgICAvLworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0ZXN0KGZpbmFsIFN0cmluZyB0ZXh0KSB7CisgICAgICAgICAgICByZXR1cm4gdGV4dCAhPSBudWxsICYmIHRleHQuaW5kZXhPZihCRUdJTl9UT0tFTikgPj0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuY29kZShmaW5hbCBTdHJpbmcgdGV4dCwgZmluYWwgaW50IGNvZGUpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nQnVmZmVyKEJFR0lOX1RPS0VOKS4KKyAgICAgICAgICAgICAgICAgICAgYXBwZW5kKENvZGUubmFtZShjb2RlKSkuCisgICAgICAgICAgICAgICAgICAgIGFwcGVuZChDT0RFX1RFWFRfU0VQQVJBVE9SKS4KKyAgICAgICAgICAgICAgICAgICAgYXBwZW5kKHRleHQpLgorICAgICAgICAgICAgICAgICAgICBhcHBlbmQoRU5EX1RPS0VOKS4KKyAgICAgICAgICAgICAgICAgICAgdG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vCisgICAgLy8gUmVuZGVyV3JpdGVyCisgICAgLy8KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVuZGVyV3JpdGVyCisgICAgICAgIGV4dGVuZHMgUHJpbnRXcml0ZXIKKyAgICB7CisgICAgICAgIHByaXZhdGUgZmluYWwgUmVuZGVyZXIgcmVuZGVyZXIgPSBuZXcgUmVuZGVyZXIoKTsKKworICAgICAgICBwdWJsaWMgUmVuZGVyV3JpdGVyKGZpbmFsIE91dHB1dFN0cmVhbSBvdXQpIHsKKyAgICAgICAgICAgIHN1cGVyKG91dCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUmVuZGVyV3JpdGVyKGZpbmFsIE91dHB1dFN0cmVhbSBvdXQsIGZpbmFsIGJvb2xlYW4gYXV0b0ZsdXNoKSB7CisgICAgICAgICAgICBzdXBlcihvdXQsIGF1dG9GbHVzaCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUmVuZGVyV3JpdGVyKGZpbmFsIFdyaXRlciBvdXQpIHsKKyAgICAgICAgICAgIHN1cGVyKG91dCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUmVuZGVyV3JpdGVyKGZpbmFsIFdyaXRlciBvdXQsIGZpbmFsIGJvb2xlYW4gYXV0b0ZsdXNoKSB7CisgICAgICAgICAgICBzdXBlcihvdXQsIGF1dG9GbHVzaCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShmaW5hbCBTdHJpbmcgcykgeworICAgICAgICAgICAgaWYgKFJlbmRlcmVyLnRlc3QocykpIHsKKyAgICAgICAgICAgICAgICBzdXBlci53cml0ZShyZW5kZXJlci5yZW5kZXIocykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgc3VwZXIud3JpdGUocyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLworICAgIC8vIFJlbmRlck1lc3NhZ2VTb3VyY2UKKyAgICAvLworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZW5kZXJNZXNzYWdlU291cmNlCisgICAgICAgIGV4dGVuZHMgTWVzc2FnZVNvdXJjZQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBSZW5kZXJlciByZW5kZXJlciA9IG5ldyBSZW5kZXJlcigpOworCisgICAgICAgIHB1YmxpYyBSZW5kZXJNZXNzYWdlU291cmNlKGZpbmFsIFN0cmluZ1tdIG5hbWVzKSB7CisgICAgICAgICAgICBzdXBlcihuYW1lcyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUmVuZGVyTWVzc2FnZVNvdXJjZShmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgc3VwZXIobmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUmVuZGVyTWVzc2FnZVNvdXJjZShmaW5hbCBDbGFzc1tdIHR5cGVzKSB7CisgICAgICAgICAgICBzdXBlcih0eXBlcyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUmVuZGVyTWVzc2FnZVNvdXJjZShmaW5hbCBDbGFzcyB0eXBlKSB7CisgICAgICAgICAgICBzdXBlcih0eXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZShmaW5hbCBTdHJpbmcgY29kZSkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZyA9IHN1cGVyLmdldE1lc3NhZ2UoY29kZSk7CisKKyAgICAgICAgICAgIGlmIChSZW5kZXJlci50ZXN0KG1zZykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVuZGVyZXIucmVuZGVyKG1zZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBtc2c7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC91dGlsL0NsYXNzTmFtZUNvbXBsZXRvci5ncm9vdnkgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC91dGlsL0NsYXNzTmFtZUNvbXBsZXRvci5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFiZTdkNAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL3V0aWwvQ2xhc3NOYW1lQ29tcGxldG9yLmdyb292eQpAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLnV0aWwKKworLyoqCisgKiBQcm92aWRlcyBjb21wbGV0aW9uIGZvciBjbGFzcyBuYW1lcy4KKyAqCisgKiBAdmVyc2lvbiAkSWQkCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYXNvbkBwbGFuZXQ1Ny5jb20iPkphc29uIERpbGxvbjwvYT4KKyAqLworY2xhc3MgQ2xhc3NOYW1lQ29tcGxldG9yCisgICAgZXh0ZW5kcyBTaW1wbGVDb21wbGV0b3IKK3sKKyAgICBwcml2YXRlIGZpbmFsIEdyb292eUNsYXNzTG9hZGVyIGNsYXNzTG9hZGVyCisKKyAgICBDbGFzc05hbWVDb21wbGV0b3IoZmluYWwgR3Jvb3Z5Q2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKKyAgICAgICAgYXNzZXJ0IGNsYXNzTG9hZGVyCisKKyAgICAgICAgdGhpcy5jbGFzc0xvYWRlciA9IGNsYXNzTG9hZGVyCisgICAgICAgIAorICAgICAgICBkZWxpbWl0ZXIgPSAnLicKKyAgICB9CisKKyAgICBTb3J0ZWRTZXQgZ2V0Q2FuZGlkYXRlcygpIHsKKyAgICAgICAgZGVmIHNldCA9IG5ldyBUcmVlU2V0KCkKKworICAgICAgICAvLworICAgICAgICAvLyBUT0RPOiBGaWd1cmUgb3V0IHdoYXQgY2xhc3MgbmFtZXMgdG8gaW5jbHVkZSwgZm9yIG5vdyBqdXN0IGhhY2sgaW4gc29tZSB0byB0ZXN0IHdpdGgKKyAgICAgICAgLy8KKworICAgICAgICBzZXQgPDwgJ2phdmEubGFuZy5TeXN0ZW0nCisgICAgICAgIHNldCA8PCAnZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0JworCisgICAgICAgIHJldHVybiBzZXQKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvdXRpbC9IZWxwRm9ybWF0dGVyLmdyb292eSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL3V0aWwvSGVscEZvcm1hdHRlci5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJlZmNjOAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL3V0aWwvSGVscEZvcm1hdHRlci5ncm9vdnkKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwudXRpbAorCitpbXBvcnQgamxpbmUuVGVybWluYWwKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jbGkuT3B0aW9ucworCisvLworLy8gTk9URTogU29tZSBjb2RlIGR1cGxpY2F0ZWQgYW5kIGF1Z3VtZW50ZWQgZnJvbSBjb21tb25zLWNsaSAoMS4wKSBzb3VyY2VzIHRvCisvLyAgICAgICBwcm9wZXJseSByZW5kZXIgb3B0aW9ucyB3L2FyZ3VtZW50cy4KKy8vCisKKworLyoqCisgKiBDdXN0b20gQ0xJIGhlbHAgZm9ybWF0dGVyIHRvIHJlbmRlciB0aGluZ3MgY29ycmVjdGx5LgorICoKKyAqIEB2ZXJzaW9uICRJZCQKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphc29uQHBsYW5ldDU3LmNvbSI+SmFzb24gRGlsbG9uPC9hPgorICovCitjbGFzcyBIZWxwRm9ybWF0dGVyCisgICAgZXh0ZW5kcyBvcmcuYXBhY2hlLmNvbW1vbnMuY2xpLkhlbHBGb3JtYXR0ZXIKK3sKKyAgICBIZWxwRm9ybWF0dGVyKCkgeworICAgICAgICBkZWZhdWx0TGVmdFBhZCA9IDIKKyAgICAgICAgZGVmYXVsdERlc2NQYWQgPSA0CisgICAgfQorCisgICAgLy8gRGV0ZWN0IHRoZSB0ZXJtaW5hbCB3aWR0aCBsYXRlCisgICAgcHVibGljIGludCBnZXREZWZhdWx0V2lkdGgoKSB7CisgICAgICAgIHJldHVybiBUZXJtaW5hbC50ZXJtaW5hbC50ZXJtaW5hbFdpZHRoIC0gMQorICAgIH0KKworICAgIHByb3RlY3RlZCBTdHJpbmdCdWZmZXIgcmVuZGVyT3B0aW9ucyhmaW5hbCBTdHJpbmdCdWZmZXIgc2IsIGZpbmFsIGludCB3aWR0aCwgZmluYWwgT3B0aW9ucyBvcHRpb25zLCBmaW5hbCBpbnQgbGVmdFBhZCwgZmluYWwgaW50IGRlc2NQYWQpIHsKKyAgICAgICAgYXNzZXJ0IHNiICE9IG51bGwKKyAgICAgICAgYXNzZXJ0IG9wdGlvbnMKKyAgICAgICAgCisgICAgICAgIExpc3QgcHJlZml4ZXMgPSBbXQorICAgICAgICBTdHJpbmcgbHBhZCA9ICcgJyAqIGxlZnRQYWQKKyAgICAgICAgCisgICAgICAgIExpc3Qgb3B0cyA9IG9wdGlvbnMuc2hvcnRPcHRzLnZhbHVlcygpLnNvcnQgeyBhLCBiIC0+CisgICAgICAgICAgICByZXR1cm4gKGEub3B0ID09ICcgJyA/IGEubG9uZ09wdCA6IGEub3B0KSA8PT4gKGIub3B0ID09ICcgJyA/IGIubG9uZ09wdCA6IGIub3B0KQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBSZW5kZXIgdGhlIHByZWZpeGVzICgtWCwtLXh4eHggbXVjaykKKyAgICAgICAgb3B0cy5lYWNoIHsgb3B0aW9uIC0+CisgICAgICAgICAgICBkZWYgYnVmZiA9IG5ldyBTdHJpbmdCdWZmZXIoOCkKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKG9wdGlvbi5vcHQgPT0gJyAnKSB7CisgICAgICAgICAgICAgICAgYnVmZiA8PCAiJHtscGFkfSAgICAke2RlZmF1bHRMb25nT3B0UHJlZml4fSR7b3B0aW9uLmxvbmdPcHR9IgorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgYnVmZiA8PCAiJHtscGFkfSR7ZGVmYXVsdE9wdFByZWZpeH0ke29wdGlvbi5vcHR9IgorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChvcHRpb24uaGFzTG9uZ09wdCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmYgPDwgIiwgJHtkZWZhdWx0TG9uZ09wdFByZWZpeH0ke29wdGlvbi5sb25nT3B0fSIKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChvcHRpb24uaGFzQXJnKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAob3B0aW9uLmhhc0FyZ05hbWUoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uLmhhc09wdGlvbmFsQXJnKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmYgPDwgIls9JHtvcHRpb24uYXJnTmFtZX1dIgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVmZiA8PCAiPSR7b3B0aW9uLmFyZ05hbWV9IgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBidWZmIDw8ICcgJworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgcHJlZml4ZXMgPDwgYnVmZgorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBGaWd1cmUgb3V0IGhvdyBsb25nIHRoZSBiaWdnZXN0IHByZWZpeCBpcworICAgICAgICBpbnQgbWF4UHJlZml4ID0gcHJlZml4ZXMubWF4IHsgYSwgYiAtPiBhLnNpemUoKSA8PT4gYi5zaXplKCkgfS5zaXplKCkKKyAgICAgICAgCisgICAgICAgIFN0cmluZyBkcGFkID0gJyAnICogZGVzY1BhZAorICAgICAgICAKKyAgICAgICAgLy8gQW5kIHRoZW4gcmVuZGVyIGVhY2ggb3B0aW9uJ3MgcHJlZml4IHdpdGggaXRzIGRlc2NyaXB0aW9uCisgICAgICAgIG9wdHMuZWFjaFdpdGhJbmRleCB7IG9wdGlvbiwgaSAtPgorICAgICAgICAgICAgZGVmIGJ1ZmYgPSBuZXcgU3RyaW5nQnVmZmVyKHByZWZpeGVzW2ldLnRvU3RyaW5nKCkpCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChidWZmLnNpemUoKSA8IG1heFByZWZpeCkgeworICAgICAgICAgICAgICAgIGJ1ZmYgPDwgJyAnICogKG1heFByZWZpeCAtIGJ1ZmYuc2l6ZSgpKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmZiA8PCBkcGFkCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGludCBuZXh0TGluZVRhYlN0b3AgPSBtYXhQcmVmaXggKyBkZXNjUGFkCisgICAgICAgICAgICBTdHJpbmcgdGV4dCA9IGJ1ZmYgPDwgb3B0aW9uLmRlc2NyaXB0aW9uCisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJlbmRlcldyYXBwZWRUZXh0KHNiLCB3aWR0aCwgbmV4dExpbmVUYWJTdG9wLCB0ZXh0KQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoaSA8IG9wdHMuc2l6ZSgpIC0gMSkgeworICAgICAgICAgICAgICAgIHNiIDw8IGRlZmF1bHROZXdMaW5lCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiBzYgorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL3V0aWwvTG9nZ2VyLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC91dGlsL0xvZ2dlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmYTEwYTAKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC91dGlsL0xvZ2dlci5qYXZhCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLnV0aWw7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLklPOworCisvKioKKyAqIFByb3ZpZGVzIGEgdmVyeSwgdmVyeSBiYXNpYyBsb2dnaW5nIEFQSS4KKyAqCisgKiBAdmVyc2lvbiAkSWQkCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYXNvbkBwbGFuZXQ1Ny5jb20iPkphc29uIERpbGxvbjwvYT4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIExvZ2dlciB7CisgICAgcHVibGljIHN0YXRpYyBJTyBpbzsKKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIG5hbWU7CisKKyAgICBwcml2YXRlIExvZ2dlcihmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICBhc3NlcnQgbmFtZSAhPSBudWxsOworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgbG9nKGZpbmFsIFN0cmluZyBsZXZlbCwgT2JqZWN0IG1zZywgVGhyb3dhYmxlIGNhdXNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0IGxldmVsICE9IG51bGw7CisgICAgICAgIGFzc2VydCBtc2cgIT0gbnVsbDsKKyAgICAgICAgCisgICAgICAgIGlmIChpbyA9PSBudWxsKSB7CisgICAgICAgICAgICBpbyA9IG5ldyBJTygpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQWxsb3cgdGhlIG1zZyB0byBiZSBhIFRocm93YWJsZSwgYW5kIGhhbmRsZSBpdCBwcm9wZXJseSBpZiBubyBjYXVzZSBpcyBnaXZlbgorICAgICAgICBpZiAoY2F1c2UgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG1zZyBpbnN0YW5jZW9mIFRocm93YWJsZSkgeworICAgICAgICAgICAgICAgIGNhdXNlID0gKFRocm93YWJsZSkgbXNnOworICAgICAgICAgICAgICAgIG1zZyA9IGNhdXNlLmdldE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAKKyAgICAgICAgaW50IGNvbG9yID0gQU5TSS5Db2RlLkJPTEQ7CisgICAgICAgIGlmIChXQVJOLmVxdWFscyhsZXZlbCkgfHwgRVJST1IuZXF1YWxzKGxldmVsKSkgeworICAgICAgICAgICAgY29sb3IgPSBBTlNJLkNvZGUuUkVEOworICAgICAgICB9CisKKyAgICAgICAgYnVmZi5hcHBlbmQoQU5TSS5SZW5kZXJlci5lbmNvZGUobGV2ZWwsIGNvbG9yKSk7CisKKyAgICAgICAgYnVmZi5hcHBlbmQoIiBbIik7CisgICAgICAgIGJ1ZmYuYXBwZW5kKG5hbWUpOworICAgICAgICBidWZmLmFwcGVuZCgiXSAiKTsKKyAgICAgICAgYnVmZi5hcHBlbmQobXNnKTsKKworICAgICAgICBpby5vdXQucHJpbnRsbihidWZmKTsKKworICAgICAgICBpZiAoY2F1c2UgIT0gbnVsbCkgeworICAgICAgICAgICAgY2F1c2UucHJpbnRTdGFja1RyYWNlKGlvLm91dCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlvLmZsdXNoKCk7CisgICAgfQorICAgIAorICAgIC8vCisgICAgLy8gTGV2ZWwgaGVscGVycworICAgIC8vCisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFQlVHID0gIkRFQlVHIjsKKworICAgIHB1YmxpYyBib29sZWFuIGlzRGVidWdFbmFibGVkKCkgeworICAgICAgICByZXR1cm4gUHJlZmVyZW5jZXMudmVyYm9zaXR5ID09IElPLlZlcmJvc2l0eS5ERUJVRzsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RlYnVnKCkgeworICAgICAgICByZXR1cm4gaXNEZWJ1Z0VuYWJsZWQoKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgZGVidWcoZmluYWwgT2JqZWN0IG1zZykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBsb2coREVCVUcsIG1zZywgbnVsbCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgZGVidWcoZmluYWwgT2JqZWN0IG1zZywgZmluYWwgVGhyb3dhYmxlIGNhdXNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGxvZyhERUJVRywgbXNnLCBjYXVzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FSTiA9ICJXQVJOIjsKKworICAgIHB1YmxpYyB2b2lkIHdhcm4oZmluYWwgT2JqZWN0IG1zZykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGxvZyhXQVJOLCBtc2csIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdhcm4oZmluYWwgT2JqZWN0IG1zZywgZmluYWwgVGhyb3dhYmxlIGNhdXNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbG9nKFdBUk4sIG1zZywgY2F1c2UpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1IgPSAiRVJST1IiOworCisgICAgcHVibGljIHZvaWQgZXJyb3IoZmluYWwgT2JqZWN0IG1zZykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGxvZyhFUlJPUiwgbXNnLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBlcnJvcihmaW5hbCBPYmplY3QgbXNnLCBmaW5hbCBUaHJvd2FibGUgY2F1c2UpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBsb2coRVJST1IsIG1zZywgY2F1c2UpOworICAgIH0KKworICAgIC8vCisgICAgLy8gRmFjdG9yeSBhY2Nlc3MKKyAgICAvLworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgTG9nZ2VyIGNyZWF0ZShmaW5hbCBDbGFzcyB0eXBlKSB7CisgICAgICAgIHJldHVybiBuZXcgTG9nZ2VyKHR5cGUuZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExvZ2dlciBjcmVhdGUoZmluYWwgQ2xhc3MgdHlwZSwgZmluYWwgU3RyaW5nIHN1ZmZpeCkgeworICAgICAgICByZXR1cm4gbmV3IExvZ2dlcih0eXBlLmdldE5hbWUoKSArICIuIiArIHN1ZmZpeCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvdXRpbC9NZXNzYWdlU291cmNlLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC91dGlsL01lc3NhZ2VTb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGJmYTAzCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvdXRpbC9NZXNzYWdlU291cmNlLmphdmEKQEAgLTAsMCArMSwxNDUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLnV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7CitpbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OworCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0U3VwcG9ydDsKKworLyoqCisgKiBNZXNzYWdlIHNvdXJjZSBiYWNrZWQgdXAgYnkgb25lIG9yIG1vcmUge0BsaW5rIGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZX0KKyAqIGluc3RhbmNlcyBmb3Igc2ltcGxlIGkxOG4gc3VwcG9ydC4KKyAqCisgKiBAdmVyc2lvbiAkSWQkCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYXNvbkBwbGFuZXQ1Ny5jb20iPkphc29uIERpbGxvbjwvYT4KKyAqLworcHVibGljIGNsYXNzIE1lc3NhZ2VTb3VyY2UKKyAgICBleHRlbmRzIEdyb292eU9iamVjdFN1cHBvcnQKK3sKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZ1tdIGJ1bmRsZU5hbWVzOworICAgIAorICAgIHByaXZhdGUgUmVzb3VyY2VCdW5kbGVbXSBjYWNoZWRCdW5kbGVzOworICAgIAorICAgIHB1YmxpYyBNZXNzYWdlU291cmNlKGZpbmFsIFN0cmluZ1tdIG5hbWVzKSB7CisgICAgICAgIGFzc2VydCBuYW1lcyAhPSBudWxsOworICAgICAgICBhc3NlcnQgbmFtZXMubGVuZ3RoICE9IDA7CisgICAgICAgIAorICAgICAgICB0aGlzLmJ1bmRsZU5hbWVzID0gbmFtZXM7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBNZXNzYWdlU291cmNlKGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMobmV3IFN0cmluZ1tdIHsgbmFtZSB9KTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gY2xhc3NOYW1lcyhmaW5hbCBDbGFzc1tdIHR5cGVzKSB7CisgICAgICAgIGFzc2VydCB0eXBlcyAhPSBudWxsOworICAgICAgICBhc3NlcnQgdHlwZXMubGVuZ3RoICE9IDA7CisgICAgICAgIAorICAgICAgICBTdHJpbmdbXSBuYW1lcyA9IG5ldyBTdHJpbmdbdHlwZXMubGVuZ3RoXTsKKyAgICAgICAgCisgICAgICAgIGZvciAoaW50IGk9MDsgaTx0eXBlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0IHR5cGVzW2ldICE9IG51bGw7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG5hbWVzW2ldID0gdHlwZXNbaV0uZ2V0TmFtZSgpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gbmFtZXM7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBNZXNzYWdlU291cmNlKGZpbmFsIENsYXNzW10gdHlwZXMpIHsKKyAgICAgICAgdGhpcyhjbGFzc05hbWVzKHR5cGVzKSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBNZXNzYWdlU291cmNlKGZpbmFsIENsYXNzIHR5cGUpIHsKKyAgICAgICAgdGhpcyhuZXcgU3RyaW5nW10geyB0eXBlLmdldE5hbWUoKSB9KTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZVtdIGNyZWF0ZUJ1bmRsZXMoKSB7CisgICAgICAgIFJlc291cmNlQnVuZGxlW10gYnVuZGxlcyA9IG5ldyBSZXNvdXJjZUJ1bmRsZVtidW5kbGVOYW1lcy5sZW5ndGhdOworICAgICAgICAKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPGJ1bmRsZU5hbWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBhc3NlcnQgYnVuZGxlTmFtZXNbaV0gIT0gbnVsbDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYnVuZGxlc1tpXSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShidW5kbGVOYW1lc1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiBidW5kbGVzOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIFJlc291cmNlQnVuZGxlW10gZ2V0QnVuZGxlcygpIHsKKyAgICAgICAgaWYgKGNhY2hlZEJ1bmRsZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgY2FjaGVkQnVuZGxlcyA9IGNyZWF0ZUJ1bmRsZXMoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2FjaGVkQnVuZGxlczsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogR2V0IGEgcmF3IG1lc3NhZ2UgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlcyB1c2luZyB0aGUgZ2l2ZW4gY29kZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoZmluYWwgU3RyaW5nIGNvZGUpIHsKKyAgICAgICAgYXNzZXJ0IGNvZGUgIT0gbnVsbDsKKyAgICAgICAgCisgICAgICAgIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlcnJvciA9IG51bGw7CisgICAgICAgIAorICAgICAgICBSZXNvdXJjZUJ1bmRsZVtdIGJ1bmRsZXMgPSBnZXRCdW5kbGVzKCk7CisgICAgICAgIAorICAgICAgICBmb3IgKGludCBpPTA7IGk8YnVuZGxlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYnVuZGxlc1tpXS5nZXRTdHJpbmcoY29kZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBGb3Igbm93IGp1c3Qgc2F2ZSB0aGUgZmlyc3QgZXJyb3IsIHNob3VsZCByZWFsbHkgcm9sbCBhIG5ldyBtZXNzYWdlIHdpdGggYWxsIG9mIHRoZSBkZXRhaWxzCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAoZXJyb3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBhc3NlcnQgZXJyb3IgIT0gbnVsbDsKKyAgICAgICAgCisgICAgICAgIHRocm93IGVycm9yOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBGb3JtYXQgYSBtZXNzYWdlIChiYXNlZCBvbiB7QGxpbmsgTWVzc2FnZUZvcm1hdH0gdXNpbmcgdGhlIG1lc3NhZ2UKKyAgICAgKiBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGVzIHVzaW5nIHRoZSBnaXZlbiBjb2RlIGFzIGEgcGF0dGVybiBhbmQgdGhlCisgICAgICogZ2l2ZW4gb2JqZWN0cyBhcyBhcmd1bWVudHMuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBmb3JtYXQoZmluYWwgU3RyaW5nIGNvZGUsIGZpbmFsIE9iamVjdFtdIGFyZ3MpIHsKKyAgICAgICAgYXNzZXJ0IGFyZ3MgIT0gbnVsbDsKKyAgICAgICAgCisgICAgICAgIFN0cmluZyBwYXR0ZXJuID0gZ2V0TWVzc2FnZShjb2RlKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChwYXR0ZXJuLCBhcmdzKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHNlZSAjZ2V0TWVzc2FnZShTdHJpbmcpCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gZ2V0TWVzc2FnZShuYW1lKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC91dGlsL05vRXhpdFNlY3VyaXR5TWFuYWdlci5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvdXRpbC9Ob0V4aXRTZWN1cml0eU1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmM3MjhlCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvdXRpbC9Ob0V4aXRTZWN1cml0eU1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC51dGlsOworCitpbXBvcnQgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uOworCisvKioKKyAqIEN1c3RvbSBzZWN1cml0eSBtYW5hZ2VyIHRvIHtAbGluayBTeXN0ZW0jZXhpdH0gKGFuZCByZWxhdGVkKSBmcm9tIGJlaW5nIHVzZWQuCisgKgorICogQHZlcnNpb24gJFJldiQgJERhdGUkCisgKi8KK3B1YmxpYyBjbGFzcyBOb0V4aXRTZWN1cml0eU1hbmFnZXIKKyAgICBleHRlbmRzIFNlY3VyaXR5TWFuYWdlcgoreworICAgIHByaXZhdGUgZmluYWwgU2VjdXJpdHlNYW5hZ2VyIHBhcmVudDsKKworICAgIHB1YmxpYyBOb0V4aXRTZWN1cml0eU1hbmFnZXIoZmluYWwgU2VjdXJpdHlNYW5hZ2VyIHBhcmVudCkgeworICAgICAgICBhc3NlcnQgcGFyZW50ICE9IG51bGw7CisKKyAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CisgICAgfQorCisgICAgcHVibGljIE5vRXhpdFNlY3VyaXR5TWFuYWdlcigpIHsKKyAgICAgICAgdGhpcyhTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNoZWNrUGVybWlzc2lvbihmaW5hbCBQZXJtaXNzaW9uIHBlcm0pIHsKKyAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBwYXJlbnQuY2hlY2tQZXJtaXNzaW9uKHBlcm0pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWx3YXlzIHRocm93cyB7QGxpbmsgU2VjdXJpdHlFeGNlcHRpb259LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNoZWNrRXhpdChmaW5hbCBpbnQgY29kZSkgeworICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oIlVzZSBvZiBTeXN0ZW0uZXhpdCgpIGlmIGZvcmJpZGRlbiEiKTsKKyAgICB9CisKKyAgICAvKgorICAgIHB1YmxpYyB2b2lkIGNoZWNrUGVybWlzc2lvbihmaW5hbCBQZXJtaXNzaW9uIHBlcm0pIHsKKyAgICAgICAgYXNzZXJ0IHBlcm0gIT0gbnVsbDsKKworICAgICAgICBpZiAocGVybS5nZXROYW1lKCkuZXF1YWxzKCJleGl0Vk0iKSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJleGl0Vk0iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAqLworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL3V0aWwvUHJlZmVyZW5jZXMuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL3V0aWwvUHJlZmVyZW5jZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzY5NWRiCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvdXRpbC9QcmVmZXJlbmNlcy5qYXZhCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwudXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5wcmVmcy5CYWNraW5nU3RvcmVFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcjsKK2ltcG9ydCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZUNoYW5nZUV2ZW50OworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5JTzsKKworLyoqCisgKiBDb250YWluZXIgZm9yIHNoZWxsIHByZWZlcmVuY2VzLgorICoKKyAqIEB2ZXJzaW9uICRJZCQKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphc29uQHBsYW5ldDU3LmNvbSI+SmFzb24gRGlsbG9uPC9hPgorICovCitwdWJsaWMgY2xhc3MgUHJlZmVyZW5jZXMKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZXMgU1RPUkUgPSBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZXMudXNlclJvb3QoKS5ub2RlKCIvb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbCIpOworCisgICAgcHVibGljIHN0YXRpYyBJTy5WZXJib3NpdHkgdmVyYm9zaXR5OworCisgICAgc3RhdGljIHsKKyAgICAgICAgU3RyaW5nIHRtcCA9IFNUT1JFLmdldCgidmVyYm9zaXR5IiwgSU8uVmVyYm9zaXR5LklORk8ubmFtZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2ZXJib3NpdHkgPSBJTy5WZXJib3NpdHkuZm9yTmFtZSh0bXApOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdmVyYm9zaXR5ID0gSU8uVmVyYm9zaXR5LklORk87CisgICAgICAgICAgICBTVE9SRS5yZW1vdmUoInZlcmJvc2l0eSIpOworICAgICAgICB9CisKKyAgICAgICAgYWRkQ2hhbmdlTGlzdGVuZXIobmV3IFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByZWZlcmVuY2VDaGFuZ2UoZmluYWwgUHJlZmVyZW5jZUNoYW5nZUV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmdldEtleSgpLmVxdWFscygidmVyYm9zaXR5IikpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBldmVudC5nZXROZXdWYWx1ZSgpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBJTy5WZXJib3NpdHkuSU5GTy5uYW1lOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2l0eSA9IElPLlZlcmJvc2l0eS5mb3JOYW1lKG5hbWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0Tm9kZSgpLnB1dChldmVudC5nZXRLZXkoKSwgdmVyYm9zaXR5Lm5hbWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2hvd0xhc3RSZXN1bHQgPSBTVE9SRS5nZXRCb29sZWFuKCJzaG93LWxhc3QtcmVzdWx0IiwgdHJ1ZSk7CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2FuaXRpemVTdGFja1RyYWNlID0gU1RPUkUuZ2V0Qm9vbGVhbigic2FuaXRpemUtc3RhY2stdHJhY2UiLCB0cnVlKTsKKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10ga2V5cygpIHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb24geworICAgICAgICByZXR1cm4gU1RPUkUua2V5cygpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldChmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIGRlZmF1bHRWYWx1ZSkgeworICAgICAgICByZXR1cm4gU1RPUkUuZ2V0KG5hbWUsIGRlZmF1bHRWYWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0KGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiBnZXQobmFtZSwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHB1dChmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIFNUT1JFLnB1dChuYW1lLCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNsZWFyKCkgdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiB7CisgICAgICAgIFNUT1JFLmNsZWFyKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZENoYW5nZUxpc3RlbmVyKGZpbmFsIFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBTVE9SRS5hZGRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL3V0aWwvU2ltcGxlQ29tcGxldG9yLmphdmEgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC91dGlsL1NpbXBsZUNvbXBsZXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MGVmNjQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC91dGlsL1NpbXBsZUNvbXBsZXRvci5qYXZhCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLnV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKKworaW1wb3J0IGdyb292eS5sYW5nLkNsb3N1cmU7CisKKy8qKgorICogU3VwcG9ydCBmb3Igc2ltcGxlIGNvbXBsZXRvcnMuCisgKgorICogQHZlcnNpb24gJElkJAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFzb25AcGxhbmV0NTcuY29tIj5KYXNvbiBEaWxsb248L2E+CisgKi8KK3B1YmxpYyBjbGFzcyBTaW1wbGVDb21wbGV0b3IKKyAgICBleHRlbmRzIGpsaW5lLlNpbXBsZUNvbXBsZXRvcgoreworICAgIHB1YmxpYyBTaW1wbGVDb21wbGV0b3IoZmluYWwgU3RyaW5nW10gY2FuZGlkYXRlcykgeworICAgICAgICBzdXBlcihjYW5kaWRhdGVzKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIFNpbXBsZUNvbXBsZXRvcigpIHsKKyAgICAgICAgdGhpcyhuZXcgU3RyaW5nWzBdKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIFNpbXBsZUNvbXBsZXRvcihmaW5hbCBDbG9zdXJlIGxvYWRlcikgeworICAgICAgICB0aGlzKCk7CisgICAgICAgIAorICAgICAgICBhc3NlcnQgbG9hZGVyICE9IG51bGw7CisgICAgICAgIAorICAgICAgICBPYmplY3Qgb2JqID0gbG9hZGVyLmNhbGwoKTsKKyAgICAgICAgCisgICAgICAgIExpc3QgbGlzdCA9IG51bGw7CisgICAgICAgIAorICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgTGlzdCkgeworICAgICAgICAgICAgbGlzdCA9IChMaXN0KW9iajsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVE9ETzogTWF5YmUgaGFuZGxlIGFycmF5cyB0b28/CisgICAgICAgIC8vCisgICAgICAgIAorICAgICAgICBpZiAobGlzdCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGUgbG9hZGVyIGNsb3N1cmUgZGlkIG5vdCByZXR1cm4gYSBsaXN0IG9mIGNhbmRpY2F0ZXM7IGZvdW5kOiAiICsgb2JqKTsKKyAgICAgICAgfQorCisgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7CisKKyAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBhZGQoU3RyaW5nLnZhbHVlT2YoaXRlci5uZXh0KCkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZChmaW5hbCBTdHJpbmcgY2FuZGlkYXRlKSB7CisgICAgICAgIGFkZENhbmRpZGF0ZVN0cmluZyhjYW5kaWRhdGUpOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgbGVmdFNoaWZ0KGZpbmFsIFN0cmluZyBzKSB7CisgICAgICAgIGFkZChzKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8vCisgICAgLy8gTk9URTogRHVwbGljYXRlZCAoYW5kIGF1Z3VtZW50ZWQpIGZyb20gSkxpbmUgc291cmNlcyB0byBtYWtlIGl0IGNhbGwgZ2V0Q2FuZGlkYXRlcygpIHRvIG1ha2UgdGhlIGxpc3QgbW9yZSBkeW5hbWljCisgICAgLy8KKworICAgIHB1YmxpYyBpbnQgY29tcGxldGUoZmluYWwgU3RyaW5nIGJ1ZmZlciwgZmluYWwgaW50IGN1cnNvciwgZmluYWwgTGlzdCBjbGlzdCkgeworICAgICAgICBTdHJpbmcgc3RhcnQgPSAoYnVmZmVyID09IG51bGwpID8gIiIgOiBidWZmZXI7CisKKyAgICAgICAgU29ydGVkU2V0IG1hdGNoZXMgPSBnZXRDYW5kaWRhdGVzKCkudGFpbFNldChzdGFydCk7CisKKyAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbWF0Y2hlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIFN0cmluZyBjYW4gPSAoU3RyaW5nKSBpLm5leHQoKTsKKworICAgICAgICAgICAgaWYgKCEoY2FuLnN0YXJ0c1dpdGgoc3RhcnQpKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBTdHJpbmcgZGVsaW0gPSBnZXREZWxpbWl0ZXIoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGRlbGltICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBjYW4uaW5kZXhPZihkZWxpbSwgY3Vyc29yKTsKKworICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICBjYW4gPSBjYW4uc3Vic3RyaW5nKDAsIGluZGV4ICsgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlzdC5hZGQoY2FuKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjbGlzdC5zaXplKCkgPT0gMSkgeworICAgICAgICAgICAgY2xpc3Quc2V0KDAsICgoU3RyaW5nKSBjbGlzdC5nZXQoMCkpICsgIiAiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRoZSBpbmRleCBvZiB0aGUgY29tcGxldGlvbiBpcyBhbHdheXMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIuCisgICAgICAgIHJldHVybiAoY2xpc3Quc2l6ZSgpID09IDApID8gKC0xKSA6IDA7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvdXRpbC9YbWxDb21tYW5kUmVnaXN0cmFyLmdyb292eSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL3V0aWwvWG1sQ29tbWFuZFJlZ2lzdHJhci5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNmODBhNAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL3V0aWwvWG1sQ29tbWFuZFJlZ2lzdHJhci5ncm9vdnkKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC51dGlsCisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLlNoZWxsCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5Db21tYW5kCisKKy8qKgorICogUmVnaXN0ZXJzIHtAbGluayBDb21tYW5kfSBpbnN0YW5jZXMgZnJvbSBhbmQgWE1MIGZpbGUuCisgKgorICogQHZlcnNpb24gJElkJAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFzb25AcGxhbmV0NTcuY29tIj5KYXNvbiBEaWxsb248L2E+CisgKi8KK2NsYXNzIFhtbENvbW1hbmRSZWdpc3RyYXIKK3sKKyAgICBwcml2YXRlIGZpbmFsIExvZ2dlciBsb2cgPSBMb2dnZXIuY3JlYXRlKHRoaXMuY2xhc3MpCisgICAgCisgICAgcHJpdmF0ZSBmaW5hbCBTaGVsbCBzaGVsbAorICAgIAorICAgIHByaXZhdGUgZmluYWwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIKKyAgICAKKyAgICBYbWxDb21tYW5kUmVnaXN0cmFyKGZpbmFsIFNoZWxsIHNoZWxsLCBmaW5hbCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgeworICAgICAgICBhc3NlcnQgc2hlbGwKKyAgICAgICAgYXNzZXJ0IGNsYXNzTG9hZGVyCisgICAgICAgIAorICAgICAgICB0aGlzLnNoZWxsID0gc2hlbGwKKyAgICAgICAgdGhpcy5jbGFzc0xvYWRlciA9IGNsYXNzTG9hZGVyCisgICAgfQorICAgIAorICAgIHZvaWQgcmVnaXN0ZXIoZmluYWwgVVJMIHVybCkgeworICAgICAgICBhc3NlcnQgdXJsCisgICAgICAgIAorICAgICAgICBpZiAobG9nLmRlYnVnRW5hYmxlZCkgeworICAgICAgICAgICAgbG9nLmRlYnVnKCJSZWdpc3RlcmluZyBjb21tYW5kcyBmcm9tOiAkdXJsIikKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdXJsLndpdGhSZWFkZXIgeyByZWFkZXIgLT4KKyAgICAgICAgICAgIGRlZiBkb2MgPSBuZXcgWG1sUGFyc2VyKCkucGFyc2UocmVhZGVyKQorICAgICAgICAgICAgCisgICAgICAgICAgICBkb2MuY29tbWFuZC5lYWNoIHsgZWxlbWVudCAtPgorICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc25hbWUgPSBlbGVtZW50LnRleHQoKQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIENsYXNzIHR5cGUgPSBjbGFzc0xvYWRlci5sb2FkQ2xhc3MoY2xhc3NuYW1lKQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIENvbW1hbmQgY29tbWFuZCA9IHR5cGUubmV3SW5zdGFuY2Uoc2hlbGwpCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKGxvZy5kZWJ1Z0VuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDcmVhdGVkIGNvbW1hbmQgJyR7Y29tbWFuZC5uYW1lfSc6ICRjb21tYW5kIikKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc2hlbGwgPDwgY29tbWFuZAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvdXRpbC9wYWNrYWdlLmh0bWwgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC91dGlsL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDIwNzI3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvdXRpbC9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSwyNiBAQAorPCEtLQorICAgIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorCisgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gJElkOiBwYWNrYWdlLmh0bWwgNzI1NCAyMDA3LTA4LTE1IDIyOjI2OjM5WiB1c2VyNTcgJCAtLT4KKworPGh0bWw+CisgICAgPGJvZHk+CisgICAgICAgIDxwPgorICAgICAgICAgICAgVXRpbGl0eSBjbGFzc2VzIHJlbGF0ZWQgdG8gdGhlIEdyb292eSBTaGVsbCAoYWthLiA8dHQ+Z3Jvb3Z5c2g8L3R0PikuCisgICAgICAgIDwvcD4KKyAgICA8L2JvZHk+Cis8L2h0bWw+CisKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3htbC9Eb21Ub0dyb292eS5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMveG1sL0RvbVRvR3Jvb3Z5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg4M2FlMAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3htbC9Eb21Ub0dyb292eS5qYXZhCkBAIC0wLDAgKzEsMzc2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS50b29scy54bWw7CisKK2ltcG9ydCBncm9vdnkudXRpbC5JbmRlbnRQcmludGVyOworaW1wb3J0IG9yZy53M2MuZG9tLio7CisKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogQSBTQVggaGFuZGxlciBmb3IgdHVybmluZyBYTUwgaW50byBHcm9vdnkgc2NyaXB0cworICogCisgKiBAYXV0aG9yIEphbWVzIFN0cmFjaGFuCisgKiBAYXV0aG9yIHBhdWxrCisgKi8KK3B1YmxpYyBjbGFzcyBEb21Ub0dyb292eSB7CisKKyAgICBwcml2YXRlIEluZGVudFByaW50ZXIgb3V0OworICAgIHByaXZhdGUgYm9vbGVhbiBpbk1peGVkID0gZmFsc2U7CisgICAgcHJpdmF0ZSBTdHJpbmcgcXQgPSAiJyI7CisgICAgcHJpdmF0ZSBMaXN0IGtleXdvcmRzID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW117CisgICAgICAgICJpbXBvcnQiLCAicHJpdmF0ZSIsICJwdWJsaWMiLCAicHJvdGVjdGVkIgorICAgIH0pOworCisgICAgcHVibGljIERvbVRvR3Jvb3Z5KFByaW50V3JpdGVyIG91dCkgeworICAgICAgICB0aGlzKG5ldyBJbmRlbnRQcmludGVyKG91dCkpOworICAgIH0KKworICAgIC8vIFRPRE8gYWxsb3cgc3RyaW5nIHF1b3RpbmcgZGVsaW1pdGVyIHRvIGJlIHNwZWNpZmllZCwgZS5nLiAnIHZzICIKKyAgICBwdWJsaWMgRG9tVG9Hcm9vdnkoSW5kZW50UHJpbnRlciBvdXQpIHsKKyAgICAgICAgdGhpcy5vdXQgPSBvdXQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJpbnQoRG9jdW1lbnQgZG9jdW1lbnQpIHsKKyAgICAgICAgcHJpbnRDaGlsZHJlbihkb2N1bWVudCwgbmV3IEhhc2hNYXAoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBpZiAoYXJncy5sZW5ndGggPCAxKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlOiBEb21Ub0dyb292eSBpbmZpbGVuYW1lIFtvdXRmaWxlbmFtZV0iKTsKKyAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOworICAgICAgICB9CisgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGRvY3VtZW50ID0gcGFyc2UoYXJnc1swXSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVuYWJsZSB0byBwYXJzZSBpbnB1dCBmaWxlICciICsgYXJnc1swXSArICInOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgIH0KKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gbnVsbDsKKyAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgMikgeworICAgICAgICAgICAgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKFN5c3RlbS5vdXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIobmV3IEZpbGVXcml0ZXIobmV3IEZpbGUoYXJnc1sxXSkpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVuYWJsZSB0byBjcmVhdGUgb3V0cHV0IGZpbGUgJyIgKyBhcmdzWzFdICsgIic6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRG9tVG9Hcm9vdnkgY29udmVydGVyID0gbmV3IERvbVRvR3Jvb3Z5KHdyaXRlcik7CisgICAgICAgIGNvbnZlcnRlci5vdXQuaW5jcmVtZW50SW5kZW50KCk7CisgICAgICAgIHdyaXRlci5wcmludGxuKCIjIS9iaW4vZ3Jvb3Z5Iik7CisgICAgICAgIHdyaXRlci5wcmludGxuKCk7CisgICAgICAgIHdyaXRlci5wcmludGxuKCIvLyBnZW5lcmF0ZWQgZnJvbSAiICsgYXJnc1swXSk7CisgICAgICAgIHdyaXRlci5wcmludGxuKCJTeXN0ZW0ub3V0IDw8IG5ldyBncm9vdnkueG1sLlN0cmVhbWluZ01hcmt1cEJ1aWxkZXIoKS5iaW5kIHsiKTsgICAgICAgIAorICAgICAgICBjb252ZXJ0ZXIucHJpbnQoZG9jdW1lbnQpOworICAgICAgICB3cml0ZXIucHJpbnRsbigifSIpOworICAgICAgICB3cml0ZXIuY2xvc2UoKTsKKyAgICB9CisKKyAgICAvLyBJbXBsZW1lbnRhdGlvbiBtZXRob2RzCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgcHJpdmF0ZSBzdGF0aWMgRG9jdW1lbnQgcGFyc2UoU3RyaW5nIG5hbWUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgIGZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7CisgICAgICAgIERvY3VtZW50QnVpbGRlciBidWlsZGVyID0gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKyAgICAgICAgcmV0dXJuIGJ1aWxkZXIucGFyc2UobmV3IEZpbGUobmFtZSkpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHByaW50KE5vZGUgbm9kZSwgTWFwIG5hbWVzcGFjZXMsIGJvb2xlYW4gZW5kV2l0aENvbW1hKSB7CisgICAgICAgIHN3aXRjaCAobm9kZS5nZXROb2RlVHlwZSgpKSB7CisgICAgICAgICAgICBjYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDoKKyAgICAgICAgICAgICAgICBwcmludEVsZW1lbnQoKEVsZW1lbnQpIG5vZGUsIG5hbWVzcGFjZXMsIGVuZFdpdGhDb21tYSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDoKKyAgICAgICAgICAgICAgICBwcmludFBJKChQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24pIG5vZGUsIGVuZFdpdGhDb21tYSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE5vZGUuVEVYVF9OT0RFIDoKKyAgICAgICAgICAgICAgICBwcmludFRleHQoKFRleHQpIG5vZGUsIGVuZFdpdGhDb21tYSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDoKKyAgICAgICAgICAgICAgICBwcmludENvbW1lbnQoKENvbW1lbnQpIG5vZGUsIGVuZFdpdGhDb21tYSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBwcmludEVsZW1lbnQoRWxlbWVudCBlbGVtZW50LCBNYXAgbmFtZXNwYWNlcywgYm9vbGVhbiBlbmRXaXRoQ29tbWEpIHsKKyAgICAgICAgbmFtZXNwYWNlcyA9IGRlZmluZU5hbWVzcGFjZXMoZWxlbWVudCwgbmFtZXNwYWNlcyk7CisKKyAgICAgICAgZWxlbWVudC5ub3JtYWxpemUoKTsKKyAgICAgICAgcHJpbnRJbmRlbnQoKTsKKworICAgICAgICBTdHJpbmcgcHJlZml4ID0gZWxlbWVudC5nZXRQcmVmaXgoKTsKKyAgICAgICAgYm9vbGVhbiBoYXNQcmVmaXggPSBwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXgubGVuZ3RoKCkgPiAwOworICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gZ2V0TG9jYWxOYW1lKGVsZW1lbnQpOworICAgICAgICBib29sZWFuIGlzS2V5d29yZCA9IGNoZWNrRXNjYXBpbmcobG9jYWxOYW1lKTsKKyAgICAgICAgaWYgKGlzS2V5d29yZCB8fCBoYXNQcmVmaXgpIHByaW50KHF0KTsKKyAgICAgICAgaWYgKGhhc1ByZWZpeCkgeworICAgICAgICAgICAgcHJpbnQocHJlZml4KTsKKyAgICAgICAgICAgIHByaW50KCIuIik7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnQobG9jYWxOYW1lKTsKKyAgICAgICAgaWYgKGlzS2V5d29yZCB8fCBoYXNQcmVmaXgpIHByaW50KHF0KTsKKyAgICAgICAgcHJpbnQoIigiKTsKKworICAgICAgICBib29sZWFuIGhhc0F0dHJpYnV0ZXMgPSBwcmludEF0dHJpYnV0ZXMoZWxlbWVudCk7CisKKyAgICAgICAgTm9kZUxpc3QgbGlzdCA9IGVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOworICAgICAgICBpbnQgbGVuZ3RoID0gbGlzdC5nZXRMZW5ndGgoKTsKKyAgICAgICAgaWYgKGxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICBwcmludEVuZCgiKSIsIGVuZFdpdGhDb21tYSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBOb2RlIG5vZGUgPSBsaXN0Lml0ZW0oMCk7CisgICAgICAgICAgICBpZiAobGVuZ3RoID09IDEgJiYgbm9kZSBpbnN0YW5jZW9mIFRleHQpIHsKKyAgICAgICAgICAgICAgICBUZXh0IHRleHROb2RlID0gKFRleHQpIG5vZGU7CisgICAgICAgICAgICAgICAgU3RyaW5nIHRleHQgPSBnZXRUZXh0Tm9kZURhdGEodGV4dE5vZGUpOworICAgICAgICAgICAgICAgIGlmIChoYXNBdHRyaWJ1dGVzKSBwcmludCgiLCAiKTsKKyAgICAgICAgICAgICAgICBwcmludFF1b3RlZCh0ZXh0KTsKKyAgICAgICAgICAgICAgICBwcmludEVuZCgiKSIsIGVuZFdpdGhDb21tYSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1peGVkQ29udGVudChsaXN0KSkgeworICAgICAgICAgICAgICAgIHByaW50bG4oIikgeyIpOworICAgICAgICAgICAgICAgIG91dC5pbmNyZW1lbnRJbmRlbnQoKTsKKyAgICAgICAgICAgICAgICBib29sZWFuIG9sZEluTWl4ZWQgPSBpbk1peGVkOworICAgICAgICAgICAgICAgIGluTWl4ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGZvciAobm9kZSA9IGVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQobm9kZSwgbmFtZXNwYWNlcywgZmFsc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbk1peGVkID0gb2xkSW5NaXhlZDsKKyAgICAgICAgICAgICAgICBvdXQuZGVjcmVtZW50SW5kZW50KCk7CisgICAgICAgICAgICAgICAgcHJpbnRJbmRlbnQoKTsKKyAgICAgICAgICAgICAgICBwcmludEVuZCgifSIsIGVuZFdpdGhDb21tYSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByaW50bG4oIikgeyIpOworICAgICAgICAgICAgICAgIG91dC5pbmNyZW1lbnRJbmRlbnQoKTsKKyAgICAgICAgICAgICAgICBwcmludENoaWxkcmVuKGVsZW1lbnQsIG5hbWVzcGFjZXMpOworICAgICAgICAgICAgICAgIG91dC5kZWNyZW1lbnRJbmRlbnQoKTsKKyAgICAgICAgICAgICAgICBwcmludEluZGVudCgpOworICAgICAgICAgICAgICAgIHByaW50RW5kKCJ9IiwgZW5kV2l0aENvbW1hKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcmludFF1b3RlZChTdHJpbmcgdGV4dCkgeworICAgICAgICBpZiAodGV4dC5pbmRleE9mKCJcbiIpICE9IC0xKSB7CisgICAgICAgICAgICBwcmludCgiJycnIik7CisgICAgICAgICAgICBwcmludCh0ZXh0KTsKKyAgICAgICAgICAgIHByaW50KCInJyciKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50KHF0KTsKKyAgICAgICAgICAgIHByaW50KGVzY2FwZVF1b3RlKHRleHQpKTsKKyAgICAgICAgICAgIHByaW50KHF0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHByaW50UEkoUHJvY2Vzc2luZ0luc3RydWN0aW9uIGluc3RydWN0aW9uLCBib29sZWFuIGVuZFdpdGhDb21tYSkgeworICAgICAgICBwcmludEluZGVudCgpOworICAgICAgICBwcmludCgibWtwLnBpKCIgKyBxdCk7CisgICAgICAgIHByaW50KGluc3RydWN0aW9uLmdldFRhcmdldCgpKTsKKyAgICAgICAgcHJpbnQocXQgKyAiLCAiICsgcXQpOworICAgICAgICBwcmludChpbnN0cnVjdGlvbi5nZXREYXRhKCkpOworICAgICAgICBwcmludEVuZChxdCArICIpOyIsIGVuZFdpdGhDb21tYSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgcHJpbnRDb21tZW50KENvbW1lbnQgY29tbWVudCwgYm9vbGVhbiBlbmRXaXRoQ29tbWEpIHsKKyAgICAgICAgU3RyaW5nIHRleHQgPSBjb21tZW50LmdldERhdGEoKS50cmltKCk7CisgICAgICAgIGlmICh0ZXh0Lmxlbmd0aCgpID4wKSB7CisgICAgICAgICAgICBwcmludEluZGVudCgpOworICAgICAgICAgICAgcHJpbnQoIi8qICIpOworICAgICAgICAgICAgcHJpbnQodGV4dCk7CisgICAgICAgICAgICBwcmludEVuZCgiICovIiwgZW5kV2l0aENvbW1hKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHByaW50VGV4dChUZXh0IG5vZGUsIGJvb2xlYW4gZW5kV2l0aENvbW1hKSB7CisgICAgICAgIFN0cmluZyB0ZXh0ID0gZ2V0VGV4dE5vZGVEYXRhKG5vZGUpOworICAgICAgICBpZiAodGV4dC5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIHByaW50SW5kZW50KCk7CisgICAgICAgICAgICBpZiAoaW5NaXhlZCkgcHJpbnQoIm1rcC55aWVsZCAiKTsKKyAgICAgICAgICAgIHByaW50UXVvdGVkKHRleHQpOworICAgICAgICAgICAgcHJpbnRFbmQoIiIsIGVuZFdpdGhDb21tYSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBlc2NhcGVRdW90ZShTdHJpbmcgdGV4dCkgeworICAgICAgICByZXR1cm4gdGV4dC5yZXBsYWNlQWxsKCJcXFxcIiwgIlxcXFxcXFxcIikucmVwbGFjZUFsbChxdCwgIlxcXFwiICsgcXQpOworICAgIH0KKworICAgIHByb3RlY3RlZCBNYXAgZGVmaW5lTmFtZXNwYWNlcyhFbGVtZW50IGVsZW1lbnQsIE1hcCBuYW1lc3BhY2VzKSB7CisgICAgICAgIE1hcCBhbnN3ZXIgPSBudWxsOworICAgICAgICBTdHJpbmcgcHJlZml4ID0gZWxlbWVudC5nZXRQcmVmaXgoKTsKKyAgICAgICAgaWYgKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5sZW5ndGgoKSA+IDAgJiYgIW5hbWVzcGFjZXMuY29udGFpbnNLZXkocHJlZml4KSkgeworICAgICAgICAgICAgYW5zd2VyID0gbmV3IEhhc2hNYXAobmFtZXNwYWNlcyk7CisgICAgICAgICAgICBkZWZpbmVOYW1lc3BhY2UoYW5zd2VyLCBwcmVmaXgsIGVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCkpOworICAgICAgICB9CisgICAgICAgIE5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7CisgICAgICAgIGludCBsZW5ndGggPSBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBBdHRyIGF0dHJpYnV0ZSA9IChBdHRyKSBhdHRyaWJ1dGVzLml0ZW0oaSk7CisgICAgICAgICAgICBwcmVmaXggPSBhdHRyaWJ1dGUuZ2V0UHJlZml4KCk7CisgICAgICAgICAgICBpZiAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCgpID4gMCAmJiAhbmFtZXNwYWNlcy5jb250YWluc0tleShwcmVmaXgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGFuc3dlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGFuc3dlciA9IG5ldyBIYXNoTWFwKG5hbWVzcGFjZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZWZpbmVOYW1lc3BhY2UoYW5zd2VyLCBwcmVmaXgsIGF0dHJpYnV0ZS5nZXROYW1lc3BhY2VVUkkoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChhbnN3ZXIgIT0gbnVsbCkgPyBhbnN3ZXIgOiBuYW1lc3BhY2VzOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGRlZmluZU5hbWVzcGFjZShNYXAgbmFtZXNwYWNlcywgU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSkgeworICAgICAgICBuYW1lc3BhY2VzLnB1dChwcmVmaXgsIHVyaSk7CisgICAgICAgIGlmICghcHJlZml4LmVxdWFscygieG1sbnMiKSAmJiAhcHJlZml4LmVxdWFscygieG1sIikpIHsKKyAgICAgICAgICAgIHByaW50SW5kZW50KCk7CisgICAgICAgICAgICBwcmludCgibWtwLmRlY2xhcmVOYW1lc3BhY2UoIik7CisgICAgICAgICAgICBwcmludChwcmVmaXgpOworICAgICAgICAgICAgcHJpbnQoIjoiICsgcXQpOworICAgICAgICAgICAgcHJpbnQodXJpKTsKKyAgICAgICAgICAgIHByaW50bG4ocXQgKyAiKSIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJpbnRBdHRyaWJ1dGVzKEVsZW1lbnQgZWxlbWVudCkgeworICAgICAgICBib29sZWFuIGhhc0F0dHJpYnV0ZSA9IGZhbHNlOworICAgICAgICBOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOworICAgICAgICBpbnQgbGVuZ3RoID0gYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsKKyAgICAgICAgaWYgKGxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgcHJpbnRBdHRyaWJ1dGVXaXRoUHJlZml4KChBdHRyKSBhdHRyaWJ1dGVzLml0ZW0oaSksIGJ1ZmZlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaGFzQXR0cmlidXRlID0gcHJpbnRBdHRyaWJ1dGVXaXRob3V0UHJlZml4KChBdHRyKSBhdHRyaWJ1dGVzLml0ZW0oaSksIGhhc0F0dHJpYnV0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgIGlmIChoYXNBdHRyaWJ1dGUpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHByaW50KGJ1ZmZlci50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBoYXNBdHRyaWJ1dGUgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBoYXNBdHRyaWJ1dGU7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHByaW50QXR0cmlidXRlV2l0aFByZWZpeChBdHRyIGF0dHJpYnV0ZSwgU3RyaW5nQnVmZmVyIGJ1ZmZlcikgeworICAgICAgICBTdHJpbmcgcHJlZml4ID0gYXR0cmlidXRlLmdldFByZWZpeCgpOworICAgICAgICBpZiAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCgpID4gMCAmJiAhcHJlZml4LmVxdWFscygieG1sbnMiKSkgeworICAgICAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChxdCk7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKHByZWZpeCk7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIuIik7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGdldExvY2FsTmFtZShhdHRyaWJ1dGUpKTsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQocXQgKyAiOiIgKyBxdCk7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGVzY2FwZVF1b3RlKGdldEF0dHJpYnV0ZVZhbHVlKGF0dHJpYnV0ZSkpKTsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQocXQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoQXR0ciBhdHRyaWJ1dGUpIHsKKyAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZS5nZXRWYWx1ZSgpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBwcmludEF0dHJpYnV0ZVdpdGhvdXRQcmVmaXgoQXR0ciBhdHRyaWJ1dGUsIGJvb2xlYW4gaGFzQXR0cmlidXRlKSB7CisgICAgICAgIFN0cmluZyBwcmVmaXggPSBhdHRyaWJ1dGUuZ2V0UHJlZml4KCk7CisgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCB8fCBwcmVmaXgubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgaWYgKCFoYXNBdHRyaWJ1dGUpIHsKKyAgICAgICAgICAgICAgICBoYXNBdHRyaWJ1dGUgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcmludCgiLCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSBnZXRMb2NhbE5hbWUoYXR0cmlidXRlKTsKKyAgICAgICAgICAgIGJvb2xlYW4gbmVlZHNFc2NhcGluZyA9IGNoZWNrRXNjYXBpbmcobG9jYWxOYW1lKTsKKyAgICAgICAgICAgIGlmIChuZWVkc0VzY2FwaW5nKSBwcmludChxdCk7CisgICAgICAgICAgICBwcmludChsb2NhbE5hbWUpOworICAgICAgICAgICAgaWYgKG5lZWRzRXNjYXBpbmcpIHByaW50KHF0KTsKKyAgICAgICAgICAgIHByaW50KCI6Iik7CisgICAgICAgICAgICBwcmludFF1b3RlZChnZXRBdHRyaWJ1dGVWYWx1ZShhdHRyaWJ1dGUpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaGFzQXR0cmlidXRlOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja0VzY2FwaW5nKFN0cmluZyBsb2NhbE5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGtleXdvcmRzLmNvbnRhaW5zKGxvY2FsTmFtZSkgfHwgbG9jYWxOYW1lLmluZGV4T2YoIi0iKSAhPSAtMTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFRleHROb2RlRGF0YShUZXh0IG5vZGUpIHsKKyAgICAgICAgcmV0dXJuIG5vZGUuZ2V0RGF0YSgpLnRyaW0oKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtaXhlZENvbnRlbnQoTm9kZUxpc3QgbGlzdCkgeworICAgICAgICBib29sZWFuIGhhc1RleHQgPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBoYXNFbGVtZW50ID0gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwLCBzaXplID0gbGlzdC5nZXRMZW5ndGgoKTsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgTm9kZSBub2RlID0gbGlzdC5pdGVtKGkpOworICAgICAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7CisgICAgICAgICAgICAgICAgaGFzRWxlbWVudCA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBUZXh0KSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHRleHQgPSBnZXRUZXh0Tm9kZURhdGEoKFRleHQpIG5vZGUpOworICAgICAgICAgICAgICAgIGlmICh0ZXh0Lmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBoYXNUZXh0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGhhc1RleHQgJiYgaGFzRWxlbWVudDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBwcmludENoaWxkcmVuKE5vZGUgcGFyZW50LCBNYXAgbmFtZXNwYWNlcykgeworICAgICAgICBmb3IgKE5vZGUgbm9kZSA9IHBhcmVudC5nZXRGaXJzdENoaWxkKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgeworICAgICAgICAgICAgcHJpbnQobm9kZSwgbmFtZXNwYWNlcywgZmFsc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMb2NhbE5hbWUoTm9kZSBub2RlKSB7CisgICAgICAgIFN0cmluZyBhbnN3ZXIgPSBub2RlLmdldExvY2FsTmFtZSgpOworICAgICAgICBpZiAoYW5zd2VyID09IG51bGwpIHsKKyAgICAgICAgICAgIGFuc3dlciA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYW5zd2VyLnRyaW0oKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBwcmludEVuZChTdHJpbmcgdGV4dCwgYm9vbGVhbiBlbmRXaXRoQ29tbWEpIHsKKyAgICAgICAgaWYgKGVuZFdpdGhDb21tYSkgeworICAgICAgICAgICAgcHJpbnQodGV4dCk7CisgICAgICAgICAgICBwcmludGxuKCIsIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludGxuKHRleHQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgcHJpbnRsbihTdHJpbmcgdGV4dCkgeworICAgICAgICBvdXQucHJpbnRsbih0ZXh0KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBwcmludChTdHJpbmcgdGV4dCkgeworICAgICAgICBvdXQucHJpbnQodGV4dCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgcHJpbnRJbmRlbnQoKSB7CisgICAgICAgIG91dC5wcmludEluZGVudCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3htbC9wYWNrYWdlLmh0bWwgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy94bWwvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNDc5MmIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS90b29scy94bWwvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsOCBAQAorPGh0bWw+CisgIDxoZWFkPgorICAgIDx0aXRsZT5wYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMueG1sLio8L3RpdGxlPgorICA8L2hlYWQ+CisgIDxib2R5PgorICAgIDxwPlhNTCB1dGlsaXRpZXMgc3VjaCBhcyBmb3IgY29udmVydGluZyBYTUwgaW50byBHcm9vdnkgc2NyaXB0cy48L3A+CisgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3ZtcGx1Z2luL1ZNUGx1Z2luRmFjdG9yeS5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdm1wbHVnaW4vVk1QbHVnaW5GYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZkMGEyYwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3ZtcGx1Z2luL1ZNUGx1Z2luRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qDQorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnZtcGx1Z2luOw0KKw0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnZtcGx1Z2luLnY0LkphdmE0Ow0KKw0KKy8qKg0KKyAqIGZhY3RvcnkgY2xhc3MgdG8gZ2V0IGZ1bmN0aW9ubGl0eSBiYXNlZCBvbiB0aGUgVk0gdmVyc2lvbi4NCisgKiBUaGUgdXNhZ2Ugb2YgdGhpcyBjbGFzcyBpcyBub3QgZm9yIHB1YmxpYyB1c2UsIG9ubHkgZm9yIHRoZQ0KKyAqIHJ1bnRpbWUuDQorICogQGF1dGhvciBKb2NoZW4gVGhlb2Rvcm91DQorICovDQorcHVibGljIGNsYXNzIFZNUGx1Z2luRmFjdG9yeSB7DQorICAgIA0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkRLNV9DTEFTU05BTUVfQ0hFQ0sgPSAiamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbiI7DQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKREs1X1BMVUdJTl9OQU1FID0gIm9yZy5jb2RlaGF1cy5ncm9vdnkudm1wbHVnaW4udjUuSmF2YTUiOw0KKyAgICBwcml2YXRlIHN0YXRpYyBWTVBsdWdpbmcgcGx1Z2luOw0KKyAgICBzdGF0aWMgew0KKyAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICBDbGFzc0xvYWRlci5nZXRTeXN0ZW1DbGFzc0xvYWRlcigpLmxvYWRDbGFzcyhKREs1X0NMQVNTTkFNRV9DSEVDSyk7DQorICAgICAgICAgICAgcGx1Z2luID0gKFZNUGx1Z2luZykgVk1QbHVnaW5GYWN0b3J5LmNsYXNzLmdldENsYXNzTG9hZGVyKCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubG9hZENsYXNzKEpESzVfUExVR0lOX05BTUUpLm5ld0luc3RhbmNlKCk7DQorICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBleCkgew0KKyAgICAgICAgICAgIHBsdWdpbiA9IG5ldyBKYXZhNCgpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgc3RhdGljIFZNUGx1Z2luZyBnZXRQbHVnaW4oKSB7DQorICAgICAgICByZXR1cm4gcGx1Z2luOw0KKyAgICB9DQorICAgIA0KK30NCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS92bXBsdWdpbi9WTVBsdWdpbmcuamF2YSBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3ZtcGx1Z2luL1ZNUGx1Z2luZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ZTg2YmEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS92bXBsdWdpbi9WTVBsdWdpbmcuamF2YQpAQCAtMCwwICsxLDI3IEBACisvKg0KKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLg0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS52bXBsdWdpbjsNCisNCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuQ2xhc3NOb2RlOw0KKw0KKy8qKg0KKyAqIGludGVyZmFjZSB0byBhY2Nlc3MgVk0gdmVyc2lvbiBiYXNlZCBhY3Rpb25zDQorICogQGF1dGhvciBKb2NoZW4gVGhlb2Rvcm91DQorICovDQorcHVibGljIGludGVyZmFjZSBWTVBsdWdpbmcgew0KKw0KKyAgICB2b2lkIHNldEdlbmVyaWNzVHlwZXMoQ2xhc3NOb2RlIGMpOw0KK30NCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS92bXBsdWdpbi9wYWNrYWdlLmh0bWwgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS92bXBsdWdpbi9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUxZTI4NAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3ZtcGx1Z2luL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDI2IEBACis8IS0tCisgICAgQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisKKyAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLSAkSWQ6IHBhY2thZ2UuaHRtbCA3MjU0IDIwMDctMDgtMTUgMjI6MjY6MzlaIHVzZXI1NyAkIC0tPgorCis8aHRtbD4KKyAgICA8Ym9keT4KKyAgICAgICAgPHA+CisgICAgICAgICAgICBKVk0gdmVyc2lvbiBzcGVjaWZpYyBjbGFzc2VzLgorICAgICAgICA8L3A+CisgICAgPC9ib2R5PgorPC9odG1sPgorCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS92bXBsdWdpbi92NC9KYXZhNC5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdm1wbHVnaW4vdjQvSmF2YTQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGQ2MDE1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdm1wbHVnaW4vdjQvSmF2YTQuamF2YQpAQCAtMCwwICsxLDMyIEBACisvKg0KKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLg0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS52bXBsdWdpbi52NDsNCisNCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuQ2xhc3NOb2RlOw0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnZtcGx1Z2luLlZNUGx1Z2luZzsNCisNCisvKioNCisgKiBqYXZhIDQgYmFzZWQgZnVuY3Rpb25zDQorICogQGF1dGhvciBKb2NoZW4gVGhlb2Rvcm91DQorICoNCisgKi8NCitwdWJsaWMgY2xhc3MgSmF2YTQgaW1wbGVtZW50cyBWTVBsdWdpbmcgew0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmljc1R5cGVzKENsYXNzTm9kZSBjKSB7DQorICAgICAgICByZXR1cm47ICAgICAgICANCisgICAgfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS92bXBsdWdpbi92NC9wYWNrYWdlLmh0bWwgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS92bXBsdWdpbi92NC9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAzMjU4OAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3ZtcGx1Z2luL3Y0L3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDI2IEBACis8IS0tCisgICAgQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisKKyAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLSAkSWQ6IHBhY2thZ2UuaHRtbCA3MjU0IDIwMDctMDgtMTUgMjI6MjY6MzlaIHVzZXI1NyAkIC0tPgorCis8aHRtbD4KKyAgICA8Ym9keT4KKyAgICAgICAgPHA+CisgICAgICAgICAgICBKYXZhIDEuNCBzcGVjaWZpYyBjbGFzc2VzLgorICAgICAgICA8L3A+CisgICAgPC9ib2R5PgorPC9odG1sPgorCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS92bXBsdWdpbi92NS9KYXZhNS5qYXZhIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdm1wbHVnaW4vdjUvSmF2YTUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDQxZGUwCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdm1wbHVnaW4vdjUvSmF2YTUuamF2YQpAQCAtMCwwICsxLDEwOSBAQAorLyoNCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4NCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkudm1wbHVnaW4udjU7DQorDQoraW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7DQorDQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuR3Jvb3Z5QnVnRXJyb3I7DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LkNsYXNzTm9kZTsNCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuR2VuZXJpY3NUeXBlOw0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnZtcGx1Z2luLlZNUGx1Z2luZzsNCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuQ2xhc3NIZWxwZXI7DQorDQorLyoqDQorICogamF2YSA1IGJhc2VkIGZ1bmN0aW9ucw0KKyAqIEBhdXRob3IgSm9jaGVuIFRoZW9kb3JvdQ0KKyAqDQorICovDQorcHVibGljIGNsYXNzIEphdmE1IGltcGxlbWVudHMgVk1QbHVnaW5nIHsNCisNCisgICAgcHVibGljIHZvaWQgc2V0R2VuZXJpY3NUeXBlcyhDbGFzc05vZGUgY24pIHsNCisgICAgICAgIFR5cGVWYXJpYWJsZVtdIHR2cyA9IGNuLmdldFR5cGVDbGFzcygpLmdldFR5cGVQYXJhbWV0ZXJzKCk7DQorICAgICAgICBHZW5lcmljc1R5cGVbXSBndHMgPSBjb25maWd1cmVUeXBlVmFyaWFibGUodHZzKTsNCisgICAgICAgIGNuLnNldEdlbmVyaWNzVHlwZXMoZ3RzKTsNCisgICAgICAgIE9iamVjdCBhID0gRW51bS5jbGFzczsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBHZW5lcmljc1R5cGVbXSBjb25maWd1cmVUeXBlVmFyaWFibGUoVHlwZVZhcmlhYmxlW10gdHZzKSB7DQorICAgICAgICBpZiAodHZzLmxlbmd0aD09MCkgcmV0dXJuIG51bGw7DQorICAgICAgICBHZW5lcmljc1R5cGVbXSBndHMgPSBuZXcgR2VuZXJpY3NUeXBlW3R2cy5sZW5ndGhdOw0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0dnMubGVuZ3RoOyBpKyspIHsNCisgICAgICAgICAgICBndHNbaV0gPSBjb25maWd1cmVUeXBlVmFyaWFibGVEZWZpbnRpb24odHZzW2ldKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBndHM7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgR2VuZXJpY3NUeXBlIGNvbmZpZ3VyZVR5cGVWYXJpYWJsZURlZmludGlvbihUeXBlVmFyaWFibGUgdHYpIHsNCisgICAgICAgQ2xhc3NOb2RlIGJhc2UgPSBjb25maWd1cmVUeXBlVmFyaWFibGVSZWZlcmVuY2UodHYpOw0KKyAgICAgICBUeXBlW10gdEJvdW5kcyA9IHR2LmdldEJvdW5kcygpOw0KKyAgICAgICBpZiAodEJvdW5kcy5sZW5ndGg9PTApIHJldHVybiBuZXcgR2VuZXJpY3NUeXBlKGJhc2UpOw0KKyAgICAgICBDbGFzc05vZGVbXSBjQm91bmRzID0gbmV3IENsYXNzTm9kZVt0Qm91bmRzLmxlbmd0aF07DQorICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdEJvdW5kcy5sZW5ndGg7IGkrKykgew0KKyAgICAgICAgICAgY0JvdW5kc1tpXSA9IGNvbmZpZ3VyZVR5cGUodEJvdW5kc1tpXSk7DQorICAgICAgIH0NCisgICAgICAgR2VuZXJpY3NUeXBlIGd0ID0gbmV3IEdlbmVyaWNzVHlwZShiYXNlLGNCb3VuZHMsbnVsbCk7DQorICAgICAgIGd0LnNldFBsYWNlaG9sZGVyKHRydWUpOw0KKyAgICAgICByZXR1cm4gZ3Q7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgQ2xhc3NOb2RlIGNvbmZpZ3VyZVR5cGUoVHlwZSB0eXBlKSB7DQorICAgICAgICBpZiAodHlwZSBpbnN0YW5jZW9mIFdpbGRjYXJkVHlwZSkgew0KKyAgICAgICAgICAgIHJldHVybiBjb25maWd1cmVXaWxkY2FyZFR5cGUoKFdpbGRjYXJkVHlwZSkgdHlwZSk7DQorICAgICAgICB9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBQYXJhbWV0ZXJpemVkVHlwZSkgew0KKyAgICAgICAgICAgIHJldHVybiBjb25maWd1cmVQYXJhbWV0ZXJpemVkVHlwZSgoUGFyYW1ldGVyaXplZFR5cGUpIHR5cGUpOw0KKyAgICAgICAgfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgR2VuZXJpY0FycmF5VHlwZSkgew0KKyAgICAgICAgICAgIHRocm93IG5ldyBHcm9vdnlCdWdFcnJvcigiTm90IHlldCBpbXBsZW1lbnRlZCIpOw0KKyAgICAgICAgfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgVHlwZVZhcmlhYmxlKSB7DQorICAgICAgICAgICAgcmV0dXJuIGNvbmZpZ3VyZVR5cGVWYXJpYWJsZVJlZmVyZW5jZSgoVHlwZVZhcmlhYmxlKSB0eXBlKTsNCisgICAgICAgIH0gZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIENsYXNzKSB7DQorICAgICAgICAgICAgcmV0dXJuIENsYXNzSGVscGVyLm1ha2VXaXRob3V0Q2FjaGluZygoQ2xhc3MpIHR5cGUsIGZhbHNlKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgdGhyb3cgbmV3IEdyb292eUJ1Z0Vycm9yKCJ1bmtub3duIHR5cGU6ICIgKyB0eXBlICsgIiA6PSAiICsgdHlwZS5nZXRDbGFzcygpKTsNCisgICAgICAgIH0gICAgICAgIA0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIENsYXNzTm9kZSBjb25maWd1cmVXaWxkY2FyZFR5cGUoV2lsZGNhcmRUeXBlIHdpbGRjYXJkVHlwZSkgew0KKyAgICAgICAgdGhyb3cgbmV3IEdyb292eUJ1Z0Vycm9yKCJOb3QgeWV0IGltcGxlbWVudGVkIik7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgQ2xhc3NOb2RlIGNvbmZpZ3VyZVBhcmFtZXRlcml6ZWRUeXBlKFBhcmFtZXRlcml6ZWRUeXBlIHBhcmFtZXRlcml6ZWRUeXBlKSB7DQorICAgICAgICBDbGFzc05vZGUgYmFzZSA9IGNvbmZpZ3VyZVR5cGUocGFyYW1ldGVyaXplZFR5cGUuZ2V0UmF3VHlwZSgpKTsNCisgICAgICAgIEdlbmVyaWNzVHlwZVtdIGd0cyA9IGNvbmZpZ3VyZVR5cGVBcmd1bWVudHMocGFyYW1ldGVyaXplZFR5cGUuZ2V0QWN0dWFsVHlwZUFyZ3VtZW50cygpKTsNCisgICAgICAgIGJhc2Uuc2V0R2VuZXJpY3NUeXBlcyhndHMpOw0KKyAgICAgICAgcmV0dXJuIGJhc2U7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgQ2xhc3NOb2RlIGNvbmZpZ3VyZVR5cGVWYXJpYWJsZVJlZmVyZW5jZShUeXBlVmFyaWFibGUgdHYpIHsNCisgICAgICAgIENsYXNzTm9kZSBjbiA9IENsYXNzSGVscGVyLm1ha2VXaXRob3V0Q2FjaGluZyh0di5nZXROYW1lKCkpOw0KKyAgICAgICAgY24uc2V0R2VuZXJpY3NQbGFjZUhvbGRlcih0cnVlKTsNCisgICAgICAgIENsYXNzTm9kZSBjbjIgPSBDbGFzc0hlbHBlci5tYWtlV2l0aG91dENhY2hpbmcodHYuZ2V0TmFtZSgpKTsNCisgICAgICAgIEdlbmVyaWNzVHlwZVtdIGd0cyA9IG5ldyBHZW5lcmljc1R5cGVbXXtuZXcgR2VuZXJpY3NUeXBlKGNuMil9Ow0KKyAgICAgICAgY24uc2V0R2VuZXJpY3NUeXBlcyhndHMpOw0KKyAgICAgICAgY24uc2V0UmVkaXJlY3QoQ2xhc3NIZWxwZXIuT0JKRUNUX1RZUEUpOw0KKyAgICAgICAgcmV0dXJuIGNuOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIEdlbmVyaWNzVHlwZVtdIGNvbmZpZ3VyZVR5cGVBcmd1bWVudHMoVHlwZVtdIHRhKSB7DQorICAgICAgICBpZiAodGEubGVuZ3RoPT0wKSByZXR1cm4gbnVsbDsNCisgICAgICAgIEdlbmVyaWNzVHlwZVtdIGd0cyA9IG5ldyBHZW5lcmljc1R5cGVbdGEubGVuZ3RoXTsNCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGEubGVuZ3RoOyBpKyspIHsNCisgICAgICAgICAgICBndHNbaV0gPSBuZXcgR2VuZXJpY3NUeXBlKGNvbmZpZ3VyZVR5cGUodGFbaV0pKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBndHM7DQorICAgIH0NCisNCit9DQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdm1wbHVnaW4vdjUvcGFja2FnZS5odG1sIGIvZ3Jvb3Z5L3NyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdm1wbHVnaW4vdjUvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzZThlMTgKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS92bXBsdWdpbi92NS9wYWNrYWdlLmh0bWwKQEAgLTAsMCArMSwyNiBAQAorPCEtLQorICAgIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorCisgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gJElkOiBwYWNrYWdlLmh0bWwgNzI1NCAyMDA3LTA4LTE1IDIyOjI2OjM5WiB1c2VyNTcgJCAtLT4KKworPGh0bWw+CisgICAgPGJvZHk+CisgICAgICAgIDxwPgorICAgICAgICAgICAgSmF2YSA1IHNwZWNpZmljIGNsYXNzZXMuCisgICAgICAgIDwvcD4KKyAgICA8L2JvZHk+Cis8L2h0bWw+CisKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvbmF0aXZlL2Jhc2UuYyBiL2dyb292eS9zcmMvbmF0aXZlL2Jhc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjAwNDIxCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy9uYXRpdmUvYmFzZS5jCkBAIC0wLDAgKzEsODUgQEAKKyNpZmRlZiBfX0FQUExFX18KKyNpZmRlZiBfX01BQ0hfXworI2RlZmluZSBNQUNPU1gKKyNkZWZpbmUgVU5JWAorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIF9fbGludXhfXworI2RlZmluZSBVTklYCisjZGVmaW5lIExJTlVYCisjZW5kaWYKKworI2lmZGVmIFVOSVgKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjZW5kaWYKKworI2lmZGVmIExJTlVYCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8bGludXgvbGltaXRzLmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisjZW5kaWYKKworI2lmZGVmIE1BQ09TWAorI2luY2x1ZGUgPG1hY2gtby9keWxkLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjZW5kaWYKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworCisgIC8vIEdldCB0aGUgbG9jYXRpb24gb2YgdGhlIGV4ZWN1dGFibGUgLS0gcGxhdGZvcm0gc3BlY2lmaWMKKyNpZmRlZiBVTklYCisgIGNoYXIgKmphcmV4ZSA9IG1hbGxvYygoTUFYUEFUSExFTisyKSpzaXplb2YoY2hhcikpOworI2VuZGlmCisKKyNpZmRlZiBNQUNPU1gKKyAgdWludDMyX3QgbGVuZ3RoID0gTUFYUEFUSExFTiArIDI7CisgIHdoaWxlIChfTlNHZXRFeGVjdXRhYmxlUGF0aCgoY2hhciopamFyZXhlLCAmbGVuZ3RoKSA9PSAtMSkgeworICAgIGZyZWUoamFyZXhlKTsKKyAgICBqYXJleGUgPSBtYWxsb2MoKGxlbmd0aCkqc2l6ZW9mKGNoYXIpKTsKKyAgfQorI2VuZGlmCisKKyNpZmRlZiBMSU5VWAorICBjaGFyIHRlbXBbUEFUSF9NQVhdOworICBzcHJpbnRmKHRlbXAsICIvcHJvYy8lZC9leGUiLCBnZXRwaWQoKSk7CisgIHJlYWxwYXRoKHRlbXAsIGphcmV4ZSk7CisjZW5kaWYKKworICAvLyBTZXR1cCB0aGUgY29tbWFuZCBsaW5lLgorICAvLyBUT0RPOiBBZGQgLUogc3VwcG9ydCBmb3IgcGFzc2luZyBKYXZhIG9wdGlvbnMKKyAgY2hhciogYXJndjJbYXJnYysyXTsKKyAgYXJndjJbMF0gPSAiamF2YSI7CisgIGFyZ3YyWzFdID0gSkFWQV9DTEFTU19OQU1FOworCisgIC8vIFNldHVwIHRoZSBDTEFTU1BBVEggZW52aXJvbm1lbnQKKyAgY2hhciAqQ0xBU1NQQVRIID0gKGNoYXIqKSBnZXRlbnYoIkNMQVNTUEFUSCIpOworICBpZiAoIUNMQVNTUEFUSCkgQ0xBU1NQQVRIPSIiOworICBjaGFyICpORVdDTEFTU1BBVEggPSAoY2hhciopIGNhbGxvYyhzdHJsZW4oQ0xBU1NQQVRIKSsxK3N0cmxlbihqYXJleGUpKzEsIHNpemVvZihjaGFyKSk7IC8vICsxIGZvciA6LCArMSBmb3IgbnVsbCB0ZXJtaW5hdG9yCisgIHNwcmludGYoTkVXQ0xBU1NQQVRILCAiJXM6JXMiLCBqYXJleGUsIENMQVNTUEFUSCk7CisgIHNldGVudigiQ0xBU1NQQVRIIiwgTkVXQ0xBU1NQQVRILCAxKTsKKworICAvLyBTZXR1cCB0aGUgcmVzdCBvZiB0aGUgY29tbWFuZCBsaW5lIHRoYXQgd2FzIHBhc3NlZCBpbi4KKyAgLy8gVE9ETzogVGhpcyB3aWxsIGFsc28gYmUgYWZmZWN0ZWQgYnkgLUogb3B0aW9ucworICBpbnQgaTsKKyAgZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworICAgIGFyZ3YyW2krMV0gPSBhcmd2W2ldOworICB9CisgIGFyZ3YyW2FyZ2MrMV0gPSAwOworCisgIC8vIEV4ZWN1dGUgamF2YQorI2lmZGVmIFVOSVgKKyAgZnJlZShqYXJleGUpOworICBleGVjdnAoImphdmEiLCBhcmd2Mik7CisjZW5kaWYKKworICAvLyBSZXBvcnQgaWYgdGhlIGV4ZWMgZmFpbHMKKyAgcHJpbnRmKCJDYW5ub3QgZXhlY3V0ZSAnIik7CisgIGZvciAoaSA9IDA7IGkgPCBhcmdjKzE7IGkgKyspIHsgcHJpbnRmKCIlcyAiLCBhcmd2MltpXSk7IH0KKyNpZmRlZiBVTklYCisgIHByaW50ZigiJywgY2F1c2VkIGJ5IGVycm9yOiAlZFxuLiAgSW4gb3JkZXIgdG8gcnVuICVzIHlvdSBtdXN0IGhhdmUgdGhlIEphdmEgVk0geW91IHdhbnQgdG8gdXNlIGluIHlvdXIgUEFUSCIsIGVycm5vLCBhcmd2WzBdKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90Y2svYnVpbGQueG1sIGIvZ3Jvb3Z5L3NyYy90Y2svYnVpbGQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyZDgzMTYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rjay9idWlsZC54bWwKQEAgLTAsMCArMSwyMDIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPHByb2plY3QgbmFtZT0idGNrIiBkZWZhdWx0PSJkZWZhdWx0Ij4KKworICA8IS0tIC09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS0gLS0+CisgIDwhLS0gICAgICAgICAgICAgICAgICAgY29tcGlsZSBzZXR0aW5ncyAgICAgICAgICAgICAgICAtLT4KKyAgPCEtLSAtPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tIC0tPgorICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuZGVidWciIHZhbHVlPSJvbiIvPgorICAKKyAgPCEtLSAtPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tIC0tPgorICA8IS0tICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yaWVzICAgICAgICAgICAgICAgICAgICAgLS0+CisgIDwhLS0gLT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LSAtLT4KKyAgPHByb3BlcnR5IG5hbWU9InNyYy5kaXIiIHZhbHVlPSJzcmMiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmRpciIgdmFsdWU9ImJ1aWxkIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5jbGFzc2VzLmRpciIgdmFsdWU9IiR7YnVpbGQuZGlyfS9jbGFzc2VzIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJkaXN0LmRpciIgdmFsdWU9ImRpc3QiLz4KKworICA8IS0tIGphdmFkb2MgcHJvcGVydGllcyAtLT4KKyAgPHByb3BlcnR5IG5hbWU9ImphdmFkb2MuZGlyIiB2YWx1ZT0iZG9jIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJqYXZhZG9jLnBhY2thZ2VzIiB2YWx1ZT0ib3JnLmNvZGVoYXVzLmdyb292eS4qIi8+CisKKyAgPCEtLSBqdW5pdCBwcm9wZXJ0aWVzIC0tPgorICA8cHJvcGVydHkgbmFtZT0ianVuaXQuc3R5bGUuZGlyIiB2YWx1ZT0ic3R5bGVzIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0Y2FzZS5zcmMuZGlyIiB2YWx1ZT0idGVzdCIvPgorICA8cHJvcGVydHkgbmFtZT0iZ2VuZXJhdGVkLnRlc3Quc3JjLmRpciIgdmFsdWU9ImdlbnRlc3QiLz4KKyAgCisgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0LmNsYXNzZXMuZGlyIiB2YWx1ZT0iJHtidWlsZC5kaXJ9L3Rlc3QvY2xhc3NlcyIvPgorCisgIDwhLS0gVE9ETzogaGVyZSB5b3Ugc3BlY2lmeSB3aGVyZSB0aGUgY2xhc3NlcyB0byB0ZXN0IHJlc2lkZSAtLT4KKyAgPHByb3BlcnR5IG5hbWU9Iml0ZW1zLnVuZGVyLnRlc3QuZGlyIiB2YWx1ZT0iLi4vLi4vdGFyZ2V0L2luc3RhbGwvbGliIi8+CisgIAorICA8cHJvcGVydHkgbmFtZT0idGVzdC5yZXBvcnRzLmRpciIgdmFsdWU9InJlcG9ydHMiLz4KKyAgCisgIDwhLS0gLT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LSAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgIHRhcmdldHMgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tIC09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS0gLS0+CisgIDx0YXJnZXQgbmFtZT0iZGVmYXVsdCIgCisgICAgICAgICAgZGVwZW5kcz0iY2xlYW4sdGVzdC1jb21waWxlIiAKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iZGVmYXVsdDogcnVuIHRoZSBncm9vdnkgdGVzdCBzdWl0ZSIKKyAgLz4KKyAgCisgIDx0YXJnZXQgbmFtZT0iYWxsIiAKKyAgICAgICAgICBkZXBlbmRzPSJ0ZXN0LGRpc3QiIAorICAgICAgICAgIGRlc2NyaXB0aW9uPSJidWlsZCBhbmQgdGVzdCBldmVyeXRoaW5nIgorICAvPgorCisgIDx0YXJnZXQgbmFtZT0iY2xlYW4iIGRlc2NyaXB0aW9uPSJyZW1vdmUgYWxsIGJ1aWx0IGZpbGVzIj4KKyAgICA8ZGVsZXRlIGRpcj0iJHtqYXZhZG9jLmRpcn0iIC8+CisgICAgPGRlbGV0ZSBkaXI9IiR7YnVpbGQuZGlyfSIgLz4KKyAgICA8ZGVsZXRlIGRpcj0iJHtkaXN0LmRpcn0iIC8+CisgICAgPGRlbGV0ZSBkaXI9IiR7Z2VuZXJhdGVkLnRlc3Quc3JjLmRpcn0iIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZGlzdCIgCisgICAgICAgICAgZGVwZW5kcz0iY29tcGlsZSIgCisgICAgICAgICAgZGVzY3JpcHRpb249ImNyZWF0ZSBkaXN0cmlidXRhYmxlcyAoamFycyBldGMpIj4KKyAgICA8bWtkaXIgZGlyPSIke2Rpc3QuZGlyfSIgLz4KKyAgICA8amFyIGphcmZpbGU9IiR7ZGlzdC5kaXJ9L3Rjay5qYXIiIAorICAgICAgICAgbWFuaWZlc3Q9IiR7c3JjLmRpcn0vbWFuaWZlc3QudHh0Ij4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtidWlsZC5jbGFzc2VzLmRpcn0iLz4KKyAgICA8L2phcj4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJkb2NzIiBkZXBlbmRzPSJpbml0IiBkZXNjcmlwdGlvbj0iZ2VuZXJhdGUgZG9jdW1lbnRhdGlvbiI+CisgICAgPG1rZGlyIGRpcj0iJHtqYXZhZG9jLmRpcn0iIC8+CisgICAgPGphdmFkb2Mgc291cmNlcGF0aD0iJHtzcmMuZGlyfSIgCisgICAgICAgICAgICAgZGVzdGRpcj0iJHtqYXZhZG9jLmRpcn0iIAorICAgICAgICAgICAgIHBhY2thZ2VuYW1lcz0iJHtqYXZhZG9jLnBhY2thZ2VzfSIKKyAgICAgICAgICAgICB1c2U9InRydWUiCisgICAgICAgICAgICAgd2luZG93dGl0bGU9InRjayIKKyAgICAgICAgICAgICBwcml2YXRlPSJ0cnVlIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0icnVuIiBkZXBlbmRzPSJjb21waWxlIiBkZXNjcmlwdGlvbj0iY29tcGlsZSBhbmQgcnVuIj4KKyAgICA8amF2YSBjbGFzc25hbWU9Im9yZy5jb2RlaGF1cy5ncm9vdnkudGNrLkdlbmVyYXRlVGVzdENhc2VzIiAKKyAgICAgICAgICBmb3JrPSJ5ZXMiIAorICAgICAgICAgIGNsYXNzcGF0aHJlZj0icHJvamVjdC5jbGFzc3BhdGgiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJwbGFpbi10ZXN0IgorICAgICAgICAgIGRlcGVuZHM9InRlc3QtY29tcGlsZSIgCisgICAgICAgICAgZGVzY3JpcHRpb249InJ1biBhbGwgdGVzdCBjYXNlcyI+CisgICAgPGp1bml0IGhhbHRvbmZhaWx1cmU9InRydWUiIGZvcms9Im5vIj4KKyAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InByb2plY3QuY2xhc3NwYXRoIi8+CisgICAgICA8Zm9ybWF0dGVyIHR5cGU9InBsYWluIiB1c2VmaWxlPSJmYWxzZSIvPgorICAgICAgPGZvcm1hdHRlciB0eXBlPSJ4bWwiIHVzZWZpbGU9InRydWUiLz4KKyAgICAgIDxiYXRjaHRlc3QgdG9kaXI9IiR7dGVzdC5yZXBvcnRzLmRpcn0iPgorICAgICAgICA8ZmlsZXNldCBkaXI9IiR7dGVzdC5jbGFzc2VzLmRpcn0iPgorICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLypUZXN0LmNsYXNzIiAvPgorICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICA8L2JhdGNodGVzdD4KKyAgICA8L2p1bml0PgorICA8L3RhcmdldD4KKyAgICAgICAgCisgIDx0YXJnZXQgbmFtZT0idGVzdCIgCisgICAgICAgICAgZGVwZW5kcz0idGVzdC1jb21waWxlIiAKKyAgICAgICAgICBkZXNjcmlwdGlvbj0iSFRNTCBvdXRwdXQgb2YgdGVzdCBjYXNlcyI+CisgICAgPG1rZGlyIGRpcj0iJHt0ZXN0LnJlcG9ydHMuZGlyfSIvPgorICAgIDxqdW5pdCBoYWx0b25mYWlsdXJlPSJmYWxzZSIgZm9yaz0ibm8iPgorICAgICAgPGNsYXNzcGF0aCByZWZpZD0icHJvamVjdC5jbGFzc3BhdGgiLz4KKyAgICAgIDxmb3JtYXR0ZXIgdHlwZT0ieG1sIiB1c2VmaWxlPSJ0cnVlIi8+CisKKyAgICAgIDxiYXRjaHRlc3QgdG9kaXI9IiR7dGVzdC5yZXBvcnRzLmRpcn0iPgorICAgICAgICA8ZmlsZXNldCBkaXI9IiR7dGVzdC5jbGFzc2VzLmRpcn0iPgorICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKlRlc3QuY2xhc3MiIC8+IAorICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICA8L2JhdGNodGVzdD4KKworICAgIDwvanVuaXQ+CisKKyAgICA8anVuaXRyZXBvcnQgdG9kaXI9IiR7dGVzdC5yZXBvcnRzLmRpcn0iPgorICAgICAgPGZpbGVzZXQgZGlyPSIke3Rlc3QucmVwb3J0cy5kaXJ9Ij4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iVEVTVC0qLnhtbCIvPgorICAgICAgPC9maWxlc2V0PgorICAgICAgPHJlcG9ydCBmb3JtYXQ9ImZyYW1lcyIgc3R5bGVkaXI9IiR7anVuaXQuc3R5bGUuZGlyfSIgdG9kaXI9IiR7dGVzdC5yZXBvcnRzLmRpcn0iLz4KKyAgICA8L2p1bml0cmVwb3J0PgorICAgIDxlY2hvPgorKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCit8IG9wZW4gcmVwb3J0cy9pbmRleC5odG1sIHwKKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworPC9lY2hvPgorICA8L3RhcmdldD4KKworCisKKyAgPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXBlbmRzPSJpbml0IiBkZXNjcmlwdGlvbj0iY29tcGlsZSBqYXZhIGFuZCBncm9vdnkgc291cmNlcyI+CisgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5jbGFzc2VzLmRpcn0iIC8+CisKKyAgICA8Z3Jvb3Z5YyBkZXN0ZGlyPSIke2J1aWxkLmNsYXNzZXMuZGlyfSIKKyAgICAgICAgICAgICBzcmNkaXI9IiR7c3JjLmRpcn0iCisgICAgICAgICAgICAgbGlzdGZpbGVzPSJ0cnVlIj4KKyAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0icHJvamVjdC5jbGFzc3BhdGgiLz4KKyAgICA8L2dyb292eWM+CisKKyAgICA8amF2YWMgc3JjZGlyPSIke3NyYy5kaXJ9IgorICAgICAgICAgICBkZXN0ZGlyPSIke2J1aWxkLmNsYXNzZXMuZGlyfSIKKyAgICAgICAgICAgY2xhc3NwYXRocmVmPSJwcm9qZWN0LmNsYXNzcGF0aCIKKyAgICAgICAgICAgZGVidWc9IiR7YnVpbGQuZGVidWd9IgorICAgICAgICAgICBkZXByZWNhdGlvbj0ib24iLz4KKyAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImdlbmVyYXRlIiBkZXBlbmRzPSJkaXN0IiBkZXNjcmlwdGlvbj0iZ2VuZXJhdGUgdGVzdCBjYXNlcyI+CisgICAgICA8bWtkaXIgZGlyPSIke2dlbmVyYXRlZC50ZXN0LnNyYy5kaXJ9IiAvPgorICAgICAgPHRhc2tkZWYgbmFtZT0iZ2VudGVzdHMiIGNsYXNzbmFtZT0ib3JnLmNvZGVoYXVzLmdyb292eS50Y2suR2VuZXJhdGVUZXN0Q2FzZXMiIGNsYXNzcGF0aHJlZj0icHJvamVjdC5jbGFzc3BhdGgiLz4KKworICAgICAgPGdlbnRlc3RzIGRlc3RkaXI9IiR7Z2VuZXJhdGVkLnRlc3Quc3JjLmRpcn0iCisgICAgICAgICAgICAgICAgc3JjZGlyPSIke3Rlc3RjYXNlLnNyYy5kaXJ9IgorICAgICAgICAgICAgICAgIGxpc3RmaWxlcz0idHJ1ZSIvPgorICAgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdC1jb21waWxlIiBkZXBlbmRzPSJnZW5lcmF0ZSIgZGVzY3JpcHRpb249ImNvbXBpbGUgdGVzdHMiPgorICAgIDxta2RpciBkaXI9IiR7dGVzdC5jbGFzc2VzLmRpcn0iIC8+CisgICAgPGphdmFjIHNyY2Rpcj0iJHtnZW5lcmF0ZWQudGVzdC5zcmMuZGlyfSIKKyAgICAgICAgICAgZGVzdGRpcj0iJHt0ZXN0LmNsYXNzZXMuZGlyfSIgCisgICAgICAgICAgIGNsYXNzcGF0aHJlZj0icHJvamVjdC5jbGFzc3BhdGgiIAorICAgICAgICAgICBkZWJ1Zz0iJHtidWlsZC5kZWJ1Z30iIAorICAgICAgICAgICBkZXByZWNhdGlvbj0ib24iPgorICAgIDwvamF2YWM+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iaW5kZXBlbmRlbnQtdGVzdC1jb21waWxlIiBkZXBlbmRzPSJnZW5lcmF0ZSIgZGVzY3JpcHRpb249ImNvbXBpbGUgdGVzdHMiPgorICAgIDxta2RpciBkaXI9IiR7dGVzdC5jbGFzc2VzLmRpcn0iIC8+CisgICAgPGphdmFjIHNyY2Rpcj0iJHtnZW5lcmF0ZWQudGVzdC5zcmMuZGlyfSIKKyAgICAgICAgICAgZGVzdGRpcj0iJHt0ZXN0LmNsYXNzZXMuZGlyfSIgCisgICAgICAgICAgIGNsYXNzcGF0aHJlZj0icHJvamVjdC5jbGFzc3BhdGgiIAorICAgICAgICAgICBkZWJ1Zz0iJHtidWlsZC5kZWJ1Z30iIAorICAgICAgICAgICBkZXByZWNhdGlvbj0ib24iPgorICAgIDwvamF2YWM+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iaW5pdCIgZGVwZW5kcz0iaW5pdC5zdWIuYnVpbGQsaW5pdC5pbmRlcGVuZGVudC5idWlsZCI+CisgICAgPHRzdGFtcC8+CisgIDwvdGFyZ2V0PgorCisgIDwhLS0gLT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LSAtLT4KKyAgPCEtLSAgICAgICAgICAgICAgICAgICAgIERhdGF0eXBlcyAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8IS0tIC09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS0gLS0+CisKKyAgPCEtLSB0aGlzIHRhcmdldCBpcyBwZXJmb3JtZWQgd2UgYXJlIHdpdGhpbiBhIG1hdmVuIGJ1aWxkIC0tPgorICA8dGFyZ2V0IG5hbWU9ImluaXQuc3ViLmJ1aWxkIiBpZj0ibWF2ZW4uY29tcGlsZS5zb3VyY2UiPgorCisgICAgPHBhdGggaWQ9InByb2plY3QuY2xhc3NwYXRoIj4KKyAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0ZXN0LmNsYXNzZXMuZGlyfSIvPgorICAgICAgPHBhdGggcmVmaWQ9InBhc3NlZC5jbGFzc3BhdGgiLz4KKyAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtidWlsZC5jbGFzc2VzLmRpcn0iLz4KKyAgICA8L3BhdGg+CisgIAorICA8L3RhcmdldD4KKworICA8IS0tIHRoaXMgdGFyZ2V0IGlzIHBlcmZvcm1lZCB3aGVuIGFudCBpcyBjYWxsZWQgZnJvbSBjb21tYW5kIGxpbmUgLS0+CisgIDx0YXJnZXQgbmFtZT0iaW5pdC5pbmRlcGVuZGVudC5idWlsZCIgdW5sZXNzPSJtYXZlbi5jb21waWxlLnNvdXJjZSI+CisKKyAgICA8cGF0aCBpZD0icHJvamVjdC5jbGFzc3BhdGgiPgorICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3Rlc3QuY2xhc3Nlcy5kaXJ9Ii8+CisgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YnVpbGQuY2xhc3Nlcy5kaXJ9Ii8+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7aXRlbXMudW5kZXIudGVzdC5kaXJ9Ij4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qYXIiIC8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgPC9wYXRoPgorCisgIDwvdGFyZ2V0PgorICAgICAgIAorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90Y2svc3JjL21hbmlmZXN0LnR4dCBiL2dyb292eS9zcmMvdGNrL3NyYy9tYW5pZmVzdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRkMDYzNgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGNrL3NyYy9tYW5pZmVzdC50eHQKQEAgLTAsMCArMSwyIEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjAKK01haW4tQ2xhc3M6IG9yZy5jb2RlaGF1cy5ncm9vdnkudGNrLkdlbmVyYXRlVGVzdENhc2VzCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rjay9zcmMvb3JnL2NvZGVoYXVzL2dyb292eS90Y2svQmF0Y2hHZW5lcmF0ZS5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rjay9zcmMvb3JnL2NvZGVoYXVzL2dyb292eS90Y2svQmF0Y2hHZW5lcmF0ZS5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY0M2MyYwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGNrL3NyYy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rjay9CYXRjaEdlbmVyYXRlLmdyb292eQpAQCAtMCwwICsxLDg2IEBACisvKioKKyAqIEBhdXRob3IgSmVyZW15IFJheW5lcgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkudGNrCisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKK2NsYXNzIEJhdGNoR2VuZXJhdGUgeworICAgIGRlZiBnZW5lcmF0b3I7CisgICAgZGVmIHNyY0RpclBhdGg7CisgICAgZGVmIHRhcmdldERpcjsKKyAgICBkZWYgc3JjRW5jb2Rpbmc7CisgICAgZGVmIHNyY3M7CisgICAgZGVmIHNwZXcKKworICAgIHB1YmxpYyBCYXRjaEdlbmVyYXRlKCkgeworICAgICAgICBnZW5lcmF0b3IgPSBuZXcgVGVzdEdlbmVyYXRvcigpOworICAgICAgICAvLyB2ZXJib3NlID0gZmFsc2U7CisgICAgICAgIHNwZXcgPSB0cnVlOworICAgICAgICBzcmNEaXJQYXRoID0gIi4vIjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTcmNkaXJQYXRoKFN0cmluZyBwYXRoTmFtZSkgeworICAgICAgICBpZiAoc3Bldykge3ByaW50bG4oInNyY0Rpcjoke3BhdGhOYW1lfSIpIH0KKyAgICAgICAgc3JjRGlyUGF0aCA9IHBhdGhOYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldERpcmVjdG9yeShGaWxlIGRlc3REaXIpIHsKKyAgICAgICAgaWYgKHNwZXcpIHsgcHJpbnRsbigiZGVzdERpcjoke2Rlc3REaXJ9IikgfQorICAgICAgICB0YXJnZXREaXIgPSBkZXN0RGlyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNvdXJjZUVuY29kaW5nKFN0cmluZyBlbmNvZGluZykgeworICAgICAgICBpZiAoc3BldykgeyBwcmludGxuKCJlbmNvZGluZzoke2VuY29kaW5nfSIpIH0KKyAgICAgICAgc3JjRW5jb2RpbmcgPSBlbmNvZGluZzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRTb3VyY2VzKCBGaWxlW10gY29tcGlsZUxpc3QgKSB7CisgICAgICAgIGlmIChzcGV3KSB7IHByaW50bG4oImNvbXBpbGVMaXN0OiR7Y29tcGlsZUxpc3R9IikgfQorICAgICAgICBzcmNzID0gY29tcGlsZUxpc3QKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRWZXJib3NlKGJvb2xlYW4gdmVyYm9zZSkgeworICAgICAgICBzcGV3ID0gdmVyYm9zZQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNvbXBpbGUoKSB7CisgICAgICAgIGlmIChzcGV3KSB7IHByaW50bG4oImNvbXBpbGUoKSIpIH0KKworCisgICAgICAgIGZvciAoc3JjIGluIHNyY3MpIHsKKyAgICAgICAgICAgIHByaW50bG4oIHNyYyApCisgICAgICAgICAgICAvLyBtdW5nIHRoZSAke3Rlc3Quc3JjLmRpcn0vZ2xzL2NoMTQvczQgcGF0aCBpbnRvICR7ZGVzdC5kaXJ9L2dscy9jaDE0L3M0CisgICAgICAgICAgICAvLyBmaXJzdCBkZXRlcm1pbmUgdGhlIHJlbGF0aXZlIHBhdGggZS5nLiBnbHMvY2gxNC9zNAorICAgICAgICAgICAgZGVmIHJlbGF0aXZlU3JjRmlsZVBhdGhBbmROYW1lID0gc3JjLmdldEFic29sdXRlUGF0aCgpLnN1YnN0cmluZyhzcmNEaXJQYXRoLmxlbmd0aCgpICsgMSkKKyAgICAgICAgICAgIGRlZiByZWxhdGl2ZVNyY0ZpbGVOYW1lU3RhcnRJbmRleCA9IHJlbGF0aXZlU3JjRmlsZVBhdGhBbmROYW1lLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yKTsKKyAgICAgICAgICAgIGRlZiByZWxhdGl2ZU91dHB1dFBhdGggPSAiIgorICAgICAgICAgICAgaWYgKHJlbGF0aXZlU3JjRmlsZU5hbWVTdGFydEluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICByZWxhdGl2ZU91dHB1dFBhdGggPSByZWxhdGl2ZVNyY0ZpbGVQYXRoQW5kTmFtZS5zdWJzdHJpbmcoMCxyZWxhdGl2ZVNyY0ZpbGVOYW1lU3RhcnRJbmRleCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHRoZW4gZGV0ZXJtaW5lIHRoZSBhYnNvbHV0ZSBvdXRwdXQgcGF0aAorICAgICAgICAgICAgZGVmIGdob3N0T3V0cHV0RmlsZSA9IG5ldyBGaWxlKHRhcmdldERpciwgcmVsYXRpdmVTcmNGaWxlUGF0aEFuZE5hbWUpCisgICAgICAgICAgICBkZWYgZ2hvc3RPdXRwdXRGaWxlUGF0aCA9IGdob3N0T3V0cHV0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKQorICAgICAgICAgICAgZGVmIGZpbGVOYW1lU3RhcnRJbmRleCA9IGdob3N0T3V0cHV0RmlsZVBhdGgubGFzdEluZGV4T2YoRmlsZS5zZXBhcmF0b3IpOworICAgICAgICAgICAgZGVmIHJlYWxPdXRwdXRQYXRoID0gZ2hvc3RPdXRwdXRGaWxlUGF0aC5zdWJzdHJpbmcoMCxmaWxlTmFtZVN0YXJ0SW5kZXgpOworCisgICAgICAgICAgICAvLyBta2RpciBpZiBkb2VzIG5vdCBleGlzdAorICAgICAgICAgICAgRmlsZSBkaXJlY3RvcnkgPSBuZXcgRmlsZShyZWFsT3V0cHV0UGF0aCkKKyAgICAgICAgICAgIGlmIChkaXJlY3RvcnkgIT0gbnVsbCAmJiAhZGlyZWN0b3J5LmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgZGlyZWN0b3J5Lm1rZGlycygpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBnZW5lcmF0ZSBhIHN1aXRhYmxlIGphdmEgZmlsZSB0byBwdXQgdGhlcmUKKyAgICAgICAgICAgIGRlZiBmaWxlU3RlbSA9IHNyYy5uYW1lLnRva2VuaXplKCIuIilbMF0KKyAgICAgICAgICAgIGRlZiB0YXJnZXRGaWxlTmFtZSA9ICIke2ZpbGVTdGVtfVRlc3QuamF2YSIKKyAgICAgICAgICAgIGRlZiBhbk91dHB1dEZpbGUgPSBuZXcgRmlsZShyZWFsT3V0cHV0UGF0aCwgdGFyZ2V0RmlsZU5hbWUpCisKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZ2VuZXJhdGluZyAiICsgdGFyZ2V0RmlsZU5hbWUpCisgICAgICAgICAgICBkZWYgc29tZU91dHB1dFRleHQgPSBnZW5lcmF0b3IuZ2VuZXJhdGUocmVsYXRpdmVPdXRwdXRQYXRoLCB0YXJnZXREaXIsIHNyYy5uYW1lLHNyYy50ZXh0KTsKKyAgICAgICAgICAgIGlmIChzb21lT3V0cHV0VGV4dCAhPSBudWxsICYmIHNvbWVPdXRwdXRUZXh0ICE9ICIiKSB7CisgICAgICAgICAgICAgICAgYW5PdXRwdXRGaWxlLndyaXRlKHNvbWVPdXRwdXRUZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGNrL3NyYy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rjay9DbGFzc2ljR3Jvb3Z5VGVzdEdlbmVyYXRvckhlbHBlci5qYXZhIGIvZ3Jvb3Z5L3NyYy90Y2svc3JjL29yZy9jb2RlaGF1cy9ncm9vdnkvdGNrL0NsYXNzaWNHcm9vdnlUZXN0R2VuZXJhdG9ySGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M2YmUyYgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGNrL3NyYy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rjay9DbGFzc2ljR3Jvb3Z5VGVzdEdlbmVyYXRvckhlbHBlci5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS50Y2s7CisKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFJlc3VsdDsKKy8vIEpzciBwYXJzZXIKKy8vIEB0b2RvIC0gcmVmYWN0b3IgcHVsbGluZyBnZW5lcmljIHBhcnNlciBpbnRlcmZhY2UgdXAKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudGxyLnBhcnNlci5Hcm9vdnlMZXhlcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudGxyLnBhcnNlci5Hcm9vdnlSZWNvZ25pemVyOworCisvLyBjb2RlaGF1cyByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gdXNhZ2UKKy8vIEB0b2RvIC0gcmVtb3ZlIGNsYXNzaWMgcmVmZXJlbmNlcyBmcm9tIHRoZSBUQ0sKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuQ29tcGlsZXJDb25maWd1cmF0aW9uOworaW1wb3J0IGdyb292eS5sYW5nLkdyb292eVNoZWxsOworaW1wb3J0IGFudGxyLlJlY29nbml0aW9uRXhjZXB0aW9uOworCisvKiogSGVscGVyIG1ldGhvZHMgZm9yIGdlbmVyYXRlZCBUQ0sgdGVzdCBjYXNlIHVzaW5nIG5ldyBKU1IgcGFyc2VyIGFuZCBjbGFzc2ljIGdyb292eSBBU1QgYW5kIGV2YWx1YXRpb24gKi8KK3B1YmxpYyBjbGFzcyBDbGFzc2ljR3Jvb3Z5VGVzdEdlbmVyYXRvckhlbHBlciBpbXBsZW1lbnRzIFRlc3RHZW5lcmF0b3JIZWxwZXIgeworCisgICAgLyoqIGV2YWx1YXRlIHRoZSBzb3VyY2UgdGV4dCBhZ2FpbnN0IHRoZSBjbGFzc2ljIEFTVCB3aXRoIHRoZSBKU1IgcGFyc2VyIGltcGxlbWVudGF0aW9uKi8KKyAgICBwdWJsaWMgT2JqZWN0IGV2YWx1YXRlKFN0cmluZyB0aGVTcmNUZXh0LCBTdHJpbmcgdGVzdE5hbWUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBwYXJzZSh0aGVTcmNUZXh0LCB0ZXN0TmFtZSk7IC8vIGZhaWwgZWFybHkgd2l0aCBhIGRpcmVjdCBtZXNzYWdlIGlmIHBvc3NpYmxlJykKKyAgICAgICAgR3Jvb3Z5U2hlbGwgZ3Jvb3Z5ID0gbmV3IEdyb292eVNoZWxsKG5ldyBDb21waWxlckNvbmZpZ3VyYXRpb24oKSk7CisgICAgICAgIHJldHVybiBncm9vdnkucnVuKHRoZVNyY1RleHQsICJtYWluIiwgbmV3IEFycmF5TGlzdCgpKTsKKyAgICB9CisKKyAgICAvKiogcnVuIHRoZSBKU1IgcGFyc2VyIGltcGxlbWVudGF0aW9uIG92ZXIgdGhlIHN1cHBsaWVkIHNvdXJjZSB0ZXh0Ki8KKyAgICBwdWJsaWMgdm9pZCBwYXJzZShTdHJpbmcgdGhlU3JjVGV4dCwgU3RyaW5nIHRlc3ROYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAiICsgdGVzdE5hbWUpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IFN0cmluZ1JlYWRlcih0aGVTcmNUZXh0KSk7CisgICAgICAgICAgICBHcm9vdnlSZWNvZ25pemVyIHJlY29nbml6ZXIgPSBHcm9vdnlSZWNvZ25pemVyLm1ha2UocmVhZGVyKTsKKyAgICAgICAgICAgIHJlY29nbml6ZXIuY29tcGlsYXRpb25Vbml0KCk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZGVjb3JhdGVXaXRoTGluZU51bWJlcnModGhlU3JjVGV4dCkpOworCisgICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHBhcnNlRXhjZXB0aW9uKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZGVjb3JhdGVXaXRoTGluZU51bWJlcnNBbmRFcnJvck1lc3NhZ2UodGhlU3JjVGV4dCxwYXJzZUV4Y2VwdGlvbikpOworICAgICAgICAgICAgdGhyb3cgcGFyc2VFeGNlcHRpb247CisgICAgICAgIH0KKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBkZWNvcmF0ZVdpdGhMaW5lTnVtYmVyc0FuZEVycm9yTWVzc2FnZShTdHJpbmcgdGhlU3JjVGV4dCwgUmVjb2duaXRpb25FeGNlcHRpb24gcGFyc2VFeGNlcHRpb24pIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKHRoZVNyY1RleHQpKTsKKyAgICAgICAgICAgIFN0cmluZyBsaW5lID0gbnVsbDsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBudW1iZXJlZFNyY1RleHRCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICBpbnQgbGluZU51bSA9IDE7CisgICAgICAgICAgICB3aGlsZSAoKGxpbmUgPSByZWFkZXIucmVhZExpbmUoKSApICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBudW1iZXJlZFNyY1RleHRCdWZmZXIuYXBwZW5kKGxpbmVOdW0pOworICAgICAgICAgICAgICAgIG51bWJlcmVkU3JjVGV4dEJ1ZmZlci5hcHBlbmQoIlx0Iik7CisgICAgICAgICAgICAgICAgbnVtYmVyZWRTcmNUZXh0QnVmZmVyLmFwcGVuZChsaW5lKTsKKyAgICAgICAgICAgICAgICBudW1iZXJlZFNyY1RleHRCdWZmZXIuYXBwZW5kKGxpbmVTZXApOworCisgICAgICAgICAgICAgICAgaWYgKHBhcnNlRXhjZXB0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmVOdW0gPT0gcGFyc2VFeGNlcHRpb24uZ2V0TGluZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgcGFkZGluZyA9IG5ldyBTdHJpbmdCdWZmZXIoIlx0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBjb2w9MTsgY29sPHBhcnNlRXhjZXB0aW9uLmdldENvbHVtbigpO2NvbCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZy5hcHBlbmQoIiAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlcmVkU3JjVGV4dEJ1ZmZlci5hcHBlbmQocGFkZGluZyk7CisgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJlZFNyY1RleHRCdWZmZXIuYXBwZW5kKCJeIik7CisgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJlZFNyY1RleHRCdWZmZXIuYXBwZW5kKGxpbmVTZXApOworICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyZWRTcmNUZXh0QnVmZmVyLmFwcGVuZCgiRVJST1I6Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJlZFNyY1RleHRCdWZmZXIuYXBwZW5kKGxpbmVTZXApOworICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyZWRTcmNUZXh0QnVmZmVyLmFwcGVuZChwYXJzZUV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyZWRTcmNUZXh0QnVmZmVyLmFwcGVuZChsaW5lU2VwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlcmVkU3JjVGV4dEJ1ZmZlci5hcHBlbmQobGluZVNlcCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBsaW5lTnVtKys7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoZVNyY1RleHQgPSBudW1iZXJlZFNyY1RleHRCdWZmZXIudG9TdHJpbmcoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy9pZ25vcmUKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhlU3JjVGV4dDsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBkZWNvcmF0ZVdpdGhMaW5lTnVtYmVycyhTdHJpbmcgdGhlU3JjVGV4dCkgeworICAgICAgICByZXR1cm4gZGVjb3JhdGVXaXRoTGluZU51bWJlcnNBbmRFcnJvck1lc3NhZ2UodGhlU3JjVGV4dCxudWxsKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGxpbmVTZXAgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rjay9zcmMvb3JnL2NvZGVoYXVzL2dyb292eS90Y2svR2VuZXJhdGVUZXN0Q2FzZXMuamF2YSBiL2dyb292eS9zcmMvdGNrL3NyYy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rjay9HZW5lcmF0ZVRlc3RDYXNlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NTZmYmYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rjay9zcmMvb3JnL2NvZGVoYXVzL2dyb292eS90Y2svR2VuZXJhdGVUZXN0Q2FzZXMuamF2YQpAQCAtMCwwICsxLDM4NyBAQAorLyoqCisgKiBAYXV0aG9yIEplcmVteSBSYXluZXIKKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRjazsKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC4qOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLk1hdGNoaW5nVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy4qOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuKjsKKworLyoqCisgKiBHZW5lcmF0ZXMgdGVzdCBmaWxlcy4gVGhpcyB0YXNrIGNhbiB0YWtlIHRoZSBmb2xsb3dpbmcKKyAqIGFyZ3VtZW50czoKKyAqIDx1bD4KKyAqIDxsaT5zb3VyY2VkaXIKKyAqIDxsaT5kZXN0ZGlyCisgKiA8L3VsPgorICogQm90aCBhcmUgcmVxdWlyZWQuCisgKiA8cD4KKyAqIFdoZW4gdGhpcyB0YXNrIGV4ZWN1dGVzLCBpdCB3aWxsIHJlY3Vyc2l2ZWx5IHNjYW4gdGhlIHNvdXJjZWRpcgorICogbG9va2luZyBmb3Igc291cmNlIGZpbGVzIHRvIGV4cGFuZCBpbnRvIHRlc3RjYXNlcy4gVGhpcyB0YXNrIG1ha2VzIGl0cworICogZ2VuZXJhdGlvbiBkZWNpc2lvbiBiYXNlZCBvbiB0aW1lc3RhbXAuCisgKgorICogQmFzZWQgaGVhdmlseSBvbiB0aGUgSmF2YWMgaW1wbGVtZW50YXRpb24gaW4gQW50CisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amVyZW15LnJheW5lckBiaWdmb290LmNvbSI+SmVyZW15IFJheW5lcjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIEdlbmVyYXRlVGVzdENhc2VzIGV4dGVuZHMgTWF0Y2hpbmdUYXNrIHsKKworICAgIHByaXZhdGUgQmF0Y2hHZW5lcmF0ZSBiYXRjaEdlbmVyYXRlID0gbmV3IEJhdGNoR2VuZXJhdGUoKTsKKyAgICBwcml2YXRlIFBhdGggc3JjOworICAgIHByaXZhdGUgRmlsZSBkZXN0RGlyOworICAgIHByaXZhdGUgUGF0aCBjb21waWxlQ2xhc3NwYXRoOworICAgIHByaXZhdGUgUGF0aCBjb21waWxlU291cmNlcGF0aDsKKyAgICBwcml2YXRlIFN0cmluZyBlbmNvZGluZzsKKworICAgIHByb3RlY3RlZCBib29sZWFuIGZhaWxPbkVycm9yID0gdHJ1ZTsKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBsaXN0RmlsZXMgPSBmYWxzZTsKKyAgICBwcm90ZWN0ZWQgRmlsZVtdIGNvbXBpbGVMaXN0ID0gbmV3IEZpbGVbMF07CisKKyAgICBwdWJsaWMgR2VuZXJhdGVUZXN0Q2FzZXMoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIHBhdGggZm9yIHNvdXJjZSBjb21waWxhdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBuZXN0ZWQgc3JjIGVsZW1lbnQuCisgICAgICovCisgICAgcHVibGljIFBhdGggY3JlYXRlU3JjKCkgeworICAgICAgICBpZiAoc3JjID09IG51bGwpIHsKKyAgICAgICAgICAgIHNyYyA9IG5ldyBQYXRoKGdldFByb2plY3QoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNyYy5jcmVhdGVQYXRoKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVjcmVhdGUgc3JjLgorICAgICAqCisgICAgICogQHJldHVybiBhIG5lc3RlZCBzcmMgZWxlbWVudC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUGF0aCByZWNyZWF0ZVNyYygpIHsKKyAgICAgICAgc3JjID0gbnVsbDsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZVNyYygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc291cmNlIGRpcmVjdG9yaWVzIHRvIGZpbmQgdGhlIHNvdXJjZSBKYXZhIGZpbGVzLgorICAgICAqIEBwYXJhbSBzcmNEaXIgdGhlIHNvdXJjZSBkaXJlY3RvcmllcyBhcyBhIHBhdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTcmNkaXIoUGF0aCBzcmNEaXIpIHsKKyAgICAgICAgaWYgKHNyYyA9PSBudWxsKSB7CisgICAgICAgICAgICBzcmMgPSBzcmNEaXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzcmMuYXBwZW5kKHNyY0Rpcik7CisgICAgICAgIH0KKyAgICAgICAgYmF0Y2hHZW5lcmF0ZS5zZXRTcmNkaXJQYXRoKHNyYy50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBzb3VyY2UgZGlycyB0byBmaW5kIHRoZSBzb3VyY2UgamF2YSBmaWxlcy4KKyAgICAgKiBAcmV0dXJuIHRoZSBzb3VyY2UgZGlyZWN0b3J5cyBhcyBhIHBhdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aCBnZXRTcmNkaXIoKSB7CisgICAgICAgIHJldHVybiBzcmM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgaW50byB3aGljaCB0aGUgSmF2YSBzb3VyY2UKKyAgICAgKiBmaWxlcyBzaG91bGQgYmUgY29tcGlsZWQuCisgICAgICogQHBhcmFtIGRlc3REaXIgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVzdGRpcihGaWxlIGRlc3REaXIpIHsKKyAgICAgICAgdGhpcy5kZXN0RGlyID0gZGVzdERpcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmFibGUgdmVyYm9zZSBjb21waWxpbmcgd2hpY2ggd2lsbCBkaXNwbGF5IHdoaWNoIGZpbGVzCisgICAgICogYXJlIGJlaW5nIGNvbXBpbGVkCisgICAgICogQHBhcmFtIHZlcmJvc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWZXJib3NlKGJvb2xlYW4gdmVyYm9zZSkgeworICAgICAgICBiYXRjaEdlbmVyYXRlLnNldFZlcmJvc2UoIHZlcmJvc2UgKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgaW50byB3aGljaCB0aGUgamF2YSBzb3VyY2UgZmlsZXMKKyAgICAgKiBzaG91bGQgYmUgY29tcGlsZWQuCisgICAgICogQHJldHVybiB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5CisgICAgICovCisgICAgcHVibGljIEZpbGUgZ2V0RGVzdGRpcigpIHsKKyAgICAgICAgcmV0dXJuIGRlc3REaXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzb3VyY2VwYXRoIHRvIGJlIHVzZWQgZm9yIHRoaXMgY29tcGlsYXRpb24uCisgICAgICogQHBhcmFtIHNvdXJjZXBhdGggdGhlIHNvdXJjZSBwYXRoCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U291cmNlcGF0aChQYXRoIHNvdXJjZXBhdGgpIHsKKyAgICAgICAgaWYgKGNvbXBpbGVTb3VyY2VwYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgIGNvbXBpbGVTb3VyY2VwYXRoID0gc291cmNlcGF0aDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGNvbXBpbGVTb3VyY2VwYXRoLmFwcGVuZChzb3VyY2VwYXRoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHNvdXJjZXBhdGggdG8gYmUgdXNlZCBmb3IgdGhpcyBjb21waWxhdGlvbi4KKyAgICAgKiBAcmV0dXJuIHRoZSBzb3VyY2UgcGF0aAorICAgICAqLworICAgIHB1YmxpYyBQYXRoIGdldFNvdXJjZXBhdGgoKSB7CisgICAgICAgIHJldHVybiBjb21waWxlU291cmNlcGF0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgcGF0aCB0byBzb3VyY2VwYXRoLgorICAgICAqIEByZXR1cm4gYSBzb3VyY2VwYXRoIHRvIGJlIGNvbmZpZ3VyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aCBjcmVhdGVTb3VyY2VwYXRoKCkgeworICAgICAgICBpZiAoY29tcGlsZVNvdXJjZXBhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgY29tcGlsZVNvdXJjZXBhdGggPSBuZXcgUGF0aChnZXRQcm9qZWN0KCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjb21waWxlU291cmNlcGF0aC5jcmVhdGVQYXRoKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIHJlZmVyZW5jZSB0byBhIHNvdXJjZSBwYXRoIGRlZmluZWQgZWxzZXdoZXJlLgorICAgICAqIEBwYXJhbSByIGEgcmVmZXJlbmNlIHRvIGEgc291cmNlIHBhdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VwYXRoUmVmKFJlZmVyZW5jZSByKSB7CisgICAgICAgIGNyZWF0ZVNvdXJjZXBhdGgoKS5zZXRSZWZpZChyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNsYXNzcGF0aCB0byBiZSB1c2VkIGZvciB0aGlzIGNvbXBpbGF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXNzcGF0aCBhbiBBbnQgUGF0aCBvYmplY3QgY29udGFpbmluZyB0aGUgY29tcGlsYXRpb24gY2xhc3NwYXRoLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aChQYXRoIGNsYXNzcGF0aCkgeworICAgICAgICBpZiAoY29tcGlsZUNsYXNzcGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICBjb21waWxlQ2xhc3NwYXRoID0gY2xhc3NwYXRoOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY29tcGlsZUNsYXNzcGF0aC5hcHBlbmQoY2xhc3NwYXRoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGNsYXNzcGF0aCB0byBiZSB1c2VkIGZvciB0aGlzIGNvbXBpbGF0aW9uLgorICAgICAqIEByZXR1cm4gdGhlIGNsYXNzIHBhdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aCBnZXRDbGFzc3BhdGgoKSB7CisgICAgICAgIHJldHVybiBjb21waWxlQ2xhc3NwYXRoOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBwYXRoIHRvIHRoZSBjbGFzc3BhdGguCisgICAgICogQHJldHVybiBhIGNsYXNzIHBhdGggdG8gYmUgY29uZmlndXJlZAorICAgICAqLworICAgIHB1YmxpYyBQYXRoIGNyZWF0ZUNsYXNzcGF0aCgpIHsKKyAgICAgICAgaWYgKGNvbXBpbGVDbGFzc3BhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgY29tcGlsZUNsYXNzcGF0aCA9IG5ldyBQYXRoKGdldFByb2plY3QoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvbXBpbGVDbGFzc3BhdGguY3JlYXRlUGF0aCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSByZWZlcmVuY2UgdG8gYSBjbGFzc3BhdGggZGVmaW5lZCBlbHNld2hlcmUuCisgICAgICogQHBhcmFtIHIgYSByZWZlcmVuY2UgdG8gYSBjbGFzc3BhdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc3BhdGhSZWYoUmVmZXJlbmNlIHIpIHsKKyAgICAgICAgY3JlYXRlQ2xhc3NwYXRoKCkuc2V0UmVmaWQocik7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBjcmVhdGVFbmNvZGluZygpIHsKKyAgICAgICAgaWYgKGVuY29kaW5nID09IG51bGwpIHsKKyAgICAgICAgICAgIGVuY29kaW5nID0gU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLmVuY29kaW5nIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVuY29kaW5nOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEVuY29kaW5nKFN0cmluZyBlbmNvZGluZykgeworICAgICAgICB0aGlzLmVuY29kaW5nID0gZW5jb2Rpbmc7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpIHsKKyAgICAgICAgcmV0dXJuIGVuY29kaW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRydWUsIGxpc3QgdGhlIHNvdXJjZSBmaWxlcyBiZWluZyBoYW5kZWQgb2ZmIHRvIHRoZSBjb21waWxlci4KKyAgICAgKiBAcGFyYW0gbGlzdCBpZiB0cnVlIGxpc3QgdGhlIHNvdXJjZSBmaWxlcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExpc3RmaWxlcyhib29sZWFuIGxpc3QpIHsKKyAgICAgICAgbGlzdEZpbGVzID0gbGlzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGxpc3RmaWxlcyBmbGFnLgorICAgICAqIEByZXR1cm4gdGhlIGxpc3RmaWxlcyBmbGFnCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0TGlzdGZpbGVzKCkgeworICAgICAgICByZXR1cm4gbGlzdEZpbGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBidWlsZCB3aWxsIGNvbnRpbnVlCisgICAgICogZXZlbiBpZiB0aGVyZSBhcmUgY29tcGlsYXRpb24gZXJyb3JzOyBkZWZhdWx0cyB0byB0cnVlLgorICAgICAqIEBwYXJhbSBmYWlsIGlmIHRydWUgaGFsdCB0aGUgYnVpbGQgb24gZmFpbHVyZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZhaWxvbmVycm9yKGJvb2xlYW4gZmFpbCkgeworICAgICAgICBmYWlsT25FcnJvciA9IGZhaWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHByb2NlZWQgaW52ZXJzZSBvZiBmYWlsb2ZlcnJvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb2NlZWQoYm9vbGVhbiBwcm9jZWVkKSB7CisgICAgICAgIGZhaWxPbkVycm9yID0gIXByb2NlZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgZmFpbG9uZXJyb3IgZmxhZy4KKyAgICAgKiBAcmV0dXJuIHRoZSBmYWlsb25lcnJvciBmbGFnCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0RmFpbG9uZXJyb3IoKSB7CisgICAgICAgIHJldHVybiBmYWlsT25FcnJvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlcyB0aGUgdGFzay4KKyAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBjaGVja1BhcmFtZXRlcnMoKTsKKyAgICAgICAgcmVzZXRGaWxlTGlzdHMoKTsKKworICAgICAgICAvLyBzY2FuIHNvdXJjZSBkaXJlY3RvcmllcyBhbmQgZGVzdCBkaXJlY3RvcnkgdG8gYnVpbGQgdXAKKyAgICAgICAgLy8gY29tcGlsZSBsaXN0cworICAgICAgICBTdHJpbmdbXSBsaXN0ID0gc3JjLmxpc3QoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBGaWxlIHNyY0RpciA9IGdldFByb2plY3QoKS5yZXNvbHZlRmlsZShsaXN0W2ldKTsKKyAgICAgICAgICAgIGlmICghc3JjRGlyLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJzcmNkaXIgXCIiICsgc3JjRGlyLmdldFBhdGgoKSArICJcIiBkb2VzIG5vdCBleGlzdCEiLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IHRoaXMuZ2V0RGlyZWN0b3J5U2Nhbm5lcihzcmNEaXIpOworICAgICAgICAgICAgU3RyaW5nW10gZmlsZXMgPSBkcy5nZXRJbmNsdWRlZEZpbGVzKCk7CisKKyAgICAgICAgICAgIHNjYW5EaXIoc3JjRGlyLCBkZXN0RGlyICE9IG51bGwgPyBkZXN0RGlyIDogc3JjRGlyLCBmaWxlcyk7CisgICAgICAgIH0KKworICAgICAgICBjb21waWxlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xlYXIgdGhlIGxpc3Qgb2YgZmlsZXMgdG8gYmUgY29tcGlsZWQgYW5kIGNvcGllZC4uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcmVzZXRGaWxlTGlzdHMoKSB7CisgICAgICAgIGNvbXBpbGVMaXN0ID0gbmV3IEZpbGVbMF07CisgICAgfQorCisgICAgLyoqCisgICAgICogU2NhbnMgdGhlIGRpcmVjdG9yeSBsb29raW5nIGZvciBzb3VyY2UgZmlsZXMgdG8gYmUgY29tcGlsZWQuCisgICAgICogVGhlIHJlc3VsdHMgYXJlIHJldHVybmVkIGluIHRoZSBjbGFzcyB2YXJpYWJsZSBjb21waWxlTGlzdAorICAgICAqCisgICAgICogQHBhcmFtIHNyY0RpciAgIFRoZSBzb3VyY2UgZGlyZWN0b3J5CisgICAgICogQHBhcmFtIGRlc3REaXIgIFRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkKKyAgICAgKiBAcGFyYW0gZmlsZXMgICAgQW4gYXJyYXkgb2YgZmlsZW5hbWVzCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2NhbkRpcihGaWxlIHNyY0RpciwgRmlsZSBkZXN0RGlyLCBTdHJpbmdbXSBmaWxlcykgeworICAgICAgICBHbG9iUGF0dGVybk1hcHBlciBtID0gbmV3IEdsb2JQYXR0ZXJuTWFwcGVyKCk7CisgICAgICAgIG0uc2V0RnJvbSgiKiIpOworICAgICAgICBtLnNldFRvKCIqLmh0bWwiKTsKKyAgICAgICAgU291cmNlRmlsZVNjYW5uZXIgc2ZzID0gbmV3IFNvdXJjZUZpbGVTY2FubmVyKHRoaXMpOworICAgICAgICBGaWxlW10gbmV3RmlsZXMgPSBzZnMucmVzdHJpY3RBc0ZpbGVzKGZpbGVzLCBzcmNEaXIsIGRlc3REaXIsIG0pOworCisgICAgICAgIGlmIChuZXdGaWxlcy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBGaWxlW10gbmV3Q29tcGlsZUxpc3QgPSBuZXcgRmlsZVtjb21waWxlTGlzdC5sZW5ndGggKyBuZXdGaWxlcy5sZW5ndGhdOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShjb21waWxlTGlzdCwgMCwgbmV3Q29tcGlsZUxpc3QsIDAsIGNvbXBpbGVMaXN0Lmxlbmd0aCk7CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG5ld0ZpbGVzLCAwLCBuZXdDb21waWxlTGlzdCwgY29tcGlsZUxpc3QubGVuZ3RoLCBuZXdGaWxlcy5sZW5ndGgpOworICAgICAgICAgICAgY29tcGlsZUxpc3QgPSBuZXdDb21waWxlTGlzdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGxpc3Qgb2YgZmlsZXMgdG8gYmUgY29tcGlsZWQuCisgICAgICogQHJldHVybiB0aGUgbGlzdCBvZiBmaWxlcyBhcyBhbiBhcnJheQorICAgICAqLworICAgIHB1YmxpYyBGaWxlW10gZ2V0RmlsZUxpc3QoKSB7CisgICAgICAgIHJldHVybiBjb21waWxlTGlzdDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja1BhcmFtZXRlcnMoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAoc3JjID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigic3JjZGlyIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3JjLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInNyY2RpciBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIiwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGVzdERpciAhPSBudWxsICYmICFkZXN0RGlyLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiZGVzdGluYXRpb24gZGlyZWN0b3J5IFwiIiArIGRlc3REaXIgKyAiXCIgZG9lcyBub3QgZXhpc3QgIiArICJvciBpcyBub3QgYSBkaXJlY3RvcnkiLAorICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVuY29kaW5nICE9IG51bGwgJiYgIUNoYXJzZXQuaXNTdXBwb3J0ZWQoZW5jb2RpbmcpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImVuY29kaW5nIFwiXCIgbm90IHN1cHBvcnRlZCIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgY29tcGlsZSgpIHsKKyAgICAgICAgaWYgKGNvbXBpbGVMaXN0Lmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIGxvZygKKyAgICAgICAgICAgICAgICAiR2VuZXJhdGluZyBUZXN0cyAiCisgICAgICAgICAgICAgICAgICAgICsgY29tcGlsZUxpc3QubGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICsgIiBzb3VyY2UgZmlsZSIKKyAgICAgICAgICAgICAgICAgICAgKyAoY29tcGlsZUxpc3QubGVuZ3RoID09IDEgPyAiIiA6ICJzIikKKyAgICAgICAgICAgICAgICAgICAgKyAoZGVzdERpciAhPSBudWxsID8gIiB0byAiICsgZGVzdERpciA6ICIiKSk7CisKKyAgICAgICAgICAgIGlmIChsaXN0RmlsZXMpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbXBpbGVMaXN0Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IGNvbXBpbGVMaXN0W2ldLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICAgICAgICAgICAgICBsb2coZmlsZW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBQYXRoIGNsYXNzcGF0aCA9IGdldENsYXNzcGF0aCgpOworICAgICAgICAgICAgICAgIGlmIChjbGFzc3BhdGggIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvL0B0b2RvIC0gaXMgdGhpcyB1c2VmdWw/CisgICAgICAgICAgICAgICAgICAgIC8vYmF0Y2hPZkJpc2N1aXRzLnNldENsYXNzcGF0aChjbGFzc3BhdGgudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJhdGNoR2VuZXJhdGUuc2V0VGFyZ2V0RGlyZWN0b3J5KGRlc3REaXIpOworCisgICAgICAgICAgICAgICAgaWYgKGVuY29kaW5nICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYmF0Y2hHZW5lcmF0ZS5zZXRTb3VyY2VFbmNvZGluZyhlbmNvZGluZyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmF0Y2hHZW5lcmF0ZS5hZGRTb3VyY2VzKCBjb21waWxlTGlzdCApOworICAgICAgICAgICAgICAgIGJhdGNoR2VuZXJhdGUuY29tcGlsZSggKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgeworCisgICAgICAgICAgICAgICAgU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgICAgICAgICAvL0B0b2RvIC0tCisgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICAvL25ldyBFcnJvclJlcG9ydGVyKCBlLCBmYWxzZSApLndyaXRlKCBuZXcgUHJpbnRXcml0ZXIod3JpdGVyKSApOworICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gd3JpdGVyLnRvU3RyaW5nKCk7CisKKyAgICAgICAgICAgICAgICBpZiAoZmFpbE9uRXJyb3IpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UsIGUsIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKG1lc3NhZ2UsIFByb2plY3QuTVNHX0VSUik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rjay9zcmMvb3JnL2NvZGVoYXVzL2dyb292eS90Y2svVGVzdEdlbmVyYXRvci5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rjay9zcmMvb3JnL2NvZGVoYXVzL2dyb292eS90Y2svVGVzdEdlbmVyYXRvci5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY4MDhmNQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGNrL3NyYy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rjay9UZXN0R2VuZXJhdG9yLmdyb292eQpAQCAtMCwwICsxLDIwOSBAQAorLyoqCisgKiBUaGlzIHdpbGwgdGFrZSBhIGdyb292eSB0ZXN0IGZpbGUgYW5kIHR1cm4gaXQgaW50byBhIEphdmEgVGVzdENhc2UKKyAqIEBhdXRob3IgSmVyZW15IFJheW5lcgorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkudGNrCitpbXBvcnQgamF2YS5pby4qOworY2xhc3MgVGVzdEdlbmVyYXRvcnsKKyAgICBwdWJsaWMgU3RyaW5nIGdlbmVyYXRlKHJlYWxPdXRwdXRQYXRoLCB0YXJnZXREaXIsIHNyY05hbWUsc3JjVGV4dCkgeworLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbignc2luZ2xlIFxcXFwnKQorLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZG91YmxlIFxcXFwiKQorICAgICAgICBzcmNUZXh0ID0gc3JjVGV4dC5yZXBsYWNlQWxsKCdcXFxcJywnXFxcXFxcXFwnKSAvLyBuZWVkIHRvIGVzY2FwZSBhIHNsYXNoIHdpdGggc2xhc2ggc2xhc2gKKworICAgICAgICBkZWYgcmVzdWx0V3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpCisgICAgICAgIGRlZiByZXN1bHQgPSBuZXcgUHJpbnRXcml0ZXIocmVzdWx0V3JpdGVyKQorCisgICAgICAgIGRlZiBmaWxlTmFtZSA9IHNyY05hbWUKKyAgICAgICAgZGVmIGZpbGVTdGVtID0gZmlsZU5hbWUudG9rZW5pemUoIi4iKVswXQorCisgICAgICAgIGRlZiBjb21tZW50cyA9IHNjcmFwZShzcmNUZXh0LCIgKiAiLCIuIikgLy8gVGFrZSB0aGUgZmlyc3QgamF2YWRvYyBzZW50ZW5jZSwgaWYgaXQgZXhpc3RzLCBmb3IgdXNlIGFzIG1ldGhvZCBuYW1lCisgICAgICAgIGlmIChjb21tZW50cyA9PSBudWxsIHx8IGNvbW1lbnRzWzBdID09IG51bGwpIHtjb21tZW50cyA9IFsiIl19CisgICAgICAgIGRlZiBiZWhhdmlvdXJEZXNjcmlwdGlvbiA9IGNvbW1lbnRzWzBdLnRyaW0oKQorCisgICAgICAgIGlmICgiIiAhPSByZWFsT3V0cHV0UGF0aCkgeworICAgICAgICAgICAgZGVmIHJlYWxPdXRwdXRQYWNrYWdlID0gJycKKyAgICAgICAgICAgIGlmIChGaWxlLnNlcGFyYXRvciAhPSAnXFwnKQorICAgICAgICAgICAgICAgIHJlYWxPdXRwdXRQYWNrYWdlID0gcmVhbE91dHB1dFBhdGgucmVwbGFjZUFsbChGaWxlLnNlcGFyYXRvciwnLicpCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmVhbE91dHB1dFBhY2thZ2UgPSByZWFsT3V0cHV0UGF0aC5yZXBsYWNlQWxsKCdcXFxcJywnLicpCisgICAgICAgICAgICByZXN1bHQucHJpbnRsbigicGFja2FnZSAke3JlYWxPdXRwdXRQYWNrYWdlfTsiKQorICAgICAgICB9CisgICAgICAgIHJlc3VsdC5wcmludGxuKCJpbXBvcnQganVuaXQuZnJhbWV3b3JrLio7IikKKyAgICAgICAgcmVzdWx0LnByaW50bG4oImltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRjay4qOyIpCisKKyAgICAgICAgcmVzdWx0LnByaW50bG4oInB1YmxpYyBjbGFzcyAke2ZpbGVTdGVtfVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7IikKKworICAgICAgICAvL21ldGhvZE5hbWUgPSB0dXJuU2VudGVuY2VJbnRvSmF2YU5hbWUoYmVoYXZpb3VyRGVzY3JpcHRpb24pCisgICAgICAgIGRlZiBtZXRob2ROYW1lID0gIiIKKyAgICAgICAgbWV0aG9kTmFtZSA9ICJ0ZXN0JHttZXRob2ROYW1lfSIKKworICAgICAgICAvLyB0ZXN0IGZvciB0aGUgc291cmNlICdhcyBpcycKKyAgICAgICAgcHJpbnRDb21tb25UZXN0TWV0aG9kU3RhcnQocmVzdWx0LCAiJHttZXRob2ROYW1lfVBhc3MiLHNyY1RleHQpCisgICAgICAgIHJlc3VsdC5wcmludGxuKCcgICAgICAgIE9iamVjdCByZXN1bHQgPSBoZWxwZXIuZXZhbHVhdGUoc3JjQnVmZmVyLnRvU3RyaW5nKCksIicgKyAiJHttZXRob2ROYW1lfVBhc3MiICsgJyIpOycpCisgICAgICAgIHJlc3VsdC5wcmludGxuKCcgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBUZXN0UmVzdWx0KSB7JykKKyAgICAgICAgcmVzdWx0LnByaW50bG4oJyAgICAgICAgICAgIFRlc3RSZXN1bHQgdGVzdFJlc3VsdCA9IChUZXN0UmVzdWx0KXJlc3VsdDsnKQorICAgICAgICByZXN1bHQucHJpbnRsbignICAgICAgICAgICAgaWYgKHRlc3RSZXN1bHQuZXJyb3JDb3VudCgpID4gMCkgeycpCisgICAgICAgIHJlc3VsdC5wcmludGxuKCcgICAgICAgICAgICAgICAgVGVzdEZhaWx1cmUgZmlyc3RUZXN0RmFpbHVyZSA9IChUZXN0RmFpbHVyZSl0ZXN0UmVzdWx0LmVycm9ycygpLm5leHRFbGVtZW50KCk7JykKKyAgICAgICAgcmVzdWx0LnByaW50bG4oJyAgICAgICAgICAgICAgICB0aHJvdyBmaXJzdFRlc3RGYWlsdXJlLnRocm93bkV4Y2VwdGlvbigpOycpCisgICAgICAgIHJlc3VsdC5wcmludGxuKCcgICAgICAgICAgICB9JykKKyAgICAgICAgcmVzdWx0LnByaW50bG4oJyAgICAgICAgICAgIGlmICh0ZXN0UmVzdWx0LmZhaWx1cmVDb3VudCgpID4gMCkgeycpCisgICAgICAgIHJlc3VsdC5wcmludGxuKCcgICAgICAgICAgICAgICAgQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZmlyc3RGYWlsdXJlID0gKEFzc2VydGlvbkZhaWxlZEVycm9yKSh0ZXN0UmVzdWx0LmZhaWx1cmVzKCkubmV4dEVsZW1lbnQoKSk7JykKKyAgICAgICAgcmVzdWx0LnByaW50bG4oJyAgICAgICAgICAgICAgICB0aHJvdyBmaXJzdEZhaWx1cmU7JykKKyAgICAgICAgcmVzdWx0LnByaW50bG4oJyAgICAgICAgICAgIH0nKQorICAgICAgICByZXN1bHQucHJpbnRsbignICAgICAgICB9JykKKyAgICAgICAgcmVzdWx0LnByaW50bG4oIiAgICB9IikKKworICAgICAgICAvLyB0ZXN0IGZvciBlYWNoIG9mIHRoZSAnQHBhc3MnIGFsdGVybmF0aXZlcworICAgICAgICBkZWYgcGFzc0FsdGVybmF0aXZlcyA9IGdlbmVyYXRlQWx0ZXJuYXRpdmVzKHNyY1RleHQsIkBwYXNzIikKKworICAgICAgICBwYXNzQWx0ZXJuYXRpdmVzLmVhY2hXaXRoSW5kZXh7YW5BbHRlcm5hdGl2ZSxpIC0+CisgICAgICAgICAgICBwcmludENvbW1vblRlc3RNZXRob2RTdGFydChyZXN1bHQsICIke21ldGhvZE5hbWV9UGFzcyR7aSsxfSIsYW5BbHRlcm5hdGl2ZVswXSk7CisgICAgICAgICAgICByZXN1bHQucHJpbnRsbignICAgICAgICBPYmplY3QgcmVzdWx0ID0gaGVscGVyLmV2YWx1YXRlKHNyY0J1ZmZlci50b1N0cmluZygpLCInICsgIiR7bWV0aG9kTmFtZX1QYXNzJHtpKzF9IiArICciKTsnKQorICAgICAgICAgICAgcmVzdWx0LnByaW50bG4oJyAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFRlc3RSZXN1bHQpIHsnKQorICAgICAgICAgICAgcmVzdWx0LnByaW50bG4oJyAgICAgICAgICAgIFRlc3RSZXN1bHQgdGVzdFJlc3VsdCA9IChUZXN0UmVzdWx0KXJlc3VsdDsnKQorICAgICAgICAgICAgcmVzdWx0LnByaW50bG4oJyAgICAgICAgICAgIGlmICh0ZXN0UmVzdWx0LmVycm9yQ291bnQoKSA+IDApIHsnKQorICAgICAgICAgICAgcmVzdWx0LnByaW50bG4oJyAgICAgICAgICAgICAgICBUZXN0RmFpbHVyZSBmaXJzdFRlc3RGYWlsdXJlID0gKFRlc3RGYWlsdXJlKXRlc3RSZXN1bHQuZXJyb3JzKCkubmV4dEVsZW1lbnQoKTsnKQorICAgICAgICAgICAgcmVzdWx0LnByaW50bG4oJyAgICAgICAgICAgICAgICB0aHJvdyBmaXJzdFRlc3RGYWlsdXJlLnRocm93bkV4Y2VwdGlvbigpOycpCisgICAgICAgICAgICByZXN1bHQucHJpbnRsbignICAgICAgICAgICAgfScpCisgICAgICAgICAgICByZXN1bHQucHJpbnRsbignICAgICAgICAgICAgaWYgKHRlc3RSZXN1bHQuZmFpbHVyZUNvdW50KCkgPiAwKSB7JykKKyAgICAgICAgICAgIHJlc3VsdC5wcmludGxuKCcgICAgICAgICAgICAgICAgQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZmlyc3RGYWlsdXJlID0gKEFzc2VydGlvbkZhaWxlZEVycm9yKSh0ZXN0UmVzdWx0LmZhaWx1cmVzKCkubmV4dEVsZW1lbnQoKSk7JykKKyAgICAgICAgICAgIHJlc3VsdC5wcmludGxuKCcgICAgICAgICAgICAgICAgdGhyb3cgZmlyc3RGYWlsdXJlOycpCisgICAgICAgICAgICByZXN1bHQucHJpbnRsbignICAgICAgICAgICAgfScpCisgICAgICAgICAgICByZXN1bHQucHJpbnRsbignICAgICAgICB9JykKKworICAgICAgICAgICAgcmVzdWx0LnByaW50bG4oIiAgICB9IikKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRlc3QgZm9yIGVhY2ggb2YgdGhlICdAZmFpbDpwYXJzZScgYWx0ZXJuYXRpdmVzCisgICAgICAgIGRlZiBmYWlsdXJlVG9QYXJzZUFsdGVybmF0aXZlcyA9IGdlbmVyYXRlQWx0ZXJuYXRpdmVzKHNyY1RleHQsIkBmYWlsOnBhcnNlIikKKyAgICAgICAgZmFpbHVyZVRvUGFyc2VBbHRlcm5hdGl2ZXMuZWFjaFdpdGhJbmRleHthbkFsdGVybmF0aXZlLGkgLT4KKyAgICAgICAgICAgIHByaW50Q29tbW9uVGVzdE1ldGhvZFN0YXJ0KHJlc3VsdCwgIiR7bWV0aG9kTmFtZX1GYWlsUGFyc2Uke2krMX0iLGFuQWx0ZXJuYXRpdmVbMF0pOworICAgICAgICAgICAgcmVzdWx0LnByaW50bG4oIiAgICAgICAgdHJ5IHsiKQorICAgICAgICAgICAgcmVzdWx0LnByaW50bG4oJyAgICAgICAgICAgIGhlbHBlci5wYXJzZShzcmNCdWZmZXIudG9TdHJpbmcoKSwiJyArICIke21ldGhvZE5hbWV9RmFpbFBhcnNlJHtpKzF9IiArICciKTsnKQorCisKKyAgICAgICAgICAgIHJlc3VsdC5wcmludGxuKCcgICAgICAgICAgICBmYWlsKCJUaGlzIGxpbmUgZGlkIG5vdCBmYWlsIHRvIHBhcnNlOiAnICsgYW5BbHRlcm5hdGl2ZVsxXSArICciKTsnKQorICAgICAgICAgICAgcmVzdWx0LnByaW50bG4oIiAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsiKQorICAgICAgICAgICAgcmVzdWx0LnByaW50bG4oIiAgICAgICAgICAgIC8vIGlnbm9yZSBhbiBleGNlcHRpb24gYXMgdGhhdCBpcyB3aGF0IHdlJ3JlIGhvcGluZyBmb3IgaW4gdGhpcyBjYXNlLiIpCisgICAgICAgICAgICByZXN1bHQucHJpbnRsbigiICAgICAgICB9IikKKyAgICAgICAgICAgIHJlc3VsdC5wcmludGxuKCIgICAgfSIpCisgICAgICAgIH0KKworICAgICAgICAvLyB0ZXN0IGZvciBlYWNoIG9mIHRoZSAnQGZhaWwnIGFsdGVybmF0aXZlcywgaS5lLiB3aXRob3V0IGJlaW5nIGZvbGxvd2VkIGJ5IGEgY29sb24KKyAgICAgICAgZGVmIGZhaWx1cmVBbHRlcm5hdGl2ZXMgPSBnZW5lcmF0ZUFsdGVybmF0aXZlcyhzcmNUZXh0LCJAZmFpbCg/ITopIikKKyAgICAgICAgZmFpbHVyZUFsdGVybmF0aXZlcy5lYWNoV2l0aEluZGV4e2FuQWx0ZXJuYXRpdmUsaSAtPgorICAgICAgICAgICAgcHJpbnRDb21tb25UZXN0TWV0aG9kU3RhcnQocmVzdWx0LCAiJHttZXRob2ROYW1lfUZhaWwke2krMX0iLGFuQWx0ZXJuYXRpdmVbMF0pOworICAgICAgICAgICAgcmVzdWx0LnByaW50bG4oIiAgICAgICAgdHJ5IHsiKQorICAgICAgICAgICAgcmVzdWx0LnByaW50bG4oJyAgICAgICAgICAgIGhlbHBlci5ldmFsdWF0ZShzcmNCdWZmZXIudG9TdHJpbmcoKSwiJyArICIke21ldGhvZE5hbWV9RmFpbCR7aSsxfSIgKyAnIik7JykKKyAgICAgICAgICAgIHJlc3VsdC5wcmludGxuKCcgICAgICAgICAgICBmYWlsKCJUaGlzIGxpbmUgZGlkIG5vdCBmYWlsIHRvIGV2YWx1YXRlOiAnICsgYW5BbHRlcm5hdGl2ZVsxXSArICciKTsnKQorICAgICAgICAgICAgcmVzdWx0LnByaW50bG4oIiAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsiKQorICAgICAgICAgICAgcmVzdWx0LnByaW50bG4oIiAgICAgICAgICAgIC8vIGlnbm9yZSBhbiBleGNlcHRpb24gYXMgdGhhdCBpcyB3aGF0IHdlJ3JlIGhvcGluZyBmb3IgaW4gdGhpcyBjYXNlLiIpCisgICAgICAgICAgICByZXN1bHQucHJpbnRsbigiICAgICAgICB9IikKKyAgICAgICAgICAgIHJlc3VsdC5wcmludGxuKCIgICAgfSIpCisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0LnByaW50bG4oJyAgICBwcm90ZWN0ZWQgU3RyaW5nIGxpbmVTZXAgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7JykKKyAgICAgICAgcmVzdWx0LnByaW50bG4oJyAgICBwcm90ZWN0ZWQgVGVzdEdlbmVyYXRvckhlbHBlciBoZWxwZXIgPSBuZXcgQ2xhc3NpY0dyb292eVRlc3RHZW5lcmF0b3JIZWxwZXIoKTsnKQorICAgICAgICByZXN1bHQucHJpbnRsbigifSIpCisKKyAgICAgICAgcmV0dXJuIHJlc3VsdFdyaXRlci50b1N0cmluZygpCisgICAgfQorCisKKyAgICAvLyAtLSB1c2VmdWwgc3R1ZmYKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYWx0ZXJuYXRpdmUgdmVyc2lvbnMgb2YgdGhlIGdpdmVuIHNvdXJjZSwgb25lIGZvciBlYWNoIGVuZCBvZiBsaW5lIGNvbW1lbnQgdGFnIGUuZy4gLy9AZmFpbAorICAgICAqIHdpbGwgcmVtb3ZlIHRoZSBkb3VibGUgc2xhc2ggZnJvbSB0aGUgc3RhcnQgb2YgZWFjaCBvZiB0aGUgbWF0Y2hpbmcgbGluZS4KKyAgICAgKiBlLmcuIHNyYyB0ZXh0IG9mLi4uCisgICAgICogPHByZT4KKyAgICAgKiAgICAgLy8gYSA9IDEgLy8gQGZhaWwKKyAgICAgKiAgICAgLy8gYiA9IDIgLy8gQGZhaWwKKyAgICAgKiA8L3ByZT4KKyAgICAgKiB3aWxsIHJldHVybgorICAgICAqIDxwcmU+CisgICAgICogWyAiYSA9IDEgLy8gQGZhaWwgTkxTIC8vIGIgPSAyIC8vIEBmYWlsIiwKKyAgICAgKiAgICIvLyBhID0gMSAvLyBAZmFpbCBOTFMgYiA9IDIgLy8gQGZhaWwiIF0KKyAgICAgKiA8L3ByZT4KKyAgICAgKgorICAgICAqLworICAgIExpc3QgZ2VuZXJhdGVBbHRlcm5hdGl2ZXMoU3RyaW5nIHNyY1RleHQsIFN0cmluZyB0YWcpIHsKKyAgICAgICAgZGVmIGFsdGVybmF0aXZlcyA9IFtdCisgICAgICAgIGRlZiBtID0gamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4uY29tcGlsZSgiLy8oLio/Ly9cXHMqIiArIHRhZyArICJcXFMqKVxccyIpLm1hdGNoZXIoc3JjVGV4dCkKKyAgICAgICAgd2hpbGUgKG0uZmluZCgpKSB7CisgICAgICAgICAgICBkZWYgZm91bmRUZXh0ID0gbS5ncm91cCgxKQorICAgICAgICAgICAgZGVmIHVuY29tbWVudGVkU3JjVGV4dCA9IChzcmNUZXh0LnN1YnN0cmluZygwLG0uc3RhcnQoKSkgKyAiICAiICsgc3JjVGV4dC5zdWJzdHJpbmcobS5zdGFydCgpICsgMikpCisgICAgICAgICAgICBhbHRlcm5hdGl2ZXMgPDwgW3VuY29tbWVudGVkU3JjVGV4dCwgZm91bmRUZXh0LnJlcGxhY2VBbGwoJyInLCAnXFxcXCInKV0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYWx0ZXJuYXRpdmVzCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb21tb24gc2V0dXAgY29kZSBmb3IgZWFjaCB0ZXN0IG1ldGhvZAorICAgICAqLworICAgIHZvaWQgcHJpbnRDb21tb25UZXN0TWV0aG9kU3RhcnQocmVzdWx0LCBmdWxsTWV0aG9kTmFtZSxzb21lU3JjVGV4dCkgeworICAgICAgICBkZWYgYnVmZmVyID0gbmV3IGphdmEuaW8uU3RyaW5nUmVhZGVyKHNvbWVTcmNUZXh0KQorCisgICAgICAgIHJlc3VsdC5wcmludGxuKCIgICAgcHVibGljIHZvaWQgJHtmdWxsTWV0aG9kTmFtZX0oKSB0aHJvd3MgVGhyb3dhYmxlIHsiKQorICAgICAgICByZXN1bHQucHJpbnRsbigiICAgICAgICBTdHJpbmdCdWZmZXIgc3JjQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOyIpCisKKyAgICAgICAgLy8gYXBwZW5kIGVhY2ggbGluZSB0byB0aGUgYnVmZmVyCisgICAgICAgIGJ1ZmZlci5lYWNoTGluZSB7bGluZSAtPgorICAgICAgICAgICAgLy8gZXNjYXBlIGRvdWJsZSBxdW90ZXMKKyAgICAgICAgICAgIGxpbmUgPSBsaW5lLnJlcGxhY2VBbGwoJyInLCdcXFxcIicpCisgICAgICAgICAgICByZXN1bHQucHJpbnRsbiAoJyAgICAgICAgc3JjQnVmZmVyLmFwcGVuZCgiJyArIGxpbmUgKyAnIikuYXBwZW5kKGxpbmVTZXApOycpCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gc2VudGVuY2UgaW50byBhIEphdmEgc3R5bGUgbmFtZSBsaWtlIFRoZVF1aWNrQnJvd25Gb3gKKyAgICAgKi8KKyAgICBTdHJpbmcgdHVyblNlbnRlbmNlSW50b0phdmFOYW1lKFN0cmluZyBzZW50ZW5jZSkgeworICAgICAgICAvL3VwcGVyY2FzZSBlYWNoIHdvcmQgYW5kIHJlbW92ZSBzcGFjZXMgdG8gZ2l2ZSBjYW1lbCBjYXNlCisgICAgICAgIGRlZiB0b2tlbnMgPSBzZW50ZW5jZS50b2tlbml6ZSgiICw7Iik7CisgICAgICAgIGRlZiBtZXRob2ROYW1lID0gIiIKKyAgICAgICAgZm9yICh0IGluIHRva2VucykgeworICAgICAgICAgICAgaWYgKHQuc2l6ZSgpID4gMSkgeworICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgKz0gKCB0WzBdLnRvVXBwZXJDYXNlKCkgKyB0WzEuLjx0LnNpemUoKV0udG9Mb3dlckNhc2UoKSApCisgICAgICAgICAgICB9IGVsc2UgaWYgKHQuc2l6ZSgpID09IDEpIHsKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lICs9IHRbMF0udG9VcHBlckNhc2UoKQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy9yZW1vdmUgbm9uYWxwaGFudW1lcmljIGNoYXJhY3RlcnMKKyAgICAgICAgbWV0aG9kTmFtZSA9IG1ldGhvZE5hbWUucmVwbGFjZUFsbCgiW15BLVphLXowLTldIiwiIikKKworICAgICAgICByZXR1cm4gbWV0aG9kTmFtZQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZldGNoZXMgYSBsaXN0IG9mIGFsbCB0aGUgb2NjdXJhbmNlcyBvZiB0ZXh0IGJldHdlZW4gYSBzdHJpbmcgZGVsaW1pdGVyLgorICAgICAqLworICAgIExpc3Qgc2NyYXBlKFN0cmluZyB0eHQsIFN0cmluZyB0YWcpIHsKKyAgICAgICAgcmV0dXJuIHNjcmFwZSh0eHQsdGFnLHRhZykKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGZXRjaGVzIGEgbGlzdCBvZiBhbGwgdGhlIG9jY3VyYW5jZXMgb2YgdGV4dCBiZXR3ZWVuIHR3byBzdHJpbmcgZGVsaW1pdGVycyAodGFncykuCisgICAgICovCisgICAgTGlzdCBzY3JhcGUoU3RyaW5nIHR4dCwgU3RyaW5nIG9wZW5UYWcsIFN0cmluZyBjbG9zZVRhZykgeworICAgICAgICBkZWYgaSA9IDA7IGRlZiBqID0gMDsgZGVmIGsgPSAwOworICAgICAgICBkZWYgY29udGVudHMgPSBbXQorICAgICAgICBpZiAodHh0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHdoaWxlIChpPiAtMSAmJiBrID4gLTEpIHsKKyAgICAgICAgICAgICAgaSA9IHR4dC5pbmRleE9mKG9wZW5UYWcsaykKKyAgICAgICAgICAgICAgICBpZiAoaSA+IC0xKSB7CisgICAgICAgICAgICAgICAgICBqID0gaSArIG9wZW5UYWcubGVuZ3RoKCkKKyAgICAgICAgICAgICAgICAgICAgaWYgKGogPiAtMSkgeworICAgICAgICAgICAgICAgICAgICAgIGsgPSB0eHQuaW5kZXhPZihjbG9zZVRhZyxqKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGsgPiAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50cyA8PCB0eHQuc3Vic3RyaW5nKGosaykKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29udGVudHMKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGNrL3NyYy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rjay9UZXN0R2VuZXJhdG9ySGVscGVyLmphdmEgYi9ncm9vdnkvc3JjL3Rjay9zcmMvb3JnL2NvZGVoYXVzL2dyb292eS90Y2svVGVzdEdlbmVyYXRvckhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNTlmNjIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rjay9zcmMvb3JnL2NvZGVoYXVzL2dyb292eS90Y2svVGVzdEdlbmVyYXRvckhlbHBlci5qYXZhCkBAIC0wLDAgKzEsOCBAQAorcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRjazsKKworLyoqIEhlbHBlciBtZXRob2RzIHVzZWQgYnkgZ2VuZXJhdGVkIFRDSyB0ZXN0IGNhc2VzICovCisKK3B1YmxpYyBpbnRlcmZhY2UgVGVzdEdlbmVyYXRvckhlbHBlciB7CisgICAgT2JqZWN0IGV2YWx1YXRlKFN0cmluZyB0aGVTcmNUZXh0LCBTdHJpbmcgdGVzdE5hbWUpIHRocm93cyBFeGNlcHRpb247CisgICAgdm9pZCBwYXJzZShTdHJpbmcgdGhlU3JjVGV4dCwgU3RyaW5nIHRlc3ROYW1lKSB0aHJvd3MgRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90Y2svc3R5bGVzL2p1bml0LWZyYW1lcy54c2wgYi9ncm9vdnkvc3JjL3Rjay9zdHlsZXMvanVuaXQtZnJhbWVzLnhzbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjA4YzVhCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90Y2svc3R5bGVzL2p1bml0LWZyYW1lcy54c2wKQEAgLTAsMCArMSw3MjMgQEAKKzx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgdmVyc2lvbj0iMS4wIgorICAgIHhtbG5zOmx4c2x0PSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdCIKKyAgICB4bWxuczpyZWRpcmVjdD0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hhbGFuL3JlZGlyZWN0IgorICAgIHhtbG5zOnN0cmluZ3V0aWxzPSJ4YWxhbjovL29yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU3RyaW5nVXRpbHMiCisgICAgZXh0ZW5zaW9uLWVsZW1lbnQtcHJlZml4ZXM9InJlZGlyZWN0Ij4KKzx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgaW5kZW50PSJ5ZXMiIGVuY29kaW5nPSJVUy1BU0NJSSIvPgorPHhzbDpkZWNpbWFsLWZvcm1hdCBkZWNpbWFsLXNlcGFyYXRvcj0iLiIgZ3JvdXBpbmctc2VwYXJhdG9yPSIsIi8+Cis8IS0tCisgICBDb3B5cmlnaHQgMjAwMS0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgorCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorCis8IS0tCisKKyBTYW1wbGUgc3R5bGVzaGVldCB0byBiZSB1c2VkIHdpdGggQW50IEpVbml0UmVwb3J0IG91dHB1dC4KKworIEl0IGNyZWF0ZXMgYSBzZXQgb2YgSFRNTCBmaWxlcyBhIGxhIGphdmFkb2Mgd2hlcmUgeW91IGNhbiBicm93c2UgZWFzaWx5CisgdGhyb3VnaCBhbGwgcGFja2FnZXMgYW5kIGNsYXNzZXMuCisKKyBAYXV0aG9yIFN0ZXBoYW5lIEJhaWxsaWV6IDxhIGhyZWY9Im1haWx0bzpzYmFpbGxpZXpAYXBhY2hlLm9yZyIvPgorIEBhdXRob3IgRXJpayBIYXRjaGVyIDxhIGhyZWY9Im1haWx0bzplaGF0Y2hlckBhcGFjaGUub3JnIi8+CisgQGF1dGhvciBNYXJ0aWpuIEtydWl0aG9mIDxhIGhyZWY9Im1haWx0bzptYXJ0aWpuQGtydWl0aG9mLnhzNGFsbC5ubCIvPgorCistLT4KKzx4c2w6cGFyYW0gbmFtZT0ib3V0cHV0LmRpciIgc2VsZWN0PSInLiciLz4KKworCis8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXN0c3VpdGVzIj4KKyAgICA8IS0tIGNyZWF0ZSB0aGUgaW5kZXguaHRtbCAtLT4KKyAgICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS9pbmRleC5odG1sIj4KKyAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImluZGV4Lmh0bWwiLz4KKyAgICA8L3JlZGlyZWN0OndyaXRlPgorCisgICAgPCEtLSBjcmVhdGUgdGhlIHN0eWxlc2hlZXQuY3NzIC0tPgorICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L3N0eWxlc2hlZXQuY3NzIj4KKyAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InN0eWxlc2hlZXQuY3NzIi8+CisgICAgPC9yZWRpcmVjdDp3cml0ZT4KKworICAgIDwhLS0gY3JlYXRlIHRoZSBvdmVydmlldy1wYWNrYWdlcy5odG1sIGF0IHRoZSByb290IC0tPgorICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+CisgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0ib3ZlcnZpZXcucGFja2FnZXMiLz4KKyAgICA8L3JlZGlyZWN0OndyaXRlPgorCisgICAgPCEtLSBjcmVhdGUgdGhlIGFsbC1wYWNrYWdlcy5odG1sIGF0IHRoZSByb290IC0tPgorICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L292ZXJ2aWV3LWZyYW1lLmh0bWwiPgorICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9ImFsbC5wYWNrYWdlcyIvPgorICAgIDwvcmVkaXJlY3Q6d3JpdGU+CisKKyAgICA8IS0tIGNyZWF0ZSB0aGUgYWxsLWNsYXNzZXMuaHRtbCBhdCB0aGUgcm9vdCAtLT4KKyAgICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS9hbGxjbGFzc2VzLWZyYW1lLmh0bWwiPgorICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9ImFsbC5jbGFzc2VzIi8+CisgICAgPC9yZWRpcmVjdDp3cml0ZT4KKworICAgIDwhLS0gcHJvY2VzcyBhbGwgcGFja2FnZXMgLS0+CisgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Ii4vdGVzdHN1aXRlW25vdCguL0BwYWNrYWdlID0gcHJlY2VkaW5nLXNpYmxpbmc6OnRlc3RzdWl0ZS9AcGFja2FnZSldIj4KKyAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhY2thZ2UiPgorICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im5hbWUiIHNlbGVjdD0iQHBhY2thZ2UiLz4KKyAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICA8L3hzbDpmb3ItZWFjaD4KKzwveHNsOnRlbXBsYXRlPgorCisKKzx4c2w6dGVtcGxhdGUgbmFtZT0icGFja2FnZSI+CisgICAgPHhzbDpwYXJhbSBuYW1lPSJuYW1lIi8+CisgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwYWNrYWdlLmRpciI+CisgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KCRuYW1lID0gJycpIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0idHJhbnNsYXRlKCRuYW1lLCcuJywnLycpIi8+PC94c2w6aWY+CisgICAgICAgIDx4c2w6aWYgdGVzdD0iJG5hbWUgPSAnJyI+LjwveHNsOmlmPgorICAgIDwveHNsOnZhcmlhYmxlPgorICAgIDwhLS1Qcm9jZXNzaW5nIHBhY2thZ2UgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IGluIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0LmRpciIvPiAtLT4KKyAgICA8IS0tIGNyZWF0ZSBhIGNsYXNzZXMtbGlzdC5odG1sIGluIHRoZSBwYWNrYWdlIGRpcmVjdG9yeSAtLT4KKyAgICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS97JHBhY2thZ2UuZGlyfS9wYWNrYWdlLWZyYW1lLmh0bWwiPgorICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY2xhc3Nlcy5saXN0Ij4KKyAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJuYW1lIiBzZWxlY3Q9IiRuYW1lIi8+CisgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgPC9yZWRpcmVjdDp3cml0ZT4KKworICAgIDwhLS0gY3JlYXRlIGEgcGFja2FnZS1zdW1tYXJ5Lmh0bWwgaW4gdGhlIHBhY2thZ2UgZGlyZWN0b3J5IC0tPgorICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L3skcGFja2FnZS5kaXJ9L3BhY2thZ2Utc3VtbWFyeS5odG1sIj4KKyAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhY2thZ2Uuc3VtbWFyeSI+CisgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ibmFtZSIgc2VsZWN0PSIkbmFtZSIvPgorICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgIDwvcmVkaXJlY3Q6d3JpdGU+CisKKyAgICA8IS0tIGZvciBlYWNoIGNsYXNzLCBjcmVhdGVzIGEgQG5hbWUuaHRtbCAtLT4KKyAgICA8IS0tIEBidWcgdGhlcmUgd2lsbCBiZSBhIHByb2JsZW0gd2l0aCBpbm5lciBjbGFzc2VzIGhhdmluZyB0aGUgc2FtZSBuYW1lLCBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuIC0tPgorICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIvdGVzdHN1aXRlcy90ZXN0c3VpdGVbQHBhY2thZ2UgPSAkbmFtZV0iPgorICAgICAgICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS97JHBhY2thZ2UuZGlyfS97QG5hbWV9Lmh0bWwiPgorICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJjbGFzcy5kZXRhaWxzIi8+CisgICAgICAgIDwvcmVkaXJlY3Q6d3JpdGU+CisgICAgICAgIDx4c2w6aWYgdGVzdD0ic3RyaW5nLWxlbmd0aCguL3N5c3RlbS1vdXQpIT0wIj4KKyAgICAgICAgICAgIDxyZWRpcmVjdDp3cml0ZSBmaWxlPSJ7JG91dHB1dC5kaXJ9L3skcGFja2FnZS5kaXJ9L3tAbmFtZX0tb3V0LnR4dCI+CisgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4vc3lzdGVtLW91dCIgLz4KKyAgICAgICAgICAgIDwvcmVkaXJlY3Q6d3JpdGU+CisgICAgICAgIDwveHNsOmlmPgorICAgICAgICA8eHNsOmlmIHRlc3Q9InN0cmluZy1sZW5ndGgoLi9zeXN0ZW0tZXJyKSE9MCI+CisgICAgICAgICAgICA8cmVkaXJlY3Q6d3JpdGUgZmlsZT0ieyRvdXRwdXQuZGlyfS97JHBhY2thZ2UuZGlyfS97QG5hbWV9LWVyci50eHQiPgorICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuL3N5c3RlbS1lcnIiIC8+CisgICAgICAgICAgICA8L3JlZGlyZWN0OndyaXRlPgorICAgICAgICA8L3hzbDppZj4KKyAgICA8L3hzbDpmb3ItZWFjaD4KKzwveHNsOnRlbXBsYXRlPgorCis8eHNsOnRlbXBsYXRlIG5hbWU9ImluZGV4Lmh0bWwiPgorPGh0bWw+CisgICAgPGhlYWQ+CisgICAgICAgIDx0aXRsZT5Hcm9vdnkgVENLIFJlc3VsdHMuPC90aXRsZT4KKyAgICA8L2hlYWQ+CisgICAgPGZyYW1lc2V0IGNvbHM9IjIwJSw4MCUiPgorICAgICAgICA8ZnJhbWVzZXQgcm93cz0iMzAlLDcwJSI+CisgICAgICAgICAgICA8ZnJhbWUgc3JjPSJvdmVydmlldy1mcmFtZS5odG1sIiBuYW1lPSJwYWNrYWdlTGlzdEZyYW1lIi8+CisgICAgICAgICAgICA8ZnJhbWUgc3JjPSJhbGxjbGFzc2VzLWZyYW1lLmh0bWwiIG5hbWU9ImNsYXNzTGlzdEZyYW1lIi8+CisgICAgICAgIDwvZnJhbWVzZXQ+CisgICAgICAgIDxmcmFtZSBzcmM9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCIgbmFtZT0iY2xhc3NGcmFtZSIvPgorICAgICAgICA8bm9mcmFtZXM+CisgICAgICAgICAgICA8aDI+RnJhbWUgQWxlcnQ8L2gyPgorICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgVGhpcyBkb2N1bWVudCBpcyBkZXNpZ25lZCB0byBiZSB2aWV3ZWQgdXNpbmcgdGhlIGZyYW1lcyBmZWF0dXJlLiBJZiB5b3Ugc2VlIHRoaXMgbWVzc2FnZSwgeW91IGFyZSB1c2luZyBhIG5vbi1mcmFtZS1jYXBhYmxlIHdlYiBjbGllbnQuCisgICAgICAgICAgICA8L3A+CisgICAgICAgIDwvbm9mcmFtZXM+CisgICAgPC9mcmFtZXNldD4KKzwvaHRtbD4KKzwveHNsOnRlbXBsYXRlPgorCis8IS0tIHRoaXMgaXMgdGhlIHN0eWxlc2hlZXQgY3NzIHRvIHVzZSBmb3IgbmVhcmx5IGV2ZXJ5dGhpbmcgLS0+Cis8eHNsOnRlbXBsYXRlIG5hbWU9InN0eWxlc2hlZXQuY3NzIj4KK2JvZHkgeworICAgIGZvbnQ6bm9ybWFsIDY4JSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYTsKKyAgICBjb2xvcjojMDAwMDAwOworfQordGFibGUgdHIgdGQsIHRhYmxlIHRyIHRoIHsKKyAgICBmb250LXNpemU6IDY4JTsKK30KK3RhYmxlLmRldGFpbHMgdHIgdGh7CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgdGV4dC1hbGlnbjpsZWZ0OworICAgIGJhY2tncm91bmQ6I2E2Y2FmMDsKK30KK3RhYmxlLmRldGFpbHMgdHIgdGR7CisgICAgYmFja2dyb3VuZDojZWVlZWUwOworfQorCitwIHsKKyAgICBsaW5lLWhlaWdodDoxLjVlbTsKKyAgICBtYXJnaW4tdG9wOjAuNWVtOyBtYXJnaW4tYm90dG9tOjEuMGVtOworfQoraDEgeworICAgIG1hcmdpbjogMHB4IDBweCA1cHg7IGZvbnQ6IDE2NSUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2EKK30KK2gyIHsKKyAgICBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDAuNWVtOyBmb250OiBib2xkIDEyNSUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2EKK30KK2gzIHsKKyAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTsgZm9udDogYm9sZCAxMTUlIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhCit9CitoNCB7CisgICAgbWFyZ2luLWJvdHRvbTogMC41ZW07IGZvbnQ6IGJvbGQgMTAwJSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYQorfQoraDUgeworICAgIG1hcmdpbi1ib3R0b206IDAuNWVtOyBmb250OiBib2xkIDEwMCUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2EKK30KK2g2IHsKKyAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTsgZm9udDogYm9sZCAxMDAlIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhCit9CisuRXJyb3IgeworICAgIGZvbnQtd2VpZ2h0OmJvbGQ7IGNvbG9yOnJlZDsKK30KKy5GYWlsdXJlIHsKKyAgICBmb250LXdlaWdodDpib2xkOyBjb2xvcjpwdXJwbGU7Cit9CisuUHJvcGVydGllcyB7CisgIHRleHQtYWxpZ246cmlnaHQ7Cit9Cis8L3hzbDp0ZW1wbGF0ZT4KKworCis8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBUaGlzIHBhZ2UgaXMgY3JlYXRlZCBmb3IgZXZlcnkgdGVzdHN1aXRlIGNsYXNzLgorICAgIEl0IHByaW50cyBhIHN1bW1hcnkgb2YgdGhlIHRlc3RzdWl0ZSBhbmQgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQKKyAgICB0ZXN0Y2FzZSBtZXRob2RzLgorICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGVzdHN1aXRlIiBtb2RlPSJjbGFzcy5kZXRhaWxzIj4KKyAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InBhY2thZ2UubmFtZSIgc2VsZWN0PSJAcGFja2FnZSIvPgorICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iY2xhc3MubmFtZSI+PHhzbDppZiB0ZXN0PSJub3QoJHBhY2thZ2UubmFtZSA9ICcnKSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwYWNrYWdlLm5hbWUiLz4uPC94c2w6aWY+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC94c2w6dmFyaWFibGU+CisgICAgPGh0bWw+CisgICAgICAgIDxoZWFkPgorICAgICAgICAgIDx0aXRsZT5Hcm9vdnkgVENLIFJlc3VsdHM6IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY2xhc3MubmFtZSIvPjwvdGl0bGU+CisgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY3JlYXRlLnN0eWxlc2hlZXQubGluayI+CisgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhY2thZ2UubmFtZSIgc2VsZWN0PSIkcGFja2FnZS5uYW1lIi8+CisgICAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+CisgICAgICAgIHZhciBUZXN0Q2FzZXMgPSBuZXcgQXJyYXkoKTsKKyAgICAgICAgdmFyIGN1cjsKKyAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJwcm9wZXJ0aWVzIi8+CisgICAgICAgPC9zY3JpcHQ+CisgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48IVtDREFUQVsKKyAgICAgICAgZnVuY3Rpb24gZGlzcGxheVByb3BlcnRpZXMgKG5hbWUpIHsKKyAgICAgICAgICB2YXIgd2luID0gd2luZG93Lm9wZW4oJycsJ0pVbml0U3lzdGVtUHJvcGVydGllcycsJ3Njcm9sbGJhcnM9MSxyZXNpemFibGU9MScpOworICAgICAgICAgIHZhciBkb2MgPSB3aW4uZG9jdW1lbnQub3BlbigpOworICAgICAgICAgIGRvYy53cml0ZSgiPGh0bWw+PGhlYWQ+PHRpdGxlPlByb3BlcnRpZXMgb2YgIiArIG5hbWUgKyAiPC90aXRsZT4iKTsKKyAgICAgICAgICBkb2Mud3JpdGUoIjxzdHlsZSB0eXBlPVwidGV4dC9jc3NcIj4iKTsKKyAgICAgICAgICBkb2Mud3JpdGUoImJvZHkge2ZvbnQ6bm9ybWFsIDY4JSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYTsgY29sb3I6IzAwMDAwMDsgfSIpOworICAgICAgICAgIGRvYy53cml0ZSgidGFibGUgdHIgdGQsIHRhYmxlIHRyIHRoIHsgZm9udC1zaXplOiA2OCU7IH0iKTsKKyAgICAgICAgICBkb2Mud3JpdGUoInRhYmxlLnByb3BlcnRpZXMgeyBib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7IGJvcmRlci1sZWZ0OnNvbGlkIDEgI2NjY2NjYzsgYm9yZGVyLXRvcDpzb2xpZCAxICNjY2NjY2M7IHBhZGRpbmc6NXB4OyB9Iik7CisgICAgICAgICAgZG9jLndyaXRlKCJ0YWJsZS5wcm9wZXJ0aWVzIHRoIHsgdGV4dC1hbGlnbjpsZWZ0OyBib3JkZXItcmlnaHQ6c29saWQgMSAjY2NjY2NjOyBib3JkZXItYm90dG9tOnNvbGlkIDEgI2NjY2NjYzsgYmFja2dyb3VuZC1jb2xvcjojZWVlZWVlOyB9Iik7CisgICAgICAgICAgZG9jLndyaXRlKCJ0YWJsZS5wcm9wZXJ0aWVzIHRkIHsgZm9udDpub3JtYWw7IHRleHQtYWxpZ246bGVmdDsgYm9yZGVyLXJpZ2h0OnNvbGlkIDEgI2NjY2NjYzsgYm9yZGVyLWJvdHRvbTpzb2xpZCAxICNjY2NjY2M7IGJhY2tncm91bmQtY29sb3I6I2ZmZmZmZmY7IH0iKTsKKyAgICAgICAgICBkb2Mud3JpdGUoImgzIHsgbWFyZ2luLWJvdHRvbTogMC41ZW07IGZvbnQ6IGJvbGQgMTE1JSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYSB9Iik7CisgICAgICAgICAgZG9jLndyaXRlKCI8L3N0eWxlPiIpOworICAgICAgICAgIGRvYy53cml0ZSgiPC9oZWFkPjxib2R5PiIpOworICAgICAgICAgIGRvYy53cml0ZSgiPGgzPlByb3BlcnRpZXMgb2YgIiArIG5hbWUgKyAiPC9oMz4iKTsKKyAgICAgICAgICBkb2Mud3JpdGUoIjxkaXYgYWxpZ249XCJyaWdodFwiPjxhIGhyZWY9XCJqYXZhc2NyaXB0OndpbmRvdy5jbG9zZSgpO1wiPkNsb3NlPC9hPjwvZGl2PiIpOworICAgICAgICAgIGRvYy53cml0ZSgiPHRhYmxlIGNsYXNzPSdwcm9wZXJ0aWVzJz4iKTsKKyAgICAgICAgICBkb2Mud3JpdGUoIjx0cj48dGg+TmFtZTwvdGg+PHRoPlZhbHVlPC90aD48L3RyPiIpOworICAgICAgICAgIGZvciAocHJvcCBpbiBUZXN0Q2FzZXNbbmFtZV0pIHsKKyAgICAgICAgICAgIGRvYy53cml0ZSgiPHRyPjx0aD4iICsgcHJvcCArICI8L3RoPjx0ZD4iICsgVGVzdENhc2VzW25hbWVdW3Byb3BdICsgIjwvdGQ+PC90cj4iKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZG9jLndyaXRlKCI8L3RhYmxlPiIpOworICAgICAgICAgIGRvYy53cml0ZSgiPC9ib2R5PjwvaHRtbD4iKTsKKyAgICAgICAgICBkb2MuY2xvc2UoKTsKKyAgICAgICAgICB3aW4uZm9jdXMoKTsKKyAgICAgICAgfQorICAgICAgXV0+CisgICAgICA8L3NjcmlwdD4KKyAgICAgICAgPC9oZWFkPgorICAgICAgICA8Ym9keT4KKyAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYWdlSGVhZGVyIi8+CisgICAgICAgICAgICA8aDM+Q2xhc3MgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjbGFzcy5uYW1lIi8+PC9oMz4KKworCisgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImRldGFpbHMiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIyIiB3aWR0aD0iOTUlIj4KKyAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGVzdHN1aXRlLnRlc3QuaGVhZGVyIi8+CisgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJwcmludC50ZXN0Ii8+CisgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgPGgyPlRlc3RzPC9oMj4KKyAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ic3RyaW5nLWxlbmd0aCguL3N5c3RlbS1vdXQpIT0wIj4KKyAgICAgICAgICAgICAgICAgICAgPGE+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj4uLzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPi1vdXQudHh0PC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcyAmIzE4NzsKKyAgICAgICAgICAgICAgICAgICAgPC9hPgorICAgICAgICAgICAgPC94c2w6aWY+CisgICAgICAgICAgICA8cC8+CisgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImRldGFpbHMiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIyIiB3aWR0aD0iOTUlIj4KKyAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRlc3RjYXNlLnRlc3QuaGVhZGVyIi8+CisgICAgICAgICAgICAgIDwhLS0KKyAgICAgICAgICAgICAgdGVzdCBjYW4gZXZlbiBub3QgYmUgc3RhcnRlZCBhdCBhbGwgKGZhaWx1cmUgdG8gbG9hZCB0aGUgY2xhc3MpCisgICAgICAgICAgICAgIHNvIHJlcG9ydCB0aGUgZXJyb3IgZGlyZWN0bHkKKyAgICAgICAgICAgICAgLS0+CisgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIuL2Vycm9yIj4KKyAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJFcnJvciI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iNCI+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuL2Vycm9yIi8+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4vdGVzdGNhc2UiIG1vZGU9InByaW50LnRlc3QiLz4KKyAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJQcm9wZXJ0aWVzIj4KKyAgICAgICAgICAgICAgICA8YT4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+amF2YXNjcmlwdDpkaXNwbGF5UHJvcGVydGllcygnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwYWNrYWdlIi8+Ljx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPicpOzwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgICAgICAgICAgUHJvcGVydGllcyAmIzE4NzsKKyAgICAgICAgICAgICAgICA8L2E+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ic3RyaW5nLWxlbmd0aCguL3N5c3RlbS1vdXQpIT0wIj4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJQcm9wZXJ0aWVzIj4KKyAgICAgICAgICAgICAgICAgICAgPGE+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj4uLzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPi1vdXQudHh0PC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dCAmIzE4NzsKKyAgICAgICAgICAgICAgICAgICAgPC9hPgorICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgPC94c2w6aWY+CisgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InN0cmluZy1sZW5ndGgoLi9zeXN0ZW0tZXJyKSE9MCI+CisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUHJvcGVydGllcyI+CisgICAgICAgICAgICAgICAgICAgIDxhPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+Li88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4tZXJyLnR4dDwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIgJiMxODc7CisgICAgICAgICAgICAgICAgICAgIDwvYT4KKyAgICAgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICA8L2JvZHk+CisgICAgPC9odG1sPgorPC94c2w6dGVtcGxhdGU+CisKKyAgPCEtLQorICAgV3JpdGUgcHJvcGVydGllcyBpbnRvIGEgSmF2YVNjcmlwdCBkYXRhIHN0cnVjdHVyZS4KKyAgIFRoaXMgaXMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIGlkZWEgYnkgRXJpayBIYXRjaGVyIChlaGF0Y2hlckBhcGFjaGUub3JnKQorICAgLS0+CisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InByb3BlcnRpZXMiPgorICAgIGN1ciA9IFRlc3RDYXNlc1snPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4uL0BwYWNrYWdlIi8+Ljx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuLi9AbmFtZSIvPiddID0gbmV3IEFycmF5KCk7CisgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InByb3BlcnR5Ij4KKyAgICA8eHNsOnNvcnQgc2VsZWN0PSJAbmFtZSIvPgorICAgICAgICBjdXJbJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiddID0gJzx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJKUy1lc2NhcGUiPjx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzdHJpbmciIHNlbGVjdD0iQHZhbHVlIi8+PC94c2w6Y2FsbC10ZW1wbGF0ZT4nOworICAgIDwveHNsOmZvci1lYWNoPgorICA8L3hzbDp0ZW1wbGF0ZT4KKworCis8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBUaGlzIHBhZ2UgaXMgY3JlYXRlZCBmb3IgZXZlcnkgcGFja2FnZS4KKyAgICBJdCBwcmludHMgdGhlIG5hbWUgb2YgYWxsIGNsYXNzZXMgdGhhdCBiZWxvbmdzIHRvIHRoaXMgcGFja2FnZS4KKyAgICBAcGFyYW0gbmFtZSB0aGUgcGFja2FnZSBuYW1lIHRvIHByaW50IGNsYXNzZXMuCisgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Cis8IS0tIGxpc3Qgb2YgY2xhc3NlcyBpbiBhIHBhY2thZ2UgLS0+Cis8eHNsOnRlbXBsYXRlIG5hbWU9ImNsYXNzZXMubGlzdCI+CisgICAgPHhzbDpwYXJhbSBuYW1lPSJuYW1lIi8+CisgICAgPGh0bWw+CisgICAgICAgIDxoZWFkPgorICAgICAgICAgICAgPHRpdGxlPkdyb292eSBUQ0sgQ2xhc3NlczogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+PC90aXRsZT4KKyAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjcmVhdGUuc3R5bGVzaGVldC5saW5rIj4KKyAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0icGFja2FnZS5uYW1lIiBzZWxlY3Q9IiRuYW1lIi8+CisgICAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgICAgICA8L2hlYWQ+CisgICAgICAgIDxib2R5PgorICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIj4KKyAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgIDx0ZCBub3dyYXA9Im5vd3JhcCI+CisgICAgICAgICAgICAgICAgICAgICAgICA8aDI+PGEgaHJlZj0icGFja2FnZS1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0iY2xhc3NGcmFtZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkbmFtZSA9ICcnIj4mbHQ7bm9uZSZndDs8L3hzbDppZj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvYT48L2gyPgorICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICA8L3RhYmxlPgorCisgICAgICAgICAgICA8aDI+Q2xhc3NlczwvaDI+CisgICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiPgorICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIvdGVzdHN1aXRlcy90ZXN0c3VpdGVbLi9AcGFja2FnZSA9ICRuYW1lXSI+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6c29ydCBzZWxlY3Q9IkBuYW1lIi8+CisgICAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBub3dyYXA9Im5vd3JhcCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0ie0BuYW1lfS5odG1sIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+CisgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICA8L2JvZHk+CisgICAgPC9odG1sPgorPC94c2w6dGVtcGxhdGU+CisKKworPCEtLQorICAgIENyZWF0ZXMgYW4gYWxsLWNsYXNzZXMuaHRtbCBmaWxlIHRoYXQgY29udGFpbnMgYSBsaW5rIHRvIGFsbCBwYWNrYWdlLXN1bW1hcnkuaHRtbAorICAgIG9uIGVhY2ggY2xhc3MuCistLT4KKzx4c2w6dGVtcGxhdGUgbWF0Y2g9InRlc3RzdWl0ZXMiIG1vZGU9ImFsbC5jbGFzc2VzIj4KKyAgICA8aHRtbD4KKyAgICAgICAgPGhlYWQ+CisgICAgICAgICAgICA8dGl0bGU+QWxsIEdyb292eSBUQ0sgQ2xhc3NlczwvdGl0bGU+CisgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY3JlYXRlLnN0eWxlc2hlZXQubGluayI+CisgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhY2thZ2UubmFtZSIvPgorICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgICAgPC9oZWFkPgorICAgICAgICA8Ym9keT4KKyAgICAgICAgICAgIDxoMj5DbGFzc2VzPC9oMj4KKyAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSI+CisgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJ0ZXN0c3VpdGUiIG1vZGU9ImFsbC5jbGFzc2VzIj4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iQG5hbWUiLz4KKyAgICAgICAgICAgICAgICA8L3hzbDphcHBseS10ZW1wbGF0ZXM+CisgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICA8L2JvZHk+CisgICAgPC9odG1sPgorPC94c2w6dGVtcGxhdGU+CisKKzx4c2w6dGVtcGxhdGUgbWF0Y2g9InRlc3RzdWl0ZSIgbW9kZT0iYWxsLmNsYXNzZXMiPgorICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icGFja2FnZS5uYW1lIiBzZWxlY3Q9IkBwYWNrYWdlIi8+CisgICAgPHRyPgorICAgICAgICA8dGQgbm93cmFwPSJub3dyYXAiPgorICAgICAgICAgICAgPGEgdGFyZ2V0PSJjbGFzc0ZyYW1lIj4KKyAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoJHBhY2thZ2UubmFtZT0nJykiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRyYW5zbGF0ZSgkcGFja2FnZS5uYW1lLCcuJywnLycpIi8+PHhzbDp0ZXh0Pi88L3hzbDp0ZXh0PgorICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48eHNsOnRleHQ+Lmh0bWw8L3hzbDp0ZXh0PgorICAgICAgICAgICAgICAgIDwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KKyAgICAgICAgICAgIDwvYT4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorPC94c2w6dGVtcGxhdGU+CisKKworPCEtLQorICAgIENyZWF0ZXMgYW4gaHRtbCBmaWxlIHRoYXQgY29udGFpbnMgYSBsaW5rIHRvIGFsbCBwYWNrYWdlLXN1bW1hcnkuaHRtbCBmaWxlcyBvbgorICAgIGVhY2ggcGFja2FnZSBleGlzdGluZyBvbiB0ZXN0c3VpdGVzLgorICAgIEBidWcgdGhlcmUgd2lsbCBiZSBhIHByb2JsZW0gaGVyZSwgSSBkb24ndCBrbm93IHlldCBob3cgdG8gaGFuZGxlIHVubmFtZWQgcGFja2FnZSA6KAorLS0+Cis8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXN0c3VpdGVzIiBtb2RlPSJhbGwucGFja2FnZXMiPgorICAgIDxodG1sPgorICAgICAgICA8aGVhZD4KKyAgICAgICAgICAgIDx0aXRsZT5BbGwgR3Jvb3Z5IFRDSyBQYWNrYWdlczwvdGl0bGU+CisgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY3JlYXRlLnN0eWxlc2hlZXQubGluayI+CisgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhY2thZ2UubmFtZSIvPgorICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgICAgPC9oZWFkPgorICAgICAgICA8Ym9keT4KKyAgICAgICAgICAgIDxoMj48YSBocmVmPSJvdmVydmlldy1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0iY2xhc3NGcmFtZSI+SG9tZTwvYT48L2gyPgorICAgICAgICAgICAgPGgyPlBhY2thZ2VzPC9oMj4KKyAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSI+CisgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJ0ZXN0c3VpdGVbbm90KC4vQHBhY2thZ2UgPSBwcmVjZWRpbmctc2libGluZzo6dGVzdHN1aXRlL0BwYWNrYWdlKV0iIG1vZGU9ImFsbC5wYWNrYWdlcyI+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6c29ydCBzZWxlY3Q9IkBwYWNrYWdlIi8+CisgICAgICAgICAgICAgICAgPC94c2w6YXBwbHktdGVtcGxhdGVzPgorICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgPC9ib2R5PgorICAgIDwvaHRtbD4KKzwveHNsOnRlbXBsYXRlPgorCis8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXN0c3VpdGUiIG1vZGU9ImFsbC5wYWNrYWdlcyI+CisgICAgPHRyPgorICAgICAgICA8dGQgbm93cmFwPSJub3dyYXAiPgorICAgICAgICAgICAgPGEgaHJlZj0iLi97dHJhbnNsYXRlKEBwYWNrYWdlLCcuJywnLycpfS9wYWNrYWdlLXN1bW1hcnkuaHRtbCIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj4KKyAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHBhY2thZ2UiLz4KKyAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBwYWNrYWdlID0gJyciPiZsdDtub25lJmd0OzwveHNsOmlmPgorICAgICAgICAgICAgPC9hPgorICAgICAgICA8L3RkPgorICAgIDwvdHI+Cis8L3hzbDp0ZW1wbGF0ZT4KKworCis8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXN0c3VpdGVzIiBtb2RlPSJvdmVydmlldy5wYWNrYWdlcyI+CisgICAgPGh0bWw+CisgICAgICAgIDxoZWFkPgorICAgICAgICAgICAgPHRpdGxlPkdyb292eSBUQ0sgUmVzdWx0czogU3VtbWFyeTwvdGl0bGU+CisgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY3JlYXRlLnN0eWxlc2hlZXQubGluayI+CisgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhY2thZ2UubmFtZSIvPgorICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgICAgPC9oZWFkPgorICAgICAgICA8Ym9keT4KKyAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ib25sb2FkIj5vcGVuKCdhbGxjbGFzc2VzLWZyYW1lLmh0bWwnLCdjbGFzc0xpc3RGcmFtZScpPC94c2w6YXR0cmlidXRlPgorICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFnZUhlYWRlciIvPgorICAgICAgICA8aDI+U3VtbWFyeTwvaDI+CisgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idGVzdENvdW50IiBzZWxlY3Q9InN1bSh0ZXN0c3VpdGUvQHRlc3RzKSIvPgorICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImVycm9yQ291bnQiIHNlbGVjdD0ic3VtKHRlc3RzdWl0ZS9AZXJyb3JzKSIvPgorICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImZhaWx1cmVDb3VudCIgc2VsZWN0PSJzdW0odGVzdHN1aXRlL0BmYWlsdXJlcykiLz4KKyAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ0aW1lQ291bnQiIHNlbGVjdD0ic3VtKHRlc3RzdWl0ZS9AdGltZSkiLz4KKyAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzdWNjZXNzUmF0ZSIgc2VsZWN0PSIoJHRlc3RDb3VudCAtICRmYWlsdXJlQ291bnQgLSAkZXJyb3JDb3VudCkgZGl2ICR0ZXN0Q291bnQiLz4KKyAgICAgICAgPHRhYmxlIGNsYXNzPSJkZXRhaWxzIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMiIgd2lkdGg9Ijk1JSI+CisgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CisgICAgICAgICAgICA8dGg+VGVzdHM8L3RoPgorICAgICAgICAgICAgPHRoPkZhaWx1cmVzPC90aD4KKyAgICAgICAgICAgIDx0aD5FcnJvcnM8L3RoPgorICAgICAgICAgICAgPHRoPlN1Y2Nlc3MgcmF0ZTwvdGg+CisgICAgICAgICAgICA8dGg+VGltZTwvdGg+CisgICAgICAgIDwvdHI+CisgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CisgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyI+CisgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkZXJyb3JDb3VudCAmZ3Q7IDAiPkVycm9yPC94c2w6d2hlbj4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRmYWlsdXJlQ291bnQgJmd0OyAwIj5GYWlsdXJlPC94c2w6d2hlbj4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+UGFzczwveHNsOm90aGVyd2lzZT4KKyAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+CisgICAgICAgICAgICA8L3hzbDphdHRyaWJ1dGU+CisgICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0ZXN0Q291bnQiLz48L3RkPgorICAgICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZmFpbHVyZUNvdW50Ii8+PC90ZD4KKyAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVycm9yQ291bnQiLz48L3RkPgorICAgICAgICAgICAgPHRkPgorICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXBlcmNlbnQiPgorICAgICAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idmFsdWUiIHNlbGVjdD0iJHN1Y2Nlc3NSYXRlIi8+CisgICAgICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICA8dGQ+CisgICAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRpc3BsYXktdGltZSI+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ2YWx1ZSIgc2VsZWN0PSIkdGltZUNvdW50Ii8+CisgICAgICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgICAgICAgIDwvdGQ+CisKKyAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9Ijk1JSI+CisgICAgICAgIDx0cj4KKyAgICAgICAgPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5OyI+CisgICAgICAgIE5vdGU6IDxlbT5mYWlsdXJlczwvZW0+IGFyZSBhbnRpY2lwYXRlZCBhbmQgY2hlY2tlZCBmb3Igd2l0aCBhc3NlcnRpb25zIHdoaWxlIDxlbT5lcnJvcnM8L2VtPiBhcmUgdW5hbnRpY2lwYXRlZC4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKworICAgICAgICA8aDI+UGFja2FnZXM8L2gyPgorICAgICAgICA8dGFibGUgY2xhc3M9ImRldGFpbHMiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIyIiB3aWR0aD0iOTUlIj4KKyAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ0ZXN0c3VpdGUudGVzdC5oZWFkZXIiLz4KKyAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJ0ZXN0c3VpdGVbbm90KC4vQHBhY2thZ2UgPSBwcmVjZWRpbmctc2libGluZzo6dGVzdHN1aXRlL0BwYWNrYWdlKV0iPgorICAgICAgICAgICAgICAgIDx4c2w6c29ydCBzZWxlY3Q9IkBwYWNrYWdlIiBvcmRlcj0iYXNjZW5kaW5nIi8+CisgICAgICAgICAgICAgICAgPCEtLSBnZXQgdGhlIG5vZGUgc2V0IGNvbnRhaW5pbmcgYWxsIHRlc3RzdWl0ZXMgdGhhdCBoYXZlIHRoZSBzYW1lIHBhY2thZ2UgLS0+CisgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnNhbWVwYWNrYWdlIiBzZWxlY3Q9Ii90ZXN0c3VpdGVzL3Rlc3RzdWl0ZVsuL0BwYWNrYWdlID0gY3VycmVudCgpL0BwYWNrYWdlXSIvPgorICAgICAgICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CisgICAgICAgICAgICAgICAgICAgIDwhLS0gZGlzcGxheSBhIGZhaWx1cmUgaWYgdGhlcmUgaXMgYW55IGZhaWx1cmUvZXJyb3IgaW4gdGhlIHBhY2thZ2UgLS0+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJzdW0oJGluc2FtZXBhY2thZ2UvQGVycm9ycykgJmd0OyAwIj5FcnJvcjwveHNsOndoZW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9InN1bSgkaW5zYW1lcGFja2FnZS9AZmFpbHVyZXMpICZndDsgMCI+RmFpbHVyZTwveHNsOndoZW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+UGFzczwveHNsOm90aGVyd2lzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KKyAgICAgICAgICAgICAgICAgICAgPC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iLi97dHJhbnNsYXRlKEBwYWNrYWdlLCcuJywnLycpfS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHBhY2thZ2UiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQHBhY2thZ2UgPSAnJyI+Jmx0O25vbmUmZ3Q7PC94c2w6aWY+CisgICAgICAgICAgICAgICAgICAgIDwvYT48L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1bSgkaW5zYW1lcGFja2FnZS9AdGVzdHMpIi8+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdW0oJGluc2FtZXBhY2thZ2UvQGVycm9ycykiLz48L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1bSgkaW5zYW1lcGFja2FnZS9AZmFpbHVyZXMpIi8+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkPgorICAgICAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS10aW1lIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ2YWx1ZSIgc2VsZWN0PSJzdW0oJGluc2FtZXBhY2thZ2UvQHRpbWUpIi8+CisgICAgICAgICAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgorICAgICAgICA8L3RhYmxlPgorICAgICAgICA8L2JvZHk+CisgICAgICAgIDwvaHRtbD4KKzwveHNsOnRlbXBsYXRlPgorCisKKzx4c2w6dGVtcGxhdGUgbmFtZT0icGFja2FnZS5zdW1tYXJ5Ij4KKyAgICA8eHNsOnBhcmFtIG5hbWU9Im5hbWUiLz4KKyAgICA8aHRtbD4KKyAgICAgICAgPGhlYWQ+CisgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY3JlYXRlLnN0eWxlc2hlZXQubGluayI+CisgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhY2thZ2UubmFtZSIgc2VsZWN0PSIkbmFtZSIvPgorICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgICAgPC9oZWFkPgorICAgICAgICA8Ym9keT4KKyAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9Im9ubG9hZCI+b3BlbigncGFja2FnZS1mcmFtZS5odG1sJywnY2xhc3NMaXN0RnJhbWUnKTwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYWdlSGVhZGVyIi8+CisgICAgICAgICAgICA8aDM+UGFja2FnZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz48L2gzPgorCisgICAgICAgICAgICA8IS0tdGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSI5NSUiPgorICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjbGFzcy5tZXRyaWNzLmhlYWRlciIvPgorICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0icHJpbnQubWV0cmljcyIvPgorICAgICAgICAgICAgPC90YWJsZS0tPgorCisgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Imluc2FtZXBhY2thZ2UiIHNlbGVjdD0iL3Rlc3RzdWl0ZXMvdGVzdHN1aXRlWy4vQHBhY2thZ2UgPSAkbmFtZV0iLz4KKyAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iY291bnQoJGluc2FtZXBhY2thZ2UpICZndDsgMCI+CisgICAgICAgICAgICAgICAgPGgyPkNsYXNzZXM8L2gyPgorICAgICAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZGV0YWlscyIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSI5NSUiPgorICAgICAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGVzdHN1aXRlLnRlc3QuaGVhZGVyIi8+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iJGluc2FtZXBhY2thZ2UiIG1vZGU9InByaW50LnRlc3QiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iQG5hbWUiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2w6YXBwbHktdGVtcGxhdGVzPgorICAgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgPC9wPgorICAgICAgICAgICAgPC94c2w6aWY+CisgICAgICAgIDwvYm9keT4KKyAgICA8L2h0bWw+Cis8L3hzbDp0ZW1wbGF0ZT4KKworCis8IS0tCisgICAgdHJhbnNmb3JtIHN0cmluZyBsaWtlIGEuYi5jIHRvIC4uLy4uLy4uLworICAgIEBwYXJhbSBwYXRoIHRoZSBwYXRoIHRvIHRyYW5zZm9ybSBpbnRvIGEgZGVzY2VuZGluZyBkaXJlY3RvcnkgcGF0aAorLS0+Cis8eHNsOnRlbXBsYXRlIG5hbWU9InBhdGgiPgorICAgIDx4c2w6cGFyYW0gbmFtZT0icGF0aCIvPgorICAgIDx4c2w6aWYgdGVzdD0iY29udGFpbnMoJHBhdGgsJy4nKSI+CisgICAgICAgIDx4c2w6dGV4dD4uLi88L3hzbDp0ZXh0PgorICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGF0aCI+CisgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0icGF0aCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1hZnRlcigkcGF0aCwnLicpIi8+PC94c2w6d2l0aC1wYXJhbT4KKyAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICA8L3hzbDppZj4KKyAgICA8eHNsOmlmIHRlc3Q9Im5vdChjb250YWlucygkcGF0aCwnLicpKSBhbmQgbm90KCRwYXRoID0gJycpIj4KKyAgICAgICAgPHhzbDp0ZXh0Pi4uLzwveHNsOnRleHQ+CisgICAgPC94c2w6aWY+Cis8L3hzbDp0ZW1wbGF0ZT4KKworCis8IS0tIGNyZWF0ZSB0aGUgbGluayB0byB0aGUgc3R5bGVzaGVldCBiYXNlZCBvbiB0aGUgcGFja2FnZSBuYW1lIC0tPgorPHhzbDp0ZW1wbGF0ZSBuYW1lPSJjcmVhdGUuc3R5bGVzaGVldC5saW5rIj4KKyAgICA8eHNsOnBhcmFtIG5hbWU9InBhY2thZ2UubmFtZSIvPgorICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIHRpdGxlPSJTdHlsZSI+PHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDppZiB0ZXN0PSJub3QoJHBhY2thZ2UubmFtZSA9ICd1bm5hbWVkIHBhY2thZ2UnKSI+PHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhdGgiPjx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYXRoIiBzZWxlY3Q9IiRwYWNrYWdlLm5hbWUiLz48L3hzbDpjYWxsLXRlbXBsYXRlPjwveHNsOmlmPnN0eWxlc2hlZXQuY3NzPC94c2w6YXR0cmlidXRlPjwvbGluaz4KKzwveHNsOnRlbXBsYXRlPgorCisKKzwhLS0gUGFnZSBIRUFERVIgLS0+Cis8eHNsOnRlbXBsYXRlIG5hbWU9InBhZ2VIZWFkZXIiPgorICAgIDxpbWcgc3JjPSJodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy9pbWFnZXMvZ3Jvb3Z5LWxvZ28ucG5nIiBhbHQ9Ikdyb292eSIvPgorICAgIDxoMT5UQ0sgUmVzdWx0czwvaDE+CisgICAgPHRhYmxlIHdpZHRoPSIxMDAlIj4KKyAgICA8dHI+CisgICAgICAgIDx0ZCBhbGlnbj0ibGVmdCI+PC90ZD4KKyAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+PGEgaHJlZj0iaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvanNyL3NwZWMiPlNwZWNpZmljYXRpb248L2E+LjwvdGQ+CisgICAgPC90cj4KKyAgICA8L3RhYmxlPgorICAgIDxociBzaXplPSIxIi8+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPCEtLSBjbGFzcyBoZWFkZXIgLS0+Cis8eHNsOnRlbXBsYXRlIG5hbWU9InRlc3RzdWl0ZS50ZXN0LmhlYWRlciI+CisgICAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICAgICAgPHRoIHdpZHRoPSI4MCUiPk5hbWU8L3RoPgorICAgICAgICA8dGg+VGVzdHM8L3RoPgorICAgICAgICA8dGg+RXJyb3JzPC90aD4KKyAgICAgICAgPHRoPkZhaWx1cmVzPC90aD4KKyAgICAgICAgPHRoIG5vd3JhcD0ibm93cmFwIj5UaW1lKHMpPC90aD4KKyAgICA8L3RyPgorPC94c2w6dGVtcGxhdGU+CisKKzwhLS0gbWV0aG9kIGhlYWRlciAtLT4KKzx4c2w6dGVtcGxhdGUgbmFtZT0idGVzdGNhc2UudGVzdC5oZWFkZXIiPgorICAgIDx0ciB2YWxpZ249InRvcCI+CisgICAgICAgIDx0aD5OYW1lPC90aD4KKyAgICAgICAgPHRoPlN0YXR1czwvdGg+CisgICAgICAgIDx0aCB3aWR0aD0iODAlIj5UeXBlPC90aD4KKyAgICAgICAgPHRoIG5vd3JhcD0ibm93cmFwIj5UaW1lKHMpPC90aD4KKyAgICA8L3RyPgorPC94c2w6dGVtcGxhdGU+CisKKworPCEtLSBjbGFzcyBpbmZvcm1hdGlvbiAtLT4KKzx4c2w6dGVtcGxhdGUgbWF0Y2g9InRlc3RzdWl0ZSIgbW9kZT0icHJpbnQudGVzdCI+CisgICAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPgorICAgICAgICAgICAgPHhzbDpjaG9vc2U+CisgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBlcnJvcnNbLiZndDsgMF0iPkVycm9yPC94c2w6d2hlbj4KKyAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQGZhaWx1cmVzWy4mZ3Q7IDBdIj5GYWlsdXJlPC94c2w6d2hlbj4KKyAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT5QYXNzPC94c2w6b3RoZXJ3aXNlPgorICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgorICAgICAgICA8L3hzbDphdHRyaWJ1dGU+CisgICAgICAgIDx0ZD48YSBocmVmPSJ7QG5hbWV9Lmh0bWwiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvYT48L3RkPgorICAgICAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAdGVzdHMiLz48L3RkPgorICAgICAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAZXJyb3JzIi8+PC90ZD4KKyAgICAgICAgPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQGZhaWx1cmVzIi8+PC90ZD4KKyAgICAgICAgPHRkPjx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXRpbWUiPgorICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ2YWx1ZSIgc2VsZWN0PSJAdGltZSIvPgorICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorPC94c2w6dGVtcGxhdGU+CisKKzx4c2w6dGVtcGxhdGUgbWF0Y2g9InRlc3RjYXNlIiBtb2RlPSJwcmludC50ZXN0Ij4KKyAgICA8dHIgdmFsaWduPSJ0b3AiPgorICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyI+CisgICAgICAgICAgICA8eHNsOmNob29zZT4KKyAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iZXJyb3IiPkVycm9yPC94c2w6d2hlbj4KKyAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iZmFpbHVyZSI+RmFpbHVyZTwveHNsOndoZW4+CisgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+VGFibGVSb3dDb2xvcjwveHNsOm90aGVyd2lzZT4KKyAgICAgICAgICAgIDwveHNsOmNob29zZT4KKyAgICAgICAgPC94c2w6YXR0cmlidXRlPgorICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC90ZD4KKyAgICAgICAgPHhzbDpjaG9vc2U+CisgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iZmFpbHVyZSI+CisgICAgICAgICAgICAgICAgPHRkPkZhaWx1cmU8L3RkPgorICAgICAgICAgICAgICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImZhaWx1cmUiLz48L3RkPgorICAgICAgICAgICAgPC94c2w6d2hlbj4KKyAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJlcnJvciI+CisgICAgICAgICAgICAgICAgPHRkPkVycm9yPC90ZD4KKyAgICAgICAgICAgICAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJlcnJvciIvPjwvdGQ+CisgICAgICAgICAgICA8L3hzbDp3aGVuPgorICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+CisgICAgICAgICAgICAgICAgPHRkPlN1Y2Nlc3M8L3RkPgorICAgICAgICAgICAgICAgIDx0ZD48L3RkPgorICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgorICAgICAgICA8L3hzbDpjaG9vc2U+CisgICAgICAgIDx0ZD4KKyAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXRpbWUiPgorICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ2YWx1ZSIgc2VsZWN0PSJAdGltZSIvPgorICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorPC94c2w6dGVtcGxhdGU+CisKKworPCEtLSBOb3RlIDogdGhlIGJlbG93IHRlbXBsYXRlIGVycm9yIGFuZCBmYWlsdXJlIGFyZSB0aGUgc2FtZSBzdHlsZQorICAgICAgICAgICAgc28ganVzdCBjYWxsIHRoZSBzYW1lIHN0eWxlIHN0b3JlIGluIHRoZSB0b29sa2l0IHRlbXBsYXRlIC0tPgorPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZmFpbHVyZSI+CisgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRpc3BsYXktZmFpbHVyZXMiLz4KKzwveHNsOnRlbXBsYXRlPgorCis8eHNsOnRlbXBsYXRlIG1hdGNoPSJlcnJvciI+CisgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRpc3BsYXktZmFpbHVyZXMiLz4KKzwveHNsOnRlbXBsYXRlPgorCis8IS0tIFN0eWxlIGZvciB0aGUgZXJyb3IgYW5kIGZhaWx1cmUgaW4gdGhlIHRlc3RjYXNlIHRlbXBsYXRlIC0tPgorPHhzbDp0ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LWZhaWx1cmVzIj4KKyAgICA8eHNsOmNob29zZT4KKyAgICAgICAgPHhzbDp3aGVuIHRlc3Q9Im5vdChAbWVzc2FnZSkiPk4vQTwveHNsOndoZW4+CisgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgorICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBtZXNzYWdlIi8+CisgICAgICAgIDwveHNsOm90aGVyd2lzZT4KKyAgICA8L3hzbDpjaG9vc2U+CisgICAgPCEtLSBkaXNwbGF5IHRoZSBzdGFja3RyYWNlIC0tPgorICAgIDxici8+PGJyLz4KKyAgICA8Y29kZT4KKyAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImJyLXJlcGxhY2UiPgorICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9IndvcmQiIHNlbGVjdD0iLiIvPgorICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgIDwvY29kZT4KKyAgICA8IS0tIHRoZSBsYXR0ZXIgaXMgYmV0dGVyIGJ1dCBtaWdodCBiZSBwcm9ibGVtYXRpYyBmb3Igbm9uLTIxIiBtb25pdG9ycy4uLiAtLT4KKyAgICA8IS0tcHJlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+PC9wcmUtLT4KKzwveHNsOnRlbXBsYXRlPgorCis8eHNsOnRlbXBsYXRlIG5hbWU9IkpTLWVzY2FwZSI+CisgICAgPHhzbDpwYXJhbSBuYW1lPSJzdHJpbmciLz4KKyAgICA8eHNsOnBhcmFtIG5hbWU9InRtcDEiIHNlbGVjdD0ic3RyaW5ndXRpbHM6cmVwbGFjZShzdHJpbmcoJHN0cmluZyksJ1wnLCdcXCcpIi8+CisgICAgPHhzbDpwYXJhbSBuYW1lPSJ0bXAyIiBzZWxlY3Q9InN0cmluZ3V0aWxzOnJlcGxhY2Uoc3RyaW5nKCR0bXAxKSwmcXVvdDsnJnF1b3Q7LCZxdW90O1wmYXBvczsmcXVvdDspIi8+CisgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0bXAyIi8+Cis8L3hzbDp0ZW1wbGF0ZT4KKworCis8IS0tCisgICAgdGVtcGxhdGUgdGhhdCB3aWxsIGNvbnZlcnQgYSBjYXJyaWFnZSByZXR1cm4gaW50byBhIGJyIHRhZworICAgIEBwYXJhbSB3b3JkIHRoZSB0ZXh0IGZyb20gd2hpY2ggdG8gY29udmVydCBDUiB0byBCUiB0YWcKKy0tPgorPHhzbDp0ZW1wbGF0ZSBuYW1lPSJici1yZXBsYWNlIj4KKyAgICA8eHNsOnBhcmFtIG5hbWU9IndvcmQiLz4KKyAgICA8eHNsOnBhcmFtIG5hbWU9ImJyIj48YnIvPjwveHNsOnBhcmFtPgorICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdzdHJpbmd1dGlsczpyZXBsYWNlKHN0cmluZygkd29yZCksIiYjeEE7IiwkYnIpJy8+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPHhzbDp0ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXRpbWUiPgorICAgIDx4c2w6cGFyYW0gbmFtZT0idmFsdWUiLz4KKyAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iZm9ybWF0LW51bWJlcigkdmFsdWUsJzAuMDAwJykiLz4KKzwveHNsOnRlbXBsYXRlPgorCis8eHNsOnRlbXBsYXRlIG5hbWU9ImRpc3BsYXktcGVyY2VudCI+CisgICAgPHhzbDpwYXJhbSBuYW1lPSJ2YWx1ZSIvPgorICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJmb3JtYXQtbnVtYmVyKCR2YWx1ZSwnMC4wMCUnKSIvPgorPC94c2w6dGVtcGxhdGU+Cis8L3hzbDpzdHlsZXNoZWV0PgorCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rjay90ZXN0L2dscy9jaDAzL3MwMS9Vbmljb2RlMS5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rjay90ZXN0L2dscy9jaDAzL3MwMS9Vbmljb2RlMS5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcyZDQwMAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGNrL3Rlc3QvZ2xzL2NoMDMvczAxL1VuaWNvZGUxLmdyb292eQpAQCAtMCwwICsxLDQzIEBACitwYWNrYWdlIGdscy5jaDAzLnMwMTsKKy8qKgorICogRXhjZXB0IGZvciBjb21tZW50cywgaWRlbnRpZmllcnMgYW5kIHRoZSBjb250ZW50cyBvZiAuLi4gc3RyaW5nIAorICogbGl0ZXJhbHMsIGFsbCBpbnB1dCBlbGVtZW50cyBhcmUgZm9ybWVkIGZyb20gQVNDSUkgY2hhcmFjdGVycy4KKyAqCisgKiBUT0RPOiBGaW5kIGEgYmV0dGVyIHdheSB0byB0ZXN0IHRoZXNlIHRoaW5ncworICogTm90ZSB0aGF0IHRoaXMgaXMgYSBsaXR0bGUgaGFyZCB0byB0ZXN0IHNpbmNlIHRoZSBpbnB1dCBmaWxlIGlzIEFTQ0lJLgorICoKKyAqIEBhdXRob3IgQWxhbiBHcmVlbgorICogQGF1dGhvciBKZXJlbXkgUmF5bmVyCisgKi8KKworY2xhc3MgVW5pY29kZTEgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisgICAgLy9UT0RPOiBmaW5kIHNvbWUgd2F5IHRvIGFzc2VydCB0aGF0IFVuaWNvZGUzLjAgKyBpcyBhdmFpbGFibGUKKworICAgIC8qKgorICAgICAgKiBUaGlzIGRvYyBjb21tZW50IGNoZWNrcyB0aGF0IFVuaWNvZGUgaXMgYWxsb3dlZCBpbiBqYXZhZG9jLgorICAgICAgKiBlLmcuIFx1MDVEMFx1MjEzNlx1MDVkM1x1MDVkNworICAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tbWVudHMoKSB7CisgICAgICAgIC8vIFVuaWNvZGUgaXMgYWxsb3dlZCBpbiBjb21tZW50cworICAgICAgICAvLyBUaGlzIGlzIGEgY29tbWVudCBcdTA0MTBcdTA0MDZcdTA0MTRcdTA0MTkKKyAgICAgICAgLyogQW5vdGhlciBjb21tZW50IFx1MDVEMFx1MjEzNlx1MDVkM1x1MDVkNyAqLworCisgICAgICAgIC8qKi8gLy8gVGlueSBjb21tZW50CisgICAgICAgIC8qKiovIC8vIEFsc28gdmFsaWQKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nTGl0ZXJhbHMoKSB7CisgICAgICAgIGFzc2VydCAxID09ICJcdTAwNDAiLmxlbmd0aCgpCisgICAgICAgIGFzc2VydCAiQSIgPT0gIlx1MDA0MSIKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hhck5vdEF2YWlsYWJsZUFzTGl0ZXJhbCgpIHsKKyAgICAgICAgY2hhciBhID0gJ3gnCisgICAgICAgIGNoYXIgYiA9ICJ4IgorICAgICAgICBkZWYgYyA9ICJ4Ii5jaGFyQXQoMCkKKyAgICAgICAgYXNzZXJ0IGEgPT0gYgorICAgICAgICBhc3NlcnQgYSA9PSBjIAorICAgIH0KKworfQorCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rjay90ZXN0L2dscy9jaDAzL3MwMS9Vbmljb2RlMi5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rjay90ZXN0L2dscy9jaDAzL3MwMS9Vbmljb2RlMi5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjEwYWRkOAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGNrL3Rlc3QvZ2xzL2NoMDMvczAxL1VuaWNvZGUyLmdyb292eQpAQCAtMCwwICsxLDI0IEBACitwYWNrYWdlIGdscy5jaDAzLnMwMTsKKy8qKgorICogRXhjZXB0IGZvciBjb21tZW50cywgaWRlbnRpZmllcnMgYW5kIHRoZSBjb250ZW50cyBvZiAuLi4gc3RyaW5nIAorICogbGl0ZXJhbHMsIGFsbCBpbnB1dCBlbGVtZW50cyBhcmUgZm9ybWVkIGZyb20gQVNDSUkgY2hhcmFjdGVycy4KKyAqCisgKiBUT0RPOiBGaW5kIGEgYmV0dGVyIHdheSB0byB0ZXN0IHRoZXNlIHRoaW5ncworICogTm90ZSB0aGF0IHRoaXMgaXMgYSBsaXR0bGUgaGFyZCB0byB0ZXN0IHNpbmNlIHRoZSBpbnB1dCBmaWxlIGlzIEFTQ0lJLgorICoKKyAqIEBhdXRob3IgSmVyZW15IFJheW5lcgorICovCisKK2NsYXNzIFVuaWNvZGUyIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisvL3RvZG8gLSB0aGlzIGRvZXNuJ3Qgc2VlbSB0byB3b3JrIGluIHJhdyBKYXZhNS4wIGVpdGhlcgorLy8gICAgcHVibGljIHZvaWQgdGVzdFVURjE2U3VwcGxlbWVudGFyeUNoYXJhY3RlcnMoKSB7CisvLyAgICAgICAgYXNzZXJ0IDEgPT0gIlx1RDg0MFx1REMwMCIubGVuZ3RoKCkKKy8vICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJZGVudGlmaWVycygpIHsKKyAgICAgICAgZGVmIGZvb1x1MDA0NCA9IDEyCisgICAgICAgIGFzc2VydCAyMCA9PSBmb29cdTAwNDQgKyA4CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rjay90ZXN0L2dscy9jaDAzL3MwMi9MZXhpY2FsVHJhbnNsYXRpb24xLmdyb292eSBiL2dyb292eS9zcmMvdGNrL3Rlc3QvZ2xzL2NoMDMvczAyL0xleGljYWxUcmFuc2xhdGlvbjEuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjZjQyNGYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rjay90ZXN0L2dscy9jaDAzL3MwMi9MZXhpY2FsVHJhbnNsYXRpb24xLmdyb292eQpAQCAtMCwwICsxLDEyIEBACitwYWNrYWdlIGdscy5jaDAzLnMwMgorCisvKiogQ2hlY2tzIExleGljYWwgVHJhbnNsYXRpb24gc3RlcHMgYXMgZGVmaW5lZCBpbiAkMy4yIG9mIEdMUworICogQGF1dGhvciBKZXJlbXkgUmF5bmVyCisgKi8KK2NsYXNzIExleGljYWxUcmFuc2xhdGlvbjEgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisgICAgdm9pZCB0ZXN0VHJhbnNsYXRpb25PZlVuaWNvZGVFc2NhcGVzKCkgeworICAgICAgICBhc3NlcnQgIkEiID09ICJcdTAwNDEiCisgICAgfQorICAgIC8vdG9kbzogdGVzdCB0aGF0IHdlIGhhdmUgYSBzdHJlYW0gb2YgdG9rZW5zIChSSSBpcyBhbnRsciBzcGVjaWZpYy4uLikKK30KKwpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90Y2svdGVzdC9nbHMvY2gwMy9zMDIvTG9uZ2VzdDEuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90Y2svdGVzdC9nbHMvY2gwMy9zMDIvTG9uZ2VzdDEuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NzNlZDgKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rjay90ZXN0L2dscy9jaDAzL3MwMi9Mb25nZXN0MS5ncm9vdnkKQEAgLTAsMCArMSwyOCBAQAorcGFja2FnZSBnbHMuY2gwMy5zMDIKKworLyoqCisgKiBHTFMgMy4yOiBUaGUgbG9uZ2VzdCBwb3NzaWJsZSB0cmFuc2xhdGlvbiBpcyB1c2VkIGF0IGVhY2ggc3RlcCwgZXZlbiBpZiB0aGUgCisgKiByZXN1bHQgZG9lcyBub3QgdWx0aW1hdGVseSBtYWtlIGEgY29ycmVjdCBwcm9ncmFtIHdoaWxlIGFub3RoZXIgbGV4aWNhbCAKKyAqIHRyYW5zbGF0aW9uIHdvdWxkLgorICogCisgKiBUaGlzIGlzIGZ1bmRhbWVudGFsIHRvIHRoZSB3YXkgdGhlIGxleGVyIHdvcmtzLiBJZiB0aGVyZSBpcyBhIHByb2JsZW0gd2l0aAorICogaXQsIG90aGVyIHRlc3RzIChlLmcuIHRvIHRlc3QgZnVuY3Rpb25hbGl0eSBvZiBvcGVyYXRvcnMgb3IgaWRlbnRpZmllcgorICogbmFtZXMpIHdvdWxkIGV4cG9zZSBpdCBxdWlja2x5LiBOZXZlcnRoZWxlc3MsIHdlIHRlc3Qgc29tZSBjb21iaW5hdGlvbnMKKyAqIGhlcmUgZm9yIGNvbnNpc3RlbmN5LgorICoKKyAqIEBhdXRob3IgQWxhbiBHcmVlbgorICovCitjbGFzcyBMb25nZXN0MSBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIC8vIEluY3JlbWVudCBhbmQgZGVjcmVtZW50IG9wZXJhdG9ycworICAgIHZvaWQgdGVzdFByZWZpeEluY0RlYygpIHsKKyAgICAgICAgZGVmIGEgPSAyMAorICAgICAgICBkZWYgYiA9IDEwCisgICAgICAgIGRlZiBjID0gYSAtIGIKKyAgICAgICAgLy9jID0gYSAtLSBiIC8vIEBmYWlsOnBhcnNlIAorICAgICAgICAvL2MgPSBhICsrIGIgLy8gQGZhaWw6cGFyc2UKKyAgICAgICAgLy9jID0gYSArLSBiIC8vIEBwYXNzCisgICAgICAgIC8vYyA9IGEgLSsgYiAvLyBAcGFzcworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90Y2svdGVzdC9nbHMvY2gwMy9zMDMvVW5pY29kZUVzY2FwZXMxLmdyb292eSBiL2dyb292eS9zcmMvdGNrL3Rlc3QvZ2xzL2NoMDMvczAzL1VuaWNvZGVFc2NhcGVzMS5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUzZjU5NQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGNrL3Rlc3QvZ2xzL2NoMDMvczAzL1VuaWNvZGVFc2NhcGVzMS5ncm9vdnkKQEAgLTAsMCArMSw0OSBAQAorcGFja2FnZSBnbHMuY2gwMy5zMDMKKy8qKgorICogR0xTIDMuMzoKKyAqIEltcGxlbWVudGF0aW9ucyBmaXJzdCByZWNvZ25pemUgVW5pY29kZSBlc2NhcGVzIGluIHRoZWlyIGlucHV0LCB0cmFuc2xhdGluZyAKKyAqIHRoZSBBU0NJSSBjaGFyYWN0ZXJzIGJhY2tzbGFzaCBhbmQgJ3UnIGZvbGxvd2VkIGJ5IGZvdXIgaGV4YWRlY2ltYWwgZGlnaXRzCisgKiB0byB0aGUgVW5pY29kZSBjaGFyYWN0ZXIgd2l0aCB0aGUgaW5kaWNhdGVkIGhleGFkZWNpbWFsIHZhbHVlLCBhbmQgcGFzc2luZworICogYWxsIG90aGVyIGNoYXJhY3RlcnMgdW5jaGFuZ2VkLiAgCisgKgorICogQGF1dGhvciBBbGFuIEdyZWVuCisgKiBAYXV0aG9yIEplcmVteSBSYXluZXIKKyAqLworCitjbGFzcyBVbmljb2RlRXNjYXBlczEgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICB2b2lkIHRlc3RBbGxIZXhEaWdpdHMoKSB7CisgICAgICAgIC8vIEFsbCBoZXggZGlnaXRzIHdvcmsgKGNoYXIgZGVmMCBpcyBhIHNwZWNpYWwgY29kZXBvaW50KQorICAgICAgICBkZWYgcyA9ICJcdTEyMzRcdTU2NzhcdTlhYmNcdTBmZWRcdTlBQkNcdTBGRUMiCisgICAgICAgIGFzc2VydCBzLmNoYXJBdCgwKSA9PSAweDEyMzQKKyAgICAgICAgYXNzZXJ0IHMuY2hhckF0KDEpID09IDB4NTY3OAorICAgICAgICBhc3NlcnQgcy5jaGFyQXQoMikgPT0gMHg5YWJjCisgICAgICAgIGFzc2VydCBzLmNoYXJBdCgzKSA9PSAweDBmZWQKKyAgICAgICAgYXNzZXJ0IHMuY2hhckF0KDQpID09IDB4OWFiYworICAgICAgICBhc3NlcnQgcy5jaGFyQXQoNSkgPT0gMHgwZmVjCisgICAgfQorCisgICAgLy8gVGhlcmUgY2FuIGJlIDEgb3IgbW9yZSB1J3MgYWZ0ZXIgdGhlIGJhY2tzbGFzaAorICAgIHZvaWQgdGVzdE11bHRpcGxlVXMoKSB7CisgICAgICAgIGFzc2VydCAiXHV1MDA2MSIgPT0gImEiCisgICAgICAgIGFzc2VydCAiXHV1dTAwNjEiID09ICJhIgorICAgICAgICBhc3NlcnQgIlx1dXV1dTAwNjEiID09ICJhIgorICAgIH0KKworICAgIHZvaWQgdGVzdE90aGVyVmFyaWF0aW9ucygpIHsKKyAgICAgICAgLy8gQ2FwaXRhbCAnVScgbm90IGFsbG93ZWQKKyAgICAgICAgLy8gYXNzZXJ0ICJcVTAwNjEiID09ICJhIiAvLyBAZmFpbDpwYXJzZSAKKyAgICB9CisKKyAgICAvLyB0b2RvOiBJbXBsZW1lbnRhdGlvbnMgc2hvdWxkIHVzZSB0aGUgXCB1eHh4eCBub3RhdGlvbiBhcyBhbiBvdXRwdXQgZm9ybWF0IHRvCisgICAgLy8gZGlzcGxheSBVbmljb2RlIGNoYXJhY3RlcnMgd2hlbiBhIHN1aXRhYmxlIGZvbnQgaXMgbm90IGF2YWlsYWJsZS4KKyAgICAvLyAodG8gYmUgdGVzdGVkIGFzIHBhcnQgb2YgdGhlIHN0YW5kYXJkIGxpYnJhcnkpCisKKyAgICAvLyB0b2RvOiBSZXByZXNlbnRpbmcgc3VwcGxlbWVudGFyeSBjaGFyYWN0ZXJzIHJlcXVpcmVzIHR3byBjb25zZWN1dGl2ZSBVbmljb2RlCisgICAgLy8gZXNjYXBlcy4gCisgICAgLy8gKG5vdCBzdXJlIGhvdyB0byB0ZXN0KQorICAgIC8vIHNlZTogZ2xzLmNoMDMuczAxLlVuaWNvZGUyLnRlc3RVVEYxNlN1cHBsZW1lbnRhcnlDaGFyYWN0ZXJzKCkKKworICAgIC8vIHRvZG86IHRlc3QgdW5pY29kZSBlc2NhcGVzIGxhc3QgaW4gZmlsZQorICAgIC8vIGFuZCBpbnZhbGlkIGVzY2FwZXMgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGNrL3Rlc3QvZ2xzL2NoMDMvczAzL1VuaWNvZGVFc2NhcGVzMi5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rjay90ZXN0L2dscy9jaDAzL3MwMy9Vbmljb2RlRXNjYXBlczIuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzZjJiZmEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rjay90ZXN0L2dscy9jaDAzL3MwMy9Vbmljb2RlRXNjYXBlczIuZ3Jvb3Z5CkBAIC0wLDAgKzEsNTEgQEAKK3BhY2thZ2UgZ2xzLmNoMDMuczAzCisvKioKKyAqIEdMUyAzLjM6CisgKiBJbXBsZW1lbnRhdGlvbnMgZmlyc3QgcmVjb2duaXplIFVuaWNvZGUgZXNjYXBlcyBpbiB0aGVpciBpbnB1dCwgdHJhbnNsYXRpbmcgCisgKiB0aGUgQVNDSUkgY2hhcmFjdGVycyBiYWNrc2xhc2ggYW5kICd1JyBmb2xsb3dlZCBieSBmb3VyIGhleGFkZWNpbWFsIGRpZ2l0cworICogdG8gdGhlIFVuaWNvZGUgY2hhcmFjdGVyIHdpdGggdGhlIGluZGljYXRlZCBoZXhhZGVjaW1hbCB2YWx1ZSwgYW5kIHBhc3NpbmcKKyAqIGFsbCBvdGhlciBjaGFyYWN0ZXJzIHVuY2hhbmdlZC4gIAorICoKKyAqIEBhdXRob3IgQWxhbiBHcmVlbgorICovCisKK2NsYXNzIFVuaWNvZGVFc2NhcGVzMiBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIC8vIEdMUzogSWYgYW4gZXZlbiBudW1iZXIgb2YgYmFja3NsYXNoZXMgcHJlY2VkZSB0aGUgJ3UnLCBpdCBpcyBub3QgCisgICAgLy8gYW4gZXNjYXBlCisgICAgdm9pZCB0ZXN0Q291bnRCYWNrc2xhc2goKSB7CisgICAgICAgIGRlZiBhID0gMQorICAgICAgICBhc3NlcnQgXHUwMDYxID09IDEgLy8gY2hhciA2MSBpcyAnYScKKyAgICAgICAgCisgICAgICAgIC8vIE5vdCBpbnRlcHJldGVkIGFzIGFuIGVzY2FwZQorICAgICAgICAvLyBcXHUwMDYxID09IDEgLy8gQGZhaWw6cGFyc2UKKworICAgICAgICBhc3NlcnQgIlx1MDA2MSIubGVuZ3RoKCkgPT0gMQorICAgICAgICAvLyBEb3VibGUgYmFja3NsYXNoIGludGVycHJldGVkIGFzIGEgc2luZ2xlIGJhY2tzbGFzaCBpbiBzdHJpbmcKKyAgICAgICAgYXNzZXJ0ICJcXHUwMDYxIi5sZW5ndGgoKSA9PSA2CisgICAgICAgIGFzc2VydCAiXFxcdTAwNjEiLmxlbmd0aCgpID09IDIKKyAgICAgICAgCisgICAgfQorCisgICAgLy8gR0xTOiBJZiBhbiBlbGlnaWJsZSBcIGlzIGZvbGxvd2VkIGJ5IHUsIG9yIG1vcmUgdGhhbiBvbmUgdSwgYW5kIHRoZSBsYXN0IHUKKyAgICAvLyBpcyBub3QgZm9sbG93ZWQgYnkgZm91ciBoZXhhZGVjaW1hbCBkaWdpdHMsIHRoZW4gYSBjb21waWxlLXRpbWUgZXJyb3IKKyAgICAvLyBvY2N1cnMuCisgICAgdm9pZCB0ZXN0Rm91ckhleERpZ2l0cygpIHsKKyAgICAgICAgLy8gdGhlc2UgbmV4dCBsaW5lcyB3b24ndCB3b3JrLiBUaGUgYmFja3NsYXNoIGhhcyBiZWVuIHJlcGxhY2UgYnkgYSAKKyAgICAgICAgLy8gZm9yd2FyZHMgc2xhc2ggc28gdGhhdCB0aGUgZmlsZSBwYXJzZXMuIChDb21tZW50cyBkb24ndCBjb21tZW50IG91dAorICAgICAgICAvLyB1bmljb2RlIGVzY2FwZXMuKQorICAgICAgICAvLyBhc3NlcnQgIi91NyIgPT0gIlwwNyIgLy9AZmFpbDpwYXJzZSAKKyAgICAgICAgLy8gZGVmIC91NjEgPSAyIC8vQGZhaWw6cGFyc2UgCisgICAgICAgIC8vIGRlZiAvdTA2MSA9IDIgLy9AZmFpbDpwYXJzZSAKKworICAgICAgICAvLyBJZiBmaXZlIGRpZ2l0cywgb25seSB0aGUgZmlyc3QgZm91ciBjb3VudAorICAgICAgICBkZWYgXHUwMDYxMCA9IDIgCisgICAgICAgIGFzc2VydCBhMCA9PSAyCisgICAgfQorICAgIHZvaWQgdGVzdEludmFsaWRIZXhEaWdpdHMoKSB7CisgICAgICAgIC8vIGludmFsaWQgaGV4IGRpZ2l0cworICAgICAgICAvLyBhc3NlcnQgIlx1ZmZmZyIgPT0gImEiIC8vIEBmYWlsOnBhcnNlCisgICAgICAgIC8vIGFzc2VydCAiXHV1MDA2ZyIgPT0gImEiIC8vIEBmYWlsOnBhcnNlCisgICAgICAgIC8vIGFzc2VydCAiXHVhYiBjZCIgPT0gImFjZCIgLy8gQGZhaWw6cGFyc2UKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvSmF2YVNvdXJjZUNvZGVoYXVzUGFja2FnZXNTdWl0ZS5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L0phdmFTb3VyY2VDb2RlaGF1c1BhY2thZ2VzU3VpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmQ0NzRmCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L0phdmFTb3VyY2VDb2RlaGF1c1BhY2thZ2VzU3VpdGUuamF2YQpAQCAtMCwwICsxLDg3IEBACitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudC5Hcm9vdnlUZXN0OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50bHIuQW5ub3RhdGlvblNvdXJjZVBhcnNpbmdUZXN0OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50bHIuRW51bVNvdXJjZVBhcnNpbmdUZXN0OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50bHIuR3Jvb3Z5U291cmNlQVNUVGVzdDsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudGxyLlNvdXJjZUJ1ZmZlclRlc3Q7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hbnRsci50cmVld2Fsa2VyLio7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuQ2xhc3NOb2RlVGVzdDsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5Nb2R1bGVOb2RlVGVzdDsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmJzZi5CU0ZUZXN0OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYnNmLkNhY2hlQlNGVGVzdDsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuLio7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLkNvbXBpbGF0aW9uVW5pdFRlc3Q7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLkNvbXBpbGVyQ29uZmlndXJhdGlvblRlc3Q7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLm1lc3NhZ2VzLlN5bnRheEVycm9yTWVzc2FnZVRlc3Q7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLio7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5zeW50YXguVG9rZW5UZXN0OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuQ29tcGlsZXJUZXN0OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuRmlsZVN5c3RlbUNvbXBpbGVyVGVzdDsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLmdyb292eWRvYy5Hcm9vdnlEb2NUb29sVGVzdDsKKworLyoqCisgKiBBbGwgSmF2YSBVbml0IHRlc3RzIGluIHRoZSAnb3JnLmNvZGVoYXVzLmdyb292eScgZGlyCisgKi8KKworcHVibGljIGNsYXNzIEphdmFTb3VyY2VDb2RlaGF1c1BhY2thZ2VzU3VpdGUgeworCisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShCU0ZUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEJ5dGVjb2RlSGVscGVyVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShDYWNoZUJTRlRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQ2FwaXRhbGl6ZVRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQ2xhc3NDb21wbGV0aW9uVmVyaWZpZXJUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKENsYXNzTm9kZVRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQ29tcGlsYXRpb25Vbml0VGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShDb21waWxlclRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQ29tcG9zaXRlVmlzaXRvclRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQ29uc3RydWN0b3JUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKERlZmF1bHRHcm9vdnlNZXRob2RzVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShGaWxlU3lzdGVtQ29tcGlsZXJUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEZvclRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoR2V0UHJvcGVydHlUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEdyb292eVRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoR3Jvb3Z5Q2xhc3NMb2FkZXJUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEdyb292eURvY1Rvb2xUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEdyb292eVNvdXJjZUFTVFRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoRW51bVNvdXJjZVBhcnNpbmdUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEFubm90YXRpb25Tb3VyY2VQYXJzaW5nVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShHU3RyaW5nVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShJZkVsc2VUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEludm9rZXJUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEludm9rZU1ldGhvZFRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoSW52b2tlR3Jvb3Z5TWV0aG9kVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShJbnZva2VDb25zdHJ1Y3RvclRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShNYWluVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShNZXRob2RGYWlsdXJlVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShNZXRob2RLZXlUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKE1ldGhvZFRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoTW9kdWxlTm9kZVRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoTWluZE1hcFByaW50ZXJUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKE5ld1N0YXRpY01ldGFNZXRob2RUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKE5vZGVBc0hUTUxQcmludGVyVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShOb2RlUHJpbnRlclRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUob3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbi5Qcm9wZXJ0eVRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUob3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLlByb3BlcnR5VGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShSZWZsZWN0b3JHZW5lcmF0b3JUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFJ1bkJ1Z3NUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFJ1bkNsb3N1cmVUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFJ1bkdyb292eVRlc3QuY2xhc3MpOworLy8gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShSdW5XaWtpVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShTb3VyY2VCdWZmZXJUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFNvdXJjZVByaW50ZXJUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFVuaW1wbGVtZW50ZWRTeW50YXhUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFN5bnRheEVycm9yTWVzc2FnZVRlc3QuY2xhc3MpOworLy8gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShUZXN0Q2FzZVJlbmRlckVuZ2luZVRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoVG9rZW5UZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW4uVHVwbGVMaXN0VGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuVHVwbGVMaXN0VGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShWZXJpZmllckNvZGVWaXNpdG9yVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShKZGtEeW5hbWljUHJveHlUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKENvbXBpbGVyQ29uZmlndXJhdGlvblRlc3QuY2xhc3MpOworICAgICAgICByZXR1cm4gc3VpdGU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L0phdmFTb3VyY2VHcm9vdnlQYWNrYWdlc05vblNlY3VyaXR5U3VpdGUuamF2YSBiL2dyb292eS9zcmMvdGVzdC9KYXZhU291cmNlR3Jvb3Z5UGFja2FnZXNOb25TZWN1cml0eVN1aXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIxNDIyNQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9KYXZhU291cmNlR3Jvb3Z5UGFja2FnZXNOb25TZWN1cml0eVN1aXRlLmphdmEKQEAgLTAsMCArMSw0MyBAQAoraW1wb3J0IGdyb292eS5pbnNwZWN0Lkluc3BlY3RvclRlc3Q7CitpbXBvcnQgZ3Jvb3Z5LmxhbmcuKjsKK2ltcG9ydCBncm9vdnkuc2VydmxldC5Hcm9vdnlTZXJ2bGV0VGVzdDsKK2ltcG9ydCBncm9vdnkudGV4dC5UZW1wbGF0ZVRlc3Q7CitpbXBvcnQgZ3Jvb3Z5LnRleHQuWG1sVGVtcGxhdGVFbmdpbmVUZXN0OworaW1wb3J0IGdyb292eS50cmVlLk5vZGVQcmludGVyVGVzdDsKK2ltcG9ydCBncm9vdnkudXRpbC5FdmFsVGVzdDsKK2ltcG9ydCBncm9vdnkudXRpbC5NQmVhblRlc3Q7CitpbXBvcnQgZ3Jvb3Z5LnhtbC5GYWN0b3J5U3VwcG9ydFRlc3Q7CitpbXBvcnQgZ3Jvb3Z5LnhtbC5YbWxUZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CisKKy8qKgorICogQWxsIG5vbi1zZWN1cml0eSByZWxhdGVkIEphdmEgVW5pdCB0ZXN0cyBpbiB0aGUgJ2dyb292eScgZGlyCisgKi8KKworcHVibGljIGNsYXNzIEphdmFTb3VyY2VHcm9vdnlQYWNrYWdlc05vblNlY3VyaXR5U3VpdGUgeworCisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShJbnNwZWN0b3JUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEdyb292eVNoZWxsVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShHU3RyaW5nVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShJbnRSYW5nZVRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoTWV0YUNsYXNzVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShTY3JpcHRJbnRlZ2VyRGl2aWRlVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShTY3JpcHRQcmludFRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoU2NyaXB0VGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShTZXF1ZW5jZVRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoVHVwbGVUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEdyb292eVNlcnZsZXRUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFRlbXBsYXRlVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShYbWxUZW1wbGF0ZUVuZ2luZVRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoTm9kZVByaW50ZXJUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEV2YWxUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKE1CZWFuVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShYbWxUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEZhY3RvcnlTdXBwb3J0VGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3QobmV3IFJhbmdlVGVzdFN1aXRlKCkpOworICAgICAgICByZXR1cm4gc3VpdGU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L0phdmFTb3VyY2VHcm9vdnlQYWNrYWdlc1NlY3VyaXR5U3VpdGUuamF2YSBiL2dyb292eS9zcmMvdGVzdC9KYXZhU291cmNlR3Jvb3Z5UGFja2FnZXNTZWN1cml0eVN1aXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZjY2MyMwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9KYXZhU291cmNlR3Jvb3Z5UGFja2FnZXNTZWN1cml0eVN1aXRlLmphdmEKQEAgLTAsMCArMSwxOCBAQAoraW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KK2ltcG9ydCBncm9vdnkuc2VjdXJpdHkuU2VjdXJpdHlUZXN0Ow0KK2ltcG9ydCBncm9vdnkuc2VjdXJpdHkuU2lnbmVkSmFyVGVzdDsNCisNCisvKioNCisgKiBBbGwgSmF2YSBzZWN1cml0eS1yZWxhdGVkIFVuaXQgdGVzdHMgaW4gdGhlICdncm9vdnknIGRpcg0KKyAqLw0KKw0KK3B1YmxpYyBjbGFzcyBKYXZhU291cmNlR3Jvb3Z5UGFja2FnZXNTZWN1cml0eVN1aXRlIHsNCisNCisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KKyAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOw0KKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFNlY3VyaXR5VGVzdC5jbGFzcyk7DQorICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoU2lnbmVkSmFyVGVzdC5jbGFzcyk7DQorICAgICAgICByZXR1cm4gc3VpdGU7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L0phdmFTb3VyY2VUY2tTdWl0ZS5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L0phdmFTb3VyY2VUY2tTdWl0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4M2I3MzQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvSmF2YVNvdXJjZVRja1N1aXRlLmphdmEKQEAgLTAsMCArMSwxNiBAQAoraW1wb3J0IGdscy5jaDA2LnMwNS5KTmFtZTFUZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CisKKy8qKgorICogQWxsIEphdmEgVW5pdCB0ZXN0cyBpbiB0aGUgJ2dscycgZGlyCisgKi8KKworcHVibGljIGNsYXNzIEphdmFTb3VyY2VUY2tTdWl0ZSB7CisKKyAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisgICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKEpOYW1lMVRlc3QuY2xhc3MpOworICAgICAgICByZXR1cm4gc3VpdGU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L1ViZXJUZXN0Q2FzZUJ1Z3MuamF2YSBiL2dyb292eS9zcmMvdGVzdC9VYmVyVGVzdENhc2VCdWdzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY3MmEzZgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9VYmVyVGVzdENhc2VCdWdzLmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyoqCisgKiBDb2xsZWN0cyBhbGwgQnVnLXJlbGF0ZWQgdGVzdHMuCisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amVyZW15LnJheW5lckBiaWdmb290LmNvbSI+SmVyZW15IFJheW5lcjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworCitpbXBvcnQgZ3Jvb3Z5LnV0aWwuQWxsVGVzdFN1aXRlOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIFViZXJUZXN0Q2FzZUJ1Z3MgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworICAgICAgICByZXR1cm4gQWxsVGVzdFN1aXRlLnN1aXRlKCIuL3NyYy90ZXN0IiwgImdyb292eS8qKi8qQnVnLmdyb292eSIpOworICAgIH0KKworLy8gbm8gdGVzdHMgaW5zaWRlIChzaG91bGQgd2UgaGF2ZSBhbiBBYnN0cmFjdEdyb292eVRlc3RDYXNlPz8/KQorLy8gICAgICAgIGdyb292eS5idWdzLlRlc3RTdXBwb3J0LmNsYXNzCisKKy8vICBUaGUgZm9sbG93aW5nIGNsYXNzZXMgYXBwZWFyIGluIHRhcmdldC90ZXN0LWNsYXNzZXMgYnV0IGRvIG5vdCBleHRlbmQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlCisvLyAgICAgICAgZ3Jvb3Z5LmJ1Z3MuQ2hlZXNlLmNsYXNzCisvLyAgICAgICAgZ3Jvb3Z5LmJ1Z3MuTXlSYW5nZS5jbGFzcworLy8gICAgICAgIGdyb292eS5idWdzLlNjaG9sYXN0aWMuY2xhc3MKKy8vICAgICAgICBncm9vdnkuYnVncy5TaW1wbGVNb2RlbC5jbGFzcworCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvVWJlclRlc3RDYXNlR3Jvb3Z5U291cmNlQ29kZWhhdXNQYWNrYWdlcy5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L1ViZXJUZXN0Q2FzZUdyb292eVNvdXJjZUNvZGVoYXVzUGFja2FnZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODVkYTBjCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L1ViZXJUZXN0Q2FzZUdyb292eVNvdXJjZUNvZGVoYXVzUGFja2FnZXMuamF2YQpAQCAtMCwwICsxLDI0IEBACisvKioNCisgKiBDb2xsZWN0aW5nIGFsbCBHcm9vdnkgdW5pdCB0ZXN0cyB0aGF0IGFyZSB3cml0dGVuIGluIEdyb292eSwgbm90IGluIHJvb3QsIA0KKyAqIGFuZCBub3QgQnVnLXJlbGF0ZWQuDQorICoNCisgKiBAYXV0aG9yIEpvYWNoaW0gQmF1bWFubg0KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbjogNjU0NiAkDQorICovDQorDQoraW1wb3J0IGdyb292eS51dGlsLkFsbFRlc3RTdWl0ZTsNCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQoraW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCisNCisvKioNCisgKiBDb2xsZWN0IGFsbCBncm9vdnkgdGVzdHMgDQorICovDQorcHVibGljIGNsYXNzIFViZXJUZXN0Q2FzZUdyb292eVNvdXJjZUNvZGVoYXVzUGFja2FnZXMgZXh0ZW5kcyBUZXN0Q2FzZSB7DQorICAgIC8qKg0KKyAgICAgKiBBZGQgYWxsIGdyb292eSB0ZXN0cyBmcm9tIHRoZSBjb2RlaGF1cyBzdWJkaXJzDQorICAgICAqIEByZXR1cm4gdGVzdHN1aXRlDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7DQorICAgICAgICByZXR1cm4gQWxsVGVzdFN1aXRlLnN1aXRlKCJzcmMvdGVzdCIsICJvcmcvY29kZWhhdXMvKiovKlRlc3QuZ3Jvb3Z5Iik7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L1ViZXJUZXN0Q2FzZUdyb292eVNvdXJjZVJvb3RQYWNrYWdlLmphdmEgYi9ncm9vdnkvc3JjL3Rlc3QvVWJlclRlc3RDYXNlR3Jvb3Z5U291cmNlUm9vdFBhY2thZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDRlNDY4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L1ViZXJUZXN0Q2FzZUdyb292eVNvdXJjZVJvb3RQYWNrYWdlLmphdmEKQEAgLTAsMCArMSw3NiBAQAorLyoqCisgKiBDb2xsZWN0cyBhbGwgVGVzdENhc2VzIGluIHRoZSBHcm9vdnkgdGVzdCByb290IHRoYXQgYXJlIHdyaXR0ZW4gaW4gR3Jvb3Z5LgorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmplcmVteS5yYXluZXJAYmlnZm9vdC5jb20iPkplcmVteSBSYXluZXI8L2E+CisgKiBAYXV0aG9yIERpZXJrIEtvZW5pZyAocmVmYWN0b3JlZCB0byB1c2UgQWxsVGVzdFN1aXRlKQorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCisKK2ltcG9ydCBncm9vdnkudXRpbC5BbGxUZXN0U3VpdGU7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CisKK3B1YmxpYyBjbGFzcyBVYmVyVGVzdENhc2VHcm9vdnlTb3VyY2VSb290UGFja2FnZSBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IChUZXN0U3VpdGUpIEFsbFRlc3RTdWl0ZS5zdWl0ZSgic3JjL3Rlc3QiLCAiZ3Jvb3Z5LypUZXN0Lmdyb292eSIpOworCisgICAgICAgIFN0cmluZyBvc05hbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKTsKKyAgICAgICAgaWYgKG9zTmFtZS5lcXVhbHMoIkxpbnV4IikgfHwgb3NOYW1lLmVxdWFscygiU3VuT1MiKSB8fCBvc05hbWUuZXF1YWxzKCJTb2xhcmlzIikgfHwgb3NOYW1lLmVxdWFscygiTWFjIE9TIFgiKSkgeworICAgICAgICAgICAgQ2xhc3MgbGludXhUZXN0Q2xhc3MgPSBDbGFzcy5mb3JOYW1lKCJncm9vdnkuZXhlY3V0ZS5FeGVjdXRlVGVzdF9MaW51eFNvbGFyaXMiKTsKKyAgICAgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShsaW51eFRlc3RDbGFzcyk7CisgICAgICAgIH0gZWxzZSBpZiAob3NOYW1lLmVxdWFscygiV2luZG93cyAyMDAwIikgfHwgb3NOYW1lLmVxdWFscygiV2luZG93cyAyMDAzIikgfHwgb3NOYW1lLmVxdWFscygiV2luZG93cyBYUCIpIHx8IG9zTmFtZS5lcXVhbHMoIldpbmRvd3MgVmlzdGEiKSkgeworICAgICAgICAgICAgQ2xhc3Mgd2luZG93c1Rlc3RDbGFzcyA9IENsYXNzLmZvck5hbWUoImdyb292eS5leGVjdXRlLkV4ZWN1dGVUZXN0X1dpbmRvd3MiKTsKKyAgICAgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZSh3aW5kb3dzVGVzdENsYXNzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiTm8gZXhlY3V0ZSB0ZXN0cyBmb3Igb3BlcmF0aW5nIHN5c3RlbTogIiArIG9zTmFtZSArICIhISEiKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzdWl0ZTsKKyAgICB9Cit9CisKKy8vICBUaGUgZm9sbG93aW5nIGNsYXNzZXMgYXBwZWFyIGluIHRhcmdldC90ZXN0LWNsYXNzZXMgYnV0IGRvIG5vdCBleHRlbmQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlCisvLworLy8gICAgICAgIEFub3RoZXJNb2NrSW5wdXRTdHJlYW0uY2xhc3MKKy8vICAgICAgICBCZWFuLmNsYXNzCisvLyAgICAgICAgQmVhbjI0OS5jbGFzcworLy8gICAgICAgIEJvb2xlYW5CZWFuLmNsYXNzCisvLyAgICAgICAgQ2FsbEFub3RoZXJTY3JpcHQuY2xhc3MKKy8vICAgICAgICBDbGFzc1dpdGhTY3JpcHQuY2xhc3MKKy8vICAgICAgICBDb21wYXJhYmxlRm9vLmNsYXNzCisvLyAgICAgICAgQ3JlYXRlRGF0YS5jbGFzcworLy8gICAgICAgIEVudHJ5LmNsYXNzCisvLyAgICAgICAgRXZhbEluU2NyaXB0LmNsYXNzCisvLyAgICAgICAgRmVlZC5jbGFzcworLy8gICAgICAgIEZvby5jbGFzcworLy8gICAgICAgIEhlbGxvV29ybGQuY2xhc3MKKy8vICAgICAgICBIZWxsb1dvcmxkMi5jbGFzcworLy8gICAgICAgIEh0bWwyV2lraS5jbGFzcworLy8gICAgICAgIEludGVnZXJDYXRlZ29yeS5jbGFzcworLy8gICAgICAgIExvb3AuY2xhc3MKKy8vICAgICAgICBMb29wMi5jbGFzcworLy8gICAgICAgIE1hcEZyb21MaXN0LmNsYXNzCisvLyAgICAgICAgTWFya3VwVGVzdFNjcmlwdC5jbGFzcworLy8gICAgICAgIE1ldGhvZFRlc3RTY3JpcHQuY2xhc3MKKy8vICAgICAgICBNb2NrSW5wdXRTdHJlYW0uY2xhc3MKKy8vICAgICAgICBNb2NrUHJvY2Vzcy5jbGFzcworLy8gICAgICAgIE1vY2tTb2NrZXQuY2xhc3MKKy8vICAgICAgICBPdmVybG9hZEEuY2xhc3MKKy8vICAgICAgICBPdmVybG9hZEIuY2xhc3MKKy8vICAgICAgICBOYXZUb1dpa2kuY2xhc3MKKy8vICAgICAgICBQZXJzb24uY2xhc3MKKy8vICAgICAgICBTYW1wbGVNYWluLmNsYXNzCisvLyAgICAgICAgU2NyaXB0V2l0aEZ1bmN0aW9ucy5jbGFzcworLy8gICAgICAgIFNob3dBcmdzLmNsYXNzCisvLyAgICAgICAgU3RyaW5nQ2F0ZWdvcnkuY2xhc3MKKy8vICAgICAgICBTdXBlckJhc2UuY2xhc3MKKy8vICAgICAgICBTdXBlckRlcml2ZWQuY2xhc3MKKy8vICAgICAgICBUZXN0QmFzZS5jbGFzcworLy8gICAgICAgIFRlc3RDYXNlQnVnLmNsYXNzCisvLyAgICAgICAgVGVzdERlcml2ZWQuY2xhc3MKKy8vICAgICAgICBUaW55QWdlbnQuY2xhc3MKKy8vICAgICAgICBVbml0VGVzdEFzU2NyaXB0LmNsYXNzCisvLyAgICAgICAgVXNlQ2xvc3VyZUluU2NyaXB0LmNsYXNzCisvLyAgICAgICAgWC5jbGFzcworLy8gICAgICAgIGNyZWF0ZUxvb3AuY2xhc3MKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9VYmVyVGVzdENhc2VHcm9vdnlTb3VyY2VTdWJQYWNrYWdlcy5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L1ViZXJUZXN0Q2FzZUdyb292eVNvdXJjZVN1YlBhY2thZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNlNDY2YwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9VYmVyVGVzdENhc2VHcm9vdnlTb3VyY2VTdWJQYWNrYWdlcy5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qKgorICogQ29sbGVjdGluZyBhbGwgR3Jvb3Z5IHVuaXQgdGVzdHMgdGhhdCBhcmUgd3JpdHRlbiBpbiBHcm9vdnksIG5vdCBpbiByb290LCBhbmQgbm90IEJ1Zy1yZWxhdGVkLgorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmplcmVteS5yYXluZXJAYmlnZm9vdC5jb20iPkplcmVteSBSYXluZXI8L2E+CisgKiBAYXV0aG9yIERpZXJrIEtvZW5pZworICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCisKK2ltcG9ydCBncm9vdnkudXRpbC5BbGxUZXN0U3VpdGU7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgVWJlclRlc3RDYXNlR3Jvb3Z5U291cmNlU3ViUGFja2FnZXMgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworICAgICAgICByZXR1cm4gQWxsVGVzdFN1aXRlLnN1aXRlKCJzcmMvdGVzdCIsICJncm9vdnkvKi8qKi8qVGVzdC5ncm9vdnkiKTsKKyAgICB9CisKKy8vIG5vIHRlc3RzIGluc2lkZSAoc2hvdWxkIHdlIGhhdmUgYW4gQWJzdHJhY3RHcm9vdnlUZXN0Q2FzZT8/PykKKy8vCisvLyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW4uRHVtbXlUZXN0RGVyaXZhdGlvbi5jbGFzcyk7CisvLyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW4uVGVzdFN1cHBvcnQuY2xhc3MpOworCisvLyAgVGhlIGZvbGxvd2luZyBjbGFzc2VzIGFwcGVhciBpbiB0YXJnZXQvdGVzdC1jbGFzc2VzIGJ1dCBkbyBub3QgZXh0ZW5kIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZQorLy8KKy8vICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUob3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbi5EZXJpdmVkQmVhbi5jbGFzcyk7CisvLyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW4uRHVtbXlSZWZsZWN0b3IuY2xhc3MpOworLy8gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuLkR1bXBDbGFzcy5jbGFzcyk7CisvLyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW4uRHVtcENsYXNzMi5jbGFzcyk7CisvLyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW4uRHVtcENsYXNzMy5jbGFzcyk7CisvLyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW4uRHVtcENsYXNzNC5jbGFzcyk7CisvLyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW4uRHVtcGluZ0NsYXNzTG9hZGVyLmNsYXNzKTsKKy8vICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUob3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbi5NYWluLmNsYXNzKTsKKy8vICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUob3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbi5NeUJlYW4uY2xhc3MpOworLy8gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuLlNpbXBsZUJlYW4uY2xhc3MpOworLy8gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShvcmcuY29kZWhhdXMuZ3Jvb3Z5LmR1bW15LkZvb0hhbmRsZXIuY2xhc3MpOworLy8gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuRHVtbXlCZWFuLmNsYXNzKTsKKy8vICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUob3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLk1vY2tHcm9vdnlPYmplY3QuY2xhc3MpOworLy8gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5wYXJzZXIuVGVzdFBhcnNlclN1cHBvcnQuY2xhc3MpOworLy8gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLkRvY0dlbmVyYXRvck1haW4uY2xhc3MpOworCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvVWJlclRlc3RDYXNlSmF2YVNvdXJjZUNvZGVoYXVzUGFja2FnZXMuamF2YSBiL2dyb292eS9zcmMvdGVzdC9VYmVyVGVzdENhc2VKYXZhU291cmNlQ29kZWhhdXNQYWNrYWdlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NDg3ODUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvVWJlclRlc3RDYXNlSmF2YVNvdXJjZUNvZGVoYXVzUGFja2FnZXMuamF2YQpAQCAtMCwwICsxLDIwIEBACisvKioKKyAqIFRoZSB0ZXN0cyBjb2xsZWN0ZWQgaGVyZSBhbGwgdGFrZSBhICdzaWduaWZpY2FudCcgbGVuZ3RoIG9mIHRpbWUgdG8gZXhlY3V0ZSwKKyAqIGkuZS4gZ3JlYXRlciB0aGFuIDIgc2Vjb25kcyBlbGFwc2VkIG9uIG15IG1hY2hpbmUuCisgKgorICogdG8gcHJldmVudCBhIEpWTSBzdGFydHVwLXNodXRkb3duIHRpbWUgcGVyIHRlc3QsIGl0IHNob3VsZCBiZSBtb3JlIGVmZmljaWVudCB0bworICogY29sbGVjdCB0aGUgdGVzdHMgdG9nZXRoZXIgaW50byBhIHN1aXRlLgorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmplcmVteS5yYXluZXJAYmlnZm9vdC5jb20iPkplcmVteSBSYXluZXI8L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIFViZXJUZXN0Q2FzZUphdmFTb3VyY2VDb2RlaGF1c1BhY2thZ2VzIGV4dGVuZHMgVGVzdENhc2UgeworICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKyAgICAgICAgcmV0dXJuIEphdmFTb3VyY2VDb2RlaGF1c1BhY2thZ2VzU3VpdGUuc3VpdGUoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9VYmVyVGVzdENhc2VKYXZhU291cmNlR3Jvb3Z5UGFja2FnZXNOb25TZWN1cml0eS5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L1ViZXJUZXN0Q2FzZUphdmFTb3VyY2VHcm9vdnlQYWNrYWdlc05vblNlY3VyaXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM3MTRmMgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9VYmVyVGVzdENhc2VKYXZhU291cmNlR3Jvb3Z5UGFja2FnZXNOb25TZWN1cml0eS5qYXZhCkBAIC0wLDAgKzEsMTQgQEAKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CisKKy8qKgorICogQ29sbGVjdGluZyBhbGwgc2VjdXJpdHktcmVsYXRlZCBVbml0IFRlc3RzIHVuZGVyIGdyb292eSBwYWNrYWdlLCB3cml0dGVuIGluIEphdmEuCisgKgorICogQGF1dGhvciBDaHJpc3RpYW4gU3RlaW4KKyAqIEBhdXRob3IgRGllcmsgS29lbmlnCisgKi8KK3B1YmxpYyBjbGFzcyBVYmVyVGVzdENhc2VKYXZhU291cmNlR3Jvb3Z5UGFja2FnZXNOb25TZWN1cml0eSBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisgICAgICAgIHJldHVybiBKYXZhU291cmNlR3Jvb3Z5UGFja2FnZXNOb25TZWN1cml0eVN1aXRlLnN1aXRlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L1ViZXJUZXN0Q2FzZUphdmFTb3VyY2VHcm9vdnlQYWNrYWdlc1NlY3VyaXR5LmphdmEgYi9ncm9vdnkvc3JjL3Rlc3QvVWJlclRlc3RDYXNlSmF2YVNvdXJjZUdyb292eVBhY2thZ2VzU2VjdXJpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDYyYjliCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L1ViZXJUZXN0Q2FzZUphdmFTb3VyY2VHcm9vdnlQYWNrYWdlc1NlY3VyaXR5LmphdmEKQEAgLTAsMCArMSwxNiBAQAoraW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBDb2xsZWN0aW5nIGFsbCBzZWN1cml0eS1yZWxhdGVkIFVuaXQgVGVzdHMgdW5kZXIgZ3Jvb3Z5IHBhY2thZ2UsIHdyaXR0ZW4gaW4gSmF2YS4KKyAqCisgKiBAYXV0aG9yIENocmlzdGlhbiBTdGVpbgorICogQGF1dGhvciBEaWVyayBLb2VuaWcKKyAqLworcHVibGljIGNsYXNzIFViZXJUZXN0Q2FzZUphdmFTb3VyY2VHcm9vdnlQYWNrYWdlc1NlY3VyaXR5IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworICAgICAgICByZXR1cm4gSmF2YVNvdXJjZUdyb292eVBhY2thZ2VzU2VjdXJpdHlTdWl0ZS5zdWl0ZSgpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L1ViZXJUZXN0Q2FzZVRDSy5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L1ViZXJUZXN0Q2FzZVRDSy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhY2JkOGEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvVWJlclRlc3RDYXNlVENLLmphdmEKQEAgLTAsMCArMSwyMCBAQAorLyoqCisgKiBBbGwgVENLIHRlc3RjYXNlcyB3cml0dGVuIGluIEdyb292eSBvciBKYXZhLgorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmplcmVteS5yYXluZXJAYmlnZm9vdC5jb20iPkplcmVteSBSYXluZXI8L2E+CisgKiBAYXV0aG9yIERpZXJrIEtvZW5pZworICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCisKK2ltcG9ydCBncm9vdnkudXRpbC5BbGxUZXN0U3VpdGU7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CisKK3B1YmxpYyBjbGFzcyBVYmVyVGVzdENhc2VUQ0sgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSAoVGVzdFN1aXRlKSBBbGxUZXN0U3VpdGUuc3VpdGUoInNyYy90ZXN0L2dscyIsICIqKi8qVGVzdC5ncm9vdnkiLCAiKiovdm01LypUZXN0Lmdyb292eSIpOworICAgICAgICBzdWl0ZS5hZGRUZXN0KEphdmFTb3VyY2VUY2tTdWl0ZS5zdWl0ZSgpKTsKKyAgICAgICAgcmV0dXJuIHN1aXRlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9VYmVyVGVzdENhc2VUQ0tfVk01LmphdmEgYi9ncm9vdnkvc3JjL3Rlc3QvVWJlclRlc3RDYXNlVENLX1ZNNS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwN2MxZTMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvVWJlclRlc3RDYXNlVENLX1ZNNS5qYXZhCkBAIC0wLDAgKzEsMTkgQEAKKy8qKgorICogQWxsIFRDSyB0ZXN0Y2FzZXMgd3JpdHRlbiBpbiBHcm9vdnkgb3IgSmF2YS4KKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqZXJlbXkucmF5bmVyQGJpZ2Zvb3QuY29tIj5KZXJlbXkgUmF5bmVyPC9hPgorICogQGF1dGhvciBEaWVyayBLb2VuaWcKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworCitpbXBvcnQgZ3Jvb3Z5LnV0aWwuQWxsVGVzdFN1aXRlOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCitwdWJsaWMgY2xhc3MgVWJlclRlc3RDYXNlVENLX1ZNNSBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisgICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IChUZXN0U3VpdGUpIEFsbFRlc3RTdWl0ZS5zdWl0ZSgic3JjL3Rlc3QvZ2xzIiwgIioqL3ZtNS8qVGVzdC5ncm9vdnkiKTsKKyAgICAgICAgcmV0dXJuIHN1aXRlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9nbHMvQ29tcGlsYWJsZVRlc3RTdXBwb3J0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9nbHMvQ29tcGlsYWJsZVRlc3RTdXBwb3J0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWI4MDg0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dscy9Db21waWxhYmxlVGVzdFN1cHBvcnQuZ3Jvb3Z5CkBAIC0wLDAgKzEsMjMgQEAKK3BhY2thZ2UgZ2xzDQorDQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5Db21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbjsNCitpbXBvcnQgZ3Jvb3Z5LnV0aWwuR3Jvb3Z5VGVzdENhc2U7DQorDQorcHVibGljIGNsYXNzIENvbXBpbGFibGVUZXN0U3VwcG9ydCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsNCisJcHJvdGVjdGVkIHZvaWQgc2hvdWxkTm90Q29tcGlsZShTdHJpbmcgc2NyaXB0KSB7DQorCSAgdHJ5IHsNCisgICAgICAgIEdyb292eUNsYXNzTG9hZGVyIGdjbCA9IG5ldyBHcm9vdnlDbGFzc0xvYWRlcigpDQorICAgICAgICBnY2wucGFyc2VDbGFzcyhzY3JpcHQsIGdldFRlc3RDbGFzc05hbWUoKSkNCisgICAgICB9IGNhdGNoIChDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbiBjZmUpIHsNCisgICAgICAgIGFzc2VydCB0cnVlDQorICAgICAgICByZXR1cm4NCisgICAgICB9DQorICAgICAgZmFpbCgidGhlIGNvbXBpbGF0aW9uIHN1Y2NlZWRlZCBidXQgc2hvdWxkIGhhdmUgZmFpbGVkIikNCisJfQ0KKwkNCisJcHJvdGVjdGVkIHZvaWQgc2hvdWxkQ29tcGlsZShTdHJpbmcgc2NyaXB0KSB7DQorICAgICAgR3Jvb3Z5Q2xhc3NMb2FkZXIgZ2NsID0gbmV3IEdyb292eUNsYXNzTG9hZGVyKCkNCisgICAgICBnY2wucGFyc2VDbGFzcyhzY3JpcHQsIGdldFRlc3RDbGFzc05hbWUoKSkNCisgICAgICBhc3NlcnQgdHJ1ZQ0KKwl9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9nbHMvY2gwNi9zMDUvR05hbWUxVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ2xzL2NoMDYvczA1L0dOYW1lMVRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMjM2ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ2xzL2NoMDYvczA1L0dOYW1lMVRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTQ1IEBACitwYWNrYWdlIGdscy5jaDA2LnMwNTsKKworaW1wb3J0IGdscy5jaDA2LnMwNS50ZXN0Q2xhc3Nlcy5UdDFjZ2k7CitpbXBvcnQgZ2xzLmNoMDYuczA1LnRlc3RDbGFzc2VzLlR0MWNnbzsKK2ltcG9ydCBnbHMuY2gwNi5zMDUudGVzdENsYXNzZXMuVHQxZ2k7CitpbXBvcnQgZ2xzLmNoMDYuczA1LnRlc3RDbGFzc2VzLlR0MWdvOworaW1wb3J0IGdscy5jaDA2LnMwNS50ZXN0Q2xhc3Nlcy5UdDE7CitpbXBvcnQgZ2xzLmNoMDYuczA1LnRlc3RDbGFzc2VzLlR0MWM7CisKK2NsYXNzIEdOYW1lMVRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisgIHZvaWQgdGVzdE9iamVjdFN1cHBvcnROYW1lSGFuZGxpbmcoKSB7CisgICAgVHQxICBvYmogPSBuZXcgVHQxKCkgIC8vIFRlc3QgUE9KTworICAgIGRlZiBuZXdYID0gIm5ldyB4IgorICAgIGRlZiBuZXdYMSA9ICJuZXcgeDEiCisgICAgZGVmIG5ld1gyID0gIm5ldyB4MiIKKyAgICAKKyAgICBhc3NlcnQgb2JqLnggPT0gInByb3BlcnR5IgorICAgIGFzc2VydCBvYmouQHggPT0gImZpZWxkIgorICAgIGFzc2VydCBvYmoueCgpID09ICJtZXRob2QiCisgICAgCisgICAgb2JqLnggPSBuZXdYCisgICAgb2JqLkB4ID0gbmV3WDEKKyAgICAKKyAgICBhc3NlcnQgb2JqLnggPT0gbmV3WAorICAgIGFzc2VydCBvYmouQHggPT0gbmV3WDEKKyAgICAKKyAgICBvYmouc2V0WCBuZXdYMgorICAgIAorICAgIGFzc2VydCBvYmoueCA9PSBuZXdYMgorICAgIGFzc2VydCBvYmouQHggPT0gbmV3WDEKKyAgfQorICAKKyAgdm9pZCB0ZXN0T2JqZWN0U3VwcG9ydE5hbWVIYW5kbGluZzEoKSB7CisgICAgVHQxZ28gIG9iaiA9IG5ldyBUdDFnbygpICAvLyBUZXN0IGNsYXNzIHN1YmNsYXNzaW5nIEdyb292eU9iamVjdFN1cHBvcnQKKyAgICBkZWYgbmV3WCA9ICJuZXcgeCIKKyAgICBkZWYgbmV3WDEgPSAibmV3IHgxIgorICAgIGRlZiBuZXdYMiA9ICJuZXcgeDIiCisgICAgCisgICAgYXNzZXJ0IG9iai54ID09ICJwcm9wZXJ0eSIKKyAgICBhc3NlcnQgb2JqLkB4ID09ICJmaWVsZCIKKyAgICBhc3NlcnQgb2JqLngoKSA9PSAibWV0aG9kIgorICAgIAorICAgIG9iai54ID0gbmV3WAorICAgIG9iai5AeCA9IG5ld1gxCisgICAgCisgICAgYXNzZXJ0IG9iai54ID09IG5ld1gKKyAgICBhc3NlcnQgb2JqLkB4ID09IG5ld1gxCisgICAgCisgICAgb2JqLnNldFggbmV3WDIKKyAgICAKKyAgICBhc3NlcnQgb2JqLnggPT0gbmV3WDIKKyAgICBhc3NlcnQgb2JqLkB4ID09IG5ld1gxCisgIH0KKyAgCisgIHZvaWQgdGVzdE9iamVjdFN1cHBvcnROYW1lSGFuZGxpbmcyKCkgeworICAgIFR0MSAgb2JqID0gbmV3IFR0MWdpKCkgIC8vIFRlc3QgUE9KTyBpbXBsZW1lbnRpbmcgR3Jvb3Z5T2JqZWN0CisgICAgZGVmIG5ld1ggPSAibmV3IHgiCisgICAgZGVmIG5ld1gxID0gIm5ldyB4MSIKKyAgICBkZWYgbmV3WDIgPSAibmV3IHgyIgorICAgIAorICAgIGFzc2VydCBvYmoueCA9PSAiZHluYW1pYyBwcm9wZXJ0eSIKKyAgICBhc3NlcnQgb2JqLkB4ID09ICJmaWVsZCIKKyAgICBhc3NlcnQgb2JqLngoKSA9PSAiZHluYW1pYyBtZXRob2QiCisgICAgCisgICAgb2JqLnggPSBuZXdYCisgICAgb2JqLkB4ID0gbmV3WDEKKyAgICAKKyAgICBhc3NlcnQgb2JqLnggPT0gImR5bmFtaWMgcHJvcGVydHkiCisgICAgYXNzZXJ0IG9iai5AeCA9PSBuZXdYMQorICAgIAorICAgIG9iai5zZXRYIG5ld1gyCisgICAgCisgICAgYXNzZXJ0IG9iai54ID09ICJkeW5hbWljIHByb3BlcnR5IgorICAgIGFzc2VydCBvYmouQHggPT0gbmV3WDEKKyAgfQorICAKKyAgdm9pZCB0ZXN0T2JqZWN0U3VwcG9ydE5hbWVIYW5kbGluZ1dpdG5DbG9zdXJlVmFsdWVzKCkgeworICAgIFR0MWMgb2JqID0gbmV3IFR0MWMoKSAgLy8gVGVzdCBQT0pPCisgICAgZGVmIG5ld1ggPSB7Im5ldyB4In0KKyAgICBkZWYgbmV3WDEgPSB7Im5ldyB4MSJ9CisgICAgZGVmIG5ld1gyID0geyJuZXcgeDIifQorICAgIAorICAgIGFzc2VydCAob2JqLngpKCkgPT0gInByb3BlcnR5IgorICAgIGFzc2VydCBvYmouQHgoKSA9PSAiZmllbGQiCisgICAgYXNzZXJ0IG9iai54KCkgPT0gIm1ldGhvZCIKKyAgICAKKyAgICAgIAorICAgIG9iai54ID0gbmV3WAorICAgIG9iai5AeCA9IG5ld1gxCisgICAgCisgICAgYXNzZXJ0IChvYmoueCkoKSA9PSBuZXdYKCkKKyAgICBhc3NlcnQgb2JqLkB4KCkgPT0gbmV3WDEoKQorICAgIAorICAgIG9iai5zZXRYIG5ld1gyCisgICAgCisgICAgYXNzZXJ0IChvYmoueCkoKSA9PSBuZXdYMigpCisgICAgYXNzZXJ0IG9iai5AeCgpID09IG5ld1gxKCkKKyAgfQorICAKKyAgdm9pZCB0ZXN0T2JqZWN0U3VwcG9ydE5hbWVIYW5kbGluZ1dpdG5DbG9zdXJlVmFsdWVzMSgpIHsKKyAgICBUdDFjZ28gb2JqID0gbmV3IFR0MWNnbygpICAvLyBjbGFzcyBzdWJjbGFzc2luZyBHcm9vdnlPYmplY3RTdXBwb3J0CisgICAgZGVmIG5ld1ggPSB7Im5ldyB4In0KKyAgICBkZWYgbmV3WDEgPSB7Im5ldyB4MSJ9CisgICAgZGVmIG5ld1gyID0geyJuZXcgeDIifQorICAgIAorICAgIGFzc2VydCAob2JqLngpKCkgPT0gInByb3BlcnR5IgorICAgIGFzc2VydCBvYmouQHgoKSA9PSAiZmllbGQiCisgICAgYXNzZXJ0IG9iai54KCkgPT0gIm1ldGhvZCIKKyAgICAKKyAgICAgIAorICAgIG9iai54ID0gbmV3WAorICAgIG9iai5AeCA9IG5ld1gxCisgICAgCisgICAgYXNzZXJ0IChvYmoueCkoKSA9PSBuZXdYKCkKKyAgICBhc3NlcnQgKG9iai5AeCkoKSA9PSBuZXdYMSgpCisgICAgCisgICAgb2JqLnNldFggbmV3WDIKKyAgICAKKyAgICBhc3NlcnQgKG9iai54KSgpID09IG5ld1gyKCkKKyAgICBhc3NlcnQgKG9iai5AeCkoKSA9PSBuZXdYMSgpCisgIH0KKyAgCisgIHZvaWQgdGVzdE9iamVjdFN1cHBvcnROYW1lSGFuZGxpbmdXaXRuQ2xvc3VyZVZhbHVlczIoKSB7CisgICAgVHQxYyBvYmogPSBuZXcgVHQxY2dpKCkgIC8vIFRlc3QgUE9KTyBpbXBsZW1lbnRpbmcgR3Jvb3Z5T2JqZWN0CisgICAgZGVmIG5ld1ggPSB7Im5ldyB4In0KKyAgICBkZWYgbmV3WDEgPSB7Im5ldyB4MSJ9CisgICAgZGVmIG5ld1gyID0geyJuZXcgeDIifQorICAgIAorICAgIGFzc2VydCAob2JqLngpKCkgPT0gInByb3BlcnR5IgorICAgIGFzc2VydCAob2JqLkB4KSgpID09ICJmaWVsZCIgIC8vIGNhbid0IHdyaXRlIG9iai5AeCgpIC0gc3ludGF4IGVycm9yCisgICAgYXNzZXJ0IG9iai54KCkgPT0gIm1ldGhvZCIKKyAgICAKKyAgICAgIAorICAgIG9iai54ID0gbmV3WAorICAgIG9iai5AeCA9IG5ld1gxCisgICAgCisgICAgYXNzZXJ0IChvYmoueCkoKSA9PSBuZXdYKCkKKyAgICBhc3NlcnQgKG9iai5AeCkoKSA9PSBuZXdYMSgpCisgICAgCisgICAgb2JqLnNldFggbmV3WDIKKyAgICAKKyAgICBhc3NlcnQgKG9iai54KSgpID09IG5ld1gyKCkKKyAgICBhc3NlcnQgKG9iai5AeCkoKSA9PSBuZXdYMSgpCisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ2xzL2NoMDYvczA1L0pOYW1lMVRlc3QuamF2YSBiL2dyb292eS9zcmMvdGVzdC9nbHMvY2gwNi9zMDUvSk5hbWUxVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmOGQ2OTcKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ2xzL2NoMDYvczA1L0pOYW1lMVRlc3QuamF2YQpAQCAtMCwwICsxLDI5MSBAQAorcGFja2FnZSBnbHMuY2gwNi5zMDU7CisKKworaW1wb3J0IGdscy5jaDA2LnMwNS50ZXN0Q2xhc3Nlcy5UdDFjZ2k7CitpbXBvcnQgZ2xzLmNoMDYuczA1LnRlc3RDbGFzc2VzLlR0MWNnbzsKK2ltcG9ydCBnbHMuY2gwNi5zMDUudGVzdENsYXNzZXMuVHQxZ2k7CitpbXBvcnQgZ2xzLmNoMDYuczA1LnRlc3RDbGFzc2VzLlR0MWdvOworaW1wb3J0IGdyb292eS5sYW5nLkNsb3N1cmU7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworLyoKKyAqIENvcHlyaWdodCAyMDA1IEpvaG4gRy4gV2lsc29uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKKy8qKgorICogQGF1dGhvciBKb2huIFdpbHNvbgorICovCisKK3B1YmxpYyBjbGFzcyBKTmFtZTFUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICAgIHB1YmxpYyB2b2lkIHRlc3RPYmplY3RTdXBwb3J0TmFtZUhhbmRsaW5nKCkgeworICAgICAgICBmaW5hbCBUdDFnbyBvYmogPSBuZXcgVHQxZ28oKTsgIC8vIFRlc3Qgc3ViY2xhc3Mgb2YgR3Jvb3Z5T2JqZWN0U3VwcG9ydAorICAgICAgICBmaW5hbCBTdHJpbmcgbmV3WCA9ICJuZXcgeCI7CisgICAgICAgIGZpbmFsIFN0cmluZyBuZXdYMSA9ICJuZXcgeDEiOworICAgICAgICBmaW5hbCBTdHJpbmcgbmV3WDIgPSAibmV3IHgyIjsKKyAgICAgICAgZmluYWwgU3RyaW5nIG5ld1gzID0gIm5ldyB4MyI7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShvYmouZ2V0UHJvcGVydHkoIngiKSA9PSBvYmouZ2V0WCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShvYmouZ2V0TWV0YUNsYXNzKCkuZ2V0QXR0cmlidXRlKG9iaiwgIngiKSA9PSBvYmoueCk7CisgICAgICAgIGFzc2VydFRydWUob2JqLmludm9rZU1ldGhvZCgieCIsIG5ldyBPYmplY3RbXXt9KSA9PSBvYmoueCgpKTsKKworICAgICAgICBvYmouc2V0UHJvcGVydHkoIngiLCBuZXdYKTsKKyAgICAgICAgb2JqLmdldE1ldGFDbGFzcygpLnNldEF0dHJpYnV0ZShvYmosICJ4IiwgbmV3WDEpOworCisgICAgICAgIGFzc2VydFRydWUob2JqLmdldFByb3BlcnR5KCJ4IikgPT0gbmV3WCk7CisgICAgICAgIGFzc2VydFRydWUob2JqLmdldE1ldGFDbGFzcygpLmdldEF0dHJpYnV0ZShvYmosICJ4IikgPT0gbmV3WDEpOworCisgICAgICAgIG9iai5zZXRYKG5ld1gyKTsKKyAgICAgICAgb2JqLnggPSBuZXdYMzsKKworICAgICAgICBhc3NlcnRUcnVlKG9iai5nZXRQcm9wZXJ0eSgieCIpID09IG5ld1gyKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShvYmouZ2V0TWV0YUNsYXNzKCkuZ2V0QXR0cmlidXRlKG9iaiwgIngiKSA9PSBuZXdYMyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE9iamVjdFN1cHBvcnROYW1lSGFuZGxpbmcxKCkgeworICAgICAgICBmaW5hbCBUdDFnbyBvYmogPSBuZXcgVHQxZ28oKSB7CisgICAgICAgIH07IC8vIHJlcGVhdCB0ZXN0IHdpdGggc3ViY2xhc3MKKyAgICAgICAgZmluYWwgU3RyaW5nIG5ld1ggPSAibmV3IHgiOworICAgICAgICBmaW5hbCBTdHJpbmcgbmV3WDEgPSAibmV3IHgxIjsKKyAgICAgICAgZmluYWwgU3RyaW5nIG5ld1gyID0gIm5ldyB4MiI7CisgICAgICAgIGZpbmFsIFN0cmluZyBuZXdYMyA9ICJuZXcgeDMiOworCisgICAgICAgIGFzc2VydFRydWUob2JqLmdldFByb3BlcnR5KCJ4IikgPT0gb2JqLmdldFgoKSk7CisgICAgICAgIGFzc2VydFRydWUob2JqLmdldE1ldGFDbGFzcygpLmdldEF0dHJpYnV0ZShvYmosICJ4IikgPT0gb2JqLngpOworICAgICAgICBhc3NlcnRUcnVlKG9iai5pbnZva2VNZXRob2QoIngiLCBuZXcgT2JqZWN0W117fSkgPT0gb2JqLngoKSk7CisKKyAgICAgICAgb2JqLnNldFByb3BlcnR5KCJ4IiwgbmV3WCk7CisgICAgICAgIG9iai5nZXRNZXRhQ2xhc3MoKS5zZXRBdHRyaWJ1dGUob2JqLCAieCIsIG5ld1gxKTsKKworICAgICAgICBhc3NlcnRUcnVlKG9iai5nZXRQcm9wZXJ0eSgieCIpID09IG5ld1gpOworICAgICAgICBhc3NlcnRUcnVlKG9iai5nZXRNZXRhQ2xhc3MoKS5nZXRBdHRyaWJ1dGUob2JqLCAieCIpID09IG5ld1gxKTsKKworICAgICAgICBvYmouc2V0WChuZXdYMik7CisgICAgICAgIG9iai54ID0gbmV3WDM7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShvYmouZ2V0UHJvcGVydHkoIngiKSA9PSBuZXdYMik7CisgICAgICAgIGFzc2VydFRydWUob2JqLmdldE1ldGFDbGFzcygpLmdldEF0dHJpYnV0ZShvYmosICJ4IikgPT0gbmV3WDMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RPYmplY3RTdXBwb3J0TmFtZUhhbmRsaW5nV2l0bkNsb3N1cmVWYWx1ZXMoKSB7CisgICAgICAgIGZpbmFsIFR0MWNnbyBvYmogPSBuZXcgVHQxY2dvKCk7ICAvLyBUZXN0IHN1YmNsYXNzIG9mIEdyb292eU9iamVjdFN1cHBvcnQKKyAgICAgICAgZmluYWwgQ2xvc3VyZSBuZXdYID0gbmV3IENsb3N1cmUobnVsbCkgeworICAgICAgICAgICAgcHVibGljIE9iamVjdCBkb0NhbGwoZmluYWwgT2JqZWN0IHBhcmFtcykgeworICAgICAgICAgICAgICAgIHJldHVybiAibmV3IHgiOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBmaW5hbCBDbG9zdXJlIG5ld1gxID0gbmV3IENsb3N1cmUobnVsbCkgeworICAgICAgICAgICAgcHVibGljIE9iamVjdCBkb0NhbGwoZmluYWwgT2JqZWN0IHBhcmFtcykgeworICAgICAgICAgICAgICAgIHJldHVybiAibmV3IHgxIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgZmluYWwgQ2xvc3VyZSBuZXdYMiA9IG5ldyBDbG9zdXJlKG51bGwpIHsKKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgZG9DYWxsKGZpbmFsIE9iamVjdCBwYXJhbXMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIm5ldyB4MiI7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIGZpbmFsIENsb3N1cmUgbmV3WDMgPSBuZXcgQ2xvc3VyZShudWxsKSB7CisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGRvQ2FsbChmaW5hbCBPYmplY3QgcGFyYW1zKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJuZXcgeDMiOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIGFzc2VydFRydWUoKChDbG9zdXJlKSBvYmouZ2V0UHJvcGVydHkoIngiKSkuY2FsbCgpID09IG9iai5nZXRYKCkuY2FsbCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgoKENsb3N1cmUpIG9iai5nZXRNZXRhQ2xhc3MoKS5nZXRBdHRyaWJ1dGUob2JqLCAieCIpKS5jYWxsKCkgPT0gb2JqLnguY2FsbCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShvYmouaW52b2tlTWV0aG9kKCJ4IiwgbmV3IE9iamVjdFtde30pID09IG9iai54KCkpOworCisgICAgICAgIG9iai5zZXRQcm9wZXJ0eSgieCIsIG5ld1gpOworICAgICAgICBvYmouZ2V0TWV0YUNsYXNzKCkuc2V0QXR0cmlidXRlKG9iaiwgIngiLCBuZXdYMSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgoKENsb3N1cmUpIG9iai5nZXRQcm9wZXJ0eSgieCIpKS5jYWxsKCkgPT0gbmV3WC5jYWxsKCkpOworICAgICAgICBhc3NlcnRUcnVlKCgoQ2xvc3VyZSkgb2JqLmdldE1ldGFDbGFzcygpLmdldEF0dHJpYnV0ZShvYmosICJ4IikpLmNhbGwoKSA9PSBuZXdYMS5jYWxsKCkpOworCisgICAgICAgIG9iai5zZXRYKG5ld1gyKTsKKyAgICAgICAgb2JqLnggPSBuZXdYMzsKKworICAgICAgICBhc3NlcnRUcnVlKCgoQ2xvc3VyZSkgb2JqLmdldFByb3BlcnR5KCJ4IikpLmNhbGwoKSA9PSBuZXdYMi5jYWxsKCkpOworICAgICAgICBhc3NlcnRUcnVlKCgoQ2xvc3VyZSkgb2JqLmdldE1ldGFDbGFzcygpLmdldEF0dHJpYnV0ZShvYmosICJ4IikpLmNhbGwoKSA9PSBuZXdYMy5jYWxsKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RPYmplY3RTdXBwb3J0TmFtZUhhbmRsaW5nV2l0bkNsb3N1cmVWYWx1ZXNpKCkgeworICAgICAgICBmaW5hbCBUdDFjZ28gb2JqID0gbmV3IFR0MWNnbygpIHsKKyAgICAgICAgfTsgIC8vIHJlcGVhdCB0ZXN0IHdpdGggc3ViY2xhc3MKKyAgICAgICAgZmluYWwgQ2xvc3VyZSBuZXdYID0gbmV3IENsb3N1cmUobnVsbCkgeworICAgICAgICAgICAgcHVibGljIE9iamVjdCBkb0NhbGwoZmluYWwgT2JqZWN0IHBhcmFtcykgeworICAgICAgICAgICAgICAgIHJldHVybiAibmV3IHgiOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBmaW5hbCBDbG9zdXJlIG5ld1gxID0gbmV3IENsb3N1cmUobnVsbCkgeworICAgICAgICAgICAgcHVibGljIE9iamVjdCBkb0NhbGwoZmluYWwgT2JqZWN0IHBhcmFtcykgeworICAgICAgICAgICAgICAgIHJldHVybiAibmV3IHgxIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgZmluYWwgQ2xvc3VyZSBuZXdYMiA9IG5ldyBDbG9zdXJlKG51bGwpIHsKKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgZG9DYWxsKGZpbmFsIE9iamVjdCBwYXJhbXMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIm5ldyB4MiI7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIGZpbmFsIENsb3N1cmUgbmV3WDMgPSBuZXcgQ2xvc3VyZShudWxsKSB7CisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGRvQ2FsbChmaW5hbCBPYmplY3QgcGFyYW1zKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJuZXcgeDMiOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIGFzc2VydFRydWUoKChDbG9zdXJlKSBvYmouZ2V0UHJvcGVydHkoIngiKSkuY2FsbCgpID09IG9iai5nZXRYKCkuY2FsbCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgoKENsb3N1cmUpIG9iai5nZXRNZXRhQ2xhc3MoKS5nZXRBdHRyaWJ1dGUob2JqLCAieCIpKS5jYWxsKCkgPT0gb2JqLnguY2FsbCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShvYmouaW52b2tlTWV0aG9kKCJ4IiwgbmV3IE9iamVjdFtde30pID09IG9iai54KCkpOworCisgICAgICAgIG9iai5zZXRQcm9wZXJ0eSgieCIsIG5ld1gpOworICAgICAgICBvYmouZ2V0TWV0YUNsYXNzKCkuc2V0QXR0cmlidXRlKG9iaiwgIngiLCBuZXdYMSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgoKENsb3N1cmUpIG9iai5nZXRQcm9wZXJ0eSgieCIpKS5jYWxsKCkgPT0gbmV3WC5jYWxsKCkpOworICAgICAgICBhc3NlcnRUcnVlKCgoQ2xvc3VyZSkgb2JqLmdldE1ldGFDbGFzcygpLmdldEF0dHJpYnV0ZShvYmosICJ4IikpLmNhbGwoKSA9PSBuZXdYMS5jYWxsKCkpOworCisgICAgICAgIG9iai5zZXRYKG5ld1gyKTsKKyAgICAgICAgb2JqLnggPSBuZXdYMzsKKworICAgICAgICBhc3NlcnRUcnVlKCgoQ2xvc3VyZSkgb2JqLmdldFByb3BlcnR5KCJ4IikpLmNhbGwoKSA9PSBuZXdYMi5jYWxsKCkpOworICAgICAgICBhc3NlcnRUcnVlKCgoQ2xvc3VyZSkgb2JqLmdldE1ldGFDbGFzcygpLmdldEF0dHJpYnV0ZShvYmosICJ4IikpLmNhbGwoKSA9PSBuZXdYMy5jYWxsKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRhQ2xhc3NOYW1lSGFuZGxpbmcoKSB7CisgICAgICAgIGZpbmFsIFR0MWdpIG9iaiA9IG5ldyBUdDFnaSgpOyAgLy8gVGVzdCBjbGFzcyBpbXBsZW1lbnRpbmcgR3Jvb3Z5T2JqZWN0CisgICAgICAgIGZpbmFsIFN0cmluZyBuZXdYID0gIm5ldyB4IjsKKyAgICAgICAgZmluYWwgU3RyaW5nIG5ld1gxID0gIm5ldyB4MSI7CisgICAgICAgIGZpbmFsIFN0cmluZyBuZXdYMiA9ICJuZXcgeDIiOworICAgICAgICBmaW5hbCBTdHJpbmcgbmV3WDMgPSAibmV3IHgzIjsKKworICAgICAgICBhc3NlcnRUcnVlKCJkeW5hbWljIHByb3BlcnR5Ii5lcXVhbHMob2JqLmdldFByb3BlcnR5KCJ4IikpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShvYmouZ2V0TWV0YUNsYXNzKCkuZ2V0QXR0cmlidXRlKG9iaiwgIngiKSA9PSBvYmoueCk7CisgICAgICAgIGFzc2VydFRydWUoImR5bmFtaWMgbWV0aG9kIi5lcXVhbHMob2JqLmludm9rZU1ldGhvZCgieCIsIG5ldyBPYmplY3RbXXt9KSkpOworCisgICAgICAgIG9iai5zZXRQcm9wZXJ0eSgieCIsIG5ld1gpOworICAgICAgICBvYmouZ2V0TWV0YUNsYXNzKCkuc2V0QXR0cmlidXRlKG9iaiwgIngiLCBuZXdYMSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZHluYW1pYyBwcm9wZXJ0eSIuZXF1YWxzKG9iai5nZXRQcm9wZXJ0eSgieCIpKSk7CisgICAgICAgIGFzc2VydFRydWUob2JqLmdldE1ldGFDbGFzcygpLmdldEF0dHJpYnV0ZShvYmosICJ4IikgPT0gbmV3WDEpOworCisgICAgICAgIG9iai5zZXRYKG5ld1gyKTsKKyAgICAgICAgb2JqLnggPSBuZXdYMzsKKworICAgICAgICBhc3NlcnRUcnVlKCJkeW5hbWljIHByb3BlcnR5Ii5lcXVhbHMob2JqLmdldFByb3BlcnR5KCJ4IikpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShvYmouZ2V0TWV0YUNsYXNzKCkuZ2V0QXR0cmlidXRlKG9iaiwgIngiKSA9PSBuZXdYMyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE1ldGFDbGFzc05hbWVIYW5kbGluZzEoKSB7CisgICAgICAgIGZpbmFsIFR0MWdpIG9iaiA9IG5ldyBUdDFnaSgpIHsKKyAgICAgICAgfTsgLy8gcmVwZWF0IHRlc3Qgd2l0aCBzdWJjbGFzcworICAgICAgICBmaW5hbCBTdHJpbmcgbmV3WCA9ICJuZXcgeCI7CisgICAgICAgIGZpbmFsIFN0cmluZyBuZXdYMSA9ICJuZXcgeDEiOworICAgICAgICBmaW5hbCBTdHJpbmcgbmV3WDIgPSAibmV3IHgyIjsKKyAgICAgICAgZmluYWwgU3RyaW5nIG5ld1gzID0gIm5ldyB4MyI7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZHluYW1pYyBwcm9wZXJ0eSIuZXF1YWxzKG9iai5nZXRQcm9wZXJ0eSgieCIpKSk7CisgICAgICAgIGFzc2VydFRydWUob2JqLmdldE1ldGFDbGFzcygpLmdldEF0dHJpYnV0ZShvYmosICJ4IikgPT0gb2JqLngpOworICAgICAgICBhc3NlcnRUcnVlKCJkeW5hbWljIG1ldGhvZCIuZXF1YWxzKG9iai5pbnZva2VNZXRob2QoIngiLCBuZXcgT2JqZWN0W117fSkpKTsKKworICAgICAgICBvYmouc2V0UHJvcGVydHkoIngiLCBuZXdYKTsKKyAgICAgICAgb2JqLmdldE1ldGFDbGFzcygpLnNldEF0dHJpYnV0ZShvYmosICJ4IiwgbmV3WDEpOworCisgICAgICAgIGFzc2VydFRydWUoImR5bmFtaWMgcHJvcGVydHkiLmVxdWFscyhvYmouZ2V0UHJvcGVydHkoIngiKSkpOworICAgICAgICBhc3NlcnRUcnVlKG9iai5nZXRNZXRhQ2xhc3MoKS5nZXRBdHRyaWJ1dGUob2JqLCAieCIpID09IG5ld1gxKTsKKworICAgICAgICBvYmouc2V0WChuZXdYMik7CisgICAgICAgIG9iai54ID0gbmV3WDM7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZHluYW1pYyBwcm9wZXJ0eSIuZXF1YWxzKG9iai5nZXRQcm9wZXJ0eSgieCIpKSk7CisgICAgICAgIGFzc2VydFRydWUob2JqLmdldE1ldGFDbGFzcygpLmdldEF0dHJpYnV0ZShvYmosICJ4IikgPT0gbmV3WDMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRhQ2xhc3NOYW1lSGFuZGxpbmdXaXRoQ2xvc3VyZXMoKSB7CisgICAgICAgIGZpbmFsIFR0MWNnaSBvYmogPSBuZXcgVHQxY2dpKCk7ICAvLyBUZXN0IGNsYXNzIGltcGxlbWVudGluZyBHcm9vdnlPYmplY3QKKyAgICAgICAgZmluYWwgQ2xvc3VyZSBuZXdYID0gbmV3IENsb3N1cmUobnVsbCkgeworICAgICAgICAgICAgcHVibGljIE9iamVjdCBkb0NhbGwoZmluYWwgT2JqZWN0IHBhcmFtcykgeworICAgICAgICAgICAgICAgIHJldHVybiAibmV3IHgiOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBmaW5hbCBDbG9zdXJlIG5ld1gxID0gbmV3IENsb3N1cmUobnVsbCkgeworICAgICAgICAgICAgcHVibGljIE9iamVjdCBkb0NhbGwoZmluYWwgT2JqZWN0IHBhcmFtcykgeworICAgICAgICAgICAgICAgIHJldHVybiAibmV3IHgxIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgZmluYWwgQ2xvc3VyZSBuZXdYMiA9IG5ldyBDbG9zdXJlKG51bGwpIHsKKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgZG9DYWxsKGZpbmFsIE9iamVjdCBwYXJhbXMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIm5ldyB4MiI7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIGZpbmFsIENsb3N1cmUgbmV3WDMgPSBuZXcgQ2xvc3VyZShudWxsKSB7CisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGRvQ2FsbChmaW5hbCBPYmplY3QgcGFyYW1zKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJuZXcgeDMiOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIGFzc2VydFRydWUoKChDbG9zdXJlKSBvYmouZ2V0UHJvcGVydHkoIngiKSkuY2FsbCgpID09IG9iai5nZXRYKCkuY2FsbCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgoKENsb3N1cmUpIG9iai5nZXRNZXRhQ2xhc3MoKS5nZXRBdHRyaWJ1dGUob2JqLCAieCIpKS5jYWxsKCkgPT0gb2JqLnguY2FsbCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShvYmouaW52b2tlTWV0aG9kKCJ4IiwgbmV3IE9iamVjdFtde30pID09IG9iai54KCkpOworCisgICAgICAgIG9iai5zZXRQcm9wZXJ0eSgieCIsIG5ld1gpOworICAgICAgICBvYmouZ2V0TWV0YUNsYXNzKCkuc2V0QXR0cmlidXRlKG9iaiwgIngiLCBuZXdYMSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgoKENsb3N1cmUpIG9iai5nZXRQcm9wZXJ0eSgieCIpKS5jYWxsKCkgPT0gbmV3WC5jYWxsKCkpOworICAgICAgICBhc3NlcnRUcnVlKCgoQ2xvc3VyZSkgb2JqLmdldE1ldGFDbGFzcygpLmdldEF0dHJpYnV0ZShvYmosICJ4IikpLmNhbGwoKSA9PSBuZXdYMS5jYWxsKCkpOworCisgICAgICAgIG9iai5zZXRYKG5ld1gyKTsKKyAgICAgICAgb2JqLnggPSBuZXdYMzsKKworICAgICAgICBhc3NlcnRUcnVlKCgoQ2xvc3VyZSkgb2JqLmdldFByb3BlcnR5KCJ4IikpLmNhbGwoKSA9PSBuZXdYMi5jYWxsKCkpOworICAgICAgICBhc3NlcnRUcnVlKCgoQ2xvc3VyZSkgb2JqLmdldE1ldGFDbGFzcygpLmdldEF0dHJpYnV0ZShvYmosICJ4IikpLmNhbGwoKSA9PSBuZXdYMy5jYWxsKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRhQ2xhc3NOYW1lSGFuZGxpbmdXaXRoQ2xvc3VyZXMxKCkgeworICAgICAgICBmaW5hbCBUdDFjZ2kgb2JqID0gbmV3IFR0MWNnaSgpIHsKKyAgICAgICAgfTsgIC8vIHJlcGVhdCB0ZXN0IHdpdGggc3ViY2xhc3MKKyAgICAgICAgZmluYWwgQ2xvc3VyZSBuZXdYID0gbmV3IENsb3N1cmUobnVsbCkgeworICAgICAgICAgICAgcHVibGljIE9iamVjdCBkb0NhbGwoZmluYWwgT2JqZWN0IHBhcmFtcykgeworICAgICAgICAgICAgICAgIHJldHVybiAibmV3IHgiOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBmaW5hbCBDbG9zdXJlIG5ld1gxID0gbmV3IENsb3N1cmUobnVsbCkgeworICAgICAgICAgICAgcHVibGljIE9iamVjdCBkb0NhbGwoZmluYWwgT2JqZWN0IHBhcmFtcykgeworICAgICAgICAgICAgICAgIHJldHVybiAibmV3IHgxIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgZmluYWwgQ2xvc3VyZSBuZXdYMiA9IG5ldyBDbG9zdXJlKG51bGwpIHsKKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgZG9DYWxsKGZpbmFsIE9iamVjdCBwYXJhbXMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIm5ldyB4MiI7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIGZpbmFsIENsb3N1cmUgbmV3WDMgPSBuZXcgQ2xvc3VyZShudWxsKSB7CisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGRvQ2FsbChmaW5hbCBPYmplY3QgcGFyYW1zKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJuZXcgeDMiOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIGFzc2VydFRydWUoKChDbG9zdXJlKSBvYmouZ2V0UHJvcGVydHkoIngiKSkuY2FsbCgpID09IG9iai5nZXRYKCkuY2FsbCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgoKENsb3N1cmUpIG9iai5nZXRNZXRhQ2xhc3MoKS5nZXRBdHRyaWJ1dGUob2JqLCAieCIpKS5jYWxsKCkgPT0gb2JqLnguY2FsbCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShvYmouaW52b2tlTWV0aG9kKCJ4IiwgbmV3IE9iamVjdFtde30pID09IG9iai54KCkpOworCisgICAgICAgIG9iai5zZXRQcm9wZXJ0eSgieCIsIG5ld1gpOworICAgICAgICBvYmouZ2V0TWV0YUNsYXNzKCkuc2V0QXR0cmlidXRlKG9iaiwgIngiLCBuZXdYMSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgoKENsb3N1cmUpIG9iai5nZXRQcm9wZXJ0eSgieCIpKS5jYWxsKCkgPT0gbmV3WC5jYWxsKCkpOworICAgICAgICBhc3NlcnRUcnVlKCgoQ2xvc3VyZSkgb2JqLmdldE1ldGFDbGFzcygpLmdldEF0dHJpYnV0ZShvYmosICJ4IikpLmNhbGwoKSA9PSBuZXdYMS5jYWxsKCkpOworCisgICAgICAgIG9iai5zZXRYKG5ld1gyKTsKKyAgICAgICAgb2JqLnggPSBuZXdYMzsKKworICAgICAgICBhc3NlcnRUcnVlKCgoQ2xvc3VyZSkgb2JqLmdldFByb3BlcnR5KCJ4IikpLmNhbGwoKSA9PSBuZXdYMi5jYWxsKCkpOworICAgICAgICBhc3NlcnRUcnVlKCgoQ2xvc3VyZSkgb2JqLmdldE1ldGFDbGFzcygpLmdldEF0dHJpYnV0ZShvYmosICJ4IikpLmNhbGwoKSA9PSBuZXdYMy5jYWxsKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9nbHMvY2gwNi9zMDUvdGVzdENsYXNzZXMvVHQxLmphdmEgYi9ncm9vdnkvc3JjL3Rlc3QvZ2xzL2NoMDYvczA1L3Rlc3RDbGFzc2VzL1R0MS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMDQxNDYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ2xzL2NoMDYvczA1L3Rlc3RDbGFzc2VzL1R0MS5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisqIENvcHlyaWdodCAyMDA1IEpvaG4gRy4gV2lsc29uCisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqCisqLworCitwYWNrYWdlIGdscy5jaDA2LnMwNS50ZXN0Q2xhc3NlczsKKworCisvKioKKyAqIEBhdXRob3IgSm9obiBXaWxzb24KKyAqLworCitwdWJsaWMgY2xhc3MgVHQxIHsKKyAgICBwdWJsaWMgU3RyaW5nIHggPSAiZmllbGQiOworCisgICAgcHVibGljIFN0cmluZyBnZXRYKCkgeworICAgICAgICByZXR1cm4gdGhpcy5wMTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRYKGZpbmFsIFN0cmluZyB4KSB7CisgICAgICAgIHRoaXMucDEgPSB4OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgeCgpIHsKKyAgICAgICAgcmV0dXJuICJtZXRob2QiOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIHAxID0gInByb3BlcnR5IjsKK30KKwpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dscy9jaDA2L3MwNS90ZXN0Q2xhc3Nlcy9UdDFjLmphdmEgYi9ncm9vdnkvc3JjL3Rlc3QvZ2xzL2NoMDYvczA1L3Rlc3RDbGFzc2VzL1R0MWMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2QxYjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dscy9jaDA2L3MwNS90ZXN0Q2xhc3Nlcy9UdDFjLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1IEpvaG4gRy4gV2lsc29uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2UgZ2xzLmNoMDYuczA1LnRlc3RDbGFzc2VzOworCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuQ2xvc3VyZTsKKworLyoqCisgKiBAYXV0aG9yIEpvaG4gV2lsc29uCisgKi8KKworcHVibGljIGNsYXNzIFR0MWMgeworICAgIHB1YmxpYyBDbG9zdXJlIHggPSBuZXcgQ2xvc3VyZShudWxsKSB7CisgICAgICAgIHB1YmxpYyBPYmplY3QgZG9DYWxsKGZpbmFsIE9iamVjdCBwYXJhbXMpIHsKKyAgICAgICAgICAgIHJldHVybiAiZmllbGQiOworICAgICAgICB9CisgICAgfTsKKworICAgIHB1YmxpYyBDbG9zdXJlIGdldFgoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnAxOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFgoZmluYWwgQ2xvc3VyZSB5KSB7CisgICAgICAgIHRoaXMucDEgPSB5OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgeCgpIHsKKyAgICAgICAgcmV0dXJuICJtZXRob2QiOworICAgIH0KKworICAgIHByaXZhdGUgQ2xvc3VyZSBwMSA9IG5ldyBDbG9zdXJlKG51bGwpIHsKKyAgICAgICAgcHVibGljIE9iamVjdCBkb0NhbGwoZmluYWwgT2JqZWN0IHBhcmFtcykgeworICAgICAgICAgICAgcmV0dXJuICJwcm9wZXJ0eSI7CisgICAgICAgIH0KKyAgICB9OworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dscy9jaDA2L3MwNS90ZXN0Q2xhc3Nlcy9UdDFjZ2kuamF2YSBiL2dyb292eS9zcmMvdGVzdC9nbHMvY2gwNi9zMDUvdGVzdENsYXNzZXMvVHQxY2dpLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdkNDI4OAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9nbHMvY2gwNi9zMDUvdGVzdENsYXNzZXMvVHQxY2dpLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1IEpvaG4gRy4gV2lsc29uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2UgZ2xzLmNoMDYuczA1LnRlc3RDbGFzc2VzOworCisKK2ltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlPYmplY3Q7CitpbXBvcnQgZ3Jvb3Z5LmxhbmcuTWV0YUNsYXNzOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5JbnZva2VySGVscGVyOworCisvKioKKyAqIEBhdXRob3IgSm9obiBXaWxzb24KKyAqLworCitwdWJsaWMgY2xhc3MgVHQxY2dpIGV4dGVuZHMgVHQxYyBpbXBsZW1lbnRzIEdyb292eU9iamVjdCB7CisKKyAgICBwcml2YXRlIE1ldGFDbGFzcyBtZXRhQ2xhc3MgPSBJbnZva2VySGVscGVyLmdldE1ldGFDbGFzcyh0aGlzKTsKKworICAgIHB1YmxpYyBNZXRhQ2xhc3MgZ2V0TWV0YUNsYXNzKCkgeworICAgICAgICByZXR1cm4gdGhpcy5tZXRhQ2xhc3M7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShmaW5hbCBTdHJpbmcgcHJvcGVydHkpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubWV0YUNsYXNzLmdldFByb3BlcnR5KHRoaXMsIHByb3BlcnR5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGludm9rZU1ldGhvZChmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgT2JqZWN0IGFyZ3MpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubWV0YUNsYXNzLmludm9rZU1ldGhvZCh0aGlzLCBuYW1lLCBhcmdzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNZXRhQ2xhc3MoZmluYWwgTWV0YUNsYXNzIG1ldGFDbGFzcykgeworICAgICAgICB0aGlzLm1ldGFDbGFzcyA9IG1ldGFDbGFzczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShmaW5hbCBTdHJpbmcgcHJvcGVydHksIGZpbmFsIE9iamVjdCBuZXdWYWx1ZSkgeworICAgICAgICB0aGlzLm1ldGFDbGFzcy5zZXRQcm9wZXJ0eSh0aGlzLCBwcm9wZXJ0eSwgbmV3VmFsdWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9nbHMvY2gwNi9zMDUvdGVzdENsYXNzZXMvVHQxY2dvLmphdmEgYi9ncm9vdnkvc3JjL3Rlc3QvZ2xzL2NoMDYvczA1L3Rlc3RDbGFzc2VzL1R0MWNnby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMTQ5YTUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ2xzL2NoMDYvczA1L3Rlc3RDbGFzc2VzL1R0MWNnby5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNSBKb2huIEcuIFdpbHNvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIGdscy5jaDA2LnMwNS50ZXN0Q2xhc3NlczsKKworCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuQ2xvc3VyZTsKK2ltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlPYmplY3RTdXBwb3J0OworCisvKioKKyAqIEBhdXRob3IgSm9obiBXaWxzb24KKyAqLworCitwdWJsaWMgY2xhc3MgVHQxY2dvIGV4dGVuZHMgR3Jvb3Z5T2JqZWN0U3VwcG9ydCB7CisgICAgcHVibGljIENsb3N1cmUgeCA9IG5ldyBDbG9zdXJlKG51bGwpIHsKKyAgICAgICAgcHVibGljIE9iamVjdCBkb0NhbGwoZmluYWwgT2JqZWN0IHBhcmFtcykgeworICAgICAgICAgICAgcmV0dXJuICJmaWVsZCI7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHVibGljIENsb3N1cmUgZ2V0WCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucDE7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0WChmaW5hbCBDbG9zdXJlIHgpIHsKKyAgICAgICAgdGhpcy5wMSA9IHg7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB4KCkgeworICAgICAgICByZXR1cm4gIm1ldGhvZCI7CisgICAgfQorCisgICAgcHJpdmF0ZSBDbG9zdXJlIHAxID0gbmV3IENsb3N1cmUobnVsbCkgeworICAgICAgICBwdWJsaWMgT2JqZWN0IGRvQ2FsbChmaW5hbCBPYmplY3QgcGFyYW1zKSB7CisgICAgICAgICAgICByZXR1cm4gInByb3BlcnR5IjsKKyAgICAgICAgfQorICAgIH07Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ2xzL2NoMDYvczA1L3Rlc3RDbGFzc2VzL1R0MWdpLmphdmEgYi9ncm9vdnkvc3JjL3Rlc3QvZ2xzL2NoMDYvczA1L3Rlc3RDbGFzc2VzL1R0MWdpLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEyNWYwMAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9nbHMvY2gwNi9zMDUvdGVzdENsYXNzZXMvVHQxZ2kuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IDIwMDUgSm9obiBHLiBXaWxzb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBnbHMuY2gwNi5zMDUudGVzdENsYXNzZXM7CisKKworaW1wb3J0IGdyb292eS5sYW5nLkdyb292eUludGVyY2VwdGFibGU7CitpbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0OworaW1wb3J0IGdyb292eS5sYW5nLk1ldGFDbGFzczsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuSW52b2tlckhlbHBlcjsKKworLyoqCisgKiBAYXV0aG9yIEpvaG4gV2lsc29uCisgKi8KKworcHVibGljIGNsYXNzIFR0MWdpIGV4dGVuZHMgVHQxIGltcGxlbWVudHMgR3Jvb3Z5T2JqZWN0LCBHcm9vdnlJbnRlcmNlcHRhYmxlIHsKKworICAgIHByaXZhdGUgTWV0YUNsYXNzIG1ldGFDbGFzcyA9IEludm9rZXJIZWxwZXIuZ2V0TWV0YUNsYXNzKHRoaXMpOworCisgICAgcHVibGljIE1ldGFDbGFzcyBnZXRNZXRhQ2xhc3MoKSB7CisgICAgICAgIHJldHVybiB0aGlzLm1ldGFDbGFzczsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KGZpbmFsIFN0cmluZyBwcm9wZXJ0eSkgeworICAgICAgICBpZiAoIngiLmVxdWFscyhwcm9wZXJ0eSkpIHsKKyAgICAgICAgICAgIHJldHVybiAiZHluYW1pYyBwcm9wZXJ0eSI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5tZXRhQ2xhc3MuZ2V0UHJvcGVydHkodGhpcywgcHJvcGVydHkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBpbnZva2VNZXRob2QoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIE9iamVjdCBhcmdzKSB7CisgICAgICAgIGlmICgieCIuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gImR5bmFtaWMgbWV0aG9kIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLm1ldGFDbGFzcy5pbnZva2VNZXRob2QodGhpcywgbmFtZSwgYXJncyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNZXRhQ2xhc3MoZmluYWwgTWV0YUNsYXNzIG1ldGFDbGFzcykgeworICAgICAgICB0aGlzLm1ldGFDbGFzcyA9IG1ldGFDbGFzczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShmaW5hbCBTdHJpbmcgcHJvcGVydHksIGZpbmFsIE9iamVjdCBuZXdWYWx1ZSkgeworICAgICAgICB0aGlzLm1ldGFDbGFzcy5zZXRQcm9wZXJ0eSh0aGlzLCBwcm9wZXJ0eSwgbmV3VmFsdWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9nbHMvY2gwNi9zMDUvdGVzdENsYXNzZXMvVHQxZ28uamF2YSBiL2dyb292eS9zcmMvdGVzdC9nbHMvY2gwNi9zMDUvdGVzdENsYXNzZXMvVHQxZ28uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDY0M2UwCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dscy9jaDA2L3MwNS90ZXN0Q2xhc3Nlcy9UdDFnby5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNSBKb2huIEcuIFdpbHNvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIGdscy5jaDA2LnMwNS50ZXN0Q2xhc3NlczsKKworCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0U3VwcG9ydDsKKworLyoqCisgKiBAYXV0aG9yIEpvaG4gV2lsc29uCisgKi8KKworcHVibGljIGNsYXNzIFR0MWdvIGV4dGVuZHMgR3Jvb3Z5T2JqZWN0U3VwcG9ydCB7CisgICAgcHVibGljIFN0cmluZyB4ID0gImZpZWxkIjsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0WCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucDE7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0WChmaW5hbCBTdHJpbmcgeCkgeworICAgICAgICB0aGlzLnAxID0geDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHgoKSB7CisgICAgICAgIHJldHVybiAibWV0aG9kIjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHAxID0gInByb3BlcnR5IjsKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9nbHMvY2gwOC9zMDQvRm9ybWFsUGFyYW1ldGVyVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ2xzL2NoMDgvczA0L0Zvcm1hbFBhcmFtZXRlclRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MDNiOGYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ2xzL2NoMDgvczA0L0Zvcm1hbFBhcmFtZXRlclRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsNzQgQEAKK3BhY2thZ2UgZ2xzLmNoMDguczA0CisKK2ltcG9ydCBnbHMuc2NvcGUuQ29tcGlsYWJsZVRlc3RTdXBwb3J0CisKKy8qKgorKiBhIGZvcm1hbCBwYXJhbWV0ZXIgaXMgYSBwYXJhbWV0ZXIgdG8gYSBtZXRob2QsIHRoaXMgcGFyYW1ldGVyIG11c3Qgd29yaworKiBhcyBhbnkgbG9jYWwgdmFyaWFibGUuIEJ1dCB3ZSBnZW5lcmFsbHkgZG8gYm94aW5nIG9uIGxvY2FsIHZhcmlhYmxlcywgd2hpY2gKKyogaXMgbm90IHBvc3NpYmxlIGZvciBmb3JtYWwgcGFyYW1ldGVycy4gVGhlIHR5cGUgaXMgZ2l2dmVuIHRocm91Z2ggdGhlCisqIG1ldGhvZCBzaWduYXR1cmUuCisqLworY2xhc3MgRm9ybWFsUGFyYW1ldGVyVGVzdCBleHRlbmRzIENvbXBpbGFibGVUZXN0U3VwcG9ydHsKKyAgICAKKyAgdm9pZCB0ZXN0UHJpbWl0aXZlUGFyYW1ldGVyQXNzaWdubWVudCgpeworICAgIC8vIHRlc3QgaW50IGFuZCBsb25nIGFzIHRoZXkgaGF2ZSBkaWZmZXJlbnQgbGVuZ3RocyBvbiBpbiB0aGUgYnl0ZWNvZGUKKyAgICBhc3NlcnQgaW50TWV0aG9kKDFpLDJpKSA9PSAyaQorICAgIGFzc2VydCBsb25nTWV0aG9kKDFsLDJsKSA9PSAybAorICAgIAorICB9CisgIAorICBpbnQgaW50TWV0aG9kKGludCBpLCBpbnQgaikgeworICAgIGk9agorICAgIHJldHVybiBpCisgIH0KKyAgCisgIGxvbmcgbG9uZ01ldGhvZChsb25nIGksIGxvbmcgaikgeworICAgIGk9agorICAgIHJldHVybiBpCisgIH0KKyAgCisgIC8qKgorICogQ2hhcHRlciA4OgkJQ2xhc3NlcworICogU2VjdGlvbiA4LjQ6CQlNZXRob2QgRGVjbGFyYXRpb25zCisgKiBBdXRob3I6CQlLZW4gQmFyY2xheQorICoKKyAqIEZpbGU6CQlhcml0eS5tZXRob2QuZGVjbGFyYXRpb24uY2xhc3Nlcy44LjQuZ3Jvb3Z5CisgKgorICogQSBjbGFzcyBkZWNsYXJhdGlvbiBtYXkgaW5jbHVkZSBhbnkgbnVtYmVyIG9mIG1ldGhvZCBkZWNsYXJhdGlvbnMgaW5jbHVkaW5nCisgKiAgIGFic3RyYWN0IG1ldGhvZCBkZWNsYXJhdGlvbnMuCisgKgorICogQSBtZXRob2QgaXMgZ2l2ZW4gYSBuYW1lIGFuZCBhbiBvcHRpb25hbCBsaXN0IG9mIGZvcm1hbCBwYXJhbWV0ZXIgZGVjbGFyYXRpb25zCisgKiAgIGVuY2xvc2VkIGluIHBhcmVudGhlc2VzICggYW5kICkuIEEgcGFyYW1ldGVyIGRlY2xhcmF0aW9uIGF0IGl0cyBzaW1wbGVzdCBpcworICogICBzaW1wbHkgYSBwYXJhbWV0ZXIgbmFtZS4gSXQgbWF5IGJlIHByZWZpeGVkIHdpdGggYSBjb21iaW5hdGlvbiBvZiBvcHRpb25hbAorICogICBwYXJhbWV0ZXIgbW9kaWZpZXJzIChkZWYgb3IgZmluYWwpLCBhIHR5cGUsIG9yIGEgdHlwZSBmb2xsb3dlZCBieSB0aGUgdmFyYXJncworICogICBzeW1ib2wgKC4uLikuIFR3byBmb3JtYWwgcGFyYW1ldGVycyB3aXRoIHRoZSBzYW1lIG5hbWUgaXMgZGlzYWxsb3dlZC4KKyAqCisgKiBBIGZvcm1hbCBwYXJhbWV0ZXIgbWF5IGJlIG9wdGlvbmFsbHkgaW5pdGlhbGl6ZWQgd2l0aCBhbiBleHByZXNzaW9uLCByZWZlcnJlZAorICogICB0byBhcyBhIGRlZmF1bHQgcGFyYW1ldGVyLiBJZiB0aGUgbnVtYmVyIG9mIGFjdHVhbCBwYXJhbWV0ZXJzIGlzIGZld2VyIHRoYW4KKyAqICAgdGhlIG51bWJlciBvZiBmb3JtYWwgcGFyYW1ldGVycywgdGhlbiBlYWNoIGFjdHVhbCBpcyB1c2VkIHRvIGluaXRpYWxpemUsIGluCisgKiAgIG9yZGVyLCB0aGUgbm9uLWRlZmF1bHQgZm9ybWFsIHBhcmFtZXRlcnMuIFdoZW4gYWxsIHRoZSBhY3R1YWwgcGFyYW1ldGVycyBhcmUKKyAqICAgdXNlZCBpbiB0aGlzIG1hbm5lciwgYWxsIHN1YnNlcXVlbnQgZm9ybWFsIHBhcmFtZXRlcnMgcmVxdWlyZSBkZWZhdWx0IHZhbHVlcy4KKyAqCisgKiBJZiB0aGUgbGFzdCBmb3JtYWwgcGFyYW1ldGVyIGlzIGEgdmFyaWFibGUgYXJpdHkgcGFyYW1ldGVyLCBpdCBpcyBjb25zaWRlcmVkCisgKiAgIHRvIGRlZmluZSBhIG1ldGhvZCB0aGF0IGlzIHJlZmVycmVkIHRvIGFzIGEgdmFyaWFibGUgYXJpdHkgbWV0aG9kLiBJbnZvY2F0aW9ucworICogICBvZiBhIHZhcmlhYmxlIGFyaXR5IG1ldGhvZCBtYXkgY29udGFpbiBtb3JlIGFjdHVhbCBhcmd1bWVudCBleHByZXNzaW9ucyB0aGFuCisgKiAgIGZvcm1hbCBwYXJhbWV0ZXJzLiBBbGwgdGhlIGFjdHVhbCBhcmd1bWVudCBleHByZXNzaW9ucyB0aGF0IGRvIG5vdCBjb3JyZXNwb25kCisgKiAgIHRvIHRoZSBmb3JtYWwgcGFyYW1ldGVycyBwcmVjZWRpbmcgdGhlIHZhcmlhYmxlIGFyaXR5IHBhcmFtZXRlciB3aWxsIGJlIGV2YWx1YXRlZAorICogICBhbmQgdGhlIHJlc3VsdHMgc3RvcmVkIGludG8gYW4gYXJyYXkgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgbWV0aG9kIGludm9jYXRpb24uCisgKi8KKyAKKyBkZWYgZHVtcChhZ2UsIFN0cmluZy4uLiBuYW1lcykgeworICAgbmFtZXMuY29sbGVjdCB7IG5hbWUgLT4KKyAgICAgICAibmFtZTogJG5hbWUgYWdlOiAkYWdlIgorICAgIH0KKyAgfQorICAKKyAgdm9pZCB0ZXN0VmFyaWFibGVBcml0eSgpeworICAgIGRlZiBsMSA9IGR1bXAoMjIsICdLZW4nLCAnQmFyY2xheScpCisgICAgZGVmIGwyID0gWyJuYW1lOiBLZW4gYWdlOiAyMiIsICJuYW1lOiBCYXJjbGF5IGFnZTogMjIiXQorICAgIGwxLmVhY2hXaXRoSW5kZXggeyBpdCwgaSAtPgorICAgICAgYXNzZXJ0IGl0ID09IGwyW2ldCisgICAgfQorIH0KKyAgCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dscy9jaDA4L3MwNC9SZXBldGl0aXZlTWV0aG9kVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ2xzL2NoMDgvczA0L1JlcGV0aXRpdmVNZXRob2RUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmMzZjg2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dscy9jaDA4L3MwNC9SZXBldGl0aXZlTWV0aG9kVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwxNiBAQAorcGFja2FnZSBnbHMuY2gwOC5zMDQKKworaW1wb3J0IGdscy5zY29wZS5Db21waWxhYmxlVGVzdFN1cHBvcnQKKworY2xhc3MgUmVwZXRpdGl2ZU1ldGhvZFRlc3QgZXh0ZW5kcyBDb21waWxhYmxlVGVzdFN1cHBvcnR7CisKKyAgdm9pZCB0ZXN0UmVwZXRpdGl2ZU1ldGhvZCgpIHsKKyAgICBkZWYgdGV4dCA9IiIiCisJCWNsYXNzIEEgIHsKKwkJCXZvaWQgZm9vKCkge30KKwkJCXZvaWQgZm9vKCkge30KKwkJfQorCSIiIgorCXNob3VsZE5vdENvbXBpbGUodGV4dCkKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9nbHMvZW51bXMvdm01L0VudW1UZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9nbHMvZW51bXMvdm01L0VudW1UZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTJjZDlkCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dscy9lbnVtcy92bTUvRW51bVRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTUgQEAKK3BhY2thZ2UgZ2xzLmVudW1zLnZtNQorCitjbGFzcyBFbnVtVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKyAgICB2b2lkIHRlc3RWYWx1ZXMoKSB7CisgICAgICAgIGFzc2VydCBVc0NvaW4udmFsdWVzKCkuc2l6ZSgpID09IDQKKyAgICAgICAgYXNzZXJ0IFVzQ29pbi52YWx1ZXMoKS50b0xpc3QoKS5zdW17IGl0LnZhbHVlIH0gPT0gNDEKKyAgICB9Cit9CisKK2VudW0gVXNDb2luIHsKKyAgICBwZW5ueSgxKSwgbmlja2VsKDUpLCBkaW1lKDEwKSwgcXVhcnRlcigyNSkKKyAgICBVc0NvaW4oaW50IHZhbHVlKSB7IHRoaXMudmFsdWUgPSB2YWx1ZSB9CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWUKKyAgICBpbnQgZ2V0VmFsdWUoKSB7IHZhbHVlIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9nbHMvZ2VuZXJpY3Mvdm01L0dlbmVyaWNzVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ2xzL2dlbmVyaWNzL3ZtNS9HZW5lcmljc1Rlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2OTJlMTgKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ2xzL2dlbmVyaWNzL3ZtNS9HZW5lcmljc1Rlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMjMyIEBACitwYWNrYWdlIGdscy5nZW5lcmljcy52bTUKKworY2xhc3MgR2VuZXJpY3NUZXN0IGV4dGVuZHMgR2VuZXJpY3NUZXN0QmFzZSB7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NXaXRob3V0UGFyYW1ldGVyRXh0ZW5kc0NsYXNzV2l0aEZpeGVkUGFyYW1ldGVyKCkgeworICAgICAgICBjcmVhdGVDbGFzc0luZm8gIiIiCisgICAgICAgICAgICBjbGFzcyBCIGV4dGVuZHMgQXJyYXlMaXN0PExvbmc+IHt9CisgICAgICAgICIiIgorICAgICAgICBhc3NlcnQgc2lnbmF0dXJlcz09WworICAgICAgICAgICAgImNsYXNzIiA6ICJMamF2YS91dGlsL0FycmF5TGlzdDxMamF2YS9sYW5nL0xvbmc7PjtMZ3Jvb3Z5L2xhbmcvR3Jvb3Z5T2JqZWN0OyIsCisgICAgICAgICAgICBdCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlSW1wbGVtZW50c1dpdGhQYXJhbWV0ZXIoKSB7CisgICAgICAgIGNyZWF0ZUNsYXNzSW5mbyAiIiIKKyAgICAgICAgICAgIGFic3RyYWN0IGNsYXNzIEI8VD4gaW1wbGVtZW50cyBSdW5uYWJsZSxMaXN0PFQ+IHt9CisgICAgICAgICIiIgorICAgICAgICBhc3NlcnQgc2lnbmF0dXJlcyA9PSBbImNsYXNzIjoiPFQ6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcvUnVubmFibGU7TGphdmEvdXRpbC9MaXN0PFRUOz47TGdyb292eS9sYW5nL0dyb292eU9iamVjdDsiXQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbXBsZW1lbnRzV2l0aFBhcmFtZXRlcigpIHsKKyAgICAgICAgY3JlYXRlQ2xhc3NJbmZvICIiIgorICAgICAgICAgICAgYWJzdHJhY3QgY2xhc3MgQjxUPiBpbXBsZW1lbnRzIExpc3Q8VD4ge30KKyAgICAgICAgIiIiCisgICAgICAgIGFzc2VydCBzaWduYXR1cmVzPT1bImNsYXNzIjoiPFQ6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL3V0aWwvTGlzdDxUVDs+O0xncm9vdnkvbGFuZy9Hcm9vdnlPYmplY3Q7Il0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXh0ZW5kc1dpdGhQYXJhbWV0ZXIoKSB7CisJICAgIGNyZWF0ZUNsYXNzSW5mbyAiIiIKKwkgICAgCWNsYXNzIEI8VD4gZXh0ZW5kcyBBcnJheUxpc3Q8VD4ge30KKwkgICAgIiIiCisJICAgIGFzc2VydCBzaWduYXR1cmVzPT1bImNsYXNzIjoiPFQ6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL3V0aWwvQXJyYXlMaXN0PFRUOz47TGdyb292eS9sYW5nL0dyb292eU9iamVjdDsiXQorCX0KKworCXB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRFeHRlbmRzV2l0aFBhcmFtZXRlcigpIHsKKwkgICAgY3JlYXRlQ2xhc3NJbmZvICIiIgorCSAgICAJY2xhc3MgQjxUPiBleHRlbmRzIEhhc2hNYXA8VCxMaXN0PFQ+PiB7fQorCSAgICAiIiIKKwkgICAgYXNzZXJ0IHNpZ25hdHVyZXMgPT0gWyJjbGFzcyI6IjxUOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS91dGlsL0hhc2hNYXA8VFQ7TGphdmEvdXRpbC9MaXN0PFRUOz47PjtMZ3Jvb3Z5L2xhbmcvR3Jvb3Z5T2JqZWN0OyJdCisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RCb3VuZEludGVyZmFjZSgpIHsKKwkgICAgY3JlYXRlQ2xhc3NJbmZvICIiIgorCSAgICAJY2xhc3MgQjxUIGV4dGVuZHMgTGlzdD4ge30KKwkgICAgIiIiCisJICAgIGFzc2VydCBzaWduYXR1cmVzID09IFsiY2xhc3MiOiI8VDo6TGphdmEvdXRpbC9MaXN0Oz5MamF2YS9sYW5nL09iamVjdDtMZ3Jvb3Z5L2xhbmcvR3Jvb3Z5T2JqZWN0OyJdCisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRSZXVzZU9mUGFyYW1ldGVyKCkgeworCSAgICBjcmVhdGVDbGFzc0luZm8gIiIiCisJICAgIAljbGFzcyBCPFksVCBleHRlbmRzIE1hcDxTdHJpbmcsTWFwPFksSW50ZWdlcj4+PiB7fQorCSAgICAiIiIKKwkgICAgYXNzZXJ0IHNpZ25hdHVyZXMgPT0gWyJjbGFzcyI6IjxZOkxqYXZhL2xhbmcvT2JqZWN0O1Q6OkxqYXZhL3V0aWwvTWFwPExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL3V0aWwvTWFwPFRZO0xqYXZhL2xhbmcvSW50ZWdlcjs+Oz47PkxqYXZhL2xhbmcvT2JqZWN0O0xncm9vdnkvbGFuZy9Hcm9vdnlPYmplY3Q7Il0KKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEZpZWxkV2l0aFBhcmFtZXRlcigpIHsKKwkgICAgY3JlYXRlQ2xhc3NJbmZvICIiIgorCSAgICAJY2xhc3MgQiB7IHB1YmxpYyBDb2xsZWN0aW9uPEludGVnZXI+IGJvb2tzIH0KKwkgICAgIiIiCisJICAgIGFzc2VydCBzaWduYXR1cmVzID09IFtib29rcyA6ICJMamF2YS91dGlsL0NvbGxlY3Rpb248TGphdmEvbGFuZy9JbnRlZ2VyOz47Il0KKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEZpZWxkUmV1c2VkUGFyYW1ldGVyKCkgeworCSAgICBjcmVhdGVDbGFzc0luZm8gIiIiCisJICAgIAljbGFzcyBCPFQ+IHsgcHVibGljIENvbGxlY3Rpb248VD4gY29sbGVjdGlvbiB9CisJICAgICIiIgorCSAgICBhc3NlcnQgc2lnbmF0dXJlcyA9PSBbImNsYXNzIiAgICA6ICI8VDpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvbGFuZy9PYmplY3Q7TGdyb292eS9sYW5nL0dyb292eU9iamVjdDsiLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbiA6ICJMamF2YS91dGlsL0NvbGxlY3Rpb248VFQ7PjsiXQorCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0UGFyYW1ldGVyQXNSZXR1cm5UeXBlKCkgeworCSAgICBjcmVhdGVDbGFzc0luZm8gIiIiCisJICAgIAljbGFzcyBCIHsKKwkgICAgCQlzdGF0aWMgPFQ+IFQgZm9vKCkge3JldHVybiBudWxsfQorCQkJfQorCSAgICAiIiIKKwkgICAgYXNzZXJ0IHNpZ25hdHVyZXMgPT0gWyJmb28oKUxqYXZhL2xhbmcvT2JqZWN0OyI6IjxUOkxqYXZhL2xhbmcvT2JqZWN0Oz4oKVRUOyJdCisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RQYXJhbWV0ZXJBc1JldHVyblR5cGVBbmRQYXJhbWV0ZXIoKSB7CisJICAgIGNyZWF0ZUNsYXNzSW5mbyAiIiIKKwkgICAgCWNsYXNzIEIgeworCSAgICAJCXN0YXRpYyA8VD4gVCBmb28oVCB0KSB7cmV0dXJuIG51bGx9CisJCQl9CisJICAgICIiIgorCSAgICBhc3NlcnQgc2lnbmF0dXJlcyA9PSBbImZvbyhMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7IjoiPFQ6TGphdmEvbGFuZy9PYmplY3Q7PihUVDspVFQ7Il0KKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFBhcmFtZXRlckFzTWV0aG9kUGFyYW1ldGVyKCkgeworCSAgICBjcmVhdGVDbGFzc0luZm8gIiIiCisJCQljbGFzcyBCPFQ+IHsKKwkgICAgCQl2b2lkIGZvbyhUIHQpe30KKwkJCX0KKwkgICAgIiIiCisJICAgIGFzc2VydCBzaWduYXR1cmVzID09IFsiY2xhc3MiIDogIjxUOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS9sYW5nL09iamVjdDtMZ3Jvb3Z5L2xhbmcvR3Jvb3Z5T2JqZWN0OyIsIAorCSAgICAgICAgCQkJCSAgImZvbyhMamF2YS9sYW5nL09iamVjdDspViI6IihUVDspViJdCisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RQYXJhbWV0ZXJBc05lc3RlZE1ldGhvZFBhcmFtZXRlcigpIHsKKwkgICAgY3JlYXRlQ2xhc3NJbmZvICIiIgorCQkJY2xhc3MgQjxUPiB7CisJICAgIAkJdm9pZCBmb28oTGlzdDxUPiB0KXt9CisJCQl9CisJICAgICIiIgorCSAgICBhc3NlcnQgc2lnbmF0dXJlcyA9PSBbImNsYXNzIiA6ICI8VDpMamF2YS9sYW5nL09iamVjdDs+TGphdmEvbGFuZy9PYmplY3Q7TGdyb292eS9sYW5nL0dyb292eU9iamVjdDsiLCAKKwkgICAgICAgIAkJCQkgICJmb28oTGphdmEvdXRpbC9MaXN0OylWIjoiKExqYXZhL3V0aWwvTGlzdDxUVDs+OylWIl0KKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFBhcmFtZXRlckFzTmVzdGVkTWV0aG9kUGFyYW1ldGVyUmV0dXJuaW5nSW50ZXJmYWNlKCkgeworCSAgICBjcmVhdGVDbGFzc0luZm8gIiIiCisJCQljbGFzcyBCPFQ+IHsKKwkgICAgCQlDbG9uZWFibGUgZm9vKExpc3Q8VD4gdCl7fQorCQkJfQorCSAgICAiIiIKKwkgICAgYXNzZXJ0IHNpZ25hdHVyZXMgPT0gWyJjbGFzcyIgOiAiPFQ6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL2xhbmcvT2JqZWN0O0xncm9vdnkvbGFuZy9Hcm9vdnlPYmplY3Q7IiwgCisJICAgICAgICAJCQkJICAiZm9vKExqYXZhL3V0aWwvTGlzdDspTGphdmEvbGFuZy9DbG9uZWFibGU7IjoiKExqYXZhL3V0aWwvTGlzdDxUVDs+OylMamF2YS9sYW5nL0Nsb25lYWJsZTsiXQorCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVCb3VuZHMoKSB7CisJICAgIGNyZWF0ZUNsYXNzSW5mbyAiIiIKKwkJCWNsYXNzIFBhaXI8CUEgZXh0ZW5kcyBDb21wYXJhYmxlPEE+ICYgQ2xvbmVhYmxlICwgCisgICAgCQkJCQlCIGV4dGVuZHMgQ2xvbmVhYmxlICYgQ29tcGFyYWJsZTxCPiA+IAorCQkJeworCSAgICAJCUEgZm9vKCl7fQorCQkJCUIgYmFyKCl7fQorCQkJfQorCSAgICAiIiIKKwkgICAgYXNzZXJ0IHNpZ25hdHVyZXMgPT0gCisJICAgICAgICBbImNsYXNzIiA6ICI8QTo6TGphdmEvbGFuZy9Db21wYXJhYmxlPFRBOz47OkxqYXZhL2xhbmcvQ2xvbmVhYmxlO0I6OkxqYXZhL2xhbmcvQ2xvbmVhYmxlOzpMamF2YS9sYW5nL0NvbXBhcmFibGU8VEI7Pjs+TGphdmEvbGFuZy9PYmplY3Q7TGdyb292eS9sYW5nL0dyb292eU9iamVjdDsiLAorCSAgICAJICJmb28oKUxqYXZhL2xhbmcvQ29tcGFyYWJsZTsiIDogIigpVEE7IiwKKwkgICAgCSAiYmFyKClMamF2YS9sYW5nL0Nsb25lYWJsZTsiICA6ICIoKVRCOyJdCisJfQorCisJcHVibGljIHZvaWQgdGVzdFdpbGRDYXJkKCkgeworCSAgICBjcmVhdGVDbGFzc0luZm8gIiIiCisJCQljbGFzcyBCIHsKKwkJCQlwcml2YXRlIENvbGxlY3Rpb248Pz4gZjEgCisJCQkJcHJpdmF0ZSBMaXN0PD8gZXh0ZW5kcyBOdW1iZXI+IGYyIAorCQkJCXByaXZhdGUgQ29tcGFyYXRvcjw/IHN1cGVyIFN0cmluZz4gZjMgCisJCQkJcHJpdmF0ZSBNYXA8U3RyaW5nLD8+IGY0ICAKKwkJCX0KKwkgICAgIiIiCisJICAgIGFzc2VydCBzaWduYXR1cmVzPT1bCisJICAgIAlmMSA6ICJMamF2YS91dGlsL0NvbGxlY3Rpb248Kj47IiwKKwkgICAgCWYyIDogIkxqYXZhL3V0aWwvTGlzdDwrTGphdmEvbGFuZy9OdW1iZXI7PjsiLAorCSAgICAJZjMgOiAiTGphdmEvdXRpbC9Db21wYXJhdG9yPC1MamF2YS9sYW5nL1N0cmluZzs+OyIsCisJCQlmNCA6ICJMamF2YS91dGlsL01hcDxMamF2YS9sYW5nL1N0cmluZzsqPjsiICAgCisJICAgIAldCisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RQYXJhbWV0ZXJBc1BhcmFtZXRlckZvclJldHVyblR5cGVBbmRGaWVsZENsYXNzKCkgeworCSAgICBjcmVhdGVDbGFzc0luZm8gIiIiCisJCSAgIAlwdWJsaWMgY2xhc3MgQjxUPiB7CisgICAJCQkJcHJpdmF0ZSBUIG93bmVyOworICAgCQkJCXB1YmxpYyBDbGFzczxUPiBnZXRPd25lckNsYXNzKCl7fQorICAgCisJCQl9IAorCSAgICAiIiIKKwkgICAgYXNzZXJ0IHNpZ25hdHVyZXM9PVsKKwkJCSJjbGFzcyIgOiAiPFQ6TGphdmEvbGFuZy9PYmplY3Q7PkxqYXZhL2xhbmcvT2JqZWN0O0xncm9vdnkvbGFuZy9Hcm9vdnlPYmplY3Q7IiwKKwkJCSJvd25lciIgOiAiVFQ7IiwKKwkJCSJnZXRPd25lckNsYXNzKClMamF2YS9sYW5nL0NsYXNzOyIgOiAiKClMamF2YS9sYW5nL0NsYXNzPFRUOz47IgorCQkJXQorCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0SW50ZXJmYWNlV2l0aFBhcmFtZXRlcigpIHsKKwkgICAgY3JlYXRlQ2xhc3NJbmZvICIiIgorCSAgICAJaW50ZXJmYWNlIEI8VD4ge30KKwkgICAgIiIiCisJICAgIGFzc2VydCBzaWduYXR1cmVzID09IFsiY2xhc3MiICAgIDogIjxUOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS9sYW5nL09iamVjdDsiXQorCX0JCisJCisJCisJcHVibGljIHZvaWQgdGVzdEludmFsaWRQYXJhbWV0ZXJVc2FnZSgpIHsKKwkgICAgc2hvdWxkTm90Q29tcGlsZSAiIiIKKwkgICAgCWFic3RyYWN0IGNsYXNzIEI8VD4gaW1wbGVtZW50cyBNYXA8VD57fQorCSAgICAiIiIKKwkgICAgc2hvdWxkTm90Q29tcGlsZSAiIiIKKwkgICAgICAgIGNsYXNzIEE8VCxWPiBleHRlbmRzIEFycmF5TGlzdDxULFY+e30KKyAgICAgICAgIiIiIAorICAgICAgICBzaG91bGROb3RDb21waWxlICIiIgorCSAgICAgICAgY2xhc3MgQTxUIGV4dGVuZHMgTnVtYmVyPiB7fQorCSAgICAgICAgY2xhc3MgQjxUPiBleHRlbmRzIEE8VD57fQorICAgICAgICAiIiIKKwkgICAgc2hvdWxkTm90Q29tcGlsZSAiIiIKKwkgICAgICAgIGNsYXNzIEI8VD4gZXh0ZW5kcyBBcnJheUxpc3Q8Pz57fQorICAgICAgICAiIiIgCisJfQorCQorCXZvaWQgdGVzdENvdmFyaWFudFJldHVybigpIHsKKyAgICAgICAgc2hvdWxkTm90Q29tcGlsZSAiIiIKKyAgICAgICAgICBjbGFzcyBBPFQ+IHsKKyAgICAgICAgICAgICAgVCBmb28oVCB0KSB7MX0KKyAgICAgICAgICAgfQorCisgICAgICAgICAgY2xhc3MgQiBleHRlbmRzIEE8TG9uZz57CisgICAgICAgICAgICAgIFN0cmluZyBmb28oTG9uZyBsKXsiMiJ9CisgICAgICAgICAgfQorICAgICAgICAiIiIKKworICAgICAgICBhc3NlcnRTY3JpcHQgIiIiCisgICAgICAgICAgY2xhc3MgQTxUPiB7CisgICAgICAgICAgICAgIFQgZm9vKFQgdCkgezF9CisgICAgICAgICAgIH0KKworICAgICAgICAgIGNsYXNzIEIgZXh0ZW5kcyBBPExvbmc+eworICAgICAgICAgICAgICBMb25nIGZvbyhMb25nIGwpezJ9CisgICAgICAgICAgfQorICAgICAgICAgIGRlZiBiID0gbmV3IEIoKTsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgYi5mb28obmV3IE9iamVjdCgpKQorICAgICAgICAgICAgYXNzZXJ0IGZhbHNlCisgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGNjZSkgeworICAgICAgICAgICAgYXNzZXJ0IHRydWUKKyAgICAgICAgICB9CisgICAgICAgICAgYXNzZXJ0IGIuZm9vKChMb25nKSAxKSA9PSAyCisgICAgICAgICIiIgorCX0JCisJCisJdm9pZCB0ZXN0Q292YXJpYW50UmV0dXJuV2l0aEludGVyZmFjZSgpIHsKKwkgIGFzc2VydFNjcmlwdCAiIiIKKwkgICAgaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LioKKworICAgICAgICBjbGFzcyBDYWxsYWJsZVRhc2sgaW1wbGVtZW50cyBDYWxsYWJsZTxTdHJpbmc+IHsKKyAgICAgICAgICBwdWJsaWMgU3RyaW5nIGNhbGwoKSB7ICJ4IiB9CisgICAgICAgIH0gCisgICAgICAgIAorICAgICAgICBkZWYgdGFzayA9IG5ldyBDYWxsYWJsZVRhc2soKQorICAgICAgICBhc3NlcnQgdGFzay5jYWxsKCkgPT0gIngiCisgICAgICAiIiIgIAorCX0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9nbHMvZ2VuZXJpY3Mvdm01L0dlbmVyaWNzVGVzdEJhc2UuamF2YSBiL2dyb292eS9zcmMvdGVzdC9nbHMvZ2VuZXJpY3Mvdm01L0dlbmVyaWNzVGVzdEJhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2JjODI5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dscy9nZW5lcmljcy92bTUvR2VuZXJpY3NUZXN0QmFzZS5qYXZhCkBAIC0wLDAgKzEsODkgQEAKK3BhY2thZ2UgZ2xzLmdlbmVyaWNzLnZtNTsNCisNCisNCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQoraW1wb3J0IGphdmEudXRpbC5NYXA7DQorDQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LkNsYXNzTm9kZTsNCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLkNvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuQ29tcGlsYXRpb25Vbml0Ow0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuU291cmNlVW5pdDsNCitpbXBvcnQgb3JnLm9iamVjdHdlYi5hc20uQ2xhc3NBZGFwdGVyOw0KK2ltcG9ydCBvcmcub2JqZWN0d2ViLmFzbS5DbGFzc1JlYWRlcjsNCitpbXBvcnQgb3JnLm9iamVjdHdlYi5hc20uQ2xhc3NWaXNpdG9yOw0KK2ltcG9ydCBvcmcub2JqZWN0d2ViLmFzbS5GaWVsZFZpc2l0b3I7DQoraW1wb3J0IG9yZy5vYmplY3R3ZWIuYXNtLk1ldGhvZFZpc2l0b3I7DQorDQoraW1wb3J0IGdyb292eS5sYW5nLkdyb292eUNsYXNzTG9hZGVyOw0KK2ltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlDbGFzc0xvYWRlci5Jbm5lckxvYWRlcjsNCitpbXBvcnQgZ3Jvb3Z5LnV0aWwuR3Jvb3Z5VGVzdENhc2U7DQorDQorDQorcHVibGljIGNsYXNzIEdlbmVyaWNzVGVzdEJhc2UgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7DQorICAgIE15TG9hZGVyIGxvYWRlcjsNCisgICAgSGFzaE1hcCBzaWduYXR1cmVzID0gbmV3IEhhc2hNYXAoKTsNCisgICAgDQorICAgIHByaXZhdGUgY2xhc3MgTXlMb2FkZXIgZXh0ZW5kcyBHcm9vdnlDbGFzc0xvYWRlcnsNCisgICAgICAgIHB1YmxpYyBNeUxvYWRlcihDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgew0KKyAgICAgICAgICAgIHN1cGVyKGNsYXNzTG9hZGVyKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHByb3RlY3RlZCBDbGFzc0NvbGxlY3RvciBjcmVhdGVDb2xsZWN0b3IoQ29tcGlsYXRpb25Vbml0IHVuaXQsU291cmNlVW5pdCBzdSkgew0KKyAgICAgICAgICAgIHJldHVybiBuZXcgTXlDb2xsZWN0b3IobmV3IElubmVyTG9hZGVyKHRoaXMpLCB1bml0LCBzdSk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcHJpdmF0ZSBjbGFzcyBNeUNvbGxlY3RvciBleHRlbmRzIEdyb292eUNsYXNzTG9hZGVyLkNsYXNzQ29sbGVjdG9yew0KKw0KKyAgICAgICAgcHVibGljIE15Q29sbGVjdG9yKElubmVyTG9hZGVyIG15TG9hZGVyLCBDb21waWxhdGlvblVuaXQgdW5pdCwgU291cmNlVW5pdCBzdSkgew0KKyAgICAgICAgICAgc3VwZXIobXlMb2FkZXIsdW5pdCxzdSk7DQorICAgICAgICB9DQorICAgICAgICBwcm90ZWN0ZWQgQ2xhc3MgY3JlYXRlQ2xhc3MoYnl0ZVtdIGNvZGUsIENsYXNzTm9kZSBjbGFzc05vZGUpIHsNCisgICAgICAgICAgICBDbGFzc1JlYWRlciBjciA9IG5ldyBDbGFzc1JlYWRlcihjb2RlKTsNCisgICAgICAgICAgICBHZW5lcmljc1Rlc3RlciBjbGFzc1Zpc2l0b3IgPSBuZXcgR2VuZXJpY3NUZXN0ZXIobmV3IG9yZy5vYmplY3R3ZWIuYXNtLnRyZWUuQ2xhc3NOb2RlKCkpOw0KKyAgICAgICAgICAgIGNyLmFjY2VwdChjbGFzc1Zpc2l0b3IsIHRydWUpOw0KKyAgICAgICAgICAgIHJldHVybiBzdXBlci5jcmVhdGVDbGFzcyhjb2RlLGNsYXNzTm9kZSk7DQorICAgICAgICB9ICAgICAgICANCisgICAgfQ0KKyAgICBwcml2YXRlIGNsYXNzIEdlbmVyaWNzVGVzdGVyICBleHRlbmRzIENsYXNzQWRhcHRlciB7DQorICAgICAgICBwdWJsaWMgR2VuZXJpY3NUZXN0ZXIoQ2xhc3NWaXNpdG9yIGN2KSB7DQorICAgICAgICAgICAgc3VwZXIoY3YpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXQoaW50IHZlcnNpb24sIGludCBhY2Nlc3MsIFN0cmluZyBuYW1lLA0KKyAgICAgICAgICAgICAgICBTdHJpbmcgc2lnbmF0dXJlLCBTdHJpbmcgc3VwZXJOYW1lLCBTdHJpbmdbXSBpbnRlcmZhY2VzKSB7DQorICAgICAgICAgICAgaWYgKHNpZ25hdHVyZSE9bnVsbCkgc2lnbmF0dXJlcy5wdXQoImNsYXNzIiwgc2lnbmF0dXJlKTsNCisgICAgICAgIH0NCisgICAgICAgIHB1YmxpYyBGaWVsZFZpc2l0b3IgdmlzaXRGaWVsZChpbnQgYWNjZXNzLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2MsDQorICAgICAgICAgICAgICAgIFN0cmluZyBzaWduYXR1cmUsIE9iamVjdCB2YWx1ZSkgew0KKyAgICAgICAgICAgIGlmIChzaWduYXR1cmUhPW51bGwpIHNpZ25hdHVyZXMucHV0KG5hbWUsc2lnbmF0dXJlKTsNCisgICAgICAgICAgICByZXR1cm4gc3VwZXIudmlzaXRGaWVsZChhY2Nlc3MsIG5hbWUsIGRlc2MsIHNpZ25hdHVyZSwgdmFsdWUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcHVibGljIE1ldGhvZFZpc2l0b3IgdmlzaXRNZXRob2QoaW50IGFjY2VzcywgU3RyaW5nIG5hbWUsIFN0cmluZyBkZXNjLA0KKyAgICAgICAgICAgICAgICBTdHJpbmcgc2lnbmF0dXJlLCBTdHJpbmdbXSBleGNlcHRpb25zKSB7DQorICAgICAgICAgICAgaWYgKHNpZ25hdHVyZSE9bnVsbCkgc2lnbmF0dXJlcy5wdXQobmFtZStkZXNjLHNpZ25hdHVyZSk7DQorICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnZpc2l0TWV0aG9kKGFjY2VzcywgbmFtZSwgZGVzYywgc2lnbmF0dXJlLCBleGNlcHRpb25zKTsNCisgICAgICAgIH0NCisNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHZvaWQgc2V0VXAoKXsNCisgICAgICAgIGxvYWRlciA9IG5ldyBNeUxvYWRlcih0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUNsYXNzSW5mbyhTdHJpbmcgc2NyaXB0KSB7DQorICAgICAgICBsb2FkZXIucGFyc2VDbGFzcyhzY3JpcHQpOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgTWFwIGdldFNpZ25hdHVyZXMoKSB7DQorICAgICAgICByZXR1cm4gc2lnbmF0dXJlczsNCisgICAgfQ0KKyAgICANCisgICAgdm9pZCBzaG91bGROb3RDb21waWxlKFN0cmluZyBzY3JpcHQpIHsNCisgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgbG9hZGVyLnBhcnNlQ2xhc3Moc2NyaXB0KTsNCisgICAgICAgIH0gY2F0Y2ggKENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uIGNmZSkgew0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiY29tcGlsYXRpb24gb2Ygc2NyaXB0ICciK3NjcmlwdCsiJyBzaG91bGQgaGF2ZSBmYWlsZWQsIGJ1dCBkaWQgbm90LiIpOw0KKyAgICB9DQorfQ0KKw0KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9nbHMvaW52b2NhdG9uL0NvbnN0cmN1dG9yRGVsZWdhdGlvblRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dscy9pbnZvY2F0b24vQ29uc3RyY3V0b3JEZWxlZ2F0aW9uVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA4YWRjYwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9nbHMvaW52b2NhdG9uL0NvbnN0cmN1dG9yRGVsZWdhdGlvblRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMzEgQEAKK3BhY2thZ2UgZ2xzLmludm9jYXRvbg0KKw0KK2ltcG9ydCBnbHMuc2NvcGUuQ29tcGlsYWJsZVRlc3RTdXBwb3J0DQorDQorcHVibGljIGNsYXNzIENvbnN0cmN1dG9yRGVsZWdhdGlvblRlc3QgZXh0ZW5kcyBDb21waWxhYmxlVGVzdFN1cHBvcnQgew0KKw0KKyAgcHVibGljIHZvaWQgdGVzdFRoaXNDYWxsV2l0aFBhcmFtZXRlcigpIHsNCisgICAgYXNzZXJ0U2NyaXB0ICIiIg0KKyAgICAgICBjbGFzcyBBIHsNCisgICAgICAgICBkZWYgZm9vDQorICAgICAgICAgQShTdHJpbmcgeCl7Zm9vPXh9DQorICAgICAgICAgQSgpe3RoaXMoImJhciIpfQ0KKyAgICAgICB9DQorICAgICAgIGRlZiBhID0gbmV3IEEoKQ0KKyAgICAgICBhc3NlcnQgYS5mb28gPT0gImJhciINCisgICAgIiIiICAgDQorICB9DQorICANCisgIHB1YmxpYyB2b2lkIHRlc3RUaGlzQ2FsbFdpdGhvdXRQYXJhbWV0ZXIoKSB7DQorICAgIGFzc2VydFNjcmlwdCAiIiINCisgICAgICAgY2xhc3MgQSB7DQorICAgICAgICAgZGVmIGZvbw0KKyAgICAgICAgIEEoU3RyaW5nIHgpe3RoaXMoKTsgZm9vPXh9DQorICAgICAgICAgQSgpe2Zvbz0iYmFyIn0NCisgICAgICAgfQ0KKyAgICAgICBkZWYgYSA9IG5ldyBBKCJmb28iKQ0KKyAgICAgICBhc3NlcnQgYS5mb28gPT0gImZvbyINCisgICAgIiIiICAgDQorICB9DQorDQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9nbHMvaW52b2NhdG9uL0NvdmFyaWFudFJldHVyblRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dscy9pbnZvY2F0b24vQ292YXJpYW50UmV0dXJuVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY3NmZiOAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9nbHMvaW52b2NhdG9uL0NvdmFyaWFudFJldHVyblRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMzUgQEAKK3BhY2thZ2UgZ2xzLmludm9jYXRvbg0KKw0KK2ltcG9ydCBnbHMuc2NvcGUuQ29tcGlsYWJsZVRlc3RTdXBwb3J0DQorDQorcHVibGljIGNsYXNzIENvdmFyaWFudFJldHVyblRlc3QgZXh0ZW5kcyBDb21waWxhYmxlVGVzdFN1cHBvcnQgew0KKw0KKyAgdm9pZCB0ZXN0Q292YXJpYW50UmV0dXJuKCkgew0KKyAgICBhc3NlcnRTY3JpcHQgIiIiDQorICAgICAgY2xhc3MgQSB7DQorICAgICAgICBPYmplY3QgZm9vKCkgezF9DQorICAgICAgfQ0KKyAgIA0KKyAgICAgIGNsYXNzIEIgZXh0ZW5kcyBBew0KKyAgICAgICAgU3RyaW5nIGZvbygpeyIyIn0NCisgICAgICB9DQorICAgICAgZGVmIGIgPSBuZXcgQigpOw0KKyAgICAgIGFzc2VydCBiLmZvbygpPT0iMiINCisgICAgICBhc3NlcnQgQi5kZWNsYXJlZE1ldGhvZHMuZmluZEFsbHtpdC5uYW1lPT0iZm9vIn0uc2l6ZSgpPT0yDQorICAgICIiIiAgIA0KKyAgfQ0KKyAgDQorICB2b2lkIHRlc3RDb3ZhcmlhbnRSZXR1cm5PdmVyd3JpdGluZ0Fic3RyYWN0TWV0aG9kKCkgew0KKyAgICBhc3NlcnRTY3JpcHQgIiIiDQorICAgICAgIGFic3RyYWN0IGNsYXNzIE51bWVyaWMgew0KKyAgICAgICAgIGFic3RyYWN0IE51bWVyaWMgZXZhbCgpOw0KKyAgICAgICB9DQorDQorICAgICAgIGNsYXNzIFJhdGlvbmFsIGV4dGVuZHMgTnVtZXJpYyB7DQorICAgICAgICAgUmF0aW9uYWwgZXZhbCgpIHt0aGlzfQ0KKyAgICAgICB9DQorICAgICANCisgICAgICAgYXNzZXJ0IFJhdGlvbmFsLmRlY2xhcmVkTWV0aG9kcy5maW5kQWxse2l0Lm5hbWU9PSJldmFsIn0uc2l6ZSgpPT0yICAgIA0KKyAgICAiIiINCisgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dscy9pbnZvY2F0b24vTWV0aG9kU2VsZWN0aW9uVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ2xzL2ludm9jYXRvbi9NZXRob2RTZWxlY3Rpb25UZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDk4YTRlCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dscy9pbnZvY2F0b24vTWV0aG9kU2VsZWN0aW9uVGVzdC5ncm9vdnkKQEAgLTAsMCArMSw2MCBAQAorcGFja2FnZSBnbHMuaW52b2NhdG9uDQorDQoraW1wb3J0IGdscy5zY29wZS5Db21waWxhYmxlVGVzdFN1cHBvcnQNCisNCitwdWJsaWMgY2xhc3MgTWV0aG9kU2VsZWN0aW9uVGVzdCBleHRlbmRzIENvbXBpbGFibGVUZXN0U3VwcG9ydCB7DQorDQorICAvKioNCisgICAqIFRoaXMgdGVzdCBlbnN1cmVzIEdyb292eSBjYW4gY2hvb3NlIGEgbWV0aG9kIGJhc2VkIG9uIGludGVyZmFjZXMuDQorICAgKiBDaG9vc2luZyBzdWNoIGFuIGludGVyZmFjZSBzaG91bGQgbm90IGJlIGhpZGRlbiBieSBzdWJjbGFzc2VzLg0KKyAgICovDQorICBwdWJsaWMgdm9pZCB0ZXN0TW9zdFNwZWNpZmljSW50ZXJmYWNlKCkgew0KKyAgICBhc3NlcnRTY3JpcHQgIiIiDQorICAgICAgaW50ZXJmYWNlIEF7fQ0KKyAgICAgIGludGVyZmFjZSBCIGV4dGVuZHMgQXt9DQorICAgICAgY2xhc3MgQyBpbXBsZW1lbnRzIEIsQXt9DQorICAgICAgY2xhc3MgRCBleHRlbmRzIEN7fQ0KKyAgICAgIGNsYXNzIEUgaW1wbGVtZW50cyBCe30NCisNCisgICAgICBkZWYgbShBIGEpezF9DQorICAgICAgZGVmIG0oQiBiKXsyfQ0KKw0KKyAgICAgIGFzc2VydCBtKG5ldyBEKCkpID09IDINCisgICAgICBhc3NlcnQgbShuZXcgQygpKSA9PSAyDQorICAgICAgYXNzZXJ0IG0obmV3IEUoKSkgPT0gMg0KKyAgICAiIiIgICANCisgIH0NCisgIA0KKyAgcHVibGljIHZvaWQgdGVzdE1vc3RHZW5lcmFsRm9yTnVsbCgpIHsNCisgICAgLy8gd2UgdXNlIHRoZSBzYW1lIHNpZ25hdHVyZXMgd2l0aCBkaWZmZXJlbnQgbWV0aG9kIG9yZGVycywNCisgICAgLy8gYmVjYXVzZSB3ZSB3YW50IHRvIGNhdGNoIG1ldGhvZCBvcmRlcmluZyBidWdzDQorICAgIGFzc2VydFNjcmlwdCAiIiINCisgICAgICBkZWYgbShTdHJpbmcgeCl7MX0NCisgICAgICBkZWYgbShJbnRlZ2VyIHgpezJ9DQorICAgICAgYXNzZXJ0IG0obnVsbCkgPT0gMQ0KKyAgICAgIA0KKyAgICAgIGRlZiBuKEludGVnZXIgeCl7Mn0NCisgICAgICBkZWYgbihTdHJpbmcgeCl7MX0NCisgICAgICBhc3NlcnQgbihudWxsKSA9PSAxDQorICAgICIiIg0KKyAgfQ0KKyAgDQorICB2b2lkIHRlc3RNZXRob2RTZWxlY3Rpb25FeGNlcHRpb24oKSB7DQorICAgIGFzc2VydFNjcmlwdCAiIiINCisgICAgICBpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLm1ldGFjbGFzcy5NZXRob2RTZWxlY3Rpb25FeGNlcHRpb24gYXMgTVNFDQorICAgIA0KKyAgICAgIGRlZiBmb28oaW50IHgpIHt9DQorICAgICAgZGVmIGZvbyhOdW1iZXIgeCkge30NCisgICAgICANCisgICAgICB0cnkgew0KKyAgICAgICAgZm9vKCkNCisgICAgICAgIGFzc2VydCBmYWxzZQ0KKyAgICAgIH0gY2F0Y2ggKE1TRSBtc2UpIHsNCisgICAgICAgIGFzc2VydCBtc2UubWVzc2FnZS5pbmRleE9mKCJmb28oKSIpID4wDQorICAgICAgICBhc3NlcnQgbXNlLm1lc3NhZ2UuaW5kZXhPZigiI2ZvbyhpbnQpIikgPjANCisgICAgICAgIGFzc2VydCBtc2UubWVzc2FnZS5pbmRleE9mKCIjZm9vKGphdmEubGFuZy5OdW1iZXIpIikgPjANCisgICAgICB9DQorICAgIA0KKyAgICAiIiIgIA0KKyAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ2xzL3Njb3BlL0Jsb2NrU2NvcGVWaXNpYmlsaXR5VGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ2xzL3Njb3BlL0Jsb2NrU2NvcGVWaXNpYmlsaXR5VGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMyOTIzZAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9nbHMvc2NvcGUvQmxvY2tTY29wZVZpc2liaWxpdHlUZXN0Lmdyb292eQpAQCAtMCwwICsxLDE0IEBACitwYWNrYWdlIGdscy5zY29wZQorCitjbGFzcyBCbG9ja1Njb3BlVmlzaWJpbGl0eVRlc3QgZXh0ZW5kcyBDb21waWxhYmxlVGVzdFN1cHBvcnQgeworCisgIHB1YmxpYyB2b2lkIHRlc3RGb3JMb29wVmFyaWFibGVOb3RWaXNpYmxlT3V0c2lkZSgpIHsKKyAJCisgIAlhc3NlcnRTY3JpcHQoIiIiCisgIAkgIGk9MQorICAJICBmb3IgKGkgaW4gWzEsMl0pIHt9CisgIAkgIGFzc2VydCBpPT0xCisgIAkiIiIpCisgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9nbHMvc2NvcGUvQ2xhc3NWYXJpYWJsZUhpZGluZ1Rlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dscy9zY29wZS9DbGFzc1ZhcmlhYmxlSGlkaW5nVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJjNTQwMQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9nbHMvc2NvcGUvQ2xhc3NWYXJpYWJsZUhpZGluZ1Rlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTkgQEAKK3BhY2thZ2UgZ2xzLnNjb3BlOworCitwdWJsaWMgY2xhc3MgQ2xhc3NWYXJpYWJsZUhpZGluZ1Rlc3QgZXh0ZW5kcyBDb21waWxhYmxlVGVzdFN1cHBvcnQgeworCisgICBkZWYgZm9vPTE7CisgICBkZWYgYmFyPTI7CisgICAKKyAgIHB1YmxpYyB2b2lkIHRlc3RGb29IaWRpbmcoKSB7CisgICAgIGFzc2VydCBmb289PTEKKyAgICAgZGVmIGZvbyA9IDUKKyAgICAgYXNzZXJ0IGZvbyA9PSA1CisgICB9CisgICAKKyAgIHB1YmxpYyB2b2lkIHRlc3RCYXJIaWRpbmcoKSB7CisgICAgIGFzc2VydCBiYXI9PTIKKyAgICAgZGVmIGJhciA9IDUKKyAgICAgYXNzZXJ0IGJhciA9PSA1CisgICB9CisgfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9nbHMvc2NvcGUvQ29tcGlsYWJsZVRlc3RTdXBwb3J0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9nbHMvc2NvcGUvQ29tcGlsYWJsZVRlc3RTdXBwb3J0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTQxZGMwCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dscy9zY29wZS9Db21waWxhYmxlVGVzdFN1cHBvcnQuZ3Jvb3Z5CkBAIC0wLDAgKzEsMjMgQEAKK3BhY2thZ2UgZ2xzLnNjb3BlCisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb247CitpbXBvcnQgZ3Jvb3Z5LnV0aWwuR3Jvb3Z5VGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBDb21waWxhYmxlVGVzdFN1cHBvcnQgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisJcHJvdGVjdGVkIHZvaWQgc2hvdWxkTm90Q29tcGlsZShTdHJpbmcgc2NyaXB0KSB7CisJICB0cnkgeworICAgICAgICBHcm9vdnlDbGFzc0xvYWRlciBnY2wgPSBuZXcgR3Jvb3Z5Q2xhc3NMb2FkZXIoKQorICAgICAgICBnY2wucGFyc2VDbGFzcyhzY3JpcHQsIGdldFRlc3RDbGFzc05hbWUoKSkKKyAgICAgIH0gY2F0Y2ggKENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uIGNmZSkgeworICAgICAgICBhc3NlcnQgdHJ1ZQorICAgICAgICByZXR1cm4KKyAgICAgIH0KKyAgICAgIGZhaWwoInRoZSBjb21waWxhdGlvbiBzdWNjZWVkZWQgYnV0IHNob3VsZCBoYXZlIGZhaWxlZCIpCisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNob3VsZENvbXBpbGUoU3RyaW5nIHNjcmlwdCkgeworICAgICAgR3Jvb3Z5Q2xhc3NMb2FkZXIgZ2NsID0gbmV3IEdyb292eUNsYXNzTG9hZGVyKCkKKyAgICAgIGdjbC5wYXJzZUNsYXNzKHNjcmlwdCwgZ2V0VGVzdENsYXNzTmFtZSgpKQorICAgICAgYXNzZXJ0IHRydWUKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dscy9zY29wZS9NdWx0aXBsZURlZmluaXRpb25PZlNhbWVWYXJpYWJsZVRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dscy9zY29wZS9NdWx0aXBsZURlZmluaXRpb25PZlNhbWVWYXJpYWJsZVRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYzIwMzAKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ2xzL3Njb3BlL011bHRpcGxlRGVmaW5pdGlvbk9mU2FtZVZhcmlhYmxlVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwxMDMgQEAKK3BhY2thZ2UgZ2xzLnNjb3BlCisKK2ltcG9ydCBnbHMuc2NvcGUuQ29tcGlsYWJsZVRlc3RTdXBwb3J0CisKK3B1YmxpYyBjbGFzcyBNdWx0aXBsZURlZmluaXRpb25PZlNhbWVWYXJpYWJsZVRlc3QgZXh0ZW5kcyBDb21waWxhYmxlVGVzdFN1cHBvcnQgeworCisgICBwdWJsaWMgdm9pZCB0ZXN0SW5TYW1lQmxvY2soKSB7CisgICAgIHNob3VsZE5vdENvbXBpbGUoIiIiCisgICAgICAgZGVmIGZvbyA9IDEKKyAgICAgICBkZWYgZm9vID0gMgorICAgICAiIiIpCisgICAgICAKKyAgICAgc2hvdWxkTm90Q29tcGlsZSgiIiIKKyAgICAgICBjbGFzcyBGb28geworICAgICAgICAgZGVmIGZvbygpIHsKKyAgICAgICAgICAgZGVmIGJhcj0xCisgICAgICAgICAgIGRlZiBiYXI9MgorICAgICAgICAgfQorICAgICAgIH0KKyAgICAgIiIiKQorICAgfQorICAgCisgICBwdWJsaWMgdm9pZCB0ZXN0SW5TdWJibG9ja3MoKSB7CisgICAgIHNob3VsZE5vdENvbXBpbGUoIiIiCisgICAgICAgZGVmIGZvbyA9IDEKKyAgICAgICA1LnRpbWVzIHsgZGVmIGZvbz0yIH0KKyAgICAgIiIiKQorICAgICAKKyAgICAgc2hvdWxkTm90Q29tcGlsZSgiIiIKKyAgICAgICBkZWYgZm9vID0gMQorICAgICAgIGxhYmVsMTogeyBkZWYgZm9vPTIgfQorICAgICAiIiIpCisgICAgIAorICAgICBzaG91bGROb3RDb21waWxlKCIiIgorICAgICAgIGRlZiBmb28gPSAxCisgICAgICAgZm9yIChpIGluIFtdKSB7IGRlZiBmb289MiB9CisgICAgICIiIikKKyAgICAgCisgICAgIHNob3VsZE5vdENvbXBpbGUoIiIiCisgICAgICAgZGVmIGZvbyA9IDEKKyAgICAgICB3aGlsZSAodHJ1ZSkgeyBkZWYgZm9vPTIgfQorICAgICAiIiIpICAgICAKKyAgIH0gCisgICAKKyAgIHB1YmxpYyB2b2lkIHRlc3RJbk5lc3RlZENsb3N1cmUoKSB7CisgICAgIHNob3VsZE5vdENvbXBpbGUoIiIiCisgICAgICAgZGVmIGZvbyA9IDEKKyAgICAgICA1LnRpbWVzIHsgNi50aW1lcyB7ZGVmIGZvbz0yIH0KKyAgICAgIiIiKQorICAgICAKKyAgICAgYXNzZXJ0U2NyaXB0ICgiIiIKKyAgICAgICBkZWYgZm9vID0gMQorICAgICAgIDUudGltZXMgeyA2LnRpbWVzIHtmb289MiB9IH0KKyAgICAgICBhc3NlcnQgZm9vID09IDIKKyAgICAgIiIiKQorICAgfQorICAgCisgICBwdWJsaWMgdm9pZCB0ZXN0QmluZGluZ0hpZGluZygpIHsKKyAgICAgYXNzZXJ0U2NyaXB0KCIiIgorICAgICAgIGZvbyA9IDEKKyAgICAgICBkZWYgZm9vID0gMworICAgICAgIGFzc2VydCBmb289PTMKKyAgICAgICBhc3NlcnQgdGhpcy5mb28gPT0gMQorICAgICAgIGFzc2VydCBiaW5kaW5nLmZvbyA9PSAxCisgICAgICIiIikKKyAgIH0KKyAgIAorICAgcHVibGljIHZvaWQgdGVzdEJpbmRpbmdBY2Nlc3NJbk1ldGhvZCgpIHsKKwkgICBhc3NlcnRTY3JpcHQoIiIiCisJICAgICBkZWYgbWV0aG9kVXNpbmdCaW5kaW5nKCkgeworCSAgICAgICB0cnkgeworCSAgICAgICAgIHMgPSAiICBiYmIgICI7CisJICAgICAgIH0gZmluYWxseSB7CisJICAgICAgICAgcyA9IHMudHJpbSgpOworCSAgICAgICB9CisJICAgICAgIGFzc2VydCBzID09ICJiYmIiCisJICAgICB9IAorCSAgICAgbWV0aG9kVXNpbmdCaW5kaW5nKCkKKwkgICAgIGFzc2VydCBzID09ICJiYmIiCisJICAgIiIiKQorICAgfQorICAgCisgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVPZlNhbWVOYW1lKCkgeworICAgCQlzaG91bGROb3RDb21waWxlKCIiIgorICAgCQkgIGNsYXNzIERvdWJsZUZpZWxkIHsKKwkJCWRlZiB6ZXJvID0gMAorCQkJcHVibGljIHplcm8gPSAwCisJCSAgfQorCQkgIAorICAgCQkiIiIpCisgICAKKyAgIAkJc2hvdWxkTm90Q29tcGlsZSgiIiIKKyAgIAkJICBjbGFzcyBEb3VibGVGaWVsZCB7CisJCQlkZWYgemVybyA9IDAKKwkJCWRlZiB6ZXJvID0gMAorCQkgIH0KKwkJICAKKyAgIAkJIiIiKQorCisgICB9CisgICAKKyAgIAorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9nbHMvc2NvcGUvTmFtZVJlc29sdmluZ1Rlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dscy9zY29wZS9OYW1lUmVzb2x2aW5nVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc5ZDBkNwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9nbHMvc2NvcGUvTmFtZVJlc29sdmluZ1Rlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsNDEgQEAKK3BhY2thZ2UgZ2xzLnNjb3BlCisKK2ltcG9ydCBnbHMuQ29tcGlsYWJsZVRlc3RTdXBwb3J0CisKK2NsYXNzIE5hbWVSZXNvbHZpbmdUZXN0IGV4dGVuZHMgQ29tcGlsYWJsZVRlc3RTdXBwb3J0IHsKKyAgcHVibGljIHZvaWQgdGVzdFZhcmlhYmxlTmFtZUVxdWFsc1RvQUNsYXNzTmFtZSgpIHsKKwlPYmplY3QgU3RyaW5nID0gIiIKKwlhc3NlcnQgU3RyaW5nID09ICIiCisJYXNzZXJ0IFN0cmluZy5jbGFzcyA9PSBqYXZhLmxhbmcuU3RyaW5nCisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIHRlc3RWYXJpYWJsZU5hbWVFcXVhbHNDdXJyZW50Q2xhc3NOYW1lKCkgeworCU9iamVjdCBOYW1lUmVzb2x2aW5nVGVzdCA9ICIiCisJYXNzZXJ0IE5hbWVSZXNvbHZpbmdUZXN0ID09ICIiCisJYXNzZXJ0IE5hbWVSZXNvbHZpbmdUZXN0LmNsYXNzID09IGphdmEubGFuZy5TdHJpbmcuY2xhc3MKKyAgfSAgCisgIAorICBwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NOb1ZhcmlhYmxlSW5TdGF0aWNNZXRob2QoKXsKKyAgICBhc3NlcnRTY3JpcHQgIiIiCisgICAgICBzdGF0aWMgZGVmIGZvbygpIHsKKyAgIAkgICAgIENsYXNzLmZvck5hbWUoJ2phdmEubGFuZy5JbnRlZ2VyJykKKyAgICAgIH0KKyAgICAgIGFzc2VydCBmb28oKSA9PSBJbnRlZ2VyCisgICAgIiIiCisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIHRlc3RBc3NpZ25tZW50VG9Ob25Mb2NhbFZhcmlhYmxlV2l0aFNhbWVOYW1lQXNDbGFzcygpIHsKKyAgICBzaG91bGROb3RDb21waWxlICIiIgorICAgICAgU3RyaW5nID0gMSAgICAKKyAgICAiIiIKKyAgfQorICAKKyAgcHVibGljIHZvaWQgdGVzdENsYXNzVXNhZ2VJblN1cGVyKCl7CisgICAgIHNob3VsZENvbXBpbGUgIiIiCisgICAgICAgY2xhc3MgQSB7QSh4KXt9fQorICAgICAgIGNsYXNzIEIgZXh0ZW5kcyBBIHsKKyAgICAgICAgIEIoeCl7c3VwZXIoVGhyZWFkKX0KKyAgICAgICB9CisgICAgICIiIiAgIAorICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dscy9zY29wZS9TdGF0aWNTY29wZVRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dscy9zY29wZS9TdGF0aWNTY29wZVRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NDQ4MTAKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ2xzL3Njb3BlL1N0YXRpY1Njb3BlVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwyMDMgQEAKK3BhY2thZ2UgZ2xzLnNjb3BlCisKK3B1YmxpYyBjbGFzcyBTdGF0aWNTY29wZVRlc3QgZXh0ZW5kcyBDb21waWxhYmxlVGVzdFN1cHBvcnQgeworCisgICAgcHVibGljIHZvaWQgdGVzdE5vcm1hbFN0YXRpY1Njb3BlSW5TY3JpcHQoKSB7CisgICAgICAgIHNob3VsZE5vdENvbXBpbGUgIiIiCisgICAgICAgIHN0YXRpYyBmb28oKSB7CisgICAgICAgICAgICBmb28gPSAxCisgICAgICAgIH0KKyAgICAgICAgIiIiCisKKyAgICAgICAgc2hvdWxkQ29tcGlsZSAiIiIKKyAgICAgICAgc3RhdGljIGZvbygpIHsKKyAgICAgICAgICAgIGRlZiBmb289MQorICAgICAgICB9CisgICAgICAgICIiIgorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdGF0aWNJbXBvcnRJbmNsYXNzKCkgeworICAgICAgICBhc3NlcnRTY3JpcHQgIiIiCisgICAgICAgIGltcG9ydCBzdGF0aWMgamF2YS5sYW5nLk1hdGguKgorICAgICAgICBjbGFzcyBCIHsKKyAgICAgICAgICAgIHN0YXRpYyBtYWluKGFyZ3MpIHsgYXNzZXJ0IGNvcygyICogUEkpID09IDEuMCB9CisgICAgICAgIH0KKyAgICAgICAgIiIiCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN0YXRpY01ldGhvZEluQ29uc3RydWN0b3IoKSB7CisgICAgICAgIGFzc2VydFNjcmlwdCAiIiIKKyAgICAgICAgY2xhc3MgQiB7CisgICAgICAgICAgICBkZWYgaW5zdGFuY2VWYXJpYWJsZSA9IDAKKyAgICAgICAgICAgIHN0YXRpYyBjbGFzc1ZhcmlhYmxlID0gMAorICAgICAgICAgICAgQigpIHsgaW5zdGFuY2VWYXJpYWJsZSA9IG1ldGhvZCgpOyBpbml0KCkgfQorICAgICAgICAgICAgc3RhdGljIGludCBtZXRob2QoKSB7IDEgfQorICAgICAgICAgICAgc3RhdGljIGludCBpbml0KCkgeyBjbGFzc1ZhcmlhYmxlID0gMiB9CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0IG5ldyBCKCkuaW5zdGFuY2VWYXJpYWJsZSA9PSAxCisgICAgICAgIGFzc2VydCBCLmNsYXNzVmFyaWFibGUgPT0gMgorICAgICAgICAiIiIKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhdGljTWV0aG9kSW5TcGVjaWFsQ29uc3RydWN0b3JDYWxsKCkgeworICAgICAgICBhc3NlcnRTY3JpcHQgIiIiCisgICAgICAgIGNsYXNzIEEgeworICAgICAgICAgICAgZGVmIGluc3RhbmNlVmFyaWFibGUgPSAwCisgICAgICAgICAgICBBKHgpIHsgaW5zdGFuY2VWYXJpYWJsZSA9IHggfQorICAgICAgICAgICAgQSh4LCB5KSB7IHRoaXMoIG1ldGhvZCh4ICsgeSkgKSB9CisgICAgICAgICAgICBzdGF0aWMgaW50IG1ldGhvZCh4KSB7IDIgKiB4IH0KKyAgICAgICAgfQorICAgICAgICBhc3NlcnQgbmV3IEEoMikuaW5zdGFuY2VWYXJpYWJsZSA9PSAyCisgICAgICAgIGFzc2VydCBuZXcgQSgyLCA1KS5pbnN0YW5jZVZhcmlhYmxlID09IDE0CisgICAgICAgICIiIgorICAgICAgICBhc3NlcnRTY3JpcHQgIiIiCisgICAgICAgIGNsYXNzIEIgeworICAgICAgICAgICAgZGVmIGluc3RhbmNlVmFyaWFibGUgPSAwCisgICAgICAgICAgICBCKHgpIHsgaW5zdGFuY2VWYXJpYWJsZSA9IHggfQorICAgICAgICB9CisgICAgICAgIGNsYXNzIEMgZXh0ZW5kcyBCIHsKKyAgICAgICAgICAgIEMoeCwgeSkgeyBzdXBlciggbWV0aG9kKHggKyB5KSApIH0KKyAgICAgICAgICAgIHN0YXRpYyBpbnQgbWV0aG9kKHgpIHsgMiAqIHggfQorICAgICAgICB9CisgICAgICAgIGFzc2VydCBuZXcgQigyKS5pbnN0YW5jZVZhcmlhYmxlID09IDIKKyAgICAgICAgYXNzZXJ0IG5ldyBDKDIsIDUpLmluc3RhbmNlVmFyaWFibGUgPT0gMTQKKyAgICAgICAgIiIiCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN0YXRpY0ltcG9ydFByb3BlcnR5KCkgeworICAgICAgICBhc3NlcnRTY3JpcHQgIiIiCisgICAgICAgIGltcG9ydCBzdGF0aWMgQS4qCisgICAgICAgIGNsYXNzIEIgeworICAgICAgICAgICAgc3RhdGljIG1haW4oYXJncykgeyBhc3NlcnQgdGVtcGVyYXR1cmUgPT0gNDIgfQorICAgICAgICB9CisgICAgICAgIGNsYXNzIEEgeyBzdGF0aWMgdGVtcGVyYXR1cmUgPSA0MiB9CisgICAgICAgICIiIgorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROb3JtYWxTdGF0aWNTY29wZUluY2xhc3MoKSB7CisgICAgICAgIGFzc2VydFNjcmlwdCAiIiIKKyAgICAgICAgY2xhc3MgQSB7CisgICAgICAgICAgICBzdGF0aWMgaQorICAgICAgICAgICAgc3RhdGljIGZvbygpIHsKKyAgICAgICAgICAgICAgICBpPTEKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBLmZvbygpCisgICAgICAgIGFzc2VydCBBLmkgPT0gMQorICAgICAgICAiIiIKKworICAgICAgICBzaG91bGROb3RDb21waWxlICIiIgorICAgICAgICBjbGFzcyBBIHsKKyAgICAgICAgICAgIGRlZiBpCisgICAgICAgICAgICBzdGF0aWMgZm9vKCkgeworICAgICAgICAgICAgICAgIGk9MQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICIiIgorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9zdXJlSW5TdGF0aWNTY29wZSgpIHsKKyAgICAgICAgc2hvdWxkQ29tcGlsZSAiIiIKKyAgICAgICAgNS50aW1lcyB7IGZvbz0yIH0KKyAgICAgICAgIiIiCisKKyAgICAgICAgc2hvdWxkQ29tcGlsZSAiIiIKKyAgICAgICAgNS50aW1lcyB7IGZvbz1pdCB9CisgICAgICAgICIiIgorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTY3JpcHRNZXRob2RDYWxsKCkgeworICAgICAgICBhc3NlcnRTY3JpcHQgIiIiCisgICAgICAgIGltcG9ydCBzdGF0aWMgamF2YS51dGlsLkNhbGVuZGFyLmdldEluc3RhbmNlIGFzIG5vdworICAgICAgICBkZWYgbm93ID0gbm93KCkudGltZQorICAgICAgICBhc3NlcnQgbm93LmNsYXNzID09IERhdGUKKyAgICAgICAgIiIiCisKKyAgICAgICAgLy8gVE9ETzogd2h5IGRvZXMgaW4tbGluaW5nIG9mIG5vdyB2YXJpYWJsZSBmcm9tIGFib3ZlIGJyZWFrPyBHUk9PVlktMTgwOSBpc3N1ZT8KKyAgICAgICAgc2hvdWxkQ29tcGlsZSAiIiIKKyAgICAgICAgaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuQ2FsZW5kYXIuZ2V0SW5zdGFuY2UgYXMgbm93CisgICAgICAgIGFzc2VydCBub3coKS50aW1lLmNsYXNzID09IERhdGUKKyAgICAgICAgIiIiCisKKyAgICAgICAgc2hvdWxkQ29tcGlsZSAiIiIKKyAgICAgICAgaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuTWF0aC4qCisgICAgICAgIGNvcyhjb3MoY29zKFBJKSkpCisgICAgICAgICIiIgorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGdWxseVF1YWxpZmllZENsYXNzTmFtZSgpIHsKKyAgICAgICAgYXNzZXJ0U2NyaXB0ICIiIgorICAgICAgICBzdGF0aWMgZm9vKCkge2phdmEubGFuZy5JbnRlZ2VyfQorICAgICAgICBhc3NlcnQgZm9vKCkgPT0gamF2YS5sYW5nLkludGVnZXIKKyAgICAgICAgIiIiCisKKyAgICAgICAgc2hvdWxkTm90Q29tcGlsZSAiIiIKKyAgICAgICAgc3RhdGljIGZvbygpIHsgamF2YS5sYW5nLkphdmFPckdyb292eVRoYXRzVGhlUXVlc3Rpb24gfQorICAgICAgICAiIiIKKworICAgICAgICBzaG91bGRDb21waWxlICIiIgorICAgICAgICBmb28oKSB7IGphdmEubGFuZy5KYXZhT3JHcm9vdnlUaGF0c1RoZVF1ZXN0aW9uIH0KKyAgICAgICAgIiIiCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN0YXRpY1Byb3BlcnR5SW5pdCgpIHsKKyAgICAgICAgLy8gR1JPT1ZZLTE5MTAKKyAgICAgICAgYXNzZXJ0U2NyaXB0ICIiIgorICAgICAgICBjbGFzcyBGb28geworICAgICAgICAgICAgIHN0YXRpYyBwMSA9IDEKKyAgICAgICAgICAgICBzdGF0aWMgcDIgPSBwMQorICAgICAgICB9CisgICAgICAgIGFzc2VydCBGb28ucDIgPT0gRm9vLnAxCisgICAgICAgIGFzc2VydCBGb28ucDEgPT0gMQorICAgICAgICAiIiIKKworICAgICAgICAvLyBzaG91bGQgbm90IGNvbXBpbGUgZm9yIG1pc3R5cGVkIG5hbWUKKyAgICAgICAgc2hvdWxkTm90Q29tcGlsZSAiIiIKKyAgICAgICAgY2xhc3MgRm9vIHsKKyAgICAgICAgICAgIHN0YXRpYyBwMSA9IDEKKyAgICAgICAgICAgIHN0YXRpYyBwMiA9IHgxCisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0IEZvby5wMiA9PSBGb28ucDEKKyAgICAgICAgYXNzZXJ0IEZvby5wMSA9PSAxCisgICAgICAgICIiIgorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTcGVjaWFsQ29uc3RydWN0b3JBY2Nlc3MoKSB7CisgICAgICAgIHNob3VsZENvbXBpbGUgIiIiCisgICAgICAgIGNsYXNzIEF7IEEoeCl7fSB9CisgICAgICAgIGNsYXNzIEIgZXh0ZW5kcyBBIHsKKyAgICAgICAgICAgIEIoeCkgeyBzdXBlcih4KSB9CisgICAgICAgIH0KKyAgICAgICAgIiIiCisKKyAgICAgICAgc2hvdWxkQ29tcGlsZSAiIiIKKyAgICAgICAgY2xhc3MgQXsgQSh4KXt9IH0KKyAgICAgICAgY2xhc3MgQiBleHRlbmRzIEEgeworICAgICAgICAgICAgQih4KSB7IHN1cGVyKHguc29tZXRoaW5nKSB9CisgICAgICAgIH0KKyAgICAgICAgIiIiCisKKyAgICAgICAgc2hvdWxkTm90Q29tcGlsZSAiIiIKKyAgICAgICAgY2xhc3MgQXsgQSh4KXt9IH0KKyAgICAgICAgY2xhc3MgQiBleHRlbmRzIEEgeworICAgICAgICAgICAgQih4KSB7IHN1cGVyKG5vbkV4aXN0aW5nUGFyYW1ldGVyKSB9CisgICAgICAgIH0KKyAgICAgICAgIiIiCisKKyAgICAgICAgc2hvdWxkTm90Q29tcGlsZSAiIiIKKyAgICAgICAgY2xhc3MgQXsgQSh4KXt9IH0KKyAgICAgICAgY2xhc3MgQiBleHRlbmRzIEEgeworICAgICAgICAgICAgZGVmIGRvTm90QWNjZXNzRHluYW1pY0ZpZWxkc09yUHJvcGVydGllcworICAgICAgICAgICAgQih4KSB7IHN1cGVyKGRvTm90QWNjZXNzRHluYW1pY0ZpZWxkc09yUHJvcGVydGllcykgfQorICAgICAgICB9CisgICAgICAgICIiIgorCisgICAgICAgIHNob3VsZENvbXBpbGUgIiIiCisgICAgICAgIGNsYXNzIEF7IEEoeCl7fSB9CisgICAgICAgIGNsYXNzIEIgZXh0ZW5kcyBBIHsKKyAgICAgICAgICAgIHN0YXRpYyBhbGxvd1VzYWdlT2ZTdGF0aWNQcm9wZXJ0aWVzQW5kRmllbGRzCisgICAgICAgICAgICBCKHgpIHsgc3VwZXIoYWxsb3dVc2FnZU9mU3RhdGljUHJvcGVydGllc0FuZEZpZWxkcykgfQorICAgICAgICB9CisgICAgICAgICIiIgorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9nbHMvc3RhdGVtZW50cy9SZXR1cm5UZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9nbHMvc3RhdGVtZW50cy9SZXR1cm5UZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTZjM2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dscy9zdGF0ZW1lbnRzL1JldHVyblRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMjQgQEAKK3BhY2thZ2UgZ2xzLnN0YXRlbWVudHMNCisNCitpbXBvcnQgZ2xzLnNjb3BlLkNvbXBpbGFibGVUZXN0U3VwcG9ydA0KKw0KK3B1YmxpYyBjbGFzcyBSZXR1cm5UZXN0IGV4dGVuZHMgQ29tcGlsYWJsZVRlc3RTdXBwb3J0IHsNCisNCisgIHB1YmxpYyB2b2lkIHRlc3RPYmplY3RJbml0aWFsaXplcigpIHsNCisgICAgICBzaG91bGROb3RDb21waWxlICIiIg0KKyAgICAgICAgIGNsYXNzIEEgew0KKyAgICAgICAgICAgIHtyZXR1cm59DQorICAgICAgICAgfSAgICAgIA0KKyAgICAgICIiIg0KKyAgfQ0KKyAgDQorICBwdWJsaWMgdm9pZCB0ZXN0U3RhdGljSW5pdGlhbGl6ZXIoKSB7DQorICAgICAgYXNzZXJ0U2NyaXB0ICIiIg0KKyAgICAgICAgIGNsYXNzIEEgew0KKyAgICAgICAgICAgICBzdGF0aWMgZm9vPTINCisgICAgICAgICAgICAgc3RhdGljIHsgcmV0dXJuOyBmb289MSB9DQorICAgICAgICAgfQ0KKyAgICAgICAgIGFzc2VydCBBLmZvbz09Mg0KKyAgICAgICIiIiAgICAgIA0KKyAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ2xzL3N5bnRheC9Bc3NlcnRUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9nbHMvc3ludGF4L0Fzc2VydFRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMDg0MzgKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ2xzL3N5bnRheC9Bc3NlcnRUZXN0Lmdyb292eQpAQCAtMCwwICsxLDEyIEBACitwYWNrYWdlIGdscy5zeW50YXgNCisNCitwdWJsaWMgY2xhc3MgQXNzZXJ0VGVzdCBleHRlbmRzIGdscy5Db21waWxhYmxlVGVzdFN1cHBvcnQgew0KKyAgDQorICB2b2lkIHRlc3RBc3NpZ25tZW50KCkgew0KKyAgICAvLyBkb24ndCBhbGxvdyAiPSIgaGVyZSwgaXQgbW9zdCBjZXJ0YWlubHkgbXVzdCBiZSBhICI9PSINCisgICAgc2hvdWxkTm90Q29tcGlsZSAiIiINCisgICAgICAgZGVmIGEgPSAxDQorICAgICAgIGFzc2VydCBhID0gMg0KKyAgICAiIiINCisgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dscy9zeW50YXgvT2xkQ2xvc3VyZVN5bnRheFJlbW92YWxUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9nbHMvc3ludGF4L09sZENsb3N1cmVTeW50YXhSZW1vdmFsVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI3YzIxOAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9nbHMvc3ludGF4L09sZENsb3N1cmVTeW50YXhSZW1vdmFsVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwyNSBAQAorcGFja2FnZSBnbHMuc3ludGF4DQorDQorcHVibGljIGNsYXNzIE9sZENsb3N1cmVTeW50YXhSZW1vdmFsVGVzdCBleHRlbmRzIGdscy5Db21waWxhYmxlVGVzdFN1cHBvcnQgew0KKyAgZGVmIGEgPSAyDQorICBkZWYgYiA9IDMNCisgIA0KKyAgdm9pZCB0ZXN0T25lUGFyYW1ldGVyKCl7DQorICAgIGRlZiBuZXdDbG9zdXJlID0ge2EgLT4gYX0NCisgICAgZGVmIG9sZENsb3N1cmUgPSB7YXxifQ0KKyAgICBhc3NlcnQgbmV3Q2xvc3VyZSgxKT09MQ0KKyAgICBhc3NlcnQgb2xkQ2xvc3VyZS5nZXRNYXhpbXVtTnVtYmVyT2ZQYXJhbWV0ZXJzKCkgPT0gMQ0KKyAgICAvLyB0aGUgb2xkIGNsb3N1cmUgd291bGQgaGF2ZSBjaW1wbHkgcmV0dXJuZWQgYg0KKyAgICAvLyBhZnRlciByZW1vdmFsIHRoaXMgaXMgdGhlIGxvZ2ljIG9yDQorICAgIGFzc2VydCBvbGRDbG9zdXJlKDEpPT0oYXxiKQ0KKyAgfQ0KKyAgDQorICB2b2lkIHRlc3RNdWx0aXBsZVBhcmFtZXRlcnMoKSB7DQorICAgIHNob3VsZE5vdENvbXBpbGUgIiIiDQorICAgICAgIGMgPSB7YSxifGErYn0NCisgICAgIiIiDQorICAgIHNob3VsZENvbXBpbGUgICAiIiINCisgICAgICAgYyA9IHsgYSxiIC0+IGErYiB9DQorICAgICIiIg0KKyAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ2xzL3N5bnRheC9PbGRQcm9wZXJ0eVN5bnRheFJlbW92YWxUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9nbHMvc3ludGF4L09sZFByb3BlcnR5U3ludGF4UmVtb3ZhbFRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiYzA4NGUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ2xzL3N5bnRheC9PbGRQcm9wZXJ0eVN5bnRheFJlbW92YWxUZXN0Lmdyb292eQpAQCAtMCwwICsxLDEyIEBACitwYWNrYWdlIGdscy5zeW50YXgNCisNCitwdWJsaWMgY2xhc3MgT2xkUHJvcGVydHlTeW50YXhSZW1vdmFsVGVzdCBleHRlbmRzIGdscy5Db21waWxhYmxlVGVzdFN1cHBvcnQgew0KKyAgDQorICB2b2lkIHRlc3RNdWx0aXBsZVBhcmFtZXRlcnMoKSB7DQorICAgIHNob3VsZE5vdENvbXBpbGUgIiIiDQorICAgICAgIGNsYXNzIEMgew0KKyAgICAgICAgIEBQcm9wZXJ0eSBmb28NCisgICAgICAgfQ0KKyAgICAiIiINCisgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dscy9zeW50YXgvT2xkU3ByZWFkVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ2xzL3N5bnRheC9PbGRTcHJlYWRUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTdmYzlmCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dscy9zeW50YXgvT2xkU3ByZWFkVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwxMSBAQAorcGFja2FnZSBnbHMuc3ludGF4DQorDQorcHVibGljIGNsYXNzIE9sZFNwcmVhZFRlc3QgZXh0ZW5kcyBnbHMuQ29tcGlsYWJsZVRlc3RTdXBwb3J0IHsNCisgIA0KKyAgdm9pZCB0ZXN0U3ByZWFkU3RhdGVtZW50KCkgew0KKyAgICAvLyBkb24ndCBhbGxvdyBzcHJlYWQgb3V0c2lkZSBhIG1ldGhvZCBjYWxsDQorICAgIHNob3VsZE5vdENvbXBpbGUgIiIiDQorICAgICAgICp4ICAgICAgIA0KKyAgICAiIiINCisgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9BYnN0cmFjdENsYXNzQW5kSW50ZXJmYWNlVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0Fic3RyYWN0Q2xhc3NBbmRJbnRlcmZhY2VUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Njg5ZWNhCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9BYnN0cmFjdENsYXNzQW5kSW50ZXJmYWNlVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwyMDggQEAKK3BhY2thZ2UgZ3Jvb3Z5CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24KKworY2xhc3MgQWJzdHJhY3RDbGFzc0FuZEludGVyZmFjZVRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKwlkZWYgc2hvdWxkTm90Q29tcGlsZShTdHJpbmcgc2NyaXB0KSB7CisJICB0cnkgeworICAgICAgICBHcm9vdnlTaGVsbCBzaGVsbCA9IG5ldyBHcm9vdnlTaGVsbCgpCisgICAgICAgIHNoZWxsLnBhcnNlKHNjcmlwdCwgZ2V0VGVzdENsYXNzTmFtZSgpKQorICAgICAgfSBjYXRjaCAoQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24gY2ZlKSB7CisgICAgICAgIGFzc2VydCB0cnVlCisgICAgICAgIHJldHVybgorICAgICAgfQorICAgICAgZmFpbCgidGhlIGNvbXBpbGF0aW9uIHN1Y2NlZWRlZCBidXQgc2hvdWxkIGhhdmUgZmFpbGVkIikKKwl9CisKKwl2b2lkIHRlc3RJbnRlcmZhY2UoKSB7CisgICAgCWRlZiBzaGVsbCA9IG5ldyBHcm9vdnlTaGVsbCgpCisgICAgICAgIGRlZiB0ZXh0ID0gIiIiCisgICAgICAgIAlpbnRlcmZhY2UgQSB7CisJCQkJdm9pZCBtZXRob2RPbmUoT2JqZWN0IG8pCisJCQkJT2JqZWN0IG1ldGhvZFR3bygpCisJCQl9CisJCQkKKwkJCWNsYXNzIEIgaW1wbGVtZW50cyBBIHsKKwkJCQl2b2lkIG1ldGhvZE9uZShPYmplY3Qgbyl7YXNzZXJ0IHRydWV9CisJCQkJT2JqZWN0IG1ldGhvZFR3bygpeworCQkJCQlhc3NlcnQgdHJ1ZQorCQkJCQltZXRob2RPbmUobnVsbCkKKwkJCQkJcmV0dXJuIG5ldyBPYmplY3QoKQorCQkJCX0KKwkJCX0KKwkJCQorCQkJZGVmIGIgPSBuZXcgQigpOworCQkJcmV0dXJuIGIubWV0aG9kVHdvKCkKKwkJCSIiIgorCQlkZWYgcmV0VmFsID0gc2hlbGwuZXZhbHVhdGUodGV4dCkKKwkJYXNzZXJ0IHJldFZhbC5jbGFzcyA9PSBPYmplY3QKKwl9CisJCisJdm9pZCB0ZXN0Q2xhc3NJbXBsZW1lbnRpbmdBbkludGVyZmFjZUJ1dE1pc3Nlc01ldGhvZCgpIHsKKyAgICAgICAgc2hvdWxkTm90Q29tcGlsZSAiIiIKKyAgICAgICAgCWludGVyZmFjZSBBIHsKKwkJCQl2b2lkIG1ldGhvZE9uZShPYmplY3QgbykKKwkJCQlPYmplY3QgbWV0aG9kVHdvKCkKKwkJCX0KKwkJCQorCQkJY2xhc3MgQiBpbXBsZW1lbnRzIEEgeworCQkJCXZvaWQgbWV0aG9kT25lKE9iamVjdCBvKXthc3NlcnQgdHJ1ZX0KKwkJCX0KKwkJCQorCQkJZGVmIGIgPSBuZXcgQigpOworCQkJcmV0dXJuIGIubWV0aG9kVHdvKCkKKwkJCSIiIgorCQkKKwkJc2hvdWxkTm90Q29tcGlsZSAiIiIKKwkJCWludGVyZmFjZSBBIHsKKwkJCQlPYmplY3QgbWV0aG9kVHdvKCkKKwkJICAgIH0KKyAgICAgICAgCWludGVyZmFjZSBCIGV4dGVuZHMgQXsKKwkJCQl2b2lkIG1ldGhvZE9uZShPYmplY3QgbykKKwkJCX0KKwkJCQorCQkJY2xhc3MgQyBpbXBsZW1lbnRzIEEgeworCQkJCXZvaWQgbWV0aG9kT25lKE9iamVjdCBvKXthc3NlcnQgdHJ1ZX0KKwkJCX0KKwkJCQorCQkJZGVmIGIgPSBuZXcgQygpOworCQkJcmV0dXJuIGIubWV0aG9kVHdvKCkKKwkJCSIiIgorCX0KKwkKKwl2b2lkIHRlc3RBYnN0cmFjdENsYXNzKCkgeworICAgIAlkZWYgc2hlbGwgPSBuZXcgR3Jvb3Z5U2hlbGwoKQorICAgICAgICBkZWYgdGV4dCA9ICIiIgorICAgICAgICAJYWJzdHJhY3QgY2xhc3MgQSB7CisJCQkJYWJzdHJhY3Qgdm9pZCBtZXRob2RPbmUoT2JqZWN0IG8pCisJCQkJT2JqZWN0IG1ldGhvZFR3bygpeworCQkJCQlhc3NlcnQgdHJ1ZQorCQkJCQltZXRob2RPbmUobnVsbCkKKwkJCQkJcmV0dXJuIG5ldyBPYmplY3QoKQorCQkJCX0KKwkJCX0KKwkJCQorCQkJY2xhc3MgQiBleHRlbmRzIEEgeworCQkJCXZvaWQgbWV0aG9kT25lKE9iamVjdCBvKXthc3NlcnQgdHJ1ZX0KKwkJCX0KKwkJCQorCQkJZGVmIGIgPSBuZXcgQigpOworCQkJcmV0dXJuIGIubWV0aG9kVHdvKCkKKwkJCSIiIgorCQlkZWYgcmV0VmFsID0gc2hlbGwuZXZhbHVhdGUodGV4dCkKKwkJYXNzZXJ0IHJldFZhbC5jbGFzcyA9PSBPYmplY3QKKwl9CQorCQorCXZvaWQgdGVzdENsYXNzRXh0ZW5kaW5nQW5BYnN0cmFjdENsYXNzQnV0TWlzc2VzTWV0aG9kKCkgeworICAgICAgICBzaG91bGROb3RDb21waWxlICIiIgorICAgICAgICAJYWJzdHJhY3QgY2xhc3MgQSB7CisJCQkJYWJzdHJhY3Qgdm9pZCBtZXRob2RPbmUoT2JqZWN0IG8pCisJCQkJT2JqZWN0IG1ldGhvZFR3bygpeworCQkJCQlhc3NlcnQgdHJ1ZQorCQkJCQltZXRob2RPbmUobnVsbCkKKwkJCQkJcmV0dXJuIG5ldyBPYmplY3QoKQorCQkJCX0KKwkJCQlhYnN0cmFjdCB2b2lkIE1ldGhvZFRocmVlKCkKKwkJCX0KKwkJCQorCQkJYWJzdHJhY3QgY2xhc3MgQiBleHRlbmRzIEEgeworCQkJCXZvaWQgbWV0aG9kT25lKE9iamVjdCBvKXthc3NlcnQgdHJ1ZX0KKwkJCX0KKwkJCQorCQkJY2xhc3MgQyBleHRlbmRzIEJ7fQorCQkJCisJCQlkZWYgYiA9IG5ldyBDKCk7CisJCQlyZXR1cm4gYi5tZXRob2RUd28oKQorCQkJIiIiCQorCQkKKyAgICAgICBzaG91bGROb3RDb21waWxlICIiIgorICAgICAgICAJYWJzdHJhY3QgY2xhc3MgQSB7CisJCQkJYWJzdHJhY3Qgdm9pZCBtZXRob2RPbmUoT2JqZWN0IG8pCisJCQkJT2JqZWN0IG1ldGhvZFR3bygpeworCQkJCQlhc3NlcnQgdHJ1ZQorCQkJCQltZXRob2RPbmUobnVsbCkKKwkJCQkJcmV0dXJuIG5ldyBPYmplY3QoKQorCQkJCX0KKwkJCQlhYnN0cmFjdCB2b2lkIE1ldGhvZFRocmVlKCkKKwkJCX0KKwkJCQorCQkJY2xhc3MgQiBleHRlbmRzIEEgeworCQkJCXZvaWQgbWV0aG9kT25lKE9iamVjdCBvKXthc3NlcnQgdHJ1ZX0KKwkJCX0KKwkJCQorCQkJZGVmIGIgPSBuZXcgQigpOworCQkJcmV0dXJuIGIubWV0aG9kVHdvKCkKKwkJCSIiIgorCX0KKwkKKwl2b2lkIHRlc3RJbnRlcmZhY2VBYnN0cmFjdENsYXNzQ29tYmluYXRpb24oKSB7CisgICAgCWRlZiBzaGVsbCA9IG5ldyBHcm9vdnlTaGVsbCgpCisgICAgICAgIGRlZiB0ZXh0ID0gIiIiCisJCQlpbnRlcmZhY2UgQSB7CisJCQkJdm9pZCBtZXRob2RPbmUoKQorCQkJfQorCQkJCisJCQlhYnN0cmFjdCBjbGFzcyBCIGltcGxlbWVudHMgQXsKKwkJCQlhYnN0cmFjdCB2b2lkIG1ldGhvZFR3bygpCisJCQl9CisJCQkKKwkJCWNsYXNzIEMgZXh0ZW5kcyBCIHsKKwkJCQl2b2lkIG1ldGhvZE9uZSgpe2Fzc2VydCB0cnVlfQorCQkJCXZvaWQgbWV0aG9kVHdvKCl7CisJCQkJICBtZXRob2RPbmUoKQorCQkJCX0KKwkJCX0KKwkJCWRlZiBjID0gbmV3IEMoKQorCQkJYy5tZXRob2RUd28oKQorCQkJIiIiCisJCXNoZWxsLmV2YWx1YXRlKHRleHQpCisJCQorCQlzaG91bGROb3RDb21waWxlICIiIgorCQkJaW50ZXJmYWNlIEEgeworCQkJCXZvaWQgbWV0aG9kT25lKCkKKwkJCX0KKwkJCQorCQkJYWJzdHJhY3QgY2xhc3MgQiBpbXBsZW1lbnRzIEF7CisJCQkJYWJzdHJhY3Qgdm9pZCBtZXRob2RUd28oKQorCQkJfQorCQkJCisJCQljbGFzcyBDIGV4dGVuZHMgQiB7fQorCQkJZGVmIGMgPSBuZXcgYygpCisJCQljLm1ldGhvZFR3bygpCisJCQkiIiIKKwl9CisJCisJdm9pZCB0ZXN0RGVmYXVsdE1vZGlmaWVyc0ZvckludGVyZmFjZXMoKSB7CisgICAgCWRlZiBzaGVsbCA9IG5ldyBHcm9vdnlTaGVsbCgpCisgICAgICAgIGRlZiB0ZXh0ID0gIiIiCisgICAgICAgICAgICBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIKKyAgICAgICAgICAgIAorCQkJaW50ZXJmYWNlIEEgeworCQkJCWRlZiBmb28KKwkJCX0KKwkJCQorCQkJZGVmIGZpZWxkcyA9IEEuY2xhc3MuZGVjbGFyZWRGaWVsZHMKKyAgICAgICAgICAgIGFzc2VydCBmaWVsZHMubGVuZ3RoPT0xCisgICAgICAgICAgICBhc3NlcnQgZmllbGRzWzBdLm5hbWUgPT0gImZvbyIKKyAgICAgICAgICAgIGFzc2VydCBNb2RpZmllci5pc1B1YmxpYyAoZmllbGRzWzBdLm1vZGlmaWVycykKKyAgICAgICAgICAgIGFzc2VydCBNb2RpZmllci5pc1N0YXRpYyAoZmllbGRzWzBdLm1vZGlmaWVycykKKyAgICAgICAgICAgIGFzc2VydCBNb2RpZmllci5pc0ZpbmFsICAoZmllbGRzWzBdLm1vZGlmaWVycykKKwkJCSIiIgorCQlzaGVsbC5ldmFsdWF0ZSh0ZXh0KQorCX0KKwkKKwl2b2lkIHRlc3RBY2Nlc3NUb0ludGVyZmFjZUZpZWxkKCkgeworICAgIAlkZWYgc2hlbGwgPSBuZXcgR3Jvb3Z5U2hlbGwoKQorICAgICAgICBkZWYgdGV4dCA9ICIiIgorCQkJaW50ZXJmYWNlIEEgeworCQkJCWRlZiBmb289MQorCQkJfQorICAgICAgICAgICAgY2xhc3MgQiBpbXBsZW1lbnRzIEEgeworICAgICAgICAgICAgICBkZWYgZm9vKCl7Zm9vfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0IG5ldyBCKCkuZm9vKCk9PTEKKwkgICAiIiIKKwkgICBzaGVsbC5ldmFsdWF0ZSh0ZXh0KQorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0FtYmlndW91c0ludm9jYXRpb25UZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQW1iaWd1b3VzSW52b2NhdGlvblRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhZTQ4YzgKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0FtYmlndW91c0ludm9jYXRpb25UZXN0Lmdyb292eQpAQCAtMCwwICsxLDM0IEBACitwYWNrYWdlIGdyb292eQorLyoqCisgKiB0byBwcm92ZSBHUk9PVlktNDY3IGlzIG5vIGxvbmdlciBhbiBpc3N1ZSAgICAKKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amVyZW15LnJheW5lckBiaWdmb290LmNvbSI+SmVyZW15IFJheW5lcjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworCitjbGFzcyBBbWJpZ3VvdXNJbnZvY2F0aW9uVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKyAgICBkZWYgZHVtbXkxLCBkdW1teTIKKworICAgIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGR1bW15MSA9IG5ldyBncm9vdnkuRHVtbXlNZXRob2RzSmF2YSgpCisgICAgICAgIGR1bW15MiA9IG5ldyBncm9vdnkuRHVtbXlNZXRob2RzR3Jvb3Z5KCkKKyAgICB9CisKKyAgICB2b2lkIHRlc3RBbWJpZ3VvdXNJbnZvY2F0aW9uV2l0aEZsb2F0cygpIHsKKyAgICAgICAgYXNzZXJ0ICJmbG9hdCBhcmdzIiA9PSBkdW1teTEuZm9vKCJiYXIiLCAxLjBmLCAyLjBmKQorICAgICAgICBhc3NlcnQgImZsb2F0IGFyZ3MiID09IGR1bW15MS5mb28oImJhciIsIChmbG9hdCkgMSwgKGZsb2F0KSAyKQorICAgICAgICBhc3NlcnQgImZsb2F0IGFyZ3MiID09IGR1bW15MS5mb28oImJhciIsIChGbG9hdCkgMSwgKEZsb2F0KSAyKQorICAgICAgICBhc3NlcnQgImZsb2F0IGFyZ3MiID09IGR1bW15Mi5mb28oImJhciIsIDEuMGYsIDIuMGYpCisgICAgICAgIGFzc2VydCAiZmxvYXQgYXJncyIgPT0gZHVtbXkyLmZvbygiYmFyIiwgKGZsb2F0KSAxLCAoZmxvYXQpIDIpCisgICAgICAgIGFzc2VydCAiZmxvYXQgYXJncyIgPT0gZHVtbXkyLmZvbygiYmFyIiwgKEZsb2F0KSAxLCAoRmxvYXQpIDIpCisgICAgfQorCisgICAgdm9pZCB0ZXN0QW1iaWd1b3VzSW52b2NhdGlvbldpdGhJbnRzKCkgeworICAgICAgICBhc3NlcnQgImludCBhcmdzIiA9PSBkdW1teTEuZm9vKCJiYXIiLCAxLCAyKQorICAgICAgICBhc3NlcnQgImludCBhcmdzIiA9PSBkdW1teTEuZm9vKCJiYXIiLCAoaW50KSAxLCAoaW50KSAyKQorICAgICAgICBhc3NlcnQgImludCBhcmdzIiA9PSBkdW1teTEuZm9vKCJiYXIiLCAoSW50ZWdlcikgMSwgKEludGVnZXIpIDIpCisgICAgICAgIGFzc2VydCAiaW50IGFyZ3MiID09IGR1bW15Mi5mb28oImJhciIsIDEsIDIpCisgICAgICAgIGFzc2VydCAiaW50IGFyZ3MiID09IGR1bW15Mi5mb28oImJhciIsIChpbnQpIDEsIChpbnQpIDIpCisgICAgICAgIGFzc2VydCAiaW50IGFyZ3MiID09IGR1bW15Mi5mb28oImJhciIsIChJbnRlZ2VyKSAxLCAoSW50ZWdlcikgMikKKyAgICB9Cit9IApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQXJyYXlBdXRvYm94aW5nVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0FycmF5QXV0b2JveGluZ1Rlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3OWI2NjUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0FycmF5QXV0b2JveGluZ1Rlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMjcgQEAKK3BhY2thZ2UgZ3Jvb3Z5CisKK2NsYXNzIEFycmF5QXV0b2JveGluZ1Rlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisgICAgCisgICAgdm9pZCB0ZXN0VW53YW50ZWRBdXRvYm94aW5nV2hlbkludm9raW5nTWV0aG9kcygpIHsKKyAgICAgIGRlZiBjbAorICAgICAgY2wgPSBibGFoMihuZXcgaW50WzIqMl0pCisgICAgICBhc3NlcnQgY2wgPT0gIltJIgorICAgICAgY2wgPSBibGFoMihuZXcgbG9uZ1syKjJdKQorICAgICAgYXNzZXJ0IGNsID09ICJbSiIKKyAgICAgIGNsID0gYmxhaDIobmV3IHNob3J0WzIqMl0pCisgICAgICBhc3NlcnQgY2wgPT0gIltTIgorICAgICAgY2wgPSBibGFoMihuZXcgYm9vbGVhblsyKjJdKQorICAgICAgYXNzZXJ0IGNsID09ICJbWiIKKyAgICAgIGNsID0gYmxhaDIobmV3IGNoYXJbMioyXSkKKyAgICAgIGFzc2VydCBjbCA9PSAiW0MiCisgICAgICBjbCA9IGJsYWgyKG5ldyBkb3VibGVbMioyXSkKKyAgICAgIGFzc2VydCBjbCA9PSAiW0QiCisgICAgICBjbCA9IGJsYWgyKG5ldyBmbG9hdFsyKjJdKQorICAgICAgYXNzZXJ0IGNsID09ICJbRiIKKyAgICB9CisgICAgCisgICAgZGVmIGJsYWgyKE9iamVjdCBvKSB7CisgICAgICAgcmV0dXJuIG8uY2xhc3MubmFtZQorICAgIH0KKyAgICAgICAgCit9IApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQXJyYXlDb2VyY2VUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQXJyYXlDb2VyY2VUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjc3ODY1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9BcnJheUNvZXJjZVRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMjExIEBACitwYWNrYWdlIGdyb292eQorCitjbGFzcyBBcnJheUNvZXJjZVRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICBPYmplY3RbXSBmaWVsZAorICAgIExvbmdbXSBudW1iZXJGaWVsZAorICAgIGludFtdIHByaW1pdGl2ZUZpZWxkCisKKyAgICB2b2lkIHRlc3RTdGF0aWNhbGx5VHlwZWRQcmltaXRpdmVUeXBlQXJyYXlzKCkgeworICAgICAgICBpbnRbXSBhID0gWzEsIDIsIDNdCisgICAgICAgIGFzc2VydCBhIGluc3RhbmNlb2YgaW50W10KKyAgICAgICAgYXNzZXJ0IGEubGVuZ3RoID09IDMKKyAgICAgICAgZHVtcChhKQorICAgIH0KKworICAgIHZvaWQgdGVzdFN0YXRpY2FsbHlUeXBlZFByaW1pdGl2ZUZpZWxkQXJyYXlzKCkgeworICAgICAgICBwcmltaXRpdmVGaWVsZCA9IFsxLCAyLCAzXQorICAgICAgICBkdW1wKHByaW1pdGl2ZUZpZWxkKQorCisgICAgICAgIGFzc2VydCBwcmltaXRpdmVGaWVsZCBpbnN0YW5jZW9mIGludFtdCisgICAgICAgIGFzc2VydCBwcmltaXRpdmVGaWVsZC5sZW5ndGggPT0gMworICAgIH0KKworCisgICAgdm9pZCB0ZXN0Rm9vMigpIHsKKyAgICAgICAgZGVmIHggPSBbMSwgMiwgM10gYXMgT2JqZWN0W10KKyAgICAgICAgZHVtcCh4KQorICAgICAgICBhc3NlcnQgeCBpbnN0YW5jZW9mIE9iamVjdFtdCisgICAgICAgIGRlZiBjID0geC5nZXRDbGFzcygpCisgICAgICAgIGRlZiBldCA9IGMuY29tcG9uZW50VHlwZQorICAgICAgICBhc3NlcnQgZXQgPT0gT2JqZWN0LmNsYXNzCisgICAgfQorCisgICAgdm9pZCB0ZXN0U3RhdGljYWxseVR5cGVkT2JqZWN0QXJyYXlzKCkgeworICAgICAgICBPYmplY3RbXSBiID0gWzEsIDIsIDNdCisgICAgICAgIGR1bXAoYikKKworICAgICAgICBhc3NlcnQgYiBpbnN0YW5jZW9mIE9iamVjdFtdCisgICAgICAgIGFzc2VydCBiLmxlbmd0aCA9PSAzCisgICAgICAgIGRlZiBjID0gYi5nZXRDbGFzcygpCisgICAgICAgIGRlZiBldCA9IGMuY29tcG9uZW50VHlwZQorICAgICAgICBhc3NlcnQgZXQgPT0gT2JqZWN0LmNsYXNzCisKKyAgICB9CisKKyAgICB2b2lkIHRlc3RTdGF0aWNhbGx5VHlwZWRBcnJheXMoKSB7CisgICAgICAgIEludGVnZXJbXSBiID0gWzEsIDIsIDNdCisgICAgICAgIGR1bXAoYikKKworICAgICAgICBhc3NlcnQgYiBpbnN0YW5jZW9mIEludGVnZXJbXQorICAgICAgICBhc3NlcnQgYi5sZW5ndGggPT0gMworICAgICAgICBkZWYgYyA9IGIuZ2V0Q2xhc3MoKQorICAgICAgICBkZWYgZXQgPSBjLmNvbXBvbmVudFR5cGUKKyAgICAgICAgYXNzZXJ0IGV0ID09IEludGVnZXIuY2xhc3MKKworICAgIH0KKworICAgIHZvaWQgdGVzdFN0YXRpY2FsbHlUeXBlZE9iamVjdEZpZWxkQXJyYXlzKCkgeworICAgICAgICBmaWVsZCA9IFsxLCAyLCAzXQorICAgICAgICBkdW1wKGZpZWxkKQorCisgICAgICAgIGFzc2VydCBmaWVsZCBpbnN0YW5jZW9mIE9iamVjdFtdCisgICAgICAgIGFzc2VydCBmaWVsZC5sZW5ndGggPT0gMworICAgIH0KKworICAgIHZvaWQgdGVzdFN0YXRpY2FsbHlUeXBlZEZpZWxkQXJyYXlzKCkgeworICAgICAgICBudW1iZXJGaWVsZCA9IFsxLCAyLCAzXQorICAgICAgICBkdW1wKG51bWJlckZpZWxkKQorCisgICAgICAgIGFzc2VydCBudW1iZXJGaWVsZCBpbnN0YW5jZW9mIExvbmdbXQorICAgICAgICBhc3NlcnQgbnVtYmVyRmllbGQubGVuZ3RoID09IDMKKyAgICB9CisKKyAgICB2b2lkIHRlc3RNYWtlUHJpbWl0aXZlQXJyYXlUeXBlcygpIHsKKyAgICAgICAgZGVmIHggPSBudWxsCisKKyAgICAgICAgeCA9IFsxLCAwLCAxXSBhcyBib29sZWFuW10KKyAgICAgICAgYXNzZXJ0IHggaW5zdGFuY2VvZiBib29sZWFuW10KKyAgICAgICAgYXNzZXJ0IHgubGVuZ3RoID09IDMKKyAgICAgICAgZHVtcCh4KQorCisgICAgICAgIHggPSBbMSwgMiwgM10gYXMgYnl0ZVtdCisgICAgICAgIGFzc2VydCB4Lmxlbmd0aCA9PSAzCisgICAgICAgIGFzc2VydCB4IGluc3RhbmNlb2YgYnl0ZVtdCisgICAgICAgIGR1bXAoeCkKKworICAgICAgICB4ID0gWzEsIDIsIDNdIGFzIGNoYXJbXQorICAgICAgICBhc3NlcnQgeC5sZW5ndGggPT0gMworICAgICAgICBhc3NlcnQgeCBpbnN0YW5jZW9mIGNoYXJbXQorICAgICAgICBkdW1wKHgpCisKKyAgICAgICAgeCA9IFsxLCAyLCAzXSBhcyBzaG9ydFtdCisgICAgICAgIGFzc2VydCB4Lmxlbmd0aCA9PSAzCisgICAgICAgIGFzc2VydCB4IGluc3RhbmNlb2Ygc2hvcnRbXQorICAgICAgICBkdW1wKHgpCisKKyAgICAgICAgeCA9IFsxLCAyLCAzXSBhcyBpbnRbXQorICAgICAgICBhc3NlcnQgeC5sZW5ndGggPT0gMworICAgICAgICBhc3NlcnQgeCBpbnN0YW5jZW9mIGludFtdCisgICAgICAgIGR1bXAoeCkKKworICAgICAgICB4ID0gWzEsIDIsIDNdIGFzIGxvbmdbXQorICAgICAgICBhc3NlcnQgeC5sZW5ndGggPT0gMworICAgICAgICBhc3NlcnQgeCBpbnN0YW5jZW9mIGxvbmdbXQorICAgICAgICBkdW1wKHgpCisKKyAgICAgICAgeCA9IFsxLCAyLCAzXSBhcyBmbG9hdFtdCisgICAgICAgIGFzc2VydCB4Lmxlbmd0aCA9PSAzCisgICAgICAgIGFzc2VydCB4IGluc3RhbmNlb2YgZmxvYXRbXQorICAgICAgICBkdW1wKHgpCisKKyAgICAgICAgeCA9IFsxLCAyLCAzXSBhcyBkb3VibGVbXQorICAgICAgICBhc3NlcnQgeC5sZW5ndGggPT0gMworICAgICAgICBhc3NlcnQgeCBpbnN0YW5jZW9mIGRvdWJsZVtdCisgICAgICAgIGR1bXAoeCkKKyAgICB9CisKKworCisgICAgdm9pZCB0ZXN0QXNPYmplY3RBcnJheSgpIHsKKyAgICAgICAgZGVmIHggPSBbMSwgMiwgM10gYXMgT2JqZWN0W10KKyAgICAgICAgZGVmIGMgPSB4LmdldENsYXNzKCkKKyAgICAgICAgZGVmIGV0ID0gYy5jb21wb25lbnRUeXBlCisgICAgICAgIGFzc2VydCBldCA9PSBPYmplY3QuY2xhc3MKKyAgICAgICAgZHVtcCh4KQorCisgICAgICAgIEludGVnZXJbXSB5ID0gWzEsIDIsIDNdCisgICAgICAgIGMgPSB5LmdldENsYXNzKCkKKyAgICAgICAgZXQgPSBjLmNvbXBvbmVudFR5cGUKKyAgICAgICAgYXNzZXJ0IGV0ID09IEludGVnZXIuY2xhc3MKKyAgICAgICAgZHVtcCh5KQorICAgIH0KKworICAgIHZvaWQgdGVzdE1ha2VBcnJheVRoZW5Db2VyY2VUb0Fub3RoZXJUeXBlKCkgeworICAgICAgICBkZWYgeCA9IFsxLCAyLCAzXSBhcyBpbnRbXQorICAgICAgICBhc3NlcnQgeC5zaXplKCkgPT0gMworICAgICAgICBhc3NlcnQgeCBpbnN0YW5jZW9mIGludFtdCisgICAgICAgIGR1bXAoeCkKKworICAgICAgICAvLyBsZXRzIHRyeSBjb2VyY2UgaXQgaW50byBhbiBhcnJheSBvZiBsb25ncworICAgICAgICBkZWYgeSA9IHggYXMgbG9uZ1tdCisgICAgICAgIGFzc2VydCB5IGluc3RhbmNlb2YgbG9uZ1tdCisgICAgICAgIGR1bXAoeSkKKworICAgICAgICBkZWYgeiA9IHkgYXMgT2JqZWN0W10KKyAgICAgICAgYXNzZXJ0IHogaW5zdGFuY2VvZiBPYmplY3RbXQorICAgICAgICBkZWYgYyA9IHouZ2V0Q2xhc3MoKQorICAgICAgICBkZWYgZXQgPSBjLmNvbXBvbmVudFR5cGUKKyAgICAgICAgYXNzZXJ0IGV0ID09IE9iamVjdC5jbGFzcworICAgICAgICBkdW1wKHopCisKKyAgICAgICAgeCA9IHkgYXMgaW50W10KKyAgICAgICAgYXNzZXJ0IHguc2l6ZSgpID09IDMKKyAgICAgICAgYXNzZXJ0IHggaW5zdGFuY2VvZiBpbnRbXQorICAgICAgICBkdW1wKHgpCisgICAgfQorCisKKyAgICB2b2lkIHRlc3RNYWtlQXJyYXlUeXBlcygpIHsKKyAgICAgICAgZGVmIHggPSBudWxsCisKKyAgICAgICAgeCA9IFsxLCAwLCAxXSBhcyBCb29sZWFuW10KKyAgICAgICAgYXNzZXJ0IHggaW5zdGFuY2VvZiBCb29sZWFuW10KKyAgICAgICAgYXNzZXJ0IHgubGVuZ3RoID09IDMKKyAgICAgICAgZHVtcCh4KQorCisgICAgICAgIHggPSBbMSwgMiwgM10gYXMgQnl0ZVtdCisgICAgICAgIGFzc2VydCB4Lmxlbmd0aCA9PSAzCisgICAgICAgIGFzc2VydCB4IGluc3RhbmNlb2YgQnl0ZVtdCisgICAgICAgIGR1bXAoeCkKKworICAgICAgICB4ID0gWzEsIDIsIDNdIGFzIENoYXJhY3RlcltdCisgICAgICAgIGFzc2VydCB4Lmxlbmd0aCA9PSAzCisgICAgICAgIGFzc2VydCB4IGluc3RhbmNlb2YgQ2hhcmFjdGVyW10KKyAgICAgICAgZHVtcCh4KQorCisgICAgICAgIHggPSBbMSwgMiwgM10gYXMgU2hvcnRbXQorICAgICAgICBhc3NlcnQgeC5sZW5ndGggPT0gMworICAgICAgICBhc3NlcnQgeCBpbnN0YW5jZW9mIFNob3J0W10KKyAgICAgICAgZHVtcCh4KQorCisgICAgICAgIHggPSBbMSwgMiwgM10gYXMgSW50ZWdlcltdCisgICAgICAgIGFzc2VydCB4Lmxlbmd0aCA9PSAzCisgICAgICAgIGFzc2VydCB4IGluc3RhbmNlb2YgSW50ZWdlcltdCisgICAgICAgIGR1bXAoeCkKKworICAgICAgICB4ID0gWzEsIDIsIDNdIGFzIExvbmdbXQorICAgICAgICBhc3NlcnQgeC5sZW5ndGggPT0gMworICAgICAgICBhc3NlcnQgeCBpbnN0YW5jZW9mIExvbmdbXQorICAgICAgICBkdW1wKHgpCisKKyAgICAgICAgeCA9IFsxLCAyLCAzXSBhcyBGbG9hdFtdCisgICAgICAgIGFzc2VydCB4Lmxlbmd0aCA9PSAzCisgICAgICAgIGFzc2VydCB4IGluc3RhbmNlb2YgRmxvYXRbXQorICAgICAgICBkdW1wKHgpCisKKyAgICAgICAgeCA9IFsxLCAyLCAzXSBhcyBEb3VibGVbXQorICAgICAgICBhc3NlcnQgeC5sZW5ndGggPT0gMworICAgICAgICBhc3NlcnQgeCBpbnN0YW5jZW9mIERvdWJsZVtdCisgICAgICAgIGR1bXAoeCkKKyAgICB9CisKKyAgICB2b2lkIGR1bXAoYXJyYXkpIHsKKyAgICAgICAgcHJpbnRsbiAiQXJyYXkgaXMgb2YgdHlwZSAke2FycmF5LmNsYXNzfSB3aGljaCBoYXMgZWxlbWVudCB0eXBlICR7YXJyYXkuY2xhc3MuY29tcG9uZW50VHlwZX0iCisgICAgICAgIGZvciAoaSBpbiBhcnJheSkgeworICAgICAgICAgICAgcHJpbnRsbiAiQ29udGFpbnMgZW50cnkgJGkgb2YgdHlwZSAke2kuY2xhc3N9IgorICAgICAgICB9CisgICAgICAgIHByaW50bG4oKQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9BcnJheVBhcmFtTWV0aG9kVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0FycmF5UGFyYW1NZXRob2RUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTVjNzdjCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9BcnJheVBhcmFtTWV0aG9kVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwyNSBAQAorcGFja2FnZSBncm9vdnkKKworY2xhc3MgQXJyYXlQYXJhbU1ldGhvZFRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSBpbXBsZW1lbnRzIER1bW15SW50ZXJmYWNlIHsKKworICAgIHZvaWQgdGVzdE1ldGhvZENhbGwoKSB7CisgICAgICAgIGRlZiBhcnJheSA9ICJhIGIgYyIuc3BsaXQoJyAnKQorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IGFycmF5LnNpemUoKSA9PSAzCisgICAgICAgIAorICAgICAgICBtZXRob2RXaXRoQXJyYXlQYXJhbShhcnJheSkKKyAgICB9CisgICAgCisgICAgdm9pZCBtZXRob2RXaXRoQXJyYXlQYXJhbShTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIHByaW50bG4oImZpcnN0IGl0ZW06ICR7YXJnc1swXX0iKQorICAgICAgICAKKyAgICAgICAgLy8gbGV0cyB0dXJuIGl0IGludG8gYSBsaXN0CisgICAgICAgIGRlZiBsaXN0ID0gYXJncy50b0xpc3QoKQorICAgICAgICBhc3NlcnQgbGlzdCBpbnN0YW5jZW9mIGphdmEudXRpbC5MaXN0CisgICAgICAgIGxpc3RbNF0gPSAiZSIKKyAgICAgICAgCisgICAgICAgIGFzc2VydCBsaXN0ID09IFsiYSIsICJiIiwgImMiLCBudWxsLCAiZSJdCisgICAgICAgIAorICAgICAgICBwcmludGxuKCJDcmVhdGVkIGxpc3QgJHtsaXN0fSIpCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQXJyYXlUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQXJyYXlUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGE1OGVlCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9BcnJheVRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTQ1IEBACitwYWNrYWdlIGdyb292eQorCitjbGFzcyBBcnJheVRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICB2b2lkIHRlc3RGaXhlZFNpemUoKSB7CisgICAgICAgIGRlZiBhcnJheSA9IG5ldyBTdHJpbmdbMTBdCisgICAgICAgIGFzc2VydCBhcnJheS5zaXplKCkgPT0gMTAKKyAgICAgICAgYXJyYXlbMF0gPSAiSGVsbG8iCisgICAgICAgIGFzc2VydCBhcnJheVswXSA9PSAiSGVsbG8iCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdEFycmF5V2l0aEluaXRpYWxpemVyKCkgeworICAgICAgICBTdHJpbmdbXSBhcnJheSA9IFsgIm5pY2UiLCAiY2hlZXNlIiwgImdyb21pdCIgXQorICAgICAgICBhc3NlcnQgYXJyYXkuc2l6ZSgpID09IDMKKyAgICAgICAgYXNzZXJ0IGFycmF5WzBdID09ICJuaWNlIiAsIGFycmF5Lmluc3BlY3QoKQorICAgICAgICBhc3NlcnQgYXJyYXlbMV0gPT0gImNoZWVzZSIKKyAgICAgICAgYXNzZXJ0IGFycmF5WzJdID09ICJncm9taXQiCisgICAgfQorCisgICAgdm9pZCB0ZXN0Q2hhckFycmF5Q3JlYXRlKCkgeworICAgICAgICAgICBkZWYgYXJyYXkgPSBuZXcgY2hhclszXQorICAgICAgICAgICBhc3NlcnQgYXJyYXkuc2l6ZSgpID09IDMKKyAgICB9CisKKyAgICB2b2lkIHRlc3RDaGFyQXJyYXlXaXRoSW5pdGlhbGl6ZXIoKSB7CisgICAgICAgIGNoYXJbXSBhcnJheSA9IFsgJ2EnLCAnYicsICdjJyBdCisgICAgICAgIGFzc2VydCBhcnJheS5zaXplKCkgPT0gMworICAgICAgICBhc3NlcnQgYXJyYXlbMF0gPT0gJ2EnICwgYXJyYXkuaW5zcGVjdCgpCisgICAgICAgIGFzc2VydCBhcnJheVsxXSA9PSAnYicKKyAgICAgICAgYXNzZXJ0IGFycmF5WzJdID09ICdjJworICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RCeXRlQXJyYXlDcmVhdGUoKSB7CisgICAgICAgIGRlZiBhcnJheSA9IG5ldyBieXRlWzEwMF0KKyAgICAgICAgYXNzZXJ0IGFycmF5LnNpemUoKSA9PSAxMDA7CisgICAgfQorCisgICAgdm9pZCB0ZXN0Qnl0ZUFycmF5V2l0aEluaXRpYWxpemVyKCkgeworICAgICAgICBieXRlW10gYXJyYXkgPSBbMCwgMSwgMiwgM10KKyAgICAgICAgYXNzZXJ0IGFycmF5LnNpemUoKSA9PSA0CisgICAgICAgIGFzc2VydCBhcnJheVswXSA9PSAwICwgYXJyYXkuaW5zcGVjdCgpCisgICAgICAgIGFzc2VydCBhcnJheVsxXSA9PSAxCisgICAgICAgIGFzc2VydCBhcnJheVsyXSA9PSAyCisgICAgICAgIGFzc2VydCBhcnJheVszXSA9PSAzCisgICAgfQorCisgICAgdm9pZCB0ZXN0Qnl0ZUFycmF5V2l0aEluaXRpYWxpemVyQW5kQXNzaWdubWVudE9mTnVtYmVyKCkgeworICAgICAgICBieXRlW10gYXJyYXkgPSBbIDIsIDRdCisgICAgICAgIGFzc2VydCBhcnJheS5zaXplKCkgPT0gMgorICAgICAgICBhc3NlcnQgYXJyYXlbMF0gPT0gMgorICAgICAgICBhc3NlcnQgYXJyYXlbMV0gPT0gNAorCisgICAgICAgIGFycmF5WzBdID0gNzYKKyAgICAgICAgYXJyYXlbMV0gPSAzMgorICAgICAgICBhc3NlcnQgYXJyYXlbMF0gPT0gNzYKKyAgICAgICAgYXNzZXJ0IGFycmF5WzFdID09IDMyCisKKyAgICAgICAgYXJyYXkucHV0QXQoMCwgNDUpCisgICAgICAgIGFycmF5LnB1dEF0KDEsIDY3KQorICAgICAgICBhc3NlcnQgYXJyYXlbMF0gPT0gNDUKKyAgICAgICAgYXNzZXJ0IGFycmF5WzFdID09IDY3CisgICAgfQorCisgICAgdm9pZCB0ZXN0RG91YmxlQXJyYXlDcmVhdGUoKSB7CisgICAgICAgICBkZWYgYXJyYXkgID0gbmV3IGRvdWJsZVszXQorICAgICAgICAgYXNzZXJ0IGFycmF5LnNpemUoKSA9PSAzCisgICAgfQorCisgICAgdm9pZCB0ZXN0RG91YmxlQXJyYXlXaXRoSW5pdGlhbGl6ZXIoKSB7CisgICAgICAgIGRvdWJsZVtdIGFycmF5ID0gWyAxLjMsIDMuMTQsIDIuN10KKyAgICAgICAgYXNzZXJ0IGFycmF5LnNpemUoKSA9PSAzCisgICAgICAgIGFzc2VydCBhcnJheVswXSA9PSAxLjMgLCBhcnJheS5pbnNwZWN0KCkKKyAgICAgICAgYXNzZXJ0IGFycmF5WzFdID09IDMuMTQKKyAgICAgICAgYXNzZXJ0IGFycmF5WzJdID09IDIuNworICAgIH0KKworICAgIHZvaWQgdGVzdEludEFycmF5Q3JlYXRlKCkgeworICAgICAgICBkZWYgYXJyYXkgPSBuZXcgaW50WzVdCisgICAgICAgIGFzc2VydCBhcnJheS5zaXplKCkgPT0gNQorICAgIH0KKworICAgIHZvaWQgdGVzdEludEFycmF5V2l0aEluaXRpYWxpemVyKCkgeworICAgICAgICBpbnRbXSBhcnJheSA9IFs0MiwgLTUsIDM2MF0KKyAgICAgICAgYXNzZXJ0IGFycmF5LnNpemUoKSA9PSAzCisgICAgICAgIGFzc2VydCBhcnJheVswXSA9PSA0MiAsIGFycmF5Lmluc3BlY3QoKQorICAgICAgICBhc3NlcnQgYXJyYXlbMV0gPT0gLTUKKyAgICAgICAgYXNzZXJ0IGFycmF5WzJdID09IDM2MAorICAgIH0KKworICAgIHZvaWQgdGVzdEFycmF5RGVjbGFyYXRpb24oKSB7CisgICAgICAgIFN0cmluZ1tdIGFycmF5ID0gWyAiYSIsICJiIiwgImMiIF0KKyAgICAgICAgYXNzZXJ0IGFycmF5LnNpemUoKSA9PSAzCisgICAgICAgIGFzc2VydCBhcnJheVswXSA9PSAiYSIKKyAgICAgICAgYXNzZXJ0IGFycmF5WzFdID09ICJiIgorICAgICAgICBhc3NlcnQgYXJyYXlbMl0gPT0gImMiCisgICAgfQorCisgICAgdm9pZCB0ZXN0U2ltcGxlQXJyYXlFcXVhbHMoKSB7CisgICAgICAgIEludGVnZXJbXSBhcnIxID0gWzEsMiwzLDRdCisgICAgICAgIEludGVnZXJbXSBhcnIyID0gWzEsMiwzLDRdCisgICAgICAgIGFzc2VydCBhcnIxID09IGFycjIKKyAgICAgICAgaW50W10gcHJpbWFycjEgPSBbMSwyLDMsNF0KKyAgICAgICAgaW50W10gcHJpbWFycjIgPSBbMSwyLDMsNF0KKyAgICAgICAgYXNzZXJ0IHByaW1hcnIxID09IHByaW1hcnIyCisgICAgICAgIGFzc2VydCBwcmltYXJyMSA9PSBhcnIyCisgICAgICAgIGRvdWJsZVtdIHByaW1hcnIzID0gWzEsMiwzLDRdCisgICAgICAgIGxvbmdbXSBwcmltYXJyNCA9IFsxLDIsMyw0XQorICAgICAgICBhc3NlcnQgcHJpbWFycjMgPT0gcHJpbWFycjQKKyAgICAgICAgYXNzZXJ0IHByaW1hcnIzID09IHByaW1hcnIxCisgICAgICAgIGFzc2VydCBwcmltYXJyMiA9PSBwcmltYXJyNAorICAgICAgICBkZWYgbGlzdDEgPSBbMSwyLDMsNF0KKyAgICAgICAgYXNzZXJ0IGxpc3QxID09IGFycjEKKyAgICAgICAgYXNzZXJ0IGFycjEgPT0gbGlzdDEKKyAgICAgICAgYXNzZXJ0IGxpc3QxID09IHByaW1hcnIxCisgICAgICAgIGFzc2VydCBwcmltYXJyMSA9PSBsaXN0MQorICAgICAgICBib29sZWFuW10gYm9vbHMxID0gW3RydWUsIHRydWUsIGZhbHNlXQorICAgICAgICBib29sZWFuW10gYm9vbHMyID0gW3RydWUsIHRydWUsIGZhbHNlXQorICAgICAgICBhc3NlcnQgYm9vbHMxID09IGJvb2xzMgorICAgICAgICBhc3NlcnQgYm9vbHMxID09IFt0cnVlLCB0cnVlLCBmYWxzZV0gYXMgYm9vbGVhbltdCisgICAgfQorCisgICAgdm9pZCB0ZXN0Q29tcGxleEFycmF5RXF1YWxzKCkgeworICAgICAgICBkZWYgYSA9IFsxLDJdIGFzIEludGVnZXJbXQorICAgICAgICBkZWYgYiA9IFsxLDJdCisgICAgICAgIGFzc2VydCBhID09IGIKKyAgICAgICAgYXNzZXJ0IFtbMSwyXSxbMyw0XV0gPT0gW1sxLDJdLFszLDRdXQorICAgICAgICBkZWYgeCA9IFtbMSwyXSBhcyBJbnRlZ2VyW11dCisgICAgICAgIE9iamVjdFtdIHkgPSBbWzEsMl1dCisgICAgICAgIGFzc2VydCB5ID09IHgKKyAgICAgICAgYXNzZXJ0IFtbMSwyXSxbMyw0XV0gYXMgaW50W11bXSA9PSBbWzEsMl0sWzMsNF1dIGFzIGludFtdW10KKyAgICAgICAgYXNzZXJ0IFtbWzUsNl0sWzcsOF1dXSBhcyBpbnRbXVtdW10gPT0gW1tbNSw2XSxbNyw4XV1dIGFzIExvbmdbXVtdW10KKyAgICAgICAgYXNzZXJ0IFtbMSwyXSxbMyw0XV0gYXMgbG9uZ1tdW10gPT0gW1sxLDJdLFszLDRdXSBhcyBsb25nW11bXQorICAgICAgICBhc3NlcnQgW1sxLDJdLFszLDRdXSBhcyBsb25nW11bXSA9PSBbWzEsMl0sWzMsNF1dIGFzIExvbmdbXVtdCisgICAgICAgIGFzc2VydCBbWzEsMl0sWzMsNF1dIGFzIGxvbmdbXVtdID09IFtbMSwyXSxbMyw0XV0KKyAgICAgICAgYXNzZXJ0IFtbMSwyXSxbMyw0XV0gYXMgbG9uZ1tdW10gPT0gW1sxLDJdIGFzIHNob3J0W10sIFszLDRdIGFzIHNob3J0W11dCisgICAgICAgIGludFtdW10gaW50c0EgPSBbWzEsMl0sWzMsNF1dCisgICAgICAgIGFzc2VydCBpbnRzQSA9PSBbWzEsMl0sWzMsNF1dIGFzIGludFtdW10KKyAgICAgICAgaW50W11bXSBpbnRzQiA9IFtbMSwyXSxbMyw0XV0KKyAgICAgICAgYXNzZXJ0IGludHNBID09IGludHNCCisgICAgICAgIGJvb2xlYW5bXVtdIGJvb2xzQSA9IFtbdHJ1ZSwgdHJ1ZV0sIFtmYWxzZSwgdHJ1ZV0sIFtmYWxzZV1dCisgICAgICAgIGJvb2xlYW5bXVtdIGJvb2xzQiA9IFtbdHJ1ZSwgdHJ1ZV0sIFtmYWxzZSwgdHJ1ZV0sIFtmYWxzZV1dCisgICAgICAgIGFzc2VydCBib29sc0EgPT0gYm9vbHNCCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0FycmF5VHlwZVRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9BcnJheVR5cGVUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzgzZWM1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9BcnJheVR5cGVUZXN0Lmdyb292eQpAQCAtMCwwICsxLDIyIEBACitwYWNrYWdlIGdyb292eQorCitjbGFzcyBBcnJheVR5cGVUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCB0ZXN0Q2xvc3VyZVdpdGhUeXBlZFBhcmFtKCkgeworICAgICAgICBkZWYgYyA9IHtTdHJpbmdbXSBmb28tPnByaW50bG4oImNhbGxlZCB3aXRoICRmb28iKSB9CisgICAgICAgIGMobnVsbCkKKyAgICB9CisKKyAgICB2b2lkIHRlc3RWYXJpYWJsZVR5cGUoKSB7CisgICAgICAgIE9iamVjdFtdIGZvbyA9IG1ldGhvZFRoYXRSZXR1cm5zQXJyYXkoKQorICAgICAgICBwcmludGxuICJmb28gaXMgJGZvbyIKKworICAgIH0KKworCisKKyAgICBPYmplY3RbXSBtZXRob2RUaGF0UmV0dXJuc0FycmF5KCkgeworICAgICAgICBwcmludGxuICJJbnZva2VkIHRoZSBtZXRob2QiCisgICAgICAgIHJldHVybiBudWxsCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9Bc3NlcnROdW1iZXJUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQXNzZXJ0TnVtYmVyVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNhMDQxOQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQXNzZXJ0TnVtYmVyVGVzdC5ncm9vdnkKQEAgLTAsMCArMSw0MiBAQAorcGFja2FnZSBncm9vdnkKKworY2xhc3MgQXNzZXJ0TnVtYmVyVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIHZvaWQgdGVzdENvbXBhcmUoKSB7CisgICAgICAgIGRlZiB4ID0gbnVsbAorCisgICAgICAgIGFzc2VydCB4ID09IG51bGwKKyAgICAgICAgYXNzZXJ0IHggIT0gNDMyCisgICAgICAgIGFzc2VydCB4ICE9IDQyMy4yMzQyCisgICAJCSAgICAgCisgICAgICAgIHggPSAxMjMKKworICAgICAgICBhc3NlcnQgeCAhPSBudWxsCisgICAgICAgIGFzc2VydCB4ICE9IDQzMgorICAgICAgICBhc3NlcnQgeCAhPSA0MjMuMjM0MgorICAgICAgICBhc3NlcnQgeCA9PSAxMjMKKwkJCisgICAgICAgIHggPSA0Mi4yMzQyCisKKyAgICAgICAgYXNzZXJ0IHggIT0gbnVsbAorICAgICAgICBhc3NlcnQgeCAhPSA0MzIKKyAgICAgICAgYXNzZXJ0IHggIT0gNDIzLjIzNDIKKyAgICAgICAgYXNzZXJ0IHggPT0gNDIuMjM0MgorICAgIH0KKwkKKyAgICB2b2lkIHRlc3RMZXNzVGhhbigpIHsKKyAgICAgICAgZGVmIHggPSAxMjMKKworICAgICAgICBhc3NlcnQgeCA8IDIwMAorICAgICAgICBhc3NlcnQgeCA8PSAyMDAKKyAgICAgICAgYXNzZXJ0IHggPD0gMTIzCisgICAgfQorCisgICAgdm9pZCB0ZXN0R3JlYXRlclRoYW4oKSB7CisgICAgICAgIGRlZiB4ID0gMTIzCisJICAgIAorICAgICAgICBhc3NlcnQgeCA+IDEwCisgICAgICAgIGFzc2VydCB4ID49IDEwCisgICAgICAgIGFzc2VydCB4ID49IDEyMworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQXNzZXJ0VGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0Fzc2VydFRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczYmJkZjAKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0Fzc2VydFRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsNDUgQEAKK3BhY2thZ2UgZ3Jvb3Z5CisKK2NsYXNzIEFzc2VydFRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICB2b2lkIHRlc3RBc3NlcnQoKSB7CisgICAgICAgIGRlZiB4ID0gbnVsbAorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IHggPT0gbnVsbAorICAgICAgICBhc3NlcnQgeCAhPSAiYWJjIgorICAgICAgICBhc3NlcnQgeCAhPSAiZm9vIgorCSAgICAKKyAgICAgICAgeCA9ICJhYmMiCisKKyAgICAgICAgYXNzZXJ0IHggIT0gImZvbyIKKyAgICAgICAgYXNzZXJ0IHggIT0gIG51bGwKKyAgICAgICAgYXNzZXJ0IHggIT0gImRlZiIKKyAgICAgICAgYXNzZXJ0IHggPT0gImFiYyIKKyAgICAgICAgCisgICAgICAgIGFzc2VydCB4LmVxdWFscygiYWJjIikKKyAgICAgICAgCisgICAgICAgIGFzc2VydCAheC5lcXVhbHMoImRlZiIpCisgICAgICAgIGFzc2VydCAhZmFsc2UKKyAgICAgICAgYXNzZXJ0ICEoMT09MikKKyAgICAgICAgYXNzZXJ0ICEoMT4zKQorICAgICAgICBhc3NlcnQgISgxIT0xKQorICAgIH0KKwkKKyAgICB2b2lkIHRlc3RBc3NlcnRGYWlsKCkgeworICAgICAgICBkZWYgeCA9IDEyMzQKKworICAgICAgICBkZWYgcnVuQ29kZSA9IGZhbHNlCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBydW5Db2RlID0gdHJ1ZQorICAgICAgICAgICAgYXNzZXJ0IHggPT0gNQorCisgICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uIikKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoQXNzZXJ0aW9uRXJyb3IgZSkgeworICAgICAgICAgICAgLy9tc2cgPSAiRXhwcmVzc2lvbjogKHggPT0gNSkuIFZhbHVlczogeCA9IDEyMzQiCisgICAgICAgICAgICAvL2Fzc2VydCBlLmdldE1lc3NhZ2UoKSA9PSBtc2cKKyAgICAgICAgICAgIC8vYXNzZXJ0IGUubWVzc2FnZSA9PSBtc2cKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQgcnVuQ29kZSwgImhhcyBub3QgcmFuIHRoZSB0cnkgLyBjYXRjaCBibG9jayBjb2RlIgorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQmFyLmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQmFyLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzMwOGVkCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9CYXIuZ3Jvb3Z5CkBAIC0wLDAgKzEsMzAgQEAKK3BhY2thZ2UgZ3Jvb3Z5CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcCBhcyBHb29iZXI7CisKK2NsYXNzIENoZWRkYXIgZXh0ZW5kcyBHb29iZXIgaW1wbGVtZW50cyBSdW5uYWJsZQoreworICAgIEdvb2JlciB0aGVNYXA7CisgICAgcHJvdGVjdGVkIGRlZiBjaGVlc2llcjsKKyAgICBwdWJsaWMgc3RhdGljIGRlZiBjaGVlc2llc3Q7CisKKyAgICBzdGF0aWMgdm9pZCBtYWluKGFyZ3MpIHsKKyAgICAgICAgZGVmIGYgPSBuZXcgQ2hlZGRhcigpCisgICAgICAgIHByaW50bG4gZgorICAgIH0KKworICAgIGRlZiBjaGVlc2VJdCgpIHsgIH0KKworICAgIFN0cmluZyBnZXRTdHJpbmdDaGVlc2UoKSB7IH0KKyAgICBTdHJpbmcgZ2V0T3RoZXJDaGVlc2UoZm9vLGJhcikgeyB9CisKKyAgICB2b2lkIHJ1bigpIHsgY2hlZXNlSXQoKSB9CisKKyAgICBzdGF0aWMgR29vYmVyIG11dGF0ZUdvb2JlcihHb29iZXIgdGhlR29vYmVyKSB7IH0KKyAgIAorfQorCitjbGFzcyBQcm92b2xvbmUKK3sKKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9CYXNlNjRUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQmFzZTY0VGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAwYzM5ZQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQmFzZTY0VGVzdC5ncm9vdnkKQEAgLTAsMCArMSwyNyBAQAorcGFja2FnZSBncm9vdnkKKworCitjbGFzcyBCYXNlNjRUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCB0ZXN0Q29kZWMoKSB7CisgICAgICAgIGRlZiB0ZXN0U3RyaW5nID0iwqcxMjM0NTY3ODkwLT3CsSFAwqNcJCVeJiooKV8rcXdlcnR5dWlvcFtdUVdFUlRZVUlPUHt9YXNkZmdoamtsOydcXEFTREZHSEpLTDpcInxgenhjdmJubSwuL35aWENWQk5NPD4/XHUwMDAzXHUwMGZmXHUwMGYwXHUwMDBmIgorCisgICAgICAgIC8vIGdldCBhIGJ5dGUgYXJyYXkgdXNpbmcgdGhlIGxlYXN0IHNpZ25pZmljYW50IGVpZ3RoIGJpdHMgb2YgZWFjaCBjYWhhcmFjdGVyCisgICAgICAgICAgIGRlZiB0ZXN0Qnl0ZXMgPSB0ZXN0U3RyaW5nLmdldEJ5dGVzKCJJU08tODg1OS0xIikKKworICAgICAgICAgICAvLyB0dXJuIHRoZSBieXRlcyBiYWNrIGludG8gYSBzdHJpbmcgZm9yIGxhdGVyIGNvbXBhcmlzb24KKyAgICAgICAgICAgIHRlc3RTdHJpbmcgPSBuZXcgU3RyaW5nKHRlc3RCeXRlcywgIklTTy04ODU5LTEiKQorCisgICAgICAgICAgICAvLyBlbmNvZGUgdGhlIGJ5dGVzIGFzIGJhc2U2NC4gVGhpcyBwcm9kdWNlcyBhIFdyaXRhYmxlIG9iamVjdCBjb252ZXJ0IGl0IHRvIGEgU3RyaW5nCisgICAgICAgICAgICBkZWYgZW5jb2RlZEJ5dGVzID0gdGVzdEJ5dGVzLmVuY29kZUJhc2U2NCgpLnRvU3RyaW5nKCkKKworICAgICAgICAgICAgLy8gZGVjb2RlIHRoZSBiYXNlNjQgYmFjayB0byBhIGJ5dGUgYXJyYXkKKyAgICAgICAgICAgIGRlZiBkZWNvZGVkQnl0ZXMgPSBlbmNvZGVkQnl0ZXMuZGVjb2RlQmFzZTY0KCkKKworICAgICAgICAgICAgLy8gdHVybiB0aGUgYnl0ZSBhcnJheSBiYWNrIHRvIGEgU3RyaW5nIGZvciBjYW9tcGFyaXNvbgorICAgICAgICAgICAgZGVmIGRlY29kZWRTdHJpbmcgPSBuZXcgU3RyaW5nKGRlY29kZWRCeXRlcywgIklTTy04ODU5LTEiKQorCisgICAgICAgICAgICBhc3NlcnQgZGVjb2RlZFN0cmluZy5lcXVhbHModGVzdFN0cmluZykKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQmluYXJ5U3RyZWFtc1Rlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9CaW5hcnlTdHJlYW1zVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTJmMzRlMwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQmluYXJ5U3RyZWFtc1Rlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTUxIEBACisvKioNCisgKiBUZXN0IGNhc2UgZm9yIERlZmF1bHRHcm9vdnlNZXRob2RzIGludm9sdmluZyBPYmplY3Qgc3RyZWFtcyBhbmQgZGF0YSBzdHJlYW1zLg0KKyAqDQorICogQGF1dGhvciBNYXJ0aW4gQy4gTWFydGluDQorICovDQorY2xhc3MgQmluYXJ5U3RyZWFtc1Rlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7DQorDQorICAgIHZvaWQgdGVzdE5ld09iamVjdFN0cmVhbSgpIHsNCisgICAgICAgIGRlZiB0ZW1wMSA9IHRlbXBGaWxlDQorICAgICAgICBkZWYgb29zID0gdGVtcDEubmV3T2JqZWN0T3V0cHV0U3RyZWFtKCkNCisNCisgICAgICAgIC8vIEZvciBmdW4sIGxldCdzIHRyeSBzdG9yaW5nICYgcmVzdG9yaW5nIGEgY2lyY3VsYXIgbGlzdC4NCisgICAgICAgIGRlZiB3cml0ZUZpcnN0ID0gWzU1LCBudWxsXQ0KKyAgICAgICAgZGVmIHdyaXRlU2Vjb25kID0gWzc4LCB3cml0ZUZpcnN0XQ0KKyAgICAgICAgd3JpdGVGaXJzdFsxXSA9IHdyaXRlU2Vjb25kDQorDQorICAgICAgICBvb3Mud3JpdGVPYmplY3Qod3JpdGVGaXJzdCkNCisgICAgICAgIG9vcy5jbG9zZSgpDQorDQorICAgICAgICBkZWYgb2lzID0gdGVtcDEubmV3T2JqZWN0SW5wdXRTdHJlYW0oKQ0KKyAgICAgICAgZGVmIHJlYWRGaXJzdCA9IG9pcy5yZWFkT2JqZWN0KCkNCisgICAgICAgIGFzc2VydCByZWFkRmlyc3QuZ2V0Q2xhc3MoKSA9PSBqYXZhLnV0aWwuQXJyYXlMaXN0DQorICAgICAgICBhc3NlcnQgcmVhZEZpcnN0WzBdID09IDU1DQorICAgICAgICBhc3NlcnQgcmVhZEZpcnN0WzFdWzBdID09IDc4DQorICAgICAgICBhc3NlcnQgcmVhZEZpcnN0WzFdWzFdID09IHJlYWRGaXJzdA0KKyAgICAgICAgb2lzLmNsb3NlKCkNCisgICAgfQ0KKw0KKyAgICB2b2lkIHRlc3RXaXRoT2JqZWN0U3RyZWFtKCkgew0KKyAgICAgICAgZGVmIHRlbXAyID0gdGVtcEZpbGUNCisgICAgICAgIHRlbXAyLndpdGhPYmplY3RPdXRwdXRTdHJlYW0geyBvb3MgLT4NCisgICAgICAgICAgICBvb3Mud3JpdGVJbnQoMTIzNDUpDQorICAgICAgICAgICAgb29zLndyaXRlT2JqZWN0KCJZb2lua3MhIikNCisgICAgICAgICAgICBvb3Mud3JpdGVPYmplY3QobmV3IERhdGUoMTE3MDQ2NjU1MDc1NSkpDQorICAgICAgICB9DQorDQorICAgICAgICB0ZW1wMi53aXRoT2JqZWN0SW5wdXRTdHJlYW0geyBvaXMgLT4NCisgICAgICAgICAgICBhc3NlcnQgb2lzLnJlYWRJbnQoKSA9PSAxMjM0NTsNCisgICAgICAgICAgICBhc3NlcnQgb2lzLnJlYWRPYmplY3QoKSA9PSAiWW9pbmtzISINCisgICAgICAgICAgICBhc3NlcnQgb2lzLnJlYWRPYmplY3QoKSA9PSBuZXcgRGF0ZSgxMTcwNDY2NTUwNzU1KQ0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHZvaWQgdGVzdE5ld0RhdGFTdHJlYW0oKSB7DQorICAgICAgICBkZWYgdGVtcDMgPSB0ZW1wRmlsZQ0KKyAgICAgICAgZGVmIGRvcyA9IHRlbXAzLm5ld0RhdGFPdXRwdXRTdHJlYW0oKQ0KKyAgICAgICAgZG9zLndyaXRlSW50KDB4Nzc2NTQzMjEpDQorICAgICAgICBkb3Mud3JpdGVDaGFycygiTWlsZXMiKQ0KKyAgICAgICAgZG9zLmNsb3NlKCkNCisNCisgICAgICAgIHRlbXAzLndpdGhJbnB1dFN0cmVhbSB7IGlzIC0+DQorICAgICAgICAgICAgZGVmIGRhdGEgPSBuZXcgYnl0ZVs0KzUqMl0NCisgICAgICAgICAgICBpcy5yZWFkKGRhdGEpDQorICAgICAgICAgICAgYnl0ZVtdIGV4cGVjdGVkID0gWzB4NzcsIDB4NjUsIDB4NDMsIDB4MjEsIDAsICdNJywgMCwgJ2knLCAwLCAnbCcsIDAsICdlJywgMCwgJ3MnXQ0KKyAgICAgICAgICAgIGFzc2VydCBkYXRhIGFzIExpc3QgPT0gZXhwZWN0ZWQgYXMgTGlzdA0KKyAgICAgICAgICAgIGFzc2VydCBpcy5yZWFkKCkgPT0gLTENCisgICAgICAgIH0NCisNCisgICAgICAgIGRlZiBkaXMgPSB0ZW1wMy5uZXdEYXRhSW5wdXRTdHJlYW0oKQ0KKyAgICAgICAgYXNzZXJ0IGRpcy5yZWFkSW50KCkgPT0gMHg3NzY1NDMyMQ0KKyAgICAgICAgIk1pbGVzIi5lYWNoIHsgYXNzZXJ0IGRpcy5yZWFkQ2hhcigpID09IGl0IH0NCisgICAgICAgIGRpcy5jbG9zZSgpDQorICAgIH0NCisNCisgICAgdm9pZCB0ZXN0V2l0aERhdGFTdHJlYW0oKSB7DQorICAgICAgICBkZWYgdGVtcDQgPSB0ZW1wRmlsZQ0KKyAgICAgICAgdGVtcDQud2l0aERhdGFPdXRwdXRTdHJlYW0geyBkb3MgLT4NCisgICAgICAgICAgICBkb3Mud3JpdGVJbnQoMHgxMjM0NTY3OCkNCisgICAgICAgICAgICBkb3Mud3JpdGVDaGFycygiQnViYmEiKQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgdGVtcDQud2l0aElucHV0U3RyZWFtIHsgaXMgLT4NCisgICAgICAgICAgICBkZWYgZGF0YSA9IG5ldyBieXRlWzQrNSoyXQ0KKyAgICAgICAgICAgIGlzLnJlYWQoZGF0YSkNCisgICAgICAgICAgICBieXRlW10gZXhwZWN0ZWQgPSBbMHgxMiwgMHgzNCwgMHg1NiwgMHg3OCwgMCwgJ0InLCAwLCAndScsIDAsICdiJywgMCwgJ2InLCAwLCAnYSddDQorICAgICAgICAgICAgYXNzZXJ0IGRhdGEgYXMgTGlzdCA9PSBleHBlY3RlZCBhcyBMaXN0DQorICAgICAgICAgICAgYXNzZXJ0IGlzLnJlYWQoKSA9PSAtMQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgdGVtcDQud2l0aERhdGFJbnB1dFN0cmVhbSB7IGRpcyAtPg0KKyAgICAgICAgICAgIGFzc2VydCBkaXMucmVhZEludCgpID09IDB4MTIzNDU2NzgNCisgICAgICAgICAgICAiQnViYmEiLmVhY2ggeyBhc3NlcnQgZGlzLnJlYWRDaGFyKCkgPT0gaXQgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHZvaWQgbWFudWFsVGVzdFJhd1NvY2tldHNQcm9jZXNzaW5nKCkgew0KKyAgICAgICAgZGVmIHNlcnZlcg0KKyAgICAgICAgZGVmIHBvcnQgPSA5OTkNCisgICAgICAgIFRocmVhZC5zdGFydHsNCisgICAgICAgICAgICBzZXJ2ZXIgPSBuZXcgU2VydmVyU29ja2V0KHBvcnQpDQorICAgICAgICAgICAgc2VydmVyLmFjY2VwdCgpIHsgc29ja2V0IC0+DQorICAgICAgICAgICAgICAgIHNvY2tldC53aXRoU3RyZWFtcyB7IGlucHV0LCBvdXRwdXQgLT4NCisgICAgICAgICAgICAgICAgICAgIGRlZiBvaXMgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oaW5wdXQpDQorICAgICAgICAgICAgICAgICAgICBkZWYgb29zID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShvdXRwdXQpDQorICAgICAgICAgICAgICAgICAgICBkZWYgYXJnMSA9IG9pcy5yZWFkT2JqZWN0KCkNCisgICAgICAgICAgICAgICAgICAgIGRlZiBhcmcyID0gb2lzLnJlYWRPYmplY3QoKQ0KKyAgICAgICAgICAgICAgICAgICAgb29zIDw8IGFyZzEgKyBhcmcyDQorICAgICAgICAgICAgICAgICAgICBvaXMuY2xvc2UoKQ0KKyAgICAgICAgICAgICAgICAgICAgb29zLmNsb3NlKCkNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIGRlZiByZXN1bHQNCisgICAgICAgIGRlZiBjbGllbnQgPSBuZXcgU29ja2V0KCJsb2NhbGhvc3QiLCBwb3J0KQ0KKyAgICAgICAgY2xpZW50LndpdGhTdHJlYW1zeyBpbnB1dCwgb3V0cHV0IC0+DQorICAgICAgICAgICAgZGVmIG9vcyA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0ob3V0cHV0KQ0KKyAgICAgICAgICAgIGRlZiBvaXMgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oaW5wdXQpDQorICAgICAgICAgICAgb29zIDw8IDEwMDANCisgICAgICAgICAgICBvb3MgPDwgMjQNCisgICAgICAgICAgICByZXN1bHQgPSBvaXMucmVhZE9iamVjdCgpDQorICAgICAgICAgICAgb2lzLmNsb3NlKCkNCisgICAgICAgICAgICBvb3MuY2xvc2UoKQ0KKyAgICAgICAgfQ0KKyAgICAgICAgY2xpZW50LmNsb3NlKCkNCisgICAgICAgIHNlcnZlci5jbG9zZSgpDQorICAgICAgICBhc3NlcnQgcmVzdWx0ID09IDEwMjQNCisgICAgfQ0KKw0KKyAgICB2b2lkIG1hbnVhbFRlc3RPYmplY3RTb2NrZXRzUHJvY2Vzc2luZygpIHsNCisgICAgICAgIGRlZiBzZXJ2ZXINCisgICAgICAgIGRlZiBwb3J0ID0gOTk5DQorICAgICAgICBUaHJlYWQuc3RhcnR7DQorICAgICAgICAgICAgc2VydmVyID0gbmV3IFNlcnZlclNvY2tldChwb3J0KQ0KKyAgICAgICAgICAgIHNlcnZlci5hY2NlcHQoKSB7IHNvY2tldCAtPg0KKyAgICAgICAgICAgICAgICBzb2NrZXQud2l0aE9iamVjdFN0cmVhbXMgeyBvaXMsIG9vcyAtPg0KKyAgICAgICAgICAgICAgICAgICAgZGVmIGFyZzEgPSBvaXMucmVhZE9iamVjdCgpDQorICAgICAgICAgICAgICAgICAgICBkZWYgYXJnMiA9IG9pcy5yZWFkT2JqZWN0KCkNCisgICAgICAgICAgICAgICAgICAgIG9vcyA8PCBhcmcxICsgYXJnMg0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgZGVmIHJlc3VsdA0KKyAgICAgICAgZGVmIGNsaWVudCA9IG5ldyBTb2NrZXQoImxvY2FsaG9zdCIsIHBvcnQpDQorICAgICAgICBjbGllbnQud2l0aE9iamVjdFN0cmVhbXN7IG9pcywgb29zIC0+DQorICAgICAgICAgICAgb29zIDw8IDEwMDANCisgICAgICAgICAgICBvb3MgPDwgMjQNCisgICAgICAgICAgICByZXN1bHQgPSBvaXMucmVhZE9iamVjdCgpDQorICAgICAgICB9DQorICAgICAgICBjbGllbnQuY2xvc2UoKQ0KKyAgICAgICAgc2VydmVyLmNsb3NlKCkNCisgICAgICAgIGFzc2VydCByZXN1bHQgPT0gMTAyNA0KKyAgICB9DQorDQorICAgIHByaXZhdGUgRmlsZSBnZXRUZW1wRmlsZSgpIHsNCisgICAgICAgIGRlZiB0ZW1wID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiQmluYXJ5U3RyZWFtc1Rlc3RGaWxlIiwgIi5kYXQiKQ0KKyAgICAgICAgdGVtcC5kZWxldGVPbkV4aXQoKQ0KKyAgICAgICAgcmV0dXJuIHRlbXANCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0JpbmRpbmdUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQmluZGluZ1Rlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MDQ0M2IKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0JpbmRpbmdUZXN0Lmdyb292eQpAQCAtMCwwICsxLDIxIEBACitwYWNrYWdlIGdyb292eQorCitjbGFzcyBCaW5kaW5nVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIHZvaWQgdGVzdFByb3BlcnRpZXMoKSB7CisgICAgCWRlZiBiID0gbmV3IEJpbmRpbmcoKQorICAgIAliLnNldFZhcmlhYmxlKCJmb28iLCAxMjMpCisgICAgCQorICAgIAlhc3NlcnQgYi5mb28gPT0gMTIzCisgICAgCQorICAgIAliLmJhciA9IDQ1NgorICAgIAkKKyAgICAJYXNzZXJ0IGIuZ2V0VmFyaWFibGUoImJhciIpID09IDQ1NgorICAgIAlhc3NlcnQgYlsiYmFyIl0gPT0gNDU2CisgICAgCQorICAgIAliWyJhLmIuYyJdID0gJ2FiYycKKyAgICAJCisgICAgCWFzc2VydCBiLmdldFZhcmlhYmxlKCJhLmIuYyIpID09ICdhYmMnCisgICAgCWFzc2VydCBiWyJhLmIuYyJdID09ICdhYmMnCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9CaXRTZXRUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQml0U2V0VGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk4MWRiZAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQml0U2V0VGVzdC5ncm9vdnkKQEAgLTAsMCArMSwxNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBncm9vdnkKKworY2xhc3MgQml0U2V0VGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNleworCisgICAgdm9pZCB0ZXN0U3Vic2NyaXB0T3BlcmF0b3IoKSB7CisgICAgICAgIGRlZiBiaXRTZXQgPSBuZXcgQml0U2V0KCkKKworICAgICAgICBiaXRTZXRbMl0gPSB0cnVlCisgICAgICAgIGJpdFNldFszXSA9IHRydWUKKworICAgICAgICBhc3NlcnRCaXRGYWxzZSBiaXRTZXQsIDAKKyAgICAgICAgYXNzZXJ0Qml0RmFsc2UgYml0U2V0LCAxCisgICAgICAgIGFzc2VydEJpdFRydWUgIGJpdFNldCwgMgorICAgICAgICBhc3NlcnRCaXRUcnVlICBiaXRTZXQsIDMKKyAgICAgICAgYXNzZXJ0Qml0RmFsc2UgYml0U2V0LCA0CisgICAgfQorCisgICAgdm9pZCB0ZXN0U3Vic2NyaXB0QXNzaWdubWVudFdpdGhSYW5nZSgpIHsKKyAgICAgICAgZGVmIGJpdFNldCA9IG5ldyBCaXRTZXQoKQorCisgICAgICAgIGJpdFNldFsyLi40XSA9IHRydWUKKworICAgICAgICBhc3NlcnRCaXRGYWxzZSBiaXRTZXQsIDAKKyAgICAgICAgYXNzZXJ0Qml0RmFsc2UgYml0U2V0LCAxCisgICAgICAgIGFzc2VydEJpdFRydWUgIGJpdFNldCwgMgorICAgICAgICBhc3NlcnRCaXRUcnVlICBiaXRTZXQsIDMKKyAgICAgICAgYXNzZXJ0Qml0VHJ1ZSAgYml0U2V0LCA0CisgICAgICAgIGFzc2VydEJpdEZhbHNlIGJpdFNldCwgNQorICAgIH0KKworICAgIHZvaWQgdGVzdFN1YnNjcmlwdEFzc2lnbm1lbnRXaXRoUmV2ZXJzZVJhbmdlKCkgeworICAgICAgICBkZWYgYml0U2V0ID0gbmV3IEJpdFNldCgpCisKKyAgICAgICAgYml0U2V0WzQuLjJdID0gdHJ1ZQorCisgICAgICAgIGFzc2VydEJpdEZhbHNlIGJpdFNldCwgMAorICAgICAgICBhc3NlcnRCaXRGYWxzZSBiaXRTZXQsIDEKKyAgICAgICAgYXNzZXJ0Qml0VHJ1ZSAgYml0U2V0LCAyCisgICAgICAgIGFzc2VydEJpdFRydWUgIGJpdFNldCwgMworICAgICAgICBhc3NlcnRCaXRUcnVlICBiaXRTZXQsIDQKKyAgICAgICAgYXNzZXJ0Qml0RmFsc2UgYml0U2V0LCA1CisgICAgfQorCisgICAgdm9pZCB0ZXN0U3Vic2NyaXB0QWNjZXNzV2l0aFJhbmdlKCkgeworICAgICAgICBkZWYgYml0U2V0ID0gbmV3IEJpdFNldCgpCisKKyAgICAgICAgYml0U2V0WzddID0gdHJ1ZQorICAgICAgICBiaXRTZXRbMTFdID0gdHJ1ZQorCisgICAgICAgIGRlZiBzdWJTZXQgPSBiaXRTZXRbNS4uMTFdCisKKyAgICAgICAgYXNzZXJ0VHJ1ZSAnc3ViU2V0IHNob3VsZCBoYXZlIGJlZW4gYSBCaXRTZXQnLCBzdWJTZXQgaW5zdGFuY2VvZiBCaXRTZXQKKworICAgICAgICBhc3NlcnROb3RTYW1lICdzdWJTZXQgc2hvdWxkIG5vdCBoYXZlIGJlZW4gdGhlIHNhbWUgb2JqZWN0JywgYml0U2V0LCBzdWJTZXQKKworICAgICAgICAvLyB0aGUgbGFzdCB0cnVlIGJpdCBzaG91bGQgYmUgYXQgaW5kZXggNgorICAgICAgICBhc3NlcnRFcXVhbHMgJ3Jlc3VsdCBoYWQgd3JvbmcgbG9naWNhbCBzaXplJywgNywgc3ViU2V0Lmxlbmd0aCgpCisKKyAgICAgICAgYXNzZXJ0Qml0RmFsc2Ugc3ViU2V0LCAwCisgICAgICAgIGFzc2VydEJpdEZhbHNlIHN1YlNldCwgMQorICAgICAgICBhc3NlcnRCaXRUcnVlICBzdWJTZXQsIDIKKyAgICAgICAgYXNzZXJ0Qml0RmFsc2Ugc3ViU2V0LCAzCisgICAgICAgIGFzc2VydEJpdEZhbHNlIHN1YlNldCwgNAorICAgICAgICBhc3NlcnRCaXRGYWxzZSBzdWJTZXQsIDUKKyAgICAgICAgYXNzZXJ0Qml0VHJ1ZSAgc3ViU2V0LCA2CisgICAgfQorCisgICAgdm9pZCB0ZXN0U3Vic2NyaXB0QWNjZXNzV2l0aFJldmVyc2VSYW5nZSgpIHsKKyAgICAgICAgZGVmIGJpdFNldCA9IG5ldyBCaXRTZXQoKQorCisgICAgICAgIGJpdFNldFszXSA9IHRydWUKKyAgICAgICAgYml0U2V0WzRdID0gdHJ1ZQorCisgICAgICAgIGRlZiBzdWJTZXQgPSBiaXRTZXRbOC4uMl0KKworICAgICAgICBhc3NlcnRUcnVlICdzdWJTZXQgc2hvdWxkIGhhdmUgYmVlbiBhIEJpdFNldCcsIHN1YlNldCBpbnN0YW5jZW9mIEJpdFNldAorCisgICAgICAgIGFzc2VydE5vdFNhbWUgJ3N1YlNldCBzaG91bGQgbm90IGhhdmUgYmVlbiB0aGUgc2FtZSBvYmplY3QnLCBiaXRTZXQsIHN1YlNldAorCisgICAgICAgIC8vIHRoZSBsYXN0IHRydWUgYml0IHNob3VsZCBiZSBhdCBpbmRleCA1CisgICAgICAgIGFzc2VydEVxdWFscyAncmVzdWx0IGhhZCB3cm9uZyBsb2dpY2FsIHNpemUnLCA2LCBzdWJTZXQubGVuZ3RoKCkKKworICAgICAgICBhc3NlcnRCaXRGYWxzZSBzdWJTZXQsIDAKKyAgICAgICAgYXNzZXJ0Qml0RmFsc2Ugc3ViU2V0LCAxCisgICAgICAgIGFzc2VydEJpdEZhbHNlIHN1YlNldCwgMgorICAgICAgICBhc3NlcnRCaXRGYWxzZSBzdWJTZXQsIDMKKyAgICAgICAgYXNzZXJ0Qml0VHJ1ZSAgc3ViU2V0LCA0CisgICAgICAgIGFzc2VydEJpdFRydWUgIHN1YlNldCwgNQorICAgICAgICBhc3NlcnRCaXRGYWxzZSBzdWJTZXQsIDYKKyAgICB9CisKKyAgICB2b2lkIHRlc3RBbmQoKSB7CisgICAgICAgIGRlZiBhID0gbmV3IEJpdFNldCgpCisgICAgICAgIGFbMl0gPSB0cnVlCisgICAgICAgIGFbM10gPSB0cnVlCisgICAgICAgIGRlZiBiID0gbmV3IEJpdFNldCgpCisgICAgICAgIGJbMV0gPSB0cnVlCisgICAgICAgIGJbM10gPSB0cnVlCisgICAgICAgIGRlZiBjID0gYSAmIGIKKyAgICAgICAgYXNzZXJ0Qml0RmFsc2UgYywgMAorICAgICAgICBhc3NlcnRCaXRGYWxzZSBjLCAxCisgICAgICAgIGFzc2VydEJpdEZhbHNlIGMsIDIKKyAgICAgICAgYXNzZXJ0Qml0VHJ1ZSAgYywgMworICAgIH0KKworICAgIHZvaWQgdGVzdE9yKCkgeworICAgICAgICBkZWYgYSA9IG5ldyBCaXRTZXQoKQorICAgICAgICBhWzJdID0gdHJ1ZQorICAgICAgICBhWzNdID0gdHJ1ZQorICAgICAgICBkZWYgYiA9IG5ldyBCaXRTZXQoKQorICAgICAgICBiWzFdID0gdHJ1ZQorICAgICAgICBiWzNdID0gdHJ1ZQorICAgICAgICBkZWYgYyA9IGEgfCBiCisgICAgICAgIGFzc2VydEJpdEZhbHNlIGMsIDAKKyAgICAgICAgYXNzZXJ0Qml0VHJ1ZSAgYywgMQorICAgICAgICBhc3NlcnRCaXRUcnVlICBjLCAyCisgICAgICAgIGFzc2VydEJpdFRydWUgIGMsIDMKKyAgICB9CisKKyAgICB2b2lkIHRlc3RYb3IoKSB7CisgICAgICAgIGRlZiBhID0gbmV3IEJpdFNldCgpCisgICAgICAgIGFbMl0gPSB0cnVlCisgICAgICAgIGFbM10gPSB0cnVlCisgICAgICAgIGRlZiBiID0gbmV3IEJpdFNldCgpCisgICAgICAgIGJbMV0gPSB0cnVlCisgICAgICAgIGJbM10gPSB0cnVlCisgICAgICAgIGRlZiBjID0gYSBeIGIKKyAgICAgICAgYXNzZXJ0Qml0RmFsc2UgYywgMAorICAgICAgICBhc3NlcnRCaXRUcnVlICBjLCAxCisgICAgICAgIGFzc2VydEJpdFRydWUgIGMsIDIKKyAgICAgICAgYXNzZXJ0Qml0RmFsc2UgYywgMworICAgIH0KKworICAgIHZvaWQgdGVzdEJpdHdpc2VOZWdhdGUoKSB7CisgICAgICAgIGRlZiBhID0gbmV3IEJpdFNldCgpCisgICAgICAgIGFbMl0gPSB0cnVlCisgICAgICAgIGFbM10gPSB0cnVlCisgICAgICAgIGRlZiBiID0gfmEKKyAgICAgICAgYXNzZXJ0Qml0VHJ1ZSAgYiwgMAorICAgICAgICBhc3NlcnRCaXRUcnVlICBiLCAxCisgICAgICAgIGFzc2VydEJpdEZhbHNlIGIsIDIKKyAgICAgICAgYXNzZXJ0Qml0RmFsc2UgYiwgMworICAgIH0KKworICAgIHByaXZhdGUgYXNzZXJ0Qml0VHJ1ZShiaXRzZXQsIGluZGV4KSB7CisgICAgICAgIGFzc2VydFRydWUgICdpbmRleCAnICsgaW5kZXggKyAnIHNob3VsZCBoYXZlIGJlZW4gdHJ1ZScsICBiaXRzZXRbaW5kZXhdCisgICAgfQorCisgICAgcHJpdmF0ZSBhc3NlcnRCaXRGYWxzZShiaXRzZXQsIGluZGV4KSB7CisgICAgICAgIGFzc2VydEZhbHNlICdpbmRleCAnICsgaW5kZXggKyAnIHNob3VsZCBoYXZlIGJlZW4gZmFsc2UnLCBiaXRzZXRbaW5kZXhdCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9CcmVha0NvbnRpbnVlTGFiZWxUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQnJlYWtDb250aW51ZUxhYmVsVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAzMmU0MgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQnJlYWtDb250aW51ZUxhYmVsVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwxMDYgQEAKK3BhY2thZ2UgZ3Jvb3Z5CisKKy8qKgorICogdG9kbzogYWRkIEJyZWFrQ29udGludWVMYWJlbFdpdGhDbG9zdXJlVGVzdCAod2hlbiBicmVhayBpcyB1c2VkIHRvIHJldHVybiBmcm9tIGEgQ2xvc3VyZSkKKworICogQGF1dGhvciBEaWVyayBLb2VuaWcKKyAqLworY2xhc3MgQnJlYWtDb250aW51ZUxhYmVsVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIHZvaWQgdGVzdERlY2xhcmVTaW1wbGVMYWJlbCgpIHsKKyAgICAgICAgbGFiZWxfMTogYXNzZXJ0IHRydWUKKyAgICAgICAgbGFiZWxfMjoKKyAgICAgICAgYXNzZXJ0IHRydWUKKyAgICB9CisgICAgdm9pZCB0ZXN0QnJlYWtMYWJlbEluU2ltcGxlRm9yTG9vcCgpIHsKKyAgICAgICAgbGFiZWxfMTogZm9yIChpIGluIFsxXSkgeworICAgICAgICAgICAgYnJlYWsgbGFiZWxfMQorICAgICAgICAgICAgYXNzZXJ0IGZhbHNlCisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHRlc3RCcmVha0xhYmVsSW5OZXN0ZWRGb3JMb29wKCkgeworICAgICAgICBsYWJlbDogZm9yIChpIGluIFsxXSkgeworICAgICAgICAgICAgZm9yIChqIGluIFsxXSl7CisgICAgICAgICAgICAgICAgYnJlYWsgbGFiZWwKKyAgICAgICAgICAgICAgICBhc3NlcnQgZmFsc2UsICdkaWQgbm90IGJyZWFrIGlubmVyIGxvb3AnCisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnQgZmFsc2UsICdkaWQgbm90IGJyZWFrIG91dGVyIGxvb3AnCisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHRlc3RVbmxhYmVsbGVkQnJlYWtJbk5lc3RlZEZvckxvb3AoKSB7CisgICAgICAgIGRlZiByZWFjaGVkID0gZmFsc2UKKyAgICAgICAgZm9yIChpIGluIFsxXSkgeworICAgICAgICAgICAgZm9yIChqIGluIFsxXSl7CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBhc3NlcnQgZmFsc2UsICdkaWQgbm90IGJyZWFrIGlubmVyIGxvb3AnCisgICAgICAgICAgICB9CisgICAgICAgICAgICByZWFjaGVkID0gdHJ1ZQorICAgICAgICB9CisgICAgICAgIGFzc2VydCByZWFjaGVkLCAnbXVzdCBub3QgYnJlYWsgb3V0ZXIgbG9vcCcKKyAgICB9CisKKyAgICB2b2lkIHRlc3RCcmVha0xhYmVsSW5TaW1wbGVXaGlsZUxvb3AoKSB7CisgICAgICAgIGxhYmVsXzE6IHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBicmVhayBsYWJlbF8xCisgICAgICAgICAgICBhc3NlcnQgZmFsc2UKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgdGVzdEJyZWFrTGFiZWxJbk5lc3RlZFdoaWxlTG9vcCgpIHsKKyAgICAgICAgZGVmIGNvdW50ID0gMAorICAgICAgICBsYWJlbDogd2hpbGUgKGNvdW50IDwgMSkgeworICAgICAgICAgICAgY291bnQrKworICAgICAgICAgICAgd2hpbGUgKHRydWUpeworICAgICAgICAgICAgICAgIGJyZWFrIGxhYmVsCisgICAgICAgICAgICAgICAgYXNzZXJ0IGZhbHNlLCAnZGlkIG5vdCBicmVhayBpbm5lciBsb29wJworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0IGZhbHNlLCAnZGlkIG5vdCBicmVhayBvdXRlciBsb29wJworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCB0ZXN0QnJlYWtMYWJlbEluTmVzdGVkTWl4ZWRGb3JBbmRXaGlsZUxvb3AoKSB7CisgICAgICAgIGRlZiBjb3VudCA9IDAKKyAgICAgICAgbGFiZWxfMTogd2hpbGUgKGNvdW50IDwgMSkgeworICAgICAgICAgICAgY291bnQrKworICAgICAgICAgICAgZm9yIChpIGluIFsxXSl7CisgICAgICAgICAgICAgICAgYnJlYWsgbGFiZWxfMQorICAgICAgICAgICAgICAgIGFzc2VydCBmYWxzZSwgJ2RpZCBub3QgYnJlYWsgaW5uZXIgbG9vcCcKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydCBmYWxzZSwgJ2RpZCBub3QgYnJlYWsgb3V0ZXIgbG9vcCcKKyAgICAgICAgfQorICAgICAgICBsYWJlbF8yOiBmb3IgKGkgaW4gWzFdKSB7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSl7CisgICAgICAgICAgICAgICAgYnJlYWsgbGFiZWxfMgorICAgICAgICAgICAgICAgIGFzc2VydCBmYWxzZSwgJ2RpZCBub3QgYnJlYWsgaW5uZXIgbG9vcCcKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydCBmYWxzZSwgJ2RpZCBub3QgYnJlYWsgb3V0ZXIgbG9vcCcKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgdGVzdFVubGFiZWxsZWRDb250aW51ZUluTmVzdGVkRm9yTG9vcCgpIHsKKyAgICAgICAgZGVmIGxvZyA9ICcnCisgICAgICAgIGZvciAoaSBpbiBbMSwyXSkgeworICAgICAgICAgICAgbG9nICs9IGkKKyAgICAgICAgICAgIGZvciAoaiBpbiBbMyw0XSl7CisgICAgICAgICAgICAgICAgaWYgKGo9PTMpIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgbG9nICs9IGoKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMgJzE0MjQnLGxvZworICAgIH0KKworICAgIHZvaWQgdGVzdENvbnRpbnVlTGFiZWxJbk5lc3RlZEZvckxvb3AoKSB7CisgICAgICAgIGRlZiBsb2cgPSAnJworICAgICAgICBsYWJlbDogZm9yIChpIGluIFsxLDJdKSB7CisgICAgICAgICAgICBsb2cgKz0gaQorICAgICAgICAgICAgZm9yIChqIGluIFszLDRdKXsKKyAgICAgICAgICAgICAgICBpZiAoaj09NCkgY29udGludWUgbGFiZWwKKyAgICAgICAgICAgICAgICBsb2cgKz0gagorICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9nICs9ICduZXZlciByZWFjaGVkJworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscyAnMTMyMycsbG9nCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQ2FsbElubmVyQ2xhc3NDdG9yVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0NhbGxJbm5lckNsYXNzQ3RvclRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ODkyYTUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0NhbGxJbm5lckNsYXNzQ3RvclRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMzYgQEAKK3BhY2thZ2UgZ3Jvb3Z5CisKKy8qKgorICogQ2hlY2tzIHRoYXQgaXQncyBwb3NzaWJsZSB0byBjYWxsIGlubmVyIGNsYXNzZXMgY29uc3RydWN0b3IgZnJvbSBncm9vdnkKKyAqIEBhdXRob3IgR3VpbGxhdW1lIExhZm9yZ2UKKyAqLworY2xhc3MgQ2FsbElubmVyQ2xhc3NDdG9yVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIHZvaWQgdGVzdENhbGxDdG9yKCkgeworICAgICAgICBkZWYgdXNlciA9IG5ldyBncm9vdnkuT3V0ZXJVc2VyKCkKKyAgICAgICAgdXNlci5uYW1lID0gIkd1aWxsYXVtZSIKKyAgICAgICAgdXNlci5hZ2UgPSAyNworCisgICAgICAgIGFzc2VydCB1c2VyLm5hbWUgPT0gIkd1aWxsYXVtZSIKKyAgICAgICAgYXNzZXJ0IHVzZXIuYWdlID09IDI3CisgICAgfQorCisgICAgdm9pZCB0ZXN0Q2FsbElubmVyQ3RvcigpIHsKKyAgICAgICAgZGVmIGFkZHJlc3MgPSBuZXcgZ3Jvb3Z5Lk91dGVyVXNlci5Jbm5lckFkZHJlc3MoKQorICAgICAgICBhZGRyZXNzLmNpdHkgPSAiTWV1ZG9uIgorICAgICAgICBhZGRyZXNzLnppcGNvZGUgPSA5MjM2MAorCisgICAgICAgIGFzc2VydCBhZGRyZXNzLmNpdHkgPT0gIk1ldWRvbiIKKyAgICAgICAgYXNzZXJ0IGFkZHJlc3MuemlwY29kZSA9PSA5MjM2MAorICAgIH0KKworICAgIHZvaWQgdGVzdENhbGxJbm5lcklubmVyQ3RvcigpIHsKKyAgICAgICAgZGVmIGFkZHJlc3MgPSBuZXcgZ3Jvb3Z5Lk91dGVyVXNlci5Jbm5lckFkZHJlc3MuU3RyZWV0KCkKKyAgICAgICAgYWRkcmVzcy5uYW1lID0gInJ1ZSBkZSBsYSBwYWl4IgorICAgICAgICBhZGRyZXNzLm51bWJlciA9IDE3CisKKyAgICAgICAgYXNzZXJ0IGFkZHJlc3MubmFtZSA9PSAicnVlIGRlIGxhIHBhaXgiCisgICAgICAgIGFzc2VydCBhZGRyZXNzLm51bWJlciA9PSAxNworICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQ2FzdFRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9DYXN0VGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdiNzBiOAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQ2FzdFRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTIyIEBACitwYWNrYWdlIGdyb292eQorCitjbGFzcyBDYXN0VGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIFNob3J0IGIgPSAxCisgICAgCisgICAgdm9pZCB0ZXN0Q2FzdCgpIHsKKyAgICAgICAgZGVmIHggPSAoU2hvcnQpIDUKKworICAgICAgICBwcmludGxuKCJDYXN0IEludGVnZXIgdG8gJHt4fSB3aXRoIHR5cGUgJHt4LmNsYXNzfSIpCisgICAgICAgIAorICAgICAgICBhc3NlcnQgeC5jbGFzcyA9PSBTaG9ydAorICAgICAgICAKKyAgICAgICAgbWV0aG9kV2l0aFNob3J0KHgpCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdEltcGxpY2l0Q2FzdCgpIHsKKyAgICAgICAgU2hvcnQgeCA9IDYKKyAgICAgICAgCisgICAgICAgIHByaW50bG4oIkNyZWF0ZWQgJHt4fSB3aXRoIHR5cGUgJHt4LmNsYXNzfSIpCisgICAgICAgIAorICAgICAgICBhc3NlcnQgeC5jbGFzcyA9PSBTaG9ydCAsICJUeXBlIGlzICR7eC5jbGFzc30iCisgICAgICAgIAorCQltZXRob2RXaXRoU2hvcnQoeCkKKyAgICAgICAgCisgICAgICAgIHggPSA3CisgICAgICAgIAorICAgICAgICBwcmludGxuKCJVcGRhdGVkICR7eH0gd2l0aCB0eXBlICR7eC5jbGFzc30iKQorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IHguY2xhc3MgPT0gU2hvcnQgLCAiVHlwZSBpcyAke3guY2xhc3N9IgorICAgIH0KKworICAgIHZvaWQgdGVzdEltcGxpY2l0Q2FzdE9mRmllbGQoKSB7CisKKyAgICAgICAgcHJpbnRsbigiRmllbGQgaXMgJHtifSB3aXRoIHR5cGUgJHtiLmNsYXNzfSIpCisgICAgICAgIAorICAgICAgICBhc3NlcnQgYi5jbGFzcyA9PSBTaG9ydCAsICJUeXBlIGlzICR7Yi5jbGFzc30iCisgICAgICAgIAorICAgICAgICBiID0gNQorICAgICAgICAKKyAgICAgICAgcHJpbnRsbigiVXBkYXRlZCBmaWVsZCAke2J9IHdpdGggdHlwZSAke2IuY2xhc3N9IikKKyAKKyAgICAgICAgYXNzZXJ0IGIuY2xhc3MgPT0gU2hvcnQgLCAiVHlwZSBpcyAke2IuY2xhc3N9IgorICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RJbnRDYXN0KCkgeworICAgICAgICBkZWYgaSA9IChJbnRlZ2VyKSAneCcKKyAgICAgICAgCisgICAgICAgIGFzc2VydCBpIGluc3RhbmNlb2YgSW50ZWdlcgorICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RDaGFyQ29tcGFyZSgpIHsKKyAgICAgICAgZGVmIGkgPSAoSW50ZWdlcikgJ3gnCisgICAgICAgIGRlZiBjID0gJ3gnCisgICAgICAgIAorICAgICAgICBhc3NlcnQgaSA9PSBjCisgICAgICAgIGFzc2VydCBpID09J3gnCisgICAgICAgIGFzc2VydCBjID09ICd4JworCQlhc3NlcnQgaSA9PSBpCisJCWFzc2VydCBjID09IGMKKworICAgICAgICBhc3NlcnQgJ3gnID09ICd4JworICAgICAgICBhc3NlcnQgJ3gnID09IGMKKyAgICAgICAgYXNzZXJ0ICd4JyA9PSBpCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdENoYXJDYXN0KCkgeworICAgICAgICBkZWYgYyA9IChDaGFyYWN0ZXIpICd4JworICAgICAgICAKKyAgICAgICAgYXNzZXJ0IGMgaW5zdGFuY2VvZiBDaGFyYWN0ZXIKKyAgICAgICAgCisgICAgICAgIGMgPSAoQ2hhcmFjdGVyKTEwCisgICAgICAgIAorICAgICAgICBhc3NlcnQgYyBpbnN0YW5jZW9mIENoYXJhY3RlcgorICAgIH0KKyAgICAKKyAgICB2b2lkIG1ldGhvZFdpdGhTaG9ydChTaG9ydCBzKSB7CisgICAgICAgIHByaW50bG4oIkNhbGxlZCB3aXRoICR7c30gd2l0aCB0eXBlICR7cy5jbGFzc30iKQorICAgICAgICBhc3NlcnQgcy5jbGFzcyA9PSBTaG9ydAorICAgIH0KKyAgICAKKyAgICB2b2lkIG1ldGhvZFdpdGhDaGFyKENoYXJhY3RlciB4KSB7CisgICAgICAgIHByaW50bG4oIkNhbGxlZCB3aXRoICR7eH0gd2l0aCB0eXBlICR7cy5jbGFzc30iKQorICAgICAgICAKKyAgICAgICAgZGVmIHRleHQgPSAidGV4dCIKKyAgICAgICAgZGVmIGlkeCA9IHRleHQuaW5kZXhPZih4KQorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IGlkeCA9PSAyCisgICAgfQorICAgIC8vIGJyCisgICAgdm9pZCB0ZXN0UHJpbWl0aXZlQ2FzdGluZygpIHsKKyAgICAgICAgZGVmIGQgPSAxLjIzCisgICAgICAgIGRlZiBpMSA9IChpbnQpZAorICAgICAgICBkZWYgaTIgPSAoSW50ZWdlcilkCisgICAgICAgIGFzc2VydCBpMS5jbGFzcy5uYW1lID09ICdqYXZhLmxhbmcuSW50ZWdlcicKKyAgICAgICAgYXNzZXJ0IGkyLmNsYXNzLm5hbWUgPT0gJ2phdmEubGFuZy5JbnRlZ2VyJworCisgICAgICAgIGRlZiBjaCA9IChjaGFyKSBpMQorICAgICAgICBhc3NlcnQgY2guY2xhc3MubmFtZSA9PSAnamF2YS5sYW5nLkNoYXJhY3RlcicKKworICAgICAgICBkZWYgZGQgPSAoZG91YmxlKWQKKyAgICAgICAgYXNzZXJ0IGRkLmNsYXNzLm5hbWUgPT0gJ2phdmEubGFuZy5Eb3VibGUnCisKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0QXNTZXQoKSB7CisgICAgCWRlZiBteVNldCA9IFsyLCAzLCA0LCAzXSBhcyBTb3J0ZWRTZXQKKyAgICAJYXNzZXJ0IG15U2V0IGluc3RhbmNlb2YgU29ydGVkU2V0CisgICAgCQorICAgIAkvLyBpZGVudGl0eSB0ZXN0CisgICAgCW15U2V0ID0ge30gYXMgU29ydGVkU2V0CisgICAgCWFzc2VydCBteVNldC5pcyAoIG15U2V0IGFzIFNvcnRlZFNldCApCisgICAgCQorICAgIAlteVNldCA9IFsyLCAzLCA0LCAzXSBhcyBTZXQKKyAgICAJYXNzZXJ0IG15U2V0IGluc3RhbmNlb2YgSGFzaFNldAorICAgIAkKKyAgICAgICAgLy8gaWRlbnRpdGl5IHRlc3QKKyAgICAJbXlTZXQgPSB7fSBhcyBTZXQKKyAgICAJYXNzZXJ0IG15U2V0LmlzICggbXlTZXQgYXMgU2V0ICkKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQ2F0ZWdvcnlUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQ2F0ZWdvcnlUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWI2Njk0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9DYXRlZ29yeVRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTM1IEBACitwYWNrYWdlIGdyb292eQorCitjbGFzcyBDYXRlZ29yeVRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICB2b2lkIHNldFVwKCkgeworICAgICAgICBkZWYgZHVtbXkgPSBudWxsCisgICAgICAgIENhdGVnb3J5VGVzdFByb3BlcnR5Q2F0ZWdvcnkuc2V0U29tZXRoaW5nKGR1bW15LCAnaGVsbG8nKQorICAgICAgICBDYXRlZ29yeVRlc3RIZWxwZXJQcm9wZXJ0eVJlcGxhY2VyLnNldEFQcm9wZXJ0eShkdW1teSwgJ2Fub3RoZXJWYWx1ZScpCisgICAgfQorCisgICAgdm9pZCB0ZXN0Q2F0ZWdvcmllcygpIHsKKyAgICAgICAgdXNlIChTdHJpbmdDYXRlZ29yeSkgeworICAgICAgICAgICAgYXNzZXJ0ICJTYW0iLmxvd2VyKCkgPT0gInNhbSI7CisgICAgICAgICAgICB1c2UgKEludGVnZXJDYXRlZ29yeS5jbGFzcykgeworICAgICAgICAgICAgICAgIGFzc2VydCAiU2FtIi5sb3dlcigpID09ICJzYW0iOworICAgICAgICAgICAgICAgIGFzc2VydCAxLmluYygpID09IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzaG91bGRGYWlsKE1pc3NpbmdNZXRob2RFeGNlcHRpb24sIHsgMS5pbmMoKSB9KTsKKyAgICAgICAgfQorICAgICAgICBzaG91bGRGYWlsKE1pc3NpbmdNZXRob2RFeGNlcHRpb24sIHsgIlNhbSIubG93ZXIoKSB9KTsKKyAgICB9CisKKyAgICB2b2lkIHRlc3RSZXR1cm5WYWx1ZVdpdGhVc2VDbGFzcygpIHsKKyAgICAgICAgZGVmIHJldHVyblZhbHVlID0gdXNlKFN0cmluZ0NhdGVnb3J5KSB7CisgICAgICAgICAgICAiR3JlZW4gRWdncyBBbmQgSGFtIi5sb3dlcigpCisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0ICJncmVlbiBlZ2dzIGFuZCBoYW0iID09IHJldHVyblZhbHVlCisgICAgfQorCisgICAgdm9pZCB0ZXN0UmV0dXJuVmFsdWVXaXRoVXNlTGlzdCgpIHsKKyAgICAgICAgZGVmIHJldHVyblZhbHVlID0gdXNlKFtTdHJpbmdDYXRlZ29yeSwgSW50ZWdlckNhdGVnb3J5XSkgeworICAgICAgICAgICAgIkdyZWVuIEVnZ3MgQW5kIEhhbSIubG93ZXIoKSArIDUuaW5jKCkKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQgImdyZWVuIGVnZ3MgYW5kIGhhbTYiID09IHJldHVyblZhbHVlCisgICAgfQorCisgICAgdm9pZCB0ZXN0Q2F0ZWdvcnlEZWZpbmVkUHJvcGVydGllcygpIHsKKyAgICAgICAgdXNlKENhdGVnb3J5VGVzdFByb3BlcnR5Q2F0ZWdvcnkpIHsKKyAgICAgICAgICAgIGFzc2VydCBnZXRTb21ldGhpbmcoKSA9PSAiaGVsbG8iCisgICAgICAgICAgICBhc3NlcnQgc29tZXRoaW5nID09ICJoZWxsbyIKKyAgICAgICAgICAgIHNvbWV0aGluZyA9ICJuaWhhbyIKKyAgICAgICAgICAgIGFzc2VydCBzb21ldGhpbmcgPT0gIm5paGFvIgorICAgICAgICB9CisKKyAgICAgICAgLy8gdGVzdCB0aGUgbmV3IHZhbHVlIGFnYWluIGluIGEgbmV3IGJsb2NrCisgICAgICAgIHVzZShDYXRlZ29yeVRlc3RQcm9wZXJ0eUNhdGVnb3J5KSB7CisgICAgICAgICAgICBhc3NlcnQgc29tZXRoaW5nID09ICJuaWhhbyIKKyAgICAgICAgfQorICAgIH0KKyAgCisgICAgdm9pZCB0ZXN0Q2F0ZWdvcnlSZXBsYWNlZFByb3BlcnR5QWNjZXNzTWV0aG9kKCkgeworICAgICAgICBkZWYgY3RoID0gbmV3IENhdGVnb3J5VGVzdEhlbHBlcigpCisgICAgICAgIGN0aC5hUHJvcGVydHkgPSAiYVZhbHVlIgorICAgICAgICBhc3NlcnQgY3RoLmFQcm9wZXJ0eSA9PSAiYVZhbHVlIgorICAgICAgICB1c2UgKENhdGVnb3J5VGVzdEhlbHBlclByb3BlcnR5UmVwbGFjZXIpIHsKKyAgICAgICAgICAgIGFzc2VydCBjdGguYVByb3BlcnR5ID09ICJhbm90aGVyVmFsdWUiCisgICAgICAgICAgICBjdGguYVByb3BlcnR5ID0gInRoaXMgaXMgYm9yaW5nIgorICAgICAgICAgICAgYXNzZXJ0IGN0aC5hUHJvcGVydHkgPT0gInRoaXMgaXMgYm9yaW5nIgorICAgICAgICB9CisgICAgICAgIGFzc2VydCBjdGguYVByb3BlcnR5ID09ICJhVmFsdWUiCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdENhdGVnb3J5SGlkZGVuQnlDbGFzc01ldGhvZCgpIHsKKyAgICAgIGFzc2VydFNjcmlwdCAiIiIKKyAgICAgICAgIGNsYXNzIEF7fQorICAgICAgICAgY2xhc3MgQiBleHRlbmRzIEF7ZGVmIG0oKXsxfX0KKyAgICAgICAgIGNsYXNzIENhdGVnb3J5eyBzdGF0aWMgbShBIGEpIHsyfX0KKyAgICAgICAgIGRlZiBiID0gbmV3IEIoKQorICAgICAgICAgdXNlIChDYXRlZ29yeSkgeworICAgICAgICAgICBhc3NlcnQgYi5tKCkgPT0gMQorICAgICAgICAgfQorICAgICAgIiIiCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdENhdGVnb3J5T3ZlcnJpZGluZ0NsYXNzTWV0aG9kKCkgeworICAgICAgYXNzZXJ0U2NyaXB0ICIiIgorICAgICAgICAgY2xhc3MgQSB7ZGVmIG0oKXsxfX0KKyAgICAgICAgIGNsYXNzIENhdGVnb3J5eyBzdGF0aWMgbShBIGEpIHsyfX0KKyAgICAgICAgIGRlZiBhID0gbmV3IEEoKQorICAgICAgICAgdXNlIChDYXRlZ29yeSkgeworICAgICAgICAgICBhc3NlcnQgYS5tKCkgPT0gMgorICAgICAgICAgfQorICAgICAgIiIiCisgICAgICBhc3NlcnRTY3JpcHQgIiIiCisgICAgICAgICBjbGFzcyBBIHtkZWYgbSgpezF9fQorICAgICAgICAgY2xhc3MgQiBleHRlbmRzIEF7fQorICAgICAgICAgY2xhc3MgQ2F0ZWdvcnl7IHN0YXRpYyBtKEEgYSkgezJ9fQorICAgICAgICAgZGVmIGEgPSBuZXcgQigpCisgICAgICAgICB1c2UgKENhdGVnb3J5KSB7CisgICAgICAgICAgIGFzc2VydCBhLm0oKSA9PSAyCisgICAgICAgICB9CisgICAgICAiIiIKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0Q2F0ZWdvcnlXaXRoTWl4ZWRPdmVycmlkaW5nKCkgeworICAgICAgYXNzZXJ0U2NyaXB0ICIiIgorICAgICAgICAgY2xhc3MgQXtkZWYgbSgpezB9fQorICAgICAgICAgY2xhc3MgQiBleHRlbmRzIEF7ZGVmIG0oKXsxfX0KKyAgICAgICAgIGNsYXNzIENhdGVnb3J5eyBzdGF0aWMgbShBIGEpIHsyfX0KKyAgICAgICAgIGRlZiBiID0gbmV3IEIoKQorICAgICAgICAgdXNlIChDYXRlZ29yeSkgeworICAgICAgICAgICBhc3NlcnQgYi5tKCkgPT0gMQorICAgICAgICAgfQorICAgICAgIiIiCisgICAgfQorICAgIAorfQorCitjbGFzcyBTdHJpbmdDYXRlZ29yeSB7CisgICAgc3RhdGljIFN0cmluZyBsb3dlcihTdHJpbmcgc3RyaW5nKSB7CisgICAgICAgIHJldHVybiBzdHJpbmcudG9Mb3dlckNhc2UoKTsKKyAgICB9Cit9CisKK2NsYXNzIEludGVnZXJDYXRlZ29yeSB7CisgICAgc3RhdGljIEludGVnZXIgaW5jKEludGVnZXIgaSkgeworICAgICAgICByZXR1cm4gaSArIDE7CisgICAgfQorfQorCitjbGFzcyBDYXRlZ29yeVRlc3RQcm9wZXJ0eUNhdGVnb3J5IHsKKyAgICBwcml2YXRlIHN0YXRpYyBhVmFsID0gImhlbGxvIgorICAgIHN0YXRpYyBnZXRTb21ldGhpbmcoT2JqZWN0IHNlbGYpIHsgcmV0dXJuIGFWYWwgfQorICAgIHN0YXRpYyB2b2lkIHNldFNvbWV0aGluZyhPYmplY3Qgc2VsZiwgbmV3VmFsdWUpIHsgYVZhbCA9IG5ld1ZhbHVlIH0KK30KKworY2xhc3MgQ2F0ZWdvcnlUZXN0SGVscGVyIHsKKyAgICBkZWYgYVByb3BlcnR5ID0gImFWYWx1ZSIKK30KKworY2xhc3MgQ2F0ZWdvcnlUZXN0SGVscGVyUHJvcGVydHlSZXBsYWNlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgYVZhbCA9ICJhbm90aGVyVmFsdWUiCisgICAgc3RhdGljIGdldEFQcm9wZXJ0eShDYXRlZ29yeVRlc3RIZWxwZXIgc2VsZikgeyByZXR1cm4gYVZhbCB9CisgICAgc3RhdGljIHZvaWQgc2V0QVByb3BlcnR5KENhdGVnb3J5VGVzdEhlbHBlciBzZWxmLCBuZXdWYWx1ZSkgeyBhVmFsID0gbmV3VmFsdWUgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQ2hhaW5lZEFzc2lnbm1lbnRUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQ2hhaW5lZEFzc2lnbm1lbnRUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzBlYjY0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9DaGFpbmVkQXNzaWdubWVudFRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMjIgQEAKK3BhY2thZ2UgZ3Jvb3Z5CisKK2NsYXNzIENoYWluZWRBc3NpZ25tZW50VGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIGRlZiBkdW1teSh2KSB7CisgICAgICAgIHByaW50IHYKKyAgICB9CisKKyAgICB2b2lkIHRlc3RDb21wYXJlKCkgeworICAgICAgICBkZWYgaSA9IDEyMworICAgICAgICBkZWYgcyA9ICJoZWxsbyIKKworICAgICAgICBkZWYgaTIKKyAgICAgICAgZGVmIGkxID0gaTIgPSBpOworICAgICAgICBhc3NlcnQgaTEgPT0gMTIzCisgICAgICAgIGFzc2VydCBpMiA9PSAxMjMKKworICAgICAgICBkZWYgczEKKyAgICAgICAgZHVtbXkoczEgPSBzKQorICAgICAgICBhc3NlcnQgczEgPT0gImhlbGxvIgorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQ2xhc3NFeHByZXNzaW9uVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0NsYXNzRXhwcmVzc2lvblRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZDJmZTUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0NsYXNzRXhwcmVzc2lvblRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsNjQgQEAKK3BhY2thZ2UgZ3Jvb3Z5CisKKy8qKiAKKyAqIFRlc3RzIHRoZSB1c2Ugb2YgY2xhc3NlcyBhcyB2YXJpYWJsZSBleHByZXNzaW9ucworICogCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitjbGFzcyBDbGFzc0V4cHJlc3Npb25UZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCB0ZXN0VXNlT2ZDbGFzcygpIHsKKyAgICAgICAgZGVmIHggPSBTdHJpbmcKKyAgICAgICAgCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigieDogIiArIHgpCisgICAgICAgIAorICAgICAgICBhc3NlcnQgeCAhPSBudWxsCisKKyAgICAgICAgYXNzZXJ0IHguZ2V0TmFtZSgpLmVuZHNXaXRoKCdTdHJpbmcnKQorICAgICAgICBhc3NlcnQgeC5uYW1lLmVuZHNXaXRoKCdTdHJpbmcnKQorCisgICAgICAgIHggPSBJbnRlZ2VyCisgICAgICAgIAorICAgICAgICBhc3NlcnQgeCAhPSBudWxsCisgICAgICAgIGFzc2VydCB4Lm5hbWUuZW5kc1dpdGgoJ0ludGVnZXInKQorICAgICAgICAKKyAgICAgICAgeCA9IEdyb292eVRlc3RDYXNlCisgICAgICAgIAorICAgICAgICBhc3NlcnQgeCAhPSBudWxsCisgICAgICAgIGFzc2VydCB4Lm5hbWUuZW5kc1dpdGgoJ0dyb292eVRlc3RDYXNlJykKKyAgICAgICAgCisgICAgICAgIHggPSBDbGFzc0V4cHJlc3Npb25UZXN0CisgICAgICAgIAorICAgICAgICBhc3NlcnQgeCAhPSBudWxsCisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ4OiAiICsgeCkKKyAgICB9CisKKyAgICB2b2lkIHRlc3RDbGFzc1BzdWVkb1Byb3BlcnR5KCkgeworCisgICAgICAgIGRlZiB4ID0gImNoZWVzZSI7CisKKyAgICAgICAgYXNzZXJ0IHguY2xhc3MgIT0gbnVsbAorCisgICAgICAgIGFzc2VydCB4LmNsYXNzID09IHguZ2V0Q2xhc3MoKTsKKworICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJ4LmNsYXNzOiAiICsgeC5jbGFzcyApOworICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RQcmltaXRpdmVDbGFzc2VzKCkgeworICAgICAgICBhc3NlcnQgdm9pZCA9PSBWb2lkLlRZUEUKKyAgICAgICAgYXNzZXJ0IGludCA9PSBJbnRlZ2VyLlRZUEUKKyAgICAgICAgYXNzZXJ0IGJ5dGUgPT0gQnl0ZS5UWVBFCisgICAgICAgIGFzc2VydCBjaGFyID09IENoYXJhY3Rlci5UWVBFCisgICAgICAgIGFzc2VydCBkb3VibGUgPT0gRG91YmxlLlRZUEUKKyAgICAgICAgYXNzZXJ0IGZsb2F0ID09IEZsb2F0LlRZUEUKKyAgICAgICAgYXNzZXJ0IGxvbmcgPT0gTG9uZy5UWVBFCisgICAgICAgIGFzc2VydCBzaG9ydCA9PSBTaG9ydC5UWVBFCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdEFycmF5Q2xhc3NSZWZlcmVuY2UoKSB7CisgICAgICAgZGVmIGZvbyA9IGludFtdCisgICAgICAgYXNzZXJ0IGZvby5uYW1lID09ICJbSSIKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0NsYXNzR2V0U2ltcGxlTmFtZVRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9DbGFzc0dldFNpbXBsZU5hbWVUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODBlNzBiCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9DbGFzc0dldFNpbXBsZU5hbWVUZXN0Lmdyb292eQpAQCAtMCwwICsxLDY3IEBACisvKg0KKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLg0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KK3BhY2thZ2UgZ3Jvb3Z5DQorDQoraW1wb3J0IHN0YXRpYyBncm9vdnkudXRpbC5Qcm94eUdlbmVyYXRvci4qDQorDQorLyoqDQorICogVGhpcyB0ZXN0IHZlcmlmaWVzIHRoZSBiZWhhdmlvdXIgb2YgUHJveHlHZW5lcmF0b3IjZ2V0U2ltcGxlTmFtZShDbGFzcykgdXNlZCBpbiBNYXAgb2YgY2xvc3VyZXMgY29lcmNpb24gdG8gY2xhc3Nlcy4NCisgKiBUaGUgYmVoYXZpb3VyIG9mIFByb3h5R2VuZXJhdG9yI2dldFNpbXBsZU5hbWUoQ2xhc3MpIHNob3VsZCBiZSB0aGUgc2FtZSBhcyBDbGFzcyNnZXRTaW1wbGVOYW1lKCkuDQorICoNCisgKiBUT0RPIHJlbW92ZSB0aGlzIGNsYXNzIHdoZW4gd2UgY2FuIHVzZSBDbGFzcyNnZXRTaW1wbGVOYW1lKCkgaW4gUHJveHlHZW5lcmF0b3IjaW5zdGFudGlhdGVBZ2dyZWdhdGUoTWFwIG1hcCwgTGlzdCBpbnRlcmZhY2VzLCBDbGFzcyBjbGF6eikNCisgKi8NCitjbGFzcyBDbGFzc0dldFNpbXBsZU5hbWVUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2Ugew0KKw0KKyAgICB2b2lkIHRlc3RQcmltaXRpdmVUeXBlcygpIHsNCisgICAgICAgIGFzc2VydCAiYm9vbGVhbiIgPT0gZ2V0U2ltcGxlTmFtZShib29sZWFuKQ0KKyAgICAgICAgYXNzZXJ0ICJieXRlIiAgICA9PSBnZXRTaW1wbGVOYW1lKGJ5dGUpDQorICAgICAgICBhc3NlcnQgImNoYXIiICAgID09IGdldFNpbXBsZU5hbWUoY2hhcikNCisgICAgICAgIGFzc2VydCAiZG91YmxlIiAgPT0gZ2V0U2ltcGxlTmFtZShkb3VibGUpDQorICAgICAgICBhc3NlcnQgImZsb2F0IiAgID09IGdldFNpbXBsZU5hbWUoZmxvYXQpDQorICAgICAgICBhc3NlcnQgImludCIgICAgID09IGdldFNpbXBsZU5hbWUoaW50KQ0KKyAgICAgICAgYXNzZXJ0ICJsb25nIiAgICA9PSBnZXRTaW1wbGVOYW1lKGxvbmcpDQorICAgICAgICBhc3NlcnQgInNob3J0IiAgID09IGdldFNpbXBsZU5hbWUoc2hvcnQpDQorICAgICAgICBhc3NlcnQgInZvaWQiICAgID09IGdldFNpbXBsZU5hbWUodm9pZCkNCisgICAgfQ0KKw0KKyAgICB2b2lkIHRlc3ROb3JtYWxDbGFzc2VzKCkgew0KKyAgICAgICAgYXNzZXJ0ICJqYXZhLmxhbmcuQ2xhc3MiICAgICAgICAgICAgID09IGdldFNpbXBsZU5hbWUoamF2YS5sYW5nLkNsYXNzKQ0KKyAgICAgICAgYXNzZXJ0ICJqYXZhLmxhbmcuU3RyaW5nIiAgICAgICAgICAgID09IGdldFNpbXBsZU5hbWUoamF2YS5sYW5nLlN0cmluZykNCisgICAgICAgIGFzc2VydCAiamF2YS5sYW5nLlJ1bm5hYmxlIiAgICAgICAgICA9PSBnZXRTaW1wbGVOYW1lKGphdmEubGFuZy5SdW5uYWJsZSkNCisgICAgICAgIGFzc2VydCAiZ3Jvb3Z5LlNpbXBsZU5hbWVEdW1teUNsYXNzIiA9PSBnZXRTaW1wbGVOYW1lKGdyb292eS5TaW1wbGVOYW1lRHVtbXlDbGFzcykNCisgICAgICAgIGFzc2VydCAiamF2YS51dGlsLk1hcC5FbnRyeSIgICAgICAgICA9PSBnZXRTaW1wbGVOYW1lKE1hcC5FbnRyeSkNCisgICAgfQ0KKw0KKyAgICB2b2lkIHRlc3RBcnJheU9mUHJpbWl0aXZlcygpIHsNCisgICAgICAgIGFzc2VydCAiYm9vbGVhbltdIiAgICAgPT0gZ2V0U2ltcGxlTmFtZShib29sZWFuW10pDQorICAgICAgICBhc3NlcnQgImJ5dGVbXVtdIiAgICAgID09IGdldFNpbXBsZU5hbWUoYnl0ZVtdW10pDQorICAgICAgICBhc3NlcnQgImNoYXJbXSIgICAgICAgID09IGdldFNpbXBsZU5hbWUoY2hhcltdKQ0KKyAgICAgICAgYXNzZXJ0ICJkb3VibGVbXVtdW10iICA9PSBnZXRTaW1wbGVOYW1lKGRvdWJsZVtdW11bXSkNCisgICAgICAgIGFzc2VydCAiZmxvYXRbXSIgICAgICAgPT0gZ2V0U2ltcGxlTmFtZShmbG9hdFtdKQ0KKyAgICAgICAgYXNzZXJ0ICJpbnRbXSIgICAgICAgICA9PSBnZXRTaW1wbGVOYW1lKGludFtdKQ0KKyAgICAgICAgYXNzZXJ0ICJsb25nW11bXSIgICAgICA9PSBnZXRTaW1wbGVOYW1lKGxvbmdbXVtdKQ0KKyAgICAgICAgYXNzZXJ0ICJzaG9ydFtdW10iICAgICA9PSBnZXRTaW1wbGVOYW1lKHNob3J0W11bXSkNCisgICAgfQ0KKw0KKyAgICB2b2lkIHRlc3RBcnJheU9mTm9ybWFsQ2xhc3NlcygpIHsNCisgICAgICAgIGFzc2VydCAiamF2YS5sYW5nLlN0cmluZ1tdIiAgICAgICAgICAgICAgICA9PSBnZXRTaW1wbGVOYW1lKFN0cmluZ1tdKQ0KKyAgICAgICAgYXNzZXJ0ICJqYXZhLmxhbmcuQm9vbGVhbltdW10iICAgICAgICAgICAgID09IGdldFNpbXBsZU5hbWUoQm9vbGVhbltdW10pDQorICAgICAgICBhc3NlcnQgImdyb292eS5TaW1wbGVOYW1lRHVtbXlDbGFzc1tdW11bXSIgPT0gZ2V0U2ltcGxlTmFtZShncm9vdnkuU2ltcGxlTmFtZUR1bW15Q2xhc3NbXVtdW10pDQorICAgICAgICBhc3NlcnQgImphdmEubGFuZy5JbnRlZ2VyW11bXSIgICAgICAgICAgICAgPT0gZ2V0U2ltcGxlTmFtZShqYXZhLmxhbmcuSW50ZWdlcltdW10pDQorICAgIH0NCit9DQorDQorY2xhc3MgU2ltcGxlTmFtZUR1bW15Q2xhc3Mge30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0NsYXNzTG9hZGVyQnVnLmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQ2xhc3NMb2FkZXJCdWcuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMmVjZjIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0NsYXNzTG9hZGVyQnVnLmdyb292eQpAQCAtMCwwICsxLDEzIEBACitwYWNrYWdlIGdyb292eQorCitjbGFzcyBDbGFzc0xvYWRlckJ1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKyAgICAKKyAgICBzdGF0aWMgdm9pZCBtYWluKGFyZ3MpIHsKKyAgICAgICAgZGVmIGdzdCA9IG5ldyBDbGFzc0xvYWRlckJ1ZygpOworICAgICAgICBnc3QudGVzdFdpdGhPbmVWYXJpYWJsZSgpOworICAgIH0KKworICAgIHZvaWQgdGVzdFdpdGhPbmVWYXJpYWJsZSgpIHsKKyAgICAgICAgcHJpbnRsbigiQ2FsbGVkIG1ldGhvZCIpCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9DbGFzc1Rlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9DbGFzc1Rlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNzg2YjgKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0NsYXNzVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwyMiBAQAorcGFja2FnZSBncm9vdnkKKworY2xhc3MgQ2xhc3NUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCB0ZXN0Q2xhc3NFeHByZXNzaW9uKCkgeworICAgIAlkZWYgYyA9IFN0cmluZy5jbGFzcworICAgIAlwcmludGxuIGMKKyAgICAJYXNzZXJ0IGMgaW5zdGFuY2VvZiBDbGFzcworICAgIAlhc3NlcnQgYy5uYW1lID09ICJqYXZhLmxhbmcuU3RyaW5nIiAsIGMubmFtZQorICAgIAkKKyAgICAJYyA9IEdyb292eVRlc3RDYXNlLmNsYXNzCisgICAgCXByaW50bG4gYworICAgIAlhc3NlcnQgYyBpbnN0YW5jZW9mIENsYXNzCisgICAgCWFzc2VydCBjLm5hbWUuZW5kc1dpdGgoIkdyb292eVRlc3RDYXNlIikgLCBjLm5hbWUKKyAgICAJCisgICAgCWMgPSBDbGFzc1Rlc3QuY2xhc3MKKyAgICAJcHJpbnRsbiBjCisgICAgCWFzc2VydCBjIGluc3RhbmNlb2YgQ2xhc3MKKyAgICAJYXNzZXJ0IGMubmFtZS5lbmRzV2l0aCgiQ2xhc3NUZXN0IikgLCBjLm5hbWUKKyAgICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0Nsb3N1cmVBc1BhcmFtVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0Nsb3N1cmVBc1BhcmFtVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI0MjM2OQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQ2xvc3VyZUFzUGFyYW1UZXN0Lmdyb292eQpAQCAtMCwwICsxLDE5IEBACitwYWNrYWdlIGdyb292eQorCisvKiogCisgKiBUZXN0cyBDbG9zdXJlcyBpbiBHcm9vdnkKKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworY2xhc3MgQ2xvc3VyZUFzUGFyYW1UZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCB0ZXN0U2ltcGxlQmxvY2tDYWxsKCkgeworICAgICAgICBhc3NlcnRDbG9zdXJlKHtvd25lci0+IHByaW50bG4ob3duZXIpIH0pCisgICAgfQorICAKKyAgICBkZWYgYXNzZXJ0Q2xvc3VyZShDbG9zdXJlIGJsb2NrKSB7CisgICAgICAgIGFzc2VydCBibG9jayAhPSBudWxsCisgICAgICAgIGJsb2NrLmNhbGwoImhlbGxvISIpCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9DbG9zdXJlQ2xvbmVUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQ2xvc3VyZUNsb25lVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI1NWFlNwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQ2xvc3VyZUNsb25lVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwyMyBAQAorcGFja2FnZSBncm9vdnkKKworLyoqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anN0cmFjaGFuQHByb3RpcXVlLmNvbSI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK2NsYXNzIENsb3N1cmVDbG9uZVRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICB2b2lkIHRlc3RDbG9uZU9mQ2xvc3VyZSgpIHsKKyAgICAgICAgZGVmIGZhY3RvciA9IDIKKyAgICAgICAgZGVmIGNsb3N1cmUgPSB7IGl0ICogZmFjdG9yIH0KKworICAgICAgICBkZWYgdmFsdWUgPSBjbG9zdXJlKDUpCisgICAgICAgIGFzc2VydCB2YWx1ZSA9PSAxMAorCisgICAgICAgIC8vIG5vdyBsZXRzIGNsb25lIHRoZSBjbG9zdXJlCisgICAgICAgIGRlZiBjMiA9IGNsb3N1cmUuY2xvbmUoKQorICAgICAgICBhc3NlcnQgYzIgIT0gbnVsbAorCisgICAgICAgIHZhbHVlID0gYzIoNikKKyAgICAgICAgYXNzZXJ0IHZhbHVlID09IDEyCisgICAgfSAgCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0Nsb3N1cmVDb21wYXJhdG9yVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0Nsb3N1cmVDb21wYXJhdG9yVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYyYjE4ZgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQ2xvc3VyZUNvbXBhcmF0b3JUZXN0Lmdyb292eQpAQCAtMCwwICsxLDk3IEBACitwYWNrYWdlIGdyb292eQorCisvKgorICRJZCQKKworIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCisgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQKKyAgICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKKyAgICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCisgICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQorICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgorICAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKKyAgICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KKworIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCisgICAgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAorICAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCisKKyA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQorICAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLworCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUworIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAorIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKKyBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgKi8KKworLyoqCisgKiBUZXN0cyBmb3IgQ2xvc3VyZUNvbXBhcmF0b3IKKyAqCisgKiBAYXV0aG9yIEFsZXhleSBWZXJraG92c2t5CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KKyBjbGFzcyBDbG9zdXJlQ29tcGFyYXRvclRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKworICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc3VyZUNvbXBhcmF0b3JGb3JHcm9vdnlPYmplY3RzKCkgeworCisgICAgZGVmIGNvbXBhcmF0b3IgPSBuZXcgQ2xvc3VyZUNvbXBhcmF0b3IoKSB7IG9uZSwgYW5vdGhlciAtPgorICAgICAgb25lLmdyZWF0ZXJUaGFuKGFub3RoZXIpCisgICAgfQorCisgICAgZGVmIG9uZSA9IG5ldyBDb21wYXJhYmxlRm9vKDUpCisgICAgZGVmIGFub3RoZXIgPSBuZXcgQ29tcGFyYWJsZUZvbygtNSkKKworICAgIGFzc2VydEVxdWFscygxMCwgY29tcGFyYXRvci5jb21wYXJlKG9uZSwgYW5vdGhlcikpCisgICAgYXNzZXJ0RXF1YWxzKDAsIGNvbXBhcmF0b3IuY29tcGFyZShvbmUsIG9uZSkpCisgICAgYXNzZXJ0RXF1YWxzKC0xMCwgY29tcGFyYXRvci5jb21wYXJlKGFub3RoZXIsIG9uZSkpCisKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RDbG9zdXJlQ29tcGFyYXRvckZvck51bWVyaWNUeXBlcygpIHsKKworICAgIGRlZiBjb21wYXJhdG9yID0gbmV3IENsb3N1cmVDb21wYXJhdG9yKCkgeyBvbmUsIGFub3RoZXIgLT4KKyAgICAgIG9uZSAtIGFub3RoZXIKKyAgICB9CisKKyAgICBhc3NlcnRFcXVhbHMoMSwgY29tcGFyYXRvci5jb21wYXJlKEludGVnZXIuTUFYX1ZBTFVFLCBJbnRlZ2VyLk1BWF9WQUxVRS0xKSkKKyAgICBhc3NlcnRFcXVhbHMoMCwgY29tcGFyYXRvci5jb21wYXJlKERvdWJsZS5NSU5fVkFMVUUsIERvdWJsZS5NSU5fVkFMVUUpKQorICAgIGFzc2VydEVxdWFscygtMSwgY29tcGFyYXRvci5jb21wYXJlKExvbmcuTUlOX1ZBTFVFLCBMb25nLk1JTl9WQUxVRSsxKSkKKyAgfQorCit9CisKK2NsYXNzIENvbXBhcmFibGVGb28geworICBsb25nIHZhbHVlCisKKyAgcHVibGljIENvbXBhcmFibGVGb28obG9uZyB0aGVWYWx1ZSkgeworICAgIHRoaXMudmFsdWUgPSB0aGVWYWx1ZQorICB9CisKKyAgZGVmIGdyZWF0ZXJUaGFuKGFub3RoZXJGb28pIHsKKyAgICByZXR1cm4gKHRoaXMudmFsdWUgLSBhbm90aGVyRm9vLnZhbHVlKQorICB9Cit9CisKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQ2xvc3VyZUN1cnJ5VGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0Nsb3N1cmVDdXJyeVRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NDcwMjAKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0Nsb3N1cmVDdXJyeVRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTA2IEBACitwYWNrYWdlIGdyb292eQorCisvKiogCisgKiBAYXV0aG9yIEhhbGx2YXJkIFRy77+9dHRlYmVyZworICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitjbGFzcyBDbG9zdXJlQ3VycnlUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCB0ZXN0Q3VycnkoKSB7CisJCWRlZiBjbG9zMSA9IHtzMSwgczIgLT4gczEgKyBzMn0KKwkJZGVmIGNsb3MyID0gY2xvczEuY3VycnkoImhpIikKKwkJZGVmIHZhbHVlID0gY2xvczIoInRoZXJlIikKKwkJYXNzZXJ0IHZhbHVlID09ICJoaXRoZXJlIgorCisJCWRlZiBjbG9zMyA9IHtzMSwgczIsIHMzIC0+IHMxICsgczIgKyBzM30KKwkJZGVmIGNsb3M0ID0gY2xvczMuY3VycnkoJ2EnKQorCQlkZWYgY2xvczUgPSBjbG9zNC5jdXJyeSgnYicpCisJCWRlZiBjbG9zNiA9IGNsb3M0LmN1cnJ5KCd4JykKKwkJZGVmIGNsb3M3ID0gY2xvczQuY3VycnkoJ2YnLCAnZycpCisJCXZhbHVlID0gY2xvczUoJ2MnKQorCQlhc3NlcnQgdmFsdWUgPT0gImFiYyIKKwkJdmFsdWUgPSBjbG9zNignYycpCisJCWFzc2VydCB2YWx1ZSA9PSAiYXhjIgorCQl2YWx1ZSA9IGNsb3M0KCd5JywgJ3onKQorCQlhc3NlcnQgdmFsdWUgPT0gImF5eiIKKwkJdmFsdWUgPSBjbG9zNygpCisJCWFzc2VydCB2YWx1ZSA9PSAiYWZnIgorCisJCWNsb3MzID0ge3MxLCBzMiwgczMgLT4gczEgKyBzMiArIHMzfS5hc1dyaXRhYmxlKCkKKwkJY2xvczQgPSBjbG9zMy5jdXJyeSgnYScpCisJCWNsb3M1ID0gY2xvczQuY3VycnkoJ2InKQorCQljbG9zNiA9IGNsb3M0LmN1cnJ5KCd4JykKKwkJY2xvczcgPSBjbG9zNC5jdXJyeSgnZicsICdnJykKKwkJdmFsdWUgPSBjbG9zNSgnYycpCisJCWFzc2VydCB2YWx1ZSA9PSAiYWJjIgorCQl2YWx1ZSA9IGNsb3M2KCdjJykKKwkJYXNzZXJ0IHZhbHVlID09ICJheGMiCisJCXZhbHVlID0gY2xvczQoJ3knLCAneicpCisJCWFzc2VydCB2YWx1ZSA9PSAiYXl6IgorCQl2YWx1ZSA9IGNsb3M3KCkKKwkJYXNzZXJ0IHZhbHVlID09ICJhZmciCisKKwkJY2xvczMgPSB7czEsIHMyLCBzMyAtPiBzMSArIHMyICsgczN9CisJCWNsb3M0ID0gY2xvczMuY3VycnkoJ2EnKS5hc1dyaXRhYmxlKCkKKwkJY2xvczUgPSBjbG9zNC5jdXJyeSgnYicpLmFzV3JpdGFibGUoKQorCQljbG9zNiA9IGNsb3M0LmN1cnJ5KCd4JykuYXNXcml0YWJsZSgpCisJCWNsb3M3ID0gY2xvczQuY3VycnkoJ2YnLCAnZycpLmFzV3JpdGFibGUoKQorCQl2YWx1ZSA9IGNsb3M1KCdjJykKKwkJYXNzZXJ0IHZhbHVlID09ICJhYmMiCisJCXZhbHVlID0gY2xvczYoJ2MnKQorCQlhc3NlcnQgdmFsdWUgPT0gImF4YyIKKwkJdmFsdWUgPSBjbG9zNCgneScsICd6JykKKwkJYXNzZXJ0IHZhbHVlID09ICJheXoiCisJCXZhbHVlID0gY2xvczcoKQorCQlhc3NlcnQgdmFsdWUgPT0gImFmZyIKKworCQljbG9zMyA9IHtzMSwgczIsIHMzIC0+IHMxICsgczIgKyBzM30KKwkJY2xvczQgPSBjbG9zMy5jdXJyeSgnYScpLmNsb25lKCkKKwkJY2xvczUgPSBjbG9zNC5jdXJyeSgnYicpLmNsb25lKCkKKwkJY2xvczYgPSBjbG9zNC5jdXJyeSgneCcpLmNsb25lKCkKKwkJY2xvczcgPSBjbG9zNC5jdXJyeSgnZicsICdnJykuY2xvbmUoKQorCQl2YWx1ZSA9IGNsb3M1KCdjJykKKwkJYXNzZXJ0IHZhbHVlID09ICJhYmMiCisJCXZhbHVlID0gY2xvczYoJ2MnKQorCQlhc3NlcnQgdmFsdWUgPT0gImF4YyIKKwkJdmFsdWUgPSBjbG9zNCgneScsICd6JykKKwkJYXNzZXJ0IHZhbHVlID09ICJheXoiCisJCXZhbHVlID0gY2xvczcoKQorCQlhc3NlcnQgdmFsdWUgPT0gImFmZyIKKworCQljbG9zMyA9IHtzMSwgczIsIHMzIC0+IHMxICsgczIgKyBzM30KKwkJY2xvczQgPSBjbG9zMy5jdXJyeSgnYScpLmFzV3JpdGFibGUoKS5jbG9uZSgpCisJCWNsb3M1ID0gY2xvczQuY3VycnkoJ2InKS5hc1dyaXRhYmxlKCkuY2xvbmUoKQorCQljbG9zNiA9IGNsb3M0LmN1cnJ5KCd4JykuYXNXcml0YWJsZSgpLmNsb25lKCkKKwkJY2xvczcgPSBjbG9zNC5jdXJyeSgnZicsICdnJykuYXNXcml0YWJsZSgpLmNsb25lKCkKKwkJdmFsdWUgPSBjbG9zNSgnYycpCisJCWFzc2VydCB2YWx1ZSA9PSAiYWJjIgorCQl2YWx1ZSA9IGNsb3M2KCdjJykKKwkJYXNzZXJ0IHZhbHVlID09ICJheGMiCisJCXZhbHVlID0gY2xvczQoJ3knLCAneicpCisJCWFzc2VydCB2YWx1ZSA9PSAiYXl6IgorCQl2YWx1ZSA9IGNsb3M3KCkKKwkJYXNzZXJ0IHZhbHVlID09ICJhZmciCisgICAgfSAgCisgICAgCisgICAgdm9pZCB0ZXN0UGFyYW1ldGVyVHlwZXMoKSB7CisgICAgICAgIGRlZiBjbDEgPSB7IFN0cmluZyBzMSwgaW50IGkgLT4gcmV0dXJuIHMxICsgaSB9CisgICAgICAgIGFzc2VydCAiZm9vNSIgPT0gY2wxKCJmb28iLCA1KQorICAgICAgICBhc3NlcnQgW1N0cmluZywgaW50XSA9PSBjbDEuZ2V0UGFyYW1ldGVyVHlwZXMoKS50b0xpc3QoKQorCisgICAgICAgIGRlZiBjbDIgPSBjbDEuY3VycnkoImJsYSIpCisgICAgICAgIGFzc2VydCAiYmxhNCIgPT0gY2wyKDQpCisgICAgICAgIGFzc2VydCBudWxsICE9IGNsMi5nZXRQYXJhbWV0ZXJUeXBlcygpIAorICAgICAgICBhc3NlcnQgW2ludF0gPT0gY2wyLmdldFBhcmFtZXRlclR5cGVzKCkudG9MaXN0KCkgCisgICAgfSAgICAKKyAgICAKKyAgICB2b2lkIHRlc3REZWxlZ2F0ZSgpIHsKKyAgICAgICAgZGVmIHJlcyA9IG51bGwKKyAgICAgICAgZGVmIGMgPSB7YSAtPiByZXMgPSB6fQorICAgICAgICBkZWYgY2MgPSBjLmN1cnJ5KDEpCisKKyAgICAgICAgY2MuZGVsZWdhdGUgPSBbejogImdvb2RieWUiXQorICAgICAgICBjYygpCisgICAgICAgIGFzc2VydCByZXMgPT0gY2MuZGVsZWdhdGUuegorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQ2xvc3VyZURlZmF1bHRQYXJhbWV0ZXJUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQ2xvc3VyZURlZmF1bHRQYXJhbWV0ZXJUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWVmZDAzCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9DbG9zdXJlRGVmYXVsdFBhcmFtZXRlclRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMzAgQEAKK3BhY2thZ2UgZ3Jvb3Z5CisKKy8qKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBwcm90aXF1ZS5jb20iPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitjbGFzcyBDbG9zdXJlRGVmYXVsdFBhcmFtZXRlclRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICB2b2lkIHRlc3RDbG9zdXJlV2l0aERlZmF1bHRQYXJhbXMoKSB7CisKKyAgICAgICAgZGVmIGJsb2NrID0ge2EgPSAxMjMsIGIgPSA0NTYgLT4gcHJpbnRsbiAidmFsdWUgb2YgYSA9ICRhIGFuZCBiID0gJGIiIH0KKworICAgICAgICBibG9jayA9IHsgSW50ZWdlciBhID0gMTIzLCBTdHJpbmcgYiA9ICJhYmMiIC0+CisgICAgICAgICAgICAgICAgICBwcmludGxuICJ2YWx1ZSBvZiBhID0gJGEgYW5kIGIgPSAkYiI7IHJldHVybiAiJGEgJGIiLnRvU3RyaW5nKCkgfQorCisgICAgICAgIGFzc2VydCBibG9jay5jYWxsKDQ1NiwgImRlZiIpID09ICI0NTYgZGVmIgorICAgICAgICBhc3NlcnQgYmxvY2suY2FsbCgpID09ICIxMjMgYWJjIgorICAgICAgICBhc3NlcnQgYmxvY2soNDU2KSA9PSAiNDU2IGFiYyIKKyAgICAgICAgYXNzZXJ0IGJsb2NrKDQ1NiwgImRlZiIpID09ICI0NTYgZGVmIgorICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RDbG9zdXJlV2l0aERlZmF1bHRQYXJhbUZyb21PdXRlclNjb3BlKCkgeworICAgICAgICBkZWYgeSA9IDU1NQorICAgICAgICBkZWYgYm9vID0ge3ggPSB5IC0+IHh9CisgICAgICAgIGFzc2VydCBib28oKSA9PSB5CisgICAgICAgIGFzc2VydCBib28oMSkgPT0gMQorICAgIH0KKworfQorCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0Nsb3N1cmVJbkNsb3N1cmVUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQ2xvc3VyZUluQ2xvc3VyZVRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMTM1ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0Nsb3N1cmVJbkNsb3N1cmVUZXN0Lmdyb292eQpAQCAtMCwwICsxLDMxIEBACitwYWNrYWdlIGdyb292eQorCisvKioKKyAqIEJ1ZyBpbGx1c3RyYXRpbmcgdGhlIG5lc3RlZCBjbG9zdXJlcyB2YXJpYWJsZSBzY29wZSB2aXNpYmlsaXR5IGlzc3VlLgorICogbC5lYWNoIGlzIENsb3N1cmVJbkNsb3N1cmVCdWckMSBhbmQgaXQuZWFjaCBpcyBDbG9zdXJlSW5DbG9zdXJlQnVnJDIKKyAqIFRoZSB2YXJpYWJsZSB0ZXh0IGlzIG5vdCB2aXNpYmxlIGZyb20gQ2xvc3VyZUluQ2xvc3VyZUJ1ZyQyLgorICogSW5kZWVkLCBhIGNsb3N1cmUgY2FuIG9ubHkgc2VlIHRoZSB2YXJpYWJsZSBkZWZpbmVkIG91dHNpZGUgdGhpcyBjbG9zdXJlIChvbmUgbGV2ZWwgdXApCisgKiBidXQgY2Fubm90IHNlZSB3aGF0J3MgaW4gdGhlIHNlY29uZCBsZXZlbC4KKyAqCisgKiBJbiBvcmRlciB0byBtYWtlIHRoZSB0ZXN0IHdvcmssIGRvIG5vdCBmb3JnZXQgdG8gdW5jb21tZW50IHRoZSBsaW5lICJwcmludGxuKHRleHQpIgorICoKKyAqIEBhdXRob3VyIEd1aWxsYXVtZSBMYWZvcmdlCisgKi8KK2NsYXNzIENsb3N1cmVJbkNsb3N1cmVUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCXZvaWQgdGVzdEludmlzaWJsZVZhcmlhYmxlKCkgeworCQlkZWYgdGV4dCA9ICJ0ZXN0ICIKKworCQlkZWYgbCA9IFsxLi4xMSwgMi4uMTIsIDMuLjEzLCA0Li4xNF0KKworCQlsLmVhY2h7CisJCQlpdC5lYWNoeworCQkJICAgIHByaW50bG4odGV4dCkKKwkJCX0KKwkJfQorCX0KKworCXN0YXRpYyB2b2lkIG1haW4oYXJncykgeworCQlkZWYgYnVnID0gbmV3IENsb3N1cmVJbkNsb3N1cmVUZXN0KCkKKwkJYnVnLnRlc3RJbnZpc2libGVWYXJpYWJsZSgpCisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQ2xvc3VyZUluU3RhdGljTWV0aG9kVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0Nsb3N1cmVJblN0YXRpY01ldGhvZFRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmZmFhMDUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0Nsb3N1cmVJblN0YXRpY01ldGhvZFRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsNDcgQEAKK3BhY2thZ2UgZ3Jvb3Z5CisKKy8qKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK2NsYXNzIENsb3N1cmVJblN0YXRpY01ldGhvZFRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICB2b2lkIHRlc3RDbG9zdXJlSW5TdGF0aWNNZXRob2QoKSB7CisgICAgICAgIGRlZiBjbG9zdXJlID0gY2xvc3VyZUluU3RhdGljTWV0aG9kKCkKKyAgICAgICAgYXNzZXJ0Q2xvc3VyZShjbG9zdXJlKSAgICAKKyAgICB9CisKKyAgICB2b2lkIHRlc3RNZXRob2RDbG9zdXJlSW5TdGF0aWNNZXRob2QoKSB7CisgICAgICAgIGRlZiBjbG9zdXJlID0gbWV0aG9kQ2xvc3VyZUluU3RhdGljTWV0aG9kKCkKKyAgICAgICAgYXNzZXJ0Q2xvc3VyZShjbG9zdXJlKSAgICAKKyAgICB9CisgICAgCisgICAgc3RhdGljIGRlZiBjbG9zdXJlSW5TdGF0aWNNZXRob2QoKSB7CisgICAgICAgIHJldHVybiB7IHByaW50bG4oaXQpIH0KKyAgICB9CisKKyAgICBzdGF0aWMgZGVmIG1ldGhvZENsb3N1cmVJblN0YXRpY01ldGhvZCgpIHsKKyAgICAgICAgU3lzdGVtLm91dC4mcHJpbnRsbgorICAgIH0KKyAgICAKKyAgICBzdGF0aWMgZGVmIGFzc2VydENsb3N1cmUoQ2xvc3VyZSBibG9jaykgeworICAgICAgICBhc3NlcnQgYmxvY2sgIT0gbnVsbAorICAgICAgICBibG9jay5jYWxsKCJoZWxsbyEiKQorICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RDbG9zdXJlSW5TdGF0aWNNZXRob2RDYWxsaW5nU3RhdGljTWV0aG9kKCkgeworICAgICAgIGFzc2VydCBkb1RoaW5nKDEpID09IDEwCisgICAgICAgYXNzZXJ0IHRoaXMuZG9UaGluZygxKSA9PSAxMAorICAgICAgIGFzc2VydCBDbG9zdXJlSW5TdGF0aWNNZXRob2RUZXN0LmRvVGhpbmcoMSkgPT0gMTAKKyAgICB9CisgICAgCisgICAgCisgICAgc3RhdGljIGRvVGhpbmcoY291bnQpIHsKKyAgICAgIGRlZiByZXQgPSBjb3VudAorICAgICAgaWYgKGNvdW50ID4gMikgcmV0dXJuIHJldAorICAgICAgY291bnQudGltZXMgeworICAgICAgICByZXQgKz0gZG9UaGluZyhjb3VudCtpdCsxKQorICAgICAgfQorICAgICAgcmV0dXJuIHJldAorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQ2xvc3VyZUxpc3RlbmVyVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0Nsb3N1cmVMaXN0ZW5lclRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ODg3NWEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0Nsb3N1cmVMaXN0ZW5lclRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsNTcgQEAKK3BhY2thZ2UgZ3Jvb3Z5CisKK2ltcG9ydCBqYXZheC5zd2luZy5KQnV0dG9uCisKKy8qKgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitjbGFzcyBDbG9zdXJlTGlzdGVuZXJUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworICAgICAKKyAgICB2b2lkIHRlc3RBZGRpbmdBbmRSZW1vdmluZ0FDbG9zdXJlTGlzdGVuZXIoKSB7CisgICAgICAgIGRlZiB2YWx1ZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgnamF2YS5hd3QuaGVhZGxlc3MnKQorICAgICAgICBwcmludGxuKCJWYWx1ZSBvZiBqYXZhLmF3dC5oZWFkbGVzcyA9ICR7dmFsdWV9IikKKyAgICAgICAgCisgICAgICAgIGRlZiBiID0gbmV3IEpCdXR0b24oImZvbyIpCisgICAgICAgIGIuYWN0aW9uUGVyZm9ybWVkID0geyBwcmludGxuKCJGb3VuZCAke2l0fSIpIH0KKworICAgICAgICBkZWYgc2l6ZSA9IGIuYWN0aW9uTGlzdGVuZXJzLnNpemUoKQorICAgICAgICBhc3NlcnQgc2l6ZSA9PSAxCisgICAgICAgIAorICAgICAgICBkZWYgbCA9IGIuYWN0aW9uTGlzdGVuZXJzWzBdCisJCWRlZiBjb2RlID0gbC5oYXNoQ29kZSgpCisgICAgICAgIAorICAgICAgICBwcmludGxuKCJsaXN0ZW5lcjogJHtsfSB3aXRoIGhhc2hDb2RlIGNvZGUgJHtjb2RlfSIpCisgICAgICAgIAorICAgICAgICBhc3NlcnQgbC50b1N0cmluZygpICE9ICJudWxsIgorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IGwuZXF1YWxzKGIpID09IGZhbHNlCisgICAgICAgIGFzc2VydCBsLmVxdWFscyhsKQorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IGwuaGFzaENvZGUoKSAhPSAwCisgICAgICAgIAorICAgICAgICBiLnJlbW92ZUFjdGlvbkxpc3RlbmVyKGwpCisgICAgICAgIAorICAgICAgICBwcmludGxuKGIuYWN0aW9uTGlzdGVuZXJzKQorICAgICAgICAKKyAgICAgICAgc2l6ZSA9IGIuYWN0aW9uTGlzdGVuZXJzLnNpemUoKQorICAgICAgICBhc3NlcnQgc2l6ZSA9PSAwCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdEdldHRpbmdBTGlzdGVuZXJQcm9wZXJ0eSgpIHsKKyAgICAJZGVmIGIgPSBuZXcgSkJ1dHRvbigiZm9vIikKKyAgICAJZGVmIGZvbyA9IGIuYWN0aW9uUGVyZm9ybWVkCisgICAgCWFzc2VydCBmb28gPT0gbnVsbAorICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3ROb25TdGFuZGFyZExpc3RlbmVyKCkgeworICAgICAgICBkZWYgbXlXaGF0ID0gbnVsbAorICAgICAgICBkZWYgbXlXaGVyZSA9IG51bGwKKworICAgICAgICBkZWYgc3RyYW5nZUJlYW4gPSBuZXcgU3RyYW5nZUJlYW4oKQorICAgICAgICBzdHJhbmdlQmVhbi5zb21ldGhpbmdTdHJhbmdlSGFwcGVuZWQgPSB7IHdoYXQsIHdoZXJlIC0+IG15V2hhdCA9IHdoYXQ7IG15V2hlcmUgPSB3aGVyZX0KKyAgICAgICAgc3RyYW5nZUJlYW4uc29tZXRoaW5nU3RyYW5nZUhhcHBlbmVkKCc/JywgJyEnKQorICAgIAorICAgICAgICBhc3NlcnQgbXlXaGF0ID09ICc/JworICAgICAgICBhc3NlcnQgbXlXaGVyZSA9PSAnIScKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9DbG9zdXJlTWV0aG9kQ2FsbFRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9DbG9zdXJlTWV0aG9kQ2FsbFRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZTYwY2QKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0Nsb3N1cmVNZXRob2RDYWxsVGVzdC5ncm9vdnkKQEAgLTAsMCArMSw0OSBAQAorcGFja2FnZSBncm9vdnkKKworLyoqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworY2xhc3MgQ2xvc3VyZU1ldGhvZENhbGxUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCB0ZXN0Q2FsbGluZ0Nsb3N1cmVXaXRoTXVsdGlwbGVBcmd1bWVudHMoKSB7CisgICAgICAgIGRlZiBmb28KKyAgICAgICAgZGVmIGNsb3N1cmUgPSB7IGEsIGIgLT4gZm9vID0gImhlbGxvICR7YX0gYW5kICR7Yn0iLnRvU3RyaW5nKCkgfQorICAgICAgICAKKyAgICAgICAgY2xvc3VyZSgiamFtZXMiLCAiYm9iIikKKworICAgICAgICBhc3NlcnQgZm9vID09ICJoZWxsbyBqYW1lcyBhbmQgYm9iIgorCisgICAgICAgIGNsb3N1cmUuY2FsbCgic2FtIiwgImphbWVzIikKKworICAgICAgICBhc3NlcnQgZm9vID09ICJoZWxsbyBzYW0gYW5kIGphbWVzIgorICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RDbG9zdXJlQ2FsbE1ldGhvZFdpdGhPYmplY3RBcnJheSgpIHsKKyAgICAgIC8vIEdST09WWS0yMjY2CisgICAgICBkZWYgYXJncyA9IFsxXSBhcyBPYmplY3RbXQorICAgICAgZGVmIGNsb3N1cmUgPSB7eCAtPiB4fQorICAgICAgYXNzZXJ0IGNsb3N1cmUuY2FsbChhcmdzKSA9PSAxCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdENsb3N1cmVBc0xvY2FsVmFyKCkgeworICAgICAgICBkZWYgbG9jYWwgPSB7IE1hcCBwYXJhbXMgLT4gcGFyYW1zLnggKiBwYXJhbXMueSAgfQorICAgICAgICBhc3NlcnQgbG9jYWwoeCA6IDIsIHkgOiAzKSA9PSA2CisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdENsb3N1cmVEaXJlY3RseSgpIHsKKyAgICAgICAgYXNzZXJ0IHsgTWFwIHBhcmFtcyAtPiBwYXJhbXMueCAqIHBhcmFtcy55IH0oeCA6IDIsIHkgOiAzKSA9PSA2CisgICAgfQorICAgIAorICAgIGRlZiBhdHRyaWJ1dGUKKyAgICAKKyAgICB2b2lkIHRlc3RDbG9zdXJlQXNBdHRyaWJ1dGUoKSB7CisgICAgICAgIGF0dHJpYnV0ZSA9IHsgTWFwIHBhcmFtcyAtPiAgcGFyYW1zLnggKiBwYXJhbXMueSAgfSAKKyAgICAgICAgYXNzZXJ0IGF0dHJpYnV0ZSh4IDogMiwgeSA6IDMpID09IDYKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0U3lzdGVtT3V0UHJpbnRsbkFzQUNsb3N1cmUoKSB7CisgICAgICAgIGRlZiBjbG9zdXJlID0gU3lzdGVtLm91dC4mcHJpbnRsbgorICAgICAgICBjbG9zdXJlKCJIZWxsbyB3b3JsZCIpCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9DbG9zdXJlTWV0aG9kVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0Nsb3N1cmVNZXRob2RUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzZhMzY4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9DbG9zdXJlTWV0aG9kVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwyMTkgQEAKK3BhY2thZ2UgZ3Jvb3Z5CisKKy8qKiAKKyAqIFRlc3RzIHRoZSB2YXJpb3VzIENsb3N1cmUgbWV0aG9kcyBpbiBHcm9vdnkKKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworY2xhc3MgQ2xvc3VyZU1ldGhvZFRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICB2b2lkIHRlc3RMaXN0Q29sbGVjdCgpIHsKKyAgICAgICAgZGVmIGxpc3QgPSBbMSwgMiwgMywgNF0KKyAgICAgICAgZGVmIGFuc3dlciA9IGxpc3QuY29sbGVjdHtpdGVtIC0+IHJldHVybiBpdGVtICogMiB9CisgICAgICAgIGFzc2VydCBhbnN3ZXIuc2l6ZSgpID09IDQKKyAgICAgICAgZGVmIGV4cGVjdGVkID0gWzIsIDQsIDYsIDhdCisgICAgICAgIGFzc2VydCBhbnN3ZXIgPT0gZXhwZWN0ZWQKKyAgICB9CisKKyAgICB2b2lkIHRlc3RNYXBDb2xsZWN0KCkgeworICAgICAgICBkZWYgbWFwID0gWzE6MiwgMjo0LCAzOjYsIDQ6OF0KKyAgICAgICAgZGVmIGFuc3dlciA9IG1hcC5jb2xsZWN0e2UtPiByZXR1cm4gZS5rZXkgKyBlLnZhbHVlIH0KKyAgICAgICAgLy8gbGVzdCBzb3J0IHRoZSByZXN1bHRzIHNpbmNlIG1hcHMgYXJlIGluIGhhc2ggY29kZSBvcmRlcgorICAgICAgICBhbnN3ZXIgPSBhbnN3ZXIuc29ydCgpCisgICAgICAgIGFzc2VydCBhbnN3ZXIuc2l6ZSgpID09IDQKKyAgICAgICAgYXNzZXJ0IGFuc3dlciA9PSBbMywgNiwgOSwgMTJdCisgICAgICAgIGFzc2VydCBhbnN3ZXIuZ2V0KDApID09IDMKKyAgICAgICAgYXNzZXJ0IGFuc3dlci5nZXQoMSkgPT0gNgorICAgICAgICBhc3NlcnQgYW5zd2VyLmdldCgyKSA9PSA5CisgICAgICAgIGFzc2VydCBhbnN3ZXIuZ2V0KDMpID09IDEyCisgICAgfQorCisgICAgdm9pZCB0ZXN0TGlzdEZpbmQoKSB7CisgICAgICAgIGRlZiBsaXN0ID0gWyJhIiwgImIiLCAiYyJdCisgICAgICAgIGRlZiBhbnN3ZXIgPSBsaXN0LmZpbmR7aXRlbS0+IGl0ZW0gPT0gImIiIH0KKyAgICAgICAgYXNzZXJ0IGFuc3dlciA9PSAiYiIKKyAgICAgICAgYW5zd2VyID0gbGlzdC5maW5ke2l0ZW0tPiBpdGVtID09ICJ6IiB9CisgICAgICAgIGFzc2VydCBhbnN3ZXIgPT0gbnVsbAorICAgIH0KKworICAgIHZvaWQgdGVzdE1hcEZpbmQoKSB7CisgICAgICAgIGRlZiBtYXAgPSBbMToyLCAyOjQsIDM6NiwgNDo4XQorICAgICAgICBkZWYgYW5zd2VyID0gbWFwLmZpbmR7ZW50cnkgLT4gZW50cnkudmFsdWUgPT0gNiB9CisgICAgICAgIGFzc2VydCBhbnN3ZXIgIT0gbnVsbAorICAgICAgICBhc3NlcnQgYW5zd2VyLmtleSA9PSAzCisgICAgICAgIGFzc2VydCBhbnN3ZXIudmFsdWUgPT0gNgorICAgICAgICBhbnN3ZXIgPSBtYXAuZmluZHtlbnRyeSAtPiBlbnRyeS52YWx1ZSA9PSAwIH0KKyAgICAgICAgYXNzZXJ0IGFuc3dlciA9PSBudWxsCisgICAgICAgIGFuc3dlciA9IG1hcC5maW5keyBrLCB2IC0+IHYgPiA1IH0KKyAgICAgICAgYXNzZXJ0IGFuc3dlciBpbnN0YW5jZW9mIE1hcC5FbnRyeQorICAgICAgICBhc3NlcnQgYW5zd2VyLmtleSA9PSAzCisgICAgICAgIGFzc2VydCBhbnN3ZXIudmFsdWUgPT0gNgorCisgICAgICAgIGFuc3dlciA9IG1hcC5maW5keyBrLCB2IC0+IGsgPT0gMiB9CisgICAgICAgIGFzc2VydCBhbnN3ZXIgaW5zdGFuY2VvZiBNYXAuRW50cnkKKyAgICAgICAgYXNzZXJ0IGFuc3dlci5rZXkgPT0gMgorICAgICAgICBhc3NlcnQgYW5zd2VyLnZhbHVlID09IDQKKyAgICB9CisKKyAgICB2b2lkIHRlc3RMaXN0RmluZEFsbCgpIHsKKyAgICAgICAgZGVmIGxpc3QgPSBbMjAsIDUsIDQwLCAyXQorICAgICAgICBkZWYgYW5zd2VyID0gbGlzdC5maW5kQWxse2l0ZW0gLT4gaXRlbSA8IDEwIH0KKyAgICAgICAgYXNzZXJ0IGFuc3dlci5zaXplKCkgPT0gMgorICAgICAgICBhc3NlcnQgYW5zd2VyID09IFs1LCAyXQorICAgIH0KKworICAgIHZvaWQgdGVzdE1hcEZpbmRBbGwoKSB7CisgICAgICAgIGRlZiBtYXAgPSBbMToyLCAyOjQsIDM6NiwgNDo4XQorICAgICAgICBkZWYgYW5zd2VyID0gbWFwLmZpbmRBbGx7IGVudHJ5IC0+IGVudHJ5LnZhbHVlID4gNSB9CisgICAgICAgIGFzc2VydCBhbnN3ZXIuc2l6ZSgpID09IDIKKyAgICAgICAgZGVmIGtleXMgPSBhbnN3ZXIuY29sbGVjdCB7IGVudHJ5IC0+IGVudHJ5LmtleSB9CisgICAgICAgIGRlZiB2YWx1ZXMgPSBhbnN3ZXIuY29sbGVjdCB7IGVudHJ5IC0+IGVudHJ5LnZhbHVlIH0KKyAgICAgICAgLy8gbWFwcyBhcmUgaW4gaGFzaCBvcmRlciBzbyBsZXRzIHNvcnQgdGhlIHJlc3VsdHMKKyAgICAgICAga2V5cy5zb3J0KCkKKyAgICAgICAgdmFsdWVzLnNvcnQoKQorICAgICAgICBhc3NlcnQga2V5cyA9PSBbMywgNF0sICJFeHBlY3RlZCBbMywgNF0gYnV0IHdhcyAka2V5cyIKKyAgICAgICAgYXNzZXJ0IHZhbHVlcyA9PSBbNiwgOF0sICJFeHBlY3RlZCBbNiwgOF0gYnV0IHdhcyAkdmFsdWVzIgorICAgIH0KKworICAgIHZvaWQgdGVzdE1hcEVhY2goKSB7CisgICAgICAgIGRlZiBjb3VudCA9IDAKKyAgICAgICAgZGVmIG1hcCA9IFsxOjIsIDI6NCwgMzo2LCA0OjhdCisgICAgICAgIG1hcC5lYWNoe2UtPiBjb3VudCA9IGNvdW50ICsgZS52YWx1ZSB9CisgICAgICAgIGFzc2VydCBjb3VudCA9PSAyMAorICAgICAgICBtYXAuZWFjaHtlLT4gY291bnQgPSBjb3VudCArIGUudmFsdWUgKyBlLmtleSB9CisgICAgICAgIGFzc2VydCBjb3VudCA9PSA1MAorICAgIH0KKworICAgIHZvaWQgdGVzdE1hcEVhY2hXaXRoMlBhcmFtcygpIHsKKyAgICAgICAgZGVmIGNvdW50ID0gMAorICAgICAgICBkZWYgbWFwID0gWzE6MiwgMjo0LCAzOjYsIDQ6OF0KKyAgICAgICAgbWFwLmVhY2gge2tleSwgdmFsdWUgLT4gY291bnQgPSBjb3VudCArIHZhbHVlIH0KKyAgICAgICAgYXNzZXJ0IGNvdW50ID09IDIwCisgICAgICAgIG1hcC5lYWNoIHtrZXksIHZhbHVlIC0+IGNvdW50ID0gY291bnQgKyB2YWx1ZSArIGtleSB9CisgICAgICAgIGFzc2VydCBjb3VudCA9PSA1MAorICAgIH0KKworICAgIHZvaWQgdGVzdExpc3RFYWNoKCkgeworICAgICAgICBkZWYgY291bnQgPSAwCisgICAgICAgIGRlZiBsaXN0ID0gWzEsIDIsIDMsIDRdCisgICAgICAgIGxpc3QuZWFjaCh7aXRlbS0+IGNvdW50ID0gY291bnQgKyBpdGVtIH0pCisgICAgICAgIGFzc2VydCBjb3VudCA9PSAxMAorICAgICAgICBsaXN0LmVhY2h7aXRlbS0+IGNvdW50ID0gY291bnQgKyBpdGVtIH0KKyAgICAgICAgYXNzZXJ0IGNvdW50ID09IDIwCisgICAgfQorCisgICAgdm9pZCB0ZXN0TGlzdEV2ZXJ5KCkgeworICAgICAgICBhc3NlcnQgWzEsIDIsIDMsIDRdLmV2ZXJ5IHtpLT4gcmV0dXJuIGkgPCA1IH0KKyAgICAgICAgYXNzZXJ0IFsxLCAyLCA3LCA0XS5ldmVyeSB7aS0+IGkgPCA1IH0gPT0gZmFsc2UKKyAgICAgICAgYXNzZXJ0IFthOjEsIGI6MiwgYzozXS5ldmVyeSB7ayx2IC0+IGsgPCAnZCcgJiYgdiA8IDQgfQorICAgICAgICBhc3NlcnQgIVthOjEsIGI6MiwgYzozXS5ldmVyeSB7ayx2IC0+IGsgPCAnZCcgJiYgdiA8IDMgfQorICAgIH0KKworICAgIHZvaWQgdGVzdExpc3RBbnkoKSB7CisgICAgICAgIGFzc2VydCBbMSwgMiwgMywgNF0uYW55IHtpLT4gcmV0dXJuIGkgPCA1IH0KKyAgICAgICAgYXNzZXJ0IFsxLCAyLCAzLCA0XS5hbnkge2ktPiBpID4gMyB9CisgICAgICAgIGFzc2VydCBbMSwgMiwgMywgNF0uYW55IHtpLT4gaSA+IDUgfSA9PSBmYWxzZQorICAgICAgICBhc3NlcnQgW2E6MSwgYjoyLCBjOjNdLmFueSB7IGssdiAtPiBrID09ICdjJyB9CisgICAgICAgIGRlZiBpc1RoZXJlQUZvdXJWYWx1ZSA9IFthOjEsIGI6MiwgYzozXS5hbnl7IGssdiAtPiB2ID09IDQgfQorICAgICAgICBhc3NlcnQgIWlzVGhlcmVBRm91clZhbHVlCisgICAgfQorCisgICAgdm9pZCB0ZXN0Sm9pbigpIHsKKyAgICAgICAgZGVmIHZhbHVlID0gWzEsIDIsIDNdLmpvaW4oJy0nKQorICAgICAgICBhc3NlcnQgdmFsdWUgPT0gIjEtMi0zIgorICAgIH0KKworICAgIHZvaWQgdGVzdExpc3RSZXZlcnNlKCkgeworICAgICAgICBkZWYgdmFsdWUgPSBbMSwgMiwgMywgNF0ucmV2ZXJzZSgpCisgICAgICAgIGFzc2VydCB2YWx1ZSA9PSBbNCwgMywgMiwgMV0KKyAgICB9CisKKyAgICB2b2lkIHRlc3RMaXN0SW5qZWN0KCkgeworICAgICAgICBkZWYgdmFsdWUgPSBbMSwgMiwgM10uaW5qZWN0KCdjb3VudGluZzogJykgeyBzdHIsIGl0ZW0gLT4gc3RyICsgaXRlbSB9CisgICAgICAgIGFzc2VydCB2YWx1ZSA9PSAiY291bnRpbmc6IDEyMyIKKyAgICAgICAgdmFsdWUgPSBbMSwgMiwgM10uaW5qZWN0KDApIHsgYywgaXRlbSAtPiBjICsgaXRlbSB9CisgICAgICAgIGFzc2VydCB2YWx1ZSA9PSA2CisgICAgICAgIHZhbHVlID0gKFsxLCAyLCAzLCA0XSBhcyBPYmplY3RbXSkuaW5qZWN0KDApIHsgYywgaXRlbSAtPiBjICsgaXRlbSB9CisgICAgICAgIGFzc2VydCB2YWx1ZSA9PSAxMAorICAgIH0KKworICAgIHZvaWQgdGVzdE9iamVjdEluamVjdCgpIHsKKyAgICAgICAgZGVmIHZhbHVlID0gWzE6MSwgMjoyLCAzOjNdLmluamVjdCgnY291bnRpbmc6ICcpIHsgc3RyLCBpdGVtIC0+IHN0ciArIGl0ZW0udmFsdWUgfQorICAgICAgICBhc3NlcnQgdmFsdWUgPT0gImNvdW50aW5nOiAxMjMiCisgICAgICAgIHZhbHVlID0gWzE6MSwgMjoyLCAzOjNdLmluamVjdCgwKSB7IGMsIGl0ZW0gLT4gYyArIGl0ZW0udmFsdWUgfQorICAgICAgICBhc3NlcnQgdmFsdWUgPT0gNgorICAgIH0KKworICAgIHZvaWQgdGVzdEl0ZXJhdG9ySW5qZWN0KCkgeworICAgICAgICBkZWYgdmFsdWUgPSBbMToxLCAyOjIsIDM6M10uaXRlcmF0b3IoKS5pbmplY3QoJ2NvdW50aW5nOiAnKSB7IHN0ciwgaXRlbSAtPiBzdHIgKyBpdGVtLnZhbHVlIH0KKyAgICAgICAgYXNzZXJ0IHZhbHVlID09ICJjb3VudGluZzogMTIzIgorICAgICAgICB2YWx1ZSA9IFsxOjEsIDI6MiwgMzozXS5pdGVyYXRvcigpLmluamVjdCgwKSB7IGMsIGl0ZW0gLT4gYyArIGl0ZW0udmFsdWUgfQorICAgICAgICBhc3NlcnQgdmFsdWUgPT0gNgorICAgIH0KKworICAgIHZvaWQgdGVzdER1bXAoKSB7CisgICAgICAgIGRlZiB0ZXh0ID0gZHVtcCgpCisgICAgICAgIHByaW50bG4oIkR1bXBpbmcgb2JqZWN0ICR7dGV4dH0iKQorICAgICAgICBhc3NlcnQgdGV4dCAhPSBudWxsICYmIHRleHQuc3RhcnRzV2l0aCgiPCIpCisgICAgfQorCisgICAgdm9pZCB0ZXN0SW5zcGVjdCgpIHsKKyAgICAgICAgZGVmIHRleHQgPSBbMSwgMiwgJ3RocmVlJ10uaW5zcGVjdCgpCisgICAgICAgIHByaW50bG4oIkluc3BlY3RpbmcgJHt0ZXh0fSIpCisgICAgICAgIGFzc2VydCB0ZXh0ID09ICdbMSwgMiwgInRocmVlIl0nCisgICAgfQorCisgICAgdm9pZCB0ZXN0RWFjaExpbmUoKSB7CisgICAgICAgIGRlZiBmaWxlID0gbmV3IEZpbGUoInNyYy90ZXN0L2dyb292eS9CYXIuZ3Jvb3Z5IikKKyAgICAgICAgaWYoZmlsZS5leGlzdHMoKSA9PSBmYWxzZSkgeworICAgICAgICAgICAgZmlsZSA9IG5ldyBGaWxlKCJCYXIuZ3Jvb3Z5IikKKyAgICAgICAgfQorICAgICAgICBmaWxlLmVhY2hMaW5lIHsgbGluZSAtPiBwcmludGxuKGxpbmUpIH0KKyAgICB9CisKKyAgICB2b2lkIHRlc3RGb3JFYWNoTGluZSgpIHsKKyAgICAgICAgZGVmIGZpbGUgPSBuZXcgRmlsZSgic3JjL3Rlc3QvZ3Jvb3Z5L0Jhci5ncm9vdnkiKQorICAgICAgICBpZihmaWxlLmV4aXN0cygpID09IGZhbHNlKSB7CisgICAgICAgICAgICBmaWxlID0gbmV3IEZpbGUoIkJhci5ncm9vdnkiKQorICAgICAgICB9CisgICAgICAgIHNob3VsZEZhaWwgKERlcHJlY2F0aW9uRXhjZXB0aW9uKSB7CisgICAgICAgICAgZm9yIChsaW5lIGluIGZpbGUpIHsgcHJpbnRsbihsaW5lKSB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHRlc3RSZWFkTGluZXMoKSB7CisgICAgICAgIGRlZiBmaWxlID0gbmV3IEZpbGUoInNyYy90ZXN0L2dyb292eS9CYXIuZ3Jvb3Z5IikKKyAgICAgICAgaWYoZmlsZS5leGlzdHMoKSA9PSBmYWxzZSkgeworICAgICAgICAgICAgZmlsZSA9IG5ldyBGaWxlKCJCYXIuZ3Jvb3Z5IikKKyAgICAgICAgfQorICAgICAgICBkZWYgbGluZXMgPSBmaWxlLnJlYWRMaW5lcygpCisgICAgICAgIGFzc2VydCBsaW5lcyAhPSBudWxsCisgICAgICAgIGFzc2VydCBsaW5lcy5zaXplKCkgPiAwLCAiRmlsZSBoYXM6ICR7bGluZXMuc2l6ZSgpfSBsaW5lKHMpIgorICAgIH0KKworICAgIHZvaWQgdGVzdEVhY2hGaWxlKCkgeworICAgICAgICBkZWYgZmlsZSA9IG5ldyBGaWxlKCJzcmMvdGVzdC9ncm9vdnkiKQorICAgICAgICBpZighZmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgZmlsZSA9IG5ldyBGaWxlKCIuIikKKyAgICAgICAgfQorICAgICAgICBwcmludGxuKCJDbG9zdXJlIGxvb3AgdG8gZGlzcGxheSBjb250ZW50cyBvZiBkaXI6ICIgKyBmaWxlKQorICAgICAgICBmaWxlLmVhY2hGaWxlIHsgZiAtPiBwcmludGxuKGYuZ2V0TmFtZSgpKSB9CisgICAgICAgIHByaW50bG4oIiIpCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdFRva2VuaXplKCkgeworICAgICAgICBkZWYgdGV4dCA9ICJoZWxsby10aGVyZS1ob3ctYXJlLXlvdSIKKyAgICAgICAgZGVmIGFuc3dlciA9IFtdCisgICAgICAgIGZvciAoaSBpbiB0ZXh0LnRva2VuaXplKCctJykpIHsKKyAgICAgICAgICAgIGFuc3dlci5hZGQoaSkKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQgYW5zd2VyID09IFsnaGVsbG8nLCAndGhlcmUnLCAnaG93JywgJ2FyZScsICd5b3UnXQorICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RVcHRvKCkgeworICAgICAgICBkZWYgYW5zd2VyID0gW10KKyAgICAgICAgMS51cHRvKDUpIHsgYW5zd2VyLmFkZChpdCkgfQorICAgICAgICBhc3NlcnQgYW5zd2VyID09IFsxLCAyLCAzLCA0LCA1XQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQ2xvc3VyZVJldHVyblRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9DbG9zdXJlUmV0dXJuVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEyY2NkZQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQ2xvc3VyZVJldHVyblRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMzQgQEAKK3BhY2thZ2UgZ3Jvb3Z5CisKKy8qKiAKKyAqIFRlc3RzIENsb3N1cmVzIGluIEdyb292eQorICogCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitjbGFzcyBDbG9zdXJlUmV0dXJuVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIHZvaWQgdGVzdFJldHVyblZhbHVlcygpIHsKKyAgICAgICAgZGVmIGJsb2NrID0ge3gtPiByZXR1cm4geCA+IDV9CisKKyAgICAgICAgZGVmIHZhbHVlID0gYmxvY2suY2FsbCgxMCkKKyAgICAgICAgYXNzZXJ0IHZhbHVlCisKKyAgICAgICAgdmFsdWUgPSBibG9jay5jYWxsKDMpCisgICAgICAgIGFzc2VydCB2YWx1ZSA9PSBmYWxzZQorICAgIH0KKworICAgIHZvaWQgdGVzdFJldHVyblZhbHVlVXNpbmdGdW5jdGlvbigpIHsKKyAgICAgICAgZGVmIGJsb2NrID0ge3gtPiByZXR1cm4gc29tZUZ1bmN0aW9uKHgpIH0KKyAgICAgICAgCisgICAgICAgIGRlZiB2YWx1ZSA9IGJsb2NrLmNhbGwoMTApCisgICAgICAgIGFzc2VydCB2YWx1ZQorCisgICAgICAgIHZhbHVlID0gYmxvY2suY2FsbCgzKQorICAgICAgICBhc3NlcnQgdmFsdWUgPT0gZmFsc2UKKyAgICB9CisgICAgCisgICAgZGVmIHNvbWVGdW5jdGlvbih4KSB7CisgICAgICAgIHJldHVybiB4ID4gNQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQ2xvc3VyZVJldHVybldpdGhvdXRSZXR1cm5TdGF0ZW1lbnRUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQ2xvc3VyZVJldHVybldpdGhvdXRSZXR1cm5TdGF0ZW1lbnRUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGIwOTYwCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9DbG9zdXJlUmV0dXJuV2l0aG91dFJldHVyblN0YXRlbWVudFRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMjggQEAKK3BhY2thZ2UgZ3Jvb3Z5CisKK2NsYXNzIENsb3N1cmVSZXR1cm5XaXRob3V0UmV0dXJuU3RhdGVtZW50VGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIHZvaWQgdGVzdFJldHVyblZhbHVlcygpIHsKKyAgICAgICAgZGVmIGJsb2NrID0ge3gtPiB4ID4gNX0KKworICAgICAgICBkZWYgdmFsdWUgPSBibG9jay5jYWxsKDEwKQorICAgICAgICBhc3NlcnQgdmFsdWUKKworICAgICAgICB2YWx1ZSA9IGJsb2NrLmNhbGwoMykKKyAgICAgICAgYXNzZXJ0IHZhbHVlID09IGZhbHNlCisgICAgfQorCisgICAgdm9pZCB0ZXN0UmV0dXJuVmFsdWVVc2luZ0Z1bmN0aW9uKCkgeworICAgICAgICBkZWYgYmxvY2sgPSB7eC0+IHNvbWVGdW5jdGlvbih4KSB9CisgICAgICAgIAorICAgICAgICBkZWYgdmFsdWUgPSBibG9jay5jYWxsKDEwKQorICAgICAgICBhc3NlcnQgdmFsdWUKKworICAgICAgICB2YWx1ZSA9IGJsb2NrLmNhbGwoMykKKyAgICAgICAgYXNzZXJ0IHZhbHVlID09IGZhbHNlCisgICAgfQorICAgIAorICAgIGRlZiBzb21lRnVuY3Rpb24oeCkgeworICAgICAgICB4ID4gNQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQ2xvc3VyZVN1Z2FyVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0Nsb3N1cmVTdWdhclRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkYjdiZWEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0Nsb3N1cmVTdWdhclRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMzUgQEAKK3BhY2thZ2UgZ3Jvb3Z5CisKK2NsYXNzIENsb3N1cmVTdWdhclRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICBkZWYgY291bnQ7CisKKyAgICB2b2lkIHRlc3RDbG9zdXJlU3VnYXIoKSB7CisgICAgICAgIGNvdW50ID0gMTE7CisKKyAgICAgICAgc3VnYXIgeworICAgICAgICAgICAgIGNvdW50ID0gMjA7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnQgY291bnQgPT0gMjA7CisgICAgfQorCisgICAgdm9pZCB0ZXN0TWl4ZWRDbG9zdXJlU3VnYXIoKSB7CisgICAgICAgIGRlZiBjb3VudCA9IDExOworCisgICAgICAgIG1peGVkU3VnYXIgKDUpe2EtPgorICAgICAgICAgICAgIGNvdW50ID0gY291bnQgKyBhOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0IGNvdW50ID09IDE2OworCisgICAgfQorCisgICAgZGVmIG1peGVkU3VnYXIoaW5jckJ5LCBDbG9zdXJlIGNsb3N1cmUpIHsKKyAgICAgICAgY2xvc3VyZS5jYWxsKCBpbmNyQnkgKTsgCisgICAgfQorCisgICAgZGVmIHN1Z2FyKENsb3N1cmUgY2xvc3VyZSkgeworICAgICAgICBjbG9zdXJlLmNhbGwoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0Nsb3N1cmVUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQ2xvc3VyZVRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1YThhMzAKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0Nsb3N1cmVUZXN0Lmdyb292eQpAQCAtMCwwICsxLDE1NCBAQAorcGFja2FnZSBncm9vdnkKKworLyoqIAorICogVGVzdHMgQ2xvc3VyZXMgaW4gR3Jvb3Z5CisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK2NsYXNzIENsb3N1cmVUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgZGVmIGNvdW50CisKKyAgICB2b2lkIHRlc3RTaW1wbGVCbG9ja0NhbGwoKSB7CisgICAgICAgIGNvdW50ID0gMAorCisgICAgICAgIGRlZiBibG9jayA9IHtvd25lci0+IG93bmVyLmluY3JlbWVudENhbGxDb3VudCgpIH0KKworICAgICAgICBhc3NlcnRDbG9zdXJlKGJsb2NrKQorICAgICAgICBhc3NlcnQgY291bnQgPT0gMQorCisgICAgICAgIGFzc2VydENsb3N1cmUoe293bmVyLT4gb3duZXIuaW5jcmVtZW50Q2FsbENvdW50KCkgfSkKKyAgICAgICAgYXNzZXJ0IGNvdW50ID09IDIKKyAgICB9CisKKyAgICB2b2lkIHRlc3RWYXJpYWJsZUxlbmd0aFBhcmFtZXRlckxpc3QoKSB7CisKKyAgICAgICAgZGVmIGMxID0ge09iamVjdFtdIGFyZ3MgLT4gYXJncy5lYWNoe2NvdW50ICs9IGl0fX0KKworICAgICAgICBjb3VudCA9IDAKKyAgICAgICAgYzEoMSwgMiwgMykKKyAgICAgICAgYXNzZXJ0IGNvdW50ID09IDYKKworICAgICAgICBjb3VudCA9IDAKKyAgICAgICAgYzEoMSkKKyAgICAgICAgYXNzZXJ0IGNvdW50ID09IDEKKworICAgICAgICBjb3VudCA9IDAKKyAgICAgICAgYzEoWzEsIDIsIDNdIGFzIE9iamVjdFtdKQorICAgICAgICBhc3NlcnQgY291bnQgPT0gNgorCisgICAgICAgIGRlZiBjMiA9IHthLCBPYmplY3RbXSBhcmdzIC0+IGNvdW50ICs9IGE7IGFyZ3MuZWFjaHtjb3VudCArPSBpdH19CisKKyAgICAgICAgY291bnQgPSAwCisgICAgICAgIGMyKDEsIDIsIDMpCisgICAgICAgIGFzc2VydCBjb3VudCA9PSA2CisKKyAgICAgICAgY291bnQgPSAwCisgICAgICAgIGMyKDEpCisgICAgICAgIGFzc2VydCBjb3VudCA9PSAxCisKKyAgICAgICAgY291bnQgPSAwCisgICAgICAgIGMyKDEsIFsyLCAzXSBhcyBPYmplY3RbXSkKKyAgICAgICAgYXNzZXJ0IGNvdW50ID09IDYKKyAgICB9CisKKyAgICB2b2lkIHRlc3RCbG9ja0FzUGFyYW1ldGVyKCkgeworICAgICAgICBjb3VudCA9IDAKKworICAgICAgICBjYWxsQmxvY2soNSwge293bmVyLT4gb3duZXIuaW5jcmVtZW50Q2FsbENvdW50KCkgfSkKKyAgICAgICAgYXNzZXJ0IGNvdW50ID09IDYKKworICAgICAgICBjYWxsQmxvY2syKDUsIHtvd25lci0+IG93bmVyLmluY3JlbWVudENhbGxDb3VudCgpIH0pCisgICAgICAgIGFzc2VydCBjb3VudCA9PSAxMgorICAgIH0KKyAgCisgICAgdm9pZCB0ZXN0TWV0aG9kQ2xvc3VyZSgpIHsKKyAgICAgICAgZGVmIGJsb2NrID0gdGhpcy4maW5jcmVtZW50Q2FsbENvdW50CisKKyAgICAgICAgY291bnQgPSAwCisKKyAgICAgICAgYmxvY2suY2FsbCgpCisKKyAgICAgICAgYXNzZXJ0IGNvdW50ID09IDEKKworICAgICAgICBibG9jayA9IFN5c3RlbS5vdXQuJnByaW50bG4KKworICAgICAgICBibG9jay5jYWxsKCJJIGp1c3QgaW52b2tlZCBhIGNsb3N1cmUhIikKKyAgICB9CisgIAorICAgIGRlZiBpbmNyZW1lbnRDYWxsQ291bnQoKSB7CisgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJpbnZva2VkIGluY3JlbWVudCBtZXRob2QhIikKKyAgICAgICAgY291bnQgPSBjb3VudCArIDEKKyAgICB9CisKKyAgICBkZWYgYXNzZXJ0Q2xvc3VyZShDbG9zdXJlIGJsb2NrKSB7CisgICAgICAgIGFzc2VydCBibG9jayAhPSBudWxsCisgICAgICAgIGJsb2NrLmNhbGwodGhpcykKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBjYWxsQmxvY2soSW50ZWdlciBudW0sIENsb3N1cmUgYmxvY2spIHsKKyAgICAgICAgZm9yICggaSBpbiAwLi5udW0gKSB7CisgICAgICAgICAgICBibG9jay5jYWxsKHRoaXMpCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBjYWxsQmxvY2syKG51bSwgYmxvY2spIHsKKyAgICAgICAgZm9yICggaSBpbiAwLi5udW0gKSB7CisgICAgICAgICAgICBibG9jay5jYWxsKHRoaXMpCisgICAgICAgIH0KKyAgICB9CisKKworICAgIGludCBudW1BZ2VudHMgPSA0CisgICAgYm9vbGVhbiB0ZXN0RG9uZSA9IGZhbHNlCisKKyAgICB2b2lkIHRlc3RJbnRGaWVsZEFjY2VzcygpIHsKKyAgICAgICAgZGVmIGFnZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgbnVtQWdlbnRzLnRpbWVzIHsKKyAgICAgICAgICAgIFRpbnlBZ2VudCBidG4gPSBuZXcgVGlueUFnZW50KCkKKyAgICAgICAgICAgIHRlc3REb25lID0gdHJ1ZQorICAgICAgICAgICAgYnRuLnggPSBudW1BZ2VudHMKKyAgICAgICAgICAgIGFnZW50cy5hZGQoYnRuKQorICAgICAgICB9CisgICAgICAgIGFzc2VydCBhZ2VudHMuc2l6ZSgpID09IG51bUFnZW50cworICAgIH0KKworICAgIHZvaWQgdGVzdFdpdGhJbmRleCgpIHsKKyAgICAgICAgZGVmIHN0ciA9ICcnCisgICAgICAgIGRlZiBzdW0gPSAwCisgICAgICAgIFsnYScsJ2InLCdjJywnZCddLmVhY2hXaXRoSW5kZXggeyBpdGVtLCBpbmRleCAtPiBzdHIgKz0gaXRlbTsgc3VtICs9IGluZGV4IH0KKyAgICAgICAgYXNzZXJ0IHN0ciA9PSAnYWJjZCcgJiYgc3VtID09IDYKKyAgICB9CisKKyAgICAvKioKKyAgICAqIFRlc3QgYWNjZXNzIHRvIENsb3N1cmUncyBwcm9wZXJ0aWVzCisgICAgKiBjZiBHUk9PVlktMjA4OQorICAgICovCisgICAgdm9pZCB0ZXN0UHJvcGVydGllcygpIHsKKyAgICAgICAgZGVmIGMgPSB7IHByaW50bG4gaXQgfQorCisgICAgICAgIGFzc2VydCAxID09IGMuZ2V0TWF4aW11bU51bWJlck9mUGFyYW1ldGVycygpCisgICAgICAgIGFzc2VydCAxID09IGMubWF4aW11bU51bWJlck9mUGFyYW1ldGVycworICAgICAgICBzaG91bGRGYWlsIHsKKyAgICAgICAgICAgIGFzc2VydCAxID09IGMuZ2V0TWF4aW11bU51bWJlck9mUGFyYW1ldGVycyAvLyB3b3JrZWQgaW4gR3Jvb3Z5IDEuMCBidXQgaXMgd3JvbmcKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IDAgPT0gYy5nZXREaXJlY3RpdmUoKQorICAgICAgICBhc3NlcnQgMCA9PSBjLmRpcmVjdGl2ZQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBHUk9PVlktMjE1MCBlbnN1cmUgbGlzdCBjYWxsIGlzIGF2YWlsYWJsZSBvbiBjbG9zdXJlCisgICAgICovCisgICAgdm9pZCB0ZXN0Q2FsbENsb3N1cmVXaXRobGlzdCgpIHsKKyAgICAgIGRlZiBsaXN0ID0gWzEsMl0KKyAgICAgIGRlZiBjbCA9IHthLGItPmErYiB9CisgICAgICBhc3NlcnQgY2wobGlzdCk9PTMKKyAgICB9Cit9CisKK3B1YmxpYyBjbGFzcyBUaW55QWdlbnQgeworICAgIGludCB4Cit9CisKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQ2xvc3VyZVVzaW5nT3V0ZXJWYXJpYWJsZXNUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQ2xvc3VyZVVzaW5nT3V0ZXJWYXJpYWJsZXNUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmQxNzBjCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9DbG9zdXJlVXNpbmdPdXRlclZhcmlhYmxlc1Rlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsNzEgQEAKK3BhY2thZ2UgZ3Jvb3Z5CisKKy8qKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK2NsYXNzIENsb3N1cmVVc2luZ091dGVyVmFyaWFibGVzVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKyAgICAKKyAgICB2b2lkIHRlc3RVc2VPZk91dGVyVmFyaWFibGUoKSB7CisgICAgICAgIAorICAgICAgICBkZWYgeCA9IDEyMworICAgICAgICBkZWYgeSA9ICJoZWxsbyIKKyAgICAgICAgCisgICAgICAgIGRlZiBjbG9zdXJlID0geyBpIC0+CisgICAgICAgICAgICBwcmludGxuKCJ4ICR7eH0iKQorICAgICAgICAgICAgcHJpbnRsbigieSAke3l9IikKKyAgICAgICAgICAgIHByaW50bG4oImkgJHtpfSIpCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBhc3NlcnQgeCA9PSAxMjMKKyAgICAgICAgICAgIGFzc2VydCB5ID09ICdoZWxsbycKKyAgICAgICAgfQorICAgICAgICBjbG9zdXJlLmNhbGwoMzIxKQorCX0KKworICAgICAvKgorICAgICBUT0RPOiBpcyB0aGlzIGEgdmFsaWQgdGVzdCBjYXNlPworICAgICB2b2lkIHRlc3RJbm5lclZhcmlhYmxlc1Zpc2libGVJbk91dGVyU2NvcGUoKSB7CisgICAgICAgICAgICAgICAgCisgICAgICAgIGNsb3N1cmUgPSB7IHogPSA0NTYgfSAKKyAgICAgICAgY2xvc3VyZS5jYWxsKDMyMSkKKyAgICAgICAgCisgICAgICAgIGFzc2VydCB6ID09IDQ1NgorICAgIH0KKyAgICAqLworICAgIAorICAgIHZvaWQgdGVzdE1vZGlmeWluZ091dGVyVmFyaWFibGUoKSB7CisgICAgICAgIAorICAgICAgICBkZWYgbSA9IDEyMworICAgICAgICAKKyAgICAgICAgZGVmIGNsb3N1cmUgPSB7IG0gPSA0NTYgfSAKKyAgICAgICAgY2xvc3VyZS5jYWxsKDMyMSkKKyAgICAgICAgCisgICAgICAgIGFzc2VydCBtID09IDQ1NgorICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RDb3VudGluZygpIHsKKyAgICAgICAgZGVmIHN1bSA9IDAKKworICAgICAgICBbMSwgMiwgMywgNF0uZWFjaCB7IHN1bSA9IHN1bSArIGl0IH0KKworICAgICAgICBhc3NlcnQgc3VtID09IDEwCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdEV4YW1wbGVVc2VPZkNsb3N1cmVTY29wZXMoKSB7CisgICAgICAgIGRlZiBhID0gMTIzCisgICAgICAgIGRlZiBiCisgICAgICAgIGRlZiBjID0geyBiID0gYSArIGl0IH0KKyAgICAgICAgYyg1KQorICAgICAgICAKKyAgICAgICAgcHJpbnRsbihiKQorICAgICAgICBhc3NlcnQgYiA9PSBhICsgNQorICAgIH0gICAgCisKKyAgICB2b2lkIHRlc3RFeGFtcGxlVXNlT2ZDbG9zdXJlU2NvcGVzVXNpbmdFYWNoKCkgeworICAgICAgICBkZWYgYSA9IDEyMworICAgICAgICBkZWYgYgorICAgICAgICBbNV0uZWFjaCB7IGIgPSBhICsgaXQgfQorCisgICAgICAgIGFzc2VydCBiID09IGEgKyA1CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9DbG9zdXJlV2l0aERlZmF1bHRQYXJhbVRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9DbG9zdXJlV2l0aERlZmF1bHRQYXJhbVRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmYWYxNmQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0Nsb3N1cmVXaXRoRGVmYXVsdFBhcmFtVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwxNjAgQEAKK3BhY2thZ2UgZ3Jvb3Z5CisKKy8qKiAKKyAqIERlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIHRoZSBkZWZhdWx0IG5hbWVkIHBhcmFtZXRlciBpbiBhIGNsb3N1cmUKKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworY2xhc3MgQ2xvc3VyZVdpdGhEZWZhdWx0UGFyYW1UZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCBtZXRob2RXaXRoRGVmYXVsdFBhcmFtKGV4YW1wbGU9J2RlZmF1bHQnKXsKKyAgICAgICAgYXNzZXJ0ICdkZWZhdWx0JyA9PSBleGFtcGxlCisgICAgfQorCisgICAgdm9pZCB0ZXN0TGlzdENvbGxlY3QoKSB7CisgICAgICAgIGRlZiBsaXN0ID0gWzEsIDIsIDMsIDRdCisgICAgICAgIGRlZiBhbnN3ZXIgPSBsaXN0LmNvbGxlY3QgeyBpdCAqIDIgfQorCisgICAgICAgIGFzc2VydCBhbnN3ZXIuc2l6ZSgpID09IDQKKyAgICAgICAgCisgICAgICAgIGRlZiBleHBlY3RlZCA9IFsyLCA0LCA2LCA4XQorICAgICAgICBhc3NlcnQgYW5zd2VyID09IGV4cGVjdGVkCisgICAgfQorCisgICAgdm9pZCB0ZXN0TWFwQ29sbGVjdCgpIHsKKyAgICAgICAgZGVmIG1hcCA9IFsxOjIsIDI6NCwgMzo2LCA0OjhdCisgICAgICAgIGRlZiBhbnN3ZXIgPSBtYXAuY29sbGVjdCB7IGl0LmtleSArIGl0LnZhbHVlIH0KKwkJCisJCS8vIGxlc3Qgc29ydCB0aGUgcmVzdWx0cyBzaW5jZSBtYXBzIGFyZSBpbiBoYXNoIGNvZGUgb3JkZXIKKwkJYW5zd2VyID0gYW5zd2VyLnNvcnQoKQorCQkKKyAgICAgICAgYXNzZXJ0IGFuc3dlci5zaXplKCkgPT0gNAorICAgICAgICBhc3NlcnQgYW5zd2VyID09IFszLCA2LCA5LCAxMl0KKyAgICAgICAgYXNzZXJ0IGFuc3dlci5nZXQoMCkgPT0gMworICAgICAgICBhc3NlcnQgYW5zd2VyLmdldCgxKSA9PSA2CisgICAgICAgIGFzc2VydCBhbnN3ZXIuZ2V0KDIpID09IDkKKyAgICAgICAgYXNzZXJ0IGFuc3dlci5nZXQoMykgPT0gMTIKKyAgICB9CisKKyAgICB2b2lkIHRlc3RMaXN0RmluZCgpIHsKKyAgICAgICAgZGVmIGxpc3QgPSBbImEiLCAiYiIsICJjIl0KKyAgICAgICAgZGVmIGFuc3dlciA9IGxpc3QuZmluZCB7aXQgPT0gImIiIH0KKyAgICAgICAgYXNzZXJ0IGFuc3dlciA9PSAiYiIKKyAgICAgICAgCisgICAgICAgIGFuc3dlciA9IGxpc3QuZmluZCB7aXQgPT0gInoiIH0KKyAgICAgICAgYXNzZXJ0IGFuc3dlciA9PSBudWxsCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdE1hcEZpbmQoKSB7CisgICAgICAgIGRlZiBtYXAgPSBbMToyLCAyOjQsIDM6NiwgNDo4XQorICAgICAgICBkZWYgYW5zd2VyID0gbWFwLmZpbmQge2l0LnZhbHVlID09IDYgfQorICAgICAgICBhc3NlcnQgYW5zd2VyICE9IG51bGwKKyAgICAgICAgYXNzZXJ0IGFuc3dlci5rZXkgPT0gMworICAgICAgICBhc3NlcnQgYW5zd2VyLnZhbHVlID09IDYKKyAgICAgICAgCisgICAgICAgIGFuc3dlciA9IG1hcC5maW5kIHtpdC52YWx1ZSA9PSAwIH0KKyAgICAgICAgYXNzZXJ0IGFuc3dlciA9PSBudWxsCisgICAgfQorCisgICAgdm9pZCB0ZXN0TGlzdEZpbmRBbGwoKSB7CisgICAgICAgIGRlZiBsaXN0ID0gWzIwLCA1LCA0MCwgMl0KKyAgICAgICAgZGVmIGFuc3dlciA9IGxpc3QuZmluZEFsbCB7aXQgPCAxMCB9CisKKyAgICAgICAgYXNzZXJ0IGFuc3dlci5zaXplKCkgPT0gMgorICAgICAgICBhc3NlcnQgYW5zd2VyID09IFs1LCAyXQorICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RNYXBGaW5kQWxsKCkgeworICAgICAgICBkZWYgbWFwID0gWzE6MiwgMjo0LCAzOjYsIDQ6OF0KKyAgICAgICAgZGVmIGFuc3dlciA9IG1hcC5maW5kQWxsIHtpdC52YWx1ZSA+IDUgfQorCisgICAgICAgIGFzc2VydCBhbnN3ZXIuc2l6ZSgpID09IDIKKyAgICAgICAgCisgICAgICAgIGRlZiBrZXlzID0gYW5zd2VyLmNvbGxlY3Qge2l0LmtleSB9CisgICAgICAgIGRlZiB2YWx1ZXMgPSBhbnN3ZXIuY29sbGVjdCB7aXQudmFsdWUgfQorCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigia2V5cyAiICsga2V5cyArICIgdmFsdWVzICIgKyB2YWx1ZXMpCisJCQorICAgICAgICAvLyBtYXBzIGFyZSBpbiBoYXNoIG9yZGVyIHNvIGxldHMgc29ydCB0aGUgcmVzdWx0cyAgICAgICAKKyAgICAgICAga2V5cy5zb3J0KCkgCisgICAgICAgIHZhbHVlcy5zb3J0KCkgCisgICAgICAgIAorICAgICAgICBhc3NlcnQga2V5cyA9PSBbMywgNF0KKyAgICAgICAgYXNzZXJ0IHZhbHVlcyA9PSBbNiwgOF0KKyAgICB9CisKKyAgICB2b2lkIHRlc3RMaXN0RWFjaCgpIHsKKyAgICAgICAgZGVmIGNvdW50ID0gMAorCisgICAgICAgIGRlZiBsaXN0ID0gWzEsIDIsIDMsIDRdCisgICAgICAgIGxpc3QuZWFjaCB7IGNvdW50ID0gY291bnQgKyBpdCB9CisJCQorICAgICAgICBhc3NlcnQgY291bnQgPT0gMTAKKworICAgICAgICBsaXN0LmVhY2ggeyBjb3VudCA9IGNvdW50ICsgaXQgfQorCQkKKyAgICAgICAgYXNzZXJ0IGNvdW50ID09IDIwCisgICAgfQorCisgICAgdm9pZCB0ZXN0TWFwRWFjaCgpIHsKKyAgICAgICAgZGVmIGNvdW50ID0gMAorCisgICAgICAgIGRlZiBtYXAgPSBbMToyLCAyOjQsIDM6NiwgNDo4XQorICAgICAgICBtYXAuZWFjaCB7IGNvdW50ID0gY291bnQgKyBpdC52YWx1ZSB9CisKKyAgICAgICAgYXNzZXJ0IGNvdW50ID09IDIwCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdExpc3RFdmVyeSgpIHsKKyAgICAgICAgYXNzZXJ0IFsxLCAyLCAzLCA0XS5ldmVyeSB7IGl0IDwgNSB9CisgICAgICAgIGFzc2VydCBbMSwgMiwgNywgNF0uZXZlcnkgeyBpdCA8IDUgfSA9PSBmYWxzZQorICAgIH0KKworICAgIHZvaWQgdGVzdExpc3RBbnkoKSB7CisgICAgICAgIGFzc2VydCBbMSwgMiwgMywgNF0uYW55IHsgaXQgPCA1IH0KKyAgICAgICAgYXNzZXJ0IFsxLCAyLCAzLCA0XS5hbnkgeyBpdCA+IDMgfQorICAgICAgICBhc3NlcnQgWzEsIDIsIDMsIDRdLmFueSB7IGl0ID4gNSB9ID09IGZhbHNlCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdEpvaW4oKSB7CisgICAgICAgIGRlZiB2YWx1ZSA9IFsxLCAyLCAzXS5qb2luKCctJykKKyAgICAgICAgYXNzZXJ0IHZhbHVlID09ICIxLTItMyIKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0TGlzdFJldmVyc2UoKSB7CisgICAgICAgIGRlZiB2YWx1ZSA9IFsxLCAyLCAzLCA0XS5yZXZlcnNlKCkKKyAgICAgICAgYXNzZXJ0IHZhbHVlID09IFs0LCAzLCAyLCAxXQorICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RFYWNoTGluZSgpIHsKKyAgICAgICAgZGVmIGZpbGUgPSBuZXcgRmlsZSgic3JjL3Rlc3QvZ3Jvb3Z5L0Jhci5ncm9vdnkiKQorICAgICAgICAKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb250ZW50cyBvZiBmaWxlOiAiICsgZmlsZSkKKyAgICAgICAgCisgICAgICAgIGZpbGUuZWFjaExpbmUgeyBwcmludGxuKGl0KSB9CisgICAgICAgIAorICAgICAgICBwcmludGxuKCIiKQorICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RSZWFkTGluZXMoKSB7CisgICAgICAgIGRlZiBmaWxlID0gbmV3IEZpbGUoInNyYy90ZXN0L2dyb292eS9CYXIuZ3Jvb3Z5IikKKworCQlkZWYgbGluZXMgPSBmaWxlLnJlYWRMaW5lcygpCisJCQorCQlhc3NlcnQgbGluZXMgIT0gbnVsbAorCQlhc3NlcnQgbGluZXMuc2l6ZSgpID4gMAorCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmlsZSBoYXMgbnVtYmVyIG9mIGxpbmVzOiAiICsgbGluZXMuc2l6ZSgpKQorICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RFYWNoRmlsZSgpIHsKKyAgICAgICAgZGVmIGZpbGUgPSBuZXcgRmlsZSgic3JjL3Rlc3QvZ3Jvb3Z5IikKKyAgICAgICAgCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ29udGVudHMgb2YgZGlyOiAiICsgZmlsZSkKKyAgICAgICAgCisgICAgICAgIGZpbGUuZWFjaEZpbGUgeyBwcmludGxuKGl0LmdldE5hbWUoKSkgfQorICAgICAgICAKKyAgICAgICAgcHJpbnRsbigiIikKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0Nsb3N1cmVXaXRoRW1wdHlQYXJhbWV0ZXJzVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0Nsb3N1cmVXaXRoRW1wdHlQYXJhbWV0ZXJzVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNmOGRlYgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQ2xvc3VyZVdpdGhFbXB0eVBhcmFtZXRlcnNUZXN0Lmdyb292eQpAQCAtMCwwICsxLDIxIEBACitwYWNrYWdlIGdyb292eQorCisvKiogCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqc3RyYWNoYW5AcHJvdGlxdWUuY29tIj5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworY2xhc3MgQ2xvc3VyZVdpdGhFbXB0eVBhcmFtZXRlcnNUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCB0ZXN0Tm9QYXJhbXMoKSB7CisKKyAgICAgICAgZGVmIGJsb2NrID0gey0+IHByaW50bG4gImhleSBJJ20gYSBjbG9zdXJlISIgfQorCisgICAgICAgIHByaW50bG4gIkFib3V0IHRvIGNhbGwgY2xvc3VyZSIKKworICAgICAgICBibG9jay5jYWxsKCkKKworICAgICAgICBwcmludGxuICJEb25lIgorICAgIH0KKworfQorCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0NvbXBhcmVFcXVhbHNUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQ29tcGFyZUVxdWFsc1Rlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZGJjZmEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0NvbXBhcmVFcXVhbHNUZXN0Lmdyb292eQpAQCAtMCwwICsxLDMwIEBACitwYWNrYWdlIGdyb292eQorCitjbGFzcyBDb21wYXJlRXF1YWxzVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKyAgICB2b2lkIHRlc3RFcXVhbHNPcGVyYXRvcklzTXVsdGltZXRob2RBd2FyZSgpIHsKKyAgICAgICAgYXNzZXJ0IG5ldyBYeXooKSA9PSBuZXcgWHl6KCkKKworICAgICAgICBhc3NlcnRFcXVhbHMgbmV3IFh5eigpLCBuZXcgWHl6KCkKKworICAgICAgICBzaG91bGRGYWlsIHsKKyAgICAgICAgICBhc3NlcnQgbmV3IFh5eigpID09IDIzOQorICAgICAgICB9CisgICAgICAgIGFzc2VydCBuZXcgWHl6ICgpID09ICJHUk9PVlkuWFlaIgorICAgIH0KK30KKworY2xhc3MgWHl6IHsKKyAgICBib29sZWFuIGVxdWFscyhYeXogb3RoZXIpIHsKKyAgICAgICAgcHJpbnRsbiAiJHtvdGhlci5jbGFzc30gVFJVRSIKKyAgICAgICAgdHJ1ZQorICAgIH0KKworICAgIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgeworICAgICAgICBwcmludGxuICIke290aGVyLmNsYXNzfSBGQUxTRSIKKyAgICAgICAgbnVsbAorICAgIH0KKworICAgIGJvb2xlYW4gZXF1YWxzKFN0cmluZyBzdHIpIHsKKyAgICAgICAgc3RyLmVxdWFsc0lnbm9yZUNhc2UgdGhpcy5jbGFzcy5nZXROYW1lKCkKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0NvbXBhcmVUb1Rlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9Db21wYXJlVG9UZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjIwNDhmCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9Db21wYXJlVG9UZXN0Lmdyb292eQpAQCAtMCwwICsxLDM5IEBACitwYWNrYWdlIGdyb292eQorCitjbGFzcyBDb21wYXJlVG9UZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCB0ZXN0Q29tcGFyZVRvKCkgeworCisgICAgICAgIGRlZiBhID0gMTIKKyAgICAgICAgZGVmIGIgPSAyMAorICAgICAgICBkZWYgYyA9IDMwCisgICAgICAgIAorICAgICAgICBkZWYgcmVzdWx0ID0gYSA8PT4gYgorICAgICAgICBhc3NlcnQgcmVzdWx0IDwgMAorCisgICAgICAgIHJlc3VsdCA9IGEgPD0+IDEyCisgICAgICAgIGFzc2VydCByZXN1bHQgPT0gMAorCisgICAgICAgIHJlc3VsdCA9IGMgPD0+IGIKKyAgICAgICAgYXNzZXJ0IHJlc3VsdCA+IDAKKyAgICAgICAgCisgICAgICAgIGFzc2VydCAoYSA8PT4gYikgPCAwCisgICAgICAgIGFzc2VydCBhIDw9PiAxMiA9PSAwCisgICAgICAgIGFzc2VydCAoYyA8PT4gYikgPiAwCisgICAgfQorCisgICAgdm9pZCB0ZXN0TnVsbENvbXBhcmVzKCkgeworICAgIAorICAgIAlkZWYgYSA9IDEyMworICAgIAlkZWYgYiA9IG51bGwKKyAgICAJCisgICAgCWRlZiByZXN1bHQgPSBhIDw9PiBiCisgICAgCWFzc2VydCByZXN1bHQgPiAwCisgICAgCQorICAgIAlyZXN1bHQgPSBiIDw9PiBhCisgICAgCWFzc2VydCByZXN1bHQgPCAwCisgICAgCQorICAgIAlyZXN1bHQgPSBiIDw9PiBudWxsCisgICAgCWFzc2VydCByZXN1bHQgPT0gMAorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQ29tcGFyZVR5cGVzVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0NvbXBhcmVUeXBlc1Rlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3NzQ5ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0NvbXBhcmVUeXBlc1Rlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsNTggQEAKK3BhY2thZ2UgZ3Jvb3Z5CisKKy8qKgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitjbGFzcyBOdW1iZXJUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeyAKKyAgICB2b2lkIHRlc3RDb21wYXJlQnl0ZVRvSW50KCkgeyAKKyAgICAgICAgQnl0ZSBhID0gMTIKKyAgICAgICAgSW50ZWdlciBiID0gMTAKKyAgICAgICAgCisgICAgICAgIGFzc2VydCBhIGluc3RhbmNlb2YgQnl0ZQorICAgICAgICBhc3NlcnQgYiBpbnN0YW5jZW9mIEludGVnZXIKKyAgICAgICAgCisgICAgICAgIGFzc2VydCBhID4gYgorICAgIH0gCisgICAgCisgICAgdm9pZCB0ZXN0Q29tcGFyZUJ5dGVUb0RvdWJsZSgpIHsgCisgICAgICAgIEJ5dGUgYSA9IDEyCisgICAgICAgIERvdWJsZSBiID0gMTAKKyAgICAgICAgCisgICAgICAgIGFzc2VydCBhIGluc3RhbmNlb2YgQnl0ZQorICAgICAgICBhc3NlcnQgYiBpbnN0YW5jZW9mIERvdWJsZQorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IGEgPiBiCisgICAgfSAKKyAgICAgCisgICAgdm9pZCB0ZXN0Q29tcGFyZUxvbmdUb0RvdWJsZSgpIHsgCisgICAgICAgIExvbmcgYSA9IDEyCisgICAgICAgIERvdWJsZSBiID0gMTAKKyAgICAgICAgCisgICAgICAgIGFzc2VydCBhIGluc3RhbmNlb2YgTG9uZworICAgICAgICBhc3NlcnQgYiBpbnN0YW5jZW9mIERvdWJsZQorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IGEgPiBiCisgICAgfSAKKyAgICAgCisgICAgdm9pZCB0ZXN0Q29tcGFyZUxvbmdUb0J5dGUoKSB7IAorICAgICAgICBMb25nIGEgPSAxMgorICAgICAgICBCeXRlIGIgPSAxMAorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IGEgaW5zdGFuY2VvZiBMb25nCisgICAgICAgIGFzc2VydCBiIGluc3RhbmNlb2YgQnl0ZQorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IGEgPiBiCisgICAgfSAKKyAgICAgCisgICAgdm9pZCB0ZXN0Q29tcGFyZUludGVnZXJUb0J5dGUoKSB7IAorICAgICAgICBJbnRlZ2VyIGEgPSAxMgorICAgICAgICBCeXRlIGIgPSAxMAorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IGEgaW5zdGFuY2VvZiBJbnRlZ2VyCisgICAgICAgIGFzc2VydCBiIGluc3RhbmNlb2YgQnl0ZQorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IGEgPiBiCisgICAgfSAKK30gCisKKwpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9Db21waWxlT3JkZXJUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQ29tcGlsZU9yZGVyVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlhYzEzZQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQ29tcGlsZU9yZGVyVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwzNSBAQAorcGFja2FnZSBncm9vdnkNCisNCitjbGFzcyBDb21waWxlT3JkZXJUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2Ugew0KKyAgIHB1YmxpYyB2b2lkIHRlc3RDb21waWxlT3JkZXIoKSB7DQorICAgICAgZGVmIGludGVyZmFjZUZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJUZXN0T3JkZXJJbnRlcmZhY2UiLCAiLmdyb292eSIsIG5ldyBGaWxlKCJ0YXJnZXQiKSkNCisgICAgICBkZWYgY29uY3JldGVGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiVGVzdE9yZGVyQ29uY3JldGUiLCAiLmdyb292eSIsIG5ldyBGaWxlKCJ0YXJnZXQiKSkNCisNCisgICAgICBkZWYgY2wgPSBuZXcgR3Jvb3Z5Q2xhc3NMb2FkZXIodGhpcy5jbGFzcy5jbGFzc0xvYWRlcik7DQorICAgICAgZGVmIGN1cnJlbnREaXIgPSBjb25jcmV0ZUZpbGUucGFyZW50RmlsZS5hYnNvbHV0ZVBhdGgNCisgICAgICBwcmludGxuIGN1cnJlbnREaXINCisgICAgICBjbC5hZGRDbGFzc3BhdGgoY3VycmVudERpcikNCisgICAgICBjbC5zaG91bGRSZWNvbXBpbGUgPSB0cnVlDQorDQorICAgICAgdHJ5IHsNCisgICAgICAgICAvLyBDcmVhdGUgdGhlIGludGVyZmFjZQ0KKyAgICAgICAgIHByaW50bG4gImEiDQorICAgICAgICAgaW50ZXJmYWNlRmlsZS5kZWxldGVPbkV4aXQoKQ0KKyAgICAgICAgIGRlZiBpbnRlcmZhY2VOYW1lID0gaW50ZXJmYWNlRmlsZS5uYW1lIC0gIi5ncm9vdnkiDQorICAgICAgICAgaW50ZXJmYWNlRmlsZS53cml0ZSAiaW50ZXJmYWNlICRpbnRlcmZhY2VOYW1lIHsgfVxuIg0KKw0KKyAgICAgICAgIC8vIENyZWF0ZSBhIGNvbmNyZXRlIGNsYXNzIHdoaWNoIGltcGxlbWVudHMgdGhlIGludGVyZmFjZQ0KKyAgICAgICAgIGNvbmNyZXRlRmlsZS5kZWxldGVPbkV4aXQoKQ0KKyAgICAgICAgIGRlZiBjb25jcmV0ZU5hbWUgPSBjb25jcmV0ZUZpbGUubmFtZSAtICIuZ3Jvb3Z5Ig0KKyAgICAgICAgIGNvbmNyZXRlRmlsZS53cml0ZSAiY2xhc3MgJGNvbmNyZXRlTmFtZSBpbXBsZW1lbnRzICRpbnRlcmZhY2VOYW1lIHsgfVxuIg0KKw0KKyAgICAgICAgIC8vIFdlJ3JlIHRlc3Rpbmcgd2hldGhlciB0aGlzIGZhaWxzOg0KKyAgICAgICAgIGRlZiBncm9vdnlDbGFzcyA9IGNsLmxvYWRDbGFzcyhjb25jcmV0ZU5hbWUsdHJ1ZSxmYWxzZSkNCisgICAgICAgICAvLyBDcmVhdGUgYW4gb2JqZWN0LCBqdXN0IGZvciBnb29kIG1lYXN1cmUuDQorICAgICAgICAgZGVmIG9iamVjdCA9IGdyb292eUNsYXNzLm5ld0luc3RhbmNlKCkNCisgICAgICB9IGZpbmFsbHkgew0KKyAgICAgICAgIGludGVyZmFjZUZpbGUuZGVsZXRlKCkNCisgICAgICAgICBjb25jcmV0ZUZpbGUuZGVsZXRlKCkNCisgICAgICB9DQorICAgfQ0KK30NCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0NvbXBpbGVyRXJyb3JUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQ29tcGlsZXJFcnJvclRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NTNmOWYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0NvbXBpbGVyRXJyb3JUZXN0Lmdyb292eQpAQCAtMCwwICsxLDM5IEBACitwYWNrYWdlIGdyb292eQorCitjbGFzcyBDb21waWxlckVycm9yVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIHZvaWQgdGVzdEJhZE1ldGhvZE5hbWUoKSB7CisKKyAgICAgICAgc2hvdWxkRmFpbCB7CisgICAgICAgICAgICBwcmludGxuICJBYm91dCB0byBjYWxsIHNoZWxsIHNjcmlwdCIKKyAgICAgICAgICAgIHByaW50bG4gIlJlYWxseSBhbSBhYm91dCB0byBjYWxsIHNoZWxsIHNjcmlwdCIKKworICAgICAgICAgICAgZGVmIHNoZWxsID0gbmV3IEdyb292eVNoZWxsKCkKKyAgICAgICAgICAgIGRlZiB0ZXh0ID0gJ2JhZE1ldGhvZCgpOyBwcmludGxuICJDYWxsZWQgbWV0aG9kIicKKyAgICAgICAgICAgIHByaW50bG4gIkFib3V0IHRvIHRlc3Qgc2NyaXB0ICR7dGV4dH0iCisgICAgICAgICAgICBzaGVsbC5ldmFsdWF0ZSh0ZXh0KQorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCB0ZXN0QmFkUHJvcGVydHlOYW1lKCkgeworCisgICAgICAgIHNob3VsZEZhaWwgeworICAgICAgICAgICAgZGVmIHNoZWxsID0gbmV3IEdyb292eVNoZWxsKCkKKyAgICAgICAgICAgIHNoZWxsLmV2YWx1YXRlICIiIgorICAgICAgICAgICAgICAgIGRlZiB4ID0gWzpdCisgICAgICAgICAgICAgICAgeC5cJGZvbyA9IDEyMworICAgICAgICAgICAgIiIiCisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHRlc3RCYWRWYXJpYWJsZU5hbWUoKSB7CisKKyAgICAgICAgc2hvdWxkRmFpbCB7CisgICAgICAgICAgICBkZWYgc2hlbGwgPSBuZXcgR3Jvb3Z5U2hlbGwoKQorICAgICAgICAgICAgc2hlbGwuZXZhbHVhdGUgIiIiCisgICAgICAgICAgICAgICAgZGVmIFwkeCA9IDEyMworICAgICAgICAgICAgIiIiCisgICAgICAgIH0KKyAgICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0NvbnN0cnVjdG9yMlRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9Db25zdHJ1Y3RvcjJUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWMwMjdkCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9Db25zdHJ1Y3RvcjJUZXN0Lmdyb292eQpAQCAtMCwwICsxLDE1IEBACitwYWNrYWdlIGdyb292eQorCitjbGFzcyBDb25zdHJ1Y3RvcjJUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgQ29uc3RydWN0b3IyVGVzdCgpIHsKKyAgICAgICAgcHJpbnRsbiAiSGV5IgorICAgIH0KKworICAgIHZvaWQgdGVzdENvbnN0cnVjdG9yKCkgeworICAgICAgICBkZWYgZm9vID0gbmV3IENvbnN0cnVjdG9yMlRlc3QoKQorICAgICAgICBhc3NlcnQgZm9vICE9IG51bGwKKyAgICAgICAgcHJpbnRsbiBmb28KKyAgICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0NvbnN0cnVjdG9yVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0NvbnN0cnVjdG9yVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIzZDY1NQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQ29uc3RydWN0b3JUZXN0Lmdyb292eQpAQCAtMCwwICsxLDE1IEBACitwYWNrYWdlIGdyb292eQorCitjbGFzcyBDb25zdHJ1Y3RvclRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgQ29uc3RydWN0b3JUZXN0KCkgeworICAgICAgICBwcmludGxuICJIZXkiCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yKCkgeworICAgICAgICBkZWYgZm9vID0gbmV3IENvbnN0cnVjdG9yVGVzdCgpCisgICAgICAgIGFzc2VydCBmb28gIT0gbnVsbAorICAgICAgICBwcmludGxuIGZvbworICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvQ3VybHlCcmFja2V0TGF5b3V0VGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0N1cmx5QnJhY2tldExheW91dFRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMGUwZGIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0N1cmx5QnJhY2tldExheW91dFRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMjQgQEAKK3BhY2thZ2UgZ3Jvb3Z5CisKK2NsYXNzIEN1cmx5QnJhY2tldExheW91dFRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZQoreworICAgIHZvaWQgdGVzdEJyYWNrZXRQbGFjZW1lbnQoKQorICAgIHsKKyAgICAgICAgZGVmIGZvbyA9ICJhYmMiCisKKyAgICAgICAgaWYgKGZvby5jb250YWlucygiYiIpKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGxuICJXb3JrZWQgYSB0cmVhdC4gZm9vID0gJGZvbyIKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIGZvdW5kICdiJyBpbnNpZGUgJGZvbyIpCisgICAgICAgIH0KKworICAgICAgICBkZWYgbGlzdCA9IFsxLCAyLCAzXQorICAgICAgICBsaXN0LmVhY2gKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRsbiBpdAorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvRGF0ZVRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9EYXRlVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVjMmNmOAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvRGF0ZVRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMzMgQEAKK3BhY2thZ2UgZ3Jvb3Z5CisKK2NsYXNzIERhdGVUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworICAKKyAgICB2b2lkIHRlc3ROZXh0UHJldmlvdXMoKSB7CisgICAgICAgIGRlZiB4ID0gbmV3IERhdGUoKQorICAgICAgICBkZWYgeSA9IHggKyAyCisgICAgICAgIAorICAgICAgICBhc3NlcnQgeCA8IHkKKyAgICAgICAgKyt4CisgICAgICAgIC0teQorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IHggPT0geQorICAgICAgICB4ICs9IDIKKyAgICAgICAgYXNzZXJ0IHggPiB5CisgICAgICAgIAorICAgICAgICBwcmludGxuICJoYXZlIGRhdGVzICR7eH0gYW5kICR7eX0iCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdERhdGVSYW5nZSgpIHsKKyAgICAgICAgCisgICAgICAgIGRlZiB0b2RheSA9IG5ldyBEYXRlKCkKKyAgICAgICAgZGVmIGxhdGVyID0gdG9kYXkgKyAzCisgICAgICAgIAorICAgICAgICBkZWYgZXhwZWN0ZWQgPSBbdG9kYXksIHRvZGF5ICsgMSwgdG9kYXkgKyAyLCB0b2RheSArIDNdCisgICAgICAgIAorICAgICAgICBkZWYgbGlzdCA9IFtdCisgICAgICAgIGZvciAoZCBpbiB0b2RheS4ubGF0ZXIpIHsKKyAgICAgICAgICAgIGxpc3QgPDwgZAorICAgICAgICB9CisgICAgICAgIGFzc2VydCBsaXN0ID09IGV4cGVjdGVkCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9EZWZhdWx0UGFyYW1DbG9zdXJlVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0RlZmF1bHRQYXJhbUNsb3N1cmVUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDExMTVmCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9EZWZhdWx0UGFyYW1DbG9zdXJlVGVzdC5ncm9vdnkKQEAgLTAsMCArMSw0NCBAQAorcGFja2FnZSBncm9vdnkKKworY2xhc3MgRGVmYXVsdFBhcmFtQ2xvc3VyZVRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICB2b2lkIHRlc3REZWZhdWx0UGFyYW1ldGVycygpIHsKKyAgICAgICAgLy8gRGVmYXVsdCBwYXJhbWV0ZXJzIHdvcmtpbmcgZm9yIGNsb3N1cmVzIAorCWRlZiBkb1NvbWV0aGluZyA9IHsgYSwgYiA9ICdkZWZCJywgYyA9ICdkZWZDJyAtPgorCQkJcHJpbnRsbiAiQ2FsbGVkIHdpdGggYTogJHthfSwgYiAke2J9LCBjICR7Y30iCisJCQlyZXR1cm4gYSArICItIiArIGIgKyAiLSIgKyBjCisJCX0KKworICAgIAlkZWYgdmFsdWUgPSBkb1NvbWV0aGluZygiWCIsICJZIiwgIloiKQorICAgIAlhc3NlcnQgdmFsdWUgPT0gIlgtWS1aIgorCisgICAgCXZhbHVlID0gZG9Tb21ldGhpbmcoIlgiLCAiWSIpCisgICAgCWFzc2VydCB2YWx1ZSA9PSAiWC1ZLWRlZkMiCisKKyAgICAJdmFsdWUgPSBkb1NvbWV0aGluZygiWCIpCisgICAgCWFzc2VydCB2YWx1ZSA9PSAiWC1kZWZCLWRlZkMiCisKKyAgICAJc2hvdWxkRmFpbCB7IGRvU29tZXRoaW5nKCkgfQorICAgIH0KKworICAgIHZvaWQgdGVzdERlZmF1bHRUeXBlZFBhcmFtZXRlcnMoKSB7CisJLy8gSGFuZGxlIHR5cGVkIHBhcmFtZXRlcnMKKwlkZWYgZG9UeXBlZFNvbWV0aGluZyA9IHsgU3RyaW5nIGEgPSAnZGVmQScsIFN0cmluZyBiID0gJ2RlZkInLCBTdHJpbmcgYyA9ICdkZWZDJyAtPgorCQkJcHJpbnRsbiAiQ2FsbGVkIHR5cGVkIG1ldGhvZCB3aXRoIGE6ICR7YX0sIGIgJHtifSwgYyAke2N9IgorCQkJcmV0dXJuIGEgKyAiLSIgKyBiICsgIi0iICsgYworCQl9CisJCisgICAgCWRlZiB2YWx1ZSA9IGRvVHlwZWRTb21ldGhpbmcoIlgiLCAiWSIsICJaIikKKyAgICAJYXNzZXJ0IHZhbHVlID09ICJYLVktWiIKKyAgICAJCisgICAgCXZhbHVlID0gZG9UeXBlZFNvbWV0aGluZygiWCIsICJZIikKKyAgICAJYXNzZXJ0IHZhbHVlID09ICJYLVktZGVmQyIKKyAgICAJCisgICAgCXZhbHVlID0gZG9UeXBlZFNvbWV0aGluZygiWCIpCisgICAgCWFzc2VydCB2YWx1ZSA9PSAiWC1kZWZCLWRlZkMiCisgICAgCQorICAgIAl2YWx1ZSA9IGRvVHlwZWRTb21ldGhpbmcoKQorICAgIAlhc3NlcnQgdmFsdWUgPT0gImRlZkEtZGVmQi1kZWZDIgorICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvRGVmYXVsdFBhcmFtVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0RlZmF1bHRQYXJhbVRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1Y2NjYjIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0RlZmF1bHRQYXJhbVRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsOTAgQEAKK3BhY2thZ2UgZ3Jvb3Z5CisKK2NsYXNzIERlZmF1bHRQYXJhbVRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICAvL0dST09WWS0yMTkxCisKKyAgICBkZWYgbTIxOTFhKFN0cmluZyBvbmUsIFN0cmluZyB0d28gPSAidHdvIikgeyIkb25lICR0d28ifQorICAgIGRlZiBtMjE5MWEoU3RyaW5nIG9uZSwgU3RyaW5nIHR3byA9ICJ0d28iLCBTdHJpbmcgdGhyZWUgPSAidGhyZWUiKSB7IiRvbmUgJHR3byAkdGhyZWUifQorICAgIAorICAgIGRlZiBtMjE5MWIoU3RyaW5nIG9uZSwgU3RyaW5nIHR3byA9ICJ0d28iLCBTdHJpbmcgdGhyZWUgPSAidGhyZWUiKSB7IiRvbmUgJHR3byAkdGhyZWUifQorICAgIGRlZiBtMjE5MWIoU3RyaW5nIG9uZSwgU3RyaW5nIHR3byA9ICJ0d28iKSB7IiRvbmUgJHR3byJ9CisgICAgCisgICAgdm9pZCB0ZXN0MjE5MSgpIHsKKyAgICAgIGFzc2VydCBtMjE5MWEoImJhciIpID09ICJiYXIgdHdvIgorICAgICAgYXNzZXJ0IG0yMTkxYigiYmFyIikgPT0gImJhciB0d28gdGhyZWUiCisgICAgfSAKKworICAgIHZvaWQgdGVzdERlZmF1bHRQYXJhbWV0ZXJzKCkgeworICAgIAorICAgIAlkZWYgdmFsdWUgPSBkb1NvbWV0aGluZygiWCIsICJZIiwgIloiKQorICAgIAlhc3NlcnQgdmFsdWUgPT0gIlgtWS1aIgorICAgIAkKKyAgICAJdmFsdWUgPSBkb1NvbWV0aGluZygiWCIsICJZIikKKyAgICAJYXNzZXJ0IHZhbHVlID09ICJYLVktZGVmQyIKKyAgICAJCisgICAgCXZhbHVlID0gZG9Tb21ldGhpbmcoIlgiKQorICAgIAlhc3NlcnQgdmFsdWUgPT0gIlgtZGVmQi1kZWZDIgorICAgIAkKKyAgICAJc2hvdWxkRmFpbCB7IGRvU29tZXRoaW5nKCkgfQorICAgIH0KKworICAgIHZvaWQgdGVzdERlZmF1bHRUeXBlZFBhcmFtZXRlcnMoKSB7CisgICAgCWRlZiB2YWx1ZSA9IGRvVHlwZWRTb21ldGhpbmcoIlgiLCAiWSIsICJaIikKKyAgICAJYXNzZXJ0IHZhbHVlID09ICJYLVktWiIKKyAgICAJCisgICAgCXZhbHVlID0gZG9UeXBlZFNvbWV0aGluZygiWCIsICJZIikKKyAgICAJYXNzZXJ0IHZhbHVlID09ICJYLVktZGVmQyIKKyAgICAJCisgICAgCXZhbHVlID0gZG9UeXBlZFNvbWV0aGluZygiWCIpCisgICAgCWFzc2VydCB2YWx1ZSA9PSAiWC1kZWZCLWRlZkMiCisgICAgCQorICAgIAl2YWx1ZSA9IGRvVHlwZWRTb21ldGhpbmcoKQorICAgIAlhc3NlcnQgdmFsdWUgPT0gImRlZkEtZGVmQi1kZWZDIgorICAgIH0KKworICAgIHZvaWQgdGVzdERlZmF1bHRUeXBlZFBhcmFtZXRlcnNBbm90aGVyKCkgeworICAgIAlkZWYgdmFsdWUgPSBkb1R5cGVkU29tZXRoaW5nQW5vdGhlcigiWCIsICJZIiwgIloiKQorICAgIAlhc3NlcnQgdmFsdWUgPT0gIlgtWS1aIgorICAgIAkKKyAgICAJdmFsdWUgPSBkb1R5cGVkU29tZXRoaW5nQW5vdGhlcigiWCIsICJaIikKKyAgICAJYXNzZXJ0IHZhbHVlID09ICJYLWRlZkItWiIKKyAgICAJCisgICAgCXZhbHVlID0gZG9UeXBlZFNvbWV0aGluZ0Fub3RoZXIoIloiKQorICAgIAlhc3NlcnQgdmFsdWUgPT0gImRlZkEtZGVmQi1aIgorICAgIAkKKyAgICAJc2hvdWxkRmFpbHsgdmFsdWUgPSBkb1R5cGVkU29tZXRoaW5nQW5vdGhlcigpIH0KKyAgICB9CisKKworICAgIGRlZiBkb1NvbWV0aGluZyhhLCBiID0gJ2RlZkInLCBjID0gJ2RlZkMnKSB7CisgICAgICAgIHByaW50bG4gIkNhbGxlZCB3aXRoIGE6ICR7YX0sIGIgJHtifSwgYyAke2N9IgorCisgICAgICAgIHJldHVybiBhICsgIi0iICsgYiArICItIiArIGMKKyAgICB9CisKKyAgICBTdHJpbmcgZG9UeXBlZFNvbWV0aGluZyhTdHJpbmcgYSA9ICdkZWZBJywgU3RyaW5nIGIgPSAnZGVmQicsIFN0cmluZyBjID0gJ2RlZkMnKSB7CisgICAgICAgIHByaW50bG4gIkNhbGxlZCB0eXBlZCBtZXRob2Qgd2l0aCBhOiAke2F9LCBiICR7Yn0sIGMgJHtjfSIKKworICAgICAgICByZXR1cm4gYSArICItIiArIGIgKyAiLSIgKyBjCisgICAgfQorCisgICAgU3RyaW5nIGRvVHlwZWRTb21ldGhpbmdBbm90aGVyKFN0cmluZyBhID0gJ2RlZkEnLCBTdHJpbmcgYiA9ICdkZWZCJywgU3RyaW5nIGMpIHsKKyAgICAgICAgcHJpbnRsbiAiQ2FsbGVkIHR5cGVkIG1ldGhvZCB3aXRoIGE6ICR7YX0sIGIgJHtifSwgYyAke2N9IgorCisgICAgICAgIHJldHVybiBhICsgIi0iICsgYiArICItIiArIGMKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0Q29uc3RydWN0b3IoKSB7CisgICAgICAgIGFzc2VydCBEZWZhdWx0UGFyYW1UZXN0VGVzdENsYXNzLmRlY2xhcmVkQ29uc3RydWN0b3JzLnNpemUoKSA9PSAyCisgICAgICAgIGRlZiBmb28gPSBuZXcgRGVmYXVsdFBhcmFtVGVzdFRlc3RDbGFzcygpCisgICAgICAgIGFzc2VydCBmb28uaiA9PSAxCisgICAgICAgIGZvbyA9IG5ldyBEZWZhdWx0UGFyYW1UZXN0VGVzdENsYXNzKDIpCisgICAgICAgIGFzc2VydCBmb28uaiA9PSAyCisgICAgfQorfQorCitjbGFzcyBEZWZhdWx0UGFyYW1UZXN0VGVzdENsYXNzIHsKKyAgZGVmIGoKKyAgRGVmYXVsdFBhcmFtVGVzdFRlc3RDbGFzcyhpbnQgaSA9IDEpe2o9aX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0RvV2hpbGVMb29wVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0RvV2hpbGVMb29wVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkxM2JmZAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvRG9XaGlsZUxvb3BUZXN0Lmdyb292eQpAQCAtMCwwICsxLDI0IEBACitwYWNrYWdlIGdyb292eQorCitjbGFzcyBEb1doaWxlTG9vcFRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICB2b2lkIHRlc3REb1doaWxlV2hpbGUoKSB7CisKKyAgICAvKioKKworICAgICAgV2UgY3VycmVudGx5IGRvIG5vdCBzdXBwb3J0IGRvIC4uLiB3aGlsZSBpbiB0aGUgSlNSIHN5bnRheAorCisgICAgICAgIGRlZiB4ID0gMAorICAgICAgICBkZWYgeSA9IDUKKworICAgICAgICBkbyB7CisgICAgICAgICAgICB4ID0geCArIDEKKyAgICAgICAgICAgIHkgPSB5IC0gMQorICAgICAgICB9CisgICAgICAgIHdoaWxlICggeSA+IDAgKQorCisgICAgICAgIGFzc2VydCB4ID09IDUKKyAgICAqLworICAgICAgICAgICAgCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9Eb2xsYXJFc2NhcGluZ1Rlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9Eb2xsYXJFc2NhcGluZ1Rlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMTFjZDYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0RvbGxhckVzY2FwaW5nVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwxNCBAQAorcGFja2FnZSBncm9vdnkKKworY2xhc3MgRG9sbGFyRXNjYXBpbmdUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCB0ZXN0RXNjYXBpbmcoKSB7CisgICAgICAgIGRlZiBmb28gPSAiaGVsbG8gXCR7Zm9vfSIKKyAgICAgICAgCisgICAgICAgIGFzc2VydCBmb28gaW5zdGFuY2VvZiBTdHJpbmcKKyAgICAgICAgCisgICAgICAgIGRlZiBjID0gZm9vLmNvdW50KCckJykKKyAgICAgICAgCisgICAgICAgIGFzc2VydCBjID09IDEgLCBmb28KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0Rvd25VcFN0ZXBUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvRG93blVwU3RlcFRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkOTk3ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0Rvd25VcFN0ZXBUZXN0Lmdyb292eQpAQCAtMCwwICsxLDM1IEBACitwYWNrYWdlIGdyb292eQorCitwdWJsaWMgY2xhc3MgRG93blVwU3RlcFRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICB2b2lkIHRlc3REb3dudG8oKSB7CisgICAgICAgIGRlZiB6ID0gW10KKyAgICAgICAgKDEwLjUpLmRvd250byg1LjkpIHsgeiA8PCBpdCB9CisgICAgICAgIGFzc2VydEVxdWFscyggWzEwLjUsIDkuNSwgOC41LCA3LjUsIDYuNV0sIHopCisgICAgfQorCisgICAgdm9pZCB0ZXN0QmlnSW50ZWdlckRvd250b0JpZ0RlY2ltYWwoKSB7CisgICAgICAgIGRlZiB6ID0gW10KKyAgICAgICAgMTBHLmRvd250byg1LjlHKSB7IHogPDwgaXQgfQorICAgICAgICBhc3NlcnRFcXVhbHMoIFsxMEcsIDlHLCA4RywgN0csIDZHXSwgeikKKyAgICB9CisKKyAgICB2b2lkIHRlc3RVcHRvKCkgeworICAgICAgICBkZWYgeiA9IDAuMAorICAgICAgICAoMy4xKS51cHRvKDcuMikgeyB6ICs9IGl0IH0KKyAgICAgICAgYXNzZXJ0IHogPT0gMy4xICsgNC4xICsgNS4xICsgNi4xICsgNy4xCisgICAgICAgIGFzc2VydCB6ID09IDI1LjUKKyAgICB9CisKKyAgICB2b2lkIHRlc3RTdGVwKCkgeworICAgICAgICBkZWYgeiA9IDAuMAorICAgICAgICAoMS4yKS5zdGVwKDMuOSwgMC4xKSB7IHogKz0gaXQgfQorICAgICAgICBhc3NlcnQgeiA9PSA2Ny41CisgICAgfQorCisgICAgdm9pZCB0ZXN0RG93blN0ZXAoKSB7CisgICAgICAgIGRlZiB6ID0gMC4wCisgICAgICAgICgzLjgpLnN0ZXAoMS4xLCAtMC4xKSB7IHogKz0gaXQgfQorICAgICAgICBhc3NlcnQgeiA9PSA2Ny41CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9EdW1teUludGVyZmFjZS5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9EdW1teUludGVyZmFjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZjliM2UKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0R1bW15SW50ZXJmYWNlLmphdmEKQEAgLTAsMCArMSw2IEBACitwYWNrYWdlIGdyb292eTsKKworcHVibGljIGludGVyZmFjZSBEdW1teUludGVyZmFjZSB7CisKKyAgICB2b2lkIG1ldGhvZFdpdGhBcnJheVBhcmFtKFN0cmluZ1tdIGFyZ3MpOworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9EdW1teU1ldGhvZHNHcm9vdnkuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9EdW1teU1ldGhvZHNHcm9vdnkuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhYmYxNGMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0R1bW15TWV0aG9kc0dyb292eS5ncm9vdnkKQEAgLTAsMCArMSwyNSBAQAorLyoqCisgKiBtZXRob2RzIHdpdGggc3BlY2lmaWMgcGFyYW1ldGVycyAoZS5nLiBwcmltaXRpdmVzKQorICogZm9yIHVzZSB3aXRoIGdyb292eSB0ZXN0cworICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmplcmVteS5yYXluZXJAYmlnZm9vdC5jb20iPkplcmVteSBSYXluZXI8L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KKyAKK3BhY2thZ2UgZ3Jvb3Z5OworCitwdWJsaWMgY2xhc3MgRHVtbXlNZXRob2RzR3Jvb3Z5IHsKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIER1bW15TWV0aG9kc0dyb292eSB0bXAgPSBuZXcgRHVtbXlNZXRob2RzR3Jvb3Z5KCk7CisgICAgICAgIFN0cmluZyBhbnN3ZXIgPSB0bXAuZm9vKCJIZXkiLCAxLCAyKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBbnN3ZXI6ICIgKyBhbnN3ZXIpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZm9vKFN0cmluZyBhLCBmbG9hdCBiLCBmbG9hdCBjKSB7CisgICAgCXJldHVybiAiZmxvYXQgYXJncyI7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBmb28oU3RyaW5nIGEsIGludCBiLCBpbnQgYykgeworICAgIAlyZXR1cm4gImludCBhcmdzIjsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9EdW1teU1ldGhvZHNKYXZhLmphdmEgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0R1bW15TWV0aG9kc0phdmEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjVmOTEzCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9EdW1teU1ldGhvZHNKYXZhLmphdmEKQEAgLTAsMCArMSwxOCBAQAorLyoqCisgKiBtZXRob2RzIHdpdGggc3BlY2lmaWMgcGFyYW1ldGVycyAoZS5nLiBwcmltaXRpdmVzKQorICogZm9yIHVzZSB3aXRoIGdyb292eSB0ZXN0cworICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmplcmVteS5yYXluZXJAYmlnZm9vdC5jb20iPkplcmVteSBSYXluZXI8L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3BhY2thZ2UgZ3Jvb3Z5OworCitwdWJsaWMgY2xhc3MgRHVtbXlNZXRob2RzSmF2YSB7CisgICAgcHVibGljIFN0cmluZyBmb28oU3RyaW5nIGEsIGZsb2F0IGIsIGZsb2F0IGMpIHsKKyAgICAgICAgcmV0dXJuICJmbG9hdCBhcmdzIjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGZvbyhTdHJpbmcgYSwgaW50IGIsIGludCBjKSB7CisgICAgICAgIHJldHVybiAiaW50IGFyZ3MiOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0R5bmFtaWNNZW1iZXJUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvRHluYW1pY01lbWJlclRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNmUzYjgKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0R5bmFtaWNNZW1iZXJUZXN0Lmdyb292eQpAQCAtMCwwICsxLDQ5IEBACitwYWNrYWdlIGdyb292eQorCitjbGFzcyBEeW5hbWljTWVtYmVyVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKyAgZGVmIGFUZXN0TWV0aG9kKG8pe299CisgIGRlZiBhUHJvcGVydHkKKyAgCisgIHB1YmxpYyB2b2lkIHRlc3RHU3RyaW5nTWV0aG9kQ2FsbCgpeworICAgIGRlZiBuYW1lID0gImFUZXN0TWV0aG9kIgorICAgIGFzc2VydCB0aGlzLiIkbmFtZSIoMSkgPT0gMQorICAgIGFzc2VydCB0aGlzLiIke25hbWV9IigyKSA9PSAyCisgICAgYXNzZXJ0ICIkbmFtZSIoMykgPT0gMworICAgIGFzc2VydCAiJHtuYW1lfSIoNCkgPT0gNAorICAgIG5hbWUgPSAiVGVzdE1ldGhvZCIKKyAgICBhc3NlcnQgdGhpcy4oImEiKyJUZXN0TWV0aG9kIikoNSkgPT0gNQorICAgIGFzc2VydCB0aGlzLigiYSIrbmFtZSkoNikgPT0gNgorICB9CisgIAorICBwdWJsaWMgdm9pZCB0ZXN0R1N0cmluZ1Byb3BlcnR5QWNjZXNzKCl7CisgICAgZGVmIG5hbWUgPSAiYVByb3BlcnR5IgorICAgIHRoaXMuYVByb3BlcnR5ID0gImZvbyIKKyAgICBhc3NlcnQgdGhpcy4iJG5hbWUiID09ICJmb28iCisgICAgYXNzZXJ0IHRoaXMuIiR7bmFtZX0iID09ICJmb28iCisgICAgYXNzZXJ0ICIkbmFtZSIgPT0gImFQcm9wZXJ0eSIKKyAgICBhc3NlcnQgIiR7bmFtZX0iID09ICJhUHJvcGVydHkiCisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdNZXRob2RDYWxsQW5kQXR0cmlidXRlQWNjZXNzKCkgeworICAgIHRoaXMuYVByb3BlcnR5ID0gIlN0cmluZyIKKyAgICBhc3NlcnQgdGhpcy4iYVByb3BlcnR5IiA9PSAiU3RyaW5nIgorICAgIGFzc2VydCB0aGlzLiJhVGVzdE1ldGhvZCIoIlN0cmluZyIpID09ICJTdHJpbmciCisgICAgYXNzZXJ0ICJhVGVzdE1ldGhvZCIoIlN0cmluZyIpID09ICJTdHJpbmciCisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIHRlc3REeW5hbWljQXR0cmlidXRlQWNjZXNzKCkgeworICAgIHRoaXMuYVByb3BlcnR5ID0gInRhZGEiCisgICAgZGVmIG5hbWUgPSAiYVByb3BlcnR5IgorICAgIGFzc2VydCB0aGlzLkAiJG5hbWUiID09ICJ0YWRhIgorICAgIGFzc2VydCB0aGlzLkAiJHtuYW1lfSIgPT0gInRhZGEiCisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIHRlc3REeW5hbWljTWV0aG9kQ2xvc3VyZSgpIHsKKyAgICBkZWYgY2wgPSB0aGlzLiYiYVRlc3RNZXRob2QiCisgICAgYXNzZXJ0IGNsKCJTdHJpbmciKSA9PSAiU3RyaW5nIgorICAgIGRlZiBuYW1lID0iYVRlc3RNZXRob2QiCisgICAgY2wgPSB0aGlzLiYiJG5hbWUiCisgICAgYXNzZXJ0IGNsKCJTdHJpbmciKSA9PSAiU3RyaW5nIgorICB9CisgIAorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvRXNjYXBlZFVuaWNvZGVUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvRXNjYXBlZFVuaWNvZGVUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjBjOGE0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9Fc2NhcGVkVW5pY29kZVRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMjYgQEAKK1x1MDA2M1x1MDA2Y1x1MDA2MVx1MDA3M1x1MDA3M1x1MDAyMFx1MDA0NVx1MDA3M1x1MDA2M1x1MDA2MVx1MDA3MFx1MDA2NVx1MDA2NFx1MDA1NVx1MDA2ZVx1MDA2OVx1MDA2M1x1MDA2Zlx1MDA2NFx1MDA2NVx1MDA1NFx1MDA2NVx1MDA3M1x1MDA3NFx1MDAyMFx1MDA2NVx1MDA3OFx1MDA3NFx1MDA2NVx1MDA2ZVx1MDA2NFx1MDA3M1x1MDAyMFx1MDA0N1x1MDA3Mlx1MDA2Zlx1MDA2Zlx1MDA3Nlx1MDA3OVx1MDA1NFx1MDA2NVx1MDA3M1x1MDA3NFx1MDA0M1x1MDA2MVx1MDA3M1x1MDA2NVx1MDAyMFx1MDA3YgorCitcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwNzZcdTAwNmZcdTAwNjlcdTAwNjRcdTAwMjBcdTAwNzRcdTAwNjVcdTAwNzNcdTAwNzRcdTAwNDFcdTAwNzNcdTAwNzNcdTAwNjVcdTAwNzJcdTAwNzRcdTAwMjhcdTAwMjlcdTAwMjBcdTAwN2IKK1x1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDA2NFx1MDA2NVx1MDA2Nlx1MDAyMFx1MDA3OFx1MDAyMFx1MDAzZFx1MDAyMFx1MDAyMlx1MDA2MVx1MDA2Mlx1MDA2M1x1MDAyMgorCitcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwNjFcdTAwNzNcdTAwNzNcdTAwNjVcdTAwNzJcdTAwNzRcdTAwMjBcdTAwNzhcdTAwMjBcdTAwMjFcdTAwM2RcdTAwMjBcdTAwMjJcdTAwNjZcdTAwNmZcdTAwNmZcdTAwMjIKK1x1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDA2MVx1MDA3M1x1MDA3M1x1MDA2NVx1MDA3Mlx1MDA3NFx1MDAyMFx1MDA3OFx1MDAyMFx1MDAyMVx1MDAzZFx1MDAyMFx1MDAyMFx1MDA2ZVx1MDA3NVx1MDA2Y1x1MDA2YworXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDYxXHUwMDczXHUwMDczXHUwMDY1XHUwMDcyXHUwMDc0XHUwMDIwXHUwMDc4XHUwMDIwXHUwMDIxXHUwMDNkXHUwMDIwXHUwMDIyXHUwMDY0XHUwMDY1XHUwMDY2XHUwMDIyCitcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwNjFcdTAwNzNcdTAwNzNcdTAwNjVcdTAwNzJcdTAwNzRcdTAwMjBcdTAwNzhcdTAwMjBcdTAwM2RcdTAwM2RcdTAwMjBcdTAwMjJcdTAwNjFcdTAwNjJcdTAwNjNcdTAwMjIKK1x1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMAorXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDYxXHUwMDczXHUwMDczXHUwMDY1XHUwMDcyXHUwMDc0XHUwMDIwXHUwMDc4XHUwMDJlXHUwMDY1XHUwMDcxXHUwMDc1XHUwMDYxXHUwMDZjXHUwMDczXHUwMDI4XHUwMDIyXHUwMDYxXHUwMDYyXHUwMDYzXHUwMDIyXHUwMDI5CitcdTAwMDlcdTAwN2QKK1x1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMAorXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDc2XHUwMDZmXHUwMDY5XHUwMDY0XHUwMDIwXHUwMDc0XHUwMDY1XHUwMDczXHUwMDc0XHUwMDU1XHUwMDZlXHUwMDZiXHUwMDZlXHUwMDZmXHUwMDc3XHUwMDZlXHUwMDU2XHUwMDYxXHUwMDcyXHUwMDY5XHUwMDYxXHUwMDYyXHUwMDZjXHUwMDY1XHUwMDI4XHUwMDI5XHUwMDIwXHUwMDdiCitcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwNzRcdTAwNzJcdTAwNzlcdTAwMjBcdTAwN2IKK1x1MDAwOVx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDA2NFx1MDA2NVx1MDA2Nlx1MDAyMFx1MDA3OVx1MDAyMFx1MDAzZFx1MDAyMFx1MDA3NFx1MDA2OFx1MDA2OVx1MDA3M1x1MDAyZVx1MDA3OAorXHUwMDA5XHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDY2XHUwMDYxXHUwMDY5XHUwMDZjXHUwMDI4XHUwMDIyXHUwMDc4XHUwMDIwXHUwMDY5XHUwMDczXHUwMDIwXHUwMDc1XHUwMDZlXHUwMDY0XHUwMDY1XHUwMDY2XHUwMDY5XHUwMDZlXHUwMDY1XHUwMDY0XHUwMDJjXHUwMDIwXHUwMDczXHUwMDY4XHUwMDZmXHUwMDc1XHUwMDZjXHUwMDY0XHUwMDIwXHUwMDc0XHUwMDY4XHUwMDcyXHUwMDZmXHUwMDc3XHUwMDIwXHUwMDYxXHUwMDZlXHUwMDIwXHUwMDY1XHUwMDc4XHUwMDYzXHUwMDY1XHUwMDcwXHUwMDc0XHUwMDY5XHUwMDZmXHUwMDZlXHUwMDIyXHUwMDI5CitcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwN2QKK1x1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDA2M1x1MDA2MVx1MDA3NFx1MDA2M1x1MDA2OFx1MDAyMFx1MDAyOFx1MDA0ZFx1MDA2OVx1MDA3M1x1MDA3M1x1MDA2OVx1MDA2ZVx1MDA2N1x1MDA1MFx1MDA3Mlx1MDA2Zlx1MDA3MFx1MDA2NVx1MDA3Mlx1MDA3NFx1MDA3OVx1MDA0NVx1MDA3OFx1MDA2M1x1MDA2NVx1MDA3MFx1MDA3NFx1MDA2OVx1MDA2Zlx1MDA2ZVx1MDAyMFx1MDA2NVx1MDAyOVx1MDAyMFx1MDA3YgorXHUwMDA5XHUwMDA5XHUwMDA5XHUwMDYxXHUwMDczXHUwMDczXHUwMDY1XHUwMDcyXHUwMDc0XHUwMDIwXHUwMDY1XHUwMDJlXHUwMDY3XHUwMDY1XHUwMDc0XHUwMDUwXHUwMDcyXHUwMDZmXHUwMDcwXHUwMDY1XHUwMDcyXHUwMDc0XHUwMDc5XHUwMDI4XHUwMDI5XHUwMDIwXHUwMDNkXHUwMDNkXHUwMDIwXHUwMDIyXHUwMDc4XHUwMDIyXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwCitcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwNjRcdTAwNjVcdTAwNjZcdTAwMjBcdTAwNzRcdTAwNjVcdTAwNzhcdTAwNzRcdTAwMjBcdTAwM2RcdTAwMjBcdTAwNjVcdTAwMmVcdTAwNmRcdTAwNjVcdTAwNzNcdTAwNzNcdTAwNjFcdTAwNjdcdTAwNjUKK1x1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMFx1MDA2MVx1MDA3M1x1MDA3M1x1MDA2NVx1MDA3Mlx1MDA3NFx1MDAyMFx1MDA3NFx1MDA2NVx1MDA3OFx1MDA3NFx1MDAyMFx1MDAzZFx1MDAzZFx1MDAyMFx1MDAyMlx1MDA0ZVx1MDA2Zlx1MDAyMFx1MDA3M1x1MDA3NVx1MDA2M1x1MDA2OFx1MDAyMFx1MDA3MFx1MDA3Mlx1MDA2Zlx1MDA3MFx1MDA2NVx1MDA3Mlx1MDA3NFx1MDA3OVx1MDAzYVx1MDAyMFx1MDA3OFx1MDAyMFx1MDA2Nlx1MDA2Zlx1MDA3Mlx1MDAyMFx1MDA2M1x1MDA2Y1x1MDA2MVx1MDA3M1x1MDA3M1x1MDAzYVx1MDAyMFx1MDA0NVx1MDA3M1x1MDA2M1x1MDA2MVx1MDA3MFx1MDA2NVx1MDA2NFx1MDA1NVx1MDA2ZVx1MDA2OVx1MDA2M1x1MDA2Zlx1MDA2NFx1MDA2NVx1MDA1NFx1MDA2NVx1MDA3M1x1MDA3NFx1MDAyMgorXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDIwXHUwMDdkCitcdTAwMjBcdTAwMjBcdTAwMjBcdTAwMjBcdTAwN2QKK1x1MDAwOVx1MDAyMFx1MDAyMFx1MDAyMFx1MDAyMAorXHUwMDdkCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0V4Y2VwdGlvbkluQ2xvc3VyZVRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9FeGNlcHRpb25JbkNsb3N1cmVUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzY1NDY5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9FeGNlcHRpb25JbkNsb3N1cmVUZXN0Lmdyb292eQpAQCAtMCwwICsxLDI2IEBACitwYWNrYWdlIGdyb292eQorCisvKiogCisgKiBUZXN0cyBleGNlcHRpb24gaGFuZGxpbmcgaW5zaWRlIG9mIGEgY2xvc3VyZQorICogCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitjbGFzcyBFeGNlcHRpb25JbkNsb3N1cmVUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCB0ZXN0Q2FsbGluZ09mRmFpbGVkQ2xvc3VyZSgpIHsKKyAgICAgICAgZGVmIGNsb3N1cmUgPSB7IGl0IC0+IGl0LmZvbygpIH0KKyAgICAgICAgCisgICAgICAgIHRyeSB7CisJICAgICAgICBjbG9zdXJlLmNhbGwoImNoZWVzZSIpCisJICAgICAgICAKKwkgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24gYnkgbm93IikKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoTWlzc2luZ01ldGhvZEV4Y2VwdGlvbiBlKSB7CisgICAJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNhdWdodDogIiArIGUpICAgIAorICAgCQkJCisgICAJCQlhc3NlcnQgZS5tZXRob2QgPT0gImZvbyIKKwkJCWFzc2VydCBlLnR5cGUgPT0gU3RyaW5nICAgCQkJCisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0V4cGFuZG9Qcm9wZXJ0eVRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9FeHBhbmRvUHJvcGVydHlUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWMxYTc0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9FeHBhbmRvUHJvcGVydHlUZXN0Lmdyb292eQpAQCAtMCwwICsxLDEwMCBAQAorcGFja2FnZSBncm9vdnkKKworY2xhc3MgRXhwYW5kb1Byb3BlcnR5VGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIHZvaWQgdGVzdEV4cGFuZG9Qcm9wZXJ0eSgpIHsKKyAgICAgICAgZGVmIGZvbyA9IG5ldyBFeHBhbmRvKCkKKyAgICAgICAgCisgICAgICAgIGZvby5jaGVlc2UgPSAiQ2hlZGRhciIKKyAgICAgICAgZm9vLm5hbWUgPSAiR3JvbWl0IgorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IGZvby5jaGVlc2UgPT0gIkNoZWRkYXIiCisgICAgICAgIGFzc2VydCBmb28ubmFtZSA9PSAiR3JvbWl0IgorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IGZvby5wcm9wZXJ0aWVzLnNpemUoKSA9PSAyCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdEV4cGFuZG9NZXRob2RzKCkgeworICAgICAgICBkZWYgZm9vID0gbmV3IEV4cGFuZG8oKQorCisgICAgICAgIGZvby5jaGVlc2UgPSAiQ2hlZGRhciIKKyAgICAgICAgZm9vLmZ1bGxOYW1lID0gIkdyb21pdCIKKyAgICAgICAgZm9vLm5hbWVMZW5ndGggPSB7IHJldHVybiBmdWxsTmFtZS5sZW5ndGgoKSB9CisgICAgICAgIGZvby5tdWx0aVBhcmFtID0geyBhLCBiLCBjIC0+IHByaW50bG4oIkNhbGxlZCB3aXRoICR7YX0sICR7Yn0sICR7Y30iKTsgcmV0dXJuIGEgKyBiICsgYyB9CisKKyAgICAgICAgYXNzZXJ0IGZvby5jaGVlc2UgPT0gIkNoZWRkYXIiCisgICAgICAgIGFzc2VydCBmb28uZnVsbE5hbWUgPT0gIkdyb21pdCIKKyAgICAgICAgYXNzZXJ0IGZvby5uYW1lTGVuZ3RoKCkgPT0gNiAsIGZvby5uYW1lTGVuZ3RoKCkKKyAgICAgICAgYXNzZXJ0IGZvby5tdWx0aVBhcmFtKDEsIDIsIDMpID09IDYKKyAgICAgICAgCisgICAgICAgIC8vIGxldHMgdGVzdCB1c2luZyB3cm9uZyBudW1iZXIgb2YgcGFyYW1ldGVycworICAgICAgICBzaG91bGRGYWlsIHsgZm9vLm11bHRpUGFyYW0oMSkgfQorICAgICAgICBzaG91bGRGYWlsIHsgZm9vLm5hbWVMZW5ndGgoMSwgMikgfQorICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RFeHBhbmRvQ29uc3RydWN0b3JBbmRUb1N0cmluZygpIHsKKyAgICAgICAgZGVmIGZvbyA9IG5ldyBFeHBhbmRvKHR5cGU6InNvbWV0eXBlIiwgdmFsdWU6NDIpCisgICAgICAgIHByaW50bG4gZm9vCisgICAgICAgIGFzc2VydCBmb28udG9TdHJpbmcoKSA9PSAie3R5cGU9c29tZXR5cGUsIHZhbHVlPTQyfSIKKyAgICAgICAgYXNzZXJ0ICIke2Zvb30iID09ICJ7dHlwZT1zb21ldHlwZSwgdmFsdWU9NDJ9IgorICAgIH0KKworICAgIHZvaWQgdGVzdEV4cGFuZG9NZXRob2RPdmVycmlkZXMoKSB7CisgICAgICAgIGRlZiBlcXVhbHMgPSB7IE9iamVjdCBvYmogLT4gcmV0dXJuIG9iai52YWx1ZSA9PSB2YWx1ZSB9CisgICAgICAgIGRlZiBmb28gPSBuZXcgRXhwYW5kbyh0eXBlOiJteWZvbyIsIHZhbHVlOjQyLCBlcXVhbHM6ZXF1YWxzKQorICAgICAgICBkZWYgYmFyID0gbmV3IEV4cGFuZG8odHlwZToibXliYXIiLCB2YWx1ZTo0MywgZXF1YWxzOmVxdWFscykKKyAgICAgICAgZGVmIHphcCA9IG5ldyBFeHBhbmRvKHR5cGU6Im15emFwIiwgdmFsdWU6NDIsIGVxdWFsczplcXVhbHMpCisgICAgICAgIHByaW50bG4oZm9vKQorCQorICAgICAgICBhc3NlcnQgZm9vLmVxdWFscyhiYXIpID09IGZhbHNlCisgICAgICAgIGFzc2VydCBmb28uZXF1YWxzKHphcCkgPT0gdHJ1ZQorCQorICAgICAgICBkZWYgbGlzdCA9IFtdCisgICAgICAgIGxpc3QgPDwgZm9vCisgICAgICAgIGxpc3QgPDwgYmFyCisgICAgICAgIHByaW50bG4gbGlzdAorCQorICAgICAgICBhc3NlcnQgbGlzdC5jb250YWlucyhmb28pID09IHRydWUKKyAgICAgICAgYXNzZXJ0IGxpc3QuY29udGFpbnMoYmFyKSA9PSB0cnVlCisgICAgICAgIGFzc2VydCBsaXN0LmNvbnRhaW5zKHphcCkgPT0gdHJ1ZQorICAgICAgICBhc3NlcnQgbGlzdC5pbmRleE9mKGJhcikgPT0gMQorICAgICAgICBhc3NlcnQgbGlzdC5pbmRleE9mKGZvbykgPT0gMAorCQorICAgICAgICBwcmludGxuICJoYXNoQ29kZTogIiArIGZvby5oYXNoQ29kZSgpCisJCisgICAgICAgIGZvby5oYXNoQ29kZSA9IHsgcmV0dXJuIHZhbHVlIH0KKyAgICAgICAgcHJpbnRsbigiaGFzaENvZGU6ICIgKyBmb28uaGFzaENvZGUoKSkKKwkKKyAgICAgICAgYXNzZXJ0IGZvby5oYXNoQ29kZSgpID09IGZvby52YWx1ZQorICAgICAgICBwcmludGxuKCJ0b1N0cmluZzogIiArIGZvby50b1N0cmluZygpKQorCQorICAgICAgICBmb28udG9TdHJpbmcgPSB7IHJldHVybiAiVHlwZTogJHt0eXBlfSwgVmFsdWU6ICR7dmFsdWV9IiB9CisgICAgICAgIHByaW50bG4oInRvU3RyaW5nOiAiICsgZm9vLnRvU3RyaW5nKCkpCisgICAgICAgIGFzc2VydCBmb28udG9TdHJpbmcoKSA9PSAiVHlwZTogbXlmb28sIFZhbHVlOiA0MiIKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0QXJyYXlBY2Nlc3NPblRoaXMoKSB7CisgICAgICAgIGRlZiBhID0gbmV3IEZhbmN5RXhwYW5kbyhbYToxLGI6Ml0pCisgICAgICAgIGEudXBkYXRlKFtiOjUsYToyXSkKKyAgICAgICAgCisgICAgICAgIGFzc2VydCBhLmEgPT0gMgorICAgICAgICBhc3NlcnQgYS5iID09IDUKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0RXhwYW5kb0NsYXNzUHJvcGVydHkoKSB7CisgICAgICAgIGRlZiBlID0gbmV3IEV4cGFuZG8oKQorICAgICAgICBlLmNsYXNzID0gImhlbGxvIHdvcmxkIgorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IGUuY2xhc3MgPT0gImhlbGxvIHdvcmxkIgorICAgIH0KK30KKworY2xhc3MgRmFuY3lFeHBhbmRvIGV4dGVuZHMgRXhwYW5kbyB7CisgRmFuY3lFeHBhbmRvKGFyZ3MpIHsgc3VwZXIoYXJncykgfQorIAorIGRlZiB1cGRhdGUoYXJncykgeworICAgZm9yIChlIGluIGFyZ3MpIHRoaXNbZS5rZXldID0gZS52YWx1ZSAvLyB1c2luZyAndGhpcycKKyB9CisgCisgU3RyaW5nIHRvU3RyaW5nKCkgeyBkdW1wKCkgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9GaWxlVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0ZpbGVUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjgzOTllCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9GaWxlVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwxMDMgQEAKK3BhY2thZ2UgZ3Jvb3Z5CisKKy8qKgorICogVW5pdCB0ZXN0IGZvciBGaWxlIEdESyBtZXRob2RzCisgKgorICogQGF1dGhvciBNYXJjIEd1aWxsZW1vdAorICogQHZlcnNpb24gJFJldmlzaW9uOiA0OTk2ICQKKyAqLworY2xhc3MgRmlsZVRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKwlkZWYgYmFzZURpciA9IG5ldyBGaWxlKCJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvZmlsZXRlc3QiKQorCisJdm9pZCBzZXRVcCgpCisJeworCQljcmVhdGVGb2xkZXIgImVtcHR5Rm9sZGVyIgorICAgIAljcmVhdGVGaWxlICJmb2xkZXIxL1JlYWRtZSIKKyAgICAJY3JlYXRlRmlsZSAiZm9sZGVyMS9idWlsZC54bWwiCisgICAgCWNyZWF0ZUZpbGUgImZvbGRlcjIvbXlEb2MuZG9jIgorICAgIAljcmVhdGVGaWxlICJmb2xkZXIyL215RG9jLm9kdCIKKyAgICAJY3JlYXRlRmlsZSAiZm9sZGVyMi9zdWJmb2xkZXIvZmlsZTEuZ3Jvb3Z5IgorICAgIAljcmVhdGVGaWxlICJmb2xkZXIyL3N1YmZvbGRlci9maWxlMi5ncm9vdnkiCisgICAgCWNyZWF0ZUZpbGUgImZvbGRlcjMvc3ViZm9sZGVyL2ZpbGUzLmdyb292eSIKKyAgICAJY3JlYXRlRmlsZSAiZm9vIgorICAgIAljcmVhdGVGaWxlICJmb28udHh0IgorCX0KKworCXZvaWQgdGVzdEVhY2hGaWxlKCkgeworCQlkZWYgY29sbGVjdGVkRmlsZXMgPSBbXQorCQliYXNlRGlyLmVhY2hGaWxlIHsgaXQgLT4gY29sbGVjdGVkRmlsZXMgPDwgaXQubmFtZSB9CisJCWNvbGxlY3RlZEZpbGVzLnNvcnQoKSAvLyBuZWVkcyB0byBzb3J0IGFzIHRoZXJlIGlzIG5vIGd1YXJhbnR5IG9uIHRoZSBvcmRlciB3aXRoaW4gYSBmb2xkZXIKKworICAgIAlkZWYgZXhwZWN0ZWQgPSBbImVtcHR5Rm9sZGVyIiwgImZvbGRlcjEiLCAiZm9sZGVyMiIsICJmb2xkZXIzIiwgImZvbyIsICJmb28udHh0Il0KKyAgICAJCisgICAgCWFzc2VydEVxdWFscyBleHBlY3RlZCwgY29sbGVjdGVkRmlsZXMKKyAgICB9CisKKwl2b2lkIHRlc3RFYWNoRGlyKCkgeworCQlkZWYgY29sbGVjdGVkRmlsZXMgPSBbXQorCQliYXNlRGlyLmVhY2hEaXIgeyBpdCAtPiBjb2xsZWN0ZWRGaWxlcyA8PCBpdC5uYW1lIH0KKwkJY29sbGVjdGVkRmlsZXMuc29ydCgpIC8vIG5lZWRzIHRvIHNvcnQgYXMgdGhlcmUgaXMgbm8gZ3VhcmFudHkgb24gdGhlIG9yZGVyIHdpdGhpbiBhIGZvbGRlcgorCisgICAgCWRlZiBleHBlY3RlZCA9IFsiZW1wdHlGb2xkZXIiLCAiZm9sZGVyMSIsICJmb2xkZXIyIiwgImZvbGRlcjMiXQorICAgIAkKKyAgICAJYXNzZXJ0RXF1YWxzIGV4cGVjdGVkLCBjb2xsZWN0ZWRGaWxlcworICAgIH0KKworCXZvaWQgdGVzdEVhY2hGaWxlTWF0Y2goKSB7CisJCWRlZiBjb2xsZWN0ZWRGaWxlcyA9IFtdCisJCWJhc2VEaXIuZWFjaEZpbGVNYXRjaCB+L2ZvLiovLCB7IGl0IC0+IGNvbGxlY3RlZEZpbGVzIDw8IGl0Lm5hbWUgfQorCQljb2xsZWN0ZWRGaWxlcy5zb3J0KCkgLy8gbmVlZHMgdG8gc29ydCBhcyB0aGVyZSBpcyBubyBndWFyYW50eSBvbiB0aGUgb3JkZXIgd2l0aGluIGEgZm9sZGVyCisKKyAgICAJZGVmIGV4cGVjdGVkID0gWyJmb2xkZXIxIiwgImZvbGRlcjIiLCAiZm9sZGVyMyIsICJmb28iLCAiZm9vLnR4dCJdCisgICAgCQorICAgIAlhc3NlcnRFcXVhbHMgZXhwZWN0ZWQsIGNvbGxlY3RlZEZpbGVzCisgICAgfQorCisJdm9pZCB0ZXN0RWFjaERpck1hdGNoKCkgeworCQlkZWYgY29sbGVjdGVkRmlsZXMgPSBbXQorCQliYXNlRGlyLmVhY2hEaXJNYXRjaCB+L2ZvLiovLCB7IGl0IC0+IGNvbGxlY3RlZEZpbGVzIDw8IGl0Lm5hbWUgfQorCQljb2xsZWN0ZWRGaWxlcy5zb3J0KCkgLy8gbmVlZHMgdG8gc29ydCBhcyB0aGVyZSBpcyBubyBndWFyYW50eSBvbiB0aGUgb3JkZXIgd2l0aGluIGEgZm9sZGVyCisKKyAgICAJZGVmIGV4cGVjdGVkID0gWyJmb2xkZXIxIiwgImZvbGRlcjIiLCAiZm9sZGVyMyJdCisgICAgCQorICAgIAlhc3NlcnRFcXVhbHMgZXhwZWN0ZWQsIGNvbGxlY3RlZEZpbGVzCisgICAgfQorCisJdm9pZCB0ZXN0RWFjaEZpbGVSZWN1cnNlKCkgeworCQlkZWYgY29sbGVjdGVkRmlsZXMgPSBbXQorCQliYXNlRGlyLmVhY2hGaWxlUmVjdXJzZSB7IGl0IC0+IGNvbGxlY3RlZEZpbGVzIDw8IGl0Lm5hbWUgfQorCQljb2xsZWN0ZWRGaWxlcy5zb3J0KCkgLy8gbmVlZHMgdG8gc29ydCBhcyB0aGVyZSBpcyBubyBndWFyYW50eSBvbiB0aGUgb3JkZXIgd2l0aGluIGEgZm9sZGVyCisKKyAgICAJZGVmIGV4cGVjdGVkID0gWyJSZWFkbWUiLCAiYnVpbGQueG1sIiwgImVtcHR5Rm9sZGVyIiwgIAorICAgIAkgImZpbGUxLmdyb292eSIsICJmaWxlMi5ncm9vdnkiLCAiZmlsZTMuZ3Jvb3Z5IiwgImZvbGRlcjEiLCAiZm9sZGVyMiIsICJmb2xkZXIzIiwgCisgICAgCSAiZm9vIiwgImZvby50eHQiLAorICAgIAkgIm15RG9jLmRvYyIsICJteURvYy5vZHQiLCAKKyAgICAJICJzdWJmb2xkZXIiLCAic3ViZm9sZGVyIl0KKyAgICAJCisgICAgCWFzc2VydEVxdWFscyBleHBlY3RlZCwgY29sbGVjdGVkRmlsZXMKKyAgICB9CisJCisJdm9pZCB0ZXN0RWFjaERpclJlY3Vyc2UoKSB7CisJCWRlZiBjb2xsZWN0ZWRGaWxlcyA9IFtdCisJCWJhc2VEaXIuZWFjaERpclJlY3Vyc2UgeyBpdCAtPiBjb2xsZWN0ZWRGaWxlcyA8PCBpdC5uYW1lIH0KKwkJY29sbGVjdGVkRmlsZXMuc29ydCgpIC8vIG5lZWRzIHRvIHNvcnQgYXMgdGhlcmUgaXMgbm8gZ3VhcmFudHkgb24gdGhlIG9yZGVyIHdpdGhpbiBhIGZvbGRlcgorCisgICAgCWRlZiBleHBlY3RlZCA9IFsiZW1wdHlGb2xkZXIiLCAiZm9sZGVyMSIsICJmb2xkZXIyIiwgImZvbGRlcjMiLCAic3ViZm9sZGVyIiwgInN1YmZvbGRlciIsXQorICAgIAkKKyAgICAJYXNzZXJ0RXF1YWxzIGV4cGVjdGVkLCBjb2xsZWN0ZWRGaWxlcworICAgIH0KKworCWRlZiBjcmVhdGVGaWxlKHBhdGgpCisJeworCQlkZWYgZiA9IG5ldyBGaWxlKGJhc2VEaXIsIHBhdGgpCisJCWYucGFyZW50RmlsZS5ta2RpcnMoKQorCQlmLmNyZWF0ZU5ld0ZpbGUoKQorCX0KKworCWRlZiBjcmVhdGVGb2xkZXIocGF0aCkKKwl7CisJCWRlZiBmID0gbmV3IEZpbGUoYmFzZURpciwgcGF0aCkKKwkJZi5ta2RpcnMoKQorCX0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvRmlsdGVyTGluZVRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9GaWx0ZXJMaW5lVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhjZTc1YQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvRmlsdGVyTGluZVRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsNDQgQEAKK3BhY2thZ2UgZ3Jvb3Z5CisKKy8qKgorICogY2hlY2sgdGhhdCB0aGUgbmV3IGZpbHRlckxpbmUoKSBtZXRob2Qgb24gSW5wdXRTdHJlYW0gaXMgb2sKKyAqIChhbmQgaW5kaXJlY3RseSB0ZXN0IG5ld1JlYWRlcigpIG1ldGhvZCBvbiBJbnB1dFN0cmVhbSkKKyAqIGFzIHNwZWNpZmllZCBpbiBHUk9PVlktNjI0IGFuZCBHUk9PVlktNjI1CisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amVyZW15LnJheW5lckBiaWdmb290LmNvbSI+SmVyZW15IFJheW5lcjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworCitjbGFzcyBGaWx0ZXJMaW5lVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKwlkZWYgbXlGaWxlCisJZGVmIG15SW5wdXQKKwlkZWYgbXlPdXRwdXQKKworCXZvaWQgc2V0VXAoKSB7CisJICAgIG15RmlsZSA9IG5ldyBGaWxlKCJzcmMvdGVzdC9ncm9vdnkvRmlsdGVyTGluZVRlc3QuZ3Jvb3Z5IikKKwkJbXlJbnB1dCA9IG5ldyBGaWxlSW5wdXRTdHJlYW0obXlGaWxlKQorCQlteU91dHB1dCA9IG5ldyBDaGFyQXJyYXlXcml0ZXIoKQorCX0KKworCXZvaWQgdGVzdEZpbHRlckxpbmVPbkZpbGVSZXR1cm5pbmdBV3JpdGFibGUoKSB7CisJCWRlZiB3cml0YWJsZSA9IG15RmlsZS5maWx0ZXJMaW5lKCkge2l0LmNvbnRhaW5zKCJ0ZXN0RmlsdGVyTGluZU9uRmlsZVJldHVybmluZ0FXcml0YWJsZSIpfQorCQl3cml0YWJsZS53cml0ZVRvKG15T3V0cHV0KQorCQlhc3NlcnQgMyA9PSBteU91dHB1dC50b1N0cmluZygpLmNvdW50KCJ0ZXN0RmlsdGVyTGluZU9uRmlsZVJldHVybmluZ0FXcml0YWJsZSIpCisJfQorCisJdm9pZCB0ZXN0RmlsdGVyTGluZU9uRmlsZVVzaW5nQW5PdXRwdXRTdHJlYW0oKSB7CisJCW15RmlsZS5maWx0ZXJMaW5lKG15T3V0cHV0KSB7aXQuY29udGFpbnMoInRlc3RGaWx0ZXJMaW5lT25GaWxlVXNpbmdBbk91dHB1dFN0cmVhbSIpfQorCQlhc3NlcnQgMyA9PSBteU91dHB1dC50b1N0cmluZygpLmNvdW50KCJ0ZXN0RmlsdGVyTGluZU9uRmlsZVVzaW5nQW5PdXRwdXRTdHJlYW0iKQorCX0KKworCXZvaWQgdGVzdEZpbHRlckxpbmVPbklucHV0U3RyZWFtUmV0dXJuaW5nQVdyaXRhYmxlKCkgeworCQlkZWYgd3JpdGFibGUgPSBteUlucHV0LmZpbHRlckxpbmUoKSB7aXQuY29udGFpbnMoInRlc3RGaWx0ZXJMaW5lT25JbnB1dFN0cmVhbVJldHVybmluZ0FXcml0YWJsZSIpfQorCQl3cml0YWJsZS53cml0ZVRvKG15T3V0cHV0KQorCQlhc3NlcnQgMyA9PSBteU91dHB1dC50b1N0cmluZygpLmNvdW50KCJ0ZXN0RmlsdGVyTGluZU9uSW5wdXRTdHJlYW1SZXR1cm5pbmdBV3JpdGFibGUiKQorCX0KKworCXZvaWQgdGVzdEZpbHRlckxpbmVPbklucHV0U3RyZWFtVXNpbmdBbk91dHB1dFN0cmVhbSgpIHsKKwkJbXlJbnB1dC5maWx0ZXJMaW5lKG15T3V0cHV0KSB7aXQuY29udGFpbnMoInRlc3RGaWx0ZXJMaW5lT25JbnB1dFN0cmVhbVVzaW5nQW5PdXRwdXRTdHJlYW0iKX0KKwkJYXNzZXJ0IDMgPT0gbXlPdXRwdXQudG9TdHJpbmcoKS5jb3VudCgidGVzdEZpbHRlckxpbmVPbklucHV0U3RyZWFtVXNpbmdBbk91dHB1dFN0cmVhbSIpCisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvRmluYWxseVRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9GaW5hbGx5VGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBjZTQzNAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvRmluYWxseVRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTMzIEBACitwYWNrYWdlIGdyb292eQ0KKw0KK2NsYXNzIEZpbmFsbHlUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2V7DQorIA0KKyAgdm9pZCB0ZXN0QnJlYWtJblRyeSgpIHsNCisgICAgZGVmIGNhbGxlZCA9IGZhbHNlDQorICAgIHdoaWxlICh0cnVlKXsNCisgICAgICB0cnkgew0KKyAgICAgICAgYnJlYWsNCisgICAgICB9IGZpbmFsbHkgew0KKyAgICAgICAgY2FsbGVkID0gdHJ1ZQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBhc3NlcnQgY2FsbGVkLCAiZmluYWxseSBibG9jayB3YXMgbm90IGNhbGxlZCINCisgIH0NCisgIA0KKyAgdm9pZCB0ZXN0QnJlYWtJbkZpbmFsbHkoKSB7DQorICAgIGRlZiBjYWxsZWQgPSBmYWxzZQ0KKyAgICB3aGlsZSAodHJ1ZSl7DQorICAgICAgdHJ5IHsNCisgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oImZvbyIpDQorICAgICAgfSBjYXRjaCAoZSkgew0KKyAgICAgICAgYXNzZXJ0IGUubWVzc2FnZSA9PSAiZm9vIg0KKyAgICAgIH0gZmluYWxseSB7DQorICAgICAgICBjYWxsZWQgPSB0cnVlDQorICAgICAgICBicmVhaw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBhc3NlcnQgY2FsbGVkLCAiZmluYWxseSBibG9jayB3YXMgbm90IGNhbGxlZCINCisgIH0NCisgIA0KKyAgdm9pZCB0ZXN0Q29udGludWVJblRyeSgpIHsNCisgICAgZGVmIGNhbGxlZCA9IGZhbHNlDQorICAgIGJvb2xlYW4gYiA9IHRydWUNCisgICAgd2hpbGUgKGIpew0KKyAgICAgIHRyeSB7DQorICAgICAgICBiPWZhbHNlDQorICAgICAgICBjb250aW51ZQ0KKyAgICAgIH0gZmluYWxseSB7DQorICAgICAgICBjYWxsZWQgPSB0cnVlDQorICAgICAgfQ0KKyAgICB9DQorICAgIGFzc2VydCBjYWxsZWQsICJmaW5hbGx5IGJsb2NrIHdhcyBub3QgY2FsbGVkIg0KKyAgfQ0KKyAgDQorICB2b2lkIHRlc3RDb250aW51ZUluRmluYWxseSgpIHsNCisgICAgZGVmIGNhbGxlZCA9IGZhbHNlDQorICAgIGJvb2xlYW4gYiA9IHRydWUNCisgICAgd2hpbGUgKGIpew0KKyAgICAgIHRyeSB7DQorICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJmb28iKQ0KKyAgICAgIH0gY2F0Y2ggKGUpIHsNCisgICAgICAgIGFzc2VydCBlLm1lc3NhZ2UgPT0gImZvbyINCisgICAgICB9IGZpbmFsbHkgew0KKyAgICAgICAgYj1mYWxzZQ0KKyAgICAgICAgY2FsbGVkID0gdHJ1ZQ0KKyAgICAgICAgY29udGludWUNCisgICAgICB9DQorICAgIH0NCisgICAgYXNzZXJ0IGNhbGxlZCwgImZpbmFsbHkgYmxvY2sgd2FzIG5vdCBjYWxsZWQiDQorICB9DQorICANCisgIHZvaWQgdGVzdFJldHVybigpIHsNCisgICAgZGVmIG1hcCA9IG1ldGhvZFdpdGhSZXR1cm5JblRyeSgpDQorICAgIGFzc2VydCBtYXAuY2FsbGVkLCAiZmluYWxseSBibG9jayB3YXMgbm90IGNhbGxlZCINCisgICAgZGVmIGNhbGxlZCA9IG1ldGhvZFdpdGhSZXR1cm5JbkZpbmFsbHkoKQ0KKyAgICBhc3NlcnQgY2FsbGVkLCAiZmluYWxseSBibG9jayB3YXMgbm90IGNhbGxlZCINCisgIH0NCisgIA0KKyAgZGVmIG1ldGhvZFdpdGhSZXR1cm5JblRyeSgpew0KKyAgICBkZWYgbWFwID0gWzpdDQorICAgIHRyeSB7DQorICAgICAgcmV0dXJuIG1hcA0KKyAgICB9IGZpbmFsbHkgew0KKwkgIG1hcC5jYWxsZWQgPSB0cnVlDQorICAgIH0NCisgIH0NCisgIA0KKyAgZGVmIG1ldGhvZFdpdGhSZXR1cm5JbkZpbmFsbHkoKXsNCisgICAgdHJ5IHsNCisgICAgICByZXR1cm4gZmFsc2UNCisgICAgfSBmaW5hbGx5IHsNCisJICByZXR1cm4gdHJ1ZQ0KKyAgICB9DQorICB9DQorICANCisgIHZvaWQgdGVzdFN0YWNrZUZpbmFsbHkoKXsNCisgICAgZGVmIGNhbGxzID0gbWV0aG9kV2l0aFN0YWNrZWRGaW5hbGx5KCkNCisgICAgaWYgKGNhbGxzPT0xMikgew0KKyAgICAgIGFzc2VydCBmYWxzZSwid3Jvbmcgb3JkZXIgb2YgZmluYWxseSBibG9ja3MiDQorICAgIH0NCisgICAgYXNzZXJ0IGNhbGxzPT0xMDIgDQorICB9DQorDQorICBkZWYgbWV0aG9kV2l0aFN0YWNrZWRGaW5hbGx5KCl7DQorICAgIGRlZiBjYWxscyA9IDANCisgICAgZGVmIGZpcnN0ID0gdHJ1ZTsNCisgICAgdHJ5IHsNCisgICAgICB0cnkgew0KKyAgICAgICAgY2FsbHMgPSAwDQorICAgICAgfSBmaW5hbGx5IHsNCisgICAgICAgIGNhbGxzKysNCisgICAgICAgIGlmIChmaXJzdCkgew0KKyAgICAgICAgICBmaXJzdCA9IGZhbHNlDQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBjYWxscyArPSAxMA0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfSBmaW5hbGx5IHsNCisgICAgICBjYWxscysrDQorICAgICAgaWYgKGZpcnN0KSB7DQorICAgICAgICBmaXJzdCA9IGZhbHNlDQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGNhbGxzICs9IDEwMA0KKyAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gY2FsbHMNCisgIH0NCisgIA0KKyAgZGVmIG11bHRpcGxlUmV0dXJuKCkgew0KKyAgICB0cnkgeyANCisgICAgICAgIGlmICgwID09IDEpIHJldHVybiAxDQorICAgICAgICByZXR1cm4gMg0KKyAgICB9DQorICAgIGZpbmFsbHkgeyANCisgICAgICAgIHJldHVybiAzDQorICAgIH0NCisgIH0NCisgIA0KKyAgdm9pZCB0ZXN0TXVsdGlwbGVSZXR1cm4oKXsNCisgICAgYXNzZXJ0IG11bHRpcGxlUmV0dXJuKCkgPT0gMw0KKyAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0Zvby5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0Zvby5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRlMDY0MgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvRm9vLmdyb292eQpAQCAtMCwwICsxLDU0IEBACitwYWNrYWdlIGdyb292eQorCisvKiogCisgKiBBIGR1bW15IGJlYW4gZm9yIHRlc3RpbmcgdGhlIHVzZSBvZiBwcm9wZXJ0aWVzIGluIEdyb292eQorICogCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitjbGFzcyBGb28gaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworCisgICAgLy8gcHVibGljIHByb3BlcnRpZXMKKyAgICBkZWYgbmFtZSA9ICJKYW1lcyIKKyAgICBkZWYgY291bnQKKyAgICBTdHJpbmcgbG9jYXRpb24gPSAiTG9uZG9uIgorICAgIAorICAgIC8vIGRlY2xhcmUgcHJpdmF0ZSB2YXJpYWJsZXMKKyAgICBwcml2YXRlIGJsYWggPSA5CisgICAgcHJpdmF0ZSBpbnZpc2libGUgPSAiaW52aXNpYmxlIgorCisgICAgLy8gZGVjbGFyZSBhIHByb3RlY3RlZCB2YXJpYWJsZQorICAgIHByb3RlY3RlZCBwcm90ID0gImhpZGUgbWUhIgorCisgICAgLy8gZGVjbGFyZSBhIGJlYW4gd2l0aCBleHBsaWNpdCB0eXBpbmcKKyAgICBwcml2YXRlIFN0cmluZyBib2R5CisKKyAgICBzdGF0aWMgdm9pZCBtYWluKGFyZ3MpIHsKKyAgICAgICAgZGVmIGYgPSBuZXcgRm9vKCkKKyAgICAgICAgcHJpbnRsbiBmCisgICAgfQorICAgIAorICAgIC8vIHByb3ZpZGUgYSBnZXR0ZXIgbWV0aG9kCisgICAgZGVmIGdldENvdW50KCkgeworICAgICAgICAgaWYgKGNvdW50ID09IG51bGwpIHsKKyAgICAgICAgICAgICBjb3VudCA9IDEKKyAgICAgICAgIH0KKyAgICAgICAgIHJldHVybiBjb3VudAorICAgIH0KKyAgICAgCisgICAgZGVmIGdldEJsYWgoKSB7CisgICAgICAgICByZXR1cm4gYmxhaAorICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Qm9keSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuYm9keSA/IHRoaXMuYm9keSA6ICdudWxsJworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEJvZHkoU3RyaW5nIGJvZHkpIHsKKyAgICAgICAgdGhpcy5ib2R5ID0gYm9keQorICAgIH0KKworICAgIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCkgKyAiIG5hbWU6ICR7bmFtZX0gbG9jYXRpb246ICR7bG9jYXRpb259IgorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvRm9yTG9vcFRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9Gb3JMb29wVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM1YjczZgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvRm9yTG9vcFRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTM5IEBACitwYWNrYWdlIGdyb292eQorCitpbXBvcnQgZ3Jvb3Z5LmJ1Z3MuVGVzdFN1cHBvcnQKKworY2xhc3MgRm9yTG9vcFRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICBkZWYgeAorCQorICAgIHZvaWQgdGVzdFJhbmdlKCkgeworICAgICAgICB4ID0gMAorCisgICAgICAgIGZvciAoIGkgaW4gMC4uOSApIHsKKyAgICAgICAgICAgIHggPSB4ICsgaQorICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0IHggPT0gNDUKKyAgICB9CisKKyAgICB2b2lkIHRlc3RSYW5nZVdpdGhUeXBlKCkgeworICAgICAgICB4ID0gMAorCisgICAgICAgIGZvciAoIEludGVnZXIgaSBpbiAwLi45ICkgeworICAgICAgICAgICAgYXNzZXJ0IGkuZ2V0Q2xhc3MoKSA9PSBJbnRlZ2VyCisgICAgICAgICAgICB4ID0geCArIGkKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydCB4ID09IDQ1CisgICAgfQorCisgICAgLyoqIFRPRE8gLSBubyBsb25nZXIgYXBwbGljYWJsZT8KKworICAgIHZvaWQgdGVzdFJhbmdlV2l0aEpkazE1U3R5bGUoKSB7CisgICAgICAgIHggPSAwCisKKyAgICAgICAgZm9yICggaSA6IDAuLjkgKSB7CisgICAgICAgICAgICB4ID0geCArIGkKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydCB4ID09IDQ1CisJfQorCQorCXZvaWQgdGVzdFJhbmdlV2l0aEpkazE1U3R5bGVBbmRUeXBlKCkgeworICAgICAgICB4ID0gMAorCisgICAgICAgIGZvciAoIEludGVnZXIgaSA6IDAuLjkgKSB7CisgICAgICAgICAgICBhc3NlcnQgaS5nZXRDbGFzcygpID09IEludGVnZXIKKyAgICAgICAgICAgIHggPSB4ICsgaQorICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0IHggPT0gNDUKKyAgICB9CisgICAgKi8KKwkKKyAgICB2b2lkIHRlc3RMaXN0KCkgeworICAgICAgICB4ID0gMAorCQkKKyAgICAgICAgZm9yICggaSBpbiBbMCwgMSwgMiwgMywgNF0gKSB7CisgICAgICAgICAgICB4ID0geCArIGkKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydCB4ID09IDEwCisgICAgfQorCisgICAgdm9pZCB0ZXN0QXJyYXkoKSB7CisgICAgICAgIGRlZiBhcnJheSA9ICgwLi40KS50b0FycmF5KCkKKyAgICAgICAgCisgICAgICAgIHByaW50bG4gIkNsYXNzOiAke2FycmF5LmdldENsYXNzKCl9IGZvciBhcnJheSAke2FycmF5fSIKKyAgICAgICAgCisgICAgICAgIHggPSAwCisgICAgICAgIAorICAgICAgICBmb3IgKCBpIGluIGFycmF5ICkgeworICAgICAgICAgICAgeCA9IHggKyBpCisgICAgICAgIH0KKworICAgICAgICBhc3NlcnQgeCA9PSAxMAorICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RJbnRBcnJheSgpIHsKKyAgICAgICAgZGVmIGFycmF5ID0gVGVzdFN1cHBvcnQuZ2V0SW50QXJyYXkoKQorICAgICAgICAKKyAgICAgICAgcHJpbnRsbiAiQ2xhc3M6ICR7YXJyYXkuZ2V0Q2xhc3MoKX0gZm9yIGFycmF5ICR7YXJyYXl9IgorICAgICAgICAKKyAgICAgICAgeCA9IDAKKyAgICAgICAgCisgICAgICAgIGZvciAoIGkgaW4gYXJyYXkgKSB7CisgICAgICAgICAgICB4ID0geCArIGkKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydCB4ID09IDE1CisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdFN0cmluZygpIHsKKyAgICAgICAgZGVmIHRleHQgPSAiYWJjIgorICAgICAgICAKKyAgICAgICAgZGVmIGxpc3QgPSBbXQorICAgICAgICBmb3IgKGMgaW4gdGV4dCkgeworICAgICAgICAgICAgbGlzdC5hZGQoYykKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IGxpc3QgPT0gWyJhIiwgImIiLCAiYyJdCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdFZlY3RvcigpIHsKKyAgICAgICAgZGVmIHZlY3RvciA9IG5ldyBWZWN0b3IoKQorICAgICAgICB2ZWN0b3IuYWRkQWxsKCBbMSwgMiwgM10gKQorICAgICAgICAKKyAgICAgICAgZGVmIGFuc3dlciA9IFtdCisgICAgICAgIGZvciAoaSBpbiB2ZWN0b3IuZWxlbWVudHMoKSkgeworICAgICAgICAgICAgYW5zd2VyIDw8IGkKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQgYW5zd2VyID09IFsxLCAyLCAzXQorICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RDbGFzc2ljRm9yKCkgeworICAgICAgIGRlZiBzdW0gPSAwCisgICAgICAgZm9yIChpbnQgaT0wOyBpPDEwOyBpKyspIHsKKyAgICAgICAgIHN1bSsrCisgICAgICAgfQorICAgICAgIGFzc2VydCBzdW09PTEwCisgICAgICAgCisgICAgICAgZGVmIGxpc3QgPSBbMSwyXQorICAgICAgIHN1bT0wCisgICAgICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpO2kuaGFzTmV4dCgpOyl7CisgICAgICAgICBzdW0gKz0gaS5uZXh0KCkKKyAgICAgICB9CisgICAgICAgYXNzZXJ0IHN1bT09MworICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RDbGFzc2ljRm9yTmVzdGVkKCkgeworICAgICAgIGRlZiBzdW0gPSAwCisgICAgICAgZm9yIChpbnQgaT0wOyBpPDEwOyBpKyspIHsKKyAgICAgICAgIGZvciAoaW50IGo9MDsgajwxMDsgaisrKSB7CisgICAgICAgICAgIHN1bSsrCisgICAgICAgICB9CisgICAgICAgfQorICAgICAgIGFzc2VydCBzdW09PTEwMAorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9Gb3JMb29wV2l0aExvY2FsVmFyaWFibGVzVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0Zvckxvb3BXaXRoTG9jYWxWYXJpYWJsZXNUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjJlYTlhCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9Gb3JMb29wV2l0aExvY2FsVmFyaWFibGVzVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwxNyBAQAorcGFja2FnZSBncm9vdnkKKworLyoqCisgKiBUZXN0cyBpdGVyYXRpbmcgd2l0aCBsb2NhbCB2YXJpYWJsZXMKKyAqLworY2xhc3MgRm9yTG9vcFdpdGhMb2NhbFZhcmlhYmxlc1Rlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICB2b2lkIHRlc3RGb3JMb29wKCkgeworICAgICAgICBkZWYgeCA9IG51bGwKKworICAgICAgICBmb3IgKCBpIGluIDAuLjkgKSB7CisgICAgICAgICAgICB4ID0gaQorICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0IHggPT0gOQorCX0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvR1N0cmluZ1Rlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9HU3RyaW5nVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRlYzhjOAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvR1N0cmluZ1Rlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsNDk3IEBACitjbGFzcyBHU3RyaW5nVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIHZvaWQgY2hlY2sodGVtcGxhdGUsIHRlc3RzdHIpIHsKKyAgICAgICAgYXNzZXJ0IHRlbXBsYXRlIGluc3RhbmNlb2YgR1N0cmluZworCisgICAgICAgIGRlZiBjb3VudCA9IHRlbXBsYXRlLmdldFZhbHVlQ291bnQoKQorICAgICAgICBhc3NlcnQgY291bnQgPT0gMQorICAgICAgICBhc3NlcnQgdGVtcGxhdGUuZ2V0VmFsdWUoMCkgPT0gIkJvYiIKKworICAgICAgICBkZWYgc3RyaW5nID0gdGVtcGxhdGUudG9TdHJpbmcoKQorICAgICAgICBhc3NlcnQgc3RyaW5nID09IHRlc3RzdHIKKyAgICB9CisKKyAgICB2b2lkIHRlc3RXaXRoT25lVmFyaWFibGUoKSB7CisgICAgICAgIGRlZiBuYW1lID0gIkJvYiIKKyAgICAgICAgZGVmIHRlc3RzdHIgPSAiaGVsbG8gQm9iIGhvdyBhcmUgeW91PyIKKworICAgICAgICBjaGVjaygiaGVsbG8gJG5hbWUgaG93IGFyZSB5b3U/IiwgdGVzdHN0cikKKyAgICAgICAgY2hlY2soImhlbGxvICR7bmFtZX0gaG93IGFyZSB5b3U/IiwgdGVzdHN0cikKKyAgICAgICAgY2hlY2soImhlbGxvICR7cHJpbnRsbiAiZmVlcCI7IG5hbWV9IGhvdyBhcmUgeW91PyIsIHRlc3RzdHIpCisgICAgICAgIGNoZWNrKC9oZWxsbyAkbmFtZSBob3cgYXJlIHlvdT8vLCB0ZXN0c3RyKQorICAgICAgICBjaGVjaygvaGVsbG8gJHtuYW1lfSBob3cgYXJlIHlvdT8vLCB0ZXN0c3RyKQorICAgICAgICBjaGVjaygvaGVsbG8gJHtwcmludGxuICJmZWVwIjsgbmFtZX0gaG93IGFyZSB5b3U/LywgdGVzdHN0cikKKyAgICB9CisKKyAgICB2b2lkIHRlc3RXaXRoVmFyaWFibGVBdEVuZCgpIHsKKyAgICAgICAgZGVmIG5hbWUgPSAiQm9iIgorICAgICAgICBkZWYgdGVzdHN0ciA9ICJoZWxsbyBCb2IiCisKKyAgICAgICAgY2hlY2soImhlbGxvICRuYW1lIiwgdGVzdHN0cikKKyAgICAgICAgY2hlY2soImhlbGxvICR7bmFtZX0iLCB0ZXN0c3RyKQorICAgICAgICBjaGVjaygvaGVsbG8gJG5hbWUvLCB0ZXN0c3RyKQorICAgICAgICBjaGVjaygvaGVsbG8gJHtuYW1lfS8sIHRlc3RzdHIpCisgICAgfQorCisgICAgdm9pZCB0ZXN0V2l0aFZhcmlhYmxlQXRCZWdpbm5pbmcoKSB7CisgICAgICAgIGRlZiBuYW1lID0gIkJvYiIKKyAgICAgICAgZGVmIHRlc3RzdHIgPSAiQm9iIGhleSIKKyAgICAgICAgY2hlY2soIiRuYW1lIGhleSIsIHRlc3RzdHIpCisgICAgICAgIGNoZWNrKCIke25hbWV9IGhleSIsIHRlc3RzdHIpCisgICAgICAgIG5hbWUgPSAiIgorICAgICAgICBjaGVjaygiJHtuYW1lICs9ICJCb2IiOyBuYW1lfSBoZXkiLCB0ZXN0c3RyKQorICAgICAgICBhc3NlcnQgbmFtZSA9PSAiQm9iIgorICAgICAgICBjaGVjaygvJG5hbWUgaGV5LywgdGVzdHN0cikKKyAgICAgICAgY2hlY2soLyR7bmFtZX0gaGV5LywgdGVzdHN0cikKKyAgICAgICAgbmFtZSA9ICIiCisgICAgICAgIGNoZWNrKC8ke25hbWUgKz0gIkJvYiI7IG5hbWV9IGhleS8sIHRlc3RzdHIpCisgICAgfQorCisgICAgdm9pZCB0ZXN0V2l0aEp1c3RWYXJpYWJsZSgpIHsKKyAgICAgICAgZGVmIHRlc3RzdHIKKyAgICAgICAgZGVmIG5hbWUgPSB0ZXN0c3RyID0gIkJvYiIKKyAgICAgICAgY2hlY2soIiRuYW1lIiwgdGVzdHN0cikKKyAgICAgICAgY2hlY2soIiR7bmFtZX0iLCB0ZXN0c3RyKQorICAgICAgICBjaGVjaygiJHthc3NlcnQgbmFtZSA9PSAiQm9iIjsgbmFtZX0iLCB0ZXN0c3RyKQorICAgICAgICAvLyBQdXQgcHVuY3R1YXRpb24gYWZ0ZXIgdGhlIHZhcmlhYmxlIG5hbWU6CisgICAgICAgIGNoZWNrKCIkbmFtZS4iLCAiQm9iLiIpCisgICAgICAgIGNoZWNrKCIkbmFtZS4uLiIsICJCb2IuLi4iKQorICAgICAgICBjaGVjaygiJG5hbWU/IiwgIkJvYj8iKQorCisgICAgICAgIGNoZWNrKC8kbmFtZS8sIHRlc3RzdHIpCisgICAgICAgIGNoZWNrKC8ke25hbWV9LywgdGVzdHN0cikKKyAgICAgICAgY2hlY2soLyR7YXNzZXJ0IG5hbWUgPT0gIkJvYiI7IG5hbWV9LywgdGVzdHN0cikKKyAgICAgICAgLy8gUHV0IHB1bmN0dWF0aW9uIGFmdGVyIHRoZSB2YXJpYWJsZSBuYW1lOgorICAgICAgICBjaGVjaygvJG5hbWUuLywgIkJvYi4iKQorICAgICAgICBjaGVjaygvJG5hbWUuLi4vLCAiQm9iLi4uIikKKyAgICAgICAgY2hlY2soLyRuYW1lPy8sICJCb2I/IikKKyAgICAgICAgY2hlY2soLyRuYW1lXD8vLCAiQm9iXFw/IikKKyAgICAgICAgY2hlY2soLyRuYW1lJC8sICJCb2JcJCIpCisKKyAgICAgICAgZGVmIGd1eSA9IFtuYW1lOiBuYW1lXQorICAgICAgICBjaGVjaygiJHtndXkubmFtZX0iLCAiQm9iIikKKyAgICAgICAgY2hlY2soIiRndXkubmFtZSIsICJCb2IiKQorICAgICAgICBjaGVjaygiJGd1eS5uYW1lLiIsICJCb2IuIikKKyAgICAgICAgY2hlY2soIiRndXkubmFtZS4uLiIsICJCb2IuLi4iKQorICAgICAgICBjaGVjaygiJGd1eS5uYW1lPyIsICJCb2I/IikKKyAgICAgICAgY2hlY2soLyRndXkubmFtZS8sICJCb2IiKQorICAgICAgICBjaGVjaygvJGd1eS5uYW1lLi8sICJCb2IuIikKKyAgICAgICAgY2hlY2soLyRndXkubmFtZS4uLi8sICJCb2IuLi4iKQorICAgICAgICBjaGVjaygvJGd1eS5uYW1lPy8sICJCb2I/IikKKyAgICAgICAgY2hlY2soLyRndXkubmFtZVw/LywgIkJvYlxcPyIpCisgICAgICAgIGNoZWNrKC8kZ3V5Lm5hbWUkLywgIkJvYlwkIikKKyAgICB9CisKKyAgICB2b2lkIHRlc3RXaXRoVHdvVmFyaWFibGVzKCkgeworICAgICAgICBkZWYgbmFtZSA9ICJCb2IiCisgICAgICAgIGRlZiB0ZW1wbGF0ZSA9ICIke25hbWV9JHtuYW1lfSIKKyAgICAgICAgZGVmIHN0cmluZyA9IHRlbXBsYXRlLnRvU3RyaW5nKCkKKworICAgICAgICBhc3NlcnQgc3RyaW5nID09ICJCb2JCb2IiCisgICAgfQorCisgICAgdm9pZCB0ZXN0V2l0aFR3b1ZhcmlhYmxlc1dpdGhTcGFjZSgpIHsKKyAgICAgICAgZGVmIG5hbWUgPSAiQm9iIgorICAgICAgICBkZWYgdGVtcGxhdGUgPSAiJHtuYW1lfSAke25hbWV9IgorICAgICAgICBkZWYgc3RyaW5nID0gdGVtcGxhdGUudG9TdHJpbmcoKQorCisgICAgICAgIGFzc2VydCBzdHJpbmcgPT0gIkJvYiBCb2IiCisgICAgfQorCisgICAgdm9pZCB0ZXN0QXBwZW5kU3RyaW5nKCkgeworICAgICAgICBkZWYgYSA9ICJkb2ciCisgICAgICAgIGRlZiBiID0gImEgJHthfSIKKyAgICAgICAgZGVmIGMgPSBiICsgIiBjYXQiCisgICAgICAgIGFzc2VydCBjLnRvU3RyaW5nKCkgPT0gImEgZG9nIGNhdCIsIGMKKworICAgICAgICBiICs9ICIgY2F0IgorICAgICAgICBhc3NlcnQgYi50b1N0cmluZygpID09ICJhIGRvZyBjYXQiLCBiCisgICAgfQorCisgICAgdm9pZCB0ZXN0QXBwZW5kR1N0cmluZygpIHsKKyAgICAgICAgZGVmIGEgPSAiZG9nIgorICAgICAgICBkZWYgYiA9ICJhICR7YX0iCisgICAgICAgIGIgKz0gIiBjYXQke2F9IgorCisgICAgICAgIGFzc2VydCBiLnRvU3RyaW5nKCkgPT0gImEgZG9nIGNhdGRvZyIsIGIKKyAgICB9CisKKyAgICB2b2lkIHRlc3RSZXR1cm5TdHJpbmcoKSB7CisgICAgICAgIGRlZiB2YWx1ZSA9IGR1bW15TWV0aG9kKCkKKyAgICAgICAgYXNzZXJ0IHZhbHVlID09ICJIZWxsbyBHcm9taXQhIgorICAgIH0KKworICAgIFN0cmluZyBkdW1teU1ldGhvZCgpIHsKKyAgICAgICAgZGVmIG5hbWUgPSAiR3JvbWl0IgorICAgICAgICByZXR1cm4gIkhlbGxvICR7bmFtZX0hIgorICAgIH0KKworICAgIHZvaWQgdGVzdENvZXJjZSgpIHsKKyAgICAgICAgZGVmIGVuYyA9ICJVUy1BU0NJSSIKKyAgICAgICAgZGVmIHZhbHVlID0gInRlc3QiLmdldEJ5dGVzKCIke2VuY30iKQorICAgICAgICAgYXNzZXJ0IHZhbHVlID09IFsxMTYsIDEwMSwgMTE1LCAxMTZdCisgICAgfQorCisgICAgdm9pZCB0ZXN0R3Jvb3Z5NDQxKCkgeworICAgICAgICBkZWYgYXJnID0gInRlc3QiCisgICAgICAgIGRlZiBjb250ZW50ID0gIiR7YXJnfSA9IgorICAgICAgICBpZiAoYXJnICE9ICJzb21ldGhpbmciKSB7CisgICAgICAgICAgICBjb250ZW50ICs9ICI/IgorICAgICAgICB9CisgICAgICAgIGNvbnRlbnQgKz0gIj0gJHthcmd9LiIKKyAgICAgICAgYXNzZXJ0IGNvbnRlbnQgPT0gInRlc3QgPT89IHRlc3QuIgorICAgIH0KKworICAgIHZvaWQgdGVzdFR3b1N0cmluZ3NJbk1pZGRsZSgpIHsKKyAgICAgICAgZGVmIGEgPSAiLS0tIgorICAgICAgICBkZWYgYiA9ICIke2F9IDoiCisgICAgICAgIGIgKz0gIjw8IgorICAgICAgICBiICs9ICI+PiIKKyAgICAgICAgYiArPSAiOiAke2F9IgorICAgICAgICBhc3NlcnQgYiA9PSAiLS0tIDo8PD4+OiAtLS0iCisgICAgfQorCisgICAgdm9pZCB0ZXN0QWx0ZXJuYXRpbmdHU3RyaW5ncygpIHsKKyAgICAgICAgZGVmIGEgPSAiLS0tIgorICAgICAgICBkZWYgYiA9ICIke2F9IDoiCisgICAgICAgIGIgKz0gIjw8IgorICAgICAgICBiICs9ICIgW1ske2F9XV0gIgorICAgICAgICBiICs9ICI+PiIKKyAgICAgICAgYiArPSAiOiAke2F9IgorICAgICAgICBhc3NlcnQgYiA9PSAiLS0tIDo8PCBbWy0tLV1dID4+OiAtLS0iCisgICAgfQorCisgICAgIC8vIFRlc3QgY2FzZSBmb3IgR1JPT1ZZLTU5OQorICAgIHZvaWQgdGVzdEdTdHJpbmdJblN0YXRpY01ldGhvZCgpIHsKKyAgICAgICAgaW50IHZhbHVlID0gMgorICAgICAgICBTdHJpbmcgc3RyID0gIjEke3ZhbHVlfTMiCisgICAgICAgIGludCByZXN1bHQgPSBJbnRlZ2VyLnBhcnNlSW50KHN0cikKKyAgICAgICAgYXNzZXJ0IHJlc3VsdCA9PSAxMjMKKyAgICAgICAgcmVzdWx0ID0gSW50ZWdlci5wYXJzZUludCgiMSR7dmFsdWV9MyIpCisgICAgICAgIGFzc2VydCByZXN1bHQgPT0gMTIzCisgICAgfQorCisgICAgLy8gVGVzdCBjYXNlIGZvciBHUk9PVlktMjI3NQorICAgIHZvaWQgdGVzdEdldEF0V2l0aFJhbmdlKCkgeworICAgICAgICBkZWYgbnVtYmVyID0gMTIzNDU2NworICAgICAgICBkZWYgbnVtYmVyU3RyaW5nID0gIiR7bnVtYmVyfSIKKyAgICAgICAgZGVmIHJlYWxTdHJpbmcgPSAiMTIzNDU2NyIKKyAgICAgICAgYXNzZXJ0IG51bWJlclN0cmluZ1swLi4tMV0gPT0gJzEyMzQ1NjcnCisgICAgICAgIGFzc2VydCByZWFsU3RyaW5nWzAuLi0xXSA9PSAnMTIzNDU2NycKKyAgICB9CisKKyAgICB2b2lkIHRlc3RFbWJlZGRlZENsb3N1cmVzKCkgeworICAgICAgICBkZWYgYzEgPSB7LT4gImhlbGxvIn0KKyAgICAgICAgZGVmIGMyID0ge291dCAtPiBvdXQgPDwgIndvcmxkIn0KKyAgICAgICAgZGVmIGMzID0ge2EsIGIgLT4gYiA8PCBhfQorICAgICAgICBkZWYgYzQgPSBjMy5jdXJyeSg1KQorCisgICAgICAgIGRlZiBnMSA9ICIkey0+ICJoZWxsbyJ9ICR7b3V0IC0+IG91dCA8PCAid29ybGQifSIKKyAgICAgICAgZGVmIGcyID0gIiRjMSAkYzIiCisgICAgICAgIGRlZiBnMyA9ICIkey0+IGMxfSAkey0+IGMyfSIKKyAgICAgICAgZGVmIGc0ID0gIiRjNCIKKyAgICAgICAgZGVmIGc1ID0gIiRjMyIKKworICAgICAgICBkZWYgdyA9IG5ldyBTdHJpbmdXcml0ZXIoKQorICAgICAgICB3IDw8IGcxCisgICAgICAgIGFzc2VydEVxdWFscyh3LmJ1ZmZlci50b1N0cmluZygpLCAiaGVsbG8gd29ybGQiKQorICAgICAgICBhc3NlcnRFcXVhbHMoZzEudG9TdHJpbmcoKSwgImhlbGxvIHdvcmxkIikKKyAgICAgICAgdyA9IG5ldyBTdHJpbmdXcml0ZXIoKQorICAgICAgICB3IDw8IGcyCisgICAgICAgIGFzc2VydEVxdWFscyh3LmJ1ZmZlci50b1N0cmluZygpLCAiaGVsbG8gd29ybGQiKQorICAgICAgICBhc3NlcnRFcXVhbHMoZzIudG9TdHJpbmcoKSwgImhlbGxvIHdvcmxkIikKKyAgICAgICAgdyA9IG5ldyBTdHJpbmdXcml0ZXIoKQorICAgICAgICB3IDw8IGczCisgICAgICAgIGFzc2VydCB3LmJ1ZmZlci50b1N0cmluZygpLmNvbnRhaW5zKCJjbG9zdXJlIikKKyAgICAgICAgYXNzZXJ0IGczLnRvU3RyaW5nKCkuY29udGFpbnMoImNsb3N1cmUiKQorICAgICAgICB3ID0gbmV3IFN0cmluZ1dyaXRlcigpCisgICAgICAgIHcgPDwgZzQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHcuYnVmZmVyLnRvU3RyaW5nKCksICI1IikKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGc0LnRvU3RyaW5nKCksICI1IikKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByaW50bG4gZzUKKyAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBhIEdyb292eVJ1bnRpbWVFeGNlcHRpb24iKQorICAgICAgICB9IGNhdGNoIChHcm9vdnlSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJpbnRsbiBnNS50b1N0cmluZygpCisgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgYSBHcm9vdnlSdW50aW1lRXhjZXB0aW9uIikKKyAgICAgICAgfSBjYXRjaCAoR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBjb21wYXJpbmcgdHdvIHN0cmluZ3Mgd2hpY2ggaGF2ZSB0aGUgc2FtZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gYnV0CisgICAgICogb25seSBvbmUgb2Ygd2hpY2ggdXNlcyBhIHRlbXBsYXRlLiBUaGlzIGlzIGEgdGVzdCBmb3IgR1JPT1ZZLTYyNi4KKyAgICAgKi8KKyAgICB2b2lkIHRlc3RFcXVhbHNUZW1wbGF0ZVRvTGl0ZXJhbCgpIHsKKyAgICAgICAgZGVmIHRlbXBsYXRlID0gIiR7Mn0iCisgICAgICAgIGRlZiBsaXRlcmFsID0gIjIiCisKKyAgICAgICAgLy8gc3VjY2VlZHMKKyAgICAgICAgYXNzZXJ0VHJ1ZSgidGVtcGxhdGUgPT0gbGl0ZXJhbCBmYWxzZSIsIHRlbXBsYXRlID09IGxpdGVyYWwpCisgICAgICAgIGFzc2VydFRydWUoImxpdGVyYWwgPT0gdGVtcGxhdGUgZmFsc2UiLCBsaXRlcmFsID09IHRlbXBsYXRlKQorCisgICAgICAgIC8vIHRoZXNlIGZhaWwKKyAgICAgICAgYXNzZXJ0RmFsc2UoImxpdGVyYWwgbm90IGVxdWFsIHRvIHRlbXBsYXRlIiwgbGl0ZXJhbC5lcXVhbHModGVtcGxhdGUpKQorICAgICAgICBhc3NlcnRGYWxzZSgidGVtcGxhdGUgbm90IGVxdWFsIHRvIGxpdGVyYWwiLCB0ZW1wbGF0ZS5lcXVhbHMobGl0ZXJhbCkpCisgICAgICAgIGFzc2VydFRydWUoImhhc2ggY29kZXMgbm90IGVxdWFsIiwgbGl0ZXJhbC5oYXNoQ29kZSgpICE9IHRlbXBsYXRlLmhhc2hDb2RlKCkpCisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgZ2V0dGluZyBhIGNoYXJhY3RlciBieSBpbmRleCB3aGVyZSB0aGUgaW5kZXggaXMgYSByZWZlcmVuY2UgaW5zdGVhZCBvZiBhIGNvbnN0YW50LgorICAgICAqIFRoaXMgaXMgYSB0ZXN0IGZvciBHUk9PVlktMTEzOS4KKyAgICAgKi8KKyAgICB2b2lkIHRlc3RDaGFyQXRXaXRoSW50ZWdlclJlZmVyZW5jZSgpIHsKKyAgICAgICAgZGVmIGxpdGVyYWwgPSAiMDEyMzQ1Njc4OSI7CisgICAgICAgIGRlZiB0ZW1wbGF0ZSA9ICIke2xpdGVyYWx9IjsKKworICAgICAgICBkZWYgaSA9IDAKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3cm9uZyBjaGFyYWN0ZXIgYXQgcG9zaXRpb24gMCIsICcwJywgbGl0ZXJhbFtpXSk7CisgICAgICAgIGFzc2VydEVxdWFscygid3JvbmcgY2hhcmFjdGVyIGF0IHBvc2l0aW9uIDAiLCAnMCcsIHRlbXBsYXRlW2ldKTsKKworICAgICAgICBpID0gNQorICAgICAgICBhc3NlcnRFcXVhbHMoIndyb25nIGNoYXJhY3RlciBhdCBwb3NpdGlvbiA1IiwgJzUnLCBsaXRlcmFsW2ldKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3cm9uZyBjaGFyYWN0ZXIgYXQgcG9zaXRpb24gNSIsICc1JywgdGVtcGxhdGVbaV0pOworCisgICAgICAgIGkgPSA5CisgICAgICAgIGFzc2VydEVxdWFscygid3JvbmcgY2hhcmFjdGVyIGF0IHBvc2l0aW9uIDkiLCAnOScsIGxpdGVyYWxbaV0pOworICAgICAgICBhc3NlcnRFcXVhbHMoIndyb25nIGNoYXJhY3RlciBhdCBwb3NpdGlvbiA5IiwgJzknLCB0ZW1wbGF0ZVtpXSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgZ2V0dGluZyBhIGNoYXJhY3RlciBieSBpbmRleCwgY291bnRpbmcgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmcuCisgICAgICovCisgICAgdm9pZCB0ZXN0Q2hhckF0RnJvbVN0YXJ0KCkgeworICAgICAgICBkZWYgbGl0ZXJhbCA9ICIwMTIzNDU2Nzg5IjsKKyAgICAgICAgZGVmIHRlbXBsYXRlID0gIiR7bGl0ZXJhbH0iOworCisgICAgICAgIGFzc2VydEVxdWFscygid3JvbmcgY2hhcmFjdGVyIGF0IHBvc2l0aW9uIDAiLCAnMCcsIGxpdGVyYWxbMF0pOworICAgICAgICBhc3NlcnRFcXVhbHMoIndyb25nIGNoYXJhY3RlciBhdCBwb3NpdGlvbiA1IiwgJzUnLCBsaXRlcmFsWzVdKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3cm9uZyBjaGFyYWN0ZXIgYXQgcG9zaXRpb24gOSIsICc5JywgbGl0ZXJhbFs5XSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3cm9uZyBjaGFyYWN0ZXIgYXQgcG9zaXRpb24gMCIsICcwJywgdGVtcGxhdGVbMF0pOworICAgICAgICBhc3NlcnRFcXVhbHMoIndyb25nIGNoYXJhY3RlciBhdCBwb3NpdGlvbiA1IiwgJzUnLCB0ZW1wbGF0ZVs1XSk7CisgICAgICAgIGFzc2VydEVxdWFscygid3JvbmcgY2hhcmFjdGVyIGF0IHBvc2l0aW9uIDkiLCAnOScsIHRlbXBsYXRlWzldKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBnZXR0aW5nIGEgY2hhcmFjdGVyIGJ5IGluZGV4LCBjb3VudGluZyBmcm9tIHRoZSBlbmQgb2YgdGhlIHN0cmluZy4KKyAgICAgKi8KKyAgICB2b2lkIHRlc3RDaGFyQXRGcm9tRW5kKCkgeworICAgICAgICBkZWYgbGl0ZXJhbCA9ICIwMTIzNDU2Nzg5IjsKKyAgICAgICAgZGVmIHRlbXBsYXRlID0gIiR7bGl0ZXJhbH0iOworCisgICAgICAgIGFzc2VydEVxdWFscygid3JvbmcgY2hhcmFjdGVyIGF0IHBvc2l0aW9uIC0xIiwgJzknLCBsaXRlcmFsWy0xXSk7CisgICAgICAgIGFzc2VydEVxdWFscygid3JvbmcgY2hhcmFjdGVyIGF0IHBvc2l0aW9uIC01IiwgJzUnLCBsaXRlcmFsWy01XSk7CisgICAgICAgIGFzc2VydEVxdWFscygid3JvbmcgY2hhcmFjdGVyIGF0IHBvc2l0aW9uIC0xMCIsICcwJywgbGl0ZXJhbFstMTBdKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIndyb25nIGNoYXJhY3RlciBhdCBwb3NpdGlvbiAtMSIsICc5JywgdGVtcGxhdGVbLTFdKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3cm9uZyBjaGFyYWN0ZXIgYXQgcG9zaXRpb24gLTUiLCAnNScsIHRlbXBsYXRlWy01XSk7CisgICAgICAgIGFzc2VydEVxdWFscygid3JvbmcgY2hhcmFjdGVyIGF0IHBvc2l0aW9uIC0xMCIsICcwJywgdGVtcGxhdGVbLTEwXSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgZXh0cmFjdGluZyBhIHJhbmdlIHdoaWNoIHN0YXJ0cyBhdCBwb3NpdGlvbiB6ZXJvIGFuZCBlbmRzIGJlZm9yZSB0aGUKKyAgICAgKiBlbmQgb2YgdGhlIHN0cmluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZG9UZXN0RXh0cmFjdFJhbmdlU3RhcnRUb0JlZm9yZUVuZChzdHJpbmcpIHsKKyAgICAgICAgLy8gaW5jbHVzaXZlCisgICAgICAgIGFzc2VydEVxdWFscygic3RyaW5nWzAuLi0zXSIsICIwMTIzNDU2NyIsIHN0cmluZ1swLi4tM10pOworCisgICAgICAgIC8vIGV4Y2x1c2l2ZQorICAgICAgICBhc3NlcnRFcXVhbHMoInN0cmluZ1swLi48LTNdIiwgIjAxMjM0NTYiLCBzdHJpbmdbMC4uPC0zXSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgZXh0cmFjdGluZyBhIHJhbmdlIHdoaWNoIHN0YXJ0cyBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgc3RyaW5nIGFuZCBlbmRzIGF0IDAuCisgICAgICogRm9yIGFuIGluY2x1c2l2ZSByYW5nZSwgdGhpcyByZXZlcnNlcyB0aGUgc3RyaW5nLiAgRm9yIGFuIGV4Y2x1c2l2ZSByYW5nZSwgdGhpcworICAgICAqIGNvdW50cyBmcm9tIHRoZSBlbmQgdG8gdGhlIGxhc3QgY2hhcmFjdGVyLgorICAgICAqLworICAgIHZvaWQgZG9UZXN0RXh0cmFjdFJhbmdlQmVmb3JlRW5kVG9TdGFydChzdHJpbmcpIHsKKyAgICAgICAgLy8gaW5jbHVzaXZlCisgICAgICAgIGFzc2VydEVxdWFscygic3RyaW5nWy0zLi4wXSIsICI3NjU0MzIxMCIsIHN0cmluZ1stMy4uMF0pOworCisgICAgICAgIC8vIGV4Y2x1c2l2ZQorICAgICAgICBhc3NlcnRFcXVhbHMoInN0cmluZ1stMy4uPDBdIiwgIjc2NTQzMjEiLCBzdHJpbmdbLTMuLjwwXSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbHMgPGNvZGU+ZG9UZXN0RXh0cmFjdFJhbmdlU3RhcnRUb0JlZm9yZUVuZDwvY29kZT4gd2l0aCBhIG5vbi10ZW1wbGF0ZSBzdHJpbmcuCisgICAgICoKKyAgICAgKiBHUk9PVlktNzgxCisgICAgICovCisgICAgdm9pZCBmaXhtZVRlc3RFeHRyYWN0UmFuZ2VTdGFydFRvQmVmb3JlRW5kTGl0ZXJhbCgpIHsKKyAgICAgICAgZGVmIGxpdGVyYWwgPSAiMDEyMzQ1Njc4OSI7CisgICAgICAgIGRvVGVzdEV4dHJhY3RSYW5nZVN0YXJ0VG9CZWZvcmVFbmQobGl0ZXJhbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbHMgPGNvZGU+ZG9UZXN0RXh0cmFjdFJhbmdlU3RhcnRUb0JlZm9yZUVuZDwvY29kZT4gd2l0aCBhIHRlbXBsYXRlIHN0cmluZy4KKyAgICAgKgorICAgICAqIEdST09WWS03ODEKKyAgICAgKi8KKyAgICB2b2lkIGZpeG1lVGVzdEV4dHJhY3RSYW5nZVN0YXJ0VG9CZWZvcmVFbmRUZW1wbGF0ZSgpIHsKKyAgICAgICAgZGVmIGxpdGVyYWwgPSAiMDEyMzQ1Njc4OSI7CisgICAgICAgIGRlZiB0ZW1wbGF0ZSA9ICIke2xpdGVyYWx9IjsKKworICAgICAgICBkb1Rlc3RFeHRyYWN0UmFuZ2VTdGFydFRvQmVmb3JlRW5kKHRlbXBsYXRlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxscyA8Y29kZT5kb1Rlc3RFeHRyYWN0UmFuZ2VCZWZvcmVFbmRUb1N0YXJ0PC9jb2RlPiB3aXRoIGEgbm9uLXRlbXBsYXRlIHN0cmluZy4KKyAgICAgKgorICAgICAqIEdST09WWS03ODEKKyAgICAgKi8KKyAgICB2b2lkIGZpeG1lVGVzdEV4dHJhY3RSYW5nZUJlZm9yZUVuZFRvU3RhcnRMaXRlcmFsKCkgeworICAgICAgICBkZWYgbGl0ZXJhbCA9ICIwMTIzNDU2Nzg5IjsKKyAgICAgICAgZG9UZXN0RXh0cmFjdFJhbmdlQmVmb3JlRW5kVG9TdGFydChsaXRlcmFsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxscyA8Y29kZT5kb1Rlc3RFeHRyYWN0UmFuZ2VCZWZvcmVFbmRUb1N0YXJ0PC9jb2RlPiB3aXRoIGEgdGVtcGxhdGUgc3RyaW5nLgorICAgICAqCisgICAgICogR1JPT1ZZLTc4MQorICAgICAqLworICAgIHZvaWQgZml4bWVUZXN0RXh0cmFjdFJhbmdlQmVmb3JlRW5kVG9TdGFydFRlbXBsYXRlKCkgeworICAgICAgICBkZWYgbGl0ZXJhbCA9ICIwMTIzNDU2Nzg5IjsKKyAgICAgICAgZGVmIHRlbXBsYXRlID0gIiR7bGl0ZXJhbH0iOworCisgICAgICAgIGRvVGVzdEV4dHJhY3RSYW5nZUJlZm9yZUVuZFRvU3RhcnQodGVtcGxhdGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHJlcGxhY2luZyBhIHZhbHVlIGluIGEgc3RyaW5nIHdpdGggYW4gdW5kZWZpbmVkIHZhcmlhYmxlLgorICAgICAqLworICAgIHZvaWQgdGVzdFJlcGxhY2VWYWx1ZVdpdGhVbmRlZmluZWRWYXJpYWJsZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGRlZiBzdHIgPSAicmVwbGFjZSA8JHt1bmRlZmluZWR9PiIKKyAgICAgICAgICAgIGZhaWwoInVuZGVmaW5lZCB2YWx1ZSBub3QgZGV0ZWN0ZWQiKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoTWlzc2luZ1Byb3BlcnR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHJlcGxhY2luZyBhIHZhbHVlIHdpdGggYSBudWxsIGV4cHJlc3Npb24uCisgICAgICovCisgICAgdm9pZCB0ZXN0UmVwbGFjZVZhbHVlV2l0aE51bGxFeHByZXNzaW9uKCkgeworICAgICAgICBkZWYgc3RyID0gInJlcGxhY2UgPCR7bnVsbH0+IjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHN0ciwgJ3JlcGxhY2UgPG51bGw+Jyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgcmVwbGFjaW5nIGEgdmFsdWUgd2l0aCBhIGNvbXBvdW5kIGV4cHJlc3Npb24uCisgICAgICovCisgICAgdm9pZCB0ZXN0UmVwbGFjZVZhbHVlV2l0aENvbXBvdW5kRXhwcmVzc2lvbigpIHsKKyAgICAgICAgZGVmIGkgPSAxLCBqID0gMgorICAgICAgICBkZWYgc3RyID0gInJlcGxhY2UgPCR7aTsgan0+IgorICAgICAgICBhc3NlcnRFcXVhbHMoJ3ZhbHVlIHJlcGxhY2VkJywgJ3JlcGxhY2UgPDI+Jywgc3RyKQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIGluY3JlbWVudGluZyB0aGUgdmFyaWFibGUgYmVpbmcgc3Vic3RpdHV0ZWQgYWZ0ZXIgY3JlYXRpbmcgdGhlIHN0cmluZy4gIFRoaXMKKyAgICAgKiBzaG91bGRuJ3QgaGF2ZSBhbnkgZWZmZWN0IGJlY2F1c2UgdGhlIHN0cmluZyBob2xkcyBhIHJlZmVyZW5jZSB0byB0aGUgb3JpZ2luYWwgdmFsdWUuCisgICAgICovCisgICAgdm9pZCB0ZXN0SW5jcmVtZW50QWZ0ZXJDcmVhdGluZ1N0cmluZygpIHsKKyAgICAgICAgZGVmIGkgPSAxCisgICAgICAgIGRlZiBzdHIgPSAicmVwbGFjZSA8JHtpfT4gPCR7aSAqIDJ9PiIKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZSBvayIsICJyZXBsYWNlIDwxPiA8Mj4iLCBzdHIpCisgICAgICAgIGkrKworICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlIG9rIiwgInJlcGxhY2UgPDE+IDwyPiIsIHN0cikKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBldmFsdWF0aW5nIGEgY2xvc3VyZSBlbWJlZGRlZCBpbiBhIHN0cmluZy4KKyAgICAgKi8KKyAgICB2b2lkIHRlc3RDbG9zdXJlSW5TdHJpbmcoKSB7CisgICAgICAgIGRlZiBpID0gMQorICAgICAgICBkZWYgY2xvc3VyZSA9IHtpfTsKKyAgICAgICAgZGVmIHN0ciA9ICI8JHtjbG9zdXJlKCl9PiIKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCdjbG9zdXJlIHJlcGxhY2VtZW50IG9rJywgJzwxPicsIHN0cikKKworICAgICAgICAvLyB0aGlzIGhhcyBubyBlZmZlY3QgYmVjYXVzZSB0aGUgY2xvc3VyZSBpcyBvbmx5IGV2YWx1YXRlZCBvbmNlIHdoZW4gdGhlIHN0cmluZworICAgICAgICAvLyBpcyBjcmVhdGVkCisgICAgICAgIGkrKworICAgICAgICBhc3NlcnRFcXVhbHMoJ2Nsb3N1cmUgcmVwbGFjZW1lbnQgb2snLCAnPDE+Jywgc3RyKQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIGVtYmVkZGluZyBhIG11dGFibGUgb2JqZWN0IGluIGEgc3RyaW5nLgorICAgICAqLworICAgIHZvaWQgdGVzdEVtYmVkTXV0YWJsZU9iamVjdCgpIHsKKyAgICAgICAgZGVmIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoInZhbHVlIikKKyAgICAgICAgZGVmIHN0cmluZ1ZhbHVlID0gInZhbHVlIjsKKyAgICAgICAgZGVmIHN0ciA9ICJidWZmZXI6IDwke2J1ZmZlcn0+IgorICAgICAgICBhc3NlcnRFcXVhbHMoImJ1ZmZlcjogPHZhbHVlPiIsIHN0cikKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBtb2RpZnlpbmcgYSBzdHJpbmcgZW1iZWRkZWQgaW4gYW5vdGhlciBzdHJpbmcsIHdoaWNoIHNob3VsZCBoYXZlIG5vIGVmZmVjdC4KKyAgICAgKi8KKyAgICB2b2lkIHRlc3RBcHBlbmRUb0VtYmVkZGVkU3RyaW5nVmFsdWUoKSB7CisgICAgICAgIGRlZiBzdHJpbmdWYWx1ZSA9ICJ2YWx1ZSI7CisgICAgICAgIGRlZiBzdHIgPSAic3RyaW5nOiA8JHtzdHJpbmdWYWx1ZX0+IgorICAgICAgICBhc3NlcnRFcXVhbHMoInN0cmluZzogPHZhbHVlPiIsIHN0cikKKworICAgICAgICAvLyB0aGlzIGhhcyBubyBlZmZlY3QgYmVjYXVzZSB0aGUgc3RyaW5nIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHN0cmluZ1ZhbHVlCisgICAgICAgIC8vIGFuZCArPSBmb3Igc3RyaW5ncyBjcmVhdGVzIGEgbmV3IHN0cmluZyBpbnN0ZWFkIG9mIG1vZGlmeWluZyB0aGUgZXhpc3RpbmcgdmFsdWUuCisgICAgICAgIHN0cmluZ1ZhbHVlICs9ICIgbW9yZSIKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzdHJpbmc6IDx2YWx1ZT4iLCBzdHIpCisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgaW5jbHVkaW5nIGEgbWFwIGluIGEgc3RyaW5nCisgICAgICovCisgICAgdm9pZCB0ZXN0TWFwSW5TdHJpbmcoKSB7CisgICAgICAgIGRlZiBtYXAgPSBbImtleSI6IDFdOworICAgICAgICBkZWYgc3RyID0gIm1hcC5rZXk6IDwke21hcC5rZXl9PjsgbWFwOiA8JHttYXB9PiI7CisgICAgICAgIGFzc2VydEVxdWFscygibWFwIHJlcGxhY2VtZW50IG9rIiwgJ21hcC5rZXk6IDwxPjsgbWFwOiA8WyJrZXkiOjFdPicsIHN0cikKKyAgICAgICAgbWFwLmtleSsrOworCisgICAgICAgIC8vIFRoZSBtYXAgc2hvd3MgdGhlIGVmZmVjdHMgb2YgdGhlIGNoYW5nZSBiZWNhdXNlIHRoZSBzdHJpbmcgaG9sZHMgYSByZWZlcmVuY2UKKyAgICAgICAgLy8gdG8gdGhlIG11dGFibGUgbWFwLiAgbWFwLmtleSBkb2Vzbid0IHNob3cgdGhlIGVmZmVjdCBvZiB0aGUgY2hhbmdlIGJlY2F1c2UKKyAgICAgICAgLy8gaW4gdGhpcyBzbG90IHRoZSBzdHJpbmcgaG9sZHMgYSByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsIHZhbHVlIGFuZAorICAgICAgICAvLyBtYXAua2VwKysgY3JlYXRlZCBhIG5ldyB2YWx1ZSB3aGljaCB3YXMgc3RvcmVkIGluIHRoZSBtYXAuCisgICAgICAgIGFzc2VydEVxdWFscygibWFwIHJlcGxhY2VtZW50IG9rIiwgJ21hcC5rZXk6IDwxPjsgbWFwOiA8WyJrZXkiOjJdPicsIHN0cikKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBpbmNsdWRpbmcgYSBzdHJpbmcgaW4gaXRzZWxmIHJlY3Vyc2l2ZWx5LgorICAgICAqLworICAgIHZvaWQgdGVzdFJlY3Vyc2l2ZVJlcGxhY2VtZW50KCkgeworICAgICAgICBkZWYgc3RyID0gIjEiOworICAgICAgICBzdHIgPSAiPCR7c3RyfT4iOworICAgICAgICBhc3NlcnRFcXVhbHMoInJlY3Vyc2l2ZSBzdHJpbmcgcmVwbGFjZWQiLCAnPDE+Jywgc3RyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWb2lkIG1ldGhvZAorICAgICAqLworICAgIHZvaWQgZG9Ob3RoaW5nKCkKKyAgICB7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgcmVwbGFjaW5nIGEgdmFsdWUgd2l0aCBhIHZvaWQgc3RhdGVtZW50LgorICAgICAqLworICAgIHZvaWQgdGVzdFJlcGxhY2VWYWx1ZVdpdGhWb2lkU3RhdGVtZW50KCkgeworICAgICAgICBkZWYgc3RyID0gInJlcGxhY2UgPCR7ZG9Ob3RoaW5nKCl9PiIKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCd2YWx1ZSByZXBsYWNlZCcsICdyZXBsYWNlIDxudWxsPicsIHN0cikKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyByZXBsYWNpbmcgYSB2YWx1ZSB3aXRoIGFuIGVtcHR5IHN0YXRlbWVudC4KKyAgICAgKi8KKyAgICB2b2lkIHRlc3RSZXBsYWNlVmFsdWVXaXRoRW1wdHlTdGF0ZW1lbnQoKSB7CisgICAgICAgIGRlZiBzdHIgPSAicmVwbGFjZSA8JHs7fT4iCisgICAgICAgIGFzc2VydEVxdWFscygndmFsdWUgcmVwbGFjZWQnLCAncmVwbGFjZSA8bnVsbD4nLCBzdHIpCisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgcmVwbGFjaW5nIGEgdmFsdWUgd2l0aCBhbiBlbXB0eSBleHByZXNzaW9uLgorICAgICAqLworICAgIHZvaWQgdGVzdFJlcGxhY2VWYWx1ZVdpdGhFbXB0eUV4cHJlc3Npb24oKSB7CisgICAgICAgIGFzc2VydEVxdWFscygncmVwbGFjZSA8bnVsbD4nLCAicmVwbGFjZSA8JHt9PiIpCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9HZW5lcmF0b3JUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvR2VuZXJhdG9yVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEzNWU2MQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvR2VuZXJhdG9yVGVzdC5ncm9vdnkKQEAgLTAsMCArMSw1MCBAQAorcGFja2FnZSBncm9vdnkKKworY2xhc3MgR2VuZXJhdG9yVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIHZvaWQgdGVzdEdlbmVyYXRvcigpIHsKKyAgICAgICAgZGVmIHggPSB0aGlzLiZzYW1wbGVHZW5lcmF0b3IKKyAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIng6ICIgKyB4KQorCQkKKyAgICAgICAgZGVmIHJlc3VsdCA9ICcnCisgICAgICAgIGZvciAoaSBpbiB4KSB7CisgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBpCisgICAgICAgIH0KKwkgICAgCisgICAgICAgIGFzc2VydCByZXN1bHQgPT0gIkFCQyIKKyAgICB9CisKKyAgICB2b2lkIHRlc3RGaW5kQWxsKCkgeworICAgICAgICBkZWYgeCA9IHRoaXMuJnNhbXBsZUdlbmVyYXRvcgorIAkgICAgCisgICAgICAgIGRlZiB2YWx1ZSA9IHguZmluZEFsbCB7IGl0ZW0gLT4gcmV0dXJuIGl0ZW0gPT0gIkMiIH0KKyAgICAgICAgYXNzZXJ0IHZhbHVlID09IFsiQyJdCisKKyAgICAgICAgdmFsdWUgPSB4LmZpbmRBbGwgeyBpdGVtIC0+IHJldHVybiBpdGVtICE9ICJCIiB9CisgICAgICAgIGFzc2VydCB2YWx1ZSA9PSBbIkEiLCAiQyJdCisgICAgfQorICAgIAorCQorICAgIHZvaWQgdGVzdEVhY2goKSB7CisgICAgICAgIGRlZiB4ID0gdGhpcy4mc2FtcGxlR2VuZXJhdG9yCisgCSAgICAKKyAgICAgICAgZGVmIHZhbHVlID0geC5lYWNoIHsgcHJpbnRsbihpdCkgfQorICAgIH0KKyAgICAKKwkKKyAgICB2b2lkIHRlc3RNaXNzaW5nVGhpc0J1ZygpIHsKKyAgICAgICAgZGVmIHJlc3VsdCA9ICcnCisgICAgICAgIGZvciAoaSBpbiB0aGlzLiZzYW1wbGVHZW5lcmF0b3IpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIGkKKyAgICAgICAgfQorCSAgICAKKyAgICAgICAgYXNzZXJ0IHJlc3VsdCA9PSAiQUJDIgorICAgIH0KKwkKKyAgICB2b2lkIHNhbXBsZUdlbmVyYXRvcihjbG9zdXJlKSB7CisgICAgICAgIC8vIGtpbmRhIGxpa2UgeWllbGQgc3RhdGVtZW50cworICAgICAgICBjbG9zdXJlLmNhbGwoIkEiKQorICAgICAgICBjbG9zdXJlLmNhbGwoIkIiKQorICAgICAgICBjbG9zdXJlLmNhbGwoIkMiKQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvR2xvYmFsUHJpbnRsblRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9HbG9iYWxQcmludGxuVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMyZTRhNgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvR2xvYmFsUHJpbnRsblRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTMgQEAKK3BhY2thZ2UgZ3Jvb3Z5CisKK2NsYXNzIEdsb2JhbFByaW50bG5UZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCB0ZXN0R2xvYmFsUHJpbnRsbigpIHsKKyAgICAgICAgcHJpbnRsbigiSGVsbG8gV29ybGQhIikKKwl9CisKKyAgICB2b2lkIHRlc3RHbG9iYWxQcmludCgpIHsKKyAgICAgICAgcHJpbnQoIkhlbGxvICIpCisgICAgICAgIHByaW50bG4oIldvcmxkISIpCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvR3Jvb3Z5Q2xvc3VyZU1ldGhvZHNUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvR3Jvb3Z5Q2xvc3VyZU1ldGhvZHNUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTAyMTNlCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9Hcm9vdnlDbG9zdXJlTWV0aG9kc1Rlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTcyIEBACitwYWNrYWdlIGdyb292eQorCisvKioKKyAqIFRlc3QgY2FzZSBmb3IgdGhlIGVhY2hPYmplY3QgbWV0aG9kIG9uIGEgZmlsZSBjb250YWluaW5nCisgKiB6ZXJvLCBvbmUgb3IgbW9yZSBvYmplY3RzIChvYmplY3Qgc3RyZWFtKS4gIEFsc28gdGVzdCBjYXNlcworICogZm9yIGVhY2hEaXIsIGVhY2hGaWxlTWF0Y2ggYW5kIHJ1bkFmdGVyIG1ldGhvZHMuCisgKgorICogQGF1dGhvciBIZWluIE1lbGluZworICovCitjbGFzcyBHcm9vdnlDbG9zdXJlTWV0aG9kc1Rlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICBwcml2YXRlIFN0cmluZyBkaXJuYW1lX3RhcmdldCA9ICJ0YXJnZXQiCisgICAgcHJpdmF0ZSBTdHJpbmcgZGlybmFtZV9zb3VyY2UgPSAic3JjL3Rlc3QvZ3Jvb3Z5IgorCisgICAgcHJpdmF0ZSBTdHJpbmcgZmlsZW5hbWUgPSAiJHtkaXJuYW1lX3RhcmdldH0vR3Jvb3Z5Q2xvc3VyZU1ldGhvZHNUZXN0LmVhY2gub2JqZWN0IgorCisgICAgdm9pZCB0ZXN0RWFjaE9iamVjdE1hbnkoKSB7CisgICAgICAgIGRlZiBmaWxlID0gbmV3IEZpbGUoZmlsZW5hbWUpCisgICAgICAgIGRlZiBvb3MgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpKQorICAgICAgICBkZWYgbGlzdCA9IFsxLCAyLCAzLCAiZm9vIiwgOSwgImJhciIsIDE5MSwgZmlsZSwgOTEyOV0KKyAgICAgICAgbGlzdC5lYWNoIHsKKyAgICAgICAgICAgIG9vcy53cml0ZU9iamVjdChpdCkKKyAgICAgICAgfQorCisgICAgICAgIHByaW50bG4oIkNvbnRlbnRzIG9mIGZpbGUgd2l0aCBtdWx0aXBsZSBvYmplY3RzOiAiICsgZmlsZSkKKyAgICAgICAgaW50IGMgPSAwCisgICAgICAgIGZpbGUuZWFjaE9iamVjdCB7CisgICAgICAgICAgICBwcmludCAiJHtpdH0gIgorICAgICAgICAgICAgYysrCisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0IGxpc3Quc2l6ZSgpID09IGMKKyAgICAgICAgcHJpbnRsbiAiIgorICAgICAgICAvL2Vuc3VyZSB0byByZW1vdmUgdGhlIGNyZWF0ZWQgZmlsZQorICAgICAgICBmaWxlLmRlbGV0ZSgpCisgICAgfQorCisgICAgdm9pZCB0ZXN0RWFjaE9iamVjdE9uZSgpIHsKKyAgICAgICAgZGVmIGZpbGUgPSBuZXcgRmlsZShmaWxlbmFtZSkKKyAgICAgICAgZGVmIG9vcyA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSkpCisgICAgICAgIG9vcy53cml0ZU9iamVjdChmaWxlKQorCisgICAgICAgIHByaW50bG4oIkNvbnRlbnRzIG9mIGZpbGUgd2l0aCBvbmUgb2JqZWN0OiAiICsgZmlsZSkKKyAgICAgICAgaW50IGMgPSAwCisgICAgICAgIGZpbGUuZWFjaE9iamVjdCB7CisgICAgICAgICAgICBwcmludCAiJHtpdH0gIgorICAgICAgICAgICAgYysrCisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0IGMgPT0gMQorICAgICAgICBwcmludGxuICIiCisgICAgICAgIC8vZW5zdXJlIHRvIHJlbW92ZSB0aGUgY3JlYXRlZCBmaWxlCisgICAgICAgIGZpbGUuZGVsZXRlKCkKKyAgICB9CisKKyAgICB2b2lkIHRlc3RFYWNoT2JqZWN0RW1wdHlGaWxlKCkgeworICAgICAgICBkZWYgZmlsZSA9IG5ldyBGaWxlKGZpbGVuYW1lKQorICAgICAgICBkZWYgb29zID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKSkKKworICAgICAgICBwcmludGxuKCJDb250ZW50cyBvZiBlbXB0eSBmaWxlOiAiICsgZmlsZSkKKyAgICAgICAgaW50IGMgPSAwCisgICAgICAgIGZpbGUuZWFjaE9iamVjdCB7CisgICAgICAgICAgICBwcmludCAiJHtpdH0gIgorICAgICAgICAgICAgYysrCisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0IGMgPT0gMAorICAgICAgICBwcmludGxuICIiCisgICAgICAgIC8vZW5zdXJlIHRvIHJlbW92ZSB0aGUgY3JlYXRlZCBmaWxlCisgICAgICAgIGZpbGUuZGVsZXRlKCkKKyAgICB9CisKKyAgICB2b2lkIHRlc3RFYWNoT2JqZWN0TnVsbEZpbGUoKSB7CisgICAgICAgIGRlZiBmaWxlID0gbmV3IEZpbGUoZmlsZW5hbWUpCisgICAgICAgIGRlZiBvb3MgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpKQorICAgICAgICBvb3Mud3JpdGVPYmplY3QobnVsbCkKKyAgICAgICAgb29zLndyaXRlT2JqZWN0KCJmb28iKQorICAgICAgICBvb3Mud3JpdGVPYmplY3QobnVsbCkKKworICAgICAgICBwcmludGxuKCJDb250ZW50cyBvZiBudWxsIGZpbGU6ICIgKyBmaWxlKQorICAgICAgICBpbnQgYyA9IDAKKyAgICAgICAgZmlsZS5lYWNoT2JqZWN0IHsKKyAgICAgICAgICAgIHByaW50ICIke2l0fSAiCisgICAgICAgICAgICBjKysKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQgYyA9PSAzCisgICAgICAgIHByaW50bG4gIiIKKyAgICAgICAgLy9lbnN1cmUgdG8gcmVtb3ZlIHRoZSBjcmVhdGVkIGZpbGUKKyAgICAgICAgZmlsZS5kZWxldGUoKQorICAgIH0KKworICAgIHZvaWQgdGVzdEVhY2hEaXIoKSB7CisgICAgICAgIGRlZiBkaXIgPSBuZXcgRmlsZShkaXJuYW1lX3NvdXJjZSkKKworICAgICAgICBwcmludGxuKCJEaXJlY3RvcmllcyBpbjogIiArIGRpcikKKyAgICAgICAgaW50IGMgPSAwCisgICAgICAgIGRpci5lYWNoRGlyIHsKKyAgICAgICAgICAgIHByaW50ICIke2l0fSAiCisgICAgICAgICAgICBjKysKKyAgICAgICAgfQorICAgICAgICBwcmludGxuICIiCisgICAgICAgIGFzc2VydCBjID4gMAorICAgIH0KKworICAgIHZvaWQgdGVzdEVhY2hGaWxlTWF0Y2goKSB7CisgICAgICAgIGRlZiBmaWxlID0gbmV3IEZpbGUoZGlybmFtZV9zb3VyY2UpCisKKyAgICAgICAgcHJpbnQgIkZpbGVzIHdpdGggdGhlIHRleHQgR3Jvb3Z5OiAiCisgICAgICAgIGZpbGUuZWFjaEZpbGVNYXRjaCh+Il5Hcm9vdnkuKiIpIHsKKyAgICAgICAgICAgIHByaW50ICIke2l0fSAiCisgICAgICAgIH0KKyAgICAgICAgcHJpbnRsbiAiIgorCisgICAgICAgIHByaW50ICJGaWxlcyB3aXRoIHRoZSB0ZXh0IENsb3N1cmU6ICIKKyAgICAgICAgZmlsZS5lYWNoRmlsZU1hdGNoKH4iXkNsb3N1cmUuKiIpIHsKKyAgICAgICAgICAgIHByaW50ICIke2l0fSAiCisgICAgICAgIH0KKyAgICAgICAgcHJpbnRsbiAiIgorCisgICAgICAgIHByaW50ICJUaGlzIGZpbGUgaXMgaGVyZTogIgorICAgICAgICBpbnQgYyA9IDAKKyAgICAgICAgZmlsZS5lYWNoRmlsZU1hdGNoKH4iXkdyb292eUNsb3N1cmVNZXRob2RzVGVzdC5ncm9vdnkiKSB7CisgICAgICAgICAgICBwcmludCAiJHtpdH0gIgorICAgICAgICAgICAgYysrCisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0IGMgPT0gMQorICAgICAgICBwcmludGxuICIiCisgICAgfQorCisgICAgdm9pZCB0ZXN0RWFjaEZpbGVPbk5vbkV4aXN0aW5nRGlyKCkgeworICAgICAgICBzaG91bGRGYWlsIHsKKyAgICAgICAgICAgIEZpbGUgZGlyID0gbmV3IEZpbGUoIlNvbWVOb25FeGlzdGluZ0RpciIpCisgICAgICAgICAgICBkaXIuZWFjaEZpbGUgeworICAgICAgICAgICAgICAgIHByaW50bG4gIiR7aXR9ICIKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgdGVzdEVhY2hGaWxlT25Ob25EaXJGaWxlKCkgeworICAgICAgICBzaG91bGRGYWlsIHsKKyAgICAgICAgICAgIEZpbGUgZGlyID0gbmV3IEZpbGUoIiR7ZGlybmFtZV9zb3VyY2V9L0dyb292eUNsb3N1cmVNZXRob2RzVGVzdC5ncm9vdnkiKQorICAgICAgICAgICAgZGlyLmVhY2hGaWxlIHsKKyAgICAgICAgICAgICAgICBwcmludGxuICIke2l0fSAiCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHRlc3RSdW5BZnRlcigpIHsKKyAgICAgICAgZGVmIHRpbWVyID0gbmV3IFRpbWVyKCkKKyAgICAgICAgYm9vbGVhbiBzdGF0dXMgPSBmYWxzZQorICAgICAgICB0aW1lci5ydW5BZnRlcigyMDAwKSB7CisgICAgICAgICAgICBwcmludGxuICJSdW5uaW5nIGFmdGVyIDIgc2Vjb25kcyB3YWl0IgorICAgICAgICAgICAgc3RhdHVzID0gdHJ1ZQorICAgICAgICB9CisgICAgICAgIHByaW50bG4gIkkgc2hvdWxkIHJ1biBmaXJzdCIKKyAgICAgICAgYXNzZXJ0IHN0YXR1cyA9PSBmYWxzZQorICAgICAgICBUaHJlYWQuc2xlZXAoMzAwMCkKKyAgICAgICAgcHJpbnRsbiAiSSBzaG91bGQgcnVuIGxhc3QiCisgICAgICAgIGFzc2VydCBzdGF0dXMgPT0gdHJ1ZQorICAgIH0KKworICAgIHZvaWQgdGVzdFNwbGl0RWFjaExpbmUoKSB7CisgICAgICAgIFN0cmluZyBzID0gIiIiQSBCIEMgRAorRSBGIEcgSAorMSAyIDMgNAorIiIiCisgICAgICAgIFJlYWRlciByZWFkZXIgPSBuZXcgU3RyaW5nUmVhZGVyKHMpCisgICAgICAgIGRlZiBhbGxfbGluZXMgPSBbXQorICAgICAgICByZWFkZXIuc3BsaXRFYWNoTGluZSgiICIpIHsgbGlzdCAtPgorICAgICAgICAgICAgYWxsX2xpbmVzIDw8IGxpc3QKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQgYWxsX2xpbmVzID09IFtbIkEiLCAiQiIsICJDIiwgIkQiXSwgWyJFIiwgIkYiLCAiRyIsICJIIl0sIFsiMSIsICIyIiwgIjMiLCAiNCJdXQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9Hcm9vdnlJbnRlcmNlcHRhYmxlVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0dyb292eUludGVyY2VwdGFibGVUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTZjYTZjCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9Hcm9vdnlJbnRlcmNlcHRhYmxlVGVzdC5ncm9vdnkKQEAgLTAsMCArMSw0MCBAQAorcGFja2FnZSBncm9vdnkKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5SZWZsZWN0aW9uTWV0aG9kSW52b2tlcgorCitjbGFzcyBHcm9vdnlJbnRlcmNlcHRhYmxlVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIHZvaWQgdGVzdE1ldGhvZEludGVyY2VwdGlvbigpIHsKKyAgICAgICAgZGVmIGcgPSBuZXcgR0koKQorICAgICAgICBhc3NlcnQgZy5zb21lSW50KCkgPT0gMjgwNgorICAgICAgICBhc3NlcnQgZy5zb21lVW5leGlzdGluZ01ldGhvZCgpID09IDEKKyAgICAgICAgYXNzZXJ0IGcudG9TdHJpbmcoKSA9PSAiaW52b2tlTWV0aG9kVG9TdHJpbmciCisgICAgfQorCisgICAgdm9pZCB0ZXN0UHJvcGVydGllcygpIHsKKyAgICAgICAgZGVmIGcgPSBuZXcgR0koKQorICAgICAgICBhc3NlcnQgZy5mb28gPT0gODkKKyAgICAgICAgZy5mb28gPSA5MAorICAgICAgICBhc3NlcnQgZy5mb28gPT0gOTAKKyAgICAgICAgLy8gc2hvdWxkIHRoaXMgYmUgMSBvciA5MD8KKyAgICAgICAgYXNzZXJ0IGcuZ2V0Rm9vKCkgPT0gMQorICAgIH0KK30KKworY2xhc3MgR0kgaW1wbGVtZW50cyBHcm9vdnlJbnRlcmNlcHRhYmxlIHsKKworICAgIGRlZiBmb28gPSA4OQorCisgICAgaW50IHNvbWVJbnQoKSB7IDI4MDYgfQorICAgIFN0cmluZyB0b1N0cmluZygpIHsgIm9yaWdpbmFsVG9TdHJpbmciIH0KKworICAgIE9iamVjdCBpbnZva2VNZXRob2QoU3RyaW5nIG5hbWUsIE9iamVjdCBhcmdzKSB7CisgICAgICAgIGlmICgidG9TdHJpbmciID09IG5hbWUpCisgICAgICAgICAgICByZXR1cm4gImludm9rZU1ldGhvZFRvU3RyaW5nIgorICAgICAgICBlbHNlIGlmICgic29tZUludCIgPT0gbmFtZSkKKyAgICAgICAgICAgIHJldHVybiBSZWZsZWN0aW9uTWV0aG9kSW52b2tlci5pbnZva2UodGhpcywgbmFtZSwgYXJncykKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIDEKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvR3Jvb3Z5TWV0aG9kc1Rlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9Hcm9vdnlNZXRob2RzVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkxNjgzMwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvR3Jvb3Z5TWV0aG9kc1Rlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsNDY1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgZ3Jvb3Z5CisKK2ltcG9ydCBqYXZhLmF3dC5EaW1lbnNpb24KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUudHlwZWhhbmRsaW5nLkdyb292eUNhc3RFeGNlcHRpb24KKworLyoqIAorICogVGVzdHMgdGhlIHZhcmlvdXMgbmV3IEdyb292eSBtZXRob2RzCisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAYXV0aG9yIEd1aWxsYXVtZSBMYWZvcmdlCisgKiBAYXV0aG9yIERpZXJrIEtvZW5pZworICogQGF1dGhvciBQYXVsIEtpbmcKKyAqIEBhdXRob3IgSm9hY2hpbSBCYXVtYW5uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK2NsYXNzIEdyb292eU1ldGhvZHNUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworICAgIHZvaWQgdGVzdENvbGxlY3QoKSB7CisgICAgICAgIGFzc2VydCBbMiwgNCwgNl0uY29sbGVjdCB7aXQgKiAyfSA9PSBbNCwgOCwgMTJdCisgICAgICAgIGRlZiBhbnN3ZXIgPSBbMiwgNCwgNl0uY29sbGVjdChuZXcgVmVjdG9yKCkpIHtpdCAqIDJ9CisgICAgICAgIGFzc2VydCBhbnN3ZXJbMF0gPT0gNAorICAgICAgICBhc3NlcnQgYW5zd2VyWzFdID09IDgKKyAgICAgICAgYXNzZXJ0IGFuc3dlclsyXSA9PSAxMgorICAgICAgICBhc3NlcnQgWzE6ICdhJywgMjogJ2InLCAzOiAnYyddLmNvbGxlY3Qge2ssIHYgLT4gayArIHZ9ID09IFsnMWEnLCAnMmInLCAnM2MnXQorICAgICAgICBhc3NlcnQgWzE6ICdhJywgMjogJ2InLCAzOiAnYyddLmNvbGxlY3Qge2l0LmdldEtleSgpICsgIioiICsgaXQuZ2V0VmFsdWUoKX0gPT0gWycxKmEnLCAnMipiJywgJzMqYyddCisgICAgfQorCisgICAgdm9pZCB0ZXN0QXNDb2VyY2lvbigpIHsKKyAgICAgICAgZGVmIGQwID0gbmV3IERpbWVuc2lvbigxMDAsIDIwMCkKKyAgICAgICAgYXNzZXJ0IGQwID09IG5ldyBEaW1lbnNpb24od2lkdGg6IDEwMCwgaGVpZ2h0OiAyMDApCisgICAgICAgIGFzc2VydCBkMCA9PSBbMTAwLCAyMDBdIGFzIERpbWVuc2lvbgorICAgICAgICBhc3NlcnQgZDAgPT0gW3dpZHRoOiAxMDAsIGhlaWdodDogMjAwXSBhcyBEaW1lbnNpb24KKyAgICB9CisKKyAgICB2b2lkIHRlc3RDb21iaW5hdGlvbnMoKSB7CisgICAgICAgIGRlZiBsaXN0cyA9IFtbJ2EnLCAnYiddLCBbMSwgMiwgM11dCisgICAgICAgIGFzc2VydCBsaXN0cy5jb21iaW5hdGlvbnMoKSBhcyBTZXQgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtbJ2EnLCAxXSwgWydhJywgMl0sIFsnYScsIDNdLAorICAgICAgICAgICAgICAgICAgICAgICAgWydiJywgMV0sIFsnYicsIDJdLCBbJ2InLCAzXV0gYXMgU2V0CisgICAgfQorCisgICAgdm9pZCB0ZXN0VHJhbnNwb3NlKCkgeworICAgICAgICBkZWYgbGlzdHMgPSBbWydhJywgJ2InXSwgWzEsIDIsIDNdXQorICAgICAgICBhc3NlcnQgbGlzdHMudHJhbnNwb3NlKCkgPT0gW1snYScsIDFdLCBbJ2InLCAyXV0KKyAgICB9CisKKyAgICB2b2lkIHRlc3RTdW0oKSB7CisgICAgICAgIGFzc2VydCBbXS5zdW0oKSA9PSBudWxsCisgICAgICAgIGFzc2VydCBbbnVsbF0uc3VtKCkgPT0gbnVsbAorICAgICAgICBhc3NlcnQgWzFdLnN1bSgpID09IDEKKyAgICAgICAgYXNzZXJ0IFsxLCAyLCAzXS5zdW0oKSA9PSA2CisgICAgICAgIGFzc2VydCBbMSwgMiwgM10uc3VtKCIiKSA9PSAiMTIzIgorICAgICAgICBhc3NlcnQgW1sxLCAyXSwgWzMsIDRdLCBbNSwgNl1dLnN1bSgpID09IFsxLCAyLCAzLCA0LCA1LCA2XQorICAgICAgICBhc3NlcnQgW1sxLCAyXSwgWzMsIDRdLCBbNSwgNl1dLnN1bSgiIikgPT0gIlsxLCAyXVszLCA0XVs1LCA2XSIKKworICAgICAgICBhc3NlcnQgW10uc3VtIHtpdC5sZW5ndGgoKX0gPT0gbnVsbAorICAgICAgICBhc3NlcnQgW251bGxdLnN1bSB7aXQudG9TdHJpbmcoKX0gPT0gJ251bGwnCisgICAgICAgIGFzc2VydCBbImFiYyJdLnN1bSB7aXQubGVuZ3RoKCl9ID09IDMKKyAgICAgICAgYXNzZXJ0IFsiYSIsICJiYyIsICJkZWYiXS5zdW0ge2l0Lmxlbmd0aCgpfSA9PSA2CisgICAgICAgIGFzc2VydCBbImEiLCAiYmMiLCAiZGVmIl0uc3VtKCIiKSB7aXQubGVuZ3RoKCl9ID09ICIxMjMiCisgICAgICAgIGFzc2VydCBbWzEsIDJdLCBbMywgNF0sIFs1LCA2XV0uc3VtIHtpdC5zaXplKCl9ID09IDYKKyAgICAgICAgYXNzZXJ0IFtbMSwgMl0sIFszLCA0XSwgWzUsIDZdXS5zdW0ge2xpc3QgLT4gbGlzdC5jb2xsZWN0IHtpdCAqIDJ9fSA9PSBbMiwgNCwgNiwgOCwgMTAsIDEyXQorICAgICAgICBkZWYgcmVzdWx0ID0gW10KKyAgICAgICAgW1sxLCAyXSwgWzMsIDRdLCBbNSwgNl1dLmVhY2gge2xpc3QgLT4gcmVzdWx0IDw8IGxpc3QuY29sbGVjdCB7aXQgKiAyfX0KKyAgICAgICAgYXNzZXJ0IHJlc3VsdC5zdW0oKSA9PSBbMiwgNCwgNiwgOCwgMTAsIDEyXQorICAgICAgICBhc3NlcnQgW1sxLCAyXSwgWzMsIDRdLCBbNSwgNl1dLnN1bSB7bGlzdCAtPiBsaXN0LmNvbGxlY3Qge2l0ICogMn19ID09IFsyLCA0LCA2LCA4LCAxMCwgMTJdCisgICAgfQorCisgICAgdm9pZCB0ZXN0Sm9pbigpIHsKKyAgICAgICAgYXNzZXJ0IFsyLCA0LCA2XS5qb2luKCItIikgPT0gIjItNC02IgorICAgICAgICBhc3NlcnQgWyJlZGFtIiwgImNoZWRkYXIiLCAiYnJpZSJdLmpvaW4oIiwgIikgPT0gJ2VkYW0sIGNoZWRkYXIsIGJyaWUnCisgICAgICAgIGFzc2VydCBbImFiYyIsIDUsIDIuMzRdLmpvaW4oIiwgIikgPT0gImFiYywgNSwgMi4zNCIKKyAgICB9CisKKyAgICB2b2lkIHRlc3RUaW1lcygpIHsKKyAgICAgICAgZGVmIGNvdW50ID0gMAorICAgICAgICA1LnRpbWVzIHtpIC0+IGNvdW50ID0gY291bnQgKyBpfQorICAgICAgICBhc3NlcnQgY291bnQgPT0gMTAKKyAgICAgICAgY291bnQgPSAwCisgICAgICAgIGRlZiB0ZW1wID0gNQorICAgICAgICB0ZW1wLnRpbWVzIHtpIC0+IGNvdW50ID0gY291bnQgKyBpfQorICAgICAgICBhc3NlcnQgY291bnQgPT0gMTAKKyAgICB9CisKKyAgICB2b2lkIHRlc3RBcnJheVN1YnNjcmlwdCgpIHsKKyAgICAgICAgZGVmIGxpc3QgPSBbMSwgMiwgMywgNF0KKyAgICAgICAgZGVmIGFycmF5ID0gbGlzdC50b0FycmF5KCkKKyAgICAgICAgZGVmIHZhbHVlID0gYXJyYXlbMl0KKyAgICAgICAgYXNzZXJ0IHZhbHVlID09IDMKKyAgICAgICAgYXJyYXlbMF0gPSA5CisgICAgICAgIGFzc2VydCBhcnJheVswXSA9PSA5CisgICAgICAgIGFzc2VydCBhcnJheVswLi48MF0gPT0gW10KKyAgICB9CisKKyAgICB2b2lkIHRlc3RUb0NoYXJhY3Rlck1ldGhvZCgpIHsKKyAgICAgICAgZGVmIHMgPSAnYycKKyAgICAgICAgZGVmIHggPSBzLnRvQ2hhcmFjdGVyKCkKKyAgICAgICAgYXNzZXJ0IHggaW5zdGFuY2VvZiBDaGFyYWN0ZXIKKyAgICB9CisKKyAgICB2b2lkIHRlc3RQdXRBdFJhbmdlKCkgeworICAgICAgICBkZWYgbGlzdAorICAgICAgICBsaXN0ID0gWydhJywgJ2InLCAnYyddOyBsaXN0WzRdID0gJ3gnOyBhc3NlcnQgbGlzdCA9PSBbImEiLCAiYiIsICJjIiwgbnVsbCwgIngiXQorICAgICAgICBsaXN0ID0gWydhJywgJ2InLCAnYyddOyBsaXN0WzEuLjJdID0gWyd4JywgJ3knXTsgYXNzZXJ0IGxpc3QgPT0gWyJhIiwgIngiLCAieSJdCisgICAgICAgIGxpc3QgPSBbJ2EnLCAnYicsICdjJ107IGxpc3RbMS4uMl0gPSAneCc7IGFzc2VydCBsaXN0ID09IFsiYSIsICJ4Il0KKyAgICAgICAgbGlzdCA9IFsnYScsICdiJywgJ2MnXTsgbGlzdFs0Li41XSA9IFsneCcsICd5J107IGFzc2VydCBsaXN0ID09IFsiYSIsICJiIiwgImMiLCBudWxsLCAieCIsICJ5Il0KKyAgICAgICAgbGlzdCA9IFsnYScsICdiJywgJ2MnXTsgbGlzdFs0Li41XSA9ICd4JzsgYXNzZXJ0IGxpc3QgPT0gWyJhIiwgImIiLCAiYyIsIG51bGwsICJ4Il0KKyAgICB9CisKKyAgICB2b2lkIHRlc3RHZXRBdFJhbmdlKCkgeworICAgICAgICBkZWYgbGlzdCA9IFsnYScsICdiJywgJ2MnXQorICAgICAgICBhc3NlcnQgbGlzdFsxLi4yXSA9PSBbJ2InLCAnYyddCisgICAgICAgIGFzc2VydCBsaXN0WzAuLjwwXSA9PSBbXQorICAgIH0KKworICAgIHZvaWQgdGVzdENoYXJTZXF1ZW5jZUdldEF0KCkgeworICAgICAgICBkZWYgeCA9ICJtYXRyaXgiCisgICAgICAgIGFzc2VydCB4WzAsIDUuLjBdID09ICdteGlydGFtJworICAgICAgICBhc3NlcnQgeFszLi4wLCAwLi4zXSA9PSAncnRhbW1hdHInCisgICAgICAgIGFzc2VydCB4WzIuLi00LCAzLi4tNCwgMy4uLTNdID09ICd0cnRyJworICAgICAgICBhc3NlcnQgeFstMS4uLTMsIC0zLi4tMV0gPT0gJ3hpcnJpeCcKKyAgICAgICAgYXNzZXJ0IHhbMC4uPDBdID09ICcnCisgICAgfQorCisgICAgdm9pZCB0ZXN0TGlzdEdyZXAoKSB7CisgICAgICAgIGRlZiBsaXN0ID0gWyJKYW1lcyIsICJCb2IiLCAiR3VpbGxhdW1lIiwgIlNhbSJdCisgICAgICAgIGRlZiBhbnN3ZXIgPSBsaXN0LmdyZXAofiIuKmEuKiIpCisgICAgICAgIGFzc2VydCBhbnN3ZXIgPT0gWyJKYW1lcyIsICJHdWlsbGF1bWUiLCAiU2FtIl0KKyAgICAgICAgYW5zd2VyID0gbGlzdC5ncmVwKH4iQi5iIikKKyAgICAgICAgYXNzZXJ0IGFuc3dlciA9PSBbIkJvYiJdCisgICAgfQorCisgICAgdm9pZCB0ZXN0Q29sbGVjdGlvblRvTGlzdCgpIHsKKyAgICAgICAgZGVmIGMgPSBbMSwgMiwgMywgNCwgNV0gLy8gYnV0IGl0J3MgYSBsaXN0CisgICAgICAgIGRlZiBsID0gYy50b0xpc3QoKQorICAgICAgICBhc3NlcnQgbC5jb250YWluc0FsbChjKQorICAgICAgICBhc3NlcnQgYy5zaXplKCkgPT0gbC5zaXplKCkKKyAgICB9CisKKyAgICB2b2lkIHRlc3RJdGVyYXRvclRvTGlzdCgpIHsKKyAgICAgICAgZGVmIGMgPSBbMSwgMiwgMywgNCwgNV0KKyAgICAgICAgZGVmIGwgPSBjLml0ZXJhdG9yKCkudG9MaXN0KCkKKyAgICAgICAgYXNzZXJ0IGwuY29udGFpbnNBbGwoYykKKyAgICAgICAgYXNzZXJ0IGMuc2l6ZSgpID09IGwuc2l6ZSgpCisgICAgfQorCisgICAgdm9pZCB0ZXN0RW51bWVyYXRpb25Ub0xpc3QoKSB7CisgICAgICAgIGRlZiBjID0gWzEsIDIsIDMsIDQsIDVdCisgICAgICAgIGRlZiB2ID0gbmV3IFZlY3RvcigpCisgICAgICAgIGMuZWFjaCB7CisgICAgICAgICAgICB2LmFkZChpdCkKKyAgICAgICAgfQorICAgICAgICBkZWYgbCA9IHYuZWxlbWVudHMoKS50b0xpc3QoKQorICAgICAgICBhc3NlcnQgbC5jb250YWluc0FsbChjKQorICAgICAgICBhc3NlcnQgYy5zaXplKCkgPT0gbC5zaXplKCkKKyAgICB9CisKKyAgICB2b2lkIHRlc3RTdHJpbmdUb0xpc3QoKSB7CisgICAgICAgIFN0cmluZyBzID0gJ2hlbGxvIDEwJworICAgICAgICBkZWYgZ3MgPSAiaGVsbG8gJHs1KzV9IgorICAgICAgICBkZWYgZXhwZWN0ZWQgPSBbImgiLCAiZSIsICJsIiwgImwiLCAibyIsICIgIiwgIjEiLCAiMCJdCisgICAgICAgIGFzc2VydCBzLnRvTGlzdCgpID09IGV4cGVjdGVkCisgICAgICAgIGFzc2VydCBzIGFzIFN0cmluZ1tdID09IGV4cGVjdGVkCisgICAgICAgIGFzc2VydCBncyBhcyBTdHJpbmdbXSA9PSBleHBlY3RlZAorICAgIH0KKworICAgIHZvaWQgdGVzdENvbGxlY3Rpb25Bc0xpc3QoKSB7CisgICAgICAgIEludGVnZXJbXSBudW1zID0gWzEsIDIsIDMsIDQsIDVdCisgICAgICAgIGRlZiBudW1MaXN0ID0gbnVtcyBhcyBMaXN0CisgICAgICAgIG51bXMuZWFjaCB7YXNzZXJ0IG51bUxpc3QuY29udGFpbnMoaXQpfQorICAgICAgICBhc3NlcnQgbnVtcy5zaXplKCkgPT0gbnVtTGlzdC5zaXplKCkKKyAgICB9CisKKyAgICB2b2lkIHRlc3RDb2xsZWN0aW9uQXNMaW5rZWRMaXN0KCkgeworICAgICAgICBJbnRlZ2VyW10gbnVtcyA9IFsxLCAyLCAzLCA0LCA1XQorICAgICAgICBkZWYgbnVtTGlzdCA9IG51bXMgYXMgTGlua2VkTGlzdAorICAgICAgICBudW1zLmVhY2gge2Fzc2VydCBudW1MaXN0LmNvbnRhaW5zKGl0KX0KKyAgICAgICAgYXNzZXJ0IG51bXMuc2l6ZSgpID09IG51bUxpc3Quc2l6ZSgpCisgICAgICAgIGFzc2VydCBudW1MaXN0LmNsYXNzID09IExpbmtlZExpc3QuY2xhc3MKKyAgICB9CisKKyAgICB2b2lkIHRlc3RBcnJheUxpc3RBc0xpbmtlZExpc3QoKSB7CisgICAgICAgIEFycmF5TGlzdCBudW1zID0gWzEsIDIsIDMsIDQsIDVdCisgICAgICAgIHNob3VsZEZhaWwoR3Jvb3Z5Q2FzdEV4Y2VwdGlvbi5jbGFzcykgeworICAgICAgICAgICAgZGVmIG51bUxpc3QgPSBudW1zIGFzIExpbmtlZExpc3QKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgdGVzdEZpbGVTaXplKCkgeworICAgICAgICBhc3NlcnQgbmV3IEZpbGUoJ2J1aWxkLnByb3BlcnRpZXMnKS5zaXplKCkKKyAgICB9CisKKyAgICB2b2lkIHRlc3RNYXRjaGVyU2l6ZSgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzIDMsICgnYWFhJyA9fiAvLi8pLmNvdW50CisgICAgICAgIGFzc2VydEVxdWFscyAzLCAoJ2FhYScgPX4gLy4vKS5zaXplKCkKKyAgICAgICAgYXNzZXJ0RXF1YWxzIDEsICgnYScgPX4gLy4vKS5zaXplKCkKKyAgICAgICAgYXNzZXJ0RXF1YWxzIDAsICgnYScgPX4gL3gvKS5zaXplKCkKKyAgICB9CisKKyAgICB2b2lkIHRlc3RKb2luU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdbXSBhcnIgPSBbImEiLCAiYiIsICJjIiwgImQiXQorICAgICAgICBkZWYgam9pbmVkID0gYXJyLmpvaW4oIiwgIikKKyAgICAgICAgYXNzZXJ0IGpvaW5lZCA9PSAiYSwgYiwgYywgZCIKKyAgICB9CisKKyAgICB2b2lkIHRlc3RSZXZlcnNlRWFjaCgpIHsKKyAgICAgICAgZGVmIGwgPSBbImNoZWVzZSIsICJsb3ZlcyIsICJHdWlsbGF1bWUiXQorICAgICAgICBkZWYgZXhwZWN0ZWQgPSBbIkd1aWxsYXVtZSIsICJsb3ZlcyIsICJjaGVlc2UiXQorICAgICAgICBkZWYgYW5zd2VyID0gW10KKyAgICAgICAgbC5yZXZlcnNlRWFjaCB7YW5zd2VyIDw8IGl0fQorICAgICAgICBhc3NlcnQgYW5zd2VyID09IGV4cGVjdGVkCisgICAgfQorCisgICAgdm9pZCB0ZXN0R3JlcCgpIHsKKyAgICAgICAgZGVmIGxpc3QgPSBbIkd1aWxsYXVtZSIsICJsb3ZlcyIsICJjaGVlc2UiXQorICAgICAgICBkZWYgYW5zd2VyID0gbGlzdC5ncmVwKH4iLiplZS4qIikKKyAgICAgICAgYXNzZXJ0IGFuc3dlciA9PSBbImNoZWVzZSJdCisgICAgICAgIGxpc3QgPSBbMTIzLCAiYWJjIiwgNC41Nl0KKyAgICAgICAgYW5zd2VyID0gbGlzdC5ncmVwKFN0cmluZykKKyAgICAgICAgYXNzZXJ0IGFuc3dlciA9PSBbImFiYyJdCisgICAgICAgIGxpc3QgPSBbNCwgMiwgNywgMywgNiwgMl0KKyAgICAgICAgYW5zd2VyID0gbGlzdC5ncmVwKDIuLjMpCisgICAgICAgIGFzc2VydCBhbnN3ZXIgPT0gWzIsIDMsIDJdCisgICAgfQorCisgICAgdm9pZCB0ZXN0TWFwR2V0V2l0aERlZmF1bHQoKSB7CisgICAgICAgIGRlZiBtYXAgPSBbOl0KKyAgICAgICAgYXNzZXJ0IG1hcC5mb28gPT0gbnVsbAorICAgICAgICBtYXAuZ2V0KCJmb28iLCBbXSkuYWRkKDEyMykKKyAgICAgICAgYXNzZXJ0IG1hcC5mb28gPT0gWzEyM10KKyAgICAgICAgbWFwLmdldCgiYmFyIiwgWzpdKS5nZXQoInh5eiIsIFs6XSkuY2hlZXNlID0gMTIzCisgICAgICAgIGFzc2VydCBtYXAuYmFyLnh5ei5jaGVlc2UgPT0gMTIzCisgICAgICAgIGFzc2VydCBtYXAuc2l6ZSgpID09IDIKKyAgICB9CisKKyAgICBTdHJpbmcgZ2V0Q21kKCkgeworICAgICAgICBkZWYgY21kID0gImxzIC1sIgorICAgICAgICBpZiAoU3lzdGVtLnByb3BlcnRpZXMuJ29zLm5hbWUnLmNvbnRhaW5zKCdXaW4nKSkgeworICAgICAgICAgICAgY21kID0gImNtZCAvYyBkaXIiCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNtZAorICAgIH0KKworICAgIHZvaWQgdGVzdEV4ZWN1dGVDb21tYW5kTGluZVByb2Nlc3NVc2luZ0FTdHJpbmcoKSB7CisgICAgICAgIHByaW50bG4gImV4ZWN1dGluZyBjb21tYW5kOiAke2NtZH0iCisgICAgICAgIGRlZiBwcm9jZXNzID0gY21kLmV4ZWN1dGUoKQorICAgICAgICAvLyBsZXRzIGhhdmUgYW4gZWFzaWVyIHdheSB0byBkbyB0aGlzIQorICAgICAgICBkZWYgY291bnQgPSAwCisgICAgICAgIHByaW50bG4gIlJlYWQgdGhlIGZvbGxvd2luZyBsaW5lcy4uLiIKKyAgICAgICAgLyoqIEB0b2RvIHdlIHNob3VsZCBzaW1wbGlmeSB0aGUgZm9sbG93aW5nIGxpbmUhISEgKi8KKyAgICAgICAgbmV3IElucHV0U3RyZWFtUmVhZGVyKHByb2Nlc3MuaW4pLmVhY2hMaW5lIHtsaW5lIC0+CisgICAgICAgICAgICBwcmludGxuIGxpbmUKKyAgICAgICAgICAgICsrY291bnQKKyAgICAgICAgfQorICAgICAgICBwcmludGxuICIiCisgICAgICAgIHByb2Nlc3Mud2FpdEZvcigpCisgICAgICAgIGRlZiB2YWx1ZSA9IHByb2Nlc3MuZXhpdFZhbHVlKCkKKyAgICAgICAgcHJpbnRsbiAiRXhpdCB2YWx1ZSBvZiBjb21tYW5kIGxpbmUgaXMgJHt2YWx1ZX0iCisgICAgICAgIGFzc2VydCBjb3VudCA+IDEKKyAgICB9CisKKyAgICAvKgorICAgIHZvaWQgdGVzdEV4ZWN1dGVDb21tYW5kTGluZVByb2Nlc3NBbmRVc2VXYWl0Rm9yT3JLaWxsX0ZBSUxTX09OX1dJTkRPV1MoKSB7CisgICAgICAgIGlmIChTeXN0ZW0ucHJvcGVydGllcy4nb3MubmFtZScuY29udGFpbnMoJ1dpbmRvd3MnKSAmJiBub3RZZXRJbXBsZW1lbnRlZCgpKSByZXR1cm4KKworICAgICAgICBwcmludGxuICJleGVjdXRpbmcgY29tbWFuZDogJHtjbWR9IgorCisgICAgICAgIGRlZiBwcm9jZXNzID0gY21kLmV4ZWN1dGUoKQorCisgICAgICAgIHByb2Nlc3MuY29uc3VtZVByb2Nlc3NPdXRwdXQoKQorICAgICAgICBwcm9jZXNzLndhaXRGb3JPcktpbGwoMTAwMCkKKyAgICAgICAgZGVmIHZhbHVlID0gcHJvY2Vzcy5leGl0VmFsdWUoKQorICAgICAgICBwcmludGxuICJFeGl0IHZhbHVlIG9mIGNvbW1hbmQgbGluZSBpcyAke3ZhbHVlfSIKKworICAgICAgICBwcm9jZXNzID0gY21kLmV4ZWN1dGUoKQorCisgICAgICAgIHByb2Nlc3MuY29uc3VtZVByb2Nlc3NPdXRwdXQoKQorICAgICAgICBwcm9jZXNzLndhaXRGb3JPcktpbGwoMTApIC8vIFRoaXMgZmFpbHMgb24gUkxXJ3Mgd29ya3N0YXRpb24gd2l0aCBwYXJhbWV0ZXIgMSwgPj04IGlzIHJlcXVpcmVkLgorICAgICAgICB2YWx1ZSA9IHByb2Nlc3MuZXhpdFZhbHVlKCkKKyAgICAgICAgcHJpbnRsbiAiRXhpdCB2YWx1ZSBvZiBjb21tYW5kIGxpbmUgaXMgJHt2YWx1ZX0iCisgICAgICAgIAorICAgIH0KKyAgICAqLworCisgICAgdm9pZCB0ZXN0RXhlY3V0ZUNvbW1hbmRMaW5lVW5kZXJXb3JraW5nRGlyZWN0b3J5X0ZBSUxTKCkge2lmIChub3RZZXRJbXBsZW1lbnRlZCgpKSByZXR1cm4KKworICAgICAgICBkZWYgZW52cCA9IGphdmEudXRpbC5BcnJheS5uZXdJbnN0YW5jZShTdHJpbmcsIDApCisgICAgICAgIGRlZiB3b3JrRGlyID0gbmV3IEZpbGUoIi4iKQorCisgICAgICAgIHByaW50bG4gImV4ZWN1dGluZyBjb21tYW5kOiAke2NtZH0gdW5kZXIgdGhlIGRpcmVjdG9yeSAke3dvcmtEaXIuY2Fub25pY2FsUGF0aH0iCisKKyAgICAgICAgZGVmIHByb2Nlc3MgPSBjbWQuZXhlY3V0ZShlbnZwLCB3b3JrRGlyKQorCisgICAgICAgIC8vIGxldHMgaGF2ZSBhbiBlYXNpZXIgd2F5IHRvIGRvIHRoaXMhCisgICAgICAgIGRlZiBjb3VudCA9IDAKKworICAgICAgICBwcmludGxuICJSZWFkIHRoZSBmb2xsb3dpbmcgbGluZXMgdW5kZXIgdGhlIGRpcmVjdG9yeSAke3dvcmtEaXJ9IC4uLiIKKworICAgICAgICAvKiogQHRvZG8gd2Ugc2hvdWxkIHNpbXBsaWZ5IHRoZSBmb2xsb3dpbmcgbGluZSEhISAqLworICAgICAgICBuZXcgSW5wdXRTdHJlYW1SZWFkZXIocHJvY2Vzcy5pbikuZWFjaExpbmUge2xpbmUgLT4KKyAgICAgICAgICAgIHByaW50bG4gbGluZQorICAgICAgICAgICAgKytjb3VudAorICAgICAgICB9CisgICAgICAgIHByaW50bG4gIiIKKworICAgICAgICBwcm9jZXNzLndhaXRGb3IoKQorICAgICAgICBkZWYgdmFsdWUgPSBwcm9jZXNzLmV4aXRWYWx1ZSgpCisgICAgICAgIHByaW50bG4gIkV4aXQgdmFsdWUgb2YgY29tbWFuZCBsaW5lIGlzICR7dmFsdWV9IgorCisgICAgICAgIGFzc2VydCBjb3VudCA+IDEKKyAgICB9CisKKyAgICB2b2lkIHRlc3REaXNwbGF5U3lzdGVtUHJvcGVydGllcygpIHsKKyAgICAgICAgcHJpbnRsbiAiU3lzdGVtIHByb3BlcnRpZXMgYXJlLi4uIgorICAgICAgICBkZWYgcHJvcGVydGllcyA9IFN5c3RlbS5wcm9wZXJ0aWVzCisgICAgICAgIGRlZiBrZXlzID0gcHJvcGVydGllcy5rZXlTZXQoKS5zb3J0KCkKKyAgICAgICAgZm9yIChrIGluIGtleXMpIHsKKyAgICAgICAgICAgIHByaW50bG4gIiR7a30gPSAke3Byb3BlcnRpZXNba119IgorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCB0ZXN0TWF4KCkgeworICAgICAgICBhc3NlcnQgWy01LCAtMywgLTEsIDAsIDIsIDRdLm1heCB7aXQgKiBpdH0gPT0gLTUKKyAgICB9CisKKyAgICB2b2lkIHRlc3RNaW4oKSB7CisgICAgICAgIGFzc2VydCBbLTUsIC0zLCAtMSwgMCwgMiwgNF0ubWluIHtpdCAqIGl0fSA9PSAwCisgICAgfQorCisgICAgdm9pZCB0ZXN0U29ydCgpIHsKKyAgICAgICAgYXNzZXJ0IFstNSwgLTMsIC0xLCAwLCAyLCA0XS5zb3J0IHtpdCAqIGl0fSA9PSBbMCwgLTEsIDIsIC0zLCA0LCAtNV0KKyAgICB9CisKKyAgICB2b2lkIHRlc3RSZXBsYWNlQWxsQ2xvc3VyZSgpIHsKKyAgICAgICAgYXNzZXJ0ICIxIGEgMiBiIDMgYyA0Ii5yZXBsYWNlQWxsKCJcXHB7RGlnaXR9Iikge2l0ICogMn0gPT0gIjExIGEgMjIgYiAzMyBjIDQ0IgorICAgIH0KKworICAgIHZvaWQgdGVzdE9iamVjdFNsZWVwKCkgeworICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkKKyAgICAgICAgc2xlZXAgMTAwMAorICAgICAgICBsb25nIHNsZXB0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydAorICAgICAgICBsb25nIGVwc2lsb24gPSAxMjAKKyAgICAgICAgYXNzZXJ0IChzbGVwdCA+IDEwMDAgLSBlcHNpbG9uKSAmJiAoc2xlcHQgPCAxMDAwICsgZXBzaWxvbik6ICBcCisgICAgICAgICAgICAgICJzaG91bGQgaGF2ZSBzbGVwdCBmb3IgMXMgKCsvLSAiICsgZXBzaWxvbiArICJtcykgYnV0IHdhcyAke3NsZXB0fW1zIgorICAgIH0KKworICAgIHZvaWQgdGVzdE9iamVjdFNsZWVwSW50ZXJydXB0ZWQoKSB7CisgICAgICAgIGRlZiBpbnRlcnJ1cHRvciA9IG5ldyBncm9vdnkuVGVzdEludGVycnVwdG9yKFRocmVhZC5jdXJyZW50VGhyZWFkKCkpCisgICAgICAgIG5ldyBUaHJlYWQoaW50ZXJydXB0b3IpLnN0YXJ0KCkKKyAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpCisgICAgICAgIHNsZWVwIDEwMDAKKyAgICAgICAgbG9uZyBzbGVwdCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQKKyAgICAgICAgbG9uZyBlcHNpbG9uID0gMTUwCisgICAgICAgIGFzc2VydCAoc2xlcHQgPiAxMDAwIC0gZXBzaWxvbikgJiYgKHNsZXB0IDwgMTAwMCArIGVwc2lsb24pOiAgXAorICAgICAgICAgICAgICAic2hvdWxkIGhhdmUgc2xlcHQgZm9yIDFzICgrLy0gIiArIGVwc2lsb24gKyAibXMpIGJ1dCB3YXMgJHtzbGVwdH1tcyIKKyAgICB9CisKKyAgICB2b2lkIHRlc3RPYmplY3RTbGVlcFdpdGhPbkludGVycnVwdEhhbmRsZXIoKSB7CisgICAgICAgIGRlZiBsb2cgPSAnJworICAgICAgICBkZWYgaW50ZXJydXB0b3IgPSBuZXcgZ3Jvb3Z5LlRlc3RJbnRlcnJ1cHRvcihUaHJlYWQuY3VycmVudFRocmVhZCgpKQorICAgICAgICBuZXcgVGhyZWFkKGludGVycnVwdG9yKS5zdGFydCgpCisgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKQorICAgICAgICBzbGVlcCgyMDAwKSB7bG9nICs9IGl0LnRvU3RyaW5nKCl9CisgICAgICAgIGxvbmcgc2xlcHQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0CisgICAgICAgIGFzc2VydCBzbGVwdCA8IDIwMDAsICJzaG91bGQgaGF2ZSBiZWVuIGludGVycnVwdGVkIGJ1dCBzbGVwdCAke3NsZXB0fW1zID4gMnMiCisgICAgICAgIGFzc2VydEVxdWFscyAnamF2YS5sYW5nLkludGVycnVwdGVkRXhjZXB0aW9uOiBzbGVlcCBpbnRlcnJ1cHRlZCcsIGxvZy50b1N0cmluZygpCisgICAgfQorCisgICAgdm9pZCB0ZXN0T2JqZWN0U2xlZXBXaXRoT25JbnRlcnJ1cHRIYW5kbGVyQ29udGludWVTbGVlcGluZygpIHsKKyAgICAgICAgZGVmIGxvZyA9ICcnCisgICAgICAgIGRlZiBpbnRlcnJ1cHRvciA9IG5ldyBncm9vdnkuVGVzdEludGVycnVwdG9yKFRocmVhZC5jdXJyZW50VGhyZWFkKCkpCisgICAgICAgIG5ldyBUaHJlYWQoaW50ZXJydXB0b3IpLnN0YXJ0KCkKKyAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpCisgICAgICAgIHNsZWVwKDIwMDApIHsKKyAgICAgICAgICAgIGxvZyArPSBpdC50b1N0cmluZygpCisgICAgICAgICAgICBmYWxzZSAvLyBjb250aW51ZSBzbGVlcGluZworICAgICAgICB9CisgICAgICAgIGxvbmcgc2xlcHQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0CisgICAgICAgIHNob3J0IGFsbG93ZWRFcnJvciA9IDIgLy8gbXMKKyAgICAgICAgYXNzZXJ0IHNsZXB0ICsgYWxsb3dlZEVycm9yID49IDIwMDAsICJzaG91bGQgaGF2ZSBzbGVwdCBmb3IgYXQgbGVhc3QgMnMgYnV0IG9ubHkgc2xlcHQgZm9yICR7c2xlcHR9bXMiCisgICAgICAgIGFzc2VydEVxdWFscyAnamF2YS5sYW5nLkludGVycnVwdGVkRXhjZXB0aW9uOiBzbGVlcCBpbnRlcnJ1cHRlZCcsIGxvZy50b1N0cmluZygpCisgICAgfQorCisgICAgdm9pZCB0ZXN0T2JqZWN0SWRlbnRpdHkoKSB7CisgICAgICAgIGRlZiBhID0gbmV3IE9iamVjdCgpCisgICAgICAgIGRlZiBiID0gYQorICAgICAgICBhc3NlcnQgYS5pcyhiKQorICAgICAgICBhc3NlcnQgIWEuaXMobnVsbCkKKyAgICAgICAgYXNzZXJ0ICExLmlzKDIpCisgICAgICAgIC8vIG5haXZlIGltcGwgd291bGQgZmFsbCBmb3IgdGhpcyB0cmFwCisgICAgICAgIGFzc2VydCAhbmV3IFdhY2t5SGFzaENvZGUoKS5pcyhuZXcgV2Fja3lIYXNoQ29kZSgpKQorICAgIH0KKworICAgIHZvaWQgdGVzdEdyb3VwQnlMaXN0KCkgeworICAgICAgICBkZWYgZXhwZWN0ZWQgPSBbSW50ZWdlcjogWzEsIDJdLCBTdHJpbmc6IFsiYSIsICJiIl0sIEJpZ0RlY2ltYWw6IFszLjUsIDQuNl1dCisgICAgICAgIGRlZiBsaXN0ID0gWzEsICJhIiwgMiwgImIiLCAzLjUsIDQuNl0KKyAgICAgICAgZGVmIHJlc3VsdCA9IGxpc3QuZ3JvdXBCeSB7aXQuY2xhc3N9CisgICAgICAgIGFzc2VydCBbMSwgMl0gPT0gcmVzdWx0W0ludGVnZXJdCisgICAgICAgIGFzc2VydCBbImEiLCAiYiJdID09IHJlc3VsdFtTdHJpbmddCisgICAgICAgIGFzc2VydCBbMy41LCA0LjZdID09IHJlc3VsdFtCaWdEZWNpbWFsXQorICAgICAgICBhc3NlcnQgMyA9PSByZXN1bHQuc2l6ZSgpCisgICAgfQorCisgICAgdm9pZCB0ZXN0R3JvdXBCeU1hcEVudHJ5KCkgeworICAgICAgICBkZWYgZXhwZWN0ZWRLZXlzID0gW0ludGVnZXI6IFsxLCAzXSwgU3RyaW5nOiBbMiwgNF0sIEJpZ0RlY2ltYWw6IFs1LCA2XV0KKyAgICAgICAgZGVmIGV4cGVjdGVkVmFscyA9IFtJbnRlZ2VyOiBbMSwgMl0sIFN0cmluZzogWyJhIiwgImIiXSwgQmlnRGVjaW1hbDogWzMuNSwgNC42XV0KKyAgICAgICAgZGVmIG1hcCA9IFsxOiAxLCAyOiAiYSIsIDM6IDIsIDQ6ICJiIiwgNTogMy41LCA2OiA0LjZdCisgICAgICAgIGRlZiByZXN1bHQgPSBtYXAuZ3JvdXBCeSB7ZW50cnkgLT4gZW50cnkudmFsdWUuY2xhc3N9CisgICAgICAgIGFzc2VydCBleHBlY3RlZEtleXMuSW50ZWdlciA9PSByZXN1bHRbSW50ZWdlcl0uY29sbGVjdCB7aXQua2V5fQorICAgICAgICBhc3NlcnQgZXhwZWN0ZWRWYWxzLkludGVnZXIgPT0gcmVzdWx0W0ludGVnZXJdLmNvbGxlY3Qge2l0LnZhbHVlfQorICAgICAgICBhc3NlcnQgZXhwZWN0ZWRLZXlzLlN0cmluZyA9PSByZXN1bHRbU3RyaW5nXS5jb2xsZWN0IHtpdC5rZXl9CisgICAgICAgIGFzc2VydCBleHBlY3RlZFZhbHMuU3RyaW5nID09IHJlc3VsdFtTdHJpbmddLmNvbGxlY3Qge2l0LnZhbHVlfQorICAgICAgICBhc3NlcnQgZXhwZWN0ZWRLZXlzLkJpZ0RlY2ltYWwgPT0gcmVzdWx0W0JpZ0RlY2ltYWxdLmNvbGxlY3Qge2l0LmtleX0KKyAgICAgICAgYXNzZXJ0IGV4cGVjdGVkVmFscy5CaWdEZWNpbWFsID09IHJlc3VsdFtCaWdEZWNpbWFsXS5jb2xsZWN0IHtpdC52YWx1ZX0KKyAgICAgICAgYXNzZXJ0IDMgPT0gcmVzdWx0LnNpemUoKQorICAgIH0KKworICAgIGRlZiBsZWZ0Q29sID0gWyIyIl0KKyAgICBkZWYgcmlnaHRDb2wgPSBbIjEiLCAiMiIsICIzIl0KKworICAgIHZvaWQgdGVzdExpc3QoKSB7CisgICAgICAgIGRlZiBsc3QgPSBbXSBhcyBMaW5rZWRMaXN0CisgICAgICAgIGRvSXQobHN0KQorICAgIH0KKworICAgIHZvaWQgdGVzdFNldFdpdGhFeHBsaWNpdENvZXJjaW9uKCkgeworICAgICAgICBkZWYgc2V0ID0gW10gYXMgSGFzaFNldAorICAgICAgICBkb0l0KHNldCkKKyAgICB9CisKKyAgICB2b2lkIHRlc3RTZXRXaXRoSW1wbGljaXRDb2VyY2lvbigpIHsKKyAgICAgICAgU2V0IHNldCA9IFtdCisgICAgICAgIGRvSXQoc2V0KQorICAgIH0KKworICAgIHZvaWQgdGVzdFZlY3RvcigpIHsKKyAgICAgICAgZGVmIHZjdHIgPSBbXSBhcyBWZWN0b3IKKyAgICAgICAgZG9JdCh2Y3RyKQorICAgIH0KKworICAgIHZvaWQgZG9JdChjb2wpIHsKKyAgICAgICAgY29sLmNsZWFyKCk7CisgICAgICAgIGNvbC5hZGRBbGwobGVmdENvbCk7CisgICAgICAgIC8vIG5vdCByZWFsbHkgY29uY2VybmVkIGFib3V0ICBjb3JyZWN0bmVzcywgcmF0aGVyIHRoYXQgdGhlIG1ldGhvZCBjYW4gYmUgY2FsbGVkLCBob3dldmVyLi4KKyAgICAgICAgYXNzZXJ0IGNvbC5pbnRlcnNlY3QocmlnaHRDb2wpID09IFsiMiJdCisgICAgfQorfQorCitjbGFzcyBXYWNreUhhc2hDb2RlIHsKKyAgICBpbnQgaGFzaENvZGUoKSB7cmV0dXJuIDE7fQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9Hcm9vdnlUcnV0aFRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9Hcm9vdnlUcnV0aFRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViYWE1OWEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0dyb292eVRydXRoVGVzdC5ncm9vdnkKQEAgLTAsMCArMSw0OSBAQAorcGFja2FnZSBncm9vdnkKKworY2xhc3MgR3Jvb3Z5VHJ1dGhUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCB0ZXN0VHJ1dGgoKSB7CisgICAgICAgIHRlc3RGYWxzZSBudWxsCisKKyAgICAgICAgYXNzZXJ0VHJ1ZSBCb29sZWFuLlRSVUUKKyAgICAgICAgdGVzdFRydWUgdHJ1ZQorICAgICAgICB0ZXN0RmFsc2UgQm9vbGVhbi5GQUxTRQorICAgICAgICB0ZXN0RmFsc2UgZmFsc2UKKworICAgICAgICB0ZXN0RmFsc2UgIiIKKyAgICAgICAgdGVzdFRydWUgImJsYSIKKyAgICAgICAgdGVzdFRydWUgInRydWUiCisgICAgICAgIHRlc3RUcnVlICJUUlVFIgorICAgICAgICB0ZXN0VHJ1ZSAiZmFsc2UiCisgICAgICAgIHRlc3RGYWxzZSAnJworICAgICAgICB0ZXN0VHJ1ZSAnYmxhJworICAgICAgICB0ZXN0VHJ1ZSBuZXcgU3RyaW5nQnVmZmVyKCdibGEnKQorICAgICAgICB0ZXN0RmFsc2UgbmV3IFN0cmluZ0J1ZmZlcigpCisKKyAgICAgICAgdGVzdEZhbHNlIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QKKyAgICAgICAgdGVzdEZhbHNlKFtdKQorICAgICAgICB0ZXN0VHJ1ZShbMV0pCisgICAgICAgIHRlc3RGYWxzZShbXS50b0FycmF5KCkpCisKKyAgICAgICAgdGVzdEZhbHNlIFs6XQorICAgICAgICB0ZXN0VHJ1ZShbYmxhOiAnc29tZSB2YWx1ZSddKSAKKyAgICAgICAgdGVzdFRydWUgMTIzNAorICAgICAgICB0ZXN0RmFsc2UgMAorICAgICAgICB0ZXN0VHJ1ZSAwLjNmCisgICAgICAgIHRlc3RUcnVlIG5ldyBEb3VibGUoMy4wZikKKyAgICAgICAgdGVzdEZhbHNlIDAuMGYKKyAgICAgICAgdGVzdFRydWUgbmV3IENoYXJhY3RlcigoY2hhcikgMSkKKyAgICAgICAgdGVzdEZhbHNlIG5ldyBDaGFyYWN0ZXIoKGNoYXIpIDApCisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCB0ZXN0VHJ1ZShzb21lT2JqKQorICAgIHsKKyAgICAJYXNzZXJ0VHJ1ZSBzb21lT2JqID8gdHJ1ZSA6IGZhbHNlCisgICAgfQorCisgICAgcHJvdGVjdGVkIHRlc3RGYWxzZShzb21lT2JqKQorICAgIHsKKyAgICAJYXNzZXJ0RmFsc2Ugc29tZU9iaiA/IHRydWUgOiBmYWxzZQorICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvSGVyZWRvY3NUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvSGVyZWRvY3NUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmY3YWU2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9IZXJlZG9jc1Rlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMzQgQEAKK3BhY2thZ2UgZ3Jvb3Z5CisKK2NsYXNzIEhlcmVkb2NzVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIHZvaWQgdGVzdEhlcmVkb2NzKCkgeworICAgICAgICBkZWYgbmFtZSA9ICJKYW1lcyIKKyAgICAgICAgZGVmIHMgPSAiIiIKK2FiY2QKK2VmZworCitoaWprCisgICAgIAoraGVsbG8gJHtuYW1lfQorICAgICAgICAKKyIiIgorICAgICAgICBhc3NlcnQgcyAhPSBudWxsCisgICAgICAgIGFzc2VydCBzIGluc3RhbmNlb2YgR1N0cmluZworICAgICAgICBhc3NlcnQgcy5jb250YWlucygiaSIpCisgICAgICAgIGFzc2VydCBzLmNvbnRhaW5zKCJKYW1lcyIpCisgICAgICAgIGRlZiBudW1saW5lcyA9IHMuY291bnQoJ1xuJykKKyAgICAgICAgYXNzZXJ0IG51bWxpbmVzID09IDgKKyAgICB9CisKKyAgICB2b2lkIHRlc3REb2xsYXJFc2NhcGluZygpIHsKKyAgICAgICAgZGVmIHMgPSAiIiIKK2hlbGxvIFwke25hbWV9CisiIiIKKyAgICAgICAgYXNzZXJ0IHMgIT0gbnVsbAorICAgICAgICBhc3NlcnQgcy5jb250YWlucygnJCcpCisgICAgICAgIGRlZiBjID0gcy5jb3VudCgnJCcpCisgICAgICAgIGFzc2VydCBjID09IDEKKyAgICAgICAgYXNzZXJ0IHMgPT0gJ1xuaGVsbG8gJHtuYW1lfVxuJworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvSG9tZXBhZ2VUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvSG9tZXBhZ2VUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDk0ZjNjCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9Ib21lcGFnZVRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsOCBAQAorcGFja2FnZSBncm9vdnkKKworY2xhc3MgSG9tZXBhZ2VUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisJdm9pZCB0ZXN0SG9tZVBhZ2UoKSB7CisJICAgIAorCX0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvSWRlbnRpdHlDbG9zdXJlVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0lkZW50aXR5Q2xvc3VyZVRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMzM2MDEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0lkZW50aXR5Q2xvc3VyZVRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsNzQgQEAKK3BhY2thZ2UgZ3Jvb3Z5CisKKy8qKgorICogQ2hlY2sgdGhhdCBPYmplY3QuaWRlbnRpdHkoQ2xvc3VyZSkgbWV0aG9kIHdvcmtzIGFzIGV4cGVjdGVkCisgKgorICogQGF1dGhvciBKZXJlbXkgUmF5bmVyCisgKiBAYXV0aG9yIEd1aWxsYXVtZSBMYWZvcmdlCisgKi8KK2NsYXNzIElkZW50aXR5Q2xvc3VyZVRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisgICAgCisgICAgZGVmIGZvbyA9IFtbMSwyLDNdLFs0LDUsNl0sWzcsOCw5XV0KKyAgICBkZWYgYmFyID0gIiBiYXIgIgorICAgIGRlZiBtb29reSA9IDEKKworICAgIC8qKiBtb3N0IHVzZWZ1bCBwZXJjZWl2ZWQgdXNlY2FzZSwgYWxtb3N0IGxpa2Ugd2l0aChleHByKSAqLworICAgIHZvaWQgdGVzdElkZW50aXR5MCgpIHsKKyAgICAgICAgYXNzZXJ0ICIgYmFyICIgPT0gYmFyCisKKyAgICAgICAgYmFyLnRvVXBwZXJDYXNlKCkudHJpbSgpLmlkZW50aXR5eworICAgICAgICAgICAgYXNzZXJ0ICJCQVIiID09IGl0CisgICAgICAgICAgICBhc3NlcnQgMyA9PSBpdC5zaXplKCkKKyAgICAgICAgICAgIGFzc2VydCBpdC5pbmRleE9mKCJBIikgPiAwCisgICAgICAgIH0KKyAgICB9ICAKKworICAgIC8qKiBjaGVjayB0aGUgYmFzaWNzICovCisgICAgdm9pZCB0ZXN0SWRlbnRpdHkxKCkgeworICAgICAgICBtb29reS5pZGVudGl0eXsgc3Bvb2t5LT4KKyAgICAgICAgICAgIGFzc2VydCBzcG9va3kgPT0gbW9va3kKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiB0ZXN0IHRlbXAgc2hvcnRjdXQgdG8gYW4gZWxlbWVudCBvZiBhbiBhcnJheSAqLworICAgIHZvaWQgdGVzdElkZW50aXR5MigpIHsKKyAgICAgICAgYXNzZXJ0IDYgPT0gZm9vWzFdWzJdCisgICAgICAgIAorICAgICAgICBmb29bMV0uaWRlbnRpdHl7IG15QXJyYXktPgorICAgICAgICAgICAgbXlBcnJheVsyXSA9IDEyCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGFzc2VydCAxMiA9PSBmb29bMV1bMl0KKyAgICB9CisKKyAgICAvKiogY2hlY2sgbmVzdGVkIGlkZW50aXR5IHVzYWdlICovCisgICAgdm9pZCB0ZXN0SWRlbnRpdHkzKCkgeworICAgICAgICBtb29reS50b1N0cmluZygpLmlkZW50aXR5eyBtLT4KKyAgICAgICAgICAgIGFzc2VydCAiMSIgPT0gbQorICAgICAgICAgICAgbSArPSAiMjM0NTY3ODkwIgorICAgICAgICAgICAgbS5pZGVudGl0eXsgbi0+CisgICAgICAgICAgICAgICAgYXNzZXJ0ICIxMjM0NTY3ODkwIiA9PSBuCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogVGVzdCB0aGUgY2xvc3VyZSBkZWxlZ2F0ZSAqLworICAgIHZvaWQgdGVzdENsb3N1cmVEZWxlZ2F0ZTEoKSB7CisgICAgICAgIGJhci50b1VwcGVyQ2FzZSgpLnRyaW0oKS5pZGVudGl0eXsKKyAgICAgICAgICAgIGFzc2VydCAiQkFSIiA9PSBpdAorICAgICAgICAgICAgYXNzZXJ0IDMgPT0gc2l6ZSgpCisgICAgICAgICAgICBhc3NlcnQgaW5kZXhPZigiQSIpID4gMAorICAgICAgICB9CisgICAgfQorCisgICAgLyoqIFRlc3QgdGhlIGNsb3N1cmUgZGVsZWdhdGUgd2l0aCBFeHBhbmRvcyAqLworICAgIHZvaWQgdGVzdENsb3N1cmVEZWxlZ2F0ZTIoKSB7CisgICAgICAgIGRlZiBhID0gbmV3IEV4cGFuZG8oKQorICAgICAgICBhLmZvb2JhciA9ICJmb29iYXIiCisgICAgICAgIGEuYmFyZm9vID0gNTU1CisgICAgICAgIGEuaWRlbnRpdHl7CisgICAgICAgICAgICBhc3NlcnQgZm9vYmFyID09ICJmb29iYXIiCisgICAgICAgICAgICBhc3NlcnQgYmFyZm9vID09IDU1NQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9JZkVsc2VDb21wYWN0VGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0lmRWxzZUNvbXBhY3RUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzcxMGU5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9JZkVsc2VDb21wYWN0VGVzdC5ncm9vdnkKQEAgLTAsMCArMSwyNSBAQAorcGFja2FnZSBncm9vdnkKKworY2xhc3MgSWZFbHNlQ29tcGFjdFRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICB2b2lkIHRlc3RJZl9Ob0Vsc2UoKSB7CisKKyAgICAgICAgZGVmIHggPSBmYWxzZQorCisgICAgICAgIGlmICggdHJ1ZSApIHt4ID0gdHJ1ZX0KKworICAgICAgICBhc3NlcnQgeCA9PSB0cnVlCisgICAgfQorCisgICAgdm9pZCB0ZXN0SWZfV2l0aEVsc2VfTWF0Y2hJZigpIHsKKworICAgICAgICBkZWYgeCA9IGZhbHNlCisgICAgICAgIGRlZiB5ID0gZmFsc2UKKworICAgICAgICBpZiAoIHRydWUgKSB7eCA9IHRydWV9IGVsc2Uge3kgPSB0cnVlfQorCisgICAgICAgIGFzc2VydCB4ID09IHRydWUKKyAgICAgICAgYXNzZXJ0IHkgPT0gZmFsc2UKKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvSWZFbHNlVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0lmRWxzZVRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYzE4YmEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0lmRWxzZVRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTMzIEBACitwYWNrYWdlIGdyb292eQorCitjbGFzcyBJZkVsc2VUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCB0ZXN0SWZfTm9FbHNlKCkgeworCisgICAgICAgIGRlZiB4ID0gZmFsc2UKKworICAgICAgICBpZiAoIHRydWUgKSB7CisgICAgICAgICAgICB4ID0gdHJ1ZQorICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0IHggPT0gdHJ1ZQorICAgIH0KKworICAgIHZvaWQgdGVzdElmX1dpdGhFbHNlX01hdGNoSWYoKSB7CisKKyAgICAgICAgZGVmIHggPSBmYWxzZQorICAgICAgICBkZWYgeSA9IGZhbHNlCisKKyAgICAgICAgaWYgKCB0cnVlICkgeworICAgICAgICAgICAgeCA9IHRydWUKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHkgPSB0cnVlCisgICAgICAgIH0KKworICAgICAgICBhc3NlcnQgeCA9PSB0cnVlCisgICAgICAgIGFzc2VydCB5ID09IGZhbHNlCisKKyAgICB9CisKKyAgICB2b2lkIHRlc3RJZl9XaXRoRWxzZV9NYXRjaEVsc2UoKSB7CisKKyAgICAgICAgZGVmIHggPSBmYWxzZQorICAgICAgICBkZWYgeSA9IGZhbHNlCisKKyAgICAgICAgaWYgKCBmYWxzZSApIHsKKyAgICAgICAgICAgIHggPSB0cnVlCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB5ID0gdHJ1ZQorICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCBmYWxzZSwgeCApCisgICAgICAgIGFzc2VydEVxdWFscyggdHJ1ZSwgeSApCisgICAgfQorCisgICAgdm9pZCB0ZXN0SWZfV2l0aEVsc2VJZl9NYXRjaElmKCkgeworCisgICAgICAgIGRlZiB4ID0gZmFsc2UKKyAgICAgICAgZGVmIHkgPSBmYWxzZQorCisgICAgICAgIGlmICggdHJ1ZSApIHsKKyAgICAgICAgICAgIHggPSB0cnVlCisgICAgICAgIH0gZWxzZSBpZiAoIGZhbHNlICkgeworICAgICAgICAgICAgeSA9IHRydWUKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydCB4ID09IHRydWUKKyAgICAgICAgYXNzZXJ0IHkgPT0gZmFsc2UKKyAgICB9CisKKyAgICB2b2lkIHRlc3RJZl9XaXRoRWxzZUlmX01hdGNoRWxzZUlmKCkgeworCisgICAgICAgIGRlZiB4ID0gZmFsc2UKKyAgICAgICAgZGVmIHkgPSBmYWxzZQorCisgICAgICAgIGlmICggZmFsc2UgKSB7CisgICAgICAgICAgICB4ID0gdHJ1ZQorICAgICAgICB9IGVsc2UgaWYgKCB0cnVlICkgeworICAgICAgICAgICAgeSA9IHRydWUKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydEVxdWFscyggZmFsc2UsIHggKQorICAgICAgICBhc3NlcnRFcXVhbHMoIHRydWUsIHkgKQorICAgIH0KKworICAgIHZvaWQgdGVzdElmX1dpdGhFbHNlSWZfV2l0aEVsc2VfTWF0Y2hJZigpIHsKKworICAgICAgICBkZWYgeCA9IGZhbHNlCisgICAgICAgIGRlZiB5ID0gZmFsc2UKKyAgICAgICAgZGVmIHogPSBmYWxzZQorCisgICAgICAgIGlmICggdHJ1ZSApIHsKKyAgICAgICAgICAgIHggPSB0cnVlCisgICAgICAgIH0gZWxzZSBpZiAoIGZhbHNlICkgeworICAgICAgICAgICAgeSA9IHRydWUKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHogPSB0cnVlCisgICAgICAgIH0KKworICAgICAgICBhc3NlcnQgeCA9PSB0cnVlCisgICAgICAgIGFzc2VydCB5ID09IGZhbHNlCisgICAgICAgIGFzc2VydEVxdWFscyggZmFsc2UsIHogKQorICAgIH0KKworICAgIHZvaWQgdGVzdElmX1dpdGhFbHNlSWZfV2l0aEVsc2VfTWF0Y2hFbHNlSWYoKSB7CisKKyAgICAgICAgZGVmIHggPSBmYWxzZQorICAgICAgICBkZWYgeSA9IGZhbHNlCisgICAgICAgIGRlZiB6ID0gZmFsc2UKKworICAgICAgICBpZiAoIGZhbHNlICkgeworICAgICAgICAgICAgeCA9IHRydWUKKyAgICAgICAgfSBlbHNlIGlmICggdHJ1ZSApIHsKKyAgICAgICAgICAgIHkgPSB0cnVlCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB6ID0gdHJ1ZQorICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCBmYWxzZSwgeCApCisgICAgICAgIGFzc2VydEVxdWFscyggdHJ1ZSwgeSApCisgICAgICAgIGFzc2VydEVxdWFscyggZmFsc2UsIHogKQorICAgIH0KKworICAgIHZvaWQgdGVzdElmX1dpdGhFbHNlSWZfV2l0aEVsc2VfTWF0Y2hFbHNlKCkgeworCisgICAgICAgIGRlZiB4ID0gZmFsc2UKKyAgICAgICAgZGVmIHkgPSBmYWxzZQorICAgICAgICBkZWYgeiA9IGZhbHNlCisKKyAgICAgICAgaWYgKCBmYWxzZSApIHsKKyAgICAgICAgICAgIHggPSB0cnVlCisgICAgICAgIH0gZWxzZSBpZiAoIGZhbHNlICkgeworICAgICAgICAgICAgeSA9IHRydWUKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHogPSB0cnVlCisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRFcXVhbHMoIGZhbHNlLCB4ICkKKyAgICAgICAgYXNzZXJ0IHkgPT0gZmFsc2UKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCB0cnVlLCB6ICkKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0lmUHJvcGVydHlUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvSWZQcm9wZXJ0eVRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZjI4NzIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0lmUHJvcGVydHlUZXN0Lmdyb292eQpAQCAtMCwwICsxLDQwIEBACitwYWNrYWdlIGdyb292eQorCitjbGFzcyBJZlByb3BlcnR5VGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKwkKKyAgICBkZWYgZHVtbXkKKyAgICAKKwkvLyBUaGlzIGlzIGJlY2F1c2Ugbm9ybWFsIGNsYXNzZXMgYXJlIG5vdCBleHRlbnNpYmxlLCBidXQgc2NyaXB0cyBhcmUgZXh0ZW5zaWJsZSBieSBkZWZhdWx0LgorICAgIE9iamVjdCBnZXQoU3RyaW5nIGtleSkgeworICAgICAgICBwcmludGxuKCJhc2tpbmcgZm9yIGRlZiAiICsga2V5KQorICAgICAgICByZXR1cm4gZHVtbXkKKyAgICB9CisKKyAgICB2b2lkIHNldChPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgcHJpbnRsbigic2V0dGluZyB0aGUgZGVmICIgKyBrZXkgKyAiIHRvOiAiICsgdmFsdWUpCisgICAgICAgIGR1bW15ID0gdmFsdWUKKyAgICB9CisKKyAgICB2b2lkIHRlc3RJZk51bGxQcm9wZXJ0eVNldCgpIHsKKyAgICAgICAgZGVmIGNoZWVzZSA9IG51bGwKKyAgICAgICAgaWYgKGNoZWVzZSA9PSBudWxsKSB7CisgICAgICAgICAgICBjaGVlc2UgPSAxCisgICAgICAgIH0KKyAgICAgICAgaWYgKGNoZWVzZSAhPSAxKSB7CisgICAgICAgICAgICBmYWlsKCJEaWRuJ3QgY2hhbmdlIGNoZWVzZSIpCisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0IGNoZWVzZSA9PSAxCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdElmTnVsbFByb3BlcnR5U2V0UmVjaGVjaygpIHsKKyAgICAgICAgZGVmIGNoZWVzZSA9IG51bGwKKyAgICAgICAgaWYgKGNoZWVzZSA9PSBudWxsKSB7CisgICAgICAgICAgICBjaGVlc2UgPSAxCisgICAgICAgIH0KKyAgICAgICAgaWYgKGNoZWVzZSA9PSAxKSB7CisgICAgICAgICAgICBjaGVlc2UgPSAyCisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0IGNoZWVzZSA9PSAyCisgICAgfQorICAgIAorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9JZlRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9JZlRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZTk3MWYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0lmVGVzdC5ncm9vdnkKQEAgLTAsMCArMSw0NSBAQAorcGFja2FnZSBncm9vdnkKKworY2xhc3MgSWZUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCB0ZXN0VXNpbmdOdW1iZXIoKSB7CisgICAgICAgIGRlZiB4ID0gMQorCisgICAgICAgIGlmICh4KSB7CisgICAgICAgICAgICBwcmludGxuICIke3h9IGlzIHRydWUiCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBmYWlsKCJzaG91bGQgbm90IGJlIGZhbHNlIikKKyAgICAgICAgfQorCisgICAgICAgIHggPSAwCisKKyAgICAgICAgaWYgKHgpIHsKKyAgICAgICAgICAgIGZhaWwoInNob3VsZCBub3QgYmUgdHJ1ZSIpCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBwcmludGxuICIke3h9IGlzIGZhbHNlIgorICAgICAgICB9CisKKyAgICB9CisKKyAgICB2b2lkIHRlc3RVc2luZ1N0cmluZygpIHsKKyAgICAgICAgZGVmIHggPSAiYWJjIgorCisgICAgICAgIGlmICh4KSB7CisgICAgICAgICAgICBwcmludGxuICIke3h9IGlzIHRydWUiCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBmYWlsKCJzaG91bGQgbm90IGJlIGZhbHNlIikKKyAgICAgICAgfQorCisgICAgICAgIHggPSAiIgorCisgICAgICAgIGlmICh4KSB7CisgICAgICAgICAgICBmYWlsKCJzaG91bGQgbm90IGJlIHRydWUiKQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcHJpbnRsbiAiJHt4fSBpcyBmYWxzZSIKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvSWZXaXRoTWV0aG9kQ2FsbFRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9JZldpdGhNZXRob2RDYWxsVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE4YTkzYwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvSWZXaXRoTWV0aG9kQ2FsbFRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTUgQEAKK3BhY2thZ2UgZ3Jvb3Z5CisKK2NsYXNzIElmV2l0aE1ldGhvZENhbGxUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCB0ZXN0SWZXaXRoTWV0aG9kQ2FsbCgpIHsKKyAgICAgICAgZGVmIHggPSBbImZvbyIsICJjaGVlc2UiXQorCisgICAgICAgIGlmICggeC5jb250YWlucygiY2hlZXNlIikgKSB7CisgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydCBmYWxzZSAsICJ4IHNob3VsZCBjb250YWluIGNoZWVzZSEiCisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0ltbXV0YWJsZU1vZGlmaWNhdGlvblRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9JbW11dGFibGVNb2RpZmljYXRpb25UZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDA2MmI4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9JbW11dGFibGVNb2RpZmljYXRpb25UZXN0Lmdyb292eQpAQCAtMCwwICsxLDI2IEBACitwYWNrYWdlIGdyb292eQorCisvKioKKyAqIGNoZWNrIHRoYXQgdGhlIG5ldyBhc0ltbXV0YWJsZSgpIG1ldGhvZCB3b3JrcworICogYXMgc3BlY2lmaWVkIGluIEdST09WWS02MjMKKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqZXJlbXkucmF5bmVyQGJpZ2Zvb3QuY29tIj5KZXJlbXkgUmF5bmVyPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCisKK2NsYXNzIEltbXV0YWJsZU1vZGlmaWNhdGlvblRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisgICAgdm9pZCB0ZXN0Q29sbGVjdGlvbkFzSW1tdXRhYmxlKCkgeworICAgICAgICBkZWYgY2hhbGxlbmdlciA9IFsiVGVsc29uIiwgIlNoYXJuYSIsICJEYXJ2IiwgIkFzdHJhIl0KKyAgICAgICAgZGVmIGhvcGVmdWxseUltbXV0YWJsZSA9IGNoYWxsZW5nZXIuYXNJbW11dGFibGUoKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgY2hhbGxlbmdlci5hZGQoIkFuZ2VsIE9uZSIpCisgICAgICAgICAgICBjaGFsbGVuZ2VyIDw8ICJBbmdlbCBUd28iCisKKyAgICAgICAgICAgIC8vIEB0b2RvIGZhaWwoIidjaGFsbGVuZ2VyJyBpcyBzdXBwb3NlZCB0byBiZSBhbiBpbW11dGFibGUgY29sbGVjdGlvbi4iKQorCisgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIHN1Y2Nlc3MgaWYgdGhpcyBleGNlcHRpb24gaXMgdGhyb3duCisgICAgICAgICAgICBhc3NlcnQgNCA9PSBjaGFsbGVuZ2VyLnNpemUoKQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvSW1wb3J0VGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0ltcG9ydFRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ZjU2YWQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0ltcG9ydFRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMjUgQEAKK3BhY2thZ2UgZ3Jvb3Z5CisKK2NsYXNzIEltcG9ydFRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICB2b2lkIHRlc3RJbXBvcnRBbGwoKSB7CisgICAgICAgIGRlZiBmaWxlID0gbmV3IEZpbGUoImZvby50eHQiKQorICAgICAgICBhc3NlcnQgZmlsZSBpbnN0YW5jZW9mIEZpbGUKKyAgICAgICAgYXNzZXJ0IGZpbGUuZ2V0Q2xhc3MoKS5uYW1lID09ICJqYXZhLmlvLkZpbGUiCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdEltcG9ydEJ5TmFtZSgpIHsKKyAgICAgICAgZGVmIHggPSBbOl0KKyAgICAgICAgYXNzZXJ0IHggaW5zdGFuY2VvZiBNYXAKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZvciBtYXBzLCBtYXAuZ2V0Q2xhc3MoKSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIG1hcC5jbGFzcywKKyAgICAgICAgICogd2hlbiBtYXAgaGFzIG5vIG1lbWJlciwgbmFtZWQgYXMgImNsYXNzIgorICAgICAgICAgKi8KKyAgICAgICAgYXNzZXJ0IHguZ2V0Q2xhc3MoKSAhPSBudWxsCisgICAgICAgIGFzc2VydCB4LmdldENsYXNzKCkubmFtZS5zdGFydHNXaXRoKCJqYXZhLnV0aWwuIikKKyAgICAgICAgCisgICAgICAgIGRlZiB5ID0gWzEsIDIsIDNdCisgICAgICAgIGFzc2VydCB5IGluc3RhbmNlb2YgTGlzdAorICAgICAgICBhc3NlcnQgeS5nZXRDbGFzcygpLm5hbWUuc3RhcnRzV2l0aCgiamF2YS51dGlsLiIpCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9JbnN0YW5jZW9mVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0luc3RhbmNlb2ZUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODMxMmI2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9JbnN0YW5jZW9mVGVzdC5ncm9vdnkKQEAgLTAsMCArMSw1NCBAQAorcGFja2FnZSBncm9vdnkKKworY2xhc3MgSW5zdGFuY2VvZlRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICB2b2lkIHRlc3RUcnVlKCkgeworCisgICAgICAgIGRlZiB4ID0gZmFsc2UKKyAgICAgICAgZGVmIG8gPSAxMgorICAgICAgICAKKyAgICAgICAgaWYgKCBvIGluc3RhbmNlb2YgSW50ZWdlciApIHsKKyAgICAgICAgICAgIHggPSB0cnVlCisgICAgICAgIH0KKworICAgICAgICBhc3NlcnQgeCA9PSB0cnVlCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdEZhbHNlKCkgeworCisgICAgICAgIGRlZiB4ID0gZmFsc2UKKyAgICAgICAgZGVmIG8gPSAxMgorICAgICAgICAKKyAgICAgICAgaWYgKCBvIGluc3RhbmNlb2YgRG91YmxlICkgeworICAgICAgICAgICAgeCA9IHRydWUKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydCB4ID09IGZhbHNlCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdEltcG9ydGVkQ2xhc3MoKSB7CisgICAgICAgIGRlZiBtID0gWyJ4eXoiOjJdCisgICAgICAgIGFzc2VydCBtIGluc3RhbmNlb2YgTWFwCisgICAgICAgIGFzc2VydCAhKG0gaW5zdGFuY2VvZiBEb3VibGUpCisgICAgICAgIAorICAgICAgICBhc3NlcnRUcnVlKG0gaW5zdGFuY2VvZiBNYXApCisgICAgICAgIGFzc2VydEZhbHNlKG0gaW5zdGFuY2VvZiBEb3VibGUpCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdEZ1bGx5UXVhbGlmaWVkQ2xhc3MoKSB7CisgICAgICAgIGRlZiBsID0gWzEsIDIsIDNdCisgICAgICAgIGFzc2VydCBsIGluc3RhbmNlb2YgamF2YS51dGlsLkxpc3QKKyAgICAgICAgYXNzZXJ0ICEobCBpbnN0YW5jZW9mIE1hcCkKKyAgICAgICAgCisgICAgICAgIGFzc2VydFRydWUobCBpbnN0YW5jZW9mIGphdmEudXRpbC5MaXN0KQorICAgICAgICBhc3NlcnRGYWxzZShsIGluc3RhbmNlb2YgTWFwKQorICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RCb29sZWFuKCl7CisgICAgICAgYXNzZXJ0IHRydWUgaW5zdGFuY2VvZiBPYmplY3QKKyAgICAgICBhc3NlcnQgdHJ1ZT09dHJ1ZSBpbnN0YW5jZW9mIE9iamVjdAorICAgICAgIGFzc2VydCB0cnVlPT1mYWxzZSBpbnN0YW5jZW9mIE9iamVjdAorICAgICAgIGFzc2VydCB0cnVlPT1mYWxzZSBpbnN0YW5jZW9mIEJvb2xlYW4KKyAgICAgICBhc3NlcnQgIW5ldyBPYmplY3QoKSBpbnN0YW5jZW9mIEJvb2xlYW4KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0ludm9rZU5vcm1hbE1ldGhvZHNGaXJzdFRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9JbnZva2VOb3JtYWxNZXRob2RzRmlyc3RUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjcyZGIyCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9JbnZva2VOb3JtYWxNZXRob2RzRmlyc3RUZXN0Lmdyb292eQpAQCAtMCwwICsxLDYxIEBACitwYWNrYWdlIGdyb292eQorCisvKioKKyAqIEludm9rZSBub3JtYWwgbWV0aG9kcyBmaXJzdDogaWYgbm8gc3RhdGljYWxseSB0eXBlZCBtZXRob2QgZXhpc3QsIHVzZSBpbnZva2VNZXRob2QoKS4KKyAqCisgKiBAYXV0aG9yIEd1aWxsYXVtZSBMYWZvcmdlCisgKi8KK2NsYXNzIEludm9rZU5vcm1hbE1ldGhvZHNGaXJzdFRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICB2b2lkIHRlc3RQcmludGxuKCkgeworICAgICAgICBwcmludGxuICJjYWxsIGdsb2JhbCBwcmludGxuIGZ1bmN0aW9uIgorICAgIH0KKworICAgIHZvaWQgdGVzdFN0YXRpY01ldGhvZE9uSmRrT2JqZWN0KCkgeworICAgICAgICBkZWYgbXlTdHJpbmcgPSAiIHN0YXRpYyBtZXRob2QgIgorICAgICAgICBkZWYgbmV3U3RyaW5nID0gbXlTdHJpbmcudHJpbSgpCisKKyAgICAgICAgYXNzZXJ0IG5ld1N0cmluZyA9PSAic3RhdGljIG1ldGhvZCIKKyAgICB9CisKKyAgICB2b2lkIHRlc3RDYWxsQ2xvc3VyZSgpIHsKKyAgICAgICAgZGVmIGNsb3MgPSB7IG1zZyAtPiBtc2cgKyAiIGlzIEdyb292eSIgfQorICAgICAgICBkZWYgc3RyID0gY2xvcygiR3VpbGxhdW1lIikKKworICAgICAgICBhc3NlcnQgc3RyID09ICJHdWlsbGF1bWUgaXMgR3Jvb3Z5IgorICAgIH0KKworICAgIHZvaWQgdGVzdENhbGxOb3JtYWxNZXRob2RGcm9tQUdyb292eURlZmluZWRDbGFzcygpIHsKKyAgICAgICAgZGVmIHAgPSBuZXcgUHJpbnRlcigpCisgICAgICAgIGRlZiBzdHIgPSAiR3VpbGxhdW1lIgorICAgICAgICBkZWYgcmVzdWx0ID0gcC5yZXR1cm5TZWxmKHN0cikKKworICAgICAgICBhc3NlcnQgcmVzdWx0ID09IHN0cgorICAgIH0KKworICAgIHZvaWQgdGVzdENhbGxOb3JtYWxNZXRob2RGaXJzdEZyb21XYWNreU9iamVjdCgpIHsKKyAgICAgICAgZGVmIHcgPSBuZXcgV2Fja3koKQorICAgICAgICBkZWYgc3RyID0gIkdyb292eSIKKyAgICAgICAgZGVmIHN0YXRpY1Jlc3VsdCA9IHcucmV0dXJuU2VsZihzdHIpCisgICAgICAgIGRlZiBpbnZva2VSZXN1bHQgPSB3Lm5vbkV4aXN0aW5nTWV0aG9kKHN0cikKKworICAgICAgICBhc3NlcnQgc3RhdGljUmVzdWx0ID09IHN0cgorICAgICAgICBhc3NlcnQgaW52b2tlUmVzdWx0ID09ICJpbnZva2VyTWV0aG9kIGNhbGwiCisgICAgfQorfQorCitjbGFzcyBQcmludGVyIHsKKyAgICBTdHJpbmcgcmV0dXJuU2VsZihtc2cpIHsKKyAgICAgICAgcmV0dXJuIG1zZworICAgIH0KK30KKworY2xhc3MgV2Fja3kgeworICAgIFN0cmluZyByZXR1cm5TZWxmKG1zZykgeworICAgICAgICByZXR1cm4gbXNnCisgICAgfQorCisgICAgT2JqZWN0IGludm9rZU1ldGhvZChTdHJpbmcgbmFtZSwgT2JqZWN0IGFyZ3MpIHsKKyAgICAgICAgcmV0dXJuICJpbnZva2VyTWV0aG9kIGNhbGwiCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvSmF2YUNsYXNzLmphdmEgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0phdmFDbGFzcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NjQzOTUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0phdmFDbGFzcy5qYXZhCkBAIC0wLDAgKzEsMjIgQEAKK3BhY2thZ2UgZ3Jvb3Z5OworCitwdWJsaWMgY2xhc3MgSmF2YUNsYXNzIHsKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU3RhdGljSW5uZXIgeworICAgICAgICBpbnQgZ2V0UmVzdWx0ICgpIHsKKyAgICAgICAgICAgIHJldHVybiAyMzk7CisgICAgICAgIH0KKworICAgICAgICAgc3RhdGljIGxvbmcgZ2V0SXQgKCkgeworICAgICAgICAgICAgcmV0dXJuIDMwOworICAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW5uZXIyIHt9CisgICAgfQorCisgICAgY2xhc3MgTm9uU3RhdGljSW5uZXIgeworCisgICAgfQorCisgICAgc3RhdGljIGZpbmFsIFN0YXRpY0lubmVyIENPTlNUID0gbmV3IFN0YXRpY0lubmVyKCk7Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0xlZnRTaGlmdFRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9MZWZ0U2hpZnRUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTI1ODZjCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9MZWZ0U2hpZnRUZXN0Lmdyb292eQpAQCAtMCwwICsxLDM1IEBACitwYWNrYWdlIGdyb292eQorCitjbGFzcyBMZWZ0U2hpZnRUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgZGVmIGZvbyA9IFsxLCAyLCAzXQorCisgICAgdm9pZCB0ZXN0U2hpZnQoKSB7CisgICAgICAgIGRlZiB4ID0gNAorCisgICAgICAgIGRlZiB5ID0geCA8PCAyCisKKyAgICAgICAgcHJpbnRsbiAiVmFsdWUgaXMgJHkiCisKKyAgICAgICAgYXNzZXJ0IHkgPT0gMTYKKworICAgICAgICBhc3NlcnQgeCA8PCAyID09IDE2CisgICAgfQorCisgICAgdm9pZCB0ZXN0U2hpZnRMaXN0KCkgeworICAgICAgICBkZWYgbGlzdCA9IFtdCisKKyAgICAgICAgZm9yIChpIGluIDEuLjEwKSB7CisgICAgICAgICAgICBsaXN0IDw8IGkKKyAgICAgICAgfQorCisgICAgICAgIHByaW50bG4gIkxpc3QgaXMgJGxpc3QiCisgICAgfQorCisgICAgdm9pZCB0ZXN0TGVmdFNoaWZ0T25FeHByZXNzaW9uKCkgeworICAgICAgICB0aGlzLmZvbyA8PCA0CisKKyAgICAgICAgYXNzZXJ0IGZvbyA9PSBbMSwgMiwgMywgNF0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvTGlzdEl0ZXJhdGluZ1Rlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9MaXN0SXRlcmF0aW5nVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU5OWU1YgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvTGlzdEl0ZXJhdGluZ1Rlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsNTkgQEAKK3BhY2thZ2UgZ3Jvb3Z5CisKKy8qKiAKKyAqIFRlc3RzIGl0ZXJhdGluZyB1c2luZyBHcm9vdnkKKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworY2xhc3MgTGlzdEl0ZXJhdGluZ1Rlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKy8qKiBAdG9kbyBwYXJzZXIKKyAgICB0ZXN0SXRlcmF0aW5nV2l0aFR1cGxlcygpIHsKKyAgICAgICAgZGVmIHMgPSAxLCAyLCAzLCA0CisgICAgICAgIGFzc2VydFNlcXVlbmNlKHMpCisgICAgfQorCisgICAgdGVzdEl0ZXJhdGluZ1dpdGhUdXBsZXNBc1BhcmFtZXRlcigpIHsKKyAgICAgICAgYXNzZXJ0U2VxdWVuY2UoMSwgMiwgMywgNCkKKyAgICB9CisqLworCisgICAgdm9pZCB0ZXN0SXRlcmF0aW5nV2l0aFNlcXVlbmNlcygpIHsKKyAgICAgICAgZGVmIHMgPSBbMSwgMiwgMywgNCBdCisgICAgICAgIGFzc2VydFNlcXVlbmNlKHMpCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdEl0ZXJhdGluZ1dpdGhTZXF1ZW5jZXNBc1BhcmFtZXRlcigpIHsKKyAgICAgICAgYXNzZXJ0U2VxdWVuY2UoWzEsIDIsIDMsIDQgXSkKKyAgICB9CisgICAgCisgICAgZGVmIHRlc3RJdGVyYXRpbmdXaXRoTGlzdCgpIHsKKyAgICAgICAgZGVmIHMgPSBuZXcgQXJyYXlMaXN0KCkKKyAgICAgICAgcy5hZGQoMSkKKyAgICAgICAgcy5hZGQoMikKKyAgICAgICAgcy5hZGQoMykKKyAgICAgICAgcy5hZGQoNCkKKyAgICAgICAgYXNzZXJ0U2VxdWVuY2UocykKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRTZXF1ZW5jZShzKSB7CisgICAgICAgIGRlZiByZXN1bHQgPSAwCisgICAgICAgIGZvciAoIGkgaW4gcyApIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIGkKKyAgICAgICAgfQorCSAgICAKKyAgICAgICAgYXNzZXJ0KHJlc3VsdCA9PSAxMCkKKyAgICAgICAgYXNzZXJ0KHMuc2l6ZSgpID09IDQpCisgICAgICAgIAorICAgICAgICBhc3NlcnQoc1syXSA9PSAzKQorICAgICAgICAvLyBAdG9kbyBwYXJzZXIgKFdoeSBAdG9kbyBoZXJlPykKKyAgICAgICAgLy8gICBzWzEsMl0gb3Igc1sxLi4yXSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIHNbMToyXSwKKyAgICAgICAgLy8gICBzaW5jZSBbMToyXSBpcyBhIG1hcCBsaXRlcmFsIHN5bnRheC4KKyAgICAgICAgcmVzdWx0ID0gMAorICAgICAgICBmb3IgKCBpIGluIHNbMSwyXSApIHsgICAgLy8gb3Igc1sxLi4yXQorICAgICAgICAgICAgcmVzdWx0ICs9IGkKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQocmVzdWx0ID09IDIrMykKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0xpc3RUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvTGlzdFRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiOGVjYjcKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0xpc3RUZXN0Lmdyb292eQpAQCAtMCwwICsxLDQyNiBAQAorcGFja2FnZSBncm9vdnkKKworLy8gVE9ETzogc3BsaXQgYSBjb3VwbGUgb2YgU2V0IHRlc3RzIGludG8gdGhlaXIgb3duIGNsYXNzPworY2xhc3MgTGlzdFRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICB2b2lkIHRlc3RMaXN0KCkgeworICAgICAgICBkZWYgeCA9IFsxMCwgMTFdCisKKyAgICAgICAgYXNzZXJ0IHguc2l6ZSgpID09IDIKKworICAgICAgICB4LmFkZCgiY2hlZXNlIikKKworICAgICAgICBhc3NlcnQgeC5zaXplKCkgPT0gMworCisgICAgICAgIGFzc2VydCB4LmNvbnRhaW5zKDEwKQorICAgICAgICBhc3NlcnQgeC5jb250YWlucygxMSkKKyAgICAgICAgYXNzZXJ0IHguY29udGFpbnMoImNoZWVzZSIpCisKKyAgICAgICAgYXNzZXJ0IHguZ2V0KDApID09IDEwCisgICAgICAgIGFzc2VydCB4LmdldCgxKSA9PSAxMQorICAgICAgICBhc3NlcnQgeC5nZXQoMikgPT0gImNoZWVzZSIKKworICAgICAgICAvLyBzdWJzY3JpcHQgb3BlcmF0b3IKKyAgICAgICAgYXNzZXJ0IHhbMF0gPT0gMTAKKyAgICAgICAgYXNzZXJ0IHhbMV0gPT0gMTEKKyAgICAgICAgYXNzZXJ0IHhbMl0gPT0gImNoZWVzZSIKKworICAgICAgICB4WzNdID0gMTIKKworICAgICAgICBhc3NlcnQgeFszXSA9PSAxMgorCisgICAgICAgIGlmICggeC5jb250YWlucygiY2hlZXNlIikgKSB7CisgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydCBmYWxzZSAsICJ4IHNob3VsZCBjb250YWluIGNoZWVzZSEiCisgICAgICAgIH0KKworICAgICAgICBpZiAoIHguY29udGFpbnMoMTApICkgeworICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhc3NlcnQgZmFsc2UgLCAieCBzaG91bGQgY29udGFpbiAxISIKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RFbXB0eUxpc3QoKSB7CisgICAgICAgIGRlZiB4ID0gW10KKyAgICAgICAgCisgICAgICAgIGFzc2VydCB4LnNpemUoKSA9PSAwCisgICAgICAgIAorICAgICAgICB4LmFkZCgiY2hlZXNlIikKKworICAgICAgICBhc3NlcnQgeC5nZXQoMCkgPT0gImNoZWVzZSIKKworICAgICAgICBhc3NlcnQgeC5zaXplKCkgPT0gMQorCisgICAgICAgIGFzc2VydCB4WzBdID09ICJjaGVlc2UiCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdFN1YnNjcmlwdCgpIHsKKyAgICAgICAgZGVmIHggPSBbXQorICAgICAgICB4WzFdID0gJ2NoZWVzZScKKyAgICAgICAgCisgICAgICAgIGFzc2VydCB4WzBdID09IG51bGwKKyAgICAgICAgYXNzZXJ0IHhbMV0gPT0gJ2NoZWVzZScKKyAgICAgICAgCisgICAgICAgIHhbMl0gPSAnZ3JvbWl0JworICAgICAgICB4WzNdID0gJ3dhbGxhY2UnCisgICAgICAgIAorICAgICAgICBhc3NlcnQgeC5zaXplKCkgPT0gNAorICAgICAgICAKKyAgICAgICAgeFstMV0gPSAnbmljZScKKyAgICAgICAgCisgICAgICAgIGFzc2VydCB4WzNdID09ICduaWNlJworICAgICAgICAKKyAgICAgICAgeFstMl0gPSAnY2hlZXNlJworICAgICAgICAKKyAgICAgICAgYXNzZXJ0IHhbMl0gPT0gJ2NoZWVzZScKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0Q2xvc3VyZSgpIHsKKyAgICAgICAgZGVmIGwgPSBbMSwgMiwgMywgImFiYyJdCisgICAgICAgIGRlZiBibG9jayA9IHtpIC0+IHByaW50bG4oaSkgfQorICAgICAgICBsLmVhY2goYmxvY2spCisKKyAgICAgICAgbC5lYWNoIHtpLT4gcHJpbnRsbihpKSB9CisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdE1heCgpIHsKKyAgICAgICAgZGVmIGwgPSBbMSwgMiwgNSwgMywgNywgMV0KKyAgICAgICAgYXNzZXJ0IGwubWF4KCkgPT0gNworICAgICAgICAKKyAgICAgICAgbCA9IFs3LCAyLCAzXQorICAgICAgICBhc3NlcnQgbC5tYXgoKSA9PSA3CisgICAgICAgIAorICAgICAgICBsID0gWzEsIDIsIDddCisgICAgICAgIGFzc2VydCBsLm1heCgpID09IDcKKworICAgICAgICAvLyBHUk9PVlktMTAwNiAgICAgICAgCisgICAgICAgIGwgPSBbMSwgMy4yLCA0TCwgKHNob3J0KTddCisgICAgICAgIGFzc2VydCBsLm1heCgpID09IChzaG9ydCk3CisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdE1pbigpIHsKKyAgICAgICAgZGVmIGwgPSBbNiwgNCwgNSwgMSwgNywgMl0KKyAgICAgICAgYXNzZXJ0IGwubWluKCkgPT0gMQorICAgICAgICAKKyAgICAgICAgbCA9IFs3LCAxLCAzXQorICAgICAgICBhc3NlcnQgbC5taW4oKSA9PSAxCisgICAgICAgIAorICAgICAgICBsID0gWzEsIDIsIDddCisgICAgICAgIGFzc2VydCBsLm1pbigpID09IDEKKworICAgICAgICAvLyBHUk9PVlktMTAwNiAgICAgICAgCisgICAgICAgIGwgPSBbKGxvbmcpMSwgMy4yLCA0TCwgKHNob3J0KTddCisgICAgICAgIGFzc2VydCBsLm1pbigpID09IChsb25nKTEKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0UGx1cygpIHsKKyAgICAgICAgZGVmIGwxID0gWzYsIDQsIDUsIDEsIDcsIDJdCisgICAgICAgIGRlZiBsMiA9IFs2LCA0LCA1LCAxLCA3LCBbNCw1XV0KKyAgICAgICAgZGVmIGwzID0gbDEgKyBsMgorICAgICAgICBhc3NlcnQgbDMgPT0gWzYsIDQsIDUsIDEsIDcsIDIsIDYsIDQsIDUsIDEsIDcsIFs0LDVdXQorCisgICAgICAgIGwxID0gWzEsIDUuMiwgOV0KKyAgICAgICAgbDIgPSBbMywgNExdCisgICAgICAgIGwzID0gWzEsIDUuMiwgOSwgMywgNExdCisgICAgICAgIGFzc2VydCBsMSArIGwyID09IGwzCisgICAgfQorCisgICAgdm9pZCB0ZXN0U2V0UGx1cygpIHsKKyAgICAgICAgU2V0IHMxID0gWzYsIDQsIDUsIDEsIDcsIDJdCisgICAgICAgIGRlZiBzMiA9IFs2LCA0LCA1LCAxLCA3LCBbNCw1XV0KKyAgICAgICAgZGVmIHMzID0gczEgKyBzMgorICAgICAgICBhc3NlcnQgczMgPT0gWzEsIDIsIDQsIDUsIDYsIDcsIFs0LDVdXSBhcyBTZXQKKyAgICB9CisKKyAgICB2b2lkIHRlc3RQbHVzT25lRWxlbWVudCgpIHsKKyAgICAgICAgZGVmIGwxID0gWzYsIDQsIDUsIDEsIDcsIDJdCisgICAgICAgIGRlZiBsMiA9ICJlcmVyZXJlciIKKyAgICAgICAgYXNzZXJ0IGwxICsgbDIgPT0gWzYsIDQsIDUsIDEsIDcsIDIsICJlcmVyZXJlciJdICAgICAgICAgICAgCisgICAgfQorCisgICAgdm9pZCB0ZXN0TGlzdEFwcGVuZCgpIHsKKyAgICAgICAgZGVmIGxpc3QgPSBbMSwgMl0KKyAgICAgICAgCisgICAgICAgIGxpc3QgPDwgMyA8PCA0IDw8IDUKKyAgICAgICAgCisgICAgICAgIGFzc2VydCBsaXN0ID09IFsxLCAyLCAzLCA0LCA1XQorICAgICAgICAKKyAgICAgICAgZGVmIHggPSBbXSA8PCAnYScgPDwgJ2hlbGxvJyA8PCBbMiwgM10gPDwgNQorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IHggPT0gWydhJywgJ2hlbGxvJywgWzIsIDNdLCA1XQorICAgIH0KKworICAgIHZvaWQgdGVzdFRpbWVzKCkgeworICAgICAgICBkZWYgbCA9IFs0LDcsOF0KKyAgICAgICAgYXNzZXJ0IGwgKiAzID09IFs0LCA3LCA4LCA0LCA3LCA4LCA0LCA3LCA4XQorICAgIH0KKworICAgIC8vIEdST09WWS0xMDA2CisgICAgdm9pZCB0ZXN0TWludXMoKSB7CisgICAgICAgIGRlZiBsMSA9IFsxLCAxLCAyLCAyLCAzLCAzLCAzLCA0LCA1LCAzLCA1XQorICAgICAgICBkZWYgbDIgPSBbMSwgMi4wLCA0TF0KKyAgICAgICAgYXNzZXJ0IGwxIC0gbDIgPT0gWzMsIDMsIDMsIDUsIDMsIDVdIAorICAgIH0KKworICAgIHZvaWQgdGVzdFNldFNpbXBsZU1pbnVzKCkgeworICAgICAgICBTZXQgczEgPSBbMSwgMSwgMiwgMiwgMywgMywgMywgNCwgNSwgMywgNV0KKyAgICAgICAgZGVmIHMyID0gczEgLSBbMSwgNF0KKyAgICAgICAgYXNzZXJ0IHMyID09IFsyLCAzLCA1XSBhcyBTZXQKKyAgICAgICAgZGVmIHMzID0gczEgLSA0LjAKKyAgICAgICAgYXNzZXJ0IHMzID09IFsxLCAyLCAzLCA1XSBhcyBTZXQKKyAgICB9CisKKyAgICAvLyBHUk9PVlktMTAwNgorICAgIHZvaWQgdGVzdE1pbnVzRGlmZmVyZW50VHlwZXMoKSB7CisgICAgICAgIGRlZiBsMSA9IFsxLCAxLCAid3JlciIsIDIsIDMsIDMsICJ3cmV3ZXIiLCA0LCA1LCAidyIsICJ3Il0KKyAgICAgICAgZGVmIGwyID0gWzEsIDIsICJ3Il0KKyAgICAgICAgYXNzZXJ0IGwxIC0gbDIgPT0gWyJ3cmVyIiwgMywgMywgIndyZXdlciIsIDQsIDVdIAorICAgIH0KKworICAgIHZvaWQgdGVzdE1pbnVzRW1wdHlDb2xsZWN0aW9uKCl7CisgICAgICAgIC8vIEdST09WWS03OTAKKyAgICAgICAgZGVmIGxpc3QgPSBbMSwxXQorICAgICAgICBhc3NlcnQgbGlzdCAtIFtdID09IGxpc3QKKworICAgICAgICAvLyBHUk9PVlktMTAwNiAgICAKKyAgICAgICAgbGlzdCA9IFsxLDIsMiwzLDFdCisgICAgICAgIGFzc2VydCBsaXN0IC0gW10gPT0gbGlzdAorICAgIH0KKyAgICAgCisgICAgdm9pZCB0ZXN0SW50ZXJzZWN0KCkgeworICAgICAgICBkZWYgbDEgPSBbMSwgMSwgIndyZXIiLCAyLCAzLCAzLCAid3Jld2VyIiwgNCwgNSwgInciLCAidyJdCisgICAgICAgIGRlZiBsMiA9IFsxLCAyLCAiZiIsICJ3Il0KKyAgICAgICAgYXNzZXJ0IGwxLmludGVyc2VjdChsMikgPT0gWzEsIDIsICJ3Il0gCisKKyAgICAgICAgLy8gR1JPT1ZZLTEwMDYgICAgCisgICAgICAgIGwxID0gWzEsIDEuMCwgIndyZXIiLCAyLCAzLCAzTCwgIndyZXdlciIsIDQsIDUsICJ3IiwgInciXQorICAgICAgICBsMiA9IFsoZG91YmxlKTEsIDJMLCAiZiIsICJ3Il0KKyAgICAgICAgYXNzZXJ0IGwxLmludGVyc2VjdChsMikgPT0gWzEsIDIsICJ3Il0gCisgICAgfQorICAgICAgCisgICAgLy8gR1JPT1ZZLTEwMDYKKyAgICB2b2lkIHRlc3RMaXN0RXF1YWwoKSB7CisgICAgICAgIGFzc2VydCBbMSwgMi4wLCAzTCwgKHNob3J0KTRdID09IFsxLCAyLCAzLCA0XQorICAgIH0KKyAgICAgIAorICAgIC8vIEdST09WWS0xMDA2CisgICAgdm9pZCB0ZXN0U29ydE51bWJlcnNNaXhlZFR5cGUoKSB7CisgICAgICAgIGFzc2VydCBbMSwgKHNob3J0KTMsIDRMLCAyLjksIChmbG9hdCk1LjJdLnNvcnQoKSA9PSBbMSwgMi45LCAoc2hvcnQpMywgNEwsIChmbG9hdCk1LjJdIAorICAgIH0KKyAgICAgIAorICAgIC8vIEdST09WWS0xMDA2CisgICAgdm9pZCB0ZXN0VW5pcXVlKCkgeworICAgICAgICBkZWYgYSA9IFsxLCA0TCwgMS4wXQorICAgICAgICBkZWYgYiA9IGEudW5pcXVlKCkKKyAgICAgICAgYXNzZXJ0IChiID09IGEgJiYgYSA9PSBbMSwgNF0pCisgICAgICAgIGEgPVsxLCAiZm9vIiwgKHNob3J0KTMsIDRMLCAxLjAsIChmbG9hdCkzLjBdCisgICAgICAgIGIgPSBhLnVuaXF1ZSgpCisgICAgICAgIGFzc2VydCAoYiA9PSBhICYmIGEgPT0gWzEsICJmb28iLCAoc2hvcnQpMywgNExdKQorICAgIH0KKworICAgIHZvaWQgdGVzdExpc3RGbGF0dGVuKCkgeworICAgICAgICBkZWYgbCA9IFtbWzQsIDUsIDYsIFs0NiwgNywgImVyZXIiXV0sIDQsIFszLCA2LCA3OF1dLCA0XQorICAgICAgICBhc3NlcnQgbC5mbGF0dGVuKCkgPT0gWzQsIDUsIDYsIDQ2LCA3LCAiZXJlciIsIDQsIDMsIDYsIDc4LCA0XQorICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RTZXRGbGF0dGVuKCkgeworICAgICAgICBTZXQgbCA9IFtbWzQsIDUsIDYsIFs0NiwgNywgImVyZXIiXSBhcyBTZXRdIGFzIFNldCwgNCwgWzMsIDYsIDc4XSBhcyBTZXRdIGFzIFNldCwgNF0KKyAgICAgICAgYXNzZXJ0IGwuZmxhdHRlbigpID09IFszLCA0LCA1LCA2LCA3LCA0NiwgNzgsICJlcmVyIl0gYXMgU2V0CisgICAgfQorCisgICAgdm9pZCB0ZXN0RmxhdHRlbldpdGhSYW5nZXMoKSB7CisgICAgICAgIGRlZiBmbGF0ID0gWzEsIDMsIDIwLi4yNCwgMzNdLmZsYXR0ZW4oKQorICAgICAgICBhc3NlcnQgZmxhdCA9PSBbMSwgMywgMjAsIDIxLCAyMiwgMjMsIDI0LCAzM10KKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0TGlzdHNBbmRSYW5nZXNDb21wYXJlKCkgeworICAgICAgICBkZWYgbCA9IFsxLCAyLCAzXQorICAgICAgICBkZWYgciA9IDEuLjMKKyAgICAgICAgYXNzZXJ0IHIgPT0gbAorICAgICAgICBhc3NlcnQgbCA9PSByCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdFJlbW92ZSgpIHsKKyAgICAgICAgZGVmIGwgPSBbJ2EnLCAnYicsICdjJ10KKyAgICAgICAgbC5yZW1vdmUoMSkKKyAgICAgICAgYXNzZXJ0IGwgPT0gWydhJywgJ2MnXQorICAgICAgICBsLnJlbW92ZSgwKQorICAgICAgICBhc3NlcnQgbCA9PSBbJ2MnXQorICAgICAgICBhc3NlcnQgbC5zaXplKCkgPT0gMQorICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RQb3AoKSB7CisgICAgICAgIGRlZiBsID0gW10KKyAgICAgICAgbCA8PCAnYScgPDwgJ2InCisgICAgICAgIGRlZiB2YWx1ZSA9IGwucG9wKCkKKyAgICAgICAgYXNzZXJ0IHZhbHVlID09ICdiJworICAgICAgICBhc3NlcnQgbCA9PSBbJ2EnXQorICAgICAgICAKKyAgICAgICAgbC5hZGQoJ2MnKQorICAgICAgICB2YWx1ZSA9IGwucG9wKCkKKyAgICAgICAgYXNzZXJ0IHZhbHVlID09ICdjJworICAgICAgICB2YWx1ZSA9IGwucG9wKCkKKyAgICAgICAgYXNzZXJ0IHZhbHVlID09ICdhJworICAgICAgICB0cnkgeworICAgICAgICAgICAgdmFsdWUgPSBsLnBvcCgpCisgICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uIikKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBwcmludGxuICJXb3JrZWQ6IGNhdWdodCBleHBlY3RlZCBleGNlcHRpb246ICR7ZX0iCisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHRlc3RCb29sQ29lcmNlKCkgeworICAgICAgICAvLyBFeHBsaWNpdCBjb2VyY2lvbgorICAgICAgICBhc3NlcnRGYWxzZSgoQm9vbGVhbikgW10pCisgICAgICAgIGFzc2VydFRydWUoKEJvb2xlYW4pIFsxXSkKKworICAgICAgICAvLyBJbXBsaWNpdCBjb2VyY2lvbiBpbiBzdGF0ZW1lbnRzCisgICAgICAgIExpc3QgbGlzdCA9IG51bGwKKyAgICAgICAgaWYgKGxpc3QpIHsKKyAgICAgICAgICAgIGZhaWwoIm51bGwgc2hvdWxkIGhhdmUgZXZhbHVhdGVkIHRvIGZhbHNlLCBidXQgZGlkbid0IikKKyAgICAgICAgfQorICAgICAgICBsaXN0ID0gW10KKyAgICAgICAgaWYgKGxpc3QpIHsKKyAgICAgICAgICAgIGZhaWwoIltdIHNob3VsZCBoYXZlIGV2YWx1YXRlZCB0byBmYWxzZSwgYnV0IGRpZG4ndCIpCisgICAgICAgIH0KKyAgICAgICAgbGlzdCA9IFsxXQorICAgICAgICBpZiAobGlzdCkgeworICAgICAgICAgICAgLy8gT0sKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZhaWwoIltdIHNob3VsZCBoYXZlIGV2YWx1YXRlZCB0byBmYWxzZSwgYnV0IGRpZG4ndCIpCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBzZWUgYWxzbyBTdWJzY3JpcHRUZXN0CisgICAgdm9pZCB0ZXN0R2V0QXRSYW5nZSgpeworICAgICAgICBkZWYgbGlzdCA9IFswLDEsMiwzXQorICAgICAgICBhc3NlcnQgbGlzdFswLi4zXSA9PSBsaXN0ICAgICAgICAgICAsICdmdWxsIGxpc3QnCisgICAgICAgIGFzc2VydCBsaXN0WzAuLjBdID09IFswXSAgICAgICAgICAgICwgJ29uZSBlbGVtZW50IHJhbmdlJworICAgICAgICBhc3NlcnQgbGlzdFswLi48MF0gPT0gW10gICAgICAgICAgICAsICdlbXB0eSByYW5nZScKKyAgICAgICAgYXNzZXJ0IGxpc3RbMy4uMF0gPT0gWzMsMiwxLDBdICAgICAgLCAncmV2ZXJzZSByYW5nZScKKyAgICAgICAgYXNzZXJ0IGxpc3RbMy4uPDBdID09IFszLDIsMV0gICAgICAgLCAncmV2ZXJzZSBleGNsdXNpdmUgcmFuZ2UnCisgICAgICAgIGFzc2VydCBsaXN0Wy0yLi4tMV0gPT0gWzIsM10gICAgICAgICwgJ25lZ2F0aXZlIGluZGV4IHJhbmdlJworICAgICAgICBhc3NlcnQgbGlzdFstMi4uPC0xXSA9PSBbMl0gICAgICAgICAsICduZWdhdGl2ZSBpbmRleCByYW5nZSBleGNsdXNpdmUnCisgICAgICAgIGFzc2VydCBsaXN0Wy0xLi4tMl0gPT0gWzMsMl0gICAgICAgICwgJ25lZ2F0aXZlIGluZGV4IHJhbmdlIHJldmVyc2VkJworICAgICAgICBhc3NlcnQgbGlzdFstMS4uPC0yXSA9PSBbM10gICAgICAgICAsICduZWdhdGl2ZSBpbmRleCByYW5nZSByZXZlcnNlZCBleGNsdXNpdmUnICAvLyBhYWFhaGhoaGggIQorICAgICAgICBhc3NlcnQgbGlzdFswLi4tMV0gPT0gbGlzdCAgICAgICAgICAsICdwb3MgLSBuZWcgdmFsdWUnCisgICAgICAgIGFzc2VydCBsaXN0WzAuLjwtMV0gPT0gWzBdICAgICAgICAgICwgJ3BvcyAtIG5lZyB2YWx1ZSBleGNsdXNpdmUgLT4gZW1wdHknCisgICAgICAgIGFzc2VydCBsaXN0WzAuLjwtMl0gPT0gbGlzdCAgICAgICAgICwgJ3BvcyAtIG5lZyB2YWx1ZSBleGNsdXNpdmUgLT4gZnVsbCcKKyAgICAgICAgLy8gVE9ETyByZWluc3RhdGUgdGhpcyB0ZXN0CisgICAgICAgIC8vc2hvdWxkRmFpbCAoTnVsbFBvaW50ZXJFeGNlcHRpb24uY2xhc3MpICAgICAgeyBsaXN0W251bGxdIH0KKyAgICAgICAgc2hvdWxkRmFpbCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbi5jbGFzcykgeyBsaXN0WzUuLjZdIH0KKyAgICB9CisKKyAgICB2b2lkIHRlc3RQdXRBdFNwbGljZSgpeworICAgICAgICAvLyB1c3VhbCBhc3NpZ25tZW50cworICAgICAgICBkZWYgbGlzdCA9IFswLDEsMiwzXQorICAgICAgICBsaXN0WzEsMl0gPSBbMTEsMTJdCisgICAgICAgIGFzc2VydCBsaXN0ID09IFswLCAxMSwgMTIsIDMgXSAgICAgICwgJ3NhbWUgbGVuZ3RoIGFzc2lnbm1lbnQnCisgICAgICAgIGxpc3QgPSBbMCwxLDIsM10KKyAgICAgICAgbGlzdFsxLDFdID0gWzExXQorICAgICAgICBhc3NlcnQgbGlzdCA9PSBbMCwgMTEsIDIsIDMgXSAgICAgICAsICdsZW5ndGggMSBhc3NpZ25tZW50JworICAgICAgICBsaXN0ID0gWzAsMSwyLDNdCisgICAgICAgIGxpc3RbMSwwXSA9IFsgXQorICAgICAgICBhc3NlcnQgbGlzdCA9PSBbMCwgMSwgMiwgMyBdICAgICAgICAsICdsZW5ndGggMCBhc3NpZ25tZW50LCBlbXB0eSBzcGxpY2UnCisgICAgICAgIC8vIGFzc2lnbm1lbnRzIGF0IGJvdW5kcworICAgICAgICBsaXN0ID0gWzAsMSwyLDNdCisgICAgICAgIGxpc3RbMCwwXSA9IFsxMF0KKyAgICAgICAgYXNzZXJ0IGxpc3QgPT0gWzEwLCAxLCAyLCAzIF0gICAgICAgLCAnbGVmdCBib3JkZXIgYXNzaWdubWVudCcKKyAgICAgICAgbGlzdCA9IFswLDEsMiwzXQorICAgICAgICBsaXN0WzMsM10gPSBbMTNdCisgICAgICAgIGFzc2VydCBsaXN0ID09IFswLCAxLCAyLCAxMyBdICAgICAgICwgJ3JpZ2h0IGJvcmRlciBhc3NpZ25tZW50JworICAgICAgICAvLyBhc3NpZ25tZW50cyBvdXRzaWRlIGN1cnJlbnQgYm91bmRzCisgICAgICAgIGxpc3QgPSBbMCwxLDIsM10KKyAgICAgICAgbGlzdFstMSwtMV0gPSBbLTFdCisgICAgICAgIGFzc2VydCBsaXN0ID09IFswLCAxLCAyLCAtMV0gICAgICAgICwgJ2xlZnQgb2YgbGVmdCBib3JkZXInCisgICAgICAgIGxpc3QgPSBbMCwxLDIsM10KKyAgICAgICAgc2hvdWxkRmFpbCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbi5jbGFzcykgeworICAgICAgICAgICAgbGlzdFszLDRdID0gWzMsNF0KKyAgICAgICAgICAgIGFzc2VydCBsaXN0ID09IFswLCAxLCAyLCAzLCA0XQorICAgICAgICB9CisgICAgICAgIC8vIHN0cnVjdHVyYWwgY2hhbmdlcworICAgICAgICBsaXN0ID0gWzAsMSwyLDNdCisgICAgICAgIGxpc3RbMSwyXSA9IFsneCddCisgICAgICAgIGFzc2VydCBsaXN0ID09IFswLCAneCcsIDNdICAgICAgICAgICwgJ2NvbXBhY3RpbmcnCisgICAgICAgIGxpc3QgPSBbMCwxLDIsM10KKyAgICAgICAgbGlzdFsxLDJdID0gWyd4JywneCcsJ3gnXQorICAgICAgICBhc3NlcnQgbGlzdCA9PSBbMCwgJ3gnLCd4JywneCcsIDNdICAsICdleHRlbmRpbmcnCisgICAgfQorCisgICAgdm9pZCB0ZXN0UHV0QXRSYW5nZSgpeworICAgICAgICAvLyB1c3VhbCBhc3NpZ25tZW50cworICAgICAgICBkZWYgbGlzdCA9IFswLDEsMiwzXQorICAgICAgICBsaXN0WzEuLjJdID0gWzExLDEyXQorICAgICAgICBhc3NlcnQgbGlzdCA9PSBbMCwgMTEsIDEyLCAzIF0gICAgICAsICdzYW1lIGxlbmd0aCBhc3NpZ25tZW50JworICAgICAgICBsaXN0ID0gWzAsMSwyLDNdCisgICAgICAgIGxpc3RbMS4uMV0gPSBbMTFdCisgICAgICAgIGFzc2VydCBsaXN0ID09IFswLCAxMSwgMiwgMyBdICAgICAgICwgJ2xlbmd0aCAxIGFzc2lnbm1lbnQnCisgICAgICAgIGxpc3QgPSBbMCwxLDIsM10KKyAgICAgICAgbGlzdFswLi48MF0gPSBbXQorICAgICAgICBhc3NlcnQgbGlzdCA9PSBbMCwgMSwgMiwgMyBdICAgICAgICAsICdsZW5ndGggMCBhc3NpZ25tZW50LCBlbXB0eSBzcGxpY2UnCisgICAgICAgIC8vIGFzc2lnbm1lbnRzIGF0IGJvdW5kcworICAgICAgICBsaXN0ID0gWzAsMSwyLDNdCisgICAgICAgIGxpc3RbMC4uMF0gPSBbMTBdCisgICAgICAgIGFzc2VydCBsaXN0ID09IFsxMCwgMSwgMiwgMyBdICAgICAgICwgJ2xlZnQgYm9yZGVyIGFzc2lnbm1lbnQnCisgICAgICAgIGxpc3QgPSBbMCwxLDIsM10KKyAgICAgICAgbGlzdFszLi4zXSA9IFsxM10KKyAgICAgICAgYXNzZXJ0IGxpc3QgPT0gWzAsIDEsIDIsIDEzIF0gICAgICAgLCAncmlnaHQgYm9yZGVyIGFzc2lnbm1lbnQnCisgICAgICAgIC8vIGFzc2lnbm1lbnRzIG91dHNpZGUgY3VycmVudCBib3VuZHMKKyAgICAgICAgbGlzdCA9IFswLDEsMiwzXQorICAgICAgICBsaXN0Wy0xLi4tMV0gPSBbLTFdCisgICAgICAgIGFzc2VydCBsaXN0ID09IFswLCAxLCAyLCAtMV0gICAgICAgICwgJ2xlZnQgb2YgbGVmdCBib3JkZXInCisgICAgICAgIGxpc3QgPSBbMCwxLDIsM10KKyAgICAgICAgbGlzdFszLi40XSA9IFszLDRdCisgICAgICAgIGFzc2VydCBsaXN0ID09IFswLCAxLCAyLCAzLCA0XQorICAgICAgICAvLyBzdHJ1Y3R1cmFsIGNoYW5nZXMKKyAgICAgICAgbGlzdCA9IFswLDEsMiwzXQorICAgICAgICBsaXN0WzEuLjJdID0gWyd4J10KKyAgICAgICAgYXNzZXJ0IGxpc3QgPT0gWzAsICd4JywgM10gICAgICAgICAgLCAnY29tcGFjdGluZycKKyAgICAgICAgbGlzdCA9IFswLDEsMiwzXQorICAgICAgICBsaXN0WzEuLjJdID0gWyd4JywneCcsJ3gnXQorICAgICAgICBhc3NlcnQgbGlzdCA9PSBbMCwgJ3gnLCd4JywneCcsIDNdICAsICdleHRlbmRpbmcnCisgICAgfQorCisgICAgdm9pZCB0ZXN0Q3JhenlQdXRBdFJhbmdlKCl7CisgICAgICAgIGRlZiBsaXN0ID0gW10KKyAgICAgICAgbGlzdFswLi48MF0gPSBbMCwxLDIsM10KKyAgICAgICAgYXNzZXJ0IGxpc3QgPT0gWzAsIDEsIDIsIDMgXSAgICAgICAgLCAnZmlsbCBieSBlbXB0eSBSYW5nZScKKyAgICAgICAgbGlzdCA9IFswLDEsMiwzXQorICAgICAgICBsaXN0WzMuLjBdID0gW10KKyAgICAgICAgYXNzZXJ0IGxpc3QgPT0gW10gICAgICAgICAgICAgICAgICAgLCAnZGVsZXRlIGJ5IHJldmVyc2UgUmFuZ2UnCisgICAgICAgIGxpc3QgPSBbMCwxLDIsM10KKyAgICAgICAgbGlzdFstNC4uLTFdID0gW10KKyAgICAgICAgYXNzZXJ0IGxpc3QgPT0gW10gICAgICAgICAgICAgICAgICAgLCAnZGVsZXRlIGJ5IG5lZ2F0aXYgUmFuZ2UnCisgICAgICAgIGxpc3QgPSBbMCwxLDIsM10KKyAgICAgICAgbGlzdFswLi4tMV0gPSBbXQorICAgICAgICBhc3NlcnQgbGlzdCA9PSBbXSAgICAgICAgICAgICAgICAgICAsICdkZWxldGUgYnkgcG9zLW5lZ2F0aXYgUmFuZ2UnCisgICAgfQorCisgICAgLy8gR1JPT1ZZLTExMjgKKyAgICB2b2lkIHRlc3RBc1N5bmNocm9uaXplZCgpIHsKKyAgICAgICAgZGVmIHN5bmNsaXN0ID0gW10uYXNTeW5jaHJvbml6ZWQoKSA8PCAxCisgICAgICAgIGFzc2VydCBzeW5jbGlzdCA9PSBbMV0KKyAgICB9CisKKyAgICAvLyBHUk9PVlktMTEyOAorICAgIHZvaWQgdGVzdEFzSW1tdXRhYmxlKCkgeworICAgICAgICBkZWYgaW1tbGlzdCA9IFsxLDIsM10uYXNJbW11dGFibGUoKQorICAgICAgICBhc3NlcnQgaW1tbGlzdCA9PSBbMSwyLDNdCisgICAgICAgIGRlZiB0ZXN0bGlzdCA9IFsnYScsJ2InLCdjJywnZCcsJ2UnXQorICAgICAgICBhc3NlcnQgdGVzdGxpc3RbaW1tbGlzdF0gPT0gWydiJywnYycsJ2QnXQorICAgICAgICBhc3NlcnQgaW1tbGlzdFswXSA9PSAxCisgICAgICAgIGFzc2VydCBpbW1saXN0WzAuLi0xXSA9PSBpbW1saXN0CisgICAgICAgIHNob3VsZEZhaWwoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uY2xhc3MpeworICAgICAgICAgICAgaW1tbGlzdCA8PCAxCisgICAgICAgIH0KKyAgICAgICAgc2hvdWxkRmFpbChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi5jbGFzcyl7CisgICAgICAgICAgICBpbW1saXN0WzAuLjwwXSA9IFswXQorICAgICAgICB9CisgICAgICAgIHNob3VsZEZhaWwoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uY2xhc3MpeworICAgICAgICAgICAgaW1tbGlzdFswXSA9IDEKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvTGl0ZXJhbFR5cGVzVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0xpdGVyYWxUeXBlc1Rlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZmY4OGIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0xpdGVyYWxUeXBlc1Rlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTQ1IEBACitwYWNrYWdlIGdyb292eQorCisvKioKKyAqIFRlc3QgbnVtZXJpYyBsaXRlcmFsIHR5cGVzICh3aXRoIGFuZCB3aXRob3V0IHN1ZmZpeGVzKQorICogQHNlZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5wYXJzZXIvQVNUQnVpbGRlciNjcmVhdGVJbnRlZ3JhbE51bWJlcigpCisgKiBAc2VlIG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LnBhcnNlci9BU1RCdWlsZGVyI2NyZWF0ZURlY2ltYWxOdW1iZXIoKQorICoKKyAqIEBhdXRob3IgQnJpYW4gTGFyc29uCisgKi8KK2NsYXNzIExpdGVyYWxUeXBlc1Rlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICB2b2lkIHRlc3RJbnRlZ3JhbCgpIHsKKyAgICAgICAgZGVmIHggPSA0MjsKKyAgICAgICAgYXNzZXJ0IHggaW5zdGFuY2VvZiBJbnRlZ2VyOworCisgICAgICAgIHggPSA0Mkk7CisgICAgICAgIGFzc2VydCB4IGluc3RhbmNlb2YgSW50ZWdlcjsKKworICAgICAgICB4ID0gNDJpOworICAgICAgICBhc3NlcnQgeCBpbnN0YW5jZW9mIEludGVnZXI7CisKKyAgICAgICAgeCA9IDQyTDsKKyAgICAgICAgYXNzZXJ0IHggaW5zdGFuY2VvZiBMb25nOworCisgICAgICAgIHggPSA0Mkc7CisgICAgICAgIGFzc2VydCB4IGluc3RhbmNlb2YgQmlnSW50ZWdlcjsKKworICAgICAgICB4ID0gMHhGRjsgLy9IZXgKKyAgICAgICAgYXNzZXJ0IHggaW5zdGFuY2VvZiBJbnRlZ2VyOworICAgICAgICBhc3NlcnQgeCA9PSBuZXcgSW50ZWdlcigiMjU1Iik7CisKKyAgICAgICAgeCA9IDB4RkZMOyAvL0hleAorICAgICAgICBhc3NlcnQgeCBpbnN0YW5jZW9mIExvbmc7CisgICAgICAgIGFzc2VydCB4ID09IG5ldyBMb25nKCIyNTUiKTsKKworICAgICAgICB4ID0gMHhGRkc7IC8vSGV4CisgICAgICAgIGFzc2VydCB4IGluc3RhbmNlb2YgQmlnSW50ZWdlcjsKKyAgICAgICAgYXNzZXJ0IHggPT0gbmV3IEJpZ0ludGVnZXIoIkZGIiwxNik7CisKKyAgICAgICAgeCA9IDB4OTAwMDAwMDAwMDAwMDAwMDsKKyAgICAgICAgYXNzZXJ0IHggaW5zdGFuY2VvZiBCaWdJbnRlZ2VyOworICAgICAgICBhc3NlcnQgeCA9PSBuZXcgQmlnSW50ZWdlcigiOTAwMDAwMDAwMDAwMDAwMCIsMTYpOworCisgICAgICAgIHggPSAwNzc7IC8vb2N0YWwKKyAgICAgICAgYXNzZXJ0IHggaW5zdGFuY2VvZiBJbnRlZ2VyOworICAgICAgICBhc3NlcnQgeCA9PSBuZXcgSW50ZWdlcigiNjMiKTsKKworICAgICAgICB4ID0gMDc3bDsgLy9vY3RhbAorICAgICAgICBhc3NlcnQgeCBpbnN0YW5jZW9mIExvbmc7CisgICAgICAgIGFzc2VydCB4ID09IG5ldyBMb25nKCI2MyIpOworCisgICAgICAgIHggPSAwNzdnOyAvL29jdGFsCisgICAgICAgIGFzc2VydCB4IGluc3RhbmNlb2YgQmlnSW50ZWdlcjsKKyAgICAgICAgYXNzZXJ0IHggPT0gbmV3IEJpZ0ludGVnZXIoIjc3Iiw4KTsKKworICAgICAgICB4ID0gMjE0NzQ4MzY0NzsgICAgICAgICAgIC8vIG1heCBpbnRlZ2VyIHZhbHVlCisgICAgICAgIGFzc2VydCB4IGluc3RhbmNlb2YgSW50ZWdlcjsKKyAgICAgICAgYXNzZXJ0IHggPT0gbmV3IEludGVnZXIoIjIxNDc0ODM2NDciKTsKKworICAgICAgICB4ID0gLTIxNDc0ODM2NDg7ICAgICAgICAgIC8vIG1pbiBpbnRlZ2VyIGNvbnN0YW50CisgICAgICAgIGFzc2VydCB4IDwgMAorICAgICAgICBhc3NlcnQgeCA9PSBuZXcgSW50ZWdlcigiLTIxNDc0ODM2NDgiKTsKKyAgICAgICAgYXNzZXJ0IHggaW5zdGFuY2VvZiBJbnRlZ2VyLCB4LmNsYXNzOworCisgICAgICAgIHggPSAtMjE0NzQ4MzY0OTsgICAgICAgICAgLy8gbWluIGludGVnZXIgdmFsdWUgLSAxCisgICAgICAgIGFzc2VydCB4ID09IG5ldyBMb25nKCItMjE0NzQ4MzY0OSIpOworICAgICAgICBhc3NlcnQgeCBpbnN0YW5jZW9mIExvbmc7CisKKyAgICAgICAgeCA9IDIxNDc0ODM2NDg7ICAgICAgICAgICAvLyAxICsgbWF4IGludGVnZXIgdmFsdWUKKyAgICAgICAgYXNzZXJ0IHggPT0gbmV3IExvbmcoIjIxNDc0ODM2NDgiKTsKKyAgICAgICAgYXNzZXJ0IHggaW5zdGFuY2VvZiBMb25nOworCisgICAgICAgIHggPSA5MjIzMzcyMDM2ODU0Nzc1ODA3OyAgLy8gbWF4IGxvbmcgdmFsdWUKKyAgICAgICAgYXNzZXJ0IHggPT0gbmV3IExvbmcoIjkyMjMzNzIwMzY4NTQ3NzU4MDciKTsKKyAgICAgICAgYXNzZXJ0IHggaW5zdGFuY2VvZiBMb25nOworCisgICAgICAgIHggPSAtOTIyMzM3MjAzNjg1NDc3NTgwODsgLy8gbWluIGxvbmcgdmFsdWUKKyAgICAgICAgYXNzZXJ0IHggPT0gbmV3IExvbmcoIi05MjIzMzcyMDM2ODU0Nzc1ODA4Iik7CisgICAgICAgIGFzc2VydCB4IGluc3RhbmNlb2YgTG9uZzsKKworICAgICAgICB4ID0gLTkyMjMzNzIwMzY4NTQ3NzU4MDk7IC8vIG1pbiBsb25nIHZhbHVlIC0gMQorICAgICAgICBhc3NlcnQgeCA9PSBuZXcgQmlnSW50ZWdlcigiLTkyMjMzNzIwMzY4NTQ3NzU4MDkiKTsKKyAgICAgICAgYXNzZXJ0IHggaW5zdGFuY2VvZiBCaWdJbnRlZ2VyOworCisgICAgICAgIHggPSA5MjIzMzcyMDM2ODU0Nzc1ODA4OyAgLy8gMSArIG1heCBsb25nIHZhbHVlCisgICAgICAgIGFzc2VydCB4ID09IG5ldyBCaWdJbnRlZ2VyKCI5MjIzMzcyMDM2ODU0Nzc1ODA4Iik7CisgICAgICAgIGFzc2VydCB4IGluc3RhbmNlb2YgQmlnSW50ZWdlcjsKKyAgICB9CisKKyAgICB2b2lkIHRlc3REZWNpbWFsKCkgeworICAgICAgICBkZWYgeCA9IDMuMjsKKyAgICAgICAgYXNzZXJ0IHggaW5zdGFuY2VvZiBCaWdEZWNpbWFsOworICAgICAgICBhc3NlcnQgeCA9PSBuZXcgQmlnRGVjaW1hbCgiMy4yIik7CisKKyAgICAgICAgeCA9IDMuMkc7CisgICAgICAgIGFzc2VydCB4IGluc3RhbmNlb2YgQmlnRGVjaW1hbDsKKyAgICAgICAgYXNzZXJ0IHggPT0gbmV3IEJpZ0RlY2ltYWwoIjMuMiIpOworCisgICAgICAgIHggPSAzLjJnOworICAgICAgICBhc3NlcnQgeCBpbnN0YW5jZW9mIEJpZ0RlY2ltYWw7CisgICAgICAgIGFzc2VydCB4ID09IG5ldyBCaWdEZWNpbWFsKCIzLjIiKTsKKworICAgICAgICB4ID0gLTMuMjsKKyAgICAgICAgYXNzZXJ0IHggaW5zdGFuY2VvZiBCaWdEZWNpbWFsOworICAgICAgICBhc3NlcnQgeCA9PSBuZXcgQmlnRGVjaW1hbCgiLTMuMiIpOworCisgICAgICAgIHggPSAzLjJEOworICAgICAgICBhc3NlcnQgeCBpbnN0YW5jZW9mIERvdWJsZTsKKyAgICAgICAgYXNzZXJ0IHggPT0gbmV3IERvdWJsZSgiMy4yIik7CisKKyAgICAgICAgeCA9IC0zLjJkOworICAgICAgICBhc3NlcnQgeCBpbnN0YW5jZW9mIERvdWJsZTsKKyAgICAgICAgYXNzZXJ0IHggPT0gbmV3IERvdWJsZSgiLTMuMiIpOworCisgICAgICAgIHggPSAzLjJGOworICAgICAgICBhc3NlcnQgeCBpbnN0YW5jZW9mIEZsb2F0OworICAgICAgICBhc3NlcnQgeCA9PSBuZXcgRmxvYXQoIjMuMiIpOworCisgICAgICAgIHggPSAtMy4yZjsKKyAgICAgICAgYXNzZXJ0IHggaW5zdGFuY2VvZiBGbG9hdDsKKyAgICAgICAgYXNzZXJ0IHggPT0gbmV3IEZsb2F0KCItMy4yIik7CisgICAgfQorCisgICAgdm9pZCB0ZXN0RXhwb25lbnRpYWwoKSB7CisgICAgICAgIGRlZiB4ID0gMy4xNDE1OTI2NTM1ZTQyOworICAgICAgICBhc3NlcnQgeCBpbnN0YW5jZW9mIEJpZ0RlY2ltYWw7CisgICAgICAgIGFzc2VydCB4ID09IG5ldyBCaWdEZWNpbWFsKCIzLjE0MTU5MjY1MzVlNDIiKTsKKworICAgICAgICB4ID0gMy4yZSsyOworICAgICAgICBhc3NlcnQgeCBpbnN0YW5jZW9mIEJpZ0RlY2ltYWw7CisgICAgICAgIGFzc2VydCB4ID09IG5ldyBCaWdEZWNpbWFsKCIzLjJlKzIiKTsKKworICAgICAgICB4ID0gMy4yZS0yOworICAgICAgICBhc3NlcnQgeCBpbnN0YW5jZW9mIEJpZ0RlY2ltYWw7CisgICAgICAgIGFzc2VydCB4ID09IG5ldyBCaWdEZWNpbWFsKCIzLjJlLTIiKTsKKworICAgICAgICB4ID0gMy4yZTJkOworICAgICAgICBhc3NlcnQgeCBpbnN0YW5jZW9mIERvdWJsZTsKKyAgICAgICAgYXNzZXJ0IHggPT0gbmV3IERvdWJsZSgiMy4yZTIiKTsKKworICAgICAgICB4ID0gMy4yZTJmOworICAgICAgICBhc3NlcnQgeCBpbnN0YW5jZW9mIEZsb2F0OworICAgICAgICBhc3NlcnQgeCA9PSBuZXcgRmxvYXQoIjMuMmUyIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9MaXR0bGVDbG9zdXJlVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0xpdHRsZUNsb3N1cmVUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGE5ZDZjCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9MaXR0bGVDbG9zdXJlVGVzdC5ncm9vdnkKQEAgLTAsMCArMSw4IEBACitwYWNrYWdlIGdyb292eQorCitjbGFzcyBMaXR0bGVDbG9zdXJlVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIHZvaWQgdGVzdENsb3N1cmUoKSB7CisgICAgICAgIGRlZiBibG9jayA9IHt4LT4gcmV0dXJuIHggPiA1fQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvTG9jYWxGaWVsZFRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9Mb2NhbEZpZWxkVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJhMzgzNQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvTG9jYWxGaWVsZFRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTMgQEAKK3BhY2thZ2UgZ3Jvb3Z5CisKK2NsYXNzIExvY2FsRmllbGRUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBkZWYgeAorCQorICAgIHZvaWQgdGVzdEFzc2VydCgpIHsKKyAgICAgICAgdGhpcy54ID0gImFiYyIKKworICAgICAgICBhc3NlcnQgdGhpcy54ID09ICJhYmMiCisgICAgICAgIGFzc2VydCB0aGlzLnggIT0gImRlZiIKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0xvY2FsUHJvcGVydHlUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvTG9jYWxQcm9wZXJ0eVRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlNTliZjgKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0xvY2FsUHJvcGVydHlUZXN0Lmdyb292eQpAQCAtMCwwICsxLDIwIEBACitwYWNrYWdlIGdyb292eQorCitjbGFzcyBMb2NhbFByb3BlcnR5VGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIGRlZiB4CisgICAgCisJdm9pZCB0ZXN0Tm9ybWFsUHJvcGVydHlBY2Nlc3MoKSB7CisJICAgIHggPSAiYWJjIgorCSAgICAKKwkgICAgYXNzZXJ0IHggPT0gImFiYyIKKyAgICAgICAgYXNzZXJ0IHggIT0gImRlZiIKKwl9CisJCisJdm9pZCB0ZXN0UHJvcGVydHlXaXRoVGhpcygpIHsKKyAgICAgICAgdGhpcy54ID0gImFiYyIKKwkgICAgCisJICAgIGFzc2VydCB0aGlzLnggPT0gImFiYyIKKwkgICAgYXNzZXJ0IHRoaXMueCAhPSAiZGVmIgorCX0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvTG9jYWxWYXJpYWJsZVRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9Mb2NhbFZhcmlhYmxlVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU1MzJkNAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvTG9jYWxWYXJpYWJsZVRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMjUgQEAKK3BhY2thZ2UgZ3Jvb3Z5CisKK2NsYXNzIExvY2FsVmFyaWFibGVUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCB0ZXN0QXNzZXJ0KCkgeworICAgICAgICBkZWYgeCA9ICJhYmMiCisKKyAgICAgICAgYXNzZXJ0IHggIT0gImZvbyIKKyAgICAgICAgYXNzZXJ0IHggIT0gIG51bGwKKyAgICAgICAgYXNzZXJ0IHggIT0gImRlZiIKKyAgICAgICAgYXNzZXJ0IHggPT0gImFiYyIKKyAgICAgICAgCisgICAgICAgIGFzc2VydCB4LmVxdWFscygiYWJjIikKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0VW5rbm93blZhcmlhYmxlKCkgeworCisgICAgICAgIHNob3VsZEZhaWwgeworICAgICAgICAgICAgZGVmIHNoZWxsID0gbmV3IEdyb292eVNoZWxsKCkKKyAgICAgICAgICAgIHNoZWxsLmV2YWx1YXRlICIiIgorICAgICAgICAgICAgICAgIGRlZiB5ID0geAorICAgICAgICAgICAgIiIiCisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0xvZ1Rlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9Mb2dUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzQzYWIxCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9Mb2dUZXN0Lmdyb292eQpAQCAtMCwwICsxLDI2IEBACitwYWNrYWdlIGdyb292eQorCisvKiogCisgKiBUZXN0cyB0aGUgdXNlIG9mIEdyb292eUxvZworICogCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitjbGFzcyBMb2dUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCB0ZXN0VXNlTG9nKCkgeworICAgICAgICBkZWYgZmlsZSA9ICJzb21ldGhpbmcudHh0IgorCisgICAgICAgIGRlZiBsb2cgPSBHcm9vdnlMb2cubmV3SW5zdGFuY2UoZ2V0Q2xhc3MoKSkKKyAgICAgICAgCisgICAgICAgIGxvZy5zdGFydGluZygiSGV5IEknbSBzdGFydGluZyB1cC4uLiIpCisgICAgICAgIAorICAgICAgICBsb2cub3BlbkZpbGUoIkFtIGFib3V0IHRvIG9wZW4gZmlsZSAke2ZpbGV9IikKKworICAgICAgICAvLyAuLi4KKworICAgICAgICBsb2cuY2xvc2VGaWxlKCJIYXZlIGNsb3NlZCB0aGUgZmlsZSAke2ZpbGV9IikKKworICAgICAgICBsb2cuc3RvcHBpbmcoIi4uRmluaXNoZWQiKQorCX0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvTG9naWNUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvTG9naWNUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmQyYTI1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9Mb2dpY1Rlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsNzcgQEAKK3BhY2thZ2UgZ3Jvb3Z5CisKK2NsYXNzIExvZ2ljVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIHZvaWQgdGVzdEFuZFdpdGhUcnVlKCkgeworCisgICAgICAgIGRlZiB4ID0gZmFsc2UKKyAgICAgICAgZGVmIG4gPSAyCisgICAgICAgIAorICAgICAgICBpZiAoIG4gPiAxICYmIG4gPCAxMCApIHsKKyAgICAgICAgICAgIHggPSB0cnVlCisgICAgICAgIH0KKworICAgICAgICBhc3NlcnQgeCA9PSB0cnVlCisgICAgfQorCisgICAgdm9pZCB0ZXN0QW5kV2l0aEZhbHNlKCkgeworCisgICAgICAgIGRlZiB4ID0gZmFsc2UKKyAgICAgICAgZGVmIG4gPSAyMAorICAgICAgICAKKyAgICAgICAgaWYgKCBuID4gMSAmJiBuIDwgMTAgKSB7CisgICAgICAgICAgICB4ID0gdHJ1ZQorICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0IHggPT0gZmFsc2UKKworICAgICAgICBuID0gMAorICAgICAgICAKKyAgICAgICAgaWYgKCBuID4gMSAmJiBuIDwgMTAgKSB7CisgICAgICAgICAgICB4ID0gdHJ1ZQorICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0IHggPT0gZmFsc2UKKyAgICB9CisKKyAgICB2b2lkIHRlc3RPcldpdGhUcnVlKCkgeworCisgICAgICAgIGRlZiB4ID0gZmFsc2UKKyAgICAgICAgZGVmIG4gPSAyCisgICAgICAgIAorICAgICAgICBpZiAoIG4gPiAxIHx8IG4gPCAxMCApIHsKKyAgICAgICAgICAgIHggPSB0cnVlCisgICAgICAgIH0KKworICAgICAgICBhc3NlcnQgeCA9PSB0cnVlCisKKyAgICAgICAgeCA9IGZhbHNlCisgICAgICAgIG4gPSAwCisgICAgICAgIAorICAgICAgICBpZiAoIG4gPiAxIHx8IG4gPT0gMCApIHsKKyAgICAgICAgICAgIHggPSB0cnVlCisgICAgICAgIH0KKworICAgICAgICBhc3NlcnQgeCA9PSB0cnVlCisgICAgfQorCisgICAgdm9pZCB0ZXN0T3JXaXRoRmFsc2UoKSB7CisKKyAgICAgICAgZGVmIHggPSBmYWxzZQorICAgICAgICBkZWYgbiA9IDExCisgICAgICAgIAorICAgICAgICBpZiAoIG4gPCAxMCB8fCBuID4gMjAgKSB7CisgICAgICAgICAgICB4ID0gdHJ1ZQorICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0IHggPT0gZmFsc2UKKworICAgICAgICBuID0gMTEKKyAgICAgICAgCisgICAgICAgIGlmICggbiA8IDEwIHx8IG4gPiAyMCApIHsKKyAgICAgICAgICAgIHggPSB0cnVlCisgICAgICAgIH0KKyAgICAKKyAgICAgICAgYXNzZXJ0IHggPT0gZmFsc2UKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L0xvb3BCcmVha1Rlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9Mb29wQnJlYWtUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWM4YTcxCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9Mb29wQnJlYWtUZXN0Lmdyb292eQpAQCAtMCwwICsxLDUzIEBACitwYWNrYWdlIGdyb292eQorCitjbGFzcyBMb29wQnJlYWtUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCB0ZXN0V2hpbGVXaXRoQnJlYWsoKSB7CisgICAgICAgIGRlZiB4ID0gMAorICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgaWYgKHggPT0gNSkgeworICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICB9CisgICAgICAgICAgICArK3gKKworICAgICAgICAgICAgYXNzZXJ0IHggPCAxMCAsICJTaG91bGQgbmV2ZXIgZ2V0IGhlcmUiCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHByaW50bG4gIndvcmtlZDogd2hpbGUgY29tcGxldGVkIHdpdGggdmFsdWUgJHt4fSIKKyAgICB9CisgICAgCisgICAgLyoqCisKKyAgICAgIFdlIGN1cnJlbnRseSBkbyBub3Qgc3VwcG9ydCBkbyAuLi4gd2hpbGUgaW4gdGhlIEpTUiBzeW50YXgKKworICAgIHZvaWQgdGVzdERvV2hpbGVXaXRoQnJlYWsoKSB7CisgICAgICAgIGRlZiB4ID0gMAorICAgICAgICBkbyB7CisgICAgICAgICAgICAvL3ByaW50bG4gImluIGRvLXdoaWxlIGxvb3AgYW5kIHggPSAke3h9IgorCisgICAgICAgICAgICBpZiAoeCA9PSA1KSB7CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsreAorCisgICAgICAgICAgICBhc3NlcnQgeCA8IDEwICwgIlNob3VsZCBuZXZlciBnZXQgaGVyZSIKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAodHJ1ZSkKKworICAgICAgICBwcmludGxuICJ3b3JrZWQ6IGRvLXdoaWxlIGNvbXBsZXRlZCB3aXRoIHZhbHVlICR7eH0iCisgICAgfQorICAgICovCisKKyAgICB2b2lkIHRlc3RGb3JXaXRoQnJlYWsoKSB7CisgICAgICAgIGRlZiByZXR1cm5WYWx1ZQorICAgICAgICBmb3IgKHggaW4gMC4uMjApIHsKKyAgICAgICAgICAgIGlmICh4ID09IDUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IHgKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0IHggPCAxMCAsICJTaG91bGQgbmV2ZXIgZ2V0IGhlcmUiCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHByaW50bG4gIndvcmtlZDogZm9yIGxvb3AgY29tcGxldGVkIHdpdGggdmFsdWUgJHtyZXR1cm5WYWx1ZX0iCisgICAgfQorIH0KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvTWFwQ29uc3RydWN0aW9uVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L01hcENvbnN0cnVjdGlvblRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNTNjNTUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L01hcENvbnN0cnVjdGlvblRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsNTIgQEAKK3BhY2thZ2UgZ3Jvb3Z5CisKKy8qKiAKKyAqIFRlc3RzIGNyZWF0aW5nIE1hcHMgaW4gR3Jvb3Z5CisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK2NsYXNzIE1hcENvbnN0cnVjdGlvblRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICB2b2lkIHRlc3RNYXAoKSB7CisgICAgICAgIGRlZiBtID0gWyAxIDogJ2FiYycsIDIgOiAnZGVmJywgMyA6ICd4eXonIF0KKworICAgICAgICBwcmludGxuKG0pCisKKyAgICAgICAgZGVmIG10b28gPSBbIDEgOiBbICJpbm5lcktleSIgOiAiaW5uZXJWYWx1ZSIgXSwgMiA6IG0gXQorCisgICAgICAgIHByaW50bG4obXRvbykKKworICAgICAgICBhc3NlcnRNYXAobSkKKyAgICB9CisKKyAgICBkZWYgdGVzdE1hcEFzUGFyYW1ldGVyKCkgeworICAgICAgICBhc3NlcnRNYXAoWyAxIDogJ2FiYycsIDIgOiAnZGVmJywgMyA6ICd4eXonIF0pCisgICAgfQorCisgICAgZGVmIHRlc3RNYXBWaWFIYXNoTWFwKCkgeworICAgICAgICBkZWYgbSA9IG5ldyBIYXNoTWFwKCkKKyAgICAgICAgbS5wdXQoMSwgJ2FiYycpCisgICAgICAgIG0ucHV0KDIsICdkZWYnKQorICAgICAgICBtLnB1dCgzLCAneHl6JykKKyAgICAgICAgYXNzZXJ0TWFwKG0pCisgICAgfQorCisgICAgdm9pZCBhc3NlcnRNYXAobSkgeworICAgICAgICBhc3NlcnQgbSBpbnN0YW5jZW9mIE1hcAorICAgICAgICAvLyBkbyBub3QgdGVzdCB0aGUgZmluYWwgdHlwZSwgaS5lLiBhc3N1bWlvbmcgbSBpcyBhIEhhc2hNYXAKKworICAgICAgICBkZWYgcmVzdWx0ID0gMAorICAgICAgICBkZWYgdGV4dCA9ICIiCisgICAgICAgIGZvciAoIGUgaW4gbSApIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIGUua2V5CisgICAgICAgICAgICB0ZXh0ID0gdGV4dCArIGUudmFsdWUKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQgcmVzdWx0ID09IDYKKyAgICAgICAgYXNzZXJ0IHRleHQgPT0gImFiY2RlZnh5eiIKKwkgICAgCisgICAgICAgIGFzc2VydCBtLnNpemUoKSA9PSAzCisKKyAgICAgICAgYXNzZXJ0IG1bMl0gPT0gJ2RlZicKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L01hcFByb3BlcnR5VGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L01hcFByb3BlcnR5VGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ0Y2Y0NwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvTWFwUHJvcGVydHlUZXN0Lmdyb292eQpAQCAtMCwwICsxLDU0IEBACitwYWNrYWdlIGdyb292eQorCisvKiogCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitjbGFzcyBNYXBQcm9wZXJ0eVRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICB2b2lkIHRlc3RHZXRBbmRTZXRQcm9wZXJ0aWVzKCkgeworICAgICAgICBkZWYgbSA9IFsgJ25hbWUnIDogJ0phbWVzJywgJ2xvY2F0aW9uJyA6ICdMb25kb24nLCAnaWQnOjEgXQorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IG0ubmFtZSA9PSAnSmFtZXMnCisgICAgICAgIGFzc2VydCBtLmxvY2F0aW9uID09ICdMb25kb24nCisgICAgICAgIGFzc2VydCBtLmlkID09IDEKKyAgICAgICAgCisgICAgICAgIG0ubmFtZSA9ICdCb2InCisgICAgICAgIG0ubG9jYXRpb24gPSAnQXRsYW50YScKKyAgICAgICAgbS5pZCA9IDIKKyAgICAgICAgCisgICAgICAgIGFzc2VydCBtLm5hbWUgPT0gJ0JvYicKKyAgICAgICAgYXNzZXJ0IG0ubG9jYXRpb24gPT0gJ0F0bGFudGEnCisgICAgICAgIGFzc2VydCBtLmlkID09IDIKKyAgICB9CisKKyAgICB2b2lkIHRlc3RTZXR1cEFuZEVtcHR5TWFwKCkgeworICAgICAgICBkZWYgbSA9IFs6XQorICAgICAgICAKKyAgICAgICAgbS5uYW1lID0gJ0JvYicKKyAgICAgICAgbS5sb2NhdGlvbiA9ICdBdGxhbnRhJworICAgICAgICBtLmlkID0gMgorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IG0ubmFtZSA9PSAnQm9iJworICAgICAgICBhc3NlcnQgbS5sb2NhdGlvbiA9PSAnQXRsYW50YScKKyAgICAgICAgYXNzZXJ0IG0uaWQgPT0gMgorICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RNYXBTdWJjbGFzc2luZygpIHsKKyAgICAgICAgZGVmIGMgPSBuZXcgTXlDbGFzcygpCisKKyAgICAgICAgYy5pZCA9ICJoZWxsbyIKKyAgICAgICAgYy5jbGFzcyA9IDEKKyAgICAgICAgYy5teU1ldGhvZCgpCisgICAgICAgIGFzc2VydCBjLmlkID09ICJoZWxsbyIKKyAgICAgICAgYXNzZXJ0IGMuY2xhc3MgPT0gMQorICAgICAgICBhc3NlcnQgYy5nZXRDbGFzcygpICE9IDEKKyAgICB9Cit9CisKK2NsYXNzIE15Q2xhc3MgZXh0ZW5kcyBIYXNoTWFwIHsKKyAgICBkZWYgbXlNZXRob2QoKSB7CisgICAgICAgIGFzc2VydCBpZCA9PSAiaGVsbG8iCisgICAgICAgIGFzc2VydCB0aGlzLmNsYXNzID09IDEKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L01hcFRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9NYXBUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmNkMGEwCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9NYXBUZXN0Lmdyb292eQpAQCAtMCwwICsxLDExMCBAQAorcGFja2FnZSBncm9vdnkKKworY2xhc3MgTWFwVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIHZvaWQgdGVzdE1hcCgpIHsKKworICAgICAgICBkZWYgbSA9IFsxOidvbmUnLCAnMic6J3R3bycsIDM6J3RocmVlJ10KKworICAgICAgICBhc3NlcnQgbS5zaXplKCkgPT0gMworICAgICAgICBhc3NlcnQgbS5nZXQoMSkgPT0gJ29uZScKKyAgICAgICAgYXNzZXJ0IG0uZ2V0KCcyJykgPT0gJ3R3bycKKyAgICAgICAgYXNzZXJ0IG0uZ2V0KDMpID09ICd0aHJlZScKKyAgICAgICAgCisgICAgICAgIGFzc2VydCBtLmNvbnRhaW5zS2V5KDEpCisgICAgICAgIGFzc2VydCBtLmNvbnRhaW5zS2V5KCcyJykKKyAgICAgICAgYXNzZXJ0IG0uY29udGFpbnNLZXkoMykKKworICAgICAgICBhc3NlcnQgbS5jb250YWluc1ZhbHVlKCdvbmUnKQorICAgICAgICBhc3NlcnQgbS5jb250YWluc1ZhbHVlKCd0d28nKQorICAgICAgICBhc3NlcnQgbS5jb250YWluc1ZhbHVlKCd0aHJlZScpCisKKyAgICAgICAgYXNzZXJ0IG0ua2V5U2V0KCkuc2l6ZSgpID09IDMKKyAgICAgICAgYXNzZXJ0IG0udmFsdWVzKCkuc2l6ZSgpID09IDMKKyAgICAgICAgYXNzZXJ0IG0ua2V5U2V0KCkuY29udGFpbnMoMSkKKyAgICAgICAgYXNzZXJ0IG0udmFsdWVzKCkuY29udGFpbnMoJ29uZScpCisKKyAgICAgICAgbS5yZW1vdmUoMSkKKyAgICAgICAgbS5yZW1vdmUoJzInKQorCisgICAgICAgIGFzc2VydCBtLnNpemUoKSA9PSAxCisgICAgICAgIGFzc2VydCBtLmdldCgnMScpID09IG51bGwKKyAgICAgICAgYXNzZXJ0IG0uZ2V0KCcyJykgPT0gbnVsbAorICAgICAgICAKKyAgICAgICAgbS5wdXQoJ2NoZWVzZScsICdjaGVkZGFyJykKKworICAgICAgICBhc3NlcnQgbS5zaXplKCkgPT0gMgorCisgICAgICAgIGFzc2VydCBtLmNvbnRhaW5zS2V5KCJjaGVlc2UiKQorICAgICAgICBhc3NlcnQgbS5jb250YWluc1ZhbHVlKCJjaGVkZGFyIikKKworCisgICAgICAgIGlmICggbS5jb250YWluc0tleSgiY2hlZXNlIikgKSB7CisgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydCBmYWxzZSAsICJzaG91bGQgY29udGFpbiBjaGVlc2UhIgorICAgICAgICB9CisKKyAgICAgICAgaWYgKCBtLmNvbnRhaW5zS2V5KDMpICkgeworICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBhc3NlcnQgZmFsc2UgLCAic2hvdWxkIGNvbnRhaW4gMyEiCisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0RW1wdHlNYXAoKSB7CisgICAgICAgIGRlZiBtID0gWzpdCisKKyAgICAgICAgYXNzZXJ0IG0uc2l6ZSgpID09IDAKKyAgICAgICAgYXNzZXJ0ICFtLmNvbnRhaW5zS2V5KCJjaGVlc2UiKQorCisgICAgICAgIG0ucHV0KCJjaGVlc2UiLCAiY2hlZGRhciIpCisKKyAgICAgICAgYXNzZXJ0IG0uc2l6ZSgpID09IDEKKyAgICAgICAgYXNzZXJ0IG0uY29udGFpbnNLZXkoImNoZWVzZSIpCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdE1hcE11dGF0aW9uKCkgeyAgICAKKyAgICAgICAgZGVmIG0gPSBbICdhYmMnIDogJ2RlZicsICdkZWYnIDogMTM0LCAneHl6JyA6ICd6enonIF0KKworICAgICAgICBhc3NlcnQgbVsndW5rbm93biddID09IG51bGwKKworICAgICAgICBhc3NlcnQgbVsnZGVmJ10gPT0gMTM0CisKKyAgICAgICAgbVsnZGVmJ10gPSAnY2FmZWJhYmUnCisKKyAgICAgICAgYXNzZXJ0IG1bJ2RlZiddID09ICdjYWZlYmFiZScKKworICAgICAgICBhc3NlcnQgbS5zaXplKCkgPT0gMworCisgICAgICAgIG0ucmVtb3ZlKCdkZWYnKQorCisgICAgICAgIGFzc2VydCBtWydkZWYnXSA9PSBudWxsCisgICAgICAgIGFzc2VydCBtLnNpemUoKSA9PSAyCisgICAgICAgIAorICAgICAgICBkZWYgZm9vID0gbVsnZGVmJ10gPSA1CisgICAgICAgIGFzc2VydCBtWydkZWYnXSA9PSA1CisgICAgICAgIGFzc2VydCBmb28gPT0gbnVsbAorICAgIH0KKworICAgIHZvaWQgdGVzdEZpbmRBbGwoKXsKKyAgICAgICAgYXNzZXJ0IFthOjFdID09IFsnYSc6MSwgJ2InOjJdLmZpbmRBbGwge2l0LnZhbHVlID09IDF9CisgICAgICAgIGFzc2VydCBbYToxXSA9PSBbJ2EnOjEsICdiJzoyXS5maW5kQWxsIHtpdC5rZXkgPT0gJ2EnfQorICAgICAgICBhc3NlcnQgW2E6MV0gPT0gWydhJzoxLCAnYic6Ml0uZmluZEFsbCB7a2V5LHZhbHVlIC0+IGtleSA9PSAnYSd9CisgICAgICAgIGFzc2VydCBbYToxXSA9PSBbJ2EnOjFdLmZpbmRBbGwge3RydWV9CisgICAgICAgIGFzc2VydCBbOl0gICA9PSBbJ2EnOjFdLmZpbmRBbGwge2ZhbHNlfQorICAgIH0KKworICAgIHZvaWQgdGVzdE1hcEFkZGl0aW9uKCkgeworICAgICAgICBkZWYgbGVmdCA9IFthOjEsIGI6Ml0KKyAgICAgICAgZGVmIHJpZ2h0ID0gW2M6M10KKyAgICAgICAgYXNzZXJ0IGxlZnQgKyByaWdodCA9PSBbYToxLCBiOjIsIGM6M10sICJzaG91bGQgY29udGFpbiBhbGwgZW50cmllcyBmcm9tIGJvdGggbWFwcyIKKyAgICAgICAgYXNzZXJ0IGxlZnQgPT0gW2E6MSwgYjoyXSAmJiByaWdodCA9PSBbYzozXSwgIkxIUy9SSFMgc2hvdWxkIG5vdCBiZSBtb2RpZmllZCIKKworICAgICAgICBsZWZ0ID0gW2E6MSwgYjoxXQorICAgICAgICByaWdodCA9IFthOjJdCisgICAgICAgIGFzc2VydCBsZWZ0ICsgcmlnaHQgPT0gW2E6MiwgYjoxXSwgIlJIUyBzaG91bGQgdGFrZSBwcmVjZWRlbmNlIHdoZW4gZW50cmllcyBoYXZlIHNhbWUga2V5IgorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvTWV0aG9kQ2FsbFRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9NZXRob2RDYWxsVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFiYjFlMwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvTWV0aG9kQ2FsbFRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMzEgQEAKK3BhY2thZ2UgZ3Jvb3Z5CisKK2NsYXNzIE1ldGhvZENhbGxUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCB0ZXN0TWV0aG9kQ2FsbCgpIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludCgiaGVsbG8iKQorICAgICAgICBwcmludGxuKCJ3b3JsZCEiKQorICAgIH0KKworICAgIHZvaWQgdGVzdE9iamVjdE1ldGhvZENhbGwoKSB7CisgICAgICAgIGRlZiBjID0gZ2V0Q2xhc3MoKQorICAgICAgICBhc3NlcnQgYyAhPSBudWxsCisgICAgICAgIGFzc2VydCBjLm5hbWUuZW5kc1dpdGgoIk1ldGhvZENhbGxUZXN0IikKKyAgICAgICAgYXNzZXJ0IGMuZ2V0TmFtZSgpLmVuZHNXaXRoKCJNZXRob2RDYWxsVGVzdCIpCisgICAgfQorCisgICAgdm9pZCB0ZXN0T2JqZWN0TWV0aG9kQ2FsbDIoKSB7CisgICAgICAgIGRlZiBzID0gImhlbGxvIgorICAgICAgICBkZWYgYyA9IHMuZ2V0Q2xhc3MoKQorICAgICAgICBhc3NlcnQgYyAhPSBudWxsCisgICAgICAgIGFzc2VydCBjLm5hbWUgPT0gImphdmEubGFuZy5TdHJpbmciCisgICAgICAgIGFzc2VydCBjLmdldE5hbWUoKSA9PSAiamF2YS5sYW5nLlN0cmluZyIKKyAgICB9CisKKyAgICB2b2lkIHRlc3RHZXROYW1lQnVnKCkgeworICAgICAgICBkZWYgYyA9IGdldENsYXNzKCkKKyAgICAgICAgZGVmIG4gPSBjLmdldE5hbWUoKQorICAgICAgICBhc3NlcnQgYy5nZXROYW1lKCkuZW5kc1dpdGgoIk1ldGhvZENhbGxUZXN0IikKKyAgICAgICAgYXNzZXJ0IG4uZW5kc1dpdGgoIk1ldGhvZENhbGxUZXN0IikKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L01ldGhvZENhbGxXaXRob3V0UGFyZW50aGVzaXNUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvTWV0aG9kQ2FsbFdpdGhvdXRQYXJlbnRoZXNpc1Rlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MWMzYjAKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L01ldGhvZENhbGxXaXRob3V0UGFyZW50aGVzaXNUZXN0Lmdyb292eQpAQCAtMCwwICsxLDQ5IEBACitwYWNrYWdlIGdyb292eQorCitjbGFzcyBNZXRob2RDYWxsV2l0aG91dFBhcmVudGhlc2lzVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIGRlZiBmbGFnCisKKyAgICB2b2lkIHRlc3RNZXRob2RDYWxsV2l0aE9uZVBhcmFtKCkgeworICAgICAgICBmbGFnID0gZmFsc2UKKyAgICAgICAgCisgICAgICAgIG1ldGhvZFdpdGhPbmVQYXJhbSAiaGVsbG8iCisgICAgICAgIAorICAgICAgICBhc3NlcnQgZmxhZworICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RNZXRob2RDYWxsV2l0aE9uZVBhcmFtVXNpbmdUaGlzKCkgeworICAgICAgICBmbGFnID0gZmFsc2UKKyAgICAgICAgCisgICAgICAgIHRoaXMubWV0aG9kV2l0aE9uZVBhcmFtICJoZWxsbyIKKyAgICAgICAgCisgICAgICAgIGFzc2VydCBmbGFnCisgICAgfQorICAgIAorICAgIHZvaWQgbWV0aG9kV2l0aE9uZVBhcmFtKHRleHQpIHsKKyAgICAgICAgcHJpbnRsbigiQ2FsbGVkIG1ldGhvZCB3aXRoIHBhcmFtZXRlciAke3RleHR9IikKKyAgICAgICAgYXNzZXJ0IHRleHQgPT0gImhlbGxvIgorICAgICAgICBmbGFnID0gdHJ1ZQorICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RNZXRob2RDYWxsV2l0aFR3b1BhcmFtcygpIHsKKyAgICAgICAgbWV0aG9kV2l0aFR3b1BhcmFtcyA1LCA2CisKKyAgICAgICAgLy8gbm90IGFsbG93ZWQgaW4gTmV3IEdyb292eQorICAgICAgICAvLyB2YWx1ZSA9IG1ldGhvZFdpdGhUd29QYXJhbXMgNSwgNgorICAgICAgICBkZWYgdmFsdWUgPSBtZXRob2RXaXRoVHdvUGFyYW1zKDUsIDYpCisKKyAgICAgICAgYXNzZXJ0IHZhbHVlID09IDExCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdE1ldGhvZENhbGxXaXRoVHdvUGFyYW1zVXNpbmdUaGlzKCkgeworICAgICAgICBkZWYgdmFsdWUgPSB0aGlzLm1ldGhvZFdpdGhUd29QYXJhbXMoNSwgNikKKyAgICAgICAgCisgICAgICAgIGFzc2VydCB2YWx1ZSA9PSAxMQorICAgIH0KKworICAgIGRlZiBtZXRob2RXaXRoVHdvUGFyYW1zKGEsIGIpIHsKKyAgICAgICAgcHJpbnRsbigiQ2FsbGVkIG1ldGhvZCB3aXRoIHBhcmFtZXRlcnMgJHthfSBhbmQgJHtifSIpCisgICAgICAgIHJldHVybiBhICsgYgorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L01ldGhvZFBhcmFtZXRlckFjY2Vzc1dpdGhpbkNsb3N1cmVUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvTWV0aG9kUGFyYW1ldGVyQWNjZXNzV2l0aGluQ2xvc3VyZVRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNGNmYzQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L01ldGhvZFBhcmFtZXRlckFjY2Vzc1dpdGhpbkNsb3N1cmVUZXN0Lmdyb292eQpAQCAtMCwwICsxLDc2IEBACitwYWNrYWdlIGdyb292eQorCisvKioKKyAqIFRvIHRlc3QgYWNjZXNzIHRvIG1ldGhvZCBzY29wZWQgdmFyaWFibGUgd2l0aGluIGNsb3N1cmUKKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amVyZW15LnJheW5lckBiaWdmb290LmNvbSI+SmVyZW15IFJheW5lcjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworCisKK2NsYXNzIE1ldGhvZFBhcmFtZXRlckFjY2Vzc1dpdGhpbkNsb3N1cmVUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeyAKKyAgICBkZWYgY2hlZXNlCisgICAgZGVmIHNob3AKKyAgICAgICAKKyAgICB2b2lkIHNldFVwKCkgeworICAgICAgICBjaGVlc2UgPSBudWxsCisgICAgICAgIHNob3AgPSBbIndlbnNsZXlkYWxlIl0KKyAgICB9ICAgICAgICAgICAgICAKKyAgICB2b2lkIHRlc3RTaW1wbGVNZXRob2RQYXJhbWV0ZXJBY2Nlc3MoKSB7IAorICAgICAgICBhc3NlcnQgIndlbnNsZXlkYWxlIiA9PSB2ZW5kb3IxKCJ3ZW5zbGV5ZGFsZSIpIAorICAgIH0KKyAgICB2b2lkIHRlc3RNZXRob2RQYXJhbWV0ZXJXaXRoRGlmZmVyZW50TmFtZVRvUHJvcGVydHlVc2luZ0Nsb3N1cmUoKSB7CisgICAgICAgIGFzc2VydCAid2Vuc2xleWRhbGUiID09IHZlbmRvcjIoIndlbnNsZXlkYWxlIikKKyAgICB9CisgICAgdm9pZCB0ZXN0TWV0aG9kUGFyYW1ldGVyV2l0aFNhbWVOYW1lQXNQcm9wZXJ0eVVzaW5nQ2xvc3VyZSgpIHsKKyAgICAgICAgYXNzZXJ0ICJ3ZW5zbGV5ZGFsZSIgPT0gdmVuZG9yMygid2Vuc2xleWRhbGUiKQorICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RPcHRpb25hbE1ldGhvZFBhcmFtZXRlclVzZWRJbkNsb3N1cmUoKSB7CisgICAgICAgIGFzc2VydCAid2Vuc2xleWRhbGUiID09IHZlbmRvcjQoIndlbnNsZXlkYWxlIikKKyAgICAgICAgYXNzZXJ0IG51bGwgPT0gdmVuZG9yNCgpCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdERvdWJsZVBhcmFtZXRlckFuZHNpbmdsZVBhcmFtZXRlclVzZWRJbkNsb3N1cmUoKSB7CisgICAgICAgICBhc3NlcnQgdmVuZG9yNSg1LjBkLDIpID09IDcuMGQKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0QWNjZXNzVG9NZXRob2RQYXJhbWV0ZXJJbk92ZXJ3cml0dGVuTWV0aG9kQ2FsbGVkQnlTdXBlcigpIHsKKyAgICAgICAgIC8vICBHUk9PVlktMjEwNworICAgICAgICAgYXNzZXJ0U2NyaXB0ICIiIgorICAgICAgICAgICBjbGFzcyBBIHsKKyAgICAgICAgICAgICAvLyB0aGUgY2xvc3VyZSBpcyBhY2Nlc3NpbmcgdGhlIHBhcmFtZXRlcgorICAgICAgICAgICAgIGRlZiBmb28oeCl7IHJldHVybiB7eH19CisgICAgICAgICAgIH0KKyAgICAgICAgICAgY2xhc3MgQiBleHRlbmRzIEEgeworICAgICAgICAgICAgICBkZWYgZm9vKHkpIHsKKyAgICAgICAgICAgICAgICAgc3VwZXIuZm9vKHkrMSkKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICB9CisgICAgICAgICAgIGRlZiBiID0gbmV3IEIoKQorICAgICAgICAgICBhc3NlcnQgYi5mb28oMSkuY2FsbCgpID09IDIKKyAgICAgICAgIiIiICAgICAgICAKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBTdHJpbmcgdmVuZG9yMShjaGVlc2UpIHsKKyAgICAgICAgY2hlZXNlCisgICAgfQorICAgIAorICAgIHByaXZhdGUgU3RyaW5nIHZlbmRvcjIoYUNoZWVzZSkgeworICAgICAgICBzaG9wLmZpbmQoKSB7aXQgPT0gYUNoZWVzZX0KKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBTdHJpbmcgdmVuZG9yMyhjaGVlc2UpIHsKKyAgICAgICAgc2hvcC5maW5kKCkge2l0ID09IGNoZWVzZX0KKyAgICB9CisgICAgCisgICAgLyoqIG5vdGU6IGNoZWVzZSBpcyBhIGZpZWxkLCB0aGF0IGlzIGludGVuZGVkICoqLworICAgIHByaXZhdGUgdmVuZG9yNChhQ2hlZXNlPWNoZWVzZSkgeworICAgICAgICBzaG9wLmZpbmQoKSB7aXQgPT0gYUNoZWVzZX0KKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSB2ZW5kb3I1KGRvdWJsZSBhLCBpbnQgYikgeworICAgICAgICBiLnRpbWVzIHthKyt9CisgICAgICAgIHJldHVybiBhCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvTWluTWF4VGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L01pbk1heFRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMTQ4YmYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L01pbk1heFRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsNTIgQEAKK3BhY2thZ2UgZ3Jvb3Z5CisKKy8qKiAKKyAqIFRlc3RzIHRoZSBtaW4oKSBhbmQgbWF4KCkgZnVuY3Rpb25zCisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK2NsYXNzIE1pbk1heFRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICB2b2lkIHRlc3RTaW1wbGVNaW5NYXgoKSB7CisgICAgICAgIGRlZiBsaXN0ID0gWzUsIDIsIDYsIDEsIDksIDhdCisgICAgICAgIAorICAgICAgICBkZWYgbiA9IGxpc3QubWluKCkKKyAgICAgICAgYXNzZXJ0IG4gPT0gMQorICAgICAgICAKKyAgICAgICAgbiA9IGxpc3QubWF4KCkKKyAgICAgICAgYXNzZXJ0IG4gPT0gOQorICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RNaW5NYXhXaXRoQ29tcGFyYXRvcigpIHsKKyAgICAgICAgZGVmIHBlb3BsZSA9IGdldFBlb3BsZSgpCisKKyAgICAgICAgLy8gbGV0cyBmaW5kIHRoZSBtYXhpbXVtIGJ5IG5hbWUKKworICAgICAgICBkZWYgb3JkZXIgPSBuZXcgT3JkZXJCeSggeyBpdC5nZXQoJ0BjaGVlc2UnKSB9ICkKKworICAgICAgICBwcmludGxuKCJQZW9wbGUgJHtwZW9wbGV9IikKKworICAgICAgICBkZWYgcCA9IHBlb3BsZS5taW4ob3JkZXIpCisKKyAgICAgICAgcHJpbnRsbigiRm91bmQgJHtwfSIpCisKKyAgICAgICAgYXNzZXJ0IHAuZ2V0KCJAbmFtZSIpID09ICJKb2UiICwgImZvdW5kIHBlcnNvbiAke3B9IgorCisgICAgICAgIHAgPSBwZW9wbGUubWF4KG9yZGVyKQorICAgICAgICBhc3NlcnQgcC5nZXQoIkBuYW1lIikgPT0gIkNocmlzIiAsICJmb3VuZCBwZXJzb24gJHtwfSIKKyAgICB9CisgICAgCisgICAgZGVmIGdldFBlb3BsZSgpIHsKKyAgICAgICAgZGVmIGJ1aWxkZXIgPSBuZXcgTm9kZUJ1aWxkZXIoKQorICAgICAgICBkZWYgdHJlZSA9IGJ1aWxkZXIucGVvcGxlIHsKKyAgICAgICAgICAgIHBlcnNvbihuYW1lOidKYW1lcycsIGNoZWVzZTonRWRhbScsIGxvY2F0aW9uOidMb25kb24nKQorICAgICAgICAgICAgcGVyc29uKG5hbWU6J0JvYicsIGNoZWVzZTonQ2hlZGRhcicsIGxvY2F0aW9uOidBdGxhbnRhJykKKyAgICAgICAgICAgIHBlcnNvbihuYW1lOidDaHJpcycsIGNoZWVzZTonUmVkIExlaWNlc3RlcicsIGxvY2F0aW9uOidMb25kb24nKQorICAgICAgICAgICAgcGVyc29uKG5hbWU6J0pvZScsIGNoZWVzZTonQnJpZScsIGxvY2F0aW9uOidMb25kb24nKQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gdHJlZS5jaGlsZHJlbigpCisgICAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9NaW51c0VxdWFsc1Rlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9NaW51c0VxdWFsc1Rlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhYjYyNjMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L01pbnVzRXF1YWxzVGVzdC5ncm9vdnkKQEAgLTAsMCArMSw0NyBAQAorcGFja2FnZSBncm9vdnkKKworY2xhc3MgTWludXNFcXVhbHNUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCB0ZXN0SW50ZWdlck1pbnVzRXF1YWxzKCkgeworICAgICAgICBkZWYgeCA9IDQKKyAgICAgICAgZGVmIHkgPSAyCisgICAgICAgIHggLT0geQorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IHggPT0gMgorICAgICAgICAKKyAgICAgICAgeSAtPSAxCisgICAgICAgIAorICAgICAgICBhc3NlcnQgeSA9PSAxCisgICAgfQorCisgICAgdm9pZCB0ZXN0Q2hhcmFjdGVyTWludXNFcXVhbHMoKSB7CisgICAgICAgIENoYXJhY3RlciB4ID0gNAorICAgICAgICBDaGFyYWN0ZXIgeSA9IDIKKyAgICAgICAgeCAtPSB5CisgICAgICAgIAorICAgICAgICBhc3NlcnQgeCA9PSAyCisgICAgICAgIAorICAgICAgICB5IC09IDEKKyAgICAgICAgCisgICAgICAgIGFzc2VydCB5ID09IDEKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0TnVtYmVyTWludXNFcXVhbHMoKSB7CisgICAgICAgIGRlZiB4ID0gNC4yCisgICAgICAgIGRlZiB5ID0gMgorICAgICAgICB4IC09IHkKKyAgICAgICAgCisgICAgICAgIGFzc2VydCB4ID09IDIuMgorICAgICAgICAKKyAgICAgICAgeSAtPSAwLjEKKyAgICAgICAgCisgICAgICAgIGFzc2VydCB5ID09IDEuOQorICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RTdHJpbmdNaW51c0VxdWFscygpIHsKKyAgICAgICAgZGVmIGZvbyA9ICJuaWNlIGNoZWVzZSIKKyAgICAgICAgZm9vIC09ICJjaGVlc2UiCisgICAgICAgIAorICAgICAgICBhc3NlcnQgZm9vID09ICJuaWNlICIKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L01vZHVsb1Rlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9Nb2R1bG9UZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDBiNjUyCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9Nb2R1bG9UZXN0Lmdyb292eQpAQCAtMCwwICsxLDI0IEBACitwYWNrYWdlIGdyb292eQorCitjbGFzcyBNb2R1bG9UZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworICBpbnQgbW9kdWxvID0gMTAwCisKKyAgdm9pZCB0ZXN0TW9kdWxvTGVzc2VyKCkgeworICAgIGZvciAoaSBpbiAwLi5tb2R1bG8tMSkgeworICAgICAgYXNzZXJ0IChpJW1vZHVsbyk9PWkKKyAgICB9CisgIH0KKworICB2b2lkIHRlc3RNb2R1bG9FcXVhbCgpIHsKKyAgICBmb3IgKGkgaW4gMC4ubW9kdWxvKSB7CisgICAgICBhc3NlcnQgKChpKm1vZHVsbykgJSBtb2R1bG8pPT0wCisgICAgfQorICB9CisKKyAgdm9pZCB0ZXN0TW9kdWxvQmlnZ2VyKCkgeworICAgIGZvciAoaSBpbiAwLi5tb2R1bG8tMSkgeworICAgICAgYXNzZXJ0ICgoaSptb2R1bG8raSkgJSBtb2R1bG8pPT1pCisgICAgfQorICB9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvTXVsdGlEaW1BcnJheXNUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvTXVsdGlEaW1BcnJheXNUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjUwNDIwCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9NdWx0aURpbUFycmF5c1Rlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsNjEgQEAKKy8qKgorICogRXhwb3NlIGhvdyB0byBkZWFsIHdpdGggbXVsdGktZGltZW5zaW9uYWwgQXJyYXlzIHVudGlsIHRoaXMgaXMgc3VwcG9ydGVkIGF0IHRoZSBsYW5ndWFnZSBsZXZlbC4KKyAqIEBhdXRob3IgRGllcmsgS29lbmlnCisgKiBAYXV0aG9yIEpvY2hlbiBUaGVvZG9yb3UKKyAqLworIAorcGFja2FnZSBncm9vdnk7CisKK3B1YmxpYyBjbGFzcyBNdWx0aURpbUFycmF5c1Rlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICAvLyB0b2RvOiBlbmFibGUgYXMgc29vbiBhcyBtdWx0aSBkaW1zIGFyZSBzdXBwb3J0ZWQKKyAgICB2b2lkIHRlc3RDYWxsVHdvRGltU3RyaW5nQXJyYXkoKXsKKyAgICAgICAgZGVmIHNvbWVBcnJheU9mU3RyaW5nQXJyYXlzID0gIG5ldyBTb21lQ2xhc3MoKS5hbkFycmF5T2ZTdHJpbmdBcnJheXMoKQorICAgICAgICBhc3NlcnQgMSA9PSBzb21lQXJyYXlPZlN0cmluZ0FycmF5cy5zaXplKCkKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0Q2FsbFR3b0RpbVN0cmluZ0FycmF5V29ya2Fyb3VuZCgpeworICAgICAgICBkZWYgc29tZUFycmF5T2ZTdHJpbmdBcnJheXMgPSAgbmV3IFNvbWVDbGFzcygpLmFuQXJyYXlPZlN0cmluZ0FycmF5c1dvcmthcm91bmQoKQorICAgICAgICBhc3NlcnQgMSA9PSBzb21lQXJyYXlPZlN0cmluZ0FycmF5cy5zaXplKCkKKyAgICAgICAgYXNzZXJ0ICJ3aGF0ZXZlciIgPT0gc29tZUFycmF5T2ZTdHJpbmdBcnJheXNbMF1bMF0KKyAgICAgICAgZm9yIChpIGluIDAuLjxzb21lQXJyYXlPZlN0cmluZ0FycmF5cy5zaXplKCkpIHsKKyAgICAgICAgICAgIGFzc2VydCBzb21lQXJyYXlPZlN0cmluZ0FycmF5c1tpXQorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCB0ZXN0Q2FsbFR3b0RpbVN0cmluZ0FycmF5V29ya2Fyb3VuZFdpdGhOdWxsKCl7CisgICAgICAgIGRlZiBzb21lQXJyYXlPZlN0cmluZ0FycmF5cyA9ICBuZXcgU29tZUNsYXNzKCkuYW5BcnJheU9mU3RyaW5nQXJyYXlzV29ya2Fyb3VuZCgpCisgICAgICAgIGFzc2VydCAxID09IHNvbWVBcnJheU9mU3RyaW5nQXJyYXlzLnNpemUoKQorICAgICAgICBhc3NlcnQgIndoYXRldmVyIiA9PSBzb21lQXJyYXlPZlN0cmluZ0FycmF5c1swXVswXQorICAgICAgICBzb21lQXJyYXlPZlN0cmluZ0FycmF5cy5lYWNoKCl7IGFzc2VydCBpdH0KKyAgICB9CisKKyAgICB2b2lkIHRlc3RJbnNpZGVHcm9vdnlNdWx0aURpbVJlcGxhY2VtZW50KCl7CisgICAgICAgIE9iamVjdFtdIHNvbWVBcnJheU9mU3RyaW5nQXJyYXlzID0gW1siYSIsImEiLCJhIl0sWyJiIiwiYiIsImIiLG51bGxdXQorICAgICAgICBhc3NlcnQgImEiID09IHNvbWVBcnJheU9mU3RyaW5nQXJyYXlzWzBdWzBdCisgICAgICAgIHNvbWVBcnJheU9mU3RyaW5nQXJyYXlzLmVhY2goKXsgYXNzZXJ0IGl0fQorICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RNdWx0aURpbUNyZWF0aW9uV2l0aFNpemVzKCl7CisgICAgICAgIE9iamVjdFtdW10gb2JqZWN0QXJyYXkgPSBuZXcgT2JqZWN0WzJdWzVdCisgICAgICAgIGFzc2VydCBvYmplY3RBcnJheS5sZW5ndGggPT0gMgorICAgICAgICBvYmplY3RBcnJheS5lYWNoIHsgCisgICAgICAgICAgYXNzZXJ0IGl0Lmxlbmd0aCA9PSA1IAorICAgICAgICAgIGl0LmVhY2ggeyBhc3NlcnQgaXQgPT0gbnVsbCB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0TXVsdGlEaW1DcmVhdGlvbldpdGhvdXRTaXplQXRFbmQoKSB7CisgICAgICAgZGVmIGFycmF5ID0gbmV3IGludFs1XVs2XVtdCisgICAgICAgYXNzZXJ0IGFycmF5LmNsYXNzLm5hbWUgPT0gIltbW0kiCisgICAgICAgYXNzZXJ0IGFycmF5WzBdLmNsYXNzLm5hbWUgPT0gIltbSSIKKyAgICAgICBhc3NlcnQgYXJyYXlbMF1bMF0gPT0gbnVsbAorICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RNdWx0aURpbUFycmF5Rm9yQ3VzdG9tQ2xhc3MoKSB7CisJCWRlZiBmZiA9IG5ldyBNdWx0aURpbUFycmF5c1Rlc3RbM11bNF0KKwkJYXNzZXJ0ICJbW0xncm9vdnkuTXVsdGlEaW1BcnJheXNUZXN0OyIgPT0gZmYuY2xhc3MubmFtZTsKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9NdWx0aWxpbmVDaGFpbkV4cHJlc3Npb25UZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvTXVsdGlsaW5lQ2hhaW5FeHByZXNzaW9uVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU2YWQ1YgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvTXVsdGlsaW5lQ2hhaW5FeHByZXNzaW9uVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwxOCBAQAorcGFja2FnZSBncm9vdnkKKworY2xhc3MgTXVsdGlsaW5lQ2hhaW5FeHByZXNzaW9uVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKyAgIHZvaWQgdGVzdE11bHRpTGluZUNoYWluKCkgeworICAgICAgIC8vIHRoZSBjb2RlIGJlbG93IHNob3VsZCBiZSBjb21waWxlYWJsZQorICAgICAgIGFzc2VydCAoCisJICAgICAgIFN5c3RlbQorCSAgICAgICAgICAgLm91dAorCSAgICAgICAgICAgLmNsYXNzIAorIAkgICAgICAgPT0gCisJICAgICAgIFByaW50U3RyZWFtCisJICAgICAgICAgICAuY2xhc3MKKyAgICAgICApCisgICAgICAgYXNzZXJ0IFN5c3RlbQorICAgICAgICAgICAgICAuZXJyCisgICAgICAgICAgICAgIC5jbGFzcyA9PSBQcmludFN0cmVhbS5jbGFzcworICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvTXVsdGlsaW5lU3RyaW5nVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L011bHRpbGluZVN0cmluZ1Rlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MmNjNWQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L011bHRpbGluZVN0cmluZ1Rlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTcgQEAKK3BhY2thZ2UgZ3Jvb3Z5CisKK2NsYXNzIE11bHRpbGluZVN0cmluZ1Rlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICB2b2lkIHRlc3RNdWx0aWxpbmVTdHJpbmcoKSB7CisgICAgICAgIGRlZiBzID0gIiIiYWJjZAorZWZnCisKKyAgICAgICAgaGlqaworICAgICAgICAKKyIiIgorICAgICAgICBwcmludGxuKHMpCisgICAgICAgIGFzc2VydCBzICE9IG51bGwKKyAgICAgICAgZGVmIGlkeCA9IHMuaW5kZXhPZigiaSIpCisgICAgICAgIGFzc2VydCBpZHggPiAwCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9NdWx0aXBseURpdmlkZUVxdWFsc1Rlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9NdWx0aXBseURpdmlkZUVxdWFsc1Rlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMWI2MDMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L011bHRpcGx5RGl2aWRlRXF1YWxzVGVzdC5ncm9vdnkKQEAgLTAsMCArMSw4MiBAQAorcGFja2FnZSBncm9vdnkKKworY2xhc3MgTXVsdGlwbHlEaXZpZGVFcXVhbHNUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCB0ZXN0SW50ZWdlck11bHRpcGx5RXF1YWxzKCkgeworICAgICAgICBkZWYgeCA9IDIKKyAgICAgICAgZGVmIHkgPSAzCisgICAgICAgIHggKj0geQorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IHggPT0gNgorICAgICAgICAKKyAgICAgICAgeSAqPSA0CisgICAgICAgIAorICAgICAgICBhc3NlcnQgeSA9PSAxMgorICAgIH0KKworICAgIHZvaWQgdGVzdENoYXJhY3Rlck11bHRpcGx5RXF1YWxzKCkgeworICAgICAgICBDaGFyYWN0ZXIgeCA9IDIKKyAgICAgICAgQ2hhcmFjdGVyIHkgPSAzCisgICAgICAgIHggKj0geQorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IHggPT0gNgorICAgICAgICAKKyAgICAgICAgeSAqPSA0CisgICAgICAgIAorICAgICAgICBhc3NlcnQgeSA9PSAxMgorICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3ROdW1iZXJNdWx0aXBseUVxdWFscygpIHsKKyAgICAgICAgZGVmIHggPSAxLjIKKyAgICAgICAgZGVmIHkgPSAyCisgICAgICAgIHggKj0geQorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IHggPT0gMi40CisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdFN0cmluZ011bHRpcGx5RXF1YWxzKCkgeworICAgICAgICBkZWYgeCA9ICJiYmMiCisgICAgICAgIGRlZiB5ID0gMgorICAgICAgICB4ICo9IHkKKyAgICAgICAgCisgICAgICAgIGFzc2VydCB4ID09ICJiYmNiYmMiCisKKyAgICAgICAgeCA9ICJHdWlsbGF1bWUiCisgICAgICAgIHkgPSAwCisgICAgICAgIHggKj0geQorICAgICAgICBhc3NlcnQgeCA9PSAiIgorICAgIH0KKyAgICAKKyAgICAKKyAgICB2b2lkIHRlc3RJbnRlZ2VyRGl2aWRlRXF1YWxzKCkgeworICAgICAgICBkZWYgeCA9IDE4CisgICAgICAgIGRlZiB5ID0gNgorICAgICAgICB4IC89IHkKKyAgICAgICAgCisgICAgICAgIGFzc2VydCB4ID09IDMuMAorICAgICAgICAKKyAgICAgICAgeSAvPSAzCisgICAgICAgIAorICAgICAgICBhc3NlcnQgeSA9PSAyLjAKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0Q2hhcmFjdGVyRGl2aWRlRXF1YWxzKCkgeworICAgICAgICBDaGFyYWN0ZXIgeCA9IDE4CisgICAgICAgIENoYXJhY3RlciB5ID0gNgorICAgICAgICB4IC89IHkKKyAgICAgICAgCisgICAgICAgIGFzc2VydCB4ID09IDMuMAorICAgICAgICAKKyAgICAgICAgeSAvPSAzCisgICAgICAgIAorICAgICAgICBhc3NlcnQgeSA9PSAyLjAKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0TnVtYmVyRGl2aWRlRXF1YWxzKCkgeworICAgICAgICBkZWYgeCA9IDEwLjQKKyAgICAgICAgZGVmIHkgPSAyCisgICAgICAgIHggLz0geQorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IHggPT0gNS4yCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9OYW1lZFBhcmFtZXRlclRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9OYW1lZFBhcmFtZXRlclRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1NWRjMTUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L05hbWVkUGFyYW1ldGVyVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwxNSBAQAorcGFja2FnZSBncm9vdnkKKworY2xhc3MgTmFtZWRQYXJhbWV0ZXJUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCB0ZXN0UGFzc2luZ05hbWVkUGFyYW1ldGVyc1RvTWV0aG9kKCkgeworICAgICAgICBzb21lTWV0aG9kKG5hbWU6Imdyb21pdCIsIGVhdGluZzoibmljZSBjaGVlc2UiLCB0aW1lczoyKQorICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgdm9pZCBzb21lTWV0aG9kKGFyZ3MpIHsKKyAgICAgICAgYXNzZXJ0IGFyZ3MubmFtZSA9PSAiZ3JvbWl0IgorICAgICAgICBhc3NlcnQgYXJncy5lYXRpbmcgPT0gIm5pY2UgY2hlZXNlIgorICAgICAgICBhc3NlcnQgYXJncy50aW1lcyA9PSAyCisgICAgICAgIGFzc2VydCBhcmdzLnNpemUoKSA9PSAzCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9OZXN0ZWRDbGFzc1Rlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9OZXN0ZWRDbGFzc1Rlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMzM3YjIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L05lc3RlZENsYXNzVGVzdC5ncm9vdnkKQEAgLTAsMCArMSw4NSBAQAorcGFja2FnZSBncm9vdnkKKworY2xhc3MgTmVzdGVkQ2xhc3NUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCB0ZXN0U3RhdGljSW5uZXJTdGF0aWNNZXRob2QgKCkgeworICAgICAgICBkZWYgc2NyaXB0ID0gbmV3IEdyb292eUNsYXNzTG9hZGVyKGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSkucGFyc2VDbGFzcyAoIiIiCisgICAgICAgIHBhY2thZ2UgZ3Jvb3Z5CisKKyAgICAgICAgSmF2YUNsYXNzLlN0YXRpY0lubmVyLml0CisgICAgICAgICIiIikubmV3SW5zdGFuY2UoKQorICAgICAgICBhc3NlcnRFcXVhbHMgMzAsIHNjcmlwdC5ydW4oKQorICAgIH0KKworICAgIHZvaWQgdGVzdFN0YXRpY0lubmVySW5zdGFuY2VNZXRob2QgKCkgeworICAgICAgICBkZWYgc2NyaXB0ID0gbmV3IEdyb292eUNsYXNzTG9hZGVyKGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSkucGFyc2VDbGFzcyAoIiIiCisgICAgICAgIHBhY2thZ2UgZ3Jvb3Z5CisKKyAgICAgICAgbmV3IEphdmFDbGFzcy5TdGF0aWNJbm5lciAoKS5yZXN1bHQKKyAgICAgICAgIiIiKS5uZXdJbnN0YW5jZSgpCisgICAgICAgIGFzc2VydEVxdWFscyAyMzksIHNjcmlwdC5ydW4oKQorICAgIH0KKworICAgIHZvaWQgdGVzdFBhcmFtICgpIHsKKyAgICAgICAgZGVmIHNjcmlwdCA9IG5ldyBHcm9vdnlDbGFzc0xvYWRlcihnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpLnBhcnNlQ2xhc3MgKCIiIgorICAgICAgICBwYWNrYWdlIGdyb292eQorCisgICAgICAgIGRlZiBtZXRob2QgKEphdmFDbGFzcy5TdGF0aWNJbm5lciBvYmopIHsgb2JqLnJlc3VsdCB9CisKKyAgICAgICAgbWV0aG9kIG5ldyBKYXZhQ2xhc3MuU3RhdGljSW5uZXIgKCkKKyAgICAgICAgIiIiKS5uZXdJbnN0YW5jZSgpCisKKyAgICAgICAgYXNzZXJ0RXF1YWxzIDIzOSwgc2NyaXB0LnJ1bigpCisgICAgfQorCisgICAgdm9pZCB0ZXN0VHlwZURlY2wgKCkgeworICAgICAgICBkZWYgc2NyaXB0ID0gbmV3IEdyb292eUNsYXNzTG9hZGVyKGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSkucGFyc2VDbGFzcyAoIiIiCisgICAgICAgIHBhY2thZ2UgZ3Jvb3Z5CisKKyAgICAgICAgSmF2YUNsYXNzLlN0YXRpY0lubmVyIG1ldGhvZCAoKSB7IDIzOSB9CisKKyAgICAgICAgbWV0aG9kICgpCisgICAgICAgICIiIikubmV3SW5zdGFuY2UoKQorCisgICAgICAgIHNob3VsZEZhaWwgKG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS50eXBlaGFuZGxpbmcuR3Jvb3Z5Q2FzdEV4Y2VwdGlvbikgeworICAgICAgICAgIGFzc2VydEVxdWFscyAyMzksIHNjcmlwdC5ydW4oKQorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCB0ZXN0RmllbGREZWNsICgpIHsKKyAgICAgICAgZGVmIHNjcmlwdCA9IG5ldyBHcm9vdnlDbGFzc0xvYWRlcihnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpLnBhcnNlQ2xhc3MgKCIiIgorICAgICAgICBwYWNrYWdlIGdyb292eQorCisgICAgICAgIEphdmFDbGFzcy5TdGF0aWNJbm5lciBmaWVsZCA9IDIzOQorCisgICAgICAgIGZpZWxkCisgICAgICAgICIiIikubmV3SW5zdGFuY2UoKQorCisgICAgICAgIHNob3VsZEZhaWwgKG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS50eXBlaGFuZGxpbmcuR3Jvb3Z5Q2FzdEV4Y2VwdGlvbikgeworICAgICAgICAgIGFzc2VydEVxdWFscyAyMzksIHNjcmlwdC5ydW4oKQorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCB0ZXN0SW5zdGFuY2VvZiAoKSB7CisgICAgICAgIGRlZiBzY3JpcHQgPSBuZXcgR3Jvb3Z5Q2xhc3NMb2FkZXIoZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKS5wYXJzZUNsYXNzICgiIiIKKyAgICAgICAgcGFja2FnZSBncm9vdnkKKworICAgICAgICBKYXZhQ2xhc3MuQ09OU1QgaW5zdGFuY2VvZiBKYXZhQ2xhc3MuU3RhdGljSW5uZXIKKyAgICAgICAgIiIiKS5uZXdJbnN0YW5jZSgpCisKKyAgICAgICAgYXNzZXJ0VHJ1ZSBzY3JpcHQucnVuICgpCisgICAgfQorCisgICAgdm9pZCB0ZXN0RXh0ZW5kcyAoKSB7CisgICAgICAgIGRlZiBzY3JpcHQgPSBuZXcgR3Jvb3Z5Q2xhc3NMb2FkZXIoZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKS5wYXJzZUNsYXNzICgiIiIKKyAgICAgICAgcGFja2FnZSBncm9vdnkKKworICAgICAgICBjbGFzcyBVIGV4dGVuZHMgSmF2YUNsYXNzLlN0YXRpY0lubmVyLklubmVyMiB7fQorCisgICAgICAgIG5ldyBVICgpCisKKyAgICAgICAgIiIiKS5uZXdJbnN0YW5jZSgpCisKKyAgICAgICAgYXNzZXJ0IHNjcmlwdC5ydW4gKCkgaW5zdGFuY2VvZiBKYXZhQ2xhc3MuU3RhdGljSW5uZXIuSW5uZXIyCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvTmV3RXhwcmVzc2lvblRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9OZXdFeHByZXNzaW9uVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUzOGI0MQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvTmV3RXhwcmVzc2lvblRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsNTYgQEAKK3BhY2thZ2UgZ3Jvb3Z5CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuRHVtbXlCZWFuCisKK2NsYXNzIE5ld0V4cHJlc3Npb25UZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCB0ZXN0TmV3SW5zdGFuY2UoKSB7CisgICAgICAgIGRlZiBjaGVlc2UgPSBuZXcgU3RyaW5nKCAiaGV5IHlvdSBob3NlcnMiICkKKyAgICAgICAgCisgICAgICAgIGFzc2VydCBjaGVlc2UgIT0gbnVsbAorICAgICAgICAKKyAgICAgICAgcHJpbnRsbihjaGVlc2UpCisgICAgfQorCisgICAgdm9pZCB0ZXN0TmV3QmVhbk5vQXJncygpIHsKKyAgICAgICAgZGVmIGJlYW4gPSBuZXcgRHVtbXlCZWFuKCkKKyAgICAgICAgYXNzZXJ0IGJlYW4ubmFtZSA9PSAiSmFtZXMiCisgICAgICAgIGFzc2VydCBiZWFuLmkgPT0gMTIzCisgICAgfQorCisgICAgdm9pZCB0ZXN0TmV3QmVhbjFBcmdzKCkgeworICAgICAgICBkZWYgYmVhbiA9IG5ldyBEdW1teUJlYW4oIkJvYiIpCisgICAgICAgIGFzc2VydCBiZWFuLm5hbWUgPT0gIkJvYiIKKyAgICAgICAgYXNzZXJ0IGJlYW4uaSA9PSAxMjMKKyAgICB9CisKKyAgICB2b2lkIHRlc3ROZXdCZWFuMkFyZ3MoKSB7CisgICAgICAgIGRlZiBiZWFuID0gbmV3IER1bW15QmVhbigiQm9iIiwgMTcwNykKKyAgICAgICAgYXNzZXJ0IGJlYW4ubmFtZSA9PSAiQm9iIgorICAgICAgICBhc3NlcnQgYmVhbi5pID09IDE3MDcKKyAgICB9CisKKyAgICB2b2lkIHRlc3ROZXdJbnN0YW5jZVdpdGhGdWxseVF1YWxpZmllZE5hbWUoKSB7CisgICAgICAgIGRlZiBiZWFuID0gbmV3IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5EdW1teUJlYW4oIkJvYiIsIDE3MDcpCisgICAgICAgIGFzc2VydCBiZWFuLm5hbWUgPT0gIkJvYiIKKyAgICAgICAgYXNzZXJ0IGJlYW4uaSA9PSAxNzA3CisgICAgfQorCisgICAgdm9pZCB0ZXN0TmV3SW5zdGFuY2VXaXRoRnVsbHlRdWFsaWZpZWROYW1lTm90SW1wb3J0ZWQoKSB7CisgICAgICAgIGRlZiBiZWFuID0gbmV3IGphdmEuaW8uRmlsZSgiRm9vIikKKworICAgICAgICBwcmludGxuICJDcmVhdGVkICRiZWFuIgorCisgICAgICAgIGFzc2VydCBiZWFuICE9IG51bGwKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0TmV3T25NdWx0aXBsZUxpbmVzKCkgeworICAgICAgICBkZWYgYmVhbiA9IAorICAgICAgICAgIG5ldworICAgICAgICAgICAgRmlsZQorICAgICAgICAgICAgKCJGb28iKQorCisgICAgICAgIGFzc2VydCBiZWFuICE9IG51bGwKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvTm9QYWNrYWdlVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L05vUGFja2FnZVRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYjBhMzQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L05vUGFja2FnZVRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsNyBAQAorCitjbGFzcyBOb1BhY2thZ2VUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCB0ZXN0Q2xhc3NEZWYoKSB7CisgICAgICAgIGFzc2VydCBnZXRDbGFzcygpLm5hbWUgPT0gIk5vUGFja2FnZVRlc3QiCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9OdWxsUHJvcGVydHlUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvTnVsbFByb3BlcnR5VGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA3ZTczYQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvTnVsbFByb3BlcnR5VGVzdC5ncm9vdnkKQEAgLTAsMCArMSwxNCBAQAorcGFja2FnZSBncm9vdnkKKworLyoqCisgKiBAYXV0aG9yIEplcmVteSBSYXluZXIgCisgKi8KK2NsYXNzIE51bGxQcm9wZXJ0eVRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7IAorICAgIGRlZiB3ZW5zbGV5ZGFsZSA9IG51bGwKKworICAgIHZvaWQgdGVzdE51bGxQcm9wZXJ0eSgpIHsgCisgICAgICAgIGFzc2VydCB3ZW5zbGV5ZGFsZSA9PSBudWxsIAorICAgIH0gCit9IAorCisKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvTnVtYmVyTWF0aFRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9OdW1iZXJNYXRoVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU4NjFhMwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvTnVtYmVyTWF0aFRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTQwIEBACitwYWNrYWdlIGdyb292eQorCisvKiogCisgKiBCYXNpYyBOdW1iZXJNYXRoIHRlc3QuCisgKiBAc2VlIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5OdW1iZXJNYXRoCisgKi8KK2NsYXNzIE51bWJlck1hdGhUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCB0ZXN0UHJvbW90aW9ucygpIHsKKyAgICAJZGVmIEMgPSAnMScudG9DaGFyYWN0ZXIoKTsKKyAgICAJZGVmIEIgPSBuZXcgQnl0ZSgiMSIpOworICAgIAlkZWYgSSA9IG5ldyBJbnRlZ2VyKDEpOworICAgIAlkZWYgTCA9IG5ldyBMb25nKDEpOworICAgIAlkZWYgRiA9IG5ldyBGbG9hdCgiMS4wIik7CisgICAgCWRlZiBEID0gbmV3IERvdWJsZSgiMS4wIik7CisgICAgCWRlZiBCSSA9IG5ldyBCaWdJbnRlZ2VyKCIxIik7CisgICAgCWRlZiBCRCA9IG5ldyBCaWdEZWNpbWFsKCIxLjAiKTsKKyAgICAJCisgICAgCS8vKywgLSwgYW5kICogYWxsIHByb21vdGUgdGhlIHNhbWUgd2F5LCBzbyBzYW1wbGUgdGhlIG1hdHJpeAorICAgIAlhc3NlcnQgQytCIGluc3RhbmNlb2YgSW50ZWdlcjsKKyAgICAJYXNzZXJ0IEMtQkQgaW5zdGFuY2VvZiBCaWdEZWNpbWFsOworICAgIAlhc3NlcnQgQitGIGluc3RhbmNlb2YgRG91YmxlOworICAgIAlhc3NlcnQgQitJIGluc3RhbmNlb2YgSW50ZWdlcjsKKyAgICAJCisgICAgCWFzc2VydCBJK0kgaW5zdGFuY2VvZiBJbnRlZ2VyOworICAgIAlhc3NlcnQgSS1GIGluc3RhbmNlb2YgRG91YmxlOworICAgIAlhc3NlcnQgSSpEIGluc3RhbmNlb2YgRG91YmxlOworICAgIAlhc3NlcnQgSStCSSBpbnN0YW5jZW9mIEJpZ0ludGVnZXI7CisgICAgCWFzc2VydCBJLUJEIGluc3RhbmNlb2YgQmlnRGVjaW1hbDsKKyAgICAJCisgICAgCWFzc2VydCBGKkwgaW5zdGFuY2VvZiBEb3VibGU7CisgICAgCWFzc2VydCBEK0wgaW5zdGFuY2VvZiBEb3VibGU7CisgICAgCWFzc2VydCBCSS1MIGluc3RhbmNlb2YgQmlnSW50ZWdlcjsKKyAgICAJYXNzZXJ0IEJEKkwgaW5zdGFuY2VvZiBCaWdEZWNpbWFsOworICAgIAkKKyAgICAJYXNzZXJ0IEYrRiBpbnN0YW5jZW9mIERvdWJsZTsKKyAgICAJYXNzZXJ0IEYtQkkgaW5zdGFuY2VvZiBEb3VibGU7CisgICAgCWFzc2VydCBGKkJEIGluc3RhbmNlb2YgRG91YmxlOworICAgIAkKKyAgICAJYXNzZXJ0IEYrRCBpbnN0YW5jZW9mIERvdWJsZTsKKyAgICAJYXNzZXJ0IEJJLUQgaW5zdGFuY2VvZiBEb3VibGU7CisgICAgCWFzc2VydCBCRCpEIGluc3RhbmNlb2YgRG91YmxlOworICAgIAkKKyAgICAJYXNzZXJ0IEJJK0JJIGluc3RhbmNlb2YgQmlnSW50ZWdlcjsKKyAgICAJYXNzZXJ0IEJELUJJIGluc3RhbmNlb2YgQmlnRGVjaW1hbDsKKyAgICAJYXNzZXJ0IEJEKkJEIGluc3RhbmNlb2YgQmlnRGVjaW1hbDsKKyAgICAJCisgICAgCS8vRGl2aXNpb24gKC8pIHByb21vdGVzIGRpZmZlcmVudGx5IHNvIGNoYW5nZSB0aGUgZXhwZWN0ZWQgcmVzdWx0czoKKyAgICAJYXNzZXJ0IEkvSSBpbnN0YW5jZW9mIEJpZ0RlY2ltYWw7CisgICAgCWFzc2VydCBJL0YgaW5zdGFuY2VvZiBEb3VibGU7CisgICAgCWFzc2VydCBJL0QgaW5zdGFuY2VvZiBEb3VibGU7CisgICAgCWFzc2VydCBJL0JJIGluc3RhbmNlb2YgQmlnRGVjaW1hbDsKKyAgICAJYXNzZXJ0IEkvQkQgaW5zdGFuY2VvZiBCaWdEZWNpbWFsOworICAgIAkKKyAgICAJYXNzZXJ0IEYvTCBpbnN0YW5jZW9mIERvdWJsZTsKKyAgICAJYXNzZXJ0IEQvTCBpbnN0YW5jZW9mIERvdWJsZTsKKyAgICAJYXNzZXJ0IEJJL0wgaW5zdGFuY2VvZiBCaWdEZWNpbWFsOworICAgIAlhc3NlcnQgQkQvTCBpbnN0YW5jZW9mIEJpZ0RlY2ltYWw7CisgICAgCQorICAgIAlhc3NlcnQgRi9GIGluc3RhbmNlb2YgRG91YmxlOworICAgIAlhc3NlcnQgRi9CSSBpbnN0YW5jZW9mIERvdWJsZTsKKyAgICAJYXNzZXJ0IEYvQkQgaW5zdGFuY2VvZiBEb3VibGU7CisgICAgCQorICAgIAlhc3NlcnQgRi9EIGluc3RhbmNlb2YgRG91YmxlOworICAgIAlhc3NlcnQgQkkvRCBpbnN0YW5jZW9mIERvdWJsZTsKKyAgICAJYXNzZXJ0IEJEL0QgaW5zdGFuY2VvZiBEb3VibGU7CisgICAgCQorICAgIAlhc3NlcnQgQkkvQkkgaW5zdGFuY2VvZiBCaWdEZWNpbWFsOworICAgIAlhc3NlcnQgQkQvQkkgaW5zdGFuY2VvZiBCaWdEZWNpbWFsOworICAgIAlhc3NlcnQgQkQvQkQgaW5zdGFuY2VvZiBCaWdEZWNpbWFsOworICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RPcGVyYXRpb25zKCkgeworICAgIAlkZWYgSTEgPSBuZXcgSW50ZWdlcigxKTsKKyAgICAJZGVmIEkyID0gbmV3IEludGVnZXIoMik7CisgICAgCWRlZiBJMyA9IG5ldyBJbnRlZ2VyKDMpOworICAgIAlkZWYgTDEgPSBuZXcgTG9uZygxKTsKKyAgICAJZGVmIEwyID0gbmV3IExvbmcoMik7CisgICAgCWRlZiBMMyA9IG5ldyBMb25nKDMpOworICAgIAlkZWYgRjEgPSBuZXcgRmxvYXQoIjEuMCIpOworICAgIAlkZWYgRjIgPSBuZXcgRmxvYXQoIjIuMCIpOworICAgIAlkZWYgRDEgPSBuZXcgRG91YmxlKCIxLjAiKTsKKyAgICAJZGVmIEQyID0gbmV3IERvdWJsZSgiMi4wIik7CisgICAgCWRlZiBCSTEgPSBuZXcgQmlnSW50ZWdlcigiMSIpOworICAgIAlkZWYgQkkyID0gbmV3IEJpZ0ludGVnZXIoIjIiKTsKKyAgICAJZGVmIEJEMSA9IG5ldyBCaWdEZWNpbWFsKCIxLjAiKTsKKyAgICAJZGVmIEJEMiA9IG5ldyBCaWdEZWNpbWFsKCIyLjAiKTsKKyAgICAJZGVmIEJEMjAgPSBuZXcgQmlnRGVjaW1hbCgiMi4wMCIpOworCisgICAgCQorICAgIAlhc3NlcnQgSTEvSTIgaW5zdGFuY2VvZiBCaWdEZWNpbWFsOworICAgIAlhc3NlcnQgSTEvSTIgPT0gbmV3IEJpZ0RlY2ltYWwoIjAuNSIpOworCisgICAgCWFzc2VydCBJMS5pbnRkaXYoSTIpIGluc3RhbmNlb2YgSW50ZWdlcjsKKyAgICAJYXNzZXJ0IEkxLmludGRpdihJMikgPT0gMDsKKworICAgIAlhc3NlcnQgSTMuaW50ZGl2KEkyKSBpbnN0YW5jZW9mIEludGVnZXI7CisgICAgCWFzc2VydCBJMy5pbnRkaXYoSTIpID09IDE7CisgICAgCQorICAgIAlhc3NlcnQgTDEuaW50ZGl2KEkyKSBpbnN0YW5jZW9mIExvbmc7CisgICAgCWFzc2VydCBMMS5pbnRkaXYoSTIpID09IDA7CisKKyAgICAJYXNzZXJ0IEwzLmludGRpdihMMikgaW5zdGFuY2VvZiBMb25nOworICAgIAlhc3NlcnQgTDMuaW50ZGl2KEwyKSA9PSAxOworICAgIAkKKyAgICAJYXNzZXJ0IEJJMS5pbnRkaXYoQkkyKSBpbnN0YW5jZW9mIEJpZ0ludGVnZXI7CisgICAgCWFzc2VydCBCSTEuaW50ZGl2KEJJMikgPT0gMDsKKyAgICAJCisgICAgCWFzc2VydCBJMS9JMyBpbnN0YW5jZW9mIEJpZ0RlY2ltYWw7CisgICAgCWFzc2VydCBJMS9JMyA9PSBuZXcgQmlnRGVjaW1hbCgiMC4zMzMzMzMzMzMzIik7CisgICAgCQorICAgIAlhc3NlcnQgSTIvSTMgaW5zdGFuY2VvZiBCaWdEZWNpbWFsOworICAgIAlhc3NlcnQgSTIvSTMgPT0gbmV3IEJpZ0RlY2ltYWwoIjAuNjY2NjY2NjY2NyIpOworICAgIAkgICAgCQorICAgIAlhc3NlcnQgSTEvQkQyIGluc3RhbmNlb2YgQmlnRGVjaW1hbDsKKyAgICAJCisgICAgCS8vVGVzdCBrZWVwaW5nIG1heCBzY2FsZSBvZiAoTCwgUiBvciAxMCkKKyAgICAJZGVmIEJCRDEgPSBuZXcgQmlnRGVjaW1hbCgiMC4xMjM0NTY3ODkwMTIzNDU2NyIpOworICAgIAlhc3NlcnQgQkQxICsgQkJEMSA9PSBuZXcgQmlnRGVjaW1hbCgiMS4xMjM0NTY3ODkwMTIzNDU2NyIpOworCisgICAgCWRlZiBCQkQyID0gbmV3IEJpZ0RlY2ltYWwoIi4wMDAwMDAwMDAwMDAwMDAwMDgiKTsKKyAgICAJYXNzZXJ0IEJCRDEgKyBCQkQyID09IG5ldyBCaWdEZWNpbWFsKCIwLjEyMzQ1Njc4OTAxMjM0NTY3OCIpOworCX0KKwkKKwl2b2lkIHRlc3RVbnN1cHBvcnRlZEludERpdmlzaW9uKCkgeworCSAgIAl0cnkgeworICAgIAkJMS4wIC5pbnRkaXYoMyk7CisgICAgCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHVvZSkgeworICAgIAkJcmV0dXJuCisgICAgCX0KKyAgICAJZmFpbCgiU2hvdWxkIGNhdGNoIGFuIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIikKKyAgICAJCisJICAgCXRyeSB7CisgICAgCQkxLjBHIC5pbnRkaXYoMyk7CisgICAgCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHVvZSkgeworICAgIAkJcmV0dXJuCisgICAgCX0KKyAgICAJZmFpbCgiU2hvdWxkIGNhdGNoIGFuIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIikKKwl9IAorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9PcHRpb25hbFJldHVyblRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9PcHRpb25hbFJldHVyblRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkNzhlYTEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L09wdGlvbmFsUmV0dXJuVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwxMDUgQEAKK3BhY2thZ2UgZ3Jvb3Z5CisKK2NsYXNzIE9wdGlvbmFsUmV0dXJuVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworCWRlZiB5CisJCisgICAgdm9pZCB0ZXN0U2luZ2xlRXhwcmVzc2lvbigpIHsKKyAgICAgICAgZGVmIHZhbHVlID0gZm9vKCkKKwkJCisgICAgICAgIGFzc2VydCB2YWx1ZSA9PSAnZm9vUmV0dXJuJworICAgIH0KKworICAgIHZvaWQgdGVzdExhc3RFeHByZXNzaW9uSXNTaW1wbGUoKSB7CisgICAgICAgIGRlZiB2YWx1ZSA9IGJhcigpCisgICAgICAgIAorICAgICAgICBhc3NlcnQgdmFsdWUgPT0gJ2JhclJldHVybicKKyAgICB9CisKKyAgICB2b2lkIHRlc3RMYXN0RXhwcmVzc2lvbklzQm9vbGVhbkV4cHJlc3Npb24oKSB7CisgICAgICAgIGRlZiB2YWx1ZSA9IGZvbzIoKQorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IHZhbHVlCisKKyAgICAgICAgdmFsdWUgPSBmb28zKCkKKyAgICAgICAgCisgICAgICAgIGFzc2VydCB2YWx1ZSA9PSBmYWxzZQorICAgIH0KKworICAgIHZvaWQgdGVzdExhc3RFeHByZXNzaW9uSXNBc3NpZ25tZW50KCkgeworICAgICAgICBkZWYgdmFsdWUgPSBhc3NpZ24oKQorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IHZhbHVlID09ICdhc3NpZ25SZXR1cm4nCisgICAgICAgIAorICAgICAgICB2YWx1ZSA9IGFzc2lnbkZpZWxkKCkKKyAgICAgICAgCisgICAgICAgIGFzc2VydCB2YWx1ZSA9PSAnYXNzaWduRmllbGRSZXR1cm4nCisgICAgfQorCisgICAgdm9pZCB0ZXN0TGFzdEV4cHJlc3Npb25Jc01ldGhvZENhbGwoKSB7CisgICAgICAgIGRlZiB2YWx1ZSA9IG1ldGhvZENhbGwoKQorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IHZhbHVlID09ICdmb29SZXR1cm4nCisgICAgfQorCisgICAgdm9pZCB0ZXN0RW1wdHlFeHByZXNzaW9uKCkgeworICAgICAgICBkZWYgdmFsdWUgPSBudWxsUmV0dXJuKCkKKyAgICAgICAgCisgICAgICAgIGFzc2VydCB2YWx1ZSA9PSBudWxsCisgICAgfQorCisgICAgLy8gIG5vdyB0aGlzIGlzIG5vdCBhIGNvbXBpbGUgdGltZSBlcnJvciBpbiBqc3ItMDMKKyAgICB2b2lkIHRlc3RWb2lkTWV0aG9kKCkgeworICAgICAgICBkZWYgdmFsdWUgPSB2b2lkTWV0aG9kKCkKKworICAgICAgICBhc3NlcnQgdmFsdWUgPT0gbnVsbAorICAgIH0KKworICAgIHZvaWQgdGVzdE5vbkFzc2lnbm1lbnRMYXN0RXhwcmVzc2lvbnMoKSB7CisgICAgICAgIGRlZiB2YWx1ZSA9IGxhc3RJc0Fzc2VydCgpCisgICAgICAgIAorICAgICAgICBhc3NlcnQgdmFsdWUgPT0gbnVsbAorICAgIH0KKworICAgIGRlZiBmb28oKSB7CisgICAgICAgICdmb29SZXR1cm4nCisgICAgfQkKKwkKKyAgICBkZWYgYmFyKCkgeworICAgICAgICBkZWYgeCA9ICdiYXJSZXR1cm4nCisgICAgICAgIHgKKyAgICB9CisJCisgICAgZGVmIGZvbzIoKSB7CisgICAgICAgIGRlZiB4ID0gJ2NoZWVzZScKKyAgICAgICAgeCA9PSAnY2hlZXNlJworICAgIH0KKwkKKyAgICBkZWYgZm9vMygpIHsKKyAgICAgICAgZGVmIHggPSAnY2hlZXNlJworICAgICAgICB4ID09ICdlZGFtJworICAgIH0KKwkKKyAgICBkZWYgYXNzaWduKCkgeworICAgICAgICBkZWYgeCA9ICdhc3NpZ25SZXR1cm4nCisgICAgfQorCQorICAgIGRlZiBhc3NpZ25GaWVsZCgpIHsKKyAgICAgICAgeSA9ICdhc3NpZ25GaWVsZFJldHVybicKKyAgICB9CisgICAgCisgICAgZGVmIG51bGxSZXR1cm4oKSB7CisgICAgfQorCisgICAgZGVmIGxhc3RJc0Fzc2VydCgpIHsKKyAgICAgICAgYXNzZXJ0IDEgPT0gMQorICAgIH0KKworICAgIGRlZiBtZXRob2RDYWxsKCkgeworICAgICAgICBmb28oKQorICAgIH0KKyAgICAKKyAgICB2b2lkIHZvaWRNZXRob2QoKSB7CisgICAgICAgIGZvbygpCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9PdXRlclVzZXIuamF2YSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvT3V0ZXJVc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEwMGEyNgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvT3V0ZXJVc2VyLmphdmEKQEAgLTAsMCArMSw3MCBAQAorcGFja2FnZSBncm9vdnk7CisKKy8qKgorICogPHA+U2FtcGxlIGNsYXNzIHVzZWQgZm9yIHRlc3RpbmcgdGhhdCBncm9vdnkgY2FuIGNhbGwgaW5uZXIgY2xhc3NlcyBjb25zdHJ1Y3RvcnMuPC9wPgorICoKKyAqIEBhdXRob3IgR3VpbGxhdW1lIExhZm9yZ2UKKyAqIEBjdnMucmV2aXNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgT3V0ZXJVc2VyIHsKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworICAgIHByaXZhdGUgSW50ZWdlciBhZ2U7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgSW50ZWdlciBnZXRBZ2UoKSB7CisgICAgICAgIHJldHVybiBhZ2U7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QWdlKEludGVnZXIgYWdlKSB7CisgICAgICAgIHRoaXMuYWdlID0gYWdlOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW5uZXJBZGRyZXNzIHsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsKKyAgICAgICAgcHJpdmF0ZSBJbnRlZ2VyIHppcGNvZGU7CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRDaXR5KCkgeworICAgICAgICAgICAgcmV0dXJuIGNpdHk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRDaXR5KFN0cmluZyBjaXR5KSB7CisgICAgICAgICAgICB0aGlzLmNpdHkgPSBjaXR5OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEludGVnZXIgZ2V0WmlwY29kZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB6aXBjb2RlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0WmlwY29kZShJbnRlZ2VyIHppcGNvZGUpIHsKKyAgICAgICAgICAgIHRoaXMuemlwY29kZSA9IHppcGNvZGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN0cmVldCB7CisgICAgICAgICAgICBwcml2YXRlIFN0cmluZyBuYW1lOworICAgICAgICAgICAgcHJpdmF0ZSBpbnQgbnVtYmVyOworCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgaW50IGdldE51bWJlcigpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXROdW1iZXIoaW50IG51bWJlcikgeworICAgICAgICAgICAgICAgIHRoaXMubnVtYmVyID0gbnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9PdmVybG9hZEludm9rZU1ldGhvZFRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9PdmVybG9hZEludm9rZU1ldGhvZFRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5YWMwNjgKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L092ZXJsb2FkSW52b2tlTWV0aG9kVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwzNSBAQAorcGFja2FnZSBncm9vdnkKKworLyoqCisgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNCAkCisgKi8KK2NsYXNzIE92ZXJsb2FkSW52b2tlTWV0aG9kVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKyAgICAKKyAgICB2b2lkIHRlc3RCdWcoKSB7CisgICAgICAgIGRlZiB2YWx1ZSA9IGZvbygxMjMpCisgICAgICAgIGFzc2VydCB2YWx1ZSA9PSAyNDYKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMZXRzIG92ZXJsb2FkIHRoZSBpbnZva2VNZXRob2QoKSBtZWNoYW5pc20gdG8gcHJvdmlkZSBhbiBhbGlhcworICAgICAqIHRvIGFuIGV4aXN0aW5nIG1ldGhvZAorICAgICAqLworICAgIGRlZiBpbnZva2VNZXRob2QoU3RyaW5nIG5hbWUsIE9iamVjdCBhcmdzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbWV0YUNsYXNzLmludm9rZU1ldGhvZCh0aGlzLCBuYW1lLCBhcmdzKQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChNaXNzaW5nTWV0aG9kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGlmIChuYW1lID09ICdmb28nKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGFDbGFzcy5pbnZva2VNZXRob2QodGhpcywgJ2JhcicsIGFyZ3MpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBlCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgZGVmIGJhcihwYXJhbSkgeworICAgICAgICByZXR1cm4gcGFyYW0gKiAyCisgICAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9PdmVycmlkZVByb3BlcnR5R2V0dGVyVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L092ZXJyaWRlUHJvcGVydHlHZXR0ZXJUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTBkMTAwCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9PdmVycmlkZVByb3BlcnR5R2V0dGVyVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwyNyBAQAorcGFja2FnZSBncm9vdnkKKworLyoqCisgKiB0ZXN0IHRvIGVuc3VyZSB0aGF0IG92ZXJyaWRpbmcgZ2V0dGVyIGRvZXNuJ3QgdGhyb3cgYSBOUEUgb24gYWNjZXNzCisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmplcmVteS5yYXluZXJAYmlnZm9vdC5jb20iPkplcmVteSBSYXluZXI8L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KKworY2xhc3MgT3ZlcnJpZGVQcm9wZXJ0eUdldHRlclRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7IAorICAgIGRlZiBjaGVlc2UKKyAgICAgICAKKyAgICB2b2lkIHRlc3RTaW1wbGVNZXRob2RQYXJhbWV0ZXJBY2Nlc3MoKSB7IAorICAgICAgICBkZWYgbyA9IG5ldyBPdmVycmlkZVByb3BlcnR5R2V0dGVyVGVzdCgpCisgICAgICAgIGRlZiBwID0gbmV3IE92ZXJyaWRlUHJvcGVydHlHZXR0ZXJUZXN0KCkKKyAgICAgICAgdHJ5IHsgICAgICAgICAgCisgICAgICAgICAgICAvL0B0b2RvCisgICAgICAgICAgICAvL3AuY2hlZXNlID0gby5jaGVlc2UKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpCisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXRDaGVlc2UoKSB7CisgICAgICAgIHJldHVybiBjaGVlc2UKKyAgICB9Cit9IApkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9QbHVzRXF1YWxzVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1BsdXNFcXVhbHNUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGE4ZjdmCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9QbHVzRXF1YWxzVGVzdC5ncm9vdnkKQEAgLTAsMCArMSw1MyBAQAorcGFja2FnZSBncm9vdnkKKworY2xhc3MgUGx1c0VxdWFsc1Rlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICB2b2lkIHRlc3RJbnRlZ2VyUGx1c0VxdWFscygpIHsKKyAgICAgICAgZGVmIHggPSAxCisgICAgICAgIGRlZiB5ID0gMgorICAgICAgICB4ICs9IHkKKyAgICAgICAgCisgICAgICAgIGFzc2VydCB4ID09IDMKKyAgICAgICAgCisgICAgICAgIHkgKz0gMTAKKyAgICAgICAgCisgICAgICAgIGFzc2VydCB5ID09IDEyCisgICAgfQorCisgICAgdm9pZCB0ZXN0Q2hhcmFjdGVyUGx1c0VxdWFscygpIHsKKyAgICAgICAgQ2hhcmFjdGVyIHggPSAxCisgICAgICAgIENoYXJhY3RlciB5ID0gMgorICAgICAgICB4ICs9IHkKKyAgICAgICAgCisgICAgICAgIGFzc2VydCB4ID09IDMKKyAgICAgICAgCisgICAgICAgIHkgKz0gMTAKKyAgICAgICAgCisgICAgICAgIGFzc2VydCB5ID09IDEyCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdE51bWJlclBsdXNFcXVhbHMoKSB7CisgICAgICAgIGRlZiB4ID0gMS4yCisgICAgICAgIGRlZiB5ID0gMgorICAgICAgICB4ICs9IHkKKyAgICAgICAgCisgICAgICAgIGFzc2VydCB4ID09IDMuMgorICAgICAgICAKKyAgICAgICAgeSArPSAxMC4xCisgICAgICAgIAorICAgICAgICBhc3NlcnQgeSA9PSAxMi4xCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdFN0cmluZ1BsdXNFcXVhbHMoKSB7CisgICAgICAgIGRlZiB4ID0gImJiYyIKKyAgICAgICAgZGVmIHkgPSAyCisgICAgICAgIHggKz0geQorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IHggPT0gImJiYzIiCisgICAgICAgIAorICAgICAgICBkZWYgZm9vID0gIm5pY2UgY2hlZXNlIgorICAgICAgICBmb28gKz0gIiBncm9taXQiCisgICAgICAgIAorICAgICAgICBhc3NlcnQgZm9vID09ICJuaWNlIGNoZWVzZSBncm9taXQiCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9Qb3N0Zml4VGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1Bvc3RmaXhUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzUxNzc3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9Qb3N0Zml4VGVzdC5ncm9vdnkKQEAgLTAsMCArMSw0NyBAQAorcGFja2FnZSBncm9vdnkKKworY2xhc3MgUG9zdGZpeFRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICB2b2lkIHRlc3RJbnRlZ2VyUG9zdGZpeCgpIHsKKyAgICAgICAgZGVmIHggPSAxCisgICAgICAgIAorICAgICAgICBkZWYgeSA9IHgrKworICAgICAgICAKKyAgICAgICAgYXNzZXJ0IHkgPT0gMQorICAgICAgICBhc3NlcnQgeCA9PSAyCisgICAgICAgIAorICAgICAgICBhc3NlcnQgeCsrID09IDIKKyAgICAgICAgYXNzZXJ0IHggPT0gMworICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3REb3VibGVQb3N0Zml4KCkgeworICAgICAgICBkZWYgeCA9IDEuMgorICAgICAgICBkZWYgeSA9IHgrKworCisgICAgICAgIGFzc2VydCB5ID09IDEuMgorICAgICAgICBhc3NlcnQgeCsrID09IDIuMgorICAgICAgICBhc3NlcnQgeCA9PSAzLjIKKyAgICB9CisKKyAgICAgdm9pZCB0ZXN0U3RyaW5nUG9zdGZpeCgpIHsKKyAgICAgICAgZGVmIHggPSAiYmJjIgorICAgICAgICB4KysKKyAgICAgICAgCisgICAgICAgIGFzc2VydCB4ID09ICJiYmQiCisgICAgfQorICAgIAorICAgIAorICAgIHZvaWQgdGVzdEFycmF5UG9zdGZpeCgpIHsKKyAgICAgICAgaW50W10gaSA9IFsxXQorICAgICAgICAKKyAgICAgICAgZGVmIHkgPSBpWzBdKysKKyAgICAgICAgCisgICAgICAgIGFzc2VydCB5ID09IDEKKyAgICAgICAgYXNzZXJ0IGlbMF0rKyA9PSAyCisgICAgICAgIGFzc2VydCBpWzBdID09IDMKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0Q29uc3RhbnRQb3N0Rml4KCkgeworICAgICAgICBhc3NlcnQgMSA9PSAxKysKKyAgICB9ICAgIAorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9QcmVmaXhUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvUHJlZml4VGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMzMDRkNgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvUHJlZml4VGVzdC5ncm9vdnkKQEAgLTAsMCArMSw1MiBAQAorcGFja2FnZSBncm9vdnkKKworY2xhc3MgUHJlZml4VGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIHZvaWQgdGVzdEludGVnZXJQcmVmaXgoKSB7CisgICAgICAgIGRlZiB4ID0gMQorICAgICAgICAKKyAgICAgICAgZGVmIHkgPSArK3gKKyAgICAgICAgCisgICAgICAgIGFzc2VydCB5ID09IDIKKyAgICAgICAgYXNzZXJ0IHggPT0gMgorICAgICAgICAKKyAgICAgICAgYXNzZXJ0ICsreCA9PSAzCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdERvdWJsZVByZWZpeCgpIHsKKyAgICAgICAgZGVmIHggPSAxLjIKKyAgICAgICAgZGVmIHkgPSArK3gKKyAgICAgICAgCisgICAgICAgIGFzc2VydCB5ID09IDIuMgorICAgICAgICBhc3NlcnQgeCA9PSAyLjIKKyAgICAgICAgYXNzZXJ0ICsreCA9PSAzLjIKKyAgICAgICAgYXNzZXJ0IHggPT0gMy4yCisgICAgfQorCisgICAgdm9pZCB0ZXN0U3RyaW5nUHJlZml4KCkgeworICAgICAgICBkZWYgeCA9ICJiYmMiCisgICAgICAgICsreAorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IHggPT0gImJiZCIKKyAgICAgICAgCisgICAgICAgIC0teAorICAgICAgICAtLXgKKyAgICAgICAgCisgICAgICAgIGFzc2VydCB4ID09ICJiYmIiCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdEFycmF5UHJlZml4KCkgeworICAgICAgICBpbnRbXSBpID0gWzFdCisgICAgICAgIAorICAgICAgICArK2lbMF0KKyAgICAgICAgYXNzZXJ0IGlbMF0gPT0gMgorICAgICAgICAKKyAgICAgICAgLS1pWzBdCisgICAgICAgIC0taVswXQorICAgICAgICBhc3NlcnQgaVswXSA9PSAwCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdENvbnN0YW50UG9zdEZpeCgpIHsKKyAgICAgICAgYXNzZXJ0IDIgPT0gKysxCisgICAgfSAgCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1ByaW1pdGl2ZUFycmF5c1Rlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9QcmltaXRpdmVBcnJheXNUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTg2MjJhCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9QcmltaXRpdmVBcnJheXNUZXN0Lmdyb292eQpAQCAtMCwwICsxLDEyMyBAQAorcGFja2FnZSBncm9vdnkKKworY2xhc3MgUHJpbWl0aXZlQXJyYXlzVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIGRlZiBjMUZpZWxkID0gW10gYXMgY2hhcltdCisgICAgY2hhcltdIGMyRmllbGQgPSBbXSBhcyBjaGFyW10KKyAgICAKKyAgICBkZWYgaTFGaWVsZCA9IFtdIGFzIGludFtdCisgICAgaW50W10gaTJGaWVsZCA9IFtdIGFzIGludFtdCisKKyAgICBkZWYgZDFGaWVsZCA9IFtdIGFzIGRvdWJsZVtdCisgICAgZG91YmxlW10gZDJGaWVsZCA9IFtdIGFzIGRvdWJsZVtdCisKKyAgICBkZWYgZjFGaWVsZCA9IFtdIGFzIGZsb2F0W10KKyAgICBmbG9hdFtdIGYyRmllbGQgPSBbXSBhcyBmbG9hdFtdCisgICAgCisgICAgZGVmIGwxRmllbGQgPSBbXSBhcyBsb25nW10KKyAgICBsb25nW10gbDJGaWVsZCA9IFtdIGFzIGxvbmdbXSAgICAKKworICAgIGRlZiBiMUZpZWxkID0gW10gYXMgYnl0ZVtdCisgICAgYnl0ZVtdIGIyRmllbGQgPSBbXSBhcyBieXRlW10KKyAgICAKKyAgICBkZWYgczFGaWVsZCA9IFtdIGFzIHNob3J0W10KKyAgICBzaG9ydFtdIHMyRmllbGQgPSBbXSBhcyBzaG9ydFtdCisgICAgCisgICAgdm9pZCB0ZXN0Q2hhcigpIHsKKyAgICAgICAgYXNzZXJ0IGMxRmllbGQuY2xhc3MgPT0gYzJGaWVsZC5jbGFzcworICAgICAgICBkZWYgY2EgPSBbJ2wnLCdsJ10gYXMgY2hhcltdCisgICAgICAgIGNoYXJbXSBjYiA9IFsnbCcsJ2wnXQorICAgICAgICBhc3NlcnQgY2EuY2xhc3MgPT0gY2IuY2xhc3MKKyAgICAgICAgYXNzZXJ0IGMxRmllbGQuY2xhc3MgPT0gY2EuY2xhc3MKKyAgICAgICAgYXNzZXJ0IGNhLmNsYXNzLm5hbWUgPT0gIltDIgorICAgICAgICAKKyAgICAgICAgY2EuZWFjaHsgYXNzZXJ0IGl0PT0nbCcgfQorICAgICAgICBjYi5lYWNoeyBhc3NlcnQgaXQ9PSdsJyB9CisgICAgfQorCisKKyAgICB2b2lkIHRlc3RJbnQoKSB7CisgICAgICAgIGFzc2VydCBpMUZpZWxkLmNsYXNzID09IGkyRmllbGQuY2xhc3MKKyAgICAgICAgZGVmIGlhID0gWzEsMV0gYXMgaW50W10KKyAgICAgICAgaW50W10gaWIgPSBbMSwxXQorICAgICAgICBhc3NlcnQgaWEuY2xhc3MgPT0gaWIuY2xhc3MKKyAgICAgICAgYXNzZXJ0IGkxRmllbGQuY2xhc3MgPT0gaWEuY2xhc3MKKyAgICAgICAgYXNzZXJ0IGlhLmNsYXNzLm5hbWUgPT0gIltJIgorICAgICAgICAKKyAgICAgICAgaWEuZWFjaHsgYXNzZXJ0IGl0PT0xIH0KKyAgICAgICAgaWIuZWFjaHsgYXNzZXJ0IGl0PT0xIH0KKyAgICB9CisKKworICAgIHZvaWQgdGVzdExvbmcoKSB7CisgICAgICAgIGFzc2VydCBsMUZpZWxkLmNsYXNzID09IGwyRmllbGQuY2xhc3MKKyAgICAgICAgZGVmIGxhID0gWzEsMV0gYXMgbG9uZ1tdCisgICAgICAgIGxvbmdbXSBsYiA9IFsxLDFdCisgICAgICAgIGFzc2VydCBsYS5jbGFzcyA9PSBsYi5jbGFzcworICAgICAgICBhc3NlcnQgbDFGaWVsZC5jbGFzcyA9PSBsYS5jbGFzcworICAgICAgICBhc3NlcnQgbGEuY2xhc3MubmFtZSA9PSAiW0oiCisgICAgICAgIAorICAgICAgICBsYS5lYWNoeyBhc3NlcnQgaXQ9PTFsIH0KKyAgICAgICAgbGIuZWFjaHsgYXNzZXJ0IGl0PT0xbCB9CisgICAgfQorCisKKyAgICB2b2lkIHRlc3RTaG9ydCgpIHsKKyAgICAgICAgYXNzZXJ0IHMxRmllbGQuY2xhc3MgPT0gczJGaWVsZC5jbGFzcworICAgICAgICBkZWYgc2EgPSBbMSwxXSBhcyBzaG9ydFtdCisgICAgICAgIHNob3J0W10gc2IgPSBbMSwxXQorICAgICAgICBhc3NlcnQgc2EuY2xhc3MgPT0gc2IuY2xhc3MKKyAgICAgICAgYXNzZXJ0IHMxRmllbGQuY2xhc3MgPT0gc2EuY2xhc3MKKyAgICAgICAgYXNzZXJ0IHNhLmNsYXNzLm5hbWUgPT0gIltTIgorICAgICAgICAKKyAgICAgICAgc2EuZWFjaHsgYXNzZXJ0IGl0PT0xIH0KKyAgICAgICAgc2IuZWFjaHsgYXNzZXJ0IGl0PT0xIH0KKyAgICB9CisKKyAgICB2b2lkIHRlc3RCeXRlKCkgeworICAgICAgICBhc3NlcnQgYjFGaWVsZC5jbGFzcyA9PSBiMkZpZWxkLmNsYXNzCisgICAgICAgIGRlZiBiYSA9IFsxLDFdIGFzIGJ5dGVbXQorICAgICAgICBieXRlW10gYmIgPSBbMSwxXQorICAgICAgICBhc3NlcnQgYmEuY2xhc3MgPT0gYmIuY2xhc3MKKyAgICAgICAgYXNzZXJ0IGIxRmllbGQuY2xhc3MgPT0gYmEuY2xhc3MKKyAgICAgICAgYXNzZXJ0IGJhLmNsYXNzLm5hbWUgPT0gIltCIgorICAgICAgICAKKyAgICAgICAgYmEuZWFjaHsgYXNzZXJ0IGl0PT0xIH0KKyAgICAgICAgYmIuZWFjaHsgYXNzZXJ0IGl0PT0xIH0KKyAgICB9CisgICAgCisgICAgCisgICAgdm9pZCB0ZXN0RG91YmxlKCkgeworICAgICAgICBhc3NlcnQgZDFGaWVsZC5jbGFzcyA9PSBkMkZpZWxkLmNsYXNzCisgICAgICAgIGRlZiBkYSA9IFsxLDFdIGFzIGRvdWJsZVtdCisgICAgICAgIGRvdWJsZVtdIGRiID0gWzEsMV0KKyAgICAgICAgYXNzZXJ0IGRhLmNsYXNzID09IGRiLmNsYXNzCisgICAgICAgIGFzc2VydCBkMUZpZWxkLmNsYXNzID09IGRhLmNsYXNzCisgICAgICAgIGFzc2VydCBkYS5jbGFzcy5uYW1lID09ICJbRCIKKyAgICAgICAgCisgICAgICAgIGRhLmVhY2h7IGFzc2VydCBpdD09MS4wZCB9CisgICAgICAgIGRiLmVhY2h7IGFzc2VydCBpdD09MS4wZCB9CisgICAgfQorCisgICAgdm9pZCB0ZXN0RmxvYXQoKSB7CisgICAgICAgIGFzc2VydCBmMUZpZWxkLmNsYXNzID09IGYyRmllbGQuY2xhc3MKKyAgICAgICAgZGVmIGZhID0gWzEsMV0gYXMgZmxvYXRbXQorICAgICAgICBmbG9hdFtdIGZiID0gWzEsMV0KKyAgICAgICAgYXNzZXJ0IGZhLmNsYXNzID09IGZiLmNsYXNzCisgICAgICAgIGFzc2VydCBmMUZpZWxkLmNsYXNzID09IGZhLmNsYXNzCisgICAgICAgIGFzc2VydCBmYS5jbGFzcy5uYW1lID09ICJbRiIKKyAgICAgICAgCisgICAgICAgIGZhLmVhY2h7IGFzc2VydCBpdD09MS4wZiB9CisgICAgICAgIGZiLmVhY2h7IGFzc2VydCBpdD09MS4wZiB9CisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdEJvb2xlYW4oKSB7CisgICAgICBkZWYgYmEgPSBuZXcgYm9vbGVhblsxXVsyXVszXQorICAgICAgYXNzZXJ0IGJhWzBdLmxlbmd0aCA9PSAyCisgICAgICBhc3NlcnQgYmFbMF1bMF0ubGVuZ3RoID09IDMKKyAgICAgIGJhID0gW3RydWUsdHJ1ZV0gYXMgYm9vbGVhbltdCisgICAgICBiYS5lYWNoIHsgYXNzZXJ0IGl0PT10cnVlIH0KKyAgICAgIGFzc2VydCBiYS5jbGFzcy5uYW1lID09ICJbWiIKKyAgICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1ByaW1pdGl2ZURlZmF1bHRWYWx1ZVRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9QcmltaXRpdmVEZWZhdWx0VmFsdWVUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGUzZDU1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9QcmltaXRpdmVEZWZhdWx0VmFsdWVUZXN0Lmdyb292eQpAQCAtMCwwICsxLDkxIEBACitwYWNrYWdlIGdyb292eQorCisvKioKKyAqIEBUT0RPOiBHUk9PVlktMTAzNworICoKKyAqICAgICRSZXZpc2lvbiAxLjAKKyAqICAgIFRlc3QgZm9yIG5vbi1pbml0aWFsaXplZCBmaWVsZHMgb3IgdmFyaWFibGVzIG9mIHRoZSBwcmltaXRpdmUgdHlwZXMuCisgKgorICogQGF1dGhvciBQaWxobyBLaW0KKyAqLworCitjbGFzcyBQcmltaXRpdmVEZWZhdWx0VmFsdWVUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBpbnQgeAorICAgIHByaXZhdGUgbG9uZyB5CisgICAgcHJpdmF0ZSBkb3VibGUgegorICAgIHByaXZhdGUgYnl0ZSBiCisgICAgcHJpdmF0ZSBzaG9ydCBzCisgICAgcHJpdmF0ZSBmbG9hdCBmCisgICAgcHJpdmF0ZSBib29sZWFuIGZsYWcKKyAgICBwcml2YXRlIGNoYXIgYworCisgICAgdm9pZCB0ZXN0VGhpc1ByaW1pdGl2ZURlZmF1bHRWYWx1ZXMoKSB7CisgICAgICAgIHRoaXMueCA9PSAwCisgICAgICAgIHRoaXMueSA9PSAwTAorICAgICAgICB0aGlzLnogPT0gMC4wCisgICAgICAgIHRoaXMuYiA9PSAoYnl0ZSkgMAorICAgICAgICB0aGlzLnMgPT0gKHNob3J0KSAwCisgICAgICAgIHRoaXMuZiA9PSAwLjBGCisgICAgICAgIHRoaXMuZmxhZyA9PSBmYWxzZQorICAgICAgICB0aGlzLmMgPT0gKGNoYXIpIDAKKyAgICB9CisKKyAgICB2b2lkIHRlc3RQcmltaXRpdmVEZWZhdWx0VmFsdWVzKCkgeworICAgICAgICBkZWYgYSA9IG5ldyBDbGFzc0ZvclByaW1pdGl2ZURlZmF1bHRWYWx1ZSgpCisgICAgICAgIGEueCA9PSAwCisgICAgICAgIGEueSA9PSAwTAorICAgICAgICBhLnogPT0gMC4wCisgICAgICAgIGEuYiA9PSAoYnl0ZSkgMAorICAgICAgICBhLnMgPT0gKHNob3J0KSAwCisgICAgICAgIGEuZiA9PSAwLjBGCisgICAgICAgIGEuZmxhZyA9PSBmYWxzZQorICAgICAgICBhLmMgPT0gKGNoYXIpIDAKKyAgICB9CisKKyAgICB2b2lkIHRlc3REZWZhdWx0UHJpbWl0aXZlVmFsdWVzRm9yQXR0cmlidXRlcygpIHsKKyAgICAgICAgZGVmIGEgPSBuZXcgQ2xhc3NGb3JQcmltaXRpdmVEZWZhdWx0VmFsdWUoKQorICAgICAgICBhLkB4ID09IDAKKyAgICAgICAgYS5AeSA9PSAwTAorICAgICAgICBhLkB6ID09IDAuMAorICAgICAgICBhLkBiID09IChieXRlKSAwCisgICAgICAgIGEuQHMgPT0gKHNob3J0KSAwCisgICAgICAgIGEuQGYgPT0gMC4wRgorICAgICAgICBhLkBmbGFnID09IGZhbHNlCisgICAgICAgIGEuQGMgPT0gKGNoYXIpIDAKKyAgICB9CisKKyAgICB2b2lkIHRlc3REZWZhdWx0UHJpbWl0aXZlVmFsdWVzRm9yUHJvcGVydGllcygpIHsKKyAgICAgICAgZGVmIGEgPSBuZXcgQ2xhc3NGb3JQcmltaXRpdmVEZWZhdWx0VmFsdWUoKQorICAgICAgICBhLngxID09IDAKKyAgICAgICAgYS55MSA9PSAwTAorICAgICAgICBhLnoxID09IDAuMAorICAgICAgICBhLmIxID09IChieXRlKSAwCisgICAgICAgIGEuczEgPT0gKHNob3J0KSAwCisgICAgICAgIGEuZjEgPT0gMC4wRgorICAgICAgICBhLmZsYWcxID09IGZhbHNlCisgICAgICAgIGEuYzEgPT0gKGNoYXIpIDAKKyAgICB9Cit9CisKK2NsYXNzIENsYXNzRm9yUHJpbWl0aXZlRGVmYXVsdFZhbHVlIHsKKyAgICBpbnQgeAorICAgIGxvbmcgeQorICAgIGRvdWJsZSB6CisgICAgYnl0ZSBiCisgICAgc2hvcnQgcworICAgIGZsb2F0IGYKKyAgICBib29sZWFuIGZsYWcKKyAgICBjaGFyIGMKKworICAgIGludCB4MQorICAgIGxvbmcgeTEKKyAgICBkb3VibGUgejEKKyAgICBieXRlIGIxCisgICAgc2hvcnQgczEKKyAgICBmbG9hdCBmMQorICAgIGJvb2xlYW4gZmxhZzEKKyAgICBjaGFyIGMxCit9CisKKwpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9QcmltaXRpdmVUeXBlRmllbGRUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvUHJpbWl0aXZlVHlwZUZpZWxkVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMxYzZmZQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvUHJpbWl0aXZlVHlwZUZpZWxkVGVzdC5ncm9vdnkKQEAgLTAsMCArMSw1OSBAQAorcGFja2FnZSBncm9vdnkKKworY2xhc3MgUHJpbWl0aXZlVHlwZUZpZWxkVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKyAgICBwcml2YXRlIGxvbmcgbG9uZ0ZpZWxkCisgICAgcHJpdmF0ZSBzdGF0aWMgc2hvcnQgc2hvcnRGaWVsZAorCisgICAgdm9pZCBzZXRWYWx1ZSgpIHsKKyAgICAgICAgbG9uZ0ZpZWxkID0gMQorICAgIH0KKworICAgIGRlZiBnZXRWYWx1ZSgpIHsKKyAgICAgICAgZGVmIHggPSBsb25nRmllbGQKKyAgICAgICAgcmV0dXJuIHgKKyAgICB9CisKKyAgICB2b2lkIHRlc3RQcmltaXRpdmVGaWVsZCgpIHsKKyAgICAgICAgc2V0VmFsdWUoKQorCisgICAgICAgIGRlZiB2YWx1ZSA9IGdldFZhbHVlKCkKKyAgICAgICAgYXNzZXJ0IHZhbHVlID09IDEKKworICAgICAgICBhc3NlcnQgbG9uZ0ZpZWxkID09IDEKKyAgICB9CisKKyAgICB2b2lkIHRlc3RJbnRQYXJhbUJ1ZygpIHsKKyAgICAgICAgYXNzZXJ0IGJ1Z01ldGhvZCgxMjMpID09IDI0NgorICAgICAgICBhc3NlcnQgYnVnTWV0aG9kMigxMjMpID09IDI0NgorCisgICAgICAgIC8vIEB0b2RvIEdST09WWS0xMzMKKyAgICAgICAgZGVmIGNsb3N1cmUgPSB7aW50IHgtPiB4ICogMiB9CisgICAgICAgIGFzc2VydCBjbG9zdXJlLmNhbGwoMTIzKSA9PSAyNDYKKworICAgIH0KKworICAgIGludCBidWdNZXRob2QoaW50IHgpIHsKKyAgICAgICAgeCAqIDIKKyAgICB9CisKKyAgICBkZWYgYnVnTWV0aG9kMihpbnQgeCkgeworICAgICAgICB4ICogMgorICAgIH0KKyAgICB2b2lkIHRlc3RTdGF0aWNQcmltaXRpdmVGaWVsZCgpIHsKKyAgICAgICAgc2hvcnRGaWVsZCA9IChTaG9ydCkgMTIzCisKKyAgICAgICAgYXNzZXJ0IHNob3J0RmllbGQgPT0gMTIzCisgICAgfQorCisgICAgdm9pZCB0ZXN0SW50TG9jYWxWYXJpYWJsZSgpIHsKKyAgICAgICAgaW50IHggPSAxMjMKKyAgICAgICAgZGVmIHkgPSB4ICsgMQorICAgICAgICBhc3NlcnQgeSA9PSAxMjQKKyAgICB9CisKKyAgICB2b2lkIHRlc3RMb25nTG9jYWxWYXJpYWJsZSgpIHsKKyAgICAgICAgbG9uZyB4ID0gMTIzCisgICAgICAgIGRlZiB5ID0geCArIDEKKyAgICAgICAgYXNzZXJ0IHkgPT0gMTI0CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9QcmltaXRpdmVUeXBlc1Rlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9QcmltaXRpdmVUeXBlc1Rlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkMTQwMjcKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1ByaW1pdGl2ZVR5cGVzVGVzdC5ncm9vdnkKQEAgLTAsMCArMSw2NyBAQAorcGFja2FnZSBncm9vdnkKKworY2xhc3MgUHJpbWl0aXZlVHlwZXNUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisJaW50IGdldEludCgpIHsKKwkJcmV0dXJuIDE7CisJfQorCQorCXNob3J0IGdldFNob3J0KCkgeworCQlyZXR1cm4gMTsKKwl9CisJCisJYm9vbGVhbiBnZXRCb29sZWFuKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJCisJZG91YmxlIGdldERvdWJsZSgpIHsKKwkJcmV0dXJuIDEuMDsKKwl9CisJCisJZmxvYXQgZ2V0RmxvYXQoKSB7CisJCXJldHVybiAxLjA7CisJfQorCQorCWJ5dGUgZ2V0Qnl0ZSgpIHsKKwkJcmV0dXJuIDE7CisJfQorCQorCWxvbmcgZ2V0TG9uZygpIHsKKwkJcmV0dXJuIDE7CisJfQorCisJY2hhciBnZXRDaGFyKCkgeworCQlyZXR1cm4gJ2EnOworCX0KKwkKKwlpbnQgZ2V0TmV4dEludChpbnQgaSkgeworCQlyZXR1cm4gaSArIDEKKwl9CisJCisJc2hvcnQgZ2V0TmV4dFNob3J0KHNob3J0IGkpIHsKKwkJcmV0dXJuIGkgKyAxCisJfQorCQorCXZvaWQgdGVzdFByaW1pdGl2ZVR5cGVzKCkgeworCQlhc3NlcnQgMSA9PSBnZXRJbnQoKQorCQlhc3NlcnQgMSA9PSBnZXRTaG9ydCgpCisJCWFzc2VydCAxID09IGdldEJ5dGUoKQorCQlhc3NlcnQgMSA9PSBnZXRMb25nKCkKKwkJYXNzZXJ0IGdldEJvb2xlYW4oKQorCQlhc3NlcnQgZ2V0RG91YmxlKCkgPiAwLjk5CisJCWFzc2VydCBnZXRGbG9hdCgpID4gMC45OQorCQlhc3NlcnQgJ2EnID09IGdldENoYXIoKQorCX0KKworCXZvaWQgdGVzdFByaW1pdGl2ZVBhcmFtZXRlcnMoKSB7CQkKKwkJYXNzZXJ0IGdldE5leHRJbnQoMSkgPT0gMgorCQlhc3NlcnQgMyA9PSBnZXROZXh0SW50KDIpCisJCQorCQlhc3NlcnQgZ2V0TmV4dFNob3J0KChTaG9ydCkgMSkgPT0gMgorCQlhc3NlcnQgMyA9PSBnZXROZXh0U2hvcnQoKFNob3J0KSAyKQorCX0KKwkJCisJc3RhdGljIHZvaWQgbWFpbihhcmdzKSB7CisJCW5ldyBQcmltaXRpdmVUeXBlc1Rlc3QoKS50ZXN0UHJpbWl0aXZlVHlwZXMoKQorCX0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvUHJpbnRUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvUHJpbnRUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzBjNWIyCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9QcmludFRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsNzMgQEAKK3BhY2thZ2UgZ3Jvb3Z5CisKK2ltcG9ydCBqYXZhLnRleHQuTnVtYmVyRm9ybWF0CisKK2NsYXNzIFByaW50VGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIHZvaWQgdGVzdFRvU3RyaW5nKCkgeworICAgICAgICBhc3NlcnRUb1N0cmluZygiaGVsbG8iLCAnaGVsbG8nKQorCisgICAgICAgIGFzc2VydFRvU3RyaW5nKFtdLCAiW10iKQorICAgICAgICBhc3NlcnRUb1N0cmluZyhbMSwgMiwgImhlbGxvIl0sICdbMSwgMiwgaGVsbG9dJykKKworICAgICAgICAvLyBUT0RPOiBjaGFuZ2UgdG9TdHJpbmcgb24gTWFwIHRvIHByb2R1Y2Ugc2FtZSBhcyBpbnNwZWN0IG1ldGhvZAorICAgICAgICBhc3NlcnRUb1N0cmluZyhbMToyMCwgMjo0MCwgMzonY2hlZXNlJ10sICd7MT0yMCwgMj00MCwgMz1jaGVlc2V9JykKKyAgICAgICAgYXNzZXJ0VG9TdHJpbmcoWzpdLCAie30iKQorCisgICAgICAgIC8vIFRPRE86IGNoYW5nZSB0b1N0cmluZyBvbiBNYXAgdG8gcHJvZHVjZSBzYW1lIGFzIGluc3BlY3QgbWV0aG9kCisgICAgICAgIGFzc2VydFRvU3RyaW5nKFtbJ2JvYic6J2Ryb29scycsICdqYW1lcyc6J2dlcm9uaW1vJ11dLCAnW3tib2I9ZHJvb2xzLCBqYW1lcz1nZXJvbmltb31dJykKKyAgICAgICAgLy8gVE9ETzogY2hhbmdlIHRvU3RyaW5nIG9uIE1hcCB0byBwcm9kdWNlIHNhbWUgYXMgaW5zcGVjdCBtZXRob2QKKyAgICAgICAgYXNzZXJ0VG9TdHJpbmcoWzUsIFsiYm9iIiwgImphbWVzIl0sIFsiYm9iIjoiZHJvb2xzIiwgImphbWVzIjoiZ2Vyb25pbW8iXSwgImNoZWVzZSJdLCAnWzUsIFtib2IsIGphbWVzXSwge2JvYj1kcm9vbHMsIGphbWVzPWdlcm9uaW1vfSwgY2hlZXNlXScpCisgICAgfQorCisgICAgdm9pZCB0ZXN0SW5zcGVjdCgpIHsKKyAgICAgICAgYXNzZXJ0SW5zcGVjdCgiaGVsbG8iLCAnImhlbGxvIicpCisgICAgICAgIAorICAgICAgICBhc3NlcnRJbnNwZWN0KFtdLCAiW10iKQorICAgICAgICBhc3NlcnRJbnNwZWN0KFsxLCAyLCAiaGVsbG8iXSwgJ1sxLCAyLCAiaGVsbG8iXScpCisgICAgICAgIAorICAgICAgICBhc3NlcnRJbnNwZWN0KFsxOjIwLCAyOjQwLCAzOidjaGVlc2UnXSwgJ1sxOjIwLCAyOjQwLCAzOiJjaGVlc2UiXScpCisgICAgICAgIGFzc2VydEluc3BlY3QoWzpdLCAiWzpdIikKKworICAgICAgIGFzc2VydEluc3BlY3QoW1snYm9iJzonZHJvb2xzJywgJ2phbWVzJzonZ2Vyb25pbW8nXV0sICdbWyJib2IiOiJkcm9vbHMiLCAiamFtZXMiOiJnZXJvbmltbyJdXScpCisgICAgICAgYXNzZXJ0SW5zcGVjdChbNSwgWyJib2IiLCAiamFtZXMiXSwgWyJib2IiOiJkcm9vbHMiLCAiamFtZXMiOiJnZXJvbmltbyJdLCAiY2hlZXNlIl0sICdbNSwgWyJib2IiLCAiamFtZXMiXSwgWyJib2IiOiJkcm9vbHMiLCAiamFtZXMiOiJnZXJvbmltbyJdLCAiY2hlZXNlIl0nKQorICAgIH0KKworICAgIHZvaWQgdGVzdENQbHVzUGx1c1N0eWxlUHJpbnRpbmcoKSB7CisgICAgICAgIGRlZiBlbmRsID0gIlxuIgorICAgICAgICBTeXN0ZW0ub3V0IDw8ICJIZWxsbyB3b3JsZCEiIDw8IGVuZGwKKyAgICB9CisKKyAgICB2b2lkIHRlc3RTcHJpbnRmKCkgeworICAgICAgICBpZiAoU3lzdGVtLnByb3BlcnRpZXMuJ2phdmEudmVyc2lvbidbMl0gPj0gJzUnKSB7CisgICAgICAgICAgICAvLyB3b3VsZCBiZSBuaWNlIHRvIHVzZSBKREsgMS42IERlY2ltYWxGb3JtYXRTeW1ib2xzCisgICAgICAgICAgICBkZWYgZGVjaW1hbFN5bWJvbCA9IE51bWJlckZvcm1hdC5pbnN0YW5jZS5mb3JtYXQoMS41KSAtICcxJyAtICc1JworICAgICAgICAgICAgYXNzZXJ0IHNwcmludGYoJyU1LjJmJywgMTIgKiAzLjUpID09ICI0MiR7ZGVjaW1hbFN5bWJvbH0wMCIKKyAgICAgICAgICAgIGFzc2VydCBzcHJpbnRmKCclZCArICVkID0gJWQnICwgWzEsIDIsIDErMl0gYXMgSW50ZWdlcltdKSA9PSAnMSArIDIgPSAzJworICAgICAgICAgICAgYXNzZXJ0IHNwcmludGYoJyVkICsgJWQgPSAlZCcgLCBbMiwgMywgMiszXSBhcyBpbnRbXSkgPT0gJzIgKyAzID0gNScKKyAgICAgICAgICAgIGFzc2VydCBzcHJpbnRmKCclZCArICVkID0gJWQnICwgWzMsIDQsIDMrNF0gYXMgbG9uZ1tdKSA9PSAnMyArIDQgPSA3JworICAgICAgICAgICAgYXNzZXJ0IHNwcmludGYoJyVkICsgJWQgPSAlZCcgLCBbNCwgNSwgNCs1XSBhcyBieXRlW10pID09ICc0ICsgNSA9IDknCisgICAgICAgICAgICBhc3NlcnQgc3ByaW50ZignJWQgKyAlZCA9ICVkJyAsIFs1LCA2LCA1KzZdIGFzIHNob3J0W10pID09ICc1ICsgNiA9IDExJworICAgICAgICAgICAgZGVmIGZsb2F0RXhwciA9IHNwcmludGYoJyU1LjJmICsgJTUuMmYgPSAlNS4yZicgLCBbMywgNCwgMys0XSBhcyBmbG9hdFtdKQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzICIgMyR7ZGVjaW1hbFN5bWJvbH0wMCArICA0JHtkZWNpbWFsU3ltYm9sfTAwID0gIDcke2RlY2ltYWxTeW1ib2x9MDAiLCBmbG9hdEV4cHIKKyAgICAgICAgICAgIGRlZiBkb3VibGVFeHByID0gc3ByaW50ZignJTUuMmcgKyAlNS4yZyA9ICU1LjJnJyAsIFszLCA0LCAzKzRdIGFzIGRvdWJsZVtdKQorICAgICAgICAgICAgLy8gVE9ETzogd29yayBvdXQgd2h5IGRlY2ltYWxTeW1ib2wgaXMgbm90IHVzZWQgaGVyZSAoYXQgbGVhc3QgZm9yIEZSIGFuZCBSVSkKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyAiICAzLjAgKyAgIDQuMCA9ICAgNy4wIiwgZG91YmxlRXhwcgorICAgICAgICAgICAgYXNzZXJ0IHNwcmludGYoJ2hpICVzJyAsICd0aGVyZScpID09ICdoaSB0aGVyZScKKyAgICAgICAgICAgIGFzc2VydCBzcHJpbnRmKCclYycgLCAweDQxKSA9PSAnQScKKyAgICAgICAgICAgIGFzc2VydCBzcHJpbnRmKCcleCcgLCAweDQxKSA9PSAnNDEnCisgICAgICAgICAgICBhc3NlcnQgc3ByaW50ZignJW8nICwgMHg0MSkgPT0gJzEwMScKKyAgICAgICAgICAgIGFzc2VydCBzcHJpbnRmKCclaCcgLCAweDQxKSA9PSAnNDEnCisgICAgICAgICAgICBhc3NlcnQgc3ByaW50ZignJWIgJWInICwgW3RydWUsIGZhbHNlXSBhcyBib29sZWFuW10pID09ICd0cnVlIGZhbHNlJworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdFNwcmludGZFeGNlcHRpb25Qcm9wYWdhdGlvbigpIHsKKwkgICBpZiAoU3lzdGVtLnByb3BlcnRpZXMuJ2phdmEudmVyc2lvbidbMl0gPj0gJzUnKSB7CisJICAgICAgIAorCSAgICAgICBzaG91bGRGYWlsKGphdmEudXRpbC5JbGxlZ2FsRm9ybWF0Q29udmVyc2lvbkV4Y2VwdGlvbil7CisJCSAgICAgICBzcHJpbnRmKCclMi40ZicsIHszfSkKKwkgICAgICAgfQorCSAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1ByaXZhdGVWYXJpYWJsZUFjY2Vzc0Zyb21Bbm90aGVySW5zdGFuY2VUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvUHJpdmF0ZVZhcmlhYmxlQWNjZXNzRnJvbUFub3RoZXJJbnN0YW5jZVRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MDg3NmQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1ByaXZhdGVWYXJpYWJsZUFjY2Vzc0Zyb21Bbm90aGVySW5zdGFuY2VUZXN0Lmdyb292eQpAQCAtMCwwICsxLDM2IEBACitwYWNrYWdlIGdyb292eQorCisvKioKKyAqIHRlc3QgdG8gZW5zdXJlIHRoYXQgcHJpdmF0ZSBpbnN0YW5jZSB2YXJpYWJsZXMgYXJlIHZpc2libGUgdG8gCisgKiBvdGhlciBpbnN0YW5jZSB2YXJpYWJsZXMgb2YgdGhlIHNhbWUgY2xhc3MKKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amVyZW15LnJheW5lckBiaWdmb290LmNvbSI+SmVyZW15IFJheW5lcjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworCitjbGFzcyBQcml2YXRlVmFyaWFibGVBY2Nlc3NGcm9tQW5vdGhlckluc3RhbmNlVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIGltcGxlbWVudHMgQ2xvbmVhYmxlIHsgCisgICAgZGVmIGZvbworICAgIHByaXZhdGUgZGVmIGJhcgorICAgICAgICAgICAgICAKKyAgICBwdWJsaWMgUHJpdmF0ZVZhcmlhYmxlQWNjZXNzRnJvbUFub3RoZXJJbnN0YW5jZVRlc3QoKSB7CisgICAgICAgIHN1cGVyKCkKKyAgICAgICAgZm9vID0gImZvbyIKKyAgICAgICAgYmFyID0gImJhciIKKyAgICB9CisgICAgICAgICAgICAgIAorICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CisgICAgICAgIGRlZiByZXN1bHQgPSBuZXcgUHJpdmF0ZVZhcmlhYmxlQWNjZXNzRnJvbUFub3RoZXJJbnN0YW5jZVRlc3QoKQorICAgICAgICByZXN1bHQuZm9vID0gZm9vCisgICAgICAgIHJlc3VsdC5iYXIgPSBiYXIKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RDbG9uZSgpIHsKKyAgICAgICAgZGVmIGZyZWQgPSBuZXcgUHJpdmF0ZVZhcmlhYmxlQWNjZXNzRnJvbUFub3RoZXJJbnN0YW5jZVRlc3QoKQorICAgICAgICAvL0B0b2RvIGZhaWxzIGR1ZSB0byBwcml2YXRlIGFjY2VzcyB0byAnYmFyJworICAgICAgICAvL2Jhcm5leSA9IGZyZWQuY2xvbmUoKQorCisgICAgICAgIC8vIFRPRE8gaWRlbnRpdHkgY29tcGFyaXNvbgorICAgICAgICAvL2Fzc2VydCAhKGJhcm5leSA9PT0gZnJlZCkKKyAgICB9Cit9IApkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9Qcm9jZXNzVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1Byb2Nlc3NUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmMxZTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9Qcm9jZXNzVGVzdC5ncm9vdnkKQEAgLTAsMCArMSw5NSBAQAorcGFja2FnZSBncm9vdnkKKworLyoqCisgKiBjaGVjayB0aGF0IGdyb292eSBQcm9jZXNzIG1ldGhvZHMgZG8gdGhlaXIgam9iLgorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmplcmVteS5yYXluZXJAYmlnZm9vdC5jb20iPkplcmVteSBSYXluZXI8L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KKworY2xhc3MgUHJvY2Vzc1Rlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisgICAgZGVmIG15UHJvY2VzcworICAgIAorICAgIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIG15UHJvY2VzcyA9IG5ldyBNb2NrUHJvY2VzcygpCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdFByb2Nlc3NBcHBlbmRCeXRlcygpIHsKKyAgICAgICAgZGVmIG15Qnl0ZXMgPSAibW9va3kiLmdldEJ5dGVzKCkKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICBteVByb2Nlc3MgPDwgbXlCeXRlcworICAgICAgICAgICAgICAgICAgCisgICAgICAgIGRlZiByZXN1bHQgPSBteVByb2Nlc3Mub3V0cHV0U3RyZWFtLnRvQnl0ZUFycmF5KCkKKyAgICAgICAgYXNzZXJ0IHJlc3VsdCAhPSBudWxsCisgICAgICAgIGFzc2VydCBBcnJheXMuZXF1YWxzKG15Qnl0ZXMscmVzdWx0KQorICAgIH0KKyAgICB2b2lkIHRlc3RQcm9jZXNzQXBwZW5kVHdvQnl0ZUFycmF5cygpIHsKKyAgICAgICAgZGVmIG15Qnl0ZXMxID0gImZvbyIuZ2V0Qnl0ZXMoKQorICAgICAgICBkZWYgbXlCeXRlczIgPSAiYmFyIi5nZXRCeXRlcygpCisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgbXlQcm9jZXNzIDw8IG15Qnl0ZXMxIDw8IG15Qnl0ZXMyCisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgZGVmIHJlc3VsdCA9IG15UHJvY2Vzcy5vdXRwdXRTdHJlYW0udG9CeXRlQXJyYXkoKQorICAgICAgICBhc3NlcnQgcmVzdWx0ICE9IG51bGwKKyAgICAgICAgYXNzZXJ0IHJlc3VsdC5zaXplKCkgPT0gbXlCeXRlczEuc2l6ZSgpICsgbXlCeXRlczIuc2l6ZSgpICAgICAgICAgIAorICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RQcm9jZXNzQXBwZW5kKCkgeworICAgICAgICBteVByb2Nlc3MgPDwgIm1vb2t5IgorICAgICAgICBhc3NlcnQgIm1vb2t5IiA9PSBteVByb2Nlc3Mub3V0cHV0U3RyZWFtLnRvU3RyaW5nKCkKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0UHJvY2Vzc0lucHV0U3RyZWFtKCkgeworICAgICAgICBhc3NlcnQgbXlQcm9jZXNzLmluIGluc3RhbmNlb2YgSW5wdXRTdHJlYW0KKyAgICAgICAgYXNzZXJ0IG15UHJvY2Vzcy5pbiAhPSBudWxsCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdFByb2Nlc3NUZXh0KCkgeworICAgICAgICBhc3NlcnQgIiIgPT0gbXlQcm9jZXNzLnRleHQKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0UHJvY2Vzc0Vycm9yU3RyZWFtKCkgeworICAgICAgICBhc3NlcnQgbXlQcm9jZXNzLmVyciBpbnN0YW5jZW9mIElucHV0U3RyZWFtCisgICAgICAgIGFzc2VydCBteVByb2Nlc3MuZXJyICE9IG51bGwKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0UHJvY2Vzc091dHB1dFN0cmVhbSgpIHsKKyAgICAgICAgYXNzZXJ0IG15UHJvY2Vzcy5vdXQgaW5zdGFuY2VvZiBPdXRwdXRTdHJlYW0KKyAgICAgICAgYXNzZXJ0IG15UHJvY2Vzcy5vdXQgIT0gbnVsbAorICAgIH0KKyAgICAKKyAgICAvLyBAdG9kbyAtIHBzLndhaXRGb3JPcktpbGwoc2VjcykgY3JlYXRlcyBpdCdzIG93biB0aHJlYWQsIGxlYXZlIHRoaXMgb3V0IG9mIHRlc3Qgc3VpdGUgZm9yIG5vdy4uLgorICAgIAorICAgIHZvaWQgdGVhckRvd24oKSB7CisgICAgICAgIG15UHJvY2Vzcy5kZXN0cm95KCkKKyAgICB9Cit9CisKKy8qKgorICogc2ltcGxlIFByb2Nlc3MsIHVzZWQgcHVyZWx5IGZvciB0ZXN0IGNhc2VzCisgKi8KK2NsYXNzIE1vY2tQcm9jZXNzIGV4dGVuZHMgUHJvY2VzcyB7CisgICAgcHJpdmF0ZSBkZWYgZQorICAgIHByaXZhdGUgZGVmIGkKKyAgICBwcml2YXRlIGRlZiBvCisgICAgCisgICAgcHVibGljIE1vY2tQcm9jZXNzKCkgeworICAgICAgICBlID0gbmV3IEFub3RoZXJNb2NrSW5wdXRTdHJlYW0oKQorICAgICAgICBpID0gbmV3IEFub3RoZXJNb2NrSW5wdXRTdHJlYW0oKQorICAgICAgICBvID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpCisgICAgfQorICAgIHZvaWQgZGVzdHJveSgpIHt9CisgICAgaW50IGV4aXRWYWx1ZSgpIHsgcmV0dXJuIDAgfQorICAgIElucHV0U3RyZWFtIGdldEVycm9yU3RyZWFtKCkgeyByZXR1cm4gZSB9CisgICAgcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgeyByZXR1cm4gaSB9CisgICAgcHVibGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKSB7IHJldHVybiBvIH0KKyAgICBpbnQgd2FpdEZvcigpIHsgcmV0dXJuIDAgfQorfQorCisvKioKKyAqIG9ubHkgbmVlZGVkIGZvciB3b3JrYXJvdW5kIGluIGdyb292eSwgCisgKiAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG15Qnl0ZUFycmF5KSBkb2Vzbid0IHdvcmsgYXQgbW8uLi4gKDI4LVNlcC0yMDA0KQorICovCitjbGFzcyBBbm90aGVyTW9ja0lucHV0U3RyZWFtIGV4dGVuZHMgSW5wdXRTdHJlYW0geworICAgIGludCByZWFkKCkgeyByZXR1cm4gLTEgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9Qcm9wZXJ0eTJUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvUHJvcGVydHkyVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM1NjEyNwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvUHJvcGVydHkyVGVzdC5ncm9vdnkKQEAgLTAsMCArMSw4OSBAQAorcGFja2FnZSBncm9vdnkKKworLyoqIAorICogd2FzOiBUZXN0cyB0aGUgdXNlIG9mIG5ldyBkZWYgbWV0aG9kcyBpbiBHcm9vdnk6IGVhY2hQcm9wZXJ0eSgpLCBlYWNoUHJvcGVydHlOYW1lKCksIGFuZAorICogYWxsUHJvcGVydGllcygpLgorICogTmV3IE1ldGhvZDogZ2V0TWV0YVByb3BlcnR5VmFsdWVzCisgKiBNZXRob2QgbmFtZSBoYXMgY2hhbmdlZDogZ2V0UHJvcGVydGllcworICogUmVtb3ZlOiBlYWNoUHJvcGVydHkoKSwgZWFjaFByb3BlcnR5TmFtZSgpIHVzZSBwcm9wZXJ0aWVzLmVhY2gge2tleSx2YWx1ZSAtPiB9IGluc3RlYWQKKyAqCisgKiBAYXV0aG9yIGpvaG4gc3R1bXAKKyAqIEBhdXRob3IgZGllcmsga29lbmlnCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK2NsYXNzIFByb3BlcnR5MlRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICB2b2lkIHRlc3RFYWNoUHJvcGVydHlOYW1lKCkgeworICAgICAgICBkZWYgZm9vID0gbmV3IEZvbygpCisJCQorCQkvLyB0aGVzZSBhcmUgdGhlIHByb3BlcnRpZXMgdGhhdCBzaG91bGQgYmUgdGhlcmUKKwkJZGVmIHByb3BzID0gWyduYW1lJywgJ2NvdW50JywgJ2xvY2F0aW9uJywgJ2JsYWgnXQorCQlmb28ucHJvcGVydGllcy5lYWNoIHsgbmFtZSwgdmFsdWUgLT4KKwkJCS8vcHJpbnRsbiAibG9va2luZyBmb3IgJHtwcm9wfSBpbiAke3Byb3BzfSIKKworCQkJLy8gdG9kbzogR1JPT1ZZLTk5NgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIHNlZSBwcm90ZWN0ZWQgcHJvcGVydGllcywgYnV0IG5vdCAgcHJpdmF0ZSBvbmVzLgorCQkJYXNzZXJ0IG5hbWUgIT0gImludmlzaWJsZSIKKworCQkJLy8gcmVtb3ZlIHRoaXMgb25lIGZyb20gdGhlIGxpc3QKKwkJCXByb3BzID0gcHJvcHMgLSBbbmFtZV0KKwkJfQorCisJCS8vIG1ha2Ugc3VyZSB0aGVyZSBhcmUgbm9uZSBsZWZ0IG92ZXIKKwkJLy9wcmludGxuICJjb3VudCBsZWZ0IGluIHByb3BzIGxpc3QgaXMgJHtwcm9wcy5jb3VudCgpfSIKKwkJYXNzZXJ0IHByb3BzLmNvdW50KCkgPT0gMAorICAgIH0KKworICAgIHZvaWQgdGVzdE1ldGFQcm9wZXJ0eVZhbHVlc0Zyb21PYmplY3QoKSB7CisgICAgICAgIGRlZiBmb28gPSBuZXcgRm9vKCkKKwkJZGVmIG1ldGFQcm9wcyA9IGZvby5tZXRhUHJvcGVydHlWYWx1ZXMKKwkJYXNzZXJ0IG1ldGFQcm9wc1swXSBpbnN0YW5jZW9mIFByb3BlcnR5VmFsdWUKKwkJYXNzZXJ0Tm90TnVsbCBtZXRhUHJvcHNbMF0ubmFtZQorCQlhc3NlcnROb3ROdWxsIG1ldGFQcm9wc1swXS52YWx1ZQorCQlhc3NlcnROb3ROdWxsIG1ldGFQcm9wc1swXS50eXBlCisgICAgfQorCisJdm9pZCB0ZXN0RWFjaFByb3BlcnR5KCkgeworICAgICAgICBkZWYgZm9vID0gbmV3IEZvbygpCisKKwkJLy8gdGhlc2UgYXJlIHRoZSBwcm9wZXJ0aWVzIGFuZCB0aGVpciB2YWx1ZXMgdGhhdCBzaG91bGQgYmUgdGhlcmUKKwkJZGVmIHByb3BzID0gWyduYW1lJzonSmFtZXMnLCAnY291bnQnOjEsICdsb2NhdGlvbic6J0xvbmRvbicsICdibGFoJzo5XQorCQlmb28ucHJvcGVydGllcy5lYWNoIHsgbmFtZSwgdmFsdWUgLT4KKwkJCS8vcHJpbnRsbiAibG9va2luZyBmb3IgJHtwcm9wLm5hbWV9IGluICR7cHJvcHN9IgorCQkJCisJCQkvLyB0b2RvOiBHUk9PVlktOTk2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBzaG91bGQgc2VlIHByb3RlY3RlZCBwcm9wZXJ0aWVzLCBidXQgbm90ICBwcml2YXRlIG9uZXMuCisJCQlhc3NlcnQgbmFtZSAhPSAiaW52aXNpYmxlIgorCQkJCisJCQlkZWYgcHZhbHVlID0gcHJvcHNbbmFtZV0KKwkJCWlmKHB2YWx1ZSAhPSBudWxsKQorCQkJCWFzc2VydCBwdmFsdWUgPT0gdmFsdWUKKwkJCQorCQkJLy8gcmVtb3ZlIHRoaXMgb25lIGZyb20gdGhlIG1hcAorCQkJcHJvcHMucmVtb3ZlKG5hbWUpCisJCX0KKwkJCisJCS8vIG1ha2Ugc3VyZSB0aGVyZSBhcmUgbm9uZSBsZWZ0IG92ZXIKKwkJLy9wcmludGxuICJjb3VudCBsZWZ0IGluIHByb3BzIG1hcCBpcyAke3Byb3BzLnNpemUoKX0iCisJCWFzc2VydCBwcm9wcy5zaXplKCkgPT0gMAorCX0KKwkKKwkvLyBtYWtlIHN1cmUgYWxsUHJvcGVydGllcygpIHdvcmtzIHdpdGggZXhwYW5kbyBvYmplY3RzIHRvbworICAgIHZvaWQgdGVzdEFsbFByb3BlcnRpZXNFeHBhbmRvKCkgeworICAgICAgICBkZWYgZm9vID0gbmV3IEV4cGFuZG8oKQorCQkKKwkJZm9vLm5hbWUgPSAnSm9obicKKwkJZm9vLmxvY2F0aW9uID0gJ0NvbG9yYWRvJworCQlmb28uY291bnQgPSAyMworCQlmb28uYmxhaCA9IHRydWUKKwkJCisJCS8vIHRoZXNlIGFyZSB0aGUgcHJvcGVydGllcyB0aGF0IHNob3VsZCBiZSB0aGVyZQorCQlkZWYgcHJvcHMgPSBbJ25hbWUnLCAnY291bnQnLCAnbG9jYXRpb24nLCAnYmxhaCddCisJCWZvby5wcm9wZXJ0aWVzLmVhY2ggeyBuYW1lLCB2YWx1ZSAtPiBwcm9wcyAtPSBbbmFtZV0gfQorCQkKKwkJLy8gdGhlcmUgc2hvdWxkIGJlIG5vbmUgbGVmdAorCQkvL3ByaW50bG4gcHJvcHMKKwkJYXNzZXJ0IHByb3BzLnNpemUoKSA9PSAwCisgICAgfQorfQorCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1Byb3BlcnR5VGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1Byb3BlcnR5VGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYyMzRkMQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvUHJvcGVydHlUZXN0Lmdyb292eQpAQCAtMCwwICsxLDE5OCBAQAorcGFja2FnZSBncm9vdnkKKworLyoqIAorICogVGVzdHMgdGhlIHVzZSBvZiBwcm9wZXJ0aWVzIGluIEdyb292eQorICogCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitjbGFzcyBQcm9wZXJ0eVRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICB2b2lkIHRlc3ROb3JtYWxQcm9wZXJ0eUdldHRlcnNBbmRTZXR0ZXJzKCkgeworICAgICAgICBkZWYgZm9vID0gbmV3IEZvbygpCisgICAgICAgIGRlZiB2YWx1ZSA9IGZvby5nZXRNZXRhQ2xhc3MoKQorCisgICAgICAgIGFzc2VydCBmb28ubmFtZSA9PSAiSmFtZXMiCisgICAgICAgIGFzc2VydCBmb28uZ2V0TmFtZSgpID09ICJKYW1lcyIKKyAgICAgICAgYXNzZXJ0IGZvby5sb2NhdGlvbiA9PSAiTG9uZG9uIgorICAgICAgICBhc3NlcnQgZm9vLmdldExvY2F0aW9uKCkgPT0gIkxvbmRvbiIKKyAgICAgICAgYXNzZXJ0IGZvby5ibGFoID09IDkKKyAgICAgICAgYXNzZXJ0IGZvby5nZXRCbGFoKCkgPT0gOQorCisgICAgICAgIGZvby5uYW1lID0gIkJvYiIKKyAgICAgICAgZm9vLmxvY2F0aW9uID0gIkF0bGFudGEiCisKKyAgICAgICAgYXNzZXJ0IGZvby5uYW1lID09ICJCb2IiCisgICAgICAgIGFzc2VydCBmb28uZ2V0TmFtZSgpID09ICJCb2IiCisgICAgICAgIGFzc2VydCBmb28ubG9jYXRpb24gPT0gIkF0bGFudGEiCisgICAgICAgIGFzc2VydCBmb28uZ2V0TG9jYXRpb24oKSA9PSAiQXRsYW50YSIKKyAgICB9CisKKyAgICAvLyBHUk9PVlktMTgwOQorICAgIHZvaWQgdGVzdENsYXNzV2l0aFByaXZhdGVGaWVsZEFuZEdldHRlcigpIHsKKyAgICAgICAgYXNzZXJ0IGphdmEuYXd0LkZvbnQuZ2V0TmFtZSgpID09ICdqYXZhLmF3dC5Gb250JworICAgICAgICBhc3NlcnQgamF2YS5hd3QuRm9udC5uYW1lID09ICdqYXZhLmF3dC5Gb250JworICAgIH0KKworICAgIHZvaWQgdGVzdE92ZXJsb2FkZWRHZXR0ZXIoKSB7CisgICAgICAgIGRlZiBmb28gPSBuZXcgRm9vKCkKKyAgICAgICAgYXNzZXJ0IGZvby5nZXRDb3VudCgpID09IDEKKyAgICAgICAgYXNzZXJ0IGZvby5jb3VudCA9PSAxCisgICAgICAgIGZvby5jb3VudCA9IDcKKyAgICAgICAgYXNzZXJ0IGZvby5jb3VudCA9PSA3CisgICAgICAgIGFzc2VydCBmb28uZ2V0Q291bnQoKSA9PSA3CisgICAgfQorCisgICAgdm9pZCB0ZXN0Tm9TZXR0ZXJBdmFpbGFibGVPblByaXZhdGVQcm9wZXJ0eSgpIHsKKyAgICAgICAgZGVmIGZvbyA9IG5ldyBGb28oKQorCisgICAgICAgIC8vIG1ldGhvZHMgc2hvdWxkIGZhaWwgb24gbm9uLWV4aXN0ZW50IG1ldGhvZCBjYWxscworICAgICAgICAvL3Nob3VsZEZhaWwgeyBmb28uYmxhaCA9IDQgfQorICAgICAgICBzaG91bGRGYWlsIHtmb28uc2V0QmxhaCg0KX0KKyAgICB9CisKKyAgICB2b2lkIHRlc3RDYW5ub3RTZWVQcml2YXRlUHJvcGVydGllcygpIHsKKyAgICAgICAgZGVmIGZvbyA9IG5ldyBGb28oKQorCisgICAgICAgIC8vIGRlZiBhY2Nlc3MgZmFpbHMgb24gbm9uLWV4aXN0ZW50IGRlZgorICAgICAgICAvL3Nob3VsZEZhaWwgeyBkZWYgeCA9IGZvby5pbnZpc2libGUgfSAvL3RvZG86IGNvcnJlY3QgaGFuZGxpbmcgb2YgYWNjZXNzIHJ1bGVzCisKKyAgICAgICAgLy8gbWV0aG9kcyBzaG91bGQgZmFpbCBvbiBub24tZXhpc3RlbnQgbWV0aG9kIGNhbGxzCisgICAgICAgIHNob3VsZEZhaWwge2Zvby5nZXRRKCl9CisgICAgfQorCisgICAgdm9pZCB0ZXN0Q29uc3RydWN0b3JXaXRoTmFtZWRQcm9wZXJ0aWVzKCkgeworICAgICAgICBkZWYgZm9vID0gbmV3IEZvbyhuYW1lOiAnR3JvbWl0JywgbG9jYXRpb246ICdNb29uJykKKworICAgICAgICBhc3NlcnQgZm9vLm5hbWUgPT0gJ0dyb21pdCcKKyAgICAgICAgYXNzZXJ0IGZvby5sb2NhdGlvbiA9PSAnTW9vbicKKyAgICB9CisKKyAgICB2b2lkIHRlc3RUb1N0cmluZygpIHsKKyAgICAgICAgZGVmIGZvbyA9IG5ldyBGb28obmFtZTogJ0dyb21pdCcsIGxvY2F0aW9uOiAnTW9vbicpCisgICAgICAgIGFzc2VydCBmb28udG9TdHJpbmcoKS5lbmRzV2l0aCgnbmFtZTogR3JvbWl0IGxvY2F0aW9uOiBNb29uJykKKyAgICB9CisKKyAgICB2b2lkIHRlc3RBcnJheUxlbmd0aFByb3BlcnR5KCkgeworICAgICAgICAvLyBjcmVhdGUgdHdvIGFycmF5cywgc2luY2UgYWxsIHVzZSB0aGUgc2FtZSBNZXRhQXJyYXlMZW5ndGhQcm9wZXJ0eSBvYmplY3QgLQorICAgICAgICAvLyBtYWtlIHN1cmUgaXQgY2FuIHdvcmsgZm9yIGFsbCB0eXBlcyBhbmQgc2l6ZXMKKyAgICAgICAgZGVmIGkgPSBuZXcgSW50ZWdlcls1XQorICAgICAgICBkZWYgcyA9IG5ldyBTdHJpbmdbMTBdCisKKyAgICAgICAgLy8gcHV0IHNvbWV0aGluZyBpbiBpdCB0byBtYWtlIHN1cmUgd2UncmUgcmV0dXJuaW5nIHRoZSAqYWxsb2NhdGVkKiBsZW5ndGgsIGFuZAorICAgICAgICAvLyBub3QgdGhlICp1c2VkKiBsZW5ndGgKKyAgICAgICAgc1swXSA9ICJoZWxsbyIKKworICAgICAgICBhc3NlcnQgaS5sZW5ndGggPT0gNQorICAgICAgICBhc3NlcnQgcy5sZW5ndGggPT0gMTAKKworICAgICAgICAvLyB0aGlzIGRlZiBkb2VzIG5vdCBtZWFuIHRoZXJlIGlzIGEgZ2V0TGVuZ3RoKCkgbWV0aG9kCisgICAgICAgIHNob3VsZEZhaWwge2kuZ2V0TGVuZ3RoKCl9CisKKyAgICAgICAgLy8gdmVyaWZ5IHdlIGNhbid0IHNldCB0aGlzIGRlZiwgaXQncyByZWFkLW9ubHkKKyAgICAgICAgc2hvdWxkRmFpbCB7aS5sZW5ndGggPSA2fQorICAgIH0KKworICAgIHZvaWQgdGVzdEdzdHJpbmdBc3NpZ25tZW50KCkgeworICAgICAgICBkZWYgZm9vID0gbmV3IEZvbygpCisgICAgICAgIGZvby5ib2R5ID0gIiR7Zm9vLm5hbWV9IgorICAgICAgICBhc3NlcnQgZm9vLmJvZHkgPT0gIkphbWVzIgorICAgIH0KKworICAgIHZvaWQgdGVzdEZpbmFsUHJvcGVydHkoKSB7CisgICAgICAgIGRlZiBzaGVsbCA9IG5ldyBHcm9vdnlTaGVsbCgpOworICAgICAgICBhc3NlcnRTY3JpcHQgIiIiCisgICAgICAgIGNsYXNzIEEgeworICAgICAgICAgICBmaW5hbCBmb28gPSAxCisgICAgICAgIH0KKyAgICAgICAgQS5jbGFzcy5kZWNsYXJlZE1ldGhvZHMuZWFjaCB7CisgICAgICAgICAgYXNzZXJ0IGl0Lm5hbWUhPSJzZXRGb28iCisgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0IG5ldyBBKCkuZm9vPT0xCisgICAgICAiIiIKKyAgICAgICAgc2hvdWxkRmFpbCB7CisgICAgICAgICAgICBzaGVsbC5leGVjdXRlICIiIgorICAgICAgICAgIGNsYXNzIEEgeworICAgICAgICAgICAgZmluYWwgZm9vID0gMQorICAgICAgICAgIH0KKyAgICAgICAgICBuZXcgQSgpLmZvbyA9IDIKKyAgICAgICAgIiIiCisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHRlc3RGaW5hbFByb3BlcnR5V2l0aEluaGVyaXRhbmNlKCkgeworICAgICAgICBkZWYgY2hpbGQgPSBuZXcgQ2hpbGQoKQorICAgICAgICBhc3NlcnQgY2hpbGQuZmluYWxQcm9wZXJ0eSA9PSAxCisgICAgICAgIGNoaWxkLmZpbmFsUHJvcGVydHkgPSAyMgorICAgICAgICBhc3NlcnQgY2hpbGQuZmluYWxQcm9wZXJ0eSA9PSAxCisgICAgfQorCisgICAgdm9pZCB0ZXN0QmFzZVByb3BlcnRpZXMoKSB7CisgICAgICAgIGFzc2VydCBuZXcgQ2hpbGQoKS5maWVsZCA9PSAnZm9vYmFyJworICAgIH0KKworICAgIC8vIEdST09WWS0xNzM2CisgICAgdm9pZCB0ZXN0R2V0U3VwZXJQcm9wZXJ0aWVzKCkgeworICAgICAgICBkZWYgYyA9IG5ldyBDaGlsZCgpCisgICAgICAgIGFzc2VydCBjLnRoaW5nID09ICdiYXIgdGhpbmcnCisgICAgICAgIGFzc2VydCBjLnN1cGVydGhpbmcoKSA9PSAnYmFyMWZvbyB0aGluZycKKyAgICAgICAgYXNzZXJ0IGMueCgpID09ICdiYXIyZm9vIHgnCisgICAgICAgIGFzc2VydCBjLnhwcm9wID09ICdiYXIzZm9vIHggcHJvcCcKKyAgICAgICAgYXNzZXJ0IGMueHByb3BWaWFNZXRob2QgPT0gJ2JhcjRmb28geCBwcm9wJworICAgIH0KKworICAgIHZvaWQgdGVzdFNldFN1cGVyUHJvcGVydGllcygpIHsKKyAgICAgICAgZGVmIGMgPSBuZXcgQ2hpbGQoKQorICAgICAgICBhc3NlcnQgYy5zdXBlckZpZWxkID09ICdiYXInCisgICAgICAgIGMuc2V0U3VwZXJGaWVsZCgnYmF6MScpCisgICAgICAgIGFzc2VydCBjLnN1cGVyRmllbGQgPT0gJ2JhejEnCisgICAgICAgIGMuc3VwZXJGaWVsZCA9ICdiYXoyJworICAgICAgICBhc3NlcnQgYy5zdXBlckZpZWxkID09ICdiYXoyJworCisgICAgICAgIGFzc2VydCBjLnN1cGVydGhpbmcoKSA9PSAnYmFyMWZvbyB0aGluZycKKyAgICAgICAgYy5zdXBlclRoaW5nID0gJ2JhciB0aGluZycKKyAgICAgICAgYXNzZXJ0IGMuc3VwZXJ0aGluZygpID09ICdiYXIxYmFyIHRoaW5nJworICAgIH0KK30KKworY2xhc3MgQmFzZSB7CisgICAgcHJvdGVjdGVkIFN0cmluZyBmaWVsZCA9ICdiYXInCisKKyAgICBwcm90ZWN0ZWQgdGhpbmcgPSAnZm9vIHRoaW5nJworICAgIGRlZiBnZXRYcHJvcCgpIHsnZm9vIHggcHJvcCd9CisgICAgZGVmIHgoKSB7J2ZvbyB4J30KKyAgICB2b2lkIHNldFRoaW5nKHZhbHVlKSB7dGhpbmcgPSB2YWx1ZX0KKyAgICAKKyAgICAvL3Rlc3RpbmcgZmluYWwgcHJvcGVydHkgZ2V0dGVyCisgICAgZmluYWwgZ2V0RmluYWxQcm9wZXJ0eSgpIHsxfQorfQorCitjbGFzcyBDaGlsZCBleHRlbmRzIEJhc2UgeworICAgIHByb3RlY3RlZCBTdHJpbmcgZmllbGQgPSAnZm9vJyArIHN1cGVyLmZpZWxkCisgICAgcHVibGljIGdldEZpZWxkKCkge2ZpZWxkfQorICAgIHZvaWQgc2V0U3VwZXJGaWVsZCh2YWx1ZSkge3N1cGVyLmZpZWxkID0gdmFsdWV9CisgICAgcHVibGljIGdldFN1cGVyRmllbGQoKSB7c3VwZXIuZmllbGR9CisKKyAgICBkZWYgdGhpbmcgPSAnYmFyIHRoaW5nJworICAgIGRlZiBzdXBlcnRoaW5nKCkgeworICAgICAgICAnYmFyMScgKyBzdXBlci50aGluZworICAgIH0KKyAgICBkZWYgeCgpIHsKKyAgICAgICAgJ2JhcjInICsgc3VwZXIueCgpCisgICAgfQorICAgIGRlZiBnZXRYcHJvcCgpIHsKKyAgICAgICAgJ2JhcjMnICsgc3VwZXIueHByb3AKKyAgICB9CisgICAgZGVmIGdldFhwcm9wVmlhTWV0aG9kKCkgeworICAgICAgICAnYmFyNCcgKyBzdXBlci5nZXRYcHJvcCgpCisgICAgfQorICAgIGRlZiBzZXRTdXBlclRoaW5nKHZhbHVlKSB7CisgICAgICAgIHN1cGVyLnRoaW5nID0gdmFsdWUKKyAgICB9CisgICAgCisgICAgLy8gdGVzdGluZyBmaW5hbCBwcm9wZXJ0eSBnZXR0ZXIKKyAgICAvLyB0aGUgZm9sbG93aW5nIHByb3BlcnR5IHNob3VsZCBub3QgYWRkIGEgbmV3IGdldHRlcgorICAgIC8vIG1ldGhvZCwgdGhpcyB3b3VsZCByZXN1bHQgaW4gYSB2ZXJpZnkgZXJyb3IKKyAgICBkZWYgZmluYWxQcm9wZXJ0eSA9IDMyCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1Byb3BlcnR5V2l0aG91dERvdFRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9Qcm9wZXJ0eVdpdGhvdXREb3RUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjZiMGQwCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9Qcm9wZXJ0eVdpdGhvdXREb3RUZXN0Lmdyb292eQpAQCAtMCwwICsxLDEzIEBACitwYWNrYWdlIGdyb292eQorCitjbGFzcyBQcm9wZXJ0eVdpdGhvdXREb3RUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworICAgIGRlZiBnZXRGb28oKSB7CisgICAgICAgIHJldHVybiAiY2hlZXNlIgorICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RQcm9wZXJ0eSgpIHsKKyAgICAgICAgZGVmIHZhbHVlID0gZm9vCisgICAgICAgIAorICAgICAgICBhc3NlcnQgdmFsdWUgPT0gImNoZWVzZSIKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9SYW5nZVRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9SYW5nZVRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhM2JjYzIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1JhbmdlVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwyNDMgQEAKK3BhY2thZ2UgZ3Jvb3Z5CisKK2NsYXNzIFJhbmdlVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKwkKKwl2b2lkIHRlc3RSYW5nZSgpIHsKKwkgICAgZGVmIHggPSAwCisKKwkgICAgZm9yICggaSBpbiAwLi45ICkgeworCSAgICAgICAgeCA9IHggKyBpCisJICAgIH0KKworCSAgICBhc3NlcnQgeCA9PSA0NQorCSAgICAKKwkgICAgeCA9IDAKKworCSAgICBmb3IgKCBpIGluIDAuLjwxMCApIHsKKwkgICAgICAgIHggPSB4ICsgaQorCSAgICB9CisKKwkgICAgYXNzZXJ0IHggPT0gNDUKKwkgICAgCisJICAgIHggPSAwCisKKwkgICAgZm9yICggaSBpbiAwLi4nXHUwMDA5JyApIHsKKwkgICAgICAgIHggPSB4ICsgaQorCSAgICB9CisKKwkgICAgYXNzZXJ0IHggPT0gNDUKKwl9CisJCisJdm9pZCB0ZXN0UmFuZ2VFYWNoKCkgeworCSAgICBkZWYgeCA9IDAKKworCSAgICAoMC4uOSkuZWFjaCB7CisJICAgICAgICB4ID0geCArIGl0CisJICAgIH0KKworCSAgICBhc3NlcnQgeCA9PSA0NQorCSAgICAKKwkgICAgeCA9IDAKKworCSAgICAoMC4uPDEwKS5lYWNoIHsKKwkgICAgICAgIHggPSB4ICsgaXQKKwkgICAgfQorCisJICAgIGFzc2VydCB4ID09IDQ1CisJfQorCisJdm9pZCB0ZXN0SW50U3RlcCgpIHsKKwkgICAgYXNzZXJ0U3RlcCgwLi45LCAzLCBbMCwgMywgNiwgOV0pCisJICAgIGFzc2VydFN0ZXAoMC4uPDEwLCAzLCBbMCwgMywgNiwgOV0pCisJICAgIAorCSAgICBhc3NlcnRTdGVwKDkuLjAsIDMsIFs5LCA2LCAzLCAwXSkKKwkgICAgYXNzZXJ0U3RlcCg5Li48MCwgMywgWzksIDYsIDNdKQorCX0KKwkKKwl2b2lkIHRlc3RPYmplY3RTdGVwKCkgeworCSAgICBhc3NlcnRTdGVwKCdhJy4uJ2YnLCAyLCBbJ2EnLCAnYycsICdlJ10pCisJICAgIGFzc2VydFN0ZXAoJ2EnLi48J2UnLCAyLCBbJ2EnLCAnYyddKQorCSAgICAKKwkgICAgYXNzZXJ0U3RlcCgneicuLid2JywgMiwgWyd6JywgJ3gnLCAndiddKQorCSAgICBhc3NlcnRTdGVwKCd6Jy4uPCd2JywgMiwgWyd6JywgJ3gnXSkKKwl9CisJCisJdm9pZCB0ZXN0SXRlcmF0ZUludFJhbmdlKCkgeworCSAgICBhc3NlcnRJdGVyYXRlKDAuLjksIFswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5XSkKKwkgICAgYXNzZXJ0SXRlcmF0ZSgxLi48OCwgWzEsIDIsIDMsIDQsIDUsIDYsIDddKQorCSAgICBhc3NlcnRJdGVyYXRlKDcuLjEsIFs3LCA2LCA1LCA0LCAzLCAyLCAxXSkKKwkgICAgYXNzZXJ0SXRlcmF0ZSg2Li48MSwgWzYsIDUsIDQsIDMsIDJdKQorCX0KKwkKKwl2b2lkIHRlc3RJdGVyYXRlT2JqZWN0UmFuZ2UoKSB7CisJICAgIGFzc2VydEl0ZXJhdGUoJ2EnLi4nZCcsIFsnYScsICdiJywgJ2MnLCAnZCddKQorCSAgICBhc3NlcnRJdGVyYXRlKCdhJy4uPCdkJywgWydhJywgJ2InLCAnYyddKQorCSAgICBhc3NlcnRJdGVyYXRlKCd6Jy4uJ3gnLCBbJ3onLCAneScsICd4J10pCisJICAgIGFzc2VydEl0ZXJhdGUoJ3onLi48J3gnLCBbJ3onLCAneSddKQorCX0KKwkKKwl2b2lkIHRlc3RSYW5nZUNvbnRhaW5zKCkgeworCSAgICBkZWYgcmFuZ2UgPSAwLi4xMAorCSAgICBhc3NlcnQgcmFuZ2UuY29udGFpbnMoMCkKKwkgICAgYXNzZXJ0IHJhbmdlLmNvbnRhaW5zKDEwKQorCSAgICAKKwkgICAgcmFuZ2UgPSAwLi48NQorCSAgICBhc3NlcnQgcmFuZ2UuY29udGFpbnMoMCkKKwkgICAgYXNzZXJ0ICEgcmFuZ2UuY29udGFpbnMoNSkKKwl9CisJCisJdm9pZCB0ZXN0QmFja3dhcmRzUmFuZ2VDb250YWlucygpIHsKKwkgICAgZGVmIHJhbmdlID0gMTAuLjAKKwkgICAgYXNzZXJ0IHJhbmdlLmNvbnRhaW5zKDApCisJICAgIGFzc2VydCByYW5nZS5jb250YWlucygxMCkKKwkgICAgCisJICAgIHJhbmdlID0gNS4uPDEKKwkgICAgYXNzZXJ0IHJhbmdlLmNvbnRhaW5zKDUpCisJICAgIGFzc2VydCAhIHJhbmdlLmNvbnRhaW5zKDEpCisJfQorCQorCXZvaWQgdGVzdE9iamVjdFJhbmdlQ29udGFpbnMoKSB7CisJICAgIGRlZiByYW5nZSA9ICdhJy4uJ3gnCisJICAgIGFzc2VydCByYW5nZS5jb250YWlucygnYScpCisJICAgIGFzc2VydCByYW5nZS5jb250YWlucygneCcpCisJICAgIGFzc2VydCByYW5nZS5jb250YWlucygneicpID09IGZhbHNlCisJICAgIAorCSAgICByYW5nZSA9ICdiJy4uPCdmJworCSAgICBhc3NlcnQgcmFuZ2UuY29udGFpbnMoJ2InKQorCSAgICBhc3NlcnQgISByYW5nZS5jb250YWlucygnZycpCisJICAgIGFzc2VydCAhIHJhbmdlLmNvbnRhaW5zKCdmJykKKwkgICAgYXNzZXJ0ICEgcmFuZ2UuY29udGFpbnMoJ2EnKQorCX0KKwkKKwl2b2lkIHRlc3RCYWNrd2FyZHNPYmplY3RSYW5nZUNvbnRhaW5zKCkgeworCSAgICBkZWYgcmFuZ2UgPSAneCcuLidhJworCSAgICBhc3NlcnQgcmFuZ2UuY29udGFpbnMoJ2EnKQorCSAgICBhc3NlcnQgcmFuZ2UuY29udGFpbnMoJ3gnKQorCSAgICBhc3NlcnQgcmFuZ2UuY29udGFpbnMoJ3onKSA9PSBmYWxzZQorCSAgICAKKwkgICAgcmFuZ2UgPSAnZicuLjwnYicKKwkgICAgYXNzZXJ0ICEgcmFuZ2UuY29udGFpbnMoJ2cnKQorCSAgICBhc3NlcnQgcmFuZ2UuY29udGFpbnMoJ2YnKQorCSAgICBhc3NlcnQgcmFuZ2UuY29udGFpbnMoJ2MnKQorCSAgICBhc3NlcnQgISByYW5nZS5jb250YWlucygnYicpCisJfQorCQorCXZvaWQgdGVzdEludFJhbmdlVG9TdHJpbmcoKSB7CisJICAgIGFzc2VydFRvU3RyaW5nKDAuLjEwLCAiMC4uMTAiKQorCSAgICBhc3NlcnRUb1N0cmluZyhbMSwgNC4uMTAsIDldLCAiWzEsIDQuLjEwLCA5XSIpCisJICAgIAorCSAgICBhc3NlcnRUb1N0cmluZygwLi48MTEsICIwLi4xMCIpCisJICAgIGFzc2VydFRvU3RyaW5nKFsxLCA0Li48MTEsIDldLCAiWzEsIDQuLjEwLCA5XSIpCisJICAgIAorCSAgICAKKwkgICAgYXNzZXJ0VG9TdHJpbmcoMTAuLjAsICIxMC4uMCIpCisJICAgIGFzc2VydFRvU3RyaW5nKFsxLCAxMC4uNCwgOV0sICJbMSwgMTAuLjQsIDldIikKKwkgICAgCisJICAgIGFzc2VydFRvU3RyaW5nKDExLi48MCwgIjExLi4xIikKKwkgICAgYXNzZXJ0VG9TdHJpbmcoWzEsIDExLi48NCwgOV0sICJbMSwgMTEuLjUsIDldIikKKwl9CisJCisJdm9pZCB0ZXN0T2JqZWN0UmFuZ2VUb1N0cmluZygpIHsKKwkgICAgYXNzZXJ0VG9TdHJpbmcoJ2EnLi4nZCcsICdhLi5kJywgJyJhIi4uImQiJykKKwkgICAgYXNzZXJ0VG9TdHJpbmcoJ2EnLi48J2QnLCAnYS4uYycsICciYSIuLiJjIicpCisJICAgIGFzc2VydFRvU3RyaW5nKCd6Jy4uJ3gnLCAnei4ueCcsICcieiIuLiJ4IicpCisJICAgIGFzc2VydFRvU3RyaW5nKCd6Jy4uPCd4JywgJ3ouLnknLCAnInoiLi4ieSInKQorCX0KKwkKKwl2b2lkIHRlc3RSYW5nZVNpemUoKSB7CisJICAgIGFzc2VydFNpemUoMS4uMTAsIDEwKQorCSAgICBhc3NlcnRTaXplKDExLi48MjEsIDEwKQorCSAgICBhc3NlcnRTaXplKDMwLi4yMSwgMTApCisJICAgIGFzc2VydFNpemUoNDAuLjwzMCwgMTApCisJfQorCisJdm9pZCB0ZXN0Qm9yZGVyQ2FzZXMoKSB7CisJICAgIGFzc2VydEl0ZXJhdGUoMC4uMSwgWzAsMV0pCisJICAgIGFzc2VydEl0ZXJhdGUoMC4uMCwgWzBdKQorCSAgICBhc3NlcnRJdGVyYXRlKDAuLi0xLCBbMCwtMV0pCisJICAgIGFzc2VydEl0ZXJhdGUoMC4uPC0xLCBbMF0pCisJfQorCisJdm9pZCB0ZXN0RW1wdHlSYW5nZXMoKXsKKwkgICAgYXNzZXJ0U2l6ZSgwLi48MCwgMCkKKwkgICAgYXNzZXJ0U2l6ZSgxLi48MSwgMCkKKwkgICAgYXNzZXJ0U2l6ZSgtMS4uPC0xLCAwKQorCSAgICBhc3NlcnRTaXplKCdhJy4uPCdhJywgMCkKKwkgICAgYXNzZXJ0U2l6ZSgwLjBHLi48MC4wRywgMCkKKwkgICAgKDAuLjwwKS5lYWNoe2Fzc2VydCBmYWxzZX0KKwkgICAgKDAuLjwwKS5zdGVwKDEpe2Fzc2VydCBmYWxzZX0KKwkgICAgZm9yIChpIGluIDAuLjwwKSBhc3NlcnQgZmFsc2UKKwkgICAgYXNzZXJ0VG9TdHJpbmcoMC4uPDAsICcwLi48MCcsICcwLi48MCcpCisJICAgIGFzc2VydFRvU3RyaW5nKCdhJy4uPCdhJywgJ2EuLjxhJywgJyJhIi4uPCJhIicpCisJICAgIGFzc2VydFRvU3RyaW5nKG51bGwuLjxudWxsLCAnbnVsbC4uPG51bGwnLCAnbnVsbC4uPG51bGwnKQorCSAgICBhc3NlcnRTdGVwKDAuLjwwLCAzLCBbXSkKKwkgICAgYXNzZXJ0SXRlcmF0ZSgwLi48MCwgW10pCisJfQorCQorCXZvaWQgdGVzdFN0cmluZ1JhbmdlKCkgeworCSAgICBkZWYgcmFuZ2UgPSAnYScuLidkJworCSAgICAKKwkgICAgZGVmIGxpc3QgPSBbXQorCSAgICByYW5nZS5lYWNoIHsgbGlzdCA8PCBpdCB9CisJICAgIGFzc2VydCBsaXN0ID09IFsnYScsICdiJywgJ2MnLCAnZCddCisJICAgIAorCSAgICBkZWYgcyA9IHJhbmdlLnNpemUoKQorCSAgICBhc3NlcnQgcyA9PSA0CisJfQorCQorCXZvaWQgdGVzdEJhY2t3YXJkc1N0cmluZ1JhbmdlKCkgeworCSAgICBkZWYgcmFuZ2UgPSAnZCcuLidhJworCSAgICAKKwkgICAgZGVmIGxpc3QgPSBbXQorCSAgICByYW5nZS5lYWNoIHsgbGlzdCA8PCBpdCB9CisJICAgIGFzc2VydCBsaXN0ID09IFsnZCcsICdjJywgJ2InLCAnYSddCisJICAgIAorCSAgICBkZWYgcyA9IHJhbmdlLnNpemUoKQorCSAgICBhc3NlcnQgcyA9PSA0CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGFzc2VydEl0ZXJhdGUocmFuZ2UsIGV4cGVjdGVkKSB7CisJICAgIGRlZiBsaXN0ID0gW10KKwkgICAgZm9yIChpdCBpbiByYW5nZSkgeworCSAgICAgICAgbGlzdCA8PCBpdAorCSAgICB9CisJICAgIGFzc2VydCBsaXN0ID09IGV4cGVjdGVkICwgImZvciBsb29wIG9uICR7cmFuZ2V9IgorCSAgICAKKwkJbGlzdCA9IFtdCisJICAgIHJhbmdlLmVhY2ggeyBsaXN0IDw8IGl0fQorCSAgICBhc3NlcnQgbGlzdCA9PSBleHBlY3RlZCAsICJlYWNoKCkgb24gJHtyYW5nZX0iCisJfQorCQorCXByb3RlY3RlZCB2b2lkIGFzc2VydFNpemUocmFuZ2UsIGV4cGVjdGVkKSB7CisJICAgIGRlZiBzaXplID0gcmFuZ2Uuc2l6ZSgpCisJICAgIGFzc2VydCBzaXplID09IGV4cGVjdGVkICwgcmFuZ2UKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgYXNzZXJ0VG9TdHJpbmcocmFuZ2UsIGV4cGVjdGVkKSB7CisJICAgIGRlZiB0ZXh0ID0gcmFuZ2UudG9TdHJpbmcoKQorCSAgICBhc3NlcnQgdGV4dCA9PSBleHBlY3RlZCAsICJ0b1N0cmluZygpIGZvciAke3JhbmdlfSIKKwkgICAgdGV4dCA9IHJhbmdlLmluc3BlY3QoKQorCSAgICBhc3NlcnQgdGV4dCA9PSBleHBlY3RlZCAsICJpbnNwZWN0KCkgZm9yICR7cmFuZ2V9IgorCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBhc3NlcnRUb1N0cmluZyhyYW5nZSwgZXhwZWN0ZWRTdHJpbmcsIGV4cGVjdGVkSW5zcGVjdCkgeworCSAgICBkZWYgdGV4dCA9IHJhbmdlLnRvU3RyaW5nKCkKKwkgICAgYXNzZXJ0IHRleHQgPT0gZXhwZWN0ZWRTdHJpbmcgLCAidG9TdHJpbmcoKSBmb3IgJHtyYW5nZX0iCisJICAgIHRleHQgPSByYW5nZS5pbnNwZWN0KCkKKwkgICAgYXNzZXJ0IHRleHQgPT0gZXhwZWN0ZWRJbnNwZWN0ICwgImluc3BlY3QoKSBmb3IgJHtyYW5nZX0iCisJfQorCQorCXByb3RlY3RlZCB2b2lkIGFzc2VydFN0ZXAocmFuZ2UsIHN0ZXBWYWx1ZSwgZXhwZWN0ZWQpIHsKKwkgICAgZGVmIGxpc3QgPSBbXQorCSAgICByYW5nZS5zdGVwKHN0ZXBWYWx1ZSkgeworCSAgICAgICAgbGlzdCA8PCBpdAorCSAgICB9CisJICAgIGFzc2VydCBsaXN0ID09IGV4cGVjdGVkCisKKwkgICAgbGlzdCA9IFtdCisJICAgIGZvciAoaXQgaW4gcmFuZ2Uuc3RlcChzdGVwVmFsdWUpKSB7CisJICAgICAgICBsaXN0IDw8IGl0CisJICAgIH0KKwkgICAgYXNzZXJ0IGxpc3QgPT0gZXhwZWN0ZWQKKwl9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1JlYWRMaW5lVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1JlYWRMaW5lVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA4NzMyMQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvUmVhZExpbmVUZXN0Lmdyb292eQpAQCAtMCwwICsxLDcwIEBACisvLyBEbyBub3QgcmVtb3ZlIHRoaXMgbGluZTogaXQgaXMgdXNlZCBpbiB0ZXN0IGJlbG93CitwYWNrYWdlIGdyb292eQorCisvKioKKyAqIFRlc3QgdG8gZW5zdXJlIHRoYXQgcmVhZExpbmUoKSBtZXRob2Qgd29ya3Mgb24gUmVhZGVyL0lucHV0U3RyZWFtCisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmplcmVteS5yYXluZXJAYmlnZm9vdC5jb20iPkplcmVteSBSYXluZXI8L2E+CisgKiBAYXV0aG9yIEpvYWNoaW0gQmF1bWFubgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCisKK2NsYXNzIFJlYWRMaW5lVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKyAgICBkZWYgZmlsZQorICAgIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGZpbGUgPSBuZXcgRmlsZSgic3JjL3Rlc3QvZ3Jvb3Z5L1JlYWRMaW5lVGVzdC5ncm9vdnkiKQorICAgIH0KKyAgICB2b2lkIHRlc3RSZWFkT25lTGluZUZyb21SZWFkZXIoKSB7CisgICAgICAgIGRlZiBsaW5lCisgICAgICAgIGZpbGUud2l0aFJlYWRlcigpIHtsaW5lID0gaXQucmVhZExpbmUoKX0KKyAgICAgICAgYXNzZXJ0IGxpbmUgPT0gIi8vIERvIG5vdCByZW1vdmUgdGhpcyBsaW5lOiBpdCBpcyB1c2VkIGluIHRlc3QgYmVsb3ciCisgICAgfQorICAgIAorICAgIHN0YXRpYyB0ZXN0U3RyaW5nID0gIiDkXG4g9lxuXG4g/FxyXG4gNVxyXHIgN1xuXHIgOSIKKyAgICBzdGF0aWMgZXhwZWN0ZWRMaW5lcyA9IFsgIiDkIiwgIiD2IiwgIiIsICIg/CIsICIgNSIsICIiLCAiIDciLCAiIiwgIiA5IiBdCisgICAgc3RhdGljIFN0cmluZ1tdIGV4cGVjdGVkTGluZXNTbG93ID0gWyAiIOQiLCAiIPYiLCAiIPwiLCAiIDUiLCAiIDciIF0KKyAgICBzdGF0aWMgaW50W10gZXhwZWN0ZWRDaGFycyA9IFsnICcsICc5JywgLTFdOworCisgICAgdm9pZCByZWFkRnJvbVJlYWRlcihSZWFkZXIgcmVhZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBleHBlY3RlZExpbmVzLmVhY2ggeyBleHBlY3RlZCAtPgorICAgICAgICAgICAgZGVmIGxpbmUgPSByZWFkZXIucmVhZExpbmUoKQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZWFkbGluZSBzaG91bGQgcmV0dXJuIGNvcnJlY3QgbGluZSIsIGV4cGVjdGVkLCBsaW5lKQorICAgICAgICB9CisgICAgICAgIGFzc2VydE51bGwoIlJlYWRsaW5lIHNob3VsZCByZXR1cm4gbnVsbCIsIHJlYWRlci5yZWFkTGluZSgpKQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RCdWZmZXJlZFJlYWRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7ICAgICAgICAKKyAgICAgICAgUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKHRlc3RTdHJpbmcpKQorICAgICAgICByZWFkRnJvbVJlYWRlcihyZWFkZXIpCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRlclN1cHBvcnRpbmdNYXJrKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsgICAgICAgIAorICAgICAgICBSZWFkZXIgcmVhZGVyID0gbmV3IFN0cmluZ1JlYWRlcih0ZXN0U3RyaW5nKQorICAgICAgICByZWFkRnJvbVJlYWRlcihyZWFkZXIpCisgICAgfQorCisgICAgLyoKKyAgICAgKiBJbiB0aGlzIGNhc2Ugd2UgY2Fubm90IHJlYWQgbW9yZSB0aGFuIG9uZSBsaW5lIHNlcGFyYXRvcgorICAgICAqIFRodXMgZW1wdHkgbGluZXMgY2FuIGJlIHJldHVybmVkIGlmIGxpbmUgc2VwYXJhdGlvbiBpcyBcclxuLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkZXJTbG93KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsgICAgICAgIAorICAgICAgICBSZWFkZXIgcmVhZGVyID0gbmV3IFNsb3dTdHJpbmdSZWFkZXIodGVzdFN0cmluZyk7CisgICAgICAgIGV4cGVjdGVkTGluZXNTbG93LmVhY2ggeyBleHBlY3RlZCAtPgorICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSByZWFkZXIucmVhZExpbmUoKQorICAgICAgICAgICAgd2hpbGUobGluZSAhPSBudWxsICYmIGxpbmUubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGxpbmUgPSByZWFkZXIucmVhZExpbmUoKQorICAgICAgICAgICAgfSAKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiUmVhZGxpbmUgc2hvdWxkIHJldHVybiBjb3JyZWN0IGxpbmUiLCBleHBlY3RlZCwgbGluZSk7ICAgIAorICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscygiUmVhZGxpbmUgc2hvdWxkIHJldHVybiBlbXB0eSBzdHJpbmciLCAiIiwgcmVhZGVyLnJlYWRMaW5lKCkpOworCisgICAgICAgIGV4cGVjdGVkQ2hhcnMuZWFjaCB7IGV4cGVjdGVkIC0+CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlJlbWFpbmluZyBjaGFyYWN0ZXJzIGluY29ycmVjdCIsIGV4cGVjdGVkLCByZWFkZXIucmVhZCgpKSAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0TnVsbChyZWFkZXIucmVhZExpbmUoKSk7CisgICAgfQorfQorY2xhc3MgU2xvd1N0cmluZ1JlYWRlciBleHRlbmRzIFN0cmluZ1JlYWRlciB7CisgICAgcHVibGljIFNsb3dTdHJpbmdSZWFkZXIoU3RyaW5nIHMpIHsgc3VwZXIocyk7IH0KKyAgICBwdWJsaWMgYm9vbGVhbiBtYXJrU3VwcG9ydGVkKCkgeyByZXR1cm4gZmFsc2UgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9SZWdFeHBHcm91cE1hdGNoVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1JlZ0V4cEdyb3VwTWF0Y2hUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2YzZGIwCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9SZWdFeHBHcm91cE1hdGNoVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwxMDEgQEAKK3BhY2thZ2UgZ3Jvb3Z5CisKKy8qKgorICogVGVzdCBmb3IgZml4aW5nIHRoZSBKaXJhIGlzc3VlIEdST09WWS0xMDAwCisgKgorICogICAgRml4IGFuIGluZmluaXRlIGxvb3Agd2hlbiBnZXR0aW5nIGFmdGVyIGdyb3VwIG1hdGNoaW5nIGluIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAqICAgIEdyYWhhbSBNaWxsZXIgaGFzIGdpdmVuIHRoaXMgaWRlYS4KKyAqCisgKiBAYXV0aG9yIFBpbGhvIEtpbQorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCisKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcgoraW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuCisKK2NsYXNzIFJlZ0V4cEdyb3VwTWF0Y2hUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCB0ZXN0Rmlyc3QoKSB7CisgICAgICAgIGFzc2VydCAiY2hlZXNlY2hlZXNlIiA9fiAiY2hlZXNlIgorICAgICAgICBhc3NlcnQgImNoZWVzZWNoZWVzZSIgPX4gL2NoZWVzZS8KKyAgICAgICAgYXNzZXJ0ICJjaGVlc2UiID09IC9jaGVlc2UvICAgLyp0aGV5IGFyZSBib3RoIHN0cmluZyBzeW50YXhlcyovCisgICAgfQorCisgICAgdm9pZCB0ZXN0U2Vjb25kKCkgeworICAgICAgICAvLyBMZXRzIGNyZWF0ZSBhIHJlZ2V4IFBhdHRlcm4KKyAgICAgICAgZGVmIHBhdHRlcm4gPSB+L2Zvby8KKyAgICAgICAgYXNzZXJ0IHBhdHRlcm4gaW5zdGFuY2VvZiBQYXR0ZXJuCisgICAgICAgIGFzc2VydCBwYXR0ZXJuLm1hdGNoZXIoImZvbyIpLm1hdGNoZXMoKQorICAgIH0KKworICAgIHZvaWQgdGVzdFRoaXJkKCkgeworICAgICAgICAvLyBMZXQncyBjcmVhdGUgYSBNYXRjaGVyCisgICAgICAgIGRlZiBtYXRjaGVyID0gImNoZWVzZWNoZWVzZSIgPX4gL2NoZWVzZS8KKyAgICAgICAgYXNzZXJ0IG1hdGNoZXIgaW5zdGFuY2VvZiBNYXRjaGVyCisgICAgICAgIGRlZiBhbnN3ZXIgPSBtYXRjaGVyLnJlcGxhY2VBbGwoImVkYW0iKQorICAgICAgICBhc3NlcnQgYW5zd2VyID09ICJlZGFtZWRhbSIKKyAgICB9CisKKyAgICB2b2lkIHRlc3RGb3VydGgoKSB7CisgICAgICAgIC8vIExldHMgZG8gc29tZSByZXBsYWNlbWVudAorICAgICAgICBkZWYgY2hlZXNlID0gKCJjaGVlc2VjaGVlc2UiID1+IC9jaGVlc2UvKS5yZXBsYWNlRmlyc3QoIm5pY2UiKQorICAgICAgICBhc3NlcnQgY2hlZXNlID09ICJuaWNlY2hlZXNlIgorICAgIH0KKworICAgIHZvaWQgdGVzdEZpZnRoKCkgeworICAgICAgICAvLyBHcm91cCBkZW1vCisgICAgICAgIGRlZiBtYXRjaGVyID0gIlwkYWJjLiIgPX4gIlxcXCQoLiopXFwuIgorICAgICAgICBtYXRjaGVyLm1hdGNoZXMoKTsgICAgICAgICAgICAgICAgICAgLy8gbXVzdCBiZSBpbnZva2VkCisgICAgICAgIGFzc2VydCBtYXRjaGVyLmdyb3VwKDEpID09ICJhYmMiICAgICAvLyBpcyBvbmUsIG5vdCB6ZXJvCisgICAgICAgIC8vIGFzc2VydCBtYXRjaGVyWzFdID09ICJhYmMiICAgICAvLyBUaGlzIGhhcyB3b3JrZWQgb25seSBiZWZvcmUganNyLTAzLXJlbGVhc2UKKyAgICAgICAgcHJpbnRsbiAobWF0Y2hlclswXSkKKyAgICAgICAgYXNzZXJ0IG1hdGNoZXJbMF0gPT0gWyJcJGFiYy4iLCAiYWJjIl0KKyAgICAgICAgYXNzZXJ0IG1hdGNoZXJbMF1bMV0gPT0gImFiYyIKKyAgICB9CisKKyAgICB2b2lkIHRlc3RTaXh0aCgpIHsKKyAgICAgICAgLy8gR3JvdXAgZGVtbworICAgICAgICAvLyBBdm9pZCBoYXZpbmcgdG8gZG91YmxlIGFsbCB0aGUgYmFja3NsYXNoIGVzY2FwaW5nIGNoYXJhY3RlcnMuCisgICAgICAgIGRlZiBtYXRjaGVyID0gIlwkYWJjLiIgPX4gL1wkKC4qKVwuLyAgICAvLyBubyBuZWVkIHRvIGRvdWJsZS1lc2NhcGUhCisgICAgICAgIGFzc2VydCAiXFxcJCguKilcXC4iID09IC9cJCguKilcLi8KKyAgICAgICAgbWF0Y2hlci5tYXRjaGVzKCk7ICAgICAgICAgICAgICAgICAgICAgIC8vIG11c3QgYmUgaW52b2tlZAorICAgICAgICBhc3NlcnQgbWF0Y2hlci5ncm91cCgxKSA9PSAiYWJjIiAgICAgICAgLy8gaXMgb25lLCBub3QgemVybworICAgICAgICAvLyBhc3NlcnQgbWF0Y2hlclsxXSA9PSAiYWJjIiAgICAgLy8gVGhpcyBoYXMgd29ya2VkIG9ubHkgYmVmb3JlIGpzci0wMy1yZWxlYXNlCisgICAgICAgIHByaW50bG4gKG1hdGNoZXJbMF0pCisgICAgICAgIGFzc2VydCBtYXRjaGVyWzBdID09IFsiXCRhYmMuIiwgImFiYyJdCisgICAgICAgIGFzc2VydCBtYXRjaGVyWzBdWzFdID09ICJhYmMiCisgICAgfQorCisgICAgLy8gVGVzdCBubyBncm91cCBtYXRjaC4KKyAgICB2b2lkIHRlc3ROb0dyb3VwTWF0Y2hlckFuZEdldCgpIHsKKyAgICAgICAgZGVmIHAgPSAvYWJbZHxmXS8KKyAgICAgICAgZGVmIG0gPSAiYWJjYWJkYWJlYWJmIiA9fiBwIAorCisgICAgICAgIGZvciAoaSBpbiAwLi48bS5jb3VudCkgeyAKKyAgICAgICAgICAgIHByaW50bG4oICJtLmdyb3VwQ291bnQoKSA9ICIgKyBtLmdyb3VwQ291bnQoKSkKKyAgICAgICAgICAgIHByaW50bG4oICIgICIgKyBpICsgIjogIiArIG1baV0gKSAgIC8vIG1baV0gaXMgYSBTdHJpbmcKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRlc3QgZ3JvdXAgbWF0Y2hlcy4KKyAgICB2b2lkIHRlc3RHcm91cE1hdGNoZXJBbmRHZXQoKSB7CisgICAgICAgIGRlZiBwID0gLyg/OmFiKFtjfGR8ZXxmXSkpLworICAgICAgICBkZWYgbSA9ICJhYmNhYmRhYmVhYmYiID1+IHAgCisKKyAgICAgICAgZm9yIChpIGluIDAuLjxtLmNvdW50KSB7IAorICAgICAgICAgICAgcHJpbnRsbiggIm0uZ3JvdXBDb3VudCgpID0gIiArIG0uZ3JvdXBDb3VudCgpKQorICAgICAgICAgICAgcHJpbnRsbiggIiAgIiArIGkgKyAiOiAiICsgbVtpXSApICAgLy8gbVtpXSBpcyBhIFN0cmluZworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVGVzdCBncm91cCBtYXRjaGVzLgorICAgIHZvaWQgdGVzdEFub3RoZXJHcm91cE1hdGNoZXJBbmRHZXQoKSB7CisgICAgICAgIGRlZiBtID0gImFiY2FiZGFiZWFiZmFieHl6YWJ4IiA9fiAvKD86YWIoW2R8eC16XSspKS8KKworICAgICAgICBtLmNvdW50LnRpbWVzIHsgCisgICAgICAgICAgICBwcmludGxuKCAibS5ncm91cENvdW50KCkgPSAiICsgbS5ncm91cENvdW50KCkpCisgICAgICAgICAgICBwcmludGxuKCAiICAiICsgaXQgKyAiOiAiICsgbVtpdF0gKSAgIC8vIG1baXRdIGlzIGEgU3RyaW5nCisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvUmVndWxhckV4cHJlc3Npb25zVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1JlZ3VsYXJFeHByZXNzaW9uc1Rlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhN2IxOWYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1JlZ3VsYXJFeHByZXNzaW9uc1Rlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTIyIEBACitwYWNrYWdlIGdyb292eQorCisvKioKKyAqIFRlc3RzIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gc3ludGF4LgorICoKKyAqIEBhdXRob3IgU2FtIFB1bGxhcmEKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KKyAKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcgoraW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuCisKK2NsYXNzIFJlZ3VsYXJFeHByZXNzaW9uc1Rlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICAgdm9pZCB0ZXN0U3Vic2NyaXB0KCkgeworICAgICAgICAgZGVmIGEgPSAiY2hlZXNlY2hlZXNlIgorICAgICAgICAgZGVmIGIgPSBhID1+ICJlKyIKKyAgICAgICAgIGRlZiB2YWx1ZSA9IGJbMl0KKyAgICAgICAgIGFzc2VydCB2YWx1ZSA9PSAiZWUiCisKKyAgICAgICAgIHZhbHVlID0gYlswLCAyXQorCisgICAgICAgICBhc3NlcnQgdmFsdWUgPT0gImVlZWUiCisKKyAgICAgICAgIHZhbHVlID0gYlswLCAxLi4yXQorCisgICAgICAgICBhc3NlcnQgdmFsdWUgPT0gImVlZWVlIgorICAgICB9CisKKyAgICAgdm9pZCB0ZXN0RmluZFJlZ2V4KCkgeworICAgICAgICAgYXNzZXJ0ICJjaGVlc2UiID1+ICJjaGVlc2UiCisKKyAgICAgICAgIGRlZiByZWdleCA9ICJjaGVlc2UiCisgICAgICAgICBkZWYgc3RyaW5nID0gImNoZWVzZSIKKyAgICAgICAgIGFzc2VydCBzdHJpbmcgPX4gcmVnZXgKKworICAgICAgICAgZGVmIGkgPSAwCisgICAgICAgICBkZWYgbSA9ICJjaGVlc2VjaGVlc2UiID1+ICJjaGVlc2UiCisKKyAgICAgICAgIGFzc2VydCBtIGluc3RhbmNlb2YgTWF0Y2hlcgorCisgICAgICAgICB3aGlsZShtKSB7IGkgPSBpICsgMSB9CisgICAgICAgICBhc3NlcnQgaSA9PSAyCisKKyAgICAgICAgIGkgPSAwCisgICAgICAgICBtID0gImNoZWVzZWNoZWVzZSIgPX4gImUrIgorICAgICAgICAgd2hpbGUobSkgeyBpID0gaSArIDEgfQorICAgICAgICAgYXNzZXJ0IGkgPT0gNAorCisgICAgICAgICBtLnJlc2V0KCkKKyAgICAgICAgIG0uZmluZCgpCisgICAgICAgICBtLmZpbmQoKQorICAgICAgICAgbS5maW5kKCkKKyAgICAgICAgIGFzc2VydCBtLmdyb3VwKCkgPT0gImVlIgorICAgICB9CisKKyAgICAgdm9pZCB0ZXN0TWF0Y2hSZWdleCgpIHsKKyAgICAgICAgIGFzc2VydCAiY2hlZXNlIiA9PX4gImNoZWVzZSIKKworICAgICAgICAgYXNzZXJ0ICEoImNoZWVzZWNoZWVzZSIgPT1+ICJjaGVlc2UiKQorCisgICAgIH0KKworICAgICB2b2lkIHRlc3RSZWdleEVhY2goKSB7CisgICAgICAgICBkZWYgaSA9IDAKKyAgICAgICAgICgiY2hlZXNlY2hlZXNlIiA9fiAiY2hlZXNlIikuZWFjaCB7dmFsdWUgLT4gcHJpbnRsbih2YWx1ZSk7IGkgPSBpICsgMX0KKyAgICAgICAgIGFzc2VydCBpID09IDIKKworICAgICAgICAgaSA9IDAKKyAgICAgICAgICgiY2hlZXNlY2hlZXNlIiA9fiAiZWUrIikuZWFjaCB7IHByaW50bG4oaXQpOyBpID0gaSArIDF9CisgICAgICAgICBhc3NlcnQgaSA9PSAyCisgICAgIH0KKworICAgICB2b2lkIHRlc3RTaW1wbGVQYXR0ZXJuKCkgeworICAgICAgICAgZGVmIHBhdHRlcm4gPSB+ImZvbyIKKyAgICAgICAgIGFzc2VydCBwYXR0ZXJuIGluc3RhbmNlb2YgUGF0dGVybgorICAgICAgICAgYXNzZXJ0IHBhdHRlcm4ubWF0Y2hlcigiZm9vIikubWF0Y2hlcygpCisgICAgICAgICBhc3NlcnQgIXBhdHRlcm4ubWF0Y2hlcigiYmFyIikubWF0Y2hlcygpCisgICAgIH0KKworICAgICB2b2lkIHRlc3RNdWx0aUxpbmVQYXR0ZXJuKCkgeworICAgICAgICAgZGVmIHBhdHRlcm4gPSB+IiIiZm9vIiIiCisKKyAgICAgICAgIGFzc2VydCBwYXR0ZXJuIGluc3RhbmNlb2YgUGF0dGVybgorICAgICAgICAgYXNzZXJ0IHBhdHRlcm4ubWF0Y2hlcigiZm9vIikubWF0Y2hlcygpCisgICAgICAgICBhc3NlcnQgIXBhdHRlcm4ubWF0Y2hlcigiYmFyIikubWF0Y2hlcygpCisgICAgIH0KKworICAgICB2b2lkIHRlc3RQYXR0ZXJuSW5Bc3NlcnRpb24oKSB7CisgICAgICAgICBhc3NlcnQgImZvb2Zvb2ZvbyIgPX4gfiJmb28iCisgICAgIH0KKworCisgICAgIHZvaWQgdGVzdE1hdGNoZXIoKSB7CisgICAgICAgICBkZWYgbWF0Y2hlciA9ICJjaGVlc2UtY2hlZXNlIiA9fiAiY2hlZXNlIgorICAgICAgICAgZGVmIGFuc3dlciA9IG1hdGNoZXIucmVwbGFjZUFsbCgiZWRhbSIpCisgICAgICAgICBhc3NlcnQgYW5zd2VyID09ICdlZGFtLWVkYW0nCisKKyAgICAgICAgIGRlZiBjaGVlc2UgPSAoImNoZWVzZSBjaGVlc2UhIiA9fiAiY2hlZXNlIikucmVwbGFjZUZpcnN0KCJuaWNlIikKKyAgICAgICAgIGFzc2VydCBjaGVlc2UgPT0gIm5pY2UgY2hlZXNlISIKKyAgICAgfQorCisgICAgdm9pZCB0ZXN0R2V0TGFzdE1hdGNoZXIoKSB7CisgICAgICAgIGFzc2VydCAiY2hlZXNlIiA9PX4gImNoZWVzZSIKKyAgICAgICAgYXNzZXJ0IE1hdGNoZXIuZ2V0TGFzdE1hdGNoZXIoKS5tYXRjaGVzKCkKKworICAgICAgICBzd2l0Y2goImNoZWVzZWZvbyIpIHsKKyAgICAgICAgICAgIGNhc2UgfiJjaGVlc2VjaGVlc2UiOgorICAgICAgICAgICAgICAgIGFzc2VydCBmYWxzZTsKKyAgICAgICAgICAgIGNhc2UgfiIoY2hlZXNlKShmb28pIjoKKyAgICAgICAgICAgICAgICBkZWYgbSA9IE1hdGNoZXIuZ2V0TGFzdE1hdGNoZXIoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQgbS5ncm91cCgwKSA9PSAiY2hlZXNlZm9vIgorICAgICAgICAgICAgICAgIGFzc2VydCBtLmdyb3VwKDEpID09ICJjaGVlc2UiCisgICAgICAgICAgICAgICAgYXNzZXJ0IG0uZ3JvdXAoMikgPT0gImZvbyIKKyAgICAgICAgICAgICAgICBhc3NlcnQgbS5ncm91cENvdW50KCkgPT0gMgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBhc3NlcnQgZmFsc2UKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1JldHVyblRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9SZXR1cm5UZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWJjODQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9SZXR1cm5UZXN0Lmdyb292eQpAQCAtMCwwICsxLDcwIEBACitwYWNrYWdlIGdyb292eQorCisvKiogCisgKiBUZXN0cyB0aGUgdXNlIG9mIHJldHVybnMgaW4gR3Jvb3Z5CisgKiAKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK2NsYXNzIFJldHVyblRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisgICAgdm9pZCB0ZXN0SW50ZWdlclJldHVyblZhbHVlcygpIHsKKyAgICAgICAgZGVmIHZhbHVlID0gZm9vKDUpCisgICAgICAgIGFzc2VydCB2YWx1ZSA9PSAxMAorICAgIH0KKworICAgIHZvaWQgdGVzdEJvb2xlYW5SZXR1cm5WYWx1ZXMoKSB7CisgICAgICAgIGRlZiB2YWx1ZSA9IGJhcig2KQorICAgICAgICBhc3NlcnQgdmFsdWUKKyAgICB9CisKKyAgICBkZWYgZm9vKHgpIHsKKyAgICAgICAgcmV0dXJuICggeCAqIDIgKQorICAgIH0KKworICAgIGRlZiBiYXIoeCkgeworICAgICAgICByZXR1cm4geCA+IDUKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0Vm9pZFJldHVybigpIHsKKyAgICAgICAgZXhwbGljaXRWb2lkUmV0dXJuKCkKKyAgICAgICAgaW1wbGljaXRWb2lkUmV0dXJuKCkKKyAgICAgICAgZXhwbGljaXRWb2lkUmV0dXJuV2l0aG91dEZpbmFsUmV0dXJuKCkKKyAgICAgICAgaW1wbGljaXRWb2lkUmV0dXJuV2l0aG91dEZpbmFsUmV0dXJuKCkKKyAgICB9CisKKyAgICB2b2lkIGV4cGxpY2l0Vm9pZFJldHVybigpIHsKKyAgICAgICAgcmV0dXJuCisgICAgfQorCisgICAgZGVmIGltcGxpY2l0Vm9pZFJldHVybigpIHsKKyAgICAgICAgcmV0dXJuCisgICAgfQorCisgICAgdm9pZCBleHBsaWNpdFZvaWRSZXR1cm5XaXRob3V0RmluYWxSZXR1cm4oKSB7CisgICAgICAgIGRlZiB4ID0gNDsKKyAgICAgICAgaWYgKHggPT0gMykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB4ID0gMzsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIC8vZG8gbm90aGluZworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZGVmIGltcGxpY2l0Vm9pZFJldHVybldpdGhvdXRGaW5hbFJldHVybigpIHsKKyAgICAgICAgZGVmIHggPSA0OworICAgICAgICBpZiAoeCA9PSAzKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHggPSAzOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgLy9kbyBub3RoaW5nCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IAorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9TYWZlTmF2aWdhdGlvblRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9TYWZlTmF2aWdhdGlvblRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjY2E1MzAKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1NhZmVOYXZpZ2F0aW9uVGVzdC5ncm9vdnkKQEAgLTAsMCArMSw1MiBAQAorcGFja2FnZSBncm9vdnkKKworY2xhc3MgU2FmZU5hdmlnYXRpb25UZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCB0ZXN0TnVsbE5hdmlnYXRpb24oKSB7CisgICAgICAgIGRlZiB4ID0gbnVsbAorICAgICAgICBkZWYgeSA9IHg/LmJhcgorCisgICAgICAgIGFzc2VydCB5ID09IG51bGwKKyAgICB9CisKKyAgICB2b2lkIHRlc3ROb3JtYWxQcm9wZXJ0eU5hdmlnYXRpb24oKSB7CisgICAgICAgIGRlZiB4ID0gWydhJzo0NTYsICdmb28nOlsnYmFyJzoxMjMsICd4Jzo0NTZdLCAneic6OTldCisgICAgICAgIAorICAgICAgICBkZWYgeSA9IHg/LmZvbz8uYmFyCisgICAgICAgIAorICAgICAgICBwcmludGxuKCJmb3VuZCB5ICR7eD8uZm9vPy5iYXJ9IikKKyAgICAgICAgCisgICAgICAgIGFzc2VydCB5ID09IDEyMworICAgIH0KKworICAgIHZvaWQgdGVzdE51bGxQcm9wZXJ0eU5hdmlnYXRpb24oKSB7CisgICAgICAgIGRlZiB4ID0gbnVsbAorICAgICAgICAKKyAgICAgICAgZGVmIHkgPSB4Py5mb28/LmJhcgorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IHkgPT0gbnVsbAorCisKKyAgICAgICAgZGVmIGphdmEuYXd0LkNvbG9yIGNvbG9yID0gbnVsbAorICAgICAgICBkZWYgYSA9IGNvbG9yPy5hbHBoYQorICAgICAgICBhc3NlcnQgYSA9PSBudWxsCisKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0Tm9ybWFsTWV0aG9kQ2FsbCgpIHsKKyAgICAgICAgZGVmIHggPSAxMjM0CisgICAgICAgIAorICAgICAgICBkZWYgeSA9IHg/LnRvU3RyaW5nKCkKKyAgICAgICAgCisgICAgICAgIGFzc2VydCB5ID09ICIxMjM0IgorICAgIH0KKworICAgIHZvaWQgdGVzdE51bGxNZXRob2RDYWxsKCkgeworICAgICAgICBkZWYgeCA9IG51bGwKKyAgICAgICAgCisgICAgICAgIGRlZiB5ID0geD8udG9TdHJpbmcoKQorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IHkgPT0gbnVsbAorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9TYW1wbGVNYWluLmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvU2FtcGxlTWFpbi5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE0ZjJjNwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvU2FtcGxlTWFpbi5ncm9vdnkKQEAgLTAsMCArMSw5IEBACitwYWNrYWdlIGdyb292eQorCitjbGFzcyBTYW1wbGVNYWluIHsKKyAgICBzdGF0aWMgdm9pZCBtYWluKGFyZ3MpIHsKKyAgICAgICAgZm9yIChhcmcgaW4gYXJncykgeworICAgICAgICAgICAgcHJpbnRsbigiQXJndW1lbnQ6ICIgKyBhcmcpCisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1NlcmlhbGl6ZVRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9TZXJpYWxpemVUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2Q4OTY2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9TZXJpYWxpemVUZXN0Lmdyb292eQpAQCAtMCwwICsxLDM4IEBACitwYWNrYWdlIGdyb292eQorCitjbGFzcyBTZXJpYWxpemVUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCB0ZXN0Rm9vKCkgeworICAgICAgICBkZWYgZm9vID0gbmV3IEZvbygpCisgICAgICAgIGZvby5uYW1lID0gIkdyb21pdCIKKyAgICAgICAgZm9vLmxvY2F0aW9uID0gIk1vb24iCisKKyAgICAgICAgZGVmIGJ1ZmZlciA9IHdyaXRlKGZvbykKKyAgICAgICAgZGVmIG9iamVjdCA9IHJlYWQoYnVmZmVyKQorCisgICAgICAgIGFzc2VydCBvYmplY3QgIT0gbnVsbAorICAgICAgICBhc3NlcnQgb2JqZWN0Lm1ldGFDbGFzcyAhPSBudWxsICwgIlNob3VsZCBoYXZlIGEgbWV0YWNsYXNzISIKKyAgICAgICAgYXNzZXJ0IG9iamVjdC5uYW1lID09ICJHcm9taXQiCisgICAgICAgIGFzc2VydCBvYmplY3QubG9jYXRpb24gPT0gIk1vb24iCisgICAgICAgIGFzc2VydCBvYmplY3QuY2xhc3MubmFtZSA9PSAiZ3Jvb3Z5LkZvbyIKKyAgICAgICAgZGVmIGZvb0NsYXNzID0gdGhpcy5jbGFzcy5jbGFzc0xvYWRlci5zeXN0ZW1DbGFzc0xvYWRlci5sb2FkQ2xhc3MoJ2dyb292eS5Gb28nKQorICAgICAgICBhc3NlcnQgZm9vLmNsYXNzID09IGZvb0NsYXNzCisgICAgICAgIGFzc2VydCBvYmplY3QuY2xhc3MgPT0gZm9vQ2xhc3MKKyAgICB9CisgICAgCisgICAgZGVmIHdyaXRlKG9iamVjdCkgeworICAgICAgICBkZWYgYnVmZmVyID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpCisgICAgICAgIGRlZiBvdXQgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKGJ1ZmZlcikKKyAgICAgICAgb3V0IDw8IG9iamVjdAorICAgICAgICBvdXQuY2xvc2UoKQorICAgICAgICByZXR1cm4gYnVmZmVyLnRvQnl0ZUFycmF5KCkKKyAgICB9CisgICAgCisgICAgZGVmIHJlYWQoYnVmZmVyKSB7CisgICAgICAgIGRlZiBpbnB1dCA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnVmZmVyKSkKKyAgICAgICAgZGVmIG9iamVjdCA9IGlucHV0LnJlYWRPYmplY3QoKQorICAgICAgICBpbnB1dC5jbG9zZSgpCisgICAgICAgIHJldHVybiBvYmplY3QKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvU2hlbGxUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvU2hlbGxUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjcyN2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9TaGVsbFRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMzUgQEAKK3BhY2thZ2UgZ3Jvb3Z5CisKK2NsYXNzIFNoZWxsVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIHZvaWQgdGVzdFJlYWRBbmRXcml0ZVZhcmlhYmxlKCkgeworICAgICAgICBkZWYgc2hlbGwgPSBuZXcgR3Jvb3Z5U2hlbGwoKQorICAgICAgICAKKyAgICAgICAgc2hlbGwuZm9vID0gMQorICAgICAgICAKKyAgICAgICAgZGVmIHZhbHVlID0gc2hlbGwuZXZhbHVhdGUoIiIiCitwcmludGxuKCdmb28gaXMgY3VycmVudGx5ICcgKyBmb28pCitmb28gPSAyIAorcHJpbnRsbignZm9vIGlzIG5vdyAnICsgZm9vKSAgICAgICAgICAgICAgICAKK3JldHVybiBmb28KKyIiIiwgIkR1bW15MS5ncm9vdnkiKQorCisgICAgICAgIAorICAgICAgICBhc3NlcnQgdmFsdWUgPT0gMgorICAgICAgICBhc3NlcnQgc2hlbGwuZm9vID09IDIgLCAiVmFsdWUgaXMgbm93ICR7c2hlbGwuZm9vfSIKKwl9CisgICAgCisgICAgdm9pZCB0ZXN0RGVmaW5lTmV3VmFyaWFibGUoKSB7CisgICAgICAgIGRlZiBzaGVsbCA9IG5ldyBHcm9vdnlTaGVsbCgpCisgICAgICAgIAorICAgICAgICBkZWYgdmFsdWUgPSBzaGVsbC5ldmFsdWF0ZSggIiIiCitiYXIgPSAzIAorcHJpbnRsbignYmFyIGlzIG5vdyAnICsgYmFyKSAgICAgICAgICAgICAgICAKK3JldHVybiBiYXIKKyIiIiwgIkR1bW15Mi5ncm9vdnkiKQorCisgICAgICAgIAorICAgICAgICBhc3NlcnQgdmFsdWUgPT0gMworICAgICAgICBhc3NlcnQgc2hlbGwuYmFyID09IDMgLCAiVmFsdWUgaXMgbm93ICR7c2hlbGwuYmFyfSIKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9TaW1wbGVHU3RyaW5nVGVtcGxhdGVFbmdpbmVUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvU2ltcGxlR1N0cmluZ1RlbXBsYXRlRW5naW5lVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA4YWFhYwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvU2ltcGxlR1N0cmluZ1RlbXBsYXRlRW5naW5lVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwyNiBAQAorcGFja2FnZSBncm9vdnk7CisKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKKworaW1wb3J0IGdyb292eS50ZXh0LlRlbXBsYXRlOworaW1wb3J0IGdyb292eS50ZXh0LkdTdHJpbmdUZW1wbGF0ZUVuZ2luZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKKy8qKgorICogQGF1dGhvciBhbmR5CisgKiBAc2luY2UgSmFuIDExLCAyMDA2IDE6MDU6MjMgUE0KKyAqLworcHVibGljIGNsYXNzIFNpbXBsZUdTdHJpbmdUZW1wbGF0ZUVuZ2luZVRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZQoreworICBwdWJsaWMgdm9pZCB0ZXN0UmVncmVzc2lvbkNvbW1lbnRCdWcoKSB0aHJvd3MgRXhjZXB0aW9uCisgIHsKKyAgICBmaW5hbCBUZW1wbGF0ZSB0ZW1wbGF0ZSA9IG5ldyBHU3RyaW5nVGVtcGxhdGVFbmdpbmUoKS5jcmVhdGVUZW1wbGF0ZSgKKyAgICAgICAgIjwlIC8vIFRoaXMgaXMgYSBjb21tZW50IHRoYXQgd2lsbCBiZSBmaWx0ZXJlZCBmcm9tIG91dHB1dCAlPlxuIiArCisgICAgICAgICJIZWxsbyBXb3JsZCEiCisgICAgKTsKKworICAgIGZpbmFsIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICB0ZW1wbGF0ZS5tYWtlKCkud3JpdGVUbyhzdyk7CisgICAgYXNzZXJ0RXF1YWxzKCJcbkhlbGxvIFdvcmxkISIsIHN3LnRvU3RyaW5nKCkpOworICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1NpbXBsZVBvc3RmaXhUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvU2ltcGxlUG9zdGZpeFRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MDRkYmYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1NpbXBsZVBvc3RmaXhUZXN0Lmdyb292eQpAQCAtMCwwICsxLDEzIEBACitwYWNrYWdlIGdyb292eQorCitjbGFzcyBTaW1wbGVQb3N0Zml4VGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIHZvaWQgdGVzdFBvc3RmaXgoKSB7CisgICAgICAgIGRlZiB4ID0gMQorICAgICAgICArK3gKKyAgICAgICAgcHJpbnRsbih4KQorCisgICAgICAgIGFzc2VydCB4ID09IDIKKyAgICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1NpbmdsZXRvbkJ1Z1Rlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9TaW5nbGV0b25CdWdUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWNhY2ExCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9TaW5nbGV0b25CdWdUZXN0Lmdyb292eQpAQCAtMCwwICsxLDk5IEBACitwYWNrYWdlIGdyb292eQorLy8gVE9ETzogR1JPT1ZZLTQzNQorCitjbGFzcyBTaW5nbGV0b25CdWdUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgcHVibGljIHZvaWQgdGVzdFByaXZhdGUoKSB7CisgICAgICAgIGRlZiB4ID0gU2luZ2xldG9uQnVnUHJpdmF0ZS5nZXRJbnN0YW5jZSgpCisgICAgICAgIGRlZiB5ID0gU2luZ2xldG9uQnVnUHJpdmF0ZS5nZXRJbnN0YW5jZSgpCisgICAgICAgIHByaW50bG4gIkdldCBvbmUgcHJpdmF0ZSBpbnN0YW5jZTogJHgiCisgICAgICAgIHByaW50bG4gIkdldCBhbm90aGVyIHByaXZhdGUgaW5zdGFuY2U6ICR5IgorICAgICAgICBhc3NlcnQgeCA9PSB5CisKKyAgICAgICAgIHByaW50bG4oU2luZ2xldG9uQnVnUHJpdmF0ZVNlY29uZC5nZXRJbnN0YW5jZVNlY29uZCgpKQorICAgICAgICAgcHJpbnRsbihTaW5nbGV0b25CdWdQcml2YXRlU2Vjb25kLmRvVGVzdFNlY29uZCgpKQorICAgICAgICAvLyBzaG91bGRGYWlsIHsgcHJpbnRsbihTaW5nbGV0b25CdWdQcml2YXRlU2Vjb25kLmdldEluc3RhbmNlU2Vjb25kKCkpIH0KKyAgICAgICAgLy8gc2hvdWxkRmFpbCB7IHByaW50bG4oU2luZ2xldG9uQnVnUHJpdmF0ZVNlY29uZC5kb1Rlc3RTZWNvbmQoKSkgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQcm90ZWN0ZWQoKSB7CisgICAgICAgIGRlZiB4ID0gU2luZ2xldG9uQnVnUHJvdGVjdGVkLmdldEluc3RhbmNlKCkKKyAgICAgICAgZGVmIHkgPSBTaW5nbGV0b25CdWdQcm90ZWN0ZWQuZ2V0SW5zdGFuY2UoKQorICAgICAgICBwcmludGxuICJHZXQgb25lIHByb3RlY3RlZCBpbnN0YW5jZTogJHgiCisgICAgICAgIHByaW50bG4gIkdldCBhbm90aGVyIHByb3RlY3RlZCBpbnN0YW5jZTogJHkiCisgICAgICAgIGFzc2VydCB4ID09IHkKKworICAgICAgICBwcmludGxuKFNpbmdsZXRvbkJ1Z1Byb3RlY3RlZFNlY29uZC5nZXRJbnN0YW5jZVNlY29uZCgpKQorICAgICAgICBwcmludGxuKFNpbmdsZXRvbkJ1Z1Byb3RlY3RlZFNlY29uZC5kb1Rlc3RTZWNvbmQoKSkKKyAgICAgICAgeCA9IFNpbmdsZXRvbkJ1Z1Byb3RlY3RlZFNlY29uZC5nZXRJbnN0YW5jZVNlY29uZCgpCisgICAgICAgIHkgPSBTaW5nbGV0b25CdWdQcm90ZWN0ZWRTZWNvbmQuZG9UZXN0U2Vjb25kKCkKKyAgICAgICAgYXNzZXJ0IHggIT0geQorICAgIH0KKworfQorCisKK2NsYXNzIFNpbmdsZXRvbkJ1Z1ByaXZhdGUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgU2luZ2xldG9uQnVnUHJpdmF0ZSBpbnN0YW5jZTEgPSBudWxsCisKKyAgICBwcml2YXRlIFNpbmdsZXRvbkJ1Z1ByaXZhdGUoKSB7CisgICAgfQorICAgIAorICAgIHN0YXRpYyBTaW5nbGV0b25CdWdQcml2YXRlIGdldEluc3RhbmNlKCkgeworICAgICAgICBpZiAoaW5zdGFuY2UxID09IG51bGwpCisgICAgICAgICAgICBpbnN0YW5jZTEgPSBuZXcgU2luZ2xldG9uQnVnUHJpdmF0ZSgpCisgICAgICAgIHJldHVybiBpbnN0YW5jZTEKKyAgICB9CisgICAgCisgICAgLy8gcHJpdmF0ZSBzdGF0aWMgU2luZ2xldG9uQnVnUHJpdmF0ZSBnZXRJbnN0YW5jZTIoKSB7CisgICAgLy8gICAgIGlmIChpbnN0YW5jZTEgPT0gbnVsbCkKKyAgICAvLyAgICAgICAgIGluc3RhbmNlMSA9IG5ldyBTaW5nbGV0b25CdWdQcml2YXRlKCkKKyAgICAvLyAgICAgcmV0dXJuIGluc3RhbmNlMQorICAgIC8vIH0KK30KKworCitjbGFzcyBTaW5nbGV0b25CdWdQcm90ZWN0ZWQgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgU2luZ2xldG9uQnVnUHJvdGVjdGVkIGluc3RhbmNlMSA9IG51bGwKKworICAgIHByb3RlY3RlZCBTaW5nbGV0b25CdWdQcm90ZWN0ZWQoKSB7CisgICAgfQorICAgIAorICAgIHN0YXRpYyBTaW5nbGV0b25CdWdQcm90ZWN0ZWQgZ2V0SW5zdGFuY2UoKSB7CisgICAgICAgIGlmIChpbnN0YW5jZTEgPT0gbnVsbCkKKyAgICAgICAgICAgIGluc3RhbmNlMSA9IG5ldyBTaW5nbGV0b25CdWdQcm90ZWN0ZWQoKQorICAgICAgICByZXR1cm4gaW5zdGFuY2UxCisgICAgfQorICAgIAorICAgIC8vIHByaXZhdGUgc3RhdGljIFNpbmdsZXRvbkJ1Z1Byb3RlY3RlZCBnZXRJbnN0YW5jZTIoKSB7CisgICAgLy8gICAgIGlmIChpbnN0YW5jZTEgPT0gbnVsbCkKKyAgICAvLyAgICAgICAgIGluc3RhbmNlMSA9IG5ldyBTaW5nbGV0b25CdWdQcm90ZWN0ZWQoKQorICAgIC8vICAgICByZXR1cm4gaW5zdGFuY2UxCisgICAgLy8gfQorfQorCisKK2NsYXNzIFNpbmdsZXRvbkJ1Z1ByaXZhdGVTZWNvbmQgZXh0ZW5kcyBTaW5nbGV0b25CdWdQcml2YXRlIHsKKworICAgIHN0YXRpYyBTaW5nbGV0b25CdWdQcml2YXRlIGdldEluc3RhbmNlU2Vjb25kKCkgeworICAgICAgICByZXR1cm4gZG9UZXN0U2Vjb25kKCkKKyAgICB9CisKKyAgICBzdGF0aWMgU2luZ2xldG9uQnVnUHJpdmF0ZSBkb1Rlc3RTZWNvbmQoKSB7CisgICAgICAgIHJldHVybiBuZXcgU2luZ2xldG9uQnVnUHJpdmF0ZSgpCisgICAgfQorfQorCisKK2NsYXNzIFNpbmdsZXRvbkJ1Z1Byb3RlY3RlZFNlY29uZCBleHRlbmRzIFNpbmdsZXRvbkJ1Z1Byb3RlY3RlZCB7CisKKyAgICBzdGF0aWMgU2luZ2xldG9uQnVnUHJvdGVjdGVkIGdldEluc3RhbmNlU2Vjb25kKCkgeworICAgICAgICByZXR1cm4gZG9UZXN0U2Vjb25kKCkKKyAgICB9CisKKyAgICBzdGF0aWMgU2luZ2xldG9uQnVnUHJvdGVjdGVkIGRvVGVzdFNlY29uZCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTaW5nbGV0b25CdWdQcm90ZWN0ZWQoKQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvU2xpY2VUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvU2xpY2VUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODA5MzA3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9TbGljZVRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTYgQEAKK3BhY2thZ2UgZ3Jvb3Z5CisKK2NsYXNzIFNsaWNlVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIHZvaWQgdGVzdExpc3RTbGljZSgpIHsKKyAgICAgICAgZGVmIGxpc3QgPSBbMSwgMiwgMywgNF0KKyAgICAgICAgbGlzdFsxLDJdID0gNQorCisgICAgICAgIGFzc2VydCBsaXN0ID09IFsxLCA1LCA0XQorCisgICAgICAgIGxpc3RbMCwxXSA9IFs1LCA2LCA3LCA4LCA5XQorCisgICAgICAgIGFzc2VydCBsaXN0ID09IFs1LCA2LCA3LCA4LCA5LCA0XQorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9Tb2NrZXRUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvU29ja2V0VGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZkMzg0NAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvU29ja2V0VGVzdC5ncm9vdnkKQEAgLTAsMCArMSw3OCBAQAorcGFja2FnZSBncm9vdnkKKy8qKgorICogY2hlY2sgdGhhdCBncm9vdnkgU29ja2V0IG1ldGhvZHMgZG8gdGhlaXIgam9iLgorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmplcmVteS5yYXluZXJAYmlnZm9vdC5jb20iPkplcmVteSBSYXluZXI8L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KKworY2xhc3MgU29ja2V0VGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKyAgICBkZWYgbXlTb2NrZXQKKyAgICAKKyAgICB2b2lkIHNldFVwKCkgeworICAgICAgICBteVNvY2tldCA9IG5ldyBNb2NrU29ja2V0KCkKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0U29ja2V0QXBwZW5kQnl0ZXMoKSB7CisgICAgICAgIGRlZiBteUJ5dGVzID0gIm1vb2t5Ii5nZXRCeXRlcygpCisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgbXlTb2NrZXQgPDwgbXlCeXRlcworICAgICAgICAgICAgICAgICAgCisgICAgICAgIGRlZiByZXN1bHQgPSBteVNvY2tldC5vdXRwdXRTdHJlYW0udG9CeXRlQXJyYXkoKQorICAgICAgICBhc3NlcnQgcmVzdWx0ICE9IG51bGwKKyAgICAgICAgYXNzZXJ0IEFycmF5cy5lcXVhbHMobXlCeXRlcyxyZXN1bHQpCisgICAgfQorICAgIHZvaWQgdGVzdFNvY2tldEFwcGVuZFR3b0J5dGVBcnJheXMoKSB7CisgICAgICAgIGRlZiBteUJ5dGVzMSA9ICJmb28iLmdldEJ5dGVzKCkKKyAgICAgICAgZGVmIG15Qnl0ZXMyID0gImJhciIuZ2V0Qnl0ZXMoKQorICAgICAgICAgICAgICAgICAgCisgICAgICAgIG15U29ja2V0IDw8IG15Qnl0ZXMxIDw8IG15Qnl0ZXMyCisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgZGVmIHJlc3VsdCA9IG15U29ja2V0Lm91dHB1dFN0cmVhbS50b0J5dGVBcnJheSgpCisgICAgICAgIGFzc2VydCByZXN1bHQgIT0gbnVsbAorICAgICAgICBhc3NlcnQgcmVzdWx0LnNpemUoKSA9PSBteUJ5dGVzMS5zaXplKCkgKyBteUJ5dGVzMi5zaXplKCkgICAgICAgICAgCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdFNvY2tldEFwcGVuZCgpIHsKKyAgICAgICAgbXlTb2NrZXQgPDwgIm1vb2t5IgorICAgICAgICBhc3NlcnQgIm1vb2t5IiA9PSBteVNvY2tldC5vdXRwdXRTdHJlYW0udG9TdHJpbmcoKQorICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RTb2NrZXRXaXRoU3RyZWFtc0Nsb3N1cmUoKSB7CisgICAgICAgIG15U29ja2V0LndpdGhTdHJlYW1zIHtpLG8tPgorICAgICAgICAgICAgYXNzZXJ0IGkgaW5zdGFuY2VvZiBJbnB1dFN0cmVhbQorICAgICAgICAgICAgYXNzZXJ0IGkgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgYXNzZXJ0IG8gaW5zdGFuY2VvZiBPdXRwdXRTdHJlYW0gICAgICAgICAgCisgICAgICAgICAgICBhc3NlcnQgbyAhPSBudWxsICAgICAgICAgIAorICAgICAgICB9CisgICAgfQorICAgIAorICAgIHZvaWQgdGVhckRvd24oKSB7CisgICAgICAgIG15U29ja2V0LmNsb3NlKCkKKyAgICB9Cit9CisKKy8qKgorICogc2ltcGxlLCB1bmNvbm5lY3RlZCBTb2NrZXQsIHVzZWQgcHVyZWx5IGZvciB0ZXN0IGNhc2VzCisgKi8KK2NsYXNzIE1vY2tTb2NrZXQgZXh0ZW5kcyBTb2NrZXQgeworICAgIHByaXZhdGUgZGVmIGkKKyAgICBwcml2YXRlIGRlZiBvCisKKyAgICBwdWJsaWMgTW9ja1NvY2tldCgpIHsKKyAgICAgICAgaSA9IG5ldyBNb2NrSW5wdXRTdHJlYW0oKQorICAgICAgICBvID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpCisgICAgfQorCisgICAgcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgeyByZXR1cm4gaSB9CisgICAgcHVibGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKSB7IHJldHVybiBvIH0KK30KKworLyoqCisgKiBvbmx5IG5lZWRlZCBmb3Igd29ya2Fyb3VuZCBpbiBncm9vdnksIAorICogICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShteUJ5dGVBcnJheSkgZG9lc24ndCB3b3JrIGF0IG1vLi4uICgyOC1TZXAtMjAwNCkKKyAqLworY2xhc3MgTW9ja0lucHV0U3RyZWFtIGV4dGVuZHMgSW5wdXRTdHJlYW0geworICAgIGludCByZWFkKCkgeyByZXR1cm4gLTEgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9Tb21lQ2xhc3MuamF2YSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvU29tZUNsYXNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI3NjRiZAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvU29tZUNsYXNzLmphdmEKQEAgLTAsMCArMSwxOCBAQAorcGFja2FnZSBncm9vdnk7CisKKy8qKgorICogQXJiaXRyYXJ5IGhvbGRlciBmb3IgSmF2YSBNZXRob2RzIHRvIGJlIGNhbGxlZCBieSBHcm9vdnkgVGVzdENhc2VzLgorICoKKyAqIEBhdXRob3IgRGllcmsgS29lbmlnCisgKi8KKworcHVibGljIGNsYXNzIFNvbWVDbGFzcyB7CisgICAgLy8gY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQgdG8gYmUgY2FsbGVkIGZyb20gR3Jvb3Z5CisgICAgcHVibGljIFN0cmluZ1tdW10gYW5BcnJheU9mU3RyaW5nQXJyYXlzKCkgeworICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdW117eyJ3aGF0ZXZlciJ9fTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0W10gYW5BcnJheU9mU3RyaW5nQXJyYXlzV29ya2Fyb3VuZCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbXXtuZXcgU3RyaW5nW117IndoYXRldmVyIiwgbnVsbH19OworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1NvcnRUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvU29ydFRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MWEwYTkKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1NvcnRUZXN0Lmdyb292eQpAQCAtMCwwICsxLDcyIEBACitwYWNrYWdlIGdyb292eQorCisvKiogCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitjbGFzcyBTb3J0VGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIC8vIEdST09WWS0xOTU2CisgICAgdm9pZCB0ZXN0U29ydFdpdGhOdWxsKCkgeworICAgICAgICAvLyBub3JtYWwgY2FzZSwgc2hvdWxkIHNvcnQgaW4gcGxhY2UgYW5kIHJldHVybiByZXN1bHQKKyAgICAgICAgZGVmIHggPSBbMSwgMiwgMywgMSwgMiwgMywgbnVsbCwgJ2EnLCBudWxsXQorICAgICAgICBhc3NlcnQgeC5pcyh4LnNvcnQoKSkKKyAgICAgICAgZGVmIHkgPSB4LnNvcnQoKQorICAgICAgICBhc3NlcnQgKHkgPT0geCAmJiB4ID09IFtudWxsLCBudWxsLCAxLCAxLCAyLCAyLCAzLCAzLCAnYSddKQorCisgICAgICAgIC8vIHRyYW5zaXRpdml0eQorICAgICAgICB4ID0gWzEsIDIsIDMsIDEsIDIsIDMsIG51bGwsICdhJywgbnVsbF0KKyAgICAgICAgeC51bmlxdWUoKS5zb3J0KCkKKyAgICAgICAgeSA9IFsxLCAyLCAzLCAxLCAyLCAzLCBudWxsLCAnYScsIG51bGxdCisgICAgICAgIHkuc29ydCgpLnVuaXF1ZSgpCisgICAgICAgIGFzc2VydCAoeCA9PSB5ICYmIHkgPT0gW251bGwsIDEsIDIsIDMsICdhJ10pCisgICAgfQorCisgICAgdm9pZCB0ZXN0U29ydFdpdGhPcmRlckJ5KCkgeworICAgICAgICBkZWYgbGlzdCA9IGdldFBlb3BsZSgpCisgICAgICAgIGRlZiBvcmRlciA9IG5ldyBPcmRlckJ5KCB7IGl0LmNoZWVzZSB9ICkKKyAgICAgICAgbGlzdC5zb3J0KG9yZGVyKQorICAgICAgICBhc3NlcnQgbGlzdFswXS5uYW1lID09ICdKb2UnCisgICAgICAgIGFzc2VydCBsaXN0Wy0xXS5uYW1lID09ICdDaHJpcycKKyAgICAgICAgYXNzZXJ0IGxpc3QubmFtZSA9PSBbJ0pvZScsICdCb2InLCAnSmFtZXMnLCAnQ2hyaXMnXQorICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RTb3J0V2l0aENsb3N1cmUoKSB7CisgICAgICAgIGRlZiBsaXN0ID0gZ2V0UGVvcGxlKCkKKyAgICAgICAgbGlzdC5zb3J0IHsgaXQuY2hlZXNlIH0KKyAgICAgICAgYXNzZXJ0IGxpc3QubmFtZSA9PSBbJ0pvZScsICdCb2InLCAnSmFtZXMnLCAnQ2hyaXMnXQorICAgIH0KKworICAgIHZvaWQgdGVzdFNvcnRDbGFzc0hpZXJhcmNoeSgpIHsKKyAgICAgICAgZGVmIGFGb29MaXN0ID0gWworICAgICAgICAgICAgICAgIG5ldyBBRm9vKDUpLAorICAgICAgICAgICAgICAgIG5ldyBBRm9vKDcpLAorICAgICAgICAgICAgICAgIG5ldyBBQmFyKDQpLAorICAgICAgICAgICAgICAgIG5ldyBBQmFyKDYpCisgICAgICAgICAgICAgICAgXQorICAgICAgICBkZWYgc29ydGVkID0gYUZvb0xpc3Quc29ydCgpCisgICAgICAgIGFzc2VydCBzb3J0ZWQuY29sbGVjdHsgaXQuY2xhc3MgfSA9PSBbQUJhciwgQUZvbywgQUJhciwgQUZvb10KKyAgICAgICAgYXNzZXJ0IHNvcnRlZC5jb2xsZWN0eyBpdC5rZXkgfSA9PSAoNC4uNykudG9MaXN0KCkKKyAgICB9CisKKyAgICBkZWYgZ2V0UGVvcGxlKCkgeworICAgICAgICBkZWYgYW5zd2VyID0gW10KKyAgICAgICAgYW5zd2VyIDw8IG5ldyBFeHBhbmRvKG5hbWU6J0phbWVzJywgY2hlZXNlOidFZGFtJywgbG9jYXRpb246J0xvbmRvbicpCisgICAgICAgIGFuc3dlciA8PCBuZXcgRXhwYW5kbyhuYW1lOidCb2InLCBjaGVlc2U6J0NoZWRkYXInLCBsb2NhdGlvbjonQXRsYW50YScpCisgICAgICAgIGFuc3dlciA8PCBuZXcgRXhwYW5kbyhuYW1lOidDaHJpcycsIGNoZWVzZTonUmVkIExlaWNlc3RlcicsIGxvY2F0aW9uOidMb25kb24nKQorICAgICAgICBhbnN3ZXIgPDwgbmV3IEV4cGFuZG8obmFtZTonSm9lJywgY2hlZXNlOidCcmllJywgbG9jYXRpb246J0xvbmRvbicpCisgICAgICAgIHJldHVybiBhbnN3ZXIKKyAgICB9CisKK30KKworY2xhc3MgQUZvbyBpbXBsZW1lbnRzIENvbXBhcmFibGUgeworICAgIGludCBrZXkKKyAgICBBRm9vKGludCBrZXkpIHsgdGhpcy5rZXkgPSBrZXkgfQorICAgIGludCBjb21wYXJlVG8oT2JqZWN0IHJocykgeyBrZXkgLSByaHMua2V5IH0KKyAgICBTdHJpbmcgdG9TdHJpbmcoKSB7IHRoaXMuY2xhc3MubmFtZSArICI6ICIgKyBrZXkgfQorfQorCitjbGFzcyBBQmFyIGV4dGVuZHMgQUZvbyB7CisgICAgcHVibGljIEFCYXIoaW50IHgpIHtzdXBlcih4KX0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvU3ByZWFkRG90VGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1NwcmVhZERvdFRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNjZmMDAKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1NwcmVhZERvdFRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTI4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyBwYWNrYWdlIGdyb292eQorCisvKioKKyAqIFRlc3QgZm9yIHRoZSBzcHJlYWQgZG90IG9wZXJhdG9yICIqLiIuCisgKgorICogRm9yIGFuIGV4YW1wbGUsCisgKiAgICAgICAgICBsaXN0Ki5wcm9wZXJ0eQorICogbWVhbnMKKyAqICAgICAgICAgIGxpc3QuY29sbGVjdCB7IGl0Py5wcm9wZXJ0eSB9CisgKgorICogQGF1dGhvciAgUGlsaG8gS2ltCisgKiBAYXV0aG9yICBQYXVsIEtpbmcKKyAqLworcHVibGljIGNsYXNzIFNwcmVhZERvdFRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisgICAgcHVibGljIHZvaWQgdGVzdFNwcmVhZERvdCgpIHsKKyAgICAgICAgZGVmIG0xID0gWyJhIjoxLCAiYiI6Ml0KKyAgICAgICAgZGVmIG0yID0gWyJhIjoxMSwgImIiOjIyXQorICAgICAgICBkZWYgbTMgPSBbImEiOjExMSwgImIiOjIyMl0KKyAgICAgICAgZGVmIHggPSBbbTEsbTIsbTNdCisgICAgICAgIHByaW50bG4geCouYQorICAgICAgICBwcmludGxuIHgqLiJhIgorICAgICAgICBhc3NlcnQgeCA9PSBbbTEsIG0yLCBtM10KKworICAgICAgICBkZWYgbTQgPSBudWxsCisgICAgICAgIHggPDwgbTQKKyAgICAgICAgcHJpbnRsbiB4Ki5hCisgICAgICAgIHByaW50bG4geCouImEiCisgICAgICAgIGFzc2VydCB4ID09IFttMSwgbTIsIG0zLCBudWxsXQorCisgICAgICAgIGRlZiBkID0gbmV3IFNwcmVhZERvdERlbW8oKQorICAgICAgICB4IDw8IGQKKyAgICAgICAgcHJpbnRsbiB4Ki4iYSIKKyAgICAgICAgYXNzZXJ0IHggPT0gW20xLCBtMiwgbTMsIG51bGwsIGRdCisKKyAgICAgICAgZGVmIHkgPSBuZXcgU3ByZWFkRG90RGVtbzIoKQorICAgICAgICBwcmludGxuIHkuImEiCisgICAgICAgIHByaW50bG4geS5hCisKKyAgICAgICAgeCA8PCB5CisgICAgICAgIHByaW50bG4geCouImEiCisgICAgICAgIGFzc2VydCB4ID09IFttMSwgbTIsIG0zLCBudWxsLCBkLCB5XQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTcHJlYWREb3QyKCkgeworICAgICAgICBkZWYgYSA9IG5ldyBTcHJlYWREb3REZW1vKCkKKyAgICAgICAgZGVmIGIgPSBuZXcgU3ByZWFkRG90RGVtbzIoKQorICAgICAgICBkZWYgeCA9IFthLCBiXQorCisgICAgICAgIGFzc2VydCB4Ki5mbkIoIjEiKSA9PSBbYS5mbkIoIjEiKSwgYi5mbkIoIjEiKV0KKyAgICAgICAgYXNzZXJ0IFthLGJdKi5mbkIoKSA9PSBbYS5mbkIoKSwgYi5mbkIoKV0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3ByZWFkRG90QXJyYXlzKCkgeworICAgICAgICBkZWYgYSA9IG5ldyBTcHJlYWREb3REZW1vKCkKKyAgICAgICAgZGVmIGIgPSBuZXcgU3ByZWFkRG90RGVtbzIoKQorICAgICAgICBPYmplY3RbXSB4ID0gW2EsIGJdCisKKyAgICAgICAgYXNzZXJ0IHgqLmZuQigiMSIpID09IFthLmZuQigiMSIpLCBiLmZuQigiMSIpXQorICAgICAgICBhc3NlcnQgW2EsYl0qLmZuQigpID09IFthLmZuQigpLCBiLmZuQigpXQorCisgICAgICAgIGludFtdIG51bXMgPSBbMywgNCwgNV0KKyAgICAgICAgYXNzZXJ0IG51bXMqLnRvU3RyaW5nKCkgPT0gWyczJywgJzQnLCAnNSddCisKKyAgICAgICAgYm9vbGVhbltdIGFuc3dlcnMgPSBbdHJ1ZSwgZmFsc2UsIHRydWVdCisgICAgICAgIGFzc2VydCBhbnN3ZXJzKi50b1N0cmluZygpID09IFsndHJ1ZScsICdmYWxzZScsICd0cnVlJ10KKworICAgICAgICBTdHJpbmdbXSBwZXRzID0gWydhbnQnLCAnYmVhcicsICdjYW1lbCddCisgICAgICAgIGFzc2VydCBwZXRzKi5sZW5ndGgoKSA9PSBudW1zCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNwcmVhZERvdE9uQXJyYXlzMiAoKSB7CisgICAgICAgIGRlZiBib29rcyA9IFtCb29rMSwgQm9vazIsIEJvb2szXSBhcyBPYmplY3RbXQorCisgICAgICAgIGJvb2tzKi5tZXRhQ2xhc3MqLmZvbyA9IHsgIkhlbGxvLCAke2RlbGVnYXRlLmNsYXNzLm5hbWV9IiB9CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzICJIZWxsbywgZ3Jvb3Z5LkJvb2sxIiwgbmV3IEJvb2sxICgpLmZvbyAoKQorICAgICAgICBhc3NlcnRFcXVhbHMgIkhlbGxvLCBncm9vdnkuQm9vazIiLCBuZXcgQm9vazIgKCkuZm9vICgpCisgICAgICAgIGFzc2VydEVxdWFscyAiSGVsbG8sIGdyb292eS5Cb29rMyIsIG5ldyBCb29rMyAoKS5mb28gKCkKKyAgICB9Cit9CisKK2NsYXNzIFNwcmVhZERvdERlbW8geworICAgIHB1YmxpYyBqYXZhLnV0aWwuRGF0ZSBnZXRBKCkgeworICAgICAgICByZXR1cm4gbmV3IERhdGUoKQorICAgIH0KKyAgICBwdWJsaWMgU3RyaW5nIGZuQigpIHsKKyAgICAgICAgcmV0dXJuICJiYiIKKyAgICB9CisgICAgcHVibGljIFN0cmluZyBmbkIoU3RyaW5nIG0pIHsKKyAgICAgICAgcmV0dXJuICJCQiRtIgorICAgIH0KK30KKworY2xhc3MgU3ByZWFkRG90RGVtbzIgeworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKFN0cmluZyBrZXkpIHsKKyAgICAgICAgcmV0dXJuICJBdHRyaWJ1dGUgJGtleSIKKyAgICB9CisgICAgcHVibGljIFN0cmluZyBnZXQoU3RyaW5nIGtleSkgeworICAgICAgICByZXR1cm4gZ2V0QXR0cmlidXRlKCJHZXQgJGtleSIpCisgICAgfQorICAgIHB1YmxpYyBTdHJpbmcgZm5CKCkgeworICAgICAgICByZXR1cm4gImNjIgorICAgIH0KKyAgICBwdWJsaWMgU3RyaW5nIGZuQihTdHJpbmcgbSkgeworICAgICAgICByZXR1cm4gIkNDJG0iCisgICAgfQorfQorCisKK2NsYXNzIEJvb2sxIHt9CitjbGFzcyBCb29rMiB7fQorY2xhc3MgQm9vazMge30KKwpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9TcWxEYXRlVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1NxbERhdGVUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWVjODczCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9TcWxEYXRlVGVzdC5ncm9vdnkKQEAgLTAsMCArMSw2MSBAQAorcGFja2FnZSBncm9vdnk7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuVGltZUNhdGVnb3J5CisKK2NsYXNzIFNxbERhdGVUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCB0ZXN0SW5jcmVtZW50KCkgeworICAgICAgICBkZWYgbm93TWlsbGlzID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkKKyAgICAgICAgZGVmIHNxbERhdGUgPSBuZXcgamF2YS5zcWwuRGF0ZShub3dNaWxsaXMpCisgICAgICAgIGRlZiBub3dPZmZzZXQgPSBUaW1lQ2F0ZWdvcnkuZ2V0RGF5bGlnaHRTYXZpbmdzT2Zmc2V0KHNxbERhdGUpLnRvTWlsbGlzZWNvbmRzKCkKKyAgICAgICAgc3FsRGF0ZSsrCisgICAgICAgIGRlZiBpbmNPZmZzZXQgPSBUaW1lQ2F0ZWdvcnkuZ2V0RGF5bGlnaHRTYXZpbmdzT2Zmc2V0KHNxbERhdGUpLnRvTWlsbGlzZWNvbmRzKCkKKyAgICAgICAgYXNzZXJ0VHJ1ZSAiaW5jcmVtZW50aW5nIGEgamF2YS5zcWwuRGF0ZSByZXR1cm5lZCBhbiBpbmNvcnJlY3QgdHlwZTogJHtzcWxEYXRlLmNsYXNzfSIsIHNxbERhdGUgaW5zdGFuY2VvZiBqYXZhLnNxbC5EYXRlCisKKyAgICAgICAgLy8gZGlmZmVyZW5jZSBhZGp1c3RlZCBmb3IgZGF5bGlnaHQgc2F2aW5ncworICAgICAgICBkZWYgZGlmZiA9IChzcWxEYXRlLmdldFRpbWUoKSArIGluY09mZnNldCkgLSAobm93TWlsbGlzICsgbm93T2Zmc2V0KQorICAgICAgICBhc3NlcnRFcXVhbHMgImluY3JlbWVudGluZyBhIGphdmEuc3FsLkRhdGUgZGlkIG5vdCB3b3JrIHByb3Blcmx5IiwgMTAwMCAqIDYwICogNjAgKiAyNCwgZGlmZgorICAgIH0KKworICAgICAgdm9pZCB0ZXN0RGVjcmVtZW50KCkgeworICAgICAgICBkZWYgbm93TWlsbGlzID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkKKyAgICAgICAgZGVmIHNxbERhdGUgPSBuZXcgamF2YS5zcWwuRGF0ZShub3dNaWxsaXMpCisgICAgICAgIGRlZiBub3dPZmZzZXQgPSBUaW1lQ2F0ZWdvcnkuZ2V0RGF5bGlnaHRTYXZpbmdzT2Zmc2V0KHNxbERhdGUpLnRvTWlsbGlzZWNvbmRzKCkKKyAgICAgICAgc3FsRGF0ZS0tCisgICAgICAgIGRlZiBkZWNPZmZzZXQgPSBUaW1lQ2F0ZWdvcnkuZ2V0RGF5bGlnaHRTYXZpbmdzT2Zmc2V0KHNxbERhdGUpLnRvTWlsbGlzZWNvbmRzKCkKKyAgICAgICAgYXNzZXJ0VHJ1ZSAiZGVjcmVtZW50aW5nIGEgamF2YS5zcWwuRGF0ZSByZXR1cm5lZCBhbiBpbmNvcnJlY3QgdHlwZTogJHtzcWxEYXRlLmNsYXNzfSIsIHNxbERhdGUgaW5zdGFuY2VvZiBqYXZhLnNxbC5EYXRlCisgICAgICAgIAorICAgICAgICAvLyBkaWZmZXJlbmNlIGFkanVzdGVkIGZvciBkYXlsaWdodCBzYXZpbmdzCisgICAgICAgIGRlZiBkaWZmID0gKG5vd01pbGxpcyArIG5vd09mZnNldCkgLSAoc3FsRGF0ZS5nZXRUaW1lKCkgKyBkZWNPZmZzZXQpCisKKyAgICAgICAgYXNzZXJ0RXF1YWxzICJkZWNyZW1lbnRpbmcgYSBqYXZhLnNxbC5EYXRlIGRpZCBub3Qgd29yayBwcm9wZXJseSIsIDEwMDAgKiA2MCAqIDYwICogMjQsIGRpZmYKKyAgICB9CisgICAgICAKKyAgICB2b2lkIHRlc3RQbHVzT3BlcmF0b3IoKSB7CisgICAgICAgIGRlZiBub3dNaWxsaXMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKQorICAgICAgICBkZWYgc3FsRGF0ZSA9IG5ldyBqYXZhLnNxbC5EYXRlKG5vd01pbGxpcykKKyAgICAgICAgZGVmIG5vd09mZnNldCA9IFRpbWVDYXRlZ29yeS5nZXREYXlsaWdodFNhdmluZ3NPZmZzZXQoc3FsRGF0ZSkudG9NaWxsaXNlY29uZHMoKQorICAgICAgICBzcWxEYXRlICs9IDEKKyAgICAgICAgZGVmIGluY09mZnNldCA9IFRpbWVDYXRlZ29yeS5nZXREYXlsaWdodFNhdmluZ3NPZmZzZXQoc3FsRGF0ZSkudG9NaWxsaXNlY29uZHMoKQorCisgICAgICAgIGFzc2VydFRydWUgICJ0aGUgcGx1cyBvcGVyYXRvciBhcHBsaWVkIHRvIGEgamF2YS5zcWwuRGF0ZSByZXR1cm5lZCBhbiBpbmNvcnJlY3QgdHlwZTogJHtzcWxEYXRlLmNsYXNzfSIsIHNxbERhdGUgaW5zdGFuY2VvZiBqYXZhLnNxbC5EYXRlCisgICAgICAgIAorICAgICAgICAvLyBkaWZmZXJlbmNlIGFkanVzdGVkIGZvciBkYXlsaWdodCBzYXZpbmdzCisgICAgICAgIGRlZiBkaWZmID0gKHNxbERhdGUuZ2V0VGltZSgpICsgaW5jT2Zmc2V0KSAtIChub3dNaWxsaXMgKyBub3dPZmZzZXQpCisgICAgICAgIGFzc2VydEVxdWFscyAiZGVjcmVtZW50aW5nIGEgamF2YS5zcWwuRGF0ZSBkaWQgbm90IHdvcmsgcHJvcGVybHkiLCAxMDAwICogNjAgKiA2MCAqIDI0LCBkaWZmCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdE1pbnVzT3BlcmF0b3IoKSB7CisgICAgICAgIGRlZiBub3dNaWxsaXMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKQorICAgICAgICBkZWYgc3FsRGF0ZSA9IG5ldyBqYXZhLnNxbC5EYXRlKG5vd01pbGxpcykKKyAgICAgICAgZGVmIG5vd09mZnNldCA9IFRpbWVDYXRlZ29yeS5nZXREYXlsaWdodFNhdmluZ3NPZmZzZXQoc3FsRGF0ZSkudG9NaWxsaXNlY29uZHMoKQorICAgICAgICBzcWxEYXRlIC09IDEKKyAgICAgICAgZGVmIGRlY09mZnNldCA9IFRpbWVDYXRlZ29yeS5nZXREYXlsaWdodFNhdmluZ3NPZmZzZXQoc3FsRGF0ZSkudG9NaWxsaXNlY29uZHMoKQorCisgICAgICAgIGFzc2VydFRydWUgICJ0aGUgbWludXMgb3BlcmF0b3IgYXBwbGllZCB0byBhIGphdmEuc3FsLkRhdGUgcmV0dXJuZWQgYW4gaW5jb3JyZWN0IHR5cGU6ICR7c3FsRGF0ZS5jbGFzc30iLCBzcWxEYXRlIGluc3RhbmNlb2YgamF2YS5zcWwuRGF0ZQorICAgICAgICAKKyAgICAgICAgLy8gZGlmZmVyZW5jZSBhZGp1c3RlZCBmb3IgZGF5bGlnaHQgc2F2aW5ncworICAgICAgICBkZWYgZGlmZiA9IChub3dNaWxsaXMgKyBub3dPZmZzZXQpIC0gKHNxbERhdGUuZ2V0VGltZSgpICsgZGVjT2Zmc2V0KQorICAgICAgICBhc3NlcnRFcXVhbHMgImRlY3JlbWVudGluZyBhIGphdmEuc3FsLkRhdGUgZGlkIG5vdCB3b3JrIHByb3Blcmx5IiwgMTAwMCAqIDYwICogNjAgKiAyNCwgZGlmZgorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvU3RhY2tUcmFjZVRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9TdGFja1RyYWNlVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlmNGQwMAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvU3RhY2tUcmFjZVRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMzMgQEAKK3BhY2thZ2UgZ3Jvb3Z5CisKKy8qKgorKiBUaGlzIHRlc3QgY2FzZSBpcyBhZGRlZCB0byBlbnN1cmUgYW4gZXhjZXB0aW9uIHRocm93biBmcm9tIGluc2lkZQorKiBncm9vdnkgZG9lcyBhbHdheXMgY29udGFpbiBhIHZhbGlkIGxpbmUgbnVtYmVyIGFuZCBmaWxlIG5hbWUgZm9yCisqIHRoZSBzY3JpcHQgbWV0aG9kIHRoZSBleGNlcHRpb24gaXMgdGhyb3duIGZyb20uCisqCisqIFNlZSBhbHNvIEdST09WWS03MjYKKyovCitjbGFzcyBTdGFja1RyYWNlVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworCisJcHVibGljIHZvaWQgdGVzdFRyYWNlKCkgeworCQlkZWYgY2xhc3NOYW1lID0gdGhpcy5jbGFzcy5uYW1lCisJCWRlZiBhc3NlcnREb25lID0gZmFsc2UJCisJCXRyeSB7CisJCSAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiZSIpCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCSAgYXNzZXJ0IGUubWVzc2FnZSA9PSAiZSIKKwkJICBkZWYgdHJhY2UgPSBlLnN0YWNrVHJhY2UKKwkJICB0cmFjZS5lYWNoIHsKKwkJICAgIGlmIChpdC5jbGFzc05hbWUgPT0gY2xhc3NOYW1lICYmIGl0Lm1ldGhvZE5hbWUgPT0gInRlc3RUcmFjZSIpIHsKKwkJICAgICAgYXNzZXJ0IGl0LmxpbmVOdW1iZXI+MAorCQkgICAgICBhc3NlcnQgaXQuZmlsZU5hbWUgIT0gbnVsbAorCQkgICAgICBhc3NlcnQgaXQuZmlsZU5hbWUubGVuZ3RoKCkgPiAwCisJCSAgICAgIGFzc2VydERvbmUgPSB0cnVlCisJCSAgICB9CisJCSAgfQorCQl9CisJCWFzc2VydCBhc3NlcnREb25lPT10cnVlCisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9TdGF0aWNBbmREZWZhdWx0S2V5d29yZHNJblByb3BlcnR5TmFtZXNUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvU3RhdGljQW5kRGVmYXVsdEtleXdvcmRzSW5Qcm9wZXJ0eU5hbWVzVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRmYTQ0NgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvU3RhdGljQW5kRGVmYXVsdEtleXdvcmRzSW5Qcm9wZXJ0eU5hbWVzVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwyNSBAQAorcGFja2FnZSBncm9vdnkNCisNCitjbGFzcyBTdGF0aWNBbmREZWZhdWx0S2V5d29yZHNJblByb3BlcnR5TmFtZXNUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2Ugew0KKw0KKyAgICB2b2lkIHRlc3RLZXl3b3JkcygpIHsNCisgICAgICAgIGRlZiB2YWx1ZSA9ICJyZXR1cm5WYWx1ZSINCisgICAgICAgIFN0YXRpY0FuZERlZmF1bHRDbGFzcy5tZXRhQ2xhc3Muc3RhdGljLmR5blN0YXRpY01ldGhvZCA9IHstPiB2YWx1ZSB9DQorICAgICAgICBhc3NlcnQgdmFsdWUgPT0gU3RhdGljQW5kRGVmYXVsdENsYXNzLmR5blN0YXRpY01ldGhvZCgpDQorDQorICAgICAgICBTdGF0aWNBbmREZWZhdWx0Q2xhc3MubWV0YUNsYXNzLmRlZmF1bHQgPSB2YWx1ZQ0KKyAgICAgICAgU3RhdGljQW5kRGVmYXVsdENsYXNzLm1ldGFDbGFzcy5nb3RvID0gdmFsdWUNCisgICAgICAgIGFzc2VydCB2YWx1ZSA9PSBuZXcgU3RhdGljQW5kRGVmYXVsdENsYXNzKCkuZGVmYXVsdA0KKyAgICAgICAgYXNzZXJ0IHZhbHVlID09IG5ldyBTdGF0aWNBbmREZWZhdWx0Q2xhc3MoKS5nb3RvDQorICAgIH0NCisNCisgICAgdm9pZCB0ZXN0S2V5d29yZHNBc01hcEtleXMoKSB7DQorICAgICAgICBkZWYgbWFwID0gW2dvdG86IDEsIGRlZmF1bHQ6IDIsIHN0YXRpYzogM10NCisNCisgICAgICAgIGFzc2VydCAxID09IG1hcC5nb3RvDQorICAgICAgICBhc3NlcnQgMiA9PSBtYXAuZGVmYXVsdA0KKyAgICAgICAgYXNzZXJ0IDMgPT0gbWFwLnN0YXRpYw0KKyAgICB9DQorfQ0KKw0KK2NsYXNzIFN0YXRpY0FuZERlZmF1bHRDbGFzcyB7fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvU3RhdGljSW1wb3J0VGFyZ2V0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvU3RhdGljSW1wb3J0VGFyZ2V0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGI5NDViCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9TdGF0aWNJbXBvcnRUYXJnZXQuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTAgQEAKK3BhY2thZ2UgZ3Jvb3Z5CisKK2NsYXNzIFN0YXRpY0ltcG9ydFRhcmdldCB7CisgICAgZGVmIHN0YXRpYyB4KFN0cmluZyBtZXNzYWdlLCBpbnQgdGltZXMpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2UgKiB0aW1lcworICAgIH0KKyAgICBkZWYgeShTdHJpbmcgbWVzc2FnZSwgaW50IHRpbWVzKSB7CisgICAgICAgIHJldHVybiB4KG1lc3NhZ2UsIHRpbWVzKQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvU3RhdGljSW1wb3J0VGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1N0YXRpY0ltcG9ydFRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxYjI4YTYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1N0YXRpY0ltcG9ydFRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsOTMgQEAKK3BhY2thZ2UgZ3Jvb3Z5CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLkJvb2xlYW4uRkFMU0UgYXMgRgoraW1wb3J0IHN0YXRpYyBqYXZhLnRleHQuRGF0ZUZvcm1hdC5NRURJVU0gYXMgTQoraW1wb3J0IHN0YXRpYyBqYXZhLnRleHQuRGF0ZUZvcm1hdC5NRURJVU0KK2ltcG9ydCBzdGF0aWMgamF2YS5hd3QuQ29sb3IuKgoraW1wb3J0IHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0LmZvcm1hdAoraW1wb3J0IHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0LmFzc2VydEVxdWFscworaW1wb3J0IHN0YXRpYyBTdGF0aWNJbXBvcnRUYXJnZXQueAoraW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuTWF0aC4qCitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5DYWxlbmRhci5nZXRJbnN0YW5jZSBhcyBub3cKK2ltcG9ydCBzdGF0aWMgQVBJLioKKworY2xhc3MgU3RhdGljSW1wb3J0VGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKyAgICB2b2lkIHRlc3RGaWVsZFdpdGhBbGlhc0luRXhwcmVzc2lvbigpIHsKKyAgICAgICAgYXNzZXJ0ICFGCisgICAgfQorCisgICAgdm9pZCB0ZXN0TWV0aG9kQW5kRmllbGQoKSB7CisgICAgICAgIGFzc2VydCBjb3MoMiAqIFBJKSA9PSAxLjAKKyAgICB9CisKKyAgICBzdGF0aWMgbXlTdGF0aWNNZXRob2QoKSB7CisgICAgICAgIGNvcygyICogUEkpCisgICAgfQorCisgICAgdm9pZCB0ZXN0TWV0aG9kQW5kRmllbGRJblN0YXRpY0NvbnRleHQoKSB7CisgICAgICAgIGFzc2VydCBteVN0YXRpY01ldGhvZCgpID09IDEuMAorICAgIH0KKworICAgIHZvaWQgdGVzdE1ldGhvZEFuZEZpZWxkSW5DbG9zdXJlKCkgeworICAgICAgICBkZWYgY2xvc3VyZSA9IHsgY29zKDIgKiBQSSkgfQorICAgICAgICBhc3NlcnQgY2xvc3VyZSgpID09IDEuMAorICAgIH0KKworICAgIHZvaWQgdGVzdEZpZWxkQXNPYmplY3RFeHByZXNzaW9uKCkgeworICAgICAgICBhc3NlcnQgUEkuZXF1YWxzKE1hdGguUEkpCisgICAgfQorCisgICAgdm9pZCB0ZXN0RmllbGRBc0FyZ3VtZW50TGlzdCgpIHsKKyAgICAgICAgYXNzZXJ0ICgiIiArIFBJLnRvU3RyaW5nKCkpLmNvbnRhaW5zKCczLjE0JykKKyAgICB9CisKKyAgICB2b2lkIHRlc3RGaWVsZEFsaWFzaW5nKCkgeworICAgICAgICBhc3NlcnQgTUVESVVNID09IE0KKyAgICB9CisKKyAgICB2b2lkIHRlc3RNZXRob2RBbGlhc2luZygpIHsKKyAgICAgICAgLy8gR1JPT1ZZLTE4MDkgbWFraW5nIHRoaXMgbm90IHBvc3NpYmxlIG9uIG9uZSBsaW5lPworICAgICAgICBkZWYgbm93ID0gbm93KCkudGltZQorICAgICAgICBhc3NlcnQgbm93LmNsYXNzID09IERhdGUKKyAgICB9CisKKyAgICB2b2lkIHRlc3RXaWxkQ2FyZEFsaWFzaW5nKCkgeworICAgICAgICBhc3NlcnQgTElHSFRfR1JBWSA9PSBqYXZhLmF3dC5Db2xvci5MSUdIVF9HUkFZCisgICAgfQorCisgICAgcHJpdmF0ZSBmb3JtYXQoYSwgYiwgYywgaWdub3JlZCkgeyBmb3JtYXQoYSwgYiwgYykgfQorCisgICAgdm9pZCB0ZXN0TWV0aG9kRGVmQ2FuVXNlU3RhdGljYWxseUltcG9ydGVkTWV0aG9kV2l0aFNhbWVOYW1lQnV0RGlmZkFyZ3MoKSB7CisgICAgICAgIGFzc2VydCBmb3JtYXQoImRpZmZlcmVudCIsICJhYmMiLCAiYUJjIiwgMykgPT0gJ2RpZmZlcmVudCBleHBlY3RlZDo8YWJjPiBidXQgd2FzOjxhQmM+JworICAgIH0KKworICAgIHZvaWQgdGVzdEFzc2VydEVxdWFsc0Zyb21KVW5pdCgpIHsKKyAgICAgICAgZG91YmxlW10gdmFsdWVzID0gWzMuOTk5OSwgNC4wMDAxLCAwLjAwMDIxLCAwLjAwMDE5XQorICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVzWzBdLCB2YWx1ZXNbMV0sIHZhbHVlc1syXSkKKyAgICAgICAgc2hvdWxkRmFpbChqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0aW9uRmFpbGVkRXJyb3IpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZXNbMF0sIHZhbHVlc1sxXSwgdmFsdWVzWzNdKQorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCB0ZXN0U3RhdGljSW1wb3J0RnJvbUdyb292eSgpIHsKKyAgICAgICAgZGVmIG5vbnN0YXRpY3ZhbCA9IG5ldyBTdGF0aWNJbXBvcnRUYXJnZXQoKS55KCJoZSIsIDMpCisgICAgICAgIGRlZiBzdGF0aWN2YWwgPSB4KCJoZSIsIDMpCisgICAgICAgIGFzc2VydCBub25zdGF0aWN2YWwgPT0gc3RhdGljdmFsCisgICAgfQorCisgICAgdm9pZCB0ZXN0U3RhdGljSW1wb3J0V2l0aFZhckFyZ3MoKSB7CisgICAgICAgIGFzc2VydCBub0FycmF5TWV0aG9kKCJvbmUiLCAxKSA9PSAnbm9BcnJheU1ldGhvZChvbmUsIDEpJworICAgICAgICBhc3NlcnQgQVBJLmFycmF5TWV0aG9kKCJ0d28iLCAxLCAyLCAzKSA9PSAnYXJyYXlNZXRob2QodHdvLCAxLCAyLCAzKScKKyAgICAgICAgYXNzZXJ0IGFycmF5TWV0aG9kKCJ0aHJlZSIsIDEsIDIsIDMpID09ICdhcnJheU1ldGhvZCh0aHJlZSwgMSwgMiwgMyknCisgICAgfQorfQorCitjbGFzcyBBUEkgeworICAgIHN0YXRpYyBub0FycmF5TWV0aG9kKFN0cmluZyBzLCBpbnQgdmFsdWUpIHsKKyAgICAgICAgIm5vQXJyYXlNZXRob2QoJHtzfSwgJHt2YWx1ZX0pIgorICAgIH0KKworICAgIHN0YXRpYyBhcnJheU1ldGhvZChTdHJpbmcgcywgaW50W10gdmFsdWVzKSB7CisgICAgICAgICJhcnJheU1ldGhvZCgke3N9LCAiICsgdmFsdWVzLnRvTGlzdCgpLmpvaW4oIiwgIikgKyAiKSIKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1N0YXRpY01lc3NhZ2VUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvU3RhdGljTWVzc2FnZVRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJiNGM5Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1N0YXRpY01lc3NhZ2VUZXN0Lmdyb292eQpAQCAtMCwwICsxLDIxIEBACitwYWNrYWdlIGdyb292eQ0KKw0KK2NsYXNzIFN0YXRpY01lc3NhZ2VUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2Ugew0KKw0KKyAgIHZvaWQgdGVzdFN0YXRpY01pc3NpbmdNZXRob2RFeGNlcHRpb24oKSB7DQorICAgICAgdHJ5IHsNCisgICAgICAgICBJbnRlZ2VyLmZvb2JhcmJheigpDQorICAgICAgfSBjYXRjaCAoTWlzc2luZ01ldGhvZEV4Y2VwdGlvbiBtbWUpIHsNCisgICAgICAgICBhc3NlcnQgbW1lLm1lc3NhZ2UgPT1+ICcuKnN0YXRpYy4qJw0KKyAgICAgIH0NCisgICB9DQorDQorICAgdm9pZCB0ZXN0SW5zdGFuY2VNaXNzaW5nTWV0aG9kRXhjZXB0aW9uKCkgew0KKyAgICAgIHRyeSB7DQorICAgICAgICAgSW50ZWdlciB4ID0gNTsNCisgICAgICAgICB4LmZvb2JhcmJheigpDQorICAgICAgfSBjYXRjaCAoTWlzc2luZ01ldGhvZEV4Y2VwdGlvbiBtbWUpIHsNCisgICAgICAgICBhc3NlcnQgISAobW1lLm1lc3NhZ2UgPT1+ICcuKnN0YXRpYy4qJykNCisgICAgICB9DQorICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1N0YXRpY1RoaXNUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvU3RhdGljVGhpc1Rlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMTNkNDUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1N0YXRpY1RoaXNUZXN0Lmdyb292eQpAQCAtMCwwICsxLDI0IEBACitwYWNrYWdlIGdyb292eQorCitjbGFzcyBTdGF0aWNUaGlzVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIHZvaWQgdGVzdFRoaXNGYWlsKCkgeworICAgICAgICBzdGF0aWNNZXRob2QoKQorICAgIH0KKworICAgIHN0YXRpYyBkZWYgc3RhdGljTWV0aG9kKCkgeworICAgICAgICBkZWYgZm9vID0gdGhpcworCisgICAgICAgIGFzc2VydCBmb28gIT0gbnVsbAorICAgICAgICBhc3NlcnQgZm9vLm5hbWUuZW5kc1dpdGgoIlN0YXRpY1RoaXNUZXN0IikKKworICAgICAgICBwcmludGxuKCJ0aGlzOiAiICsgdGhpcykKKworICAgICAgICBkZWYgcyA9IHN1cGVyCisKKyAgICAgICAgYXNzZXJ0IHMgIT0gbnVsbAorICAgICAgICBhc3NlcnQgcy5uYW1lLmVuZHNXaXRoKCJHcm9vdnlUZXN0Q2FzZSIpCisKKyAgICAgICAgcHJpbnRsbigic3VwZXI6ICIgKyBzdXBlcikKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1N0cmFuZ2VCZWFuLmphdmEgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1N0cmFuZ2VCZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEyNTEwYwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvU3RyYW5nZUJlYW4uamF2YQpAQCAtMCwwICsxLDM5IEBACitwYWNrYWdlIGdyb292eTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIFRoaXMgYmVhbiBzaG91bGQgZW5jb21wYXNzIGFsbCBsZWdhbCwgYnV0IGJhZCwgSmF2YUJlYW5zIHByYWN0aWNlcworICovCitwdWJsaWMgY2xhc3MgU3RyYW5nZUJlYW4geworICAgIAorICAgIFNldCBzdHJhbmdlTGlzdGVuZXJzOworICAgIAorICAgIC8qKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIFN0cmFuZ2VCZWFuICovCisgICAgcHVibGljIFN0cmFuZ2VCZWFuKCkgeworICAgICAgICBzdHJhbmdlTGlzdGVuZXJzID0gbmV3IExpbmtlZEhhc2hTZXQoKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgYWRkU3RyYW5nZUV2ZW50TGlzdGVuZXIoU3RyYW5nZUV2ZW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgc3RyYW5nZUxpc3RlbmVycy5hZGQobGlzdGVuZXIpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVTdHJhbmdlRXZlbnRMaXN0ZW5lcihTdHJhbmdlRXZlbnRMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBzdHJhbmdlTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBTdHJhbmdlRXZlbnRMaXN0ZW5lcltdIGdldFN0cmFuZ2VFdmVudExpc3RlbmVycygpIHsKKyAgICAgICAgcmV0dXJuIChTdHJhbmdlRXZlbnRMaXN0ZW5lcltdKSBzdHJhbmdlTGlzdGVuZXJzLnRvQXJyYXkobmV3IFN0cmFuZ2VFdmVudExpc3RlbmVyW3N0cmFuZ2VMaXN0ZW5lcnMuc2l6ZSgpXSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNvbWV0aGluZ1N0cmFuZ2VIYXBwZW5lZChTdHJpbmcgd2hhdCwgU3RyaW5nIHdoZXJlKSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBzdHJhbmdlTGlzdGVuZXJzLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgU3RyYW5nZUV2ZW50TGlzdGVuZXIgbGlzdGVuZXIgPSAoU3RyYW5nZUV2ZW50TGlzdGVuZXIpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgbGlzdGVuZXIuc29tZXRoaW5nU3RyYW5nZUhhcHBlbmVkKHdoYXQsIHdoZXJlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvU3RyYW5nZUJlYW5CZWFuSW5mby5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9TdHJhbmdlQmVhbkJlYW5JbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUwYmIwZQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvU3RyYW5nZUJlYW5CZWFuSW5mby5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKK3BhY2thZ2UgZ3Jvb3Z5OworCitpbXBvcnQgamF2YS5iZWFucy5FdmVudFNldERlc2NyaXB0b3I7CitpbXBvcnQgamF2YS5iZWFucy5TaW1wbGVCZWFuSW5mbzsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisKK3B1YmxpYyBjbGFzcyBTdHJhbmdlQmVhbkJlYW5JbmZvIGV4dGVuZHMgU2ltcGxlQmVhbkluZm8geworCisgICAgcHVibGljIEV2ZW50U2V0RGVzY3JpcHRvcltdIGdldEV2ZW50U2V0RGVzY3JpcHRvcnMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNZXRob2RbXSBldmVudHMgPSBTdHJhbmdlRXZlbnRMaXN0ZW5lci5jbGFzcy5nZXRNZXRob2RzKCk7CisgICAgICAgICAgICBNZXRob2QgYWRkTGlzdGVuZXIgPSBTdHJhbmdlQmVhbi5jbGFzcy5nZXRNZXRob2QoImFkZFN0cmFuZ2VFdmVudExpc3RlbmVyIiwgbmV3IENsYXNzW10ge1N0cmFuZ2VFdmVudExpc3RlbmVyLmNsYXNzfSk7CisgICAgICAgICAgICBNZXRob2QgcmVtb3ZlTGlzdGVuZXIgPSBTdHJhbmdlQmVhbi5jbGFzcy5nZXRNZXRob2QoInJlbW92ZVN0cmFuZ2VFdmVudExpc3RlbmVyIiwgbmV3IENsYXNzW10ge1N0cmFuZ2VFdmVudExpc3RlbmVyLmNsYXNzfSk7CisgICAgICAgICAgICBNZXRob2QgZ2V0TGlzdGVuZXJzID0gU3RyYW5nZUJlYW4uY2xhc3MuZ2V0TWV0aG9kKCJnZXRTdHJhbmdlRXZlbnRMaXN0ZW5lcnMiLCBuZXcgQ2xhc3NbMF0pOworICAgICAgICAgICAgCisgICAgICAgICAgICByZXR1cm4gbmV3IEV2ZW50U2V0RGVzY3JpcHRvcltdIHsKKyAgICAgICAgICAgICAgICBuZXcgRXZlbnRTZXREZXNjcmlwdG9yKCAKKyAgICAgICAgICAgICAgICAgICAgICAgICJzdHJhbmdlRXZlbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyYW5nZUV2ZW50TGlzdGVuZXIuY2xhc3MsIAorICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgYWRkTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVMaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldExpc3RlbmVycykKKyAgICAgICAgICAgIH07CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZSkgeworICAgICAgICAgICAgaWUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldEV2ZW50U2V0RGVzY3JpcHRvcnMoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvU3RyYW5nZUV2ZW50TGlzdGVuZXIuamF2YSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvU3RyYW5nZUV2ZW50TGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWI4N2JkCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9TdHJhbmdlRXZlbnRMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMTYgQEAKK3BhY2thZ2UgZ3Jvb3Z5OworCitpbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7CitpbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuQ2hhbmdlRXZlbnQ7CisKK3B1YmxpYyBpbnRlcmZhY2UgU3RyYW5nZUV2ZW50TGlzdGVuZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyIHsKKworICAgIC8qKgorICAgICAqIEFjb3JyZGluZyB0byBzZWN0aW9uIDYuNC4xIG9mIHRoZSBKYXZhQmVhbnMgc3BlYyB0aGlzIGlzIGxlZ2FsLCBidXQgbm90CisgICAgICogZ29vZCBwcmFjdGljZS4gIFdlIG5lZWQgdG8gdGVzdCB3aGF0IGNhbiBiZSBkb25lIG5vdCB3aGF0IHNob3VsZCBiZSBkb25lCisgICAgICovCisgICAgdm9pZCBzb21ldGhpbmdTdHJhbmdlSGFwcGVuZWQoU3RyaW5nIHdoYXQsIFN0cmluZyB3aGVyZSk7CisgICAgCisgICAgdm9pZCBzb21ldGhpbmdDaGFuZ2VkKENoYW5nZUV2ZW50IGNoYW5nZUV2ZW50KTsKKyAgICAKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvU3RyaW5nQnVmZmVyVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1N0cmluZ0J1ZmZlclRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNTdiODUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1N0cmluZ0J1ZmZlclRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMjcgQEAKK3BhY2thZ2UgZ3Jvb3Z5CisKK2NsYXNzIFN0cmluZ0J1ZmZlclRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisgICAgdm9pZCB0ZXN0U2l6ZSgpIHsKKyAgICAgICAgZGVmIHggPSBuZXcgU3RyaW5nQnVmZmVyKCkKKyAgICAgICAgYXNzZXJ0IHguc2l6ZSgpID09IHgubGVuZ3RoKCkKKyAgICAgICAgeCA9IG5ldyBTdHJpbmdCdWZmZXIoJ3NvbWUgdGV4dCcpCisgICAgICAgIGFzc2VydCB4LnNpemUoKSA9PSB4Lmxlbmd0aCgpCisgICAgfQorCisgICAgdm9pZCB0ZXN0UHV0QXQoKXsKKyAgICAgICAgZGVmIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoJzAxMjMnKQorICAgICAgICBidWZbMS4uMl0gPSAneHgnCisgICAgICAgIGFzc2VydCAnMHh4MycgPT0gYnVmLnRvU3RyaW5nKCkgICwgJ3JlcGxhY2Ugd2l0aCBTdHJpbmcnCisgICAgICAgIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoJzAxMjMnKQorICAgICAgICBidWZbMS4uMl0gPSA5OQorICAgICAgICBhc3NlcnQgJzA5OTMnID09IGJ1Zi50b1N0cmluZygpICAsICdyZXBsYWNlIHdpdGggb2JqLnRvU3RyaW5nKCknCisgICAgICAgIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoJzAxMjMnKQorICAgICAgICBidWZbMC4uPDBdID0gJ3h4JworICAgICAgICBhc3NlcnQgJ3h4MDEyMycgPT0gYnVmLnRvU3RyaW5nKCksICdib3JkZXIgY2FzZSBsZWZ0JworICAgICAgICBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCcwMTIzJykKKyAgICAgICAgYnVmWzQuLjRdID0gJ3h4JworICAgICAgICBwcmludGxuIGJ1Zi50b1N0cmluZygpCisgICAgICAgIGFzc2VydCAnMDEyM3h4JyA9PSBidWYudG9TdHJpbmcoKSwgJ2JvcmRlciBjYXNlIHJpZ2h0JworICAgICAgICAvLyBtb3JlIHdlaXJkIFJhbmdlcyBhbHJlYWR5IHRlc3RlZCBpbiBMaXN0VGVzdAorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1N0cmluZ1Rlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9TdHJpbmdUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2M2MGIwCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9TdHJpbmdUZXN0Lmdyb292eQpAQCAtMCwwICsxLDE4NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGdyb292eQorCisvKioKKyAqIFZhcmlvdXMgdGVzdHMgZm9yIFN0cmluZ3MuCisgKgorICogQGF1dGhvciBNaWNoYWVsIEJhZWhyCisgKi8KK2NsYXNzIFN0cmluZ1Rlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICB2b2lkIHRlc3RTdHJpbmcoKSB7CisgICAgICAgIGRlZiBzID0gImFiY2QiCisgICAgICAgIGFzc2VydCBzLmxlbmd0aCgpID09IDQKKyAgICAgICAgYXNzZXJ0IDQgPT0gcy5sZW5ndGgoKQorICAgICAgICAKKyAgICAgICAgLy8gdGVzdCBwb2x5bW9ycGhpYyBzaXplKCkgbWV0aG9kIGxpa2UgY29sbGVjdGlvbnMKKyAgICAgICAgYXNzZXJ0IHMuc2l6ZSgpID09IDQKKyAgICAgICAgCisgICAgICAgIHMgPSBzICsgImVmZyIgKyAiaGlqayIKKyAgICAgICAgCisgICAgICAgIGFzc2VydCBzLnNpemUoKSA9PSAxMQorICAgICAgICBhc3NlcnQgImFiY2RlZiIuc2l6ZSgpID09IDYKKyAgICB9CisKKyAgICB2b2lkIHRlc3RTdHJpbmdQbHVzTnVsbCgpIHsKKyAgICAgICAgZGVmIHkgPSBudWxsCisgICAgICAgIGRlZiB4ID0gImhlbGxvICIgKyB5CisgICAgICAgIGFzc2VydCB4ID09ICJoZWxsbyBudWxsIgorICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3ROZXh0UHJldmlvdXMoKSB7CisgICAgCWRlZiB4ID0gJ2EnCisgICAgCWRlZiB5ID0geC5uZXh0KCkKKyAgICAJYXNzZXJ0IHkgPT0gJ2InCisgICAgCisgICAgCWRlZiB6ID0gJ3onLnByZXZpb3VzKCkKKyAgICAJYXNzZXJ0IHogPT0gJ3knCisgICAgCQorICAgIAl6ID0gJ3onCisgICAgCWRlZiBiID0gei5uZXh0KCkKKyAgICAJYXNzZXJ0IGIgIT0gJ3onCisKKyAgICAgICAgYXNzZXJ0IGIgPiB6CisgICAgICAgIGFzc2VydCB6LmNoYXJBdCgwKSA9PSAneicKKyAgICAgICAgYXNzZXJ0IGIuY2hhckF0KDApID09ICd7JworICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RBcHBwZW5kVG9TdHJpbmcoKSB7CisgICAgICAgIGRlZiBuYW1lID0gIkdyb21pdCIKKyAgICAgICAgZGVmIHJlc3VsdCA9ICJoZWxsbyAiIDw8IG5hbWUgPDwgIiEiCisgICAgICAgIAorICAgICAgICBhc3NlcnQgcmVzdWx0LnRvU3RyaW5nKCkgPT0gImhlbGxvIEdyb21pdCEiCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdEFwcHBlbmRUb1N0cmluZ0J1ZmZlcigpIHsKKyAgICAgICAgZGVmIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKQorICAgICAgICAKKyAgICAgICAgZGVmIG5hbWUgPSAiR3JvbWl0IgorICAgICAgICBidWZmZXIgPDwgImhlbGxvICIgPDwgbmFtZSA8PCAiISIgCisgICAgICAgIAorICAgICAgICBhc3NlcnQgYnVmZmVyLnRvU3RyaW5nKCkgPT0gImhlbGxvIEdyb21pdCEiCisgICAgfQorCisgICAgdm9pZCB0ZXN0QXBwcGVuZEFuZFN1YnNjaXB0KCkgeworICAgICAgICBkZWYgcmVzdWx0ID0gICdoZWxsbycgPDwgIiBHcm9taXQhIgorICAgICAgICByZXN1bHRbMS4uNF0gPSAnaScKKyAgICAgICAgYXNzZXJ0IHJlc3VsdC50b1N0cmluZygpID09ICJoaSBHcm9taXQhIgorICAgIH0KKworICAgIHZvaWQgYXNzZXJ0TGVuZ3RoKHMsIGxlbikgeworICAgICAgICBpZiAocy5sZW5ndGgoKSAhPSBsZW4pICBwcmludGxuICIqKiogbGVuZ3RoICE9ICRsZW46ICRzIgorICAgICAgICBhc3NlcnQgcy5sZW5ndGgoKSA9PSBsZW4KKyAgICB9CisgICAgdm9pZCBhc3NlcnRDb250YWlucyhzLCBsZW4sIHN1YnMpIHsKKyAgICAgICAgYXNzZXJ0TGVuZ3RoKHMsIGxlbikKKyAgICAgICAgaWYgKHMuaW5kZXhPZihzdWJzKSA8IDApICBwcmludGxuICIqKiogbWlzc2luZyAkc3ViczogJHMiCisgICAgICAgIGFzc2VydCBzLmluZGV4T2Yoc3VicykgPj0gMAorICAgIH0KKworICAgIHZvaWQgdGVzdFNpbXBsZVN0cmluZ0xpdGVyYWxzKCkgeworICAgICAgICBhc3NlcnRMZW5ndGgoIlxuIiwgMSkKKyAgICAgICAgYXNzZXJ0TGVuZ3RoKCJcIiIsIDEpCisgICAgICAgIGFzc2VydExlbmd0aCgiXCciLCAxKQorICAgICAgICBhc3NlcnRMZW5ndGgoIlxcIiwgMSkKKyAgICAgICAgYXNzZXJ0Q29udGFpbnMoIlwkezB9IiwgNCwgInswfSIpCisgICAgICAgIGFzc2VydENvbnRhaW5zKCJ4XAoreSIsIDIsICJ4eSIpCisKKyAgICAgICAgYXNzZXJ0TGVuZ3RoKCdcbicsIDEpCisgICAgICAgIGFzc2VydExlbmd0aCgnXCcnLCAxKQorICAgICAgICBhc3NlcnRMZW5ndGgoJ1xcJywgMSkKKyAgICAgICAgYXNzZXJ0Q29udGFpbnMoJyR7MH0nLCA0LCAnezB9JykKKyAgICAgICAgYXNzZXJ0Q29udGFpbnMoJ3hcCit5JywgMiwgJ3h5JykKKyAgICB9CisKKyAgICB2b2lkIHRlc3RNdWx0aWxpbmVTdHJpbmdMaXRlcmFscygpIHsKKyAgICAgICAgYXNzZXJ0Q29udGFpbnMoIiIiIngiIiIsIDIsICcieCcpOworICAgICAgICBhc3NlcnRDb250YWlucygiIiIiIngiIiIsIDMsICciIngnKTsKKyAgICAgICAgYXNzZXJ0Q29udGFpbnMoIiIieAoreSIiIiwgMywgJ3hcbnknKTsKKyAgICAgICAgYXNzZXJ0Q29udGFpbnMoIiIiXG4KK1xuIiIiLCAzLCAnXG5cblxuJyk7CisKKyAgICAgICAgYXNzZXJ0Q29udGFpbnMoJycnJ3gnJycsIDIsICIneCIpOworICAgICAgICBhc3NlcnRDb250YWlucygnJycnJ3gnJycsIDMsICInJ3giKTsKKyAgICAgICAgYXNzZXJ0Q29udGFpbnMoJycneAoreScnJywgMywgJ3hcbnknKTsKKyAgICAgICAgYXNzZXJ0Q29udGFpbnMoJycnXG4KK1xuJycnLCAzLCAnXG5cblxuJyk7CisKKyAgICB9CisKKyAgICB2b2lkIHRlc3RSZWdleHBTdHJpbmdMaXRlcmFscygpIHsKKyAgICAgICAgYXNzZXJ0ICJmb28iID09IC9mb28vCisgICAgICAgIGFzc2VydCAnXFwkJCcgPT0gL1wkJC8KKyAgICAgICAgLy8gQmFja3NsYXNoIGJlZm9yZSBuZXdsaW5lIG9yIHNsYXNoIGRpc2FwcGVhcnMgKGFsbCBvdGhlcnMgYXJlIHByZXNlcnZlZCk6CisgICAgICAgIGFzc2VydCAiL1xcKiIgPT0gL1wvXCovCisgICAgICAgIGFzc2VydCAiXG4iID09IC9cCisvCisgICAgfQorCisKKyAgICB2b2lkIHRlc3RCb29sQ29lcmNlKCkgeworCisgICAgICAgIC8vIEV4cGxpY2l0IGNvZXJjaW9uCisgICAgICAgIGFzc2VydEZhbHNlKChCb29sZWFuKSAiIikKKyAgICAgICAgYXNzZXJ0VHJ1ZSgoQm9vbGVhbikgImNvbnRlbnQiKQorCisgICAgICAgIC8vIEltcGxpY2l0IGNvZXJjaW9uIGluIHN0YXRlbWVudHMKKyAgICAgICAgU3RyaW5nIHMgPSBudWxsCisgICAgICAgIGlmIChzKSB7CisgICAgICAgICAgICBmYWlsKCJudWxsIHNob3VsZCBoYXZlIGV2YWx1YXRlZCB0byBmYWxzZSwgYnV0IGRpZG4ndCIpCisgICAgICAgIH0KKyAgICAgICAgcyA9ICcnCisgICAgICAgIGlmIChzKSB7CisgICAgICAgICAgICBmYWlsKCInJyBzaG91bGQgaGF2ZSBldmFsdWF0ZWQgdG8gZmFsc2UsIGJ1dCBkaWRuJ3QiKQorICAgICAgICB9CisgICAgICAgIHMgPSAnc29tZXRoaW5nJworICAgICAgICBpZiAocykgeworICAgICAgICAgICAgLy8gT0sKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZhaWwoIidzb21ldGhpbmcnIHNob3VsZCBoYXZlIGV2YWx1YXRlZCB0byBmYWxzZSwgYnV0IGRpZG4ndCIpCisgICAgICAgIH0KKyAgICAgICAgCisgICAgfQorCisgICAgdm9pZCB0ZXN0U3BsaXQoKSB7CisgICAgICAgIGRlZiB0ZXh0ID0gImhlbGxvIHRoZXJlXG5ob3cgYXJlIHlvdSIKKyAgICAgICAgZGVmIHNwbGl0dGVkID0gdGV4dC5zcGxpdCgpLnRvTGlzdCgpCisgICAgICAgIGFzc2VydCBzcGxpdHRlZCA9PSBbJ2hlbGxvJywgJ3RoZXJlJywgJ2hvdycsICdhcmUnLCAneW91J10KKyAgICB9CisKKyAgICB2b2lkIHRlc3RTcGxpdEVtcHR5VGV4dCgpIHsKKyAgICAgICAgZGVmIHRleHQgPSAiIgorICAgICAgICBkZWYgc3BsaXR0ZWQgPSB0ZXh0LnNwbGl0KCkudG9MaXN0KCkKKyAgICAgICAgYXNzZXJ0IHNwbGl0dGVkID09IFtdCisgICAgfQorCisgICAgdm9pZCB0ZXN0U3BsaXRFcXVhbHNUb2tlbml6ZSgpIHsKKyAgICAgICAgZGVmIHRleHQgPSAiIiIKKyAgICAgICAgQSB0ZXh0IHdpdGggZGlmZmVyZW50IHdvcmRzIGFuZAorICAgICAgICBudW1iZXJzIGxpa2UgMzQ1MyBhbmQgMywzNDUsNDU0Ljk3IGFuZAorICAgICAgICBzcGVjaWFsIGNoYXJhY3RlcnMgJSYpKCBhbmQgYWxzbworICAgICAgICBldmVyeXRoaW5nIG1peGVkIHRvZ2V0aGVyIDQ1IWt3PworICAgICAgIiIiCisKKyAgICAgICAgZGVmIHNwbGl0dGVkID0gdGV4dC5zcGxpdCgpLnRvTGlzdCgpCisgICAgICAgIGRlZiB0b2tlbml6ZWQgPSB0ZXh0LnRva2VuaXplKCkKKyAgICAgICAgYXNzZXJ0IHNwbGl0dGVkID09IHRva2VuaXplZAorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9TdWJzY3JpcHRUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvU3Vic2NyaXB0VGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNmOTNjZgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvU3Vic2NyaXB0VGVzdC5ncm9vdnkKQEAgLTAsMCArMSwyMTMgQEAKK3BhY2thZ2UgZ3Jvb3Z5CisKK2NsYXNzIFN1YnNjcmlwdFRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICB2b2lkIHRlc3RMaXN0UmFuZ2UoKSB7CisgICAgICAgIGRlZiBsaXN0ID0gWydhJywgJ2InLCAnYycsICdkJywgJ2UnXQorCisgICAgICAgIGRlZiBzdWIgPSBsaXN0WzIuLjRdCisgICAgICAgIGFzc2VydCBzdWIgPT0gWydjJywgJ2QnLCAnZSddCisgICAgICAgIAorICAgICAgICBzdWIgPSBsaXN0WzIuLjw1XQorICAgICAgICBhc3NlcnQgc3ViID09IFsnYycsICdkJywgJ2UnXQorICAgICAgICAKKyAgICAgICAgZGVmIHZhbHVlID0gbGlzdFstMV0KKyAgICAgICAgYXNzZXJ0IHZhbHVlID09ICdlJworICAgICAgICAKKyAgICAgICAgc3ViID0gbGlzdFstNC4uLTJdCisgICAgICAgIGFzc2VydCBzdWIgPT0gWydiJywgJ2MnLCAnZCddCisgICAgICAgIAorICAgICAgICAvLyBiYWNrd2FyZHMgcmFuZ2VzCisgICAgICAgIHN1YiA9IGxpc3RbLTEuLi0zXQorICAgICAgICBhc3NlcnQgc3ViID09IFsnZScsICdkJywgJ2MnXQorICAgICAgICAKKyAgICAgICAgc3ViID0gbGlzdFstMy4uLTFdCisgICAgICAgIGFzc2VydCBzdWIgPT0gWydjJywgJ2QnLCAnZSddCisgICAgICAgIAorICAgICAgICBzdWIgPSBsaXN0WzMuLjFdCisgICAgICAgIGFzc2VydCBzdWIgPT0gWydkJywgJ2MnLCAnYiddCisgICAgICAgIAorICAgICAgICBzdWIgPSBsaXN0WzEuLi0zXQorICAgICAgICBhc3NlcnQgc3ViID09IFsnYicsICdjJ10KKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0T2JqZWN0UmFuZ2VSYW5nZSgpIHsKKyAgICAgICAgZGVmIGxpc3QgPSAnYScuLidlJworICAgICAgICAKKyAgICAgICAgZGVmIHN1YiA9IGxpc3RbMi4uNF0KKyAgICAgICAgYXNzZXJ0IHN1YiA9PSBbJ2MnLCAnZCcsICdlJ10KKyAgICAgICAgCisgICAgICAgIGRlZiB2YWx1ZSA9IGxpc3RbLTFdCisgICAgICAgIGFzc2VydCB2YWx1ZSA9PSAnZScKKyAgICAgICAgCisgICAgICAgIHN1YiA9IGxpc3RbLTQuLi0yXQorICAgICAgICBhc3NlcnQgc3ViID09IFsnYicsICdjJywgJ2QnXQorICAgICAgICAKKyAgICAgICAgLy8gYmFja3dhcmRzIHJhbmdlcworICAgICAgICBzdWIgPSBsaXN0Wy0xLi4tM10KKyAgICAgICAgYXNzZXJ0IHN1YiA9PSBbJ2UnLCAnZCcsICdjJ10KKyAgICAgICAgCisgICAgICAgIHN1YiA9IGxpc3RbMy4uMV0KKyAgICAgICAgYXNzZXJ0IHN1YiA9PSBbJ2QnLCAnYycsICdiJ10KKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0U3RyaW5nQXJyYXlSYW5nZSgpIHsKKyAgICAgICAgU3RyaW5nW10gbGlzdCA9IFsnYScsICdiJywgJ2MnLCAnZCcsICdlJ10KKyAgICAgICAgCisgICAgICAgIGRlZiBzdWIgPSBsaXN0WzIuLjRdCisgICAgICAgIGFzc2VydCBzdWIgPT0gWydjJywgJ2QnLCAnZSddCisgICAgICAgIAorICAgICAgICBkZWYgdmFsdWUgPSBsaXN0Wy0xXQorICAgICAgICBhc3NlcnQgdmFsdWUgPT0gJ2UnCisgICAgICAgIAorICAgICAgICBzdWIgPSBsaXN0Wy00Li4tMl0KKyAgICAgICAgYXNzZXJ0IHN1YiA9PSBbJ2InLCAnYycsICdkJ10KKyAgICAgICAgCisgICAgICAgIC8vIGJhY2t3YXJkcyByYW5nZXMKKyAgICAgICAgc3ViID0gbGlzdFstMS4uLTNdCisgICAgICAgIGFzc2VydCBzdWIgPT0gWydlJywgJ2QnLCAnYyddCisgICAgICAgIAorICAgICAgICBzdWIgPSBsaXN0WzMuLjFdCisgICAgICAgIGFzc2VydCBzdWIgPT0gWydkJywgJ2MnLCAnYiddCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdEludFJhbmdlUmFuZ2UoKSB7CisgICAgICAgIGRlZiBsaXN0ID0gMTAuLjE1CisgICAgICAgIAorICAgICAgICBkZWYgc3ViID0gbGlzdFsyLi40XQorICAgICAgICBhc3NlcnQgc3ViID09IFsxMiwgMTMsIDE0XQorICAgICAgICAKKyAgICAgICAgZGVmIHZhbHVlID0gbGlzdFstMV0KKyAgICAgICAgYXNzZXJ0IHZhbHVlID09IDE1CisgICAgICAgIAorICAgICAgICBzdWIgPSBsaXN0Wy00Li4tMl0KKyAgICAgICAgYXNzZXJ0IHN1YiA9PSBbMTIsIDEzLCAxNF0KKyAgICAgICAgCisgICAgICAgIC8vIGJhY2t3YXJkcyByYW5nZXMKKyAgICAgICAgc3ViID0gbGlzdFstMS4uLTNdCisgICAgICAgIGFzc2VydCBzdWIgPT0gWzE1LCAxNCwgMTNdCisgICAgICAgIAorICAgICAgICBzdWIgPSBsaXN0WzMuLjFdCisgICAgICAgIGFzc2VydCBzdWIgPT0gWzEzLCAxMiwgMTFdCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdEludEFycmF5UmFuZ2UoKSB7CisgICAgICAgIEludGVnZXJbXSBsaXN0ID0gWyAxMCwgMTEsIDEyLCAxMywgMTQsIDE1IF0KKyAgICAgICAgCisgICAgICAgIGRlZiBzdWIgPSBsaXN0WzIuLjRdCisgICAgICAgIGFzc2VydCBzdWIgPT0gWzEyLCAxMywgMTRdCisgICAgICAgIAorICAgICAgICBkZWYgdmFsdWUgPSBsaXN0Wy0xXQorICAgICAgICBhc3NlcnQgdmFsdWUgPT0gMTUKKyAgICAgICAgCisgICAgICAgIHN1YiA9IGxpc3RbLTQuLi0yXQorICAgICAgICBhc3NlcnQgc3ViID09IFsxMiwgMTMsIDE0XQorICAgICAgICAKKyAgICAgICAgLy8gYmFja3dhcmRzIHJhbmdlcworICAgICAgICBzdWIgPSBsaXN0Wy0xLi4tM10KKyAgICAgICAgYXNzZXJ0IHN1YiA9PSBbMTUsIDE0LCAxM10KKyAgICAgICAgCisgICAgICAgIHN1YiA9IGxpc3RbMy4uMV0KKyAgICAgICAgYXNzZXJ0IHN1YiA9PSBbMTMsIDEyLCAxMV0KKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0U3RyaW5nU3Vic2NyaXB0KCkgeworICAgICAgICBkZWYgdGV4dCA9ICJuaWNlIGNoZWVzZSBncm9taXQhIgorICAgICAgICAKKyAgICAgICAgZGVmIHggPSB0ZXh0WzJdCisgICAgICAgIAorICAgICAgICBhc3NlcnQgeCA9PSAiYyIKKyAgICAgICAgYXNzZXJ0IHguY2xhc3MgPT0gU3RyaW5nCisgICAgICAgIAorICAgICAgICBkZWYgc3ViID0gdGV4dFs1Li4xMF0KKyAgICAgICAgYXNzZXJ0IHN1YiA9PSAnY2hlZXNlJworICAgICAgICAKKyAgICAgICAgc3ViID0gdGV4dFsxMC4uNV0KKyAgICAgICAgYXNzZXJ0IHN1YiA9PSAnZXNlZWhjJworICAgICAgICAKKyAgICAgICAgc3ViID0gdGV4dFstMi4uLTddCisgICAgICAgIGFzc2VydCBzdWIgPT0gJ3RpbW9yZycKKyAgICAgICAgCisgICAgICAgIHN1YiA9IHRleHRbMS4uLTNdCisgICAgICAgIGFzc2VydCBzdWIgPT0gImljZSBjaGVlc2UgZ3JvbWkiCisgICAgICAgIAorICAgIH0KKworICAgIHZvaWQgdGVzdFN0cmluZ1B1dEF0UmFuZ2UoKXsKKyAgICAgICAgZGVmIHRleHQgPSAiMDEyMyIKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0TGlzdFN1YnNjcmlwdFdpdGhMaXN0KCkgeworICAgICAgICBkZWYgbGlzdCA9IFsnYScsICdiJywgJ2MnLCAnZCcsICdlJ10KKyAgICAgICAgCisgICAgICAgIGRlZiBpbmRpY2VzID0gWzAsIDIsIDRdCisgICAgICAgIGRlZiBzdWIgPSBsaXN0W2luZGljZXNdCisgICAgICAgIGFzc2VydCBzdWIgPT0gWydhJywgJ2MnLCAnZSddCisgICAgICAgIAorICAgICAgICAvLyB2ZXJib3NlIGJ1dCB2YWxpZAorICAgICAgICBzdWIgPSBsaXN0W1sxLCAzXV0KKyAgICAgICAgYXNzZXJ0IHN1YiA9PSBbJ2InLCAnZCddCisgICAgIAorICAgICAgICAvLyBzeW50YXggc3VnYXIKKyAgICAgICAgc3ViID0gbGlzdFsyLCA0XQorICAgICAgICBhc3NlcnQgc3ViID09IFsnYycsICdlJ10KKyAgICB9CisgICAgCisgICAgCisgICAgdm9pZCB0ZXN0TGlzdFN1YnNjcmlwdFdpdGhMaXN0QW5kUmFuZ2UoKSB7CisgICAgICAgIGRlZiBsaXN0ID0gMTAwLi4yMDAKKworICAgICAgICBkZWYgc3ViID0gbGlzdFsxLCAzLCAyMC4uMjUsIDMzXQorICAgICAgICBhc3NlcnQgc3ViID09IFsxMDEsIDEwMywgMTIwLCAxMjEsIDEyMiwgMTIzLCAxMjQsIDEyNSwgMTMzXQorCisgICAgICAgIC8vIG5vdyBsZXRzIHRyeSBpdCBvbiBhbiBhcnJheQorICAgICAgICBkZWYgYXJyYXkgPSBsaXN0LnRvQXJyYXkoKQorCisgICAgICAgIHN1YiA9IGFycmF5WzEsIDMsIDIwLi4yNSwgMzNdCisgICAgICAgIGFzc2VydCBzdWIgPT0gWzEwMSwgMTAzLCAxMjAsIDEyMSwgMTIyLCAxMjMsIDEyNCwgMTI1LCAxMzNdCisgICAgfQorCisgICAgdm9pZCB0ZXN0U3RyaW5nV2l0aFN1YnNjcmlwdExpc3QoKSB7CisKKyAgICAgICAgZGVmIHRleHQgPSAibmljZSBjaGVlc2UgZ3JvbWl0ISIKKyAgICAgICAgCisgICAgICAgIGRlZiBzdWIgPSB0ZXh0WzEsIDIsIDMsIDUuLjEwXQorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IHN1YiA9PSAiaWNlY2hlZXNlIgorICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RTdWJNYXAoKSB7CisgICAgICAgIGRlZiBtYXAgPSBbJ2EnOjEyMywgJ2InOjQ1NiwgJ2MnOjc4OV0KKyAgICAgICAgCisgICAgICAgIGRlZiBrZXlzID0gWydiJywgJ2EnXQorICAgICAgICBkZWYgc3ViID0gbWFwLnN1Yk1hcChrZXlzKQorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IHN1Yi5zaXplKCkgPT0gMgorICAgICAgICBhc3NlcnQgc3ViWydhJ10gPT0gMTIzCisgICAgICAgIGFzc2VydCBzdWJbJ2InXSA9PSA0NTYKKyAgICAgICAgYXNzZXJ0ICEgc3ViLmNvbnRhaW5zS2V5KCdjJykKKyAgICAgICAgCisgICAgICAgIGFzc2VydCBtYXAuZ2V0Q2xhc3MoKSA9PSBzdWIuZ2V0Q2xhc3MoKQorICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RMaXN0V2l0aGluQUxpc3RTeW50YXgoKSB7CisgICAgICAgIGRlZiBsaXN0ID0gWzEsIDIsIDMsIDQuLjEwLCA1LCA2XQorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IGxpc3Quc2l6ZSgpID09IDYKKyAgICAgICAgZGVmIHN1Ymxpc3QgPSBsaXN0WzNdCisgICAgICAgIGFzc2VydCBzdWJsaXN0ID09IDQuLjEwCisgICAgICAgIGFzc2VydCBzdWJsaXN0ID09IFs0LCA1LCA2LCA3LCA4LCA5LCAxMF0KKyAgICB9CisKKworICAgIHZvaWQgdGVzdEJlYW5Qcm9wZXJ0aWVzKCkgeworICAgICAgICBkZWYgZm9vID0gbmV3IEZvbygpCisKKyAgICAgICAgZm9vWyduYW1lJ10gPSAnR3JvbWl0JworCisgICAgICAgIGFzc2VydCBmb28ubmFtZSA9PSAnR3JvbWl0JworCisgICAgICAgIGRlZiB2YWx1ZSA9IGZvb1snbmFtZSddCisgICAgICAgIGFzc2VydCB2YWx1ZSA9PSAnR3JvbWl0JworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvU3dpdGNoVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1N3aXRjaFRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNjllZDYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1N3aXRjaFRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTk4IEBACitwYWNrYWdlIGdyb292eQorCitjbGFzcyBTd2l0Y2hUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCB0ZXN0U3dpdGNoKCkgeworICAgICAgICBjYWxsU3dpdGNoKCJmb28iLCAiZm9vIikKKyAgICAgICAgY2FsbFN3aXRjaCgiYmFyIiwgImJhcmZvbyIpCisgICAgICAgIGNhbGxTd2l0Y2goImJhcmJhciIsICJiYXJmb28iKQorICAgICAgICBjYWxsU3dpdGNoKCJkdW1teSIsICJkKiIpCisgICAgICAgIGNhbGxTd2l0Y2goInh5eiIsICJ4eXpEZWZhdWx0IikKKyAgICAgICAgY2FsbFN3aXRjaCgienp6IiwgIkRlZmF1bHQiKQorICAgICAgICBjYWxsU3dpdGNoKDQsICJMaXN0IikKKyAgICAgICAgY2FsbFN3aXRjaCg1LCAiTGlzdCIpCisgICAgICAgIGNhbGxTd2l0Y2goNiwgIkxpc3QiKQorICAgICAgICBjYWxsU3dpdGNoKCJpbkxpc3QiLCAiTGlzdCIpCisgICAgICAgIGNhbGxTd2l0Y2goMSwgIkludGVnZXIiKQorICAgICAgICBjYWxsU3dpdGNoKDEuMiwgIk51bWJlciIpCisgICAgICAgIGNhbGxTd2l0Y2gobnVsbCwgIm51bGwiKQorICAgICAgICBjYWxsU3dpdGNoKFsxLCAyLCAzXSwgIkxpc3RJbnRlcmZhY2UiKQorICAgIH0KKworICAgIGRlZiBjYWxsU3dpdGNoKHgsIGV4cGVjdGVkKSB7CisgICAgICAgIGRlZiByZXN1bHQgPSAiIgorICAgICAgICBzd2l0Y2ggKHgpIHsKKyAgICAgICAgICAgIGNhc2UgbnVsbDoKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAibnVsbCIKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICAgICBjYXNlIH4vZC4qLzoKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAiZCoiCisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAgICAgY2FzZSAiYmFyYmFyIjoKKyAgICAgICAgICAgIGNhc2UgImJhciI6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgImJhciIKKworICAgICAgICAgICAgY2FzZSAiZm9vIjoKKyAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAiZm9vIgorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgIGNhc2UgWzQsIDUsIDYsICdpbkxpc3QnXToKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAiTGlzdCIKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICAgICBjYXNlIEludGVnZXI6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gIkludGVnZXIiCisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAgICAgY2FzZSBOdW1iZXI6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gIk51bWJlciIKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICAgICBjYXNlIExpc3Q6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gIkxpc3RJbnRlcmZhY2UiCisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAgICAgY2FzZSAieHl6IjoKKyAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAieHl6IgorCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArICJEZWZhdWx0IgorICAgICAgICAgICAgICAgIC8vIHVubmVjZXNzYXJ5IGp1c3QgdGVzdGluZyBjb21waWxlcgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0IHJlc3VsdCA9PSBleHBlY3RlZCwgIkV4cGVjdGVkICRleHBlY3RlZCBidXQgZm91bmQgJHJlc3VsdCB3aGVuIGNhbGxpbmcgc3dpdGNoIHdpdGggJHgiCisgICAgfQorCisgICAgLy8gdGVzdCB0aGUgY29udGludWUgaW4gc3dpdGNoLCB3aGljaCBzaG91bGQganVtcCB0byB0aGUgdGhlIHdoaWxlIHN0YXJ0CisgICAgdm9pZCB0ZXN0U3dpdGNoU2NvcGUoKSB7CisgICAgICAgIGRlZiBpID0gMAorICAgICAgICBkZWYgaiA9IDAKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgIHN3aXRjaCAoaSkgeworICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGogKz0gaTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaSA9PSA1KSBicmVhazsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQgaiA9PSA2CisgICAgfQorCisgICAgdm9pZCB0ZXN0U3dpdGNoV2l0aENsb3N1cmUoKSB7CisgICAgICAgIHN3aXRjaCAoMCkgeworICAgICAgICAgICAgY2FzZSB7dHJ1ZX06IGJyZWFrCisgICAgICAgICAgICBkZWZhdWx0OiBhc3NlcnQgZmFsc2UKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKDApIHsKKyAgICAgICAgICAgIGNhc2Uge2ZhbHNlfTogYXNzZXJ0IGZhbHNlCisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoICgwKSB7CisgICAgICAgICAgICBjYXNlIHtpdCA9PSAwfTogYnJlYWsKKyAgICAgICAgICAgIGRlZmF1bHQ6IGFzc2VydCBmYWxzZQorICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoMCkgeworICAgICAgICAgICAgY2FzZSB7Y2FuZGlkYXRlIC0+IGNhbmRpZGF0ZSA9PSAwfTogYnJlYWsKKyAgICAgICAgICAgIGRlZmF1bHQ6IGFzc2VydCBmYWxzZQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqIG9sZGVyIHZlcnNpb25zIG9mIGdyb292eSBwcm9kdWNlZCBhIExpc3RFeHByZXNzaW9uIGZvciBhCisgICAgICAgIGZhbGwgdGhyb3VnaC4gdGhlIHJlc3VsdCB3YXMgdGhhdCBpdCB3b3JrZWQgaW4gc29tZSBjYXNlcworICAgICAgICBhbmQgaW4gb3RoZXIgY2FzZXMgbm90LiBGb3IgZXhhbXBsZSBub3QgZm9yIHBhdHRlcm5zICovCisgICAgdm9pZCB0ZXN0RmFsbHRocm91Z2hUb090aGVyQ2FzZVdpdGhOb0NvZGUoKSB7CisgICAgICAgIGRlZiBhID0gWydGaWxlTmFtZS5qYXZhJywgJ0Fub3RoZXJGaWxlTmFtZS5ncm9vdnknLCAnZm9vJ10KKyAgICAgICAgZGVmIGkgPSAwCisgICAgICAgIGEuZWFjaCB7CisgICAgICAgICAgICBzd2l0Y2ggKGl0KSB7CisgICAgICAgICAgICAgICAgY2FzZSB+Ly4qamF2YSQvOgorICAgICAgICAgICAgICAgIGNhc2Ugfi8uKmdyb292eSQvOgorICAgICAgICAgICAgICAgICAgICBpKysKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBpICs9IDEwCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzIDEyLCBpCisgICAgfQorCisgICAgdm9pZCB0ZXN0RmFsbHRocm91Z2hUb090aGVyQ2FzZVdpdGhDb2RlKCkgeworICAgICAgICBkZWYgYSA9IFsnRmlsZU5hbWUuamF2YScsICdBbm90aGVyRmlsZU5hbWUuZ3Jvb3Z5JywgJ2ZvbyddCisgICAgICAgIGRlZiBpID0gMAorICAgICAgICBhLmVhY2ggeworICAgICAgICAgICAgc3dpdGNoIChpdCkgeworICAgICAgICAgICAgICAgIGNhc2Ugfi8uKmphdmEkLzoKKyAgICAgICAgICAgICAgICAgICAgaSArPSA1CisgICAgICAgICAgICAgICAgY2FzZSB+Ly4qZ3Jvb3Z5JC86CisgICAgICAgICAgICAgICAgICAgIGkrKworICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGkgKz0gMTAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMgMTcsIGkKKyAgICB9CisKKyAgICB2b2lkIHRlc3RGYWxsdGhyb3VnaFRvRGVmYXVsdFdpdGhOb0NvZGUoKSB7CisgICAgICAgIGRlZiBhID0gWydGaWxlTmFtZS5qYXZhJywgJ0Fub3RoZXJGaWxlTmFtZS5ncm9vdnknLCAnZm9vJ10KKyAgICAgICAgZGVmIGkgPSAwCisgICAgICAgIGEuZWFjaCB7CisgICAgICAgICAgICBzd2l0Y2ggKGl0KSB7CisgICAgICAgICAgICAgICAgY2FzZSB+Ly4qamF2YSQvOgorICAgICAgICAgICAgICAgICAgICBpKysKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBjYXNlIH4vLipncm9vdnkkLzoKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBpICs9IDEwCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzIDIxLCBpCisgICAgfQorCisgICAgdm9pZCB0ZXN0RmFsbHRocm91Z2hUb0RlZmF1bHRXaXRoQ29kZSgpIHsKKyAgICAgICAgZGVmIGEgPSBbJ0ZpbGVOYW1lLmphdmEnLCAnQW5vdGhlckZpbGVOYW1lLmdyb292eScsICdmb28nXQorICAgICAgICBkZWYgaSA9IDAKKyAgICAgICAgYS5lYWNoIHsKKyAgICAgICAgICAgIHN3aXRjaCAoaXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIH4vLipqYXZhJC86CisgICAgICAgICAgICAgICAgICAgIGkrKworICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGNhc2Ugfi8uKmdyb292eSQvOgorICAgICAgICAgICAgICAgICAgICBpICs9IDUKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBpICs9IDEwCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzIDI2LCBpCisgICAgfQorCisgICAgdm9pZCB0ZXN0U3dpdGNoTm9TdGF0ZW1lbnRzQXRFbmQoKSB7CisgICAgICAgIGRlZiBhID0gWydGaWxlTmFtZS5qYXZhJywgJ0Fub3RoZXJGaWxlTmFtZS5ncm9vdnknLCAnZm9vJ10KKyAgICAgICAgZGVmIGkgPSAwCisgICAgICAgIGEuZWFjaCB7CisgICAgICAgICAgICBzd2l0Y2ggKGl0KSB7CisgICAgICAgICAgICAgICAgY2FzZSB+Ly4qamF2YSQvOgorICAgICAgICAgICAgICAgICAgICBpKysKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBjYXNlIH4vLipncm9vdnkkLzogYnJlYWsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMgMSwgaQorICAgICAgICBpID0gMAorICAgICAgICBhLmVhY2ggeworICAgICAgICAgICAgc3dpdGNoIChpdCkgeworICAgICAgICAgICAgICAgIGNhc2Ugfi8uKmphdmEkLzoKKyAgICAgICAgICAgICAgICAgICAgaSsrCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMgMSwgaQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1N3aXRjaFdpdGhEaWZmZXJlbnRUeXBlc1Rlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9Td2l0Y2hXaXRoRGlmZmVyZW50VHlwZXNUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDM5NGI3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9Td2l0Y2hXaXRoRGlmZmVyZW50VHlwZXNUZXN0Lmdyb292eQpAQCAtMCwwICsxLDEzNCBAQAorcGFja2FnZSBncm9vdnkKKworLyoqIAorICogQSB0ZXN0IGNhc2UgZm9yIHN3aXRjaCBzdGF0ZW1lbnQgd2l0aCBkaWZmZXJlbnQgdHlwZXMKKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworY2xhc3MgU3dpdGNoV2l0aERpZmZlcmVudFR5cGVzVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIHZvaWQgdGVzdFN3aXRjaFdpdGhJbnRWYWx1ZXMoKSB7CisgICAgICAgIGFzc2VydFN3aXRjaCgxLCAyLCAzLCA0KQorICAgIH0KKworICAgIHZvaWQgdGVzdFN3aXRjaFdpdGhEb3VibGVWYWx1ZXMoKSB7CisgICAgICAgIGFzc2VydFN3aXRjaCgxLjUsIDIuNCwgMy4yLCA0LjEpCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdFN3aXRjaFdpdGhTdHJpbmdWYWx1ZXMoKSB7CisgICAgICAgIGFzc2VydFN3aXRjaCgiYWJjIiwgImRlZiIsICJ4eXoiLCAidW5rbm93biIpCisgICAgfQorCisgICAgdm9pZCB0ZXN0U3dpdGNoV2l0aE1peGVkVHlwZVZhbHVlcygpIHsKKyAgICAgICAgYXNzZXJ0U3dpdGNoKCJhYmMiLCBuZXcgRGF0ZSgpLCA1LjMyLCAyMykKKyAgICB9CisKKyAgICB2b2lkIHRlc3RTd2l0Y2hXaXRoTWl4ZWROdW1iZXJWYWx1ZXMoKSB7CisgICAgICAgIGRlZiBpID0gMSBhcyBJbnRlZ2VyCisgICAgICAgIGRlZiBiaSA9IDEgYXMgQmlnSW50ZWdlcgorICAgICAgICBkZWYgYmQxID0gMS4wIGFzIEJpZ0RlY2ltYWwKKyAgICAgICAgZGVmIGJkMiA9IDEuMDAwMCBhcyBCaWdEZWNpbWFsCisgICAgICAgIGFzc2VydFN3aXRjaE1peGVkKGksIGJpLCAyLCAzKQorICAgICAgICBhc3NlcnRTd2l0Y2hNaXhlZChpLCBiZDEsIDIsIDMpCisgICAgICAgIGFzc2VydFN3aXRjaE1peGVkKGksIGJkMiwgMiwgMykKKyAgICAgICAgYXNzZXJ0U3dpdGNoTWl4ZWQoYmksIGksIDIsIDMpCisgICAgICAgIGFzc2VydFN3aXRjaE1peGVkKGJpLCBiZDEsIDIsIDMpCisgICAgICAgIGFzc2VydFN3aXRjaE1peGVkKGJpLCBiZDIsIDIsIDMpCisgICAgICAgIGFzc2VydFN3aXRjaE1peGVkKGJkMSwgaSwgMiwgMykKKyAgICAgICAgYXNzZXJ0U3dpdGNoTWl4ZWQoYmQxLCBiaSwgMiwgMykKKyAgICAgICAgYXNzZXJ0U3dpdGNoTWl4ZWQoYmQxLCBiZDIsIDIsIDMpCisgICAgICAgIGFzc2VydFN3aXRjaE1peGVkKGJkMiwgaSwgMiwgMykKKyAgICAgICAgYXNzZXJ0U3dpdGNoTWl4ZWQoYmQyLCBiaSwgMiwgMykKKyAgICAgICAgYXNzZXJ0U3dpdGNoTWl4ZWQoYmQyLCBiZDEsIDIsIDMpCisgICAgfQorICAgIAorICAgIHZvaWQgYXNzZXJ0U3dpdGNoTWl4ZWQoc3dpdGNoVmFsdWUsIG1hdGNoaW5nVmFsdWUsIG5vbm1hdGNoaW5nVmFsdWUxLCBub25tYXRjaGluZ1ZhbHVlMikgeworICAgICAgYXNzZXJ0U3dpdGNoTWF0Y2gxKHN3aXRjaFZhbHVlLCBtYXRjaGluZ1ZhbHVlLCBub25tYXRjaGluZ1ZhbHVlMSwgbm9ubWF0Y2hpbmdWYWx1ZTIpCisgICAgICBhc3NlcnRTd2l0Y2hNYXRjaDIoc3dpdGNoVmFsdWUsIG5vbm1hdGNoaW5nVmFsdWUxLCBtYXRjaGluZ1ZhbHVlLCBub25tYXRjaGluZ1ZhbHVlMikKKyAgICAgIGFzc2VydFN3aXRjaE1hdGNoMyhzd2l0Y2hWYWx1ZSwgbm9ubWF0Y2hpbmdWYWx1ZTEsIG5vbm1hdGNoaW5nVmFsdWUyLCBtYXRjaGluZ1ZhbHVlKQorICAgIH0KKyAgICAKKyAgICB2b2lkIGFzc2VydFN3aXRjaChhLCBiLCBjLCBkKSB7CisgICAgICAgIGFzc2VydFN3aXRjaE1hdGNoMShhLCBhLCBiLCBjKQorICAgICAgICBhc3NlcnRTd2l0Y2hNYXRjaDIoYiwgYSwgYiwgYykKKyAgICAgICAgYXNzZXJ0U3dpdGNoTWF0Y2gzKGMsIGEsIGIsIGMpCisgICAgICAgIGFzc2VydFN3aXRjaE1hdGNoRGVmYXVsdChkLCBhLCBiLCBjKQorICAgIH0KKyAgICAKKyAgICB2b2lkIGFzc2VydFN3aXRjaE1hdGNoMSh2YWx1ZSwgY2FzZTFWYWx1ZSwgY2FzZTJWYWx1ZSwgY2FzZTNWYWx1ZSkgeworICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7CisgICAgICAgICAgICBjYXNlIGNhc2UxVmFsdWU6IAorICAgICAgICAgICAgICAgIC8vIHdvcmtlZAorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBjYXNlIGNhc2UyVmFsdWU6IAorICAgICAgICAgICAgICAgIGZhaWxOb3RFcXVhbHModmFsdWUsIGNhc2UyVmFsdWUpCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGNhc2UgY2FzZTNWYWx1ZTogCisgICAgICAgICAgICAgICAgZmFpbE5vdEVxdWFscyh2YWx1ZSwgY2FzZTNWYWx1ZSkKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBmYWlsTm90RGVmYXVsdCh2YWx1ZSkKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBhc3NlcnRTd2l0Y2hNYXRjaDIodmFsdWUsIGNhc2UxVmFsdWUsIGNhc2UyVmFsdWUsIGNhc2UzVmFsdWUpIHsKKyAgICAgICAgc3dpdGNoICh2YWx1ZSkgeworICAgICAgICAgICAgY2FzZSBjYXNlMVZhbHVlOiAKKyAgICAgICAgICAgICAgICBmYWlsTm90RXF1YWxzKHZhbHVlLCBjYXNlMVZhbHVlKQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBjYXNlIGNhc2UyVmFsdWU6IAorICAgICAgICAgICAgICAgIC8vIHdvcmtlZAorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBjYXNlIGNhc2UzVmFsdWU6IAorICAgICAgICAgICAgICAgIGZhaWxOb3RFcXVhbHModmFsdWUsIGNhc2UzVmFsdWUpCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgZmFpbE5vdERlZmF1bHQodmFsdWUpCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICB2b2lkIGFzc2VydFN3aXRjaE1hdGNoMyh2YWx1ZSwgY2FzZTFWYWx1ZSwgY2FzZTJWYWx1ZSwgY2FzZTNWYWx1ZSkgeworICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7CisgICAgICAgICAgICBjYXNlIGNhc2UxVmFsdWU6IAorICAgICAgICAgICAgICAgIGZhaWxOb3RFcXVhbHModmFsdWUsIGNhc2UxVmFsdWUpCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGNhc2UgY2FzZTJWYWx1ZTogCisgICAgICAgICAgICAgICAgZmFpbE5vdEVxdWFscyh2YWx1ZSwgY2FzZTJWYWx1ZSkKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgY2FzZSBjYXNlM1ZhbHVlOiAKKyAgICAgICAgICAgICAgICAvLyB3b3JrZWQKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBmYWlsTm90RGVmYXVsdCh2YWx1ZSkKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHZvaWQgYXNzZXJ0U3dpdGNoTWF0Y2hEZWZhdWx0KHZhbHVlLCBjYXNlMVZhbHVlLCBjYXNlMlZhbHVlLCBjYXNlM1ZhbHVlKSB7CisgICAgICAgIHN3aXRjaCAodmFsdWUpIHsKKyAgICAgICAgICAgIGNhc2UgY2FzZTFWYWx1ZTogCisgICAgICAgICAgICAgICAgZmFpbE5vdEVxdWFscyh2YWx1ZSwgY2FzZTFWYWx1ZSkKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgY2FzZSBjYXNlMlZhbHVlOiAKKyAgICAgICAgICAgICAgICBmYWlsTm90RXF1YWxzKHZhbHVlLCBjYXNlMlZhbHVlKQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBjYXNlIGNhc2UzVmFsdWU6IAorICAgICAgICAgICAgICAgIGZhaWxOb3RFcXVhbHModmFsdWUsIGNhc2UzVmFsdWUpCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgLy8gd29ya2VkCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgZmFpbE5vdEVxdWFscyh2YWx1ZSwgZXhwZWN0ZWRDYXNlVmFsdWUpIHsKKyAgICAgICAgZmFpbCgidmFsdWU6ICIgKyB2YWx1ZSArICIgaXMgbm90IGVxdWFsIHRvIGNhc2UgdmFsdWU6ICIgKyBleHBlY3RlZENhc2VWYWx1ZSkKKyAgICB9CisKKyAgICB2b2lkIGZhaWxOb3REZWZhdWx0KHZhbHVlKSB7CisgICAgICAgIGZhaWwoInZhbHVlOiAiICsgdmFsdWUgKyAiIHNob3VsZCBub3QgbWF0Y2ggdGhlIGRlZmF1bHQgc3dpdGNoIGNsYXVzZSIgKQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvVGVzdEludGVycnVwdG9yLmphdmEgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1Rlc3RJbnRlcnJ1cHRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMDI0MjMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1Rlc3RJbnRlcnJ1cHRvci5qYXZhCkBAIC0wLDAgKzEsMTggQEAKK3BhY2thZ2UgZ3Jvb3Z5OworCitwdWJsaWMgY2xhc3MgVGVzdEludGVycnVwdG9yIGltcGxlbWVudHMgUnVubmFibGUgeworICAgIHByaXZhdGUgVGhyZWFkIGNhbGxlcjsKKworICAgIHB1YmxpYyBUZXN0SW50ZXJydXB0b3IoVGhyZWFkIGNhbGxlcikgeworICAgICAgICB0aGlzLmNhbGxlciA9IGNhbGxlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNsZWVwKDEwMCk7IC8vIGVuZm9yY2UgeWllbGQsIHNvIHdlIGhhdmUgc29tZXRoaW5nIHRvIGludGVycnVwdAorICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgfQorICAgICAgICBjYWxsZXIuaW50ZXJydXB0KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9UZXh0UHJvcGVydHlUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvVGV4dFByb3BlcnR5VGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTlhOTkwZQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvVGV4dFByb3BlcnR5VGVzdC5ncm9vdnkKQEAgLTAsMCArMSw0MyBAQAorcGFja2FnZSBncm9vdnkKKy8qKgorICogY2hlY2sgdGhhdCB0ZXh0IGRlZiBpcyBhdmFpbGFibGUgb24uLi4KKyAqCisgKiBteUZpbGUudGV4dCwgIG15RmlsZS50ZXh0KGNoYXJzZXQpLCAgCisgKiBteVVSTC50ZXh0LCAgbXlVUkwudGV4dChjaGFyc2V0KSwKKyAqIG15SW5wdXRTdHJlYW0udGV4dCwgIG15SW5wdXRTdHJlYW0udGV4dChjaGFyc2V0KSwKKyAqIG15UmVhZGVyLnRleHQsCisgKiBteUJ1ZmZlcmVkUmVhZGVyLnRleHQsCisgKiBteVByb2Nlc3MudGV4dAorICogCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqZXJlbXkucmF5bmVyQGJpZ2Zvb3QuY29tIj5KZXJlbXkgUmF5bmVyPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCisKK2NsYXNzIFRleHRQcm9wZXJ0eVRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisgICAgZGVmIG15UmVhZGVyCisgICAgZGVmIG15SW5wdXRTdHJlYW0KKyAgICBkZWYgbXlCaWdFbmRpYW5FbmNvZGVkSW5wdXRTdHJlYW0KKyAgICAKKyAgICB2b2lkIHNldFVwKCkgeworICAgICAgICBteVJlYWRlciA9IG5ldyBTdHJpbmdSZWFkZXIoImRpZ2VzdGl2ZSIpCisgICAgICAgIG15SW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oImNob2NvbGF0ZSBjaGlwIi5ieXRlcykKKyAgICAgICAgbXlCaWdFbmRpYW5FbmNvZGVkSW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oInNob3J0YnJlYWQiLmdldEJ5dGVzKCJVVEYtMTZCRSIpKQorICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RCaWdFbmRpYW5FbmNvZGVkSW5wdXRTdHJlYW1UZXh0KCkgeworICAgICAgICBhc3NlcnQgInNob3J0YnJlYWQiID09IG15QmlnRW5kaWFuRW5jb2RlZElucHV0U3RyZWFtLmdldFRleHQoIlVURi0xNkJFIikKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0SW5wdXRTdHJlYW1UZXh0KCkgeworICAgICAgICBhc3NlcnQgImNob2NvbGF0ZSBjaGlwIiA9PSBteUlucHV0U3RyZWFtLnRleHQKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0UmVhZGVyVGV4dCgpIHsKKyAgICAgICAgYXNzZXJ0ICJkaWdlc3RpdmUiID09IG15UmVhZGVyLnRleHQKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZWFyRG93bigpIHsKKyAgICAgICAgbXlJbnB1dFN0cmVhbSA9IG51bGwKKyAgICAgICAgbXlSZWFkZXIgPSBudWxsCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9UaGlzQW5kU3VwZXJUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvVGhpc0FuZFN1cGVyVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMwMjhmNgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvVGhpc0FuZFN1cGVyVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwxNTIgQEAKK3BhY2thZ2UgZ3Jvb3Z5DQorDQorY2xhc3MgVGhpc0FuZFN1cGVyVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlew0KKwl2b2lkIHRlc3RPdmVyd3JpdHRlblN1cGVyTWV0aG9kKCl7DQorCQlkZWYgaGVscGVyID0gbmV3IFRlc3RGb3JTdXBlckhlbHBlcjIoKQ0KKwkJYXNzZXJ0IGhlbHBlci5mb28oKSA9PSAyDQorCQlhc3NlcnQgaGVscGVyLmNhbGxGb29JblN1cGVyKCkgPT0gMQ0KKwl9DQorCQkNCisJdm9pZCB0ZXN0Q2xvc3VyZVVzaW5nU3VwZXJBbmRUaGlzKCl7DQorCQlkZWYgaGVscGVyID0gbmV3IFRlc3RGb3JTdXBlckhlbHBlcjIoKQ0KKwkJYXNzZXJ0IGhlbHBlci5hQ2xvc3VyZVVzaW5nVGhpcygpID09IDINCisJCWFzc2VydCBoZWxwZXIuYUNsb3N1cmVVc2luZ1N1cGVyKCkgPT0gMQ0KKyAgCQkvLyBhY2Nlc3NpbmcgcHJpdmF0ZSBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkDQorICAJCS8vIGJ5IGEgcHVibGljIG1ldGhvZCBvZiB0aGUgc2FtZSBuYW1lIGFuZCBzaWduYXR1cmUhDQorCQlhc3NlcnRFcXVhbHMgImJhciIsIGhlbHBlci5jbG9zdXJlVXNpbmdQcml2YXRlTWV0aG9kKCkgDQorCQlhc3NlcnQgaGVscGVyLmJhcigpID09ICJubyBiYXIiDQorCQkNCisJCWFzc2VydCBoZWxwZXIuYUZpZWxkID09ICJJIGFtIGEgZmllbGQiDQorCQloZWxwZXIuY2xvc3VyZUZpZWxkQWNjZXNzVXNpbmdJbXBsaWNpdFRoaXMoMSkNCisgICAgICAgIGFzc2VydCBoZWxwZXIuYUZpZWxkID09IDENCisgCQloZWxwZXIuY2xvc3VyZUZpZWxkQWNjZXNzVXNpbmdFeHBsaWNpdFRoaXMoMikNCisgCQlhc3NlcnQgaGVscGVyLmFGaWVsZCA9PSAyDQorCX0NCisJDQorCXZvaWQgdGVzdENsb3N1cmVEZWxlZ2F0ZUFuZFRoaXMoKXsNCisJCWRlZiBtYXAgPSBbOl0NCisJCWRlZiBoZWxwZXIgPSBuZXcgVGVzdEZvclN1cGVySGVscGVyMigpDQorCQkNCisJCWhlbHBlci5hRmllbGQgPSAiSSBhbSBhIGZpZWxkIg0KKwkJaGVscGVyLmNsb3N1cmVGaWVsZEFjY2Vzc1VzaW5nRXhwbGljaXRUaGlzLmRlbGVnYXRlID0gbWFwDQorCQloZWxwZXIuY2xvc3VyZUZpZWxkQWNjZXNzVXNpbmdFeHBsaWNpdFRoaXMoMykNCisgCQlhc3NlcnQgaGVscGVyLmFGaWVsZCA9PSAzDQorIAkJYXNzZXJ0IG1hcC5hRmllbGQgPT0gbnVsbA0KKw0KKwkJaGVscGVyLmFGaWVsZCA9ICJJIGFtIGEgZmllbGQiDQorCQloZWxwZXIuY2xvc3VyZUZpZWxkQWNjZXNzVXNpbmdJbXBsaWNpdFRoaXMuZGVsZWdhdGUgPSBtYXANCisJCWhlbHBlci5jbG9zdXJlRmllbGRBY2Nlc3NVc2luZ0ltcGxpY2l0VGhpcyg0KQ0KKyAJCWFzc2VydCBoZWxwZXIuYUZpZWxkID09IDQNCisgCQlhc3NlcnQgbWFwLmFGaWVsZCA9PSBudWxsDQorIAkJDQorIAkJZGVmIGNsb3N1cmUgPSB7dGhpcy5mb28gPSAxfQ0KKwkJc2hvdWxkRmFpbCB7DQorCQkgIGNsb3N1cmUoKQ0KKwkJfQ0KKwkJY2xvc3VyZS5kZWxlZ2F0ZSA9IG1hcA0KKwkJc2hvdWxkRmFpbCB7DQorCQkgIGNsb3N1cmUoKQ0KKwkJfQ0KKwkJYXNzZXJ0IG1hcC5mb28gPT0gbnVsbA0KKwkJDQorCQljbG9zdXJlID0ge2ZvbyA9IDF9DQorCQlzaG91bGRGYWlsIHsNCisJCSAgY2xvc3VyZSgpDQorCQl9DQorCQljbG9zdXJlLmRlbGVnYXRlID0gbWFwDQorCQljbG9zdXJlKCkNCisJCWFzc2VydCBtYXAuZm9vID09IDENCisJfQ0KKwkNCisJdm9pZCB0ZXN0Q29uc3RydWN0b3JDaGFpbigpIHsNCisJCWRlZiBoZWxwZXIgPSBuZXcgVGVzdEZvclN1cGVySGVscGVyNCgpDQorCQlhc3NlcnQgaGVscGVyLnggPT0gMQ0KKwkJaGVscGVyID0gbmV3IFRlc3RGb3JTdXBlckhlbHBlcjQoImZvbyIpDQorCQlhc3NlcnQgaGVscGVyLnggPT0gIk9iamVjdCINCisJfQ0KKwkNCisJdm9pZCB0ZXN0Q2hhaW5pbmdGb3JBc1R5cGUoKSB7DQorCQlkZWYgaGVscGVyID0gbmV3IFRlc3RGb3JTdXBlckhlbHBlcjEoKQ0KKwkJZGVmIHJldCA9IGhlbHBlciBhcyBPYmplY3RbXQ0KKwkJYXNzZXJ0IHJldCBpbnN0YW5jZW9mIE9iamVjdFtdDQorCQlhc3NlcnQgcmV0WzBdID09IGhlbHBlcg0KKwkJDQorCQlzaG91bGRGYWlsKENsYXNzQ2FzdEV4Y2VwdGlvbikgew0KKwkJICBoZWxwZXIgYXMgSW50ZWdlcg0KKwkJfQ0KKwl9DQorDQorICAgIHZvaWQgdGVzdFN1cGVyRWFjaCAoKSB7DQorICAgICAgICBkZWYgeCA9IG5ldyBUZXN0Rm9yU3VwZXJFYWNoKCkNCisgICAgICAgIHguZWFjaCB7DQorICAgICAgICAgICAgeC5yZXMgPDwgIkkgYW0gaXQ6ICR7aXQuY2xhc3MubmFtZX0iDQorICAgICAgICB9DQorDQorICAgICAgICBhc3NlcnRFcXVhbHMgMywgeC5yZXMuc2l6ZSgpDQorICAgICAgICBhc3NlcnRFcXVhbHMgInN0YXJ0IGVhY2ggaW4gc3ViY2xhc3MiLCB4LnJlcyBbMF0NCisgICAgICAgIGFzc2VydEVxdWFscyAiSSBhbSBpdDogZ3Jvb3Z5LlRlc3RGb3JTdXBlckVhY2giLCB4LnJlcyBbMV0NCisgICAgICAgIGFzc2VydEVxdWFscyAiZW5kIG9mIGVhY2ggaW4gc3ViY2xhc3MiLCB4LnJlcyBbMl0NCisgICAgfQ0KKw0KKyAgICB2b2lkIHRlc3REZ20gKCkgew0KKyAgICAgIGFzc2VydEVxdWFscyBBLmVtcHR5KCksICcxMjMnDQorICAgIH0NCit9DQorDQorY2xhc3MgQSB7DQorICAgc3RhdGljIHsNCisgICAgICAgQS5tZXRhQ2xhc3Muc3RhdGljLmVtcHR5IDw8IHsgLT4gJzEyMycgfQ0KKyAgIH0NCit9DQorDQorDQorY2xhc3MgVGVzdEZvclN1cGVyRWFjaCB7DQorICBkZWYgcmVzID0gW10NCisgICAgDQorICBkZWYgZWFjaChDbG9zdXJlIGMpIHsNCisgICAgICByZXMgPDwgInN0YXJ0IGVhY2ggaW4gc3ViY2xhc3MiDQorICAgICAgc3VwZXIuZWFjaChjKQ0KKyAgICAgIHJlcyA8PCAiZW5kIG9mIGVhY2ggaW4gc3ViY2xhc3MiDQorICB9DQorfQ0KKw0KK2NsYXNzIFRlc3RGb3JTdXBlckhlbHBlcjEgew0KKyAgZGVmIGZvbygpezF9DQorICBwcml2YXRlIGJhcigpeyJiYXIifQ0KKyAgZGVmIGNsb3N1cmVVc2luZ1ByaXZhdGVNZXRob2QoKSB7YmFyKCl9DQorICBkZWYgYXNUeXBlKENsYXNzIGMpIHsNCisgICAgaWYgKGM9PU9iamVjdFtdKSByZXR1cm4gW3RoaXNdIGFzIE9iamVjdFtdDQorICAgIHJldHVybiBzdXBlci5hc1R5cGUoYykNCisgIH0NCit9DQorDQorY2xhc3MgVGVzdEZvclN1cGVySGVscGVyMiBleHRlbmRzIFRlc3RGb3JTdXBlckhlbHBlcjF7DQorICBkZWYgZm9vKCl7Mn0NCisgIGRlZiBjYWxsRm9vSW5TdXBlcigpe3N1cGVyLmZvbygpfQ0KKyAgZGVmIGFDbG9zdXJlVXNpbmdTdXBlciA9IHtzdXBlci5mb28oKX0NCisgIGRlZiBhQ2xvc3VyZVVzaW5nVGhpcyA9IHt0aGlzLmZvbygpfQ0KKyAgZGVmIGJhcigpeyJubyBiYXIifQ0KKyAgcHVibGljIGFGaWVsZCA9ICJJIGFtIGEgZmllbGQiDQorICBkZWYgY2xvc3VyZUZpZWxkQWNjZXNzVXNpbmdJbXBsaWNpdFRoaXMgPSB7eC0+IGFGaWVsZD14fQ0KKyAgZGVmIGNsb3N1cmVGaWVsZEFjY2Vzc1VzaW5nRXhwbGljaXRUaGlzID0ge3gtPiB0aGlzLmFGaWVsZD14fQ0KK30NCisNCitjbGFzcyBUZXN0Rm9yU3VwZXJIZWxwZXIzIHsNCisgIGRlZiB4DQorICBUZXN0Rm9yU3VwZXJIZWxwZXIzKGludCBpKSB7DQorICAgIHRoaXMoIjEiKQ0KKyAgICB4PTENCisgIH0NCisgIFRlc3RGb3JTdXBlckhlbHBlcjMoT2JqZWN0IGopIHsNCisgICAgeCA9ICJPYmplY3QiDQorICB9DQorfQ0KKw0KK2NsYXNzIFRlc3RGb3JTdXBlckhlbHBlcjQgZXh0ZW5kcyBUZXN0Rm9yU3VwZXJIZWxwZXIzew0KKyAgVGVzdEZvclN1cGVySGVscGVyNCgpIHsNCisgICAgc3VwZXIoMSkNCisgIH0NCisgIFRlc3RGb3JTdXBlckhlbHBlcjQoT2JqZWN0IGopIHsNCisgICAgc3VwZXIoaikNCisgIH0NCit9DQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9UaHJvd1Rlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9UaHJvd1Rlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNzFjNzMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1Rocm93VGVzdC5ncm9vdnkKQEAgLTAsMCArMSwxOCBAQAorcGFja2FnZSBncm9vdnkKKworY2xhc3MgVGhyb3dUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworICAgIAorICAgIHZvaWQgdGVzdFRocm93KCkgeworICAgICAgICAKKyAgICAgICAgdHJ5IHsKKwkgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oImFiY2QiKQorCSAgICAgICAgCisJICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uIGJ5IG5vdyIpCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnQgZS5tZXNzYWdlID09ICJhYmNkIgorICAgICAgICAgICAgCisgICAgICAgICAgICBwcmludGxuKCJDYXVnaHQgZXhjZXB0aW9uICR7ZX0iKQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9Ub0FycmF5QnVnVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1RvQXJyYXlCdWdUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWY5YzY2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9Ub0FycmF5QnVnVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwyOSBAQAorcGFja2FnZSBncm9vdnkKKworY2xhc3MgVG9BcnJheUJ1Z1Rlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisgICAgCisgICAgdm9pZCB0ZXN0VG9BcnJheUJ1ZygpIHsKKyAgICAgICAgCisgICAgICAgIGRlZiBhcnJheSA9IGdldEFycmF5KCkKKworICAgICAgICBjYWxsQXJyYXlNZXRob2QoYXJyYXkpCisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCBkZWYgZ2V0QXJyYXkoKSB7CisgICAgICAgIGRlZiBsaXN0ID0gWzEsIDIsIDMsIDRdCisgICAgICAgIGRlZiBhcnJheSA9IGxpc3QudG9BcnJheSgpCisgICAgICAgIAorICAgICAgICBhc3NlcnQgYXJyYXkgIT0gbnVsbAorICAgICAgICAKKyAgICAgICAgcmV0dXJuIGFycmF5CisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCBkZWYgY2FsbEFycmF5TWV0aG9kKGFycmF5KSB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2FsbGVkIG1ldGhvZCB3aXRoICR7YXJyYXl9IikKKyAgICAgICAgCisgICAgICAgIGRlZiBsaXN0ID0gQXJyYXlzLmFzTGlzdChhcnJheSkKKyAgICAgICAgCisgICAgICAgIGFzc2VydCBsaXN0LnNpemUoKSA9PSA0CisgICAgICAgIGFzc2VydCBsaXN0ID09IFsxLCAyLCAzLCA0XQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvVHJpcGxlUXVvdGVkU3RyaW5nVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1RyaXBsZVF1b3RlZFN0cmluZ1Rlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMmE5MzQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1RyaXBsZVF1b3RlZFN0cmluZ1Rlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMjIgQEAKK3BhY2thZ2UgZ3Jvb3Z5CisKK2NsYXNzIFRyaXBsZVF1b3RlZFN0cmluZ1Rlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICB2b2lkIHRlc3RUcmlwbGVRdW90ZWRTdHJpbmcoKSB7CisgICAgICAgIGRlZiBzID0gIiIiCisgICAgICAgIExvdHMgb2YgJ3RleHQnIHdpdGggYSB2YXJpZXR5IG9mICIicXVvdGluZyAiIiBhbmQKKyAgIGEgZmV3IGxpbmVzCisgICAgYW5kIHNvbWUgZXNjYXBlZCBcIiIiIHF1b3RpbmcgYW5kCisgICAgYW4gZW5kaW5nIiIiLnRyaW0oKQorCisgICAgICAgIHByaW50bG4ocykKKyAgICAgICAgYXNzZXJ0IHMgIT0gbnVsbAorICAgICAgICBkZWYgaWR4ID0gcy5pbmRleE9mKCJxdW90aW5nIGFuZCIpCisgICAgICAgIGFzc2VydCBpZHggPiAwCisgICAgfQorCisgICAgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApIHsgCisgICAgICAgIGRlZiBvID0gbmV3IFRyaXBsZVF1b3RlZFN0cmluZ1Rlc3QoKTsKKyAgICAgICAgby50ZXN0VHJpcGxlUXVvdGVkU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9UcnlDYXRjaFRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9UcnlDYXRjaFRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MTY5YmEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1RyeUNhdGNoVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwxNTcgQEAKK3BhY2thZ2UgZ3Jvb3Z5CisKK2NsYXNzIFRyeUNhdGNoVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIGRlZiBleGNlcHRpb25DYWxsZWQKKyAgICBkZWYgZmluYWxseUNhbGxlZAorCQorICAgIHZvaWQgdGVzdFRyeUNhdGNoKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmFpbGluZ01ldGhvZCgpCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEFzc2VydGlvbkVycm9yIGUpIHsKKyAgICAgICAgICAgIG9uRXhjZXB0aW9uKGUpCisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgICBvbkZpbmFsbHkoKQorICAgICAgICB9CisgICAgICAgIGFmdGVyVHJ5Q2F0Y2goKQorICAgICAgICBhc3NlcnQgZXhjZXB0aW9uQ2FsbGVkICwgInNob3VsZCBoYXZlIGludm9rZWQgdGhlIGNhdGNoIGNsYXVzZSIKKyAgICAgICAgYXNzZXJ0IGZpbmFsbHlDYWxsZWQgLCAic2hvdWxkIGhhdmUgaW52b2tlZCB0aGUgZmluYWxseSBjbGF1c2UiCisgICAgICAgIHByaW50bG4oIkFmdGVyIHRyeS9jYXRjaCIpCisgICAgIH0KKworCisgICAgIHZvaWQgdGVzdFRyeUZpbmFsbHkoKSB7CisgICAgICAgICBCb29sZWFuIHRvdWNoZWQgPSBmYWxzZTsKKyAgICAgICAgIAorICAgICAgICAgdHJ5IHsKKyAgICAgICAgIH0KKyAgICAgICAgIGZpbmFsbHkgeworICAgICAgICAgICAgIHRvdWNoZWQgPSB0cnVlOworICAgICAgICAgfQorCisgICAgICAgICBhc3NlcnQgdG91Y2hlZCAsICJmaW5hbGx5IG5vdCBjYWxsZWQgd2l0aCBlbXB0eSB0cnkiCisgICAgIH0KKworICAgICB2b2lkIHRlc3RXb3JraW5nTWV0aG9kKCkgeworICAgICAgICAgdHJ5IHsKKwkgICAgCSB3b3JraW5nTWV0aG9kKCkKKwkgICAgIH0KKwkgICAgIGNhdGNoIChBc3NlcnRpb25FcnJvciBlKSB7CisJCSAgICAgb25FeGNlcHRpb24oZSkKKwkgICAgIH0KKwkgICAgIGZpbmFsbHkgeworCQkgICAgIG9uRmluYWxseSgpCisJICAgICB9CisJICAgICBhc3NlcnQgZXhjZXB0aW9uQ2FsbGVkID09IGZhbHNlICwgInNob3VsZCBub3QgaW52b2tlZCB0aGUgY2F0Y2ggY2xhdXNlIgorCSAgICAgYXNzZXJ0IGZpbmFsbHlDYWxsZWQgLCAic2hvdWxkIGhhdmUgaW52b2tlZCB0aGUgZmluYWxseSBjbGF1c2UiCisJICAgICBwcmludGxuKCJBZnRlciB0cnkvY2F0Y2giKQorICAgIH0KKyAgICAKKyAgICB2b2lkIGZhaWxpbmdNZXRob2QoKSB7CisgICAgICAgIGFzc2VydCBmYWxzZSAsICJGYWlsaW5nIG9uIHB1cnBvc2UiCisJfQorCQorICAgIHZvaWQgd29ya2luZ01ldGhvZCgpIHsKKyAgICAgICAgYXNzZXJ0IHRydWUgLCAiU2hvdWxkIG5ldmVyIGZhaWwiCisgICAgfQorICAgIAorICAgIHZvaWQgb25FeGNlcHRpb24oZSkgeworCSAgICBhc3NlcnQgZSAhPSBudWxsCisJICAgIGV4Y2VwdGlvbkNhbGxlZCA9IHRydWUKKwl9CisJCisgICAgdm9pZCBvbkZpbmFsbHkoKSB7CisgICAgICAgIGZpbmFsbHlDYWxsZWQgPSB0cnVlCisJfQorCisgICAgdm9pZCBhZnRlclRyeUNhdGNoKCkgeworICAgICAgICBhc3NlcnQgZXhjZXB0aW9uQ2FsbGVkICwgInNob3VsZCBoYXZlIGludm9rZWQgdGhlIGNhdGNoIGNsYXVzZSIgICAgICAgIAorICAgICAgICBhc3NlcnQgZmluYWxseUNhbGxlZCAsICJzaG91bGQgaGF2ZSBpbnZva2VkIHRoZSBmaW5hbGx5IGNsYXVzZSIKKyAgICAgICAgcHJpbnRsbigiQWZ0ZXIgdHJ5L2NhdGNoIikKKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGV4Y2VwdGlvbkNhbGxlZCA9IGZhbHNlCisgICAgICAgIGZpbmFsbHlDYWxsZWQgPSBmYWxzZQorICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RUcnlXaXRoUmV0dXJuV2l0aFByaW1pdGl2ZVR5cGVzKCkgeworICAgICAgYXNzZXJ0IGludFRyeSgpID09IDEKKyAgICAgIGFzc2VydCBsb25nVHJ5KCkgPT0gMgorICAgICAgYXNzZXJ0IGJ5dGVUcnkoKSA9PSAzCisgICAgICBhc3NlcnQgc2hvcnRUcnkoKSA9PSA0CisgICAgICBhc3NlcnQgY2hhclRyeSgpID09ICJjIgorICAgICAgYXNzZXJ0IGZsb2F0VHJ5KCkgPT0gMS4wCisgICAgICBhc3NlcnQgZG91YmxlVHJ5KCkgPT0gMi4wCisgICAgfQorICAgIAorICAgIGludCBpbnRUcnkoKXsKKyAgICAgIHRyeSB7CisgICAgICAgIHJldHVybiAxCisgICAgICB9IGZpbmFsbHkge30KKyAgICB9CisgICAgCisgICAgbG9uZyBsb25nVHJ5KCl7CisgICAgICB0cnkgeworICAgICAgICByZXR1cm4gMgorICAgICAgfSBmaW5hbGx5IHt9CisgICAgfQorICAgIAorICAgIGJ5dGUgYnl0ZVRyeSgpeworICAgICAgdHJ5IHsKKyAgICAgICAgcmV0dXJuIDMKKyAgICAgIH0gZmluYWxseSB7fQorICAgIH0KKyAgICAKKyAgICBzaG9ydCBzaG9ydFRyeSgpeworICAgICAgdHJ5IHsKKyAgICAgICAgcmV0dXJuIDQKKyAgICAgIH0gZmluYWxseSB7fQorICAgIH0KKyAgICAKKyAgICBjaGFyIGNoYXJUcnkoKXsKKyAgICAgIHRyeSB7CisgICAgICAgIHJldHVybiAnYycKKyAgICAgIH0gZmluYWxseSB7fQorICAgIH0KKyAgICAKKyAgICBmbG9hdCBmbG9hdFRyeSgpeworICAgICAgdHJ5IHsKKyAgICAgICAgcmV0dXJuIDEuMAorICAgICAgfSBmaW5hbGx5IHt9CisgICAgfQorICAgIAorICAgIGRvdWJsZSBkb3VibGVUcnkoKXsKKyAgICAgIHRyeSB7CisgICAgICAgIHJldHVybiAyLjAKKyAgICAgIH0gZmluYWxseSB7fQorICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RUcnlDYXRjaFdpdGhVbnR5cGVkKCl7CisgICAgICB0cnkgeworICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCk7CisgICAgICB9IGNhdGNoKGUpIHsKKyAgICAgICAgYXNzZXJ0IHRydWUKKyAgICAgICAgcmV0dXJuCisgICAgICB9CisgICAgICBhc3NlcnQgZmFsc2UKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0VHJ5Q2F0Y2hJbkNvbnN0cmN1dG9yKCkgeworICAgICAgLy8gdGhlIHN1cGVyKCkgY2FsbCBjb25zdHJ1Y3Rpb24gbGVmdCBhbgorICAgICAgLy8gZWxlbWVudCBvbiB0aGUgc3RhY2ssIGNhdXNpbmcgYSBpbmNvbnNpc2l0ZW50CisgICAgICAvLyBzdGFjayBoZWlnaHQgcHJvYmxlbSBmb3IgdGhlIHRyeS1jYXRjaAorICAgICAgLy8gdGhpcyBlbnN1cmVzIHRoZSBzdGFjayBpcyBjbGVhbiBhZnRlciB0aGUgY2FsbAorICAgICAgYXNzZXJ0U2NyaXB0ICIiIgorICAgICAgICBjbGFzcyBBIHsKKyAgICAgICAgICBBKCkgeworICAgICAgICAgICAgc3VwZXIoKQorICAgICAgICAgICAgdHJ5e31jYXRjaChlKXt9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFzc2VydCBudWxsICE9IG5ldyBBKCkKKyAgICAgICIiIgorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvVHlwZXNhZmVNZXRob2RUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvVHlwZXNhZmVNZXRob2RUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjNjOTg5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9UeXBlc2FmZU1ldGhvZFRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTQgQEAKK3BhY2thZ2UgZ3Jvb3Z5CisKK2NsYXNzIFR5cGVzYWZlTWV0aG9kVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIHZvaWQgdGVzdFR5cGVzYWZlTWV0aG9kKCkgeworICAgICAgICBkZWYgeSA9IHNvbWVNZXRob2QoMSkKKworICAgICAgICBhc3NlcnQgeSA9PSAyCisgICAgfQorCisgICAgSW50ZWdlciBzb21lTWV0aG9kKEludGVnZXIgaSkgeworICAgICAgICByZXR1cm4gaSArIDEKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1VuaXF1ZU9uQ29sbGVjdGlvblRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9VbmlxdWVPbkNvbGxlY3Rpb25UZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGRjYWIyCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9VbmlxdWVPbkNvbGxlY3Rpb25UZXN0Lmdyb292eQpAQCAtMCwwICsxLDcxIEBACitwYWNrYWdlIGdyb292eQorCitjbGFzcyBVbmlxdWVPbkNvbGxlY3Rpb25UZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisJdm9pZCB0ZXN0VW5pcXVlKCkgeworCQlkZWYgbGlzdCA9IFstMSwgMCwgMSwgMSwgMCwgLTFdCisgICAgICAgIGFzc2VydCBsaXN0LnVuaXF1ZSgpID09IFstMSwgMCwgMV0KKyAgICB9CisKKyAgICB2b2lkIHRlc3RVbmlxdWVPbkxpc3ROb0R1cGxzKCkgeworICAgIAlhc3NlcnQgW10udW5pcXVlKCkgPT0gW10KKyAgICAJYXNzZXJ0IFsxXS51bmlxdWUoKSA9PSBbMV0KKyAgICAJYXNzZXJ0IFsxLDJdLnVuaXF1ZSgpID09IFsxLDJdCisgICAgCWRlZiBhID0gWzEsMl0KKyAgICAJYXNzZXJ0IGEuaXMoYS51bmlxdWUoKSkKKyAgICB9CisKKyAgICB2b2lkIHRlc3RVbmlxdWVPbkxpc3RPbmVEdXBsKCkgeworICAgIAlhc3NlcnQgWzEsMV0udW5pcXVlKCkgPT0gWzFdCisgICAgCWRlZiBhID0gWzEsMV0KKyAgICAJYXNzZXJ0IGEuaXMoYS51bmlxdWUoKSkKKyAgICAJYXNzZXJ0IFsxLDIsMV0udW5pcXVlKCkgPT0gWzEsMl0KKyAgICAJYXNzZXJ0IFsxLDIsMSwxXS51bmlxdWUoKSA9PSBbMSwyXQorICAgIAlhc3NlcnQgWzEsMSwyXS51bmlxdWUoKSA9PSBbMSwyXQorICAgIAlhc3NlcnQgWzEsMSwyLDFdLnVuaXF1ZSgpID09IFsxLDJdCisgICAgCWFzc2VydCBbMSwxLDIsMSwxXS51bmlxdWUoKSA9PSBbMSwyXQorICAgIH0KKworICAgIHZvaWQgdGVzdFVuaXF1ZU9uTGlzdFR3b0R1cGxzKCkgeworICAgIAlhc3NlcnQgWzEsMSwyLDJdLnVuaXF1ZSgpID09IFsxLDJdCisgICAgCWRlZiBhID0gWzEsMSwyLDJdCisgICAgCWFzc2VydCBhLmlzKGEudW5pcXVlKCkpCisgICAgCWFzc2VydCBbMSwyLDEsMl0udW5pcXVlKCkgPT0gWzEsMl0KKyAgICAJYXNzZXJ0IFsxLDIsMSwxLDJdLnVuaXF1ZSgpID09IFsxLDJdCisgICAgCWFzc2VydCBbMSwxLDIsMl0udW5pcXVlKCkgPT0gWzEsMl0KKyAgICAJYXNzZXJ0IFsxLDEsMiwxLDJdLnVuaXF1ZSgpID09IFsxLDJdCisgICAgCWFzc2VydCBbMSwxLDIsMiwxLDEsMiwyXS51bmlxdWUoKSA9PSBbMSwyXQorICAgIH0KKworICAgIHZvaWQgdGVzdFVuaXF1ZU9uT3RoZXJDb2xsZWN0aW9ucygpIHsKKyAgICAJZGVmIGEgPSBuZXcgSGFzaFNldChbMSwxXSkKKyAgICAJYXNzZXJ0IGEuaXMoYS51bmlxdWUoKSkKKyAgICAJYXNzZXJ0IDEgPT0gYS5zaXplKCkKKyAgICAJYSA9IG5ldyBUcmVlU2V0KFsxLDFdKQorICAgIAlhc3NlcnQgYS5pcyhhLnVuaXF1ZSgpKQorICAgIAlhc3NlcnQgMSA9PSBhLnNpemUoKQorICAgIAlhID0gbmV3IFZlY3RvcihbMSwxXSkKKyAgICAJYXNzZXJ0IGEuaXMoYS51bmlxdWUoKSkKKyAgICAJYXNzZXJ0IDEgPT0gYS5zaXplKCkKKyAgICAJYSA9IG5ldyBMaW5rZWRMaXN0KFsxLDFdKQorICAgIAlhc3NlcnQgYS5pcyhhLnVuaXF1ZSgpKQorICAgIAlhc3NlcnQgMSA9PSBhLnNpemUoKQorICAgIH0KKworICAgIC8vIEdST09WWS0xMDA2CisgICAgdm9pZCB0ZXN0VW5pcXVlT25EaWZmZXJlbnRUeXBlcygpIHsKKyAgICAJZGVmIGEgPSBbMSwgMiwgKHNob3J0KTEsIDJMLCAyLjBdCisgICAgCWRlZiBiID0gYS51bmlxdWUoKQorICAgIAlhc3NlcnQgKGIgPT0gYSAmJiBhID09IFsxLCAyXSkKKyAgICAJYSA9IFtNYXRoLlBJLCAiZm9vIiwgMS4wLCAyTCwgKHNob3J0KTIsIDIuMEZdCisgICAgCWIgPSBhLnVuaXF1ZSgpCisgICAgCWFzc2VydCAoYiA9PSBhICYmIGEgPT0gW01hdGguUEksICJmb28iLCAxLjAsIDJMXSkKKyAgICB9CisKKyAgICAvLyBHUk9PVlktMTk1NgorICAgIHZvaWQgdGVzdFVuaXF1ZU9uTGlzdFdpdGhOdWxscygpIHsKKyAgICAJZGVmIHggPSBbMSwgMiwgMywgMSwgMiwgMywgbnVsbCwgJ2EnLCBudWxsXQorICAgIAl4LnVuaXF1ZSgpCisgICAgCWFzc2VydCB4ID09IFsxLCAyLCAzLCBudWxsLCAnYSddCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9VbmlxdWVPbkNvbGxlY3Rpb25XaXRoQ2xvc3VyZVRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9VbmlxdWVPbkNvbGxlY3Rpb25XaXRoQ2xvc3VyZVRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1NjM0YmYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1VuaXF1ZU9uQ29sbGVjdGlvbldpdGhDbG9zdXJlVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwyMiBAQAorcGFja2FnZSBncm9vdnkKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhZWwgQmFlaHIKKyAqLworY2xhc3MgVW5pcXVlT25Db2xsZWN0aW9uV2l0aENsb3N1cmVUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgLy8gR1JPT1ZZLTEyMzYKKyAgICB2b2lkIHRlc3RVbmlxdWVXaXRoVHdvUGFyYW1ldGVyQ2xvc3VyZSgpIHsKKyAgICAgICAgZGVmIGxpc3QgPSBbLTEsIDAsIDEsIDEsIDAsIC0xXQorICAgICAgICBkZWYgY2xvc3VyZSA9IHthLGIgLT4gTWF0aC5hYnMoYSkgPD0+IE1hdGguYWJzKGIpfQorICAgICAgICBhc3NlcnQgbGlzdC51bmlxdWUoY2xvc3VyZSkgPT0gWy0xLCAwXQorICAgIH0KKworICAgIC8vIEdST09WWS0xMjM2CisgICAgdm9pZCB0ZXN0VW5pcXVlV2l0aE9uZVBhcmFtZXRlckNsb3N1cmUoKSB7CisgICAgICAgIGRlZiBsaXN0ID0gWy0xLCAwLCAxLCAxLCAwLCAtMV0KKyAgICAgICAgZGVmIGNsb3N1cmUgPSB7YSAtPiBNYXRoLmFicyhhKX0KKyAgICAgICAgYXNzZXJ0IGxpc3QudW5pcXVlKGNsb3N1cmUpID09IFstMSwgMF0KKyAgICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1VuaXF1ZU9uQ29sbGVjdGlvbldpdGhDb21wYXJhdG9yVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1VuaXF1ZU9uQ29sbGVjdGlvbldpdGhDb21wYXJhdG9yVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhhYjBjZgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvVW5pcXVlT25Db2xsZWN0aW9uV2l0aENvbXBhcmF0b3JUZXN0Lmdyb292eQpAQCAtMCwwICsxLDEzIEBACitwYWNrYWdlIGdyb292eQ0KKw0KKy8qKiANCisgKiBAYXV0aG9yIE1pY2hhZWwgQmFlaHINCisgKi8NCitjbGFzcyBVbmlxdWVPbkNvbGxlY3Rpb25XaXRoQ29tcGFyYXRvclRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7DQorICAgIA0KKyAgICB2b2lkIHRlc3RVbmlxdWVXaXRoQ29tcGFyYXRvcigpIHsNCisgICAgICAgIGRlZiBsaXN0ID0gWy0xLCAwLCAxLCAxLCAwLCAtMV0NCisgICAgICAgIGRlZiBjb21wYXJhdG9yID0gbmV3IENsb3N1cmVDb21wYXJhdG9yKCkge2EsYiAtPiBNYXRoLmFicyhhKSA8PT4gTWF0aC5hYnMoYil9DQorICAgICAgICBhc3NlcnQgbGlzdC51bmlxdWUoY29tcGFyYXRvcikgPT0gWy0xLCAwXQ0KKyAgICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvVW5pdFRlc3RBc1NjcmlwdFRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9Vbml0VGVzdEFzU2NyaXB0VGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYwZjkzYQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvVW5pdFRlc3RBc1NjcmlwdFRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsNCBAQAorYSA9IDEyMworYSAqPSAyCitwcmludGxuICJSdW5uaW5nIHVuaXQgdGVzdCB3aXRoIGEgPSAke2F9IgorYXNzZXJ0IGEgPT0gMjQ2CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1Vuc2FmZU5hdmlnYXRpb25UZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvVW5zYWZlTmF2aWdhdGlvblRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMTIyZTUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1Vuc2FmZU5hdmlnYXRpb25UZXN0Lmdyb292eQpAQCAtMCwwICsxLDE2IEBACitwYWNrYWdlIGdyb292eQorCitjbGFzcyBVbnNhZmVOYXZpZ2F0aW9uVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIHZvaWQgdGVzdFVuc2FmZVByb3BlcnR5TmF2aWdhdGlvbnMoKSB7CisgICAgICAgIGRlZiB4ID0gbnVsbAorICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGRlZiB5ID0geC5mb28KKyAgICAgICAgICAgIGZhaWwoInNob3VsZCBmYWlsIikKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0IGUgIT0gbnVsbAorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9WQXJnc1Rlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9WQXJnc1Rlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNjgyNGIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1ZBcmdzVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwxMzEgQEAKK3BhY2thZ2UgZ3Jvb3Z5CisKK2NsYXNzIFZBcmdzVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICBkZWYgcHJpbWl0aXZlTWV0aG9kKCl7MH0KKyAgZGVmIHByaW1pdGl2ZU1ldGhvZChpbnQgaSkgezF9ICAKKyAgZGVmIHByaW1pdGl2ZU1ldGhvZChpbnQgaSwgaW50IGopIHsyfQorICBkZWYgcHJpbWl0aXZlTWV0aG9kKGludFtdIGlzKSB7MTAraXMubGVuZ3RofQorICAKKyAgdm9pZCB0ZXN0UHJpbWl0aXZlTWV0aG9kKCkgeworICAgIGFzc2VydCBwcmltaXRpdmVNZXRob2QoKT09MAorICAgIGFzc2VydCBwcmltaXRpdmVNZXRob2QoMSk9PTEKKyAgICBhc3NlcnQgcHJpbWl0aXZlTWV0aG9kKDEsMSk9PTIKKyAgICBhc3NlcnQgcHJpbWl0aXZlTWV0aG9kKDEsMSwxKT09MTMgCisgICAgYXNzZXJ0IHByaW1pdGl2ZU1ldGhvZChbMSwyLDIsMl0gYXMgaW50W10pPT0xNAorICB9ICAKKworICBkZWYgZG91YmxlTWV0aG9kKGRvdWJsZVtdIGlkKSB7MjAraWQubGVuZ3RofQorICAgIAorICB2b2lkIHRlc3REb3VibGVNZXRob2QoKSB7CisgICAgLy8gd2l0aCBCaWdEZWNpbWFsCisgICAgYXNzZXJ0IGRvdWJsZU1ldGhvZCgpPT0yMAorICAgIGFzc2VydCBkb3VibGVNZXRob2QoMS4wRyk9PTIxCisgICAgYXNzZXJ0IGRvdWJsZU1ldGhvZCgxLjBHLDEuMEcpPT0yMgorICAgIGFzc2VydCBkb3VibGVNZXRob2QoMS4wRywxLjBHLDEuMEcpPT0yMyAKKyAgICBhc3NlcnQgZG91YmxlTWV0aG9kKFsxLDIsMiwyXSBhcyBCaWdEZWNpbWFsW10pPT0yNAorICAgIAorICAgIC8vIHdpdGggZG91YmxlCisgICAgYXNzZXJ0IGRvdWJsZU1ldGhvZCgpPT0yMAorICAgIGFzc2VydCBkb3VibGVNZXRob2QoMS4wZCk9PTIxCisgICAgYXNzZXJ0IGRvdWJsZU1ldGhvZCgxLjBkLDEuMGQpPT0yMgorICAgIGFzc2VydCBkb3VibGVNZXRob2QoMS4wZCwxLjBkLDEuMGQpPT0yMyAKKyAgICBhc3NlcnQgZG91YmxlTWV0aG9kKFsxLDIsMiwyXSBhcyBkb3VibGVbXSk9PTI0CisgICAgCisgIH0KKyAgCisgIGRlZiBvYmplY3RNZXRob2QoKXswfQorICBkZWYgb2JqZWN0TWV0aG9kKE9iamVjdCBpKSB7MX0gIAorICBkZWYgb2JqZWN0TWV0aG9kKE9iamVjdCBpLCBPYmplY3QgaikgezJ9CisgIGRlZiBvYmplY3RNZXRob2QoT2JqZWN0W10gaXMpIHsxMCtpcy5sZW5ndGh9CisgIAorICB2b2lkIHRlc3RPYmplY3RNZXRob2QoKSB7CisgICAgYXNzZXJ0IG9iamVjdE1ldGhvZCgpPT0wCisgICAgYXNzZXJ0IG9iamVjdE1ldGhvZCgxKT09MQorICAgIGFzc2VydCBvYmplY3RNZXRob2QoMSwxKT09MgorICAgIGFzc2VydCBvYmplY3RNZXRob2QoMSwxLDEpPT0xMworICAgIGFzc2VydCBvYmplY3RNZXRob2QoWzEsMiwyLDJdIGFzIE9iamVjdFtdKT09MTQKKyAgfQorICAKKyAgZGVmIGdzdHJpbmdNZXRob2QoR1N0cmluZ1tdIGdzdHJpbmdzKXtnc3RyaW5ncy5sZW5ndGh9CisgIAorICB2b2lkIHRlc3RHU3RyaW5nVmFyZ3NNZXRob2QoKSB7CisgICAgZGVmIGNvbnRlbnQgPSAxCisgICAgZGVmIGdzdHJpbmcgPSIkY29udGVudCIKKyAgICBhc3NlcnQgZ3N0cmluZ01ldGhvZCgpID09IDAKKyAgICBhc3NlcnQgZ3N0cmluZ01ldGhvZChnc3RyaW5nKSA9PSAxCisgICAgYXNzZXJ0IGdzdHJpbmdNZXRob2QoZ3N0cmluZyxnc3RyaW5nLGdzdHJpbmcpID09IDMKKyAgICBhc3NlcnQgZ3N0cmluZ01ldGhvZChbZ3N0cmluZ10gYXMgR1N0cmluZ1tdKSA9PSAxCisgIH0KKyAgCisgIGRlZiBzdHJpbmdNZXRob2QoU3RyaW5nW10gc3RyaW5ncykge3N0cmluZ3MubGVuZ3RofQorICAKKyAgdm9pZCB0ZXN0U3RyaW5nTWV0aG9kKCkgeworICAgIGRlZiBjb250ZW50ID0gMQorICAgIGRlZiBnc3RyaW5nID0iJGNvbnRlbnQiCisgICAgYXNzZXJ0IHN0cmluZ01ldGhvZCgpID09IDAKKyAgICBhc3NlcnQgc3RyaW5nTWV0aG9kKGdzdHJpbmcpID09IDEKKyAgICBhc3NlcnQgc3RyaW5nTWV0aG9kKGdzdHJpbmcsZ3N0cmluZyxnc3RyaW5nKSA9PSAzCisgICAgYXNzZXJ0IHN0cmluZ01ldGhvZChbZ3N0cmluZ10gYXMgR1N0cmluZ1tdKSA9PSAxCisgICAgYXNzZXJ0IHN0cmluZ01ldGhvZCgpID09IDAKKyAgICBhc3NlcnQgc3RyaW5nTWV0aG9kKCJhIikgPT0gMQorICAgIGFzc2VydCBzdHJpbmdNZXRob2QoImEiLCJhIiwiYSIpID09IDMKKyAgICBhc3NlcnQgc3RyaW5nTWV0aG9kKFsiYSJdIGFzIFN0cmluZ1tdKSA9PSAxCisgIH0KKyAgCisgIC8vdGVzdHMgcmVsYXRlZCB0byBHUk9PVlktMTgwNworICAKKyAgZGVmIG92ZXJsb2FkZWRNZXRob2QxKFN0cmluZyBzKXsxfQorICBkZWYgb3ZlcmxvYWRlZE1ldGhvZDEoT2JqZWN0W10gYXJncyl7Mn0KKyAgCisgIHZvaWQgdGVzdE92ZXJsb2FkZWRNZXRob2QxKCkgeworICAgIGFzc2VydCBvdmVybG9hZGVkTWV0aG9kMSgpID09IDIKKyAgfQorICAKKyAgZGVmIG92ZXJsb2FkZWRNZXRob2QyKHgseSl7MX0KKyAgZGVmIG92ZXJsb2FkZWRNZXRob2QyKHgsT2JqZWN0Li4uIHkpezJ9CisgIAorICB2b2lkIHRlc3RPdmVybG9hZGVkTWV0aG9kMigpIHsKKyAgICBhc3NlcnQgb3ZlcmxvYWRlZE1ldGhvZDIobnVsbCkgPT0gMgorICAgIGFzc2VydCBvdmVybG9hZGVkTWV0aG9kMigiZm9vIikgPT0gMgorICB9CisgIAorICBkZWYgbm9ybWFsVmFyZ3NNZXRob2QoT2JqZWN0W10gYSl7YS5sZW5ndGh9CisgIAorICB2b2lkIHRlc3RBcnJheUNvZXJjaW9uKCkgeworICAgIGFzc2VydCBub3JtYWxWYXJnc01ldGhvZChbMSwyLDNdIGFzIGludFtdKSA9PSAzCisgIH0KKyAgCisgIAorICAvLyBHUk9PVlktMjIwNAorICBkZWYgbTIyMDRhKE1hcCBrd2FyZ3M9WzpdLCBhcmcxLCBhcmcyLCBPYmplY3RbXSBhcmdzKSB7CisgICAgImFyZzE6ICRhcmcxLCBhcmcyOiAkYXJnMiwgYXJnczogJGFyZ3MsIGt3YXJnczogJGt3YXJncyIKKyAgfQorCisgIGRlZiBtMjIwNGIoTWFwIGt3YXJncz1bOl0sIGFyZzEsIGFyZzI9IjEiLCBPYmplY3RbXSBhcmdzKSB7CisgICAgImFyZzE6ICRhcmcxLCBhcmcyOiAkYXJnMiwgYXJnczogJGFyZ3MsIGt3YXJnczogJGt3YXJncyIKKyAgfQorCisgIHZvaWQgdGVzdDIyMDRhKCkgeworICAgICBhc3NlcnQgbTIyMDRhKCdoZWxsbycsICd3b3JsZCcpID09ICdhcmcxOiBoZWxsbywgYXJnMjogd29ybGQsIGFyZ3M6IHt9LCBrd2FyZ3M6IFs6XScKKyAgICAgYXNzZXJ0IG0yMjA0YSgnaGVsbG8nLCAnd29ybGQnLCAnZnJvbScsICdsaXN0JykgPT0gJ2FyZzE6IGhlbGxvLCBhcmcyOiB3b3JsZCwgYXJnczogeyJmcm9tIiwgImxpc3QifSwga3dhcmdzOiBbOl0nCisgICAgIGFzc2VydCBtMjIwNGEoJ2hlbGxvJywgJ3dvcmxkJywgJ2Zyb20nLCAnbGlzdCcsIGZyb206ICdrd2FyZ3MnKSA9PSAnYXJnMTogaGVsbG8sIGFyZzI6IHdvcmxkLCBhcmdzOiB7ImZyb20iLCAibGlzdCJ9LCBrd2FyZ3M6IFsiZnJvbSI6Imt3YXJncyJdJworICAgICBhc3NlcnQgbTIyMDRhKCdoZWxsbycsICd3b3JsZCcsIGZyb206ICdrd2FyZ3MnKSA9PSAnYXJnMTogaGVsbG8sIGFyZzI6IHdvcmxkLCBhcmdzOiB7fSwga3dhcmdzOiBbImZyb20iOiJrd2FyZ3MiXScKKyAgICAgCisgICAgIGFzc2VydCBtMjIwNGIoJ2hlbGxvJywgJ3dvcmxkJykgPT0gJ2FyZzE6IGhlbGxvLCBhcmcyOiAxLCBhcmdzOiB7IndvcmxkIn0sIGt3YXJnczogWzpdJworICAgICBhc3NlcnQgbTIyMDRiKCdoZWxsbycsICd3b3JsZCcsICdmcm9tJywgJ2xpc3QnKSA9PSAnYXJnMTogaGVsbG8sIGFyZzI6IDEsIGFyZ3M6IHsid29ybGQiLCAiZnJvbSIsICJsaXN0In0sIGt3YXJnczogWzpdJworICAgICBhc3NlcnQgbTIyMDRiKCdoZWxsbycsICd3b3JsZCcsICdmcm9tJywgJ2xpc3QnLCBmcm9tOiAna3dhcmdzJykgPT0gJ2FyZzE6IGhlbGxvLCBhcmcyOiB3b3JsZCwgYXJnczogeyJmcm9tIiwgImxpc3QifSwga3dhcmdzOiBbImZyb20iOiJrd2FyZ3MiXScKKyAgICAgYXNzZXJ0IG0yMjA0YignaGVsbG8nLCAnd29ybGQnLCBmcm9tOiAna3dhcmdzJykgPT0gJ2FyZzE6IGhlbGxvLCBhcmcyOiB3b3JsZCwgYXJnczoge30sIGt3YXJnczogWyJmcm9tIjoia3dhcmdzIl0nCisgIH0KKworIAorICAvLyBHUk9PVlktMjM1MQorICAKKyAgZGVmIG0yMzUxKE9iamVjdC4uLiBhcmdzKSAgezF9CisgIGRlZiBtMjM1MShJbnRlZ2VyLi4uIGFyZ3MpIHsyfQorIAorICB2b2lkIHRlc3QyMzUxKCkgeworICAgIGFzc2VydCBtMjM1MSgxLCAyLCAzLCA0LCA1KSA9PSAyCisgIH0KKyAgCit9ICAKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvVmFyYXJnc01ldGhvZFRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9WYXJhcmdzTWV0aG9kVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ1M2M5NgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvVmFyYXJnc01ldGhvZFRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsNjkgQEAKK3BhY2thZ2UgZ3Jvb3Z5CisKKy8qKiAKKyAqIFZhcmFyZ3NNZXRob2RUZXN0Lmdyb292eQorICoKKyAqICAgMSkgVGVzdCB0byBmaXggdGhlIEppcmEgaXNzdWVzIEdST09WWS0xMDIzIGFuZCBHUk9PVlktMTAyNi4KKyAqICAgMikgVGVzdCB0aGUgZmVhdHVyZSB0aGF0IHRoZSBsZW5ndGggb2YgYXJndW1lbnRzIGNhbiBiZSB2YXJpYWJsZQorICogICAgICB3aGVuIGludm9raW5nIG1ldGhvZHMgd2l0aCBvciB3aXRob3V0IHBhcmFtZXRlcnMuCisgKgorICogQGF1dGhvciBEaWVyayBLb2VuaWcKKyAqIEBhdXRob3IgUGlsaG8gS2ltCisgKiBAYXV0aG9yIEhlaW4gTWVsaW5nCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KKworY2xhc3MgVmFyYXJnc01ldGhvZFRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7ICAKKworICAgIHZvaWQgdGVzdFZhcmFyZ3NPbmx5KCkgeyAgCisgICAgICAgIGFzc2VydEVxdWFscyAxLCB2YXJhcmdzT25seU1ldGhvZCgnJykgIAorICAgICAgICBhc3NlcnRFcXVhbHMgMSwgdmFyYXJnc09ubHlNZXRob2QoMSkgIAorICAgICAgICBhc3NlcnRFcXVhbHMgMiwgdmFyYXJnc09ubHlNZXRob2QoJycsJycpICAKKyAgICAgICAgYXNzZXJ0RXF1YWxzIDEsIHZhcmFyZ3NPbmx5TWV0aG9kKCBbJycsJyddICkgIAorICAgICAgICBhc3NlcnRFcXVhbHMgMiwgdmFyYXJnc09ubHlNZXRob2QoIFsnJywnJ10gYXMgT2JqZWN0W10pICAKKyAgICAgICAgYXNzZXJ0RXF1YWxzIDIsIHZhcmFyZ3NPbmx5TWV0aG9kKCAqWycnLCcnXSApICAKKworICAgICAgICAvLyB0b2RvOiBHUk9PVlktMTAyMworICAgICAgICBhc3NlcnRFcXVhbHMgMCwgdmFyYXJnc09ubHlNZXRob2QoKQorCisgICAgICAgIC8vIHRvZG86IEdST09WWS0xMDI2CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgdmFyYXJnc09ubHlNZXRob2QobnVsbCkpCisgICAgICAgIGFzc2VydEVxdWFscygyLCB2YXJhcmdzT25seU1ldGhvZChudWxsLCBudWxsKSkKKyAgICAgfSAgCisKKyAgICAgSW50ZWdlciB2YXJhcmdzT25seU1ldGhvZChPYmplY3RbXSBhcmdzKSB7ICAKKyAgICAgICAgIHByaW50bG4oImFyZ3MgPSAiICsgYXJncykKKyAgICAgICAgIC8vICgxKSB0b2RvOiBHUk9PVlktMTAyMyAoSmF2YSA1IGZlYXR1cmUpCisgICAgICAgICAvLyAgICAgSWYgdGhpcyBtZXRob2QgaGF2aW5nIHZhcmFyZ3MgaXMgaW52b2tlZCB3aXRoIG5vIHBhcmFtZXRlciwKKyAgICAgICAgIC8vICAgICB0aGVuIGFyZ3MgaXMgbm90IG51bGwsIGJ1dCBhbiBhcnJheSBvZiBsZW5ndGggMC4KKyAgICAgICAgIC8vICgyKSB0b2RvOiBHUk9PVlktMTAyNiAoSmF2YSA1IGZlYXR1cmUpCisgICAgICAgICAvLyAgICAgSWYgdGhpcyBtZXRob2QgaGF2aW5nIHZhcmFyZ3MgaXMgaW52b2tlZCB3aXRoIG9uZSBwYXJhbWV0ZXIKKyAgICAgICAgIC8vICAgICBudWxsLCB0aGVuIGFyZ3MgaXMgbnVsbCwgYW5kIHNvIC0xIGlzIHJldHVybmVkIGhlcmUuCisgICAgICAgICBpZiAoYXJncyA9PSBudWxsKQorICAgICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgICByZXR1cm4gYXJncy5zaXplKCkgIAorICAgICB9ICAKKyAgCisgICAgIHZvaWQgdGVzdFZhcmFyZ3NMYXN0KCkgeyAgCisgICAgICAgICBhc3NlcnRFcXVhbHMgMCwgdmFyYXJnc0xhc3RNZXRob2QoJycpICAKKyAgICAgICAgIGFzc2VydEVxdWFscyAwLCB2YXJhcmdzTGFzdE1ldGhvZCgxKSAgCisgICAgICAgICBhc3NlcnRFcXVhbHMgMSwgdmFyYXJnc0xhc3RNZXRob2QoJycsJycpICAKKyAgICAgICAgIGFzc2VydEVxdWFscyAyLCB2YXJhcmdzTGFzdE1ldGhvZCgnJywnJywnJykgIAorICAgICAgICAgYXNzZXJ0RXF1YWxzIDEsIHZhcmFyZ3NMYXN0TWV0aG9kKCcnLCBbJycsJyddICkgIAorICAgICAgICAgYXNzZXJ0RXF1YWxzIDIsIHZhcmFyZ3NMYXN0TWV0aG9kKCcnLCBbJycsJyddIGFzIE9iamVjdFtdKSAgCisgICAgICAgICBhc3NlcnRFcXVhbHMgMiwgdmFyYXJnc0xhc3RNZXRob2QoJycsICpbJycsJyddICkgIAorCisgICAgICAgICAvLyB0b2RvOiBHUk9PVlktMTAyNgorICAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCB2YXJhcmdzTGFzdE1ldGhvZCgnJyxudWxsKSkKKyAgICAgICAgIGFzc2VydEVxdWFscygyLCB2YXJhcmdzTGFzdE1ldGhvZCgnJyxudWxsLCBudWxsKSkKKyAgICAgfSAgCisgIAorICAgICBJbnRlZ2VyIHZhcmFyZ3NMYXN0TWV0aG9kKE9iamVjdCBmaXJzdCwgT2JqZWN0W10gYXJncykgeyAgCisgICAgICAgICAvLyAoMSkgdG9kbzogR1JPT1ZZLTEwMjYgKEphdmEgNSBmZWF0dXJlKQorICAgICAgICAgLy8gICAgIElmIHRoaXMgbWV0aG9kIGhhdmluZyB2YXJhcmdzIGlzIGludm9rZWQgd2l0aCB0d28gcGFyYW1ldGVycworICAgICAgICAgLy8gICAgIDEgYW5kIG51bGwsIHRoZW4gYXJncyBpcyBudWxsLCBhbmQgc28gLTEgaXMgcmV0dXJuZWQgaGVyZS4KKyAgICAgICAgIGlmIChhcmdzID09IG51bGwpCisgICAgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgIHJldHVybiBhcmdzLnNpemUoKSAgCisgICAgIH0gIAorfSAgCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1ZlcmJhdGltR1N0cmluZ1Rlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9WZXJiYXRpbUdTdHJpbmdUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWFkY2E3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9WZXJiYXRpbUdTdHJpbmdUZXN0Lmdyb292eQpAQCAtMCwwICsxLDYwIEBACitwYWNrYWdlIGdyb292eQorCitjbGFzcyBWZXJiYXRpbUdTdHJpbmdUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCB0ZXN0V2l0aE9uZVZhcmlhYmxlKCkgeworICAgICAgICAKKyAgICAgICAgZGVmIG5hbWUgPSAiQm9iIgorICAgICAgICAKKyAgICAgICAgZGVmIHRlbXBsYXRlID0gIiIiCitoZWxsbyAke25hbWV9IGhvdyBhcmUgeW91PworIiIiCisKKyAgICAgICAgYXNzZXJ0IHRlbXBsYXRlIGluc3RhbmNlb2YgR1N0cmluZworCisgICAgICAgIGRlZiBjb3VudCA9IHRlbXBsYXRlLmdldFZhbHVlQ291bnQoKQorICAgICAgICBhc3NlcnQgY291bnQgPT0gMQorCisgICAgICAgIGRlZiB2YWx1ZSA9IHRlbXBsYXRlLmdldFZhbHVlKDApCisgICAgICAgIGFzc2VydCB2YWx1ZSA9PSAiQm9iIgorICAgICAgICBhc3NlcnQgdGVtcGxhdGUuZ2V0VmFsdWUoMCkgPT0gIkJvYiIKKworICAgICAgICBkZWYgc3RyaW5nID0gdGVtcGxhdGUudG9TdHJpbmcoKS50cmltKCkKKyAgICAgICAgYXNzZXJ0IHN0cmluZyA9PSAiaGVsbG8gQm9iIGhvdyBhcmUgeW91PyIKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0V2l0aFZhcmlhYmxlQXRFbmQoKSB7CisgICAgICAgIGRlZiBuYW1lID0gIkJvYiIKKworICAgICAgICBkZWYgdGVtcGxhdGUgPSAiIiIKK2hlbGxvICR7bmFtZX0KKyIiIgorCisgICAgICAgIGRlZiBzdHJpbmcgPSB0ZW1wbGF0ZS50b1N0cmluZygpLnRyaW0oKQorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IHN0cmluZyA9PSAiaGVsbG8gQm9iIgorICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RXaXRoVmFyaWFibGVBdEJlZ2lubmluZygpIHsKKyAgICAgICAgZGVmIG5hbWUgPSAiQm9iIgorCisgICAgICAgIGRlZiB0ZW1wbGF0ZSA9ICIiIgorJHtuYW1lfSBoZXksCitoZWxsbworIiIiCisgICAgICAgIGRlZiBzdHJpbmcgPSB0ZW1wbGF0ZS50b1N0cmluZygpLnRyaW0oKQorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IGZpeEVPTHMoc3RyaW5nKSA9PSAiQm9iIGhleSxcbmhlbGxvIgorICAgIH0KKworICAgIHZvaWQgdGVzdFdpdGhKdXN0VmFyaWFibGUoKSB7CisgICAgICAgIGRlZiBuYW1lID0gIkJvYiIKKworICAgICAgICBkZWYgdGVtcGxhdGUgPSAiIiIKKyR7bmFtZX0KKyIiIgorICAgICAgICBkZWYgc3RyaW5nID0gdGVtcGxhdGUudG9TdHJpbmcoKS50cmltKCkKKyAgICAgICAgCisgICAgICAgIGFzc2VydCBzdHJpbmcgPT0gIkJvYiIKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L1doaWxlTG9vcFRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9XaGlsZUxvb3BUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGY5ZTRiCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9XaGlsZUxvb3BUZXN0Lmdyb292eQpAQCAtMCwwICsxLDMzIEBACitwYWNrYWdlIGdyb292eQorCitjbGFzcyBXaGlsZUxvb3BUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCB0ZXN0VmVyeVNpbXBsZVdoaWxlKCkgeworICAgICAgICBkZWYgdmFsID0gZG9XaGlsZU1ldGhvZCgwLCA1KQorICAgICAgICBwcmludGxuKHZhbCkKKyAgICB9CisKKyAgICB2b2lkIHRlc3RNb3JlQ29tcGxleFdoaWxlKCkgeworICAgICAgICBkZWYgeCA9IDAKKyAgICAgICAgZGVmIHkgPSA1CisKKyAgICAgICAgd2hpbGUgKCB5ID4gMCApIHsKKyAgICAgICAgICAgIHggPSB4ICsgMQorICAgICAgICAgICAgeSA9IHkgLSAxCisgICAgICAgIH0KKworICAgICAgICBhc3NlcnQgeCA9PSA1CisgICAgfQorCisgICAgZGVmIGRvV2hpbGVNZXRob2QoeCwgbSkgeworICAgICAgICB3aGlsZSAoIHggPCBtICkgeworICAgICAgICAgICAgeCA9IGluY3JlbWVudCh4KQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHgKKyAgICB9CisKKyAgICBkZWYgaW5jcmVtZW50KHgpIHsKKyAgICAgICAgeCArIDEKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2JlbmNobWFya3MvY3JlYXRlTG9vcC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2JlbmNobWFya3MvY3JlYXRlTG9vcC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ2N2QyOAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYmVuY2htYXJrcy9jcmVhdGVMb29wLmdyb292eQpAQCAtMCwwICsxLDcgQEAKK2MgPSB7CisgIGZvciAoaSBpbiAxLi5pdCl7CisgICAgeCA9IG5ldyBPYmplY3QoKQorICB9Cit9CitjLmNhbGwoMzAwMDApCisKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYmVuY2htYXJrcy9sb29wLmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYmVuY2htYXJrcy9sb29wLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTMwYjcyCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9iZW5jaG1hcmtzL2xvb3AuZ3Jvb3Z5CkBAIC0wLDAgKzEsMjYgQEAKK3BhY2thZ2UgZ3Jvb3Z5LmJlbmNobWFya3MKKworY2xhc3MgTG9vcCB7CisgIGRlZiBhcnJheSA9IG5ldyBBcnJheUxpc3QoKQorICBkZWYgcG9zID0gMAorCisgIHZvaWQgcHVzaChvYmopeworICAgICBhcnJheVtwb3NdID0gb2JqCisgICAgIHBvcyA9IHBvcyArIDEKKyAgfQorICBPYmplY3QgcG9wKCl7CisgICAgIHBvcyA9IHBvcyAtIDEKKyAgICAgcmV0dXJuIGFycmF5W3Bvc10KKyAgfQorCisgIHN0YXRpYyB2b2lkIG1haW4oYXJncyl7CisgICAgIGRlZiBzID0gbmV3IExvb3AoKQorICAgICBmb3IgKGkgaW4gMS4uMTAwMDAwMCl7CisgICAgICAgcy5wdXNoKGkpCisgICAgIH0KKyAgICAgZm9yIChpIGluIDEuLjEwMDAwMDApeworICAgICAgIHMucG9wKCkKKyAgICAgfQorICB9Cit9CisKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYmVuY2htYXJrcy9sb29wMi5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2JlbmNobWFya3MvbG9vcDIuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMzgzNjAKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2JlbmNobWFya3MvbG9vcDIuZ3Jvb3Z5CkBAIC0wLDAgKzEsMjkgQEAKK3BhY2thZ2UgZ3Jvb3Z5LmJlbmNobWFya3MKKworY2xhc3MgTG9vcDIgeworICBkZWYgYXJyYXkgPSBuZXcgQXJyYXlMaXN0KCkKKyAgZGVmIHBvcyA9IDAKKworICB2b2lkIHB1c2gob2JqKXsKKyAgICAgYXJyYXlbcG9zXSA9IG9iagorICAgICBwb3MgPSBwb3MgKyAxCisgIH0KKworICBPYmplY3QgcG9wKCl7CisgICAgIHBvcyA9IHBvcyAtIDEKKyAgICAgcmV0dXJuIGFycmF5W3Bvc10KKyAgfQorCisgIHN0YXRpYyB2b2lkIG1haW4oYXJncyl7CisgICAgIHByaW50bG4gIlN0YXJ0aW5nIHRoZSBMb29wMiB0ZXN0IgorICAgICAgCisgICAgIGRlZiBzID0gbmV3IExvb3AyKCkKKyAgICAgZm9yIChpIGluIDEuLjEwMDAwMDApeworICAgICAgIHMucHVzaChpKQorICAgICB9CisgICAgIGZvciAoaSBpbiAxLi4xMDAwMDAwKXsKKyAgICAgICBzLnBvcCgpCisgICAgIH0KKyAgfQorfQorCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQW1iaWdvdXNMaXN0T3JNZXRob2RUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9BbWJpZ291c0xpc3RPck1ldGhvZFRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNzNkMjQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQW1iaWdvdXNMaXN0T3JNZXRob2RUZXN0Lmdyb292eQpAQCAtMCwwICsxLDQxIEBACitwYWNrYWdlIGdyb292eS5idWdzCisKK2NsYXNzIEFtYmlnb3VzTGlzdE9yTWV0aG9kVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIHZvaWQgdGVzdExvY2FsVmFyaWFibGVWZXJzaW9uKCkgeworICAgICAgICBkZWYgZm9vID0gWzMsIDIsIDNdCisKKyAgICAgICAgZGVmIHZhbCA9IGZvbyBbMF0KKyAgICAgICAgcHJpbnRsbiB2YWwKKyAgICAgICAgYXNzZXJ0IHZhbCA9PSAzCisgICAgfQorCisgICAgdm9pZCB0ZXN0VW5kZWZpbmVkUHJvcGVydHlWZXJzaW9uKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZGVmIHZhbCA9IHRoaXMuZm9vIFswXQorICAgICAgICAgICAgcHJpbnRsbiB2YWwKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoTWlzc2luZ1Byb3BlcnR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHByaW50bG4gIldvcmtlZCEgQ2F1Z2h0IG1pc3NpbmcgcHJvcGVydHkgJGUiCisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHRlc3RNZXRob2RDYWxsVmVyc2lvbigpIHsKKyAgICAgICAgZGVmIHZhbCA9IGZvbyhbMF0pCisgICAgICAgIHByaW50bG4gdmFsCisgICAgICAgIGFzc2VydCB2YWwgPT0gMQorICAgIH0KKworCisgICAgZGVmIGZvbyhpbnQgdmFsKSB7CisgICAgICAgIHByaW50bG4gIkNhbGxpbmcgZm9vIG1ldGhvZCB3aXRoIGEgaW50IHBhcmFtIG9mIHZhbCIKKyAgICAgICAgcHJpbnRsbiB2YWwKKyAgICAgICAgcmV0dXJuIG51bGwKKyAgICB9CisKKyAgICBkZWYgZm9vKExpc3QgbXlMaXN0KSB7CisgICAgICAgIHByaW50bG4gIkNhbGxpbmcgZm9vIG1ldGhvZCB3aXRoIGEgbGlzdCBwYXJhbSBvZiAkbXlMaXN0IgorICAgICAgICByZXR1cm4gbXlMaXN0LnNpemUoKQorICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9BcnJheU1ldGhvZENhbGxCdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0FycmF5TWV0aG9kQ2FsbEJ1Zy5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhiMzFiNgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9BcnJheU1ldGhvZENhbGxCdWcuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTMgQEAKK3BhY2thZ2UgZ3Jvb3Z5LmJ1Z3MKKworY2xhc3MgQXJyYXlNZXRob2RDYWxsQnVnIGV4dGVuZHMgVGVzdFN1cHBvcnQgeworCisgICAgdm9pZCB0ZXN0TWV0aG9kQ2FsbGluZ1dpdGhBcnJheUJ1ZygpIHsKKyAgICAgICAgZGVmIGFycmF5ID0gZ2V0TW9ja0FyZ3VtZW50cygpCisgICAgICAgIAorICAgICAgICBkdW1teU1ldGhvZChhcnJheSkKKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIHZvaWQgZHVtbXlNZXRob2QoYXJyYXkpIHsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0FzQm9vbEJ1Zy5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQXNCb29sQnVnLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWRmYTg0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0FzQm9vbEJ1Zy5ncm9vdnkKQEAgLTAsMCArMSw3MSBAQAorcGFja2FnZSBncm9vdnkuYnVncworCisvKioKKyAqIFRlc3QgdG8gZml4IHRoZSBKaXJhIGlzc3VlcyBHUk9PVlktODEwIGFuZCBHUk9PVlktODExLgorICogVGVzdCBvZiAic3RyaW5nIGFzIEJvb2xlYW4iIGFnYWluc3QgdGhlIGlzc3VlIEdST09WWS04MTIuCisgKgorICogQGF1dGhvciBQaWxobyBLaW0KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworCitwdWJsaWMgY2xhc3MgQXNCb29sQnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCB0ZXN0TWFwQXNCb29sKCkgeworICAgICAgICBkZWYgYSA9IFsiQSI6MTIzXQorICAgICAgICBwcmludGxuICgiJGEgOiAke2EgYXMgQm9vbGVhbn0iKQorICAgICAgICBhc3NlcnQgYSBhcyBCb29sZWFuID09IHRydWUKKyAgICAgICAgYSA9IFs6XQorICAgICAgICBwcmludGxuICgiJGEgOiAke2EgYXMgQm9vbGVhbn0iKQorICAgICAgICBhc3NlcnQgYSBhcyBCb29sZWFuID09IGZhbHNlCisgICAgfQorCisgICAgdm9pZCB0ZXN0TGlzdEFzQm9vbCgpIHsKKyAgICAgICAgZGVmIGIgPSBbMTIzXQorICAgICAgICBwcmludGxuICgiJGIgOiAke2IgYXMgQm9vbGVhbn0iKQorICAgICAgICBhc3NlcnQgYiBhcyBCb29sZWFuID09IHRydWUKKyAgICAgICAgYiA9IFtdCisgICAgICAgIHByaW50bG4gKCIkYiA6ICR7YiBhcyBCb29sZWFufSIpCisgICAgICAgIGFzc2VydCBiIGFzIEJvb2xlYW4gPT0gZmFsc2UKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB2b2lkIHRlc3RTdHJpbmdBc0Jvb2woKS4KKyAgICAgKgorICAgICAqIDxjb2RlPnN0cmluZyBhcyBCb29sZWFuPC9jb2RlPiBpcyBlcXVpdmFsZW50IHRvCisgICAgICogICAgIDxjb2RlPnN0cmluZyAhPSBudWxsICYmIHN0cmluZy5sZW5ndGgoKSA+IDA8L2NvZGU+LgorICAgICAqLworICAgIC8vIFVuZm9ydHVuYXRlbHksIGl0IGNvbnRyYWRpY3RzIHNldmVyYWwgb3RoZXIgdGVzdCBjYXNlcywgYW5kCisgICAgLy8gaXQgaGFzIGFscmVhZHkgYmVlbiBkZWNpZGVkIHRvIGhhbmRsZSBzdHJpbmctdG8tYm9vbGVhbiBjb252ZXJzaW9ucworICAgIC8vIGRpZmZlcmVudGx5LiBDb21tZW50ZWQgb3V0IHRlbXBvcmFyaWx5IG9uIDEwIE1heSAyMDA1LgorICAgIC8vIFRoaXMgaXMgYSB0ZXN0IGNhc2UgYWdhaW5zdCBHUk9PVlktODEyCisgICAgdm9pZCB0ZXN0U3RyaW5nQXNCb29sKCkgeworICAgICAgICBkZWYgYyA9ICJmYWxzZSIKKyAgICAgICAgcHJpbnRsbiAoIiRjIDogJHtjIGFzIEJvb2xlYW59IikKKyAgICAgICAgYXNzZXJ0IGMgYXMgQm9vbGVhbiA9PSB0cnVlCisgICAgICAgIGFzc2VydCBjIGFzIEJvb2xlYW4gPT0gKGMgIT0gbnVsbCAmJiBjLmxlbmd0aCgpID4gMCkKKyAgICAgICAgYm9vbGVhbiB6ID0gYworICAgICAgICBwcmludGxuICgiJHoiKQorICAgICAgICBhc3NlcnQgeiA9PSB0cnVlCisgICAgICAgIGlmIChjKQorICAgICAgICAgICBwcmludGxuICJJdCBpcyB0cnVlISEiCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgcHJpbnRsbiAiSXQgaXMgZmFsc2UhISIKKworICAgICAgICBjID0gIjEyMyIKKyAgICAgICAgcHJpbnRsbiAoIiRjIDogJHtjIGFzIEJvb2xlYW59IikKKyAgICAgICAgYXNzZXJ0IGMgYXMgQm9vbGVhbiA9PSB0cnVlCisgICAgICAgIGFzc2VydCBjIGFzIEJvb2xlYW4gPT0gKGMgIT0gbnVsbCAmJiBjLmxlbmd0aCgpID4gMCkKKworICAgICAgICBjID0gIkZhbHNlIgorICAgICAgICBwcmludGxuICgiJGMgOiAke2MgYXMgQm9vbGVhbn0iKQorICAgICAgICBhc3NlcnQgYyBhcyBCb29sZWFuID09IHRydWUKKyAgICAgICAgYXNzZXJ0IGMgYXMgQm9vbGVhbiA9PSAoYyAhPSBudWxsICYmIGMubGVuZ3RoKCkgPiAwKQorICAgICAgICBpZiAoYykKKyAgICAgICAgICAgcHJpbnRsbiAiSXQgaXMgdHJ1ZSEhIgorICAgICAgICBlbHNlCisgICAgICAgICAgIHByaW50bG4gIkl0IGlzIGZhbHNlISEiCisgICAgICAgIHogPSBjCisgICAgICAgIHByaW50bG4gKCIkeiIpCisgICAgICAgIGFzc2VydCB6CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0Fzc2lnbm1lbnRJbnNpZGVFeHByZXNzaW9uQnVnLmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9Bc3NpZ25tZW50SW5zaWRlRXhwcmVzc2lvbkJ1Zy5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU3MzVkNAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9Bc3NpZ25tZW50SW5zaWRlRXhwcmVzc2lvbkJ1Zy5ncm9vdnkKQEAgLTAsMCArMSwzMCBAQAorcGFja2FnZSBncm9vdnkuYnVncworCisvKioKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworY2xhc3MgQXNzaWdubWVudEluc2lkZUV4cHJlc3Npb25CdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisgICAgCisgICAgdm9pZCB0ZXN0QnVnKCkgeworICAgICAgICBkZWYgeAorICAgICAgICBpZiAoKHggPSBzb21lTWV0aG9kKCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHByaW50bG4geAorICAgICAgICB9CisgICAgICAgIGRlZiB5CisgICAgICAgIGlmICgoeSA9IGdldEZvbygpKSA+IDUpIHsKKyAgICAgICAgICAgIHByaW50bG4gInkgaXMgZ3JlYXRlciB0aGFuIDUiCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGRlZiBhID0gMTIzLCBiID0gMTIzCisgICAgICAgIGFzc2VydCBhID09IDEyMworICAgICAgICBhc3NlcnQgYiA9PSAxMjMKKyAgICB9CisKKyAgICBkZWYgc29tZU1ldGhvZCgpIHsKKyAgICAgICAgcmV0dXJuICJ3b3JrZWQhIgorICAgIH0KKyAgICAKKyAgICBkZWYgZ2V0Rm9vKCkgeworICAgICAgICByZXR1cm4gNworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQXR0cmlidXRlU2V0RXhwcmVzc2lvbkJ1Zy5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQXR0cmlidXRlU2V0RXhwcmVzc2lvbkJ1Zy5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ4NGY1MQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9BdHRyaWJ1dGVTZXRFeHByZXNzaW9uQnVnLmdyb292eQpAQCAtMCwwICsxLDI4IEBACisvKioKKyAqIEBhdXRob3IgUGlsaG8gS2ltCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KKworcGFja2FnZSBncm9vdnkuYnVncworCitjbGFzcyBBdHRyaWJ1dGVTZXRFeHByZXNzaW9uQnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworICAgIHZvaWQgdGVzdEF0dHJpYnV0ZVNldEFjY2VzcygpIHsKKyAgICAgICAgZGVmIGEgPSBuZXcgSGFzU3RhdGljRmllbGRTb21lQ2xhc3MoKQorICAgICAgICBhLm5hbWUgPSBhLm5hbWUgKiAzCisgICAgICAgIGFzc2VydCBhLkBuYW1lID09ICJnZXR0dGVyIiAqIDMgCisgICAgICAgIGFzc2VydCBhLm5hbWUgPT0gImdldHR0ZXIiCisKKyAgICAgICAgbmV3IEhhc1N0YXRpY0ZpZWxkU29tZUNsYXNzKCkuQG5hbWUgPSAiY2hhbmdlZCBiYXIiCisgICAgICAgIGFzc2VydCggSGFzU3RhdGljRmllbGRTb21lQ2xhc3MuY2xhc3MuQG5hbWUgPT0gImNoYW5nZWQgYmFyIiApCisKKyAgICAgICAgSGFzU3RhdGljRmllbGRTb21lQ2xhc3MuY2xhc3MuQG5hbWUgPSAiY2hhbmdlZCBzdGF0aWMgYmFyIgorICAgICAgICBhc3NlcnQoIEhhc1N0YXRpY0ZpZWxkU29tZUNsYXNzLmNsYXNzLkBuYW1lID09ICJjaGFuZ2VkIHN0YXRpYyBiYXIiICkKKyAgICB9Cit9CisKK2NsYXNzIEhhc1N0YXRpY0ZpZWxkU29tZUNsYXNzIHsKKyAgICBzdGF0aWMgU3RyaW5nIG5hbWUgPSAiYmFyIiAKKyAgICBzdGF0aWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiAiZ2V0dHRlciIKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQXV0b2JveGluZ09mQ29tcGFyaXNvbnNCdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0F1dG9ib3hpbmdPZkNvbXBhcmlzb25zQnVnLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjhlYmFmCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0F1dG9ib3hpbmdPZkNvbXBhcmlzb25zQnVnLmdyb292eQpAQCAtMCwwICsxLDEwIEBACitwYWNrYWdlIGdyb292eS5idWdzCisKK2NsYXNzIEF1dG9ib3hpbmdPZkNvbXBhcmlzb25zQnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworICAgIHZvaWQgdGVzdEJ1ZygpIHsKKyAgICAgICAgZGVmIHkgPSB0cnVlCisgICAgICAgIGRlZiB4ID0geSA9PSB0cnVlCisgICAgICAgIGRlZiB6ID0geSAhPSBmYWxzZQorICAgICAgICBhc3NlcnQgeCAmJiB6CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9CYWRTY3JpcHROYW1lQnVnLmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9CYWRTY3JpcHROYW1lQnVnLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTEzNzM3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0JhZFNjcmlwdE5hbWVCdWcuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTMgQEAKK3BhY2thZ2UgZ3Jvb3Z5LmJ1Z3MKKworLyoqCisgKiBAYXV0aG9yIFNlcmdleSBVZG92ZW5rbyAKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4zICQKKyAqLworY2xhc3MgQmFkU2NyaXB0TmFtZUJ1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKyAgICAKKyAgICB2b2lkIHRlc3RCdWcoKSB7CisJCUdyb292eUNsYXNzTG9hZGVyIGNsID0gbmV3IEdyb292eUNsYXNzTG9hZGVyKCk7IAorCQljbC5wYXJzZUNsYXNzKCJwcmludGxuICdvb3BzISciLCAiL3NjcmlwdC5ncm9vdnkiKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0JlbmNobWFya0J1Zy5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQmVuY2htYXJrQnVnLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzUzMzlmCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0JlbmNobWFya0J1Zy5ncm9vdnkKQEAgLTAsMCArMSwzMiBAQAorcGFja2FnZSBncm9vdnkuYnVncworCisvKioKKyAqIEEgbGl0dGxlIHBlcmZvcm1hbmNlIHRlc3QKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworY2xhc3MgQmVuY2htYXJrQnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworICAgIAorICAgIHZvaWQgdGVzdFBlcmZvcm1hbmNlKCkgeworICAgICAgICBkZWYgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKQorCisgICAgICAgIGRlZiB0b3RhbCA9IDAKKyAgICAgICAgZGVmIHNpemUgPSAxMDAwMAorICAgICAgICBmb3IgKGkgaW4gMC4uc2l6ZSkgeworICAgICAgICAgICAgdG90YWwgPSB0b3RhbCArIGNhbGxTb21lTWV0aG9kKCJoZWxsbyIsIHRvdGFsKQorICAgICAgICB9CisKKyAgICAgICAgZGVmIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpCisKKyAgICAgICAgZGVmIHRpbWUgPSBlbmQgLSBzdGFydAorCisgICAgICAgIHByaW50bG4gIlBlcmZvcm1lZCAke3NpemV9IGl0ZXJhdGlvbnMgaW4gJHt0aW1lIC8gMTAwMH0gc2Vjb25kcyB3aGljaCBpcyAke3RpbWUgLyBzaXplfSBtcyBwZXIgaXRlcmF0aW9uIgorCisgICAgICAgIC8vIFRPRE86IHBhcnNlciBidWcKKyAgICAgICAgLy8gYXNzZXJ0IHRvdGFsID09IHNpemUgKiAxMCArIDEwCisgICAgICAgIGFzc2VydCB0b3RhbCA9PSAxMDAwMTAKKyAgICB9CisgICAgCisgICAgZGVmIGNhbGxTb21lTWV0aG9kKHRleHQsIHRvdGFsKSB7CisgICAgICAgIHJldHVybiAxMAorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQmxvY2tBc0Nsb3N1cmVCdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0Jsb2NrQXNDbG9zdXJlQnVnLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjFkZDYwCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0Jsb2NrQXNDbG9zdXJlQnVnLmdyb292eQpAQCAtMCwwICsxLDUxIEBACitwYWNrYWdlIGdyb292eS5idWdzCisKKy8qKgorICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjQgJAorICovCitjbGFzcyBCbG9ja0FzQ2xvc3VyZUJ1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKyAgICAKKyAgIHZvaWQgdGVzdEJ1ZygpIHsKKyAgICAgICAgZGVmIGMgPSAwCisgICAgICAgIAorICAgICAgICBibG9jazogeyAKKyAgICAgICAgICAgIGMgPSA5IAorICAgICAgICB9IAorCisgICAgICAgIHByaW50bG4oYykgCisgICAgICAgIAorICAgICAgICBhc3NlcnQgYyA9PSA5CisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdFN0YXRpY0J1ZygpIHsKKyAgICAgICAgc3RhdGljTWV0aG9kKG51bGwpCQkKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0Tm9uVm9pZE1ldGhvZCgpIHsKKyAgICAgICAgZm9vKCkJCQorICAgIH0KKyAgICAKKyAgICBzdGF0aWMgdm9pZCBzdGF0aWNNZXRob2QoYXJncykgeworICAgICAgICBkZWYgYyA9IDAKKyAgICAgICAgCisgICAgICAgIGJsb2NrOiB7CisgICAgICAgICAgICBjID0gOSAKKyAgICAgICAgfQorCisgICAgICAgIHByaW50bG4oYykgCisgICAgICAgIAorICAgICAgICBhc3NlcnQgYyA9PSA5CisgICAgfQorICAgIAorICAgIGRlZiBmb28oKSB7CisgICAgICAgIGRlZiBjID0gMCAKKyAgICAgICAgCisgICAgICAgIGJsb2NrOiB7IAorICAgICAgICAgICAgYyA9IDkgCisgICAgICAgIH0gCisgICAgICAgIHByaW50bG4oYykgCisgICAgICAgIAorICAgICAgICBhc3NlcnQgYyA9PSA5CisgICAgICAgIHJldHVybiA1CisgICAgfQorICAgfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0Jvb2xlYW5CdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0Jvb2xlYW5CdWcuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExYWNkNTAKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQm9vbGVhbkJ1Zy5ncm9vdnkKQEAgLTAsMCArMSwzMyBAQAorcGFja2FnZSBncm9vdnkuYnVncworCisvKioKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworY2xhc3MgQm9vbGVhbkJ1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKyAgICAKKyAgICB2b2lkIHRlc3RCdWcoKSB7CisgICAgICAgIGRlZiB4ID0gbmV3IEJvb2xlYW5CZWFuKG5hbWU6J0phbWVzJywgZm9vOnRydWUpCisgICAgICAgIGRlZiB5ID0gbmV3IEJvb2xlYW5CZWFuKG5hbWU6J0JvYicsIGZvbzpmYWxzZSkKKworICAgICAgICBhc3NlcnQgeC5mb28KKyAgICAgICAgYXNzZXJ0ICEgeS5mb28KKyAgICAgICAgeS5mb28gPSB0cnVlCisgICAgICAgIGFzc2VydCB5LmZvbworICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RCdWcyKCkgeworICAgICAgICBCb29sZWFuQmVhbiBiZWFuID0gbmV3IEJvb2xlYW5CZWFuKG5hbWU6J0dyb21pdCcsIGZvbzpmYWxzZSkKKyAgICAgICAgZGVmIHZhbHVlID0gaXNBcHBsaWNhYmxlVG8oYmVhbikKKyAgICAgICAgYXNzZXJ0IHZhbHVlCisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGlzQXBwbGljYWJsZVRvKEJvb2xlYW5CZWFuIGZpZWxkKSB7CisgICAgICAgIHJldHVybiAhZmllbGQuaXNGb28oKTsKKyAgICB9CisKK30KKworY2xhc3MgQm9vbGVhbkJlYW4geworICAgIFN0cmluZyBuYW1lCisgICAgYm9vbGVhbiBmb28KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQnl0ZUluZGV4QnVnLmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9CeXRlSW5kZXhCdWcuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MjJjODIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQnl0ZUluZGV4QnVnLmdyb292eQpAQCAtMCwwICsxLDE4IEBACitwYWNrYWdlIGdyb292eS5idWdzCisKKy8qKgorICogQGF1dGhvciBSb2JlcnQgRnVsbGVyIAorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitjbGFzcyBCeXRlSW5kZXhCdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisgICAgLy8gVE9ETzogdGhpcyB0ZXN0cyBhIHN0cmluZyB3aXRoIDEyOCBudWxscyAtIGlzIHRoYXQgd2hhdCBpcyBpbnRlbmRlZD8KKyAgICB2b2lkIHRlc3RCdWcoKSB7CisgICAgICAgIGRlZiBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIlwiXCJcIlxuIikKKyAgICAgICAgZm9yIChqIGluIDAuLjEyNyl7IC8vIDEyNiBpcyBva2F5LgorICAgICAgICAgICAgc2IuYXBwZW5kKCckJykuYXBwZW5kKCJ7eH0iKQorICAgICAgICB9CisgICAgICAgIHNiLmFwcGVuZCgiXG5cIlwiXCJcbiIpCisgICAgICAgIGRlZiBiID0gbmV3IEJpbmRpbmcoeDpudWxsKQorICAgICAgICBuZXcgR3Jvb3Z5U2hlbGwoYikuZXZhbHVhdGUoc2IudG9TdHJpbmcoKSwiZm9vIikKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQnl0ZWNvZGUyQnVnLmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9CeXRlY29kZTJCdWcuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YWM1MDMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQnl0ZWNvZGUyQnVnLmdyb292eQpAQCAtMCwwICsxLDU1IEBACitwYWNrYWdlIGdyb292eS5idWdzCisKKy8qKgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitjbGFzcyBCeXRlY29kZTJCdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICBJbnRlZ2VyIGNvdW50ID0gMAorICAgIAorICAgIHZvaWQgdGVzdEJ5dGVjb2RlQnVnKCkgeworICAgICAgICBnZXRDb2xsZWN0aW9uKCkuZWFjaCB7IGNvdW50ICs9IGl0IH0KKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0VGVkc0J5dGVjb2RlQnVnKCkgeworICAgICAgICAvL2RvVGVzdChnZXRDb2xsZWN0aW9uKCkpCisgICAgICAgIGRlZiBhID0gWzEsIDIsIDMsIDRdCisgICAgICAgIGRvVGVzdChhKQorCisgICAgfQorICAgIAorICAgIHZvaWQgZG9UZXN0KGFyZ3MpIHsKKyAgICAgICAgZGVmIG0gPSBbOl0KKyAgICAgICAgZGVmIGkgPSAxCisgICAgICAgIGFyZ3MuZWFjaCB7IG0ucHV0KGl0LCBpKyspIH0gICAgIAorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IG1bMV0gPT0gMQorICAgICAgICBhc3NlcnQgbVsyXSA9PSAyCisgICAgICAgIGFzc2VydCBtWzNdID09IDMKKyAgICAgICAgYXNzZXJ0IG1bNF0gPT0gNAorICAgICAgICAKKyAgICAgICAgcHJpbnRsbigiY3JlYXRlZDogJHttfSIpCisgICAgICAgIAorICAgICAgICBhc3NlcnQgaSA9PSA1CisgICAgfQorICAgIAorICAgIAorICAgIHZvaWQgdGVzdFRlZHNCeXRlY29kZTJCdWcoKSB7CisgICAgICAgIGRlZiBtID0gWzpdCisgICAgICAgIGRlZiBpID0gMQorICAgICAgICBnZXRDb2xsZWN0aW9uKCkuZWFjaCB7IG0ucHV0KGl0LCBpKyspIH0gICAgIAorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IG1bMV0gPT0gMQorICAgICAgICBhc3NlcnQgbVsyXSA9PSAyCisgICAgICAgIGFzc2VydCBtWzNdID09IDMKKyAgICAgICAgYXNzZXJ0IG1bNF0gPT0gNAorICAgICAgICAKKyAgICAgICAgcHJpbnRsbigiY3JlYXRlZDogJHttfSIpCisgICAgICAgIAorICAgICAgICBhc3NlcnQgaSA9PSA1CisgICAgfQorICAgIAorICAgIGRlZiBnZXRDb2xsZWN0aW9uKCkgeworICAgICAgICBbMSwgMiwgMywgNF0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0J5dGVjb2RlM0J1Zy5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQnl0ZWNvZGUzQnVnLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWJiNGMxCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0J5dGVjb2RlM0J1Zy5ncm9vdnkKQEAgLTAsMCArMSwyMyBAQAorcGFja2FnZSBncm9vdnkuYnVncworCisvKioKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworY2xhc3MgQnl0ZWNvZGUzQnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworICAgIAorICAgIGRlZiBjb3VudAorICAgICAgICAgCisgICAgdm9pZCB0ZXN0SW5jcmVtZW50UHJvcGVydHlJbmNsb3N1cmUoKSB7CisgICAgICAgIGRlZiBhcmdzID0gWzEsIDIsIDNdCisgICAgICAgIGRlZiBtID0gWzpdCisgICAgICAgIGNvdW50ID0gMAorICAgICAgICBkb0xvb3AoYXJncywgbSkKKyAgICAgICAgYXNzZXJ0IGNvdW50ID09IDMKKyAgICB9CisgICAgCisgICAgdm9pZCBkb0xvb3AoYXJncywgbSkgeworICAgICAgICBhcmdzLmVhY2ggeyAKKyAgICAgICAgICAgIG0ucHV0KGl0LCBjb3VudCsrKQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9CeXRlY29kZTRCdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0J5dGVjb2RlNEJ1Zy5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg5Y2FhZgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9CeXRlY29kZTRCdWcuZ3Jvb3Z5CkBAIC0wLDAgKzEsMzAgQEAKK3BhY2thZ2UgZ3Jvb3Z5LmJ1Z3MKKworLyoqCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK2NsYXNzIEJ5dGVjb2RlNEJ1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIGRlZiBjb3VudCA9IDAKKyAgICAgCisgICAgdm9pZCB0ZXN0SW5qZWN0KCkgeworICAgICAgICBkZWYgeCA9IFsxLCAyLCAzXS5pbmplY3QoMCkgeyBjLCBzIC0+IGMgKz0gcyB9CisgICAgICAgIGFzc2VydCB4ID09IDYKKyAgICB9CisgICAgIAorICAgIHZvaWQgdGVzdFVzaW5nUHJvcGVydHkoKSB7CisgICAgICAgIGNvdW50ID0gMAorICAgICAgICBnZXRDb2xsZWN0aW9uKCkuZWFjaCB7IGNvdW50ICs9IGl0IH0gICAgICAgCisgICAgICAgIGFzc2VydCBjb3VudCA9PSAxMAorICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RVc2luZ0luY3JlbWVudGluZ1Byb3BlcnR5KCkgeworICAgICAgICBjb3VudCA9IDAKKyAgICAgICAgZ2V0Q29sbGVjdGlvbigpLmVhY2ggeyBjb3VudCsrIH0gICAgICAgCisgICAgICAgIGFzc2VydCBjb3VudCA9PSA0CisgICAgfQorICAgIAorICAgIGRlZiBnZXRDb2xsZWN0aW9uKCkgeworICAgICAgICBbMSwgMiwgMywgNF0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0J5dGVjb2RlNUJ1Zy5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQnl0ZWNvZGU1QnVnLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzVlZWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0J5dGVjb2RlNUJ1Zy5ncm9vdnkKQEAgLTAsMCArMSwxNyBAQAorcGFja2FnZSBncm9vdnkuYnVncworCisvKioKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworY2xhc3MgQnl0ZWNvZGU1QnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCB0ZXN0VXNpbmdMb2NhbFZhcigpIHsKKyAgICAgICAgZGVmIGMgPSAwCisgICAgICAgIGdldENvbGxlY3Rpb24oKS5lYWNoIHsgYyArPSBpdCB9ICAgICAgIAorICAgICAgICBhc3NlcnQgYyA9PSAxMAorICAgIH0KKyAgICAKKyAgICBkZWYgZ2V0Q29sbGVjdGlvbigpIHsKKyAgICAgICAgWzEsIDIsIDMsIDRdCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9CeXRlY29kZTZCdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0J5dGVjb2RlNkJ1Zy5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkyNTlmNQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9CeXRlY29kZTZCdWcuZ3Jvb3Z5CkBAIC0wLDAgKzEsMjUgQEAKK3BhY2thZ2UgZ3Jvb3Z5LmJ1Z3MKKworLyoqCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK2NsYXNzIEJ5dGVjb2RlNkJ1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIHZvaWQgdGVzdFBvc3RGaXhSZXR1cm4oKSB7CisgICAgICAgIGRlZiBpID0gMQorICAgICAgICBkZWYgY2xvc3VyZSA9IHsgaSsrIH0KKyAgICAgICAgZGVmIHZhbHVlID0gY2xvc3VyZSgpCisgICAgICAgIAorICAgICAgICBhc3NlcnQgdmFsdWUgPT0gMQorICAgICAgICBhc3NlcnQgaSA9PSAyCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdFByZUZpeFJldHVybigpIHsKKyAgICAgICAgZGVmIGkgPSAxCisgICAgICAgIGRlZiBjbG9zdXJlID0geyByZXR1cm4gKytpIH0KKyAgICAgICAgZGVmIHZhbHVlID0gY2xvc3VyZSgpCisgICAgICAgIAorICAgICAgICBhc3NlcnQgdmFsdWUgPT0gMgorICAgICAgICBhc3NlcnQgaSA9PSAyCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9CeXRlY29kZTdCdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0J5dGVjb2RlN0J1Zy5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FkOWU1ZAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9CeXRlY29kZTdCdWcuZ3Jvb3Z5CkBAIC0wLDAgKzEsMjcgQEAKK3BhY2thZ2UgZ3Jvb3Z5LmJ1Z3MKKworLyoqCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK2NsYXNzIEJ5dGVjb2RlN0J1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIHZvaWQgdGVzdER1cGxpY2F0ZVZhcmlhYmxlcygpIHsKKyAgICAgICAgaWYgKHRydWUpIHsKKyAgICAgICAgICAgIGRlZiBhID0gMTIzCisgICAgICAgIH0KKyAgICAgICAgaWYgKHRydWUpIHsKKyAgICAgICAgICAgIGRlZiBhID0gNDU2CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHRlc3REdXBsaWNhdGVWYXJpYWJsZXNJbkNsb3N1cmVzKCkgeworICAgICAgICBkZWYgY29sbCA9IFsxXQorCisgICAgICAgIGNvbGwuZWFjaCB7CisgICAgICAgICAgICBkZWYgYSA9IDEyMworICAgICAgICB9CisgICAgICAgIGNvbGwuZWFjaCB7CisgICAgICAgICAgICBkZWYgYSA9IDQ1NgorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9CeXRlY29kZUJ1Zy5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQnl0ZWNvZGVCdWcuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0M2NhMTkKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQnl0ZWNvZGVCdWcuZ3Jvb3Z5CkBAIC0wLDAgKzEsMzAgQEAKK3BhY2thZ2UgZ3Jvb3Z5LmJ1Z3MKKworLyoqCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK2NsYXNzIEJ5dGVjb2RlQnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworICAgICAKKyAgICB2b2lkIHRlc3RUZWRzQnl0ZWNvZGVCdWcoKSB7CisgICAgICAgIC8vZGVmIGEgPSBbJ3RvbScsJ2RpY2snLCdoYXJyeSddCisgICAgICAgIGRlZiBhID0gWzEsIDIsIDMsIDRdCisgICAgICAgIGRvVGVzdChhKQorICAgIH0KKyAgICAKKyAgICB2b2lkIGRvVGVzdChhcmdzKSB7CisgICAgICAgIGRlZiBtID0gWzpdCisgICAgICAgIGRlZiBpID0gMQorICAgICAgICBhcmdzLmVhY2ggeyAKKyAgICAgICAgICAgIHRhbGsoaXQpCisgICAgICAgICAgICBtLnB1dChpdCwgaSsrKQorICAgICAgICB9CisgICAgICAgIGFzc2VydCBpID09IDUKKyAgICAgICAgbS5lYWNoIHsKKyAgICAgICAgICAgIHByaW50bG4oaXQpCisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgZGVmIHRhbGsoYSkgeworICAgICAgICBwcmludGxuKCJoZWxsbyAiK2EpCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9DYWxsaW5nQ2xvc3VyZXNXaXRoQ2xvc3VyZXNCdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0NhbGxpbmdDbG9zdXJlc1dpdGhDbG9zdXJlc0J1Zy5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlmMjViMgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9DYWxsaW5nQ2xvc3VyZXNXaXRoQ2xvc3VyZXNCdWcuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTggQEAKK3BhY2thZ2UgZ3Jvb3Z5LmJ1Z3MKKworLyoqCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK2NsYXNzIENhbGxpbmdDbG9zdXJlc1dpdGhDbG9zdXJlc0J1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIHZvaWQgdGVzdEJ1ZygpIHsKKyAgICAgICAgZGVmIGEgPSB7MX0KKyAgICAgICAgLy8gb2xkIHdvcmthcm91bmQKKyAgICAgICAgLy9kZWYgYiA9IHthLmNhbGwoKX0KKyAgICAgICAgZGVmIGIgPSB7YSgpfQorICAgICAgICAKKyAgICAgICAgZGVmIHZhbHVlID0gYigpCisgICAgICAgIAorICAgICAgICBhc3NlcnQgdmFsdWUgPT0gMQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQ2FzdFdoZW5Vc2luZ0Nsb3N1cmVzQnVnLmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9DYXN0V2hlblVzaW5nQ2xvc3VyZXNCdWcuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwN2Q5ODIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQ2FzdFdoZW5Vc2luZ0Nsb3N1cmVzQnVnLmdyb292eQpAQCAtMCwwICsxLDE0IEBACitwYWNrYWdlIGdyb292eS5idWdzCisKKy8qKgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitjbGFzcyBDYXN0V2hlblVzaW5nQ2xvc3VyZXNCdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICB2b2lkIHRlc3RCdWcoKSB7CisgICAgICAgIGRlZiBhID0gMQorCisgICAgICAgIGRlZiBsaXN0ID0gWzFdCisgICAgICAgIGxpc3QuZWFjaCB7IGEgPSBpdCB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9DaHJpc3RvZnNQcm9wZXJ0eUJ1Zy5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQ2hyaXN0b2ZzUHJvcGVydHlCdWcuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NzkxZTYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQ2hyaXN0b2ZzUHJvcGVydHlCdWcuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTcgQEAKK3BhY2thZ2UgZ3Jvb3Z5LmJ1Z3MKKworLyoqCisgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNCAkCisgKi8KK2NsYXNzIENocmlzdG9mc1Byb3BlcnR5QnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworICAgICAKKyAgICBkZWYgbWl4ZWRDYXNlUHJvcGVydHkKKworICAgIHZvaWQgdGVzdENocmlzdG9mc1Byb3BlcnR5QnVnKCkgeworICAgIAl0aGlzLm1peGVkQ2FzZVByb3BlcnR5ID0gInRlc3QiCisgICAgCXNob3VsZEZhaWwoe3RoaXMubWl4ZWRjYXNlcHJvcGVydHkgPSAidGVzdCJ9KQorICAgIH0KKyAgICAKKyAgICBkZWYgZ2V0TWl4ZWRDYXNlUHJvcGVydHkoKSAgICB7IG1peGVkQ2FzZVByb3BlcnR5IH0KKyAgICB2b2lkIHNldE1peGVkQ2FzZVByb3BlcnR5KHZhbCkgeyB0aGlzLm1peGVkQ2FzZVByb3BlcnR5ID0gdmFsIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQ2xhc3NHZW5lcmF0b3JGaXhlc1Rlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0NsYXNzR2VuZXJhdG9yRml4ZXNUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWViZTU1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0NsYXNzR2VuZXJhdG9yRml4ZXNUZXN0Lmdyb292eQpAQCAtMCwwICsxLDc4IEBACitwYWNrYWdlIGdyb292eS5idWdzCisKKworY2xhc3MgQ2xhc3NHZW5lcmF0b3JGaXhlc1Rlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisgICAgZGVmIGNvdW50ID0gMDsKKworICAgIGRlZiBwZihpbnQgcCkgeworICAgICAgICBpbnQgaSA9IHAKKyAgICAgICAgYm9vbGVhbiBiID0gdHJ1ZQorICAgIH0KKworICAgIHZvaWQgdGVzdFByaW1pdHZlc0luRnVuYygpIHsgLy8gZ3Jvb3Z5LTM3MywgNDUzLCAzODUsIDQ1MSwgMTk5CisgICAgICAgIHBmKDEwKQorICAgIH0KKworICAgIHZvaWQgdGVzdFBsdXNFcXVhbCgpIHsgLy8gMzcyCisgICAgICAgIGNvdW50ICs9IDEKKyAgICAgICAgYXNzZXJ0IGNvdW50ID09IDEKKworICAgICAgICBkZWYgZm9vID0KKyAgICAgICAgICAgIHtpLT4KKyAgICAgICAgICAgICAgICByZXR1cm4ge2otPgorICAgICAgICAgICAgICAgICAgICBpICs9IGoKKyAgICAgICAgICAgICAgICAgICAgaQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgZGVmIHggPSBmb28oMSkKKyAgICAgICAgeCg1KQorICAgICAgICBmb28oMykKKyAgICAgICAgcHJpbnRsbiB4KDIuMykKKyAgICB9CisKKyAgICB2b2lkIHRlc3RJZkFuZFN3aXRjaEluQ2xvc3VyZSAoKXsgLy8gMzIxLCAzMjQsIDQxMgorCisgICAgICAgIGRlZiBhID0gMQorICAgICAgICAxLnRpbWVzIHsKKyAgICAgICAgICAgIGlmIChhID09MSkgeworICAgICAgICAgICAgICAgIGEgPSAyCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBkZWYgbm9uZVlldD10cnVlOworICAgICAgICBbImEiLCJiIiwiYyIsImQiXS5lYWNoIHsgYyAtPgorICAgICAgICAgIGlmIChub25lWWV0KSB7CisgICAgICAgICAgICBub25lWWV0PWZhbHNlOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludCgiID4gIik7CisgICAgICAgICAgfQorICAgICAgICAgIHByaW50KCBjICk7CisgICAgICAgIH0KKworICAgICAgICBhID0gMQorICAgICAgICBzd2l0Y2ggKGEpIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgYSA9IDI7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHJldHVyblZvaWQoKSB7CisgICAgICAgIHJldHVybgorICAgIH0KKworICAgIHZvaWQgdGVzdFJldHVyblZvaWQoKSB7IC8vIGdyb292eS00MDUsIDM4NworICAgICAgICByZXR1cm5Wb2lkKCkKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0Qm9vbGVhblZhbHVlKCkgeyAvLyBncm9vdnktMzg1CisgICAgICAgICAgICAvKiogQHRvZG8KKyAgICAgICAgICAgIGJvb2xlYW4gdmFsdWUKKyAgICAgICAgICAgICovCisgICAgICAgIH0KKworfQorCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQ2xhc3NJbk5hbWVkUGFyYW1zQnVnLmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9DbGFzc0luTmFtZWRQYXJhbXNCdWcuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NTRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQ2xhc3NJbk5hbWVkUGFyYW1zQnVnLmdyb292eQpAQCAtMCwwICsxLDIwIEBACitwYWNrYWdlIGdyb292eS5idWdzCisKK2NsYXNzIENsYXNzSW5OYW1lZFBhcmFtc0J1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKyAgICAKKyAgICB2b2lkIHRlc3RCdWcoKSB7CisgICAgICAgIGRlZiBmb28gPSBtZXRob2QoY2xhc3M6J2NoZWVzZScsIG5hbWU6J2NoZWRkYXInKQorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IGZvby5uYW1lID09ICJjaGVkZGFyIgorICAgICAgICBhc3NlcnQgZm9vLmNsYXNzID09ICJjaGVlc2UiCisgICAgICAgIAorICAgICAgICBmb28gPSBtZXRob2QobmFtZTonY2hlZGRhcicsIGNsYXNzOidjaGVlc2UnKQorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IGZvby5uYW1lID09ICJjaGVkZGFyIgorICAgICAgICBhc3NlcnQgZm9vLmNsYXNzID09ICJjaGVlc2UiCisgICAgfQorICAgIAorICAgIGRlZiBtZXRob2QoTWFwIGRhdGEpIHsKKyAgICAgICAgZGF0YQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQ2xhc3NJblNjcmlwdEJ1Zy5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0NsYXNzSW5TY3JpcHRCdWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWQ3YjY4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0NsYXNzSW5TY3JpcHRCdWcuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICRJZCQKKworIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCisgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQKKyAgICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKKyAgICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCisgICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQorICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgorICAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKKyAgICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KKworIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCisgICAgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAorICAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCisKKyA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQorICAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLworCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUworIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAorIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKKyBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgKi8KKworcGFja2FnZSBncm9vdnkuYnVnczsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW4uVGVzdFN1cHBvcnQ7CisKKworLyoqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgQ2xhc3NJblNjcmlwdEJ1ZyBleHRlbmRzIFRlc3RTdXBwb3J0IHsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RCdWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0U2NyaXB0KCJjbGFzcyBYIHt9XG54ID0gbmV3IFgoKVxucHJpbnRsbih4KSIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9DbG9zdXJlSW5DbG9zdXJlQnVnLmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9DbG9zdXJlSW5DbG9zdXJlQnVnLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2JkODY1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0Nsb3N1cmVJbkNsb3N1cmVCdWcuZ3Jvb3Z5CkBAIC0wLDAgKzEsMzMgQEAKK3BhY2thZ2UgZ3Jvb3Z5LmJ1Z3MKKworLyoqCisgKiBCdWcgaWxsdXN0cmF0aW5nIHRoZSBuZXN0ZWQgY2xvc3VyZXMgdmFyaWFibGUgc2NvcGUgdmlzaWJpbGl0eSBpc3N1ZS4KKyAqIGwuZWFjaCBpcyBDbG9zdXJlSW5DbG9zdXJlQnVnJDEgYW5kIGl0LmVhY2ggaXMgQ2xvc3VyZUluQ2xvc3VyZUJ1ZyQyCisgKiBUaGUgdmFyaWFibGUgdGV4dCBpcyBub3QgdmlzaWJsZSBmcm9tIENsb3N1cmVJbkNsb3N1cmVCdWckMi4KKyAqIEluZGVlZCwgYSBjbG9zdXJlIGNhbiBvbmx5IHNlZSB0aGUgdmFyaWFibGUgZGVmaW5lZCBvdXRzaWRlIHRoaXMgY2xvc3VyZSAob25lIGxldmVsIHVwKQorICogYnV0IGNhbm5vdCBzZWUgd2hhdCdzIGluIHRoZSBzZWNvbmQgbGV2ZWwuCisgKgorICogSW4gb3JkZXIgdG8gbWFrZSB0aGUgdGVzdCB3b3JrLCBkbyBub3QgZm9yZ2V0IHRvIHVuY29tbWVudCB0aGUgbGluZSAicHJpbnRsbih0ZXh0KSIKKyAqCisgKiBAYXV0aG91ciBHdWlsbGF1bWUgTGFmb3JnZQorICovCitjbGFzcyBDbG9zdXJlSW5DbG9zdXJlQnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCB0ZXN0SW52aXNpYmxlVmFyaWFibGUoKSB7CisgICAgICAgIGRlZiB0ZXh0ID0gInRlc3QgIgorCisgICAgICAgIGRlZiBsID0gWzEuLjExLCAyLi4xMiwgMy4uMTMsIDQuLjE0XQorCisgICAgICAgIGwuZWFjaCB7CisgICAgICAgICAgICAvL3ByaW50bG4odGV4dCkKKyAgICAgICAgICAgIGl0LmVhY2h7CisgICAgICAgICAgICAgICAgcHJpbnRsbih0ZXh0KQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgbWFpbihhcmdzKSB7CisgICAgICAgIGRlZiBidWcgPSBuZXcgQ2xvc3VyZUluQ2xvc3VyZUJ1ZygpCisgICAgICAgIGJ1Zy50ZXN0SW52aXNpYmxlVmFyaWFibGUoKQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQ2xvc3VyZVBhcmFtZXRlclBhc3NpbmdCdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0Nsb3N1cmVQYXJhbWV0ZXJQYXNzaW5nQnVnLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTcyNzUwCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0Nsb3N1cmVQYXJhbWV0ZXJQYXNzaW5nQnVnLmdyb292eQpAQCAtMCwwICsxLDQzIEBACitwYWNrYWdlIGdyb292eS5idWdzCisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuLlRlc3RTdXBwb3J0CisKKy8qKgorICogQGF1dGhvciBKb2huIFdpbHNvbgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitjbGFzcyBDbG9zdXJlUGFyYW1ldGVyUGFzc2luZ0J1ZyBleHRlbmRzIFRlc3RTdXBwb3J0IHsKKyAgICAKKyAgICB2b2lkIHRlc3RCdWdJbk1ldGhvZCgpIHsKKyAgICAgICAgZGVmIGMgPSB7IHggLT4KKyAgICAgICAgICAgIGRlZiB5ID0gMTIzCisgICAgICAgICAgICBkZWYgYzEgPSB7CisgICAgICAgICAgICAgICAgcHJpbnRsbiB5CisgICAgICAgICAgICAgICAgcHJpbnRsbiB4CisgICAgICAgICAgICAgICAgcHJpbnRsbiB4WzBdCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGMxKCkKKyAgICAgICAgfQorCisgICAgICAgIGMoWzFdKQorICAgIH0KKworICAgIHZvaWQgdGVzdEJ1ZygpIHsKKyAgICAgICAgYXNzZXJ0U2NyaXB0ICIiIgorZGVmIGMgPSB7IHggLT4KKyAgICBkZWYgeSA9IDEyMworICAgIGRlZiBjMSA9IHsgCisgICAgICAgIGFzc2VydCB4ICE9IG51bGwgLCAiQ291bGQgbm90IGZpbmQgYSB2YWx1ZSBmb3IgeCIKKyAgICAgICAgYXNzZXJ0IHkgPT0gMTIzICwgIkNvdWxkIG5vdCBmaW5kIGEgdmFsdWUgZm9yIHkiCisgICAgICAgIHByaW50bG4geFswXQorICAgIH0KKworICAgIGMxKCkKK30gCisKK2MoWzFdKSAKKyIiIgorICAgIH0KKyAgIAorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9DbG9zdXJlVHlwZWRWYXJpYWJsZUJ1Zy5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQ2xvc3VyZVR5cGVkVmFyaWFibGVCdWcuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiZTIyMjEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQ2xvc3VyZVR5cGVkVmFyaWFibGVCdWcuZ3Jvb3Z5CkBAIC0wLDAgKzEsNTQgQEAKK3BhY2thZ2UgZ3Jvb3Z5LmJ1Z3MKKworLyoqCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK2NsYXNzIENsb3N1cmVUeXBlZFZhcmlhYmxlQnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworICAgIAorICAgIHZvaWQgdGVzdEJ1ZzIoKSB7CisgICAgICAgIGRlZiBjb3VudCA9IG1ha2VDbG9zdXJlKDApCisgICAgICAgIGFzc2VydCBjb3VudCA9PSAxCisgICAgICAgIAorICAgICAgICBjb3VudCA9IG1ha2VDbG9zdXJlMigwKQorICAgICAgICBhc3NlcnQgY291bnQgPT0gMQorICAgIH0KKworCisgICAgZGVmIG1ha2VDbG9zdXJlKE51bWJlciBjb3VudCkgeworICAgICAgICBkZWYgY2xvc3VyZSA9IHsgY291bnQgPSBpdCB9CisgICAgICAgIGNsb3N1cmUoMSkKKyAgICAgICAgcmV0dXJuIGNvdW50CisgICAgfQorCisgICAgZGVmIG1ha2VDbG9zdXJlMihOdW1iZXIgYykgeworICAgICAgICBkZWYgY291bnQgPSBjCisgICAgICAgIGRlZiBjbG9zdXJlID0geyBjb3VudCA9IGl0IH0KKyAgICAgICAgY2xvc3VyZSgxKQorICAgICAgICByZXR1cm4gY291bnQKKyAgICB9CisKKyAgICB2b2lkIHRlc3RCdWcoKSB7CisgICAgICAgIEludGVnZXIgY291bnQgPSAwCisgICAgICAgIGRlZiBjbG9zdXJlID0geyBjb3VudCA9IGl0IH0KKyAgICAgICAgY2xvc3VyZSgxKQorICAgICAgICBhc3NlcnQgY291bnQgPT0gMQorICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RCdWczKCkgeworICAgICAgICBkZWYgY2xvc3VyZSA9IGdldEVsZW1lbnRDbG9zdXJlKCJwIikKKyAgICAgICAgZGVmIGFuc3dlciA9IGNsb3N1cmUoImIiKQorICAgICAgICBkZWYgdmFsdWUgPSBhbnN3ZXIoImMiKQorICAgICAgICBwcmludGxuICJyZXR1cm5lZCA6ICR7dmFsdWV9IgorICAgIH0KKyAgICAKKyAgICBDbG9zdXJlIGdldEVsZW1lbnRDbG9zdXJlKHRhZykgeworICAgICAgICByZXR1cm4geyBib2R5IC0+CisgICAgICAgICAgICBpZiAodHJ1ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiB7IiR7Ym9keX0ifQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgYm9keSA9IG51bGwKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQ2xvc3VyZVZhcmlhYmxlQnVnLmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9DbG9zdXJlVmFyaWFibGVCdWcuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwOGQzMTgKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQ2xvc3VyZVZhcmlhYmxlQnVnLmdyb292eQpAQCAtMCwwICsxLDQzIEBACitwYWNrYWdlIGdyb292eS5idWdzCisKKy8qKgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitjbGFzcyBDbG9zdXJlVmFyaWFibGVCdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisgICAgCisgICAgdm9pZCB0ZXN0Q2xvc3VyZVBhc3NpbmdCdWcoKSB7CisgICAgICAgIGRlZiBjb3VudCA9IDAKKyAgICAgICAgZGVmIGNsb3N1cmUgPSB7IGFzc2VydCBjb3VudCA9PSBpdCB9CisgICAgICAgIGNsb3N1cmUoMCkKKyAgICAgICAgCisgICAgICAgIGNvdW50ID0gMQorICAgICAgICBjbG9zdXJlKDEpCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdFBhc3NpbmdDbG9zdXJlQXNOYW1lZFBhcmFtZXRlcigpIHsKKyAgICAgICAgZGVmIHggPSAxMjMKKyAgICAgICAgCisgICAgICAgIGRlZiBmb28gPSBuZXcgRXhwYW5kbyhhOnt4fSwgYjo0NTYpCisgICAgCisgICAgICAgIGFzc2VydCBmb28uYSAhPSBudWxsCisgICAgICAgIAorICAgICAgICBwcmludGxuICJGb28gaGFzIGEgPSAke2Zvby5hfSIKKyAgICAgICAgCisgICAgICAgIGRlZiB2YWx1ZSA9IGZvby5hKCkKKyAgICAgICAgYXNzZXJ0IHZhbHVlID09IDEyMworICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RCdWcoKSB7CisgICAgICAgIGRlZiB2YWx1ZSA9IGNhbGxDbG9zdXJlKFsxLCAyXSkKKyAgICAgICAgYXNzZXJ0IHZhbHVlID09IDIKKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIEludGVnZXIgY2FsbENsb3N1cmUoY29sbGVjdGlvbikgeworICAgICAgICBJbnRlZ2VyIHgKKyAgICAgICAgLyoqIEB0b2RvCisgICAgICAgIEludGVnZXIgeCA9IDAKKyAgICAgICAgKi8KKyAgICAgICAgY29sbGVjdGlvbi5lYWNoIHsgeCA9IGl0IH0KKyAgICAgICAgcmV0dXJuIHgKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0Nsb3N1cmVXaXRoQml0d2lzZURlZmF1bHRQYXJhbVRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0Nsb3N1cmVXaXRoQml0d2lzZURlZmF1bHRQYXJhbVRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxYmM4Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQ2xvc3VyZVdpdGhCaXR3aXNlRGVmYXVsdFBhcmFtVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwxNSBAQAorcGFja2FnZSBncm9vdnkuYnVncworCitjbGFzcyBDbG9zdXJlV2l0aEJpdHdpc2VEZWZhdWx0UGFyYW1UZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworICAgIHZvaWQgdGVzdEFtYmlndW91c1N0dWZmKCkgeworICAgICAgICBkZWYgYyA9IHsgeCwgeSA9IDEgfCAyLCB6ID0gMC0+CisgICAgICAgICAgICBwcmludGxuIHgKKyAgICAgICAgICAgIHByaW50bG4geQorICAgICAgICAgICAgcHJpbnRsbiB6CisgICAgICAgIH0KKworICAgICAgICAvLyBub3cgbGV0cyBpbnZva2UgYworICAgICAgICAvLyBUT0RPIHdoZW4gY2xvc3VyZXMgc3VwcG9ydCBkZWZhdWx0IHBhcmFtZXRlcnMKKyAgICAgICAgLy9jLmNhbGwoKQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQ2xvc3VyZVdpdGhTdGF0aWNWYXJpYWJsZXNCdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0Nsb3N1cmVXaXRoU3RhdGljVmFyaWFibGVzQnVnLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGE4YjVhCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0Nsb3N1cmVXaXRoU3RhdGljVmFyaWFibGVzQnVnLmdyb292eQpAQCAtMCwwICsxLDMxIEBACitwYWNrYWdlIGdyb292eS5idWdzCisKKy8qKgorICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjUgJAorICovCitjbGFzcyBDbG9zdXJlV2l0aFN0YXRpY1ZhcmlhYmxlc0J1ZyBleHRlbmRzIFRlc3RTdXBwb3J0IHsKKyAgICAKKyAgICBzdGF0aWMgZGVmIHkgPSBbOl0KKyAgICAKKyAgICB2b2lkIHRlc3RCdWcoKSB7CisgICAgICAgIGRlZiBjID0geyB4IC0+CisgICAgICAgICAgICByZXR1cm4geworICAgICAgICAgICAgICAgIGRlZiBmb28gPSBDaGVlc2UuegorICAgICAgICAgICAgICAgIHByaW50bG4gZm9vCisgICAgICAgICAgICAgICAgYXNzZXJ0IGZvby5zaXplKCkgPT0gMAorCisgICAgICAgICAgICAgICAgcHJpbnRsbiB5CisgICAgICAgICAgICAgICAgYXNzZXJ0IHkuc2l6ZSgpID09IDAKKworICAgICAgICAgICAgICAgIHJldHVybiA2CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZGVmIGMyID0gYyg1KQorICAgICAgICBkZWYgYW5zd2VyID0gYzIoKQorICAgICAgICBhc3NlcnQgYW5zd2VyID09IDYKKyAgICB9Cit9CisKK2NsYXNzIENoZWVzZSB7CisgICAgcHVibGljIHN0YXRpYyB6ID0gWzpdCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0Nsb3N1cmVzSW5TY3JpcHRCdWcuamF2YSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9DbG9zdXJlc0luU2NyaXB0QnVnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFjODZiNQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9DbG9zdXJlc0luU2NyaXB0QnVnLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAkSWQkCisKKyBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAorIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0CisgICAgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhCisgICAgY29weSBvZiB0aGlzIGRvY3VtZW50LgorCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQorICAgIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKKyAgICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKKyAgICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCisgICAgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCisKKyA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IgorICAgIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQKKyAgICB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgorCisgNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KKyAgICBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMKKyBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKKyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCisgVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICovCisKK3BhY2thZ2UgZ3Jvb3Z5LmJ1Z3M7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuLlRlc3RTdXBwb3J0OworCisKKy8qKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIENsb3N1cmVzSW5TY3JpcHRCdWcgZXh0ZW5kcyBUZXN0U3VwcG9ydCB7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QnVnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydFNjcmlwdCgiYSA9IDFcbiBbMl0uZWFjaCB7IGEgPSBpdCB9XG4gYXNzZXJ0IGEgPT0gMiIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9Db25zdHJ1Y3RvckJ1Zy5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQ29uc3RydWN0b3JCdWcuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MWM1NDgKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQ29uc3RydWN0b3JCdWcuZ3Jvb3Z5CkBAIC0wLDAgKzEsMzggQEAKK3BhY2thZ2UgZ3Jvb3Z5LmJ1Z3MKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5JbnZva2VySGVscGVyCisKKy8qKgorICogQGF1dGhvciBKYXNvbiBUaG9tYXMKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworY2xhc3MgQ29uc3RydWN0b3JCdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisgICAgCisgICAgdm9pZCB0ZXN0QnVnKCkgeworICAgICAgICBkZWYgdHlwZSA9IG5ldyBHcm9vdnlDbGFzc0xvYWRlcigpLnBhcnNlQ2xhc3MobmV3IEZpbGUoInNyYy90ZXN0L2dyb292eS9idWdzL1Rlc3RCYXNlLmdyb292eSIpKQorICAgICAgICBhc3NlcnQgdHlwZSAhPSBudWxsCisKKyAgICAgICAgcHJpbnRsbiAiY3JlYXRlZCB0eXBlOiAke3R5cGV9IgorICAgICAgICAKKyAgICAgICAgdHlwZSA9IG5ldyBHcm9vdnlDbGFzc0xvYWRlcigpLnBhcnNlQ2xhc3MobmV3IEZpbGUoInNyYy90ZXN0L2dyb292eS9idWdzL1Rlc3REZXJpdmVkLmdyb292eSIpKQorICAgICAgICBhc3NlcnQgdHlwZSAhPSBudWxsCisKKyAgICAgICAgcHJpbnRsbiAiY3JlYXRlZCB0eXBlOiAke3R5cGV9IG9mIHR5cGU6ICR7dHlwZS5jbGFzc30iCisKKyAgICAgICAgZGVmIG15dGVzdCA9IEludm9rZXJIZWxwZXIuaW52b2tlQ29uc3RydWN0b3JPZih0eXBlLCBbIkhlbGxvIl0gYXMgT2JqZWN0W10pCisgICAgICAgIGFzc2VydCBteXRlc3QuZm9vID09ICJIZWxsbyIKKyAgICAgICAgLyoqIEB0b2RvIGZpeCBidWcKKyAgICAgICAgKi8KKyAgICAgICAgCisgICAgICAgIC8qCisgICAgICAgIGRlZiB0ZXN0ID0gdHlwZS5uZXdJbnN0YW5jZSgpCisgICAgICAgIGFzc2VydCB0ZXN0LmZvbyA9PSBudWxsCisgICAgICAgICovCisgICAgICAgIAorLy9mb28gPSBuZXcgdHlwZSgnaGVsbG8nKQorICAgICAgICAvKgorICAgICAgICAqLworICAgICAgICBteXRlc3QgPSBuZXcgVGVzdERlcml2ZWQoIkhlbGxvIikKKyAgICAgICAgYXNzZXJ0IG15dGVzdC5mb28gPT0gIkhlbGxvIgorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQ29uc3RydWN0b3JQYXJhbWV0ZXJCdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0NvbnN0cnVjdG9yUGFyYW1ldGVyQnVnLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGZjZjZjCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0NvbnN0cnVjdG9yUGFyYW1ldGVyQnVnLmdyb292eQpAQCAtMCwwICsxLDE3IEBACitwYWNrYWdlIGdyb292eS5idWdzCisKK2NsYXNzIENvbnN0cnVjdG9yUGFyYW1ldGVyQnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCB0ZXN0TWV0aG9kV2l0aE5hdGl2ZUFycmF5KCkgeworICAgICAgICBpbnRbXSB2YWx1ZSA9IFsyKjJdCisgICAgICAgIHByaW50bG4gIiR7dmFsdWV9IG9mIHR5cGUgJHt2YWx1ZS5jbGFzc30iCisgICAgICAgIC8qKiBAdG9kbyBmaXhtZSEKKyAgICAJYmxhaDIodmFsdWUpCisgICAgCSovCisgICAgfQorCisgICAgZGVmIGJsYWgyKGludFtdIHdvYmJsZSkgeworICAgICAgIHByaW50bG4od29iYmxlKQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0NvbnN0cnVjdG9yVGhpc0NhbGxCdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0NvbnN0cnVjdG9yVGhpc0NhbGxCdWcuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1OGE0YzUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQ29uc3RydWN0b3JUaGlzQ2FsbEJ1Zy5ncm9vdnkKQEAgLTAsMCArMSw2MiBAQAorLyoqCisgKiBDb25zdHJ1Y3RvclRoaXNDYWxsQnVnLmdyb292eQorICoKKyAqICAgICBUZXN0IFNjcmlwdCBmb3IgdGhlIEppcmEgaXNzdWU6IEdST09WWS05OTQuCisgKgorICogQGF1dGhvciAgICBQaWxobyBLaW0KKyAqIEBkYXRlICAgICAgMjAwNS4wOC4wNS4wNi4yMQorICovCisKK3BhY2thZ2UgZ3Jvb3Z5LmJ1Z3MKKworcHVibGljIGNsYXNzIENvbnN0cnVjdG9yVGhpc0NhbGxCdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisgICAgcHVibGljIHZvaWQgdGVzdENhbGxBKCkgeworICAgICAgICBwcmludGxuICJUZXN0aW5nIGZvciBhIGNsYXNzIHdpdGhvdXQgY2FsbCgpIgorICAgICAgICBkZWYgYTEgPSBuZXcgQ29uc3RydWN0b3JDYWxsQSgiZm9vIikgCisgICAgICAgIGRlZiBhMiA9IG5ldyBDb25zdHJ1Y3RvckNhbGxBKDkpIAorICAgICAgICBkZWYgYTMgPSBuZXcgQ29uc3RydWN0b3JDYWxsQSgpIAorICAgIH0KKworICAgIHZvaWQgdGVzdENhbGxCKCkgeworICAgICAgICBwcmludGxuICJUZXN0aW5nIGZvciBhIGNsYXNzIHdpdGggY2FsbCgpIgorICAgICAgICBkZWYgYjEgPSBuZXcgQ29uc3RydWN0b3JDYWxsQignYmFyJykgCisgICAgICAgIGRlZiBiMiA9IG5ldyBDb25zdHJ1Y3RvckNhbGxCKDkpIAorICAgICAgICBkZWYgYjMgPSBuZXcgQ29uc3RydWN0b3JDYWxsQigpIAorICAgIH0KK30KKworcHVibGljIGNsYXNzIENvbnN0cnVjdG9yQ2FsbEEgeyAKKyAgICBwdWJsaWMgQ29uc3RydWN0b3JDYWxsQSgpIHsKKyAgICAgICAgdGhpcygxOSkgICAgICAgICAgICAgICAvLyBjYWxsIGFub3RoZXIgY29uc3RydWN0b3IKKyAgICAgICAgcHJpbnRsbiAiKDEpIG5vIGFyZ3VtZW50IGNvbnNydWN0b3IiCisgICAgfSAKKworICAgIHB1YmxpYyBDb25zdHJ1Y3RvckNhbGxBKFN0cmluZyBhKSB7CisgICAgICAgIHByaW50bG4gIigyKSBTdHJpbmcgdmFsdWUgYSA9ICRhIgorICAgIH0gCisKKyAgICBwdWJsaWMgQ29uc3RydWN0b3JDYWxsQShpbnQgYSkgeworICAgICAgICB0aGlzKCIiICsgKGEqYSkpICAgICAgIC8vIGNhbGwgYW5vdGhlciBjb25zdHJ1Y3RvcgorICAgICAgICBwcmludGxuICIoMykgaW50IHZhbHVlIGEgPSAkYSIKKyAgICB9IAorfSAKKworcHVibGljIGNsYXNzIENvbnN0cnVjdG9yQ2FsbEIgeyAKKyAgICBwdWJsaWMgQ29uc3RydWN0b3JDYWxsQigpIHsKKyAgICAgICAgcHJpbnRsbiAnMTogbm8gYXJndW1lbnQgY29uc3J1Y3RvcicKKyAgICAgICAgdGhpcygxOSkgICAgICAgICAgICAgIC8vIGNhbGwgdGhlIG1ldGhvZCBjYWxsKCkKKyAgICB9IAorCisgICAgcHVibGljIENvbnN0cnVjdG9yQ2FsbEIoU3RyaW5nIGIpIHsKKyAgICAgICAgcHJpbnRsbiAiIiIyOiBTdHJpbmcgdmFsdWUgYiA9ICRiIiIiCisgICAgfSAKKworICAgIHB1YmxpYyBDb25zdHJ1Y3RvckNhbGxCKGludCBiKSB7CisgICAgICAgIHByaW50bG4gIiIiMzogaW50IHZhbHVlIGIgPSAkYiIiIgorICAgICAgICB0aGlzKCcnICsgKGIgKyBiKSkgICAgIC8vIGNhbGwgdGhlIG1ldGhvZCBjYWxsKCkKKyAgICB9IAorCisgICAgdm9pZCBjYWxsKE9iamVjdCBvKSB7CisgICAgICAgIHByaW50bG4gIkhlbGxvLCAkbyIKKyAgICB9IAorfSAKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9DdXN0b21NZXRhQ2xhc3NUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9DdXN0b21NZXRhQ2xhc3NUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTJhY2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0N1c3RvbU1ldGFDbGFzc1Rlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTE0IEBACitwYWNrYWdlIGdyb292eS5idWdzCisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuSW52b2tlckhlbHBlcgorCitjbGFzcyBDdXN0b21NZXRhQ2xhc3NUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2V7CisgICAgdm9pZCB0ZXN0UmVwbGFjZU1ldGFDbGFzcygpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQ29uc3RydWN0aW5nIGZpcnN0IGluc3RhbmNlIGJlZm9yZSBtZXRhIGNsYXNzIHJlcGxhY21lbnQKKyAgICAgICAgICogaXMgbWFkZS4KKyAgICAgICAgICovCisgICAgICAgIGRlZiBmaXJzdEluc3RhbmNlID0gImZpcnN0IgorICAgICAgICBhc3NlcnRFcXVhbHMgImZpcnN0IiwgZmlyc3RJbnN0YW5jZS50b1N0cmluZygpCisKKyAgICAgICAgZGVmIGludm9rZXIgPSBJbnZva2VySGVscGVyLmluc3RhbmNlCisgICAgICAgIGRlZiBzdG9yZWQgPSBpbnZva2VyLm1ldGFSZWdpc3RyeS5nZXRNZXRhQ2xhc3MoU3RyaW5nLmNsYXNzKQorICAgICAgICBhc3NlcnQgc3RvcmVkIGluc3RhbmNlb2YgTWV0YUNsYXNzSW1wbAorICAgICAgICBkZWYgbXlNZXRhQ2xhc3MgPSBuZXcgTXlEZWxlZ2F0aW5nTWV0YUNsYXNzKFN0cmluZy5jbGFzcykKKyAgICAgICAgaW52b2tlci5tZXRhUmVnaXN0cnkucmVtb3ZlTWV0YUNsYXNzIFN0cmluZy5jbGFzcworICAgICAgICBpbnZva2VyLm1ldGFSZWdpc3RyeS5zZXRNZXRhQ2xhc3MoU3RyaW5nLmNsYXNzLCBteU1ldGFDbGFzcykKKworICAgICAgICAvKgorICAgICAgICAgKiBDb25zdHJ1Y3Rpbmcgc2Vjb25kIGluc3RhbmNlIGFmdGVyIG1ldGEgY2xhc3MgcmVwbGFjbWVudAorICAgICAgICAgKiBpcyBtYWRlLgorICAgICAgICAgKi8KKyAgICAgICAgZGVmIHNlY29uZEluc3RhbmNlID0gInNlY29uZCIKKworICAgICAgICAvKgorICAgICAgICAgKiBTaW5jZSB3ZSBhcmUgcmVwbGFjaW5nIGEgbWV0YSBjbGFzcyBhdCB0aGUgY2xhc3MgbGV2ZWwKKyAgICAgICAgICogd2UgYXJlIGNoYW5naW5nIHRoZSBiZWhhdmlvciBvZiB0aGUgZmlyc3QgYW5kIHNlY29uZAorICAgICAgICAgKiBpbnN0YW5jZSBvZiB0aGUgc3RyaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgYXNzZXJ0RXF1YWxzICJjaGFuZ2VkIGZpcnN0IiwgZmlyc3RJbnN0YW5jZS50b1N0cmluZygpCisgICAgICAgIGFzc2VydEVxdWFscyAiY2hhbmdlZCBzZWNvbmQiLCBzZWNvbmRJbnN0YW5jZS50b1N0cmluZygpCisKKyAgICAgICAgaW52b2tlci5tZXRhUmVnaXN0cnkucmVtb3ZlTWV0YUNsYXNzIFN0cmluZy5jbGFzcworICAgICAgICBzdG9yZWQgPSBpbnZva2VyLm1ldGFSZWdpc3RyeS5nZXRNZXRhQ2xhc3MoU3RyaW5nLmNsYXNzKQorICAgICAgICBhc3NlcnQgc3RvcmVkIGluc3RhbmNlb2YgTWV0YUNsYXNzSW1wbAorICAgIH0KKworICB2b2lkIHRlc3ROb3JtYWxDcmVhdGVkICgpIHsKKyAgICAgIGFzc2VydEVxdWFscyBncm9vdnkucnVudGltZS5tZXRhY2xhc3MuZ3Jvb3Z5LmJ1Z3MuQ3VzdG9tTWV0YUNsYXNzVGVzdE1ldGFDbGFzcywgbWV0YUNsYXNzLmNsYXNzCisgICAgICBhc3NlcnRFcXVhbHMgIE1ldGFDbGFzc0ltcGwsIG1ldGFDbGFzcy5kZWxlZ2F0ZS5jbGFzcworICB9CisKKyAgdm9pZCB0ZXN0RW1jQ3JlYXRlZCAoKSB7CisgICAgR3Jvb3Z5U3lzdGVtLm1ldGFDbGFzc1JlZ2lzdHJ5LnJlbW92ZU1ldGFDbGFzcyBtZXRhQ2xhc3MudGhlQ2xhc3MKKyAgICBFeHBhbmRvTWV0YUNsYXNzLmVuYWJsZUdsb2JhbGx5KCkKKyAgICAgICAgbWV0YUNsYXNzID0gR3Jvb3Z5U3lzdGVtLm1ldGFDbGFzc1JlZ2lzdHJ5LmdldE1ldGFDbGFzcyhDdXN0b21NZXRhQ2xhc3NUZXN0KQorICAgICAgICBhc3NlcnRUcnVlIG1ldGFDbGFzcyBpbnN0YW5jZW9mIGdyb292eS5ydW50aW1lLm1ldGFjbGFzcy5ncm9vdnkuYnVncy5DdXN0b21NZXRhQ2xhc3NUZXN0TWV0YUNsYXNzCisgICAgICAgIGFzc2VydEVxdWFscyAgRXhwYW5kb01ldGFDbGFzcywgbWV0YUNsYXNzLmRlbGVnYXRlLmNsYXNzCisgICAgRXhwYW5kb01ldGFDbGFzcy5kaXNhYmxlR2xvYmFsbHkoKQorCisgICAgR3Jvb3Z5U3lzdGVtLm1ldGFDbGFzc1JlZ2lzdHJ5LnJlbW92ZU1ldGFDbGFzcyBtZXRhQ2xhc3MudGhlQ2xhc3MKKyAgICBtZXRhQ2xhc3MgPSBudWxsCisgICAgYXNzZXJ0IGdldE1ldGFDbGFzcygpIGluc3RhbmNlb2YgZ3Jvb3Z5LnJ1bnRpbWUubWV0YWNsYXNzLmdyb292eS5idWdzLkN1c3RvbU1ldGFDbGFzc1Rlc3RNZXRhQ2xhc3MKKyAgICBhc3NlcnQgTWV0YUNsYXNzSW1wbCA9PSBnZXRNZXRhQ2xhc3MoKS5kZWxlZ2F0ZS5jbGFzcworICB9CisKKyAgdm9pZCB0ZXN0U3RhdGljTWV0YUNsYXNzICgpIHsKKyAgICAgIC8vIEN1c3RvbSBtZXRhY2xhc3MgY3JlYXRlZAorICAgICAgYXNzZXJ0RXF1YWxzICBncm9vdnkucnVudGltZS5tZXRhY2xhc3MuZ3Jvb3Z5LmJ1Z3MuQ3VzdG9tTWV0YUNsYXNzVGVzdE1ldGFDbGFzcywgbWV0YUNsYXNzLmNsYXNzCisgICAgICAvLyBkZWxlZ2F0ZWQgdG8gTUNJbXBsCisgICAgICBhc3NlcnRFcXVhbHMgIE1ldGFDbGFzc0ltcGwsIG1ldGFDbGFzcy5kZWxlZ2F0ZS5jbGFzcworCisgICAgICBNZXRhQ2xhc3MgZXhwYW5kb01ldGFDbGFzcyA9IEN1c3RvbU1ldGFDbGFzc1Rlc3QubWV0YUNsYXNzCisKKyAgICAgIC8vIEl0IHN0aWxsIHRvIGJlIGN1c3RvbQorICAgICAgYXNzZXJ0RXF1YWxzIGdyb292eS5ydW50aW1lLm1ldGFjbGFzcy5ncm9vdnkuYnVncy5DdXN0b21NZXRhQ2xhc3NUZXN0TWV0YUNsYXNzLCBleHBhbmRvTWV0YUNsYXNzLmNsYXNzCisgICAgICAvLyBCdXQgZGVsZWdhdGVkIHRvIEVNQworICAgICAgYXNzZXJ0RXF1YWxzICBFeHBhbmRvTWV0YUNsYXNzLCBleHBhbmRvTWV0YUNsYXNzLmRlbGVnYXRlLmNsYXNzCisKKyAgICAgIC8vIEJ1dCBvYmplY3Qgc3RpbGwgdG8gaG9sZCByZWZlcmVuY2UgdG8gb2xkIG9uZQorICAgICAgYXNzZXJ0RXF1YWxzICBNZXRhQ2xhc3NJbXBsLCBtZXRhQ2xhc3MuZGVsZWdhdGUuY2xhc3MKKyAgICAgIC8vIGxldCBnaXZlIGl0IGNoYW5jZSB0byByZWluaXRpYWxpemUKKyAgICAgIG1ldGFDbGFzcyA9IG51bGwKKyAgICAgIC8vIE5vdyBpdCBzaG91bGQgYmUgT0sKKyAgICAgIGFzc2VydEVxdWFscyAgRXhwYW5kb01ldGFDbGFzcywgZXhwYW5kb01ldGFDbGFzcy5kZWxlZ2F0ZS5jbGFzcworCisgICAgICBleHBhbmRvTWV0YUNsYXNzLnRvU3RyaW5nID0geworICAgICAgICAgIC0+ICJJIGFtIG1vZGlmaWVkIgorICAgICAgfQorCisgICAgICBhc3NlcnRFcXVhbHMgIkkgYW0gbW9kaWZpZWQiLCB0b1N0cmluZygpCisKKyAgICAgIGFzc2VydEVxdWFscyAiSSBhbSBtb2RpZmllZCIsIG1ldGFDbGFzcy5pbnZva2VNZXRob2QodGhpcywgInRvU3RyaW5nIiwgbnVsbCkKKworICAgICAgZXhwYW5kb01ldGFDbGFzcy5zdGF0aWMudG9TdHJpbmcgPSB7CisgICAgICAgICAgLT4gIkkgYW0gbW9kaWZpZWQgc3RhdGljIgorICAgICAgfQorCisgICAgICBhc3NlcnRFcXVhbHMgIkkgYW0gbW9kaWZpZWQgc3RhdGljIiwgZ2V0Q2xhc3MoKS50b1N0cmluZygpCisgICAgICAKKyAgICAgIEdyb292eVN5c3RlbS5tZXRhQ2xhc3NSZWdpc3RyeS5yZW1vdmVNZXRhQ2xhc3MgbWV0YUNsYXNzLnRoZUNsYXNzCisgICAgICBtZXRhQ2xhc3MgPSBudWxsCisgICAgICBhc3NlcnQgZ2V0TWV0YUNsYXNzKCkgaW5zdGFuY2VvZiBncm9vdnkucnVudGltZS5tZXRhY2xhc3MuZ3Jvb3Z5LmJ1Z3MuQ3VzdG9tTWV0YUNsYXNzVGVzdE1ldGFDbGFzcworICAgICAgYXNzZXJ0IE1ldGFDbGFzc0ltcGwgPT0gZ2V0TWV0YUNsYXNzKCkuZGVsZWdhdGUuY2xhc3MKKyAgfQorCit9CisKK2NsYXNzIE15RGVsZWdhdGluZ01ldGFDbGFzcyBleHRlbmRzIGdyb292eS5sYW5nLkRlbGVnYXRpbmdNZXRhQ2xhc3MKK3sKKyAgICBNeURlbGVnYXRpbmdNZXRhQ2xhc3MoZmluYWwgQ2xhc3MgYV9jbGFzcykKKyAgICB7CisgICAgICAgIHN1cGVyKGFfY2xhc3MpOworICAgICAgICBpbml0aWFsaXplKCkKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGludm9rZU1ldGhvZChPYmplY3QgYV9vYmplY3QsIFN0cmluZyBhX21ldGhvZE5hbWUsIE9iamVjdFtdIGFfYXJndW1lbnRzKQorICAgIHsKKyAgICAgICAgcmV0dXJuICJjaGFuZ2VkICR7c3VwZXIuaW52b2tlTWV0aG9kKGFfb2JqZWN0LCBhX21ldGhvZE5hbWUsIGFfYXJndW1lbnRzKX0iCisgICAgfQorfQorCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvRGVmVmFyaWFibGVCdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0RlZlZhcmlhYmxlQnVnLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjc1NDVlCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0RlZlZhcmlhYmxlQnVnLmdyb292eQpAQCAtMCwwICsxLDIxIEBACitwYWNrYWdlIGdyb292eS5idWdzCisKKy8qKgorICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjMgJAorICovCitjbGFzcyBEZWZWYXJpYWJsZUJ1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKyAgICAKKyAgICB2b2lkIHRlc3RCdWcoKSB7CisKKyAgICAgLyogY3BvaXJpZXIgLSAiZGVmIiBjYW4gYmUgcmVmZXJlZCB0byBhcyBhIHZhcmlhYmxlIG5hbWUsCisgICAgICAgIGJ1dCBjYW5ub3QgYmUgZGVjbGFyZWQgYXMgb25lIChkdWUgdG8gYW1iaWd1aXRpZXMpCisKKyAgICAgICAgZGVmID0gMTIzCisgICAgICAgIAorICAgICAgICBhc3NlcnQgZGVmID09IDEyMworICAgICAqLworICAgICAgICAKKyAgICAgICAgZGVmIGZvbyA9IG5ldyBFeHBhbmRvKGE6MTIzLCBkZWY6NDU2KQorICAgICAgICBhc3NlcnQgZm9vLmRlZiA9PSA0NTYKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvRG91YmxlU2l6ZVBhcmFtZXRlcnNCdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0RvdWJsZVNpemVQYXJhbWV0ZXJzQnVnLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDFhOTk0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0RvdWJsZVNpemVQYXJhbWV0ZXJzQnVnLmdyb292eQpAQCAtMCwwICsxLDY4IEBACisvKgorICRJZCQKKworIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCisgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQKKyAgICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKKyAgICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCisgICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQorICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgorICAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKKyAgICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KKworIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCisgICAgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAorICAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCisKKyA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQorICAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLworCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUworIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAorIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKKyBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgKi8KKworcGFja2FnZSBncm9vdnkuYnVnczsKKworCisvKioKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpzdHJhY2hhbkBwcm90aXF1ZS5jb20iPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitjbGFzcyBEb3VibGVTaXplUGFyYW1ldGVyc0J1ZyBleHRlbmRzIFRlc3RTdXBwb3J0IHsKKworICAgIHZvaWQgdGVzdEJ1ZygpIHsKKyAgICAgICAgYXNzZXJ0U2NyaXB0KCAiIiIKK2RlZiBmb28oZG91YmxlIHgsIHkpIHsKKyAgIHByaW50bG4gIng6ICIreAorICAgcHJpbnRsbiAieTogIit5Cit9CisKK2ZvbygxMC4wZCwgMCkKKyIiIiApOworICAgIH0KK30KKworCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvRm9yQW5kU3FsQnVnLmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9Gb3JBbmRTcWxCdWcuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MmM3MTUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvRm9yQW5kU3FsQnVnLmdyb292eQpAQCAtMCwwICsxLDQwIEBACitwYWNrYWdlIGdyb292eS5idWdzCisKK2ltcG9ydCBncm9vdnkuc3FsLlRlc3RIZWxwZXIKKworLyoqCisgKiBAYXV0aG9yIEpvbmF0aGFuIENhcmxzb24KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworY2xhc3MgRm9yQW5kU3FsQnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworICAgIAorICAgIHZvaWQgdGVzdEJ1Z0luTm9ybWFsTWV0aG9kKCkgeworICAgICAgICBkZWYgc3FsID0gVGVzdEhlbHBlci5tYWtlU3FsKCkKKyAgICAgICAgCisgICAgICAgIGRlZiBsaSA9IFsiYSIsICJiIl0KKyAgICAgICAgZm9yICh4IGluIGxpKSB7CisgICAgICAgICAgICBzcWwuZWFjaFJvdygiU0VMRUNUIGNvdW50KCopIEZST00gRk9PRCIpIHsgZSAtPgorICAgICAgICAgICAgCXByaW50bG4gIiAke3h9IgorCisJICAgICAgICAgICAgYXNzZXJ0IHggIT0gbnVsbAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCB0ZXN0QnVnSW5zaWRlU2NyaXB0KCkgeworICAgICAgICBhc3NlcnRTY3JpcHQoICIiIgoraW1wb3J0IGdyb292eS5zcWwuVGVzdEhlbHBlcgorZGVmIHNxbCA9IFRlc3RIZWxwZXIubWFrZVNxbCgpCisKK2RlZiBsaSA9IFsiYSIsICJiIl0KK2ZvciAoeCBpbiBsaSkgeworICAgIHNxbC5lYWNoUm93KCJTRUxFQ1QgY291bnQoKikgRlJPTSBGT09EIikgeyBlIC0+CisgICAgCXByaW50bG4gIiBcJHt4fSIKKyAgICAJCisgICAgCWFzc2VydCB4ICE9IG51bGwKKyAgICB9Cit9CisiIiIpICAgICAgICAKKwl9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9Gb3JMb29wQnVnLmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9Gb3JMb29wQnVnLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2Y2NjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0Zvckxvb3BCdWcuZ3Jvb3Z5CkBAIC0wLDAgKzEsNjYgQEAKK3BhY2thZ2UgZ3Jvb3Z5LmJ1Z3MKKworLyoqCisgKiBAYXV0aG9yIEpvaG4gV2lsc29uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK2NsYXNzIEZvckxvb3BCdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisgICAgCisgICAgdm9pZCB0ZXN0QnVnKCkgeworICAgICAgICBhc3NlcnRTY3JpcHQoICIiIgorZGVmIGxpc3QgPSBbXQorZGVmIGEgPSAxCitkZWYgYiA9IDUKK2ZvciAoYyBpbiBhLi5iKSB7CisgICAgbGlzdCA8PCBjCit9Cithc3NlcnQgbGlzdCA9PSBbMSwgMiwgMywgNCwgNV0KKyIiIikKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0U2VhbnNCdWcoKSB7CisgICAgICAgIGFzc2VydFNjcmlwdCggIiIiCitmb3IgKGkgaW4gMS4uMTApIHsKKyAgICBwcmludGxuIGkKK30KKyIiIikgICAgICAgIAorICAgIH0KKworICAgIHZvaWQgdGVzdE5vcm1hbE1ldGhvZCgpIHsKKyAgICAgICAgZGVmIGxpc3QgPSBbXQorICAgICAgICBkZWYgYSA9IDEKKyAgICAgICAgZGVmIGIgPSA1CisgICAgICAgIGZvciAoYyBpbiBhLi5iKSB7CisgICAgICAgICAgICBsaXN0IDw8IGMKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQgbGlzdCA9PSBbMSwgMiwgMywgNCwgNV0KKyAgICB9CisgICAgCisgICAgIHZvaWQgdGVzdEJ5dGVjb2RlR2VuQnVnKCkgeworICAgICAgICBkZWYgYSA9IDEKKyAgICAgICAgZGVmIGIgPSA1CisKKyAgICAgICAgZGVmIGxhc3RJbmRleAorICAgICAgICBmb3IgKGkgaW4gYS4uYikgeworICAgICAgICAgICAgcHJpbnRsbiBpCisgICAgICAgICAgICBsYXN0SW5kZXggPSBpCisgICAgICAgIH0KKyAgICAgICAgYSA9IGxhc3RJbmRleAorICAgICAgICAKKwkJYXNzZXJ0IGEgPT0gNQorICAgIH0KKworCisgICAgdm9pZCB0ZXN0VmlzaWJpbGl0eSgpIHsKKyAgICAgICAgYXNzZXJ0U2NyaXB0KCAiIiIKKworZGVmIGFycmF5ID0gWyB0cnVlLCB0cnVlLCB0cnVlIF07Citmb3IoIGJvb2xlYW4gaSBpbiBhcnJheSApIHsKKyAgIDEudGltZXMgeworICAgICAgIGFzc2VydCBpID09IHRydWU7CisgICB9Cit9CisiIiIpCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvRnVsbHlRdWFsaWZpZWRDbGFzc0J1Zy5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvRnVsbHlRdWFsaWZpZWRDbGFzc0J1Zy5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFmOGY5ZgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9GdWxseVF1YWxpZmllZENsYXNzQnVnLmdyb292eQpAQCAtMCwwICsxLDEyIEBACitwYWNrYWdlIGdyb292eS5idWdzCisKKy8qKgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitjbGFzcyBGdWxseVF1YWxpZmllZENsYXNzQnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCB0ZXN0QnVnKCkgeworICAgICAgICBqYXZhLmxhbmcuU3lzdGVtLmVyci5wcmludGxuKCJIZWxsbyB3b3JsZCIpCisgICAgfQorICAgIAorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9GdWxseVF1YWxpZmllZE1ldGhvZFJldHVyblR5cGVCdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0Z1bGx5UXVhbGlmaWVkTWV0aG9kUmV0dXJuVHlwZUJ1Zy5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ3ODc0MQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9GdWxseVF1YWxpZmllZE1ldGhvZFJldHVyblR5cGVCdWcuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTcgQEAKK3BhY2thZ2UgZ3Jvb3Z5LmJ1Z3MKKworLyoqCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK2NsYXNzIEZ1bGx5UXVhbGlmaWVkTWV0aG9kUmV0dXJuVHlwZUJ1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIHZvaWQgdGVzdEJ1ZygpIHsKKyAgICAgICAgZGVmIHMgPSBmb28oKQorICAgICAgICBhc3NlcnQgcy5sZW5ndGgoKSA9PSAzCisgICAgfQorCisgICAgamF2YS5sYW5nLlN0cmluZyBmb28oKSB7CisgICAgICAgIHJldHVybiAiaGV5IgorICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9GdWxseVF1YWxpZmllZFZhcmlhYmxlVHlwZUJ1Zy5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvRnVsbHlRdWFsaWZpZWRWYXJpYWJsZVR5cGVCdWcuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MTkxNzYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvRnVsbHlRdWFsaWZpZWRWYXJpYWJsZVR5cGVCdWcuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTMgQEAKK3BhY2thZ2UgZ3Jvb3Z5LmJ1Z3MKKworLyoqCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK2NsYXNzIEZ1bGx5UXVhbGlmaWVkVmFyaWFibGVUeXBlQnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCB0ZXN0QnVnKCkgeworICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHMgPSAiaGV5IgorICAgICAgICBhc3NlcnQgcy5sZW5ndGgoKSA9PSAzCisgICAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0dldHRlckJ1Zy5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR2V0dGVyQnVnLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDIyNGUwCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0dldHRlckJ1Zy5ncm9vdnkKQEAgLTAsMCArMSw2NiBAQAorcGFja2FnZSBncm9vdnkuYnVncworCisvKioKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworY2xhc3MgR2V0dGVyQnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworICAgICAKKyAgICBTdHJpbmcgZm9vCisgICAgZGVmIGJhcgorCisgICAgU3RyaW5nIGdldEZvbygpIHsKKyAgICAJaWYgKGZvbyA9PSBudWxsKSB7IAorICAgIAkJZm9vID0gIkphbWVzIgorICAgIAl9CisgICAgCXJldHVybiBmb28KKyAgICB9CisgICAgCisgICAgdm9pZCBzZXRGb28oU3RyaW5nIGZvbykgeworICAgIAl0aGlzLmZvbyA9IGZvbworICAgCX0KKyAgICAKKyAgICB2b2lkIHRlc3RUeXBlZEdldHRlckFuZFNldHRlcigpIHsKKyAgICAJcHJpbnRsbiAiUnVubmluZyB0ZXN0IgorICAgIAkKKyAgICAJZGVmIHZhbHVlID0gZ2V0Rm9vKCkKKyAgICAJCisgICAgCXByaW50bG4gIlZhbHVlIGlzICR7dmFsdWV9IgorICAgIAkKKyAgICAJYXNzZXJ0IHZhbHVlID09ICJKYW1lcyIKKyAgICAJCisgICAgCXNldEZvbygiQm9iIikKKyAgICAJCisgICAgCXZhbHVlID0gZ2V0Rm9vKCkKKyAgICAJCisgICAgCWFzc2VydCB2YWx1ZSA9PSAiQm9iIgorICAgIH0KKyAgICAKKyAgICBkZWYgZ2V0QmFyKCkgeworICAgIAlpZiAodGhpcy5iYXIgPT0gbnVsbCkgeworICAgIAkJdGhpcy5iYXIgPSAiSmFtZXMiCisgICAgCX0KKyAgICAJYmFyCisgICAgfQorICAgIAorICAgIHZvaWQgc2V0QmFyKGJhcikgeworICAgIAl0aGlzLmJhciA9IGJhcgorICAgIH0KKyAgICAKKyAgICAKKyAgICB2b2lkIHRlc3RVbnR5cGVkR2V0dGVyQW5kU2V0dGVyKCkgeworICAgIAlwcmludGxuICJSdW5uaW5nIHRlc3QiCisgICAgCQorICAgIAlkZWYgdmFsdWUgPSBnZXRCYXIoKQorICAgIAkKKyAgICAJcHJpbnRsbiAiVmFsdWUgaXMgJHt2YWx1ZX0iCisgICAgCQorICAgIAlhc3NlcnQgdmFsdWUgPT0gIkphbWVzIgorICAgIAkKKyAgICAJc2V0QmFyKCJCb2IiKQorICAgIAkKKyAgICAJdmFsdWUgPSBnZXRCYXIoKQorICAgIAkKKyAgICAJYXNzZXJ0IHZhbHVlID09ICJCb2IiCisgICAgfQorICAgIAorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9Hcm9vdnkxMDE4X0J1Zy5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5MTAxOF9CdWcuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMDQ4OWEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5MTAxOF9CdWcuZ3Jvb3Z5CkBAIC0wLDAgKzEsMzMgQEAKK3BhY2thZ2UgZ3Jvb3Z5LmJ1Z3MKKworLyoqCisgKiBUZXN0IHRvIGZpeCB0aGUgSmlyYSBpc3N1ZXMgR1JPT1ZZLTEwMTggYW5kIEdST09WWS03MzIuCisgKiBBY2Nlc3MgdG8gYSBzdGF0aWMgZmllbGQgbWVtYmVyIGJ5IGEgY2xhc3MgbmFtZToKKyAqICAgICAgQ2xhc3NOYW1lLmZpZWxkTmFtZSBvciBDbGFzc05hbWUuQGZpZWxkTmFtZS4KKyAqCisgKiBAYXV0aG9yIFBpbGhvIEtpbQorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCisKK2NsYXNzIEdyb292eTEwMThfQnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeyAKKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IENsYXNzID0gImJhciIgCisKKyAgICAvLyB0b2RvOiBHUk9PVlktMTAxOAorICAgIHZvaWQgdGVzdEdldFB1YmxpY1N0YXRpY0ZpZWxkKCkgeworICAgICAgICBkZWYgYSA9IG5ldyBHcm9vdnkxMDE4X0J1ZygpCisgICAgICAgIHByaW50bG4oIGEuQ2xhc3MgKQorICAgICAgICBwcmludGxuKCBhLkBDbGFzcyApCisgICAgICAgIHByaW50bG4oIEdyb292eTEwMThfQnVnLkNsYXNzICkKKyAgICAgICAgcHJpbnRsbiggR3Jvb3Z5MTAxOF9CdWcuQENsYXNzICkKKyAgICAgICAgYXNzZXJ0IGEuQ2xhc3MgPT0gImJhciIgJiYgYS5AQ2xhc3MgPT0gImJhciIKKyAgICAgICAgYXNzZXJ0IEdyb292eTEwMThfQnVnLkNsYXNzID09ICJiYXIiICYmIEdyb292eTEwMThfQnVnLkBDbGFzcyA9PSAiYmFyIgorICAgIH0KKworICAgIC8vIHRvZG86IEdST09WWS03MzIKKyAgICB2b2lkIHRlc3RTZXRQdWJsaWNTdGF0aWNGaWVsZCgpIHsKKyAgICAgICAgR3Jvb3Z5MTAxOF9CdWcuQ2xhc3MgPSAnYmFyLScKKyAgICAgICAgYXNzZXJ0IEdyb292eTEwMThfQnVnLkNsYXNzID09ICJiYXItIiAmJiBHcm9vdnkxMDE4X0J1Zy5AQ2xhc3MgPT0gImJhci0iCisgICAgfQorCit9IApkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0dyb292eTEwNTlfQnVnLmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9Hcm9vdnkxMDU5X0J1Zy5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYwOGQwMgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9Hcm9vdnkxMDU5X0J1Zy5ncm9vdnkKQEAgLTAsMCArMSw1MyBAQAorcGFja2FnZSBncm9vdnkuYnVncworCisvKioKKyAqIFRPRE86IEdST09WWS0xMDU5CisgKgorICogICAgQWNjZXNzaWJsZSB0byBhIGNsb3N1cmUgYXR0cmlidXRlIG9mIGFuIGFiamVjdCB3aXRoIHRoZSBvcGVyYXRvciAiLkAiLgorICogICAgRm9yIGV4YW1wbGVzLCBhbGwgb2YgdGhlIGV4cHJlc3Npb25zCisgKgorICogICAgICAgICAgICBvYmplY3QuQGNsb3N1cmUoKQorICogICAgICAgICAgICBvYmplY3QuQGNsb3N1cmUuY2FsbCgpCisgKiAgICAgICAgICAgIG9iamVjdC5AY2xvc3VyZS5kb0NhbGwoKQorICogICAgICAgICAgICAob2JqZWN0LkBjbG9zdXJlKSgpCisgKgorICogICAgaGF2ZSB0aGUgc2FtZSBtZWFuaW5nLgorICoKKyAqIEBhdXRob3IgIEpvaG4gV2lsc29uCisgKiBAYXV0aG9yICBQaWxobyBLaW0KKyAqLworCitjbGFzcyBHcm9vdnkxMDU5X0J1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIHZvaWQgdGVzdENsb3N1cmVBc0F0dHJpYnV0ZSgpIHsKKyAgICAgICAgZGVmIHggPSBuZXcgR3Jvb3Z5MTA1OUZvbygpCisKKyAgICAgICAgcHJpbnRsbiggeC5zYXkoKSApCisgICAgICAgIHByaW50bG4oICh4LkBzYXkpKCkgKQorICAgICAgICBwcmludGxuKCB4LkBzYXkoKSApICAvLyBUT0RPOiBHcm9vdnktMTA1OSBzaG91bGQgd29yaworICAgICAgICBwcmludGxuKCB4LkBzYXkuY2FsbCgpICkKKyAgICAgICAgcHJpbnRsbiggeC5Ac2F5LmRvQ2FsbCgpICkKKyAgICAgICAgcHJpbnRsbiggeC5Ac2F5MigpICkKKworICAgICAgICBhc3NlcnQgIkkgYW0gYSBNZXRob2QiID09IHguc2F5KCkKKyAgICAgICAgYXNzZXJ0ICJJIGFtIGEgTWV0aG9kIiA9PSB4LkBzYXkyKCkKKyAgICAgICAgYXNzZXJ0ICJJIGFtIGEgQ2xvc3VyZSIgPT0gKHguQHNheSkoKQorICAgICAgICBhc3NlcnQgIkkgYW0gYSBDbG9zdXJlIiA9PSB4LkBzYXkoKQorICAgICAgICBhc3NlcnQgeC5Ac2F5KCkgPT0gKHguQHNheSkoKQorICAgICAgICBhc3NlcnQgeC5Ac2F5KCkgPT0geC5Ac2F5LmNhbGwoKQorICAgICAgICBhc3NlcnQgeC5Ac2F5KCkgPT0geC5Ac2F5LmRvQ2FsbCgpCisgICAgICAgIGFzc2VydCB4LkBzYXkoKSAhPSB4LnNheSgpCisgICAgICAgIGFzc2VydCB4LkBzYXkyKCkgPT0geC5zYXkoKQorICAgIH0KKworfQorCitjbGFzcyBHcm9vdnkxMDU5Rm9vIHsKKworICAgIGRlZiBwdWJsaWMgc2F5ID0geyBpdCAtPiByZXR1cm4gIkkgYW0gYSBDbG9zdXJlIiB9CisgICAgZGVmIHB1YmxpYyBzYXkyID0gdGhpcy4mc2F5CisKKyAgICBwdWJsaWMgT2JqZWN0IHNheSgpIHsKKyAgICAgICByZXR1cm4gIkkgYW0gYSBNZXRob2QiCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0dyb292eTEwODFfQnVnLmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9Hcm9vdnkxMDgxX0J1Zy5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE4ZjQwZAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9Hcm9vdnkxMDgxX0J1Zy5ncm9vdnkKQEAgLTAsMCArMSwyMCBAQAorcGFja2FnZSBncm9vdnkuYnVncworCisvKioKKyAqICBWZXJpZmllcyB0aGF0IERlZmF1bHRHcm9vdnlNZXRob2RzLnRyYW5zZm9ybUxpbmUoUmVhZGVyLCBXcml0ZXIsIENsb3N1cmUpCisgKiAgYWN0dWFsbHkgd3JpdGVzIGl0cyBvdXRwdXQuCisgKi8KKworY2xhc3MgR3Jvb3Z5MTA4MV9CdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisgCisgICAgdm9pZCB0ZXN0U2hvcnQoKSB7CisgICAgIAlkZWYgcmVhZGVyID0gbmV3IFN0cmluZ1JlYWRlcignYWJjJykKKwkJZGVmIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKQorCisJCXJlYWRlci50cmFuc2Zvcm1MaW5lKHdyaXRlcikgeyBpdCB9CisJCQorCQkvLyBJbXBsZW1lbnRhdGlvbiB3YXMgY3JlYXRpbmcgYSBCdWZmZXJlZFdyaXRlciwgYnV0IG5vdCBmbHVzaGluZyBpdAorCQlhc3NlcnRUcnVlKHdyaXRlci50b1N0cmluZygpLnN0YXJ0c1dpdGgoJ2FiYycpKQorICAgIH0KKyAgICAKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9Hcm9vdnkxNDA3X0J1Zy5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5MTQwN19CdWcuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MjVmM2MKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5MTQwN19CdWcuZ3Jvb3Z5CkBAIC0wLDAgKzEsMjUgQEAKK3BhY2thZ2UgZ3Jvb3Z5LmJ1Z3MNCisNCitjbGFzcyBHcm9vdnkxNDA3X0J1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsNCisgICB2b2lkIHRlc3RHUGF0aE9uTXVsdGlLZXlNYXAoKXsNCisgICAgICAvLyBlYWNoIGtleSBpcyBhIHR3by1lbGVtZW50IFN0cmluZyBsaXN0DQorICAgICAgLy8gZWFjaCB2YWx1ZSBpcyBhIHR3by1lbGVtZW50IGludGVnZXIgbGlzdA0KKyAgICAgIGRlZiBtYXAgPSBbWydhJywnYiddOlsyLDM0XSxbJ2MnLCdkJ106WzIsMTZdLFsnZScsJ2YnXTpbMyw5N10sWydnJywnaCddOls0LDQ4XV0NCisgICAgICBkZWYgZXhwZWN0ZWQgPSBbWyJhIiwgImIiXSxbImMiLCAiZCJdLFsiZSIsICJmIl0sWyJnIiwgImgiXV0NCisgICAgICAvLyBwcmV2aW91cyByZXR1cm5lZCB2YWx1ZSB3YXMgW2EsIGIsIGcsIGgsIGUsIGYsIGMsIGRdDQorICAgICAgLy8gaS5lLCBleHBhbmRlZA0KKyAgICAgIGRlZiBhY3R1YWwgPSBtYXAuZW50cnlTZXQoKS5rZXkNCisgICAgICBhc3NlcnQgZXhwZWN0ZWQgPT0gYWN0dWFsDQorICAgfQ0KKw0KKyAgIHZvaWQgdGVzdEdQYXRoT25NdWx0aVZhbHVlTWFwKCl7DQorICAgICAgLy8gZWFjaCBrZXkgaXMgYSB0d28tZWxlbWVudCBTdHJpbmcgbGlzdA0KKyAgICAgIC8vIGVhY2ggdmFsdWUgaXMgYSB0d28tZWxlbWVudCBpbnRlZ2VyIGxpc3QNCisgICAgICBkZWYgbWFwID0gW1snYScsJ2InXTpbMiwzNF0sWydjJywnZCddOlsyLDE2XSxbJ2UnLCdmJ106WzMsOTddLFsnZycsJ2gnXTpbNCw0OF1dDQorICAgICAgZGVmIGV4cGVjdGVkID0gW1syLCAzNF0sWzIsIDE2XSxbMywgOTddLFs0LCA0OF1dDQorICAgICAgLy8gcHJldmlvdXMgcmV0dXJuZWQgdmFsdWUgd2FzIFsyLCAzNCwgNCwgNDgsIDMsIDk3LCAyLCAxNl0NCisgICAgICAvLyBpLmUsIGV4cGFuZGVkDQorICAgICAgZGVmIGFjdHVhbCA9IG1hcC5lbnRyeVNldCgpLnZhbHVlDQorICAgICAgYXNzZXJ0IGV4cGVjdGVkID09IGFjdHVhbA0KKyAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0dyb292eTE1NjdfQnVnLmphdmEgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5MTU2N19CdWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTI5MzExCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0dyb292eTE1NjdfQnVnLmphdmEKQEAgLTAsMCArMSwzMCBAQAorcGFja2FnZSBncm9vdnkuYnVnczsKKworaW1wb3J0IGdyb292eS5sYW5nLkJpbmRpbmc7CitpbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5U2hlbGw7CitpbXBvcnQgZ3Jvb3Z5LnV0aWwuR3Jvb3Z5U2NyaXB0RW5naW5lOworaW1wb3J0IGdyb292eS51dGlsLlJlc291cmNlRXhjZXB0aW9uOworaW1wb3J0IGdyb292eS51dGlsLlNjcmlwdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBHcm9vdnkxNTY3X0J1ZyBleHRlbmRzIFRlc3RDYXNlIHsKKyAgIHB1YmxpYyB2b2lkIHRlc3RHcm9vdnlTY3JpcHRFbmdpbmVWc0dyb292eVNoZWxsKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBSZXNvdXJjZUV4Y2VwdGlvbiwgU2NyaXB0RXhjZXB0aW9uIHsKKyAgICAgIC8vIEBUT0RPIHJlZmFjdG9yIHRoaXMgcGF0aAkgICAKKyAgICAgIEZpbGUgY3VycmVudERpciA9IG5ldyBGaWxlKCIuL3NyYy90ZXN0L2dyb292eS9idWdzIik7CSAgIAorICAgICAgU3RyaW5nIGZpbGUgPSAiYnVnMTU2N19zY3JpcHQuZ3Jvb3Z5IjsKKwkgICAKKyAgICAgIEJpbmRpbmcgYmluZGluZyA9IG5ldyBCaW5kaW5nKCk7CisgICAgICBHcm9vdnlTaGVsbCBzaGVsbCA9IG5ldyBHcm9vdnlTaGVsbChiaW5kaW5nKTsKKyAgICAgIFN0cmluZ1tdIHRlc3QgPSBudWxsOworICAgICAgT2JqZWN0IHJlc3VsdCA9IHNoZWxsLnJ1biggbmV3IEZpbGUoY3VycmVudERpcixmaWxlKSwgdGVzdCApOworCisgICAgICBTdHJpbmdbXSByb290cyA9IG5ldyBTdHJpbmdbXSB7IGN1cnJlbnREaXIuZ2V0QWJzb2x1dGVQYXRoKCkgfTsKKyAgICAgIEdyb292eVNjcmlwdEVuZ2luZSBnc2UgPSBuZXcgR3Jvb3Z5U2NyaXB0RW5naW5lKHJvb3RzKTsKKyAgICAgIGJpbmRpbmcgPSBuZXcgQmluZGluZygpOworICAgICAgLy8gYSBNTUUgd2FzIGVuc3VlZCBoZXJlIHN0YXRpbmcgbm8gJ3Quc3RhcnQoKScgd2FzIGF2YWlsYWJsZQorICAgICAgLy8gaW4gdGhlIHNjcmlwdAorICAgICAgZ3NlLnJ1biggZmlsZSwgYmluZGluZyApOworICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0dyb292eTE1OTMuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0dyb292eTE1OTMuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMTEwZjUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5MTU5My5ncm9vdnkKQEAgLTAsMCArMSwxNCBAQAorcGFja2FnZSBncm9vdnkuYnVncw0KKw0KK2NsYXNzIEdyb292eTE1OTMgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7DQorICAgdm9pZCB0ZXN0UHJvcGVydHlBY2Nlc3NJblN1YkNsYXNzT2ZIYXNoTWFwKCkgew0KKyAgICAgIGRlZiBzdWJjbGFzcyA9IG5ldyBTdWJDbGFzc09mSGFzaE1hcCgpDQorICAgICAgLy8gYW55IG9mIHRoZSBmb2xsb3dpbmcgY2F1c2VkIGEgTVBFIHByZXZpb3VzbHkNCisgICAgICBhc3NlcnROdWxsIHN1YmNsYXNzLnByb3BlcnR5DQorICAgICAgc3ViY2xhc3MucHJvcGVydHkgPSAidmFsdWUiDQorICAgICAgYXNzZXJ0ICJ2YWx1ZSIgPT0gc3ViY2xhc3MucHJvcGVydHkNCisgICB9DQorDQorfQ0KKw0KK2NsYXNzIFN1YkNsYXNzT2ZIYXNoTWFwIGV4dGVuZHMgSGFzaE1hcCB7fQ0KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9Hcm9vdnkxNjE3X0J1Zy5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5MTYxN19CdWcuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMjRkNjcKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5MTYxN19CdWcuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTggQEAKK3BhY2thZ2UgZ3Jvb3Z5LmJ1Z3MNCisNCitjbGFzcyBHcm9vdnkxNjE3X0J1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsNCisgICB2b2lkIHRlc3RDb2VyY2VTdHJpbmdJbnRvU3RyaW5nQXJyYXkoKSB7DQorICAgICAgZGVmIGV4cGVjdGVkID0gWyJHIiwiciIsIm8iLCJvIiwidiIsInkiXSBhcyBTdHJpbmdbXQ0KKyAgICAgIGRlZiBhY3R1YWwgPSAiR3Jvb3Z5IiBhcyBTdHJpbmdbXQ0KKyAgICAgIGFzc2VydCBleHBlY3RlZCA9PSBhY3R1YWwNCisgICB9DQorDQorICAgdm9pZCB0ZXN0Q29lcmNlR1N0cmluZ0ludG9TdHJpbmdBcnJheSgpIHsNCisgICAgICBkZWYgZXhwZWN0ZWQgPSBbIkciLCJyIiwibyIsIm8iLCJ2IiwieSJdIGFzIFN0cmluZ1tdDQorICAgICAgZGVmIGEgPSAiR3JvIg0KKyAgICAgIGRlZiBiID0gIm92eSINCisgICAgICAvLyBwcmV2aW91c2x5IHJldHVybmVkIFsiR3Jvb3Z5Il0NCisgICAgICBkZWYgYWN0dWFsID0gIiRhJGIiIGFzIFN0cmluZ1tdDQorICAgICAgYXNzZXJ0IGV4cGVjdGVkID09IGFjdHVhbA0KKyAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0dyb292eTE3MDZfQnVnLmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9Hcm9vdnkxNzA2X0J1Zy5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ0MGUxMgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9Hcm9vdnkxNzA2X0J1Zy5ncm9vdnkKQEAgLTAsMCArMSwyMyBAQAorcGFja2FnZSBncm9vdnkuYnVncw0KKw0KK2NsYXNzIEdyb292eTE3MDZfQnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2Ugew0KKyAgIHZvaWQgdGVzdFN0YXRpY01ldGhvZElzQ2FsbGVkRnJvbVN1YmNsYXNzKCkgew0KKyAgICAgIC8vIGRpc2NsYWltZXI6IHN0YXRpYyBtZXRob2RzIHNob3VsZG4ndCBiZQ0KKyAgICAgIC8vIGNhbGxlZCBvbiBpbnN0YW5jZXMNCisgICAgICBHcm9vdnkxNzA2QSBhID0gbmV3IEdyb292eTE3MDZBKCkNCisgICAgICBHcm9vdnkxNzA2QiBiID0gbmV3IEdyb292eTE3MDZCKCkNCisgICAgICBhc3NlcnQgIkEiID09IGEuZG9pdCgpDQorICAgICAgYXNzZXJ0ICJCIiA9PSBiLmRvaXQoKQ0KKyAgIH0NCisNCisgICB2b2lkIHRlc3RTdGF0aWNNZXRob2RJc0NhbGxlZEluQ29ycmVjdEluc3RhbmNlKCkgew0KKyAgICAgIC8vIGRpc2NsYWltZXI6IHN0YXRpYyBtZXRob2RzIHNob3VsZG4ndCBiZQ0KKyAgICAgIC8vIGNhbGxlZCBvbiBpbnN0YW5jZXMNCisgICAgICBHcm9vdnkxNzA2QSBpID0gbmV3IEdyb292eTE3MDZCKCkNCisgICAgICBhc3NlcnQgIkIiID09IGkuZG9pdCgpDQorICAgICAgLy8gaW4gSmF2YSB0aGUgYW5zd2VyIHdvdWxkIGJlICJBIg0KKyAgIH0NCit9DQorDQorY2xhc3MgR3Jvb3Z5MTcwNkEgeyBzdGF0aWMgZG9pdCgpIHsgIkEiIH0gfQ0KK2NsYXNzIEdyb292eTE3MDZCIGV4dGVuZHMgR3Jvb3Z5MTcwNkEgeyBzdGF0aWMgZG9pdCgpIHsgIkIiIH0gfQ0KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9Hcm9vdnkyMzM5QnVnLmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9Hcm9vdnkyMzM5QnVnLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjNhOTFlCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0dyb292eTIzMzlCdWcuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTcgQEAKK3BhY2thZ2UgZ3Jvb3Z5LmJ1Z3MNCisNCitjbGFzcyBHcm9vdnkyMzM5QnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2Ugew0KKw0KKyAgICB2b2lkIHRlc3RCdWcgKCkgew0KKyAgICAgICAgTGlzdCBsaXN0ID0gWydncm9vdnknLCAnamF2YSddDQorICAgICAgICBNYXAgbWFwID0gW2E6IDEsIGI6IDJdDQorICAgICAgICANCisJCXNob3VsZEZhaWwgKE1pc3NpbmdNZXRob2RFeGNlcHRpb24pIHsNCisJICAgICAgICBsaXN0LmVhY2ggew0KKwkgICAgICAgICAgICBtYXAua2V5U2V0KCkuZWFjaCB7RGF0ZSBkIC0+DQorCSAgICAgICAgICAgICAgICBwcmludGxuIGQNCisJICAgICAgICAgICAgfQ0KKwkgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5MjM0OEJ1Zy5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5MjM0OEJ1Zy5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVmMzk1YwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9Hcm9vdnkyMzQ4QnVnLmdyb292eQpAQCAtMCwwICsxLDI0IEBACitwYWNrYWdlIGdyb292eS5idWdzCisKK2NsYXNzIEdyb292eTIzNDhCdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZXsKKyAgdm9pZCB0ZXN0ICgpIHsKKyAgICAgYXNzZXJ0RXF1YWxzKCBbJzEuMCcsICcyLjAnXSwgRm9vLnRlc3QoWycxLjAtdmVycycsICcyLjAtc3VidmVycyddKSkKKyAgfQorfQorCitjbGFzcyBGb28geworCisgICAgcHJpdmF0ZSBzdGF0aWMgdGVzdCh0b2tlbnMpIHsKKyAgICAgICAgdG9rZW5zLmNvbGxlY3QgeworICAgICAgICAgICAgdHJpbVRhZyhpdCkgCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB0cmltVGFnKHBsdWdpblZlcnNpb24pIHsKKyAgICAgICAgaW50IGkgPSBwbHVnaW5WZXJzaW9uLmluZGV4T2YoJy0nKQorICAgICAgICBpZihpID4gMCkgeworICAgICAgICAgICAgcGx1Z2luVmVyc2lvbiA9IHBsdWdpblZlcnNpb25bMC4uaS0xXQorICAgICAgICB9CisgICAgICAgIHBsdWdpblZlcnNpb24KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5MjM1MEJ1Zy5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5MjM1MEJ1Zy5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE4NjVmMQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9Hcm9vdnkyMzUwQnVnLmdyb292eQpAQCAtMCwwICsxLDQ2IEBACitwYWNrYWdlIGdyb292eS5idWdzCisKK2NsYXNzIEdyb292eTIzNTBCdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZXsKKworICAgICB2b2lkIHRlc3ROb0FyZyAoKSB7CisgICAgICAgICBzaG91bGRGYWlsIChvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUubWV0YWNsYXNzLk1ldGhvZFNlbGVjdGlvbkV4Y2VwdGlvbikgeworICAgICAgICAgICAgIGRlZiBhID0gbmV3IERlZmF1bHROb0FyZ0N0b3IoKQorICAgICAgICAgICAgIHByaW50bG4gYQorICAgICAgICAgfQorCisgICAgICAgICBhc3NlcnRFcXVhbHMgIk5VTEwiLCBuZXcgRGVmYXVsdE5vQXJnQ3RvcjIoKS52YWx1ZQorICAgICB9CisKKyAgICAgdm9pZCB0ZXN0Tm9EZWZDdG9yICgpIHsKKyAgICAgICAgIGRlZiBhID0gbmV3IE5vRGVmYXVsdEN0b3IoImZpcnN0IikKKyAgICAgICAgIGFzc2VydEVxdWFscyAidG9TOiBmaXJzdCIsIGEudG9TdHJpbmcoKQorCisgICAgICAgICBkZWYgYiA9IG5ldyBOb0RlZmF1bHRDdG9yKCkKKyAgICAgICAgIGFzc2VydEVxdWFscyAidG9TOiBudWxsIiwgYi50b1N0cmluZygpCisgICAgIH0KK30KKworY2xhc3MgTm9EZWZhdWx0Q3RvciB7CisgICAgZGVmIGZpZWxkCisKKyAgICBOb0RlZmF1bHRDdG9yKHBhcmFtKSB7IGZpZWxkPSBwYXJhbSB9CisKKyAgICBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICByZXR1cm4gInRvUzogJHtmaWVsZH0iCisgICAgfQorfQorCisKK2NsYXNzIERlZmF1bHROb0FyZ0N0b3IgeworICBEZWZhdWx0Tm9BcmdDdG9yKFN0cmluZyBzKSB7fQorCisgIERlZmF1bHROb0FyZ0N0b3IoaW50IHMpIHt9Cit9CisKK2NsYXNzIERlZmF1bHROb0FyZ0N0b3IyIHsKKyAgU3RyaW5nIHZhbHVlCisKKyAgRGVmYXVsdE5vQXJnQ3RvcjIoU3RyaW5nIHMpIHsKKyAgICAgIHZhbHVlID0gcyA/IHMgOiAiTlVMTCIKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0dyb292eTIzNTFCdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0dyb292eTIzNTFCdWcuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlYWJiN2EKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5MjM1MUJ1Zy5ncm9vdnkKQEAgLTAsMCArMSwxNiBAQAorcGFja2FnZSBncm9vdnkuYnVncworCitjbGFzcyBHcm9vdnkyMzUxQnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworICAgdm9pZCB0ZXN0VmFyQXJncyAoKSB7CisKKyAgICAgICBkZWYgYSA9IG5ldyBWYXJBcmdzKCkKKyAgICAgICBhc3NlcnRFcXVhbHMoICJtZXRob2Qgd2l0aCBJbnRlZ2VyIiwgYS5tZXRob2QoMSwgMiwgMywgNCwgNSkpCisgICAgICAgYXNzZXJ0RXF1YWxzKCAibWV0aG9kIHdpdGggT2JqZWN0cyIsIGEubWV0aG9kKCIiLCAyLCAiMjIiLCA0LCA1KSkKKyAgIH0KK30KKworY2xhc3MgVmFyQXJncyB7CisgICAgZGVmIG1ldGhvZChPYmplY3QuLi4gYXJncykgeyAibWV0aG9kIHdpdGggT2JqZWN0cyIgfQorCisgICAgZGVmIG1ldGhvZChJbnRlZ2VyLi4uIGFyZ3MpIHsgIm1ldGhvZCB3aXRoIEludGVnZXIiIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9Hcm9vdnkyMzlfQnVnLmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9Hcm9vdnkyMzlfQnVnLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDZhMDZkCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0dyb292eTIzOV9CdWcuZ3Jvb3Z5CkBAIC0wLDAgKzEsNDIgQEAKK3BhY2thZ2UgZ3Jvb3Z5LmJ1Z3MKKworLyoqCisgKiBAYXV0aG9yIEpvaG4gV2lsc29uCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK2NsYXNzIEdyb292eTIzOV9CdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisgICAgCisgICAgdm9pZCB0ZXN0QnVnKCkgeworICAgICAgICBkZWYgYSA9IG1ha2VDbG9zdXJlKCkKKyAgICAgICAgZGVmIGIgPSBtYWtlQ2xvc3VyZSgpCisgICAgICAgIGRlZiBjID0gbWFrZUNsb3N1cmUoKQorCisgICAgICAgIGEoKSB7CisgICAgICAgICAgICBwcmludGxuKCJBIikKKyAgICAgICAgICAgIGIoKSB7CisgICAgICAgICAgICAgICAgcHJpbnRsbigiQiIpCisgICAgICAgICAgICAgICAgYygpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRsbigiQyIpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZGVmIG1ha2VDbG9zdXJlKCkgeworICAgICAgICByZXR1cm4geyBpdCgpIH0KKyAgICB9CisKKyAgICB2b2lkIHRlc3RCdWcyKCkgeworICAgICAgICBkZWYgYSA9IHsgaXQoKSB9CisgICAgICAgIGRlZiBiID0geyBpdCgpIH0KKyAgICAgICAgZGVmIGMgPSB7IGl0KCkgfQorCisgICAgICAgIGEoKSB7CisgICAgICAgICAgICBiKCkgeworICAgICAgICAgICAgICAgIGMoKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0dyb292eTI0OV9CdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0dyb292eTI0OV9CdWcuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZTk2YmIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5MjQ5X0J1Zy5ncm9vdnkKQEAgLTAsMCArMSw2NSBAQAorcGFja2FnZSBncm9vdnkuYnVncworCitpbXBvcnQgZ3Jvb3Z5LnhtbC5NYXJrdXBCdWlsZGVyCisKKy8qKgorICogQGF1dGhvciBNZXJyaWNrIFNjaGluY2FyaW9sIAorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitjbGFzcyBHcm9vdnkyNDlfQnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCB0ZXN0QnVnKCkgeworCQlkZWYgdCA9IG5ldyBCZWFuMjQ5KCkKKwkJdC5iID0gImhlbGxvIgorCQlwcmludGxuIHQuYgorCQlwcmludGxuICJ0ZXN0OiAke3QuYn0iCisJCQorCQlkZWYgeG1sID0gbmV3IE1hcmt1cEJ1aWxkZXIoKQorCQlkZWYgcm9vdCA9IHhtbC5mb28geworCQkJYmFyIHsKKwkJCQkvLyB3b3JrcworCQkJCWJheigidGVzdCIpCisJCQkJLy8gZmFpbHMKKwkJCQliYXoodC5iKQorCQkJCS8vIGZhaWxzCisJCQkJYmF6KCIke3QuYn0iKQorCQkJfQorCQl9IAorCX0KKwkKKy8qKiBAdG9kbyBkb24ndCBrbm93IHdoeSB0aGlzIGZhaWxzCisKKyAgICB2b2lkIHRlc3RCdWdJblNjcmlwdCgpIHsKKyAgICAJYXNzZXJ0U2NyaXB0IDw8PEVPRgorCQkJaW1wb3J0IGdyb292eS54bWwuTWFya3VwQnVpbGRlcjsKKwkJCQorCQkJY2xhc3MgQmVhbiB7CisJCQkJU3RyaW5nIGIKKwkJCX07CisJCQkKKwkJCWRlZiB0ID0gbmV3IEJlYW4oKQorCQkJdC5iID0gImhlbGxvIgorCQkJcHJpbnRsbiB0LmIKKwkJCXByaW50bG4gInRlc3Q6ICR7dC5ifSIKKwkJCQorCQkJZGVmIHhtbCA9IG5ldyBNYXJrdXBCdWlsZGVyKCkKKwkJCXJvb3QgPSB4bWwuZm9vIHsKKwkJCQliYXIgeworCQkJCQkvLyB3b3JrcworCQkJCQliYXooInRlc3QiKQorCQkJCQkvLyBmYWlscworCQkJCQliYXoodC5iKQorCQkJCQkvLyBmYWlscworCQkJCQliYXooIiR7dC5ifSIpCisJCQkJfQorCQkJfSAKKworRU9GICAgIAkKKwl9CisqLworICAgCit9CisKK2NsYXNzIEJlYW4yNDkgeworCVN0cmluZyBiCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5MjUyX0J1Zy5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5MjUyX0J1Zy5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY4NzI0MAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9Hcm9vdnkyNTJfQnVnLmdyb292eQpAQCAtMCwwICsxLDM4IEBACitwYWNrYWdlIGdyb292eS5idWdzCisKKy8qKgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitjbGFzcyBHcm9vdnkyNTJfQnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworICAgIAorICAgIGRlZiBjb3VudCA9IDAKKyAgICAKKyAgICB2b2lkIHRlc3RCdWcoKSB7CisgICAgICAgIGRlZiB2YWx1ZSA9IGYoKQorICAgICAgICBhc3NlcnQgdmFsdWUgPT0gbnVsbAorICAgICAgICAKKyAgICAgICAgdmFsdWUgPSBnKCkKKyAgICAgICAgYXNzZXJ0IHZhbHVlID09IG51bGwKKyAgICAgICAgCisgICAgICAgIHZhbHVlID0gaCgpCisgICAgICAgIGFzc2VydCB2YWx1ZSA9PSBudWxsCisgICAgfQorICAgIAorICAgIAorICAgIGRlZiBmKCkgeworICAgICAgICAgaWYgKGNvdW50KysgPT0gNSkKKyAgICAgICAgICAgIHJldHVybiBudWxsCisgICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gbnVsbAorICAgIH0gCisgICAgCisgICAgZGVmIGcoKSB7CisgICAgICAgICArK2NvdW50CisgICAgICAgICByZXR1cm4gbnVsbAorICAgIH0gCisgICAgCisgICAgZGVmIGgoKSB7CisgICAgICAgICArK2NvdW50CisgICAgICAgICByZXR1cm4gbnVsbAorICAgIH0gCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5Mjc4X0J1Zy5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5Mjc4X0J1Zy5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI2OThiZQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9Hcm9vdnkyNzhfQnVnLmdyb292eQpAQCAtMCwwICsxLDIxIEBACitwYWNrYWdlIGdyb292eS5idWdzCisKKy8qKgorICogQGF1dGhvciBKb2huIFdpbHNvbgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitjbGFzcyBHcm9vdnkyNzhfQnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworICAgIAorICAgIHZvaWQgdGVzdEJ1ZygpIHsKKyAgICAgICAgZGVmIHZhbHVlID0gbmV3IE15UmFuZ2UoKQorICAgICAgICBwcmludGxuIHZhbHVlCisgICAgICAgIGFzc2VydCB2YWx1ZSAhPSBudWxsCisgICAgfQorfQorCisKK2NsYXNzIE15UmFuZ2UgZXh0ZW5kcyBJbnRSYW5nZSB7CisgICAgTXlSYW5nZSgpIHsKKyAgICAgICAgc3VwZXIoMSwgMikKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0dyb292eTMwM19CdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0dyb292eTMwM19CdWcuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNjk2ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5MzAzX0J1Zy5ncm9vdnkKQEAgLTAsMCArMSw0NyBAQAorcGFja2FnZSBncm9vdnkuYnVncworCitpbXBvcnQgamF2YS5hd3QuKgoraW1wb3J0IGphdmEuYXd0LmV2ZW50LioKK2ltcG9ydCBqYXZheC5zd2luZy4qCisKKworLyoqCisgKiBAYXV0aG9yIEJpbmcgUmFuCisgKiBAYXV0aG9yIEFuZHkgRHdlbGx5CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK2NsYXNzIEdyb292eTMwM19CdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisgICAgCisgICAgdm9pZCB0ZXN0QnVnKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZGVmIHNjaG9sYXN0aWMgPSBuZXcgU2Nob2xhc3RpYygpCisgICAgICAgICAgICAgICBzY2hvbGFzdGljLmNyZWF0ZVVJKCkKKyAgICAgICAgICAgfQorICAgICAgICAgICBjYXRjaCAoSGVhZGxlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgLy8gY2FsbGVkIGZyb20gYSBub24tVUkgZW52aXJvbm1lbnQKKyAgICAgICAgICAgfQorICAgIH0KK30KKworCitjbGFzcyBTY2hvbGFzdGljIGltcGxlbWVudHMgQWN0aW9uTGlzdGVuZXIgeworCisgICAgdm9pZCBjcmVhdGVVSSgpIHsKKyAgICAgICBwcmludGxuKCdjcmVhdGVVSSBjYWxsZWQnKQorICAgICAgIGRlZiBmcmFtZSA9IG5ldyBKRnJhbWUoIkhlbGxvIFdvcmxkIikKKyAgICAgICBkZWYgY29udGVudHMgPSBmcmFtZS5nZXRDb250ZW50UGFuZSgpCisgICAgICAgZGVmIHBhbmUgPSBuZXcgSlBhbmVsKCkKKyAgICAgICBwYW5lLnNldExheW91dChuZXcgQm9yZGVyTGF5b3V0KCkpCisgICAgICAgZGVmIGJ1dHRvbiA9IG5ldyBKQnV0dG9uKCJBIGJ1dHRvbiIpCisgICAgICAgYnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKHRoaXMpCisgICAgICAgcGFuZS5hZGQoYnV0dG9uLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKQorICAgICAgIGNvbnRlbnRzLmFkZChwYW5lKQorICAgICAgIGZyYW1lLnNldFNpemUoMTAwLCAxMDApCisgICAgICAgLy9mcmFtZS5zZXRWaXNpYmxlKHRydWUpCisgICAgICAgYnV0dG9uLmRvQ2xpY2soKQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgeworICAgICAgIHByaW50bG4gImhlbGxvIgorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9Hcm9vdnkzMDhfQnVnLmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9Hcm9vdnkzMDhfQnVnLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWJhYWVlCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0dyb292eTMwOF9CdWcuZ3Jvb3Z5CkBAIC0wLDAgKzEsMjYgQEAKK3BhY2thZ2UgZ3Jvb3Z5LmJ1Z3MKKworaW1wb3J0IGphdmEuaW8uKgorCisvKioKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworY2xhc3MgR3Jvb3Z5MzA4X0J1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKyAgICAKKyAgICB2b2lkIHRlc3RCdWcoKSB7CisgICAgCWRlZiBvdXQgPSBuZXcgU3RyaW5nV3JpdGVyKCkKKyAgICAJb3V0IDw8ICJoZWxsbyAiIDw8ICJ3b3JsZCEiCisgICAgCQorICAgIAlkZWYgdmFsdWUgPSBvdXQudG9TdHJpbmcoKQorICAgIAlhc3NlcnQgdmFsdWUgPT0gImhlbGxvIHdvcmxkISIKKyAgICAJCisgICAgCW91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKQorICAgIAlvdXQgPDwgImhlbGxvICIgPDwgIndvcmxkISIKKworCQl2YWx1ZSA9IG5ldyBTdHJpbmcob3V0LnRvQnl0ZUFycmF5KCkpCisJCWFzc2VydCB2YWx1ZSA9PSAiaGVsbG8gd29ybGQhIgorICAgIAkgICAgCQorICAgIAlTeXN0ZW0ub3V0IDw8ICJoZWxsbyIgPDwgIiB3b3JsZCEiCisgICAgfQorfQorCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5MzI1X0J1Zy5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5MzI1X0J1Zy5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNhMTQ1NAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9Hcm9vdnkzMjVfQnVnLmdyb292eQpAQCAtMCwwICsxLDEyIEBACitwYWNrYWdlIGdyb292eS5idWdzCisKK2NsYXNzIEdyb292eTMyNV9CdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisgIHN0YXRpYyBib29sZWFuIHN0YXRpY01ldGhvZCgpIHsKKyAgICByZXR1cm4gdHJ1ZQorICB9CisKKyAgdm9pZCB0ZXN0Q2FsbFN0YXRpY01ldGhvZEZyb21DbG9zdXJlKCkgeworICAgIGRlZiBjID0geyBzdGF0aWNNZXRob2QoKSB9CisgICAgYXNzZXJ0IGMoKQorICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0dyb292eTM4OV9CdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0dyb292eTM4OV9CdWcuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4Mjc1YjIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5Mzg5X0J1Zy5ncm9vdnkKQEAgLTAsMCArMSwyMyBAQAorcGFja2FnZSBncm9vdnkuYnVncworCisvKioKKyAqICBWZXJpZmllcyB0aGF0IGNsb3N1cmVzIHdvcmsgaW5zaWRlIGNhc2UgYmxvY2tzLgorICoKKyAqLworCitjbGFzcyBHcm9vdnkzODlfQnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworIAorICAgIHZvaWQgdGVzdEJ1ZygpIHsKKyAgICAgICBkZWYgYSA9IFsxMCwgMTEsIDEyXQorICAgICAgIGRlZiBiID0gMAorICAgICAgIAorICAgICAgIHN3aXRjaCggImxpc3QiICkgeworICAgICAgICAgIGNhc2UgImxpc3QiOgorICAgICAgICAgICAgIGEuZWFjaCB7IGIgPSBiICsgMSB9CisgICAgICAgICAgICAgYnJlYWsKKyAgICAgICB9CisKKyAgICAgICBhc3NlcnQgYiA9PSAzCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5NTEzX0J1Zy5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5NTEzX0J1Zy5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY3OTA0ZQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9Hcm9vdnk1MTNfQnVnLmdyb292eQpAQCAtMCwwICsxLDE4IEBACitwYWNrYWdlIGdyb292eS5idWdzDQorDQorLyoqDQorICogIFZlcmlmaWVzIHRoYXQgY29tcGFyaXNvbnMgdG8gSW50ZWdlci5NSU5fVkFMVUUgd29yaw0KKyAqLw0KKw0KK2NsYXNzIEdyb292eTUxM19CdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7DQorIA0KKyAgICB2b2lkIHRlc3RNaW5NYXhWYWx1ZUNvbXBhcmlzb24oKSB7DQorICAgIAlhc3NlcnRUcnVlKDggPCBJbnRlZ2VyLk1BWF9WQUxVRSk7DQorICAgIAlhc3NlcnRUcnVlKDggPiBJbnRlZ2VyLk1JTl9WQUxVRSk7DQorICAgIAlhc3NlcnRUcnVlKDhMIDwgTG9uZy5NQVhfVkFMVUUpOw0KKyAgICAJYXNzZXJ0VHJ1ZSg4TCA+IExvbmcuTUlOX1ZBTFVFKTsNCisgICAgCWFzc2VydFRydWUoOC4wIDwgRG91YmxlLk1BWF9WQUxVRSk7DQorICAgIAlhc3NlcnRUcnVlKDguMCA+IERvdWJsZS5NSU5fVkFMVUUpOw0KKyAgICB9DQorICAgIA0KK30NCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5NTU4XzYxNl9CdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0dyb292eTU1OF82MTZfQnVnLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTM0NDBmCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0dyb292eTU1OF82MTZfQnVnLmdyb292eQpAQCAtMCwwICsxLDQ1IEBACitwYWNrYWdlIGdyb292eS5idWdzCisKK2ltcG9ydCBncm9vdnkudXRpbC5EdW1teQorCisvKioKKyAgKiBGaXhlcyBHUk9PVlktNTU4IGFuZCBHUk9PVlktNjE2LgorICAqIEEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgZW5kaW5nIHdpdGggLmNsYXNzIG9yIG5vdCB3ZXJlIG5vdCByZWNvZ25pemVkIHByb3Blcmx5LgorICAqCisgICogQGF1dGhvciBKb2NoZW4gVGhlb2Rvcm91CisgICogQGF1dGhvciBHdWlsbGF1bWUgTGFmb3JnZQorICAqLworY2xhc3MgR3Jvb3Z5NTU4XzYxNl9CdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICB2b2lkIHRlc3RMaXN0Q2xhc3MoKSB7CisgICAgICAgIGFzc2VydCBqYXZhLnV0aWwuQXJyYXlMaXN0LmNsYXNzID09IEFycmF5TGlzdC5jbGFzcworICAgICAgICBhc3NlcnQgamF2YS51dGlsLkFycmF5TGlzdC5jbGFzcyA9PSBBcnJheUxpc3QKKyAgICAgICAgYXNzZXJ0IEFycmF5TGlzdCAhPSBDbGFzcworICAgICAgICBkZWYgbGlzdCA9IG5ldyBBcnJheUxpc3QoKQorICAgICAgICBhc3NlcnQgbGlzdC5jbGFzcyA9PSBBcnJheUxpc3QKKyAgICB9CisKKyAgICB2b2lkIHRlc3RTdHJpbmdDbGFzcygpIHsKKyAgICAgICAgYXNzZXJ0IGphdmEubGFuZy5TdHJpbmcuY2xhc3MgPT0gU3RyaW5nLmNsYXNzCisgICAgICAgIGFzc2VydCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzID09IFN0cmluZworICAgICAgICBhc3NlcnQgU3RyaW5nICE9IENsYXNzCisgICAgICAgIGRlZiBzdCA9ICIiCisgICAgICAgIGFzc2VydCBzdC5jbGFzcyA9PSBTdHJpbmcKKyAgICB9CisKKyAgICB2b2lkIHRlc3REdW1teUNsYXNzKCkgeworICAgICAgICBhc3NlcnQgZ3Jvb3Z5LnV0aWwuRHVtbXkuY2xhc3MgPT0gRHVtbXkuY2xhc3MKKyAgICAgICAgYXNzZXJ0IGdyb292eS51dGlsLkR1bW15LmNsYXNzID09IER1bW15CisgICAgICAgIGFzc2VydCBEdW1teSAhPSBDbGFzcworICAgICAgICBkZWYgZHVtID0gbmV3IER1bW15KCkKKyAgICAgICAgYXNzZXJ0IGR1bS5jbGFzcyA9PSBEdW1teQorICAgIH0KKworICAgIHZvaWQgdGVzdEZvb0NsYXNzKCkgeworICAgICAgICBhc3NlcnQgZ3Jvb3Z5LmJ1Z3MuR3Jvb3Z5NTU4XzYxNl9CdWcuY2xhc3MgPT0gR3Jvb3Z5NTU4XzYxNl9CdWcKKyAgICAgICAgYXNzZXJ0IEdyb292eTU1OF82MTZfQnVnICE9IENsYXNzCisgICAgICAgIGRlZiBmID0gbmV3IEdyb292eTU1OF82MTZfQnVnKCkKKyAgICAgICAgYXNzZXJ0IGYuY2xhc3MgPT0gR3Jvb3Z5NTU4XzYxNl9CdWcKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9Hcm9vdnk1OTNfQnVnLmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9Hcm9vdnk1OTNfQnVnLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGE2NzhlCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0dyb292eTU5M19CdWcuZ3Jvb3Z5CkBAIC0wLDAgKzEsNTggQEAKK3BhY2thZ2UgZ3Jvb3Z5LmJ1Z3MKKworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyCitpbXBvcnQgZ3Jvb3Z5LnhtbC5NYXJrdXBCdWlsZGVyCisKKy8qKiAKKyAqIFRlc3RzIHRoYXQgc3BlY2lhbCBYTUwgY2hhcnMgYXJlIGVudGl0aXplZCBieSBNYXJrdXBCdWlsZGVyLgorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnNjb3R0c3RpcmxpbmdAcmNuLmNvbSI+U2NvdHQgU3Rpcmxpbmc8L2E+CisgKgorICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjQgJAorICoKKyAqICAgRml4IHRoZSBjciBsZiBoYW5kbGluZyBvZiBtdWx0aWxpbmUgc3RyaW5nb24gYm90aCBvZiBsaW51eCBhbmQgV2luZG93cyBYUC4KKyAqICAgVGhpcyB0ZXN0IHNob3VsZCBzdWNjZXNzIG9uIFdpbmRvd3MgWFAuCisgKgorICogICBAYXV0aG9yIFBpbGhvIEtpbQorICovCitjbGFzcyBHcm9vdnk1OTNfQnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworICAgIAorICAgIFN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCkKKyAgICBNYXJrdXBCdWlsZGVyIGNoYXJzID0gbmV3IE1hcmt1cEJ1aWxkZXIod3JpdGVyKQorICAgIFhtbFBhcnNlciBwYXJzZXIgPSBuZXcgWG1sUGFyc2VyKCkKKyAgICBTdHJpbmcgZXhwZWN0ZWRYTUwgPSAKKyIiIjxjaGFycz4KKyAgPGFtcGVyc2FuZCBhPScmYW1wOyc+JmFtcDs8L2FtcGVyc2FuZD4KKyAgPHF1b3RlIGF0dHI9JyInPiI8L3F1b3RlPgorICA8YXBvc3Ryb3BoZSBhdHRyPScmYXBvczsnPic8L2Fwb3N0cm9waGU+CisgIDxsZXNzdGhhbiBhdHRyPSd2YWx1ZSc+Y2hhcnM6ICZhbXA7ICZsdDsgJmd0OyAnPC9sZXNzdGhhbj4KKyAgPGVsZW1lbnQgYXR0cj0ndmFsdWUgMSAmYW1wOyAyJz5jaGFyczogJmFtcDsgJmx0OyAmZ3Q7ICIgaW4gbWlkZGxlPC9lbGVtZW50PgorICA8Z3JlYXRlcnRoYW4+Jmd0OzwvZ3JlYXRlcnRoYW4+Cis8L2NoYXJzPiIiIgorCisgICAgdm9pZCB0ZXN0QnVnKCkgeworICAgICAgICAvLyBYTUwgY2hhcmFjdGVycyB0byB0ZXN0IHdpdGgKKyAgICAgICAgY2hhcnMuY2hhcnMgeworICAgICAgICAgICAgYW1wZXJzYW5kKGE6ICImIiwgIiYiKQorICAgICAgICAgICAgcXVvdGUoYXR0cjogIlwiIiwgIlwiIikKKyAgICAgICAgICAgIGFwb3N0cm9waGUoYXR0cjogIiciLCAiJyIpCisgICAgICAgICAgICBsZXNzdGhhbihhdHRyOiAidmFsdWUiLCAiY2hhcnM6ICYgPCA+ICciKSAKKyAgICAgICAgICAgIGVsZW1lbnQoYXR0cjogInZhbHVlIDEgJiAyIiwgImNoYXJzOiAmIDwgPiBcIiBpbiBtaWRkbGUiKQorICAgICAgICAgICAgZ3JlYXRlcnRoYW4oIj4iKQorICAgICAgICB9CisgICAgICAgIC8vREVCVUcKKyAgICAgICAgLy9wcmludGxuIHdyaXRlcgorCisgICAgICAgIC8vIFRlc3QgTWFya3VwQnVpbGRlciBzdGF0ZSB3aXRoIGV4cGVjdGVkWE1MCisgIAkgICAgLy8gSGFuZGxpbmcgdGhlIGNyIGxmIGNoYXJhY3RlcnMsIGRlcGVuZGluZyBvbiBvcGVyYXRpbmcgc3lzdGVtLiAKKyAgICAgICAgZGVmIG91dHB1dFZhbHVlID0gd3JpdGVyLnRvU3RyaW5nKCkKKyAgICAgICAgaWYgKGV4cGVjdGVkWE1MLmluZGV4T2YoIlxyXG4iKSA+PSAwKSAgZXhwZWN0ZWRYTUwgPSBleHBlY3RlZFhNTC5yZXBsYWNlQWxsKCJcclxuIiwgIlxuIik7CisgICAgICAgIGlmIChvdXRwdXRWYWx1ZS5pbmRleE9mKCJcclxuIikgPj0gMCkgIG91dHB1dFZhbHVlID0gb3V0cHV0VmFsdWUucmVwbGFjZUFsbCgiXHJcbiIsICJcbiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRYTUwucmVwbGFjZUFsbCgiXHJcbiIsICJcbiIpLCBvdXRwdXRWYWx1ZSkKKyAgICAgICAgCisgICAgICAgIC8vIHBhcnNlciB3aWxsIHRocm93IGEgU0FYUGFyc2VFeGNlcHRpb24gaWYgWE1MIGlzIG5vdCB2YWxpZAorICAgICAgICBwYXJzZXIucGFyc2VUZXh0KHdyaXRlci50b1N0cmluZygpKQorICAgIH0KKyAgICAKK30KKwpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0dyb292eTY2Mi5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5NjYyLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWVjYmU3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0dyb292eTY2Mi5ncm9vdnkKQEAgLTAsMCArMSw2NiBAQAorcGFja2FnZSBncm9vdnkuYnVncworCisvLyAgVGhlIG9yZGVyIG9mIHRoZSBjbGFzc2VzIGlzIGNydWNpYWwsIHRoZSBmaXJzdCBtdXN0IGJlIHRoZSBHcm9vdnlUZXN0Q2FzZS4gIEl0cyBuYW1lIGRvZXNuJ3QKKy8vICBtYXR0ZXIgaXQganVzdCBoYXMgdG8gYmUgZmlyc3QuCisKKy8qKgorICogVGVzdCBjbGFzcyBhbmQgc3VwcG9ydCB0byByZWFsaXplIHRoZSBHUk9PVlktNjYyIHRlc3QuICBUaGVyZSBpcyBhIGRpZmZlcmVuY2UgYmV0d2VlbgorICogaW1wcm9wZXIgdXNlcyBvZiBwcm9wZXJ0aWVzIGJldHdlZW4gR3Jvb3Z5IGRlZmluZWQgY2xhc3NlcyBhbmQgSmF2YSBkZWZpbmVkIGNsYXNzZXMuICBUaGVyZQorICogaXMgbm8gZGlmZmVyZW5jZSBiZXR3ZWVuIGNvcnJlY3QgdXNlcyBzbyB0aGlzIGlzIG5vdCBhIHByb2JsZW0ganVzdCBhbiBhbnRpLXJlZ3Jlc3Npb24gdGVzdC4KKyAqCisgKiAgQGF1dGhvciBSdXNzZWwgV2luZGVyCisgKiAgQHZlcnNpb24gJFJldmlzaW9uJAorICovIAorY2xhc3MgR3Jvb3Z5NjYyIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworICBwcml2YXRlIFN0cmluZyBleHBlY3RlZCA9ICJIZWxsbyIKKyAgcHJpdmF0ZSB1c2VQcm9wZXJ0eUNvcnJlY3RseSAoIGRlZiBvYmplY3QgKSB7IHJldHVybiBvYmplY3QuQG15UHJvcGVydHkgfQorICBwcml2YXRlIHVzZVByb3BlcnR5SW5jb3JyZWN0bHkgKCBkZWYgb2JqZWN0ICkgeyByZXR1cm4gb2JqZWN0Lm15UHJvcGVydHkgfQorICBwcml2YXRlIHVzZU1ldGhvZCAoIGRlZiBvYmplY3QgKSB7IHJldHVybiBvYmplY3QuZ2V0TXlQcm9wZXJ0eSAoICkgfQorICBwcml2YXRlIHZvaWQgZG9Bc3NlcnRpb25zICggZGVmIG9iamVjdCApIHsKKyAgICBhc3NlcnRUcnVlICggdXNlTWV0aG9kICggb2JqZWN0ICkgPT0gZXhwZWN0ZWQgKQorICAgIGFzc2VydFRydWUgKCB1c2VQcm9wZXJ0eUNvcnJlY3RseSAoIG9iamVjdCApID09IGV4cGVjdGVkICkKKyAgfQorICBwcml2YXRlIFN0cmluZyB0aGVUZXN0U2NyaXB0RGVmaW5pdGlvbnMgPSAiIiIKK1N0cmluZyBleHBlY3RlZCA9ICJIZWxsbyIKK2RlZiB1c2VQcm9wZXJ0eUNvcnJlY3RseSAoIGRlZiBvYmplY3QgKSB7IHJldHVybiBvYmplY3QuQG15UHJvcGVydHkgfQorZGVmIHVzZVByb3BlcnR5SW5jb3JyZWN0bHkgKCBkZWYgb2JqZWN0ICkgeyByZXR1cm4gb2JqZWN0Lm15UHJvcGVydHkgfQorZGVmIHVzZU1ldGhvZCAoIGRlZiBvYmplY3QgKSB7IHJldHVybiBvYmplY3QuZ2V0TXlQcm9wZXJ0eSAoICkgfQorIiIiCisgIHByaXZhdGUgU3RyaW5nIHRoZVRlc3RTY3JpcHRBc3NlcnRpb25zID0gIiIiCithc3NlcnQgdXNlTWV0aG9kICggb2JqZWN0ICkgPT0gZXhwZWN0ZWQKK2Fzc2VydCB1c2VQcm9wZXJ0eUNvcnJlY3RseSAoIG9iamVjdCApID09IGV4cGVjdGVkCisiIiIKKyAgcHVibGljIHZvaWQgdGVzdEphdmFDbGFzcyAoICkgeworICAgIGRlZiBvYmplY3QgPSBuZXcgZ3Jvb3Z5LmJ1Z3MuR3Jvb3Z5NjYyX0phdmFDbGFzcyAoICkgCisgICAgZG9Bc3NlcnRpb25zICggb2JqZWN0ICkKKyAgICBhc3NlcnRUcnVlICggdXNlUHJvcGVydHlJbmNvcnJlY3RseSAoIG9iamVjdCApID09IG51bGwgKQorICB9CisgIHB1YmxpYyB2b2lkIHRlc3RHcm9vdnlDbGFzcyAoICkgeworICAgIGRlZiBvYmplY3QgPSBuZXcgR3Jvb3Z5NjYyX0dyb292eUNsYXNzICggKSAKKyAgICBkb0Fzc2VydGlvbnMgKCBvYmplY3QgKQorICAgIGFzc2VydFRydWUgKCB1c2VQcm9wZXJ0eUluY29ycmVjdGx5ICggb2JqZWN0ICkgPT0gZXhwZWN0ZWQgKQorICB9CisgIHB1YmxpYyB2b2lkIHRlc3RKYXZhQ2xhc3NBc1NjcmlwdCAoICkgeyBhc3NlcnRTY3JpcHQgKCB0aGVUZXN0U2NyaXB0RGVmaW5pdGlvbnMgKyAiIiIKK2RlZiBvYmplY3QgPSBuZXcgZ3Jvb3Z5LmJ1Z3MuR3Jvb3Z5NjYyX0phdmFDbGFzcyAoICkKKyIiIiArIHRoZVRlc3RTY3JpcHRBc3NlcnRpb25zICsgIiIiCithc3NlcnQgdXNlUHJvcGVydHlJbmNvcnJlY3RseSAoIG9iamVjdCApID09IG51bGwKKyIiIikgfQorICBwdWJsaWMgdm9pZCB0ZXN0R3Jvb3Z5Q2xhc3NBc1NjcmlwdCAoICkgeworICAgIGFzc2VydFNjcmlwdCAoIHRoZVRlc3RTY3JpcHREZWZpbml0aW9ucyArICIiIgorY2xhc3MgR3Jvb3Z5NjYyX0dyb292eUNsYXNzIGV4dGVuZHMgSGFzaE1hcCB7CisgIFN0cmluZyBteVByb3BlcnR5ID0gIkhlbGxvIgorICBwdWJsaWMgU3RyaW5nIGdldE15UHJvcGVydHkgKCApIHsgcmV0dXJuIG15UHJvcGVydHkgfQorfQorZGVmIG9iamVjdCA9IG5ldyBHcm9vdnk2NjJfR3Jvb3Z5Q2xhc3MgKCApCisiIiIgKyB0aGVUZXN0U2NyaXB0QXNzZXJ0aW9ucyArICIiIgorYXNzZXJ0IHVzZVByb3BlcnR5SW5jb3JyZWN0bHkgKCBvYmplY3QgKSA9PSBleHBlY3RlZAorIiIiKQorICB9Cit9CisKK2NsYXNzIEdyb292eTY2Ml9Hcm9vdnlDbGFzcyBleHRlbmRzIEhhc2hNYXAgeworICBTdHJpbmcgbXlQcm9wZXJ0eSA9ICJIZWxsbyIKKyAgcHVibGljIFN0cmluZyBnZXRNeVByb3BlcnR5ICggKSB7CisgICAgcmV0dXJuIG15UHJvcGVydHkKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0dyb292eTY2Ml9KYXZhQ2xhc3MuamF2YSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9Hcm9vdnk2NjJfSmF2YUNsYXNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRjZTNmYwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9Hcm9vdnk2NjJfSmF2YUNsYXNzLmphdmEKQEAgLTAsMCArMSwxOSBAQAorcGFja2FnZSBncm9vdnkuYnVnczsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCisvKioKKyAqIENsYXNzIHRvIHN1cHBvcnQgdGhlIEdST09WWS02NjIgdGVzdC4gIFRoZXJlIGlzIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIGltcHJvcGVyIHVzZXMgb2YKKyAqIHByb3BlcnRpZXMgYmV0d2VlbiBHcm9vdnkgZGVmaW5lZCBjbGFzc2VzIGFuZCBKYXZhIGRlZmluZWQgY2xhc3Nlcy4gIFRoZXJlIGlzIG5vIGRpZmZlcmVuY2UKKyAqIGJldHdlZW4gY29ycmVjdCB1c2VzIHNvIHRoaXMgaXMgbm90IGEgcHJvYmxlbSBqdXN0IGFuIGFudGktcmVncmVzc2lvbiB0ZXN0LgorICoKKyAqIEBhdXRob3IgUnVzc2VsIFdpbmRlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgR3Jvb3Z5NjYyX0phdmFDbGFzcyBleHRlbmRzIEhhc2hNYXAgeworICAgIFN0cmluZyBteVByb3BlcnR5ID0gIkhlbGxvIjsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TXlQcm9wZXJ0eSgpIHsKKyAgICAgICAgcmV0dXJuIG15UHJvcGVydHk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0dyb292eTY2Nl9CdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0dyb292eTY2Nl9CdWcuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ODA4NDEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5NjY2X0J1Zy5ncm9vdnkKQEAgLTAsMCArMSwxMSBAQAorcGFja2FnZSBncm9vdnkuYnVncworCisvKioKKyAqICBAYXV0aG9yIFJ1c3NlbCBXaW5kZXIKKyAqICBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8gCitjbGFzcyBHcm9vdnk2NjZfQnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworICB2b2lkIHRlc3RSdW5TY3JpcHQoKSB7CisgICAgKG5ldyBHcm9vdnlTaGVsbCAoKSkuZXZhbHVhdGUoInggPSAxIikKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0dyb292eTY3NF9CdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0dyb292eTY3NF9CdWcuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNmI1NTEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5Njc0X0J1Zy5ncm9vdnkKQEAgLTAsMCArMSw1NSBAQAorcGFja2FnZSBncm9vdnkuYnVncworCisvKioKKyAqICBUZXN0IHRvIGVuc3VyZSBhbGwgdGhlIHJpZ2h0IGV4Y2VwdGlvbnMgYXJlIHRocm93biBmb3IgYWxsIHRoZSByaWdodC93cm9uZyBjb21iaW5hdGlvbnMgb2YKKyAqICBwYXJlbnRoZXNlcyBhbmQgbm8gcGFyYW1ldGVycyBmb3IgcHJpbnQgYW5kIHByaW50bG4uCisgKgorICogIEBhdXRob3IgUnVzc2VsIFdpbmRlcgorICogIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworY2xhc3MgR3Jvb3Z5Njc0X0J1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKyAgdm9pZCB0ZXN0VG9wTGV2ZWxQcmludFBhcmVudGhlc2VzTm9QYXJhbWV0ZXIgKCApIHsKKyAgICB0cnkgeyAoIG5ldyBHcm9vdnlTaGVsbCAoICkgKS5ldmFsdWF0ZSAoICJwcmludCAoICkiICkgfQorICAgIGNhdGNoICggR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbiBncmUgKSB7IHJldHVybiB9CisgICAgZmFpbCAoICJTaG91bGQgaGF2ZSB0aHJvd24gR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbiIgKSA7CisgIH0KKyAgdm9pZCB0ZXN0VG9wTGV2ZWxQcmludGxuUGFyZW50aGVzZXNOb1BhcmFtZXRlciAoICkgeworICAgIGFzc2VydFNjcmlwdCAoICJwcmludGxuICggKSIgKQorICB9CisgIHZvaWQgdGVzdENsb3N1cmVQcmludFBhcmVudGhlc2VzTm9QYXJhbWV0ZXIgKCApIHsKKyAgICB0cnkgeyAoIG5ldyBHcm9vdnlTaGVsbCAoICkgKS5ldmFsdWF0ZSAoICJbIDEgLCAyICwgMyAsIDQgLCA1IF0uZWFjaCB7IHByaW50ICggKSB9IiApIH0KKyAgICBjYXRjaCAoIEdyb292eVJ1bnRpbWVFeGNlcHRpb24gZ3JlICkgeyByZXR1cm4gfQorICAgIGZhaWwgKCAiU2hvdWxkIGhhdmUgdGhyb3duIEdyb292eVJ1bnRpbWVFeGNlcHRpb24iICkgOworICB9CisgIHZvaWQgdGVzdENsb3N1cmVQcmludGxuUGFyZW50aGVzZXNOb1BhcmFtZXRlciAoICkgeworICAgIGFzc2VydFNjcmlwdCAoICJbIDEgLCAyICwgMyAsIDQgLCA1IF0uZWFjaCB7IHByaW50bG4gKCApIH0iICkKKyAgfQorICB2b2lkIHRlc3RUb3BMZXZlbFByaW50Tm9QYXJlbnRoZXNlc1BhcmFtZXRlciAoICkgeyBhc3NlcnRTY3JpcHQgKCAicHJpbnQgKCAnJyApIiApIH0KKyAgdm9pZCB0ZXN0VG9wTGV2ZWxQcmludGxuTm9QYXJlbnRoZXNlc1BhcmFtZXRlciAoICkgeyBhc3NlcnRTY3JpcHQgKCAicHJpbnRsbiAoICcnICkiICkgfQorICB2b2lkIHRlc3RDbG9zdXJlUHJpbnROb1BhcmVudGhlc2VzUGFyYW1ldGVyICggKSB7IGFzc2VydFNjcmlwdCAoICJbIDEgLCAyICwgMyAsIDQgLCA1IF0uZWFjaCB7IHByaW50ICggJycgKSB9IiApIH0KKyAgdm9pZCB0ZXN0Q2xvc3VyZVByaW50bG5Ob1BhcmVudGhlc2VzUGFyYW1ldGVyICggKSB7IGFzc2VydFNjcmlwdCAoICJbIDEgLCAyICwgMyAsIDQgLCA1IF0uZWFjaCB7IHByaW50bG4gKCAnJyApIH0iICkgfQorICB2b2lkIHRlc3RUb3BMZXZlbFByaW50UGFyZW50aGVzZXNQYXJhbWV0ZXIgKCApIHsgYXNzZXJ0U2NyaXB0ICggInByaW50ICcnIiApIH0KKyAgdm9pZCB0ZXN0VG9wTGV2ZWxQcmludGxuUGFyZW50aGVzZXNQYXJhbWV0ZXIgKCApIHsgYXNzZXJ0U2NyaXB0ICggInByaW50bG4gJyciICkgfQorICB2b2lkIHRlc3RDbG9zdXJlUHJpbnRQYXJlbnRoZXNlc1BhcmFtZXRlciAoICkgeyBhc3NlcnRTY3JpcHQgKCAiWyAxICwgMiAsIDMgLCA0ICwgNSBdLmVhY2ggeyBwcmludCAnJyB9IiApIH0KKyAgdm9pZCB0ZXN0Q2xvc3VyZVByaW50bG5QYXJlbnRoZXNlc1BhcmFtZXRlciAoICkgeyBhc3NlcnRTY3JpcHQgKCAiWyAxICwgMiAsIDMgLCA0ICwgNSBdLmVhY2ggeyBwcmludGxuICcnIH0iICkgfQorICB2b2lkIHRlc3RUb3BMZXZlbFByaW50UHJvcGVydHkgKCApIHsKKyAgICB0cnkgeyAoIG5ldyBHcm9vdnlTaGVsbCAoICkgKS5ldmFsdWF0ZSAoICJwcmludCIgKSB9CisgICAgY2F0Y2ggKCBNaXNzaW5nUHJvcGVydHlFeGNlcHRpb24gbXBlICkgeyByZXR1cm4gOyB9CisgICAgZmFpbCAoICJTaG91bGQgaGF2ZSB0aHJvd24gTWlzc2luZ1Byb3BlcnR5RXhjZXB0aW9uIiApIDsKKyAgfQorICB2b2lkIHRlc3RUb3BMZXZlbFByaW50bG5Qcm9wZXJ0eSAgKCApIHsKKyAgICB0cnkgeyAoIG5ldyBHcm9vdnlTaGVsbCAoICkgKS5ldmFsdWF0ZSAoICJwcmludGxuIiApIH0KKyAgICBjYXRjaCAoIE1pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbiBtcGUgKSB7IHJldHVybiA7IH0KKyAgICBmYWlsICggIlNob3VsZCBoYXZlIHRocm93biBNaXNzaW5nUHJvcGVydHlFeGNlcHRpb24iICkgOworICB9CisgIHZvaWQgdGVzdEluQ2xvc3VyZVByaW50UHJvcGVydHkgICggKSB7CisgICAgdHJ5IHsgKCBuZXcgR3Jvb3Z5U2hlbGwgKCApICkuZXZhbHVhdGUgKCAiWyAxICwgMiAsIDMgLCA0ICwgNSBdLmVhY2ggeyBwcmludCB9IiApIH0KKyAgICBjYXRjaCAoIE1pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbiBtcGUgKSB7IHJldHVybiA7IH0KKyAgICBmYWlsICggIlNob3VsZCBoYXZlIHRocm93biBNaXNzaW5nUHJvcGVydHlFeGNlcHRpb24iICkgOworICB9CisgIHZvaWQgdGVzdEluQ2xvc3VyZVByaW50bG5Qcm9wZXJ0eSAgKCApIHsKKyAgICB0cnkgeyAoIG5ldyBHcm9vdnlTaGVsbCAoICkgKS5ldmFsdWF0ZSAoICJbIDEgLCAyICwgMyAsIDQgLCA1IF0uZWFjaCB7IHByaW50bG4gfSIgKSB9CisgICAgY2F0Y2ggKCBNaXNzaW5nUHJvcGVydHlFeGNlcHRpb24gbXBlICkgeyByZXR1cm4gOyB9CisgICAgZmFpbCAoICJTaG91bGQgaGF2ZSB0aHJvd24gTWlzc2luZ1Byb3BlcnR5RXhjZXB0aW9uIiApIDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0dyb292eTY3NV9CdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0dyb292eTY3NV9CdWcuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMjk2OWUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5Njc1X0J1Zy5ncm9vdnkKQEAgLTAsMCArMSwyOCBAQAorcGFja2FnZSBncm9vdnkuYnVncworCisvKioKKyAqICBAYXV0aG9yIFBpbGhvIEtpbQorICogIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLyAKK2NsYXNzIEdyb292eTY3NV9CdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisgICAgdm9pZCB0ZXN0U3RyaW5nQW5kR1N0cmluZygpIHsKKwlhc3NlcnQgIlxcIiE9IlxcXFwiIAorCWFzc2VydCAiXFxcJCI9PSJcXCIrIlwkIiAKKwlhc3NlcnQgIlxcIisiXFxcXCIgPT0gIlxcIisiXFwiKyJcXCIgJiYgIlxcXFwiKyJcXCIgPT0gIlxcIisiXFwiKyJcXCIKKwlhc3NlcnQgKCJcXFxcIisiXFwiKS5sZW5ndGgoKSA9PSAzCisJYXNzZXJ0ICJcXDMgXCQxXCQyIiA9PSAiXFwiICsgIjMiICsgIiAiICsgIlwkIiArICIxIiArICJcJCIgKyAiMiIKKwlhc3NlcnQgIlxcXFwzIFxcXCQxXCQyIiA9PSAiXFwiICsgIlxcIiArICIzIiArICIgIiArICJcXCIrICJcJCIgKyAiMSIgKyAiXCQiICsgIjIiCisJYXNzZXJ0ICJcXFxcXFwzIFxcXFxcJDFcJDIiID09ICJcXCIgKyAiXFxcXCIgKyAiMyIgKyAiICIgKyAiXFxcXCIrICJcJCIgKyAiMSIgKyAiXCQiICsgIjIiCisJYXNzZXJ0ICJcXFxcXFxcXDMgXFxcXFxcXCQxXCQyIiA9PSAiXFxcXCIgKyAiXFxcXCIgKyAiMyIgKyAiICIgKyAiXFxcXFxcIisgIlwkIiArICIxIiArICJcJCIgKyAiMiIKKworCWFzc2VydCAiXFxcXCIgPT0gIlxcIiArICJcXCIKKwlhc3NlcnQgIlxcXFwiLmxlbmd0aCgpID09IDIKKworCWRlZiB6ID0gMTAwICsgMjAwCisJYXNzZXJ0ICJcXFxcIFxcICR7en0iID09ICJcXFxcIFxcIDMwMCIKKwlhc3NlcnQgIlxcXFwgXFwgJHt6fSIgPT0gIlxcIiArICJcXCIgKyAiICIgKyAiXFwiICsgIiAiICsgIjMwMCIKKwlhc3NlcnQgIkhlbGxvXFwsIFxcV29ybGRcXCIuY2hhckF0KDQpID09ICJvIi5jaGFyQXQoMCkKKwlhc3NlcnQgIkhlbGxvXFwsIFxcV29ybGRcXCIuY2hhckF0KDUpID09ICJcXCIuY2hhckF0KDApCisJYXNzZXJ0ICJIZWxsb1xcLCBcXFdvcmxkXFwiLmNoYXJBdCg2KSA9PSAiLCIuY2hhckF0KDApCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0dyb292eTc3MF9CdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0dyb292eTc3MF9CdWcuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NzE4YTEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5NzcwX0J1Zy5ncm9vdnkKQEAgLTAsMCArMSw0NyBAQAorLyoqCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KKworcGFja2FnZSBncm9vdnkuYnVncworCitjbGFzcyBHcm9vdnk3NzBfQnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworICAgICAKKyAgICB2b2lkIHRlc3RCdWcoKSB7CisgICAgICAgIGRlZiBhID0gbmV3IFBhaXIoc3ltOiJ4IikKKyAgICAgICAgZGVmIGIgPSBuZXcgUGFpcihzeW06InkiKQorICAgICAgICBkZWYgYyA9IG5ldyBQYWlyKHN5bToieSIpCisKKyAgICAgICAgZGVmIGwxID0gW2EsIGJdCisgICAgICAgIGRlZiBsMiA9IFtjXQorICAgICAgICBwcmludGxuIChsMSkKKyAgICAgICAgcHJpbnRsbiAobDIpCisgICAgICAgIHByaW50bG4gKGwxIC0gbDIpCisgICAgICAgIGFzc2VydCBsMSAtIGwyID09IGwxCisKKworICAgICAgICBhID0gbmV3IENQYWlyKHN5bToieCIpCisgICAgICAgIGIgPSBuZXcgQ1BhaXIoc3ltOiJ5IikKKyAgICAgICAgYyA9IG5ldyBDUGFpcihzeW06InkiKQorICAgICAgICBsMSA9IFthLCBiXQorICAgICAgICBsMiA9IFtjXQorICAgICAgICBwcmludGxuIChsMSkKKyAgICAgICAgcHJpbnRsbiAobDIpCisgICAgICAgIHByaW50bG4gKGwxIC0gbDIpCisgICAgICAgIGFzc2VydCBsMSAtIGwyID09IFthXQorICAgIH0KK30KKworaW1wb3J0IGphdmEudXRpbC4qCisKK2NsYXNzIFBhaXIgeworICBTdHJpbmcgc3ltCit9CisKK2NsYXNzIENQYWlyIGltcGxlbWVudHMgQ29tcGFyYWJsZSB7CisgIHB1YmxpYyBTdHJpbmcgc3ltCisgIGludCBjb21wYXJlVG8oT2JqZWN0IG8pIHsKKyAgICAgIHJldHVybiBzeW0uY29tcGFyZVRvKCgoQ1BhaXIpIG8pLnN5bSk7CisgIH0KK30KKworCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5Nzc5X0J1Zy5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5Nzc5X0J1Zy5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdkZWI0YwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9Hcm9vdnk3NzlfQnVnLmdyb292eQpAQCAtMCwwICsxLDEwNCBAQAorcGFja2FnZSBncm9vdnkuYnVncworCitjbGFzcyBHcm9vdnk3NzlfQnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgZGVmIGJvb2xlYW4gZXhjZXB0aW9uQ2FsbGVkID0gZmFsc2UKKyAgICBkZWYgYm9vbGVhbiBmaW5hbGx5Q2FsbGVkID0gZmFsc2UKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgR3Jvb3Z5Nzc5X0J1ZyBhcHAgPSBuZXcgR3Jvb3Z5Nzc5X0J1ZygpCisgICAgICAgIGFwcC50ZXN0RmllbGRQcm9wZXJ0eSgpCisgICAgICAgIGFwcC50ZXN0QmVhblByb3BlcnR5KCkKKyAgICAgICAgYXBwLnRlc3RBdXRvYm94aW5nUHJvcGVydHkoKQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGaWVsZFByb3BlcnR5KCkgeworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBkZWYgcCA9IG5ldyBHcm9vdnk3NzlPbmVQZXJzb24obmFtZUlEOiJmb28tIiwgYWdlOjEyLjIpCisgICAgICAgICAgICBhc3NlcnQgcC5hZ2UgPT0gMTIKKyAgICAgICAgICAgIGFzc2VydCBwLm5hbWVJRCA9PSAiZm9vLSIKKyAgICAgICAgICAgIHAgPSBuZXcgR3Jvb3Z5Nzc5T25lUGVyc29uKG5hbWVJRDoiZm9vLSIsIGFnZToiMTIiKQorICAgICAgICAgICAgcHJpbnRsbiBwLmFnZQorICAgICAgICAgICAgcHJpbnRsbiBwLm5hbWVJRAorICAgICAgICB9CisgICAgICAgIGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgb25FeGNlcHRpb24oZSkKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAgIG9uRmluYWxseSgpCisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0IGV4Y2VwdGlvbkNhbGxlZCAsICJzaG91bGQgaGF2ZSBpbnZva2VkIHRoZSBjYXRjaCBjbGF1c2UiCisgICAgICAgIGFzc2VydCBmaW5hbGx5Q2FsbGVkICwgInNob3VsZCBoYXZlIGludm9rZWQgdGhlIGZpbmFsbHkgY2xhdXNlIgorICAgICAgICAvLyBwcmludGxuKCJTdWNjZXNzISIpCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEJlYW5Qcm9wZXJ0eSgpIHsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgZGVmIHAyID0gbmV3IEdyb292eTc3OUFub3RoZXJQZXJzb24obmFtZUlEOjEyMzQsIGFnZToxMi4yKQorICAgICAgICAgICAgYXNzZXJ0IHAyLmFnZSA9PSAxMgorICAgICAgICAgICAgYXNzZXJ0IHAyLm5hbWVJRCA9PSAiMTIzNCIKKyAgICAgICAgICAgIHAyID0gbmV3IEdyb292eTc3OUFub3RoZXJQZXJzb24obmFtZUlEOjExMSwgYWdlOiIxMiIpCisgICAgICAgICAgICBwcmludGxuIHAyLmFnZQorICAgICAgICAgICAgcHJpbnRsbiBwMi5uYW1lSUQKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIG9uRXhjZXB0aW9uKGUpCisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgICBvbkZpbmFsbHkoKQorICAgICAgICB9CisgICAgICAgIGFzc2VydCBleGNlcHRpb25DYWxsZWQgLCAic2hvdWxkIGhhdmUgaW52b2tlZCB0aGUgY2F0Y2ggY2xhdXNlIgorICAgICAgICBhc3NlcnQgZmluYWxseUNhbGxlZCAsICJzaG91bGQgaGF2ZSBpbnZva2VkIHRoZSBmaW5hbGx5IGNsYXVzZSIKKyAgICAgICAgLy8gcHJpbnRsbigiU3VjY2VzcyEiKQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvYm94aW5nUHJvcGVydHkoKSB7CisgICAgICAgIGRlZiBwID0gbmV3IEdyb292eTc3OU9uZVByb2ZpdChzaWduYWw6ImJhciIsIHJhdGU6MTUpCisgICAgICAgIGFzc2VydCBwLnNpZ25hbCA9PSAiYmFyIgorICAgICAgICBhc3NlcnQgcC5yYXRlID09IDE1LjAKKworICAgICAgICBwID0gbmV3IEdyb292eTc3OU9uZVByb2ZpdChzaWduYWw6MTExKzIyLCByYXRlOm5ldyBqYXZhLm1hdGguQmlnRGVjaW1hbCgiMTUiKSkKKyAgICAgICAgYXNzZXJ0IHAuc2lnbmFsID09ICIxMzMiCisgICAgICAgIGFzc2VydCBwLnJhdGUgPT0gMTUuMAorCisgICAgICAgIGRlZiBwMiA9IG5ldyBHcm9vdnk3NzlBbm90aGVyUHJvZml0KHNpZ25hbDoiYmFyfiIsIHJhdGU6MTUpCisgICAgICAgIGFzc2VydCBwMi5zaWduYWwgPT0gImJhcn4iCisgICAgICAgIGFzc2VydCBwMi5yYXRlID09IDE1LjAKKworICAgICAgICBwMiA9IG5ldyBHcm9vdnk3NzlBbm90aGVyUHJvZml0KHNpZ25hbDoxMTEtMjIsIHJhdGU6bmV3IGphdmEubWF0aC5CaWdEZWNpbWFsKCIxNSIpKQorICAgICAgICBhc3NlcnQgcDIuc2lnbmFsID09ICI4OSIKKyAgICAgICAgYXNzZXJ0IHAyLnJhdGUgPT0gMTUuMAorICAgIH0KKworICAgIHZvaWQgb25FeGNlcHRpb24oZSkgeworICAgICAgICBhc3NlcnQgZSAhPSBudWxsCisgICAgICAgIGV4Y2VwdGlvbkNhbGxlZCA9IHRydWUKKyAgICB9CisJCisgICAgdm9pZCBvbkZpbmFsbHkoKSB7CisgICAgICAgIGZpbmFsbHlDYWxsZWQgPSB0cnVlCisgICAgfQorCit9CisKK2NsYXNzIEdyb292eTc3OU9uZVBlcnNvbiB7CisgICBkZWYgcHVibGljIFN0cmluZyBuYW1lSUQKKyAgIGRlZiBwdWJsaWMgaW50IGFnZQorfQorCitjbGFzcyBHcm9vdnk3NzlBbm90aGVyUGVyc29uIHsKKyAgIFN0cmluZyBuYW1lSUQKKyAgIGludCBhZ2UKK30KKworY2xhc3MgR3Jvb3Z5Nzc5T25lUHJvZml0IHsKKyAgIHB1YmxpYyBTdHJpbmcgc2lnbmFsCisgICBwdWJsaWMgZG91YmxlIHJhdGUKK30KKworY2xhc3MgR3Jvb3Z5Nzc5QW5vdGhlclByb2ZpdCB7CisgICBTdHJpbmcgc2lnbmFsCisgICBkb3VibGUgcmF0ZQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0dyb292eTgzMV9CdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0dyb292eTgzMV9CdWcuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4N2ZlNjkKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5ODMxX0J1Zy5ncm9vdnkKQEAgLTAsMCArMSwzOCBAQAorcGFja2FnZSBncm9vdnkuYnVncworCisvKioKKyAqIFRlc3QgZm9yIGZpeGluZyB0aGUgSmlyYSBpc3N1ZSBHUk9PVlktODMxCisgKgorICogQGF1dGhvciBQaWxobyBLaW0KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworY2xhc3MgR3Jvb3Z5ODMxX0J1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKyAgICAKKyAgICBTdHJpbmdbXSBjaXRpZXMgPSBbJ1Nlb3VsJywgJ0xvbmRvbicsICdXYXNpbmd0b24nXQorICAgIGludFtdIGludEFycmF5RGF0YSA9IFsxLCAzLCA1XQorCisgICAgcHVibGljIFN0cmluZ1tdIGNvdW50cmllcyA9IFsgJ1JlcHVibGljIG9mIEtvcmVhJywgJ1VuaXRlZCBLaW5nZG9tJywgJ1VuaXRlZCBTdGF0ZSBvZiBBbWVyaWNhJ10KKyAgICBwdWJsaWMgIGludFtdIGludEFycmF5ICA9IFsgMiwgNCwgNiBdCisKKyAgICB2b2lkIHRlc3RTZXRGaWVsZFByb3BlcnR5KCkgeworICAgICAgICBhc3NlcnQgY2l0aWVzLnNpemUoKSA9PSAzCisgICAgICAgIGFzc2VydCBjaXRpZXNbMF0gPT0gJ1Nlb3VsJworICAgICAgICBhc3NlcnQgY2l0aWVzWzFdID09ICdMb25kb24nCisgICAgICAgIGFzc2VydCBjaXRpZXNbMl0gPT0gJ1dhc2luZ3RvbicKKyAgICAgICAgYXNzZXJ0IGludEFycmF5RGF0YS5zaXplKCkgPT0gMworICAgICAgICBhc3NlcnQgaW50QXJyYXlEYXRhWzBdID09IDEKKyAgICAgICAgYXNzZXJ0IGludEFycmF5RGF0YVsxXSA9PSAzCisgICAgICAgIGFzc2VydCBpbnRBcnJheURhdGFbMl0gPT0gNQorICAgIH0KKworICAgIHZvaWQgdGVzdFNldEZpZWxkVmFyaWFibGUoKSB7CisgICAgICAgIGFzc2VydCBjb3VudHJpZXMuc2l6ZSgpID09IDMKKyAgICAgICAgYXNzZXJ0IGNvdW50cmllc1swXSA9PSAnUmVwdWJsaWMgb2YgS29yZWEnCisgICAgICAgIGFzc2VydCBjb3VudHJpZXNbMV0gPT0gJ1VuaXRlZCBLaW5nZG9tJworICAgICAgICBhc3NlcnQgY291bnRyaWVzWzJdID09ICdVbml0ZWQgU3RhdGUgb2YgQW1lcmljYScKKyAgICAgICAgYXNzZXJ0IGludEFycmF5WzBdID09IDIKKyAgICAgICAgYXNzZXJ0IGludEFycmF5WzFdID09IDQKKyAgICAgICAgYXNzZXJ0IGludEFycmF5WzJdID09IDYKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9Hcm9vdnk4NzIuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0dyb292eTg3Mi5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZhYmYxNgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9Hcm9vdnk4NzIuZ3Jvb3Z5CkBAIC0wLDAgKzEsMjIgQEAKK3BhY2thZ2UgZ3Jvb3Z5LmJ1Z3MKKworY2xhc3MgR3Jvb3Z5ODcyIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworICB2b2lkIHRlc3RTY3JpcHQgKCApIHsKKyAgICBhc3NlcnRTY3JpcHQgKCAiIiIKK2RlZiBjYWwgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIgKCApCitjYWwuc2V0ICggQ2FsZW5kYXIuREFZX09GX01PTlRIICwgMSApCitwcmludGxuICggY2FsLmdldCAoIENhbGVuZGFyLkRBWV9PRl9NT05USCApICkKKyIiIikKKyAgfQorICB2b2lkIHRlc3RDb2RlICggKSB7CisgICAgbmV3IE15Q2FsZW5kYXIgKCApLnRyeWl0ICggKQorICB9ICAgCit9CisKK2NsYXNzIE15Q2FsZW5kYXIgeworICB2b2lkIHRyeWl0ICggKSAgeworICAgIGRlZiBjYWwgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIgKCApCisgICAgY2FsLnNldCAoIENhbGVuZGFyLkRBWV9PRl9NT05USCAsIDEgKQorICAgIHByaW50bG4gKCBjYWwuZ2V0ICggQ2FsZW5kYXIuREFZX09GX01PTlRIICkgKQorICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5OTY1X0J1Zy5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5OTY1X0J1Zy5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc0MTY4YQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9Hcm9vdnk5NjVfQnVnLmdyb292eQpAQCAtMCwwICsxLDM3IEBACitwYWNrYWdlIGdyb292eS5idWdzCisKKy8qKgorICogIEEgdGVzdCBjYXNlIHRvIGVuc3VyZSB0aGF0IEdyb292eSBjYW4gY29tcGlsZSBjbGFzcyBuYW1lcyBhbmQgdmFyaWFibGUgbmFtZXMgd2l0aCBub24tQVNDSUkKKyAqICBjaGFyYWN0ZXJzIGFuZCB0aGF0IG5vbi1BU0NJSSBjaGFyYWN0ZXJzIGluIFN0cmluZ3MgZG8gdGhlIHJpZ2h0IHRoaW5nLgorICoKKyAqICA8cD5VbmZvcnR1bmF0ZWx5LCB3ZSBjYW5ub3QgYWN0dWFsbHkgaGF2ZSB0aGlzIHRlc3QgaW4gdGhlIFN1YnZlcnNpb24gc3RvcmUgc2luY2UgaXQKKyAqICByZXF1aXJlcyBoYXZpbmcgYW4gZW5jb2RpbmcuICBKYXZhIGludGVybmFsbHkgdXNlcyBVVEYtMTYuICBNb3N0IExpbnV4L1VOSVgvTWFjIE9TIFggdXNlcnMKKyAqICB1c2UgVVRGLTggKG9yIGlmIHRoZXkgaGF2ZW4ndCBjYXVnaHQgdXAgeWV0IElTTy04ODU5LXsxLi4xNV0sIGluIEV1cm9wZSBhbnl3YXkpLiAgV2luZG93cworICogIGludGVybmFsbHkgaXMgVVRGLTE2IExFIGJ1dCBpdCBhcHBlYXJzIHRoYXQgdGhlIEV1cm9wZSByZWdpb24gZGVmYXVsdHMgdG8gSVNPLTg4NTktMSB3aGljaAorICogIGlzIHZlcnkgc2lsbHkuICBBbGwgaW4gYWxsIHdlIGNhbm5vdCBndXJhbnRlZSBhbiBlY29kaW5nIHNvIHdlIGNhbm5vdCBoYXZlIHRoZSB0ZXN0cy48L3A+CisgKgorICogIDxwPklmIGFueW9uZSBzcG90cyBhbnkgZXJyb3JzIGluIHRoZSByYXRpb25hbGUgb3IgZmluZHMgYSB3YXkgdG8gZml4IHRoaW5ncyBwbGVhc2UgdXBkYXRlIGF0CisgKiAgd2lsbC48L3A+CisgKgorICogIEBzdXRob3IgUnVzc2VsIFdpbmRlcgorICogIEB2ZXJzaW9uICRMYXN0Q2hhbmdlZFJldmlzaW9uJCAkTGFzdENoYW5nZWREYXRlJAorICovCitjbGFzcyBHcm9vdnk5NjVfQnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworICAvKiB2b2lkIHRlc3QgdG8gYXZvaWQgYXNzZXJ0aW9uIGZhaWx1cmUgYmVjYXVzZSBvZiB0aGUgbGFjayBvZiB0ZXN0IG1ldGhvZCBpbiB0aGUgY2xhc3MgKi8KKyAgdm9pZCB0ZXN0Vm9pZCgpIHt9CisgIC8qCisgIHZvaWQgdGVzdFVuaWNvZGVWYXJpYWJsZU5hbWVzQW5kU3RyaW5ncyAoICkgeworICAgIGRlZiDDosO4w7HDqCA9ICfDosO4w7HDqCcKKyAgICBhc3NlcnRFcXVhbHMgKCAnw6LDuMOxw6gnICwgw6LDuMOxw6ggKQorICB9CisgIHZvaWQgdGVzdFVuaWNvZGVNw6t0aMO4ZE5hbWUgKCApIHsgfQorICB2b2lkIHRlc3RVbmljb2RlQ2xhc3NOYW1lICggKSB7CisgICAgZGVmIG9iamVjdCA9IG5ldyBCbMOkaCAoICkgCisgICAgYXNzZXJ0IHRydWUKKyAgfQorICAqLworfQorCisvKgorY2xhc3MgQmzDpGggeyB9CisqLwpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0dyb292eTk5Nl9CdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0dyb292eTk5Nl9CdWcuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNjA3MzgKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5OTk2X0J1Zy5ncm9vdnkKQEAgLTAsMCArMSwxOCBAQAorcGFja2FnZSBncm9vdnkuYnVncworCitjbGFzcyBHcm9vdnk5OTZfQnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworICAgIHZvaWQgdGVzdEFjY2Vzc1RvU3VwZXJQcm90ZWN0ZWRGaWVsZCgpIHsKKyAgICAgICAgZGVmIGEgPSBuZXcgR3Jvb3Z5OTk2X1N1YkNsYXNzKCkKKyAgICAgICAgYS5vdXQoKQorICAgIH0KK30KKworY2xhc3MgR3Jvb3Z5OTk2X1N1cGVyQ2xhc3MgeworICAgIHByb3RlY3RlZCBTdHJpbmcgeCA9ICdUaGlzIGlzIGFuIFgnCit9CisKK2NsYXNzIEdyb292eTk5Nl9TdWJDbGFzcyBleHRlbmRzIEdyb292eTk5Nl9TdXBlckNsYXNzIHsKKyAgICB2b2lkIG91dCgpIHsKKyAgICAgICBwcmludGxuKCB4ICkKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3VpbGxhdW1lc0J1Zy5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3VpbGxhdW1lc0J1Zy5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U4NzUwZQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9HdWlsbGF1bWVzQnVnLmdyb292eQpAQCAtMCwwICsxLDEzIEBACitwYWNrYWdlIGdyb292eS5idWdzCisKKy8qKgorICogQGF1dGhvciBHdWlsbGF1bWUgTGFmb3JnZSAKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworY2xhc3MgR3VpbGxhdW1lc0J1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKyAgICAKKyAgICB2b2lkIHRlc3RCdWcoKSB7CisgICAgICAgIGlmICh0cnVlKSAKKyAgICAgICAgICAgIHByaW50bG4oInRydWUiKQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3VpbGxhdW1lc01hcEJ1Zy5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3VpbGxhdW1lc01hcEJ1Zy5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVhOTU2ZAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9HdWlsbGF1bWVzTWFwQnVnLmdyb292eQpAQCAtMCwwICsxLDQyIEBACitwYWNrYWdlIGdyb292eS5idWdzCisKKy8qKgorICogQGF1dGhvciBHdWlsbGF1bWUgTGFmb3JnZQorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitjbGFzcyBHdWlsbGF1bWVzTWFwQnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworICAgIAorICAgIHZvaWQgdGVzdEJ1ZzIoKSB7CisgICAgICAgIGRlZiBsaXN0ID0gWzEsIDIsIDNdCisgICAgICAgIGRlZiBtYXAgPSBbOl0KKyAgICAgICAgCisgICAgICAgIGRvTG9vcChsaXN0LCBtYXApCisgICAgCisgICAgICAgIGFzc2VydCBtYXBbMF0gPT0gMSAKKyAgICAgICAgYXNzZXJ0IG1hcFsxXSA9PSAyIAorICAgICAgICBhc3NlcnQgbWFwWzJdID09IDMgCisgICAgfQorICAgIAorICAgIHZvaWQgZG9Mb29wKGxpc3QsIG1hcCkgeworICAgICAgICBkZWYgaSA9IDAKKyAgICAgICAgZm9yIChpdCBpbiBsaXN0KSB7CisgICAgICAgICAgICBtYXBbaSsrXSA9IGl0CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgCisgICAgdm9pZCB0ZXN0QnVnKCkgeworICAgICAgICBkZWYgbGlzdCA9IFsxLCAyLCAzXQorICAgICAgICBkZWYgbWFwID0gWzpdCisgICAgICAgIGRvQ2xvc3VyZUxvb3AobGlzdCwgbWFwKQorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IG1hcFswXSA9PSAxIAorICAgICAgICBhc3NlcnQgbWFwWzFdID09IDIgCisgICAgICAgIGFzc2VydCBtYXBbMl0gPT0gMyAKKyAgICB9CisgICAgCisgICAgdm9pZCBkb0Nsb3N1cmVMb29wKGxpc3QsIG1hcCkgeworICAgICAgICBkZWYgaSA9IDAKKyAgICAgICAgbGlzdC5lYWNoIHsgbWFwW2krK10gPSBpdCB9CisgICAgfSAgICAKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvSWFuTWFjZXlzQnVnLmphdmEgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvSWFuTWFjZXlzQnVnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE4NmJhNwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9JYW5NYWNleXNCdWcuamF2YQpAQCAtMCwwICsxLDY2IEBACisvKgorICRJZCQKKworIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCisgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQKKyAgICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKKyAgICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCisgICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQorICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgorICAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKKyAgICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KKworIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCisgICAgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAorICAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCisKKyA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQorICAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLworCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUworIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAorIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKKyBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgKi8KKworcGFja2FnZSBncm9vdnkuYnVnczsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW4uVGVzdFN1cHBvcnQ7CisKKy8qKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIElhbk1hY2V5c0J1ZyBleHRlbmRzIFRlc3RTdXBwb3J0IHsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RCdWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydFNjcmlwdCgiZHVtbXkgPSAwOyBmb3IgKCBpIGluIDAuLjkgKSB7ICBkdW1teSArPSBpIH1cbiBwcmludGxuICdkb25lJyIsICJkdW1teS5ncm9vdnkiKTsKKyAgICAgICAgICAgIGZhaWwoIlNob3VsZCB0aHJvdyBhIHN5bnRheCBleGNlcHRpb24iKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV29ya2VkLiBDYXVnaHQ6ICIgKyBlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9JbmNvbnNpc3RlbnRTdGFja0hlaWdodEJ1Zy5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvSW5jb25zaXN0ZW50U3RhY2tIZWlnaHRCdWcuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5YTM0YjIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvSW5jb25zaXN0ZW50U3RhY2tIZWlnaHRCdWcuZ3Jvb3Z5CkBAIC0wLDAgKzEsMzQgQEAKK3BhY2thZ2UgZ3Jvb3Z5LmJ1Z3MKKworLyoqCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK2NsYXNzIEluY29uc2lzdGVudFN0YWNrSGVpZ2h0QnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCB0ZXN0QnVnKCkgeworICAgICAgICBkZWYgc2VydmVyID0gMAorICAgICAgICBkZWYgdG1wID0gc2VydmVyICsgMQorICAgICAgICB0cnkgeworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCB0ZXN0QnVnMigpIHsKKyAgICAgICAgZGVmIHNlcnZlciA9IDAKKyAgICAgICAgZGVmIHRtcCA9IHNlcnZlciA9PSAyCisgICAgICAgIHRyeSB7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHRlc3RCdWczKCkgeworICAgICAgICBkZWYgc2VydmVyID0gMAorICAgICAgICBkZWYgZm9vID0gc2VydmVyCisgICAgICAgIHRyeSB7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0ludGVyZmFjZUltcGxCdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL0ludGVyZmFjZUltcGxCdWcuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ZWFiYzAKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvSW50ZXJmYWNlSW1wbEJ1Zy5ncm9vdnkKQEAgLTAsMCArMSwyMCBAQAorcGFja2FnZSBncm9vdnkuYnVncworCitpbXBvcnQgamF2YS5pby5SZWFkZXIKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmR1bW15LkZvb0hhbmRsZXIKKworLyoqCisgKiBAYXV0aG9yIFJvYmVydCBGdWxsZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworY2xhc3MgSW50ZXJmYWNlSW1wbEJ1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIGltcGxlbWVudHMgRm9vSGFuZGxlciB7CisKKyAgICB2b2lkIHRlc3RNZXRob2RDYWxsKCkgeworICAgICAgICBoYW5kbGUobnVsbCkKKyAgICB9CisgICAgCisgICAgdm9pZCBoYW5kbGUoUmVhZGVyIHJlYWRlcil7CisgICAgICAgIHByaW50bG4oImluIGhhbmRsZSBtZXRob2QiKQorICAgICAgICBkZWYgY2FsbGVkID0gdHJ1ZQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvSW52b2tlTm9ybWFsTWV0aG9kRnJvbUJ1aWxkZXJfQnVnNjU3Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9JbnZva2VOb3JtYWxNZXRob2RGcm9tQnVpbGRlcl9CdWc2NTcuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMzc4MmUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvSW52b2tlTm9ybWFsTWV0aG9kRnJvbUJ1aWxkZXJfQnVnNjU3Lmdyb292eQpAQCAtMCwwICsxLDQxIEBACitwYWNrYWdlIGdyb292eS5idWdzCisKKy8qKgorICAqIDxwPgorICAqIFRlc3QgdGhhdCBlbnN1cmVzIHRoYXQ6CisgICogPHVsPgorICAqICAgPGxpPml0IGlzIHBvc3NpYmxlIHRvIHdyaXRlIGEgYnVpbGRlciBpbiBHcm9vdnk8L2xpPgorICAqICAgPGxpPml0IGlzIHBvc3NpYmxlIHRvIGNhbGwgbm9ybWFsIG1ldGhvZHMgZnJvbSB0aGUgYnVpbGRlciwKKyAgKiAgICAgICB3aXRob3V0IHRoZSBtZXRob2RzIGJlaW5nIHRyYXBwZWQgZW5kbGVzc2x5IGJ5IGNyZWF0ZU5vZGUoKTwvbGk+CisgICogPC91bD4KKyAgKiA8L3A+CisgICoKKyAgKiBAYXV0aG9yIEd1aWxsYXVtZSBMYWZvcmdlCisgICovCitjbGFzcyBJbnZva2VOb3JtYWxNZXRob2RGcm9tQnVpbGRlcl9CdWc2NTcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisgICAgdm9pZCB0ZXN0SW52b2tlTm9ybWFsTWV0aG9kKCkgeworICAgICAgICBkZWYgYiA9IG5ldyBCdWlsZGVyKCkKKyAgICAgICAgYXNzZXJ0IGIuY2FsbE5vcm1hbE1ldGhvZCgpID09ICJmaXJzdCIKKworICAgICAgICBkZWYgdmFsdWUgPSBiLnNvbWVOb2RlKCkge30KKyAgICAgICAgYXNzZXJ0IHZhbHVlID09ICJzZWNvbmQiCisgICAgfQorfQorCitjbGFzcyBCdWlsZGVyIGV4dGVuZHMgQnVpbGRlclN1cHBvcnQgeworCisgICAgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCwgT2JqZWN0IGNoaWxkKSB7fQorCisgICAgT2JqZWN0IGNyZWF0ZU5vZGUoT2JqZWN0IG5hbWUpICAgICAgICAgICAgICAgICB7IHJldHVybiBjcmVhdGVOb2RlKG5hbWUsIFs6XSwgbnVsbCkgfQorICAgIE9iamVjdCBjcmVhdGVOb2RlKE9iamVjdCBuYW1lLCBNYXAgYXR0cmlidXRlcykgeyByZXR1cm4gY3JlYXRlTm9kZShuYW1lLCBhdHRyaWJ1dGVzLCBudWxsKSB9CisgICAgT2JqZWN0IGNyZWF0ZU5vZGUoT2JqZWN0IG5hbWUsIE9iamVjdCB2YWx1ZSkgICB7IHJldHVybiBjcmVhdGVOb2RlKG5hbWUsIFs6XSwgdmFsdWUpIH0KKworICAgIE9iamVjdCBjcmVhdGVOb2RlKE9iamVjdCBuYW1lLCBNYXAgYXR0cmlidXRlcywgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIHByaW50bG4gImNyZWF0ZSAke25hbWV9IgorICAgICAgICByZXR1cm4gY2FsbE90aGVyU3RhdGljYWxseVR5cGVkTWV0aG9kKCkKKyAgICB9CisKKyAgICBTdHJpbmcgY2FsbE5vcm1hbE1ldGhvZCgpICAgICAgICAgICAgICAgeyBwcmludGxuICJub3JtYWxNZXRob2QiOyByZXR1cm4gImZpcnN0IiB9CisgICAgU3RyaW5nIGNhbGxPdGhlclN0YXRpY2FsbHlUeXBlZE1ldGhvZCgpIHsgcHJpbnRsbiAib3RoZXJNZXRob2QiOyAgcmV0dXJuICJzZWNvbmQiIH0KKyAgICAKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvSXRlcmF0ZU92ZXJDdXN0b21UeXBlQnVnLmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9JdGVyYXRlT3ZlckN1c3RvbVR5cGVCdWcuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxZDBkN2YKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvSXRlcmF0ZU92ZXJDdXN0b21UeXBlQnVnLmdyb292eQpAQCAtMCwwICsxLDIxIEBACitwYWNrYWdlIGdyb292eS5idWdzCisKKy8qKgorICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjMgJAorICovCitjbGFzcyBJdGVyYXRlT3ZlckN1c3RvbVR5cGVCdWcgZXh0ZW5kcyBUZXN0U3VwcG9ydCB7CisgICAgCisgICAgdm9pZCB0ZXN0QnVnKCkgeworICAgICAgICBkZWYgb2JqZWN0ID0gdGhpcworICAgICAgICAKKyAgICAgICAgZGVmIGFuc3dlciA9IFtdCisgICAgICAgIGZvciAoaSBpbiBvYmplY3QpIHsKKyAgICAgICAgICAgIGFuc3dlciA8PCBpCisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0IGFuc3dlciA9PSBbJ2EnLCAnYicsICdjJ10KKyAgICAgICAgCisgICAgICAgIGFuc3dlciA9IFtdCisgICAgICAgIG9iamVjdC5lYWNoIHsgYW5zd2VyIDw8IGl0IH0KKyAgICAgICAgYXNzZXJ0IGFuc3dlciA9PSBbJ2EnLCAnYicsICdjJ10KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL01hcmt1cEFuZE1ldGhvZEJ1Zy5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvTWFya3VwQW5kTWV0aG9kQnVnLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDAzOTQzCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL01hcmt1cEFuZE1ldGhvZEJ1Zy5ncm9vdnkKQEAgLTAsMCArMSwzMSBAQAorcGFja2FnZSBncm9vdnkuYnVncworCisvKioKKyAqIE1peGVzIHZhcmlhYmxlcywgY2xvc3VyZXMgYW5kIG1ldGhvZCBjYWxscyBpbiBtYXJrdXAKKyAqCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK2NsYXNzIE1hcmt1cEFuZE1ldGhvZEJ1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKyAgICAKKyAgICB2b2lkIHRlc3RCdWcoKSB7CisgICAgICAgIGRlZiB0cmVlID0gY3JlYXRlVHJlZSgpCisgICAgICAgIGRlZiBuYW1lID0gdHJlZS5wZXJzb25bMF1bJ0BuYW1lJ10KKyAgICAgICAgYXNzZXJ0IG5hbWUgPT0gJ0phbWVzJworICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgZGVmIGNyZWF0ZVRyZWUoKSB7CisgICAgICAgIGRlZiBidWlsZGVyID0gTm9kZUJ1aWxkZXIubmV3SW5zdGFuY2UoKQorICAgICAgICAKKyAgICAgICAgZGVmIHJvb3QgPSBidWlsZGVyLnBlb3BsZSgpIHsKKyAgICAgICAgICAgIHBlcnNvbihuYW1lOmdldFRlc3ROYW1lKCkpCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGFzc2VydCByb290ICE9IG51bGwKKyAgICAgICAgCisgICAgICAgIHJldHVybiByb290CisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCBkZWYgZ2V0VGVzdE5hbWUoKSB7CisgICAgICAgICJKYW1lcyIKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvTWFya3VwSW5TY3JpcHRCdWcuamF2YSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9NYXJrdXBJblNjcmlwdEJ1Zy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNThkODgKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvTWFya3VwSW5TY3JpcHRCdWcuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKgorICRJZCQKKworIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCisgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQKKyAgICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKKyAgICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCisgICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQorICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgorICAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKKyAgICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KKworIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCisgICAgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAorICAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCisKKyA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQorICAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLworCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUworIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAorIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKKyBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgKi8KKworcGFja2FnZSBncm9vdnkuYnVnczsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW4uVGVzdFN1cHBvcnQ7CisKKworLyoqCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBNYXJrdXBJblNjcmlwdEJ1ZyBleHRlbmRzIFRlc3RTdXBwb3J0IHsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RCdWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0U2NyaXB0RmlsZSgic3JjL3Rlc3QvZ3Jvb3Z5L3NjcmlwdC9BdG9tVGVzdFNjcmlwdC5ncm9vdnkiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvTWV0aG9kQ2FsbFdpdGhvdXRQYXJlbnNJblN0YXRpY01ldGhvZEJ1Zy5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvTWV0aG9kQ2FsbFdpdGhvdXRQYXJlbnNJblN0YXRpY01ldGhvZEJ1Zy5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUxMThlMgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9NZXRob2RDYWxsV2l0aG91dFBhcmVuc0luU3RhdGljTWV0aG9kQnVnLmdyb292eQpAQCAtMCwwICsxLDEyIEBACitwYWNrYWdlIGdyb292eS5idWdzCisKK2NsYXNzIE1ldGhvZENhbGxXaXRob3V0UGFyZW5zSW5TdGF0aWNNZXRob2RCdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICB2b2lkIHRlc3RCdWcoKSB7CisgICAgICAgIHN0YXRpY01ldGhvZCgpCisgICAgfQorICAgIAorICAgIHN0YXRpYyB2b2lkIHN0YXRpY01ldGhvZCgpIHsKKyAgICAgICAgcHJpbnRsbiAnaGVsbG8nWzFdCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9NZXRob2RDbG9zdXJlVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvTWV0aG9kQ2xvc3VyZVRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMTMxN2EKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvTWV0aG9kQ2xvc3VyZVRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMzYgQEAKK3BhY2thZ2UgZ3Jvb3Z5LmJ1Z3MKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5NZXRob2RDbG9zdXJlCisKK2NsYXNzIE1ldGhvZENsb3N1cmVUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgZGVmIGFhKHgpIHsKKyAgICAgICAgeAorICAgIH0KKyAgICAKKyAgICBzdGF0aWMgYmIoaXQpIHsgaXR9CisKKyAgICB2b2lkIHRlc3RNZXRvZENsb3N1cmUoKSB7ICAgCisgICAgICAgIENsYXNzW10gYzEgPSAgWyBFeGNlcHRpb24uY2xhc3MsIFRocm93YWJsZS5jbGFzcyBdCisgICAgICAgIENsYXNzW10gYzIgPSBbIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbi5jbGFzcyBdCisKKyAgICAgICAgZGVmIGNsID0gdGhpcy4mYWEKKworICAgICAgICBhc3NlcnQgY2wgaW5zdGFuY2VvZiBDbG9zdXJlCisgICAgICAgIGFzc2VydCBjbCBpbnN0YW5jZW9mIE1ldGhvZENsb3N1cmUKKworICAgICAgICBhc3NlcnQgW2MxLCBjMl0uY29sbGVjdChjbCkgPT0gW2MxLGMyXQorICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RTdGF0aWNNZXRob2RBY2Nlc3MoKSB7CisgICAgICAgZGVmIGxpc3QgPSBbMV0uY29sbGVjdCAodGhpcy4mYmIpCisgICAgICAgYXNzZXJ0IGxpc3QgPT0gWzFdCisgICAgICAgbGlzdCA9IFsxXS5jb2xsZWN0IChNZXRob2RDbG9zdXJlVGVzdC4mYmIpCisgICAgICAgYXNzZXJ0IGxpc3QgPT0gWzFdCisgICAgICAgZGVmIG1jdCA9IG5ldyBNZXRob2RDbG9zdXJlVGVzdCgpCisgICAgICAgbGlzdCA9IFsxXS5jb2xsZWN0IChtY3QuJmJiKQorICAgICAgIGFzc2VydCBsaXN0ID09IFsxXQorICAgIH0KK30KKworCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvTWV0aG9kRGlzcGF0Y2hCdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL01ldGhvZERpc3BhdGNoQnVnLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGY4MTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL01ldGhvZERpc3BhdGNoQnVnLmdyb292eQpAQCAtMCwwICsxLDQyIEBACitwYWNrYWdlIGdyb292eS5idWdzCisKK2NsYXNzIE1ldGhvZERpc3BhdGNoQnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworICAgIGRlZiBkb2l0KE9iamVjdCBwYXJhbWV0ZXIxLCBPYmplY3QgcGFyYW1ldGVyMikgeworICAgICAgICAiT08iCisgICAgfQorCisgICAgZGVmIGRvaXQoQm9vbGVhbiBwYXJhbWV0ZXIxLCBPYmplY3QgcGFyYW1ldGVyMikgeworICAgICAgICAiQk8iCisgICAgfQorCisgICAgZGVmIGRvaXQoT2JqZWN0IHBhcmFtZXRlcjEsIEJvb2xlYW4gcGFyYW1ldGVyMikgeworICAgICAgICAiT0IiCisgICAgfQorCisgICAgZGVmIGRvaXQoQm9vbGVhbiBwYXJhbWV0ZXIxLCBCb29sZWFuIHBhcmFtZXRlcjIpIHsKKyAgICAgICAgIkJCIgorICAgIH0KKworICAgIGRlZiB0ZXN0QnVnKCkgeworICAgICAgICBkZWYgbyA9IHRoaXM7CisKKyAgICAgICAgYXNzZXJ0ICJCQiIgPT0gby5kb2l0KHRydWUsIHRydWUpOworICAgICAgICBhc3NlcnQgIkJPIiA9PSBvLmRvaXQodHJ1ZSwgOSk7CisgICAgICAgIGFzc2VydCAiT0IiID09IG8uZG9pdCg5LCB0cnVlKTsKKyAgICAgICAgYXNzZXJ0ICJPTyIgPT0gby5kb2l0KDksIDkpOworICAgIH0KKyAgICAKKyAgICBkZWYgbWV0aG9kV2l0aERlZmF1bHRzKGEsYixjPTEwMDApIHsKKyAgICAgIGErYitjCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdExpc3RFeHBhbnNpb24oKSB7CisgICAgICAgLy8gdGhlcmUgd2FzIGEgYnVnIGRpc2NvdmVyZWQgd2hpbGUgbG9va2luZyBhdCBHUk9PVlktMTgwMworICAgICAgIC8vIGEgbGlzdCBleHBhbnNpb24gd2FzIGNhY2hlZCBsaWtlIAorICAgICAgIC8vIG1ldGhvZFdpdGhEZWZhdWx0cyhMaXN0KSAtPiBtZXRob2RXaXRoRGVmYXVsdHMoT2JqZWN0LE9iamVjdCxPYmplY3QpCisgICAgICAgLy8gYnV0IHRoaXMgY2FjaGVkIHZlcnNpb24gY2FuJ3QgaGFuZGxlIGxpc3RzIHdpdGggYW4gYXJiaXRyYXJ5IGxlbmd0aCAKKyAgICAgICAvLyBvZiBwYXJhbWV0ZXJzLCByZXN1bHRpbmcgaW4gdGhlIHNlY29uZCBjYWxsIGhlcmUgdG8gZmFpbAorICAgICAgIGFzc2VydCBtZXRob2RXaXRoRGVmYXVsdHMoWzEsMTAsMTAwXSkgPT0gMTExCisgICAgICAgYXNzZXJ0IG1ldGhvZFdpdGhEZWZhdWx0cyhbMSwxMF0pID09IDEwMTEgICAgCisgICAgfSAgICAKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvTWV0aG9kUG9pbnRlckJ1Zy5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvTWV0aG9kUG9pbnRlckJ1Zy5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNjM2UxMgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9NZXRob2RQb2ludGVyQnVnLmdyb292eQpAQCAtMCwwICsxLDQ3IEBACitwYWNrYWdlIGdyb292eS5idWdzCisKKy8qKgorICogQGF1dGhvciBQaWxobyBLaW0KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworY2xhc3MgTWV0aG9kUG9pbnRlckJ1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIGRlZiB2b2lkIHNheUhlbGxvKCkgeyAKKyAgICAgICAgcHJpbnRsbiAiaGVsbG8iIAorICAgIH0gCisKKyAgICBkZWYgTWV0aG9kUG9pbnRlckJ1ZyBnZXRUaGlzT2JqZWN0KCkgeyAKKyAgICAgICAgcmV0dXJuIHRoaXMKKyAgICB9IAorCisgICAgLy8gVGVzdCBhIHN0YW5kYXJkIG1ldGhvZCBwb2ludGVyIG9wZXJhdG9yICIuJiIuICBGb3IgZXhhbXBsZSwgZm9vLiZiYXIuCisgICAgdm9pZCB0ZXN0TWV0aG9kUG9pbnRlcigpIHsKKyAgICAgICAgZGVmIGJ1ZyA9IG5ldyBNZXRob2RQb2ludGVyQnVnKCkKKyAgICAgICAgZGVmIHggPSBidWcuJnNheUhlbGxvCisgICAgICAgIHgoKQorICAgIH0gCisKKyAgICAvLyBUZXN0IGEgc3RhbmRhcmQgbWV0aG9kIHBvaW50ZXIgb3BlcmF0b3IgIi4mIiB3aXRoIHRoaXMgb2JqZWN0LiAgRm9yIGV4YW1wbGUsIHRoaXMuJmJhci4KKyAgICB2b2lkIHRlc3RUaGlzTWV0aG9kUG9pbnRlcigpIHsKKyAgICAgICAgZGVmIHkgPSB0aGlzLiZzYXlIZWxsbworICAgICAgICB5KCkKKyAgICB9IAorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIFRlc3QgYSBkZWZhdWx0IG1ldGhvZCBwb2ludGVyIG9wZXJhdG9yICImIiB3aXRoIHRoaXMgb2JqZWN0LiAgRm9yIGV4YW1wbGUsICZiYXIuCisgICAgLy8gVGhpcyBzaG93cyB0aGF0IHRoZSBpc3N1ZSBHUk9PVlktODI2IGhhcyBiZWVuIGZpeGVkIGluIGdyb292eS0xLjAtamFyLTAyLgorLyoKKyAgdG9kbyAtIGNvbW1lbnRlZCBvdXQgZHVlIHRvIGdyb292eS5nIG5vbi1kZXRlcm1pbmlzbXMKKyAgICB2b2lkIHRlc3REZWZhdWx0TWV0aG9kUG9pbnRlcigpIHsKKyAgICAgICAgZGVmIHogPSAmc2F5SGVsbG8KKyAgICAgICAgeigpCisgICAgfSAKKyovCisgICAgLy8gVGVzdCBhIGRlZmF1bHQgbWV0aG9kIHBvaW50ZXIgb3BlcmF0b3IgIi4mIiB3aXRoIHJldHVybmVkIG9iamVjdC4gIEZvciBleGFtcGxlLCBzb21lTWV0aG9kKCkuJmJhci4KKyAgICB2b2lkIHRlc3RNZXRob2RQb2ludGVyV2l0aFJldHVybigpIHsKKyAgICAgICAgZGVmIHUgPSBnZXRUaGlzT2JqZWN0KCkuJnNheUhlbGxvCisgICAgICAgIHUoKQorICAgICAgICBkZWYgdiA9IHRoaXNPYmplY3QuJnNheUhlbGxvCisgICAgICAgIHYoKQorICAgIH0gCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvTW9yZ2Fuc0J1Zy5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvTW9yZ2Fuc0J1Zy5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJhNzQwMwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9Nb3JnYW5zQnVnLmdyb292eQpAQCAtMCwwICsxLDEzIEBACitwYWNrYWdlIGdyb292eS5idWdzCisKKy8qKgorICogQGF1dGhvciBNb3JnYW4gSGFua2lucworICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitjbGFzcyBNb3JnYW5zQnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCB0ZXN0QnVnKCkgeworICAgICAgICBkZWYgcmVzdWx0ID0gNCArICJ4IgorICAgICAgICBhc3NlcnQgcmVzdWx0ID09ICI0eCIKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL05lc3RlZENsb3N1cmUyQnVnLmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9OZXN0ZWRDbG9zdXJlMkJ1Zy5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRkNWVmMgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9OZXN0ZWRDbG9zdXJlMkJ1Zy5ncm9vdnkKQEAgLTAsMCArMSw2OCBAQAorcGFja2FnZSBncm9vdnkuYnVncworCisvKioKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworY2xhc3MgTmVzdGVkQ2xvc3VyZTJCdWcgZXh0ZW5kcyBUZXN0U3VwcG9ydCB7CisgICAgIAorICAgIE9iamVjdCBmCisgICAgIAorICAgIHZvaWQgdGVzdEZpZWxkQnVnKCkgeworICAgIAlkZWYgY2xvc3VyZSA9IHsKKyAgICAJCXJldHVybiB7CisJICAgIAkJZiA9IDEyMworCSAgICAJCXJldHVybiBudWxsCisJICAgICAgICB9CisJICAgIH0KKyAgICAgICAgZGVmIHZhbHVlID0gY2xvc3VyZSgpCisgICAgICAgIHZhbHVlID0gdmFsdWUoKQorICAgICAgICBhc3NlcnQgZiA9PSAxMjMKKyAgICB9CisgICAgIAorICAgIHZvaWQgdGVzdEJ1Z091dHNpZGVPZlNjcmlwdCgpIHsKKyAgICAJZGVmIGEgPSAxMjMKKyAgICAJZGVmIGIgPSA0NTYKKyAgICAJZGVmIGNsb3N1cmUgPSB7CisgICAgCQlwcmludGxuIGIKKyAgICAJCWRlZiBjID0gOTk5CisgICAgCQlyZXR1cm4geworICAgIAkJCWYgPSAyMjIyMTExCisgICAgCQkJCisgICAgCQkJcHJpbnRsbiBmCisgICAgCQkJCisgICAgCQkJcHJpbnRsbiBjCisgICAgCQkJZGVmIGQgPSA2NzgKKyAgICAJCQlyZXR1cm4geyAKKyAgICAJCQkJcHJpbnRsbiBmCisgICAgCQkJCWFzc2VydCBmID09IDIyMjIxMTEKKyAgICAJCQkJcHJpbnRsbiBkCisgICAgCQkJCXJldHVybiBhCisgICAgCQkJfQorICAgIAkJfQorICAgIAl9CisgICAgCWRlZiBjMiA9IGNsb3N1cmUoKQorICAgIAlkZWYgYzMgPSBjMigpCisgICAgCWRlZiB2YWx1ZSA9IGMzKCkKKworCQlhc3NlcnQgZiA9PSAyMjIyMTExICAgIAkKKyAgICAJYXNzZXJ0IHZhbHVlID09IDEyMworICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RCdWcoKSB7CisgICAgCWFzc2VydFNjcmlwdCAiIiIKKwkgICAgCWRlZiBhID0gMTIzCisJICAgIAlkZWYgY2xvc3VyZSA9IHsKKwkgICAgCQlyZXR1cm4geworCSAgICAJCQlyZXR1cm4geyAKKwkgICAgCQkJCXJldHVybiBhCisJICAgIAkJCX0KKwkgICAgCQl9CisJICAgIAl9CisJICAgIAlkZWYgYzIgPSBjbG9zdXJlKCkKKwkgICAgCWRlZiBjMyA9IGMyKCkKKwkgICAgCXZhbHVlID0gYzMoKQorCSAgICAJCisJICAgIAlhc3NlcnQgdmFsdWUgPT0gMTIzCisiIiIKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL05lc3RlZENsb3N1cmVCdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL05lc3RlZENsb3N1cmVCdWcuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZWYyOWMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvTmVzdGVkQ2xvc3VyZUJ1Zy5ncm9vdnkKQEAgLTAsMCArMSwyMSBAQAorcGFja2FnZSBncm9vdnkuYnVncworCisvKioKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworY2xhc3MgTmVzdGVkQ2xvc3VyZUJ1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKyAgICAgCisgICAgdm9pZCB0ZXN0QnVnKCkgeworICAgIAlkZWYgYSA9IDEyMworICAgIAlnZXRWYWx1ZXMoKS5lYWNoIHsgCisgICAgCQlwcmludGxuIGl0CisgICAgCQlpdC5lYWNoIHsgCisgICAgCQkJYXNzZXJ0IGEgPT0gMTIzCisgICAgCQl9CisgICAgCX0KKyAgICB9CisgICAgCisgICAgZGVmIGdldFZhbHVlcygpIHsKKyAgICAJWzUsIDYsIDddCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9OdWxsQ29tcGFyZUJ1Zy5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvTnVsbENvbXBhcmVCdWcuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMTJmMmEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvTnVsbENvbXBhcmVCdWcuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTMgQEAKK3BhY2thZ2UgZ3Jvb3Z5LmJ1Z3MKKworLyoqCisgKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMyAkCisgKi8KK2NsYXNzIE51bGxDb21wYXJlQnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworICAgIAorICAgIHZvaWQgdGVzdEJ1ZygpIHsKKyAgICAgICAgYXNzZXJ0ICJkb2ciID4gbnVsbAorICAgICAgICBhc3NlcnQgbnVsbCA8ICJkb2ciCisgICAgICAgIGFzc2VydCBudWxsID09IG51bGwKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL092ZXJsb2FkSW52b2tlTWV0aG9kQnVnLmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9PdmVybG9hZEludm9rZU1ldGhvZEJ1Zy5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVjM2NjZQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9PdmVybG9hZEludm9rZU1ldGhvZEJ1Zy5ncm9vdnkKQEAgLTAsMCArMSwzMiBAQAorcGFja2FnZSBncm9vdnkuYnVncworCisvKioKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworIAorY2xhc3MgT3ZlcmxvYWRJbnZva2VNZXRob2RCdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisgICAgIAorICAgIHZvaWQgdGVzdEJ1ZygpIHsKKyAgICAJZGVmIGEgPSBuZXcgT3ZlcmxvYWRBKCkKKyAgICAJYS5kdWgoKQorICAgIAkKKyAgICAJZGVmIGIgPSBuZXcgT3ZlcmxvYWRCKCkKKyAgICAJYi5kdWgoKQorICAgIH0KKworfQorCitjbGFzcyBPdmVybG9hZEEgeworICAgICAgICBkZWYgaW52b2tlTWV0aG9kKFN0cmluZyBuYW1lLCBPYmplY3QgYXJncykgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZXRhQ2xhc3MuaW52b2tlTWV0aG9kKHRoaXMsIG5hbWUsIGFyZ3MpCisgICAgICAgICAgICAgICAgfSBjYXRjaChNaXNzaW5nTWV0aG9kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50bG4gIk1pc3NpbmcgbWV0aG9kOiAke25hbWV9IgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfSAKK30KKworY2xhc3MgT3ZlcmxvYWRCIGV4dGVuZHMgT3ZlcmxvYWRBIHsKKworfQorCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvUHJpbWl0aXZlUHJvcGVydHlCdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL1ByaW1pdGl2ZVByb3BlcnR5QnVnLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjJkYjZmCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL1ByaW1pdGl2ZVByb3BlcnR5QnVnLmdyb292eQpAQCAtMCwwICsxLDUwIEBACitwYWNrYWdlIGdyb292eS5idWdzCisKKy8qKgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICoKKyAqIEZpeCBCdWcgR1JPT1ZZLTY4MworICogQGF1dGhvciBQaWxobyBLaW0KKyAqLworY2xhc3MgUHJpbWl0aXZlUHJvcGVydHlCdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisgICAgIAorICAgIGRvdWJsZSB4MQorICAgIGZsb2F0IHgyCisgICAgbG9uZyB4MworICAgIGludCB4NAorICAgIHNob3J0IHg1CisgICAgYnl0ZSB4NgorICAgIGNoYXIgeDcKKworICAgIHZvaWQgdGVzdEJ1ZygpIHsKKyAgICAgICAgZGVmIHkgPSBuZXcgUHJpbWl0aXZlUHJvcGVydHlCdWcoKQorICAgICAgICB5LngxID0gMTAuMAorICAgICAgICB5LngyID0gMTAuMAorICAgICAgICB5LngzID0gMTAuMAorICAgICAgICB5Lng0ID0gMTAuMAorICAgICAgICB5Lng1ID0gMTAuMAorICAgICAgICB5Lng2ID0gMTAuMAorICAgICAgICB5Lng3ID0gMTAuMAorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IHkueDEgPT0gMTAuMAorICAgICAgICBhc3NlcnQgeS54MiA9PSAxMC4wCisgICAgICAgIGFzc2VydCB5LngzID09IDEwLjAKKyAgICAgICAgYXNzZXJ0IHkueDQgPT0gMTAuMAorICAgICAgICBhc3NlcnQgeS54NSA9PSAxMC4wCisgICAgICAgIGFzc2VydCB5Lng2ID09IDEwLjAKKyAgICAgICAgYXNzZXJ0IHkueDEuY2xhc3MgPT0gRG91YmxlLmNsYXNzCisgICAgICAgIGFzc2VydCB5LngyLmNsYXNzID09IEZsb2F0LmNsYXNzCisgICAgICAgIGFzc2VydCB5LngzLmNsYXNzID09IExvbmcuY2xhc3MKKyAgICAgICAgYXNzZXJ0IHkueDQuY2xhc3MgPT0gSW50ZWdlci5jbGFzcworICAgICAgICBhc3NlcnQgeS54NS5jbGFzcyA9PSBTaG9ydC5jbGFzcworICAgICAgICBhc3NlcnQgeS54Ni5jbGFzcyA9PSBCeXRlLmNsYXNzCisgICAgICAgIGFzc2VydCB5Lng3LmNsYXNzID09IENoYXJhY3Rlci5jbGFzcworICAgICAgICBhc3NlcnQgeS54MSArIHkueDEgPT0geS54MSAqIDIKKyAgICAgICAgYXNzZXJ0IHkueDIgLSAxID09IDkuMGYKKyAgICAgICAgYXNzZXJ0IHkueDMgKiAyID09IDIwTAorICAgICAgICBhc3NlcnQgeS54NCA9PSAxMAorICAgICAgICBhc3NlcnQgeS54NSA9PSAxMAorICAgICAgICBhc3NlcnQgeS54NiArIDMgPT0gMTMKKyAgICAgICAgYXNzZXJ0ICJIZWxsbyIgKyB5Lng3ICsgIldvcmxkISIgPT0gIkhlbGxvXG5Xb3JsZCEiCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL1ByaW50bG5XaXRoTmV3QnVnLmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9QcmludGxuV2l0aE5ld0J1Zy5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJiMTYyNAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9QcmludGxuV2l0aE5ld0J1Zy5ncm9vdnkKQEAgLTAsMCArMSwxNSBAQAorcGFja2FnZSBncm9vdnkuYnVncworCitpbXBvcnQgZ3Jvb3Z5LkZvbworCisvKioKKyAqIEBhdXRob3IgTWFyayBWb2xrbWFubiAKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4zICQKKyAqLworY2xhc3MgUHJpbnRsbldpdGhOZXdCdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisgICAgCisgICAgdm9pZCB0ZXN0QnVnKCkgeworICAgICAgICBwcmludGxuKG5ldyBGb28obmFtZTonYWJjJykpIAorICAgICAgICBwcmludGxuIG5ldyBGb28obmFtZTonZGVmJykgCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL1Byb3BlcnR5QnVnLmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9Qcm9wZXJ0eUJ1Zy5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEwMjA3MAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9Qcm9wZXJ0eUJ1Zy5ncm9vdnkKQEAgLTAsMCArMSwyMCBAQAorcGFja2FnZSBncm9vdnkuYnVncworCitpbXBvcnQgamF2YXguc3dpbmcuSkJ1dHRvbgoraW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbAorCisvKioKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworY2xhc3MgUHJvcGVydHlCdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisgICAgIAorICAgIHZvaWQgdGVzdEJ1ZygpIHsKKyAgICAgICAgZGVmIHBhbmVsID0gbmV3IEpQYW5lbCgpCisgICAgICAgIGRlZiBiZWFuID0gbmV3IEpCdXR0b24oKQorICAgICAgICAKKyAgICAgICAgcGFuZWwuYWRkKGJlYW4pCisgICAgICAgIAorICAgICAgICBkZWYgdmFsdWUgPSBiZWFuLnBhcmVudAorICAgICAgICBhc3NlcnQgdmFsdWUgIT0gbnVsbAorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvUHJvcGVydHlOYW1lQnVnLmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9Qcm9wZXJ0eU5hbWVCdWcuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMGY5YjAKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvUHJvcGVydHlOYW1lQnVnLmdyb292eQpAQCAtMCwwICsxLDM0IEBACitwYWNrYWdlIGdyb292eS5idWdzCisKKy8qKgorICogVGVzdCB0byBmaXggdGhlIGlzc3VlIEdST09WWS04NDMuCisgKgorICogQGF1dGhvciBQaWxobyBLaW0KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworCitwdWJsaWMgY2xhc3MgUHJvcGVydHlOYW1lQnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworICAgIHZvaWQgdGVzdE5vbkphdmFJZGVudGlmaWVyQ2hhY2FjdGVyc1dpdGhKYXZhU3ludGF4KCkgeworICAgICAgICBNYXAgbWFwID0gbmV3IEhhc2hNYXAoKQorICAgICAgICBtYXAucHV0KCJmb28uYmFyIiwgIkZvb0JhciIpCisgICAgICAgIG1hcC5wdXQoImZvby5iYXItYmFyIiwgIkZvb0Jhci1CYXIiKQorICAgICAgICBtYXAucHV0KCJmb28uPTsmfF4qLSstL1xcJz8uKjphcmJpdHJhcnkoKVtde30lI0AhIiwgIkFueSBjaGFyYWN0ZXIiKQorCisgICAgICAgIHByaW50bG4oImZvby5iYXIxID0gJHttYXAuZ2V0KCJmb28uYmFyMSIpfSIpCisgICAgICAgIHByaW50bG4oImZvby5iYXItYmFyID0gJHttYXAuZ2V0KCJmb28uYmFyLWJhciIpfSIpCisgICAgICAgIHByaW50bG4oIlNwZWNpY2FsIENoYXJhY3RlciBUZXN0OiAke21hcC5nZXQoImZvby49OyZ8XiotKy0vXFwnPy4qOmFyYml0cmFyeSgpW117fSUjQCEiKX0iKQorICAgIH0KKworICAgIHZvaWQgdGVzdE5vbkphdmFJZGVudGlmaWVyQ2hhY2FjdGVyc1dpdGhHcm9vdnlTeW50YXgoKSB7CisgICAgICAgIGRlZiBtYXAgPSBbOl0KKyAgICAgICAgbWFwLiJmb28uYmFyIiA9ICJGb29CYXIiCisgICAgICAgIG1hcC4iZm9vLmJhci1iYXIiID0gIkZvb0Jhci1CYXIiCisgICAgICAgIG1hcC4iZm9vLj07JnxeKi0rLS9cXCc/Lio6YXJiaXRyYXJ5KClbXXt9JSNAISIgPSAiQW55IGNoYXJhY3RlciIKKworICAgICAgICBwcmludGxuKCJmb28uYmFyMSA9ICR7bWFwLiJmb28uYmFyMSJ9IikKKyAgICAgICAgcHJpbnRsbigiZm9vLmJhci1iYXIgPSAke21hcC4iZm9vLmJhci1iYXIifSIpCisgICAgICAgIHByaW50bG4oIlNwZWNpY2FsIENoYXJhY3RlciBUZXN0OiAke21hcC4iZm9vLj07JnxeKi0rLS9cXCc/Lio6YXJiaXRyYXJ5KClbXXt9JSNAISJ9IikKKyAgICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL1JvZHNCb29sZWFuQnVnLmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9Sb2RzQm9vbGVhbkJ1Zy5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMxOWI2YwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9Sb2RzQm9vbGVhbkJ1Zy5ncm9vdnkKQEAgLTAsMCArMSwxOCBAQAorcGFja2FnZSBncm9vdnkuYnVncworCisvKioKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworY2xhc3MgUm9kc0Jvb2xlYW5CdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICBkZWYgaXRlbSA9ICJoaSIKKyAgICAKKyAgICB2b2lkIHRlc3RCdWcoKSB7CisgICAgICAgIGFzc2VydCBpc0l0KCkKKyAgICB9CisgICAgCisgICAgZGVmIGlzSXQoKSB7CisgICAgICAgIHJldHVybiBpdGVtICE9IG51bGwgJiYgaXRlbSA9PSAiaGkiCisgICAgfQorICAgIAorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9Sb2RzQnVnLmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9Sb2RzQnVnLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjc2ZmI1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL1JvZHNCdWcuZ3Jvb3Z5CkBAIC0wLDAgKzEsNDUgQEAKK3BhY2thZ2UgZ3Jvb3Z5LmJ1Z3MKKworLyoqCisgKiBAYXV0aG9yIFJvZCBDb3BlCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK2NsYXNzIFJvZHNCdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisgICAgCisgICAgdm9pZCB0ZXN0QnVnKCkgeworICAgICAgICBkb1Rlc3QodHJ1ZSkKKyAgICAgICAgLyoKKyAgICAgICAgIGRlZiB4ID0gMQorICAgICAgICAgaWYgKHggPiAwKSB7CisgICAgICAgICBTdHJpbmcgbmFtZSA9ICJSb2QiCisgICAgICAgICBwcmludGxuKG5hbWUpCisgICAgICAgICB9CisgICAgICAgICAqLworICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RCdWcyKCkgeworICAgICAgICBkZWYgeCA9IDEKKyAgICAgICAgaWYgKHggPiAwKSB7CisgICAgICAgICAgICAvL1N0cmluZyBuYW1lID0gIlJvZCIKKyAgICAgICAgICAgIGRlZiBuYW1lID0gIlJvZCIKKyAgICAgICAgICAgIHByaW50bG4obmFtZSkKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICB2b2lkIGRvVGVzdChmbGFnKSB7CisgICAgICAgIGlmIChmbGFnKSB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9ICJSb2QiCisgICAgICAgICAgICAvL2RlZiBuYW1lID0gIlJvZCIKKyAgICAgICAgICAgIGRvQXNzZXJ0KG5hbWUpCisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgdm9pZCBkb1Rlc3QoKSB7CisgICAgICAgIFN0cmluZyBuYW1lID0gIlJvZCIKKyAgICAgICAgZG9Bc3NlcnQobmFtZSkKKyAgICB9CisgICAgCisgICAgdm9pZCBkb0Fzc2VydCh0ZXh0KSB7CisgICAgICAgIGFzc2VydCB0ZXh0ICE9IG51bGwKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL1J1c3NlbGxzT3B0aW9uYWxQYXJlblRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL1J1c3NlbGxzT3B0aW9uYWxQYXJlblRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNjI3OTYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvUnVzc2VsbHNPcHRpb25hbFBhcmVuVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwxMSBAQAorcGFja2FnZSBncm9vdnkuYnVncworCitjbGFzcyBSdXNzZWxsc09wdGlvbmFsUGFyZW5UZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCB0ZXN0TWV0aG9kQ2FsbFdpdGhPbmVQYXJhbSgpIHsKKyAgICAgICAgZGVmIGFkb2IgPSBuZXcgQXJyYXlMaXN0KCkKKyAgICAgICAgYWRvYi5hZGQgImhlbGxvIgorICAgICAgICBwcmludGxuIGFkb2IuZ2V0KDApCisgICAgICAgIHByaW50bG4gYWRvYi5zaXplKCkKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL1NjcmlwdEJ1Zy5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL1NjcmlwdEJ1Zy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlOGQzZDkKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvU2NyaXB0QnVnLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAkSWQkCisKKyBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAorIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0CisgICAgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhCisgICAgY29weSBvZiB0aGlzIGRvY3VtZW50LgorCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQorICAgIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKKyAgICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKKyAgICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCisgICAgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCisKKyA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IgorICAgIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQKKyAgICB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgorCisgNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KKyAgICBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMKKyBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKKyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCisgVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICovCisKK3BhY2thZ2UgZ3Jvb3Z5LmJ1Z3M7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuLlRlc3RTdXBwb3J0OworCisKKy8qKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIFNjcmlwdEJ1ZyBleHRlbmRzIFRlc3RTdXBwb3J0IHsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RCdWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0U2NyaXB0KCJwcmludGxuICdoZWxsbyB3b3JsZCciKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvU2VhbnNCdWcuamF2YSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9TZWFuc0J1Zy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1Njc3YTUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvU2VhbnNCdWcuamF2YQpAQCAtMCwwICsxLDkyIEBACisvKgorICRJZCQKKworIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCisgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQKKyAgICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKKyAgICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCisgICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQorICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgorICAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKKyAgICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KKworIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCisgICAgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAorICAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCisKKyA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQorICAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLworCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUworIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAorIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKKyBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgKi8KKworcGFja2FnZSBncm9vdnkuYnVnczsKKworaW1wb3J0IGdyb292eS5sYW5nLkdyb292eVNoZWxsOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW4uVGVzdFN1cHBvcnQ7CisKKy8qKgorICogQGF1dGhvciBTZWFuIFRpbW0KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIFNlYW5zQnVnIGV4dGVuZHMgVGVzdFN1cHBvcnQgeworCisgICAgcHVibGljIHZvaWQgdGVzdEJ1ZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgY29kZSA9ICJmb3IgKGkgaW4gMS4uMTApIFxue1xuICBwcmludGxuKGkpXG59IjsKKyAgICAgICAgR3Jvb3Z5U2hlbGwgc2hlbGwgPSBuZXcgR3Jvb3Z5U2hlbGwoKTsKKyAgICAgICAgc2hlbGwuZXZhbHVhdGUoY29kZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE1hcmt1cEJ1ZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmdbXSBsaW5lcyA9CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgInBhY2thZ2UgZ3Jvb3Z5LnhtbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJiID0gbmV3IE1hcmt1cEJ1aWxkZXIoKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJiLnJvb3QxKGE6NSwgYjo3KSB7ICIsCisgICAgICAgICAgICAgICAgICAgICAgICAiICAgIGVsZW0xKCdoZWxsbzEnKSAiLAorICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBlbGVtMignaGVsbG8yJykgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIgICAgZWxlbTMoeDo3KSAiLAorICAgICAgICAgICAgICAgICAgICAgICAgIn0ifTsKKyAgICAgICAgU3RyaW5nIGNvZGUgPSBhc0NvZGUobGluZXMpOworICAgICAgICBHcm9vdnlTaGVsbCBzaGVsbCA9IG5ldyBHcm9vdnlTaGVsbCgpOworICAgICAgICBzaGVsbC5ldmFsdWF0ZShjb2RlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0cyB0aGUgYXJyYXkgb2YgbGluZXMgb2YgdGV4dCBpbnRvIG9uZSBzdHJpbmcgd2l0aCBuZXdsaW5lcworICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgYXNDb2RlKFN0cmluZ1tdIGxpbmVzKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQobGluZXNbaV0pOworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL1NpbXBsZU1vZGVsLmphdmEgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvU2ltcGxlTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDViMDdmCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL1NpbXBsZU1vZGVsLmphdmEKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAkSWQkCisKKyBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAorIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0CisgICAgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhCisgICAgY29weSBvZiB0aGlzIGRvY3VtZW50LgorCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQorICAgIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKKyAgICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKKyAgICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCisgICAgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCisKKyA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IgorICAgIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQKKyAgICB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgorCisgNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KKyAgICBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMKKyBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKKyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCisgVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICovCisKK3BhY2thZ2UgZ3Jvb3Z5LmJ1Z3M7CisKKy8qKgorICogQGF1dGhvcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgU2ltcGxlTW9kZWwgeworICAgIHB1YmxpYyBTdHJpbmcgczsKKworICAgIFNpbXBsZU1vZGVsKCkgeworICAgICAgICBzID0gIkhpISI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2hvdygpIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHMpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgU2ltcGxlTW9kZWwgc2ltcCA9IG5ldyBTaW1wbGVNb2RlbCgpOworICAgICAgICBzaW1wLnNob3coKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvU3RhdGljQ2xvc3VyZVByb3BlcnR5QnVnLmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9TdGF0aWNDbG9zdXJlUHJvcGVydHlCdWcuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMjNiNTQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvU3RhdGljQ2xvc3VyZVByb3BlcnR5QnVnLmdyb292eQpAQCAtMCwwICsxLDE4IEBACitwYWNrYWdlIGdyb292eS5idWdzCisKKy8qKiAKKyAqIEBhdXRob3IgUm9iZXJ0IEt1emVsagorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitjbGFzcyBTdGF0aWNDbG9zdXJlUHJvcGVydHlCdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICBzdGF0aWMgZGVmIG91dCA9IHtTeXN0ZW0ub3V0LnByaW50bG4oaXQpfQorICAgIAorICAgIHZvaWQgdGVzdENhbGxTdGF0aWNDbG9zdXJlKCkgeworICAgICAgICBjYWxsU3RhdGljQ2xvc3VyZSgpCisgICAgfQorICAgIAorICAgIHN0YXRpYyBkZWYgY2FsbFN0YXRpY0Nsb3N1cmUoKSB7CisgICAgICAgIG91dCgiVEVTVCIpCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL1N0YXRpY01hcmt1cEJ1Zy5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvU3RhdGljTWFya3VwQnVnLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzdmMWJmCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL1N0YXRpY01hcmt1cEJ1Zy5ncm9vdnkKQEAgLTAsMCArMSwxOCBAQAorcGFja2FnZSBncm9vdnkuYnVncworCitpbXBvcnQgZ3Jvb3Z5LnhtbC5NYXJrdXBCdWlsZGVyCisKK2NsYXNzIFN0YXRpY01hcmt1cEJ1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIHZvaWQgdGVzdEJ1ZygpIHsKKyAgICAgICAgZG9NYXJrdXAobmV3IE1hcmt1cEJ1aWxkZXIoKSkKKyAgICB9CisgICAgCisgICAgc3RhdGljIHZvaWQgZG9NYXJrdXAoYnVpbGRlcikgeworICAgICAgICBidWlsZGVyLmh0bWwgeworICAgICAgICAgICAgaGVhZCB7CisgICAgICAgICAgICAgICAgdGl0bGUoIkdyb292eSIpCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL1N0YXRpY01ldGhvZENhbGxCdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL1N0YXRpY01ldGhvZENhbGxCdWcuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NWMzNzcKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvU3RhdGljTWV0aG9kQ2FsbEJ1Zy5ncm9vdnkKQEAgLTAsMCArMSwxNyBAQAorcGFja2FnZSBncm9vdnkuYnVncworCisvKiogCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK2NsYXNzIFN0YXRpY01ldGhvZENhbGxCdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICB2b2lkIHRlc3RCdWcoKSB7CisgICAgICAgIGRlZiB2YWx1ZSA9IFRlc3RTdXBwb3J0Lm1vY2tTdGF0aWNNZXRob2QoKQorICAgICAgICBhc3NlcnQgdmFsdWUgPT0gImNoZWVzZSIKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0U3RhdGljUHJvcGVydHkoKSB7CisgICAgICAgIGRlZiB2YWx1ZSA9IFRlc3RTdXBwb3J0Lm1vY2tTdGF0aWNQcm9wZXJ0eQorICAgICAgICBhc3NlcnQgdmFsdWUgPT0gImNoZWVzZSIKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvU3RhdGljTWV0aG9kSW1wb3J0QnVnLmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9TdGF0aWNNZXRob2RJbXBvcnRCdWcuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMjU0MGIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvU3RhdGljTWV0aG9kSW1wb3J0QnVnLmdyb292eQpAQCAtMCwwICsxLDEzIEBACitwYWNrYWdlIGdyb292eS5idWdzOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5kdW1teS4qCisKKy8qKgorICogVGVzdCBjYXNlIHRvIGNoZWNrIGlmIGltcG9ydHMgY2FuIHVzZSB3aWxkY2FyZCAoKikgZm9yIHN0YXRpYyBtZXRob2QgY2FsbHMuCisgKiBCdWcgcmVmZXJlbmNlOiBFeHBsaWNpdCBpbXBvcnQgbmVlZGVkIHRvIGNhbGwgc3RhdGljIG1ldGhvZCwgR1JPT1ZZLTkzNQorICovCitjbGFzcyBTdGF0aWNNZXRob2RJbXBvcnRCdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisgICAgdm9pZCB0ZXN0QnVnKCkgeworICAgICAgICBhc3NlcnQgQ2xhc3NXaXRoU3RhdGljTWV0aG9kLnN0YXRpY01ldGhvZCgpCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9TdGF0aWNNZXRob2RJbXBvcnRCdWcyLmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9TdGF0aWNNZXRob2RJbXBvcnRCdWcyLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2YyY2UzCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL1N0YXRpY01ldGhvZEltcG9ydEJ1ZzIuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTMgQEAKK3BhY2thZ2UgZ3Jvb3Z5LmJ1Z3M7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmR1bW15LkNsYXNzV2l0aFN0YXRpY01ldGhvZAorCisvKioKKyAqIFRlc3QgY2FzZSB0byBjaGVjayBpZiBpbXBvcnRzIGNhbiB1c2UgZnVsbHkgcXVhbGlmaWVkIGNsYXNzZXMgZm9yIHN0YXRpYyBtZXRob2QgY2FsbHMuCisgKiBCdWcgcmVmZXJlbmNlOiBFeHBsaWNpdCBpbXBvcnQgbmVlZGVkIHRvIGNhbGwgc3RhdGljIG1ldGhvZCwgR1JPT1ZZLTkzNQorICovCitjbGFzcyBTdGF0aWNNZXRob2RJbXBvcnRCdWcyIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworICAgIHZvaWQgdGVzdEJ1ZygpIHsKKyAgICAgICAgYXNzZXJ0IENsYXNzV2l0aFN0YXRpY01ldGhvZC5zdGF0aWNNZXRob2QoKQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvU3Vic2NyaXB0QW5kRXhwcmVzc2lvbkJ1Zy5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvU3Vic2NyaXB0QW5kRXhwcmVzc2lvbkJ1Zy5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhiODg2NgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9TdWJzY3JpcHRBbmRFeHByZXNzaW9uQnVnLmdyb292eQpAQCAtMCwwICsxLDY4IEBACitwYWNrYWdlIGdyb292eS5idWdzCisKK2NsYXNzIFN1YnNjcmlwdEFuZEV4cHJlc3Npb25CdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisgICAgCisgICAgdm9pZCB0ZXN0QnVnKCkgeworICAgICAgICBkZWYgZm9vID0gWyJuaWNlIGNoZWVzZSBncm9tbWl0Il0KKyAgICAgICAgCisgICAgICAgIGRlZiBjaGVlc2UgPSBmb29bMF0uc3RhcnRzV2l0aCgibmljZSIpCisgICAgICAgIAorICAgICAgICBhc3NlcnQgY2hlZXNlID09IHRydWUKKyAgICB9CisKKyAgICB2b2lkIHRlc3RTdWJzY3JpcHRJbmNyZW1lbnQoKSB7CisgICAgICAgIGRlZiBmb28gPSBbNSwgNiwgN10KKyAgICAgICAgZm9vWzBdICs9IDUKKyAgICAgICAgCisgICAgICAgIGFzc2VydCBmb29bMF0gPT0gMTAKKyAgICAgICAgCisgICAgICAgIGRlZiBpID0gMAorICAgICAgICBmb29baSsrXSA9IDEKKyAgICAgICAgYXNzZXJ0IGZvb1swXSA9PSAxCisgICAgICAgIGFzc2VydCBpID09IDEKKyAgICAgICAgCisgICAgICAgIGZvb1tpKytdICs9IDUKKyAgICAgICAgYXNzZXJ0IGkgPT0gMgorICAgICAgICBhc3NlcnQgZm9vWzFdID09IDExCisgICAgfQorCisgICAgdm9pZCB0ZXN0TGFyZ2VTdWJzY3JpcHQoKSB7CisgICAgICAgIGRlZiBmb28gPSBbMV0KKyAgICAgICAgCisgICAgICAgIGZvb1sxMF0gPSAxMjMKKyAgICAgICAgCisgICAgICAgIGFzc2VydCBmb29bMTBdID09IDEyMworICAgICAgICAKKyAgICAgICAgZm9vLnB1dEF0KDEyLCA1NSkKKyAgICAgICAgYXNzZXJ0IGZvb1sxMl0gPT0gNTUKKyAgICAgICAgCisgICAgICAgIGRlZiBpID0gMjAKKyAgICAgICAgZm9vW2ldID0gMQorICAgICAgICBmb29baSsrXSArPSA1CisgICAgICAgIAorICAgICAgICBhc3NlcnQgaSA9PSAyMQorICAgICAgICBhc3NlcnQgZm9vWzIwXSA9PSA2CisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdERvdWJsZVN1YnNjcmlwdCgpIHsKKyAgICAgICAgZGVmIGZvbyA9IFsibmljZSBjaGVlc2UgZ3JvbW1pdCJdCisgICAgICAgIAorICAgICAgICBkZWYgY2hlZXNlID0gZm9vWzBdWzUuLjEwXQorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IGNoZWVzZSA9PSAiY2hlZXNlIgorICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RTdWJzY3JpcHRBbmRQcm9wZXJ0eSgpIHsKKyAgICAgICAgZGVmIGZvbyA9IFtbJ2dyb21pdCc6J2NoZWVzZSddXQorICAgICAgICAKKyAgICAgICAgZGVmIGNoZWVzZSA9IGZvb1swXS5ncm9taXQKKyAgICAgICAgCisgICAgICAgIGFzc2VydCBjaGVlc2UgPT0gImNoZWVzZSIKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0Qm9vbGVhbkV4cHJlc3Npb24oKSB7CisgICAgICAgaW50W10gYSA9IG5ldyBpbnRbMV0KKyAgICAgICBhc3NlcnQgKGFbMF0gPSA0MikgPT0gNDIgCisgICAgICAgYXNzZXJ0IGFbMF0gPT0gNDIKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL1N1YnNjcmlwdE9uUHJpbWl0aXZlVHlwZUFycmF5QnVnLmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9TdWJzY3JpcHRPblByaW1pdGl2ZVR5cGVBcnJheUJ1Zy5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE2MzBjMAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9TdWJzY3JpcHRPblByaW1pdGl2ZVR5cGVBcnJheUJ1Zy5ncm9vdnkKQEAgLTAsMCArMSw0MCBAQAorcGFja2FnZSBncm9vdnkuYnVncworCitjbGFzcyBTdWJzY3JpcHRPblByaW1pdGl2ZVR5cGVBcnJheUJ1ZyBleHRlbmRzIFRlc3RTdXBwb3J0IHsKKyAgICBpbnRbXSBpYTsgIC8vIHR5cGUgaXMgbm90IG5lY2Vzc2FyeQorICAgIGludCBpMTsKKworICAgIHZvaWQgdGVzdEJ1ZygpIHsKKyAgICAgICAgZGVmIGFycmF5ID0gZ2V0SW50QXJyYXkoKSAvLyB0aGlzIGZ1bmN0aW9uIHJldHVybnMgW0ksIHRydWUgcHJpbWl0aXZlIGFycmF5CisgICAgICAgIAorICAgICAgICBkZWYgdmFsdWUgPSBhcnJheVsyXQorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IHZhbHVlID09IDMKKyAgICAgICAgCisgICAgICAgIGFycmF5WzJdID0gOAorCisgICAgICAgIHZhbHVlID0gYXJyYXlbMl0KKyAgICAgICAgYXNzZXJ0IHZhbHVlID09IDgKKyAgICAgICAgCisgICAgICAgIC8vIGxldHMgdGVzdCBhIHJhbmdlCisgICAgICAgIGRlZiByYW5nZSA9IGFycmF5WzEuLjJdCisgICAgICAgIAorICAgICAgICBhc3NlcnQgcmFuZ2UgPT0gWzIsIDhdCisgICAgfQorCisgICAgdm9pZCB0ZXN0R3Jvb3Z5SW50QXJyYXkoKSB7CisgICAgICAgIGludFtdIGlhID0gWzEsIDJdCisgICAgICAgIGludFtdIGlhMSA9IGlhOyAvLyB0eXBlIGlzIG5vdCBuZWNlc3NhcnkKKyAgICAgICAgZGVmIGkxID0gaWExWzBdCisgICAgICAgIGludCBpMiA9IGkxCisgICAgICAgIGFzc2VydCBpMiA9PSAxCisgICAgfQorCisgICAgdm9pZCB0ZXN0SW50QXJyYXlPYmplY3RSYW5nZVNlbGVjdGlvbigpIHsKKyAgICAgICAgaW50W10gaWEgPSBbMTAwMCwgMTEwMCwgMTIwMCwgMTMwMCwgMTQwMF0KKyAgICAgICAgZGVmIHJhbmdlID0gbmV3IE9iamVjdFJhbmdlKG5ldyBJbnRlZ2VyKDEpLCBuZXcgSW50ZWdlcigzKSkKKyAgICAgICAgZGVmIHNlbGVjdGVkID0gaWFbcmFuZ2VdCisgICAgICAgIGFzc2VydCBzZWxlY3RlZCA9PSBbMTEwMCwgMTIwMCwgMTMwMF0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9TdWJzY3JpcHRPblN0cmluZ0FycmF5QnVnLmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9TdWJzY3JpcHRPblN0cmluZ0FycmF5QnVnLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGZhMGM4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL1N1YnNjcmlwdE9uU3RyaW5nQXJyYXlCdWcuZ3Jvb3Z5CkBAIC0wLDAgKzEsMjIgQEAKK3BhY2thZ2UgZ3Jvb3Z5LmJ1Z3MKKworY2xhc3MgU3Vic2NyaXB0T25TdHJpbmdBcnJheUJ1ZyBleHRlbmRzIFRlc3RTdXBwb3J0IHsKKworICAgIHZvaWQgdGVzdEFycmF5U3Vic2NyaXB0KCkgeworICAgICAgICBkZWYgYXJyYXkgPSBnZXRNb2NrQXJndW1lbnRzKCkKKyAKKyAgICAgICAgYXNzZXJ0IGFycmF5WzFdID09ICJiIgorICAgICAgICAKKyAgICAgICAgYXJyYXlbMF0gPSAiZCIKKyAgICAgICAgCisgICAgICAgIGFzc2VydCBhcnJheVswXSA9PSAiZCIKKyAgICAgICAgCisgICAgICAgIHByaW50bG4oIkNvbnRlbnRzIG9mIGFycmF5IGFyZSAke2FycmF5Lmluc3BlY3QoKX0iKQorICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RSb2JzVGVzdENhc2UoKSB7CisgICAgICAgIGRlZiBhcnJheSA9ICJvbmUgdHdvIHRocmVlIi5zcGxpdCgiICIpCisgICAgICAgIAorICAgICAgICBhc3NlcnQgYXJyYXlbMV0gPT0gInR3byIKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL1N1cGVyTWV0aG9kMkJ1Zy5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvU3VwZXJNZXRob2QyQnVnLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzc3NzA4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL1N1cGVyTWV0aG9kMkJ1Zy5ncm9vdnkKQEAgLTAsMCArMSwxMjkgQEAKK3BhY2thZ2UgZ3Jvb3Z5LmJ1Z3MKKworLyoqCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KKyAKK2NsYXNzIFN1cGVyTWV0aG9kMkJ1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKyAgICAgCisgICAgdm9pZCB0ZXN0QnVnKCkgeworICAgIAlkZWYgYmFzZSA9IG5ldyBTdXBlckJhc2UoKQorICAgIAlkZWYgdmFsdWUgPSBiYXNlLmRvU29tZXRoaW5nKCkKKyAgICAJYXNzZXJ0IHZhbHVlID09ICJUZXN0QmFzZSIKKyAgICAJCisgICAgCQorICAgIAliYXNlID0gbmV3IFN1cGVyRGVyaXZlZCgpCisgICAgCXZhbHVlID0gYmFzZS5kb1NvbWV0aGluZygpCisgICAgCWFzc2VydCB2YWx1ZSA9PSAiVGVzdERlcml2ZWRUZXN0QmFzZSIKKyAgICB9CisKKyAgICB2b2lkIHRlc3RCdWcyKCkgeworICAgIAlkZWYgYmFzZSA9IG5ldyBTdXBlckJhc2UoKQorICAgIAlkZWYgdmFsdWUgPSBiYXNlLmZvbygyKQorICAgIAlhc3NlcnQgdmFsdWUgPT0gIlRlc3RCYXNlMiIKKyAgICAJCisgICAgCQorICAgIAliYXNlID0gbmV3IFN1cGVyRGVyaXZlZCgpCisgICAgCXZhbHVlID0gYmFzZS5mb28oMykKKyAgICAJYXNzZXJ0IHZhbHVlID09ICJUZXN0RGVyaXZlZDNUZXN0QmFzZTMiCisgICAgfQorCisgICAgdm9pZCB0ZXN0QnVnMygpIHsKKyAgICAJZGVmIGJhc2UgPSBuZXcgU3VwZXJCYXNlKCkKKyAgICAJZGVmIHZhbHVlID0gYmFzZS5mb28oMiwzKQorICAgIAlhc3NlcnQgdmFsdWUgPT0gImZvbyh4LHkpQmFzZTIsMyIKKyAgICAJCisgICAgCQorICAgIAliYXNlID0gbmV3IFN1cGVyRGVyaXZlZCgpCisgICAgCXZhbHVlID0gYmFzZS5mb28oMyw0KQorICAgIAlhc3NlcnQgdmFsdWUgPT0gImZvbyh4LHkpRGVyaXZlZDMsNGZvbyh4LHkpQmFzZTMsNCIKKyAgICB9CisKKyAgICB2b2lkIHRlc3RCdWc0KCkgeworICAgIAlkZWYgYmFzZSA9IG5ldyBTdXBlckJhc2UoIkNoZWVzZSIpCisgICAgCWRlZiB2YWx1ZSA9IGJhc2UubmFtZQorICAgIAlhc3NlcnQgdmFsdWUgPT0gIkNoZWVzZSIKKyAgICAJCisgICAgCQorICAgIAliYXNlID0gbmV3IFN1cGVyRGVyaXZlZCgiQ2hlZXNlIikKKyAgICAJdmFsdWUgPSBiYXNlLm5hbWUKKyAgICAJYXNzZXJ0IHZhbHVlID09ICJDaGVlc2VEZXJpdmVkIgorICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RDYWxsc1RvU3VwZXJNZXRob2RzUmV0dXJuaW5nUHJpbWl0aXZlcygpeworICAgICAgIGRlZiBiYXNlID0gbmV3IFN1cGVyQmFzZSgic3VwZXIgY2hlZXNlIikKKyAgICAgICBhc3NlcnQgYmFzZS5sb25nTWV0aG9kKCkgPT0gMQorICAgICAgIGFzc2VydCBiYXNlLmludE1ldGhvZCgpID09IDEKKyAgICAgICBhc3NlcnQgYmFzZS5ib29sTWV0aG9kKCkgPT0gdHJ1ZQorICAgICAgIAorICAgICAgIGJhc2UgPSBuZXcgU3VwZXJEZXJpdmVkKCJkZXJpdmVkIHN1cGVyIGNoZWVzZSIpCisgICAgICAgYXNzZXJ0IGJhc2UubG9uZ01ldGhvZCgpID09IDEKKyAgICAgICBhc3NlcnQgYmFzZS5pbnRNZXRob2QoKSA9PSAxCisgICAgICAgYXNzZXJ0IGJhc2UuYm9vbE1ldGhvZCgpID09IHRydWUgICAgICAgCisgICAgfQorfQorCitjbGFzcyBTdXBlckJhc2UgeworICAgIFN0cmluZyBuYW1lCisKKyAgICBTdXBlckJhc2UoKSB7CisgICAgfQorICAgIAorICAgIFN1cGVyQmFzZShTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lCisgICAgfQorICAgIAorICAgIGRlZiBkb1NvbWV0aGluZygpIHsKKyAgICAJIlRlc3RCYXNlIgorICAgIH0KKworICAgIGRlZiBmb28ocGFyYW0pIHsKKyAgICAJIlRlc3RCYXNlIiArIHBhcmFtCisgICAgfQorICAgIAorICAgIGRlZiBmb28oeCwgeSkgeworICAgIAkiZm9vKHgseSlCYXNlIiArIHggKyAiLCIgKyB5CisgICAgfQorICAgIAorICAgIGJvb2xlYW4gYm9vbE1ldGhvZCgpe3RydWV9CisgICAgbG9uZyBsb25nTWV0aG9kKCl7MWx9CisgICAgaW50IGludE1ldGhvZCgpezFpfQorfQorCitjbGFzcyBTdXBlckRlcml2ZWQgZXh0ZW5kcyBTdXBlckJhc2UgeworICAgIAorCWRlZiBjYWxscyA9IDAKKwkKKwlTdXBlckRlcml2ZWQoKSB7CisJfQorCQorCVN1cGVyRGVyaXZlZChTdHJpbmcgbmFtZSkgeworCSAgICBzdXBlcihuYW1lICsgIkRlcml2ZWQiKQorCX0KKwkKKyAgICBkZWYgZG9Tb21ldGhpbmcoKSB7CisgICAgCS8qKiBAdG9kbyArK2NhbGxzIGNhdXNlcyBidWcgKi8KKyAgICAJLy9jYWxscysrCisgICAgCS8qCisgICAgCWNhbGxzID0gY2FsbHMgKyAxCisgICAgCWFzc2VydCBjYWxscyA8IDMKKyAgICAJKi8KKyAgICAJCisgICAgCSJUZXN0RGVyaXZlZCIgKyBzdXBlci5kb1NvbWV0aGluZygpCisgICAgfQorCQorICAgIGRlZiBmb28ocGFyYW0pIHsKKyAgICAJIlRlc3REZXJpdmVkIiArIHBhcmFtICsgc3VwZXIuZm9vKHBhcmFtKQorICAgIH0KKwkKKyAgICBkZWYgZm9vKHgsIHkpIHsKKyAgICAJImZvbyh4LHkpRGVyaXZlZCIgKyB4ICsgIiwiICsgeSArIHN1cGVyLmZvbyh4LCB5KQorICAgIH0KKyAgICAKKyAgICAvLyB3ZSB3YW50IHRvIGVuc3VyZSB0aGF0IGEgY2FsbCB3aXRoIHN1cGVyLCB3aGljaCBpcyBkaXJlY3RseSBhZGRlZCBpbnRvIAorICAgIC8vIGJ5dGVjb2RlIHdpdGhvdXQgY2FsbGluZyBNZXRhQ2xhc3MgZG9lcyBjb3JyZWN0IGJveGluZworICAgIGJvb2xlYW4gYm9vTWV0aG9kKCl7c3VwZXIuYm9vbE1ldGhvZCgpfQorICAgIGludCBpbnRNZXRob2QoKXtzdXBlci5pbnRNZXRob2QoKX0KKyAgICBsb25nIGxvbmdNZXRob2QoKXtzdXBlci5sb25nTWV0aG9kKCl9Cit9CisKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9TdXBlck1ldGhvZEJ1Zy5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvU3VwZXJNZXRob2RCdWcuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlZWFkNjMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvU3VwZXJNZXRob2RCdWcuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTggQEAKK3BhY2thZ2UgZ3Jvb3Z5LmJ1Z3MKKworLyoqCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK2NsYXNzIFN1cGVyTWV0aG9kQnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworICAgICAKKyAgICB2b2lkIHRlc3RCdWcoKSB7CisgICAgCWRlZiBiYXNlID0gbmV3IFRlc3RCYXNlKCJ5eXkiKQorICAgIAlkZWYgdmFsdWUgPSBiYXNlLmRvU29tZXRoaW5nKCkKKyAgICAJYXNzZXJ0IHZhbHVlID09ICJUZXN0QmFzZSIKKyAgICAJCisgICAgCWJhc2UgPSBuZXcgVGVzdERlcml2ZWQoImFiYyIpCisgICAgCXZhbHVlID0gYmFzZS5kb1NvbWV0aGluZygpCisgICAgCWFzc2VydCB2YWx1ZSA9PSAiVGVzdERlcml2ZWRUZXN0QmFzZSIKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9TeW5jaHJvbml6ZWRCeXRlY29kZUJ1Zy5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvU3luY2hyb25pemVkQnl0ZWNvZGVCdWcuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMDQ4ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvU3luY2hyb25pemVkQnl0ZWNvZGVCdWcuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTEzIEBACitwYWNrYWdlIGdyb292eS5idWdzCisKKy8qKgorICogQGF1dGhvciBHdWlsbGF1bWUgTGFmb3JnZQorICovCitjbGFzcyBTeW5jaHJvbml6ZWRCeXRlY29kZUJ1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIC8qKgorICAgICAqIEdyb292eSdzIGJ5dGVjb2RlIGFzc29jaWF0ZWQgd2l0aCBzeW5jcmhvbml6ZWQoZm9vKSBjb25zdHJ1Y3QgdXNlZCB0byBnZW5lcmF0ZSBpbnZhbGlkIGJ5dGVjb2RlCisgICAgICogVGhpcyB0ZXN0IG1ldGhvZCBzaG93cyB0aGF0IHRoZSBzdGFuZGFyZCB3YWl0KCkvbm90aWZ5KCkgd29ya3MuCisgICAgICovCisgICAgdm9pZCB0ZXN0U3luY2hyb25pemVkKCkgeworICAgICAgICBJbnRlZ2VyIGZvbyA9IDAKKworICAgICAgICBUaHJlYWQuc3RhcnR7CisgICAgICAgICAgICBwcmludGxuICJzbGVlcGluZyBmb3IgYSBtb21lbnQiCisgICAgICAgICAgICBzbGVlcCAxMDAwCisgICAgICAgICAgICBwcmludGxuICJzbGVwdCBhbmQgc3luY2hyb25pemluZyBmcm9tIHRocmVhZCIKKyAgICAgICAgICAgIHN5bmNocm9uaXplZChmb28pIHsKKyAgICAgICAgICAgICAgICBwcmludGxuICJub3RpZnlpbmciCisgICAgICAgICAgICAgICAgZm9vLm5vdGlmeSgpCisgICAgICAgICAgICAgICAgcHJpbnRsbiAibm90aWZpZWQiCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcmludGxuICJzeW5jaHJvbml6aW5nIgorICAgICAgICBzeW5jaHJvbml6ZWQoZm9vKSB7CisgICAgICAgICAgICBwcmludGxuICJzdGFydGluZyB0byB3YWl0IgorICAgICAgICAgICAgZm9vLndhaXQoKQorICAgICAgICAgICAgcHJpbnRsbiAid2FpdGVkIgorICAgICAgICB9CisKKyAgICAgICAgLy8gaWYgdGhpcyBwb2ludCBpcyByZWFjaGVkLCB0aGUgdGVzdCB3b3JrZWQgOi0pCisgICAgICAgIGFzc2VydCB0cnVlCisgICAgfQorICAKKyAgLyogbW9yZSB0ZXN0cyB0byBlbnN1cmUgYSBtb25pdG9yIGV4aXQgaXMgZG9uZSBhdCB0aGUgcmlnaHQgcGxhY2UgKi8KKyAgICAKKyAgdm9pZCB0ZXN0QnJlYWtJblN5bmNocm9uaXplZCgpIHsKKyAgICBPYmplY3QgbG9jayA9IG5ldyBPYmplY3QoKQorICAgIHdoaWxlICh0cnVlKSB7CisJICAgIHN5bmNocm9uaXplZChsb2NrKSB7CisgICAgCQlicmVhaworICAgIAl9CisgICAgfQorICAgIGNoZWNrTm90SGF2aW5nQU1vbml0b3IobG9jaykKKyAgfQorICAKKyAgdm9pZCB0ZXN0Q29udGludWVJblN5bmNocm9uaXplZCgpIHsKKyAgICBPYmplY3QgbG9jayA9IG5ldyBPYmplY3QoKSAgCisgICAgYm9vbGVhbiBiID0gdHJ1ZQorICAgIHdoaWxlIChiKSB7CisJICAgIHN5bmNocm9uaXplZChsb2NrKSB7CisJICAgICAgICBiID0gZmFsc2UKKyAgICAJCWNvbnRpbnVlCisgICAgCX0KKyAgICB9CisgICAgY2hlY2tOb3RIYXZpbmdBTW9uaXRvcihsb2NrKQorICB9CisgIAorICB2b2lkIHRlc3RSZXR1cm5JblN5bmNocm9uaXplZCgpIHsKKyAgICBPYmplY3QgbG9jayA9IG5ldyBPYmplY3QoKSAgCisgICAgbWV0aG9kV2l0aFJldHVybihsb2NrKQorICAgIGNoZWNrTm90SGF2aW5nQU1vbml0b3IobG9jaykKKyAgfQorICAKKyAgZGVmIG1ldGhvZFdpdGhSZXR1cm4obG9jaykgeworICAgIHN5bmNocm9uaXplZCAobG9jaykgeworICAgICAgcmV0dXJuCisgICAgfQorICB9CisgIAorICB2b2lkIHRlc3RCcmVha0luQ2xvc3VyZVdpdGhTeW5jaHJvbml6ZWQoKSB7CisgICAgT2JqZWN0IGxvY2sgPSBuZXcgT2JqZWN0KCkKKyAgICBkZWYgYyA9IHsKKyAgICAgIHdoaWxlICh0cnVlKSB7CisJICAgICAgc3luY2hyb25pemVkKGxvY2spIHsKKyAgICAJICAgIGJyZWFrCisgICAgCSAgfQorICAgICAgfQorICAgICAgY2hlY2tOb3RIYXZpbmdBTW9uaXRvcihsb2NrKQorICAgIH0KKyAgICBjKCkKKyAgICBjaGVja05vdEhhdmluZ0FNb25pdG9yKGxvY2spCisgIH0KKyAgCisgIHZvaWQgdGVzdENvbnRpbnVlSW5DbG9zdXJlV2l0aFN5bmNocm9uaXplZCgpIHsKKyAgICBPYmplY3QgbG9jayA9IG5ldyBPYmplY3QoKQorICAgIGRlZiBjID0geworICAgICAgYm9vbGVhbiBiID0gdHJ1ZQorICAgICAgd2hpbGUgKGIpIHsKKwkgICAgICBzeW5jaHJvbml6ZWQobG9jaykgeworICAgIAkgICAgYiA9IGZhbHNlCisgICAgCSAgICBjb250aW51ZQorICAgIAkgIH0KKyAgICAgIH0KKyAgICAgIGNoZWNrTm90SGF2aW5nQU1vbml0b3IobG9jaykKKyAgICB9CisgICAgYygpCisgICAgY2hlY2tOb3RIYXZpbmdBTW9uaXRvcihsb2NrKQorICB9CisgIAorICBkZWYgY2hlY2tOb3RIYXZpbmdBTW9uaXRvcihPYmplY3QgbG9jayl7CisgICAgLy8gaWYgd2UgY2FsbCBub3RpZnkqIG9yIHdhaXQgd2l0aG91dCBoYXZpbmcgdGhlCisgICAgLy8gbW9uaXRvciwgd2UgZ2V0IGFuIGV4Y2VwdGlvbi4KKyAgICB0cnkgeworICAgICAgbG9jay5ub3RpZnlBbGwoKQorICAgICAgYXNzZXJ0IGZhbHNlLCJzaG91bGQgaGF2ZSBubyBtb25pdG9yISIKKyAgICB9IGNhdGNoIChJbGxlZ2FsTW9uaXRvclN0YXRlRXhjZXB0aW9uIGltc2UpIHsKKyAgICAgIGFzc2VydCB0cnVlCisgICAgfQorICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL1RlZHNDbG9zdXJlQnVnLmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9UZWRzQ2xvc3VyZUJ1Zy5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ1OGI2NQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9UZWRzQ2xvc3VyZUJ1Zy5ncm9vdnkKQEAgLTAsMCArMSw5MyBAQAorcGFja2FnZSBncm9vdnkuYnVncworCitpbXBvcnQgZ3Jvb3Z5LnhtbC5NYXJrdXBCdWlsZGVyCisKKy8qKgorICogQGF1dGhvciBUZWQgTGV1bmcKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworY2xhc3MgVGVkc0Nsb3N1cmVCdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisgICAgZGVmIEVYUEVDVEVEPSAnJyc8YXRvbT4KKyAgPHRpdGxlPlRlZCBMZXVuZyBvZmYgdGhlIGFpcjwvdGl0bGU+CisgIDxsaW5rPmh0dHA6Ly93d3cuc2F1cmlhLmNvbS9ub2Jsb2c8L2xpbms+CisgIDxhdXRob3I+CisgICAgPHBlcnNvbj4KKyAgICAgIDxuYW1lPlRlZCBMZXVuZzwvbmFtZT4KKyAgICAgIDx1cmw+aHR0cDovL3d3dy5zYXVyaWEuY29tL2Jsb2c8L3VybD4KKyAgICAgIDxlbWFpbD50d2xAc2F1cmlhLmNvbTwvZW1haWw+CisgICAgPC9wZXJzb24+CisgIDwvYXV0aG9yPgorICA8ZW50cnk+CisgICAgPHRpdGxlPm9uZTwvdGl0bGU+CisgICAgPHN1bW1hcnk+Zmlyc3QgcG9zdDwvc3VtbWFyeT4KKyAgPC9lbnRyeT4KKyAgPGVudHJ5PgorICAgIDx0aXRsZT50d288L3RpdGxlPgorICAgIDxzdW1tYXJ5PnRoZSBzZWNvbmQgcG9zdDwvc3VtbWFyeT4KKyAgPC9lbnRyeT4KKyAgPGVudHJ5PgorICAgIDx0aXRsZT50aHJlZTwvdGl0bGU+CisgICAgPHN1bW1hcnk+cG9zdCB0aGUgdGhpcmQ8L3N1bW1hcnk+CisgIDwvZW50cnk+CisgIDxlbnRyeT4KKyAgICA8dGl0bGU+Zm91cjwvdGl0bGU+CisgICAgPHN1bW1hcnk+dGhlIHBvbmRlcm91cyBmb3VydGggcG9zdDwvc3VtbWFyeT4KKyAgPC9lbnRyeT4KKzwvYXRvbT4nJycKKworICAgIHZvaWQgdGVzdEJ1ZygpIHsKKwkJZGVmIGYgPSBuZXcgRmVlZCgpCisJCWYuYXV0aG9yID0gbmV3IFBlcnNvbihuYW1lOidUZWQgTGV1bmcnLHVybDonaHR0cDovL3d3dy5zYXVyaWEuY29tL2Jsb2cnLCBlbWFpbDondHdsQHNhdXJpYS5jb20nKQorCQlmLmVudHJpZXMgPSBbIG5ldyBFbnRyeSh0aXRsZTonb25lJyxzdW1tYXJ5OidmaXJzdCBwb3N0JyksIG5ldyBFbnRyeSh0aXRsZTondHdvJyxzdW1tYXJ5Oid0aGUgc2Vjb25kIHBvc3QnKSwgbmV3IEVudHJ5KHRpdGxlOid0aHJlZScsIHN1bW1hcnk6J3Bvc3QgdGhlIHRoaXJkJyksIG5ldyBFbnRyeSh0aXRsZTonZm91cicsc3VtbWFyeTondGhlIHBvbmRlcm91cyBmb3VydGggcG9zdCcpIF0KKwkJZGVmIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpCisJCWRlZiB4bWwgPSBuZXcgTWFya3VwQnVpbGRlcihzdykKKworCQlkZWYgYXRvbSA9IHhtbC5hdG9tKCkgeworCQkgIHRpdGxlKCJUZWQgTGV1bmcgb2ZmIHRoZSBhaXIiKQorCQkgIGxpbmsoImh0dHA6Ly93d3cuc2F1cmlhLmNvbS9ub2Jsb2ciKQorCQkgIGF1dGhvcigpIHsKKwkJICAgIHBlcnNvbigpIHsKKwkJICAgICAgbmFtZShmLmF1dGhvci5uYW1lKQorCQkgICAgICB1cmwoZi5hdXRob3IudXJsKQorCQkgICAgICBlbWFpbChmLmF1dGhvci5lbWFpbCkKKwkJICAgIH0KKwkJICB9CisJCSAgZm9yIChlIGluIGYuZW50cmllcykgeworCQkgICAgZW50cnkoKSB7CisJCSAgICAgIHRpdGxlKGUudGl0bGUpCisJCSAgICAgIHN1bW1hcnkoZS5zdW1tYXJ5KQorCQkgICAgfQorCQkgIH0KKwkJfQorCQlTdHJpbmdUZXN0VXRpbC5hc3NlcnRNdWx0aWxpbmVTdHJpbmdzRXF1YWwoRVhQRUNURUQsIHN3LnRvU3RyaW5nKCkpCisJfQorfQorCitjbGFzcyBGZWVkIHsKKyAgICBTdHJpbmcgdGl0bGUKKyAgICBTdHJpbmcgbGluaworICAgIFBlcnNvbiBhdXRob3IKKyAgICBTdHJpbmcgdGFnbGluZQorICAgIFN0cmluZyBnZW5lcmF0b3IKKyAgICBTdHJpbmcgY29weXJpZ2h0CisgICAgU3RyaW5nIG1vZGlmaWVkCisgICAgTGlzdCBlbnRyaWVzCit9CisKK2NsYXNzIEVudHJ5IHsKKyAgICBTdHJpbmcgdGl0bGUKKyAgICBTdHJpbmcgbGluaworICAgIFN0cmluZyBpZAorICAgIFN0cmluZyBzdW1tYXJ5CisgICAgU3RyaW5nIGNvbnRlbnQKKyAgICBQZXJzb24gYXV0aG9yCisgICAgU3RyaW5nIGNyZWF0ZWQKKyAgICBTdHJpbmcgaXNzdWVkCisgICAgU3RyaW5nIG1vZGlmaWVkCit9CisKK2NsYXNzIFBlcnNvbiB7CisgICAgU3RyaW5nIG5hbWUKKyAgICBTdHJpbmcgdXJsCisgICAgU3RyaW5nIGVtYWlsCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL1Rlc3RCYXNlLmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9UZXN0QmFzZS5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJkZDljZQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9UZXN0QmFzZS5ncm9vdnkKQEAgLTAsMCArMSwyNSBAQAorcGFja2FnZSBncm9vdnkuYnVncworCisvKioKKyAqIEEgYmFzZSBjbGFzcyBmb3IgdGVzdGluZyBjb25zdHJ1Y3RvcnMKKyAqIAorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCisKKyBjbGFzcyBUZXN0QmFzZSB7CisKKyAgICAgU3RyaW5nIGZvbworICAgICAKKyAgICAgVGVzdEJhc2UoKSB7CisgICAgIH0KKyAgICAgCisgICAgIFRlc3RCYXNlKFN0cmluZyBhRm9vKSB7CisgICAgICAgICB0aGlzLmZvbyA9IGFGb28KKyAgICAgfQorICAgICAvKiogQHRvZG8gZml4IGJ1ZworICAgICAqLworICAgICAKKyAgICAgZGVmIGRvU29tZXRoaW5nKCkgeworICAgICAJIlRlc3RCYXNlIgorICAgICB9CisgfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9UZXN0Q2FzZUJ1Zy5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvVGVzdENhc2VCdWcuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZTI5MWIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvVGVzdENhc2VCdWcuZ3Jvb3Z5CkBAIC0wLDAgKzEsMjQgQEAKK3BhY2thZ2UgZ3Jvb3Z5LmJ1Z3MKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZQorCisvKioKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworY2xhc3MgVGVzdENhc2VCdWcgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICAvLyB1c2luZyBkZWYgaGVyZSBpcyB3cm9uZworICAgIFRlc3RDYXNlQnVnKFN0cmluZyBuYW1lKSB7CisgICAgCQlzdXBlcihuYW1lKQorICAgIAl9CisgICAgCQorICAgIAl2b2lkIHRlc3REdW1teSgpIHsKKyAgICAJCXByaW50bG4gIndvcmtlZCEiCisgICAgCX0KKworICAgIHN0YXRpYyB2b2lkIG1haW4oYXJncykgeworICAgICAgICBkZWYgZm9vID0gbmV3IFRlc3RDYXNlQnVnKCJoZXkiKQorICAgICAgICBmb28udGVzdER1bW15KCkKKyAgICB9CisgICAgCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL1Rlc3REZXJpdmVkLmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9UZXN0RGVyaXZlZC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY2YmUwMwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9UZXN0RGVyaXZlZC5ncm9vdnkKQEAgLTAsMCArMSwxOCBAQAorcGFja2FnZSBncm9vdnkuYnVncworCisvKioKKyAqIEEgYmFzZSBjbGFzcyBmb3IgdGVzdGluZyBjb25zdHJ1Y3RvcnMKKyAqIAorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCisKKyBjbGFzcyBUZXN0RGVyaXZlZCBleHRlbmRzIFRlc3RCYXNlIHsKKworICAgICBUZXN0RGVyaXZlZChTdHJpbmcgYUZvbykgeworICAgICAgICAgc3VwZXIoYUZvbykKKyAgICAgfQorICAgICAKKyAgICAgZGVmIGRvU29tZXRoaW5nKCkgeworICAgICAJIlRlc3REZXJpdmVkIiArIHN1cGVyLmRvU29tZXRoaW5nKCkKKyAgICAgfQorIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvVGVzdFN1cHBvcnQuamF2YSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9UZXN0U3VwcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NTMxZDgKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvVGVzdFN1cHBvcnQuamF2YQpAQCAtMCwwICsxLDgzIEBACisvKgorICRJZCQKKworIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCisgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQKKyAgICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKKyAgICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCisgICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQorICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgorICAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKKyAgICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KKworIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCisgICAgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAorICAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCisKKyA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQorICAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLworCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUworIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAorIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKKyBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgKi8KKworcGFja2FnZSBncm9vdnkuYnVnczsKKworaW1wb3J0IGdyb292eS51dGlsLkdyb292eVRlc3RDYXNlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKKy8qKgorICogQmFzZSBjbGFzcyBmb3IgdGVzdCBjYXNlcworICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0U3VwcG9ydCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRNb2NrQXJndW1lbnRzKCkgeworICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdeyJhIiwgImIiLCAiYyJ9OworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG1vY2tTdGF0aWNNZXRob2QoKSB7CisgICAgICAgIHJldHVybiAiY2hlZXNlIjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNb2NrU3RhdGljUHJvcGVydHkoKSB7CisgICAgICAgIHJldHVybiAiY2hlZXNlIjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGludFtdIGdldEludEFycmF5KCkgeworICAgICAgICByZXR1cm4gbmV3IGludFtdezEsIDIsIDMsIDQsIDV9OworICAgIH0KKworICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDYWxsaW5nIGN1c3RvbSBpdGVyYXRvcigpIG1ldGhvZCBmb3IgIiArIHRoaXMpOworCisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KGdldE1vY2tBcmd1bWVudHMoKSkuaXRlcmF0b3IoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvVG9TdHJpbmdCdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL1RvU3RyaW5nQnVnLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDhlNzllCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL1RvU3RyaW5nQnVnLmdyb292eQpAQCAtMCwwICsxLDIxIEBACitwYWNrYWdlIGdyb292eS5idWdzCisKKy8qKgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitjbGFzcyBUb1N0cmluZ0J1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKyAgICAgCisgICAgdm9pZCB0ZXN0QnVnKCkgeworICAgIAlwcmludGxuICJTdGFydGluZyB0ZXN0IgorICAgIAkKKyAgICAJZGVmIHZhbHVlID0gdG9TdHJpbmcoKQorICAgIAlhc3NlcnQgdmFsdWUgIT0gbnVsbAorICAgIAkKKyAgICAJcHJpbnRsbiB2YWx1ZQorICAgIAlwcmludGxuICJGb3VuZCB2YWx1ZSAke3ZhbHVlfSIKKyAgICB9CisgICAgCisgICAgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIAlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKSArICJbaGV5XSIKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL1RyeUNhdGNoMkJ1Zy5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvVHJ5Q2F0Y2gyQnVnLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzgyZDYyCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL1RyeUNhdGNoMkJ1Zy5ncm9vdnkKQEAgLTAsMCArMSwyMSBAQAorcGFja2FnZSBncm9vdnkuYnVncworCisvKioKKyAqIEBhdXRob3IgTW9yZ2FuIEhhbmtpbnMgCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK2NsYXNzIFRyeUNhdGNoMkJ1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKyAgICAKKyAgICB2b2lkIHRlc3RCdWcoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KSB7IAorICAgICAgICB9IAorICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RCdWcyKCkgeworICAgIAl0cnkgeworICAgIAkJZGVmIHggPSAxMjMKKyAgICAJfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvVHJ5Q2F0Y2hCdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL1RyeUNhdGNoQnVnLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjE5YTMwCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL1RyeUNhdGNoQnVnLmdyb292eQpAQCAtMCwwICsxLDE3IEBACitwYWNrYWdlIGdyb292eS5idWdzCisKKy8qKgorICogQGF1dGhvciBKb2huIFdpbHNvbgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitjbGFzcyBUcnlDYXRjaEJ1ZyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKyAgICAKKyAgICB2b2lkIHRlc3RCdWcoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcmludGxuKCJIZWxsbyIpCisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgICAgICBwcmludGxuKCJGaW5hbGx5IikKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvVW5rbm93blZhcmlhYmxlQnVnLmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9Vbmtub3duVmFyaWFibGVCdWcuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZWQ5MjMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvVW5rbm93blZhcmlhYmxlQnVnLmdyb292eQpAQCAtMCwwICsxLDE5IEBACitwYWNrYWdlIGdyb292eS5idWdzCisKKy8qKgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitjbGFzcyBVbmtub3duVmFyaWFibGVCdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisgICAgdm9pZCB0ZXN0QnVnKCkgeworICAgICAgICBkZWYgc2hlbGwgPSBuZXcgR3Jvb3Z5U2hlbGwoKQorICAgICAgICBzaG91bGRGYWlsIHsKKyAgICAgICAgICAgIHNoZWxsLmV2YWx1YXRlICIiIgorICAgICAgICAgICAgICAgIGRlZiB4ID0gZm9vCisgICAgICAgICAgICAiIiIKKyAgICAgICAgfQorICAgICAgICBzaGVsbC5ldmFsdWF0ZSAiIiIKKyAgICAgICAgICAgIGZvbyA9IDEKKyAgICAgICAgICAgIGRlZiB4ID0gZm9vCisgICAgICAgICIiIgorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvVXNlQ2xvc3VyZUluQ2xvc3VyZUJ1Zy5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvVXNlQ2xvc3VyZUluQ2xvc3VyZUJ1Zy5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM0MzY2OAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9Vc2VDbG9zdXJlSW5DbG9zdXJlQnVnLmdyb292eQpAQCAtMCwwICsxLDE0IEBACitwYWNrYWdlIGdyb292eS5idWdzCisKKy8qKgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitjbGFzcyBVc2VDbG9zdXJlSW5DbG9zdXJlQnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworICAgIHZvaWQgdGVzdEJ1Z1dpdGhQcmludGxuKCkgeworICAgICAgICBkZWYgaW5uZXIgPSB7IGl0ICogMyB9CisgICAgICAgIGRlZiBvdXRlcjEgPSB7IGlubmVyKGl0KSArIDUgfQorICAgICAgICBkZWYgb3V0ZXIyID0geyBpbm5lcihpdCArIDUpIH0KKyAgICAgICAgYXNzZXJ0IDE3ID09IG91dGVyMSg0KQorICAgICAgICBhc3NlcnQgMjcgPT0gb3V0ZXIyKDQpCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9Vc2VTdGF0aWNJbkNsb3N1cmVCdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL1VzZVN0YXRpY0luQ2xvc3VyZUJ1Zy5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYwZDc0NWEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvVXNlU3RhdGljSW5DbG9zdXJlQnVnLmdyb292eQpAQCAtMCwwICsxLDI3IEBACitwYWNrYWdlIGdyb292eS5idWdzCisKKy8qKgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitjbGFzcyBVc2VTdGF0aWNJbkNsb3N1cmVCdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICBzdGF0aWMgZGVmIHN0dWZmID0gWzpdCisKKyAgICB2b2lkIHRlc3RCdWcoKSB7CisgICAgICAgIFsxLDIsM10uZWFjaCB7IHN0dWZmW2l0XSA9ICJkb2ciIH0KKworICAgICAgICBhc3NlcnQgc3R1ZmYuc2l6ZSgpID09IDMKKyAgICAgICAgYXNzZXJ0IHN0dWZmWzJdID09ICJkb2ciCisgICAgfQorCisgICAgdm9pZCB0ZXN0QnVnMigpIHsKKyAgICAgICAgZG9TdGF0aWMoKQorICAgIH0KKworICAgIHN0YXRpYyBkZWYgZG9TdGF0aWMoKSB7CisgICAgICAgIFsxLDIsM10uZWFjaCB7IHN0dWZmW2l0XSA9ICJkb2ciIH0KKworICAgICAgICBhc3NlcnQgc3R1ZmYuc2l6ZSgpID09IDMKKyAgICAgICAgYXNzZXJ0IHN0dWZmWzJdID09ICJkb2ciCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL1ZhcmlhYmxlUHJlY2VkZW5jZS5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvVmFyaWFibGVQcmVjZWRlbmNlLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTk0OWFiCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL1ZhcmlhYmxlUHJlY2VkZW5jZS5ncm9vdnkKQEAgLTAsMCArMSw1NSBAQAorcGFja2FnZSBncm9vdnkuYnVncworCisvKioKKyAqIEBhdXRob3IgSm9obiBXaWxzb24KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworY2xhc3MgVmFyaWJsZVByZWNlZGVuY2UgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisgICAgCisgICAgdm9pZCB0ZXN0VmFyaWFibGVQcmVjZWRlbmNlKCkgeworIAorICAgICAgICBhc3NlcnRTY3JpcHQoICIiIgorICAgICAgICAgICAgY2xhc3MgVmFyaWFibGVGb28geworICAgICAgICAgICAgICAgIGRlZiB4ID0gMTAwCisgICAgICAgICAgICAgICAgZGVmIHkgPSA5MworICAgICAgICAgICAgICAgIGRlZiBjID0ge3ggLT4gYXNzZXJ0IHggPT0gMTsgYXNzZXJ0IHkgPT0gOTM7IH0KKworICAgICAgICAgICAgICAgIHN0YXRpYyB2b2lkIG1haW4oYXJncykgeworICAgICAgICAgICAgICAgICAgICBkZWYgdmZvbyA9IG5ldyBWYXJpYWJsZUZvbygpCisgICAgICAgICAgICAgICAgICAgIHZmb28uYy5jYWxsKDEpCisKKyAgICAgICAgICAgICAgICAgICAgZGVmIHogPSA4NzQ7CisgICAgICAgICAgICAgICAgICAgIDEudGltZXMgeyBhc3NlcnQgdmZvby54ID09IDEwMDsgYXNzZXJ0IHogPT0gODc0OyB6ID0gMzk7IH0KKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHogPT0gMzk7CisKKyAgICAgICAgICAgICAgICAgICAgdmZvby5sb2NhbCgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZvaWQgbG9jYWwoKSB7CisgICAgICAgICAgICAgICAgICAgIGMuY2FsbCgxKTsKKworICAgICAgICAgICAgICAgICAgICBkZWYgeiA9IDg3NDsKKyAgICAgICAgICAgICAgICAgICAgMS50aW1lcyB7IGFzc2VydCB4ID09IDEwMDsgYXNzZXJ0IHogPT0gODc0OyB6ID0gMzk7IH0KKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHogPT0gMzk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICIiIiApOworCisgICAgfQorCisKKy8qCisgKiBDVVJSRU5UTFkgQlJPS0VOLiAgVmFyaWFibGUgc2NvcGluZyBuZWVkcyBhbiBvdmVyaGF1bCB0byAqIGZpeCBpdC4KKyAqLworICAgIHZvaWQgdGVzdFZhcmlhYmxlUHJlY2VkZW5jZUluU2NyaXB0X0ZBSUxTKCkgeyBpZiAobm90WWV0SW1wbGVtZW50ZWQoKSkgcmV0dXJuCisgICAgICAgIGFzc2VydFNjcmlwdCggIiIiCisgICAgICAgICAgICBjID0geyB4IC0+IGFzc2VydCB4ID09IDE7IGFzc2VydCB5ID09IDkzOyB9CisgICAgICAgICAgICB4ID0gMTAwOworICAgICAgICAgICAgeSA9IDkzOworCisgICAgICAgICAgICBjLmNhbGwoMSk7CisgICAgICAgICIiIik7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvVmFyaWFibGVQcmVjZWRlbmNlVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvVmFyaWFibGVQcmVjZWRlbmNlVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM5MDBlZgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9WYXJpYWJsZVByZWNlZGVuY2VUZXN0Lmdyb292eQpAQCAtMCwwICsxLDI4IEBACitwYWNrYWdlIGdyb292eS5idWdzCisKK2NsYXNzIFZhcmlhYmxlUHJlY2VkZW5jZVRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisgICAgZGVmIHggPSAxMDAKKyAgICBkZWYgeSA9IDkzCisgICAgZGVmIGMgPSB7eCAtPiBhc3NlcnQgeCA9PSAxOyBhc3NlcnQgeSA9PSA5MzsgfQorCisgICAgdm9pZCB0ZXN0Rm9vKCkgeworICAgICAgICBTdHJpbmdbXSBhcmdzID0gWyJhIl0KKyAgICAgICAgbWFpbihhcmdzKQorICAgIH0KKworICAgIHN0YXRpYyB2b2lkIG1haW4oYXJncykgeworICAgICAgICBkZWYgdmZvbyA9IG5ldyBWYXJpYWJsZVByZWNlZGVuY2VUZXN0KCkKKyAgICAgICAgdmZvby5jLmNhbGwoMSkKKyAgICAgICAgZGVmIHogPSA4NzQ7CisgICAgICAgIDEudGltZXMgeyBhc3NlcnQgdmZvby54ID09IDEwMDsgYXNzZXJ0IHogPT0gODc0OyB6ID0gMzk7IH0KKyAgICAgICAgYXNzZXJ0IHogPT0gMzk7CisgICAgICAgIHZmb28ubG9jYWwoKTsKKyAgICB9CisKKyAgICB2b2lkIGxvY2FsKCkgeworICAgICAgICBjLmNhbGwoMSk7CisgICAgICAgIGRlZiB6ID0gODc0OworICAgICAgICAxLnRpbWVzIHsgYXNzZXJ0IHggPT0gMTAwOyBhc3NlcnQgeiA9PSA4NzQ7IHogPSAzOTsgfQorICAgICAgICBhc3NlcnQgeiA9PSAzOTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL1ZhcmlhYmxlU2NvcGluZ0J1Zy5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvVmFyaWFibGVTY29waW5nQnVnLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmFkZTAxCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL1ZhcmlhYmxlU2NvcGluZ0J1Zy5ncm9vdnkKQEAgLTAsMCArMSw0MyBAQAorcGFja2FnZSBncm9vdnkuYnVncworCisvKioKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworY2xhc3MgVmFyaWFibGVTY29waW5nQnVnIGV4dGVuZHMgVGVzdFN1cHBvcnQgeworICAgIAorICAgIHZvaWQgdGVzdEJ1ZygpIHsKKyAgICAgICAgLy8gdW5kZWNsYXJlZCB2YXJpYWJsZSB4CisKKyAgICAgICAgc2hvdWxkRmFpbCB7CisgICAgICAgICAgICBkZWYgc2hlbGwgPSBuZXcgR3Jvb3Z5U2hlbGwoKQorICAgICAgICAgICAgc2hlbGwuZXZhbHVhdGUoIiIiCisgICAgICAgICAgICAgICAgY2xhc3MgU29tZVRlc3QgeworICAgICAgICAgICAgICAgICAgICB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoeiBpbiAwLi4yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmIHggPSBbMSwgMiwgM10KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh0IGluIDAuLjMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHkgaW4geCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGxuIHgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIG5ldyBTb21lVGVzdCgpLnJ1bigpIiIiKQorICAgICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCB0ZXN0VmFyaWFibGVSZXVzZSgpIHsKKyAgICAgICAgZGVmIHNoZWxsID0gbmV3IEdyb292eVNoZWxsKCkKKyAgICAgICAgc2hlbGwuZXZhbHVhdGUoIiIiCisgICAgICAgICAgICBmb3IgKHogaW4gMC4uMikgeworICAgICAgICAgICAgICAgIGRlZiB4ID0gWzEsIDIsIDNdCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAodCBpbiAwLi4zKSB7CisgICAgICAgICAgICAgICAgZGVmIHggPSAxMjMKKyAgICAgICAgICAgICAgICBwcmludGxuIHgKKyAgICAgICAgICAgIH0iIiIpCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9ab2hhcnNCdWcuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL1pvaGFyc0J1Zy5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQyN2FhNwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvYnVncy9ab2hhcnNCdWcuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTggQEAKK3BhY2thZ2UgZ3Jvb3Z5LmJ1Z3MKKworLyoqCisgKiBAYXV0aG9yIFpvaGFyIE1lbGFtZWQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworY2xhc3MgWm9oYXJzQnVnIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworICAgIAorICAgIHZvaWQgdGVzdEJ1ZygpIHsKKyAgICAgICAgZGVmIHZhbHVlcyA9IFsxLDIsMyw0XQorICAgICAgICBkZWYgcmVzdWx0ID0gYmxvbyh2YWx1ZXMsIHtpdCA+IDF9KQorICAgICAgICBhc3NlcnQgcmVzdWx0ID09IFsyLCAzLCA0XQorICAgIH0KKyAgICAKKyAgICBkZWYgYmxvbyhhLGIpeworICAgICAgICByZXR1cm4gYS5maW5kQWxse2IuY2FsbChpdCl9CisgICAgfSAgICAKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvYnVnMTU2N19zY3JpcHQuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL2J1ZzE1Njdfc2NyaXB0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTYzODUxCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9idWdzL2J1ZzE1Njdfc2NyaXB0Lmdyb292eQpAQCAtMCwwICsxLDUgQEAKK3BhY2thZ2UgZ3Jvb3Z5LmJ1Z3MKKwordCA9IG5ldyBUaHJlYWQoKSB7IHByaW50bG4gIkdyb292eSIgfQordC5zdGFydCgpCit0LmpvaW4oKQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9leGVjdXRlL0V4ZWN1dGVUZXN0X0xpbnV4U29sYXJpcy5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2V4ZWN1dGUvRXhlY3V0ZVRlc3RfTGludXhTb2xhcmlzLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzBlZjZlCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9leGVjdXRlL0V4ZWN1dGVUZXN0X0xpbnV4U29sYXJpcy5ncm9vdnkKQEAgLTAsMCArMSw1NyBAQAorIyEgL3Vzci9iaW4vZW52IGdyb292eSAKKworcGFja2FnZSBncm9vdnkuZXhlY3V0ZQorCisvKioKKyAqICBUZXN0IHRvIGVuc3VyZSB0aGF0IHRoZSBleGVjdXRlIG1lY2hhbmlzbSB3b3JrcyBmaW5lIG9uICpuaXgtbGlrZSBzeXN0ZW1zLiAgRm9yIHRoZXNlIE9TcyB3ZQorICogIGNhbiBlZmZlY3RpdmVseSBndWFyYW50ZWUgdGhlIGV4aXN0YW5jZSBvZiBzb21lIHByb2dyYW1zIHRoYXQgd2UgY2FuIHJ1bi4gIEFzc3VtZSB0aGUgc2VhcmNoCisgKiAgcGF0aCBpcyBwYXJ0d2F5IHJlYXNvbmFibGUgc28gd2UgY2FuIGFjY2VzcyBzaCBhbmQgZWNoby4KKyAqCisgKiAgPHA+VGhlc2UgdGVzdCBhcmUgYSBiaXQgdHJpdmlhbCBidXQgYXQgbGVhc3QgdGhleSBhcmUgaGVyZSA6LSk8L3A+CisgKgorICogIEBhdXRob3IgUnVzc2VsIFdpbmRlcgorICogIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworY2xhc3MgRXhlY3V0ZVRlc3RfTGludXhTb2xhcmlzIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworICB2b2lkIHRlc3RTaGVsbEVjaG9PbmVBcnJheSAoICkgeworICAgIGRlZiBwcm9jZXNzID0gKCBbICJzaCIgLCAiLWMiICwgImVjaG8gMSIgXSBhcyBTdHJpbmdbXSApLmV4ZWN1dGUgKCApCisgICAgcHJvY2Vzcy53YWl0Rm9yICggKQorICAgIGFzc2VydCBwcm9jZXNzLmluLnRleHQudHJpbSAoICkgPT0gIjEiCisgIH0KKyAgdm9pZCB0ZXN0U2hlbGxFY2hvT25lTGlzdCAoICkgeworICAgIGRlZiBwcm9jZXNzID0gWyAic2giICwgIi1jIiAsICJlY2hvIDEiIF0uZXhlY3V0ZSAoICkKKyAgICBwcm9jZXNzLndhaXRGb3IgKCApCisgICAgYXNzZXJ0IHByb2Nlc3MuaW4udGV4dC50cmltICggKSA9PSAiMSIKKyAgfQorICB2b2lkIHRlc3RFY2hvT25lQXJyYXkgKCApIHsKKyAgICB0cnkgeworICAgICAgZGVmIHByb2Nlc3MgPSAoIFsgImVjaG8gMSIgXSBhcyBTdHJpbmdbXSApLmV4ZWN1dGUgKCApCisgICAgICBwcm9jZXNzLndhaXRGb3IgKCApCisgICAgICAgZmFpbCAoICJTaG91bGQgaGF2ZSB0aHJvd24gamF2YS5pby5JT0V4Y2VwdGlvbjogZWNobyAxOiBub3QgZm91bmQiICkKKyAgICB9CisgICAgY2F0Y2ggKCBJT0V4Y2VwdGlvbiBpb2UgKSB7IH0KKyAgfQorICB2b2lkIHRlc3RFY2hvT25lTGlzdCAoICkgeworICAgIHRyeSB7CisgICAgICBkZWYgcHJvY2VzcyA9IFsgImVjaG8gMSIgXS5leGVjdXRlICggKQorICAgICAgcHJvY2Vzcy53YWl0Rm9yICggKQorICAgICAgIGZhaWwgKCAiU2hvdWxkIGhhdmUgdGhyb3duIGphdmEuaW8uSU9FeGNlcHRpb246IGVjaG8gMTogbm90IGZvdW5kIiApCisgICAgfQorICAgIGNhdGNoICggSU9FeGNlcHRpb24gaW9lICkgeyB9CisgIH0KKyAgdm9pZCB0ZXN0RWNob09uZVNjYWxhciAoICkgeworICAgIGRlZiBwcm9jZXNzID0gImVjaG8gMSIuZXhlY3V0ZSAoICkKKyAgICBwcm9jZXNzLndhaXRGb3IgKCApCisgICAgYXNzZXJ0IHByb2Nlc3MuaW4udGV4dC50cmltICggKSA9PSAiMSIKKyAgfQorICB2b2lkIHRlc3RFY2hvQXJyYXkgKCApIHsKKyAgICBkZWYgcHJvY2VzcyA9ICggWyAiZWNobyIgLCAiMSIgXSBhcyBTdHJpbmdbXSApLmV4ZWN1dGUgKCApCisgICAgcHJvY2Vzcy53YWl0Rm9yICggKQorICAgIGFzc2VydCBwcm9jZXNzLmluLnRleHQudHJpbSAoICkgPT0gIjEiCisgICB9CisgIHZvaWQgdGVzdEVjaG9MaXN0ICggKSB7CisgICAgZGVmIHByb2Nlc3MgPSBbICJlY2hvIiAsICIxIiBdLmV4ZWN1dGUgKCApCisgICAgcHJvY2Vzcy53YWl0Rm9yICggKQorICAgIGFzc2VydCBwcm9jZXNzLmluLnRleHQudHJpbSAoICkgPT0gIjEiCisgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2V4ZWN1dGUvRXhlY3V0ZVRlc3RfV2luZG93cy5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2V4ZWN1dGUvRXhlY3V0ZVRlc3RfV2luZG93cy5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM2ODIzMAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvZXhlY3V0ZS9FeGVjdXRlVGVzdF9XaW5kb3dzLmdyb292eQpAQCAtMCwwICsxLDUzIEBACitwYWNrYWdlIGdyb292eS5leGVjdXRlCisKKy8qKgorICogIFRlc3QgdG8gZW5zdXJlIHRoYXQgdGhlIGV4ZWN1dGUgbWVjaGFuaXNtIHdvcmtzIGZpbmUgb24gV2luZG93cyBzeXN0ZW1zLgorICoKKyAqICA8cD5UaGVzZSB0ZXN0IGFyZSBhIGJpdCB0cml2aWFsIGJ1dCBhdCBsZWFzdCB0aGV5IGFyZSBoZXJlIDotKTwvcD4KKyAqCisgKiAgQGF1dGhvciBQYXVsIEtpbmcKKyAqICBAdmVyc2lvbiAkUmV2aXNpb246IDYxNjUgJAorICovCitjbGFzcyBFeGVjdXRlVGVzdF9XaW5kb3dzIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworICB2b2lkIHRlc3RDbWRFY2hvT25lQXJyYXkoKSB7CisgICAgZGVmIHByb2Nlc3MgPSAoIFsgImNtZC5leGUiICwgIi9jIiAsICJlY2hvIDEiIF0gYXMgU3RyaW5nW10gKS5leGVjdXRlKCkKKyAgICBwcm9jZXNzLndhaXRGb3IoKQorICAgIGFzc2VydCBwcm9jZXNzLmluLnRleHQudHJpbSgpID09ICIxIgorICB9CisKKyAgdm9pZCB0ZXN0Q21kRWNob09uZUxpc3QoKSB7CisgICAgZGVmIHByb2Nlc3MgPSBbICJjbWQuZXhlIiAsICIvYyIgLCAiZWNobyAxIiBdLmV4ZWN1dGUgKCApCisgICAgcHJvY2Vzcy53YWl0Rm9yKCkKKyAgICBhc3NlcnQgcHJvY2Vzcy5pbi50ZXh0LnRyaW0oKSA9PSAiMSIKKyAgfQorCisgIHZvaWQgdGVzdENtZERhdGUoKSB7CisgICAgZGVmIHByb2Nlc3MgPSAiY21kLmV4ZSAvYyBkYXRlLmV4ZSAvdCIuZXhlY3V0ZSgpCisgICAgcHJvY2Vzcy53YWl0Rm9yKCkKKyAgICBkZWYgdGhlRGF0ZSA9IHByb2Nlc3MuaW4udGV4dC50cmltKCkKKyAgICBkZWYgbWluTGVuID0gOAorICAgICAgLy8gZGs6IHRoZSBsZW5ndGggZGVwZW5kcyBvbiB0aGUgbG9jYWxlIHNldHRpbmdzIGFuZCB1c3VhbGx5IGNvbnRhaW5zIHR3byBkaWdpdHMgZm9yCisgICAgICAvLyAgICAgZWFjaCBkYXkvbW9udGgveWVhciB3aGVyZSB0aGUgc2VwYXJhdGlvbiBjaGFyIG1heSBkaWZmZXIuIFRoaXMgdGVzdCBtYXkgZmFpbCBmb3IKKyAgICAgIC8vICAgICBsb2NhbGVzIHdpdGggZXZlbiBzaG9ydGVyIGRhdGUgcmVwcmVzZW50YXRpb25zLiBBcyBzb29uIGFzIHRoaXMgaGFwcGVucywgcGxlYXNlCisgICAgICAvLyAgICAgYWRhcHQgdGhlIG1pbkxlbiB2YWx1ZS4KKyAgICBhc3NlcnQgdGhlRGF0ZS5zaXplKCkgPj0gbWluTGVuLCAiRXhwZWN0ZWQgJyR0aGVEYXRlJyB0byBiZSBhdCBsZWFzdCAkbWluTGVuIGNoYXJzIGxvbmciCisgIH0KKworICB2b2lkIHRlc3RFY2hvT25lQXJyYXkoKSB7CisgICAgdHJ5IHsKKyAgICAgIGRlZiBwcm9jZXNzID0gKCBbICJlY2hvIDEiIF0gYXMgU3RyaW5nW10gKS5leGVjdXRlKCkKKyAgICAgIHByb2Nlc3Mud2FpdEZvcigpCisgICAgICBmYWlsICggIlNob3VsZCBoYXZlIHRocm93biBqYXZhLmlvLklPRXhjZXB0aW9uOiBlY2hvIDE6IG5vdCBmb3VuZCIgKQorICAgIH0KKyAgICBjYXRjaCAoIElPRXhjZXB0aW9uIGlvZSApIHsgfQorICB9CisKKyAgdm9pZCB0ZXN0RWNob09uZUxpc3QoKSB7CisgICAgdHJ5IHsKKyAgICAgIGRlZiBwcm9jZXNzID0gWyAiZWNobyAxIiBdLmV4ZWN1dGUoKQorICAgICAgcHJvY2Vzcy53YWl0Rm9yKCkKKyAgICAgIGZhaWwgKCAiU2hvdWxkIGhhdmUgdGhyb3duIGphdmEuaW8uSU9FeGNlcHRpb246IGVjaG8gMTogbm90IGZvdW5kIiApCisgICAgfQorICAgIGNhdGNoICggSU9FeGNlcHRpb24gaW9lICkgeyB9CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2dwYXRoL0dQYXRoVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2dwYXRoL0dQYXRoVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFlZThlMAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvZ3BhdGgvR1BhdGhUZXN0Lmdyb292eQpAQCAtMCwwICsxLDIzIEBACitwYWNrYWdlIGdyb292eS5ncGF0aAorCisvKioKKyAqIFNvbWUgR1BhdGggdGVzdHMgdXNpbmcgbWFwcyBhbmQgbGlzdHMKKyAqLworY2xhc3MgR1BhdGhUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCB0ZXN0U2ltcGxlR1BhdGhFeHByZXNzaW9ucygpIHsKKyAgICAgICAgZGVmIHRyZWUgPSBjcmVhdGVUcmVlKCkKKyAgICAgICAgYXNzZXJ0IHRyZWUucGVvcGxlLmZpbmQgeyBpdC5uYW1lID09ICdKYW1lcycgfS5sb2NhdGlvbiA9PSAnTG9uZG9uJworICAgICAgICBhc3NlcnQgdHJlZS5wZW9wbGUubmFtZSA9PSBbJ0phbWVzJywgJ0JvYiddCisgICAgICAgIGRlZiBleHBlY3RlZCA9IFsnSmFtZXMgd29ya3Mgb24gMiBwcm9qZWN0KHMpJywgJ0JvYiB3b3JrcyBvbiAyIHByb2plY3QocyknXQorICAgICAgICBhc3NlcnQgdHJlZS5wZW9wbGUuZmluZEFsbCB7IGl0LnByb2plY3RzLnNpemUoKSA+IDEgfS5jb2xsZWN0IHsgaXQubmFtZSArICcgd29ya3Mgb24gJyArIGl0LnByb2plY3RzLnNpemUoKSArICIgcHJvamVjdChzKSIgfSA9PSBleHBlY3RlZAorICAgIH0KKyAgICBwcm90ZWN0ZWQgZGVmIGNyZWF0ZVRyZWUoKSB7CisgICAgICAgIHJldHVybiBbCQorICAgICAgICAgICAgJ3Blb3BsZSc6IFsKKyAgICAgICAgICAgICAgICBbJ25hbWUnIDogJ0phbWVzJywgJ2xvY2F0aW9uJzonTG9uZG9uJywgJ3Byb2plY3RzJzpbJ2dlcm9uaW1vJywgJ2dyb292eSddIF0sCisgICAgICAgICAgICAgICAgWyduYW1lJyA6ICdCb2InLCAnbG9jYXRpb24nOidBdGxhbnRhJywgJ3Byb2plY3RzJzpbJ2Ryb29scycsICdncm9vdnknXSBdCisJCQldIAorCQldCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9ncGF0aC9Ob2RlR1BhdGhUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvZ3BhdGgvTm9kZUdQYXRoVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRjZjlkNgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvZ3BhdGgvTm9kZUdQYXRoVGVzdC5ncm9vdnkKQEAgLTAsMCArMSw0NCBAQAorcGFja2FnZSBncm9vdnkuZ3BhdGgKKworLyoqCisgKiBTb21lIEdQYXRoIHRlc3RzIHVzaW5nIHRyZWVzCisgKi8KK2NsYXNzIE5vZGVHUGF0aFRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICB2b2lkIHRlc3RGaW5kKCkgeworICAgICAgICBkZWYgdHJlZSA9IGNyZWF0ZVRyZWUoKQorICAgICAgICBhc3NlcnQgdHJlZS5wZXJzb24uZmluZCB7IGl0WydAbmFtZSddID09ICdKYW1lcycgfS5sb2NhdGlvblswXVsnQG5hbWUnXSA9PSAnTG9uZG9uJworICAgIH0KKworICAgIHZvaWQgdGVzdEZpbmRBbGwoKSB7CisgICAgICAgIGRlZiB0cmVlID0gY3JlYXRlVHJlZSgpCisgICAgICAgIGRlZiBwZW9wbGVXaXRoTmFtZUJvYiA9IHRyZWUucGVyc29uLmZpbmRBbGwgeyBpdFsnQG5hbWUnXSAhPSAnQm9iJyB9CisgICAgICAgIGFzc2VydCBwZW9wbGVXaXRoTmFtZUJvYi5zaXplKCkgPT0gMQorICAgIH0KKworICAgIHZvaWQgdGVzdENvbGxlY3QoKSB7CisgICAgICAgIGRlZiB0cmVlID0gY3JlYXRlVHJlZSgpCisgICAgICAgIGRlZiBuYW1lc09mQWxsUGVvcGxlID0gdHJlZS5wZXJzb24uY29sbGVjdCB7IGl0WydAbmFtZSddIH0KKyAgICAgICAgYXNzZXJ0IG5hbWVzT2ZBbGxQZW9wbGUgPT0gWydKYW1lcycsICdCb2InXQorICAgIH0KKworICAgIHByb3RlY3RlZCBkZWYgY3JlYXRlVHJlZSgpIHsKKyAgICAgICAgZGVmIGJ1aWxkZXIgPSBOb2RlQnVpbGRlci5uZXdJbnN0YW5jZSgpCisgICAgICAgIGRlZiByb290ID0gYnVpbGRlci5wZW9wbGUoKSB7CisgICAgICAgICAgICBwZXJzb24obmFtZTonSmFtZXMnKSB7CisgICAgICAgICAgICAgICAgbG9jYXRpb24obmFtZTonTG9uZG9uJykKKyAgICAgICAgICAgICAgICBwcm9qZWN0cyB7CisgICAgICAgICAgICAgICAgICAgIHByb2plY3QobmFtZTonZ2Vyb25pbW8nKQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBlcnNvbihuYW1lOidCb2InKSB7CisgICAgICAgICAgICAgICAgbG9jYXRpb24obmFtZTonQXRsYW50YScpCisgICAgICAgICAgICAgICAgcHJvamVjdHMgeworICAgICAgICAgICAgICAgICAgICBwcm9qZWN0KG5hbWU6J2Ryb29scycpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFzc2VydCByb290ICE9IG51bGwKKyAgICAgICAgcmV0dXJuIHJvb3QKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2luc3BlY3QvSW5zcGVjdG9yVGVzdC5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9pbnNwZWN0L0luc3BlY3RvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjUyZGQxCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9pbnNwZWN0L0luc3BlY3RvclRlc3QuamF2YQpAQCAtMCwwICsxLDI0OCBAQAorcGFja2FnZSBncm9vdnkuaW5zcGVjdDsKKworaW1wb3J0IGdyb292eS5sYW5nLkdyb292eVNoZWxsOworaW1wb3J0IGdyb292eS5sYW5nLk1ldGFNZXRob2Q7CitpbXBvcnQgZ3Jvb3Z5LmxhbmcuTWV0YVByb3BlcnR5OworaW1wb3J0IGdyb292eS5sYW5nLlByb3BlcnR5VmFsdWU7CitpbXBvcnQgb3JnLmptb2NrLk1vY2s7CitpbXBvcnQgb3JnLmptb2NrLmNnbGliLk1vY2tPYmplY3RUZXN0Q2FzZTsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKK3B1YmxpYyBjbGFzcyBJbnNwZWN0b3JUZXN0IGV4dGVuZHMgTW9ja09iamVjdFRlc3RDYXNlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKyAgICBwdWJsaWMgU3RyaW5nIHNvbWVGaWVsZCA9ICJvbmx5IGZvciB0ZXN0aW5nIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT01FX0NPTlNUID0gIm9ubHkgZm9yIHRlc3RpbmciOworCisgICAgcHVibGljIEluc3BlY3RvclRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgLy8gYWRkaXRpb25hbCBjb25zdHJ1Y3RvciBub3QgdXNlZCBkaXJlY3RseSBidXQgZXhlcmNpc2VzIGluc3BlY3Rpb24gY29kZQorICAgIHB1YmxpYyBJbnNwZWN0b3JUZXN0KFN0cmluZyBuYW1lLCBPYmplY3Qgb3RoZXIpIHRocm93cyBSdW50aW1lRXhjZXB0aW9uLCBUaHJvd2FibGUgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3RvcigpIHsKKyAgICAgICAgT2JqZWN0IG9iamVjdCA9IG5ldyBPYmplY3QoKTsKKyAgICAgICAgSW5zcGVjdG9yIGluc3BlY3RvciA9IG5ldyBJbnNwZWN0b3Iob2JqZWN0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG9iamVjdCwgaW5zcGVjdG9yLmdldE9iamVjdCgpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBJbnNwZWN0b3IobnVsbCk7CisgICAgICAgICAgICBmYWlsKCJzaG91bGQgaGF2ZSB0aG93biBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NQcm9wc0phdmEoKSB7CisgICAgICAgIEluc3BlY3RvciBpbnNwID0gbmV3IEluc3BlY3Rvcih0aGlzKTsKKyAgICAgICAgU3RyaW5nW10gY2xhc3NQcm9wcyA9IGluc3AuZ2V0Q2xhc3NQcm9wcygpOworICAgICAgICBhc3NlcnRFcXVhbHMoInBhY2thZ2UgZ3Jvb3Z5Lmluc3BlY3QiLCBjbGFzc1Byb3BzW0luc3BlY3Rvci5DTEFTU19QQUNLQUdFX0lEWF0pOworICAgICAgICBhc3NlcnRFcXVhbHMoInB1YmxpYyBjbGFzcyBJbnNwZWN0b3JUZXN0IiwgY2xhc3NQcm9wc1tJbnNwZWN0b3IuQ0xBU1NfQ0xBU1NfSURYXSk7CisgICAgICAgIGFzc2VydEVxdWFscygiaW1wbGVtZW50cyBTZXJpYWxpemFibGUgIiwgY2xhc3NQcm9wc1tJbnNwZWN0b3IuQ0xBU1NfSU5URVJGQUNFX0lEWF0pOworICAgICAgICBhc3NlcnRFcXVhbHMoImV4dGVuZHMgTW9ja09iamVjdFRlc3RDYXNlIiwgY2xhc3NQcm9wc1tJbnNwZWN0b3IuQ0xBU1NfU1VQRVJDTEFTU19JRFhdKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpcyBQcmltaXRpdmU6IGZhbHNlLCBpcyBBcnJheTogZmFsc2UsIGlzIEdyb292eTogZmFsc2UiLCBjbGFzc1Byb3BzW0luc3BlY3Rvci5DTEFTU19PVEhFUl9JRFhdKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NQcm9wc0dyb292eSgpIHRocm93cyBSdW50aW1lRXhjZXB0aW9uLCBUaHJvd2FibGUgeworICAgICAgICBPYmplY3QgdGVzdE9iamVjdCA9IG5ldyBHcm9vdnlTaGVsbCgpLmV2YWx1YXRlKCJjbGFzcyBUZXN0IHtkZWYgbWV0aDEoYSxiKXt9fVxucmV0dXJuIG5ldyBUZXN0KCkiKTsKKyAgICAgICAgSW5zcGVjdG9yIGluc3AgPSBuZXcgSW5zcGVjdG9yKHRlc3RPYmplY3QpOworICAgICAgICBTdHJpbmdbXSBjbGFzc1Byb3BzID0gaW5zcC5nZXRDbGFzc1Byb3BzKCk7CisgICAgICAgIGFzc2VydEVxdWFscygicGFja2FnZSBuL2EiLCBjbGFzc1Byb3BzW0luc3BlY3Rvci5DTEFTU19QQUNLQUdFX0lEWF0pOworICAgICAgICBhc3NlcnRFcXVhbHMoInB1YmxpYyBjbGFzcyBUZXN0IiwgY2xhc3NQcm9wc1tJbnNwZWN0b3IuQ0xBU1NfQ0xBU1NfSURYXSk7CisgICAgICAgIGFzc2VydEVxdWFscygiaW1wbGVtZW50cyBHcm9vdnlPYmplY3QgIiwgY2xhc3NQcm9wc1tJbnNwZWN0b3IuQ0xBU1NfSU5URVJGQUNFX0lEWF0pOworICAgICAgICBhc3NlcnRFcXVhbHMoImV4dGVuZHMgT2JqZWN0IiwgY2xhc3NQcm9wc1tJbnNwZWN0b3IuQ0xBU1NfU1VQRVJDTEFTU19JRFhdKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpcyBQcmltaXRpdmU6IGZhbHNlLCBpcyBBcnJheTogZmFsc2UsIGlzIEdyb292eTogdHJ1ZSIsIGNsYXNzUHJvcHNbSW5zcGVjdG9yLkNMQVNTX09USEVSX0lEWF0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2RzKCkgeworICAgICAgICBJbnNwZWN0b3IgaW5zcCA9IG5ldyBJbnNwZWN0b3IobmV3IE9iamVjdCgpKTsKKyAgICAgICAgT2JqZWN0W10gbWV0aG9kcyA9IGluc3AuZ2V0TWV0aG9kcygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTAsIG1ldGhvZHMubGVuZ3RoKTsKKyAgICAgICAgU3RyaW5nW10gbmFtZXMgPSB7Imhhc2hDb2RlIiwgImdldENsYXNzIiwgIndhaXQiLCAid2FpdCIsICJ3YWl0IiwgImVxdWFscyIsICJub3RpZnkiLCAibm90aWZ5QWxsIiwgInRvU3RyaW5nIiwgImphdmEubGFuZy5PYmplY3QifTsKKyAgICAgICAgYXNzZXJ0TmFtZUVxdWFscyhuYW1lcywgbWV0aG9kcyk7CisgICAgICAgIFN0cmluZ1tdIGRldGFpbHMgPSB7IkpBVkEiLCAicHVibGljIGZpbmFsIiwgIk9iamVjdCIsICJ2b2lkIiwgIndhaXQiLCAibG9uZywgaW50IiwgIkludGVycnVwdGVkRXhjZXB0aW9uIn07CisgICAgICAgIGFzc2VydENvbnRhaW5zKG1ldGhvZHMsIGRldGFpbHMpOworICAgICAgICAvLyBjdG9ycyBhcmUgbm90IGNvbnNpZGVyZWQgc3RhdGljICEKKyAgICAgICAgU3RyaW5nW10gY3RvckRldGFpbHMgPSB7IkpBVkEiLCAicHVibGljIiwgIk9iamVjdCIsICJPYmplY3QiLCAiamF2YS5sYW5nLk9iamVjdCIsICIiLCAiIn07CisgICAgICAgIGFzc2VydENvbnRhaW5zKG1ldGhvZHMsIGN0b3JEZXRhaWxzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhdGljTWV0aG9kcygpIHsKKyAgICAgICAgSW5zcGVjdG9yIGluc3AgPSBuZXcgSW5zcGVjdG9yKHRoaXMpOworICAgICAgICBPYmplY3RbXSBtZXRob2RzID0gaW5zcC5nZXRNZXRob2RzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nW10gc3RyaW5ncyA9IChTdHJpbmdbXSkgbWV0aG9kc1tpXTsKKyAgICAgICAgICAgIGlmIChzdHJpbmdzWzFdLmluZGV4T2YoInN0YXRpYyIpID4gLTEpIHJldHVybjsgLy8gb2ssIGZvdW5kIG9uZSBzdGF0aWMgbWV0aG9kCisgICAgICAgIH0KKyAgICAgICAgZmFpbCgidGhlcmUgc2hvdWxkIGhhdmUgYmVlbiBhdCBsZWFzdCBvbmUgc3RhdGljIG1ldGhvZCBpbiB0aGlzIFRlc3RDYXNlLCBlLmcuICdmYWlsJy4iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0YU1ldGhvZHMoKSB7CisgICAgICAgIEluc3BlY3RvciBpbnNwID0gbmV3IEluc3BlY3RvcihuZXcgT2JqZWN0KCkpOworICAgICAgICBPYmplY3RbXSBtZXRhTWV0aG9kcyA9IGluc3AuZ2V0TWV0YU1ldGhvZHMoKTsKKyAgICAgICAgU3RyaW5nW10gbmFtZXMgPSB7InNsZWVwIiwgInNsZWVwIiwgInByaW50bG4iLCAicHJpbnRsbiIsICJwcmludGxuIiwgImZpbmQiLCAicHJpbnQiLCAicHJpbnQiLCAiZWFjaCIsICJpbnZva2VNZXRob2QiLCAiYXNUeXBlIiwKKyAgICAgICAgICAgICAgICAiaW5zcGVjdCIsICJpcyIsICJpc0Nhc2UiLCAiaWRlbnRpdHkiLCAiZ2V0QXQiLCAicHV0QXQiLCAiZHVtcCIsICJnZXRNZXRhUHJvcGVydHlWYWx1ZXMiLCAiZ2V0UHJvcGVydGllcyIsCisgICAgICAgICAgICAgICAgInVzZSIsICJ1c2UiLCAidXNlIiwgInByaW50ZiIsICJwcmludGYiLCAiZWFjaFdpdGhJbmRleCIsICJldmVyeSIsICJldmVyeSIsICJhbnkiLCAiYW55IiwgImdyZXAiLCAiY29sbGVjdCIsICJjb2xsZWN0IiwgImZpbmRBbGwiLAorICAgICAgICAgICAgICAgICJmaW5kSW5kZXhPZiIsICJpdGVyYXRvciIsICJhZGRTaHV0ZG93bkhvb2siLCAic3ByaW50ZiIsICJzcHJpbnRmIiwgIndpdGgiLCAiaW5qZWN0IiwgImdldE1ldGFDbGFzcyIKKyAgICAgICAgfTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5hbWVzLmxlbmd0aCwgbWV0YU1ldGhvZHMubGVuZ3RoKTsKKyAgICAgICAgYXNzZXJ0TmFtZUVxdWFscyhuYW1lcywgbWV0YU1ldGhvZHMpOworICAgICAgICBTdHJpbmdbXSBkZXRhaWxzID0geyJHUk9PVlkiLCAicHVibGljIiwgIk9iamVjdCIsICJ2b2lkIiwgInByaW50bG4iLCAiT2JqZWN0IiwgIm4vYSJ9OworICAgICAgICBhc3NlcnRDb250YWlucyhtZXRhTWV0aG9kcywgZGV0YWlscyk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIENsYXNzV2l0aFByaXZhdGUgeworICAgICAgICBwcml2YXRlIFN0cmluZyBoaWRkZW4gPSAieW91IGNhbid0IHNlZSBtZSI7CisgICAgfQorCisgICAgLy8gVE9ETzogaWYgb3VyIGNvZGUgY2FuIG5ldmVyIGFjY2VzcyBpbnNwZWN0IGluIHRoaXMgd2F5LCBpdCB3b3VsZCBiZSBiZXR0ZXIKKyAgICAvLyB0byBtb3ZlIHRoaXMgdG8gYSBib3VuZGFyeSBjbGFzcyBhbmQgdGhlbiB3ZSB3b3VsZG4ndCBuZWVkIHRoaXMgdGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnNwZWN0UHJpdmF0ZUZpZWxkKCkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKKyAgICAgICAgQ2xhc3NXaXRoUHJpdmF0ZSB1bmRlckluc3BlY3Rpb24gPSBuZXcgQ2xhc3NXaXRoUHJpdmF0ZSgpOworICAgICAgICBGaWVsZCBmaWVsZCA9IHVuZGVySW5zcGVjdGlvbi5nZXRDbGFzcygpLmdldERlY2xhcmVkRmllbGQoImhpZGRlbiIpOworICAgICAgICBJbnNwZWN0b3IgaW5zcGVjdG9yID0gZ2V0VGVzdGFibGVJbnNwZWN0b3IodW5kZXJJbnNwZWN0aW9uKTsKKyAgICAgICAgU3RyaW5nW10gcmVzdWx0ID0gaW5zcGVjdG9yLmZpZWxkSW5mbyhmaWVsZCk7CisgICAgICAgIGFzc2VydEVxdWFscyhJbnNwZWN0b3IuTk9UX0FQUExJQ0FCTEUsIHJlc3VsdFtJbnNwZWN0b3IuTUVNQkVSX1ZBTFVFX0lEWF0pOworICAgIH0KKworICAgIC8vIFRPRE86IGlmIG91ciBjb2RlIGNhbiBuZXZlciBhY2Nlc3MgaW5zcGVjdCBpbiB0aGlzIHdheSwgaXQgd291bGQgYmUgYmV0dGVyCisgICAgLy8gdG8gbW92ZSB0aGlzIHRvIGEgYm91bmRhcnkgY2xhc3MgYW5kIHRoZW4gd2Ugd291bGRuJ3QgbmVlZCB0aGlzIHRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zcGVjdFVuaW5zcGVjdGFibGVQcm9wZXJ0eSgpIHsKKyAgICAgICAgT2JqZWN0IGR1bW15SW5zdGFuY2UgPSBuZXcgT2JqZWN0KCk7CisgICAgICAgIEluc3BlY3RvciBpbnNwZWN0b3IgPSBnZXRUZXN0YWJsZUluc3BlY3RvcihkdW1teUluc3RhbmNlKTsKKyAgICAgICAgQ2xhc3NbXSBwYXJhbVR5cGVzID0ge09iamVjdC5jbGFzcywgTWV0YVByb3BlcnR5LmNsYXNzfTsKKyAgICAgICAgT2JqZWN0W10gcGFyYW1zID0ge251bGwsIG51bGx9OworICAgICAgICBNb2NrIG1vY2sgPSBtb2NrKFByb3BlcnR5VmFsdWUuY2xhc3MsIHBhcmFtVHlwZXMsIHBhcmFtcyk7CisgICAgICAgIG1vY2suZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgiZ2V0VHlwZSIpOworICAgICAgICBtb2NrLmV4cGVjdHMob25jZSgpKS5tZXRob2QoImdldE5hbWUiKTsKKyAgICAgICAgbW9jay5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJnZXRWYWx1ZSIpLndpbGwodGhyb3dFeGNlcHRpb24obmV3IFJ1bnRpbWVFeGNlcHRpb24oKSkpOworICAgICAgICBQcm9wZXJ0eVZhbHVlIHByb3BlcnR5VmFsdWUgPSAoUHJvcGVydHlWYWx1ZSkgbW9jay5wcm94eSgpOworICAgICAgICBTdHJpbmdbXSByZXN1bHQgPSBpbnNwZWN0b3IuZmllbGRJbmZvKHByb3BlcnR5VmFsdWUpOworICAgICAgICBhc3NlcnRFcXVhbHMoSW5zcGVjdG9yLk5PVF9BUFBMSUNBQkxFLCByZXN1bHRbSW5zcGVjdG9yLk1FTUJFUl9WQUxVRV9JRFhdKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEluc3BlY3RvciBnZXRUZXN0YWJsZUluc3BlY3RvcihPYmplY3Qgb2JqZWN0VW5kZXJJbnNwZWN0aW9uKSB7CisgICAgICAgIHJldHVybiBuZXcgSW5zcGVjdG9yKG9iamVjdFVuZGVySW5zcGVjdGlvbikgeworICAgICAgICAgICAgcHVibGljIFN0cmluZ1tdIGZpZWxkSW5mbyhGaWVsZCBmaWVsZCkgeworICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5maWVsZEluZm8oZmllbGQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nW10gZmllbGRJbmZvKFByb3BlcnR5VmFsdWUgcHYpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuZmllbGRJbmZvKHB2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U29ydFdpdGhEaWZmZXJlbnRPcmlnaW4oKSB7CisgICAgICAgIFN0cmluZ1tdIGRldGFpbHMyID0geyJKQVZBIiwgInB1YmxpYyIsICJPYmplY3QiLCAidm9pZCIsICJwcmludGxuIiwgIk9iamVjdCIsICJuL2EifTsKKyAgICAgICAgU3RyaW5nW10gZGV0YWlsczEgPSB7IkdST09WWSIsICJwdWJsaWMiLCAiT2JqZWN0IiwgInZvaWQiLCAicHJpbnRsbiIsICJPYmplY3QiLCAibi9hIn07CisgICAgICAgIFN0cmluZ1tdIGZpcnN0ID0gc29ydFdpdGhNZW1iZXJDb21wYXJhdG9yKGRldGFpbHMxLCBkZXRhaWxzMik7CisgICAgICAgIGFzc2VydEVxdWFscygiR1JPT1ZZIiwgZmlyc3RbMF0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTb3J0V2l0aERpZmZlcmVudE1vZGlmaWVyKCkgeworICAgICAgICBTdHJpbmdbXSBkZXRhaWxzMiA9IHtudWxsLCAicHVibGljIiwgIk9iamVjdCIsICJ2b2lkIiwgInByaW50bG4iLCAiT2JqZWN0IiwgIm4vYSJ9OworICAgICAgICBTdHJpbmdbXSBkZXRhaWxzMSA9IHtudWxsLCAicHJpdmF0ZSIsICJPYmplY3QiLCAidm9pZCIsICJwcmludGxuIiwgIk9iamVjdCIsICJuL2EifTsKKyAgICAgICAgU3RyaW5nW10gZmlyc3QgPSBzb3J0V2l0aE1lbWJlckNvbXBhcmF0b3IoZGV0YWlsczEsIGRldGFpbHMyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwcml2YXRlIiwgZmlyc3RbMV0pOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nW10gc29ydFdpdGhNZW1iZXJDb21wYXJhdG9yKFN0cmluZ1tdIGRldGFpbHMxLCBTdHJpbmdbXSBkZXRhaWxzMikgeworICAgICAgICBMaXN0IGRldGFpbHMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGRldGFpbHMuYWRkKGRldGFpbHMxKTsKKyAgICAgICAgZGV0YWlscy5hZGQoZGV0YWlsczIpOworICAgICAgICBJbnNwZWN0b3Iuc29ydChkZXRhaWxzKTsKKyAgICAgICAgcmV0dXJuIChTdHJpbmdbXSkgZGV0YWlscy5nZXQoMCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN0YXRpY01ldGFNZXRob2RzKCkgeworICAgICAgICBNYXRjaGVyIG1hdGNoZXIgPSBQYXR0ZXJuLmNvbXBpbGUoIiIpLm1hdGNoZXIoIiIpOworICAgICAgICBJbnNwZWN0b3IgaW5zcCA9IG5ldyBJbnNwZWN0b3IobWF0Y2hlcik7CisgICAgICAgIE9iamVjdFtdIG1ldGFNZXRob2RzID0gaW5zcC5nZXRNZXRhTWV0aG9kcygpOworICAgICAgICBhc3NlcnRVbmlxdWUoSW5zcGVjdG9yLnNvcnQoQXJyYXlzLmFzTGlzdChtZXRhTWV0aG9kcykpKTsKKyAgICAgICAgU3RyaW5nW10gZGV0YWlscyA9IHsiR1JPT1ZZIiwgInB1YmxpYyBzdGF0aWMiLCAiTWF0Y2hlciIsICJNYXRjaGVyIiwgImdldExhc3RNYXRjaGVyIiwgIiIsICJuL2EifTsKKyAgICAgICAgYXNzZXJ0Q29udGFpbnMobWV0YU1ldGhvZHMsIGRldGFpbHMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RGaWVsZHMoKSB7CisgICAgICAgIEluc3BlY3RvciBpbnNwID0gbmV3IEluc3BlY3Rvcih0aGlzKTsKKyAgICAgICAgT2JqZWN0W10gZmllbGRzID0gaW5zcC5nZXRQdWJsaWNGaWVsZHMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUsIGZpZWxkcy5sZW5ndGgpOyAvLyAzIGZyb20gSk1vY2sKKyAgICAgICAgU3RyaW5nW10gbmFtZXMgPSB7InNvbWVGaWVsZCIsICJTT01FX0NPTlNUIiwgIkFOWVRISU5HIiwgIk5VTEwiLCAiTk9UX05VTEwifTsKKyAgICAgICAgYXNzZXJ0TmFtZUVxdWFscyhuYW1lcywgZmllbGRzKTsKKyAgICAgICAgU3RyaW5nW10gZGV0YWlscyA9IHsiSkFWQSIsICJwdWJsaWMiLCAiSW5zcGVjdG9yVGVzdCIsICJTdHJpbmciLCAic29tZUZpZWxkIiwgIlwib25seSBmb3IgdGVzdGluZ1wiIn07CisgICAgICAgIGFzc2VydENvbnRhaW5zKGZpZWxkcywgZGV0YWlscyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFByb3BlcnRpZXMoKSB7CisgICAgICAgIEluc3BlY3RvciBpbnNwID0gbmV3IEluc3BlY3Rvcih0aGlzKTsKKyAgICAgICAgT2JqZWN0W10gcHJvcGVydGllcyA9IGluc3AuZ2V0UHJvcGVydHlJbmZvKCk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBwcm9wZXJ0aWVzLmxlbmd0aCk7CisgICAgICAgIFN0cmluZ1tdIG5hbWVzID0geyJjbGFzcyIsICJuYW1lIn07CisgICAgICAgIGFzc2VydE5hbWVFcXVhbHMobmFtZXMsIHByb3BlcnRpZXMpOworICAgICAgICBTdHJpbmdbXSBkZXRhaWxzID0geyJHUk9PVlkiLCAicHVibGljIiwgIm4vYSIsICJDbGFzcyIsICJjbGFzcyIsICJjbGFzcyBncm9vdnkuaW5zcGVjdC5JbnNwZWN0b3JUZXN0In07CisgICAgICAgIGFzc2VydENvbnRhaW5zKHByb3BlcnRpZXMsIGRldGFpbHMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQcmludCgpIHsKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ5dGVzID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBQcmludFN0cmVhbSBwcmludFN0cmVhbSA9IG5ldyBQcmludFN0cmVhbShieXRlcyk7CisgICAgICAgIFN0cmluZyBscyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKKyAgICAgICAgU3RyaW5nW10gZmlyc3QgPSB7ImEiLCAiYiJ9OworICAgICAgICBTdHJpbmdbXSBzZWNvbmQgPSB7IngiLCAieSJ9OworICAgICAgICBPYmplY3RbXSBtZW1iZXJJbmZvID0ge2ZpcnN0LCBzZWNvbmR9OworICAgICAgICBJbnNwZWN0b3IucHJpbnQocHJpbnRTdHJlYW0sIG1lbWJlckluZm8pOworICAgICAgICBhc3NlcnRFcXVhbHMoIjA6XHRhIGIgIiArIGxzICsgIjE6XHR4IHkgIiArIGxzLCBieXRlcy50b1N0cmluZygpKTsKKyAgICAgICAgLy8ganVzdCBmb3IgY292ZXJhZ2UsIHByaW50IHRvIFN5c3RlbS5vdXQgKHl1Y2spCisgICAgICAgIEluc3BlY3Rvci5wcmludChtZW1iZXJJbmZvKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0TmFtZUVxdWFscyhTdHJpbmdbXSBuYW1lcywgT2JqZWN0W10gbWV0YU1ldGhvZHMpIHsKKyAgICAgICAgU2V0IG1ldGFTZXQgPSBuZXcgSGFzaFNldCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1ldGFNZXRob2RzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmdbXSBzdHJpbmdzID0gKFN0cmluZ1tdKSBtZXRhTWV0aG9kc1tpXTsKKyAgICAgICAgICAgIG1ldGFTZXQuYWRkKHN0cmluZ3NbSW5zcGVjdG9yLk1FTUJFUl9OQU1FX0lEWF0pOworICAgICAgICB9CisgICAgICAgIFNldCBuYW1lU2V0ID0gbmV3IEhhc2hTZXQoQXJyYXlzLmFzTGlzdChuYW1lcykpOworICAgICAgICBhc3NlcnRFcXVhbHMobmFtZVNldCwgbWV0YVNldCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydENvbnRhaW5zKE9iamVjdFtdIGNhbmRpZGF0ZXMsIFN0cmluZ1tdIHNhbXBsZSkgeworICAgICAgICBTdHJpbmcgc2FtcGxlQnVmZmVyID0gY29uY2F0KHNhbXBsZSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FuZGlkYXRlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nW10gZW50cnkgPSAoU3RyaW5nW10pIGNhbmRpZGF0ZXNbaV07CisgICAgICAgICAgICBpZiAoc2FtcGxlQnVmZmVyLmVxdWFscyhjb25jYXQoZW50cnkpKSkgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZhaWwoInNob3VsZCBoYXZlIGZvdW5kIHNhbXBsZTogIiArIHNhbXBsZUJ1ZmZlcik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFVuaXF1ZShDb2xsZWN0aW9uIHNvcnRlZE1lbWJlcnMpIHsKKyAgICAgICAgaWYgKHNvcnRlZE1lbWJlcnMuc2l6ZSgpIDwgMikgcmV0dXJuOworICAgICAgICBDb21wYXJhdG9yIGNvbXAgPSBuZXcgSW5zcGVjdG9yLk1lbWJlckNvbXBhcmF0b3IoKTsKKyAgICAgICAgSXRlcmF0b3IgaXRlciA9IHNvcnRlZE1lbWJlcnMuaXRlcmF0b3IoKTsKKyAgICAgICAgT2JqZWN0IGxhc3QgPSBpdGVyLm5leHQoKTsKKyAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOworICAgICAgICAgICAgaWYgKDAgPT0gY29tcC5jb21wYXJlKGxhc3QsIGVsZW1lbnQpKSB7CisgICAgICAgICAgICAgICAgZmFpbCgiZm91bmQgZHVwbGljYXRpb24gZm9yIGVsZW1lbnQgIiArIGVsZW1lbnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGFzdCA9IGVsZW1lbnQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBjb25jYXQoU3RyaW5nW10gZGV0YWlscykgeworICAgICAgICBTdHJpbmdCdWZmZXIgZGV0YWlsQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRldGFpbHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGRldGFpbEJ1ZmZlci5hcHBlbmQoZGV0YWlsc1tpXSk7CisgICAgICAgICAgICBkZXRhaWxCdWZmZXIuYXBwZW5kKCIgIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRldGFpbEJ1ZmZlci50b1N0cmluZygpOworICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvaW8vUGxhdGZvcm1MaW5lV3JpdGVyVGVzdC5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9pby9QbGF0Zm9ybUxpbmVXcml0ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI2YjIzOQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvaW8vUGxhdGZvcm1MaW5lV3JpdGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKK3BhY2thZ2UgZ3Jvb3Z5LmlvOworCitpbXBvcnQgZ3Jvb3Z5LnRleHQuU2ltcGxlVGVtcGxhdGVFbmdpbmU7CitpbXBvcnQgZ3Jvb3Z5LnRleHQuVGVtcGxhdGU7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK3B1YmxpYyBjbGFzcyBQbGF0Zm9ybUxpbmVXcml0ZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHVibGljIHZvaWQgdGVzdFBsYXRmb3JtTGluZVdyaXRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBMUyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKKyAgICAgICAgTWFwIGJpbmRpbmcgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICBiaW5kaW5nLnB1dCgiZmlyc3QiLCAiVG9tIik7CisgICAgICAgIGJpbmRpbmcucHV0KCJsYXN0IiwgIkFkYW1zIik7CisgICAgICAgIFRlbXBsYXRlIHRlbXBsYXRlID0gbmV3IFNpbXBsZVRlbXBsYXRlRW5naW5lKCkuY3JlYXRlVGVtcGxhdGUoIjwlPSBmaXJzdCAlPlxuPCUgcHJpbnRsbiBsYXN0ICU+Iik7CisgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIFdyaXRlciBwbGF0Zm9ybVdyaXRlciA9IG5ldyBQbGF0Zm9ybUxpbmVXcml0ZXIoc3RyaW5nV3JpdGVyKTsKKyAgICAgICAgdGVtcGxhdGUubWFrZShiaW5kaW5nKS53cml0ZVRvKHBsYXRmb3JtV3JpdGVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUb20iICsgTFMgKyAiQWRhbXMiICsgTFMsIHN0cmluZ1dyaXRlci50b1N0cmluZygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2xhbmcvQmVuY2htYXJrSW50ZXJjZXB0b3JUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvbGFuZy9CZW5jaG1hcmtJbnRlcmNlcHRvclRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyM2RjZTgKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2xhbmcvQmVuY2htYXJrSW50ZXJjZXB0b3JUZXN0Lmdyb292eQpAQCAtMCwwICsxLDM1IEBACitwYWNrYWdlIGdyb292eS5sYW5nCisKKy8qKgorKiBUZXN0IGZvciB0aGUgQmVuY2htYXJrSW50ZXJjZXB0b3IKKyogQGF1dGhvciBEaWVyayBLb2VuaWcKKyoqLworY2xhc3MgQmVuY2htYXJrSW50ZXJjZXB0b3JUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2V7CisKKyAgICBJbnRlcmNlcHRvciBiZW5jaG1hcmtJbnRlcmNlcHRvcgorICAgIGRlZiBwcm94eQorCisgICAgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgYmVuY2htYXJrSW50ZXJjZXB0b3IgPSBuZXcgQmVuY2htYXJrSW50ZXJjZXB0b3IoKQorICAgICAgICBwcm94eSA9IFByb3h5TWV0YUNsYXNzLmdldEluc3RhbmNlKERhdGUuY2xhc3MpCisgICAgICAgIHByb3h5LnNldEludGVyY2VwdG9yKGJlbmNobWFya0ludGVyY2VwdG9yKQorICAgIH0KKworICAgIHZvaWQgdGVzdFNpbXBsZUludGVyY2VwdGlvbigpIHsKKyAgICAgICAgcHJveHkudXNlIHsKKyAgICAgICAgICAgICBkZWYgeCA9IG5ldyBEYXRlKDApCisgICAgICAgICAgICAgeCsrCisgICAgICAgIH0KKyAgICAgICAgZGVmIHN0YXRzID0gYmVuY2htYXJrSW50ZXJjZXB0b3Iuc3RhdGlzdGljKCkKKyAgICAgICAgYXNzZXJ0RXF1YWxzIDIsIHN0YXRzLnNpemUoKQorICAgICAgICBhc3NlcnQgc3RhdHMuZmluZHtpdFswXSA9PSAnY3Rvcid9CisgICAgICAgIGFzc2VydCBzdGF0cy5maW5ke2l0WzBdID09ICduZXh0J30KKyAgICAgICAgYXNzZXJ0IHN0YXRzLmV2ZXJ5e2l0WzFdID09IDF9CisgICAgICAgIGFzc2VydCBzdGF0cy5ldmVyeXtpdFsyXSA8IDIwMH0KKyAgICB9CisKKworfQorCisKKwpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9sYW5nL0JpZ0RlY2ltYWxSYW5nZVRlc3QuamF2YSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvbGFuZy9CaWdEZWNpbWFsUmFuZ2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc3MmIzNQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvbGFuZy9CaWdEZWNpbWFsUmFuZ2VUZXN0LmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAkSWQ6IEJpZ0RlY2ltYWxSYW5nZVRlc3QuamF2YSx2IDEuMSAyMDA2LzExLzEzIDEwOjIzOjU4IGVkd2luIEV4cCBlZHdpbiAkCisKKyBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAorIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0CisgICAgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhCisgICAgY29weSBvZiB0aGlzIGRvY3VtZW50LgorCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQorICAgIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKKyAgICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKKyAgICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCisgICAgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCisKKyA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IgorICAgIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQKKyAgICB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgorCisgNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KKyAgICBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMKKyBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKKyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCisgVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICovCitwYWNrYWdlIGdyb292eS5sYW5nOworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CisKKy8qKgorICogVGVzdHMge0BsaW5rIE9iamVjdFJhbmdlfXMgb2Yge0BsaW5rIEJpZ0RlY2ltYWx9cy4KKyAqCisgKiBAYXV0aG9yIEVkd2luIFRlbGxtYW4KKyAqLworcHVibGljIGNsYXNzIEJpZ0RlY2ltYWxSYW5nZVRlc3QgZXh0ZW5kcyBOdW1iZXJSYW5nZVRlc3QgeworCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHByb3RlY3RlZCBSYW5nZSBjcmVhdGVSYW5nZShpbnQgZnJvbSwgaW50IHRvKSB7CisgICAgICAgIHJldHVybiBuZXcgT2JqZWN0UmFuZ2UobmV3IEJpZ0RlY2ltYWwoZnJvbSksIG5ldyBCaWdEZWNpbWFsKHRvKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHByb3RlY3RlZCBDb21wYXJhYmxlIGNyZWF0ZVZhbHVlKGludCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gbmV3IEJpZ0RlY2ltYWwodmFsdWUpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9sYW5nL0NoYXJhY3RlclJhbmdlVGVzdC5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9sYW5nL0NoYXJhY3RlclJhbmdlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3MjJiZjIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2xhbmcvQ2hhcmFjdGVyUmFuZ2VUZXN0LmphdmEKQEAgLTAsMCArMSw2NCBAQAorLyoqCisgKgorICovCitwYWNrYWdlIGdyb292eS5sYW5nOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCisvKioKKyAqIFByb3ZpZGVzIGEgZmV3IHVuaXQgdGVzdHMgZm9yIHtAbGluayBPYmplY3RSYW5nZX1zIG9mIHtAbGluayBDaGFyYWN0ZXJ9cy4gIE1vcmUgdGVzdHMgYXJlIG5lZWRlZC4KKyAqCisgKiBAYXV0aG9yIEVkd2luIFRlbGxtYW4KKyAqLworcHVibGljIGNsYXNzIENoYXJhY3RlclJhbmdlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICAvKioKKyAgICAgKiBUaGUgcmFuZ2UgdG8gdGVzdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE9iamVjdFJhbmdlIHJhbmdlID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIHJhbmdlLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgQ2hhcmFjdGVyIEZST00gPSBuZXcgQ2hhcmFjdGVyKCdhJyk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIHJhbmdlLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgQ2hhcmFjdGVyIFRPID0gbmV3IENoYXJhY3RlcignZCcpOworCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgIHJhbmdlID0gbmV3IE9iamVjdFJhbmdlKEZST00sIFRPKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBpdGVyYXRpbmcgdGhyb3VnaCB0aGUgcmFuZ2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEl0ZXJhdGUoKSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSByYW5nZS5pdGVyYXRvcigpOworICAgICAgICBhc3NlcnRFcXVhbHMoIndyb25nIGZpcnN0IHZhbHVlIiwgRlJPTSwgaXRlci5uZXh0KCkpOworICAgICAgICBmb3IgKGludCBleHBlY3RlZCA9IEZST00uY2hhclZhbHVlKCkgKyAxOyBleHBlY3RlZCA8PSBUTy5jaGFyVmFsdWUoKTsgZXhwZWN0ZWQrKykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3cm9uZyB2YWx1ZSIsIG5ldyBJbnRlZ2VyKGV4cGVjdGVkKSwgaXRlci5uZXh0KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgZ2V0dGluZyB0aGUgJ2Zyb20nIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRGcm9tKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIndyb25nICdmcm9tJyB2YWx1ZSIsIEZST00sIHJhbmdlLmdldEZyb20oKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgZ2V0dGluZyB0aGUgJ3RvJyB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0VG8oKSB7CisgICAgICAgIGFzc2VydEVxdWFscygid3JvbmcgJ3RvJyB2YWx1ZSIsIFRPLCByYW5nZS5nZXRUbygpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvbGFuZy9DbGFzc1JlbG9hZGluZ1Rlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9sYW5nL0NsYXNzUmVsb2FkaW5nVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY4MDZkMwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvbGFuZy9DbGFzc1JlbG9hZGluZ1Rlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsNDUgQEAKK3BhY2thZ2UgZ3Jvb3Z5LmxhbmcKKworY2xhc3MgQ2xhc3NSZWxvYWRpbmdUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgcHVibGljIHZvaWQgdGVzdFJlbG9hZGluZygpIHsKKyAgICAgICAgZGVmIGZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJUZXN0UmVsb2FkIiwgIi5ncm9vdnkiLCBuZXcgRmlsZSgidGFyZ2V0IikpCisgICAgICAgIGZpbGUuZGVsZXRlT25FeGl0KCkKKyAgICAgICAgZGVmIGNsYXNzTmFtZSA9IGZpbGUubmFtZSAtICIuZ3Jvb3Z5IgorCisgICAgICAgIGRlZiBjbCA9IG5ldyBHcm9vdnlDbGFzc0xvYWRlcih0aGlzLmNsYXNzLmNsYXNzTG9hZGVyKTsKKyAgICAgICAgZGVmIGN1cnJlbnREaXIgPSBmaWxlLnBhcmVudEZpbGUuYWJzb2x1dGVQYXRoCisgICAgICAgIGNsLmFkZENsYXNzcGF0aChjdXJyZW50RGlyKQorICAgICAgICBjbC5zaG91bGRSZWNvbXBpbGUgPSB0cnVlCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbGUud3JpdGUgIiIiCisgICAgICAgICAgICAgIGNsYXNzICRjbGFzc05hbWUgeworICAgICAgICAgICAgICAgIGRlZiBncmVldGluZyA9ICJoZWxsbyIKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgIiIiCisgICAgICAgICAgICBkZWYgZ3Jvb3Z5Q2xhc3MgPSBjbC5sb2FkQ2xhc3MoY2xhc3NOYW1lLCB0cnVlLCBmYWxzZSkKKyAgICAgICAgICAgIGRlZiBtZXNzYWdlID0gZ3Jvb3Z5Q2xhc3MubmV3SW5zdGFuY2UoKS5ncmVldGluZworICAgICAgICAgICAgYXNzZXJ0ICJoZWxsbyIgPT0gbWVzc2FnZQorCisgICAgICAgICAgICBzbGVlcCAxNTAwCisKKyAgICAgICAgICAgIC8vIGNoYW5nZSBjbGFzcworICAgICAgICAgICAgZmlsZS53cml0ZSAiIiIKKyAgICAgICAgICAgICAgY2xhc3MgJGNsYXNzTmFtZSB7CisgICAgICAgICAgICAgICAgZGVmIGdyZWV0aW5nID0gImdvb2RieWUiCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgZGVmIHN1Y2Nlc3MgPSBmaWxlLnNldExhc3RNb2RpZmllZChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkKKyAgICAgICAgICAgIGFzc2VydCBzdWNjZXNzCisgICAgICAgICAgICBzbGVlcCA1MDAKKworICAgICAgICAgICAgLy8gcmVsb2FkCisgICAgICAgICAgICBncm9vdnlDbGFzcyA9IGNsLmxvYWRDbGFzcyhjbGFzc05hbWUsIHRydWUsIGZhbHNlKQorICAgICAgICAgICAgbWVzc2FnZSA9IGdyb292eUNsYXNzLm5ld0luc3RhbmNlKCkuZ3JlZXRpbmcKKyAgICAgICAgICAgIGFzc2VydCAiZ29vZGJ5ZSIgPT0gbWVzc2FnZQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZmlsZS5kZWxldGUoKQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvbGFuZy9DbG9zdXJlUmVzb2x2aW5nVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2xhbmcvQ2xvc3VyZVJlc29sdmluZ1Rlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OGFjYjkKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2xhbmcvQ2xvc3VyZVJlc29sdmluZ1Rlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTk4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgZ3Jvb3Z5LmxhbmcKKworLyoqCisgKiBUZXN0cyBob3cgY2xvc3VyZXMgcmVzb2x2ZSB0byBlaXRoZXIgYSBkZWxlZ2F0ZSBvciBhbiBvd25lciBmb3IgYSBnaXZlbiByZXNvbHZlU3RyYXRlZ3kKKyAKKyAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgorICogQHNpbmNlIDEuMQorICAqCisgKiBDcmVhdGVkOiBKdWwgMTIsIDIwMDcKKyAqIFRpbWU6IDU6NDU6MzMgUE0KKyAqIAorICovCisKK2NsYXNzIENsb3N1cmVSZXNvbHZpbmdUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgZGVmIGZvbyA9ICJiYXIiCisgICAgZGVmIGJhciA9ICJmb28iCisKKyAgICB2b2lkIHRlc3RSZXNvbHZlVG9TZWxmKCkgeworICAgICAgICBkZWYgYyA9IHsgZm9vIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzICJiYXIiLCBjLmNhbGwoKQorCisgICAgICAgIGMucmVzb2x2ZVN0cmF0ZWd5ID0gQ2xvc3VyZS5UT19TRUxGCisKKyAgICAgICAgc2hvdWxkRmFpbCB7CisgICAgICAgICAgICBjLmNhbGwoKQorICAgICAgICB9CisKKyAgICAgICAgZGVmIG1ldGFDbGFzcyA9IGMuY2xhc3MubWV0YUNsYXNzCisgICAgICAgIG1ldGFDbGFzcy5nZXRGb28gPSB7LT4gImhlbGxvISIgfQorCisgICAgICAgIGMubWV0YUNsYXNzID0gbWV0YUNsYXNzCisKKyAgICAgICAgYXNzZXJ0RXF1YWxzICJoZWxsbyEiLCBjLmNhbGwoKQorCisgICAgICAgIGMgPSB7IGRvU3R1ZmYoKSB9CisgICAgICAgIGMucmVzb2x2ZVN0cmF0ZWd5ID0gQ2xvc3VyZS5UT19TRUxGCisgICAgICAgIHNob3VsZEZhaWwgeworICAgICAgICAgICAgYy5jYWxsKCkKKyAgICAgICAgfQorICAgICAgICBtZXRhQ2xhc3MgPSBjLmNsYXNzLm1ldGFDbGFzcworICAgICAgICBtZXRhQ2xhc3MuZG9TdHVmZiA9IHstPiAiaGVsbG8iIH0KKyAgICAgICAgYy5tZXRhQ2xhc3MgPSBtZXRhQ2xhc3MKKworICAgICAgICBhc3NlcnRFcXVhbHMgImhlbGxvIiwgYy5jYWxsKCkKKyAgICB9CisKKyAgICBkZWYgZG9TdHVmZigpIHsgInN0dWZmIiB9CisKKyAgICB2b2lkIHRlc3RSZXNvbHZlRGVsZWdhdGVGaXJzdCgpIHsKKworICAgICAgICBkZWYgYyA9IHsgZm9vIH0KKworICAgICAgICBhc3NlcnRFcXVhbHMgImJhciIsIGMuY2FsbCgpCisKKyAgICAgICAgYy5zZXRSZXNvbHZlU3RyYXRlZ3koQ2xvc3VyZS5ERUxFR0FURV9GSVJTVCkKKyAgICAgICAgYy5kZWxlZ2F0ZSA9IFtmb286ImhlbGxvISJdCisKKyAgICAgICAgYXNzZXJ0RXF1YWxzICJoZWxsbyEiLCBjLmNhbGwoKSAgICAgICAgICAgICAgICAgICAgICAgIAorCisKKyAgICAgICAgYyA9IHsgZG9TdHVmZigpIH0KKyAgICAgICAgYy5zZXRSZXNvbHZlU3RyYXRlZ3koQ2xvc3VyZS5ERUxFR0FURV9GSVJTVCkKKyAgICAgICAgCisgICAgICAgIGFzc2VydEVxdWFscyAic3R1ZmYiLCBjLmNhbGwoKQorICAgICAgICBjLmRlbGVnYXRlID0gbmV3IFRlc3RSZXNvbHZlMSgpCisgICAgICAgIGFzc2VydEVxdWFscyAiZm9vIiwgYy5jYWxsKCkKKworICAgIH0KKworICAgIHZvaWQgdGVzdFJlc29sdmVPd25lckZpcnN0KCkgeworICAgICAgICBkZWYgYyA9IHsgZm9vIH0KKworICAgICAgICBhc3NlcnRFcXVhbHMgImJhciIsIGMuY2FsbCgpCisgICAgICAgIAorICAgICAgICBjLmRlbGVnYXRlID0gW2ZvbzoiaGVsbG8hIl0KKworICAgICAgICBhc3NlcnRFcXVhbHMgImJhciIsIGMuY2FsbCgpCisKKyAgICAgICAgYyA9IHsgZG9TdHVmZigpIH0KKyAgICAgICAgYy5kZWxlZ2F0ZSA9IG5ldyBUZXN0UmVzb2x2ZTEoKQorICAgICAgICBhc3NlcnRFcXVhbHMgInN0dWZmIiwgYy5jYWxsKCkKKyAgICB9CisKKyAgICB2b2lkIHRlc3RSZXNvbHZlRGVsZWdhdGVPbmx5KCkgeworICAgICAgICBkZWYgYyA9IHsgZm9vICsgYmFyIH0KKworICAgICAgICBhc3NlcnRFcXVhbHMgImJhcmZvbyIsIGMuY2FsbCgpCisKKyAgICAgICAgYy5yZXNvbHZlU3RyYXRlZ3kgPSBDbG9zdXJlLkRFTEVHQVRFX0ZJUlNUCisKKyAgICAgICAgYy5kZWxlZ2F0ZSA9IG5ldyBUZXN0UmVzb2x2ZTEoKQorCisgICAgICAgIGFzc2VydEVxdWFscyAiaGVsbG9mb28iLCBjLmNhbGwoKQorCisgICAgICAgIGMucmVzb2x2ZVN0cmF0ZWd5ID0gQ2xvc3VyZS5ERUxFR0FURV9PTkxZCisgICAgICAgIHNob3VsZEZhaWwgeworICAgICAgICAgICAgYy5jYWxsKCkKKyAgICAgICAgfQorCisgICAgICAgIGMuZGVsZWdhdGUgPSBuZXcgVGVzdFJlc29sdmUyKCkKKworICAgICAgICBhc3NlcnRFcXVhbHMgImhlbGxvd29ybGQiLCBjLmNhbGwoKQorCisgICAgICAgIGMgPSB7IGRvU3R1ZmYoKSB9CisgICAgICAgIGMucmVzb2x2ZVN0cmF0ZWd5ID0gQ2xvc3VyZS5ERUxFR0FURV9PTkxZCisgICAgICAgIGMuZGVsZWdhdGUgPSBuZXcgVGVzdFJlc29sdmUxKCkKKyAgICAgICAgYXNzZXJ0RXF1YWxzICJmb28iLCBjLmNhbGwoKQorCisgICAgfQorCisgICAgdm9pZCB0ZXN0UmVzb2x2ZU93bmVyT25seSgpIHsKKyAgICAgICAgZGVmIGMgPSB7IGZvbyArIGJhciB9CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzICJiYXJmb28iLCBjLmNhbGwoKQorICAgICAgICBjLnJlc29sdmVTdHJhdGVneSA9IENsb3N1cmUuT1dORVJfT05MWQorCisgICAgICAgIGMuZGVsZWdhdGUgPSBuZXcgVGVzdFJlc29sdmUyKCkKKyAgICAgICAgYXNzZXJ0RXF1YWxzICJiYXJmb28iLCBjLmNhbGwoKQorCisgICAgICAgIGMgPSB7IGRvU3R1ZmYoKSB9CisgICAgICAgIGFzc2VydEVxdWFscyAic3R1ZmYiLCBjLmNhbGwoKQorICAgICAgICBjLnJlc29sdmVTdHJhdGVneSA9IENsb3N1cmUuT1dORVJfT05MWQorICAgICAgICBjLmRlbGVnYXRlID0gbmV3IFRlc3RSZXNvbHZlMSgpCisgICAgICAgIGFzc2VydEVxdWFscyAic3R1ZmYiLCBjLmNhbGwoKQorCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdE93bmVyRGVsZWdhdGVDaGFpbigpIHsKKyAgICAgICAgZGVmIG91dGVyZGVsPSBuZXcgVGVzdFJlc29sdmUzKGRlbDogIm91dGVyIGRlbGVnYXRlIiApCisgICAgICAgIGRlZiBpbm5lcmRlbD0gbmV3IFRlc3RSZXNvbHZlMyhkZWw6ICJpbm5lciBkZWxlZ2F0ZSIpCisgICAgICAgIAorICAgICAgICBkZWYgY291dD0geworICAgICAgICAgICAgYXNzZXJ0IGRlbGVnYXRlID09IG91dGVyZGVsCisgICAgICAgICAgICBhc3NlcnQgZGVsZWdhdGUud2hvaXNUaGlzKCkgPT0gb3V0ZXJkZWwKKyAgICAgICAgICAgIGFzc2VydCBkZWxlZ2F0ZS5kZWwgPT0gIm91dGVyIGRlbGVnYXRlIgorICAgICAgICAgICAgYXNzZXJ0IGRlbGVnYXRlLm1ldCgpID09ICJJJ20gdGhlIG1ldGhvZCBpbnNpZGUgJ291dGVyIGRlbGVnYXRlJyIKKworICAgICAgICAgICAgYXNzZXJ0IHdob2lzVGhpcygpID09IG91dGVyZGVsCisgICAgICAgICAgICBhc3NlcnQgZGVsID09ICJvdXRlciBkZWxlZ2F0ZSIKKyAgICAgICAgICAgIGFzc2VydCBtZXQoKSA9PSAiSSdtIHRoZSBtZXRob2QgaW5zaWRlICdvdXRlciBkZWxlZ2F0ZSciCisKKyAgICAgICAgICAgIGRlZiBjaW49IHsKKyAgICAgICAgICAgICAgICBhc3NlcnQgZGVsZWdhdGUgPT0gaW5uZXJkZWwKKyAgICAgICAgICAgICAgICBhc3NlcnQgZGVsZWdhdGUud2hvaXNUaGlzKCkgPT0gaW5uZXJkZWwKKyAgICAgICAgICAgICAgICBhc3NlcnQgZGVsZWdhdGUuZGVsID09ICJpbm5lciBkZWxlZ2F0ZSIKKyAgICAgICAgICAgICAgICBhc3NlcnQgZGVsZWdhdGUubWV0KCkgPT0gIkknbSB0aGUgbWV0aG9kIGluc2lkZSAnaW5uZXIgZGVsZWdhdGUnIgorCisgICAgICAgICAgICAgICAgYXNzZXJ0IHdob2lzVGhpcygpID09IG91dGVyZGVsCisgICAgICAgICAgICAgICAgYXNzZXJ0IGRlbCA9PSAib3V0ZXIgZGVsZWdhdGUiCisgICAgICAgICAgICAgICAgYXNzZXJ0IG1ldCgpID09ICJJJ20gdGhlIG1ldGhvZCBpbnNpZGUgJ291dGVyIGRlbGVnYXRlJyIKKyAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjaW4uZGVsZWdhdGU9IGlubmVyZGVsCisgICAgICAgICAgICBjaW4oKQorICAgICAgICB9CisKKyAgICAgICAgY291dC5kZWxlZ2F0ZT0gb3V0ZXJkZWwKKyAgICAgICAgY291dCgpIAorICAgIH0KKyAgICAKK30KKworY2xhc3MgVGVzdFJlc29sdmUxIHsKKyAgICBkZWYgZm9vID0gImhlbGxvIgorCisgICAgZGVmIGRvU3R1ZmYoKSB7ICJmb28iIH0KK30KK2NsYXNzIFRlc3RSZXNvbHZlMiB7CisgICAgZGVmIGZvbyA9ICJoZWxsbyIKKyAgICBkZWYgYmFyID0gIndvcmxkIgorCisgICAgZGVmIGRvU3R1ZmYoKSB7ICJiYXIiIH0KK30KKworIGNsYXNzIFRlc3RSZXNvbHZlMyB7CisgICAgZGVmIGRlbDsKKyAgICBTdHJpbmcgdG9TdHJpbmcoKXtkZWx9CisgICAgZGVmIHdob2lzVGhpcygpIHsgcmV0dXJuIHRoaXMgfQorICAgIGRlZiBtZXQoKSB7IHJldHVybiAiSSdtIHRoZSBtZXRob2QgaW5zaWRlICciK2RlbCsiJyIgfQorIH0KKwpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9sYW5nL0RlbGVnYXRpbmdNZXRhQ2xhc3NUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvbGFuZy9EZWxlZ2F0aW5nTWV0YUNsYXNzVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEzMjc2NAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvbGFuZy9EZWxlZ2F0aW5nTWV0YUNsYXNzVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwxOSBAQAorcGFja2FnZSBncm9vdnkubGFuZworCisKKy8qKgorICogVGVzdHMgZm9yIHRoZSBEZWxlZ2F0aW5nTWV0YUNsYXNzCisgKgorICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCisgKiovCisKK2NsYXNzIERlbGVnYXRpbmdNZXRhQ2xhc3NUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCB0ZXN0SXNHcm9vdnlPYmplY3QoKSB7CisgICAgICAgIGRlZiBtZXRhQ2xhc3MgPSBuZXcgRGVsZWdhdGluZ01ldGFDbGFzcyhnZXRDbGFzcygpKQorCisgICAgICAgIGFzc2VydCBtZXRhQ2xhc3MuaXNHcm9vdnlPYmplY3QoKQorICAgICAgICBhc3NlcnRFcXVhbHMgRGVsZWdhdGluZ01ldGFDbGFzc1Rlc3QsIG1ldGFDbGFzcy5nZXRUaGVDbGFzcygpCisgICAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9sYW5nL0Rlcml2ZWRTY3JpcHQuamF2YSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvbGFuZy9EZXJpdmVkU2NyaXB0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVlYzQ1NgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvbGFuZy9EZXJpdmVkU2NyaXB0LmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqICRJZCR2ZXJzaW9uCisgKiBOb3YgMjMsIDIwMDMgOTowMjo1NSBQTSAkdXNlciBFeHAgJAorICogCisgKiBDb3B5cmlnaHQgMjAwMyAoQykgU2FtIFB1bGxhcmEuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbgorICogY29weXJpZ2h0IHN0YXRlbWVudHMgYW5kIG5vdGljZXMuIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhIGNvcHkKKyAqIG9mIHRoaXMgZG9jdW1lbnQuIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAzLgorICogVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gRm9yCisgKiB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLiA0LiBQcm9kdWN0cyBkZXJpdmVkCisgKiBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4KKyAqIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYQorICogcmVnaXN0ZXJlZCB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLiA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUKKyAqIENvZGVoYXVzIC0gaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorICogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorICogREFNQUdFLgorICogIAorICovCitwYWNrYWdlIGdyb292eS5sYW5nOworCisvKioKKyAqIEEgZGVyaXZlZCBTY3JpcHQgd2hpY2ggYWRkcyBzb21lICdnbG9iYWwnIG1ldGhvZHMgYXZhaWxhYmxlIHRvIHRoZSBzY3JpcHQKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIERlcml2ZWRTY3JpcHQgZXh0ZW5kcyBTY3JpcHQgeworCisgICAgcHVibGljIFN0cmluZyBnZXRDaGVlc2UoKSB7CisgICAgICAgIHJldHVybiAiQ2hlZGRhciI7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBkb1NvbWV0aGluZyhTdHJpbmcgZm9vZCkgeworICAgICAgICByZXR1cm4gIkkgbGlrZSAiICsgZm9vZDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvbGFuZy9EdW1teUdTdHJpbmcuamF2YSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvbGFuZy9EdW1teUdTdHJpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmIyNDlkCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9sYW5nL0R1bW15R1N0cmluZy5qYXZhCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgJElkJAorCisgQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQKKyB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIGNvcHlyaWdodAorICAgIHN0YXRlbWVudHMgYW5kIG5vdGljZXMuICBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYQorICAgIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KKworIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUKKyAgICBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCisgICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCisgICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworIDMuIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCisgICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLAorICAgIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLgorCisgNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIKKyAgICBub3IgbWF5ICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYSByZWdpc3RlcmVkCisgICAgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KKworIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtCisgICAgaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTCisgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECisgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTAorIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAqLworCitwYWNrYWdlIGdyb292eS5sYW5nOworCisvKioKKyAqIEEgaGFuZCBjcmFmdGVkIGV4YW1wbGUgR1N0cmluZworICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBEdW1teUdTdHJpbmcgZXh0ZW5kcyBHU3RyaW5nIHsKKworICAgIHByaXZhdGUgU3RyaW5nW10gc3RyaW5nczsKKyAgICBwcml2YXRlIE1ldGFDbGFzcyBtZXRhQ2xhc3M7CisKKyAgICBwdWJsaWMgRHVtbXlHU3RyaW5nKE9iamVjdFtdIHZhbHVlcykgeworICAgICAgICB0aGlzKHZhbHVlcywgbmV3IFN0cmluZ1tdeyJIZWxsbyAiLCAiISJ9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgRHVtbXlHU3RyaW5nKE9iamVjdFtdIHZhbHVlcywgU3RyaW5nW10gc3RyaW5ncykgeworICAgICAgICBzdXBlcih2YWx1ZXMpOworICAgICAgICB0aGlzLnN0cmluZ3MgPSBzdHJpbmdzOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRTdHJpbmdzKCkgeworICAgICAgICByZXR1cm4gc3RyaW5nczsKKyAgICB9CisKKyAgICBwdWJsaWMgTWV0YUNsYXNzIGdldE1ldGFDbGFzcygpIHsKKyAgICAgICAgcmV0dXJuIG1ldGFDbGFzczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNZXRhQ2xhc3MoTWV0YUNsYXNzIG1ldGFDbGFzcykgeworICAgICAgICB0aGlzLm1ldGFDbGFzcyA9IG1ldGFDbGFzczsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGludm9rZU1ldGhvZChTdHJpbmcgbmFtZSwgT2JqZWN0IGFyZ3VtZW50cykgeworICAgICAgICByZXR1cm4gbWV0YUNsYXNzLmludm9rZU1ldGhvZCh0aGlzLCBuYW1lLCBhcmd1bWVudHMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvbGFuZy9FbXB0eVJhbmdlVGVzdC5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9sYW5nL0VtcHR5UmFuZ2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVlMDEwYgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvbGFuZy9FbXB0eVJhbmdlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzkwIEBACisvKioKKyAqCisgKi8KK3BhY2thZ2UgZ3Jvb3Z5Lmxhbmc7CisKK2ltcG9ydCBncm9vdnkudXRpbC5Hcm9vdnlUZXN0Q2FzZTsKKworaW1wb3J0IGphdmEudXRpbC4qOworCisvKioKKyAqIFByb3ZpZGVzIHVuaXQgdGVzdHMgZm9yIHRoZSB7QGxpbmsgRW1wdHlSYW5nZX0gY2xhc3MuCisgKgorICogQGF1dGhvciBFZHdpbiBUZWxsbWFuCisgKi8KK3B1YmxpYyBjbGFzcyBFbXB0eVJhbmdlVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIC8qKgorICAgICAqIFRoZSAnZnJvbScgdmFsdWUgZm9yIHRoZSB7QGxpbmsgUmFuZ2V9LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEludGVnZXIgQVQgPSBuZXcgSW50ZWdlcigxNyk7CisKKyAgICAvKioKKyAgICAgKiBUaGUge0BsaW5rIFJhbmdlfSB0byB0ZXN0LgorICAgICAqLworICAgIHByaXZhdGUgUmFuZ2UgcmFuZ2UgPSBudWxsOworCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisKKyAgICAgICAgcmFuZ2UgPSBuZXcgRW1wdHlSYW5nZShBVCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBtZXRob2QgZm9yIHtAbGluayBncm9vdnkubGFuZy5FbXB0eVJhbmdlI2dldEZyb20oKX0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldEZyb20oKSB7CisgICAgICAgIGFzc2VydEVxdWFscygid3JvbmcgJ2Zyb20nIHZhbHVlIiwgQVQsIHJhbmdlLmdldEZyb20oKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBtZXRob2QgZm9yIHtAbGluayBncm9vdnkubGFuZy5FbXB0eVJhbmdlI2dldFRvKCl9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRUbygpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3cm9uZyAnZnJvbScgdmFsdWUiLCBBVCwgcmFuZ2UuZ2V0VG8oKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBtZXRob2QgZm9yIHtAbGluayBncm9vdnkubGFuZy5FbXB0eVJhbmdlI2lzUmV2ZXJzZSgpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNSZXZlcnNlKCkgeworICAgICAgICBhc3NlcnRGYWxzZSgiZW1wdHkgcmFuZ2UgcmV2ZXJzZWQiLCByYW5nZS5pc1JldmVyc2UoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBtZXRob2QgZm9yIHtAbGluayBncm9vdnkubGFuZy5FbXB0eVJhbmdlI2luc3BlY3QoKX0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEluc3BlY3QoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygid3JvbmcgJ2luc3BlY3QnIHZhbHVlIiwgQVQgKyAiLi48IiArIEFULCByYW5nZS5pbnNwZWN0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgbWV0aG9kIGZvciB7QGxpbmsgZ3Jvb3Z5LmxhbmcuRW1wdHlSYW5nZSNpbnNwZWN0KCkoKX0gd2l0aCBhIHJhbmdlIHdpdGggYSA8Y29kZT5udWxsPC9jb2RlPiAnYXQnIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnNwZWN0TnVsbEF0KCkgeworICAgICAgICBmaW5hbCBSYW5nZSBudWxsQXRSYW5nZSA9IG5ldyBFbXB0eVJhbmdlKG51bGwpOworICAgICAgICBhc3NlcnRFcXVhbHMoIndyb25nIGluc3BlY3QgdmFsdWUiLCAibnVsbC4uPG51bGwiLCBudWxsQXRSYW5nZS5pbnNwZWN0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgbWV0aG9kIGZvciB7QGxpbmsgZ3Jvb3Z5LmxhbmcuRW1wdHlSYW5nZSN0b1N0cmluZygpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygid3Jvbmcgc3RyaW5nIHZhbHVlIiwgQVQgKyAiLi48IiArIEFULCByYW5nZS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IG1ldGhvZCBmb3Ige0BsaW5rIGdyb292eS5sYW5nLkVtcHR5UmFuZ2UjdG9TdHJpbmcoKX0gd2l0aCBhIHJhbmdlIHdpdGggYSA8Y29kZT5udWxsPC9jb2RlPiAnYXQnIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZ051bGxBdCgpIHsKKyAgICAgICAgZmluYWwgUmFuZ2UgbnVsbEF0UmFuZ2UgPSBuZXcgRW1wdHlSYW5nZShudWxsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzdHJpbmcgdmFsdWUiLCAibnVsbC4uPG51bGwiLCBudWxsQXRSYW5nZS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IG1ldGhvZCBmb3Ige0BsaW5rIGdyb292eS5sYW5nLkVtcHR5UmFuZ2Ujc2l6ZSgpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgMCwgcmFuZ2Uuc2l6ZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IG1ldGhvZCBmb3Ige0BsaW5rIGdyb292eS5sYW5nLkVtcHR5UmFuZ2UjY2xlYXIoKX0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENsZWFyKCkgeworICAgICAgICByYW5nZS5jbGVhcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgbWV0aG9kIGZvciB7QGxpbmsgZ3Jvb3Z5LmxhbmcuRW1wdHlSYW5nZSNpc0VtcHR5KCl9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RJc0VtcHR5KCkgeworICAgICAgICBhc3NlcnRUcnVlKCJyYW5nZSBub3QgZW1wdHkiLCByYW5nZS5pc0VtcHR5KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgbWV0aG9kIGZvciB7QGxpbmsgZ3Jvb3Z5LmxhbmcuRW1wdHlSYW5nZSN0b0FycmF5KCl9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RUb0FycmF5KCkgeworICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhuZXcgT2JqZWN0WzBdLCByYW5nZS50b0FycmF5KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgbWV0aG9kIGZvciB7QGxpbmsgZ3Jvb3Z5LmxhbmcuRW1wdHlSYW5nZSNnZXQoaW50KX0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJhbmdlLmdldCgwKTsKKyAgICAgICAgICAgIGZhaWwoImdvdCB2YWx1ZSBmcm9tIGVtcHR5IHJhbmdlIik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiZXhwZWN0ZWQgZXhjZXB0aW9uIHRocm93biIsIHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBtZXRob2QgZm9yIHtAbGluayBncm9vdnkubGFuZy5FbXB0eVJhbmdlI3JlbW92ZShpbnQpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSW50KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmFuZ2UucmVtb3ZlKDApOworICAgICAgICAgICAgZmFpbCgicmVtb3ZlZCB2YWx1ZSBmcm9tIGVtcHR5IHJhbmdlIik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoImV4cGVjdGVkIGV4Y2VwdGlvbiB0aHJvd24iLCB0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgbWV0aG9kIGZvciB7QGxpbmsgZ3Jvb3Z5LmxhbmcuRW1wdHlSYW5nZSNhZGQoaW50LGphdmEubGFuZy5PYmplY3QpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkSW50T2JqZWN0KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmFuZ2UuYWRkKDAsIG5ldyBJbnRlZ2VyKDEyKSk7CisgICAgICAgICAgICBmYWlsKCJhZGRlZCB2YWx1ZSB0byBlbXB0eSByYW5nZSIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJleHBlY3RlZCBleGNlcHRpb24gdGhyb3duIiwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IG1ldGhvZCBmb3Ige0BsaW5rIGdyb292eS5sYW5nLkVtcHR5UmFuZ2UjaW5kZXhPZihqYXZhLmxhbmcuT2JqZWN0KX0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEluZGV4T2YoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiZm91bmQgdmFsdWUgaW4gZW1wdHkgcmFuZ2UiLCAtMSwgcmFuZ2UuaW5kZXhPZihBVCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZvdW5kIG51bGwgaW4gZW1wdHkgcmFuZ2UiLCAtMSwgcmFuZ2UuaW5kZXhPZihudWxsKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZm91bmQgc3RyaW5nIGluIGVtcHR5IHJhbmdlIiwgLTEsIHJhbmdlLmluZGV4T2YoImhlbGxvIikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgbWV0aG9kIGZvciB7QGxpbmsgZ3Jvb3Z5LmxhbmcuRW1wdHlSYW5nZSNsYXN0SW5kZXhPZihqYXZhLmxhbmcuT2JqZWN0KX0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdExhc3RJbmRleE9mKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoImZvdW5kIHZhbHVlIGluIGVtcHR5IHJhbmdlIiwgLTEsIHJhbmdlLmxhc3RJbmRleE9mKEFUKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZm91bmQgbnVsbCBpbiBlbXB0eSByYW5nZSIsIC0xLCByYW5nZS5sYXN0SW5kZXhPZihudWxsKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZm91bmQgc3RyaW5nIGluIGVtcHR5IHJhbmdlIiwgLTEsIHJhbmdlLmxhc3RJbmRleE9mKCJoZWxsbyIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IG1ldGhvZCBmb3Ige0BsaW5rIGdyb292eS5sYW5nLkVtcHR5UmFuZ2UjYWRkKGphdmEubGFuZy5PYmplY3QpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkT2JqZWN0KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmFuZ2UuYWRkKG5ldyBJbnRlZ2VyKDEyKSk7CisgICAgICAgICAgICBmYWlsKCJhZGRlZCB2YWx1ZSB0byBlbXB0eSByYW5nZSIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJleHBlY3RlZCBleGNlcHRpb24gdGhyb3duIiwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IG1ldGhvZCBmb3Ige0BsaW5rIGdyb292eS5sYW5nLkVtcHR5UmFuZ2UjY29udGFpbnMoamF2YS5sYW5nLk9iamVjdCl9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb250YWlucygpIHsKKyAgICAgICAgYXNzZXJ0RmFsc2UoImVtcHR5IHJhbmdlIGNvbnRhaW5zIGEgdmFsdWUiLCByYW5nZS5jb250YWlucyhBVCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgbWV0aG9kIGZvciB7QGxpbmsgZ3Jvb3Z5LmxhbmcuRW1wdHlSYW5nZSNyZW1vdmUoamF2YS5sYW5nLk9iamVjdCl9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVPYmplY3QoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByYW5nZS5yZW1vdmUoQVQpOworICAgICAgICAgICAgZmFpbCgicmVtb3ZlZCB2YWx1ZSBmcm9tIGVtcHR5IHJhbmdlIik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoImV4cGVjdGVkIGV4Y2VwdGlvbiB0aHJvd24iLCB0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgbWV0aG9kIGZvciB7QGxpbmsgZ3Jvb3Z5LmxhbmcuRW1wdHlSYW5nZSNhZGRBbGwoaW50LGphdmEudXRpbC5Db2xsZWN0aW9uKX0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEFkZEFsbEludENvbGxlY3Rpb24oKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByYW5nZS5hZGRBbGwoMCwgbmV3IEFycmF5TGlzdCgpKTsKKyAgICAgICAgICAgIGZhaWwoImFkZGVkIHZhbHVlcyB0byBlbXB0eSByYW5nZSIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJleHBlY3RlZCBleGNlcHRpb24gdGhyb3duIiwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IG1ldGhvZCBmb3Ige0BsaW5rIGdyb292eS5sYW5nLkVtcHR5UmFuZ2UjYWRkQWxsKGphdmEudXRpbC5Db2xsZWN0aW9uKX0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb24oKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByYW5nZS5hZGRBbGwobmV3IEFycmF5TGlzdCgpKTsKKyAgICAgICAgICAgIGZhaWwoImFkZGVkIHZhbHVlcyB0byBlbXB0eSByYW5nZSIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJleHBlY3RlZCBleGNlcHRpb24gdGhyb3duIiwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IG1ldGhvZCBmb3Ige0BsaW5rIGdyb292eS5sYW5nLkVtcHR5UmFuZ2UjY29udGFpbnNBbGwoamF2YS51dGlsLkNvbGxlY3Rpb24pfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGwoKSB7CisgICAgICAgIGZpbmFsIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgicmFuZ2UgY29udGFpbnMgYWxsIGVsZW1lbnRzIG9mIGFuIGVtcHR5IGxpc3QiLCByYW5nZS5jb250YWluc0FsbChsaXN0KSk7CisKKyAgICAgICAgbGlzdC5hZGQoQVQpOworICAgICAgICBhc3NlcnRGYWxzZSgicmFuZ2UgY29udGFpbnMgYWxsIGVsZW1lbnRzIG9mIHNpbmdsZSBlbGVtZW50IGxpc3QiLCByYW5nZS5jb250YWluc0FsbChsaXN0KSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBtZXRob2QgZm9yIHtAbGluayBncm9vdnkubGFuZy5FbXB0eVJhbmdlI3JlbW92ZUFsbChqYXZhLnV0aWwuQ29sbGVjdGlvbil9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGwoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByYW5nZS5yZW1vdmVBbGwobmV3IEFycmF5TGlzdCgpKTsKKyAgICAgICAgICAgIGZhaWwoInJlbW92ZWQgdmFsdWVzIGZyb20gYW4gZW1wdHkgcmFuZ2UiKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiZXhwZWN0ZWQgZXhjZXB0aW9uIHRocm93biIsIHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBtZXRob2QgZm9yIHtAbGluayBncm9vdnkubGFuZy5FbXB0eVJhbmdlI3JldGFpbkFsbChqYXZhLnV0aWwuQ29sbGVjdGlvbil9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGwoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByYW5nZS5yZXRhaW5BbGwobmV3IEFycmF5TGlzdCgpKTsKKyAgICAgICAgICAgIGZhaWwoInJldGFpbmVkIHZhbHVlcyBpbiBhbiBlbXB0eSByYW5nZSIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJleHBlY3RlZCBleGNlcHRpb24gdGhyb3duIiwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IG1ldGhvZCBmb3Ige0BsaW5rIGdyb292eS5sYW5nLkVtcHR5UmFuZ2UjaXRlcmF0b3IoKX0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgeworICAgICAgICBmaW5hbCBJdGVyYXRvciBpdGVyYXRvciA9IHJhbmdlLml0ZXJhdG9yKCk7CisgICAgICAgIGFzc2VydEZhbHNlKCJpdGVyYXRvciBoYXMgbmV4dCB2YWx1ZSIsIGl0ZXJhdG9yLmhhc05leHQoKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgIGZhaWwoImdvdCBuZXh0IHZhbHVlIGluIGFuIGVtcHR5IHJhbmdlIik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiZXhwZWN0ZWQgZXhjZXB0aW9uIHRocm93biIsIHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgcmVtb3ZpbmcgdmlhIGFuIGl0ZXJhdG9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvclJlbW92ZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIEl0ZXJhdG9yIGl0ZXJhdG9yID0gcmFuZ2UuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIGl0ZXJhdG9yLnJlbW92ZSgpOworICAgICAgICAgICAgZmFpbCgicmVtb3ZlZCB2aWEgaXRlcmF0b3IiKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoImV4cGVjdGVkIGV4Y2VwdGlvbiB0aHJvd24iLCB0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgbWV0aG9kIGZvciB7QGxpbmsgZ3Jvb3Z5LmxhbmcuRW1wdHlSYW5nZSNzdWJMaXN0KGludCxpbnQpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3ViTGlzdCgpIHsKKyAgICAgICAgZmluYWwgTGlzdCBsaXN0ID0gcmFuZ2Uuc3ViTGlzdCgwLCAwKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgibGlzdCBub3QgZW1wdHkiLCBsaXN0LmlzRW1wdHkoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByYW5nZS5zdWJMaXN0KDAsIDEpOworICAgICAgICAgICAgZmFpbCgiZ290IHN1YiBsaXN0IGluIGFuIGVtcHR5IHJhbmdlIik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiZXhwZWN0ZWQgZXhjZXB0aW9uIHRocm93biIsIHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBtZXRob2QgZm9yIHtAbGluayBncm9vdnkubGFuZy5FbXB0eVJhbmdlI2xpc3RJdGVyYXRvcigpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGlzdEl0ZXJhdG9yKCkgeworICAgICAgICBmaW5hbCBMaXN0SXRlcmF0b3IgaXRlcmF0b3IgPSByYW5nZS5saXN0SXRlcmF0b3IoKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIml0ZXJhdG9yIGhhcyBuZXh0IHZhbHVlIiwgaXRlcmF0b3IuaGFzTmV4dCgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIml0ZXJhdG9yIGhhcyBwcmV2aW91cyB2YWx1ZSIsIGl0ZXJhdG9yLmhhc1ByZXZpb3VzKCkpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICBmYWlsKCJnb3QgbmV4dCB2YWx1ZSBpbiBhbiBlbXB0eSByYW5nZSIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoImV4cGVjdGVkIGV4Y2VwdGlvbiB0aHJvd24iLCB0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgbWV0aG9kIGZvciB7QGxpbmsgZ3Jvb3Z5LmxhbmcuRW1wdHlSYW5nZSNsaXN0SXRlcmF0b3IoaW50KX0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdExpc3RJdGVyYXRvckludCgpIHsKKyAgICAgICAgZmluYWwgTGlzdEl0ZXJhdG9yIGl0ZXJhdG9yID0gcmFuZ2UubGlzdEl0ZXJhdG9yKDApOworICAgICAgICBhc3NlcnRGYWxzZSgiaXRlcmF0b3IgaGFzIG5leHQgdmFsdWUiLCBpdGVyYXRvci5oYXNOZXh0KCkpOworICAgICAgICBhc3NlcnRGYWxzZSgiaXRlcmF0b3IgaGFzIHByZXZpb3VzIHZhbHVlIiwgaXRlcmF0b3IuaGFzUHJldmlvdXMoKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJhbmdlLmxpc3RJdGVyYXRvcigxKTsKKyAgICAgICAgICAgIGZhaWwoImdvdCBsaXN0IGl0ZXJhdG9yIGF0IGluZGV4IDEiKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJleHBlY3RlZCBleGNlcHRpb24gdGhyb3duIiwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IG1ldGhvZCBmb3Ige0BsaW5rIGdyb292eS5sYW5nLkVtcHR5UmFuZ2Ujc2V0KGludCxqYXZhLmxhbmcuT2JqZWN0KX0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFNldCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJhbmdlLnNldCgwLCBBVCk7CisgICAgICAgICAgICBmYWlsKCJnb3Qgc2V0IHZhbHVlIDAiKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiZXhwZWN0ZWQgZXhjZXB0aW9uIHRocm93biIsIHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBtZXRob2QgZm9yIHtAbGluayBncm9vdnkubGFuZy5FbXB0eVJhbmdlI3RvQXJyYXkoamF2YS5sYW5nLk9iamVjdFtdKX0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFRvQXJyYXlPYmplY3RBcnJheSgpIHsKKyAgICAgICAgZmluYWwgSW50ZWdlcltdIGFjdHVhbCA9IChJbnRlZ2VyW10pIHJhbmdlLnRvQXJyYXkobmV3IEludGVnZXJbMF0pOworICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhuZXcgSW50ZWdlclswXSwgYWN0dWFsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IG1ldGhvZCBmb3Ige0BsaW5rIGdyb292eS5sYW5nLkVtcHR5UmFuZ2Ujc3RlcChpbnQsZ3Jvb3Z5LmxhbmcuQ2xvc3VyZSl9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTdGVwSW50Q2xvc3VyZSgpIHsKKyAgICAgICAgZmluYWwgTGlzdCBjYWxsTG9nID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBmaW5hbCBDbG9zdXJlIGNsb3N1cmUgPSBuZXcgTnVtYmVyUmFuZ2VUZXN0LlJlY29yZGluZ0Nsb3N1cmUoY2FsbExvZyk7CisgICAgICAgIHJhbmdlLnN0ZXAoMSwgY2xvc3VyZSk7CisgICAgICAgIGFzc2VydEVxdWFscygid3JvbmcgbnVtYmVyIG9mIGNhbGxzIHRvIGNsb3N1cmUiLCAwLCBjYWxsTG9nLnNpemUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBtZXRob2QgZm9yIHtAbGluayBncm9vdnkubGFuZy5FbXB0eVJhbmdlI3N0ZXAoaW50KX0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFN0ZXBJbnQoKSB7CisgICAgICAgIExpc3QgcmVzdWx0ID0gcmFuZ2Uuc3RlcCgxKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgidG9vIG1hbnkgZWxlbWVudHMiLCByZXN1bHQuaXNFbXB0eSgpKTsKKworICAgICAgICAvLyBtYWtlIHN1cmUgYSBuZXcgbGlzdCBpcyByZXR1cm5lZCBlYWNoIHRpbWUKKyAgICAgICAgcmVzdWx0LmFkZChuZXcgSW50ZWdlcigxKSk7CisgICAgICAgIHJlc3VsdCA9IHJhbmdlLnN0ZXAoMSk7CisgICAgICAgIGFzc2VydFRydWUoInRvbyBtYW55IGVsZW1lbnRzIiwgcmVzdWx0LmlzRW1wdHkoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9sYW5nL0V4cGFuZG9NZXRhQ2xhc3NDcmVhdGlvbkhhbmRsZVRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9sYW5nL0V4cGFuZG9NZXRhQ2xhc3NDcmVhdGlvbkhhbmRsZVRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMmI4MzMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2xhbmcvRXhwYW5kb01ldGFDbGFzc0NyZWF0aW9uSGFuZGxlVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwyNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA1IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgZ3Jvb3Z5Lmxhbmc7CisKKy8qKgorICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCisgKi8KKworY2xhc3MgRXhwYW5kb01ldGFDbGFzc0NyZWF0aW9uSGFuZGxlVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworCWRlZiByZWdpc3RyeSA9IEdyb292eVN5c3RlbS5tZXRhQ2xhc3NSZWdpc3RyeQorCisJdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgRXhwYW5kb01ldGFDbGFzcy5lbmFibGVHbG9iYWxseSgpCisJfQorCisJdm9pZCB0ZWFyRG93bigpIHsKKyAgICAgICAgRXhwYW5kb01ldGFDbGFzcy5kaXNhYmxlR2xvYmFsbHkoKQorCX0KKworCisgICAgdm9pZCB0ZXN0SW5oZXJpdFdpdGhFeGlzdGluZ01ldGFDbGFzcygpIHsKKyAgICAgICAgcmVnaXN0cnkucmVtb3ZlTWV0YUNsYXNzKFN0cmluZy5jbGFzcykKKyAgICAgICAgcmVnaXN0cnkucmVtb3ZlTWV0YUNsYXNzKE9iamVjdC5jbGFzcykKKworICAgICAgICBTdHJpbmcgZm9vID0gImhlbGxvIgorICAgICAgICBhc3NlcnRFcXVhbHMgIkhFTExPIiwgZm9vLnRvVXBwZXJDYXNlKCkKKworICAgICAgICBPYmplY3QubWV0YUNsYXNzLmRvU3R1ZmYgPSB7LT4gZGVsZWdhdGUudG9TdHJpbmcoKS50b1VwcGVyQ2FzZSgpIH0KKworICAgICAgICBhc3NlcnRFcXVhbHMgIkhFTExPIiwgZm9vLmRvU3R1ZmYoKQorICAgIH0KKworICAgIHZvaWQgdGVzdEluaGVyaXRGcm9tSW50ZXJmYWNlSGVpcmFyY2h5KCkgeworICAgICAgICByZWdpc3RyeS5yZW1vdmVNZXRhQ2xhc3MoSUJhci5jbGFzcykKKyAgICAgICAgcmVnaXN0cnkucmVtb3ZlTWV0YUNsYXNzKEZvby5jbGFzcykKKyAgICAgICAgcmVnaXN0cnkucmVtb3ZlTWV0YUNsYXNzKFRlc3QxLmNsYXNzKQorCisgICAgICAgIGRlZiBtZXRhQ2xhc3MgPSByZWdpc3RyeS5nZXRNZXRhQ2xhc3MoSUJhci5jbGFzcykKKyAgICAgICAgYXNzZXJ0VHJ1ZShtZXRhQ2xhc3MgaW5zdGFuY2VvZiBFeHBhbmRvTWV0YUNsYXNzKQorCisgICAgICAgIG1ldGFDbGFzcy5oZWxsb1dvcmxkID0gey0+ICJnb29kYnllISIgfQorCisgICAgICAgIGRlZiB0ID0gbmV3IFRlc3QxKCkKKyAgICAgICAgYXNzZXJ0RXF1YWxzICJnb29kYnllISIsIHQuaGVsbG9Xb3JsZCgpICAgICAgICAKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0RXhwYW5kb0ludGVyZmFjZUluaGVyaXRhbmNlV2l0aE92ZXJyaWRlREdNKCkgeworCSAgICByZWdpc3RyeS5yZW1vdmVNZXRhQ2xhc3MoRm9vLmNsYXNzKQorCSAgICByZWdpc3RyeS5yZW1vdmVNZXRhQ2xhc3MoVGVzdDEuY2xhc3MpCisKKwkgICAgZGVmIG1ldGFDbGFzcyA9IHJlZ2lzdHJ5LmdldE1ldGFDbGFzcyhGb28uY2xhc3MpCisJICAgIGFzc2VydFRydWUobWV0YUNsYXNzIGluc3RhbmNlb2YgRXhwYW5kb01ldGFDbGFzcykKKworICAgICAgICBkZWYgbWFwID0gWzpdCisJICAgIG1ldGFDbGFzcy5nZXRBdCA9IHsgSW50ZWdlciBpIC0+IG1hcFtpXSB9CisJICAgIG1ldGFDbGFzcy5wdXRBdCA9IHsgSW50ZWdlciBpLCB2YWwgLT4gbWFwW2ldID0gdmFsIH0KKworCSAgICBkZWYgdCA9IG5ldyBUZXN0MSgpCisJICAgIC8vYXNzZXJ0RXF1YWxzIDIsIHQubWV0YUNsYXNzLmdldEV4cGFuZG9NZXRob2RzKCkuc2l6ZSgpCisJICAgIC8vYXNzZXJ0IHQubWV0YUNsYXNzLmdldEV4cGFuZG9NZXRob2RzKCkuZmluZCB7IGl0Lm5hbWUgPT0gJ3B1dEF0JyB9CisKKyAgICAgICAgdFswXSA9ICJmb28iCisKKyAgICAgICAgYXNzZXJ0IG1hcC5zaXplKCkgPT0gMQorCisJICAgIGFzc2VydEVxdWFscyAiZm9vIiwgdFswXQorICAgIH0KKworICAgIHZvaWQgdGVzdE92ZXJyaWRlU2V0UHJvcGVydHlWaWFJbnRlcmZhY2UoKSB7CisJICAgIHJlZ2lzdHJ5LnJlbW92ZU1ldGFDbGFzcyhGb28uY2xhc3MpCisJICAgIHJlZ2lzdHJ5LnJlbW92ZU1ldGFDbGFzcyhUZXN0MS5jbGFzcykKKworCSAgICBkZWYgbWV0YUNsYXNzID0gcmVnaXN0cnkuZ2V0TWV0YUNsYXNzKEZvby5jbGFzcykKKworICAgICAgICBkZWYgdGVzdFZhbHVlID0gbnVsbAorCSAgICBtZXRhQ2xhc3Muc2V0UHJvcGVydHkgPSB7IFN0cmluZyBuYW1lLCB2YWx1ZSAtPgorICAgICAgICAgICAgZGVmIG1wID0gZGVsZWdhdGUubWV0YUNsYXNzLmdldE1ldGFQcm9wZXJ0eShuYW1lKQorCisgICAgICAgICAgICBpZihtcCkgeyBtcC5zZXRQcm9wZXJ0eShkZWxlZ2F0ZSwgdmFsdWUpIH0gZWxzZSB7IHRlc3RWYWx1ZSA9IHZhbHVlIH0KKyAgICAgICAgfQorCisKKwkJZGVmIHQgPSBuZXcgVGVzdDEoKQorCisgICAgICAgIHQubmFtZSA9ICJCb2IiCisgICAgICAgIGFzc2VydEVxdWFscyAiQm9iIiwgdC5uYW1lCisKKyAgICAgICAgdC5mb28gPSAiYmFyIgorICAgICAgICBhc3NlcnRFcXVhbHMgImJhciIsdGVzdFZhbHVlCisKKyAgICB9CisgICAgdm9pZCB0ZXN0T3ZlcnJpZGVHZXRQcm9wZXJ0eVZpYUludGVyZmFjZSgpIHsKKwkgICAgcmVnaXN0cnkucmVtb3ZlTWV0YUNsYXNzKEZvby5jbGFzcykKKwkgICAgcmVnaXN0cnkucmVtb3ZlTWV0YUNsYXNzKFRlc3QxLmNsYXNzKQorCisJICAgIGRlZiBtZXRhQ2xhc3MgPSByZWdpc3RyeS5nZXRNZXRhQ2xhc3MoRm9vLmNsYXNzKQorCisJICAgIG1ldGFDbGFzcy5nZXRQcm9wZXJ0eSA9IHsgU3RyaW5nIG5hbWUgLT4KKyAgICAgICAgICAgIGRlZiBtcCA9IGRlbGVnYXRlLm1ldGFDbGFzcy5nZXRNZXRhUHJvcGVydHkobmFtZSkKKworICAgICAgICAgICAgbXAgPyBtcC5nZXRQcm9wZXJ0eShkZWxlZ2F0ZSkgOiAiZm9vICRuYW1lIgorICAgICAgICB9CisKKwkgICAgZGVmIHQgPSBuZXcgVGVzdDEoKQorCisJICAgCWFzc2VydEVxdWFscyAiRnJlZCIsIHQuZ2V0UHJvcGVydHkoIm5hbWUiKQorCSAgIAlhc3NlcnRFcXVhbHMgIkZyZWQiLCB0Lm5hbWUKKwkgICAJYXNzZXJ0RXF1YWxzICJmb28gYmFyIiwgdC5nZXRQcm9wZXJ0eSgiYmFyIikKKwkgICAJYXNzZXJ0RXF1YWxzICJmb28gYmFyIiwgdC5iYXIKKyAgICB9CisKKyAgICB2b2lkIHRlc3RPdmVycmlkZUludm9rZU1ldGhvZFZpYUludGVyZmFjZSgpIHsKKwkgICAgcmVnaXN0cnkucmVtb3ZlTWV0YUNsYXNzKEZvby5jbGFzcykKKwkgICAgcmVnaXN0cnkucmVtb3ZlTWV0YUNsYXNzKE9iamVjdC5jbGFzcykKKwkgICAgcmVnaXN0cnkucmVtb3ZlTWV0YUNsYXNzKElCYXIuY2xhc3MpCisJICAgIHJlZ2lzdHJ5LnJlbW92ZU1ldGFDbGFzcyhUZXN0MS5jbGFzcykKKworCSAgICBkZWYgbWV0YUNsYXNzID0gcmVnaXN0cnkuZ2V0TWV0YUNsYXNzKEZvby5jbGFzcykKKworCisJICAgIG1ldGFDbGFzcy5pbnZva2VNZXRob2QgPSB7IFN0cmluZyBuYW1lLCBhcmdzIC0+CisgICAgICAgICAgIGRlZiBtbSA9IGRlbGVnYXRlLm1ldGFDbGFzcy5nZXRNZXRhTWV0aG9kKG5hbWUsIGFyZ3MpCisgICAgICAgICAgICBtbSA/IG1tLmludm9rZShkZWxlZ2F0ZSwgYXJncykgOiAiYmFyISEiCisJICAgIH0KKworCisJICAgIGRlZiB0ID0gbmV3IFRlc3QxKCkKKworICAgICAgICBhc3NlcnRFcXVhbHMgImJhciEhIiwgdC5kb1N0dWZmKCkKKyAgICAgICAgYXNzZXJ0RXF1YWxzICJmb28iLCB0Lmludm9rZU1lKCkKKyAgICB9CisKKwl2b2lkIHRlc3RJbnRlcmZhY2VNZXRob2RJbmhlcml0YW5jZSgpIHsKKworCSAgICByZWdpc3RyeS5yZW1vdmVNZXRhQ2xhc3MoTGlzdC5jbGFzcykKKwkgICAgcmVnaXN0cnkucmVtb3ZlTWV0YUNsYXNzKEFycmF5TGlzdC5jbGFzcykKKworCisJICAgIGRlZiBtZXRhQ2xhc3MgPSByZWdpc3RyeS5nZXRNZXRhQ2xhc3MoTGlzdC5jbGFzcykKKwkgICAgYXNzZXJ0VHJ1ZShtZXRhQ2xhc3MgaW5zdGFuY2VvZiBFeHBhbmRvTWV0YUNsYXNzKQorCisJICAgIG1ldGFDbGFzcy5zaXplRG91YmxlZCA9IHstPiBkZWxlZ2F0ZS5zaXplKCkqMiB9CisJICAgIG1ldGFDbGFzcy5pc0Z1bGwgPSB7LT4gZmFsc2UgfQorCisJICAgIGRlZiBsaXN0ID0gbmV3IEFycmF5TGlzdCgpCisKKwkgICAgbGlzdCA8PCAxCisJICAgIGxpc3QgPDwgMgorCisJICAgIGFzc2VydEVxdWFscyA0LCBsaXN0LnNpemVEb3VibGVkKCkKKworCisKKwkgICAgbGlzdCA9IG5ldyBBcnJheUxpc3QoKQorCisJICAgIGFzc2VydCAhbGlzdC5pc0Z1bGwoKQorCSAgICBhc3NlcnQgIWxpc3QuZnVsbAorICAgIH0KKworCisKKworCXZvaWQgdGVzdEV4cGFuZG9DcmVhdGlvbkhhbmRsZSgpIHsKKwkJZGVmIG1ldGFDbGFzcyA9IHJlZ2lzdHJ5LmdldE1ldGFDbGFzcyhVUkwuY2xhc3MpCisJCWlmKCEobWV0YUNsYXNzIGluc3RhbmNlb2YgRXhwYW5kb01ldGFDbGFzcykpIHsKKwkJCXJlZ2lzdHJ5LnJlbW92ZU1ldGFDbGFzcyhVUkwuY2xhc3MpCisJCX0KKworCQlkZWYgdXJsID0gbmV3IFVSTCgiaHR0cDovL2dyYWlscy5vcmciKQorCQltZXRhQ2xhc3MgPSByZWdpc3RyeS5nZXRNZXRhQ2xhc3ModXJsLmdldENsYXNzKCkpCisJCWFzc2VydFRydWUobWV0YUNsYXNzIGluc3RhbmNlb2YgRXhwYW5kb01ldGFDbGFzcykKKworCisJCW1ldGFDbGFzcy50b1VwcGVyU3RyaW5nID0gey0+CisJCQlkZWxlZ2F0ZS50b1N0cmluZygpLnRvVXBwZXJDYXNlKCkKKwkJfQorCisJCWFzc2VydEVxdWFscyAiaHR0cDovL2dyYWlscy5vcmciLCB1cmwudG9TdHJpbmcoKQorCQlhc3NlcnRFcXVhbHMgIkhUVFA6Ly9HUkFJTFMuT1JHIiwgdXJsLnRvVXBwZXJTdHJpbmcoKQorCX0KKworCXZvaWQgdGVzdEV4cGFuZG9Jbmhlcml0YW5jZSgpIHsKKwkJcmVnaXN0cnkucmVtb3ZlTWV0YUNsYXNzKFN0cmluZy5jbGFzcykKKworCQlkZWYgbWV0YUNsYXNzID0gcmVnaXN0cnkuZ2V0TWV0YUNsYXNzKE9iamVjdC5jbGFzcykKKwkJaWYoIShtZXRhQ2xhc3MgaW5zdGFuY2VvZiBFeHBhbmRvTWV0YUNsYXNzKSkgeworCQkJcmVnaXN0cnkucmVtb3ZlTWV0YUNsYXNzKE9iamVjdC5jbGFzcykKKwkJCW1ldGFDbGFzcyA9IHJlZ2lzdHJ5LmdldE1ldGFDbGFzcyhPYmplY3QuY2xhc3MpCisJCX0KKworCQltZXRhQ2xhc3MudG9Gb28gPSB7LT4gImZvbyIgfQorCisJCWRlZiB1cmkgPSBuZXcgVVJJKCJodHRwOi8vYmFyLmNvbSIpCisJCWRlZiBzID0gImJhciIKKworCQlhc3NlcnRFcXVhbHMgImZvbyIsIHVyaS50b0ZvbygpCisJCWFzc2VydEVxdWFscyAiZm9vIiwgcy50b0ZvbygpCisKKwkJbWV0YUNsYXNzLnRvQmFyID0gey0+ICJiYXIiIH0KKworCQlhc3NlcnRFcXVhbHMgImJhciIsIHVyaS50b0JhcigpCisJCWFzc2VydEVxdWFscyAiYmFyIiwgcy50b0JhcigpCisJfQorCisKKworICAgICB2b2lkIHRlc3RBZGRNZXRob2RUb0NoaWxkVGhlblBhcmVudCgpIHsKKyAgICAgICAgIHJlZ2lzdHJ5LnJlbW92ZU1ldGFDbGFzcyhUZXN0MSkKKyAgICAgICAgIHJlZ2lzdHJ5LnJlbW92ZU1ldGFDbGFzcyhFTUNJbmhlcml0VGVzdCkKKworICAgICAgICAgRU1DSW5oZXJpdFRlc3QubWV0YUNsYXNzLmZvbyA9IHstPiAiaGVsbG8hIiB9CisKKyAgICAgICAgIGRlZiBlbWMgPSBuZXcgRU1DSW5oZXJpdFRlc3QoKQorCisgICAgICAgICBhc3NlcnRFcXVhbHMgImhlbGxvISIsIGVtYy5mb28oKQorCisgICAgICAgICBUZXN0MS5tZXRhQ2xhc3MuZm9vID0gey0+ICJ1Y2siIH0KKyAgICAgICAgIGVtYyA9IG5ldyBFTUNJbmhlcml0VGVzdCgpCisgICAgICAgICAvLyBtYWtlIHN1cmUgb3JpZ2luYWwgZm9vIHdhc24ndCBvdmVycmlkZGVuCisgICAgICAgICBhc3NlcnRFcXVhbHMgImhlbGxvISIsIGVtYy5mb28oKQorICAgICB9CisKKyAgICAgdm9pZCB0ZXN0QWRkTWV0aG9kTWlzc2luZ1RvQ2hpbGRUaGVuUGFyZW50KCkgeworICAgICAgICAgcmVnaXN0cnkucmVtb3ZlTWV0YUNsYXNzKFRlc3QxKQorICAgICAgICAgcmVnaXN0cnkucmVtb3ZlTWV0YUNsYXNzKEVNQ0luaGVyaXRUZXN0KQorCisgICAgICAgICBFTUNJbmhlcml0VGVzdC5tZXRhQ2xhc3MubWV0aG9kTWlzc2luZyA9IHtTdHJpbmcgbmFtZSwgYXJncy0+ICJoZWxsbyEiIH0KKworICAgICAgICAgZGVmIGVtYyA9IG5ldyBFTUNJbmhlcml0VGVzdCgpCisKKyAgICAgICAgIGFzc2VydEVxdWFscyAiaGVsbG8hIiwgZW1jLmZvbygpCisKKyAgICAgICAgIFRlc3QxLm1ldGFDbGFzcy5tZXRob2RNaXNzaW5nID0ge1N0cmluZyBuYW1lLCBhcmdzLT4gInVjayIgfQorICAgICAgICAgZW1jID0gbmV3IEVNQ0luaGVyaXRUZXN0KCkKKyAgICAgICAgIC8vIG1ha2Ugc3VyZSBvcmlnaW5hbCBmb28gd2Fzbid0IG92ZXJyaWRkZW4KKyAgICAgICAgIGFzc2VydEVxdWFscyAiaGVsbG8hIiwgZW1jLmJhcigpCisKKyAgICAgfQorCisKK30KKworaW50ZXJmYWNlIElCYXIgeyB9CitpbnRlcmZhY2UgRm9vIGV4dGVuZHMgSUJhciB7CisKK30KK2NsYXNzIFRlc3QxIGltcGxlbWVudHMgRm9vIHsKKyAgICBTdHJpbmcgbmFtZSA9ICJGcmVkIgorICAgICAgZGVmIGludm9rZU1lKCkgeyAiZm9vIiB9Cit9CitjbGFzcyBFTUNJbmhlcml0VGVzdCBleHRlbmRzIFRlc3QxIHsKKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9sYW5nL0V4cGFuZG9NZXRhQ2xhc3NUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvbGFuZy9FeHBhbmRvTWV0YUNsYXNzVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjczMGJmMwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvbGFuZy9FeHBhbmRvTWV0YUNsYXNzVGVzdC5ncm9vdnkKQEAgLTAsMCArMSw1NzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgZ3Jvb3Z5LmxhbmcKKworLyoqCisgKiBAYXV0aG9yIEdyYWVtZSBSb2NoZXIKKyAqLworCitjbGFzcyBFeHBhbmRvTWV0YUNsYXNzVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIHZvaWQgdGVzdE92ZXJyaWRlU3RhdGljTWV0aG9kKCkgeyAgICAgICAgCisgICAgICAgIFRlc3RTdGF0aWMubWV0YUNsYXNzLidzdGF0aWMnLmYgPSB7ICJmaXJzdCIgfQorICAgICAgICBhc3NlcnRFcXVhbHMgImZpcnN0IixUZXN0U3RhdGljLmYoIiIpCisKKyAgICAgICAgVGVzdFN0YXRpYy5tZXRhQ2xhc3MuJ3N0YXRpYycuZiA9IHsgInNlY29uZCIgfQorICAgICAgICBhc3NlcnRFcXVhbHMgInNlY29uZCIsVGVzdFN0YXRpYy5mKCIiKQorICAgIH0KKworCisgICAgdm9pZCB0ZXN0T3ZlcnJpZGVNZXRob2QoKSB7CisgICAgICAgIFRlc3RTdGF0aWMubWV0YUNsYXNzLmYgPSB7ICJmaXJzdCIgfQorICAgICAgICBhc3NlcnRFcXVhbHMgImZpcnN0IixuZXcgVGVzdFN0YXRpYyAoKS5mKCIiKQorCisgICAgICAgIFRlc3RTdGF0aWMubWV0YUNsYXNzLmYgPSB7ICJzZWNvbmQiIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzICJzZWNvbmQiLG5ldyBUZXN0U3RhdGljICgpLmYoIiIpCisgICAgfQorCisKKyAgICB2b2lkIHRlc3RTdGF0aWNCZWFuU3R5bGVQcm9wZXJ0aWVzKCkgeworICAgICAgICBkZWYgbWMgPSBuZXcgRXhwYW5kb01ldGFDbGFzcyhUZXN0SW52b2tlTWV0aG9kLmNsYXNzLCB0cnVlLCB0cnVlKQorICAgICAgICBtYy5pbml0aWFsaXplKCkKKyAgICAgICAgR3Jvb3Z5U3lzdGVtLm1ldGFDbGFzc1JlZ2lzdHJ5LnNldE1ldGFDbGFzcyhUZXN0SW52b2tlTWV0aG9kLmNsYXNzLCBtYykKKworICAgICAgICBtYy4nc3RhdGljJy5nZXRIZWxsbyA9IHstPiAiYmFyISJ9CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzICJiYXIhIiwgVGVzdEludm9rZU1ldGhvZC5oZWxsbworICAgIH0KKworICAgIHZvaWQgdGVzdE92ZXJyaWRlSW52b2tlU3RhdGljTWV0aG9kKCkgeworICAgICAgICBkZWYgbWMgPSBuZXcgRXhwYW5kb01ldGFDbGFzcyhUZXN0SW52b2tlTWV0aG9kLmNsYXNzLCB0cnVlLCB0cnVlKQorICAgICAgICBtYy5pbml0aWFsaXplKCkKKyAgICAgICAgR3Jvb3Z5U3lzdGVtLm1ldGFDbGFzc1JlZ2lzdHJ5LnNldE1ldGFDbGFzcyhUZXN0SW52b2tlTWV0aG9kLmNsYXNzLCBtYykKKworICAgICAgICBtYy4nc3RhdGljJy5pbnZva2VNZXRob2QgPSB7U3RyaW5nIG1ldGhvZE5hbWUsIGFyZ3MgLT4KKyAgICAgICAgICAgIGRlZiBtZXRhTWV0aG9kID0gbWMuZ2V0U3RhdGljTWV0YU1ldGhvZChtZXRob2ROYW1lLCBhcmdzKQorICAgICAgICAgICAgZGVmIHJlc3VsdCA9IG51bGwKKyAgICAgICAgICAgIGlmIChtZXRhTWV0aG9kKSByZXN1bHQgPSBtZXRhTWV0aG9kLmludm9rZShkZWxlZ2F0ZSwgYXJncykKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9ICJmb28hIgorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRFcXVhbHMgImJhciEiLCBUZXN0SW52b2tlTWV0aG9kLm15U3RhdGljTWV0aG9kKCkKKyAgICAgICAgYXNzZXJ0RXF1YWxzICJmb28hIiwgVGVzdEludm9rZU1ldGhvZC5keW5hbWljTWV0aG9kKCkKKyAgICB9CisKKyAgICB2b2lkIHRlc3RPdmVycmlkZUludm9rZU1ldGhvZCgpIHsKKyAgICAgICAgZGVmIG1jID0gbmV3IEV4cGFuZG9NZXRhQ2xhc3MoVGVzdEludm9rZU1ldGhvZC5jbGFzcywgZmFsc2UsIHRydWUpCisgICAgICAgIG1jLmluaXRpYWxpemUoKQorCisKKyAgICAgICAgYXNzZXJ0IG1jLmhhc01ldGFNZXRob2QoImludm9rZU1lIiwgW1N0cmluZ10gYXMgQ2xhc3NbXSkKKworICAgICAgICBtYy5pbnZva2VNZXRob2QgPSB7U3RyaW5nIG5hbWUsIGFyZ3MgLT4KKyAgICAgICAgICAgIGRlZiBtbSA9IGRlbGVnYXRlLm1ldGFDbGFzcy5nZXRNZXRhTWV0aG9kKG5hbWUsIGFyZ3MpCisgICAgICAgICAgICBtbSA/IG1tLmludm9rZShkZWxlZ2F0ZSwgYXJncykgOiAiYmFyISEiCisgICAgICAgIH0KKworICAgICAgICBkZWYgdCA9IG5ldyBUZXN0SW52b2tlTWV0aG9kKCkKKyAgICAgICAgdC5tZXRhQ2xhc3MgPSBtYworCisgICAgICAgIGFzc2VydEVxdWFscyAiYmFyISEiLCB0LmRvU3R1ZmYoKQorICAgICAgICBhc3NlcnRFcXVhbHMgIkZvbyEhIGhlbGxvIiwgdC5pbnZva2VNZSgiaGVsbG8iKQorICAgIH0KKworICAgIHZvaWQgdGVzdE92ZXJyaWRlU2V0UHJvcGVydHkoKSB7CisgICAgICAgIGRlZiBtYyA9IG5ldyBFeHBhbmRvTWV0YUNsYXNzKFRlc3RHZXRQcm9wZXJ0eS5jbGFzcywgZmFsc2UsIHRydWUpCisgICAgICAgIG1jLmluaXRpYWxpemUoKQorCisgICAgICAgIGFzc2VydCBtYy5oYXNNZXRhUHJvcGVydHkoIm5hbWUiKQorCisgICAgICAgIGRlZiB0ZXN0VmFsdWUgPSBudWxsCisgICAgICAgIG1jLnNldFByb3BlcnR5ID0ge1N0cmluZyBuYW1lLCB2YWx1ZSAtPgorICAgICAgICAgICAgZGVmIG1wID0gZGVsZWdhdGUubWV0YUNsYXNzLmdldE1ldGFQcm9wZXJ0eShuYW1lKQorCisgICAgICAgICAgICBpZiAobXApIHttcC5zZXRQcm9wZXJ0eShkZWxlZ2F0ZSwgdmFsdWUpfSBlbHNlIHt0ZXN0VmFsdWUgPSB2YWx1ZX0KKyAgICAgICAgfQorCisgICAgICAgIGRlZiB0ID0gbmV3IFRlc3RHZXRQcm9wZXJ0eSgpCisgICAgICAgIHQubWV0YUNsYXNzID0gbWMKKworICAgICAgICB0Lm5hbWUgPSAiQm9iIgorICAgICAgICBhc3NlcnRFcXVhbHMgIkJvYiIsIHQubmFtZQorCisgICAgICAgIHQuZm9vID0gImJhciIKKyAgICAgICAgYXNzZXJ0RXF1YWxzICJiYXIiLCB0ZXN0VmFsdWUKKyAgICB9CisKKyAgICB2b2lkIHRlc3RPdmVycmlkZUdldFByb3BlcnR5KCkgeworICAgICAgICBkZWYgbWMgPSBuZXcgRXhwYW5kb01ldGFDbGFzcyhUZXN0R2V0UHJvcGVydHkuY2xhc3MsIGZhbHNlICwgdHJ1ZSkKKyAgICAgICAgbWMuaW5pdGlhbGl6ZSgpCisKKyAgICAgICAgYXNzZXJ0IG1jLmhhc01ldGFQcm9wZXJ0eSgibmFtZSIpCisKKyAgICAgICAgbWMuZ2V0UHJvcGVydHkgPSB7U3RyaW5nIG5hbWUgLT4KKyAgICAgICAgICAgIGRlZiBtcCA9IGRlbGVnYXRlLm1ldGFDbGFzcy5nZXRNZXRhUHJvcGVydHkobmFtZSkKKworICAgICAgICAgICAgbXAgPyBtcC5nZXRQcm9wZXJ0eShkZWxlZ2F0ZSkgOiAiZm9vICRuYW1lIgorICAgICAgICB9CisKKyAgICAgICAgZGVmIHQgPSBuZXcgVGVzdEdldFByb3BlcnR5KCkKKyAgICAgICAgdC5tZXRhQ2xhc3MgPSBtYworCisgICAgICAgIGFzc2VydEVxdWFscyAiZm9vIGJhciIsIHQuZ2V0UHJvcGVydHkoImJhciIpCisgICAgICAgIGFzc2VydEVxdWFscyAiZm9vIGJhciIsIHQuYmFyCisgICAgICAgIGFzc2VydEVxdWFscyAiRnJlZCIsIHQuZ2V0UHJvcGVydHkoIm5hbWUiKQorICAgICAgICBhc3NlcnRFcXVhbHMgIkZyZWQiLCB0Lm5hbWUKKyAgICB9CisKKyAgICB2b2lkIHRlc3RCb29sZWFuR2V0dGVyV2l0aENsb3N1cmUoKSB7CisgICAgICAgIGRlZiBtZXRhQ2xhc3MgPSBuZXcgRXhwYW5kb01ldGFDbGFzcyhUZXN0LmNsYXNzLCBmYWxzZSwgdHJ1ZSkKKyAgICAgICAgbWV0YUNsYXNzLmluaXRpYWxpemUoKQorICAgICAgICBtZXRhQ2xhc3MuaXNWYWxpZCA9IHstPiB0cnVlfQorCisgICAgICAgIGRlZiB0ID0gbmV3IFRlc3QoKQorICAgICAgICB0Lm1ldGFDbGFzcyA9IG1ldGFDbGFzcworCisgICAgICAgIGFzc2VydCB0LmlzVmFsaWQoKQorICAgICAgICBhc3NlcnQgdC52YWxpZAorICAgIH0KKworCisgICAgdm9pZCB0ZXN0QWxsb3dBZGRpdGlvbk9mUHJvcGVydGllcygpIHsKKyAgICAgICAgZGVmIG1ldGFDbGFzcyA9IG5ldyBFeHBhbmRvTWV0YUNsYXNzKFRlc3QuY2xhc3MsIGZhbHNlLCB0cnVlKQorCisgICAgICAgIG1ldGFDbGFzcy5nZXRPbmUgPDwgey0+CisgICAgICAgICAgICAidGVzdG1lIgorICAgICAgICB9CisgICAgICAgIG1ldGFDbGFzcy5pbml0aWFsaXplKCkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1ldGFDbGFzcy5nZXRUd28gPDwgey0+CisgICAgICAgICAgICAgICAgInRlc3RhZ2FpbiIKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSBhbGxvd2VkIGFkZGl0aW9uIG9mIG5ldyBtZXRob2QiKQorICAgICAgICB9CisKKyAgICAgICAgZGVmIHQgPSBuZXcgVGVzdCgpCisgICAgICAgIHQubWV0YUNsYXNzID0gbWV0YUNsYXNzCisKKyAgICAgICAgYXNzZXJ0RXF1YWxzICJ0ZXN0bWUiLCB0Lm9uZQorICAgICAgICBhc3NlcnRFcXVhbHMgInRlc3RhZ2FpbiIsIHQudHdvCisgICAgfQorCisgICAgdm9pZCB0ZXN0QWxsb3dBZGRpdGlvbk9mTWV0aG9kcygpIHsKKyAgICAgICAgZGVmIG1ldGFDbGFzcyA9IG5ldyBFeHBhbmRvTWV0YUNsYXNzKFRlc3QuY2xhc3MsIGZhbHNlLCB0cnVlKQorCisgICAgICAgIG1ldGFDbGFzcy5teU1ldGhvZCA8PCB7LT4KKyAgICAgICAgICAgICJ0ZXN0bWUiCisgICAgICAgIH0KKyAgICAgICAgbWV0YUNsYXNzLmluaXRpYWxpemUoKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbWV0YUNsYXNzLm15U2Vjb25kTWV0aG9kIDw8IHstPgorICAgICAgICAgICAgICAgICJ0ZXN0YWdhaW4iCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgYWxsb3dlZCBhZGRpdGlvbiBvZiBuZXcgbWV0aG9kIikKKyAgICAgICAgfQorCisgICAgICAgIGRlZiB0ID0gbmV3IFRlc3QoKQorICAgICAgICB0Lm1ldGFDbGFzcyA9IG1ldGFDbGFzcworCisgICAgICAgIGFzc2VydEVxdWFscyAidGVzdG1lIiwgdC5teU1ldGhvZCgpCisgICAgICAgIGFzc2VydEVxdWFscyAidGVzdGFnYWluIiwgdC5teVNlY29uZE1ldGhvZCgpCisgICAgfQorCisgICAgdm9pZCB0ZXN0Rm9yYmlkZGVuQWRkaXRpb25PZk1ldGhvZHMoKSB7CisgICAgICAgIGRlZiBtZXRhQ2xhc3MgPSBuZXcgRXhwYW5kb01ldGFDbGFzcyhUZXN0LmNsYXNzKQorCisgICAgICAgIG1ldGFDbGFzcy5teU1ldGhvZCA8PCB7CisgICAgICAgICAgICAidGVzdG1lIgorICAgICAgICB9CisgICAgICAgIG1ldGFDbGFzcy5pbml0aWFsaXplKCkKKworICAgICAgICBkZWYgdCA9IG5ldyBUZXN0KCkKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbWV0YUNsYXNzLm15U2Vjb25kTWV0aG9kIDw8IHsKKyAgICAgICAgICAgICAgICAidGVzdGFnYWluIgorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGV4Y2VwdGlvbiIpCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgdGVzdFByb3BlcnR5R2V0dGVyV2l0aENsb3N1cmUoKSB7CisgICAgICAgIGRlZiBtZXRhQ2xhc3MgPSBuZXcgRXhwYW5kb01ldGFDbGFzcyhUZXN0LmNsYXNzKQorCisgICAgICAgIG1ldGFDbGFzcy5nZXRTb21ldGhpbmcgPSB7LT4gInRlc3RtZSJ9CisKKyAgICAgICAgbWV0YUNsYXNzLmluaXRpYWxpemUoKQorCisgICAgICAgIGRlZiB0ID0gbmV3IFRlc3QoKQorICAgICAgICB0Lm1ldGFDbGFzcyA9IG1ldGFDbGFzcworCisgICAgICAgIGFzc2VydEVxdWFscyAidGVzdG1lIiwgdC5nZXRTb21ldGhpbmcoKQorICAgICAgICBhc3NlcnRFcXVhbHMgInRlc3RtZSIsIHQuc29tZXRoaW5nCisgICAgfQorCisgICAgdm9pZCB0ZXN0UHJvcGVydHlTZXR0ZXJXaXRoQ2xvc3VyZSgpIHsKKyAgICAgICAgZGVmIG1ldGFDbGFzcyA9IG5ldyBFeHBhbmRvTWV0YUNsYXNzKFRlc3QuY2xhc3MpCisKKyAgICAgICAgZGVmIHRlc3RTZXQgPSBudWxsCisgICAgICAgIG1ldGFDbGFzcy5zZXRTb21ldGhpbmcgPSB7U3RyaW5nIHR4dCAtPiB0ZXN0U2V0ID0gdHh0fQorCisgICAgICAgIG1ldGFDbGFzcy5pbml0aWFsaXplKCkKKworICAgICAgICBkZWYgdCA9IG5ldyBUZXN0KCkKKyAgICAgICAgdC5tZXRhQ2xhc3MgPSBtZXRhQ2xhc3MKKworICAgICAgICB0LnNvbWV0aGluZyA9ICJ0ZXN0bWUiCisgICAgICAgIGFzc2VydEVxdWFscyAidGVzdG1lIiwgdGVzdFNldAorCisgICAgICAgIHQuc2V0U29tZXRoaW5nKCJ0ZXN0MiIpCisgICAgICAgIGFzc2VydEVxdWFscyAidGVzdDIiLCB0ZXN0U2V0CisgICAgfQorCisgICAgdm9pZCB0ZXN0TmV3TWV0aG9kT3ZlcmxvYWRpbmcoKSB7CisgICAgICAgIGRlZiBtZXRhQ2xhc3MgPSBuZXcgRXhwYW5kb01ldGFDbGFzcyhUZXN0LmNsYXNzKQorCisgICAgICAgIG1ldGFDbGFzcy5vdmVybG9hZE1lIDw8IHtTdHJpbmcgdHh0IC0+IHR4dH0gPDwge0ludGVnZXIgaSAtPiBpfQorCisgICAgICAgIG1ldGFDbGFzcy5pbml0aWFsaXplKCkKKworICAgICAgICBkZWYgdCA9IG5ldyBUZXN0KCkKKyAgICAgICAgdC5tZXRhQ2xhc3MgPSBtZXRhQ2xhc3MKKworICAgICAgICBhc3NlcnRFcXVhbHMgInRlc3QiLCB0Lm92ZXJsb2FkTWUoInRlc3QiKQorICAgICAgICBhc3NlcnRFcXVhbHMgMTAsIHQub3ZlcmxvYWRNZSgxMCkKKyAgICB9CisKKyAgICB2b2lkIHRlc3RPdmVybG9hZEV4aXN0aW5nTWV0aG9kQWZ0ZXJJbml0aWFsaXplKCkgeworICAgICAgICBkZWYgdCA9IG5ldyBUZXN0KCkKKworICAgICAgICBhc3NlcnRFcXVhbHMgInRlc3QiLCB0LmRvU29tZXRoaW5nKCJ0ZXN0IikKKworICAgICAgICBkZWYgbWV0YUNsYXNzID0gbmV3IEV4cGFuZG9NZXRhQ2xhc3MoVGVzdC5jbGFzcywgZmFsc2UsIHRydWUpCisgICAgICAgIG1ldGFDbGFzcy5pbml0aWFsaXplKCkKKworICAgICAgICBtZXRhQ2xhc3MuZG9Tb21ldGhpbmcgPSB7SW50ZWdlciBpIC0+IGkgKyAxfQorCisgICAgICAgIHQubWV0YUNsYXNzID0gbWV0YUNsYXNzCisKKyAgICAgICAgYXNzZXJ0RXF1YWxzICJ0ZXN0IiwgdC5kb1NvbWV0aGluZygidGVzdCIpCisgICAgICAgIGFzc2VydEVxdWFscyAxMSwgdC5kb1NvbWV0aGluZygxMCkKKyAgICB9CisKKyAgICB2b2lkIHRlc3RPdmVybG9hZEV4aXN0aW5nTWV0aG9kQmVmb3JlSW5pdGlhbGl6ZSgpIHsKKyAgICAgICAgZGVmIHQgPSBuZXcgVGVzdCgpCisKKyAgICAgICAgYXNzZXJ0RXF1YWxzICJ0ZXN0IiwgdC5kb1NvbWV0aGluZygidGVzdCIpCisKKyAgICAgICAgZGVmIG1ldGFDbGFzcyA9IG5ldyBFeHBhbmRvTWV0YUNsYXNzKFRlc3QuY2xhc3MsIGZhbHNlLCB0cnVlKQorCisKKyAgICAgICAgbWV0YUNsYXNzLmRvU29tZXRoaW5nID0ge0ludGVnZXIgaSAtPiBpICsgMX0KKworICAgICAgICBtZXRhQ2xhc3MuaW5pdGlhbGl6ZSgpCisKKyAgICAgICAgdC5tZXRhQ2xhc3MgPSBtZXRhQ2xhc3MKKworICAgICAgICBhc3NlcnRFcXVhbHMgInRlc3QiLCB0LmRvU29tZXRoaW5nKCJ0ZXN0IikKKyAgICAgICAgYXNzZXJ0RXF1YWxzIDExLCB0LmRvU29tZXRoaW5nKDEwKQorICAgIH0KKworICAgIHZvaWQgdGVzdE5ld1Byb3BlcnR5TWV0aG9kKCkgeworICAgICAgICBkZWYgbWV0YUNsYXNzID0gbmV3IEV4cGFuZG9NZXRhQ2xhc3MoVGVzdC5jbGFzcykKKworICAgICAgICBtZXRhQ2xhc3Muc29tZXRoaW5nID0gInRlc3RtZSIKKworICAgICAgICBtZXRhQ2xhc3MuaW5pdGlhbGl6ZSgpCisKKyAgICAgICAgZGVmIHQgPSBuZXcgVGVzdCgpCisgICAgICAgIHQubWV0YUNsYXNzID0gbWV0YUNsYXNzCisKKyAgICAgICAgYXNzZXJ0RXF1YWxzICJ0ZXN0bWUiLCB0LmdldFNvbWV0aGluZygpCisgICAgICAgIGFzc2VydEVxdWFscyAidGVzdG1lIiwgdC5zb21ldGhpbmcKKworICAgICAgICB0LnNvbWV0aGluZyA9ICJ0ZXN0MiIKKyAgICAgICAgYXNzZXJ0RXF1YWxzICJ0ZXN0MiIsIHQuc29tZXRoaW5nCisgICAgICAgIGFzc2VydEVxdWFscyAidGVzdDIiLCB0LmdldFNvbWV0aGluZygpCisKKyAgICAgICAgZGVmIHQyID0gbmV3IFRlc3QoKQorICAgICAgICB0Mi5tZXRhQ2xhc3MgPSBtZXRhQ2xhc3MKKyAgICAgICAgLy8gbm93IGNoZWNrIHRoYXQgdGhleSdyZSBub3Qgc2hhcmluZyB0aGUgc2FtZSBwcm9wZXJ0eSEKKyAgICAgICAgYXNzZXJ0RXF1YWxzICJ0ZXN0bWUiLCB0Mi5zb21ldGhpbmcKKyAgICAgICAgYXNzZXJ0RXF1YWxzICJ0ZXN0MiIsIHQuc29tZXRoaW5nCisKKyAgICAgICAgdDIuc2V0U29tZXRoaW5nKCJ0ZXN0MyIpCisKKyAgICAgICAgYXNzZXJ0RXF1YWxzICJ0ZXN0MyIsIHQyLnNvbWV0aGluZworICAgIH0KKworICAgIHZvaWQgdGVzdENoZWNrRmFpbE9uRXhpc3RpbmcoKSB7CisgICAgICAgIGRlZiBtZXRhQ2xhc3MgPSBuZXcgRXhwYW5kb01ldGFDbGFzcyhUZXN0LmNsYXNzKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbWV0YUNsYXNzLmV4aXN0aW5nIDw8IHstPgorICAgICAgICAgICAgICAgICJzaG91bGQgZmFpbC4gYWxyZWFkeSBleGlzdHMhIgorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGV4Y2VwdGlvbiB3aGVuIG1ldGhvZCBhbHJlYWR5IGV4aXN0cyIpCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCB0ZXN0Q2hlY2tGYWlsT25FeGlzdGluZ0NvbnN0cnVjdG9yKCkgeworICAgICAgICBkZWYgbWV0YUNsYXNzID0gbmV3IEV4cGFuZG9NZXRhQ2xhc3MoVGVzdC5jbGFzcykKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1ldGFDbGFzcy5jb25zdHJ1Y3RvciA8PCB7LT4KKyAgICAgICAgICAgICAgICAic2hvdWxkIGZhaWwuIGFscmVhZHkgZXhpc3RzISIKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBleGNlcHRpb24gd2hlbiBtZXRob2QgYWxyZWFkeSBleGlzdHMiKQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgdGVzdENoZWNrRmFpbE9uRXhpc3RpbmdTdGF0aWNNZXRob2QoKSB7CisgICAgICAgIGRlZiBtZXRhQ2xhc3MgPSBuZXcgRXhwYW5kb01ldGFDbGFzcyhUZXN0LmNsYXNzKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbWV0YUNsYXNzLidzdGF0aWMnLmV4aXN0aW5nU3RhdGljIDw8IHstPgorICAgICAgICAgICAgICAgICJzaG91bGQgZmFpbC4gYWxyZWFkeSBleGlzdHMhIgorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGV4Y2VwdGlvbiB3aGVuIG1ldGhvZCBhbHJlYWR5IGV4aXN0cyIpCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCB0ZXN0TmV3U3RhdGljTWV0aG9kKCkgeworICAgICAgICBkZWYgbWV0YUNsYXNzID0gbmV3IEV4cGFuZG9NZXRhQ2xhc3MoVGVzdC5jbGFzcywgdHJ1ZSkKKworICAgICAgICBtZXRhQ2xhc3MuJ3N0YXRpYycubXlTdGF0aWNNZXRob2QgPDwge1N0cmluZyB0eHQgLT4KKyAgICAgICAgICAgICJ0ZXN0bWUiCisgICAgICAgIH0KKyAgICAgICAgbWV0YUNsYXNzLmluaXRpYWxpemUoKQorCisgICAgICAgIGFzc2VydEVxdWFscyAidGVzdG1lIiwgVGVzdC5teVN0YXRpY01ldGhvZCgiYmxhaCIpCisgICAgfQorCisgICAgdm9pZCB0ZXN0UmVwbGFjZVN0YXRpY01ldGhvZCgpIHsKKyAgICAgICAgZGVmIG1ldGFDbGFzcyA9IG5ldyBFeHBhbmRvTWV0YUNsYXNzKFRlc3QuY2xhc3MsIHRydWUpCisKKyAgICAgICAgbWV0YUNsYXNzLidzdGF0aWMnLmV4aXN0aW5nU3RhdGljID0gey0+CisgICAgICAgICAgICAidGVzdG1lIgorICAgICAgICB9CisgICAgICAgIG1ldGFDbGFzcy5pbml0aWFsaXplKCkKKworICAgICAgICBhc3NlcnRFcXVhbHMgInRlc3RtZSIsIFRlc3QuZXhpc3RpbmdTdGF0aWMoKQorCisgICAgfQorCisgICAgdm9pZCB0ZXN0TmV3WmVyb0FyZ3VtZW50U3RhdGljTWV0aG9kKCkgeworICAgICAgICBkZWYgbWV0YUNsYXNzID0gbmV3IEV4cGFuZG9NZXRhQ2xhc3MoVGVzdC5jbGFzcywgdHJ1ZSkKKworICAgICAgICBtZXRhQ2xhc3MuJ3N0YXRpYycubXlTdGF0aWNNZXRob2QgPSB7LT4KKyAgICAgICAgICAgICJ0ZXN0bWUiCisgICAgICAgIH0KKyAgICAgICAgbWV0YUNsYXNzLmluaXRpYWxpemUoKQorCisgICAgICAgIGFzc2VydEVxdWFscyAidGVzdG1lIiwgVGVzdC5teVN0YXRpY01ldGhvZCgpCisgICAgfQorCisgICAgdm9pZCB0ZXN0TmV3SW5zdGFuY2VNZXRob2QoKSB7CisgICAgICAgIGRlZiBtZXRhQ2xhc3MgPSBuZXcgRXhwYW5kb01ldGFDbGFzcyhUZXN0LmNsYXNzKQorCisgICAgICAgIG1ldGFDbGFzcy5teU1ldGhvZCA8PCB7CisgICAgICAgICAgICAidGVzdG1lIgorICAgICAgICB9CisgICAgICAgIG1ldGFDbGFzcy5pbml0aWFsaXplKCkKKworICAgICAgICBkZWYgdCA9IG5ldyBUZXN0KCkKKworICAgICAgICB0Lm1ldGFDbGFzcyA9IG1ldGFDbGFzcworCisgICAgICAgIGFzc2VydEVxdWFscyAidGVzdG1lIiwgdC5teU1ldGhvZCgpCisgICAgfQorCisgICAgdm9pZCB0ZXN0TmV3Q29uc3RydWN0b3IoKSB7CisgICAgICAgIGRlZiBtZXRhQ2xhc3MgPSBuZXcgRXhwYW5kb01ldGFDbGFzcyhUZXN0LmNsYXNzLCB0cnVlKQorCisgICAgICAgIG1ldGFDbGFzcy5jb25zdHJ1Y3RvciA8PCB7U3RyaW5nIHR4dCAtPgorICAgICAgICAgICAgZGVmIHQgPSBUZXN0LmNsYXNzLm5ld0luc3RhbmNlKCkKKyAgICAgICAgICAgIHQubmFtZSA9IHR4dAorICAgICAgICAgICAgcmV0dXJuIHQKKyAgICAgICAgfQorCisgICAgICAgIG1ldGFDbGFzcy5pbml0aWFsaXplKCkKKworICAgICAgICBkZWYgdCA9IG5ldyBUZXN0KCJ0ZXN0bWUiKQorICAgICAgICBhc3NlcnQgdAorICAgICAgICBhc3NlcnRFcXVhbHMgInRlc3RtZSIsIHQubmFtZQorCisgICAgICAgIEdyb292eVN5c3RlbS5tZXRhQ2xhc3NSZWdpc3RyeS5yZW1vdmVNZXRhQ2xhc3MoVGVzdC5jbGFzcykKKyAgICB9CisKKyAgICB2b2lkIHRlc3RSZXBsYWNlQ29uc3RydWN0b3IoKSB7CisgICAgICAgIGRlZiBtZXRhQ2xhc3MgPSBuZXcgRXhwYW5kb01ldGFDbGFzcyhUZXN0LmNsYXNzLCB0cnVlKQorCisgICAgICAgIG1ldGFDbGFzcy5jb25zdHJ1Y3RvciA9IHstPgorICAgICAgICAgICAgInRlc3RtZSIKKyAgICAgICAgfQorCisgICAgICAgIG1ldGFDbGFzcy5pbml0aWFsaXplKCkKKworICAgICAgICBkZWYgdCA9IG5ldyBUZXN0KCkKKyAgICAgICAgYXNzZXJ0IHQKKyAgICAgICAgYXNzZXJ0RXF1YWxzICJ0ZXN0bWUiLCB0CisKKyAgICAgICAgR3Jvb3Z5U3lzdGVtLm1ldGFDbGFzc1JlZ2lzdHJ5LnJlbW92ZU1ldGFDbGFzcyhUZXN0LmNsYXNzKQorICAgIH0KKworICAgIHZvaWQgdGVzdFJlcGxhY2VJbnN0YW5jZU1ldGhvZCgpIHsKKyAgICAgICAgZGVmIG1ldGFDbGFzcyA9IG5ldyBFeHBhbmRvTWV0YUNsYXNzKFRlc3QuY2xhc3MpCisKKyAgICAgICAgbWV0YUNsYXNzLmV4aXN0aW5nMiA9IHtPYmplY3QgaSAtPgorICAgICAgICAgICAgInRlc3RtZSIKKyAgICAgICAgfQorICAgICAgICBtZXRhQ2xhc3MuaW5pdGlhbGl6ZSgpCisKKyAgICAgICAgZGVmIHQgPSBuZXcgVGVzdCgpCisgICAgICAgIHQubWV0YUNsYXNzID0gbWV0YUNsYXNzCisKKyAgICAgICAgZGVmIHZhciA9IDEKKyAgICAgICAgYXNzZXJ0RXF1YWxzICJ0ZXN0bWUiLCB0LmV4aXN0aW5nMih2YXIpCisgICAgfQorCisgICAgdm9pZCB0ZXN0Qm9ycm93TWV0aG9kRnJvbUFub3RoZXJDbGFzcygpIHsKKyAgICAgICAgZGVmIG1ldGFDbGFzcyA9IG5ldyBFeHBhbmRvTWV0YUNsYXNzKFRlc3QuY2xhc3MpCisKKyAgICAgICAgZGVmIGEgPSBuZXcgQW5vdGhlcigpCisgICAgICAgIG1ldGFDbGFzcy5ib3Jyb3dNZSA9IGEuJmFub3RoZXIKKyAgICAgICAgbWV0YUNsYXNzLmJvcnJvd01lVG9vID0gYS4mbm9BcmdzCisgICAgICAgIG1ldGFDbGFzcy5pbml0aWFsaXplKCkKKworICAgICAgICBkZWYgdCA9IG5ldyBUZXN0KCkKKyAgICAgICAgdC5tZXRhQ2xhc3MgPSBtZXRhQ2xhc3MKKworICAgICAgICBhc3NlcnRFcXVhbHMgIm1pbmUgYmxhaCEiLCB0LmJvcnJvd01lKCJibGFoIikKKyAgICAgICAgLy8gR1JPT1ZZLTE5OTMKKyAgICAgICAgYXNzZXJ0RXF1YWxzICJubyBhcmdzIGhlcmUhIiwgdC5ib3Jyb3dNZVRvbygpCisgICAgfQorCisgICAgdm9pZCB0ZXN0Qm9ycm93QnlOYW1lKCkgeworICAgICAgICBwcmludGxuICd0ZXN0Qm9ycm93QnlOYW1lJworICAgICAgICBkZWYgbWV0YUNsYXNzID0gbmV3IEV4cGFuZG9NZXRhQ2xhc3MoVGVzdC5jbGFzcykKKworICAgICAgICBkZWYgYSA9IG5ldyBBbm90aGVyKCkKKyAgICAgICAgbWV0YUNsYXNzLmJvcnJvd01lID0gYS4mJ2Fub3RoZXInCisgICAgICAgIG1ldGFDbGFzcy5ib3Jyb3dNZVRvbyA9IGEuJidub0FyZ3MnCisgICAgICAgIG1ldGFDbGFzcy5pbml0aWFsaXplKCkKKworICAgICAgICBkZWYgdCA9IG5ldyBUZXN0KCkKKyAgICAgICAgdC5tZXRhQ2xhc3MgPSBtZXRhQ2xhc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICAgICAgICBhc3NlcnRFcXVhbHMgIm1pbmUgYmxhaCEiLCB0LmJvcnJvd01lKCJibGFoIikKKyAgICAgICAgLy8gR1JPT1ZZLTE5OTMKKyAgICAgICAgYXNzZXJ0RXF1YWxzICJubyBhcmdzIGhlcmUhIiwgdC5ib3Jyb3dNZVRvbygpCisgICAgfQorCisgICAgdm9pZCB0ZXN0QWRkSWRlbnRpY2FsUHJvcGVydHlUb0NoaWxkQW5kUGFyZW50KCkgeworICAgICAgICBFeHBhbmRvTWV0YUNsYXNzLmVuYWJsZUdsb2JhbGx5KCkKKyAgICAgICAgZG9NZXRob2RzKFN1cGVyQ2xhc3MuY2xhc3MpCisgICAgICAgIGRvTWV0aG9kcyhDaGlsZENsYXNzLmNsYXNzKQorCisgICAgICAgIGRlZiBjaGlsZCA9IG5ldyBDaGlsZENsYXNzKCkKKyAgICAgICAgZGVmIHBhcmVudCA9IG5ldyBTdXBlckNsYXNzKCkKKworICAgICAgICBhc3NlcnQgcGFyZW50LmVycm9ycyA9PSBudWxsCisgICAgICAgIHBhcmVudC5lcnJvcnMgPSBbMywgMiwgMSwgMF0KKyAgICAgICAgYXNzZXJ0IHBhcmVudC5lcnJvcnMuc2l6ZSgpID09IDQKKworICAgICAgICBhc3NlcnQgY2hpbGQuZXJyb3JzID09IG51bGwKKyAgICAgICAgY2hpbGQuZXJyb3JzID0gWzEsIDIsIDNdCisgICAgICAgIGFzc2VydCBjaGlsZC5lcnJvcnMuc2l6ZSgpID09IDMKKyAgICAgICAgLy9UT0RPIGRpc2FibGUgRXhwYW5kb01ldGFDbGFzcworICAgICAgICBFeHBhbmRvTWV0YUNsYXNzLmRpc2FibGVHbG9iYWxseSgpCisgICAgfQorCisgICAgZGVmIGRvTWV0aG9kcyhjbGF6eikgeworICAgICAgICBkZWYgbWV0YUNsYXNzID0gY2xhenoubWV0YUNsYXNzCisKKyAgICAgICAgbWV0YUNsYXNzLnNldEVycm9ycyA9IHtlcnJvcnMgLT4KKyAgICAgICAgICAgIHRoaW5nbyA9IGVycm9ycworICAgICAgICB9CisKKyAgICAgICAgbWV0YUNsYXNzLmdldEVycm9ycyA9IHstPgorICAgICAgICAgICAgcmV0dXJuIHRoaW5nbworICAgICAgICB9CisgICAgfQorCit9CitjbGFzcyBTdXBlckNsYXNzIHsKKyAgICBkZWYgdGhpbmdvCit9CisKK2NsYXNzIENoaWxkQ2xhc3MgZXh0ZW5kcyBTdXBlckNsYXNzIHsKKworfQorCitjbGFzcyBUZXN0SW52b2tlTWV0aG9kIHsKKyAgICBkZWYgaW52b2tlTWUoU3RyaW5nIGJvbykgeyJGb28hISAkYm9vIn0KKworICAgIHN0YXRpYyBteVN0YXRpY01ldGhvZCgpIHsiYmFyISJ9Cit9CisKK2NsYXNzIFRlc3RHZXRQcm9wZXJ0eSB7CisgICAgU3RyaW5nIG5hbWUgPSAiRnJlZCIKK30KKworY2xhc3MgVGVzdCB7CisgICAgU3RyaW5nIG5hbWUKKworICAgIGRlZiBleGlzdGluZzIob2JqKSB7CisgICAgICAgICJoZWxsbzIhIgorICAgIH0KKyAgICBkZWYgZXhpc3RpbmcoKSB7CisgICAgICAgICJoZWxsbyEiCisgICAgfQorCisgICAgZGVmIGRvU29tZXRoaW5nKE9iamVjdCB0eHQpIHt0eHR9CisKKyAgICBzdGF0aWMgZXhpc3RpbmdTdGF0aWMoKSB7CisgICAgICAgICJJIGV4aXN0IgorICAgIH0KK30KKworY2xhc3MgQW5vdGhlciB7CisgICAgZGVmIGFub3RoZXIodHh0KSB7CisgICAgICAgICJtaW5lICR7dHh0fSEiCisgICAgfQorICAgIGRlZiBub0FyZ3MoKSB7CisgICAgICAgICJubyBhcmdzIGhlcmUhIgorICAgIH0KK30KKworY2xhc3MgQ2hpbGQgZXh0ZW5kcyBUZXN0IHsKKyAgICBkZWYgYUNoaWxkTWV0aG9kKCkgeworICAgICAgICAiaGVsbG8gY2hpbGRyZW4iCisgICAgfQorfQorY2xhc3MgVGVzdFN0YXRpYyB7fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvbGFuZy9GbG9hdFJhbmdlVGVzdC5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9sYW5nL0Zsb2F0UmFuZ2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGViNzNlMgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvbGFuZy9GbG9hdFJhbmdlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgJElkOiBGbG9hdFJhbmdlVGVzdC5qYXZhLHYgMS4xIDIwMDYvMTEvMTMgMTA6MjM6NTggZWR3aW4gRXhwIGVkd2luICQKKworIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCisgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQKKyAgICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKKyAgICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCisgICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQorICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgorICAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKKyAgICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KKworIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCisgICAgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAorICAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCisKKyA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQorICAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLworCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUworIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAorIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKKyBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgKi8KK3BhY2thZ2UgZ3Jvb3Z5Lmxhbmc7CisKKy8qKgorICogVGVzdHMge0BsaW5rIE9iamVjdFJhbmdlfXMgb2Yge0BsaW5rIEZsb2F0fXMuCisgKgorICogQGF1dGhvciBFZHdpbiBUZWxsbWFuCisgKi8KK3B1YmxpYyBjbGFzcyBGbG9hdFJhbmdlVGVzdCBleHRlbmRzIE51bWJlclJhbmdlVGVzdCB7CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHJvdGVjdGVkIFJhbmdlIGNyZWF0ZVJhbmdlKGludCBmcm9tLCBpbnQgdG8pIHsKKyAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RSYW5nZShuZXcgRmxvYXQoZnJvbSksIG5ldyBGbG9hdCh0bykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29tcGFyYWJsZSBjcmVhdGVWYWx1ZShpbnQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEb3VibGUodmFsdWUpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9sYW5nL0dTdHJpbmdUZXN0LmphdmEgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2xhbmcvR1N0cmluZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjA1YmU0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9sYW5nL0dTdHJpbmdUZXN0LmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqICRJZCQKKyAqIAorICogQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4KKyAqIGNvcHlyaWdodCBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYSBjb3B5CisgKiBvZiB0aGlzIGRvY3VtZW50LiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gMy4KKyAqIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuIEZvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4gNC4gUHJvZHVjdHMgZGVyaXZlZAorICogZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluCisgKiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEKKyAqIHJlZ2lzdGVyZWQgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4gNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlCisgKiBDb2RlaGF1cyAtIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLworICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqICAKKyAqLworcGFja2FnZSBncm9vdnkubGFuZzsKKworaW1wb3J0IGdyb292eS51dGlsLkdyb292eVRlc3RDYXNlOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5JbnZva2VySGVscGVyOworCisvKioKKyAqIFRlc3RzIHRoZSB1c2Ugb2YgdGhlIHN0cnVjdHVyZWQgQXR0cmlidXRlIHR5cGUKKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgR1N0cmluZ1Rlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0ZU92ZXJUZXh0KCkgeworICAgICAgICBEdW1teUdTdHJpbmcgY29tcFN0cmluZyA9IG5ldyBEdW1teUdTdHJpbmcobmV3IE9iamVjdFtdeyJKYW1lcyJ9KTsKKyAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMobmV3IFN0cmluZ1tdeyJIZWxsbyAiLCAiISJ9LCBjb21wU3RyaW5nLmdldFN0cmluZ3MoKSk7CisgICAgICAgIGFzc2VydEFycmF5RXF1YWxzKG5ldyBPYmplY3RbXXsiSmFtZXMifSwgY29tcFN0cmluZy5nZXRWYWx1ZXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiSGVsbG8gSmFtZXMhIiwgY29tcFN0cmluZy50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwZW5kU3RyaW5nKCkgeworICAgICAgICBEdW1teUdTdHJpbmcgYSA9IG5ldyBEdW1teUdTdHJpbmcobmV3IE9iamVjdFtdeyJKYW1lcyJ9KTsKKyAgICAgICAgR1N0cmluZyByZXN1bHQgPSBhLnBsdXMoIiBob3cgYXJlIHlvdT8iKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJIZWxsbyBKYW1lcyEgaG93IGFyZSB5b3U/IiwgcmVzdWx0LnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoJ0onLCBhLmNoYXJBdCg2KSk7CisgICAgICAgIGFzc2VydEVxdWFscygibyBKIiwgYS5zdWJTZXF1ZW5jZSg0LCA3KSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFwcGVuZFN0cmluZzIoKSB7CisgICAgICAgIER1bW15R1N0cmluZyBhID0gbmV3IER1bW15R1N0cmluZyhuZXcgT2JqZWN0W117IkphbWVzIn0sIG5ldyBTdHJpbmdbXXsiSGVsbG8gIn0pOworICAgICAgICBHU3RyaW5nIHJlc3VsdCA9IGEucGx1cygiIGhvdyBhcmUgeW91PyIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN0cmluZ3M6ICIgKyBJbnZva2VySGVscGVyLnRvU3RyaW5nKHJlc3VsdC5nZXRTdHJpbmdzKCkpKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJWYWx1ZXM6ICIgKyBJbnZva2VySGVscGVyLnRvU3RyaW5nKHJlc3VsdC5nZXRWYWx1ZXMoKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkhlbGxvIEphbWVzIGhvdyBhcmUgeW91PyIsIHJlc3VsdC50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwZW5kR1N0cmluZygpIHsKKyAgICAgICAgRHVtbXlHU3RyaW5nIGEgPSBuZXcgRHVtbXlHU3RyaW5nKG5ldyBPYmplY3RbXXsiSmFtZXMifSk7CisgICAgICAgIER1bW15R1N0cmluZyBiID0gbmV3IER1bW15R1N0cmluZyhuZXcgT2JqZWN0W117IkJvYiJ9KTsKKyAgICAgICAgR1N0cmluZyByZXN1bHQgPSBhLnBsdXMoYik7CisgICAgICAgIGFzc2VydEVxdWFscygiSGVsbG8gSmFtZXMhSGVsbG8gQm9iISIsIHJlc3VsdC50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwZW5kR1N0cmluZzIoKSB7CisgICAgICAgIER1bW15R1N0cmluZyBhID0gbmV3IER1bW15R1N0cmluZyhuZXcgT2JqZWN0W117IkphbWVzIn0sIG5ldyBTdHJpbmdbXXsiSGVsbG8gIn0pOworICAgICAgICBEdW1teUdTdHJpbmcgYiA9IG5ldyBEdW1teUdTdHJpbmcobmV3IE9iamVjdFtdeyJCb2IifSwgbmV3IFN0cmluZ1tdeyJIZWxsbyAifSk7CisgICAgICAgIEdTdHJpbmcgcmVzdWx0ID0gYS5wbHVzKGIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkhlbGxvIEphbWVzSGVsbG8gQm9iIiwgcmVzdWx0LnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHNBbmRIYXNoQ29kZSgpIHsKKyAgICAgICAgRHVtbXlHU3RyaW5nIGEgPSBuZXcgRHVtbXlHU3RyaW5nKG5ldyBPYmplY3RbXXtuZXcgSW50ZWdlcigxKX0pOworICAgICAgICBEdW1teUdTdHJpbmcgYiA9IG5ldyBEdW1teUdTdHJpbmcobmV3IE9iamVjdFtde25ldyBMb25nKDEpfSk7CisgICAgICAgIENvbXBhcmFibGUgYyA9IG5ldyBEdW1teUdTdHJpbmcobmV3IE9iamVjdFtde25ldyBEb3VibGUoMi4zKX0pOworCisgICAgICAgIGFzc2VydFRydWUoImEgPT0gYiIsIGEuZXF1YWxzKGIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJoYXNoY29kZSBhID09IGIiLCBhLmhhc2hDb2RlKCksIGIuaGFzaENvZGUoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJhICE9IGMiLCBhLmVxdWFscyhjKSk7CisgICAgICAgIGFzc2VydFRydWUoImhhc2hjb2RlIGEgIT0gYyIsIGEuaGFzaENvZGUoKSAhPSBjLmhhc2hDb2RlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEgPD0+IGIiLCAwLCBhLmNvbXBhcmVUbyhiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSA8PT4gYiIsIC0xLCBhLmNvbXBhcmVUbyhjKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9sYW5nL0dldE1ldGhvZHNUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvbGFuZy9HZXRNZXRob2RzVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk0NjhlNgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvbGFuZy9HZXRNZXRob2RzVGVzdC5ncm9vdnkKQEAgLTAsMCArMSw3MyBAQAorLyoqCisgKiBUZXN0cyB0aGUgYmVoYXZpb3VyIG9mIHRoZSBydW50aW1lIGV2YWx1YXRpbmcgbWV0aG9kcyBvZiBHcm9vdnkncyBNZXRhQ2xhc3Mgc3lzdGVtCisgCisgKiBAYXV0aG9yIEdyYWVtZSBSb2NoZXIKKyAqIEBzaW5jZSAxLjEKKyAgKgorICogQ3JlYXRlZDogU2VwIDEwLCAyMDA3CisgKiBUaW1lOiA4OjE3OjI5IEFNCisgKiAKKyAqLworcGFja2FnZSBncm9vdnkubGFuZworY2xhc3MgR2V0TWV0aG9kc1Rlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKworICAgIHZvaWQgdGVzdEdldE1ldGhvZHMoKSB7CisgICAgICAgR01UZXN0Mi5tZXRhQ2xhc3MuZG9TdHVmZiA9IHstPiAiZm9vIiB9CisgICAgICAgR01UZXN0Mi5tZXRhQ2xhc3MuZ2V0Rm9vID0gey0+ICJmb28iIH0KKyAgICAgICBHTVRlc3QyLm1ldGFDbGFzcy5iYXIgPSAiYmFyIgorICAgICAgIEdNVGVzdDIubWV0YUNsYXNzLidzdGF0aWMnLmRvTW9yZVN0dWZmID0gey0+ICJtb3JlIiB9CisgICAgICAgZGVmIHQgPSBuZXcgR01UZXN0MigpCisKKworICAgICAgIGFzc2VydCB0Lm1ldGFDbGFzcy5tZXRob2RzLmZpbmQgeyBpdC5uYW1lID09ICdvbmUnIH0KKyAgICAgICBhc3NlcnQgdC5tZXRhQ2xhc3MubWV0aG9kcy5maW5kIHsgaXQubmFtZSA9PSAndGhyZWUnIH0KKyAgICAgICBhc3NlcnQgdC5tZXRhQ2xhc3MubWV0aG9kcy5maW5kIHsgaXQubmFtZSA9PSAnZm9vJyB9CisgICAgICAgYXNzZXJ0IHQubWV0YUNsYXNzLm1ldGhvZHMuZmluZCB7IGl0Lm5hbWUgPT0gJ2dldFNldmVuJyB9CisgICAgICAgYXNzZXJ0IHQubWV0YUNsYXNzLm1ldGhvZHMuZmluZCB7IGl0Lm5hbWUgPT0gJ2dldEVpZ2h0JyB9CisgICAgICAgYXNzZXJ0IHQubWV0YUNsYXNzLm1ldGhvZHMuZmluZCB7IGl0Lm5hbWUgPT0gJ2JhcicgfQorICAgICAgIGFzc2VydCB0Lm1ldGFDbGFzcy5tZXRob2RzLmZpbmQgeyBpdC5uYW1lID09ICd0b1N0cmluZycgfQorICAgICAgIGFzc2VydCB0Lm1ldGFDbGFzcy5tZXRob2RzLmZpbmQgeyBpdC5uYW1lID09ICdnZXRFaWdodCcgfQorICAgICAgIGFzc2VydCB0Lm1ldGFDbGFzcy5tZXRob2RzLmZpbmQgeyBpdC5uYW1lID09ICdzdHVmZicgfQorICAgICAgIGFzc2VydCB0Lm1ldGFDbGFzcy5tZXRob2RzLmZpbmQgeyBpdC5uYW1lID09ICdkb1N0dWZmJyB9CisgICAgICAgYXNzZXJ0IHQubWV0YUNsYXNzLm1ldGhvZHMuZmluZCB7IGl0Lm5hbWUgPT0gJ2dldEZvbycgfQorICAgICAgIGFzc2VydCB0Lm1ldGFDbGFzcy5tZXRob2RzLmZpbmQgeyBpdC5uYW1lID09ICdnZXRCYXInIH0KKyAgICAgICBhc3NlcnQgdC5tZXRhQ2xhc3MubWV0aG9kcy5maW5kIHsgaXQubmFtZSA9PSAnc2V0QmFyJyB9CisgICAgICAgYXNzZXJ0IHQubWV0YUNsYXNzLm1ldGhvZHMuZmluZCB7IGl0Lm5hbWUgPT0gJ2RvTW9yZVN0dWZmJyB9CisgICAgfQorCisgICAgdm9pZCB0ZXN0R2V0UHJvcGVydGllcygpIHsKKworICAgICAgICBHTVRlc3QyLm1ldGFDbGFzcy5nZXRGb28gPSB7LT4gImZvbyIgfQorICAgICAgICBHTVRlc3QyLm1ldGFDbGFzcy5iYXIgPSAiYmFyIgorCisgICAgICAgIGRlZiB0ID0gbmV3IEdNVGVzdDIoKQorCisgICAgICAgIGFzc2VydCB0Lm1ldGFDbGFzcy5wcm9wZXJ0aWVzLmZpbmQgeyBpdC5uYW1lID09ICdmaXZlJyB9CisgICAgICAgIGFzc2VydCB0Lm1ldGFDbGFzcy5wcm9wZXJ0aWVzLmZpbmQgeyBpdC5uYW1lID09ICdzaXgnIH0KKyAgICAgICAgYXNzZXJ0IHQubWV0YUNsYXNzLnByb3BlcnRpZXMuZmluZCB7IGl0Lm5hbWUgPT0gJ3NldmVuJyB9CisgICAgICAgIGFzc2VydCB0Lm1ldGFDbGFzcy5wcm9wZXJ0aWVzLmZpbmQgeyBpdC5uYW1lID09ICdlaWdodCcgfQorICAgICAgICBhc3NlcnQgdC5tZXRhQ2xhc3MucHJvcGVydGllcy5maW5kIHsgaXQubmFtZSA9PSAnZm9vJyB9CisgICAgICAgIGFzc2VydCB0Lm1ldGFDbGFzcy5wcm9wZXJ0aWVzLmZpbmQgeyBpdC5uYW1lID09ICdiYXInIH0KKyAgICB9Cit9CitjbGFzcyBHTVRlc3QxIHsKKyAgICBTdHJpbmcgZml2ZQorICAgIGRlZiB0d28gPSB7ICJ0aHJlZSIgfQorICAgIGRlZiBvbmUoKSB7ICJ0d28ifQorICAgIGRlZiBvbmUoU3RyaW5nIG9uZSkgeyAidHdvOiAkb25lIiB9CisgICAgZGVmIHRocmVlKFN0cmluZyBvbmUpIHsgImZvdXIiIH0KKyAgICBkZWYgdGhyZWUoSW50ZWdlciBvbmUpIHsgImZvdXIiIH0KKyAgICBkZWYgZm9vKFN0cmluZyBuYW1lKSB7CisgICAgICAgICJiYXIiCisgICAgfQorCisgICAgU3RyaW5nIGdldFNldmVuKCkgeyAic2V2ZW4iIH0KK30KK2NsYXNzIEdNVGVzdDIgZXh0ZW5kcyBHTVRlc3QxIHsKKyAgICBTdHJpbmcgc2l4CisgICAgZGVmIGJhcihTdHJpbmcgbmFtZSkgeyAiZm9vIiB9CisgICAgc3RhdGljIHN0dWZmKCkgeyAiZ29vZGllIiB9CisKKyAgICBTdHJpbmcgZ2V0RWlnaHQoKSB7ICJlaWdodCIgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvbGFuZy9Hcm9vdnlDbGFzc0xvYWRlclRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9sYW5nL0dyb292eUNsYXNzTG9hZGVyVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIwZDQ0ZgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvbGFuZy9Hcm9vdnlDbGFzc0xvYWRlclRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogJElkJAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgQ29kZWhhdXMgLSBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24KKyAqIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICoKKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKKworcGFja2FnZSBncm9vdnkubGFuZzsKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuQ29kZVNvdXJjZQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC4qCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuKgoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW4uKgorCisKK3B1YmxpYyBjbGFzcyBHcm9vdnlDbGFzc0xvYWRlclRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICBwcml2YXRlIGZpbmFsIEdyb292eUNsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gbmV3IEdyb292eUNsYXNzTG9hZGVyKCkKKworICAgIHByaXZhdGUgYm9vbGVhbiBjb250YWlucyhTdHJpbmdbXSBwYXRocywgU3RyaW5nIGV2YWwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGV2YWwgPSAobmV3IEZpbGUoZXZhbCkpLnRvVVJJKCkudG9VUkwoKS5nZXRGaWxlKCk7CisgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpdCBpbiBwYXRocykgeworICAgICAgICAgICAgaWYoZXZhbC5lcXVhbHMoaXQpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRzQUNsYXNzcGF0aEVudHJ5T25seUlmSXRIYXNOb3RBbHJlYWR5QmVlbkFkZGVkKCkgeworICAgICAgICBTdHJpbmcgbmV3Q2xhc3NwYXRoRW50cnkgPSAiL3RtcCIKKyAgICAgICAgaW50IGluaXRpYWxOdW1iZXJPZkNsYXNzcGF0aEVudHJpZXMgPSBjbGFzc0xvYWRlci5nZXRDbGFzc1BhdGgoKS5sZW5ndGgKKworICAgICAgICBjbGFzc0xvYWRlci5hZGRDbGFzc3BhdGgobmV3Q2xhc3NwYXRoRW50cnkpCisgICAgICAgIGFzc2VydCBpbml0aWFsTnVtYmVyT2ZDbGFzc3BhdGhFbnRyaWVzICsgMSA9PSBjbGFzc0xvYWRlci5nZXRDbGFzc1BhdGgoKS5sZW5ndGgKKyAgICAgICAgYXNzZXJ0IGNvbnRhaW5zKGNsYXNzTG9hZGVyLmdldENsYXNzUGF0aCgpLG5ld0NsYXNzcGF0aEVudHJ5KQorCisgICAgICAgIGNsYXNzTG9hZGVyLmFkZENsYXNzcGF0aChuZXdDbGFzc3BhdGhFbnRyeSk7CisgICAgICAgIGFzc2VydCBpbml0aWFsTnVtYmVyT2ZDbGFzc3BhdGhFbnRyaWVzICsgMSA9PSBjbGFzc0xvYWRlci5nZXRDbGFzc1BhdGgoKS5sZW5ndGgKKyAgICAgICAgYXNzZXJ0IGNvbnRhaW5zKGNsYXNzTG9hZGVyLmdldENsYXNzUGF0aCgpLG5ld0NsYXNzcGF0aEVudHJ5KQorICAgIH0KKyAgICAKKyAgICBkZWYgZ2V0UGF0aHMoVVJMQ2xhc3NMb2FkZXIgdWNsKSB7CisgICAgICAgIGRlZiB1cmxzID0gdWNsLmdldFVSTHMoKQorICAgICAgICByZXR1cm4gdXJscy5maW5kQWxsIHshaXQuZmlsZS5lbmRzV2l0aCgiLmphciIpfQorICAgIH0KKworICAgIGRlZiBnZXRQYXRocyhTdHJpbmcgcGF0aCkgeworICAgICAgICBpbnQgc3RhcnQgPSAwLCBlbmQ9MAorICAgICAgICBTdHJpbmcgc2VwID0gRmlsZS5wYXRoU2VwYXJhdG9yCisgICAgICAgIGRlZiByZXQgPSBbXQorICAgICAgICB3aGlsZSAoZW5kPHBhdGgubGVuZ3RoKCkpIHsKKyAgICAgICAgICBzdGFydCA9IGVuZAorICAgICAgICAgIGVuZCA9IHBhdGguaW5kZXhPZihzZXAsZW5kKQorICAgICAgICAgIGlmIChlbmQ9PS0xKSBicmVhaworICAgICAgICAgIGRlZiBzdWIgPSBwYXRoLnN1YnN0cmluZyhzdGFydCxlbmQpCisgICAgICAgICAgaWYgKCFzdWIuZW5kc1dpdGgoIi5qYXIiKSkgeworICAgICAgICAgICAgcmV0IDw8ICgobmV3IEZpbGUoc3ViKSkudG9VUkwoKSkKKyAgICAgICAgICB9CisgICAgICAgICAgZW5kKysKKyAgICAgICAgfQorICAgICAgcmV0dXJuIHJldCAKKyAgICB9CisKKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NOb3RGb3VuZElzTm90SGlkZGVuKCkgeworICAgICAgZGVmIHBhdGhzPVtdCisgICAgICBkZWYgbG9hZGVyID0gdGhpcy5jbGFzcy5jbGFzc0xvYWRlcgorICAgICAgd2hpbGUgKGxvYWRlciE9bnVsbCkgeworICAgICAgICBpZiAobG9hZGVyIGluc3RhbmNlb2YgVVJMQ2xhc3NMb2FkZXIpIHsgCisgICAgICAgICAgcGF0aHMgKz0gZ2V0UGF0aHMobG9hZGVyKQorICAgICAgICB9CisgICAgICAgIGxvYWRlciA9IGxvYWRlci5wYXJlbnQKKyAgICAgIH0KKyAgICAgIHBhdGhzICs9IGdldFBhdGhzKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5jbGFzcy5wYXRoIikpCisgICAgICBwYXRocz1wYXRocy51bmlxdWUoKQorCisgICAgICBkZWYgZmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoIkZvbyIsIi5ncm9vdnkiKQorICAgICAgZGVmIG5hbWUgPSBmaWxlLm5hbWUtIi5ncm9vdnkiCisgICAgICBkZWYgc2NyaXB0ID0gIiIiCisgICAgICAgIGNsYXNzICRuYW1lIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2V7fQorICAgICAgIiIiCisgICAgICBmaWxlIDw8IHNjcmlwdAorICAgICAgcGF0aHMgPDwgZmlsZS5wYXJlbnRGaWxlLnRvVVJMKCkKKyAgICAgIGRlZiBjbCA9IG5ldyBVUkxDbGFzc0xvYWRlcihwYXRocyBhcyBVUkxbXSxudWxsKQorICAgICAgZGVmIGdjbCA9IG5ldyBHcm9vdnlDbGFzc0xvYWRlcihjbCkKKyAgICAgIHRyeSB7CisgICAgICAgIGdjbC5sb2FkQ2xhc3MobmFtZSkKKyAgICAgICAgYXNzZXJ0IGZhbHNlCisgICAgICB9IGNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBuY2RmZSkgeworICAgICAgICAvLyBUT0RPOiBoYWNrIGZvciBydW5uaW5nIHdoZW4gdW5kZXIgY292ZXJhZ2UgLSBmaW5kIGEgYmV0dGVyIHdheQorICAgICAgICBhc3NlcnQgbmNkZmUubWVzc2FnZS5pbmRleE9mKCJUZXN0Q2FzZSIpPjAgfHwgbmNkZmUubWVzc2FnZS5pbmRleE9mKCJjb2JlcnR1cmEiKT4wIAorICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NQYXRoTm90RGVyaXZlZCgpIHsKKyAgICAgIGRlZiBjb25maWcgPSBuZXcgQ29tcGlsZXJDb25maWd1cmF0aW9uKCkKKyAgICAgIGRlZiBsb2FkZXIxID0gbmV3IEdyb292eUNsYXNzTG9hZGVyKG51bGwsY29uZmlnKQorICAgICAgY29uZmlnID0gbmV3IENvbXBpbGVyQ29uZmlndXJhdGlvbigpCisgICAgICBjb25maWcuc2V0Q2xhc3NwYXRoKCJmb28iKQorICAgICAgZGVmIGxvYWRlcjIgPSBuZXcgR3Jvb3Z5Q2xhc3NMb2FkZXIobG9hZGVyMSxjb25maWcpCisgICAgICBjb25maWcgPSBuZXcgQ29tcGlsZXJDb25maWd1cmF0aW9uKCkKKyAgICAgIGRlZiBsb2FkZXIzID0gbmV3IEdyb292eUNsYXNzTG9hZGVyKGxvYWRlcjIsY29uZmlnKQorICAgICAgZGVmIHVybHMgPSBsb2FkZXIxLlVSTHMKKyAgICAgIGFzc2VydCB1cmxzLmxlbmd0aCA9PSAwCisgICAgICB1cmxzID0gbG9hZGVyMi5VUkxzCisgICAgICBhc3NlcnQgdXJscy5sZW5ndGggPT0gMQorICAgICAgYXNzZXJ0IHVybHNbMF0udG9TdHJpbmcoKS5lbmRzV2l0aCgiZm9vIikKKyAgICAgIHVybHMgPSBsb2FkZXIzLlVSTHMKKyAgICAgIGFzc2VydCB1cmxzLmxlbmd0aCA9PSAwICAgIAorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGl0aHJlYWRpbmcoKSB7CisgICAgICBkZWYgY29uZmlnID0gbmV3IENvbXBpbGVyQ29uZmlndXJhdGlvbigpCisgICAgICBjb25maWcucmVjb21waWxlR3Jvb3Z5U291cmNlID0gdHJ1ZTsKKworICAgICAgZGVmIGxvYWRlciA9IG5ldyBHcm9vdnlDbGFzc0xvYWRlclRlc3RDdXN0b21HQ0woY29uZmlnKQorCisgICAgICBkZWYgdHMgPSBuZXcgVGhyZWFkWzEwMF0KKyAgICAgIGZvciAoaSBpbiAwLi48MTAwKSB7CisgICAgICAgIHRzW2ldID0gVGhyZWFkLnN0YXJ0IHsKKyAgICAgICAgICBpZiAoaSUyPT0xKSBzbGVlcCgxMDApCisgICAgICAgICAgYXNzZXJ0IEdyb292eUNsYXNzTG9hZGVyVGVzdEZvbzE9PWxvYWRlci5sb2FkQ2xhc3MoIkZvb3giKQorICAgICAgICB9IAorICAgICAgfQorICAgICAgc2xlZXAoMTAwKQorICAgICAgZm9yIChpIGluIDAuLjwxMDApIHt0c1tpXS5qb2luKCl9CisKKyAgICAgIGFzc2VydCBHcm9vdnlDbGFzc0xvYWRlclRlc3RGb28yPT1sb2FkZXIubG9hZENsYXNzKCJGb294IikKKyAgIH0KKyAgIAorICAgcHVibGljIHZvaWQgdGVzdEFkZGl0aW9uYWxQaGFzZU9wZXJhdGlvbigpeworICAgICAgZGVmIGxvYWRlciA9IG5ldyBHcm9vdnlDbGFzc0xvYWRlclRlc3RDdXN0b21QaGFzZU9wZXJhdGlvbigpCisgICAgICBkZWYgcmV0ID0gbG9hZGVyLnBhcnNlQ2xhc3MoIiIiY2xhc3MgRm9ve30iIiIpCisgICAgICBkZWYgZmllbGQgPSByZXQuZGVjbGFyZWRGaWVsZHMuZmluZCB7aXQubmFtZT09ImlkIiAmJiBpdC50eXBlPT1Mb25nLlRZUEV9CisgICAgICBhc3NlcnQgIGZpZWxkICE9IG51bGwKKyAgfQorfQorCitjbGFzcyBHcm9vdnlDbGFzc0xvYWRlclRlc3RGb28xe30KK2NsYXNzIEdyb292eUNsYXNzTG9hZGVyVGVzdEZvbzJ7fQorCitjbGFzcyBHcm9vdnlDbGFzc0xvYWRlclRlc3RDdXN0b21HQ0wgZXh0ZW5kcyBHcm9vdnlDbGFzc0xvYWRlcnsKKyAgICBkZWYgR3Jvb3Z5Q2xhc3NMb2FkZXJUZXN0Q3VzdG9tR0NMKGNvbmZpZykgeworICAgICAgc3VwZXIobnVsbCxjb25maWcpOworICAgIH0KKyAgICBkZWYgY291bnRlciA9IDAKKyAgICBwcm90ZWN0ZWQgQ2xhc3MgcmVjb21waWxlKFVSTCBzb3VyY2UsIFN0cmluZyBuYW1lLCBDbGFzcyBvbGRDbGFzcykgeworICAgICAgICBpZiAobmFtZT09IkZvb3giKSB7CisgICAgCQlpZiAoY291bnRlcjwxMDApIHsKKyAgICAJCSAgY291bnRlcisrCisgICAgCQkgIHJldHVybiBHcm9vdnlDbGFzc0xvYWRlclRlc3RGb28xCisgICAgCQl9IGVsc2UgeworICAgIAkJICByZXR1cm4gR3Jvb3Z5Q2xhc3NMb2FkZXJUZXN0Rm9vMgorICAgIAkJfQorICAgIAl9CisgICAgCXJldHVybiBzdXBlci5yZWNvbXBpbGUoc291cmNlLG5hbWUsb2xkQ2xhc3MpCisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNTb3VyY2VOZXdlcihVUkwgc291cmNlLCBDbGFzcyBjbHMpIHsKKyAgICAgIHJldHVybiB0cnVlCisgICAgfQorfQorCitjbGFzcyBHcm9vdnlDbGFzc0xvYWRlclRlc3RQcm9wZXJ0eUFkZGVyIGV4dGVuZHMgQ29tcGlsYXRpb25Vbml0LlByaW1hcnlDbGFzc05vZGVPcGVyYXRpb24geworICB2b2lkIGNhbGwoU291cmNlVW5pdCBzb3VyY2UsIEdlbmVyYXRvckNvbnRleHQgY29udGV4dCwgQ2xhc3NOb2RlIGNsYXNzTm9kZSkgeworICAgICBjbGFzc05vZGUuYWRkUHJvcGVydHkoImlkIiwgQ2xhc3NOb2RlLkFDQ19QVUJMSUMsIENsYXNzSGVscGVyLmxvbmdfVFlQRSxudWxsLG51bGwsbnVsbCk7CisgIH0KK30gCisKK2NsYXNzIEdyb292eUNsYXNzTG9hZGVyVGVzdEN1c3RvbVBoYXNlT3BlcmF0aW9uIGV4dGVuZHMgR3Jvb3Z5Q2xhc3NMb2FkZXIgeworICBDb21waWxhdGlvblVuaXQgY3JlYXRlQ29tcGlsYXRpb25Vbml0KENvbXBpbGVyQ29uZmlndXJhdGlvbiBjb25maWcsIENvZGVTb3VyY2Ugc291cmNlKSB7CisgICAgICBkZWYgY3UgPSBzdXBlci5jcmVhdGVDb21waWxhdGlvblVuaXQoY29uZmlnLHNvdXJjZSkKKyAgICAgIGN1LmFkZFBoYXNlT3BlcmF0aW9uKG5ldyBHcm9vdnlDbGFzc0xvYWRlclRlc3RQcm9wZXJ0eUFkZGVyKCksUGhhc2VzLkNPTlZFUlNJT04pIAorICAgICAgcmV0dXJuIGN1CisgIH0gICAgCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9sYW5nL0dyb292eUxvZ1Rlc3RDYXNlVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2xhbmcvR3Jvb3Z5TG9nVGVzdENhc2VUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTExZWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9sYW5nL0dyb292eUxvZ1Rlc3RDYXNlVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwzMyBAQAorcGFja2FnZSBncm9vdnkubGFuZworCitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuKgorCisvKioKK1Nob3dpbmcgdXNhZ2Ugb2YgdGhlIEdyb292eUxvZ1Rlc3RDYXNlCitAYXV0aG9yIERpZXJrIEtvZW5pZworKiovCisKK2NsYXNzIEdyb292eUxvZ1Rlc3RDYXNlVGVzdCBleHRlbmRzIEdyb292eUxvZ1Rlc3RDYXNlIHsKKworICAgIHN0YXRpYyBmaW5hbCBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKCdncm9vdnkubGFuZy5Hcm9vdnlMb2dUZXN0Q2FzZVRlc3QnKQorCisgICAgdm9pZCBsb2dnZWRNZXRob2QoKSB7CisgICAgICAgIExPRy5maW5lciAnc29tZSBsb2cgZW50cnknCisgICAgfQorCisgICAgdm9pZCB0ZXN0U3RyaW5nTG9nKCl7CisgICAgICAgIGRlZiByZXN1bHQgPSBzdHJpbmdMb2coTGV2ZWwuRklORVIsICdncm9vdnkubGFuZy5Hcm9vdnlMb2dUZXN0Q2FzZVRlc3QnKSB7CisgICAgICAgICAgICBsb2dnZWRNZXRob2QoKQorICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUgcmVzdWx0LCByZXN1bHQuY29udGFpbnMoJ3NvbWUgbG9nIGVudHJ5JykKKyAgICB9CisKKyAgICB2b2lkIHRlc3RDb21iaW5lZFVzYWdlRm9yTWV0YUNsYXNzKCl7CisgICAgICAgIGRlZiByZXN1bHQgPSB3aXRoTGV2ZWwoTGV2ZWwuRklORVIsICdncm9vdnkubGFuZy5NZXRhQ2xhc3MnKSB7CisgICAgICAgICAgICBzdHJpbmdMb2coTGV2ZWwuRklORVIsICdtZXRob2RDYWxscycpeworICAgICAgICAgICAgICAgICdoaScudG9TdHJpbmcoKQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUgcmVzdWx0LCByZXN1bHQuY29udGFpbnMoJ2phdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKScpCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvbGFuZy9Hcm9vdnlTaGVsbFRlc3QuamF2YSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvbGFuZy9Hcm9vdnlTaGVsbFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzEyMTNmCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9sYW5nL0dyb292eVNoZWxsVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTEyIEBACisvKgorICogJElkJHZlcnNpb24KKyAqIE5vdiAyMywgMjAwMyA5OjAyOjU1IFBNICR1c2VyIEV4cCAkCisgKiAKKyAqIENvcHlyaWdodCAyMDAzIChDKSBTYW0gUHVsbGFyYS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZQorICogZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluCisgKiBjb3B5cmlnaHQgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEgY29weQorICogb2YgdGhpcyBkb2N1bWVudC4gMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIDMuCisgKiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiBGb3IKKyAqIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuIDQuIFByb2R1Y3RzIGRlcml2ZWQKKyAqIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IiBub3IgbWF5ICJncm9vdnkiIGFwcGVhciBpbgorICogdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhCisgKiByZWdpc3RlcmVkIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZQorICogQ29kZWhhdXMgLSBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgKiBEQU1BR0UuCisgKiAgCisgKi8KK3BhY2thZ2UgZ3Jvb3Z5Lmxhbmc7CisKK2ltcG9ydCBncm9vdnkudXRpbC5Hcm9vdnlUZXN0Q2FzZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5Db21waWxlckNvbmZpZ3VyYXRpb247CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogQGF1dGhvciBzYW0KKyAqICAgICAgICAgPHAvPgorICogICAgICAgICBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0KKyAqICAgICAgICAgUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKKyAqLworcHVibGljIGNsYXNzIEdyb292eVNoZWxsVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgU3RyaW5nIHNjcmlwdDEgPSAidGVzdCA9IDEiOworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisgICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKEdyb292eVNoZWxsVGVzdC5jbGFzcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEV4ZWN1dGVTY3JpcHQoKSB7CisgICAgICAgIEdyb292eVNoZWxsIHNoZWxsID0gbmV3IEdyb292eVNoZWxsKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gc2hlbGwuZXZhbHVhdGUobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHNjcmlwdDEuZ2V0Qnl0ZXMoKSksICJUZXN0Lmdyb292eSIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEpLCByZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChlLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJvcGVydHlIb2xkZXIgeworICAgICAgICBwcml2YXRlIE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOworCisgICAgICAgIHB1YmxpYyB2b2lkIHNldChTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgICAgIG1hcC5wdXQoa2V5LCB2YWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IGdldChTdHJpbmcga2V5KSB7CisgICAgICAgICAgICByZXR1cm4gbWFwLmdldChrZXkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgc2NyaXB0MiA9ICJ0ZXN0LnByb3AgPSAyXG5yZXR1cm4gdGVzdC5wcm9wIjsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RFeGVjdXRlU2NyaXB0V2l0aENvbnRleHQoKSB7CisgICAgICAgIEJpbmRpbmcgY29udGV4dCA9IG5ldyBCaW5kaW5nKCk7CisgICAgICAgIGNvbnRleHQuc2V0VmFyaWFibGUoInRlc3QiLCBuZXcgUHJvcGVydHlIb2xkZXIoKSk7CisgICAgICAgIEdyb292eVNoZWxsIHNoZWxsID0gbmV3IEdyb292eVNoZWxsKGNvbnRleHQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IHNoZWxsLmV2YWx1YXRlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzY3JpcHQyLmdldEJ5dGVzKCkpLCAiVGVzdC5ncm9vdnkiKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigyKSwgcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoZS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTY3JpcHRXaXRoRGVyaXZlZEJhc2VDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBCaW5kaW5nIGNvbnRleHQgPSBuZXcgQmluZGluZygpOworICAgICAgICBDb21waWxlckNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IENvbXBpbGVyQ29uZmlndXJhdGlvbigpOworICAgICAgICBjb25maWcuc2V0U2NyaXB0QmFzZUNsYXNzKERlcml2ZWRTY3JpcHQuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAgICAgR3Jvb3Z5U2hlbGwgc2hlbGwgPSBuZXcgR3Jvb3Z5U2hlbGwoY29udGV4dCwgY29uZmlnKTsKKyAgICAgICAgT2JqZWN0IHJlc3VsdCA9IHNoZWxsLmV2YWx1YXRlKCJ4ID0gJ2FiYyc7IGRvU29tZXRoaW5nKGNoZWVzZSkiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJIGxpa2UgQ2hlZGRhciIsIHJlc3VsdCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYWJjIiwgY29udGV4dC5nZXRWYXJpYWJsZSgieCIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2xhbmcvR3Jvb3Z5U3lzdGVtVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2xhbmcvR3Jvb3Z5U3lzdGVtVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JhMzY1OQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvbGFuZy9Hcm9vdnlTeXN0ZW1UZXN0Lmdyb292eQpAQCAtMCwwICsxLDE3IEBACitwYWNrYWdlIGdyb292eS5sYW5nCisKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy4qCisKKy8qKgorICogVGVzdHMgZm9yIHRoZSBHcm9vdnlTeXN0ZW0gY2xhc3MKKyAqCisgKiBAYXV0aG9yIEdyYWVtZSBSb2NoZXIKKyAqKi8KKworY2xhc3MgR3Jvb3Z5U3lzdGVtVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIHZvaWQgdGVzdEdldE1ldGFDbGFzc1JlZ2lzdHJ5KCkgeworICAgICAgICBhc3NlcnQgR3Jvb3Z5U3lzdGVtLm1ldGFDbGFzc1JlZ2lzdHJ5CisgICAgICAgIGFzc2VydCBHcm9vdnlTeXN0ZW0uZ2V0TWV0YUNsYXNzUmVnaXN0cnkoKQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2xhbmcvSW5uZXJDbGFzc1Jlc29sdmluZ1Rlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9sYW5nL0lubmVyQ2xhc3NSZXNvbHZpbmdUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2VhZTMxCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9sYW5nL0lubmVyQ2xhc3NSZXNvbHZpbmdUZXN0Lmdyb292eQpAQCAtMCwwICsxLDIwIEBACitwYWNrYWdlIGdyb292eS5sYW5nDQorDQorY2xhc3MgSW5uZXJDbGFzc1Jlc29sdmluZ1Rlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7DQorICAgIHB1YmxpYyB2b2lkIHRlc3RJbm5lckNsYXNzKCkgew0KKyAgICAgICAgLy8gVGhyZWFkLlVuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlciB3YXMgYWRkZWQgaW4gSmF2YSAxLjUNCisgICAgICAgIGlmIChTeXN0ZW0ucHJvcGVydGllcy4namF2YS52ZXJzaW9uJ1syXSA+PSAnNScpIHsNCisgICAgICAgICAgICBkZWYgc2NyaXB0ID0gJycnDQorICAgICAgICAgICAgICAgIGRlZiBjYXVnaHQgPSBmYWxzZQ0KKyAgICAgICAgICAgICAgICBkZWYgdCA9IFRocmVhZC5zdGFydCB7DQorICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2V0RGVmYXVsdFVuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlcigNCisgICAgICAgICAgICAgICAgICAgICAgICB7dGhyZWFkLGV4IC0+IGNhdWdodD10cnVlfSBhcyBUaHJlYWQuVW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyKQ0KKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiaHVodSIpDQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgdC5qb2luKCkNCisgICAgICAgICAgICAgICAgYXNzZXJ0IGNhdWdodD09dHJ1ZQ0KKyAgICAgICAgICAgICcnJw0KKyAgICAgICAgICAgIG5ldyBHcm9vdnlTaGVsbCgpLmV2YWx1YXRlKHNjcmlwdCkNCisgICAgICAgIH0NCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2xhbmcvSW50UmFuZ2VUZXN0LmphdmEgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2xhbmcvSW50UmFuZ2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUzZmRhYQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvbGFuZy9JbnRSYW5nZVRlc3QuamF2YQpAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAkSWQkCisKKyBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAorIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0CisgICAgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhCisgICAgY29weSBvZiB0aGlzIGRvY3VtZW50LgorCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQorICAgIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKKyAgICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKKyAgICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCisgICAgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCisKKyA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IgorICAgIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQKKyAgICB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgorCisgNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KKyAgICBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMKKyBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKKyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCisgVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICovCitwYWNrYWdlIGdyb292eS5sYW5nOworCisvKioKKyAqIFByb3ZpZGVzIHVuaXQgdGVzdHMgZm9yIHRoZSA8Y29kZT5JbnRSYW5nZTwvY29kZT4gY2xhc3MuCisgKgorICogQGF1dGhvciBKYW1lcyBTdHJhY2hhbgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgSW50UmFuZ2VUZXN0IGV4dGVuZHMgTnVtYmVyUmFuZ2VUZXN0IHsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVUb29CaWdSYW5nZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNyZWF0ZVJhbmdlKDAsIEludGVnZXIuTUFYX1ZBTFVFKTsKKyAgICAgICAgICAgIGZhaWwoInRvbyBsYXJnZSByYW5nZSBhY2NlcHRlZCIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiZXhwZWN0ZWQgZXhjZXB0aW9uIHRocm93biIsIHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgcHJvdmlkaW5nIGludmFsaWQgYXJndW1lbnRzIHRvIHRoZSBwcm90ZWN0ZWQgY29uc3RydWN0b3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRBcmd1bWVudHNUb0NvbnN0cnVjdG9yKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IEludFJhbmdlKDIsIDEsIHRydWUpOworICAgICAgICAgICAgZmFpbCgiaW52YWxpZCByYW5nZSBjcmVhdGVkIik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJleHBlY3RlZCBleGNlcHRpb24gdGhyb3duIiwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBnZXR0aW5nIHRoZSB0byBhbmQgZnJvbSB2YWx1ZXMgYXMgPGNvZGU+aW50PC9jb2RlPnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldFRvRnJvbUludCgpIHsKKyAgICAgICAgZmluYWwgaW50IGZyb20gPSAzLCB0byA9IDc7CisgICAgICAgIGZpbmFsIEludFJhbmdlIHJhbmdlID0gbmV3IEludFJhbmdlKGZyb20sIHRvKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3cm9uZyAnZnJvbSciLCBmcm9tLCByYW5nZS5nZXRGcm9tSW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIndyb25nICd0byciLCB0bywgcmFuZ2UuZ2V0VG9JbnQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHByb3RlY3RlZCBDb21wYXJhYmxlIGNyZWF0ZVZhbHVlKGludCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gbmV3IEludGVnZXIodmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUmFuZ2UgY3JlYXRlUmFuZ2UoaW50IGZyb20sIGludCB0bykgeworICAgICAgICByZXR1cm4gbmV3IEludFJhbmdlKGZyb20sIHRvKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2xhbmcvSW50ZWdlclJhbmdlVGVzdC5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9sYW5nL0ludGVnZXJSYW5nZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjQ1M2IxCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9sYW5nL0ludGVnZXJSYW5nZVRlc3QuamF2YQpAQCAtMCwwICsxLDcwIEBACisvKgorICRJZDogSW50ZWdlclJhbmdlVGVzdC5qYXZhLHYgMS4xIDIwMDYvMTEvMTMgMTA6MjM6NTggZWR3aW4gRXhwIGVkd2luICQKKworIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCisgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQKKyAgICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKKyAgICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCisgICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQorICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgorICAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKKyAgICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KKworIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCisgICAgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAorICAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCisKKyA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQorICAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLworCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUworIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAorIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKKyBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgKi8KK3BhY2thZ2UgZ3Jvb3Z5Lmxhbmc7CisKKworLyoqCisgKiBUZXN0cyB7QGxpbmsgT2JqZWN0UmFuZ2V9cyBvZiB7QGxpbmsgSW50ZWdlcn1zLgorICoKKyAqIEBhdXRob3IgRWR3aW4gVGVsbG1hbgorICovCitwdWJsaWMgY2xhc3MgSW50ZWdlclJhbmdlVGVzdCBleHRlbmRzIE51bWJlclJhbmdlVGVzdCB7CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHJvdGVjdGVkIFJhbmdlIGNyZWF0ZVJhbmdlKGludCBmcm9tLCBpbnQgdG8pIHsKKyAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RSYW5nZShuZXcgSW50ZWdlcihmcm9tKSwgbmV3IEludGVnZXIodG8pKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHJvdGVjdGVkIENvbXBhcmFibGUgY3JlYXRlVmFsdWUoaW50IHZhbHVlKSB7CisgICAgICAgIHJldHVybiBuZXcgSW50ZWdlcih2YWx1ZSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2xhbmcvSW50ZXJjZXB0b3JUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvbGFuZy9JbnRlcmNlcHRvclRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMTZkNmYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2xhbmcvSW50ZXJjZXB0b3JUZXN0Lmdyb292eQpAQCAtMCwwICsxLDkxIEBACitwYWNrYWdlIGdyb292eS5sYW5nCisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuU3RyaW5nQnVmZmVyV3JpdGVyCisKKy8qKgorKiBUZXN0IGZvciB0aGUgSW50ZXJjZXB0b3IgSW50ZXJmYWNlIHVzYWdlIGFzIGltcGxlbWVudGVkIGJ5IHRoZQorKiBUcmFjaW5nSW50ZXJjZXB0b3IuIE1ha2VzIGFsc28gdXNlIG9mIHRoZSBQcm94eU1ldGFDbGFzcyBhbmQKKyogc2hvd3MgdGhlIGNvbGxhYm9yYXRpb24uCisqIEFzIGEgc2lkZSBFZmZlY3QsIHRoZSBQcm94eU1ldGFDbGFzcyBpcyBhbHNvIHBhcnRseSB0ZXN0ZWQuCisqIEBhdXRob3IgRGllcmsgS29lbmlnCisqKi8KK2NsYXNzIEludGVyY2VwdG9yVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNleworCisgICAgZGVmIEludGVyY2VwdG9yIGxvZ0ludGVyY2VwdG9yCisgICAgZGVmIFN0cmluZ0J1ZmZlciBsb2cKKyAgICBkZWYgaW50ZXJjZXB0YWJsZSAgIC8vIHRoZSBvYmplY3QgdG8gaW50ZXJjZXB0IG1ldGhvZCBjYWxscyBvbgorICAgIGRlZiBwcm94eQorCisgICAgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgbG9nSW50ZXJjZXB0b3IgPSBuZXcgVHJhY2luZ0ludGVyY2VwdG9yKCkKKyAgICAgICAgbG9nID0gbmV3IFN0cmluZ0J1ZmZlcigiXG4iKQorICAgICAgICBsb2dJbnRlcmNlcHRvci53cml0ZXIgPSBuZXcgU3RyaW5nQnVmZmVyV3JpdGVyKGxvZykKKyAgICAgICAgLy8gd2UgaW50ZXJjZXB0IGNhbGxzIGZyb20gR3Jvb3Z5IHRvIHRoZSBqYXZhLmxhbmcuU3RyaW5nIG9iamVjdAorICAgICAgICBpbnRlcmNlcHRhYmxlID0gJ0ludGVyY2VwdGFibGUgU3RyaW5nJworICAgICAgICBwcm94eSA9IFByb3h5TWV0YUNsYXNzLmdldEluc3RhbmNlKGludGVyY2VwdGFibGUuY2xhc3MpCisgICAgICAgIHByb3h5LnNldEludGVyY2VwdG9yKGxvZ0ludGVyY2VwdG9yKQorICAgIH0KKworICAgIHZvaWQgdGVzdFNpbXBsZUludGVyY2VwdGlvbigpIHsKKyAgICAgICAgcHJveHkudXNlIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyAyMCwgaW50ZXJjZXB0YWJsZS5zaXplKCkKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyAyMCwgaW50ZXJjZXB0YWJsZS5sZW5ndGgoKQorICAgICAgICAgICAgYXNzZXJ0VHJ1ZSBpbnRlcmNlcHRhYmxlLnN0YXJ0c1dpdGgoJ0knLDApCisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorIiIiCitiZWZvcmUgamF2YS5sYW5nLlN0cmluZy5zaXplKCkKK2FmdGVyICBqYXZhLmxhbmcuU3RyaW5nLnNpemUoKQorYmVmb3JlIGphdmEubGFuZy5TdHJpbmcubGVuZ3RoKCkKK2FmdGVyICBqYXZhLmxhbmcuU3RyaW5nLmxlbmd0aCgpCitiZWZvcmUgamF2YS5sYW5nLlN0cmluZy5zdGFydHNXaXRoKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5JbnRlZ2VyKQorYWZ0ZXIgIGphdmEubGFuZy5TdHJpbmcuc3RhcnRzV2l0aChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuSW50ZWdlcikKKyIiIiwgbG9nLnRvU3RyaW5nKCkpCisgICAgfQorCisgICAgdm9pZCB0ZXN0Tm9JbnRlcmNlcHRpb25XaXRoTnVsbEludGVyY2VwdG9yKCkgeworICAgICAgICBwcm94eS5zZXRJbnRlcmNlcHRvcihudWxsKQorICAgICAgICBwcm94eS51c2UgeworICAgICAgICAgICAgaW50ZXJjZXB0YWJsZS5zaXplKCkKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgdGVzdENvbnN0cnVjdG9ySW50ZXJjZXB0aW9uKCkgeworICAgICAgICBwcm94eS51c2UgeworICAgICAgICAgICAgbmV3IFN0cmluZygnc29tZSBzdHJpbmcnKQorICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscygKKyIiIgorYmVmb3JlIGphdmEubGFuZy5TdHJpbmcuY3RvcihqYXZhLmxhbmcuU3RyaW5nKQorYWZ0ZXIgIGphdmEubGFuZy5TdHJpbmcuY3RvcihqYXZhLmxhbmcuU3RyaW5nKQorIiIiLCBsb2cudG9TdHJpbmcoKSkKKyAgICB9CisKKyAgICB2b2lkIHRlc3RTdGF0aWNNZXRob2RJbnRlcmNlcHRpb24oKSB7CisgICAgICAgIHByb3h5LnVzZSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMgJ3RydWUnLCBTdHJpbmcudmFsdWVPZih0cnVlKQorICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscygKKyIiIgorYmVmb3JlIGphdmEubGFuZy5TdHJpbmcudmFsdWVPZihqYXZhLmxhbmcuQm9vbGVhbikKK2FmdGVyICBqYXZhLmxhbmcuU3RyaW5nLnZhbHVlT2YoamF2YS5sYW5nLkJvb2xlYW4pCisiIiIsIGxvZy50b1N0cmluZygpKQorICAgIH0KKworICAgIHZvaWQgdGVzdEludGVyY2VwdGlvbk9mR3Jvb3Z5Q2xhc3NlcygpeworICAgICAgICBkZWYgc2xpY2VyID0gbmV3IGdyb292eS5tb2NrLmV4YW1wbGUuQ2hlZXNlU2xpY2VyKCkKKyAgICAgICAgZGVmIHByb3h5ID0gUHJveHlNZXRhQ2xhc3MuZ2V0SW5zdGFuY2Uoc2xpY2VyLmNsYXNzKQorICAgICAgICBwcm94eS5zZXRJbnRlcmNlcHRvcihsb2dJbnRlcmNlcHRvcikKKyAgICAgICAgcHJveHkudXNlKHNsaWNlcikgeworICAgICAgICAgICAgc2xpY2VyLmNvZmZlZUJyZWFrKCcnKQorICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscygKKyIiIgorYmVmb3JlIGdyb292eS5tb2NrLmV4YW1wbGUuQ2hlZXNlU2xpY2VyLmNvZmZlZUJyZWFrKGphdmEubGFuZy5TdHJpbmcpCithZnRlciAgZ3Jvb3Z5Lm1vY2suZXhhbXBsZS5DaGVlc2VTbGljZXIuY29mZmVlQnJlYWsoamF2YS5sYW5nLlN0cmluZykKKyIiIiwgbG9nLnRvU3RyaW5nKCkpCisgICAgfQorfQorCisKKwpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9sYW5nL0xvbmdSYW5nZVRlc3QuamF2YSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvbGFuZy9Mb25nUmFuZ2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThlNzNjNgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvbGFuZy9Mb25nUmFuZ2VUZXN0LmphdmEKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAkSWQ6IExvbmdSYW5nZVRlc3QuamF2YSx2IDEuMSAyMDA2LzExLzEzIDEwOjIzOjU4IGVkd2luIEV4cCBlZHdpbiAkCisKKyBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAorIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0CisgICAgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhCisgICAgY29weSBvZiB0aGlzIGRvY3VtZW50LgorCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQorICAgIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKKyAgICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKKyAgICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCisgICAgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCisKKyA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IgorICAgIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQKKyAgICB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgorCisgNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KKyAgICBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMKKyBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKKyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCisgVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICovCitwYWNrYWdlIGdyb292eS5sYW5nOworCisKKy8qKgorICogVGVzdHMge0BsaW5rIE9iamVjdFJhbmdlfXMgb2Yge0BsaW5rIExvbmd9cy4KKyAqCisgKiBAYXV0aG9yIEVkd2luIFRlbGxtYW4KKyAqLworcHVibGljIGNsYXNzIExvbmdSYW5nZVRlc3QgZXh0ZW5kcyBOdW1iZXJSYW5nZVRlc3QgeworCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHByb3RlY3RlZCBSYW5nZSBjcmVhdGVSYW5nZShpbnQgZnJvbSwgaW50IHRvKSB7CisgICAgICAgIHJldHVybiBuZXcgT2JqZWN0UmFuZ2UobmV3IExvbmcoZnJvbSksIG5ldyBMb25nKHRvKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHByb3RlY3RlZCBDb21wYXJhYmxlIGNyZWF0ZVZhbHVlKGludCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gbmV3IExvbmcodmFsdWUpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9sYW5nL01hcE9mQ2xvc3VyZVRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9sYW5nL01hcE9mQ2xvc3VyZVRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMzRmZDEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2xhbmcvTWFwT2ZDbG9zdXJlVGVzdC5ncm9vdnkKQEAgLTAsMCArMSw5NSBAQAorLyoNCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4NCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCitwYWNrYWdlIGdyb292eS5sYW5nDQorDQorLyoqDQorICogVGVzdHMgbWFwcyBvZiBjbG9zdXJlcyBjb2VyY2VkIHRvIGNsYXNzZXMgYnkgYXNUeXBlKCkNCisgKg0KKyAqIEBhdXRob3IgSm9jaGVuIFRoZW9kb3JvdQ0KKyAqIEBhdXRob3IgR3VpbGxhdW1lIExhZm9yZ2UNCisgKi8NCitjbGFzcyBNYXBPZkNsb3N1cmVUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2Ugew0KKw0KKyAgICB2b2lkIHRlc3RJbnRlcmZhY2VQcm94eSgpIHsNCisgICAgICAgIGRlZiBvdXRlciA9IDENCisgICAgICAgIGRlZiB4ID0gW3J1bjogeyBvdXRlcisrIH1dIGFzIFJ1bm5hYmxlDQorICAgICAgICB4LnJ1bigpDQorDQorICAgICAgICBhc3NlcnQgeCBpbnN0YW5jZW9mIFJ1bm5hYmxlDQorICAgICAgICBhc3NlcnQgb3V0ZXIgPT0gMg0KKyAgICB9DQorDQorICAgIHZvaWQgdGVzdE9iamVjdCgpIHsNCisgICAgICAgIGRlZiBtID0gW2JhcjogeyAiZm9vIiB9XQ0KKyAgICAgICAgZGVmIHggPSBtIGFzIE9iamVjdA0KKw0KKyAgICAgICAgYXNzZXJ0IHguaXMobSkNCisgICAgICAgIGFzc2VydCAiZm9vIiA9PSB4LmJhcigpDQorICAgIH0NCisNCisgICAgdm9pZCB0ZXN0QWJzdHJhY3RDbGFzc1N1YmNsYXNzaW5nKCkgew0KKyAgICAgICAgZGVmIG91dGVyID0gMQ0KKyAgICAgICAgZGVmIHggPSBbcnVuOiB7IG91dGVyKysgfV0gYXMgVGltZXJUYXNrDQorICAgICAgICB4LnJ1bigpDQorICAgICAgICBhc3NlcnQgeCBpbnN0YW5jZW9mIFRpbWVyVGFzaw0KKyAgICAgICAgYXNzZXJ0IG91dGVyID09IDINCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQ2hlY2tzIHB1YmxpYyBhbmQgcHJvdGVjdGVkIG1ldGhvZHMgZnJvbSBwYXJlbnRzIGNhbiBhbHNvIGJlIG92ZXJyaWRlbiBieSB0aGUgTWFwIGNvZXJjaW9uIHRvIGNsYXNzZXMuDQorICAgICAqLw0KKyAgICB2b2lkIHRlc3RPdmVycmlkZVByb3RlY3RlZE1ldGhvZHMoKSB7DQorICAgICAgICBkZWYgYiA9IFtwdWI6IHsgIm1hcCBwdWIiIH0sIHByb3Q6IHsgIm1hcCBwcm90IiB9LCBjaGlsZDogeyAibWFwIGNoaWxkIiB9XSBhcyBCDQorDQorICAgICAgICBhc3NlcnQgIm1hcCBwdWIiID09IGIucHViKCkNCisgICAgICAgIGFzc2VydCAibWFwIHByb3QiID09IGIucHJvdCgpDQorICAgICAgICBhc3NlcnQgIm1hcCBjaGlsZCIgPT0gYi5jaGlsZCgpDQorICAgICAgICBhc3NlcnQgImFic3RyYWN0IiA9PSBiLmFic3RyYWN0TWV0aG9kKCkNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQ2hlY2tzIHRoYXQgYWJzdHJhY3QgbWV0aG9kcyBjYW4gYWxzbyBiZSBvdmVycmlkZW4uDQorICAgICAqLw0KKyAgICB2b2lkIHRlc3RBYnN0cmFjdE1ldGhvZElzT3ZlcnJpZGVkKCkgew0KKyAgICAgICAgZGVmIGEgPSBbYWJzdHJhY3RNZXRob2Q6IHsgIm1hcCBhYnN0cmFjdCIgfV0gYXMgQQ0KKw0KKyAgICAgICAgYXNzZXJ0ICJtYXAgYWJzdHJhY3QiID09IGEuYWJzdHJhY3RNZXRob2QoKQ0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBWZXJpZnkgdGhhdCBjb21wbGV4IG1ldGhvZCBzaWduYXR1cmVzLCBldmVuIHdpdGggcHJpbWl0aXZlIHR5cGVzIGFuZCBhcnJheXMsIGNhbiBiZSBvdmVycmlkZW4uDQorICAgICAqLw0KKyAgICB2b2lkIHRlc3RDb21wbGV4TWV0aG9kU2lnbmF0dXJlKCkgew0KKyAgICAgICAgZGVmIGMgPSBbZm9vOiB7IGludCBhLCBMaXN0IGIsIERvdWJsZVtdIGMgLT4gWyJtYXAgZm9vIl0gYXMgU3RyaW5nW10gfV0gYXMgQw0KKw0KKyAgICAgICAgYXNzZXJ0IFsibWFwIGZvbyJdIGFzIFN0cmluZ1tdID09IGMuZm9vKDEsIFsnYScsICdiJ10sIFswLjIsIDAuM10gYXMgRG91YmxlW10pDQorICAgIH0NCit9DQorDQorYWJzdHJhY3QgY2xhc3MgQSB7DQorICAgIHByb3RlY3RlZCBwcm90KCkgeyAicHJvdCIgfQ0KKyAgICBkZWYgcHViKCkgeyAicHViIiB9DQorICAgIGFic3RyYWN0IGFic3RyYWN0TWV0aG9kKCkNCit9DQorDQorY2xhc3MgQiBleHRlbmRzIEEgew0KKyAgICBwcm90ZWN0ZWQgY2hpbGQoKSB7ICJjaGlsZCIgfQ0KKyAgICBkZWYgYWJzdHJhY3RNZXRob2QoKSB7ICJhYnN0cmFjdCIgfQ0KK30NCisNCitjbGFzcyBDIHsNCisgICAgU3RyaW5nW10gZm9vKGludCBhLCBMaXN0IGIsIERvdWJsZVtdIGMpIHsgWyJmb28iXSBhcyBTdHJpbmdbXSB9DQorfQ0KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvbGFuZy9NZXRhQ2xhc3NQcm9wZXJ0eVRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9sYW5nL01ldGFDbGFzc1Byb3BlcnR5VGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY1NjA1YgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvbGFuZy9NZXRhQ2xhc3NQcm9wZXJ0eVRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMjAgQEAKK3BhY2thZ2UgZ3Jvb3Z5LmxhbmcKKworY2xhc3MgTWV0YUNsYXNzUHJvcGVydHlUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCXZvaWQgdGVzdEZvckphdmFDbGFzcygpIHsKKwkJZGVmIGZvbyA9ICJoZWxsbyB3b3JsZCIKKwkJCisJCWRlZiBtZXRhQ2xhc3MgPSBmb28ubWV0YUNsYXNzCisJCWFzc2VydEVxdWFscyBTdHJpbmcsIG1ldGFDbGFzcy50aGVDbGFzcworCQlhc3NlcnQgU3RyaW5nLm1ldGFDbGFzcyBpbnN0YW5jZW9mIEV4cGFuZG9NZXRhQ2xhc3MKKwl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCisJdm9pZCB0ZXN0Rm9yR3Jvb3Z5Q2xhc3MoKSB7CisJCSBkZWYgdCA9IG5ldyBNQ1BUZXN0MSgpCisJCQorCQlhc3NlcnRFcXVhbHMgTUNQVGVzdDEsIHQubWV0YUNsYXNzLnRoZUNsYXNzICAgICAgICAKKwkJYXNzZXJ0IE1DUFRlc3QxLm1ldGFDbGFzcyBpbnN0YW5jZW9mIEV4cGFuZG9NZXRhQ2xhc3MKKwl9Cit9CitjbGFzcyBNQ1BUZXN0MSB7CQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvbGFuZy9NZXRhQ2xhc3NUZXN0LmphdmEgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2xhbmcvTWV0YUNsYXNzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZTQ3NGYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2xhbmcvTWV0YUNsYXNzVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjM1IEBACisvKgorICogJElkJAorICogCisgKiBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbgorICogY29weXJpZ2h0IHN0YXRlbWVudHMgYW5kIG5vdGljZXMuIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhIGNvcHkKKyAqIG9mIHRoaXMgZG9jdW1lbnQuIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAzLgorICogVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gRm9yCisgKiB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLiA0LiBQcm9kdWN0cyBkZXJpdmVkCisgKiBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4KKyAqIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYQorICogcmVnaXN0ZXJlZCB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLiA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUKKyAqIENvZGVoYXVzIC0gaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorICogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorICogREFNQUdFLgorICogIAorICovCisKK3BhY2thZ2UgZ3Jvb3Z5Lmxhbmc7CisKK2ltcG9ydCBncm9vdnkudXRpbC5Hcm9vdnlUZXN0Q2FzZTsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuSW52b2tlckhlbHBlcjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBNZXRhQ2xhc3NUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgcHVibGljIHZvaWQgdGVzdE1ldGFDbGFzcygpIHsKKyAgICAgICAgQ2xhc3MgZm9vID0gU3RyaW5nW10uY2xhc3M7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihmb28gKyAiIG5hbWU6ICIgKyBmb28uZ2V0TmFtZSgpKTsKKworICAgICAgICBNZXRhQ2xhc3MgbWV0YUNsYXNzID0gSW52b2tlckhlbHBlci5nZXRNZXRhQ2xhc3ModGhpcyk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZ290IG1ldGFjbGFzcyIsIG1ldGFDbGFzcyAhPSBudWxsKTsKKworICAgICAgICBtZXRhQ2xhc3MuaW52b2tlTWV0aG9kKHRoaXMsICJkb1NvbWV0aGluZyIsIG5ldyBPYmplY3RbMF0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBcnJheSgpIHsKKyAgICAgICAgU3RyaW5nW10gdmFsdWUgPSBuZXcgU3RyaW5nW117ImhlbGxvIn07CisKKyAgICAgICAgTWV0YUNsYXNzIG1ldGFDbGFzcyA9IEludm9rZXJIZWxwZXIuZ2V0TWV0YUNsYXNzKHZhbHVlKTsKKworICAgICAgICBhc3NlcnRUcnVlKCJnb3QgbWV0YWNsYXNzIiwgbWV0YUNsYXNzICE9IG51bGwpOworCisgICAgICAgIG1ldGFDbGFzcy5pbnZva2VNZXRob2QodmFsdWUsICJ0b1N0cmluZyIsIG5ldyBPYmplY3RbMF0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmcoKSB7CisgICAgICAgIFN0cmluZyB2YWx1ZSA9ICJoZWxsbyI7CisKKyAgICAgICAgTWV0YUNsYXNzIG1ldGFDbGFzcyA9IEludm9rZXJIZWxwZXIuZ2V0TWV0YUNsYXNzKHZhbHVlKTsKKworICAgICAgICBhc3NlcnRUcnVlKCJnb3QgbWV0YWNsYXNzIiwgbWV0YUNsYXNzICE9IG51bGwpOworCisgICAgICAgIE9iamVjdCBhbnN3ZXIgPSBtZXRhQ2xhc3MuaW52b2tlTWV0aG9kKHZhbHVlLCAidG9TdHJpbmciLCBuZXcgT2JqZWN0WzBdKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImhlbGxvIiwgYW5zd2VyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T2JqZWN0KCkgeworICAgICAgICBPYmplY3QgdmFsdWUgPSBuZXcgT2JqZWN0KCk7CisKKyAgICAgICAgTWV0YUNsYXNzIG1ldGFDbGFzcyA9IEludm9rZXJIZWxwZXIuZ2V0TWV0YUNsYXNzKHZhbHVlKTsKKworICAgICAgICBhc3NlcnRUcnVlKCJnb3QgbWV0YWNsYXNzIiwgbWV0YUNsYXNzICE9IG51bGwpOworCisgICAgICAgIG1ldGFDbGFzcy5pbnZva2VNZXRob2QodmFsdWUsICJ0b1N0cmluZyIsIG5ldyBPYmplY3RbMF0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQdWJsaWNGaWVsZCgpIHsKKyAgICAgICAgRHltbXlDbGFzcyBkeW1teUNsYXNzID0gbmV3IER5bW15Q2xhc3MoKTsKKworICAgICAgICBNZXRhQ2xhc3MgbWV0YUNsYXNzID0gSW52b2tlckhlbHBlci5nZXRNZXRhQ2xhc3MoZHltbXlDbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1ldGFDbGFzcy5nZXRQcm9wZXJ0eShkeW1teUNsYXNzLCAieCIpLCBuZXcgSW50ZWdlcigwKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtZXRhQ2xhc3MuZ2V0UHJvcGVydHkoZHltbXlDbGFzcywgInkiKSwgIm5vbmUiKTsKKworICAgICAgICBtZXRhQ2xhc3Muc2V0UHJvcGVydHkoZHltbXlDbGFzcywgIngiLCBuZXcgSW50ZWdlcigyNSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZHltbXlDbGFzcy54LCAyNSk7CisKKyAgICAgICAgbWV0YUNsYXNzLnNldFByb3BlcnR5KGR5bW15Q2xhc3MsICJ5IiwgIm5ld3ZhbHVlIik7CisgICAgICAgIGFzc2VydEVxdWFscyhkeW1teUNsYXNzLnksICJuZXd2YWx1ZSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRQcm9wZXJ0eVdpdGhJbnQoKSB7CisgICAgICAgIER5bW15Q2xhc3MgZHltbXlDbGFzcyA9IG5ldyBEeW1teUNsYXNzKCk7CisgICAgICAgIE1ldGFDbGFzcyBtZXRhQ2xhc3MgPSBJbnZva2VySGVscGVyLmdldE1ldGFDbGFzcyhkeW1teUNsYXNzKTsKKyAgICAgICAgbWV0YUNsYXNzLnNldFByb3BlcnR5KGR5bW15Q2xhc3MsICJhbkludCIsIG5ldyBJbnRlZ2VyKDEwKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNldFByb3BlcnR5V2l0aERvdWJsZUFycmF5KCkgeworICAgICAgICBEeW1teUNsYXNzIGR5bW15Q2xhc3MgPSBuZXcgRHltbXlDbGFzcygpOworICAgICAgICBNZXRhQ2xhc3MgbWV0YUNsYXNzID0gSW52b2tlckhlbHBlci5nZXRNZXRhQ2xhc3MoZHltbXlDbGFzcyk7CisgICAgICAgIERvdWJsZVtdW10gbWF0cml4MiA9CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRG91YmxlKDM1KSwgbmV3IERvdWJsZSg1MCksIG5ldyBEb3VibGUoMTIwKQorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERvdWJsZSg3NSksIG5ldyBEb3VibGUoODApLCBuZXcgRG91YmxlKDE1MCkKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9OworICAgICAgICBtZXRhQ2xhc3Muc2V0UHJvcGVydHkoZHltbXlDbGFzcywgIm1hdHJpeCIsIG1hdHJpeDIpOworICAgICAgICBtZXRhQ2xhc3Muc2V0UHJvcGVydHkoZHltbXlDbGFzcywgIm1hdHJpeDIiLCBtYXRyaXgyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0UHJvcGVydHlXaXRoQXJyYXkoKSB7CisgICAgICAgIER5bW15Q2xhc3MgZHltbXlDbGFzcyA9IG5ldyBEeW1teUNsYXNzKCk7CisgICAgICAgIE1ldGFDbGFzcyBtZXRhQ2xhc3MgPSBJbnZva2VySGVscGVyLmdldE1ldGFDbGFzcyhkeW1teUNsYXNzKTsKKworICAgICAgICAvLyB0ZXN0IGludFtdCisgICAgICAgIGludFtdIGludHMgPSBuZXcgaW50W117CisgICAgICAgICAgICAgICAgMCwgMSwgMiwgMworICAgICAgICB9OworICAgICAgICBtZXRhQ2xhc3Muc2V0UHJvcGVydHkoZHltbXlDbGFzcywgImludHMiLCBpbnRzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGludHMsIG1ldGFDbGFzcy5nZXRQcm9wZXJ0eShkeW1teUNsYXNzLCAiaW50cyIpKTsKKworICAgICAgICAvLyB0ZXN0IEludGVnZXJbXQorICAgICAgICBJbnRlZ2VyW10gaW50ZWdlcnMgPSBuZXcgSW50ZWdlcltdeworICAgICAgICAgICAgICAgIG5ldyBJbnRlZ2VyKDApLCBuZXcgSW50ZWdlcigxKSwgbmV3IEludGVnZXIoMiksIG5ldyBJbnRlZ2VyKDMpCisgICAgICAgIH07CisgICAgICAgIG1ldGFDbGFzcy5zZXRQcm9wZXJ0eShkeW1teUNsYXNzLCAiaW50ZWdlcnMiLCBpbnRlZ2Vycyk7CisgICAgICAgIGFzc2VydEVxdWFscyhpbnRlZ2VycywgbWV0YUNsYXNzLmdldFByb3BlcnR5KGR5bW15Q2xhc3MsICJpbnRlZ2VycyIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0UHJvcGVydHlXaXRoTGlzdCgpIHsKKyAgICAgICAgRHltbXlDbGFzcyBkeW1teUNsYXNzID0gbmV3IER5bW15Q2xhc3MoKTsKKyAgICAgICAgTWV0YUNsYXNzIG1ldGFDbGFzcyA9IEludm9rZXJIZWxwZXIuZ2V0TWV0YUNsYXNzKGR5bW15Q2xhc3MpOworCisgICAgICAgIC8vIHRlc3QgbGlzdAorICAgICAgICBBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgbGlzdC5hZGQobmV3IEludGVnZXIoMTIwKSk7CisgICAgICAgIGxpc3QuYWRkKG5ldyBJbnRlZ2VyKDE1MCkpOworCisgICAgICAgIC8vIHRlc3QgaW50W10KKyAgICAgICAgbWV0YUNsYXNzLnNldFByb3BlcnR5KGR5bW15Q2xhc3MsICJpbnRzIiwgbGlzdCk7CisKKyAgICAgICAgLy8gdGVzdCBJbnRlZ2VyW10KKyAgICAgICAgbWV0YUNsYXNzLnNldFByb3BlcnR5KGR5bW15Q2xhc3MsICJpbnRlZ2VycyIsIGxpc3QpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRhTWV0aG9kc09ubHlBZGRlZE9uY2UoKSB7CisgICAgICAgIE1ldGFDbGFzcyBtZXRhQ2xhc3MgPSBJbnZva2VySGVscGVyLmdldE1ldGFDbGFzcygic29tZSBTdHJpbmciKTsKKworICAgICAgICBMaXN0IG1ldGhvZHMgPSBtZXRhQ2xhc3MuZ2V0TWV0YU1ldGhvZHMoKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gbWV0aG9kcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIE1ldGFNZXRob2QgbWV0aG9kID0gKE1ldGFNZXRob2QpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaW5uZXIgPSBtZXRob2RzLml0ZXJhdG9yKCk7IGlubmVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICBNZXRhTWV0aG9kIHJ1bm5lciA9IChNZXRhTWV0aG9kKSBpbm5lci5uZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKG1ldGhvZC5lcXVhbHMocnVubmVyKSkgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInJ1bm5lciA9ICIgKyBydW5uZXIpOworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm1ldGhvZCA9ICIgKyBtZXRob2QpOworICAgICAgICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiY291bnQgb2YgTWV0aG9kICIgKyBtZXRob2QuZ2V0TmFtZSgpLCAxLCBjb3VudCk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgZG9Tb21ldGhpbmcoKSB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2FsbGVkIGRvU29tZXRoaW5nKCkiKTsKKyAgICB9Cit9CisKKworY2xhc3MgRHltbXlDbGFzcyB7CisgICAgcHVibGljIGludCB4ID0gMDsKKyAgICBwdWJsaWMgU3RyaW5nIHkgPSAibm9uZSI7CisKKyAgICBwcml2YXRlIGludCBhbkludDsKKyAgICBwcml2YXRlIGludFtdIGludHM7CisgICAgcHJpdmF0ZSBJbnRlZ2VyW10gaW50ZWdlcnM7CisgICAgZG91YmxlW11bXSBtYXRyaXgyOworICAgIERvdWJsZVtdW10gbWF0cml4OworCisgICAgcHVibGljIEludGVnZXJbXSBnZXRJbnRlZ2VycygpIHsKKyAgICAgICAgcmV0dXJuIGludGVnZXJzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEludGVnZXJzKEludGVnZXJbXSBpbnRlZ2VycykgeworICAgICAgICB0aGlzLmludGVnZXJzID0gaW50ZWdlcnM7CisgICAgfQorCisgICAgcHVibGljIGludFtdIGdldEludHMoKSB7CisgICAgICAgIHJldHVybiBpbnRzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEludHMoaW50W10gaW50cykgeworICAgICAgICB0aGlzLmludHMgPSBpbnRzOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0QW5JbnQoKSB7CisgICAgICAgIHJldHVybiBhbkludDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBbkludChpbnQgYW5JbnQpIHsKKyAgICAgICAgdGhpcy5hbkludCA9IGFuSW50OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1hdHJpeChEb3VibGVbXVtdIG1hdHJpeCkgeworICAgICAgICB0aGlzLm1hdHJpeCA9IG1hdHJpeDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNYXRyaXgyKGRvdWJsZVtdW10gbWF0cml4UmVsb2FkZWQpIHsKKyAgICAgICAgdGhpcy5tYXRyaXgyID0gbWF0cml4UmVsb2FkZWQ7CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvbGFuZy9NZXRob2RNaXNzaW5nVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2xhbmcvTWV0aG9kTWlzc2luZ1Rlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NDYxMGYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2xhbmcvTWV0aG9kTWlzc2luZ1Rlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTAzIEBACisvKioKKyAqIFRlc3RzIGZvciBtZXRob2QgbWlzc2luZyBoYW5kbGluZyBpbiBHcm9vdnkKKyAKKyAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgorICogQHNpbmNlIDEuMQorICAqCisgKiBDcmVhdGVkOiBKdWwgMTcsIDIwMDcKKyAqIFRpbWU6IDM6NDg6MTUgUE0KKyAqIAorICovCisKK3BhY2thZ2UgZ3Jvb3Z5LmxhbmcKK2NsYXNzIE1ldGhvZE1pc3NpbmdUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisKKyAgICB2b2lkIHRlc3RPdmVycmlkZVN0YXRpY01ldGhvZE1pc3NpbmdUd2ljZSgpIHsKKyAgICAgICAgTU1UZXN0Mi5tZXRhQ2xhc3MuJ3N0YXRpYycubWV0aG9kTWlzc2luZyA9IHsgU3RyaW5nIG5hbWUsIGFyZ3MgLT4gImZvbyIgfQorICAgICAgICBhc3NlcnRFcXVhbHMgImZvbyIsTU1UZXN0Mi5kb1N0dWZmKCkKKyAgICAgICAgTU1UZXN0Mi5tZXRhQ2xhc3MuJ3N0YXRpYycubWV0aG9kTWlzc2luZyA9IHsgU3RyaW5nIG5hbWUsIGFyZ3MgLT4gImJhciIgfQorICAgICAgICBhc3NlcnRFcXVhbHMgImJhciIsTU1UZXN0Mi5kb1N0dWZmKCkKKyAgICB9CisKKyAgICB2b2lkIHRlc3RTaW1wbGVNZXRob2RNaXNzaW5nKCkgeworICAgICAgICBkZWYgdCA9IG5ldyBNTVRlc3QoKQorICAgICAgICBhc3NlcnRFcXVhbHMgIndvcmxkIiwgdC5oZWxsbygpCisgICAgICAgIGFzc2VydEVxdWFscyAiZm9vIiwgdC5zdHVmZigpCisgICAgfQorCisgICAgdm9pZCB0ZXN0TWV0aG9kTWlzc2luZ1ZpYU1ldGFDbGFzcygpIHsKKyAgICAgICAgZGVmIHQxID0gbmV3IE1NVGVzdDIoKQorICAgICAgICBzaG91bGRGYWlsKE1pc3NpbmdNZXRob2RFeGNlcHRpb24pIHsKKyAgICAgICAgICAgIHQxLnN0dWZmKCkKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMgIndvcmxkIiwgdDEuaGVsbG8oKQorICAgICAgICBNTVRlc3QyLm1ldGFDbGFzcy5tZXRob2RNaXNzaW5nID0geyBTdHJpbmcgbmFtZSwgYXJncyAtPgorICAgICAgICAgICAgImZvbyIKKyAgICAgICAgfQorICAgICAgICBkZWYgdDIgPSBuZXcgTU1UZXN0MigpCisgICAgICAgIGFzc2VydEVxdWFscyAid29ybGQiLCB0Mi5oZWxsbygpCisgICAgICAgIGFzc2VydEVxdWFscyAiZm9vIiwgdDIuc3R1ZmYoKQorICAgIH0KKworICAgIHZvaWQgdGVzdE1ldGhvZE1pc3NpbmdXaXRoUmVnaXN0cmF0aW9uKCkgeworICAgICAgICBNTVRlc3QyLm1ldGFDbGFzcy5tZXRob2RNaXNzaW5nID0geyBTdHJpbmcgbmFtZSwgYXJncyAtPgorICAgICAgICAgICAgIE1NVGVzdDIubWV0YUNsYXNzLiIkbmFtZSIgPSB7LT4gImJhciIgfSAgICAgICAgCisgICAgICAgICAgICAiZm9vIgorICAgICAgICB9CisgICAgICAgIGRlZiB0MiA9IG5ldyBNTVRlc3QyKCkKKyAgICAgICAgYXNzZXJ0RXF1YWxzICJ3b3JsZCIsIHQyLmhlbGxvKCkKKyAgICAgICAgYXNzZXJ0RXF1YWxzICJmb28iLCB0Mi5zdHVmZigpCisgICAgICAgIGFzc2VydEVxdWFscyAiYmFyIiwgdDIuc3R1ZmYoKQorCisgICAgfQorCisKKyAgICB2b2lkIHRlc3RTdGF0aWNNZXRob2RNaXNzaW5nVmlhTWV0YUNsYXNzKCkgeworCisgICAgICAgIGFzc2VydEVxdWFscyAid29ybGQiLCBNTVRlc3QzLmhlbGxvKCkKKyAgICAgICAgc2hvdWxkRmFpbChNaXNzaW5nTWV0aG9kRXhjZXB0aW9uKSB7CisgICAgICAgICAgICBNTVRlc3QzLnN0dWZmKCkgICAgICAgICAgICAKKyAgICAgICAgfQorICAgICAgICBNTVRlc3QzLm1ldGFDbGFzcy4nc3RhdGljJy5tZXRob2RNaXNzaW5nID0geyBTdHJpbmcgbmFtZSwgYXJncy0+CisgICAgICAgICAgICAgImZvbyIKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydEVxdWFscyAid29ybGQiLCBNTVRlc3QzLmhlbGxvKCkKKyAgICAgICAgYXNzZXJ0RXF1YWxzICJmb28iLCBNTVRlc3QzLnN0dWZmKCkKKyAgICB9CisKKyAgICB2b2lkIHRlc3RNZXRob2RNaXNzaW5nV2l0aEluaGVyaXRhbmNlKCkgeworICAgICAgICAgYXNzZXJ0RXF1YWxzICJ3b3JsZCIsTU1UZXN0Ni5oZWxsbygpCisgICAgICAgICBhc3NlcnRFcXVhbHMgImNydWVsIHdvcmxkIixNTVRlc3Q2Lmdvb2RieWUoKQorCisgICAgICAgICBNTVRlc3Q2Lm1ldGFDbGFzcy4nc3RhdGljJy5tZXRob2RNaXNzaW5nID0geyBTdHJpbmcgbmFtZSwgYXJncyAtPgorICAgICAgICAgICAgImZvbyIKKyAgICAgICAgIH0KKyAgICAgICAgIGFzc2VydEVxdWFscyAiZm9vIixNTVRlc3Q2LmJhcigpCisKKyAgICAgICAgIHNob3VsZEZhaWwoTWlzc2luZ01ldGhvZEV4Y2VwdGlvbikgeworICAgICAgICAgICAgIE1NVGVzdDUuYmFyKCkKKyAgICAgICAgIH0KKyAgICB9CisKK30KK2NsYXNzIE1NVGVzdCB7CisgICAgZGVmIGhlbGxvKCkgeyAid29ybGQiIH0KKyAgICBkZWYgbWV0aG9kTWlzc2luZyhTdHJpbmcgbmFtZSwgYXJncykgeworICAgICAgICAiZm9vIgorICAgIH0KK30KK2NsYXNzIE1NVGVzdDIgeworICAgIGRlZiBoZWxsbygpIHsgIndvcmxkIiB9Cit9CitjbGFzcyBNTVRlc3QzIHsKKyAgICBzdGF0aWMgaGVsbG8oKSB7ICJ3b3JsZCIgfQorfQorCitjbGFzcyBNTVRlc3Q1IHsKKyAgICBzdGF0aWMgaGVsbG8oKSB7ICJ3b3JsZCIgfQorfQorY2xhc3MgTU1UZXN0NiBleHRlbmRzIE1NVGVzdDUgeworICAgIHN0YXRpYyBnb29kYnllKCkgeyAiY3J1ZWwgd29ybGQiIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2xhbmcvTW9ja1dyaXRlci5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9sYW5nL01vY2tXcml0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWI0YzU2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9sYW5nL01vY2tXcml0ZXIuamF2YQpAQCAtMCwwICsxLDgxIEBACisvKgorICRJZCQKKworIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCisgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQKKyAgICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKKyAgICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCisgICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQorICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgorICAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKKyAgICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KKworIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCisgICAgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAorICAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCisKKyA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQorICAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLworCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUworIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAorIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKKyBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgKi8KKworcGFja2FnZSBncm9vdnkubGFuZzsKKworCisvKioKKyAqIEEgbW9jayBjbGFzcyBmb3IgdGVzdGluZyB3cml0ZXIgYmFzZWQgY29kZQorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBNb2NrV3JpdGVyIHsKKworICAgIHByaXZhdGUgU3RyaW5nIG91dHB1dDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3V0cHV0KCkgeworICAgICAgICBTdHJpbmcgYW5zd2VyID0gb3V0cHV0OworICAgICAgICBvdXRwdXQgPSBudWxsOworICAgICAgICByZXR1cm4gYW5zd2VyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dChTdHJpbmcgb3V0cHV0KSB7CisgICAgICAgIHRoaXMub3V0cHV0ID0gb3V0cHV0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByaW50bG4oKSB7CisgICAgICAgIHNldE91dHB1dCgicHJpbnRsbigpIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJpbnRsbihPYmplY3Qgb2JqZWN0KSB7CisgICAgICAgIHNldE91dHB1dCgicHJpbnRsbigiICsgb2JqZWN0ICsgIikiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcmludChPYmplY3Qgb2JqZWN0KSB7CisgICAgICAgIHNldE91dHB1dCgicHJpbnQoIiArIG9iamVjdCArICIpIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9sYW5nL051bWJlclJhbmdlVGVzdC5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9sYW5nL051bWJlclJhbmdlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZjY3NDYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2xhbmcvTnVtYmVyUmFuZ2VUZXN0LmphdmEKQEAgLTAsMCArMSw3NjAgQEAKKy8qCisgJElkOiBOdW1iZXJSYW5nZVRlc3QuamF2YSx2IDEuMiAyMDA2LzExLzEzIDEwOjIzOjU4IGVkd2luIEV4cCBlZHdpbiAkCisKKyBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAorIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0CisgICAgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhCisgICAgY29weSBvZiB0aGlzIGRvY3VtZW50LgorCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQorICAgIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKKyAgICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKKyAgICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCisgICAgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCisKKyA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IgorICAgIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQKKyAgICB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgorCisgNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KKyAgICBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMKKyBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKKyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCisgVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICovCitwYWNrYWdlIGdyb292eS5sYW5nOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogUHJvdmlkZXMgdW5pdCB0ZXN0cyBmb3IgcmFuZ2VzIG9mIG51bWJlcnMuCisgKgorICogQGF1dGhvciBFZHdpbiBUZWxsbWFuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBOdW1iZXJSYW5nZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICAvKioKKyAgICAgKiBSZWNvcmRzIHRoZSB2YWx1ZXMgcGFzc2VkIHRvIGEgY2xvc3VyZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFJlY29yZGluZ0Nsb3N1cmUgZXh0ZW5kcyBDbG9zdXJlIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhvbGRzIHRoZSB2YWx1ZXMgcGFzc2VkIGluCisgICAgICAgICAqLworICAgICAgICBmaW5hbCBMaXN0IGNhbGxMb2c7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UmVjb3JkaW5nQ2xvc3VyZTwvY29kZT4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNhbGxMb2cgaXMgZmlsbGVkIHdpdGggdGhlIHZhbHVlcyBwYXNzZWQgdG8gPGNvZGU+ZG9DYWxsPC9jb2RlPgorICAgICAgICAgKi8KKyAgICAgICAgUmVjb3JkaW5nQ2xvc3VyZShmaW5hbCBMaXN0IGNhbGxMb2cpIHsKKyAgICAgICAgICAgIHN1cGVyKG51bGwpOworICAgICAgICAgICAgdGhpcy5jYWxsTG9nID0gY2FsbExvZzsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTdG9yZXMgPGNvZGU+cGFyYW1zPC9jb2RlPiBpbiB0aGUgPGNvZGU+Y2FsbExvZzwvY29kZT4uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBwYXJhbXMgdGhlIHBhcmFtZXRlcnMuCisgICAgICAgICAqIEByZXR1cm4gbnVsbAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE9iamVjdCBkb0NhbGwoZmluYWwgT2JqZWN0IHBhcmFtcykgeworICAgICAgICAgICAgY2FsbExvZy5hZGQocGFyYW1zKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHtAbGluayBSYW5nZX0gdG8gdGVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcm9tIHRoZSBmaXJzdCB2YWx1ZSBpbiB0aGUgcmFuZ2UuCisgICAgICogQHBhcmFtIHRvICAgdGhlIGxhc3QgdmFsdWUgaW4gdGhlIHJhbmdlLgorICAgICAqIEByZXR1cm4gYSB7QGxpbmsgUmFuZ2V9IHRvIHRlc3QKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgUmFuZ2UgY3JlYXRlUmFuZ2UoZmluYWwgaW50IGZyb20sIGZpbmFsIGludCB0byk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgdmFsdWUgaW4gdGhlIHJhbmdlLgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBjcmVhdGUuCisgICAgICogQHJldHVybiBhIHZhbHVlIGluIHRoZSByYW5nZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgQ29tcGFyYWJsZSBjcmVhdGVWYWx1ZShmaW5hbCBpbnQgdmFsdWUpOworCisgICAgLyoqCisgICAgICogVGVzdHMgPGNvZGU+aGFzaENvZGU8L2NvZGU+IGFuZCA8Y29kZT5lcXVhbHM8L2NvZGU+IGNvbXBhcmluZyBvbmUge0BsaW5rIEludFJhbmdlfSB0byBhbm90aGVyIHtAbGluayBJbnRSYW5nZX0uCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEhhc2hDb2RlQW5kRXF1YWxzKCkgeworICAgICAgICBSYW5nZSBhID0gY3JlYXRlUmFuZ2UoMSwgMTEpOworICAgICAgICBSYW5nZSBiID0gY3JlYXRlUmFuZ2UoMSwgMTEpOworICAgICAgICBSYW5nZSBjID0gY3JlYXRlUmFuZ2UoMiwgMTEpOworCisgICAgICAgIGFzc2VydEVxdWFscygiaGFzaGNvZGUiLCBhLmhhc2hDb2RlKCksIGIuaGFzaENvZGUoKSk7CisgICAgICAgIGFzc2VydFRydWUoImhhc2hjb2RlIiwgYS5oYXNoQ29kZSgpICE9IGMuaGFzaENvZGUoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIGFuZCBiIiwgYSwgYik7CisgICAgICAgIGFzc2VydEZhbHNlKCJhICE9IGMiLCBhLmVxdWFscyhjKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdXNpbmcgZGlmZmVyZW50IGNsYXNzZXMgZm9yICdmcm9tJyBhbmQgJ3RvJy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlmZmVyZW50Q2xhc3Nlc0ZvckZyb21BbmRUbygpIHsKKyAgICAgICAgZmluYWwgSW50ZWdlciBmcm9tID0gbmV3IEludGVnZXIoMSk7CisgICAgICAgIGZpbmFsIENvbXBhcmFibGUgdG8gPSBjcmVhdGVWYWx1ZSg1KTsKKyAgICAgICAgZmluYWwgUmFuZ2UgcmFuZ2UgPSBuZXcgT2JqZWN0UmFuZ2UoZnJvbSwgdG8pOworCisgICAgICAgIGFzc2VydEVxdWFscygid3JvbmcgJ2Zyb20nIHZhbHVlIiwgZnJvbSwgcmFuZ2UuZ2V0RnJvbSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3cm9uZyAndG8nIHZhbHVlIiwgdG8sIHJhbmdlLmdldFRvKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIGEgPGNvZGU+bnVsbDwvY29kZT4gJ2Zyb20nIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsRnJvbSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBPYmplY3RSYW5nZShudWxsLCBjcmVhdGVWYWx1ZSg1KSk7CisgICAgICAgICAgICBmYWlsKCJudWxsICdmcm9tJyBhY2NlcHRlZCIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiZXhwZWN0ZWQgZXhjZXB0aW9uIHRocm93biIsIHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgYSA8Y29kZT5udWxsPC9jb2RlPiAndG8nIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsVG8oKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgT2JqZWN0UmFuZ2UoY3JlYXRlVmFsdWUoMjMpLCBudWxsKTsKKyAgICAgICAgICAgIGZhaWwoIm51bGwgJ3RvJyBhY2NlcHRlZCIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiZXhwZWN0ZWQgZXhjZXB0aW9uIHRocm93biIsIHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgc3RlcHBpbmcgdGhyb3VnaCBhIHJhbmdlIGJ5IHR3byB3aXRoIGEgY2xvc3VyZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RlcEJ5VHdvV2l0aENsb3N1cmUoKSB7CisgICAgICAgIGZpbmFsIExpc3QgY2FsbExvZyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgZmluYWwgQ2xvc3VyZSBjbG9zdXJlID0gbmV3IFJlY29yZGluZ0Nsb3N1cmUoY2FsbExvZyk7CisKKyAgICAgICAgZmluYWwgUmFuZ2UgcmFuZ2UgPSBjcmVhdGVSYW5nZSgwLCA0KTsKKyAgICAgICAgcmFuZ2Uuc3RlcCgyLCBjbG9zdXJlKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIndyb25nIG51bWJlciBvZiBjYWxscyB0byBjbG9zdXJlIiwgMywgY2FsbExvZy5zaXplKCkpOworICAgICAgICBmaW5hbCBJdGVyYXRvciBpdGVyID0gY2FsbExvZy5pdGVyYXRvcigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSA0OyBpICs9IDIpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygid3JvbmcgYXJndW1lbnQgcGFzc2VkIHRvIGNsb3N1cmUiLCBjcmVhdGVWYWx1ZShpKSwgaXRlci5uZXh0KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgaXRlcmF0aW5nIG92ZXIgYSBvbmUtZWxlbWVudCByYW5nZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25lRWxlbWVudFJhbmdlKCkgeworICAgICAgICBmaW5hbCBSYW5nZSByYW5nZSA9IGNyZWF0ZVJhbmdlKDEsIDEpOworICAgICAgICBpbnQgbmV4dCA9IDE7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHJhbmdlLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgZmluYWwgTnVtYmVyIG51bWJlciA9IChOdW1iZXIpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3cm9uZyBudW1iZXIiLCBjcmVhdGVWYWx1ZShuZXh0KyspLCBudW1iZXIpOworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscygid3JvbmcgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGl0ZXJhdGlvbiIsIDIsIG5leHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHN0ZXBwaW5nIHRocm91Z2ggYSByZXZlcnNlZCByYW5nZSBieSB0d28gd2l0aCBhIGNsb3N1cmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFJldmVyc2VTdGVwQnlUd29XaXRoQ2xvc3VyZSgpIHsKKyAgICAgICAgZmluYWwgTGlzdCBjYWxsTG9nID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBmaW5hbCBDbG9zdXJlIGNsb3N1cmUgPSBuZXcgUmVjb3JkaW5nQ2xvc3VyZShjYWxsTG9nKTsKKworICAgICAgICBmaW5hbCBSYW5nZSByYW5nZSA9IGNyZWF0ZVJhbmdlKDQsIDApOworICAgICAgICByYW5nZS5zdGVwKDIsIGNsb3N1cmUpOworCisgICAgICAgIGFzc2VydEVxdWFscygid3JvbmcgbnVtYmVyIG9mIGNhbGxzIHRvIGNsb3N1cmUiLCAzLCBjYWxsTG9nLnNpemUoKSk7CisgICAgICAgIGZpbmFsIEl0ZXJhdG9yIGl0ZXIgPSBjYWxsTG9nLml0ZXJhdG9yKCk7CisgICAgICAgIGZvciAoaW50IGkgPSA0OyBpID49IDA7IGkgLT0gMikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3cm9uZyBhcmd1bWVudCBwYXNzZWQgdG8gY2xvc3VyZSIsIGNyZWF0ZVZhbHVlKGkpLCBpdGVyLm5leHQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBzdGVwcGluZyB0aHJvdWdoIGEgcmFuZ2Ugd2l0aCBhIGNsb3N1cmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFN0ZXBCeU9uZVdpdGhDbG9zdXJlKCkgeworICAgICAgICBmaW5hbCBMaXN0IGNhbGxMb2cgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGZpbmFsIENsb3N1cmUgY2xvc3VyZSA9IG5ldyBSZWNvcmRpbmdDbG9zdXJlKGNhbGxMb2cpOworCisgICAgICAgIGZpbmFsIFJhbmdlIHJhbmdlID0gY3JlYXRlUmFuZ2UoMSwgNSk7CisgICAgICAgIHJhbmdlLnN0ZXAoMSwgY2xvc3VyZSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3cm9uZyBudW1iZXIgb2YgY2FsbHMgdG8gY2xvc3VyZSIsIDUsIGNhbGxMb2cuc2l6ZSgpKTsKKyAgICAgICAgZmluYWwgSXRlcmF0b3IgaXRlciA9IGNhbGxMb2cuaXRlcmF0b3IoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gNTsgaSsrKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIndyb25nIGFyZ3VtZW50IHBhc3NlZCB0byBjbG9zdXJlIiwgY3JlYXRlVmFsdWUoaSksIGl0ZXIubmV4dCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHN0ZXBwaW5nIHRocm91Z2ggYSByZXZlcnNlZCByYW5nZSBieSBvbmUgd2l0aCBhIGNsb3N1cmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFJldmVyc2VTdGVwQnlPbmVXaXRoQ2xvc3VyZSgpIHsKKyAgICAgICAgZmluYWwgTGlzdCBjYWxsTG9nID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBmaW5hbCBDbG9zdXJlIGNsb3N1cmUgPSBuZXcgUmVjb3JkaW5nQ2xvc3VyZShjYWxsTG9nKTsKKworICAgICAgICBmaW5hbCBSYW5nZSByYW5nZSA9IGNyZWF0ZVJhbmdlKDUsIDEpOworICAgICAgICByYW5nZS5zdGVwKDEsIGNsb3N1cmUpOworCisgICAgICAgIGFzc2VydEVxdWFscygid3JvbmcgbnVtYmVyIG9mIGNhbGxzIHRvIGNsb3N1cmUiLCA1LCBjYWxsTG9nLnNpemUoKSk7CisgICAgICAgIGZpbmFsIEl0ZXJhdG9yIGl0ZXIgPSBjYWxsTG9nLml0ZXJhdG9yKCk7CisgICAgICAgIGZvciAoaW50IGkgPSA1OyBpID49IDE7IGktLSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3cm9uZyBhcmd1bWVudCBwYXNzZWQgdG8gY2xvc3VyZSIsIGNyZWF0ZVZhbHVlKGkpLCBpdGVyLm5leHQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBzdGVwcGluZyBiYWNrd2FyZHMgdGhyb3VnaCBhIHJhbmdlIHdpdGggYSBjbG9zdXJlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3ROZWdhdGl2ZVN0ZXBCeU9uZVdpdGhDbG9zdXJlKCkgeworICAgICAgICBmaW5hbCBMaXN0IGNhbGxMb2cgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGZpbmFsIENsb3N1cmUgY2xvc3VyZSA9IG5ldyBSZWNvcmRpbmdDbG9zdXJlKGNhbGxMb2cpOworCisgICAgICAgIGZpbmFsIFJhbmdlIHJhbmdlID0gY3JlYXRlUmFuZ2UoMSwgNSk7CisgICAgICAgIHJhbmdlLnN0ZXAoLTEsIGNsb3N1cmUpOworCisgICAgICAgIGFzc2VydEVxdWFscygid3JvbmcgbnVtYmVyIG9mIGNhbGxzIHRvIGNsb3N1cmUiLCA1LCBjYWxsTG9nLnNpemUoKSk7CisgICAgICAgIGZpbmFsIEl0ZXJhdG9yIGl0ZXIgPSBjYWxsTG9nLml0ZXJhdG9yKCk7CisgICAgICAgIGZvciAoaW50IGkgPSA1OyBpID49IDE7IGktLSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3cm9uZyBhcmd1bWVudCBwYXNzZWQgdG8gY2xvc3VyZSIsIGNyZWF0ZVZhbHVlKGkpLCBpdGVyLm5leHQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBzdGVwcGluZyBiYWNrd2FyZHMgdGhyb3VnaCBhIHJldmVyc2VkIHJhbmdlIHdpdGggYSBjbG9zdXJlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3ROZWdhdGl2ZVJldmVyc2VTdGVwQnlPbmVXaXRoQ2xvc3VyZSgpIHsKKyAgICAgICAgZmluYWwgTGlzdCBjYWxsTG9nID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBmaW5hbCBDbG9zdXJlIGNsb3N1cmUgPSBuZXcgUmVjb3JkaW5nQ2xvc3VyZShjYWxsTG9nKTsKKworICAgICAgICBmaW5hbCBSYW5nZSByYW5nZSA9IGNyZWF0ZVJhbmdlKDUsIDEpOworICAgICAgICByYW5nZS5zdGVwKC0xLCBjbG9zdXJlKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIndyb25nIG51bWJlciBvZiBjYWxscyB0byBjbG9zdXJlIiwgNSwgY2FsbExvZy5zaXplKCkpOworICAgICAgICBmaW5hbCBJdGVyYXRvciBpdGVyID0gY2FsbExvZy5pdGVyYXRvcigpOworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSA1OyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygid3JvbmcgYXJndW1lbnQgcGFzc2VkIHRvIGNsb3N1cmUiLCBjcmVhdGVWYWx1ZShpKSwgaXRlci5uZXh0KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgc3RlcHBpbmcgYmFja3dhcmRzIHRocm91Z2ggYSByYW5nZSB3aXRoIGEgc3RlcCBzaXplIGdyZWF0ZXIgdGhhbiB0aGUgcmFuZ2Ugc2l6ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RlcExhcmdlclRoYW5SYW5nZSgpIHsKKyAgICAgICAgZmluYWwgTGlzdCBjYWxsTG9nID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBmaW5hbCBDbG9zdXJlIGNsb3N1cmUgPSBuZXcgUmVjb3JkaW5nQ2xvc3VyZShjYWxsTG9nKTsKKworICAgICAgICBmaW5hbCBSYW5nZSByYW5nZSA9IGNyZWF0ZVJhbmdlKDEsIDUpOworCisgICAgICAgIHJhbmdlLnN0ZXAoNiwgY2xvc3VyZSk7CisgICAgICAgIGFzc2VydEVxdWFscygid3JvbmcgbnVtYmVyIG9mIGNhbGxzIHRvIGNsb3N1cmUiLCAxLCBjYWxsTG9nLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygid3JvbmcgdmFsdWUiLCBjcmVhdGVWYWx1ZSgxKSwgY2FsbExvZy5nZXQoMCkpOworCisgICAgICAgIGZpbmFsIExpc3Qgc3RlcExpc3QgPSByYW5nZS5zdGVwKDYpOworICAgICAgICBhc3NlcnRFcXVhbHMoIndyb25nIG51bWJlciBvZiB2YWx1ZXMgaW4gcmVzdWx0IiwgMSwgc3RlcExpc3Quc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3cm9uZyB2YWx1ZSIsIGNyZWF0ZVZhbHVlKDEpLCBjYWxsTG9nLmdldCgwKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgc3RlcHBpbmcgdGhyb3VnaCBhIHJhbmdlIGJ5IG9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RlcEJ5T25lKCkgeworICAgICAgICBmaW5hbCBSYW5nZSByYW5nZSA9IGNyZWF0ZVJhbmdlKDEsIDUpOworICAgICAgICBmaW5hbCBMaXN0IHJlc3VsdCA9IHJhbmdlLnN0ZXAoMSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3cm9uZyBudW1iZXIgb2YgY2FsbHMiLCA1LCByZXN1bHQuc2l6ZSgpKTsKKyAgICAgICAgZmluYWwgSXRlcmF0b3IgaXRlciA9IHJlc3VsdC5pdGVyYXRvcigpOworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSA1OyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiaW5jb3JyZWN0IHZhbHVlIGluIHJlc3VsdCIsIGNyZWF0ZVZhbHVlKGkpLCBpdGVyLm5leHQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBzdGVwcGluZyB0aHJvdWdoIGEgcmFuZ2UgYnkgdHdvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTdGVwQnlUd28oKSB7CisgICAgICAgIGZpbmFsIFJhbmdlIHJhbmdlID0gY3JlYXRlUmFuZ2UoMSwgNSk7CisgICAgICAgIGZpbmFsIExpc3QgcmVzdWx0ID0gcmFuZ2Uuc3RlcCgyKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIndyb25nIG51bWJlciBvZiBjYWxscyIsIDMsIHJlc3VsdC5zaXplKCkpOworICAgICAgICBmaW5hbCBJdGVyYXRvciBpdGVyID0gcmVzdWx0Lml0ZXJhdG9yKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IDU7IGkgKz0gMikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbmNvcnJlY3QgdmFsdWUgaW4gcmVzdWx0IiwgY3JlYXRlVmFsdWUoaSksIGl0ZXIubmV4dCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIGdldHRpbmcgdGhlIHNpemUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFNpemUoKSB7CisgICAgICAgIFJhbmdlIHJhbmdlID0gY3JlYXRlUmFuZ2UoMCwgMTApOworICAgICAgICBhc3NlcnRFcXVhbHMoIlNpemUgb2YgIiArIHJhbmdlLCAxMSwgcmFuZ2Uuc2l6ZSgpKTsKKyAgICAgICAgcmFuZ2UgPSBjcmVhdGVSYW5nZSgwLCAxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJTaXplIG9mICIgKyByYW5nZSwgMiwgcmFuZ2Uuc2l6ZSgpKTsKKyAgICAgICAgcmFuZ2UgPSBjcmVhdGVSYW5nZSgwLCAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJTaXplIG9mICIgKyByYW5nZSwgMSwgcmFuZ2Uuc2l6ZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBhc2tpbmcgZm9yIGFuIGluZGV4IG91dHNpZGUgb2YgdGhlIHZhbGlkIHJhbmdlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldE91dE9mUmFuZ2UoKSB7CisgICAgICAgIFJhbmdlIHIgPSBjcmVhdGVSYW5nZSgxMCwgMjApOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByLmdldCgtMSk7CisgICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoImV4cGVjdGVkIGV4Y2VwdGlvbiB0aHJvd24iLCB0cnVlKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgci5nZXQoMTEpOworICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJleHBlY3RlZCBleGNlcHRpb24gdGhyb3duIiwgdHJ1ZSk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIGdldHRpbmcgYSBzdWIgbGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3ViTGlzdCgpIHsKKyAgICAgICAgUmFuZ2UgcmFuZ2UgPSBjcmVhdGVSYW5nZSgwLCA1KTsKKworICAgICAgICBMaXN0IHN1Ykxpc3QgPSByYW5nZS5zdWJMaXN0KDIsIDQpOworICAgICAgICBhc3NlcnRFcXVhbHMoInNpemUiLCAyLCBzdWJMaXN0LnNpemUoKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgic3VibGlzdCBub3QgYSByYW5nZSIsIHN1Ykxpc3QgaW5zdGFuY2VvZiBSYW5nZSk7CisgICAgICAgIFJhbmdlIHN1Ykxpc3RSYW5nZSA9IChSYW5nZSkgc3ViTGlzdDsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImZyb20iLCBjcmVhdGVWYWx1ZSgyKSwgc3ViTGlzdFJhbmdlLmdldEZyb20oKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidG8iLCBjcmVhdGVWYWx1ZSgzKSwgc3ViTGlzdFJhbmdlLmdldFRvKCkpOworCisgICAgICAgIHN1Ykxpc3QgPSByYW5nZS5zdWJMaXN0KDAsIDYpOworICAgICAgICBhc3NlcnRFcXVhbHMoInNpemUiLCA2LCBzdWJMaXN0LnNpemUoKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgic3VibGlzdCBub3QgYSByYW5nZSIsIHN1Ykxpc3QgaW5zdGFuY2VvZiBSYW5nZSk7CisgICAgICAgIHN1Ykxpc3RSYW5nZSA9IChSYW5nZSkgc3ViTGlzdDsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImZyb20iLCBjcmVhdGVWYWx1ZSgwKSwgc3ViTGlzdFJhbmdlLmdldEZyb20oKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidG8iLCBjcmVhdGVWYWx1ZSg1KSwgc3ViTGlzdFJhbmdlLmdldFRvKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIGNyZWF0aW5nIGEgc3ViIGxpc3Qgd2l0aCBhIG5lZ2F0aXZlICJmcm9tIiBpbmRleC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3ViTGlzdE5lZ2F0aXZlRnJvbSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIFJhbmdlIHJhbmdlID0gY3JlYXRlUmFuZ2UoMSwgNSk7CisgICAgICAgICAgICByYW5nZS5zdWJMaXN0KC0xLCAzKTsKKyAgICAgICAgICAgIGZhaWwoImFjY2VwdGVkIHN1YiBsaXN0IHdpdGggbmVnYXRpdmUgaW5kZXgiKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJleHBlY3RlZCBleGNlcHRpb24gdGhyb3duIiwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBjcmVhdGluZyBhIHN1YiBsaXN0IHdpdGggYW4gb3V0IG9mIHJhbmdlICJ0byIgaW5kZXguCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFN1Ykxpc3RPdXRPZlJhbmdlVG8oKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBSYW5nZSByYW5nZSA9IGNyZWF0ZVJhbmdlKDAsIDMpOworICAgICAgICAgICAgcmFuZ2Uuc3ViTGlzdCgwLCA1KTsKKyAgICAgICAgICAgIGZhaWwoImFjY2VwdGVkIHN1YiBsaXN0IHdpdGggaW52YWxpZCAndG8nIik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiZXhwZWN0ZWQgZXhjZXB0aW9uIHRocm93biIsIHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgY3JlYXRpbmcgYSBzdWIgbGlzdCB3aXRoICJmcm9tIiBncmF0ZXIgdGhhbiAidG8uIgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJMaXN0RnJvbUdyZWF0ZXJUaGFuVG8oKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBSYW5nZSByYW5nZSA9IGNyZWF0ZVJhbmdlKDEsIDUpOworICAgICAgICAgICAgcmFuZ2Uuc3ViTGlzdCgzLCAyKTsKKyAgICAgICAgICAgIGZhaWwoImFjY2VwdGVkIHN1YiBsaXN0IHdpdGggJ2Zyb20nIGdyZWF0ZXIgdGhhbiAndG8nIik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJleHBlY3RlZCBleGNlcHRpb24gdGhyb3duIiwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBjcmVhdGluZyBhbiBlbXB0eSBzdWIgbGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlTdWJMaXN0KCkgeworICAgICAgICBmaW5hbCBSYW5nZSByYW5nZSA9IGNyZWF0ZVJhbmdlKDEsIDUpOworCisgICAgICAgIExpc3Qgc3ViTGlzdCA9IHJhbmdlLnN1Ykxpc3QoMCwgMCk7CisgICAgICAgIGFzc2VydEVxdWFscygid3JvbmcgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHN1YiBsaXN0IiwgMCwgc3ViTGlzdC5zaXplKCkpOworCisgICAgICAgIHN1Ykxpc3QgPSByYW5nZS5zdWJMaXN0KDIsIDIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIndyb25nIG51bWJlciBvZiBlbGVtZW50cyBpbiBzdWIgbGlzdCIsIDAsIHN1Ykxpc3Quc2l6ZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBpdGVyYXRpbmcgb3ZlciBhIG5vbi1yZXZlcnNlZCByYW5nZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0ZSgpIHsKKyAgICAgICAgZmluYWwgUmFuZ2UgcmFuZ2UgPSBjcmVhdGVSYW5nZSgxLCA1KTsKKyAgICAgICAgaW50IG5leHQgPSAxOworICAgICAgICBmaW5hbCBJdGVyYXRvciBpdGVyID0gcmFuZ2UuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWUgPSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygid3JvbmcgbmV4dCB2YWx1ZSIsIGNyZWF0ZVZhbHVlKG5leHQrKyksIHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoIndyb25nIG51bWJlciBvZiBlbGVtZW50cyBpbiBpdGVyYXRpb24iLCA2LCBuZXh0KTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiZ290IGVsZW1lbnQgYWZ0ZXIgaXRlcmF0b3IgZmluaXNoZWQiLCBpdGVyLm5leHQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgcmVtb3ZpbmcgYW4gZWxlbWVudCBmcm9tIHRoZSByYW5nZSB1c2luZyBhbiBpdGVyYXRvciAobm90IHN1cHBvcnRlZCkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZUZyb21JdGVyYXRvcigpIHsKKyAgICAgICAgZmluYWwgUmFuZ2UgcmFuZ2UgPSBjcmVhdGVSYW5nZSgxLCA1KTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgSXRlcmF0b3IgaXRlciA9IHJhbmdlLml0ZXJhdG9yKCk7CisgICAgICAgICAgICBpdGVyLnJlbW92ZSgpOworICAgICAgICAgICAgZmFpbCgic3VjY2Vzc2Z1bGx5IHJlbW92ZWQgYW4gZWxlbWVudCB1c2luZyBhbiBpdGVyYXRvciIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJleHBlY3RlZCBleGNlcHRpb24gdGhyb3duIiwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBpdGVyYXRpbmcgb3ZlciBhIHJldmVyc2VkIHJhbmdlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RJdGVyYXRlUmV2ZXJzZWQoKSB7CisgICAgICAgIGZpbmFsIFJhbmdlIHJhbmdlID0gY3JlYXRlUmFuZ2UoNSwgMSk7CisgICAgICAgIGludCBuZXh0ID0gNTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gcmFuZ2UuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIndyb25nIG51bWJlciIsIGNyZWF0ZVZhbHVlKG5leHQtLSksIGl0ZXIubmV4dCgpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoIndyb25nIG51bWJlciBvZiBlbGVtZW50cyBpbiBpdGVyYXRpb24iLCAwLCBuZXh0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBjcmVhdGluZyBhbiA8Y29kZT5JbnRSYW5nZTwvY29kZT4gd2l0aCBmcm9tID4gdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEZyb21HcmVhdGVyVGhhblRvKCkgeworICAgICAgICBmaW5hbCBpbnQgZnJvbSA9IDk7CisgICAgICAgIGZpbmFsIGludCB0byA9IDA7CisgICAgICAgIGZpbmFsIFJhbmdlIHJhbmdlID0gY3JlYXRlUmFuZ2UoZnJvbSwgdG8pOworCisgICAgICAgIGFzc2VydFRydWUoInJhbmdlIG5vdCByZXZlcnNlZCIsIHJhbmdlLmlzUmV2ZXJzZSgpKTsKKworICAgICAgICAvLyBtYWtlIHN1cmUgdG8vZnJvbSBhcmUgc3dhcHBlZAorICAgICAgICBhc3NlcnRFcXVhbHMoImZyb20gaW5jb3JyZWN0IiwgY3JlYXRlVmFsdWUodG8pLCByYW5nZS5nZXRGcm9tKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRvIGluY29ycmVjdCIsIGNyZWF0ZVZhbHVlKGZyb20pLCByYW5nZS5nZXRUbygpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAxMCwgcmFuZ2Uuc2l6ZSgpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIndyb25nIGZpcnN0IGVsZW1lbnQiLCBjcmVhdGVWYWx1ZSg5KSwgcmFuZ2UuZ2V0KDApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3cm9uZyBsYXN0IGVsZW1lbnQiLCBjcmVhdGVWYWx1ZSgwKSwgcmFuZ2UuZ2V0KDkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBjcmVhdGluZyBhbiA8Y29kZT5JbnRSYW5nZTwvY29kZT4gd2l0aCBmcm9tID09IHRvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RGcm9tRXF1YWxzVG8oKSB7CisgICAgICAgIGZpbmFsIFJhbmdlIHJhbmdlID0gY3JlYXRlUmFuZ2UoNSwgNSk7CisKKyAgICAgICAgYXNzZXJ0RmFsc2UoInJhbmdlIHJldmVyc2VkIiwgcmFuZ2UuaXNSZXZlcnNlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAxLCByYW5nZS5zaXplKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIGNyZWF0aW5nIGFuIDxjb2RlPkludFJhbmdlPC9jb2RlPiB3aXRoIGZyb20gPCB0by4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RnJvbUxlc3NUaGFuVG8oKSB7CisgICAgICAgIGZpbmFsIGludCBmcm9tID0gMTsKKyAgICAgICAgZmluYWwgaW50IHRvID0gNDsKKyAgICAgICAgZmluYWwgUmFuZ2UgcmFuZ2UgPSBjcmVhdGVSYW5nZShmcm9tLCB0byk7CisKKyAgICAgICAgYXNzZXJ0RmFsc2UoInJhbmdlIHJldmVyc2VkIiwgcmFuZ2UuaXNSZXZlcnNlKCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygidG8gaW5jb3JyZWN0IiwgY3JlYXRlVmFsdWUoZnJvbSksIHJhbmdlLmdldEZyb20oKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZnJvbSBpbmNvcnJlY3QiLCBjcmVhdGVWYWx1ZSh0byksIHJhbmdlLmdldFRvKCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDQsIHJhbmdlLnNpemUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFraW5nIGEgcmFuZ2UgZXF1YWwgYSBsaXN0IGlzIG5vdCBhY3R1YWxseSBwb3NzaWJsZSwgc2luY2UgbGlzdC5lcXVhbHMocmFuZ2UpIHdpbGwgbm90IGV2YWx1YXRlIHRvCisgICAgICogPGNvZGU+dHJ1ZTwvY29kZT4gYW5kIDxjb2RlPmVxdWFsczwvY29kZT4gc2hvdWxkIGJlIHN5bW1ldHJpYy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzTGlzdCgpIHsKKyAgICAgICAgZmluYWwgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBsaXN0LmFkZChjcmVhdGVWYWx1ZSgxKSk7CisgICAgICAgIGxpc3QuYWRkKGNyZWF0ZVZhbHVlKDIpKTsKKworICAgICAgICBmaW5hbCBSYW5nZSByYW5nZSA9IGNyZWF0ZVJhbmdlKDEsIDIpOworCisgICAgICAgIC8vIGNhc3QgdG8gT2JqZWN0IHRvIHRlc3Qgcm91dGluZyB0aHJvdWdoIGVxdWFscyhPYmplY3QpCisgICAgICAgIGFzc2VydFRydWUoInJhbmdlIGRvZXMgbm90IGVxdWFsIGxpc3QiLCByYW5nZS5lcXVhbHMoKE9iamVjdCkgbGlzdCkpOworICAgICAgICBhc3NlcnRUcnVlKCJsaXN0IGRvZXMgbm90IGVxdWFsIHJhbmdlIiwgbGlzdC5lcXVhbHMocmFuZ2UpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJoYXNoIGNvZGVzIGFyZSBub3QgZXF1YWwiLCByYW5nZS5oYXNoQ29kZSgpLCBsaXN0Lmhhc2hDb2RlKCkpOworCisgICAgICAgIC8vIGNvbXBhcmUgbGlzdHMgdGhhdCBhcmUgdGhlIHNhbWUgc2l6ZSBidXQgY29udGFpbiBkaWZmZXJlbnQgZWxlbWVudHMKKyAgICAgICAgbGlzdC5zZXQoMCwgY3JlYXRlVmFsdWUoMykpOworICAgICAgICBhc3NlcnRGYWxzZSgicmFuZ2UgZXF1YWxzIGxpc3QiLCByYW5nZS5lcXVhbHMobGlzdCkpOworICAgICAgICBhc3NlcnRGYWxzZSgibGlzdCBlcXVhbHMgcmFuZ2UiLCBsaXN0LmVxdWFscyhyYW5nZSkpOworICAgICAgICBhc3NlcnRGYWxzZSgiaGFzaCBjb2RlcyBhcmUgZXF1YWwiLCByYW5nZS5oYXNoQ29kZSgpID09IGxpc3QuaGFzaENvZGUoKSk7CisKKyAgICAgICAgLy8gY29tcGFyZSBhIGxpc3QgbG9uZ2VyIHRoYW4gdGhlIHJhbmdlCisgICAgICAgIGxpc3Quc2V0KDAsIGNyZWF0ZVZhbHVlKDEpKTsKKyAgICAgICAgbGlzdC5hZGQoY3JlYXRlVmFsdWUoMykpOworICAgICAgICBhc3NlcnRGYWxzZSgicmFuZ2UgZXF1YWxzIGxpc3QiLCByYW5nZS5lcXVhbHMobGlzdCkpOworICAgICAgICBhc3NlcnRGYWxzZSgibGlzdCBlcXVhbHMgcmFuZ2UiLCBsaXN0LmVxdWFscyhyYW5nZSkpOworICAgICAgICBhc3NlcnRGYWxzZSgiaGFzaCBhcmUgZXF1YWwiLCByYW5nZS5oYXNoQ29kZSgpID09IGxpc3QuaGFzaENvZGUoKSk7CisKKyAgICAgICAgLy8gY29tcGFyZSBhIGxpc3Qgc2hvcnRlciB0aGFuIHRoZSByYW5nZQorICAgICAgICBsaXN0LnJlbW92ZSgyKTsKKyAgICAgICAgbGlzdC5yZW1vdmUoMSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJyYW5nZSBlcXVhbHMgbGlzdCIsIHJhbmdlLmVxdWFscyhsaXN0KSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJsaXN0IGVxdWFscyByYW5nZSIsIGxpc3QuZXF1YWxzKHJhbmdlKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJoYXNoIGFyZSBlcXVhbCIsIHJhbmdlLmhhc2hDb2RlKCkgPT0gbGlzdC5oYXNoQ29kZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBjb21wYXJpbmcge0BsaW5rIFJhbmdlfSB0byBhbiBvYmplY3QgdGhhdCBpcyBub3QgYSB7QGxpbmsgUmFuZ2V9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHNOb25SYW5nZSgpIHsKKyAgICAgICAgZmluYWwgUmFuZ2UgcmFuZ2UgPSBjcmVhdGVSYW5nZSgxLCA1KTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoInJhbmdlIGVxdWFsIHRvIHN0cmluZyIsIHJhbmdlLmVxdWFscygiaGVsbG8iKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgY29tcGFyaW5nIGEge0BsaW5rIFJhbmdlfSBjYXN0IHRvIGFuIHtAbGluayBPYmplY3R9CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEVxdWFsc1JhbmdlQXNPYmplY3QoKSB7CisgICAgICAgIGZpbmFsIFJhbmdlIHJhbmdlMSA9IGNyZWF0ZVJhbmdlKDEsIDUpOworICAgICAgICBmaW5hbCBSYW5nZSByYW5nZTIgPSBjcmVhdGVSYW5nZSgxLCA1KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgicmFuZ2VzIG5vdCBlcXVhbCIsIHJhbmdlMS5lcXVhbHMoKE9iamVjdCkgcmFuZ2UyKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgY29tcGFyaW5nIHR3byB7QGxpbmsgUmFuZ2V9cyB0byBlYWNoIG90aGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHNSYW5nZSgpIHsKKyAgICAgICAgZmluYWwgUmFuZ2UgcmFuZ2UxID0gY3JlYXRlUmFuZ2UoMSwgNSk7CisgICAgICAgIFJhbmdlIHJhbmdlMiA9IGNyZWF0ZVJhbmdlKDEsIDUpOworICAgICAgICBhc3NlcnRUcnVlKCJyYW5nZXMgbm90IGVxdWFsIiwgcmFuZ2UxLmVxdWFscygoT2JqZWN0KSByYW5nZTIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgicmFuZ2VzIG5vdCBlcXVhbCIsIHJhbmdlMi5lcXVhbHMoKE9iamVjdCkgcmFuZ2UxKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiaGFzaCBjb2RlcyBub3QgZXF1YWwiLCByYW5nZTEuaGFzaENvZGUoKSwgcmFuZ2UyLmhhc2hDb2RlKCkpOworCisgICAgICAgIHJhbmdlMiA9IGNyZWF0ZVJhbmdlKDAsIDUpOworICAgICAgICBhc3NlcnRGYWxzZSgicmFuZ2VzIGVxdWFsIiwgcmFuZ2UxLmVxdWFscygoT2JqZWN0KSByYW5nZTIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoInJhbmdlcyBlcXVhbCIsIHJhbmdlMi5lcXVhbHMoKE9iamVjdCkgcmFuZ2UxKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJoYXNoIGNvZGVzIGVxdWFsIiwgcmFuZ2UxLmhhc2hDb2RlKCkgPT0gcmFuZ2UyLmhhc2hDb2RlKCkpOworCisgICAgICAgIHJhbmdlMiA9IGNyZWF0ZVJhbmdlKDEsIDYpOworICAgICAgICBhc3NlcnRGYWxzZSgicmFuZ2VzIGVxdWFsIiwgcmFuZ2UxLmVxdWFscygoT2JqZWN0KSByYW5nZTIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoInJhbmdlcyBlcXVhbCIsIHJhbmdlMi5lcXVhbHMoKE9iamVjdCkgcmFuZ2UxKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJoYXNoIGNvZGVzIGVxdWFsIiwgcmFuZ2UxLmhhc2hDb2RlKCkgPT0gcmFuZ2UyLmhhc2hDb2RlKCkpOworCisgICAgICAgIHJhbmdlMiA9IGNyZWF0ZVJhbmdlKDAsIDYpOworICAgICAgICBhc3NlcnRGYWxzZSgicmFuZ2VzIGVxdWFsIiwgcmFuZ2UxLmVxdWFscygoT2JqZWN0KSByYW5nZTIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoInJhbmdlcyBlcXVhbCIsIHJhbmdlMi5lcXVhbHMoKE9iamVjdCkgcmFuZ2UxKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJoYXNoIGNvZGVzIGVxdWFsIiwgcmFuZ2UxLmhhc2hDb2RlKCkgPT0gcmFuZ2UyLmhhc2hDb2RlKCkpOworCisgICAgICAgIHJhbmdlMiA9IGNyZWF0ZVJhbmdlKDIsIDQpOworICAgICAgICBhc3NlcnRGYWxzZSgicmFuZ2VzIGVxdWFsIiwgcmFuZ2UxLmVxdWFscygoT2JqZWN0KSByYW5nZTIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoInJhbmdlcyBlcXVhbCIsIHJhbmdlMi5lcXVhbHMoKE9iamVjdCkgcmFuZ2UxKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJoYXNoIGNvZGVzIGVxdWFsIiwgcmFuZ2UxLmhhc2hDb2RlKCkgPT0gcmFuZ2UyLmhhc2hDb2RlKCkpOworCisgICAgICAgIHJhbmdlMiA9IGNyZWF0ZVJhbmdlKDUsIDEpOworICAgICAgICBhc3NlcnRGYWxzZSgicmFuZ2VzIGVxdWFsIiwgcmFuZ2UxLmVxdWFscygoT2JqZWN0KSByYW5nZTIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoInJhbmdlcyBlcXVhbCIsIHJhbmdlMi5lcXVhbHMoKE9iamVjdCkgcmFuZ2UxKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJoYXNoIGNvZGVzIGVxdWFsIiwgcmFuZ2UxLmhhc2hDb2RlKCkgPT0gcmFuZ2UyLmhhc2hDb2RlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIDxjb2RlPnRvU3RyaW5nPC9jb2RlPiBhbmQgPGNvZGU+aW5zcGVjdDwvY29kZT4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmdBbmRJbnNwZWN0KCkgeworICAgICAgICBSYW5nZSByYW5nZSA9IGNyZWF0ZVJhbmdlKDEsIDUpOworICAgICAgICBTdHJpbmcgZXhwZWN0ZWQgPSByYW5nZS5nZXRGcm9tKCkgKyAiLi4iICsgcmFuZ2UuZ2V0VG8oKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzdHJpbmcgcmVwcmVzZW50YXRpb24iLCBleHBlY3RlZCwgcmFuZ2UudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygid3Jvbmcgc3RyaW5nIHJlcHJlc2VudGF0aW9uIiwgZXhwZWN0ZWQsIHJhbmdlLmluc3BlY3QoKSk7CisKKyAgICAgICAgcmFuZ2UgPSBjcmVhdGVSYW5nZSg1LCAxKTsKKyAgICAgICAgZXhwZWN0ZWQgPSByYW5nZS5nZXRUbygpICsgIi4uIiArIHJhbmdlLmdldEZyb20oKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzdHJpbmcgcmVwcmVzZW50YXRpb24iLCBleHBlY3RlZCwgcmFuZ2UudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygid3Jvbmcgc3RyaW5nIHJlcHJlc2VudGF0aW9uIiwgZXhwZWN0ZWQsIHJhbmdlLmluc3BlY3QoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgPGNvZGU+Z2V0RnJvbTwvY29kZT4gYW5kIDxjb2RlPmdldFRvPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RnJvbUFuZFRvKCkgeworICAgICAgICBmaW5hbCBpbnQgZnJvbSA9IDEsIHRvID0gNTsKKyAgICAgICAgZmluYWwgUmFuZ2UgcmFuZ2UgPSBjcmVhdGVSYW5nZShmcm9tLCB0byk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3cm9uZyAnZnJvbScgdmFsdWUiLCBjcmVhdGVWYWx1ZShmcm9tKSwgcmFuZ2UuZ2V0RnJvbSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3cm9uZyAndG8nIHZhbHVlIiwgY3JlYXRlVmFsdWUodG8pLCByYW5nZS5nZXRUbygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBjb21wYXJpbmcgYSB7QGxpbmsgUmFuZ2V9IHRvIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHNOdWxsKCkgeworICAgICAgICBmaW5hbCBSYW5nZSByYW5nZSA9IGNyZWF0ZVJhbmdlKDEsIDUpOworICAgICAgICBhc3NlcnRGYWxzZSgicmFuZ2UgZXF1YWwgdG8gbnVsbCIsIHJhbmdlLmVxdWFscyhudWxsKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJyYW5nZSBlcXVhbCB0byBudWxsIE9iamVjdCIsIHJhbmdlLmVxdWFscygoT2JqZWN0KSBudWxsKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJyYW5nZSBlcXVhbCB0byBudWxsIFJhbmdlIiwgcmFuZ2UuZXF1YWxzKChSYW5nZSkgbnVsbCkpOworICAgICAgICBhc3NlcnRGYWxzZSgicmFuZ2UgZXF1YWwgdG8gbnVsbCBMaXN0IiwgcmFuZ2UuZXF1YWxzKChMaXN0KSBudWxsKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgYXR0ZW1wdGluZyB0byBhZGQgYSB2YWx1ZSB0byBhIHJhbmdlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRWYWx1ZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIFJhbmdlIHJhbmdlID0gY3JlYXRlUmFuZ2UoMSwgNSk7CisgICAgICAgICAgICByYW5nZS5hZGQoY3JlYXRlVmFsdWUoMjApKTsKKyAgICAgICAgICAgIGZhaWwoImV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duIik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoImV4cGVjdGVkIGV4Y2VwdGlvbiB0aHJvd24iLCB0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIGF0dGVtcHRpbmcgdG8gcmVtb3ZlIGEgdmFsdWUgZnJvbSBhIHJhbmdlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVWYWx1ZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIFJhbmdlIHJhbmdlID0gY3JlYXRlUmFuZ2UoMSwgNSk7CisgICAgICAgICAgICByYW5nZS5yZW1vdmUoMCk7CisgICAgICAgICAgICBmYWlsKCJleHBlY3RlZCBleGNlcHRpb24gbm90IHRocm93biIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJleHBlY3RlZCBleGNlcHRpb24gdGhyb3duIiwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZG9UZXN0Q29udGFpbnMoaW50IGZyb20sIGludCB0bywgUmFuZ2UgcmFuZ2UpIHsKKyAgICAgICAgLy8gdGVzdCBpbnRlZ2VycworICAgICAgICBhc3NlcnRUcnVlKCJtaXNzaW5nICdmcm9tJyB2YWx1ZSIsIHJhbmdlLmNvbnRhaW5zKGNyZWF0ZVZhbHVlKGZyb20pKSk7CisgICAgICAgIGFzc2VydFRydWUoIm1pc3NpbmcgJ3RvJyB2YWx1ZSIsIHJhbmdlLmNvbnRhaW5zKGNyZWF0ZVZhbHVlKHRvKSkpOworICAgICAgICBhc3NlcnRUcnVlKCJtaXNzaW5nIG1pZCBwb2ludCIsIHJhbmdlLmNvbnRhaW5zKGNyZWF0ZVZhbHVlKChmcm9tICsgdG8pIC8gMikpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoImNvbnRhaW5zIG91dCBvZiByYW5nZSB2YWx1ZSIsIHJhbmdlLmNvbnRhaW5zKGNyZWF0ZVZhbHVlKGZyb20gLSAxKSkpOworICAgICAgICBhc3NlcnRGYWxzZSgiY29udGFpbnMgb3V0IG9mIHJhbmdlIHZhbHVlIiwgcmFuZ2UuY29udGFpbnMoY3JlYXRlVmFsdWUodG8gKyAxKSkpOworCisgICAgICAgIC8vIHRlc3QgcmFuZ2VzCisgICAgICAgIGFzc2VydFRydWUoIm1pc3Npbmcgc2FtZSByYW5nZSIsIHJhbmdlLmNvbnRhaW5zQWxsKGNyZWF0ZVJhbmdlKGZyb20sIHRvKSkpOworICAgICAgICBhc3NlcnRUcnVlKCJtaXNzaW5nIHNhbWUgcmFuZ2UiLCByYW5nZS5jb250YWluc0FsbChjcmVhdGVSYW5nZSh0bywgZnJvbSkpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgibWlzc2luZyBzdHJpY3Qgc3Vic2V0IiwgcmFuZ2UuY29udGFpbnNBbGwoY3JlYXRlUmFuZ2UoZnJvbSArIDEsIHRvIC0gMSkpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgibWlzc2luZyBzdWJzZXQiLCByYW5nZS5jb250YWluc0FsbChjcmVhdGVSYW5nZShmcm9tLCB0byAtIDEpKSk7CisgICAgICAgIGFzc2VydFRydWUoIm1pc3Npbmcgc3Vic2V0IiwgcmFuZ2UuY29udGFpbnNBbGwoY3JlYXRlUmFuZ2UoZnJvbSArIDEsIHRvKSkpOworICAgICAgICBhc3NlcnRGYWxzZSgiY29udGFpbnMgbm9uLXN1YnNldCIsIHJhbmdlLmNvbnRhaW5zQWxsKGNyZWF0ZVJhbmdlKGZyb20gLSAxLCB0bykpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoImNvbnRhaW5zIG5vbi1zdWJzZXQiLCByYW5nZS5jb250YWluc0FsbChjcmVhdGVSYW5nZShmcm9tLCB0byArIDEpKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJjb250YWlucyBub24tc3Vic2V0IiwgcmFuZ2UuY29udGFpbnNBbGwoY3JlYXRlUmFuZ2UoZnJvbSAtIDIsIGZyb20gLSAxKSkpOworCisgICAgICAgIC8vIHJhbmdlcyBkb24ndCBjb250YWluIG90aGVyIHJhbmdlcworICAgICAgICBhc3NlcnRGYWxzZSgicmFuZ2UgY29udGFpbnMgc3ViLXJhbmdlIiwgcmFuZ2UuY29udGFpbnMoY3JlYXRlUmFuZ2UoZnJvbSArIDEsIHRvIC0gMSkpKTsKKworICAgICAgICAvLyB0ZXN0IGxpc3QKKyAgICAgICAgZmluYWwgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBsaXN0LmFkZChjcmVhdGVWYWx1ZShmcm9tKSk7CisgICAgICAgIGxpc3QuYWRkKGNyZWF0ZVZhbHVlKHRvKSk7CisgICAgICAgIGFzc2VydFRydWUoIm1pc3Npbmcgc3RyaWN0IHN1YnNldCIsIHJhbmdlLmNvbnRhaW5zQWxsKGxpc3QpKTsKKworICAgICAgICAvLyB0ZXN0IG5vbi1pbnRlZ2VyIG51bWJlcgorICAgICAgICBhc3NlcnRGYWxzZSgiY29udGFpbnMgRmxvYXQiLCByYW5nZS5jb250YWlucyhuZXcgRmxvYXQoKHRvICsgZnJvbSkgLyAyLjAgKyAwLjMpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgd2hldGhlciB0aGUgcmFuZ2UgY29udGFpbnMgYSB7QGxpbmsgQ29tcGFyYWJsZX0gb2JqZWN0IHdoaWNoIGlzIG5vdCBjb21wYXJhYmxlIHdpdGggYSB7QGxpbmsgTnVtYmVyfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNJbmNvbXBhdGlibGVDb21wYXJhYmxlKCkgeworICAgICAgICBmaW5hbCBSYW5nZSByYW5nZSA9IGNyZWF0ZVJhbmdlKDEsIDUpOworICAgICAgICBhc3NlcnRGYWxzZSgicmFuZ2UgY29udGFpbnMgc3RyaW5nIiwgcmFuZ2UuY29udGFpbnMoImhlbGxvIikpOworICAgICAgICBhc3NlcnRGYWxzZSgicmFuZ2UgY29udGFpbnMgc3RyaW5nIiwgcmFuZ2UuY29udGFpbnMoIjEiKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgd2hldGhlciB0aGUgcmFuZ2UgY29udGFpbnMgYSBub24tY29tcGFyYWJsZSBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbnRhaW5zTm9uQ29tcGFyYWJsZSgpIHsKKyAgICAgICAgZmluYWwgUmFuZ2UgcmFuZ2UgPSBjcmVhdGVSYW5nZSgxLCA1KTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoInJhbmdlIGNvbnRhaW5zIGhhc2ggbWFwIiwgcmFuZ2UuY29udGFpbnMobmV3IEhhc2hNYXAoKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHdoZXRoZXIgYSB7QGxpbmsgUmFuZ2V9IGNvbnRhaW5zIGFub3RoZXIge0BsaW5rIFJhbmdlfSBvciBhIHNwZWNpZmljIGludGVnZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbnRhaW5zKCkgeworICAgICAgICBmaW5hbCBpbnQgZnJvbSA9IDEsIHRvID0gNTsKKyAgICAgICAgZG9UZXN0Q29udGFpbnMoZnJvbSwgdG8sIGNyZWF0ZVJhbmdlKGZyb20sIHRvKSk7CisgICAgICAgIGRvVGVzdENvbnRhaW5zKGZyb20sIHRvLCBjcmVhdGVSYW5nZSh0bywgZnJvbSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIDxjb2RlPmdldDwvY29kZT4gZnJvbSBhIHJldmVyc2VkIHJhbmdlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRGcm9tUmV2ZXJzZWRSYW5nZSgpIHsKKyAgICAgICAgZmluYWwgUmFuZ2UgcmFuZ2UgPSBjcmVhdGVSYW5nZSg1LCAxKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3cm9uZyBlbGVtZW50IGF0IHBvc2l0aW9uICIgKyBpLCBjcmVhdGVWYWx1ZSg1IC0gaSksIHJhbmdlLmdldChpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBnZXR0aW5nIHZhbHVlcyBmcm9tIHRoZSByYW5nZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgeworICAgICAgICBmaW5hbCBSYW5nZSByYW5nZSA9IGNyZWF0ZVJhbmdlKDEwLCAyMCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IDEwOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiSXRlbSBhdCBpbmRleDogIiArIGksIGNyZWF0ZVZhbHVlKGkgKyAxMCksIHJhbmdlLmdldChpKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2xhbmcvUHJvcGVydHlNaXNzaW5nVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2xhbmcvUHJvcGVydHlNaXNzaW5nVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg4OWIyYgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvbGFuZy9Qcm9wZXJ0eU1pc3NpbmdUZXN0Lmdyb292eQpAQCAtMCwwICsxLDkxIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgZ3Jvb3Z5LmxhbmcKKy8qKgorICogVGVzdHMgdGhlIGJlaGF2aW91ciBvZiB0aGUgcHJvcGVydHlNaXNzaW5nIGZ1bmN0aW9uYWxpdHkgb2YgR3Jvb3Z5CisKKyAqIEBhdXRob3IgR3JhZW1lIFJvY2hlcgorICogQHNpbmNlIDEuMQorICAqCisgKiBDcmVhdGVkOiBTZXAgNSwgMjAwNworICogVGltZTogNTo1MDoyOCBQTQorICoKKyAqLworY2xhc3MgUHJvcGVydHlNaXNzaW5nVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworCisgICAgdm9pZCB0ZXN0UHJvcGVydHlNaXNzaW5nV2l0aE1ldGhvZHMoKSB7CisgICAgICAgICBkZWYgdCA9IG5ldyBQTVRlc3QxKCkKKworICAgICAgICBhc3NlcnRFcXVhbHMgImJhciIsIHQuZm9vCisgICAgICAgIHQuZm9vID0gImNoYW5nZWQiCisgICAgICAgIGFzc2VydEVxdWFscyAiY2hhbmdlZCIsIHQuZm9vCisKKyAgICAgICAgYXNzZXJ0TnVsbCB0LmJhcgorICAgICAgICB0LmJhciA9ICJrZWVwbWUiCisKKyAgICAgICAgYXNzZXJ0RXF1YWxzICJrZWVwbWUiLCB0LmJhcgorICAgIH0KKworICAgIHZvaWQgdGVzdFByb3BlcnR5TWlzc2luZ1ZpYU1ldGFDbGFzcygpIHsKKyAgICAgICAgZGVmIHN0b3JlID0gWzpdCisgICAgICAgIFBNVGVzdDIubWV0YUNsYXNzLnByb3BlcnR5TWlzc2luZyA9IHsgU3RyaW5nIG5hbWUgLT4KKyAgICAgICAgICAgc3RvcmUubmFtZQorICAgICAgICB9CisgICAgICAgIFBNVGVzdDIubWV0YUNsYXNzLnByb3BlcnR5TWlzc2luZyA9IHsgU3RyaW5nIG5hbWUsIHZhbHVlIC0+CisgICAgICAgICAgIHN0b3JlLm5hbWUgPSB2YWx1ZQorICAgICAgICB9CisKKyAgICAgICAgZGVmIHQgPSBuZXcgUE1UZXN0MigpCisKKyAgICAgICBhc3NlcnRFcXVhbHMgImJhciIsIHQuZm9vCisgICAgICAgdC5mb28gPSAiY2hhbmdlZCIKKyAgICAgICBhc3NlcnRFcXVhbHMgImNoYW5nZWQiLCB0LmZvbworICAgICAgIGFzc2VydE51bGwgdC5iYXIKKyAgICAgICB0LmJhciA9ICJrZWVwbWUiCisKKyAgICAgICBhc3NlcnRFcXVhbHMgImtlZXBtZSIsIHQuYmFyCisKKyAgICB9CisKKyAgICB2b2lkIHRlc3RTdGF0aWNQcm9wZXJ0eU1pc3NpbmdWaWFNZXRhQ2xhc3MoKSB7CisKKyAgICAgICAgc2hvdWxkRmFpbChNaXNzaW5nUHJvcGVydHlFeGNlcHRpb24pIHsKKyAgICAgICAgICAgIFBNVGVzdDEuU09NRV9QUk9QCisgICAgICAgIH0KKworICAgICAgICBQTVRlc3QxLm1ldGFDbGFzcy4nc3RhdGljJy5wcm9wZXJ0eU1pc3NpbmcgPSB7IFN0cmluZyBuYW1lIC0+CisgICAgICAgICAgICBuYW1lCisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRFcXVhbHMgIlNPTUVfUFJPUCIsIFBNVGVzdDEuU09NRV9QUk9QCisgICAgICAgIGFzc2VydEVxdWFscyAiRk9PIiwgUE1UZXN0MS5GT08KKyAgICB9CisKK30KK2NsYXNzIFBNVGVzdDEgeworICAgIGRlZiBzdG9yZSA9IFs6XQorICAgIFN0cmluZyBmb28gPSAiYmFyIgorICAgIFN0cmluZyBwcm9wZXJ0eU1pc3NpbmcoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3RvcmUubmFtZQorICAgIH0KKyAgICB2b2lkIHByb3BlcnR5TWlzc2luZyhTdHJpbmcgbmFtZSwgdmFsdWUpIHsKKyAgICAgICAgc3RvcmUubmFtZSA9IHZhbHVlCisgICAgfQorfQorY2xhc3MgUE1UZXN0MiB7CisgICAgU3RyaW5nIGZvbyA9ICJiYXIiCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9sYW5nL1JhbmdlVGVzdC5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9sYW5nL1JhbmdlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2OGU3MjIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2xhbmcvUmFuZ2VUZXN0LmphdmEKQEAgLTAsMCArMSwyNDYgQEAKKy8qCisgJElkJAorCisgQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQKKyB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIGNvcHlyaWdodAorICAgIHN0YXRlbWVudHMgYW5kIG5vdGljZXMuICBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYQorICAgIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KKworIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUKKyAgICBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCisgICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCisgICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworIDMuIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCisgICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLAorICAgIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLgorCisgNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIKKyAgICBub3IgbWF5ICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYSByZWdpc3RlcmVkCisgICAgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KKworIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtCisgICAgaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTCisgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECisgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTAorIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAqLworcGFja2FnZSBncm9vdnkubGFuZzsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBAYXV0aG9yIEphbWVzIFN0cmFjaGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBSYW5nZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHsKKyAgICAgICAgUmFuZ2UgciA9IGNyZWF0ZVJhbmdlKDAsIDEwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJTaXplIG9mICIgKyByLCAxMSwgci5zaXplKCkpOworICAgICAgICByID0gY3JlYXRlUmFuZ2UoMCwgMSk7CisgICAgICAgIGFzc2VydEVxdWFscygiU2l6ZSBvZiAiICsgciwgMiwgci5zaXplKCkpOworICAgICAgICByID0gY3JlYXRlUmFuZ2UoMCwgMCk7CisgICAgICAgIGFzc2VydEVxdWFscygiU2l6ZSBvZiAiICsgciwgMSwgci5zaXplKCkpOworCisgICAgICAgIHIgPSBjcmVhdGVSYW5nZShuZXcgQmlnRGVjaW1hbCgiMi4xIiksIG5ldyBCaWdEZWNpbWFsKCIxMC4wIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlNpemUgb2YgIiArIHIsIDgsIHIuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydGllcygpIHsKKyAgICAgICAgUmFuZ2UgciA9IGNyZWF0ZVJhbmdlKDAsIDEwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmcm9tIiwgMCwgci5nZXRGcm9tKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRvIiwgMTAsIHIuZ2V0VG8oKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldCgpIHsKKyAgICAgICAgUmFuZ2UgciA9IGNyZWF0ZVJhbmdlKDEwLCAyMCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgICAgICAgICAgSW50ZWdlciB2YWx1ZSA9IChJbnRlZ2VyKSByLmdldChpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiSXRlbSBhdCBpbmRleDogIiArIGksIGkgKyAxMCwgdmFsdWUuaW50VmFsdWUoKSk7CisgICAgICAgIH0KKworICAgICAgICByID0gY3JlYXRlUmFuZ2UobmV3IEJpZ0RlY2ltYWwoIjMuMiIpLCBuZXcgQmlnRGVjaW1hbCgiOS45IikpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHIuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIEJpZ0RlY2ltYWwgdmFsdWUgPSAoQmlnRGVjaW1hbCkgci5nZXQoaSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkl0ZW0gYXQgaW5kZXg6ICIgKyBpLCBuZXcgQmlnRGVjaW1hbCgiMy4yIikuYWRkKG5ldyBCaWdEZWNpbWFsKCIiICsgaSkpLCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TnVsbEZvckZyb21PclRvSXNJbGxlZ2FsKCkgeworICAgICAgICBDb21wYXJhYmxlIGRvbnRjYXJlID0gbmV3IEludGVnZXIoMCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgT2JqZWN0UmFuZ2UoKENvbXBhcmFibGUpbnVsbCwgZG9udGNhcmUpOworICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gd29ya2VkCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0T3V0T2ZSYW5nZSgpIHsKKyAgICAgICAgUmFuZ2UgciA9IGNyZWF0ZVJhbmdlKDEwLCAyMCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHIuZ2V0KC0xKTsKKyAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gd29ya2VkCisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHIuZ2V0KDExKTsKKyAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gd29ya2VkCisgICAgICAgIH0KKworICAgICAgICByID0gY3JlYXRlUmFuZ2UobmV3IEJpZ0RlY2ltYWwoIi00LjMiKSwgbmV3IEJpZ0RlY2ltYWwoIjEuNCIpKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgci5nZXQoLTEpOworICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyB3b3JrZWQKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgci5nZXQoNyk7CisgICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIHdvcmtlZAorICAgICAgICB9CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnMoKSB7CisgICAgICAgIFJhbmdlIHIgPSBjcmVhdGVSYW5nZSgxMCwgMjApOworCisgICAgICAgIGFzc2VydFRydWUoImNvbnRhaW5zIDExIiwgci5jb250YWlucyhuZXcgSW50ZWdlcigxMSkpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiY29udGFpbnMgMTAiLCByLmNvbnRhaW5zKG5ldyBJbnRlZ2VyKDEwKSkpOworICAgICAgICBhc3NlcnRUcnVlKCJjb250YWlucyAxOSIsIHIuY29udGFpbnMobmV3IEludGVnZXIoMTkpKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJjb250YWlucyA5Iiwgci5jb250YWlucyhuZXcgSW50ZWdlcig5KSkpOworICAgICAgICBhc3NlcnRGYWxzZSgiY29udGFpbnMgMjEiLCByLmNvbnRhaW5zKG5ldyBJbnRlZ2VyKDIxKSkpOworICAgICAgICBhc3NlcnRGYWxzZSgiY29udGFpbnMgMTAwIiwgci5jb250YWlucyhuZXcgSW50ZWdlcigxMDApKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJjb250YWlucyAtMSIsIHIuY29udGFpbnMobmV3IEludGVnZXIoLTEpKSk7CisKKyAgICAgICAgciA9IGNyZWF0ZVJhbmdlKG5ldyBCaWdEZWNpbWFsKCIyLjEiKSwgbmV3IEJpZ0RlY2ltYWwoIjEwLjAiKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiY29udGFpbnMgOS4xIiwgci5jb250YWlucyhuZXcgQmlnRGVjaW1hbCgiOS4xIikpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoImNvbnRhaW5zIDEwLjEiLCByLmNvbnRhaW5zKG5ldyBCaWdEZWNpbWFsKCIxMC4xIikpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoImNvbnRhaW5zIDguMCIsIHIuY29udGFpbnMobmV3IEJpZ0RlY2ltYWwoIjguMCIpKSk7CisgICAgICAgIGFzc2VydFRydWUoImNvbnRhaW5zV2l0aGluQm91bmRzIDguMCIsIHIuY29udGFpbnNXaXRoaW5Cb3VuZHMobmV3IEJpZ0RlY2ltYWwoIjguMCIpKSk7CisgICAgICAgIGFzc2VydFRydWUoImNvbnRhaW5zV2l0aGluQm91bmRzIDkuOTk5OSIsIHIuY29udGFpbnNXaXRoaW5Cb3VuZHMobmV3IEJpZ0RlY2ltYWwoIjkuOTk5OSIpKSk7CisgICAgICAgIGFzc2VydFRydWUoImNvbnRhaW5zV2l0aGluQm91bmRzIDEwLjAiLCByLmNvbnRhaW5zV2l0aGluQm91bmRzKG5ldyBCaWdEZWNpbWFsKCIxMC4wIikpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoImNvbnRhaW5zV2l0aGluQm91bmRzIDEwLjAwMDEiLCByLmNvbnRhaW5zV2l0aGluQm91bmRzKG5ldyBCaWdEZWNpbWFsKCIxMC4wMDAxIikpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNXaXRoTGlrZU51bWJlcnMoKSB7CisgICAgICAgIFJhbmdlIHIgPSBuZXcgT2JqZWN0UmFuZ2UobmV3IEludGVnZXIoMSksIG5ldyBTaG9ydCgoc2hvcnQpMykpOworICAgICAgICBhc3NlcnRUcnVlKCJjb250YWlucyAyIiwgci5jb250YWlucyhuZXcgSW50ZWdlcigyKSkpOworICAgICAgICByID0gbmV3IE9iamVjdFJhbmdlKG5ldyBGbG9hdCgxLjApLCBuZXcgRG91YmxlKDMuMCkpOworICAgICAgICBhc3NlcnRUcnVlKCJjb250YWlucyAyLjBkIiwgci5jb250YWlucyhuZXcgRG91YmxlKDIuMCkpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiY29udGFpbnMgMi4wZyIsIHIuY29udGFpbnMobmV3IEJpZ0RlY2ltYWwoMi4wKSkpOworICAgICAgICByID0gbmV3IE9iamVjdFJhbmdlKG5ldyBCaWdEZWNpbWFsKDEuMCksIG5ldyBCaWdEZWNpbWFsKDMuMCkpOworICAgICAgICBhc3NlcnRUcnVlKCJjb250YWlucyAyLjBkIiwgci5jb250YWlucyhuZXcgRG91YmxlKDIuMCkpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiY29udGFpbnMgMi4wZiIsIHIuY29udGFpbnMobmV3IEZsb2F0KDIuMCkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNXaXRoSW5jb21wYXRpYmxlVHlwZSgpIHsKKyAgICAgICAgUmFuZ2UgciA9IG5ldyBPYmplY3RSYW5nZShuZXcgSW50ZWdlcigxKSwgbmV3IFNob3J0KChzaG9ydCkzKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJzaG91bGRuJ3QgY29udGFpbiBzdHJpbmciLCByLmNvbnRhaW5zKCJTdHJpbmciKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN1Ykxpc3QoKSB7CisgICAgICAgIFJhbmdlIHIgPSBjcmVhdGVSYW5nZSgxMCwgMjApOworCisgICAgICAgIExpc3QgcyA9IHIuc3ViTGlzdCgyLCA0KTsKKworICAgICAgICBSYW5nZSBzciA9IChSYW5nZSkgczsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImZyb20iLCAxMiwgc3IuZ2V0RnJvbSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0byIsIDEzLCBzci5nZXRUbygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzaXplIiwgMiwgc3Iuc2l6ZSgpKTsKKworICAgICAgICByID0gY3JlYXRlUmFuZ2UobmV3IEJpZ0RlY2ltYWwoIjAuNSIpLCBuZXcgQmlnRGVjaW1hbCgiOC41IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoInNpemUiLCA5LCByLnNpemUoKSk7CisgICAgICAgIHMgPSByLnN1Ykxpc3QoMiwgNSk7CisgICAgICAgIHNyID0gKFJhbmdlKSBzOworCisgICAgICAgIGFzc2VydEVxdWFscygiZnJvbSIsIG5ldyBCaWdEZWNpbWFsKCIyLjUiKSwgc3IuZ2V0RnJvbSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0byIsIG5ldyBCaWdEZWNpbWFsKCI0LjUiKSwgc3IuZ2V0VG8oKSk7CisgICAgICAgIGFzc2VydFRydWUoImNvbnRhaW5zIDQuNSIsIHNyLmNvbnRhaW5zKG5ldyBCaWdEZWNpbWFsKCI0LjUiKSkpOworICAgICAgICBhc3NlcnRGYWxzZSgiY29udGFpbnMgNS41Iiwgc3IuY29udGFpbnMobmV3IEJpZ0RlY2ltYWwoIjUuNSIpKSk7CisgICAgICAgIGFzc2VydEVxdWFscygic2l6ZSIsIDMsIHNyLnNpemUoKSk7CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzaENvZGVBbmRFcXVhbHMoKSB7CisgICAgICAgIFJhbmdlIGEgPSBjcmVhdGVSYW5nZSgxLCAxMSk7CisgICAgICAgIFJhbmdlIGIgPSBjcmVhdGVSYW5nZSgxLCAxMSk7CisgICAgICAgIFJhbmdlIGMgPSBjcmVhdGVSYW5nZSgyLCAxMSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJoYXNoY29kZSIsIGEuaGFzaENvZGUoKSwgYi5oYXNoQ29kZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiaGFzaGNvZGUiLCBhLmhhc2hDb2RlKCkgIT0gYy5oYXNoQ29kZSgpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImEgYW5kIGIiLCBhLCBiKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoImEgIT0gYyIsIGEuZXF1YWxzKGMpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7CisgICAgICAgIFJhbmdlIHIgPSBjcmVhdGVSYW5nZSg1LCAxMSk7CisKKyAgICAgICAgaW50IGkgPSA1OworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gci5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImVxdWFscyB0byAiICsgaSwgbmV3IEludGVnZXIoaSksIChJbnRlZ2VyKSAoaXQubmV4dCgpKSk7CisgICAgICAgICAgICBpKys7CisgICAgICAgIH0KKworICAgICAgICByID0gY3JlYXRlUmFuZ2UobmV3IEJpZ0RlY2ltYWwoIjUuMCIpLCBuZXcgQmlnRGVjaW1hbCgiMTEuMCIpKTsKKyAgICAgICAgQmlnRGVjaW1hbCBvbmUgPSBuZXcgQmlnRGVjaW1hbCgiMS4wIik7CisKKyAgICAgICAgQmlnRGVjaW1hbCB2YWwgPSBuZXcgQmlnRGVjaW1hbCgiNS4wIik7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSByLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZXF1YWxzIHRvICIgKyB2YWwsIHZhbCwgKEJpZ0RlY2ltYWwpIChpdC5uZXh0KCkpKTsKKyAgICAgICAgICAgIHZhbCA9IHZhbC5hZGQob25lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBSYW5nZSBjcmVhdGVSYW5nZShpbnQgZnJvbSwgaW50IHRvKSB7CisgICAgICAgIHJldHVybiBuZXcgT2JqZWN0UmFuZ2UobmV3IEludGVnZXIoZnJvbSksIG5ldyBJbnRlZ2VyKHRvKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFJhbmdlIGNyZWF0ZVJhbmdlKEJpZ0RlY2ltYWwgZnJvbSwgQmlnRGVjaW1hbCB0bykgeworICAgICAgICByZXR1cm4gbmV3IE9iamVjdFJhbmdlKGZyb20sIHRvKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRFcXVhbHMoU3RyaW5nIG1zZywgaW50IGV4cGVjdGVkLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1zZywgbmV3IEludGVnZXIoZXhwZWN0ZWQpLCB2YWx1ZSk7CisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvbGFuZy9SYW5nZVRlc3RTdWl0ZS5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9sYW5nL1JhbmdlVGVzdFN1aXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA1YzM2YgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvbGFuZy9SYW5nZVRlc3RTdWl0ZS5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qKgorICoKKyAqLworcGFja2FnZSBncm9vdnkubGFuZzsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CisKKy8qKgorICogQ2FsbHMgYWxsIHRoZSByYW5nZS1yZWxhdGVkIHRlc3RzLgorICoKKyAqIEBhdXRob3IgRWR3aW4gVGVsbG1hbgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgUmFuZ2VUZXN0U3VpdGUgZXh0ZW5kcyBUZXN0U3VpdGUgeworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgUmFuZ2VUZXN0U3VpdGV9CisgICAgICovCisgICAgcHVibGljIFJhbmdlVGVzdFN1aXRlKCkgeworICAgICAgICBhZGRUZXN0U3VpdGUoSW50UmFuZ2VUZXN0LmNsYXNzKTsKKyAgICAgICAgYWRkVGVzdFN1aXRlKFNob3J0UmFuZ2VUZXN0LmNsYXNzKTsKKyAgICAgICAgYWRkVGVzdFN1aXRlKEludGVnZXJSYW5nZVRlc3QuY2xhc3MpOworICAgICAgICBhZGRUZXN0U3VpdGUoTG9uZ1JhbmdlVGVzdC5jbGFzcyk7CisgICAgICAgIGFkZFRlc3RTdWl0ZShGbG9hdFJhbmdlVGVzdC5jbGFzcyk7CisgICAgICAgIGFkZFRlc3RTdWl0ZShCaWdEZWNpbWFsUmFuZ2VUZXN0LmNsYXNzKTsKKyAgICAgICAgYWRkVGVzdFN1aXRlKENoYXJhY3RlclJhbmdlVGVzdC5jbGFzcyk7CisgICAgICAgIGFkZFRlc3RTdWl0ZShSYW5nZVRlc3QuY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJ1bnMgdGhlIHRlc3RzIGluIHRoZSB7QGxpbmsgVGVzdFJ1bm5lcn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXJndiBub3QgdXNlZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3YpIHsKKyAgICAgICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKG5ldyBSYW5nZVRlc3RTdWl0ZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2xhbmcvUmVzcG9uZHNUb1Rlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9sYW5nL1Jlc3BvbmRzVG9UZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmM4MmY3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9sYW5nL1Jlc3BvbmRzVG9UZXN0Lmdyb292eQpAQCAtMCwwICsxLDEwNSBAQAorLyoqCisgKiBUZXN0cyB0aGUgcmVzcG9uZHNUbyBmdW5jdGlvbmFsaXR5IG9mIEdyb292eQorIAorICogQGF1dGhvciBHcmFlbWUgUm9jaGVyCisgKiBAc2luY2UgMS4xCisgICoKKyAqIENyZWF0ZWQ6IFNlcCA3LCAyMDA3CisgKiBUaW1lOiA0OjM1OjE5IFBNCisgKiAKKyAqLworcGFja2FnZSBncm9vdnkubGFuZworY2xhc3MgUmVzcG9uZHNUb1Rlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICB2b2lkIHRlc3RSZXNwb25kc1RvRm9yTWV0aG9kRXZhbHVhdGlvbigpIHsKKyAgICAgICAgUmVzcG9uZHNUb1Rlc3RDbGFzcy5tZXRhQ2xhc3MuaW52b2tlTWV0aG9kID0ge1N0cmluZyBuYW1lLCBhcmdzIC0+CisgICAgICAgICAgICBkZWYgbWV0aG9kcyA9IFJlc3BvbmRzVG9UZXN0Q2xhc3MubWV0YUNsYXNzLnJlc3BvbmRzVG8oZGVsZWdhdGUsbmFtZSwgYXJncyouZ2V0Q2xhc3MoKSBhcyBPYmplY3RbXSkKKyAgICAgICAgICAgIGRlZiByZXN1bHQKKyAgICAgICAgICAgIGlmKG1ldGhvZHMpIHsKKyAgICAgICAgICAgICAgICAvLyBvbmx5IHdheSB0byBnZXQgdmFyLWFyZ3MgdG8gd29yayBpcyB0byBkbyB0aGlzIGF0IHRoZSBtb21lbnQuIFl1Y2shCisgICAgICAgICAgICAgICAgaWYobWV0aG9kc1swXS5wYXJhbWV0ZXJUeXBlcy5sZW5ndGggPT0gMSAmJiBtZXRob2RzWzBdLnBhcmFtZXRlclR5cGVzWzBdLmNhY2hlZENsYXNzID09IE9iamVjdFtdLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBtZXRob2RzWzBdLmludm9rZShkZWxlZ2F0ZSwgW2FyZ3NdIGFzIE9iamVjdFtdKQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbWV0aG9kc1swXS5pbnZva2UoZGVsZWdhdGUsIGFyZ3MpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAiZm9vIgorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0CisgICAgICAgIH0KKworICAgICAgICBkZWYgdCA9IG5ldyBSZXNwb25kc1RvVGVzdENsYXNzKCkKKyAgICAgICAgYXNzZXJ0RXF1YWxzICJvbmUiLCB0Lm5vQXJnc01ldGhvZCgpCisgICAgICAgIGFzc2VydEVxdWFscyAidHdvIiwgdC52YXJBcmdzTWV0aG9kKDEsMikKKyAgICAgICAgYXNzZXJ0RXF1YWxzICJ0d28iLCB0LnZhckFyZ3NNZXRob2QobnVsbCxudWxsKQorICAgICAgICBhc3NlcnRFcXVhbHMgInRocmVlIiwgdC50eXBlZEFyZ3NNZXRob2QoIm9uZSIsMSkKKyAgICAgICAgYXNzZXJ0RXF1YWxzICJ0aHJlZSIsIHQudHlwZWRBcmdzTWV0aG9kKG51bGwsMSkKKyAgICAgICAgYXNzZXJ0RXF1YWxzICJ0aHJlZSIsIHQudHlwZWRBcmdzTWV0aG9kKG51bGwsbnVsbCkKKyAgICAgICAgYXNzZXJ0RXF1YWxzICJmb3VyIiwgdC5vdmVybG9hZGVkTWV0aG9kKCJvbmUiKQorICAgICAgICBhc3NlcnRFcXVhbHMgImZpdmUiLCB0Lm92ZXJsb2FkZWRNZXRob2QoMSkKKyAgICAgICAgYXNzZXJ0RXF1YWxzICJmb3VyIiwgdC5vdmVybG9hZGVkTWV0aG9kKG51bGwpCisgICAgICAgIGFzc2VydEVxdWFscyAic2l4IiwgdC5vdmVybG9hZGVkTWV0aG9kKCkKKyAgICAgICAgYXNzZXJ0RXF1YWxzICJmb28iLCB0LmRvU3R1ZmYoKQorICAgIH0KKworICAgIHZvaWQgdGVzdFJlc3BvbmRzVG8oKSB7CisKKyAgICAgICAgUlRUZXN0Mi5tZXRhQ2xhc3MubmV3TSA9IHstPiAiZm9vIiB9CisKKyAgICAgICAgZGVmIHQgPSBuZXcgUlRUZXN0MigpCisKKyAgICAgICAgYXNzZXJ0IHQubWV0YUNsYXNzLnJlc3BvbmRzVG8odCwib25lIikKKyAgICAgICAgYXNzZXJ0IHQubWV0YUNsYXNzLnJlc3BvbmRzVG8odCwidGhyZWUiKQorICAgICAgICBhc3NlcnQgdC5tZXRhQ2xhc3MucmVzcG9uZHNUbyh0LCJvbmUiLCBTdHJpbmcpCisgICAgICAgIGFzc2VydCB0Lm1ldGFDbGFzcy5yZXNwb25kc1RvKHQsImZvbyIsIFN0cmluZykKKyAgICAgICAgYXNzZXJ0IHQubWV0YUNsYXNzLnJlc3BvbmRzVG8odCwiYmFyIiwgU3RyaW5nKQorICAgICAgICBhc3NlcnQgdC5tZXRhQ2xhc3MucmVzcG9uZHNUbyh0LCJzdHVmZiIpCisgICAgICAgIC8vYXNzZXJ0IHQubWV0YUNsYXNzLnJlc3BvbmRzVG8odCwidHdvIikgVEhJUyBET0VTTidUIFdPUkshIFNob3VsZCByZXNwb25kcyB0byBkZWFsIHdpdGggY2xvc3VyZSBwcm9wZXJ0aWVzPworICAgICAgICBhc3NlcnQgdC5tZXRhQ2xhc3MucmVzcG9uZHNUbyh0LCJnZXRGaXZlIikKKyAgICAgICAgYXNzZXJ0IHQubWV0YUNsYXNzLnJlc3BvbmRzVG8odCwic2V0Rml2ZSIpCisgICAgICAgIGFzc2VydCB0Lm1ldGFDbGFzcy5yZXNwb25kc1RvKHQsInNldEZpdmUiLCBTdHJpbmcpCisgICAgICAgIGFzc2VydCB0Lm1ldGFDbGFzcy5yZXNwb25kc1RvKHQsIm5ld00iKQorICAgICAgICBhc3NlcnQgIXQubWV0YUNsYXNzLnJlc3BvbmRzVG8odCwib25lIiwgU3RyaW5nLCBJbnRlZ2VyKQorICAgIH0KKworICAgIHZvaWQgdGVzdEhhc1Byb3BlcnR5KCkgeworICAgICAgICBSVFRlc3QyLm1ldGFDbGFzcy5nZXROZXdQcm9wID0gey0+ICJuZXciIH0KKyAgICAgICAgZGVmIHQgPSBuZXcgUlRUZXN0MigpCisKKyAgICAgICAgYXNzZXJ0IHQubWV0YUNsYXNzLmhhc1Byb3BlcnR5KHQsInR3byIpCisgICAgICAgIGFzc2VydCB0Lm1ldGFDbGFzcy5oYXNQcm9wZXJ0eSh0LCJmaXZlIikKKyAgICAgICAgYXNzZXJ0IHQubWV0YUNsYXNzLmhhc1Byb3BlcnR5KHQsInNpeCIpCisgICAgICAgIGFzc2VydCB0Lm1ldGFDbGFzcy5oYXNQcm9wZXJ0eSh0LCJzZXZlbiIpCisgICAgICAgIGFzc2VydCB0Lm1ldGFDbGFzcy5oYXNQcm9wZXJ0eSh0LCJlaWdodCIpCisgICAgICAgIGFzc2VydCB0Lm1ldGFDbGFzcy5oYXNQcm9wZXJ0eSh0LCJuZXdQcm9wIikKKworICAgIH0KK30KK2NsYXNzIFJlc3BvbmRzVG9UZXN0Q2xhc3MgeworICAgIGRlZiBub0FyZ3NNZXRob2QoKSB7ICJvbmUiIH0KKyAgICBkZWYgdmFyQXJnc01ldGhvZChPYmplY3RbXSBhcmdzKSB7ICJ0d28iIH0KKyAgICBkZWYgdHlwZWRBcmdzTWV0aG9kKFN0cmluZyBvbmUsIEludGVnZXIgdHdvKSB7ICJ0aHJlZSIgfQorICAgIGRlZiBvdmVybG9hZGVkTWV0aG9kKFN0cmluZyBvbmUpIHsgImZvdXIiIH0KKyAgICBkZWYgb3ZlcmxvYWRlZE1ldGhvZChJbnRlZ2VyIG9uZSkgeyAiZml2ZSIgfQorICAgIGRlZiBvdmVybG9hZGVkTWV0aG9kKCkgeyAic2l4IiB9Cit9CitjbGFzcyBSVFRlc3QxIHsKKyAgICBTdHJpbmcgZml2ZQorICAgIGRlZiB0d28gPSB7ICJ0aHJlZSIgfQorICAgIGRlZiBvbmUoKSB7ICJ0d28ifQorICAgIGRlZiBvbmUoU3RyaW5nIG9uZSkgeyAidHdvOiAkb25lIiB9CisgICAgZGVmIHRocmVlKFN0cmluZyBvbmUpIHsgImZvdXIiIH0KKyAgICBkZWYgdGhyZWUoSW50ZWdlciBvbmUpIHsgImZvdXIiIH0KKyAgICBkZWYgZm9vKFN0cmluZyBuYW1lKSB7CisgICAgICAgICJiYXIiCisgICAgfQorCisgICAgU3RyaW5nIGdldFNldmVuKCkgeyAic2V2ZW4iIH0KK30KK2NsYXNzIFJUVGVzdDIgZXh0ZW5kcyBSVFRlc3QxIHsKKyAgICBTdHJpbmcgc2l4CisgICAgZGVmIGJhcihTdHJpbmcgbmFtZSkgeyAiZm9vIiB9CisgICAgc3RhdGljIHN0dWZmKCkgeyAiZ29vZGllIiB9CisKKyAgICBTdHJpbmcgZ2V0RWlnaHQoKSB7ICJlaWdodCIgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvbGFuZy9TY3JpcHRJbnRlZ2VyRGl2aWRlVGVzdC5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9sYW5nL1NjcmlwdEludGVnZXJEaXZpZGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RmZDgyMAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvbGFuZy9TY3JpcHRJbnRlZ2VyRGl2aWRlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTggQEAKK3BhY2thZ2UgZ3Jvb3Z5Lmxhbmc7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuLlRlc3RTdXBwb3J0OworCisKKy8qKgorICogQGF1dGhvciBTdGV2ZSBHb2V0emUKKyAqIEBhdXRob3IgSmVyZW15IFJheW5lcgorICovCitwdWJsaWMgY2xhc3MgU2NyaXB0SW50ZWdlckRpdmlkZVRlc3QgZXh0ZW5kcyBUZXN0U3VwcG9ydCB7CisKKyAgICAvKioKKyAgICAgKiBDaGVjayBpbnRlZ2VyIGRpdmlzaW9uIHdoaWNoIGlzIG5vdyBhIG1ldGhvZCBjYWxsIHJhdGhlciB0aGFuIHRoZSBzeW1ib2wgIlwiLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnRlZ2VyRGl2aWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydFNjcmlwdCgiYXNzZXJ0IDQuaW50ZGl2KDMpID09IDEiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2xhbmcvU2NyaXB0UHJpbnRUZXN0LmphdmEgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2xhbmcvU2NyaXB0UHJpbnRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBhMjU2YwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvbGFuZy9TY3JpcHRQcmludFRlc3QuamF2YQpAQCAtMCwwICsxLDY0IEBACisvKgorICRJZCQKKworIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCisgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQKKyAgICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKKyAgICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCisgICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQorICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgorICAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKKyAgICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KKworIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCisgICAgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAorICAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCisKKyA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQorICAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLworCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUworIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAorIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKKyBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgKi8KKworcGFja2FnZSBncm9vdnkubGFuZzsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW4uVGVzdFN1cHBvcnQ7CisKKy8qKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIFNjcmlwdFByaW50VGVzdCBleHRlbmRzIFRlc3RTdXBwb3J0IHsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RTY3JpcHRXaXRoQ3VzdG9tUHJpbnRsbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRTY3JpcHQoCisgICAgICAgICAgICAgICAgIm91dCA9IG5ldyBNb2NrV3JpdGVyKCk7IHByaW50bG4oKTsgYXNzZXJ0IG91dC5vdXRwdXQgPT0gJ3ByaW50bG4oKScsICd2YWx1ZSBvZiBvdXRwdXQgaXM6ICcgKyBvdXQub3V0cHV0XG4iCisgICAgICAgICAgICAgICAgICAgICAgICArICJwcmludCgnaGV5Jyk7IGFzc2VydCBvdXQub3V0cHV0ID09ICdwcmludChoZXkpJyAsICd2YWx1ZSBpczogJyArIG91dC5vdXRwdXRcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgInByaW50bG4oJ2hleScpOyBhc3NlcnQgb3V0Lm91dHB1dCA9PSAncHJpbnRsbihoZXkpJywgJ3ZhbHVlIGlzOiAnICsgb3V0Lm91dHB1dFxuIik7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2xhbmcvU2NyaXB0VGVzdC5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9sYW5nL1NjcmlwdFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODdiZmEzCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9sYW5nL1NjcmlwdFRlc3QuamF2YQpAQCAtMCwwICsxLDg5IEBACisvKgorICRJZCQKKworIENvcHlyaWdodCAyMDAzIChDKSBHdWlsbGF1bWUgTGFmb3JnZS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCisgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQKKyAgICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKKyAgICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCisgICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQorICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgorICAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKKyAgICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KKworIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCisgICAgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAorICAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCisKKyA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQorICAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLworCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUworIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAorIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKKyBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgKi8KKworcGFja2FnZSBncm9vdnkubGFuZzsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW4uVGVzdFN1cHBvcnQ7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLkNvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5NZXRob2RDbG9zdXJlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBUZXN0cyBzb21lIHBhcnRpY3VsYXIgc2NyaXB0IGZlYXR1cmVzLgorICoKKyAqIEBhdXRob3IgR3VpbGxhdW1lIExhZm9yZ2UKKyAqLworcHVibGljIGNsYXNzIFNjcmlwdFRlc3QgZXh0ZW5kcyBUZXN0U3VwcG9ydCB7CisgICAgLyoqCisgICAgICogV2hlbiBhIG1ldGhvZCBpcyBub3QgZm91bmQgaW4gdGhlIGN1cnJlbnQgc2NyaXB0LCBjaGVja3MgdGhhdCBpdCdzIHBvc3NpYmxlIHRvIGNhbGwgYSBtZXRob2QgY2xvc3VyZSBmcm9tIHRoZSBiaW5kaW5nLgorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgQ29tcGlsYXRpb25GYWlsZWRFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlTWV0aG9kRmFsbHNUaHJvdWdoVG9NZXRob2RDbG9zdXJlSW5CaW5kaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyB0ZXh0ID0gImlmIChtZXRob2QoKSA9PSAzKSB7IHByaW50bG4gJ3N1Y2NlZWRlZCcgfSI7CisKKyAgICAgICAgR3Jvb3Z5Q29kZVNvdXJjZSBjb2RlU291cmNlID0gbmV3IEdyb292eUNvZGVTb3VyY2UodGV4dCwgImdyb292eS5zY3JpcHQiLCAiZ3Jvb3Z5LnNjcmlwdCIpOworICAgICAgICBHcm9vdnlDbGFzc0xvYWRlciBsb2FkZXIgPSBuZXcgR3Jvb3Z5Q2xhc3NMb2FkZXIoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgIENsYXNzIGNsYXp6ID0gbG9hZGVyLnBhcnNlQ2xhc3MoY29kZVNvdXJjZSk7CisgICAgICAgIFNjcmlwdCBzY3JpcHQgPSAoKFNjcmlwdCkgY2xhenoubmV3SW5zdGFuY2UoKSk7CisKKyAgICAgICAgQmluZGluZyBiaW5kaW5nID0gbmV3IEJpbmRpbmcoKTsKKyAgICAgICAgYmluZGluZy5zZXRWYXJpYWJsZSgibWV0aG9kIiwgbmV3IE1ldGhvZENsb3N1cmUobmV3IER1bW15KCksICJtZXRob2QiKSk7CisgICAgICAgIHNjcmlwdC5zZXRCaW5kaW5nKGJpbmRpbmcpOworCisgICAgICAgIHNjcmlwdC5ydW4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIER1bW15IHsKKyAgICAgICAgcHVibGljIEludGVnZXIgbWV0aG9kKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnRlZ2VyKDMpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9sYW5nL1NlcXVlbmNlVGVzdC5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9sYW5nL1NlcXVlbmNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNTAwOTIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2xhbmcvU2VxdWVuY2VUZXN0LmphdmEKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgJElkJAorCisgQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQKKyB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIGNvcHlyaWdodAorICAgIHN0YXRlbWVudHMgYW5kIG5vdGljZXMuICBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYQorICAgIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KKworIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUKKyAgICBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCisgICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCisgICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworIDMuIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCisgICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLAorICAgIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLgorCisgNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIKKyAgICBub3IgbWF5ICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYSByZWdpc3RlcmVkCisgICAgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KKworIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtCisgICAgaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTCisgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECisgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTAorIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAqLworCitwYWNrYWdlIGdyb292eS5sYW5nOworCitpbXBvcnQgZ3Jvb3Z5LnV0aWwuR3Jvb3Z5VGVzdENhc2U7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLkludm9rZXJIZWxwZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBUZXN0cyB0aGUgdXNlIG9mIHRoZSBzdHJ1Y3R1cmVkIEF0dHJpYnV0ZSB0eXBlCisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIFNlcXVlbmNlVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3Rpb24oKSB7CisgICAgICAgIFNlcXVlbmNlIHNlcXVlbmNlID0gbmV3IFNlcXVlbmNlKFN0cmluZy5jbGFzcyk7CisgICAgICAgIHNlcXVlbmNlLmFkZCgiSmFtZXMiKTsKKyAgICAgICAgc2VxdWVuY2UuYWRkKCJCb2IiKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIlNpemUiLCAyLCBzZXF1ZW5jZS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkVsZW1lbnQiLCAiSmFtZXMiLCBzZXF1ZW5jZS5nZXQoMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkVsZW1lbnQiLCAiQm9iIiwgc2VxdWVuY2UuZ2V0KDEpKTsKKworICAgICAgICAvLyBub3cgbGV0cyB0cnkgc29tZSBtZXRob2RzIG9uIGVhY2ggaXRlbSBpbiB0aGUgbGlzdAorICAgICAgICBMaXN0IGFuc3dlciA9IChMaXN0KSBJbnZva2VySGVscGVyLmludm9rZU1ldGhvZChzZXF1ZW5jZSwgInN0YXJ0c1dpdGgiLCBuZXcgT2JqZWN0W117IkphIn0pOworICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhuZXcgT2JqZWN0W117Qm9vbGVhbi5UUlVFLCBCb29sZWFuLkZBTFNFfSwgYW5zd2VyLnRvQXJyYXkoKSk7CisKKyAgICAgICAgYW5zd2VyID0gKExpc3QpIEludm9rZXJIZWxwZXIuaW52b2tlTWV0aG9kKHNlcXVlbmNlLCAibGVuZ3RoIiwgbnVsbCk7CisgICAgICAgIGFzc2VydEFycmF5RXF1YWxzKG5ldyBPYmplY3RbXXtuZXcgSW50ZWdlcig1KSwgbmV3IEludGVnZXIoMyl9LCBhbnN3ZXIudG9BcnJheSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkaW5nV3JvbmdUeXBlRmFpbHMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTZXF1ZW5jZSBzZXF1ZW5jZSA9IG5ldyBTZXF1ZW5jZShTdHJpbmcuY2xhc3MpOworICAgICAgICAgICAgc2VxdWVuY2UuYWRkKG5ldyBJbnRlZ2VyKDUpKTsKKworICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGV4Y2VwdGlvbiIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDYXVnaHQ6ICIgKyBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRpbmdOdWxsRmFpbHMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTZXF1ZW5jZSBzZXF1ZW5jZSA9IG5ldyBTZXF1ZW5jZShTdHJpbmcuY2xhc3MpOworICAgICAgICAgICAgc2VxdWVuY2UuYWRkKG51bGwpOworCisgICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gZXhjZXB0aW9uIik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2F1Z2h0OiAiICsgZSk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvbGFuZy9TaG9ydFJhbmdlVGVzdC5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9sYW5nL1Nob3J0UmFuZ2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ3ZDM2YgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvbGFuZy9TaG9ydFJhbmdlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgJElkOiBTaG9ydFJhbmdlVGVzdC5qYXZhLHYgMS4xIDIwMDYvMTEvMTMgMTA6MjM6NTggZWR3aW4gRXhwIGVkd2luICQKKworIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCisgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQKKyAgICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKKyAgICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCisgICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQorICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgorICAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKKyAgICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KKworIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCisgICAgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAorICAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCisKKyA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQorICAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLworCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUworIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAorIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKKyBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgKi8KK3BhY2thZ2UgZ3Jvb3Z5Lmxhbmc7CisKKworLyoqCisgKiBUZXN0cyB7QGxpbmsgT2JqZWN0UmFuZ2V9cyBvZiB7QGxpbmsgU2hvcnR9cy4KKyAqCisgKiBAYXV0aG9yICRBdXRob3IkCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBTaG9ydFJhbmdlVGVzdCBleHRlbmRzIE51bWJlclJhbmdlVGVzdCB7CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHJvdGVjdGVkIFJhbmdlIGNyZWF0ZVJhbmdlKGludCBmcm9tLCBpbnQgdG8pIHsKKyAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RSYW5nZShuZXcgU2hvcnQoKHNob3J0KSBmcm9tKSwgbmV3IFNob3J0KChzaG9ydCkgdG8pKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHJvdGVjdGVkIENvbXBhcmFibGUgY3JlYXRlVmFsdWUoaW50IHZhbHVlKSB7CisgICAgICAgIHJldHVybiBuZXcgSW50ZWdlcih2YWx1ZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9sYW5nL1R1cGxlVGVzdC5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9sYW5nL1R1cGxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4Y2M0OGMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L2xhbmcvVHVwbGVUZXN0LmphdmEKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgJElkJAorCisgQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQKKyB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIGNvcHlyaWdodAorICAgIHN0YXRlbWVudHMgYW5kIG5vdGljZXMuICBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYQorICAgIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KKworIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUKKyAgICBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCisgICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCisgICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworIDMuIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCisgICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLAorICAgIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLgorCisgNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIKKyAgICBub3IgbWF5ICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYSByZWdpc3RlcmVkCisgICAgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KKworIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtCisgICAgaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTCisgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECisgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTAorIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAqLworcGFja2FnZSBncm9vdnkubGFuZzsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEBhdXRob3IgSmFtZXMgU3RyYWNoYW4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIFR1cGxlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIGZpbmFsIE9iamVjdFtdIGRhdGEgPSB7ImEiLCAiYiIsICJjIn07CisgICAgZmluYWwgVHVwbGUgdCA9IG5ldyBUdXBsZShkYXRhKTsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RTaXplKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIlNpemUgb2YgIiArIHQsIDMsIHQuc2l6ZSgpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImdldCgwKSIsICJhIiwgdC5nZXQoMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImdldCgxKSIsICJiIiwgdC5nZXQoMSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRPdXRPZlR1cGxlKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgdC5nZXQoLTEpOworICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIEluZGV4T3V0Iik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gd29ya2VkCisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHQuZ2V0KDEwKTsKKyAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBJbmRleE91dCIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIHdvcmtlZAorICAgICAgICB9CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnMoKSB7CisgICAgICAgIGFzc2VydFRydWUoImNvbnRhaW5zIGEiLCB0LmNvbnRhaW5zKCJhIikpOworICAgICAgICBhc3NlcnRUcnVlKCJjb250YWlucyBiIiwgdC5jb250YWlucygiYiIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3ViTGlzdCgpIHsKKyAgICAgICAgTGlzdCBzID0gdC5zdWJMaXN0KDEsIDIpOworCisgICAgICAgIGFzc2VydFRydWUoImlzIGEgVHVwbGUiLCBzIGluc3RhbmNlb2YgVHVwbGUpOworCisgICAgICAgIGFzc2VydEVxdWFscygic2l6ZSIsIDEsIHMuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzaENvZGVBbmRFcXVhbHMoKSB7CisgICAgICAgIFR1cGxlIGEgPSBuZXcgVHVwbGUobmV3IE9iamVjdFtdeyJhIiwgImIiLCAiYyJ9KTsKKyAgICAgICAgVHVwbGUgYiA9IG5ldyBUdXBsZShuZXcgT2JqZWN0W117ImEiLCAiYiIsICJjIn0pOworICAgICAgICBUdXBsZSBjID0gbmV3IFR1cGxlKG5ldyBPYmplY3RbXXsiZCIsICJiIiwgImMifSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJoYXNoY29kZSIsIGEuaGFzaENvZGUoKSwgYi5oYXNoQ29kZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiaGFzaGNvZGUiLCBhLmhhc2hDb2RlKCkgIT0gYy5oYXNoQ29kZSgpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImEgYW5kIGIiLCBhLCBiKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoImEgIT0gYyIsIGEuZXF1YWxzKGMpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L21vY2svTW9ja1Rlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9tb2NrL01vY2tUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWI4ZDhhCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9tb2NrL01vY2tUZXN0Lmdyb292eQpAQCAtMCwwICsxLDk1IEBACitwYWNrYWdlIGdyb292eS5tb2NrCisKK2ltcG9ydCBncm9vdnkubW9jay5Hcm9vdnlNb2NrCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yCisKK2NsYXNzIE1vY2tUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgZGVmIG1vY2sKKworICAgIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIG1vY2sgPSBHcm9vdnlNb2NrLm5ld0luc3RhbmNlKCkKKyAgICB9CisKKyAgICB2b2lkIHRlc3RBU2ltcGxlRXhwZWN0YXRpb25DYW5CZVNldEFuZE1ldCgpIHsKKyAgICAgICAgLy8gZXhwZWN0YXRpb24KKyAgICAgICAgbW9jay5kb1NvbWV0aGluZygiaGVsbG8iKQorCisgICAgICAgIC8vIGV4ZWN1dGUKKyAgICAgICAgbW9jay5pbnN0YW5jZS5kb1NvbWV0aGluZygiaGVsbG8iKQorCisgICAgICAgIC8vIHZlcmlmeQorICAgICAgICBtb2NrLnZlcmlmeSgpCisgICAgfQorCisgICAgdm9pZCB0ZXN0QVNpbXBsZUV4cGVjdGF0aW9uQ2FuQmVTZXRBbmRGYWlsZWQoKSB7CisgICAgICAgIC8vIGV4cGVjdGF0aW9uCisgICAgICAgIG1vY2suZG9Tb21ldGhpbmcoImhlbGxvIikKKworICAgICAgICAvLyBleGVjdXRlCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtb2NrLmluc3RhbmNlLmRvU29tZXRoaW5nKCJnb29kYnllIikKKyAgICAgICAgICAgIGZhaWwoImV4cGVjdGVkIGV4Y2VwdGlvbiIpCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZ29vZEV4Y2VwdGlvbikgeworICAgICAgICB9CisKKyAgICB9CisKKyAgICB2b2lkIHRlc3RBU2ltcGxlRXhwZWN0YXRpb25DYW5CZVNldEJ1dE5ldmVyQ2FsbGVkU29WZXJpZnlGYWlscygpIHsKKyAgICAgICAgLy8gZXhwZWN0YXRpb24KKyAgICAgICAgbW9jay5kb1NvbWV0aGluZygiaGVsbG8iKQorCisgICAgICAgIC8vIGV4ZWN1dGUKKyAgICAgICAgLy8gZG9uJ3QgY2FsbCBpdAorCisgICAgICAgIC8vIHZlcmlmeQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbW9jay52ZXJpZnkoKQorICAgICAgICAgICAgZmFpbCgic2hvdWxkIG5vdCBoYXZlIHZlcmlmaWVkIikKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZ29vZEV4Y2VwdGlvbikgeworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCB0ZXN0QW5FeHBlY3RhdGlvbldpdGhBQ2xvc3VyZUdpdmVzRXJyb3JJRkNhbGxlZEFuZENsb3N1cmVGYWlscygpIHsKKyAgICAgICAgbW9jay5kb1NvbWV0aGluZygge2FyZyAtPiBhc3NlcnQgYXJnPT0icG9vIiB9ICkKKworICAgICAgICAvLyB2ZXJpZnkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1vY2suaW5zdGFuY2UuZG9Tb21ldGhpbmcoImhlbGxvIikKKyAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIHZlcmlmeSB0byBmYWlsIik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vZXhwZWN0ZWQKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogd2FzIEdST09WWS03NgorICAgICAqLworICAgIHZvaWQgdGVzdEFuRXhwZWN0YXRpb253aXRoQUNsb3N1cmVQYXNzZXNJZkNsb3N1cmVQYXNzZXMoKSB7CisgICAgICAgIG1vY2suZG9Tb21ldGhpbmcge2FyZyAtPiBhc3NlcnQgYXJnPT0iaGVsbG8iIH0KKworICAgICAgICAvLyBleGVjdXRlCisgICAgICAgIG1vY2suaW5zdGFuY2UuZG9Tb21ldGhpbmcoImhlbGxvIikKKworICAgICAgICAvL3ZlcmlmeQorICAgICAgICBtb2NrLnZlcmlmeSgpCisgICAgfQorCisgICAgdm9pZCB0ZXN0QW5FeHBlY3RhdGlvbldpdGhBQ2xvc3VyZUdpdmVzRXJyb3JJRk5vdENhbGxlZCgpIHsKKyAgICAgICAgbW9jay5kb1NvbWV0aGluZygge2FyZyAtPiBhc3NlcnQgYXJnPT0icG9vIiB9ICkKKyAgICAgICAgLy8gdmVyaWZ5CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtb2NrLnZlcmlmeSgpCisgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCB2ZXJpZnkgdG8gZmFpbCIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChBc3NlcnRpb25GYWlsZWRFcnJvciBleCkgeworICAgICAgICAgICAgLy9leHBlY3RlZAorICAgICAgICB9CisgICAgfQorCit9CisKKwpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9tb2NrL2V4YW1wbGUvQ2hlZXNlU2xpY2VyLmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvbW9jay9leGFtcGxlL0NoZWVzZVNsaWNlci5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI4ZTM0OAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvbW9jay9leGFtcGxlL0NoZWVzZVNsaWNlci5ncm9vdnkKQEAgLTAsMCArMSwxMyBAQAorcGFja2FnZSBncm9vdnkubW9jay5leGFtcGxlCisKK2NsYXNzIENoZWVzZVNsaWNlciB7CisKKyAgICB2b2lkIHNsaWNlKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCd3aGF0ZXZlciBuYXN0eSBiZWhhdmlvciB0aGF0IG5lZWRzIHRvIGJlIG1vY2tlZC4uLicpCisgICAgfQorCisgICAgdm9pZCBjb2ZmZWVCcmVhayhTdHJpbmcgbmFtZSkgeworICAgICAgICAvLyBkdW0gZGlkdW0gZGlkdW0gKnNsdXJwKiwgKnNwaWxsKgorICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvbW9jay9leGFtcGxlL1NhbmR3aWNoTWFrZXIuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9tb2NrL2V4YW1wbGUvU2FuZHdpY2hNYWtlci5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNlNWM5MwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvbW9jay9leGFtcGxlL1NhbmR3aWNoTWFrZXIuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTEgQEAKK3BhY2thZ2UgZ3Jvb3Z5Lm1vY2suZXhhbXBsZQorCitjbGFzcyBTYW5kd2ljaE1ha2VyIHsKKworICAgIGRlZiBjaGVlc2VTbGljZXIgPSBuZXcgQ2hlZXNlU2xpY2VyKCkKKworICAgIHZvaWQgbWFrZUZhdHR5U2FuZHdpY2goKSB7CisgICAgICAgIGNoZWVzZVNsaWNlci5zbGljZSgiY2hlZGRhciIpCisgICAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9tb2NrL2V4YW1wbGUvU2FuZHdpY2hNYWtlclRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9tb2NrL2V4YW1wbGUvU2FuZHdpY2hNYWtlclRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMGFlOGYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L21vY2svZXhhbXBsZS9TYW5kd2ljaE1ha2VyVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwyMyBAQAorcGFja2FnZSBncm9vdnkubW9jay5leGFtcGxlCisKK2ltcG9ydCBncm9vdnkubW9jay5pbnRlcmNlcHRvci5Nb2NrRm9yCisKK2NsYXNzIFNhbmR3aWNoTWFrZXJUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCB0ZXN0U3R1ZmYoKXsKKworICAgICAgICBkZWYgbW9ja2VyID0gbmV3IE1vY2tGb3IoQ2hlZXNlU2xpY2VyLmNsYXNzKQorCisgICAgICAgIG1vY2tlci5kZW1hbmQuc2xpY2UgeyBuYW1lIC0+CisgICAgICAgICAgICBhc3NlcnQgbmFtZS5zdGFydHNXaXRoKCJjaCIpIAorICAgICAgICB9CisKKyAgICAgICAgZGVmIHNhbmR3aWNoTWFrZXIgPSBuZXcgU2FuZHdpY2hNYWtlcigpCisKKyAgICAgICAgbW9ja2VyLnVzZShzYW5kd2ljaE1ha2VyLmNoZWVzZVNsaWNlcikgeyAvLyB0b2RvOiBzaG91bGQgYWxzbyB3b3JrIHdpdGhvdXQgZ2l2aW5nIHRoZSBvYmplY3QhCisgICAgICAgICAgICBzYW5kd2ljaE1ha2VyLm1ha2VGYXR0eVNhbmR3aWNoKCkKKyAgICAgICAgfQorCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L21vY2svaW50ZXJjZXB0b3IvQ2FsbGVyLmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvbW9jay9pbnRlcmNlcHRvci9DYWxsZXIuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlOWI5NGYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L21vY2svaW50ZXJjZXB0b3IvQ2FsbGVyLmdyb292eQpAQCAtMCwwICsxLDQyIEBACitwYWNrYWdlIGdyb292eS5tb2NrLmludGVyY2VwdG9yCisKKy8qKgorICAgIEhlbHBlciBjbGFzcyBmb3IgdGVzdGluZy4KKyAgICBAYXV0aG9yIERpZXJrIEtvZW5pZworKi8KKworY2xhc3MgQ2FsbGVyIHsKKyAgICBpbnQgY29sbGFib3JhdGVPbmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgQ29sbGFib3JhdG9yKCkub25lKCkKKyAgICB9CisgICAgaW50IGNvbGxhYm9yYXRlT25lKGludCBhcmcpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDb2xsYWJvcmF0b3IoKS5vbmUoIGFyZyApCisgICAgfQorICAgIGludCBjb2xsYWJvcmF0ZU9uZShpbnQgb25lLCB0d28pIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDb2xsYWJvcmF0b3IoKS5vbmUoIG9uZSwgdHdvICkKKyAgICB9CisgICAgaW50IGNvbGxhYm9yYXRlVHdvKCkgeworICAgICAgICByZXR1cm4gbmV3IENvbGxhYm9yYXRvcigpLnR3bygpCisgICAgfQorICAgIFN0cmluZyBjb2xsYWJvcmF0ZUphdmEoKSB7CisgICAgICAgIHJldHVybiAnd2hhdGV2ZXInLnRvU3RyaW5nKCkKKyAgICB9CisKKyAgICBTdHJpbmcgY2FsbEZvbzEoKSB7CisgICAgICAgIHJldHVybiBuZXcgQ29sbGFib3JhdG9yKCkuZm9vCisgICAgfQorICAgIFN0cmluZyBjYWxsRm9vMigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDb2xsYWJvcmF0b3IoKS5mb28KKyAgICB9CisKKyAgICB2b2lkIHNldEJhcjEoKSB7CisgICAgICAgIG5ldyBDb2xsYWJvcmF0b3IoKS5iYXIgPSAiYmFyMSIKKyAgICAgICAgcmV0dXJuCisgICAgfQorCisgICAgdm9pZCBzZXRCYXIyKCkgeworICAgICAgICBuZXcgQ29sbGFib3JhdG9yKCkuc2V0QmFyKCJiYXIyIikKKyAgICAgICAgcmV0dXJuCisgICAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9tb2NrL2ludGVyY2VwdG9yL0NvbGxhYm9yYXRvci5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L21vY2svaW50ZXJjZXB0b3IvQ29sbGFib3JhdG9yLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmE3N2YzCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9tb2NrL2ludGVyY2VwdG9yL0NvbGxhYm9yYXRvci5ncm9vdnkKQEAgLTAsMCArMSwyNSBAQAorcGFja2FnZSBncm9vdnkubW9jay5pbnRlcmNlcHRvcgorCisvKioKKyAgICBIZWxwZXIgY2xhc3MgZm9yIHRlc3RpbmcuCisgICAgQGF1dGhvciBEaWVyayBLb2VuaWcKKyovCisKK2NsYXNzIENvbGxhYm9yYXRvciB7CisKKyAgICBTdHJpbmcgZm9vID0gImJhciIKKyAgICBTdHJpbmcgYmFyID0gImZvbyIKKyAgICAKKyAgICBkZWYgb25lKCkgeworICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignTmV2ZXIgcmVhY2ggaGVyZS4gU2hvdWxkIGhhdmUgYmVlbiBtb2NrZWQuJykKKyAgICB9CisgICAgZGVmIG9uZShpbnQgYXJnKSB7CisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCdOZXZlciByZWFjaCBoZXJlLiBTaG91bGQgaGF2ZSBiZWVuIG1vY2tlZC4nKQorICAgIH0KKyAgICBkZWYgb25lKGludCBvbmUsIGludCB0d28pIHsKKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oJ05ldmVyIHJlYWNoIGhlcmUuIFNob3VsZCBoYXZlIGJlZW4gbW9ja2VkLicpCisgICAgfQorICAgIGRlZiB0d28oKSB7CisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCdOZXZlciByZWFjaCBoZXJlLiBTaG91bGQgaGF2ZSBiZWVuIG1vY2tlZC4nKQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L21vY2svaW50ZXJjZXB0b3IvSXRlcmF0b3JDb3VudGVyLmphdmEgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L21vY2svaW50ZXJjZXB0b3IvSXRlcmF0b3JDb3VudGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQyYTVjNwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvbW9jay9pbnRlcmNlcHRvci9JdGVyYXRvckNvdW50ZXIuamF2YQpAQCAtMCwwICsxLDkgQEAKK3BhY2thZ2UgZ3Jvb3Z5Lm1vY2suaW50ZXJjZXB0b3I7DQorDQorcHVibGljIGNsYXNzIEl0ZXJhdG9yQ291bnRlciB7DQorICAgIHB1YmxpYyBpbnQgY291bnQoamF2YS51dGlsLkl0ZXJhdG9yIGl0KSB7DQorICAgICAgICBpbnQgY291bnQgPSAwOw0KKyAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgY291bnQrKzsNCisgICAgICAgIHJldHVybiBjb3VudDsNCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L21vY2svaW50ZXJjZXB0b3IvTW9ja0NhbGxTZXF1ZW5jZVRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9tb2NrL2ludGVyY2VwdG9yL01vY2tDYWxsU2VxdWVuY2VUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTNkOTdjCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9tb2NrL2ludGVyY2VwdG9yL01vY2tDYWxsU2VxdWVuY2VUZXN0Lmdyb292eQpAQCAtMCwwICsxLDE3MyBAQAorcGFja2FnZSBncm9vdnkubW9jay5pbnRlcmNlcHRvcgorCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yCisKKy8qCisgICAgVGVzdGluZyBHcm9vdnkgTW9jayBzdXBwb3J0IGZvciBtdWx0aXBsZSBjYWxscyB0byB0aGUgQ29sbGFib3JhdG9yIHdpdGgKKyAgICBkZW1hbmRpbmcgb25lIG9yIHR3byBtZXRob2RzIG11bHRpcGxlIGFuZCBhbmQgdmFyaW91cyByYW5nZXMuCisgICAgQGF1dGhvciBEaWVyayBLb2VuaWcKKyovCisKK2NsYXNzIE1vY2tDYWxsU2VxdWVuY2VUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgTW9ja0ZvciBtb2NrZXIKKworICAgIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIG1vY2tlciA9IG5ldyBNb2NrRm9yKENvbGxhYm9yYXRvci5jbGFzcykKKyAgICB9CisKKyAgICB2b2lkIHRlc3RVbmRlbWFuZGVkQ2FsbEZhaWxzRWFybHkoKSB7CisgICAgICAgIC8vIG5vIGRlbWFuZCBoZXJlCisgICAgICAgIG1vY2tlci51c2UgeworICAgICAgICAgICAgZGVmIGNhbGxlciA9IG5ldyBDYWxsZXIoKQorICAgICAgICAgICAgc2hvdWxkRmFpbChBc3NlcnRpb25GYWlsZWRFcnJvci5jbGFzcykgeyBjYWxsZXIuY29sbGFib3JhdGVPbmUoKSB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHRlc3RPbmVEZW1hbmRlZFR3b0NhbGxlZEZhaWxzRWFybHkoKSB7CisgICAgICAgIG1vY2tlci5kZW1hbmQub25lIHsgMSB9CisgICAgICAgIG1vY2tlci51c2UgeworICAgICAgICAgICAgZGVmIGNhbGxlciA9IG5ldyBDYWxsZXIoKQorICAgICAgICAgICAgY2FsbGVyLmNvbGxhYm9yYXRlT25lKCkKKyAgICAgICAgICAgIHNob3VsZEZhaWwoQXNzZXJ0aW9uRmFpbGVkRXJyb3IuY2xhc3MpIHsgY2FsbGVyLmNvbGxhYm9yYXRlT25lKCkgfQorICAgICAgICB9CisgICAgfQorICAgIHZvaWQgdGVzdE9uZURlbWFuZGVkRGVmYXVsdFJhbmdlKCkgeworICAgICAgICBtb2NrZXIuZGVtYW5kLm9uZSgxLi4xKSB7IDEgfQorICAgICAgICBtb2NrZXIudXNlIHsKKyAgICAgICAgICAgIGRlZiBjYWxsZXIgPSBuZXcgQ2FsbGVyKCkKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyAxLCBjYWxsZXIuY29sbGFib3JhdGVPbmUoKQorICAgICAgICB9CisgICAgfQorICAgIHZvaWQgdGVzdE9uZURlbWFuZGVkRXhhY3RSYW5nZSgpIHsKKyAgICAgICAgbW9ja2VyLmRlbWFuZC5vbmUoMi4uMikgeyAxIH0KKyAgICAgICAgbW9ja2VyLnVzZSB7CisgICAgICAgICAgICBkZWYgY2FsbGVyID0gbmV3IENhbGxlcigpCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMgMSwgY2FsbGVyLmNvbGxhYm9yYXRlT25lKCkKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyAxLCBjYWxsZXIuY29sbGFib3JhdGVPbmUoKQorICAgICAgICAgICAgc2hvdWxkRmFpbChBc3NlcnRpb25GYWlsZWRFcnJvci5jbGFzcykgeyBjYWxsZXIuY29sbGFib3JhdGVPbmUoKSB9CisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCB0ZXN0T25lRGVtYW5kZWRSZWFsUmFuZ2UoKSB7CisgICAgICAgIG1vY2tlci5kZW1hbmQub25lKDEuLjIpIHsgMSB9CisgICAgICAgIG1vY2tlci51c2UgeworICAgICAgICAgICAgZGVmIGNhbGxlciA9IG5ldyBDYWxsZXIoKQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzIDEsIGNhbGxlci5jb2xsYWJvcmF0ZU9uZSgpCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMgMSwgY2FsbGVyLmNvbGxhYm9yYXRlT25lKCkKKyAgICAgICAgICAgIHNob3VsZEZhaWwoQXNzZXJ0aW9uRmFpbGVkRXJyb3IuY2xhc3MpIHsgY2FsbGVyLmNvbGxhYm9yYXRlT25lKCkgfQorICAgICAgICB9CisgICAgfQorICAgIHZvaWQgdGVzdE9uZURlbWFuZGVkT3B0aW9uYWxSYW5nZSgpIHsKKyAgICAgICAgbW9ja2VyLmRlbWFuZC5vbmUoMC4uMikgeyAxIH0KKyAgICAgICAgbW9ja2VyLnVzZSB7CisgICAgICAgICAgICBkZWYgY2FsbGVyID0gbmV3IENhbGxlcigpCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMgMSwgY2FsbGVyLmNvbGxhYm9yYXRlT25lKCkKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyAxLCBjYWxsZXIuY29sbGFib3JhdGVPbmUoKQorICAgICAgICAgICAgc2hvdWxkRmFpbChBc3NlcnRpb25GYWlsZWRFcnJvci5jbGFzcykgeyBjYWxsZXIuY29sbGFib3JhdGVPbmUoKSB9CisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCB0ZXN0VHdvRGVtYW5kZWROb1JhbmdlKCkgeworICAgICAgICBtb2NrZXIuZGVtYW5kLm9uZSgpIHsgMSB9CisgICAgICAgIG1vY2tlci5kZW1hbmQudHdvKCkgeyAyIH0KKyAgICAgICAgbW9ja2VyLnVzZSB7CisgICAgICAgICAgICBkZWYgY2FsbGVyID0gbmV3IENhbGxlcigpCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMgMSwgY2FsbGVyLmNvbGxhYm9yYXRlT25lKCkKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyAyLCBjYWxsZXIuY29sbGFib3JhdGVUd28oKQorICAgICAgICAgICAgc2hvdWxkRmFpbChBc3NlcnRpb25GYWlsZWRFcnJvci5jbGFzcykgeyBjYWxsZXIuY29sbGFib3JhdGVUd28oKSB9CisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCB0ZXN0VHdvRGVtYW5kZWRGaXJzdFJhbmdlRXhwbG9pdGVkKCkgeworICAgICAgICBtb2NrZXIuZGVtYW5kLm9uZSgxLi4yKSB7IDEgfQorICAgICAgICBtb2NrZXIuZGVtYW5kLnR3bygpIHsgMiB9CisgICAgICAgIG1vY2tlci51c2UgeworICAgICAgICAgICAgZGVmIGNhbGxlciA9IG5ldyBDYWxsZXIoKQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzIDEsIGNhbGxlci5jb2xsYWJvcmF0ZU9uZSgpCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMgMSwgY2FsbGVyLmNvbGxhYm9yYXRlT25lKCkKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyAyLCBjYWxsZXIuY29sbGFib3JhdGVUd28oKQorICAgICAgICAgICAgc2hvdWxkRmFpbChBc3NlcnRpb25GYWlsZWRFcnJvci5jbGFzcykgeyBjYWxsZXIuY29sbGFib3JhdGVUd28oKSB9CisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCB0ZXN0VHdvRGVtYW5kZWRGaXJzdFJhbmdlTm90RXhwbG9pdGVkKCkgeworICAgICAgICBtb2NrZXIuZGVtYW5kLm9uZSgxLi4yKSB7IDEgfQorICAgICAgICBtb2NrZXIuZGVtYW5kLnR3bygpIHsgMiB9CisgICAgICAgIG1vY2tlci51c2UgeworICAgICAgICAgICAgZGVmIGNhbGxlciA9IG5ldyBDYWxsZXIoKQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzIDEsIGNhbGxlci5jb2xsYWJvcmF0ZU9uZSgpCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMgMiwgY2FsbGVyLmNvbGxhYm9yYXRlVHdvKCkKKyAgICAgICAgICAgIHNob3VsZEZhaWwoQXNzZXJ0aW9uRmFpbGVkRXJyb3IuY2xhc3MpIHsgY2FsbGVyLmNvbGxhYm9yYXRlVHdvKCkgfQorICAgICAgICB9CisgICAgfQorICAgIHZvaWQgdGVzdFR3b0RlbWFuZGVkRmlyc3RPcHRpb25hbE9taXR0ZWQoKSB7CisgICAgICAgIG1vY2tlci5kZW1hbmQub25lKDAuLjIpIHsgMSB9CisgICAgICAgIG1vY2tlci5kZW1hbmQudHdvKCkgeyAyIH0KKyAgICAgICAgbW9ja2VyLnVzZSB7CisgICAgICAgICAgICBkZWYgY2FsbGVyID0gbmV3IENhbGxlcigpCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMgMiwgY2FsbGVyLmNvbGxhYm9yYXRlVHdvKCkKKyAgICAgICAgICAgIHNob3VsZEZhaWwoQXNzZXJ0aW9uRmFpbGVkRXJyb3IuY2xhc3MpIHsgY2FsbGVyLmNvbGxhYm9yYXRlVHdvKCkgfQorICAgICAgICB9CisgICAgfQorICAgIHZvaWQgdGVzdE1peGVkRGVtYW5kZWRNaW5pbXVtKCkgeworICAgICAgICBtb2NrZXIuZGVtYW5kLm9uZSgwLi4xKSB7IDEgfQorICAgICAgICBtb2NrZXIuZGVtYW5kLnR3bygpIHsgMiB9CisgICAgICAgIG1vY2tlci5kZW1hbmQub25lKCkgeyAxIH0KKyAgICAgICAgbW9ja2VyLmRlbWFuZC50d28oMC4uMikgeyAyIH0KKyAgICAgICAgbW9ja2VyLmRlbWFuZC5vbmUoKSB7IDEgfQorICAgICAgICBtb2NrZXIudXNlIHsKKyAgICAgICAgICAgIGRlZiBjYWxsZXIgPSBuZXcgQ2FsbGVyKCkKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyAyLCBjYWxsZXIuY29sbGFib3JhdGVUd28oKQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzIDEsIGNhbGxlci5jb2xsYWJvcmF0ZU9uZSgpCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMgMSwgY2FsbGVyLmNvbGxhYm9yYXRlT25lKCkKKyAgICAgICAgICAgIHNob3VsZEZhaWwoQXNzZXJ0aW9uRmFpbGVkRXJyb3IuY2xhc3MpIHsgY2FsbGVyLmNvbGxhYm9yYXRlVHdvKCkgfQorICAgICAgICAgICAgc2hvdWxkRmFpbChBc3NlcnRpb25GYWlsZWRFcnJvci5jbGFzcykgeyBjYWxsZXIuY29sbGFib3JhdGVPbmUoKSB9CisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCB0ZXN0TWl4ZWREZW1hbmRlZE1heGltdW0oKSB7CisgICAgICAgIG1vY2tlci5kZW1hbmQub25lKDAuLjEpIHsgMSB9CisgICAgICAgIG1vY2tlci5kZW1hbmQudHdvKCkgeyAyIH0KKyAgICAgICAgbW9ja2VyLmRlbWFuZC5vbmUoKSB7IDEgfQorICAgICAgICBtb2NrZXIuZGVtYW5kLnR3bygwLi4yKSB7IDIgfQorICAgICAgICBtb2NrZXIuZGVtYW5kLm9uZSgpIHsgMSB9CisgICAgICAgIG1vY2tlci51c2UgeworICAgICAgICAgICAgZGVmIGNhbGxlciA9IG5ldyBDYWxsZXIoKQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzIDEsIGNhbGxlci5jb2xsYWJvcmF0ZU9uZSgpCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMgMiwgY2FsbGVyLmNvbGxhYm9yYXRlVHdvKCkKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyAxLCBjYWxsZXIuY29sbGFib3JhdGVPbmUoKQorCisgICAgICAgICAgICAvLyAyLnRpbWVzKCBhc3NlcnRFcXVhbHMoMiwgY2FsbGVyLmNvbGxhYm9yYXRlVHdvKCkpICkgLy8gdG9kbzogd2h5IHRoaXMgbm90IHBvc3NpYmxlPworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzIDIsIGNhbGxlci5jb2xsYWJvcmF0ZVR3bygpCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMgMiwgY2FsbGVyLmNvbGxhYm9yYXRlVHdvKCkKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzIDEsIGNhbGxlci5jb2xsYWJvcmF0ZU9uZSgpCisgICAgICAgICAgICBzaG91bGRGYWlsKEFzc2VydGlvbkZhaWxlZEVycm9yLmNsYXNzKSB7IGNhbGxlci5jb2xsYWJvcmF0ZVR3bygpIH0KKyAgICAgICAgICAgIHNob3VsZEZhaWwoQXNzZXJ0aW9uRmFpbGVkRXJyb3IuY2xhc3MpIHsgY2FsbGVyLmNvbGxhYm9yYXRlT25lKCkgfQorICAgICAgICB9CisgICAgfQorICAgIHZvaWQgdGVzdE1peGVkRGVtYW5kZWRPdXRPZlNlcXVlbmNlRmFpbHNFYXJseSgpIHsKKyAgICAgICAgbW9ja2VyLmRlbWFuZC5vbmUoMC4uMSkgeyAxIH0KKyAgICAgICAgbW9ja2VyLmRlbWFuZC50d28oKSB7IDIgfQorICAgICAgICBtb2NrZXIuZGVtYW5kLm9uZSgpIHsgMSB9CisgICAgICAgIG1vY2tlci5kZW1hbmQudHdvKDAuLjIpIHsgMiB9CisgICAgICAgIG1vY2tlci5kZW1hbmQub25lKCkgeyAxIH0KKyAgICAgICAgc2hvdWxkRmFpbChBc3NlcnRpb25GYWlsZWRFcnJvci5jbGFzcykgeyAvLyBmYWlscyBvbiB2ZXJpZnkKKyAgICAgICAgICAgIG1vY2tlci51c2UgeworICAgICAgICAgICAgICAgIGRlZiBjYWxsZXIgPSBuZXcgQ2FsbGVyKCkKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMgMSwgY2FsbGVyLmNvbGxhYm9yYXRlT25lKCkKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMgMiwgY2FsbGVyLmNvbGxhYm9yYXRlVHdvKCkKKyAgICAgICAgICAgICAgICBzaG91bGRGYWlsKEFzc2VydGlvbkZhaWxlZEVycm9yLmNsYXNzKSB7IGNhbGxlci5jb2xsYWJvcmF0ZVR3bygpIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICB2b2lkIHRlc3RSYW5nZURlbWFuZGVkQnV0Tm90RXhwbG9pdGVkRmFpbHNPblZlcmlmeSgpIHsKKyAgICAgICAgbW9ja2VyLmRlbWFuZC5vbmUoMi4uNCkgeyAxIH0KKyAgICAgICAgc2hvdWxkRmFpbChBc3NlcnRpb25GYWlsZWRFcnJvci5jbGFzcykgeyAvLyBmYWlscyBvbiB2ZXJpZnkKKyAgICAgICAgICAgIG1vY2tlci51c2UgeworICAgICAgICAgICAgICAgIGRlZiBjYWxsZXIgPSBuZXcgQ2FsbGVyKCkKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMgMSwgY2FsbGVyLmNvbGxhYm9yYXRlT25lKCkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICB2b2lkIHRlc3RSZXZlcnNlZFJhbmdlc05vdEFsbG93ZWQoKSB7CisgICAgICAgIHNob3VsZEZhaWwoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKSB7IG1vY2tlci5kZW1hbmQub25lKDEuLjApIHsgMSB9IH0KKyAgICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L21vY2svaW50ZXJjZXB0b3IvTW9ja0ZvckphdmFUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvbW9jay9pbnRlcmNlcHRvci9Nb2NrRm9ySmF2YVRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlZTkxYTgKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L21vY2svaW50ZXJjZXB0b3IvTW9ja0ZvckphdmFUZXN0Lmdyb292eQpAQCAtMCwwICsxLDM3IEBACitwYWNrYWdlIGdyb292eS5tb2NrLmludGVyY2VwdG9yDQorDQorY2xhc3MgTW9ja0ZvckphdmFUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2Ugew0KKyAgICB2b2lkIHRlc3RJdGVyYXRvcigpIHsNCisgICAgICAgIGRlZiBpdGVyYXRvckNvbnRleHQgPSBuZXcgTW9ja0ZvcihJdGVyYXRvcikNCisgICAgICAgIGl0ZXJhdG9yQ29udGV4dC5kZW1hbmQuaGFzTmV4dCgpIHsgdHJ1ZSB9DQorICAgICAgICBpdGVyYXRvckNvbnRleHQuZGVtYW5kLmhhc05leHQoKSB7IHRydWUgfQ0KKyAgICAgICAgaXRlcmF0b3JDb250ZXh0LmRlbWFuZC5oYXNOZXh0KCkgeyBmYWxzZSB9DQorICAgICAgICBkZWYgaXRlcmF0b3IgPSBpdGVyYXRvckNvbnRleHQucHJveHlEZWxlZ2F0ZUluc3RhbmNlKCkNCisgICAgICAgIGl0ZXJhdG9yQ29udGV4dC5kZW1hbmQubmV4dCgpIHsgImZvbyIgfQ0KKyAgICAgICAgZGVmIGl0ZXJhdG9yMiA9IGl0ZXJhdG9yQ29udGV4dC5wcm94eURlbGVnYXRlSW5zdGFuY2UoKQ0KKw0KKyAgICAgICAgYXNzZXJ0IG5ldyBJdGVyYXRvckNvdW50ZXIoKS5jb3VudChpdGVyYXRvcjIpID09IDINCisgICAgICAgIGFzc2VydCBpdGVyYXRvcjIubmV4dCgpID09ICJmb28iDQorICAgICAgICBpdGVyYXRvckNvbnRleHQudmVyaWZ5KGl0ZXJhdG9yMikNCisNCisgICAgICAgIGFzc2VydCBuZXcgSXRlcmF0b3JDb3VudGVyKCkuY291bnQoaXRlcmF0b3IpID09IDINCisgICAgICAgIGl0ZXJhdG9yQ29udGV4dC52ZXJpZnkoaXRlcmF0b3IpDQorDQorICAgICAgICBpdGVyYXRvckNvbnRleHQgPSBuZXcgTW9ja0ZvcihJdGVyYXRvcikNCisgICAgICAgIGl0ZXJhdG9yQ29udGV4dC5kZW1hbmQuaGFzTmV4dCg3Li43KSB7IHRydWUgfQ0KKyAgICAgICAgaXRlcmF0b3JDb250ZXh0LmRlbWFuZC5oYXNOZXh0KCkgeyBmYWxzZSB9DQorICAgICAgICBkZWYgaXRlcmF0b3IzID0gaXRlcmF0b3JDb250ZXh0LnByb3h5RGVsZWdhdGVJbnN0YW5jZSgpDQorICAgICAgICBhc3NlcnQgbmV3IEl0ZXJhdG9yQ291bnRlcigpLmNvdW50KGl0ZXJhdG9yMykgPT0gNw0KKyAgICAgICAgaXRlcmF0b3JDb250ZXh0LnZlcmlmeShpdGVyYXRvcjMpDQorICAgIH0NCisNCisgICAgdm9pZCB0ZXN0U3RyaW5nKCkgew0KKyAgICAgICAgZGVmIGl0ZXJhdG9yQ29udGV4dCA9IG5ldyBNb2NrRm9yKFN0cmluZykNCisgICAgICAgIGl0ZXJhdG9yQ29udGV4dC5kZW1hbmQuZW5kc1dpdGgoMi4uMikgeyBTdHJpbmcgYXJnIC0+IGFyZyA9PSAiZm9vIiB9DQorICAgICAgICBkZWYgcyA9IGl0ZXJhdG9yQ29udGV4dC5wcm94eURlbGVnYXRlSW5zdGFuY2UoKQ0KKyAgICAgICAgYXNzZXJ0ICFzLmVuZHNXaXRoKCJiYXIiKQ0KKyAgICAgICAgYXNzZXJ0IHMuZW5kc1dpdGgoImZvbyIpDQorICAgICAgICBpdGVyYXRvckNvbnRleHQudmVyaWZ5KHMpDQorICAgIH0NCisNCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9tb2NrL2ludGVyY2VwdG9yL01vY2tOZXN0ZWRDYWxsVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L21vY2svaW50ZXJjZXB0b3IvTW9ja05lc3RlZENhbGxUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWI5YTNjCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9tb2NrL2ludGVyY2VwdG9yL01vY2tOZXN0ZWRDYWxsVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwyNyBAQAorcGFja2FnZSBncm9vdnkubW9jay5pbnRlcmNlcHRvcg0KKw0KK2NsYXNzIE1vY2tOZXN0ZWRDYWxsVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsNCisNCisgICAgdm9pZCB0ZXN0UmVzdG9yZSgpIHsNCisgICAgICAgIGRlZiBtb2NrVGFpbCA9IG5ldyBNb2NrRm9yKENvaW4pDQorICAgICAgICBtb2NrVGFpbC5kZW1hbmQuZmxpcCgwLi45KSB7InRhaWwifQ0KKw0KKyAgICAgICAgZGVmIG1vY2tIZWFkID0gbmV3IE1vY2tGb3IoQ29pbikNCisgICAgICAgIG1vY2tIZWFkLmRlbWFuZC5mbGlwKDAuLjkpIHsiaGVhZCJ9DQorDQorICAgICAgICBkZWYgYyA9IG5ldyBDb2luKCkNCisgICAgICAgIGFzc2VydCBjLmZsaXAoKSA9PSAiZWRnZSINCisgICAgICAgIG1vY2tUYWlsLnVzZShjKSB7DQorICAgICAgICAgICAgYXNzZXJ0IGMuZmxpcCgpID09ICJ0YWlsIg0KKyAgICAgICAgICAgIG1vY2tIZWFkLnVzZShjKSB7DQorICAgICAgICAgICAgICAgIGFzc2VydCBjLmZsaXAoKSA9PSAiaGVhZCINCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYXNzZXJ0IGMuZmxpcCgpID09ICJ0YWlsIg0KKyAgICAgICAgfQ0KKyAgICAgICAgYXNzZXJ0IGMuZmxpcCgpID09ICJlZGdlIg0KKyAgICB9DQorfQ0KKw0KK2NsYXNzIENvaW4gew0KKyAgICBkZWYgZmxpcCgpIHsgImVkZ2UiIH0NCit9DQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9tb2NrL2ludGVyY2VwdG9yL01vY2tTaW5nbGVDYWxsVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L21vY2svaW50ZXJjZXB0b3IvTW9ja1NpbmdsZUNhbGxUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDk2Y2I3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9tb2NrL2ludGVyY2VwdG9yL01vY2tTaW5nbGVDYWxsVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwxMjggQEAKK3BhY2thZ2UgZ3Jvb3Z5Lm1vY2suaW50ZXJjZXB0b3IKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnRpb25GYWlsZWRFcnJvcgorCisvKioKKyAgICBUZXN0aW5nIEdyb292eSBNb2NrIHN1cHBvcnQgZm9yIHNpbmdsZSBjYWxscyB0byB0aGUgQ29sbGFib3JhdG9yIHdpdGgKKyAgICBubywgb25lLCBtdWx0aXBsZSwgb3IgYXJiaXRyYXJ5IGFyZ3VtZW50cywgZXhjZXB0aW9ucyBhbmQgZmFpbHVyZXMuCisgICAgQGF1dGhvciBEaWVyayBLb2VuaWcKKyovCisKK2NsYXNzIE1vY2tTaW5nbGVDYWxsVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIE1vY2tGb3IgbW9ja2VyCisKKyAgICB2b2lkIHNldFVwKCkgeworICAgICAgICBtb2NrZXIgPSBuZXcgTW9ja0ZvcihDb2xsYWJvcmF0b3IuY2xhc3MpCisgICAgfQorCisgICAgdm9pZCB0ZXN0TW9ja0dldHRlcigpIHsKKyAgICAgICBtb2NrZXIuZGVtYW5kLmdldEZvbyB7ICJmb28iIH0KKyAgICAgICBtb2NrZXIuZGVtYW5kLmdldEZvbyB7ICJmb29iYXIiIH0KKyAgICAgICBtb2NrZXIudXNlIHsKKyAgICAgICAgICAgYXNzZXJ0RXF1YWxzICJmb28iLCBuZXcgQ2FsbGVyKCkuY2FsbEZvbzEoKQorICAgICAgICAgICBhc3NlcnRFcXVhbHMgImZvb2JhciIsIG5ldyBDYWxsZXIoKS5jYWxsRm9vMigpICAgICAgIAorICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHRlc3RNb2NrU2V0dGVyKCkgeworCisgICAgICAgIGRlZiByZXN1bHQgPSBudWxsCisgICAgICAgIAorICAgICAgICBtb2NrZXIuZGVtYW5kLnNldEJhciB7IHJlc3VsdCA9IGl0IH0KKyAgICAgICAgbW9ja2VyLmRlbWFuZC5zZXRCYXIgeyByZXN1bHQgPSBpdCB9CisKKyAgICAgICAgbW9ja2VyLnVzZSB7CisgICAgICAgICAgICBuZXcgQ2FsbGVyKCkuc2V0QmFyMSgpCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMgcmVzdWx0LCAiYmFyMSIKKyAgICAgICAgICAgIG5ldyBDYWxsZXIoKS5zZXRCYXIyKCkKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyByZXN1bHQsICJiYXIyIgorCisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0U2luZ2xlQ2FsbE5vQXJncygpIHsKKyAgICAgICAgbW9ja2VyLmRlbWFuZC5vbmUgeyAxIH0KKyAgICAgICAgbW9ja2VyLnVzZSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMgMSwgbmV3IENhbGxlcigpLmNvbGxhYm9yYXRlT25lKCkKKyAgICAgICAgfQorICAgIH0KKyAgICB2b2lkIHRlc3RTaW5nbGVDYWxsT25lQXJnKCkgeworICAgICAgICBtb2NrZXIuZGVtYW5kLm9uZSB7IGFyZyAtPiByZXR1cm4gYXJnIH0KKyAgICAgICAgbW9ja2VyLnVzZSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMgMiwgbmV3IENhbGxlcigpLmNvbGxhYm9yYXRlT25lKDIpCisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCB0ZXN0U2luZ2xlQ2FsbFR3b0FyZ3MoKSB7CisgICAgICAgIG1vY2tlci5kZW1hbmQub25lIHsgb25lLCB0d28gLT4gcmV0dXJuIG9uZSArIHR3byB9CisgICAgICAgIG1vY2tlci51c2UgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzIDIsIG5ldyBDYWxsZXIoKS5jb2xsYWJvcmF0ZU9uZSgxLCAxKQorICAgICAgICB9CisgICAgfQorICAgIHZvaWQgdGVzdE5vU2luZ2xlQ2FsbFR3b0FyZ3NXaGVuTm9BcmdEZW1hbmRlZCgpIHsKKyAgICAgICAgbW9ja2VyLmRlbWFuZC5vbmUgeyAyIH0KKyAgICAgICAgbW9ja2VyLnVzZSB7CisgICAgICAgICAgICBzaG91bGRGYWlsIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMgMiwgbmV3IENhbGxlcigpLmNvbGxhYm9yYXRlT25lKDEsIDEpCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCB0ZXN0U2luZ2xlQ2FsbFR3b0FyZ3NXaGVuQXJiaXRyYXJ5QXJnc0RlbWFuZGVkKCkgeworICAgICAgICBtb2NrZXIuZGVtYW5kLm9uZSB7IE9iamVjdFtdIGFyZyAtPiAgMiB9CisgICAgICAgIG1vY2tlci51c2UgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzIDIsIG5ldyBDYWxsZXIoKS5jb2xsYWJvcmF0ZU9uZSgxLCAxKQorICAgICAgICB9CisgICAgfQorICAgIHZvaWQgdGVzdFNpbmdsZUNhbGxUd29BcmdzV2hlbkRlZmF1bHRBcmdzRGVtYW5kZWQoKSB7CisgICAgICAgIG1vY2tlci5kZW1hbmQub25lIHsgb25lPW51bGwsIHR3bz1udWxsIC0+ICAyIH0KKyAgICAgICAgbW9ja2VyLnVzZSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMgMiwgbmV3IENhbGxlcigpLmNvbGxhYm9yYXRlT25lKDEsIDEpCisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCB0ZXN0VmVyaWZ5RmFpbHNJZk9uZURlbWFuZGVkQnV0Tm9uZUV4Y2VjdXRlZCgpIHsKKyAgICAgICAgbW9ja2VyLmRlbWFuZC5vbmUgeyAxIH0KKyAgICAgICAgZGVmIG1zZyA9IHNob3VsZEZhaWwoQXNzZXJ0aW9uRmFpbGVkRXJyb3IuY2xhc3MpIHsKKyAgICAgICAgICAgIG1vY2tlci51c2UgeworICAgICAgICAgICAgICAgIC8vIG5vIGNhbGwKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBUaGlzIGlzIGEgZnJhZ2lsZSB0ZXN0IHNtZWxsISBXZSd2ZSBjaGFuZ2VkIHRoZSBtZXNzYWdlIHRleHQgb2YgdGhlIGV4Y2VwdGlvbiwgYW5kIHRoaXMgdGVzdCBmYWlscyBkdWUgdG8gdGhpcyBhc3NlcnQuCisgICAgICAgICAgIElmIHdlIHRoaW5rIHRoaXMgYXNzZXJ0IGlzIGltcG9ydGFudCwgd2Ugc2hvdWxkIGV4dGVuZCBBc3NlcnRpb25GYWlsZWRFcnJvciBhbmQgYWRkIHRoZSBwcm9wZXJ0aWVzCisgICAgICAgICAgIGV4cGVjdGVkUmFuZ2UgYW5kIGNhbGxDb3VudCB0byBpdC4gQnV0IEkgdGhpbmsgdGhlIHRlc3QgaXMgZ29vZCBlbm91Z2ggd2l0aCBqdXN0IGNoZWNraW5nIGZvciB0aGUgdGhyb3duCisgICAgICAgICAgIGV4Y2VwdGlvbi4gKi8KKyAgICAgICAgLy8gYXNzZXJ0IG1zZyA9fiAvMC4qMS4uMS4qbmV2ZXIgY2FsbGVkLyAKKyAgICB9CisgICAgdm9pZCB0ZXN0Rmlyc3RPcHRpb25hbE9taXR0ZWQoKSB7CisgICAgICAgIG1vY2tlci5kZW1hbmQub25lKDAuLjEpIHsgMSB9CisgICAgICAgIG1vY2tlci51c2UgeworICAgICAgICAgICAgZGVmIGNhbGxlciA9IG5ldyBDYWxsZXIoKQorICAgICAgICB9CisgICAgICAgIC8vIEdldHRpbmcgaGVyZSBtZWFucyBubyBleGNlcHRpb24sIHdoaWNoIGlzIHdoYXQgd2Ugd2FudCB0byB0ZXN0LiAgKEZpeCBmb3IgR1JPT1ZZLTIzMDkpCisgICAgfQorICAgIHZvaWQgdGVzdFNpbmdsZUNhbGxFeGNlcHRpb25EZW1hbmRlZCgpIHsKKyAgICAgICAgbW9ja2VyLmRlbWFuZC5vbmUgeyB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCkgfQorICAgICAgICBtb2NrZXIudXNlIHsKKy8vICAgICAgICAgICAgc2hvdWxkRmFpbChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpIHsKKyAgICAgICAgICAgIHNob3VsZEZhaWwgeyAvLyB0b2RvOiBzaG91bGQgZmFpbCB3aXRoIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpbnN0ZWFkIG9mIEdyb292eVJ1bnRpbWVFeGNlcHRpb24KKyAgICAgICAgICAgICAgICBuZXcgQ2FsbGVyKCkuY29sbGFib3JhdGVPbmUoKQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHZvaWQgdGVzdFNpbmdsZUNhbGxGYWlsRGVtYW5kZWQoKSB7CisgICAgICAgIG1vY2tlci5kZW1hbmQub25lIHsgZmFpbCAnanVzdCBraWRkaW5nJyB9CisgICAgICAgIG1vY2tlci51c2UgeworICAgICAgICAgICAgc2hvdWxkRmFpbCgpIHsgbmV3IENhbGxlcigpLmNvbGxhYm9yYXRlT25lKCkgfQorICAgICAgICB9CisgICAgfQorICAgIHZvaWQgdGVzdEphdmFDYWxsKCkgeworICAgICAgICBtb2NrZXIgPSBuZXcgTW9ja0ZvcihTdHJpbmcuY2xhc3MpCisgICAgICAgIG1vY2tlci5kZW1hbmQudG9TdHJpbmcgeyAnZ3Jvb3Z5JyB9CisgICAgICAgIG1vY2tlci51c2UgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzICdncm9vdnknLCBuZXcgQ2FsbGVyKCkuY29sbGFib3JhdGVKYXZhKCkKKyAgICAgICAgfQorICAgIH0KKworfQorCisKKwpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9tb2NrL2ludGVyY2VwdG9yL01vY2tXaXRoWmVyb1JhbmdlVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L21vY2svaW50ZXJjZXB0b3IvTW9ja1dpdGhaZXJvUmFuZ2VUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOThjODk3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9tb2NrL2ludGVyY2VwdG9yL01vY2tXaXRoWmVyb1JhbmdlVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwzMiBAQAorcGFja2FnZSBncm9vdnkubW9jay5pbnRlcmNlcHRvcgorCitpbXBvcnQgZ3Jvb3Z5Lm1vY2suaW50ZXJjZXB0b3IuTW9ja0ZvcgoraW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnRpb25GYWlsZWRFcnJvcgorCitjbGFzcyBNb2NrRm9yV2l0aFplcm9SYW5nZVRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisgICAgdm9pZCB0ZXN0TW9ja1dpdGhaZXJvUmFuZ2VEZW1hbmRBbmROb0NhbGwoKSB7CisgICAgICAgIE1vY2tGb3IgbW9ja0ZvckZvbyA9IG5ldyBNb2NrRm9yKEZvbykKKyAgICAgICAgbW9ja0ZvckZvby5kZW1hbmQuY3JlYXRlQmFyKDAuLjApIHt9CisgICAgICAgIG1vY2tGb3JGb28udXNlIHsKKyAgICAgICAgICAgIHByaW50bG4gJ0ZvbyBpcyBub3QgY2FsbGVkJworICAgICAgICB9CisgICAgICAgIC8vIFdlIHNob3VsZCBnZXQgaGVyZSBhbmQgdGhlIHRlc3Qgc2hvdWxkIHBhc3MuCisgICAgfQorCisgICAgdm9pZCB0ZXN0TW9ja1dpdGhaZXJvUmFuZ2VEZW1hbmRBbmRPbmVDYWxsKCkgeworICAgICAgICBNb2NrRm9yIG1vY2tGb3JGb28gPSBuZXcgTW9ja0ZvcihGb28pCisgICAgICAgIG1vY2tGb3JGb28uZGVtYW5kLmNyZWF0ZUJhcigwLi4wKSB7fQorICAgICAgICBzaG91bGRGYWlsKEFzc2VydGlvbkZhaWxlZEVycm9yKSB7CisgICAgICAgICAgICBtb2NrRm9yRm9vLnVzZSB7CisgICAgICAgICAgICAgICAgbmV3IEZvbygpLmNyZWF0ZUJhcigpCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKworY2xhc3MgRm9vIHsKKyAgICBkZWYgY3JlYXRlQmFyKCkgeworICAgICAgICBwcmludGxuICdiYXInCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvbW9jay9pbnRlcmNlcHRvci9TdHViQ2FsbFNlcXVlbmNlVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L21vY2svaW50ZXJjZXB0b3IvU3R1YkNhbGxTZXF1ZW5jZVRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNzFmY2YKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L21vY2svaW50ZXJjZXB0b3IvU3R1YkNhbGxTZXF1ZW5jZVRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTk4IEBACitwYWNrYWdlIGdyb292eS5tb2NrLmludGVyY2VwdG9yCisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0aW9uRmFpbGVkRXJyb3IKKworLyoqCisgICAgVGVzdGluZyBHcm9vdnkgU3R1YiBzdXBwb3J0IGZvciBtdWx0aXBsZSBjYWxscyB0byB0aGUgQ29sbGFib3JhdG9yIHdpdGgKKyAgICBkZW1hbmRpbmcgb25lIG9yIHR3byBtZXRob2RzIG11bHRpcGxlIGFuZCBhbmQgdmFyaW91cyByYW5nZXMuCisgICAgQGF1dGhvciBEaWVyayBLb2VuaWcKKyovCitjbGFzcyBTdHViQ2FsbFNlcXVlbmNlVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIFN0dWJGb3Igc3R1YgorCisgICAgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgc3R1YiA9IG5ldyBTdHViRm9yKENvbGxhYm9yYXRvci5jbGFzcykKKyAgICB9CisKKyAgICB2b2lkIHRlc3RVbmRlbWFuZGVkQ2FsbEZhaWxzRWFybHkoKSB7CisgICAgICAgIC8vIG5vIGRlbWFuZCBoZXJlCisgICAgICAgIHN0dWIudXNlIHsKKyAgICAgICAgICAgIGRlZiBjYWxsZXIgPSBuZXcgQ2FsbGVyKCkKKyAgICAgICAgICAgIHNob3VsZEZhaWwoQXNzZXJ0aW9uRmFpbGVkRXJyb3IuY2xhc3MpIHsgY2FsbGVyLmNvbGxhYm9yYXRlT25lKCkgfQorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCB0ZXN0T25lRGVtYW5kZWRUd29DYWxsZWRGYWlsc0Vhcmx5KCkgeworICAgICAgICBzdHViLmRlbWFuZC5vbmUgeyAxIH0KKyAgICAgICAgc3R1Yi51c2UgeworICAgICAgICAgICAgZGVmIGNhbGxlciA9IG5ldyBDYWxsZXIoKQorICAgICAgICAgICAgY2FsbGVyLmNvbGxhYm9yYXRlT25lKCkKKyAgICAgICAgICAgIHNob3VsZEZhaWwoQXNzZXJ0aW9uRmFpbGVkRXJyb3IuY2xhc3MpIHsgY2FsbGVyLmNvbGxhYm9yYXRlT25lKCkgfQorICAgICAgICB9CisgICAgfQorICAgIHZvaWQgdGVzdE9uZURlbWFuZGVkRGVmYXVsdFJhbmdlKCkgeworICAgICAgICBzdHViLmRlbWFuZC5vbmUoMS4uMSkgeyAxIH0KKyAgICAgICAgc3R1Yi51c2UgeworICAgICAgICAgICAgZGVmIGNhbGxlciA9IG5ldyBDYWxsZXIoKQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzIDEsIGNhbGxlci5jb2xsYWJvcmF0ZU9uZSgpCisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCB0ZXN0T25lRGVtYW5kZWRFeGFjdFJhbmdlKCkgeworICAgICAgICBzdHViLmRlbWFuZC5vbmUoMi4uMikgeyAxIH0KKyAgICAgICAgc3R1Yi51c2UgeworICAgICAgICAgICAgZGVmIGNhbGxlciA9IG5ldyBDYWxsZXIoKQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzIDEsIGNhbGxlci5jb2xsYWJvcmF0ZU9uZSgpCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMgMSwgY2FsbGVyLmNvbGxhYm9yYXRlT25lKCkKKyAgICAgICAgICAgIHNob3VsZEZhaWwoQXNzZXJ0aW9uRmFpbGVkRXJyb3IuY2xhc3MpIHsgY2FsbGVyLmNvbGxhYm9yYXRlT25lKCkgfQorICAgICAgICB9CisgICAgfQorICAgIHZvaWQgdGVzdE9uZURlbWFuZGVkUmVhbFJhbmdlKCkgeworICAgICAgICBzdHViLmRlbWFuZC5vbmUoMS4uMikgeyAxIH0KKyAgICAgICAgc3R1Yi51c2UgeworICAgICAgICAgICAgZGVmIGNhbGxlciA9IG5ldyBDYWxsZXIoKQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzIDEsIGNhbGxlci5jb2xsYWJvcmF0ZU9uZSgpCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMgMSwgY2FsbGVyLmNvbGxhYm9yYXRlT25lKCkKKyAgICAgICAgICAgIHNob3VsZEZhaWwoQXNzZXJ0aW9uRmFpbGVkRXJyb3IuY2xhc3MpIHsgY2FsbGVyLmNvbGxhYm9yYXRlT25lKCkgfQorICAgICAgICB9CisgICAgfQorICAgIHZvaWQgdGVzdE9uZURlbWFuZGVkT3B0aW9uYWxSYW5nZSgpIHsKKyAgICAgICAgc3R1Yi5kZW1hbmQub25lKDAuLjIpIHsgMSB9CisgICAgICAgIHN0dWIudXNlIHsKKyAgICAgICAgICAgIGRlZiBjYWxsZXIgPSBuZXcgQ2FsbGVyKCkKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyAxLCBjYWxsZXIuY29sbGFib3JhdGVPbmUoKQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzIDEsIGNhbGxlci5jb2xsYWJvcmF0ZU9uZSgpCisgICAgICAgICAgICBzaG91bGRGYWlsKEFzc2VydGlvbkZhaWxlZEVycm9yLmNsYXNzKSB7IGNhbGxlci5jb2xsYWJvcmF0ZU9uZSgpIH0KKyAgICAgICAgfQorICAgIH0KKyAgICB2b2lkIHRlc3RUd29EZW1hbmRlZE5vUmFuZ2UoKSB7CisgICAgICAgIHN0dWIuZGVtYW5kLm9uZSgpIHsgMSB9CisgICAgICAgIHN0dWIuZGVtYW5kLnR3bygpIHsgMiB9CisgICAgICAgIHN0dWIudXNlIHsKKyAgICAgICAgICAgIGRlZiBjYWxsZXIgPSBuZXcgQ2FsbGVyKCkKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyAxLCBjYWxsZXIuY29sbGFib3JhdGVPbmUoKQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzIDIsIGNhbGxlci5jb2xsYWJvcmF0ZVR3bygpCisgICAgICAgICAgICBzaG91bGRGYWlsKEFzc2VydGlvbkZhaWxlZEVycm9yLmNsYXNzKSB7IGNhbGxlci5jb2xsYWJvcmF0ZVR3bygpIH0KKyAgICAgICAgfQorICAgIH0KKyAgICB2b2lkIHRlc3RUd29EZW1hbmRlZEZpcnN0UmFuZ2VFeHBsb2l0ZWQoKSB7CisgICAgICAgIHN0dWIuZGVtYW5kLm9uZSgxLi4yKSB7IDEgfQorICAgICAgICBzdHViLmRlbWFuZC50d28oKSB7IDIgfQorICAgICAgICBzdHViLnVzZSB7CisgICAgICAgICAgICBkZWYgY2FsbGVyID0gbmV3IENhbGxlcigpCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMgMSwgY2FsbGVyLmNvbGxhYm9yYXRlT25lKCkKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyAxLCBjYWxsZXIuY29sbGFib3JhdGVPbmUoKQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzIDIsIGNhbGxlci5jb2xsYWJvcmF0ZVR3bygpCisgICAgICAgICAgICBzaG91bGRGYWlsKEFzc2VydGlvbkZhaWxlZEVycm9yLmNsYXNzKSB7IGNhbGxlci5jb2xsYWJvcmF0ZVR3bygpIH0KKyAgICAgICAgfQorICAgIH0KKyAgICB2b2lkIHRlc3RUd29EZW1hbmRlZEZpcnN0UmFuZ2VOb3RFeHBsb2l0ZWQoKSB7CisgICAgICAgIHN0dWIuZGVtYW5kLm9uZSgxLi4yKSB7IDEgfQorICAgICAgICBzdHViLmRlbWFuZC50d28oKSB7IDIgfQorICAgICAgICBzdHViLnVzZSB7CisgICAgICAgICAgICBkZWYgY2FsbGVyID0gbmV3IENhbGxlcigpCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMgMSwgY2FsbGVyLmNvbGxhYm9yYXRlT25lKCkKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyAyLCBjYWxsZXIuY29sbGFib3JhdGVUd28oKQorICAgICAgICAgICAgc2hvdWxkRmFpbChBc3NlcnRpb25GYWlsZWRFcnJvci5jbGFzcykgeyBjYWxsZXIuY29sbGFib3JhdGVUd28oKSB9CisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCB0ZXN0VHdvRGVtYW5kZWRGaXJzdE9wdGlvbmFsT21pdHRlZCgpIHsKKyAgICAgICAgc3R1Yi5kZW1hbmQub25lKDAuLjIpIHsgMSB9CisgICAgICAgIHN0dWIuZGVtYW5kLnR3bygpIHsgMiB9CisgICAgICAgIHN0dWIudXNlIHsKKyAgICAgICAgICAgIGRlZiBjYWxsZXIgPSBuZXcgQ2FsbGVyKCkKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyAyLCBjYWxsZXIuY29sbGFib3JhdGVUd28oKQorICAgICAgICAgICAgc2hvdWxkRmFpbChBc3NlcnRpb25GYWlsZWRFcnJvci5jbGFzcykgeyBjYWxsZXIuY29sbGFib3JhdGVUd28oKSB9CisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCB0ZXN0TWl4ZWREZW1hbmRlZE1pbmltdW1PdXRPZlNlcXVlbmNlKCkgeworICAgICAgICBzdHViLmRlbWFuZC5vbmUoMC4uMSkgeyAxIH0KKyAgICAgICAgc3R1Yi5kZW1hbmQudHdvKCkgeyAyIH0KKyAgICAgICAgc3R1Yi5kZW1hbmQub25lKCkgeyAxIH0KKyAgICAgICAgc3R1Yi5kZW1hbmQudHdvKDAuLjIpIHsgMiB9CisgICAgICAgIHN0dWIuZGVtYW5kLm9uZSgpIHsgMSB9CisgICAgICAgIHN0dWIudXNlIHsKKyAgICAgICAgICAgIGRlZiBjYWxsZXIgPSBuZXcgQ2FsbGVyKCkKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyAxLCBjYWxsZXIuY29sbGFib3JhdGVPbmUoKQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzIDEsIGNhbGxlci5jb2xsYWJvcmF0ZU9uZSgpCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMgMSwgY2FsbGVyLmNvbGxhYm9yYXRlT25lKCkKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzIDIsIGNhbGxlci5jb2xsYWJvcmF0ZVR3bygpCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMgMiwgY2FsbGVyLmNvbGxhYm9yYXRlVHdvKCkKKyAgICAgICAgfQorICAgICAgICBzdHViLmV4cGVjdC52ZXJpZnkoKQorICAgIH0KKyAgICB2b2lkIHRlc3RNaXhlZERlbWFuZGVkTWF4aW11bSgpIHsKKyAgICAgICAgc3R1Yi5kZW1hbmQub25lKDAuLjEpIHsgMSB9CisgICAgICAgIHN0dWIuZGVtYW5kLnR3bygpIHsgMiB9CisgICAgICAgIHN0dWIuZGVtYW5kLm9uZSgpIHsgMSB9CisgICAgICAgIHN0dWIuZGVtYW5kLnR3bygwLi4yKSB7IDIgfQorICAgICAgICBzdHViLmRlbWFuZC5vbmUoKSB7IDEgfQorICAgICAgICBzdHViLnVzZSB7CisgICAgICAgICAgICBkZWYgY2FsbGVyID0gbmV3IENhbGxlcigpCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMgMSwgY2FsbGVyLmNvbGxhYm9yYXRlT25lKCkKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyAyLCBjYWxsZXIuY29sbGFib3JhdGVUd28oKQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzIDEsIGNhbGxlci5jb2xsYWJvcmF0ZU9uZSgpCisKKyAgICAgICAgICAgIC8vIDIudGltZXMoIGFzc2VydEVxdWFscygyLCBjYWxsZXIuY29sbGFib3JhdGVUd28oKSkgKSAvLyB0b2RvOiB3aHkgdGhpcyBub3QgcG9zc2libGU/CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMgMiwgY2FsbGVyLmNvbGxhYm9yYXRlVHdvKCkKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyAyLCBjYWxsZXIuY29sbGFib3JhdGVUd28oKQorCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMgMSwgY2FsbGVyLmNvbGxhYm9yYXRlT25lKCkKKyAgICAgICAgICAgIHNob3VsZEZhaWwoQXNzZXJ0aW9uRmFpbGVkRXJyb3IuY2xhc3MpIHsgY2FsbGVyLmNvbGxhYm9yYXRlVHdvKCkgfQorICAgICAgICAgICAgc2hvdWxkRmFpbChBc3NlcnRpb25GYWlsZWRFcnJvci5jbGFzcykgeyBjYWxsZXIuY29sbGFib3JhdGVPbmUoKSB9CisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCB0ZXN0TWl4ZWREZW1hbmRlZE91dE9mU2VxdWVuY2VGYWlsc0Vhcmx5KCkgeworICAgICAgICBzdHViLmRlbWFuZC5vbmUoMC4uMSkgeyAxIH0KKyAgICAgICAgc3R1Yi5kZW1hbmQudHdvKCkgeyAyIH0KKyAgICAgICAgc3R1Yi5kZW1hbmQub25lKCkgeyAxIH0KKyAgICAgICAgc3R1Yi5kZW1hbmQudHdvKDAuLjIpIHsgMiB9CisgICAgICAgIHN0dWIuZGVtYW5kLm9uZSgpIHsgMSB9CisgICAgICAgIHNob3VsZEZhaWwoQXNzZXJ0aW9uRmFpbGVkRXJyb3IuY2xhc3MpIHsgLy8gZmFpbHMgb24gdmVyaWZ5CisgICAgICAgICAgICBzdHViLnVzZSB7CisgICAgICAgICAgICAgICAgZGVmIGNhbGxlciA9IG5ldyBDYWxsZXIoKQorICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyAxLCBjYWxsZXIuY29sbGFib3JhdGVPbmUoKQorICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyAyLCBjYWxsZXIuY29sbGFib3JhdGVUd28oKQorICAgICAgICAgICAgICAgIHNob3VsZEZhaWwoQXNzZXJ0aW9uRmFpbGVkRXJyb3IuY2xhc3MpIHsgY2FsbGVyLmNvbGxhYm9yYXRlVHdvKCkgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHZvaWQgdGVzdFJhbmdlRGVtYW5kZWRPdXRPZlNlcXVlbmNlQ2FsbHMoKSB7CisgICAgICAgIHN0dWIuZGVtYW5kLm9uZSgwLi4zKSB7IDEgfQorICAgICAgICBzdHViLmRlbWFuZC50d28oMC4uMykgeyAyIH0KKyAgICAgICAgc3R1Yi51c2UgeworICAgICAgICAgICAgZGVmIGNhbGxlciA9IG5ldyBDYWxsZXIoKQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzIDEsIGNhbGxlci5jb2xsYWJvcmF0ZU9uZSgpCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMgMiwgY2FsbGVyLmNvbGxhYm9yYXRlVHdvKCkKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyAxLCBjYWxsZXIuY29sbGFib3JhdGVPbmUoKQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzIDIsIGNhbGxlci5jb2xsYWJvcmF0ZVR3bygpCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMgMSwgY2FsbGVyLmNvbGxhYm9yYXRlT25lKCkKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyAyLCBjYWxsZXIuY29sbGFib3JhdGVUd28oKQorICAgICAgICAgICAgc2hvdWxkRmFpbChBc3NlcnRpb25GYWlsZWRFcnJvci5jbGFzcykgeyBjYWxsZXIuY29sbGFib3JhdGVPbmUoKSB9CisgICAgICAgIH0KKyAgICAgICAgc3R1Yi5leHBlY3QudmVyaWZ5KCkKKyAgICB9CisKKyAgICB2b2lkIHRlc3RVbnJlYWNoZWREZW1hbmRGYWlsc09uVmVyaWZ5KCkgeworICAgICAgICBzdHViLmRlbWFuZC5vbmUgeyAxIH0KKyAgICAgICAgLy8gbm90aGluZyB1c2VkCisgICAgICAgIHNob3VsZEZhaWwoQXNzZXJ0aW9uRmFpbGVkRXJyb3IuY2xhc3MpIHsgc3R1Yi5leHBlY3QudmVyaWZ5KCkgfQorICAgIH0KKworCisgICAgdm9pZCB0ZXN0UmFuZ2VEZW1hbmRlZEJ1dE5vdEV4cGxvaXRlZEZhaWxzT25WZXJpZnkoKSB7CisgICAgICAgIHN0dWIuZGVtYW5kLm9uZSgyLi40KSB7IDEgfQorICAgICAgICBzaG91bGRGYWlsKEFzc2VydGlvbkZhaWxlZEVycm9yLmNsYXNzKSB7IC8vIGZhaWxzIG9uIHZlcmlmeQorICAgICAgICAgICAgc3R1Yi51c2UgeworICAgICAgICAgICAgICAgIGRlZiBjYWxsZXIgPSBuZXcgQ2FsbGVyKCkKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMgMSwgY2FsbGVyLmNvbGxhYm9yYXRlT25lKCkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0dWIuZXhwZWN0LnZlcmlmeSgpCisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCB0ZXN0UmV2ZXJzZWRSYW5nZXNOb3RBbGxvd2VkKCkgeworICAgICAgICBzaG91bGRGYWlsKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykgeyBzdHViLmRlbWFuZC5vbmUoMS4uMCkgeyAxIH0gfQorICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvbW9jay9pbnRlcmNlcHRvci9TdHViRm9ySmF2YVRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9tb2NrL2ludGVyY2VwdG9yL1N0dWJGb3JKYXZhVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMzOTY2MAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvbW9jay9pbnRlcmNlcHRvci9TdHViRm9ySmF2YVRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMjggQEAKK3BhY2thZ2UgZ3Jvb3Z5Lm1vY2suaW50ZXJjZXB0b3INCisNCitjbGFzcyBTdHViRm9ySmF2YVRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7DQorICAgIHZvaWQgdGVzdEl0ZXJhdG9yKCkgew0KKyAgICAgICAgZGVmIGl0ZXJhdG9yQ29udGV4dCA9IG5ldyBTdHViRm9yKEl0ZXJhdG9yKQ0KKyAgICAgICAgaXRlcmF0b3JDb250ZXh0LmRlbWFuZC5oYXNOZXh0KCkgeyB0cnVlIH0NCisgICAgICAgIGl0ZXJhdG9yQ29udGV4dC5kZW1hbmQuaGFzTmV4dCgpIHsgZmFsc2UgfQ0KKyAgICAgICAgaXRlcmF0b3JDb250ZXh0LmRlbWFuZC5oYXNOZXh0KCkgeyB0cnVlIH0NCisgICAgICAgIGl0ZXJhdG9yQ29udGV4dC5kZW1hbmQuaGFzTmV4dCgpIHsgZmFsc2UgfQ0KKyAgICAgICAgZGVmIGl0ZXJhdG9yID0gaXRlcmF0b3JDb250ZXh0LnByb3h5RGVsZWdhdGVJbnN0YW5jZSgpDQorICAgICAgICBkZWYgY291bnRlciA9IG5ldyBJdGVyYXRvckNvdW50ZXIoKQ0KKyAgICAgICAgYXNzZXJ0IGNvdW50ZXIuY291bnQoaXRlcmF0b3IpID09IDENCisgICAgICAgIGFzc2VydCBjb3VudGVyLmNvdW50KGl0ZXJhdG9yKSA9PSAxDQorICAgIH0NCisNCisgICAgdm9pZCB0ZXN0U3RyaW5nKCkgew0KKyAgICAgICAgZGVmIGl0ZXJhdG9yQ29udGV4dCA9IG5ldyBTdHViRm9yKFN0cmluZykNCisgICAgICAgIGl0ZXJhdG9yQ29udGV4dC5kZW1hbmQuc3RhcnRzV2l0aCgyLi4yKSB7IFN0cmluZyBhcmcgLT4gYXJnID09ICJ3aXoiIH0NCisgICAgICAgIGl0ZXJhdG9yQ29udGV4dC5kZW1hbmQuZW5kc1dpdGgoMi4uMikgeyBTdHJpbmcgYXJnIC0+IGFyZyA9PSAiZm9vIiB9DQorICAgICAgICBkZWYgcyA9IGl0ZXJhdG9yQ29udGV4dC5wcm94eURlbGVnYXRlSW5zdGFuY2UoKQ0KKyAgICAgICAgYXNzZXJ0ICFzLmVuZHNXaXRoKCJiYXIiKQ0KKyAgICAgICAgYXNzZXJ0IHMuZW5kc1dpdGgoImZvbyIpDQorICAgICAgICBhc3NlcnQgIXMuc3RhcnRzV2l0aCgiYmFyIikNCisgICAgICAgIGFzc2VydCBzLnN0YXJ0c1dpdGgoIndpeiIpDQorICAgICAgICBpdGVyYXRvckNvbnRleHQudmVyaWZ5KHMpDQorICAgIH0NCisNCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9tb2NrL2ludGVyY2VwdG9yL1N0dWJTaW5nbGVDYWxsVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L21vY2svaW50ZXJjZXB0b3IvU3R1YlNpbmdsZUNhbGxUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTdiYTg4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9tb2NrL2ludGVyY2VwdG9yL1N0dWJTaW5nbGVDYWxsVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwyNyBAQAorcGFja2FnZSBncm9vdnkubW9jay5pbnRlcmNlcHRvcgorCisvKioKKyAgICBUZXN0aW5nIEdyb292eSBTdHViIHN1cHBvcnQgZm9yIHNpbmdsZSBjYWxscyB0byB0aGUgQ29sbGFib3JhdG9yCisgICAgQGF1dGhvciBEaWVyayBLb2VuaWcKKyovCisKK2NsYXNzIFN0dWJTaW5nbGVDYWxsVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIFN0dWJGb3Igc3R1YgorCisgICAgdm9pZCBzZXRVcCgpIHsKKyAgICAJc3R1YiA9IG5ldyBTdHViRm9yKENvbGxhYm9yYXRvci5jbGFzcykKKyAgICB9CisKKyAgICB2b2lkIHRlc3RGaXJzdE9wdGlvbmFsT21pdHRlZCgpIHsKKyAgICAJc3R1Yi5kZW1hbmQub25lKDAuLjEpIHsgMSB9CisgICAgCXN0dWIudXNlIHsKKyAgICAgICAgICAgIGRlZiBjYWxsZXIgPSBuZXcgQ2FsbGVyKCkKKyAgICAgICAgfQorICAgIAlzdHViLmV4cGVjdC52ZXJpZnkoKQorICAgICAgICAvLyBHZXR0aW5nIGhlcmUgbWVhbnMgbm8gZXhjZXB0aW9uLCB3aGljaCBpcyB3aGF0IHdlIHdhbnQgdG8gdGVzdC4gIChGaXggZm9yIEdST09WWS0yMzA5KQorICAgIH0KK30KKworCisKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvbW9jay9pbnRlcmNlcHRvci9TdHViVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L21vY2svaW50ZXJjZXB0b3IvU3R1YlRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiODI5NDcKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L21vY2svaW50ZXJjZXB0b3IvU3R1YlRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsNzYgQEAKK3BhY2thZ2UgZ3Jvb3Z5Lm1vY2suaW50ZXJjZXB0b3IKKworY2xhc3MgU3R1YlRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgIHZvaWQgdGVzdEJlaGF2aW9yV2l0aEluc3RhbmNlQ3JlYXRlZE91dHNpZGVVc2VDbG9zdXJlKCkgeworICAgICAgZGVmIHNwZWFrZXJTdHViID0gbmV3IFN0dWJGb3IoU3BlYWtlcikKKyAgICAgIHNwZWFrZXJTdHViLmRlbWFuZC5zdGFydExlY3R1cmUoKSB7ICJJbnRlcmNlcHRlZCEiIH0KKworICAgICAgZGVmIHNwZWFrZXIxID0gbmV3IFNwZWFrZXIoKQorICAgICAgYXNzZXJ0IHNwZWFrZXIxLnN0YXJ0TGVjdHVyZSgpID09ICJTdGFydGluZy4uLiIKKworICAgICAgc3BlYWtlclN0dWIudXNlIHsKKyAgICAgICAgIGRlZiBzcGVha2VyMiA9IG5ldyBTcGVha2VyKCkKKyAgICAgICAgIGFzc2VydCBzcGVha2VyMi5zdGFydExlY3R1cmUoKSA9PSAiSW50ZXJjZXB0ZWQhIgorICAgICAgfQorCisgICAgICBzcGVha2VyU3R1Yi5kZW1hbmQuc3RhcnRMZWN0dXJlKCkgeyAiSW50ZXJjZXB0ZWQhIiB9CisgICAgICBzcGVha2VyU3R1Yi51c2UgKHNwZWFrZXIxKSB7CisgICAgICAgICBhc3NlcnQgc3BlYWtlcjEuc3RhcnRMZWN0dXJlKCkgPT0gIkludGVyY2VwdGVkISIKKyAgICAgIH0KKyAgICAgIGFzc2VydCBzcGVha2VyMS5zdGFydExlY3R1cmUoKSA9PSAiU3RhcnRpbmcuLi4iCisgICB9CisKKyAgIHZvaWQgdGVzdFdJdGhPR0JPdXRzaWRlVXNlKCkgeworICAgICAgZGVmIG9nYiA9IG5ldyBPYmplY3RHcmFwaEJ1aWxkZXIoIGNsYXNzTmFtZVJlc29sdmVyOiAnZ3Jvb3Z5Lm1vY2suaW50ZXJjZXB0b3InICkKKyAgICAgIGRlZiBzdHViID0gbmV3IFN0dWJGb3IoIENvbXBhbnkgKQorICAgICAgc3R1Yi5kZW1hbmQucGF5cm9sbCgwLi4yKSB7IDUwMCB9CisgICAgICBkZWYgYWNtZSA9IG9nYi5jb21wYW55IHsKKyAgICAgICAgIGVtcGxveWVlKCBuYW1lOiAnRHVrZScsIHNhbGFyeTogNDIgKQorICAgICAgfQorICAgICAgc3R1Yi51c2UgKGFjbWUpIHsKKyAgICAgICAgIGFzc2VydCBhY21lLnBheXJvbGwoKSA9PSA1MDAKKyAgICAgICAgIGFzc2VydCBhY21lLnBheXJvbGwoKSA9PSA1MDAKKyAgICAgIH0KKyAgIH0KKworICAgdm9pZCB0ZXN0V0l0aE9HQkluc2lkZVVzZSgpIHsKKyAgICAgIGRlZiBvZ2IgPSBuZXcgT2JqZWN0R3JhcGhCdWlsZGVyKCBjbGFzc05hbWVSZXNvbHZlcjogJ2dyb292eS5tb2NrLmludGVyY2VwdG9yJyApCisgICAgICBkZWYgc3R1YiA9IG5ldyBTdHViRm9yKCBPYmplY3RHcmFwaEJ1aWxkZXIgKQorICAgICAgc3R1Yi51c2UgeworICAgICAgICAgZGVmIGFjbWUgPSBvZ2IuY29tcGFueSB7CisgICAgICAgICAgICAvLyBibG93cyBhZnRlciB0aGUgbmV4dCBsaW5lIGJlY2F1c2UgcHJvcGVydHkgaGFuZGxpbmcKKyAgICAgICAgICAgIC8vIG9uIENvbXBhbnkgd2FzIG5vdCBkZW1hbmRlZAorICAgICAgICAgICAgZW1wbG95ZWUoIG5hbWU6ICdEdWtlJywgc2FsYXJ5OiA0MiApCisgICAgICAgICB9CisKKyAgICAgICAgIGRlZiBzdHViMiA9IG5ldyBTdHViRm9yKCBDb21wYW55ICkKKyAgICAgICAgIHN0dWIyLmRlbWFuZC5wYXlyb2xsKDAuLjIpIHsgNTAwIH0KKyAgICAgICAgIHN0dWIyLnVzZSAoYWNtZSkgeworICAgICAgICAgICBhc3NlcnQgYWNtZS5wYXlyb2xsKCkgPT0gNTAwCisgICAgICAgICB9CisgICAgICB9CisgICB9CisKK30KKworY2xhc3MgU3BlYWtlciB7CisgICBTdHJpbmcgbmFtZQorICAgZGVmIHN0YXJ0TGVjdHVyZSgpIHsgIlN0YXJ0aW5nLi4uIiB9Cit9CisKKworY2xhc3MgQ29tcGFueSB7CisgICBTdHJpbmcgbmFtZQorICAgTGlzdCBlbXBsb3llZXMgPSBbXQorICAgZGVmIHBheXJvbGwoKSB7CisgICAgICBkZWYgdG90YWwgPSAwCisgICAgICBlbXBsb3llZXMuZWFjaCB7IHRvdGFsICs9IGl0LnNhbGFyeSB9CisgICAgICB0b3RhbAorICAgfQorfQorCitjbGFzcyBFbXBsb3llZSB7CisgICBTdHJpbmcgbmFtZQorICAgTnVtYmVyIHNhbGFyeSA9IDAKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvbW9kZWwvVGFibGVNb2RlbFRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9tb2RlbC9UYWJsZU1vZGVsVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM0ZWY2NwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvbW9kZWwvVGFibGVNb2RlbFRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMzcgQEAKK3BhY2thZ2UgZ3Jvb3Z5Lm1vZGVsCisKK2NsYXNzIFRhYmxlTW9kZWxUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworICAgIAorICAgIHZvaWQgdGVzdFRhYmxlTW9kZWwoKSB7CisgICAgICAgIGRlZiBsaXN0ID0gWyBbJ25hbWUnOidKYW1lcycsICdsb2NhdGlvbic6J0xvbmRvbiddLCBbJ25hbWUnOidCb2InLCAnbG9jYXRpb24nOidBdGxhbnRhJ11dCisgICAgICAgIAorICAgICAgICBkZWYgbGlzdE1vZGVsID0gbmV3IFZhbHVlSG9sZGVyKGxpc3QpCisgICAgICAgIAorICAgICAgICBkZWYgbW9kZWwgPSBuZXcgRGVmYXVsdFRhYmxlTW9kZWwobGlzdE1vZGVsKQorICAgICAgICBtb2RlbC5hZGRDb2x1bW4obmV3IERlZmF1bHRUYWJsZUNvbHVtbigiTmFtZSIsIG5ldyBQcm9wZXJ0eU1vZGVsKG1vZGVsLnJvd01vZGVsLCAibmFtZSIpKSkKKyAgICAgICAgbW9kZWwuYWRkQ29sdW1uKG5ldyBEZWZhdWx0VGFibGVDb2x1bW4oIkxvY2F0aW9uIiwgbmV3IFByb3BlcnR5TW9kZWwobW9kZWwucm93TW9kZWwsICJsb2NhdGlvbiIpKSkKKyAgICAgICAgCisgICAgICAgIGFzc2VydCBtb2RlbC5yb3dDb3VudCA9PSAyCisgICAgICAgIGFzc2VydCBtb2RlbC5jb2x1bW5Db3VudCA9PSAyCisgICAgICAgIGFzc2VydFZhbHVlQXQobW9kZWwsIDAsIDAsICdKYW1lcycpCisgICAgICAgIGFzc2VydFZhbHVlQXQobW9kZWwsIDAsIDEsICdMb25kb24nKQorICAgICAgICBhc3NlcnRWYWx1ZUF0KG1vZGVsLCAxLCAwLCAnQm9iJykKKyAgICAgICAgYXNzZXJ0VmFsdWVBdChtb2RlbCwgMSwgMSwgJ0F0bGFudGEnKQorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IG1vZGVsLmdldENvbHVtbk5hbWUoMCkgPT0gJ05hbWUnCisgICAgICAgIGFzc2VydCBtb2RlbC5nZXRDb2x1bW5OYW1lKDEpID09ICdMb2NhdGlvbicKKyAgICAgICAgCisgICAgICAgIC8vIGxldCdzIHNldCBzb21lIHZhbHVlcworICAgICAgICBtb2RlbC5zZXRWYWx1ZUF0KCdBbnRpZ3VhJywgMCwgMSkKKyAgICAgICAgYXNzZXJ0VmFsdWVBdChtb2RlbCwgMCwgMSwgJ0FudGlndWEnKQorICAgICAgICAKKyAgICAgICAgLy8gbGV0J3MgY2hlY2sgdGhlIHJlYWwgbW9kZWwgY2hhbmdlZCB0b28KKyAgICAgICAgZGVmIGphbWVzID0gbGlzdC5nZXQoMCkKKyAgICAgICAgYXNzZXJ0IGphbWVzLmxvY2F0aW9uID09ICdBbnRpZ3VhJworICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRWYWx1ZUF0KG1vZGVsLCByb3csIGNvbCwgZXhwZWN0ZWQpIHsKKyAgICAgICAgZGVmIHZhbHVlID0gbW9kZWwuZ2V0VmFsdWVBdChyb3csIGNvbCkKKyAgICAgICAgYXNzZXJ0IHZhbHVlID09IGV4cGVjdGVkICwgImZvciByb3cgIiArIHJvdyArICIgY29sICIgKyBjb2wKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L29wZXJhdG9yL0JpZ0RlY2ltYWxPcGVyYXRvcnNUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvb3BlcmF0b3IvQmlnRGVjaW1hbE9wZXJhdG9yc1Rlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViYzViMzMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L29wZXJhdG9yL0JpZ0RlY2ltYWxPcGVyYXRvcnNUZXN0Lmdyb292eQpAQCAtMCwwICsxLDEyOCBAQAorcGFja2FnZSBncm9vdnkub3BlcmF0b3IKKworaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOworCitjbGFzcyBCaWdEZWNpbWFsT3BlcmF0b3JzVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIGRlZiB4LCB5CisKKyAgICB2b2lkIHRlc3RQbHVzKCkgeworCisgICAgICAgIHggPSAwLjEgKyAxLjEKKyAgICAgICAgYXNzZXJ0IHggaW5zdGFuY2VvZiBCaWdEZWNpbWFsOworICAgICAgICBhc3NlcnQgeCA9PSAxLjIKKworICAgICAgICB4ID0gMyArIDIuMgorICAgICAgICBhc3NlcnQgeCA9PSA1LjIKKyAgICAgICAgYXNzZXJ0IHggaW5zdGFuY2VvZiBCaWdEZWNpbWFsOworCisgICAgICAgIHggPSAyLjIgKyA0CisgICAgICAgIGFzc2VydCB4IGluc3RhbmNlb2YgQmlnRGVjaW1hbDsKKyAgICAgICAgYXNzZXJ0IHggPT0gNi4yCisKKyAgICAgICAgeSA9IHggKyAxCisgICAgICAgIGFzc2VydCB5IGluc3RhbmNlb2YgQmlnRGVjaW1hbDsKKyAgICAgICAgYXNzZXJ0IHkgPT0gNy4yCisKKyAgICAgICAgZGVmIHogPSB5ICsgeCArIDEgKyAyCisgICAgICAgIGFzc2VydCB6IGluc3RhbmNlb2YgQmlnRGVjaW1hbDsKKyAgICAgICAgYXNzZXJ0IHogPT0gMTYuNAorICAgIH0KKworICAgIHZvaWQgdGVzdE1pbnVzKCkgeworICAgICAgICB4ID0gMS4xLTAuMDEKKyAgICAgICAgYXNzZXJ0IHggPT0gMS4wOQorCisgICAgICAgIHggPSA2IC0gMi4yCisgICAgICAgIGFzc2VydCB4ID09IDMuOAorCisgICAgICAgIHggPSA1LjggLSAyCisgICAgICAgIGFzc2VydCB4ID09IDMuOAorCisgICAgICAgIHkgPSB4IC0gMQorICAgICAgICBhc3NlcnQgeSA9PSAyLjgKKyAgICB9CisKKyAgICB2b2lkIHRlc3RNdWx0aXBseSgpIHsKKyAgICAgICAgeCA9IDMgKiAyLjAKKyAgICAgICAgYXNzZXJ0IHggPT0gNi4wCisKKyAgICAgICAgeCA9IDMuMCAqIDIKKyAgICAgICAgYXNzZXJ0IHggPT0gNi4wCisKKyAgICAgICAgeCA9IDMuMCAqIDIuMAorICAgICAgICBhc3NlcnQgeCA9PSA2LjAKKworICAgICAgICB5ID0geCAqIDIKKyAgICAgICAgYXNzZXJ0IHkgPT0gMTIuMAorCisgICAgICAgIHkgPSAxMSAqIDMuMzMzCisgICAgICAgIGFzc2VydCB5ID09IDM2LjY2MyAsICJ5ID0gIiArIHkKKworICAgICAgICB5ID0gMy4zMzMgKiAxMQorICAgICAgICBhc3NlcnQgeSA9PSAzNi42NjMgLCAieSA9ICIgKyB5CisgICAgfQorCisgICAgdm9pZCB0ZXN0RGl2aWRlKCkgeworICAgICAgICB4ID0gODAuMCAvIDQKKyAgICAgICAgYXNzZXJ0IHggPT0gMjAuMCAsICJ4ID0gIiArIHgKKworICAgICAgICB4ID0gODAgLyA0LjAKKyAgICAgICAgYXNzZXJ0IHggPT0gMjAuMCAsICJ4ID0gIiArIHgKKworICAgICAgICB5ID0geCAvIDIKKyAgICAgICAgYXNzZXJ0IHkgPT0gMTAuMCAsICJ5ID0gIiArIHkKKyAgICAgICAgYXNzZXJ0IHkgPT0gMTAgLCAieSA9ICIgKyB5CisKKyAgICAgICAgeSA9IDM0IC8gMy4wMDAKKyAgICAgICAgYXNzZXJ0IHkgPT0gMTEuMzMzMzMzMzMzMyAsICJ5ID0gIiArIHkKKworICAgICAgICB5ID0gMzQuMDAwMDAwMDAwMDAgLyAzCisgICAgICAgIGFzc2VydCB5ID09IDExLjMzMzMzMzMzMzMzICwgInkgPSAiICsgeQorICAgIH0KKyAgICAKKyAgICBCaWdEZWNpbWFsIGVjaG9YICggQmlnRGVjaW1hbCB4LCBCaWdEZWNpbWFsIHkpIHt4fQorICAgIAorICAgIC8vIHRlc3QgZm9yIEdyb292eS0xMjUwCisgICAgdm9pZCB0ZXN0QmlnRGVjaW1hbENvZXJjZSgpIHsKKyAgICAgICAgYXNzZXJ0IGVjaG9YKDkuOTUsIDEuMCkgPT0gZWNob1goOS45NSwgMSkKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0QXNzaWduKCkgeworICAgICAgICBCaWdEZWNpbWFsIGZvbworICAgICAgICBmb28gPSAoYnl0ZSkgMjAKKyAgICAgICAgYXNzZXJ0IGZvby5jbGFzcyA9PSBCaWdEZWNpbWFsLmNsYXNzCisgICAgICAgIGFzc2VydCBmb28gPT0gMjAKKworICAgICAgICBmb28gPSAoc2hvcnQpIDIwCisgICAgICAgIGFzc2VydCBmb28uY2xhc3MgPT0gQmlnRGVjaW1hbC5jbGFzcworICAgICAgICBhc3NlcnQgZm9vID09IDIwCisKKyAgICAgICAgZm9vID0gKGludCkgMjAKKyAgICAgICAgYXNzZXJ0IGZvby5jbGFzcyA9PSBCaWdEZWNpbWFsLmNsYXNzCisgICAgICAgIGFzc2VydCBmb28gPT0gMjAKKworICAgICAgICBmb28gPSAobG9uZykgMjAKKyAgICAgICAgYXNzZXJ0IGZvby5jbGFzcyA9PSBCaWdEZWNpbWFsLmNsYXNzCisgICAgICAgIGFzc2VydCBmb28gPT0gMjAKKworICAgICAgICBmb28gPSAoZmxvYXQpIDAuNWYKKyAgICAgICAgYXNzZXJ0IGZvby5jbGFzcyA9PSBCaWdEZWNpbWFsLmNsYXNzCisgICAgICAgIGFzc2VydCBmb28gPT0gMC41CisKKyAgICAgICAgZm9vID0gKGRvdWJsZSkgMC41ZAorICAgICAgICBhc3NlcnQgZm9vLmNsYXNzID09IEJpZ0RlY2ltYWwuY2xhc3MKKyAgICAgICAgYXNzZXJ0IGZvbyA9PSAwLjUKKyAgICAgICAgCisgICAgICAgIGZvbyA9IDEwRworICAgICAgICBhc3NlcnQgZm9vLmNsYXNzID09IEJpZ0RlY2ltYWwuY2xhc3MKKyAgICAgICAgYXNzZXJ0IGZvbyA9PSAxMAorICAgICAgICAKKyAgICAgICAgZG91YmxlIGQgPSAxMDAwCisgICAgICAgIGQgKj0gZAorICAgICAgICBkICo9IGQKKyAgICAgICAgZCAqPSBkCisgICAgICAgIGFzc2VydCAobG9uZylkICE9IGQKKwkJYXNzZXJ0IChCaWdEZWNpbWFsKSBkID09IGQKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L29wZXJhdG9yL0JpZ0ludGVnZXJPcGVyYXRpb25zVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L29wZXJhdG9yL0JpZ0ludGVnZXJPcGVyYXRpb25zVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEzYzA4NwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvb3BlcmF0b3IvQmlnSW50ZWdlck9wZXJhdGlvbnNUZXN0Lmdyb292eQpAQCAtMCwwICsxLDQxIEBACitwYWNrYWdlIGdyb292eS5vcGVyYXRvcgorCitjbGFzcyBCaWdJbnRlZ2VyT3BlcmF0aW9uc1Rlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisgICAgdm9pZCB0ZXN0QXNzaWduKCkgeworICAgICAgICBCaWdJbnRlZ2VyIGZvbworICAgICAgICBmb28gPSAoYnl0ZSkgMjAKKyAgICAgICAgYXNzZXJ0IGZvby5jbGFzcyA9PSBCaWdJbnRlZ2VyCisgICAgICAgIGFzc2VydCBmb28gPT0gMjAKKworICAgICAgICBmb28gPSAoc2hvcnQpIDIwCisgICAgICAgIGFzc2VydCBmb28uY2xhc3MgPT0gQmlnSW50ZWdlcgorICAgICAgICBhc3NlcnQgZm9vID09IDIwCisKKyAgICAgICAgZm9vID0gKGludCkgMjAKKyAgICAgICAgYXNzZXJ0IGZvby5jbGFzcyA9PSBCaWdJbnRlZ2VyCisgICAgICAgIGFzc2VydCBmb28gPT0gMjAKKworICAgICAgICBmb28gPSAobG9uZykgMjAKKyAgICAgICAgYXNzZXJ0IGZvby5jbGFzcyA9PSBCaWdJbnRlZ2VyCisgICAgICAgIGFzc2VydCBmb28gPT0gMjAKKworICAgICAgICBmb28gPSAoZmxvYXQpIDAuNWYKKyAgICAgICAgYXNzZXJ0IGZvby5jbGFzcyA9PSBCaWdJbnRlZ2VyCisgICAgICAgIGFzc2VydCBmb28gPT0gMAorCisgICAgICAgIGZvbyA9IChkb3VibGUpIDAuNWQKKyAgICAgICAgYXNzZXJ0IGZvby5jbGFzcyA9PSBCaWdJbnRlZ2VyCisgICAgICAgIGFzc2VydCBmb28gPT0gMAorICAgICAgICAKKyAgICAgICAgZm9vID0gMTAuNUcKKyAgICAgICAgYXNzZXJ0IGZvby5jbGFzcyA9PSBCaWdJbnRlZ2VyCisgICAgICAgIGFzc2VydCBmb28gPT0gMTAKKyAgICAgICAgCisgICAgICAgIGRvdWJsZSBkID0gMTAwMAorICAgICAgICBkICo9IGQKKyAgICAgICAgZCAqPSBkCisgICAgICAgIGQgKj0gZAorICAgICAgICBhc3NlcnQgKGxvbmcpZCAhPSBkCisJCWFzc2VydCAoQmlnSW50ZWdlcikgZCA9PSBkCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9vcGVyYXRvci9CaXR3aXNlT3BlcmF0b3JzVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L29wZXJhdG9yL0JpdHdpc2VPcGVyYXRvcnNUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDRjZTQyCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9vcGVyYXRvci9CaXR3aXNlT3BlcmF0b3JzVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwyOTIgQEAKK3BhY2thZ2UgZ3Jvb3Z5Lm9wZXJhdG9yCisKKy8qKiAKKyAqIFRlc3QgQml0d2lzZSBPcGVyYXRpb25zIGluIENsYXNzaWMvTmV3IEdyb292eQorICogCisgKiBAYXV0aG9yIFBpbGhvIEtpbQorICogQHZlcnNpb24gJFJldmlzaW9uOiA0OTk2ICQKKyAqLworY2xhc3MgQml0d2lzZU9wZXJhdG9yc1Rlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICB2b2lkIHRlc3RCaXR3aXNlU2hpZnQoKSB7CisgICAgICAgIGRlZiBhID0gNAorICAgICAgICBkZWYgYiA9IC00CisgICAgICAgIGFzc2VydCBhIDw8IDEgPT0gOAorICAgICAgICBhc3NlcnQgYSA8PCAyID09IDE2CisgICAgICAgIGFzc2VydCBhID4+IDEgPT0gMgorICAgICAgICBhc3NlcnQgYSA+PiAyID09IDEKKyAgICAgICAgYXNzZXJ0IGEgPj4+IDEgPT0gMgorICAgICAgICBhc3NlcnQgYSA+Pj4gMiA9PSAxCisgICAgICAgIGFzc2VydCBiIDw8IDEgPT0gLTgKKyAgICAgICAgYXNzZXJ0IGIgPDwgMiA9PSAtMTYKKyAgICAgICAgYXNzZXJ0IGIgPj4gMSA9PSAtMgorICAgICAgICBhc3NlcnQgYiA+PiAyID09IC0xCisgICAgICAgIGFzc2VydCBiID4+PiAxID09IDB4N0ZGRkZGRkUKKyAgICAgICAgYXNzZXJ0IGIgPj4+IDIgPT0gMHgzRkZGRkZGRgorICAgIH0KKworICAgIHZvaWQgdGVzdEJpdHdpc2VTaGlmdEVRVUFMKCkgeworICAgICAgICBkZWYgYSA9IDQKKyAgICAgICAgYSA8PD0gMQorICAgICAgICBhc3NlcnQgYSA9PSA4CisgICAgICAgIGEgPDw9IDIKKyAgICAgICAgYXNzZXJ0IGEgPT0gMzIKKyAgICAgICAgYSA+Pj0gMQorICAgICAgICBhc3NlcnQgYSA9PSAxNgorICAgICAgICBhID4+PSAyCisgICAgICAgIGFzc2VydCBhID09IDQKKworICAgICAgICBkZWYgYiA9IC00CisgICAgICAgIGIgPDw9IDEKKyAgICAgICAgYXNzZXJ0IGIgPT0gLTgKKyAgICAgICAgYiA8PD0gMgorICAgICAgICBhc3NlcnQgYiA9PSAtMzIKKyAgICAgICAgYiA+Pj0gMQorICAgICAgICBhc3NlcnQgYiA9PSAtMTYKKyAgICAgICAgYiA+Pj0gMgorICAgICAgICBhc3NlcnQgYiA9PSAtNAorCisgICAgICAgIGIgPSAtNAorICAgICAgICBiID4+Pj0gMQorICAgICAgICBhc3NlcnQgYiA9PSAweDdGRkZGRkZFCisgICAgICAgIGIgPSAtOAorICAgICAgICBiID4+Pj0gMgorICAgICAgICBhc3NlcnQgYiA9PSAweDNGRkZGRkZFCisgICAgfQorCisgICAgdm9pZCB0ZXN0Qml0d2lzZUFuZCgpIHsKKworICAgICAgICBkZWYgYSA9IDEzCisgICAgICAgIGFzc2VydCAoYSAmIDMpID09IDEgLy8gMHgwMDAwMDAwRCAmIDB4MDAwMDAwMDMKKyAgICAgICAgYXNzZXJ0IChhICYgNykgPT0gNSAvLyAweDAwMDAwMDBEICYgMHgwMDAwMDAwNworICAgICAgICBkZWYgYiA9IC0xMworICAgICAgICBhc3NlcnQgKGIgJiAzKSA9PSAzIC8vIDB4RkZGRkZGRjMgJiAweDAwMDAwMDAzCisgICAgICAgIGFzc2VydCAoYiAmIDcpID09IDMgLy8gMHhGRkZGRkZGMyAmIDB4MDAwMDAwMDcKKyAgICB9CisKKyAgICB2b2lkIHRlc3RCaXR3aXNlQW5kT3BlcmF0b3JQcmVjZWRlbmNlX0ZBSUxTKCkge2lmIChub3RZZXRJbXBsZW1lbnRlZCgpKSByZXR1cm4KKyAgICAgICAgLy8gT3ByYXRvciBQcmVjZWRlbmNlIFByb2JsZW0KKyAgICAgICAgLy8gXiwgJiwgfCBzaG91bGQgYmUgcHJpb3IgdG8gPT0sIDwsID4sIDw9LCA+PQorICAgICAgICBkZWYgYSA9IDEzCisgICAgICAgIGFzc2VydCBhICYgMyA9PSAxIC8vIDB4MDAwMDAwMEQgJiAweDAwMDAwMDAzCisgICAgICAgIGFzc2VydCBhICYgNyA9PSA1IC8vIDB4MDAwMDAwMEQgJiAweDAwMDAwMDA3CisgICAgICAgIGRlZiBiID0gLTEzCisgICAgICAgIGFzc2VydCBiICYgMyA9PSAzIC8vIDB4RkZGRkZGRjMgJiAweDAwMDAwMDAzCisgICAgICAgIGFzc2VydCBiICYgNyA9PSAzIC8vIDB4RkZGRkZGRjMgJiAweDAwMDAwMDA3CisgICAgfQorCisgICAgdm9pZCB0ZXN0Qml0d2lzZUFuZEVxdWFsKCkgeworICAgICAgICBkZWYgYSA9IDEzCisgICAgICAgIGEgJj0gMworICAgICAgICBhc3NlcnQgYSA9PSAxIC8vIDB4MDAwMDAwMEQgJiAweDAwMDAwMDAzCisgICAgICAgIGEgJj0gNAorICAgICAgICBhc3NlcnQgYSA9PSAwIC8vIDB4MDAwMDAwMDEgJiAweDAwMDAwMDA0CisgICAgICAgIGRlZiBiID0gLTEzCisgICAgICAgIGIgJj0gMworICAgICAgICBhc3NlcnQgYiA9PSAzIC8vIDB4RkZGRkZGRjMgJiAweDAwMDAwMDAzCisgICAgICAgIGIgJj0gNworICAgICAgICBhc3NlcnQgYiA9PSAzIC8vIDB4MDAwMDAwMDMgJiAweDAwMDAwMDA3CisgICAgfQorCisgICAgdm9pZCB0ZXN0Qml0d2lzZU9yKCkgeworICAgICAgICBkZWYgYSA9IDEzCisgICAgICAgIGFzc2VydCAoYSB8IDgpID09IDEzIC8vIDB4MDAwMDAwMEQgfCAweDAwMDAwMDA4CisgICAgICAgIGFzc2VydCAoYSB8IDE2KSA9PSAyOSAvLyAweDAwMDAwMDBEIHwgMHgwMDAwMDAxMAorICAgICAgICBkZWYgYiA9IC0xMworICAgICAgICBhc3NlcnQgKGIgfCA4KSA9PSAtNSAvLyAweEZGRkZGRkYzIHwgMHgwMDAwMDAwOAorICAgICAgICBhc3NlcnQgKGIgfCAxNikgPT0gLTEzIC8vIDB4RkZGRkZGRjMgfCAweDAwMDAwMDEwCisgICAgfQorCisgICAgdm9pZCB0ZXN0Qml0d2lzZU9yT3BlcmF0b3JQcmVjZWRlbmNlX0ZBSUxTKCkge2lmIChub3RZZXRJbXBsZW1lbnRlZCgpKSByZXR1cm4KKyAgICAgICAgLy8gT3ByYXRvciBQcmVjZWRlbmNlIFByb2JsZW0KKyAgICAgICAgLy8gXiwgJiwgfCBzaG91bGQgYmUgcHJpb3IgdG8gPT0sIDwsID4sIDw9LCA+PQorICAgICAgICBkZWYgYSA9IDEzCisgICAgICAgIGFzc2VydCBhIHwgOCA9PSAxMyAvLyAweDAwMDAwMDBEIHwgMHgwMDAwMDAwOAorICAgICAgICBhc3NlcnQgYSB8IDE2ID09IDI5IC8vIDB4MDAwMDAwMEQgfCAweDAwMDAwMDEwCisgICAgICAgIGRlZiBiID0gLTEzCisgICAgICAgIGFzc2VydCBiIHwgOCA9PSAtNSAvLyAweEZGRkZGRkYzIHwgMHgwMDAwMDAwOAorICAgICAgICBhc3NlcnQgYiB8IDE2ID09IC0xMyAvLyAweEZGRkZGRkYzIHwgMHgwMDAwMDAxMAorICAgIH0KKworICAgIHZvaWQgdGVzdEJpdHdpc2VPckVxdWFsKCkgeworICAgICAgICBkZWYgYSA9IDEzCisgICAgICAgIGEgfD0gMgorICAgICAgICBhc3NlcnQgYSA9PSAxNSAvLyAweDAwMDAwMDBEIHwgMHgwMDAwMDAwMgorICAgICAgICBhIHw9IDE2CisgICAgICAgIGFzc2VydCBhID09IDMxIC8vIDB4MDAwMDAwMEYgfCAweDAwMDAwMDFGCisgICAgICAgIGRlZiBiID0gLTEzCisgICAgICAgIGIgfD0gOAorICAgICAgICBhc3NlcnQgYiA9PSAtNSAvLyAweEZGRkZGRkYzIHwgMHgwMDAwMDAwOAorICAgICAgICBiIHw9IDEKKyAgICAgICAgYXNzZXJ0IGIgPT0gLTUgLy8gMHhGRkZGRkZGQiB8IDB4MDAwMDAwMDEKKyAgICB9CisKKyAgICB2b2lkIHRlc3RCaXR3aXNlWG9yKCkgeworICAgICAgICBkZWYgYSA9IDEzCisgICAgICAgIGFzc2VydCAoYSBeIDEwKSA9PSA3IC8vIDB4MDAwMDAwMEQgXiAweDAwMDAwMDBBID0gMHgwMDAwMDAwMDcKKyAgICAgICAgYXNzZXJ0IChhIF4gMTUpID09IDIgLy8gMHgwMDAwMDAwRCBeIDB4MDAwMDAwMEYgPSAweDAwMDAwMDAwMgorICAgICAgICBkZWYgYiA9IC0xMworICAgICAgICBhc3NlcnQgKGIgXiAxMCkgPT0gLTcgLy8gMHhGRkZGRkZGMyBeIDB4MDAwMDAwMEEgPSAweEZGRkZGRkY5CisgICAgICAgIGFzc2VydCAoYiBeIDE1KSA9PSAtNCAvLyAweEZGRkZGRkYzIF4gMHgwMDAwMDAwRiA9IDB4RkZGRkZGRkMKKyAgICB9CisgICAgdm9pZCB0ZXN0Qml0d2lzZVhvck9wZXJhdG9yUHJlY2VkZW5jZV9GQUlMUygpIHtpZiAobm90WWV0SW1wbGVtZW50ZWQoKSkgcmV0dXJuCisgICAgICAgIC8vIE9wcmF0b3IgUHJlY2VkZW5jZSBQcm9ibGVtCisgICAgICAgIC8vIF4sICYsIHwgc2hvdWxkIGJlIHByaW9yIHRvID09LCA8LCA+LCA8PSwgPj0KKyAgICAgICAgZGVmIGEgPSAxMworICAgICAgICBhc3NlcnQgYSBeIDEwID09IDcgLy8gMHgwMDAwMDAwRCBeIDB4MDAwMDAwMEEgPSAweDAwMDAwMDAwNworICAgICAgICBhc3NlcnQgYSBeIDE1ID09IDIgLy8gMHgwMDAwMDAwRCBeIDB4MDAwMDAwMEYgPSAweDAwMDAwMDAwMgorICAgICAgICBkZWYgYiA9IC0xMworICAgICAgICBhc3NlcnQgYiBeIDEwID09IC03IC8vIDB4RkZGRkZGRjMgXiAweDAwMDAwMDBBID0gMHhGRkZGRkZGOQorICAgICAgICBhc3NlcnQgYiBeIDE1ID09IC00IC8vIDB4RkZGRkZGRjMgXiAweDAwMDAwMDBGID0gMHhGRkZGRkZGQworICAgIH0KKworICAgIHZvaWQgdGVzdEJpdHdpc2VYb3JFcXVhbCgpIHsKKyAgICAgICAgZGVmIGEgPSAxMworICAgICAgICBhIF49IDgKKyAgICAgICAgYXNzZXJ0IGEgPT0gNSAvLyAweDAwMDAwMDBEIF4gMHgwMDAwMDAwOCA9IDB4MDAwMDAwMDA1CisgICAgICAgIGEgXj0gMTYKKyAgICAgICAgYXNzZXJ0IGEgPT0gMjEgLy8gMHgwMDAwMDAwNSBeIDB4MDAwMDAwMTAgPSAweDAwMDAwMDAxNQorICAgICAgICBkZWYgYiA9IC0xMworICAgICAgICBiIF49IDgKKyAgICAgICAgYXNzZXJ0IGIgPT0gLTUgLy8gMHhGRkZGRkZGMyBeIDB4MDAwMDAwMDggPSAweEZGRkZGRkZCCisgICAgICAgIGIgXj0gMTYKKyAgICAgICAgYXNzZXJ0IGIgPT0gLTIxIC8vIDB4RkZGRkZGRkIgXiAweDAwMDAwMDEwID0gMHhGRkZGRkZFQgorICAgIH0KKworICAgIHZvaWQgdGVzdEJpdHdpc2VPckluQ2xvc3VyZSgpIHsKKyAgICAgICAgZGVmIGMxID0ge3gsIHkgLT4gcmV0dXJuIHggfCB5fQorICAgICAgICBhc3NlcnQgYzEoMTQsIDUpID09IDE1IC8vIDB4MDAwMDAwMEUgfCAweDAwMDAwMDA1ID0gMHgwMDAwMDAwRgorICAgICAgICBhc3NlcnQgYzEoMHgwRCwgMHhGRSkgPT0gMjU1IC8vIDB4MDAwMDAwMEQgfCAweDAwMDAwMEZFID0gMHgwMDAwMDBGRgorCisgICAgICAgIGRlZiBjMiA9IHt4LCB5IC0+IHJldHVybiB4IHwgeX0KKyAgICAgICAgYXNzZXJ0IGMyKDE0LCA1KSA9PSAxNSAvLyAweDAwMDAwMDBFIHwgMHgwMDAwMDAwNSA9IDB4MDAwMDAwMEYKKyAgICAgICAgYXNzZXJ0IGMyKDB4MEQsIDB4RkUpID09IDI1NSAvLyAweDAwMDAwMDBEIHwgMHgwMDAwMDBGRSA9IDB4MDAwMDAwRkYKKyAgICB9CisKKyAgICB2b2lkIHRlc3RBbWJpZ3VpdHlPZkJpdHdpc2VPcigpIHsKKyAgICAgICAgZGVmIGMxID0ge3gsIHkgLT4gcmV0dXJuIHggfCB5fQorICAgICAgICBhc3NlcnQgYzEoMTQsIDUpID09IDE1IC8vIDB4MDAwMDAwMEUgfCAweDAwMDAwMDA1ID0gMHgwMDAwMDAwRgorICAgICAgICBhc3NlcnQgYzEoMHgwRCwgMHhGRSkgPT0gMjU1IC8vIDB4MDAwMDAwMEQgfCAweDAwMDAwMEZFID0gMHgwMDAwMDBGRgorCisgICAgICAgIGRlZiBjMiA9IHt4LCB5IC0+IHJldHVybiB4IHwgeX0KKyAgICAgICAgYXNzZXJ0IGMyKDE0LCA1KSA9PSAxNSAvLyAweDAwMDAwMDBFIHwgMHgwMDAwMDAwNSA9IDB4MDAwMDAwMEYKKyAgICAgICAgYXNzZXJ0IGMyKDB4MEQsIDB4RkUpID09IDI1NSAvLyAweDAwMDAwMDBEIHwgMHgwMDAwMDBGRSA9IDB4MDAwMDAwRkYKKworICAgICAgICBkZWYgeCA9IDMKKyAgICAgICAgZGVmIHkgPSA1CisgICAgICAgIGMxID0ge3h4IC0+IHJldHVybiB5fSAvLyAtPiBpcyBhIGNsb3N1cmUgZGVsaW1pdGVyCisgICAgICAgIGMyID0ge3JldHVybiB4ICYgeX0gLy8gJiBpcyBhIGJpdEFuZAorICAgICAgICBkZWYgYzMgPSB7cmV0dXJuIHggXiB5fSAvLyAmIGlzIGEgYml0WG9yCisgICAgICAgIGRlZiBjMTEgPSB7CisgICAgICAgICAgICB4eCAtPiByZXR1cm4geSAvLyAtPiBpcyBhIGNsb3N1cmUgZGVsaW1pdGVyCisgICAgICAgIH0KKyAgICAgICAgZGVmIGMxMiA9IHsKKyAgICAgICAgICAgIHJldHVybiAoeCB8IHkpIC8vIHwgaXMgYSBiaXRPcgorICAgICAgICB9CisgICAgICAgIGRlZiBjMTMgPSB7eHggLT4gcmV0dXJuIHkgLy8gLT4gaXMgYSBjbG9zdXJlIGRlbGltaXRlcgorICAgICAgICB9CisgICAgICAgIGRlZiBjMTQgPSB7LT4gcmV0dXJuIHggfCB5IC8vIGxhc3QgfCBpcyBhIGJpdE9yCisgICAgICAgIH0KKworICAgICAgICBhc3NlcnQgYzEobnVsbCkgPT0gNQorICAgICAgICBhc3NlcnQgYzIoKSA9PSAxCisgICAgICAgIGFzc2VydCBjMygpID09IDYKKyAgICAgICAgYXNzZXJ0IGMxMShudWxsKSA9PSA1CisgICAgICAgIGFzc2VydCBjMTIoKSA9PSA3CisgICAgICAgIGFzc2VydCBjMTMobnVsbCkgPT0gNQorICAgICAgICBhc3NlcnQgYzE0KCkgPT0gNworCisgICAgICAgIHggPSAweDAzCisKKyAgICAgICAgZGVmIGQxID0ge3h4IC0+IHJldHVybiB4eH0gLy8gLT4gaXMgYSBjbG9zdXJlIGRlbGltaXRlcgorICAgICAgICBkZWYgZDIgPSB7cmV0dXJuIHggJiB4fSAvLyAmIGlzIGEgYml0QW5kCisgICAgICAgIGRlZiBkMyA9IHtyZXR1cm4geCBeIHh9IC8vICYgaXMgYSBiaXRYb3IKKyAgICAgICAgZGVmIGQxMSA9IHsKKyAgICAgICAgICAgIHh4IC0+IHJldHVybiB4eCAvLyAtPiBpcyBhIGNsb3N1cmUgZGVsaW1pdGVyCisgICAgICAgIH0KKyAgICAgICAgZGVmIGQxMiA9IHsKKyAgICAgICAgICAgIHJldHVybiAoeCB8IHgpIC8vIHwgaXMgYSBiaXRPcgorICAgICAgICB9CisgICAgICAgIGRlZiBkMTMgPSB7eHggLT4gcmV0dXJuIHh4IC8vIC0+IGlzIGEgY2xvc3VyZSBkZWxpbWl0ZXIKKyAgICAgICAgfQorICAgICAgICBkZWYgZDE0ID0gey0+IHJldHVybiB4IHwgeCAvLyBsYXN0IHwgaXMgYSBiaXRPcgorICAgICAgICB9CisgICAgICAgIGFzc2VydCBkMSgweEYwKSA9PSAweEYwCisgICAgICAgIGFzc2VydCBkMigweEYwKSA9PSAweDAzCisgICAgICAgIGFzc2VydCBkMygweEYwKSA9PSAwCisgICAgICAgIGFzc2VydCBkMTEoMHhGMCkgPT0gMHhGMAorICAgICAgICBhc3NlcnQgZDEyKDB4RjApID09IDB4MDMKKyAgICAgICAgYXNzZXJ0IGQxMygweEYwKSA9PSAweEYwCisgICAgICAgIGFzc2VydCBkMTQoKSA9PSAweDAzCisgICAgfQorCisgICAgdm9pZCB0ZXN0Qml0d2lzZU5lZ2F0aW9uKCkgeworICAgICAgICBhc3NlcnQgfjEgPT0gLTIgLy8gfjB4MDAwMDAwMDEgPSAweEZGRkZGRkZFCisgICAgICAgIGFzc2VydCB+LTEgPT0gMCAvLyB+MHhGRkZGRkZGRiA9IDB4MDAwMDAwMDAKKyAgICAgICAgYXNzZXJ0IH5+NSA9PSA1IC8vIH5+MHgwMDAwMDAwNSA9IH4weEZGRkZGRkZBID0gMHhGRkZGRkZGNQorICAgICAgICBkZWYgYSA9IDEzCisgICAgICAgIGFzc2VydCB+YSA9PSAtMTQgLy8gfjB4MDAwMDAwMEQgPSAweEZGRkZGRkYyCisgICAgICAgIGFzc2VydCB+fmEgPT0gMTMgLy8gfn4weDAwMDAwMDBEID0gfjB4RkZGRkZGRjIgPSAweDAwMDAwMDBECisgICAgICAgIGFzc2VydCAtfmEgPT0gMTQgLy8gLX4weDAwMDAwMDBEID0gLTB4RkZGRkZGRjIgPSAweDAwMDAwMDBFCisgICAgfQorCisgICAgdm9pZCB0ZXN0Qml0d2lzZU5lZ2F0aW9uVHlwZSgpIHsKKyAgICAgICAgZGVmIHggPSB+NworICAgICAgICBhc3NlcnQgeC5jbGFzcyA9PSBqYXZhLmxhbmcuSW50ZWdlcgorCisgICAgICAgIGRlZiB5ID0gfiJmb28iCisgICAgICAgIGFzc2VydCB5LmNsYXNzID09IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuCisKKyAgICAgICAgZGVmIHogPSB+IiR7eH0iCisgICAgICAgIGFzc2VydCB6LmNsYXNzID09IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuCisgICAgfQorCisgICAgdm9pZCB0ZXN0Qml0d2lzZU5lZ2F0aW9uVHlwZUNhbGxGdW5jdGlvbigpIHsKKyAgICAgICAgLy8gaW50ZWdlciB0ZXN0CisgICAgICAgIGFzc2VydCBuZWcoMikuY2xhc3MgPT0gamF2YS5sYW5nLkludGVnZXIKKyAgICAgICAgYXNzZXJ0IG5lZygyKSBpbnN0YW5jZW9mIGphdmEubGFuZy5JbnRlZ2VyCisgICAgICAgIGFzc2VydCBuZWcoMikgPT0gfjIKKworICAgICAgICAvLyBsb25nIHRlc3QKKyAgICAgICAgYXNzZXJ0IG5lZygyTCkuY2xhc3MgPT0gamF2YS5sYW5nLkxvbmcKKyAgICAgICAgYXNzZXJ0IG5lZygyTCkgaW5zdGFuY2VvZiBqYXZhLmxhbmcuTG9uZworICAgICAgICBhc3NlcnQgbmVnKDJMKSA9PSB+MgorCisgICAgICAgIC8vIEJpZ0ludGVnZXIgdGVzdAorICAgICAgICBhc3NlcnQgbmVnKG5ldyBqYXZhLm1hdGguQmlnSW50ZWdlcigiMiIpKS5jbGFzcyA9PSBqYXZhLm1hdGguQmlnSW50ZWdlcgorICAgICAgICBhc3NlcnQgbmVnKG5ldyBqYXZhLm1hdGguQmlnSW50ZWdlcigiMiIpKSBpbnN0YW5jZW9mIGphdmEubWF0aC5CaWdJbnRlZ2VyCisgICAgICAgIGFzc2VydCBuZWcobmV3IGphdmEubWF0aC5CaWdJbnRlZ2VyKCIyIikpID09IH4yCisKKyAgICAgICAgLy8gQmlnSW50ZWdlciB0ZXN0CisgICAgICAgIGFzc2VydCBuZWcoMkcpLmNsYXNzID09IGphdmEubWF0aC5CaWdJbnRlZ2VyCisgICAgICAgIGFzc2VydCBuZWcoMkcpIGluc3RhbmNlb2YgamF2YS5tYXRoLkJpZ0ludGVnZXIKKyAgICAgICAgYXNzZXJ0IG5lZygyRykgPT0gfjIKKworICAgICAgICBhc3NlcnQgbmVnKCJmb28iKS5jbGFzcyA9PSBqYXZhLnV0aWwucmVnZXguUGF0dGVybgorICAgICAgICBhc3NlcnQgbmVnKCJmb28iKSBpbnN0YW5jZW9mIGphdmEudXRpbC5yZWdleC5QYXR0ZXJuCisgICAgfQorCisgICAgdm9pZCB0ZXN0Q29ycmVjdEF1dG9ib3hpbmcoKSB7CisgICAgICAgIC8vIHRlc3QgdGhhdCB0aGUgZmlyc3QgcGFyYW1ldGVyIGlzIGJveGVkIGNvcnJlY3RseSwgaWYgbm90IHRoZW4gdGhpcyB0ZXN0CisgICAgICAgIC8vIHdpbGwgcG9zc2libHkgcHJvZHVjZSBhIHZlcmlmeSBlcnJvcgorICAgICAgICBhc3NlcnQgKCF0cnVlIHwgZmFsc2UpID09IGZhbHNlCisgICAgICAgIGFzc2VydCAodHJ1ZSB8IGZhbHNlKSA9PSB0cnVlCisgICAgICAgIGFzc2VydCAoIXRydWUgJiBmYWxzZSkgPT0gZmFsc2UKKyAgICAgICAgYXNzZXJ0ICh0cnVlICYgZmFsc2UpID09IGZhbHNlCisgICAgICAgIGFzc2VydCAodHJ1ZSAmICFmYWxzZSkgPT0gdHJ1ZQorCisgICAgfQorCisgICAgT2JqZWN0IG5lZyhuKSB7CisgICAgICAgIGlmIChuIGluc3RhbmNlb2YgamF2YS5sYW5nLkludGVnZXIpIHsKKyAgICAgICAgICAgIHJldHVybiB+bgorICAgICAgICB9CisgICAgICAgIGlmIChuIGluc3RhbmNlb2YgamF2YS5sYW5nLkxvbmcpIHsKKyAgICAgICAgICAgIHJldHVybiB+bgorICAgICAgICB9CisgICAgICAgIGlmIChuIGluc3RhbmNlb2YgamF2YS5tYXRoLkJpZ0ludGVnZXIpIHsKKyAgICAgICAgICAgIHJldHVybiB+bgorICAgICAgICB9CisgICAgICAgIHJldHVybiB+bi50b1N0cmluZygpCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvb3BlcmF0b3IvQm9vbGVhbk9wZXJhdGlvbnNUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvb3BlcmF0b3IvQm9vbGVhbk9wZXJhdGlvbnNUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODhhNzY4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9vcGVyYXRvci9Cb29sZWFuT3BlcmF0aW9uc1Rlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTI5IEBACitwYWNrYWdlIGdyb292eS5vcGVyYXRvcgorCitjbGFzcyBCb29sZWFuT3BlcmF0aW9uc1Rlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICB2b2lkIHRlc3RDb21wYXJpc29ucygpIHsKKyAgICAgICAgYXNzZXJ0IHRydWUKKyAgICAgICAgYXNzZXJ0IHRydWUgIT0gZmFsc2UKKyAgICAgICAgCisgICAgICAgIGRlZiB4ID0gdHJ1ZQorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IHgKKyAgICAgICAgYXNzZXJ0IHggPT0gdHJ1ZQorICAgICAgICBhc3NlcnQgeCAhPSBmYWxzZQorICAgICAgICAKKyAgICAgICAgeCA9IGZhbHNlCisgICAgICAgIAorICAgICAgICBhc3NlcnQgeCA9PSBmYWxzZQorICAgICAgICBhc3NlcnQgeCAhPSB0cnVlCisgICAgICAgIAorICAgICAgICBhc3NlcnQgIXgKKyAgICAgICAgCisgICAgICAgIGRlZiB5ID0gZmFsc2UgICAgICAgIAorICAgICAgICBhc3NlcnQgeCA9PSB5CisgICAgICAgIAorICAgICAgICB5ID0gdHJ1ZQorICAgICAgICBhc3NlcnQgeCAhPSB5CisgICAgfQorICAgIAorICAgIAorICAgIHZvaWQgdGVzdElmQnJhbmNoKCkgeworICAgICAgICBkZWYgeCA9IGZhbHNlCisgICAgICAgIGRlZiByID0gZmFsc2UKKyAgICAgICAgCisgICAgICAgIGlmICggeCApIHsKKyAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgciA9IHRydWUKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydCByCisgICAgICAgIAorICAgICAgICB4ID0gdHJ1ZQorICAgICAgICByID0gZmFsc2UKKyAgICAgICAgCisgICAgICAgIGlmICggeCApIHsKKyAgICAgICAgICAgIHIgPSB0cnVlCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQgcgorICAgICAgICAKKyAgICAgICAgaWYgKCAheCApIHsKKyAgICAgICAgICAgIHIgPSBmYWxzZQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgciA9IHRydWUKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IHIKKyAgICB9CisKKworCXZvaWQgdGVzdEJvb2xlYW5FeHByZXNzaW9uKCkgeworCSAgICBkZWYgeCA9IDUKKwkgICAgZGVmIHZhbHVlID0geCA+IDIKKwkgICAgYXNzZXJ0IHZhbHVlCisJICAgIAorCSAgICB2YWx1ZSA9IHggPCAyCisJICAgIGFzc2VydCB2YWx1ZSA9PSBmYWxzZQorCX0KKwkKKwkKKwl2b2lkIHRlc3RCb29sZWFuT3BzKCkgeworCSAgICBib29sZWFuIHggPSB0cnVlCisJICAgIGJvb2xlYW4geSA9IGZhbHNlCisJICAgIGFzc2VydCAoeCAmIHgpID09IHRydWUKKwkgICAgYXNzZXJ0ICh4ICYgeSkgPT0gZmFsc2UKKwkgICAgYXNzZXJ0ICh5ICYgeCkgPT0gZmFsc2UKKwkgICAgYXNzZXJ0ICh5ICYgeSkgPT0gZmFsc2UKKworCSAgICBhc3NlcnQgKHggfCB4KSA9PSB0cnVlCisJICAgIGFzc2VydCAoeCB8IHkpID09IHRydWUKKwkgICAgYXNzZXJ0ICh5IHwgeCkgPT0gdHJ1ZQorCSAgICBhc3NlcnQgKHkgfCB5KSA9PSBmYWxzZQorCisJICAgIGFzc2VydCAoeCBeIHgpID09IGZhbHNlCisJICAgIGFzc2VydCAoeCBeIHkpID09IHRydWUKKwkgICAgYXNzZXJ0ICh5IF4geCkgPT0gdHJ1ZQorCSAgICBhc3NlcnQgKHkgXiB5KSA9PSBmYWxzZQorCisJICAgIGFzc2VydCAoIXgpID09IGZhbHNlCisJICAgIGFzc2VydCAoIXkpID09IHRydWUKKwl9CisKKworCXZvaWQgdGVzdEJvb2xlYW5Bc3NpZ25PcHMoKSB7CisJICAgIGJvb2xlYW4geiA9IHRydWUKKwkgICAgeiAmPSB0cnVlCisJICAgIGFzc2VydCB6ID09IHRydWUKKwkgICAgeiAmPSBmYWxzZQorCSAgICBhc3NlcnQgeiA9PSBmYWxzZQorCisJICAgIHogPSB0cnVlCisJICAgIHogfD0gdHJ1ZQorCSAgICBhc3NlcnQgeiA9PSB0cnVlCisJICAgIHogfD0gZmFsc2UKKwkgICAgYXNzZXJ0IHogPT0gdHJ1ZQorCSAgICB6ID0gZmFsc2UKKwkgICAgeiB8PSBmYWxzZQorCSAgICBhc3NlcnQgeiA9PSBmYWxzZQorCSAgICB6IHw9IHRydWUKKwkgICAgYXNzZXJ0IHogPT0gdHJ1ZQorCisgICAgICAgIHogPSB0cnVlCisgICAgICAgIHogXj0gdHJ1ZQorICAgICAgICBhc3NlcnQgeiA9PSBmYWxzZQorICAgICAgICB6IF49IHRydWUKKyAgICAgICAgYXNzZXJ0IHogPT0gdHJ1ZQorICAgICAgICB6IF49IGZhbHNlCisgICAgICAgIGFzc2VydCB6ID09IHRydWUKKyAgICAgICAgeiBePSB0cnVlCisgICAgICAgIGFzc2VydCB6ID09IGZhbHNlCisgICAgICAgIHogXj0gZmFsc2UKKyAgICAgICAgYXNzZXJ0IHogPT0gZmFsc2UKKwl9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvb3BlcmF0b3IvRG91YmxlT3BlcmF0aW9uVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L29wZXJhdG9yL0RvdWJsZU9wZXJhdGlvblRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5OThhMjEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L29wZXJhdG9yL0RvdWJsZU9wZXJhdGlvblRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsODIgQEAKK3BhY2thZ2UgZ3Jvb3Z5Lm9wZXJhdG9yCisKK2NsYXNzIERvdWJsZU9wZXJhdGlvblRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICBkZWYgeAorICAgIGRlZiB5CisgICAgCisgICAgdm9pZCB0ZXN0UGx1cygpIHsKKyAgICAgICAgeCA9IDIuMSArIDIuMQorICAgICAgICBhc3NlcnQgeCA9PSA0LjIKKyAgICAgICAgCisgICAgICAgIHggPSAzICsgMi4yCisgICAgICAgIGFzc2VydCB4ID09IDUuMgorICAgICAgICAKKyAgICAgICAgeCA9IDIuMiArIDQKKyAgICAgICAgYXNzZXJ0IHggPT0gNi4yCisgICAgICAgIAorICAgICAgICB5ID0geCArIDEKKyAgICAgICAgYXNzZXJ0IHkgPT0gNy4yICAgICAgIAorICAgICAgICAJCisgICAgICAgIGRlZiB6ID0geSArIHggKyAxICsgMgorICAgICAgICBhc3NlcnQgeiA9PSAxNi40CisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdE1pbnVzKCkgeworICAgICAgICB4ID0gNiAtIDIuMgorICAgICAgICBhc3NlcnQgeCA9PSAzLjgKKyAgICAgICAgCisgICAgICAgIHggPSA1LjggLSAyCisgICAgICAgIGFzc2VydCB4ID09IDMuOAorICAgICAgICAKKyAgICAgICAgeSA9IHggLSAxCisJCWFzc2VydCB5ID09IDIuOCAgICAgICAgCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdE11bHRpcGx5KCkgeworICAgICAgICB4ID0gMyAqIDIuMAorICAgICAgICBhc3NlcnQgeCA9PSA2LjAKKyAgICAgICAgCisgICAgICAgIHggPSAzLjAgKiAyCisgICAgICAgIGFzc2VydCB4ID09IDYuMAorICAgICAgICAKKyAgICAgICAgeCA9IDMuMCAqIDIuMAorICAgICAgICBhc3NlcnQgeCA9PSA2LjAKKyAgICAgICAgeSA9IHggKiAyCisgICAgICAgIGFzc2VydCB5ID09IDEyLjAgICAgICAgIAorICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3REaXZpZGUoKSB7CisgICAgICAgIHggPSA4MC4wIC8gNAorICAgICAgICBhc3NlcnQgeCA9PSAyMC4wICwgInggPSAiICsgeAorICAgICAgICAKKyAgICAgICAgeCA9IDgwIC8gNC4wCisgICAgICAgIGFzc2VydCB4ID09IDIwLjAgLCAieCA9ICIgKyB4CisgICAgICAgIAorICAgICAgICB5ID0geCAvIDIKKyAgICAgICAgYXNzZXJ0IHkgPT0gMTAuMCAsICJ5ID0gIiArIHkgICAgIAorICAgIH0KKworICAgIHZvaWQgdGVzdE1ldGhvZE5vdEZvdW5kKCkgeworICAgIAl0cnkgeworICAgIAkJcHJpbnRsbiggTWF0aC5zaW4oImZvbyIsIDcpICk7CisJICAgIAlmYWlsKCJTaG91bGQgY2F0Y2ggYSBNaXNzaW5nTWV0aG9kRXhjZXB0aW9uIik7CisgICAgCX0gY2F0Y2ggKE1pc3NpbmdNZXRob2RFeGNlcHRpb24gbW1lKSB7CisgICAgCX0KKyAgICB9CisgICAgICAgIAorICAgIHZvaWQgdGVzdENvZXJjZSgpIHsKKyAgICAJZGVmIHh5eiA9IE1hdGguc2luKDEuMSk7CisgICAgCWFzc2VydCB4eXogaW5zdGFuY2VvZiBEb3VibGU7CisgICAgCWFzc2VydCB4eXogPT0gTWF0aC5zaW4oMS4xRCk7CisgICAgCQorICAgICAgICAvL05vdGUgdGhhdCAoNy4zRikuZG91YmxlVmFsdWUoKSAhPSA3LjNECisgICAgCXggPSBNYXRoLnNpbig3LjNGKTsKKyAgICAJYXNzZXJ0IHggaW5zdGFuY2VvZiBEb3VibGU7CisgICAgCWFzc2VydCB4ID09IE1hdGguc2luKCg3LjNGKS5kb3VibGVWYWx1ZSgpKTsKKworICAgIAl4ID0gTWF0aC5zaW4oNyk7CisgICAgCWFzc2VydCB4IGluc3RhbmNlb2YgRG91YmxlOworICAgIAlhc3NlcnQgeCA9PSBNYXRoLnNpbig3LjBEKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L29wZXJhdG9yL0ludGVnZXJPcGVyYXRvcnNUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvb3BlcmF0b3IvSW50ZWdlck9wZXJhdG9yc1Rlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwODNjZjEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L29wZXJhdG9yL0ludGVnZXJPcGVyYXRvcnNUZXN0Lmdyb292eQpAQCAtMCwwICsxLDE4NSBAQAorcGFja2FnZSBncm9vdnkub3BlcmF0b3IKKworY2xhc3MgSW50ZWdlck9wZXJhdG9yc1Rlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICBkZWYgeAorICAgIGRlZiB5CisgICAgZGVmIHoKKyAgICAKKyAgICB2b2lkIHRlc3RQbHVzKCkgeworICAgICAgICB4ID0gMiArIDIKKyAgICAgICAgYXNzZXJ0IHggPT0gNAorICAgICAgICAKKyAgICAgICAgeSA9IHggKyAxCisgICAgICAgIGFzc2VydCB5ID09IDUKKworICAgICAgICB6ID0geSArIHggKyAxICsgMgorICAgICAgICBhc3NlcnQgeiA9PSAxMgorICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RDaGFyYWN0ZXJQbHVzKCkgeworICAgICAgICBDaGFyYWN0ZXIgYzEgPSAxCisgICAgICAgIENoYXJhY3RlciBjMiA9IDIKKworICAgICAgICB4ID0gYzIgKyAyCisgICAgICAgIGFzc2VydCB4ID09IDQKKworICAgICAgICB4ID0gMiArIGMyCisgICAgICAgIGFzc2VydCB4ID09IDQKKworICAgICAgICB4ID0gYzIgKyBjMgorICAgICAgICBhc3NlcnQgeCA9PSA0CisgICAgICAgICAgCisgICAgICAgIHkgPSB4ICsgYzEKKyAgICAgICAgYXNzZXJ0IHkgPT0gNQorICAgICAgICAgIAorICAgICAgICB5ID0gYzEgKyB4CisgICAgICAgIGFzc2VydCB5ID09IDUKKworICAgICAgICB6ID0geSArIHggKyBjMSArIDIKKyAgICAgICAgYXNzZXJ0IHogPT0gMTIKKworICAgICAgICB6ID0geSArIHggKyAxICsgYzIKKyAgICAgICAgYXNzZXJ0IHogPT0gMTIKKworICAgICAgICB6ID0geSArIHggKyBjMSArIGMyCisgICAgICAgIGFzc2VydCB6ID09IDEyCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdE1pbnVzKCkgeworICAgICAgICB4ID0gNiAtIDIKKyAgICAgICAgYXNzZXJ0IHggPT0gNAorICAgICAgICAKKyAgICAgICAgeSA9IHggLSAxCisgICAgICAgIGFzc2VydCB5ID09IDMKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0Q2hhcmFjdGVyTWludXMoKSB7CisgICAgICAgIENoYXJhY3RlciBjMSA9IDEKKyAgICAgICAgQ2hhcmFjdGVyIGMyID0gMgorICAgICAgICBDaGFyYWN0ZXIgYzYgPSA2CisKKyAgICAgICAgeCA9IGM2IC0gMgorICAgICAgICBhc3NlcnQgeCA9PSA0CisKKyAgICAgICAgeCA9IDYgLSBjMgorICAgICAgICBhc3NlcnQgeCA9PSA0CisKKyAgICAgICAgeCA9IGM2IC0gYzIKKyAgICAgICAgYXNzZXJ0IHggPT0gNAorICAgICAgICAKKyAgICAgICAgeSA9IHggLSBjMQorICAgICAgICBhc3NlcnQgeSA9PSAzCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdE11bHRpcGx5KCkgeworICAgICAgICB4ID0gMyAqIDIKKyAgICAgICAgYXNzZXJ0IHggPT0gNgorICAgICAgICAKKyAgICAgICAgeSA9IHggKiAyCisgICAgICAgIGFzc2VydCB5ID09IDEyICAgICAgICAKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0RGl2aWRlKCkgeworICAgICAgICB4ID0gODAgLyA0CisgICAgICAgIGFzc2VydCB4ID09IDIwLjAgLCAieCA9ICIgKyB4CisgICAgICAgIAorICAgICAgICB5ID0geCAvIDIKKyAgICAgICAgYXNzZXJ0IHkgPT0gMTAuMCAsICJ5ID0gIiArIHkKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0SW50ZWdlckRpdmlkZSgpIHsKKyAgICAgICAgeCA9IDUyLmludGRpdigzKQorICAgICAgICBhc3NlcnQgeCA9PSAxNyAsICJ4ID0gIiArIHgKKyAgICAgICAgCisgICAgICAgIHkgPSB4LmludGRpdigyKQorICAgICAgICBhc3NlcnQgeSA9PSA4ICwgInkgPSAiICsgeSAKKyAgICAgICAgCisgICAgICAgIHkgPSAxMQorICAgICAgICB5ID0geS5pbnRkaXYoMykKKyAgICAgICAgYXNzZXJ0IHkgPT0gMyAgICAgICAKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0TW9kKCkgeworICAgICAgICB4ID0gMTAwICUgMworCisgICAgICAgIGFzc2VydCB4ID09IDEKKworICAgICAgICB5ID0gMTEKKyAgICAgICAgeSAlPSAzCisgICAgICAgIGFzc2VydCB5ID09IDIKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0QW5kKCkgeworICAgICAgICB4ID0gMSAmIDMKKworICAgICAgICBhc3NlcnQgeCA9PSAxCisKKyAgICAgICAgeCA9IDEuYW5kKDMpCisKKyAgICAgICAgYXNzZXJ0IHggPT0gMQorICAgIH0KKyAgICAgCisgICAgIHZvaWQgdGVzdE9yKCkgeworICAgICAgICAgeCA9IDEgfCAzCisKKyAgICAgICAgIGFzc2VydCB4ID09IDMKKworICAgICAgICAgeCA9IDEgfCA0CisKKyAgICAgICAgIGFzc2VydCB4ID09IDUKKworICAgICAgICAgeCA9IDEub3IoMykKKworICAgICAgICAgYXNzZXJ0IHggPT0gMworCisgICAgICAgICB4ID0gMS5vcig0KQorCisgICAgICAgICBhc3NlcnQgeCA9PTUKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0U2hpZnRPcGVyYXRvcnMoKSB7CisKKyAgICAgICAgeCA9IDggPj4gMQorICAgICAgICBhc3NlcnQgeCA9PSA0CisgICAgICAgIGFzc2VydCB4IGluc3RhbmNlb2YgSW50ZWdlcgorCisgICAgICAgIHggPSA4IDw8IDIKKyAgICAgICAgYXNzZXJ0IHggPT0gMzIKKyAgICAgICAgYXNzZXJ0IHggaW5zdGFuY2VvZiBJbnRlZ2VyCisKKyAgICAgICAgeCA9IDhMIDw8IDIKKyAgICAgICAgYXNzZXJ0IHggPT0gMzIKKyAgICAgICAgYXNzZXJ0IHggaW5zdGFuY2VvZiBMb25nCisKKyAgICAgICAgeCA9IC0xNiA+PiA0CisgICAgICAgIGFzc2VydCB4ID09IC0xCisKKyAgICAgICAgeCA9IC0xNiA+Pj4gNAorICAgICAgICBhc3NlcnQgeCA9PSAweEZGRkZGRkYKKworICAgICAgICAvL0Vuc3VyZSB0aGF0IHRoZSB0eXBlIG9mIHRoZSByaWdodCBvcGVyYW5kIChzaGlmdCBkaXN0YW5jZSkgaXMgaWdub3JlZCB3aGVuIGNhbGN1bGF0aW5nIHRoZQorICAgICAgICAvL3Jlc3VsdC4gIFRoaXMgaXMgaG93IGphdmEgd29ya3MsIGFuZCBmb3IgdGhlc2Ugb3BlcmF0b3JzLCBpdCBtYWtlcyBzZW5zZSB0byBrZWVwIHRoYXQgYmVoYXZpb3IuCisgICAgICAgIHggPSBJbnRlZ2VyLk1BWF9WQUxVRSA8PCAxTAorICAgICAgICBhc3NlcnQgeCA9PSAtMgorICAgICAgICBhc3NlcnQgeCBpbnN0YW5jZW9mIEludGVnZXIKKworICAgICAgICB4ID0gbmV3IExvbmcoSW50ZWdlci5NQVhfVkFMVUUpLmxvbmdWYWx1ZSgpIDw8IDEKKyAgICAgICAgYXNzZXJ0IHggPT0gMHhmZmZmZmZmZQorICAgICAgICBhc3NlcnQgeCBpbnN0YW5jZW9mIExvbmcKKworICAgICAgICAvL1RoZSBsZWZ0IG9wZXJhbmQgKHNoaWZ0IHZhbHVlKSBtdXN0IGJlIGFuIGludGVncmFsIHR5cGUKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHggPSA4LjBGID4+IDIKKyAgICAgICAgICAgIGZhaWwoIlNob3VsZCBjYXRjaCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiB1b2UpIHsKKyAgICAgICAgfQorCisgICAgICAgIC8vVGhlIHJpZ2h0IG9wZXJhbmQgKHNoaWZ0IGRpc3RhbmNlKSBtdXN0IGJlIGFuIGludGVncmFsIHR5cGUKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHggPSA4ID4+IDIuMAorICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGNhdGNoIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHVvZSkgeworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9vcGVyYXRvci9NeUNvbG9yLmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvb3BlcmF0b3IvTXlDb2xvci5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM0MGE5YgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvb3BlcmF0b3IvTXlDb2xvci5ncm9vdnkKQEAgLTAsMCArMSwyMyBAQAorcGFja2FnZSBncm9vdnkub3BlcmF0b3IKKworaW1wb3J0IGphdmEuYXd0LkNvbG9yCisKK2NsYXNzIE15Q29sb3IgeworICAgIENvbG9yIGRlbGVnYXRlCisKKyAgICBNeUNvbG9yKGludCByLCBpbnQgZywgaW50IGIpIHsKKyAgICAgICAgZGVsZWdhdGUgPSBuZXcgQ29sb3IociwgZywgYikKKyAgICB9CisKKyAgICBNeUNvbG9yIG5lZ2F0aXZlKCkgeworICAgICAgICByZXR1cm4gbmV3IE15Q29sb3IoZGVsZWdhdGUucmVkLmludGRpdigyKSwgZGVsZWdhdGUuZ3JlZW4uaW50ZGl2KDIpLCBkZWxlZ2F0ZS5ibHVlLmludGRpdigyKSkKKyAgICB9CisKKyAgICBNeUNvbG9yIHBvc2l0aXZlKCkgeworICAgICAgICByZXR1cm4gbmV3IE15Q29sb3IoMiAqIGRlbGVnYXRlLnJlZCAtIDEsIDIgKiBkZWxlZ2F0ZS5ncmVlbiAtIDEsIDIgKiBkZWxlZ2F0ZS5ibHVlIC0gMSkKKyAgICB9CisKKyAgICBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZS50b1N0cmluZygpCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9vcGVyYXRvci9NeUNvbG9yQ2F0ZWdvcnkuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9vcGVyYXRvci9NeUNvbG9yQ2F0ZWdvcnkuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2YTQ1YmQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L29wZXJhdG9yL015Q29sb3JDYXRlZ29yeS5ncm9vdnkKQEAgLTAsMCArMSw3IEBACitwYWNrYWdlIGdyb292eS5vcGVyYXRvcgorCitjbGFzcyBNeUNvbG9yQ2F0ZWdvcnkgeworICAgIHN0YXRpYyBNeUNvbG9yIGJpdHdpc2VOZWdhdGUoTXlDb2xvciBzZWxmKSB7CisgICAgICAgIHJldHVybiBuZXcgTXlDb2xvcigyNTYgLSBzZWxmLmRlbGVnYXRlLnJlZCwgMjU2IC0gc2VsZi5kZWxlZ2F0ZS5ncmVlbiwgMjU2IC0gc2VsZi5kZWxlZ2F0ZS5ibHVlKQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvb3BlcmF0b3IvTXlDb2xvck9wZXJhdG9yT3ZlcmxvYWRpbmdUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvb3BlcmF0b3IvTXlDb2xvck9wZXJhdG9yT3ZlcmxvYWRpbmdUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzY1OTYwCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9vcGVyYXRvci9NeUNvbG9yT3BlcmF0b3JPdmVybG9hZGluZ1Rlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTYgQEAKK3BhY2thZ2UgZ3Jvb3Z5Lm9wZXJhdG9yCisKK2ltcG9ydCBzdGF0aWMgamF2YS5hd3QuQ29sb3IuKgorCitjbGFzcyBNeUNvbG9yT3BlcmF0b3JPdmVybG9hZGluZ1Rlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisgICAgdm9pZCB0ZXN0QWxsKCkgeworICAgICAgICBkZWYgYyA9IG5ldyBNeUNvbG9yKDEyOCwgMTI4LCAxMjgpCisgICAgICAgIGFzc2VydCBjLmRlbGVnYXRlID09IEdSQVkKKyAgICAgICAgZGVmIGMyID0gLWMKKyAgICAgICAgYXNzZXJ0IGMyLmRlbGVnYXRlID09IERBUktfR1JBWQorICAgICAgICBhc3NlcnQgKCtjKS5kZWxlZ2F0ZSA9PSBXSElURQorICAgICAgICB1c2UoTXlDb2xvckNhdGVnb3J5KSB7CisgICAgICAgICAgICBhc3NlcnQgKH5jMikuZGVsZWdhdGUgPT0gTElHSFRfR1JBWQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9vcGVyYXRvci9OZWdhdGVMaXN0c1Rlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9vcGVyYXRvci9OZWdhdGVMaXN0c1Rlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhOGQwYzEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L29wZXJhdG9yL05lZ2F0ZUxpc3RzVGVzdC5ncm9vdnkKQEAgLTAsMCArMSw3OSBAQAorcGFja2FnZSBncm9vdnkub3BlcmF0b3IKKworLyoqIAorICogVGVzdCB0byBuZWdhdGUgbGlzdHMgaW4gQ2xhc3NpYyBHcm9vdnkuCisgKiBUZXN0IHRvIGNoZWNrIHdoZXRoZXIgYSBnaXZlbiBmdW5jdGlvbiBpcyBldmVuL29kZCBvbiBhIGdpdmVuIGRvbWFpbi4KKyAqIAorICogQGF1dGhvciBQaWxobyBLaW0KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworY2xhc3MgTmVnYXRlTGlzdHNUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCB0ZXN0TmVnYXRlTGlzdCgpIHsKKyAgICAgICAgYXNzZXJ0IC1bMSwgMiwgM10gPT0gWy0xLCAtMiwgLTNdCisKKyAgICAgICAgZGVmIHggPSBbMSwgMiwgM10KKyAgICAgICAgYXNzZXJ0IC14ID09IFstMSwgLTIsIC0zXQorICAgICAgICBhc3NlcnQgeCA9PSAtWy0xLCAtMiwgLTNdCisgICAgICAgIGFzc2VydCAtKC14KSA9PSB4CisKKyAgICAgICAgZGVmIHkgPSBbLTEsIC0yLCAtM10KKyAgICAgICAgYXNzZXJ0IC14ID09IHkKKyAgICAgICAgYXNzZXJ0IHggPT0gLXkKKyAgICB9CisKKyAgICB2b2lkIHRlc3RCaXR3aXNlTmVnYXRlTGlzdCgpIHsKKyAgICAgICAgYXNzZXJ0IH5bMSwgMiwgM10gPT0gWy0yLCAtMywgLTRdCisKKyAgICAgICAgZGVmIHggPSBbMSwgMiwgM10KKyAgICAgICAgYXNzZXJ0IH54ID09IFstMiwgLTMsIC00XQorICAgICAgICBhc3NlcnQgeCA9PSB+Wy0yLCAtMywgLTRdCisgICAgICAgIGFzc2VydCB+fnggPT0geAorICAgICAgICBhc3NlcnQgfih+eCkgPT0geAorCisgICAgICAgIGRlZiB5ID0gWy0yLCAtMywgLTRdCisgICAgICAgIGFzc2VydCB+eCA9PSBbLTIsIC0zLCAtNF0KKyAgICAgICAgYXNzZXJ0IHggPT0gfnkKKyAgICB9CisKKyAgICB2b2lkIHRlc3RFdmVuRnVuY3Rpb24oKSB7CisgICAgICAgIGRlZiBQSSA9IE1hdGguUEkKKworICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgLy8gQSBjYXNlIG9mIHBhcnRpdGlvbiBoYXZpbmcgMTAgc3ViaW50ZXJ2YWxzLgorICAgICAgICAvLyB4ID0gWzAuMCpQSS8yLCAwLjEqUEkvMiwgMC4yKlBJLzIsIDAuMypQSS8yLCAwLjQqUEkvMiwgMC41KlBJLzIsIAorICAgICAgICAvLyAgICAgICAgICAgICAgIDAuNipQSS8yLCAwLjcqUEkvMiwgMC44KlBJLzIsIDAuOSpQSS8yLCAxLjAqUEkvMl0KKworICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgLy8gR2VuZXJhdGUgYSBkb21haW4gb2YgZnVuY3Rpb24gdXNlZCBvbSB0ZXN0aW5nLgorICAgICAgICBkZWYgbiA9IDEwMDAgICAgLy8gdGhlIG51bWJlciBvZiBwYXJ0aXRpb25zIGZvciB0aGUgaW50ZXJ2YWwgMC4uMi9QSQorICAgICAgICBkZWYgeCA9IFtdCisgICAgICAgIGZvciAoaSBpbiAwLi5uKSB7CisgICAgICAgICAgICB4IDw8IGkqUEkvbgorICAgICAgICB9CisgICAgICAgIC8vIHByaW50bG4geAorCisgICAgICAgIGRlZiBjb3MgPSB7IE1hdGguY29zKGl0KSB9CisgICAgICAgIGFzc2VydFRydWUoaXNFdmVuRm4oY29zLCB4KSkKKworICAgICAgICBkZWYgc2luID0geyBNYXRoLnNpbihpdCkgfQorICAgICAgICBhc3NlcnRUcnVlKGlzT2RkRm4oc2luLCB4KSkKKworICAgICAgICBkZWYgdGFuID0geyBNYXRoLnRhbihpdCkgfQorICAgICAgICBhc3NlcnRUcnVlKGlzT2RkRm4odGFuLCB4KSkKKyAgICB9CisKKyAgICBib29sZWFuIGlzRXZlbkZuKGYsIGRvbWFpbikgeworICAgICAgICAvLyBwcmludGxuIGRvbWFpbi5jb2xsZWN0KGYpCisgICAgICAgIC8vIHByaW50bG4oICgtZG9tYWluKS5jb2xsZWN0KGYpICkKKyAgICAgICAgcHJpbnRsbiggKGRvbWFpbi5jb2xsZWN0KGYpKSA9PSAoKC1kb21haW4pLmNvbGxlY3QoZikpICkKKyAgICAgICAgcmV0dXJuIChkb21haW4uY29sbGVjdChmKSkgPT0gKCgtZG9tYWluKS5jb2xsZWN0KGYpKQorICAgIH0KKworICAgIGJvb2xlYW4gaXNPZGRGbihmLCBkb21haW4pIHsKKyAgICAgICAgLy8gcHJpbnRsbiBkb21haW4uY29sbGVjdChmKQorICAgICAgICAvLyBwcmludGxuKCAgKC1kb21haW4pLmNvbGxlY3QoZikgKQorICAgICAgICBwcmludGxuKCBkb21haW4uY29sbGVjdChmKSA9PSAtKCgtZG9tYWluKS5jb2xsZWN0KGYpKSApCisgICAgICAgIHJldHVybiBkb21haW4uY29sbGVjdChmKSA9PSAtKCgtZG9tYWluKS5jb2xsZWN0KGYpKQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L29wZXJhdG9yL1Bvd2VyT3BlcmF0b3JzVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L29wZXJhdG9yL1Bvd2VyT3BlcmF0b3JzVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZlNTYwMQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvb3BlcmF0b3IvUG93ZXJPcGVyYXRvcnNUZXN0Lmdyb292eQpAQCAtMCwwICsxLDc0IEBACitwYWNrYWdlIGdyb292eS5vcGVyYXRvcgorCisvKiogCisgKiBUZXN0IE1hdGggUG93ZXIgT3BlcmF0aW9uIGluIENsYXNzaWMvTmV3IEdyb292eQorICogCisgKiBAYXV0aG9yIFBpbGhvIEtpbQorICogQHZlcnNpb24gJFJldmlzaW9uOiA0OTk2ICQKKyAqLworY2xhc3MgUG93ZXJPcGVyYXRvcnNUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCB0ZXN0Q29uc3RhbnRQb3dlck9wZXJhdGlvbigpIHsKKyAgICAgICAgYXNzZXJ0IDIqKjUgPT0gMzIKKyAgICAgICAgYXNzZXJ0IC0yKio1ID09IC0zMgorICAgICAgICBhc3NlcnQgMyoqNCA9PSA4MQorICAgICAgICBhc3NlcnQgLTMqKjQgPT0gLTgxCisgICAgICAgIGFzc2VydCAzKiotNCA9PSAzLnBvd2VyKC00KQorICAgICAgICBhc3NlcnQgLTMqKi00ID09IC0zLnBvd2VyKC00KQorICAgICAgICBhc3NlcnQgNyoqMiAtIDcqMyArIDIgPT0gMzAgICAgICAgICAvLyAgNDkgLSAyMSArIDIgPSAzMAorICAgICAgICBhc3NlcnQgLTcqKjIgLSA3KjMgKyAyID09IC02OCAgICAgICAvLyAtNDkgLSAyMSArIDIgPSAtNjgKKyAgICAgICAgYXNzZXJ0IC0oNyoqMikgLSA3KjMgKyAyID09IC02OCAgICAgLy8gLTQ5IC0gMjEgKyAyID0gLTY4CisgICAgICAgIGFzc2VydCAoLTcpKioyIC0gNyozICsgMiA9PSAzMCAgICAgLy8gIDQ5IC0gMjEgKyAyID0gMzAKKyAgICB9CisKKyAgICB2b2lkIHRlc3RQb3dlck9wZXJhdGlvbigpIHsKKyAgICAgICAgZGVmIHggPSA5CisgICAgICAgIC0teAorICAgICAgICBhc3NlcnQgeCA9PSA4CisgICAgICAgIHByaW50bG4oLS14KQorICAgICAgICBhc3NlcnQgeCA9PSA3CisgICAgICAgIHByaW50bG4oLS14KQorICAgICAgICBhc3NlcnQgeCA9PSA2CisgICAgICAgIHByaW50bG4oKC0teCkqKjMpCisgICAgICAgIGFzc2VydCB4ID09IDUKKyAgICAgICAgYXNzZXJ0ICgtLXgpKiozID09IDY0CisgICAgICAgIGFzc2VydCAoLXgqKjMpID09IC02NAorICAgICAgICBhc3NlcnQgeCA9PSA0CisgICAgICAgIGFzc2VydCAoKyt4KSoqMyA9PSAxMjUKKyAgICAgICAgYXNzZXJ0IHggPT0gNQorICAgICAgICBhc3NlcnQgKHgrKykqKjMgPT0gMTI1CisgICAgICAgIGFzc2VydCB4ID09IDYKKyAgICAgICAgcHJpbnRsbigoeCsrKSoqMykKKyAgICAgICAgYXNzZXJ0IHggPT0gNworICAgICAgICBwcmludGxuKHgpCisgICAgICAgIHByaW50bG4oIiR7eCoqMn0iKQorICAgICAgICBwcmludGxuKCIkey14KioyfSIpCisgICAgICAgIGFzc2VydCB4ID09IDcKKyAgICAgICAgcHJpbnRsbigiJHsoLS14KSoqMn0iKQorICAgICAgICBhc3NlcnQgeCA9PSA2CisgICAgICAgIGFzc2VydCAoLS14KSoqMiArIHgqMiAtIDEgPT0gMzQgICAgICAvLyA1KioyICsgNSoyIC0gMSA9IDM0CisgICAgICAgIGFzc2VydCB4ID09IDUKKyAgICAgICAgYXNzZXJ0ICh4LS0pKioyICsgeCoyIC0gMSA9PSAzMiAgICAgIC8vIDUqKjIgKyA0KjIgLSAxID0gMzIKKyAgICAgICAgYXNzZXJ0IHggPT0gNAorICAgIH0KKworICAgIHZvaWQgdGVzdENvbnN0YW50UG93ZXJBc3NpZ25tZW50T3BlcmF0aW9uKCkgeworICAgICAgICBkZWYgeCA9IDUKKyAgICAgICAgeCAqKj0gMgorICAgICAgICBhc3NlcnQgeCA9PSAyNQorICAgICAgICBhc3NlcnQgeCoqMiA9PSA2MjUKKyAgICAgICAgYXNzZXJ0IC14KioyICE9IDYyNQorICAgICAgICBhc3NlcnQgLXgqKjIgPT0gLTYyNQorICAgIH0KKworICAgIHZvaWQgdGVzdFBvd2VyQXNzaWdubWVudE9wZXJhdGlvbigpIHsKKyAgICAgICAgZGVmIHggPSA1CisgICAgICAgIGRlZiB5ID0gMgorICAgICAgICB4ICoqPSB5CisgICAgICAgIGFzc2VydCB4ID09IDI1CisgICAgICAgIGFzc2VydCB4Kip5ID09IDYyNQorICAgICAgICBhc3NlcnQgeCoqLTEgPT0gMS8yNQorICAgICAgICBhc3NlcnQgeCoqLXkgPT0gMS82MjUKKyAgICAgICAgYXNzZXJ0IHgqKi15ID09IHgqKigteSkKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9vcGVyYXRvci9TcHJlYWRMaXN0T3BlcmF0b3JUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvb3BlcmF0b3IvU3ByZWFkTGlzdE9wZXJhdG9yVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBlYTliNQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvb3BlcmF0b3IvU3ByZWFkTGlzdE9wZXJhdG9yVGVzdC5ncm9vdnkKQEAgLTAsMCArMSw2NCBAQAorcGFja2FnZSBncm9vdnkub3BlcmF0b3IKKworLyoqCisgKiBAdmVyc2lvbiAkUmV2aXNpb246IDQ5OTYgJAorICoKKyAqIDxjb2RlPlsyLCAzXS50b1NwcmVhZExpc3QoKSBlcXVhbHMgdG8gKlsyLCAzXTwvY29kZT4gPGJyPjxicj4KKyAqCisgKiBGb3IgYW4gZXhhbXBsZSwgPHByZT4KKyAqICAgICAgICBhc3NlcnQgWzEsICpbMiwgM10sIDRdID09IFsxLCAyLCAzLCA0XQorICogPC9wcmU+CisgKgorICogQGF1dGhvciBQaWxobyBLaW0KKyAqIEBhdXRob3IgSm9jaGVuIFRoZW9kb3JvdQorICovCisKK2NsYXNzIFNwcmVhZExpc3RPcGVyYXRvclRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICB2b2lkIHRlc3RTcHJlYWRpbmdJbkxpc3QoKSB7CisgICAgICAgIHByaW50bG4oWzEsICpbMjIyLCAzMzNdLCA0NTZdKQorCisgICAgICAgIGFzc2VydCBbMSwgKlsyMjIsIDMzM10sIDQ1Nl0gPT0gWzEsIDIyMiwgMzMzLCA0NTZdCisKKyAgICAgICAgZGVmIHkgPSBbMSwyLDNdCisKKyAgICAgICAgYXNzZXJ0IFsqeV0gPT0geQorICAgIH0KKworICAgIHZvaWQgdGVzdFNwcmVhZGluZ1JhbmdlKCkgeworICAgICAgICBkZWYgciA9IDEuLjEwCisKKyAgICAgICAgYXNzZXJ0IFsqcl0gPT0gcgorICAgICAgICBhc3NlcnQgWyoxLi4xMF0gPT0gcgorCisgICAgfQorCisgICAgdm9pZCB0ZXN0U3ByZWFkaW5nSW5NZXRob2RQYXJhbWV0ZXJzKCkgeworICAgICAgICBhc3NlcnQgc3VtKDEsICpbMiwgM10sIDQpID09IDEwCisgICAgICAgIGFzc2VydCBzdW0oKlsxMCwgMjAsIDMwLCA0MF0pID09IDEwMAorCisgICAgICAgIGRlZiB6ID0gWzExLCAyMiwgMzNdCisKKyAgICAgICAgYXNzZXJ0IHN1bSgxLCAqeikgPT0gNjcKKworICAgICAgICBhc3NlcnQgc3VtKCp6LCAyKSA9PSA2OAorCisgICAgICAgIGFzc2VydCBzdW0oKnosIDQ0KSA9PSAxMTAKKworICAgICAgICBkZWYgeCA9IFsiZm9vIiwgIkJhci0iXQorCisgICAgICAgIGFzc2VydCBzdW0oKngsICp4KSA9PSAiZm9vQmFyLWZvb0Jhci0iCisgICAgfQorCisgICAgZGVmIHN1bShhLCBiLCBjLCBkKSB7CisgICAgICAgIHJldHVybiBhICsgYiArIGMgKyBkCisgICAgfQorCisgICAgdm9pZCB0ZXN0U3ByZWFkaW5nSW5DbG9zdXJlUGFyYW1ldGVycygpIHsKKyAgICAgICAgZGVmIHR3aWNlID0ge2l0KjJ9CisgICAgICAgIGFzc2VydCB0d2ljZSgzKSA9PSA2CisgICAgICAgIGFzc2VydCB0d2ljZSgiYWJjZCIpID09ICdhYmNkYWJjZCcKKworICAgICAgICBhc3NlcnQgdHdpY2UoKlsxMV0pID09IDIyCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9vcGVyYXRvci9TcHJlYWRNYXBPcGVyYXRvclRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9vcGVyYXRvci9TcHJlYWRNYXBPcGVyYXRvclRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZGFjNmQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L29wZXJhdG9yL1NwcmVhZE1hcE9wZXJhdG9yVGVzdC5ncm9vdnkKQEAgLTAsMCArMSw5OCBAQAorcGFja2FnZSBncm9vdnkub3BlcmF0b3IKKworLyoqCisgKiBUZXN0IHRoZSBzcHJlYWQgbWFwIG9wZXJhdG9yICIqOiIuCisgKgorICogICBGb3IgYW4gZXhhbXBsZSwKKyAqICAgICAgICAgICAgbSA9IFsnYSc6MTEsICdhYSc6MjIsICdhYWEnOjMzXQorICogICAgICAgICAgICB6ID0gWydjJzoxMDAsICo6bV0KKyAqCisgKiAgICAgICAgICAgIG0gPSBbJ2EnOjExLCAnYWEnOjIyLCAnYWFhJzozM10KKyAqICAgICAgICAgICAgdyA9IFsnYyc6MTAwXQorICogICAgICAgICAgICBtLmVhY2gge3dbaXQua2V5XSA9IGl0LnZhbHVlIH0KKyAqCisgKiAgICAgICAgICAgIGFzc2VydCB6ID09IHcKKyAqCisgKiBAYXV0aG9yIFBpbGhvIEtpbQorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCisKK3B1YmxpYyBjbGFzcyBTcHJlYWRNYXBPcGVyYXRvclRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisgICAgZGVmIGYobSkgeworICAgICAgICBwcmludGxuIG0uYworICAgIH0KKworICAgIGRlZiBmdW5jKG0sIGksIGosIGspIHsKKyAgICAgICAgLy8gVGhlIGZpcnN0IGFyZ3VtZW50IG0gaXMgYSBtYXAuCisgICAgICAgIHByaW50bG4gbQorICAgICAgICBwcmludGxuIGkKKyAgICAgICAgcHJpbnRsbiBqCisgICAgICAgIHByaW50bG4gaworICAgIH0KKworICAgIGRlZiBmbigpIHsKKyAgICAgICAgcmV0dXJuIFsgMTonZWluJywgMjonendlaScsIDM6J2RyZWknIF0KKyAgICB9CisKKyAgICB2b2lkIHRlc3RTcHJlYWRNYXAoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBkZWYgbSA9IFsiYSI6MTAwLCAiYiI6MjAwXQorICAgICAgICAgICAgZGVmIHggPSBbJ3R0Jzo1NSwgKjptXQorICAgICAgICAgICAgcHJpbnRsbiB4LnNpemUoKQorICAgICAgICAgICAgcHJpbnRsbiB4CisgICAgICAgICAgICB4ID0gWyd0dCc6NTUsICd5eSc6NzddCisgICAgICAgICAgICBwcmludGxuIHgKKyAgICAgICAgICAgIHggPSBbKjptLCAqOm1dCisgICAgICAgICAgICBwcmludGxuIHgKKyAgICAgICAgICAgIGFzc2VydCB4ID09IG0KKworICAgICAgICAgICAgeCA9IFsqOngsICo6Zm4oKSwgMTAwOidodW5kcmVkJ10KKyAgICAgICAgICAgIHByaW50bG4geAorICAgICAgICAgICAgcHJpbnRsbih4LmdldENsYXNzKCkpCisgICAgICAgICAgICBhc3NlcnQgeCBpbnN0YW5jZW9mIE1hcAorCisgICAgICAgICAgICBkZWYgeSA9IFsxOjEsIDI6MiwgKjpbMzozLCA0OjQsICo6WzU6NV0sIDY6Nl0sIDc6N10KKyAgICAgICAgICAgIHByaW50bG4geQorICAgICAgICAgICAgcHJpbnRsbih5LmdldENsYXNzKCkpCisgICAgICAgICAgICBhc3NlcnQgeSA9PSBbMToxLCAyOjIsIDM6MywgNDo0LCA1OjUsIDY6NiwgNzo3XQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKQorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCB0ZXN0U3ByZWFkTWFwVnNXaXRoQ2xvc3VyZSgpIHsKKyAgICAgICAgZGVmIG0gPSBbJ2EnOjExLCAnYWEnOjIyLCAnYWFhJzozM10KKyAgICAgICAgZGVmIHogPSBbJ2MnOjEwMCwgKjptXQorIAorICAgICAgICBkZWYgdyA9IFsnYyc6MTAwXQorICAgICAgICBtLmVhY2ggeyB3W2l0LmtleV0gPSBpdC52YWx1ZSB9CisKKyAgICAgICAgcHJpbnRsbiB6IAorICAgICAgICBwcmludGxuIHcgCisgICAgICAgIGFzc2VydCB6ID09IHcKKworICAgICAgICBkZWYgejIgPSBbKjptLCAnYyc6MTAwXQorICAgICAgICBkZWYgdzIgPSBtCisgICAgICAgIHcyWydjJ10gPSAxMDAKKyAgICAgICAgcHJpbnRsbiB6MiAKKyAgICAgICAgcHJpbnRsbiB3MiAKKyAgICAgICAgYXNzZXJ0IHoyID09IHcyCisgICAgICAgIGFzc2VydCB6ID09IHoyCisgICAgICAgIGFzc2VydCB3ID09IHcyCisgICAgfQorCisgICAgdm9pZCB0ZXN0U3ByZWFkTWFwRnVuY3Rpb25DYWxsKCkgeworICAgICAgICAgICAgIGRlZiBtID0gWydhJzoxMCwgJ2InOjIwLCAnYyc6MzBdCisgICAgICAgICAgICAgZigqOm0pICAgICAgICAgICAgICAgICAvLyBDYWxsIHdpdGggb25seSBvbmUgc3ByZWFkIG1hcCBhcmd1bWVudAorICAgICAgICAgICAgIGYoKjptLCAnZSc6NTApICAgICAgLy8gQ2FsbCB3aXRoIG9uZSBzcHJlYWQgbWFwIGFyZ3VtZW50IGFuZCBvbmUgbmFtZWQgYXJndW1lbnQKKyAgICAgICAgICAgICBmKCdlJzoxMDAsICo6bSkgICAgIC8vIENhbGwgd2l0aCBvbmUgbmFtZWQgYXJndW1lbnQgYW5kIG9uZSBzcHJlYWQgbWFwIGFyZ3VtZW50CisKKyAgICAgICAgICAgICBmdW5jKCdlJzoxMDAsIDEsIDIsIDMsICo6bSkgICAgICAgLy8gQ2FsbCB3aXRoIG9uZSBuYW1lZCBhcmd1bWVudCwgdGhyZWUgdXN1YWwgYXJndW1lbnRzLCAgYW5kIG9uZSBzcHJlYWQgbWFwIGFyZ3VtZW50CisKKyAgICAgICAgICAgICBkZWYgbCA9IFs0LCA1XQorICAgICAgICAgICAgIGZ1bmMoJ2UnOjEwMCwgKmwsICo6bSwgNikgICAgICAgLy8gQ2FsbCB3aXRoIG9uZSBuYW1lZCBhcmd1bWVudCwgb25lIHNwcmVhZCBsaXN0IGFyZ3VtZW50LCBvbmUgc3ByZWFkIG1hcCBhcmd1bWVudCwgYW5kICBvbmUgdXN1YWwgYXJndW1lbnQKKyAgICAgICAgICAgICBmdW5jKDcsICdlJzoxMDAsICpsLCAqOm0pICAgICAgIC8vIENhbGwgd2l0aCBvbmUgdXN1YWwgYXJndW1lbnQsIG9uZSBuYW1lZCBhcmd1bWVudCwgb25lIHNwcmVhZCBsaXN0IGFyZ3VtZW50LCBhbmQgb25lIHNwcmVhZCBtYXAgYXJndW1lbnQgCisgICAgfQorfQorCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L29wZXJhdG9yL1N0cmluZ09wZXJhdG9yc1Rlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9vcGVyYXRvci9TdHJpbmdPcGVyYXRvcnNUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjcxYmI2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9vcGVyYXRvci9TdHJpbmdPcGVyYXRvcnNUZXN0Lmdyb292eQpAQCAtMCwwICsxLDQzIEBACitwYWNrYWdlIGdyb292eS5vcGVyYXRvcgorCitjbGFzcyBTdHJpbmdPcGVyYXRvcnNUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgZGVmIHgKKyAgICBkZWYgeQorICAgIAorICAgIHZvaWQgdGVzdFBsdXMoKSB7CisgICAgICAgIHggPSAiaGVsbG8gIiArICJ0aGVyZSIKKyAgICAgICAgYXNzZXJ0IHggPT0gImhlbGxvIHRoZXJlIgorICAgICAgICAKKyAgICAgICAgeCA9ICJoZWxsbyAiICsgMgorICAgICAgICBhc3NlcnQgeCA9PSAiaGVsbG8gMiIKKyAgICAgICAgCisgICAgICAgIHggPSAiaGVsbG8gIiArIDEuMgorICAgICAgICBhc3NlcnQgeCA9PSAiaGVsbG8gMS4yIgorICAgICAgICAKKyAgICAgICAgeSA9IHggKyAxCisgICAgICAgIGFzc2VydCB5ID09ICJoZWxsbyAxLjIxIiAgICAgICAgCisgICAgfQorCisJdm9pZCB0ZXN0TG9uZ1BsdXMoKSB7CisJICAgIHggPSAiaGVsbG8iICsgIiAiICsgInRoZXJlIiArICIgbmljZSIgKyAiIGRheSIKKwkgICAgCisJICAgIGFzc2VydCB4ID09ICJoZWxsbyB0aGVyZSBuaWNlIGRheSIKKwl9CisJCisgICAgdm9pZCB0ZXN0TWludXMoKSB7CisJCXggPSAidGhlIHF1aWNrIGJyb3duIGZveCIgLSAicXVpY2sgIgorCQkKKwkJYXNzZXJ0IHggPT0gInRoZSBicm93biBmb3giCisJCQorCQl5ID0geCAtICJicm93biAiCisJCQorCQlhc3NlcnQgeSA9PSAidGhlIGZveCIKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0T3BlcmF0aW9uc09uQ29uc3RhbnRTdHJpbmcoKSB7CisgICAgICAgIGFzc2VydCAiaGVsbG8iLnNpemUoKSA9PSA1CisKKyAgICAgICAgYXNzZXJ0ICJ0aGUgcXVpY2sgYnJvd24iLnN1YnN0cmluZyg0KS5zdWJzdHJpbmcoMCw1KSA9PSAicXVpY2siCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9vcGVyYXRvci9UZXJuYXJ5T3BlcmF0b3JzVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L29wZXJhdG9yL1Rlcm5hcnlPcGVyYXRvcnNUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2VlY2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9vcGVyYXRvci9UZXJuYXJ5T3BlcmF0b3JzVGVzdC5ncm9vdnkKQEAgLTAsMCArMSw2NCBAQAorcGFja2FnZSBncm9vdnkub3BlcmF0b3IKKworY2xhc3MgVGVybmFyeU9wZXJhdG9yc1Rlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICB2b2lkIHRlc3RTaW1wbGVVc2UoKSB7CisgICAgICAgIGRlZiB5ID0gNQorCisgICAgICAgIGRlZiB4ID0gKHkgPiAxKSA/ICJ3b3JrZWQiIDogImZhaWxlZCIKKyAgICAgICAgYXNzZXJ0IHggPT0gIndvcmtlZCIKKworCisgICAgICAgIHggPSAoeSA8IDQpID8gImZhaWxlZCIgOiAid29ya2VkIgorICAgICAgICBhc3NlcnQgeCA9PSAid29ya2VkIgorICAgIH0KKworICAgIHZvaWQgdGVzdFVzZUluUGFyYW1ldGVyQ2FsbGluZygpIHsKKyAgICAgICAgZGVmIHogPSAxMjMKKyAgICAgICAgYXNzZXJ0Q2FsbGVkV2l0aEZvbyh6ID4gMTAwID8gImZvbyIgOiAiYmFyIikKKyAgICAgICAgYXNzZXJ0Q2FsbGVkV2l0aEZvbyh6IDwgMTAwID8gImJhciIgOiAiZm9vIikKKyAgICAgICB9CisKKyAgICBkZWYgYXNzZXJ0Q2FsbGVkV2l0aEZvbyhwYXJhbSkgeworICAgICAgICBwcmludGxuICJjYWxsZWQgd2l0aCBwYXJhbSAke3BhcmFtfSIKKyAgICAgICAgYXNzZXJ0IHBhcmFtID09ICJmb28iCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdFdpdGhCb29sZWFuKCl7CisgICAgICAgIGRlZiBhID0gMQorICAgICAgICBkZWYgeCA9IGEhPW51bGwgPyBhIT0yIDogYSE9MQorICAgICAgICBhc3NlcnQgeCA9PSB0cnVlCisgICAgICAgIGRlZiB5ID0gYSE9MSA/IGEhPTIgOiBhIT0xCisgICAgICAgIGFzc2VydCB5ID09IGZhbHNlCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdEVsdmlzT3BlcmF0b3IoKSB7CisgICAgICAgIGRlZiBhID0gMQorICAgICAgICBkZWYgeCA9IGE/OjIKKyAgICAgICAgYXNzZXJ0IHg9PWEKKyAgICAgICAgCisgICAgICAgIGEgPSBudWxsCisgICAgICAgIHggPSBhPzoyCisgICAgICAgIGFzc2VydCB4PT0yCisgICAgICAgIAorICAgICAgICBkZWYgbGlzdCA9IFsnYScsJ2InLCdjJ10KKyAgICAgICAgZGVmIGluZGV4ID0gMAorICAgICAgICBkZWYgcmV0ID0gbGlzdFtpbmRleCsrXT86InNvbWV0aGluZyBlbHNlIgorICAgICAgICBhc3NlcnQgaW5kZXg9PTEKKyAgICAgICAgYXNzZXJ0IHJldD09J2EnCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdEZvclR5cGUoKSB7CisgICAgICAgIGJvb2xlYW4gYiA9IGZhbHNlCisgICAgICAgIGludCBhbkludCA9IGIgPyAxMDAgOiAxMDAgLyAzCisgICAgICAgIGFzc2VydCBhbkludC5jbGFzcyA9PSBJbnRlZ2VyCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdEJ5dGVjb2RlUmVnaXN0ZXJzKCkgeworICAgICAgICAvLyB0aGlzIGNvZGUgd2lsbCBibG93IHVwIGlmIHRoZSB0cnVlIGFuZCBmYWxzZSBwYXJ0cworICAgICAgICAvLyBhcmUgbm90IGhhbmRsZWQgY29ycmVjdGx5IGluIHJlZ2FyZHMgdG8gdGhlIHJlZ2lzdGVycy4KKyAgICAgICAgZGVmIGkgPSAxCisgICAgICAgIGRlZiBjPSB7IGZhbHNlPyB7IGkgfSA6IGl0ID09IGkgfQorICAgICAgICBhc3NlcnQgdHJ1ZQorICAgIH0KK30gICAKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvb3BlcmF0b3IvVW5hcnlNaW51c051bWJlclRlc3RzLmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvb3BlcmF0b3IvVW5hcnlNaW51c051bWJlclRlc3RzLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODYyNWE3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9vcGVyYXRvci9VbmFyeU1pbnVzTnVtYmVyVGVzdHMuZ3Jvb3Z5CkBAIC0wLDAgKzEsMjcgQEAKK3BhY2thZ2UgZ3Jvb3Z5Lm9wZXJhdG9yCisKK2NsYXNzIFVuYXJ5TWludXNOdW1iZXJUZXN0cyBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIHZvaWQgdGVzdE5lZ2F0ZUludGVnZXIoKSB7CisgICAgICAgIGRlZiBhID0gLTEKKyAgICAgICAgYXNzZXJ0IGEgPT0gLTEKKyAgICB9CisKKyAgICB2b2lkIHRlc3ROZWdhdGVJbnRlZ2VyRXhwcmVzc2lvbigpIHsKKyAgICAgICAgZGVmIGEgPSAtMQorICAgICAgICBhID0gLWEKKyAgICAgICAgYXNzZXJ0IGEgPT0gMQorICAgIH0KKworICAgIHZvaWQgdGVzdE5lZ2F0ZURvdWJsZSgpIHsKKyAgICAgICAgZGVmIGEgPSAtMS4wCisgICAgICAgIGFzc2VydCBhID09IC0xLjAKKyAgICB9CisKKyAgICB2b2lkIHRlc3ROZWdhdGVEb3VibGVFeHByZXNzaW9uKCkgeworICAgICAgICBkZWYgYSA9IC0xLjAKKyAgICAgICAgYSA9IC1hCisgICAgICAgIGFzc2VydCBhID09IDEuMAorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9vcGVyYXRvci9VbmFyeU1pbnVzT3BlcmF0b3JUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvb3BlcmF0b3IvVW5hcnlNaW51c09wZXJhdG9yVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc4ZDRhOAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvb3BlcmF0b3IvVW5hcnlNaW51c09wZXJhdG9yVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwzMSBAQAorcGFja2FnZSBncm9vdnkub3BlcmF0b3IKKworY2xhc3MgVW5hcnlNaW51c09wZXJhdG9yVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIHZvaWQgdGVzdFVuYXJ5TWludXMoKSB7CisgICAgICAgIGRlZiB2YWx1ZSA9IC0xCisgICAgICAgIAorICAgICAgICBhc3NlcnQgdmFsdWUgPT0gLTEKKyAgICAgICAgCisgICAgICAgIGRlZiB4ID0gdmFsdWUgKyAyCisgICAgICAgIGFzc2VydCB4ID09IDEKKyAgICAgICAgCisgICAgICAgIGRlZiB5ID0gLXZhbHVlCisgICAgICAgIGFzc2VydCB5ID09IDEKKyAgICB9ICAgCisgICAgCisgICAgdm9pZCB0ZXN0QnVnKCkgeworICAgICAgICBkZWYgYSA9IDEKKyAgICAgICAgZGVmIGIgPSAtYQorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IGIgPT0gLTEKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0U2hlbGxCdWcoKSB7CisgICAgICAgIGFzc2VydFNjcmlwdCgiIiIKK2RlZiBhID0gMQorZGVmIGIgPSAtYQorYXNzZXJ0IGIgPT0gLTEgICAgICAgICAgICAKKyIiIikKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9ydW50aW1lL21ldGFjbGFzcy9ncm9vdnkvYnVncy9DdXN0b21NZXRhQ2xhc3NUZXN0TWV0YUNsYXNzLmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvcnVudGltZS9tZXRhY2xhc3MvZ3Jvb3Z5L2J1Z3MvQ3VzdG9tTWV0YUNsYXNzVGVzdE1ldGFDbGFzcy5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNjMDcyZQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvcnVudGltZS9tZXRhY2xhc3MvZ3Jvb3Z5L2J1Z3MvQ3VzdG9tTWV0YUNsYXNzVGVzdE1ldGFDbGFzcy5ncm9vdnkKQEAgLTAsMCArMSw3IEBACitwYWNrYWdlIGdyb292eS5ydW50aW1lLm1ldGFjbGFzcy5ncm9vdnkuYnVncworCitjbGFzcyBDdXN0b21NZXRhQ2xhc3NUZXN0TWV0YUNsYXNzIGV4dGVuZHMgZ3Jvb3Z5LmxhbmcuRGVsZWdhdGluZ01ldGFDbGFzcyB7CisgIEN1c3RvbU1ldGFDbGFzc1Rlc3RNZXRhQ2xhc3MoIGZpbmFsIE1ldGFDbGFzcyBtZXRhQ2xhenogKXsKKyAgICAgc3VwZXIoIG1ldGFDbGF6eiApCisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3NjcmlwdC9BdG9tVGVzdFNjcmlwdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3NjcmlwdC9BdG9tVGVzdFNjcmlwdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhhZjU4MQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvc2NyaXB0L0F0b21UZXN0U2NyaXB0Lmdyb292eQpAQCAtMCwwICsxLDcxIEBACitwYWNrYWdlIGdyb292eS5zY3JpcHQKKworaW1wb3J0IGdyb292eS54bWwuTWFya3VwQnVpbGRlcjsKKworLyoqIG5vdGUgeW91IGNvdWxkIHVzZSBFeHBhbmRvIGNsYXNzZXMgaWYgeW91IGRvbid0IG1pbmQgYmVpbmcgZHluYW1pY2FsbHkgdHlwZWQgCitmID0gbmV3IEV4cGFuZG8oKQorCitmLmF1dGhvciA9IG5ldyBFeHBhbmRvKG5hbWU6J1RlZCBMZXVuZycsdXJsOidodHRwOi8vd3d3LnNhdXJpYS5jb20vYmxvZycsIGVtYWlsOid0d2xAc2F1cmlhLmNvbScpCisKK2YuZW50cmllcyA9IFsgbmV3IEV4cGFuZG8odGl0bGU6J29uZScsc3VtbWFyeTonZmlyc3QgcG9zdCcpLCBuZXcgRXhwYW5kbyh0aXRsZTondHdvJyxzdW1tYXJ5Oid0aGUgc2Vjb25kIHBvc3QnKSwgbmV3IEV4cGFuZG8odGl0bGU6J3RocmVlJywgc3VtbWFyeToncG9zdCB0aGUgdGhpcmQnKSwgbmV3IEV4cGFuZG8odGl0bGU6J2ZvdXInLHN1bW1hcnk6J3RoZSBwb25kZXJvdXMgZm91cnRoIHBvc3QnKSBdCisqLworCitmID0gbmV3IEZlZWQoKQorCitmLmF1dGhvciA9IG5ldyBQZXJzb24obmFtZTonVGVkIExldW5nJyx1cmw6J2h0dHA6Ly93d3cuc2F1cmlhLmNvbS9ibG9nJywgZW1haWw6J3R3bEBzYXVyaWEuY29tJykKKworZi5lbnRyaWVzID0gWyBuZXcgRW50cnkodGl0bGU6J29uZScsc3VtbWFyeTonZmlyc3QgcG9zdCcpLCBuZXcgRW50cnkodGl0bGU6J3R3bycsc3VtbWFyeTondGhlIHNlY29uZCBwb3N0JyksIG5ldyBFbnRyeSh0aXRsZTondGhyZWUnLCBzdW1tYXJ5Oidwb3N0IHRoZSB0aGlyZCcpLCBuZXcgRW50cnkodGl0bGU6J2ZvdXInLHN1bW1hcnk6J3RoZSBwb25kZXJvdXMgZm91cnRoIHBvc3QnKSBdCisKK2YuZW50cmllcy5lYWNoIHsgcHJpbnRsbiBpdC50aXRsZSB9CitwcmludGxuIGYuYXV0aG9yLm5hbWUKKworeG1sID0gbmV3IE1hcmt1cEJ1aWxkZXIoKQorCithdG9tID0geG1sLmF0b20oKSB7CisgIHRpdGxlKCJUZWQgTGV1bmcgb2ZmIHRoZSBhaXIiKQorICBsaW5rKCJodHRwOi8vd3d3LnNhdXJpYS5jb20vbm9ibG9nIikKKyAgYXV0aG9yKCkgeworICAgIHBlcnNvbigpIHsKKyAgICAgIG5hbWUoZi5hdXRob3IubmFtZSkKKyAgICAgIHVybChmLmF1dGhvci51cmwpCisgICAgICBlbWFpbChmLmF1dGhvci5lbWFpbCkKKyAgICB9CisgIH0KKworICBmb3IgKGUgaW4gZi5lbnRyaWVzKSB7CisgICAgZW50cnkoKSB7CisgICAgICB0aXRsZShlLnRpdGxlKQorICAgICAgc3VtbWFyeShlLnN1bW1hcnkpCisgICAgfQorICB9Cit9CisKKworY2xhc3MgRmVlZCB7CisgICAgU3RyaW5nIHRpdGxlCisgICAgU3RyaW5nIGxpbmsKKyAgICBQZXJzb24gYXV0aG9yCisgICAgU3RyaW5nIHRhZ2xpbmUKKyAgICBTdHJpbmcgZ2VuZXJhdG9yCisgICAgU3RyaW5nIGNvcHlyaWdodAorICAgIFN0cmluZyBtb2RpZmllZAorICAgIExpc3QgZW50cmllcworfQorCitjbGFzcyBFbnRyeSB7CisgICAgU3RyaW5nIHRpdGxlCisgICAgU3RyaW5nIGxpbmsKKyAgICBTdHJpbmcgaWQKKyAgICBTdHJpbmcgc3VtbWFyeQorICAgIFN0cmluZyBjb250ZW50CisgICAgUGVyc29uIGF1dGhvcgorICAgIFN0cmluZyBjcmVhdGVkCisgICAgU3RyaW5nIGlzc3VlZAorICAgIFN0cmluZyBtb2RpZmllZAorfQorCitjbGFzcyBQZXJzb24geworICAgIFN0cmluZyBuYW1lCisgICAgU3RyaW5nIHVybAorICAgIFN0cmluZyBlbWFpbAorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9zY3JpcHQvQ2FsbEFub3RoZXJTY3JpcHQuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9zY3JpcHQvQ2FsbEFub3RoZXJTY3JpcHQuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ZDkzMTcKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3NjcmlwdC9DYWxsQW5vdGhlclNjcmlwdC5ncm9vdnkKQEAgLTAsMCArMSw4IEBACitpbXBvcnQgamF2YS5pby5GaWxlCisKK3ByaW50bG4oIkFib3V0IHRvIGNhbGwgYW5vdGhlciBzY3JpcHQiKQorCitzY3JpcHQgPSBuZXcgR3Jvb3Z5U2hlbGwoKQorc2NyaXB0LnJ1bihuZXcgRmlsZSgic3JjL3Rlc3QvZ3Jvb3Z5L3NjcmlwdC9IZWxsb1dvcmxkLmdyb292eSIpLCBbXSkKKworcHJpbnRsbigiRG9uZSIpCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3NjcmlwdC9DbGFzc1dpdGhTY3JpcHQuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9zY3JpcHQvQ2xhc3NXaXRoU2NyaXB0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDc5OGJhCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9zY3JpcHQvQ2xhc3NXaXRoU2NyaXB0Lmdyb292eQpAQCAtMCwwICsxLDMgQEAKK2NsYXNzIFgge30KK3ggPSBuZXcgWCgpCitwcmludGxuKHgpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9zY3JpcHQvRXZhbEluU2NyaXB0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvc2NyaXB0L0V2YWxJblNjcmlwdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRkMzk0MAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvc2NyaXB0L0V2YWxJblNjcmlwdC5ncm9vdnkKQEAgLTAsMCArMSwxNCBAQAoraW1wb3J0IGphdmEuaW8uRmlsZQorCithID0gMQorZXZhbHVhdGUoImEgPSAzIikKK2Fzc2VydCBhID09IDMKKworcHJpbnRsbigiRG9uZSBhbmQgbm93IHNldCBhIHRvICR7YX0iKQorCisKK3ByaW50bG4oIkFib3V0IHRvIGNhbGwgYW5vdGhlciBzY3JpcHQiKQorCitldmFsdWF0ZShuZXcgRmlsZSgic3JjL3Rlc3QvZ3Jvb3Z5L3NjcmlwdC9IZWxsb1dvcmxkLmdyb292eSIpKQorCitwcmludGxuKCJEb25lIikKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvc2NyaXB0L0hlbGxvV29ybGQuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9zY3JpcHQvSGVsbG9Xb3JsZC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY4MTNhYgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvc2NyaXB0L0hlbGxvV29ybGQuZ3Jvb3Z5CkBAIC0wLDAgKzEsNCBAQAorCitwcmludGxuICJIZWxsbyB3b3JsZCIKKworCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3NjcmlwdC9IZWxsb1dvcmxkMi5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3NjcmlwdC9IZWxsb1dvcmxkMi5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA1NmVmMAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvc2NyaXB0L0hlbGxvV29ybGQyLmdyb292eQpAQCAtMCwwICsxLDQgQEAKKworeCA9IFsnSmFtZXMnLCAnQm9iJywgJ0JyaWFuJ10KK3guZWFjaCB7IHByaW50bG4oImhlbGxvICIgKyBpdCkgfQorCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3NjcmlwdC9NYXBGcm9tTGlzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3NjcmlwdC9NYXBGcm9tTGlzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NkOTRjOAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvc2NyaXB0L01hcEZyb21MaXN0Lmdyb292eQpAQCAtMCwwICsxLDI1IEBACitwYWNrYWdlIGdyb292eS5zY3JpcHQKKworY2xhc3MgTWFwRnJvbUxpc3QgeworICAgIHZvaWQgdGFsayhhKSB7CisgICAgICAgIHByaW50bG4oImhlbGxvICIrYSkKKyAgICB9CisKKyAgICB2b2lkIGRvaXQoYXJncykgeworICAgICAgICBkZWYgaSA9IDEKKyAgICAgICAgZGVmIGwgPSBbOl0KKyAgICAgICAgYXJncy5lYWNoIHsgCisJICAgIHRhbGsoaXQpCisJICAgIGwucHV0KGl0LGkrKykKKwkgICAgfQorICAgICAgICBsLmVhY2ggeworICAgICAgICAgICBwcmludGxuKGl0KQorICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgbWFpbihhcmdzKSB7CisgICAgICAgIGRlZiBhID0gWyd0b20nLCdkaWNrJywnaGFycnknXQorICAgICAgICBkZWYgdCA9IG5ldyBNYXBGcm9tTGlzdCgpCisgICAgICAgIHQuZG9pdChhKQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvc2NyaXB0L01hcmt1cFRlc3RTY3JpcHQuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9zY3JpcHQvTWFya3VwVGVzdFNjcmlwdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI0NTQ0OAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvc2NyaXB0L01hcmt1cFRlc3RTY3JpcHQuZ3Jvb3Z5CkBAIC0wLDAgKzEsMjIgQEAKK2ltcG9ydCBncm9vdnkueG1sLk1hcmt1cEJ1aWxkZXI7CisKK2NsYXNzIEJlYW4geworCVN0cmluZyBiCit9OworCit0ID0gbmV3IEJlYW4oKQordC5iID0gImhlbGxvIgorcHJpbnRsbiB0LmIKK3ByaW50bG4gInRlc3Q6ICR7dC5ifSIKKworeG1sID0gbmV3IE1hcmt1cEJ1aWxkZXIoKQorcm9vdCA9IHhtbC5mb28geworCWJhciB7CisJCS8vIHdvcmtzCisJCWJheigidGVzdCIpCisJCS8vIGZhaWxzCisJCWJheih0LmIpCisJCS8vIGZhaWxzCisJCWJheigiJHt0LmJ9IikKKwl9Cit9IApkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9zY3JpcHQvTWV0aG9kVGVzdFNjcmlwdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3NjcmlwdC9NZXRob2RUZXN0U2NyaXB0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmRmMDE3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9zY3JpcHQvTWV0aG9kVGVzdFNjcmlwdC5ncm9vdnkKQEAgLTAsMCArMSBAQAorR1N0cmluZy5tZXRob2RzLmVhY2ggeyBwcmludGxuIGl0Lm5hbWUgfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9zY3JpcHQvUGFja2FnZVNjcmlwdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3NjcmlwdC9QYWNrYWdlU2NyaXB0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTU3NDM2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9zY3JpcHQvUGFja2FnZVNjcmlwdC5ncm9vdnkKQEAgLTAsMCArMSwzIEBACitwYWNrYWdlIGdyb292eS5zY3JpcHQKKworcHJpbnRsbigiSGVsbG8gd29ybGQiKQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9zY3JpcHQvU2NyaXB0VGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3NjcmlwdC9TY3JpcHRUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDcwOWI3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9zY3JpcHQvU2NyaXB0VGVzdC5ncm9vdnkKQEAgLTAsMCArMSwzNiBAQAorcGFja2FnZSBncm9vdnkuc2NyaXB0CisKK2NsYXNzIFNjcmlwdFRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisgICAgdm9pZCB0ZXN0U2NyaXB0cygpIHsKKyAgICAgICAgZGVmIGZpbGUgPSBuZXcgRmlsZSgic3JjL3Rlc3QvZ3Jvb3Z5L3NjcmlwdCIpCisgICAgICAgIGZpbGUuZWFjaEZpbGUgeworICAgICAgICAgICAgZGVmIG5hbWUgPSBpdC5uYW1lCisgICAgICAgICAgICBpZiAobmFtZS5lbmRzV2l0aCgnLmdyb292eScpKSB7CisgICAgICAgICAgICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aCgnU2NyaXB0VGVzdCcpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgfQorCQkJCWVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIAlydW5TY3JpcHQoaXQpIAorCQkJCX0KKyAgICAgICAgICAgIH0gCisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIGRlZiBydW5TY3JpcHQoZmlsZSkgeworICAgICAgICBwcmludGxuKCJSdW5uaW5nIHNjcmlwdDogIiArIGZpbGUpCisgICAgICAgIAorICAgICAgICBkZWYgc2hlbGwgPSBuZXcgR3Jvb3Z5U2hlbGwoKQorICAgICAgICBkZWYgYXJncyA9IFsnYScsICdiJywgJ2MnXQorICAgICAgICAKKyAgICAgICAgc2hlbGwucnVuKGZpbGUsIGFyZ3MpCisKKyAgICAgICAgLyoqIEB0b2RvIHRoaXMgZG9lc24ndCB3b3JrIHdoZW4gcmFuIGluIGFuIElERT8KKyAgICAgICAgdHJ5IHsKKwkgICAgICAgIHNoZWxsLnJ1bihmaWxlLCBhcmdzKQorICAgICAgICB9IAorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHByaW50bG4oIkNhdWdodDogIiArIGUpCisgICAgICAgIH0KKyAgICAgICAgICovCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvc2NyaXB0L1NjcmlwdFdpdGhGdW5jdGlvbnMuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9zY3JpcHQvU2NyaXB0V2l0aEZ1bmN0aW9ucy5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIwNGI3OAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvc2NyaXB0L1NjcmlwdFdpdGhGdW5jdGlvbnMuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTEgQEAKK2RlZiBmb28obGlzdCwgdmFsdWUpIHsKKyAgICBwcmludGxuICJDYWxsaW5nIGZ1bmN0aW9uIGZvbygpIHdpdGggcGFyYW0gJHt2YWx1ZX0iCisgICAgbGlzdCA8PCB2YWx1ZQorfQorCit4ID0gW10KK2Zvbyh4LCAxKQorZm9vKHgsIDIpCithc3NlcnQgeCA9PSBbMSwgMl0KKworcHJpbnRsbiAiQ3JlYXRpbmcgbGlzdCAke3h9IgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvc2NyaXB0L1Nob3dBcmdzLmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvc2NyaXB0L1Nob3dBcmdzLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2QwNTc4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9zY3JpcHQvU2hvd0FyZ3MuZ3Jvb3Z5CkBAIC0wLDAgKzEsNSBAQAorCitmb3IgKGEgaW4gYXJncykgeworICAgIHByaW50bG4oIkFyZ3VtZW50OiAiICsgYSkKK30KKwpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9zY3JpcHQvVXNlQ2xvc3VyZUluU2NyaXB0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvc2NyaXB0L1VzZUNsb3N1cmVJblNjcmlwdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc2OTE5NQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvc2NyaXB0L1VzZUNsb3N1cmVJblNjcmlwdC5ncm9vdnkKQEAgLTAsMCArMSw0IEBACithID0gMQorWzFdLmVhY2ggeyAKKyAgICBhID0gaXQgCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3NlY3VyaXR5L1J1bkFsbEdyb292eVNjcmlwdHNTdWl0ZS5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9zZWN1cml0eS9SdW5BbGxHcm9vdnlTY3JpcHRzU3VpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDRmN2MzCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9zZWN1cml0eS9SdW5BbGxHcm9vdnlTY3JpcHRzU3VpdGUuamF2YQpAQCAtMCwwICsxLDY2IEBACisvKgorICogQ3JlYXRlZCBvbiBBcHIgNywgMjAwNAorICoKKyAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KKyAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCisgKi8KK3BhY2thZ2UgZ3Jvb3Z5LnNlY3VyaXR5OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0UmVzdWx0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogUnVuIGFsbCB0aGUgLmdyb292eSBzY3JpcHRzIGZvdW5kIHVuZGVyIHRoZSBzcmMvdGVzdCB0cmVlIHdpdGggYSBzZWN1cml0eSBtYW5hZ2VyIGFjdGl2ZS4KKyAqIE5vdCBjdXJyZW50bHkgcGFydCBvZiB0aGUgYnVpbGQgYmVjYXVzZSBpdCBhZGRzIGFib3V0IDQgbWludXRlcyB0byB0aGUgYnVpbGQgcHJvY2Vzcy4KKyAqCisgKiBAYXV0aG9yIFN0ZXZlIEdvZXR6ZQorICovCitwdWJsaWMgY2xhc3MgUnVuQWxsR3Jvb3Z5U2NyaXB0c1N1aXRlIGV4dGVuZHMgU2VjdXJpdHlUZXN0U3VwcG9ydCB7CisKKyAgICAvKioKKyAgICAgKiBGaW5kIGFsbCBHcm9vdnkgc2NyaXB0IHRlc3QgY2FzZXMgaW4gdGhlIHNvdXJjZSB0cmVlIGFuZCBleGVjdXRlIHRoZW0gd2l0aCBhIHNlY3VyaXR5IHBvbGljeSBpbiBlZmZlY3QuCisgICAgICogVGhlIGNvbXBsZXRlIGZpbGVuYW1lIG9mIHRoZSBncm9vdnkgc291cmNlIGZpbGUgaXMgdXNlZCBhcyB0aGUgY29kZWJhc2Ugc28gdGhhdCB0aGUgcHJvcGVyIGdyYW50cyBjYW4gYmUKKyAgICAgKiBtYWRlIGZvciBlYWNoIHNjcmlwdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBleGVjdXRlVGVzdHMoRmlsZSBkaXIsIFRlc3RSZXN1bHQgcmVzdWx0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZVtdIGZpbGVzID0gZGlyLmxpc3RGaWxlcygpOworICAgICAgICBMaXN0IHRyYXZlcnNlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgRmlsZSBmaWxlID0gZmlsZXNbaV07CisgICAgICAgICAgICBpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgdHJhdmVyc2VMaXN0LmFkZChmaWxlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBmaWxlLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICBpZiAobmFtZS5lbmRzV2l0aCgiVGVzdC5ncm9vdnkiKSB8fCBuYW1lLmVuZHNXaXRoKCJCdWcuZ3Jvb3Z5IikpIHsKKyAgICAgICAgICAgICAgICAgICAgLy9pZiAobmFtZS5lbmRzV2l0aCgiSWFuTWFjZXlzQnVnLmdyb292eSIpKSB7CisgICAgICAgICAgICAgICAgICAgIENsYXNzIGNsYXp6ID0gcGFyc2VDbGFzcyhmaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFRlc3RDYXNlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oY2xhenopKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKGNsYXp6KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1aXRlLnJ1bihyZXN1bHQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHRyYXZlcnNlTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIGV4ZWN1dGVUZXN0cygoRmlsZSkgaXRlci5uZXh0KCksIHJlc3VsdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R3Jvb3Z5U2NyaXB0cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIWlzU2VjdXJpdHlBdmFpbGFibGUoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFRlc3RSZXN1bHQgcmVzdWx0ID0gbmV3IFRlc3RSZXN1bHQoKTsKKyAgICAgICAgZXhlY3V0ZVRlc3RzKG5ldyBGaWxlKCJzcmMvdGVzdCIpLCByZXN1bHQpOworICAgICAgICBpZiAoIXJlc3VsdC53YXNTdWNjZXNzZnVsKCkpIHsKKyAgICAgICAgICAgIG5ldyBTZWN1cml0eVRlc3RSZXN1bHRQcmludGVyKFN5c3RlbS5vdXQpLnByaW50KHJlc3VsdCk7CisgICAgICAgICAgICBmYWlsKCJBdCBsZWFzdCBvbmUgZ3Jvb3Z5IHRlc3RjYXNlIGRpZCBub3QgcnVuIHVuZGVyIHRoZSBzZWN1cmUgZ3Jvb3Z5IGVudmlyb25tZW50LiAgUmVzdWx0cyBpbiB0aGUgdGVzdGNhc2Ugb3V0cHV0Iik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3NlY3VyaXR5L1J1bk9uZUdyb292eVNjcmlwdC5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9zZWN1cml0eS9SdW5PbmVHcm9vdnlTY3JpcHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTc5MjRkCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9zZWN1cml0eS9SdW5PbmVHcm9vdnlTY3JpcHQuamF2YQpAQCAtMCwwICsxLDM0IEBACitwYWNrYWdlIGdyb292eS5zZWN1cml0eTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CitpbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKKy8qKgorICogVGVzdCBjYXNlIGZvciBydW5uaW5nIGEgc2luZ2xlIGdyb292eSBzY3JpcHQgcGFyc2VkIGZyb20gYSAuZ3Jvb3Z5IGZpbGUuCisgKi8KK3B1YmxpYyBjbGFzcyBSdW5PbmVHcm9vdnlTY3JpcHQgZXh0ZW5kcyBTZWN1cml0eVRlc3RTdXBwb3J0IHsKKworICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGZpbGU7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIGZpbGUgPSBhcmdzWzBdOworICAgICAgICB9CisgICAgICAgIFRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoUnVuT25lR3Jvb3Z5U2NyaXB0LmNsYXNzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2NyaXB0KCkgeworICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInNjcmlwdCIsIGZpbGUpOworICAgICAgICBpZiAoZmlsZU5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk5vIGZpbGVuYW1lIGdpdmVuIGluIHRoZSAnc2NyaXB0JyBzeXN0ZW0gcHJvcGVydHkgc28gY2Fubm90IHJ1biBhIEdyb292eSBzY3JpcHQiKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFeGVjdXRlKG5ldyBGaWxlKGZpbGVOYW1lKSwgbnVsbCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9zZWN1cml0eS9TZWN1cml0eVRlc3QuamF2YSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvc2VjdXJpdHkvU2VjdXJpdHlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZkYzI1NgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvc2VjdXJpdHkvU2VjdXJpdHlUZXN0LmphdmEKQEAgLTAsMCArMSwxMjAgQEAKK3BhY2thZ2UgZ3Jvb3Z5LnNlY3VyaXR5OworCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5Q29kZVNvdXJjZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5Db21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlNlY3VyaXR5OworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb247CisKKy8qKgorICogVGVzdCB0aGUgZWZmZWN0cyBvZiBlbmFibGluZyBzZWN1cml0eSBpbiBHcm9vdnkuICBTb21lIHRlc3RzIGJlbG93IGNoZWNrIGZvciBwcm9wZXIgZnJhbWV3b3JrCisgKiBiZWhhdmlvciAoZS5nLiBlbnN1cmluZyB0aGF0IEdyb292eUNvZGVTb3VyY2VzIG1heSBvbmx5IGJlIGNyZWF0ZWQgZm9yIHdoaWNoIHByb3BlciBwZXJtaXNzaW9ucyBleGlzdCkuCisgKiBPdGhlciB0ZXN0cyBydW4gLmdyb292eSBzY3JpcHRzIHVuZGVyIGEgc2VjdXJlIGVudmlyb25tZW50IGFuZCBlbnN1cmUgdGhhdCB0aGUgcHJvcGVyIHBlcm1pc3Npb25zCisgKiBhcmUgcmVxdWlyZWQgZm9yIHN1Y2Nlc3MuCisgKiA8cC8+CisgKiBUb2RvOiBmaW5kIG91dCB3aHkgdGhlIG1hcmtlZCB0ZXN0cyBhcmUgZW52aXJvbm1lbnQgc3BlY2lmaWMgYW5kIHdoeSBzZWN1cml0eSB0ZXN0cyBhcmUgbm90CisgKiBydW5uaW5nIG9uIHRoZSBidWlsZCBzZXJ2ZXIuCisgKgorICogQGF1dGhvciBTdGV2ZSBHb2V0emUKKyAqLworcHVibGljIGNsYXNzIFNlY3VyaXR5VGVzdCBleHRlbmRzIFNlY3VyaXR5VGVzdFN1cHBvcnQgeworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisgICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFNlY3VyaXR5VGVzdC5jbGFzcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZvcmJpZGRlblByb3BlcnR5KCkgeworICAgICAgICBTdHJpbmcgc2NyaXB0ID0gIlN5c3RlbS5nZXRQcm9wZXJ0eShcInVzZXIuaG9tZVwiKSI7CisgICAgICAgIGFzc2VydEV4ZWN1dGUoc2NyaXB0LCBudWxsLCBuZXcgUHJvcGVydHlQZXJtaXNzaW9uKCJ1c2VyLmhvbWUiLCAicmVhZCIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9yYmlkZGVuUGFja2FnZSgpIHsKKyAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJpbXBvcnQgc3VuLm5ldC4qOyBzID0gbmV3IE5ldHdvcmtDbGllbnQoKSI7CisgICAgICAgIGFzc2VydEV4ZWN1dGUoc2NyaXB0LCAiL2dyb292eS9zZWN1cml0eS90ZXN0Rm9yYmlkZGVuUGFja2FnZSIsIG5ldyBSdW50aW1lUGVybWlzc2lvbigiYWNjZXNzQ2xhc3NJblBhY2thZ2Uuc3VuLioiKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZvcmJpZGRlbkNvZGViYXNlKCkgeworICAgICAgICBhc3NlcnRFeGVjdXRlKG5ldyBGaWxlKCJzcmMvdGVzdC9ncm9vdnkvc2VjdXJpdHkvZm9yYmlkZGVuQ29kZUJhc2UuZ3Z5IiksIG5ldyBHcm9vdnlDb2RlU291cmNlUGVybWlzc2lvbigiL2dyb292eS9zZWN1cml0eS9mb3JiaWRkZW5Db2RlQmFzZSIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9yYmlkZGVuQ29kZWJhc2VXaXRoQWN0aW9ucygpIHsKKyAgICAgICAgYXNzZXJ0RXhlY3V0ZShuZXcgRmlsZSgic3JjL3Rlc3QvZ3Jvb3Z5L3NlY3VyaXR5L2ZvcmJpZGRlbkNvZGVCYXNlLmd2eSIpLCBuZXcgR3Jvb3Z5Q29kZVNvdXJjZVBlcm1pc3Npb24oIi9ncm9vdnkvc2VjdXJpdHkvZm9yYmlkZGVuQ29kZUJhc2UiLCAidW51c2VkIGFjdGlvbnMgc3RyaW5nIikpOworICAgIH0KKworICAgIC8vQ2hlY2sgdGhhdCB0aGUgU2VjdXJpdHkgcGFja2FnZS5hY2Nlc3MgY29udHJvbCB3b3Jrcy4KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFja2FnZUFjY2VzcygpIHsKKyAgICAgICAgU3RyaW5nIHNjcmlwdCA9ICJuZXcgamF2YXgucHJpbnQuUHJpbnRFeGNlcHRpb24oKTsiOworICAgICAgICBTZWN1cml0eS5zZXRQcm9wZXJ0eSgicGFja2FnZS5hY2Nlc3MiLCAiamF2YXgucHJpbnQiKTsKKyAgICAgICAgLy9UaGlzIHNob3VsZCB0aHJvdyBhbiBBQ0UgYmVjYXVzZSBpdHMgY29kZUJhc2UgZG9lcyBub3QgYWxsb3cgYWNjZXNzIHRvIGphdmF4LnByaW50CisgICAgICAgIGFzc2VydEV4ZWN1dGUoc2NyaXB0LCAiL2dyb292eS9zZWN1cml0eS9qYXZheC9wcmludC9kZW55IiwgbmV3IFJ1bnRpbWVQZXJtaXNzaW9uKCJhY2Nlc3NDbGFzc0luUGFja2FnZS5qYXZheC5wcmludCIpKTsKKyAgICAgICAgLy9UaGlzIHNob3VsZCBub3QgdGhyb3cgYW4gQUNFIGJlY2F1c2UgZ3Jvb3Z5LnBvbGljeSBncmFudHMgdGhlIGNvZGVCYXNlIGFjY2VzcyB0byBqYXZheC5wcmludAorICAgICAgICBhc3NlcnRFeGVjdXRlKHNjcmlwdCwgIi9ncm9vdnkvc2VjdXJpdHkvamF2YXgvcHJpbnQvYWxsb3ciLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmFkU2NyaXB0TmFtZUJ1ZygpIHsKKyAgICAgICAgYXNzZXJ0RXhlY3V0ZShuZXcgRmlsZSgic3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQmFkU2NyaXB0TmFtZUJ1Zy5ncm9vdnkiKSwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENsb3N1cmVMaXN0ZW5lclRlc3QoKSB7CisgICAgICAgIC8vaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS52ZXJzaW9uIikuc3RhcnRzV2l0aCgiMS41IikgJiYgbm90WWV0SW1wbGVtZW50ZWQoKSkgcmV0dXJuOworICAgICAgICBpZiAoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnZlcnNpb24iKS5zdGFydHNXaXRoKCIxLjUiKSkgcmV0dXJuOworICAgICAgICBhc3NlcnRFeGVjdXRlKG5ldyBGaWxlKCJzcmMvdGVzdC9ncm9vdnkvQ2xvc3VyZUxpc3RlbmVyVGVzdC5ncm9vdnkiKSwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENsb3N1cmVNZXRob2RUZXN0KCkgeworICAgICAgICBhc3NlcnRFeGVjdXRlKG5ldyBGaWxlKCJzcmMvdGVzdC9ncm9vdnkvQ2xvc3VyZU1ldGhvZFRlc3QuZ3Jvb3Z5IiksIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHcm9vdnlNZXRob2RzVGVzdF9GQUlMUygpIHsKKyAgICAgICAgaWYgKG5vdFlldEltcGxlbWVudGVkKCkpIHJldHVybjsKKyAgICAgICAgYXNzZXJ0RXhlY3V0ZShuZXcgRmlsZSgic3JjL3Rlc3QvZ3Jvb3Z5L0dyb292eU1ldGhvZHNUZXN0Lmdyb292eSIpLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc3VyZVdpdGhEZWZhdWx0UGFyYW1UZXN0KCkgeworICAgICAgICBhc3NlcnRFeGVjdXRlKG5ldyBGaWxlKCJzcmMvdGVzdC9ncm9vdnkvQ2xvc3VyZVdpdGhEZWZhdWx0UGFyYW1UZXN0Lmdyb292eSIpLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R3Jvb3Z5MzAzX0J1ZygpIHsKKyAgICAgICAgYXNzZXJ0RXhlY3V0ZShuZXcgRmlsZSgic3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5MzAzX0J1Zy5ncm9vdnkiKSwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNjcmlwdFRlc3QoKSB7CisgICAgICAgIGFzc2VydEV4ZWN1dGUobmV3IEZpbGUoInNyYy90ZXN0L2dyb292eS9zY3JpcHQvU2NyaXB0VGVzdC5ncm9vdnkiKSwgbnVsbCk7CisgICAgfQorCisgICAgLy9JbiBhZGRpdGlvbiB0byByZXF1aXJpbmcgc2V2ZXJhbCBwZXJtaXNzaW9ucywgdGhpcyB0ZXN0IGlzIGFuIGV4YW1wbGUgb2YgdGhlIGNhc2UKKyAgICAvL3doZXJlIHRoZSBncm9vdnkgY2xhc3MgbG9hZGVyIGlzIHJlcXVpcmVkIGF0IHNjcmlwdCBpbnZvY2F0aW9uIHRpbWUgYXMgd2VsbCBhcworICAgIC8vZHVyaW5nIGNvbXBpbGF0aW9uLgorICAgIHB1YmxpYyB2b2lkIHRlc3RTcWxDb21wbGV0ZVdpdGhvdXREYXRhU291cmNlVGVzdCgpIHsKKyAgICAgICAgYXNzZXJ0RXhlY3V0ZShuZXcgRmlsZSgic3JjL3Rlc3QvZ3Jvb3Z5L3NxbC9TcWxDb21wbGV0ZVdpdGhvdXREYXRhU291cmNlVGVzdC5ncm9vdnkiKSwgbnVsbCk7CisgICAgfQorCisgICAgLy9UZXN0IHRvIHByZXZlbnQgc2NyaXB0cyBmcm9tIGludm9raW5nIHRoZSBncm9vdnkgY29tcGlsZXIuICBUaGlzIGlzIGRvbmUgYnkgcmVzdHJpY3RpbmcgYWNjZXNzCisgICAgLy90byB0aGUgb3JnLmNvZGVoYXVzLmdyb292eSBwYWNrYWdlcy4KKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0YUNsYXNzVGVzdCgpIHsKKyAgICAgICAgLy9TZWN1cml0eS5zZXRQcm9wZXJ0eSgicGFja2FnZS5hY2Nlc3MiLCAib3JnLmNvZGVoYXVzLmdyb292eSIpOworICAgICAgICAvL2Fzc2VydEV4ZWN1dGUobmV3IEZpbGUoInNyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vTWV0YUNsYXNzVGVzdC5ncm9vdnkiKSwgbmV3IFJ1bnRpbWVQZXJtaXNzaW9uKCJhY2Nlc3NDbGFzc0luUGFja2FnZS5vcmcuY29kZWhhdXMuZ3Jvb3Z5IikpOworICAgIH0KKworICAgIC8vTWFpbGluZyBsaXN0IHBvc3QgYnkgUmljaGFyZCBIZW5zbGV5IHJlcG9ydGluZyBhIENvZGVTb3VyY2UgYnVnLiAgQSBHcm9vdnlDb2RlU291cmNlIGNyZWF0ZWQKKyAgICAvL3dpdGggYSBVUkwgd2FzIGNhdXNpbmcgYW4gTlBFLgorICAgIHB1YmxpYyB2b2lkIHRlc3RDb2RlU291cmNlKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbiB7CisgICAgICAgIFVSTCBzY3JpcHQgPSBsb2FkZXIuZ2V0UmVzb3VyY2UoImdyb292eS9BcnJheVRlc3QuZ3Jvb3Z5Iik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgR3Jvb3Z5Q29kZVNvdXJjZShzY3JpcHQpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkNvdWxkIG5vdCBjb25zdHJ1Y3QgYSBHcm9vdnlDb2RlU291cmNlIGZyb20gYSBudWxsIFVSTCIsIHJlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvc2VjdXJpdHkvU2VjdXJpdHlUZXN0U3VwcG9ydC5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9zZWN1cml0eS9TZWN1cml0eVRlc3RTdXBwb3J0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUwMzU3OAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvc2VjdXJpdHkvU2VjdXJpdHlUZXN0U3VwcG9ydC5qYXZhCkBAIC0wLDAgKzEsMjcxIEBACitwYWNrYWdlIGdyb292eS5zZWN1cml0eTsKKworaW1wb3J0IGdyb292eS5sYW5nLkJpbmRpbmc7CitpbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5Q2xhc3NMb2FkZXI7CitpbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5Q29kZVNvdXJjZTsKK2ltcG9ydCBncm9vdnkubGFuZy5TY3JpcHQ7CitpbXBvcnQgZ3Jvb3Z5LnV0aWwuR3Jvb3Z5VGVzdENhc2U7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0RmFpbHVyZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFJlc3VsdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworaW1wb3J0IGp1bml0LnRleHR1aS5SZXN1bHRQcmludGVyOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5JbnZva2VySGVscGVyOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CitpbXBvcnQgamF2YS5zZWN1cml0eS4qOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKKworLyoqCisgKiBAYXV0aG9yIFN0ZXZlIEdvZXR6ZQorICovCitwdWJsaWMgY2xhc3MgU2VjdXJpdHlUZXN0U3VwcG9ydCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9MSUNZX0ZJTEUgPSAic2VjdXJpdHkvZ3Jvb3Z5LnBvbGljeSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGNvdW50ZXIgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gc2VjdXJpdHlEaXNhYmxlZDsKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHNlY3VyaXR5QXZhaWxhYmxlOworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gc2VjdXJpdHlDaGVja2VkID0gZmFsc2U7CisKKyAgICBzdGF0aWMgeworICAgICAgICBpZiAoU3lzdGVtLmdldFByb3BlcnR5KCJncm9vdnkuc2VjdXJpdHkuZGlzYWJsZWQiKSAhPSBudWxsKSB7CisgICAgICAgICAgICBzZWN1cml0eUF2YWlsYWJsZSA9IGZhbHNlOworICAgICAgICAgICAgc2VjdXJpdHlEaXNhYmxlZCA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZWN1cml0eURpc2FibGVkID0gZmFsc2U7CisgICAgICAgICAgICBpZiAobmV3IEZpbGUoUE9MSUNZX0ZJTEUpLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgc2VjdXJpdHlBdmFpbGFibGUgPSB0cnVlOworICAgICAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YS5zZWN1cml0eS5wb2xpY3kiLCAiPXNlY3VyaXR5L2dyb292eS5wb2xpY3kiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2VjdXJpdHlBdmFpbGFibGUgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NlY3VyaXR5QXZhaWxhYmxlKCkgeworICAgICAgICByZXR1cm4gc2VjdXJpdHlBdmFpbGFibGU7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzU2VjdXJpdHlEaXNhYmxlZCgpIHsKKyAgICAgICAgcmV0dXJuIHNlY3VyaXR5RGlzYWJsZWQ7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0U2VjdXJpdHlQb2xpY3koU3RyaW5nIHBvbGljeUZpbGVVUkwpIHsKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJqYXZhLnNlY3VyaXR5LnBvbGljeSIsIHBvbGljeUZpbGVVUkwpOworICAgICAgICBQb2xpY3kuZ2V0UG9saWN5KCkucmVmcmVzaCgpOworICAgIH0KKworICAgIHByb3RlY3RlZCBjbGFzcyBTZWN1cml0eVRlc3RSZXN1bHRQcmludGVyIGV4dGVuZHMgUmVzdWx0UHJpbnRlciB7CisKKyAgICAgICAgcHVibGljIFNlY3VyaXR5VGVzdFJlc3VsdFByaW50ZXIoUHJpbnRTdHJlYW0gc3RyZWFtKSB7CisgICAgICAgICAgICBzdXBlcihzdHJlYW0pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcHJpbnQoVGVzdFJlc3VsdCByZXN1bHQpIHsKKyAgICAgICAgICAgIGdldFdyaXRlcigpLnByaW50bG4oIlNlY3VyaXR5IHRlc3Rpbmcgb24gYSBncm9vdnkgdGVzdCBmYWlsZWQ6Iik7CisgICAgICAgICAgICBwcmludEVycm9ycyhyZXN1bHQpOworICAgICAgICAgICAgcHJpbnRGYWlsdXJlcyhyZXN1bHQpOworICAgICAgICAgICAgcHJpbnRGb290ZXIocmVzdWx0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBHcm9vdnlDbGFzc0xvYWRlciBsb2FkZXIgPSAoR3Jvb3Z5Q2xhc3NMb2FkZXIpIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgeworICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgR3Jvb3Z5Q2xhc3NMb2FkZXIoU2VjdXJpdHlUZXN0U3VwcG9ydC5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgfQorICAgIH0pOworCisgICAgcHJpdmF0ZSBTZWN1cml0eU1hbmFnZXIgc2VjdXJpdHlNYW5hZ2VyOworICAgIHByaXZhdGUgQ2xhc3NMb2FkZXIgY3VycmVudENsYXNzTG9hZGVyOworCisgICAgcHVibGljIFNlY3VyaXR5VGVzdFN1cHBvcnQoKSB7CisgICAgfQorCisgICAgLyoKKyAgICAgICogQ2hlY2sgU2VjdXJpdHlTdXBwb3J0IHRvIHNlZSBpZiBzZWN1cml0eSBpcyBwcm9wZXJseSBjb25maWd1cmVkLiAgSWYgbm90LCBmYWlsIHRoZSBmaXJzdAorICAgICAgKiB0ZXN0IHRoYXQgcnVucy4gIEFsbCByZW1haW5pbmcgdGVzdHMgd2lsbCBydW4sIGJ1dCBub3QgZG8gYW55IHNlY3VyaXR5IGNoZWNraW5nLgorICAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tTZWN1cml0eSgpIHsKKyAgICAgICAgaWYgKCFzZWN1cml0eUNoZWNrZWQpIHsKKyAgICAgICAgICAgIHNlY3VyaXR5Q2hlY2tlZCA9IHRydWU7CisgICAgICAgICAgICBpZiAoIWlzU2VjdXJpdHlBdmFpbGFibGUoKSkgeworICAgICAgICAgICAgICAgIGZhaWwoIlNlY3VyaXR5IGlzIG5vdCBhdmFpbGFibGUgLSBza2lwcGluZyBzZWN1cml0eSB0ZXN0cy4gIEVuc3VyZSB0aGF0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgUE9MSUNZX0ZJTEUgKyAiIGlzIGF2YWlsYWJsZSBmcm9tIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBkaXJlY3RvcnkuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGlzU2VjdXJpdHlBdmFpbGFibGUoKTsKKyAgICB9CisKKyAgICAvL1ByZXBhcmUgZm9yIGVhY2ggc2VjdXJpdHkgdGVzdC4gIEZpcnN0LCBjaGVjayB0byBzZWUgaWYgZ3Jvb3Z5LmxpYiBjYW4gYmUgZGV0ZXJtaW5lZCB2aWEKKyAgICAvL2EgY2FsbCB0byBjaGVja1NlY3VyaXR5KCkuICBJZiBub3QsIGZhaWwoKSB0aGUgZmlyc3QgdGVzdC4gIEVzdGFibGlzaCBhIHNlY3VyaXR5IG1hbmFnZXIKKyAgICAvL2FuZCBtYWtlIHRoZSBHcm9vdnlDbGFzc0xvYWRlciB0aGUgaW5pdGlhdGluZyBjbGFzcyBsb2FkZXIgKGFsYSBHcm9vdnlTaGVsbCkgdG8gY29tcGlsZSBBTkQKKyAgICAvL2ludm9rZSB0aGUgdGVzdCBzY3JpcHRzLiAgVGhpcyBoYW5kbGVzIGNhc2VzIHdoZXJlIG11bHRpcGxlIC5ncm9vdnkgc2NyaXB0cyBhcmUgaW52b2x2ZWQgaW4gYQorICAgIC8vdGVzdCBjYXNlOiBhLmdyb292eSBkZXBlbmRzIG9uIGIuZ3Jvb3Z5OyBhLmdyb292eSBpcyBwYXJzZWQgKGFuZCBpbiB0aGUgcHJvY2VzcyB0aGUgZ2NsCisgICAgLy9sb2FkcyBiLmdyb292eSB2aWEgZmluZENsYXNzKS4gIE5vdGUgdGhhdCBiLmdyb292eSBpcyBvbmx5IGF2YWlsYWJsZSBpbiB0aGUgZ3Jvb3Z5IGNsYXNzIGxvYWRlci4KKyAgICAvL1NlZQorICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgeworICAgICAgICBpZiAoY2hlY2tTZWN1cml0eSgpKSB7CisgICAgICAgICAgICBzZWN1cml0eU1hbmFnZXIgPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7CisgICAgICAgICAgICBpZiAoc2VjdXJpdHlNYW5hZ2VyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0U2VjdXJpdHlNYW5hZ2VyKG5ldyBTZWN1cml0eU1hbmFnZXIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY3VycmVudENsYXNzTG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7CisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihsb2FkZXIpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKKyAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7CisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0U2VjdXJpdHlNYW5hZ2VyKHNlY3VyaXR5TWFuYWdlcik7CisgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIoY3VycmVudENsYXNzTG9hZGVyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCBTdHJpbmcgZ2VuZXJhdGVDbGFzc05hbWUoKSB7CisgICAgICAgIHJldHVybiAidGVzdFNlY3VyaXR5IiArICgrK2NvdW50ZXIpOworICAgIH0KKworICAgIC8qCisgICAgICAqIEV4ZWN1dGUgdGhlIGdyb292eSBzY3JpcHQgY29udGFpbmVkIGluIGZpbGUuICBJZiBtaXNzaW5nUGVybWlzc2lvbgorICAgICAgKiBpcyBub24tbnVsbCwgdGhlbiB0aGlzIGludm9jYXRpb24gZXhwZWN0cyBhbiBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHdpdGggbWlzc2luZ1Blcm1pc3Npb24KKyAgICAgICogYXMgdGhlIHJlYXNvbi4gIElmIG1pc3NpbmdQZXJtaXNzaW9uIGlzIG51bGwsIHRoZSBzY3JpcHQgaXMgZXhwZWN0ZWQgdG8gZXhlY3V0ZSBzdWNjZXNzZnVsbHkuCisgICAgICAqLworICAgIHByb3RlY3RlZCBDbGFzcyBwYXJzZUNsYXNzKEZpbGUgZmlsZSkgeworICAgICAgICBHcm9vdnlDb2RlU291cmNlIGdjcyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBnY3MgPSBuZXcgR3Jvb3Z5Q29kZVNvdXJjZShmaWxlKTsKKyAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZuZmUpIHsKKyAgICAgICAgICAgIGZhaWwoZm5mZS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGFyc2VDbGFzcyhnY3MpOworICAgIH0KKworICAgIC8qCisJICogUGFyc2UgdGhlIEdyb292eSBjb2RlIGNvbnRhaW5lZCBpbiB0aGUgR3Jvb3Z5Q29kZVNvdXJjZSBhcyBhIHByaXZpbGVnZWQgb3BlcmF0aW9uIChpLmUuIGRvIG5vdAorCSAqIHJlcXVpcmUgdGhlIGNvZGUgc291cmNlIHRvIGhhdmUgc3BlY2lmaWMgY29tcGlsZSB0aW1lIHBlcm1pc3Npb25zKSBhbmQgcmV0dXJuIHRoZSByZXN1bHRpbmcgY2xhc3MuCisJICovCisgICAgcHJvdGVjdGVkIENsYXNzIHBhcnNlQ2xhc3MoZmluYWwgR3Jvb3Z5Q29kZVNvdXJjZSBnY3MpIHsKKyAgICAgICAgQ2xhc3MgY2xhenogPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2xhenogPSBsb2FkZXIucGFyc2VDbGFzcyhnY3MpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChlLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjbGF6ejsKKyAgICB9CisKKyAgICAvKgorICAgICAgKiBQYXJzZSB0aGUgc2NyaXB0IGNvbnRhaW5lZCBpbiB0aGUgR3Jvb3Z5Q29kZVNvdXJjZSBhcyBhIHByaXZpbGVnZWQgb3BlcmF0aW9uIChpLmUuIGRvIG5vdAorICAgICAgKiByZXF1aXJlIHRoZSBjb2RlIHNvdXJjZSB0byBoYXZlIHNwZWNpZmljIGNvbXBpbGUgdGltZSBwZXJtaXNzaW9ucykuICBJZiB0aGUgY2xhc3MgcHJvZHVjZWQgaXMgYQorICAgICAgKiBUZXN0Q2FzZSwgcnVuIHRoZSB0ZXN0IGluIGEgc3VpdGUgYW5kIGV2YWx1YXRlIGFnYWluc3QgdGhlIG1pc3NpbmdQZXJtaXNzaW9uLgorICAgICAgKiBPdGhlcndpc2UsIHJ1biB0aGUgY2xhc3MgYXMgYSBncm9vdnkgc2NyaXB0IGFuZCBldmFsdWF0ZSBhZ2FpbnN0IHRoZSBtaXNzaW5nUGVybWlzc2lvbi4KKyAgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlQW5kRXhlY3V0ZShmaW5hbCBHcm9vdnlDb2RlU291cmNlIGdjcywgUGVybWlzc2lvbiBtaXNzaW5nUGVybWlzc2lvbikgeworICAgICAgICBDbGFzcyBjbGF6eiA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjbGF6eiA9IGxvYWRlci5wYXJzZUNsYXNzKGdjcyk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKGUudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFRlc3RDYXNlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oY2xhenopKSB7CisgICAgICAgICAgICBleGVjdXRlVGVzdChjbGF6eiwgbWlzc2luZ1Blcm1pc3Npb24pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZXhlY3V0ZVNjcmlwdChjbGF6eiwgbWlzc2luZ1Blcm1pc3Npb24pOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZVRlc3QoQ2xhc3MgdGVzdCwgUGVybWlzc2lvbiBtaXNzaW5nUGVybWlzc2lvbikgeworICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZSh0ZXN0KTsKKyAgICAgICAgVGVzdFJlc3VsdCByZXN1bHQgPSBuZXcgVGVzdFJlc3VsdCgpOworICAgICAgICBzdWl0ZS5ydW4ocmVzdWx0KTsKKyAgICAgICAgaWYgKHJlc3VsdC53YXNTdWNjZXNzZnVsKCkpIHsKKyAgICAgICAgICAgIGlmIChtaXNzaW5nUGVybWlzc2lvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJTZWN1cml0eSB0ZXN0IGV4cGVjdGVkIGFuIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gb24gIiArIG1pc3NpbmdQZXJtaXNzaW9uICsgIiwgYnV0IGRpZCBub3QgcmVjZWl2ZSBvbmUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChtaXNzaW5nUGVybWlzc2lvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbmV3IFNlY3VyaXR5VGVzdFJlc3VsdFByaW50ZXIoU3lzdGVtLm91dCkucHJpbnQocmVzdWx0KTsKKyAgICAgICAgICAgICAgICBmYWlsKCJTZWN1cml0eSB0ZXN0IHdhcyBleHBlY3RlZCB0byBydW4gc3VjY2Vzc2Z1bGx5LCBidXQgZmFpbGVkIChyZXN1bHRzIG9uIFN5c3RlbS5vdXQpIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vVGhlcmUgbWF5IGJlIG1vcmUgdGhhbiAxIGZhaWx1cmU6ICBpdGVyYXRlIHRvIGVuc3VyZSB0aGF0IHRoZXkgYWxsIG1hdGNoIHRoZSBtaXNzaW5nUGVybWlzc2lvbi4KKyAgICAgICAgICAgICAgICBib29sZWFuIG90aGVyRmFpbHVyZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IHJlc3VsdC5lcnJvcnMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKKyAgICAgICAgICAgICAgICAgICAgVGVzdEZhaWx1cmUgZmFpbHVyZSA9IChUZXN0RmFpbHVyZSkgZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoZmFpbHVyZS50aHJvd25FeGNlcHRpb24oKSBpbnN0YW5jZW9mIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gYWNlID0gKEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24pIGZhaWx1cmUudGhyb3duRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWlzc2luZ1Blcm1pc3Npb24uaW1wbGllcyhhY2UuZ2V0UGVybWlzc2lvbigpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG90aGVyRmFpbHVyZSA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChvdGhlckZhaWx1cmUpIHsKKyAgICAgICAgICAgICAgICAgICAgbmV3IFNlY3VyaXR5VGVzdFJlc3VsdFByaW50ZXIoU3lzdGVtLm91dCkucHJpbnQocmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgZmFpbCgiU2VjdXJpdHkgdGVzdCBleHBlY3RlZCBhbiBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIG9uICIgKyBtaXNzaW5nUGVybWlzc2lvbiArICIsIGJ1dCBmYWlsZWQgZm9yIG90aGVyIHJlYXNvbnMgKHJlc3VsdHMgb24gU3lzdGVtLm91dCkiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBleGVjdXRlU2NyaXB0KENsYXNzIHNjcmlwdENsYXNzLCBQZXJtaXNzaW9uIG1pc3NpbmdQZXJtaXNzaW9uKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTY3JpcHQgc2NyaXB0ID0gSW52b2tlckhlbHBlci5jcmVhdGVTY3JpcHQoc2NyaXB0Q2xhc3MsIG5ldyBCaW5kaW5nKCkpOworICAgICAgICAgICAgc2NyaXB0LnJ1bigpOworICAgICAgICAgICAgLy9JbnZva2VySGVscGVyLnJ1blNjcmlwdChzY3JpcHRDbGFzcywgbnVsbCk7CisgICAgICAgIH0gY2F0Y2ggKEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gYWNlKSB7CisgICAgICAgICAgICBpZiAobWlzc2luZ1Blcm1pc3Npb24gIT0gbnVsbCAmJiBtaXNzaW5nUGVybWlzc2lvbi5pbXBsaWVzKGFjZS5nZXRQZXJtaXNzaW9uKCkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmYWlsKGFjZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobWlzc2luZ1Blcm1pc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGNhdGNoIGFuIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICAqIEV4ZWN1dGUgdGhlIGdyb292eSBzY3JpcHQgY29udGFpbmVkIGluIGZpbGUuICBJZiBtaXNzaW5nUGVybWlzc2lvbgorICAgICAgKiBpcyBub24tbnVsbCwgdGhlbiB0aGlzIGludm9jYXRpb24gZXhwZWN0cyBhbiBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIHdpdGggbWlzc2luZ1Blcm1pc3Npb24KKyAgICAgICogYXMgdGhlIHJlYXNvbi4gIElmIG1pc3NpbmdQZXJtaXNzaW9uIGlzIG51bGwsIHRoZSBzY3JpcHQgaXMgZXhwZWN0ZWQgdG8gZXhlY3V0ZSBzdWNjZXNzZnVsbHkuCisgICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydEV4ZWN1dGUoRmlsZSBmaWxlLCBQZXJtaXNzaW9uIG1pc3NpbmdQZXJtaXNzaW9uKSB7CisgICAgICAgIGlmICghaXNTZWN1cml0eUF2YWlsYWJsZSgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgR3Jvb3Z5Q29kZVNvdXJjZSBnY3MgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZ2NzID0gbmV3IEdyb292eUNvZGVTb3VyY2UoZmlsZSk7CisgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBmbmZlKSB7CisgICAgICAgICAgICBmYWlsKGZuZmUudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgcGFyc2VBbmRFeGVjdXRlKGdjcywgbWlzc2luZ1Blcm1pc3Npb24pOworICAgIH0KKworICAgIC8qCisgICAgICAqIEV4ZWN1dGUgdGhlIHNjcmlwdCByZXByZXNlbnRlZCBieSBzY3JpcHRTdHIgdXNpbmcgdGhlIHN1cHBsaWVkIGNvZGViYXNlLiAgSWYgbWlzc2luZ1Blcm1pc3Npb24KKyAgICAgICogaXMgbm9uLW51bGwsIHRoZW4gdGhpcyBpbnZvY2F0aW9uIGV4cGVjdHMgYW4gQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB3aXRoIG1pc3NpbmdQZXJtaXNzaW9uCisgICAgICAqIGFzIHRoZSByZWFzb24uICBJZiBtaXNzaW5nUGVybWlzc2lvbiBpcyBudWxsLCB0aGUgc2NyaXB0IGlzIGV4cGVjdGVkIHRvIGV4ZWN1dGUgc3VjY2Vzc2Z1bGx5LgorICAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRFeGVjdXRlKFN0cmluZyBzY3JpcHRTdHIsIFN0cmluZyBjb2RlQmFzZSwgUGVybWlzc2lvbiBtaXNzaW5nUGVybWlzc2lvbikgeworICAgICAgICBpZiAoIWlzU2VjdXJpdHlBdmFpbGFibGUoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChjb2RlQmFzZSA9PSBudWxsKSB7CisgICAgICAgICAgICBjb2RlQmFzZSA9ICIvZ3Jvb3Z5L3NlY3VyaXR5L3Rlc3QiOworICAgICAgICB9CisgICAgICAgIHBhcnNlQW5kRXhlY3V0ZShuZXcgR3Jvb3Z5Q29kZVNvdXJjZShzY3JpcHRTdHIsIGdlbmVyYXRlQ2xhc3NOYW1lKCksIGNvZGVCYXNlKSwgbWlzc2luZ1Blcm1pc3Npb24pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvc2VjdXJpdHkvU2lnbmVkSmFyVGVzdC5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9zZWN1cml0eS9TaWduZWRKYXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM4Yzg3ZAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvc2VjdXJpdHkvU2lnbmVkSmFyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKK3BhY2thZ2UgZ3Jvb3Z5LnNlY3VyaXR5OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworCisvKioKKyAqIFJlYWQgYSAuZ3Jvb3Z5IGZpbGUgZnJvbSBhIHNpZ25lZCBqYXIgYW5kIHZlcmlmeSB0aGF0IGEgcG9saWN5IGZpbGUgZ3JhbnQgd2l0aCBhIHNpZ25lZEJ5IGZpZWxkCisgKiB3b3Jrcy4gIFRoZSBmb2xsb3dpbmcgc3RlcHMgd2VyZSB1c2VkIHRvIGNyZWF0ZSBhbmQgbWFuYWdlIHRoZSBrZXlzIHVzZWQgdG8gc2lnbiBhbmQgcmVhZCB0aGUgamFyOgorICogPG9sPgorICogPGxpPmtleXRvb2wgLWdlbmtleSAtYWxpYXMgZ3Jvb3Z5IC1rZXlwYXNzIGtleXBhc3MgLWtleXN0b3JlIGdyb292eXN0b3JlIC1zdG9yZXBhc3Mgc3RvcmVwYXNzIC12YWxpZGl0eSA3MDAwCisgKiA8bGk+a2V5dG9vbCAtZXhwb3J0IC1rZXlzdG9yZSBncm9vdnlzdG9yZSAtYWxpYXMgZ3Jvb3Z5IC1maWxlIEdyb292eURldi5jZXIKKyAqIDxsaT5rZXl0b29sIC1pbXBvcnQgLWFsaWFzIGdyb292eSAtZmlsZSBHcm9vdnlEZXYuY2VyIC1rZXlzdG9yZSBncm9vdnlrZXlzCisgKiA8L29sPgorICogT25jZSB0aGUga2V5cyBhcmUgY29uc3RydWN0ZWQsIGNyZWF0IHRoZSBqYXIgYW5kIHNpZ246CisgKiA8b2w+CisgKiA8bGk+amFyIC1jdmYgR3Jvb3Z5LmphciBncm9vdnkKKyAqIDxsaT5qYXJzaWduZXIgLWtleXN0b3JlIGdyb292eXN0b3JlIC1zaWduZWRqYXIgR3Jvb3Z5SmFyVGVzdC5qYXIgR3Jvb3Z5LmphciBncm9vdnkKKyAqIDwvb2w+CisgKiBBZGQgdGhlIGtleXN0b3JlIHRvIHRoZSBwb2xpY3kgZmlsZSBhbmQgd3JpdGUgdGhlIGdyYW50OgorICogPG9sPgorICogPGxpPmtleXN0b3JlICJmaWxlOiR7dXNlci5kaXJ9L3NyYy90ZXN0L2dyb292eS9zZWN1cml0eS9ncm9vdnlrZXlzIjsKKyAqIDwvb2w+CisgKi8KK3B1YmxpYyBjbGFzcyBTaWduZWRKYXJUZXN0IGV4dGVuZHMgU2VjdXJpdHlUZXN0U3VwcG9ydCB7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIFRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoU2lnbmVkSmFyVGVzdC5jbGFzcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRTaWduZWRKYXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFpc1NlY3VyaXR5QXZhaWxhYmxlKCkgfHwgKG5vdFlldEltcGxlbWVudGVkKCkpKSByZXR1cm47CisKKyAgICAgICAgLy9zcGcgMjAwNi0wMi0wOSBUaGUgR3Jvb3Z5Q2xhc3NMb2FkZXIgY29kZSB0aGF0IGNoZWNrZWQgamFyIGZpbGVzCisgICAgICAgIC8vZm9yIHNvdXJjZSBmaWxlcyB3YXMgcmVtb3ZlZCBsYXN0IEp1bHkuICBUaGlzIHRlc3Qgd2lsbCBub3QgZnVuY3Rpb24KKyAgICAgICAgLy93aXRob3V0IHRoYXQgY2FwYWJpbGl0eS4KKyAgICAgICAgQ2xhc3MgYyA9IGxvYWRlci5sb2FkQ2xhc3MoImdyb292eS5zZWN1cml0eS5KYXJUZXN0Iik7ICAvLyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uICEKKyAgICAgICAgZXhlY3V0ZVRlc3QoYywgbnVsbCk7CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3NlY3VyaXR5L2ZvcmJpZGRlbkNvZGVCYXNlLmd2eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvc2VjdXJpdHkvZm9yYmlkZGVuQ29kZUJhc2UuZ3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZTAxNDEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3NlY3VyaXR5L2ZvcmJpZGRlbkNvZGVCYXNlLmd2eQpAQCAtMCwwICsxLDYgQEAKKy8qCisgKiBHcm9vdnkgc2NyaXB0IHRvIGJlIHJlYWQgYXMgYSBmaWxlIHRvIHRlc3QgdGhlIGZpbGUgYmFzZWQgY29kZXNvdXJjZSBmZWF0dXJlcyBvZiBncm9vdnkgc2VjdXJpdHkuCisgKiBUaGUgZmlsZSBleHRlbnNpb24gb2YgLmd2eSBpcyB1c2VkIHRvIHByZXZlbnQgdGhpcyBzY3JpcHQgZnJvbSBiZWluZyB0cmVhdGVkIGFzIGEgZ3Jvb3Z5IHNjcmlwdCBieSBtYXZlbi4KKyAqLworIAorbmV3IEdyb292eVNoZWxsKCkuZXZhbHVhdGUoIjErMiIsICJmb3JiaWRkZW5Db2RlQmFzZVRlc3QiLCAiL2dyb292eS9zZWN1cml0eS9mb3JiaWRkZW5Db2RlQmFzZSIpOwpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9zZXJ2bGV0L0Fic3RyYWN0SHR0cFNlcnZsZXRUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvc2VydmxldC9BYnN0cmFjdEh0dHBTZXJ2bGV0VGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFiODc0MAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvc2VydmxldC9BYnN0cmFjdEh0dHBTZXJ2bGV0VGVzdC5ncm9vdnkKQEAgLTAsMCArMSwyNDMgQEAKK3BhY2thZ2UgZ3Jvb3Z5LnNlcnZsZXQKKworaW1wb3J0IGdyb292eS5zZXJ2bGV0LkFic3RyYWN0SHR0cFNlcnZsZXQKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dAoraW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbmZpZworaW1wb3J0IGphdmEubmV0LlVSTAorCisvKioKKyogVGhpcyB0ZXN0IGNhc2UgdGVzdHMgdGhlIEFic3RyYWN0SHR0cFNlcnZsZXQgY2xhc3MuIEl0IHVzZXMgYSB0ZXN0CisqIHNwZWNpZmljIHN1YmNsYXNzIGNhbGxlZCBDb25jcmV0ZUh0dHBTZXJ2bGV0IHRvIHRlc3QgdGhlIGFic3RyYWN0CisqIGNsYXNzIGluIGlzb2xhdGlvbiBmcm9tIGFueSBpbXBsZW1lbnRhdGlvbnMuIAorKiAKKyogQGF1dGhvciBIYW1sZXQgRCdBcmN5CisqLyAKK2NsYXNzIEFic3RyYWN0SHR0cFNlcnZsZXRUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisJZGVmIHNlcnZsZXQ7IAorCQorCXZvaWQgc2V0VXAoKSB7CisJCXN1cGVyLnNldFVwKCkKKwkJc2VydmxldCA9IG5ldyBDb25jcmV0ZUh0dHBTZXJ2bGV0KCkKKwl9CisJCisJLyoqCisJKiBnZXRTY3JpcHRVcmkoKSBjb25jYXRlbmF0ZXMgdGhlIHNlcnZsZXQgcGF0aCBhbmQgcGF0aCBpbmZvIAorCSogYXR0cmlidXRlcyBpZiBhdHRyaWJ1dGVzIGV4aXN0IG9uIHRoZSBodHRwIHJlcXVlc3QuIAorCSovCisJdm9pZCB0ZXN0R2V0U2NyaXB0VXJpX0FsbEF0dHJpYnV0ZXNFeGlzdCgpIHsKKworCQkvL2p1c3QgcmV0dXJuIHdoYXRldmVyIGF0dHJpYnV0ZXMgd2VyZSByZXF1ZXN0ZWQKKwkJZGVmIHJlcXVlc3QgPSB7YXR0cmlidXRlIC0+IGF0dHJpYnV0ZX0gCisKKwkJYXNzZXJ0IHNlcnZsZXQuZ2V0U2NyaXB0VXJpKHJlcXVlc3QgYXMgSHR0cFNlcnZsZXRSZXF1ZXN0KSA9PQorCQkJQWJzdHJhY3RIdHRwU2VydmxldC5JTkNfU0VSVkxFVF9QQVRIICsgQWJzdHJhY3RIdHRwU2VydmxldC5JTkNfUEFUSF9JTkZPCisJfQorCisJLyoqCisJKiBnZXRTY3JpcHRVcmkoKSByZXR1cm5zIHRoZSBzZXJ2bGV0IHBhdGggaWYgdGhlIGh0dHAgcmVxdWVzdAorCSogY29udGFpbnMgcGF0aCBidXQgbm8gcGF0aCBpbmZvIGF0dHJpYnV0ZS4gIAorCSovCisJdm9pZCB0ZXN0R2V0U2NyaXB0VXJpX05vUGF0aEluZm9BdHRyaWJ1dGUoKSB7CisKKwkJLy9qdXN0IHJldHVybiB3aGF0ZXZlciBhdHRyaWJ1dGVzIHdlcmUgcmVxdWVzdGVkLCBleGNlcHQgZm9yIHBhdGggaW5mbyBhdHRyaWJ1dGUKKwkJZGVmIHJlcXVlc3QgPSB7YXR0cmlidXRlIC0+IAorCQkJaWYgKGF0dHJpYnV0ZSA9PSBBYnN0cmFjdEh0dHBTZXJ2bGV0LklOQ19QQVRIX0lORk8pIHsKKwkJCQlyZXR1cm4gbnVsbCAKKwkJCX0KKwkJCWF0dHJpYnV0ZQorCQl9IAorCisJCWFzc2VydCBzZXJ2bGV0LmdldFNjcmlwdFVyaShyZXF1ZXN0IGFzIEh0dHBTZXJ2bGV0UmVxdWVzdCkgPT0KKwkJCUFic3RyYWN0SHR0cFNlcnZsZXQuSU5DX1NFUlZMRVRfUEFUSAorCX0KKwkKKwkvKioKKwkqIFRlc3RzIGdldFNjcmlwdFVyaSB3aGVuIG5vIGF0dHJpYnV0ZXMgZXhpc3QsIGJ1dCBzZXJ2bGV0UGF0aCBhbmQgCisJKiBwYXRoSW5mbyBtZXRob2RzIHJldHVybiBkYXRhLiAKKwkqLworCXZvaWQgdGVzdEdldFNjcmlwdFVyaV9Ob0F0dHJpYnV0ZXNQYXRoSW5mb0V4aXN0cygpIHsKKwkJZGVmIHJlcXVlc3QgPSBbIAorCQkJZ2V0QXR0cmlidXRlOiB7bnVsbH0sIAorCQkgICAgZ2V0U2VydmxldFBhdGg6IHsic2VydmxldFBhdGgifSwgCisJCSAgICBnZXRQYXRoSW5mbzogeyJwYXRoSW5mbyJ9XSBhcyBIdHRwU2VydmxldFJlcXVlc3QKKworCQlkZWYgc2VydmxldCA9IG5ldyBDb25jcmV0ZUh0dHBTZXJ2bGV0KCkKKwkJYXNzZXJ0IHNlcnZsZXQuZ2V0U2NyaXB0VXJpKHJlcXVlc3QpID09ICJzZXJ2bGV0UGF0aHBhdGhJbmZvIgorCQkKKwl9CisKKwkvKioKKwkqIFRlc3RzIGdldFNjcmlwdFVyaSB3aGVuIG5vIGF0dHJpYnV0ZXMgZXhpc3QsIG5vIHBhdGggaW5mbyBleGlzdHMsIAorCSogYnV0IHNlcnZsZXRQYXRoIHJldHVybnMgZGF0YS4gCisJKi8KKwl2b2lkIHRlc3RHZXRTY3JpcHRVcmlfTm9BdHRyaWJ1dGVzUGF0aEluZm9NaXNzaW5nKCkgeworCQlkZWYgcmVxdWVzdCA9IFsgCisJCQlnZXRBdHRyaWJ1dGU6IHtudWxsfSwgCisJCSAgICBnZXRTZXJ2bGV0UGF0aDogeyJzZXJ2bGV0UGF0aCJ9LCAKKwkJICAgIGdldFBhdGhJbmZvOiB7bnVsbH1dIGFzIEh0dHBTZXJ2bGV0UmVxdWVzdAorCisJCWRlZiBzZXJ2bGV0ID0gbmV3IENvbmNyZXRlSHR0cFNlcnZsZXQoKQorCQlhc3NlcnQgc2VydmxldC5nZXRTY3JpcHRVcmkocmVxdWVzdCkgPT0gInNlcnZsZXRQYXRoIgorCQkKKwl9CisJCisJLyoqCisJKiBUZXN0cyBnZXR0aW5nIFVSSXMgYXMgZmlsZXMuIAorCSovIAorCXZvaWQgdGVzdEdldFNjcmlwdFVSSWFzRmlsZSgpIHsKKworCQlkZWYgcmVxdWVzdCA9IFsgCisJCSAgICBnZXRBdHRyaWJ1dGU6IHtudWxsfSwgCisJCSAgICBnZXRTZXJ2bGV0UGF0aDogeyJzZXJ2bGV0UGF0aCJ9LCAKKwkJICAgIGdldFBhdGhJbmZvOiB7InBhdGhJbmZvIn1dIGFzIEh0dHBTZXJ2bGV0UmVxdWVzdAorCisJCWRlZiBzZXJ2bGV0Q29udGV4dCA9IFsKKwkJICAgIGdldFJlYWxQYXRoOiB7IGFyZy0+ICJyZWFsUGF0aCIgKyBhcmd9XSBhcyBTZXJ2bGV0Q29udGV4dAorCisJCWRlZiBzZXJ2bGV0Q29uZmlnID0gWworCQkgICAgZ2V0U2VydmxldENvbnRleHQ6IHtzZXJ2bGV0Q29udGV4dH0sIAorCQkgICAgZ2V0SW5pdFBhcmFtZXRlcjoge251bGx9XSBhcyBTZXJ2bGV0Q29uZmlnCisKKwkJc2VydmxldC5pbml0KHNlcnZsZXRDb25maWcpCisJCWRlZiBmaWxlID0gc2VydmxldC5nZXRTY3JpcHRVcmlBc0ZpbGUocmVxdWVzdCkKKwkJYXNzZXJ0IGZpbGUuZ2V0TmFtZSgpID09ICJyZWFsUGF0aHNlcnZsZXRQYXRocGF0aEluZm8iCQkKKwl9CisJCisJLyoqCisJKiBUZXN0cyB0aGF0IGV4Y2VwdGlvbiBpcyB0aHJvd24gd2hlbiByZXNvdXJjZSBpcyBub3QgZm91bmQuIAorCSovIAorCXZvaWQgdGVzdEdldFJlc291cmNlQ29ubmVjdGlvbl9NaXNzaW5nUmVzb3VyY2UoKSB7CisJCWRlZiBzZXJ2bGV0Q29udGV4dCA9IFsKKwkJICAgIGdldFJlYWxQYXRoOiB7YXJnLT4gInJlYWxQYXRoIiArIGFyZ30sIAorCQkgICAgZ2V0UmVzb3VyY2U6IHthcmcgLT4gbnVsbH0gXSBhcyBTZXJ2bGV0Q29udGV4dAorCisJCWRlZiBzZXJ2bGV0Q29uZmlnID0gWworCQkgICAgZ2V0U2VydmxldENvbnRleHQ6IHtzZXJ2bGV0Q29udGV4dH0sIAorCQkgICAgZ2V0SW5pdFBhcmFtZXRlcjoge251bGx9XSBhcyBTZXJ2bGV0Q29uZmlnCisKKwkJLy9zZXJ2bGV0IGNvbmZpZyBpcyB1c2VkIHRvIGZpbmQgcmVzb3VyY2VzCisJCXNlcnZsZXQuaW5pdChzZXJ2bGV0Q29uZmlnKSAgICAKKworCQlzaG91bGRGYWlsKGdyb292eS51dGlsLlJlc291cmNlRXhjZXB0aW9uKSB7CisJCSAgICBzZXJ2bGV0LmdldFJlc291cmNlQ29ubmVjdGlvbigic29tZXJlc291cmNlIikKKwkJfQorCX0KKworCS8qKgorCSogVGVzdHMgZmluZGluZyByZXNvdXJjZS4gCisJKi8gCisJcHVibGljIHZvaWQgdGVzdEdldFJlc291cmNlQ29ubmVjdGlvbl9Gb3VuZEluQ3VycmVudERpcigpIHsKKwkJZGVmIHVybFN0dWIgPSBuZXcgamF2YS5uZXQuVVJMKCJodHRwOi8vZm9vIikKKwkJZGVmIHNlcnZsZXRDb250ZXh0ID0gWworCQkgICAgZ2V0UmVhbFBhdGg6IHsgYXJnLT4gInJlYWxQYXRoIiArIGFyZ30sIAorCQkgICAgZ2V0UmVzb3VyY2U6IHthcmcgLT4gCisJCQkJaWYgKGFyZyA9PSAiL3NvbWVyZXNvdXJjZSIpIHJldHVybiB1cmxTdHViCisJCQkJZWxzZSByZXR1cm4gbnVsbAorCQkJfSBdIGFzIFNlcnZsZXRDb250ZXh0CisKKwkJZGVmIHNlcnZsZXRDb25maWcgPSBbCisJCSAgICBnZXRTZXJ2bGV0Q29udGV4dDoge3NlcnZsZXRDb250ZXh0fSwgCisJCSAgICBnZXRJbml0UGFyYW1ldGVyOiB7bnVsbH1dIGFzIFNlcnZsZXRDb25maWcKKworCQkvL3NlcnZsZXQgY29uZmlnIGlzIHVzZWQgdG8gZmluZCByZXNvdXJjZXMKKwkJc2VydmxldC5pbml0KHNlcnZsZXRDb25maWcpICAgIAorCisJCWRlZiBjb25uZWN0aW9uID0gc2VydmxldC5nZXRSZXNvdXJjZUNvbm5lY3Rpb24oInNvbWVyZXNvdXJjZSIpCisKKwkJYXNzZXJ0IGNvbm5lY3Rpb24uZ2V0VVJMKCkgPT0gdXJsU3R1YgkJCisJfQorCisJLyoqCisJKiBUZXN0cyBmaW5kaW5nIHJlc291cmNlIGluIHdlYi1pbmYgZGlyZWN0b3J5LiAKKwkqLyAKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0UmVzb3VyY2VDb25uZWN0aW9uX0ZvdW5kSW5XZWJJbmYoKSB7CisJCWRlZiB1cmxTdHViID0gbmV3IGphdmEubmV0LlVSTCgiaHR0cDovL2ZvbyIpCisJCWRlZiBzZXJ2bGV0Q29udGV4dCA9IFsKKwkJICAgIGdldFJlYWxQYXRoOiB7IGFyZy0+ICJyZWFsUGF0aCIgKyBhcmd9LCAKKwkJICAgIGdldFJlc291cmNlOiB7YXJnIC0+IAorCQkJCWlmIChhcmcgPT0gIi9XRUItSU5GL2dyb292eS9zb21lcmVzb3VyY2UiKSByZXR1cm4gdXJsU3R1YgorCQkJCWVsc2UgcmV0dXJuIG51bGwKKwkJCX0gXSBhcyBTZXJ2bGV0Q29udGV4dAorCisJCWRlZiBzZXJ2bGV0Q29uZmlnID0gWworCQkgICAgZ2V0U2VydmxldENvbnRleHQ6IHtzZXJ2bGV0Q29udGV4dH0sIAorCQkgICAgZ2V0SW5pdFBhcmFtZXRlcjoge251bGx9XSBhcyBTZXJ2bGV0Q29uZmlnCisKKwkJLy9zZXJ2bGV0IGNvbmZpZyBpcyB1c2VkIHRvIGZpbmQgcmVzb3VyY2VzCisJCXNlcnZsZXQuaW5pdChzZXJ2bGV0Q29uZmlnKSAgICAKKworCQlkZWYgY29ubmVjdGlvbiA9IHNlcnZsZXQuZ2V0UmVzb3VyY2VDb25uZWN0aW9uKCJzb21lcmVzb3VyY2UiKQorCisJCWFzc2VydCBjb25uZWN0aW9uLmdldFVSTCgpID09IHVybFN0dWIJCQorCX0KKwkKKwkvKioKKwkqIFRlc3RzIHJlZ2V4IHN0eWxlIHJlc291cmNlIHJlcGxhY2VtZW50IGZvciBmaXJzdCBvY2N1cmVuY2UuIAorCSovIAorCXB1YmxpYyB2b2lkIHRlc3RHZXRSZXNvdXJjZUNvbm5lY3Rpb25fUmVwbGFjZTFzdEZvb1dpdGhCYXIoKSB7CisJCWRlZiBzZXJ2bGV0Q29udGV4dCA9IFsKKwkJICAgIGdldFJlYWxQYXRoOiB7YXJnIC0+ICJyZWFsUGF0aCIgKyBhcmd9LCAKKwkJICAgIGdldFJlc291cmNlOiB7YXJnIC0+IAorCQkgICAgICBpZiAoYXJnLnN0YXJ0c1dpdGgoIi8vIikpIGFyZz1hcmcuc3Vic3RyaW5nKDIpCisJCSAgICAgIG5ldyBVUkwoImh0dHA6Ly8iICsgYXJnKX0KKwkJXSBhcyBTZXJ2bGV0Q29udGV4dAorCisJCWRlZiBzZXJ2bGV0Q29uZmlnID0gWworCQkgICAgZ2V0U2VydmxldENvbnRleHQ6IHtzZXJ2bGV0Q29udGV4dH0sIAorCQkgICAgZ2V0SW5pdFBhcmFtZXRlcjoge2FyZyAtPgorCQkgICAgICAgIC8vcmVwbGFjZSBmaXJzdCBvY2N1cmVuY2Ugb2YgZm9vIHJlc291cmNlcyB3aXRoIGJhciByZXNvdXJjZXMKKwkJICAgICAgICBpZiAoYXJnID09ICJyZXNvdXJjZS5uYW1lLnJlZ2V4IikgcmV0dXJuICJmb28iCisJCSAgICAgICAgZWxzZSBpZiAoYXJnID09ICJyZXNvdXJjZS5uYW1lLnJlcGxhY2VtZW50IikgcmV0dXJuICJiYXIiIAorCQkgICAgICAgIGVsc2UgaWYgKGFyZyA9PSAicmVzb3VyY2UubmFtZS5yZXBsYWNlLmFsbCIpIHJldHVybiAiZmFsc2UiCisJCSAgICAgICAgZWxzZSAgcmV0dXJuIG51bGwKKwkJICAgIH1dIGFzIFNlcnZsZXRDb25maWcKKworCQkvL3NlcnZsZXQgY29uZmlnIGlzIHVzZWQgdG8gZmluZCByZXNvdXJjZXMKKwkJc2VydmxldC5pbml0KHNlcnZsZXRDb25maWcpICAgIAorCisJCS8vcmVwbGFjZSBmaXJzdCBmb28gd2l0aCBiYXIgaW4gcmVzb3VyY2VzCisJCWRlZiBjb25uZWN0aW9uID0gc2VydmxldC5nZXRSZXNvdXJjZUNvbm5lY3Rpb24oIi9zb21lZm9vL2ZvbyIpCisJCS8vZXhwZWN0aW5nIGh0dHA6Ly9zb21lYmFyL2ZvbworCQlkZWYgYWN0dWFsID0gY29ubmVjdGlvbi5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpIAorCQlkZWYgZXhwZWN0ZWQgPSBuZXcgVVJMKCJodHRwOi8vc29tZWJhci9mb28iKS50b0V4dGVybmFsRm9ybSgpCisJCWFzc2VydCBhY3R1YWwgPT0gZXhwZWN0ZWQJCQorCX0KKworCS8qKgorCSogVGVzdHMgcmVnZXggc3R5bGUgcmVzb3VyY2UgcmVwbGFjZW1lbnQgZm9yIGFsbCBvY2N1cmVuY2VzLiAKKwkqLyAKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0UmVzb3VyY2VDb25uZWN0aW9uX1JlcGxhY2VBbGxGb29XaXRoQmFyKCkgeworCQlkZWYgc2VydmxldENvbnRleHQgPSBbCisJCSAgICBnZXRSZWFsUGF0aDoge2FyZyAtPiAicmVhbFBhdGgiICsgYXJnfSwgCisJCSAgICBnZXRSZXNvdXJjZToge2FyZyAtPiAKKwkJICAgICAgaWYgKGFyZy5zdGFydHNXaXRoKCIvLyIpKSBhcmc9YXJnLnN1YnN0cmluZygyKQorCQkgICAgICBuZXcgVVJMKCJodHRwOi8vIiArIGFyZykKKwkJfV0gYXMgU2VydmxldENvbnRleHQKKworCQlkZWYgc2VydmxldENvbmZpZyA9IFsKKwkJICAgIGdldFNlcnZsZXRDb250ZXh0OiB7c2VydmxldENvbnRleHR9LCAKKwkJICAgIGdldEluaXRQYXJhbWV0ZXI6IHthcmcgLT4KKwkJICAgICAgICAvL3JlcGxhY2UgYWxsIG9jY3VyZW5jZXMgb2YgZm9vIHJlc291cmNlcyB3aXRoIGJhciByZXNvdXJjZXMKKwkJICAgICAgICBpZiAoYXJnID09ICJyZXNvdXJjZS5uYW1lLnJlZ2V4IikgcmV0dXJuICJmb28iCisJCSAgICAgICAgZWxzZSBpZiAoYXJnID09ICJyZXNvdXJjZS5uYW1lLnJlcGxhY2VtZW50IikgcmV0dXJuICJiYXIiIAorCQkgICAgICAgIGVsc2UgaWYgKGFyZyA9PSAicmVzb3VyY2UubmFtZS5yZXBsYWNlLmFsbCIpIHJldHVybiAidHJ1ZSIKKwkJICAgICAgICBlbHNlICByZXR1cm4gbnVsbAorCQkgICAgfV0gYXMgU2VydmxldENvbmZpZworCisJCS8vc2VydmxldCBjb25maWcgaXMgdXNlZCB0byBmaW5kIHJlc291cmNlcworCQlzZXJ2bGV0LmluaXQoc2VydmxldENvbmZpZykgICAgCisKKwkJLy9yZXBsYWNlIGZpcnN0IGZvbyB3aXRoIGJhciBpbiByZXNvdXJjZXMKKwkJZGVmIGNvbm5lY3Rpb24gPSBzZXJ2bGV0LmdldFJlc291cmNlQ29ubmVjdGlvbigiL3NvbWVmb28vZm9vIikKKwkJLy9leHBlY3RpbmcgaHR0cDovL3NvbWViYXIvZm9vCisJCWRlZiBhY3R1YWwgPSBjb25uZWN0aW9uLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkgCisJCWRlZiBleHBlY3RlZCA9IG5ldyBVUkwoImh0dHA6Ly9zb21lYmFyL2JhciIpLnRvRXh0ZXJuYWxGb3JtKCkKKwkJYXNzZXJ0IGFjdHVhbCA9PSBleHBlY3RlZAkJCisJfQorfQorCisvL3Rlc3Qgc3BlY2lmaWMgc3ViY2xhc3MKK2NsYXNzIENvbmNyZXRlSHR0cFNlcnZsZXQgZXh0ZW5kcyBBYnN0cmFjdEh0dHBTZXJ2bGV0IHt9CisKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvc2VydmxldC9Hcm9vdnlTZXJ2bGV0VGVzdC5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9zZXJ2bGV0L0dyb292eVNlcnZsZXRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhlMjQwOQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvc2VydmxldC9Hcm9vdnlTZXJ2bGV0VGVzdC5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKK3BhY2thZ2UgZ3Jvb3Z5LnNlcnZsZXQ7CisKK2ltcG9ydCBvcmcuam1vY2suTW9jazsKK2ltcG9ydCBvcmcuam1vY2suTW9ja09iamVjdFRlc3RDYXNlOworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29uZmlnOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKKworcHVibGljIGNsYXNzIEdyb292eVNlcnZsZXRUZXN0IGV4dGVuZHMgTW9ja09iamVjdFRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgU2VydmxldENvbmZpZyBjb25maWc7CisgICAgcHJpdmF0ZSBTZXJ2bGV0Q29udGV4dCBjb250ZXh0OworICAgIHByaXZhdGUgR3Jvb3Z5U2VydmxldCBzZXJ2bGV0OworCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgLy90aGlzLmNvbmZpZyA9IChTZXJ2bGV0Q29uZmlnKSBtb2NrKFNlcnZsZXRDb25maWcuY2xhc3MpLnByb3h5KCk7CisgICAgICAgIC8vdGhpcy5jb250ZXh0ID0gKFNlcnZsZXRDb250ZXh0KSBtb2NrKFNlcnZsZXRDb250ZXh0LmNsYXNzKS5wcm94eSgpOworICAgICAgICB0aGlzLnNlcnZsZXQgPSBuZXcgR3Jvb3Z5U2VydmxldCgpOworICAgICAgICAvL3NlcnZsZXQuaW5pdChjb25maWcpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlcXVlc3RHZXRDb21tYW5kT0soKSB7CisgICAgICAgIE1vY2sgcmVxdWVzdE1vY2sgPSBtb2NrKEh0dHBTZXJ2bGV0UmVxdWVzdC5jbGFzcyk7CisgICAgICAgIHJlcXVlc3RNb2NrLmV4cGVjdHMob25jZSgpKS5tZXRob2QoImdldFBhcmFtZXRlciIpLndpdGgoZXEoImNvbW1hbmQiKSkud2lsbChyZXR1cm5WYWx1ZSgiU0VMRUNULi4uIikpOworICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCA9IChIdHRwU2VydmxldFJlcXVlc3QpIHJlcXVlc3RNb2NrLnByb3h5KCk7CisgICAgICAgIFN0cmluZyBjb21tYW5kID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoImNvbW1hbmQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJTRUxFQ1QuLi4iLCBjb21tYW5kKTsKKyAgICB9CisKKyAgICAvLyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VydmljZSgpIHsKKyAgICAvLyAgICAgICAgTW9jayByZXF1ZXN0TW9jayA9IG1vY2soSHR0cFNlcnZsZXRSZXF1ZXN0LmNsYXNzKTsKKyAgICAvLyAgICAgICAgTW9jayByZXNwb25zZU1vY2sgPSBtb2NrKEh0dHBTZXJ2bGV0UmVzcG9uc2UuY2xhc3MpOworICAgIC8vICAgICAgICAKKyAgICAvLyAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QgPSAoSHR0cFNlcnZsZXRSZXF1ZXN0KSByZXF1ZXN0TW9jay5wcm94eSgpOworICAgIC8vICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlID0gKEh0dHBTZXJ2bGV0UmVzcG9uc2UpIHJlc3BvbnNlTW9jay5wcm94eSgpOworICAgIC8vICAgICAgICB0cnkgeworICAgIC8vICAgICAgICAgICAgc2VydmxldC5zZXJ2aWNlKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAvLyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAvLyAgICAgICAgICAgIHQucHJpbnRTdGFja1RyYWNlKCk7CisgICAgLy8gICAgICAgICAgICBmYWlsKHQuZ2V0TWVzc2FnZSgpKTsKKyAgICAvLyAgICAgICAgfQorICAgIC8vICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9zZXJ2bGV0L1NlcnZsZXRCaW5kaW5nVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3NlcnZsZXQvU2VydmxldEJpbmRpbmdUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmY4ZDBmCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9zZXJ2bGV0L1NlcnZsZXRCaW5kaW5nVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwxNzYgQEAKK3BhY2thZ2UgZ3Jvb3Z5LnNlcnZsZXQKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbgoraW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3QKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZQoraW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRPdXRwdXRTdHJlYW0KKworLyoqCisqIFRoaXMgdGVzdCBjYXNlIHRlc3RzIHRoZSBTZXJ2bGV0QmluZGluZyBjbGFzcy4gCisqIAorKiBAYXV0aG9yIEhhbWxldCBEJ0FyY3kKKyovIAorY2xhc3MgU2VydmxldEJpbmRpbmdUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisJZGVmIHNlc3Npb24gPSB7fSBhcyBIdHRwU2Vzc2lvbgorCWRlZiByZXNwb25zZSA9IHt9IGFzIEh0dHBTZXJ2bGV0UmVzcG9uc2UKKwlkZWYgY29udGV4dCA9IHt9IGFzIFNlcnZsZXRDb250ZXh0CisJCisJdm9pZCBzZXRVcCgpIHsKKwkJc3VwZXIuc2V0VXAoKQorCX0KKwkKKwlkZWYgbWFrZURlZmF1bHRCaW5kaW5nID0geyByZXF1ZXN0IC0+CisJCW5ldyBTZXJ2bGV0QmluZGluZygKKwkJICAgIHJlcXVlc3QgYXMgSHR0cFNlcnZsZXRSZXF1ZXN0LCAKKwkJICAgIHJlc3BvbnNlIGFzIEh0dHBTZXJ2bGV0UmVzcG9uc2UsIAorCQkgICAgY29udGV4dCBhcyBTZXJ2bGV0Q29udGV4dAorCQkpCisJfQorCQorCWRlZiBtYWtlRGVmYXVsdFJlcXVlc3QgID0geworCQlbIGdldFNlc3Npb246IHtzZXNzaW9ufSwgCisJCWdldFBhcmFtZXRlck5hbWVzOiB7bmV3IFZlY3RvcigpLmVsZW1lbnRzKCl9LCAKKwkJZ2V0SGVhZGVyTmFtZXM6IHtuZXcgVmVjdG9yKCkuZWxlbWVudHMoKX0gXSBhcyBIdHRwU2VydmxldFJlcXVlc3QKKwl9CisJCisJLyoqCisJKiBUZXN0cyB0aGF0IHRoZSBjb25zdHJ1Y3RvciBiaW5kcyB0aGUgY29ycmVjdCBkZWZhdWx0IHZhcmlhYmxlcy4gCisJKi8KKwl2b2lkIHRlc3RDb25zdHJ1Y3Rvcl9WYXJpYWJsZUJpbmRpbmdzKCkgeworCQlkZWYgcmVxdWVzdCA9IG1ha2VEZWZhdWx0UmVxdWVzdCgpCisJCWRlZiBiaW5kaW5nID0gbWFrZURlZmF1bHRCaW5kaW5nKHJlcXVlc3QpCisJCQorCQlhc3NlcnQgcmVxdWVzdCA9PSBiaW5kaW5nLmdldFZhcmlhYmxlKCJyZXF1ZXN0IikKKwkJYXNzZXJ0IHJlc3BvbnNlID09IGJpbmRpbmcuZ2V0VmFyaWFibGUoInJlc3BvbnNlIikKKwkJYXNzZXJ0IGNvbnRleHQgPT0gYmluZGluZy5nZXRWYXJpYWJsZSgiY29udGV4dCIpCisJCWFzc2VydCBjb250ZXh0ID09IGJpbmRpbmcuZ2V0VmFyaWFibGUoImFwcGxpY2F0aW9uIikKKwkJYXNzZXJ0IHNlc3Npb24gPT0gYmluZGluZy5nZXRWYXJpYWJsZSgic2Vzc2lvbiIpCisJCWFzc2VydFRydWUgYmluZGluZy5nZXRWYXJpYWJsZSgicGFyYW1zIikuaXNFbXB0eSgpCisJCWFzc2VydFRydWUgYmluZGluZy5nZXRWYXJpYWJsZSgiaGVhZGVycyIpLmlzRW1wdHkoKQorCX0KKwkKKwkvKioKKwkqIFRlc3RzIHRoYXQgdGhlIGNvbnN0cnVjdG9yIGJpbmRzIHJlcXVlc3QgcGFyYW1ldGVyIG5hbWVzIGNvcnJlY3RseS4gCisJKi8gCisJdm9pZCB0ZXN0Q29uc3RydWN0b3JfUGFyYW1ldGVyTmFtZUJpbmRpbmdzKCkgeworCisJCWRlZiBwYXJtTmFtZXMgPSBuZXcgVmVjdG9yKCkKKwkJcGFybU5hbWVzLmFkZCgibmFtZTEiKQorCQlwYXJtTmFtZXMuYWRkKCJuYW1lMiIpCisKKwkJZGVmIHJlcXVlc3QgPSBbIAorCQkgICAgZ2V0U2Vzc2lvbjoge3Nlc3Npb259LCAKKwkJCWdldEhlYWRlck5hbWVzOiB7bmV3IFZlY3RvcigpLmVsZW1lbnRzKCl9LCAKKwkJICAgIGdldFBhcmFtZXRlck5hbWVzOiB7cGFybU5hbWVzLmVsZW1lbnRzKCl9LCAKKwkJCWdldFBhcmFtZXRlclZhbHVlczogeyAKKwkJICAgICAgICAvL3ByZXBlbmQgc3RyaW5nIHBhcm0gdG8ga25vd24gdmFsdWUgdG8gc2ltdWxhdGUgYXR0cmlidXRlIG1hcAorCQkgICAgICAgIFN0cmluZ1tdIGFyciA9IG5ldyBTdHJpbmdbMV07IAorCQkgICAgICAgIGFyclswXSA9ICJ2YWx1ZV9mb3JfIiArIGl0CisJCSAgICAgICAgcmV0dXJuIGFycn0gXSBhcyBIdHRwU2VydmxldFJlcXVlc3QKKworCQlkZWYgYmluZGluZyA9IG1ha2VEZWZhdWx0QmluZGluZyhyZXF1ZXN0KQorCisJCWRlZiB2YXJpYWJsZXMgPSBiaW5kaW5nLmdldFZhcmlhYmxlKCJwYXJhbXMiKQorCQlhc3NlcnQgMiA9PSB2YXJpYWJsZXMuc2l6ZSgpCisJCWFzc2VydCAidmFsdWVfZm9yX25hbWUxIiA9PSB2YXJpYWJsZXMuZ2V0KCJuYW1lMSIpCisJCWFzc2VydCAidmFsdWVfZm9yX25hbWUyIiA9PSB2YXJpYWJsZXMuZ2V0KCJuYW1lMiIpCQorCX0KKwkKKwkvKioKKwkqIFRlc3RzIHRoYXQgdGhlIGNvbnN0cnVjdG9yIGJpbmRzIHJlcXVlc3QgaGVhZGVyIHZhbHVlcyBjb3JyZWN0bHkuIAorCSovIAorCXZvaWQgdGVzdENvbnN0cnVjdG9yX0hlYWRlckJpbmRpbmdzKCkgeworCQlkZWYgaGVhZGVyTmFtZXMgPSBuZXcgVmVjdG9yKCkKKwkJaGVhZGVyTmFtZXMuYWRkKCJuYW1lMSIpCisJCWhlYWRlck5hbWVzLmFkZCgibmFtZTIiKQorCisJCWRlZiByZXF1ZXN0ID0gWyAKKwkJICAgIGdldFNlc3Npb246IHtzZXNzaW9ufSwgCisJCSAgICBnZXRQYXJhbWV0ZXJOYW1lczoge25ldyBWZWN0b3IoKS5lbGVtZW50cygpfSwgCisJCSAgICBnZXRIZWFkZXJOYW1lczoge2hlYWRlck5hbWVzLmVsZW1lbnRzKCl9LCAKKwkJICAgIGdldEhlYWRlcjogeyAKKwkJICAgICAgICAvL3ByZXBlbmQgc3RyaW5nIHBhcm0gdG8ga25vd24gdmFsdWUgdG8gc2ltdWxhdGUgYXR0cmlidXRlIG1hcAorCQkgICAgICAgICJ2YWx1ZV9mb3JfIiArIGl0CisJCSAgICAgICAgfSBdIGFzIEh0dHBTZXJ2bGV0UmVxdWVzdAorCisJCWRlZiBiaW5kaW5nID0gbWFrZURlZmF1bHRCaW5kaW5nKHJlcXVlc3QpCisKKwkJZGVmIHZhcmlhYmxlcyA9IGJpbmRpbmcuZ2V0VmFyaWFibGUoImhlYWRlcnMiKQorCQlhc3NlcnQgMiA9PSB2YXJpYWJsZXMuc2l6ZSgpCisJCWFzc2VydCAidmFsdWVfZm9yX25hbWUxIiA9PSB2YXJpYWJsZXMuZ2V0KCJuYW1lMSIpCisJCWFzc2VydCAidmFsdWVfZm9yX25hbWUyIiA9PSB2YXJpYWJsZXMuZ2V0KCJuYW1lMiIpCQkKKwl9CisJCisJLyoqCisJKiBUZXN0cyB0aGUgYXJndW1lbnQgY29udHJhY3Qgb24gZ2V0VmFyaWFibGUuIAorCSovIAorCXZvaWQgdGVzdEdldFZhcmlhYmxlX0NvbnRyYWN0KCkgeworCQkKKwkJZGVmIHJlcXVlc3QgPSBtYWtlRGVmYXVsdFJlcXVlc3QoKQorCQlkZWYgYmluZGluZyA9IG1ha2VEZWZhdWx0QmluZGluZyhyZXF1ZXN0KQorCQkKKwkJc2hvdWxkRmFpbChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24pIHsgYmluZGluZy5nZXRWYXJpYWJsZShudWxsKSB9CisJCXNob3VsZEZhaWwoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKSB7IGJpbmRpbmcuZ2V0VmFyaWFibGUoIiIpIH0KKwl9CisKKwkvKioKKwkqIFRlc3RzIHRoYXQgZ2V0VmFyaWFibGUgd29ya3MgZm9yIHRoZSBzcGVjaWFsIGtleSBuYW1lcy4gCisJKi8gCisJdm9pZCB0ZXN0R2V0VmFyaWFibGVfSW1wbGljaXRLZXlOYW1lcygpIHsKKwkJCisJCWRlZiB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIobmV3IFN0cmluZ1dyaXRlcigpKQorCQlkZWYgb3V0cHV0U3RyZWFtID0gbmV3IE91dHB1dFN0cmVhbVN0dWIoKQorCisJCWRlZiByZXNwb25zZSA9IFsKKwkJICAgIGdldFdyaXRlcjoge3dyaXRlcn0sIAorCQkgICAgZ2V0T3V0cHV0U3RyZWFtOiB7b3V0cHV0U3RyZWFtfSBdIGFzIEh0dHBTZXJ2bGV0UmVzcG9uc2UKKworCQlkZWYgcmVxdWVzdCA9IG1ha2VEZWZhdWx0UmVxdWVzdCgpCisKKwkJZGVmIGJpbmRpbmcgPSBuZXcgU2VydmxldEJpbmRpbmcoCisJCSAgICByZXF1ZXN0IGFzIEh0dHBTZXJ2bGV0UmVxdWVzdCwgCisJCSAgICByZXNwb25zZSBhcyBIdHRwU2VydmxldFJlc3BvbnNlLCAKKwkJICAgIGNvbnRleHQgYXMgU2VydmxldENvbnRleHQKKwkJKQorCisJCWFzc2VydCB3cml0ZXIgPT0gYmluZGluZy5nZXRWYXJpYWJsZSgib3V0IikKKwkJYXNzZXJ0IGJpbmRpbmcuZ2V0VmFyaWFibGUoImh0bWwiKSBpbnN0YW5jZW9mIGdyb292eS54bWwuTWFya3VwQnVpbGRlcgorCQlhc3NlcnQgb3V0cHV0U3RyZWFtID09IGJpbmRpbmcuZ2V0VmFyaWFibGUoInNvdXQiKQorCX0KKwkKKwkvKioKKwkqIFRlc3RzIHRoZSBjb250cmFjdCBvbiBzZXRWYXJpYmxlKCkuIAorCSovIAorCXZvaWQgdGVzdFNldFZhcmlhYmxlX0NvbnRyYWN0KCkgeworCQkKKwkJZGVmIHJlcXVlc3QgPSBtYWtlRGVmYXVsdFJlcXVlc3QoKQorCQlkZWYgYmluZGluZyA9IG1ha2VEZWZhdWx0QmluZGluZyhyZXF1ZXN0KQorCQkKKwkJc2hvdWxkRmFpbChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24pIHsgYmluZGluZy5zZXRWYXJpYWJsZShudWxsLCBudWxsKSB9CisJCXNob3VsZEZhaWwoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKSB7IGJpbmRpbmcuc2V0VmFyaWFibGUoIiIsIG51bGwpIH0KKwkJc2hvdWxkRmFpbChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24pIHsgYmluZGluZy5zZXRWYXJpYWJsZSgib3V0IiwgbnVsbCkgfQorCQlzaG91bGRGYWlsKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbikgeyBiaW5kaW5nLnNldFZhcmlhYmxlKCJzb3V0IiwgbnVsbCkgfQorCQlzaG91bGRGYWlsKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbikgeyBiaW5kaW5nLnNldFZhcmlhYmxlKCJodG1sIiwgbnVsbCkgfQkJCisJfQorCQorCS8qKgorCSogVGVzdHMgc2V0VmFyaWFibGUuIAorCSovIAorCXZvaWQgdGVzdFNldFZhcmlhYmxlKCkgeworCQlkZWYgcmVxdWVzdCA9IG1ha2VEZWZhdWx0UmVxdWVzdCgpCisJCWRlZiBiaW5kaW5nID0gbWFrZURlZmF1bHRCaW5kaW5nKHJlcXVlc3QpCisJCQorCQliaW5kaW5nLnNldFZhcmlhYmxlKCJ2YXJfbmFtZSIsICJ2YXJfdmFsdWUiKQorCQlkZWYgdmFyaWFibGVzID0gYmluZGluZy5nZXRWYXJpYWJsZXMoKQorCQlhc3NlcnQgInZhcl92YWx1ZSIgPT0gdmFyaWFibGVzLmdldCgidmFyX25hbWUiKQorCX0KK30KKworLyoqCisqIFRlc3Qgc3BlY2lmaWMgc3ViIGNsYXNzIHRvIHN0dWIgb3V0IHRoZSBTZXJ2bGV0T3V0cHV0U3RyZWFtIGNsYXNzLiAKKyovIAorY2xhc3MgT3V0cHV0U3RyZWFtU3R1YiBleHRlbmRzIFNlcnZsZXRPdXRwdXRTdHJlYW0geworICAgIHZvaWQgd3JpdGUoaW50IHgpIHsgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3NxbC9Hcm9vdnlSb3dSZXN1bHRUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvc3FsL0dyb292eVJvd1Jlc3VsdFRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMjdhOWQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3NxbC9Hcm9vdnlSb3dSZXN1bHRUZXN0Lmdyb292eQpAQCAtMCwwICsxLDExNiBAQAorcGFja2FnZSBncm9vdnkuc3FsDQorDQoraW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwDQorDQorY2xhc3MgR3Jvb3Z5Um93UmVzdWx0VGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsNCisNCisgICAgdm9pZCB0ZXN0TWFwKCkgew0KKyAgICAgICAgZGVmIHJvdyA9IGNyZWF0ZVJvdygpOw0KKyAgICAgICAgZGVmIHJvdzIgPSBjcmVhdGVSb3coKTsNCisgICAgICAgIA0KKyAgICAgICAgLyoqDQorICAgICAgICAgKiBUZXN0IGZvciBpbXBsZW1lbnRpbmcgTWFwDQorICAgICAgICAgKi8gDQorICAgICAgICBhc3NlcnQgcm93IGluc3RhbmNlb2YgTWFwLCAiR3Jvb3Z5Um93UmVzdWx0IGRvZXNuJ3QgaW1wbGVtZW50IE1hcCBpbnRlcmZhY2UiDQorICAgICAgICANCisgICAgICAgIC8qKg0KKyAgICAgICAgICogVGVzdCBmb3IgcHV0IGFuZCBhY2Nlc3NpbmcgdGhlIG5ldyBwcm9wZXJ0eQ0KKyAgICAgICAgICovIA0KKyAgICAgICAgcm93LnB1dCgiam9obiIsIkRvZSIpDQorICAgICAgICBhc3NlcnQgcm93LmpvaG49PSJEb2UiDQorICAgICAgICBhc3NlcnQgcm93WyJqb2huIl09PSJEb2UiDQorICAgICAgICBhc3NlcnQgcm93Wydqb2huJ109PSdEb2UnDQorICAgICAgICBhc3NlcnQgcm93LmNvbnRhaW5zS2V5KCJqb2huIikNCisgICAgICAgIGFzc2VydCAhcm93Mi5jb250YWluc0tleSgiam9obiIpDQorICAgICAgICBhc3NlcnQgcm93LmNvbnRhaW5zVmFsdWUoIkRvZSIpDQorICAgICAgICBhc3NlcnQgIXJvdzIuY29udGFpbnNLZXkoIkRvZSIpDQorDQorICAgICAgICAvKioNCisgICAgICAgICAqIFRlc3QgZm9yIGVxdWFsaXR5ICgxKSBhbmQgc2l6ZQ0KKyAgICAgICAgICovIA0KKyAgICAgICAgYXNzZXJ0IHJvdyE9cm93MiwgInJvd3MgdW5leHBlY3RlZGx5IGVxdWFsIg0KKyAgICAgICAgYXNzZXJ0IHJvdy5zaXplKCk9PTcNCisgICAgICAgIGFzc2VydCByb3cyLnNpemUoKT09Ng0KKyAgICAgICAgDQorICAgICAgICAvKioNCisgICAgICAgICAqIFRlc3QgZm9yIHJlbW92ZSwgZXF1YWxpdHkgKDIpIGFuZCBpc0VtcHR5ICgxKQ0KKyAgICAgICAgICovIA0KKyAgICAgICAgcm93LnJlbW92ZSgiam9obiIpICAgICAgICANCisgICAgICAgIGFzc2VydCByb3c9PXJvdzIsICJyb3dzIGRpZmZlcmVudCBhZnRlciByZW1vdmUiDQorICAgICAgICBhc3NlcnQgIXJvdy5pc0VtcHR5KCksICJyb3cgZW1wdHkgYWZ0ZXIgcmVtb3ZlIg0KKyAgICAgICAgDQorICAgICAgICAvKioNCisgICAgICAgICAqIFRlc3QgZm9yIGNsZWFyLCBlcXVhbGl0eSAoMykgYW5kIGlzRW1wdHkgKDIpDQorICAgICAgICAgKi8gDQorICAgICAgICByb3cuY2xlYXIoKQ0KKyAgICAgICAgcm93Mi5jbGVhcigpDQorICAgICAgICBhc3NlcnQgcm93PT1yb3cyLCAicm93cyBkaWZmZXJlbnQgYWZ0ZXIgY2xlYXIiDQorICAgICAgICBhc3NlcnQgcm93LmlzRW1wdHkoKSwgInJvdyBub3QgZW1wdHkgYWZ0ZXIgY2xlYXIiDQorICAgIH0NCisgICAgDQorICAgIHZvaWQgdGVzdFByb3BlcnRpZXMoKSB7DQorICAgICAgICBkZWYgcm93ID0gY3JlYXRlUm93KCkNCisgICAgICAgIGFzc2VydCByb3cubWlYZWQgPT0gInF1aWNrIg0KKyAgICAgICAgYXNzZXJ0IHJvdy5sb3dlciA9PSAiYnJvd24iDQorICAgICAgICBhc3NlcnQgcm93LnVwcGVyID09ICJmb3giDQorICAgICAgICBhc3NlcnQgcm93LlVQUEVSID09ICJmb3giDQorICAgICAgICANCisgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgYXNzZXJ0IHJvdy5MT1dFUiA9PSAiYnJvd24iDQorICAgICAgICAgICAgYXNzZXJ0IGZhbHNlDQorICAgICAgICB9IGNhdGNoIChNaXNzaW5nUHJvcGVydHlFeGNlcHRpb24gbXBlKSB7DQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KKyAgICAgICAgICAgIGFzc2VydCBmYWxzZQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICBwcmludGxuIHJvdy5mb28NCisgICAgICAgICAgICBhc3NlcnQgZmFsc2UNCisgICAgICAgIH0gY2F0Y2ggKE1pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbiBtcGUpIHsNCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQorICAgICAgICAgICAgYXNzZXJ0IGZhbHNlDQorICAgICAgICB9DQorDQorICAgICAgICAvKioNCisgICAgICAgICAqIFRoaXMgaXMgZm9yIEdST09WWS0xMjk2DQorICAgICAgICAgKi8NCisgICAgICAgIGFzc2VydCByb3cubnVsbE1peGVkPT1udWxsDQorICAgICAgICBhc3NlcnQgcm93WzFdPT1udWxsDQorICAgICAgICBhc3NlcnQgcm93Lm51bGxsb3dlcj09bnVsbA0KKyAgICAgICAgYXNzZXJ0IHJvd1szXT09bnVsbA0KKyAgICAgICAgYXNzZXJ0IHJvdy5OVUxMVVBQRVI9PW51bGwNCisgICAgICAgIGFzc2VydCByb3dbNV09PW51bGwNCisgICAgICAgIA0KKyAgICB9IA0KKyAgICANCisgICAgdm9pZCB0ZXN0T3JkZXIoKSB7DQorICAgICAgICBkZWYgcm93ID0gY3JlYXRlUm93KCkNCisgICAgICAgIGFzc2VydCByb3dbMF0gPT0gInF1aWNrIiANCisgICAgICAgIGFzc2VydCByb3dbMV0gPT0gbnVsbCANCisgICAgICAgIGFzc2VydCByb3dbMl0gPT0gImJyb3duIiANCisgICAgICAgIGFzc2VydCByb3dbM10gPT0gbnVsbCANCisgICAgICAgIGFzc2VydCByb3dbNF0gPT0gImZveCIgDQorICAgICAgICBhc3NlcnQgcm93WzVdID09IG51bGwgDQorICAgICAgICBhc3NlcnQgcm93WzI3XSA9PSBudWxsIA0KKyAgICAgICAgYXNzZXJ0IHJvd1stMV0gPT0gbnVsbCANCisgICAgICAgIGFzc2VydCByb3dbLTJdID09ICJmb3giIA0KKyAgICB9DQorDQorICAgIHByb3RlY3RlZCBkZWYgY3JlYXRlUm93KCkgew0KKyAgICAgICAgZGVmIG1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwKCkNCisgICAgICAgIGFzc2VydCBtYXAgIT0gbnVsbCAsICJmYWlsZWQgdG8gbG9hZCBMaW5rZWRIYXNoTWFwIGNsYXNzIg0KKw0KKyAgICAgICAgbWFwLnB1dCgibWlYZWQiLCAicXVpY2siKQ0KKyAgICAgICAgbWFwLnB1dCgibnVsbE1peGVkIiwgbnVsbCkNCisgICAgICAgIG1hcC5wdXQoImxvd2VyIiwgImJyb3duIikNCisgICAgICAgIG1hcC5wdXQoIm51bGxsb3dlciIsIG51bGwpDQorICAgICAgICBtYXAucHV0KCJVUFBFUiIsICJmb3giKQ0KKyAgICAgICAgbWFwLnB1dCgiTlVMTFVQUEVSIiwgbnVsbCkNCisNCisgICAgICAgIGRlZiByb3cgPSBuZXcgR3Jvb3Z5Um93UmVzdWx0KG1hcCkNCisgICAgICAgIGFzc2VydCByb3cgIT0gbnVsbCAsICJmYWlsZWQgdG8gbG9hZCBHcm9vdnlSb3dSZXN1bHQgY2xhc3MiDQorDQorICAgICAgICByZXR1cm4gcm93DQorICAgIH0NCisgICAgDQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvc3FsL1BlcnNvbi5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3NxbC9QZXJzb24uZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkY2ZmOTAKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3NxbC9QZXJzb24uZ3Jvb3Z5CkBAIC0wLDAgKzEsOCBAQAorcGFja2FnZSBncm9vdnkuc3FsCisKK2NsYXNzIFBlcnNvbiB7CisKKyAgICBkZWYgZmlyc3ROYW1lCisgICAgZGVmIGxhc3ROYW1lCisgICAgZGVmIGFnZQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9zcWwvUGVyc29uVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3NxbC9QZXJzb25UZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGU0N2E5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9zcWwvUGVyc29uVGVzdC5ncm9vdnkKQEAgLTAsMCArMSw2MSBAQAorcGFja2FnZSBncm9vdnkuc3FsCisKK2ltcG9ydCBqYXZheC5zcWwuRGF0YVNvdXJjZQorCitjbGFzcyBQZXJzb25UZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgZGVmIHR5cGUKKyAgICAKKyAgICB2b2lkIHRlc3RGb28oKSB7CisgICAgICAgIGRlZiBwZXJzb25zID0gY3JlYXRlRGF0YVNldCgpCisJCQorICAgICAgICBkZWYgYmxvZ3MgPSBwZXJzb25zLmZpbmRBbGwgeyBpdC5sYXN0TmFtZSA9PSAiQmxvZ2dzIiB9CisJCQorICAgICAgICBhc3NlcnRTcWwoYmxvZ3MsICJzZWxlY3QgKiBmcm9tIHBlcnNvbiB3aGVyZSBsYXN0TmFtZSA9ID8iLCBbJ0Jsb2dncyddKQorICAgIH0KKworICAgIHZvaWQgdGVzdFdoZXJlV2l0aEFuZENsYXVzZSgpIHsKKyAgICAgICAgZGVmIHBlcnNvbnMgPSBjcmVhdGVEYXRhU2V0KCkKKyAgICAgICAgZGVmIGJsb2dzID0gcGVyc29ucy5maW5kQWxsIHsgaXQubGFzdE5hbWUgPT0gIkJsb2dncyIgfQorICAgICAgICBkZWYgYmlnQmxvZ3MgPSBibG9ncy5maW5kQWxsIHsgaXQuc2l6ZSA+IDEwMCB9CisgICAgICAgIGFzc2VydFNxbChiaWdCbG9ncywgInNlbGVjdCAqIGZyb20gcGVyc29uIHdoZXJlIGxhc3ROYW1lID0gPyBhbmQgc2l6ZSA+ID8iLCBbJ0Jsb2dncycsIDEwMF0pCisgICAgfQorCisgICAgdm9pZCB0ZXN0V2hlcmVDbG9zdXJlV2l0aEFuZCgpIHsKKyAgICAgICAgZGVmIHBlcnNvbnMgPSBjcmVhdGVEYXRhU2V0KCkKKyAgICAgICAgZGVmIGJsb2dzID0gcGVyc29ucy5maW5kQWxsIHsgaXQuc2l6ZSA8IDEwICYmIGl0Lmxhc3ROYW1lID09ICJCbG9nZ3MiIH0KKyAgICAgICAgYXNzZXJ0U3FsKGJsb2dzLCAic2VsZWN0ICogZnJvbSBwZXJzb24gd2hlcmUgKHNpemUgPCA/IGFuZCBsYXN0TmFtZSA9ID8pIiwgWzEwLCAnQmxvZ2dzJ10pCisgICAgfQorIAorICAgIHByb3RlY3RlZCBkZWYgY29tcGFyZUZuKHZhbHVlKSB7CisgICAgICAgIHZhbHVlID4gMSAmJiB2YWx1ZSA8IDEwCisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCBkZWYgYXNzZXJ0U3FsKGRhdGFTZXQsIGV4cGVjdGVkU3FsLCBleHBlY3RlZFBhcmFtcykgeworICAgICAgICBkZWYgc3FsID0gZGF0YVNldC5zcWwKKyAgICAgICAgZGVmIHBhcmFtcyA9IGRhdGFTZXQucGFyYW1ldGVycworICAgICAgICBhc3NlcnQgc3FsID09IGV4cGVjdGVkU3FsCisgICAgICAgIGFzc2VydCBwYXJhbXMgPT0gZXhwZWN0ZWRQYXJhbXMKKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIERhdGFTb3VyY2UgY3JlYXRlRGF0YVNvdXJjZSgpIHsKKyAgICAgICAgZGVmIGRzID0gbmV3IG9yZy5oc3FsZGIuamRiYy5qZGJjRGF0YVNvdXJjZSgpCisgICAgICAgIGRzLmRhdGFiYXNlID0gImpkYmM6aHNxbGRiOm1lbTpmb28iICsgZ2V0TWV0aG9kTmFtZSgpCisgICAgICAgIGRzLnVzZXIgPSAnc2EnCisgICAgICAgIGRzLnBhc3N3b3JkID0gJycKKyAgICAgICAgcmV0dXJuIGRzCisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCBkZWYgY3JlYXRlRGF0YVNldCgpIHsKKyAgICAgICAgZGVmIHR5cGUgPSBQZXJzb24KKworICAgICAgICBhc3NlcnQgdHlwZSAhPSBudWxsICwgImZhaWxlZCB0byBsb2FkIFBlcnNvbiBjbGFzcyIKKworICAgICAgICBkZWYgZGF0YVNvdXJjZSA9IGNyZWF0ZURhdGFTb3VyY2UoKQorICAgICAgICBkZWYgc3FsID0gbmV3IFNxbChkYXRhU291cmNlKQorCisgICAgICAgIHJldHVybiBzcWwuZGF0YVNldCh0eXBlKQorICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3NxbC9TcWxDb21wbGV0ZVRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9zcWwvU3FsQ29tcGxldGVUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGU4YWE1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9zcWwvU3FsQ29tcGxldGVUZXN0Lmdyb292eQpAQCAtMCwwICsxLDE0MyBAQAorcGFja2FnZSBncm9vdnkuc3FsCisKK2NsYXNzIFNxbENvbXBsZXRlVGVzdCBleHRlbmRzIFRlc3RIZWxwZXIgeworCisgICAgdm9pZCB0ZXN0U3FsUXVlcnkoKSB7CisgICAgICAgIGRlZiBzcWwgPSBjcmVhdGVTcWwoKQorICAgICAgICBkZWYgcmVzdWx0cyA9IFs6XQorICAgICAgICBzcWwuZWFjaFJvdygic2VsZWN0ICogZnJvbSBQRVJTT04iKSB7IHJlc3VsdHMucHV0KGl0LmZpcnN0bmFtZSwgaXQubGFzdG5hbWUpIH0KKyAgICAgICAgZGVmIGV4cGVjdGVkID0gWyJKYW1lcyI6IlN0cmFjaGFuIiwgIkJvYiI6Ik1jd2hpcnRlciIsICJTYW0iOiJQdWxsYXJhIl0KKyAgICAgICAgYXNzZXJ0IHJlc3VsdHMgPT0gZXhwZWN0ZWQKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0U3FsUXVlcnlXaXRoV2hlcmVDbGF1c2UoKSB7CisgICAgICAgIGRlZiBzcWwgPSBjcmVhdGVTcWwoKQorICAgICAgICBkZWYgZm9vID0gImRyaW5rIgorICAgICAgICBkZWYgcmVzdWx0cyA9IFtdCisgICAgICAgIHNxbC5lYWNoUm93KCJzZWxlY3QgKiBmcm9tIEZPT0Qgd2hlcmUgdHlwZT0ke2Zvb30iKSB7IHJlc3VsdHMuYWRkKGl0Lm5hbWUpIH0KKyAgICAgICAgZGVmIGV4cGVjdGVkID0gWyJiZWVyIiwgImNvZmZlZSJdCisgICAgICAgIGFzc2VydCByZXN1bHRzID09IGV4cGVjdGVkCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdFNxbFF1ZXJ5V2l0aFdoZXJlQ2xhdXNlV2l0aDJBcmd1bWVudHMoKSB7CisgICAgICAgIGRlZiBzcWwgPSBjcmVhdGVTcWwoKQorICAgICAgICBkZWYgZm9vID0gImNoZWVzZSIKKyAgICAgICAgZGVmIGJhciA9ICJlZGFtIgorICAgICAgICBkZWYgcmVzdWx0cyA9IFtdCisgICAgICAgIHNxbC5lYWNoUm93KCJzZWxlY3QgKiBmcm9tIEZPT0Qgd2hlcmUgdHlwZT0ke2Zvb30gYW5kIG5hbWUgIT0gJHtiYXJ9IikgeyByZXN1bHRzLmFkZChpdC5uYW1lKSB9CisgICAgICAgIGRlZiBleHBlY3RlZCA9IFsiYnJpZSIsICJjaGVkZGFyIl0KKyAgICAgICAgYXNzZXJ0IHJlc3VsdHMgPT0gZXhwZWN0ZWQKKyAgICB9CisKKyAgICB2b2lkIHRlc3RTcWxRdWVyeVdpdGgyUGFyYW1ldGVyc1VzaW5nUXVlc3Rpb25NYXJrTm90YXRpb24oKSB7CisgICAgICAgIGRlZiBzcWwgPSBjcmVhdGVTcWwoKQorICAgICAgICBkZWYgcmVzdWx0cyA9IFtdCisgICAgICAgIHNxbC5lYWNoUm93KCJzZWxlY3QgKiBmcm9tIEZPT0Qgd2hlcmUgdHlwZT0/IGFuZCBuYW1lICE9ID8iLCBbImNoZWVzZSIsICJlZGFtIl0pIHsgcmVzdWx0cy5hZGQoaXQubmFtZSkgfQorICAgICAgICBkZWYgZXhwZWN0ZWQgPSBbImJyaWUiLCAiY2hlZGRhciJdCisgICAgICAgIGFzc2VydCByZXN1bHRzID09IGV4cGVjdGVkCisgICAgfQorCisgICAgdm9pZCB0ZXN0RGF0YVNldCgpIHsKKyAgICAgICAgZGVmIHNxbCA9IGNyZWF0ZVNxbCgpCisgICAgICAgIGRlZiByZXN1bHRzID0gW10KKyAgICAgICAgZGVmIHBlb3BsZSA9IHNxbC5kYXRhU2V0KCJQRVJTT04iKQorICAgICAgICBwZW9wbGUuZWFjaCB7IHJlc3VsdHMuYWRkKGl0LmZpcnN0bmFtZSkgfQorICAgICAgICBkZWYgZXhwZWN0ZWQgPSBbIkphbWVzIiwgIkJvYiIsICJTYW0iXQorICAgICAgICBhc3NlcnQgcmVzdWx0cyA9PSBleHBlY3RlZAorICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3REYXRhU2V0V2l0aENsb3N1cmVQcmVkaWNhdGUoKSB7CisgICAgICAgIGRlZiBzcWwgPSBjcmVhdGVTcWwoKQorICAgICAgICBkZWYgcmVzdWx0cyA9IFtdCisgICAgICAgIGRlZiBmb29kID0gc3FsLmRhdGFTZXQoIkZPT0QiKQorICAgICAgICBmb29kLmZpbmRBbGwgeyBpdC50eXBlID09ICJjaGVlc2UiIH0uZWFjaCB7IHJlc3VsdHMuYWRkKGl0Lm5hbWUpIH0KKyAgICAgICAgZGVmIGV4cGVjdGVkID0gWyJlZGFtIiwgImJyaWUiLCAiY2hlZGRhciJdCisgICAgICAgIGFzc2VydCByZXN1bHRzID09IGV4cGVjdGVkCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdFVwZGF0aW5nRGF0YVNldCgpIHsKKyAgICAgICAgZGVmIHNxbCA9IGNyZWF0ZVNxbCgpCisgICAgICAgIGRlZiByZXN1bHRzID0gW10KKyAgICAgICAgZGVmIGZlYXR1cmVzID0gc3FsLmRhdGFTZXQoIkZFQVRVUkUiKQorICAgICAgICBmZWF0dXJlcy5lYWNoIHsKKyAgICAgICAgICAgIC8qKiBAdG9kbyBIU1FMREIgZG9lc24ndCB5ZXQgc3VwcG9ydCBSZXN1bHRTZXQgdXBkYXRpbmcKKyAgICAgICAgICAgIGlmIChpdC5pZCA9PSAxKSB7CisgICAgICAgICAgICAgICAgaXQubmFtZSA9IGl0Lm5hbWUgKyAiIFJvY2tzISIKKyAgICAgICAgICAgICAgICBwcmludGxuKCJDaGFuZ2luZyBuYW1lIHRvICR7aXQubmFtZX0iKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHJlc3VsdHMuYWRkKGl0Lm5hbWUpCisgICAgICAgIH0KKyAgICAgICAgZGVmIGV4cGVjdGVkID0gWyJHRE8iLCAiR1BhdGgiLCAiR3Jvb3Z5TWFya3VwIl0KKyAgICAgICAgYXNzZXJ0IHJlc3VsdHMgPT0gZXhwZWN0ZWQKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0R1N0cmluZ1RvU3FsQ29udmVyc2lvbigpeworICAgICAgIGRlZiBmb28gPSAnbG9pbmNsb3RoJworICAgICAgIGRlZiBiYXIgPSAnd2FzdGViYW5kJworICAgICAgIGRlZiBzcWwgPSBjcmVhdGVTcWwoKQorICAgICAgIGRlZiBleHBlY3RlZCA9ICJBIG5hcnJvdyA/IHN1cHBvcnRlZCBieSBhID8hISIKKyAgICAgICBkZWYgZ3N0cmluZyA9ICJBIG5hcnJvdyAke2Zvb30gc3VwcG9ydGVkIGJ5IGEgJHtiYXJ9ISEiCisgICAgICAgZGVmIHJlc3VsdCA9IHNxbC5hc1NxbChnc3RyaW5nLCBnc3RyaW5nLnZhbHVlcy50b0xpc3QoKSkKKyAgICAgICBhc3NlcnQgcmVzdWx0ID09IGV4cGVjdGVkCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdEV4ZWN1dGVVcGRhdGUoKXsKKyAgICAgICAgZGVmIGZvbz0nZm9vZC1kcmluaycKKyAgICAgICAgZGVmIGZvb2QgPSAnZm9vZCcKKyAgICAgICAgZGVmIGRyaW5rID0gJ2RyaW5rJworICAgICAgICBkZWYgYmFyPSdndWlubmVzcycKKyAgICAgICAgZGVmIHNxbCA9IGNyZWF0ZVNxbCgpOworICAgICAgICBkZWYgZXhwZWN0ZWQgPSAwCisgICAgICAgIGRlZiByZXN1bHQgPSBzcWwuZXhlY3V0ZVVwZGF0ZSgidXBkYXRlIEZPT0Qgc2V0IHR5cGU9PyB3aGVyZSBuYW1lPT8iLFtmb28sYmFyXSk7CisgICAgICAgIGFzc2VydCByZXN1bHQgPT0gZXhwZWN0ZWQKKyAgICAgICAgZXhwZWN0ZWQgID0gMQorICAgICAgICByZXN1bHQgPSBzcWwuZXhlY3V0ZVVwZGF0ZSgiaW5zZXJ0IGludG8gRk9PRCAodHlwZSxuYW1lKSB2YWx1ZXMgKCR7Zm9vZH0sJHtiYXJ9KSIpOworICAgIAlhc3NlcnQgcmVzdWx0ID09IGV4cGVjdGVkCisgICAgICAgIHJlc3VsdCA9IHNxbC5leGVjdXRlVXBkYXRlKCJpbnNlcnQgaW50byBGT09EICh0eXBlLG5hbWUpIHZhbHVlcyAoJHtkcmlua30sJHtiYXJ9KSIpOworICAgIAlhc3NlcnQgcmVzdWx0ID09IGV4cGVjdGVkCisgICAgICAgIHJlc3VsdCA9IHNxbC5leGVjdXRlVXBkYXRlKCJpbnNlcnQgaW50byBGT09EICh0eXBlLG5hbWUpIHZhbHVlcyAoJ2RyaW5rJywnZ3Vpbm5lc3MnKSIpOworICAgIAlhc3NlcnQgcmVzdWx0ID09IGV4cGVjdGVkCisgICAgICAgIGV4cGVjdGVkID0gMworICAgICAgICByZXN1bHQgPSBzcWwuZXhlY3V0ZVVwZGF0ZSgidXBkYXRlIEZPT0Qgc2V0IHR5cGU9PyB3aGVyZSBuYW1lPT8iLFtmb28sYmFyXSk7CisgICAgICAgIGFzc2VydCByZXN1bHQgPT0gZXhwZWN0ZWQKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0Rmlyc3RSb3coKSB7CisgICAgICBkZWYgc3FsID0gY3JlYXRlU3FsKCk7CisgICAgICBkZWYgcm93ID0gc3FsLmZpcnN0Um93KCJzZWxlY3QgKiBmcm9tIEZPT0Qgd2hlcmUgdHlwZT0/IGFuZCBuYW1lPT8iLCBbImNoZWVzZSIsICJlZGFtIl0pCisgICAgICBhc3NlcnQgcm93LnR5cGUgPT0gImNoZWVzZSIKKyAgICB9CisgICAgCisgICAgLyoqIFdoZW4gbm8gcmVzdWx0cywgZmlyc3RSb3cgc2hvdWxkIHJldHVybiBudWxsICovCisgICAgdm9pZCB0ZXN0Rmlyc3RSb3dOb1Jlc3VsdHMoKSB7CisgICAgICBkZWYgc3FsID0gY3JlYXRlU3FsKCk7CisgICAgICBkZWYgcm93ID0gc3FsLmZpcnN0Um93KCJzZWxlY3QgKiBmcm9tIEZPT0Qgd2hlcmUgdHlwZT0/IiwgWyJub3RoaW5nIl0pCisgICAgICBhc3NlcnQgcm93ID09IG51bGwKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0RGF0YVNldFdpdGhSb3dzKCl7CisgICAgICBkZWYgc3FsID0gY3JlYXRlU3FsKCkKKyAgICAgIGRlZiBkYXRhU2V0ID0gbmV3IERhdGFTZXQoc3FsLCJGT09EIikKKyAgICAgIGRlZiByb3dzID0gZGF0YVNldC5yb3dzKCkKKworICAgICAgLy9FeHBlY3RlZCBuYW1lcyBvZiB0aGUgZm9vZCBpdGVtcworICAgICAgZGVmIGV4cGVjdGVkID0gWyJlZGFtIiwgImJyaWUiLCAiY2hlZGRhciIsICJiZWVyIiwgImNvZmZlZSJdCisgICAgICAgICAKKyAgICAgIC8vQ2hlY2tpbmcgdG8gbWFrZSBzdXJlIEkgZ290IG9uZSBpdGVtIGJhY2sKKyAgICAgIGFzc2VydCByb3dzLnNpemUoKSA9PSA1CisgICAgICBkZWYgcmVzdWx0cyA9IFtdCisgICAgICByb3dzLmVhY2h7cmVzdWx0cy5hZGQoaXQubmFtZSl9CisKKyAgICAgIC8vQ2hlY2tpbmcgdG8gbWFrZSBzdXJlIHRoZSByZXN1bHRzIHJldHJpZXZlZCBtYXRjaCB0aGUgZXhwZWN0ZWQgcmVzdWx0cworICAgICAgYXNzZXJ0IHJlc3VsdHMgPT0gZXhwZWN0ZWQKKyAgICB9CisgICAgICAgIAorICAgIHZvaWQgdGVzdERhdGFTZXRXaXRoRmlyc3RSb3coKXsKKyAgICAgIGRlZiBzcWwgPSBjcmVhdGVTcWwoKQorICAgICAgZGVmIGRhdGFTZXQgPSBuZXcgRGF0YVNldChzcWwsIkZPT0QiKQorICAgICAgZGVmIHJlc3VsdCA9IGRhdGFTZXQuZmlyc3RSb3coKQorICAgICAgYXNzZXJ0IHJlc3VsdCE9bnVsbAorICAgICAgYXNzZXJ0IHJlc3VsdFsibmFtZSJdPT0iZWRhbSIKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3NxbC9TcWxDb21wbGV0ZVdpdGhvdXREYXRhU291cmNlVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3NxbC9TcWxDb21wbGV0ZVdpdGhvdXREYXRhU291cmNlVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZiZDExYQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvc3FsL1NxbENvbXBsZXRlV2l0aG91dERhdGFTb3VyY2VUZXN0Lmdyb292eQpAQCAtMCwwICsxLDE2IEBACitwYWNrYWdlIGdyb292eS5zcWwKKworaW1wb3J0IGphdmEuc3FsLkRyaXZlck1hbmFnZXIKKworLyoqCisgKiBUZXN0cyB0aGUgdXNlIG9mIHRoZSBTcWwgY2xhc3MgdXNpbmcganVzdCBhIENvbm5lY3Rpb24gCisgKiByYXRoZXIgdGhhbiBhIERhdGFTb3VyY2UKKyAqLworY2xhc3MgU3FsQ29tcGxldGVXaXRob3V0RGF0YVNvdXJjZVRlc3QgZXh0ZW5kcyBTcWxDb21wbGV0ZVRlc3QgeworICAgIAorICAgIHByb3RlY3RlZCBkZWYgbmV3U3FsKFN0cmluZyB1cmkpIHsKKyAgICAgICAgZGVmIGRyaXZlciA9IG9yZy5oc3FsZGIuamRiY0RyaXZlcgorICAgICAgICBwcmludGxuKCJMb2FkaW5nIGRyaXZlciAke2RyaXZlcn0iKQorICAgICAgICByZXR1cm4gbmV3IFNxbChEcml2ZXJNYW5hZ2VyLmdldENvbm5lY3Rpb24odXJpKSkKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3NxbC9TcWxSb3dzVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3NxbC9TcWxSb3dzVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM4MDMyMwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvc3FsL1NxbFJvd3NUZXN0Lmdyb292eQpAQCAtMCwwICsxLDc3IEBACitwYWNrYWdlIGdyb292eS5zcWwKKworY2xhc3MgU3FsUm93c1Rlc3QgZXh0ZW5kcyBUZXN0SGVscGVyIHsKKworICAgIHZvaWQgdGVzdEZpcnN0Um93V2l0aFByb3BlcnR5TmFtZSgpIHsKKyAgICAgICAgZGVmIHNxbCA9IGNyZWF0ZVNxbCgpCisKKyAgICAgICAgZGVmIHJlc3VsdHMgPSBzcWwuZmlyc3RSb3coInNlbGVjdCBmaXJzdG5hbWUsIGxhc3RuYW1lIGZyb20gUEVSU09OIHdoZXJlIGlkPTEiKS5maXJzdG5hbWUKKyAgICAgICAgZGVmIGV4cGVjdGVkID0gIkphbWVzIgorICAgICAgICBhc3NlcnQgcmVzdWx0cyA9PSBleHBlY3RlZAorICAgIH0KKworICAgIHZvaWQgdGVzdEZpcnN0Um93V2l0aFByb3BlcnR5TmFtZUFuZFBhcmFtcygpIHsKKyAgICAgICAgZGVmIHNxbCA9IGNyZWF0ZVNxbCgpCisKKyAgICAgICAgZGVmIHJlc3VsdHMgPSBzcWwuZmlyc3RSb3coInNlbGVjdCBmaXJzdG5hbWUsIGxhc3RuYW1lIGZyb20gUEVSU09OIHdoZXJlIGlkPT8iLCBbMV0pLmxhc3RuYW1lCisgICAgICAgIGRlZiBleHBlY3RlZCA9ICJTdHJhY2hhbiIKKyAgICAgICAgYXNzZXJ0IHJlc3VsdHMgPT0gZXhwZWN0ZWQKKyAgICB9CisKKyAgICB2b2lkIHRlc3RGaXJzdFJvd1dpdGhQcm9wZXJ0eU51bWJlcigpIHsKKyAgICAgICAgZGVmIHNxbCA9IGNyZWF0ZVNxbCgpCisKKyAgICAgICAgZGVmIHJlc3VsdHMgPSBzcWwuZmlyc3RSb3coInNlbGVjdCBmaXJzdG5hbWUsIGxhc3RuYW1lIGZyb20gUEVSU09OIHdoZXJlIGlkPTEiKVswXQorICAgICAgICBkZWYgZXhwZWN0ZWQgPSAiSmFtZXMiCisgICAgICAgIGFzc2VydCByZXN1bHRzID09IGV4cGVjdGVkCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdEZpcnN0Um93V2l0aFByb3BlcnR5TnVtYmVyQW5kUGFyYW1zKCkgeworICAgICAgICBkZWYgc3FsID0gY3JlYXRlU3FsKCkKKworICAgICAgICBkZWYgcmVzdWx0cyA9IHNxbC5maXJzdFJvdygic2VsZWN0IGZpcnN0bmFtZSwgbGFzdG5hbWUgZnJvbSBQRVJTT04gd2hlcmUgaWQ9PyIsIFsxXSlbMF0KKyAgICAgICAgZGVmIGV4cGVjdGVkID0gIkphbWVzIgorICAgICAgICBhc3NlcnQgcmVzdWx0cyA9PSBleHBlY3RlZAorICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RBbGxSb3dzV2l0aFByb3BlcnR5TnVtYmVyKCkgeworICAgICAgICBkZWYgc3FsID0gY3JlYXRlU3FsKCkKKworICAgICAgICBkZWYgcmVzdWx0cyA9IHNxbC5yb3dzKCJzZWxlY3QgZmlyc3RuYW1lLCBsYXN0bmFtZSBmcm9tIFBFUlNPTiB3aGVyZSBpZD0xIG9yIGlkPTIgb3JkZXIgYnkgaWQiKQorICAgICAgICBhc3NlcnQgcmVzdWx0c1swXVswXSA9PSAiSmFtZXMiCisgICAgICAgIGFzc2VydCByZXN1bHRzWzBdWzFdID09ICJTdHJhY2hhbiIKKyAgICAgICAgYXNzZXJ0IHJlc3VsdHNbMV1bMF0gPT0gIkJvYiIKKyAgICAgICAgYXNzZXJ0IHJlc3VsdHNbMV1bMV0gPT0gIk1jd2hpcnRlciIKKyAgICB9CisKKyAgICB2b2lkIHRlc3RBbGxSb3dzV2l0aFByb3BlcnR5TnVtYmVyQW5kUGFyYW1zKCkgeworICAgICAgICBkZWYgc3FsID0gY3JlYXRlU3FsKCkKKworICAgICAgICBkZWYgcmVzdWx0cyA9IHNxbC5yb3dzKCJzZWxlY3QgZmlyc3RuYW1lLCBsYXN0bmFtZSBmcm9tIFBFUlNPTiB3aGVyZSBpZD0/IG9yIGlkPT8gb3JkZXIgYnkgaWQiLCBbMSwyXSkKKyAgICAgICAgYXNzZXJ0IHJlc3VsdHNbMF1bMF0gPT0gIkphbWVzIgorICAgICAgICBhc3NlcnQgcmVzdWx0c1swXVsxXSA9PSAiU3RyYWNoYW4iCisgICAgICAgIGFzc2VydCByZXN1bHRzWzFdWzBdID09ICJCb2IiCisgICAgICAgIGFzc2VydCByZXN1bHRzWzFdWzFdID09ICJNY3doaXJ0ZXIiCisgICAgfQorCisgICAgdm9pZCB0ZXN0QWxsUm93c1dpdGhQcm9wZXJ0eU5hbWUoKSB7CisgICAgICAgIGRlZiBzcWwgPSBjcmVhdGVTcWwoKQorCisgICAgICAgIGRlZiByZXN1bHRzID0gc3FsLnJvd3MoInNlbGVjdCBmaXJzdG5hbWUsIGxhc3RuYW1lIGZyb20gUEVSU09OIHdoZXJlIGlkPTEgb3IgaWQ9MiBvcmRlciBieSBpZCIpCisgICAgICAgIGFzc2VydCByZXN1bHRzWzBdLmZpcnN0bmFtZSA9PSAiSmFtZXMiCisgICAgICAgIGFzc2VydCByZXN1bHRzWzBdLmxhc3RuYW1lID09ICJTdHJhY2hhbiIKKyAgICAgICAgYXNzZXJ0IHJlc3VsdHNbMV0uZmlyc3RuYW1lID09ICJCb2IiCisgICAgICAgIGFzc2VydCByZXN1bHRzWzFdLmxhc3RuYW1lID09ICJNY3doaXJ0ZXIiCisgICAgfQorCisgICAgdm9pZCB0ZXN0QWxsUm93c1dpdGhQcm9wZXJ0eU5hbWVBbmRQYXJhbXMoKSB7CisgICAgICAgIGRlZiBzcWwgPSBjcmVhdGVTcWwoKQorCisgICAgICAgIGRlZiByZXN1bHRzID0gc3FsLnJvd3MoInNlbGVjdCBmaXJzdG5hbWUsIGxhc3RuYW1lIGZyb20gUEVSU09OIHdoZXJlIGlkPT8gb3IgaWQ9PyBvcmRlciBieSBpZCIsIFsxLDJdKQorICAgICAgICBhc3NlcnQgcmVzdWx0c1swXS5maXJzdG5hbWUgPT0gIkphbWVzIgorICAgICAgICBhc3NlcnQgcmVzdWx0c1swXS5sYXN0bmFtZSA9PSAiU3RyYWNoYW4iCisgICAgICAgIGFzc2VydCByZXN1bHRzWzFdLmZpcnN0bmFtZSA9PSAiQm9iIgorICAgICAgICBhc3NlcnQgcmVzdWx0c1sxXS5sYXN0bmFtZSA9PSAiTWN3aGlydGVyIgorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9zcWwvU3FsVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3NxbC9TcWxUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGRiMjU5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9zcWwvU3FsVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwxMTggQEAKK3BhY2thZ2UgZ3Jvb3Z5LnNxbAorCisvKioKKyAqIFRoaXMgaXMgbW9yZSBvZiBhIHNhbXBsZSBwcm9ncmFtIHRoYW4gYSB1bml0IHRlc3QgYW5kIGlzIGhlcmUgYXMgYW4gZWFzeQorICogdG8gcmVhZCBkZW1vIG9mIEdETy4gVGhlIGFjdHVhbCBmdWxsIHVuaXQgdGVzdCBjYXNlIGlzIGluIFNxbENvbXBsZXRlVGVzdAorICovCitjbGFzcyBTcWxUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBzcWwKKworICAgIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIHNxbCA9IGNyZWF0ZVNxbCgpCisgICAgfQorCisgICAgdm9pZCB0ZXN0U3FsUXVlcnkoKSB7CisgICAgICAgIHNxbC5lYWNoUm93KCJzZWxlY3QgKiBmcm9tIFBFUlNPTiIpIHsgcHJpbnRsbigiSGVsbG8gJHtpdC5maXJzdG5hbWV9ICR7aXQubGFzdG5hbWV9IikgfQorICAgIH0KKworICAgIHZvaWQgdGVzdFF1ZXJ5VXNpbmdDb2x1bW5JbmRleCgpIHsKKyAgICAgICAgZGVmIGFuc3dlciA9IG51bGwKKyAgICAgICAgc3FsLmVhY2hSb3coInNlbGVjdCBjb3VudCgqKSBmcm9tIFBFUlNPTiIpIHsgYW5zd2VyID0gaXRbMF0gfQorICAgICAgICBwcmludGxuICJGb3VuZCB0aGUgY291bnQgb2YgJHthbnN3ZXJ9IgorICAgICAgICBhc3NlcnQgYW5zd2VyID09IDMKKyAgICB9CisKKyAgICB2b2lkIHRlc3RRdWVyeVVzaW5nTmVnYXRpdmVDb2x1bW5JbmRleCgpIHsKKyAgICAgICAgZGVmIGZpcnN0ID0gbnVsbAorICAgICAgICBkZWYgbGFzdCA9IG51bGwKKyAgICAgICAgc3FsLmVhY2hSb3coInNlbGVjdCBmaXJzdG5hbWUsIGxhc3RuYW1lIGZyb20gUEVSU09OIHdoZXJlIGZpcnN0bmFtZT0nSmFtZXMnIikgeyByb3cgLT4KKyAgICAgICAgICAgIGZpcnN0ID0gcm93Wy0yXQorICAgICAgICAgICAgbGFzdCA9IHJvd1stMV0KKyAgICAgICAgfQorICAgICAgICBwcmludGxuICJGb3VuZCBuYW1lICR7Zmlyc3R9ICR7bGFzdH0iCisgICAgICAgIGFzc2VydCBmaXJzdCA9PSAiSmFtZXMiCisgICAgICAgIGFzc2VydCBsYXN0ID09ICJTdHJhY2hhbiIKKyAgICB9CisKKyAgICB2b2lkIHRlc3RTcWxRdWVyeVdpdGhXaGVyZUNsYXVzZSgpIHsKKyAgICAgICAgZGVmIGZvbyA9ICJkcmluayIKKyAgICAgICAgc3FsLmVhY2hSb3coInNlbGVjdCAqIGZyb20gRk9PRCB3aGVyZSB0eXBlPSR7Zm9vfSIpIHsgcHJpbnRsbigiRHJpbmsgJHtpdC5uYW1lfSIpIH0KKyAgICB9CisKKyAgICB2b2lkIHRlc3RTcWxRdWVyeVdpdGhXaGVyZUNsYXVzZVdpdGgyQXJndW1lbnRzKCkgeworICAgICAgICBkZWYgZm9vID0gImNoZWVzZSIKKyAgICAgICAgZGVmIGJhciA9ICJlZGFtIgorICAgICAgICBzcWwuZWFjaFJvdygic2VsZWN0ICogZnJvbSBGT09EIHdoZXJlIHR5cGU9JHtmb299IGFuZCBuYW1lICE9ICR7YmFyfSIpIHsgcHJpbnRsbigiRm91bmQgY2hlZXNlICR7aXQubmFtZX0iKSB9CisgICAgfQorCisgICAgdm9pZCB0ZXN0U3FsUXVlcnlXaXRoSW5jb3JyZWN0bHlRdW90ZWREeW5hbWljRXhwcmVzc2lvbnMoKSB7CisgICAgICAgIGRlZiBmb28gPSAiY2hlZXNlIgorICAgICAgICBkZWYgYmFyID0gImVkYW0iCisgICAgICAgIHNxbC5lYWNoUm93KCJzZWxlY3QgKiBmcm9tIEZPT0Qgd2hlcmUgdHlwZT0nJHtmb299JyBhbmQgbmFtZSAhPSAnJHtiYXJ9JyIpIHsgcHJpbnRsbigiRm91bmQgY2hlZXNlICR7aXQubmFtZX0iKSB9CisgICAgfQorCisgICAgdm9pZCB0ZXN0RGF0YVNldCgpIHsKKyAgICAgICAgZGVmIHBlb3BsZSA9IHNxbC5kYXRhU2V0KCJQRVJTT04iKQorICAgICAgICBwZW9wbGUuZWFjaCB7IHByaW50bG4oIkhleSAke2l0LmZpcnN0bmFtZX0iKSB9CisgICAgfQorCisgICAgdm9pZCB0ZXN0RGF0YVNldFdpdGhDbG9zdXJlUHJlZGljYXRlKCkgeworICAgICAgICBkZWYgZm9vZCA9IHNxbC5kYXRhU2V0KCJGT09EIikKKyAgICAgICAgZm9vZC5maW5kQWxsIHsgaXQudHlwZSA9PSAiY2hlZXNlIiB9LmVhY2ggeyBwcmludGxuKCJDaGVlc2UgJHtpdC5uYW1lfSIpIH0KKyAgICB9CisKKyAgICB2b2lkIHRlc3RFeGVjdXRlVXBkYXRlKCl7CisgICAgICAgIGRlZiBmb289J2Zvb2QtZHJpbmsnCisgICAgICAgIGRlZiBiYXI9J2d1aW5uZXNzJworICAgICAgICBkZWYgblJvd3MgPSBzcWwuZXhlY3V0ZVVwZGF0ZSgidXBkYXRlIEZPT0Qgc2V0IHR5cGU9PyB3aGVyZSBuYW1lPT8iLFtmb28sYmFyXSk7CisgICAgICAgIGlmIChuUm93cyA9PSAwKXsKKyAgICAgICAgICAgIHNxbC5leGVjdXRlVXBkYXRlKCJpbnNlcnQgaW50byBGT09EICh0eXBlLG5hbWUpIHZhbHVlcyAoJHtmb299LCR7YmFyfSkiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgdGVzdEV4ZWN1dGVJbnNlcnQoKSB7CisgICAgICAgIGRlZiBmb28gPSAnZm9vZC1kcmluaycKKyAgICAgICAgZGVmIGJhciA9ICdndWluZXNzJworICAgICAgICBpZiAoc3FsLmRhdGFTb3VyY2UuY29ubmVjdGlvbi5tZXRhRGF0YS5zdXBwb3J0c0dldEdlbmVyYXRlZEtleXMoKSkgeworICAgICAgICAgICAgZGVmIGtleXMgPSBzcWwuZXhlY3V0ZUluc2VydCgnaW5zZXJ0IGludG8gRk9PRCAodHlwZSxuYW1lKSB2YWx1ZXMgKD8sPyknLCBbZm9vLGJhcl0pCisgICAgICAgICAgICBhc3NlcnQgMSA9PSBrZXlzLnNpemUoKQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVmIGNvdW50ID0gc3FsLmV4ZWN1dGVVcGRhdGUoJ2luc2VydCBpbnRvIEZPT0QgKHR5cGUsbmFtZSkgdmFsdWVzICg/LD8pJywgW2ZvbyxiYXJdKQorICAgICAgICAgICAgYXNzZXJ0IDEgPT0gY291bnQKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgdGVzdE1ldGFEYXRhKCkgeworICAgICAgc3FsLmVhY2hSb3coJ3NlbGVjdCAqIGZyb20gUEVSU09OJykgeworCSAgICAgICBhc3NlcnQgaXRbMF0gIT0gbnVsbAorCSAgICAgICBhc3NlcnQgaXQuZ2V0TWV0YURhdGEoKSAhPSBudWxsCisJICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIGRlZiBjcmVhdGVTcWwoKSB7CisgICAgICAgIGRlZiBkcyA9IG5ldyBvcmcuaHNxbGRiLmpkYmMuamRiY0RhdGFTb3VyY2UoKQorICAgICAgICBkcy5kYXRhYmFzZSA9ICJqZGJjOmhzcWxkYjptZW06Zm9vIiArIGdldE1ldGhvZE5hbWUoKQorICAgICAgICBkcy51c2VyID0gJ3NhJworICAgICAgICBkcy5wYXNzd29yZCA9ICcnCisgICAgICAgIGRlZiBzcWwgPSBuZXcgU3FsKGRzKQorCisgICAgICAgIHNxbC5leGVjdXRlKCJjcmVhdGUgdGFibGUgUEVSU09OICggZmlyc3RuYW1lIHZhcmNoYXIsIGxhc3RuYW1lIHZhcmNoYXIgKSIpCisgICAgICAgIHNxbC5leGVjdXRlKCJjcmVhdGUgdGFibGUgRk9PRCAoIHR5cGUgdmFyY2hhciwgbmFtZSB2YXJjaGFyKSIpCisKKyAgICAgICAgLy8gbm93IGxldCdzIHBvcHVsYXRlIHRoZSBkYXRhc2V0cworICAgICAgICBkZWYgcGVvcGxlID0gc3FsLmRhdGFTZXQoIlBFUlNPTiIpCisgICAgICAgIHBlb3BsZS5hZGQoIGZpcnN0bmFtZToiSmFtZXMiLCBsYXN0bmFtZToiU3RyYWNoYW4iICkKKyAgICAgICAgcGVvcGxlLmFkZCggZmlyc3RuYW1lOiJCb2IiLCBsYXN0bmFtZToiTWN3aGlydGVyIiApCisgICAgICAgIHBlb3BsZS5hZGQoIGZpcnN0bmFtZToiU2FtIiwgbGFzdG5hbWU6IlB1bGxhcmEiICkKKworICAgICAgICBkZWYgZm9vZCA9IHNxbC5kYXRhU2V0KCJGT09EIikKKyAgICAgICAgZm9vZC5hZGQoIHR5cGU6ImNoZWVzZSIsIG5hbWU6ImVkYW0iICkKKyAgICAgICAgZm9vZC5hZGQoIHR5cGU6ImNoZWVzZSIsIG5hbWU6ImJyaWUiICkKKyAgICAgICAgZm9vZC5hZGQoIHR5cGU6ImNoZWVzZSIsIG5hbWU6ImNoZWRkYXIiICkKKyAgICAgICAgZm9vZC5hZGQoIHR5cGU6ImRyaW5rIiwgbmFtZToiYmVlciIgKQorICAgICAgICBmb29kLmFkZCggdHlwZToiZHJpbmsiLCBuYW1lOiJjb2ZmZWUiICkKKworICAgICAgICByZXR1cm4gc3FsCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9zcWwvU3FsV2l0aEJ1aWxkZXJUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvc3FsL1NxbFdpdGhCdWlsZGVyVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDcxNzVjNAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvc3FsL1NxbFdpdGhCdWlsZGVyVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwyNiBAQAorcGFja2FnZSBncm9vdnkuc3FsCisKK2ltcG9ydCBncm9vdnkueG1sLk1hcmt1cEJ1aWxkZXIgCisKKy8qKgorICogQGF1dGhvciBCcmlhbiBNY0NhbGxpc3RlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitjbGFzcyBTcWxXaXRoQnVpbGRlclRlc3QgZXh0ZW5kcyBUZXN0SGVscGVyIHsKKworICAgIHZvaWQgdGVzdFNxbFF1ZXJ5KCkgeworICAgICAgICAgZGVmIHNxbCA9IGNyZWF0ZVNxbCgpCisgICAgICAgICBwcmludGxuICJDcmVhdGVkICR7c3FsfSIKKyAgICAgICAgCisgICAgICAgICBkZWYgZG9jID0gbmV3IE1hcmt1cEJ1aWxkZXIoKQorICAgICAgICAKKyAgICAgICAgIGRvYy5wZW9wbGUgeworICAgICAgICAgICAgIHNxbC5lYWNoUm93KCJzZWxlY3QgKiBmcm9tIFBFUlNPTiIpIHsKKyAgICAgICAgICAgICAgICAgZG9jLnBlcnNvbihmaXJzdDogaXQuZmlyc3RuYW1lLCBsYXN0OiBpdC5sYXN0bmFtZSwgbG9jYXRpb246IGl0LmxvY2F0aW9uX25hbWUpCisgICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgIHNxbC5jbG9zZSgpCisgICAgfQorfQorCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3NxbC9TcWxXaXRoVHlwZWRSZXN1bHRzVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3NxbC9TcWxXaXRoVHlwZWRSZXN1bHRzVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcyNDQxNgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvc3FsL1NxbFdpdGhUeXBlZFJlc3VsdHNUZXN0Lmdyb292eQpAQCAtMCwwICsxLDM3IEBACitwYWNrYWdlIGdyb292eS5zcWwKKworaW1wb3J0IGdyb292eS54bWwuTWFya3VwQnVpbGRlciAKKworLyoqCisgKiBAYXV0aG9yIFRob21hcyBIZWxsZXIKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworY2xhc3MgU3FsV2l0aFR5cGVkUmVzdWx0c1Rlc3QgZXh0ZW5kcyBUZXN0SGVscGVyIHsKKworICAgIHZvaWQgdGVzdFNxbFF1ZXJ5KCkgeworICAgICAgICAgZGVmIHNxbCA9IGNyZWF0ZUVtcHR5U3FsKCkKKyAgICAgICAgIAorICAgICAgICAgc3FsLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSBncm9vdnl0ZXN0ICggYW5pbnQgaW50ZWdlciwgYXN0cmluZyB2YXJjaGFyICkiKTsKKworICAgICAgICAgZGVmIGdyb292eXRlc3QgPSBzcWwuZGF0YVNldCgiZ3Jvb3Z5dGVzdCIpCisgICAgICAgICBncm9vdnl0ZXN0LmFkZCggYW5pbnQ6MSwgYXN0cmluZzoiR3Jvb3Z5IiApCisgICAgICAgICBncm9vdnl0ZXN0LmFkZCggYW5pbnQ6MiwgYXN0cmluZzoicm9ja3MiICkKKworICAgICAgICAgLy8gdGhpcyBsaW5lIG1lc3NlcyB1cCB0aGluZ3M6CisgICAgICAgICAvKiogQHRvZG8gdGhpcyBmYWlscworICAgICAgICAgSW50ZWdlciBpZAorCQkgKi8KKyAgICAgICAgIEludGVnZXIgaWQgPSAwCisJCSAKKyAgICAgICAgIHNxbC5lYWNoUm93KCJTRUxFQ1QgKiBGUk9NIGdyb292eXRlc3QgT1JERVIgQlkgYW5pbnQiKSB7IAorICAgICAgICAgCXByaW50bG4gImZvdW5kICR7aXQuYXN0cmluZ30gZm9yIGlkICR7aXQuYW5pbnR9IgorICAgICAgICAgCQorICAgICAgICAgCWlkID0gaXQuYW5pbnQgCisgICAgICAgICB9CisKKyAgICAgICAgIGFzc2VydCBpZCA9PSAyCisgICAgICAgIAorICAgICAgICAgc3FsLmNsb3NlKCkKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvc3FsL1Rlc3RIZWxwZXIuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9zcWwvVGVzdEhlbHBlci5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg4MzU2ZgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvc3FsL1Rlc3RIZWxwZXIuZ3Jvb3Z5CkBAIC0wLDAgKzEsNjUgQEAKK3BhY2thZ2UgZ3Jvb3Z5LnNxbAorCitjbGFzcyBUZXN0SGVscGVyIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgc3RhdGljIGRlZiBjb3VudGVyID0gMQorICAgIAorICAgIHN0YXRpYyBTcWwgbWFrZVNxbCgpIHsKKyAgICAgICAgZGVmIGZvbyA9IG5ldyBUZXN0SGVscGVyKCkKKyAgICAgICAgcmV0dXJuIGZvby5jcmVhdGVTcWwoKQorICAgIH0KKyAgICAKKyAgICAKKyAgICBwcm90ZWN0ZWQgZGVmIGNyZWF0ZUVtcHR5U3FsKCkgeworICAgICAgICByZXR1cm4gbmV3U3FsKGdldFVSSSgpKQorICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgZGVmIGNyZWF0ZVNxbCgpIHsKKyAgICAgICAgZGVmIHNxbCA9IG5ld1NxbChnZXRVUkkoKSkKKyAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgIHNxbC5leGVjdXRlKCJkcm9wIHRhYmxlIFBFUlNPTiIpCisgICAgICAgICAgIHNxbC5leGVjdXRlKCJkcm9wIHRhYmxlIEZPT0QiKQorICAgICAgICAgICBzcWwuZXhlY3V0ZSgiZHJvcCB0YWJsZSBGRUFUVVJFIikKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7fQorICAgICAgICAKKyAgICAgICAgc3FsLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSBQRVJTT04gKCBmaXJzdG5hbWUgdmFyY2hhciwgbGFzdG5hbWUgdmFyY2hhciwgaWQgaW50ZWdlciwgbG9jYXRpb25faWQgaW50ZWdlciwgbG9jYXRpb25fbmFtZSB2YXJjaGFyICkiKSAgICAgCisgICAgICAgIHNxbC5leGVjdXRlKCJjcmVhdGUgdGFibGUgRk9PRCAoIHR5cGUgdmFyY2hhciwgbmFtZSB2YXJjaGFyKSIpCisgICAgICAgIHNxbC5leGVjdXRlKCJjcmVhdGUgdGFibGUgRkVBVFVSRSAoIGlkIGludGVnZXIsIG5hbWUgdmFyY2hhcikiKQorICAgICAgICAKKyAgICAgICAgLy8gbm93IGxldHMgcG9wdWxhdGUgdGhlIGRhdGFzZXRzCisgICAgICAgIGRlZiBwZW9wbGUgPSBzcWwuZGF0YVNldCgiUEVSU09OIikKKyAgICAgICAgcGVvcGxlLmFkZCggZmlyc3RuYW1lOiJKYW1lcyIsIGxhc3RuYW1lOiJTdHJhY2hhbiIsIGlkOjEsIGxvY2F0aW9uX2lkOjEwLCBsb2NhdGlvbl9uYW1lOidMb25kb24nICkKKyAgICAgICAgcGVvcGxlLmFkZCggZmlyc3RuYW1lOiJCb2IiLCBsYXN0bmFtZToiTWN3aGlydGVyIiwgaWQ6MiwgbG9jYXRpb25faWQ6MjAsIGxvY2F0aW9uX25hbWU6J0F0bGFudGEnICkKKyAgICAgICAgcGVvcGxlLmFkZCggZmlyc3RuYW1lOiJTYW0iLCBsYXN0bmFtZToiUHVsbGFyYSIsIGlkOjMsIGxvY2F0aW9uX2lkOjMwLCBsb2NhdGlvbl9uYW1lOidDYWxpZm9ybmlhJyApCisgICAgICAgIAorICAgICAgICBkZWYgZm9vZCA9IHNxbC5kYXRhU2V0KCJGT09EIikKKyAgICAgICAgZm9vZC5hZGQoIHR5cGU6ImNoZWVzZSIsIG5hbWU6ImVkYW0iICkKKyAgICAgICAgZm9vZC5hZGQoIHR5cGU6ImNoZWVzZSIsIG5hbWU6ImJyaWUiICkKKyAgICAgICAgZm9vZC5hZGQoIHR5cGU6ImNoZWVzZSIsIG5hbWU6ImNoZWRkYXIiICkKKyAgICAgICAgZm9vZC5hZGQoIHR5cGU6ImRyaW5rIiwgbmFtZToiYmVlciIgKQorICAgICAgICBmb29kLmFkZCggdHlwZToiZHJpbmsiLCBuYW1lOiJjb2ZmZWUiICkKKyAgICAgICAgCisgICAgICAgIGRlZiBmZWF0dXJlcyA9IHNxbC5kYXRhU2V0KCJGRUFUVVJFIikKKyAgICAgICAgZmVhdHVyZXMuYWRkKCBpZDoxLCBuYW1lOidHRE8nICkKKyAgICAgICAgZmVhdHVyZXMuYWRkKCBpZDoyLCBuYW1lOidHUGF0aCcgKQorICAgICAgICBmZWF0dXJlcy5hZGQoIGlkOjMsIG5hbWU6J0dyb292eU1hcmt1cCcgKQorICAgICAgICByZXR1cm4gc3FsCisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCBkZWYgZ2V0VVJJKCkgeworCQlkZWYgYW5zd2VyID0gImpkYmM6aHNxbGRiOm1lbTpmb28iCisJCWRlZiBuYW1lID0gZ2V0TWV0aG9kTmFtZSgpCisJCWlmIChuYW1lID09IG51bGwpIHtuYW1lID0gIiJ9CisJCW5hbWUgKz0gY291bnRlcisrCisJCXJldHVybiBhbnN3ZXIgKyBuYW1lCisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCBkZWYgbmV3U3FsKFN0cmluZyB1cmkpIHsKKwkgICAgZGVmIGRzID0gbmV3IG9yZy5oc3FsZGIuamRiYy5qZGJjRGF0YVNvdXJjZSgpCisgICAgICAgIGRzLmRhdGFiYXNlID0gdXJpCisgICAgICAgIGRzLnVzZXIgPSAnc2EnCisgICAgICAgIGRzLnBhc3N3b3JkID0gJycKKwkgICAgcmV0dXJuIG5ldyBTcWwoZHMpCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9zd2luZy9Td2luZ0J1aWxkZXJCaW5kaW5nc1Rlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS9zd2luZy9Td2luZ0J1aWxkZXJCaW5kaW5nc1Rlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2M2VjM2EKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3N3aW5nL1N3aW5nQnVpbGRlckJpbmRpbmdzVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwyMzkgQEAKKy8qDQorICogJElkJA0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqDQorICovDQorDQorcGFja2FnZSBncm9vdnkuc3dpbmcNCisNCitpbXBvcnQgamF2YXguc3dpbmcuRGVmYXVsdEJvdW5kZWRSYW5nZU1vZGVsDQoraW1wb3J0IGphdmF4LnN3aW5nLkRlZmF1bHRCdXR0b25Nb2RlbA0KK2ltcG9ydCBqYXZheC5zd2luZy5KRnJhbWUNCitpbXBvcnQgamF2YXguc3dpbmcudGV4dC5QbGFpbkRvY3VtZW50DQorDQorcHVibGljIGNsYXNzIFN3aW5nQnVpbGRlckJpbmRpbmdzVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsNCisNCisgICAgcHJpdmF0ZSBCb29sZWFuIGlzSGVhZGxlc3MNCisNCisgICAgcHJpdmF0ZSBCb29sZWFuIGlzSGVhZGxlc3MoKSB7DQorICAgICAgICBpZiAoaXNIZWFkbGVzcyAhPSBudWxsKQ0KKyAgICAgICAgICByZXR1cm4gaXNIZWFkbGVzczsNCisNCisgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgbmV3IEpGcmFtZSgidGVzdGluZyIpDQorICAgICAgICAgICAgaXNIZWFkbGVzcyA9IGZhbHNlDQorICAgICAgICB9IGNhdGNoIChqYXZhLmF3dC5IZWFkbGVzc0V4Y2VwdGlvbiBoZSkgew0KKyAgICAgICAgICAgIGlzSGVhZGxlc3MgPSB0cnVlDQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gaXNIZWFkbGVzcw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHRlc3RTbGlkZXJWYWx1ZUJpbmRpbmcoKSB7DQorICAgICAgICBpZiAoaXNIZWFkbGVzcygpKSByZXR1cm4NCisgICAgICAgIFN3aW5nQnVpbGRlciBzd2luZyA9IG5ldyBTd2luZ0J1aWxkZXIoKQ0KKw0KKyAgICAgICAgc3dpbmcuYWN0aW9ucygpIHsNCisgICAgICAgICAgICBzbGlkZXIoaWQ6J3NsJykNCisgICAgICAgICAgICB0ZXh0RmllbGQoaWQ6J3R4dCcsIHRleHQ6YmluZChzb3VyY2U6c2wsIHNvdXJjZVByb3BlcnR5Oid2YWx1ZScsIGlkOidiaW5kaW5nJykpDQorICAgICAgICAgICAgc2xpZGVyKGlkOidzbFJldmVyc2UnLCB2YWx1ZTpiaW5kKHNvdXJjZTpzbCwgc291cmNlUHJvcGVydHk6J3ZhbHVlJywgaWQ6J2JpbmRpbmdSZXZlcnNlJykpDQorICAgICAgICAgICAgLy8gbmVlZCB0byB1c2UgYSBzZWNvbmQgc2xpZGVyIGZvciByZXZlcnNlIHRlc3QsIGJlY2F1c2Ugc3RyaW5nLT5pbnQgYXV0b2JveCwgbm90IHNvIGhhcHB5DQorICAgICAgICB9DQorDQorICAgICAgICBzd2luZy5zbC52YWx1ZSA9IDEwDQorICAgICAgICBhc3NlcnQgc3dpbmcudHh0LnRleHQgPT0gJzEwJw0KKyAgICAgICAgc3dpbmcuc2wudmFsdWUgPSA5NQ0KKyAgICAgICAgYXNzZXJ0IHN3aW5nLnR4dC50ZXh0ID09ICc5NScNCisNCisgICAgICAgIHN3aW5nLmJpbmRpbmcucmViaW5kKCkNCisgICAgICAgIHN3aW5nLnNsLnZhbHVlID0gNDINCisgICAgICAgIGFzc2VydCBzd2luZy50eHQudGV4dCA9PSAnNDInDQorICAgICAgICBzd2luZy5iaW5kaW5nLnVuYmluZCgpDQorICAgICAgICBzd2luZy5zbC52YWx1ZSA9IDEzDQorICAgICAgICBhc3NlcnQgc3dpbmcudHh0LnRleHQgPT0gJzQyJw0KKyAgICAgICAgc3dpbmcuYmluZGluZy5iaW5kKCkNCisgICAgICAgIGFzc2VydCBzd2luZy50eHQudGV4dCA9PSAnNDInDQorICAgICAgICBzd2luZy5iaW5kaW5nLnVwZGF0ZSgpDQorICAgICAgICBhc3NlcnQgc3dpbmcudHh0LnRleHQgPT0gJzEzJw0KKw0KKyAgICAgICAgc3dpbmcuc2wubW9kZWwgPSBuZXcgRGVmYXVsdEJvdW5kZWRSYW5nZU1vZGVsKDMwLCAxLCAyMCwgNDApDQorICAgICAgICBhc3NlcnQgc3dpbmcudHh0LnRleHQgPT0gJzMwJw0KKw0KKyAgICAgICAgLy8gZmlyc3QgbWFrZSBzdXJlIHdlJ3ZlIGJlZW4gZmlyZWluZw0KKyAgICAgICAgYXNzZXJ0IHN3aW5nLnNsUmV2ZXJzZS52YWx1ZSA9PSAzMA0KKyAgICAgICAgc3dpbmcuc2xSZXZlcnNlLnZhbHVlID0gMjENCisgICAgICAgIHN3aW5nLmJpbmRpbmdSZXZlcnNlLnJldmVyc2VVcGRhdGUoKQ0KKyAgICAgICAgYXNzZXJ0IHN3aW5nLnNsLnZhbHVlID09IDIxDQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgdGVzdFRleHRGaWVsZFRleHRCaW5kaW5nKCkgew0KKyAgICAgICAgaWYgKGlzSGVhZGxlc3MoKSkgcmV0dXJuDQorICAgICAgICBTd2luZ0J1aWxkZXIgc3dpbmcgPSBuZXcgU3dpbmdCdWlsZGVyKCkNCisNCisgICAgICAgIHN3aW5nLmFjdGlvbnMoKSB7DQorICAgICAgICAgICAgdGV4dEZpZWxkKCdCaW5kJywgaWQ6J3R4dHMnKQ0KKyAgICAgICAgICAgIHRleHRGaWVsZChpZDondHh0JywgdGV4dDpiaW5kKHNvdXJjZTp0eHRzLCBzb3VyY2VQcm9wZXJ0eTondGV4dCcsIGlkOidiaW5kaW5nJykpDQorICAgICAgICB9DQorDQorICAgICAgICBhc3NlcnQgc3dpbmcudHh0LnRleHQgPT0gJ0JpbmQnDQorICAgICAgICBzd2luZy50eHRzLnRleHQgPSAnVGV4dCcNCisgICAgICAgIGFzc2VydCBzd2luZy50eHQudGV4dCA9PSAnVGV4dCcNCisgICAgICAgIHN3aW5nLnR4dHMudGV4dCA9ICdFYXNpbHknDQorICAgICAgICBhc3NlcnQgc3dpbmcudHh0LnRleHQgPT0gJ0Vhc2lseScNCisNCisgICAgICAgIHN3aW5nLmJpbmRpbmcucmViaW5kKCkNCisgICAgICAgIHN3aW5nLnR4dHMudGV4dCA9ICdXaXRoJw0KKyAgICAgICAgYXNzZXJ0IHN3aW5nLnR4dC50ZXh0ID09ICdXaXRoJw0KKyAgICAgICAgc3dpbmcuYmluZGluZy51bmJpbmQoKQ0KKyAgICAgICAgc3dpbmcudHh0cy50ZXh0ID0gJ2JpbmQoKScNCisgICAgICAgIGFzc2VydCBzd2luZy50eHQudGV4dCA9PSAnV2l0aCcNCisgICAgICAgIHN3aW5nLmJpbmRpbmcuYmluZCgpDQorICAgICAgICBhc3NlcnQgc3dpbmcudHh0LnRleHQgPT0gJ1dpdGgnDQorICAgICAgICBzd2luZy5iaW5kaW5nLnVwZGF0ZSgpDQorICAgICAgICBhc3NlcnQgc3dpbmcudHh0LnRleHQgPT0gJ2JpbmQoKScNCisNCisgICAgICAgIHN3aW5nLnR4dC50ZXh0ID0gJ3JldmVyc2FsJw0KKyAgICAgICAgc3dpbmcuYmluZGluZy5yZXZlcnNlVXBkYXRlKCkNCisgICAgICAgIGFzc2VydCBzd2luZy50eHRzLnRleHQgPT0gJ3JldmVyc2FsJw0KKw0KKyAgICAgICAgUGxhaW5Eb2N1bWVudCBkb2MgPSBuZXcgUGxhaW5Eb2N1bWVudCgpDQorICAgICAgICBkb2MuaW5zZXJ0U3RyaW5nKDAsICd7fScsIG51bGwpDQorICAgICAgICBzd2luZy50eHRzLmRvY3VtZW50ID0gZG9jDQorICAgICAgICBhc3NlcnQgc3dpbmcudHh0LnRleHQgPT0gJ3t9Jw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHRlc3RDaGVja2JveFNlbGVjdGVkQmluZGluZygpIHsNCisgICAgICAgIGlmIChpc0hlYWRsZXNzKCkpIHJldHVybg0KKyAgICAgICAgU3dpbmdCdWlsZGVyIHN3aW5nID0gbmV3IFN3aW5nQnVpbGRlcigpDQorDQorICAgICAgICBzd2luZy5hY3Rpb25zKCkgew0KKyAgICAgICAgICAgIGNoZWNrQm94KGlkOidjYicpDQorICAgICAgICAgICAgdGV4dEZpZWxkKGlkOid0eHQnLCBlbmFibGVkOmJpbmQoc291cmNlOmNiLCBzb3VyY2VQcm9wZXJ0eTonc2VsZWN0ZWQnLCBpZDonYmluZGluZycpKQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgYXNzZXJ0IHN3aW5nLnR4dC5lbmFibGVkID09IHN3aW5nLmNiLnNlbGVjdGVkDQorICAgICAgICBzd2luZy5jYi5zZWxlY3RlZCA9ICFzd2luZy5jYi5zZWxlY3RlZA0KKyAgICAgICAgYXNzZXJ0IHN3aW5nLnR4dC5lbmFibGVkID09IHN3aW5nLmNiLnNlbGVjdGVkDQorICAgICAgICBzd2luZy5jYi5zZWxlY3RlZCA9ICFzd2luZy5jYi5zZWxlY3RlZA0KKyAgICAgICAgYXNzZXJ0IHN3aW5nLnR4dC5lbmFibGVkID09IHN3aW5nLmNiLnNlbGVjdGVkDQorDQorICAgICAgICBzd2luZy5iaW5kaW5nLnJlYmluZCgpDQorICAgICAgICBzd2luZy5jYi5zZWxlY3RlZCA9ICFzd2luZy5jYi5zZWxlY3RlZA0KKyAgICAgICAgYXNzZXJ0IHN3aW5nLnR4dC5lbmFibGVkID09IHN3aW5nLmNiLnNlbGVjdGVkDQorICAgICAgICBzd2luZy5iaW5kaW5nLnVuYmluZCgpDQorICAgICAgICBzd2luZy5jYi5zZWxlY3RlZCA9ICFzd2luZy5jYi5zZWxlY3RlZA0KKyAgICAgICAgYXNzZXJ0IHN3aW5nLnR4dC5lbmFibGVkICE9IHN3aW5nLmNiLnNlbGVjdGVkDQorICAgICAgICBzd2luZy5iaW5kaW5nLmJpbmQoKQ0KKyAgICAgICAgYXNzZXJ0IHN3aW5nLnR4dC5lbmFibGVkICE9IHN3aW5nLmNiLnNlbGVjdGVkDQorICAgICAgICBzd2luZy5iaW5kaW5nLnVwZGF0ZSgpDQorICAgICAgICBhc3NlcnQgc3dpbmcudHh0LmVuYWJsZWQgPT0gc3dpbmcuY2Iuc2VsZWN0ZWQNCisNCisgICAgICAgIERlZmF1bHRCdXR0b25Nb2RlbCBtZCA9IG5ldyBEZWZhdWx0QnV0dG9uTW9kZWwoKQ0KKyAgICAgICAgbWQuZW5hYmxlZCA9ICFzd2luZy50eHQuZW5hYmxlZA0KKyAgICAgICAgc3dpbmcuY2IubW9kZWwgPSBtZA0KKyAgICAgICAgYXNzZXJ0IHN3aW5nLnR4dC5lbmFibGVkID09IHN3aW5nLmNiLnNlbGVjdGVkDQorDQorICAgICAgICBzd2luZy50eHQuZW5hYmxlZCA9ICFzd2luZy50eHQuZW5hYmxlZA0KKyAgICAgICAgc3dpbmcuYmluZGluZy5yZXZlcnNlVXBkYXRlKCkNCisgICAgICAgIGFzc2VydCBzd2luZy50eHQuZW5hYmxlZCA9PSBzd2luZy5jYi5zZWxlY3RlZA0KKw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHRlc3RFdmVudEJpbmRpbmcoKSB7DQorICAgICAgICBpZiAoaXNIZWFkbGVzcygpKSByZXR1cm4NCisgICAgICAgIFN3aW5nQnVpbGRlciBzd2luZyA9IG5ldyBTd2luZ0J1aWxkZXIoKQ0KKw0KKyAgICAgICAgc3dpbmcuYWN0aW9ucygpIHsNCisgICAgICAgICAgICBidXR0b24oJ0J1dHRvbiEnLCBpZDonYicpDQorICAgICAgICAgICAgdGV4dEZpZWxkKGlkOid0eHQnLCB0ZXh0OmJpbmQoc291cmNlOmIsIHNvdXJjZUV2ZW50OidhY3Rpb25QZXJmb3JtZWQnLCBzb3VyY2VWYWx1ZTp7Yi50ZXh0fSkpDQorICAgICAgICB9DQorDQorICAgICAgICBhc3NlcnQgc3dpbmcudHh0LnRleHQgPT0gJ0J1dHRvbiEnDQorICAgICAgICBzd2luZy5iLnRleHQgPSAnUHJlc3NlZCEnDQorICAgICAgICAvLyBub3QgcHJlc3NlZCB5ZXQuLi4NCisgICAgICAgIGFzc2VydCBzd2luZy50eHQudGV4dCA9PSAnQnV0dG9uIScNCisgICAgICAgIHN3aW5nLmIuZG9DbGljaygpDQorICAgICAgICAvL29rLCBub3cgaXQncyBwcmVzc2VkDQorICAgICAgICBhc3NlcnQgc3dpbmcudHh0LnRleHQgPT0gJ1ByZXNzZWQhJw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eUJpbmRpbmcoKSB7DQorICAgICAgICBpZiAoaXNIZWFkbGVzcygpKSByZXR1cm4NCisgICAgICAgIFN3aW5nQnVpbGRlciBzd2luZyA9IG5ldyBTd2luZ0J1aWxkZXIoKQ0KKw0KKyAgICAgICAgc3dpbmcuYWN0aW9ucygpIHsNCisgICAgICAgICAgICBjaGVja0JveCgnQnV0dG9uIScsIGlkOidjYicpDQorICAgICAgICAgICAgdGV4dEZpZWxkKGlkOid0eHQnLCBlbmFibGVkOmJpbmQoc291cmNlOmNiLCBzb3VyY2VQcm9wZXJ0eTonZW5hYmxlZCcsIGlkOidiaW5kaW5nJykpDQorICAgICAgICB9DQorICAgICAgICBhc3NlcnQgc3dpbmcudHh0LmVuYWJsZWQgPT0gc3dpbmcuY2IuZW5hYmxlZA0KKyAgICAgICAgc3dpbmcuY2IuZW5hYmxlZCA9ICFzd2luZy5jYi5lbmFibGVkDQorICAgICAgICBhc3NlcnQgc3dpbmcudHh0LmVuYWJsZWQgPT0gc3dpbmcuY2IuZW5hYmxlZA0KKyAgICAgICAgc3dpbmcuY2IuZW5hYmxlZCA9ICFzd2luZy5jYi5lbmFibGVkDQorICAgICAgICBhc3NlcnQgc3dpbmcudHh0LmVuYWJsZWQgPT0gc3dpbmcuY2IuZW5hYmxlZA0KKw0KKyAgICAgICAgc3dpbmcuYmluZGluZy5yZWJpbmQoKQ0KKyAgICAgICAgc3dpbmcuY2IuZW5hYmxlZCA9ICFzd2luZy5jYi5lbmFibGVkDQorICAgICAgICBhc3NlcnQgc3dpbmcudHh0LmVuYWJsZWQgPT0gc3dpbmcuY2IuZW5hYmxlZA0KKyAgICAgICAgc3dpbmcuYmluZGluZy51bmJpbmQoKQ0KKyAgICAgICAgc3dpbmcuY2IuZW5hYmxlZCA9ICFzd2luZy5jYi5lbmFibGVkDQorICAgICAgICBhc3NlcnQgc3dpbmcudHh0LmVuYWJsZWQgIT0gc3dpbmcuY2IuZW5hYmxlZA0KKyAgICAgICAgc3dpbmcuYmluZGluZy5iaW5kKCkNCisgICAgICAgIGFzc2VydCBzd2luZy50eHQuZW5hYmxlZCAhPSBzd2luZy5jYi5lbmFibGVkDQorICAgICAgICBzd2luZy5iaW5kaW5nLnVwZGF0ZSgpDQorICAgICAgICBhc3NlcnQgc3dpbmcudHh0LmVuYWJsZWQgPT0gc3dpbmcuY2IuZW5hYmxlZA0KKw0KKyAgICAgICAgc3dpbmcudHh0LmVuYWJsZWQgPSAhc3dpbmcudHh0LmVuYWJsZWQNCisgICAgICAgIHN3aW5nLmJpbmRpbmcucmV2ZXJzZVVwZGF0ZSgpDQorICAgICAgICBhc3NlcnQgc3dpbmcudHh0LmVuYWJsZWQgPT0gc3dpbmcuY2IuZW5hYmxlZA0KKw0KKyAgICAgICAgRGVmYXVsdEJ1dHRvbk1vZGVsIG1kID0gbmV3IERlZmF1bHRCdXR0b25Nb2RlbCgpDQorICAgICAgICBtZC5lbmFibGVkID0gIXN3aW5nLnR4dC5lbmFibGVkDQorICAgICAgICBzd2luZy5jYi5tb2RlbCA9IG1kDQorICAgICAgICBhc3NlcnQgc3dpbmcudHh0LmVuYWJsZWQgPT0gc3dpbmcuY2IuZW5hYmxlZA0KKyAgICB9DQorDQorDQorICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RlbCgpIHsNCisgICAgICAgIGlmIChpc0hlYWRsZXNzKCkpIHJldHVybg0KKyAgICAgICAgU3dpbmdCdWlsZGVyIHN3aW5nID0gbmV3IFN3aW5nQnVpbGRlcigpDQorDQorICAgICAgICBkZWYgYmVhbiA9IG5ldyBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuRHVtbXlCZWFuKCkNCisNCisgICAgICAgIHN3aW5nLm1vZGVsKGJlYW4sIGlkOidkdW1teUJlYW4nKQ0KKw0KKyAgICAgICAgLy8gdGVzdCBpbml0aWFsIGJpbmRpbmcNCisgICAgICAgIHN3aW5nLnRleHRGaWVsZChpZDondGV4dEZpZWxkJywgdGV4dDpzd2luZy5kdW1teUJlYW4ubmFtZSkNCisgICAgICAgIGFzc2VydCBzd2luZy50ZXh0RmllbGQudGV4dCA9PSBiZWFuLm5hbWUNCisNCisgICAgICAgIC8vIHRlc3Qgbm8gbGl2ZSB1cGRhdGUgYnkgZGVmYXVsdA0KKyAgICAgICAgYmVhbi5uYW1lID0gJ0pvY2hlbicNCisgICAgICAgIGFzc2VydCBzd2luZy50ZXh0RmllbGQudGV4dCAhPSBiZWFuLm5hbWUNCisNCisgICAgICAgIC8vIHRlc3QgZm9yIHVwZGF0ZSBvbiBiZWFuIGNoYW5nZQ0KKyAgICAgICAgYmVhbiA9IG5ldyBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuRHVtbXlCZWFuKCkNCisgICAgICAgIGJlYW4ubmFtZSA9ICdBbGV4Jw0KKyAgICAgICAgc3dpbmcuZHVtbXlCZWFuLnNldE1vZGVsKGJlYW4pDQorICAgICAgICBhc3NlcnQgc3dpbmcudGV4dEZpZWxkLnRleHQgPT0gYmVhbi5uYW1lDQorDQorDQorICAgICAgICAvL3Rlc3QgZm9yIGF1dG8tdXBkYXRlDQorICAgICAgICBzd2luZy5tb2RlbChiZWFuLCBpZDonYm91bmREdW1teUJlYW4nLCBiaW5kOnRydWUpDQorICAgICAgICBzd2luZy50ZXh0RmllbGQoaWQ6J2JvdW5kVGV4dEZpZWxkJywgdGV4dDpzd2luZy5ib3VuZER1bW15QmVhbi5uYW1lKQ0KKyAgICAgICAgYXNzZXJ0IHN3aW5nLmJvdW5kVGV4dEZpZWxkLnRleHQgPT0gYmVhbi5uYW1lDQorICAgICAgICBiZWFuLm5hbWUgPSAnRGFubm8nDQorICAgICAgICBhc3NlcnQgc3dpbmcuYm91bmRUZXh0RmllbGQudGV4dCA9PSBiZWFuLm5hbWUNCisNCisgICAgICAgIC8vIG9sZCBtb2RlbCBiaW5kaW5nIGNvdWxkIGJlIGxpc3RlbmluZy4uLg0KKyAgICAgICAgYXNzZXJ0IHN3aW5nLnRleHRGaWVsZC50ZXh0ICE9IGJlYW4ubmFtZQ0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvc3dpbmcvU3dpbmdCdWlsZGVyVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3N3aW5nL1N3aW5nQnVpbGRlclRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMjYxMzUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3N3aW5nL1N3aW5nQnVpbGRlclRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTQ5NyBAQAorLyoKKyAqICRJZDogICQKKyAqIAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2UgZ3Jvb3Z5LnN3aW5nCisKK2ltcG9ydCBqYXZheC5zd2luZy5KUG9wdXBNZW51LlNlcGFyYXRvciBhcyBKUG9wdXBNZW51X1NlcGFyYXRvcgoraW1wb3J0IGphdmF4LnN3aW5nLkpUb29sQmFyLlNlcGFyYXRvciBhcyBKVG9vbEJhcl9TZXBhcmF0b3IKKworaW1wb3J0IGdyb292eS51aS5Db25zb2xlCitpbXBvcnQgamF2YS5hd3QuKgoraW1wb3J0IGphdmEuYXd0LmV2ZW50LklucHV0RXZlbnQKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5LZXlFdmVudAoraW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0CitpbXBvcnQgamF2YXguc3dpbmcuKgoraW1wb3J0IGphdmF4LnN3aW5nLmJvcmRlci5UaXRsZWRCb3JkZXIKK2ltcG9ydCBqYXZheC5zd2luZy5wbGFmLm1ldGFsLk1ldGFsTG9va0FuZEZlZWwKK2ltcG9ydCBqYXZheC5zd2luZy50ZXh0LkRhdGVGb3JtYXR0ZXIKK2ltcG9ydCBqYXZheC5zd2luZy50ZXh0Lk51bWJlckZvcm1hdHRlcgorCitjbGFzcyBTd2luZ0J1aWxkZXJUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBoZWFkbGVzcworCisgICAgc3RhdGljIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBKRnJhbWUoInRlc3RpbmciKQorICAgICAgICAgICAgaGVhZGxlc3MgPSBmYWxzZQorICAgICAgICB9IGNhdGNoIChqYXZhLmF3dC5IZWFkbGVzc0V4Y2VwdGlvbiBoZSkgeworICAgICAgICAgICAgaGVhZGxlc3MgPSB0cnVlCisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHRlc3ROYW1lZFdpZGdldENyZWF0aW9uKCkgeworICAgICAgICBpZiAoaGVhZGxlc3MpIHJldHVybgorCisgICAgICAgIGRlZiB0b3BMZXZlbFdpZGdldHMgPSBbCisgICAgICAgICAgICBmcmFtZTogW0pGcmFtZS5jbGFzcywgdHJ1ZV0sCisgICAgICAgICAgICBkaWFsb2c6IFtKRGlhbG9nLmNsYXNzLCB0cnVlXSwKKyAgICAgICAgICAgIHdpbmRvdzogW0pXaW5kb3cuY2xhc3MsIGZhbHNlXSwKKyAgICAgICAgICAgIGZpbGVDaG9vc2VyOiBbSkZpbGVDaG9vc2VyLmNsYXNzLCBmYWxzZV0sCisgICAgICAgICAgICBvcHRpb25QYW5lOiBbSk9wdGlvblBhbmUuY2xhc3MsIGZhbHNlXQorICAgICAgICBdCisgICAgICAgIGRlZiBzd2luZyA9IG5ldyBTd2luZ0J1aWxkZXIoKQorICAgICAgICB0b3BMZXZlbFdpZGdldHMuZWFjaHsgbmFtZSwgd2lkZ2V0SW5mbyAtPgorICAgICAgICAgICAgaWYgKHdpZGdldEluZm9bMV0pCisgICAgICAgICAgICAgICAgc3dpbmcuIiRuYW1lIihpZDoiJHtuYW1lfUlkIi50b1N0cmluZygpLCB0aXRsZToiVGhpcyBpcyBteSAkbmFtZSIpCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc3dpbmcuIiRuYW1lIihpZDoiJHtuYW1lfUlkIi50b1N0cmluZygpKQorICAgICAgICAgICAgZGVmIHdpZGdldCA9IHN3aW5nLiIke25hbWV9SWQiCisgICAgICAgICAgICBhc3NlcnQgd2lkZ2V0LmNsYXNzID09IHdpZGdldEluZm9bMF0KKyAgICAgICAgICAgIGlmICh3aWRnZXRJbmZvWzFdKSBhc3NlcnQgd2lkZ2V0LnRpdGxlID09ICJUaGlzIGlzIG15ICRuYW1lIgorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCB0ZXN0TGF5b3V0Q3JlYXRpb24oKSB7CisgICAgICAgIGlmIChoZWFkbGVzcykgcmV0dXJuCisKKyAgICAgICAgZGVmIGxheW91dHMgPSBbCisgICAgICAgICAgICBib3JkZXJMYXlvdXQ6IEJvcmRlckxheW91dC5jbGFzcywKKyAgICAgICAgICAgIGNhcmRMYXlvdXQ6IENhcmRMYXlvdXQuY2xhc3MsCisgICAgICAgICAgICBmbG93TGF5b3V0OiBGbG93TGF5b3V0LmNsYXNzLAorICAgICAgICAgICAgZ3JpZEJhZ0xheW91dDogR3JpZEJhZ0xheW91dC5jbGFzcywKKyAgICAgICAgICAgIGdyaWRMYXlvdXQ6IEdyaWRMYXlvdXQuY2xhc3MsCisvLyAgICAgICAgICAgIG92ZXJsYXlMYXlvdXQ6IE92ZXJsYXlMYXlvdXQuY2xhc3MsCisgICAgICAgICAgICBzcHJpbmdMYXlvdXQ6IFNwcmluZ0xheW91dC5jbGFzcywKKy8vICAgICAgICAgICAgYm94TGF5b3V0OiBCb3hMYXlvdXQuY2xhc3MKKyAgICAgICAgXQorICAgICAgICBkZWYgc3dpbmcgPSBuZXcgU3dpbmdCdWlsZGVyKCkKKyAgICAgICAgbGF5b3V0cy5lYWNoeyBuYW1lLCBleHBlY3RlZExheW91dENsYXNzIC0+CisgICAgICAgICAgICBkZWYgZnJhbWUgPSBzd2luZy5mcmFtZSgpeworICAgICAgICAgICAgICAgIiRuYW1lIigpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnQgZnJhbWUuY29udGVudFBhbmUubGF5b3V0LmNsYXNzID09IGV4cGVjdGVkTGF5b3V0Q2xhc3MKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgdGVzdFdpZGdldENyZWF0aW9uKCkgeworICAgICAgICBpZiAoaGVhZGxlc3MpIHJldHVybgorCisgICAgICAgIGRlZiB3aWRnZXRzID0gWworICAgICAgICAgICAgYnV0dG9uOiBKQnV0dG9uLmNsYXNzLAorICAgICAgICAgICAgY2hlY2tCb3g6IEpDaGVja0JveC5jbGFzcywKKyAgICAgICAgICAgIGNoZWNrQm94TWVudUl0ZW06IEpDaGVja0JveE1lbnVJdGVtLmNsYXNzLAorICAgICAgICAgICAgY29sb3JDaG9vc2VyOiBKQ29sb3JDaG9vc2VyLmNsYXNzLAorICAgICAgICAgICAgY29tYm9Cb3g6IEpDb21ib0JveC5jbGFzcywKKyAgICAgICAgICAgIGRlc2t0b3BQYW5lOiBKRGVza3RvcFBhbmUuY2xhc3MsCisgICAgICAgICAgICBlZGl0b3JQYW5lOiBKRWRpdG9yUGFuZS5jbGFzcywKKyAgICAgICAgICAgIGZvcm1hdHRlZFRleHRGaWVsZDogSkZvcm1hdHRlZFRleHRGaWVsZC5jbGFzcywKKyAgICAgICAgICAgIGludGVybmFsRnJhbWU6IEpJbnRlcm5hbEZyYW1lLmNsYXNzLAorICAgICAgICAgICAgbGFiZWw6IEpMYWJlbC5jbGFzcywKKyAgICAgICAgICAgIGxheWVyZWRQYW5lOiBKTGF5ZXJlZFBhbmUuY2xhc3MsCisgICAgICAgICAgICBsaXN0OiBKTGlzdC5jbGFzcywKKyAgICAgICAgICAgIG1lbnU6IEpNZW51LmNsYXNzLAorICAgICAgICAgICAgbWVudUJhcjogSk1lbnVCYXIuY2xhc3MsCisgICAgICAgICAgICBtZW51SXRlbTogSk1lbnVJdGVtLmNsYXNzLAorICAgICAgICAgICAgcGFuZWw6IEpQYW5lbC5jbGFzcywKKyAgICAgICAgICAgIHBhc3N3b3JkRmllbGQ6IEpQYXNzd29yZEZpZWxkLmNsYXNzLAorICAgICAgICAgICAgcG9wdXBNZW51OiBKUG9wdXBNZW51LmNsYXNzLAorICAgICAgICAgICAgcHJvZ3Jlc3NCYXI6IEpQcm9ncmVzc0Jhci5jbGFzcywKKyAgICAgICAgICAgIHJhZGlvQnV0dG9uOiBKUmFkaW9CdXR0b24uY2xhc3MsCisgICAgICAgICAgICByYWRpb0J1dHRvbk1lbnVJdGVtOiBKUmFkaW9CdXR0b25NZW51SXRlbS5jbGFzcywKKyAgICAgICAgICAgIHNjcm9sbEJhcjogSlNjcm9sbEJhci5jbGFzcywKKyAgICAgICAgICAgIHNjcm9sbFBhbmU6IEpTY3JvbGxQYW5lLmNsYXNzLAorICAgICAgICAgICAgc2VwYXJhdG9yOiBKU2VwYXJhdG9yLmNsYXNzLAorICAgICAgICAgICAgc2xpZGVyOiBKU2xpZGVyLmNsYXNzLAorICAgICAgICAgICAgc3Bpbm5lcjogSlNwaW5uZXIuY2xhc3MsCisgICAgICAgICAgICBzcGxpdFBhbmU6IEpTcGxpdFBhbmUuY2xhc3MsCisgICAgICAgICAgICB0YWJiZWRQYW5lOiBKVGFiYmVkUGFuZS5jbGFzcywKKyAgICAgICAgICAgIHRhYmxlOiBKVGFibGUuY2xhc3MsCisgICAgICAgICAgICB0ZXh0QXJlYTogSlRleHRBcmVhLmNsYXNzLAorICAgICAgICAgICAgdGV4dFBhbmU6IEpUZXh0UGFuZS5jbGFzcywKKyAgICAgICAgICAgIHRleHRGaWVsZDogSlRleHRGaWVsZC5jbGFzcywKKyAgICAgICAgICAgIHRvZ2dsZUJ1dHRvbjogSlRvZ2dsZUJ1dHRvbi5jbGFzcywKKyAgICAgICAgICAgIHRvb2xCYXI6IEpUb29sQmFyLmNsYXNzLAorICAgICAgICAgICAgdHJlZTogSlRyZWUuY2xhc3MsCisgICAgICAgICAgICB2aWV3cG9ydDogSlZpZXdwb3J0LmNsYXNzLAorICAgICAgICBdCisgICAgICAgIGRlZiBzd2luZyA9IG5ldyBTd2luZ0J1aWxkZXIoKQorICAgICAgICB3aWRnZXRzLmVhY2h7IG5hbWUsIGV4cGVjdGVkTGF5b3V0Q2xhc3MgLT4KKyAgICAgICAgICAgIGRlZiBmcmFtZSA9IHN3aW5nLmZyYW1lKCl7CisgICAgICAgICAgICAgICAiJG5hbWUiKGlkOiIke25hbWV9SWQiLnRvU3RyaW5nKCkpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnQgc3dpbmcuIiR7bmFtZX1JZCIuY2xhc3MgPT0gZXhwZWN0ZWRMYXlvdXRDbGFzcworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCB0ZXN0QnV0dG9uR3JvdXBPbmx5Rm9yQnV0dG9ucygpIHsKKyAgICAgICAgaWYgKGhlYWRsZXNzKSByZXR1cm4KKworICAgICAgICBkZWYgc3dpbmcgPSBuZXcgU3dpbmdCdWlsZGVyKCkKKyAgICAgICAgZGVmIGJ1dHRvbkdyb3VwID0gc3dpbmcuYnV0dG9uR3JvdXAoKQorICAgICAgICBzaG91bGRGYWlsKE1pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbikgeworICAgICAgICAgICAgc3dpbmcubGFiZWwoYnV0dG9uR3JvdXA6YnV0dG9uR3JvdXApCisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHRlc3RXaWRnZXQoKSB7CisgICAgICAgIGlmIChoZWFkbGVzcykgcmV0dXJuCisKKyAgICAgICAgZGVmIHN3aW5nID0gbmV3IFN3aW5nQnVpbGRlcigpCisgICAgICAgIGRlZiBsYWJlbCA9IHN3aW5nLmxhYmVsKCJCeSBWYWx1ZToiKQorICAgICAgICBkZWYgd2lkZ2V0QnlWYWx1ZSA9IHN3aW5nLndpZGdldChsYWJlbCkKKyAgICAgICAgYXNzZXJ0IHdpZGdldEJ5VmFsdWUgIT0gbnVsbAorICAgICAgICBkZWYgd2lkZ2V0QnlMYWJlbCA9IHN3aW5nLndpZGdldCh3aWRnZXQ6IGxhYmVsKQorICAgICAgICBhc3NlcnQgd2lkZ2V0QnlMYWJlbCAhPSBudWxsCisgICAgfQorCisgICAgdm9pZCB0ZXN0VGFibGVDb2x1bW4oKSB7CisgICAgICAgIGlmIChoZWFkbGVzcykgcmV0dXJuCisKKyAgICAgICAgLy8gVE9ETyBpcyB0aGlzIHJlcXVpcmVkPworICAgICAgICBkZWYgc3dpbmcgPSBuZXcgU3dpbmdCdWlsZGVyKCkKKyAgICAgICAgc3dpbmcudGFibGV7CisgICAgICAgICAgICB0YWJsZUNvbHVtbigpCisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHRlc3RTcGxpdFBhbmUoKSB7CisgICAgICAgIGlmIChoZWFkbGVzcykgcmV0dXJuCisKKyAgICAgICAgZGVmIHN3aW5nID0gbmV3IFN3aW5nQnVpbGRlcigpCisgICAgICAgIGRlZiBidXR0b25Hcm91cCA9IHN3aW5nLmJ1dHRvbkdyb3VwKCkKKyAgICAgICAgZGVmIGZyYW1lID0gc3dpbmcuZnJhbWUoKXsKKyAgICAgICAgICAgIHNwbGl0UGFuZShpZDonaHNwbGl0Jywgb3JpZW50YXRpb246IEpTcGxpdFBhbmUuSE9SSVpPTlRBTF9TUExJVCkgeworICAgICAgICAgICAgICAgIGJ1dHRvbihpZDonbGVmdCcsIGJ1dHRvbkdyb3VwOmJ1dHRvbkdyb3VwKQorICAgICAgICAgICAgICAgIGJ1dHRvbihpZDoncmlnaHQnLCBidXR0b25Hcm91cDpidXR0b25Hcm91cCkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwbGl0UGFuZShpZDondnNwbGl0Jywgb3JpZW50YXRpb246IEpTcGxpdFBhbmUuVkVSVElDQUxfU1BMSVQpIHsKKyAgICAgICAgICAgICAgICBidXR0b24oaWQ6J3RvcCcpCisgICAgICAgICAgICAgICAgYnV0dG9uKGlkOidib3R0b20nKQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFzc2VydCBzd2luZy5oc3BsaXQubGVmdENvbXBvbmVudCA9PSBzd2luZy5sZWZ0CisgICAgICAgIGFzc2VydCBzd2luZy5oc3BsaXQucmlnaHRDb21wb25lbnQgPT0gc3dpbmcucmlnaHQKKyAgICAgICAgYXNzZXJ0IHN3aW5nLnZzcGxpdC50b3BDb21wb25lbnQgPT0gc3dpbmcudG9wCisgICAgICAgIGFzc2VydCBzd2luZy52c3BsaXQuYm90dG9tQ29tcG9uZW50ID09IHN3aW5nLmJvdHRvbQorICAgIH0KKworICAgIHZvaWQgdGVzdE5lc3RlZFdpbmRvd3MoKSB7CisgICAgICAgIGlmIChoZWFkbGVzcykgcmV0dXJuCisKKyAgICAgICAgZGVmIHN3aW5nID0gbmV3IFN3aW5nQnVpbGRlcigpCisgICAgICAgIHN3aW5nLndpbmRvdyAoaWQ6J3Jvb3QnKSB7CisgICAgICAgICAgICB3aW5kb3coaWQ6J2NoaWxkMScpCisgICAgICAgICAgICBmcmFtZShpZDonY2hpbGQyJykgeworICAgICAgICAgICAgICAgIHdpbmRvdyhpZDonY2hpbGQyXzEnKQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN3aW5nLndpbmRvdyAoaWQ6J3Jvb3QyJykKKworICAgICAgICAvL2Fzc2VydCBzd2luZy5yb290Lm93bmVyID09IG51bGw7CisgICAgICAgIGFzc2VydCBzd2luZy5jaGlsZDEub3duZXIgPT0gc3dpbmcucm9vdAorICAgICAgICBhc3NlcnQgc3dpbmcuY2hpbGQyLm93bmVyID09IG51bGwgLy8gaXQncyBhIGZyYW1lLCBmcmFtZXMgaGF2ZSBubyBvd25lcnMKKyAgICAgICAgYXNzZXJ0IHN3aW5nLmNoaWxkMl8xLm93bmVyID09IHN3aW5nLmNoaWxkMgorCisgICAgICAgIGFzc2VydCBzd2luZy5yb290Mi5vd25lciAhPSBzd2luZy5yb290CisgICAgICAgIGFzc2VydCBzd2luZy5yb290Mi5vd25lciAhPSBzd2luZy5jaGlsZDEKKyAgICAgICAgYXNzZXJ0IHN3aW5nLnJvb3QyLm93bmVyICE9IHN3aW5nLmNoaWxkMgorICAgICAgICBhc3NlcnQgc3dpbmcucm9vdDIub3duZXIgIT0gc3dpbmcuY2hpbGQyXzEKKworICAgICAgICBzd2luZy5wYW5lbCB7CisgICAgICAgICAgICBzd2luZy5mcmFtZSgpCisgICAgICAgICAgICBzd2luZy53aW5kb3coKQorICAgICAgICAgICAgc3dpbmcuZGlhbG9nKCkKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgdGVzdEZyYW1lcygpIHsKKyAgICAgICAgaWYgKGhlYWRsZXNzKSByZXR1cm4KKyAgICAgICAgZGVmIHN3aW5nID0gbmV3IFN3aW5nQnVpbGRlcigpCisKKyAgICAgICAgc3dpbmcuZnJhbWUoaWQ6J2ZyYW1lJykgeworICAgICAgICAgICAgYnV0dG9uKCd0ZXN0JywgaWQ6J2J1dHRvbicsIGRlZmF1bHRCdXR0b246dHJ1ZSkKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQgc3dpbmcuZnJhbWUucm9vdFBhbmUuZGVmYXVsdEJ1dHRvbiA9PSBzd2luZy5idXR0b24KKyAgICAgICAgYXNzZXJ0IHN3aW5nLmJ1dHRvbi5kZWZhdWx0QnV0dG9uCisgICAgfQorCisgICAgdm9pZCB0ZXN0RGlhbG9ncygpIHsKKyAgICAgICAgaWYgKGhlYWRsZXNzKSByZXR1cm4KKworICAgICAgICBkZWYgc3dpbmcgPSBuZXcgU3dpbmdCdWlsZGVyKCkKKyAgICAgICAgc3dpbmcuZGlhbG9nKGlkOidkMScpCisgICAgICAgIHN3aW5nLmZyYW1lKGlkOidmJykgeyBkaWFsb2coaWQ6J2ZkJykgfQorICAgICAgICBzd2luZy5kaWFsb2coaWQ6J2QnKSB7IGRpYWxvZyhpZDonZGQnKSB9CisgICAgICAgIHN3aW5nLmRpYWxvZyhpZDonZDInKQorCisgICAgICAgIC8vYXNzZXJ0IHN3aW5nLmQxLm93bmVyID09IG51bGwKKyAgICAgICAgYXNzZXJ0IHN3aW5nLmZkLm93bmVyID09IHN3aW5nLmYKKyAgICAgICAgYXNzZXJ0IHN3aW5nLmRkLm93bmVyID09IHN3aW5nLmQKKworICAgICAgICBhc3NlcnQgc3dpbmcuZDIub3duZXIgIT0gc3dpbmcuZGQKKyAgICAgICAgYXNzZXJ0IHN3aW5nLmQyLm93bmVyICE9IHN3aW5nLmZkCisgICAgICAgIGFzc2VydCBzd2luZy5kMi5vd25lciAhPSBzd2luZy5kCisgICAgICAgIGFzc2VydCBzd2luZy5kMi5vd25lciAhPSBzd2luZy5mCisgICAgICAgIGFzc2VydCBzd2luZy5kMi5vd25lciAhPSBzd2luZy5kMQorICAgIH0KKworICAgIHZvaWQgdGVzdFdpbmRvd3MoKSB7CisgICAgICAgIGlmIChoZWFkbGVzcykgcmV0dXJuCisKKyAgICAgICAgZGVmIHN3aW5nID0gbmV3IFN3aW5nQnVpbGRlcigpCisgICAgICAgIHN3aW5nLndpbmRvdygpCisgICAgICAgIHN3aW5nLmZyYW1leyB3aW5kb3coKSB9CisgICAgICAgIHN3aW5nLmRpYWxvZ3sgd2luZG93KCkgfQorICAgIH0KKworICAgIHZvaWQgdGVzdE5vZGVDcmVhdGlvbigpIHsKKyAgICAgICAgaWYgKGhlYWRsZXNzKSByZXR1cm4KKworICAgICAgICBkZWYgc3dpbmcgPSBuZXcgU3dpbmdCdWlsZGVyKCkKKyAgICAgICAgZGVmIGZyYW1lID0gc3dpbmcuZnJhbWUoKXsKKyAgICAgICAgICAgIC8vIDQgdmFsaWQgcGFyYW1ldGVyIGNvbWJpbmF0aW9ucworICAgICAgICAgICAgYnV0dG9uKCkKKyAgICAgICAgICAgIGJ1dHRvbignVGV4dCcpCisgICAgICAgICAgICBidXR0b24obGFiZWw6J0xhYmVsJykKKyAgICAgICAgICAgIGJ1dHRvbihsYWJlbDonTGFiZWwnLCAnVGV4dCcpCisgICAgICAgIH0KKyAgICAgICAgc2hvdWxkRmFpbCgpeworICAgICAgICAgICAgZnJhbWUgPSBzd2luZy5mcmFtZSgpeworICAgICAgICAgICAgICAgIC8vIGludmFsaWQgcGFyYW1ldGVyCisgICAgICAgICAgICAgICAgYnV0dG9uKG5ldyBEYXRlKCkpCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHRlc3RTZXRNbmVtb25pYygpIHsKKyAgICAgICAgaWYgKGhlYWRsZXNzKSByZXR1cm4KKworICAgICAgICBkZWYgc3dpbmcgPSBuZXcgU3dpbmdCdWlsZGVyKCkKKyAgICAgICAgc3dpbmcucGFuZWwobGF5b3V0Om5ldyBCb3JkZXJMYXlvdXQoKSkgeworICAgICAgICAgICAgbGFiZWwoaWQ6J2xhYmVsMCcsIHRleHQ6J05hbWUwJywgbW5lbW9uaWM6NDgpCisgICAgICAgICAgICBsYWJlbChpZDonbGFiZWwxJywgdGV4dDonTmFtZTEnLCBtbmVtb25pYzonTicpCisgICAgICAgIH0KKyAgICAgICAgaW50IGV4cGVjdGVkMCA9ICcwJworICAgICAgICBpbnQgZXhwZWN0ZWQxID0gJ04nCisgICAgICAgIGFzc2VydCBzd2luZy5sYWJlbDAuZGlzcGxheWVkTW5lbW9uaWMgPT0gZXhwZWN0ZWQwCisgICAgICAgIGFzc2VydCBzd2luZy5sYWJlbDEuZGlzcGxheWVkTW5lbW9uaWMgPT0gZXhwZWN0ZWQxCisgICAgICAgIHN3aW5nLm1lbnVCYXJ7CisgICAgICAgICAgICBtZW51eworICAgICAgICAgICAgICAgIG1lbnVJdGVtIHsKKyAgICAgICAgICAgICAgICAgICAgYWN0aW9uKGlkOidhY3Rpb25JZCcsIG5hbWU6J0Fib3V0JywgbW5lbW9uaWM6J0EnKQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnQgZXhwZWN0ZWQyID0gJ0EnCisgICAgICAgIGludCBhY3R1YWwgPSBzd2luZy5hY3Rpb25JZC5nZXRWYWx1ZShBY3Rpb24uTU5FTU9OSUNfS0VZKQorICAgICAgICBhc3NlcnQgIGFjdHVhbCA9PSBleHBlY3RlZDIKKyAgICB9CisKKyAgICB2b2lkIHRlc3RCdWlsZGVyUHJvcGVydGllcygpIHsKKyAgICAgICAgaWYgKGhlYWRsZXNzKSByZXR1cm4KKworICAgICAgICBkZWYgc3dpbmcgPSBuZXcgU3dpbmdCdWlsZGVyKCkKKyAgICAgICAgYXNzZXJ0IHN3aW5nLmNsYXNzLm5hbWUgPT0gJ2dyb292eS5zd2luZy5Td2luZ0J1aWxkZXInCisgICAgfQorCisgICAgdm9pZCB0ZXN0Rm9ybWF0dGVkVGV4dEZpZWxkKCkgeworICAgICAgICBpZiAoaGVhZGxlc3MpIHJldHVybgorCisgICAgICAgIGRlZiBzd2luZyA9IG5ldyBTd2luZ0J1aWxkZXIoKQorICAgICAgICBkZWYgZHVtbXkgPSBuZXcgRGF0ZSgpCisgICAgICAgIGRlZiBmaWVsZCA9IHN3aW5nLmZvcm1hdHRlZFRleHRGaWVsZCh2YWx1ZTpkdW1teSkKKyAgICAgICAgYXNzZXJ0IGZpZWxkLnZhbHVlID09IGR1bW15CisgICAgICAgIGFzc2VydCBmaWVsZC5mb3JtYXR0ZXIuY2xhc3MgPT0gRGF0ZUZvcm1hdHRlci5jbGFzcworICAgICAgICBkZWYgZHVtbXlGb3JtYXR0ZXIgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgpCisgICAgICAgIGZpZWxkID0gc3dpbmcuZm9ybWF0dGVkVGV4dEZpZWxkKGZvcm1hdDpkdW1teUZvcm1hdHRlcikKKyAgICAgICAgYXNzZXJ0IGZpZWxkLmZvcm1hdHRlci5jbGFzcyA9PSBEYXRlRm9ybWF0dGVyLmNsYXNzCisgICAgICAgIGZpZWxkID0gc3dpbmcuZm9ybWF0dGVkVGV4dEZpZWxkKCkKKyAgICAgICAgZmllbGQudmFsdWUgPSAzCisgICAgICAgIGFzc2VydCBmaWVsZC5mb3JtYXR0ZXIuY2xhc3MgPT0gTnVtYmVyRm9ybWF0dGVyLmNsYXNzCisgICAgfQorCisgICAgdm9pZCB0ZXN0VGFiYmVkUGFuZSgpIHsKKyAgICAgICAgaWYgKGhlYWRsZXNzKSByZXR1cm4KKworICAgICAgICBkZWYgc3dpbmcgPSBuZXcgU3dpbmdCdWlsZGVyKCkKKyAgICAgICAgc3dpbmcudGFiYmVkUGFuZShpZDondHAnKSB7CisgICAgICAgICAgICBwYW5lbChpZDoncDEnLCBuYW1lOidUaXRsZSAxJykKKyAgICAgICAgICAgIHBhbmVsKGlkOidwMicpCisgICAgICAgICAgICBwYW5lbChpZDoncDMnLCB0aXRsZTonVGl0bGUgMycpCisgICAgICAgICAgICBwYW5lbChpZDoncDQnLCB0aXRsZTonVGl0bGUgNCcsIG5hbWU6J05hbWUgNCcpCisgICAgICAgICAgICBwYW5lbChpZDoncDUnLCB0aXRsZTonVGl0bGUgNScsIHRhYkljb246IGltYWdlSWNvbihDb25zb2xlLklDT05fUEFUSCwgaWQ6J2k1JykpCisgICAgICAgICAgICBwYW5lbChpZDoncDYnLCB0aXRsZTonVGl0bGUgNicsIHRhYkRpc2FibGVkSWNvbjogaW1hZ2VJY29uKENvbnNvbGUuSUNPTl9QQVRILCBpZDonaTYnKSkKKyAgICAgICAgICAgIHBhbmVsKGlkOidwNycsIHRpdGxlOidUaXRsZSA3JywgdGFiVG9vbFRpcDondGlwIDcnKQorICAgICAgICAgICAgcGFuZWwoaWQ6J3A4JywgdGl0bGU6J1RpdGxlIDgnLCB0YWJCYWNrZ3JvdW5kOkNvbG9yLkdSRUVOKQorICAgICAgICAgICAgcGFuZWwoaWQ6J3A5JywgdGl0bGU6J1RpdGxlIDknLCB0YWJGb3JlZ3JvdW5kOkNvbG9yLkdSRUVOKQorICAgICAgICAgICAgcGFuZWwoaWQ6J3BBJywgdGl0bGU6J1RpdGxlIEEnLCB0YWJFbmFibGVkOmZhbHNlKQorICAgICAgICAgICAgcGFuZWwoaWQ6J3BCJywgdGl0bGU6J1RpdGxlIEInLCB0YWJNbmVtb25pYzogJ1QnKTsKKyAgICAgICAgICAgIHBhbmVsKGlkOidwQycsIHRpdGxlOidUaXRsZSBDJywgdGFiRGlzcGxheWVkTW5lbW9uaWNJbmRleDogMik7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnQgc3dpbmcudHAudGFiQ291bnQgPT0gMTIgCisgICAgICAgIGFzc2VydCBzd2luZy50cC5pbmRleE9mQ29tcG9uZW50KHN3aW5nLnAxKSA9PSAwCisgICAgICAgIGFzc2VydCBzd2luZy50cC5pbmRleE9mQ29tcG9uZW50KHN3aW5nLnAyKSA9PSAxCisgICAgICAgIGFzc2VydCBzd2luZy50cC5pbmRleE9mQ29tcG9uZW50KHN3aW5nLnAzKSA9PSAyCisgICAgICAgIGFzc2VydCBzd2luZy50cC5pbmRleE9mQ29tcG9uZW50KHN3aW5nLnA0KSA9PSAzCisgICAgICAgIGFzc2VydCBzd2luZy50cC5pbmRleE9mVGFiKCdUaXRsZSAxJykgPT0gMAorICAgICAgICBhc3NlcnQgc3dpbmcudHAuaW5kZXhPZlRhYignVGl0bGUgMycpID09IDIKKyAgICAgICAgYXNzZXJ0IHN3aW5nLnRwLmluZGV4T2ZUYWIoJ1RpdGxlIDQnKSA9PSAzCisgICAgICAgIGFzc2VydCBzd2luZy50cC5nZXRJY29uQXQoNCkgPT0gc3dpbmcuaTUKKyAgICAgICAgYXNzZXJ0IHN3aW5nLnRwLmdldERpc2FibGVkSWNvbkF0KDUpID09IHN3aW5nLmk2CisgICAgICAgIGFzc2VydCBzd2luZy50cC5nZXRUb29sVGlwVGV4dEF0KDYpID09ICd0aXAgNycKKyAgICAgICAgYXNzZXJ0IHN3aW5nLnRwLmdldEJhY2tncm91bmRBdCg3KSA9PSBDb2xvci5HUkVFTgorICAgICAgICBhc3NlcnQgc3dpbmcudHAuZ2V0Rm9yZWdyb3VuZEF0KDgpID09IENvbG9yLkdSRUVOCisgICAgICAgIGFzc2VydCBzd2luZy50cC5pc0VuYWJsZWRBdCg5KSA9PSBmYWxzZQorICAgICAgICBhc3NlcnQgc3dpbmcudHAuZ2V0TW5lbW9uaWNBdCgxMCkgPT0gMHg1NAorICAgICAgICBhc3NlcnQgc3dpbmcudHAuZ2V0RGlzcGxheWVkTW5lbW9uaWNJbmRleEF0KDExKSA9PSAyCisKKyAgICAgICAgc3dpbmcudGFiYmVkUGFuZShpZDondHAnLCBzZWxlY3RlZENvbXBvbmVudDpzd2luZy5wMikgeworICAgICAgICAgICAgcGFuZWwocDEsIG5hbWU6J1RpdGxlIDEnKQorICAgICAgICAgICAgcGFuZWwocDIpCisgICAgICAgICAgICBwYW5lbChwMykKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQgc3dpbmcudHAuc2VsZWN0ZWRJbmRleCA9PSAxCisgICAgICAgIGFzc2VydCBzd2luZy50cC5zZWxlY3RlZENvbXBvbmVudCA9PSBzd2luZy5wMgorCisgICAgICAgIHN3aW5nLnRhYmJlZFBhbmUoaWQ6J3RwJywgc2VsZWN0ZWRJbmRleDoxKSB7CisgICAgICAgICAgICBwYW5lbChwMSwgbmFtZTonVGl0bGUgMScpCisgICAgICAgICAgICBwYW5lbChwMikKKyAgICAgICAgICAgIHBhbmVsKHAzKQorICAgICAgICB9CisgICAgICAgIGFzc2VydCBzd2luZy50cC5zZWxlY3RlZEluZGV4ID09IDEKKyAgICAgICAgYXNzZXJ0IHN3aW5nLnRwLnNlbGVjdGVkQ29tcG9uZW50ID09IHN3aW5nLnAyCisKKyAgICB9CisKKyAgICB2b2lkIHRlc3RDb21ib0JveCgpIHsKKyAgICAgICAgaWYgKGhlYWRsZXNzKSByZXR1cm4KKworICAgICAgICBkZWYgc3dpbmcgPSBuZXcgU3dpbmdCdWlsZGVyKCkKKyAgICAgICAgT2JqZWN0W10gb2JqZWN0cyA9IFsnYScsJ2InXQorICAgICAgICBkZWYgbGlzdCA9IFsnYycsICdkJywgJ2UnXQorICAgICAgICBkZWYgdmVjdG9yID0gbmV3IFZlY3RvcihbJ2YnLCAnZycsICdoJywgJ2knXSkKKyAgICAgICAgYXNzZXJ0IHN3aW5nLmNvbWJvQm94KGl0ZW1zOm9iamVjdHMpLml0ZW1Db3VudCA9PSAyCisgICAgICAgIGFzc2VydCBzd2luZy5jb21ib0JveChpdGVtczpsaXN0KS5pdGVtQ291bnQgPT0gMworICAgICAgICBhc3NlcnQgc3dpbmcuY29tYm9Cb3goaXRlbXM6dmVjdG9yKS5pdGVtQ291bnQgPT0gNAorICAgIH0KKworICAgIHZvaWQgdGVzdE1pc3BsYWNlZEFjdGlvbnNBcmVJZ25vcmVkKCkgeworICAgICAgICBpZiAoaGVhZGxlc3MpIHJldHVybgorCisgICAgICAgIGRlZiBzd2luZyA9IG5ldyBTd2luZ0J1aWxkZXIoKQorICAgICAgICAvLyBsYWJlbHMgZG9uJ3Qgc3VwcG9ydCBhY3Rpb25zOyBzaG91bGQgYmUgaWdub3JlZAorICAgICAgICBzd2luZy5sYWJlbHsKKyAgICAgICAgICAgIGFjdGlvbihpZDonYWN0aW9uSWQnLCBOYW1lOidhYm91dCcsIG1uZW1vbmljOidBJywgY2xvc3VyZTp7eC0+eH0pCisgICAgICAgICAgICBtYXAoKQorICAgICAgICB9CisgICAgICAgIHN3aW5nLnBhbmVseworICAgICAgICAgICAgYm9yZGVyTGF5b3V0eworICAgICAgICAgICAgICAgIC8vIGxheW91dHMgZG9uJ3Qgc3VwcG9ydCBhY3Rpb25zLCB3aWxsIGJlIGlnbm9yZWQKKyAgICAgICAgICAgICAgICBhY3Rpb24oaWQ6J2FjdGlvbklkJykKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgdGVzdEJveExheW91dCgpIHsKKyAgICAgICAgaWYgKGhlYWRsZXNzKSByZXR1cm4KKworICAgICAgICBkZWYgc3dpbmcgPSBuZXcgU3dpbmdCdWlsZGVyKCkKKyAgICAgICAgZGVmIG1lc3NhZ2UgPSBzaG91bGRGYWlseworICAgICAgICAgICAgc3dpbmcuYm94TGF5b3V0KCkKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQgbWVzc2FnZS5jb250YWlucygnTXVzdCBiZSBuZXN0ZWQgaW5zaWRlIGEgQ29udGFpbmVyJykKKyAgICAgICAgLy8gZGVmYXVsdCBpcyBYX0FYSVMKKyAgICAgICAgc3dpbmcucGFuZWwoaWQ6J3BhbmVsJyl7CisgICAgICAgICAgICBib3hMYXlvdXQoaWQ6J2xheW91dDEnKQorICAgICAgICB9CisgICAgICAgIC8vIGNhbiBhbHNvIHNldCBleHBsaWNpdCBheGlzCisgICAgICAgIHN3aW5nLmZyYW1lKGlkOidmcmFtZScpeworICAgICAgICAgICAgYm94TGF5b3V0KGlkOidsYXlvdXQyJywgYXhpczpCb3hMYXlvdXQuWV9BWElTKQorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCB0ZXN0S2V5c3Ryb2tlc1dpdGhpbkFjdGlvbnMoKSB7CisgICAgICAgIGlmIChoZWFkbGVzcykgcmV0dXJuCisKKyAgICAgICAgZGVmIHN3aW5nID0gbmV3IFN3aW5nQnVpbGRlcigpCisgICAgICAgIHN3aW5nLnBhbmVseworICAgICAgICAgICAgYnV0dG9uKGlkOididXR0b25JZCcpeworICAgICAgICAgICAgICAgIGFjdGlvbihpZDonYWN0aW9uMScsIGtleVN0cm9rZTonY3RybCBXJykKKyAgICAgICAgICAgICAgICBhY3Rpb24oaWQ6J2FjdGlvbjInLAorICAgICAgICAgICAgICAgICAgICBrZXlTdHJva2U6S2V5U3Ryb2tlLmdldEtleVN0cm9rZShLZXlFdmVudC5WS19TUEFDRSwgSW5wdXRFdmVudC5BTFRfTUFTSykpCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZGVmIGNvbXBvbmVudCA9IHN3aW5nLmJ1dHRvbklkCisgICAgICAgIGRlZiBleHBlY3RlZDEgPSBzd2luZy5hY3Rpb24xLnRvU3RyaW5nKCkKKyAgICAgICAgZGVmIGV4cGVjdGVkMiA9IHN3aW5nLmFjdGlvbjIudG9TdHJpbmcoKQorICAgICAgICBkZWYga2V5cyA9IGNvbXBvbmVudC5hY3Rpb25NYXAuYWxsS2V5cygpLnRvTGlzdCgpCisgICAgICAgIGFzc2VydCBrZXlzLmNvbnRhaW5zKGV4cGVjdGVkMSkKKyAgICAgICAgYXNzZXJ0IGtleXMuY29udGFpbnMoZXhwZWN0ZWQyKQorICAgICAgICBkZWYgaW5wdXRNYXAgPSBjb21wb25lbnQuaW5wdXRNYXAKKyAgICAgICAgZGVmIHZhbHVlcyA9IGlucHV0TWFwLmFsbEtleXMoKS50b0xpc3QoKS5jb2xsZWN0eyBpbnB1dE1hcC5nZXQoaXQpIH0KKyAgICAgICAgYXNzZXJ0IHZhbHVlcy5jb250YWlucyhleHBlY3RlZDEpCisgICAgICAgIGFzc2VydCB2YWx1ZXMuY29udGFpbnMoZXhwZWN0ZWQyKQorICAgIH0KKworICAgIHZvaWQgdGVzdFNldEFjY2VsZXJhdG9yKCkgeworICAgICAgICBpZiAoaGVhZGxlc3MpIHJldHVybgorCisgICAgICAgIGRlZiBzd2luZyA9IG5ldyBTd2luZ0J1aWxkZXIoKQorICAgICAgICBkZWYgaGVscCA9IHN3aW5nLmFjdGlvbihhY2NlbGVyYXRvcjonRjEnKQorICAgICAgICBkZWYgYWJvdXQgPSBzd2luZy5hY3Rpb24oYWNjZWxlcmF0b3I6S2V5U3Ryb2tlLmdldEtleVN0cm9rZShLZXlFdmVudC5WS19TUEFDRSwgSW5wdXRFdmVudC5DVFJMX01BU0spKQorICAgICAgICBhc3NlcnQgaGVscC5nZXRWYWx1ZShBY3Rpb24uQUNDRUxFUkFUT1JfS0VZKS50b1N0cmluZygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbmRleE9mKEtleUV2ZW50LmdldEtleVRleHQoS2V5RXZlbnQuVktfRjEpKSA+IC0xCisgICAgICAgIGRlZiBhYm91dEtleVN0cm9rZSA9IGFib3V0LmdldFZhbHVlKEFjdGlvbi5BQ0NFTEVSQVRPUl9LRVkpCisgICAgICAgIGFzc2VydCBhYm91dEtleVN0cm9rZS5rZXlDb2RlID09IEtleUV2ZW50LlZLX1NQQUNFCisgICAgICAgIGFzc2VydChhYm91dEtleVN0cm9rZS5tb2RpZmllcnMgJiBJbnB1dEV2ZW50LkNUUkxfTUFTSykgIT0gMAorICAgIH0KKworICAgIEFjdGlvbiB2ZXJpZnlBY2NlbChBY3Rpb24gYWN0aW9uLCBpbnQgbXVzdEhhdmUgPSAwKSB7CisgICAgICAgIGludCBtb2RzID0gYWN0aW9uLmdldFZhbHVlKEFjdGlvbi5BQ0NFTEVSQVRPUl9LRVkpLm1vZGlmaWVycworICAgICAgICBhc3NlcnQgbW9kcyAhPSAwCisgICAgICAgIGFzc2VydCAobW9kcyAmIG11c3RIYXZlKSA9PSBtdXN0SGF2ZQorICAgICAgICAvLyBkb24ndCBhc3NlcnQgKG1vZGQgJSBtdXN0aGF2ZSkgIT0gMCBiZWNhdXNlIG11c3RIYXZlIG1heSBiZSB0aGUgcGxhdGZvcm0gc2hvcnRjdXQgbW9kaWZlcgorICAgICAgICByZXR1cm4gYWN0aW9uCisgICAgfQorCisgICAgdm9pZCB0ZXN0U2V0QWNjZWxlcmF0b3JTaG9ydGN1dHMoKSB7CisgICAgICAgIGlmIChoZWFkbGVzcykgcmV0dXJuCisKKyAgICAgICAgZGVmIHN3aW5nID0gbmV3IFN3aW5nQnVpbGRlcigpCisgICAgICAgIGNoYXIgcSA9ICdRJworICAgICAgICBzd2luZy5hY3Rpb25zIHsKKyAgICAgICAgICAgIHZlcmlmeUFjY2VsKGFjdGlvbihhY2NlbGVyYXRvcjogc2hvcnRjdXQocSkpKQorICAgICAgICAgICAgdmVyaWZ5QWNjZWwoYWN0aW9uKGFjY2VsZXJhdG9yOiBzaG9ydGN1dChxLCBJbnB1dEV2ZW50LlNISUZUX0RPV05fTUFTSykpLCBJbnB1dEV2ZW50LlNISUZUX0RPV05fTUFTSykKKyAgICAgICAgICAgIHZlcmlmeUFjY2VsKGFjdGlvbihhY2NlbGVyYXRvcjogc2hvcnRjdXQoS2V5RXZlbnQuVktfTlVNUEFENSkpKQorICAgICAgICAgICAgdmVyaWZ5QWNjZWwoYWN0aW9uKGFjY2VsZXJhdG9yOiBzaG9ydGN1dChLZXlFdmVudC5WS19OVU1QQUQ1LCBJbnB1dEV2ZW50LlNISUZUX0RPV05fTUFTSykpLCBJbnB1dEV2ZW50LlNISUZUX0RPV05fTUFTSykKKyAgICAgICAgICAgIHZlcmlmeUFjY2VsKGFjdGlvbihhY2NlbGVyYXRvcjogc2hvcnRjdXQoJ0RFTEVURScpKSkKKyAgICAgICAgICAgIHZlcmlmeUFjY2VsKGFjdGlvbihhY2NlbGVyYXRvcjogc2hvcnRjdXQoJ0RFTEVURScsIElucHV0RXZlbnQuU0hJRlRfRE9XTl9NQVNLKSksIElucHV0RXZlbnQuU0hJRlRfRE9XTl9NQVNLKQorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCB0ZXN0Qm9yZGVyTGF5b3V0Q29uc3RyYWludHMoKSB7CisgICAgICAgIGlmIChoZWFkbGVzcykgcmV0dXJuCisKKyAgICAgICAgZGVmIHN3aW5nID0gbmV3IFN3aW5nQnVpbGRlcigpCisgICAgICAgIHN3aW5nLmludGVybmFsRnJhbWUoaWQ6J2ZyYW1lSWQnLAorICAgICAgICAgICAgICAgIGJvcmRlcjpCb3JkZXJGYWN0b3J5LmNyZWF0ZVRpdGxlZEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZUxvd2VyZWRCZXZlbEJvcmRlcigpKSkgeworICAgICAgICAgICAgc3dpbmcuZnJhbWVJZC5jb250ZW50UGFuZS5sYXlvdXQgPSBuZXcgQm9yZGVyTGF5b3V0KCkKKyAgICAgICAgICAgIHZib3goaWQ6J3Zib3hJZCcsIGNvbnN0cmFpbnRzOkJvcmRlckxheW91dC5OT1JUSCkKKyAgICAgICAgICAgIGhib3goaWQ6J2hib3hJZCcsIGNvbnN0cmFpbnRzOkJvcmRlckxheW91dC5XRVNUKQorICAgICAgICAgICAgcmlnaWRBcmVhKGlkOidhcmVhMScsIGNvbnN0cmFpbnRzOkJvcmRlckxheW91dC5FQVNULCBzaXplOlszLDRdIGFzIERpbWVuc2lvbikKKyAgICAgICAgICAgIHJpZ2lkQXJlYShpZDonYXJlYTInLCBjb25zdHJhaW50czpCb3JkZXJMYXlvdXQuU09VVEgsIHdpZHRoOjMwLCBoZWlnaHQ6NDApCisgICAgICAgICAgICBzY3JvbGxQYW5lKGlkOidzY3JvbGxJZCcsIGNvbnN0cmFpbnRzOkJvcmRlckxheW91dC5DRU5URVIsCisgICAgICAgICAgICAgICAgYm9yZGVyOkJvcmRlckZhY3RvcnkuY3JlYXRlUmFpc2VkQmV2ZWxCb3JkZXIoKSkgeworICAgICAgICAgICAgICAgIGdsdWUoKQorICAgICAgICAgICAgICAgIHZnbHVlKCkKKyAgICAgICAgICAgICAgICBoZ2x1ZSgpCisgICAgICAgICAgICAgICAgdnN0cnV0KCkKKyAgICAgICAgICAgICAgICB2c3RydXQoaGVpZ2h0OjgpCisgICAgICAgICAgICAgICAgaHN0cnV0KCkKKyAgICAgICAgICAgICAgICBoc3RydXQod2lkdGg6OCkKKyAgICAgICAgICAgICAgICByaWdpZEFyZWEoaWQ6J2FyZWEzJykKKyAgICAgICAgICAgICAgICB2aWV3cG9ydCgpCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0IHN3aW5nLnZib3hJZC5wYXJlbnQgPT0gc3dpbmcuZnJhbWVJZC5jb250ZW50UGFuZQorICAgICAgICBhc3NlcnQgc3dpbmcuaGJveElkLnBhcmVudCA9PSBzd2luZy5mcmFtZUlkLmNvbnRlbnRQYW5lCisgICAgICAgIGFzc2VydCBzd2luZy5zY3JvbGxJZC5wYXJlbnQgPT0gc3dpbmcuZnJhbWVJZC5jb250ZW50UGFuZQorICAgIH0KKworICAgIHZvaWQgdGVzdFByb3BlcnR5Q29sdW1uKCkgeworICAgICAgICBpZiAoaGVhZGxlc3MpIHJldHVybgorCisgICAgICAgIGRlZiBzd2luZyA9IG5ldyBTd2luZ0J1aWxkZXIoKQorICAgICAgICBkZWYgbXNnID0gc2hvdWxkRmFpbHsKKyAgICAgICAgICAgIHN3aW5nLnByb3BlcnR5Q29sdW1uKCkKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQgbXNnLmNvbnRhaW5zKCdwcm9wZXJ0eUNvbHVtbiBtdXN0IGJlIGEgY2hpbGQgb2YgYSB0YWJsZU1vZGVsJykKKyAgICAgICAgbXNnID0gc2hvdWxkRmFpbHsKKyAgICAgICAgICAgIHN3aW5nLnRhYmxleworICAgICAgICAgICAgICAgIHRhYmxlTW9kZWwoKXsKKyAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlDb2x1bW4oKQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhc3NlcnQgbXNnLmNvbnRhaW5zKCJNdXN0IHNwZWNpZnkgYSBwcm9wZXJ0eSBmb3IgYSBwcm9wZXJ0eUNvbHVtbiIpOiBcCisgICAgICAgICAgICAiSW5zdGVhZCBmb3VuZCBtZXNzYWdlOiAiICsgbXNnCisgICAgICAgIHN3aW5nLnRhYmxleworICAgICAgICAgICAgdGFibGVNb2RlbChpZDogJ21vZGVsJyl7CisgICAgICAgICAgICAgICAgcHJvcGVydHlDb2x1bW4ocHJvcGVydHlOYW1lOidwJykKKyAgICAgICAgICAgICAgICBwcm9wZXJ0eUNvbHVtbihwcm9wZXJ0eU5hbWU6J3BoJywgaGVhZGVyOiAnaGVhZGVyJykKKyAgICAgICAgICAgICAgICBwcm9wZXJ0eUNvbHVtbihwcm9wZXJ0eU5hbWU6J3B0JywgdHlwZTogU3RyaW5nKQorICAgICAgICAgICAgICAgIHByb3BlcnR5Q29sdW1uKHByb3BlcnR5TmFtZToncHRoJywgdHlwZTogU3RyaW5nLCBoZWFkZXI6ICdoZWFkZXInKQorICAgICAgICAgICAgICAgIHByb3BlcnR5Q29sdW1uKHByb3BlcnR5TmFtZToncGUnLCBlZGl0YWJsZTpmYWxzZSkKKyAgICAgICAgICAgICAgICBwcm9wZXJ0eUNvbHVtbihwcm9wZXJ0eU5hbWU6J3BlaCcsIGVkaXRhYmxlOmZhbHNlLCBoZWFkZXI6ICdoZWFkZXInKQorICAgICAgICAgICAgICAgIHByb3BlcnR5Q29sdW1uKHByb3BlcnR5TmFtZToncGV0JywgZWRpdGFibGU6ZmFsc2UsIHR5cGU6IFN0cmluZywgKQorICAgICAgICAgICAgICAgIHByb3BlcnR5Q29sdW1uKHByb3BlcnR5TmFtZToncGV0aCcsIGVkaXRhYmxlOmZhbHNlLCB0eXBlOiBTdHJpbmcsIGhlYWRlcjogJ2hlYWRlcicpCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3dpbmcubW9kZWwuY29sdW1uTGlzdC5lYWNoIHsgY29sIC0+CisgICAgICAgICAgICBkZWYgcHJvcE5hbWUgPSBjb2wudmFsdWVNb2RlbC5wcm9wZXJ0eQorICAgICAgICAgICAgYXNzZXJ0IChjb2wuaGVhZGVyVmFsdWUgPT0gJ2hlYWRlcicpIF4gIXByb3BOYW1lLmNvbnRhaW5zKCdoJykKKyAgICAgICAgICAgIGFzc2VydCAoY29sLnR5cGUgPT0gU3RyaW5nKSBeICFwcm9wTmFtZS5jb250YWlucygndCcpCisgICAgICAgICAgICBhc3NlcnQgY29sLnZhbHVlTW9kZWwuZWRpdGFibGUgXiBwcm9wTmFtZS5jb250YWlucygnZScpCisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHRlc3RDbG9zdXJlQ29sdW1uKCkgeworICAgICAgICBpZiAoaGVhZGxlc3MpIHJldHVybgorCisgICAgICAgIGRlZiBzd2luZyA9IG5ldyBTd2luZ0J1aWxkZXIoKQorICAgICAgICBkZWYgbXNnID0gc2hvdWxkRmFpbHsKKyAgICAgICAgICAgIHN3aW5nLmNsb3N1cmVDb2x1bW4oKQorICAgICAgICB9CisgICAgICAgIGFzc2VydCBtc2cuY29udGFpbnMoJ2Nsb3N1cmVDb2x1bW4gbXVzdCBiZSBhIGNoaWxkIG9mIGEgdGFibGVNb2RlbCcpCisgICAgICAgIG1zZyA9IHNob3VsZEZhaWx7CisgICAgICAgICAgICBzd2luZy50YWJsZXsKKyAgICAgICAgICAgICAgICB0YWJsZU1vZGVsKCl7CisgICAgICAgICAgICAgICAgICAgIGNsb3N1cmVDb2x1bW4oKQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhc3NlcnQgbXNnLmNvbnRhaW5zKCJNdXN0IHNwZWNpZnkgJ3JlYWQnIENsb3N1cmUgcHJvcGVydHkgZm9yIGEgY2xvc3VyZUNvbHVtbiIpOiBcCisgICAgICAgICAgICAiSW5zdGVhZCBmb3VuZCBtZXNzYWdlOiAiICsgbXNnCisgICAgICAgIGRlZiBjbG9zdXJlID0geyB4IC0+IHggfQorICAgICAgICBkZWYgdGFibGUgPSBzd2luZy50YWJsZSB7CisgICAgICAgICAgICB0YWJsZU1vZGVsKCl7CisgICAgICAgICAgICAgICAgY2xvc3VyZUNvbHVtbihyZWFkOmNsb3N1cmUsIHdyaXRlOmNsb3N1cmUsIGhlYWRlcjonaGVhZGVyJykKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRhYmxlTW9kZWwobW9kZWw6bmV3IGdyb292eS5tb2RlbC5WYWx1ZUhvbGRlcignZm9vJykpeworICAgICAgICAgICAgICAgIGNsb3N1cmVDb2x1bW4ocmVhZDpjbG9zdXJlLCB0eXBlOlN0cmluZy5jbGFzcykKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRhYmxlTW9kZWwobGlzdDpbJ2EnLCdiJ10peworICAgICAgICAgICAgICAgIGNsb3N1cmVDb2x1bW4ocmVhZDpjbG9zdXJlLCB0eXBlOlN0cmluZy5jbGFzcykKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydCB0YWJsZS5jb2x1bW5Nb2RlbC5jbGFzcy5uYW1lID09ICdncm9vdnkubW9kZWwuRGVmYXVsdFRhYmxlTW9kZWwkTXlUYWJsZUNvbHVtbk1vZGVsJworICAgIH0KKworICAgIHZvaWQgdGVzdFRhYmxlTW9kZWxDaGFuZ2UoKSB7CisgICAgICAgIGlmIChoZWFkbGVzcykgcmV0dXJuCisKKyAgICAgICAgZGVmIHN3aW5nID0gbmV3IFN3aW5nQnVpbGRlcigpCisgICAgICAgIGRlZiB0YWJsZSA9IHN3aW5nLnRhYmxlIHsKKyAgICAgICAgICAgIHRhYmxlTW9kZWwgeworICAgICAgICAgICAgICAgIHByb3BlcnR5Q29sdW1uKHByb3BlcnR5TmFtZToncCcpCisgICAgICAgICAgICAgICAgcHJvcGVydHlDb2x1bW4ocHJvcGVydHlOYW1lOidwaCcsIGhlYWRlcjogJ2hlYWRlcicpCisgICAgICAgICAgICAgICAgcHJvcGVydHlDb2x1bW4ocHJvcGVydHlOYW1lOidwdCcsIHR5cGU6IFN0cmluZykKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGRlZiBzb3J0ZXIgPSBuZXcgZ3Jvb3Z5Lmluc3BlY3Quc3dpbmd1aS5UYWJsZVNvcnRlcih0YWJsZS5tb2RlbCkKKyAgICAgICAgdGFibGUubW9kZWwgPSBzb3J0ZXIKKworICAgICAgICAvL0dST09WWS0yMTExIC0gcmVzZXR0aW5nIHRoZSBtb2RlbCB3LyBhIHBhc3MtdGhyb3VnaCBjbGVhcmVkIHRoZSBjb2x1bW5zCisgICAgICAgIGFzc2VydCB0YWJsZS5jb2x1bW5Nb2RlbC5jb2x1bW5Db3VudCA9PSAzCisgICAgfQorCisgICAgdm9pZCB0ZXN0VGFibGVNb2RlbFZhbHVlcygpIHsKKyAgICAgICAgaWYgKGhlYWRsZXNzKSByZXR1cm4KKworICAgICAgICBkZWYgc3F1YXJlcyAgPSBbCisgICAgICAgICAgICBbIHZhbDogMSwgc3F1YXJlOiAgMSBdLAorICAgICAgICAgICAgWyB2YWw6IDIsIHNxdWFyZTogIDQgXSwKKyAgICAgICAgICAgIFsgdmFsOiAzLCBzcXVhcmU6ICA5IF0sCisgICAgICAgICAgICBbIHZhbDogNCwgc3F1YXJlOiAxNiBdCisgICAgICAgIF0KKworICAgICAgICBkZWYgc3dpbmcgPSBuZXcgU3dpbmdCdWlsZGVyKCkKKyAgICAgICAgZGVmIGZyYW1lID0gc3dpbmcuZnJhbWUodGl0bGU6ICdUYWJlbGxlJywKKyAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvd0Nsb3Npbmc6IHsgU3lzdGVtLmV4aXQoMCkgfSApIHsKKyAgICAgICAgICAgIHNjcm9sbFBhbmUgeworICAgICAgICAgICAgICAgIHRhYmxlKGlkOid0YWJsZScpIHsKKyAgICAgICAgICAgICAgICAgICAgdGFibGVNb2RlbChsaXN0OiBzcXVhcmVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eUNvbHVtbihoZWFkZXI6ICJXZXJ0IiwgcHJvcGVydHlOYW1lOiAidmFsIikKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsb3N1cmVDb2x1bW4oaGVhZGVyOiAiUXVhZHJhdCIsIHJlYWQ6IHsgaXQuc3F1YXJlIH0pCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzcXVhcmVzLmVhY2hXaXRoSW5kZXgge2l0LCBpIC0+CisgICAgICAgICAgICBhc3NlcnQgc3dpbmcudGFibGUuZ2V0VmFsdWVBdChpLCAwKSA9PSBpdC52YWwKKyAgICAgICAgICAgIGFzc2VydCBzd2luZy50YWJsZS5nZXRWYWx1ZUF0KGksIDEpID09IGl0LnNxdWFyZQorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCB0ZXN0U2V0Q29uc3RyYWludHMoKSB7CisgICAgICAgIGlmIChoZWFkbGVzcykgcmV0dXJuCisKKyAgICAgICAgZGVmIHN3aW5nID0gbmV3IFN3aW5nQnVpbGRlcigpCisgICAgICAgIHN3aW5nLnBhbmVsKGxheW91dDpuZXcgQm9yZGVyTGF5b3V0KCkpIHsKKyAgICAgICAgICAgIGxhYmVsKHRleHQ6J05hbWUnLCBjb25zdHJhaW50czpCb3JkZXJMYXlvdXQuQ0VOVEVSKQorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCB0ZXN0U2V0VG9vbFRpcFRleHQoKSB7CisgICAgICAgIGlmIChoZWFkbGVzcykgcmV0dXJuCisKKyAgICAgICAgZGVmIHN3aW5nID0gbmV3IFN3aW5nQnVpbGRlcigpCisgICAgICAgIHN3aW5nLnBhbmVsKGxheW91dDpuZXcgQm9yZGVyTGF5b3V0KCkpIHsKKyAgICAgICAgICAgIGxhYmVsKGlkOidsYWJlbElkJywgdGV4dDonTmFtZScsIHRvb2xUaXBUZXh0OidUaGlzIGlzIHRoZSBuYW1lIGZpZWxkJykKKyAgICAgICAgfQorCisgICAgfQorCisgICAgdm9pZCB0ZXN0VGFibGVMYXlvdXQoKSB7CisgICAgICAgIGlmIChoZWFkbGVzcykgcmV0dXJuCisKKyAgICAgICAgZGVmIHN3aW5nID0gbmV3IFN3aW5nQnVpbGRlcigpCisgICAgICAgIGRlZiBtc2cgPSBzaG91bGRGYWlsV2l0aENhdXNlKFJ1bnRpbWVFeGNlcHRpb24peworICAgICAgICAgICAgZGVmIGZyYW1lID0gc3dpbmcuZnJhbWUoKXsKKyAgICAgICAgICAgICAgICB0cigpCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0IG1zZyA9PSAiJ3RyJyBtdXN0IGJlIHdpdGhpbiBhICd0YWJsZUxheW91dCciCisgICAgICAgIG1zZyA9IHNob3VsZEZhaWxXaXRoQ2F1c2UoUnVudGltZUV4Y2VwdGlvbil7CisgICAgICAgICAgICBkZWYgZnJhbWUgPSBzd2luZy5mcmFtZSgpeworICAgICAgICAgICAgICAgIHRhYmxlTGF5b3V0KCl7CisgICAgICAgICAgICAgICAgICAgIHRkKCkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0IG1zZyA9PSAiJ3RkJyBtdXN0IGJlIHdpdGhpbiBhICd0ciciCisgICAgICAgIHN3aW5nLmZyYW1lKGlkOidmcmFtZScpeworICAgICAgICAgICAgdGFibGVMYXlvdXQoKXsKKyAgICAgICAgICAgICAgICB0ciB7CisgICAgICAgICAgICAgICAgICAgIHRkIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsKGlkOidsYWJlbCcpCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnQgc3dpbmcubGFiZWwucGFyZW50CisgICAgICAgIGFzc2VydCBzd2luZy5sYWJlbC5wYXJlbnQucGFyZW50CisgICAgICAgIGFzc2VydCBzd2luZy5sYWJlbC5wYXJlbnQucGFyZW50LnBhcmVudAorICAgICAgICBhc3NlcnQgc3dpbmcubGFiZWwucGFyZW50LnBhcmVudC5wYXJlbnQucGFyZW50CisgICAgICAgIGFzc2VydCBzd2luZy5mcmFtZSA9PSBzd2luZy5sYWJlbC5wYXJlbnQucGFyZW50LnBhcmVudC5wYXJlbnQucGFyZW50CisgICAgfQorCisgICAgdm9pZCB0ZXN0QXR0cmlidXRlT3JkZXJpbmcoKSB7CisgICAgICAgIGlmIChoZWFkbGVzcykgcmV0dXJuCisKKyAgICAgICAgZGVmIHN3aW5nID0gbmV3IFN3aW5nQnVpbGRlcigpCisKKyAgICAgICAgZGVmIGZyYW1lID0gc3dpbmcuZnJhbWUoCisgICAgICAgICAgICBzaXplOls1MDAsNTAwXSwKKyAgICAgICAgICAgIGxvY2F0aW9uUmVsYXRpdmVUbzpudWxsCisgICAgICAgICkKKyAgICAgICAgZGVmIGxvY2F0aW9uRmlyc3QgPSBmcmFtZS5sb2NhdGlvbgorCisgICAgICAgIGZyYW1lID0gc3dpbmcuZnJhbWUoCisgICAgICAgICAgICBsb2NhdGlvblJlbGF0aXZlVG86bnVsbCwKKyAgICAgICAgICAgIHNpemU6WzUwMCw1MDBdCisgICAgICAgICkKKyAgICAgICAgZGVmIGxvY2F0aW9uTGFzdCA9IGZyYW1lLmxvY2F0aW9uCisKKyAgICAgICAgLy8gc2V0TG9jYXRpb25SZWF0aXZlVG8obnVsbCkgcGxhY2VzIHRoZSBjb21wb25lbnQgaW4gdGhlIGNlbnRlciBvZgorICAgICAgICAvLyB0aGUgc2NyZWVuLCByZWxhdGl2ZSB0byBpdCdzIHNpemUsIHNvIGNlbnRlcmluZyBpdCBhZnRlciBzaXppbmcgaXQKKyAgICAgICAgLy8gc2hvdWxkIHJlc3VsdCBpbiBhIDI1MCwyNTAgb2Zmc2V0IGZyb20gY2VudGVyaW5nIGl0IGJlZm9yZSBzaXppbmcgaXQKKyAgICAgICAgYXNzZXJ0IGxvY2F0aW9uRmlyc3QgIT0gbG9jYXRpb25MYXN0CisgICAgfQorCisgICAgdm9pZCB0ZXN0V2lkZ2V0UGFzc3Rocm91Z2hDb25zdHJhaW50cygpIHsKKyAgICAgICAgaWYgKGhlYWRsZXNzKSByZXR1cm4KKworICAgICAgICBkZWYgc3dpbmcgPSBuZXcgU3dpbmdCdWlsZGVyKCkKKyAgICAgICAgZGVmIGZvbyA9IHN3aW5nLmJ1dHRvbignTm9ydGgnKQorICAgICAgICBkZWYgZnJhbWUgPSBzd2luZy5mcmFtZSB7CisgICAgICAgICAgICBib3JkZXJMYXlvdXQoKQorICAgICAgICAgICAgd2lkZ2V0KGZvbywgY29uc3RyYWludHM6IEJvcmRlckxheW91dC5OT1JUSCkKKyAgICAgICAgICAgIC8vIGEgZmFpbGVkIHRlc3QgdGhyb3dzIE1pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbiBieSBub3cKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgdGVzdEdST09WWTE4MzdSZXVzZUFjdGlvbigpIHsKKyAgICAgICAgaWYgKGhlYWRsZXNzKSByZXR1cm4KKworICAgICAgICBkZWYgc3dpbmcgPSBuZXcgU3dpbmdCdWlsZGVyKCkKKworICAgICAgICBkZWYgdGVzdEFjdGlvbiA9IHN3aW5nLmFjdGlvbihuYW1lOid0ZXN0JywgbW5lbW9uaWM6J0EnLCBhY2NlbGVyYXRvcjonY3RybCBSJykKKyAgICAgICAgYXNzZXJ0IHRlc3RBY3Rpb24uZ2V0VmFsdWUoQWN0aW9uLk1ORU1PTklDX0tFWSkgIT0gbnVsbAorICAgICAgICBhc3NlcnQgdGVzdEFjdGlvbi5nZXRWYWx1ZShBY3Rpb24uQUNDRUxFUkFUT1JfS0VZKSAhPSBudWxsCisKKyAgICAgICAgc3dpbmcuYWN0aW9uKHRlc3RBY3Rpb24pCisgICAgICAgIGFzc2VydCB0ZXN0QWN0aW9uLmdldFZhbHVlKEFjdGlvbi5NTkVNT05JQ19LRVkpICE9IG51bGwKKyAgICAgICAgYXNzZXJ0IHRlc3RBY3Rpb24uZ2V0VmFsdWUoQWN0aW9uLkFDQ0VMRVJBVE9SX0tFWSkgIT0gbnVsbAorICAgIH0KKworICAgIHZvaWQgdGVzdFNlcGFyYXRvcnMoKSB7CisgICAgICAgIGlmIChoZWFkbGVzcykgcmV0dXJuCisKKyAgICAgICAgZGVmIHN3aW5nID0gbmV3IFN3aW5nQnVpbGRlcigpCisgICAgICAgIHN3aW5nLmZyYW1lIHsKKyAgICAgICAgICAgIG1lbnUoInRlc3QiKSB7CisgICAgICAgICAgICAgICAgc2VwYXJhdG9yKGlkOiJtZW51U2VwIikKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRvb2xCYXIgeworICAgICAgICAgICAgICAgIHNlcGFyYXRvcihpZDoidGJTZXAiKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2VwYXJhdG9yKGlkOiJzZXAiKQorICAgICAgICB9CisgICAgICAgIGFzc2VydCBzd2luZy5tZW51U2VwIGluc3RhbmNlb2YgSlBvcHVwTWVudV9TZXBhcmF0b3IKKyAgICAgICAgYXNzZXJ0IHN3aW5nLnRiU2VwIGluc3RhbmNlb2YgSlRvb2xCYXJfU2VwYXJhdG9yCisgICAgICAgIGFzc2VydCBzd2luZy5zZXAgaW5zdGFuY2VvZiBKU2VwYXJhdG9yCisgICAgfQorCisgICAgdm9pZCB0ZXN0Q29sbGVjdGlvbk5vZGVzKCkgeworICAgICAgICBpZiAoaGVhZGxlc3MpIHJldHVybgorCisgICAgICAgIGRlZiBzd2luZyA9IG5ldyBTd2luZ0J1aWxkZXIoKQorICAgICAgICBkZWYgY29sbGVjdGlvbiA9IHN3aW5nLmFjdGlvbnMgeworICAgICAgICAgICAgYWN0aW9uKGlkOid0ZXN0JykKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQgY29sbGVjdGlvbi5jb250YWlucyhzd2luZy50ZXN0KQorICAgIH0KKworICAgIHZvaWQgdGVzdEZhY3RvcnlDb3JuZXJDYXNlcygpIHsKKyAgICAgICAgaWYgKGhlYWRsZXNzKSByZXR1cm4KKworICAgICAgICBkZWYgc3dpbmcgPSBuZXcgU3dpbmdCdWlsZGVyKCkKKyAgICAgICAgYXNzZXJ0IHN3aW5nLmJvZ3VzV2lkZ2V0KCkgPT0gbnVsbAorCisgICAgICAgIHN3aW5nLnJlZ2lzdGVyRmFjdG9yeSgibnVsbFdpZGdldCIsCisgICAgICAgICAgICBbbmV3SW5zdGFuY2U6e2J1aWxkZXIsIG5hbWUsIHZhbHVlLCBwcm9wcyAtPiBudWxsfV0gYXMgQWJzdHJhY3RGYWN0b3J5KQorICAgICAgICBhc3NlcnQgc3dpbmcubnVsbFdpZGdldCgpID09IG51bGwKKyAgICB9CisKKyAgICB2b2lkIHRlc3RGYWN0b3J5TG9nZ2luZygpIHsKKyAgICAgICAgZGVmIGxvZ2dlciA9IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlci5nZXRMb2dnZXIoU3dpbmdCdWlsZGVyLmNsYXNzLm5hbWUpCisgICAgICAgIGRlZiBvbGRMZXZlbCA9IGxvZ2dlci5nZXRMZXZlbCgpCisgICAgICAgIGxvZ2dlci5zZXRMZXZlbChqYXZhLnV0aWwubG9nZ2luZy5MZXZlbC5GSU5FKQorICAgICAgICBkZWYgc3dpbmcgPSBuZXcgU3dpbmdCdWlsZGVyKCkKKyAgICAgICAgc3dpbmcubGFiZWwoKQorICAgICAgICBsb2dnZXIuc2V0TGV2ZWwob2xkTGV2ZWwpCisgICAgfQorCisgICAgdm9pZCB0ZXN0RW5oYW5jZWRWYWx1ZUFyZ3VtZW50cygpIHsKKyAgICAgICAgaWYgKGhlYWRsZXNzKSByZXR1cm4KKworICAgICAgICBkZWYgc3dpbmcgPSBuZXcgU3dpbmdCdWlsZGVyKCkKKworICAgICAgICBkZWYgYW5BY3Rpb24gPSBzd2luZy5hY3Rpb24obmFtZToidGVzdCBhY3Rpb24iKQorICAgICAgICBkZWYgaWNvbiA9IG5ldyBqYXZheC5zd2luZy5wbGFmLm1ldGFsLk1ldGFsQ29tYm9Cb3hJY29uKCkKKyAgICAgICAgZGVmIHJpY2hBY3Rpb25JdGVtcyA9IFsKKyAgICAgICAgICAgICdidXR0b24nLAorICAgICAgICAgICAgJ2NoZWNrQm94JywKKyAgICAgICAgICAgICdyYWRpb0J1dHRvbicsCisgICAgICAgICAgICAndG9nZ2xlQnV0dG9uJywKKyAgICAgICAgICAgICdtZW51SXRlbScsCisgICAgICAgICAgICAnY2hlY2tCb3hNZW51SXRlbScsCisgICAgICAgICAgICAncmFkaW9CdXR0b25NZW51SXRlbScKKyAgICAgICAgXQorCisgICAgICAgIHJpY2hBY3Rpb25JdGVtcy5lYWNoIHtuYW1lIC0+CisgICAgICAgICAgICBzd2luZy4iJG5hbWUiKGFuQWN0aW9uLCBpZDoiJHtuYW1lfUFjdGlvbiIudG9TdHJpbmcoKSkKKyAgICAgICAgICAgIHN3aW5nLiIkbmFtZSIoaWNvbiwgaWQ6IiR7bmFtZX1JY29uIi50b1N0cmluZygpKQorICAgICAgICAgICAgc3dpbmcuIiRuYW1lIigic3RyaW5nIiwgaWQ6IiR7bmFtZX1TdHJpbmciLnRvU3RyaW5nKCkpCisgICAgICAgICAgICBzd2luZy4iJG5hbWUiKHN3aW5nLiIke25hbWV9QWN0aW9uIiwgaWQ6IiR7bmFtZX1TZWxmIi50b1N0cmluZygpKQorCisgICAgICAgICAgICBhc3NlcnQgc3dpbmcuIiR7bmFtZX1BY3Rpb24iCisgICAgICAgICAgICBhc3NlcnQgc3dpbmcuIiR7bmFtZX1JY29uIgorICAgICAgICAgICAgYXNzZXJ0IHN3aW5nLiIke25hbWV9U3RyaW5nIi50ZXh0ID09ICdzdHJpbmcnCisgICAgICAgICAgICBhc3NlcnQgc3dpbmcuIiR7bmFtZX1TZWxmIiA9PSBzd2luZy4iJHtuYW1lfUFjdGlvbiIKKyAgICAgICAgICAgIHNob3VsZEZhaWwgeworICAgICAgICAgICAgICAgIHN3aW5nLiIkbmFtZSIoWydiYWQnXSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGVsZW1lbnRzIHRoYXQgdGFrZSBubyB2YWx1ZSBhcmd1bWVudAorICAgICAgICBkZWYgbm9WYWx1ZUl0ZW1zID0gWworICAgICAgICAgICAgImFjdGlvbnMiLAorICAgICAgICAgICAgImJveExheW91dCIsCisgICAgICAgICAgICAiY29tYm9Cb3giLAorICAgICAgICAgICAgImZvcm1hdHRlZFRleHRGaWVsZCIsCisgICAgICAgICAgICAiZ2x1ZSIsCisgICAgICAgICAgICAiaGJveCIsCisgICAgICAgICAgICAiaGdsdWUiLAorICAgICAgICAgICAgImhzdHJ1dCIsCisgICAgICAgICAgICAibWFwIiwKKyAgICAgICAgICAgICJyaWdpZEFyZWEiLAorICAgICAgICAgICAgInNlcGFyYXRvciIsCisgICAgICAgICAgICAidmJveCIsCisgICAgICAgICAgICAidmdsdWUiLAorICAgICAgICAgICAgInZzdHJ1dCIsCisgICAgICAgIF0KKworICAgICAgICBub1ZhbHVlSXRlbXMuZWFjaCB7bmFtZSAtPgorICAgICAgICAgICAgLy9wcmludGxuIG5hbWUKKyAgICAgICAgICAgIHNob3VsZEZhaWwgeworICAgICAgICAgICAgICAgIHN3aW5nLmZyYW1lIHsKKyAgICAgICAgICAgICAgICAgICAgIiRuYW1lIihzd2luZy4iJG5hbWUiKCksIGlkOiIke25hbWV9U2VsZiIudG9TdHJpbmcoKSkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAgLy8gZWxlbWVudHMgdGhhdCBvbmx5IHRha2UgdGhlaXIgb3duIHR5cGUgYXMgYSB2YWx1ZSBhcmd1bWVudAorICAgICAgICBkZWYgc2VsZkl0ZW1zID0gWworICAgICAgICAgICAgImFjdGlvbiIsCisgICAgICAgICAgICAiYm9yZGVyTGF5b3V0IiwKKyAgICAgICAgICAgICJib3VuZGVkUmFuZ2VNb2RlbCIsCisgICAgICAgICAgICAiYm94IiwKKyAgICAgICAgICAgICJidXR0b25Hcm91cCIsCisgICAgICAgICAgICAiY2FyZExheW91dCIsCisgICAgICAgICAgICAvLyJjbG9zdXJlQ29sdW1uIiwKKyAgICAgICAgICAgICJjb2xvckNob29zZXIiLAorICAgICAgICAgICAgLy8iY29udGFpbmVyIiwKKyAgICAgICAgICAgICJkZXNrdG9wUGFuZSIsCisgICAgICAgICAgICAiZGlhbG9nIiwKKyAgICAgICAgICAgICJmaWxlQ2hvb3NlciIsCisgICAgICAgICAgICAiZmxvd0xheW91dCIsCisgICAgICAgICAgICAiZnJhbWUiLAorICAgICAgICAgICAgImdiYyIsCisgICAgICAgICAgICAiZ3JpZEJhZ0NvbnN0cmFpbnRzIiwKKyAgICAgICAgICAgICJncmlkQmFnTGF5b3V0IiwKKyAgICAgICAgICAgICJncmlkTGF5b3V0IiwKKyAgICAgICAgICAgICJpbnRlcm5hbEZyYW1lIiwKKyAgICAgICAgICAgICJsYXllcmVkUGFuZSIsCisgICAgICAgICAgICAibGlzdCIsCisgICAgICAgICAgICAibWVudUJhciIsCisgICAgICAgICAgICAib3B0aW9uUGFuZSIsCisgICAgICAgICAgICAvLyJvdmVybGF5TGF5b3V0IiwKKyAgICAgICAgICAgICJwYW5lbCIsCisgICAgICAgICAgICAicG9wdXBNZW51IiwKKyAgICAgICAgICAgICJwcm9ncmVzc0JhciIsCisgICAgICAgICAgICAvLyJwcm9wZXJ0eUNvbHVtbiIsCisgICAgICAgICAgICAic2Nyb2xsQmFyIiwKKyAgICAgICAgICAgICJzY3JvbGxQYW5lIiwKKyAgICAgICAgICAgICJzbGlkZXIiLAorICAgICAgICAgICAgInNwaW5uZXIiLAorICAgICAgICAgICAgInNwaW5uZXJEYXRlTW9kZWwiLAorICAgICAgICAgICAgInNwaW5uZXJMaXN0TW9kZWwiLAorICAgICAgICAgICAgInNwaW5uZXJOdW1iZXJNb2RlbCIsCisgICAgICAgICAgICAic3BsaXRQYW5lIiwKKyAgICAgICAgICAgICJzcHJpbmdMYXlvdXQiLAorICAgICAgICAgICAgInRhYmJlZFBhbmUiLAorICAgICAgICAgICAgInRhYmxlIiwKKyAgICAgICAgICAgICJ0YWJsZUNvbHVtbiIsCisgICAgICAgICAgICAidGFibGVMYXlvdXQiLAorICAgICAgICAgICAgInRhYmxlTW9kZWwiLAorICAgICAgICAgICAgLy8idGQiLAorICAgICAgICAgICAgInRvb2xCYXIiLAorICAgICAgICAgICAgLy8idHIiLAorICAgICAgICAgICAgInRyZWUiLAorICAgICAgICAgICAgInZpZXdwb3J0IiwKKyAgICAgICAgICAgIC8vIndpZGdldCIsCisgICAgICAgICAgICAid2luZG93IiwKKyAgICAgICAgXQorICAgICAgICBzZWxmSXRlbXMuZWFjaCB7bmFtZSAtPgorICAgICAgICAgICAgLy9wcmludGxuIG5hbWUKKyAgICAgICAgICAgIHN3aW5nLmZyYW1lIHsKKyAgICAgICAgICAgICAgICAiJG5hbWUiKHN3aW5nLiIkbmFtZSIoKSwgaWQ6IiR7bmFtZX1TZWxmIi50b1N0cmluZygpKQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzaG91bGRGYWlsIHsKKyAgICAgICAgICAgICAgICBzd2luZy5mcmFtZSB7CisgICAgICAgICAgICAgICAgICAgIHN3aW5nLiIkbmFtZSIoaWNvbikKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAgLy8gZWxlbWVudHMgdGFrZSB0aGVpciBvd24gdHlwZSBhcyBhIHZhbHVlIGFyZ3VtZW50IG9yIGEgc3RyaW5nYSBzIGEgdGV4dCBwcm9wZXJ0eQorICAgICAgICBkZWYgdGV4dEl0ZW1zID0gWworICAgICAgICAgICAgImVkaXRvclBhbmUiLAorICAgICAgICAgICAgImxhYmVsIiwKKyAgICAgICAgICAgICJtZW51IiwKKyAgICAgICAgICAgICJwYXNzd29yZEZpZWxkIiwKKyAgICAgICAgICAgICJ0ZXh0QXJlYSIsCisgICAgICAgICAgICAidGV4dEZpZWxkIiwKKyAgICAgICAgICAgICJ0ZXh0UGFuZSIsCisgICAgICAgIF0KKyAgICAgICAgdGV4dEl0ZW1zLmVhY2gge25hbWUgLT4KKyAgICAgICAgICAgIHN3aW5nLmZyYW1lIHsKKyAgICAgICAgICAgICAgICAiJG5hbWUiKHN3aW5nLiIkbmFtZSIoKSwgaWQ6IiR7bmFtZX1TZWxmIi50b1N0cmluZygpKQorICAgICAgICAgICAgICAgICIkbmFtZSIoJ3RleHQnLCBpZDoiJHtuYW1lfVRleHQiLnRvU3RyaW5nKCkpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnQgc3dpbmcuIiR7bmFtZX1UZXh0Ii50ZXh0ID09ICd0ZXh0JworCisgICAgICAgICAgICBzaG91bGRGYWlsIHsKKyAgICAgICAgICAgICAgICBzd2luZy5mcmFtZSB7CisgICAgICAgICAgICAgICAgICAgIHN3aW5nLiIkbmFtZSIoaWNvbikKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBsZWZ0b3ZlcnMuLi4KKyAgICAgICAgc3dpbmcuZnJhbWUgeworICAgICAgICAgICAgYWN0aW9uKGFjdGlvbjphbkFjdGlvbikKKyAgICAgICAgICAgIGJveChheGlzOkJveExheW91dC5ZX0FYSVMpCisgICAgICAgICAgICBoc3RydXQoNSkKKyAgICAgICAgICAgIHZzdHJ1dCg1KQorICAgICAgICAgICAgdGFibGVNb2RlbCh0YWJsZU1vZGVsOnRhYmxlTW9kZWwoKSkKKyAgICAgICAgICAgIGNvbnRhaW5lcihpZDonYycsIHBhbmVsKCkpIHsKKyAgICAgICAgICAgICAgICB3aWRnZXQoaWQ6J3cnLCBsYWJlbCgibGFiZWwiKSkKKyAgICAgICAgICAgICAgICBiZWFuKCJhbnl0aGluZyIpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250YWluZXIoY29udGFpbmVyOnBhbmVsKCkpIHsKKyAgICAgICAgICAgICAgICB3aWRnZXQod2lkZ2V0OmxhYmVsKCJsYWJlbCIpKQorICAgICAgICAgICAgICAgIGJlYW4oYmVhbjoiYW55dGhpbmciKQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFzc2VydCBzd2luZy53LnBhcmVudCA9PSBzd2luZy5jCisgICAgICAgIHNob3VsZEZhaWwgeworICAgICAgICAgICAgc3dpbmcuYWN0aW9ucyhwcm9wZXJ0eTonZmFpbHMnKQorICAgICAgICB9CisgICAgICAgIHNob3VsZEZhaWwgeworICAgICAgICAgICAgc3dpbmcud2lkZ2V0KCkKKyAgICAgICAgfQorICAgICAgICBzaG91bGRGYWlsIHsKKyAgICAgICAgICAgIHN3aW5nLndpZGdldChsYWJlbCgnbGFiZWwnKSkgeworICAgICAgICAgICAgICAgIGxhYmVsKCdObyBDb250ZW50IEZvciBZb3UhJykKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzaG91bGRGYWlsIHsKKyAgICAgICAgICAgIHN3aW5nLmNvbnRhaW5lcigpCisgICAgICAgIH0KKyAgICAgICAgc2hvdWxkRmFpbCB7CisgICAgICAgICAgICBzd2luZy5iZWFuKCkKKyAgICAgICAgfQorICAgICAgICBzaG91bGRGYWlsIHsKKyAgICAgICAgICAgIHN3aW5nLmJlYW4oImFueXRoaW5nIikgeworICAgICAgICAgICAgICAgIGxhYmVsKCdOb3RoaW5nJykKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2xlYW4gaW5zdGFuY2VQYXNzCisKKyAgICBwdWJsaWMgdm9pZCBtYXJrUGFzc2VkKCkgeworICAgICAgICBpbnN0YW5jZVBhc3MgPSB0cnVlCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEVEVCgpIHsKKyAgICAgICAgaWYgKGhlYWRsZXNzKSByZXR1cm4KKyAgICAgICAgZGVmIHN3aW5nID0gbmV3IFN3aW5nQnVpbGRlcigpCisKKyAgICAgICAgYm9vbGVhbiBwYXNzID0gZmFsc2UKKyAgICAgICAgc3dpbmcuZWR0IHsgcGFzcyA9IFN3aW5nVXRpbGl0aWVzLmlzRXZlbnREaXNwYXRjaFRocmVhZCgpIH0KKyAgICAgICAgYXNzZXJ0IHBhc3MKKworICAgICAgICBwYXNzID0gZmFsc2UKKyAgICAgICAgc3dpbmcuZWR0IHsgc3dpbmcuZWR0IHsgcGFzcyA9IFN3aW5nVXRpbGl0aWVzLmlzRXZlbnREaXNwYXRjaFRocmVhZCgpIH0gfQorICAgICAgICBhc3NlcnQgcGFzcworCisgICAgICAgIGluc3RhbmNlUGFzcyA9IGZhbHNlCisgICAgICAgIHN3aW5nLmVkdCB0aGlzLiZtYXJrUGFzc2VkCisgICAgICAgIGFzc2VydCBpbnN0YW5jZVBhc3MKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG9MYXRlcigpIHsKKyAgICAgICAgaWYgKGhlYWRsZXNzKSByZXR1cm4KKyAgICAgICAgZGVmIHN3aW5nID0gbmV3IFN3aW5nQnVpbGRlcigpCisKKyAgICAgICAgYm9vbGVhbiBwYXNzID0gZmFsc2UKKyAgICAgICAgc3dpbmcuZG9MYXRlciB7c2xlZXAgMTAwOyBwYXNzID0gdHJ1ZSB9CisgICAgICAgIGFzc2VydCAhcGFzcworICAgICAgICBzbGVlcCAyMDAKKyAgICAgICAgYXNzZXJ0IHBhc3MKKworICAgICAgICAvLyBkb0xhdGVyIGluIHRoZSBFRFQgaXMgc3RpbGwgYSBkbyBsYXRlcgorICAgICAgICBwYXNzID0gZmFsc2UKKyAgICAgICAgc3dpbmcuZWR0IHsgc3dpbmcuZG9MYXRlciB7c2xlZXAgMTAwOyBwYXNzID0gdHJ1ZSB9IH0KKyAgICAgICAgYXNzZXJ0ICFwYXNzCisgICAgICAgIHNsZWVwIDIwMAorICAgICAgICBhc3NlcnQgcGFzcworCisgICAgICAgIGluc3RhbmNlUGFzcyA9IGZhbHNlCisgICAgICAgIHN3aW5nLmRvTGF0ZXIgdGhpcy4mbWFya1Bhc3NlZAorICAgICAgICBzbGVlcCA1MAorICAgICAgICBhc3NlcnQgaW5zdGFuY2VQYXNzCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERvT3V0c2lkZSgpIHsKKyAgICAgICAgaWYgKGhlYWRsZXNzKSByZXR1cm4KKyAgICAgICAgZGVmIHN3aW5nID0gbmV3IFN3aW5nQnVpbGRlcigpCisKKyAgICAgICAgYm9vbGVhbiBwYXNzID0gZmFsc2UKKyAgICAgICAgc3dpbmcuZG9PdXRzaWRlIHtzbGVlcCAxMDA7IHBhc3MgPSB0cnVlIH0KKyAgICAgICAgYXNzZXJ0ICFwYXNzCisgICAgICAgIHNsZWVwIDIwMAorICAgICAgICBhc3NlcnQgcGFzcworCisgICAgICAgIHBhc3MgPSBmYWxzZQorICAgICAgICBzd2luZy5lZHQgeworICAgICAgICAgICAgc3dpbmcuZG9PdXRzaWRlIHtzbGVlcCAxMDA7IHBhc3MgPSB0cnVlIH0KKyAgICAgICAgICAgIGFzc2VydCAhcGFzcworICAgICAgICAgICAgc2xlZXAgMjAwCisgICAgICAgICAgICBhc3NlcnQgcGFzcworICAgICAgICB9CisKKyAgICAgICAgaW5zdGFuY2VQYXNzID0gZmFsc2UKKyAgICAgICAgc3dpbmcuZG9PdXRzaWRlIHRoaXMuJm1hcmtQYXNzZWQKKyAgICAgICAgc2xlZXAgNTAKKyAgICAgICAgYXNzZXJ0IGluc3RhbmNlUGFzcworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3REaXNwb3NlKCkgeworICAgICAgICBpZiAoaGVhZGxlc3MpIHJldHVybgorICAgICAgICBkZWYgc3dpbmcgPSBuZXcgU3dpbmdCdWlsZGVyKCkKKworICAgICAgICBzd2luZy5mcmFtZShpZDonZnJhbWUnKS5wYWNrKCkKKyAgICAgICAgc3dpbmcuZGlhbG9nKGlkOidkaWFsb2cnKS5wYWNrKCkKKyAgICAgICAgc3dpbmcud2luZG93KGlkOid3aW5kb3cnKS5wYWNrKCkKKworICAgICAgICAvL1RPRE8gY2hlY2sgYmluZCBhbmQgbW9kZWwKKyAgICAgICAgYXNzZXJ0IHN3aW5nLmZyYW1lLmlzRGlzcGxheWFibGUoKQorICAgICAgICBhc3NlcnQgc3dpbmcuZGlhbG9nLmlzRGlzcGxheWFibGUoKQorICAgICAgICBhc3NlcnQgc3dpbmcud2luZG93LmlzRGlzcGxheWFibGUoKQorICAgICAgICBzd2luZy5kaXNwb3NlKCkKKworICAgICAgICAvL1RPRE8gY2hlY2sgYmluZCBhbmQgbW9kZWwKKyAgICAgICAgYXNzZXJ0ICFzd2luZy5mcmFtZS5pc0Rpc3BsYXlhYmxlKCkKKyAgICAgICAgYXNzZXJ0ICFzd2luZy5kaWFsb2cuaXNEaXNwbGF5YWJsZSgpCisgICAgICAgIGFzc2VydCAhc3dpbmcud2luZG93LmlzRGlzcGxheWFibGUoKQorCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFBhY2tBbmRTaG93KCkgeworICAgICAgICBpZiAoaGVhZGxlc3MpIHJldHVybgorICAgICAgICBkZWYgc3dpbmcgPSBuZXcgU3dpbmdCdWlsZGVyKCkKKworICAgICAgICBzd2luZy5mcmFtZShpZDonZnJhbWUnLCBwYWNrOnRydWUpCisgICAgICAgIHN3aW5nLmRpYWxvZyhpZDonZGlhbG9nJywgcGFjazp0cnVlKQorICAgICAgICBzd2luZy53aW5kb3coaWQ6J3dpbmRvdycsIHBhY2s6dHJ1ZSkKKworICAgICAgICBhc3NlcnQgc3dpbmcuZnJhbWUuaXNEaXNwbGF5YWJsZSgpCisgICAgICAgIGFzc2VydCBzd2luZy5kaWFsb2cuaXNEaXNwbGF5YWJsZSgpCisgICAgICAgIGFzc2VydCBzd2luZy53aW5kb3cuaXNEaXNwbGF5YWJsZSgpCisgICAgICAgIHN3aW5nLmRpc3Bvc2UoKQorCisgICAgICAgIHN3aW5nLmZyYW1lKGlkOidmcmFtZScsIHNob3c6dHJ1ZSkKKyAgICAgICAgc3dpbmcuZGlhbG9nKGlkOidkaWFsb2cnLCBzaG93OnRydWUpCisgICAgICAgIHN3aW5nLndpbmRvdyhpZDond2luZG93Jywgc2hvdzp0cnVlKQorCisgICAgICAgIGFzc2VydCBzd2luZy5mcmFtZS52aXNpYmxlCisgICAgICAgIGFzc2VydCBzd2luZy5kaWFsb2cudmlzaWJsZQorICAgICAgICBhc3NlcnQgc3dpbmcud2luZG93LnZpc2libGUKKyAgICAgICAgc3dpbmcuZGlzcG9zZSgpCisKKyAgICAgICAgc3dpbmcuZnJhbWUoaWQ6J2ZyYW1lJywgcGFjazp0cnVlLCBzaG93OnRydWUpCisgICAgICAgIHN3aW5nLmRpYWxvZyhpZDonZGlhbG9nJywgcGFjazp0cnVlLCBzaG93OnRydWUpCisgICAgICAgIHN3aW5nLndpbmRvdyhpZDond2luZG93JywgcGFjazp0cnVlLCBzaG93OnRydWUpCisKKyAgICAgICAgYXNzZXJ0IHN3aW5nLmZyYW1lLnZpc2libGUKKyAgICAgICAgYXNzZXJ0IHN3aW5nLmRpYWxvZy52aXNpYmxlCisgICAgICAgIGFzc2VydCBzd2luZy53aW5kb3cudmlzaWJsZQorICAgICAgICBzd2luZy5kaXNwb3NlKCkKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbm1lbnQoKSB7CisgICAgICAgIGlmIChoZWFkbGVzcykgcmV0dXJuCisgICAgICAgIGRlZiBzd2luZyA9IG5ldyBTd2luZ0J1aWxkZXIoKQorCisgICAgICAgIGRlZiB0b3BMZXZlbCA9IFsKKyAgICAgICAgICAgICJ3aW5kb3ciLAorICAgICAgICAgICAgImZyYW1lIiwKKyAgICAgICAgICAgICJkaWFsb2ciLAorICAgICAgICAgICAgImludGVybmFsRnJhbWUiLAorICAgICAgICBdCisKKyAgICAgICAgZGVmIGNvbnRhaW5lcnMgPSBbCisgICAgICAgICAgICAiaGJveCIsCisgICAgICAgICAgICAiYm94IiwKKyAgICAgICAgICAgICJkZXNrdG9wUGFuZSIsCisgICAgICAgICAgICAibGF5ZXJlZFBhbmUiLAorICAgICAgICAgICAgInBhbmVsIiwKKyAgICAgICAgICAgICJwb3B1cE1lbnUiLAorICAgICAgICAgICAgLy8ic2Nyb2xsUGFuZSIsCisgICAgICAgICAgICAic3BsaXRQYW5lIiwKKyAgICAgICAgICAgICJ0YWJiZWRQYW5lIiwKKyAgICAgICAgICAgICJ0b29sQmFyIiwKKyAgICAgICAgICAgICJ2aWV3cG9ydCIsCisgICAgICAgIF0KKworICAgICAgICBkZWYgY29tcG9uZW50cyA9IFsKKyAgICAgICAgICAgICJjb21ib0JveCIsCisgICAgICAgICAgICAiZm9ybWF0dGVkVGV4dEZpZWxkIiwKKyAgICAgICAgICAgICJnbHVlIiwKKyAgICAgICAgICAgICJoYm94IiwKKyAgICAgICAgICAgICJoZ2x1ZSIsCisgICAgICAgICAgICAiaHN0cnV0IiwKKyAgICAgICAgICAgICJyaWdpZEFyZWEiLAorICAgICAgICAgICAgInNlcGFyYXRvciIsCisgICAgICAgICAgICAidmJveCIsCisgICAgICAgICAgICAidmdsdWUiLAorICAgICAgICAgICAgInZzdHJ1dCIsCisgICAgICAgICAgICAiYm94IiwKKyAgICAgICAgICAgICJjb2xvckNob29zZXIiLAorICAgICAgICAgICAgImRlc2t0b3BQYW5lIiwKKyAgICAgICAgICAgICJmaWxlQ2hvb3NlciIsCisgICAgICAgICAgICAiaW50ZXJuYWxGcmFtZSIsCisgICAgICAgICAgICAibGF5ZXJlZFBhbmUiLAorICAgICAgICAgICAgImxpc3QiLAorICAgICAgICAgICAgIm1lbnUiLAorICAgICAgICAgICAgLy8ibWVudUJhciIsCisgICAgICAgICAgICAib3B0aW9uUGFuZSIsCisgICAgICAgICAgICAicGFuZWwiLAorICAgICAgICAgICAgLy8icG9wdXBNZW51IiwKKyAgICAgICAgICAgICJwcm9ncmVzc0JhciIsCisgICAgICAgICAgICAic2Nyb2xsQmFyIiwKKyAgICAgICAgICAgICJzY3JvbGxQYW5lIiwKKyAgICAgICAgICAgICJzbGlkZXIiLAorICAgICAgICAgICAgInNwaW5uZXIiLAorICAgICAgICAgICAgInNwbGl0UGFuZSIsCisgICAgICAgICAgICAidGFiYmVkUGFuZSIsCisgICAgICAgICAgICAidGFibGUiLAorICAgICAgICAgICAgInRvb2xCYXIiLAorICAgICAgICAgICAgInRyZWUiLAorICAgICAgICAgICAgInZpZXdwb3J0IiwKKyAgICAgICAgICAgICJlZGl0b3JQYW5lIiwKKyAgICAgICAgICAgICJsYWJlbCIsCisgICAgICAgICAgICAicGFzc3dvcmRGaWVsZCIsCisgICAgICAgICAgICAidGV4dEFyZWEiLAorICAgICAgICAgICAgInRleHRGaWVsZCIsCisgICAgICAgICAgICAidGV4dFBhbmUiLAorICAgICAgICBdCisKKworICAgICAgICB0b3BMZXZlbC5lYWNoIHtwYXJlbnRXaWRnZXQgLT4KKyAgICAgICAgICAgIGNvbXBvbmVudHMuZWFjaCB7IGNoaWxkV2lkZ2V0IC0+CisgICAgICAgICAgICAgICAgLy9wcmludGxuICIkcGFyZW50V2lkZ2V0IC8gJGNoaWxkV2lkZ2V0IgorICAgICAgICAgICAgICAgIGRlZiBjaGlsZAorICAgICAgICAgICAgICAgIGRlZiBwYXJlbnQgPSBzd2luZy4iJHBhcmVudFdpZGdldCIgeyBjaGlsZCA9ICIkY2hpbGRXaWRnZXQiKCkgfQorICAgICAgICAgICAgICAgIGFzc2VydCBwYXJlbnQuY29udGVudFBhbmUgPT0gY2hpbGQucGFyZW50CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjb250YWluZXJzLmVhY2gge3BhcmVudFdpZGdldCAtPgorICAgICAgICAgICAgY29tcG9uZW50cy5lYWNoIHsgY2hpbGRXaWRnZXQgLT4KKyAgICAgICAgICAgICAgICAvL3ByaW50bG4gIiRwYXJlbnRXaWRnZXQgLyAkY2hpbGRXaWRnZXQiCisgICAgICAgICAgICAgICAgZGVmIGNoaWxkCisgICAgICAgICAgICAgICAgZGVmIHBhcmVudCA9IHN3aW5nLiIkcGFyZW50V2lkZ2V0IiB7IGNoaWxkID0gIiRjaGlsZFdpZGdldCIoKSB9CisgICAgICAgICAgICAgICAgYXNzZXJ0IHBhcmVudCA9PSBjaGlsZC5wYXJlbnQKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNvbXBvbmVudHMuZWFjaCB7IGNoaWxkV2lkZ2V0IC0+CisgICAgICAgICAgICAvL3ByaW50bG4gInNjcm9sbFBhbmUgLyAkY2hpbGRXaWRnZXQiCisKKyAgICAgICAgICAgIGRlZiBjaGlsZAorICAgICAgICAgICAgZGVmIHBhcmVudCA9IHN3aW5nLnNjcm9sbFBhbmUgeyBjaGlsZCA9ICIkY2hpbGRXaWRnZXQiKCkgfQorICAgICAgICAgICAgaWYgKGNoaWxkV2lkZ2V0ID09ICd2aWV3cG9ydCcpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQgcGFyZW50LnZpZXdwb3J0ID09IGNoaWxkCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFzc2VydCBwYXJlbnQudmlld3BvcnQgPT0gY2hpbGQucGFyZW50CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWVudXMoKSB7CisgICAgICAgIGlmIChoZWFkbGVzcykgcmV0dXJuCisgICAgICAgIGRlZiBzd2luZyA9IG5ldyBTd2luZ0J1aWxkZXIoKQorCisgICAgICAgIGRlZiBmcmFtZSA9IHN3aW5nLmZyYW1lIHsKKyAgICAgICAgICAgIG1lbnVCYXIoaWQ6J2JhcicpIHsKKyAgICAgICAgICAgICAgICBtZW51KCdtZW51JywgaWQ6J21lbnUnKSB7CisgICAgICAgICAgICAgICAgICAgIG1lbnVJdGVtKCdpdGVtJywgaWQ6J2l0ZW0nKQorICAgICAgICAgICAgICAgICAgICBjaGVja0JveE1lbnVJdGVtKCdjaGVjaycsIGlkOidjaGVjaycpCisgICAgICAgICAgICAgICAgICAgIHJhZGlvQnV0dG9uTWVudUl0ZW0oJ3JhZGlvJywgaWQ6J3JhZGlvJykKKyAgICAgICAgICAgICAgICAgICAgc2VwYXJhdG9yKGlkOidzZXAnKQorICAgICAgICAgICAgICAgICAgICBtZW51KCdzdWJNZW51JywgaWQ6J3N1Yk1lbnUnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW51SXRlbSgnaXRlbScsIGlkOidzdWJpdGVtJykKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrQm94TWVudUl0ZW0oJ2NoZWNrJywgaWQ6J3N1YmNoZWNrJykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhZGlvQnV0dG9uTWVudUl0ZW0oJ3JhZGlvJywgaWQ6J3N1YnJhZGlvJykKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcGFyYXRvcihpZDonc3Vic2VwJykKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbnUoJ3N1YlN1Yk1lbnUnLCBpZDonc3ViU3ViTWVudScpCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnQgZnJhbWUuSk1lbnVCYXIgPT0gc3dpbmcuYmFyCisgICAgICAgIGFzc2VydCBzd2luZy5iYXIubWVudUNvdW50ID09IDEKKyAgICAgICAgYXNzZXJ0IHN3aW5nLmJhci5nZXRNZW51KDApID09IHN3aW5nLm1lbnUKKworICAgICAgICBhc3NlcnQgc3dpbmcubWVudS5pdGVtQ291bnQgPT0gNQorICAgICAgICBhc3NlcnQgc3dpbmcubWVudS5nZXRJdGVtKDApID09IHN3aW5nLml0ZW0KKyAgICAgICAgYXNzZXJ0IHN3aW5nLm1lbnUuZ2V0SXRlbSgxKSA9PSBzd2luZy5jaGVjaworICAgICAgICBhc3NlcnQgc3dpbmcubWVudS5nZXRJdGVtKDIpID09IHN3aW5nLnJhZGlvCisgICAgICAgIGFzc2VydCBzd2luZy5tZW51LmdldEl0ZW0oMykgPT0gbnVsbCAvLyBub3QgYSBtZW51IGl0ZW0KKyAgICAgICAgYXNzZXJ0IHN3aW5nLm1lbnUuZ2V0TWVudUNvbXBvbmVudCgzKSA9PSBzd2luZy5zZXAKKyAgICAgICAgYXNzZXJ0IHN3aW5nLm1lbnUuZ2V0SXRlbSg0KSA9PSBzd2luZy5zdWJNZW51CisgICAgICAgIHNob3VsZEZhaWwgeyBzd2luZy5tZW51LmdldEl0ZW0oNSkgfQorCisgICAgICAgIGFzc2VydCBzd2luZy5zdWJNZW51Lml0ZW1Db3VudCA9PSA1CisgICAgICAgIGFzc2VydCBzd2luZy5zdWJNZW51LmdldEl0ZW0oMCkgPT0gc3dpbmcuc3ViaXRlbQorICAgICAgICBhc3NlcnQgc3dpbmcuc3ViTWVudS5nZXRJdGVtKDEpID09IHN3aW5nLnN1YmNoZWNrCisgICAgICAgIGFzc2VydCBzd2luZy5zdWJNZW51LmdldEl0ZW0oMikgPT0gc3dpbmcuc3VicmFkaW8KKyAgICAgICAgYXNzZXJ0IHN3aW5nLnN1Yk1lbnUuZ2V0SXRlbSgzKSA9PSBudWxsIC8vIG5vdCBhIG1lbnUgaXRlbQorICAgICAgICBhc3NlcnQgc3dpbmcuc3ViTWVudS5nZXRNZW51Q29tcG9uZW50KDMpID09IHN3aW5nLnN1YnNlcAorICAgICAgICBhc3NlcnQgc3dpbmcuc3ViTWVudS5nZXRJdGVtKDQpID09IHN3aW5nLnN1YlN1Yk1lbnUKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9va0FuZEZlZWwoKSB7CisgICAgICAgIGlmIChoZWFkbGVzcykgcmV0dXJuCisgICAgICAgIGRlZiBzd2luZyA9IG5ldyBTd2luZ0J1aWxkZXIoKQorCisgICAgICAgIGRlZiBvbGRMQUYgPSBVSU1hbmFnZXIuZ2V0TG9va0FuZEZlZWwoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIHRlc3QgTEFGcyBndWFyYW50ZWVkIHRvIGJlIGV2ZXJ5d2hlcmUKKyAgICAgICAgICAgIHN3aW5nLmxvb2tBbmRGZWVsKCdtZXRhbCcpCisgICAgICAgICAgICBzd2luZy5sb29rQW5kRmVlbCgnc3lzdGVtJykKKyAgICAgICAgICAgIHN3aW5nLmxvb2tBbmRGZWVsKCdjcm9zc1BsYXRmb3JtJykKKworICAgICAgICAgICAgLy8gdGVzdCBhbHRlcm5hdGUgaW52b2NhdGlvbnMuLi4KKyAgICAgICAgICAgIHN3aW5nLmxvb2tBbmRGZWVsKG5ldyBqYXZheC5zd2luZy5wbGFmLm1ldGFsLk1ldGFsTG9va0FuZEZlZWwoKSkKKyAgICAgICAgICAgIHNob3VsZEZhaWwoKSB7CisgICAgICAgICAgICAgICAgc3dpbmcubG9va0FuZEZlZWwodGhpcykKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aW5nLmxvb2tBbmRGZWVsKCdqYXZheC5zd2luZy5wbGFmLm1ldGFsLk1ldGFsTG9va0FuZEZlZWwnKQorICAgICAgICAgICAgc2hvdWxkRmFpbCgpIHsKKyAgICAgICAgICAgICAgICBzd2luZy5sb29rQW5kRmVlbCgnQm9ndXNMb29rQW5kRmVlbCcpCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHRlc3QgTWV0YWwgVGhlbWVpbmcgYW5kIGF1eCBhdHRyaWJ1dGVzCisgICAgICAgICAgICBzd2luZy5sb29rQW5kRmVlbCgnbWV0YWwnLCB0aGVtZTogJ3N0ZWVsJywgYm9sZEZvbnRzOiBmYWxzZSkKKyAgICAgICAgICAgIHNob3VsZEZhaWwgeworICAgICAgICAgICAgICAgIHN3aW5nLmxvb2tBbmRGZWVsKCdtZXRhbCcsIHRoZW1lOiAnc3RlZWwnLCBib2xkRm9udHM6IGZhbHNlLCBib2d1c0F0dHJpYnV0ZTogJ2JhZCBiYWQgYmFkJykKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gdGVzdCBzZXR1cCB2aWEgYXR0cmlidXRlIGFsb25lCisgICAgICAgICAgICBzd2luZy5sb29rQW5kRmVlbChsb29rQW5kRmVlbDonbWV0YWwnLCB0aGVtZTogJ3N0ZWVsJywgYm9sZEZvbnRzOiBmYWxzZSkKKworICAgICAgICAgICAgLy8gdGVzdCBMb29rIGFuZCBGZWVsIENsb3N1cmUKKyAgICAgICAgICAgIHN3aW5nLmxvb2tBbmRGZWVsKCdtZXRhbCcpIHsgbGFmIC0+CisgICAgICAgICAgICAgICAgYXNzZXJ0IGxhZiBpbnN0YW5jZW9mIE1ldGFsTG9va0FuZEZlZWwKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aW5nLmxvb2tBbmRGZWVsKCdtZXRhbCcsIGJvbGRGb250czogdHJ1ZSkgeyBsYWYgLT4KKyAgICAgICAgICAgICAgICBhc3NlcnQgbGFmIGluc3RhbmNlb2YgTWV0YWxMb29rQW5kRmVlbAorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpbmcubG9va0FuZEZlZWwobG9va0FuZEZlZWw6J21ldGFsJywgYm9sZEZvbnRzOiB0cnVlKSB7IGxhZiAtPgorICAgICAgICAgICAgICAgIGFzc2VydCBsYWYgaW5zdGFuY2VvZiBNZXRhbExvb2tBbmRGZWVsCisgICAgICAgICAgICB9CisgICAgICAgICAgICBzaG91bGRGYWlsIHsKKyAgICAgICAgICAgICAgICBzd2luZy5sb29rQW5kRmVlbCgpIHtsYWYgLT4KKyAgICAgICAgICAgICAgICAgICAgcHJpbnRsbiAic2hvdWxkbid0IGdldCBoZXJlIgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgVUlNYW5hZ2VyLnNldExvb2tBbmRGZWVsKG9sZExBRikKKyAgICAgICAgfQorICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEJvcmRlcnMoKSB7CisgICAgICAgIGlmIChoZWFkbGVzcykgcmV0dXJuCisgICAgICAgIGRlZiBzd2luZyA9IG5ldyBTd2luZ0J1aWxkZXIoKQorCisgICAgICAgIC8vIGNsYXNzaWMgc21va2UgdGVzdCwgdHJ5IGV2ZXJ5IHZhbGlkIGNvbWJpbmF0aW9uIGFuZCBsb29rIGZvciBzbW9rZS4uLgorICAgICAgICBzd2luZy5mcmFtZSB7CisgICAgICAgICAgICBsaW5lQm9yZGVyKGNvbG9yOkNvbG9yLkJMQUNLLCBwYXJlbnQ6dHJ1ZSkKKyAgICAgICAgICAgIGxpbmVCb3JkZXIoY29sb3I6Q29sb3IuQkxBQ0ssIHRoaWNrbmVzczo0LCBwYXJlbnQ6dHJ1ZSkKKyAgICAgICAgICAgIGxpbmVCb3JkZXIoY29sb3I6Q29sb3IuQkxBQ0ssIHJvdW5kZWRDb3JuZXJzOnRydWUsIHBhcmVudDp0cnVlKQorICAgICAgICAgICAgbGluZUJvcmRlcihjb2xvcjpDb2xvci5CTEFDSywgdGhpY2tuZXNzOjQsIHJvdW5kZWRDb3JuZXJzOnRydWUsIHBhcmVudDp0cnVlKQorICAgICAgICAgICAgcmFpc2VkQmV2ZWxCb3JkZXIocGFyZW50OnRydWUpCisgICAgICAgICAgICByYWlzZWRCZXZlbEJvcmRlcihoaWdobGlnaHQ6Q29sb3IuR1JFRU4sIHNoYWRvdzpDb2xvci5QSU5LLCBwYXJlbnQ6dHJ1ZSkKKyAgICAgICAgICAgIHJhaXNlZEJldmVsQm9yZGVyKGhpZ2hsaWdodE91dGVyOkNvbG9yLkdSRUVOLCBoaWdobGlnaHRJbm5lcjpDb2xvci5SRUQsIHNoYWRvd091dGVyOkNvbG9yLlBJTkssIHNoYWRvd0lubmVyOkNvbG9yLkJMVUUsIHBhcmVudDp0cnVlKQorICAgICAgICAgICAgbG93ZXJlZEJldmVsQm9yZGVyKHBhcmVudDp0cnVlKQorICAgICAgICAgICAgbG93ZXJlZEJldmVsQm9yZGVyKGhpZ2hsaWdodDpDb2xvci5HUkVFTiwgc2hhZG93OkNvbG9yLlBJTkssIHBhcmVudDp0cnVlKQorICAgICAgICAgICAgbG93ZXJlZEJldmVsQm9yZGVyKGhpZ2hsaWdodE91dGVyOkNvbG9yLkdSRUVOLCBoaWdobGlnaHRJbm5lcjpDb2xvci5SRUQsIHNoYWRvd091dGVyOkNvbG9yLlBJTkssIHNoYWRvd0lubmVyOkNvbG9yLkJMVUUsIHBhcmVudDp0cnVlKQorICAgICAgICAgICAgZXRjaGVkQm9yZGVyKHBhcmVudDp0cnVlKQorICAgICAgICAgICAgZXRjaGVkQm9yZGVyKGhpZ2hsaWdodDpDb2xvci5HUkVFTiwgc2hhZG93OkNvbG9yLlBJTkssIHBhcmVudDp0cnVlKQorICAgICAgICAgICAgbG93ZXJlZEV0Y2hlZEJvcmRlcihwYXJlbnQ6dHJ1ZSkKKyAgICAgICAgICAgIGxvd2VyZWRFdGNoZWRCb3JkZXIoaGlnaGxpZ2h0OkNvbG9yLkdSRUVOLCBzaGFkb3c6Q29sb3IuUElOSywgcGFyZW50OnRydWUpCisgICAgICAgICAgICByYWlzZWRFdGNoZWRCb3JkZXIocGFyZW50OnRydWUpCisgICAgICAgICAgICByYWlzZWRFdGNoZWRCb3JkZXIoaGlnaGxpZ2h0OkNvbG9yLkdSRUVOLCBzaGFkb3c6Q29sb3IuUElOSywgcGFyZW50OnRydWUpCisgICAgICAgICAgICB0aXRsZWRCb3JkZXIoIlRpdGxlIDEiLCBwYXJlbnQ6dHJ1ZSkKKyAgICAgICAgICAgIHRpdGxlZEJvcmRlcih0aXRsZToiVGl0bGUgMiIsIHBhcmVudDp0cnVlKQorICAgICAgICAgICAgdGl0bGVkQm9yZGVyKCJUaXRsZSAzIiwgcG9zaXRpb246J2JvdHRvbScsIHBhcmVudDp0cnVlKQorICAgICAgICAgICAgdGl0bGVkQm9yZGVyKHRpdGxlOiJUaXRsZSA0IiwgcG9zaXRpb246J2Fib3ZlQm90dG9tJywgcGFyZW50OnRydWUpCisgICAgICAgICAgICB0aXRsZWRCb3JkZXIoIlRpdGxlIDUiLCBwb3NpdGlvbjpUaXRsZWRCb3JkZXIuQUJPVkVfVE9QLCBwYXJlbnQ6dHJ1ZSkKKyAgICAgICAgICAgIHRpdGxlZEJvcmRlcih0aXRsZToiVGl0bGUgNiIsIHBvc2l0aW9uOlRpdGxlZEJvcmRlci5CT1RUT00sIHBhcmVudDp0cnVlKQorICAgICAgICAgICAgdGl0bGVkQm9yZGVyKCJUaXRsZSA3IiwganVzdGlmaWNhdGlvbjoncmlnaHQnLCBwYXJlbnQ6dHJ1ZSkKKyAgICAgICAgICAgIHRpdGxlZEJvcmRlcih0aXRsZToiVGl0bGUgOCIsIGp1c3RpZmljYXRpb246J2FjZW50ZXInLCBwYXJlbnQ6dHJ1ZSkKKyAgICAgICAgICAgIHRpdGxlZEJvcmRlcigiVGl0bGUgOSIsIGp1c3RpZmljYXRpb246VGl0bGVkQm9yZGVyLlRSQUlMSU5HLCBwYXJlbnQ6dHJ1ZSkKKyAgICAgICAgICAgIHRpdGxlZEJvcmRlcih0aXRsZToiVGl0bGUgQSIsIGp1c3RpZmljYXRpb246VGl0bGVkQm9yZGVyLkxFQURJTkcsIHBhcmVudDp0cnVlKQorICAgICAgICAgICAgdGl0bGVkQm9yZGVyKCJUaXRsZSBCIiwgYm9yZGVyOmxpbmVCb3JkZXIoY29sb3I6Q29sb3IuUkVELCB0aGlja25lc3M6NiksIHBhcmVudDp0cnVlKQorICAgICAgICAgICAgdGl0bGVkQm9yZGVyKHRpdGxlOiJUaXRsZSBDIiwgYm9yZGVyOmxpbmVCb3JkZXIoY29sb3I6Q29sb3IuQkxVRSwgdGhpY2tuZXNzOjYpLCBwYXJlbnQ6dHJ1ZSkKKyAgICAgICAgICAgIHRpdGxlZEJvcmRlcigiVGl0bGUgRCIsIGNvbG9yOkNvbG9yLkNZQU4sIHBhcmVudDp0cnVlKQorICAgICAgICAgICAgdGl0bGVkQm9yZGVyKHRpdGxlOiJUaXRsZSBFIiwgYm9yZGVyOmxpbmVCb3JkZXIoY29sb3I6Q29sb3IuQkxVRSwgdGhpY2tuZXNzOjYpLCBwYXJlbnQ6dHJ1ZSkKKyAgICAgICAgICAgIGVtcHR5Qm9yZGVyKDYsIHBhcmVudDp0cnVlKQorICAgICAgICAgICAgZW1wdHlCb3JkZXIoWzMsNSw2LDldLCBwYXJlbnQ6dHJ1ZSkKKyAgICAgICAgICAgIGVtcHR5Qm9yZGVyKHRvcDo2LCBsZWZ0OjUsIGJvdHRvbTo2LCByaWdodDo5LCBwYXJlbnQ6dHJ1ZSkKKyAgICAgICAgICAgIGNvbXBvdW5kQm9yZGVyKFt0aXRsZWRCb3JkZXIoInNpbmdsZSIpXSwgcGFyZW50OnRydWUpCisgICAgICAgICAgICBjb21wb3VuZEJvcmRlcihbdGl0bGVkQm9yZGVyKCJvdXRlciIpLCB0aXRsZWRCb3JkZXIoImlubmVyIildLCBwYXJlbnQ6dHJ1ZSkKKyAgICAgICAgICAgIGNvbXBvdW5kQm9yZGVyKG91dGVyOnRpdGxlZEJvcmRlcigib3V0ZXIiKSwgaW5uZXI6dGl0bGVkQm9yZGVyKCJpbm5lciIpLCBwYXJlbnQ6dHJ1ZSkKKyAgICAgICAgICAgIGNvbXBvdW5kQm9yZGVyKFt0aXRsZWRCb3JkZXIoIm91dGVyIiksIHRpdGxlZEJvcmRlcigibWlkZGxlIiksIHRpdGxlZEJvcmRlcigiaW5uZXIiKV0sIHBhcmVudDp0cnVlKQorICAgICAgICAgICAgbWF0dGVCb3JkZXIoQ29sb3IuTUFHRU5UQSwgc2l6ZTo3LCBwYXJlbnQ6dHJ1ZSkKKyAgICAgICAgICAgIG1hdHRlQm9yZGVyKDcsIGNvbG9yOkNvbG9yLk1BR0VOVEEsIHBhcmVudDp0cnVlKQorICAgICAgICAgICAgbWF0dGVCb3JkZXIoamF2YXguc3dpbmcucGxhZi5tZXRhbC5NZXRhbEljb25GYWN0b3J5LmdldENoZWNrQm94SWNvbigpLCBzaXplOjksIHBhcmVudDp0cnVlKQorICAgICAgICAgICAgbWF0dGVCb3JkZXIoOSwgaWNvbjpqYXZheC5zd2luZy5wbGFmLm1ldGFsLk1ldGFsSWNvbkZhY3RvcnkuZ2V0Q2hlY2tCb3hJY29uKCksIHBhcmVudDp0cnVlKQorCisgICAgICAgICAgICBsaW5lQm9yZGVyKGNvbG9yOkNvbG9yLkJMQUNLKQorICAgICAgICAgICAgbGluZUJvcmRlcihjb2xvcjpDb2xvci5CTEFDSywgdGhpY2tuZXNzOjQpCisgICAgICAgICAgICBsaW5lQm9yZGVyKGNvbG9yOkNvbG9yLkJMQUNLLCByb3VuZGVkQ29ybmVyczp0cnVlKQorICAgICAgICAgICAgbGluZUJvcmRlcihjb2xvcjpDb2xvci5CTEFDSywgdGhpY2tuZXNzOjQsIHJvdW5kZWRDb3JuZXJzOnRydWUpCisgICAgICAgICAgICByYWlzZWRCZXZlbEJvcmRlcigpCisgICAgICAgICAgICByYWlzZWRCZXZlbEJvcmRlcihoaWdobGlnaHQ6Q29sb3IuR1JFRU4sIHNoYWRvdzpDb2xvci5QSU5LKQorICAgICAgICAgICAgcmFpc2VkQmV2ZWxCb3JkZXIoaGlnaGxpZ2h0T3V0ZXI6Q29sb3IuR1JFRU4sIGhpZ2hsaWdodElubmVyOkNvbG9yLlJFRCwgc2hhZG93T3V0ZXI6Q29sb3IuUElOSywgc2hhZG93SW5uZXI6Q29sb3IuQkxVRSkKKyAgICAgICAgICAgIGxvd2VyZWRCZXZlbEJvcmRlcigpCisgICAgICAgICAgICBsb3dlcmVkQmV2ZWxCb3JkZXIoaGlnaGxpZ2h0OkNvbG9yLkdSRUVOLCBzaGFkb3c6Q29sb3IuUElOSykKKyAgICAgICAgICAgIGxvd2VyZWRCZXZlbEJvcmRlcihoaWdobGlnaHRPdXRlcjpDb2xvci5HUkVFTiwgaGlnaGxpZ2h0SW5uZXI6Q29sb3IuUkVELCBzaGFkb3dPdXRlcjpDb2xvci5QSU5LLCBzaGFkb3dJbm5lcjpDb2xvci5CTFVFKQorICAgICAgICAgICAgZXRjaGVkQm9yZGVyKCkKKyAgICAgICAgICAgIGV0Y2hlZEJvcmRlcihoaWdobGlnaHQ6Q29sb3IuR1JFRU4sIHNoYWRvdzpDb2xvci5QSU5LKQorICAgICAgICAgICAgbG93ZXJlZEV0Y2hlZEJvcmRlcigpCisgICAgICAgICAgICBsb3dlcmVkRXRjaGVkQm9yZGVyKGhpZ2hsaWdodDpDb2xvci5HUkVFTiwgc2hhZG93OkNvbG9yLlBJTkspCisgICAgICAgICAgICByYWlzZWRFdGNoZWRCb3JkZXIoKQorICAgICAgICAgICAgcmFpc2VkRXRjaGVkQm9yZGVyKGhpZ2hsaWdodDpDb2xvci5HUkVFTiwgc2hhZG93OkNvbG9yLlBJTkspCisgICAgICAgICAgICB0aXRsZWRCb3JkZXIoIlRpdGxlIDEiKQorICAgICAgICAgICAgdGl0bGVkQm9yZGVyKHRpdGxlOiJUaXRsZSAyIikKKyAgICAgICAgICAgIHRpdGxlZEJvcmRlcigiVGl0bGUgMyIsIHBvc2l0aW9uOidib3R0b20nKQorICAgICAgICAgICAgdGl0bGVkQm9yZGVyKHRpdGxlOiJUaXRsZSA0IiwgcG9zaXRpb246J2Fib3ZlQm90dG9tJykKKyAgICAgICAgICAgIHRpdGxlZEJvcmRlcigiVGl0bGUgNSIsIHBvc2l0aW9uOlRpdGxlZEJvcmRlci5BQk9WRV9UT1ApCisgICAgICAgICAgICB0aXRsZWRCb3JkZXIodGl0bGU6IlRpdGxlIDYiLCBwb3NpdGlvbjpUaXRsZWRCb3JkZXIuQk9UVE9NKQorICAgICAgICAgICAgdGl0bGVkQm9yZGVyKCJUaXRsZSA3IiwganVzdGlmaWNhdGlvbjoncmlnaHQnKQorICAgICAgICAgICAgdGl0bGVkQm9yZGVyKHRpdGxlOiJUaXRsZSA4IiwganVzdGlmaWNhdGlvbjonYWNlbnRlcicpCisgICAgICAgICAgICB0aXRsZWRCb3JkZXIoIlRpdGxlIDkiLCBqdXN0aWZpY2F0aW9uOlRpdGxlZEJvcmRlci5UUkFJTElORykKKyAgICAgICAgICAgIHRpdGxlZEJvcmRlcih0aXRsZToiVGl0bGUgQSIsIGp1c3RpZmljYXRpb246VGl0bGVkQm9yZGVyLkxFQURJTkcpCisgICAgICAgICAgICB0aXRsZWRCb3JkZXIoIlRpdGxlIEIiLCBib3JkZXI6bGluZUJvcmRlcihjb2xvcjpDb2xvci5SRUQsIHRoaWNrbmVzczo2KSkKKyAgICAgICAgICAgIHRpdGxlZEJvcmRlcih0aXRsZToiVGl0bGUgQyIsIGJvcmRlcjpsaW5lQm9yZGVyKGNvbG9yOkNvbG9yLkJMVUUsIHRoaWNrbmVzczo2KSkKKyAgICAgICAgICAgIHRpdGxlZEJvcmRlcigiVGl0bGUgRCIsIGNvbG9yOkNvbG9yLkNZQU4pCisgICAgICAgICAgICB0aXRsZWRCb3JkZXIodGl0bGU6IlRpdGxlIEUiLCBib3JkZXI6bGluZUJvcmRlcihjb2xvcjpDb2xvci5CTFVFLCB0aGlja25lc3M6NikpCisgICAgICAgICAgICBlbXB0eUJvcmRlcig2KQorICAgICAgICAgICAgZW1wdHlCb3JkZXIoWzMsNSw2LDldKQorICAgICAgICAgICAgZW1wdHlCb3JkZXIodG9wOjYsIGxlZnQ6NSwgYm90dG9tOjYsIHJpZ2h0OjkpCisgICAgICAgICAgICBjb21wb3VuZEJvcmRlcihbdGl0bGVkQm9yZGVyKCJzaW5nbGUiKV0pCisgICAgICAgICAgICBjb21wb3VuZEJvcmRlcihbdGl0bGVkQm9yZGVyKCJvdXRlciIpLCB0aXRsZWRCb3JkZXIoImlubmVyIildKQorICAgICAgICAgICAgY29tcG91bmRCb3JkZXIob3V0ZXI6dGl0bGVkQm9yZGVyKCJvdXRlciIpLCBpbm5lcjp0aXRsZWRCb3JkZXIoImlubmVyIikpCisgICAgICAgICAgICBjb21wb3VuZEJvcmRlcihbdGl0bGVkQm9yZGVyKCJvdXRlciIpLCB0aXRsZWRCb3JkZXIoIm1pZGRsZSIpLCB0aXRsZWRCb3JkZXIoImlubmVyIildKQorICAgICAgICAgICAgbWF0dGVCb3JkZXIoQ29sb3IuTUFHRU5UQSwgc2l6ZTo3KQorICAgICAgICAgICAgbWF0dGVCb3JkZXIoNywgY29sb3I6Q29sb3IuTUFHRU5UQSkKKyAgICAgICAgICAgIG1hdHRlQm9yZGVyKGphdmF4LnN3aW5nLnBsYWYubWV0YWwuTWV0YWxJY29uRmFjdG9yeS5nZXRDaGVja0JveEljb24oKSwgc2l6ZTo5KQorICAgICAgICAgICAgbWF0dGVCb3JkZXIoOSwgaWNvbjpqYXZheC5zd2luZy5wbGFmLm1ldGFsLk1ldGFsSWNvbkZhY3RvcnkuZ2V0Q2hlY2tCb3hJY29uKCkpCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Qm9yZGVyQXR0YWNobWVudCgpIHsKKyAgICAgICAgaWYgKGhlYWRsZXNzKSByZXR1cm4KKyAgICAgICAgZGVmIHN3aW5nID0gbmV3IFN3aW5nQnVpbGRlcigpCisKKyAgICAgICAgc3dpbmcuZnJhbWUoaWQ6J2ZyYW1lJykgeworICAgICAgICAgICByYWlzZWRCZXZlbEJvcmRlcigpCisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0IHN3aW5nLmZyYW1lLmNvbnRlbnRQYW5lLmJvcmRlciA9PSBudWxsCisKKyAgICAgICAgc3dpbmcuZnJhbWUoaWQ6J2ZyYW1lJykgeworICAgICAgICAgICByYWlzZWRCZXZlbEJvcmRlcihwYXJlbnQ6dHJ1ZSkKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQgc3dpbmcuZnJhbWUuY29udGVudFBhbmUuYm9yZGVyICE9IG51bGwKKworICAgICAgICBzd2luZy5wYW5lbChpZDoncGFuZWwnKSB7CisgICAgICAgICAgIHJhaXNlZEJldmVsQm9yZGVyKCkKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQgc3dpbmcucGFuZWwuYm9yZGVyID09IG51bGwKKworICAgICAgICBzd2luZy5wYW5lbChpZDoncGFuZWwnKSB7CisgICAgICAgICAgIHJhaXNlZEJldmVsQm9yZGVyKHBhcmVudDp0cnVlKQorICAgICAgICB9CisgICAgICAgIGFzc2VydCBzd2luZy5wYW5lbC5ib3JkZXIgIT0gbnVsbAorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbWFnZUljb24oKSB7CisgICAgICAgIGlmIChoZWFkbGVzcykgcmV0dXJuCisgICAgICAgIGRlZiBzd2luZyA9IG5ldyBTd2luZ0J1aWxkZXIoKQorCisgICAgICAgIFN0cmluZyBiYXNlRGlyID0gbmV3IEZpbGUoInNyYy9tYWluIikuYWJzb2x1dGVQYXRoCisKKyAgICAgICAgU3RyaW5nIHJlc291cmNlID0gQ29uc29sZS5JQ09OX1BBVEgKKyAgICAgICAgU3RyaW5nIHBhdGggPSBiYXNlRGlyICsgcmVzb3VyY2UKKyAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUocGF0aCkKKyAgICAgICAgU3RyaW5nIHJlbGF0aXZlUmVzb3VyY2UgPSBmaWxlLm5hbWUKKyAgICAgICAgVVJMIHVybCA9IGZpbGUudG9VUkwoKQorCisgICAgICAgIHN3aW5nLmltYWdlSWNvbihwYXRoLCBpZDonaWknKQorICAgICAgICBhc3NlcnQgc3dpbmcuaWkgIT0gbnVsbAorCisgICAgICAgIHN3aW5nLmltYWdlSWNvbihmaWxlOnBhdGgsIGlkOidpaScpCisgICAgICAgIGFzc2VydCBzd2luZy5paSAhPSBudWxsCisKKyAgICAgICAgc3dpbmcuaW1hZ2VJY29uKHBhdGgsIGRlc2NyaXB0aW9uOic8bm9uZT4nLCBpZDonaWknKQorICAgICAgICBhc3NlcnQgc3dpbmcuaWkgIT0gbnVsbAorICAgICAgICBhc3NlcnQgc3dpbmcuaWkuZGVzY3JpcHRpb24gPT0gJzxub25lPicKKworICAgICAgICBzd2luZy5pbWFnZUljb24oZmlsZTpwYXRoLCBkZXNjcmlwdGlvbjonPG5vbmU+JywgaWQ6J2lpJykKKyAgICAgICAgYXNzZXJ0IHN3aW5nLmlpICE9IG51bGwKKyAgICAgICAgYXNzZXJ0IHN3aW5nLmlpLmRlc2NyaXB0aW9uID09ICc8bm9uZT4nCisKKworICAgICAgICBzd2luZy5pbWFnZUljb24odXJsLCBpZDonaWknKQorICAgICAgICBhc3NlcnQgc3dpbmcuaWkgIT0gbnVsbAorCisgICAgICAgIHN3aW5nLmltYWdlSWNvbih1cmw6dXJsLCBpZDonaWknKQorICAgICAgICBhc3NlcnQgc3dpbmcuaWkgIT0gbnVsbAorCisgICAgICAgIHN3aW5nLmltYWdlSWNvbih1cmwsIGRlc2NyaXB0aW9uOic8bm9uZT4nLCBpZDonaWknKQorICAgICAgICBhc3NlcnQgc3dpbmcuaWkgIT0gbnVsbAorICAgICAgICBhc3NlcnQgc3dpbmcuaWkuZGVzY3JpcHRpb24gPT0gJzxub25lPicKKworICAgICAgICBzd2luZy5pbWFnZUljb24odXJsOnVybCwgZGVzY3JpcHRpb246Jzxub25lPicsIGlkOidpaScpCisgICAgICAgIGFzc2VydCBzd2luZy5paSAhPSBudWxsCisgICAgICAgIGFzc2VydCBzd2luZy5paS5kZXNjcmlwdGlvbiA9PSAnPG5vbmU+JworCisKKyAgICAgICAgc3dpbmcuaW1hZ2VJY29uKHJlc291cmNlLCBpZDonaWknKQorICAgICAgICBhc3NlcnQgc3dpbmcuaWkgIT0gbnVsbAorCisgICAgICAgIHN3aW5nLmltYWdlSWNvbihyZXNvdXJjZTpyZXNvdXJjZSwgaWQ6J2lpJykKKyAgICAgICAgYXNzZXJ0IHN3aW5nLmlpICE9IG51bGwKKworICAgICAgICBzd2luZy5pbWFnZUljb24ocmVzb3VyY2UsIGRlc2NyaXB0aW9uOic8bm9uZT4nLCBpZDonaWknKQorICAgICAgICBhc3NlcnQgc3dpbmcuaWkgIT0gbnVsbAorICAgICAgICBhc3NlcnQgc3dpbmcuaWkuZGVzY3JpcHRpb24gPT0gJzxub25lPicKKworICAgICAgICBzd2luZy5pbWFnZUljb24oZmlsZTpyZXNvdXJjZSwgZGVzY3JpcHRpb246Jzxub25lPicsIGlkOidpaScpCisgICAgICAgIGFzc2VydCBzd2luZy5paSAhPSBudWxsCisgICAgICAgIGFzc2VydCBzd2luZy5paS5kZXNjcmlwdGlvbiA9PSAnPG5vbmU+JworCisKKyAgICAgICAgc3dpbmcuaW1hZ2VJY29uKHJlc291cmNlLCBjbGFzczpDb25zb2xlLCBpZDonaWknKQorICAgICAgICBhc3NlcnQgc3dpbmcuaWkgIT0gbnVsbAorCisgICAgICAgIHN3aW5nLmltYWdlSWNvbihyZXNvdXJjZTpyZXNvdXJjZSwgY2xhc3M6Q29uc29sZSwgaWQ6J2lpJykKKyAgICAgICAgYXNzZXJ0IHN3aW5nLmlpICE9IG51bGwKKworICAgICAgICBzd2luZy5pbWFnZUljb24ocmVzb3VyY2UsIGRlc2NyaXB0aW9uOic8bm9uZT4nLCBjbGFzczpDb25zb2xlLCBpZDonaWknKQorICAgICAgICBhc3NlcnQgc3dpbmcuaWkgIT0gbnVsbAorICAgICAgICBhc3NlcnQgc3dpbmcuaWkuZGVzY3JpcHRpb24gPT0gJzxub25lPicKKworICAgICAgICBzd2luZy5pbWFnZUljb24oZmlsZTpyZXNvdXJjZSwgZGVzY3JpcHRpb246Jzxub25lPicsIGNsYXNzOkNvbnNvbGUsIGlkOidpaScpCisgICAgICAgIGFzc2VydCBzd2luZy5paSAhPSBudWxsCisgICAgICAgIGFzc2VydCBzd2luZy5paS5kZXNjcmlwdGlvbiA9PSAnPG5vbmU+JworCisKKyAgICAgICAgc3dpbmcuaW1hZ2VJY29uKHJlbGF0aXZlUmVzb3VyY2UsIGNsYXNzOkNvbnNvbGUsIGlkOidpaScpCisgICAgICAgIGFzc2VydCBzd2luZy5paSAhPSBudWxsCisKKyAgICAgICAgc3dpbmcuaW1hZ2VJY29uKHJlc291cmNlOnJlbGF0aXZlUmVzb3VyY2UsIGNsYXNzOkNvbnNvbGUsIGlkOidpaScpCisgICAgICAgIGFzc2VydCBzd2luZy5paSAhPSBudWxsCisKKyAgICAgICAgc3dpbmcuaW1hZ2VJY29uKHJlbGF0aXZlUmVzb3VyY2UsIGRlc2NyaXB0aW9uOic8bm9uZT4nLCBjbGFzczpDb25zb2xlLCBpZDonaWknKQorICAgICAgICBhc3NlcnQgc3dpbmcuaWkgIT0gbnVsbAorICAgICAgICBhc3NlcnQgc3dpbmcuaWkuZGVzY3JpcHRpb24gPT0gJzxub25lPicKKworICAgICAgICBzd2luZy5pbWFnZUljb24oZmlsZTpyZWxhdGl2ZVJlc291cmNlLCBkZXNjcmlwdGlvbjonPG5vbmU+JywgY2xhc3M6Q29uc29sZSwgaWQ6J2lpJykKKyAgICAgICAgYXNzZXJ0IHN3aW5nLmlpICE9IG51bGwKKyAgICAgICAgYXNzZXJ0IHN3aW5nLmlpLmRlc2NyaXB0aW9uID09ICc8bm9uZT4nCisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3RleHQvU2ltcGxlVGVtcGxhdGVUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvdGV4dC9TaW1wbGVUZW1wbGF0ZVRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNzgyOGEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3RleHQvU2ltcGxlVGVtcGxhdGVUZXN0Lmdyb292eQpAQCAtMCwwICsxLDU4IEBACitwYWNrYWdlIGdyb292eS50ZXh0CisKK2NsYXNzIFNpbXBsZVRlbXBsYXRlVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIHZvaWQgdGVzdFNpbXBsZUNhbGxGcm9tR3Jvb3Z5RW1wdHkoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygnJywgc2ltcGxlQ2FsbCgnJykpCisgICAgfQorCisgICAgdm9pZCB0ZXN0U2ltcGxlQ2FsbEZyb21Hcm9vdnlTdGF0aWMoKSB7CisgICAgICAgIGRlZiBpbnB1dCA9ICdzb21lIHN0YXRpYyB0ZXh0JworICAgICAgICBhc3NlcnRFcXVhbHMoaW5wdXQsIHNpbXBsZUNhbGwoaW5wdXQpKQorICAgIH0KKworICAgIHZvaWQgdGVzdEV4cHJlc3Npb25Bc3NpZ24oKSB7CisgICAgICAgIGFzc2VydEVxdWFscygnMScsICAgc2ltcGxlQ2FsbCgnPCU9MSU+JykpCisgICAgICAgIGFzc2VydEVxdWFscygnIDEnLCAgc2ltcGxlQ2FsbCgnIDwlPTElPicpKQorICAgICAgICBhc3NlcnRFcXVhbHMoJyAxICcsIHNpbXBsZUNhbGwoJyA8JT0xJT4gJykpCisgICAgICAgIGFzc2VydEVxdWFscygnIDEgJywgc2ltcGxlQ2FsbCgnIDwlPSAxJT4gJykpCisgICAgICAgIGFzc2VydEVxdWFscygnIDEgJywgc2ltcGxlQ2FsbCgnIDwlPSAxICU+ICcpKQorICAgICAgICBhc3NlcnRFcXVhbHMoJyAxICcsIHNpbXBsZUNhbGwoIiA8JT1cbiAxIFxuJT4gIikpCisgICAgICAgIGFzc2VydEVxdWFscygnIDEnLCBiaW5kaW5nQ2FsbChbYToxXSwnIDwlPWElPicpKQorICAgIH0KKworICAgIHZvaWQgdGVzdEV4cHJlc3Npb25FdmFsKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoJzEnLCBzaW1wbGVDYWxsKCc8JXByaW50KDEpJT4nKSkKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCcwMScsIHNpbXBsZUNhbGwoJzwlZm9yKGkgaW4gMC4uMSl7cHJpbnQoaSl9JT4nKSkKKyAgICB9CisKKyAgICB2b2lkIHRlc3RXaXRoTWFya3VwQnVpbGRlcigpeworICAgIGRlZiB0ZXh0ID0gJycnPCUKKyAgICAgICAgYnVpbGRlciA9IG5ldyBncm9vdnkueG1sLk1hcmt1cEJ1aWxkZXIob3V0KQorICAgICAgICBbMSwyLDNdLmVhY2h7IGNvdW50IC0+CisgICAgICAgICAgICBvdXQucHJpbnQoMSkKKyAgICAgICAgfQorICAgICU+JycnCisgICAgYXNzZXJ0RXF1YWxzKCcxMTEnLCBzaW1wbGVDYWxsKHRleHQpKQorICAgIH0KKworICAgIHZvaWQgdGVzdFdpdGhNYXJrdXBCdWlsZGVyV2l0aFNlbWljb2xvbnMoKXsKKyAgICBkZWYgdGV4dCA9ICcnJzwlCisgICAgICAgIGJ1aWxkZXIgPSBuZXcgZ3Jvb3Z5LnhtbC5NYXJrdXBCdWlsZGVyKG91dCk7CisgICAgICAgIFsxLDIsM10uZWFjaHsgY291bnQgLT4KKyAgICAgICAgICAgIG91dC5wcmludCgxKTsKKyAgICAgICAgfQorICAgICU+JycnCisgICAgYXNzZXJ0RXF1YWxzKCcxMTEnLCBzaW1wbGVDYWxsKHRleHQpKQorICAgIH0KKworICAgIFN0cmluZyBzaW1wbGVDYWxsKGlucHV0KXsKKyAgICAgICAgYmluZGluZ0NhbGwoWzpdLCBpbnB1dCkKKyAgICB9CisKKyAgICBTdHJpbmcgYmluZGluZ0NhbGwoYmluZGluZywgaW5wdXQpeworICAgICAgICBkZWYgdGVtcGxhdGUgPSBuZXcgU2ltcGxlVGVtcGxhdGVFbmdpbmUodHJ1ZSkuY3JlYXRlVGVtcGxhdGUoaW5wdXQpCisgICAgICAgIHJldHVybiB0ZW1wbGF0ZS5tYWtlKGJpbmRpbmcpLnRvU3RyaW5nKCkKKyAgICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3RleHQvVGVtcGxhdGVUZXN0LmphdmEgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3RleHQvVGVtcGxhdGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFhYjRiYwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvdGV4dC9UZW1wbGF0ZVRlc3QuamF2YQpAQCAtMCwwICsxLDY5IEBACisvKgorICogJElkJHZlcnNpb24gTWFyIDgsIDIwMDQgMTozNjozMSBBTSAkdXNlciBFeHAgJAorICogCisgKiBDb3B5cmlnaHQgMjAwMyAoQykgU2FtIFB1bGxhcmEuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbgorICogY29weXJpZ2h0IHN0YXRlbWVudHMgYW5kIG5vdGljZXMuIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhIGNvcHkKKyAqIG9mIHRoaXMgZG9jdW1lbnQuIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAzLgorICogVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gRm9yCisgKiB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLiA0LiBQcm9kdWN0cyBkZXJpdmVkCisgKiBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4KKyAqIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYQorICogcmVnaXN0ZXJlZCB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLiA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUKKyAqIENvZGVoYXVzIC0gaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorICogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorICogREFNQUdFLgorICogIAorICovCitwYWNrYWdlIGdyb292eS50ZXh0OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5Db21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBAYXV0aG9yIHNhbQorICovCitwdWJsaWMgY2xhc3MgVGVtcGxhdGVUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHVibGljIHZvaWQgdGVzdE1peGVkVGVtcGxhdGVUZXh0KCkgdGhyb3dzIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFRlbXBsYXRlIHRlbXBsYXRlMSA9IG5ldyBTaW1wbGVUZW1wbGF0ZUVuZ2luZSgpLmNyZWF0ZVRlbXBsYXRlKCI8JT0gXCJ0ZXN0XCIgJT4gb2YgZXhwciBhbmQgPCUgdGVzdCA9IDEgJT4ke3Rlc3R9IHNjcmlwdC4iKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0IG9mIGV4cHIgYW5kIDEgc2NyaXB0LiIsIHRlbXBsYXRlMS5tYWtlKCkudG9TdHJpbmcoKSk7CisKKyAgICAgICAgVGVtcGxhdGUgdGVtcGxhdGUyID0gbmV3IEdTdHJpbmdUZW1wbGF0ZUVuZ2luZSgpLmNyZWF0ZVRlbXBsYXRlKCI8JT0gXCJ0ZXN0XCIgJT4gb2YgZXhwciBhbmQgPCUgdGVzdCA9IDEgJT4ke3Rlc3R9IHNjcmlwdC4iKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0IG9mIGV4cHIgYW5kIDEgc2NyaXB0LiIsIHRlbXBsYXRlMi5tYWtlKCkudG9TdHJpbmcoKSk7CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmluZGluZygpIHRocm93cyBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBNYXAgYmluZGluZyA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIGJpbmRpbmcucHV0KCJzYW0iLCAicHVsbGFyYSIpOworCisgICAgICAgIFRlbXBsYXRlIHRlbXBsYXRlMSA9IG5ldyBTaW1wbGVUZW1wbGF0ZUVuZ2luZSgpLmNyZWF0ZVRlbXBsYXRlKCI8JT0gc2FtICU+PCUgcHJpbnQgc2FtICU+Iik7CisgICAgICAgIGFzc2VydEVxdWFscygicHVsbGFyYXB1bGxhcmEiLCB0ZW1wbGF0ZTEubWFrZShiaW5kaW5nKS50b1N0cmluZygpKTsKKworICAgICAgICBUZW1wbGF0ZSB0ZW1wbGF0ZTIgPSBuZXcgR1N0cmluZ1RlbXBsYXRlRW5naW5lKCkuY3JlYXRlVGVtcGxhdGUoIjwlPSBzYW0gJT48JSBvdXQgPDwgc2FtICU+Iik7CisgICAgICAgIGFzc2VydEVxdWFscygicHVsbGFyYXB1bGxhcmEiLCB0ZW1wbGF0ZTIubWFrZShiaW5kaW5nKS50b1N0cmluZygpKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS90ZXh0L1htbFRlbXBsYXRlRW5naW5lVGVzdC5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS90ZXh0L1htbFRlbXBsYXRlRW5naW5lVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyOWZiZjcKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3RleHQvWG1sVGVtcGxhdGVFbmdpbmVUZXN0LmphdmEKQEAgLTAsMCArMSwzMCBAQAorcGFja2FnZSBncm9vdnkudGV4dDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK3B1YmxpYyBjbGFzcyBYbWxUZW1wbGF0ZUVuZ2luZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmluZGluZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBNYXAgYmluZGluZyA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIGJpbmRpbmcucHV0KCJDaHJpc3RpYW4iLCAiU3RlaW4iKTsKKworICAgICAgICBYbWxUZW1wbGF0ZUVuZ2luZSB4bWxUZW1wbGF0ZUVuZ2luZSA9IG5ldyBYbWxUZW1wbGF0ZUVuZ2luZSgpOworICAgICAgICBTdHJpbmcgeG1sU2NyaXB0ID0gIjwhLS0gSnVzdCBhIGNvbW1lbnQuIC0tPlxuIiAvLworICAgICAgICAgICAgICAgICsgIjx4bWwgeG1sbnM6Z3NwPVwiaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvMjAwNS9nc3BcIj4iIC8vCisgICAgICAgICAgICAgICAgKyAiICAke0NocmlzdGlhbn0iIC8vCisgICAgICAgICAgICAgICAgKyAiICA8Z3NwOmV4cHJlc3Npb24+Q2hyaXN0aWFuPC9nc3A6ZXhwcmVzc2lvbj4iIC8vCisgICAgICAgICAgICAgICAgKyAiICA8Z3NwOnNjcmlwdGxldD5wcmludGxuIENocmlzdGlhbjwvZ3NwOnNjcmlwdGxldD4iIC8vCisgICAgICAgICAgICAgICAgKyAiPC94bWw+IjsKKyAgICAgICAgU3RyaW5nIHhtbFJlc3VsdCA9ICI8eG1sPlxuIiAvLworICAgICAgICAgICAgICAgICsgIiAgU3RlaW5cbiIgLy8KKyAgICAgICAgICAgICAgICArIHhtbFRlbXBsYXRlRW5naW5lLmdldEluZGVudGF0aW9uKCkgKyAiU3RlaW5cbiIgLy8KKyAgICAgICAgICAgICAgICArICJTdGVpbiIgKyBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIikgLy8KKyAgICAgICAgICAgICAgICArICI8L3htbD5cbiI7CisgICAgICAgIFRlbXBsYXRlIHRlbXBsYXRlID0geG1sVGVtcGxhdGVFbmdpbmUuY3JlYXRlVGVtcGxhdGUoeG1sU2NyaXB0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHhtbFJlc3VsdCwgdGVtcGxhdGUubWFrZShiaW5kaW5nKS50b1N0cmluZygpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvdGltZS9EdXJhdGlvblRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS90aW1lL0R1cmF0aW9uVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI5YzU4ZQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvdGltZS9EdXJhdGlvblRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsNTIgQEAKK3BhY2thZ2UgZ3Jvb3Z5LnRpbWUKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5UaW1lQ2F0ZWdvcnkKKworY2xhc3MgRHVyYXRpb25UZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworICAgIHZvaWQgdGVzdEZpeGVkRHVyYXRpb25Bcml0aG1ldGljKCkgeworICAgICAgICB1c2UoVGltZUNhdGVnb3J5KSB7CisgICAgICAgICAgICBkZWYgb25lRGF5ID0gMi5kYXlzIC0gMS5kYXkKKyAgICAgICAgICAgIGFzc2VydCBvbmVEYXkudG9NaWxsaXNlY29uZHMoKSA9PSAoMjQgKiA2MCAqIDYwICogMTAwMCk6IFwKKyAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgJHsyNCAqIDYwICogNjAgKiAxMDAwfSBidXQgd2FzICR7b25lRGF5LnRvTWlsbGlzZWNvbmRzKCl9IgorICAgICAgICAgICAgCisgICAgICAgICAgICBvbmVEYXkgPSAyLmRheXMgLSAxLmRheSArIDI0LmhvdXJzIC0gMTQ0MC5taW51dGVzCisgICAgICAgICAgICBhc3NlcnQgb25lRGF5LnRvTWlsbGlzZWNvbmRzKCkgPT0gKDI0ICogNjAgKiA2MCAqIDEwMDApOiBcCisgICAgICAgICAgICAgICAgIkV4cGVjdGVkICR7MjQgKiA2MCAqIDYwICogMTAwMH0gYnV0IHdhcyAke29uZURheS50b01pbGxpc2Vjb25kcygpfSIKKyAgICAgICAgfQorICAgfQorCisgICAgdm9pZCBmaXhtZV90ZXN0RHVyYXRpb25Bcml0aG1ldGljKCkgeworICAgICAgICB1c2UoVGltZUNhdGVnb3J5KSB7CisgICAgICAgICAgICAvL2RlZiBub3dPZmZzZXQgPSAobmV3IERhdGUoKSkuZGF5bGlnaHRTYXZpbmdzT2Zmc2V0CisgICAgICAgICAgICBkZWYgbm93T2Zmc2V0ID0gMC5tb250aHMuZnJvbS5ub3cuZGF5bGlnaHRTYXZpbmdzT2Zmc2V0CisKKyAgICAgICAgICAgIC8vIGFkZCB0d28gZHVyYXRpb25zCisgICAgICAgICAgICBkZWYgdHdvTW9udGhzQSA9IDEubW9udGggKyAxLm1vbnRoCisgICAgICAgICAgICBkZWYgb2Zmc2V0QSA9IHR3b01vbnRoc0EuZGF5bGlnaHRTYXZpbmdzT2Zmc2V0IC0gbm93T2Zmc2V0CisgICAgICAgICAgICAvLyBzdWJ0cmFjdCBkYXRlcyB3aGljaCBhcmUgdHdvIG1vbnRocyBhcGFydAorICAgICAgICAgICAgZGVmIG9mZnNldEIgPSAyLm1vbnRocy5mcm9tLm5vdy5kYXlsaWdodFNhdmluZ3NPZmZzZXQgLSAwLm1vbnRocy5mcm9tLm5vdy5kYXlsaWdodFNhdmluZ3NPZmZzZXQKKyAgICAgICAgICAgIGRlZiB0d29Nb250aHNCID0gMi5tb250aHMuZnJvbS5ub3cgKyBvZmZzZXRCIC0gMC5tb250aHMuZnJvbS5ub3cKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyAiVHdvIG1vbnRocyBhYnNvbHV0ZSBkdXJhdGlvbiBzaG91bGQgYmUgdGhlIHNhbWUgYXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gZGF0ZXMgdHdvIG1vbnRocyBhcGFydFxuIiwKKyAgICAgICAgICAgICAgICAodHdvTW9udGhzQSArIG9mZnNldEEpLnRvTWlsbGlzZWNvbmRzKCksIHR3b01vbnRoc0IudG9NaWxsaXNlY29uZHMoKQorCisgICAgICAgICAgICAvLyBhZGQgdHdvIGR1cmF0aW9ucworICAgICAgICAgICAgZGVmIG1vbnRoQW5kV2Vla0EgPSAxLm1vbnRoICsgMS53ZWVrCisgICAgICAgICAgICBvZmZzZXRBID0gbW9udGhBbmRXZWVrQS5kYXlsaWdodFNhdmluZ3NPZmZzZXQgLSBub3dPZmZzZXQKKyAgICAgICAgICAgIC8vIHN1YnRyYWN0IGFic29sdXRlIGRhdGUgYW5kIGEgZHVyYXRpb24gZnJvbSBhbm90aGVyIGFic29sdXRlIGRhdGUKKyAgICAgICAgICAgIG9mZnNldEIgPSAoMS5tb250aC5mcm9tLm5vdyArIDEud2VlaykuZGF5bGlnaHRTYXZpbmdzT2Zmc2V0IC0gMC5tb250aHMuZnJvbS5ub3cuZGF5bGlnaHRTYXZpbmdzT2Zmc2V0CisgICAgICAgICAgICBkZWYgbW9udGhBbmRXZWVrQiA9IDEubW9udGguZnJvbS5ub3cgKyAxLndlZWsgKyBvZmZzZXRCIC0gMC5tb250aHMuZnJvbS5ub3cKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyAiQSB3ZWVrIGFuZCBhIG1vbnRoIGFic29sdXRlIGR1cmF0aW9uIHNob3VsZCBiZSB0aGUgc2FtZSBhcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBkYXRlcyB0aGF0IGZhciBhcGFydFxuIiwKKyAgICAgICAgICAgICAgICAobW9udGhBbmRXZWVrQSArIG9mZnNldEEpLnRvTWlsbGlzZWNvbmRzKCksIG1vbnRoQW5kV2Vla0IudG9NaWxsaXNlY29uZHMoKQorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCB0ZXN0RGF0dW1EZXBlbmRhbnRBcml0aG1ldGljKCkgeworICAgICAgICB1c2UoVGltZUNhdGVnb3J5KSB7CisgICAgICAgICAgICBkZWYgc3RhcnQgPSBuZXcgRGF0ZSg5NjE1NTIwODAwMDApCisgICAgICAgICAgICBkZWYgdGhlbiA9IChzdGFydCArIDEubW9udGgpICsgMS53ZWVrCisgICAgICAgICAgICBkZWYgd2VlayA9IHRoZW4gLSAoc3RhcnQgKyAxLm1vbnRoKQorICAgICAgICAgICAgYXNzZXJ0IHdlZWsudG9NaWxsaXNlY29uZHMoKSA9PSAoNyAqIDI0ICogNjAgKiA2MCAqIDEwMDApOiBcCisgICAgICAgICAgICAgICAgIkV4cGVjdGVkICR7NyAqIDI0ICogNjAgKiA2MCAqIDEwMDB9IGJ1dCB3YXMgJHt3ZWVrLnRvTWlsbGlzZWNvbmRzKCl9IgorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS90cmVlL0Nsb3N1cmVDbGFzc0xvYWRlckJ1Zy5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3RyZWUvQ2xvc3VyZUNsYXNzTG9hZGVyQnVnLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWViYTUxCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS90cmVlL0Nsb3N1cmVDbGFzc0xvYWRlckJ1Zy5ncm9vdnkKQEAgLTAsMCArMSwxNiBAQAorcGFja2FnZSBncm9vdnkudHJlZQorCitjbGFzcyBDbG9zdXJlQ2xhc3NMb2FkZXJCdWcgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisgICAgZGVmIGIKKyAgICBkZWYgRVhQRUNURUQgPSAncm9vdDFbYXR0cmlidXRlcz17fTsgdmFsdWU9W2VsZW0xW2F0dHJpYnV0ZXM9e307IHZhbHVlPWhlbGxvMV1dXScKKworICAgIHZvaWQgdGVzdFRyZWUoKSB7CisgICAgICAgIGIgPSBOb2RlQnVpbGRlci5uZXdJbnN0YW5jZSgpCisgICAgICAgIAorICAgICAgICBkZWYgcm9vdCA9IGIucm9vdDEoIHsKKyAgICAgICAgICAgIGIuZWxlbTEoJ2hlbGxvMScpCisgICAgICAgIH0pCisgICAgICAgIAorICAgICAgICBhc3NlcnQgRVhQRUNURUQgPT0gcm9vdC50b1N0cmluZygpCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvdHJlZS9OYXZpZ2F0aW9uVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3RyZWUvTmF2aWdhdGlvblRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNGVjNjYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3RyZWUvTmF2aWdhdGlvblRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsNDkgQEAKK3BhY2thZ2UgZ3Jvb3Z5LnRyZWUKKworLyoqCisgKiBTaW1wbGUgdGVzdCBvZiB0cmVlIHdhbGtpbmcKKyAqLworY2xhc3MgTmF2aWdhdGlvblRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisgICAgCisgICAgdm9pZCB0ZXN0RGVwdGhGaXJzdCgpIHsKKyAgICAgICAgZGVmIHRyZWUgPSBjcmVhdGVUcmVlKCkKKyAgICAgICAgCisgICAgICAgIGRlZiBuYW1lcyA9IHRyZWUuZGVwdGhGaXJzdCgpLmNvbGxlY3QgeyBpdC5uYW1lKCkgfQorICAgICAgICBkZWYgZXhwZWN0ZWQgPSBbJ2EnLCAnYjEnLCAnYjInLCAnYzEnLCAnYzInLCAnYjMnLCAnYjQnLCAnYzMnLCAnYzQnLCAnYjUnXQorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IG5hbWVzID09IGV4cGVjdGVkCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdEJyZWFkdGhGaXJzdCgpIHsKKyAgICAgICAgZGVmIHRyZWUgPSBjcmVhdGVUcmVlKCkKKyAgICAgICAgCisgICAgICAgIGRlZiBuYW1lcyA9IHRyZWUuYnJlYWR0aEZpcnN0KCkuY29sbGVjdCB7IGl0Lm5hbWUoKSB9CisgICAgICAgIGRlZiBleHBlY3RlZCA9IFsnYScsICdiMScsICdiMicsICdiMycsICdiNCcsICdiNScsICdjMScsICdjMicsICdjMycsICdjNCddCisgICAgICAgIAorICAgICAgICBhc3NlcnQgbmFtZXMgPT0gZXhwZWN0ZWQKKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIGRlZiBjcmVhdGVUcmVlKCkgeyAgICAgICAKKyAgICAgICAgZGVmIGIgPSBOb2RlQnVpbGRlci5uZXdJbnN0YW5jZSgpCisgICAgICAgIAorICAgICAgICBkZWYgcm9vdCA9IGIuYShhOjUsIGI6NykgeworICAgICAgICAgICAgYjEoKQorICAgICAgICAgICAgYjIgeworICAgICAgICAgICAgICAgIGMxKCkKKyAgICAgICAgICAgICAgICBjMigpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBiMygpCisgICAgICAgICAgICBiNCB7CisgICAgICAgICAgICAgICAgYzMoKQorICAgICAgICAgICAgICAgIGM0KCkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGI1KCkKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IHJvb3QgIT0gbnVsbAorICAgICAgICAKKyAgICAgICAgcHJpbnRsbihyb290KQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIHJvb3QKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3RyZWUvTmVzdGVkQ2xvc3VyZUJ1Z1Rlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS90cmVlL05lc3RlZENsb3N1cmVCdWdUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWQ5NTQzCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS90cmVlL05lc3RlZENsb3N1cmVCdWdUZXN0Lmdyb292eQpAQCAtMCwwICsxLDIxIEBACitwYWNrYWdlIGdyb292eS50cmVlCisKKy8qKgorICogVGVzdCBjYXNlIGZvciBhIGJ1ZyB3aXRoIG5lc3RlZCBjbG9zdXJlcworICovCitjbGFzcyBOZXN0ZWRDbG9zdXJlQnVnVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKyAgICBkZWYgYgorICAgIGRlZiBFWFBFQ1RFRCA9ICdyb290W2F0dHJpYnV0ZXM9e2E9eHl6fTsgdmFsdWU9W2NoaWxkW2F0dHJpYnV0ZXM9e307IHZhbHVlPVtncmFuZENoaWxkW2F0dHJpYnV0ZXM9e307IHZhbHVlPVtdXV1dXV0nCisKKyAgICB2b2lkIHRlc3ROZXN0ZWRDbG9zdXJlQnVnKCkgeworICAgICAgICBiID0gTm9kZUJ1aWxkZXIubmV3SW5zdGFuY2UoKQorICAgICAgICAKKyAgICAgICAgZGVmIHJvb3QgPSBiLnJvb3QoWydhJzoneHl6J10sIHsKKyAgICAgICAgICAgIGIuY2hpbGQoeworICAgICAgICAgICAgICAgIGIuZ3JhbmRDaGlsZCgpICAKKyAgICAgICAgICAgIH0pCisgICAgICAgIH0pCisKKyAgICAgICAgYXNzZXJ0IEVYUEVDVEVEID09IHJvb3QudG9TdHJpbmcoKQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3RyZWUvTm9kZVByaW50ZXJUZXN0LmphdmEgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3RyZWUvTm9kZVByaW50ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEzYzU1MwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvdHJlZS9Ob2RlUHJpbnRlclRlc3QuamF2YQpAQCAtMCwwICsxLDk0IEBACisvKgorICRJZCQKKworIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCisgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQKKyAgICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKKyAgICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCisgICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQorICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgorICAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKKyAgICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KKworIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCisgICAgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAorICAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCisKKyA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQorICAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLworCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUworIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAorIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKKyBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgKi8KKworcGFja2FnZSBncm9vdnkudHJlZTsKKworaW1wb3J0IGdyb292eS5sYW5nLkdyb292eU9iamVjdDsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuLlRlc3RTdXBwb3J0OworCitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvKioKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBOb2RlUHJpbnRlclRlc3QgZXh0ZW5kcyBUZXN0U3VwcG9ydCB7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJlZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBHcm9vdnlPYmplY3Qgb2JqZWN0ID0gY29tcGlsZSgic3JjL3Rlc3QvZ3Jvb3Z5L3RyZWUvVHJlZVRlc3QuZ3Jvb3Z5Iik7CisgICAgICAgIG9iamVjdC5pbnZva2VNZXRob2QoInRlc3RUcmVlIiwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFZlcmJvc2VUcmVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEdyb292eU9iamVjdCBvYmplY3QgPSBjb21waWxlKCJzcmMvdGVzdC9ncm9vdnkvdHJlZS9WZXJib3NlVHJlZVRlc3QuZ3Jvb3Z5Iik7CisgICAgICAgIG9iamVjdC5pbnZva2VNZXRob2QoInRlc3RUcmVlIiwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNtYWxsVHJlZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBHcm9vdnlPYmplY3Qgb2JqZWN0ID0gY29tcGlsZSgic3JjL3Rlc3QvZ3Jvb3Z5L3RyZWUvU21hbGxUcmVlVGVzdC5ncm9vdnkiKTsKKyAgICAgICAgb2JqZWN0Lmludm9rZU1ldGhvZCgidGVzdFRyZWUiLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGl0dGxlQ2xvc3VyZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBHcm9vdnlPYmplY3Qgb2JqZWN0ID0gY29tcGlsZSgic3JjL3Rlc3QvZ3Jvb3Z5L0xpdHRsZUNsb3N1cmVUZXN0Lmdyb292eSIpOworICAgICAgICBvYmplY3QuaW52b2tlTWV0aG9kKCJ0ZXN0Q2xvc3VyZSIsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRDbG9zdXJlQnVnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEdyb292eU9iamVjdCBvYmplY3QgPSBjb21waWxlKCJzcmMvdGVzdC9ncm9vdnkvdHJlZS9OZXN0ZWRDbG9zdXJlQnVnVGVzdC5ncm9vdnkiKTsKKyAgICAgICAgb2JqZWN0Lmludm9rZU1ldGhvZCgidGVzdE5lc3RlZENsb3N1cmVCdWciLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc3VyZUNsYXNzTG9hZGVyQnVnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEdyb292eU9iamVjdCBvYmplY3QgPSBjb21waWxlKCJzcmMvdGVzdC9ncm9vdnkvdHJlZS9DbG9zdXJlQ2xhc3NMb2FkZXJCdWcuZ3Jvb3Z5Iik7CisgICAgICAgIG9iamVjdC5pbnZva2VNZXRob2QoInRlc3RUcmVlIiwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExvZ2dpbmcoKSB7CisgICAgICAgIExvZ2dlciBsb2cgPSBMb2dnZXIuZ2V0TG9nZ2VyKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgbG9nLmluZm8oIkxvZ2dpbmcgdXNpbmcgSkRLIDEuNCBsb2dnaW5nIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS90cmVlL1NtYWxsVHJlZVRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS90cmVlL1NtYWxsVHJlZVRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NzUwY2UKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3RyZWUvU21hbGxUcmVlVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwxOCBAQAorcGFja2FnZSBncm9vdnkudHJlZQorCitjbGFzcyBTbWFsbFRyZWVUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworICAgIGRlZiBiCisgICAgZGVmIEVYUEVDVEVEID0gJ3Jvb3QxW2F0dHJpYnV0ZXM9e307IHZhbHVlPVtlbGVtMVthdHRyaWJ1dGVzPXt9OyB2YWx1ZT1oZWxsbzFdXV0nCisKKyAgICB2b2lkIHRlc3RUcmVlKCkgeworICAgICAgICBiID0gTm9kZUJ1aWxkZXIubmV3SW5zdGFuY2UoKQorICAgICAgICAKKyAgICAgICAgZGVmIHJvb3QgPSBiLnJvb3QxKCB7CisgICAgICAgICAgICBlbGVtMSgnaGVsbG8xJykKKyAgICAgICAgfSkKKyAgICAgICAgCisgICAgICAgIGFzc2VydCByb290ICE9IG51bGwKKyAgICAgICAgCisgICAgICAgIGFzc2VydCBFWFBFQ1RFRCA9PSByb290LnRvU3RyaW5nKCkKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS90cmVlL1RyZWVUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvdHJlZS9UcmVlVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhkZDZhMQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvdHJlZS9UcmVlVGVzdC5ncm9vdnkKQEAgLTAsMCArMSw3OSBAQAorcGFja2FnZSBncm9vdnkudHJlZQorCisvKioKKyAqIFRoaXMgdGVzdCB1c2VzIHRoZSBjb25jaXNlIEdyb292eU1hcmt1cCBzeW50YXggdG8gdGVzdCB0aGUgYnVpbGRpbmcgb2YgdHJlZXMKKyAqLworY2xhc3MgVHJlZVRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisgICAgCisgICAgdm9pZCB0ZXN0U21hbGxUcmVlKCkgeworICAgICAgICBkZWYgYiA9IE5vZGVCdWlsZGVyLm5ld0luc3RhbmNlKCkKKyAgICAgICAgCisgICAgICAgIGRlZiByb290ID0gYi5yb290MShhOjUsIGI6NykgeworICAgICAgICAgICAgZWxlbTEoJ2hlbGxvMScpCisgICAgICAgICAgICBlbGVtMignaGVsbG8yJykKKyAgICAgICAgICAgIGVsZW0zKHg6NykKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IHJvb3QgIT0gbnVsbAorICAgICAgICAKKyAgICAgICAgcHJpbnQocm9vdCkKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0VHJlZSgpIHsKKyAgICAgICAgZGVmIGIgPSBOb2RlQnVpbGRlci5uZXdJbnN0YW5jZSgpCisgICAgICAgIAorICAgICAgICBkZWYgcm9vdCA9IGIucm9vdDIoYTo1LCBiOjcpIHsKKyAgICAgICAgICAgIGVsZW0xKCdoZWxsbzEnKQorICAgICAgICAgICAgZWxlbTIoJ2hlbGxvMicpCisgICAgICAgICAgICBuZXN0ZWRFbGVtKHg6J2FiYycsIHk6J2RlZicpIHsKKyAgICAgICAgICAgICAgICBjaGlsZCh6OidkZWYnKQorICAgICAgICAgICAgICAgIGNoaWxkMigpICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgbmVzdGVkRWxlbTIoejonenp6JykgeworICAgICAgICAgICAgICAgIGNoaWxkKHo6J2RlZicpCisgICAgICAgICAgICAgICAgY2hpbGQyKCJoZWxsbyIpICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IHJvb3QgIT0gbnVsbAorICAgICAgICAKKyAgICAgICAgcHJpbnQocm9vdCkKKworICAgICAgICBkZWYgZTEgPSByb290LmVsZW0xLmdldCgwKQorICAgICAgICBhc3NlcnQgZTEudmFsdWUoKSA9PSAnaGVsbG8xJworICAgICAgICAKKyAgICAgICAgZGVmIGUyID0gcm9vdC5lbGVtMi5nZXQoMCkKKyAgICAgICAgYXNzZXJ0IGUyLnZhbHVlKCkgPT0gJ2hlbGxvMicKKworICAgICAgICBhc3NlcnQgcm9vdC5lbGVtMS5nZXQoMCkudmFsdWUoKSA9PSAnaGVsbG8xJworICAgICAgICBhc3NlcnQgcm9vdC5lbGVtMi5nZXQoMCkudmFsdWUoKSA9PSAnaGVsbG8yJworCisgICAgICAgIGFzc2VydCByb290Lm5lc3RlZEVsZW0uZ2V0KDApLmF0dHJpYnV0ZXMoKSA9PSBbJ3gnOidhYmMnLCAneSc6J2RlZiddICAgICAgICAKKyAgICAgICAgYXNzZXJ0IHJvb3QubmVzdGVkRWxlbS5jaGlsZC5nZXQoMCkuYXR0cmlidXRlcygpID09IFsneic6J2RlZiddCisgICAgICAgIAorICAgICAgICBhc3NlcnQgcm9vdC5uZXN0ZWRFbGVtLmNoaWxkMi5nZXQoMCkudmFsdWUoKSA9PSBbXQorICAgICAgICBhc3NlcnQgcm9vdC5uZXN0ZWRFbGVtLmNoaWxkMi5nZXQoMCkudGV4dCgpID09ICcnCisKKyAgICAgICAgYXNzZXJ0IHJvb3QubmVzdGVkRWxlbTIuZ2V0KDApLmF0dHJpYnV0ZXMoKSA9PSBbJ3onOid6enonXSAgICAgIAorICAgICAgICBhc3NlcnQgcm9vdC5uZXN0ZWRFbGVtMi5jaGlsZC5nZXQoMCkuYXR0cmlidXRlcygpID09IFsneic6J2RlZiddCisgICAgICAgIGFzc2VydCByb290Lm5lc3RlZEVsZW0yLmNoaWxkMi5nZXQoMCkudmFsdWUoKSA9PSAnaGVsbG8nCisgICAgICAgIGFzc2VydCByb290Lm5lc3RlZEVsZW0yLmNoaWxkMi5nZXQoMCkudGV4dCgpID09ICdoZWxsbycKKyAgICAgICAgCisgICAgICAgIGRlZiBsaXN0ID0gcm9vdC52YWx1ZSgpCisgICAgICAgIGFzc2VydCBsaXN0LnNpemUoKSA9PSA0CisKKyAgICAgICAgYXNzZXJ0IHJvb3QuYXR0cmlidXRlcygpLmEgPT0gNQorICAgICAgICBhc3NlcnQgcm9vdC5hdHRyaWJ1dGVzKCkuYiA9PSA3CisgICAgICAgIAorICAgICAgICBhc3NlcnQgcm9vdC5uZXN0ZWRFbGVtLmdldCgwKS5hdHRyaWJ1dGVzKCkueCA9PSAnYWJjJworICAgICAgICBhc3NlcnQgcm9vdC5uZXN0ZWRFbGVtLmdldCgwKS5hdHRyaWJ1dGVzKCkueSA9PSAnZGVmJworICAgICAgICBhc3NlcnQgcm9vdC5uZXN0ZWRFbGVtMi5nZXQoMCkuYXR0cmlidXRlcygpLnogPT0gJ3p6eicKKyAgICAgICAgYXNzZXJ0IHJvb3QubmVzdGVkRWxlbTIuY2hpbGQuZ2V0KDApLmF0dHJpYnV0ZXMoKS56ID09ICdkZWYnCisgICAgICAgIAorICAgICAgICAvKiogQHRvZG8gcGFyc2VyIGFkZCAuQCBhcyBhbiBvcGVyYXRpb24KKyAgICAgICAgICAgICAgICBhc3NlcnQgcm9vdC5AYSA9PSA1CisgICAgICAgICAgICAgICAgYXNzZXJ0IHJvb3QuQGIgPT0gNworICAgICAgICAqLyAgICAgICAgCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS90cmVlL1ZlcmJvc2VUcmVlVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3RyZWUvVmVyYm9zZVRyZWVUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDU0NTg5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS90cmVlL1ZlcmJvc2VUcmVlVGVzdC5ncm9vdnkKQEAgLTAsMCArMSw4MiBAQAorcGFja2FnZSBncm9vdnkudHJlZQorCisvKioKKyAqIFRoaXMgdGVzdCB1c2VzIHRoZSB2ZXJib3NlIHN5bnRheCB0byB0ZXN0IHRoZSBidWlsZGluZyBvZiB0cmVlcworICogdXNpbmcgR3Jvb3Z5TWFya3VwCisgKi8KK2NsYXNzIFZlcmJvc2VUcmVlVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKyAgICAKKyAgICBkZWYgYgorCisgICAgdm9pZCB0ZXN0U21hbGxUcmVlKCkgeworICAgICAgICBiID0gTm9kZUJ1aWxkZXIubmV3SW5zdGFuY2UoKQorICAgICAgICAKKyAgICAgICAgZGVmIHJvb3QgPSBiLnJvb3QxKFsnYSc6NSwgJ2InOjddLCB7CisgICAgICAgICAgICBlbGVtMSgnaGVsbG8xJykKKyAgICAgICAgICAgIGVsZW0yKCdoZWxsbzInKQorICAgICAgICAgICAgZWxlbTMoWyd4Jzo3XSkKKyAgICAgICAgfSkKKyAgICAgICAgCisgICAgICAgIGFzc2VydCByb290ICE9IG51bGwKKyAgICAgICAgCisgICAgICAgIHByaW50KHJvb3QpCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdFRyZWUoKSB7CisgICAgICAgIGIgPSBOb2RlQnVpbGRlci5uZXdJbnN0YW5jZSgpCisgICAgICAgIAorICAgICAgICBkZWYgcm9vdCA9IGIucm9vdDIoWydhJzo1LCAnYic6N10sIHsKKyAgICAgICAgICAgIGVsZW0xKCdoZWxsbzEnKQorICAgICAgICAgICAgZWxlbTIoJ2hlbGxvMicpCisgICAgICAgICAgICBuZXN0ZWRFbGVtKFsneCc6J2FiYycsICd5JzonZGVmJ10sIHsKKyAgICAgICAgICAgICAgICBjaGlsZChbJ3onOidkZWYnXSkKKyAgICAgICAgICAgICAgICBjaGlsZDIoKSAgCisgICAgICAgICAgICB9KQorICAgICAgICAgICAgCisgICAgICAgICAgICBuZXN0ZWRFbGVtMihbJ3onOid6enonXSwgeworICAgICAgICAgICAgICAgIGNoaWxkKFsneic6J2RlZiddKQorICAgICAgICAgICAgICAgIGNoaWxkMigiaGVsbG8iKSAgCisgICAgICAgICAgICB9KQorICAgICAgICB9KQorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IHJvb3QgIT0gbnVsbAorICAgICAgICAKKyAgICAgICAgcHJpbnQocm9vdCkKKworICAgICAgICBkZWYgZTEgPSByb290LmVsZW0xLmdldCgwKQorICAgICAgICBhc3NlcnQgZTEudmFsdWUoKSA9PSAnaGVsbG8xJworICAgICAgICAKKyAgICAgICAgZGVmIGUyID0gcm9vdC5lbGVtMi5nZXQoMCkKKyAgICAgICAgYXNzZXJ0IGUyLnZhbHVlKCkgPT0gJ2hlbGxvMicKKworICAgICAgICBhc3NlcnQgcm9vdC5lbGVtMS5nZXQoMCkudmFsdWUoKSA9PSAnaGVsbG8xJworICAgICAgICBhc3NlcnQgcm9vdC5lbGVtMi5nZXQoMCkudmFsdWUoKSA9PSAnaGVsbG8yJworCisgICAgICAgIGFzc2VydCByb290Lm5lc3RlZEVsZW0uZ2V0KDApLmF0dHJpYnV0ZXMoKSA9PSBbJ3gnOidhYmMnLCAneSc6J2RlZiddICAgICAgICAKKyAgICAgICAgYXNzZXJ0IHJvb3QubmVzdGVkRWxlbS5jaGlsZC5nZXQoMCkuYXR0cmlidXRlcygpID09IFsneic6J2RlZiddCisgICAgICAgIAorICAgICAgICBhc3NlcnQgcm9vdC5uZXN0ZWRFbGVtLmNoaWxkMi5nZXQoMCkudmFsdWUoKSA9PSBbXQorICAgICAgICBhc3NlcnQgcm9vdC5uZXN0ZWRFbGVtLmNoaWxkMi5nZXQoMCkudGV4dCgpID09ICcnCisKKyAgICAgICAgYXNzZXJ0IHJvb3QubmVzdGVkRWxlbTIuZ2V0KDApLmF0dHJpYnV0ZXMoKSA9PSBbJ3onOid6enonXSAgICAgIAorICAgICAgICBhc3NlcnQgcm9vdC5uZXN0ZWRFbGVtMi5jaGlsZC5nZXQoMCkuYXR0cmlidXRlcygpID09IFsneic6J2RlZiddCisgICAgICAgIGFzc2VydCByb290Lm5lc3RlZEVsZW0yLmNoaWxkMi5nZXQoMCkudmFsdWUoKSA9PSAnaGVsbG8nCisgICAgICAgIGFzc2VydCByb290Lm5lc3RlZEVsZW0yLmNoaWxkMi5nZXQoMCkudGV4dCgpID09ICdoZWxsbycKKyAgICAgICAgCisgICAgICAgIGRlZiBsaXN0ID0gcm9vdC52YWx1ZSgpCisgICAgICAgIGFzc2VydCBsaXN0LnNpemUoKSA9PSA0CisKKyAgICAgICAgYXNzZXJ0IHJvb3QuYXR0cmlidXRlcygpLmEgPT0gNQorICAgICAgICBhc3NlcnQgcm9vdC5hdHRyaWJ1dGVzKCkuYiA9PSA3CisgICAgICAgIAorICAgICAgICBhc3NlcnQgcm9vdC5uZXN0ZWRFbGVtLmdldCgwKS5hdHRyaWJ1dGVzKCkueCA9PSAnYWJjJworICAgICAgICBhc3NlcnQgcm9vdC5uZXN0ZWRFbGVtLmdldCgwKS5hdHRyaWJ1dGVzKCkueSA9PSAnZGVmJworICAgICAgICBhc3NlcnQgcm9vdC5uZXN0ZWRFbGVtMi5nZXQoMCkuYXR0cmlidXRlcygpLnogPT0gJ3p6eicKKyAgICAgICAgYXNzZXJ0IHJvb3QubmVzdGVkRWxlbTIuY2hpbGQuZ2V0KDApLmF0dHJpYnV0ZXMoKS56ID09ICdkZWYnCisgICAgICAgIAorICAgICAgICAvKiogQHRvZG8gcGFyc2VyIGFkZCAuQCBhcyBhbiBvcGVyYXRpb24KKyAgICAgICAgICAgICAgICBhc3NlcnQgcm9vdC5AYSA9PSA1CisgICAgICAgICAgICAgICAgYXNzZXJ0IHJvb3QuQGIgPT0gNworICAgICAgICAqLyAgICAgICAgCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS90eG4vVHJhbnNhY3Rpb25CZWFuLmphdmEgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3R4bi9UcmFuc2FjdGlvbkJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGU1ZmFjCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS90eG4vVHJhbnNhY3Rpb25CZWFuLmphdmEKQEAgLTAsMCArMSwzNyBAQAorcGFja2FnZSBncm9vdnkudHhuOworCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuQ2xvc3VyZTsKKworLyoqCisgKiBAYXV0aG9yIEphbWVzIFN0cmFjaGFuCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBUcmFuc2FjdGlvbkJlYW4geworICAgIHByaXZhdGUgQ2xvc3VyZSBydW47CisgICAgcHJpdmF0ZSBDbG9zdXJlIG9uRXJyb3I7CisgICAgcHJpdmF0ZSBDbG9zdXJlIG9uU3VjY2VzczsKKworICAgIHB1YmxpYyBDbG9zdXJlIHJ1bigpIHsKKyAgICAgICAgcmV0dXJuIHJ1bjsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xvc3VyZSBvbkVycm9yKCkgeworICAgICAgICByZXR1cm4gb25FcnJvcjsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xvc3VyZSBvblN1Y2Nlc3MoKSB7CisgICAgICAgIHJldHVybiBvblN1Y2Nlc3M7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcnVuKENsb3N1cmUgcnVuKSB7CisgICAgICAgIHRoaXMucnVuID0gcnVuOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoQ2xvc3VyZSBvbkVycm9yKSB7CisgICAgICAgIHRoaXMub25FcnJvciA9IG9uRXJyb3I7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25TdWNjZXNzKENsb3N1cmUgb25TdWNjZXNzKSB7CisgICAgICAgIHRoaXMub25TdWNjZXNzID0gb25TdWNjZXNzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvdHhuL1RyYW5zYWN0aW9uQnVpbGRlci5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS90eG4vVHJhbnNhY3Rpb25CdWlsZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRhZDc0YwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvdHhuL1RyYW5zYWN0aW9uQnVpbGRlci5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKK3BhY2thZ2UgZ3Jvb3Z5LnR4bjsKKworaW1wb3J0IGdyb292eS5sYW5nLkNsb3N1cmU7CisKKy8qKgorICogQGF1dGhvciBKYW1lcyBTdHJhY2hhbgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgVHJhbnNhY3Rpb25CdWlsZGVyIHsKKyAgICBwdWJsaWMgdm9pZCB0cmFuc2FjdGlvbihDbG9zdXJlIGNsb3N1cmUpIHsKKyAgICAgICAgVHJhbnNhY3Rpb25CZWFuIGJlYW4gPSBuZXcgVHJhbnNhY3Rpb25CZWFuKCk7CisgICAgICAgIGNsb3N1cmUuc2V0RGVsZWdhdGUoYmVhbik7CisgICAgICAgIGNsb3N1cmUuY2FsbCh0aGlzKTsKKworICAgICAgICAvLyBsZXRzIGNhbGwgdGhlIGNsb3N1cmVzIG5vdworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlBlcmZvcm1pbmcgbm9ybWFsIHRyYW5zYWN0aW9uIik7CisgICAgICAgIGJlYW4ucnVuKCkuY2FsbCh0aGlzKTsKKyAgICAgICAgYmVhbi5vblN1Y2Nlc3MoKS5jYWxsKHRoaXMpOworCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUGVyZm9ybWluZyBlcnJvciB0cmFuc2FjdGlvbiIpOworICAgICAgICBiZWFuLnJ1bigpLmNhbGwodGhpcyk7CisgICAgICAgIGJlYW4ub25FcnJvcigpLmNhbGwodGhpcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS90eG4vVHJhbnNhY3Rpb25UZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvdHhuL1RyYW5zYWN0aW9uVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U1YjliNwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvdHhuL1RyYW5zYWN0aW9uVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwyMCBAQAorcGFja2FnZSBncm9vdnkudHhuCisKK2NsYXNzIFRyYW5zYWN0aW9uVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIHZvaWQgdGVzdFR4bigpIHsKKwkJZGVmIGJ1aWxkZXIgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyKCkKKwkJYnVpbGRlci50cmFuc2FjdGlvbiB7CisJCSAgICBydW4geworCQkgICAgICAgIHByaW50bG4oInJ1biBjb2RlISIpCisJCSAgICB9CisJCSAgICBvbkVycm9yIHsKKyAgICAgICAgICAgICAgICBwcmludGxuKCJvbiBlcnJvciEiKQorCQkgICAgfQorCQkgICAgb25TdWNjZXNzIHsKKyAgICAgICAgICAgICAgICBwcmludGxuKCJvbiBzdWNjZXNzISIpCisJCSAgICB9CisJCX0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvdWkvR3Jvb3Z5TWFpblRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS91aS9Hcm9vdnlNYWluVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE5MDMzNAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvdWkvR3Jvb3Z5TWFpblRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMzggQEAKK3BhY2thZ2UgZ3Jvb3Z5LnVpCisKK2NsYXNzIEdyb292eU1haW5UZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworICAgIHByaXZhdGUgYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKQorICAgIHByaXZhdGUgcHMgPSBuZXcgUHJpbnRTdHJlYW0oYmFvcykKKworICAgIHZvaWQgdGVzdEhlbHAoKSB7CisgICAgICAgIFN0cmluZ1tdIGFyZ3MgPSBbJy1oJ10KKyAgICAgICAgR3Jvb3Z5TWFpbi5wcm9jZXNzQXJncyhhcmdzLCBwcykKKyAgICAgICAgZGVmIG91dCA9IGJhb3MudG9TdHJpbmcoKQorICAgICAgICBhc3NlcnQgb3V0LmNvbnRhaW5zKCd1c2FnZTogZ3Jvb3Z5JykKKyAgICAgICAgWyctYScsICctYycsICctZCcsICctZScsICctaCcsICctaScsICctbCcsICctbicsICctcCcsICctdiddLmVhY2h7CisgICAgICAgICAgICBhc3NlcnQgb3V0LmNvbnRhaW5zKGl0KQorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCB0ZXN0VmVyc2lvbigpIHsKKyAgICAgICAgU3RyaW5nW10gYXJncyA9IFsnLXYnXQorICAgICAgICBHcm9vdnlNYWluLnByb2Nlc3NBcmdzKGFyZ3MsIHBzKQorICAgICAgICBkZWYgb3V0ID0gYmFvcy50b1N0cmluZygpCisgICAgICAgIGFzc2VydCBvdXQuY29udGFpbnMoJ0dyb292eSBWZXJzaW9uOicpCisgICAgICAgIGFzc2VydCBvdXQuY29udGFpbnMoJ0pWTTonKQorICAgIH0KKworICAgIHZvaWQgdGVzdE5vQXJncygpIHsKKyAgICAgICAgU3RyaW5nW10gYXJncyA9IFtdCisgICAgICAgIEdyb292eU1haW4ucHJvY2Vzc0FyZ3MoYXJncywgcHMpCisgICAgICAgIGRlZiBvdXQgPSBiYW9zLnRvU3RyaW5nKCkKKyAgICAgICAgYXNzZXJ0IG91dC5jb250YWlucygnZXJyb3I6IG5laXRoZXIgLWUgb3IgZmlsZW5hbWUgcHJvdmlkZWQnKQorICAgIH0KKworICAgIHZvaWQgdGVzdEF0dGVtcHRUb1J1bkphdmFGaWxlKCkgeworICAgICAgICBTdHJpbmdbXSBhcmdzID0gWydhYmMuamF2YSddCisgICAgICAgIEdyb292eU1haW4ucHJvY2Vzc0FyZ3MoYXJncywgcHMpCisgICAgICAgIGRlZiBvdXQgPSBiYW9zLnRvU3RyaW5nKCkKKyAgICAgICAgYXNzZXJ0IG91dC5jb250YWlucygnZXJyb3I6IGVycm9yOiBjYW5ub3QgY29tcGlsZSBmaWxlIHdpdGggLmphdmEgZXh0ZW5zaW9uOiBhYmMuamF2YScpCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvdXRpbC9BbGxUZXN0U3VpdGVUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvdXRpbC9BbGxUZXN0U3VpdGVUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmY2ZmIxCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS91dGlsL0FsbFRlc3RTdWl0ZVRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsNTMgQEAKK3BhY2thZ2UgZ3Jvb3Z5LnV0aWwKKworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3QKKworLyoqCisgICAgVGVzdGluZyBncm9vdnkudXRpbC5BbGxUZXN0U3VpdGUuCisgICAgVGhlIHN1aXRlKCkgbWV0aG9kIG11c3QgcHJvcGVybHkgY29sbGVjdCBUZXN0IGZpbGVzIHVuZGVyIHRoZSBnaXZlbiBkaXIgYW5kIHBhdHRlcm4sCisgICAgYWRkIGZvdW5kIGZpbGVzIHRvIHRoZSBsb2csCisgICAgcHJvZHVjZSBhIHByb3BlciBUZXN0U3VpdGUsCisgICAgYW5kIHdyYXAgU2NyaXB0cyBpbnRvIFRlc3RDYXNlcy4KKyAgICBAYXV0aG9yIERpZXJrIEtvZW5pZworKi8KK2NsYXNzIEFsbFRlc3RTdWl0ZVRlc3QgZXh0ZW5kcyBHcm9vdnlMb2dUZXN0Q2FzZSB7CisKKyAgICBkZWYgc3VpdGUKKworICAgIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIHN1aXRlID0gbnVsbAorICAgIH0KKworICAgIHZvaWQgdGVzdFN1aXRlRm9yVGhpc0ZpbGVPbmx5KCkgeworICAgICAgICBkZWYgcmVzdWx0ID0gc3RyaW5nTG9nKExldmVsLkZJTkVTVCwgJ2dyb292eS51dGlsLkFsbFRlc3RTdWl0ZScpIHsKKyAgICAgICAgICAgIHdpdGhQcm9wcygnc3JjL3Rlc3QvZ3Jvb3Z5L3V0aWwnLCdBbGxUZXN0U3VpdGVUZXN0Lmdyb292eScpIHsKKyAgICAgICAgICAgICAgICBzdWl0ZSA9IEFsbFRlc3RTdWl0ZS5zdWl0ZSgpCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZSByZXN1bHQsIHJlc3VsdC5jb250YWlucygnQWxsVGVzdFN1aXRlVGVzdC5ncm9vdnknKQorICAgICAgICBhc3NlcnRFcXVhbHMgMSsxLCByZXN1bHQuY291bnQoIlxuIikgICAvLyBvbmx5IG9uZSBlbnRyeSBpbiB0aGUgbG9nCisgICAgICAgIGFzc2VydCBzdWl0ZSwgJ1Jlc3VsdGluZyBzdWl0ZSBzaG91bGQgbm90IGJlIG51bGwnCisgICAgICAgIGFzc2VydEVxdWFscyAyLCBzdWl0ZS5jb3VudFRlc3RDYXNlcygpIC8vIHRoZSAyIHRlc3QgbWV0aG9kcyBpbiB0aGlzIGZpbGUKKyAgICB9CisKKyAgICB2b2lkIHRlc3RBZGRpbmdTY3JpcHRzVGhhdERvTm90SW5oZXJpdEZyb21UZXN0Q2FzZSgpIHsKKyAgICAgICAgd2l0aFByb3BzKCdzcmMvdGVzdC9ncm9vdnkvdXRpbCcsJ3N1aXRlLyouZ3Jvb3Z5JykgeworICAgICAgICAgICAgc3VpdGUgPSBBbGxUZXN0U3VpdGUuc3VpdGUoKQorICAgICAgICB9CisgICAgICAgIGFzc2VydCBzdWl0ZQorICAgICAgICBhc3NlcnRFcXVhbHMgMSwgc3VpdGUuY291bnRUZXN0Q2FzZXMoKQorICAgICAgICBzdWl0ZS50ZXN0QXQoMCkgLy8gY2FsbCB0aGUgY29udGFpbmVkIFNjcmlwdCB0byBtYWtlcyBzdXJlIGl0IGlzIHRlc3RhYmxlCisgICAgfQorCisgICAgLyoqIHN0b3JlIG9sZCBTeXN0ZW0gcHJvcGVydHkgdmFsdWVzIGZvciBub3Qgb3ZlcnJpZGluZyB0aGVtIGFjY2lkZW50YWxseSAqLworICAgIHZvaWQgd2l0aFByb3BzKGRpciwgcGF0dGVybiwgeWllbGQpIHsKKyAgICAgICAgU3RyaW5nIG9sZGRpciA9IFN5c3RlbS5wcm9wZXJ0aWVzLidncm9vdnkudGVzdC5kaXInCisgICAgICAgIFN0cmluZyBvbGRwYXQgPSBTeXN0ZW0ucHJvcGVydGllcy4nZ3Jvb3Z5LnRlc3QucGF0dGVybicKKyAgICAgICAgU3lzdGVtLnByb3BlcnRpZXMuJ2dyb292eS50ZXN0LmRpcicgPSBkaXIKKyAgICAgICAgU3lzdGVtLnByb3BlcnRpZXMuJ2dyb292eS50ZXN0LnBhdHRlcm4nID0gcGF0dGVybgorICAgICAgICB5aWVsZCgpCisgICAgICAgIGlmIChvbGRkaXIpIFN5c3RlbS5wcm9wZXJ0aWVzLidncm9vdnkudGVzdC5kaXInID0gb2xkZGlyCisgICAgICAgIGlmIChvbGRwYXQpIFN5c3RlbS5wcm9wZXJ0aWVzLidncm9vdnkudGVzdC5wYXR0ZXJuJyA9IG9sZHBhdAorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3V0aWwvQW50VGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3V0aWwvQW50VGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YwMWRkMwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvdXRpbC9BbnRUZXN0Lmdyb292eQpAQCAtMCwwICsxLDIzOCBAQAorcGFja2FnZSBncm9vdnkudXRpbAorCitpbXBvcnQgamF2YS5pby5GaWxlCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFdmVudAoraW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3QKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0SGVscGVyCitpbXBvcnQgZ3Jvb3Z5LnhtbC5OYW1lc3BhY2VCdWlsZGVyCisKKy8qKgorVGVzdHMgZm9yIHRoZSA8Z3Jvb3Z5PiB0YXNrLgorQEF1dGhvciBVbmtub3duCitAQXV0aG9yIE1hcmMgR3VpbGxlbW90CisqLworY2xhc3MgQW50VGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKyAgICAKKyAgICB2b2lkIHRlc3RBbnQoKSB7CisgICAgCWRlZiBhbnQgPSBuZXcgQW50QnVpbGRlcigpCisKKyAgICAgICAgLy8gbGV0cyBqdXN0IGNhbGwgb25lIHRhc2sKKyAgICAgICAgYW50LmVjaG8oImhlbGxvIikKKyAgICAgICAgCisgICAgICAgIC8vIGhlcmUicyBhbiBleGFtcGxlIG9mIGEgYmxvY2sgb2YgQW50IGluc2lkZSBHcm9vdnlNYXJrdXAKKyAgICAgICAgYW50LnNlcXVlbnRpYWwgeworICAgICAgICAgICAgZWNobygiaW5zaWRlIHNlcXVlbnRpYWwiKQorICAgICAgICAgICAgCisgICAgICAgICAgICBkZWYgbXlEaXIgPSAidGFyZ2V0L0FudFRlc3QvIgorICAgICAgICAgICAgCisgICAgICAgICAgICBta2RpcihkaXI6bXlEaXIpIAorICAgICAgICAgICAgY29weSh0b2RpcjpteURpcikgeworICAgICAgICAgICAgICAgIGZpbGVzZXQoZGlyOiJzcmMvdGVzdCIpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5jbHVkZShuYW1lOiIqKi8qLmdyb292eSIpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBlY2hvKCJkb25lIikKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gbm93IGxldHMgZG8gc29tZSBub3JtYWwgR3Jvb3Z5IGFnYWluCisgICAgICAgIGRlZiBmaWxlID0gbmV3IEZpbGUoInRhcmdldC9BbnRUZXN0L2dyb292eS91dGlsL0FudFRlc3QuZ3Jvb3Z5IikKKyAgICAgICAgYXNzZXJ0IGZpbGUuZXhpc3RzKCkKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0RmlsZUl0ZXJhdGlvbigpIHsKKyAgICAgICAgZGVmIGFudCA9IG5ldyBBbnRCdWlsZGVyKCkKKyAgICAgICAgCisgICAgICAgIC8vIGxldHMgY3JlYXRlIGEgc2Nhbm5lciBvZiBmaWxlc2V0cworICAgICAgICBkZWYgc2Nhbm5lciA9IGFudC5maWxlU2Nhbm5lciB7CisgICAgICAgICAgICBmaWxlc2V0KGRpcjoic3JjL3Rlc3QiKSB7CisgICAgICAgICAgICAgICAgaW5jbHVkZShuYW1lOiIqKi9BbnQqLmdyb292eSIpCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIG5vdyBsZXRzIGl0ZXJhdGUgb3ZlciAKKyAgICAgICAgZGVmIGZvdW5kID0gZmFsc2UKKyAgICAgICAgZm9yIChmIGluIHNjYW5uZXIpIHsKKyAgICAgICAgICAgIHByaW50bG4oIkZvdW5kIGZpbGUgJHtmfSIpCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZvdW5kID0gdHJ1ZQorICAgICAgICAgICAgCisgICAgICAgICAgICBhc3NlcnQgZiBpbnN0YW5jZW9mIEZpbGUKKyAgICAgICAgICAgIGFzc2VydCBmLm5hbWUuZW5kc1dpdGgoIi5ncm9vdnkiKQorICAgICAgICB9CisgICAgICAgIGFzc2VydCBmb3VuZAorICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RKdW5pdFRhc2soKSB7CisgICAgICAgIGRlZiBhbnQgPSBuZXcgQW50QnVpbGRlcigpCisgICAgICAgIAorICAgICAgICBhbnQuanVuaXQgeworICAgICAgICAgICAgdGVzdChuYW1lOidncm9vdnkudXRpbC5Tb21ldGhpbmdUaGF0RG9lc05vdEV4aXN0JykKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RQYXRoQnVpbGRpbmcoKSB7CisgICAgICAgIGRlZiBhbnQgPSBuZXcgQW50QnVpbGRlcigpCisgICAgICAgIAorICAgICAgICBkZWYgdmFsdWUgPSBhbnQucGF0aCB7CisgICAgICAgICAgICBmaWxlc2V0KGRpcjoieGRvY3MiKSB7CisgICAgICAgICAgICAgICAgaW5jbHVkZShuYW1lOiIqLndpa2kiKQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0IHZhbHVlICE9IG51bGwKKyAgICAgICAgYXNzZXJ0RXF1YWxzIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgsIHZhbHVlLmdldENsYXNzKCkKKyAgICB9CisKKyAgICB2b2lkIHRlc3RUYXNrQ29udGFpbmVyRXhlY3V0aW9uU2VxdWVuY2UoKSB7CisgICAgICAgIFNwb29mVGFza0NvbnRhaW5lci5nZXRTcG9vZigpLmxlbmd0aCA9IDAKKworICAgICAgICBkZWYgYW50RmlsZSA9IG5ldyBGaWxlKCJzcmMvdGVzdC9ncm9vdnkvdXRpbC9BbnRUZXN0LnhtbCIpCisgICAgICAgIGFzc2VydFRydWUgIkNvdWxkbid0IGZpbmQgYW50IHRlc3Qgc2NyaXB0IiwgYW50RmlsZS5leGlzdHMoKQorCisJCS8vIHJ1biBpdCB3aXRoIGFudCwgdG8gYmUgc3VyZSB0aGF0IG91ciBhc3N1bXB0aW9ucyBhcmUgY29ycmVjdAorCQlkZWYgcHJvamVjdCA9IG5ldyBQcm9qZWN0KCkKKwkJcHJvamVjdC5pbml0KCkKKwkJUHJvamVjdEhlbHBlci5wcm9qZWN0SGVscGVyLnBhcnNlKHByb2plY3QsIGFudEZpbGUpCisJCXByb2plY3QuZXhlY3V0ZVRhcmdldChwcm9qZWN0LmRlZmF1bHRUYXJnZXQpOworCQkKKyAgICAgICAgZGVmIGV4cGVjdGVkU3Bvb2YgPQorIiIiU3Bvb2ZUYXNrQ29udGFpbmVyIGN0b3IKK2luIGFkZFRhc2sKK2NvbmZpZ3VyaW5nIFVua25vd25FbGVtZW50CitTcG9vZlRhc2sgY3RvcgorYmVnaW4gU3Bvb2ZUYXNrQ29udGFpbmVyIGV4ZWN1dGUKK2JlZ2luIFNwb29mVGFzayBleGVjdXRlCit0YWcgbmFtZSBmcm9tIHdyYXBwZXI6IHNwb29mCithdHRyaWJ1dGVzIG1hcCBmcm9tIHdyYXBwZXI6IFsiZm9vIjoiMTIzIl0KK3BhcmFtIGZvbzogMTIzCitlbmQgU3Bvb2ZUYXNrIGV4ZWN1dGUKK2VuZCBTcG9vZlRhc2tDb250YWluZXIgZXhlY3V0ZQorIiIiCisJCXByaW50bG4gU3Bvb2ZUYXNrQ29udGFpbmVyLmdldFNwb29mKCkudG9TdHJpbmcoKQorICAgICAgICBhc3NlcnRFcXVhbHMgZXhwZWN0ZWRTcG9vZiwgU3Bvb2ZUYXNrQ29udGFpbmVyLmdldFNwb29mKCkudG9TdHJpbmcoKQorICAgICAgICBTcG9vZlRhc2tDb250YWluZXIuc3Bvb2YubGVuZ3RoID0gMAorCisgICAgICAgIGRlZiBhbnQgPSBuZXcgQW50QnVpbGRlcigpCisgICAgICAgIGRlZiBQQVRIID0gJ3Rhc2sucGF0aCcKKworCQkvLyBhbmQgbm93IHJ1biBpdCB3aXRoIHRoZSBBbnRCdWlsZGVyICAgICAgICAKKyAgICAgICAgYW50LnBhdGgoaWQ6UEFUSCkge2FudC5wYXRoZWxlbWVudChsb2NhdGlvbjonY2xhc3NlcycpfQorICAgICAgICBbJ3Nwb29mY29udGFpbmVyJzogU3Bvb2ZUYXNrQ29udGFpbmVyLCAnc3Bvb2YnOiBTcG9vZlRhc2tdLmVhY2h7IHBhaXIgLT4KKyAgICAgICAgICAgIGFudC50YXNrZGVmKG5hbWU6cGFpci5rZXksIGNsYXNzbmFtZTogcGFpci52YWx1ZS5uYW1lLCBjbGFzc3BhdGhyZWY6IFBBVEgpCisgICAgICAgIH0KKyAgICAgICAgYW50LnNwb29mY29udGFpbmVyKCl7CisgICAgICAgICAgICBhbnQuc3Bvb2YoZm9vOiAxMjMpCisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzIGV4cGVjdGVkU3Bvb2YsIFNwb29mVGFza0NvbnRhaW5lci5nZXRTcG9vZigpLnRvU3RyaW5nKCkKKyAgICAgICAgCisgICAgICAgIC8vIG5vdyBydW4gaXQgd2l0aCBBbnRCdWlsZGVyIHVzaW5nIE5hbWVzcGFjZXMgKHRlc3QgZm9yIEdST09WWS0xMDcwKQorICAgICAgICBkZWYgYW50TlMgPSBuZXcgQW50QnVpbGRlcigpCisgICAgICAgIFNwb29mVGFza0NvbnRhaW5lci5yZXNldFNwb29mKCkKKworCQkvLyBhbmQgbm93IHJ1biBpdCB3aXRoIHRoZSBBbnRCdWlsZGVyICAgICAgICAKKyAgICAgICAgYW50TlMucGF0aChpZDpQQVRIKSB7YW50TlMucGF0aGVsZW1lbnQobG9jYXRpb246J2NsYXNzZXMnKX0KKyAgICAgICAgWydzcG9vZmNvbnRhaW5lcic6IFNwb29mVGFza0NvbnRhaW5lciwgJ3Nwb29mJzogU3Bvb2ZUYXNrXS5lYWNoeyBwYWlyIC0+CisgICAgICAgICAgICBhbnROUy50YXNrZGVmKG5hbWU6cGFpci5rZXksIGNsYXNzbmFtZTogcGFpci52YWx1ZS5uYW1lLCBjbGFzc3BhdGhyZWY6IFBBVEgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICB1cmk6ICd0ZXN0TlMnKQorICAgICAgICB9CisJCWRlZiB0ZXN0TlMgPSBOYW1lc3BhY2VCdWlsZGVyLm5ld0luc3RhbmNlKGFudE5TLCJ0ZXN0TlMiLCJ0ZXN0TlNwcmVmaXgiKTsKKyAgICAgICAgdGVzdE5TLnNwb29mY29udGFpbmVyKCl7CisgICAgICAgICAgICB0ZXN0TlMuc3Bvb2YoZm9vOiAxMjMpCisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzIGV4cGVjdGVkU3Bvb2YsIFNwb29mVGFza0NvbnRhaW5lci5nZXRTcG9vZigpLnRvU3RyaW5nKCkKKyAgICB9CisKKyAgICAvKiogQ2hlY2tzIHRoYXQgd2UgY2FuIGFjY2VzcyBkeW5hbWljYWxseSAodGhyb3VnaCBBbnQncyBwcm9wZXJ0eSB0YXNrKSBkZWZpbmVkIHByb3BlcnRpZXMgaW4gR3Jvb3Z5IHNjcmlwdGxldHMgKi8KKyAgICB2b2lkIHRlc3REeW5hbWljUHJvcGVydGllcygpIHsKKyAgICAgICAgZGVmIGFudEJ1aWxkZXIgPSBuZXcgQW50QnVpbGRlcigpCisKKyAgICAgICAgYW50QnVpbGRlci5wcm9wZXJ0eShuYW1lOiAidGVzdFByb3AxIiwgdmFsdWU6ICJURVNUIDEiKQorICAgICAgICBhbnRCdWlsZGVyLnRhc2tkZWYobmFtZToiZ3Jvb3Z5IiwgY2xhc3NuYW1lOiJvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudC5Hcm9vdnkiKQorICAgICAgICBhbnRCdWlsZGVyLmdyb292eSgiIiIKKyAgICAgICAgICAgIGFudC5wcm9wZXJ0eShuYW1lOiAidGVzdFByb3AyIiwgdmFsdWU6ICJURVNUIDIiKQorCisgICAgICAgICAgICBhc3NlcnQgcHJvcGVydGllcy50ZXN0UHJvcDEgPT0gcHJvamVjdC5wcm9wZXJ0aWVzLnRlc3RQcm9wMQorICAgICAgICAgICAgYXNzZXJ0IHByb3BlcnRpZXMudGVzdFByb3AyID09IHByb2plY3QucHJvcGVydGllcy50ZXN0UHJvcDIKKyAgICAgICAgIiIiKQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAqIFRlc3QgYWNjZXNzIHRvIEFudEJ1aWxkZXIgcHJvcGVydGllcworICAgICovCisgICAgdm9pZCB0ZXN0QW50QnVpbGRlclByb3BlcnRpZXMoKSB7CisgICAgICAgIGRlZiBhbnQgPSBuZXcgQW50QnVpbGRlcigpCisgICAgICAgIAorICAgICAgICBhc3NlcnROdWxsIGFudC5wcm9qZWN0LnByb3BlcnRpZXMuJ215UHJvcCcKKyAgICAgICAgYW50LnByb3BlcnR5KG5hbWU6ICdteVByb3AnLCB2YWx1ZTogJ2JsYWJsYScpCisgICAgICAgIGFzc2VydEVxdWFscyAnYmxhYmxhJywgYW50LnByb2plY3QucHJvcGVydGllcy4nbXlQcm9wJworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAqIFRlc3RzIHRoYXQgdGhlIEFudEJ1aWxkZXIgY2FuIGhhbmRsZSBjb25kaXRpb25zIChjb25kaXRpb25zIGFyZW4ndCB0YXNrcykKKyAgICAqICh0ZXN0IGZvciBHUk9PVlktODI0KQorICAgICovCisgICAgdm9pZCB0ZXN0Q29uZGl0aW9uKCkgeworICAgICAgICBkZWYgYW50ID0gbmV3IEFudEJ1aWxkZXIoKQorICAgICAgICBhbnQuY29uZGl0aW9uKHByb3BlcnR5OiAiY29udGFpbnNIaSIpIHsKKyAgICAgICAgCWNvbnRhaW5zKFtzdHJpbmc6ICJoaSIsIHN1YnN0cmluZzogImhpIl0pCisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzICJ0cnVlIiwgYW50LnByb2plY3QucHJvcGVydGllc1siY29udGFpbnNIaSJdCisKKyAgICAgICAgYW50LmNvbmRpdGlvbihwcm9wZXJ0eTogImVxdWFsc0hpIiwgZWxzZTogImZhbHNlIikgeworICAgICAgICAJRXF1YWxzKFthcmcxOiAiaGkiLCBhcmcyOiAiYnllIl0pCisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzICJmYWxzZSIsIGFudC5wcm9qZWN0LnByb3BlcnRpZXNbImVxdWFsc0hpIl0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB0aGF0IHVzaW5nIHRoZSBBbnRCdWlsZGVyIHdpdGhpbiB0aGUgPGdyb292eT4gdGFzayBkb2Vzbid0IGNhdXNlIGRvdWJsZSBleGVjdXRpb24KKyAgICAgKiAodGVzdCBmb3IgR1JPT1ZZLTE2MDIpCisgICAgICovCisgICAgIHZvaWQgdGVzdEFudEJ1aWxkZXJXaXRoaW5Hcm9vdnlUYXNrKCkgeworICAgICAgICBkZWYgYW50RmlsZSA9IG5ldyBGaWxlKCJzcmMvdGVzdC9ncm9vdnkvdXRpbC9BbnRUZXN0LnhtbCIpCisgICAgICAgIGFzc2VydFRydWUgIkNvdWxkbid0IGZpbmQgYW50IHRlc3Qgc2NyaXB0IiwgYW50RmlsZS5leGlzdHMoKQorCisgICAgICAgIGRlZiBwcm9qZWN0ID0gbmV3IFByb2plY3QoKQorCQlwcm9qZWN0LmluaXQoKQorCQlQcm9qZWN0SGVscGVyLnByb2plY3RIZWxwZXIucGFyc2UocHJvamVjdCwgYW50RmlsZSkKKwkJCisJCWRlZiBjdXN0b21MaXN0ZW5lciA9IG5ldyBTaW1wbGVMaXN0ZW5lcigpCisgCQlwcm9qZWN0LmFkZEJ1aWxkTGlzdGVuZXIgY3VzdG9tTGlzdGVuZXIKKwkJCisJCXByb2plY3QuZXhlY3V0ZVRhcmdldCgidGVzdEFudEJ1aWxkZXJXaXRoaW5Hcm9vdnlUYXNrIik7CisgCQkKKwkJZGVmIGV4cGVjdGVkU3Bvb2YgPQorIiIic3RhcnRlZDogdGFza2RlZlsibmFtZSI6Imdyb292eSIsICJjbGFzc25hbWUiOiJvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudC5Hcm9vdnkiXQorZmluaXNoZWQ6IHRhc2tkZWZbIm5hbWUiOiJncm9vdnkiLCAiY2xhc3NuYW1lIjoib3JnLmNvZGVoYXVzLmdyb292eS5hbnQuR3Jvb3Z5Il0KK3N0YXJ0ZWQ6IGVjaG9bIm1lc3NhZ2UiOiJiZWZvcmUgZ3Jvb3Z5IHRhc2siXQorZmluaXNoZWQ6IGVjaG9bIm1lc3NhZ2UiOiJiZWZvcmUgZ3Jvb3Z5IHRhc2siXQorc3RhcnRlZDogZ3Jvb3Z5WzpdCitzdGFydGVkOiBlY2hvWyJtZXNzYWdlIjoiYW50IGJ1aWxkZXIgd2l0aGluIGdyb292eSB0YXNrIl0KK2ZpbmlzaGVkOiBlY2hvWyJtZXNzYWdlIjoiYW50IGJ1aWxkZXIgd2l0aGluIGdyb292eSB0YXNrIl0KK2ZpbmlzaGVkOiBncm9vdnlbOl0KK3N0YXJ0ZWQ6IGVjaG9bIm1lc3NhZ2UiOiJhZnRlciBncm9vdnkgdGFzayJdCitmaW5pc2hlZDogZWNob1sibWVzc2FnZSI6ImFmdGVyIGdyb292eSB0YXNrIl0KKyIiIgorCisgICAgICAgICBhc3NlcnRFcXVhbHMgZXhwZWN0ZWRTcG9vZiwgY3VzdG9tTGlzdGVuZXIuc3Bvb2YudG9TdHJpbmcoKQorICAgICB9Cit9CisKKworY2xhc3MgU2ltcGxlTGlzdGVuZXIgZXh0ZW5kcyBvcmcuYXBhY2hlLnRvb2xzLmFudC5EZWZhdWx0TG9nZ2VyCit7CisJZGVmIHNwb29mID0gbmV3IFN0cmluZ0J1ZmZlcigpCisJdm9pZCB0YXNrU3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KQorCXsKKwkJc3Bvb2YgPDwgInN0YXJ0ZWQ6ICIgKyBsb2dUYXNrKGV2ZW50LnRhc2spICsgIlxuIgorCX0KKwl2b2lkIHRhc2tGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KQorCXsKKwkJc3Bvb2YgPDwgImZpbmlzaGVkOiAiICsgbG9nVGFzayhldmVudC50YXNrKSArICJcbiIKKwl9CisJcHJpdmF0ZSBTdHJpbmcgbG9nVGFzayh0YXNrKQorCXsKKwkJdGFzay50YXNrTmFtZSArIHRhc2sud3JhcHBlci5hdHRyaWJ1dGVNYXAKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS91dGlsL0FudFRlc3QueG1sIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS91dGlsL0FudFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQxNzk1MzYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3V0aWwvQW50VGVzdC54bWwKQEAgLTAsMCArMSwyNyBAQAorPCEtLSAKK2RvZXMgZXhhY3RseSB0aGUgc2FtZSBhcyB0aGUgQW50QnVpbGRlciBpbiBBbnRUZXN0Li4uIGp1c3QgdG8gYmUgc3VyZSB0aGF0IGFudCBiZWhhdmVzIHRoZSBzYW1lCithcyB3aGF0IHdlIGV4cGVjdCBmcm9tIHRoZSBBbnRCdWlsZGVyCisgLS0+Cis8cHJvamVjdCBuYW1lPSJ0ZXN0IiBkZWZhdWx0PSJmdWxsIj4KKworICAgIDx0YXJnZXQgbmFtZT0iZnVsbCI+CisgICAgICAgIDxwYXRoIGlkPSJ0YXNrLnBhdGgiPgorICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJjbGFzc2VzIi8+CisgICAgICAgIDwvcGF0aD4KKyAgICAgICAgPHRhc2tkZWYgbmFtZT0ic3Bvb2Zjb250YWluZXIiIGNsYXNzbmFtZT0iZ3Jvb3Z5LnV0aWwuU3Bvb2ZUYXNrQ29udGFpbmVyIiBjbGFzc3BhdGhyZWY9InRhc2sucGF0aCIvPgorICAgICAgICA8dGFza2RlZiBuYW1lPSJzcG9vZiIgY2xhc3NuYW1lPSJncm9vdnkudXRpbC5TcG9vZlRhc2siIGNsYXNzcGF0aHJlZj0idGFzay5wYXRoIi8+CisKKyAgICAgICAgPHNwb29mY29udGFpbmVyPgorICAgICAgICAgICAgPHNwb29mIGZvbz0iMTIzIi8+CisgICAgICAgIDwvc3Bvb2Zjb250YWluZXI+CisgICAgPC90YXJnZXQ+CisJCisJPHRhcmdldCBuYW1lPSJ0ZXN0QW50QnVpbGRlcldpdGhpbkdyb292eVRhc2siIGRlc2NyaXB0aW9uPSJUZXN0IGZvciBHUk9PVlktMTYwMiI+CisJCTx0YXNrZGVmIG5hbWU9Imdyb292eSIgY2xhc3NuYW1lPSJvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudC5Hcm9vdnkiLz4KKwkJPGVjaG8gbWVzc2FnZT0iYmVmb3JlIGdyb292eSB0YXNrIi8+CisJCTxncm9vdnk+CisJCQlhbnQuZWNobyhtZXNzYWdlOiAnYW50IGJ1aWxkZXIgd2l0aGluIGdyb292eSB0YXNrJykKKwkJPC9ncm9vdnk+CisJCTxlY2hvIG1lc3NhZ2U9ImFmdGVyIGdyb292eSB0YXNrIi8+CisJPC90YXJnZXQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3V0aWwvQnVpbGRlclN1cHBvcnRUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvdXRpbC9CdWlsZGVyU3VwcG9ydFRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMzNkZGQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3V0aWwvQnVpbGRlclN1cHBvcnRUZXN0Lmdyb292eQpAQCAtMCwwICsxLDE4NSBAQAorcGFja2FnZSBncm9vdnkudXRpbAorCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuTWlzc2luZ01ldGhvZEV4Y2VwdGlvbgorCisvKioKKyAgICAgVGVzdGluZyBCdWlsZGVyU3VwcG9ydCBhbmQgcmV2ZWFsIGhvdyBjYWxsaW5nCisgICAgbWV0aG9kcyBvbiBpdCByZXN1bHQgaW4gaW1wbGVtZW50YXRpb24gY2FsbGJhY2tzLgorICAgIFVzaW5nIHRoZSBTcG9vZkJ1aWxkZXIgKHNlZSBiZWxvdykgdG8gY2FsbCBpdCBpbiB2YXJpb3VzIHdheXMKKyAgICBhbmQgYW5hbHl6ZSB0aGUgInNwb29mZWQiIGxvZ3MuCisgICAgVGhpcyBpcyBlc3BlY2lhbGx5IHVzZWZ1bCB3aGVuIGRlc2lnbmluZyBzdWJjbGFzc2VzIG9mIEJ1aWxkZXJTdXBwb3J0LgorICAgICBAYXV0aG9yIERpZXJrIEtvZW5pZworKiovCisKKworY2xhc3MgQnVpbGRlclN1cHBvcnRUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2V7CisgICAgdm9pZCB0ZXN0U2ltcGxlTm9kZSgpIHsKKyAgICAgICAgZGVmIGIgPSBuZXcgU3Bvb2ZCdWlsZGVyKCkKKyAgICAgICAgYXNzZXJ0IGIubG9nID09IFtdCisgICAgICAgIGRlZiBub2RlID0gYi5mb28oKQorICAgICAgICBhc3NlcnQgYi5sb2cgPT0gWyAgJ2NyZWF0ZV93aXRoX25hbWUnLCdmb28nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25vZGVfY29tcGxldGVkJyxudWxsLCBub2RlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdwb3N0X25vZGVfY29tcGxldGlvbicsbnVsbCwgbm9kZQorICAgICAgICAgICAgICAgICAgICAgICAgXQorICAgIH0KKworICAgIHZvaWQgdGVzdFNpbXBsZU5vZGVXaXRoVmFsdWUoKSB7CisgICAgICAgIGRlZiBiID0gbmV3IFNwb29mQnVpbGRlcigpCisgICAgICAgIGRlZiBub2RlID0gYi5mb28oJ3ZhbHVlJykKKyAgICAgICAgYXNzZXJ0IGIubG9nID09IFsgICdjcmVhdGVfd2l0aF9uYW1lX2FuZF92YWx1ZScsJ2ZvbycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnLCAnbm9kZV9jb21wbGV0ZWQnLG51bGwsbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdwb3N0X25vZGVfY29tcGxldGlvbicsbnVsbCwgbm9kZQorICAgICAgICAgICAgICAgICAgICAgICAgXQorICAgIH0KKworICAgIHZvaWQgdGVzdFNpbXBsZU5vZGVXaXRoT25lQXR0cmlidXRlKCkgeworICAgICAgICBkZWYgYiA9IG5ldyBTcG9vZkJ1aWxkZXIoKQorICAgICAgICBkZWYgbm9kZSA9IGIuZm9vKG5hbWU6J3ZhbHVlJykKKyAgICAgICAgYXNzZXJ0IGIubG9nID09IFsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdjcmVhdGVfd2l0aF9uYW1lX2FuZF9tYXAnLCdmb28nLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJywndmFsdWUnLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdub2RlX2NvbXBsZXRlZCcsbnVsbCwneCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAncG9zdF9ub2RlX2NvbXBsZXRpb24nLG51bGwsICd4JworICAgICAgICAgICAgICAgICAgICAgICAgXQorICAgIH0KKworICAgIHZvaWQgdGVzdFNpbXBsZU5vZGVXaXRoQ2xvc3VyZSgpIHsKKyAgICAgICAgZGVmIGIgPSBuZXcgU3Bvb2ZCdWlsZGVyKCkKKyAgICAgICAgYi5mb28oKXsKKyAgICAgICAgICAgIGIuYmFyKCkKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQgYi5sb2cgPT0gWworICAgICAgICAgICAgJ2NyZWF0ZV93aXRoX25hbWUnLCdmb28nLAorICAgICAgICAgICAgICAgICdjcmVhdGVfd2l0aF9uYW1lJywnYmFyJywKKyAgICAgICAgICAgICdzZXRfcGFyZW50JywgJ3gnLCAneCcsCisgICAgICAgICAgICAgICAgJ25vZGVfY29tcGxldGVkJywneCcsJ3gnLAorICAgICAgICAgICAgICAgICdwb3N0X25vZGVfY29tcGxldGlvbicsICd4JywgJ3gnLAorICAgICAgICAgICAgJ25vZGVfY29tcGxldGVkJyxudWxsLCd4JywKKyAgICAgICAgICAgICdwb3N0X25vZGVfY29tcGxldGlvbicsbnVsbCwgJ3gnCisgICAgICAgICAgICBdCisgICAgfQorCisgICAgdm9pZCB0ZXN0U2ltcGxlTm9kZVdpdGhPbmVBdHRyaWJ1dGVBbmRWYWx1ZSgpIHsKKyAgICAgICAgZGVmIGIgPSBuZXcgU3Bvb2ZCdWlsZGVyKCkKKyAgICAgICAgZGVmIG5vZGUgPSBiLmZvbyhiYXI6J2JheicsICd2YWx1ZScpCisgICAgICAgIGFzc2VydCBiLmxvZyA9PSBbCisgICAgICAgICAgICAgICAgICAgICAgICAgICdjcmVhdGVfd2l0aF9uYW1lX21hcF9hbmRfdmFsdWUnLCAnZm9vJywgJ2JhcicsICdiYXonLCd2YWx1ZScsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAnbm9kZV9jb21wbGV0ZWQnLG51bGwsbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Bvc3Rfbm9kZV9jb21wbGV0aW9uJyxudWxsLCBub2RlCisgICAgICAgICAgICAgICAgICAgICAgICBdCisgICAgfQorCisgICAgdm9pZCB0ZXN0U2ltcGxlTm9kZVdpdGhWYWx1ZUFuZE9uZUF0dHJpYnV0ZSgpIHsKKyAgICAgICAgZGVmIGIgPSBuZXcgU3Bvb2ZCdWlsZGVyKCkKKyAgICAgICAgZGVmIG5vZGUgPSBiLmZvbygndmFsdWUnLCBiYXI6J2JheicpCisgICAgICAgIGFzc2VydCBiLmxvZyA9PSBbCisgICAgICAgICAgICAgICAgICAgICAgICAgICdjcmVhdGVfd2l0aF9uYW1lX21hcF9hbmRfdmFsdWUnLCAnZm9vJywgJ2JhcicsICdiYXonLCd2YWx1ZScsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAnbm9kZV9jb21wbGV0ZWQnLG51bGwsbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Bvc3Rfbm9kZV9jb21wbGV0aW9uJyxudWxsLCBub2RlCisgICAgICAgICAgICAgICAgICAgICAgICBdCisgICAgfQorCisgICAgdm9pZCB0ZXN0U2ltcGxlTm9kZVdpdGhPbmVBdHRyaWJ1dGVBbmRWYWx1ZUFuZENsb3N1cmUoKSB7CisgICAgICAgIGRlZiBiID0gbmV3IFNwb29mQnVpbGRlcigpCisgICAgICAgIGRlZiBub2RlID0gYi5mb28oYmFyOidiYXonLCAndmFsdWUnKSB7IDEgfQorICAgICAgICBhc3NlcnQgYi5sb2cgPT0gWworICAgICAgICAgICAgICAgICAgICAgICAgICAnY3JlYXRlX3dpdGhfbmFtZV9tYXBfYW5kX3ZhbHVlJywgJ2ZvbycsICdiYXInLCAnYmF6JywndmFsdWUnLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ25vZGVfY29tcGxldGVkJyxudWxsLG5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICdwb3N0X25vZGVfY29tcGxldGlvbicsbnVsbCwgbm9kZQorICAgICAgICAgICAgICAgICAgICAgICAgXQorICAgIH0KKworICAgIHZvaWQgdGVzdFNpbXBsZU5vZGVXaXRoVmFsdWVBbmRPbmVBdHRyaWJ1dGVBbmRDbG9zdXJlKCkgeworICAgICAgICBkZWYgYiA9IG5ldyBTcG9vZkJ1aWxkZXIoKQorICAgICAgICBkZWYgbm9kZSA9IGIuZm9vKCd2YWx1ZScsIGJhcjonYmF6JykgeyAxIH0KKyAgICAgICAgYXNzZXJ0IGIubG9nID09IFsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NyZWF0ZV93aXRoX25hbWVfbWFwX2FuZF92YWx1ZScsICdmb28nLCAnYmFyJywgJ2JheicsJ3ZhbHVlJywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICdub2RlX2NvbXBsZXRlZCcsbnVsbCxub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAncG9zdF9ub2RlX2NvbXBsZXRpb24nLG51bGwsIG5vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIF0KKyAgICB9CisKKyAgICB2b2lkIHRlc3RTaW1wbGVOb2RlVHdvVmFsdWVzKCkgeworICAgICAgICBkZWYgYiA9IG5ldyBTcG9vZkJ1aWxkZXIoKQorICAgICAgICBzaG91bGRGYWlsKE1pc3NpbmdNZXRob2RFeGNlcHRpb24sIHtkZWYgbm9kZSA9IGIuZm9vKCdhcmcxJywgJ2FyZzInKX0pCisgICAgfQorCisgICAgdm9pZCB0ZXN0U2ltcGxlTm9kZVR3b1ZhbHVlc0Nsb3N1cmUoKSB7CisgICAgICAgIGRlZiBiID0gbmV3IFNwb29mQnVpbGRlcigpCisgICAgICAgIHNob3VsZEZhaWwoTWlzc2luZ01ldGhvZEV4Y2VwdGlvbiwge2RlZiBub2RlID0gYi5mb28oJ2FyZzEnLCAnYXJnMicpIHsgMSB9IH0pCisgICAgfQorCisgICAgdm9pZCB0ZXN0U2ltcGxlTm9kZVRocmVlVmFsdWVzKCkgeworICAgICAgICBkZWYgYiA9IG5ldyBTcG9vZkJ1aWxkZXIoKQorICAgICAgICBzaG91bGRGYWlsKE1pc3NpbmdNZXRob2RFeGNlcHRpb24sIHtkZWYgbm9kZSA9IGIuZm9vKCdhcmcxJywgJ2FyZzInLCAnYXJnMycpIH0pCisgICAgfQorCisgICAgdm9pZCB0ZXN0U2ltcGxlTm9kZUZvdXJWYWx1ZXMoKSB7CisgICAgICAgIGRlZiBiID0gbmV3IFNwb29mQnVpbGRlcigpCisgICAgICAgIHNob3VsZEZhaWwoTWlzc2luZ01ldGhvZEV4Y2VwdGlvbiwge2RlZiBub2RlID0gYi5mb28oJ2FyZzEnLCAnYXJnMicsICdhcmczJywgJ2FyZzQnKSB9KQorICAgIH0KKworICAgIHZvaWQgdGVzdE5lc3RlZE1ldGhvZENhbGxzUmVzb2x1dGlvbigpIHsKKyAgICAgICAgZGVmIGIgPSBuZXcgU3Bvb2ZCdWlsZGVyKCkKKyAgICAgICAgYi5vdXRlc3QgeworICAgICAgICAgICAgYi5vdXRlciB7CisgICAgICAgICAgICAgICAgbmVzdGVkQnVpbGRlckNhbGwoYikKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhc3NlcnQgYi5sb2cuY29udGFpbnMoJ2lubmVyJykgCisgICAgfQorCisgICAgdm9pZCBuZXN0ZWRCdWlsZGVyQ2FsbChidWlsZGVyKSB7CisgICAgICAgIGJ1aWxkZXIuaW5uZXIoKQorICAgIH0KK30KKworLyoqCisgICAgVGhlIFNwb29mQnVpbGRlciBpcyBhIHNhbXBsZSBpbnN0YW5jZSBvZiB0aGUgYWJzdHJhY3QgQnVpbGRlclN1cHBvcnQgY2xhc3MKKyAgICB0aGF0IGRvZXMgbm90aGluZyBidXQgbG9nZ2luZyBob3cgaXQgd2FzIGNhbGxlZCwgcmV0dXJuaW5nICd4JyBmb3IgZWFjaCBub2RlLgorKiovCitjbGFzcyBTcG9vZkJ1aWxkZXIgZXh0ZW5kcyBCdWlsZGVyU3VwcG9ydHsKKyAgICBkZWYgbG9nID0gW10KKyAgICAKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCwgT2JqZWN0IGNoaWxkKXsKKyAgICAgICAgbG9nIDw8ICJzZXRfcGFyZW50IgorICAgICAgICBsb2cgPDwgcGFyZW50CisgICAgICAgIGxvZyA8PCBjaGlsZAorICAgIH0KKyAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZU5vZGUoT2JqZWN0IG5hbWUpeworICAgICAgICBsb2cgPDwgJ2NyZWF0ZV93aXRoX25hbWUnCisgICAgICAgIGxvZyA8PCAgbmFtZQorICAgICAgICByZXR1cm4gJ3gnCisgICAgfQorICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlTm9kZShPYmplY3QgbmFtZSwgT2JqZWN0IHZhbHVlKXsKKyAgICAgICAgbG9nIDw8ICdjcmVhdGVfd2l0aF9uYW1lX2FuZF92YWx1ZScKKyAgICAgICAgbG9nIDw8IG5hbWUKKyAgICAgICAgbG9nIDw8IHZhbHVlCisgICAgICAgIHJldHVybiAneCcKKyAgICB9CisgICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVOb2RlKE9iamVjdCBuYW1lLCBNYXAgYXR0cmlidXRlcyl7CisgICAgICAgIGxvZyA8PCAnY3JlYXRlX3dpdGhfbmFtZV9hbmRfbWFwJworICAgICAgICBsb2cgPDwgbmFtZQorICAgICAgICBhdHRyaWJ1dGVzLmVhY2h7ZW50cnkgLT4gbG9nIDw8IGVudHJ5LmtleTsgbG9nIDw8IGVudHJ5LnZhbHVlfQorICAgICAgICByZXR1cm4gJ3gnCisgICAgfQorICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlTm9kZShPYmplY3QgbmFtZSwgTWFwIGF0dHJpYnV0ZXMsIE9iamVjdCB2YWx1ZSl7CisgICAgICAgIGxvZyA8PCAnY3JlYXRlX3dpdGhfbmFtZV9tYXBfYW5kX3ZhbHVlJworICAgICAgICBsb2cgPDwgbmFtZQorICAgICAgICBhdHRyaWJ1dGVzLmVhY2h7ZW50cnkgLT4gbG9nIDw8IGVudHJ5LmtleTsgbG9nIDw8IGVudHJ5LnZhbHVlfQorICAgICAgICBsb2cgPDwgdmFsdWUKKyAgICAgICAgcmV0dXJuICd4JworICAgIH0KKyAgICBwcm90ZWN0ZWQgdm9pZCBub2RlQ29tcGxldGVkKE9iamVjdCBwYXJlbnQsIE9iamVjdCBub2RlKSB7CisgICAgICAgIGxvZyA8PCAnbm9kZV9jb21wbGV0ZWQnCisgICAgICAgIGxvZyA8PCBwYXJlbnQKKyAgICAgICAgbG9nIDw8IG5vZGUKKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIE9iamVjdCBwb3N0Tm9kZUNvbXBsZXRpb24oT2JqZWN0IHBhcmVudCwgT2JqZWN0IG5vZGUpIHsKKyAgICAgICAgbG9nIDw8ICdwb3N0X25vZGVfY29tcGxldGlvbicKKyAgICAgICAgbG9nIDw8IHBhcmVudAorICAgICAgICBsb2cgPDwgbm9kZQorICAgICAgICBub2RlCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS91dGlsL0NsaUJ1aWxkZXJUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvdXRpbC9DbGlCdWlsZGVyVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE1YTA2NQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvdXRpbC9DbGlCdWlsZGVyVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwzODggQEAKKy8qCisgKiAgQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbgorICogIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcworICogIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICogIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQorICogIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBncm9vdnkudXRpbAorCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNsaS5HbnVQYXJzZXIKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY2xpLk9wdGlvbgoraW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jbGkuT3B0aW9uQnVpbGRlcgoraW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jbGkuUG9zaXhQYXJzZXIKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY2xpLkJhc2ljUGFyc2VyCisKKy8qKgorICogIFRlc3QgY2xhc3MgZm9yIHRoZSBDbGlCdWlsZGVyIC0tIGJ1dCB0aGVuIHRoYXQgaXMgb2J2aW91cyBmcm9tIHRoZSBuYW1lIDotKQorICoKKyAqICA8cD5UaGVyZSBhcHBlYXIgdG8gYmUgaXNzdWVzIHdoZW4gdXNpbmcgdGhlIDxjb2RlPlBvc2l4UGFyc2VyPC9jb2RlPiAmbmRhc2g7IHdoZW4gYW4gb3B0aW9uIHdpdGggYQorICogIHBhcmFtZXRlciBpcyBwYXNzZWQgdXNpbmcgYSBsb25nIGZvcm0gYW5kIGEgc2luZ2xlIGxldHRlciBwYXJhbWV0ZXIgb2Ygc29tZSBzb3J0IGhhcyBiZWVuIGRlY2xhcmVkICh0aGUKKyAqICBwcm9ibGVtIGRvZXMgbm90IG9jY3VyIGlmIG5vIHNpbmdsZSBsZXR0ZXIgb3B0aW9uIGhhcyBiZWVuIGRlY2xhcmVkKSB0aGVuIHRoZSB2YWx1ZSAiLS0iIGlzIHJldHVybmVkCisgKiAgaW5zdGVhZCBvZiB0aGUgb3B0aW9uIHBhcmFtZXRlciB2YWx1ZS4gIFRoaXMgcHJvYmxlbSBkb2VzIG5vdCBoYXBwZW4gdXNpbmcgdGhlCisgKiAgPGNvZGU+R251UGFyc2VyPC9jb2RlPi48L3A+CisgKgorICogIDxwPlRoZXJlIGFwcGVhcnMgdG8gYmUgYW4gaXNzdWUgd2l0aCA8Y29kZT5HbnVQYXJzZXI8L2NvZGU+ICZuZGFzaDsgaWYgb25seSBhIGxvbmcgb3B0aW9uIGlzIGRlZmluZWQKKyAqICB0aGVuIHRoZSB1c3VhbCBHcm9vdnkgc3ludGF4IGZvciBhY2Nlc3NpbmcgdGhlIG9wdGlvbiBmYWlscyB0byB3b3JrLiAgSXQgaXMgZmluZSBpZiBhIHNob3J0IG9wdGlvbiBvZgorICogIHNvbWUgc29ydCBpcyBkZWZpbmVkLiAgVGhpcyBtdXN0IGJlIGEgPGNvZGU+Q2xpQnVpbGRlcjwvY29kZT4vPGNvZGU+T3B0aW9uQWNjZXNzb3I8L2NvZGU+IHByb2JsZW0uICBUaGlzCisgKiAgcHJvYmxlbSBkb2VzIG5vdCBoYXBwZW4gd2l0aCB0aGUgPGNvZGU+UG9zaXhQYXJzZXI8L2NvZGU+LjwvcD4KKyAqCisgKiAgPHA+Q29tbW9ucyBDTEkgMS4wIGFwcGVhcnMgbm90IHRvIGJlIGFibGUgdG8gYWNjZXNzIGFyZ3VtZW50cyB1c2luZyBhIGxvbmcgbmFtZSwgaWYgdGhhdCBvcHRpb24gaGFzIGEKKyAqICBzaG9ydCBuYW1lIC0tIGluIHRoaXMgY2FzZSBhY2Nlc3MgaXMgb25seSB1c2luZyBhIHNob3J0IG5hbWUuICBUaGlzIG1lYW5zIGl0IGlzIHBvc3NpYmxlIHRvIHdvcmsgd2l0aAorICogIGxvbmcgbmFtZSBvcHRpb24gaWYgYW5kIG9ubHkgaWYgdGhleSBoYXZlIG5vIHNob3J0IG5hbWUuPC9wPgorICoKKyAqICA8cD5Db21tb25zIENMSSAxLjEgd2hpbHN0IGl0IGhhcyBmaXhlZCBtb3N0IG9mIHRoZSBwcm9ibGVtcyBpbiAxLjAsIGFwcGVhcnMgdG8gaGF2ZSBhIGJyb2tlbgorICogIGdldE9wdGlvblZhbHVlcyAtLSBpdCByZXR1cm5zIG9ubHkgdGhlIGZpcnN0IHZhbHVlIC0tIGFuZCBzbyBpcyB3b3JzZSB0aGFuIHVzZWxlc3MuPC9wPgorICoKKyAqICA8cD4xLjAgUG9zaXhCdWlsZGVyIHJlbW92ZXMgdW5yZWNvZ25pemVkIHNpbmdsZSBsZXR0ZXIgb3B0aW9ucyBzaWxlbnRseS4gIDEuMSB2ZXJzaW9uIG1heSBhbHNvIGRvIHRoaXMuCisgKiAgR251UGFyc2VyIGJlaGF2ZXMgYWNjb3JkaW5nIHRvIHRoZSA8Y29kZT5zdG9wQXROb25PcHRpb248L2NvZGU+IHBhcmFtZXRlciAtLSB0aHJvdworICogIDxjb2RlPlVucmVjb2duaXplZE9wdGlvbkV4Y2VwdGlvbjwvY29kZT4gd2hlbiA8Y29kZT5mYWxzZTwvY29kZT4sIHRlcm1pbmF0ZSBwYXJzZSBsZWF2aW5nIGV2ZXJ5dGhpbmcKKyAqICBmb2xsb3dpbmcgdW5wcm9jZXNzZWQgaWYgPGNvZGU+dHJ1ZTwvY29kZT4uCisgKgorICogIEBhdXRob3IgRGllcmsgS8O2bmlnCisgKiAgQGF1dGhvciBSdXNzZWwgV2luZGVyCisgKi8KKworLy8vLyBUZXN0cyBtYXJrZWQgd2l0aCA0IHNsYXNoZXMgd29yayBpbiBDb21tb25zIENMSSAxLjEgYnV0IG5vdCBpbiAxLjAuICBUaGVyZSBhcmUgb3RoZXIgZGlmZmVyZW5jZXMsIHJlYWQKKy8vLy8gdGhlIGNvbW1lbnRzLgorCitjbGFzcyBDbGlCdWlsZGVyVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICBwcml2YXRlIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIKKyAgcHJpdmF0ZSBQcmludFdyaXRlciBwcmludFdyaXRlcgorCisgIHZvaWQgc2V0VXAgKCApIHsKKyAgICBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyICggKQorICAgIHByaW50V3JpdGVyID0gbmV3IFByaW50V3JpdGVyICggc3RyaW5nV3JpdGVyICkKKyAgfQorCisgIHByaXZhdGUgZmluYWwgZXhwZWN0ZWRQYXJhbWV0ZXIgPSAnQVNDSUknCisgIHByaXZhdGUgZmluYWwgdXNhZ2VTdHJpbmcgPSAgJ2dyb292eSBbb3B0aW9uXSogZmlsZW5hbWUnCisKKyAgcHJpdmF0ZSB2b2lkIHJ1blNhbXBsZSAoIHBhcnNlciAsIG9wdGlvbkxpc3QgKSB7CisgICAgZGVmIGNsaSA9IG5ldyBDbGlCdWlsZGVyICggdXNhZ2UgOiB1c2FnZVN0cmluZyAsIHdyaXRlciA6IHByaW50V3JpdGVyICwgcGFyc2VyIDogcGFyc2VyICkKKyAgICBjbGkuaCAoIGxvbmdPcHQgOiAnaGVscCcsICd1c2FnZSBpbmZvcm1hdGlvbicgKQorICAgIGNsaS5jICggYXJnTmFtZSA6ICdjaGFyc2V0JyAsIGFyZ3MgOjEgLCBsb25nT3B0IDogJ2VuY29kaW5nJyAsICdjaGFyYWN0ZXIgZW5jb2RpbmcnICkKKyAgICBjbGkuaSAoIGFyZ05hbWUgOiAnZXh0ZW5zaW9uJyAsIG9wdGlvbmFsQXJnIDogdHJ1ZSwgJ21vZGlmeSBmaWxlcyBpbiBwbGFjZSwgY3JlYXRlIGJhY2t1cCBpZiBleHRlbnNpb24gaXMgZ2l2ZW4gKGUuZy4gXCcuYmFrXCcpJyApCisgICAgZGVmIHN0cmluZ2lmaWVkID0gY2xpLm9wdGlvbnMudG9TdHJpbmcgKCApCisgICAgYXNzZXJ0IHN0cmluZ2lmaWVkID1+IC9pPS4gb3B0aW9uOiBpICA6OiBtb2RpZnkgZmlsZXMgaW4gcGxhY2UsIGNyZWF0ZSBiYWNrdXAgaWYgZXh0ZW5zaW9uIGlzIGdpdmVuLworICAgIGFzc2VydCBzdHJpbmdpZmllZCA9fiAvYz0uIG9wdGlvbjogYyBlbmNvZGluZyAgOjogY2hhcmFjdGVyIGVuY29kaW5nLworICAgIGFzc2VydCBzdHJpbmdpZmllZCA9fiAvaD0uIG9wdGlvbjogaCBoZWxwICA6OiB1c2FnZSBpbmZvcm1hdGlvbi8KKyAgICBhc3NlcnQgc3RyaW5naWZpZWQgPX4gL2VuY29kaW5nPS4gb3B0aW9uOiBjIGVuY29kaW5nICA6OiBjaGFyYWN0ZXIgZW5jb2RpbmcvCisgICAgYXNzZXJ0IHN0cmluZ2lmaWVkID1+IC9oZWxwPS4gb3B0aW9uOiBoIGhlbHAgIDo6IHVzYWdlIGluZm9ybWF0aW9uLworICAgIGRlZiBvcHRpb25zID0gY2xpLnBhcnNlICggb3B0aW9uTGlzdCApCisgICAgYXNzZXJ0IG9wdGlvbnMuaGFzT3B0aW9uICggJ2gnICkKKyAgICAvLy8vYXNzZXJ0IG9wdGlvbnMuaGFzT3B0aW9uICggJ2hlbHAnICkKKyAgICBhc3NlcnQgb3B0aW9ucy5oCisgICAgLy8vL2Fzc2VydCBvcHRpb25zLmhlbHAKKyAgICBpZiAoIG9wdGlvbnMuaCApIHsgY2xpLnVzYWdlICggKSB9CisgICAgZGVmIGV4cGVjdGVkVXNhZ2UgPSAiIiJ1c2FnZTogJHVzYWdlU3RyaW5nCisgLWMsLS1lbmNvZGluZyA8Y2hhcnNldD4gICBjaGFyYWN0ZXIgZW5jb2RpbmcKKyAtaCwtLWhlbHAgICAgICAgICAgICAgICAgIHVzYWdlIGluZm9ybWF0aW9uCisgLWkgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZnkgZmlsZXMgaW4gcGxhY2UsIGNyZWF0ZSBiYWNrdXAgaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbiBpcyBnaXZlbiAoZS5nLiAnLmJhaycpIiIiCisgICAgYXNzZXJ0RXF1YWxzICggZXhwZWN0ZWRVc2FnZSAsIHN0cmluZ1dyaXRlci50b1N0cmluZyAoICkudG9rZW5pemUgKCAnXHJcbicgKS5qb2luICggJ1xuJyApICkKKyAgICBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyICggKQorICAgIHByaW50V3JpdGVyID0gbmV3IFByaW50V3JpdGVyICggc3RyaW5nV3JpdGVyICkKKyAgICBjbGkud3JpdGVyID0gcHJpbnRXcml0ZXIKKyAgICAvLy8vaWYgKCBvcHRpb25zLmhlbHAgKSB7IGNsaS51c2FnZSAoICkgfQorICAgIC8vLy9hc3NlcnRFcXVhbHMgKCBleHBlY3RlZFVzYWdlICwgc3RyaW5nV3JpdGVyLnRvU3RyaW5nICggKS50b2tlbml6ZSAoICdcclxuJyApLmpvaW4gKCAnXG4nICkgKQorICAgIGFzc2VydCBvcHRpb25zLmhhc09wdGlvbiAoICdjJyApCisgICAgYXNzZXJ0IG9wdGlvbnMuYworICAgIC8vLy9hc3NlcnQgb3B0aW9ucy5oYXNPcHRpb24gKCAnZW5jb2RpbmcnICkKKyAgICAvLy8vYXNzZXJ0IG9wdGlvbnMuZW5jb2RpbmcKKyAgICBhc3NlcnRFcXVhbHMgKCBleHBlY3RlZFBhcmFtZXRlciwgb3B0aW9ucy5nZXRPcHRpb25WYWx1ZSAoICdjJyApICkKKyAgICBhc3NlcnRFcXVhbHMgKCBleHBlY3RlZFBhcmFtZXRlciwgb3B0aW9ucy5jICkKKyAgICAvLy8vYXNzZXJ0RXF1YWxzICggZXhwZWN0ZWRQYXJhbWV0ZXIsIG9wdGlvbnMuZ2V0T3B0aW9uVmFsdWUgKCAnZW5jb2RpbmcnICkgKQorICAgIC8vLy9hc3NlcnRFcXVhbHMgKCBleHBlY3RlZFBhcmFtZXRlciwgb3B0aW9ucy5lbmNvZGluZyApCisgICAgYXNzZXJ0RXF1YWxzICggZmFsc2UsIG9wdGlvbnMubm9TdWNoT3B0aW9uR2l2ZW4gKQorICAgIGFzc2VydEVxdWFscyAoIGZhbHNlLCBvcHRpb25zLmhhc09wdGlvbiAoICdub1N1Y2hPcHRpb25HaXZlbicgKSApCisgICAgYXNzZXJ0RXF1YWxzICggZmFsc2UsIG9wdGlvbnMueCApCisgICAgYXNzZXJ0RXF1YWxzICggZmFsc2UsIG9wdGlvbnMuaGFzT3B0aW9uICggJ3gnICkgKQorICB9CisgIHZvaWQgdGVzdFNhbXBsZVNob3J0X0Jhc2ljUGFyc2VyICggKSB7CisgICAgcnVuU2FtcGxlICggbmV3IEJhc2ljUGFyc2VyICggKSAsIFsgJy1oJyAsICctYycgLCBleHBlY3RlZFBhcmFtZXRlciBdICkKKyAgfQorICB2b2lkIHRlc3RTYW1wbGVTaG9ydF9HbnVQYXJzZXIgKCApIHsKKyAgICBydW5TYW1wbGUgKCBuZXcgR251UGFyc2VyICggKSAsIFsgJy1oJyAsICctYycgLCBleHBlY3RlZFBhcmFtZXRlciBdICkKKyAgfQorICB2b2lkIHRlc3RTYW1wbGVTaG9ydF9Qb3NpeFBhcnNlciAoICkgeworICAgIHJ1blNhbXBsZSAoIG5ldyBQb3NpeFBhcnNlciAoICkgLCBbICctaCcgLCAnLWMnICwgZXhwZWN0ZWRQYXJhbWV0ZXIgXSApCisgIH0KKyAgdm9pZCB0ZXN0U2FtcGxlTG9uZ19CYXNpY1BhcnNlciAoICkgeworICAgIHJ1blNhbXBsZSAoIG5ldyBHbnVQYXJzZXIgKCApICwgWyAnLS1oZWxwJyAsICctLWVuY29kaW5nJyAsIGV4cGVjdGVkUGFyYW1ldGVyIF0gKQorICB9CisgIHZvaWQgdGVzdFNhbXBsZUxvbmdfR251UGFyc2VyICggKSB7CisgICAgcnVuU2FtcGxlICggbmV3IEdudVBhcnNlciAoICkgLCBbICctLWhlbHAnICwgJy0tZW5jb2RpbmcnICwgZXhwZWN0ZWRQYXJhbWV0ZXIgXSApCisgIH0KKyAgLyoKKyAgICogIENhbm5vdCBydW4gdGhpcyB0ZXN0IGJlY2F1c2Ugb2YgdGhlICItLSIgaW5zdGVhZCBvZiAiQVNDSUkiIHByb2JsZW0uICBTZWUKKyAgICogIHRlc3RMb25nQW5kU2hvcnRPcHRzX1Bvc2l4UGFyc2VyIGJlbG93LiAgVGhpcyBpcyBhIDEuMCBhbmQgYSAxLjEgcHJvYmxlbS4KKyAgICovCisgIHZvaWQgWFhYX3Rlc3RTYW1wbGVMb25nX1Bvc2l4UGFyc2VyICggKSB7CisgICAgcnVuU2FtcGxlICggbmV3IFBvc2l4UGFyc2VyICggKSAsIFsgJy0taGVscCcgLCAnLS1lbmNvZGluZycgLCBleHBlY3RlZFBhcmFtZXRlciBdICkKKyAgfQorCisgIHZvaWQgdGVzdE11bHRpcGxlQXJncyAoICkgeworICAgIGRlZiBjbGkgPSBuZXcgQ2xpQnVpbGRlciAoICkKKyAgICBjbGkuYSAoIGxvbmdPcHQgOiAnYXJnJyAsIGFyZ3MgOiAyICwgdmFsdWVTZXBhcmF0b3IgOiAnLCcgYXMgY2hhciAsICdhcmd1bWVudHMnICkKKyAgICBkZWYgb3B0aW9ucyA9IGNsaS5wYXJzZSAoIFsgJy1hJyAsICcxLDInIF0gKQorICAgIGFzc2VydEVxdWFscyAoICcxJyAsIG9wdGlvbnMuYSApCisgICAgYXNzZXJ0RXF1YWxzICggWyAnMScgLCAnMicgXSAsIG9wdGlvbnMuYXMgKQorICAgIC8vLy9hc3NlcnRFcXVhbHMgKCAnMScgLCBvcHRpb25zLmFyZyApCisgICAgLy8vL2Fzc2VydEVxdWFscyAoIFsgJzEnICwgJzInIF0gLCBvcHRpb25zLmFyZ3MgKQorICB9CisKKyAgdm9pZCB0ZXN0QXJncyAoICkgeworICAgIGRlZiBjbGkgPSBuZXcgQ2xpQnVpbGRlciAoICkKKyAgICBjbGkuYSAoIFs6XSAsICcnICkKKyAgICBkZWYgb3B0aW9ucyA9IGNsaS5wYXJzZSAoIFsgJy1hJyAsICcxJyAsICcyJyBdICkKKyAgICBhc3NlcnRFcXVhbHMgKCBbICcxJyAsICcyJyBdICwgb3B0aW9ucy5hcmd1bWVudHMgKCApICkKKyAgfQorCisgIHZvaWQgdGVzdEZhaWxlZFBhcnNlUHJpbnRzVXNhZ2UgKCApIHsKKyAgICBkZWYgY2xpID0gbmV3IENsaUJ1aWxkZXIgKCB3cml0ZXIgOiBwcmludFdyaXRlciApCisgICAgY2xpLnggKCByZXF1aXJlZCA6IHRydWUgLCAnbWVzc2FnZScgKQorICAgIGRlZiBvcHRpb25zID0gY2xpLnBhcnNlICggWyBdICkKKworICAgIC8vCisgICAgLy8gRklYTUU6IFRoaXMgdGVzdCBpcyB2ZXJ5IGZyYWdpbGUgYW5kIGlzIGJvdW5kIHRvIGZhaWwgb24gZGlmZmVyZW50IGxvY2FsZXMgYW5kIHZlcnNpb25zIG9mIGNvbW1vbnMtY2xpLi4uIDotKAorICAgIC8vCisgICAgICAKKyAgICBhc3NlcnRFcXVhbHMgKCAnJydlcnJvcjogLXgKK3VzYWdlOiBncm9vdnkKKyAteCAgIG1lc3NhZ2UnJycsICBzdHJpbmdXcml0ZXIudG9TdHJpbmcgKCApLnRva2VuaXplICggJ1xyXG4nICkuam9pbiAoICdcbicgKSApCisgICAgfQorCisgIHZvaWQgdGVzdExvbmdPcHRzT25seV9HbnVQYXJzZXIgKCApIHsKKyAgICBkZWYgY2xpID0gbmV3IENsaUJ1aWxkZXIgKCB3cml0ZXIgOiBwcmludFdyaXRlciAsIHBhcnNlciA6IG5ldyBHbnVQYXJzZXIgKCApICkKKyAgICBkZWYgYW5PcHRpb24gPSBPcHRpb25CdWlsZGVyLndpdGhMb25nT3B0ICggJ2FuT3B0aW9uJyApLmhhc0FyZyAoICkud2l0aERlc2NyaXB0aW9uICggJ0FuIG9wdGlvbi4nICkuY3JlYXRlICggKQorICAgIGNsaS5vcHRpb25zLmFkZE9wdGlvbiAoIGFuT3B0aW9uICkKKyAgICBkZWYgb3B0aW9ucyA9IGNsaS5wYXJzZSAoIFsgJy12JyAsICctLWFuT3B0aW9uJyAsICdzb21ldGhpbmcnIF0gKQorICAgIAorICAgIGFzc2VydCBvcHRpb25zLmdldE9wdGlvblZhbHVlICggJ2FuT3B0aW9uJyApID09IG51bGwKKyAgICBhc3NlcnQgZmFsc2UgPT0gb3B0aW9ucy5hbk9wdGlvbgorICB9CisgIAorICB2b2lkIHRlc3RMb25nT3B0c09ubHlfUG9zaXhQYXJzZXIgKCApIHsKKyAgICBkZWYgY2xpID0gbmV3IENsaUJ1aWxkZXIgKCB3cml0ZXIgOiBwcmludFdyaXRlciAsIHBhcnNlciA6IG5ldyBQb3NpeFBhcnNlciAoICkgKQorICAgIGRlZiBhbk9wdGlvbiA9IE9wdGlvbkJ1aWxkZXIud2l0aExvbmdPcHQgKCAnYW5PcHRpb24nICkuaGFzQXJnICggKS53aXRoRGVzY3JpcHRpb24gKCAnQW4gb3B0aW9uLicgKS5jcmVhdGUgKCApCisgICAgY2xpLm9wdGlvbnMuYWRkT3B0aW9uICggYW5PcHRpb24gKQorICAgIGRlZiBvcHRpb25zID0gY2xpLnBhcnNlICggWyAnLXYnICwgJy0tYW5PcHRpb24nICwgJ3NvbWV0aGluZycgXSApCisgICAgY2xpLnVzYWdlICggKQorICAgIAorICAgIGFzc2VydCAnc29tZXRoaW5nJyA9PSBvcHRpb25zLmdldE9wdGlvblZhbHVlICggJ2FuT3B0aW9uJyApCisgICAgYXNzZXJ0ICdzb21ldGhpbmcnID09IG9wdGlvbnMuYW5PcHRpb24KKyAgICAKKyAgICBhc3NlcnQgISBvcHRpb25zLnYKKyAgfQorCisgIHByaXZhdGUgY3JlYXRlT3B0aW9uc1dpdGhMb25nQW5kU2hvcnRPcHRzICggcGFyc2VyICkgeworICAgIGRlZiBjbGkgPSBuZXcgQ2xpQnVpbGRlciAoIHdyaXRlciA6IHByaW50V3JpdGVyICwgcGFyc2VyIDogcGFyc2VyICkKKyAgICBkZWYgYW5PcHRpb24gPSBPcHRpb25CdWlsZGVyLndpdGhMb25nT3B0ICggJ2FuT3B0aW9uJyApLmhhc0FyZyAoICkud2l0aERlc2NyaXB0aW9uICggJ0FuIG9wdGlvbi4nICkuY3JlYXRlICggKQorICAgIGNsaS5vcHRpb25zLmFkZE9wdGlvbiAoIGFuT3B0aW9uICkKKyAgICBjbGkudiAoIGxvbmdPcHQgOiAndmVyYm9zZScgLCAndmVyYm9zZSBtb2RlJyApCisgICAgZGVmIG9wdGlvbnMgPSBjbGkucGFyc2UgKCBbICctdicgLCAnLS1hbk9wdGlvbicgLCAnc29tZXRoaW5nJyBdICkKKyAgICBjbGkudXNhZ2UgKCApCisgICAgCisgICAgYXNzZXJ0IG9wdGlvbnMudgorICAgIAorICAgIHJldHVybiBvcHRpb25zCisgIH0KKworICB2b2lkIHRlc3RMb25nQW5kU2hvcnRPcHRzX0Jhc2ljUGFyc2VyICggKSB7CisgICAgZGVmIG9wdGlvbnMgPSBjcmVhdGVPcHRpb25zV2l0aExvbmdBbmRTaG9ydE9wdHMgKCBuZXcgQmFzaWNQYXJzZXIgKCApICkKKyAgICBhc3NlcnRFcXVhbHMgKCAnc29tZXRoaW5nJyAsIG9wdGlvbnMuZ2V0T3B0aW9uVmFsdWUgKCAnYW5PcHRpb24nICkgKQorICAgIGFzc2VydEVxdWFscyAoICdzb21ldGhpbmcnICwgb3B0aW9ucy5hbk9wdGlvbiApCisgIH0KKworICB2b2lkIHRlc3RMb25nQW5kU2hvcnRPcHRzX1Bvc2l4UGFyc2VyICggKSB7CisgICAgZGVmIG9wdGlvbnMgPSBjcmVhdGVPcHRpb25zV2l0aExvbmdBbmRTaG9ydE9wdHMgKCBuZXcgUG9zaXhQYXJzZXIgKCApICkKKyAgICAvLworICAgIC8vICBUaGlzIHJlcHJlc2VudHMgd2hhdCBjdXJyZW50bHkgaGFwcGVucywgbm90IHdoYXQgc2hvdWxkIGhhcHBlbi4gIFRoZSBwcm9ibGVtIG5lZWRzIGludmVzdGlnYXRpbmcgc28KKyAgICAvLyAgdGhhdCB0aGUgZXhwZWN0ZWQgcmVzdWx0cyBoZXJlIGNhbiBiZSBzZXQgdG8gJ3NvbWV0aGluZycgYXMgaXQgc2hvdWxkLgorICAgIC8vCisgICAgYXNzZXJ0RXF1YWxzICggJy0tJyAsIG9wdGlvbnMuZ2V0T3B0aW9uVmFsdWUgKCAnYW5PcHRpb24nICkgKQorICAgIGFzc2VydEVxdWFscyAoICctLScgLCBvcHRpb25zLmFuT3B0aW9uICkKKyAgfQorCisgIHZvaWQgdGVzdExvbmdBbmRTaG9ydE9wdHNfR251UGFyc2VyICggKSB7CisgICAgZGVmIG9wdGlvbnMgPSBjcmVhdGVPcHRpb25zV2l0aExvbmdBbmRTaG9ydE9wdHMgKCBuZXcgR251UGFyc2VyICggKSApCisgICAgYXNzZXJ0RXF1YWxzICggJ3NvbWV0aGluZycgLCBvcHRpb25zLmdldE9wdGlvblZhbHVlICggJ2FuT3B0aW9uJyApICkKKyAgICBhc3NlcnRFcXVhbHMgKCAnc29tZXRoaW5nJyAsIG9wdGlvbnMuYW5PcHRpb24gKQorICB9CisKKyAgdm9pZCB1bmtub3duT3B0aW9ucyAoIHBhcnNlciApIHsKKyAgICBkZWYgY2xpID0gbmV3IENsaUJ1aWxkZXIgKCBwYXJzZXIgOiBwYXJzZXIgKQorICAgIGNsaS52ICggbG9uZ09wdCA6ICd2ZXJib3NlJyAsICd2ZXJib3NlIG1vZGUnICkKKyAgICBkZWYgb3B0aW9ucyA9IGNsaS5wYXJzZSAoIFsgJy14JyAsICcteXl5JyAsICctLXp6eicgLCAnc29tZXRoaW5nJyBdICkKKyAgICBhc3NlcnRFcXVhbHMgKCBbICcteCcgLCAnLXl5eScgLCAnLS16enonICwgJ3NvbWV0aGluZycgXSAsIG9wdGlvbnMuYXJndW1lbnRzICggKSApCisgIH0KKyAgdm9pZCB0ZXN0VW5yZWNvZ25pemVkT3B0aW9uc19CYXNpY1BhcnNlciAoICkgeyB1bmtub3duT3B0aW9ucyAoIG5ldyBCYXNpY1BhcnNlciAoICkgKSB9CisgIHZvaWQgdGVzdFVucmVjb2duaXplZE9wdGlvbnNfR251UGFyc2VyICggKSB7IHVua25vd25PcHRpb25zICggbmV3IEdudVBhcnNlciAoICkgKSB9CisgIC8vCisgIC8vICBUaGUgUG9zaXggUGFyc2VyIGFic29yYnMgdW5yZWNvZ25pemVkIG9wdGlvbnMgcmF0aGVyIHRoYW4gcGFzc2luZyB0aGVtIHRocm91Z2guICBJdCBpcyBub3QgY2xlYXIgaWYKKyAgLy8gIHRoaXMgaXMgdGhlIGNvcnJlY3Qgb3IgaW5jb3JyZWN0IGJlaGF2aW91ci4KKyAgLy8KKyAgdm9pZCB0ZXN0VW5yZWNvZ25pemVkT3B0aW9uc19Qb3NpeFBhcnNlciAoICkgeworICAgIGRlZiBjbGkgPSBuZXcgQ2xpQnVpbGRlciAoIHBhcnNlciA6IG5ldyBQb3NpeFBhcnNlciAoICkgKQorICAgIGNsaS52ICggbG9uZ09wdCA6ICd2ZXJib3NlJyAsICd2ZXJib3NlIG1vZGUnICkKKyAgICBkZWYgb3B0aW9ucyA9IGNsaS5wYXJzZSAoIFsgJy14JyAsICcteXl5JyAsICctLXp6eicgLCAnc29tZXRoaW5nJyBdICkKKyAgICBhc3NlcnRFcXVhbHMgKCBbICcteXl5JyAsICctLXp6eicgLCAnc29tZXRoaW5nJyBdICwgb3B0aW9ucy5hcmd1bWVudHMgKCApICkKKyB9CisKKyAgdm9pZCBiaXphcnJlUHJvY2Vzc2luZyAoIHBhcnNlciApIHsKKyAgICBkZWYgY2xpID0gbmV3IENsaUJ1aWxkZXIgKCBwYXJzZXIgOiBwYXJzZXIgKQorICAgIGRlZiBvcHRpb25zID0gY2xpLnBhcnNlICggWyAnLXh4eHgnIF0gKQorICAgIGFzc2VydEVxdWFscyAoIFsgJy14eHh4JyBdICwgb3B0aW9ucy5hcmd1bWVudHMgKCApICkKKyAgfQorICB2b2lkIHRlc3RCaXphcnJlUHJvY2Vzc2luZ19CYXNpY1BhcnNlciAoICkgeyBiaXphcnJlUHJvY2Vzc2luZyAoIG5ldyBCYXNpY1BhcnNlciAoICkgKSB9CisgIHZvaWQgdGVzdEJpemFycmVQcm9jZXNzaW5nX0dudVBhcnNlciAoICkgeyBiaXphcnJlUHJvY2Vzc2luZyAoIG5ldyBHbnVQYXJzZXIgKCApICkgfQorICAvLworICAvLyAgVGhpcyBiZWhhdmlvdXIgYnkgdGhlIFBvc2l4UGFyc2VyIGlzIHRydWx5IGJpemFycmUgYW5kIHNvIG1pbGl0YXRlcyBpbiBmYXZvdXIgb2YgdGhlIHN3aXRjaCBmcm9tCisgIC8vICBQb3NpeFBhcnNlciB0byBHbnVQYXJzZXIgYXMgdGhlIENsaUJ1aWxkZXIgZGVmYXVsdC4KKyAgLy8KKyAgdm9pZCB0ZXN0UG9zaXhCaXphcnJlbmVzcyAoICkgeworICAgIGRlZiBjbGkgPSBuZXcgQ2xpQnVpbGRlciAoIHBhcnNlciA6IG5ldyBQb3NpeFBhcnNlciAoICkgKQorICAgIGRlZiBvcHRpb25zID0gY2xpLnBhcnNlICggWyAnLXh4eCcgXSApCisgICAgYXNzZXJ0RXF1YWxzICggWyAneHh4JyAsICd4eCcgLCAneCcgXSAsIG9wdGlvbnMuYXJndW1lbnRzICggKSApCisgIH0KKworICBwcml2YXRlIHZvaWQgbXVsdGlwbGVPY2N1cnJlbmNlc1NlcGFyYXRlU2VwYXJhdGUgKCBwYXJzZXIgKSB7CisgICAgZGVmIGNsaSA9IG5ldyBDbGlCdWlsZGVyICggcGFyc2VyIDogcGFyc2VyICkKKyAgICBjbGkuYSAoIGxvbmdPcHQgOiAnYXJnJyAsIGFyZ3MgOiBPcHRpb24uVU5MSU1JVEVEX1ZBTFVFUyAsICdhcmd1bWVudHMnICkKKyAgICBkZWYgb3B0aW9ucyA9IGNsaS5wYXJzZSAoIFsgJy1hJyAsICcxJyAsICctYScgLCAnMicgLCAnLWEnICwgJzMnIF0gKQorICAgIGFzc2VydEVxdWFscyAoICcxJyAsIG9wdGlvbnMuYSApCisgICAgYXNzZXJ0RXF1YWxzICggWyAnMScgLCAnMicgLCAnMycgXSAsIG9wdGlvbnMuYXMgKQorICAgIC8vLy9hc3NlcnRFcXVhbHMgKCAnMScgLCBvcHRpb25zLmFyZyApCisgICAgLy8vL2Fzc2VydEVxdWFscyAoIFsgJzEnICwgJzInICwgJzMnIF0gLCBvcHRpb25zLmFyZ3MgKQorICAgIGFzc2VydEVxdWFscyAoIFsgXSAsIG9wdGlvbnMuYXJndW1lbnRzICggKSApCisgIH0KKyAgdm9pZCB0ZXN0TXVsdGlwbGVPY2N1cnJlbmNlc1NlcGFyYXRlU2VwYXJhdGVfQmFzaWNQYXJzZXIgKCApIHsgbXVsdGlwbGVPY2N1cnJlbmNlc1NlcGFyYXRlU2VwYXJhdGUgKCBuZXcgQmFzaWNQYXJzZXIgKCApICkgfQorICB2b2lkIHRlc3RNdWx0aXBsZU9jY3VycmVuY2VzU2VwYXJhdGVTZXBhcmF0ZV9HbnVQYXJzZXIgKCApIHsgbXVsdGlwbGVPY2N1cnJlbmNlc1NlcGFyYXRlU2VwYXJhdGUgKCBuZXcgR251UGFyc2VyICggKSApIH0KKyAgdm9pZCB0ZXN0TXVsdGlwbGVPY2N1cnJlbmNlc1NlcGFyYXRlU2VwYXJhdGVfUG9zaXhQYXJzZXIgKCApIHsgbXVsdGlwbGVPY2N1cnJlbmNlc1NlcGFyYXRlU2VwYXJhdGUgKCBuZXcgUG9zaXhQYXJzZXIgKCApICkgfQorCisgIHByaXZhdGUgdm9pZCBtdWx0aXBsZU9jY3VycmVuY2VzU2VwYXJhdGVKdXh0YXBvc2VkICggcGFyc2VyICkgeworICAgIGRlZiBjbGkgPSBuZXcgQ2xpQnVpbGRlciAoIHBhcnNlciA6IHBhcnNlciApCisgICAgY2xpLmEgKCBsb25nT3B0IDogJ2FyZycgLCBhcmdzIDogT3B0aW9uLlVOTElNSVRFRF9WQUxVRVMgLCAnYXJndW1lbnRzJyApCisgICAgZGVmIG9wdGlvbnMgPSBjbGkucGFyc2UgKCBbICctYTEnICwgJy1hMicgLCAnLWEzJyBdICkKKyAgICBhc3NlcnRFcXVhbHMgKCAnMScgLCBvcHRpb25zLmEgKQorICAgIGFzc2VydEVxdWFscyAoIFsgJzEnICwgJzInICwgJzMnIF0gLCBvcHRpb25zLmFzICkKKyAgICAvLy8vYXNzZXJ0RXF1YWxzICggJzEnICwgb3B0aW9ucy5hcmcgKQorICAgIC8vLy9hc3NlcnRFcXVhbHMgKCBbICcxJyAsICcyJyAsICczJyBdICwgb3B0aW9ucy5hcmdzICkKKyAgICBhc3NlcnRFcXVhbHMgKCBbIF0gLCBvcHRpb25zLmFyZ3VtZW50cyAoICkgKQorICB9CisgIC8vCisgIC8vICBCYXNpY1BhcnNlciBjYW5ub3QgaGFuZGxlIHRoaXMgb25lLgorICAvLworICAvL3ZvaWQgdGVzdE11bHRpcGxlT2NjdXJyZW5jZXNTZXBhcmF0ZUp1eHRhcG9zZWRfQmFzaWNQYXJzZXIgKCApIHsgbXVsdGlwbGVPY2N1cnJlbmNlc1NlcGFyYXRlSnV4dGFwb3NlZCAoIG5ldyBCYXNpY1BhcnNlciAoICkgKSB9CisgIHZvaWQgdGVzdE11bHRpcGxlT2NjdXJyZW5jZXNTZXBhcmF0ZUp1eHRhcG9zZWRfR251UGFyc2VyICggKSB7IG11bHRpcGxlT2NjdXJyZW5jZXNTZXBhcmF0ZUp1eHRhcG9zZWQgKCBuZXcgR251UGFyc2VyICggKSApIH0KKyAgdm9pZCB0ZXN0TXVsdGlwbGVPY2N1cnJlbmNlc1NlcGFyYXRlSnV4dGFwb3NlZF9Qb3NpeFBhcnNlciAoICkgeyBtdWx0aXBsZU9jY3VycmVuY2VzU2VwYXJhdGVKdXh0YXBvc2VkICggbmV3IFBvc2l4UGFyc2VyICggKSApIH0KKworICBwcml2YXRlIHZvaWQgbXVsdGlwbGVPY2N1cnJlbmNlc1RvZ2V0aGVyU2VwYXJhdGUgKCBwYXJzZXIgKSB7CisgICAgZGVmIGNsaSA9IG5ldyBDbGlCdWlsZGVyICggcGFyc2VyIDogcGFyc2VyICkKKyAgICBjbGkuYSAoIGxvbmdPcHQgOiAnYXJnJyAsIGFyZ3MgOiBPcHRpb24uVU5MSU1JVEVEX1ZBTFVFUyAsIHZhbHVlU2VwYXJhdG9yIDogJywnIGFzIGNoYXIgLCAnYXJndW1lbnRzJyApCisgICAgZGVmIG9wdGlvbnMgPSBjbGkucGFyc2UgKCBbICctYSAxLDIsMycgXSApCisgICAgYXNzZXJ0RXF1YWxzICggJyAxJyAsIG9wdGlvbnMuYSApCisgICAgYXNzZXJ0RXF1YWxzICggWyAnIDEnICwgJzInICwgJzMnIF0gLCBvcHRpb25zLmFzICkKKyAgICAvLy8vYXNzZXJ0RXF1YWxzICggJyAxJyAsIG9wdGlvbnMuYXJnICkKKyAgICAvLy8vYXNzZXJ0RXF1YWxzICggWyAnIDEnICwgJzInICwgJzMnIF0gLCBvcHRpb25zLmFyZ3MgKQorICAgIGFzc2VydEVxdWFscyAoIFsgXSAsIG9wdGlvbnMuYXJndW1lbnRzICggKSApCisgIH0KKyAgLy8KKyAgLy8gIEJhc2ljUGFyc2VyIGNhbm5vdCBoYW5kbGUgdGhpcyBvbmUuCisgIC8vCisgIC8vdm9pZCB0ZXN0TXVsdGlwbGVPY2N1cnJlbmNlc1RvZ2V0aGVyU2VwYXJhdGVfQmFzaWNQYXJzZXIgKCApIHsgbXVsdGlwbGVPY2N1cnJlbmNlc1RvZ2V0aGVyU2VwYXJhdGUgKCBuZXcgQmFzaWNQYXJzZXIgKCApICkgfQorICB2b2lkIHRlc3RNdWx0aXBsZU9jY3VycmVuY2VzVG9nZXRoZXJTZXBhcmF0ZV9HbnVQYXJzZXIgKCApIHsgbXVsdGlwbGVPY2N1cnJlbmNlc1RvZ2V0aGVyU2VwYXJhdGUgKCBuZXcgR251UGFyc2VyICggKSApIH0KKyAgdm9pZCB0ZXN0TXVsdGlwbGVPY2N1cnJlbmNlc1RvZ2V0aGVyU2VwYXJhdGVfUG9zaXhQYXJzZXIgKCApIHsgbXVsdGlwbGVPY2N1cnJlbmNlc1RvZ2V0aGVyU2VwYXJhdGUgKCBuZXcgUG9zaXhQYXJzZXIgKCApICkgfQorCisgIHByaXZhdGUgdm9pZCBtdWx0aXBsZU9jY3VycmVuY2VzVG9nZXRoZXJKdXh0YXBvc2VkICggcGFyc2VyICkgeworICAgIGRlZiBjbGkgPSBuZXcgQ2xpQnVpbGRlciAoIHBhcnNlciA6IHBhcnNlciApCisgICAgY2xpLmEgKCBsb25nT3B0IDogJ2FyZycgLCBhcmdzIDogT3B0aW9uLlVOTElNSVRFRF9WQUxVRVMgLCB2YWx1ZVNlcGFyYXRvciA6ICcsJyBhcyBjaGFyICwgJ2FyZ3VtZW50cycgKQorICAgIGRlZiBvcHRpb25zID0gY2xpLnBhcnNlICggWyAnLWExLDIsMycgXSApCisgICAgYXNzZXJ0RXF1YWxzICggJzEnICwgb3B0aW9ucy5hICkKKyAgICBhc3NlcnRFcXVhbHMgKCBbICcxJyAsICcyJyAsICczJyBdICwgb3B0aW9ucy5hcyApCisgICAgLy8vL2Fzc2VydEVxdWFscyAoICcxJyAsIG9wdGlvbnMuYXJnICkKKyAgICAvLy8vYXNzZXJ0RXF1YWxzICggWyAnMScgLCAnMicgLCAnMycgXSAsIG9wdGlvbnMuYXJncyApCisgICAgYXNzZXJ0RXF1YWxzICggWyBdICwgb3B0aW9ucy5hcmd1bWVudHMgKCApICkKKyAgfQorICAvLworICAvLyAgQmFzaWNQYXJzZXIgY2Fubm90IGhhbmRsZSB0aGlzIG9uZS4KKyAgLy8KKyAgLy92b2lkIHRlc3RNdWx0aXBsZU9jY3VycmVuY2VzVG9nZXRoZXJKdXh0YXBvc2VkX0Jhc2ljUGFyc2VyICggKSB7IG11bHRpcGxlT2NjdXJyZW5jZXNUb2dldGhlckp1eHRhcG9zZWQgKCBuZXcgQmFzaWNQYXJzZXIgKCApICkgfQorICB2b2lkIHRlc3RNdWx0aXBsZU9jY3VycmVuY2VzVG9nZXRoZXJKdXh0YXBvc2VkX0dudVBhcnNlciAoICkgeyBtdWx0aXBsZU9jY3VycmVuY2VzVG9nZXRoZXJKdXh0YXBvc2VkICggbmV3IEdudVBhcnNlciAoICkgKSB9CisgIHZvaWQgdGVzdE11bHRpcGxlT2NjdXJyZW5jZXNUb2dldGhlckp1eHRhcG9zZWRfUG9zaXhQYXJzZXIgKCApIHsgbXVsdGlwbGVPY2N1cnJlbmNlc1RvZ2V0aGVySnV4dGFwb3NlZCAoIG5ldyBQb3NpeFBhcnNlciAoICkgKSB9CisKKyAgLyoKKyAgICogIEludmVzdGlnYXRlIHByb2JsZW1zIHdpdGggdW5yZWNvZ25pemVkIG9wdGlvbnMuICBTaG91bGQgYWRkIHRoZSBCYXNpY1BhcnNlciBoZXJlIGFzIHdlbGwuCisgICAqLworCisgIHZvaWQgdGVzdFVucmVjb2duaXplZE9wdGlvblNpbGVudGx5SWdub3JlZF9HbnVQYXJzZXIgKCApIHsKKyAgICBkZWYgY2xpID0gbmV3IENsaUJ1aWxkZXIgKCB1c2FnZSA6IHVzYWdlU3RyaW5nICwgd3JpdGVyIDogcHJpbnRXcml0ZXIgLCBwYXJzZXIgOiBuZXcgR251UGFyc2VyICggKSApCisgICAgZGVmIG9wdGlvbnMgPSBjbGkucGFyc2UgKCBbICctdicgXSApCisgICAgLyoKKyAgICAgKiAgVGhlIGJlaGF2aW91ciBoZXJlIGRlcGVuZHMgb24gd2hldGhlciBzdG9wQXROb25PcHRpb24gaXMgdHJ1ZSBvciBmYWxzZSBpbiB0aGUgY2FsbCB0byBwYXJzZXIucGFyc2UKKyAgICAgKiAgaW4gQ2xpQnVpbGRlci5wYXJzZS4gIEN1cnJlbnRseSB0aGlzIGlzIHRydWUsIHNvIHBhcnNlIHNpbXBseSB0ZXJtaW5hdGVzLiAgQW55IG9wdGlvbnMgYWZ0ZXIgdGhlCisgICAgICogIHVucmVjb2duaXplZCBvbmUgYXJlIHVucHJvY2Vzc2VkLgorICAgICAqCisgICAgYXNzZXJ0RXF1YWxzICggJycnZXJyb3I6IFVucmVjb2duaXplZCBvcHRpb246IC12Cit1c2FnZTogZ3Jvb3Z5IFtvcHRpb25dKiBmaWxlbmFtZScnJywgc3RyaW5nV3JpdGVyLnRvU3RyaW5nICggKS50b2tlbml6ZSAoICdcclxuJyApLmpvaW4gKCAnXG4nICkgKQorICAgIGFzc2VydEVxdWFscyAoIG51bGwgLCBvcHRpb25zICkKKyAgICAqLworICAgIGFzc2VydEVxdWFscyAoICcnJycnJywgc3RyaW5nV3JpdGVyLnRvU3RyaW5nICggKS50b2tlbml6ZSAoICdcclxuJyApLmpvaW4gKCAnXG4nICkgKQorICAgIGFzc2VydCAhb3B0aW9ucy52CisgIH0KKyAgdm9pZCB0ZXN0VW5yZWNvZ25pemVkT3B0aW9uU2lsZW50bHlJZ25vcmVkX1Bvc2l4UGFyc2VyICggKSB7CisgICAgLy8KKyAgICAvLyAgVGhlIFBvc2l4UGFyc2VyIHNpbGVudGx5IGFic29yYnMgdW5yZWNvZ25pemVkIG9wdGlvbnMuCisgICAgLy8KKyAgICBkZWYgY2xpID0gbmV3IENsaUJ1aWxkZXIgKCB1c2FnZSA6IHVzYWdlU3RyaW5nICwgd3JpdGVyIDogcHJpbnRXcml0ZXIgLCBwYXJzZXIgOiBuZXcgUG9zaXhQYXJzZXIgKCApICkKKyAgICBkZWYgb3B0aW9ucyA9IGNsaS5wYXJzZSAoIFsgJy12JyBdICkKKyAgICBhc3NlcnRFcXVhbHMgKCAnJycnJycsIHN0cmluZ1dyaXRlci50b1N0cmluZyAoICkudG9rZW5pemUgKCAnXHJcbicgKS5qb2luICggJ1xuJyApICkKKyAgICBhc3NlcnQgISBvcHRpb25zLnYKKyAgfQorICB2b2lkIHRlc3RVbnJlY29nbml6ZWRPcHRpb25UZXJtaW5hdGVzUGFyc2VfR251UGFyc2VyICggKSB7CisgICAgZGVmIGNsaSA9IG5ldyBDbGlCdWlsZGVyICggdXNhZ2UgOiB1c2FnZVN0cmluZyAsIHdyaXRlciA6IHByaW50V3JpdGVyICwgcGFyc2VyIDogbmV3IEdudVBhcnNlciAoICkgKQorICAgIGNsaS5oICggbG9uZ09wdCA6ICdoZWxwJywgJ3VzYWdlIGluZm9ybWF0aW9uJyApCisgICAgZGVmIG9wdGlvbnMgPSBjbGkucGFyc2UgKCBbICctdicgLCAnLWgnIF0gKQorICAgIC8qCisgICAgICogIFRoZSBiZWhhdmlvdXIgaGVyZSBkZXBlbmRzIG9uIHdoZXRoZXIgc3RvcEF0Tm9uT3B0aW9uIGlzIHRydWUgb3IgZmFsc2UgaW4gdGhlIGNhbGwgdG8gcGFyc2VyLnBhcnNlCisgICAgICogIGluIENsaUJ1aWxkZXIucGFyc2UuICBDdXJyZW50bHkgdGhpcyBpcyB0cnVlLCBzbyBwYXJzZSBzaW1wbHkgdGVybWluYXRlcy4gIEFueSBvcHRpb25zIGFmdGVyIHRoZQorICAgICAqICB1bnJlY29nbml6ZWQgb25lIGFyZSB1bnByb2Nlc3NlZC4KKyAgICAgKgorICAgIGFzc2VydEVxdWFscyAoICcnJ2Vycm9yOiBVbnJlY29nbml6ZWQgb3B0aW9uOiAtdgordXNhZ2U6IGdyb292eSBbb3B0aW9uXSogZmlsZW5hbWUnJycsIHN0cmluZ1dyaXRlci50b1N0cmluZyAoICkudG9rZW5pemUgKCAnXHJcbicgKS5qb2luICggJ1xuJyApICkKKyAgICBhc3NlcnRFcXVhbHMgKCBudWxsICwgb3B0aW9ucyApCisgICAgKi8KKyAgICBhc3NlcnRFcXVhbHMgKCAnJycnJycsIHN0cmluZ1dyaXRlci50b1N0cmluZyAoICkudG9rZW5pemUgKCAnXHJcbicgKS5qb2luICggJ1xuJyApICkKKyAgICBhc3NlcnQgIW9wdGlvbnMudgorICAgIC8vCisgICAgLy8gIFdoeSBpcyBvcHRpb25zLmggbm90IHJlY29nbml6ZWQgaGVyZS4gIFRoaXMgaXMgd2VpcmQuCisgICAgLy8KKyAgICAvL2Fzc2VydCAhIG9wdGlvbnMuaAorICAgIGFzc2VydEVxdWFscyAoIFsgJy12JyAsICctaCcgXSAsIG9wdGlvbnMuYXJndW1lbnRzICggKSApCisgIH0KKyAgdm9pZCB0ZXN0VW5yZWNvZ25pemVkT3B0aW9uVGVybWluYXRlc1BhcnNlX1Bvc2l4UGFyc2VyICggKSB7CisgICAgLy8KKyAgICAvLyAgVGhlIFBvc2l4UGFyc2VyIHNpbGVudGx5IGFic29yYnMgdW5yZWNvZ25pemVkIG9wdGlvbnMuCisgICAgLy8KKyAgICBkZWYgY2xpID0gbmV3IENsaUJ1aWxkZXIgKCB1c2FnZSA6IHVzYWdlU3RyaW5nICwgd3JpdGVyIDogcHJpbnRXcml0ZXIgLCBwYXJzZXIgOiBuZXcgUG9zaXhQYXJzZXIgKCApICkKKyAgICBjbGkuaCAoIGxvbmdPcHQgOiAnaGVscCcsICd1c2FnZSBpbmZvcm1hdGlvbicgKQorICAgIGRlZiBvcHRpb25zID0gY2xpLnBhcnNlICggWyAnLXYnICwgJy1oJyBdICkKKyAgICBhc3NlcnRFcXVhbHMgKCAnJycnJycsIHN0cmluZ1dyaXRlci50b1N0cmluZyAoICkudG9rZW5pemUgKCAnXHJcbicgKS5qb2luICggJ1xuJyApICkKKyAgICBhc3NlcnQgISBvcHRpb25zLnYKKyAgICAvLworICAgIC8vICBXaHkgaXMgb3B0aW9ucy5oIG5vdCByZWNvZ25pemVkIGhlcmUuICBUaGlzIGlzIHdlaXJkLgorICAgIC8vCisgICAgLy9hc3NlcnQgISBvcHRpb25zLmgKKyAgICBhc3NlcnRFcXVhbHMgKCBbIF0gLCBvcHRpb25zLmFyZ3VtZW50cyAoICkgKQorICB9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvdXRpbC9Db25maWdTbHVycGVyVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3V0aWwvQ29uZmlnU2x1cnBlclRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMDJkZGMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3V0aWwvQ29uZmlnU2x1cnBlclRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsNDU1IEBACisvKiBDb3B5cmlnaHQgMjAwNi0yMDA3IEdyYWVtZSBSb2NoZXIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgZ3Jvb3Z5LnV0aWwKKy8qKgorICogVGVzdHMgZm9yIHRoZSBDb25maWdTbHVycGVyIGNsYXNzCisgCisgKiBAYXV0aG9yIEdyYWVtZSBSb2NoZXIKKyAqIEBzaW5jZSAwLjYKKyAgKgorICogQ3JlYXRlZDogSnVuIDE5LCAyMDA3CisgKiBUaW1lOiA2OjI5OjMzIFBNCisgKiAKKyAqLworCitjbGFzcyAgQ29uZmlnU2x1cnBlclRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKworICAgIHZvaWQgdGVzdENvbmZpZ1NsdXJwZXJOZXN0ZWRWYWx1ZXMoKSB7CisgICAgICAgIGRlZiBjb25maWcgPSBuZXcgQ29uZmlnU2x1cnBlcigpLnBhcnNlKCcnJworZm9vIHsKKyAgICBiYXIgeworICAgICAgICBwYXNzd29yZD0idmFsdWUiCisgICAgfQorICAgIGZydWl0PSJvcmFuZ2UiCit9CisnJycpCisKKyAgICAgICAgYXNzZXJ0RXF1YWxzICJ2YWx1ZSIsIGNvbmZpZy5mb28uYmFyLnBhc3N3b3JkCisgICAgICAgIGFzc2VydEVxdWFscyAib3JhbmdlIiwgY29uZmlnLmZvby5mcnVpdAorICAgICAgICBjb25maWcgPSBuZXcgQ29uZmlnU2x1cnBlcigpLnBhcnNlKCcnJworICAgICAgICAgICAgZm9vIHsKKyAgICAgICAgICAgICAgICBiYXIucGFzc3dvcmQ9InZhbHVlIgorICAgICAgICAgICAgICAgIGZydWl0PSJvcmFuZ2UiCisgICAgICAgICAgICB9CisgICAgICAgICAgICAnJycpCisKKyAgICAgICAgYXNzZXJ0RXF1YWxzICJ2YWx1ZSIsIGNvbmZpZy5mb28uYmFyLnBhc3N3b3JkCisgICAgICAgIGFzc2VydEVxdWFscyAib3JhbmdlIiwgY29uZmlnLmZvby5mcnVpdAorCisgICAgfQorCisgICAgdm9pZCB0ZXN0Q29uZmlnQmluZGluZygpIHsKKwkJZGVmIHNsdXJwZXIgPSBuZXcgQ29uZmlnU2x1cnBlcigpCisJCXNsdXJwZXIuYmluZGluZyA9IFtmb286ImJhciJdCisJCWRlZiBjb25maWcgPSBzbHVycGVyLnBhcnNlKCcnJwordGVzdD1mb28gKyAxCQkKKwkJJycnKQorCQlhc3NlcnRFcXVhbHMgImJhcjEiLCBjb25maWcudGVzdAorCisJfQorCisgICAgdm9pZCB0ZXN0RW52aXJvbm1lbnRQcm9wZXJ0aWVzMigpIHsKKyAgICAgICAgZGVmIGNvbmZpZyA9IG5ldyBDb25maWdTbHVycGVyKCJwcm9kdWN0aW9uIikucGFyc2UoJycnCitkYXRhU291cmNlIHsKKwlwb29saW5nID0gZmFsc2UKKwlkcml2ZXJDbGFzc05hbWUgPSAib3JnLmhzcWxkYi5qZGJjRHJpdmVyIgorCXVzZXJuYW1lID0gInNhIgorCXBhc3N3b3JkID0gIiIKK30KK2Vudmlyb25tZW50cyB7CisJZGV2ZWxvcG1lbnQgeworCQlkYXRhU291cmNlIHsKKwkJCWRiQ3JlYXRlID0gImNyZWF0ZS1kcm9wIgorCQkJdXJsID0gImpkYmM6aHNxbGRiOm1lbTpkZXZEQiIKKwkJfQorCX0KKwl0ZXN0IHsKKwkJZGF0YVNvdXJjZSB7CisJCQlkYkNyZWF0ZSA9ICJ1cGRhdGUiCisJCQl1cmwgPSAiamRiYzpoc3FsZGI6bWVtOnRlc3REYiIKKwkJfQorCX0KKwlwcm9kdWN0aW9uIHsKKwkJZGF0YVNvdXJjZSB7CisJCSAgICBwYXNzd29yZCA9ICJzZWNyZXQiCisJCQlkYkNyZWF0ZSA9ICJ1cGRhdGUiCisJCQl1cmwgPSAiamRiYzpoc3FsZGI6ZmlsZTpwcm9kRGI7c2h1dGRvd249dHJ1ZSIKKwkJfQorCX0KK30nJycpCisKKyAgICAgICAgYXNzZXJ0RXF1YWxzIGZhbHNlLCBjb25maWcuZGF0YVNvdXJjZS5wb29saW5nCisgICAgICAgIGFzc2VydEVxdWFscyAib3JnLmhzcWxkYi5qZGJjRHJpdmVyIiwgY29uZmlnLmRhdGFTb3VyY2UuZHJpdmVyQ2xhc3NOYW1lCisgICAgICAgIGFzc2VydEVxdWFscyAic2EiLCBjb25maWcuZGF0YVNvdXJjZS51c2VybmFtZQorICAgICAgICBhc3NlcnRFcXVhbHMgInNlY3JldCIsIGNvbmZpZy5kYXRhU291cmNlLnBhc3N3b3JkCisgICAgICAgIGFzc2VydEVxdWFscyAidXBkYXRlIiwgY29uZmlnLmRhdGFTb3VyY2UuZGJDcmVhdGUKKyAgICAgICAgYXNzZXJ0RXF1YWxzICJqZGJjOmhzcWxkYjpmaWxlOnByb2REYjtzaHV0ZG93bj10cnVlIiwgY29uZmlnLmRhdGFTb3VyY2UudXJsCisgICAgfQorCisgICAgdm9pZCB0ZXN0UGFyc2VQcm9wZXJ0aWVzKCkgeworICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKQorICAgICAgICBwcm9wc1snZm9vJ10gPSAnYmFyJworICAgICAgICBwcm9wc1snbG9nNGouYXBwZW5kZXIuTlVMTCddPSdvcmcuYXBhY2hlLmxvZzRqLnZhcmlhLk51bGxBcHBlbmRlcicKKyAgICAgICAgcHJvcHNbJ2xvZzRqLnJvb3RMb2dnZXInXT0nZXJyb3IsIE5VTEwnCisgICAgICAgIHByb3BzWydsb2c0ai5sb2dnZXIub3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMucGx1Z2lucyddPSdpbmZvLE5VTEwnCisgICAgICAgIHByb3BzWydsb2c0ai5hZGRpdGl2aXR5Lm9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzLnBsdWdpbnMnXT0nZmFsc2UnCisgICAgICAgIHByb3BzWydsb2c0ai5hZGRpdGl2aXR5Lm9yZy5zcHJpbmdmcmFtZXdvcmsnXT0nZmFsc2UnCisgICAgICAgIHByb3BzWydsb2c0ai5sb2dnZXIuZ3JhaWxzLnNwcmluZyddPSdpbmZvLE5VTEwnCisgICAgICAgIHByb3BzWydsb2c0ai5hcHBlbmRlci5OVUxMLmxheW91dCddPSdvcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQnCisKKyAgICAgICAgZGVmIGNvbmZpZyA9IG5ldyBDb25maWdTbHVycGVyKCkucGFyc2UocHJvcHMpCisKKyAgICAgICAgYXNzZXJ0RXF1YWxzICJvcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQiLCBjb25maWcubG9nNGouYXBwZW5kZXIuJ05VTEwubGF5b3V0JyAvLyB0ZXN0cyBvdmVybGFwcGluZyBwcm9wZXJ0aWVzCisgICAgICAgIGFzc2VydEVxdWFscyAib3JnLmFwYWNoZS5sb2c0ai52YXJpYS5OdWxsQXBwZW5kZXIiLCBjb25maWcubG9nNGouYXBwZW5kZXIuTlVMTCAvLyB0ZXN0cyBvdmVybGFwcGluZyBwcm9wZXJ0aWVzCisgICAgICAgIGFzc2VydEVxdWFscyAnZXJyb3IsIE5VTEwnLCBjb25maWcubG9nNGoucm9vdExvZ2dlcgorICAgICAgICBhc3NlcnRFcXVhbHMgJ2luZm8sTlVMTCcsIGNvbmZpZy5sb2c0ai5sb2dnZXIub3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMucGx1Z2lucworICAgICAgICBhc3NlcnRFcXVhbHMgJ2ZhbHNlJywgY29uZmlnLmxvZzRqLmFkZGl0aXZpdHkub3JnLnNwcmluZ2ZyYW1ld29yaworICAgICAgICBhc3NlcnRFcXVhbHMgJ2JhcicsIGNvbmZpZy5mb28KKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0U2ltcGxlUHJvcGVydGllcygpIHsKKyAgICAgICAgZGVmIHNsdXJwZXIgPSBuZXcgQ29uZmlnU2x1cnBlcigpCisKKyAgICAgICAgZGVmIGNvbmZpZyA9IHNsdXJwZXIucGFyc2UoJycnCitzbXRwLnNlcnZlci51cmwgPSAibG9jYWxob3N0Igorc210cC51c2VybmFtZSA9ICJmcmVkIgorJycnKQorCisgICAgICAgIGFzc2VydCBjb25maWcKKyAgICAgICAgcHJpbnRsbiBjb25maWcKKyAgICAgICAgcHJpbnRsbiBjb25maWcuc210cC5zZXJ2ZXIKKyAgICAgICAgYXNzZXJ0RXF1YWxzICJsb2NhbGhvc3QiLCBjb25maWcuc210cC5zZXJ2ZXIudXJsCisgICAgICAgIGFzc2VydEVxdWFscyAiZnJlZCIsIGNvbmZpZy5zbXRwLnVzZXJuYW1lCisgICAgfQorCisgICAgdm9pZCB0ZXN0U2NvcGVkUHJvcGVydGllcygpIHsKKyAgICAgICAgZGVmIHNsdXJwZXIgPSBuZXcgQ29uZmlnU2x1cnBlcigpCisgICAgICAgIGRlZiBjb25maWcgPSBzbHVycGVyLnBhcnNlKCcnJworICAgIHNtdHAgeworICAgICAgICBtYWlsLmhvc3QgPSAnc210cC5teWlzcC5jb20nCisgICAgICAgIG1haWwuYXV0aC51c2VyID0gJ3NlcnZlcicKKyAgICB9CisgICAgcmVzb3VyY2VzLlVSTCA9ICJodHRwOi8vbG9jYWxob3N0OjgwL3Jlc291cmNlcyIKKyAgICAgICAgJycnKQorCisgICAgICAgIGFzc2VydCBjb25maWcKKyAgICAgICAgYXNzZXJ0RXF1YWxzICJzbXRwLm15aXNwLmNvbSIsIGNvbmZpZy5zbXRwLm1haWwuaG9zdAorICAgICAgICBhc3NlcnRFcXVhbHMgInNlcnZlciIsIGNvbmZpZy5zbXRwLm1haWwuYXV0aC51c2VyCisgICAgICAgIGFzc2VydEVxdWFscyAiaHR0cDovL2xvY2FsaG9zdDo4MC9yZXNvdXJjZXMiLCBjb25maWcucmVzb3VyY2VzLlVSTCAgICAgICAgICAgICAgICAKKworICAgIH0KKworICAgIHZvaWQgdGVzdFNjb3BlZFByb3BlcnRpZXNXaXRoTmVzdGluZygpIHsKKyAgICAgICAgZGVmIHNsdXJwZXIgPSBuZXcgQ29uZmlnU2x1cnBlcigpCisgICAgICAgIGRlZiBjb25maWcgPSBzbHVycGVyLnBhcnNlKCcnJworICAgIHNtdHAgeworICAgICAgICBtYWlsIHsKKyAgICAgICAgICAgIGhvc3QgPSAnc210cC5teWlzcC5jb20nCisgICAgICAgICAgICBhdXRoLnVzZXIgPSAnc2VydmVyJworICAgICAgICB9CisgICAgfQorICAgIHJlc291cmNlcy5VUkwgPSAiaHR0cDovL2xvY2FsaG9zdDo4MC9yZXNvdXJjZXMiCisgICAgICAgICcnJykKKworICAgICAgICBhc3NlcnQgY29uZmlnCisgICAgICAgIGFzc2VydCAic210cC5teWlzcC5jb20iID09IGNvbmZpZy5zbXRwLm1haWwuaG9zdAorICAgICAgICBhc3NlcnRFcXVhbHMgInNlcnZlciIsIGNvbmZpZy5zbXRwLm1haWwuYXV0aC51c2VyCisgICAgICAgIGFzc2VydEVxdWFscyAiaHR0cDovL2xvY2FsaG9zdDo4MC9yZXNvdXJjZXMiLCBjb25maWcucmVzb3VyY2VzLlVSTAorCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdFNjb3BlZFZhcmlhYmxlUmV1c2FnZSgpIHsKKyAgICAgICAgZGVmIGNvbmYgPSAnJycKKyAgICAgICAgICBhMCA9ICJHb29meSIKKyAgICAgICAgICBhMSA9ICIkYTAiCisgICAgICAgICAgYTIuIiRhMCIgPSAiTWlja2V5IE1vdXNlIGFuZCAiICsgIiRhMCIKKyAgICAgICAgICBncm91cDEgeyBhMCA9ICJEb25hbGQgRHVjayIgfQorICAgICAgICAgIGdyb3VwMiB7IAorICAgICAgICAgICAgYTAgPSBhMAorICAgICAgICAgICAgYTEgPSAiJGdyb3VwMS5hMCIgCisgICAgICAgICAgICBncm91cDMgeworICAgICAgICAgICAgICBhMCA9ICJpbm5lciRhMCIgCisgICAgICAgICAgICAgIGdyb3VwNCB7CisgICAgICAgICAgICAgICAgYTAgPSAiaW5uZXIkYTAiCisgICAgICAgICAgICAgICAgYTEgPSBhMQorICAgICAgICAgICAgICAgIGEzID0gIkRhZ29iZXJ0IER1Y2siCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGEzID0gYTMgCisgICAgICAgICAgfQorICAgICAgICAgIGEzID0gIiRncm91cDEuYTAiCisgICAgICAgICcnJworCisgICAgICAgIGRlZiBjb25maWcgPSBuZXcgQ29uZmlnU2x1cnBlcigpLnBhcnNlKGNvbmYpCisgICAgICAgIGFzc2VydCBjb25maWcuZ3JvdXAxLmEwID09ICJEb25hbGQgRHVjayIKKyAgICAgICAgYXNzZXJ0IGNvbmZpZy5ncm91cDIuYTAgPT0gIkdvb2Z5IgorICAgICAgICBhc3NlcnQgY29uZmlnLmdyb3VwMi5ncm91cDMuYTAgPT0gImlubmVyR29vZnkiCisgICAgICAgIGFzc2VydCBjb25maWcuZ3JvdXAyLmdyb3VwMy5ncm91cDQuYTAgPT0gImlubmVyaW5uZXJHb29meSIKKyAgICAgICAgYXNzZXJ0IGNvbmZpZy5ncm91cDIuZ3JvdXAzLmdyb3VwNC5hMSA9PSAiRG9uYWxkIER1Y2siCisgICAgICAgIGFzc2VydCBjb25maWcuZ3JvdXAyLmdyb3VwMy5ncm91cDQuYTMgPT0gIkRhZ29iZXJ0IER1Y2siCisgICAgICAgIGFzc2VydCBjb25maWcuZ3JvdXAyLmEzID09IFs6XQorICAgICAgICBhc3NlcnQgY29uZmlnLmEzID09ICJEb25hbGQgRHVjayIKKyAgICB9CisKKyAgICB2b2lkIHRlc3RMb2c0akNvbmZpZ3VyYXRpb24oKSB7CisgICAgICAgIGRlZiBzbHVycGVyID0gbmV3IENvbmZpZ1NsdXJwZXIoKQorICAgICAgICBkZWYgY29uZmlnID0gc2x1cnBlci5wYXJzZSgnJycKK2xvZzRqIHsKKyAgICBhcHBlbmRlciB7CisgICAgICAgIHN0ZG91dCgib3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXIiKSB7CisgICAgICAgICAgICBsYXlvdXQ9Im9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dCIKKyAgICAgICAgfSAgICAgICAgICAgICAgICAKKyAgICB9CisgICAgcm9vdExvZ2dlcj0iZXJyb3Isc3Rkb3V0IgorICAgIGxvZ2dlciB7CisgICAgICAgIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzPSJpbmZvLHN0ZG91dCIKKyAgICAgICAgb3JnLnNwcmluZ2ZyYW1ld29yaz0iaW5mbyxzdGRvdXQiCisgICAgfQorICAgIGFkZGl0aXZpdHkgeworICAgICAgICBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscz1mYWxzZQorICAgICAgICBvcmcuc3ByaW5nZnJhbWV3b3JrPWZhbHNlCisgICAgfQorfQorICAgICAgICAnJycpCisKKyAgICAgICAgYXNzZXJ0IGNvbmZpZworCisgICAgICAgIHByaW50bG4gY29uZmlnCisKKyAgICAgICAgYXNzZXJ0RXF1YWxzICJvcmcuYXBhY2hlLmxvZzRqLkNvbnNvbGVBcHBlbmRlciIsIGNvbmZpZy5sb2c0ai5hcHBlbmRlci5zdGRvdXQKKyAgICAgICAgYXNzZXJ0RXF1YWxzICJvcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQiLCBjb25maWcubG9nNGouYXBwZW5kZXIuInN0ZG91dC5sYXlvdXQiCisgICAgICAgIGFzc2VydEVxdWFscyAiZXJyb3Isc3Rkb3V0IiwgY29uZmlnLmxvZzRqLnJvb3RMb2dnZXIKKyAgICAgICAgYXNzZXJ0RXF1YWxzICJpbmZvLHN0ZG91dCIsIGNvbmZpZy5sb2c0ai5sb2dnZXIub3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMKKyAgICAgICAgYXNzZXJ0RXF1YWxzIGZhbHNlLCBjb25maWcubG9nNGouYWRkaXRpdml0eS5vcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscyAgICAgICAgICAgICAgCisgICAgfQorCisgICAgdm9pZCB0ZXN0RW52aXJvbm1lbnRTcGVjaWZpY0NvbmZpZygpIHsKKyAgICAgICAgZGVmIHNsdXJwZXIgPSBuZXcgQ29uZmlnU2x1cnBlcigpCisgICAgICAgIGRlZiBjb25maWcgPSBzbHVycGVyLnBhcnNlKCcnJworbG9nNGogeworICAgIGFwcGVuZGVyIHsKKyAgICAgICAgc3Rkb3V0KCJvcmcuYXBhY2hlLmxvZzRqLkNvbnNvbGVBcHBlbmRlciIpIHsKKyAgICAgICAgICAgIGxheW91dD0ib3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0IgorICAgICAgICB9ICAgICAgICAKKyAgICB9CisgICAgcm9vdExvZ2dlcj0iZXJyb3Isc3Rkb3V0IgorICAgIGxvZ2dlciB7CisgICAgICAgIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzPSJpbmZvLHN0ZG91dCIKKyAgICAgICAgb3JnLnNwcmluZ2ZyYW1ld29yaz0iaW5mbyxzdGRvdXQiCisgICAgfQorICAgIGFkZGl0aXZpdHkgeworICAgICAgICBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscz1mYWxzZQorICAgICAgICBvcmcuc3ByaW5nZnJhbWV3b3JrPWZhbHNlCisgICAgfQorfQorZW52aXJvbm1lbnRzIHsKKyAgICBkZXZlbG9wbWVudCB7CisgICAgICAgIGxvZzRqLmxvZ2dlci5vcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscz0iZGVidWcsc3Rkb3V0IgorICAgIH0KK30KKyAgICAgICAgJycnKQorCisgICAgICAgIGFzc2VydCBjb25maWcKKworICAgICAgICBhc3NlcnRFcXVhbHMgIm9yZy5hcGFjaGUubG9nNGouQ29uc29sZUFwcGVuZGVyIiwgY29uZmlnLmxvZzRqLmFwcGVuZGVyLnN0ZG91dAorICAgICAgICBhc3NlcnRFcXVhbHMgIm9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dCIsIGNvbmZpZy5sb2c0ai5hcHBlbmRlci4ic3Rkb3V0LmxheW91dCIKKyAgICAgICAgYXNzZXJ0RXF1YWxzICJlcnJvcixzdGRvdXQiLCBjb25maWcubG9nNGoucm9vdExvZ2dlcgorICAgICAgICBhc3NlcnRFcXVhbHMgImluZm8sc3Rkb3V0IiwgY29uZmlnLmxvZzRqLmxvZ2dlci5vcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscworICAgICAgICBhc3NlcnRFcXVhbHMgZmFsc2UsIGNvbmZpZy5sb2c0ai5hZGRpdGl2aXR5Lm9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzCisKKyAgICAgICAgc2x1cnBlci5zZXRFbnZpcm9ubWVudCgiZGV2ZWxvcG1lbnQiKQorICAgICAgICBjb25maWcgPSBzbHVycGVyLnBhcnNlKCcnJworbG9nNGogeworICAgIGFwcGVuZGVyIHsKKyAgICAgICAgc3Rkb3V0KCJvcmcuYXBhY2hlLmxvZzRqLkNvbnNvbGVBcHBlbmRlciIpIHsgICAgICAgIAorICAgICAgICAgICAgbGF5b3V0PSJvcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQiCisgICAgICAgIH0KKyAgICB9CisgICAgcm9vdExvZ2dlcj0iZXJyb3Isc3Rkb3V0IgorICAgIGxvZ2dlciB7CisgICAgICAgIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzPSJpbmZvLHN0ZG91dCIKKyAgICAgICAgb3JnLnNwcmluZ2ZyYW1ld29yaz0iaW5mbyxzdGRvdXQiCisgICAgfQorICAgIGFkZGl0aXZpdHkgeworICAgICAgICBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscz1mYWxzZQorICAgICAgICBvcmcuc3ByaW5nZnJhbWV3b3JrPWZhbHNlCisgICAgfQorfQorZW52aXJvbm1lbnRzIHsKKyAgICBkZXZlbG9wbWVudCB7CisgICAgICAgIGxvZzRqLmxvZ2dlci5vcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscz0iZGVidWcsc3Rkb3V0IgorICAgICAgICBsb2c0ai5hcHBlbmRlci5sYXlvdXQ9Ik15TGF5b3V0IgorICAgIH0KKyAgICBwcm9kdWN0aW9uIHsKKyAgICAgICAgbG9nNGouYXBwZW5kZXIuc3Rkb3V0PSJNeVJvYnVzdEZpbGVBcHBlbmRlciIKKyAgICB9Cit9CisgICAgICAgICcnJykKKworICAgICAgICBhc3NlcnQgY29uZmlnCisKKyAgICAgICAgYXNzZXJ0RXF1YWxzICJvcmcuYXBhY2hlLmxvZzRqLkNvbnNvbGVBcHBlbmRlciIsIGNvbmZpZy5sb2c0ai5hcHBlbmRlci5zdGRvdXQKKyAgICAgICAgYXNzZXJ0RXF1YWxzICJNeUxheW91dCIsIGNvbmZpZy5sb2c0ai5hcHBlbmRlci5sYXlvdXQKKyAgICAgICAgYXNzZXJ0RXF1YWxzICJlcnJvcixzdGRvdXQiLCBjb25maWcubG9nNGoucm9vdExvZ2dlcgorICAgICAgICBhc3NlcnRFcXVhbHMgImRlYnVnLHN0ZG91dCIsIGNvbmZpZy5sb2c0ai5sb2dnZXIub3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHMKKyAgICAgICAgYXNzZXJ0RXF1YWxzIGZhbHNlLCBjb25maWcubG9nNGouYWRkaXRpdml0eS5vcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscworCisgICAgfQorCisKKyAgICB2b2lkIHRlc3RGbGF0dGVuQ29uZmlnKCkgeworICAgICAgICBkZWYgc2x1cnBlciA9IG5ldyBDb25maWdTbHVycGVyKCkKKyAgICAgICAgZGVmIGNvbmZpZyA9IHNsdXJwZXIucGFyc2UoJycnCitsb2c0aiB7CisgICAgYXBwZW5kZXIgeworICAgICAgICBzdGRvdXQoIm9yZy5hcGFjaGUubG9nNGouQ29uc29sZUFwcGVuZGVyIikgeyAgICAgICAgCisgICAgICAgICAgICBsYXlvdXQ9Im9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dCIKKyAgICAgICAgfQorICAgIH0KKyAgICByb290TG9nZ2VyPSJlcnJvcixzdGRvdXQiCisgICAgbG9nZ2VyIHsKKyAgICAgICAgb3JnLmNvZGVoYXVzLmdyb292eS5ncmFpbHM9ImluZm8sc3Rkb3V0IgorICAgICAgICBvcmcuc3ByaW5nZnJhbWV3b3JrPSJpbmZvLHN0ZG91dCIKKyAgICB9CisgICAgYWRkaXRpdml0eSB7CisgICAgICAgIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzPWZhbHNlCisgICAgICAgIG9yZy5zcHJpbmdmcmFtZXdvcms9ZmFsc2UKKyAgICB9Cit9CisgICAgICAgICcnJykKKworICAgICAgICBjb25maWcgPSBjb25maWcuZmxhdHRlbigpCisKKworICAgICAgICBhc3NlcnRFcXVhbHMgIm9yZy5hcGFjaGUubG9nNGouQ29uc29sZUFwcGVuZGVyIiwgY29uZmlnLiJsb2c0ai5hcHBlbmRlci5zdGRvdXQiCisgICAgICAgIGFzc2VydEVxdWFscyAib3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0IiwgY29uZmlnLiJsb2c0ai5hcHBlbmRlci5zdGRvdXQubGF5b3V0IgorICAgICAgICBhc3NlcnRFcXVhbHMgImVycm9yLHN0ZG91dCIsIGNvbmZpZy4ibG9nNGoucm9vdExvZ2dlciIKKyAgICAgICAgYXNzZXJ0RXF1YWxzICJpbmZvLHN0ZG91dCIsIGNvbmZpZy4ibG9nNGoubG9nZ2VyLm9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzIgorICAgICAgICBhc3NlcnRFcXVhbHMgZmFsc2UsIGNvbmZpZy4ibG9nNGouYWRkaXRpdml0eS5vcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscyIgICAgICAgICAgICAgIAorCisKKyAgICB9CisKKworICAgIHZvaWQgdGVzdFRvUHJvcGVydGllcygpIHsKKyAgICAgICAgZGVmIHNsdXJwZXIgPSBuZXcgQ29uZmlnU2x1cnBlcigpCisgICAgICAgIGRlZiBjb25maWcgPSBzbHVycGVyLnBhcnNlKCcnJworbG9nNGogeworICAgIGFwcGVuZGVyIHsKKyAgICAgICAgc3Rkb3V0KCJvcmcuYXBhY2hlLmxvZzRqLkNvbnNvbGVBcHBlbmRlciIpIHsKKyAgICAgICAgICAgbGF5b3V0PSJvcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQiCisgICAgICAgIH0KKyAgICB9CisgICAgcm9vdExvZ2dlcj0iZXJyb3Isc3Rkb3V0IgorICAgIGxvZ2dlciB7CisgICAgICAgIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzPSJpbmZvLHN0ZG91dCIKKyAgICAgICAgb3JnLnNwcmluZ2ZyYW1ld29yaz0iaW5mbyxzdGRvdXQiCisgICAgfQorICAgIGFkZGl0aXZpdHkgeworICAgICAgICBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscz1mYWxzZQorICAgICAgICBvcmcuc3ByaW5nZnJhbWV3b3JrPWZhbHNlCisgICAgfQorfQorICAgICAgICAnJycpCisKKyAgICAgICAgZGVmIHByb3BzID0gY29uZmlnLnRvUHJvcGVydGllcygpCisgICAgICAgIGFzc2VydCBwcm9wcworCisgICAgICAgIGFzc2VydEVxdWFscyAib3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXIiLCBwcm9wcy4ibG9nNGouYXBwZW5kZXIuc3Rkb3V0IgorICAgICAgICBhc3NlcnRFcXVhbHMgIm9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dCIsIHByb3BzLiJsb2c0ai5hcHBlbmRlci5zdGRvdXQubGF5b3V0IgorICAgICAgICBhc3NlcnRFcXVhbHMgImVycm9yLHN0ZG91dCIsIHByb3BzLiJsb2c0ai5yb290TG9nZ2VyIgorICAgICAgICBhc3NlcnRFcXVhbHMgImluZm8sc3Rkb3V0IiwgcHJvcHMuImxvZzRqLmxvZ2dlci5vcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscyIKKyAgICAgICAgYXNzZXJ0RXF1YWxzICJmYWxzZSIsIHByb3BzLiJsb2c0ai5hZGRpdGl2aXR5Lm9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzIgorCisKKyAgICAgICAgcHJvcHMgPSBjb25maWcubG9nNGoudG9Qcm9wZXJ0aWVzKCJsb2c0aiIpCisgICAgICAgIGFzc2VydEVxdWFscyAib3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXIiLCBwcm9wcy4ibG9nNGouYXBwZW5kZXIuc3Rkb3V0IgorICAgICAgICBhc3NlcnRFcXVhbHMgIm9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dCIsIHByb3BzLiJsb2c0ai5hcHBlbmRlci5zdGRvdXQubGF5b3V0IgorICAgICAgICBhc3NlcnRFcXVhbHMgImVycm9yLHN0ZG91dCIsIHByb3BzLiJsb2c0ai5yb290TG9nZ2VyIgorICAgICAgICBhc3NlcnRFcXVhbHMgImluZm8sc3Rkb3V0IiwgcHJvcHMuImxvZzRqLmxvZ2dlci5vcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscyIKKyAgICAgICAgYXNzZXJ0RXF1YWxzICJmYWxzZSIsIHByb3BzLiJsb2c0ai5hZGRpdGl2aXR5Lm9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzIgorCisgICAgfSAgICAgCisgICAgICAKKwl2b2lkIHRlc3RDb25maWdUb2tlbnNBc1N0cmluZ3MoKSB7CisgICAgICAgIGRlZiBzbHVycGVyID0gbmV3IENvbmZpZ1NsdXJwZXIoKQorICAgICAgICBkZWYgY29uZmlnID0gc2x1cnBlci5wYXJzZSgnJycKK2xvZzRqIHsKKyAgICBhcHBlbmRlci5zdGRvdXQgPSAib3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXIiCisJYXBwZW5kZXIuInN0ZG91dC5sYXlvdXQiPSJvcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQiCisJcm9vdExvZ2dlcj0iZXJyb3Isc3Rkb3V0IgkKK30KKyAgICAgICAgJycnKQorCisJCWFzc2VydCBjb25maWcgICAKKyAgICAgICAgYXNzZXJ0RXF1YWxzICJvcmcuYXBhY2hlLmxvZzRqLkNvbnNvbGVBcHBlbmRlciIsIGNvbmZpZy5sb2c0ai5hcHBlbmRlci5zdGRvdXQKKyAgICAgICAgYXNzZXJ0RXF1YWxzICJvcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQiLCBjb25maWcubG9nNGouYXBwZW5kZXIuInN0ZG91dC5sYXlvdXQiCisgICAgICAgIGFzc2VydEVxdWFscyAiZXJyb3Isc3Rkb3V0IiwgY29uZmlnLmxvZzRqLnJvb3RMb2dnZXIJCQorCX0KKwkKKwl2b2lkIHRlc3RDb25maWdJbnRlclJlZmVyZW5jaW5nKCkgeworICAgICAgICBkZWYgc2x1cnBlciA9IG5ldyBDb25maWdTbHVycGVyKCkKKyAgICAgICAgZGVmIGNvbmZpZyA9IHNsdXJwZXIucGFyc2UoJycnCisJCQl2YXIub25lPTUKKwkJCXZhci50d289dmFyLm9uZSoyCisgICAgICAgICcnJykKKwkJICAgICAgICAgICAgICAgICAgICAgCisJCWFzc2VydEVxdWFscyA1LCBjb25maWcudmFyLm9uZQorCQlhc3NlcnRFcXVhbHMgMTAsIGNvbmZpZy52YXIudHdvCisJfQorICAgICAgICAKKworCXZvaWQgdGVzdFNlcmlhbGl6ZUNvbmZpZygpIHsgICAKKwkJZGVmIHRleHQgPSAnJycKK2xvZzRqIHsKKyAgICBhcHBlbmRlci5zdGRvdXQ9Im9yZy5hcGFjaGUubG9nNGouQ29uc29sZUFwcGVuZGVyIgorICAgIGFwcGVuZGVyLidzdGRvdXQubGF5b3V0Jz0ib3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0IiAgICAgICAgCisgICAgcm9vdExvZ2dlcj0iZXJyb3Isc3Rkb3V0IgorICAgIGxvZ2dlciB7CisgICAgICAgIG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzPSJpbmZvLHN0ZG91dCIKKyAgICAgICAgb3JnLnNwcmluZ2ZyYW1ld29yaz0iaW5mbyxzdGRvdXQiCisgICAgfQorICAgICAKKyAgICBhZGRpdGl2aXR5LidkZWZhdWx0JyA9IHRydWUKKyAgICBhZGRpdGl2aXR5Lm9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzPWZhbHNlCisgICAgYWRkaXRpdml0eS5vcmcuc3ByaW5nZnJhbWV3b3JrPWZhbHNlCit9JycnCisgICAgICAgIGRlZiBzbHVycGVyID0gbmV3IENvbmZpZ1NsdXJwZXIoKQorICAgICAgICBkZWYgY29uZmlnID0gc2x1cnBlci5wYXJzZSh0ZXh0KQorCisJCWFzc2VydCBjb25maWcgICAgICAgICAgICAgICAgICAKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJZGVmIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpCisKKworCQljb25maWcud3JpdGVUbyhzdykKKworCQlkZWYgbmV3VGV4dCA9IHN3LnRvU3RyaW5nKCkKKworCQlwcmludGxuIG5ld1RleHQKKworCQljb25maWcgPSBzbHVycGVyLnBhcnNlKG5ld1RleHQpCisKKworICAgICAgICBhc3NlcnRFcXVhbHMgIm9yZy5hcGFjaGUubG9nNGouQ29uc29sZUFwcGVuZGVyIiwgY29uZmlnLmxvZzRqLmFwcGVuZGVyLnN0ZG91dAorICAgICAgICBhc3NlcnRFcXVhbHMgIm9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dCIsIGNvbmZpZy5sb2c0ai5hcHBlbmRlci4ic3Rkb3V0LmxheW91dCIKKyAgICAgICAgYXNzZXJ0RXF1YWxzICJlcnJvcixzdGRvdXQiLCBjb25maWcubG9nNGoucm9vdExvZ2dlcgorICAgICAgICBhc3NlcnRFcXVhbHMgImluZm8sc3Rkb3V0IiwgY29uZmlnLmxvZzRqLmxvZ2dlci5vcmcuY29kZWhhdXMuZ3Jvb3Z5LmdyYWlscworICAgICAgICBhc3NlcnRFcXVhbHMgZmFsc2UsIGNvbmZpZy5sb2c0ai5hZGRpdGl2aXR5Lm9yZy5jb2RlaGF1cy5ncm9vdnkuZ3JhaWxzCisKKwkJCisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvdXRpbC9EdW1teS5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS91dGlsL0R1bW15LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ0OTViYQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvdXRpbC9EdW1teS5qYXZhCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgJElkJAorCisgQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQKKyB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIGNvcHlyaWdodAorICAgIHN0YXRlbWVudHMgYW5kIG5vdGljZXMuICBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYQorICAgIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KKworIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUKKyAgICBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCisgICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCisgICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworIDMuIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCisgICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLAorICAgIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLgorCisgNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIKKyAgICBub3IgbWF5ICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYSByZWdpc3RlcmVkCisgICAgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KKworIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtCisgICAgaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTCisgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECisgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTAorIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAqLworcGFja2FnZSBncm9vdnkudXRpbDsKKworcHVibGljIGNsYXNzIER1bW15IGltcGxlbWVudHMgRHVtbXlNQmVhbiB7CisKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lID0gIkphbWVzIjsKKyAgICBwcml2YXRlIFN0cmluZyBsb2NhdGlvbiA9ICJMb25kb24iOworICAgIHByaXZhdGUgaW50IHNpemUgPSAxMjsKKworICAgIHB1YmxpYyBEdW1teSgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgRHVtbXkoU3RyaW5nIG5hbWUsIFN0cmluZyBsb2NhdGlvbikgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RhcnRlZCEiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9wKCkgeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN0b3BwZWQhIik7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIGxvY2F0aW9uOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldExvY2F0aW9uKFN0cmluZyBsb2NhdGlvbikgeworICAgICAgICB0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRTaXplKCkgeworICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTaXplKGludCBzaXplKSB7CisgICAgICAgIHRoaXMuc2l6ZSA9IHNpemU7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3V0aWwvRHVtbXlNQmVhbi5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS91dGlsL0R1bW15TUJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjIyMjlhCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS91dGlsL0R1bW15TUJlYW4uamF2YQpAQCAtMCwwICsxLDY0IEBACisvKgorICRJZCQKKworIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCisgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQKKyAgICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKKyAgICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCisgICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQorICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgorICAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKKyAgICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KKworIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCisgICAgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAorICAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCisKKyA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQorICAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLworCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUworIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAorIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKKyBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgKi8KK3BhY2thZ2UgZ3Jvb3Z5LnV0aWw7CisKK3B1YmxpYyBpbnRlcmZhY2UgRHVtbXlNQmVhbiB7CisgICAgdm9pZCBzdGFydCgpOworCisgICAgdm9pZCBzdG9wKCk7CisKKyAgICBTdHJpbmcgZ2V0TG9jYXRpb24oKTsKKworICAgIHZvaWQgc2V0TG9jYXRpb24oU3RyaW5nIGxvY2F0aW9uKTsKKworICAgIFN0cmluZyBnZXROYW1lKCk7CisKKyAgICB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpOworCisgICAgaW50IGdldFNpemUoKTsKKworICAgIHZvaWQgc2V0U2l6ZShpbnQgc2l6ZSk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS91dGlsL0VtcHR5U2NyaXB0VGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3V0aWwvRW1wdHlTY3JpcHRUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTkyY2EwCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS91dGlsL0VtcHR5U2NyaXB0VGVzdC5ncm9vdnkKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAkSWQkCisKKyBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAorIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0CisgICAgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhCisgICAgY29weSBvZiB0aGlzIGRvY3VtZW50LgorCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQorICAgIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKKyAgICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKKyAgICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCisgICAgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCisKKyA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IgorICAgIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQKKyAgICB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgorCisgNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KKyAgICBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMKKyBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKKyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCisgVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICovCisKK3BhY2thZ2UgZ3Jvb3Z5LnV0aWw7CisKK3B1YmxpYyBjbGFzcyBFbXB0eVNjcmlwdFRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlTY3JpcHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0U2NyaXB0KCIiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3V0aWwvRXZhbFRlc3QuamF2YSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvdXRpbC9FdmFsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5N2ZlM2EKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3V0aWwvRXZhbFRlc3QuamF2YQpAQCAtMCwwICsxLDM4IEBACitwYWNrYWdlIGdyb292eS51dGlsOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5Db21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbjsKKworLyoqCisgKiBUZXN0aW5nIHRoZSBzaW1wbGUgR3Jvb3Z5IGludGVncmF0aW9uIHdpdGggRXZhbC4KKyAqCisgKiBAYXV0aG9yIERpZXJrIEtvZW5pZworICovCitwdWJsaWMgY2xhc3MgRXZhbFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgcHVibGljIHZvaWQgdGVzdE1lU2ltcGxlKCkgdGhyb3dzIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uIHsKKyAgICAgICAgT2JqZWN0IHJlc3VsdCA9IEV2YWwubWUoIjEwIik7CisgICAgICAgIGFzc2VydEVxdWFscygiMTAiLCByZXN1bHQudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE1lV2l0aFN5bWJvbEFuZE9iamVjdCgpIHRocm93cyBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbiB7CisgICAgICAgIE9iamVjdCByZXN1bHQgPSBFdmFsLm1lKCJ4IiwgbmV3IEludGVnZXIoMTApLCAieCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjEwIiwgcmVzdWx0LnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RYKCkgdGhyb3dzIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uIHsKKyAgICAgICAgT2JqZWN0IHJlc3VsdCA9IEV2YWwueChuZXcgSW50ZWdlcigxMCksICJ4Iik7CisgICAgICAgIGFzc2VydEVxdWFscygiMTAiLCByZXN1bHQudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFhZKCkgdGhyb3dzIENvbXBpbGF0aW9uRmFpbGVkRXhjZXB0aW9uIHsKKyAgICAgICAgSW50ZWdlciB0ZW4gPSBuZXcgSW50ZWdlcigxMCk7CisgICAgICAgIE9iamVjdCByZXN1bHQgPSBFdmFsLnh5KHRlbiwgdGVuLCAieCt5Iik7CisgICAgICAgIGFzc2VydEVxdWFscygiMjAiLCByZXN1bHQudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFhZWigpIHRocm93cyBDb21waWxhdGlvbkZhaWxlZEV4Y2VwdGlvbiB7CisgICAgICAgIEludGVnZXIgdGVuID0gbmV3IEludGVnZXIoMTApOworICAgICAgICBPYmplY3QgcmVzdWx0ID0gRXZhbC54eXoodGVuLCB0ZW4sIHRlbiwgIngreSt6Iik7CisgICAgICAgIGFzc2VydEVxdWFscygiMzAiLCByZXN1bHQudG9TdHJpbmcoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS91dGlsL0ZhY3RvcnlCdWlsZGVyU3VwcG9ydFRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS91dGlsL0ZhY3RvcnlCdWlsZGVyU3VwcG9ydFRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMGU0OTYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3V0aWwvRmFjdG9yeUJ1aWxkZXJTdXBwb3J0VGVzdC5ncm9vdnkKQEAgLTAsMCArMSw0ODAgQEAKK3BhY2thZ2UgZ3Jvb3Z5LnV0aWwNCisNCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuTWlzc2luZ01ldGhvZEV4Y2VwdGlvbg0KKw0KKy8qKg0KKyAqICAgVGVzdCBmb3IgRmFjdG9yeUJ1aWxkZXJTdXBwb3J0IGJhc2VkIGluIEJ1aWxkZXJTdXBwb3J0VGVzdA0KKyAqICAgYXMgaXQgc2hvdWxkIGNvbXBseSB3aXRoIHRoZSBzYW1lIGNvbnRyYWN0DQorICogICBAYXV0aG9yIEFuZHJlcyBBbG1pcmF5IA0KKyAqLw0KKw0KK2NsYXNzIEZhY3RvcnlCdWlsZGVyU3VwcG9ydFRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZXsNCisgICAgdm9pZCB0ZXN0U2ltcGxlTm9kZSgpIHsNCisgICAgICAgIGRlZiBiID0gbmV3IFNwb29mRmFjdG9yeUJ1aWxkZXIoKQ0KKyAgICAgICAgYXNzZXJ0IGIubG9nID09IFtdDQorICAgICAgICBkZWYgbm9kZSA9IGIuZm9vKCkNCisgICAgICAgIGFzc2VydCBiLmxvZyA9PSBbICAnbmV3X2luc3RhbmNlJywnZm9vJywgbnVsbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnaGFuZGxlX25vZGVfYXR0cmlidXRlcycsIG5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25vZGVfY29tcGxldGVkJyxudWxsLCBub2RlLCANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAncG9zdF9ub2RlX2NvbXBsZXRpb24nLG51bGwsIG5vZGUNCisgICAgICAgICAgICAgICAgICAgICAgICBdDQorICAgIH0NCisNCisgICAgdm9pZCB0ZXN0U2ltcGxlTm9kZVdpdGhWYWx1ZSgpIHsNCisgICAgICAgIGRlZiBiID0gbmV3IFNwb29mRmFjdG9yeUJ1aWxkZXIoKQ0KKyAgICAgICAgZGVmIG5vZGUgPSBiLmZvbygndmFsdWUnKQ0KKyAgICAgICAgYXNzZXJ0IGIubG9nID09IFsgICduZXdfaW5zdGFuY2UnLCdmb28nLCAndmFsdWUnLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdoYW5kbGVfbm9kZV9hdHRyaWJ1dGVzJywgbm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnbm9kZV9jb21wbGV0ZWQnLG51bGwsbm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAncG9zdF9ub2RlX2NvbXBsZXRpb24nLG51bGwsIG5vZGUNCisgICAgICAgICAgICAgICAgICAgICAgICBdDQorICAgIH0NCisNCisgICAgdm9pZCB0ZXN0U2ltcGxlTm9kZVdpdGhPbmVBdHRyaWJ1dGUoKSB7DQorICAgICAgICBkZWYgYiA9IG5ldyBTcG9vZkZhY3RvcnlCdWlsZGVyKCkNCisgICAgICAgIGRlZiBub2RlID0gYi5mb28obmFtZTondmFsdWUnKQ0KKyAgICAgICAgYXNzZXJ0IGIubG9nID09IFsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmV3X2luc3RhbmNlJywnZm9vJyxudWxsLCduYW1lJywndmFsdWUnLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdoYW5kbGVfbm9kZV9hdHRyaWJ1dGVzJyxub2RlLCduYW1lJywndmFsdWUnLCANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnbm9kZV9jb21wbGV0ZWQnLG51bGwsIG5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Bvc3Rfbm9kZV9jb21wbGV0aW9uJyxudWxsLCBub2RlIA0KKyAgICAgICAgICAgICAgICAgICAgICAgIF0NCisgICAgfQ0KKw0KKyAgICB2b2lkIHRlc3RTaW1wbGVOb2RlV2l0aENsb3N1cmUoKSB7DQorICAgICAgICBkZWYgYiA9IG5ldyBTcG9vZkZhY3RvcnlCdWlsZGVyKCkNCisgICAgICAgIGIuZm9vKCl7DQorICAgICAgICAgICAgYi5iYXIoKQ0KKyAgICAgICAgfQ0KKyAgICAgICAgYXNzZXJ0IGIubG9nID09IFsNCisgICAgICAgICAgICAnbmV3X2luc3RhbmNlJywnZm9vJyxudWxsLA0KKyAgICAgICAgICAgICdoYW5kbGVfbm9kZV9hdHRyaWJ1dGVzJywneCcsDQorICAgICAgICAgICAgICAgICduZXdfaW5zdGFuY2UnLCdiYXInLG51bGwsDQorICAgICAgICAgICAgICAgICdoYW5kbGVfbm9kZV9hdHRyaWJ1dGVzJywneCcsDQorICAgICAgICAgICAgJ3NldF9wYXJlbnQnLCAneCcsICd4JywNCisgICAgICAgICAgICAnc2V0X2NoaWxkJywgJ3gnLCAneCcsDQorICAgICAgICAgICAgICAgICdub2RlX2NvbXBsZXRlZCcsJ3gnLCd4JywNCisgICAgICAgICAgICAgICAgJ3Bvc3Rfbm9kZV9jb21wbGV0aW9uJywgJ3gnLCAneCcsDQorICAgICAgICAgICAgJ25vZGVfY29tcGxldGVkJyxudWxsLCd4JywNCisgICAgICAgICAgICAncG9zdF9ub2RlX2NvbXBsZXRpb24nLG51bGwsICd4Jw0KKyAgICAgICAgICAgIF0NCisgICAgfQ0KKw0KKyAgICB2b2lkIHRlc3RTaW1wbGVOb2RlV2l0aE9uZUF0dHJpYnV0ZUFuZFZhbHVlKCkgew0KKyAgICAgICAgZGVmIGIgPSBuZXcgU3Bvb2ZGYWN0b3J5QnVpbGRlcigpDQorICAgICAgICBkZWYgbm9kZSA9IGIuZm9vKGJhcjonYmF6JywgJ3ZhbHVlJykNCisgICAgICAgIGFzc2VydCBiLmxvZyA9PSBbDQorICAgICAgICAgICAgICAgICAgICAgICAgICAnbmV3X2luc3RhbmNlJywgJ2ZvbycsICd2YWx1ZScsICdiYXInLCdiYXonLCANCisgICAgICAgICAgICAgICAgICAgICAgICAgICdoYW5kbGVfbm9kZV9hdHRyaWJ1dGVzJyxub2RlLCdiYXInLCdiYXonLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ25vZGVfY29tcGxldGVkJyxudWxsLG5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAncG9zdF9ub2RlX2NvbXBsZXRpb24nLG51bGwsIG5vZGUNCisgICAgICAgICAgICAgICAgICAgICAgICBdDQorICAgIH0NCisNCisgICAgdm9pZCB0ZXN0U2ltcGxlTm9kZVdpdGhWYWx1ZUFuZE9uZUF0dHJpYnV0ZSgpIHsNCisgICAgICAgIGRlZiBiID0gbmV3IFNwb29mRmFjdG9yeUJ1aWxkZXIoKQ0KKyAgICAgICAgZGVmIG5vZGUgPSBiLmZvbygndmFsdWUnLCBiYXI6J2JheicpDQorICAgICAgICBhc3NlcnQgYi5sb2cgPT0gWw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ25ld19pbnN0YW5jZScsICdmb28nLCAndmFsdWUnLCAnYmFyJywnYmF6JywgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAnaGFuZGxlX25vZGVfYXR0cmlidXRlcycsbm9kZSwnYmFyJywnYmF6JywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICdub2RlX2NvbXBsZXRlZCcsbnVsbCxub2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Bvc3Rfbm9kZV9jb21wbGV0aW9uJyxudWxsLCBub2RlDQorICAgICAgICAgICAgICAgICAgICAgICAgXQ0KKyAgICB9DQorDQorICAgIHZvaWQgdGVzdFNpbXBsZU5vZGVXaXRoT25lQXR0cmlidXRlQW5kVmFsdWVBbmRDbG9zdXJlKCkgew0KKyAgICAgICAgZGVmIGIgPSBuZXcgU3Bvb2ZGYWN0b3J5QnVpbGRlcigpDQorICAgICAgICBkZWYgbm9kZSA9IGIuZm9vKGJhcjonYmF6JywgJ3ZhbHVlJykgeyAxIH0NCisgICAgICAgIGFzc2VydCBiLmxvZyA9PSBbDQorICAgICAgICAgICAgICAgICAgICAgICAgICAnbmV3X2luc3RhbmNlJywgJ2ZvbycsICd2YWx1ZScsICdiYXInLCdiYXonLCANCisgICAgICAgICAgICAgICAgICAgICAgICAgICdoYW5kbGVfbm9kZV9hdHRyaWJ1dGVzJyxub2RlLCdiYXInLCdiYXonLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ25vZGVfY29tcGxldGVkJyxudWxsLG5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAncG9zdF9ub2RlX2NvbXBsZXRpb24nLG51bGwsIG5vZGUNCisgICAgICAgICAgICAgICAgICAgICAgICBdDQorICAgIH0NCisNCisgICAgdm9pZCB0ZXN0U2ltcGxlTm9kZVdpdGhWYWx1ZUFuZE9uZUF0dHJpYnV0ZUFuZENsb3N1cmUoKSB7DQorICAgICAgICBkZWYgYiA9IG5ldyBTcG9vZkZhY3RvcnlCdWlsZGVyKCkNCisgICAgICAgIGRlZiBub2RlID0gYi5mb28oJ3ZhbHVlJywgYmFyOidiYXonKSB7IDEgfQ0KKyAgICAgICAgYXNzZXJ0IGIubG9nID09IFsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICduZXdfaW5zdGFuY2UnLCAnZm9vJywgJ3ZhbHVlJywgJ2JhcicsJ2JheicsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hhbmRsZV9ub2RlX2F0dHJpYnV0ZXMnLG5vZGUsJ2JhcicsJ2JheicsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAnbm9kZV9jb21wbGV0ZWQnLG51bGwsbm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICdwb3N0X25vZGVfY29tcGxldGlvbicsbnVsbCwgbm9kZQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIF0NCisgICAgfQ0KKw0KKyAgICB2b2lkIHRlc3RTaW1wbGVOb2RlVHdvVmFsdWVzKCkgew0KKyAgICAgICAgZGVmIGIgPSBuZXcgU3Bvb2ZGYWN0b3J5QnVpbGRlcigpDQorICAgICAgICBzaG91bGRGYWlsKE1pc3NpbmdNZXRob2RFeGNlcHRpb24sIHtkZWYgbm9kZSA9IGIuZm9vKCdhcmcxJywgJ2FyZzInKX0pDQorICAgIH0NCisNCisgICAgdm9pZCB0ZXN0U2ltcGxlTm9kZVR3b1ZhbHVlc0Nsb3N1cmUoKSB7DQorICAgICAgICBkZWYgYiA9IG5ldyBTcG9vZkZhY3RvcnlCdWlsZGVyKCkNCisgICAgICAgIHNob3VsZEZhaWwoTWlzc2luZ01ldGhvZEV4Y2VwdGlvbiwge2RlZiBub2RlID0gYi5mb28oJ2FyZzEnLCAnYXJnMicpIHsgMSB9IH0pDQorICAgIH0NCisNCisgICAgdm9pZCB0ZXN0U2ltcGxlTm9kZVRocmVlVmFsdWVzKCkgew0KKyAgICAgICAgZGVmIGIgPSBuZXcgU3Bvb2ZGYWN0b3J5QnVpbGRlcigpDQorICAgICAgICBzaG91bGRGYWlsKE1pc3NpbmdNZXRob2RFeGNlcHRpb24sIHtkZWYgbm9kZSA9IGIuZm9vKCdhcmcxJywgJ2FyZzInLCAnYXJnMycpIH0pDQorICAgIH0NCisNCisgICAgdm9pZCB0ZXN0U2ltcGxlTm9kZUZvdXJWYWx1ZXMoKSB7DQorICAgICAgICBkZWYgYiA9IG5ldyBTcG9vZkZhY3RvcnlCdWlsZGVyKCkNCisgICAgICAgIHNob3VsZEZhaWwoTWlzc2luZ01ldGhvZEV4Y2VwdGlvbiwge2RlZiBub2RlID0gYi5mb28oJ2FyZzEnLCAnYXJnMicsICdhcmczJywgJ2FyZzQnKSB9KQ0KKyAgICB9DQorDQorICAgIHZvaWQgdGVzdE5lc3RlZE1ldGhvZENhbGxzUmVzb2x1dGlvbigpIHsNCisgICAgICAgIGRlZiBiID0gbmV3IFNwb29mRmFjdG9yeUJ1aWxkZXIoKQ0KKyAgICAgICAgYi5vdXRlc3Qgew0KKyAgICAgICAgICAgIGIub3V0ZXIgew0KKyAgICAgICAgICAgICAgICBuZXN0ZWRCdWlsZGVyQ2FsbChiKQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGFzc2VydCBiLmxvZy5jb250YWlucygnaW5uZXInKSANCisgICAgfQ0KKw0KKyAgICB2b2lkIG5lc3RlZEJ1aWxkZXJDYWxsKGJ1aWxkZXIpIHsNCisgICAgICAgIGJ1aWxkZXIuaW5uZXIoKQ0KKyAgICB9DQorDQorICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisNCisgICAgdm9pZCB0ZXN0TmVzdGVkQnVpbGRlclNpbXBsZU5vZGUoKSB7DQorICAgICAgICBkZWYgbiA9IG5ldyBTcG9vZkZhY3RvcnlCdWlsZGVyKCkNCisgICAgICAgIGRlZiBiID0gbmV3IFNwb29mRmFjdG9yeUJ1aWxkZXIocHJveHlCdWlsZGVyOm4pDQorICAgICAgICBhc3NlcnQgYi5sb2cgPT0gW10NCisgICAgICAgIGFzc2VydCBuLmxvZyA9PSBbXQ0KKyAgICAgICAgZGVmIG5vZGUgPSBiLmZvbygpDQorICAgICAgICBhc3NlcnQgYi5sb2cgPT0gW10NCisgICAgICAgIGFzc2VydCBuLmxvZyA9PSBbICAnbmV3X2luc3RhbmNlJywnZm9vJywgbnVsbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnaGFuZGxlX25vZGVfYXR0cmlidXRlcycsIG5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25vZGVfY29tcGxldGVkJyxudWxsLCBub2RlLCANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAncG9zdF9ub2RlX2NvbXBsZXRpb24nLG51bGwsIG5vZGUNCisgICAgICAgICAgICAgICAgICAgICAgICBdDQorICAgIH0NCisNCisgICAgdm9pZCB0ZXN0TmVzdGVkQnVpbGRlclNpbXBsZU5vZGVXaXRoVmFsdWUoKSB7DQorICAgICAgICBkZWYgbiA9IG5ldyBTcG9vZkZhY3RvcnlCdWlsZGVyKCkNCisgICAgICAgIGRlZiBiID0gbmV3IFNwb29mRmFjdG9yeUJ1aWxkZXIocHJveHlCdWlsZGVyOm4pDQorICAgICAgICBkZWYgbm9kZSA9IGIuZm9vKCd2YWx1ZScpDQorICAgICAgICBhc3NlcnQgYi5sb2cgPT0gW10NCisgICAgICAgIGFzc2VydCBuLmxvZyA9PSBbICAnbmV3X2luc3RhbmNlJywnZm9vJywgJ3ZhbHVlJywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnaGFuZGxlX25vZGVfYXR0cmlidXRlcycsIG5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25vZGVfY29tcGxldGVkJyxudWxsLG5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Bvc3Rfbm9kZV9jb21wbGV0aW9uJyxudWxsLCBub2RlDQorICAgICAgICAgICAgICAgICAgICAgICAgXQ0KKyAgICB9DQorDQorICAgIHZvaWQgdGVzdE5lc3RlZEJ1aWxkZXJTaW1wbGVOb2RlV2l0aE9uZUF0dHJpYnV0ZSgpIHsNCisgICAgICAgIGRlZiBuID0gbmV3IFNwb29mRmFjdG9yeUJ1aWxkZXIoKQ0KKyAgICAgICAgZGVmIGIgPSBuZXcgU3Bvb2ZGYWN0b3J5QnVpbGRlcihwcm94eUJ1aWxkZXI6bikNCisgICAgICAgIGRlZiBub2RlID0gYi5mb28obmFtZTondmFsdWUnKQ0KKyAgICAgICAgYXNzZXJ0IGIubG9nID09IFtdDQorICAgICAgICBhc3NlcnQgbi5sb2cgPT0gWw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICduZXdfaW5zdGFuY2UnLCdmb28nLG51bGwsJ25hbWUnLCd2YWx1ZScsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hhbmRsZV9ub2RlX2F0dHJpYnV0ZXMnLG5vZGUsJ25hbWUnLCd2YWx1ZScsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdub2RlX2NvbXBsZXRlZCcsbnVsbCwgbm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAncG9zdF9ub2RlX2NvbXBsZXRpb24nLG51bGwsIG5vZGUgDQorICAgICAgICAgICAgICAgICAgICAgICAgXQ0KKyAgICB9DQorDQorICAgIHZvaWQgdGVzdE5lc3RlZEJ1aWxkZXJTaW1wbGVOb2RlV2l0aENsb3N1cmUoKSB7DQorICAgICAgICBkZWYgbiA9IG5ldyBTcG9vZkZhY3RvcnlCdWlsZGVyKCkNCisgICAgICAgIGRlZiBiID0gbmV3IFNwb29mRmFjdG9yeUJ1aWxkZXIocHJveHlCdWlsZGVyOm4pDQorICAgICAgICBiLmZvbygpew0KKyAgICAgICAgICAgIGIuYmFyKCkNCisgICAgICAgIH0NCisgICAgICAgIGFzc2VydCBiLmxvZyA9PSBbXQ0KKyAgICAgICAgYXNzZXJ0IG4ubG9nID09IFsNCisgICAgICAgICAgICAnbmV3X2luc3RhbmNlJywnZm9vJyxudWxsLA0KKyAgICAgICAgICAgICdoYW5kbGVfbm9kZV9hdHRyaWJ1dGVzJywneCcsDQorICAgICAgICAgICAgICAgICduZXdfaW5zdGFuY2UnLCdiYXInLG51bGwsDQorICAgICAgICAgICAgICAgICdoYW5kbGVfbm9kZV9hdHRyaWJ1dGVzJywneCcsDQorICAgICAgICAgICAgJ3NldF9wYXJlbnQnLCAneCcsICd4JywNCisgICAgICAgICAgICAnc2V0X2NoaWxkJywgJ3gnLCAneCcsDQorICAgICAgICAgICAgICAgICdub2RlX2NvbXBsZXRlZCcsJ3gnLCd4JywNCisgICAgICAgICAgICAgICAgJ3Bvc3Rfbm9kZV9jb21wbGV0aW9uJywgJ3gnLCAneCcsDQorICAgICAgICAgICAgJ25vZGVfY29tcGxldGVkJyxudWxsLCd4JywNCisgICAgICAgICAgICAncG9zdF9ub2RlX2NvbXBsZXRpb24nLG51bGwsICd4Jw0KKyAgICAgICAgICAgIF0NCisgICAgfQ0KKw0KKyAgICB2b2lkIHRlc3ROZXN0ZWRCdWlsZGVyU2ltcGxlTm9kZVdpdGhPbmVBdHRyaWJ1dGVBbmRWYWx1ZSgpIHsNCisgICAgICAgIGRlZiBuID0gbmV3IFNwb29mRmFjdG9yeUJ1aWxkZXIoKQ0KKyAgICAgICAgZGVmIGIgPSBuZXcgU3Bvb2ZGYWN0b3J5QnVpbGRlcihwcm94eUJ1aWxkZXI6bikNCisgICAgICAgIGRlZiBub2RlID0gYi5mb28oYmFyOidiYXonLCAndmFsdWUnKQ0KKyAgICAgICAgYXNzZXJ0IGIubG9nID09IFtdDQorICAgICAgICBhc3NlcnQgbi5sb2cgPT0gWw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ25ld19pbnN0YW5jZScsICdmb28nLCAndmFsdWUnLCAnYmFyJywnYmF6JywgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAnaGFuZGxlX25vZGVfYXR0cmlidXRlcycsbm9kZSwnYmFyJywnYmF6JywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICdub2RlX2NvbXBsZXRlZCcsbnVsbCxub2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Bvc3Rfbm9kZV9jb21wbGV0aW9uJyxudWxsLCBub2RlDQorICAgICAgICAgICAgICAgICAgICAgICAgXQ0KKyAgICB9DQorDQorICAgIHZvaWQgdGVzdE5lc3RlZEJ1aWxkZXJTaW1wbGVOb2RlV2l0aFZhbHVlQW5kT25lQXR0cmlidXRlKCkgew0KKyAgICAgICAgZGVmIG4gPSBuZXcgU3Bvb2ZGYWN0b3J5QnVpbGRlcigpDQorICAgICAgICBkZWYgYiA9IG5ldyBTcG9vZkZhY3RvcnlCdWlsZGVyKHByb3h5QnVpbGRlcjpuKQ0KKyAgICAgICAgZGVmIG5vZGUgPSBiLmZvbygndmFsdWUnLCBiYXI6J2JheicpDQorICAgICAgICBhc3NlcnQgYi5sb2cgPT0gW10NCisgICAgICAgIGFzc2VydCBuLmxvZyA9PSBbDQorICAgICAgICAgICAgICAgICAgICAgICAgICAnbmV3X2luc3RhbmNlJywgJ2ZvbycsICd2YWx1ZScsICdiYXInLCdiYXonLCANCisgICAgICAgICAgICAgICAgICAgICAgICAgICdoYW5kbGVfbm9kZV9hdHRyaWJ1dGVzJyxub2RlLCdiYXInLCdiYXonLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ25vZGVfY29tcGxldGVkJyxudWxsLG5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAncG9zdF9ub2RlX2NvbXBsZXRpb24nLG51bGwsIG5vZGUNCisgICAgICAgICAgICAgICAgICAgICAgICBdDQorICAgIH0NCisNCisgICAgdm9pZCB0ZXN0TmVzdGVkQnVpbGRlclNpbXBsZU5vZGVXaXRoT25lQXR0cmlidXRlQW5kVmFsdWVBbmRDbG9zdXJlKCkgew0KKyAgICAgICAgZGVmIG4gPSBuZXcgU3Bvb2ZGYWN0b3J5QnVpbGRlcigpDQorICAgICAgICBkZWYgYiA9IG5ldyBTcG9vZkZhY3RvcnlCdWlsZGVyKHByb3h5QnVpbGRlcjpuKQ0KKyAgICAgICAgZGVmIG5vZGUgPSBiLmZvbyhiYXI6J2JheicsICd2YWx1ZScpIHsgMSB9DQorICAgICAgICBhc3NlcnQgYi5sb2cgPT0gW10NCisgICAgICAgIGFzc2VydCBuLmxvZyA9PSBbDQorICAgICAgICAgICAgICAgICAgICAgICAgICAnbmV3X2luc3RhbmNlJywgJ2ZvbycsICd2YWx1ZScsICdiYXInLCdiYXonLCANCisgICAgICAgICAgICAgICAgICAgICAgICAgICdoYW5kbGVfbm9kZV9hdHRyaWJ1dGVzJyxub2RlLCdiYXInLCdiYXonLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ25vZGVfY29tcGxldGVkJyxudWxsLG5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAncG9zdF9ub2RlX2NvbXBsZXRpb24nLG51bGwsIG5vZGUNCisgICAgICAgICAgICAgICAgICAgICAgICBdDQorICAgIH0NCisNCisgICAgdm9pZCB0ZXN0TmVzdGVkQnVpbGRlclNpbXBsZU5vZGVXaXRoVmFsdWVBbmRPbmVBdHRyaWJ1dGVBbmRDbG9zdXJlKCkgew0KKyAgICAgICAgZGVmIG4gPSBuZXcgU3Bvb2ZGYWN0b3J5QnVpbGRlcigpDQorICAgICAgICBkZWYgYiA9IG5ldyBTcG9vZkZhY3RvcnlCdWlsZGVyKHByb3h5QnVpbGRlcjpuKQ0KKyAgICAgICAgZGVmIG5vZGUgPSBiLmZvbygndmFsdWUnLCBiYXI6J2JheicpIHsgMSB9DQorICAgICAgICBhc3NlcnQgYi5sb2cgPT0gW10NCisgICAgICAgIGFzc2VydCBuLmxvZyA9PSBbDQorICAgICAgICAgICAgICAgICAgICAgICAgICAnbmV3X2luc3RhbmNlJywgJ2ZvbycsICd2YWx1ZScsICdiYXInLCdiYXonLCANCisgICAgICAgICAgICAgICAgICAgICAgICAgICdoYW5kbGVfbm9kZV9hdHRyaWJ1dGVzJyxub2RlLCdiYXInLCdiYXonLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ25vZGVfY29tcGxldGVkJyxudWxsLG5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAncG9zdF9ub2RlX2NvbXBsZXRpb24nLG51bGwsIG5vZGUNCisgICAgICAgICAgICAgICAgICAgICAgICBdDQorICAgIH0NCisNCisgICAgdm9pZCB0ZXN0V2l0aEJ1aWxkZXIoKSB7DQorICAgICAgICBkZWYgYiA9IG5ldyBTcG9vZkZhY3RvcnlCdWlsZGVyKCkNCisgICAgICAgIGRlZiBjID0gbmV3IFNwb29mRmFjdG9yeUJ1aWxkZXIoKQ0KKyAgICAgICAgZGVmIGZhY3RvcnkgPSBuZXcgWEZhY3RvcnkoIGJ1aWxkZXI6YyApDQorICAgICAgICBjLnJlZ2lzdGVyRmFjdG9yeSggImZvb3oiLCBmYWN0b3J5ICkNCisgICAgICAgIGMucmVnaXN0ZXJGYWN0b3J5KCAiYmF6IiwgZmFjdG9yeSApDQorICAgICAgICBiLmZvbygpew0KKyAgICAgICAgICAgIGJhcigpDQorICAgICAgICAgICAgd2l0aEJ1aWxkZXIoYyl7DQorICAgICAgICAgICAgICAgZm9veigpew0KKyAgICAgICAgICAgICAgICAgIGJheigpDQorICAgICAgICAgICAgICAgfSAgIA0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIGFzc2VydCBiLmxvZyA9PSBbDQorICAgICAgICAgICAgJ25ld19pbnN0YW5jZScsJ2ZvbycsbnVsbCwNCisgICAgICAgICAgICAnaGFuZGxlX25vZGVfYXR0cmlidXRlcycsJ3gnLA0KKyAgICAgICAgICAgICAgICAnbmV3X2luc3RhbmNlJywnYmFyJyxudWxsLA0KKyAgICAgICAgICAgICAgICAnaGFuZGxlX25vZGVfYXR0cmlidXRlcycsJ3gnLA0KKyAgICAgICAgICAgICdzZXRfcGFyZW50JywgJ3gnLCAneCcsDQorICAgICAgICAgICAgJ3NldF9jaGlsZCcsICd4JywgJ3gnLA0KKyAgICAgICAgICAgICAgICAnbm9kZV9jb21wbGV0ZWQnLCd4JywneCcsDQorICAgICAgICAgICAgICAgICdwb3N0X25vZGVfY29tcGxldGlvbicsICd4JywgJ3gnLA0KKyAgICAgICAgICAgICdub2RlX2NvbXBsZXRlZCcsbnVsbCwneCcsDQorICAgICAgICAgICAgJ3Bvc3Rfbm9kZV9jb21wbGV0aW9uJyxudWxsLCAneCcNCisgICAgICAgICAgICBdDQorICAgICAgICBhc3NlcnQgYy5sb2cgPT0gWw0KKyAgICAgICAgICAgICduZXdfaW5zdGFuY2UnLCdmb296JyxudWxsLA0KKyAgICAgICAgICAgICdoYW5kbGVfbm9kZV9hdHRyaWJ1dGVzJywneCcsDQorICAgICAgICAgICAgICAgICduZXdfaW5zdGFuY2UnLCdiYXonLG51bGwsDQorICAgICAgICAgICAgICAgICdoYW5kbGVfbm9kZV9hdHRyaWJ1dGVzJywneCcsDQorICAgICAgICAgICAgJ3NldF9wYXJlbnQnLCAneCcsICd4JywNCisgICAgICAgICAgICAnc2V0X2NoaWxkJywgJ3gnLCAneCcsDQorICAgICAgICAgICAgICAgICdub2RlX2NvbXBsZXRlZCcsJ3gnLCd4JywNCisgICAgICAgICAgICAgICAgJ3Bvc3Rfbm9kZV9jb21wbGV0aW9uJywgJ3gnLCAneCcsDQorICAgICAgICAgICAgJ25vZGVfY29tcGxldGVkJyxudWxsLCd4JywNCisgICAgICAgICAgICAncG9zdF9ub2RlX2NvbXBsZXRpb24nLG51bGwsICd4Jw0KKyAgICAgICAgICAgIF0NCisgICAgfQ0KKw0KKyAgICB2b2lkIHRlc3RXaXRoQnVpbGRlckFuZE5hbWUoKSB7DQorICAgICAgICBkZWYgYiA9IG5ldyBTcG9vZkZhY3RvcnlCdWlsZGVyKCkNCisgICAgICAgIGRlZiBjID0gbmV3IFNwb29mRmFjdG9yeUJ1aWxkZXIoKQ0KKyAgICAgICAgZGVmIGZhY3RvcnkgPSBuZXcgWEZhY3RvcnkoIGJ1aWxkZXI6YyApDQorICAgICAgICBjLnJlZ2lzdGVyRmFjdG9yeSggImZvb3oiLCBmYWN0b3J5ICkNCisgICAgICAgIGMucmVnaXN0ZXJGYWN0b3J5KCAiYmF6IiwgZmFjdG9yeSApDQorICAgICAgICBiLmZvbygpew0KKyAgICAgICAgICAgIGJhcigpDQorICAgICAgICAgICAgd2l0aEJ1aWxkZXIoYywnZm9vJyl7DQorICAgICAgICAgICAgICAgZm9veigpew0KKyAgICAgICAgICAgICAgICAgIGJheigpDQorICAgICAgICAgICAgICAgfSAgIA0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIGFzc2VydCBiLmxvZyA9PSBbDQorICAgICAgICAgICAgJ25ld19pbnN0YW5jZScsJ2ZvbycsbnVsbCwNCisgICAgICAgICAgICAnaGFuZGxlX25vZGVfYXR0cmlidXRlcycsJ3gnLA0KKyAgICAgICAgICAgICAgICAnbmV3X2luc3RhbmNlJywnYmFyJyxudWxsLA0KKyAgICAgICAgICAgICAgICAnaGFuZGxlX25vZGVfYXR0cmlidXRlcycsJ3gnLA0KKyAgICAgICAgICAgICAgICAnc2V0X3BhcmVudCcsICd4JywgJ3gnLA0KKyAgICAgICAgICAgICAgICAnc2V0X2NoaWxkJywgJ3gnLCAneCcsDQorICAgICAgICAgICAgICAgICdub2RlX2NvbXBsZXRlZCcsJ3gnLCd4JywNCisgICAgICAgICAgICAgICAgJ3Bvc3Rfbm9kZV9jb21wbGV0aW9uJywgJ3gnLCAneCcsDQorICAgICAgICAgICAgICAgICduZXdfaW5zdGFuY2UnLCdmb28nLCd4JywNCisgICAgICAgICAgICAgICAgJ2hhbmRsZV9ub2RlX2F0dHJpYnV0ZXMnLCd4JywNCisgICAgICAgICAgICAgICAgJ3NldF9wYXJlbnQnLCAneCcsICd4JywNCisgICAgICAgICAgICAgICAgJ3NldF9jaGlsZCcsICd4JywgJ3gnLA0KKyAgICAgICAgICAgICAgICAnbm9kZV9jb21wbGV0ZWQnLCd4JywneCcsDQorICAgICAgICAgICAgICAgICdwb3N0X25vZGVfY29tcGxldGlvbicsICd4JywgJ3gnLA0KKyAgICAgICAgICAgICdub2RlX2NvbXBsZXRlZCcsbnVsbCwneCcsDQorICAgICAgICAgICAgJ3Bvc3Rfbm9kZV9jb21wbGV0aW9uJyxudWxsLCAneCcNCisgICAgICAgICAgICBdDQorICAgICAgICBhc3NlcnQgYy5sb2cgPT0gWw0KKyAgICAgICAgICAgICduZXdfaW5zdGFuY2UnLCdmb296JyxudWxsLA0KKyAgICAgICAgICAgICdoYW5kbGVfbm9kZV9hdHRyaWJ1dGVzJywneCcsDQorICAgICAgICAgICAgICAgICduZXdfaW5zdGFuY2UnLCdiYXonLG51bGwsDQorICAgICAgICAgICAgICAgICdoYW5kbGVfbm9kZV9hdHRyaWJ1dGVzJywneCcsDQorICAgICAgICAgICAgICAgICdzZXRfcGFyZW50JywgJ3gnLCAneCcsDQorICAgICAgICAgICAgICAgICdzZXRfY2hpbGQnLCAneCcsICd4JywNCisgICAgICAgICAgICAgICAgJ25vZGVfY29tcGxldGVkJywneCcsJ3gnLA0KKyAgICAgICAgICAgICAgICAncG9zdF9ub2RlX2NvbXBsZXRpb24nLCAneCcsICd4JywNCisgICAgICAgICAgICAnbm9kZV9jb21wbGV0ZWQnLG51bGwsJ3gnLA0KKyAgICAgICAgICAgICdwb3N0X25vZGVfY29tcGxldGlvbicsbnVsbCwgJ3gnDQorICAgICAgICAgICAgXQ0KKyAgICB9DQorDQorICAgIHZvaWQgdGVzdFdpdGhCdWlsZGVyQW5kTmFtZUFuZEF0dHJpYnV0ZXMoKSB7DQorICAgICAgICBkZWYgYiA9IG5ldyBTcG9vZkZhY3RvcnlCdWlsZGVyKCkNCisgICAgICAgIGRlZiBjID0gbmV3IFNwb29mRmFjdG9yeUJ1aWxkZXIoKQ0KKyAgICAgICAgZGVmIGZhY3RvcnkgPSBuZXcgWEZhY3RvcnkoIGJ1aWxkZXI6YyApDQorICAgICAgICBjLnJlZ2lzdGVyRmFjdG9yeSggImZvb3oiLCBmYWN0b3J5ICkNCisgICAgICAgIGMucmVnaXN0ZXJGYWN0b3J5KCAiYmF6IiwgZmFjdG9yeSApDQorICAgICAgICBiLmZvbygpew0KKyAgICAgICAgICAgIGJhcigpDQorICAgICAgICAgICAgd2l0aEJ1aWxkZXIoYywnZm9vJyxiYXI6J2Jheicpew0KKyAgICAgICAgICAgICAgIGZvb3ooKXsNCisgICAgICAgICAgICAgICAgICBiYXooKQ0KKyAgICAgICAgICAgICAgIH0gICANCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBhc3NlcnQgYi5sb2cgPT0gWw0KKyAgICAgICAgICAgICduZXdfaW5zdGFuY2UnLCdmb28nLG51bGwsDQorICAgICAgICAgICAgJ2hhbmRsZV9ub2RlX2F0dHJpYnV0ZXMnLCd4JywNCisgICAgICAgICAgICAgICAgJ25ld19pbnN0YW5jZScsJ2JhcicsbnVsbCwNCisgICAgICAgICAgICAgICAgJ2hhbmRsZV9ub2RlX2F0dHJpYnV0ZXMnLCd4JywNCisgICAgICAgICAgICAgICAgJ3NldF9wYXJlbnQnLCAneCcsICd4JywNCisgICAgICAgICAgICAgICAgJ3NldF9jaGlsZCcsICd4JywgJ3gnLA0KKyAgICAgICAgICAgICAgICAnbm9kZV9jb21wbGV0ZWQnLCd4JywneCcsDQorICAgICAgICAgICAgICAgICdwb3N0X25vZGVfY29tcGxldGlvbicsICd4JywgJ3gnLA0KKyAgICAgICAgICAgICAgICAnbmV3X2luc3RhbmNlJywnZm9vJywneCcsJ2JhcicsJ2JheicsDQorICAgICAgICAgICAgICAgICdoYW5kbGVfbm9kZV9hdHRyaWJ1dGVzJywneCcsJ2JhcicsJ2JheicsDQorICAgICAgICAgICAgICAgICdzZXRfcGFyZW50JywgJ3gnLCAneCcsDQorICAgICAgICAgICAgICAgICdzZXRfY2hpbGQnLCAneCcsICd4JywNCisgICAgICAgICAgICAgICAgJ25vZGVfY29tcGxldGVkJywneCcsJ3gnLA0KKyAgICAgICAgICAgICAgICAncG9zdF9ub2RlX2NvbXBsZXRpb24nLCAneCcsICd4JywNCisgICAgICAgICAgICAnbm9kZV9jb21wbGV0ZWQnLG51bGwsJ3gnLA0KKyAgICAgICAgICAgICdwb3N0X25vZGVfY29tcGxldGlvbicsbnVsbCwgJ3gnDQorICAgICAgICAgICAgXQ0KKyAgICAgICAgYXNzZXJ0IGMubG9nID09IFsNCisgICAgICAgICAgICAnbmV3X2luc3RhbmNlJywnZm9veicsbnVsbCwNCisgICAgICAgICAgICAnaGFuZGxlX25vZGVfYXR0cmlidXRlcycsJ3gnLA0KKyAgICAgICAgICAgICAgICAnbmV3X2luc3RhbmNlJywnYmF6JyxudWxsLA0KKyAgICAgICAgICAgICAgICAnaGFuZGxlX25vZGVfYXR0cmlidXRlcycsJ3gnLA0KKyAgICAgICAgICAgICAgICAnc2V0X3BhcmVudCcsICd4JywgJ3gnLA0KKyAgICAgICAgICAgICAgICAnc2V0X2NoaWxkJywgJ3gnLCAneCcsDQorICAgICAgICAgICAgICAgICdub2RlX2NvbXBsZXRlZCcsJ3gnLCd4JywNCisgICAgICAgICAgICAgICAgJ3Bvc3Rfbm9kZV9jb21wbGV0aW9uJywgJ3gnLCAneCcsDQorICAgICAgICAgICAgJ25vZGVfY29tcGxldGVkJyxudWxsLCd4JywNCisgICAgICAgICAgICAncG9zdF9ub2RlX2NvbXBsZXRpb24nLG51bGwsICd4Jw0KKyAgICAgICAgICAgIF0NCisgICAgfQ0KKw0KKyAgICB2b2lkIHRlc3RXaXRoQnVpbGRlckFuZFRocm93QW5FeGNlcHRpb24oKSB7DQorICAgICAgICBkZWYgYiA9IG5ldyBTcG9vZkZhY3RvcnlCdWlsZGVyKCkNCisgICAgICAgIGRlZiBjID0gbmV3IFNwb29mRmFjdG9yeUJ1aWxkZXIoKQ0KKw0KKyAgICAgICAgc2hvdWxkRmFpbCggUnVudGltZUV4Y2VwdGlvbiApIHsNCisgICAgICAgICAgICBiLmZvbygpew0KKyAgICAgICAgICAgICAgICBiYXIoKQ0KKyAgICAgICAgICAgICAgICB3aXRoQnVpbGRlcihjKXsNCisgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImV4cGVjdGVkIikNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIGFzc2VydCBiLmxvZyA9PSBbDQorICAgICAgICAgICAgJ25ld19pbnN0YW5jZScsJ2ZvbycsbnVsbCwNCisgICAgICAgICAgICAnaGFuZGxlX25vZGVfYXR0cmlidXRlcycsJ3gnLA0KKyAgICAgICAgICAgICAgICAnbmV3X2luc3RhbmNlJywnYmFyJyxudWxsLA0KKyAgICAgICAgICAgICAgICAnaGFuZGxlX25vZGVfYXR0cmlidXRlcycsJ3gnLA0KKyAgICAgICAgICAgICAgICAnc2V0X3BhcmVudCcsICd4JywgJ3gnLA0KKyAgICAgICAgICAgICAgICAnc2V0X2NoaWxkJywgJ3gnLCAneCcsDQorICAgICAgICAgICAgICAgICdub2RlX2NvbXBsZXRlZCcsJ3gnLCd4JywNCisgICAgICAgICAgICAgICAgJ3Bvc3Rfbm9kZV9jb21wbGV0aW9uJywgJ3gnLCAneCcvKiwNCisgICAgICAgICAgICAnbm9kZV9jb21wbGV0ZWQnLG51bGwsJ3gnLA0KKyAgICAgICAgICAgICdwb3N0X25vZGVfY29tcGxldGlvbicsbnVsbCwgJ3gnKi8NCisgICAgICAgICAgICAvLyBub2RlIGZvbygpIHdhcyBub3QgY29tcGxldGVkIHN1Y2Nlc3NmdWx5DQorICAgICAgICAgICAgXQ0KKyAgICAgICAgYXNzZXJ0IGMubG9nID09IFtdDQorICAgIH0NCit9DQorDQorLyoqDQorICAgIFRoZSBTcG9vZkZhY3RvcnlCdWlsZGVyIGlzIGEgc2FtcGxlIGluc3RhbmNlIG9mIHRoZSBhYnN0cmFjdCBGYWN0b3J5QnVpbGRlclN1cHBvcnQgY2xhc3MNCisgICAgdGhhdCBkb2VzIG5vdGhpbmcgYnV0IGxvZ2dpbmcgaG93IGl0IHdhcyBjYWxsZWQsIHJldHVybmluZyAneCcgZm9yIGVhY2ggbm9kZS4NCisqKi8NCitjbGFzcyBTcG9vZkZhY3RvcnlCdWlsZGVyIGV4dGVuZHMgRmFjdG9yeUJ1aWxkZXJTdXBwb3J0ew0KKyAgICBkZWYgbG9nID0gW10NCisNCisgICAgU3Bvb2ZGYWN0b3J5QnVpbGRlcigpIHsNCisgICAgICAgZGVmIGZhY3RvcnkgPSBuZXcgWEZhY3RvcnkoIGJ1aWxkZXI6dGhpcyApDQorICAgICAgIHJlZ2lzdGVyRmFjdG9yeSggImZvbyIsIGZhY3RvcnkgKQ0KKyAgICAgICByZWdpc3RlckZhY3RvcnkoICJiYXIiLCBmYWN0b3J5ICkNCisgICAgICAgcmVnaXN0ZXJGYWN0b3J5KCAib3V0ZXN0IiwgZmFjdG9yeSApDQorICAgICAgIHJlZ2lzdGVyRmFjdG9yeSggIm91dGVyIiwgZmFjdG9yeSApDQorICAgICAgIHJlZ2lzdGVyRmFjdG9yeSggImlubmVyIiwgZmFjdG9yeSApDQorICAgIH0NCisgICAgDQorICAgIHByb3RlY3RlZCBPYmplY3QgcG9zdE5vZGVDb21wbGV0aW9uKE9iamVjdCBwYXJlbnQsIE9iamVjdCBub2RlKSB7DQorICAgICAgICBsb2cgPDwgJ3Bvc3Rfbm9kZV9jb21wbGV0aW9uJw0KKyAgICAgICAgbG9nIDw8IHBhcmVudA0KKyAgICAgICAgbG9nIDw8IG5vZGUNCisgICAgICAgIG5vZGUNCisgICAgfQ0KK30NCisNCitjbGFzcyBYRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0RmFjdG9yeSB7DQorICAgIFNwb29mRmFjdG9yeUJ1aWxkZXIgYnVpbGRlcg0KKw0KKyAgICBwdWJsaWMgT2JqZWN0IG5ld0luc3RhbmNlKCBGYWN0b3J5QnVpbGRlclN1cHBvcnQgYnVpbGRlciwgT2JqZWN0IG5hbWUsIE9iamVjdCB2YWx1ZSwgTWFwIHByb3BlcnRpZXMgKQ0KKyAgICAgICAgICAgIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsNCisgICAgICAgIGJ1aWxkZXIubG9nIDw8ICduZXdfaW5zdGFuY2UnDQorICAgICAgICBidWlsZGVyLmxvZyA8PCBuYW1lDQorICAgICAgICBidWlsZGVyLmxvZyA8PCB2YWx1ZQ0KKyAgICAgICAgcHJvcGVydGllcy5lYWNoe2VudHJ5IC0+IGJ1aWxkZXIubG9nIDw8IGVudHJ5LmtleTsgYnVpbGRlci5sb2cgPDwgZW50cnkudmFsdWV9DQorICAgICAgICByZXR1cm4gJ3gnDQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gb25IYW5kbGVOb2RlQXR0cmlidXRlcyggRmFjdG9yeUJ1aWxkZXJTdXBwb3J0IGJ1aWxkZXIsIE9iamVjdCBub2RlLCBNYXAgYXR0cmlidXRlcyApIHsNCisgICAgICAgIGJ1aWxkZXIubG9nIDw8ICdoYW5kbGVfbm9kZV9hdHRyaWJ1dGVzJw0KKyAgICAgICAgYnVpbGRlci5sb2cgPDwgbm9kZQ0KKyAgICAgICAgYXR0cmlidXRlcy5lYWNoe2VudHJ5IC0+IGJ1aWxkZXIubG9nIDw8IGVudHJ5LmtleTsgYnVpbGRlci5sb2cgPDwgZW50cnkudmFsdWV9DQorICAgICAgICByZXR1cm4gZmFsc2UgDQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgb25Ob2RlQ29tcGxldGVkKCBGYWN0b3J5QnVpbGRlclN1cHBvcnQgYnVpbGRlciwgT2JqZWN0IHBhcmVudCwgT2JqZWN0IG5vZGUgKSB7DQorICAgICAgICBidWlsZGVyLmxvZyA8PCAnbm9kZV9jb21wbGV0ZWQnDQorICAgICAgICBidWlsZGVyLmxvZyA8PCBwYXJlbnQNCisgICAgICAgIGJ1aWxkZXIubG9nIDw8IG5vZGUNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnQoIEZhY3RvcnlCdWlsZGVyU3VwcG9ydCBidWlsZGVyLCBPYmplY3QgcGFyZW50LCBPYmplY3QgY2hpbGQgKSB7DQorICAgICAgICBidWlsZGVyLmxvZyA8PCAic2V0X3BhcmVudCINCisgICAgICAgIGJ1aWxkZXIubG9nIDw8IHBhcmVudA0KKyAgICAgICAgYnVpbGRlci5sb2cgPDwgY2hpbGQNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXRDaGlsZCggRmFjdG9yeUJ1aWxkZXJTdXBwb3J0IGJ1aWxkZXIsIE9iamVjdCBwYXJlbnQsIE9iamVjdCBjaGlsZCApIHsNCisgICAgICAgIGJ1aWxkZXIubG9nIDw8ICJzZXRfY2hpbGQiDQorICAgICAgICBidWlsZGVyLmxvZyA8PCBwYXJlbnQNCisgICAgICAgIGJ1aWxkZXIubG9nIDw8IGNoaWxkDQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS91dGlsL0ZpbGVOYW1lRmluZGVyVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3V0aWwvRmlsZU5hbWVGaW5kZXJUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjdhNDA0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS91dGlsL0ZpbGVOYW1lRmluZGVyVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwxOSBAQAorcGFja2FnZSBncm9vdnkudXRpbAorCisvKioKKyAgICBNYWtlIHN1cmUgRmlsZU5hbWVGaW5kZXIgdXNlcyBBbnQgZmlsZXNldHMgY29ycmVjdGx5LgorICAgIEBhdXRob3IgRGllcmsgS29lbmlnCisgICAgQGF1dGhvciBQYXVsIEtpbmcKKyovCitjbGFzcyBmaWxlTmFtZUZpbmRlclRlc3QgZXh0ZW5kcyBHcm9vdnlMb2dUZXN0Q2FzZSB7CisKKyAgICB2b2lkIHRlc3RGaWxlc0luVGVzdERpckFyZVBpY2tlZFVwKCkgeworICAgICAgICBkZWYgZmluZGVyID0gbmV3IEZpbGVOYW1lRmluZGVyKCkKKyAgICAgICAgZGVmIGZpbGVzMSA9IGZpbmRlci5nZXRGaWxlTmFtZXMoJ3NyYy90ZXN0JywnKicpCisgICAgICAgIGFzc2VydCBmaWxlczEsICdUaGVyZSBzaG91bGQgYmUgZmlsZXMgaW4gc3JjL3Rlc3QnCisgICAgICAgIC8vIG5vdyBjb2xsZWN0IGFsbCB0aG9zZSBub3Qgc3RhcnRpbmcgd2l0aCB0aGUgbGV0dGVyICdKJworICAgICAgICBkZWYgZmlsZXMyID0gZmluZGVyLmdldEZpbGVOYW1lcygnc3JjL3Rlc3QnLCcqJywnSionKQorICAgICAgICBhc3NlcnQgZmlsZXMyLCAnVGhlcmUgc2hvdWxkIGJlIGZpbGVzIGluIHNyYy90ZXN0JworICAgICAgICBhc3NlcnQgZmlsZXMxLnNpemUoKSA+IGZpbGVzMi5zaXplKCkKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3V0aWwvR3Jvb3Z5Q29sbGVjdGlvbnNTdGFySW1wb3J0VGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3V0aWwvR3Jvb3Z5Q29sbGVjdGlvbnNTdGFySW1wb3J0VGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAxOTdjYgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvdXRpbC9Hcm9vdnlDb2xsZWN0aW9uc1N0YXJJbXBvcnRUZXN0Lmdyb292eQpAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgZ3Jvb3Z5LnV0aWwKKworaW1wb3J0IHN0YXRpYyBncm9vdnkudXRpbC5Hcm9vdnlDb2xsZWN0aW9ucy4qCisKKy8qKgorKiBUZXN0cyBHcm9vdnlDb2xsZWN0aW9ucworKgorKiBAYXV0aG9yIFBhdWwgS2luZworKi8KK3B1YmxpYyBjbGFzcyBHcm9vdnlDb2xsZWN0aW9uc1N0YXJJbXBvcnRUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCB0ZXN0Q29tYmluYXRpb25zKCkgeworICAgICAgICAvLyB1c2UgU2V0cyBiZWNhdXNlIHdlIGRvbid0IGNhcmUgYWJvdXQgb3JkZXIKKyAgICAgICAgU2V0IGV4cGVjdGVkID0gW1snYScsIDFdLCBbJ2EnLCAyXSwgWydiJywgMV0sIFsnYicsIDJdXQorICAgICAgICBhc3NlcnQgY29tYmluYXRpb25zKFsnYScsICdiJ10sIFsxLCAyXSkgYXMgU2V0ID09IGV4cGVjdGVkCisgICAgfQorCisgICAgdm9pZCB0ZXN0VHJhbnNwb3NlKCkgeworICAgICAgICBhc3NlcnQgdHJhbnNwb3NlKFsnYScsICdiJ10sIFsxLCAyLCAzXSkgPT0gW1snYScsIDFdLCBbJ2InLCAyXV0KKyAgICB9CisKKyAgICB2b2lkIHRlc3RNaW4oKSB7CisgICAgICAgIGFzc2VydCBtaW4oJ2EnLCAnYicpID09ICdhJworICAgIH0KKworICAgIHZvaWQgdGVzdE1heCgpIHsKKyAgICAgICAgYXNzZXJ0IG1heCgxLCAyLCAzKSA9PSAzCisgICAgfQorCisgICAgdm9pZCB0ZXN0U3VtKCkgeworICAgICAgICBhc3NlcnQgc3VtKDEsIDIsIDMsIDQpID09IDEwCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3V0aWwvR3Jvb3Z5Q29sbGVjdGlvbnNUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvdXRpbC9Hcm9vdnlDb2xsZWN0aW9uc1Rlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NGE4ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3V0aWwvR3Jvb3Z5Q29sbGVjdGlvbnNUZXN0Lmdyb292eQpAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGdyb292eS51dGlsCisKK2ltcG9ydCBzdGF0aWMgR3Jvb3Z5Q29sbGVjdGlvbnMubWluCitpbXBvcnQgc3RhdGljIEdyb292eUNvbGxlY3Rpb25zLm1heAoraW1wb3J0IHN0YXRpYyBHcm9vdnlDb2xsZWN0aW9ucy5jb21iaW5hdGlvbnMKK2ltcG9ydCBzdGF0aWMgR3Jvb3Z5Q29sbGVjdGlvbnMudHJhbnNwb3NlCitpbXBvcnQgc3RhdGljIEdyb292eUNvbGxlY3Rpb25zLnN1bQorCisvKioKKyogVGVzdHMgR3Jvb3Z5Q29sbGVjdGlvbnMKKyoKKyogQGF1dGhvciBQYXVsIEtpbmcKKyovCitwdWJsaWMgY2xhc3MgR3Jvb3Z5Q29sbGVjdGlvbnNUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCB0ZXN0Q29tYmluYXRpb25zKCkgeworICAgICAgICAvLyB1c2UgU2V0cyBiZWNhdXNlIHdlIGRvbid0IGNhcmUgYWJvdXQgb3JkZXIKKyAgICAgICAgU2V0IGV4cGVjdGVkID0gWworICAgICAgICAgICAgICAgICAgICAgICAgWydhJywgMV0sIFsnYScsIDJdLCBbJ2EnLCAzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFsnYicsIDFdLCBbJ2InLCAyXSwgWydiJywgM10KKyAgICAgICAgICAgICAgICBdCisgICAgICAgIENvbGxlY3Rpb24gaW5wdXQgPSBbWydhJywgJ2InXSwgWzEsIDIsIDNdXQorCisgICAgICAgIC8vIG5vcm1hbCB2YXJhcmdzIHZlcnNpb25zIHNob3VsZCBtYXRjaCBPYmplY3RbXQorICAgICAgICBhc3NlcnQgR3Jvb3Z5Q29sbGVjdGlvbnMuY29tYmluYXRpb25zKFsnYScsICdiJ10sIFsxLCAyLCAzXSkgYXMgU2V0ID09IGV4cGVjdGVkCisgICAgICAgIGFzc2VydCBjb21iaW5hdGlvbnMoWydhJywgJ2InXSwgWzEsIDIsIDNdKSBhcyBTZXQgPT0gZXhwZWN0ZWQKKworICAgICAgICAvLyBzcHJlYWQgdmVyc2lvbnMgc2hvdWxkIG1hdGNoIE9iamVjdFtdCisgICAgICAgIGFzc2VydCBHcm9vdnlDb2xsZWN0aW9ucy5jb21iaW5hdGlvbnMoKmlucHV0KSBhcyBTZXQgPT0gZXhwZWN0ZWQKKyAgICAgICAgYXNzZXJ0IGNvbWJpbmF0aW9ucygqaW5wdXQpIGFzIFNldCA9PSBleHBlY3RlZAorCisgICAgICAgIC8vIGNvbGxlY3Rpb24gdmVyc2lvbnMgc2hvdWxkIG1hdGNoIENvbGxlY3Rpb24KKyAgICAgICAgYXNzZXJ0IEdyb292eUNvbGxlY3Rpb25zLmNvbWJpbmF0aW9ucyhpbnB1dCkgYXMgU2V0ID09IGV4cGVjdGVkCisgICAgICAgIGFzc2VydCBjb21iaW5hdGlvbnMoaW5wdXQpIGFzIFNldCA9PSBleHBlY3RlZAorICAgIH0KKworICAgIHZvaWQgdGVzdFRyYW5zcG9zZSgpIHsKKyAgICAgICAgLy8gbm9ybWFsIHZhcmFyZ3MgdmVyc2lvbnMgc2hvdWxkIG1hdGNoIE9iamVjdFtdCisgICAgICAgIGFzc2VydCBHcm9vdnlDb2xsZWN0aW9ucy50cmFuc3Bvc2UoWydhJywgJ2InXSwgWzEsIDIsIDNdKSA9PSBbWydhJywgMV0sIFsnYicsIDJdXQorICAgICAgICBhc3NlcnQgdHJhbnNwb3NlKFsnYScsICdiJ10sIFsxLCAyLCAzXSkgPT0gW1snYScsIDFdLCBbJ2InLCAyXV0KKyAgICAgICAgYXNzZXJ0IEdyb292eUNvbGxlY3Rpb25zLnRyYW5zcG9zZShbMSwgMiwgM10sIFs0LCA1LCA2XSkgPT0gW1sxLCA0XSwgWzIsIDVdLCBbMywgNl1dCisgICAgICAgIGFzc2VydCB0cmFuc3Bvc2UoWzEsIDIsIDNdLCBbNCwgNSwgNl0pID09IFtbMSwgNF0sIFsyLCA1XSwgWzMsIDZdXQorICAgICAgICBhc3NlcnQgR3Jvb3Z5Q29sbGVjdGlvbnMudHJhbnNwb3NlKFsxLCAyLCAzXSwgWzQsIDVdLCBbOV0sIFs2LCA3LCA4XSkgPT0gW1sxLCA0LCA5LCA2XV0KKyAgICAgICAgYXNzZXJ0IHRyYW5zcG9zZShbMSwgMiwgM10sIFs0LCA1XSwgWzldLCBbNiwgNywgOF0pID09IFtbMSwgNCwgOSwgNl1dCisKKyAgICAgICAgLy8gY29sbGVjdGlvbiB2ZXJzaW9ucworICAgICAgICBhc3NlcnQgR3Jvb3Z5Q29sbGVjdGlvbnMudHJhbnNwb3NlKFtbMSwgMiwgM11dKSA9PSBbWzFdLCBbMl0sIFszXV0KKyAgICAgICAgYXNzZXJ0IHRyYW5zcG9zZShbWzEsIDIsIDNdXSkgPT0gW1sxXSwgWzJdLCBbM11dCisgICAgICAgIGFzc2VydCBHcm9vdnlDb2xsZWN0aW9ucy50cmFuc3Bvc2UoW10pID09IFtdCisgICAgICAgIGFzc2VydCB0cmFuc3Bvc2UoW10pID09IFtdCisgICAgfQorCisgICAgdm9pZCB0ZXN0TWluKCkgeworICAgICAgICAvLyBub3JtYWwgdmFyYXJncyB2ZXJzaW9ucyBzaG91bGQgbWF0Y2ggT2JqZWN0W10KKyAgICAgICAgYXNzZXJ0IEdyb292eUNvbGxlY3Rpb25zLm1pbignYScsICdiJykgPT0gJ2EnCisgICAgICAgIGFzc2VydCBtaW4oJ2EnLCAnYicpID09ICdhJworICAgICAgICBhc3NlcnQgR3Jvb3Z5Q29sbGVjdGlvbnMubWluKDEsIDIsIDMpID09IDEKKyAgICAgICAgYXNzZXJ0IG1pbigxLCAyLCAzKSA9PSAxCisKKyAgICAgICAgLy8gY29sbGVjdGlvbiB2ZXJzaW9ucworICAgICAgICBhc3NlcnQgR3Jvb3Z5Q29sbGVjdGlvbnMubWluKFsnYScsICdiJ10pID09ICdhJworICAgICAgICBhc3NlcnQgbWluKFsnYScsICdiJ10pID09ICdhJworICAgICAgICBhc3NlcnQgR3Jvb3Z5Q29sbGVjdGlvbnMubWluKFsxLCAyLCAzXSkgPT0gMQorICAgICAgICBhc3NlcnQgbWluKFsxLCAyLCAzXSkgPT0gMQorICAgIH0KKworICAgIHZvaWQgdGVzdE1heCgpIHsKKyAgICAgICAgLy8gbm9ybWFsIHZhcmFyZ3MgdmVyc2lvbnMgc2hvdWxkIG1hdGNoIE9iamVjdFtdCisgICAgICAgIGFzc2VydCBHcm9vdnlDb2xsZWN0aW9ucy5tYXgoJ2EnLCAnYicpID09ICdiJworICAgICAgICBhc3NlcnQgbWF4KCdhJywgJ2InKSA9PSAnYicKKyAgICAgICAgYXNzZXJ0IEdyb292eUNvbGxlY3Rpb25zLm1heCgxLCAyLCAzKSA9PSAzCisgICAgICAgIGFzc2VydCBtYXgoMSwgMiwgMykgPT0gMworCisgICAgICAgIC8vIGNvbGxlY3Rpb24gdmVyc2lvbnMKKyAgICAgICAgYXNzZXJ0IEdyb292eUNvbGxlY3Rpb25zLm1heChbJ2EnLCAnYiddKSA9PSAnYicKKyAgICAgICAgYXNzZXJ0IG1heChbJ2EnLCAnYiddKSA9PSAnYicKKyAgICAgICAgYXNzZXJ0IEdyb292eUNvbGxlY3Rpb25zLm1heChbMSwgMiwgM10pID09IDMKKyAgICAgICAgYXNzZXJ0IG1heChbMSwgMiwgM10pID09IDMKKyAgICB9CisKKyAgICB2b2lkIHRlc3RTdW0oKSB7CisgICAgICAgIC8vIG5vcm1hbCB2YXJhcmdzIHZlcnNpb25zIHNob3VsZCBtYXRjaCBPYmplY3RbXQorICAgICAgICBhc3NlcnQgR3Jvb3Z5Q29sbGVjdGlvbnMuc3VtKCdhJywgJ2InKSA9PSAnYWInCisgICAgICAgIGFzc2VydCBzdW0oJ2EnLCAnYicpID09ICdhYicKKyAgICAgICAgYXNzZXJ0IEdyb292eUNvbGxlY3Rpb25zLnN1bSgxLCAyLCAzKSA9PSA2CisgICAgICAgIGFzc2VydCBzdW0oMSwgMiwgMykgPT0gNgorCisgICAgICAgIC8vIGNvbGxlY3Rpb24gdmVyc2lvbnMKKyAgICAgICAgYXNzZXJ0IEdyb292eUNvbGxlY3Rpb25zLnN1bShbJ2EnLCAnYiddKSA9PSAnYWInCisgICAgICAgIGFzc2VydCBzdW0oWydhJywgJ2InXSkgPT0gJ2FiJworICAgICAgICBhc3NlcnQgR3Jvb3Z5Q29sbGVjdGlvbnMuc3VtKFsxLCAyLCAzXSkgPT0gNgorICAgICAgICBhc3NlcnQgc3VtKFsxLCAyLCAzXSkgPT0gNgorICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvdXRpbC9Hcm9vdnlUZXN0Q2FzZVRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS91dGlsL0dyb292eVRlc3RDYXNlVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRkZWI1YwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvdXRpbC9Hcm9vdnlUZXN0Q2FzZVRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsNzAgQEAKK3BhY2thZ2UgZ3Jvb3Z5LnV0aWwKKworLyoqCisgICAgVGVzdGluZyB0aGUgbm90WWV0SW1wbGVtZW50ZWQgZmVhdHVyZSBvZiBHcm9vdnlUZXN0Q2FzZS4KKyAgICBUb2RvOiB0ZXN0aW5nIGFsbCBvdGhlciBmZWF0dXJlcy4KKyAgICBAYXV0aG9yIERpZXJrIEtvZW5pZworKi8KKworY2xhc3MgR3Jvb3Z5VGVzdENhc2VUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCB0ZXN0Tm90WWV0SW1wbGVtZW50ZWRTdWJjbGFzc1VzZSAoKSB7CisgICAgICAgIGlmIChub3RZZXRJbXBsZW1lbnRlZCgpKSByZXR1cm4KKyAgICAgICAgZmFpbCAnaGVyZSB0aGUgY29kZSB0aGF0IGlzIGV4cGVjdGVkIHRvIGZhaWwnCisgICAgfQorICAgIHZvaWQgdGVzdE5vdFlldEltcGxlbWVudGVkU3RhdGljVXNlICgpIHsKKyAgICAgICAgaWYgKEdyb292eVRlc3RDYXNlLm5vdFlldEltcGxlbWVudGVkKHRoaXMpKSByZXR1cm4KKyAgICAgICAgZmFpbCAnaGVyZSB0aGUgY29kZSB0aGF0IGlzIGV4cGVjdGVkIHRvIGZhaWwnCisgICAgfQorCisgICAgLy8gd2UgY2Fubm90IHRlc3QgdGhpcyBhdXRvbWF0aWNhbGx5Li4uCisgICAgLy8gcmVtb3ZlIHRoZSBsZWFkaW5nIHgsIHJ1biB0aGUgdGVzdCBhbmQgc2VlIGl0IGZhaWxpbmcKKyAgICB2b2lkIHh0ZXN0U3ViY2xhc3NGYWlsaW5nKCkgeworICAgICAgICBpZiAobm90WWV0SW1wbGVtZW50ZWQoKSkgcmV0dXJuCisgICAgICAgIGFzc2VydCB0cnVlIC8vIHBhc3NlcyB1bmV4cGVjdGVkbHkKKyAgICB9CisgICAgdm9pZCB4dGVzdFN0YXRpY0ZhaWxpbmcoKSB7CisgICAgICAgIGlmIChHcm9vdnlUZXN0Q2FzZS5ub3RZZXRJbXBsZW1lbnRlZCh0aGlzKSkgcmV0dXJuCisgICAgICAgIGFzc2VydCB0cnVlIC8vIHBhc3NlcyB1bmV4cGVjdGVkbHkKKyAgICB9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0KKworICAgIHZvaWQgdGVzdFNob3VsZEZhaWxXaXRoTWVzc2FnZSgpIHsKKyAgICAgICAgZGVmIG1zZyA9IHNob3VsZEZhaWwgeyB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigneCcpIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzICdqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbjogeCcsIG1zZworICAgIH0KKyAgICB2b2lkIHRlc3RTaG91bGRGYWlsV2l0aE1lc3NhZ2VGb3JDbGFzcygpIHsKKyAgICAgICAgZGVmIG1zZyA9IHNob3VsZEZhaWwoUnVudGltZUV4Y2VwdGlvbi5jbGFzcykgeyB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigneCcpIH0KKyAgICAgICAgcHJpbnRsbiBtc2cKKyAgICAgICAgYXNzZXJ0RXF1YWxzICd4JywgbXNnCisgICAgfQorCisgICAgdm9pZCB0ZXN0U2hvdWxkRmFpbCgpIHsKKyAgICAgICAgc2hvdWxkRmFpbChNeUV4Y2VwdGlvbikgeworICAgICAgICAgICAgbmV3IEZvbygpLmNyZWF0ZUJhcigpCisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHRlc3RTaG91bGRGYWlsV2l0aE5lc3RlZEV4Y2VwdGlvbigpIHsKKyAgICAgICAgc2hvdWxkRmFpbChNeUV4Y2VwdGlvbikgeworICAgICAgICAgICAgbmV3IEZvbygpLmNyZWF0ZUJhcldpdGhOZXN0ZWRFeGNlcHRpb24oKQorICAgICAgICB9CisgICAgfQorfQorCitjbGFzcyBGb28geworICAgIGRlZiBjcmVhdGVCYXIoKSB7CisgICAgICAgIHRocm93IG5ldyBNeUV4Y2VwdGlvbihudWxsKQorICAgIH0KKworICAgIGRlZiBjcmVhdGVCYXJXaXRoTmVzdGVkRXhjZXB0aW9uKCkgeworICAgICAgICB0aHJvdyBuZXcgTXlFeGNlcHRpb24obmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCkpCisgICAgfQorfQorCitjbGFzcyBNeUV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24geworICAgIE15RXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgeworICAgICAgICBzdXBlcihjYXVzZSk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvdXRpbC9NQmVhblRlc3QuamF2YSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvdXRpbC9NQmVhblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGE0YTA0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS91dGlsL01CZWFuVGVzdC5qYXZhCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgJElkJAorCisgQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQKKyB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIGNvcHlyaWdodAorICAgIHN0YXRlbWVudHMgYW5kIG5vdGljZXMuICBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYQorICAgIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KKworIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUKKyAgICBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCisgICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCisgICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworIDMuIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCisgICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLAorICAgIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLgorCisgNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIKKyAgICBub3IgbWF5ICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYSByZWdpc3RlcmVkCisgICAgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KKworIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtCisgICAgaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTCisgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECisgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTAorIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAqLworCitwYWNrYWdlIGdyb292eS51dGlsOworCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW4uVGVzdFN1cHBvcnQ7CisKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXJGYWN0b3J5OworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKKworLyoqCisgKiBUZXN0cyB1c2luZyB0aGUgR3Jvb3Z5T2JqZWN0IEFQSSBmcm9tIEphdmEgdG8gYWNjZXNzIE1CZWFucyB2aWEKKyAqIHRoZSBub3JtYWwgcHJvcGVydGllcyBBUEkgKHRvIHNpbXVsYXRlIG5vcm1hbCBHcm9vdnkgcHJvcGVydHkgYWNjZXNzKQorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBNQmVhblRlc3QgZXh0ZW5kcyBUZXN0U3VwcG9ydCB7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UHJvcGVydHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTUJlYW5TZXJ2ZXIgbWJlYW5TZXJ2ZXIgPSBNQmVhblNlcnZlckZhY3RvcnkuY3JlYXRlTUJlYW5TZXJ2ZXIoKTsKKyAgICAgICAgT2JqZWN0TmFtZSBuYW1lID0gbmV3IE9iamVjdE5hbWUoImdyb292eS50ZXN0OnJvbGU9VGVzdE1CZWFuLHR5cGU9RHVtbXkiKTsKKyAgICAgICAgbWJlYW5TZXJ2ZXIucmVnaXN0ZXJNQmVhbihuZXcgRHVtbXkoKSwgbmFtZSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJKTVggdmFsdWUgb2YgTmFtZSIsICJKYW1lcyIsIG1iZWFuU2VydmVyLmdldEF0dHJpYnV0ZShuYW1lLCAiTmFtZSIpKTsKKworICAgICAgICBHcm9vdnlPYmplY3Qgb2JqZWN0ID0gbmV3IEdyb292eU1CZWFuKG1iZWFuU2VydmVyLCBuYW1lKTsKKworICAgICAgICBPYmplY3QgdmFsdWUgPSBvYmplY3QuZ2V0UHJvcGVydHkoIk5hbWUiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJOYW1lIHByb3BlcnR5IiwgIkphbWVzIiwgdmFsdWUpOworCisgICAgICAgIG9iamVjdC5zZXRQcm9wZXJ0eSgiTmFtZSIsICJCb2IiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJOYW1lIHByb3BlcnR5IiwgIkJvYiIsIG9iamVjdC5nZXRQcm9wZXJ0eSgiTmFtZSIpKTsKKworICAgICAgICAvLyBub3cgbGV0cyBsb29rIHVwIHRoZSBuYW1lIHZpYSBKTVggdG8gY2hlY2tpCisgICAgICAgIGFzc2VydEVxdWFscygiSk1YIHZhbHVlIG9mIE5hbWUiLCAiQm9iIiwgbWJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlKG5hbWUsICJOYW1lIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvdXRpbC9OYXZUb1dpa2kuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS91dGlsL05hdlRvV2lraS5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ3N2NlZAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvdXRpbC9OYXZUb1dpa2kuZ3Jvb3Z5CkBAIC0wLDAgKzEsNDMgQEAKK3BhY2thZ2UgZ3Jvb3Z5LnV0aWwKKworaW1wb3J0IGdyb292eS51dGlsLlhtbFBhcnNlcgorCitpZiAoYXJncy5zaXplKCkgPCAxKSB7CisgICAgcHJpbnRsbiAiVXNhZ2U6IE5hdlRvV2lraSBmaWxlTmFtZSIKK30KK2Vsc2UgeworICAgIGZpbGUgPSBhcmdzWzBdCisgICAgcHJpbnRsbiAiQWJvdXQgdG8gcGFyc2UgJHtmaWxlfSIKKyAgICBkb2MgPSBuZXcgWG1sUGFyc2VyKCkucGFyc2UoZmlsZSkKKworICAgIHByaW50bG4gIiIiCitRdWlja0xpbmtzIHBhZ2UKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisiIiIKKyAgICBsaW5rcyA9IGRvYy5ib2R5LmxpbmtzLml0ZW0KKyAgICBwcmludGxuIGxpbmtzLmNvbGxlY3QgeworICAgICAgICByZXR1cm4gIntsaW5rOiIgKyBpdFsnQG5hbWUnXSArICJ8IiArIGl0WydAaHJlZiddICsgIn0iCisgICAgfS5qb2luKCIgfCAiKQorCisgICAgcHJpbnRsbiAiIiIKKworCisKK05hdmlnYXRpb24gcGFnZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKyIiIgorICAgIG1lbnVzID0gZG9jLmJvZHkubWVudQorICAgIG1lbnVzLmVhY2ggeworICAgICAgICBwcmludGxuICJoMzoke2l0WydAbmFtZSddfSIKKworICAgICAgICBpdC5pdGVtLmVhY2ggeworICAgICAgICAgICAgcHJpbnRsbiAiLSB7bGluazoiICsgaXRbJ0BuYW1lJ10gKyAifCIgKyBpdFsnQGhyZWYnXSArICJ9IgorICAgICAgICB9CisgICAgICAgIHByaW50bG4gIiIKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvdXRpbC9Ob2RlVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3V0aWwvTm9kZVRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNWQ2MTgKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3V0aWwvTm9kZVRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTg4IEBACisvKgorICRJZCQKKworIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCisgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQKKyAgICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKKyAgICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCisgICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQorICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgorICAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKKyAgICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KKworIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCisgICAgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAorICAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCisKKyA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQorICAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLworCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUworIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAorIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKKyBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgKi8KKworcGFja2FnZSBncm9vdnkudXRpbDsKKworCitpbXBvcnQgZ3Jvb3Z5LnV0aWwuR3Jvb3Z5VGVzdENhc2U7CitpbXBvcnQgZ3Jvb3Z5LnV0aWwuTm9kZTsKK2ltcG9ydCBncm9vdnkueG1sLlFOYW1lOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisKKy8qKgorICogVGVzdHMgdGhlIHVzZSBvZiB0aGUgc3RydWN0dXJlZCBBdHRyaWJ1dGUgdHlwZQorICogCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgTm9kZVRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlQXR0cmlidXRlKCkgeworICAgICAgICBOb2RlIGF0dHJpYnV0ZSA9IG5ldyBOb2RlKG51bGwsICJ0cmFuc2FjdGlvbmFsIik7CisgICAgICAgIGFzc2VydEVxdWFscygibmFtZSIsICJ0cmFuc2FjdGlvbmFsIiwgYXR0cmlidXRlLm5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYXR0cmlidXRlcyIsIDAsIGF0dHJpYnV0ZS5hdHRyaWJ1dGVzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZSIsIDAsIGF0dHJpYnV0ZS5jaGlsZHJlbigpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidGV4dCIsICIiLCBhdHRyaWJ1dGUudGV4dCgpKTsKKworICAgICAgICBkdW1wKGF0dHJpYnV0ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZVdpdGhBdHRyaWJ1dGVzKCkgeworICAgICAgICBNYXAgYXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIGF0dHJpYnV0ZXMucHV0KCJhIiwgInh5eiIpOworICAgICAgICAKKyAgICAgICAgTm9kZSBhdHRyaWJ1dGUgPSBuZXcgTm9kZShudWxsLCAiZm9vIiwgYXR0cmlidXRlcyk7CisgICAgICAgIGFzc2VydEVxdWFscygibmFtZSIsICJmb28iLCBhdHRyaWJ1dGUubmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhdHRyaWJ1dGVzIiwgMSwgYXR0cmlidXRlLmF0dHJpYnV0ZXMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlIiwgMCwgYXR0cmlidXRlLmNoaWxkcmVuKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0IiwgIiIsIGF0dHJpYnV0ZS50ZXh0KCkpOworCisgICAgICAgIGR1bXAoYXR0cmlidXRlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlV2l0aFRleHQoKSB7CisgICAgICAgIE5vZGUgYXR0cmlidXRlID0gbmV3IE5vZGUobnVsbCwgImZvbyIsICJ0aGUgdGV4dCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm5hbWUiLCAiZm9vIiwgYXR0cmlidXRlLm5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYXR0cmlidXRlcyIsIDAsIGF0dHJpYnV0ZS5hdHRyaWJ1dGVzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZSIsIDEsIGF0dHJpYnV0ZS5jaGlsZHJlbigpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidGV4dCIsICJ0aGUgdGV4dCIsIGF0dHJpYnV0ZS50ZXh0KCkpOworCisgICAgICAgIGR1bXAoYXR0cmlidXRlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlV2l0aEF0dHJpYnV0ZXNBbmRDaGlsZHJlbigpIHsKKyAgICAgICAgTWFwIGF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICBhdHRyaWJ1dGVzLnB1dCgiYSIsICJ4eXoiKTsKKyAgICAgICAgCisgICAgICAgIExpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGNoaWxkcmVuLmFkZChuZXcgTm9kZShudWxsLCAicGVyc29uIiwgIkphbWVzIikpOworICAgICAgICBjaGlsZHJlbi5hZGQobmV3IE5vZGUobnVsbCwgInBlcnNvbiIsICJCb2IiKSk7CisgICAgICAgIGNoaWxkcmVuLmFkZCgic29tZVRleHQiKTsKKyAgICAgICAgCisgICAgICAgIE5vZGUgYXR0cmlidXRlID0gbmV3IE5vZGUobnVsbCwgImZvbyIsIGF0dHJpYnV0ZXMsIGNoaWxkcmVuKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJuYW1lIiwgImZvbyIsIGF0dHJpYnV0ZS5uYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImF0dHJpYnV0ZXMiLCAxLCBhdHRyaWJ1dGUuYXR0cmlidXRlcygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidmFsdWUiLCAzLCBhdHRyaWJ1dGUuY2hpbGRyZW4oKS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQiLCAic29tZVRleHQiLCBhdHRyaWJ1dGUudGV4dCgpKTsKKworICAgICAgICBkdW1wKGF0dHJpYnV0ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZVdpdGhBdHRyaWJ1dGVzQW5kQ2hpbGRyZW5XaXRoTWl4ZWRUZXh0KCkgeworICAgICAgICBNYXAgYXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIGF0dHJpYnV0ZXMucHV0KCJhIiwgInh5eiIpOworICAgICAgICAKKyAgICAgICAgTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgY2hpbGRyZW4uYWRkKCJzb21lVGV4dCIpOworICAgICAgICBOb2RlIG5vZGUxID0gbmV3IE5vZGUobnVsbCwgInBlcnNvbiIsICJKYW1lcyIpOworICAgICAgICBjaGlsZHJlbi5hZGQobm9kZTEpOworICAgICAgICBjaGlsZHJlbi5hZGQoIm1vcmVUZXh0Iik7CisgICAgICAgIE5vZGUgbm9kZTIgPSBuZXcgTm9kZShudWxsLCAicGVyc29uIiwgIkJvYiIpOworICAgICAgICBjaGlsZHJlbi5hZGQobm9kZTIpOworICAgICAgICBjaGlsZHJlbi5hZGQoIm1vcmVUZXh0Iik7CisgICAgICAgIAorICAgICAgICBOb2RlIGF0dHJpYnV0ZSA9IG5ldyBOb2RlKG51bGwsICJmb28iLCBhdHRyaWJ1dGVzLCBjaGlsZHJlbik7CisgICAgICAgIGFzc2VydEVxdWFscygibmFtZSIsICJmb28iLCBhdHRyaWJ1dGUubmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhdHRyaWJ1dGVzIiwgMSwgYXR0cmlidXRlLmF0dHJpYnV0ZXMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlIiwgNSwgYXR0cmlidXRlLmNoaWxkcmVuKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0IiwgInNvbWVUZXh0bW9yZVRleHRtb3JlVGV4dCIsIGF0dHJpYnV0ZS50ZXh0KCkpOworICAgICAgICAKKyAgICAgICAgCisgICAgICAgIC8vIGxldHMgdGVzdCBnZXQKKyAgICAgICAgTGlzdCBsaXN0ID0gKExpc3QpIGF0dHJpYnV0ZS5nZXQoInBlcnNvbiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIGxpc3Qgc2l6ZTogIiArIGxpc3QsIDIsIGxpc3Quc2l6ZSgpKTsKKyAgICAgICAgCisgICAgICAgIGFzc2VydEVxdWFscygiTm9kZTEiLCBub2RlMSwgbGlzdC5nZXQoMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIk5vZGUyIiwgbm9kZTIsIGxpc3QuZ2V0KDEpKTsKKworICAgICAgICBkdW1wKGF0dHJpYnV0ZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3ROYXZpZ2F0aW9uVXNpbmdRTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUU5hbWUgbmFtZTEgPSBuZXcgUU5hbWUoImh0dHA6Ly9zb21ldGhpbmciLCAiZm9vIiwgImYiKTsKKyAgICAgICAgCisgICAgICAgIE5vZGUgbm9kZSA9IG5ldyBOb2RlKG51bGwsIG51bGwsIG5ldyBBcnJheUxpc3QoKSk7CisgICAgICAgIE5vZGUgY2hpbGQgPSBuZXcgTm9kZShudWxsLCBuZXcgUU5hbWUoImh0dHA6Ly9zb21ldGhpbmciLCAiZm9vIiwgImYiKSwgbmV3IEhhc2hNYXAoKSwgbmV3IEFycmF5TGlzdCgpKTsKKyAgICAgICAgY2hpbGQuYXR0cmlidXRlcygpLnB1dCgiY2hlZXNlIiwgIkVkYW0iKTsKKyAgICAgICAgTm9kZSBncmFuZENoaWxkID0gbmV3IE5vZGUobnVsbCwgbmV3IFFOYW1lKCJodHRwOi8vc29tZXRoaW5nIiwgImJhciIsICJmIiksIG5ldyBIYXNoTWFwKCksIG5ldyBBcnJheUxpc3QoKSk7CisgICAgICAgIGdyYW5kQ2hpbGQuYXR0cmlidXRlcygpLnB1dCgiZHJpbmsiLCAiQmVlciIpOworICAgICAgICBncmFuZENoaWxkLmNoaWxkcmVuKCkuYWRkKCJJIGFtIGEgeW91bmdsaW5nIik7CisgICAgICAgIGNoaWxkLmNoaWxkcmVuKCkuYWRkKGdyYW5kQ2hpbGQpOworICAgICAgICAKKyAgICAgICAgbm9kZS5jaGlsZHJlbigpLmFkZChjaGlsZCk7CisKKyAgICAgICAgLy8gbGV0cyBsb29rIHVwIGJ5IFFOYW1lCisgICAgICAgIE9iamVjdCB2YWx1ZSA9IG5vZGUuZ2V0QXQobmFtZTEpOworICAgICAgICBhc3NlcnRUcnVlKCJTaG91bGQgcmV0dXJuIGEgbGlzdDogIiArIHZhbHVlLCB2YWx1ZSBpbnN0YW5jZW9mIE5vZGVMaXN0KTsKKyAgICAgICAgTm9kZUxpc3QgbGlzdCA9IChOb2RlTGlzdCkgdmFsdWU7CisgICAgICAgIGFzc2VydEVxdWFscygiU2l6ZSIsIDEsIGxpc3Quc2l6ZSgpKTsKKyAgICAgICAgCisgICAgICAgIE5vZGUgYW5zd2VyID0gKE5vZGUpIGxpc3QuZ2V0KDApOworICAgICAgICBhc3NlcnROb3ROdWxsKCJOb2RlIGlzIG51bGwhIiwgYW5zd2VyKTsKKyAgICAgICAgCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRm91bmQgbm9kZTogIiArIGFuc3dlcik7CisgICAgICAgIAorICAgICAgICAvLyBub3cgbGV0cyBuYXZpZ2F0ZSB0aGUgbGlzdAorICAgICAgICBOb2RlTGlzdCBnYyA9IGxpc3QuZ2V0QXQobmV3IFFOYW1lKCJodHRwOi8vc29tZXRoaW5nIiwgImJhciIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJncmFuZCBjaGlsZHJlbiBzaXplIiwgMSwgZ2Muc2l6ZSgpKTsKKyAgICAgICAgCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRm91bmQgZ3JhbmRDaGlsZDogIiArIGdjKTsKKyAgICAgICAgCisgICAgICAgIFN0cmluZyB0ZXh0PSBnYy50ZXh0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygidGV4dCBvZiBncmFuZGNoaWxkIiwgIkkgYW0gYSB5b3VuZ2xpbmciLCB0ZXh0KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBkdW1wKE5vZGUgbm9kZSkgeworICAgICAgICBOb2RlUHJpbnRlciBwcmludGVyID0gbmV3IE5vZGVQcmludGVyKCk7CisgICAgICAgIHByaW50ZXIucHJpbnQobm9kZSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3V0aWwvT2JqZWN0R3JhcGhCdWlsZGVyVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3V0aWwvT2JqZWN0R3JhcGhCdWlsZGVyVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIzNDQ0YgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvdXRpbC9PYmplY3RHcmFwaEJ1aWxkZXJUZXN0Lmdyb292eQpAQCAtMCwwICsxLDE0NiBAQAorcGFja2FnZSBncm9vdnkudXRpbA0KKw0KK2NsYXNzIE9iamVjdEdyYXBoQnVpbGRlclRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7DQorICAgT2JqZWN0R3JhcGhCdWlsZGVyIGJ1aWxkZXINCisNCisgICB2b2lkIHRlc3RDb21wYW55KCkgew0KKyAgICAgIGRlZiBleHBlY3RlZCA9IG5ldyBDb21wYW55KCBuYW1lOiAnQUNNRScsIGVtcGxveWVlczogW10gKQ0KKyAgICAgIGRlZiBhY3R1YWwgPSBidWlsZGVyLmNvbXBhbnkoIG5hbWU6ICdBQ01FJywgZW1wbG95ZWVzOiBbXSApDQorICAgICAgYXNzZXJ0IGFjdHVhbCAhPSBudWxsDQorICAgICAgLy9hc3NlcnQgYWN0dWFsLmNsYXNzID09IENvbXBhbnkNCisgICAgICBhc3NlcnQgYWN0dWFsLm5hbWUgPT0gZXhwZWN0ZWQubmFtZQ0KKyAgICAgIGFzc2VydCBhY3R1YWwuYWRkcmVzcyA9PSBleHBlY3RlZC5hZGRyZXNzDQorICAgICAgYXNzZXJ0IGFjdHVhbC5lbXBsb3llZXMgPT0gZXhwZWN0ZWQuZW1wbG95ZWVzDQorICAgfQ0KKw0KKyAgIHZvaWQgdGVzdENvbXBhbnlBbmRBZGRyZXNzKCkgew0KKyAgICAgIGRlZiBleHBlY3RlZEFkZHJlc3MgPSBuZXcgQWRkcmVzcyggbGluZTE6ICcxMjMgR3Jvb3Z5IFJkJywgemlwOiAxMjM0NSwgc3RhdGU6ICdKVicgKQ0KKyAgICAgIGRlZiBleHBlY3RlZENvbXBhbnkgPSBuZXcgQ29tcGFueSggbmFtZTogJ0FDTUUnLCBlbXBsb3llZXM6IFtdLCBhZGRyZXNzOiBleHBlY3RlZEFkZHJlc3MgKQ0KKyAgICAgIGRlZiBhY3R1YWxDb21wYW55ID0gYnVpbGRlci5jb21wYW55KCBuYW1lOiAnQUNNRScsIGVtcGxveWVlczogW10gKSB7DQorICAgICAgICAgYWRkcmVzcyggbGluZTE6ICcxMjMgR3Jvb3Z5IFJkJywgemlwOiAxMjM0NSwgc3RhdGU6ICdKVicgKQ0KKyAgICAgIH0NCisgICAgICBhc3NlcnQgYWN0dWFsQ29tcGFueSAhPSBudWxsDQorICAgICAgLy9hc3NlcnQgYWN0dWFsQ29tcGFueS5jbGFzcyA9PSBDb21wYW55DQorICAgICAgYXNzZXJ0IGFjdHVhbENvbXBhbnkubmFtZSA9PSBleHBlY3RlZENvbXBhbnkubmFtZQ0KKyAgICAgIGFzc2VydCBhY3R1YWxDb21wYW55LmVtcGxveWVlcyA9PSBleHBlY3RlZENvbXBhbnkuZW1wbG95ZWVzDQorICAgICAgZGVmIGFjdHVhbEFkZHJlc3MgPSBhY3R1YWxDb21wYW55LmFkZHJlc3MNCisgICAgICBhc3NlcnQgYWN0dWFsQWRkcmVzcyAhPSBudWxsDQorICAgICAgLy9hc3NlcnQgYWN0dWFsQWRkcmVzcy5jbGFzcyA9PSBBZGRyZXNzDQorICAgICAgYXNzZXJ0IGFjdHVhbEFkZHJlc3MubGluZTEgPT0gZXhwZWN0ZWRBZGRyZXNzLmxpbmUxDQorICAgICAgYXNzZXJ0IGFjdHVhbEFkZHJlc3MubGluZTIgPT0gZXhwZWN0ZWRBZGRyZXNzLmxpbmUyDQorICAgICAgYXNzZXJ0IGFjdHVhbEFkZHJlc3MuemlwID09IGV4cGVjdGVkQWRkcmVzcy56aXANCisgICAgICBhc3NlcnQgYWN0dWFsQWRkcmVzcy5zdGF0ZSA9PSBleHBlY3RlZEFkZHJlc3Muc3RhdGUNCisgICB9DQorDQorICAgdm9pZCB0ZXN0Q29tcGFueUFuZEVtcGxveWVlQW5kQWRkcmVzcygpIHsNCisgICAgICBkZWYgZXhwZWN0ZWRBZGRyZXNzID0gbmV3IEFkZHJlc3MoIGxpbmUxOiAnMTIzIEdyb292eSBSZCcsIHppcDogMTIzNDUsIHN0YXRlOiAnSlYnICkNCisgICAgICBkZWYgZXhwZWN0ZWRFbXBsb3llZSA9IG5ldyBFbXBsb3llZSggbmFtZTogJ0R1a2UnLCBlbXBsb3llZUlkOiAxLCBhZGRyZXNzOiBleHBlY3RlZEFkZHJlc3MgKQ0KKyAgICAgIGRlZiBleHBlY3RlZENvbXBhbnkgPSBuZXcgQ29tcGFueSggbmFtZTogJ0FDTUUnICkNCisgICAgICBkZWYgYWN0dWFsQ29tcGFueSA9IGJ1aWxkZXIuY29tcGFueSggbmFtZTogJ0FDTUUnLCBlbXBsb3llZXM6IFtdICkgew0KKyAgICAgICAgIGVtcGxveWVlKCAgbmFtZTogJ0R1a2UnLCBlbXBsb3llZUlkOiAxICkgew0KKyAgICAgICAgICAgIGFkZHJlc3MoIGxpbmUxOiAnMTIzIEdyb292eSBSZCcsIHppcDogMTIzNDUsIHN0YXRlOiAnSlYnICkNCisgICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGFzc2VydCBhY3R1YWxDb21wYW55ICE9IG51bGwNCisgICAgICAvL2Fzc2VydCBhY3R1YWxDb21wYW55LmNsYXNzID09IENvbXBhbnkNCisgICAgICBhc3NlcnQgYWN0dWFsQ29tcGFueS5uYW1lID09IGV4cGVjdGVkQ29tcGFueS5uYW1lDQorICAgICAgYXNzZXJ0IGFjdHVhbENvbXBhbnkuZW1wbG95ZWVzLnNpemUoKSA9PSAxDQorICAgICAgZGVmIGFjdHVhbEVtcGxveWVlID0gYWN0dWFsQ29tcGFueS5lbXBsb3llZXNbMF0NCisgICAgICAvL2Fzc2VydCBhY3R1YWxFbXBsb3llZS5jbGFzcyA9PSBFbXBsb3llZQ0KKyAgICAgIGFzc2VydCBhY3R1YWxFbXBsb3llZS5uYW1lID09IGV4cGVjdGVkRW1wbG95ZWUubmFtZQ0KKyAgICAgIGFzc2VydCBhY3R1YWxFbXBsb3llZS5lbXBsb3llZUlkID09IGV4cGVjdGVkRW1wbG95ZWUuZW1wbG95ZWVJZA0KKyAgICAgIGRlZiBhY3R1YWxBZGRyZXNzID0gYWN0dWFsRW1wbG95ZWUuYWRkcmVzcw0KKyAgICAgIGFzc2VydCBhY3R1YWxBZGRyZXNzICE9IG51bGwNCisgICAgICAvL2Fzc2VydCBhY3R1YWxBZGRyZXNzLmNsYXNzID09IEFkZHJlc3MNCisgICAgICBhc3NlcnQgYWN0dWFsQWRkcmVzcy5saW5lMSA9PSBleHBlY3RlZEFkZHJlc3MubGluZTENCisgICAgICBhc3NlcnQgYWN0dWFsQWRkcmVzcy5saW5lMiA9PSBleHBlY3RlZEFkZHJlc3MubGluZTINCisgICAgICBhc3NlcnQgYWN0dWFsQWRkcmVzcy56aXAgPT0gZXhwZWN0ZWRBZGRyZXNzLnppcA0KKyAgICAgIGFzc2VydCBhY3R1YWxBZGRyZXNzLnN0YXRlID09IGV4cGVjdGVkQWRkcmVzcy5zdGF0ZQ0KKyAgIH0NCisNCisgICB2b2lkIHRlc3RDb21wYW55QW5kRW1wbG95ZWVTYW1lQWRkcmVzcygpIHsNCisgICAgICBkZWYgZXhwZWN0ZWRBZGRyZXNzID0gbmV3IEFkZHJlc3MoIGxpbmUxOiAnMTIzIEdyb292eSBSZCcsIHppcDogMTIzNDUsIHN0YXRlOiAnSlYnICkNCisgICAgICBkZWYgZXhwZWN0ZWRFbXBsb3llZSA9IG5ldyBFbXBsb3llZSggbmFtZTogJ0R1a2UnLCBlbXBsb3llZUlkOiAxLCBhZGRyZXNzOiBleHBlY3RlZEFkZHJlc3MgKQ0KKyAgICAgIGRlZiBleHBlY3RlZENvbXBhbnkgPSBuZXcgQ29tcGFueSggbmFtZTogJ0FDTUUnICkNCisgICAgICBkZWYgYWN0dWFsQ29tcGFueSA9IGJ1aWxkZXIuY29tcGFueSggbmFtZTogJ0FDTUUnLCBlbXBsb3llZXM6IFtdICkgew0KKyAgICAgICAgIGFkZHJlc3MoIGlkOiAnYTEnLCBsaW5lMTogJzEyMyBHcm9vdnkgUmQnLCB6aXA6IDEyMzQ1LCBzdGF0ZTogJ0pWJyApDQorICAgICAgICAgZW1wbG95ZWUoICBuYW1lOiAnRHVrZScsIGVtcGxveWVlSWQ6IDEsIGFkZHJlc3M6IGExICkNCisgICAgICB9DQorICAgICAgYXNzZXJ0IGFjdHVhbENvbXBhbnkgIT0gbnVsbA0KKyAgICAgIC8vYXNzZXJ0IGFjdHVhbENvbXBhbnkuY2xhc3MgPT0gQ29tcGFueQ0KKyAgICAgIGFzc2VydCBhY3R1YWxDb21wYW55Lm5hbWUgPT0gZXhwZWN0ZWRDb21wYW55Lm5hbWUNCisgICAgICBhc3NlcnQgYWN0dWFsQ29tcGFueS5lbXBsb3llZXMuc2l6ZSgpID09IDENCisgICAgICBkZWYgYWN0dWFsRW1wbG95ZWUgPSBhY3R1YWxDb21wYW55LmVtcGxveWVlc1swXQ0KKyAgICAgIC8vYXNzZXJ0IGFjdHVhbEVtcGxveWVlLmNsYXNzID09IEVtcGxveWVlDQorICAgICAgYXNzZXJ0IGFjdHVhbEVtcGxveWVlLm5hbWUgPT0gZXhwZWN0ZWRFbXBsb3llZS5uYW1lDQorICAgICAgYXNzZXJ0IGFjdHVhbEVtcGxveWVlLmVtcGxveWVlSWQgPT0gZXhwZWN0ZWRFbXBsb3llZS5lbXBsb3llZUlkDQorICAgICAgYXNzZXJ0IGFjdHVhbENvbXBhbnkuYWRkcmVzcyA9PSBhY3R1YWxFbXBsb3llZS5hZGRyZXNzDQorICAgfQ0KKw0KKyAgIHZvaWQgdGVzdENvbXBhbnlBbmRFbXBsb3llZVNhbWVBZGRyZXNzV2l0aFJlZigpIHsNCisgICAgICBkZWYgZXhwZWN0ZWRBZGRyZXNzID0gbmV3IEFkZHJlc3MoIGxpbmUxOiAnMTIzIEdyb292eSBSZCcsIHppcDogMTIzNDUsIHN0YXRlOiAnSlYnICkNCisgICAgICBkZWYgZXhwZWN0ZWRFbXBsb3llZSA9IG5ldyBFbXBsb3llZSggbmFtZTogJ0R1a2UnLCBlbXBsb3llZUlkOiAxLCBhZGRyZXNzOiBleHBlY3RlZEFkZHJlc3MgKQ0KKyAgICAgIGRlZiBleHBlY3RlZENvbXBhbnkgPSBuZXcgQ29tcGFueSggbmFtZTogJ0FDTUUnICkNCisgICAgICBkZWYgYWN0dWFsQ29tcGFueSA9IGJ1aWxkZXIuY29tcGFueSggbmFtZTogJ0FDTUUnLCBlbXBsb3llZXM6IFtdICkgew0KKyAgICAgICAgIGFkZHJlc3MoIGlkOiAnYTEnLCBsaW5lMTogJzEyMyBHcm9vdnkgUmQnLCB6aXA6IDEyMzQ1LCBzdGF0ZTogJ0pWJyApDQorICAgICAgICAgZW1wbG95ZWUoICBuYW1lOiAnRHVrZScsIGVtcGxveWVlSWQ6IDEgKXsNCisgICAgICAgICAgICBhZGRyZXNzKCByZWZJZDogJ2ExJyApDQorICAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBhc3NlcnQgYWN0dWFsQ29tcGFueSAhPSBudWxsDQorICAgICAgLy9hc3NlcnQgYWN0dWFsQ29tcGFueS5jbGFzcyA9PSBDb21wYW55DQorICAgICAgYXNzZXJ0IGFjdHVhbENvbXBhbnkubmFtZSA9PSBleHBlY3RlZENvbXBhbnkubmFtZQ0KKyAgICAgIGFzc2VydCBhY3R1YWxDb21wYW55LmVtcGxveWVlcy5zaXplKCkgPT0gMQ0KKyAgICAgIGRlZiBhY3R1YWxFbXBsb3llZSA9IGFjdHVhbENvbXBhbnkuZW1wbG95ZWVzWzBdDQorICAgICAgLy9hc3NlcnQgYWN0dWFsRW1wbG95ZWUuY2xhc3MgPT0gRW1wbG95ZWUNCisgICAgICBhc3NlcnQgYWN0dWFsRW1wbG95ZWUubmFtZSA9PSBleHBlY3RlZEVtcGxveWVlLm5hbWUNCisgICAgICBhc3NlcnQgYWN0dWFsRW1wbG95ZWUuZW1wbG95ZWVJZCA9PSBleHBlY3RlZEVtcGxveWVlLmVtcGxveWVlSWQNCisgICAgICBhc3NlcnQgYWN0dWFsQ29tcGFueS5hZGRyZXNzID09IGFjdHVhbEVtcGxveWVlLmFkZHJlc3MNCisgICAgICBhc3NlcnQgYWN0dWFsRW1wbG95ZWUuY29tcGFueSA9PSBhY3R1YWxDb21wYW55DQorICAgfQ0KKw0KKyAgIHZvaWQgdGVzdENvbXBhbnlBbmRNYW55RW1wbG95ZWVzKCkgew0KKyAgICAgIGRlZiBhY3R1YWxDb21wYW55ID0gYnVpbGRlci5jb21wYW55KCBuYW1lOiAnQUNNRScsIGVtcGxveWVlczogW10gKSB7DQorICAgICAgICAgMy50aW1lcyB7DQorICAgICAgICAgICAgZW1wbG95ZWUoICBuYW1lOiAiRHVrZSAkaXQiLCBlbXBsb3llZUlkOiBpdCApDQorICAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBhc3NlcnQgYWN0dWFsQ29tcGFueSAhPSBudWxsDQorICAgICAgYXNzZXJ0IGFjdHVhbENvbXBhbnkuZW1wbG95ZWVzLnNpemUoKSA9PSAzDQorICAgICAgMy50aW1lcyB7DQorICAgICAgICAgYXNzZXJ0IGFjdHVhbENvbXBhbnkuZW1wbG95ZWVzW2l0XS5uYW1lID09ICJEdWtlICRpdCINCisgICAgICB9DQorICAgICAgLy9hc3NlcnQgYWN0dWFsQ29tcGFueS5lbXBsb3llZXMqLmdldENsYXNzKCkgPT0gW0VtcGxveWVlLEVtcGxveWVlLEVtcGxveWVlXQ0KKyAgIH0NCisNCisgICB2b2lkIHNldFVwKCkgew0KKyAgICAgIGJ1aWxkZXIgPSBuZXcgT2JqZWN0R3JhcGhCdWlsZGVyKCkNCisgICAgICBidWlsZGVyLmNsYXNzTmFtZVJlc29sdmVyID0gImdyb292eS51dGlsIg0KKyAgIH0NCit9DQorDQorY2xhc3MgQ29tcGFueSB7DQorICAgU3RyaW5nIG5hbWUNCisgICBBZGRyZXNzIGFkZHJlc3MNCisgICBMaXN0IGVtcGxveWVlcyA9IFtdDQorDQorICAgU3RyaW5nIHRvU3RyaW5nKCkgeyAiQ29tcGFueT1bbmFtZToke25hbWV9LCBhZGRyZXNzOiR7YWRkcmVzc30sIGVtcGxveWVlczoke2VtcGxveWVlc31dIiB9DQorfQ0KKw0KK2NsYXNzIEFkZHJlc3Mgew0KKyAgIFN0cmluZyBsaW5lMQ0KKyAgIFN0cmluZyBsaW5lMg0KKyAgIGludCB6aXANCisgICBTdHJpbmcgc3RhdGUNCisNCisgICBTdHJpbmcgdG9TdHJpbmcoKSB7ICJBZGRyZXNzPVtsaW5lMToke2xpbmUxfSwgbGluZTI6JHtsaW5lMn0sIHppcDoke3ppcH0sIHN0YXRlOiR7c3RhdGV9XSIgfQ0KK30NCisNCitjbGFzcyBFbXBsb3llZSB7DQorICAgU3RyaW5nIG5hbWUNCisgICBpbnQgZW1wbG95ZWVJZA0KKyAgIEFkZHJlc3MgYWRkcmVzcw0KKyAgIENvbXBhbnkgY29tcGFueQ0KKw0KKyAgIFN0cmluZyB0b1N0cmluZygpIHsgIkVtcGxveWVlPVtuYW1lOiR7bmFtZX0sIGVtcGxveWVlSWQ6JHtlbXBsb3llZUlkfSwgYWRkcmVzczoke2FkZHJlc3N9LCBjb21wYW55OiR7Y29tcGFueS5uYW1lfV0iIH0NCit9DQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS91dGlsL09ic2VydmFibGVNYXBUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvdXRpbC9PYnNlcnZhYmxlTWFwVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYyNGRlZgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvdXRpbC9PYnNlcnZhYmxlTWFwVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwxMDUgQEAKKy8qDQorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorcGFja2FnZSBncm9vdnkudXRpbA0KKw0KK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlRXZlbnQNCitpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyDQorDQorLyoqDQorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86YWFsbWlyYXlAdXNlcnMuc291cmNlZm9yZ2UubmV0Ij5BbmRyZXMgQWxtaXJheTwvYT4NCisgKi8NCitjbGFzcyBPYnNlcnZhYmxlTWFwVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsNCisgICB2b2lkIHRlc3RGaXJlRXZlbnRfd2l0aG91dFRlc3QoKXsNCisgICAgICBkZWYgbWFwID0gbmV3IE9ic2VydmFibGVNYXAoKQ0KKyAgICAgIGRlZiBsaXN0ZW5lciA9IG5ldyBTYW1wbGVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkNCisgICAgICBtYXAuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciggbGlzdGVuZXIgKQ0KKw0KKyAgICAgIGRlZiBrZXkgPSAna2V5Jw0KKyAgICAgIGRlZiB2YWx1ZTEgPSAndmFsdWUxJw0KKyAgICAgIGRlZiB2YWx1ZTIgPSAndmFsdWUyJw0KKyAgICAgIG1hcFtrZXldID0gbnVsbA0KKyAgICAgIGFzc2VydE51bGwoIGxpc3RlbmVyLmV2ZW50ICkNCisNCisgICAgICBtYXBba2V5XSA9IHZhbHVlMQ0KKyAgICAgIGFzc2VydE5vdE51bGwoIGxpc3RlbmVyLmV2ZW50ICkNCisgICAgICBhc3NlcnRFcXVhbHMoIG1hcCwgbGlzdGVuZXIuZXZlbnQuc291cmNlICkNCisgICAgICBhc3NlcnRFcXVhbHMoIGtleSwgbGlzdGVuZXIuZXZlbnQucHJvcGVydHlOYW1lICkNCisgICAgICBhc3NlcnROdWxsKCBsaXN0ZW5lci5ldmVudC5vbGRWYWx1ZSApDQorICAgICAgYXNzZXJ0RXF1YWxzKCB2YWx1ZTEsIGxpc3RlbmVyLmV2ZW50Lm5ld1ZhbHVlICkNCisNCisgICAgICBtYXBba2V5XSA9IHZhbHVlMg0KKyAgICAgIGFzc2VydE5vdE51bGwoIGxpc3RlbmVyLmV2ZW50ICkNCisgICAgICBhc3NlcnRFcXVhbHMoIG1hcCwgbGlzdGVuZXIuZXZlbnQuc291cmNlICkNCisgICAgICBhc3NlcnRFcXVhbHMoIGtleSwgbGlzdGVuZXIuZXZlbnQucHJvcGVydHlOYW1lICkNCisgICAgICBhc3NlcnRFcXVhbHMoIHZhbHVlMSwgbGlzdGVuZXIuZXZlbnQub2xkVmFsdWUgKQ0KKyAgICAgIGFzc2VydEVxdWFscyggdmFsdWUyLCBsaXN0ZW5lci5ldmVudC5uZXdWYWx1ZSApDQorDQorICAgICAgbGlzdGVuZXIuZXZlbnQgPSBudWxsDQorICAgICAgbWFwW2tleV0gPSB2YWx1ZTINCisgICAgICBhc3NlcnROdWxsKCBsaXN0ZW5lci5ldmVudCApDQorDQorICAgfQ0KKw0KKyAgIHZvaWQgdGVzdEZpcmVFdmVudF93aXRoVGVzdCgpew0KKyAgICAgIGRlZiBtYXAgPSBuZXcgT2JzZXJ2YWJsZU1hcCggeyBpdCAhPSAndmFsdWUyJyB9ICkNCisgICAgICBkZWYgbGlzdGVuZXIgPSBuZXcgU2FtcGxlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpDQorICAgICAgbWFwLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoIGxpc3RlbmVyICkNCisNCisgICAgICBkZWYga2V5ID0gJ2tleScNCisgICAgICBkZWYgdmFsdWUxID0gJ3ZhbHVlMScNCisgICAgICBkZWYgdmFsdWUyID0gJ3ZhbHVlMicNCisgICAgICBtYXBba2V5XSA9IHZhbHVlMQ0KKyAgICAgIGFzc2VydE5vdE51bGwoIGxpc3RlbmVyLmV2ZW50ICkNCisgICAgICBhc3NlcnRFcXVhbHMoIG1hcCwgbGlzdGVuZXIuZXZlbnQuc291cmNlICkNCisgICAgICBhc3NlcnRFcXVhbHMoIGtleSwgbGlzdGVuZXIuZXZlbnQucHJvcGVydHlOYW1lICkNCisgICAgICBhc3NlcnROdWxsKCBsaXN0ZW5lci5ldmVudC5vbGRWYWx1ZSApDQorICAgICAgYXNzZXJ0RXF1YWxzKCB2YWx1ZTEsIGxpc3RlbmVyLmV2ZW50Lm5ld1ZhbHVlICkNCisNCisgICAgICBsaXN0ZW5lci5ldmVudCA9IG51bGwNCisgICAgICBtYXBba2V5XSA9IHZhbHVlMg0KKyAgICAgIGFzc2VydE51bGwoIGxpc3RlbmVyLmV2ZW50ICkNCisgICB9DQorDQorICAgdm9pZCB0ZXN0RmlyZUV2ZW50X3dpdGhUZXN0T25LZXkoKXsNCisgICAgICBkZWYgbWFwID0gbmV3IE9ic2VydmFibGVNYXAoIHsgbmFtZSwgdmFsdWUgLT4gbmFtZSAhPSAna2V5JyB9ICkNCisgICAgICBkZWYgbGlzdGVuZXIgPSBuZXcgU2FtcGxlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpDQorICAgICAgbWFwLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoIGxpc3RlbmVyICkNCisgICAgICANCisgICAgICBkZWYga2V5ID0gJ2tleScNCisgICAgICBkZWYgdmFsdWUxID0gJ3ZhbHVlMScNCisgICAgICBkZWYgdmFsdWUyID0gJ3ZhbHVlMicNCisgICAgICBtYXBba2V5XSA9IHZhbHVlMQ0KKyAgICAgIGFzc2VydE51bGwoIGxpc3RlbmVyLmV2ZW50ICkNCisgICAgICBtYXBba2V5XSA9IHZhbHVlMg0KKyAgICAgIGFzc2VydE51bGwoIGxpc3RlbmVyLmV2ZW50ICkNCisNCisgICAgICBtYXBbJ2tleTInXSA9IHZhbHVlMQ0KKyAgICAgIGFzc2VydE5vdE51bGwoIGxpc3RlbmVyLmV2ZW50ICkNCisgICAgICBhc3NlcnRFcXVhbHMoIG1hcCwgbGlzdGVuZXIuZXZlbnQuc291cmNlICkNCisgICAgICBhc3NlcnRFcXVhbHMoICdrZXkyJywgbGlzdGVuZXIuZXZlbnQucHJvcGVydHlOYW1lICkNCisgICAgICBhc3NlcnROdWxsKCBsaXN0ZW5lci5ldmVudC5vbGRWYWx1ZSApDQorICAgICAgYXNzZXJ0RXF1YWxzKCB2YWx1ZTEsIGxpc3RlbmVyLmV2ZW50Lm5ld1ZhbHVlICkNCisgICB9DQorfQ0KKw0KK2NsYXNzIFNhbXBsZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHsNCisgICBQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50DQorDQorICAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoIFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZ0ICl7DQorICAgICAgZXZlbnQgPSBldnQNCisgICB9DQorfQ0KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvdXRpbC9PcmRlckJ5VGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3V0aWwvT3JkZXJCeVRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNGI5OGIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3V0aWwvT3JkZXJCeVRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsNTYgQEAKK3BhY2thZ2UgZ3Jvb3Z5LnV0aWwKKworY2xhc3MgT3JkZXJCeVRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICB2b2lkIHRlc3RTb3J0QnlPbmVGaWVsZCgpIHsKKyAgICAgICAgZGVmIGJ1aWxkZXIgPSBuZXcgTm9kZUJ1aWxkZXIoKQorICAgICAgICBkZWYgdHJlZSA9IGJ1aWxkZXIucGVvcGxlIHsKKyAgICAgICAgICAgIHBlcnNvbihuYW1lOidKYW1lcycsIGNoZWVzZTonRWRhbScsIGxvY2F0aW9uOidMb25kb24nKQorICAgICAgICAgICAgcGVyc29uKG5hbWU6J0JvYicsIGNoZWVzZTonQ2hlZGRhcicsIGxvY2F0aW9uOidBdGxhbnRhJykKKyAgICAgICAgICAgIHBlcnNvbihuYW1lOidDaHJpcycsIGNoZWVzZTonUmVkIExlaWNlc3RlcicsIGxvY2F0aW9uOidMb25kb24nKQorICAgICAgICAgICAgcGVyc29uKG5hbWU6J0pvZScsIGNoZWVzZTonQnJpZScsIGxvY2F0aW9uOidMb25kb24nKQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBkZWYgcGVvcGxlID0gdHJlZS5jaGlsZHJlbigpCisgICAgICAgIAorICAgICAgICAvKiogQHRvZG8gcGFyc2VyIHNob3VsZCBhbGxvdyB0aGlzIHN5bnRheCBzdWdhcgorICAgICAgICBkZWYgb3JkZXIgPSBuZXcgT3JkZXJCeSB7IGl0LmdldCgnQGNoZWVzZScpIH0KKyAgICAgICAgKi8KKyAgICAgICAgZGVmIG9yZGVyID0gbmV3IE9yZGVyQnkoIHsgaXQuZ2V0KCdAY2hlZXNlJykgfSApCisgICAgICAgIGRlZiBzb3J0ZWQgPSBwZW9wbGUuc29ydChvcmRlcikKKyAgICAgICAgCisgICAgICAgIGFzc2VydCBzb3J0ZWQuZ2V0KDApLmdldCgnQG5hbWUnKSA9PSAnSm9lJworICAgICAgICBhc3NlcnQgc29ydGVkLmdldCgxKS5nZXQoJ0BuYW1lJykgPT0gJ0JvYicKKyAgICAgICAgYXNzZXJ0IHNvcnRlZC5nZXQoMikuZ2V0KCdAbmFtZScpID09ICdKYW1lcycKKyAgICAgICAgYXNzZXJ0IHNvcnRlZC5nZXQoMykuZ2V0KCdAbmFtZScpID09ICdDaHJpcycKKyAgICAgICAgCisgICAgICAgIG9yZGVyID0gbmV3IE9yZGVyQnkoIHsgaXQuZ2V0KCdAbmFtZScpIH0gKQorICAgICAgICBzb3J0ZWQgPSBwZW9wbGUuc29ydChvcmRlcikKKyAgICAgICAgCisgICAgICAgIGFzc2VydCBzb3J0ZWQuZ2V0KDApLmdldCgnQG5hbWUnKSA9PSAnQm9iJworICAgICAgICBhc3NlcnQgc29ydGVkLmdldCgxKS5nZXQoJ0BuYW1lJykgPT0gJ0NocmlzJworICAgICAgICBhc3NlcnQgc29ydGVkLmdldCgyKS5nZXQoJ0BuYW1lJykgPT0gJ0phbWVzJworICAgICAgICBhc3NlcnQgc29ydGVkLmdldCgzKS5nZXQoJ0BuYW1lJykgPT0gJ0pvZScKKyAgICB9CisKKworICAgIHZvaWQgdGVzdFNvcnRCeU11bHRpcGxlRmllbGRzKCkgeworICAgICAgICBkZWYgYnVpbGRlciA9IG5ldyBOb2RlQnVpbGRlcigpCisgICAgICAgIGRlZiB0cmVlID0gYnVpbGRlci5wZW9wbGUgeworICAgICAgICAgICAgcGVyc29uKG5hbWU6J0phbWVzJywgY2hlZXNlOidFZGFtJywgbG9jYXRpb246J0xvbmRvbicpCisgICAgICAgICAgICBwZXJzb24obmFtZTonQm9iJywgY2hlZXNlOidDaGVkZGFyJywgbG9jYXRpb246J0F0bGFudGEnKQorICAgICAgICAgICAgcGVyc29uKG5hbWU6J0NocmlzJywgY2hlZXNlOidSZWQgTGVpY2VzdGVyJywgbG9jYXRpb246J0xvbmRvbicpCisgICAgICAgICAgICBwZXJzb24obmFtZTonSm9lJywgY2hlZXNlOidCcmllJywgbG9jYXRpb246J0xvbmRvbicpCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGRlZiBwZW9wbGUgPSB0cmVlLmNoaWxkcmVuKCkKKworICAgICAgICBkZWYgb3JkZXIgPSBuZXcgT3JkZXJCeShbIHsgaXQuZ2V0KCdAbG9jYXRpb24nKSB9LCB7IGl0LmdldCgnQGNoZWVzZScpIH0gXSkKKyAgICAgICAgZGVmIHNvcnRlZCA9IHBlb3BsZS5zb3J0KG9yZGVyKQorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IHNvcnRlZC5nZXQoMCkuZ2V0KCdAbmFtZScpID09ICdCb2InCisgICAgICAgIGFzc2VydCBzb3J0ZWQuZ2V0KDEpLmdldCgnQG5hbWUnKSA9PSAnSm9lJworICAgICAgICBhc3NlcnQgc29ydGVkLmdldCgyKS5nZXQoJ0BuYW1lJykgPT0gJ0phbWVzJworICAgICAgICBhc3NlcnQgc29ydGVkLmdldCgzKS5nZXQoJ0BuYW1lJykgPT0gJ0NocmlzJworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvdXRpbC9Qcm94eUdlbmVyYXRvclRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS91dGlsL1Byb3h5R2VuZXJhdG9yVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQwNzIwMwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvdXRpbC9Qcm94eUdlbmVyYXRvclRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgZ3Jvb3Z5LnV0aWwKKworLyoqCisgKiBAYXV0aG9yIFBhdWwgS2luZworICovCitjbGFzcyBQcm94eUdlbmVyYXRvclRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICB2b2lkIHRlc3RBZ2dyZWdhdGVGcm9tQmFzZUNsYXNzKCkgeworICAgICAgICBNYXAgbWFwID0gW215TWV0aG9kQjogeyJ0aGUgbmV3IEIifSwgbXlNZXRob2RYOiB7InRoZSBpbmplY3RlZCBYIn1dCisgICAgICAgIGRlZiB0ZXN0Q2xhc3MgPSBQcm94eUdlbmVyYXRvci5pbnN0YW50aWF0ZUFnZ3JlZ2F0ZUZyb21CYXNlQ2xhc3MobWFwLCBUZXN0Q2xhc3MpCisgICAgICAgIGFzc2VydCB0ZXN0Q2xhc3MgaW5zdGFuY2VvZiBUZXN0Q2xhc3MKKyAgICAgICAgYXNzZXJ0IHRlc3RDbGFzcy5teU1ldGhvZEEoKSA9PSAidGhlIG9yaWdpbmFsIEEiCisgICAgICAgIGFzc2VydCB0ZXN0Q2xhc3MubXlNZXRob2RCKCkgPT0gInRoZSBuZXcgQiIKKyAgICAgICAgYXNzZXJ0IHRlc3RDbGFzcy5teU1ldGhvZFgoKSA9PSAidGhlIGluamVjdGVkIFgiCisgICAgfQorCisgICAgdm9pZCB0ZXN0QWdncmVnYXRlRnJvbUFic3RyYWN0QmFzZUNsYXNzKCkgeworICAgICAgICBNYXAgbWFwID0gW215TWV0aG9kRzogeyJ0aGUgY29uY3JldGUgRyJ9LCBteU1ldGhvZFg6IHsidGhlIGluamVjdGVkIFgifV0KKyAgICAgICAgZGVmIHRlc3RDbGFzcyA9IFByb3h5R2VuZXJhdG9yLmluc3RhbnRpYXRlQWdncmVnYXRlRnJvbUJhc2VDbGFzcyhtYXAsIEFic3RyYWN0Q2xhc3MpCisgICAgICAgIGFzc2VydCB0ZXN0Q2xhc3MgaW5zdGFuY2VvZiBBYnN0cmFjdENsYXNzCisgICAgICAgIGFzc2VydCB0ZXN0Q2xhc3MubXlNZXRob2RBKCkgPT0gInRoZSBvcmlnaW5hbCBBIgorICAgICAgICBhc3NlcnQgdGVzdENsYXNzLm15TWV0aG9kRygpID09ICJ0aGUgY29uY3JldGUgRyIKKyAgICAgICAgYXNzZXJ0IHRlc3RDbGFzcy5teU1ldGhvZFgoKSA9PSAidGhlIGluamVjdGVkIFgiCisgICAgfQorCisgICAgdm9pZCB0ZXN0QWdncmVnYXRlRnJvbUludGVyZmFjZSgpIHsKKyAgICAgICAgTWFwIG1hcCA9IFtteU1ldGhvZEM6IHsidGhlIGluamVjdGVkIEMifV0KKyAgICAgICAgZGVmIHRlc3RDbGFzcyA9IFByb3h5R2VuZXJhdG9yLmluc3RhbnRpYXRlQWdncmVnYXRlRnJvbUludGVyZmFjZShtYXAsIFRlc3RJbnRlcmZhY2UpCisgICAgICAgIGFzc2VydCB0ZXN0Q2xhc3MgaW5zdGFuY2VvZiBUZXN0SW50ZXJmYWNlCisgICAgICAgIGFzc2VydCB0ZXN0Q2xhc3MgaW5zdGFuY2VvZiBHcm9vdnlPYmplY3QKKyAgICAgICAgYXNzZXJ0IHRlc3RDbGFzcy5teU1ldGhvZEMoKSA9PSAidGhlIGluamVjdGVkIEMiCisgICAgfQorCisgICAgdm9pZCB0ZXN0QWdncmVnYXRlKCkgeworICAgICAgICBNYXAgbWFwID0gW215TWV0aG9kRTogeyJ0aGUgaW5qZWN0ZWQgRSJ9LCBteU1ldGhvZEI6IHsidGhlIG5ldyBCIn0sIG15TWV0aG9kWDogeyJ0aGUgaW5qZWN0ZWQgWCJ9XQorICAgICAgICBkZWYgdGVzdENsYXNzID0gUHJveHlHZW5lcmF0b3IuaW5zdGFudGlhdGVBZ2dyZWdhdGUobWFwLCBbVGVzdEludGVyZmFjZSwgVGVzdE90aGVySW50ZXJmYWNlXSwgVGVzdENsYXNzKQorICAgICAgICBhc3NlcnQgdGVzdENsYXNzIGluc3RhbmNlb2YgVGVzdEludGVyZmFjZQorICAgICAgICBhc3NlcnQgdGVzdENsYXNzIGluc3RhbmNlb2YgVGVzdE90aGVySW50ZXJmYWNlCisgICAgICAgIGFzc2VydCB0ZXN0Q2xhc3MgaW5zdGFuY2VvZiBUZXN0Q2xhc3MKKyAgICAgICAgYXNzZXJ0IHRlc3RDbGFzcy5teU1ldGhvZEEoKSA9PSAidGhlIG9yaWdpbmFsIEEiCisgICAgICAgIGFzc2VydCB0ZXN0Q2xhc3MubXlNZXRob2RCKCkgPT0gInRoZSBuZXcgQiIKKyAgICAgICAgYXNzZXJ0IHRlc3RDbGFzcy5teU1ldGhvZFgoKSA9PSAidGhlIGluamVjdGVkIFgiCisgICAgICAgIGFzc2VydCB0ZXN0Q2xhc3MubXlNZXRob2RFKCkgPT0gInRoZSBpbmplY3RlZCBFIgorICAgIH0KKworICAgIHZvaWQgdGVzdERlbGVnYXRlKCkgeworICAgICAgICBkZWYgZGVsZWdhdGUgPSBuZXcgVGVzdENsYXNzKCkKKyAgICAgICAgTWFwIG1hcCA9IFtteU1ldGhvZEU6IHsidGhlIGluamVjdGVkIEUifSwgbXlNZXRob2RCOiB7InRoZSBuZXcgQiJ9LCBteU1ldGhvZFg6IHsidGhlIGluamVjdGVkIFgifV0KKyAgICAgICAgZGVmIHRlc3RDbGFzcyA9IFByb3h5R2VuZXJhdG9yLmluc3RhbnRpYXRlRGVsZWdhdGUobWFwLCBbVGVzdEludGVyZmFjZSwgVGVzdE90aGVySW50ZXJmYWNlXSwgZGVsZWdhdGUpCisgICAgICAgIGFzc2VydCB0ZXN0Q2xhc3MgaW5zdGFuY2VvZiBUZXN0SW50ZXJmYWNlCisgICAgICAgIGFzc2VydCB0ZXN0Q2xhc3MgaW5zdGFuY2VvZiBUZXN0T3RoZXJJbnRlcmZhY2UKKyAgICAgICAgYXNzZXJ0IHRlc3RDbGFzcy5teU1ldGhvZEEoKSA9PSAidGhlIG9yaWdpbmFsIEEiCisgICAgICAgIGFzc2VydCB0ZXN0Q2xhc3MubXlNZXRob2RCKCkgPT0gInRoZSBuZXcgQiIKKyAgICAgICAgYXNzZXJ0IHRlc3RDbGFzcy5teU1ldGhvZFgoKSA9PSAidGhlIGluamVjdGVkIFgiCisgICAgICAgIGFzc2VydCB0ZXN0Q2xhc3MubXlNZXRob2RFKCkgPT0gInRoZSBpbmplY3RlZCBFIgorICAgIH0KKworICAgIHZvaWQgdGVzdERlbGVnYXRlV2l0aEJhc2VDbGFzcygpIHsKKyAgICAgICAgZGVmIGRlbGVnYXRlID0gbmV3IFRlc3RDbGFzcygpCisgICAgICAgIE1hcCBtYXAgPSBbbXlNZXRob2RFOiB7InRoZSBpbmplY3RlZCBFIn0sIG15TWV0aG9kQjogeyJ0aGUgbmV3IEIifSwgbXlNZXRob2RYOiB7InRoZSBpbmplY3RlZCBYIn1dCisgICAgICAgIFRlc3RDbGFzcyB0ZXN0Q2xhc3MgPSBQcm94eUdlbmVyYXRvci5pbnN0YW50aWF0ZURlbGVnYXRlV2l0aEJhc2VDbGFzcyhtYXAsIFtUZXN0SW50ZXJmYWNlLCBUZXN0T3RoZXJJbnRlcmZhY2VdLCBkZWxlZ2F0ZSkKKyAgICAgICAgYXNzZXJ0IHRlc3RDbGFzcyBpbnN0YW5jZW9mIFRlc3RJbnRlcmZhY2UKKyAgICAgICAgYXNzZXJ0IHRlc3RDbGFzcyBpbnN0YW5jZW9mIFRlc3RPdGhlckludGVyZmFjZQorICAgICAgICBhc3NlcnQgdGVzdENsYXNzLm15TWV0aG9kQSgpID09ICJ0aGUgb3JpZ2luYWwgQSIKKyAgICAgICAgYXNzZXJ0IHRlc3RDbGFzcy5teU1ldGhvZEIoKSA9PSAidGhlIG5ldyBCIgorICAgICAgICBhc3NlcnQgdGVzdENsYXNzLm15TWV0aG9kWCgpID09ICJ0aGUgaW5qZWN0ZWQgWCIKKyAgICAgICAgYXNzZXJ0IHRlc3RDbGFzcy5teU1ldGhvZEUoKSA9PSAidGhlIGluamVjdGVkIEUiCisgICAgfQorfQorCitjbGFzcyBUZXN0Q2xhc3MgeworICAgIGRlZiBteU1ldGhvZEEoKSB7IHJldHVybiAidGhlIG9yaWdpbmFsIEEiIH0KKyAgICBkZWYgbXlNZXRob2RCKCkgeyByZXR1cm4gInRoZSBvcmlnaW5hbCBCIiB9Cit9CisKK2ludGVyZmFjZSBUZXN0SW50ZXJmYWNlIHsKKyAgICBkZWYgbXlNZXRob2RBKCkKKyAgICBkZWYgbXlNZXRob2RDKCkKKyAgICBkZWYgbXlNZXRob2REKCkKK30KKworaW50ZXJmYWNlIFRlc3RPdGhlckludGVyZmFjZSB7CisgICAgZGVmIG15TWV0aG9kQigpCisgICAgZGVmIG15TWV0aG9kRSgpCisgICAgZGVmIG15TWV0aG9kRigpCit9CisKK2Fic3RyYWN0IGNsYXNzIEFic3RyYWN0Q2xhc3MgeworICAgIGRlZiBteU1ldGhvZEEoKSB7IHJldHVybiAidGhlIG9yaWdpbmFsIEEiIH0KKyAgICBhYnN0cmFjdCBteU1ldGhvZEcoKQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS91dGlsL1Byb3h5VGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3V0aWwvUHJveHlUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjkyMGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS91dGlsL1Byb3h5VGVzdC5ncm9vdnkKQEAgLTAsMCArMSw2NCBAQAorcGFja2FnZSBncm9vdnkudXRpbAorCisvKioKKyogQGF1dGhvciBEaWVyayBLb2VuaWcKKyoqLworY2xhc3MgUHJveHlUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCB0ZXN0U3RyaW5nRGVjb3JhdGlvbigpeworICAgICAgICBkZWYgb3JpZ2luYWwgPSAnZGVjb3JhdGVkIFN0cmluZycKKyAgICAgICAgZGVmIHByb3h5ID0gbmV3IFN0cmluZ0RlY29yYXRvcigpLndyYXAob3JpZ2luYWwpCisgICAgICAgIC8vIG1ldGhvZCwgdGhhdCBpcyBvbmx5IGtub3duIG9uIHByb3h5CisgICAgICAgIGFzc2VydFNhbWUgb3JpZ2luYWwsIHByb3h5LmFkYXB0ZWUKKyAgICAgICAgLy8gbWV0aG9kLCB0aGF0IGlzIG9ubHkga25vd24gb24gYWRhcHRlZSBpcyByZWxheWVkIHRocm91Z2ggdGhlIHByb3h5CisgICAgICAgIGFzc2VydEVxdWFscyBvcmlnaW5hbC5zaXplKCksIHByb3h5LnNpemUoKQorICAgICAgICAvLyBtZXRob2QsIHRoYXQgaXMgYXZhaWxhYmUgaW4gYm90aCBvYmplY3RzIHNob3VsZCBjb21lIGZyb20gcHJveHkKKyAgICAgICAgYXNzZXJ0RXF1YWxzIDAsIHByb3h5Lmxlbmd0aCgpCisgICAgICAgIC8vIG1ldGhvZCwgdGhhdCBpcyBhdmFpbGFiZSBpbiBib3RoIG9iamVjdHMKKyAgICAgICAgLy8gYnV0IHNob3VsZCBjb21lIGZyb20gYWRhcHRlZSBuZWVkcyBleHBsaWNpdCByZWxheQorICAgICAgICBhc3NlcnRFcXVhbHMgb3JpZ2luYWwsIHByb3h5LnRvU3RyaW5nKCkKKyAgICAgICAgLy8gbWV0aG9kIGZyb20gZGVjb3JhdG9yLCB0aGF0IGlzIG5vdCBpbiBhZGFwdGVlCisgICAgICAgIGFzc2VydEVxdWFscyAnbmV3IE1ldGhvZCByZWFjaGVkJywgcHJveHkuc29tZU5ld01ldGhvZCgpCisgICAgfQorCisgIC8qCisgICAqICBTb21lIHRlc3QgY2FzZXMgdG8gcHJvYmUgcGVyY2VpdmVkIHByb2JsZW1zIHdpdGggZWFjaCBhbmQgY29sbGVjdCBvbiBQcm94eSBvYmplY3RzLgorICAgKiAgY2YuIEdST09WWS0xNDYxLiAgSm9uYXRoYW4gQ2FybHNvbiA8Sm9uYXRoYW4uQ2FybHNvbkBrYXR1bi5jb20+IG1hZGUgYSBwcm9wb3NhbCBmb3IgYSB0ZXN0CisgICAqICBhcyBhIHNpbmdsZSBtZXRob2QsIFJ1c3NlbCBXaW5kZXIgPHJ1c3NlbEBydXNzZWwub3JnLnVrPiBzcGxpdCB0aGluZ3MgdXAgd2hlbiBlbnRlcmluZworICAgKiAgdGhlbSBzbyB0aGF0IHRoZXJlIGlzIG9ubHkgYSBzaW5nbGUgYXNzZXJ0IHBlciBtZXRob2QgdG8gdHJ5IGFuZCBtYXhpbWl6ZSB0aGUgYmVuZWZpdCBvZgorICAgKiAgdGhlIHRlc3RzLgorICAgKi8KKworICB2b2lkIHRlc3RQcm94eUNvbGxlY3QgKCApIHsKKyAgICBkZWYgY29sbGVjdGlvbiA9IFsgMSAsIDIgLCAzIF0KKyAgICBkZWYgcHJveHkgPSAoIG5ldyBQcm94eSAoICkgKS53cmFwICggY29sbGVjdGlvbiApIAorICAgIGFzc2VydEVxdWFscyAoIFsgMiAsIDMgLCA0IF0gLCBwcm94eS5jb2xsZWN0IHsgaXQgKyAxIH0gKQorICB9CisKKyAgdm9pZCB0ZXN0UHJveHlBbnkgKCApIHsKKyAgICBkZWYgY29sbGVjdGlvbiA9IFsgMSAsIDIgLCAzIF0KKyAgICBkZWYgcHJveHkgPSAoIG5ldyBQcm94eSAoICkgKS53cmFwICggY29sbGVjdGlvbiApIAorICAgIGFzc2VydEVxdWFscyAoIHRydWUgLCBwcm94eS5hbnkgeyBpdCA9PSAyIH0gKQorICB9CisKKyAgdm9pZCB0ZXN0UHJveHlGaW5kICggKSB7CisgICAgZGVmIGNvbGxlY3Rpb24gPSBbIDEgLCAyICwgMyBdCisgICAgZGVmIHByb3h5ID0gKCBuZXcgUHJveHkgKCApICkud3JhcCAoIGNvbGxlY3Rpb24gKSAKKyAgICBhc3NlcnRFcXVhbHMgKCAyICwgcHJveHkuZmluZCB7IGl0ID09IDIgfSApCisgIH0KKworICB2b2lkIHRlc3RQcm94eUVhY2ggKCApIHsKKyAgICBkZWYgY29sbGVjdGlvbiA9IFsgMSAsIDIgLCAzIF0KKyAgICBkZWYgcHJveHkgPSAoIG5ldyBQcm94eSAoICkgKS53cmFwICggY29sbGVjdGlvbiApIAorICAgIGRlZiB0ZXN0U3RyaW5nID0gJycKKyAgICBwcm94eS5lYWNoIHsgdGVzdFN0cmluZyArPSBpdCB9CisgICAgYXNzZXJ0RXF1YWxzICggJzEyMycgLCB0ZXN0U3RyaW5nICkKKyAgfQorCit9CisKK2NsYXNzIFN0cmluZ0RlY29yYXRvciBleHRlbmRzIFByb3h5eworICAgIGludCBsZW5ndGgoKSAgICAgICAgICB7IDAgfQorICAgIFN0cmluZyB0b1N0cmluZygpICAgICB7IGFkYXB0ZWUudG9TdHJpbmcoKX0KKyAgICBTdHJpbmcgc29tZU5ld01ldGhvZCgpeyAnbmV3IE1ldGhvZCByZWFjaGVkJyB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3V0aWwvU3Bvb2ZUYXNrLmphdmEgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3V0aWwvU3Bvb2ZUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRjYzhkZAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvdXRpbC9TcG9vZlRhc2suamF2YQpAQCAtMCwwICsxLDMxIEBACitwYWNrYWdlIGdyb292eS51dGlsOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuSW52b2tlckhlbHBlcjsKKworcHVibGljIGNsYXNzIFNwb29mVGFzayBleHRlbmRzIFRhc2sgeworICAgIHByaXZhdGUgaW50IGZvbzsKKworICAgIHB1YmxpYyBTcG9vZlRhc2soKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIFNwb29mVGFza0NvbnRhaW5lci5zcG9vZigiU3Bvb2ZUYXNrIGN0b3IiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGb28oZmluYWwgaW50IGkpIHsKKyAgICAgICAgZm9vID0gaTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBTcG9vZlRhc2tDb250YWluZXIuc3Bvb2YoImJlZ2luIFNwb29mVGFzayBleGVjdXRlIik7CisgICAgICAgIFNwb29mVGFza0NvbnRhaW5lci5zcG9vZigidGFnIG5hbWUgZnJvbSB3cmFwcGVyOiAiICsgZ2V0V3JhcHBlcigpLmdldEVsZW1lbnRUYWcoKSk7CisgICAgICAgIC8vIGRvbid0IHJlbHkgb24gTWFwLnRvU3RyaW5nKCksIGJlaGF2aW91ciBpcyBub3QgZG9jdW1lbnRlZAorICAgICAgICBTcG9vZlRhc2tDb250YWluZXIuc3Bvb2YoImF0dHJpYnV0ZXMgbWFwIGZyb20gd3JhcHBlcjogIgorICAgICAgICAgICAgICAgICsgSW52b2tlckhlbHBlci50b01hcFN0cmluZyhnZXRXcmFwcGVyKCkuZ2V0QXR0cmlidXRlTWFwKCkpKTsKKyAgICAgICAgU3Bvb2ZUYXNrQ29udGFpbmVyLnNwb29mKCJwYXJhbSBmb286ICIgKyBmb28pOworCisgICAgICAgIFNwb29mVGFza0NvbnRhaW5lci5zcG9vZigiZW5kIFNwb29mVGFzayBleGVjdXRlIik7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3V0aWwvU3Bvb2ZUYXNrQ29udGFpbmVyLmphdmEgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3V0aWwvU3Bvb2ZUYXNrQ29udGFpbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU4N2UyNwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvdXRpbC9TcG9vZlRhc2tDb250YWluZXIuamF2YQpAQCAtMCwwICsxLDU0IEBACitwYWNrYWdlIGdyb292eS51dGlsOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrQ29udGFpbmVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlVua25vd25FbGVtZW50OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBTcG9vZlRhc2tDb250YWluZXIgZXh0ZW5kcyBUYXNrIGltcGxlbWVudHMgVGFza0NvbnRhaW5lciB7CisgICAgcHJpdmF0ZSBMaXN0IHRhc2tzID0gbmV3IEFycmF5TGlzdCgpOworICAgIHN0YXRpYyBTdHJpbmdCdWZmZXIgc3Bvb2YgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisKKyAgICBwdWJsaWMgU3Bvb2ZUYXNrQ29udGFpbmVyKCkgeworICAgICAgICBzdXBlcigpOworICAgICAgICBzcG9vZigiU3Bvb2ZUYXNrQ29udGFpbmVyIGN0b3IiKTsKKyAgICB9CisKKyAgICBzdGF0aWMgU3RyaW5nQnVmZmVyIGdldFNwb29mKCkgeworICAgICAgICByZXR1cm4gc3Bvb2Y7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgcmVzZXRTcG9vZigpIHsKKyAgICAgICAgc3Bvb2YgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgc3Bvb2YoU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgc3Bvb2YuYXBwZW5kKG1lc3NhZ2UpOworICAgICAgICBzcG9vZi5hcHBlbmQoIlxuIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkVGFzayhUYXNrIHRhc2spIHsKKyAgICAgICAgLy8gdG8gd29yayB3aXRoIGFudCAxLjYKKyAgICAgICAgc3Bvb2YoImluIGFkZFRhc2siKTsKKyAgICAgICAgaWYgKHRhc2sgaW5zdGFuY2VvZiBVbmtub3duRWxlbWVudCkgeworICAgICAgICAgICAgc3Bvb2YoImNvbmZpZ3VyaW5nIFVua25vd25FbGVtZW50Iik7CisgICAgICAgICAgICB0YXNrLm1heWJlQ29uZmlndXJlKCk7CisgICAgICAgICAgICB0YXNrID0gKChVbmtub3duRWxlbWVudCkgdGFzaykuZ2V0VGFzaygpOworICAgICAgICB9CisgICAgICAgIHRhc2tzLmFkZCh0YXNrKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgc3Bvb2YoImJlZ2luIFNwb29mVGFza0NvbnRhaW5lciBleGVjdXRlIik7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHRhc2tzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgVGFzayB0YXNrID0gKFRhc2spIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgdGFzay5wZXJmb3JtKCk7CisgICAgICAgIH0KKyAgICAgICAgc3Bvb2YoImVuZCBTcG9vZlRhc2tDb250YWluZXIgZXhlY3V0ZSIpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS91dGlsL1N0cmluZ1Rlc3RVdGlsLmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvdXRpbC9TdHJpbmdUZXN0VXRpbC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRmN2JiMQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvdXRpbC9TdHJpbmdUZXN0VXRpbC5ncm9vdnkKQEAgLTAsMCArMSwxNCBAQAorcGFja2FnZSBncm9vdnkudXRpbA0KKw0KK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0DQorDQorY2xhc3MgU3RyaW5nVGVzdFV0aWwgew0KKyAgICBzdGF0aWMgdm9pZCBhc3NlcnRNdWx0aWxpbmVTdHJpbmdzRXF1YWwoU3RyaW5nIGEsIFN0cmluZyBiKSB7DQorICAgICAgICBkZWYgYUxpbmVzID0gYS50cmltKCkucmVwbGFjZUFsbCgnXHInLCcnKS5zcGxpdCgnXG4nKQ0KKyAgICAgICAgZGVmIGJMaW5lcyA9IGIudHJpbSgpLnJlcGxhY2VBbGwoJ1xyJywnJykuc3BsaXQoJ1xuJykNCisgICAgICAgIGFzc2VydCBhTGluZXMuc2l6ZSgpID09IGJMaW5lcy5zaXplKCkNCisgICAgICAgIGZvciAoaSBpbiAwLi48YUxpbmVzLnNpemUoKSkgew0KKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYUxpbmVzW2ldLnRyaW0oKSwgYkxpbmVzW2ldLnRyaW0oKSkNCisgICAgICAgIH0NCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3V0aWwvWG1sUGFyc2VyVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3V0aWwvWG1sUGFyc2VyVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNhYjk5NQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvdXRpbC9YbWxQYXJzZXJUZXN0Lmdyb292eQpAQCAtMCwwICsxLDIzOCBAQAorcGFja2FnZSBncm9vdnkudXRpbAorCitpbXBvcnQgZ3Jvb3Z5LnhtbC5UcmF2ZXJzYWxUZXN0U3VwcG9ydAoraW1wb3J0IGdyb292eS54bWwuR3BhdGhTeW50YXhUZXN0U3VwcG9ydAoraW1wb3J0IGdyb292eS54bWwuTWl4ZWRNYXJrdXBUZXN0U3VwcG9ydAorCitjbGFzcyBYbWxQYXJzZXJUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgZGVmIGdldFJvb3QgPSB7IHhtbCAtPiBuZXcgWG1sUGFyc2VyKCkucGFyc2VUZXh0KHhtbCkgfQorCisgICAgc3RhdGljIGJvb2tYbWwgPSAiIiIKKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9IVE1MLzE5OTgvaHRtbDQiCisgIHhtbG5zOmc9Imh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnL3JvbGVzIgorICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPgorICA8aGVhZD48dGl0bGU+R0lOQSBCb29rIFJldmlldzwvdGl0bGU+PC9oZWFkPgorICA8Ym9keT4KKzxoMT48ZGM6dGl0bGU+R3Jvb3Z5IGluIEFjdGlvbiBSZXZpZXc8L2RjOnRpdGxlPjwvaDE+Cis8dGFibGU+CisgIDx0ciBhbGlnbj0iY2VudGVyIj4KKyAgICA8dGQ+QXV0aG9yPC90ZD48dGQ+UHJpY2U8L3RkPjx0ZD5QYWdlczwvdGQ+PHRkPkRhdGU8L3RkPgorICA8L3RyPgorICA8dHIgYWxpZ249ImxlZnQiPgorICAgIDx0ZD48ZGM6YXV0aG9yPgorICAgICAgPGc6ZGV2ZWxvcGVyPkRpZXJrIEv2bmlnPC9nOmRldmVsb3Blcj4sCisgICAgICA8ZzphZHZvY2F0ZT5BbmRyZXcgR2xvdmVyPC9nOmFkdm9jYXRlPiwKKyAgICAgIDxnOmRldmVsb3Blcj5QYXVsIEtpbmc8L2c6ZGV2ZWxvcGVyPiwKKyAgICAgIDxnOnByb2plY3RtYW5hZ2VyPkd1aWxsYXVtZSBMYWZvcmdlPC9nOnByb2plY3RtYW5hZ2VyPiwKKyAgICAgIDxnOmFkdm9jYXRlPkpvbiBTa2VldDwvZzphZHZvY2F0ZT4sCisgICAgPC9kYzphdXRob3I+PC90ZD4KKyAgICA8dGQ+NDkuOTk8L3RkPgorICAgIDx0ZD42OTY8L3RkPgorICAgIDx0ZD48ZGM6ZGF0ZT5KYW51YXJ5LCAyMDA3PC9kYzpkYXRlPjwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorPHA+UmV2aWV3OiBHcmVhdCBib29rITwvcD4KKyAgPC9ib2R5PgorPC9odG1sPgorIiIiCisKKyAgICB2b2lkIHRlc3ROb2RlUHJpbnRlcigpIHsKKyAgICAgICAgZGVmIHRleHQgPSAiIiIKKzxwPlBsZWFzZSByZWFkIHRoZSA8YSBocmVmPSJpbmRleC5odG1sIj5Ib21lPC9hPiBwYWdlPC9wPgorIiIiCisgICAgICAgIGRlZiBub2RlID0gbmV3IFhtbFBhcnNlcigpLnBhcnNlVGV4dCh0ZXh0KQorICAgICAgICBkZWYgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpCisgICAgICAgIG5ldyBOb2RlUHJpbnRlcihuZXcgUHJpbnRXcml0ZXIoc3cpKS5wcmludChub2RlKQorICAgICAgICBkZWYgcmVzdWx0ID0gZml4RU9Mcyhzdy50b1N0cmluZygpKQorICAgICAgICBkZWYgZXhwZWN0ZWQgPSAnJydcCitwKCkgeworICBidWlsZGVyLmFwcGVuZChQbGVhc2UgcmVhZCB0aGUpCisgIGEoaHJlZjonaW5kZXguaHRtbCcpIHsKKyAgICBidWlsZGVyLmFwcGVuZChIb21lKQorICB9CisgIGJ1aWxkZXIuYXBwZW5kKHBhZ2UpCit9CisnJycKKyAgICAgICAgYXNzZXJ0IHJlc3VsdCA9PSBleHBlY3RlZAorICAgIH0KKworICAgIHZvaWQgdGVzdFhtbE5vZGVQcmludGVyKCkgeworICAgICAgICBkZWYgdGV4dCA9ICIiIgorPHA+UGxlYXNlIHJlYWQgdGhlIDxhIGhyZWY9ImluZGV4Lmh0bWwiPkhvbWU8L2E+IHBhZ2U8L3A+CisiIiIKKyAgICAgICAgZGVmIG5vZGUgPSBuZXcgWG1sUGFyc2VyKCkucGFyc2VUZXh0KHRleHQpCisgICAgICAgIGRlZiBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCkKKyAgICAgICAgbmV3IFhtbE5vZGVQcmludGVyKG5ldyBQcmludFdyaXRlcihzdykpLnByaW50KG5vZGUpCisgICAgICAgIGRlZiByZXN1bHQgPSBmaXhFT0xzKHN3LnRvU3RyaW5nKCkpCisgICAgICAgIGRlZiBleHBlY3RlZCA9ICcnJ1wKKzxwPgorICBQbGVhc2UgcmVhZCB0aGUKKyAgPGEgaHJlZj0iaW5kZXguaHRtbCI+CisgICAgSG9tZQorICA8L2E+CisgIHBhZ2UKKzwvcD4KKycnJworICAgICAgICBhc3NlcnQgcmVzdWx0ID09IGV4cGVjdGVkCisgICAgfQorCisgICAgdm9pZCB0ZXN0WG1sTm9kZVByaW50ZXJOYW1lc3BhY2VzKCkgeworICAgICAgICBkZWYgaHRtbCA9IG5ldyBYbWxQYXJzZXIoKS5wYXJzZVRleHQoYm9va1htbCkKKyAgICAgICAgZGVmIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKQorICAgICAgICBuZXcgWG1sTm9kZVByaW50ZXIobmV3IFByaW50V3JpdGVyKHN3KSkucHJpbnQoaHRtbCkKKyAgICAgICAgZGVmIHJlc3VsdCA9IGZpeEVPTHMoc3cudG9TdHJpbmcoKSkKKyAgICAgICAgZGVmIGV4cGVjdGVkID0gJycnXAorPGh0bWw+CisgIDxoZWFkPgorICAgIDx0aXRsZT4KKyAgICAgIEdJTkEgQm9vayBSZXZpZXcKKyAgICA8L3RpdGxlPgorICA8L2hlYWQ+CisgIDxib2R5PgorICAgIDxoMT4KKyAgICAgIDxkYzp0aXRsZT4KKyAgICAgICAgR3Jvb3Z5IGluIEFjdGlvbiBSZXZpZXcKKyAgICAgIDwvZGM6dGl0bGU+CisgICAgPC9oMT4KKyAgICA8dGFibGU+CisgICAgICA8dHIgYWxpZ249ImNlbnRlciI+CisgICAgICAgIDx0ZD4KKyAgICAgICAgICBBdXRob3IKKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkPgorICAgICAgICAgIFByaWNlCisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZD4KKyAgICAgICAgICBQYWdlcworICAgICAgICA8L3RkPgorICAgICAgICA8dGQ+CisgICAgICAgICAgRGF0ZQorICAgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0ciBhbGlnbj0ibGVmdCI+CisgICAgICAgIDx0ZD4KKyAgICAgICAgICA8ZGM6YXV0aG9yPgorICAgICAgICAgICAgPGc6ZGV2ZWxvcGVyPgorICAgICAgICAgICAgICBEaWVyayBL9m5pZworICAgICAgICAgICAgPC9nOmRldmVsb3Blcj4KKyAgICAgICAgICAgICwKKyAgICAgICAgICAgIDxnOmFkdm9jYXRlPgorICAgICAgICAgICAgICBBbmRyZXcgR2xvdmVyCisgICAgICAgICAgICA8L2c6YWR2b2NhdGU+CisgICAgICAgICAgICAsCisgICAgICAgICAgICA8ZzpkZXZlbG9wZXI+CisgICAgICAgICAgICAgIFBhdWwgS2luZworICAgICAgICAgICAgPC9nOmRldmVsb3Blcj4KKyAgICAgICAgICAgICwKKyAgICAgICAgICAgIDxnOnByb2plY3RtYW5hZ2VyPgorICAgICAgICAgICAgICBHdWlsbGF1bWUgTGFmb3JnZQorICAgICAgICAgICAgPC9nOnByb2plY3RtYW5hZ2VyPgorICAgICAgICAgICAgLAorICAgICAgICAgICAgPGc6YWR2b2NhdGU+CisgICAgICAgICAgICAgIEpvbiBTa2VldAorICAgICAgICAgICAgPC9nOmFkdm9jYXRlPgorICAgICAgICAgICAgLAorICAgICAgICAgIDwvZGM6YXV0aG9yPgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQ+CisgICAgICAgICAgNDkuOTkKKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkPgorICAgICAgICAgIDY5NgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQ+CisgICAgICAgICAgPGRjOmRhdGU+CisgICAgICAgICAgICBKYW51YXJ5LCAyMDA3CisgICAgICAgICAgPC9kYzpkYXRlPgorICAgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICA8L3RhYmxlPgorICAgIDxwPgorICAgICAgUmV2aWV3OiBHcmVhdCBib29rIQorICAgIDwvcD4KKyAgPC9ib2R5PgorPC9odG1sPgorJycnCisgICAgICAgIGFzc2VydCByZXN1bHQgPT0gZXhwZWN0ZWQKKyAgICB9CisKKyAgICB2b2lkIHRlc3ROYW1lc3BhY2VHUGF0aCgpIHsKKyAgICAgICAgZGVmIGFueU5hbWUgPSBuZXcgZ3Jvb3Z5LnhtbC5RTmFtZSgiKiIsICIqIikKKyAgICAgICAgZGVmIGFueUh0bWwgPSBuZXcgZ3Jvb3Z5LnhtbC5RTmFtZSgiaHR0cDovL3d3dy53My5vcmcvSFRNTC8xOTk4L2h0bWw0IiwgIioiKQorICAgICAgICBkZWYgYW55VGl0bGUgPSBuZXcgZ3Jvb3Z5LnhtbC5RTmFtZSgiKiIsICJ0aXRsZSIpCisgICAgICAgIGRlZiBodG1sID0gbmV3IFhtbFBhcnNlcigpLnBhcnNlVGV4dChib29rWG1sKQorCisgICAgICAgIC8vIHFuYW1lIHN0eWxlCisgICAgICAgIGRlZiByZXN1bHQgPSBodG1sW2FueU5hbWVdW2FueUh0bWxdW2FueVRpdGxlXS50ZXh0KCkKKyAgICAgICAgYXNzZXJ0IHJlc3VsdCA9PSAnR3Jvb3Z5IGluIEFjdGlvbiBSZXZpZXcnCisKKyAgICAgICAgLy8gc3RyaW5nIHdpbGRjYXJkIHN0eWxlCisgICAgICAgIHJlc3VsdCA9IGh0bWwuJyo6KicuJzoqJy4nKjp0aXRsZScudGV4dCgpCisgICAgICAgIGFzc2VydCByZXN1bHQgPT0gJ0dyb292eSBpbiBBY3Rpb24gUmV2aWV3JworCisgICAgICAgIC8vIGp1c3QgZm9yIGZ1biwgbWl4IHRoZSBzdHlsZXMKKyAgICAgICAgcmVzdWx0ID0gaHRtbC4nKicuJ2h0dHA6Ly93d3cudzMub3JnL0hUTUwvMTk5OC9odG1sNDoqJ1thbnlUaXRsZV0udGV4dCgpCisgICAgICAgIGFzc2VydCByZXN1bHQgPT0gJ0dyb292eSBpbiBBY3Rpb24gUmV2aWV3JworCisgICAgICAgIC8vIHRyeSB0cmF2ZXJzYWwKKyAgICAgICAgYXNzZXJ0IGh0bWwuJyoqJ1snZGM6KiddKi5uYW1lKCkqLmxvY2FsUGFydCA9PSBbInRpdGxlIiwgImF1dGhvciIsICJkYXRlIl0KKyAgICB9CisKKyAgICB2b2lkIHRlc3RFbGVtZW50KCkgeworICAgICAgICBHcGF0aFN5bnRheFRlc3RTdXBwb3J0LmNoZWNrRWxlbWVudChnZXRSb290KQorICAgICAgICBHcGF0aFN5bnRheFRlc3RTdXBwb3J0LmNoZWNrRmluZEVsZW1lbnQoZ2V0Um9vdCkKKyAgICAgICAgR3BhdGhTeW50YXhUZXN0U3VwcG9ydC5jaGVja0VsZW1lbnRUeXBlcyhnZXRSb290KQorICAgICAgICBHcGF0aFN5bnRheFRlc3RTdXBwb3J0LmNoZWNrRWxlbWVudENsb3N1cmVJbnRlcmFjdGlvbihnZXRSb290KQorICAgIH0KKworICAgIHZvaWQgdGVzdEF0dHJpYnV0ZSgpIHsKKyAgICAgICAgR3BhdGhTeW50YXhUZXN0U3VwcG9ydC5jaGVja0F0dHJpYnV0ZShnZXRSb290KQorICAgICAgICBHcGF0aFN5bnRheFRlc3RTdXBwb3J0LmNoZWNrQXR0cmlidXRlcyhnZXRSb290KQorICAgIH0KKworICAgIHZvaWQgdGVzdE5hdmlnYXRpb24oKSB7CisgICAgICAgIEdwYXRoU3ludGF4VGVzdFN1cHBvcnQuY2hlY2tDaGlsZHJlbihnZXRSb290KQorICAgICAgICBHcGF0aFN5bnRheFRlc3RTdXBwb3J0LmNoZWNrUGFyZW50KGdldFJvb3QpCisgICAgICAgIEdwYXRoU3ludGF4VGVzdFN1cHBvcnQuY2hlY2tOZXN0ZWRTaXplRXhwcmVzc2lvbnMoZ2V0Um9vdCkKKyAgICB9CisKKyAgICB2b2lkIHRlc3RUcmF2ZXJzYWwoKSB7CisgICAgICAgIFRyYXZlcnNhbFRlc3RTdXBwb3J0LmNoZWNrRGVwdGhGaXJzdChnZXRSb290KQorICAgICAgICBUcmF2ZXJzYWxUZXN0U3VwcG9ydC5jaGVja0JyZWFkdGhGaXJzdChnZXRSb290KQorICAgIH0KKworICAgIHZvaWQgdGVzdE1peGVkTWFya3VwKCkgeworICAgICAgICBNaXhlZE1hcmt1cFRlc3RTdXBwb3J0LmNoZWNrTWl4ZWRNYXJrdXAoZ2V0Um9vdCkKKyAgICB9CisKKyAgICB2b2lkIHRlc3RXaGl0ZXNwYWNlVHJpbW1pbmcoKSB7CisgICAgICAgIGRlZiB0ZXh0ID0gJzxvdXRlcj48aW5uZXI+ICAgSGVyZSBpcyBzb21lIHRleHQgICAgPC9pbm5lcj48L291dGVyPicKKyAgICAgICAgZGVmIHBhcnNlciA9IG5ldyBYbWxQYXJzZXIoKQorICAgICAgICBkZWYgb3V0ZXIgPSBwYXJzZXIucGFyc2VUZXh0KHRleHQpCisgICAgICAgIGFzc2VydCBvdXRlci5pbm5lci50ZXh0KCkgPT0gJ0hlcmUgaXMgc29tZSB0ZXh0JworICAgICAgICBwYXJzZXIuc2V0VHJpbVdoaXRlc3BhY2UgZmFsc2UKKyAgICAgICAgb3V0ZXIgPSBwYXJzZXIucGFyc2VUZXh0KHRleHQpCisgICAgICAgIGFzc2VydCBvdXRlci5pbm5lci50ZXh0KCkgPT0gJyAgIEhlcmUgaXMgc29tZSB0ZXh0ICAgICcKKyAgICB9CisKKyAgICB2b2lkIHRlc3RVcGRhdGUoKSB7CisgICAgICAgIGRlZiB4bWwgPSAnPHJvb3Q+PC9yb290PicKKyAgICAgICAgZGVmIHBhcnNlciA9IG5ldyBYbWxQYXJzZXIoKQorICAgICAgICBkZWYgcm9vdCA9IHBhcnNlci5wYXJzZVRleHQoeG1sKQorICAgICAgICByb290LmFwcGVuZE5vZGUoJ2NoaWxkJywgW2F0dHI6J2NoaWxkIGF0dHInXSwgJ2NoaWxkIHRleHQnKQorICAgICAgICByb290LkBhdHRyID0gJ3Jvb3QgYXR0cicKKyAgICAgICAgcm9vdC4nQG90aGVyJyA9ICdvdGhlciBhdHRyJworCisgICAgICAgIGRlZiB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCkKKyAgICAgICAgbmV3IFhtbE5vZGVQcmludGVyKG5ldyBQcmludFdyaXRlcih3cml0ZXIpKS5wcmludChyb290KQorICAgICAgICBkZWYgcmVzdWx0ID0gd3JpdGVyLnRvU3RyaW5nKCkKKyAgICAgICAgYXNzZXJ0IHJlc3VsdCA9PSAnJydcCis8cm9vdCBhdHRyPSJyb290IGF0dHIiIG90aGVyPSJvdGhlciBhdHRyIj4KKyAgPGNoaWxkIGF0dHI9ImNoaWxkIGF0dHIiPgorICAgIGNoaWxkIHRleHQKKyAgPC9jaGlsZD4KKzwvcm9vdD4KKycnJworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvdXRpbC9YbWxTbHVycGVyVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3V0aWwvWG1sU2x1cnBlclRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ODNjOTgKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3V0aWwvWG1sU2x1cnBlclRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsNzkgQEAKK3BhY2thZ2UgZ3Jvb3Z5LnV0aWwKKworaW1wb3J0IGdyb292eS54bWwuVHJhdmVyc2FsVGVzdFN1cHBvcnQKK2ltcG9ydCBncm9vdnkueG1sLkdwYXRoU3ludGF4VGVzdFN1cHBvcnQKK2ltcG9ydCBncm9vdnkueG1sLk1peGVkTWFya3VwVGVzdFN1cHBvcnQKK2ltcG9ydCBncm9vdnkueG1sLlN0cmVhbWluZ01hcmt1cEJ1aWxkZXIKKworY2xhc3MgWG1sU2x1cnBlclRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICBkZWYgZ2V0Um9vdCA9IHsgeG1sIC0+IG5ldyBYbWxTbHVycGVyKCkucGFyc2VUZXh0KHhtbCkgfQorCisgICAgdm9pZCB0ZXN0V3NkbCgpIHsKKyAgICAgICAgZGVmIHdzZGwgPSAnJycKKyAgICAgICAgICAgIDxkZWZpbml0aW9ucyBuYW1lPSJBZ2VuY3lNYW5hZ2VtZW50U2VydmljZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICB4bWxuczpuczE9Imh0dHA6Ly93d3cuZXhhbXBsZS5vcmcvTlMxIgorICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCisgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIKKyAgICAgICAgICAgICAgICAgICAgICAgICB4bWxuczpzb2FwZW5jPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKKyAgICAgICAgICAgICAgICAgICAgICAgICB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKKyAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICA8bWVzc2FnZSBuYW1lPSJTb21lUmVxdWVzdCI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczE6U29tZVJlcSIgLz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgPC9tZXNzYWdlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICA8bWVzc2FnZSBuYW1lPSJTb21lUmVzcG9uc2UiPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJyZXN1bHQiIGVsZW1lbnQ9Im5zMTpTb21lUnNwIiAvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgPC9tZXNzYWdlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIDwvZGVmaW5pdGlvbnM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgJycnCisgICAgICAgIGRlZiB4bWwgPSBuZXcgWG1sU2x1cnBlcigpLnBhcnNlVGV4dCh3c2RsKQorICAgICAgICBhc3NlcnQgeG1sLm1lc3NhZ2UucGFydC5AZWxlbWVudC5maW5kQWxsIHtpdCA9fiAvLlJlcSQvfS5zaXplKCkgPT0gMQorICAgICAgICBhc3NlcnQgeG1sLm1lc3NhZ2UucGFydC5maW5kQWxsIHsgdHJ1ZSB9LnNpemUoKSA9PSAyCisgICAgICAgIGFzc2VydCB4bWwubWVzc2FnZS5wYXJ0LmZpbmQgeyBpdC5uYW1lKCkgPT0gJ3BhcnQnIH0ubmFtZSgpID09ICdwYXJ0JworICAgICAgICBhc3NlcnQgeG1sLm1lc3NhZ2UuZmluZEFsbCB7IHRydWUgfS5zaXplKCkgPT0gMgorICAgICAgICBhc3NlcnQgeG1sLm1lc3NhZ2UucGFydC5sb29rdXBOYW1lc3BhY2UoIm5zMSIpID09ICJodHRwOi8vd3d3LmV4YW1wbGUub3JnL05TMSIKKyAgICAgICAgYXNzZXJ0IHhtbC5tZXNzYWdlLnBhcnQubG9va3VwTmFtZXNwYWNlKCIiKSA9PSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCisgICAgICAgIGFzc2VydCB4bWwubWVzc2FnZS5wYXJ0Lmxvb2t1cE5hbWVzcGFjZSgidW5kZWZpbmVkUHJlZml4IikgPT0gbnVsbAorICAgICAgICB4bWwubWVzc2FnZS5maW5kQWxsIHsgdHJ1ZSB9LmVhY2ggeyBhc3NlcnQgaXQubmFtZSgpID09ICJtZXNzYWdlIn0KKyAgICB9CisKKyAgICB2b2lkIHRlc3RFbGVtZW50KCkgeworICAgICAgICBHcGF0aFN5bnRheFRlc3RTdXBwb3J0LmNoZWNrRWxlbWVudChnZXRSb290KQorICAgICAgICBHcGF0aFN5bnRheFRlc3RTdXBwb3J0LmNoZWNrRmluZEVsZW1lbnQoZ2V0Um9vdCkKKyAgICAgICAgR3BhdGhTeW50YXhUZXN0U3VwcG9ydC5jaGVja0VsZW1lbnRUeXBlcyhnZXRSb290KQorICAgICAgICBHcGF0aFN5bnRheFRlc3RTdXBwb3J0LmNoZWNrRWxlbWVudENsb3N1cmVJbnRlcmFjdGlvbihnZXRSb290KQorICAgIH0KKworICAgIHZvaWQgdGVzdEF0dHJpYnV0ZSgpIHsKKyAgICAgICAgR3BhdGhTeW50YXhUZXN0U3VwcG9ydC5jaGVja0F0dHJpYnV0ZShnZXRSb290KQorICAgICAgICBHcGF0aFN5bnRheFRlc3RTdXBwb3J0LmNoZWNrQXR0cmlidXRlcyhnZXRSb290KQorICAgIH0KKworICAgIHZvaWQgdGVzdE5hdmlnYXRpb24oKSB7CisgICAgICAgIEdwYXRoU3ludGF4VGVzdFN1cHBvcnQuY2hlY2tDaGlsZHJlbihnZXRSb290KQorICAgICAgICBHcGF0aFN5bnRheFRlc3RTdXBwb3J0LmNoZWNrUGFyZW50KGdldFJvb3QpCisgICAgICAgIEdwYXRoU3ludGF4VGVzdFN1cHBvcnQuY2hlY2tOZXN0ZWRTaXplRXhwcmVzc2lvbnMoZ2V0Um9vdCkKKyAgICB9CisKKyAgICB2b2lkIHRlc3RUcmF2ZXJzYWwoKSB7CisgICAgICAgIFRyYXZlcnNhbFRlc3RTdXBwb3J0LmNoZWNrRGVwdGhGaXJzdChnZXRSb290KQorICAgICAgICBUcmF2ZXJzYWxUZXN0U3VwcG9ydC5jaGVja0JyZWFkdGhGaXJzdChnZXRSb290KQorICAgIH0KKworICAgIHZvaWQgdGVzdE1peGVkTWFya3VwKCkgeworICAgICAgICBNaXhlZE1hcmt1cFRlc3RTdXBwb3J0LmNoZWNrTWl4ZWRNYXJrdXAoZ2V0Um9vdCkKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0UmVwbGFjZSgpIHsKKyAgICAgICAgZGVmIGlucHV0ID0gIjxkb2M+PHNlYz5IZWxsbzxwPldvcmxkPC9wPjwvc2VjPjwvZG9jPiIKKyAgICAgICAgZGVmIHJlcGxhY2VTbHVycGVyID0gbmV3IFhtbFNsdXJwZXIoKS5wYXJzZVRleHQoaW5wdXQpIAorICAgICAgICAKKyAgICAgICAgcmVwbGFjZVNsdXJwZXIuc2VjLnJlcGxhY2VOb2RleyBub2RlIC0+CisgICAgICAgICAgdCgpeyBkZWxlZ2F0ZS5ta3AueWllbGQgbm9kZS5nZXRCb2R5KCkgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBkZWYgb3V0cHV0U2x1cnBlciA9IG5ldyBTdHJlYW1pbmdNYXJrdXBCdWlsZGVyKCkKKyAgICAgICAgU3RyaW5nIG91dHB1dCA9IG91dHB1dFNsdXJwZXIuYmluZHsgbWtwLnlpZWxkIHJlcGxhY2VTbHVycGVyIH0KKyAgICAgICAgYXNzZXJ0IG91dHB1dCA9PSAiPGRvYz48dD5IZWxsbzxwPldvcmxkPC9wPjwvdD48L2RvYz4iCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS91dGlsL3N1aXRlL0FUZXN0U2NyaXB0VGhhdHNOb1Rlc3RDYXNlLmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvdXRpbC9zdWl0ZS9BVGVzdFNjcmlwdFRoYXRzTm9UZXN0Q2FzZS5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVkZTI5NgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvdXRpbC9zdWl0ZS9BVGVzdFNjcmlwdFRoYXRzTm9UZXN0Q2FzZS5ncm9vdnkKQEAgLTAsMCArMSwyIEBACisvLyB1c2VkIGZvciB0ZXN0aW5nIFNjcmlwdFRlc3RDYXNlQWRhcHRlciB1c2FnZSB3aXRoIEFsbFRlc3RTdWl0ZQorYXNzZXJ0IHRydWUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3htbC9ET01UZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkveG1sL0RPTVRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NzQ5ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3htbC9ET01UZXN0Lmdyb292eQpAQCAtMCwwICsxLDgxIEBACitwYWNrYWdlIGdyb292eS54bWwKKworLyoqCisgKiBUaGlzIHRlc3QgdXNlcyB0aGUgY29uY2lzZSBzeW50YXggdG8gdGVzdCB0aGUgYnVpbGRpbmcgb2YgCisgKiBXM0MgRE9NIHRyZWVzIHVzaW5nIEdyb292eU1hcmt1cAorICovCitjbGFzcyBET01UZXN0IGV4dGVuZHMgVGVzdFhtbFN1cHBvcnQgeworICAgIAorICAgIHZvaWQgdGVzdFNtYWxsVHJlZSgpIHsKKyAgICAgICAgZGVmIGIgPSBET01CdWlsZGVyLm5ld0luc3RhbmNlKCkKKyAgICAgICAgCisgICAgICAgIGRlZiByb290ID0gYi5yb290MShhOjUsIGI6NykgeworICAgICAgICAgICAgZWxlbTEoJ2hlbGxvMScpCisgICAgICAgICAgICBlbGVtMignaGVsbG8yJykKKyAgICAgICAgICAgIGVsZW0zKHg6NykKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgYXNzZXJ0IHJvb3QgIT0gbnVsbAorICAgICAgICAKKyAgICAgICAgZHVtcChyb290KQorICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3RUcmVlKCkgeworICAgICAgICBkZWYgYiA9IERPTUJ1aWxkZXIubmV3SW5zdGFuY2UoKQorICAgICAgICAKKyAgICAgICAgZGVmIHJvb3QgPSBiLnJvb3QyKGE6NSwgYjo3KSB7CisgICAgICAgICAgICBlbGVtMSgnaGVsbG8xJykKKyAgICAgICAgICAgIGVsZW0yKCdoZWxsbzInKQorICAgICAgICAgICAgbmVzdGVkRWxlbSh4OidhYmMnLCB5OidkZWYnKSB7CisgICAgICAgICAgICAgICAgY2hpbGQoejonZGVmJykKKyAgICAgICAgICAgICAgICBjaGlsZDIoKSAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG5lc3RlZEVsZW0yKHo6J3p6eicpIHsKKyAgICAgICAgICAgICAgICBjaGlsZCh6OidkZWYnKQorICAgICAgICAgICAgICAgIGNoaWxkMigiaGVsbG8iKSAgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGFzc2VydCByb290ICE9IG51bGwKKyAgICAgICAgCisgICAgICAgIGR1bXAocm9vdCkKKworLyoKKyAgICAgICAgZGVmIGVsZW0xID0gcm9vdC5lbGVtMQorICAgICAgICBhc3NlcnQgZWxlbTEudmFsdWUoKSA6PSAnaGVsbG8xJworICAgICAgICAKKyAgICAgICAgZGVmIGVsZW0yID0gcm9vdC5lbGVtMgorICAgICAgICBhc3NlcnQgZWxlbTIudmFsdWUoKSA6PSAnaGVsbG8yJworCisgICAgICAgIGFzc2VydCByb290LmVsZW0xLnZhbHVlKCkgOj0gJ2hlbGxvMScKKyAgICAgICAgYXNzZXJ0IHJvb3QuZWxlbTIudmFsdWUoKSA6PSAnaGVsbG8yJworCisgICAgICAgIGFzc2VydCByb290Lm5lc3RlZEVsZW0uYXR0cmlidXRlcygpIDo9IFsneCc6J2FiYycsICd5JzonZGVmJ10gICAgICAgIAorICAgICAgICBhc3NlcnQgcm9vdC5uZXN0ZWRFbGVtLmNoaWxkLmF0dHJpYnV0ZXMoKSA6PSBbJ3onOidkZWYnXQorICAgICAgICBhc3NlcnQgcm9vdC5uZXN0ZWRFbGVtLmNoaWxkMi52YWx1ZSgpIDo9IFtdCisgICAgICAgIGFzc2VydCByb290Lm5lc3RlZEVsZW0uY2hpbGQyLnRleHQoKSA6PSAnJworCisgICAgICAgIGFzc2VydCByb290Lm5lc3RlZEVsZW0yLmF0dHJpYnV0ZXMoKSA6PSBbJ3onOid6enonXSAgICAgIAorICAgICAgICBhc3NlcnQgcm9vdC5uZXN0ZWRFbGVtMi5jaGlsZC5hdHRyaWJ1dGVzKCkgOj0gWyd6JzonZGVmJ10KKyAgICAgICAgYXNzZXJ0IHJvb3QubmVzdGVkRWxlbTIuY2hpbGQyLnZhbHVlKCkgOj0gJ2hlbGxvJworICAgICAgICBhc3NlcnQgcm9vdC5uZXN0ZWRFbGVtMi5jaGlsZDIudGV4dCgpIDo9ICdoZWxsbycKKyAgICAgICAgCisgICAgICAgIGRlZiBsaXN0ID0gcm9vdC52YWx1ZSgpCisgICAgICAgIGFzc2VydCBsaXN0LnNpemUoKSA6PSA0CisgICAgICAgIAorICAgICAgICBhc3NlcnQgcm9vdC5hdHRyaWJ1dGVzKCkuYSA6PSA1CisgICAgICAgIGFzc2VydCByb290LmF0dHJpYnV0ZXMoKS5iIDo9IDcKKworICAgICAgICBhc3NlcnQgcm9vdC5uZXN0ZWRFbGVtLmF0dHJpYnV0ZXMoKS54IDo9ICdhYmMnCisgICAgICAgIGFzc2VydCByb290Lm5lc3RlZEVsZW0uYXR0cmlidXRlcygpLnkgOj0gJ2RlZicKKyAgICAgICAgYXNzZXJ0IHJvb3QubmVzdGVkRWxlbTIuYXR0cmlidXRlcygpLnogOj0gJ3p6eicKKyAgICAgICAgYXNzZXJ0IHJvb3QubmVzdGVkRWxlbTIuY2hpbGQuYXR0cmlidXRlcygpLnogOj0gJ2RlZicKKyovICAgICAgICAKKyAgICAgICAgLyoqIEB0b2RvIHBhcnNlciBhZGQgLkAgYXMgYW4gb3BlcmF0aW9uCisgICAgICAgICAgICAgICAgYXNzZXJ0IHJvb3QuQGEgOj0gNQorICAgICAgICAgICAgICAgIGFzc2VydCByb290LkBiIDo9IDcKKyAgICAgICAgKi8gICAgICAgIAorICAgIH0KKyAgICAKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3htbC9GYWN0b3J5U3VwcG9ydFRlc3QuamF2YSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkveG1sL0ZhY3RvcnlTdXBwb3J0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MDkxMjYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3htbC9GYWN0b3J5U3VwcG9ydFRlc3QuamF2YQpAQCAtMCwwICsxLDQ1IEBACitwYWNrYWdlIGdyb292eS54bWw7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb247CisKK3B1YmxpYyBjbGFzcyBGYWN0b3J5U3VwcG9ydFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBQUklWSUxFR0VEX0FDVElPTl9FWENFUFRJT04gPSBuZXcgUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbihuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gUEFSU0VSX0NPTkZJR1VSQVRJT05fRVhDRVBUSU9OID0gbmV3IFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24oKTsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVzRmFjdG9yaWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydE5vdE51bGwoRmFjdG9yeVN1cHBvcnQuY3JlYXRlRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSgpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChGYWN0b3J5U3VwcG9ydC5jcmVhdGVTYXhQYXJzZXJGYWN0b3J5KCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uTm90V3JhcHBlZCgpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEZhY3RvcnlTdXBwb3J0LmNyZWF0ZUZhY3RvcnkobmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgUEFSU0VSX0NPTkZJR1VSQVRJT05fRVhDRVBUSU9OOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHdhcyBub3QgY2F1Z2h0Iik7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBhc3NlcnRTYW1lKFBBUlNFUl9DT05GSUdVUkFUSU9OX0VYQ0VQVElPTiwgdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3RoZXJFeGNlcHRpb25zV3JhcHBlZEFzVW5jaGVja2VkKCkgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgRmFjdG9yeVN1cHBvcnQuY3JlYXRlRmFjdG9yeShuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICB0aHJvdyBQUklWSUxFR0VEX0FDVElPTl9FWENFUFRJT047CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gd2FzIG5vdCBjYXVnaHQiKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgYXNzZXJ0U2FtZShQUklWSUxFR0VEX0FDVElPTl9FWENFUFRJT04sIHJlLmdldENhdXNlKCkpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHdhcyBub3Qgd3JhcHBlZCBhcyBydW50aW1lIik7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS94bWwvR3BhdGhTeW50YXhUZXN0U3VwcG9ydC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3htbC9HcGF0aFN5bnRheFRlc3RTdXBwb3J0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2Y0MzhlCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS94bWwvR3BhdGhTeW50YXhUZXN0U3VwcG9ydC5ncm9vdnkKQEAgLTAsMCArMSwyMzAgQEAKK3BhY2thZ2UgZ3Jvb3Z5LnhtbAorCitjbGFzcyBHcGF0aFN5bnRheFRlc3RTdXBwb3J0IHsKKyAgICBwcml2YXRlIHN0YXRpYyBkZWYgc2FtcGxlWG1sID0gJycnCis8Y2hhcmFjdGVycz4KKyAgICA8Y2hhcmFjdGVyIGlkPSIxIiBuYW1lPSJXYWxsYWNlIj4KKyAgICAJPGxpa2VzPmNoZWVzZTwvbGlrZXM+CisgICAgPC9jaGFyYWN0ZXI+CisgICAgPGNoYXJhY3RlciBpZD0iMiIgbmFtZT0iR3JvbWl0Ij4KKwkgICAgPGxpa2VzPnNsZWVwPC9saWtlcz4KKyAgICA8L2NoYXJhY3Rlcj4KKyAgICA8bnVtZXJpY1ZhbHVlPjE8L251bWVyaWNWYWx1ZT4KKyAgICA8Ym9vbGVhblZhbHVlPnk8L2Jvb2xlYW5WYWx1ZT4KKyAgICA8dXJpVmFsdWU+aHR0cDovL2V4YW1wbGUub3JnLzwvdXJpVmFsdWU+CisgICAgPHVybFZhbHVlPmh0dHA6Ly9leGFtcGxlLm9yZy88L3VybFZhbHVlPgorICAgIDxlbXB0eS8+Cis8L2NoYXJhY3RlcnM+CisnJycKKworICAgIHByaXZhdGUgc3RhdGljIGRlZiBuZXN0ZWRYbWwgPSAnJycKKzxyb290PgorICAgIDxhPjx6Lz48ei8+PHkvPjwvYT4KKyAgICA8Yj48ei8+PC9iPgorICAgIDxjPjx4Lz48L2M+CisgICAgPGQ+PC9kPgorPC9yb290PgorJycnCisKKyAgICBzdGF0aWMgdm9pZCBjaGVja0VsZW1lbnQoQ2xvc3VyZSBnZXRSb290KSB7CisgICAgICAgIGRlZiByb290ID0gZ2V0Um9vdChzYW1wbGVYbWwpCisgICAgICAgIGFzc2VydCByb290ICE9IG51bGwKKyAgICAgICAgZGVmIGNoYXJhY3RlcnMgPSByb290LmNoYXJhY3RlcgorICAgICAgICBhc3NlcnQgMiA9PSBjaGFyYWN0ZXJzLnNpemUoKQorICAgICAgICBhc3NlcnQgMiA9PSByb290LidjaGFyYWN0ZXInLnNpemUoKQorICAgICAgICBhc3NlcnQgMiA9PSByb290WydjaGFyYWN0ZXInXS5zaXplKCkKKyAgICAgICAgZGVmIHdhbGxhY2UgPSBjaGFyYWN0ZXJzWzBdCisgICAgICAgIGFzc2VydCB3YWxsYWNlLm5hbWUoKSA9PSAnY2hhcmFjdGVyJworICAgICAgICBkZWYgbGlrZXMgPSBjaGFyYWN0ZXJzLmxpa2VzCisgICAgICAgIGFzc2VydCAyID09IGxpa2VzLnNpemUoKQorICAgICAgICBkZWYgd2FsbGFjZUxpa2VzID0gbGlrZXNbMF0KKyAgICAgICAgYXNzZXJ0IHdhbGxhY2VMaWtlcy5uYW1lKCkgPT0gJ2xpa2VzJworICAgICAgICBhc3NlcnQgd2FsbGFjZUxpa2VzLnRleHQoKSA9PSAnY2hlZXNlJworICAgICAgICBjaGVja0VtcHR5TWlzc2luZ0Nhc2VzKHJvb3QpCisgICAgICAgIGlmIChpc0RvbShyb290KSkgeworICAgICAgICAgICAgLy8gYWRkaXRpb25hbCBET00gbG9uZy1oYW5kIHN5bnRheAorICAgICAgICAgICAgLy8gZm9yIGlsbHVzdHJhdGl2ZSBwdXJwb3NlcyBvbmx5CisgICAgICAgICAgICBhc3NlcnQgbGlrZXMuaXRlbSgwKS5ub2RlTmFtZSA9PSAnbGlrZXMnCisgICAgICAgICAgICBhc3NlcnQgd2FsbGFjZUxpa2VzLmZpcnN0Q2hpbGQubm9kZVZhbHVlID09ICdjaGVlc2UnCisgICAgICAgICAgICBpZiAod2FsbGFjZUxpa2VzLmNsYXNzLm5hbWUuY29udGFpbnMoJ3hlcmNlcycpKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0ICdjaGVlc2UnID09IHdhbGxhY2VMaWtlcy50ZXh0Q29udGVudAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja0VtcHR5TWlzc2luZ0Nhc2VzKHJvb3QpIHsKKyAgICAgICAgZGVmIHVua25vd25DaGlsZCA9IHJvb3QueHh4CisgICAgICAgIGFzc2VydCB1bmtub3duQ2hpbGQuaXNFbXB0eSgpCisgICAgICAgIGRlZiB1bmtub3duQXR0ciA9IHJvb3QuJ0B4eHgnCisgICAgICAgIGFzc2VydCBpc1NsdXJwZXIocm9vdCkgfHwgIXVua25vd25BdHRyCisgICAgICAgIGFzc2VydCAhaXNTbHVycGVyKHJvb3QpIHx8IHVua25vd25BdHRyLmlzRW1wdHkoKQorICAgICAgICBhc3NlcnQgcm9vdC4nZW1wdHknLnRleHQoKSA9PSAnJworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIGNoZWNrRmluZEVsZW1lbnQoQ2xvc3VyZSBnZXRSb290KSB7CisgICAgICAgIGRlZiByb290ID0gZ2V0Um9vdChzYW1wbGVYbWwpCisgICAgICAgIC8vIGxldHMgZmluZCBHcm9taXQKKyAgICAgICAgZGVmIGdyb21pdCA9IHJvb3QuY2hhcmFjdGVyLmZpbmQgeyBpdC4nQGlkJyA9PSAnMicgfQorICAgICAgICBhc3NlcnQgZ3JvbWl0ICE9IG51bGwsICJTaG91bGQgaGF2ZSBmb3VuZCBHcm9taXQhIgorICAgICAgICBhc3NlcnQgZ3JvbWl0WydAbmFtZSddID09ICJHcm9taXQiCisgICAgICAgIC8vIGxldHMgZmluZCB3aGF0IFdhbGxhY2UgbGlrZXMgaW4gMSBxdWVyeQorICAgICAgICBkZWYgYW5zd2VyID0gcm9vdC5jaGFyYWN0ZXIuZmluZCB7IGl0WydAaWQnXSA9PSAnMScgfS5saWtlc1swXS50ZXh0KCkKKyAgICAgICAgYXNzZXJ0IGFuc3dlciA9PSAiY2hlZXNlIgorICAgIH0KKworICAgIHN0YXRpYyB2b2lkIGNoZWNrTmVzdGVkU2l6ZUV4cHJlc3Npb25zKENsb3N1cmUgZ2V0Um9vdCkgeworICAgICAgICBkZWYgcm9vdCA9IGdldFJvb3QobmVzdGVkWG1sKQorICAgICAgICBhc3NlcnQgcm9vdC4nKicuc2l6ZSgpID09IDQsICJFeHBlY3RlZCBzaXplIDQgYnV0IHdhcyAke3Jvb3QuJyonLnNpemUoKX0iCisgICAgICAgIGFzc2VydCByb290LidhJy4neicuc2l6ZSgpID09IDIKKyAgICAgICAgYXNzZXJ0IHJvb3QuJyonLicqJy5zaXplKCkgPT0gNQorICAgICAgICBhc3NlcnQgcm9vdC5hLicqJy5zaXplKCkgPT0gMworICAgICAgICBhc3NlcnQgcm9vdC4nKicuei5zaXplKCkgPT0gMworICAgICAgICBhc3NlcnQgcm9vdC4nKicuJyonLmNvbGxlY3R7aXQubmFtZSgpfSA9PSBbInoiLCAieiIsICJ5IiwgInoiLCAieCJdCisgICAgICAgIGFzc2VydCByb290LmEuJyonLmNvbGxlY3R7aXQubmFtZSgpfSA9PSBbInoiLCAieiIsICJ5Il0KKyAgICAgICAgYXNzZXJ0IHJvb3QuJyonLmZpbmRBbGx7IGl0Lnouc2l6ZSgpID4gMCB9LmNvbGxlY3R7aXQubmFtZSgpfSA9PSBbImEiLCAiYiJdCisgICAgfQorCisgICAgc3RhdGljIHZvaWQgY2hlY2tFbGVtZW50VHlwZXMoQ2xvc3VyZSBnZXRSb290KSB7CisgICAgICAgIGRlZiByb290ID0gZ2V0Um9vdChzYW1wbGVYbWwpCisgICAgICAgIGRlZiBudW1lcmljVmFsdWUgPSByb290Lm51bWVyaWNWYWx1ZVswXQorICAgICAgICBkZWYgYm9vbGVhblZhbHVlID0gcm9vdC5ib29sZWFuVmFsdWVbMF0KKyAgICAgICAgZGVmIHVyaVZhbHVlICAgICA9IHJvb3QudXJpVmFsdWVbMF0KKyAgICAgICAgZGVmIHVybFZhbHVlICAgICA9IHJvb3QudXJsVmFsdWVbMF0KKyAgICAgICAgYXNzZXJ0IG51bWVyaWNWYWx1ZS50ZXh0KCkudG9JbnRlZ2VyKCkgPT0gMQorICAgICAgICBhc3NlcnQgbnVtZXJpY1ZhbHVlLnRleHQoKS50b0xvbmcoKSA9PSAxCisgICAgICAgIGFzc2VydCBudW1lcmljVmFsdWUudGV4dCgpLnRvRmxvYXQoKSA9PSAxCisgICAgICAgIGFzc2VydCBudW1lcmljVmFsdWUudGV4dCgpLnRvRG91YmxlKCkgPT0gMQorICAgICAgICBhc3NlcnQgbnVtZXJpY1ZhbHVlLnRleHQoKS50b0JpZ0ludGVnZXIoKSA9PSAxCisgICAgICAgIGFzc2VydCBudW1lcmljVmFsdWUudGV4dCgpLnRvQmlnRGVjaW1hbCgpID09IDEKKyAgICAgICAgYXNzZXJ0IGJvb2xlYW5WYWx1ZS50ZXh0KCkudG9Cb29sZWFuKCkgPT0gdHJ1ZQorICAgICAgICBhc3NlcnQgdXJpVmFsdWUudGV4dCgpLnRvVVJJKCkgPT0gImh0dHA6Ly9leGFtcGxlLm9yZy8iLnRvVVJJKCkKKyAgICAgICAgYXNzZXJ0IHVybFZhbHVlLnRleHQoKS50b1VSTCgpID09ICJodHRwOi8vZXhhbXBsZS5vcmcvIi50b1VSTCgpCisgICAgICAgIGlmIChpc1NsdXJwZXIocm9vdCkpIHsKKyAgICAgICAgICAgIC8vIHNsdXJwZXIgc2hvcnRoYW5kIC0gYXJlIHRoZXNlIHJlYWxseSBwdWxsaW5nIHRoZWlyIHdlaWdodD8KKyAgICAgICAgICAgIGFzc2VydCBudW1lcmljVmFsdWUudG9JbnRlZ2VyKCkgPT0gMQorICAgICAgICAgICAgYXNzZXJ0IG51bWVyaWNWYWx1ZS50b0xvbmcoKSA9PSAxCisgICAgICAgICAgICBhc3NlcnQgbnVtZXJpY1ZhbHVlLnRvRmxvYXQoKSA9PSAxCisgICAgICAgICAgICBhc3NlcnQgbnVtZXJpY1ZhbHVlLnRvRG91YmxlKCkgPT0gMQorICAgICAgICAgICAgYXNzZXJ0IG51bWVyaWNWYWx1ZS50b0JpZ0ludGVnZXIoKSA9PSAxCisgICAgICAgICAgICBhc3NlcnQgbnVtZXJpY1ZhbHVlLnRvQmlnRGVjaW1hbCgpID09IDEKKyAgICAgICAgICAgIGFzc2VydCBib29sZWFuVmFsdWUudG9Cb29sZWFuKCkgPT0gdHJ1ZQorICAgICAgICAgICAgYXNzZXJ0IHVyaVZhbHVlLnRvVVJJKCkgPT0gImh0dHA6Ly9leGFtcGxlLm9yZy8iLnRvVVJJKCkKKyAgICAgICAgICAgIGFzc2VydCB1cmxWYWx1ZS50b1VSTCgpID09ICJodHRwOi8vZXhhbXBsZS5vcmcvIi50b1VSTCgpCisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBjaGVja0VsZW1lbnRDbG9zdXJlSW50ZXJhY3Rpb24oQ2xvc3VyZSBnZXRSb290KSB7CisgICAgICAgIGRlZiByb290ID0gZ2V0Um9vdChzYW1wbGVYbWwpCisgICAgICAgIGRlZiBzTGlrZXMgPSByb290LmNoYXJhY3Rlci5saWtlcy5maW5kQWxseyBpdC50ZXh0KCkuc3RhcnRzV2l0aCgncycpIH0KKyAgICAgICAgYXNzZXJ0IHNMaWtlcy5zaXplKCkgPT0gMQorICAgICAgICBhc3NlcnQgcm9vdC5saWtlcy5zaXplKCkgPT0gMAorICAgICAgICBpZiAoaXNEb20ocm9vdCkpIHsKKyAgICAgICAgICAgIC8vIGFkZHRpdGlvbmFsIERPTUNhdGVnb3J5IGxvbmctaGFuZCBub3RhdGlvbiBnZXRzIG5lc3RlZCBub2RlcyBmcm9tIHJvb3QKKyAgICAgICAgICAgIGFzc2VydCByb290LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdsaWtlcycpLnNpemUoKSA9PSAyCisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0ICdzbGVlcCcgPT0gc0xpa2VzWzBdLnRleHQoKQorICAgICAgICBhc3NlcnQgJ2NoZWVzZXNsZWVwJyA9PSByb290LmNoYXJhY3Rlci5saWtlcy5jb2xsZWN0eyBpdC50ZXh0KCkgfS5qb2luKCkKKyAgICAgICAgYXNzZXJ0IHJvb3QuY2hhcmFjdGVyLmxpa2VzLmV2ZXJ5eyBpdC50ZXh0KCkuY29udGFpbnMoJ2VlJykgfQorICAgICAgICBkZWYgZ3JvdXBMaWtlc0J5Rmlyc3RMZXR0ZXIKKyAgICAgICAgZGVmIGxpa2VzID0gcm9vdC5jaGFyYWN0ZXIubGlrZXMuY29sbGVjdHsgaXQgfQorICAgICAgICBpZiAoaXNTbHVycGVyKHJvb3QpKSB7CisgICAgICAgICAgICBncm91cExpa2VzQnlGaXJzdExldHRlciA9IGxpa2VzLmdyb3VwQnl7IGxpa2UgLT4KKyAgICAgICAgICAgICAgICByb290LmNoYXJhY3Rlci5maW5keyBpdC5saWtlc1swXS50ZXh0KCkgPT0gbGlrZS50ZXh0KCkgfS5AbmFtZS50b1N0cmluZygpWzBdCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBUT0RPOiBCcm9rZW4/IFdoeSBkb2Vzbid0IGJlbG93IHdvcms/CisgICAgICAgICAgICAvL2dyb3VwTGlrZXNCeUZpcnN0TGV0dGVyID0gbGlrZXMuZ3JvdXBCeXsgaXQucGFyZW50KCkuQG5hbWUudG9TdHJpbmcoKVswXSB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBncm91cExpa2VzQnlGaXJzdExldHRlciA9IGxpa2VzLmdyb3VwQnl7IGl0LnBhcmVudCgpLidAbmFtZSdbMF0gfQorICAgICAgICB9CisgICAgICAgIGdyb3VwTGlrZXNCeUZpcnN0TGV0dGVyLmtleVNldCgpLmVhY2h7CisgICAgICAgICAgICBncm91cExpa2VzQnlGaXJzdExldHRlcltpdF0gPSBncm91cExpa2VzQnlGaXJzdExldHRlcltpdF1bMF0udGV4dCgpCisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0IGdyb3VwTGlrZXNCeUZpcnN0TGV0dGVyID09IFtXOidjaGVlc2UnLCBHOidzbGVlcCddCisgICAgfQorCisgICAgc3RhdGljIHZvaWQgY2hlY2tBdHRyaWJ1dGUoQ2xvc3VyZSBnZXRSb290KSB7CisgICAgICAgIGRlZiByb290ID0gZ2V0Um9vdChzYW1wbGVYbWwpCisgICAgICAgIGlmIChpc1NsdXJwZXIocm9vdCkpIHsKKyAgICAgICAgICAgIGFzc2VydCAnV2FsbGFjZScgPT0gcm9vdC5jaGFyYWN0ZXJbMF0uJ0BuYW1lJy50ZXh0KCkKKyAgICAgICAgICAgIGFzc2VydCAnV2FsbGFjZScgPT0gcm9vdC5jaGFyYWN0ZXJbMF1bJ0BuYW1lJ10udGV4dCgpCisgICAgICAgICAgICBhc3NlcnQgJ1dhbGxhY2UnID09IChyb290LmNoYXJhY3Rlci4nQG5hbWUnKVswXS50ZXh0KCkKKyAgICAgICAgICAgIGFzc2VydCBbJ1dhbGxhY2UnLCAnR3JvbWl0J10gPT0gcm9vdC5jaGFyYWN0ZXIuJ0BuYW1lJy5saXN0KCkqLnRleHQoKQorICAgICAgICAgICAgYXNzZXJ0ICdXYWxsYWNlR3JvbWl0JyA9PSByb290LmNoYXJhY3Rlci4nQG5hbWUnLnRleHQoKQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0ICdXYWxsYWNlJyA9PSByb290LmNoYXJhY3RlclswXS4nQG5hbWUnCisgICAgICAgICAgICBhc3NlcnQgJ1dhbGxhY2UnID09IHJvb3QuY2hhcmFjdGVyWzBdWydAbmFtZSddCisgICAgICAgICAgICBhc3NlcnQgJ1dhbGxhY2UnID09IChyb290LmNoYXJhY3Rlci4nQG5hbWUnKVswXQorICAgICAgICAgICAgYXNzZXJ0IFsnV2FsbGFjZScsICdHcm9taXQnXSA9PSByb290LmNoYXJhY3Rlci5jb2xsZWN0eyBpdC4nQG5hbWUnIH0KKyAgICAgICAgICAgIGFzc2VydCAnV2FsbGFjZUdyb21pdCcgPT0gcm9vdC5jaGFyYWN0ZXIuJ0BuYW1lJy5qb2luKCkKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNTbHVycGVyKHJvb3QpKSB7CisgICAgICAgICAgICAvLyBhZGRpdGlvbmFsIHNsdXJwZXIgc2hvcnRoYW5kCisgICAgICAgICAgICBhc3NlcnQgJ1dhbGxhY2UnID09IHJvb3QuY2hhcmFjdGVyWzBdLkBuYW1lLnRleHQoKQorICAgICAgICAgICAgZGVmIGdyb21pdCA9IHJvb3QuY2hhcmFjdGVyLmZpbmR7IGl0LkBpZCA9PSAnMicgfQorICAgICAgICAgICAgYXNzZXJ0IGdyb21pdC5AbmFtZS5uYW1lKCkgPT0gIm5hbWUiCisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzUGFyc2VyKHJvb3QpKSB7CisgICAgICAgICAgICAvLyBhZGRpdGlvbmFsIHBhcnNlciBzaG9ydGhhbmQKKyAgICAgICAgICAgIGFzc2VydCAnV2FsbGFjZScgPT0gcm9vdC5jaGFyYWN0ZXJbMF0uQG5hbWUKKyAgICAgICAgICAgIGRlZiBncm9taXQgPSByb290LmNoYXJhY3Rlci5maW5kIHtpdC5AaWQgPT0gJzInfQorICAgICAgICAgICAgZGVmIGFjdHVhbE5hbWUgPSBncm9taXQuQG5hbWUKKyAgICAgICAgICAgIGFzc2VydCBhY3R1YWxOYW1lID09ICdHcm9taXQnCisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBjaGVja0F0dHJpYnV0ZXMoQ2xvc3VyZSBnZXRSb290KSB7CisgICAgICAgIGRlZiByb290ID0gZ2V0Um9vdChzYW1wbGVYbWwpCisgICAgICAgIGRlZiBhdHRyaWJ1dGVzID0gcm9vdC5jaGFyYWN0ZXJbMF0uYXR0cmlidXRlcygpCisgICAgICAgIGFzc2VydCAgICAgICAgIDIgPT0gYXR0cmlidXRlcy5zaXplKCkKKyAgICAgICAgYXNzZXJ0ICdXYWxsYWNlJyA9PSBhdHRyaWJ1dGVzWyduYW1lJ10KKyAgICAgICAgYXNzZXJ0ICdXYWxsYWNlJyA9PSBhdHRyaWJ1dGVzLm5hbWUKKyAgICAgICAgYXNzZXJ0ICAgICAgICcxJyA9PSBhdHRyaWJ1dGVzLidpZCcKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBjaGVja0NoaWxkcmVuKENsb3N1cmUgZ2V0Um9vdCkgeworICAgICAgICBkZWYgcm9vdCA9IGdldFJvb3Qoc2FtcGxlWG1sKQorICAgICAgICBkZWYgY2hpbGRyZW4gPSByb290LmNoaWxkcmVuKCkKKyAgICAgICAgLy8gY291bnQgZGlyZWN0IGNoaWxkcmVuCisgICAgICAgIGFzc2VydCBjaGlsZHJlbi5zaXplKCkgPT0gNywgIkNoaWxkcmVuICR7Y2hpbGRyZW4uc2l6ZSgpfSIKKyAgICAgICAgYXNzZXJ0IHJvb3QuJyonLnNpemUoKSA9PSA3CisgICAgICAgIC8vIGlsbHVzdHJhdGl2ZSBwdXJwb3NlcyBvbmx5CisgICAgICAgIGlmIChpc0RvbShyb290KSkgeworICAgICAgICAgICAgLy8gY291bnQgd2hpdGVzcGFjZSBhbmQgbmVzdGVkIGNoaWxkcmVuCisgICAgICAgICAgICBhc3NlcnQgcm9vdC5jaGlsZE5vZGVzLnNpemUoKSA9PSAxNQorICAgICAgICAgICAgLy8gY291bnQgbmVzdGVkIGNoaWxkcmVuCisgICAgICAgICAgICBhc3NlcnQgcm9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnKicpLnNpemUoKSA9PSA5CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBjaGVja1BhcmVudChDbG9zdXJlIGdldFJvb3QpIHsKKyAgICAgICAgZGVmIHJvb3QgPSBnZXRSb290KHNhbXBsZVhtbCkKKyAgICAgICAgZGVmIGdyb21pdCA9IHJvb3QuY2hhcmFjdGVyLmZpbmQgeyBpdFsnQGlkJ10gPT0gJzInIH0KKyAgICAgICAgYXNzZXJ0IGdyb21pdC5saWtlc1swXS5wYXJlbnQoKSA9PSBncm9taXQKKyAgICAgICAgYXNzZXJ0IGdyb21pdC5saWtlc1swXS4nLi4nID09IGdyb21pdAorICAgICAgICBhc3NlcnQgZ3JvbWl0Lmxpa2VzWzBdLnBhcmVudCgpLnBhcmVudCgpID09IHJvb3QKKyAgICAgICAgYXNzZXJ0IGdyb21pdC5wYXJlbnQoKSA9PSByb290CisgICAgICAgIGlmIChpc1NsdXJwZXIocm9vdCkpIHsKKyAgICAgICAgICAgIC8vIGFkZGl0aW9uYWwgc2x1cnBlciBzaG9ydGhhbmQKKyAgICAgICAgICAgIGFzc2VydCBncm9taXQubGlrZXMucGFyZW50KCkgPT0gZ3JvbWl0CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzU2x1cnBlcihyb290KSkgeworICAgICAgICAgICAgYXNzZXJ0IHJvb3QucGFyZW50KCkgPT0gcm9vdAorICAgICAgICB9IGVsc2UgaWYgKGlzUGFyc2VyKHJvb3QpKSB7CisgICAgICAgICAgICBhc3NlcnQgcm9vdC5wYXJlbnQoKSA9PSBudWxsCisgICAgICAgIH0gZWxzZSBpZiAoaXNEb20ocm9vdCkpIHsKKyAgICAgICAgICAgIGFzc2VydCAocm9vdC5wYXJlbnQoKSBpbnN0YW5jZW9mIG9yZy53M2MuZG9tLkRvY3VtZW50KQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1NsdXJwZXIobm9kZSkgeworICAgICAgICByZXR1cm4gbm9kZS5nZXRDbGFzcygpLm5hbWUuY29udGFpbnMoJ3NsdXJwZXInKQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNQYXJzZXIobm9kZSkgeworICAgICAgICByZXR1cm4gKG5vZGUgaW5zdGFuY2VvZiBncm9vdnkudXRpbC5Ob2RlKQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNEb20obm9kZSkgeworICAgICAgICByZXR1cm4gbm9kZS5nZXRDbGFzcygpLm5hbWUuY29udGFpbnMoJ0VsZW1lbnQnKQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3htbC9NYXJrdXBCdWlsZGVyVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3htbC9NYXJrdXBCdWlsZGVyVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZjMDUwMQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkveG1sL01hcmt1cEJ1aWxkZXJUZXN0Lmdyb292eQpAQCAtMCwwICsxLDMwNyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGdyb292eS54bWwKKworaW1wb3J0IG9yZy5jdXN0b21tb25rZXkueG1sdW5pdC4qCisKKy8qKgorICogVGVzdHMgdGhhdCBzcGVjaWFsIFhNTCBjaGFycyBhcmUgZW50aXRpemVkIGJ5IE1hcmt1cEJ1aWxkZXIuCisgKgorICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjQgJAorICoKKyAqICAgQGF1dGhvciBTY290dCBTdGlybGluZworICogICBAYXV0aG9yIFBpbGhvIEtpbQorICogICBAYXV0aG9yIFBhdWwgS2luZworICovCitjbGFzcyBNYXJrdXBCdWlsZGVyVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKyAgICBwcml2YXRlIFN0cmluZ1dyaXRlciB3cml0ZXIKKyAgICBwcml2YXRlIE1hcmt1cEJ1aWxkZXIgeG1sCisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpCisgICAgICAgIHhtbCA9IG5ldyBNYXJrdXBCdWlsZGVyKHdyaXRlcikKKyAgICAgICAgWE1MVW5pdC5zZXRJZ25vcmVXaGl0ZXNwYWNlKHRydWUpCisgICAgfQorCisgICAgcHJpdmF0ZSBhc3NlcnRFeHBlY3RlZFhtbChleHBlY3RlZFhtbCkgeworICAgICAgICBkZWYgeG1sRGlmZiA9IG5ldyBEaWZmKGV4cGVjdGVkWG1sLCB3cml0ZXIudG9TdHJpbmcoKSkKKyAgICAgICAgYXNzZXJ0IHhtbERpZmYuc2ltaWxhcigpLCB4bWxEaWZmLnRvU3RyaW5nKCkKKyAgICB9CisKKyAgICB2b2lkIHRlc3RTbWFsbFRyZWUoKSB7CisgICAgICAgIHhtbC5yb290MShhOjUsIGI6NykgeworICAgICAgICAgICAgZWxlbTEoJ2hlbGxvMScpCisgICAgICAgICAgICBlbGVtMignaGVsbG8yJykKKyAgICAgICAgICAgIGVsZW0zKHg6NykKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFeHBlY3RlZFhtbCgnJydcCis8cm9vdDEgYT0nNScgYj0nNyc+CisgIDxlbGVtMT5oZWxsbzE8L2VsZW0xPgorICA8ZWxlbTI+aGVsbG8yPC9lbGVtMj4KKyAgPGVsZW0zIHg9JzcnIC8+Cis8L3Jvb3QxPicnJykKKyAgICB9CisKKyAgICAvLyBJdCBpcyBub3QgcmVjb21tZW5kZWQgcHJhY3RpY2UgdG8gdXNlIHRoZSB2YWx1ZSBhdHRyaWJ1dGUKKyAgICAvLyB3aGVuIGFsc28gdXNpbmcgbmVzdGVkIGNvbnRlbnQgYXMgdGhlcmUgaXMgbm8gd2F5IHRvIHNwZWNpZnkKKyAgICAvLyB0aGUgb3JkZXJpbmcgb2Ygc3VjaCBtaXhlZCBjb250ZW50LiBUaGUgZGVmYXVsdCBiZWhhdmlvdXIgaXMKKyAgICAvLyB0byBpbmNsdWRlIHRoZSB2YWx1ZSBhcyB0aGUgZmlyc3Qgbm9kZSBpbiB0aGUgcmVzdWx0aW5nIHhtbC4KKyAgICB2b2lkIHRlc3RTbWFsbFRyZWVXaXRoVGV4dEFuZEF0dHJpYnV0ZXMoKSB7CisgICAgICAgIHhtbC5yb290MSgnaGVsbG8xJywgYTo1LCBiOjcpIHsKKyAgICAgICAgICAgIGVsZW0xKCdoZWxsbzInLCBjOjQpIHsKKyAgICAgICAgICAgICAgICBlbGVtMignaGVsbG8zJywgZDo0KQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxlbTEoJ2hlbGxvMicsIGM6NCkgeworICAgICAgICAgICAgICAgIGVsZW0yKCdoZWxsbzMnKQorICAgICAgICAgICAgICAgIGVsZW0yKCdoZWxsbzMnLCBkOjQpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbGVtMSgnaGVsbG8yJywgYzo0KSB7CisgICAgICAgICAgICAgICAgZWxlbTIoJ2hlbGxvMycsIGQ6NCkKKyAgICAgICAgICAgICAgICBlbGVtMignaGVsbG8zJykKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsZW0xKCdoZWxsbzInLCBjOjQpIHsKKyAgICAgICAgICAgICAgICBlbGVtMihkOjQpCisgICAgICAgICAgICAgICAgZWxlbTIoJ2hlbGxvMycsIGQ6NCkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsZW0xKCdoZWxsbzInLCBjOjQpIHsKKyAgICAgICAgICAgICAgICBlbGVtMignaGVsbG8zJywgZDo0KQorICAgICAgICAgICAgICAgIGVsZW0yKGQ6NCkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsZW0xKCdoZWxsbzInKSB7CisgICAgICAgICAgICAgICAgZWxlbTIoJ2hlbGxvMycsIGQ6NCkKKyAgICAgICAgICAgICAgICBlbGVtMihkOjQpCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXhwZWN0ZWRYbWwoJycnXAorPHJvb3QxIGE9JzUnIGI9JzcnPmhlbGxvMTxlbGVtMSBjPSc0Jz5oZWxsbzI8ZWxlbTIgZD0nNCc+aGVsbG8zPC9lbGVtMj4KKzwvZWxlbTE+Cis8ZWxlbTEgYz0nNCc+aGVsbG8yPGVsZW0yPmhlbGxvMzwvZWxlbTI+Cis8ZWxlbTIgZD0nNCc+aGVsbG8zPC9lbGVtMj4KKzwvZWxlbTE+Cis8ZWxlbTEgYz0nNCc+aGVsbG8yPGVsZW0yIGQ9JzQnPmhlbGxvMzwvZWxlbTI+Cis8ZWxlbTI+aGVsbG8zPC9lbGVtMj4KKzwvZWxlbTE+Cis8ZWxlbTEgYz0nNCc+aGVsbG8yPGVsZW0yIGQ9JzQnIC8+Cis8ZWxlbTIgZD0nNCc+aGVsbG8zPC9lbGVtMj4KKzwvZWxlbTE+Cis8ZWxlbTEgYz0nNCc+aGVsbG8yPGVsZW0yIGQ9JzQnPmhlbGxvMzwvZWxlbTI+Cis8ZWxlbTIgZD0nNCcgLz4KKzwvZWxlbTE+Cis8ZWxlbTE+aGVsbG8yPGVsZW0yIGQ9JzQnPmhlbGxvMzwvZWxlbTI+Cis8ZWxlbTIgZD0nNCcgLz4KKzwvZWxlbTE+Cis8L3Jvb3QxPicnJykKKyAgICB9CisKKyAgICB2b2lkIHRlc3RUcmVlKCkgeworICAgICAgICB4bWwucm9vdDIoYTo1LCBiOjcpIHsKKyAgICAgICAgICAgIGVsZW0xKCdoZWxsbzEnKQorICAgICAgICAgICAgZWxlbTIoJ2hlbGxvMicpCisgICAgICAgICAgICBuZXN0ZWRFbGVtKHg6J2FiYycsIHk6J2RlZicpIHsKKyAgICAgICAgICAgICAgICBjaGlsZCh6OidkZWYnLCBudWxsdGVzdDpudWxsKQorICAgICAgICAgICAgICAgIGNoaWxkMigpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBuZXN0ZWRFbGVtMih6Oid6enonKSB7CisgICAgICAgICAgICAgICAgY2hpbGQoejonZGVmJykKKyAgICAgICAgICAgICAgICBjaGlsZDIoImhlbGxvIikKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFeHBlY3RlZFhtbCgnJydcCis8cm9vdDIgYT0nNScgYj0nNyc+CisgIDxlbGVtMT5oZWxsbzE8L2VsZW0xPgorICA8ZWxlbTI+aGVsbG8yPC9lbGVtMj4KKyAgPG5lc3RlZEVsZW0geD0nYWJjJyB5PSdkZWYnPgorICAgIDxjaGlsZCB6PSdkZWYnIC8+CisgICAgPGNoaWxkMiAvPgorICA8L25lc3RlZEVsZW0+CisgIDxuZXN0ZWRFbGVtMiB6PSd6enonPgorICAgIDxjaGlsZCB6PSdkZWYnIC8+CisgICAgPGNoaWxkMj5oZWxsbzwvY2hpbGQyPgorICA8L25lc3RlZEVsZW0yPgorPC9yb290Mj4nJycpCisgICAgfQorCisgICAgdm9pZCB0ZXN0Q29udGVudEFuZERhdGFJbk1hcmt1cCgpIHsKKyAgICAgICAgeG1sLmEoaHJlZjoiaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmciLCAiZ3Jvb3Z5IikKKyAgICAgICAgYXNzZXJ0RXhwZWN0ZWRYbWwoIjxhIGhyZWY9J2h0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnJz5ncm9vdnk8L2E+IikKKyAgICB9CisKKyAgICB2b2lkIHRlc3RNYXJrdXBXaXRoQ29sb25zQW5kTmFtZXNwYWNlcygpIHsKKyAgICAgICAgZGVmIGV4cGVjdGVkWG1sID0gJycnXAorPG5zMTpjdXN0b21lci1kZXNjcmlwdGlvbj4KKyAgPGxhc3QtbmFtZT5MYWZvcmdlPC9sYXN0LW5hbWU+CisgIDxmaXJzdC1uYW1lPgorICAgIDxmaXJzdD5HdWlsbGF1bWU8L2ZpcnN0PgorICAgIDxpbml0aWFsLWxldHRlcnM+QS5KLjwvaW5pdGlhbC1sZXR0ZXJzPgorICA8L2ZpcnN0LW5hbWU+Cis8L25zMTpjdXN0b21lci1kZXNjcmlwdGlvbj4nJycKKyAgICAgICAgeG1sLiJuczE6Y3VzdG9tZXItZGVzY3JpcHRpb24ieworICAgICAgICAgICAgImxhc3QtbmFtZSIoIkxhZm9yZ2UiKQorICAgICAgICAgICAgImZpcnN0LW5hbWUieworICAgICAgICAgICAgICAgIGZpcnN0KCJHdWlsbGF1bWUiKQorICAgICAgICAgICAgICAgICJpbml0aWFsLWxldHRlcnMiKCJBLkouIikKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRYbWwsIGZpeEVPTHMod3JpdGVyLnRvU3RyaW5nKCkpKQorICAgIH0KKworICAgIC8qKgorICAgICAqIE1haW4gdGVzdCBtZXRob2QuIENoZWNrcyB0aGF0IHdlbGwtZm9ybWVkIFhNTCBpcyBnZW5lcmF0ZWQKKyAgICAgKiBhbmQgdGhhdCB0aGUgYXBwcm9wcmlhdGUgY2hhcmFjdGVycyBhcmUgZXNjYXBlZCB3aXRoIHRoZQorICAgICAqIGNvcnJlY3QgZW50aXRpZXMuCisgICAgICovCisgICAgdm9pZCB0ZXN0QnVpbGRlcigpIHsKKyAgICAgICAgU3RyaW5nIGV4cGVjdGVkWG1sID0gJycnXAorPGNoYXJzPgorICA8YW1wZXJzYW5kIGE9JyZhbXA7Jz4mYW1wOzwvYW1wZXJzYW5kPgorICA8cXVvdGUgYXR0cj0nIic+IjwvcXVvdGU+CisgIDxhcG9zdHJvcGhlIGF0dHI9JyZhcG9zOyc+JzwvYXBvc3Ryb3BoZT4KKyAgPGxlc3N0aGFuIGF0dHI9J3ZhbHVlJz5jaGFyczogJmFtcDsgJmx0OyAmZ3Q7ICc8L2xlc3N0aGFuPgorICA8ZWxlbWVudCBhdHRyPSd2YWx1ZSAxICZhbXA7IDInPmNoYXJzOiAmYW1wOyAmbHQ7ICZndDsgIiBpbiBtaWRkbGU8L2VsZW1lbnQ+CisgIDxncmVhdGVydGhhbj4mZ3Q7PC9ncmVhdGVydGhhbj4KKyAgPGVtcHR5RWxlbWVudCAvPgorPC9jaGFycz4nJycKKworICAgICAgICAvLyBHZW5lcmF0ZSB0aGUgbWFya3VwLgorICAgICAgICB4bWwuY2hhcnMgeworICAgICAgICAgICAgYW1wZXJzYW5kKGE6ICImIiwgIiYiKQorICAgICAgICAgICAgcXVvdGUoYXR0cjogIlwiIiwgIlwiIikKKyAgICAgICAgICAgIGFwb3N0cm9waGUoYXR0cjogIiciLCAiJyIpCisgICAgICAgICAgICBsZXNzdGhhbihhdHRyOiAidmFsdWUiLCAiY2hhcnM6ICYgPCA+ICciKQorICAgICAgICAgICAgZWxlbWVudChhdHRyOiAidmFsdWUgMSAmIDIiLCAiY2hhcnM6ICYgPCA+IFwiIGluIG1pZGRsZSIpCisgICAgICAgICAgICBncmVhdGVydGhhbigiPiIpCisgICAgICAgICAgICBlbXB0eUVsZW1lbnQoKQorICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkWG1sLCBmaXhFT0xzKHdyaXRlci50b1N0cmluZygpKSkKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB0aGUgYnVpbGRlciB3aXRoIGRvdWJsZSBxdW90ZXMgZm9yIGF0dHJpYnV0ZSB2YWx1ZXMuCisgICAgICovCisgICAgdm9pZCB0ZXN0QnVpbGRlcldpdGhEb3VibGVRdW90ZXMoKSB7CisgICAgICAgIFN0cmluZyBleHBlY3RlZFhtbCA9ICcnJ1wKKzxjaGFycz4KKyAgPGFtcGVyc2FuZCBhPSImYW1wOyI+JmFtcDs8L2FtcGVyc2FuZD4KKyAgPHF1b3RlIGF0dHI9IiZxdW90OyI+IjwvcXVvdGU+CisgIDxhcG9zdHJvcGhlIGF0dHI9IiciPic8L2Fwb3N0cm9waGU+CisgIDxsZXNzdGhhbiBhdHRyPSJ2YWx1ZSI+Y2hhcnM6ICZhbXA7ICZsdDsgJmd0OyAnPC9sZXNzdGhhbj4KKyAgPGVsZW1lbnQgYXR0cj0idmFsdWUgMSAmYW1wOyAyIj5jaGFyczogJmFtcDsgJmx0OyAmZ3Q7ICIgaW4gbWlkZGxlPC9lbGVtZW50PgorICA8Z3JlYXRlcnRoYW4+Jmd0OzwvZ3JlYXRlcnRoYW4+CisgIDxlbXB0eUVsZW1lbnQgLz4KKzwvY2hhcnM+JycnCisKKyAgICAgICAgLy8gR2VuZXJhdGUgdGhlIG1hcmt1cC4KKyAgICAgICAgeG1sLmRvdWJsZVF1b3RlcyA9IHRydWUKKyAgICAgICAgeG1sLmNoYXJzIHsKKyAgICAgICAgICAgIGFtcGVyc2FuZChhOiAiJiIsICImIikKKyAgICAgICAgICAgIHF1b3RlKGF0dHI6ICJcIiIsICJcIiIpCisgICAgICAgICAgICBhcG9zdHJvcGhlKGF0dHI6ICInIiwgIiciKQorICAgICAgICAgICAgbGVzc3RoYW4oYXR0cjogInZhbHVlIiwgImNoYXJzOiAmIDwgPiAnIikKKyAgICAgICAgICAgIGVsZW1lbnQoYXR0cjogInZhbHVlIDEgJiAyIiwgImNoYXJzOiAmIDwgPiBcIiBpbiBtaWRkbGUiKQorICAgICAgICAgICAgZ3JlYXRlcnRoYW4oIj4iKQorICAgICAgICAgICAgZW1wdHlFbGVtZW50KCkKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFhtbCwgZml4RU9Mcyh3cml0ZXIudG9TdHJpbmcoKSkpCisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhhdCBNYXJrdXBCdWlsZGVyIGVzY2FwZXMgZWxlbWVudCBjb250ZW50IGNvcnJlY3RseSwgZXZlbgorICAgICAqIHdoZW4gdGhlIGNvbnRlbnQgY29udGFpbnMgbGluZS1lbmRpbmdzLgorICAgICAqLworICAgIHZvaWQgdGVzdEVzY2FwaW5nTXVsdGlMaW5lQ29udGVudCgpIHsKKworICAgICAgICAvLyBHZW5lcmF0ZSB0aGUgbWFya3VwLgorICAgICAgICB4bWwuZWxlbWVudCgnJydUaGlzIGlzIG11bHRpLWxpbmUgY29udGVudCB3aXRoIGNoYXJhY3RlcnMsIHN1Y2ggYXMgPCwgdGhhdAorcmVxdWlyZSBlc2NhcGluZy4gVGhlIG90aGVyIGNoYXJhY3RlcnMgY29uc2lzdCBvZjoKKworICAgICogPiAtIGdyZWF0ZXIgdGhhbgorICAgICogJiAtIGFtcGVyc2FuZAorJycnKQorCisgICAgICAgIGFzc2VydEV4cGVjdGVkWG1sKCcnJ1wKKzxlbGVtZW50PlRoaXMgaXMgbXVsdGktbGluZSBjb250ZW50IHdpdGggY2hhcmFjdGVycywgc3VjaCBhcyAmbHQ7LCB0aGF0CityZXF1aXJlIGVzY2FwaW5nLiBUaGUgb3RoZXIgY2hhcmFjdGVycyBjb25zaXN0IG9mOgorCisgICAgKiAmZ3Q7IC0gZ3JlYXRlciB0aGFuCisgICAgKiAmYW1wOyAtIGFtcGVyc2FuZAorPC9lbGVtZW50PicnJykKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgYWdhaW5zdCBhIHJlZ3Jlc3Npb24gYnVnIHdoZXJlYnkgc29tZSBlbXB0eSBlbGVtZW50cyB3ZXJlCisgICAgICogbm90IGNsb3NlZC4KKyAgICAgKi8KKyAgICB2b2lkIHRlc3RNYXJrdXBGb3JDbG9zaW5nVGFncygpIHsKKworICAgICAgICAvLyBHZW5lcmF0ZSB0aGUgWE1MLgorICAgICAgICBkZWYgbGlzdCA9IFsnZmlyc3QnLCAnc2Vjb25kJywgJ3RoaXJkJ10KKworICAgICAgICB4bWwuRUxFTTEoKSB7CisgICAgICAgICAgICBsaXN0LmVhY2goKXsgciAtPgorICAgICAgICAgICAgICAgIHhtbC5FTEVNMihpZDpyLCB0eXBlOicyJykgeworICAgICAgICAgICAgICAgICAgICB4bWwuRUxFTTNBKGlkOnIpCisgICAgICAgICAgICAgICAgICAgIHhtbC5FTEVNM0IodHlwZTonMycsICd0ZXh0JykKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRFeHBlY3RlZFhtbCgnJydcCis8RUxFTTE+CisgIDxFTEVNMiB0eXBlPScyJyBpZD0nZmlyc3QnPgorICAgIDxFTEVNM0EgaWQ9J2ZpcnN0JyAvPgorICAgIDxFTEVNM0IgdHlwZT0nMyc+dGV4dDwvRUxFTTNCPgorICA8L0VMRU0yPgorICA8RUxFTTIgdHlwZT0nMicgaWQ9J3NlY29uZCc+CisgICAgPEVMRU0zQSBpZD0nc2Vjb25kJyAvPgorICAgIDxFTEVNM0IgdHlwZT0nMyc+dGV4dDwvRUxFTTNCPgorICA8L0VMRU0yPgorICA8RUxFTTIgdHlwZT0nMicgaWQ9J3RoaXJkJz4KKyAgICA8RUxFTTNBIGlkPSd0aGlyZCcgLz4KKyAgICA8RUxFTTNCIHR5cGU9JzMnPnRleHQ8L0VMRU0zQj4KKyAgPC9FTEVNMj4KKzwvRUxFTTE+JycnKQorICAgIH0KKworICAgIHZvaWQgdGVzdE1peGVkTWFya3VwKCkgeworICAgICAgICB4bWwucCB7CisgICAgICAgICAgICBlbSgnVXN1YWxseScpCisgICAgICAgICAgICBta3AueWllbGQgJyBIZWFydHMgJiBEaWFtb25kcyAnCisgICAgICAgICAgICBiKCdiZWF0cycpCisgICAgICAgICAgICBta3AueWllbGRVbmVzY2FwZWQgJyBTcGFkZXMgJmFtcDsgQ2x1YnMnCisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRFeHBlY3RlZFhtbCgnJydcCis8cD48ZW0+VXN1YWxseTwvZW0+IEhlYXJ0cyAmYW1wOyBEaWFtb25kcyA8Yj5iZWF0czwvYj4gU3BhZGVzICZhbXA7IENsdWJzIDwvcD4nJycpCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdENhbGxpbmdNZXRob2QoKSB7CisgICAgICAgLy8gdGhpcyB0ZXN0IGlzIHRvIGVuc3VyZSBjb21wYXRpYmxpdHkgb25seQorICAgICAgIHhtbC5wIHsgCisgICAgICAgICBkZWYgYVZhbHVlID0gbXlNZXRob2QoWzpdKS52YWx1ZQorICAgICAgICAgZW0oYVZhbHVlKQorICAgICAgfQorICAgICAgCisgICAgICBhc3NlcnRFeHBlY3RlZFhtbCgnPHA+PGVtPmNhbGwgdG8gb3V0c2lkZTwvZW0+PC9wPicpCisgICAgfQorICAgIAorICAgIHByaXZhdGUgbXlNZXRob2QoeCkgeworICAgICAgeC52YWx1ZT0nY2FsbCB0byBvdXRzaWRlJworICAgICAgcmV0dXJuIHgKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkveG1sL01hcmt1cFdpdGhXcml0ZXJUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkveG1sL01hcmt1cFdpdGhXcml0ZXJUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTBkMzlmCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS94bWwvTWFya3VwV2l0aFdyaXRlclRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMjggQEAKK3BhY2thZ2UgZ3Jvb3Z5LnhtbAorCisvKioKKyAqIFRoaXMgdGVzdCB1c2VzIEdyb292eU1hcmt1cCB3aXRoIHdyaXRlcnMgb3RoZXIgdGhhbiBTeXN0ZW0ub3V0CisgKi8KK2NsYXNzIE1hcmt1cFdpdGhXcml0ZXJUZXN0IGV4dGVuZHMgVGVzdFhtbFN1cHBvcnQgeworCisgICAgdm9pZCB0ZXN0U21hbGxUcmVlV2l0aFN0cmluZ1dyaXRlcigpIHsKKyAgICAgICAgZGVmIHdyaXRlciA9IG5ldyBqYXZhLmlvLlN0cmluZ1dyaXRlcigpCisgICAgICAgIGRlZiBiID0gbmV3IE1hcmt1cEJ1aWxkZXIod3JpdGVyKQorCisgICAgICAgIGIucm9vdDEoYTo1LCBiOjcpIHsKKyAgICAgICAgICAgIGVsZW0xKCdoZWxsbzEnKQorICAgICAgICAgICAgZWxlbTIoJ2hlbGxvMicpCisgICAgICAgICAgICBlbGVtMyh4OjcpCisgICAgICAgIH0KKyAgICAgICAgcHJpbnRsbiB3cml0ZXIudG9TdHJpbmcoKQorLy8gICAgICAgIGFzc2VydEVxdWFscyAiPHJvb3QxIGE9JzUnIGI9JzcnPlxuIiArCisvLyAgICAgICAgICAgICAgICAiICA8ZWxlbTE+aGVsbG8xPC9lbGVtMT5cbiIgKworLy8gICAgICAgICAgICAgICAgIiAgPGVsZW0yPmhlbGxvMjwvZWxlbTI+XG4iICsKKy8vICAgICAgICAgICAgICAgICIgIDxlbGVtMyB4PSc3JyAvPlxuIiArCisvLyAgICAgICAgICAgICAgICAiPC9yb290MT4iLCB3cml0ZXIudG9TdHJpbmcoKQorICAgIH0KKworICAgIHZvaWQgdGVzdFdyaXRlclVzZUluU2NyaXB0RmlsZSgpIHsKKyAgICAgICAgYXNzZXJ0U2NyaXB0RmlsZSAnc3JjL3Rlc3QvZ3Jvb3Z5L3htbC9Vc2VNYXJrdXBXaXRoV3JpdGVyU2NyaXB0Lmdyb292eScKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS94bWwvTWl4ZWRNYXJrdXBUZXN0U3VwcG9ydC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3htbC9NaXhlZE1hcmt1cFRlc3RTdXBwb3J0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTcwMGEzCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS94bWwvTWl4ZWRNYXJrdXBUZXN0U3VwcG9ydC5ncm9vdnkKQEAgLTAsMCArMSwzNyBAQAorcGFja2FnZSBncm9vdnkueG1sCisKK2NsYXNzIE1peGVkTWFya3VwVGVzdFN1cHBvcnQgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZGVmIG1peGVkWG1sID0gJycnCis8cD5QbGVhc2UgcmVhZCB0aGUgPGEgaHJlZj0iaW5kZXguaHRtbCI+SG9tZTwvYT4gcGFnZTwvcD4KKycnJworICAgIHN0YXRpYyB2b2lkIGNoZWNrTWl4ZWRNYXJrdXAoQ2xvc3VyZSBnZXRSb290KSB7CisgICAgICAgIGRlZiByb290ID0gZ2V0Um9vdChtaXhlZFhtbCkKKyAgICAgICAgYXNzZXJ0IHJvb3QgIT0gbnVsbAorICAgICAgICBkZWYgY2hpbGRyZW4gPSByb290LmNoaWxkcmVuKCkKKyAgICAgICAgaWYgKGlzU2x1cnBlcihyb290KSkgeworICAgICAgICAgICAgYXNzZXJ0IGNoaWxkcmVuLnNpemUoKSA9PSAxCisgICAgICAgICAgICBhc3NlcnQgY2hpbGRyZW5bMF0ubmFtZSgpID09ICdhJworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0IGNoaWxkcmVuLnNpemUoKSA9PSAzCisgICAgICAgICAgICBhc3NlcnQgY2hpbGRyZW5bMV0ubmFtZSgpID09ICdhJworICAgICAgICAgICAgaWYgKGlzUGFyc2VyKHJvb3QpKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IGNoaWxkcmVuWzJdID09ICdwYWdlJworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQgY2hpbGRyZW5bMl0udGV4dCgpID09ICdwYWdlJworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1NsdXJwZXIobm9kZSkgeworICAgICAgICByZXR1cm4gbm9kZS5nZXRDbGFzcygpLm5hbWUuY29udGFpbnMoJ3NsdXJwZXInKQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNQYXJzZXIobm9kZSkgeworICAgICAgICByZXR1cm4gKG5vZGUgaW5zdGFuY2VvZiBncm9vdnkudXRpbC5Ob2RlKQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNEb20obm9kZSkgeworICAgICAgICByZXR1cm4gbm9kZS5nZXRDbGFzcygpLm5hbWUuY29udGFpbnMoJ0VsZW1lbnQnKQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkveG1sL05hbWVzcGFjZURPTVRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS94bWwvTmFtZXNwYWNlRE9NVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMwZjJmNQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkveG1sL05hbWVzcGFjZURPTVRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsNzMgQEAKK3BhY2thZ2UgZ3Jvb3Z5LnhtbAorCisvKioKKyAqIFRlc3QgdGhlIGJ1aWxkaW5nIG9mIG5hbWVzcGFjZWQgWE1MIHVzaW5nIEdyb292eU1hcmt1cAorICovCitjbGFzcyBOYW1lc3BhY2VET01UZXN0IGV4dGVuZHMgVGVzdFhtbFN1cHBvcnQgeworICAgIAorICAgIHZvaWQgdGVzdFRyZWUoKSB7CisgICAgICAgIGRlZiBidWlsZGVyID0gRE9NQnVpbGRlci5uZXdJbnN0YW5jZSgpCisgICAgICAgIGRlZiB4bWxucyA9IG5ldyBOYW1lc3BhY2VCdWlsZGVyKGJ1aWxkZXIpCisgICAgICAgIAorICAgICAgICBkZWYgeHNkID0geG1sbnMubmFtZXNwYWNlKCdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYScsICd4c2QnKQorICAgICAgICAKKyAgICAgICAgZGVmIHJvb3QgPSB4c2Quc2NoZW1hKHhtbG5zOlsnZm9vJzonaHR0cDovL3NvbWVPdGhlck5hbWVzcGFjZSddKSB7CisgICAgICAgICAgYW5ub3RhdGlvbiB7CisgICAgICAgICAgICAgIGRvY3VtZW50YXRpb24oIlB1cmNoYXNlIG9yZGVyIHNjaGVtYSBmb3IgRXhhbXBsZS5jb20uIikKKyAgICAgICAgICAgICAgLy9kb2N1bWVudGF0aW9uKHhtbG5zPVt4bWwubGFuZzonZW4nXSkgWyJQdXJjaGFzZSBvcmRlciBzY2hlbWEgZm9yIEV4YW1wbGUuY29tLiJdCisgICAgICAgICAgfQorICAgICAgICAgIGVsZW1lbnQobmFtZToncHVyY2hhc2VPcmRlcicsIHR5cGU6J1B1cmNoYXNlT3JkZXJUeXBlJykKKyAgICAgICAgICBlbGVtZW50KG5hbWU6J2NvbW1lbnQnLCB0eXBlOid4c2Q6c3RyaW5nJykKKyAgICAgICAgICBjb21wbGV4VHlwZShuYW1lOidQdXJjaGFzZU9yZGVyVHlwZScpIHsKKyAgICAgICAgICAgIHNlcXVlbmNlIHsKKyAgICAgICAgICAgICAgZWxlbWVudChuYW1lOidzaGlwVG8nLCB0eXBlOidVU0FkZHJlc3MnKQorICAgICAgICAgICAgICBlbGVtZW50KG5hbWU6J2JpbGxUbycsIHR5cGU6J1VTQWRkcmVzcycpCisgICAgICAgICAgICAgIGVsZW1lbnQobWluT2NjdXJzOicwJywgcmVmOidjb21tZW50JykKKyAgICAgICAgICAgICAgZWxlbWVudChuYW1lOidpdGVtcycsIHR5cGU6J0l0ZW1zJykKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF0dHJpYnV0ZShuYW1lOidvcmRlckRhdGUnLCB0eXBlOid4c2Q6ZGF0ZScpCisgICAgICAgICAgfQorICAgICAgICAgIGNvbXBsZXhUeXBlKG5hbWU6J1VTQWRkcmVzcycpIHsKKyAgICAgICAgICAgIHNlcXVlbmNlIHsKKyAgICAgICAgICAgICAgZWxlbWVudChuYW1lOiduYW1lJywgdHlwZToneHNkOnN0cmluZycpCisgICAgICAgICAgICAgIGVsZW1lbnQobmFtZTonc3RyZWV0JywgdHlwZToneHNkOnN0cmluZycpCisgICAgICAgICAgICAgIGVsZW1lbnQobmFtZTonY2l0eScsIHR5cGU6J3hzZDpzdHJpbmcnKQorICAgICAgICAgICAgICBlbGVtZW50KG5hbWU6J3N0YXRlJywgdHlwZToneHNkOnN0cmluZycpCisgICAgICAgICAgICAgIGVsZW1lbnQobmFtZTonemlwJywgdHlwZToneHNkOmRlY2ltYWwnKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYXR0cmlidXRlKGZpeGVkOidVUycsIG5hbWU6J2NvdW50cnknLCB0eXBlOid4c2Q6Tk1UT0tFTicpCisgICAgICAgICAgfQorICAgICAgICAgIGNvbXBsZXhUeXBlKG5hbWU6J0l0ZW1zJykgeworICAgICAgICAgICAgc2VxdWVuY2UgeworICAgICAgICAgICAgICBlbGVtZW50KG1heE9jY3VyczondW5ib3VuZGVkJywgbWluT2NjdXJzOicwJywgbmFtZTonaXRlbScpIHsKKyAgICAgICAgICAgICAgICBjb21wbGV4VHlwZSB7CisgICAgICAgICAgICAgICAgICBzZXF1ZW5jZSB7CisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQobmFtZToncHJvZHVjdE5hbWUnLCB0eXBlOid4c2Q6c3RyaW5nJykKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudChuYW1lOidxdWFudGl0eScpIHsKKyAgICAgICAgICAgICAgICAgICAgICBzaW1wbGVUeXBlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0aW9uKGJhc2U6J3hzZDpwb3NpdGl2ZUludGVnZXInKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEV4Y2x1c2l2ZSh2YWx1ZTonMTAwJykKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudChuYW1lOidVU1ByaWNlJywgdHlwZToneHNkOmRlY2ltYWwnKQorICAgICAgICAgICAgICAgICAgICBlbGVtZW50KG1pbk9jY3VyczonMCcsIHJlZjonY29tbWVudCcpCisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQobWluT2NjdXJzOicwJywgbmFtZTonc2hpcERhdGUnLCB0eXBlOid4c2Q6ZGF0ZScpCisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUobmFtZToncGFydE51bScsIHR5cGU6J1NLVScsIHVzZToncmVxdWlyZWQnKQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICAvKiBTdG9jayBLZWVwaW5nIFVuaXQsIGEgY29kZSBmb3IgaWRlbnRpZnlpbmcgcHJvZHVjdHMgKi8KKyAgICAgICAgICBzaW1wbGVUeXBlKG5hbWU6J1NLVScpIHsKKyAgICAgICAgICAgIHJlc3RyaWN0aW9uKGJhc2U6J3hzZDpzdHJpbmcnKSB7CisgICAgICAgICAgICAgIHBhdHRlcm4odmFsdWU6J1xcZHszfS1bQS1aXXsyfScpCisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9ICAgICAgICAKKyAgICAgICAgYXNzZXJ0IHJvb3QgIT0gbnVsbAorICAgICAgICAKKyAgICAgICAgZHVtcChyb290KQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3htbC9OYW1lc3BhY2VOb2RlR1BhdGhUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkveG1sL05hbWVzcGFjZU5vZGVHUGF0aFRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMGQ5MTgKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3htbC9OYW1lc3BhY2VOb2RlR1BhdGhUZXN0Lmdyb292eQpAQCAtMCwwICsxLDUyIEBACitwYWNrYWdlIGdyb292eS54bWwKKworLyoqCisgKiBUZXN0IHRoZSB1c2Ugb2YgR1BhdGggbmF2aWdhdGlvbiB3aXRoIG5hbWVzcGFjZXMKKyAqLworY2xhc3MgTmFtZXNwYWNlTm9kZUdQYXRoVGVzdCBleHRlbmRzIFRlc3RYbWxTdXBwb3J0IHsKKworICAgIHZvaWQgdGVzdFRyZWUoKSB7CisgICAgICAgIE5vZGUgcm9vdCA9IG5ldyBYbWxQYXJzZXIoKS5wYXJzZVRleHQoIiIiCis8eHNkOnNjaGVtYSB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KKyAgPHhzZDphbm5vdGF0aW9uIHhzZDpjaGVlc2U9IkVkYW0iPgorICAgICA8eHNkOmRvY3VtZW50YXRpb24+UHVyY2hhc2Ugb3JkZXIgc2NoZW1hIGZvciBFeGFtcGxlLmNvbS48L3hzZDpkb2N1bWVudGF0aW9uPgorICA8L3hzZDphbm5vdGF0aW9uPgorPC94c2Q6c2NoZW1hPgorIiIiKQorCisgICAgICAgIE5hbWVzcGFjZSB4c2QgPSBuZXcgTmFtZXNwYWNlKCdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYScsICd4c2QnKQorCisgICAgICAgIGRlZiBjaGlsZHJlbiA9IHJvb3QuY2hpbGRyZW4oKQorCisgICAgICAgIGRlZiBuYW1lID0gcm9vdC5uYW1lKCkKKworICAgICAgICByb290LmNoaWxkcmVuKCkuZWFjaCB7cHJpbnRsbiAiaGFzIGEgY2hpbGQgd2l0aCBuYW1lICR7aXQubmFtZSgpfSBhbmQgY29udGVudCAkaXQifQorCisgICAgICAgIGRlZiBmb28gPSB4c2QuYW5ub3RhdGlvbgorICAgICAgICBwcmludGxuICJxbmFtZSB1cmwgaXMgJGZvby5uYW1lc3BhY2VVUkkiCisgICAgICAgIHByaW50bG4gInFuYW1lIHByZWZpeCBpcyAkZm9vLnByZWZpeCIKKyAgICAgICAgcHJpbnRsbiAicW5hbWUgbG9jYWxQYXJ0IGlzICRmb28ubG9jYWxQYXJ0IgorCisgICAgICAgIGRlZiBhID0gcm9vdFt4c2QuYW5ub3RhdGlvbl0KKyAgICAgICAgcHJpbnRsbiAiRm91bmQgcmVzdWx0cyAkYSIKKworICAgICAgICBhc3NlcnQgYS5zaXplKCkgPT0gMTogIiBzaXplIGlzICRhLnNpemUoKSIKKworICAgICAgICBkZWYgYU5vZGUgPSBhWzBdCisgICAgICAgIGRlZiBjaGVlc2UgPSBhTm9kZS5hdHRyaWJ1dGVzKClbeHNkLmNoZWVzZV0KKyAgICAgICAgYXNzZXJ0IGNoZWVzZSA9PSAiRWRhbSIKKyAgICAgICAgcHJpbnRsbiAiRm91bmQgbmFtZXNwYWNlZCBhdHRyaWJ1dGUgJGNoZWVzZSIKKworICAgICAgICBjaGVlc2UgPSBhTm9kZS5hdHRyaWJ1dGUoeHNkLmNoZWVzZSkKKyAgICAgICAgYXNzZXJ0IGNoZWVzZSA9PSAiRWRhbSIKKyAgICAgICAgcHJpbnRsbiAiRm91bmQgbmFtZXNwYWNlZCBhdHRyaWJ1dGUgJGNoZWVzZSIKKworICAgICAgICBkZWYgZSA9IHJvb3RbeHNkLmFubm90YXRpb25dW3hzZC5kb2N1bWVudGF0aW9uXQorICAgICAgICBhc3NlcnQgZS5zaXplKCkgPT0gMTogIiBzaXplIGlzICRlLnNpemUoKSIKKyAgICAgICAgYXNzZXJ0IGUudGV4dCgpID09ICJQdXJjaGFzZSBvcmRlciBzY2hlbWEgZm9yIEV4YW1wbGUuY29tLiIKKworICAgICAgICBlID0gYVt4c2QuZG9jdW1lbnRhdGlvbl0KKyAgICAgICAgYXNzZXJ0IGUuc2l6ZSgpID09IDE6ICIgc2l6ZSBpcyAkZS5zaXplKCkiCisgICAgICAgIGFzc2VydCBlLnRleHQoKSA9PSAiUHVyY2hhc2Ugb3JkZXIgc2NoZW1hIGZvciBFeGFtcGxlLmNvbS4iCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkveG1sL05hbWVzcGFjZU5vZGVUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkveG1sL05hbWVzcGFjZU5vZGVUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWIyNWJlCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS94bWwvTmFtZXNwYWNlTm9kZVRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTAwIEBACitwYWNrYWdlIGdyb292eS54bWwKKworLyoqCisgKiBUZXN0IHRoZSBidWlsZGluZyBvZiBuYW1lc3BhY2VkIFhNTCB1c2luZyBHcm9vdnlNYXJrdXAKKyAqLworY2xhc3MgTmFtZXNwYWNlTm9kZVRlc3QgZXh0ZW5kcyBUZXN0WG1sU3VwcG9ydCB7CisKKyAgICB2b2lkIHRlc3RUcmVlX0ZBSUxTKCkge2lmIChub3RZZXRJbXBsZW1lbnRlZCgpKSByZXR1cm4KKyAgICAgICAgZGVmIGJ1aWxkZXIgPSBOb2RlQnVpbGRlci5uZXdJbnN0YW5jZSgpCisgICAgICAgIGRlZiB4bWxucyA9IG5ldyBOYW1lc3BhY2VCdWlsZGVyKGJ1aWxkZXIpCisKKyAgICAgICAgZGVmIHhzZCA9IHhtbG5zLm5hbWVzcGFjZSgnaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnLCAneHNkJykKKworICAgICAgICBkZWYgcm9vdCA9IHhzZC5zY2hlbWEoeG1sbnM6IFsnZm9vJzogJ2h0dHA6Ly9zb21lT3RoZXJOYW1lc3BhY2UnXSkgeworICAgICAgICAgICAgYW5ub3RhdGlvbiB7CisgICAgICAgICAgICAgICAgZG9jdW1lbnRhdGlvbigiUHVyY2hhc2Ugb3JkZXIgc2NoZW1hIGZvciBFeGFtcGxlLmNvbS4iKQorICAgICAgICAgICAgICAgIC8vZG9jdW1lbnRhdGlvbih4bWxucz1beG1sLmxhbmc6J2VuJ10pIFsiUHVyY2hhc2Ugb3JkZXIgc2NoZW1hIGZvciBFeGFtcGxlLmNvbS4iXQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxlbWVudChuYW1lOiAncHVyY2hhc2VPcmRlcicsIHR5cGU6ICdQdXJjaGFzZU9yZGVyVHlwZScpCisgICAgICAgICAgICBlbGVtZW50KG5hbWU6ICdjb21tZW50JywgdHlwZTogJ3hzZDpzdHJpbmcnKQorICAgICAgICAgICAgY29tcGxleFR5cGUobmFtZTogJ1B1cmNoYXNlT3JkZXJUeXBlJykgeworICAgICAgICAgICAgICAgIHNlcXVlbmNlIHsKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudChuYW1lOiAnc2hpcFRvJywgdHlwZTogJ1VTQWRkcmVzcycpCisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQobmFtZTogJ2JpbGxUbycsIHR5cGU6ICdVU0FkZHJlc3MnKQorICAgICAgICAgICAgICAgICAgICBlbGVtZW50KG1pbk9jY3VyczogJzAnLCByZWY6ICdjb21tZW50JykKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudChuYW1lOiAnaXRlbXMnLCB0eXBlOiAnSXRlbXMnKQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGUobmFtZTogJ29yZGVyRGF0ZScsIHR5cGU6ICd4c2Q6ZGF0ZScpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb21wbGV4VHlwZShuYW1lOiAnVVNBZGRyZXNzJykgeworICAgICAgICAgICAgICAgIHNlcXVlbmNlIHsKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudChuYW1lOiAnbmFtZScsIHR5cGU6ICd4c2Q6c3RyaW5nJykKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudChuYW1lOiAnc3RyZWV0JywgdHlwZTogJ3hzZDpzdHJpbmcnKQorICAgICAgICAgICAgICAgICAgICBlbGVtZW50KG5hbWU6ICdjaXR5JywgdHlwZTogJ3hzZDpzdHJpbmcnKQorICAgICAgICAgICAgICAgICAgICBlbGVtZW50KG5hbWU6ICdzdGF0ZScsIHR5cGU6ICd4c2Q6c3RyaW5nJykKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudChuYW1lOiAnemlwJywgdHlwZTogJ3hzZDpkZWNpbWFsJykKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXR0cmlidXRlKGZpeGVkOiAnVVMnLCBuYW1lOiAnY291bnRyeScsIHR5cGU6ICd4c2Q6Tk1UT0tFTicpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb21wbGV4VHlwZShuYW1lOiAnSXRlbXMnKSB7CisgICAgICAgICAgICAgICAgc2VxdWVuY2UgeworICAgICAgICAgICAgICAgICAgICBlbGVtZW50KG1heE9jY3VyczogJ3VuYm91bmRlZCcsIG1pbk9jY3VyczogJzAnLCBuYW1lOiAnaXRlbScpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXhUeXBlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQobmFtZTogJ3Byb2R1Y3ROYW1lJywgdHlwZTogJ3hzZDpzdHJpbmcnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50KG5hbWU6ICdxdWFudGl0eScpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbXBsZVR5cGUgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0aW9uKGJhc2U6ICd4c2Q6cG9zaXRpdmVJbnRlZ2VyJykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhFeGNsdXNpdmUodmFsdWU6ICcxMDAnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50KG5hbWU6ICdVU1ByaWNlJywgdHlwZTogJ3hzZDpkZWNpbWFsJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudChtaW5PY2N1cnM6ICcwJywgcmVmOiAnY29tbWVudCcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQobWluT2NjdXJzOiAnMCcsIG5hbWU6ICdzaGlwRGF0ZScsIHR5cGU6ICd4c2Q6ZGF0ZScpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZShuYW1lOiAncGFydE51bScsIHR5cGU6ICdTS1UnLCB1c2U6ICdyZXF1aXJlZCcpCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBTdG9jayBLZWVwaW5nIFVuaXQsIGEgY29kZSBmb3IgaWRlbnRpZnlpbmcgcHJvZHVjdHMgKi8KKyAgICAgICAgICAgIHNpbXBsZVR5cGUobmFtZTogJ1NLVScpIHsKKyAgICAgICAgICAgICAgICByZXN0cmljdGlvbihiYXNlOiAneHNkOnN0cmluZycpIHsKKyAgICAgICAgICAgICAgICAgICAgcGF0dGVybih2YWx1ZTogJ1xcZHszfS1bQS1aXXsyfScpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFzc2VydCByb290ICE9IG51bGwKKworICAgICAgICBhc3NlcnRHUGF0aHMocm9vdCkKKyAgICB9CisKKyAgICB2b2lkIGFzc2VydEdQYXRocyhOb2RlIHJvb3QpIHsKKyAgICAgICAgTmFtZXNwYWNlIHhzZCA9IG5ldyBOYW1lc3BhY2UoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJywgJ3hzZCcpCisKKyAgICAgICAgZGVmIGNoaWxkcmVuID0gcm9vdC5jaGlsZHJlbigpCisgICAgICAgIHByaW50bG4gImhhcyBjaGlsZHJlbiAkY2hpbGRyZW4iCisKKyAgICAgICAgZGVmIG5hbWUgPSByb290Lm5hbWUoKQorICAgICAgICBwcmludGxuICJuYW1lIGlzIG9mIHR5cGUgJHtuYW1lLmdldENsYXNzKCl9IHdpdGggdmFsdWUgJG5hbWUiCisKKyAgICAgICAgcm9vdC5jaGlsZHJlbigpLmVhY2gge3ByaW50bG4gImhhcyBhIGNoaWxkIHdpdGggbmFtZSAke2l0Lm5hbWUoKX0gYW5kIGNvbnRlbnQgJGl0In0KKworICAgICAgICBkZWYgZm9vID0geHNkLmFubm90YXRpb24KKyAgICAgICAgcHJpbnRsbiAicW5hbWUgaXMgJGZvbyIKKyAgICAgICAgcHJpbnRsbiAicW5hbWUgdXJsIGlzICRmb28ubmFtZXNwYWNlVVJJIgorICAgICAgICBwcmludGxuICJxbmFtZSBwcmVmaXggaXMgJGZvby5wcmVmaXgiCisgICAgICAgIHByaW50bG4gInFuYW1lIGxvY2FsUGFydCBpcyAkZm9vLmxvY2FsUGFydCIKKworICAgICAgICBkZWYgYSA9IHJvb3RbeHNkLmFubm90YXRpb25dCisgICAgICAgIHByaW50bG4gIkZvdW5kIHJlc3VsdHMgJGEiCisKKyAgICAgICAgZGVmIGUgPSByb290W3hzZC5hbm5vdGF0aW9uXVt4c2QuZG9jdW1lbnRhdGlvbl0KKworICAgICAgICBTdHJpbmcgdGV4dCA9IGUudGV4dCgpCisgICAgICAgIHByaW50bG4gIkZvdW5kIGVsZW1lbnQ6ICRlIHdpdGggdGV4dDogJHRleHQiCisgICAgICAgIGFzc2VydCB0ZXh0ID09ICJQdXJjaGFzZSBvcmRlciBzY2hlbWEgZm9yIEV4YW1wbGUuY29tLiIKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS94bWwvU0FYVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3htbC9TQVhUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmI2NDJhCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS94bWwvU0FYVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwzNiBAQAorcGFja2FnZSBncm9vdnkueG1sCisKKy8qKgorICogVGhpcyB0ZXN0IHVzZXMgdGhlIGNvbmNpc2Ugc3ludGF4IHRvIHRlc3QgdGhlIGdlbmVyYXRpb24KKyAqIG9mIFNBWCBldmVudHMgdXNpbmcgR3Jvb3Z5TWFya3VwCisgKi8KK2NsYXNzIFNBWFRlc3QgZXh0ZW5kcyBUZXN0WG1sU3VwcG9ydCB7CisgICAgCisgICAgdm9pZCB0ZXN0U21hbGxUcmVlKCkgeworICAgICAgICBkZWYgYiA9IGNyZWF0ZVNBWEJ1aWxkZXIoKQorICAgICAgICAKKyAgICAgICAgZGVmIHJvb3QgPSBiLnJvb3QxKGE6NSwgYjo3KSB7CisgICAgICAgICAgICBlbGVtMSgnaGVsbG8xJykKKyAgICAgICAgICAgIGVsZW0yKCdoZWxsbzInKQorICAgICAgICAgICAgZWxlbTMoeDo3KQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdFRyZWUoKSB7CisgICAgICAgIGRlZiBiID0gY3JlYXRlU0FYQnVpbGRlcigpCisgICAgICAgIAorICAgICAgICBkZWYgcm9vdCA9IGIucm9vdDIoYTo1LCBiOjcpIHsKKyAgICAgICAgICAgIGVsZW0xKCdoZWxsbzEnKQorICAgICAgICAgICAgZWxlbTIoJ2hlbGxvMicpCisgICAgICAgICAgICBuZXN0ZWRFbGVtKHg6J2FiYycsIHk6J2RlZicpIHsKKyAgICAgICAgICAgICAgICBjaGlsZCh6OidkZWYnKQorICAgICAgICAgICAgICAgIGNoaWxkMigpICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgbmVzdGVkRWxlbTIoejonenp6JykgeworICAgICAgICAgICAgICAgIGNoaWxkKHo6J2RlZicpCisgICAgICAgICAgICAgICAgY2hpbGQyKCJoZWxsbyIpICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3htbC9TbWFsbE5hbWVzcGFjZURPTVRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS94bWwvU21hbGxOYW1lc3BhY2VET01UZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWQ3NTU1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS94bWwvU21hbGxOYW1lc3BhY2VET01UZXN0Lmdyb292eQpAQCAtMCwwICsxLDI2IEBACitwYWNrYWdlIGdyb292eS54bWwKKworY2xhc3MgU21hbGxOYW1lc3BhY2VET01UZXN0IGV4dGVuZHMgVGVzdFhtbFN1cHBvcnQgeworICAgIAorICAgIHZvaWQgdGVzdFRyZWUoKSB7CisgICAgICAgIGRlZiBidWlsZGVyID0gRE9NQnVpbGRlci5uZXdJbnN0YW5jZSgpCisgICAgICAgIGRlZiB4c2QgPSBOYW1lc3BhY2VCdWlsZGVyLm5ld0luc3RhbmNlKGJ1aWxkZXIsICdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYScsICd4c2QnKQorICAgICAgICAKKyAgICAgICAgZGVmIHJvb3QgPSB4c2Quc2NoZW1hKCkgeworICAgICAgICAgIGVsZW1lbnQobmFtZToncHVyY2hhc2VPcmRlcicsIHR5cGU6J1B1cmNoYXNlT3JkZXJUeXBlJykKKyAgICAgICAgICBlbGVtZW50KG5hbWU6J2NvbW1lbnQnLCB0eXBlOid4c2Q6c3RyaW5nJykKKyAgICAgICAgICBjb21wbGV4VHlwZShuYW1lOidQdXJjaGFzZU9yZGVyVHlwZScpIHsKKyAgICAgICAgICAgIHNlcXVlbmNlIHsKKyAgICAgICAgICAgICAgZWxlbWVudChuYW1lOidzaGlwVG8nLCB0eXBlOidVU0FkZHJlc3MnKQorICAgICAgICAgICAgICBlbGVtZW50KG5hbWU6J2JpbGxUbycsIHR5cGU6J1VTQWRkcmVzcycpCisgICAgICAgICAgICAgIGVsZW1lbnQobWluT2NjdXJzOicwJywgcmVmOidjb21tZW50JykKKyAgICAgICAgICAgICAgZWxlbWVudChuYW1lOidpdGVtcycsIHR5cGU6J0l0ZW1zJykKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF0dHJpYnV0ZShuYW1lOidvcmRlckRhdGUnLCB0eXBlOid4c2Q6ZGF0ZScpCisgICAgICAgICAgfQorICAgICAgICB9ICAgICAgICAKKyAgICAgICAgYXNzZXJ0IHJvb3QgIT0gbnVsbAorICAgICAgICAKKyAgICAgICAgZHVtcChyb290KQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkveG1sL1N0cmVhbWluZ01hcmt1cEJ1aWxkZXJUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkveG1sL1N0cmVhbWluZ01hcmt1cEJ1aWxkZXJUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWNjMTRhCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS94bWwvU3RyZWFtaW5nTWFya3VwQnVpbGRlclRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgZ3Jvb3Z5LnhtbAorCitpbXBvcnQgb3JnLmN1c3RvbW1vbmtleS54bWx1bml0LioKKworLyoqCisgKiBUaGlzIHRlc3QgdXNlcyB0aGUgY29uY2lzZSBzeW50YXggdG8gdGVzdCB0aGUgYnVpbGRpbmcgb2YgCisgKiB0ZXh0dWFsIG1hcmt1cCAoWE1MIG9yIEhUTUwpIHVzaW5nIEdyb292eU1hcmt1cAorICovCitjbGFzcyBTdHJlYW1pbmdNYXJrdXBCdWlsZGVyVGVzdCBleHRlbmRzIFRlc3RYbWxTdXBwb3J0IHsKKyAgICAKKyAgICB2b2lkIHRlc3RTbWFsbFRyZWUoKSB7CisgICAgICAgIGRlZiBiID0gbmV3IFN0cmVhbWluZ01hcmt1cEJ1aWxkZXIoKQorICAgICAgICBkZWYgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpCisgICAgICAgIAorICAgICAgICBkZWYgbSA9IHsKKyAgICAgICAgICAgIG1rcC5waSgieG1sLXN0eWxlc2hlZXQiOltocmVmOiJteXN0eWxlLmNzcyIsIHR5cGU6InRleHQvY3NzIl0pCisgICAgICAgICAgICByb290MShhOjUsIGI6NykgeworICAgICAgICAgICAgICAgIGVsZW0xKCdoZWxsbzEnKQorICAgICAgICAgICAgICAgIGVsZW0yKCdoZWxsbzInKQorICAgICAgICAgICAgICAgIGVsZW0zKHg6NykKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGRlZiBleHBlY3RlZFhtbCA9ICcnJ1wKKzw/eG1sLXN0eWxlc2hlZXQgaHJlZj0ibXlzdHlsZS5jc3MiIHR5cGU9InRleHQvY3NzIj8+Cis8cm9vdDEgYT0nNScgYj0nNyc+CisgIDxlbGVtMT5oZWxsbzE8L2VsZW0xPgorICA8ZWxlbTI+aGVsbG8yPC9lbGVtMj4KKyAgPGVsZW0zIHg9JzcnLz4KKzwvcm9vdDE+JycnCisgICAgICAgIHdyaXRlciA8PCBiLmJpbmQobSkKKyAgICAgICAgWE1MVW5pdC5pZ25vcmVXaGl0ZXNwYWNlID0gdHJ1ZQorICAgICAgICBkZWYgeG1sRGlmZiA9IG5ldyBEaWZmKGV4cGVjdGVkWG1sLCB3cml0ZXIudG9TdHJpbmcoKSkKKyAgICAgICAgYXNzZXJ0IHhtbERpZmYuc2ltaWxhcigpLCB4bWxEaWZmLnRvU3RyaW5nKCkKKyAgICB9CisKKyAgICB2b2lkIHRlc3RUcmVlKCkgeworICAgICAgICBkZWYgYiA9IG5ldyBTdHJlYW1pbmdNYXJrdXBCdWlsZGVyKCkKKyAgICAgICAgZGVmIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKQorCisgICAgICAgIGRlZiBtID0geworICAgICAgICAgICAgcm9vdDIoYTo1LCBiOjcpIHsKKyAgICAgICAgICAgICAgICBlbGVtMSgnaGVsbG8xJykKKyAgICAgICAgICAgICAgICBlbGVtMignaGVsbG8yJykKKyAgICAgICAgICAgICAgICBuZXN0ZWRFbGVtKHg6J2FiYycsIHk6J2RlZicpIHsKKyAgICAgICAgICAgICAgICAgICAgY2hpbGQoejonZGVmJykKKyAgICAgICAgICAgICAgICAgICAgY2hpbGQyKCkKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBuZXN0ZWRFbGVtMih6Oid6enonKSB7CisgICAgICAgICAgICAgICAgICAgIGNoaWxkKHo6J2RlZicpCisgICAgICAgICAgICAgICAgICAgIGNoaWxkMigiaGVsbG8iKQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGRlZiBleHBlY3RlZFhtbCA9ICcnJ1wKKzxyb290MiBhPSc1JyBiPSc3Jz4KKyAgPGVsZW0xPmhlbGxvMTwvZWxlbTE+CisgIDxlbGVtMj5oZWxsbzI8L2VsZW0yPgorICA8bmVzdGVkRWxlbSB4PSdhYmMnIHk9J2RlZic+CisgICAgPGNoaWxkIHo9J2RlZicvPgorICAgIDxjaGlsZDIvPgorICA8L25lc3RlZEVsZW0+CisgIDxuZXN0ZWRFbGVtMiB6PSd6enonPgorICAgIDxjaGlsZCB6PSdkZWYnLz4KKyAgICA8Y2hpbGQyPmhlbGxvPC9jaGlsZDI+CisgIDwvbmVzdGVkRWxlbTI+Cis8L3Jvb3QyPicnJworCisgICAgICAgIHdyaXRlciA8PCBiLmJpbmQobSkKKyAgICAgICAgWE1MVW5pdC5pZ25vcmVXaGl0ZXNwYWNlID0gdHJ1ZQorICAgICAgICBkZWYgeG1sRGlmZiA9IG5ldyBEaWZmKGV4cGVjdGVkWG1sLCB3cml0ZXIudG9TdHJpbmcoKSkKKyAgICAgICAgYXNzZXJ0IHhtbERpZmYuc2ltaWxhcigpLCB4bWxEaWZmLnRvU3RyaW5nKCkKKyAgICB9CisKKyAgICB2b2lkIHRlc3RPYmplY3RPcGVyYXRpb25zSW5NYXJrdXAoKSB7CisgICAgICAgIGRlZiBkb2MgPSBuZXcgU3RyZWFtaW5nTWFya3VwQnVpbGRlcigpLmJpbmQgeworICAgICAgICAgICAgcm9vdCB7CisgICAgICAgICAgICAgICAgKDEuLjMpLmVhY2ggeworICAgICAgICAgICAgICAgICAgICBpdGVtKCkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0IGRvYy50b1N0cmluZygpID09ICI8cm9vdD48aXRlbS8+PGl0ZW0vPjxpdGVtLz48L3Jvb3Q+IgorICAgIH0KKworICAgIHZvaWQgdGVzdE1peGVkTWFya3VwKCkgeworICAgICAgICBkZWYgYiA9IG5ldyBTdHJlYW1pbmdNYXJrdXBCdWlsZGVyKCkKKyAgICAgICAgZGVmIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKQorCisgICAgICAgIGRlZiBtID0geworLy8gdW5jb21tZW50IGlmIHlvdSB3YW50IGVudGl0aWVzIGxpa2UgJm5ic3A7IChhbmQgYWRkIHRvIGV4cGVjdGVkIHRvbykKKy8vICAgICAgICAgICAgbWtwLnlpZWxkVW5lc2NhcGVkICcnJzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+JycnCisgICAgICAgICAgICBodG1sIHsKKyAgICAgICAgICAgICAgICBib2R5IHsKKyAgICAgICAgICAgICAgICAgICAgcCB7CisgICAgICAgICAgICAgICAgICAgICAgICBta3AueWllbGQgJ1RoZSAnCisgICAgICAgICAgICAgICAgICAgICAgICBpKCdxdWljaycpCisgICAgICAgICAgICAgICAgICAgICAgICBta3AueWllbGRVbmVzY2FwZWQgJyBicm93biBmb3gganVtcGVkIG92ZXIgdGhlIDxiPmxhenk8L2I+IGRvZyAmYW1wOyBzbGVlcHkgY2F0JworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZGVmIGV4cGVjdGVkWG1sID0gJycnXAorPGh0bWw+CisgIDxib2R5PgorICAgIDxwPlRoZSA8aT5xdWljazwvaT4gYnJvd24gZm94IGp1bXBlZCBvdmVyIHRoZSA8Yj5sYXp5PC9iPiBkb2cgJmFtcDsgc2xlZXB5IGNhdDwvcD4KKyAgPC9ib2R5PgorPC9odG1sPicnJworCisgICAgICAgIHdyaXRlciA8PCBiLmJpbmQobSkKKyAgICAgICAgWE1MVW5pdC5pZ25vcmVXaGl0ZXNwYWNlID0gdHJ1ZQorICAgICAgICBkZWYgeG1sRGlmZiA9IG5ldyBEaWZmKGV4cGVjdGVkWG1sLCB3cml0ZXIudG9TdHJpbmcoKSkKKyAgICAgICAgYXNzZXJ0IHhtbERpZmYuc2ltaWxhcigpLCB4bWxEaWZmLnRvU3RyaW5nKCkKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS94bWwvVGVzdFhtbFN1cHBvcnQuamF2YSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkveG1sL1Rlc3RYbWxTdXBwb3J0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWViMTQ1NAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkveG1sL1Rlc3RYbWxTdXBwb3J0LmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoKKyRJZCQKKworQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCit0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0CitzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKK2NvcHkgb2YgdGhpcyBkb2N1bWVudC4KKworMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQorYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQorZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCittYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCiszLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCitwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCitwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KKworNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIKK25vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAordHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KKworNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KK2h0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLworCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTCitgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAorTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTAorVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKK1NFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisqLworCitwYWNrYWdlIGdyb292eS54bWw7CisKK2ltcG9ydCBncm9vdnkueG1sLmRvbS5ET01VdGlsOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW4uVGVzdFN1cHBvcnQ7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisvKioKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBUZXN0WG1sU3VwcG9ydCBleHRlbmRzIFRlc3RTdXBwb3J0IHsKKworICAgIHByb3RlY3RlZCB2b2lkIGR1bXAoTm9kZSBub2RlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBET01VdGlsLnNlcmlhbGl6ZSgoRWxlbWVudCkgbm9kZSwgU3lzdGVtLm91dCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFNBWEJ1aWxkZXIgY3JlYXRlU0FYQnVpbGRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgU0FYQnVpbGRlcihuZXcgTG9nZ2luZ0RlZmF1bHRIYW5kbGVyKCkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIExvZ2dpbmdEZWZhdWx0SGFuZGxlciBleHRlbmRzIERlZmF1bHRIYW5kbGVyIHsKKyAgICAgICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RhcnQgRWxlbWVudDogIiArIGxvY2FsTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFbmQgRWxlbWVudDogIiArIGxvY2FsTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZvaWQgY2hhcmFjdGVycyhjaGFyIGNoW10sIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNoYXJhY3RlcnM6ICIgKyBuZXcgU3RyaW5nKGNoKS5zdWJzdHJpbmcoc3RhcnQsIHN0YXJ0ICsgbGVuZ3RoIC0gMSkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS94bWwvVHJhdmVyc2FsVGVzdFN1cHBvcnQuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS94bWwvVHJhdmVyc2FsVGVzdFN1cHBvcnQuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZmFjNTYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3htbC9UcmF2ZXJzYWxUZXN0U3VwcG9ydC5ncm9vdnkKQEAgLTAsMCArMSwzNSBAQAorcGFja2FnZSBncm9vdnkueG1sCisKK2NsYXNzIFRyYXZlcnNhbFRlc3RTdXBwb3J0IHsKKyAgICBwcml2YXRlIHN0YXRpYyBkZWYgbmVzdGVkWG1sID0gJycnCisgICAgPF8xPgorICAgICAgICA8XzFfMT4KKyAgICAgICAgICAgIDxfMV8xXzEvPgorICAgICAgICAgICAgPF8xXzFfMj4KKyAgICAgICAgICAgICAgICA8XzFfMV8yXzEvPgorICAgICAgICAgICAgPC9fMV8xXzI+CisgICAgICAgIDwvXzFfMT4KKyAgICAgICAgPF8xXzI+CisgICAgICAgICAgICA8XzFfMl8xLz4KKyAgICAgICAgPC9fMV8yPgorICAgIDwvXzE+CisgICAgJycnCisKKyAgICBzdGF0aWMgdm9pZCBjaGVja0RlcHRoRmlyc3QoQ2xvc3VyZSBnZXRSb290KSB7CisgICAgICAgIGRlZiByb290ID0gZ2V0Um9vdChuZXN0ZWRYbWwpCisgICAgICAgIGRlZiB0cmFjZSA9ICcnCisgICAgICAgIHJvb3QuZGVwdGhGaXJzdCgpLmVhY2h7IHRyYWNlICs9IGl0Lm5hbWUoKSArICcgJyB9CisgICAgICAgIGFzc2VydCB0cmFjZSA9PSAnXzEgXzFfMSBfMV8xXzEgXzFfMV8yIF8xXzFfMl8xIF8xXzIgXzFfMl8xICcKKyAgICAgICAgLy8gdGVzdCBzaG9ydGhhbmQKKyAgICAgICAgdHJhY2UgPSAnJworICAgICAgICByb290LidfMV8yJy4nKionLmVhY2h7IHRyYWNlICs9IGl0Lm5hbWUoKSArICcgJyB9CisgICAgICAgIGFzc2VydCB0cmFjZSA9PSAnXzFfMiBfMV8yXzEgJworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIGNoZWNrQnJlYWR0aEZpcnN0KENsb3N1cmUgZ2V0Um9vdCkgeworICAgICAgICBkZWYgcm9vdCA9IGdldFJvb3QobmVzdGVkWG1sKQorICAgICAgICBkZWYgdHJhY2UgPSAnJworICAgICAgICByb290LmJyZWFkdGhGaXJzdCgpLmVhY2h7IHRyYWNlICs9IGl0Lm5hbWUoKSArICcgJyB9CisgICAgICAgIGFzc2VydCB0cmFjZSA9PSAnXzEgXzFfMSBfMV8yIF8xXzFfMSBfMV8xXzIgXzFfMl8xIF8xXzFfMl8xICcKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3htbC9Vc2VNYXJrdXBXaXRoV3JpdGVyU2NyaXB0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkveG1sL1VzZU1hcmt1cFdpdGhXcml0ZXJTY3JpcHQuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMDFhOTQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L3htbC9Vc2VNYXJrdXBXaXRoV3JpdGVyU2NyaXB0Lmdyb292eQpAQCAtMCwwICsxLDggQEAKKy8vIHVzZWQgYnkgTWFya3VwV2l0aFdyaXRlclRlc3QudGVzdFdyaXRlclVzZUluU2NyaXB0RmlsZQorCit3cml0ZXIgPSBuZXcgamF2YS5pby5TdHJpbmdXcml0ZXIoKQorYiA9IG5ldyBncm9vdnkueG1sLk1hcmt1cEJ1aWxkZXIod3JpdGVyKQorCitiLnJvb3QxKGE6NSkKK3ByaW50bG4gd3JpdGVyLnRvU3RyaW5nKCkKK2Fzc2VydCAiPHJvb3QxIGE9JzUnIC8+IiA9PSB3cml0ZXIudG9TdHJpbmcoKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkveG1sL1ZlcmJvc2VET01UZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkveG1sL1ZlcmJvc2VET01UZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2I5OWI5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS94bWwvVmVyYm9zZURPTVRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsODEgQEAKK3BhY2thZ2UgZ3Jvb3Z5LnhtbAorCisvKioKKyAqIFRoaXMgdGVzdCB1c2VzIHRoZSB2ZXJib3NlIHN5bnRheCB0byB0ZXN0IHRoZSBidWlsZGluZyBvZiAKKyAqIFczQyBET00gdHJlZXMgdXNpbmcgR3Jvb3Z5TWFya3VwCisgKi8KK2NsYXNzIFZlcmJvc2VET01UZXN0IGV4dGVuZHMgVGVzdFhtbFN1cHBvcnQgeworICAgIAorICAgIHZvaWQgdGVzdFNtYWxsVHJlZSgpIHsKKyAgICAgICAgZGVmIGIgPSBET01CdWlsZGVyLm5ld0luc3RhbmNlKCkKKyAgICAgICAgCisgICAgICAgIGRlZiByb290ID0gYi5yb290MShbJ2EnOjUsICdiJzo3XSwgey0+CisgICAgICAgICAgICBlbGVtMSgnaGVsbG8xJykKKyAgICAgICAgICAgIGVsZW0yKCdoZWxsbzInKQorICAgICAgICAgICAgZWxlbTMoWyd4Jzo3XSkKKyAgICAgICAgfSkKKyAgICAgICAgCisgICAgICAgIGFzc2VydCByb290ICE9IG51bGwKKyAgICAgICAgCisgICAgICAgIGR1bXAocm9vdCkKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0VHJlZSgpIHsKKyAgICAgICAgZGVmIGIgPSBET01CdWlsZGVyLm5ld0luc3RhbmNlKCkKKyAgICAgICAgCisgICAgICAgIGRlZiByb290ID0gYi5yb290MihbJ2EnOjUsICdiJzo3XSwgeworICAgICAgICAgICAgZWxlbTEoJ2hlbGxvMScpCisgICAgICAgICAgICBlbGVtMignaGVsbG8yJykKKyAgICAgICAgICAgIG5lc3RlZEVsZW0oWyd4JzonYWJjJywgJ3knOidkZWYnXSwgey0+CisgICAgICAgICAgICAgICAgY2hpbGQoWyd6JzonZGVmJ10pCisgICAgICAgICAgICAgICAgY2hpbGQyKCkKKyAgICAgICAgICAgIH0pCisKKyAgICAgICAgICAgIG5lc3RlZEVsZW0yKFsneic6J3p6eiddLCB7LT4KKyAgICAgICAgICAgICAgICBjaGlsZChbJ3onOidkZWYnXSkKKyAgICAgICAgICAgICAgICBjaGlsZDIoImhlbGxvIikgIAorICAgICAgICAgICAgfSkKKyAgICAgICAgfSkKKyAgICAgICAgCisgICAgICAgIGFzc2VydCByb290ICE9IG51bGwKKyAgICAgICAgCisgICAgICAgIGR1bXAocm9vdCkKKworLyoKKwkJZGVmIGVsZW0xID0gcm9vdC5lbGVtMQorICAgICAgICBhc3NlcnQgZWxlbTEudmFsdWUoKSA6PSAnaGVsbG8xJworICAgICAgICAKKyAgICAgICAgZGVmIGVsZW0yID0gcm9vdC5lbGVtMgorICAgICAgICBhc3NlcnQgZWxlbTIudmFsdWUoKSA6PSAnaGVsbG8yJworCisgICAgICAgIGFzc2VydCByb290LmVsZW0xLnZhbHVlKCkgOj0gJ2hlbGxvMScKKyAgICAgICAgYXNzZXJ0IHJvb3QuZWxlbTIudmFsdWUoKSA6PSAnaGVsbG8yJworCisgICAgICAgIGFzc2VydCByb290Lm5lc3RlZEVsZW0uYXR0cmlidXRlcygpIDo9IFsneCc6J2FiYycsICd5JzonZGVmJ10gICAgICAgIAorICAgICAgICBhc3NlcnQgcm9vdC5uZXN0ZWRFbGVtLmNoaWxkLmF0dHJpYnV0ZXMoKSA6PSBbJ3onOidkZWYnXQorICAgICAgICBhc3NlcnQgcm9vdC5uZXN0ZWRFbGVtLmNoaWxkMi52YWx1ZSgpIDo9IFtdCisgICAgICAgIGFzc2VydCByb290Lm5lc3RlZEVsZW0uY2hpbGQyLnRleHQoKSA6PSAnJworCisgICAgICAgIGFzc2VydCByb290Lm5lc3RlZEVsZW0yLmF0dHJpYnV0ZXMoKSA6PSBbJ3onOid6enonXSAgICAgIAorICAgICAgICBhc3NlcnQgcm9vdC5uZXN0ZWRFbGVtMi5jaGlsZC5hdHRyaWJ1dGVzKCkgOj0gWyd6JzonZGVmJ10KKyAgICAgICAgYXNzZXJ0IHJvb3QubmVzdGVkRWxlbTIuY2hpbGQyLnZhbHVlKCkgOj0gJ2hlbGxvJworICAgICAgICBhc3NlcnQgcm9vdC5uZXN0ZWRFbGVtMi5jaGlsZDIudGV4dCgpIDo9ICdoZWxsbycKKyAgICAgICAgCisgICAgICAgIGRlZiBsaXN0ID0gcm9vdC52YWx1ZSgpCisgICAgICAgIGFzc2VydCBsaXN0LnNpemUoKSA6PSA0CisgICAgICAgIAorICAgICAgICBhc3NlcnQgcm9vdC5hdHRyaWJ1dGVzKCkuYSA6PSA1CisgICAgICAgIGFzc2VydCByb290LmF0dHJpYnV0ZXMoKS5iIDo9IDcKKworICAgICAgICBhc3NlcnQgcm9vdC5uZXN0ZWRFbGVtLmF0dHJpYnV0ZXMoKS54IDo9ICdhYmMnCisgICAgICAgIGFzc2VydCByb290Lm5lc3RlZEVsZW0uYXR0cmlidXRlcygpLnkgOj0gJ2RlZicKKyAgICAgICAgYXNzZXJ0IHJvb3QubmVzdGVkRWxlbTIuYXR0cmlidXRlcygpLnogOj0gJ3p6eicKKyAgICAgICAgYXNzZXJ0IHJvb3QubmVzdGVkRWxlbTIuY2hpbGQuYXR0cmlidXRlcygpLnogOj0gJ2RlZicKKyovICAgICAgICAKKyAgICAgICAgLyoqIEB0b2RvIHBhcnNlciBhZGQgLkAgYXMgYW4gb3BlcmF0aW9uCisgICAgICAgICAgICAgICAgYXNzZXJ0IHJvb3QuQGEgOj0gNQorICAgICAgICAgICAgICAgIGFzc2VydCByb290LkBiIDo9IDcKKyAgICAgICAgKi8gICAgICAgIAorICAgIH0KKyAgICAKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkveG1sL1htbFRlc3QuamF2YSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkveG1sL1htbFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWMxZmU5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS94bWwvWG1sVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgJElkJAorCisgQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQKKyB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIGNvcHlyaWdodAorICAgIHN0YXRlbWVudHMgYW5kIG5vdGljZXMuICBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYQorICAgIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KKworIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUKKyAgICBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCisgICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCisgICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworIDMuIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCisgICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLAorICAgIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLgorCisgNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIKKyAgICBub3IgbWF5ICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYSByZWdpc3RlcmVkCisgICAgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KKworIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtCisgICAgaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTCisgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECisgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTAorIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAqLworCitwYWNrYWdlIGdyb292eS54bWw7CisKK2ltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlPYmplY3Q7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbi5UZXN0U3VwcG9ydDsKKworLyoqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgWG1sVGVzdCBleHRlbmRzIFRlc3RTdXBwb3J0IHsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RUcmVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEdyb292eU9iamVjdCBvYmplY3QgPSBjb21waWxlKCJzcmMvdGVzdC9ncm9vdnkveG1sL1NtYWxsTmFtZXNwYWNlRE9NVGVzdC5ncm9vdnkiKTsKKyAgICAgICAgb2JqZWN0Lmludm9rZU1ldGhvZCgidGVzdFRyZWUiLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUU5hbWUgcW5hbWUgPSBuZXcgUU5hbWUoInVybjpteW5hbWVzcGFjZSIsICJsb2NhbFBhcnQiLCAieCIpOworCisgICAgICAgIGFzc2VydFRydWUocW5hbWUuZXF1YWxzKG5ldyBRTmFtZSgidXJuOm15bmFtZXNwYWNlIiwgImxvY2FsUGFydCIpKSk7CisgICAgICAgIGFzc2VydFRydWUocW5hbWUuZXF1YWxzKCJ1cm46bXluYW1lc3BhY2U6bG9jYWxQYXJ0IikpOworICAgICAgICBhc3NlcnRUcnVlKHFuYW1lLmVxdWFscygieDpsb2NhbFBhcnQiKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSghcW5hbWUuZXF1YWxzKG51bGwpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSghcW5hbWUuZXF1YWxzKCIiKSk7CisgICAgICAgIGFzc2VydFRydWUoIXFuYW1lLmVxdWFscygiICIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSghcW5hbWUuZXF1YWxzKCJsb2NhbFBhcnQiKSk7CisgICAgICAgIGFzc2VydFRydWUoIXFuYW1lLmVxdWFscygieDoiKSk7CisgICAgICAgIGFzc2VydFRydWUoIXFuYW1lLmVxdWFscygiOiIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSghcW5hbWUuZXF1YWxzKCI6bG9jYWxQYXJ0IikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkveG1sL2RvbS9ET01DYXRlZ29yeVRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS94bWwvZG9tL0RPTUNhdGVnb3J5VGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjliODA2NwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkveG1sL2RvbS9ET01DYXRlZ29yeVRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsNTMgQEAKK3BhY2thZ2UgZ3Jvb3Z5LnhtbC5kb20KKworaW1wb3J0IGdyb292eS54bWwuRE9NQnVpbGRlcgoraW1wb3J0IGdyb292eS54bWwuR3BhdGhTeW50YXhUZXN0U3VwcG9ydAoraW1wb3J0IGdyb292eS54bWwuVHJhdmVyc2FsVGVzdFN1cHBvcnQKK2ltcG9ydCBncm9vdnkueG1sLk1peGVkTWFya3VwVGVzdFN1cHBvcnQKKworY2xhc3MgRE9NQ2F0ZWdvcnlUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgZGVmIGdldFJvb3QgPSB7IHhtbCAtPgorICAgICAgICBkZWYgcmVhZGVyID0gbmV3IFN0cmluZ1JlYWRlcih4bWwpCisgICAgICAgIGRlZiBkb2MgICAgPSBET01CdWlsZGVyLnBhcnNlKHJlYWRlcikKKyAgICAgICAgZGVmIHJvb3QgICA9IGRvYy5kb2N1bWVudEVsZW1lbnQKKyAgICB9CisKKyAgICB2b2lkIHRlc3RNaXhlZE1hcmt1cCgpIHsKKyAgICAgICAgdXNlKERPTUNhdGVnb3J5KSB7CisgICAgICAgICAgICBNaXhlZE1hcmt1cFRlc3RTdXBwb3J0LmNoZWNrTWl4ZWRNYXJrdXAoZ2V0Um9vdCkKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgdGVzdEVsZW1lbnQoKSB7CisgICAgICAgIHVzZShET01DYXRlZ29yeSkgeworICAgICAgICAgICAgR3BhdGhTeW50YXhUZXN0U3VwcG9ydC5jaGVja0VsZW1lbnQoZ2V0Um9vdCkKKyAgICAgICAgICAgIEdwYXRoU3ludGF4VGVzdFN1cHBvcnQuY2hlY2tGaW5kRWxlbWVudChnZXRSb290KQorICAgICAgICAgICAgR3BhdGhTeW50YXhUZXN0U3VwcG9ydC5jaGVja0VsZW1lbnRUeXBlcyhnZXRSb290KQorICAgICAgICAgICAgR3BhdGhTeW50YXhUZXN0U3VwcG9ydC5jaGVja0VsZW1lbnRDbG9zdXJlSW50ZXJhY3Rpb24oZ2V0Um9vdCkKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgdGVzdEF0dHJpYnV0ZSgpIHsKKyAgICAgICAgdXNlKERPTUNhdGVnb3J5KSB7CisgICAgICAgICAgICBHcGF0aFN5bnRheFRlc3RTdXBwb3J0LmNoZWNrQXR0cmlidXRlKGdldFJvb3QpCisgICAgICAgICAgICBHcGF0aFN5bnRheFRlc3RTdXBwb3J0LmNoZWNrQXR0cmlidXRlcyhnZXRSb290KQorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCB0ZXN0TmF2aWdhdGlvbigpIHsKKyAgICAgICAgdXNlKERPTUNhdGVnb3J5KSB7CisgICAgICAgICAgICBHcGF0aFN5bnRheFRlc3RTdXBwb3J0LmNoZWNrQ2hpbGRyZW4oZ2V0Um9vdCkKKyAgICAgICAgICAgIEdwYXRoU3ludGF4VGVzdFN1cHBvcnQuY2hlY2tQYXJlbnQoZ2V0Um9vdCkKKyAgICAgICAgICAgIEdwYXRoU3ludGF4VGVzdFN1cHBvcnQuY2hlY2tOZXN0ZWRTaXplRXhwcmVzc2lvbnMoZ2V0Um9vdCkKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgdGVzdFRyYXZlcnNhbCgpIHsKKyAgICAgICAgdXNlKERPTUNhdGVnb3J5KSB7CisgICAgICAgICAgICBUcmF2ZXJzYWxUZXN0U3VwcG9ydC5jaGVja0RlcHRoRmlyc3QoZ2V0Um9vdCkKKyAgICAgICAgICAgIFRyYXZlcnNhbFRlc3RTdXBwb3J0LmNoZWNrQnJlYWR0aEZpcnN0KGdldFJvb3QpCisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9ncm9vdnkveG1sL2RvbS9ET01UZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9ncm9vdnkveG1sL2RvbS9ET01UZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjUzOTBiCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L2dyb292eS94bWwvZG9tL0RPTVRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsOTkgQEAKK3BhY2thZ2UgZ3Jvb3Z5LnhtbC5kb20KKworaW1wb3J0IGdyb292eS54bWwuKgoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMueG1sLioKKworY2xhc3MgRE9NVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKyAgICBkZWYgYmVuY2htYXJrID0gZmFsc2UKKworICAgIHZvaWQgdGVzdERPTVBhcnNlcigpIHsKKyAgICAgICAgZGVmIHhtbCA9IG5ldyBTdHJpbmdSZWFkZXIoIjxodG1sPjxoZWFkPjx0aXRsZSBjbGFzcz0nbXl0aXRsZSc+VGVzdDwvdGl0bGU+PC9oZWFkPjxib2R5PjxwIGNsYXNzPSdteXN0eWxlJz5UaGlzIGlzIGEgdGVzdC48L3A+PC9ib2R5PjwvaHRtbD4iKQorICAgICAgICBkZWYgZG9jID0gRE9NQnVpbGRlci5wYXJzZSh4bWwpCisgICAgICAgIGRlZiBodG1sID0gZG9jLmRvY3VtZW50RWxlbWVudAorICAgICAgICBpZiAoIWJlbmNobWFyaykgYXNzZXJ0Q29ycmVjdCBodG1sCisgICAgfQorCisgICAgdm9pZCB0ZXN0RE9NQnVpbGRlcigpIHsKKyAgICAgICAgZGVmIGh0bWwgPSBET01CdWlsZGVyLm5ld0luc3RhbmNlKCkuCisgICAgICAgIGh0bWwgeworICAgICAgICAgIGhlYWQgeworICAgICAgICAgICAgdGl0bGUgKGNsYXNzOiJteXRpdGxlIiwgIlRlc3QiKQorICAgICAgICAgIH0KKyAgICAgICAgICBib2R5IHsKKyAgICAgICAgICAgIHAgKGNsYXNzOiJteXN0eWxlIiwgIlRoaXMgaXMgYSB0ZXN0LiIpCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghYmVuY2htYXJrKSBhc3NlcnRDb3JyZWN0IGh0bWwKKyAgICB9CisKKyAgICB2b2lkIHRlc3RET01CdWlsZGVyV2l0aE51bGxWYWx1ZSgpIHsKKyAgICAgICAgZGVmIGh0bWwgPSBET01CdWlsZGVyLm5ld0luc3RhbmNlKCkuCisgICAgICAgIGh0bWwgeworICAgICAgICAgIGhlYWQgeworICAgICAgICAgICAgdGl0bGUgKHRlc3RBdHRyOm51bGwsICJUZXN0IikKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdXNlIChET01DYXRlZ29yeSkgeworICAgICAgICAgICAgYXNzZXJ0IGh0bWwuaGVhZC50aXRsZVswXS4nQHRlc3RBdHRyJyA9PSAnJworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCB0ZXN0U3RyZWFtaW5nRE9NQnVpbGRlcigpIHsKKyAgICAgICAgZGVmIGJ1aWxkZXIgPSBuZXcgU3RyZWFtaW5nRE9NQnVpbGRlcigpCisgICAgICAgIGRlZiBkb2MgPSBidWlsZGVyLmJpbmR7CisgICAgICAgICAgaHRtbCB7CisgICAgICAgICAgICBoZWFkIHsKKyAgICAgICAgICAgICAgdGl0bGUgKGNsYXNzOiJteXRpdGxlIiwgIlRlc3QiKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYm9keSB7CisgICAgICAgICAgICAgIHAgKGNsYXNzOiJteXN0eWxlIiwgIlRoaXMgaXMgYSB0ZXN0LiIpCisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIFRPRE8gcmUtZW5hYmxlIHRoaXMgdGVzdCBub3cgdGhhdCB4ZXJjZXMgaXMgZ29uZQorLy8gICAgICAgIGlmICghYmVuY2htYXJrKSBhc3NlcnRDb3JyZWN0IGRvYygpLmRvY3VtZW50RWxlbWVudAorICAgIH0KKworICAgIHByaXZhdGUgZGVmIGFzc2VydENvcnJlY3QoaHRtbCkgeworICAgICAgICB1c2UgKERPTUNhdGVnb3J5KSB7CisgICAgICAgICAgICBhc3NlcnQgaHRtbC5oZWFkLnRpdGxlLnRleHQoKSA9PSAnVGVzdCcsICJFeHBlY3RlZCAnVGVzdCcgYnV0IHdhczogJHtodG1sLmhlYWQudGl0bGVbMF0udGV4dCgpfSIKKyAgICAgICAgICAgIGFzc2VydCBodG1sLmJvZHkucFswXS50ZXh0KCkgPT0gJ1RoaXMgaXMgYSB0ZXN0LicKKyAgICAgICAgICAgIGFzc2VydCBodG1sLmZpbmQgeyBpdC50YWdOYW1lID09ICdib2R5JyB9LnRhZ05hbWUgPT0gJ2JvZHknCisgICAgICAgICAgICBhc3NlcnQgaHRtbC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnKicpLmZpbmRBbGx7IGl0LidAY2xhc3MnICE9ICcnIH0uc2l6ZSgpID09IDIKKyAgICAgICAgfQorICAgICAgICAvLyBzaG91bGQgZmFpbCBvdXRzaWRlIGNhdGVnb3J5CisgICAgICAgIHNob3VsZEZhaWwgKE1pc3NpbmdQcm9wZXJ0eUV4Y2VwdGlvbikgeyBodG1sLmhlYWQgfQorICAgIH0KKworICAgIHN0YXRpYyB2b2lkIG1haW4oYXJncykgeworICAgICAgICAvLyBSZWxhdGl2ZSByZXN1bHRzOgorICAgICAgICAvLyBXaGVuOiAgICAgIDA1IE1heSAyMDA0ICAxNCBPY3QgMjAwNiAgNCBNYXIgMjAwNworICAgICAgICAvLyBOb3RlczogICAgICAgICAgICAgICAgICBYZXJjZXMgMi40ICAgWGVyY2VzIDIuOAorICAgICAgICAvLyBQYXJzZXI6ICAgIDEuMCAgICAgICAgICAxLjAgICAgICAgICAgMS4wCisgICAgICAgIC8vIEJ1aWxkZXI6ICAgMS4wNSAgICAgICAgIDIuOTAgICAgICAgICAxLjIwCisgICAgICAgIC8vIFN0cmVhbWluZzogMC43NyAgICAgICAgIDAuMjAgICAgICAgICAwLjIwCisgICAgICAgIGRlZiB4ID0gYXJncy5zaXplKCkgPT0gMCA/IDEwMDAgOiBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbMF0pCisgICAgICAgIGRlZiBteWRvbXRlc3QgPSBuZXcgRE9NVGVzdCgpCisgICAgICAgIGRlZiBzdGFuZGFyZCA9IDAKKyAgICAgICAgbXlkb210ZXN0LmJlbmNobWFyayA9IHRydWUKKyAgICAgICAgW3sgbXlkb210ZXN0LnRlc3RET01QYXJzZXIoKSB9LAorICAgICAgICAgeyBteWRvbXRlc3QudGVzdERPTUJ1aWxkZXIoKSB9LAorICAgICAgICAgeyBteWRvbXRlc3QudGVzdFN0cmVhbWluZ0RPTUJ1aWxkZXIoKSB9XS5lYWNoV2l0aEluZGV4IHsgdGVzdE1ldGhvZCwgaW5kZXggLT4KKyAgICAgICAgICAgIC8vIFJ1biB0aGUgbWV0aG9kIG9uY2UgdG8gZmlsbCBhbnkgY2FjaGVzIGFuZCB0byBsb2FkIGNsYXNzZXMKKyAgICAgICAgICAgIHRlc3RNZXRob2QoKQorICAgICAgICAgICAgZGVmIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkKKyAgICAgICAgICAgIGRlZiBsYXN0SW5kZXgKKyAgICAgICAgICAgIGZvciAoaSBpbiAxLi54KSB7CisgICAgICAgICAgICAgICAgdGVzdE1ldGhvZCgpCisgICAgICAgICAgICAgICAgbGFzdEluZGV4ID0gaQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmIGVsYXBzZWQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0CisgICAgICAgICAgICBkZWYgcmVzdWx0ID0gbGFzdEluZGV4ICogMTAwMCAvIGVsYXBzZWQKKworICAgICAgICAgICAgc3RhbmRhcmQgPSAoc3RhbmRhcmQgPT0gMCA/IHJlc3VsdCA6IHN0YW5kYXJkKQorICAgICAgICAgICAgZGVmIGZhY3RvciA9IHJlc3VsdC9zdGFuZGFyZAorICAgICAgICAgICAgZGVmIHJlbGF0aXZlID0gMS9mYWN0b3IKKyAgICAgICAgICAgIHByaW50bG4gIiR7aW5kZXh9OiAke2ZhY3Rvcn14IHJlbGF0aXZlPSR7cmVsYXRpdmV9ICgke3Jlc3VsdH0gdHJlZXMvcykiCisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9hbnQvR3Jvb3Z5VGVzdC5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvYW50L0dyb292eVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWM2YmU0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvYW50L0dyb292eVRlc3QuamF2YQpAQCAtMCwwICsxLDExNSBAQAorcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudDsKKworaW1wb3J0IGdyb292eS5sYW5nLkdyb292eVJ1bnRpbWVFeGNlcHRpb247CitpbXBvcnQgZ3Jvb3Z5LnV0aWwuR3Jvb3Z5VGVzdENhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0SGVscGVyOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKKy8qKgorICogVW5pdCB0ZXN0cyBmb3IgdGhlIHtAbGluayBHcm9vdnl9IGFudCB0YXNrLgorICogQ2F1dGlvbjogdGhlICouZ3Jvb3Z5IGZpbGVzIHVzZWQgYnkgdGhpcyB0ZXN0IHNob3VsZCBub3QgZ2V0IGNvbXBpbGVkIHdpdGggdGhlIHJlc3Qgb2YgdGhlCisgKiB0ZXN0IGNsYXNzZXMgY29tcGlsYXRpb24gcHJvY2VzcyBvdGhlcndpc2UgdGhleSB3b3VsZCBiZSBhdmFpbGFibGUgaW4gdGhlIGNsYXNzcGF0aAorICogYW5kIHRoZSB0ZXN0cyBoZXJlIHdvdWxkIGJlIG1lYW5pbmdsZXNzICh0ZXN0ZWQgYnkgdGVzdENsYXNzcGF0aF9taXNzaW5nKS4KKyAqCisgKiBAYXV0aG9yIE1hcmMgR3VpbGxlbW90CisgKi8KK3B1YmxpYyBjbGFzcyBHcm9vdnlUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEZMQUcgPSBudWxsOworICAgIHByaXZhdGUgZmluYWwgRmlsZSBhbnRGaWxlID0gbmV3IEZpbGUoInNyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvYW50L0dyb292eVRlc3QueG1sIik7CisgICAgcHJpdmF0ZSBQcm9qZWN0IHByb2plY3Q7CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICBwcm9qZWN0ID0gbmV3IFByb2plY3QoKTsKKyAgICAgICAgcHJvamVjdC5pbml0KCk7CisgICAgICAgIFByb2plY3RIZWxwZXIuZ2V0UHJvamVjdEhlbHBlcigpLnBhcnNlKHByb2plY3QsIGFudEZpbGUpOworICAgICAgICBGTEFHID0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R3Jvb3Z5Q29kZVdpdGhpblRhZygpIHsKKyAgICAgICAgYXNzZXJ0TnVsbChGTEFHKTsKKyAgICAgICAgcHJvamVjdC5leGVjdXRlVGFyZ2V0KCJncm9vdnlDb2RlV2l0aGluVGFzayIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZyb20gZ3Jvb3Z5IGlubGluZWQgaW4gYW50IiwgRkxBRyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdyb292eUNvZGVFeHRlcm5hbEZpbGUoKSB7CisgICAgICAgIGFzc2VydE51bGwoRkxBRyk7CisgICAgICAgIHByb2plY3QuZXhlY3V0ZVRhcmdldCgiZ3Jvb3Z5Q29kZUluRXh0ZXJuYWxGaWxlIik7CisgICAgICAgIGFzc2VydEVxdWFscygiZnJvbSBncm9vdnkgZmlsZSBjYWxsZWQgZnJvbSBhbnQiLCBGTEFHKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R3Jvb3Z5Q29kZUluRXh0ZXJuYWxGaWxlV2l0aE90aGVyQ2xhc3MoKSB7CisgICAgICAgIGFzc2VydE51bGwoRkxBRyk7CisgICAgICAgIHByb2plY3QuZXhlY3V0ZVRhcmdldCgiZ3Jvb3Z5Q29kZUluRXh0ZXJuYWxGaWxlV2l0aE90aGVyQ2xhc3MiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmcm9tIEdyb292eVRlc3QyQ2xhc3MuZG9Tb21ldGhpbmcoKSIsIEZMQUcpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDbGFzc3BhdGhfbWlzc2luZygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByb2plY3QuZXhlY3V0ZVRhcmdldCgiZ3Jvb3Z5Q2xhc3NwYXRoX21pc3NpbmciKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhCdWlsZEV4Y2VwdGlvbi5jbGFzcywgZS5nZXRDbGFzcygpKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENsYXNzcGF0aF9jbGFzc3BhdGhBdHRyaWJ1dGUoKSB7CisgICAgICAgIGFzc2VydE51bGwoRkxBRyk7CisgICAgICAgIHByb2plY3QuZXhlY3V0ZVRhcmdldCgiZ3Jvb3Z5Q2xhc3NwYXRoX2NsYXNzcGF0aEF0dHJpYnV0ZSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZyb20gZ3Jvb3Z5dGVzdDMuR3Jvb3Z5VGVzdDNDbGFzcy5kb1NvbWV0aGluZygpIiwgRkxBRyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENsYXNzcGF0aF9jbGFzc3BhdGhyZWZBdHRyaWJ1dGUoKSB7CisgICAgICAgIGFzc2VydE51bGwoRkxBRyk7CisgICAgICAgIHByb2plY3QuZXhlY3V0ZVRhcmdldCgiZ3Jvb3Z5Q2xhc3NwYXRoX2NsYXNzcGF0aHJlZkF0dHJpYnV0ZSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZyb20gZ3Jvb3Z5dGVzdDMuR3Jvb3Z5VGVzdDNDbGFzcy5kb1NvbWV0aGluZygpIiwgRkxBRyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENsYXNzcGF0aF9uZXN0ZWRjbGFzc3BhdGgoKSB7CisgICAgICAgIGFzc2VydE51bGwoRkxBRyk7CisgICAgICAgIHByb2plY3QuZXhlY3V0ZVRhcmdldCgiZ3Jvb3Z5Q2xhc3NwYXRoX25lc3RlZENsYXNzcGF0aCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZyb20gZ3Jvb3Z5dGVzdDMuR3Jvb3Z5VGVzdDNDbGFzcy5kb1NvbWV0aGluZygpIiwgRkxBRyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdyb292eUFyZ1VzYWdlKCkgeworICAgICAgICBhc3NlcnROdWxsKEZMQUcpOworICAgICAgICBwcm9qZWN0LmV4ZWN1dGVUYXJnZXQoImdyb292eUFyZ1VzYWdlIik7CisgICAgICAgIGFzc2VydEVxdWFscygiZnJvbSBncm9vdnl0ZXN0My5Hcm9vdnlUZXN0M0NsYXNzLmRvU29tZXRoaW5nV2l0aEFyZ3MoKSAxIDIgMyIsIEZMQUcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhhdCBoZWxwZnVsICJmaWxlIG5hbWUiIGFwcGVhcnMgaW4gdGhlIHN0YWNrIHRyYWNlIGFuZCBub3QganVzdCAiU2NyaXB0MSIgCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEZpbGVOYW1lSW5TdGFja1RyYWNlKCkgeworICAgIAl0ZXN0RmlsZU5hbWVJblN0YWNrVHJhY2UoImdyb292eUVycm9yTXNnIiwgIlxcKGVtYmVkZGVkX3NjcmlwdF9pbl8uKkdyb292eVRlc3QueG1sIik7CisgICAgCXRlc3RGaWxlTmFtZUluU3RhY2tUcmFjZSgiZ3Jvb3Z5RXJyb3JNc2dfRXh0ZXJuYWxGaWxlIiwgIkdyb292eVRlc3RfZXJyb3JNZXNzYWdlLmdyb292eSIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0RmlsZU5hbWVJblN0YWNrVHJhY2UoZmluYWwgU3RyaW5nIHRhcmdldCwgZmluYWwgU3RyaW5nIGZpbGVOYW1lUGF0dGVybikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJvamVjdC5leGVjdXRlVGFyZ2V0KHRhcmdldCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKGZpbmFsIEJ1aWxkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhCdWlsZEV4Y2VwdGlvbi5jbGFzcywgZS5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgIGZpbmFsIFRocm93YWJsZSBjYXVzZSA9IGUuZ2V0Q2F1c2UoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoY2F1c2UgaW5zdGFuY2VvZiBHcm9vdnlSdW50aW1lRXhjZXB0aW9uKTsKKworICAgICAgICAgICAgZmluYWwgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICAgICAgY2F1c2UucHJpbnRTdGFja1RyYWNlKG5ldyBQcmludFdyaXRlcihzdykpOworICAgICAgICAgICAgCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc3RhY2tUcmFjZSA9IHN3LnRvU3RyaW5nKCk7CisgICAgICAgICAgICBmaW5hbCBQYXR0ZXJuIHBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoZmlsZU5hbWVQYXR0ZXJuKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkRvZXMgPiIgKyBzdGFja1RyYWNlICsgIjwgY29udGFpbiA+IiArIGZpbGVOYW1lUGF0dGVybiArICI8PyIsIAorICAgICAgICAgICAgCQlwYXR0ZXJuLm1hdGNoZXIoc3RhY2tUcmFjZSkuZmluZCgpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudC9Hcm9vdnlUZXN0LnhtbCBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudC9Hcm9vdnlUZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGQ2YWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvYW50L0dyb292eVRlc3QueG1sCkBAIC0wLDAgKzEsODEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8+CisKKzxwcm9qZWN0IG5hbWU9InRlc3QtZ3Jvb3Z5LXRhc2siIGRlZmF1bHQ9Imdyb292eUNvZGVXaXRoaW5UYXNrIiBiYXNlZGlyPSIuIj4KKworICAgIDx0YXJnZXQgbmFtZT0iZ3Jvb3Z5Q29kZVdpdGhpblRhc2siIGRlcGVuZHM9ImRlZmluZVRhc2siPgorICAgICAgICA8Z3Jvb3Z5PgorICAgICAgICAgICAgb3JnLmNvZGVoYXVzLmdyb292eS5hbnQuR3Jvb3Z5VGVzdC5GTEFHID0gImZyb20gZ3Jvb3Z5IGlubGluZWQgaW4gYW50IgorICAgICAgICA8L2dyb292eT4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iZ3Jvb3Z5Q29kZUluRXh0ZXJuYWxGaWxlIiBkZXBlbmRzPSJkZWZpbmVUYXNrIj4KKyAgICAgICAgPGdyb292eSBzcmM9Ikdyb292eVRlc3QxLmdyb292eSIvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJncm9vdnlDb2RlSW5FeHRlcm5hbEZpbGVXaXRoT3RoZXJDbGFzcyIgZGVwZW5kcz0iZGVmaW5lVGFzayI+CisgICAgICAgIDxncm9vdnkgc3JjPSJHcm9vdnlUZXN0Mi5ncm9vdnkiLz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iZ3Jvb3Z5Q2xhc3NwYXRoX21pc3NpbmciIGRlcGVuZHM9ImRlZmluZVRhc2siIGRlc2NyaXB0aW9uPSJzaG91bGQgZmFpbCEiPgorICAgICAgICA8Z3Jvb3Z5PgorICAgICAgICAgICAgZGVmIGZvbyA9IG5ldyBHcm9vdnlUZXN0M0NsYXNzKCkKKyAgICAgICAgICAgIGZvby5kb1NvbWV0aGluZygpCisgICAgICAgIDwvZ3Jvb3Z5PgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJncm9vdnlDbGFzc3BhdGhfY2xhc3NwYXRoQXR0cmlidXRlIiBkZXBlbmRzPSJkZWZpbmVUYXNrIj4KKyAgICAgICAgPGdyb292eSBjbGFzc3BhdGg9Imdyb292eXRlc3QzIj4KKyAgICAgICAgICAgIGRlZiBmb28gPSBuZXcgR3Jvb3Z5VGVzdDNDbGFzcygpCisgICAgICAgICAgICBmb28uZG9Tb21ldGhpbmcoKQorICAgICAgICA8L2dyb292eT4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iZ3Jvb3Z5Q2xhc3NwYXRoX2NsYXNzcGF0aHJlZkF0dHJpYnV0ZSIgZGVwZW5kcz0iZGVmaW5lVGFzayI+CisgICAgICAgIDxwYXRoIGlkPSJteUNsYXNzcGF0aFJlZiI+CisgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249Imdyb292eXRlc3QzIi8+CisgICAgICAgIDwvcGF0aD4KKworICAgICAgICA8Z3Jvb3Z5IGNsYXNzcGF0aHJlZj0ibXlDbGFzc3BhdGhSZWYiPgorICAgICAgICAgICAgZGVmIGZvbyA9IG5ldyBHcm9vdnlUZXN0M0NsYXNzKCkKKyAgICAgICAgICAgIGZvby5kb1NvbWV0aGluZygpCisgICAgICAgIDwvZ3Jvb3Z5PgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJncm9vdnlDbGFzc3BhdGhfbmVzdGVkQ2xhc3NwYXRoIiBkZXBlbmRzPSJkZWZpbmVUYXNrIj4KKyAgICAgICAgPGdyb292eSBjbGFzc3BhdGhyZWY9Im15Q2xhc3NwYXRoUmVmIj4KKyAgICAgICAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJncm9vdnl0ZXN0MyIvPgorICAgICAgICAgICAgPC9jbGFzc3BhdGg+CisgICAgICAgICAgICBkZWYgZm9vID0gbmV3IEdyb292eVRlc3QzQ2xhc3MoKQorICAgICAgICAgICAgZm9vLmRvU29tZXRoaW5nKCkKKyAgICAgICAgPC9ncm9vdnk+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9Imdyb292eUFyZ1VzYWdlIiBkZXBlbmRzPSJkZWZpbmVUYXNrIj4KKyAgICAgICAgPGdyb292eSBjbGFzc3BhdGg9Imdyb292eXRlc3QzIj4KKyAgICAgICAgICAgIDxhcmcgbGluZT0iMSAyIDMiLz4KKyAgICAgICAgICAgIGRlZiBmb28gPSBuZXcgR3Jvb3Z5VGVzdDNDbGFzcygpCisgICAgICAgICAgICBmb28uZG9Tb21ldGhpbmdXaXRoQXJncyhhcmdzKQorICAgICAgICA8L2dyb292eT4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iZ3Jvb3Z5RXJyb3JNc2ciIGRlcGVuZHM9ImRlZmluZVRhc2siPgorICAgICAgICA8Z3Jvb3Z5PgorICAgICAgICAJLy8gc2hvdWxkIHByb2R1Y2UgYW4gZXJyb3IgbWVzc2FnZQorCisgICAgICAgIAlkZWYgZiA9IHsKKyAgICAgICAgCQl0Lm5vdEV4aXN0aW5nKCkKKyAgICAgICAgCX0KKworICAgICAgICAJZigpCisgICAgICAgIDwvZ3Jvb3Z5PgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJncm9vdnlFcnJvck1zZ19FeHRlcm5hbEZpbGUiIGRlcGVuZHM9ImRlZmluZVRhc2siPgorICAgICAgICA8Z3Jvb3Z5IHNyYz0iR3Jvb3Z5VGVzdF9lcnJvck1lc3NhZ2UuZ3Jvb3Z5Ii8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImRlZmluZVRhc2siPgorICAgICAgICA8dGFza2RlZiBuYW1lPSJncm9vdnkiIGNsYXNzbmFtZT0ib3JnLmNvZGVoYXVzLmdyb292eS5hbnQuR3Jvb3Z5Ii8+CisgICAgPC90YXJnZXQ+Cis8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvYW50L0dyb292eVRlc3QxLmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudC9Hcm9vdnlUZXN0MS5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY5Y2RlYgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudC9Hcm9vdnlUZXN0MS5ncm9vdnkKQEAgLTAsMCArMSwyIEBACisKK29yZy5jb2RlaGF1cy5ncm9vdnkuYW50Lkdyb292eVRlc3QuRkxBRyA9ICJmcm9tIGdyb292eSBmaWxlIGNhbGxlZCBmcm9tIGFudCIKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudC9Hcm9vdnlUZXN0Mi5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9hbnQvR3Jvb3Z5VGVzdDIuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNTgxNTAKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9hbnQvR3Jvb3Z5VGVzdDIuZ3Jvb3Z5CkBAIC0wLDAgKzEsMyBAQAorCitkZWYgZm9vID0gbmV3IEdyb292eVRlc3QyQ2xhc3MoKQorZm9vLmRvU29tZXRoaW5nKCkKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudC9Hcm9vdnlUZXN0MkNsYXNzLmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudC9Hcm9vdnlUZXN0MkNsYXNzLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWQ5NTM3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvYW50L0dyb292eVRlc3QyQ2xhc3MuZ3Jvb3Z5CkBAIC0wLDAgKzEsOSBAQAorCitjbGFzcyBHcm9vdnlUZXN0MkNsYXNzCit7CisKKwl2b2lkIGRvU29tZXRoaW5nKCkKKwl7CisJCW9yZy5jb2RlaGF1cy5ncm9vdnkuYW50Lkdyb292eVRlc3QuRkxBRyA9ICJmcm9tIEdyb292eVRlc3QyQ2xhc3MuZG9Tb21ldGhpbmcoKSIKKwl9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9hbnQvR3Jvb3Z5VGVzdF9lcnJvck1lc3NhZ2UuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvYW50L0dyb292eVRlc3RfZXJyb3JNZXNzYWdlLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWQwNjc2Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvYW50L0dyb292eVRlc3RfZXJyb3JNZXNzYWdlLmdyb292eQpAQCAtMCwwICsxLDcgQEAKKy8vIHNob3VsZCBwcm9kdWNlIGFuIGVycm9yIG1lc3NhZ2UKKworZGVmIGYgPSB7CisJdC5ub3RFeGlzdGluZygpCit9CisKK2YoKQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvYW50L2dyb292eXRlc3QzL0dyb292eVRlc3QzQ2xhc3MuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvYW50L2dyb292eXRlc3QzL0dyb292eVRlc3QzQ2xhc3MuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NTNlNzQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9hbnQvZ3Jvb3Z5dGVzdDMvR3Jvb3Z5VGVzdDNDbGFzcy5ncm9vdnkKQEAgLTAsMCArMSwxMyBAQAorCitjbGFzcyBHcm9vdnlUZXN0M0NsYXNzCit7CisJdm9pZCBkb1NvbWV0aGluZygpCisJeworCQlvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudC5Hcm9vdnlUZXN0LkZMQUcgPSAiZnJvbSBncm9vdnl0ZXN0My5Hcm9vdnlUZXN0M0NsYXNzLmRvU29tZXRoaW5nKCkiCisJfQorCisJdm9pZCBkb1NvbWV0aGluZ1dpdGhBcmdzKGFyZ3MpCisJeworCQlvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudC5Hcm9vdnlUZXN0LkZMQUcgPSAiZnJvbSBncm9vdnl0ZXN0My5Hcm9vdnlUZXN0M0NsYXNzLmRvU29tZXRoaW5nV2l0aEFyZ3MoKSAiICsgYXJncy5qb2luKCIgIikKKwl9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci9Bbm5vdGF0aW9uU291cmNlUGFyc2luZ1Rlc3QuamF2YSBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudGxyL0Fubm90YXRpb25Tb3VyY2VQYXJzaW5nVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkZDg5NTYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci9Bbm5vdGF0aW9uU291cmNlUGFyc2luZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDI3IEBACitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50bHI7DQorDQoraW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOw0KKw0KKy8qKg0KKyAqIFBhcnNpbmcgYW5ub3RhdGlvbnMuDQorICogDQorICogQGF1dGhvciA8YSBocmVmPSdtYWlsdG86dGhlW2RvdF1taW5kc3Rvcm1bYXRdZ21haWxbZG90XWNvbSc+QWxleCBQb3Blc2N1PC9hPg0KKyAqLw0KK3B1YmxpYyBjbGFzcyBBbm5vdGF0aW9uU291cmNlUGFyc2luZ1Rlc3QgZXh0ZW5kcyBTb3VyY2VQYXJzZXJUZXN0IHsNCisgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aUxpbmVBdHRyaWJ1dGVzKCkgew0KKyAgICBTdHJpbmdSZWFkZXIgcmVhZGVyID0gbmV3IFN0cmluZ1JlYWRlcigNCisgICAgICAgICAgICAiY2xhc3MgT3RoZXJTZWN0aW9uXG4iDQorICAgICAgICArICAgIntcbiIgDQorICAgICAgICArCQkiICAgIEBDb2xsZWN0aW9uT2ZFbGVtZW50c1xuIiANCisgICAgICAgICsJCSIgICAgQEpvaW5UYWJsZVxuIiANCisgICAgICAgICsgCSIgICAgKFxuIiANCisgICAgICAgICsJCSIgICAgICAgIHRhYmxlPUBUYWJsZShuYW1lPVwiZ2FnYVwiKSxcbiIgDQorICAgICAgICArCQkiICAgICAgICBqb2luQ29sdW1ucyA9IEBKb2luQ29sdW1uKG5hbWU9XCJCb3lJZFwiKVxuIiANCisgICAgICAgICsJCSIgICAgKVxuIiANCisgICAgICAgICsJCSIgICAgQENvbHVtbihuYW1lPVwiZmF2b3JpdGVwb3Vwb25cIiwgXG4iIA0KKyAgICAgICAgKyAgICAgICAJCSAgICAibnVsbGFibGU9ZmFsc2UpXG4iIA0KKyAgICAgICAgKwkJIiAgICBTZXQ8U3RyaW5nPiBxdWVzdGlvbnMgPSBuZXcgSGFzaFNldDxTdHJpbmc+ICgpXG5cbiIgDQorICAgICAgICArCQkifSIpOw0KKyAgICBwYXJzZSgidGVzdE11bHRpTGluZUF0dHJpYnV0ZXMiLCByZWFkZXIpOw0KKyAgfQ0KK30NCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci9FbnVtU291cmNlUGFyc2luZ1Rlc3QuamF2YSBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudGxyL0VudW1Tb3VyY2VQYXJzaW5nVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MzEyNjkKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci9FbnVtU291cmNlUGFyc2luZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDExMSBAQAorcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudGxyOw0KKw0KK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsNCisNCisNCisvKioNCisgKiBQYXJzZXIgdGVzdHMgZm9yIEVudW0gZGVmaW5pdGlvbnMuDQorICoNCisgKiBAYXV0aG9yIDxhIGhyZWY9J21haWx0bzp0aGVbZG90XW1pbmRzdG9ybVthdF1nbWFpbFtkb3RdY29tJz5BbGV4IFBvcGVzY3U8L2E+DQorICovDQorcHVibGljIGNsYXNzIEVudW1Tb3VyY2VQYXJzaW5nVGVzdCBleHRlbmRzIFNvdXJjZVBhcnNlclRlc3Qgew0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VFbnVtQ29uc3RhbnRzKCkgew0KKyAgICAgICAgU3RyaW5nUmVhZGVyIHJlYWRlciA9IG5ldyBTdHJpbmdSZWFkZXIoDQorICAgICAgICAgICAgICAgICJlbnVtIE9uZSB7XG4iDQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiICBPTkUsIFRXTywgVEhSRUVcbiINCisgICAgICAgICAgICAgICAgICAgICAgICArICJ9Iik7DQorICAgICAgICBwYXJzZSgidGVzdFBhcnNlRW51bUNvbnN0YW50cyIsIHJlYWRlcik7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgdGVzdFBhcnNlRW51bU11bHRpTGluZSgpIHsNCisgICAgICBTdHJpbmdSZWFkZXIgcmVhZGVyID0gbmV3IFN0cmluZ1JlYWRlcigNCisgICAgICAgICAgImVudW0gUGFyc2VDb2RlXG4iICsNCisgICAgICAgICAgIntcbiIgKw0KKyAgICAgICAgICAiICAgIENPTVBMRVRFLFxuIiArDQorICAgICAgICAgICIgICAgSU5DT01QTEVURSxcbiIgKw0KKyAgICAgICAgICAiICAgIEVSUk9SXG4iICsNCisgICAgICAgICAgIn0iKTsNCisgICAgICBwYXJzZSgidGVzdFBhcnNlRW51bU11bHRpTGluZSIsIHJlYWRlcik7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZUVudW1JbXBsZW1lbnRzTXVsdGlMaW5lKCkgew0KKyAgICAgICAgU3RyaW5nUmVhZGVyIHJlYWRlciA9IG5ldyBTdHJpbmdSZWFkZXIoDQorICAgICAgICAgICAgImVudW0gUGFyc2VDb2RlIGltcGxlbWVudHMgSVxuIiArDQorICAgICAgICAgICAgIntcbiIgKw0KKyAgICAgICAgICAgICIgICAgQ09NUExFVEUsXG4iICsNCisgICAgICAgICAgICAiICAgIElOQ09NUExFVEUsXG4iICsNCisgICAgICAgICAgICAiICAgIEVSUk9SXG4iICsNCisgICAgICAgICAgICAifSIpOw0KKyAgICAgICAgcGFyc2UoInRlc3RQYXJzZUVudW1JbXBsZW1lbnRzTXVsdGlMaW5lIiwgcmVhZGVyKTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHZvaWQgdGVzdFBhcnNlRW51bUltcGxlbWVudHNNdWx0aUxpbmUyKCkgew0KKyAgICAgICAgU3RyaW5nUmVhZGVyIHJlYWRlciA9IG5ldyBTdHJpbmdSZWFkZXIoDQorICAgICAgICAgICAgImVudW0gUGFyc2VDb2RlXG4iICsNCisgICAgICAgICAgICAiaW1wbGVtZW50cyBJXG4iICsNCisgICAgICAgICAgICAie1xuIiArDQorICAgICAgICAgICAgIiAgICBDT01QTEVURSxcbiIgKw0KKyAgICAgICAgICAgICIgICAgSU5DT01QTEVURSxcbiIgKw0KKyAgICAgICAgICAgICIgICAgRVJST1JcbiIgKw0KKyAgICAgICAgICAgICJ9Iik7DQorICAgICAgICBwYXJzZSgidGVzdFBhcnNlRW51bUltcGxlbWVudHNNdWx0aUxpbmUyIiwgcmVhZGVyKTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHZvaWQgdGVzdFBhcnNlRW51bUNvbnN0YW50c09uZUxpbmVyKCkgew0KKyAgICAgICAgU3RyaW5nUmVhZGVyIHJlYWRlciA9IG5ldyBTdHJpbmdSZWFkZXIoDQorICAgICAgICAgICAgICAgICJlbnVtIE9uZSB7IE9ORSwgVFdPLCBUSFJFRSB9Iik7DQorICAgICAgICBwYXJzZSgidGVzdFBhcnNlRW51bUNvbnN0YW50c09uZUxpbmVyIiwgcmVhZGVyKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VFbnVtSW1wbGVtZW50cygpIHsNCisgICAgICAgIFN0cmluZ1JlYWRlciByZWFkZXIgPSBuZXcgU3RyaW5nUmVhZGVyKA0KKyAgICAgICAgICAgICAgICAiZW51bSBUd28gaW1wbGVtZW50cyBJMSB7XG4iDQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiT05FLCBUV08sIFRIUkVFXG4iDQorICAgICAgICAgICAgICAgICAgICAgICAgKyAifSIpOw0KKyAgICAgICAgcGFyc2UoInRlc3RQYXJzZUVudW1JbXBsZW1lbnRzIiwgcmVhZGVyKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VFbnVtV2l0aFZhbHVlcygpIHsNCisgICAgICAgIFN0cmluZ1JlYWRlciByZWFkZXIgPSBuZXcgU3RyaW5nUmVhZGVyKA0KKyAgICAgICAgICAgICAgICAiZW51bSBUaHJlZTEge1xuIg0KKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiAgICBPTkUoMSksIFRXTygyKVxuXG4iDQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiICAgIFRocmVlMSh2YWwpIHtcbiINCisgICAgICAgICAgICAgICAgICAgICAgICArICIgICAgICAgIHZhbHVlID0gdmFsXG4iDQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiICAgIH1cblxuIg0KKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiAgICBwcml2YXRlIGZpbmFsIGludCB2YWx1ZSINCisgICAgICAgICAgICAgICAgICAgICAgICArICJ9Iik7DQorICAgICAgICBwYXJzZSgidGVzdFBhcnNlRW51bVdpdGhWYWx1ZXMiLCByZWFkZXIpOw0KKw0KKyAgICAgICAgcmVhZGVyID0gbmV3IFN0cmluZ1JlYWRlcigNCisgICAgICAgICAgICAgICAgImVudW0gVGhyZWUxIHtcbiINCisgICAgICAgICAgICAgICAgICAgICAgICArICIgICAgQEFubm90YXRpb24gT05FKDEpLCBUV08oMilcblxuIg0KKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiAgICBUaHJlZTEodmFsKSB7XG4iDQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiICAgICAgICB2YWx1ZSA9IHZhbFxuIg0KKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiAgICB9XG5cbiINCisgICAgICAgICAgICAgICAgICAgICAgICArICIgICAgcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWUiDQorICAgICAgICAgICAgICAgICAgICAgICAgKyAifSIpOw0KKyAgICAgICAgcGFyc2UoInRlc3RQYXJzZUVudW1XaXRoVmFsdWVzMiIsIHJlYWRlcik7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgdGVzdFBhcnNlRW51bVdpdGhNZXRob2REZWZpbml0aW9ucygpIHsNCisgICAgICAgIFN0cmluZ1JlYWRlciByZWFkZXIgPSBuZXcgU3RyaW5nUmVhZGVyKA0KKyAgICAgICAgICAgICAgICAiZW51bSBGb3VyIHtcbiINCisgICAgICAgICAgICAgICAgICAgICAgICArICIgICAgT05FLCBUV08sIFRIUkVFXG5cbiINCisgICAgICAgICAgICAgICAgICAgICAgICArICIgICAgZGVmIHNvbWVNZXRob2QoKSB7IH1cbiINCisgICAgICAgICAgICAgICAgICAgICAgICArICIgICAgcHVibGljIG0yKGFyZ3MpIHsgfVxuIg0KKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiAgICBpbnQgbTMoU3RyaW5nIGFyZykgeyB9XG4iDQorICAgICAgICAgICAgICAgICAgICAgICAgKyAifSIpOw0KKyAgICAgICAgcGFyc2UoInRlc3RQYXJzZUVudW1XaXRoTWV0aG9kRGVmaW5pdGlvbnMiLCByZWFkZXIpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZUNvbXBsZXRlRW51bSgpIHsNCisgICAgICAgIFN0cmluZ1JlYWRlciByZWFkZXIgPSBuZXcgU3RyaW5nUmVhZGVyKA0KKyAgICAgICAgICAgICAgICAiZW51bSBGaXZlIHtcbiINCisgICAgICAgICAgICAgICAgICAgICAgICArICIgICAgT05FIHsgZG91YmxlIGV2YWwoaW50IHYpIHsgcmV0dXJuIChkb3VibGUpIHYgfSB9LCBcbiINCisgICAgICAgICAgICAgICAgICAgICAgICArICIgICAgVFdPIHtcbiINCisgICAgICAgICAgICAgICAgICAgICAgICArICIgICAgICAgIGRvdWJsZSBldmFsKGludCB2KSB7IHJldHVybiAoZG91YmxlKSB2ICsgMSB9XG4iDQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiICAgIH0sIFRIUkVFXG4iDQorICAgICAgICAgICAgICAgICAgICAgICAgKyAifSIpOw0KKyAgICAgICAgcGFyc2UoInRlc3RQYXJzZUNvbXBsZXRlRW51bSIsIHJlYWRlcik7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvR3Jvb3Z5U291cmNlQVNUVGVzdC5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvR3Jvb3Z5U291cmNlQVNUVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ODVjNDIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci9Hcm9vdnlTb3VyY2VBU1RUZXN0LmphdmEKQEAgLTAsMCArMSwzMSBAQAorcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudGxyOworCitpbXBvcnQgZ3Jvb3Z5LnV0aWwuR3Jvb3Z5VGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBHcm9vdnlTb3VyY2VBU1RUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworICAgIEdyb292eVNvdXJjZUFTVCBhOworICAgIEdyb292eVNvdXJjZUFTVCBiOworCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYSA9IG5ldyBHcm9vdnlTb3VyY2VBU1QoKTsKKyAgICAgICAgYS5zZXRMaW5lKDMpOworICAgICAgICBhLnNldENvbHVtbigzKTsKKworICAgICAgICBiID0gbmV3IEdyb292eVNvdXJjZUFTVCgpOworICAgICAgICBiLnNldExpbmUoNCk7CisgICAgICAgIGIuc2V0Q29sdW1uKDIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMZXNzVGhhbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRUcnVlKGEuY29tcGFyZVRvKGIpIDwgMCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEVxdWFsaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydFRydWUoYS5lcXVhbHMoYSkpOworICAgICAgICBhc3NlcnRUcnVlKGEuY29tcGFyZVRvKGEpID09IDApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHcmVhdGVyVGhhbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRUcnVlKGIuY29tcGFyZVRvKGEpID4gMCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvU291cmNlQnVmZmVyVGVzdC5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvU291cmNlQnVmZmVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNDA3YjQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci9Tb3VyY2VCdWZmZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgJElkJAorCisgQ29weXJpZ2h0IDIwMDUgKEMpIEplcmVteSBSYXluZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAorIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0CisgICAgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhCisgICAgY29weSBvZiB0aGlzIGRvY3VtZW50LgorCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQorICAgIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKKyAgICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKKyAgICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCisgICAgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCisKKyA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IgorICAgIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQKKyAgICB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgorCisgNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KKyAgICBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMKKyBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKKyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCisgVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5hbnRscjsKKworaW1wb3J0IGdyb292eS51dGlsLkdyb292eVRlc3RDYXNlOworCitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7CisKKy8qKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Z3Jvb3Z5QHJvc3MtcmF5bmVyLmNvbSI+SmVyZW15IFJheW5lcjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIFNvdXJjZUJ1ZmZlclRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlCdWZmZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU291cmNlQnVmZmVyIGJ1ZmZlciA9IGdldFNvdXJjZUJ1ZmZlcigiIik7CisgICAgICAgIGFzc2VydE51bGwoYnVmZmVyLmdldFNuaXBwZXQobmV3IExpbmVDb2x1bW4oMSwgMSksIG5ldyBMaW5lQ29sdW1uKDEsIDEpKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZVVzYWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFNvdXJjZUJ1ZmZlciBidWZmZXIgPSBnZXRTb3VyY2VCdWZmZXIoInByaW50bG4gJ2hlbGxvIHdvcmxkJyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImhlbGxvIiwgYnVmZmVyLmdldFNuaXBwZXQobmV3IExpbmVDb2x1bW4oMSwgMTApLCBuZXcgTGluZUNvbHVtbigxLCAxNSkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VW5peExpbmVVc2FnZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgZW5kT2ZMaW5lID0gIlxuIjsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNyYyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgc3JjLmFwcGVuZCgicHJpbnRsbiAnaGVsbG8gd29ybGQnIikuYXBwZW5kKGVuZE9mTGluZSk7CisgICAgICAgIHNyYy5hcHBlbmQoInByaW50bG4gJ29oIG5vdCwgbm90IHRoYXQgYWdhaW4nIikuYXBwZW5kKGVuZE9mTGluZSk7CisgICAgICAgIFNvdXJjZUJ1ZmZlciBidWZmZXIgPSBnZXRTb3VyY2VCdWZmZXIoc3JjLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImhlbGxvIiwgYnVmZmVyLmdldFNuaXBwZXQobmV3IExpbmVDb2x1bW4oMSwgMTApLCBuZXcgTGluZUNvbHVtbigxLCAxNSkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3b3JsZCciICsgZW5kT2ZMaW5lICsgInByaW50IiwgYnVmZmVyLmdldFNuaXBwZXQobmV3IExpbmVDb2x1bW4oMSwgMTYpLCBuZXcgTGluZUNvbHVtbigyLCA2KSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZW5kT2ZMaW5lLCBidWZmZXIuZ2V0U25pcHBldChuZXcgTGluZUNvbHVtbigxLCAyMiksIG5ldyBMaW5lQ29sdW1uKDEsIDIzKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZW5kT2ZMaW5lLCBidWZmZXIuZ2V0U25pcHBldChuZXcgTGluZUNvbHVtbigyLCAzMyksIG5ldyBMaW5lQ29sdW1uKDIsIDM0KSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RET1NMaW5lVXNhZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGVuZE9mTGluZSA9ICJcclxuIjsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNyYyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgc3JjLmFwcGVuZCgicHJpbnRsbiAnaGVsbG8gd29ybGQnIikuYXBwZW5kKGVuZE9mTGluZSk7CisgICAgICAgIHNyYy5hcHBlbmQoInByaW50bG4gJ29oIG5vdCwgbm90IHRoYXQgYWdhaW4nIikuYXBwZW5kKGVuZE9mTGluZSk7CisgICAgICAgIFNvdXJjZUJ1ZmZlciBidWZmZXIgPSBnZXRTb3VyY2VCdWZmZXIoc3JjLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImhlbGxvIiwgYnVmZmVyLmdldFNuaXBwZXQobmV3IExpbmVDb2x1bW4oMSwgMTApLCBuZXcgTGluZUNvbHVtbigxLCAxNSkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJvaCBub3QiLCBidWZmZXIuZ2V0U25pcHBldChuZXcgTGluZUNvbHVtbigyLCAxMCksIG5ldyBMaW5lQ29sdW1uKDIsIDE2KSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIndvcmxkJyIgKyBlbmRPZkxpbmUgKyAicHJpbnQiLCBidWZmZXIuZ2V0U25pcHBldChuZXcgTGluZUNvbHVtbigxLCAxNiksIG5ldyBMaW5lQ29sdW1uKDIsIDYpKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhlbmRPZkxpbmUsIGJ1ZmZlci5nZXRTbmlwcGV0KG5ldyBMaW5lQ29sdW1uKDEsIDIyKSwgbmV3IExpbmVDb2x1bW4oMSwgMjQpKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhlbmRPZkxpbmUsIGJ1ZmZlci5nZXRTbmlwcGV0KG5ldyBMaW5lQ29sdW1uKDIsIDMzKSwgbmV3IExpbmVDb2x1bW4oMiwgMzUpKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE91dE9mQm91bmRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBlbmRPZkxpbmUgPSAiXG4iOworICAgICAgICBTdHJpbmdCdWZmZXIgc3JjID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBzcmMuYXBwZW5kKCJwcmludGxuICdoZWxsbyB3b3JsZCciKS5hcHBlbmQoZW5kT2ZMaW5lKTsKKyAgICAgICAgc3JjLmFwcGVuZCgicHJpbnRsbiAnb2ggbm90LCBub3QgdGhhdCBhZ2FpbiciKS5hcHBlbmQoZW5kT2ZMaW5lKTsKKyAgICAgICAgU291cmNlQnVmZmVyIGJ1ZmZlciA9IGdldFNvdXJjZUJ1ZmZlcihzcmMudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygicHJpbnRsbiIsIGJ1ZmZlci5nZXRTbmlwcGV0KG5ldyBMaW5lQ29sdW1uKDAsIDApLCBuZXcgTGluZUNvbHVtbigxLCA4KSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInByaW50bG4iLCBidWZmZXIuZ2V0U25pcHBldChuZXcgTGluZUNvbHVtbigtMTAsIC0xKSwgbmV3IExpbmVDb2x1bW4oMSwgOCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGVuZE9mTGluZSwgYnVmZmVyLmdldFNuaXBwZXQobmV3IExpbmVDb2x1bW4oMiwgMzMpLCBuZXcgTGluZUNvbHVtbigyLCA0MCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBidWZmZXIuZ2V0U25pcHBldChuZXcgTGluZUNvbHVtbigzLCAzMyksIG5ldyBMaW5lQ29sdW1uKDYsIDQwKSkpOworICAgIH0KKworICAgIHByaXZhdGUgU291cmNlQnVmZmVyIGdldFNvdXJjZUJ1ZmZlcihTdHJpbmcgdGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFNvdXJjZUJ1ZmZlciBidWZmZXIgPSBuZXcgU291cmNlQnVmZmVyKCk7CisgICAgICAgIFJlYWRlciByZWFkZXIgPSBuZXcgVW5pY29kZUVzY2FwaW5nUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIodGV4dCksIGJ1ZmZlcik7CisKKyAgICAgICAgd2hpbGUgKHJlYWRlci5yZWFkKCkgIT0gLTEpIHsKKyAgICAgICAgICAgIC8vIGVtcHR5IGxvb3AKKyAgICAgICAgICAgIC8vIC0gcmVhZCBhbGwgY2hhcmFjdGVycyB0aWxsIHRoZSBlbmQgb2YgdGhlIHJlYWRlcgorICAgICAgICAgICAgLy8gVW5pY29kZUVzY2FwaW5nUmVhZGVyIGhhcyBzaWRlIGVmZmVjdHMgb2YKKyAgICAgICAgICAgIC8vIGZpbGxpbmcgdGhlIGJ1ZmZlcgorICAgICAgICB9CisgICAgICAgIHJldHVybiBidWZmZXI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvU291cmNlUGFyc2VyVGVzdC5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvU291cmNlUGFyc2VyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2MTRlYWQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci9Tb3VyY2VQYXJzZXJUZXN0LmphdmEKQEAgLTAsMCArMSwzNCBAQAorcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudGxyOw0KKw0KK2ltcG9ydCBncm9vdnkudXRpbC5Hcm9vdnlUZXN0Q2FzZTsNCisNCitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsNCitpbXBvcnQgamF2YS5pby5SZWFkZXI7DQoraW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOw0KKw0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudGxyLnBhcnNlci5Hcm9vdnlMZXhlcjsNCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hbnRsci5wYXJzZXIuR3Jvb3Z5UmVjb2duaXplcjsNCisNCitwdWJsaWMgY2xhc3MgU291cmNlUGFyc2VyVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsNCisgICAgcHJvdGVjdGVkIHZvaWQgcGFyc2UoU3RyaW5nIG5hbWUsIFJlYWRlciByZWFkZXIpIHsNCisgICAgICAgIFNvdXJjZUJ1ZmZlciBzb3VyY2VCdWZmZXIgPSBuZXcgU291cmNlQnVmZmVyKCk7DQorICAgICAgICBVbmljb2RlRXNjYXBpbmdSZWFkZXIgdW5pY29kZVJlYWRlciA9IG5ldyBVbmljb2RlRXNjYXBpbmdSZWFkZXIocmVhZGVyLCBzb3VyY2VCdWZmZXIpOw0KKyAgICAgICAgR3Jvb3Z5TGV4ZXIgbGV4ZXIgPSBuZXcgR3Jvb3Z5TGV4ZXIodW5pY29kZVJlYWRlcik7DQorICAgICAgICB1bmljb2RlUmVhZGVyLnNldExleGVyKGxleGVyKTsNCisgICAgICAgIEdyb292eVJlY29nbml6ZXIgcGFyc2VyID0gR3Jvb3Z5UmVjb2duaXplci5tYWtlKGxleGVyKTsNCisgICAgICAgIHBhcnNlci5zZXRTb3VyY2VCdWZmZXIoc291cmNlQnVmZmVyKTsNCisgICAgICAgIHBhcnNlci5zZXRGaWxlbmFtZShuYW1lKTsNCisNCisgICAgICAgIC8vIHN0YXJ0IHBhcnNpbmcgYXQgdGhlIGNvbXBpbGF0aW9uVW5pdCBydWxlDQorICAgICAgICB0cnkgew0KKyAgICAgICAgICAgIHBhcnNlci5jb21waWxhdGlvblVuaXQoKTsNCisgICAgICAgIH0NCisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpIHsNCisgICAgICAgICAgICBTdHJpbmdXcml0ZXIgb3V0ID0gbmV3IFN0cmluZ1dyaXRlcigpOw0KKyAgICAgICAgICAgIG91dC53cml0ZShleC5nZXRNZXNzYWdlKCkpOw0KKyAgICAgICAgICAgIG91dC53cml0ZSgiXG4iKTsNCisgICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UobmV3IFByaW50V3JpdGVyKG91dCkpOw0KKyAgICAgICAgICAgIGZhaWwob3V0LnRvU3RyaW5nKCkpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudGxyL3RyZWV3YWxrZXIvQ29tcG9zaXRlVmlzaXRvclRlc3QuamF2YSBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudGxyL3RyZWV3YWxrZXIvQ29tcG9zaXRlVmlzaXRvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmZkZGUzCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvdHJlZXdhbGtlci9Db21wb3NpdGVWaXNpdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTUgQEAKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5hbnRsci50cmVld2Fsa2VyOworCitpbXBvcnQgYW50bHIuY29sbGVjdGlvbnMuQVNUOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudGxyLkFudGxyQVNUUHJvY2Vzc29yOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50bHIuU291cmNlQnVmZmVyOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50bHIuVW5pY29kZUVzY2FwaW5nUmVhZGVyOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50bHIucGFyc2VyLkdyb292eUxleGVyOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50bHIucGFyc2VyLkdyb292eVJlY29nbml6ZXI7CitpbXBvcnQgb3JnLmN1c3RvbW1vbmtleS54bWx1bml0LlhNTFVuaXQ7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOworaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogVGVzdGNhc2VzIGZvciB0aGUgY29tcG9zaXRlIHZpc2l0b3IuCisgKi8KK3B1YmxpYyBjbGFzcyBDb21wb3NpdGVWaXNpdG9yVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFhNTFVuaXQuc2V0SWdub3JlV2hpdGVzcGFjZSh0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcG9zaXRlVHJhbnNwYXJlbmN5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFRPRE86IGFkZCBtb3JlIHRlc3RzIGluIGhlcmUgKGlzIHRoZXJlIGEgd2F5IHRvIHNoYXJlIHNuaXBwZXRzIHdpdGggU291cmNlUHJpbnRlclRlc3Q/KQorICAgICAgICBhc3NlcnRDb21wb3NpdGVUcmFuc3BhcmVuY3koInB1YmxpYyBhYnN0cmFjdCBjbGFzcyBGb297fSIpOworICAgICAgICBhc3NlcnRDb21wb3NpdGVUcmFuc3BhcmVuY3koImludFtdIHByaW1lcyA9IG5ldyBpbnRbNV0iKTsKKyAgICAgICAgYXNzZXJ0Q29tcG9zaXRlVHJhbnNwYXJlbmN5KCJpZiAoZm9vPT1+XCJiYXJcIil7fSIpOworICAgICAgICBhc3NlcnRDb21wb3NpdGVUcmFuc3BhcmVuY3koImE9MTIiKTsKKyAgICAgICAgYXNzZXJ0Q29tcG9zaXRlVHJhbnNwYXJlbmN5KCJkZWYgeD0xJjIiKTsKKyAgICAgICAgYXNzZXJ0Q29tcG9zaXRlVHJhbnNwYXJlbmN5KCJ4Jj0yIik7CisgICAgICAgIGFzc2VydENvbXBvc2l0ZVRyYW5zcGFyZW5jeSgiZGVmIHogPSB+MTIzIik7CisgICAgICAgIGFzc2VydENvbXBvc2l0ZVRyYW5zcGFyZW5jeSgiZGVmIHkgPSAxIHwgMiIpOworICAgICAgICBhc3NlcnRDb21wb3NpdGVUcmFuc3BhcmVuY3koInl8PTIiKTsKKyAgICAgICAgYXNzZXJ0Q29tcG9zaXRlVHJhbnNwYXJlbmN5KCJkZWYgcSA9IDEgPj4+IDIiKTsKKyAgICAgICAgYXNzZXJ0Q29tcG9zaXRlVHJhbnNwYXJlbmN5KCJ5Pj4+PTIiKTsKKyAgICAgICAgYXNzZXJ0Q29tcG9zaXRlVHJhbnNwYXJlbmN5KCJkZWYgeSA9IHRydWUgXiBmYWxzZSIpOworICAgICAgICBhc3NlcnRDb21wb3NpdGVUcmFuc3BhcmVuY3koInlePWZhbHNlIik7CisgICAgICAgIGFzc2VydENvbXBvc2l0ZVRyYW5zcGFyZW5jeSgic3dpdGNoKGZvbyl7Y2FzZSBiYXI6eD0xfSIpOworICAgICAgICBhc3NlcnRDb21wb3NpdGVUcmFuc3BhcmVuY3koImNsYXNzIEZvb3tkZWYgYmFyfSIpOworICAgICAgICBhc3NlcnRDb21wb3NpdGVUcmFuc3BhcmVuY3koIlsxLDIsM10uZWFjaHtwcmludGxuIGl0fSIpOworICAgICAgICBhc3NlcnRDb21wb3NpdGVUcmFuc3BhcmVuY3koImRlZiB4ID0gZm9vLmJhcihtb29reSkge3gseS0+IHdpYmJsZSh5LHgpfSIpOworICAgICAgICBhc3NlcnRDb21wb3NpdGVUcmFuc3BhcmVuY3koIjE8PT4yIik7CisgICAgICAgIGFzc2VydENvbXBvc2l0ZVRyYW5zcGFyZW5jeSgiY2xhc3MgRm9ve0ZvbyhpbnQgeCkge3RoaXMoKX19Iik7CisgICAgICAgIGFzc2VydENvbXBvc2l0ZVRyYW5zcGFyZW5jeSgiY2xhc3MgRm9ve0Zvbyh4KSB7dGhpcygpfX0iKTsKKyAgICAgICAgYXNzZXJ0Q29tcG9zaXRlVHJhbnNwYXJlbmN5KCJjbGFzcyBGb28ge3ByaXZhdGUgRm9vKCkge319Iik7CisgICAgICAgIGFzc2VydENvbXBvc2l0ZVRyYW5zcGFyZW5jeSgiLS1iIik7CisgICAgICAgIGFzc2VydENvbXBvc2l0ZVRyYW5zcGFyZW5jeSgiMS8yIik7CisgICAgICAgIGFzc2VydENvbXBvc2l0ZVRyYW5zcGFyZW5jeSgieC89MiIpOworICAgICAgICBhc3NlcnRDb21wb3NpdGVUcmFuc3BhcmVuY3koImphdmEudXRpbC5EYXRlIGQgPSBuZXcgamF2YS51dGlsLkRhdGUoKSIpOworICAgICAgICBhc3NlcnRDb21wb3NpdGVUcmFuc3BhcmVuY3koImNsYXNzIEZvbyBleHRlbmRzIGphdmEudXRpbC5EYXRlIHt9Iik7CisgICAgICAgIGFzc2VydENvbXBvc2l0ZVRyYW5zcGFyZW5jeSgiZm9vLmJhci5tb29reSgpIik7CisgICAgICAgIGFzc2VydENvbXBvc2l0ZVRyYW5zcGFyZW5jeSgicGFja2FnZSBmb28uYmFyIik7CisgICAgICAgIGFzc2VydENvbXBvc2l0ZVRyYW5zcGFyZW5jeSgiaW1wb3J0IGphdmEudXRpbC5EYXRlIik7CisgICAgICAgIGFzc2VydENvbXBvc2l0ZVRyYW5zcGFyZW5jeSgiaW1wb3J0IGphdmEuaW8uKiIpOworICAgICAgICBhc3NlcnRDb21wb3NpdGVUcmFuc3BhcmVuY3koIkBmb28uQmFyIG1vb2t5Iik7CisgICAgICAgIGFzc2VydENvbXBvc2l0ZVRyYW5zcGFyZW5jeSgiZGVmIGZvbygpIHRocm93cyBiYXIuTW9va3lFeGNlcHRpb257fSIpOworICAgICAgICBhc3NlcnRDb21wb3NpdGVUcmFuc3BhcmVuY3koImRlZiB4ID0gXCIke2Zvby5iYXJ9XCIiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0Q29tcG9zaXRlVHJhbnNwYXJlbmN5KFN0cmluZyBpbnB1dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBHcm9vdnlSZWNvZ25pemVyIHBhcnNlcjsKKyAgICAgICAgU291cmNlQnVmZmVyIHNvdXJjZUJ1ZmZlciA9IG5ldyBTb3VyY2VCdWZmZXIoKTsKKyAgICAgICAgVW5pY29kZUVzY2FwaW5nUmVhZGVyIHVuaWNvZGVSZWFkZXIgPSBuZXcgVW5pY29kZUVzY2FwaW5nUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoaW5wdXQpLCBzb3VyY2VCdWZmZXIpOworICAgICAgICBHcm9vdnlMZXhlciBsZXhlciA9IG5ldyBHcm9vdnlMZXhlcih1bmljb2RlUmVhZGVyKTsKKyAgICAgICAgdW5pY29kZVJlYWRlci5zZXRMZXhlcihsZXhlcik7CisgICAgICAgIHBhcnNlciA9IEdyb292eVJlY29nbml6ZXIubWFrZShsZXhlcik7CisgICAgICAgIHBhcnNlci5zZXRTb3VyY2VCdWZmZXIoc291cmNlQnVmZmVyKTsKKyAgICAgICAgU3RyaW5nW10gdG9rZW5OYW1lcyA9IHBhcnNlci5nZXRUb2tlbk5hbWVzKCk7CisgICAgICAgIHBhcnNlci5jb21waWxhdGlvblVuaXQoKTsKKyAgICAgICAgQVNUIGFzdCA9IHBhcnNlci5nZXRBU1QoKTsKKworICAgICAgICAvLyBkZXRlcm1pbmUgZGlyZWN0IHJlc3VsdAorICAgICAgICBWaXNpdG9yIGRpcmVjdFZpc2l0b3IgPSBuZXcgU291cmNlUHJpbnRlcihuZXcgUHJpbnRTdHJlYW0oYmFvcyksIHRva2VuTmFtZXMsIGZhbHNlKTsKKyAgICAgICAgQW50bHJBU1RQcm9jZXNzb3IgdHJhdmVyc2VyID0gbmV3IFNvdXJjZUNvZGVUcmF2ZXJzYWwoZGlyZWN0VmlzaXRvcik7CisgICAgICAgIHRyYXZlcnNlci5wcm9jZXNzKGFzdCk7CisgICAgICAgIFN0cmluZyBkaXJlY3RSZXN1bHQgPSBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSk7CisKKyAgICAgICAgLy8gZGV0ZXJtaW5lIGNvbXBvc2l0ZSByZXN1bHQKKyAgICAgICAgYmFvcy5yZXNldCgpOworICAgICAgICBMaXN0IHdyYXBwZWRWaXNpdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgd3JhcHBlZFZpc2l0b3JzLmFkZChkaXJlY3RWaXNpdG9yKTsKKyAgICAgICAgVmlzaXRvciBjb21wb3NpdGVWaXNpdG9yID0gbmV3IENvbXBvc2l0ZVZpc2l0b3Iod3JhcHBlZFZpc2l0b3JzKTsKKyAgICAgICAgdHJhdmVyc2VyID0gbmV3IFNvdXJjZUNvZGVUcmF2ZXJzYWwoY29tcG9zaXRlVmlzaXRvcik7CisgICAgICAgIHRyYXZlcnNlci5wcm9jZXNzKGFzdCk7CisgICAgICAgIFN0cmluZyBjb21wb3NpdGVSZXN1bHQgPSBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRpcmVjdFJlc3VsdCwgY29tcG9zaXRlUmVzdWx0KTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudGxyL3RyZWV3YWxrZXIvSmF2YTJHcm9vdnlUZXN0LmphdmEgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci90cmVld2Fsa2VyL0phdmEyR3Jvb3Z5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MjU2NjEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci90cmVld2Fsa2VyL0phdmEyR3Jvb3Z5VGVzdC5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qKgorICoKKyAqIENvcHlyaWdodCAyMDA1IEplcmVteSBSYXluZXIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5hbnRsci50cmVld2Fsa2VyOworCitpbXBvcnQgZ3Jvb3Z5LnV0aWwuR3Jvb3Z5VGVzdENhc2U7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hbnRsci5qYXZhLkphdmEyR3Jvb3Z5TWFpbjsKKworcHVibGljIGNsYXNzIEphdmEyR3Jvb3Z5VGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoInByaXZhdGUgY2xhc3MgRm9vIHtpbnQgeCA9IDF9IiwgY29udmVydCgicHJpdmF0ZSBjbGFzcyBGb297aW50IHg9MTt9IikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdMaXRlcmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygiY2xhc3MgRm9vIHtTdHJpbmcgeCA9IFwibW9va3lcIn0iLCBjb252ZXJ0KCJwdWJsaWMgY2xhc3MgRm9ve1N0cmluZyB4ID0gXCJtb29reVwiO30iKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY2xhc3MgQyB7dm9pZCBtKFN0cmluZyBzKSB7RmlsZSBmID0gbmV3IEZpbGUoXCJzbFwiICsgcyl9fSIsIGNvbnZlcnQoInB1YmxpYyBjbGFzcyBDe3ZvaWQgbShTdHJpbmcgcykge0ZpbGUgZj1uZXcgRmlsZShcInNsXCIgKyBzKTt9fSIpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBjb252ZXJ0KFN0cmluZyBpbnB1dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBKYXZhMkdyb292eU1haW4uY29udmVydCgiSmF2YTJHcm9vdnlUZXN0LmphdmEiLCBpbnB1dCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgbWluZG1hcChTdHJpbmcgaW5wdXQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZXR1cm4gSmF2YTJHcm9vdnlNYWluLm1pbmRtYXAoaW5wdXQpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIG5vZGVQcmludGVyKFN0cmluZyBpbnB1dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBKYXZhMkdyb292eU1haW4ubm9kZVByaW50ZXIoaW5wdXQpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvdHJlZXdhbGtlci9MaW5lQ29sdW1uQ2hlY2tlci5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvdHJlZXdhbGtlci9MaW5lQ29sdW1uQ2hlY2tlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMDYwZjYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci90cmVld2Fsa2VyL0xpbmVDb2x1bW5DaGVja2VyLmphdmEKQEAgLTAsMCArMSw1OCBAQAorLyoqCisgKgorICogQ29weXJpZ2h0IDIwMDUgSmVyZW15IFJheW5lcgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqLworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50bHIudHJlZXdhbGtlcjsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50bHIuR3Jvb3Z5U291cmNlQVNUOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50bHIuTGluZUNvbHVtbjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudGxyLlNvdXJjZUJ1ZmZlcjsKKworLyoqCisgKiBTb3VyY2UgQVNUIFZpc2l0b3IgdGhhdCB3aWxsIGFzc2VydCBlYWNoIG5vZGUgaGFzIGEgY29ycmVjdCBsaW5lL2NvbHVtbiBpbmZvCisgKiBnaXZlbiBhIFNvdXJjZUJ1ZmZlcgorICoKKyAqIEBhdXRob3IgSmVyZW15IFJheW5lcgorICovCitwdWJsaWMgY2xhc3MgTGluZUNvbHVtbkNoZWNrZXIgZXh0ZW5kcyBWaXNpdG9yQWRhcHRlciB7CisgICAgcHJpdmF0ZSBTb3VyY2VCdWZmZXIgc291cmNlQnVmZmVyOworICAgIHByaXZhdGUgU3RyaW5nW10gdG9rZW5OYW1lczsKKworICAgIHB1YmxpYyBMaW5lQ29sdW1uQ2hlY2tlcihTb3VyY2VCdWZmZXIgc291cmNlQnVmZmVyLCBTdHJpbmdbXSB0b2tlbk5hbWVzKSB7CisgICAgICAgIHRoaXMuc291cmNlQnVmZmVyID0gc291cmNlQnVmZmVyOworICAgICAgICB0aGlzLnRva2VuTmFtZXMgPSB0b2tlbk5hbWVzOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCB2aXNpdERlZmF1bHQoR3Jvb3Z5U291cmNlQVNUIHQsaW50IHZpc2l0KSB7CisgICAgICAgIGlmICh2aXNpdCA9PSBPUEVOSU5HX1ZJU0lUICkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJbIiArIHRva2VuTmFtZXNbdC5nZXRUeXBlKCldICsgIl0iKTsKKyAgICAgICAgICAgIGludCBsaW5lID0gdC5nZXRMaW5lKCk7CisgICAgICAgICAgICBpbnQgY29sdW1uID0gdC5nZXRDb2x1bW4oKTsKKyAgICAgICAgICAgIGludCBsaW5lTGFzdCA9IHQuZ2V0TGluZUxhc3QoKTsKKyAgICAgICAgICAgIGludCBjb2x1bW5MYXN0ID0gdC5nZXRDb2x1bW5MYXN0KCk7CisKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIiArIGxpbmUgKyAiIC8gIiArICBjb2x1bW4gKyAiIC0gIiArIGxpbmVMYXN0ICsgIiAvICIgKyBjb2x1bW5MYXN0KTsKKyAgICAgICAgICAgIGlmIChsaW5lID4gMCAmJiBjb2x1bW4gPiAwICYmIGxpbmVMYXN0ID4gMCAmJiBjb2x1bW5MYXN0ID4gMCkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIiArIHNvdXJjZUJ1ZmZlci5nZXRTbmlwcGV0KG5ldyBMaW5lQ29sdW1uKGxpbmUsIGNvbHVtbiksIG5ldyBMaW5lQ29sdW1uKGxpbmVMYXN0LCBjb2x1bW5MYXN0KSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlpFUk8iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh2aXNpdCA9PSBDTE9TSU5HX1ZJU0lUKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKKyAgICAgICAgfQorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvdHJlZXdhbGtlci9MaW5lQ29sdW1uVGVzdC5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvdHJlZXdhbGtlci9MaW5lQ29sdW1uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NjljNmMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci90cmVld2Fsa2VyL0xpbmVDb2x1bW5UZXN0LmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoqCisgKgorICogQ29weXJpZ2h0IDIwMDUgSmVyZW15IFJheW5lcgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqLworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50bHIudHJlZXdhbGtlcjsKKworaW1wb3J0IGFudGxyLmNvbGxlY3Rpb25zLkFTVDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hbnRsci5BbnRsckFTVFByb2Nlc3NvcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudGxyLlNvdXJjZUJ1ZmZlcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudGxyLlVuaWNvZGVFc2NhcGluZ1JlYWRlcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudGxyLkFudGxyQVNUUHJvY2Vzc1NuaXBwZXRzOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50bHIucGFyc2VyLkdyb292eUxleGVyOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50bHIucGFyc2VyLkdyb292eVJlY29nbml6ZXI7CisKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKKworLyoqCisgKiBUZXN0IHRoYXQgd2lsbCBhc3NlcnQgZWFjaCBub2RlIG9mIFNvdXJjZSBBU1QgaGFzIGEgY29ycmVjdCBsaW5lL2NvbHVtbiBpbmZvCisgKiBnaXZlbiBhIFNvdXJjZUJ1ZmZlcgorICoKKyAqIEBhdXRob3IgSmVyZW15IFJheW5lcgorICovCitwdWJsaWMgY2xhc3MgTGluZUNvbHVtblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZUdyb292eVNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBkb1N0dWZmKCJkZWYgZm9vKClcbiIgKworICAgICAgICAgICAgICAgICJ7IHByaW50IFwiSGVsbG8gV29ybGRcIiB9XG4iICsKKyAgICAgICAgICAgICAgICAiXG4iICsKKyAgICAgICAgICAgICAgICAiZm9vKCkiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkb1N0dWZmKFN0cmluZyBpbnB1dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEdyb292eVJlY29nbml6ZXIgcGFyc2VyOworICAgICAgICBTb3VyY2VCdWZmZXIgc291cmNlQnVmZmVyID0gbmV3IFNvdXJjZUJ1ZmZlcigpOworICAgICAgICBVbmljb2RlRXNjYXBpbmdSZWFkZXIgdW5pY29kZVJlYWRlciA9IG5ldyBVbmljb2RlRXNjYXBpbmdSZWFkZXIobmV3IFN0cmluZ1JlYWRlcihpbnB1dCksIHNvdXJjZUJ1ZmZlcik7CisgICAgICAgIEdyb292eUxleGVyIGxleGVyID0gbmV3IEdyb292eUxleGVyKHVuaWNvZGVSZWFkZXIpOworICAgICAgICB1bmljb2RlUmVhZGVyLnNldExleGVyKGxleGVyKTsKKyAgICAgICAgcGFyc2VyID0gR3Jvb3Z5UmVjb2duaXplci5tYWtlKGxleGVyKTsKKyAgICAgICAgcGFyc2VyLnNldFNvdXJjZUJ1ZmZlcihzb3VyY2VCdWZmZXIpOworICAgICAgICBTdHJpbmdbXSB0b2tlbk5hbWVzID0gcGFyc2VyLmdldFRva2VuTmFtZXMoKTsKKyAgICAgICAgcGFyc2VyLmNvbXBpbGF0aW9uVW5pdCgpOworICAgICAgICBBU1QgYXN0ID0gcGFyc2VyLmdldEFTVCgpOworICAgICAgICBBbnRsckFTVFByb2Nlc3NvciBzbmlwcGV0cyA9IG5ldyBBbnRsckFTVFByb2Nlc3NTbmlwcGV0cyhzb3VyY2VCdWZmZXIpOworICAgICAgICBhc3QgPSBzbmlwcGV0cy5wcm9jZXNzKGFzdCk7CisgICAgICAgIFZpc2l0b3IgdmlzaXRvciA9IG5ldyBMaW5lQ29sdW1uQ2hlY2tlcihzb3VyY2VCdWZmZXIsIHRva2VuTmFtZXMpOworICAgICAgICBBbnRsckFTVFByb2Nlc3NvciB0cmF2ZXJzZXIgPSBuZXcgU291cmNlQ29kZVRyYXZlcnNhbCh2aXNpdG9yKTsKKyAgICAgICAgdHJhdmVyc2VyLnByb2Nlc3MoYXN0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci90cmVld2Fsa2VyL01pbmRNYXBQcmludGVyVGVzdC5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvdHJlZXdhbGtlci9NaW5kTWFwUHJpbnRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjFmNWU1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvdHJlZXdhbGtlci9NaW5kTWFwUHJpbnRlclRlc3QuamF2YQpAQCAtMCwwICsxLDg0IEBACitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50bHIudHJlZXdhbGtlcjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50bHIucGFyc2VyLkdyb292eVRva2VuVHlwZXM7CitpbXBvcnQgb3JnLmN1c3RvbW1vbmtleS54bWx1bml0LkRpZmY7CitpbXBvcnQgb3JnLmN1c3RvbW1vbmtleS54bWx1bml0LlhNTFVuaXQ7CisKKy8qKgorICogVGVzdGNhc2VzIGZvciB0aGUgYW50bHIgQVNUIHZpc2l0b3IgdGhhdCBwcmludHMgZ3Jvb3Z5IHNvdXJjZSBjb2RlIG5vZGVzIGFzIEZyZWVtaW5kIGNvbXBhdGlibGUgWE1MLgorICovCitwdWJsaWMgY2xhc3MgTWluZE1hcFByaW50ZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgaW1wbGVtZW50cyBHcm9vdnlUb2tlblR5cGVzeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUiA9ICI8bWFwIHZlcnNpb249JzAuNy4xJz48bm9kZSBURVhUPSdBU1QnPiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPT1RFUiA9ICI8L25vZGU+PC9tYXA+IjsKKworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFhNTFVuaXQuc2V0SWdub3JlV2hpdGVzcGFjZSh0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0WG1sRXF1YWxzKAorICAgICAgICAgICAgICAgIEhFQURFUiArCisgICAgICAgICAgICAgICAgICAgICAgICAiPG5vZGUgVEVYVD0nTU9ESUZJRVJTICZsdDsiICsgTU9ESUZJRVJTICsiJmd0OycgUE9TSVRJT049J3JpZ2h0JyBDT0xPUj1cIiMwMDAwMDBcIj4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgIDxub2RlIFRFWFQ9J3B1YmxpYyAgJmx0OyIgKyBMSVRFUkFMX3B1YmxpYyArIiZndDsnIFBPU0lUSU9OPSdyaWdodCcgQ09MT1I9XCIjMTcxNzhCXCI+PC9ub2RlPiIgKworICAgICAgICAgICAgICAgICAgICAgICAgIjwvbm9kZT4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICI8bm9kZSBURVhUPSdhYnN0cmFjdCAgJmx0OyIgKyBBQlNUUkFDVCArIiZndDsnIFBPU0lUSU9OPSdyaWdodCcgQ09MT1I9XCIjMDA2Njk5XCI+PC9ub2RlPiIgKworICAgICAgICAgICAgICAgICAgICAgICAgIjxub2RlIFRFWFQ9J0NMQVNTX0RFRiAmbHQ7IiArIENMQVNTX0RFRiArIiZndDsnIFBPU0lUSU9OPSdyaWdodCcgQ09MT1I9XCIjMTcxNzhCXCI+PC9ub2RlPiIgKworICAgICAgICAgICAgICAgICAgICAgICAgIjxub2RlIFRFWFQ9J2FuIGlkZW50aWZpZXIgJmx0OyIgKyBJREVOVCArIiZndDsgOiBGb28nIFBPU0lUSU9OPSdyaWdodCcgQ09MT1I9XCIjMDA2Njk5XCI+PC9ub2RlPiIgKworICAgICAgICAgICAgICAgICAgICAgICAgIjxub2RlIFRFWFQ9J0VYVEVORFNfQ0xBVVNFICZsdDsiICsgRVhURU5EU19DTEFVU0UgKyImZ3Q7JyBQT1NJVElPTj0ncmlnaHQnIENPTE9SPVwiIzE3MTc4QlwiPjwvbm9kZT4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICI8bm9kZSBURVhUPSdJTVBMRU1FTlRTX0NMQVVTRSAmbHQ7IiArIElNUExFTUVOVFNfQ0xBVVNFICsiJmd0OycgUE9TSVRJT049J3JpZ2h0JyBDT0xPUj1cIiMxNzE3OEJcIj48L25vZGU+IiArCisgICAgICAgICAgICAgICAgICAgICAgICAiPG5vZGUgVEVYVD0nT0JKQkxPQ0sgJmx0OyIgKyBPQkpCTE9DSyArIiZndDsnIFBPU0lUSU9OPSdyaWdodCcgQ09MT1I9XCIjMDA2Njk5XCI+PC9ub2RlPiIgKworICAgICAgICAgICAgICAgICAgICAgICAgRk9PVEVSLAorICAgICAgICAgICAgICAgIHByZXR0eSgicHVibGljIGFic3RyYWN0IGNsYXNzIEZvb3t9IikpOworCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFycmF5RGVjbGFyYXRvcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRYbWxFcXVhbHMoCisgICAgICAgICAgICAgICAgSEVBREVSICsKKyAgICAgICAgICAgICAgICAgICAgICAgICI8bm9kZSBURVhUPSdWQVJJQUJMRV9ERUYgJmx0OyIgKyBWQVJJQUJMRV9ERUYgKyImZ3Q7IDogcHJpbWVzJyBQT1NJVElPTj0ncmlnaHQnIENPTE9SPVwiIzAwMDAwMFwiPiIgKworICAgICAgICAgICAgICAgICAgICAgICAgIiAgPG5vZGUgVEVYVD0nVFlQRSAmbHQ7IiArIFRZUEUgKyImZ3Q7JyBQT1NJVElPTj0ncmlnaHQnIENPTE9SPVwiIzE3MTc4QlwiPiIgKworICAgICAgICAgICAgICAgICAgICAgICAgIiAgICA8bm9kZSBURVhUPSdBUlJBWV9ERUNMQVJBVE9SICZsdDsiICsgQVJSQVlfREVDTEFSQVRPUiArIiZndDsgOiBbJyBQT1NJVElPTj0ncmlnaHQnIENPTE9SPVwiIzAwMDAwMFwiPiIgKworICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgIDxub2RlIFRFWFQ9J2ludCAgJmx0OyIgKyBMSVRFUkFMX2ludCArIiZndDsnIFBPU0lUSU9OPSdyaWdodCcgQ09MT1I9XCIjMTcxNzhCXCI+PC9ub2RlPiIgKworICAgICAgICAgICAgICAgICAgICAgICAgIiAgICA8L25vZGU+IiArCisgICAgICAgICAgICAgICAgICAgICAgICAiICA8L25vZGU+IiArCisgICAgICAgICAgICAgICAgICAgICAgICAiICA8bm9kZSBURVhUPSdhbiBpZGVudGlmaWVyICZsdDsiICsgSURFTlQgKyImZ3Q7IDogcHJpbWVzJyBQT1NJVElPTj0ncmlnaHQnIENPTE9SPVwiIzAwNjY5OVwiPjwvbm9kZT4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgIDxub2RlIFRFWFQ9Jz0gICZsdDsiICsgQVNTSUdOICsiJmd0OycgUE9TSVRJT049J3JpZ2h0JyBDT0xPUj1cIiMwMDAwMDBcIj4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgICAgPG5vZGUgVEVYVD0nbmV3ICAmbHQ7IiArIExJVEVSQUxfbmV3ICsiJmd0OycgUE9TSVRJT049J3JpZ2h0JyBDT0xPUj1cIiMxNzE3OEJcIj4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICA8bm9kZSBURVhUPSdpbnQgICZsdDsiICsgTElURVJBTF9pbnQgKyImZ3Q7JyBQT1NJVElPTj0ncmlnaHQnIENPTE9SPVwiIzE3MTc4QlwiPjwvbm9kZT4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICA8bm9kZSBURVhUPSdBUlJBWV9ERUNMQVJBVE9SICZsdDsiICsgQVJSQVlfREVDTEFSQVRPUiArIiZndDsgOiBbJyBQT1NJVElPTj0ncmlnaHQnIENPTE9SPVwiIzAwMDAwMFwiPiIgKworICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgPG5vZGUgVEVYVD0nYSBudW1lcmljIGxpdGVyYWwgJmx0OyIgKyBOVU1fSU5UICsiJmd0OyA6IDUnIFBPU0lUSU9OPSdyaWdodCcgQ09MT1I9XCIjMDA2Njk5XCI+PC9ub2RlPiIgKworICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgIDwvbm9kZT4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgICAgPC9ub2RlPiIgKworICAgICAgICAgICAgICAgICAgICAgICAgIiAgPC9ub2RlPiIgKworICAgICAgICAgICAgICAgICAgICAgICAgIjwvbm9kZT4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZPT1RFUiwKKyAgICAgICAgICAgICAgICBwcmV0dHkoImludFtdIHByaW1lcyA9IG5ldyBpbnRbNV0iKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlZ2V4TWF0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0WG1sRXF1YWxzKAorICAgICAgICAgICAgICAgIEhFQURFUiArCisgICAgICAgICAgICAgICAgICAgICAgICAiPG5vZGUgVEVYVD0naWYgICZsdDsiICsgTElURVJBTF9pZiArIiZndDsnIFBPU0lUSU9OPSdyaWdodCcgQ09MT1I9XCIjMTcxNzhCXCI+IiArCisgICAgICAgICAgICAgICAgICAgICAgICAiICA8bm9kZSBURVhUPSdhbiBpZGVudGlmaWVyICZsdDsiICsgSURFTlQgKyImZ3Q7IDogZm9vJyBQT1NJVElPTj0ncmlnaHQnIENPTE9SPVwiIzAwNjY5OVwiPjwvbm9kZT4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgIDxub2RlIFRFWFQ9Jz09fiAgJmx0OyIgKyBSRUdFWF9NQVRDSCArIiZndDsnIFBPU0lUSU9OPSdyaWdodCcgQ09MT1I9XCIjMDAwMDAwXCI+PC9ub2RlPiIgKworICAgICAgICAgICAgICAgICAgICAgICAgIiAgPG5vZGUgVEVYVD0nYSBzdHJpbmcgbGl0ZXJhbCAmbHQ7IiArIFNUUklOR19MSVRFUkFMICsiJmd0OyA6IGJhcicgUE9TSVRJT049J3JpZ2h0JyBDT0xPUj1cIiMwMDgwMDBcIj48L25vZGU+IiArCisgICAgICAgICAgICAgICAgICAgICAgICAiPC9ub2RlPiIgKworICAgICAgICAgICAgICAgICAgICAgICAgIjxub2RlIFRFWFQ9J1NMSVNUICZsdDsiICsgU0xJU1QgKyImZ3Q7IDogeycgUE9TSVRJT049J3JpZ2h0JyBDT0xPUj1cIiMwMDY2OTlcIj48L25vZGU+IiArCisgICAgICAgICAgICAgICAgICAgICAgICBGT09URVIsCisgICAgICAgICAgICAgICAgcHJldHR5KCJpZiAoZm9vPT1+XCJiYXJcIil7fSIpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0WG1sRXF1YWxzKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIGFjdHVhbCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIERpZmYgZGlmZiA9IG5ldyBEaWZmKGV4cGVjdGVkLCBhY3R1YWwpOworICAgICAgICBhc3NlcnRUcnVlKGRpZmYudG9TdHJpbmcoKSwgZGlmZi5zaW1pbGFyKCkpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIHByZXR0eShTdHJpbmcgaW5wdXQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBUcmF2ZXJzYWxUZXN0SGVscGVyIHRyYXZlcnNlciA9IG5ldyBUcmF2ZXJzYWxUZXN0SGVscGVyKCk7CisgICAgICAgIHJldHVybiB0cmF2ZXJzZXIudHJhdmVyc2UoaW5wdXQsIE1pbmRNYXBQcmludGVyLmNsYXNzKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudGxyL3RyZWV3YWxrZXIvTm9kZUFzSFRNTFByaW50ZXJUZXN0LmphdmEgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci90cmVld2Fsa2VyL05vZGVBc0hUTUxQcmludGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhODI5NmUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci90cmVld2Fsa2VyL05vZGVBc0hUTUxQcmludGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsODIgQEAKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5hbnRsci50cmVld2Fsa2VyOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IG9yZy5jdXN0b21tb25rZXkueG1sdW5pdC5EaWZmOworaW1wb3J0IG9yZy5jdXN0b21tb25rZXkueG1sdW5pdC5YTUxVbml0OworCisvKioKKyAqIFRlc3RjYXNlcyBmb3IgdGhlIGFudGxyIEFTVCB2aXNpdG9yIHRoYXQgcHJpbnRzIGdyb292eSBzb3VyY2UgY29kZSBub2RlcyBhcyBIVE1MLgorICovCitwdWJsaWMgY2xhc3MgTm9kZUFzSFRNTFByaW50ZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUiA9ICI8aHRtbD48aGVhZD48L2hlYWQ+PGJvZHk+PHByZT4iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT09URVIgPSAiPC9wcmU+PC9ib2R5PjwvaHRtbD4iOworCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgWE1MVW5pdC5zZXRJZ25vcmVXaGl0ZXNwYWNlKHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBYnN0cmFjdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRYbWxFcXVhbHMoCisgICAgICAgICAgICAgICAgSEVBREVSICsKKyAgICAgICAgICAgICAgICAgICAgICAgICI8Y29kZSB0aXRsZT0nTU9ESUZJRVJTJz48Zm9udCBjb2xvcj0nIzAwMDAwMCc+IiArCisgICAgICAgICAgICAgICAgICAgICAgICAiICA8Y29kZSB0aXRsZT0nXCJwdWJsaWNcIic+PGZvbnQgY29sb3I9JyMxNzE3OEInPjwvZm9udD48L2NvZGU+IiArCisgICAgICAgICAgICAgICAgICAgICAgICAiPC9mb250PjwvY29kZT4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICI8Y29kZSB0aXRsZT0nXCJhYnN0cmFjdFwiJz48Zm9udCBjb2xvcj0nIzAwMDAwMCc+PC9mb250PjwvY29kZT4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICI8Y29kZSB0aXRsZT0nQ0xBU1NfREVGJz48Zm9udCBjb2xvcj0nIzE3MTc4Qic+PC9mb250PjwvY29kZT4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICI8Y29kZSB0aXRsZT0nYW4gaWRlbnRpZmllcic+PGZvbnQgY29sb3I9JyMwMDAwMDAnPjwvZm9udD48L2NvZGU+IiArCisgICAgICAgICAgICAgICAgICAgICAgICAiPGNvZGUgdGl0bGU9J0VYVEVORFNfQ0xBVVNFJz48Zm9udCBjb2xvcj0nIzE3MTc4Qic+PC9mb250PjwvY29kZT4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICI8Y29kZSB0aXRsZT0nSU1QTEVNRU5UU19DTEFVU0UnPjxmb250IGNvbG9yPScjMTcxNzhCJz48L2ZvbnQ+PC9jb2RlPiIgKworICAgICAgICAgICAgICAgICAgICAgICAgIjxjb2RlIHRpdGxlPSdPQkpCTE9DSyc+PGZvbnQgY29sb3I9JyMwMDAwMDAnPjwvZm9udD48L2NvZGU+IiArCisgICAgICAgICAgICAgICAgICAgICAgICBGT09URVIsCisgICAgICAgICAgICAgICAgcHJldHR5KCJwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRm9ve30iKSk7CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXJyYXlEZWNsYXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydFhtbEVxdWFscygKKyAgICAgICAgICAgICAgICBIRUFERVIgKworICAgICAgICAgICAgICAgICAgICAgICAgIjxjb2RlIHRpdGxlPSdWQVJJQUJMRV9ERUYnPjxmb250IGNvbG9yPScjMDAwMDAwJz4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgIDxjb2RlIHRpdGxlPSdUWVBFJz48Zm9udCBjb2xvcj0nIzE3MTc4Qic+IiArCisgICAgICAgICAgICAgICAgICAgICAgICAiICAgIDxjb2RlIHRpdGxlPSdBUlJBWV9ERUNMQVJBVE9SJz48Zm9udCBjb2xvcj0nIzAwMDAwMCc+IiArCisgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgPGNvZGUgdGl0bGU9J1wiaW50XCInPjxmb250IGNvbG9yPScjMTcxNzhCJz48L2ZvbnQ+PC9jb2RlPiIgKworICAgICAgICAgICAgICAgICAgICAgICAgIiAgICA8L2ZvbnQ+PC9jb2RlPiIgKworICAgICAgICAgICAgICAgICAgICAgICAgIiAgPC9mb250PjwvY29kZT4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgIDxjb2RlIHRpdGxlPSdhbiBpZGVudGlmaWVyJz48Zm9udCBjb2xvcj0nIzAwMDAwMCc+PC9mb250PjwvY29kZT4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgIDxjb2RlIHRpdGxlPVwiJz0nXCI+PGZvbnQgY29sb3I9JyMwMDAwMDAnPiIgKworICAgICAgICAgICAgICAgICAgICAgICAgIiAgICA8Y29kZSB0aXRsZT0nXCJuZXdcIic+PGZvbnQgY29sb3I9JyMxNzE3OEInPiIgKworICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgIDxjb2RlIHRpdGxlPSdcImludFwiJz48Zm9udCBjb2xvcj0nIzE3MTc4Qic+PC9mb250PjwvY29kZT4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICA8Y29kZSB0aXRsZT0nQVJSQVlfREVDTEFSQVRPUic+PGZvbnQgY29sb3I9JyMwMDAwMDAnPiIgKworICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgPGNvZGUgdGl0bGU9J2EgbnVtZXJpYyBsaXRlcmFsJz48Zm9udCBjb2xvcj0nIzAwMDAwMCc+PC9mb250PjwvY29kZT4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICA8L2ZvbnQ+PC9jb2RlPiIgKworICAgICAgICAgICAgICAgICAgICAgICAgIiAgICA8L2ZvbnQ+PC9jb2RlPiIgKworICAgICAgICAgICAgICAgICAgICAgICAgIiAgPC9mb250PjwvY29kZT4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICI8L2ZvbnQ+PC9jb2RlPiIgKworICAgICAgICAgICAgICAgICAgICAgICAgRk9PVEVSLAorICAgICAgICAgICAgICAgIHByZXR0eSgiaW50W10gcHJpbWVzID0gbmV3IGludFs1XSIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVnZXhNYXRjaCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRYbWxFcXVhbHMoCisgICAgICAgICAgICAgICAgSEVBREVSICsKKyAgICAgICAgICAgICAgICAgICAgICAgICI8Y29kZSB0aXRsZT0nXCJpZlwiJz48Zm9udCBjb2xvcj0nIzE3MTc4Qic+IiArCisgICAgICAgICAgICAgICAgICAgICAgICAiICA8Y29kZSB0aXRsZT0nYW4gaWRlbnRpZmllcic+PGZvbnQgY29sb3I9JyMwMDAwMDAnPjwvZm9udD48L2NvZGU+IiArCisgICAgICAgICAgICAgICAgICAgICAgICAiICA8Y29kZSB0aXRsZT1cIic9PX4nXCI+PGZvbnQgY29sb3I9JyMwMDAwMDAnPjwvZm9udD48L2NvZGU+IiArCisgICAgICAgICAgICAgICAgICAgICAgICAiICA8Y29kZSB0aXRsZT0nYSBzdHJpbmcgbGl0ZXJhbCc+PGZvbnQgY29sb3I9JyMwMDgwMDAnPjwvZm9udD48L2NvZGU+IiArCisgICAgICAgICAgICAgICAgICAgICAgICAiPC9mb250PjwvY29kZT4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICI8Y29kZSB0aXRsZT0nU0xJU1QnPjxmb250IGNvbG9yPScjMDAwMDAwJz48L2ZvbnQ+PC9jb2RlPiIgKworICAgICAgICAgICAgICAgICAgICAgICAgRk9PVEVSLAorICAgICAgICAgICAgICAgIHByZXR0eSgiaWYgKGZvbz09flwiYmFyXCIpe30iKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFhtbEVxdWFscyhTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBhY3R1YWwpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBEaWZmIGRpZmYgPSBuZXcgRGlmZihleHBlY3RlZCwgYWN0dWFsKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkaWZmLnRvU3RyaW5nKCksIGRpZmYuc2ltaWxhcigpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBwcmV0dHkoU3RyaW5nIGlucHV0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgVHJhdmVyc2FsVGVzdEhlbHBlciB0cmF2ZXJzZXIgPSBuZXcgVHJhdmVyc2FsVGVzdEhlbHBlcigpOworICAgICAgICByZXR1cm4gdHJhdmVyc2VyLnRyYXZlcnNlKGlucHV0LCBOb2RlQXNIVE1MUHJpbnRlci5jbGFzcyk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci90cmVld2Fsa2VyL05vZGVQcmludGVyVGVzdC5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvdHJlZXdhbGtlci9Ob2RlUHJpbnRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWE4NmUyCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvdHJlZXdhbGtlci9Ob2RlUHJpbnRlclRlc3QuamF2YQpAQCAtMCwwICsxLDQxIEBACitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50bHIudHJlZXdhbGtlcjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBvcmcuY3VzdG9tbW9ua2V5LnhtbHVuaXQuWE1MVW5pdDsKKworLyoqCisgKiBUZXN0Y2FzZXMgZm9yIHRoZSBhbnRsciBBU1QgdmlzaXRvciB0aGF0IHByaW50cyBncm9vdnkgc291cmNlIGNvZGUgbm9kZXMgYXMgUHNldWRvIFhNTC4KKyAqLworcHVibGljIGNsYXNzIE5vZGVQcmludGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFhNTFVuaXQuc2V0SWdub3JlV2hpdGVzcGFjZSh0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0UHNldWRvWG1sRXF1YWxzKCI8TU9ESUZJRVJTPjxcInB1YmxpY1wiPjwvXCJwdWJsaWNcIj48L01PRElGSUVSUz48XCJhYnN0cmFjdFwiPjwvXCJhYnN0cmFjdFwiPjxDTEFTU19ERUY+PC9DTEFTU19ERUY+PGFuIGlkZW50aWZpZXI+PC9hbiBpZGVudGlmaWVyPjxFWFRFTkRTX0NMQVVTRT48L0VYVEVORFNfQ0xBVVNFPjxJTVBMRU1FTlRTX0NMQVVTRT48L0lNUExFTUVOVFNfQ0xBVVNFPjxPQkpCTE9DSz48L09CSkJMT0NLPiIsCisgICAgICAgICAgICAgICAgbm9kaWZ5KCJwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRm9ve30iKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFycmF5RGVjbGFyYXRvcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRQc2V1ZG9YbWxFcXVhbHMoCisgICAgICAgICAgICAgICAgIjxWQVJJQUJMRV9ERUY+PFRZUEU+PEFSUkFZX0RFQ0xBUkFUT1I+PFwiaW50XCI+PC9cImludFwiPjwvQVJSQVlfREVDTEFSQVRPUj48L1RZUEU+PGFuIGlkZW50aWZpZXI+PC9hbiBpZGVudGlmaWVyPjwnPSc+PFwibmV3XCI+PFwiaW50XCI+PC9cImludFwiPjwvXCJuZXdcIj48QVJSQVlfREVDTEFSQVRPUj48YSBudW1lcmljIGxpdGVyYWw+PC9hIG51bWVyaWMgbGl0ZXJhbD48L0FSUkFZX0RFQ0xBUkFUT1I+PC9cIm5ld1wiPjwvJz0nPjwvVkFSSUFCTEVfREVGPiIsCisgICAgICAgICAgICAgICAgbm9kaWZ5KCJpbnRbXSBwcmltZXMgPSBuZXcgaW50WzVdIikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZWdleE1hdGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydFBzZXVkb1htbEVxdWFscygKKyAgICAgICAgICAgICAgICAiPFwiaWZcIj48YW4gaWRlbnRpZmllcj48L2FuIGlkZW50aWZpZXI+PCc9PX4nPjwvJz09fic+PGEgc3RyaW5nIGxpdGVyYWw+PC9hIHN0cmluZyBsaXRlcmFsPjwvXCJpZlwiPjxTTElTVD48L1NMSVNUPiIsCisgICAgICAgICAgICAgICAgbm9kaWZ5KCJpZiAoZm9vPT1+XCJiYXJcIil7fSIpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0UHNldWRvWG1sRXF1YWxzKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIGFjdHVhbCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgYWN0dWFsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBub2RpZnkoU3RyaW5nIGlucHV0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgVHJhdmVyc2FsVGVzdEhlbHBlciB0cmF2ZXJzZXIgPSBuZXcgVHJhdmVyc2FsVGVzdEhlbHBlcigpOworICAgICAgICByZXR1cm4gdHJhdmVyc2VyLnRyYXZlcnNlKGlucHV0LCBOb2RlUHJpbnRlci5jbGFzcyk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci90cmVld2Fsa2VyL1NvdXJjZVByaW50ZXJUZXN0LmphdmEgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9hbnRsci90cmVld2Fsa2VyL1NvdXJjZVByaW50ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFlNTBjMwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudGxyL3RyZWV3YWxrZXIvU291cmNlUHJpbnRlclRlc3QuamF2YQpAQCAtMCwwICsxLDg4OSBAQAorLyoqCisgKgorICogQ29weXJpZ2h0IDIwMDUgSmVyZW15IFJheW5lcgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFudGxyLnRyZWV3YWxrZXI7CisKK2ltcG9ydCBncm9vdnkudXRpbC5Hcm9vdnlUZXN0Q2FzZTsKKworLyoqCisgKiBUZXN0Y2FzZXMgZm9yIHRoZSBhbnRsciBBU1QgdmlzaXRvciB0aGF0IHByaW50cyBncm9vdnkgc291cmNlIGNvZGUuCisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Z3Jvb3Z5QHJvc3MtcmF5bmVyLmNvbSI+SmVyZW15IFJheW5lcjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIFNvdXJjZVByaW50ZXJUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgcHVibGljIHZvaWQgdGVzdEFic3RyYWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygicHVibGljIGFic3RyYWN0IGNsYXNzIEZvbyB7fSIsIHByZXR0eSgicHVibGljIGFic3RyYWN0IGNsYXNzIEZvb3t9IikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygiQENyaW1zb24gZm9vIiwgcHJldHR5KCJAQ3JpbXNvbiBmb28iKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiQE92ZXJyaWRlIGludCBoYXNoQ29kZSgpIHtyZXR1cm4gMH0iLCBwcmV0dHkoIkBPdmVycmlkZSBpbnQgaGFzaENvZGUoKSB7cmV0dXJuIDB9IikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0aW9ucygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoIkBJbXBvcnRhbnQgQEJsdWUgcGFja2FnZSBmb28uYmFyIiwgcHJldHR5KCJASW1wb3J0YW50IEBCbHVlIHBhY2thZ2UgZm9vLmJhciIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbkFycmF5SW5pdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBvYnNvbGV0ZSBqYXZhIHN5bnRheAorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0aW9uRGVmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHRvZG8gLSAxNyBKdWx5IDIwMDYgLSB0ZXN0IGZpbmUsIGhvd2V2ZXIgdGhpcyBwYXJzZXMgYnV0IGNhdXNlcyBlcnJvciBpbiBBbnRsclBhcnNlclBsdWdpbgorICAgICAgICBhc3NlcnRFcXVhbHMoInB1YmxpYyBAaW50ZXJmYWNlIEZvb3t9IiwgcHJldHR5KCJwdWJsaWMgQGludGVyZmFjZSBGb297fSIpKTsgLy8gZmFpbHMgYWZ0ZXIgcGFyc2VyCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFubm90YXRpb25GaWVsZERlZigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoInB1YmxpYyBAaW50ZXJmYWNlIEZvb3tpbnQgYmFyKCkgZGVmYXVsdCAxMjN9IiwgcHJldHR5KCJwdWJsaWMgQGludGVyZmFjZSBGb297aW50IGJhcigpIGRlZmF1bHQgMTIzfSIpKTsgLy8gZmFpbHMgYWZ0ZXIgcGFyc2VyCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFubm90YXRpb25NZW1iZXJWYWx1ZVBhaXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJAUHJpbWUodmFsdWUgPSAxNykgaW50IGZvbyIsIHByZXR0eSgiQFByaW1lKHZhbHVlPTE3KSBpbnQgZm9vIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkBCbHVlKHYgPSAzLCB2ID0gNSkgaW50IGJhciIsIHByZXR0eSgiQEJsdWUodiA9IDMsIHYgPSA1KSBpbnQgYmFyIikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBcnJheURlY2xhcmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbnRbXSBwcmltZXMgPSBuZXcgaW50WzVdIiwgcHJldHR5KCJpbnRbXSBwcmltZXMgPSBuZXcgaW50WzVdIikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBc3NpZ24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhID0gMTIiLCBwcmV0dHkoImE9MTIiKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEJhbmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJkZWYgeCA9IDEgJiAyIiwgcHJldHR5KCJkZWYgeD0xJjIiKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEJhbmRBc3NpZ24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4ICY9IDIiLCBwcmV0dHkoIngmPTIiKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEJub3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJkZWYgeiA9IH4xMjMiLCBwcmV0dHkoImRlZiB6ID0gfjEyMyIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Qm9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygiZGVmIHkgPSAxIHwgMiIsIHByZXR0eSgiZGVmIHkgPSAxIHwgMiIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Qm9yQXNzaWduKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygieSB8PSAyIiwgcHJldHR5KCJ5fD0yIikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RCc3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gdW5zaWduZWQgcmlnaHQgc2hpZnQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJkZWYgcSA9IDEgPj4+IDIiLCBwcmV0dHkoImRlZiBxID0gMSA+Pj4gMiIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QnNyQXNzaWduKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygieSA+Pj49IDIiLCBwcmV0dHkoInk+Pj49MiIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QnhvcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoImRlZiB5ID0gdHJ1ZSBeIGZhbHNlIiwgcHJldHR5KCJkZWYgeSA9IHRydWUgXiBmYWxzZSIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QnhvckFzc2lnbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoInkgXj0gZmFsc2UiLCBwcmV0dHkoInlePWZhbHNlIikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDYXNlR3JvdXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzd2l0Y2ggKGZvbykge2Nhc2UgYmFyOnggPSAxfSIsIHByZXR0eSgic3dpdGNoKGZvbyl7Y2FzZSBiYXI6eD0xfSIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NEZWYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjbGFzcyBGb28ge2RlZiBiYXJ9IiwgcHJldHR5KCJjbGFzcyBGb297ZGVmIGJhcn0iKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENsb3NlZEJsb2NrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IC8vIG5vdCBpbiBqYXZhCisgICAgICAgIGFzc2VydEVxdWFscygiWzEsIDIsIDNdLmVhY2gge3ByaW50bG4gaXR9IiwgcHJldHR5KCJbMSwyLDNdLmVhY2h7cHJpbnRsbiBpdH0iKSk7IC8vIG5vdCBpbiBqYXZhCisgICAgICAgIGFzc2VydEVxdWFscygiZGVmIHggPSBmb28uYmFyKG1vb2t5KXt4LHkgLT4gd2liYmxlKHksIHgpfSIsIHByZXR0eSgiZGVmIHggPSBmb28uYmFyKG1vb2t5KSB7eCx5LT4gd2liYmxlKHkseCl9IikpOyAvLyBub3QgaW4gamF2YQorICAgICAgICAvLyB0b2RvOiBhYm92ZSBpcyBub3QgcXVpdGUgdGhlIHNwYWNpbmcgSSB3b3VsZCBleHBlY3QsIGJ1dCBnb29kIGVub3VnaCBmb3Igbm93Li4uCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENsb3N1cmVMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7IC8vIG5vdCBpbiBqYXZhCisgICAgICAgIGFzc2VydEVxdWFscygiZm9yIChpbnQgaSA9IDA7IGkrKzsgaSA8IDEwKXt9IiwgcHJldHR5KCJmb3IgKGludCBpPTA7aSsrO2k8MTApe30iKSk7IC8vIG5vdCBpbiBqYXZhCisgICAgICAgIGFzc2VydEVxdWFscygiZGVmIHggPSAoaW50IGkgPSAwOyBpKys7IGkgPCAxMCkiLCBwcmV0dHkoImRlZiB4ID0gKGludCBpPTA7aSsrO2k8MTApIikpOyAvLyBub3QgaW4gamF2YQorLy90b2RvICAgICAgICBhc3NlcnRFcXVhbHMoIm15TWV0aG9kKGludCBpID0gMDsgaSsrOyBpIDwgMTApIiwgcHJldHR5KCJteU1ldGhvZChpbnQgaT0wO2krKztpPDEwKSIpKTsgLy8gbm90IGluIGphdmEKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZVRvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IC8vIG5vdCBpbiBqYXZhCisgICAgICAgIGFzc2VydEVxdWFscygiMSA8PT4gMiIsIHByZXR0eSgiMTw9PjIiKSk7IC8vIG5vdCBpbiBqYXZhCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEN0b3JDYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygiY2xhc3MgRm9vIHtGb28oaW50IHgpIHt0aGlzKCl9fSIsIHByZXR0eSgiY2xhc3MgRm9ve0ZvbyhpbnQgeCkge3RoaXMoKX19IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNsYXNzIEZvbyB7Rm9vKHgpIHt0aGlzKCl9fSIsIHByZXR0eSgiY2xhc3MgRm9ve0Zvbyh4KSB7dGhpcygpfX0iKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEN0b3JJZGVudCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoImNsYXNzIEZvbyB7cHJpdmF0ZSBGb28oKSB7fX0iLCBwcmV0dHkoImNsYXNzIEZvbyB7cHJpdmF0ZSBGb28oKSB7fX0iKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERlYygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoIi0tYiIsIHByZXR0eSgiLS1iIikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3REaXYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIC8gMiIsIHByZXR0eSgiMS8yIikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3REaXZBc3NpZ24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4IC89IDIiLCBwcmV0dHkoIngvPTIiKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERvdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEudXRpbC5EYXRlIGQgPSBuZXcgamF2YS51dGlsLkRhdGUoKSIsIHByZXR0eSgiamF2YS51dGlsLkRhdGUgZCA9IG5ldyBqYXZhLnV0aWwuRGF0ZSgpIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNsYXNzIEZvbyBleHRlbmRzIGphdmEudXRpbC5EYXRlIHt9IiwgcHJldHR5KCJjbGFzcyBGb28gZXh0ZW5kcyBqYXZhLnV0aWwuRGF0ZSB7fSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28uYmFyLm1vb2t5KCkiLCBwcmV0dHkoImZvby5iYXIubW9va3koKSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYWNrYWdlIGZvby5iYXIiLCBwcmV0dHkoInBhY2thZ2UgZm9vLmJhciIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbXBvcnQgamF2YS51dGlsLkRhdGUiLCBwcmV0dHkoImltcG9ydCBqYXZhLnV0aWwuRGF0ZSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbXBvcnQgamF2YS5pby4qIiwgcHJldHR5KCJpbXBvcnQgamF2YS5pby4qIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkBmb28uQmFyIG1vb2t5IiwgcHJldHR5KCJAZm9vLkJhciBtb29reSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJkZWYgZm9vKCkgdGhyb3dzIGJhci5Nb29reUV4Y2VwdGlvbnt9IiwgcHJldHR5KCJkZWYgZm9vKCkgdGhyb3dzIGJhci5Nb29reUV4Y2VwdGlvbnt9IikpOyAvLyBmYWlscyBhZnRlciBwYXJzZXIKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJkZWYgeCA9IFwiJHtmb28uYmFyfVwiIiwgcHJldHR5KCJkZWYgeCA9IFwiJHtmb28uYmFyfVwiIikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3REeW5hbWljTWVtYmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IC8vIG5vdCBpbiBqYXZhCisgICAgICAgIGFzc2VydEVxdWFscygiZm9vLihiYXIpIiwgcHJldHR5KCJmb28uKGJhcikiKSk7IC8vIG5vdCBpbiBqYXZhCisgICAgICAgIGFzc2VydEVxdWFscygiZm9vLlwiJHtiYXJ9XCIiLCBwcmV0dHkoImZvby5cIiR7YmFyfVwiIikpOyAvLyBub3QgaW4gamF2YQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RFbGlzdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoInByaW50bG4gMiArIDIiLCBwcmV0dHkoInByaW50bG4gMiArIDIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZm9yIChpID0gMDsgaiA9IDI7IGkgPCAxMDsgaSsrOyBqLS0pe3ByaW50IGl9IiwgcHJldHR5KCJmb3IgKGkgPSAwO2ogPSAyO2kgPCAxMDsgaSsrOyBqLS0pIHtwcmludCBpfSIpKTsgLy8gZmFpbHMgYWZ0ZXIgcGFyc2VyCisgICAgICAgIGFzc2VydEVxdWFscygiZm9vKCkiLCBwcmV0dHkoImZvbygpIikpOyAvLyBlbXB0eSBFTElTVAorICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyhiYXIsIG1vb2t5KSIsIHByZXR0eSgiZm9vKCBiYXIgLCBtb29reSApIikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RFbnVtQ29uc3RhbnREZWYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJlbnVtIENvaW4ge1BFTk5ZKDEpLCBESU1FKDEwKSwgUVVBUlRFUigyNSl9IiwgcHJldHR5KCJlbnVtIENvaW4ge1BFTk5ZKDEpLCBESU1FKDEwKSwgUVVBUlRFUigyNSl9IikpOyAvLyBmYWlscyBhZnRlciBwYXJzZXIKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW51bURlZigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoImVudW0gU2Vhc29uIHtXSU5URVIsIFNQUklORywgU1VNTUVSLCBBVVRVTU59IiwgcHJldHR5KCJlbnVtIFNlYXNvbntXSU5URVIsU1BSSU5HLFNVTU1FUixBVVRVTU59IikpOyAvLyBmYWlscyBhZnRlciBwYXJzZXIKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJlbnVtIE9wZXJhdGlvbiB7QURESVRJT057ZG91YmxlIGV2YWwoeCwgeSkge3JldHVybiB4ICsgeX19fSIsIHByZXR0eSgiZW51bSBPcGVyYXRpb24ge0FERElUSU9OIHtkb3VibGUgZXZhbCh4LHkpIHtyZXR1cm4geCArIHl9fX0iKSk7IC8vIGZhaWxzIGFmdGVyIHBhcnNlcgorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RFcXVhbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoImEgPT0gYiIsIHByZXR0eSgiYT09YiIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXNjX0ZBSUxTKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChub3RZZXRJbXBsZW1lbnRlZCgpKSByZXR1cm47CisgICAgICAgIC8vIGRxdW90ZS10YWItZHF1b3RlCisgICAgICAgIGFzc2VydEVxdWFscygicHJpbnRsbiBcIlxcXCJcdFxcXCJcIiIsIHByZXR0eSgicHJpbnRsbiBcIlxcXCJcdFxcXCJcIiIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhwb25lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwcmludGxuIDEuMmUtMTAiLCBwcmV0dHkoInByaW50bG4gMS4yZS0xMCIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhwcl9GQUlMUygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAobm90WWV0SW1wbGVtZW50ZWQoKSkgcmV0dXJuOworICAgICAgICBhc3NlcnRFcXVhbHMoIlN5c3RlbS5vdXQucHJpbnRsbih4KSIsIHByZXR0eSgiU3lzdGVtLm91dC5wcmludGxuKHgpIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoInJldHVybiBmIiwgcHJldHR5KCJyZXR1cm4gZiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28oYmFyKTttb29reShiYXIpIiwgcHJldHR5KCJmb28oYmFyKTttb29reShiYXIpIikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RFeHRlbmRzQ2xhdXNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygiY2xhc3MgRm9vIGV4dGVuZHMgQmFyIHt9IiwgcHJldHR5KCJjbGFzcyBGb28gZXh0ZW5kcyBCYXIge30iKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiaW50ZXJmYWNlIFdpYmJsZSBleHRlbmRzIE1vb2t5e30iLCBwcmV0dHkoImludGVyZmFjZSBXaWJibGUgZXh0ZW5kcyBNb29reSB7fSIpKTsKKyAgICAgICAgLy90b2RvIHNwYWNpbmcgaXMgb2RkLCBjLmYuIGxhc3Qgc3BhY2UgaW4gY2xhc3MgdnMgaW50ZXJmYWNlIGFib3ZlCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZpbmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygicHVibGljIGZpbmFsIGludCBnZXRYKCkge3JldHVybiAwfSIsIHByZXR0eSgicHVibGljIGZpbmFsIGludCBnZXRYKCkge3JldHVybiAwfSIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9yQ29uZGl0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygiZm9yIChpID0gMDsgaSA8IDEwOyBpKyspe3ByaW50bG4gaX0iLCBwcmV0dHkoImZvciAoaT0wO2k8MTA7aSsrKSB7cHJpbnRsbiBpfSIpKTsgLy8gZmFpbHMgYWZ0ZXIgcGFyc2VyCisgICAgfQorCisgICAgLy8gdGVzdEZvckluaXQoKSBjb3ZlcmVkIGJ5IHRlc3RGb3JDb25kaXRpb24oKQorCisgICAgcHVibGljIHZvaWQgdGVzdEZvckluSXRlcmFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsgLy8gbm90IGluIGphdmEKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb3IgKGkgaW4gWzEsIDJdKSB7fSIsIHByZXR0eSgiZm9yIChpIGluIFsxLDJdKSB7fSIpKTsgLy8gbm90IGluIGphdmEKKyAgICB9CisKKyAgICAvLyB0ZXN0Rm9ySXRlcmF0b3IoKSBjb3ZlcmVkIGJ5IHRlc3RGb3JDb25kaXRpb24oKQorCisgICAgcHVibGljIHZvaWQgdGVzdEdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygiaWYgKDYwID49IDcwKSB7fSIsIHByZXR0eSgiaWYgKDYwPj03MCkge30iKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEd0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygiaWYgKDIwNzAgPiAzNTQpIHt9IiwgcHJldHR5KCJpZiAoMjA3MCA+IDM1NCkge30iKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEhleERpZ2l0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygiZGVmIGJhciA9IDB4Q2FGZSIsIHByZXR0eSgiZGVmIGJhciA9IDB4Q2FGZSIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGV4RGlnaXRJblVuaWNvZGVFc2NhcGVfRkFJTFMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG5vdFlldEltcGxlbWVudGVkKCkpIHJldHVybjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJkZWYgZm9vID0gJ1xcdWJhYmUnIiwgcHJldHR5KCJkZWYgZm9vID0gJ1xcdWJhYmUnIikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJZGVudCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyB1c2VkIF9ldmVyeXdoZXJlXyAsIGxldHMgYXNzdW1lIHRoYXQgdGhlIG90aGVyIHNwZWNpZmljCisgICAgICAgIC8vIHRlc3RjYXNlcyBpbmNsdWRlIGVub3VnaCBpZGVudCB1c2FnZSBmb3Igbm93LgorICAgICAgICBhc3NlcnRFcXVhbHMoImZvby5iYXIiLCBwcmV0dHkoImZvby5iYXIiKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEltcGxlbWVudHNDbGF1c2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjbGFzcyBGb28gaW1wbGVtZW50cyBCYXIge30iLCBwcmV0dHkoImNsYXNzIEZvbyBpbXBsZW1lbnRzIEJhciB7fSIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW1wbGljaXRQYXJhbWV0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IC8vIG5vdCBpbiBqYXZhCisgICAgICAgIGFzc2VydEVxdWFscygiWzEsIDIsIDNdLmVhY2gge3ByaW50bG4gaXR9IiwgcHJldHR5KCJbMSwyLDNdLmVhY2h7cHJpbnRsbiBpdH0iKSk7IC8vIG5vdCBpbiBqYXZhCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEltcG9ydCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoImltcG9ydCBmb28uYmFyLldpYmJsZSIsIHByZXR0eSgiaW1wb3J0IGZvby5iYXIuV2liYmxlIikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbmMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIrK3giLCBwcmV0dHkoIisreCIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5kZXhPcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoImZvby5iYXIoKVtmcmVkLndpbG1hKCldIiwgcHJldHR5KCJmb28uYmFyKClbZnJlZC53aWxtYSgpXSIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW50ZXJmYWNlRGVmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vdG9kbywgdGhlIHNwYWNpbmcgaGVyZSBpcy4uLiB1bnVzdWFsCisgICAgICAgIGFzc2VydEVxdWFscygiaW50ZXJmYWNlIEZvb3t2b2lkIGJsYWgoKSB9IiwgcHJldHR5KCJpbnRlcmZhY2UgRm9ve3ZvaWQgYmxhaCgpfSIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFuY2VJbml0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygiY2xhc3MgRm9vIHt7eCA9IDF9fSIsIHByZXR0eSgiY2xhc3MgRm9vIHt7eD0xfX0iKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExhYmVsZWRBcmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsgLy8gbm90IGluIGphdmEKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJteU1ldGhvZChhcmdPbmU6MTIzLCBhcmdUd286MTIzKSIsIHByZXR0eSgibXlNZXRob2QoYXJnT25lOjEyMyxhcmdUd286MTIzKSIpKTsgLy8gbm90IGluIGphdmEKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJteU1hcCA9IFtrZXlPbmU6MTIzLCBrZXlUd286MjM0XSIsIHByZXR0eSgibXlNYXAgPSBba2V5T25lOjEyMyxrZXlUd286MjM0XSIpKTsgLy8gbm90IGluIGphdmEKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGFiZWxlZFN0YXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb286eCA9IDEiLCBwcmV0dHkoImZvbzp4ID0gMSIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGFuZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoInRydWUgJiYgZmFsc2UiLCBwcmV0dHkoInRydWUgJiYgZmFsc2UiKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygiaWYgKDYwIDw9IDcwKSB7fSIsIHByZXR0eSgiaWYgKDYwPD03MCkge30iKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExpc3RDb25zdHJ1Y3RvcigpIHRocm93cyBFeGNlcHRpb24geyAvLyBub3QgaW4gamF2YQorICAgICAgICBhc3NlcnRFcXVhbHMoIlthLCBiXSIsIHByZXR0eSgiW2EsYl0iKSk7IC8vIG5vdCBpbiBqYXZhCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExpdGVyYWxBcygpIHRocm93cyBFeGNlcHRpb24geyAvLyBub3QgaW4gamF2YQorICAgICAgICBhc3NlcnRFcXVhbHMoImltcG9ydCBqYXZhLnV0aWwuRGF0ZSBhcyBNeURhdGUiLCBwcmV0dHkoImltcG9ydCBqYXZhLnV0aWwuRGF0ZSBhcyBNeURhdGUiKSk7IC8vIG5vdCBpbiBqYXZhCisgICAgICAgIC8vIHRvZG8gc3VzcGljaW91cyBzcGFjaW5nIGluIHRoZSBmb2xsb3dpbmcgYXNzZXJ0aW9uCisgICAgICAgIGFzc2VydEVxdWFscygieCA9IDEyIGFzIExvbmciLCBwcmV0dHkoInggPSAxMiBhcyBMb25nIikpOyAvLyBub3QgaW4gamF2YQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMaXRlcmFsQXNzZXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygiYXNzZXJ0IGEgPT0gdHJ1ZSIsIHByZXR0eSgiYXNzZXJ0IGE9PSB0cnVlIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFzc2VydCBiID09IHRydWUgOiA5OSIsIHByZXR0eSgiYXNzZXJ0IGI9PXRydWU6OTkiKSk7CisgICAgICAgIC8vIHRvZG8gaXMgJywnIGRlcHJlY2F0ZWQgbm93PworICAgICAgICAvL2Fzc2VydEVxdWFscygiYXNzZXJ0IGIgPT0gdHJ1ZSAsIDk5IiwgcHJldHR5KCJhc3NlcnQgYj09dHJ1ZSw5OSIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGl0ZXJhbEJvb2xlYW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJib29sZWFuIGIgPSB0cnVlIiwgcHJldHR5KCJib29sZWFuIGIgPXRydWUiKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExpdGVyYWxCcmVhaygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoImZvciAoaSBpbiAxLi4xMDApIHticmVhayB9IiwgcHJldHR5KCJmb3IgKGkgaW4gMS4uMTAwKSB7YnJlYWt9IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoInN3aXRjaCAoZm9vKSB7ZGVmYXVsdDpicmVhayB9IiwgcHJldHR5KCJzd2l0Y2goZm9vKXtkZWZhdWx0OmJyZWFrfSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJkZWYgbXlNZXRob2QoKSB7YnJlYWsgfSIsIHByZXR0eSgiZGVmIG15TWV0aG9kKCl7YnJlYWt9IikpOyAvLyBmYWlscyBhZnRlciBwYXJzZXIKKyAgICAgICAgLy8gZGVwcmVjYXRlZCAtPiBhc3NlcnRFcXVhbHMoImZvciAoaSBpbiAxLi4xMDApIHticmVhayAyfSIsIHByZXR0eSgiZm9yIChpIGluIDEuLjEwMCkge2JyZWFrIDJ9IikpOyAvLyBmYWlscyBhZnRlciBwYXJzZXIKKworICAgICAgICAvL3RvZG8gc2hvdWxkIHRoZSBjb2xvbiBiZSBwb3N0Zml4ZWQgdG8gdGhlIGxhYmVsPworICAgICAgICAvLyBkZXByZWNhdGVkIC0+IGFzc2VydEVxdWFscygiZm9yIChpIGluIDEuLjEwMCkge2JyZWFrIGxhYmVsMTp9IiwgcHJldHR5KCJmb3IgKGkgaW4gMS4uMTAwKSB7YnJlYWsgbGFiZWwxOn0iKSk7IC8vIGZhaWxzIGFmdGVyIHBhcnNlcgorICAgICAgICBhc3NlcnRFcXVhbHMoImZvciAoaSBpbiAxLi4xMDApIHticmVhayBsYWJlbDF9IiwgcHJldHR5KCJmb3IgKGkgaW4gMS4uMTAwKSB7YnJlYWsgbGFiZWwxfSIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGl0ZXJhbEJ5dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJieXRlIGIgPSAxIiwgcHJldHR5KCJieXRlIGI9MSIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGl0ZXJhbENhc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzd2l0Y2ggKGZvbykge2Nhc2UgMTp4ID0gM30iLCBwcmV0dHkoInN3aXRjaChmb28pe2Nhc2UgMTp4PTN9IikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMaXRlcmFsQ2F0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0cnkge30gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fSIsIHByZXR0eSgidHJ5IHt9IGNhdGNoIChFeGNlcHRpb24gZSkge30iKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidHJ5IHt9IGNhdGNoIChFeGNlcHRpb24gZTEpIHt9IGNhdGNoIChFeGNlcHRpb24yIGUyKSB7fSIsIHByZXR0eSgidHJ5IHt9IGNhdGNoIChFeGNlcHRpb24gZTEpIHt9IGNhdGNoIChFeGNlcHRpb24yIGUyKSB7fSIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGl0ZXJhbENoYXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjaGFyIGMgPSBcImFcIiIsIHByZXR0eSgiY2hhciBjID0gXCJhXCIiKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExpdGVyYWxDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoInB1YmxpYyBjbGFzcyBGb28ge2ludCBiYXJ9IiwgcHJldHR5KCJwdWJsaWMgY2xhc3MgRm9ve2ludCBiYXJ9IikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMaXRlcmFsQ29udGludWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb3IgKGkgaW4gMS4uMTAwKSB7Y29udGludWUgfSIsIHByZXR0eSgiZm9yIChpIGluIDEuLjEwMCkge2NvbnRpbnVlfSIpKTsKKyAgICAgICAgLy8gZGVwcmVjYXRlZCAtPiBhc3NlcnRFcXVhbHMoImZvciAoaSBpbiAxLi4xMDApIHtjb250aW51ZSAyfSIsIHByZXR0eSgiZm9yIChpIGluIDEuLjEwMCkge2NvbnRpbnVlIDJ9IikpOyAvLyBmYWlscyBhZnRlciBwYXJzZXIKKworICAgICAgICAvL3RvZG8gc2hvdWxkIHRoZSBjb2xvbiBiZSBwb3N0Zml4ZWQgdG8gdGhlIGxhYmVsPworICAgICAgICAvLyBkZXByZWNhdGUgLT4gYXNzZXJ0RXF1YWxzKCJmb3IgKGkgaW4gMS4uMTAwKSB7Y29udGludWUgbGFiZWwxOn0iLCBwcmV0dHkoImZvciAoaSBpbiAxLi4xMDApIHtjb250aW51ZSBsYWJlbDE6fSIpKTsgLy8gZmFpbHMgYWZ0ZXIgcGFyc2VyCisgICAgICAgIGFzc2VydEVxdWFscygiZm9yIChpIGluIDEuLjEwMCkge2NvbnRpbnVlIGxhYmVsMX0iLCBwcmV0dHkoImZvciAoaSBpbiAxLi4xMDApIHtjb250aW51ZSBsYWJlbDF9IikpOyAvLyBmYWlscyBhZnRlciBwYXJzZXIKKyAgICAgICAgCisgICAgICAgIGFzc2VydEVxdWFscygiWzEsIDIsIDNdLmVhY2gge2NvbnRpbnVlIH0iLCBwcmV0dHkoIlsxLDIsM10uZWFjaHtjb250aW51ZX0iKSk7IC8vIGZhaWxzIGFmdGVyIHBhcnNlcgorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMaXRlcmFsRGVmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IC8vIG5vdCBpbiBqYXZhCisgICAgICAgIGFzc2VydEVxdWFscygiZGVmIHggPSAxMjMiLCBwcmV0dHkoImRlZiB4PTEyMyIpKTsgLy8gbm90IGluIGphdmEKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJkZWYgbXlNZXRob2QoKSB7cmV0dXJuIDB9IiwgcHJldHR5KCJkZWYgbXlNZXRob2QoKXtyZXR1cm4gMH0iKSk7IC8vIG5vdCBpbiBqYXZhCisgICAgICAgIC8vIG5vdGU6IGRlZiBub3QgbmVlZGVkIGluIHBhcmFtZXRlciBkZWNsYXJhdGlvbnMsIGJ1dCBpdCBpcyB2YWxpZAorICAgICAgICAvL3RvZG86IGlzIGl0IG9rIHRvIHN0cmlwIG91dCAnZGVmJyBmcm9tIHBhcmFtZXRlciBkZWNsYXJhdGlvbnM/CisgICAgICAgIGFzc2VydEVxdWFscygiZGVmIGZvbyhiYXIpIHt9IiwgcHJldHR5KCJkZWYgZm9vKGRlZiBiYXIpe30iKSk7IC8vIG5vdCBpbiBqYXZhCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExpdGVyYWxEZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygic3dpdGNoIChmb28pIHtkZWZhdWx0OnggPSAyfSIsIHByZXR0eSgic3dpdGNoKGZvbyl7ZGVmYXVsdDp4PTJ9IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoInB1YmxpYyBAaW50ZXJmYWNlIEZvb3tpbnQgYmFyKCkgZGVmYXVsdCAxMjN9IiwgcHJldHR5KCJwdWJsaWMgQGludGVyZmFjZSBGb297aW50IGJhcigpIGRlZmF1bHQgMTIzfSIpKTsgLy8gZmFpbHMgYWZ0ZXIgcGFyc2VyCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExpdGVyYWxEb3VibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJkb3VibGUgZCA9IDEuMCIsIHByZXR0eSgiZG91YmxlIGQgPSAxLjAiKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExpdGVyYWxFbHNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygiaWYgKGZhbHNlKSB7YSA9IDF9IGVsc2Uge2EgPSAyfSIsIHByZXR0eSgiaWYgKGZhbHNlKSB7YT0xfSBlbHNlIHthPTJ9IikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMaXRlcmFsRW51bSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoImVudW0gU2Vhc29uIHtXSU5URVIsIFNQUklORywgU1VNTUVSLCBBVVRVTU59IiwgcHJldHR5KCJlbnVtIFNlYXNvbntXSU5URVIsU1BSSU5HLFNVTU1FUixBVVRVTU59IikpOyAvLyBmYWlscyBhZnRlciBwYXJzZXIKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGl0ZXJhbEV4dGVuZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjbGFzcyBGb28gZXh0ZW5kcyBqYXZhLnV0aWwuRGF0ZSB7fSIsIHByZXR0eSgiY2xhc3MgRm9vIGV4dGVuZHMgamF2YS51dGlsLkRhdGUge30iKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY2xhc3MgRm9vIGV4dGVuZHMgQmFyIHt9IiwgcHJldHR5KCJjbGFzcyBGb28gZXh0ZW5kcyBCYXIge30iKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiaW50ZXJmYWNlIFdpYmJsZSBleHRlbmRzIE1vb2t5e30iLCBwcmV0dHkoImludGVyZmFjZSBXaWJibGUgZXh0ZW5kcyBNb29reSB7fSIpKTsKKyAgICAgICAgLy90b2RvIHNwYWNpbmcgaXMgb2RkLCBjLmYuIGxhc3Qgc3BhY2UgaW4gY2xhc3MgdnMgaW50ZXJmYWNlIGFib3ZlCisgICAgICAgIGFzc2VydEVxdWFscygicHVibGljIGJvb2xlYW4gcHJvY2VzcyhTZXQ8PyBleHRlbmRzIFR5cGVFbGVtZW50PiBhbm5vdGF0aW9ucykge3ByaW50bG4gYW5ub3RhdGlvbnN9IiwgcHJldHR5KCJwdWJsaWMgYm9vbGVhbiBwcm9jZXNzKFNldDw/IGV4dGVuZHMgVHlwZUVsZW1lbnQ+IGFubm90YXRpb25zKSB7cHJpbnRsbiBhbm5vdGF0aW9uc30iKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExpdGVyYWxGYWxzZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoImlmIChmYWxzZSkge30iLCBwcmV0dHkoImlmIChmYWxzZSkge30iKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExpdGVyYWxGaW5hbGx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygidHJ5IHt9ZmluYWxseSB7fSIsIHByZXR0eSgidHJ5IHt9ZmluYWxseSB7fSIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGl0ZXJhbEZsb2F0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygiZmxvYXQgeCIsIHByZXR0eSgiZmxvYXQgeCIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGl0ZXJhbEZvcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoImZvciAoaSBpbiBbMSwgMiwgM10pIHt9IiwgcHJldHR5KCJmb3IgKGkgaW4gWzEsMiwzXSkge30iKSk7CisgICAgICAgIC8vIGNoZWNrIG5vbi1icmFjZWQgc2luZ2xlIHN0YXRlbWVudAorICAgICAgICBhc3NlcnRFcXVhbHMoImZvciAoaSBpbiAxLi4xMDApIHJvdGF0ZUFudGlDbG9ja3dpc2UoKSIsIHByZXR0eSgiZm9yIChpIGluIDEuLjEwMCkgcm90YXRlQW50aUNsb2Nrd2lzZSgpIikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMaXRlcmFsSWYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpZiAoYSA9PSBiKSByZXR1cm4gZmFsc2UiLCBwcmV0dHkoImlmIChhPT1iKSByZXR1cm4gZmFsc2UiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiaWYgKGEgPT0gYikge30iLCBwcmV0dHkoImlmIChhPT1iKSB7fSIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGl0ZXJhbEltcGxlbWVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjbGFzcyBGb28gaW1wbGVtZW50cyBCYXIge30iLCBwcmV0dHkoImNsYXNzIEZvbyBpbXBsZW1lbnRzIEJhciB7fSIpKTsKKworICAgICAgICAvL3RvZG8gdGhlIGZvbGxvd2luZyBpcyBsZWdhbCBKYXZhLCBidXQgcHJldHR5IHN0cmFuZ2UuLi4/CisgICAgICAgIGFzc2VydEVxdWFscygiZW51bSBFYXJ0aFNlYXNvbiBpbXBsZW1lbnRzIFNlYXNvbiB7U1BSSU5HfSIsIHByZXR0eSgiZW51bSBFYXJ0aFNlYXNvbiBpbXBsZW1lbnRzIFNlYXNvbntTUFJJTkd9IikpOyAvLyBmYWlscyBhZnRlciBwYXJzZXIKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGl0ZXJhbEltcG9ydCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoImltcG9ydCBmb28uQmFyIiwgcHJldHR5KCJpbXBvcnQgZm9vLkJhciIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbXBvcnQgbW9va3kuKiIsIHByZXR0eSgiaW1wb3J0IG1vb2t5LioiKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExpdGVyYWxJbigpIHRocm93cyBFeGNlcHRpb24geyAvLyBub3QgaW4gamF2YQorICAgICAgICBhc3NlcnRFcXVhbHMoImZvciAoaSBpbiAxLi4xMCkge30iLCBwcmV0dHkoImZvciAoaSBpbiAxLi4xMCkge30iKSk7IC8vIG5vdCBpbiBqYXZhCisgICAgICAgIGFzc2VydEVxdWFscygiaWYgKGkgaW4gbXlMaXN0KSB7fSIsIHByZXR0eSgiaWYgKGkgaW4gbXlMaXN0KSB7fSIpKTsgLy8gbm90IGluIGphdmEKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGl0ZXJhbEluc3RhbmNlT2YoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpZiAoYSBpbnN0YW5jZW9mIFN0cmluZykge30iLCBwcmV0dHkoImlmIChhIGluc3RhbmNlb2YgU3RyaW5nKSB7fSIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGl0ZXJhbEludCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoImludCBhIiwgcHJldHR5KCJpbnQgYSIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGl0ZXJhbEludGVyZmFjZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoImludGVyZmFjZSBGb297fSIsIHByZXR0eSgiaW50ZXJmYWNlIEZvb3t9IikpOyAvLyBmYWlscyBhZnRlciBwYXJzZXIKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGl0ZXJhbExvbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJsb25nIGEgPSAxIiwgcHJldHR5KCJsb25nIGEgPSAxIikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMaXRlcmFsTmF0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygicHVibGljIGNsYXNzIFIge3B1YmxpYyBuYXRpdmUgdm9pZCBzZWVrKGxvbmcgcG9zKSB9IiwgcHJldHR5KCJwdWJsaWMgY2xhc3MgUntwdWJsaWMgbmF0aXZlIHZvaWQgc2Vlayhsb25nIHBvcyl9IikpOyAvLyBmYWlscyBhZnRlciBwYXJzZXIKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJuYXRpdmUgZm9vKCkgIiwgcHJldHR5KCJuYXRpdmUgZm9vKCkiKSk7IC8vIGZhaWxzIGFmdGVyIHBhcnNlcgorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMaXRlcmFsTmV3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygibmV3IEZvbygpIiwgcHJldHR5KCJuZXcgRm9vKCkiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZGVmIHggPSBuZXcgaW50WzVdIiwgcHJldHR5KCJkZWYgeCA9IG5ldyBpbnRbNV0iKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExpdGVyYWxOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygiZGVmIGZvbyA9IG51bGwiLCBwcmV0dHkoImRlZiBmb289bnVsbCIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGl0ZXJhbFBhY2thZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYWNrYWdlIGZvby5iYXIiLCBwcmV0dHkoInBhY2thZ2UgZm9vLmJhciIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGl0ZXJhbFByaXZhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwcml2YXRlIGJhciIsIHByZXR0eSgicHJpdmF0ZSBiYXIiKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExpdGVyYWxQcm90ZWN0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwcm90ZWN0ZWQgbW9va3kiLCBwcmV0dHkoInByb3RlY3RlZCBtb29reSIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGl0ZXJhbFB1YmxpYygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoInB1YmxpYyBmb28iLCBwcmV0dHkoInB1YmxpYyBmb28iKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExpdGVyYWxSZXR1cm4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJkZWYgZm9vKCkge3JldHVybiBmYWxzZX0iLCBwcmV0dHkoImRlZiAgZm9vKCkgeyByZXR1cm4gZmFsc2UgfSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2b2lkIGJhcigpIHtyZXR1cm4gfSIsIHByZXR0eSgidm9pZCBiYXIoKSB7cmV0dXJufSIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGl0ZXJhbFNob3J0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygic2hvcnQgYSA9IDEiLCBwcmV0dHkoInNob3J0IGEgPSAxIikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMaXRlcmFsU3RhdGljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygic3RhdGljIHZvaWQgZm9vKCkge30iLCBwcmV0dHkoInN0YXRpYyB2b2lkIGZvbygpIHt9IikpOworICAgICAgICAvL2NsYXNzZXMsIGludGVyZmFjZXMsIGNsYXNzL2luc3RhbmNlIHZhcnMgYW5kIG1ldGhvZHMKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzdGF0aWMgaW50IGJhciA9IDEiLCBwcmV0dHkoInN0YXRpYyBpbnQgYmFyID0gMSIpKTsKKyAgICAgICAgLy90b2RvOiB0aGlzIHNob3VsZCBwYXJzZS4uLiBhc3NlcnRFcXVhbHMoInByaXZhdGUgc3RhdGljIDxUPiB2b2lkIGZvbyhMaXN0PFQ+IGxpc3Qpe30iLCBwcmV0dHkoInByaXZhdGUgc3RhdGljIDxUPiB2b2lkIGZvbyhMaXN0PFQ+IGxpc3Qpe30iKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjbGFzcyBGb28ge3N0YXRpYyB7YmFyID0gMX19IiwgcHJldHR5KCJjbGFzcyBGb297c3RhdGljIHtiYXI9MX19IikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMaXRlcmFsU3VwZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjbGFzcyBGb28ge3B1YmxpYyBGb28oKSB7c3VwZXIoKX19IiwgcHJldHR5KCJjbGFzcyBGb297cHVibGljIEZvbygpe3N1cGVyKCl9fSIpKTsKKworICAgICAgICAvLyB0b2RvIHdpbGwgJ3N1cGVyJyBiZSBhbGxvd2VkIGluIG5vbi1wYXJlbnRoZXNlcyBtZXRob2QgY2FsbCBzdHlsZXM/CisgICAgICAgIGFzc2VydEVxdWFscygiY2xhc3MgQmFyIHtwdWJsaWMgQmFyKCkge3N1cGVyIDk5fX0iLCBwcmV0dHkoImNsYXNzIEJhcntwdWJsaWMgQmFyKCl7c3VwZXIgOTl9fSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjbGFzcyBCYXIge3B1YmxpYyBCYXIoKSB7c3VwZXIoMSwgMiwgMyl9fSIsIHByZXR0eSgiY2xhc3MgQmFye3B1YmxpYyBCYXIoKXtzdXBlcigxLDIsMyl9fSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwcmludGxuKHN1cGVyLnRvU3RyaW5nKCkpIiwgcHJldHR5KCJwcmludGxuKHN1cGVyLnRvU3RyaW5nKCkpIikpOworICAgICAgICAvL3RvZG86IGRvZXNuJ3QgcGFyc2UgY29ycmVjdGx5Li4uICAgYXNzZXJ0RXF1YWxzKCJjbGFzcyBGb288VCBzdXBlciBDPiB7VCB0fSIscHJldHR5KCJjbGFzcyBGb288VCBzdXBlciBDPiB7VCB0fSIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGl0ZXJhbFN3aXRjaCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoInN3aXRjaCAoZm9vKSB7Y2FzZSBiYXI6eCA9IDJ9IiwgcHJldHR5KCJzd2l0Y2goZm9vKXtjYXNlIGJhcjp4PTJ9IikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMaXRlcmFsU3luY2hyb25pemVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygic3luY2hyb25pemVkIGZvbygpIHt9IiwgcHJldHR5KCJzeW5jaHJvbml6ZWQgZm9vKCl7fSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzeW5jaHJvbml6ZWQgKHQpIHtkb1N0dWZmKHQpfSIsIHByZXR0eSgic3luY2hyb25pemVkICh0KSB7ZG9TdHVmZih0KX0iKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExpdGVyYWxUaGlzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygidGhpcyIsIHByZXR0eSgidGhpcyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0aGlzIDIiLCBwcmV0dHkoInRoaXMgMiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0aGlzKCkiLCBwcmV0dHkoInRoaXMoKSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0aGlzKDEsIDIsIDMpIiwgcHJldHR5KCJ0aGlzKDEsMiwzKSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0aGlzLnggPSB0aGlzLnkiLCBwcmV0dHkoInRoaXMueD10aGlzLnkiKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExpdGVyYWxUaHJlYWRzYWZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygidGhyZWFkc2FmZSBmb28oKSB7fSIsIHByZXR0eSgidGhyZWFkc2FmZSBmb28oKSB7fSIpKTsgLy8gZmFpbHMgYWZ0ZXIgcGFyc2VyCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExpdGVyYWxUaHJvdygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoImRlZiBmb28oKSB7aWYgKGZhbHNlKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpfSIsIHByZXR0eSgiZGVmIGZvbygpIHtpZiAoZmFsc2UpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCl9IikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMaXRlcmFsVGhyb3dzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vdG9kbyBBbnRsclBhcnNlclBsdWdpbjogVW5leHBlY3RlZCBub2RlIHR5cGU6ICcuJyBmb3VuZCB3aGVuIGV4cGVjdGluZyB0eXBlOiBhbiBpZGVudGlmaWVyCisgICAgICAgIGFzc2VydEVxdWFscygiZGVmIGZvbygpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9ue30iLCBwcmV0dHkoImRlZiBmb28oKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbnt9IikpOyAvLyBmYWlscyBhZnRlciBwYXJzZXIKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGl0ZXJhbFRyYW5zaWVudCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoInRyYW5zaWVudCBiYXIiLCBwcmV0dHkoInRyYW5zaWVudCBiYXIiKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExpdGVyYWxUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygiZm9vID0gdHJ1ZSIsIHByZXR0eSgiZm9vID0gdHJ1ZSIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGl0ZXJhbFRyeSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoInRyeSB7fSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9IiwgcHJldHR5KCJ0cnkge30gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fSIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGl0ZXJhbFZvaWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2b2lkIGZvbygpIHt9IiwgcHJldHR5KCJ2b2lkIGZvbygpe30iKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExpdGVyYWxWb2xhdGlsZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoInZvbGF0aWxlIG1vb2t5IiwgcHJldHR5KCJ2b2xhdGlsZSBtb29reSIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGl0ZXJhbFdoaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygid2hpbGUgKHRydWUpIHt9IiwgcHJldHR5KCJ3aGlsZSh0cnVlKXt9IikpOworICAgIH0KKworLy8gZGVwcmVjYXRlZAorLy8gICAgcHVibGljIHZvaWQgdGVzdExpdGVyYWxXaXRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IC8vIG5vdCBpbiBqYXZhCisvLyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3aXRoIChteU9iamVjdCkge3ggPSAxfSIsIHByZXR0eSgid2l0aChteU9iamVjdCkge3ggPSAxfSIpKTsgLy8gZmFpbHMgYWZ0ZXIgcGFyc2VyIC8vIG5vdCBpbiBqYXZhCisvLyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG5vdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoImlmICghaXNSYWluaW5nKSB7fSIsIHByZXR0eSgiaWYgKCFpc1JhaW5pbmcpIHt9IikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMb3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0cnVlIHx8IGZhbHNlIiwgcHJldHR5KCJ0cnVlIHx8IGZhbHNlIikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMcGFyZW5fRkFJTFMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG5vdFlldEltcGxlbWVudGVkKCkpIHJldHVybjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb3IgKGkgaW4gKGhpc3Rvcnkuc2l6ZSgpIC0gMSkuLjApIHt9IiwgcHJldHR5KCJmb3IgKGkgaW4gKGhpc3Rvcnkuc2l6ZSgpIC0gMSkuLjApIHt9IikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoImlmICgzLjRmIDwgMTJmKSB7fSIsIHByZXR0eSgiaWYgKDMuNGYgPCAxMmYpIHt9IikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RNYXBDb25zdHJ1Y3RvcigpIHRocm93cyBFeGNlcHRpb24geyAvLyBub3QgaW4gamF2YQorICAgICAgICBhc3NlcnRFcXVhbHMoIk1hcCBmb28gPSBbOl0iLCBwcmV0dHkoIk1hcCBmb28gPSBbOl0iKSk7IC8vIG5vdCBpbiBqYXZhCisgICAgICAgIGFzc2VydEVxdWFscygiW2E6MSwgYjoyXSIsIHByZXR0eSgiW2E6MSxiOjJdIikpOyAvLyBub3QgaW4gamF2YQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RNZW1iZXJQb2ludGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IC8vIG5vdCBpbiBqYXZhCisgICAgICAgIGFzc2VydEVxdWFscygiZGVmIHggPSBmb28uJmJhcigpIiwgcHJldHR5KCJkZWYgeD1mb28uJmJhcigpIikpOyAvLyBub3QgaW4gamF2YQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2RDYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygiZm9vKGJhcikiLCBwcmV0dHkoImZvbyhiYXIpIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlsxLCAyLCAzXS5lYWNoIHtwcmludGxuIGl0fSIsIHByZXR0eSgiWzEsMiwzXS5lYWNoe3ByaW50bG4gaXR9IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyhiYXIpe21vb2t5KCl9IiwgcHJldHR5KCJmb28oYmFyKXttb29reSgpfSIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kRGVmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygiZGVmIGZvbyhpbnQgYmFyLCBib29sZWFuIGJvbykge30iLCBwcmV0dHkoImRlZiBmb28oaW50IGJhcixib29sZWFuIGJvbykge30iKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE1pbnVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygiZGVmIGJhciA9IDQgLSBmb28iLCBwcmV0dHkoImRlZiBiYXI9NC1mb28iKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE1pbnVzQXNzaWduKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygieCAtPSAyMyIsIHByZXR0eSgieCAtPSAyMyIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygieCA9IDQgJSAzIiwgcHJldHR5KCJ4ID0gNCAlIDMiKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE1vZGlmaWVycygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoInB1YmxpYyBzdGF0aWMgdHJhbnNpZW50IGZpbmFsIG5hdGl2ZSB0aHJlYWRzYWZlIHN5bmNocm9uaXplZCB2b2xhdGlsZSBzdHJpY3RmcCBmb28oKSB7fSIsIHByZXR0eSgicHVibGljIHN0YXRpYyB0cmFuc2llbnQgZmluYWwgbmF0aXZlIHRocmVhZHNhZmUgc3luY2hyb25pemVkIHZvbGF0aWxlIHN0cmljdGZwIGZvbygpIHt9IikpOyAvLyBmYWlscyBhZnRlciBwYXJzZXIKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kQXNzaWduKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygieCAlPSAyMyIsIHByZXR0eSgieCAlPSAyMyIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90RXF1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhICE9IGIiLCBwcmV0dHkoImEhPWIiKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE51bUJpZ0RlY2ltYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsgLy8gbm90IGluIGphdmEKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhID0gOS44ZyIsIHByZXR0eSgiYSAgPTkuOGciKSk7IC8vIG5vdCBpbiBqYXZhCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE51bUJpZ0ludCgpIHRocm93cyBFeGNlcHRpb24geyAvLyBub3QgaW4gamF2YQorICAgICAgICBhc3NlcnRFcXVhbHMoImEgPSAxMmciLCBwcmV0dHkoImE9ICAgMTJnIikpOyAvLyBub3QgaW4gamF2YQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROdW1Eb3VibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiID0gMzQuNGQiLCBwcmV0dHkoImI9MzQuNGQiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYiA9IDM0LjREIiwgcHJldHR5KCJiPTM0LjREIikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROdW1GbG9hdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoImIgPSAzNC40ZiIsIHByZXR0eSgiYj0zNC40ZiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiID0gMzQuNEYiLCBwcmV0dHkoImI9MzQuNEYiKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE51bUludCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoImEgPSAxMiIsIHByZXR0eSgiYT0xMiIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TnVtTG9uZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoImEgPSAxMmwiLCBwcmV0dHkoImE9MTJsIikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RPYmpibG9jaygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoImNsYXNzIEZvbyB7ZGVmIGJhcn0iLCBwcmV0dHkoImNsYXNzIEZvbyB7ZGVmIGJhcn0iKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE9wdGlvbmFsRG90KCkgdGhyb3dzIEV4Y2VwdGlvbiB7IC8vIG5vdCBpbiBqYXZhCisgICAgICAgIGFzc2VydEVxdWFscygiZm9vID0gZW5nbGFuZC5sb25kb24ua2luZ3M/LmhlYWQiLCBwcmV0dHkoImZvbyA9IGVuZ2xhbmQubG9uZG9uLmtpbmdzPy5oZWFkIikpOyAvLyBub3QgaW4gamF2YQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQYWNrYWdlRGVmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygicGFja2FnZSBmb28uYmFyIiwgcHJldHR5KCJwYWNrYWdlIGZvby5iYXIiKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFBhcmFtZXRlckRlZigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoImRlZiBmb28oYmFyKSB7fSIsIHByZXR0eSgiZGVmIGZvbyhiYXIpe30iKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZGVmIGZvbyhTdHJpbmcgYmFyLCBTdHJpbmcgbW9va3kpIHt9IiwgcHJldHR5KCJkZWYgZm9vKFN0cmluZyBiYXIsIFN0cmluZyBtb29reSl7fSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJkZWYgYyA9IHt4IC0+IHByaW50bG4geH0iLCBwcmV0dHkoImRlZiBjID0ge3gtPnByaW50bG4geH0iKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZGVmIGMgPSB7eCx5IC0+IHByaW50bG4oeCArIHkpfSIsIHByZXR0eSgiZGVmIGM9e3gseS0+cHJpbnRsbih4K3kpfSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJkZWYgYyA9IHtpbnQgeCxpbnQgeSAtPiBwcmludGxuKHggKyB5KX0iLCBwcmV0dHkoImRlZiBjPXtpbnQgeCwgaW50IHktPnByaW50bG4oeCt5KX0iKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFBhcmFtZXRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJkZWYgZm9vKFN0cmluZyBiYXIsIFN0cmluZyBtb29reSkge30iLCBwcmV0dHkoImRlZiBmb28oU3RyaW5nIGJhciwgU3RyaW5nIG1vb2t5KXt9IikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQbHVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygiYSArIGIiLCBwcmV0dHkoImErYiIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGx1c0Fzc2lnbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoInggKz0gMjMiLCBwcmV0dHkoInggKz0gMjMiKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFBvc3REZWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhLS0iLCBwcmV0dHkoImEtLSIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdEluYygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoImErKyIsIHByZXR0eSgiYSsrIikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RRdWVzdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyA9PSBiYXI/MTA6MjAiLCBwcmV0dHkoImZvbz09YmFyPzEwOjIwIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoInB1YmxpYyBib29sZWFuIHByb2Nlc3MoU2V0PD8gZXh0ZW5kcyBCPiBhKSB7cHJpbnRsbiBhfSIsIHByZXR0eSgicHVibGljIGJvb2xlYW4gcHJvY2VzcyhTZXQ8PyBleHRlbmRzIEI+IGEpIHtwcmludGxuIGF9IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoInB1YmxpYyBib29sZWFuIHByb2Nlc3MoU2V0PD8gZXh0ZW5kcyBCLCA/IHN1cGVyIEM+IGEpIHtwcmludGxuIGF9IiwgcHJldHR5KCJwdWJsaWMgYm9vbGVhbiBwcm9jZXNzKFNldDw/IGV4dGVuZHMgQiwgPyBzdXBlciBDPiBhKSB7cHJpbnRsbiBhfSIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmFuZ2VFeGNsdXNpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsgLy8gbm90IGluIGphdmEKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb29bNDUuLjw4OV0iLCBwcmV0dHkoImZvb1s0NSAuLjwgODldIikpOyAvLyBub3QgaW4gamF2YQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSYW5nZUluY2x1c2l2ZSgpIHRocm93cyBFeGNlcHRpb24geyAvLyBub3QgaW4gamF2YQorICAgICAgICBhc3NlcnRFcXVhbHMoImZvb1tiYXIuLjEyXSIsIHByZXR0eSgiZm9vW2JhciAuLiAxMl0iKSk7IC8vIG5vdCBpbiBqYXZhCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlZ2V4cExpdGVyYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsgLy8gbm90IGluIGphdmEKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwcmludGxuIiwgcHJldHR5KCJwcmludGxuIC8vIikpOyAvLyBlbXB0eSByZWdleHBfbGl0ZXJhbCBzaG91bGQgYmUgdHJlYXRlZCBhcyBzaW5nbGUgbGluZSBjb21tZW50IC8vIG5vdCBpbiBqYXZhCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlZ2V4cExpdGVyYWxfRkFJTFMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG5vdFlldEltcGxlbWVudGVkKCkpIHJldHVybjsgLy8gbm90IGluIGphdmEKKyAgICAgICAgLy90b2RvOiB0aGVzZSBmYWlsIGJlY2F1c2UgcmVnZXhwX2xpdGVyYWxzIGFyZSBjb252ZXJ0ZWQgaW50byBzdHJpbmdfbGl0ZXJhbHMgb24gdGhlIGFudGxyIEFTVAorICAgICAgICBhc3NlcnRFcXVhbHMoImRlZiB4ID0gLy4vIiwgcHJldHR5KCJkZWYgeCA9IC8uLyIpKTsgLy8gbm90IGluIGphdmEKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJkZWYgeiA9IC9ibGFoXFxzLyIsIHByZXR0eSgiZGVmIHogPSAvYmxhaFxccy8iKSk7IC8vIGFjdHVhbGx5OiBkZWYgeiA9IC9ibGFoXHMvIC8vIG5vdCBpbiBqYXZhCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlZ2V4RmluZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoImRlZiBtID0gZm9vID1+IFwiYmFyXCIiLCBwcmV0dHkoImRlZiBtID0gZm9vID1+IFwiYmFyXCIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiaWYgKGZvbyA9fiBcImJhclwiKSB7fSIsIHByZXR0eSgiaWYgKGZvbz1+XCJiYXJcIil7fSIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVnZXhNYXRjaCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoImlmIChmb28gPT1+IFwiYmFyXCIpIHt9IiwgcHJldHR5KCJpZiAoZm9vPT1+XCJiYXJcIil7fSIpKTsKKyAgICB9CisKKy8vIGRlcHJlY2F0ZWQKKy8vICAgIHB1YmxpYyB2b2lkIHRlc3RTY29wZUVzY2FwZSgpIHRocm93cyBFeGNlcHRpb24geyAvLyBub3QgaW4gamF2YQorLy8gICAgICAgIGFzc2VydEVxdWFscygicHJpbnRsbihbJHgsIHgsIHldKSIsIHByZXR0eSgicHJpbnRsbihbJHgsIHgsIHldKSIpKTsgLy8gZmFpbHMgYWZ0ZXIgcGFyc2VyIC8vIG5vdCBpbiBqYXZhCisvLyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0U2xvdCgpIHRocm93cyBFeGNlcHRpb24geyAvLyBub3QgaW4gamF2YQorICAgICAgICBhc3NlcnRFcXVhbHMoImRlZiB4ID0gZm9vLkBiYXIiLCBwcmV0dHkoImRlZiB4ID0gZm9vIC4gQCBiYXIiKSk7IC8vIG5vdCBpbiBqYXZhCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygiZm9vIDw8IDEyMyIsIHByZXR0eSgiZm9vIDw8IDEyMyIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2xBc3NpZ24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28gPDw9IDEyMyIsIHByZXR0eSgiZm9vIDw8PSAxMjMiKSk7IC8vIGRvZXMgdGhpcyBvcGVyYXRvciBtYWtlIGFueSBzZW5zZT8KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2xpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjbGFzcyBGb28ge3ByaXZhdGUgRm9vKCkge3ByaW50bG4gYmFyfX0iLCBwcmV0dHkoImNsYXNzIEZvbyB7cHJpdmF0ZSBGb28oKSB7cHJpbnRsbiBiYXJ9fSIpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImlmICh0cnVlKSB7Zm9vfSIsIHByZXR0eSgiaWYgKHRydWUpIHtmb299IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoImRlZiB4ID0gZm9vLntiYXJ9IiwgcHJldHR5KCJkZWYgeCA9IGZvby57YmFyfSIpKTsgLy8gdG9kbyAtIGlubGluZSBvcGVuIGJsb2NrIGlzIGdyZWF0LCBidXQgaXQgZG9lc24ndCB3b3JrIGFzIG9uZSB3b3VsZCBleHBlY3QgKHlldCkuIChjLmYuIHdpdGgpCisgICAgICAgIGFzc2VydEVxdWFscygiZGVmIGZvbygpIHtsOnt4ID0gMn19IiwgcHJldHR5KCJkZWYgZm9vKCl7bDp7eD0yfX0iKSk7IC8vIHNsaXN0IGluc2lkZSBhIG1ldGhvZCBib2R5IChuZWVkZWQgbGFiZWwgdG8gZGlzdGluZ3Vpc2ggZnJvbSBhIGNsb3N1cmUpCisgICAgICAgIGFzc2VydEVxdWFscygic3dpdGNoIChmKSB7Y2FzZSAxOmJyZWFrIH0iLCBwcmV0dHkoInN3aXRjaChmKXtjYXNlIDE6YnJlYWt9IikpOyAvLyBzbGlzdCBpbnNpZGUgZWFjaCBjYXNlIGJvZHkuLi4KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3ByZWFkQXJnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IC8vIG5vdCBpbiBqYXZhCisgICAgICAgIGFzc2VydEVxdWFscygiZigqW2EsIGIsIGNdKSIsIHByZXR0eSgiZigqW2EsYixjXSkiKSk7IC8vIG5vdCBpbiBqYXZhCisgICAgICAgIGFzc2VydEVxdWFscygiZigqbnVsbCkiLCBwcmV0dHkoImYoKm51bGwpIikpOyAvLyBlcXVpdiB0byBmKCkgLy8gbm90IGluIGphdmEKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3ByZWFkRG90KCkgdGhyb3dzIEV4Y2VwdGlvbiB7IC8vIG5vdCBpbiBqYXZhCisgICAgICAgIGFzc2VydEVxdWFscygicHJpbnRsbihbW2E6MSwgYjoyXSwgW2E6MywgYjo0XV0qLmEpIiwgcHJldHR5KCJwcmludGxuKFtbYToxLGI6Ml0sW2E6MyxiOjRdXSouYSkiKSk7ICAvLyBub3QgaW4gamF2YQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTcHJlYWRNYXBBcmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsgLy8gbm90IGluIGphdmEKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmKCo6bXlNYXApIiwgcHJldHR5KCJmKCo6bXlNYXApIikpOyAvLyBub3QgaW4gamF2YQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyA+PiAxMjMiLCBwcmV0dHkoImZvbyA+PiAxMjMiKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNyQXNzaWduKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygiZm9vID4+PSAxMjMiLCBwcmV0dHkoImZvbyA+Pj0gMTIzIikpOyAvLyBkb2VzIHRoaXMgb3BlcmF0b3IgbWFrZSBhbnkgc2Vuc2U/CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN0YXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbXBvcnQgZm9vLioiLCBwcmV0dHkoImltcG9ydCBmb28uKiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhKmIiLCBwcmV0dHkoImEqYiIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhckFzc2lnbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyAqPSAxMjMiLCBwcmV0dHkoImZvbyAqPSAxMjMiKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN0YXJTdGFyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IC8vIG5vdCBpbiBqYXZhCisgICAgICAgIGFzc2VydEVxdWFscygiZGVmIHNxdWFyZSA9ICs1KioyIiwgcHJldHR5KCJkZWYgc3F1YXJlPSs1KioyIikpOyAvLyBub3QgaW4gamF2YQorICAgICAgICBhc3NlcnRFcXVhbHMoImRlZiBjdWJlID0gNSoqMyIsIHByZXR0eSgiZGVmIGN1YmUgPSA1KiozIikpOyAvLyBub3QgaW4gamF2YQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFyU3RhckFzc2lnbigpIHRocm93cyBFeGNlcHRpb24geyAvLyBub3QgaW4gamF2YQorICAgICAgICBhc3NlcnRFcXVhbHMoImN1YmVNZSAqKj0gMyIsIHByZXR0eSgiY3ViZU1lICoqPSAzIikpOyAvLyBub3QgaW4gamF2YQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdGF0aWNJbXBvcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbXBvcnQgc3RhdGljIGZvby5CYXIubW9va3kiLCBwcmV0dHkoImltcG9ydCBzdGF0aWMgZm9vLkJhci5tb29reSIpKTsgLy8gZmFpbHMgYWZ0ZXIgcGFyc2VyCisgICAgICAgIGFzc2VydEVxdWFscygiaW1wb3J0IHN0YXRpYyBmb28uQmFyLioiLCBwcmV0dHkoImltcG9ydCBzdGF0aWMgZm9vLkJhci4qIikpOyAvLyBmYWlscyBhZnRlciBwYXJzZXIKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhdGljSW5pdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoImNsYXNzIEZvbyB7c3RhdGljIHtwcmludGxuKDEgKyAxKX19IiwgcHJldHR5KCJjbGFzcyBGb297c3RhdGlje3ByaW50bG4oMSsxKX19IikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpY3RGcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoInByaXZhdGUgc3RyaWN0ZnAgZmxpYmJsZSA9IDEuMiIsIHByZXR0eSgicHJpdmF0ZSBzdHJpY3RmcCBmbGliYmxlID0gMS4yIikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdDb25zdHJ1Y3RvcigpIHRocm93cyBFeGNlcHRpb24geyAvLyBub3QgaW4gamF2YQorICAgICAgICBhc3NlcnRFcXVhbHMoImRlZiB4ID0gXCJmb28kYmFyXCIiLCBwcmV0dHkoImRlZiB4PVwiZm9vJGJhclwiIikpOyAvLyBub3QgaW4gamF2YQorICAgICAgICBhc3NlcnRFcXVhbHMoImRlZiB5ID0gXCJmb28ke21vb2t5fVwiIiwgcHJldHR5KCJkZWYgeSA9IFwiZm9vJHttb29reX1cIiIpKTsgLy8gbm90IGluIGphdmEKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nTGl0ZXJhbF9GQUlMUygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAobm90WWV0SW1wbGVtZW50ZWQoKSkgcmV0dXJuOworICAgICAgICBhc3NlcnRFcXVhbHMoIlwibW9va3lcIiIsIHByZXR0eSgiXCJtb29reVwiIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIidtb29reSciLCBwcmV0dHkoIidtb29reSciKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZGVmIHggPSAnJydjYW4gZ28gb3ZlciBuZXdsaW5lJycnIiwgcHJldHR5KCJkZWYgeCA9ICcnJ2NhbiBnbyBvdmVyIG5ld2xpbmUnJyciKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZGVmIHggPSBcIlwiXCJjYW4gZ28gb3ZlciBuZXdsaW5lXCJcIlwiIiwgcHJldHR5KCJkZWYgeCA9IFwiXCJcImNhbiBnbyBvdmVyIG5ld2xpbmVcIlwiXCIiKSk7CisgICAgICAgIC8vdG9kbyB0ZXN0IG5ld2xpbmVzIGluc2lkZSBzdHJpbmdzIHNvbWVob3cuLi4KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3VwZXJDdG9yQ2FsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoImNsYXNzIEZvbyB7Rm9vKGludCB4KSB7c3VwZXIoMTIsIDMpfX0iLCBwcmV0dHkoImNsYXNzIEZvb3tGb28oaW50IHgpIHtzdXBlcigxMiwgMyl9fSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjbGFzcyBGb28ge0Zvbyh4KSB7c3VwZXIoKX19IiwgcHJldHR5KCJjbGFzcyBGb297Rm9vKHgpIHtzdXBlcigpfX0iKSk7CisgICAgICAgIC8vIHRvZG86IGFib3ZlIGlzIG5vdCBxdWl0ZSB0aGUgc3BhY2luZyBJIHdvdWxkIGV4cGVjdCwgYnV0IGdvb2QgZW5vdWdoIGZvciBub3cuLi4KKyAgICAgICAgLy8gdG9kbyBub3QgeWV0IGltcGxlbWVudGVkIGluIHBhcnNlcjogYXNzZXJ0RXF1YWxzKCIobmV3IE91dGVyKCkpLnN1cGVyKCkiLCBwcmV0dHkoIihuZXcgT3V0ZXIoKSkuc3VwZXIoKSIpKTsKKyAgICB9ICAgIAorCisgICAgcHVibGljIHZvaWQgdGVzdFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJkZWYgYmFyIiwgcHJldHR5KCJkZWYgYmFyIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoInB1YmxpYyBiYXIiLCBwcmV0dHkoInB1YmxpYyBiYXIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygicHVibGljIFN0cmluZyBiYXIiLCBwcmV0dHkoInB1YmxpYyBTdHJpbmcgYmFyIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlN0cmluZyBiYXIiLCBwcmV0dHkoIlN0cmluZyBiYXIiKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFR5cGVjYXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygiZm9vID0gKGludCliYXIiLCBwcmV0dHkoImZvbyA9IChpbnQpYmFyIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyA9IChpbnRbXSliYXIiLCBwcmV0dHkoImZvbyA9IChpbnRbXSliYXIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZm9vID0gKFN0cmluZyliYXIiLCBwcmV0dHkoImZvbyA9IChTdHJpbmcpYmFyIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyA9IChTdHJpbmdbXSliYXIiLCBwcmV0dHkoImZvbyA9IChTdHJpbmdbXSliYXIiKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFR5cGVBcmd1bWVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2b2lkIHByaW50Q29sbGVjdGlvbihDb2xsZWN0aW9uPD8+IGMpIHt9IiwgcHJldHR5KCJ2b2lkIHByaW50Q29sbGVjdGlvbihDb2xsZWN0aW9uPD8+IGMpIHt9IikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RUeXBlTG93ZXJCb3VuZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2b2lkIHByaW50Q29sbGVjdGlvbihDb2xsZWN0aW9uPD8gc3VwZXIgWD4gYykge30iLCBwcmV0dHkoInZvaWQgcHJpbnRDb2xsZWN0aW9uKENvbGxlY3Rpb248PyBzdXBlciBYPiBjKSB7fSIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHlwZVVwcGVyQm91bmRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygidm9pZCBwcmludENvbGxlY3Rpb24oQ29sbGVjdGlvbjw/IGV4dGVuZHMgWD4gYykge30iLCBwcmV0dHkoInZvaWQgcHJpbnRDb2xsZWN0aW9uKENvbGxlY3Rpb248PyBleHRlbmRzIFg+IGMpIHt9IikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RUeXBlUGFyYW1ldGVycygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoImNsYXNzIEZvbzxUIGV4dGVuZHMgQyAmIEk+IHtUIHR9IiwgcHJldHR5KCJjbGFzcyBGb288VCBleHRlbmRzIEMgJiBJPiB7VCB0fSIpKTsgLy8gZmFpbHMgYWZ0ZXIgcGFyc2VyCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFVuYXJ5TWludXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJkZWYgeCA9IC0zIiwgcHJldHR5KCJkZWYgeD0gLTMiKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFVuYXJ5UGx1cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoImRlZiB4ID0gKzIiLCBwcmV0dHkoImRlZiB4PSArMiIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFyaWFibGVEZWYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2b2lkIG15TWV0aG9kKFN0cmluZyBwYXJhbTEsIFN0cmluZy4uLiBvdGhlcnMpIHt9IiwgcHJldHR5KCJ2b2lkIG15TWV0aG9kKFN0cmluZyBwYXJhbTEsIFN0cmluZyAuLi4gb3RoZXJzKSB7fSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2b2lkIG15TWV0aG9kKGZpbmFsIGludCAuLi4gb3RoZXJzKSB7fSIsIHByZXR0eSgidm9pZCBteU1ldGhvZChmaW5hbCBpbnQgLi4uIG90aGVycykge30iKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidm9pZCBteU1ldGhvZChkZWYuLi4gb3RoZXJzKSB7fSIsIHByZXR0eSgidm9pZCBteU1ldGhvZChkZWYgLi4uIG90aGVycykge30iKSk7CisJfQorCisgICAgcHVibGljIHZvaWQgdGVzdFZhcmlhYmxlRGVmX0ZBSUxTKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChub3RZZXRJbXBsZW1lbnRlZCgpKSByZXR1cm47CisgICAgICAgIGFzc2VydEVxdWFscygiYm9vbGVhbiB4LCB5LCB6ID0gZmFsc2UiLCBwcmV0dHkoImJvb2xlYW4geCx5LHogPSBmYWxzZSIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFyaWJsZVBhcmFtZXRlckRlZigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoInZvaWQgbXlNZXRob2QoU3RyaW5nIHBhcmFtMSwgU3RyaW5nLi4uIG90aGVycykge30iLCBwcmV0dHkoInZvaWQgbXlNZXRob2QoU3RyaW5nIHBhcmFtMSwgU3RyaW5nIC4uLiBvdGhlcnMpIHt9IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoInZvaWQgbXlNZXRob2QoZmluYWwgaW50IC4uLiBvdGhlcnMpIHt9IiwgcHJldHR5KCJ2b2lkIG15TWV0aG9kKGZpbmFsIGludCAuLi4gb3RoZXJzKSB7fSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2b2lkIG15TWV0aG9kKGRlZi4uLiBvdGhlcnMpIHt9IiwgcHJldHR5KCJ2b2lkIG15TWV0aG9kKGRlZiAuLi4gb3RoZXJzKSB7fSIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2lsZGNhcmRUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygicHVibGljIGJvb2xlYW4gcHJvY2VzcyhTZXQ8PyBleHRlbmRzIFR5cGVFbGVtZW50PiBhbm5vdGF0aW9ucykge3ByaW50bG4gYW5ub3RhdGlvbnN9IiwgcHJldHR5KCJwdWJsaWMgYm9vbGVhbiBwcm9jZXNzKFNldDw/IGV4dGVuZHMgVHlwZUVsZW1lbnQ+IGFubm90YXRpb25zKSB7cHJpbnRsbiBhbm5vdGF0aW9uc30iKSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBwcmV0dHkoU3RyaW5nIGlucHV0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgVHJhdmVyc2FsVGVzdEhlbHBlciB0cmF2ZXJzZXIgPSBuZXcgVHJhdmVyc2FsVGVzdEhlbHBlcigpOworICAgICAgICByZXR1cm4gdHJhdmVyc2VyLnRyYXZlcnNlKGlucHV0LCBTb3VyY2VQcmludGVyLmNsYXNzKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudGxyL3RyZWV3YWxrZXIvVHJhdmVyc2FsVGVzdEhlbHBlci5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvdHJlZXdhbGtlci9UcmF2ZXJzYWxUZXN0SGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMzN2IyNAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudGxyL3RyZWV3YWxrZXIvVHJhdmVyc2FsVGVzdEhlbHBlci5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5hbnRsci50cmVld2Fsa2VyOworCitpbXBvcnQgYW50bHIuY29sbGVjdGlvbnMuQVNUOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50bHIuQW50bHJBU1RQcm9jZXNzb3I7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hbnRsci5Tb3VyY2VCdWZmZXI7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hbnRsci5Vbmljb2RlRXNjYXBpbmdSZWFkZXI7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hbnRsci5wYXJzZXIuR3Jvb3Z5TGV4ZXI7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hbnRsci5wYXJzZXIuR3Jvb3Z5UmVjb2duaXplcjsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CitpbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CisKK3B1YmxpYyBjbGFzcyBUcmF2ZXJzYWxUZXN0SGVscGVyIHsKKyAgICBwdWJsaWMgU3RyaW5nIHRyYXZlcnNlKFN0cmluZyBpbnB1dCwgQ2xhc3MgdmlzaXRvckNsYXNzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHRyYXZlcnNlKGlucHV0LCB2aXNpdG9yQ2xhc3MsIG51bGwpOworICAgIH0KKworCisgICAgLy8gdG9kbyAtIHRoZSB2aXNpdG9yIGRvZXNuJ3QgYWx3YXlzIHRha2UgUHJpbnRTdHJlYW1zIGFzIGNvbnN0cnVjdG9yIHBhcmFtcyEgIENvdWxkIGJlIGEgbW9yZSByZXVzYWJsZSBpbXBsZW1lbnRhdGlvbiB0aGFuIHRoaXMuLi4KKyAgICBwdWJsaWMgU3RyaW5nIHRyYXZlcnNlKFN0cmluZyBpbnB1dCwgQ2xhc3MgdmlzaXRvckNsYXNzLCBCb29sZWFuIGV4dHJhUGFyYW0pIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoIVZpc2l0b3IuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh2aXNpdG9yQ2xhc3MpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW52YWxpZCBjbGFzcyBmb3IgdHJhdmVyc2FsOiAiICsgdmlzaXRvckNsYXNzLmdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIEdyb292eVJlY29nbml6ZXIgcGFyc2VyOworICAgICAgICBTb3VyY2VCdWZmZXIgc291cmNlQnVmZmVyID0gbmV3IFNvdXJjZUJ1ZmZlcigpOworICAgICAgICBVbmljb2RlRXNjYXBpbmdSZWFkZXIgdW5pY29kZVJlYWRlciA9IG5ldyBVbmljb2RlRXNjYXBpbmdSZWFkZXIobmV3IFN0cmluZ1JlYWRlcihpbnB1dCksIHNvdXJjZUJ1ZmZlcik7CisgICAgICAgIEdyb292eUxleGVyIGxleGVyID0gbmV3IEdyb292eUxleGVyKHVuaWNvZGVSZWFkZXIpOworICAgICAgICB1bmljb2RlUmVhZGVyLnNldExleGVyKGxleGVyKTsKKyAgICAgICAgcGFyc2VyID0gR3Jvb3Z5UmVjb2duaXplci5tYWtlKGxleGVyKTsKKyAgICAgICAgcGFyc2VyLnNldFNvdXJjZUJ1ZmZlcihzb3VyY2VCdWZmZXIpOworICAgICAgICBTdHJpbmdbXSB0b2tlbk5hbWVzID0gcGFyc2VyLmdldFRva2VuTmFtZXMoKTsKKyAgICAgICAgcGFyc2VyLmNvbXBpbGF0aW9uVW5pdCgpOworICAgICAgICBBU1QgYXN0ID0gcGFyc2VyLmdldEFTVCgpOworICAgICAgICBDbGFzc1tdIHBhcmFtVHlwZXM7CisgICAgICAgIE9iamVjdFtdIHBhcmFtczsKKyAgICAgICAgaWYgKGV4dHJhUGFyYW0gPT0gbnVsbCkgeworICAgICAgICAgICAgcGFyYW1UeXBlcyA9IG5ldyBDbGFzc1tde1ByaW50U3RyZWFtLmNsYXNzLCBTdHJpbmdbXS5jbGFzc307CisgICAgICAgICAgICBwYXJhbXMgPSBuZXcgT2JqZWN0W117bmV3IFByaW50U3RyZWFtKGJhb3MpLCB0b2tlbk5hbWVzfTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBhcmFtVHlwZXMgPSBuZXcgQ2xhc3NbXXtQcmludFN0cmVhbS5jbGFzcywgU3RyaW5nW10uY2xhc3MsIEJvb2xlYW4uVFlQRX07CisgICAgICAgICAgICBwYXJhbXMgPSBuZXcgT2JqZWN0W117bmV3IFByaW50U3RyZWFtKGJhb3MpLCB0b2tlbk5hbWVzLCBleHRyYVBhcmFtfTsKKyAgICAgICAgfQorICAgICAgICBDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IHZpc2l0b3JDbGFzcy5nZXRDb25zdHJ1Y3RvcihwYXJhbVR5cGVzKTsKKyAgICAgICAgVmlzaXRvciB2aXNpdG9yID0gKFZpc2l0b3IpIGNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKHBhcmFtcyk7CisgICAgICAgIEFudGxyQVNUUHJvY2Vzc29yIHRyYXZlcnNlciA9IG5ldyBTb3VyY2VDb2RlVHJhdmVyc2FsKHZpc2l0b3IpOworICAgICAgICB0cmF2ZXJzZXIucHJvY2Vzcyhhc3QpOworICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhiYW9zLnRvQnl0ZUFycmF5KCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudGxyL3RyZWV3YWxrZXIvVW5pbXBsZW1lbnRlZFN5bnRheFRlc3QuamF2YSBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FudGxyL3RyZWV3YWxrZXIvVW5pbXBsZW1lbnRlZFN5bnRheFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTlkZGU4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvYW50bHIvdHJlZXdhbGtlci9VbmltcGxlbWVudGVkU3ludGF4VGVzdC5qYXZhCkBAIC0wLDAgKzEsMjUxIEBACisvKioKKyAqCisgKiBDb3B5cmlnaHQgMjAwNyBKZXJlbXkgUmF5bmVyCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYW50bHIudHJlZXdhbGtlcjsKKworaW1wb3J0IGdyb292eS5sYW5nLkdyb292eVNoZWxsOworaW1wb3J0IGdyb292eS5sYW5nLlNjcmlwdDsKK2ltcG9ydCBncm9vdnkudXRpbC5Hcm9vdnlUZXN0Q2FzZTsKKworLyoqCisgKiBUaGlzIHRlc3RzIGNvZGUgdGhhdCBpcyB2YWxpZCBpbiBwYXJzZXIsIGJ1dCBoYXMgaXNzdWVzIGZ1cnRoZXIgZG93biB0aGUgbGluZS4KKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpncm9vdnlAcm9zcy1yYXluZXIuY29tIj5KZXJlbXkgUmF5bmVyPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uOiA0NjUzICQKKyAqLworcHVibGljIGNsYXNzIFVuaW1wbGVtZW50ZWRTeW50YXhUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIGZlYXR1cmU6IEFubm90YXRpb24gRGVmaW5pdGlvbgorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgcHVibGljIHZvaWQgdGVzdF9Bbm5vdGF0aW9uRGVmMV9GQUlMUygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAobm90WWV0SW1wbGVtZW50ZWQoKSkgcmV0dXJuOworICAgICAgICAvLyBVbmtub3duIHR5cGU6IEFOTk9UQVRJT05fREVGCisgICAgICAgIGFzc2VydE5vdE51bGwoY29tcGlsZSgicHVibGljIEBpbnRlcmZhY2UgRm9ve30iKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdF9Bbm5vdGF0aW9uRGVmMl9GQUlMUygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAobm90WWV0SW1wbGVtZW50ZWQoKSkgcmV0dXJuOworICAgICAgICAvLyBVbmtub3duIHR5cGU6IEFOTk9UQVRJT05fREVGCisgICAgICAgIGFzc2VydE5vdE51bGwoY29tcGlsZSgicHVibGljIEBpbnRlcmZhY2UgRm9ve2ludCBiYXIoKSBkZWZhdWx0IDEyM30iKSk7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gYnVnOiBRdWFsaWZpZWQgRXhjZXB0aW9uIFR5cGVzCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X1F1YWxpZmllZEV4Y2VwdGlvblR5cGVzX0ZBSUxTKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChub3RZZXRJbXBsZW1lbnRlZCgpKSByZXR1cm47CisgICAgICAgIC8vIFVuZXhwZWN0ZWQgbm9kZSB0eXBlOiAnLicgZm91bmQgd2hlbiBleHBlY3RpbmcgdHlwZTogYW4gaWRlbnRpZmllcgorICAgICAgICBhc3NlcnROb3ROdWxsKGNvbXBpbGUoImRlZiBmb28oKSB0aHJvd3MgYmFyLk1vb2t5RXhjZXB0aW9ue30iKSk7IC8vIGZhaWxzIGFmdGVyIHBhcnNlcgorICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIGZlYXR1cmU6IGNsYXNzaWMgSmF2YSBmb3IgbG9vcAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgcHVibGljIHZvaWQgdGVzdF9DbGFzc2ljSmF2YUZvckxvb3AxX0ZBSUxTKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChub3RZZXRJbXBsZW1lbnRlZCgpKSByZXR1cm47CisgICAgICAgIC8vIEZvciBzdGF0ZW1lbnQgY29udGFpbnMgdW5leHBlY3RlZCB0b2tlbnMuIFBvc3NpYmxlIGF0dGVtcHQgdG8gdXNlIHVuc3VwcG9ydGVkIEphdmEtc3R5bGUgZm9yIGxvb3AuCisgICAgICAgIC8vIFRoaXMgc3ludGF4IG5vdyByZXBsYWNlZCB3aXRoIGNsb3N1cmUgbGlzdCBpLmUuIGZvciAoaT0wO2o9MjtpPDEwO2krKztqLS0pIHsuLi4KKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjb21waWxlKCJmb3IgKGkgPSAwLGogPSAyO2kgPCAxMDsgaSsrLCBqLS0pIHtwcmludCBpfSIpKTsgLy8gZmFpbHMgYWZ0ZXIgcGFyc2VyCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdF9DbGFzc2ljSmF2YUZvckxvb3AyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIEZvciBzdGF0ZW1lbnQgY29udGFpbnMgdW5leHBlY3RlZCB0b2tlbnMuIFBvc3NpYmxlIGF0dGVtcHQgdG8gdXNlIHVuc3VwcG9ydGVkIEphdmEtc3R5bGUgZm9yIGxvb3AuCisgICAgICAgIGFzc2VydE5vdE51bGwoY29tcGlsZSgiZm9yIChpPTA7aTwxMDtpKyspIHtwcmludGxuIGl9IikpOyAvLyBmYWlscyBhZnRlciBwYXJzZXIKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBmZWF0dXJlOiBFbnVtIERlZmluaXRpb25zCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgcHVibGljIHZvaWQgdGVzdF9FbnVtRGVmMV9GQUlMUygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAobm90WWV0SW1wbGVtZW50ZWQoKSkgcmV0dXJuOworICAgICAgICAvLyBVbmtub3duIHR5cGU6IEVOVU1fREVGCisgICAgICAgIGFzc2VydE5vdE51bGwoY29tcGlsZSgiZW51bSBDb2luIHtQRU5OWSgxKSwgRElNRSgxMCksIFFVQVJURVIoMjUpfSIpKTsgLy8gZmFpbHMgYWZ0ZXIgcGFyc2VyCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdF9FbnVtRGVmMl9GQUlMUygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAobm90WWV0SW1wbGVtZW50ZWQoKSkgcmV0dXJuOworICAgICAgICAvLyBVbmtub3duIHR5cGU6IEVOVU1fREVGCisgICAgICAgIGFzc2VydE5vdE51bGwoY29tcGlsZSgiZW51bSBTZWFzb257V0lOVEVSLFNQUklORyxTVU1NRVIsQVVUVU1OfSIpKTsgLy8gZmFpbHMgYWZ0ZXIgcGFyc2VyCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdF9FbnVtRGVmM19GQUlMUygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAobm90WWV0SW1wbGVtZW50ZWQoKSkgcmV0dXJuOworICAgICAgICAvLyBVbmtub3duIHR5cGU6IEVOVU1fREVGCisgICAgICAgIGFzc2VydE5vdE51bGwoY29tcGlsZSgiZW51bSBPcGVyYXRpb24ge0FERElUSU9OIHtkb3VibGUgZXZhbCh4LHkpIHtyZXR1cm4geCArIHl9fX0iKSk7IC8vIGZhaWxzIGFmdGVyIHBhcnNlcgorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RfRW51bURlZjRfRkFJTFMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG5vdFlldEltcGxlbWVudGVkKCkpIHJldHVybjsKKyAgICAgICAgLy8gVW5rbm93biB0eXBlOiBFTlVNX0RFRgorICAgICAgICBhc3NlcnROb3ROdWxsKGNvbXBpbGUoImVudW0gRWFydGhTZWFzb24gaW1wbGVtZW50cyBTZWFzb257U1BSSU5HfSIpKTsgLy8gZmFpbHMgYWZ0ZXIgcGFyc2VyCisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gZGVwcmVjYXRlIGluIHBhcnNlcj86ICdicmVhaycgYWxsb3dlZCBpbiBtZXRob2RzCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgcHVibGljIHZvaWQgdGVzdF9CcmVha0FsbG93ZWRJbk1ldGhvZHNfRkFJTFMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG5vdFlldEltcGxlbWVudGVkKCkpIHJldHVybjsKKyAgICAgICAgLy8gdGhlIGJyZWFrIHN0YXRlbWVudCBpcyBvbmx5IGFsbG93ZWQgaW5zaWRlIGxvb3BzIG9yIHN3aXRjaGVzCisgICAgICAgIGFzc2VydE5vdE51bGwoY29tcGlsZSgiZGVmIG15TWV0aG9kKCl7YnJlYWt9IikpOyAvLyBmYWlscyBhZnRlciBwYXJzZXIKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gZGVwcmVjYXRlIGluIHBhcnNlcj86ICdjb250aW51ZScgYWxsb3dlZCBpbiBjbG9zdXJlcworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbnRpbnVlQWxsb3dlZEluQ2xvc3VyZXNfRkFJTFMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG5vdFlldEltcGxlbWVudGVkKCkpIHJldHVybjsKKyAgICAgICAgLy8gdGhlIGNvbnRpbnVlIHN0YXRlbWVudCBpcyBvbmx5IGFsbG93ZWQgaW5zaWRlIGxvb3BzCisgICAgICAgIGFzc2VydE5vdE51bGwoY29tcGlsZSgiWzEsMiwzXS5lYWNoe2NvbnRpbnVlfSIpKTsgLy8gZmFpbHMgYWZ0ZXIgcGFyc2VyCisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIGZlYXR1cmU/OiBhbGxvdyBicmVhay9jb250aW51ZSB3aXRoIHZhbHVlIGZyb20gbG9vcHM/CisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHB1YmxpYyB2b2lkIHRlc3RfQnJlYWtXaXRoVmFsdWVBbGxvd2VkSW5Mb29wc19GQUlMUygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAobm90WWV0SW1wbGVtZW50ZWQoKSkgcmV0dXJuOworICAgICAgICAvLyBVbmV4cGVjdGVkIG5vZGUgdHlwZTogYSBudW1lcmljIGxpdGVyYWwgZm91bmQgd2hlbiBleHBlY3RpbmcgdHlwZTogYW4gaWRlbnRpZmllcgorICAgICAgICBhc3NlcnROb3ROdWxsKGNvbXBpbGUoImZvciAoaSBpbiAxLi4xMDApIHticmVhayAyfSIpKTsgLy8gZmFpbHMgYWZ0ZXIgcGFyc2VyCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdF9Db250aW51ZVdpdGhWYWx1ZUFsbG93ZWRJbkxvb3BzX0ZBSUxTKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChub3RZZXRJbXBsZW1lbnRlZCgpKSByZXR1cm47CisgICAgICAgIC8vIFVuZXhwZWN0ZWQgbm9kZSB0eXBlOiBhIG51bWVyaWMgbGl0ZXJhbCBmb3VuZCB3aGVuIGV4cGVjdGluZyB0eXBlOiBhbiBpZGVudGlmaWVyCisgICAgICAgIGFzc2VydE5vdE51bGwoY29tcGlsZSgiZm9yIChpIGluIDEuLjEwMCkge2NvbnRpbnVlIDJ9IikpOyAvLyBmYWlscyBhZnRlciBwYXJzZXIKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBmZWF0dXJlPzogYWxsb3cgYnJlYWsvY29udGludWUgdG8gbGFiZWxlZCBzdGF0ZW1lbnQgZnJvbSBsb29wcz8gKGlzIHRoaXMgZXZlbiByaWdodCBzeW50YXgsIG9yIHBhcnNlciBidWc/Pz8pCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgcHVibGljIHZvaWQgdGVzdF9CcmVha1RvTGFiZWxlZFN0YXRlbWVudEFsbG93ZWRJbkxvb3BzX0ZBSUxTKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChub3RZZXRJbXBsZW1lbnRlZCgpKSByZXR1cm47CisgICAgICAgIC8vIFVuZXhwZWN0ZWQgbm9kZSB0eXBlOiBMQUJFTEVEX1NUQVQgZm91bmQgd2hlbiBleHBlY3RpbmcgdHlwZTogYW4gaWRlbnRpZmllcgorICAgICAgICBhc3NlcnROb3ROdWxsKGNvbXBpbGUoImZvciAoaSBpbiAxLi4xMDApIHticmVhayBsYWJlbDE6fSIpKTsgLy8gZmFpbHMgYWZ0ZXIgcGFyc2VyCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdF9Db250aW51ZVRvTGFiZWxlZFN0YXRlbWVudEFsbG93ZWRJbkxvb3BzX0ZBSUxTKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChub3RZZXRJbXBsZW1lbnRlZCgpKSByZXR1cm47CisgICAgICAgIC8vIFVuZXhwZWN0ZWQgbm9kZSB0eXBlOiBMQUJFTEVEX1NUQVQgZm91bmQgd2hlbiBleHBlY3RpbmcgdHlwZTogYW4gaWRlbnRpZmllcgorICAgICAgICBhc3NlcnROb3ROdWxsKGNvbXBpbGUoImZvciAoaSBpbiAxLi4xMDApIHtjb250aW51ZSBsYWJlbDE6fSIpKTsgLy8gZmFpbHMgYWZ0ZXIgcGFyc2VyCisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBmZWF0dXJlOiBOYXRpdmUgTWV0aG9kcworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgcHVibGljIHZvaWQgdGVzdF9OYXRpdmVNZXRob2RzMV9GQUlMUygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAobm90WWV0SW1wbGVtZW50ZWQoKSkgcmV0dXJuOworICAgICAgICAvLyBZb3UgZGVmaW5lZCBhIG1ldGhvZCB3aXRob3V0IGJvZHkuIFRyeSBhZGRpbmcgYSBib2R5LCBvciBkZWNsYXJlIGl0IGFic3RyYWN0CisgICAgICAgIGFzc2VydE5vdE51bGwoY29tcGlsZSgicHVibGljIGNsYXNzIFJ7cHVibGljIG5hdGl2ZSB2b2lkIHNlZWsobG9uZyBwb3MpfSIpKTsgLy8gZmFpbHMgYWZ0ZXIgcGFyc2VyCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdF9OYXRpdmVNZXRob2RzMl9GQUlMUygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAobm90WWV0SW1wbGVtZW50ZWQoKSkgcmV0dXJuOworICAgICAgICAvLyBZb3UgZGVmaW5lZCBhIG1ldGhvZCB3aXRob3V0IGJvZHkuIFRyeSBhZGRpbmcgYSBib2R5LCBvciBkZWNsYXJlIGl0IGFic3RyYWN0CisgICAgICAgIGFzc2VydE5vdE51bGwoY29tcGlsZSgibmF0aXZlIGZvbygpIikpOyAvLyBmYWlscyBhZnRlciBwYXJzZXIKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBmZWF0dXJlOiAndGhyZWFkc2FmZScKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0X1RocmVhZHNhZmUxX0ZBSUxTKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChub3RZZXRJbXBsZW1lbnRlZCgpKSByZXR1cm47CisgICAgICAgIC8vIFVua25vd24gdHlwZTogInRocmVhZHNhZmUiCisgICAgICAgIGFzc2VydE5vdE51bGwoY29tcGlsZSgidGhyZWFkc2FmZSBmb28oKSB7fSIpKTsgLy8gZmFpbHMgYWZ0ZXIgcGFyc2VyCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdF9UaHJlYWRzYWZlMl9GQUlMUygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAobm90WWV0SW1wbGVtZW50ZWQoKSkgcmV0dXJuOworICAgICAgICAvLyBVbmtub3duIHR5cGU6ICJ0aHJlYWRzYWZlIgorICAgICAgICBhc3NlcnROb3ROdWxsKGNvbXBpbGUoInB1YmxpYyBzdGF0aWMgdHJhbnNpZW50IGZpbmFsIG5hdGl2ZSB0aHJlYWRzYWZlIHN5bmNocm9uaXplZCB2b2xhdGlsZSBzdHJpY3RmcCBmb28oKSB7fSIpKTsgLy8gZmFpbHMgYWZ0ZXIgcGFyc2VyCisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIGZlYXR1cmU/OiBzY29wZSBlc2NhcGUgb3BlcmF0b3IKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgcHVibGljIHZvaWQgdGVzdF9TY29wZUVzY2FwZV9GQUlMUygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAobm90WWV0SW1wbGVtZW50ZWQoKSkgcmV0dXJuOworICAgICAgICAvLyBVbmtub3duIHR5cGU6IFNDT1BFX0VTQ0FQRQorICAgICAgICBhc3NlcnROb3ROdWxsKGNvbXBpbGUoInByaW50bG4oWyR4LCB4LCB5XSkiKSk7IC8vIGZhaWxzIGFmdGVyIHBhcnNlcgorICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gYnVncz86IHNwcmVhZCBleHByZXNzaW9ucyBpbiBjbG9zdXJlcyBhbmQgR1N0cmluZ3MKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHB1YmxpYyB2b2lkIHRlc3RfU3ByZWFkRXhwcmVzc2lvbkluQ2xvc3VyZV9GQUlMUygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAobm90WWV0SW1wbGVtZW50ZWQoKSkgcmV0dXJuOworICAgICAgICAvLyBCVUchIGV4Y2VwdGlvbiBpbiBwaGFzZSAnY2xhc3MgZ2VuZXJhdGlvbicgaW4gc291cmNlIHVuaXQgJ1NjcmlwdDEuZ3Jvb3Z5JworICAgICAgICAvLyBTcHJlYWRFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgdmlzaXRlZCBoZXJlCisgICAgICAgIGFzc2VydE5vdE51bGwoY29tcGlsZSgibXlMaXN0eypuYW1lfSIpKTsgLy8gZmFpbHMgYWZ0ZXIgcGFyc2VyCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdF9TcHJlYWRFeHByZXNzaW9uSW5HU3RyaW5nMV9GQUlMUygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAobm90WWV0SW1wbGVtZW50ZWQoKSkgcmV0dXJuOworICAgICAgICAvLyBCVUchIGV4Y2VwdGlvbiBpbiBwaGFzZSAnY29udmVyc2lvbicgaW4gc291cmNlIHVuaXQgJ1NjcmlwdDEuZ3Jvb3Z5JyBudWxsCisgICAgICAgIGFzc2VydE5vdE51bGwoY29tcGlsZSgiXCJmb28kKmJhclwiIikpOyAvLyBmYWlscyBhZnRlciBwYXJzZXIKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X1NwcmVhZEV4cHJlc3Npb25JbkdTdHJpbmcyX0ZBSUxTKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChub3RZZXRJbXBsZW1lbnRlZCgpKSByZXR1cm47CisgICAgICAgIC8vIEJVRyEgZXhjZXB0aW9uIGluIHBoYXNlICdjbGFzcyBnZW5lcmF0aW9uJyBpbiBzb3VyY2UgdW5pdCAnU2NyaXB0MS5ncm9vdnknCisgICAgICAgIC8vIFNwcmVhZEV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSB2aXNpdGVkIGhlcmUKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjb21waWxlKCJcImZvbyR7KmJhcn1cIiIpKTsgLy8gZmFpbHMgYWZ0ZXIgcGFyc2VyCisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBmZWF0dXJlOiBzdGF0aWMgaW1wb3J0cworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gVE9ETzogbW92ZSBzb21ld2hlcmUgZWxzZQorICAgIHB1YmxpYyB2b2lkIHRlc3RfU3RhdGljSW1wb3J0MSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnROb3ROdWxsKGNvbXBpbGUoImltcG9ydCBzdGF0aWMgZm9vLkJhci5tb29reSIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X1N0YXRpY0ltcG9ydDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjb21waWxlKCJpbXBvcnQgc3RhdGljIGZvby5CYXIuKiIpKTsKKyAgICB9CisKKyAgICAvLyBUT0RPOiBtb3ZlIHNvbWV3aGVyZSBlbHNlIEdST09WWS0xODc0CisgICAgcHVibGljIHZvaWQgdGVzdF9zdGF0aWNCbG9ja1dpdGhOZXdMaW5lcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnROb3ROdWxsKGNvbXBpbGUoImNsYXNzIE15Q2xhc3MgXG57XG5cdHN0YXRpY1xue1xucHJpbnRsbiAyXG59XG59IikpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0X3N0YXRpY0Jsb2NrV2l0aE5vU3RhcnROZXdMaW5lcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnROb3ROdWxsKGNvbXBpbGUoImNsYXNzIE15Q2xhc3MgXG57XG5cdHN0YXRpYyB7XG5wcmludGxuIDJcbn1cbn0iKSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3Rfc3RhdGljQmxvY2tXaXRoTm9OZXdMaW5lcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnROb3ROdWxsKGNvbXBpbGUoImNsYXNzIE15Q2xhc3MgXG57XG5cdHN0YXRpYyB7IHByaW50bG4gMiB9fSIpKTsKKyAgICB9CisgICAgCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gZmVhdHVyZTogdHlwZSBwYXJhbWV0ZXJzCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgcHVibGljIHZvaWQgdGVzdF9UeXBlUGFyYW1ldGVyc19GQUlMUygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAobm90WWV0SW1wbGVtZW50ZWQoKSkgcmV0dXJuOworICAgICAgICAvLyBVbmV4cGVjdGVkIG5vZGUgdHlwZTogVFlQRV9QQVJBTUVURVJTIGZvdW5kIHdoZW4gZXhwZWN0aW5nIHR5cGU6IE9CSkJMT0NLCisgICAgICAgIGFzc2VydE5vdE51bGwoY29tcGlsZSgiY2xhc3MgRm9vPFQgZXh0ZW5kcyBDICYgST4ge1QgdH0iKSk7IC8vIGZhaWxzIGFmdGVyIHBhcnNlcgorICAgIH0KKworICAgIHByaXZhdGUgU2NyaXB0IGNvbXBpbGUoU3RyaW5nIGlucHV0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgVHJhdmVyc2FsVGVzdEhlbHBlciB0cmF2ZXJzZXIgPSBuZXcgVHJhdmVyc2FsVGVzdEhlbHBlcigpOworICAgICAgICB0cmF2ZXJzZXIudHJhdmVyc2UoaW5wdXQsIFNvdXJjZVByaW50ZXIuY2xhc3MsIEJvb2xlYW4uRkFMU0UpOworICAgICAgICBHcm9vdnlTaGVsbCBncm9vdnlTaGVsbCA9IG5ldyBHcm9vdnlTaGVsbCgpOworICAgICAgICByZXR1cm4gZ3Jvb3Z5U2hlbGwucGFyc2UoaW5wdXQpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L0NsYXNzTm9kZVRlc3QuamF2YSBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9DbGFzc05vZGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUwZGE4NAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9DbGFzc05vZGVUZXN0LmphdmEKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAkSWQkCisKKyBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAorIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0CisgICAgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhCisgICAgY29weSBvZiB0aGlzIGRvY3VtZW50LgorCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQorICAgIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKKyAgICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKKyAgICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCisgICAgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCisKKyA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IgorICAgIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQKKyAgICB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgorCisgNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KKyAgICBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMKKyBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKKyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCisgVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IG9yZy5vYmplY3R3ZWIuYXNtLk9wY29kZXM7CisKKy8qKgorICogVGVzdHMgdGhlIENsYXNzTm9kZQorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBDbGFzc05vZGVUZXN0IGV4dGVuZHMgVGVzdENhc2UgaW1wbGVtZW50cyBPcGNvZGVzIHsKKworICAgIENsYXNzTm9kZSBjbGFzc05vZGUgPSBuZXcgQ2xhc3NOb2RlKCJGb28iLCBBQ0NfUFVCTElDLCBDbGFzc0hlbHBlci5PQkpFQ1RfVFlQRSk7CisgICAgQ2xhc3NOb2RlIGlubmVyQ2xhc3NOb2RlID0gbmV3IElubmVyQ2xhc3NOb2RlKGNsYXNzTm9kZSwgIkZvbyQxIiwgQUNDX1BVQkxJQywgQ2xhc3NIZWxwZXIuT0JKRUNUX1RZUEUpOworCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgY2xhc3NOb2RlLmFkZEZpZWxkKCJmaWVsZCIsIEFDQ19QVUJMSUMsIENsYXNzSGVscGVyLlNUUklOR19UWVBFLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3V0ZXJDbGFzcygpIHsKKyAgICAgICAgYXNzZXJ0TnVsbChjbGFzc05vZGUuZ2V0T3V0ZXJDbGFzcygpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChpbm5lckNsYXNzTm9kZS5nZXRPdXRlckNsYXNzKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RPdXRlckZpZWxkKCkgeworICAgICAgICBhc3NlcnROdWxsKGNsYXNzTm9kZS5nZXRPdXRlckZpZWxkKCJmaWVsZCIpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChpbm5lckNsYXNzTm9kZS5nZXRPdXRlckZpZWxkKCJmaWVsZCIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFja2FnZU5hbWUoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiUGFja2FnZSIsIG51bGwsIGNsYXNzTm9kZS5nZXRQYWNrYWdlTmFtZSgpKTsKKworICAgICAgICBDbGFzc05vZGUgcGFja2FnZU5vZGUgPSBuZXcgQ2xhc3NOb2RlKCJjb20uYWNtZS5Gb28iLCBBQ0NfUFVCTElDLCBDbGFzc0hlbHBlci5PQkpFQ1RfVFlQRSk7CisgICAgICAgIGFzc2VydEVxdWFscygiUGFja2FnZSIsICJjb20uYWNtZSIsIHBhY2thZ2VOb2RlLmdldFBhY2thZ2VOYW1lKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9Nb2R1bGVOb2RlVGVzdC5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvYXN0L01vZHVsZU5vZGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYwNTViYgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2FzdC9Nb2R1bGVOb2RlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgJElkJAorCisgQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQKKyB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIGNvcHlyaWdodAorICAgIHN0YXRlbWVudHMgYW5kIG5vdGljZXMuICBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYQorICAgIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KKworIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUKKyAgICBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCisgICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCisgICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworIDMuIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCisgICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLAorICAgIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLgorCisgNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIKKyAgICBub3IgbWF5ICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYSByZWdpc3RlcmVkCisgICAgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KKworIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtCisgICAgaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTCisgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECisgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTAorIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdDsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LnBhcnNlci5UZXN0UGFyc2VyU3VwcG9ydDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFRlc3RzIHRoZSBDbGFzc05vZGUKKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgTW9kdWxlTm9kZVRlc3QgZXh0ZW5kcyBUZXN0UGFyc2VyU3VwcG9ydCB7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhdGVtZW50Q2xhc3NfRkFJTFMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG5vdFlldEltcGxlbWVudGVkKCkpIHJldHVybjsKKworICAgICAgICBNb2R1bGVOb2RlIG1vZHVsZSA9IHBhcnNlKCJ4ID0gWzEsIDIsIDNdOyBwcmludGxuKHgpIiwgIkNoZWVzZS5ncm9vdnkiKTsKKworICAgICAgICBhc3NlcnRUcnVlKCJTaG91bGQgaGF2ZSBzdGF0ZW1lbnRzIiwgIW1vZHVsZS5nZXRTdGF0ZW1lbnRCbG9jaygpLmlzRW1wdHkoKSk7CisKKyAgICAgICAgTGlzdCBjbGFzc2VzID0gbW9kdWxlLmdldENsYXNzZXMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJOdW1iZXIgb2YgY2xhc3NlcyIsIDEsIGNsYXNzZXMuc2l6ZSgpKTsKKworICAgICAgICBDbGFzc05vZGUgY2xhc3NOb2RlID0gKENsYXNzTm9kZSkgY2xhc3Nlcy5nZXQoMCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJDbGFzcyBuYW1lIiwgIkNoZWVzZSIsIGNsYXNzTm9kZS5nZXROYW1lKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2JzZi9CU0ZUZXN0LmphdmEgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9ic2YvQlNGVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwOTQ4NzYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9ic2YvQlNGVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjExIEBACisvKgorICRJZCQKKworIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCisgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQKKyAgICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKKyAgICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCisgICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQorICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgorICAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKKyAgICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KKworIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCisgICAgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAorICAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCisKKyA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQorICAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLworCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUworIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAorIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKKyBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ic2Y7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5ic2YuQlNGRW5naW5lOworaW1wb3J0IG9yZy5hcGFjaGUuYnNmLkJTRkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmJzZi5CU0ZNYW5hZ2VyOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5EZWZhdWx0R3Jvb3Z5TWV0aG9kczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCisvKioKKyAqIFRlc3RzIHRoZSBCU0YgaW50ZWdyYXRpb24KKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQGF1dGhvciBQYXVsIEtpbmcKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIEJTRlRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwcm90ZWN0ZWQgQlNGTWFuYWdlciBtYW5hZ2VyOworCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbWFuYWdlciA9IG5ldyBCU0ZNYW5hZ2VyKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEludmFsaWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1hbmFnZXIuZXhlYygiZ3Jvb3Z5IiwgbnVsbCwgMCwgMCwgImFzc2VydCBic2YgIT0gbnVsbCIpOworICAgICAgICBtYW5hZ2VyLmV4ZWMoImdyb292eSIsICIiLCAwLCAwLCAiYXNzZXJ0IGJzZiAhPSBudWxsIik7CisgICAgICAgIG1hbmFnZXIuZXhlYygiZ3Jvb3Z5IiwgIi0iLCAwLCAwLCAiYXNzZXJ0IGJzZiAhPSBudWxsIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENvbXBpbGVFcnJvcldpdGhFeGVjKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtYW5hZ2VyLmV4ZWMoImdyb292eSIsICJkdW1teSIsIDAsIDAsICJhc3NlcnQgYXNzZXJ0Iik7CisgICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSBjYXVnaHQgY29tcGlsZSBleGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoQlNGRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoImUuZ2V0TWVzc2FnZSgpIHNob3VsZCBjb250YWluIENvbXBpbGF0aW9uRXJyb3I6ICIgKyBlLmdldE1lc3NhZ2UoKSwKKyAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCkuaW5kZXhPZigiQ29tcGlsYXRpb25FcnJvciIpICE9IC0xKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDb21waWxlRXJyb3JXaXRoRXZhbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgbWFuYWdlci5ldmFsKCJncm9vdnkiLCAiZHVtbXkiLCAwLCAwLCAiYXNzZXJ0IGFzc2VydCIpOworICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgY2F1Z2h0IGNvbXBpbGUgZXhjZXB0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKEJTRkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJlLmdldE1lc3NhZ2UoKSBzaG91bGQgY29udGFpbiBDb21waWxhdGlvbkVycm9yOiAiICsgZS5nZXRNZXNzYWdlKCksCisgICAgICAgICAgICAgICAgICAgIGUuZ2V0TWVzc2FnZSgpLmluZGV4T2YoIkNvbXBpbGF0aW9uRXJyb3IiKSAhPSAtMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhlYygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtYW5hZ2VyLmV4ZWMoImdyb292eSIsICJUZXN0MS5ncm9vdnkiLCAwLCAwLCAiYXNzZXJ0IGJzZiAhPSBudWxsICwgJ3Nob3VsZCBoYXZlIGEgYnNmIHZhcmlhYmxlJyIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBseVdpdGhDbG9zdXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFZlY3RvciBpZ25vcmVQYXJhbU5hbWVzID0gbnVsbDsKKyAgICAgICAgVmVjdG9yIGlnbm9yZUFyZ3MgPSBudWxsOworICAgICAgICBJbnRlZ2VyIGFjdHVhbCA9IChJbnRlZ2VyKSBtYW5hZ2VyLmFwcGx5KCJncm9vdnkiLCAiYXBwbHlUZXN0IiwgMCwgMCwKKyAgICAgICAgICAgICAgICAiMjUxIiwgaWdub3JlUGFyYW1OYW1lcywgaWdub3JlQXJncyk7CisgICAgICAgIGFzc2VydEVxdWFscygyNTEsIGFjdHVhbC5pbnRWYWx1ZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwbHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgVmVjdG9yIGlnbm9yZVBhcmFtTmFtZXMgPSBudWxsOworICAgICAgICBWZWN0b3IgYXJncyA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgYXJncy5hZGQobmV3IEludGVnZXIoMikpOworICAgICAgICBhcmdzLmFkZChuZXcgSW50ZWdlcig1KSk7CisgICAgICAgIGFyZ3MuYWRkKG5ldyBJbnRlZ2VyKDEpKTsKKyAgICAgICAgSW50ZWdlciBhY3R1YWwgPSAoSW50ZWdlcikgbWFuYWdlci5hcHBseSgiZ3Jvb3Z5IiwgImFwcGx5VGVzdCIsIDAsIDAsCisgICAgICAgICAgICAgICAgImRlZiBzdW1tZXIgPSB7IGEsIGIsIGMgLT4gYSAqIDEwMCArIGIgKiAxMCArIGMgfSIsIGlnbm9yZVBhcmFtTmFtZXMsIGFyZ3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjUxLCBhY3R1YWwuaW50VmFsdWUoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEJyYWNrZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1hbmFnZXIuZXhlYygiZ3Jvb3Z5IiwgIlRlc3QxPGdyb292eT4iLCAwLCAwLCAiYXNzZXJ0IGJzZiAhPSBudWxsICwgJ3Nob3VsZCBoYXZlIGEgYnNmIHZhcmlhYmxlJyIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RFdmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE9iamVjdCBhbnN3ZXIgPSBtYW5hZ2VyLmV2YWwoImdyb292eSIsICJUZXN0MS5ncm9vdnkiLCAwLCAwLCAicmV0dXJuIFsxLCAyLCAzXSIpOworICAgICAgICBhc3NlcnRUcnVlKCJTaG91bGQgcmV0dXJuIGEgbGlzdDogIiArIGFuc3dlciwgYW5zd2VyIGluc3RhbmNlb2YgTGlzdCk7CisgICAgICAgIExpc3QgbGlzdCA9IChMaXN0KSBhbnN3ZXI7CisgICAgICAgIGFzc2VydEVxdWFscygiTGlzdCBzaG91bGQgYmUgb2YgcmlnaHQgc2l6ZSIsIDMsIGxpc3Quc2l6ZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHdvRXZhbHNXaXRoU2FtZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgT2JqZWN0IGFuc3dlciA9IG1hbmFnZXIuZXZhbCgiZ3Jvb3Z5IiwgIlRlc3QxLmdyb292eSIsIDAsIDAsICJyZXR1cm4gJ2NoZWVzZSciKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjaGVlc2UiLCBhbnN3ZXIpOworICAgICAgICBhbnN3ZXIgPSBtYW5hZ2VyLmV2YWwoImdyb292eSIsICJUZXN0MS5ncm9vdnkiLCAwLCAwLCAicmV0dXJuICdncm9taXQnIik7CisgICAgICAgIGFzc2VydEVxdWFscygiZ3JvbWl0IiwgYW5zd2VyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhlY0J1ZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKKyAgICAgICAgICAgIG1hbmFnZXIuZXhlYygiZ3Jvb3Z5IiwgIlRlc3QxLmdyb292eSIsIDAsIDAsICJhc3NlcnQgdHJ1ZSIpOworICAgICAgICAgICAgbWFuYWdlci5leGVjKCJncm9vdnkiLCAiVGVzdDEuZ3Jvb3Z5IiwgMCwgMCwgImFzc2VydCB0cnVlIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QnNmVmFyaWFibGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE9iamVjdCBhbnN3ZXIgPSBtYW5hZ2VyLmV2YWwoImdyb292eSIsICJUZXN0MS5ncm9vdnkiLCAwLCAwLAorICAgICAgICAgICAgICAgICJhc3NlcnQgdGhpcy5ic2YgIT0gbnVsbFxuICByZXR1cm4gdGhpcy5ic2YiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiU2hvdWxkIGhhdmUgYW4gYW5zd2VyIiwgYW5zd2VyICE9IG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROb3RGb3VuZFZhcmlhYmxlcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtYW5hZ2VyLnJlZ2lzdGVyQmVhbigieCIsIG5ldyBJbnRlZ2VyKDQpKTsKKyAgICAgICAgT2JqZWN0IGFuc3dlciA9IG1hbmFnZXIuZXZhbCgiZ3Jvb3Z5IiwgIlRlc3QxLmdyb292eSIsIDAsIDAsCisgICAgICAgICAgICAgICAgImRlZiB2YWx1ZU9mWCA9IHRoaXMuYnNmLmxvb2t1cEJlYW4oJ3knKTsgYXNzZXJ0IHZhbHVlT2ZYID09IG51bGwiKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiVW5kZWNsYXJlZCBiZWFucyBzaG91bGQgeWllbGQgbnVsbCIsIGFuc3dlcik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlZ2lzdGVyZWRWYXJpYWJsZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbWFuYWdlci5yZWdpc3RlckJlYW4oIngiLCBuZXcgSW50ZWdlcig0KSk7CisgICAgICAgIE9iamVjdCBhbnN3ZXIgPSBtYW5hZ2VyLmV2YWwoImdyb292eSIsICJUZXN0MS5ncm9vdnkiLCAwLCAwLAorICAgICAgICAgICAgICAgICJkZWYgdmFsdWVPZlggPSB0aGlzLmJzZi5sb29rdXBCZWFuKCd4Jyk7IGFzc2VydCB2YWx1ZU9mWCA9PSA0OyB2YWx1ZU9mWCArIDEiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgcmV0dXJuIiwgbmV3IEludGVnZXIoNSksIGFuc3dlcik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFVucmVnaXN0ZXJlZFZhcmlhYmxlcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtYW5hZ2VyLnJlZ2lzdGVyQmVhbigieCIsIG5ldyBJbnRlZ2VyKDQpKTsKKyAgICAgICAgT2JqZWN0IGFuc3dlciA9IG1hbmFnZXIuZXZhbCgiZ3Jvb3Z5IiwgIlRlc3QxLmdyb292eSIsIDAsIDAsCisgICAgICAgICAgICAgICAgImRlZiB2YWx1ZU9mWCA9IHRoaXMuYnNmLmxvb2t1cEJlYW4oJ3gnKTsgYXNzZXJ0IHZhbHVlT2ZYID09IDQ7IHZhbHVlT2ZYICsgMSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCByZXR1cm4iLCBuZXcgSW50ZWdlcig1KSwgYW5zd2VyKTsKKyAgICAgICAgbWFuYWdlci51bnJlZ2lzdGVyQmVhbigieCIpOworICAgICAgICAvLyBoYXZlIHRvIGxvb2t1cCByZWdpc3RlcmVkIGJlYW5zCisgICAgICAgIGFuc3dlciA9IG1hbmFnZXIuZXZhbCgiZ3Jvb3Z5IiwgIlRlc3QxLmdyb292eSIsIDAsIDAsCisgICAgICAgICAgICAgICAgImRlZiB2YWx1ZU9mWCA9IHRoaXMuYnNmLmxvb2t1cEJlYW4oJ3gnKTsgYXNzZXJ0IHZhbHVlT2ZYID09IG51bGwiKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiVW5yZWdpc3RlcmVkIGJlYW5zIHNob3VsZCB5aWVsZCBudWxsIiwgYW5zd2VyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVjbGFyZWRWYXJpYWJsZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbWFuYWdlci5kZWNsYXJlQmVhbigieHl6IiwgbmV3IEludGVnZXIoNCksIEludGVnZXIuY2xhc3MpOworICAgICAgICBPYmplY3QgYW5zd2VyID0gbWFuYWdlci5ldmFsKCJncm9vdnkiLCAiVGVzdDEuZ3Jvb3Z5IiwgMCwgMCwgInh5eiArIDEiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgcmV0dXJuIiwgbmV3IEludGVnZXIoNSksIGFuc3dlcik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFVuZGVjbGFyZWRWYXJpYWJsZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbWFuYWdlci5kZWNsYXJlQmVhbigiYWJjIiwgbmV3IEludGVnZXIoNCksIEludGVnZXIuY2xhc3MpOworICAgICAgICAvLyBkZWNsYXJlZCBiZWFucyBzaG91bGQganVzdCBiZSBhdmFpbGFibGUKKyAgICAgICAgT2JqZWN0IGFuc3dlciA9IG1hbmFnZXIuZXZhbCgiZ3Jvb3Z5IiwgIlRlc3QxLmdyb292eSIsIDAsIDAsICJhYmMgKyAxIik7CisgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IHJldHVybiIsIG5ldyBJbnRlZ2VyKDUpLCBhbnN3ZXIpOworICAgICAgICBtYW5hZ2VyLnVuZGVjbGFyZUJlYW4oImFiYyIpOworICAgICAgICBhbnN3ZXIgPSBtYW5hZ2VyLmV2YWwoImdyb292eSIsICJUZXN0MS5ncm9vdnkiLCAwLCAwLCAiYWJjIik7CisgICAgICAgIGFzc2VydE51bGwoIlVuZGVjbGFyZWQgYmVhbnMgc2hvdWxkIHlpZWxkIG51bGwiLCBhbnN3ZXIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEJTRkVuZ2luZSBic2ZFbmdpbmUgPSBtYW5hZ2VyLmxvYWRTY3JpcHRpbmdFbmdpbmUoImdyb292eSIpOworICAgICAgICBtYW5hZ2VyLmRlY2xhcmVCZWFuKCJteXZhciIsICJoZWxsbyIsIFN0cmluZy5jbGFzcyk7CisgICAgICAgIE9iamVjdCBteXZhciA9IG1hbmFnZXIubG9va3VwQmVhbigibXl2YXIiKTsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IChTdHJpbmcpIGJzZkVuZ2luZS5jYWxsKG15dmFyLCAicmV2ZXJzZSIsIG5ldyBPYmplY3RbXXt9KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJvbGxlaCIsIHJlc3VsdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEV4ZWNGaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWNTY3JpcHQoInNyYy90ZXN0L2dyb292eS9zY3JpcHQvTWFwRnJvbUxpc3QuZ3Jvb3Z5Iik7CisgICAgICAgIGV4ZWNTY3JpcHQoInNyYy90ZXN0L2dyb292eS9zY3JpcHQvQXRvbVRlc3RTY3JpcHQuZ3Jvb3Z5Iik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgZXhlY1NjcmlwdChTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtYW5hZ2VyLmV4ZWMoImdyb292eSIsIGZpbGVOYW1lLCAwLCAwLCBEZWZhdWx0R3Jvb3Z5TWV0aG9kcy5nZXRUZXh0KG5ldyBGaWxlKGZpbGVOYW1lKSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2JzZi9DYWNoZUJTRlRlc3QuamF2YSBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2JzZi9DYWNoZUJTRlRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjI4MDhhCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvYnNmL0NhY2hlQlNGVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTM3IEBACisvKgorICogJElkJAorICogCisgKiBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUKKyAqIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbgorICogY29weXJpZ2h0IHN0YXRlbWVudHMgYW5kIG5vdGljZXMuIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhIGNvcHkKKyAqIG9mIHRoaXMgZG9jdW1lbnQuIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAzLgorICogVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gRm9yCisgKiB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLiA0LiBQcm9kdWN0cyBkZXJpdmVkCisgKiBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4KKyAqIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYQorICogcmVnaXN0ZXJlZCB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLiA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUKKyAqIENvZGVoYXVzIC0gaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorICogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorICogREFNQUdFLgorICogIAorICovCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuYnNmOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IG9yZy5hcGFjaGUuYnNmLkJTRkVuZ2luZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmJzZi5CU0ZFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5ic2YuQlNGTWFuYWdlcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKKy8qKgorICogVGVzdHMgdGhlIENhY2hpbmcgQlNGIGludGVncmF0aW9uCisgKgorICogQGF1dGhvciBKYW1lcyBCaXJjaGZpZWxkCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBDYWNoZUJTRlRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwcm90ZWN0ZWQgQlNGTWFuYWdlciBtYW5hZ2VyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzIENBQ0hJTkdfRU5HSU5FID0gQ2FjaGluZ0dyb292eUVuZ2luZS5jbGFzczsKKworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIG92ZXJyaWRlIHN0YW5kYXJkIGVuZ2luZSB3aXRoIGNhY2hpbmcgb25lCisgICAgICAgIEJTRk1hbmFnZXIucmVnaXN0ZXJTY3JpcHRpbmdFbmdpbmUoImdyb292eSIsIENBQ0hJTkdfRU5HSU5FLmdldE5hbWUoKSwgbmV3IFN0cmluZ1tdeyJncm9vdnkiLCAiZ3kifSk7CisgICAgICAgIG1hbmFnZXIgPSBuZXcgQlNGTWFuYWdlcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RWZXJzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJCU0ZNYW5hZ2VyLmdldFZlcnNpb24oKSA9ICIgKyBCU0ZNYW5hZ2VyLmdldFZlcnNpb24oKSk7CisgICAgICAgIEJTRkVuZ2luZSBic2ZFbmdpbmUgPSBtYW5hZ2VyLmxvYWRTY3JpcHRpbmdFbmdpbmUoImdyb292eSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoQ0FDSElOR19FTkdJTkUsIGJzZkVuZ2luZS5nZXRDbGFzcygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhlYygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtYW5hZ2VyLmV4ZWMoImdyb292eSIsICJUZXN0MS5ncm9vdnkiLCAwLCAwLCAicHJpbnRsbigndGVzdGluZyBFeGVjJykiKTsKKyAgICAgICAgLy9ub3RoaW5nIHRvIHJlYWxseSB0ZXN0IGhlcmUuLi5qdXN0IGxvb2tpbmcgZm9yIGRlYnVnIHRoYXQgc2F5cyBpdAorICAgICAgICAvLyB1c2VkIGNhY2hlIHZlcnNpb24KKyAgICAgICAgbWFuYWdlci5leGVjKCJncm9vdnkiLCAiVGVzdDEuZ3Jvb3Z5IiwgMCwgMCwgInByaW50bG4oJ3Rlc3RpbmcgRXhlYycpIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENvbXBpbGVFcnJvcldpdGhFeGVjKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtYW5hZ2VyLmV4ZWMoImdyb292eSIsICJkdW1teSIsIDAsIDAsICJhc3NlcnQgYXNzZXJ0Iik7CisgICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSBjYXVnaHQgY29tcGlsZSBleGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoQlNGRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoImUuZ2V0TWVzc2FnZSgpIHNob3VsZCBjb250YWluIENvbXBpbGF0aW9uRXJyb3I6ICIgKyBlLmdldE1lc3NhZ2UoKSwKKyAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCkuaW5kZXhPZigiQ29tcGlsYXRpb25FcnJvciIpICE9IC0xKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RFdmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE9iamVjdCBkb250Y2FyZSA9IG1hbmFnZXIuZXZhbCgiZ3Jvb3Z5IiwgIlRlc3QxLmdyb292eSIsIDAsIDAsICJyZXR1cm4gWzEsIDIsIDNdIik7CisgICAgICAgIC8vIG5vdGhpbmcgdG8gcmVhbGx5IHRlc3QgaGVyZS4uLmp1c3QgbG9va2luZyBmb3IgZGVidWcgdGhhdCBzYXlzIGl0CisgICAgICAgIC8vIHVzZWQgY2FjaGUgdmVyc2lvbgorICAgICAgICBPYmplY3QgYW5zd2VyID0gbWFuYWdlci5ldmFsKCJncm9vdnkiLCAiVGVzdC5ncm9vdnkiLCAwLCAwLCAicmV0dXJuIFsxLCAyLCAzXSIpOworICAgICAgICBhc3NlcnRUcnVlKCJTaG91bGQgcmV0dXJuIGEgbGlzdDogIiArIGFuc3dlciwgYW5zd2VyIGluc3RhbmNlb2YgTGlzdCk7CisgICAgICAgIExpc3QgbGlzdCA9IChMaXN0KSBhbnN3ZXI7CisgICAgICAgIGFzc2VydEVxdWFscygiTGlzdCBzaG91bGQgYmUgb2YgcmlnaHQgc2l6ZSIsIDMsIGxpc3Quc2l6ZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGlsZUVycm9yV2l0aEV2YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1hbmFnZXIuZXZhbCgiZ3Jvb3Z5IiwgImR1bW15IiwgMCwgMCwgImFzc2VydCBhc3NlcnQiKTsKKyAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIGNhdWdodCBjb21waWxlIGV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChCU0ZFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiZS5nZXRNZXNzYWdlKCkgc2hvdWxkIGNvbnRhaW4gQ29tcGlsYXRpb25FcnJvcjogIiArIGUuZ2V0TWVzc2FnZSgpLAorICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKS5pbmRleE9mKCJDb21waWxhdGlvbkVycm9yIikgIT0gLTEpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEJ1aWx0SW5WYXJpYWJsZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBPYmplY3QgYW5zd2VyID0gbWFuYWdlci5ldmFsKCJncm9vdnkiLCAiVGVzdDEuZ3Jvb3Z5IiwgMCwgMCwKKyAgICAgICAgICAgICAgICAiYXNzZXJ0IHRoaXMuYnNmICE9IG51bGxcbiAgcmV0dXJuIHRoaXMuYnNmIik7CisgICAgICAgIGFzc2VydFRydWUoIlNob3VsZCBoYXZlIGFuIGFuc3dlciIsIGFuc3dlciAhPSBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFyaWFibGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1hbmFnZXIucmVnaXN0ZXJCZWFuKCJ4IiwgbmV3IEludGVnZXIoNCkpOworICAgICAgICBPYmplY3QgZG9udGNhcmUgPSBtYW5hZ2VyLmV2YWwoImdyb292eSIsICJUZXN0MS5ncm9vdnkiLCAwLCAwLAorICAgICAgICAgICAgICAgICJ2YWx1ZU9mWCA9IHRoaXMuYnNmLmxvb2t1cEJlYW4oJ3gnKTsgYXNzZXJ0IHZhbHVlT2ZYID09IDQ7IHZhbHVlT2ZYICsgMSIpOworICAgICAgICAvLyBub3RoaW5nIHRvIHJlYWxseSB0ZXN0IGhlcmUuLi5qdXN0IGxvb2tpbmcgZm9yIGRlYnVnIHRoYXQgc2F5cyBpdAorICAgICAgICAvLyB1c2VkIGNhY2hlIHZlcnNpb24KKyAgICAgICAgT2JqZWN0IGFuc3dlciA9IG1hbmFnZXIuZXZhbCgiZ3Jvb3Z5IiwgIlRlc3QyLmdyb292eSIsIDAsIDAsCisgICAgICAgICAgICAgICAgInZhbHVlT2ZYID0gdGhpcy5ic2YubG9va3VwQmVhbigneCcpOyBhc3NlcnQgdmFsdWVPZlggPT0gNDsgdmFsdWVPZlggKyAxIik7CisgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IHJldHVybiIsIG5ldyBJbnRlZ2VyKDUpLCBhbnN3ZXIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDbGFzc0xvYWRlclNldCgpIHRocm93cyBCU0ZFeGNlcHRpb24geworICAgICAgICBDYWNoaW5nR3Jvb3Z5RW5naW5lIGNhY2hpbmdHcm9vdnlFbmdpbmUgPSBuZXcgQ2FjaGluZ0dyb292eUVuZ2luZSgpOworICAgICAgICBtYW5hZ2VyLnNldENsYXNzTG9hZGVyKG51bGwpOworICAgICAgICBjYWNoaW5nR3Jvb3Z5RW5naW5lLmluaXRpYWxpemUobWFuYWdlciwgImR1bW15IiwgbmV3IFZlY3RvcigpKTsKKyAgICAgICAgLy8gc3RpbGwgd29ya2luZyBpbXBsaWVzIGNsYXNzbG9hZGVyIHNldCwgY292ZXJhZ2UgY29uZmlybXMgdGhpcworICAgICAgICBhc3NlcnRFcXVhbHMoImhpIiwgbWFuYWdlci5ldmFsKCJncm9vdnkiLCAiZHVtbXkiLCAwLCAwLCAiJ2hpJyIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVjbGFyZWRWYXJpYWJsZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbWFuYWdlci5kZWNsYXJlQmVhbigiZm9vIiwgbmV3IEludGVnZXIoNSksIEludGVnZXIuY2xhc3MpOworICAgICAgICBPYmplY3QgYW5zd2VyID0gbWFuYWdlci5ldmFsKCJncm9vdnkiLCAiVGVzdDEuZ3Jvb3Z5IiwgMCwgMCwgInZhbHVlT2ZGb28gPSBmb287IHJldHVybiB2YWx1ZU9mRm9vIik7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig1KSwgYW5zd2VyKTsKKyAgICAgICAgbWFuYWdlci5kZWNsYXJlQmVhbigiZm9vIiwgbmV3IEludGVnZXIoNiksIEludGVnZXIuY2xhc3MpOworICAgICAgICBhbnN3ZXIgPSBtYW5hZ2VyLmV2YWwoImdyb292eSIsICJUZXN0Mi5ncm9vdnkiLCAwLCAwLCAidmFsdWVPZkZvbyA9IGZvbzsgcmV0dXJuIHZhbHVlT2ZGb28iKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDYpLCBhbnN3ZXIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL0J5dGVjb2RlSGVscGVyVGVzdC5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vQnl0ZWNvZGVIZWxwZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNhM2Q4MQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL0J5dGVjb2RlSGVscGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgJElkJAorCisgQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQKKyB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIGNvcHlyaWdodAorICAgIHN0YXRlbWVudHMgYW5kIG5vdGljZXMuICBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYQorICAgIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KKworIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUKKyAgICBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCisgICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCisgICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworIDMuIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCisgICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLAorICAgIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLgorCisgNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIKKyAgICBub3IgbWF5ICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYSByZWdpc3RlcmVkCisgICAgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KKworIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtCisgICAgaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTCisgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECisgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTAorIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAqLworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW47CisKK2ltcG9ydCBncm9vdnkudXRpbC5Hcm9vdnlUZXN0Q2FzZTsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5DbGFzc0hlbHBlcjsKKworLyoqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgQnl0ZWNvZGVIZWxwZXJUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgcHVibGljIHZvaWQgdGVzdFR5cGVOYW1lKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIltDIiwgQnl0ZWNvZGVIZWxwZXIuZ2V0VHlwZURlc2NyaXB0aW9uKENsYXNzSGVscGVyLmNoYXJfVFlQRS5tYWtlQXJyYXkoKSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2REZXNjcmlwdG9yKCkgeworICAgICAgICBTdHJpbmcgYW5zd2VyID0gQnl0ZWNvZGVIZWxwZXIuZ2V0TWV0aG9kRGVzY3JpcHRvcihjaGFyW10uY2xhc3MsIG5ldyBDbGFzc1swXSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKClbQyIsIGFuc3dlcik7CisKKyAgICAgICAgYW5zd2VyID0gQnl0ZWNvZGVIZWxwZXIuZ2V0TWV0aG9kRGVzY3JpcHRvcihpbnQuY2xhc3MsIG5ldyBDbGFzc1tde2xvbmcuY2xhc3N9KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIoSilJIiwgYW5zd2VyKTsKKworICAgICAgICBhbnN3ZXIgPSBCeXRlY29kZUhlbHBlci5nZXRNZXRob2REZXNjcmlwdG9yKFN0cmluZ1tdLmNsYXNzLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3MsIGludC5jbGFzc30pOworICAgICAgICBhc3NlcnRFcXVhbHMoIihMamF2YS9sYW5nL1N0cmluZztJKVtMamF2YS9sYW5nL1N0cmluZzsiLCBhbnN3ZXIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL0NhbGxDbG9zdXJlRmllbGRBc01ldGhvZFRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vQ2FsbENsb3N1cmVGaWVsZEFzTWV0aG9kVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUwYTZhMwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL0NhbGxDbG9zdXJlRmllbGRBc01ldGhvZFRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMzYgQEAKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbgorCitpbXBvcnQgZ3Jvb3Z5LnV0aWwuR3Jvb3Z5VGVzdENhc2UKKworLyoqCisgKiBAYXV0aG9yIEd1aWxsYXVtZSBMYWZvcmdlCisgKi8KK2NsYXNzIENhbGxDbG9zdXJlRmllbGRBc01ldGhvZFRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICBTdHJpbmcgZmlyc3RuYW1lID0gIkd1aWxsYXVtZSIKKyAgICBkZWYgY2xvc3VyZU1ldGhvZCA9IHsgZ3JlZXRpbmctPiAiJHtncmVldGluZ30gJHtmaXJzdG5hbWV9IiB9CisgICAgcHVibGljIHN0YXRpYyBzdGF0aWNDbG9zdXJlTWV0aG9kID0ge2l0fQorCisgICAgLyoqCisgICAgICogQ2hlY2sgdGhhdCB3ZSBjYW4gY2FsbCBhIGNsb3N1cmUgZGVmaW5lZCBhcyBhIGZpZWxkIGFzIGlmIGl0IHdlcmUgYSBub3JtYWwgbWV0aG9kCisgICAgICovCisgICAgdm9pZCB0ZXN0Q2FsbFRvQ2xvc3VyZUFzTWV0aG9kKCkgeworICAgICAgICBkZWYgb2JqID0gbmV3IENhbGxDbG9zdXJlRmllbGRBc01ldGhvZFRlc3QoKQorICAgICAgICBhc3NlcnQgb2JqLmNsb3N1cmVNZXRob2QoIkhlbGxvIikgPT0gIkhlbGxvIEd1aWxsYXVtZSIKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0Q2FsbFRvQ2xvc3VyZUFzTWV0aG9kRnJvbVN0YXRpY0ZpZWxkKCkgeworICAgICAgICBhc3NlcnQgQ2FsbENsb3N1cmVGaWVsZEFzTWV0aG9kVGVzdC5zdGF0aWNDbG9zdXJlTWV0aG9kKCJIZWxsbyIpID09ICJIZWxsbyIKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0RW5zdXJlQ2FsbE1ldGhvZElzVXNlZCgpIHsKKyAgICAgIGFzc2VydFNjcmlwdCAiIiIKKyAgICAgICAgY2xhc3MgRHVtbXkgeworICAgICAgICAgICAgZGVmIGNhbGwoT2JqZWN0IGFyZ3VtZW50cykgeyIxIn0KKyAgICAgICAgfQorICAgICAgICBkZWYgYyA9IG5ldyBEdW1teSgpCisgICAgICAgIGFzc2VydCBjKDIpID09ICIxIiAgICAgIAorICAgICAgIiIiICAgIAorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vQ2FwaXRhbGl6ZVRlc3QuamF2YSBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL0NhcGl0YWxpemVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc5ZWY1ZQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL0NhcGl0YWxpemVUZXN0LmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAkSWQkCisKKyBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAorIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0CisgICAgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhCisgICAgY29weSBvZiB0aGlzIGRvY3VtZW50LgorCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQorICAgIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKKyAgICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKKyAgICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCisgICAgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCisKKyA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IgorICAgIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQKKyAgICB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgorCisgNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KKyAgICBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMKKyBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKKyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCisgVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbjsKKworaW1wb3J0IGdyb292eS51dGlsLkdyb292eVRlc3RDYXNlOworCisvKioKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBDYXBpdGFsaXplVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RDYXBpdGFsaXplKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIkZvbyIsIFZlcmlmaWVyLmNhcGl0YWxpemUoImZvbyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJGb28iLCBWZXJpZmllci5jYXBpdGFsaXplKCJGb28iKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiRk9vIiwgVmVyaWZpZXIuY2FwaXRhbGl6ZSgiZk9vIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkZPTyIsIFZlcmlmaWVyLmNhcGl0YWxpemUoImZPTyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJGIiwgVmVyaWZpZXIuY2FwaXRhbGl6ZSgiZiIpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL0NsYXNzQ29tcGxldGlvblZlcmlmaWVyVGVzdC5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vQ2xhc3NDb21wbGV0aW9uVmVyaWZpZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI0ZWQyNAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL0NsYXNzQ29tcGxldGlvblZlcmlmaWVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTI2IEBACitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW47CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5DbGFzc0hlbHBlcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5DbGFzc05vZGU7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuTWV0aG9kTm9kZTsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5QYXJhbWV0ZXI7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLlNvdXJjZVVuaXQ7CisKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworCisvKioKKyAqIEBhdXRob3IgUGF1bCBLaW5nCisgKi8KK3B1YmxpYyBjbGFzcyBDbGFzc0NvbXBsZXRpb25WZXJpZmllclRlc3QgZXh0ZW5kcyBUZXN0U3VwcG9ydCB7CisgICAgcHJpdmF0ZSBTb3VyY2VVbml0IHNvdXJjZTsKKyAgICBwcml2YXRlIENsYXNzQ29tcGxldGlvblZlcmlmaWVyIHZlcmlmaWVyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQlNUUkFDVF9GSU5BTF9DTEFTUyA9ICJBYnN0cmFjdEZpbmFsQ2xhc3MiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSU5BTF9JTlRFUkZBQ0UgPSAiRmluYWxJbnRlcmZhY2UiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBFQ1RFRF9DTEFTU19NT0RJRklFUl9FUlJPUl9NRVNTQUdFID0KKyAgICAgICAgICAgICJUaGUgY2xhc3MgJyIgKyBBQlNUUkFDVF9GSU5BTF9DTEFTUyArICInIG11c3Qgbm90IGJlIGJvdGggZmluYWwgYW5kIGFic3RyYWN0LiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUEVDVEVEX0lOVEVSRkFDRV9NT0RJRklFUl9FUlJPUl9NRVNTQUdFID0KKyAgICAgICAgICAgICJUaGUgaW50ZXJmYWNlICciICsgRklOQUxfSU5URVJGQUNFICsgIicgbXVzdCBub3QgYmUgZmluYWwuIEl0IGlzIGJ5IGRlZmluaXRpb24gYWJzdHJhY3QuIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQRUNURURfSU5URVJGQUNFX0ZJTkFMX01FVEhPRF9FUlJPUl9NRVNTQUdFID0KKyAgICAgICAgICAgICJUaGUgbWV0aG9kICdqYXZhLmxhbmcuT2JqZWN0IHh4eCgpJyBmcm9tIGludGVyZmFjZSAnenp6JyBtdXN0IG5vdCBiZSBmaW5hbC4gSXQgaXMgYnkgZGVmaW5pdGlvbiBhYnN0cmFjdC4iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBFQ1RFRF9JTlRFUkZBQ0VfU1RBVElDX01FVEhPRF9FUlJPUl9NRVNTQUdFID0KKyAgICAgICAgICAgICJUaGUgbWV0aG9kICdqYXZhLmxhbmcuT2JqZWN0IHl5eSgpJyBmcm9tIGludGVyZmFjZSAnenp6JyBtdXN0IG5vdCBiZSBzdGF0aWMuIE9ubHkgZmllbGRzIG1heSBiZSBzdGF0aWMgaW4gYW4gaW50ZXJmYWNlLiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUEVDVEVEX1RSQU5TSUVOVF9DTEFTU19FUlJPUl9NRVNTQUdFID0KKyAgICAgICAgICAgICJUaGUgY2xhc3MgJ0RvZGd5Q2xhc3MnIGhhcyBhbiBpbmNvcnJlY3QgbW9kaWZpZXIgdHJhbnNpZW50LiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUEVDVEVEX1ZPTEFUSUxFX0NMQVNTX0VSUk9SX01FU1NBR0UgPQorICAgICAgICAgICAgIlRoZSBjbGFzcyAnRG9kZ3lDbGFzcycgaGFzIGFuIGluY29ycmVjdCBtb2RpZmllciB2b2xhdGlsZS4iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBFQ1RFRF9EVVBMSUNBVEVfTUVUSE9EX0VSUk9SX0NMQVNTX01FU1NBR0UgPQorICAgICAgICAgICAgIlJlcGV0aXRpdmUgbWV0aG9kIG5hbWUvc2lnbmF0dXJlIGZvciBtZXRob2QgJ2phdmEubGFuZy5PYmplY3QgeHh4KCknIGluIGNsYXNzICd6enonLiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUEVDVEVEX0RVUExJQ0FURV9NRVRIT0RfRVJST1JfSU5URVJGQUNFX01FU1NBR0UgPQorICAgICAgICAgICAgIlJlcGV0aXRpdmUgbWV0aG9kIG5hbWUvc2lnbmF0dXJlIGZvciBtZXRob2QgJ2phdmEubGFuZy5PYmplY3QgeHh4KGphdmEubGFuZy5TdHJpbmcpJyBpbiBpbnRlcmZhY2UgJ3p6eicuIjsKKworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgIHNvdXJjZSA9IFNvdXJjZVVuaXQuY3JlYXRlKCJkdW1teS5ncm9vdnkiLCAiIik7CisgICAgICAgIHZlcmlmaWVyID0gbmV3IENsYXNzQ29tcGxldGlvblZlcmlmaWVyKHNvdXJjZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERldGVjdHNGaW5hbEFic3RyYWN0Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgY2hlY2tWaXNpdEVycm9ycygiRmluYWxDbGFzcyIsIEFDQ19GSU5BTCwgZmFsc2UpOworICAgICAgICBjaGVja1Zpc2l0RXJyb3JzKCJBYnN0cmFjdENsYXNzIiwgQUNDX0FCU1RSQUNULCBmYWxzZSk7CisgICAgICAgIGNoZWNrVmlzaXRFcnJvcnMoQUJTVFJBQ1RfRklOQUxfQ0xBU1MsIEFDQ19BQlNUUkFDVCB8IEFDQ19GSU5BTCwgdHJ1ZSk7CisgICAgICAgIGNoZWNrRXJyb3JNZXNzYWdlKEVYUEVDVEVEX0NMQVNTX01PRElGSUVSX0VSUk9SX01FU1NBR0UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3REZXRlY3RzRHVwbGljYXRlTWV0aG9kc0ZvckNsYXNzTm9QYXJhbXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgY2hlY2tEZXRlY3RzRHVwbGljYXRlTWV0aG9kcygwLCBFWFBFQ1RFRF9EVVBMSUNBVEVfTUVUSE9EX0VSUk9SX0NMQVNTX01FU1NBR0UsIFBhcmFtZXRlci5FTVBUWV9BUlJBWSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERldGVjdHNEdXBsaWNhdGVNZXRob2RzRm9ySW50ZXJmYWNlT25lUGFyYW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUGFyYW1ldGVyW10gc3RyaW5nUGFyYW0gPSB7bmV3IFBhcmFtZXRlcihDbGFzc0hlbHBlci5TVFJJTkdfVFlQRSwgIngiKX07CisgICAgICAgIGNoZWNrRGV0ZWN0c0R1cGxpY2F0ZU1ldGhvZHMoQUNDX0lOVEVSRkFDRSwgRVhQRUNURURfRFVQTElDQVRFX01FVEhPRF9FUlJPUl9JTlRFUkZBQ0VfTUVTU0FHRSwgc3RyaW5nUGFyYW0pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja0RldGVjdHNEdXBsaWNhdGVNZXRob2RzKGludCBtb2RpZmllcnMsIFN0cmluZyBleHBlY3RlZEVycm9yTWVzc2FnZSwgUGFyYW1ldGVyW10gcGFyYW1zKSB7CisgICAgICAgIENsYXNzTm9kZSBub2RlID0gbmV3IENsYXNzTm9kZSgienp6IiwgbW9kaWZpZXJzLCBDbGFzc0hlbHBlci5PQkpFQ1RfVFlQRSk7CisgICAgICAgIG5vZGUuYWRkTWV0aG9kKG5ldyBNZXRob2ROb2RlKCJ4eHgiLCBBQ0NfUFVCTElDLCBDbGFzc0hlbHBlci5PQkpFQ1RfVFlQRSwgcGFyYW1zLCBDbGFzc05vZGUuRU1QVFlfQVJSQVksIG51bGwpKTsKKyAgICAgICAgbm9kZS5hZGRNZXRob2QobmV3IE1ldGhvZE5vZGUoInh4eCIsIEFDQ19QVUJMSUMsIENsYXNzSGVscGVyLk9CSkVDVF9UWVBFLCBwYXJhbXMsIENsYXNzTm9kZS5FTVBUWV9BUlJBWSwgbnVsbCkpOworICAgICAgICB2ZXJpZmllci52aXNpdENsYXNzKG5vZGUpOworICAgICAgICBjaGVja0Vycm9yQ291bnQoMik7CisgICAgICAgIGNoZWNrRXJyb3JNZXNzYWdlKGV4cGVjdGVkRXJyb3JNZXNzYWdlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGV0ZWN0c0luY29ycmVjdE90aGVyTW9kaWZpZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgY2hlY2tWaXNpdEVycm9ycygiRG9kZ3lDbGFzcyIsIEFDQ19UUkFOU0lFTlQgfCBBQ0NfVk9MQVRJTEUsIHRydWUpOworICAgICAgICBjaGVja0Vycm9yTWVzc2FnZShFWFBFQ1RFRF9UUkFOU0lFTlRfQ0xBU1NfRVJST1JfTUVTU0FHRSk7CisgICAgICAgIGNoZWNrRXJyb3JNZXNzYWdlKEVYUEVDVEVEX1ZPTEFUSUxFX0NMQVNTX0VSUk9SX01FU1NBR0UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3REZXRlY3RzRmluYWxBYnN0cmFjdEludGVyZmFjZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBjaGVja1Zpc2l0RXJyb3JzKEZJTkFMX0lOVEVSRkFDRSwgQUNDX0FCU1RSQUNUIHwgQUNDX0ZJTkFMIHwgQUNDX0lOVEVSRkFDRSwgdHJ1ZSk7CisgICAgICAgIGNoZWNrRXJyb3JNZXNzYWdlKEVYUEVDVEVEX0lOVEVSRkFDRV9NT0RJRklFUl9FUlJPUl9NRVNTQUdFKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGV0ZWN0c0ZpbmFsQW5kU3RhdGljTWV0aG9kc0luSW50ZXJmYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIENsYXNzTm9kZSBub2RlID0gbmV3IENsYXNzTm9kZSgienp6IiwgQUNDX0FCU1RSQUNUIHwgQUNDX0lOVEVSRkFDRSwgQ2xhc3NIZWxwZXIuT0JKRUNUX1RZUEUpOworICAgICAgICBub2RlLmFkZE1ldGhvZChuZXcgTWV0aG9kTm9kZSgieHh4IiwgQUNDX1BVQkxJQyB8IEFDQ19GSU5BTCwgQ2xhc3NIZWxwZXIuT0JKRUNUX1RZUEUsIFBhcmFtZXRlci5FTVBUWV9BUlJBWSwgQ2xhc3NOb2RlLkVNUFRZX0FSUkFZLCBudWxsKSk7CisgICAgICAgIG5vZGUuYWRkTWV0aG9kKG5ldyBNZXRob2ROb2RlKCJ5eXkiLCBBQ0NfUFVCTElDIHwgQUNDX1NUQVRJQywgQ2xhc3NIZWxwZXIuT0JKRUNUX1RZUEUsIFBhcmFtZXRlci5FTVBUWV9BUlJBWSwgQ2xhc3NOb2RlLkVNUFRZX0FSUkFZLCBudWxsKSk7CisgICAgICAgIC8vIGNvbnN0cnVjdG9ycyBzaG91bGQgbm90IGJlIHRyZWF0ZWQgYXMgZXJyb3JzICh0aGV5IGhhdmUgbm8gcmVhbCBtZWFuaW5nIGZvciBpbnRlcmZhY2VzIGFueXdheSkKKyAgICAgICAgbm9kZS5hZGRNZXRob2QobmV3IE1ldGhvZE5vZGUoIjxjbGluaXQ+IiwgQUNDX1BVQkxJQyB8IEFDQ19TVEFUSUMsIENsYXNzSGVscGVyLk9CSkVDVF9UWVBFLCBQYXJhbWV0ZXIuRU1QVFlfQVJSQVksIENsYXNzTm9kZS5FTVBUWV9BUlJBWSwgbnVsbCkpOworICAgICAgICB2ZXJpZmllci52aXNpdENsYXNzKG5vZGUpOworICAgICAgICBjaGVja0Vycm9yQ291bnQoMik7CisgICAgICAgIGNoZWNrRXJyb3JNZXNzYWdlKEVYUEVDVEVEX0lOVEVSRkFDRV9GSU5BTF9NRVRIT0RfRVJST1JfTUVTU0FHRSk7CisgICAgICAgIGNoZWNrRXJyb3JNZXNzYWdlKEVYUEVDVEVEX0lOVEVSRkFDRV9TVEFUSUNfTUVUSE9EX0VSUk9SX01FU1NBR0UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja0Vycm9yQ291bnQoaW50IGNvdW50KSB7CisgICAgICAgIGFzc2VydEVxdWFscyhidWlsZEVycm9yTWVzc2FnZShjb3VudCksIGNvdW50LCBzb3VyY2UuZ2V0RXJyb3JDb2xsZWN0b3IoKS5nZXRFcnJvckNvdW50KCkpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGJ1aWxkRXJyb3JNZXNzYWdlKGludCBjb3VudCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIHNiLmFwcGVuZCgiRXhwZWN0ZWQgIikuYXBwZW5kKGNvdW50KTsKKyAgICAgICAgc2IuYXBwZW5kKCIgZXJyb3IgbWVzc2FnZXMgYnV0IGZvdW5kICIpOworICAgICAgICBzYi5hcHBlbmQoc291cmNlLmdldEVycm9yQ29sbGVjdG9yKCkuZ2V0RXJyb3JDb3VudCgpKS5hcHBlbmQoIjpcbiIpOworICAgICAgICBzYi5hcHBlbmQoZmxhdHRlbkVycm9yTWVzc2FnZSgpKTsKKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrVmlzaXRFcnJvcnMoU3RyaW5nIG5hbWUsIGludCBtb2RpZmllcnMsIGJvb2xlYW4gZXhwZWN0ZWRUb0ZhaWwpIHsKKyAgICAgICAgQ2xhc3NOb2RlIG5vZGUgPSBuZXcgQ2xhc3NOb2RlKG5hbWUsIG1vZGlmaWVycywgQ2xhc3NIZWxwZXIuT0JKRUNUX1RZUEUpOworICAgICAgICB2ZXJpZmllci52aXNpdENsYXNzKG5vZGUpOworICAgICAgICBhc3NlcnRUcnVlKHNvdXJjZS5nZXRFcnJvckNvbGxlY3RvcigpLmhhc0Vycm9ycygpID09IGV4cGVjdGVkVG9GYWlsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tFcnJvck1lc3NhZ2UoU3RyaW5nIGV4cGVjdGVkRXJyb3JNZXNzYWdlKSB7CisgICAgICAgIGFzc2VydFRydWUoIkV4cGVjdGVkIGFuIGVycm9yIG1lc3NhZ2UgYnV0IG5vbmUgZm91bmQuIiwgc291cmNlLmdldEVycm9yQ29sbGVjdG9yKCkuaGFzRXJyb3JzKCkpOworICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCBtZXNzYWdlIHRvIGNvbnRhaW4gPCIgKyBleHBlY3RlZEVycm9yTWVzc2FnZSArCisgICAgICAgICAgICAgICAgIj4gYnV0IHdhcyA8IiArIGZsYXR0ZW5FcnJvck1lc3NhZ2UoKSArICI+LiIsCisgICAgICAgICAgICAgICAgZmxhdHRlbkVycm9yTWVzc2FnZSgpLmluZGV4T2YoZXhwZWN0ZWRFcnJvck1lc3NhZ2UpICE9IC0xKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBmbGF0dGVuRXJyb3JNZXNzYWdlKCkgeworICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoc3RyaW5nV3JpdGVyLCB0cnVlKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IHNvdXJjZS5nZXRFcnJvckNvbGxlY3RvcigpLmdldEVycm9yQ291bnQoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBzb3VyY2UuZ2V0RXJyb3JDb2xsZWN0b3IoKS5nZXRFcnJvcihpKS53cml0ZSh3cml0ZXIpOworICAgICAgICB9CisgICAgICAgIHdyaXRlci5jbG9zZSgpOworICAgICAgICByZXR1cm4gc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vQ29uc3RydWN0b3JJc3N1ZVRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vQ29uc3RydWN0b3JJc3N1ZVRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0Y2Q3ODkKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9Db25zdHJ1Y3Rvcklzc3VlVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwzNSBAQAorcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuCisKK2ltcG9ydCBncm9vdnkuYnVncy5UZXN0U3VwcG9ydAorCitjbGFzcyBDb25zdHJ1Y3Rvcklzc3VlVGVzdCBleHRlbmRzIFRlc3RTdXBwb3J0IHsKKyAgICAKKyAgICBDb25zdHJ1Y3Rvcklzc3VlVGVzdCgpIHsKKyAgICAgICAgLy9wcmludGxuKCJDcmVhdGVkIHRlc3QgY2FzZSEiKQorICAgIH0KKworICAgIENvbnN0cnVjdG9ySXNzdWVUZXN0KFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgLy9wcmludGxuKCJDcmVhdGVkIHRlc3QgY2FzZSEiKQorICAgIH0KKworICAgIHN0YXRpYyB2b2lkIG1haW4oYXJncykgeworICAgICAgICAvL3ByaW50bG4oImluIG1haW4oKSAtIGNhbGxlZCB3aXRoICR7YXJyYXl9IikKKyAgICAgICAgCisgICAgICAgIGRlZiBmb28gPSBuZXcgQ29uc3RydWN0b3JJc3N1ZVRlc3QoKQorICAgICAgICBmb28uZG9uZSgpCisKKyAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIkRvbmUiKTsKKyAgICB9CisgICAgCisgICAgdm9pZCBkb25lKCkgeworICAgICAgICBwcmludGxuKCJZZWFoLCBJJ3ZlIGJlZW4gbWFkZSIpCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdENvbnN0cnVjdG9ySXNzdWUoKSB7CisgICAgICAgIGRlZiBhcnJheSA9IGdldE1vY2tBcmd1bWVudHMoKQorCisgICAgICAgIG1haW4oYXJyYXkpCisKKyAgICAgICAgbmV3IENvbnN0cnVjdG9ySXNzdWVUZXN0KGFycmF5KS5kb25lKCkKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9Db25zdHJ1Y3RvclRlc3QuamF2YSBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL0NvbnN0cnVjdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMDQ2NTgKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9Db25zdHJ1Y3RvclRlc3QuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICRJZCQKKworIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCisgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQKKyAgICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKKyAgICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCisgICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQorICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgorICAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKKyAgICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KKworIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCisgICAgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAorICAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCisKKyA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQorICAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLworCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUworIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAorIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKKyBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgKi8KKworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuOworCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0OworCisvKioKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBDb25zdHJ1Y3RvclRlc3QgZXh0ZW5kcyBUZXN0U3VwcG9ydCB7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgR3Jvb3Z5T2JqZWN0IG9iamVjdCA9IGNvbXBpbGUoInNyYy90ZXN0L2dyb292eS9OZXdFeHByZXNzaW9uVGVzdC5ncm9vdnkiKTsKKyAgICAgICAgb2JqZWN0Lmludm9rZU1ldGhvZCgidGVzdE5ld0luc3RhbmNlIiwgbnVsbCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vRGVyaXZlZEJlYW4uamF2YSBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL0Rlcml2ZWRCZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVjNmY0ZgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL0Rlcml2ZWRCZWFuLmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAkSWQkCisKKyBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAorIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0CisgICAgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhCisgICAgY29weSBvZiB0aGlzIGRvY3VtZW50LgorCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQorICAgIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKKyAgICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKKyAgICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCisgICAgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCisKKyA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IgorICAgIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQKKyAgICB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgorCisgNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KKyAgICBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMKKyBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKKyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCisgVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbjsKKworCisvKioKKyAqIEEgc2ltcGxlIGJlYW4KKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgRGVyaXZlZEJlYW4gZXh0ZW5kcyBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuRHVtbXlCZWFuIHsKKworICAgIHByaXZhdGUgU3RyaW5nIGJhcjsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmFyKCkgeworICAgICAgICByZXR1cm4gYmFyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEJhcihTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgdGhpcy5iYXIgPSB2YWx1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9EdW1teVJlZmxlY3Rvci5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vRHVtbXlSZWZsZWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjAwNjZmCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vRHVtbXlSZWZsZWN0b3IuamF2YQpAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqICRJZCQKKyAqIAorICogQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQgc3RhdGVtZW50cyBhbmQKKyAqIG5vdGljZXMuIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLgorICogRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCisgKiAgNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIgbm9yIG1heQorICogImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFRoZQorICogQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZCB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgorICogIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLworICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqICAKKyAqLworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW47CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuUmVmbGVjdG9yOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucmVmbGVjdGlvbi5DYWNoZWRNZXRob2Q7CisKKy8qKgorICogVGhpcyBpcyBhIHNjcmF0Y2ggY2xhc3MgdXNlZCB0byBleHBlcmltZW50IHdpdGggQVNNIHRvIHNlZSB3aGF0IGtpbmQgb2YKKyAqIHN0dWZmIGlzIG91dHB1dCBmb3Igbm9ybWFsIEphdmEgY29kZQorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBEdW1teVJlZmxlY3RvciBleHRlbmRzIFJlZmxlY3RvciB7CisKKyAgICBwdWJsaWMgRHVtbXlSZWZsZWN0b3IoKSB7CisgICAgfQorCisgICAgLyoKKyAgICBwdWJsaWMgT2JqZWN0IGludm9rZShNZXRhTWV0aG9kIG1ldGhvZCwgT2JqZWN0IG9iamVjdCwgT2JqZWN0W10gYXJndW1lbnRzKSB7CisgICAgICAgIHN3aXRjaCAobWV0aG9kLmdldE1ldGhvZEluZGV4KCkpIHsKKyAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgcmV0dXJuIEludm9rZXJIZWxwZXIudG9PYmplY3Qob2JqZWN0Lmhhc2hDb2RlKCkpOworICAgICAgICAgICAgY2FzZSAyIDoKKyAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0LnRvU3RyaW5nKCk7CisgICAgICAgICAgICBjYXNlIDMgOgorICAgICAgICAgICAgICAgIHJldHVybiBJbnZva2VySGVscGVyLnRvT2JqZWN0KG9iamVjdC5lcXVhbHMoYXJndW1lbnRzWzBdKSk7CisgICAgICAgICAgICBjYXNlIDQgOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0UmFuZ2UoKENvbXBhcmFibGUpIGFyZ3VtZW50c1swXSwgKENvbXBhcmFibGUpIGFyZ3VtZW50c1sxXSk7CisgICAgICAgICAgICBjYXNlIDUgOgorICAgICAgICAgICAgICAgIHJldHVybiAoKFN0cmluZykgb2JqZWN0KS50b0NoYXJBcnJheSgpOworICAgICAgICAgICAgY2FzZSA3IDoKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENoYXJhY3RlcigiaGVsbG8iLmNoYXJBdCgyKSk7CisgICAgICAgICAgICBjYXNlIDggOgorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5vU3VjaE1ldGhvZChtZXRob2QsIG9iamVjdCwgYXJndW1lbnRzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAqLworCisgICAgcHVibGljIE9iamVjdCBpbnZva2UoQ2FjaGVkTWV0aG9kIG1ldGhvZCwgT2JqZWN0IG9iamVjdCwgT2JqZWN0W10gYXJndW1lbnRzKSB7CisvKgorICAgICAgICBzd2l0Y2ggKG1ldGhvZC5nZXRNZXRob2RJbmRleCgpKSB7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgcmV0dXJuICgoU3RyaW5nKSBvYmplY3QpLnRvQ2hhckFycmF5KCk7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCb29sZWFuKCgoTGlzdCkgb2JqZWN0KS5jb250YWlucyhhcmd1bWVudHNbMF0pKTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5vU3VjaE1ldGhvZChtZXRob2QsIG9iamVjdCwgYXJndW1lbnRzKTsKKyAgICAgICAgfQorKi8KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBpbnZva2VDb25zdHJ1Y3RvckF0KE9iamVjdCBhdCwgT2JqZWN0IGNvbnN0cnVjdG9yLCBPYmplY3RbXSBhcmd1bWVudHMpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7IC8vIG5vU3VjaE1ldGhvZChtZXRob2QsIG9iamVjdCwgYXJndW1lbnRzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGludm9rZUNvbnN0cnVjdG9yT2YoT2JqZWN0IGNvbnN0cnVjdG9yLCBPYmplY3RbXSBhcmd1bWVudHMpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7IC8vIG5vU3VjaE1ldGhvZChtZXRob2QsIG9iamVjdCwgYXJndW1lbnRzKTsKKyAgICB9CisKKyAgICBjaGFyW10gYmxhaCgpIHsKKyAgICAgICAgcmV0dXJuICJmb28iLnRvQ2hhckFycmF5KCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9EdW1teVRlc3REZXJpdmF0aW9uLmphdmEgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9EdW1teVRlc3REZXJpdmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFhMTQ5OQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL0R1bW15VGVzdERlcml2YXRpb24uamF2YQpAQCAtMCwwICsxLDYwIEBACisvKgorICRJZCQKKworIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCisgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQKKyAgICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKKyAgICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCisgICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQorICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgorICAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKKyAgICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KKworIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCisgICAgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAorICAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCisKKyA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQorICAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLworCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUworIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAorIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKKyBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgKi8KKworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuOworCitpbXBvcnQgZ3Jvb3Z5LnV0aWwuR3Jvb3Z5VGVzdENhc2U7CisKKy8qKgorICogQSBkdW1teSB0ZXN0IGNhc2UKKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgRHVtbXlUZXN0RGVyaXZhdGlvbiBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKyAgICBwdWJsaWMgRHVtbXlUZXN0RGVyaXZhdGlvbigpIHsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9EdW1waW5nQ2xhc3NMb2FkZXIuamF2YSBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL0R1bXBpbmdDbGFzc0xvYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NGUyZmYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9EdW1waW5nQ2xhc3NMb2FkZXIuamF2YQpAQCAtMCwwICsxLDExMiBAQAorLyoKKyAkSWQkCisKKyBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAorIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0CisgICAgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhCisgICAgY29weSBvZiB0aGlzIGRvY3VtZW50LgorCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQorICAgIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKKyAgICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKKyAgICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCisgICAgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCisKKyA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IgorICAgIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQKKyAgICB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgorCisgNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KKyAgICBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMKKyBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKKyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCisgVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbjsKKworaW1wb3J0IGdyb292eS5sYW5nLkdyb292eUNsYXNzTG9hZGVyOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LkNsYXNzTm9kZTsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5Db21waWxlVW5pdDsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuQ29tcGlsYXRpb25Vbml0OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5Db21waWxlckNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLlNvdXJjZVVuaXQ7CitpbXBvcnQgb3JnLm9iamVjdHdlYi5hc20uQ2xhc3NWaXNpdG9yOworaW1wb3J0IG9yZy5vYmplY3R3ZWIuYXNtLk9wY29kZXM7CitpbXBvcnQgb3JnLm9iamVjdHdlYi5hc20udXRpbC5BU01pZmllckNsYXNzVmlzaXRvcjsKK2ltcG9ydCBvcmcub2JqZWN0d2ViLmFzbS51dGlsLkNoZWNrQ2xhc3NBZGFwdGVyOworCitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKKworLyoqCisgKiBBIGNsYXNzIGxvYWRlciB1c2VkIGZvciBkZWJ1Z2dpbmcgdGhlIGJ5dGVjb2RlIGdlbmVyYXRpb24uCisgKiBUaGlzIHdpbGwgbG9nIGFsbCBieXRlY29kZSBiZWluZyBsb2FkZWQKKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgRHVtcGluZ0NsYXNzTG9hZGVyIGV4dGVuZHMgR3Jvb3Z5Q2xhc3NMb2FkZXIgaW1wbGVtZW50cyBPcGNvZGVzIHsKKworICAgIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBDSEVDS19DTEFTUyA9IGZhbHNlOworICAgIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBEVU1QX0NMQVNTID0gdHJ1ZTsKKworICAgIHB1YmxpYyBEdW1waW5nQ2xhc3NMb2FkZXIoQ2xhc3NMb2FkZXIgcGFyZW50TG9hZGVyKSB7CisgICAgICAgIHN1cGVyKHBhcmVudExvYWRlcik7CisgICAgfQorCisKKyAgICBwcm90ZWN0ZWQgY2xhc3MgRGVidWdDb2xsZWN0b3IgZXh0ZW5kcyBDbGFzc0NvbGxlY3RvciB7CisKKyAgICAgICAgRGVidWdDb2xsZWN0b3IoR3Jvb3Z5Q2xhc3NMb2FkZXIgY2wsIENvbXBpbGF0aW9uVW5pdCB1bml0LCBTb3VyY2VVbml0IHN1KSB7CisgICAgICAgICAgICBzdXBlcihuZXcgR3Jvb3Z5Q2xhc3NMb2FkZXIuSW5uZXJMb2FkZXIoY2wpLCB1bml0LCBzdSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjYWxsKENsYXNzVmlzaXRvciBjbGFzc1dyaXRlciwgQ2xhc3NOb2RlIGNsYXNzTm9kZSkgeworICAgICAgICAgICAgLy8gbGV0cyB0ZXN0IG91dCB0aGUgY2xhc3MgdmVyaWZpZXIKKyAgICAgICAgICAgIGlmIChEVU1QX0NMQVNTKSB7CisgICAgICAgICAgICAgICAgZHVtcGVyLnZpc2l0Q2xhc3MoY2xhc3NOb2RlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKENIRUNLX0NMQVNTKSB7CisgICAgICAgICAgICAgICAgY2hlY2tlci52aXNpdENsYXNzKGNsYXNzTm9kZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN1cGVyLmNhbGwoY2xhc3NXcml0ZXIsIGNsYXNzTm9kZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQ2xhc3NDb2xsZWN0b3IgY3JlYXRlQ29sbGVjdG9yKENvbXBpbGF0aW9uVW5pdCB1bml0KSB7CisgICAgICAgIHJldHVybiBuZXcgRGVidWdDb2xsZWN0b3IodGhpcywgdW5pdCwgbnVsbCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEFTTWlmaWVyQ2xhc3NWaXNpdG9yIGR1bXBWaXNpdG9yID0gbmV3IEFTTWlmaWVyQ2xhc3NWaXNpdG9yKG5ldyBQcmludFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKFN5c3RlbS5vdXQpKSk7CisgICAgcHJvdGVjdGVkIEFTTWlmaWVyQ2xhc3NWaXNpdG9yIGludmlzaWJsZUR1bXBWaXNpdG9yID0gbmV3IEFTTWlmaWVyQ2xhc3NWaXNpdG9yKG5ldyBQcmludFdyaXRlcihuZXcgU3RyaW5nV3JpdGVyKCkpKTsKKyAgICBwcm90ZWN0ZWQgQ29tcGlsZVVuaXQgdW5pdCA9IG5ldyBDb21waWxlVW5pdCh0aGlzLCBuZXcgQ29tcGlsZXJDb25maWd1cmF0aW9uKCkpOworICAgIHByb3RlY3RlZCBDbGFzc0dlbmVyYXRvciBjaGVja2VyID0KKyAgICAgICAgICAgIG5ldyBBc21DbGFzc0dlbmVyYXRvcihuZXcgR2VuZXJhdG9yQ29udGV4dCh1bml0KSwgbmV3IENoZWNrQ2xhc3NBZGFwdGVyKGludmlzaWJsZUR1bXBWaXNpdG9yKSwgdGhpcywgbnVsbCk7CisgICAgcHJvdGVjdGVkIENsYXNzR2VuZXJhdG9yIGR1bXBlciA9IG5ldyBBc21DbGFzc0dlbmVyYXRvcihuZXcgR2VuZXJhdG9yQ29udGV4dCh1bml0KSwgZHVtcFZpc2l0b3IsIHRoaXMsIG51bGwpOworCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9Gb3JUZXN0LmphdmEgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9Gb3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ3MTA5NQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL0ZvclRlc3QuamF2YQpAQCAtMCwwICsxLDE1NCBAQAorLyoKKyAkSWQkCisKKyBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAorIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0CisgICAgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhCisgICAgY29weSBvZiB0aGlzIGRvY3VtZW50LgorCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQorICAgIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKKyAgICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKKyAgICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCisgICAgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCisKKyA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IgorICAgIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQKKyAgICB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgorCisgNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KKyAgICBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMKKyBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKKyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCisgVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbjsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0Lio7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuZXhwci5WYXJpYWJsZUV4cHJlc3Npb247CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3Quc3RtdC5CbG9ja1N0YXRlbWVudDsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5zdG10LkZvclN0YXRlbWVudDsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5zdG10LlN0YXRlbWVudDsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuSW52b2tlckhlbHBlcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuSW52b2tlckludm9jYXRpb25FeGNlcHRpb247CisKKy8qKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEBhdXRob3IgUGlsaG8gS2ltCisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBGb3JUZXN0IGV4dGVuZHMgVGVzdFN1cHBvcnQgeworCisgICAgcHVibGljIHZvaWQgdGVzdE5vbkxvb3AoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQ2xhc3NOb2RlIGNsYXNzTm9kZSA9IG5ldyBDbGFzc05vZGUoIkZvbyIsIEFDQ19QVUJMSUMsIENsYXNzSGVscGVyLk9CSkVDVF9UWVBFKTsKKyAgICAgICAgY2xhc3NOb2RlLmFkZENvbnN0cnVjdG9yKG5ldyBDb25zdHJ1Y3Rvck5vZGUoQUNDX1BVQkxJQywgbnVsbCkpOworCisgICAgICAgIFBhcmFtZXRlcltdIHBhcmFtZXRlcnMgPSB7bmV3IFBhcmFtZXRlcihDbGFzc0hlbHBlci5PQkpFQ1RfVFlQRSwgImNvbGwiKX07CisKKyAgICAgICAgU3RhdGVtZW50IHN0YXRlbWVudCA9IGNyZWF0ZVByaW50bG5TdGF0ZW1lbnQobmV3IFZhcmlhYmxlRXhwcmVzc2lvbigiY29sbCIpKTsKKyAgICAgICAgY2xhc3NOb2RlLmFkZE1ldGhvZChuZXcgTWV0aG9kTm9kZSgib25lUGFyYW1EZW1vIiwgQUNDX1BVQkxJQywgQ2xhc3NIZWxwZXIuVk9JRF9UWVBFLCBwYXJhbWV0ZXJzLCBDbGFzc05vZGUuRU1QVFlfQVJSQVksIHN0YXRlbWVudCkpOworCisgICAgICAgIENsYXNzIGZvb0NsYXNzID0gbG9hZENsYXNzKGNsYXNzTm9kZSk7CisgICAgICAgIGFzc2VydFRydWUoIkxvYWRlZCBhIG5ldyBjbGFzcyIsIGZvb0NsYXNzICE9IG51bGwpOworCisgICAgICAgIE9iamVjdCBiZWFuID0gZm9vQ2xhc3MubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiTWFuYWdlZCB0byBjcmVhdGUgYmVhbiIsIGJlYW4gIT0gbnVsbCk7CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIjIyMjIyMjIyMjIyMjIyMjIE5vdyBhYm91dCB0byBpbnZva2UgYSBtZXRob2Qgd2l0aG91dCBsb29waW5nIik7CisgICAgICAgIE9iamVjdCB2YWx1ZSA9IG5ldyBJbnRlZ2VyKDEwMDAwKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW52b2tlckhlbHBlci5pbnZva2VNZXRob2QoYmVhbiwgIm9uZVBhcmFtRGVtbyIsIG5ldyBPYmplY3RbXXt2YWx1ZX0pOworICAgICAgICB9IGNhdGNoIChJbnZva2VySW52b2NhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNhdWdodDogIiArIGUuZ2V0Q2F1c2UoKSk7CisgICAgICAgICAgICBlLmdldENhdXNlKCkucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBmYWlsKCJTaG91bGQgbm90IGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbiIpOworICAgICAgICB9CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIyMjIyMjIyMjIyMjIyMjIyBEb25lIik7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9vcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDbGFzc05vZGUgY2xhc3NOb2RlID0gbmV3IENsYXNzTm9kZSgiRm9vIiwgQUNDX1BVQkxJQywgQ2xhc3NIZWxwZXIuT0JKRUNUX1RZUEUpOworICAgICAgICBjbGFzc05vZGUuYWRkQ29uc3RydWN0b3IobmV3IENvbnN0cnVjdG9yTm9kZShBQ0NfUFVCTElDLCBudWxsKSk7CisKKyAgICAgICAgUGFyYW1ldGVyW10gcGFyYW1ldGVycyA9IHtuZXcgUGFyYW1ldGVyKENsYXNzSGVscGVyLk9CSkVDVF9UWVBFLm1ha2VBcnJheSgpLCAiY29sbCIpfTsKKworICAgICAgICBTdGF0ZW1lbnQgbG9vcFN0YXRlbWVudCA9IGNyZWF0ZVByaW50bG5TdGF0ZW1lbnQobmV3IFZhcmlhYmxlRXhwcmVzc2lvbigiaSIpKTsKKworICAgICAgICBGb3JTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbmV3IEZvclN0YXRlbWVudChuZXcgUGFyYW1ldGVyKENsYXNzSGVscGVyLk9CSkVDVF9UWVBFLCAiaSIpLCBuZXcgVmFyaWFibGVFeHByZXNzaW9uKCJjb2xsIiksIGxvb3BTdGF0ZW1lbnQpOworICAgICAgICBjbGFzc05vZGUuYWRkTWV0aG9kKG5ldyBNZXRob2ROb2RlKCJpdGVyYXRlRGVtbyIsIEFDQ19QVUJMSUMsIENsYXNzSGVscGVyLlZPSURfVFlQRSwgcGFyYW1ldGVycywgQ2xhc3NOb2RlLkVNUFRZX0FSUkFZLCBzdGF0ZW1lbnQpKTsKKworICAgICAgICBDbGFzcyBmb29DbGFzcyA9IGxvYWRDbGFzcyhjbGFzc05vZGUpOworICAgICAgICBhc3NlcnRUcnVlKCJMb2FkZWQgYSBuZXcgY2xhc3MiLCBmb29DbGFzcyAhPSBudWxsKTsKKworICAgICAgICBPYmplY3QgYmVhbiA9IGZvb0NsYXNzLm5ld0luc3RhbmNlKCk7CisgICAgICAgIGFzc2VydFRydWUoIk1hbmFnZWQgdG8gY3JlYXRlIGJlYW4iLCBiZWFuICE9IG51bGwpOworCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIyMjIyMjIyMjIyMjIyMjIyBOb3cgYWJvdXQgdG8gaW52b2tlIGEgbWV0aG9kIHdpdGggbG9vcGluZyIpOworICAgICAgICBPYmplY3RbXSBhcnJheSA9IHtuZXcgSW50ZWdlcigxMjM0KSwgImFiYyIsICJkZWYifTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW52b2tlckhlbHBlci5pbnZva2VNZXRob2QoYmVhbiwgIml0ZXJhdGVEZW1vIiwgbmV3IE9iamVjdFtde2FycmF5fSk7CisgICAgICAgIH0gY2F0Y2ggKEludm9rZXJJbnZvY2F0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2F1Z2h0OiAiICsgZS5nZXRDYXVzZSgpKTsKKyAgICAgICAgICAgIGUuZ2V0Q2F1c2UoKS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIGZhaWwoIlNob3VsZCBub3QgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uIik7CisgICAgICAgIH0KKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIjIyMjIyMjIyMjIyMjIyMjIERvbmUiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFueVBhcmFtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIENsYXNzTm9kZSBjbGFzc05vZGUgPSBuZXcgQ2xhc3NOb2RlKCJGb28iLCBBQ0NfUFVCTElDLCBDbGFzc0hlbHBlci5PQkpFQ1RfVFlQRSk7CisgICAgICAgIGNsYXNzTm9kZS5hZGRDb25zdHJ1Y3RvcihuZXcgQ29uc3RydWN0b3JOb2RlKEFDQ19QVUJMSUMsIG51bGwpKTsKKworICAgICAgICBQYXJhbWV0ZXJbXSBwYXJhbWV0ZXJzID0ge25ldyBQYXJhbWV0ZXIoQ2xhc3NIZWxwZXIuT0JKRUNUX1RZUEUsICJjb2xsMSIpLCBuZXcgUGFyYW1ldGVyKENsYXNzSGVscGVyLk9CSkVDVF9UWVBFLCAiY29sbDIiKSwgbmV3IFBhcmFtZXRlcihDbGFzc0hlbHBlci5PQkpFQ1RfVFlQRSwgImNvbGwzIil9OworCisgICAgICAgIEJsb2NrU3RhdGVtZW50IHN0YXRlbWVudCA9IG5ldyBCbG9ja1N0YXRlbWVudCgpOworICAgICAgICBzdGF0ZW1lbnQuYWRkU3RhdGVtZW50KGNyZWF0ZVByaW50bG5TdGF0ZW1lbnQobmV3IFZhcmlhYmxlRXhwcmVzc2lvbigiY29sbDEiKSkpOworICAgICAgICBzdGF0ZW1lbnQuYWRkU3RhdGVtZW50KGNyZWF0ZVByaW50bG5TdGF0ZW1lbnQobmV3IFZhcmlhYmxlRXhwcmVzc2lvbigiY29sbDIiKSkpOworICAgICAgICBzdGF0ZW1lbnQuYWRkU3RhdGVtZW50KGNyZWF0ZVByaW50bG5TdGF0ZW1lbnQobmV3IFZhcmlhYmxlRXhwcmVzc2lvbigiY29sbDMiKSkpOworCisgICAgICAgIGNsYXNzTm9kZS5hZGRNZXRob2QobmV3IE1ldGhvZE5vZGUoIm1hbnlQYXJhbURlbW8iLCBBQ0NfUFVCTElDLCBDbGFzc0hlbHBlci5WT0lEX1RZUEUsIHBhcmFtZXRlcnMsIENsYXNzTm9kZS5FTVBUWV9BUlJBWSwgc3RhdGVtZW50KSk7CisKKyAgICAgICAgQ2xhc3MgZm9vQ2xhc3MgPSBsb2FkQ2xhc3MoY2xhc3NOb2RlKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiTG9hZGVkIGEgbmV3IGNsYXNzIiwgZm9vQ2xhc3MgIT0gbnVsbCk7CisKKyAgICAgICAgT2JqZWN0IGJlYW4gPSBmb29DbGFzcy5uZXdJbnN0YW5jZSgpOworICAgICAgICBhc3NlcnRUcnVlKCJNYW5hZ2VkIHRvIGNyZWF0ZSBiZWFuIiwgYmVhbiAhPSBudWxsKTsKKworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiMjIyMjIyMjIyMjIyMjIyMgTm93IGFib3V0IHRvIGludm9rZSBhIG1ldGhvZCB3aXRoIG1hbnkgcGFyYW1ldGVycyIpOworICAgICAgICBPYmplY3RbXSBhcnJheSA9IHtuZXcgSW50ZWdlcigxMDAwICogMTAwMCksICJmb28tIiwgImJhcn4ifTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW52b2tlckhlbHBlci5pbnZva2VNZXRob2QoYmVhbiwgIm1hbnlQYXJhbURlbW8iLCBhcnJheSk7CisgICAgICAgIH0gY2F0Y2ggKEludm9rZXJJbnZvY2F0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2F1Z2h0OiAiICsgZS5nZXRDYXVzZSgpKTsKKyAgICAgICAgICAgIGUuZ2V0Q2F1c2UoKS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIGZhaWwoIlNob3VsZCBub3QgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uIik7CisgICAgICAgIH0KKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIjIyMjIyMjIyMjIyMjIyMjIERvbmUiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9HU3RyaW5nVGVzdC5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vR1N0cmluZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTUwNzc1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vR1N0cmluZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAkSWQkCisKKyBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAorIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0CisgICAgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhCisgICAgY29weSBvZiB0aGlzIGRvY3VtZW50LgorCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQorICAgIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKKyAgICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKKyAgICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCisgICAgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCisKKyA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IgorICAgIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQKKyAgICB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgorCisgNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KKyAgICBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMKKyBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKKyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCisgVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbjsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LkNsYXNzSGVscGVyOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LkNsYXNzTm9kZTsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5NZXRob2ROb2RlOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LlBhcmFtZXRlcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByLio7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3Quc3RtdC5Bc3NlcnRTdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3Quc3RtdC5CbG9ja1N0YXRlbWVudDsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5zdG10LkV4cHJlc3Npb25TdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLkludm9rZXJIZWxwZXI7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLkludm9rZXJJbnZvY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LlRva2VuOworCisvKioKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBHU3RyaW5nVGVzdCBleHRlbmRzIFRlc3RTdXBwb3J0IHsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDbGFzc05vZGUgY2xhc3NOb2RlID0gbmV3IENsYXNzTm9kZSgiRm9vIiwgQUNDX1BVQkxJQywgQ2xhc3NIZWxwZXIuT0JKRUNUX1RZUEUpOworCisgICAgICAgIC8vU3RhdGVtZW50IHByaW50U3RhdGVtZW50ID0gY3JlYXRlUHJpbnRsblN0YXRlbWVudChuZXcgVmFyaWFibGVFeHByZXNzaW9uKCJzdHIiKSk7CisKKyAgICAgICAgLy8gc2ltdWxhdGUgIkhlbGxvICR7dXNlcn0hIgorICAgICAgICBHU3RyaW5nRXhwcmVzc2lvbiBjb21wb3NpdGVTdHJpbmdFeHByID0gbmV3IEdTdHJpbmdFeHByZXNzaW9uKCJoZWxsbyAke3VzZXJ9ISIpOworICAgICAgICBjb21wb3NpdGVTdHJpbmdFeHByLmFkZFN0cmluZyhuZXcgQ29uc3RhbnRFeHByZXNzaW9uKCJIZWxsbyAiKSk7CisgICAgICAgIGNvbXBvc2l0ZVN0cmluZ0V4cHIuYWRkVmFsdWUobmV3IFZhcmlhYmxlRXhwcmVzc2lvbigidXNlciIpKTsKKyAgICAgICAgY29tcG9zaXRlU3RyaW5nRXhwci5hZGRTdHJpbmcobmV3IENvbnN0YW50RXhwcmVzc2lvbigiISIpKTsKKyAgICAgICAgQmxvY2tTdGF0ZW1lbnQgYmxvY2sgPSBuZXcgQmxvY2tTdGF0ZW1lbnQoKTsKKyAgICAgICAgYmxvY2suYWRkU3RhdGVtZW50KAorICAgICAgICAgICAgICAgIG5ldyBFeHByZXNzaW9uU3RhdGVtZW50KAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERlY2xhcmF0aW9uRXhwcmVzc2lvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFZhcmlhYmxlRXhwcmVzc2lvbigidXNlciIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbi5uZXdTeW1ib2woIj0iLCAtMSwgLTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ29uc3RhbnRFeHByZXNzaW9uKCJXb3JsZCIpKSkpOworICAgICAgICBibG9jay5hZGRTdGF0ZW1lbnQoCisgICAgICAgICAgICAgICAgbmV3IEV4cHJlc3Npb25TdGF0ZW1lbnQoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGVjbGFyYXRpb25FeHByZXNzaW9uKG5ldyBWYXJpYWJsZUV4cHJlc3Npb24oInN0ciIpLCBUb2tlbi5uZXdTeW1ib2woIj0iLCAtMSwgLTEpLCBjb21wb3NpdGVTdHJpbmdFeHByKSkpOworICAgICAgICBibG9jay5hZGRTdGF0ZW1lbnQoCisgICAgICAgICAgICAgICAgbmV3IEV4cHJlc3Npb25TdGF0ZW1lbnQoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTWV0aG9kQ2FsbEV4cHJlc3Npb24oVmFyaWFibGVFeHByZXNzaW9uLlRISVNfRVhQUkVTU0lPTiwgInByaW50bG4iLCBuZXcgVmFyaWFibGVFeHByZXNzaW9uKCJzdHIiKSkpKTsKKworICAgICAgICBibG9jay5hZGRTdGF0ZW1lbnQoCisgICAgICAgICAgICAgICAgbmV3IEV4cHJlc3Npb25TdGF0ZW1lbnQoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGVjbGFyYXRpb25FeHByZXNzaW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVmFyaWFibGVFeHByZXNzaW9uKCJ0ZXh0IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuLm5ld1N5bWJvbCgiPSIsIC0xLCAtMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBNZXRob2RDYWxsRXhwcmVzc2lvbihuZXcgVmFyaWFibGVFeHByZXNzaW9uKCJzdHIiKSwgInRvU3RyaW5nIiwgTWV0aG9kQ2FsbEV4cHJlc3Npb24uTk9fQVJHVU1FTlRTKSkpKTsKKworICAgICAgICBibG9jay5hZGRTdGF0ZW1lbnQoCisgICAgICAgICAgICAgICAgbmV3IEFzc2VydFN0YXRlbWVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCb29sZWFuRXhwcmVzc2lvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJpbmFyeUV4cHJlc3Npb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFZhcmlhYmxlRXhwcmVzc2lvbigidGV4dCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuLm5ld1N5bWJvbCgiPT0iLCAtMSwgLTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb25zdGFudEV4cHJlc3Npb24oIkhlbGxvIFdvcmxkISIpKSkpKTsKKyAgICAgICAgY2xhc3NOb2RlLmFkZE1ldGhvZChuZXcgTWV0aG9kTm9kZSgic3RyaW5nRGVtbyIsIEFDQ19QVUJMSUMsIENsYXNzSGVscGVyLlZPSURfVFlQRSwgUGFyYW1ldGVyLkVNUFRZX0FSUkFZLCBDbGFzc05vZGUuRU1QVFlfQVJSQVksIGJsb2NrKSk7CisKKyAgICAgICAgQ2xhc3MgZm9vQ2xhc3MgPSBsb2FkQ2xhc3MoY2xhc3NOb2RlKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiTG9hZGVkIGEgbmV3IGNsYXNzIiwgZm9vQ2xhc3MgIT0gbnVsbCk7CisKKyAgICAgICAgT2JqZWN0IGJlYW4gPSBmb29DbGFzcy5uZXdJbnN0YW5jZSgpOworICAgICAgICBhc3NlcnRUcnVlKCJNYW5hZ2VkIHRvIGNyZWF0ZSBiZWFuIiwgYmVhbiAhPSBudWxsKTsKKworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiMjIyMjIyMjIyMjIyMjIyMgTm93IGFib3V0IHRvIGludm9rZSBtZXRob2QiKTsKKworICAgICAgICAvL09iamVjdFtdIGFycmF5ID0geyBuZXcgSW50ZWdlcigxMjM0KSwgImFiYyIsICJkZWYiIH07CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEludm9rZXJIZWxwZXIuaW52b2tlTWV0aG9kKGJlYW4sICJzdHJpbmdEZW1vIiwgbnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEludm9rZXJJbnZvY2F0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2F1Z2h0OiAiICsgZS5nZXRDYXVzZSgpKTsKKyAgICAgICAgICAgIGUuZ2V0Q2F1c2UoKS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIGZhaWwoIlNob3VsZCBub3QgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uIik7CisgICAgICAgIH0KKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIjIyMjIyMjIyMjIyMjIyMjIERvbmUiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9HZW5lcmljc0dlblRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vR2VuZXJpY3NHZW5UZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWM3YmVhCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vR2VuZXJpY3NHZW5UZXN0Lmdyb292eQpAQCAtMCwwICsxLDczIEBACitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW4NCisNCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS50b29scy4qDQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC4qDQorDQorY2xhc3MgR2VuZXJpY3NHZW5UZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2V7DQorDQorICAgIHZvaWQgdGVzdENvbXBpbGUgKCkgew0KKyAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICBDbGFzcy5mb3JOYW1lKCJqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uIik7DQorICAgICAgICB9DQorICAgICAgICBjYXRjaChFeGNlcHRpb24gZXgpIHsNCisgICAgICAgICAgICByZXR1cm4NCisgICAgICAgIH0NCisNCisNCisgICAgICAgIEZpbGUgZGlyID0gY3JlYXRlVGVtcERpcigic3JjLSIsICItc3JjIikNCisgICAgICAgIGFzc2VydE5vdE51bGwgZGlyDQorDQorICAgICAgICBkZWYgZmlsZUxpc3QgPSAgWw0KKyAgICAgICAgICAiSmF2YUNsYXNzLmphdmEiIDogIiIiDQorICAgICAgICAgaW1wb3J0IGphdmEudXRpbC4qOw0KKw0KKyAgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKYXZhQ2xhc3M8VD4gaW1wbGVtZW50cyBHcm9vdnlJbnRlcmZhY2U8VD4gew0KKyAgICAgICAgIH0NCisgICAgIiIiLA0KKw0KKyAgICAgICAgICJKYXZhSW50ZXJmYWNlLmphdmEiIDogIiIiDQorICAgICAgICAgcHVibGljIGludGVyZmFjZSBKYXZhSW50ZXJmYWNlPFgsWT4gew0KKyAgICAgICAgICAgIHB1YmxpYyBYIGdldEtleSAoKTsNCisgICAgICAgICAgICBwdWJsaWMgWSBnZXRWYWx1ZSAoKTsNCisgICAgICAgICB9DQorICAgICIiIiwNCisNCisgICAgICAgICAgIkdyb292eUludGVyZmFjZS5ncm9vdnkiIDogIiIiDQorICAgICAgICAgaW50ZXJmYWNlIEdyb292eUludGVyZmFjZTxYPiB7DQorICAgICAgICAgICAgWCBtZXRob2QgKCk7DQorICAgICAgICAgfQ0KKyAgICAiIiIsDQorDQorICAgICAgICAgICAgIkdyb292eUNsYXNzLmdyb292eSIgOiAiIiINCisgICAgICAgICAgIGNsYXNzIEdyb292eUNsYXNzIGV4dGVuZHMgSmF2YUNsYXNzPFN0cmluZz4gaW1wbGVtZW50cyBKYXZhSW50ZXJmYWNlPExvbmcsQm9vbGVhbj4gew0KKyAgICAgICAgICAgICAgU3RyaW5nIG1ldGhvZCgpIHt9DQorCQkJICBMb25nIGdldEtleSgpe30NCisgICAgICAgICAgICAgIEJvb2xlYW4gZ2V0VmFsdWUoKXt9DQorICAgICAgICAgICB9DQorICAgICAgIiIiDQorICAgICAgICAgICAgICAgIF0uY29sbGVjdCB7DQorICAgICAgICAgICAgbmFtZSwgdGV4dCAtPg0KKyAgICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoZGlyLCBuYW1lKQ0KKyAgICAgICAgICAgICAgZmlsZS53cml0ZSB0ZXh0DQorICAgICAgICAgICAgICBmaWxlDQorICAgICAgICB9DQorDQorICAgICAgICBDb21waWxlckNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IENvbXBpbGVyQ29uZmlndXJhdGlvbigpDQorICAgICAgICAgY29uZmlnLnRhcmdldERpcmVjdG9yeSA9IGNyZWF0ZVRlbXBEaXIoInRhcmdldC0iLCAiLXRhcmdldCIpDQorICAgICAgICAgY29uZmlnLmpvaW50Q29tcGlsYXRpb25PcHRpb25zID0gWw0KKwkJCSJzdHViRGlyIiA6IGNyZWF0ZVRlbXBEaXIoInN0dWItIiwgIi1zdHViIiksDQorCQkJIm5hbWVkVmFsdWVzIiA6IFsidGFyZ2V0IiwiMS41Iiwic291cmNlIiwiMS41Il0gYXMgU3RyaW5nW10NCisJCSBdDQorICAgICAgICAgY29uZmlnLmNsYXNzcGF0aCA9ICJ0YXJnZXQvY2xhc3NlcyINCisgICAgICAgIEZpbGVTeXN0ZW1Db21waWxlciBjb21waWxlciA9IG5ldyBGaWxlU3lzdGVtQ29tcGlsZXIoY29uZmlnKQ0KKyAgICAgICAgY29tcGlsZXIuY29tcGlsZSAoZmlsZUxpc3QudG9BcnJheShuZXcgRmlsZSBbZmlsZUxpc3Quc2l6ZSgpXSkgKQ0KKyAgICB9DQorDQorICAgIHByaXZhdGUgRmlsZSBjcmVhdGVUZW1wRGlyIChwcmVmaXgsIHN1ZmZpeCkgew0KKyAgICAgICAgRmlsZSB0ZW1wRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUocHJlZml4LCBzdWZmaXgpOw0KKyAgICAgICAgdGVtcEZpbGUuZGVsZXRlKCk7DQorICAgICAgICB0ZW1wRmlsZS5ta2RpcnMoKTsNCisgICAgICAgIHRlbXBGaWxlLmRlbGV0ZU9uRXhpdCgpDQorICAgICAgICByZXR1cm4gdGVtcEZpbGU7DQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vR2V0UHJvcGVydHlUZXN0LmphdmEgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9HZXRQcm9wZXJ0eVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGE5OTE0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vR2V0UHJvcGVydHlUZXN0LmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAkSWQkCisKKyBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAorIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0CisgICAgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhCisgICAgY29weSBvZiB0aGlzIGRvY3VtZW50LgorCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQorICAgIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKKyAgICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKKyAgICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCisgICAgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCisKKyA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IgorICAgIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQKKyAgICB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgorCisgNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KKyAgICBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMKKyBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKKyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCisgVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbjsKKworaW1wb3J0IGdyb292eS5sYW5nLkdyb292eU9iamVjdDsKKworLyoqCisgKiBUZXN0cyB1c2luZyB0aGUgR3Jvb3Z5T2JqZWN0IEFQSSBmcm9tIEphdmEgb24gYSBncm9vdnkgb2JqZWN0CisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIEdldFByb3BlcnR5VGVzdCBleHRlbmRzIFRlc3RTdXBwb3J0IHsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBHcm9vdnlPYmplY3Qgb2JqZWN0ID0gY29tcGlsZSgic3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9NeUJlYW4uZ3Jvb3Z5Iik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiR290IG9iamVjdDogIiArIG9iamVjdCk7CisKKyAgICAgICAgT2JqZWN0IHZhbHVlID0gb2JqZWN0LmdldFByb3BlcnR5KCJuYW1lIik7CisgICAgICAgIGFzc2VydEVxdWFscygibmFtZSBwcm9wZXJ0eSIsICJKYW1lcyIsIHZhbHVlKTsKKworICAgICAgICBvYmplY3Quc2V0UHJvcGVydHkoIm5hbWUiLCAiQm9iIik7CisgICAgICAgIGFzc2VydEVxdWFscygibmFtZSBwcm9wZXJ0eSIsICJCb2IiLCBvYmplY3QuZ2V0UHJvcGVydHkoIm5hbWUiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vR3Jvb3Z5Q2xhc3NMb2FkZXJUZXN0LmphdmEgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9Hcm9vdnlDbGFzc0xvYWRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTdmZjVlCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vR3Jvb3Z5Q2xhc3NMb2FkZXJUZXN0LmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAkSWQkCisKKyBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAorIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0CisgICAgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhCisgICAgY29weSBvZiB0aGlzIGRvY3VtZW50LgorCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQorICAgIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKKyAgICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKKyAgICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCisgICAgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCisKKyA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IgorICAgIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQKKyAgICB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgorCisgNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KKyAgICBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMKKyBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKKyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCisgVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbjsKKworaW1wb3J0IGdyb292eS5sYW5nLkdyb292eU9iamVjdDsKK2ltcG9ydCBncm9vdnkubGFuZy5NZXRhQ2xhc3M7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKKworLyoqCisgKiBUZXN0cyBkeW5hbWljYWxseSBjb21waWxpbmcgYSBuZXcgY2xhc3MKKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgR3Jvb3Z5Q2xhc3NMb2FkZXJUZXN0IGV4dGVuZHMgVGVzdFN1cHBvcnQgeworCisgICAgcHVibGljIHZvaWQgdGVzdENvbXBpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQ2xhc3MgZ3Jvb3Z5Q2xhc3MgPSBsb2FkZXIucGFyc2VDbGFzcyhuZXcgRmlsZSgic3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9NYWluLmdyb292eSIpKTsKKworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkludm9raW5nIG1haW4uLi4iKTsKKworICAgICAgICBHcm9vdnlPYmplY3Qgb2JqZWN0ID0gKEdyb292eU9iamVjdCkgZ3Jvb3Z5Q2xhc3MubmV3SW5zdGFuY2UoKTsKKworICAgICAgICBhc3NlcnRUcnVlKG9iamVjdCAhPSBudWxsKTsKKworICAgICAgICBNZXRhQ2xhc3MgbWV0YUNsYXNzID0gb2JqZWN0LmdldE1ldGFDbGFzcygpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk1ldGFjbGFzczogIiArIG1ldGFDbGFzcyk7CisKKyAgICAgICAgQ2xhc3MgdHlwZSA9IG9iamVjdC5nZXRDbGFzcygpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlR5cGU6ICIgKyB0eXBlKTsKKworICAgICAgICAvLyBpbnZva2UgdmlhIG1ldGFjbGFzcworICAgICAgICBtZXRhQ2xhc3MuaW52b2tlTWV0aG9kKG9iamVjdCwgIm1haW4iLCBudWxsKTsKKworICAgICAgICAvLyBpbnZva2UgZGlyZWN0bHkKKyAgICAgICAgb2JqZWN0Lmludm9rZU1ldGhvZCgibWFpbiIsIG51bGwpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL0lmRWxzZVRlc3QuamF2YSBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL0lmRWxzZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODdiMTBjCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vSWZFbHNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICRJZCQKKworIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCisgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQKKyAgICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKKyAgICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCisgICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQorICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgorICAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKKyAgICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KKworIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCisgICAgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAorICAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCisKKyA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQorICAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLworCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUworIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAorIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKKyBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgKi8KKworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuKjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByLkJpbmFyeUV4cHJlc3Npb247CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuZXhwci5Cb29sZWFuRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByLkNvbnN0YW50RXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByLkZpZWxkRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5zdG10LkV4cHJlc3Npb25TdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3Quc3RtdC5JZlN0YXRlbWVudDsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5zdG10LlN0YXRlbWVudDsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuSW52b2tlckhlbHBlcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5Ub2tlbjsKKworLyoqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgSWZFbHNlVGVzdCBleHRlbmRzIFRlc3RTdXBwb3J0IHsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RMb29wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIENsYXNzTm9kZSBjbGFzc05vZGUgPSBuZXcgQ2xhc3NOb2RlKCJGb28iLCBBQ0NfUFVCTElDLCBDbGFzc0hlbHBlci5PQkpFQ1RfVFlQRSk7CisgICAgICAgIGNsYXNzTm9kZS5hZGRDb25zdHJ1Y3RvcihuZXcgQ29uc3RydWN0b3JOb2RlKEFDQ19QVUJMSUMsIG51bGwpKTsKKyAgICAgICAgY2xhc3NOb2RlLmFkZFByb3BlcnR5KG5ldyBQcm9wZXJ0eU5vZGUoImJhciIsIEFDQ19QVUJMSUMsIENsYXNzSGVscGVyLlNUUklOR19UWVBFLCBjbGFzc05vZGUsIG51bGwsIG51bGwsIG51bGwpKTsKKworICAgICAgICBjbGFzc05vZGUuYWRkUHJvcGVydHkobmV3IFByb3BlcnR5Tm9kZSgicmVzdWx0IiwgQUNDX1BVQkxJQywgQ2xhc3NIZWxwZXIuU1RSSU5HX1RZUEUsIGNsYXNzTm9kZSwgbnVsbCwgbnVsbCwgbnVsbCkpOworCisgICAgICAgIEJvb2xlYW5FeHByZXNzaW9uIGV4cHJlc3Npb24gPQorICAgICAgICAgICAgICAgIG5ldyBCb29sZWFuRXhwcmVzc2lvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCaW5hcnlFeHByZXNzaW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmllbGRFeHByZXNzaW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWVsZE5vZGUoImJhciIsIEFDQ19QUklWQVRFLCBDbGFzc0hlbHBlci5TVFJJTkdfVFlQRSwgY2xhc3NOb2RlLCBDb25zdGFudEV4cHJlc3Npb24uTlVMTCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbi5uZXdTeW1ib2woIj09IiwgMCwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb25zdGFudEV4cHJlc3Npb24oImFiYyIpKSk7CisKKyAgICAgICAgU3RhdGVtZW50IHRydWVTdGF0ZW1lbnQgPQorICAgICAgICAgICAgICAgIG5ldyBFeHByZXNzaW9uU3RhdGVtZW50KAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJpbmFyeUV4cHJlc3Npb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWVsZEV4cHJlc3Npb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpZWxkTm9kZSgicmVzdWx0IiwgQUNDX1BSSVZBVEUsIENsYXNzSGVscGVyLlNUUklOR19UWVBFLCBjbGFzc05vZGUsIENvbnN0YW50RXhwcmVzc2lvbi5OVUxMKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuLm5ld1N5bWJvbCgiPSIsIDAsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ29uc3RhbnRFeHByZXNzaW9uKCJ3b3JrZWQiKSkpOworCisgICAgICAgIFN0YXRlbWVudCBmYWxzZVN0YXRlbWVudCA9IGNyZWF0ZVByaW50bG5TdGF0ZW1lbnQobmV3IENvbnN0YW50RXhwcmVzc2lvbigiZmFsc2UiKSk7CisKKyAgICAgICAgSWZTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbmV3IElmU3RhdGVtZW50KGV4cHJlc3Npb24sIHRydWVTdGF0ZW1lbnQsIGZhbHNlU3RhdGVtZW50KTsKKyAgICAgICAgY2xhc3NOb2RlLmFkZE1ldGhvZChuZXcgTWV0aG9kTm9kZSgiaWZEZW1vIiwgQUNDX1BVQkxJQywgQ2xhc3NIZWxwZXIuVk9JRF9UWVBFLCBQYXJhbWV0ZXIuRU1QVFlfQVJSQVksIENsYXNzTm9kZS5FTVBUWV9BUlJBWSwgc3RhdGVtZW50KSk7CisKKyAgICAgICAgQ2xhc3MgZm9vQ2xhc3MgPSBsb2FkQ2xhc3MoY2xhc3NOb2RlKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiTG9hZGVkIGEgbmV3IGNsYXNzIiwgZm9vQ2xhc3MgIT0gbnVsbCk7CisKKyAgICAgICAgT2JqZWN0IGJlYW4gPSBmb29DbGFzcy5uZXdJbnN0YW5jZSgpOworICAgICAgICBhc3NlcnRUcnVlKCJNYW5hZ2VkIHRvIGNyZWF0ZSBiZWFuIiwgYmVhbiAhPSBudWxsKTsKKworICAgICAgICBhc3NlcnRTZXRQcm9wZXJ0eShiZWFuLCAiYmFyIiwgImFiYyIpOworCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIyMjIyMjIyMjIyMjIyMjIyBOb3cgYWJvdXQgdG8gaW52b2tlIG1ldGhvZCIpOworCisgICAgICAgIE9iamVjdFtdIGFycmF5ID0geworICAgICAgICB9OworCisgICAgICAgIEludm9rZXJIZWxwZXIuaW52b2tlTWV0aG9kKGJlYW4sICJpZkRlbW8iLCBhcnJheSk7CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIjIyMjIyMjIyMjIyMjIyMjIERvbmUiKTsKKworICAgICAgICBhc3NlcnRHZXRQcm9wZXJ0eShiZWFuLCAicmVzdWx0IiwgIndvcmtlZCIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL0ludGVyZmFjZVRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vSW50ZXJmYWNlVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc2NWRhOAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL0ludGVyZmFjZVRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsNjcgQEAKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbg0KKw0KK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuQ29tcGlsZXJDb25maWd1cmF0aW9uDQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuRmlsZVN5c3RlbUNvbXBpbGVyDQorDQorY2xhc3MgSW50ZXJmYWNlVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlew0KKw0KKyAgICB2b2lkIHRlc3RDb21waWxlICgpIHsNCisgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZSgiamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbiIpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY2F0Y2goRXhjZXB0aW9uIGV4KSB7DQorICAgICAgICAgICAgcmV0dXJuDQorICAgICAgICB9DQorDQorDQorICAgICAgICBGaWxlIGRpciA9IGNyZWF0ZVRlbXBEaXIoInNyYy0iLCAiLXNyYyIpDQorICAgICAgICBhc3NlcnROb3ROdWxsIGRpcg0KKw0KKyAgICAgICAgZGVmIGZpbGVMaXN0ID0gIFsNCisgICAgICAgICAgIkdDbGFzcy5ncm9vdnkiIDogIiIiDQorICAgICAgICAgcGFja2FnZSB0ZXN0Ow0KKw0KKyAgICAgICAgIGNsYXNzIEdDbGFzcyB7fQ0KKyAgICAiIiIsDQorDQorICAgICAgICAgIkdJbnRlcmZhY2UuZ3Jvb3Z5IiA6ICIiIg0KKyAgICAgICAgIHBhY2thZ2UgdGVzdDsNCisNCisgICAgICAgICBpbnRlcmZhY2UgR0ludGVyZmFjZSB7DQorICAgICAgICAgICAgR0NsYXNzIFtdIGdldCAoKTsNCisgICAgICAgICB9DQorICAgICIiIiwNCisNCisgICAgICAgICAgIkpDbGFzcy5qYXZhIiA6ICIiIg0KKyAgICAgICAgIHBhY2thZ2UgdGVzdDsNCisNCisgICAgICAgICBwdWJsaWMgY2xhc3MgSkNsYXNzIGltcGxlbWVudHMgR0ludGVyZmFjZSB7DQorICAgICAgICAgICAgcHVibGljIEdDbGFzcyBbXSBnZXQgKCkgeyByZXR1cm4gbmV3IEdDbGFzcyBbMF07IH07DQorICAgICAgICAgfQ0KKyAgICAiIiIsDQorICAgICAgICAgICAgICAgIF0uY29sbGVjdCB7DQorICAgICAgICAgICAgbmFtZSwgdGV4dCAtPg0KKyAgICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoZGlyLCBuYW1lKQ0KKyAgICAgICAgICAgICAgZmlsZS53cml0ZSB0ZXh0DQorICAgICAgICAgICAgICBmaWxlDQorICAgICAgICB9DQorDQorICAgICAgICBDb21waWxlckNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IENvbXBpbGVyQ29uZmlndXJhdGlvbigpDQorICAgICAgICAgY29uZmlnLnRhcmdldERpcmVjdG9yeSA9IGNyZWF0ZVRlbXBEaXIoInRhcmdldC0iLCAiLXRhcmdldCIpDQorICAgICAgICAgY29uZmlnLmpvaW50Q29tcGlsYXRpb25PcHRpb25zID0gWw0KKwkJCSJzdHViRGlyIiA6IGNyZWF0ZVRlbXBEaXIoInN0dWItIiwgIi1zdHViIiksDQorLy8JCQkibmFtZWRWYWx1ZXMiIDogWyJ0YXJnZXQiLCIxLjUiLCJzb3VyY2UiLCIxLjUiXSBhcyBTdHJpbmdbXQ0KKwkJIF0NCisgICAgICAgICBjb25maWcuY2xhc3NwYXRoID0gInRhcmdldC9jbGFzc2VzIg0KKyAgICAgICAgRmlsZVN5c3RlbUNvbXBpbGVyIGNvbXBpbGVyID0gbmV3IEZpbGVTeXN0ZW1Db21waWxlcihjb25maWcpDQorICAgICAgICBjb21waWxlci5jb21waWxlIChmaWxlTGlzdC50b0FycmF5KG5ldyBGaWxlIFtmaWxlTGlzdC5zaXplKCldKSApDQorICAgIH0NCisNCisgICAgcHJpdmF0ZSBGaWxlIGNyZWF0ZVRlbXBEaXIgKHByZWZpeCwgc3VmZml4KSB7DQorICAgICAgICBGaWxlIHRlbXBGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZShwcmVmaXgsIHN1ZmZpeCk7DQorICAgICAgICB0ZW1wRmlsZS5kZWxldGUoKTsNCisgICAgICAgIHRlbXBGaWxlLm1rZGlycygpOw0KKyAgICAgICAgdGVtcEZpbGUuZGVsZXRlT25FeGl0KCkNCisgICAgICAgIHJldHVybiB0ZW1wRmlsZTsNCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9NYWluLmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL01haW4uZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YmVjZDEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9NYWluLmdyb292eQpAQCAtMCwwICsxLDggQEAKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbgorCitjbGFzcyBNYWluIHsKKyAgICAKKyAgICBkZWYgbWFpbigpIHsKKyAgICAgICAgcHJpbnRsbigiSGVsbG8gV29ybGQhIikKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9NYWluVGVzdC5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vTWFpblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWJhYjczCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vTWFpblRlc3QuamF2YQpAQCAtMCwwICsxLDYzIEBACisvKgorICRJZCQKKworIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCisgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQKKyAgICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKKyAgICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCisgICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQorICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgorICAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKKyAgICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KKworIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCisgICAgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAorICAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCisKKyA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQorICAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLworCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUworIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAorIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKKyBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgKi8KKworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuOworCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5U2hlbGw7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKKy8qKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIE1haW5UZXN0IGV4dGVuZHMgVGVzdFN1cHBvcnQgeworCisgICAgcHVibGljIHZvaWQgdGVzdE1haW5NZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgR3Jvb3Z5U2hlbGwgc2hlbGwgPSBuZXcgR3Jvb3Z5U2hlbGwoKTsKKyAgICAgICAgc2hlbGwucnVuKG5ldyBGaWxlKCJzcmMvdGVzdC9ncm9vdnkvU2FtcGxlTWFpbi5ncm9vdnkiKSwgbmV3IFN0cmluZ1tdeyJBIiwgIkIiLCAiQyJ9KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9NZXRhQ2xhc3NUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL01ldGFDbGFzc1Rlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNDgzNWUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9NZXRhQ2xhc3NUZXN0Lmdyb292eQpAQCAtMCwwICsxLDM0IEBACitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW4KKworY2xhc3MgTWV0YUNsYXNzVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKyAgICAKKyAgICB2b2lkIHRlc3RNZXRhQ2xhc3MoKSB7CisgICAgICAgIHRlc3QodGhpcykKKyAgICAgICAgdGVzdCB7IHByaW50KGl0KSB9CisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCBkZWYgdGVzdChvYmplY3QpIHsKKyAgICAgICAgZGVmIG1ldGFDbGFzcyA9IG9iamVjdC5tZXRhQ2xhc3MKKyAgICAgICAgYXNzZXJ0IG1ldGFDbGFzcyAhPSBudWxsCisgICAgICAgIAorICAgICAgICBwcmludGxuKG1ldGFDbGFzcykKKyAgICAgICAgCisgICAgICAgIGRlZiBjbGFzc05vZGUgPSBtZXRhQ2xhc3MuZ2V0Q2xhc3NOb2RlKCkKKyAgICAgICAgYXNzZXJ0IGNsYXNzTm9kZSAhPSBudWxsCisKKyAgICAgICAgcHJpbnRsbihjbGFzc05vZGUpCisgICAgICAgIAorICAgICAgICBkZWYgbmFtZSA9IG9iamVjdC5nZXRDbGFzcygpLmdldE5hbWUoKQorICAgICAgICBhc3NlcnQgY2xhc3NOb2RlLm5hbWUgPT0gbmFtZQorICAgIH0KKyAgICAKKwl2b2lkIHRlc3RNZXRDbGFzc0RlZmluaXRpb24oKSB7CisJCWFzc2VydFNjcmlwdCAiIiIKKwkJCWNsYXNzIEZvbyB7CisJCSAgICAJTWV0YUNsYXNzIG1ldGFDbGFzcworCQkJfSAKKwkJCWRlZiBmb28gPSBuZXcgRm9vKCkKKwkJCWFzc2VydCBmb28uQG1ldGFDbGFzcyAhPSBudWxsCisJCQkiIiIKKwl9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9NZXRob2RUZXN0LmphdmEgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9NZXRob2RUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM2MzAyOQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL01ldGhvZFRlc3QuamF2YQpAQCAtMCwwICsxLDk4IEBACisvKgorICRJZCQKKworIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCisgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQKKyAgICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKKyAgICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCisgICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQorICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgorICAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKKyAgICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KKworIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCisgICAgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAorICAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCisKKyA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQorICAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLworCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUworIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAorIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKKyBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgKi8KKworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuKjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByLkNvbnN0YW50RXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5zdG10LkJsb2NrU3RhdGVtZW50OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuUmV0dXJuU3RhdGVtZW50OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuU3RhdGVtZW50OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5JbnZva2VySGVscGVyOworCisvKioKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBNZXRob2RUZXN0IGV4dGVuZHMgVGVzdFN1cHBvcnQgeworCisgICAgcHVibGljIHZvaWQgdGVzdE1ldGhvZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQ2xhc3NOb2RlIGNsYXNzTm9kZSA9IG5ldyBDbGFzc05vZGUoIkZvbyIsIEFDQ19QVUJMSUMsIENsYXNzSGVscGVyLk9CSkVDVF9UWVBFKTsKKyAgICAgICAgY2xhc3NOb2RlLmFkZENvbnN0cnVjdG9yKG5ldyBDb25zdHJ1Y3Rvck5vZGUoQUNDX1BVQkxJQywgbnVsbCkpOworCisgICAgICAgIFN0YXRlbWVudCBzdGF0ZW1lbnRBID0gbmV3IFJldHVyblN0YXRlbWVudChuZXcgQ29uc3RhbnRFeHByZXNzaW9uKCJjYWxsZWRBIikpOworICAgICAgICBTdGF0ZW1lbnQgc3RhdGVtZW50QiA9IG5ldyBSZXR1cm5TdGF0ZW1lbnQobmV3IENvbnN0YW50RXhwcmVzc2lvbigiY2FsbGVkQiIpKTsKKyAgICAgICAgU3RhdGVtZW50IGVtcHR5U3RhdGVtZW50ID0gbmV3IEJsb2NrU3RhdGVtZW50KCk7CisKKyAgICAgICAgY2xhc3NOb2RlLmFkZE1ldGhvZChuZXcgTWV0aG9kTm9kZSgiYSIsIEFDQ19QVUJMSUMsIENsYXNzSGVscGVyLk9CSkVDVF9UWVBFLCBQYXJhbWV0ZXIuRU1QVFlfQVJSQVksIENsYXNzTm9kZS5FTVBUWV9BUlJBWSwgc3RhdGVtZW50QSkpOworICAgICAgICBjbGFzc05vZGUuYWRkTWV0aG9kKG5ldyBNZXRob2ROb2RlKCJiIiwgQUNDX1BVQkxJQywgbnVsbCwgUGFyYW1ldGVyLkVNUFRZX0FSUkFZLCBDbGFzc05vZGUuRU1QVFlfQVJSQVksIHN0YXRlbWVudEIpKTsKKworICAgICAgICBjbGFzc05vZGUuYWRkTWV0aG9kKG5ldyBNZXRob2ROb2RlKCJub1JldHVybk1ldGhvZEEiLCBBQ0NfUFVCTElDLCBudWxsLCBQYXJhbWV0ZXIuRU1QVFlfQVJSQVksIENsYXNzTm9kZS5FTVBUWV9BUlJBWSwgZW1wdHlTdGF0ZW1lbnQpKTsKKyAgICAgICAgY2xhc3NOb2RlLmFkZE1ldGhvZChuZXcgTWV0aG9kTm9kZSgibm9SZXR1cm5NZXRob2RCIiwgQUNDX1BVQkxJQywgQ2xhc3NIZWxwZXIuT0JKRUNUX1RZUEUsIFBhcmFtZXRlci5FTVBUWV9BUlJBWSwgQ2xhc3NOb2RlLkVNUFRZX0FSUkFZLCBlbXB0eVN0YXRlbWVudCkpOworCisgICAgICAgIGNsYXNzTm9kZS5hZGRNZXRob2QobmV3IE1ldGhvZE5vZGUoImMiLCBBQ0NfUFVCTElDLCBDbGFzc0hlbHBlci5WT0lEX1RZUEUsIFBhcmFtZXRlci5FTVBUWV9BUlJBWSwgQ2xhc3NOb2RlLkVNUFRZX0FSUkFZLCBlbXB0eVN0YXRlbWVudCkpOworCisgICAgICAgIENsYXNzIGZvb0NsYXNzID0gbG9hZENsYXNzKGNsYXNzTm9kZSk7CisgICAgICAgIGFzc2VydFRydWUoIkxvYWRlZCBhIG5ldyBjbGFzcyIsIGZvb0NsYXNzICE9IG51bGwpOworCisgICAgICAgIE9iamVjdCBiZWFuID0gZm9vQ2xhc3MubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiQ3JlYXRlZCBpbnN0YW5jZSBvZiBjbGFzczogIiArIGJlYW4sIGJlYW4gIT0gbnVsbCk7CisKKyAgICAgICAgYXNzZXJ0Q2FsbE1ldGhvZChiZWFuLCAiYSIsICJjYWxsZWRBIik7CisgICAgICAgIGFzc2VydENhbGxNZXRob2QoYmVhbiwgImIiLCAiY2FsbGVkQiIpOworICAgICAgICBhc3NlcnRDYWxsTWV0aG9kKGJlYW4sICJub1JldHVybk1ldGhvZEEiLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0Q2FsbE1ldGhvZChiZWFuLCAibm9SZXR1cm5NZXRob2RCIiwgbnVsbCk7CisgICAgICAgIGFzc2VydENhbGxNZXRob2QoYmVhbiwgImMiLCBudWxsKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRDYWxsTWV0aG9kKE9iamVjdCBvYmplY3QsIFN0cmluZyBtZXRob2QsIE9iamVjdCBleHBlY3RlZCkgeworICAgICAgICBPYmplY3QgdmFsdWUgPSBJbnZva2VySGVscGVyLmludm9rZU1ldGhvZChvYmplY3QsIG1ldGhvZCwgbmV3IE9iamVjdFswXSk7CisgICAgICAgIGFzc2VydEVxdWFscygiUmVzdWx0IG9mIGNhbGxpbmcgbWV0aG9kOiAiICsgbWV0aG9kICsgIiBvbjogIiArIG9iamVjdCArICIgd2l0aCBlbXB0eSBsaXN0IiwgZXhwZWN0ZWQsIHZhbHVlKTsKKworICAgICAgICB2YWx1ZSA9IEludm9rZXJIZWxwZXIuaW52b2tlTWV0aG9kKG9iamVjdCwgbWV0aG9kLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZXN1bHQgb2YgY2FsbGluZyBtZXRob2Q6ICIgKyBtZXRob2QgKyAiIG9uOiAiICsgb2JqZWN0ICsgIiB3aXRoIG51bGwiLCBleHBlY3RlZCwgdmFsdWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL015QmVhbi5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9NeUJlYW4uZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNTg3NTcKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9NeUJlYW4uZ3Jvb3Z5CkBAIC0wLDAgKzEsNyBAQAorcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuCisKK2NsYXNzIE15QmVhbiB7CisKKwlkZWYgbmFtZSA9ICJKYW1lcyIKKwlkZWYgZm9vID0gMTIzCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9Qcm9wZXJ0eVRlc3QuamF2YSBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL1Byb3BlcnR5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5OWM5YzEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9Qcm9wZXJ0eVRlc3QuamF2YQpAQCAtMCwwICsxLDExMCBAQAorLyoKKyAkSWQkCisKKyBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAorIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0CisgICAgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhCisgICAgY29weSBvZiB0aGlzIGRvY3VtZW50LgorCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQorICAgIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKKyAgICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKKyAgICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCisgICAgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCisKKyA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IgorICAgIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQKKyAgICB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgorCisgNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KKyAgICBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMKKyBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKKyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCisgVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbjsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LkNsYXNzSGVscGVyOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LkNsYXNzTm9kZTsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5Qcm9wZXJ0eU5vZGU7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLkR1bW15QmVhbjsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOworCisvKioKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBQcm9wZXJ0eVRlc3QgZXh0ZW5kcyBUZXN0U3VwcG9ydCB7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmllbGRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIENsYXNzTm9kZSBjbGFzc05vZGUgPSBuZXcgQ2xhc3NOb2RlKCJGb28iLCBBQ0NfUFVCTElDLCBDbGFzc0hlbHBlci5PQkpFQ1RfVFlQRSk7CisgICAgICAgIGNsYXNzTm9kZS5hZGRGaWVsZCgieCIsIEFDQ19QVUJMSUMsIENsYXNzSGVscGVyLk9CSkVDVF9UWVBFLCBudWxsKTsKKyAgICAgICAgY2xhc3NOb2RlLmFkZEZpZWxkKCJ5IiwgQUNDX1BVQkxJQywgQ2xhc3NIZWxwZXIuSW50ZWdlcl9UWVBFLCBudWxsKTsKKyAgICAgICAgY2xhc3NOb2RlLmFkZEZpZWxkKCJ6IiwgQUNDX1BSSVZBVEUsIENsYXNzSGVscGVyLlNUUklOR19UWVBFLCBudWxsKTsKKworICAgICAgICBDbGFzcyBmb29DbGFzcyA9IGxvYWRDbGFzcyhjbGFzc05vZGUpOworICAgICAgICBhc3NlcnRUcnVlKCJMb2FkZWQgYSBuZXcgY2xhc3MiLCBmb29DbGFzcyAhPSBudWxsKTsKKworICAgICAgICBhc3NlcnRGaWVsZChmb29DbGFzcywgIngiLCBNb2RpZmllci5QVUJMSUMsIENsYXNzSGVscGVyLk9CSkVDVF9UWVBFKTsKKyAgICAgICAgYXNzZXJ0RmllbGQoZm9vQ2xhc3MsICJ5IiwgTW9kaWZpZXIuUFVCTElDLCBDbGFzc0hlbHBlci5JbnRlZ2VyX1RZUEUpOworICAgICAgICBhc3NlcnRGaWVsZChmb29DbGFzcywgInoiLCBNb2RpZmllci5QUklWQVRFLCBDbGFzc0hlbHBlci5TVFJJTkdfVFlQRSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFByb3BlcnRpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQ2xhc3NOb2RlIGNsYXNzTm9kZSA9IG5ldyBDbGFzc05vZGUoIkZvbyIsIEFDQ19QVUJMSUMgKyBBQ0NfU1VQRVIsIENsYXNzSGVscGVyLk9CSkVDVF9UWVBFKTsKKyAgICAgICAgY2xhc3NOb2RlLmFkZFByb3BlcnR5KG5ldyBQcm9wZXJ0eU5vZGUoImJhciIsIEFDQ19QVUJMSUMsIENsYXNzSGVscGVyLlNUUklOR19UWVBFLCBjbGFzc05vZGUsIG51bGwsIG51bGwsIG51bGwpKTsKKworICAgICAgICBDbGFzcyBmb29DbGFzcyA9IGxvYWRDbGFzcyhjbGFzc05vZGUpOworICAgICAgICBhc3NlcnRUcnVlKCJMb2FkZWQgYSBuZXcgY2xhc3MiLCBmb29DbGFzcyAhPSBudWxsKTsKKworICAgICAgICBPYmplY3QgYmVhbiA9IGZvb0NsYXNzLm5ld0luc3RhbmNlKCk7CisgICAgICAgIGFzc2VydFRydWUoIk1hbmFnZWQgdG8gY3JlYXRlIGJlYW4iLCBiZWFuICE9IG51bGwpOworCisgICAgICAgIGFzc2VydEZpZWxkKGZvb0NsYXNzLCAiYmFyIiwgMCwgQ2xhc3NIZWxwZXIuU1RSSU5HX1RZUEUpOworCisgICAgICAgIGFzc2VydEdldFByb3BlcnR5KGJlYW4sICJiYXIiLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0U2V0UHJvcGVydHkoYmVhbiwgImJhciIsICJuZXdWYWx1ZSIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbmhlcml0ZWRQcm9wZXJ0aWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIENsYXNzTm9kZSBjbGFzc05vZGUgPSBuZXcgQ2xhc3NOb2RlKCJGb28iLCBBQ0NfUFVCTElDICsgQUNDX1NVUEVSLCBDbGFzc0hlbHBlci5tYWtlKER1bW15QmVhbi5jbGFzcykpOworICAgICAgICBjbGFzc05vZGUuYWRkUHJvcGVydHkobmV3IFByb3BlcnR5Tm9kZSgiYmFyIiwgQUNDX1BVQkxJQywgQ2xhc3NIZWxwZXIuU1RSSU5HX1RZUEUsIGNsYXNzTm9kZSwgbnVsbCwgbnVsbCwgbnVsbCkpOworCisgICAgICAgIENsYXNzIGZvb0NsYXNzID0gbG9hZENsYXNzKGNsYXNzTm9kZSk7CisgICAgICAgIGFzc2VydFRydWUoIkxvYWRlZCBhIG5ldyBjbGFzcyIsIGZvb0NsYXNzICE9IG51bGwpOworCisgICAgICAgIE9iamVjdCBiZWFuID0gZm9vQ2xhc3MubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiTWFuYWdlZCB0byBjcmVhdGUgYmVhbiIsIGJlYW4gIT0gbnVsbCk7CisKKyAgICAgICAgYXNzZXJ0RmllbGQoZm9vQ2xhc3MsICJiYXIiLCAwLCBDbGFzc0hlbHBlci5TVFJJTkdfVFlQRSk7CisKKyAgICAgICAgYXNzZXJ0R2V0UHJvcGVydHkoYmVhbiwgIm5hbWUiLCAiSmFtZXMiKTsKKyAgICAgICAgYXNzZXJ0U2V0UHJvcGVydHkoYmVhbiwgIm5hbWUiLCAiQm9iIik7CisKKyAgICAgICAgYXNzZXJ0R2V0UHJvcGVydHkoYmVhbiwgImJhciIsIG51bGwpOworICAgICAgICBhc3NlcnRTZXRQcm9wZXJ0eShiZWFuLCAiYmFyIiwgIm5ld1ZhbHVlIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vUmVmbGVjdG9yR2VuZXJhdG9yVGVzdC5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vUmVmbGVjdG9yR2VuZXJhdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2OGFkNzIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9SZWZsZWN0b3JHZW5lcmF0b3JUZXN0LmphdmEKQEAgLTAsMCArMSwxMzkgQEAKKy8qCisgJElkJAorCisgQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQKKyB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIGNvcHlyaWdodAorICAgIHN0YXRlbWVudHMgYW5kIG5vdGljZXMuICBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYQorICAgIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KKworIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUKKyAgICBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCisgICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCisgICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworIDMuIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCisgICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLAorICAgIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLgorCisgNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIKKyAgICBub3IgbWF5ICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYSByZWdpc3RlcmVkCisgICAgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KKworIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtCisgICAgaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTCisgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECisgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTAorIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAqLworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuY2xhc3NnZW47CisKK2ltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlTeXN0ZW07CitpbXBvcnQgZ3Jvb3Z5LmxhbmcuTWV0YUNsYXNzUmVnaXN0cnk7CitpbXBvcnQgZ3Jvb3Z5LnV0aWwuR3Jvb3Z5VGVzdENhc2U7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5yZWZsZWN0aW9uLkNhY2hlZE1ldGhvZDsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJlZmxlY3Rpb24uUmVmbGVjdGlvbkNhY2hlOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5tZXRhY2xhc3MuTWV0YUNsYXNzUmVnaXN0cnlJbXBsOworaW1wb3J0IG9yZy5vYmplY3R3ZWIuYXNtLkNsYXNzV3JpdGVyOworaW1wb3J0IG9yZy5vYmplY3R3ZWIuYXNtLnV0aWwuQVNNaWZpZXJDbGFzc1Zpc2l0b3I7CitpbXBvcnQgb3JnLm9iamVjdHdlYi5hc20udXRpbC5DaGVja0NsYXNzQWRhcHRlcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgUmVmbGVjdG9yR2VuZXJhdG9yVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZW5lcmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTGlzdCBtZXRob2RzID0gbmV3IEFycmF5TGlzdCgpOworLy8gICAgICAgIG1ldGhvZHMuYWRkKG5ldyBNZXRhTWV0aG9kKCJ0b0NoYXJBcnJheSIsIFN0cmluZy5jbGFzcywgbmV3IENhY2hlZENsYXNzWzBdLCBjaGFyW10uY2xhc3MsIDApKTsKKyAgICAgICAgLy9tZXRob2RzLmFkZChuZXcgTWV0YU1ldGhvZCgidG9TdHJpbmciLCBTdHJpbmcuY2xhc3MsIG5ldyBDbGFzc1swXSwgU3RyaW5nLmNsYXNzLCAwKSk7CisgICAgICAgIHRlc3RNZXRob2RzKG1ldGhvZHMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RPYmplY3RHZW5lcmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTGlzdCBtZXRob2RzID0gQXJyYXlzLmFzTGlzdChSZWZsZWN0aW9uQ2FjaGUuT0JKRUNUX0NMQVNTLmdldE1ldGhvZHMoKSk7CisgICAgICAgIHRlc3RNZXRob2RzKG1ldGhvZHMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3REdW1teVJlZmxlY3RvcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBEdW1teVJlZmxlY3RvciBkdW1teSA9IG5ldyBEdW1teVJlZmxlY3RvcigpOworICAgICAgICBhc3NlcnRUcnVlKGR1bW15ICE9IG51bGwpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHRlc3RNZXRob2RzKExpc3QgbWV0aG9kcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFJlZmxlY3RvckdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgUmVmbGVjdG9yR2VuZXJhdG9yKG1ldGhvZHMpOworICAgICAgICBTdHJpbmcgbmFtZSA9IGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIi4iICsgZ2V0TWV0aG9kTmFtZSgpOworICAgICAgICBDbGFzc1dyaXRlciBjdyA9IG5ldyBDbGFzc1dyaXRlcih0cnVlKTsKKworICAgICAgICAvL0FTTWlmaWVyQ2xhc3NWaXNpdG9yIGR1bXBlciA9IG5ldyBBU01pZmllckNsYXNzVmlzaXRvcihuZXcgUHJpbnRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihTeXN0ZW0ub3V0KSkpOworICAgICAgICAvL2dlbmVyYXRvci5nZW5lcmF0ZShkdW1wZXIsIG5hbWUpOworCisgICAgICAgIGdlbmVyYXRvci5nZW5lcmF0ZShuZXcgQ2hlY2tDbGFzc0FkYXB0ZXIoY3cpLCBuYW1lKTsKKworICAgICAgICBieXRlW10gYnl0ZWNvZGUgPSBjdy50b0J5dGVBcnJheSgpOworCisgICAgICAgIC8vIGxldHMgd3JpdGUgaXQgdG8gZGlzaworICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSAidGFyZ2V0LyIgKyBuYW1lICsgIi5jbGFzcyI7CisgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZU5hbWUpOworICAgICAgICBvdXQud3JpdGUoYnl0ZWNvZGUpOworICAgICAgICBvdXQuY2xvc2UoKTsKKworICAgICAgICAvLyBub3cgbGV0cyB0cnkgZHVtcCBpdAorICAgICAgICBBU01pZmllckNsYXNzVmlzaXRvci5tYWluKG5ldyBTdHJpbmdbXXtmaWxlTmFtZX0pOworCisgICAgICAgIC8vIG5vdyBsZXRzIHRyeSBjbGFzcyBsb2FkIGl0CisgICAgICAgIE1ldGFDbGFzc1JlZ2lzdHJ5IHJlZ2lzdHJ5ID0gR3Jvb3Z5U3lzdGVtLmdldE1ldGFDbGFzc1JlZ2lzdHJ5KCk7CisgICAgICAgIE9iamVjdCByZWZsZWN0b3IgPSAoKE1ldGFDbGFzc1JlZ2lzdHJ5SW1wbCkgcmVnaXN0cnkpLmxvYWRSZWZsZWN0b3IoZ2V0Q2xhc3MoKSwgbWV0aG9kcyk7CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDcmVhdGVkIG5ldyByZWZsZWN0b3I6ICIgKyByZWZsZWN0b3IpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQICgpIHsKKyAgICAgICAgQV9Hcm9vdnlSZWZsZWN0b3IuZG9JdCgpOyAKKyAgICB9Cit9CisKK2NsYXNzIEEgeworICAgIHByb3RlY3RlZCB2b2lkIHByb3RlY3RlZE1ldGhvZCgpIHt9Cit9CisKK2NsYXNzIEFfR3Jvb3Z5UmVmbGVjdG9yIHsKKyAgICBzdGF0aWMgdm9pZCBkb0l0ICgpIHsKKworICAgICAgICBuZXcgQSAoKS5wcm90ZWN0ZWRNZXRob2QoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2FjaGVkTWV0aG9kIG0gPSBDYWNoZWRNZXRob2QuZmluZChBLmNsYXNzLmdldERlY2xhcmVkTWV0aG9kKCJwcm90ZWN0ZWRNZXRob2QiLCBuZXcgQ2xhc3MgWzBdICkpOworICAgICAgICAgICAgT2JqZWN0W10gYXJndW1lbnRzID0gbmV3IE9iamVjdFswXTsKKyAgICAgICAgICAgIG0uc2V0QWNjZXNzaWJsZSgpLmludm9rZShuZXcgQSgpLCBhcmd1bWVudHMpOworICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgeworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vUmVmbGVjdG9yTG9hZGVyVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9SZWZsZWN0b3JMb2FkZXJUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjIyYmU4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vUmVmbGVjdG9yTG9hZGVyVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwxNCBAQAorcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuDQorDQorY2xhc3MgUmVmbGVjdG9yTG9hZGVyVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsNCisNCisgICAgdm9pZCB0ZXN0RHVwbGljYXRpb24oKXsNCisgICAgICBkZWYgcHJvZ3JhbSA9ICAnJycNCisJCWNsb3N1cmVBID0ge30NCisJCWNsb3N1cmVCID0ge2Nsb3N1cmVBICggKSB9DQorCSAgJycnDQorCSAgZGVmIGJpbmRpbmcgID0gbmV3IEJpbmRpbmcoKQ0KKwkgICggbmV3IEdyb292eVNoZWxsICggYmluZGluZyApICkuZXZhbHVhdGUgKCBwcm9ncmFtICkNCisJICBiaW5kaW5nLmNsb3N1cmVCLmNhbGwoICkNCisgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vUnVuQnVnc1Rlc3QuamF2YSBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL1J1bkJ1Z3NUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJkOGMzYgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL1J1bkJ1Z3NUZXN0LmphdmEKQEAgLTAsMCArMSwxNDkgQEAKKy8qCisgKiAkSWQkCisgKiAKKyAqIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZQorICogZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0IHN0YXRlbWVudHMgYW5kCisgKiBub3RpY2VzLiBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYSBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4KKyAqIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLgorICogIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiIG5vciBtYXkKKyAqICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBUaGUKKyAqIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KKyAqICA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLSBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgKiBEQU1BR0UuCisgKiAgCisgKi8KKworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuOworCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0OworCisvKioKKyAqIEEgaGVscGVyIGNsYXNzIGZvciB0ZXN0aW5nIGJ1Z3MgaW4gY29kZSBnZW5lcmF0aW9uIGVycm9ycy4gQnkgdHVybmluZyBvbiB0aGUKKyAqIGxvZ2dpbmcgaW4gVGVzdFN1cHBvcnQgd2UgY2FuIGR1bXAgdGhlIEFTTSBjb2RlIGdlbmVyYXRpb24gY29kZSBmb3IgaW5uZXIKKyAqIGNsYXNzZXMgZXRjLgorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBSdW5CdWdzVGVzdCBleHRlbmRzIFRlc3RTdXBwb3J0IHsKKworICAgIC8qCisgICAgcHVibGljIHZvaWQgdGVzdFN0YXRpY01ldGhvZENhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgR3Jvb3Z5T2JqZWN0IG9iamVjdCA9IGNvbXBpbGUoInNyYy90ZXN0L2dyb292eS9idWdzL1N0YXRpY01ldGhvZENhbGxCdWcuZ3Jvb3Z5Iik7CisgICAgICAgIG9iamVjdC5pbnZva2VNZXRob2QoInRlc3RCdWciLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJ5Q2F0Y2hCdWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgR3Jvb3Z5T2JqZWN0IG9iamVjdCA9IGNvbXBpbGUoInNyYy90ZXN0L2dyb292eS9idWdzL1RyeUNhdGNoQnVnLmdyb292eSIpOworICAgICAgICBvYmplY3QuaW52b2tlTWV0aG9kKCJ0ZXN0QnVnIiwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJvZHNCdWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgR3Jvb3Z5T2JqZWN0IG9iamVjdCA9IGNvbXBpbGUoInNyYy90ZXN0L2dyb292eS9idWdzL1JvZHNCdWcuZ3Jvb3Z5Iik7CisgICAgICAgIG9iamVjdC5pbnZva2VNZXRob2QoInRlc3RCdWciLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FzdEJ1ZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBHcm9vdnlPYmplY3Qgb2JqZWN0ID0gY29tcGlsZSgic3JjL3Rlc3QvZ3Jvb3Z5L0Nsb3N1cmVNZXRob2RDYWxsVGVzdC5ncm9vdnkiKTsKKyAgICAgICAgb2JqZWN0Lmludm9rZU1ldGhvZCgidGVzdENhbGxpbmdDbG9zdXJlV2l0aE11bHRpcGxlQXJndW1lbnRzIiwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEd1aWxsYXVtZXNNYXBCdWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgR3Jvb3Z5T2JqZWN0IG9iamVjdCA9IGNvbXBpbGUoInNyYy90ZXN0L2dyb292eS9idWdzL0d1aWxsYXVtZXNNYXBCdWcuZ3Jvb3Z5Iik7CisgICAgICAgIG9iamVjdC5pbnZva2VNZXRob2QoInRlc3RCdWciLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXNlQ2xvc3VyZUluU2NyaXB0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEdyb292eU9iamVjdCBvYmplY3QgPSBjb21waWxlKCJzcmMvdGVzdC9ncm9vdnkvc2NyaXB0L1VzZUNsb3N1cmVJblNjcmlwdC5ncm9vdnkiKTsKKyAgICAgICAgb2JqZWN0Lmludm9rZU1ldGhvZCgicnVuIiwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFVzZVN0YXRpY0luQ2xvc3VyZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBHcm9vdnlPYmplY3Qgb2JqZWN0ID0gY29tcGlsZSgic3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvVXNlU3RhdGljSW5DbG9zdXJlQnVnLmdyb292eSIpOworICAgICAgICBvYmplY3QuaW52b2tlTWV0aG9kKCJ0ZXN0QnVnMiIsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQcmltaXRpdmVUeXBlRmllbGRUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEdyb292eU9iamVjdCBvYmplY3QgPSBjb21waWxlKCJzcmMvdGVzdC9ncm9vdnkvUHJpbWl0aXZlVHlwZUZpZWxkVGVzdC5ncm9vdnkiKTsKKyAgICAgICAgb2JqZWN0Lmludm9rZU1ldGhvZCgidGVzdFByaW1pdGl2ZUZpZWxkIiwgbnVsbCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2REaXNwYXRjaEJ1ZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBHcm9vdnlPYmplY3Qgb2JqZWN0ID0gY29tcGlsZSgic3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvTWV0aG9kRGlzcGF0Y2hCdWcuZ3Jvb3Z5Iik7CisgICAgICAgIG9iamVjdC5pbnZva2VNZXRob2QoInRlc3RCdWciLCBudWxsKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdENsb3N1cmVJbkNsb3N1cmVUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEdyb292eU9iamVjdCBvYmplY3QgPSBjb21waWxlKCJzcmMvdGVzdC9ncm9vdnkvQ2xvc3VyZUluQ2xvc3VyZVRlc3QuZ3Jvb3Z5Iik7CisgICAgICAgIG9iamVjdC5pbnZva2VNZXRob2QoInRlc3RJbnZpc2libGVWYXJpYWJsZSIsIG51bGwpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhdGljTWFya3VwQnVnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEdyb292eU9iamVjdCBvYmplY3QgPSBjb21waWxlKCJzcmMvdGVzdC9ncm9vdnkvYnVncy9TdGF0aWNNYXJrdXBCdWcuZ3Jvb3Z5Iik7CisgICAgICAgIG9iamVjdC5pbnZva2VNZXRob2QoInRlc3RCdWciLCBudWxsKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdE92ZXJsb2FkSW52b2tlTWV0aG9kQnVnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEdyb292eU9iamVjdCBvYmplY3QgPSBjb21waWxlKCJzcmMvdGVzdC9ncm9vdnkvYnVncy9PdmVybG9hZEludm9rZU1ldGhvZEJ1Zy5ncm9vdnkiKTsKKyAgICAgICAgb2JqZWN0Lmludm9rZU1ldGhvZCgidGVzdEJ1ZyIsIG51bGwpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc3VyZVZhcmlhYmxlQnVnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEdyb292eU9iamVjdCBvYmplY3QgPSBjb21waWxlKCJzcmMvdGVzdC9ncm9vdnkvYnVncy9DbG9zdXJlVmFyaWFibGVCdWcuZ3Jvb3Z5Iik7CisgICAgICAgIG9iamVjdC5pbnZva2VNZXRob2QoInRlc3RCdWciLCBudWxsKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdE1hcmt1cEFuZE1ldGhvZEJ1ZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBHcm9vdnlPYmplY3Qgb2JqZWN0ID0gY29tcGlsZSgic3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvTWFya3VwQW5kTWV0aG9kQnVnLmdyb292eSIpOworICAgICAgICBvYmplY3QuaW52b2tlTWV0aG9kKCJ0ZXN0QnVnIiwgbnVsbCk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9zdXJlUGFyYW1ldGVyUGFzc2luZ0J1ZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBHcm9vdnlPYmplY3Qgb2JqZWN0ID0gY29tcGlsZSgic3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQ2xvc3VyZVBhcmFtZXRlclBhc3NpbmdCdWcuZ3Jvb3Z5Iik7CisgICAgICAgIG9iamVjdC5pbnZva2VNZXRob2QoInRlc3RCdWciLCBudWxsKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdE5lc3RlZENsb3N1cmVCdWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgR3Jvb3Z5T2JqZWN0IG9iamVjdCA9IGNvbXBpbGUoInNyYy90ZXN0L2dyb292eS9idWdzL05lc3RlZENsb3N1cmUyQnVnLmdyb292eSIpOworICAgICAgICBvYmplY3QuaW52b2tlTWV0aG9kKCJ0ZXN0RmllbGRCdWciLCBudWxsKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdFN1cGVyTWV0aG9kMkJ1ZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBHcm9vdnlPYmplY3Qgb2JqZWN0ID0gY29tcGlsZSgic3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvU3VwZXJNZXRob2QyQnVnLmdyb292eSIpOworICAgICAgICBvYmplY3QuaW52b2tlTWV0aG9kKCJ0ZXN0QnVnIiwgbnVsbCk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZ0J1ZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBHcm9vdnlPYmplY3Qgb2JqZWN0ID0gY29tcGlsZSgic3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvVG9TdHJpbmdCdWcuZ3Jvb3Z5Iik7CisgICAgICAgIG9iamVjdC5pbnZva2VNZXRob2QoInRlc3RCdWciLCBudWxsKTsKKyAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdEJ5dGVJbmRleEJ1ZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBHcm9vdnlPYmplY3Qgb2JqZWN0ID0gY29tcGlsZSgic3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQnl0ZUluZGV4QnVnLmdyb292eSIpOworICAgICAgICBvYmplY3QuaW52b2tlTWV0aG9kKCJ0ZXN0QnVnIiwgbnVsbCk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RHcm9vdnkyNTJfQnVnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEdyb292eU9iamVjdCBvYmplY3QgPSBjb21waWxlKCJzcmMvdGVzdC9ncm9vdnkvYnVncy9Hcm9vdnkyNTJfQnVnLmdyb292eSIpOworICAgICAgICBvYmplY3QuaW52b2tlTWV0aG9kKCJ0ZXN0QnVnIiwgbnVsbCk7CisgICAgfQorICAgIAorICAgICovCisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R3Jvb3Z5MzAzX0J1ZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBHcm9vdnlPYmplY3Qgb2JqZWN0ID0gY29tcGlsZSgic3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvR3Jvb3Z5MzAzX0J1Zy5ncm9vdnkiKTsKKyAgICAgICAgb2JqZWN0Lmludm9rZU1ldGhvZCgidGVzdEJ1ZyIsIG51bGwpOworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9SdW5DbG9zdXJlVGVzdC5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vUnVuQ2xvc3VyZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2YyNmJlCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vUnVuQ2xvc3VyZVRlc3QuamF2YQpAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAkSWQkCisKKyBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAorIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0CisgICAgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhCisgICAgY29weSBvZiB0aGlzIGRvY3VtZW50LgorCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQorICAgIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKKyAgICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKKyAgICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCisgICAgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCisKKyA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IgorICAgIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQKKyAgICB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgorCisgNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KKyAgICBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMKKyBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKKyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCisgVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbjsKKworaW1wb3J0IGdyb292eS5sYW5nLkdyb292eU9iamVjdDsKKworLyoqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgUnVuQ2xvc3VyZVRlc3QgZXh0ZW5kcyBUZXN0U3VwcG9ydCB7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc3VyZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBHcm9vdnlPYmplY3Qgb2JqZWN0ID0gY29tcGlsZSgic3JjL3Rlc3QvZ3Jvb3Z5L0Nsb3N1cmVVc2luZ091dGVyVmFyaWFibGVzVGVzdC5ncm9vdnkiKTsKKyAgICAgICAgb2JqZWN0Lmludm9rZU1ldGhvZCgidGVzdEV4YW1wbGVVc2VPZkNsb3N1cmVTY29wZXNVc2luZ0VhY2giLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhdGljQ2xvc3VyZUJ1ZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBHcm9vdnlPYmplY3Qgb2JqZWN0ID0gY29tcGlsZSgic3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvU3RhdGljQ2xvc3VyZVByb3BlcnR5QnVnLmdyb292eSIpOworICAgICAgICBvYmplY3QuaW52b2tlTWV0aG9kKCJ0ZXN0Q2FsbFN0YXRpY0Nsb3N1cmUiLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Wm9oYXJzQnVnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEdyb292eU9iamVjdCBvYmplY3QgPSBjb21waWxlKCJzcmMvdGVzdC9ncm9vdnkvYnVncy9ab2hhcnNCdWcuZ3Jvb3Z5Iik7CisgICAgICAgIG9iamVjdC5pbnZva2VNZXRob2QoInRlc3RCdWciLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Qnl0ZWNvZGVCdWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgR3Jvb3Z5T2JqZWN0IG9iamVjdCA9IGNvbXBpbGUoInNyYy90ZXN0L2dyb292eS9idWdzL0J5dGVjb2RlQnVnLmdyb292eSIpOworICAgICAgICBvYmplY3QuaW52b2tlTWV0aG9kKCJ0ZXN0VGVkc0J5dGVjb2RlQnVnIiwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEJ5dGVjb2RlMkJ1ZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBHcm9vdnlPYmplY3Qgb2JqZWN0ID0gY29tcGlsZSgic3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQnl0ZWNvZGUyQnVnLmdyb292eSIpOworICAgICAgICBvYmplY3QuaW52b2tlTWV0aG9kKCJ0ZXN0VGVkc0J5dGVjb2RlQnVnIiwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEJ5dGVjb2RlM0J1ZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBHcm9vdnlPYmplY3Qgb2JqZWN0ID0gY29tcGlsZSgic3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQnl0ZWNvZGUzQnVnLmdyb292eSIpOworICAgICAgICAvL29iamVjdC5pbnZva2VNZXRob2QoInRlc3RJbmplY3QiLCBudWxsKTsKKyAgICAgICAgb2JqZWN0Lmludm9rZU1ldGhvZCgidGVzdEluY3JlbWVudFByb3BlcnR5SW5jbG9zdXJlIiwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEJ5dGVjb2RlNEJ1ZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBHcm9vdnlPYmplY3Qgb2JqZWN0ID0gY29tcGlsZSgic3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQnl0ZWNvZGU0QnVnLmdyb292eSIpOworICAgICAgICBvYmplY3QuaW52b2tlTWV0aG9kKCJ0ZXN0SW5qZWN0IiwgbnVsbCk7CisgICAgICAgIG9iamVjdC5pbnZva2VNZXRob2QoInRlc3RVc2luZ1Byb3BlcnR5IiwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEJ5dGVjb2RlNUJ1ZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBHcm9vdnlPYmplY3Qgb2JqZWN0ID0gY29tcGlsZSgic3JjL3Rlc3QvZ3Jvb3Z5L2J1Z3MvQnl0ZWNvZGU1QnVnLmdyb292eSIpOworICAgICAgICBvYmplY3QuaW52b2tlTWV0aG9kKCJ0ZXN0VXNpbmdMb2NhbFZhciIsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RCeXRlY29kZTZCdWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgR3Jvb3Z5T2JqZWN0IG9iamVjdCA9IGNvbXBpbGUoInNyYy90ZXN0L2dyb292eS9idWdzL0J5dGVjb2RlNkJ1Zy5ncm9vdnkiKTsKKyAgICAgICAgb2JqZWN0Lmludm9rZU1ldGhvZCgidGVzdFByZUZpeFJldHVybiIsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eVRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgR3Jvb3Z5T2JqZWN0IG9iamVjdCA9IGNvbXBpbGUoInNyYy90ZXN0L2dyb292eS9Qcm9wZXJ0eVRlc3QuZ3Jvb3Z5Iik7CisgICAgICAgIG9iamVjdC5pbnZva2VNZXRob2QoInRlc3ROb3JtYWxQcm9wZXJ0eUdldHRlcnNBbmRTZXR0ZXJzIiwgbnVsbCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9SdW5Hcm9vdnlUZXN0LmphdmEgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9SdW5Hcm9vdnlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMyNTcxOQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL1J1bkdyb292eVRlc3QuamF2YQpAQCAtMCwwICsxLDk1IEBACisvKgorICRJZCQKKworIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCisgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQKKyAgICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKKyAgICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCisgICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQorICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgorICAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKKyAgICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KKworIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCisgICAgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAorICAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCisKKyA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQorICAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLworCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUworIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAorIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKKyBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgKi8KKworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuOworCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0OworCisvKioKKyAqIFRlc3RzIGR5bmFtaWNhbGx5IGNvbXBpbGluZyBhbmQgcnVubmluZyBhIG5ldyBjbGFzcworICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBSdW5Hcm9vdnlUZXN0IGV4dGVuZHMgVGVzdFN1cHBvcnQgeworCisgICAgcHVibGljIHZvaWQgdGVzdEFycmF5QnVnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEdyb292eU9iamVjdCBvYmplY3QgPSBjb21waWxlKCJzcmMvdGVzdC9ncm9vdnkvVG9BcnJheUJ1Z1Rlc3QuZ3Jvb3Z5Iik7CisgICAgICAgIG9iamVjdC5pbnZva2VNZXRob2QoInRlc3RUb0FycmF5QnVnIiwgbnVsbCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdGZpeCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBHcm9vdnlPYmplY3Qgb2JqZWN0ID0gY29tcGlsZSgic3JjL3Rlc3QvZ3Jvb3Z5L1Bvc3RmaXhUZXN0Lmdyb292eSIpOworICAgICAgICBvYmplY3QuaW52b2tlTWV0aG9kKCJ0ZXN0SW50ZWdlclBvc3RmaXgiLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEdyb292eU9iamVjdCBvYmplY3QgPSBjb21waWxlKCJzcmMvdGVzdC9ncm9vdnkvTWFwVGVzdC5ncm9vdnkiKTsKKyAgICAgICAgb2JqZWN0Lmludm9rZU1ldGhvZCgidGVzdE1hcCIsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9zdXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEdyb292eU9iamVjdCBvYmplY3QgPSBjb21waWxlKCJzcmMvdGVzdC9ncm9vdnkvQ2xvc3VyZU1ldGhvZFRlc3QuZ3Jvb3Z5Iik7CisgICAgICAgIG9iamVjdC5pbnZva2VNZXRob2QoInRlc3RMaXN0Q29sbGVjdCIsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9zdXJlV2l0aERlZmF1bHRQYXJhbSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBHcm9vdnlPYmplY3Qgb2JqZWN0ID0gY29tcGlsZSgic3JjL3Rlc3QvZ3Jvb3Z5L0Nsb3N1cmVXaXRoRGVmYXVsdFBhcmFtVGVzdC5ncm9vdnkiKTsKKyAgICAgICAgb2JqZWN0Lmludm9rZU1ldGhvZCgibWV0aG9kV2l0aERlZmF1bHRQYXJhbSIsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RPcHRpb25hbFJldHVybigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBHcm9vdnlPYmplY3Qgb2JqZWN0ID0gY29tcGlsZSgic3JjL3Rlc3QvZ3Jvb3Z5L09wdGlvbmFsUmV0dXJuVGVzdC5ncm9vdnkiKTsKKyAgICAgICAgb2JqZWN0Lmludm9rZU1ldGhvZCgidGVzdFNpbmdsZUV4cHJlc3Npb24iLCBudWxsKTsKKyAgICAgICAgb2JqZWN0Lmludm9rZU1ldGhvZCgidGVzdExhc3RFeHByZXNzaW9uSXNTaW1wbGUiLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc29sZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBHcm9vdnlPYmplY3Qgb2JqZWN0ID0gY29tcGlsZSgic3JjL21haW4vZ3Jvb3Z5L3VpL0NvbnNvbGUuZ3Jvb3Z5Iik7CisgICAgfQorICAgIC8qICAgICovCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9TaW1wbGVCZWFuLmphdmEgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9TaW1wbGVCZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFmYjBiMQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL1NpbXBsZUJlYW4uamF2YQpAQCAtMCwwICsxLDc5IEBACisvKgorICRJZCQKKworIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCisgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQKKyAgICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKKyAgICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCisgICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQorICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgorICAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKKyAgICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KKworIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCisgICAgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAorICAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCisKKyA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQorICAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLworCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUworIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAorIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKKyBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgKi8KKworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNsYXNzZ2VuOworCisKKy8qKgorICogQSBzaW1wbGUgYmVhbgorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBTaW1wbGVCZWFuIHsKKworICAgIHByaXZhdGUgU3RyaW5nIGJhcjsKKyAgICBwcml2YXRlIE9iamVjdCB4OworCisgICAgLy9wcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSU5UX0NPTlNUID0gbmV3IEludGVnZXIoMTIzKTsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmFyKCkgeworICAgICAgICByZXR1cm4gYmFyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEJhcihTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgdGhpcy5iYXIgPSB2YWx1ZTsKKyAgICB9CisKKworICAgIHB1YmxpYyB2b2lkIHNldE51bWJlcigpIHsKKyAgICAgICAgeCA9IG5ldyBJbnRlZ2VyKDEyMyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RmxvYXQoKSB7CisgICAgICAgIHggPSBuZXcgRG91YmxlKDEyMyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vVGVzdFN1cHBvcnQuamF2YSBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL1Rlc3RTdXBwb3J0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI1OTVlMgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL1Rlc3RTdXBwb3J0LmphdmEKQEAgLTAsMCArMSwyMTAgQEAKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbjsKKworLyoKKyAkSWQkCisKKyBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAorIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0CisgICAgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhCisgICAgY29weSBvZiB0aGlzIGRvY3VtZW50LgorCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQorICAgIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKKyAgICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKKyAgICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCisgICAgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCisKKyA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IgorICAgIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQKKyAgICB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgorCisgNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KKyAgICBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMKKyBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKKyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCisgVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICovCisKK2ltcG9ydCBncm9vdnkubGFuZy4qOworaW1wb3J0IGdyb292eS51dGlsLkdyb292eVRlc3RDYXNlOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LkNsYXNzTm9kZTsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5Db21waWxlVW5pdDsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5GaWVsZE5vZGU7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuTW9kdWxlTm9kZTsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5leHByLkV4cHJlc3Npb247CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuZXhwci5GaWVsZEV4cHJlc3Npb247CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuZXhwci5NZXRob2RDYWxsRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5zdG10LkV4cHJlc3Npb25TdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLkNvbXBpbGVyQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuSW52b2tlckhlbHBlcjsKK2ltcG9ydCBvcmcub2JqZWN0d2ViLmFzbS5PcGNvZGVzOworCitpbXBvcnQgamF2YS5iZWFucy5CZWFuSW5mbzsKK2ltcG9ydCBqYXZhLmJlYW5zLkludHJvc3BlY3RvcjsKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKKworLyoqCisgKiBCYXNlIGNsYXNzIGZvciB0ZXN0IGNhc2VzCisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIFRlc3RTdXBwb3J0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgaW1wbGVtZW50cyBPcGNvZGVzIHsKKworICAgIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBEVU1QX0NMQVNTID0gZmFsc2U7CisKKyAgICAvLyBDbGFzc0xvYWRlciBwYXJlbnRMb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOworICAgIGZpbmFsIENsYXNzTG9hZGVyIHBhcmVudExvYWRlciA9IGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKKyAgICBwcm90ZWN0ZWQgZmluYWwgR3Jvb3Z5Q2xhc3NMb2FkZXIgbG9hZGVyID0KKyAgICAgICAgICAgIChHcm9vdnlDbGFzc0xvYWRlcikgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgR3Jvb3Z5Q2xhc3NMb2FkZXIocGFyZW50TG9hZGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBmaW5hbCBDb21waWxlVW5pdCB1bml0ID0gbmV3IENvbXBpbGVVbml0KGxvYWRlciwgbmV3IENvbXBpbGVyQ29uZmlndXJhdGlvbigpKTsKKyAgICBmaW5hbCBNb2R1bGVOb2RlIG1vZHVsZSA9IG5ldyBNb2R1bGVOb2RlKHVuaXQpOworCisgICAgcHJvdGVjdGVkIENsYXNzIGxvYWRDbGFzcyhDbGFzc05vZGUgY2xhc3NOb2RlKSB7CisgICAgICAgIGNsYXNzTm9kZS5zZXRNb2R1bGUobW9kdWxlKTsKKyAgICAgICAgQ2xhc3MgZm9vQ2xhc3MgPSBsb2FkZXIuZGVmaW5lQ2xhc3MoY2xhc3NOb2RlLCBjbGFzc05vZGUuZ2V0TmFtZSgpICsgIi5ncm9vdnkiLCAiZ3Jvb3Z5LnRlc3RTdXBwb3J0Iik7CisgICAgICAgIHJldHVybiBmb29DbGFzczsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRTZXRQcm9wZXJ0eShPYmplY3QgYmVhbiwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgbmV3VmFsdWUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGdldERlc2NyaXB0b3IoYmVhbiwgcHJvcGVydHkpOworICAgICAgICBNZXRob2QgbWV0aG9kID0gZGVzY3JpcHRvci5nZXRXcml0ZU1ldGhvZCgpOworICAgICAgICBhc3NlcnRUcnVlKCJoYXMgc2V0dGVyIG1ldGhvZCIsIG1ldGhvZCAhPSBudWxsKTsKKworICAgICAgICBPYmplY3RbXSBhcmdzID0ge25ld1ZhbHVlfTsKKyAgICAgICAgT2JqZWN0IHZhbHVlID0gaW52b2tlTWV0aG9kKGJlYW4sIG1ldGhvZCwgYXJncyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzaG91bGQgcmV0dXJuIG51bGwiLCBudWxsLCB2YWx1ZSk7CisKKyAgICAgICAgYXNzZXJ0R2V0UHJvcGVydHkoYmVhbiwgcHJvcGVydHksIG5ld1ZhbHVlKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRHZXRQcm9wZXJ0eShPYmplY3QgYmVhbiwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgZXhwZWN0ZWQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGdldERlc2NyaXB0b3IoYmVhbiwgcHJvcGVydHkpOworICAgICAgICBNZXRob2QgbWV0aG9kID0gZGVzY3JpcHRvci5nZXRSZWFkTWV0aG9kKCk7CisgICAgICAgIGFzc2VydFRydWUoImhhcyBnZXR0ZXIgbWV0aG9kIiwgbWV0aG9kICE9IG51bGwpOworCisgICAgICAgIE9iamVjdFtdIGFyZ3MgPSB7CisgICAgICAgIH07CisgICAgICAgIE9iamVjdCB2YWx1ZSA9IGludm9rZU1ldGhvZChiZWFuLCBtZXRob2QsIGFyZ3MpOworCisgICAgICAgIC8qCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXhwZWN0ZWQ6ICIgKyBleHBlY3RlZCk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVmFsdWU6ICIgKyB2YWx1ZSk7CisgICAgICAgIAorICAgICAgICBpZiAoZXhwZWN0ZWQgPT0gbnVsbCkgeyBTeXN0ZW0ub3V0LnByaW50bG4oIkV4cGVjdGVkIGlzIG51bGwiKTsgfQorICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeyBTeXN0ZW0ub3V0LnByaW50bG4oInZhbHVlIGlzIG51bGwiKTsgfQorICAgICAgICAqLworCisgICAgICAgIGFzc2VydEVxdWFscygicHJvcGVydHkgdmFsdWUiLCBleHBlY3RlZCwgdmFsdWUpOworICAgIH0KKworICAgIHByb3RlY3RlZCBPYmplY3QgaW52b2tlTWV0aG9kKE9iamVjdCBiZWFuLCBNZXRob2QgbWV0aG9kLCBPYmplY3RbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBtZXRob2QuaW52b2tlKGJlYW4sIGFyZ3MpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkludm9jYXRpb25UYXJnZXRFeGNlcHRpb246ICIgKyBlLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIFByb3BlcnR5RGVzY3JpcHRvciBnZXREZXNjcmlwdG9yKE9iamVjdCBiZWFuLCBTdHJpbmcgcHJvcGVydHkpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBCZWFuSW5mbyBpbmZvID0gSW50cm9zcGVjdG9yLmdldEJlYW5JbmZvKGJlYW4uZ2V0Q2xhc3MoKSk7CisgICAgICAgIFByb3BlcnR5RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gaW5mby5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIFByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvcnNbaV07CisgICAgICAgICAgICBpZiAoZGVzY3JpcHRvci5nZXROYW1lKCkuZXF1YWxzKHByb3BlcnR5KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdG9yOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZhaWwoIkNvdWxkIG5vdCBmaW5kIHByb3BlcnR5OiAiICsgcHJvcGVydHkgKyAiIG9uIGJlYW46ICIgKyBiZWFuKTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0RmllbGQoQ2xhc3MgYUNsYXNzLCBTdHJpbmcgbmFtZSwgaW50IG1vZGlmaWVycywgQ2xhc3NOb2RlIHR5cGUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBGaWVsZCBmaWVsZCA9IGFDbGFzcy5nZXREZWNsYXJlZEZpZWxkKG5hbWUpOworCisgICAgICAgIGFzc2VydFRydWUoIkZvdW5kIGZpZWxkIGNhbGxlZDogIiArIG5hbWUsIGZpZWxkICE9IG51bGwpOworICAgICAgICBhc3NlcnRFcXVhbHMoIk5hbWUiLCBuYW1lLCBmaWVsZC5nZXROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlR5cGUiLCB0eXBlLmdldE5hbWUoKSwgZmllbGQuZ2V0VHlwZSgpLmdldE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiTW9kaWZpZXJzIiwgbW9kaWZpZXJzLCBmaWVsZC5nZXRNb2RpZmllcnMoKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEV4cHJlc3Npb25TdGF0ZW1lbnQgY3JlYXRlUHJpbnRsblN0YXRlbWVudChFeHByZXNzaW9uIGV4cHJlc3Npb24pIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvblN0YXRlbWVudCgKKyAgICAgICAgICAgICAgICBuZXcgTWV0aG9kQ2FsbEV4cHJlc3Npb24oCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmllbGRFeHByZXNzaW9uKEZpZWxkTm9kZS5uZXdTdGF0aWMoU3lzdGVtLmNsYXNzLCAib3V0IikpLAorICAgICAgICAgICAgICAgICAgICAgICAgInByaW50bG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFzc2VydHMgdGhhdCB0aGUgc2NyaXB0IHJ1bnMgd2l0aG91dCBhbnkgZXhjZXB0aW9ucworICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydFNjcmlwdChTdHJpbmcgdGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydFNjcmlwdCh0ZXh0LCBnZXRUZXN0Q2xhc3NOYW1lKCkpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydFNjcmlwdChmaW5hbCBTdHJpbmcgdGV4dCwgZmluYWwgU3RyaW5nIHNjcmlwdE5hbWUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBsb2cuaW5mbygiQWJvdXQgdG8gZXhlY3V0ZSBzY3JpcHQiKTsKKyAgICAgICAgbG9nLmluZm8odGV4dCk7CisgICAgICAgIEdyb292eUNvZGVTb3VyY2UgZ2NzID0gKEdyb292eUNvZGVTb3VyY2UpIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgeworICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBHcm9vdnlDb2RlU291cmNlKHRleHQsIHNjcmlwdE5hbWUsICIvZ3Jvb3Z5L3Rlc3RTdXBwb3J0Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBDbGFzcyBncm9vdnlDbGFzcyA9IGxvYWRlci5wYXJzZUNsYXNzKGdjcyk7CisgICAgICAgIFNjcmlwdCBzY3JpcHQgPSBJbnZva2VySGVscGVyLmNyZWF0ZVNjcmlwdChncm9vdnlDbGFzcywgbmV3IEJpbmRpbmcoKSk7CisgICAgICAgIHNjcmlwdC5ydW4oKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRTY3JpcHRGaWxlKFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGxvZy5pbmZvKCJBYm91dCB0byBleGVjdXRlIHNjcmlwdDogIiArIGZpbGVOYW1lKTsKKworICAgICAgICBDbGFzcyBncm9vdnlDbGFzcyA9IGxvYWRlci5wYXJzZUNsYXNzKG5ldyBHcm9vdnlDb2RlU291cmNlKG5ldyBGaWxlKGZpbGVOYW1lKSkpOworICAgICAgICBTY3JpcHQgc2NyaXB0ID0gSW52b2tlckhlbHBlci5jcmVhdGVTY3JpcHQoZ3Jvb3Z5Q2xhc3MsIG5ldyBCaW5kaW5nKCkpOworICAgICAgICBzY3JpcHQucnVuKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEdyb292eU9iamVjdCBjb21waWxlKFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIENsYXNzIGdyb292eUNsYXNzID0gbG9hZGVyLnBhcnNlQ2xhc3MobmV3IEdyb292eUNvZGVTb3VyY2UobmV3IEZpbGUoZmlsZU5hbWUpKSk7CisKKyAgICAgICAgR3Jvb3Z5T2JqZWN0IG9iamVjdCA9IChHcm9vdnlPYmplY3QpIGdyb292eUNsYXNzLm5ld0luc3RhbmNlKCk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShvYmplY3QgIT0gbnVsbCk7CisKKyAgICAgICAgcmV0dXJuIG9iamVjdDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9UdXBsZUxpc3RUZXN0LmphdmEgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jbGFzc2dlbi9UdXBsZUxpc3RUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBkNjIwNgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL1R1cGxlTGlzdFRlc3QuamF2YQpAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAkSWQkCisKKyBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAorIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0CisgICAgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhCisgICAgY29weSBvZiB0aGlzIGRvY3VtZW50LgorCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQorICAgIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKKyAgICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKKyAgICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCisgICAgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCisKKyA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IgorICAgIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQKKyAgICB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgorCisgNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KKyAgICBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMKKyBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKKyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCisgVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbjsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0Lio7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3QuZXhwci4qOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuQmxvY2tTdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5hc3Quc3RtdC5FeHByZXNzaW9uU3RhdGVtZW50OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuRm9yU3RhdGVtZW50OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuYXN0LnN0bXQuU3RhdGVtZW50OworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5JbnZva2VySGVscGVyOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5JbnZva2VySW52b2NhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5Ub2tlbjsKKworLyoqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgVHVwbGVMaXN0VGVzdCBleHRlbmRzIFRlc3RTdXBwb3J0IHsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RJdGVyYXRlT3ZlclR1cGxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFR1cGxlRXhwcmVzc2lvbiBsaXN0RXhwcmVzc2lvbiA9IG5ldyBUdXBsZUV4cHJlc3Npb24oKTsKKyAgICAgICAgbGlzdEV4cHJlc3Npb24uYWRkRXhwcmVzc2lvbihuZXcgQ29uc3RhbnRFeHByZXNzaW9uKCJhIikpOworICAgICAgICBsaXN0RXhwcmVzc2lvbi5hZGRFeHByZXNzaW9uKG5ldyBDb25zdGFudEV4cHJlc3Npb24oImIiKSk7CisgICAgICAgIGxpc3RFeHByZXNzaW9uLmFkZEV4cHJlc3Npb24obmV3IENvbnN0YW50RXhwcmVzc2lvbigiYyIpKTsKKyAgICAgICAgYXNzZXJ0SXRlcmF0ZSgiaXRlcmF0ZU92ZXJUdXBsZSIsIGxpc3RFeHByZXNzaW9uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0ZU92ZXJMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIExpc3RFeHByZXNzaW9uIGxpc3RFeHByZXNzaW9uID0gbmV3IExpc3RFeHByZXNzaW9uKCk7CisgICAgICAgIGxpc3RFeHByZXNzaW9uLmFkZEV4cHJlc3Npb24obmV3IENvbnN0YW50RXhwcmVzc2lvbigiYSIpKTsKKyAgICAgICAgbGlzdEV4cHJlc3Npb24uYWRkRXhwcmVzc2lvbihuZXcgQ29uc3RhbnRFeHByZXNzaW9uKCJiIikpOworICAgICAgICBsaXN0RXhwcmVzc2lvbi5hZGRFeHByZXNzaW9uKG5ldyBDb25zdGFudEV4cHJlc3Npb24oImMiKSk7CisgICAgICAgIGxpc3RFeHByZXNzaW9uLmFkZEV4cHJlc3Npb24obmV3IENvbnN0YW50RXhwcmVzc2lvbigiYSIpKTsKKyAgICAgICAgbGlzdEV4cHJlc3Npb24uYWRkRXhwcmVzc2lvbihuZXcgQ29uc3RhbnRFeHByZXNzaW9uKCJiIikpOworICAgICAgICBsaXN0RXhwcmVzc2lvbi5hZGRFeHByZXNzaW9uKG5ldyBDb25zdGFudEV4cHJlc3Npb24oImMiKSk7CisgICAgICAgIGFzc2VydEl0ZXJhdGUoIml0ZXJhdGVPdmVyTGlzdCIsIGxpc3RFeHByZXNzaW9uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0ZU92ZXJNYXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTWFwRXhwcmVzc2lvbiBtYXBFeHByZXNzaW9uID0gbmV3IE1hcEV4cHJlc3Npb24oKTsKKyAgICAgICAgbWFwRXhwcmVzc2lvbi5hZGRNYXBFbnRyeUV4cHJlc3Npb24obmV3IENvbnN0YW50RXhwcmVzc2lvbigiYSIpLCBuZXcgQ29uc3RhbnRFeHByZXNzaW9uKCJ4IikpOworICAgICAgICBtYXBFeHByZXNzaW9uLmFkZE1hcEVudHJ5RXhwcmVzc2lvbihuZXcgQ29uc3RhbnRFeHByZXNzaW9uKCJiIiksIG5ldyBDb25zdGFudEV4cHJlc3Npb24oInkiKSk7CisgICAgICAgIG1hcEV4cHJlc3Npb24uYWRkTWFwRW50cnlFeHByZXNzaW9uKG5ldyBDb25zdGFudEV4cHJlc3Npb24oImMiKSwgbmV3IENvbnN0YW50RXhwcmVzc2lvbigieiIpKTsKKyAgICAgICAgYXNzZXJ0SXRlcmF0ZSgiaXRlcmF0ZU92ZXJNYXAiLCBtYXBFeHByZXNzaW9uKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRJdGVyYXRlKFN0cmluZyBtZXRob2ROYW1lLCBFeHByZXNzaW9uIGxpc3RFeHByZXNzaW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQ2xhc3NOb2RlIGNsYXNzTm9kZSA9IG5ldyBDbGFzc05vZGUoIkZvbyIsIEFDQ19QVUJMSUMsIENsYXNzSGVscGVyLk9CSkVDVF9UWVBFKTsKKyAgICAgICAgY2xhc3NOb2RlLmFkZENvbnN0cnVjdG9yKG5ldyBDb25zdHJ1Y3Rvck5vZGUoQUNDX1BVQkxJQywgbnVsbCkpOworICAgICAgICBjbGFzc05vZGUuYWRkUHJvcGVydHkobmV3IFByb3BlcnR5Tm9kZSgiYmFyIiwgQUNDX1BVQkxJQywgQ2xhc3NIZWxwZXIuU1RSSU5HX1RZUEUsIGNsYXNzTm9kZSwgbnVsbCwgbnVsbCwgbnVsbCkpOworCisgICAgICAgIFN0YXRlbWVudCBsb29wU3RhdGVtZW50ID0gY3JlYXRlUHJpbnRsblN0YXRlbWVudChuZXcgVmFyaWFibGVFeHByZXNzaW9uKCJpIikpOworCisgICAgICAgIEJsb2NrU3RhdGVtZW50IGJsb2NrID0gbmV3IEJsb2NrU3RhdGVtZW50KCk7CisgICAgICAgIGJsb2NrLmFkZFN0YXRlbWVudChuZXcgRXhwcmVzc2lvblN0YXRlbWVudChuZXcgRGVjbGFyYXRpb25FeHByZXNzaW9uKG5ldyBWYXJpYWJsZUV4cHJlc3Npb24oImxpc3QiKSwgVG9rZW4ubmV3U3ltYm9sKCI9IiwgMCwgMCksIGxpc3RFeHByZXNzaW9uKSkpOworICAgICAgICBibG9jay5hZGRTdGF0ZW1lbnQobmV3IEZvclN0YXRlbWVudChuZXcgUGFyYW1ldGVyKENsYXNzSGVscGVyLkRZTkFNSUNfVFlQRSwgImkiKSwgbmV3IFZhcmlhYmxlRXhwcmVzc2lvbigibGlzdCIpLCBsb29wU3RhdGVtZW50KSk7CisgICAgICAgIGNsYXNzTm9kZS5hZGRNZXRob2QobmV3IE1ldGhvZE5vZGUobWV0aG9kTmFtZSwgQUNDX1BVQkxJQywgQ2xhc3NIZWxwZXIuVk9JRF9UWVBFLCBQYXJhbWV0ZXIuRU1QVFlfQVJSQVksIENsYXNzTm9kZS5FTVBUWV9BUlJBWSwgYmxvY2spKTsKKworICAgICAgICBDbGFzcyBmb29DbGFzcyA9IGxvYWRDbGFzcyhjbGFzc05vZGUpOworICAgICAgICBhc3NlcnRUcnVlKCJMb2FkZWQgYSBuZXcgY2xhc3MiLCBmb29DbGFzcyAhPSBudWxsKTsKKworICAgICAgICBPYmplY3QgYmVhbiA9IGZvb0NsYXNzLm5ld0luc3RhbmNlKCk7CisgICAgICAgIGFzc2VydFRydWUoIk1hbmFnZWQgdG8gY3JlYXRlIGJlYW4iLCBiZWFuICE9IG51bGwpOworCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIyMjIyMjIyMjIyMjIyMjIyBOb3cgYWJvdXQgdG8gaW52b2tlIG1ldGhvZCIpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJbnZva2VySGVscGVyLmludm9rZU1ldGhvZChiZWFuLCBtZXRob2ROYW1lLCBudWxsKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSW52b2tlckludm9jYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDYXVnaHQ6ICIgKyBlLmdldENhdXNlKCkpOworICAgICAgICAgICAgZS5nZXRDYXVzZSgpLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgZmFpbCgiU2hvdWxkIG5vdCBoYXZlIHRocm93biBhbiBleGNlcHRpb24iKTsKKyAgICAgICAgfQorICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiMjIyMjIyMjIyMjIyMjIyMgRG9uZSIpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY2xhc3NnZW4vVmVyaWZpZXJDb2RlVmlzaXRvclRlc3QuamF2YSBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL1ZlcmlmaWVyQ29kZVZpc2l0b3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEyNGM0NAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NsYXNzZ2VuL1ZlcmlmaWVyQ29kZVZpc2l0b3JUZXN0LmphdmEKQEAgLTAsMCArMSw1OCBAQAorLyoqCisgKgorICogQ29weXJpZ2h0IDIwMDQgSmFtZXMgU3RyYWNoYW4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5jbGFzc2dlbjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5BU1ROb2RlOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4LlJ1bnRpbWVQYXJzZXJFeGNlcHRpb247CisKKy8qKgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgVmVyaWZpZXJDb2RlVmlzaXRvclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgcHVibGljIHZvaWQgdGVzdFZhbGlkTmFtZXMoKSB7CisgICAgICAgIGFzc2VydFZhbGlkTmFtZSgiYSIpOworICAgICAgICBhc3NlcnRWYWxpZE5hbWUoImExMjM0Iik7CisgICAgICAgIGFzc2VydFZhbGlkTmFtZSgiYV9iX2MiKTsKKyAgICAgICAgYXNzZXJ0VmFsaWROYW1lKCJhX19fXzEyMzQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZE5hbWVzKCkgeworICAgICAgICBhc3NlcnRJbnZhbGlkTmFtZSgiMSIpOworICAgICAgICBhc3NlcnRJbnZhbGlkTmFtZSgiMTAwIik7CisgICAgICAgIGFzc2VydEludmFsaWROYW1lKCIxYSIpOworICAgICAgICBhc3NlcnRJbnZhbGlkTmFtZSgiYSEiKTsKKyAgICAgICAgYXNzZXJ0SW52YWxpZE5hbWUoImEuIik7CisgICAgICAgIGFzc2VydEludmFsaWROYW1lKCIkIik7CisgICAgICAgIGFzc2VydEludmFsaWROYW1lKCIkZm9vIik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0VmFsaWROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIFZlcmlmaWVyQ29kZVZpc2l0b3IuYXNzZXJ0VmFsaWRJZGVudGlmaWVyKG5hbWUsICJ2YXJpYWJsZSBuYW1lIiwgbmV3IEFTVE5vZGUoKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0SW52YWxpZE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFZlcmlmaWVyQ29kZVZpc2l0b3IuYXNzZXJ0VmFsaWRJZGVudGlmaWVyKG5hbWUsICJ2YXJpYWJsZSBuYW1lIiwgbmV3IEFTVE5vZGUoKSk7CisgICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gZXhjZXB0aW9uIGR1ZSB0byBpbnZhbGlkIG5hbWU6ICIgKyBuYW1lKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUnVudGltZVBhcnNlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNhdWdodCBpbnZhbGlkIGV4Y2VwdGlvbjogIiArIGUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY29udHJvbC9Db21waWxhdGlvblVuaXRUZXN0LmphdmEgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jb250cm9sL0NvbXBpbGF0aW9uVW5pdFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzU5ZWI3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY29udHJvbC9Db21waWxhdGlvblVuaXRUZXN0LmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqICRJZCQKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIENvZGVoYXVzIC0gaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uCisgKiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sOworCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5Q2xhc3NMb2FkZXI7CitpbXBvcnQgb3JnLmptb2NrLk1vY2s7CitpbXBvcnQgb3JnLmptb2NrLmNnbGliLk1vY2tPYmplY3RUZXN0Q2FzZTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworcHVibGljIGNsYXNzIENvbXBpbGF0aW9uVW5pdFRlc3QgZXh0ZW5kcyBNb2NrT2JqZWN0VGVzdENhc2UgeworCisgICAgcHVibGljIHZvaWQgdGVzdEFwcGVuZHNUaGVDbGFzc3BhdGhPZlRoZUNvbXBpbGVyQ29uZmlndXJhdGlvblRvQ3VycmVudENsYXNzTG9hZGVyV2hlbkluc3RhbnRpYXRlZCgpIHsKKyAgICAgICAgQ29tcGlsZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBuZXcgQ29tcGlsZXJDb25maWd1cmF0aW9uKCk7CisgICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0Q2xhc3NwYXRoKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5jbGFzcy5wYXRoIikpOworICAgICAgICAvLyBkaXNhYmxlZCB1bnRpbCBjaGVja2VkIHdpdGggZnJhegorICAgICAgICAvL25ldyBDb21waWxhdGlvblVuaXQoY29uZmlndXJhdGlvbiwgbnVsbCwgY3JlYXRlR3Jvb3Z5Q2xhc3NMb2FkZXJXaXRoRXhwZWN0YXRpb25zKGNvbmZpZ3VyYXRpb24pKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEdyb292eUNsYXNzTG9hZGVyIGNyZWF0ZUdyb292eUNsYXNzTG9hZGVyV2l0aEV4cGVjdGF0aW9ucyhDb21waWxlckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgeworICAgICAgICBNb2NrIG1vY2tHcm9vdnlDbGFzc0xvYWRlciA9IG1vY2soR3Jvb3Z5Q2xhc3NMb2FkZXIuY2xhc3MpOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY29uZmlndXJhdGlvbi5nZXRDbGFzc3BhdGgoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBtb2NrR3Jvb3Z5Q2xhc3NMb2FkZXIuZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgiYWRkQ2xhc3NwYXRoIikud2l0aChlcShpdGVyYXRvci5uZXh0KCkpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKEdyb292eUNsYXNzTG9hZGVyKSBtb2NrR3Jvb3Z5Q2xhc3NMb2FkZXIucHJveHkoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jb250cm9sL0NvbXBpbGVyQ29uZmlndXJhdGlvblRlc3QuamF2YSBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NvbnRyb2wvQ29tcGlsZXJDb25maWd1cmF0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMzJjYjEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jb250cm9sL0NvbXBpbGVyQ29uZmlndXJhdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDI0NyBAQAorDQorLyoNCisgKiAkSWQ6JA0KKyAqDQorICogQ29weXJpZ2h0IChjKSAyMDA3IEphbWVzIFAuIFdoaXRlDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQorICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24NCisgKiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICoNCisgKi8NCisNCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbDsNCisNCitpbXBvcnQgZ3Jvb3Z5LnV0aWwuR3Jvb3Z5VGVzdENhc2U7DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5tZXNzYWdlcy5XYXJuaW5nTWVzc2FnZTsNCisNCitpbXBvcnQgamF2YS5pby5GaWxlOw0KK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOw0KK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5NYXA7DQoraW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOw0KKw0KKy8qKg0KKyAqIE1ha2Ugc3VyZSBDb21waWxlckNvbmZpZ3VyYXRpb24gd29ya3MuDQorICovDQorcHVibGljIGNsYXNzIENvbXBpbGVyQ29uZmlndXJhdGlvblRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7DQorICAgIFByb3BlcnRpZXMgc2F2ZWRQcm9wZXJ0aWVzOw0KKw0KKyAgICAvLyBVc2Ugc2V0VXAvdGVhckRvd24gdG8gYXZvaWQgbXVja2luZyB3aXRoIHN5c3RlbSBwcm9wZXJ0aWVzIGZvciBvdGhlciB0ZXN0cy4uLg0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsNCisgICAgICAgIHNhdmVkUHJvcGVydGllcyA9IFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCk7DQorICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydGllcyhuZXcgUHJvcGVydGllcyhzYXZlZFByb3BlcnRpZXMpKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsNCisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0aWVzKHNhdmVkUHJvcGVydGllcyk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRDb25zdHJ1Y3RvcigpIHsNCisgICAgICAgIGZpbmFsIENvbXBpbGVyQ29uZmlndXJhdGlvbiBjb25maWcgPSBDb21waWxlckNvbmZpZ3VyYXRpb24uREVGQVVMVDsNCisNCisgICAgICAgIGFzc2VydEVxdWFscyhXYXJuaW5nTWVzc2FnZS5MSUtFTFlfRVJST1JTLCBjb25maWcuZ2V0V2FybmluZ0xldmVsKCkpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKEJvb2xlYW4uZ2V0Qm9vbGVhbigiZ3Jvb3Z5Lm91dHB1dC5kZWJ1ZyIpLCBjb25maWcuZ2V0RGVidWcoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoQm9vbGVhbi5nZXRCb29sZWFuKCJncm9vdnkub3V0cHV0LnZlcmJvc2UiKSwgY29uZmlnLmdldFZlcmJvc2UoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGNvbmZpZy5nZXREZWJ1ZygpKTsNCisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgY29uZmlnLmdldFZlcmJvc2UoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoMTAsIGNvbmZpZy5nZXRUb2xlcmFuY2UoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoMTAwLCBjb25maWcuZ2V0TWluaW11bVJlY29tcGlsYXRpb25JbnRlcnZhbCgpKTsNCisgICAgICAgIGFzc2VydE51bGwoY29uZmlnLmdldFNjcmlwdEJhc2VDbGFzcygpKTsNCisgICAgICAgIGFzc2VydEVxdWFscyhnZXRTeXN0ZW1FbmNvZGluZygpLCBjb25maWcuZ2V0U291cmNlRW5jb2RpbmcoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0Vk1WZXJzaW9uKCksIGNvbmZpZy5nZXRUYXJnZXRCeXRlY29kZSgpKTsNCisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgY29uZmlnLmdldFJlY29tcGlsZUdyb292eVNvdXJjZSgpKTsNCisgICAgICAgIHsNCisgICAgICAgICAgICBmaW5hbCBMaXN0IGxpc3RDUCA9IGNvbmZpZy5nZXRDbGFzc3BhdGgoKTsNCisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGxpc3RDUCk7DQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGxpc3RDUC5zaXplKCkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjb25maWcuZ2V0T3V0cHV0KCkpOw0KKyAgICAgICAgYXNzZXJ0TnVsbChjb25maWcuZ2V0VGFyZ2V0RGlyZWN0b3J5KCkpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIuZ3Jvb3Z5IiwgY29uZmlnLmdldERlZmF1bHRTY3JpcHRFeHRlbnNpb24oKSk7DQorICAgICAgICBhc3NlcnROdWxsKGNvbmZpZy5nZXRKb2ludENvbXBpbGF0aW9uT3B0aW9ucygpKTsNCisgICAgICAgIGFzc2VydE5vdE51bGwoY29uZmlnLmdldFBsdWdpbkZhY3RvcnkoKSk7DQorICAgIH0NCisNCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0U3lzdGVtRW5jb2RpbmcoKSB7DQorICAgICAgICByZXR1cm4gU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLmVuY29kaW5nIiwgIlVTLUFTQ0lJIik7DQorICAgIH0NCisNCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFZNVmVyc2lvbigpIHsNCisgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZSgiamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbiIpOw0KKyAgICAgICAgICAgIHJldHVybiBDb21waWxlckNvbmZpZ3VyYXRpb24uUE9TVF9KREs1Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgY2F0Y2goRXhjZXB0aW9uIGV4KSB7DQorICAgICAgICAgICAgLy8gSUdOT1JFDQorICAgICAgICB9DQorDQorICAgICAgICByZXR1cm4gQ29tcGlsZXJDb25maWd1cmF0aW9uLlBSRV9KREs1Ow0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRWaWFTeXN0ZW1Qcm9wZXJ0aWVzKCkgew0KKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJncm9vdnkud2FybmluZ3MiLCAiUGFSYU5vaUEiKTsNCisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiZ3Jvb3Z5Lm91dHB1dC52ZXJib3NlIiwgInRyVUUiKTsNCisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiZ3Jvb3Z5LnJlY29tcGlsZS5taW5pbXVtSW50ZXJ2YWwiLCAiODY3ODkyMzQ1Iik7DQorDQorICAgICAgICBhc3NlcnRFcXVhbHMoIlBhUmFOb2lBIiwgU3lzdGVtLmdldFByb3BlcnR5KCJncm9vdnkud2FybmluZ3MiKSk7DQorDQorICAgICAgICBmaW5hbCBDb21waWxlckNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IENvbXBpbGVyQ29uZmlndXJhdGlvbihTeXN0ZW0uZ2V0UHJvcGVydGllcygpKTsNCisNCisgICAgICAgIGFzc2VydEVxdWFscyhXYXJuaW5nTWVzc2FnZS5QQVJBTk9JQSwgY29uZmlnLmdldFdhcm5pbmdMZXZlbCgpKTsNCisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgY29uZmlnLmdldERlYnVnKCkpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIGNvbmZpZy5nZXRWZXJib3NlKCkpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEwLCBjb25maWcuZ2V0VG9sZXJhbmNlKCkpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDg2Nzg5MjM0NSwgY29uZmlnLmdldE1pbmltdW1SZWNvbXBpbGF0aW9uSW50ZXJ2YWwoKSk7DQorICAgICAgICBhc3NlcnROdWxsKGNvbmZpZy5nZXRTY3JpcHRCYXNlQ2xhc3MoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0U3lzdGVtRW5jb2RpbmcoKSwgY29uZmlnLmdldFNvdXJjZUVuY29kaW5nKCkpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKGdldFZNVmVyc2lvbigpLCBjb25maWcuZ2V0VGFyZ2V0Qnl0ZWNvZGUoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGNvbmZpZy5nZXRSZWNvbXBpbGVHcm9vdnlTb3VyY2UoKSk7DQorICAgICAgICB7DQorICAgICAgICAgICAgZmluYWwgTGlzdCBsaXN0Q1AgPSBjb25maWcuZ2V0Q2xhc3NwYXRoKCk7DQorICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChsaXN0Q1ApOw0KKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBsaXN0Q1Auc2l6ZSgpKTsNCisgICAgICAgIH0NCisgICAgICAgIGFzc2VydE5vdE51bGwoY29uZmlnLmdldE91dHB1dCgpKTsNCisgICAgICAgIGFzc2VydE51bGwoY29uZmlnLmdldFRhcmdldERpcmVjdG9yeSgpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiLmdyb292eSIsIGNvbmZpZy5nZXREZWZhdWx0U2NyaXB0RXh0ZW5zaW9uKCkpOw0KKyAgICAgICAgYXNzZXJ0TnVsbChjb25maWcuZ2V0Sm9pbnRDb21waWxhdGlvbk9wdGlvbnMoKSk7DQorICAgICAgICBhc3NlcnROb3ROdWxsKGNvbmZpZy5nZXRQbHVnaW5GYWN0b3J5KCkpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHRlc3RDb3B5Q29uc3RydWN0b3IxKCkgew0KKyAgICAgICAgZmluYWwgQ29tcGlsZXJDb25maWd1cmF0aW9uIGluaXQgPSBuZXcgQ29tcGlsZXJDb25maWd1cmF0aW9uKCk7DQorDQorICAgICAgICBpbml0LnNldFdhcm5pbmdMZXZlbChXYXJuaW5nTWVzc2FnZS5QT1NTSUJMRV9FUlJPUlMpOw0KKyAgICAgICAgaW5pdC5zZXREZWJ1Zyh0cnVlKTsNCisgICAgICAgIGluaXQuc2V0VmVyYm9zZShmYWxzZSk7DQorICAgICAgICBpbml0LnNldFRvbGVyYW5jZSg3MjApOw0KKyAgICAgICAgaW5pdC5zZXRNaW5pbXVtUmVjb21waWxhdGlvbkludGVydmFsKDIzNCk7DQorICAgICAgICBpbml0LnNldFNjcmlwdEJhc2VDbGFzcygiYmxhcmcuZm9vLldoYXRTaXQiKTsNCisgICAgICAgIGluaXQuc2V0U291cmNlRW5jb2RpbmcoIkxFQUQtMTIzIik7DQorICAgICAgICBpbml0LnNldFRhcmdldEJ5dGVjb2RlKENvbXBpbGVyQ29uZmlndXJhdGlvbi5QT1NUX0pESzUpOw0KKyAgICAgICAgaW5pdC5zZXRSZWNvbXBpbGVHcm9vdnlTb3VyY2UodHJ1ZSk7DQorICAgICAgICBpbml0LnNldENsYXNzcGF0aCgiRmlsZTEiICsgRmlsZS5wYXRoU2VwYXJhdG9yICsgIlNvbWV3aGVyZSIpOw0KKw0KKyAgICAgICAgZmluYWwgUHJpbnRXcml0ZXIgaW5pdE91dCA9IG5ldyBQcmludFdyaXRlcihTeXN0ZW0ub3V0KTsNCisgICAgICAgIGluaXQuc2V0T3V0cHV0KGluaXRPdXQpOw0KKw0KKyAgICAgICAgZmluYWwgRmlsZSBpbml0VERGaWxlID0gbmV3IEZpbGUoIkEgd2FuZGVyaW5nIHBhdGgiKTsNCisgICAgICAgIGluaXQuc2V0VGFyZ2V0RGlyZWN0b3J5KGluaXRUREZpbGUpOw0KKyAgICAgICAgaW5pdC5zZXREZWZhdWx0U2NyaXB0RXh0ZW5zaW9uKCIuanBwIik7DQorDQorICAgICAgICBmaW5hbCBNYXAgaW5pdEpvaW50ID0gbmV3IEhhc2hNYXAoKTsNCisgICAgICAgIGluaXRKb2ludC5wdXQoInNvbWVrZXkiLCAic29tZXZhbHVlIik7DQorICAgICAgICBpbml0LnNldEpvaW50Q29tcGlsYXRpb25PcHRpb25zKGluaXRKb2ludCk7DQorDQorICAgICAgICBmaW5hbCBQYXJzZXJQbHVnaW5GYWN0b3J5IGluaXRQUEYgPSBQYXJzZXJQbHVnaW5GYWN0b3J5Lm5ld0luc3RhbmNlKHRydWUpOw0KKyAgICAgICAgaW5pdC5zZXRQbHVnaW5GYWN0b3J5KGluaXRQUEYpOw0KKw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKFdhcm5pbmdNZXNzYWdlLlBPU1NJQkxFX0VSUk9SUywgaW5pdC5nZXRXYXJuaW5nTGV2ZWwoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgaW5pdC5nZXREZWJ1ZygpKTsNCisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgaW5pdC5nZXRWZXJib3NlKCkpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDcyMCwgaW5pdC5nZXRUb2xlcmFuY2UoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoMjM0LCBpbml0LmdldE1pbmltdW1SZWNvbXBpbGF0aW9uSW50ZXJ2YWwoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoImJsYXJnLmZvby5XaGF0U2l0IiwgaW5pdC5nZXRTY3JpcHRCYXNlQ2xhc3MoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIkxFQUQtMTIzIiwgaW5pdC5nZXRTb3VyY2VFbmNvZGluZygpKTsNCisgICAgICAgIGFzc2VydEVxdWFscyhDb21waWxlckNvbmZpZ3VyYXRpb24uUE9TVF9KREs1LCBpbml0LmdldFRhcmdldEJ5dGVjb2RlKCkpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIGluaXQuZ2V0UmVjb21waWxlR3Jvb3Z5U291cmNlKCkpOw0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGZpbmFsIExpc3QgbGlzdENQID0gaW5pdC5nZXRDbGFzc3BhdGgoKTsNCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkZpbGUxIiwgbGlzdENQLmdldCgwKSk7DQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJTb21ld2hlcmUiLCBsaXN0Q1AuZ2V0KDEpKTsNCisgICAgICAgIH0NCisgICAgICAgIGFzc2VydEVxdWFscyhpbml0T3V0LCBpbml0LmdldE91dHB1dCgpKTsNCisgICAgICAgIGFzc2VydEVxdWFscyhpbml0VERGaWxlLCBpbml0LmdldFRhcmdldERpcmVjdG9yeSgpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiLmpwcCIsIGluaXQuZ2V0RGVmYXVsdFNjcmlwdEV4dGVuc2lvbigpKTsNCisgICAgICAgIGFzc2VydEVxdWFscyhpbml0Sm9pbnQsIGluaXQuZ2V0Sm9pbnRDb21waWxhdGlvbk9wdGlvbnMoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoaW5pdFBQRiwgaW5pdC5nZXRQbHVnaW5GYWN0b3J5KCkpOw0KKw0KKyAgICAgICAgZmluYWwgQ29tcGlsZXJDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBDb21waWxlckNvbmZpZ3VyYXRpb24oaW5pdCk7DQorDQorICAgICAgICBhc3NlcnRFcXVhbHMoV2FybmluZ01lc3NhZ2UuUE9TU0lCTEVfRVJST1JTLCBjb25maWcuZ2V0V2FybmluZ0xldmVsKCkpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIGNvbmZpZy5nZXREZWJ1ZygpKTsNCisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgY29uZmlnLmdldFZlcmJvc2UoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoNzIwLCBjb25maWcuZ2V0VG9sZXJhbmNlKCkpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIzNCwgY29uZmlnLmdldE1pbmltdW1SZWNvbXBpbGF0aW9uSW50ZXJ2YWwoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoImJsYXJnLmZvby5XaGF0U2l0IiwgY29uZmlnLmdldFNjcmlwdEJhc2VDbGFzcygpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiTEVBRC0xMjMiLCBjb25maWcuZ2V0U291cmNlRW5jb2RpbmcoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoQ29tcGlsZXJDb25maWd1cmF0aW9uLlBPU1RfSkRLNSwgY29uZmlnLmdldFRhcmdldEJ5dGVjb2RlKCkpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIGNvbmZpZy5nZXRSZWNvbXBpbGVHcm9vdnlTb3VyY2UoKSk7DQorICAgICAgICB7DQorICAgICAgICAgICAgZmluYWwgTGlzdCBsaXN0Q1AgPSBjb25maWcuZ2V0Q2xhc3NwYXRoKCk7DQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJGaWxlMSIsIGxpc3RDUC5nZXQoMCkpOw0KKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiU29tZXdoZXJlIiwgbGlzdENQLmdldCgxKSk7DQorICAgICAgICB9DQorICAgICAgICBhc3NlcnRFcXVhbHMoaW5pdE91dCwgY29uZmlnLmdldE91dHB1dCgpKTsNCisgICAgICAgIGFzc2VydEVxdWFscyhpbml0VERGaWxlLCBjb25maWcuZ2V0VGFyZ2V0RGlyZWN0b3J5KCkpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIuanBwIiwgY29uZmlnLmdldERlZmF1bHRTY3JpcHRFeHRlbnNpb24oKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoaW5pdEpvaW50LCBjb25maWcuZ2V0Sm9pbnRDb21waWxhdGlvbk9wdGlvbnMoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoaW5pdFBQRiwgY29uZmlnLmdldFBsdWdpbkZhY3RvcnkoKSk7DQorDQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgdGVzdENvcHlDb25zdHJ1Y3RvcjIoKSB7DQorICAgICAgICBmaW5hbCBDb21waWxlckNvbmZpZ3VyYXRpb24gaW5pdCA9IG5ldyBDb21waWxlckNvbmZpZ3VyYXRpb24oKTsNCisNCisgICAgICAgIGluaXQuc2V0V2FybmluZ0xldmVsKFdhcm5pbmdNZXNzYWdlLlBPU1NJQkxFX0VSUk9SUyk7DQorICAgICAgICBpbml0LnNldERlYnVnKGZhbHNlKTsNCisgICAgICAgIGluaXQuc2V0VmVyYm9zZSh0cnVlKTsNCisgICAgICAgIGluaXQuc2V0VG9sZXJhbmNlKDU1KTsNCisgICAgICAgIGluaXQuc2V0TWluaW11bVJlY29tcGlsYXRpb25JbnRlcnZhbCg5NzUpOw0KKyAgICAgICAgaW5pdC5zZXRTY3JpcHRCYXNlQ2xhc3MoIiIpOw0KKyAgICAgICAgaW5pdC5zZXRTb3VyY2VFbmNvZGluZygiR3V0ZW5iZXJnIik7DQorICAgICAgICBpbml0LnNldFRhcmdldEJ5dGVjb2RlKENvbXBpbGVyQ29uZmlndXJhdGlvbi5QUkVfSkRLNSk7DQorICAgICAgICBpbml0LnNldFJlY29tcGlsZUdyb292eVNvdXJjZShmYWxzZSk7DQorICAgICAgICBpbml0LnNldENsYXNzcGF0aCgiIik7DQorDQorICAgICAgICBmaW5hbCBQcmludFdyaXRlciBpbml0T3V0ID0gbmV3IFByaW50V3JpdGVyKFN5c3RlbS5vdXQpOw0KKyAgICAgICAgaW5pdC5zZXRPdXRwdXQoaW5pdE91dCk7DQorDQorICAgICAgICBmaW5hbCBGaWxlIGluaXRUREZpbGUgPSBuZXcgRmlsZSgiQSB3YW5kZXJpbmcgcGF0aCIpOw0KKyAgICAgICAgaW5pdC5zZXRUYXJnZXREaXJlY3RvcnkoaW5pdFRERmlsZSk7DQorDQorICAgICAgICBhc3NlcnRFcXVhbHMoV2FybmluZ01lc3NhZ2UuUE9TU0lCTEVfRVJST1JTLCBpbml0LmdldFdhcm5pbmdMZXZlbCgpKTsNCisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgaW5pdC5nZXREZWJ1ZygpKTsNCisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBpbml0LmdldFZlcmJvc2UoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoNTUsIGluaXQuZ2V0VG9sZXJhbmNlKCkpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDk3NSwgaW5pdC5nZXRNaW5pbXVtUmVjb21waWxhdGlvbkludGVydmFsKCkpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBpbml0LmdldFNjcmlwdEJhc2VDbGFzcygpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiR3V0ZW5iZXJnIiwgaW5pdC5nZXRTb3VyY2VFbmNvZGluZygpKTsNCisgICAgICAgIGFzc2VydEVxdWFscyhDb21waWxlckNvbmZpZ3VyYXRpb24uUFJFX0pESzUsIGluaXQuZ2V0VGFyZ2V0Qnl0ZWNvZGUoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGluaXQuZ2V0UmVjb21waWxlR3Jvb3Z5U291cmNlKCkpOw0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGZpbmFsIExpc3QgbGlzdENQID0gaW5pdC5nZXRDbGFzc3BhdGgoKTsNCisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGxpc3RDUCk7DQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGxpc3RDUC5zaXplKCkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKGluaXRPdXQsIGluaXQuZ2V0T3V0cHV0KCkpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKGluaXRUREZpbGUsIGluaXQuZ2V0VGFyZ2V0RGlyZWN0b3J5KCkpOw0KKw0KKyAgICAgICAgZmluYWwgQ29tcGlsZXJDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBDb21waWxlckNvbmZpZ3VyYXRpb24oaW5pdCk7DQorDQorICAgICAgICBhc3NlcnRFcXVhbHMoV2FybmluZ01lc3NhZ2UuUE9TU0lCTEVfRVJST1JTLCBjb25maWcuZ2V0V2FybmluZ0xldmVsKCkpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBjb25maWcuZ2V0RGVidWcoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgY29uZmlnLmdldFZlcmJvc2UoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoNTUsIGNvbmZpZy5nZXRUb2xlcmFuY2UoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoOTc1LCBjb25maWcuZ2V0TWluaW11bVJlY29tcGlsYXRpb25JbnRlcnZhbCgpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiIiwgY29uZmlnLmdldFNjcmlwdEJhc2VDbGFzcygpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiR3V0ZW5iZXJnIiwgY29uZmlnLmdldFNvdXJjZUVuY29kaW5nKCkpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKENvbXBpbGVyQ29uZmlndXJhdGlvbi5QUkVfSkRLNSwgY29uZmlnLmdldFRhcmdldEJ5dGVjb2RlKCkpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBjb25maWcuZ2V0UmVjb21waWxlR3Jvb3Z5U291cmNlKCkpOw0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGZpbmFsIExpc3QgbGlzdENQID0gY29uZmlnLmdldENsYXNzcGF0aCgpOw0KKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBsaXN0Q1Auc2l6ZSgpKTsNCisgICAgICAgIH0NCisgICAgICAgIGFzc2VydEVxdWFscyhpbml0T3V0LCBjb25maWcuZ2V0T3V0cHV0KCkpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKGluaXRUREZpbGUsIGNvbmZpZy5nZXRUYXJnZXREaXJlY3RvcnkoKSk7DQorICAgIH0NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY29udHJvbC9pby9OdWxsV3JpdGVyVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jb250cm9sL2lvL051bGxXcml0ZXJUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTE0MTljCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY29udHJvbC9pby9OdWxsV3JpdGVyVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwxNSBAQAorcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuaW8KKworY2xhc3MgTnVsbFdyaXRlclRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICB2b2lkIHRlc3RQcm9wZXJ0aWVzKCkgeworICAgICAgICBhc3NlcnQgTnVsbFdyaXRlci5ERUZBVUxUIGluc3RhbmNlb2YgTnVsbFdyaXRlcgorICAgIH0KKworICAgIHZvaWQgdGVzdFdyaXRlck1ldGhvZHNGb3JDb3ZlcmFnZSgpIHsKKyAgICAgICAgZGVmIHdyaXRlciA9IE51bGxXcml0ZXIuREVGQVVMVAorICAgICAgICB3cml0ZXIuY2xvc2UoKQorICAgICAgICB3cml0ZXIuZmx1c2goKQorICAgICAgICB3cml0ZXIud3JpdGUoKGNoYXJbXSludWxsLCAwLCAwKQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9jb250cm9sL2lvL1N0cmluZ1JlYWRlclNvdXJjZVRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY29udHJvbC9pby9TdHJpbmdSZWFkZXJTb3VyY2VUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2QxNDQyCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY29udHJvbC9pby9TdHJpbmdSZWFkZXJTb3VyY2VUZXN0Lmdyb292eQpAQCAtMCwwICsxLDEyIEBACitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5pbworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLkNvbXBpbGVyQ29uZmlndXJhdGlvbgorCitjbGFzcyBTdHJpbmdSZWFkZXJTb3VyY2VUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgdm9pZCB0ZXN0RmlsZVJlYWRlckNhbk5vdEJlUmVvcGVuZWQoKSB7CisgICAgICAgIGRlZiBkdW1teVN0cmluZyA9ICJyZXR1cm4gZmFsc2UiCisgICAgICAgIGRlZiB3cml0ZXIgPSBuZXcgU3RyaW5nUmVhZGVyU291cmNlKCBkdW1teVN0cmluZywgQ29tcGlsZXJDb25maWd1cmF0aW9uLkRFRkFVTFQgKQorICAgICAgICBhc3NlcnQgd3JpdGVyLmNhblJlb3BlblNvdXJjZSgpCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NvbnRyb2wvbWVzc2FnZXMvU3ludGF4RXJyb3JNZXNzYWdlVGVzdC5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvY29udHJvbC9tZXNzYWdlcy9TeW50YXhFcnJvck1lc3NhZ2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ3NDc3NAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2NvbnRyb2wvbWVzc2FnZXMvU3ludGF4RXJyb3JNZXNzYWdlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiAkSWQkCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBDb2RlaGF1cyAtIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbgorICogYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5tZXNzYWdlczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmNvbnRyb2wuU291cmNlVW5pdDsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5TeW50YXhFeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBTeW50YXhFcnJvck1lc3NhZ2VUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHVibGljIHZvaWQgdGVzdFNldHNUaGVTb3VyY2VMb2NhdG9yT2ZJdHNTeW50YXhFeGNlcHRpb25Bc1RoZU5hbWVPZlRoZUNvcnJlc3BvbmRpbmdTb3VyY2VVbml0V2hlbkluc3RhbnRpYXRlZCgpIHsKKyAgICAgICAgU3ludGF4RXhjZXB0aW9uIHN5bnRheEV4Y2VwdGlvbiA9IG5ldyBTeW50YXhFeGNlcHRpb24oc29tZVN0cmluZygpLCAtMSwgLTEpOworICAgICAgICBhc3NlcnRFcXVhbHMoInNvdXJjZSBsb2NhdG9yIiwgbnVsbCwgc3ludGF4RXhjZXB0aW9uLmdldFNvdXJjZUxvY2F0b3IoKSk7CisKKyAgICAgICAgU3RyaW5nIHNvdXJjZVVuaXROYW1lID0gc29tZVN0cmluZygpOworICAgICAgICBTb3VyY2VVbml0IHNvdXJjZVVuaXQgPSBTb3VyY2VVbml0LmNyZWF0ZShzb3VyY2VVbml0TmFtZSwgc29tZVN0cmluZygpKTsKKworICAgICAgICBuZXcgU3ludGF4RXJyb3JNZXNzYWdlKHN5bnRheEV4Y2VwdGlvbiwgc291cmNlVW5pdCk7CisgICAgICAgIGFzc2VydEVxdWFscygic291cmNlIGxvY2F0b3IiLCBzb3VyY2VVbml0TmFtZSwgc3ludGF4RXhjZXB0aW9uLmdldFNvdXJjZUxvY2F0b3IoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgc29tZVN0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKE1hdGgucmFuZG9tKCkgKiBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvZHVtbXkvQ2xhc3NXaXRoU3RhdGljTWV0aG9kLmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2R1bW15L0NsYXNzV2l0aFN0YXRpY01ldGhvZC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IyNGU2NgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2R1bW15L0NsYXNzV2l0aFN0YXRpY01ldGhvZC5ncm9vdnkKQEAgLTAsMCArMSw5IEBACitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuZHVtbXk7CisKKy8qKgorICogQ2xhc3MgdXNlZCBieSBncm9vdnkuYnVncy5TdGF0aWNNZXRob2RJbXBvcnRCdWcuCisgKiBCdWcgcmVmZXJlbmNlOiBFeHBsaWNpdCBpbXBvcnQgbmVlZGVkIHRvIGNhbGwgc3RhdGljIG1ldGhvZCwgR1JPT1ZZLTkzNQorICovCitjbGFzcyBDbGFzc1dpdGhTdGF0aWNNZXRob2QgeworICAgIHN0YXRpYyBib29sZWFuIHN0YXRpY01ldGhvZCgpIHsgcmV0dXJuIHRydWUgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2R1bW15L0Zvb0hhbmRsZXIuamF2YSBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L2R1bW15L0Zvb0hhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjQ3ZTM4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvZHVtbXkvRm9vSGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsMTEgQEAKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5kdW1teTsKKworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworCisvKioKKyAqIEBhdXRob3IgUm9iZXJ0IEZ1bGxlcgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgaW50ZXJmYWNlIEZvb0hhbmRsZXIgeworICAgIHZvaWQgaGFuZGxlKFJlYWRlciByZWFkZXIpOworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvcmVmbGVjdGlvbi9XZWFrTWFwVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9yZWZsZWN0aW9uL1dlYWtNYXBUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzA0ZjY1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvcmVmbGVjdGlvbi9XZWFrTWFwVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwzNCBAQAorcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJlZmxlY3Rpb24KKworY2xhc3MgV2Vha01hcFRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZXsKKyAgIHZvaWQgdGVzdENsYXNzVW5sb2FkICgpIHsKKyAgICAgICBHcm9vdnlTaGVsbCBzaGVsbCA9IG5ldyBHcm9vdnlTaGVsbCgpCisgICAgICAgaW50IFNJWkUgPSAxMDAKKyAgICAgICBmb3IgKGludCBpID0gMDsgaSAhPSBTSVpFOyArK2kpIHsKKyAgICAgICAgICAgT2JqZWN0IHMgPSBzaGVsbC5wYXJzZSAoIiIiCisgICAgICAgICAgICAgIGNsYXNzIEEgZXh0ZW5kcyBCIHsKKyAgICAgICAgICAgICAgICBkZWYgQiBjYWxsTWUgKGIpIHsKKyAgICAgICAgICAgICAgICAgIGIgaW5zdGFuY2VvZiBBID8gdGhpcyA6IGIKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBjbGFzcyBCIHsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIG5ldyBBICgpLmNhbGxNZSAoImxhbWJkYSIpCisgICAgICAgICAgICIiIikKKworICAgICAgICAgICBSZWZsZWN0aW9uQ2FjaGUuaXNBc3NpZ25hYmxlRnJvbSBzLmNsYXNzLCBzLmNsYXNzLnN1cGVyY2xhc3MKKyAgICAgICAgICAgaWYgKGkgJSAxMCA9PSAwKSB7CisgICAgICAgICAgICAgICBTeXN0ZW0uZ2MgKCkKKyAgICAgICAgICAgICBwcmludGxuICIke2l9ICR7UmVmbGVjdGlvbkNhY2hlLmFzc2lnbmFibGVNYXAuc2l6ZSgpfSAke1JlZmxlY3Rpb25DYWNoZS5DQUNIRURfQ0xBU1NfTUFQLnNpemUoKX0iCisgICAgICAgICAgIH0KKworICAgICAgICAgICBzaGVsbC5jbGFzc0xvYWRlci5jbGVhckNhY2hlKCkKKyAgICAgICAgICAgR3Jvb3Z5U3lzdGVtLm1ldGFDbGFzc1JlZ2lzdHJ5LnJlbW92ZU1ldGFDbGFzcyBzLmNsYXNzLnN1cGVyY2xhc3MKKyAgICAgICAgICAgR3Jvb3Z5U3lzdGVtLm1ldGFDbGFzc1JlZ2lzdHJ5LnJlbW92ZU1ldGFDbGFzcyBzLmNsYXNzCisgICAgICAgfQorCisgICAgICAgcHJpbnRsbiAiJHtTSVpFfSAke1JlZmxlY3Rpb25DYWNoZS5hc3NpZ25hYmxlTWFwLnNpemUoKX0gJHtSZWZsZWN0aW9uQ2FjaGUuQ0FDSEVEX0NMQVNTX01BUC5zaXplKCl9IgorICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvQ2F0ZWdvcnlGb3JJdGVyYXRvclRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9DYXRlZ29yeUZvckl0ZXJhdG9yVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk3NGNmNwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvQ2F0ZWdvcnlGb3JJdGVyYXRvclRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsNTggQEAKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lOworCisvKgorICogVGVzdCB3aGV0aGVyIHRoZSBJbnZva2VyIGluY2x1ZGVzIGNhdGVnb3JpZXMgd2hlbiAKKyAqIHRyeWluZyB0byBmaW5kIGFuIGl0ZXJhdG9yICh2aWEgdGhlIG1ldGhvZCBpdGVyYXRvcigpKQorICovIAorY2xhc3MgQ2F0ZWdvcnlGb3JJdGVyYXRvclRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKwlkZWYgaWRlbnRpdHkgPSB7IHZhbCAtPiB2YWwgfQorCWRlZiBjCisJZGVmIGNvdW50Q2FsbHMgPSB7IGMgPSBjICsgMSB9CisKKwl2b2lkIHNldFVwKCkgeworCQljID0gMAorCX0KKwkKKwkvKgorCSAqIEVuc3VyZSB0aGF0IHdpdGhvdXQgdGhlIGl0ZXJhdG9yIGNhdGVnb3J5IGEKKwkgKiBvbmUtZWxlbWVudCBjb2xsZWN0aW9uIGlzIHJldHVybmVkIHRoYXQKKwkgKiByZXN1bHRzIGluIG9uZSBjYWxsIHRvIHRoZSBjb3VudENhbGxzIGNsb3N1cmUKKwkgKi8KKwl2b2lkIHRlc3RXaXRob3V0SXRlcmF0b3JDYXRlZ29yeSgpIHsKKwkJaWRlbnRpdHkuZWFjaCBjb3VudENhbGxzCisJCWFzc2VydCBjID09IDEKKwl9CisJLyoKKwkgKiBXaGVuIHVzaW5nIHRoZSBJdGVyYXRvckNhdGVnb3J5IGJlbG93IHdlIGdldCBhbgorCSAqIGl0ZXJhdG9yIHRoYXQgZG9lcyBubyBpdGVyYXRpb24uIFNvIHRoZSBjb3VudAorCSAqIGhhcyB0byBiZSAwCisJICovCisJdm9pZCB0ZXN0V2l0aEl0ZXJhdG9yQ2F0ZWdvcnkoKSB7CisJCXVzZShJdGVyYXRvckNhdGVnb3J5KSB7CisJCQljID0gMAorCQkJaWRlbnRpdHkuZWFjaCBjb3VudENhbGxzCisJCQlhc3NlcnQgYyA9PSAwCisJCX0KKwl9Cit9CisKKy8qCisgKiBUaGUgY2F0ZWdvcnkgc2ltcGx5IGFkZHMgYW4gaXRlcmF0b3IoKS1tZXRob2QgcmV0dXJuaW5nCisgKiB0aGUgbnVsbCBpdGVyYXRvciBkZWZpbmVkIGJlbG93CisgKi8KK2NsYXNzIEl0ZXJhdG9yQ2F0ZWdvcnkgeworCXN0YXRpYyBJdGVyYXRvciBpdGVyYXRvcihDbG9zdXJlIGMpIHsgCisJCXJldHVybiBuZXcgVGVzdEl0ZXJhdG9yKCkKKwl9Cit9CisKKy8qCisgKiBUaGlzIGl0ZXJhdG9yIHJldHVybnMgMCBlbGVtZW50cywgYWxsb3dpbmcgdXMgdG8gZGlzdGluZ3Vpc2gKKyAqIGZyb20gdGhlIGRlZmF1bHQgY29sbGVjdGlvbi1pdGVyYXRvcgorICovCitjbGFzcyBUZXN0SXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvciB7CisgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsgcmV0dXJuIGZhbHNlIH0KKyAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7IHJldHVybiBudWxsIH0KKyAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7fQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9EZWZhdWx0R3Jvb3Z5TWV0aG9kc1Rlc3QuamF2YSBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvRGVmYXVsdEdyb292eU1ldGhvZHNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFlNzAxYwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvRGVmYXVsdEdyb292eU1ldGhvZHNUZXN0LmphdmEKQEAgLTAsMCArMSwxNzMgQEAKKy8qCisgJElkJAorCisgQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQKKyB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIGNvcHlyaWdodAorICAgIHN0YXRlbWVudHMgYW5kIG5vdGljZXMuICBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYQorICAgIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KKworIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUKKyAgICBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCisgICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCisgICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworIDMuIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCisgICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLAorICAgIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLgorCisgNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIKKyAgICBub3IgbWF5ICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYSByZWdpc3RlcmVkCisgICAgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KKworIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtCisgICAgaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTCisgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECisgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTAorIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAqLworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZTsKKworaW1wb3J0IGdyb292eS5sYW5nLkNsb3N1cmU7CitpbXBvcnQgZ3Jvb3Z5LnV0aWwuR3Jvb3Z5VGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQGF1dGhvciBNYXJjIEd1aWxsZW1vdAorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgRGVmYXVsdEdyb292eU1ldGhvZHNUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgcHVibGljIHZvaWQgdGVzdFByaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICBtYXAucHV0KCJib2IiLCAiZHJvb2xzIik7CisgICAgICAgIG1hcC5wdXQoImphbWVzIiwgImdlcm9uaW1vIik7CisgICAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgbGlzdC5hZGQobWFwKTsKKworICAgICAgICAvKiogQHRvZG8gZml4IHRoaXMhICovCisgICAgICAgIC8vYXNzZXJ0Q29uc29sZU91dHB1dChsaXN0LCAiW1snYm9iJzonZHJvb2xzJywgJ2phbWVzJzonZ2Vyb25pbW8nXV0iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5jcmVtZW50U3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBvcmlnaW5hbCA9ICJ6IjsKKyAgICAgICAgU3RyaW5nIGFuc3dlciA9IERlZmF1bHRHcm9vdnlNZXRob2RzLm5leHQob3JpZ2luYWwpOworCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihhbnN3ZXIpOworICAgICAgICBhc3NlcnRUcnVlKGFuc3dlci5jb21wYXJlVG8ob3JpZ2luYWwpID4gMCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERlY3JlbWVudFN0cmluZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgb3JpZ2luYWwgPSAiYSI7CisgICAgICAgIFN0cmluZyBhbnN3ZXIgPSBEZWZhdWx0R3Jvb3Z5TWV0aG9kcy5wcmV2aW91cyhvcmlnaW5hbCk7CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGFuc3dlcik7CisgICAgICAgIGFzc2VydFRydWUoU2NyaXB0Qnl0ZWNvZGVBZGFwdGVyLmNvbXBhcmVMZXNzVGhhbihhbnN3ZXIsIG9yaWdpbmFsKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFRvTWV0aG9kcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBOdW1iZXIgbiA9IG5ldyBMb25nKDcpOworCisgICAgICAgIGFzc2VydEVxdWFscyhEZWZhdWx0R3Jvb3Z5TWV0aG9kcy50b0ludGVnZXIoIjEiKSwgbmV3IEludGVnZXIoMSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoRGVmYXVsdEdyb292eU1ldGhvZHMudG9JbnRlZ2VyKG4pLCBuZXcgSW50ZWdlcig3KSk7CisgICAgICAgIGFzc2VydEVxdWFscyhEZWZhdWx0R3Jvb3Z5TWV0aG9kcy50b0xvbmcoIjEiKSwgbmV3IExvbmcoMSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoRGVmYXVsdEdyb292eU1ldGhvZHMudG9Mb25nKG4pLCBuZXcgTG9uZyg3KSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKERlZmF1bHRHcm9vdnlNZXRob2RzLnRvRmxvYXQoIjEiKSwgbmV3IEZsb2F0KDEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKERlZmF1bHRHcm9vdnlNZXRob2RzLnRvRmxvYXQobiksIG5ldyBGbG9hdCg3KSk7CisgICAgICAgIGFzc2VydEVxdWFscyhEZWZhdWx0R3Jvb3Z5TWV0aG9kcy50b0RvdWJsZSgiMSIpLCBuZXcgRG91YmxlKDEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKERlZmF1bHRHcm9vdnlNZXRob2RzLnRvRG91YmxlKG4pLCBuZXcgRG91YmxlKDcpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoRGVmYXVsdEdyb292eU1ldGhvZHMudG9CaWdJbnRlZ2VyKCIxIiksIG5ldyBCaWdJbnRlZ2VyKCIxIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoRGVmYXVsdEdyb292eU1ldGhvZHMudG9CaWdJbnRlZ2VyKG4pLCBuZXcgQmlnSW50ZWdlcigiNyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKERlZmF1bHRHcm9vdnlNZXRob2RzLnRvQmlnRGVjaW1hbCgiMSIpLCBuZXcgQmlnRGVjaW1hbCgiMSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKERlZmF1bHRHcm9vdnlNZXRob2RzLnRvQmlnRGVjaW1hbChuKSwgbmV3IEJpZ0RlY2ltYWwoIjciKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKERlZmF1bHRHcm9vdnlNZXRob2RzLnRvVVJMKCJodHRwOi8vZXhhbXBsZS5vcmcvIiksIG5ldyBVUkwoImh0dHA6Ly9leGFtcGxlLm9yZy8iKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhEZWZhdWx0R3Jvb3Z5TWV0aG9kcy50b1VSSSgiaHR0cDovL2V4YW1wbGUub3JnLyIpLCBuZXcgVVJJKCJodHRwOi8vZXhhbXBsZS5vcmcvIikpOworCisgICAgICAgIGFzc2VydEVxdWFscyhEZWZhdWx0R3Jvb3Z5TWV0aG9kcy50b0Jvb2xlYW4oIlRydWUiKSwgQm9vbGVhbi5UUlVFKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKERlZmF1bHRHcm9vdnlNZXRob2RzLnRvQm9vbGVhbigiWSIpLCBCb29sZWFuLlRSVUUpOworICAgICAgICBhc3NlcnRFcXVhbHMoRGVmYXVsdEdyb292eU1ldGhvZHMudG9Cb29sZWFuKCIgeSAiKSwgQm9vbGVhbi5UUlVFKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKERlZmF1bHRHcm9vdnlNZXRob2RzLnRvQm9vbGVhbigiMSIpLCBCb29sZWFuLlRSVUUpOworICAgICAgICBhc3NlcnRFcXVhbHMoRGVmYXVsdEdyb292eU1ldGhvZHMudG9Cb29sZWFuKCJmYWxzZSIpLCBCb29sZWFuLkZBTFNFKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKERlZmF1bHRHcm9vdnlNZXRob2RzLnRvQm9vbGVhbigibiIpLCBCb29sZWFuLkZBTFNFKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKERlZmF1bHRHcm9vdnlNZXRob2RzLnRvQm9vbGVhbigiMCIpLCBCb29sZWFuLkZBTFNFKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNNZXRob2RzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBpbnRTdHIgPSAiMTIzIjsKKyAgICAgICAgU3RyaW5nIGZsb2F0U3RyID0gIjEuMjNFLTEiOworICAgICAgICBTdHJpbmcgbm9uTnVtYmVyU3RyID0gIk9ORSI7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShEZWZhdWx0R3Jvb3Z5TWV0aG9kcy5pc0ludGVnZXIoaW50U3RyKSk7CisgICAgICAgIGFzc2VydEZhbHNlKERlZmF1bHRHcm9vdnlNZXRob2RzLmlzSW50ZWdlcihmbG9hdFN0cikpOworICAgICAgICBhc3NlcnRGYWxzZShEZWZhdWx0R3Jvb3Z5TWV0aG9kcy5pc0ludGVnZXIobm9uTnVtYmVyU3RyKSk7CisgICAgICAgIGFzc2VydFRydWUoRGVmYXVsdEdyb292eU1ldGhvZHMuaXNMb25nKGludFN0cikpOworICAgICAgICBhc3NlcnRGYWxzZShEZWZhdWx0R3Jvb3Z5TWV0aG9kcy5pc0xvbmcoZmxvYXRTdHIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoRGVmYXVsdEdyb292eU1ldGhvZHMuaXNMb25nKG5vbk51bWJlclN0cikpOworCisgICAgICAgIGFzc2VydFRydWUoRGVmYXVsdEdyb292eU1ldGhvZHMuaXNGbG9hdChpbnRTdHIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShEZWZhdWx0R3Jvb3Z5TWV0aG9kcy5pc0Zsb2F0KGZsb2F0U3RyKSk7CisgICAgICAgIGFzc2VydEZhbHNlKERlZmF1bHRHcm9vdnlNZXRob2RzLmlzRmxvYXQobm9uTnVtYmVyU3RyKSk7CisgICAgICAgIGFzc2VydFRydWUoRGVmYXVsdEdyb292eU1ldGhvZHMuaXNEb3VibGUoaW50U3RyKSk7CisgICAgICAgIGFzc2VydFRydWUoRGVmYXVsdEdyb292eU1ldGhvZHMuaXNEb3VibGUoZmxvYXRTdHIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoRGVmYXVsdEdyb292eU1ldGhvZHMuaXNEb3VibGUobm9uTnVtYmVyU3RyKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShEZWZhdWx0R3Jvb3Z5TWV0aG9kcy5pc0JpZ0ludGVnZXIoaW50U3RyKSk7CisgICAgICAgIGFzc2VydEZhbHNlKERlZmF1bHRHcm9vdnlNZXRob2RzLmlzQmlnSW50ZWdlcihmbG9hdFN0cikpOworICAgICAgICBhc3NlcnRGYWxzZShEZWZhdWx0R3Jvb3Z5TWV0aG9kcy5pc0JpZ0ludGVnZXIobm9uTnVtYmVyU3RyKSk7CisgICAgICAgIGFzc2VydFRydWUoRGVmYXVsdEdyb292eU1ldGhvZHMuaXNCaWdEZWNpbWFsKGludFN0cikpOworICAgICAgICBhc3NlcnRUcnVlKERlZmF1bHRHcm9vdnlNZXRob2RzLmlzQmlnRGVjaW1hbChmbG9hdFN0cikpOworICAgICAgICBhc3NlcnRGYWxzZShEZWZhdWx0R3Jvb3Z5TWV0aG9kcy5pc0JpZ0RlY2ltYWwobm9uTnVtYmVyU3RyKSk7CisgICAgICAgIGFzc2VydFRydWUoRGVmYXVsdEdyb292eU1ldGhvZHMuaXNOdW1iZXIoaW50U3RyKSk7CisgICAgICAgIGFzc2VydFRydWUoRGVmYXVsdEdyb292eU1ldGhvZHMuaXNOdW1iZXIoZmxvYXRTdHIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoRGVmYXVsdEdyb292eU1ldGhvZHMuaXNOdW1iZXIobm9uTnVtYmVyU3RyKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG93bnRvKCkgeworICAgICAgICBmaW5hbCBpbnRbXSBjb3VudCA9IG5ldyBpbnRbXXswfTsKKyAgICAgICAgZmluYWwgQ2xvc3VyZSBjbG9zdXJlID0gbmV3IENsb3N1cmUobnVsbCkgeworICAgICAgICAgICAgcHVibGljIE9iamVjdCBkb0NhbGwoZmluYWwgT2JqZWN0IHBhcmFtcykgeworICAgICAgICAgICAgICAgIGNvdW50WzBdKys7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgRGVmYXVsdEdyb292eU1ldGhvZHMuZG93bnRvKG5ldyBCaWdJbnRlZ2VyKCIxIiksIG5ldyBCaWdEZWNpbWFsKCIwIiksIGNsb3N1cmUpOworICAgICAgICBhc3NlcnRFcXVhbHMoY291bnRbMF0sIDIpOworCisgICAgICAgIGNvdW50WzBdID0gMDsKKworICAgICAgICBEZWZhdWx0R3Jvb3Z5TWV0aG9kcy5kb3dudG8obmV3IEJpZ0ludGVnZXIoIjEiKSwgbmV3IEJpZ0RlY2ltYWwoIjAuMTIzIiksIGNsb3N1cmUpOworICAgICAgICBhc3NlcnRFcXVhbHMoY291bnRbMF0sIDEpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvRHVtbXlCZWFuLmphdmEgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL0R1bW15QmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5Njg1NDgKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL0R1bW15QmVhbi5qYXZhCkBAIC0wLDAgKzEsMTM3IEBACisvKgorICRJZCQKKworIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCisgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQKKyAgICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKKyAgICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCisgICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQorICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgorICAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKKyAgICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KKworIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCisgICAgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAorICAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCisKKyA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQorICAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLworCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUworIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAorIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKKyBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgKi8KKworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWU7CisKK2ltcG9ydCBqYXZhLmF3dC4qOworaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKK2ltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlU3VwcG9ydDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIEEgYmVhbiB1c2VkIGJ5IHRoZSB0ZXN0IGNhc2VzCisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnNoZW1ub25AeWFob28uY29tIj5EYW5ubyBGZXJyaW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBEdW1teUJlYW4geworICAgIHByaXZhdGUgU3RyaW5nIG5hbWUgPSAiSmFtZXMiOworICAgIHByaXZhdGUgSW50ZWdlciBpID0gbmV3IEludGVnZXIoMTIzKTsKKyAgICBwcml2YXRlIE1hcCBkeW5hbWljUHJvcGVydGllcyA9IG5ldyBIYXNoTWFwKCk7CisgICAgcHJpdmF0ZSBQb2ludCBwb2ludDsKKyAgICBwcml2YXRlIFByb3BlcnR5Q2hhbmdlU3VwcG9ydCBjaGFuZ2VTdXBwb3J0ID0gbmV3IFByb3BlcnR5Q2hhbmdlU3VwcG9ydCh0aGlzKTsKKworICAgIHB1YmxpYyBEdW1teUJlYW4oKSB7CisgICAgfQorCisgICAgcHVibGljIER1bW15QmVhbihTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBEdW1teUJlYW4oU3RyaW5nIG5hbWUsIEludGVnZXIgaSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB0aGlzLmkgPSBpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBjaGFuZ2VTdXBwb3J0LmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOworICAgIH0KKworICAgIHB1YmxpYyBJbnRlZ2VyIGdldEkoKSB7CisgICAgICAgIHJldHVybiBpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEkoSW50ZWdlciBpKSB7CisgICAgICAgIGNoYW5nZVN1cHBvcnQuZmlyZVByb3BlcnR5Q2hhbmdlKCJpIiwgdGhpcy5pLCB0aGlzLmkgPSBpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgY2hhbmdlU3VwcG9ydC5maXJlUHJvcGVydHlDaGFuZ2UoIm5hbWUiLCB0aGlzLm5hbWUsIHRoaXMubmFtZSA9IG5hbWUpOworICAgIH0KKworICAgIC8vIGR5bmFtaWMgcHJvcGVydGllcworICAgIHB1YmxpYyBPYmplY3QgZ2V0KFN0cmluZyBwcm9wZXJ0eSkgeworICAgICAgICByZXR1cm4gZHluYW1pY1Byb3BlcnRpZXMuZ2V0KHByb3BlcnR5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXQoU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgbmV3VmFsdWUpIHsKKyAgICAgICAgZHluYW1pY1Byb3BlcnRpZXMucHV0KHByb3BlcnR5LCBuZXdWYWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZHVtbXlTdGF0aWNNZXRob2QoU3RyaW5nIHRleHQpIHsKKyAgICAgICAgcmV0dXJuIHRleHQudG9VcHBlckNhc2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHRoYXQpIHsKKyAgICAgICAgaWYgKHRoYXQgaW5zdGFuY2VvZiBEdW1teUJlYW4pIHsKKyAgICAgICAgICAgIHJldHVybiBlcXVhbHMoKER1bW15QmVhbikgdGhhdCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhEdW1teUJlYW4gdGhhdCkgeworICAgICAgICByZXR1cm4gdGhpcy5uYW1lLmVxdWFscyh0aGF0Lm5hbWUpICYmIHRoaXMuaS5lcXVhbHModGhhdC5pKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gc3VwZXIudG9TdHJpbmcoKSArICJbbmFtZT0iICsgbmFtZSArICI7aT0iICsgaSArICJdIjsKKyAgICB9CisKKyAgICBwdWJsaWMgUG9pbnQgZ2V0UG9pbnQoKSB7CisgICAgICAgIHJldHVybiBwb2ludDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQb2ludChQb2ludCBwb2ludCkgeworICAgICAgICBjaGFuZ2VTdXBwb3J0LmZpcmVQcm9wZXJ0eUNoYW5nZSgicG9pbnQiLCB0aGlzLnBvaW50LCB0aGlzLnBvaW50ID0gcG9pbnQpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9FYWNoV2l0aFJlYWRlckFuZElucHV0U3RyZWFtVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL0VhY2hXaXRoUmVhZGVyQW5kSW5wdXRTdHJlYW1UZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWJjMTU5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9FYWNoV2l0aFJlYWRlckFuZElucHV0U3RyZWFtVGVzdC5ncm9vdnkKQEAgLTAsMCArMSw3NiBAQAorcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUKKworaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyCitpbXBvcnQgamF2YS5pby5TdHJpbmdCdWZmZXJJbnB1dFN0cmVhbQorCisvKiogCisgKiBUZXN0IC5lYWNoIHdpdGggUmVhZGVyIGFuZCBJbnB1dFN0cmVhbQorICogCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqb2FjaGltLmJhdW1hbm5AeGluYXJpcy5kZSI+Sm9hY2hpbSBCYXVtYW5uPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uOiAkCisgKi8KK2NsYXNzIEVhY2hXaXRoUmVhZGVyQW5kSW5wdXRTdHJlYW1UZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCS8qKgorCSAqIFRoZSBmb2xsb3dpbmcgaW5zdGFuY2VzIGFyZSB1c2VkIGluIHRlc3RpbmcgdGhlIGZpbGUgb3BlcmF0aW9ucworCSAqLworCisJU3RyaW5nIG11bHRpTGluZVZhbCA9ICIiIgorVGhpcyB0ZXh0CithcyBjYW4gYmUgc2VlbgoraGFzIG11bHRpcGxlIGxpbmVzCithbmQgbm90IG9uZSBwdW5jdHVhdGlvbiBtYXJrCisiIiIKKworCS8vIE91ciBmaWxlIGluc3RhbmNlCisJZGVmIEZpbGUgZmlsZTsKKwkKKwl2b2lkIHNldFVwRmlsZSgpIHsKKwkJLy8gU2V0dXAgZ3VhcmFudGVlcyB1cyB0aGF0IHdlIHVzZSBhIG5vbi1leGlzdGVudCBmaWxlCisJCWZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJ1bml0VGVzdCIsICIudHh0IikgCisJCWFzc2VydCBmaWxlLmV4aXN0cygpID09IHRydWUKKwkJLy9wcmludGxuIGZpbGUuY2Fub25pY2FsUGF0aAorCQlhc3NlcnQgZmlsZS5sZW5ndGgoKSA9PSAwTAorCQlmaWxlIDw8IG11bHRpTGluZVZhbAorCX0KKwl2b2lkIHRlYXJEb3duRmlsZSgpIHsKKwkJLy8gd2UgcmVtb3ZlIG91ciB0ZW1wb3JhcnkgZmlsZQorCQlkZWYgZGVsZXRlZCA9IGZhbHNlCisJCXdoaWxlKGRlbGV0ZWQgPT0gZmFsc2UpCisJCQlkZWxldGVkID0gZmlsZS5kZWxldGUoKQorCQlhc3NlcnQgZmlsZS5leGlzdHMoKSA9PSBmYWxzZQorCX0KKworCXZvaWQgdGVzdEVhY2hGb3JTdHJpbmdCdWZmZXJJbnB1dFN0cmVhbSgpeworCQlkZWYgaXN0ID0gbmV3IFN0cmluZ0J1ZmZlcklucHV0U3RyZWFtKG11bHRpTGluZVZhbCkKKwkJZGVmIHJlYWRWYWwgPSAiIgorCQlpc3QuZWFjaCB7IHJlYWRWYWwgKz0gKGNoYXIpaXQgfQorCQlhc3NlcnQgcmVhZFZhbCA9PSBtdWx0aUxpbmVWYWwKKwl9CisJIAkJCisJdm9pZCB0ZXN0RWFjaEZvclN0cmluZ1JlYWRlcigpeworCQlkZWYgaXIgPSBuZXcgU3RyaW5nUmVhZGVyKG11bHRpTGluZVZhbCkKKwkJZGVmIHJlYWRWYWwgPSAiIgorCQlpci5lYWNoIHsgcmVhZFZhbCArPSBpdCArICJcbiIgfQorCQlhc3NlcnQgcmVhZFZhbCA9PSBtdWx0aUxpbmVWYWwKKwl9CisKKwl2b2lkIHRlc3RFYWNoRm9yRmlsZVdpdGhJbnB1dFN0cmVhbSgpIHsKKwkJc2V0VXBGaWxlKCkKKwkJZGVmIHJlYWRWYWwgPSAiIgorCQlmaWxlLndpdGhJbnB1dFN0cmVhbXsgaXMgLT4KKwkJCWlzLmVhY2ggeyByZWFkVmFsICs9IChjaGFyKWl0IH0KKwkJfQorCQl0ZWFyRG93bkZpbGUoKQorCQlhc3NlcnQgcmVhZFZhbCA9PSBtdWx0aUxpbmVWYWwKKwl9CisKKwl2b2lkIHRlc3RFYWNoRm9yRmlsZVdpdGhSZWFkZXIoKSB7CisJCXNldFVwRmlsZSgpCisJCWRlZiByZWFkVmFsID0gIiIKKwkJZmlsZS53aXRoUmVhZGVyeyByZWFkZXIgLT4KKwkJCXJlYWRlci5lYWNoIHsgcmVhZFZhbCArPSBpdCArICJcbiIgfQorCQl9CisJCXRlYXJEb3duRmlsZSgpCisJCWFzc2VydCByZWFkVmFsID09IG11bHRpTGluZVZhbAorCX0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvRmlsZUFwcGVuZFRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9GaWxlQXBwZW5kVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUzMjE0ZAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvRmlsZUFwcGVuZFRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMjE4IEBACitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZQoraW1wb3J0IGphdmEuaW8uUmVhZGVyCisKKy8qKiAKKyAqIFRlc3QgRmlsZSBhcHBlbmQgYW5kIGxlZnQgc2hpZnQgbWV0aG9kcyBpbiBHcm9vdnkKKyAqIAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86am9hY2hpbS5iYXVtYW5uQHhpbmFyaXMuZGUiPkpvYWNoaW0gQmF1bWFubjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworY2xhc3MgRmlsZUFwcGVuZFRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisJLyoqCisJICogVGhlIGZvbGxvd2luZyBpbnN0YW5jZXMgYXJlIHVzZWQgaW4gdGVzdGluZyB0aGUgZmlsZSB3cml0ZXMKKwkgKi8KKwlzdGF0aWMgdGV4dCA9ICIiIgorCQkJPGdyb292eT4KKwkJCSAgPHRoaW5ncz4KKwkJCSAgICA8dGhpbmc+SmVsbHkgQmVhbnM8L3RoaW5nPgorCQkJICA8L3RoaW5ncz4KKwkJCSAgPG11c2ljPgorCQkJICAgIDx0dW5lPlRoZSA1OXRoIFN0cmVldCBCcmlkZ2UgU29uZzwvdHVuZT4KKwkJCSAgPC9tdXNpYz4KKwkJCSAgPGNoYXJhY3RlcnM+CisJCQkgICAgPGNoYXJhY3RlciBuYW1lPSJBdXN0aW4gUG93ZXJzIj4KKwkJCSAgICAgICA8ZW5lbXk+RHIuIEV2aWw8L2VuZW15PgorCQkJICAgICAgIDxlbmVteT5NaW5pIE1lPC9lbmVteT4KKwkJCSAgICA8L2NoYXJhY3Rlcj4KKwkJCSAgPC9jaGFyYWN0ZXJzPgorCQkJPC9ncm9vdnk+CisJCQkiIiIKKwlzdGF0aWMgZ1BhdGhSZXN1bHQgPSBuZXcgWG1sU2x1cnBlcigpLnBhcnNlVGV4dCh0ZXh0KQorCXN0YXRpYyBnUGF0aFdyaXRlVG87CisJeworCQlTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCkKKwkJZ1BhdGhSZXN1bHQud3JpdGVUbyhzdykKKwkJZ1BhdGhXcml0ZVRvID0gc3cudG9TdHJpbmcoKQorCX0KKwkKKwkvLyBzZWUgYmVsb3cgZm9yIGNsYXNzIGRlZmluaXRpb24KKwlkZWYgdGVzdEluc3RhbmNlID0gbmV3IFRlc3RDbGFzcygpCisKKwkvLyBPdXIgZmlsZSBpbnN0YW5jZQorCWRlZiBGaWxlIGZpbGU7CisJCisJdm9pZCBzZXRVcCgpIHsKKwkJLy8gU2V0dXAgZ3VhcmFudGVlcyB1cyB0aGF0IHdlIHVzZSBhIG5vbi1leGlzdGVudCBmaWxlCisJCWZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJ1bml0VGVzdCIsICIudHh0IikgCisJCWFzc2VydCBmaWxlLmV4aXN0cygpID09IHRydWUKKwkJLy9wcmludGxuIGZpbGUuY2Fub25pY2FsUGF0aAorCQlhc3NlcnQgZmlsZS5sZW5ndGgoKSA9PSAwTAorCX0KKwl2b2lkIHRlYXJEb3duKCkgeworCQkvLyB3ZSByZW1vdmUgb3VyIHRlbXBvcmFyeSBmaWxlCisJCWZpbGUuZGVsZXRlT25FeGl0KCkKKwl9CisKKwl2b2lkIHRlc3RBcHBlbmRTdHJpbmcoKXsKKwkJZGVmIGV4cGVjdGVkCisJCQorCQkvLyB0ZXN0IG5ldworCQlmaWxlLmFwcGVuZCh0ZXh0KQorCQlleHBlY3RlZCA9IHRleHQKKwkJYXNzZXJ0IGhhc0NvbnRlbnRzKGZpbGUsIGV4cGVjdGVkKQorCQkKKwkJLy8gdGVzdCBleGlzdGluZworCQlmaWxlLmFwcGVuZCh0ZXh0KQorCQlleHBlY3RlZCArPSB0ZXh0CisJCWFzc2VydCBoYXNDb250ZW50cyhmaWxlLCBleHBlY3RlZCkKKwl9CisJIAkJCisJdm9pZCB0ZXN0QXBwZW5kT2JqZWN0VG9TdHJpbmcoKXsKKwkJZGVmIGV4cGVjdGVkCisJCQorCQkvLyB0ZXN0IG5ldworCQlmaWxlLmFwcGVuZCh0ZXN0SW5zdGFuY2UpCisJCWV4cGVjdGVkID0gdGVzdEluc3RhbmNlLnRvU3RyaW5nKCkKKwkJYXNzZXJ0IGhhc0NvbnRlbnRzKGZpbGUsIGV4cGVjdGVkKQorCQkKKwkJLy8gdGVzdCBleGlzdGluZworCQlmaWxlLmFwcGVuZCh0ZXN0SW5zdGFuY2UpCisJCWV4cGVjdGVkICs9IHRlc3RJbnN0YW5jZS50b1N0cmluZygpCisJCWFzc2VydCBoYXNDb250ZW50cyhmaWxlLCBleHBlY3RlZCkKKwl9CisKKwl2b2lkIHRlc3RhcHBlbmRXcml0YWJsZSgpeworCQlkZWYgZXhwZWN0ZWQKKwkJCisJCS8vIHRlc3QgbmV3CisJCWZpbGUuYXBwZW5kKGdQYXRoUmVzdWx0KQorCQlleHBlY3RlZCA9IGdQYXRoV3JpdGVUbworCQlhc3NlcnQgaGFzQ29udGVudHMoZmlsZSwgZXhwZWN0ZWQpCisJCQorCQkvLyB0ZXN0IGV4aXN0aW5nCisJCWZpbGUuYXBwZW5kKGdQYXRoUmVzdWx0KQorCQlleHBlY3RlZCArPSBnUGF0aFdyaXRlVG8KKwkJYXNzZXJ0IGhhc0NvbnRlbnRzKGZpbGUsIGV4cGVjdGVkKQorCX0KKworCXZvaWQgdGVzdGFwcGVuZE1peGVkKCl7CisJCWRlZiBleHBlY3RlZAorCQkKKwkJLy8gdGVzdCBuZXcKKwkJZmlsZS5hcHBlbmQodGV4dCkKKwkJZXhwZWN0ZWQgPSB0ZXh0CisJCWFzc2VydCBoYXNDb250ZW50cyhmaWxlLCBleHBlY3RlZCkKKwkJCisJCWZpbGUuYXBwZW5kKHRlc3RJbnN0YW5jZSkKKwkJZXhwZWN0ZWQgKz0gdGVzdEluc3RhbmNlLnRvU3RyaW5nKCkKKwkJYXNzZXJ0IGhhc0NvbnRlbnRzKGZpbGUsIGV4cGVjdGVkKQorCQkKKwkJZmlsZS5hcHBlbmQoZ1BhdGhSZXN1bHQpCisJCWV4cGVjdGVkICs9IGdQYXRoV3JpdGVUbworCQlhc3NlcnQgaGFzQ29udGVudHMoZmlsZSwgZXhwZWN0ZWQpCisJCQorCQkvLyB0ZXN0IGV4aXN0aW5nCisJCWZpbGUuYXBwZW5kKGdQYXRoUmVzdWx0KQorCQlleHBlY3RlZCArPSBnUGF0aFdyaXRlVG8KKwkJYXNzZXJ0IGhhc0NvbnRlbnRzKGZpbGUsIGV4cGVjdGVkKQorCisJCWZpbGUuYXBwZW5kKHRlc3RJbnN0YW5jZSkKKwkJZXhwZWN0ZWQgKz0gdGVzdEluc3RhbmNlLnRvU3RyaW5nKCkKKwkJYXNzZXJ0IGhhc0NvbnRlbnRzKGZpbGUsIGV4cGVjdGVkKQorCisJCWZpbGUuYXBwZW5kKHRleHQpCisJCWV4cGVjdGVkICs9IHRleHQKKwkJYXNzZXJ0IGhhc0NvbnRlbnRzKGZpbGUsIGV4cGVjdGVkKQorCX0KKworCXZvaWQgdGVzdExlZnRTaGlmdFN0cmluZygpeworCQlkZWYgZXhwZWN0ZWQKKwkJCisJCS8vIHRlc3QgbmV3CisJCWZpbGUgPDwgdGV4dAorCQlleHBlY3RlZCA9IHRleHQKKwkJYXNzZXJ0IGhhc0NvbnRlbnRzKGZpbGUsIGV4cGVjdGVkKQorCQkKKwkJLy8gdGVzdCBleGlzdGluZworCQlmaWxlIDw8IHRleHQKKwkJZXhwZWN0ZWQgKz0gdGV4dAorCQlhc3NlcnQgaGFzQ29udGVudHMoZmlsZSwgZXhwZWN0ZWQpCisJfQorCQkJCisJdm9pZCB0ZXN0TGVmdFNoaWZ0T2JqZWN0VG9TdHJpbmcoKXsKKwkJZGVmIGV4cGVjdGVkCisJCQorCQkvLyB0ZXN0IG5ldworCQlmaWxlIDw8IHRlc3RJbnN0YW5jZQorCQlleHBlY3RlZCA9IHRlc3RJbnN0YW5jZS50b1N0cmluZygpCisJCWFzc2VydCBoYXNDb250ZW50cyhmaWxlLCBleHBlY3RlZCkKKwkJCisJCS8vIHRlc3QgZXhpc3RpbmcKKwkJZmlsZSA8PCB0ZXN0SW5zdGFuY2UKKwkJZXhwZWN0ZWQgKz0gdGVzdEluc3RhbmNlLnRvU3RyaW5nKCkKKwkJYXNzZXJ0IGhhc0NvbnRlbnRzKGZpbGUsIGV4cGVjdGVkKQorCX0KKworCXZvaWQgdGVzdExlZnRTaGlmdFdyaXRhYmxlKCl7CisJCWRlZiBleHBlY3RlZAorCQkKKwkJLy8gdGVzdCBuZXcKKwkJZmlsZSA8PCBnUGF0aFJlc3VsdAorCQlleHBlY3RlZCA9IGdQYXRoV3JpdGVUbworCQlhc3NlcnQgaGFzQ29udGVudHMoZmlsZSwgZXhwZWN0ZWQpCisJCQorCQkvLyB0ZXN0IGV4aXN0aW5nCisJCWZpbGUgPDwgZ1BhdGhSZXN1bHQKKwkJZXhwZWN0ZWQgKz0gZ1BhdGhXcml0ZVRvCisJCWFzc2VydCBoYXNDb250ZW50cyhmaWxlLCBleHBlY3RlZCkKKwl9CQkgCisKKwl2b2lkIHRlc3RMZWZ0U2hpZnRNaXhlZCgpeworCQlkZWYgZXhwZWN0ZWQKKwkJCisJCS8vIHRlc3QgbmV3CisJCWZpbGUgPDwgdGV4dAorCQlleHBlY3RlZCA9IHRleHQKKwkJYXNzZXJ0IGhhc0NvbnRlbnRzKGZpbGUsIGV4cGVjdGVkKQorCQkKKwkJZmlsZSA8PCB0ZXN0SW5zdGFuY2UKKwkJZXhwZWN0ZWQgKz0gdGVzdEluc3RhbmNlLnRvU3RyaW5nKCkKKwkJYXNzZXJ0IGhhc0NvbnRlbnRzKGZpbGUsIGV4cGVjdGVkKQorCQkKKwkJZmlsZSA8PCBnUGF0aFJlc3VsdAorCQlleHBlY3RlZCArPSBnUGF0aFdyaXRlVG8KKwkJYXNzZXJ0IGhhc0NvbnRlbnRzKGZpbGUsIGV4cGVjdGVkKQorCQkKKwkJLy8gdGVzdCBleGlzdGluZworCQlmaWxlIDw8IGdQYXRoUmVzdWx0CisJCWV4cGVjdGVkICs9IGdQYXRoV3JpdGVUbworCQlhc3NlcnQgaGFzQ29udGVudHMoZmlsZSwgZXhwZWN0ZWQpCisKKwkJZmlsZSA8PCB0ZXN0SW5zdGFuY2UKKwkJZXhwZWN0ZWQgKz0gdGVzdEluc3RhbmNlLnRvU3RyaW5nKCkKKwkJYXNzZXJ0IGhhc0NvbnRlbnRzKGZpbGUsIGV4cGVjdGVkKQorCisJCWZpbGUgPDwgdGV4dAorCQlleHBlY3RlZCArPSB0ZXh0CisJCWFzc2VydCBoYXNDb250ZW50cyhmaWxlLCBleHBlY3RlZCkKKwl9CisKKwlib29sZWFuIGhhc0NvbnRlbnRzKEZpbGUgZiwgU3RyaW5nIGV4cGVjdGVkKQorCXsKKwkJYXNzZXJ0IGZpbGUubGVuZ3RoKCkgPT0gZXhwZWN0ZWQubGVuZ3RoKCkKKwkJLy8gcmVhZCBjb250ZW50cyB0aGUgSmF2YSB3YXkKKwkJY2hhcltdIGNidWYgPSBuZXcgY2hhcltleHBlY3RlZC5sZW5ndGgoKV07CisJCWRlZiBmaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoZmlsZSkKKwkJZmlsZVJlYWRlci5yZWFkKGNidWYpCisJCXJldHVybiBleHBlY3RlZCA9PSBTdHJpbmcudmFsdWVPZihjYnVmKQorCX0KK30KKworY2xhc3MgVGVzdENsYXNzIHsKKwlkZWYgdGVzdFN0cmluZyA9ICJUZXN0VGhpcyIKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlzdXBlci50b1N0cmluZygpICsgIjogIiArIHRlc3RTdHJpbmcKKwl9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL0ZpbGVMZWZ0U2hpZnRUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvRmlsZUxlZnRTaGlmdFRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNmRiMDEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL0ZpbGVMZWZ0U2hpZnRUZXN0Lmdyb292eQpAQCAtMCwwICsxLDEwIEBACitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZQorCitjbGFzcyBGaWxlTGVmdFNoaWZ0VGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKyAgICB2b2lkIHRlc3RGaWxlTGVmdFNoaWZ0KCkgeworICAgICAgICBuZXcgRmlsZSgidGFyZ2V0L3Rlc3QtY2xhc3Nlcy9NeUZpbGVMZWZ0U2hpZnRUZXN0LnR4dCIpLmRlbGV0ZSgpCisgICAgICAgIG5ldyBGaWxlKCJ0YXJnZXQvdGVzdC1jbGFzc2VzL015RmlsZUxlZnRTaGlmdFRlc3QudHh0IikgPDwgIlRoaXMgaXMgIiA8PCAiZ3Jvb3Z5IgorICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEZpbGUoInRhcmdldC90ZXN0LWNsYXNzZXMvTXlGaWxlTGVmdFNoaWZ0VGVzdC50eHQiKS50ZXh0LCAiVGhpcyBpcyBncm9vdnkiKQorICAgICAgICBuZXcgRmlsZSgidGFyZ2V0L3Rlc3QtY2xhc3Nlcy9NeUZpbGVMZWZ0U2hpZnRUZXN0LnR4dCIpLmRlbGV0ZSgpCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9Hcm9vdnlDYXRlZ29yeVRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9Hcm9vdnlDYXRlZ29yeVRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ZDk0MzYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL0dyb292eUNhdGVnb3J5VGVzdC5ncm9vdnkKQEAgLTAsMCArMSw0NCBAQAorcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUKKworY2xhc3MgR3Jvb3Z5Q2F0ZWdvcnlUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworICAgIHZvaWQgdGVzdFVzZVdpdGhWYXJBcmcoKSB7CisgICAgICAgIC8vIFRyeSBvdXQgdGhlIHNpbmdsZSBjbGFzcyBjYXNlCisgICAgICAgIHVzZShDYXRlZ29yeTEpIHsKKyAgICAgICAgICAgIGFzc2VydCAiSGVMbE8iLnVwcGVyKCkgPT0gIkhFTExPIgorICAgICAgICB9CisKKyAgICAgICAgLy8gVHJ5IG91dCB0aGUgbGlzdCBjYXNlCisgICAgICAgIHVzZShbQ2F0ZWdvcnkxLCBDYXRlZ29yeTJdKSB7CisgICAgICAgICAgICBhc3NlcnQgIkhlTGxPIi51cHBlcigpID09ICJIRUxMTyIKKyAgICAgICAgICAgIGFzc2VydCAiSGVMbE8iLmxvd2VyKCkgPT0gImhlbGxvIgorICAgICAgICB9CisKKyAgICAgICAgLy8gVHJ5IG91dCB0aGUgdmFyYXJnIHZlcnNpb24KKyAgICAgICAgdXNlKENhdGVnb3J5MSwgQ2F0ZWdvcnkyKSB7CisgICAgICAgICAgICBhc3NlcnQgIkhlTGxPIi51cHBlcigpID09ICJIRUxMTyIKKyAgICAgICAgICAgIGFzc2VydCAiSGVMbE8iLmxvd2VyKCkgPT0gImhlbGxvIgorICAgICAgICB9CisKKyAgICAgICAgLy8gVGhpcyBzaG91bGQgZmFpbAorICAgICAgICB0cnkgeworICAgICAgICAgICAgdXNlKENhdGVnb3J5MSkKKyAgICAgICAgICAgIGZhaWwoKQorICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICB9CisKKyAgICAgICAgLy8gQW5kIHNvIHNob3VsZCB0aGlzCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB1c2UoQ2F0ZWdvcnkxLCBDYXRlZ29yeTIpCisgICAgICAgICAgICBmYWlsKCkKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgIH0KK30KKworY2xhc3MgQ2F0ZWdvcnkxIHsKKyAgICBzdGF0aWMgU3RyaW5nIHVwcGVyKFN0cmluZyBtZXNzYWdlKSB7cmV0dXJuIG1lc3NhZ2UudG9VcHBlckNhc2UoKX0KK30KKworY2xhc3MgQ2F0ZWdvcnkyIHsKKyAgICBzdGF0aWMgU3RyaW5nIGxvd2VyKFN0cmluZyBtZXNzYWdlKSB7cmV0dXJuIG1lc3NhZ2UudG9Mb3dlckNhc2UoKX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL0luaGVyaXRlZEludGVyZmFjZU1ldGhvZFRlc3QuamF2YSBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYTQ2MGEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL0luaGVyaXRlZEludGVyZmFjZU1ldGhvZFRlc3QuamF2YQpAQCAtMCwwICsxLDY2IEBACisvKgorICRJZCQKKworIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCisgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQKKyAgICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKKyAgICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCisgICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQorICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgorICAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKKyAgICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KKworIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCisgICAgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAorICAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCisKKyA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQorICAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLworCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUworIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAorIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKKyBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgKi8KK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZva2VOZXdMaXN0TWV0aG9kT25BcnJheUxpc3QoKSB7CisgICAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgT2JqZWN0IGFuc3dlciA9IEludm9rZXJIZWxwZXIuaW52b2tlTWV0aG9kKGxpc3QsICJjb3VudCIsIG5ldyBPYmplY3RbXXsiMTIzIn0pOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMCksIGFuc3dlcik7CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGb3VuZDogIiArIGFuc3dlcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9JbnRlcmZhY2VDb252ZXJzaW9uVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL0ludGVyZmFjZUNvbnZlcnNpb25UZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTI3MDlhCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9JbnRlcmZhY2VDb252ZXJzaW9uVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwyOCBAQAorcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWU7DQorDQorY2xhc3MgSW50ZXJmYWNlQ29udmVyc2lvblRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7DQorIA0KKyAgdm9pZCB0ZXN0Q2xvc3VyZUNvbnZlcnNpb24oKXsNCisJZGVmIGMxID0ge09iamVjdFtdIGFyZ3MgLT4gYXJncz8ubGVuZ3RofQ0KKwlkZWYgYzIgPSBjMSBhcyBJbnRlcmZhY2VDb252ZXJzaW9uVGVzdEZvbw0KKwlhc3NlcnQgIShjMSBpbnN0YW5jZW9mIEludGVyZmFjZUNvbnZlcnNpb25UZXN0Rm9vKQ0KKwlhc3NlcnQgYzIgaW5zdGFuY2VvZiBJbnRlcmZhY2VDb252ZXJzaW9uVGVzdEZvbw0KKwlhc3NlcnQgYzIuYSgpID09IG51bGwNCisJYXNzZXJ0IGMyLmIobnVsbCkgPT0gMQ0KKyAgfQ0KKyAgDQorICB2b2lkIHRlc3RNYXBDb252ZXJzaW9uKCkgeyAgDQorCWRlZiBtMSA9IFthOnsxfSwgYjp7Mn1dDQorCWRlZiBtMiA9IG0xIGFzIEludGVyZmFjZUNvbnZlcnNpb25UZXN0Rm9vDQorCQ0KKwlhc3NlcnQgIShtMSBpbnN0YW5jZW9mIEludGVyZmFjZUNvbnZlcnNpb25UZXN0Rm9vKQ0KKwlhc3NlcnQgbTIgaW5zdGFuY2VvZiBJbnRlcmZhY2VDb252ZXJzaW9uVGVzdEZvbw0KKwlhc3NlcnQgbTIuYSgpID09IDENCisJYXNzZXJ0IG0yLmIobnVsbCkgPT0gMg0KKyAgfQ0KK30NCisgDQoraW50ZXJmYWNlIEludGVyZmFjZUNvbnZlcnNpb25UZXN0Rm9vIHsNCisgICAgZGVmIGEoKTsNCisgICAgZGVmIGIoSW50ZWdlciBpKTsNCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9JbnZva2VDb25zdHJ1Y3RvclRlc3QuamF2YSBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvSW52b2tlQ29uc3RydWN0b3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBiYTlhMQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvSW52b2tlQ29uc3RydWN0b3JUZXN0LmphdmEKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgJElkJAorCisgQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQKKyB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIGNvcHlyaWdodAorICAgIHN0YXRlbWVudHMgYW5kIG5vdGljZXMuICBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYQorICAgIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KKworIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUKKyAgICBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCisgICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCisgICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworIDMuIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCisgICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLAorICAgIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLgorCisgNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIKKyAgICBub3IgbWF5ICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYSByZWdpc3RlcmVkCisgICAgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KKworIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtCisgICAgaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTCisgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECisgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTAorIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAqLworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZTsKKworaW1wb3J0IGdyb292eS5sYW5nLkdTdHJpbmc7CitpbXBvcnQgZ3Jvb3Z5LnV0aWwuR3Jvb3Z5VGVzdENhc2U7CisKKy8qKgorICogVGVzdHMgbWV0aG9kIGludm9jYXRpb24KKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgSW52b2tlQ29uc3RydWN0b3JUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgcHJvdGVjdGVkIEludm9rZXIgaW52b2tlciA9IG5ldyBJbnZva2VyKCk7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlQ29uc3RydWN0b3JOb1BhcmFtcygpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBhc3NlcnRDb25zdHJ1Y3RvcihuZXcgRHVtbXlCZWFuKCksIG5ldyBPYmplY3RbMF0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZva2VDb25zdHJ1Y3Rvck9uZVBhcmFtKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGFzc2VydENvbnN0cnVjdG9yKG5ldyBEdW1teUJlYW4oIkJvYiIpLCAiQm9iIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEludm9rZUNvbnN0cnVjdG9yT25lUGFyYW1XaGljaElzTnVsbCgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBhc3NlcnRDb25zdHJ1Y3RvcihuZXcgRHVtbXlCZWFuKCJCb2IiLCBuZXcgSW50ZWdlcigxNzA3KSksIG5ldyBPYmplY3RbXXsiQm9iIiwgbmV3IEludGVnZXIoMTcwNyl9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JXaXRoR1N0cmluZ0NvZXJjaW9uKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIEdTdHJpbmcgZ3N0cmluZyA9IG5ldyBHU3RyaW5nKG5ldyBPYmplY3RbXXtuZXcgSW50ZWdlcigxMjMpfSkgeworICAgICAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFN0cmluZ3MoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXXsiIn07CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgT2JqZWN0IGV4cGVjdGVkID0gbmV3IExvbmcoZ3N0cmluZy50b1N0cmluZygpKTsKKworICAgICAgICBhc3NlcnRDb25zdHJ1Y3RvcihleHBlY3RlZCwgbmV3IE9iamVjdFtde2dzdHJpbmd9KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRDb25zdHJ1Y3RvcihPYmplY3QgZXhwZWN0ZWQsIE9iamVjdCBhcmd1bWVudHMpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBPYmplY3QgdmFsdWUgPSBpbnZva2UoZXhwZWN0ZWQuZ2V0Q2xhc3MoKSwgYXJndW1lbnRzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIkludm9raW5nIG92ZXJsb2FkZWQgbWV0aG9kIGZvciBhcmd1bWVudHM6ICIgKyBJbnZva2VySGVscGVyLnRvU3RyaW5nKGFyZ3VtZW50cyksIGV4cGVjdGVkLCB2YWx1ZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE9iamVjdCBpbnZva2UoQ2xhc3MgdHlwZSwgT2JqZWN0IGFyZ3MpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGludm9rZXIuaW52b2tlQ29uc3RydWN0b3JPZih0eXBlLCBhcmdzKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSW52b2tlckludm9jYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgZS5nZXRDYXVzZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9JbnZva2VHcm9vdnlNZXRob2RUZXN0LmphdmEgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL0ludm9rZUdyb292eU1ldGhvZFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzRkNmJlCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9JbnZva2VHcm9vdnlNZXRob2RUZXN0LmphdmEKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgJElkJAorCisgQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQKKyB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIGNvcHlyaWdodAorICAgIHN0YXRlbWVudHMgYW5kIG5vdGljZXMuICBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYQorICAgIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KKworIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUKKyAgICBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCisgICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCisgICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworIDMuIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCisgICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLAorICAgIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLgorCisgNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIKKyAgICBub3IgbWF5ICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYSByZWdpc3RlcmVkCisgICAgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KKworIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtCisgICAgaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTCisgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECisgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTAorIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAqLworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZTsKKworaW1wb3J0IGdyb292eS5sYW5nLkNsb3N1cmU7CitpbXBvcnQgZ3Jvb3Z5LnV0aWwuR3Jvb3Z5VGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogVGVzdHMgbWV0aG9kIGludm9jYXRpb24KKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgSW52b2tlR3Jvb3Z5TWV0aG9kVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIHByb3RlY3RlZCBJbnZva2VyIGludm9rZXIgPSBuZXcgSW52b2tlcigpOworICAgIHByaXZhdGUgU3RyaW5nQnVmZmVyIGJ1ZmZlcjsKKworICAgIC8vIE1ldGhvZCBpbnZvY2F0aW9uIHRlc3RzCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlTWV0aG9kTm9QYXJhbXMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCisgICAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgbGlzdC5hZGQoImFiYyIpOworICAgICAgICBsaXN0LmFkZCgiZGVmIik7CisKKyAgICAgICAgaW52b2tlci5pbnZva2VNZXRob2QobGlzdCwgImVhY2giLCBuZXcgQ2xvc3VyZSh0aGlzKSB7CisgICAgICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGRvQ2FsbChPYmplY3QgYXJndW1lbnRzKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChhcmd1bWVudHMudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIGFzc2VydEVxdWFscygiYnVmZmVyIiwgImFiY2RlZiIsIGJ1ZmZlci50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWF0Y2hlc1dpdGhPYmplY3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgYXNzZXJ0TWF0Y2hlcyhuZXcgSW50ZWdlcigxKSwgbmV3IEludGVnZXIoMSksIHRydWUpOworICAgICAgICBhc3NlcnRNYXRjaGVzKG5ldyBJbnRlZ2VyKDEpLCBuZXcgSW50ZWdlcigyKSwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RNYXRjaGVzV2l0aENsYXNzKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGFzc2VydE1hdGNoZXMobmV3IEludGVnZXIoMSksIEludGVnZXIuY2xhc3MsIHRydWUpOworICAgICAgICBhc3NlcnRNYXRjaGVzKG5ldyBJbnRlZ2VyKDEpLCBOdW1iZXIuY2xhc3MsIHRydWUpOworICAgICAgICBhc3NlcnRNYXRjaGVzKG5ldyBJbnRlZ2VyKDEpLCBEb3VibGUuY2xhc3MsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWF0Y2hlc1dpdGhMaXN0KCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGFzc2VydE1hdGNoZXMobmV3IEludGVnZXIoMSksIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtde25ldyBJbnRlZ2VyKDIpLCBuZXcgSW50ZWdlcigxKX0pLCB0cnVlKTsKKyAgICAgICAgYXNzZXJ0TWF0Y2hlcyhuZXcgSW50ZWdlcigxKSwgQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W117bmV3IEludGVnZXIoMiksIG5ldyBJbnRlZ2VyKDMpfSksIGZhbHNlKTsKKyAgICB9CisKKyAgICAvLyBJbXBsZW1lbnRhdGlvbiBtZXRob2RzCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0TWF0Y2hlcyhPYmplY3Qgc3dpdGNoVmFsdWUsIE9iamVjdCBjYXNlVmFsdWUsIGJvb2xlYW4gZXhwZWN0ZWQpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICJTd2l0Y2ggb246ICIgKyBzd2l0Y2hWYWx1ZSArICIgQ2FzZTogIiArIGNhc2VWYWx1ZSwKKyAgICAgICAgICAgICAgICBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAoKEJvb2xlYW4pIChJbnZva2VySGVscGVyLmludm9rZU1ldGhvZChjYXNlVmFsdWUsICJpc0Nhc2UiLCBzd2l0Y2hWYWx1ZSkpKS5ib29sZWFuVmFsdWUoKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL0ludm9rZU1ldGhvZFRlc3QuamF2YSBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvSW52b2tlTWV0aG9kVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNzA0Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL0ludm9rZU1ldGhvZFRlc3QuamF2YQpAQCAtMCwwICsxLDQ1MSBAQAorLyoKKyAqICRJZCQKKyAqCisgKiBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZQorICogZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0IHN0YXRlbWVudHMgYW5kCisgKiBub3RpY2VzLiBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYSBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4KKyAqIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLgorICogIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiIG5vciBtYXkKKyAqICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBUaGUKKyAqIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KKyAqICA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLSBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWU7CisKK2ltcG9ydCBncm9vdnkubGFuZy5HU3RyaW5nOworaW1wb3J0IGdyb292eS5sYW5nLkdyb292eVJ1bnRpbWVFeGNlcHRpb247CitpbXBvcnQgZ3Jvb3Z5LmxhbmcuSW50UmFuZ2U7CitpbXBvcnQgZ3Jvb3Z5LnV0aWwuR3Jvb3Z5VGVzdENhc2U7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS50eXBlaGFuZGxpbmcuRGVmYXVsdFR5cGVUcmFuc2Zvcm1hdGlvbjsKKworaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOworaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC4qOworCisvKioKKyAqIFRlc3RzIG1ldGhvZCBpbnZvY2F0aW9uCisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIEludm9rZU1ldGhvZFRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICBwcm90ZWN0ZWQgSW52b2tlciBpbnZva2VyID0gSW52b2tlckhlbHBlci5nZXRJbnN0YW5jZSgpOworCisgICAgLy8gTWV0aG9kIGludm9jYXRpb24gdGVzdHMKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZva2VNZXRob2ROb1BhcmFtcygpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBPYmplY3QgdmFsdWUgPSBpbnZva2UodGhpcywgIm1vY2tDYWxsV2l0aE5vUGFyYW1zIiwgbnVsbCk7CisgICAgICAgIGFzc2VydEVxdWFscygicmV0dXJuIHZhbHVlIiwgIk5vUGFyYW1zIiwgdmFsdWUpOworCisgICAgICAgIHZhbHVlID0gaW52b2tlKHRoaXMsICJtb2NrQ2FsbFdpdGhOb1BhcmFtcyIsIG5ldyBPYmplY3RbMF0pOworICAgICAgICBhc3NlcnRFcXVhbHMoInJldHVybiB2YWx1ZSIsICJOb1BhcmFtcyIsIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlTWV0aG9kT25lUGFyYW0oKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgT2JqZWN0IHZhbHVlID0gaW52b2tlKHRoaXMsICJtb2NrQ2FsbFdpdGhPbmVQYXJhbSIsICJhYmMiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZXR1cm4gdmFsdWUiLCAiT25lUGFyYW0iLCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEludm9rZU1ldGhvZE9uZVBhcmFtV2hpY2hJc051bGwoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgT2JqZWN0IHZhbHVlID0gaW52b2tlKHRoaXMsICJtb2NrQ2FsbFdpdGhPbmVOdWxsUGFyYW0iLCBuZXcgT2JqZWN0W117bnVsbH0pOworICAgICAgICBhc3NlcnRFcXVhbHMoInJldHVybiB2YWx1ZSIsICJPbmVQYXJhbVdpdGhOdWxsIiwgdmFsdWUpOworCisgICAgICAgIHZhbHVlID0gaW52b2tlKHRoaXMsICJtb2NrQ2FsbFdpdGhPbmVOdWxsUGFyYW0iLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZXR1cm4gdmFsdWUiLCAiT25lUGFyYW1XaXRoTnVsbCIsIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlT3ZlcmxvYWRlZE1ldGhvZFdpdGhPbmVQYXJhbVdoaWNoSXNOdWxsKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIE9iamVjdCB2YWx1ZSA9IGludm9rZSh0aGlzLCAibW9ja092ZXJsb2FkZWRNZXRob2QiLCBuZXcgT2JqZWN0W117bnVsbH0pOworICAgICAgICBhc3NlcnRFcXVhbHMoInJldHVybiB2YWx1ZSIsICJPYmplY3QiLCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEludm9rZU1ldGhvZE9uZUNvbGxlY3Rpb25QYXJhbWV0ZXIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgT2JqZWN0W10gZm9vID0geyJhIiwgImIiLCAiYyJ9OworCisgICAgICAgIE9iamVjdCB2YWx1ZSA9IGludm9rZSh0aGlzLCAibW9ja0NhbGxXaXRoT25lQ29sbGVjdGlvblBhcmFtIiwgbmV3IE9iamVjdFtde2Zvb30pOworICAgICAgICBhc3NlcnRFcXVhbHMoInJldHVybiB2YWx1ZSIsIG5ldyBJbnRlZ2VyKDMpLCB2YWx1ZSk7CisKKyAgICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBsaXN0LmFkZCgiYSIpOworICAgICAgICBsaXN0LmFkZCgiYiIpOworICAgICAgICB2YWx1ZSA9IGludm9rZSh0aGlzLCAibW9ja0NhbGxXaXRoT25lQ29sbGVjdGlvblBhcmFtIiwgbGlzdCk7CisgICAgICAgIGFzc2VydEVxdWFscygicmV0dXJuIHZhbHVlIiwgbmV3IEludGVnZXIoMiksIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlUHJpbnRsbk1ldGhvZCgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBPYmplY3QgdmFsdWUgPSBpbnZva2UoU3lzdGVtLm91dCwgInByaW50bG4iLCAidGVzdGluZyBTeXN0ZW0ub3V0LnByaW50bG4uLi4iKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZXR1cm4gdmFsdWUiLCBudWxsLCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE1ldGhvZENob29zZXJOdWxsKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGFzc2VydE1ldGhvZENob29zZXIoIk9iamVjdCIsIG5ldyBPYmplY3RbXXtudWxsfSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE1ldGhvZENob29zZXJOb1BhcmFtcygpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBhc3NlcnRNZXRob2RDaG9vc2VyKCJ2b2lkIiwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE1ldGhvZENob29zZXJPYmplY3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgYXNzZXJ0TWV0aG9kQ2hvb3NlcigiT2JqZWN0IiwgbmV3IE9iamVjdCgpKTsKKyAgICAgICAgYXNzZXJ0TWV0aG9kQ2hvb3NlcigiT2JqZWN0IiwgbmV3IERhdGUoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE1ldGhvZENob29zZXJTdHJpbmdfRkFJTFMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgaWYgKG5vdFlldEltcGxlbWVudGVkKCkpIHJldHVybjsKKyAgICAgICAgYXNzZXJ0TWV0aG9kQ2hvb3NlcigiU3RyaW5nIiwgImZvbyIpOworICAgICAgICBhc3NlcnRNZXRob2RDaG9vc2VyKCJTdHJpbmciLCBuZXcgU3RyaW5nQnVmZmVyKCkpOworICAgICAgICBhc3NlcnRNZXRob2RDaG9vc2VyKCJTdHJpbmciLCBuZXcgQ2hhcmFjdGVyKCdhJykpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2RDaG9vc2VyTnVtYmVyKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGFzc2VydE1ldGhvZENob29zZXIoIk51bWJlciIsIG5ldyBJbnRlZ2VyKDIpKTsKKyAgICAgICAgYXNzZXJ0TWV0aG9kQ2hvb3NlcigiTnVtYmVyIiwgbmV3IERvdWJsZSgyKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE1ldGhvZENob29zZXJUd29QYXJhbXMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBsaXN0LmFkZCgiZm9vIik7CisgICAgICAgIGxpc3QuYWRkKCJiYXIiKTsKKyAgICAgICAgYXNzZXJ0TWV0aG9kQ2hvb3NlcigiT2JqZWN0LE9iamVjdCIsIGxpc3QudG9BcnJheSgpKTsKKworICAgICAgICBPYmplY3RbXSBibGFoID0geyJhIiwgImIifTsKKyAgICAgICAgYXNzZXJ0TWV0aG9kQ2hvb3NlcigiT2JqZWN0LE9iamVjdCIsIGJsYWgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YW5jZW9mV29ya3NGb3JBcnJheSgpIHsKKyAgICAgICAgQ2xhc3MgdHlwZSA9IE9iamVjdFtdLmNsYXNzOworICAgICAgICBPYmplY3QgdmFsdWUgPSBuZXcgT2JqZWN0WzFdOworICAgICAgICBhc3NlcnRUcnVlKCJpbnN0YW5jZW9mIHdvcmtzIGZvciBhcnJheSIsIHR5cGUuaXNJbnN0YW5jZSh2YWx1ZSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2RDaG9vc2VyVHdvUGFyYW1zV2l0aFNlY29uZEFuT2JqZWN0QXJyYXkoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgT2JqZWN0W10gYmxhaCA9IHsiYSIsIG5ldyBPYmplY3RbXXsiYiJ9CisgICAgICAgIH07CisgICAgICAgIGFzc2VydE1ldGhvZENob29zZXIoIk9iamVjdCxPYmplY3RbXSIsIGJsYWgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uTWV0aG9kcygpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBPYmplY3QgbGlzdCA9IEludm9rZXJIZWxwZXIuY3JlYXRlTGlzdChuZXcgT2JqZWN0W117ImEiLCAiYiJ9KTsKKworICAgICAgICBPYmplY3QgdmFsdWUgPSBpbnZva2UobGlzdCwgInNpemUiLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzaXplIG9mIGNvbGxlY3Rpb24iLCBuZXcgSW50ZWdlcigyKSwgdmFsdWUpOworCisgICAgICAgIHZhbHVlID0gaW52b2tlKGxpc3QsICJjb250YWlucyIsICJhIik7CisgICAgICAgIGFzc2VydEVxdWFscygiY29udGFpbnMgbWV0aG9kIiwgQm9vbGVhbi5UUlVFLCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5ld01ldGhvZHMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgT2JqZWN0IHZhbHVlID0gaW52b2tlKCJoZWxsbyIsICJzaXplIiwgbnVsbCk7CisgICAgICAgIGFzc2VydEVxdWFscygic2l6ZSBvZiBzdHJpbmciLCBuZXcgSW50ZWdlcig1KSwgdmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdGF0aWNNZXRob2QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgT2JqZWN0IHZhbHVlID0gaW52b2tlKER1bW15QmVhbi5jbGFzcywgImR1bW15U3RhdGljTWV0aG9kIiwgImFiYyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoInNpemUgb2Ygc3RyaW5nIiwgIkFCQyIsIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmFzZUNsYXNzTWV0aG9kKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIE9iamVjdCBvYmplY3QgPSBuZXcgRHVtbXlCZWFuKCk7CisgICAgICAgIE9iamVjdCB2YWx1ZSA9IGludm9rZShvYmplY3QsICJ0b1N0cmluZyIsIG51bGwpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRvU3RyaW5nIiwgb2JqZWN0LnRvU3RyaW5nKCksIHZhbHVlKTsKKyAgICB9CisKKyAgICAvL1NQRyBtb2RpZmllZCB0byByZWZsZWN0IERlZmF1bHRHcm9vdnlNZXRob2QgbmFtZSBjaGFuZ2UgYW5kIGV4cGVjdGVkIHJlc3VsdCBmcm9tCisgICAgLy9JbnRlZ2VyL0ludGVnZXIgZGl2aXNpb24uCisgICAgcHVibGljIHZvaWQgdGVzdERpdmlkZU51bWJlcnMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgYXNzZXJ0TWV0aG9kQ2FsbChuZXcgRG91YmxlKDEwKSwgImRpdiIsIG5ldyBEb3VibGUoMiksIG5ldyBEb3VibGUoNSkpOworICAgICAgICBhc3NlcnRNZXRob2RDYWxsKG5ldyBEb3VibGUoMTApLCAiZGl2IiwgbmV3IEludGVnZXIoMiksIG5ldyBEb3VibGUoNSkpOworICAgICAgICBhc3NlcnRNZXRob2RDYWxsKG5ldyBJbnRlZ2VyKDEwKSwgImRpdiIsIG5ldyBEb3VibGUoMiksIG5ldyBEb3VibGUoNSkpOworICAgICAgICBhc3NlcnRNZXRob2RDYWxsKG5ldyBJbnRlZ2VyKDEwKSwgImRpdiIsIG5ldyBJbnRlZ2VyKDIpLCBuZXcgamF2YS5tYXRoLkJpZ0RlY2ltYWwoIjUiKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEJhc2VGYWlsTWV0aG9kKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnZva2UodGhpcywgImZhaWwiLCAiaGVsbG8iKTsKKyAgICAgICAgfSBjYXRjaCAoQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSkgeworICAgICAgICAgICAgLy8gd29ya2VkCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9BcnJheU9uTGlzdCgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBMaXN0IG9iamVjdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgb2JqZWN0LmFkZCgiSGVsbG8iKTsKKworICAgICAgICBPYmplY3RbXSB2YWx1ZSA9IChPYmplY3RbXSkgaW52b2tlKG9iamVjdCwgInRvQXJyYXkiLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMob2JqZWN0LnRvQXJyYXkoKSwgdmFsdWUpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgdmFsdWUubGVuZ3RoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJIZWxsbyIsIHZhbHVlWzBdKTsKKworICAgICAgICB2YWx1ZSA9IChPYmplY3RbXSkgaW52b2tlKG9iamVjdCwgInRvQXJyYXkiLCBuZXcgT2JqZWN0WzBdKTsKKyAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMob2JqZWN0LnRvQXJyYXkoKSwgdmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkT3ZlcmxvYWRpbmcoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludm9rZSh0aGlzLCAiYmFkT3ZlcmxvYWQiLCBuZXcgT2JqZWN0W117ImEiLCAiYiJ9KTsKKyAgICAgICAgICAgIGZhaWwoIlNob3VsZCBmYWlsIGFzIGFuIHVuYW1iaWd1b3VzIG1ldGhvZCBpcyBpbnZva2VkIik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEdyb292eVJ1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDYXVnaHQ6ICIgKyBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQbHVzV2l0aE51bGwoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgU3RyaW5nIHBhcmFtID0gImNhbGxlZCB3aXRoOiAiOworICAgICAgICBPYmplY3QgdmFsdWUgPSBpbnZva2UocGFyYW0sICJwbHVzIiwgbmV3IE9iamVjdFtde251bGx9KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjYWxsZWQgd2l0aCBudWxsIiwgcGFyYW0gKyBudWxsLCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENhbGxJbnRNZXRob2RXaXRoSW50ZWdlcigpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBPYmplY3QgdmFsdWUgPSBpbnZva2UodGhpcywgIm92ZXJsb2FkZWRSZW1vdmUiLCBuZXcgT2JqZWN0W117bmV3IEludGVnZXIoNSl9KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjYWxsZWQgd2l0aCBpbnRlZ2VyIiwgImludDUiLCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENhbGxMaXN0UmVtb3ZlKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgbGlzdC5hZGQoImZvbyIpOworICAgICAgICBsaXN0LmFkZCgiYmFyIik7CisKKyAgICAgICAgaW52b2tlKGxpc3QsICJyZW1vdmUiLCBuZXcgT2JqZWN0W117bmV3IEludGVnZXIoMCl9KTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIlNob3VsZCBoYXZlIGp1c3QgMSBpdGVtIGxlZnQ6ICIgKyBsaXN0LCAxLCBsaXN0LnNpemUoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENvZXJjZUdTdHJpbmdUb1N0cmluZygpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBHU3RyaW5nIHBhcmFtID0gbmV3IEdTdHJpbmcobmV3IE9iamVjdFtdeyJKYW1lcyJ9KSB7CisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0U3RyaW5ncygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdeyJIZWxsbyAifTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgT2JqZWN0IHZhbHVlID0gaW52b2tlKHRoaXMsICJtZXRob2RUYWtlc1N0cmluZyIsIG5ldyBPYmplY3RbXXtwYXJhbX0pOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbnZlcnRlZCBHU3RyaW5nIHRvIHN0cmluZyIsIHBhcmFtLnRvU3RyaW5nKCksIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29lcmNlR1N0cmluZ1RvU3RyaW5nT25HZXRCeXRlcygpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBHU3RyaW5nIHBhcmFtID0gbmV3IEdTdHJpbmcobmV3IE9iamVjdFtdeyJVUy1BU0NJSSJ9KSB7CisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0U3RyaW5ncygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdeyIifTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgT2JqZWN0IHZhbHVlID0gaW52b2tlKCJ0ZXN0IiwgImdldEJ5dGVzIiwgbmV3IE9iamVjdFtde3BhcmFtfSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29udmVydGVkIEdTdHJpbmcgdG8gc3RyaW5nIiwgInRlc3QiLmdldEJ5dGVzKCJVUy1BU0NJSSIpLmdldENsYXNzKCksIHZhbHVlLmdldENsYXNzKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RCYWRCRFRvRG91YmxlQ29lcmNlKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnZva2UoTWF0aC5jbGFzcywgImZsb29yIiwgbmV3IEJpZ0RlY2ltYWwoIjEuN0UzMDkiKSk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJNYXRoLmZsb29yKDEuN0UzMDkpIHNob3VsZCBmYWlsIGJlY2F1c2UgaXQgaXMgb3V0IG9mIHJhbmdlIGZvciBhIERvdWJsZS4gIgorICAgICAgICAgICAgICAgICAgICArIGUsIGUuZ2V0TWVzc2FnZSgpLmluZGV4T2YoIm91dCBvZiByYW5nZSIpID4gMCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZmFpbCgiTWF0aC5mbG9vcigxLjdFMzA5KSBzaG91bGQgZmFpbCBiZWNhdXNlIGl0IGlzIG91dCBvZiByYW5nZSBmb3IgYSBEb3VibGUuIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENsYXNzTWV0aG9kKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIENsYXNzIGMgPSBTdHJpbmcuY2xhc3M7CisgICAgICAgIE9iamVjdCB2YWx1ZSA9IGludm9rZShjLCAiZ2V0TmFtZSIsIG51bGwpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkNsYXNzLmdldE5hbWUoKSIsIGMuZ2V0TmFtZSgpLCB2YWx1ZSk7CisgICAgICAgIGMgPSBnZXRDbGFzcygpOworICAgICAgICB2YWx1ZSA9IGludm9rZShjLCAiZ2V0TmFtZSIsIG51bGwpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkNsYXNzLmdldE5hbWUoKSIsIGMuZ2V0TmFtZSgpLCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFByb3RlY3RlZE1ldGhvZCgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBTdHJpbmcgcGFyYW0gPSAiaGVsbG8iOworICAgICAgICBPYmplY3QgdmFsdWUgPSBpbnZva2UodGhpcywgImFQcm90ZWN0ZWRNZXRob2QiLCBwYXJhbSk7CisgICAgICAgIGFzc2VydEVxdWFscygicHJvdGVjdGVkIG1ldGhvZCBjYWxsIiwgYVByb3RlY3RlZE1ldGhvZChwYXJhbSksIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJpdmF0ZU1ldGhvZCgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBTdHJpbmcgcGFyYW0gPSAiaGVsbG8iOworICAgICAgICBPYmplY3QgdmFsdWUgPSBpbnZva2UodGhpcywgImFQcml2YXRlTWV0aG9kIiwgcGFyYW0pOworICAgICAgICBhc3NlcnRFcXVhbHMoInByaXZhdGUgbWV0aG9kIGNhbGwiLCBhUHJpdmF0ZU1ldGhvZChwYXJhbSksIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nU3Vic3RyaW5nTWV0aG9kKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIFN0cmluZyBvYmplY3QgPSAiaGVsbG8iOworICAgICAgICBPYmplY3QgdmFsdWUgPSBpbnZva2Uob2JqZWN0LCAic3Vic3RyaW5nIiwgbmV3IEludGVnZXIoMikpOworICAgICAgICBhc3NlcnRFcXVhbHMoInN1YnN0cmluZygyKSIsIG9iamVjdC5zdWJzdHJpbmcoMiksIHZhbHVlKTsKKworICAgICAgICB2YWx1ZSA9IGludm9rZShvYmplY3QsICJzdWJzdHJpbmciLCBuZXcgT2JqZWN0W117bmV3IEludGVnZXIoMSksIG5ldyBJbnRlZ2VyKDMpfSk7CisgICAgICAgIGFzc2VydEVxdWFscygic3Vic3RyaW5nKDEsMykiLCBvYmplY3Quc3Vic3RyaW5nKDEsIDMpLCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExpc3RHZXRXaXRoUmFuZ2UoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgTGlzdCBsaXN0ID0gQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W117ImEiLCAiYiIsICJjIn0pOworICAgICAgICBPYmplY3QgcmFuZ2UgPSBuZXcgSW50UmFuZ2UoMCwgMik7CisgICAgICAgIE9iamVjdCB2YWx1ZSA9IGludm9rZShsaXN0LCAiZ2V0QXQiLCByYW5nZSk7CisgICAgICAgIGFzc2VydFRydWUoIlJldHVybmVkIExpc3Q6ICIgKyB2YWx1ZSwgdmFsdWUgaW5zdGFuY2VvZiBMaXN0KTsKKyAgICAgICAgTGlzdCByZXRMaXN0ID0gKExpc3QpIHZhbHVlOworICAgICAgICBhc3NlcnRFcXVhbHMoIkxpc3Qgc2l6ZSIsIDMsIHJldExpc3Quc2l6ZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0TGVuaWVudE9uRGF0ZUZvcm1hdCgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBTaW1wbGVEYXRlRm9ybWF0IGEgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiTU0vZGQveXl5eSIpOworCisgICAgICAgIE9iamVjdCB2YWx1ZSA9IGludm9rZShhLCAic2V0TGVuaWVudCIsIG5ldyBPYmplY3RbXXtCb29sZWFuLkZBTFNFfSk7CisgICAgICAgIGFzc2VydEVxdWFscygidm9pZCBtZXRob2QiLCBudWxsLCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEludm9rZVVua25vd25NZXRob2QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGludm9rZSh0aGlzLCAidW5rbm93bk1ldGhvZCIsICJhYmMiKTsKKyAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24iKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyB3b3JrZWQKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZva2VNZXRob2RXaXRoV3JvbmdOdW1iZXJPZlBhcmFtZXRlcnMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE9iamVjdFtdIGFyZ3MgPSB7ImEiLCAiYiJ9OworICAgICAgICAgICAgaW52b2tlKHRoaXMsICJ1bmtub3duTWV0aG9kIiwgYXJncyk7CisgICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uIik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEdyb292eVJ1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gd29ya2VkCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlTWV0aG9kT25OdWxsT2JqZWN0KCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnZva2UobnVsbCwgIm1vY2tDYWxsV2l0aE5vUGFyYW1zIiwgbnVsbCk7CisgICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uIik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIHdvcmtlZAorICAgICAgICB9CisgICAgfQorCisgICAgLy8gTW9jayBtZXRob2RzIHVzZWQgZm9yIHRlc3RpbmcKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIHB1YmxpYyBPYmplY3QgbW9ja0NhbGxXaXRoTm9QYXJhbXMoKSB7CisgICAgICAgIHJldHVybiAiTm9QYXJhbXMiOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgbW9ja0NhbGxXaXRoT25lUGFyYW0oT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiTWV0aG9kIG5vdCBwYXNzZWQgaW4gdGhlIGNvcnJlY3QgdmFsdWUiLCAiYWJjIiwgdmFsdWUpOworICAgICAgICByZXR1cm4gIk9uZVBhcmFtIjsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IG1vY2tDYWxsV2l0aE9uZU51bGxQYXJhbShPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJNZXRob2Qgbm90IHBhc3NlZCBpbiB0aGUgY29ycmVjdCB2YWx1ZSIsIG51bGwsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuICJPbmVQYXJhbVdpdGhOdWxsIjsKKyAgICB9CisKKyAgICBwdWJsaWMgSW50ZWdlciBtb2NrQ2FsbFdpdGhPbmVDb2xsZWN0aW9uUGFyYW0oT2JqZWN0IGNvbGxlY3Rpb24pIHsKKyAgICAgICAgQ29sbGVjdGlvbiBjb2xsID0gRGVmYXVsdFR5cGVUcmFuc2Zvcm1hdGlvbi5hc0NvbGxlY3Rpb24oY29sbGVjdGlvbik7CisgICAgICAgIHJldHVybiBuZXcgSW50ZWdlcihjb2xsLnNpemUoKSk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBtb2NrT3ZlcmxvYWRlZE1ldGhvZCgpIHsKKyAgICAgICAgcmV0dXJuICJ2b2lkIjsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IG1vY2tPdmVybG9hZGVkTWV0aG9kKE9iamVjdCBvYmplY3QpIHsKKyAgICAgICAgcmV0dXJuICJPYmplY3QiOworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgbW9ja092ZXJsb2FkZWRNZXRob2QoTnVtYmVyIG9iamVjdCkgeworICAgICAgICByZXR1cm4gIk51bWJlciI7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBtb2NrT3ZlcmxvYWRlZE1ldGhvZChTdHJpbmcgb2JqZWN0KSB7CisgICAgICAgIHJldHVybiAiU3RyaW5nIjsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IG1vY2tPdmVybG9hZGVkTWV0aG9kKE9iamVjdCBvYmplY3QsIE9iamVjdCBiYXIpIHsKKyAgICAgICAgcmV0dXJuICJPYmplY3QsT2JqZWN0IjsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IG1vY2tPdmVybG9hZGVkTWV0aG9kKE9iamVjdCBvYmplY3QsIE9iamVjdFtdIGFycmF5KSB7CisgICAgICAgIHJldHVybiAiT2JqZWN0LE9iamVjdFtdIjsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGJhZE92ZXJsb2FkKFN0cmluZyBhLCBPYmplY3QgYikgeworICAgICAgICByZXR1cm4gIlN0cmluZywgT2JqZWN0IjsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGJhZE92ZXJsb2FkKE9iamVjdCBhLCBTdHJpbmcgYikgeworICAgICAgICByZXR1cm4gIk9iamVjdCwgU3RyaW5nIjsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IG1ldGhvZFRha2VzU3RyaW5nKFN0cmluZyB4KSB7CisgICAgICAgIHJldHVybiB4OworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3Qgb3ZlcmxvYWRlZFJlbW92ZShpbnQgaWR4KSB7CisgICAgICAgIHJldHVybiAiaW50IiArIGlkeDsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IG92ZXJsb2FkZWRSZW1vdmUoT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIHJldHVybiAiT2JqZWN0IiArIHZhbHVlOworICAgIH0KKworICAgIC8vIEltcGxlbWVudGF0aW9uIG1ldGhvZHMKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIHByb3RlY3RlZCBPYmplY3QgYVByb3RlY3RlZE1ldGhvZChTdHJpbmcgcGFyYW0pIHsKKyAgICAgICAgcmV0dXJuIHBhcmFtICsgIiB0aGVyZSEiOworICAgIH0KKworICAgIHByaXZhdGUgT2JqZWN0IGFQcml2YXRlTWV0aG9kKFN0cmluZyBwYXJhbSkgeworICAgICAgICByZXR1cm4gcGFyYW0gKyAiIEphbWVzISI7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0TWV0aG9kQ2FsbChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbWV0aG9kLCBPYmplY3QgcGFyYW0sIE9iamVjdCBleHBlY3RlZCkgeworICAgICAgICBPYmplY3QgdmFsdWUgPSBJbnZva2VySGVscGVyLmludm9rZU1ldGhvZChvYmplY3QsIG1ldGhvZCwgbmV3IE9iamVjdFtde3BhcmFtfSk7CisgICAgICAgIGFzc2VydEVxdWFscygicmVzdWx0IG9mIG1ldGhvZDogIiArIG1ldGhvZCwgZXhwZWN0ZWQsIHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBc3NlcnRzIHRoYXQgaW52b2tpbmcgdGhlIG1ldGhvZCBjaG9vc2VyIGZpbmRzIHRoZSByaWdodCBvdmVybG9hZGVkCisgICAgICogbWV0aG9kIGltcGxlbWVudGF0aW9uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXhwZWN0ZWQgIGlzIHRoZSBleHBlY3RlZCB2YWx1ZSBvZiB0aGUgbWV0aG9kCisgICAgICogQHBhcmFtIGFyZ3VtZW50cyB0aGUgYXJndW1lbnQocykgdG8gdGhlIG1ldGhvZCBpbnZvY2F0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0TWV0aG9kQ2hvb3NlcihPYmplY3QgZXhwZWN0ZWQsIE9iamVjdCBhcmd1bWVudHMpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBPYmplY3QgdmFsdWUgPSBpbnZva2UodGhpcywgIm1vY2tPdmVybG9hZGVkTWV0aG9kIiwgYXJndW1lbnRzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIkludm9raW5nIG92ZXJsb2FkZWQgbWV0aG9kIGZvciBhcmd1bWVudHM6ICIgKyBJbnZva2VySGVscGVyLnRvU3RyaW5nKGFyZ3VtZW50cyksIGV4cGVjdGVkLCB2YWx1ZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE9iamVjdCBpbnZva2UoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1ldGhvZCwgT2JqZWN0IGFyZ3MpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGludm9rZXIuaW52b2tlTWV0aG9kKG9iamVjdCwgbWV0aG9kLCBhcmdzKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSW52b2tlckludm9jYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgZS5nZXRDYXVzZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9JbnZva2VySGVscGVyVGVzdC5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9JbnZva2VySGVscGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzYmJlMmMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL0ludm9rZXJIZWxwZXJUZXN0LmphdmEKQEAgLTAsMCArMSwzNiBAQAorcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWU7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworaW1wb3J0IGdyb292eS5sYW5nLkJpbmRpbmc7CitpbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5Q2xhc3NMb2FkZXI7CitpbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5Q29kZVNvdXJjZTsKK2ltcG9ydCBncm9vdnkubGFuZy5TY3JpcHQ7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgSW52b2tlckhlbHBlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgcHJpdmF0ZSBIYXNoTWFwIGJpbmRpbmdWYXJpYWJsZXM7CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBiaW5kaW5nVmFyaWFibGVzID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgYmluZGluZ1ZhcmlhYmxlcy5wdXQoIm5hbWUiLCAiaGFucyIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVTY3JpcHRXaXRoTnVsbENsYXNzKCkgeworICAgICAgICBTY3JpcHQgc2NyaXB0ID0gSW52b2tlckhlbHBlci5jcmVhdGVTY3JpcHQobnVsbCwgbmV3IEJpbmRpbmcoYmluZGluZ1ZhcmlhYmxlcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoYmluZGluZ1ZhcmlhYmxlcywgc2NyaXB0LmdldEJpbmRpbmcoKS5nZXRWYXJpYWJsZXMoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVNjcmlwdFdpdGhTY3JpcHRDbGFzcygpIHsKKyAgICAgICAgR3Jvb3Z5Q2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSBuZXcgR3Jvb3Z5Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgU3RyaW5nIGNvbnRyb2xQcm9wZXJ0eSA9ICJ0ZXh0IjsKKyAgICAgICAgU3RyaW5nIGNvbnRyb2xWYWx1ZSA9ICJJIGFtIGEgc2NyaXB0IjsKKyAgICAgICAgU3RyaW5nIGNvZGUgPSBjb250cm9sUHJvcGVydHkgKyAiID0gJyIgKyBjb250cm9sVmFsdWUgKyAiJyI7CisgICAgICAgIEdyb292eUNvZGVTb3VyY2UgY29kZVNvdXJjZSA9IG5ldyBHcm9vdnlDb2RlU291cmNlKGNvZGUsICJ0ZXN0c2NyaXB0IiwgIi9ncm9vdnkvc2hlbGwiKTsKKyAgICAgICAgQ2xhc3Mgc2NyaXB0Q2xhc3MgPSBjbGFzc0xvYWRlci5wYXJzZUNsYXNzKGNvZGVTb3VyY2UsIGZhbHNlKTsKKyAgICAgICAgU2NyaXB0IHNjcmlwdCA9IEludm9rZXJIZWxwZXIuY3JlYXRlU2NyaXB0KHNjcmlwdENsYXNzLCBuZXcgQmluZGluZyhiaW5kaW5nVmFyaWFibGVzKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhiaW5kaW5nVmFyaWFibGVzLCBzY3JpcHQuZ2V0QmluZGluZygpLmdldFZhcmlhYmxlcygpKTsKKyAgICAgICAgc2NyaXB0LnJ1bigpOworICAgICAgICBhc3NlcnRFcXVhbHMoY29udHJvbFZhbHVlLCBzY3JpcHQuZ2V0UHJvcGVydHkoY29udHJvbFByb3BlcnR5KSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9JbnZva2VyVGVzdC5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9JbnZva2VyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNzA4ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL0ludm9rZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxODUgQEAKKy8qCisgJElkJAorCisgQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQKKyB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIGNvcHlyaWdodAorICAgIHN0YXRlbWVudHMgYW5kIG5vdGljZXMuICBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYQorICAgIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KKworIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUKKyAgICBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCisgICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCisgICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworIDMuIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCisgICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLAorICAgIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLgorCisgNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIKKyAgICBub3IgbWF5ICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYSByZWdpc3RlcmVkCisgICAgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KKworIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtCisgICAgaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTCisgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECisgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTAorIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAqLworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZTsKKworaW1wb3J0IGdyb292eS5sYW5nLkdTdHJpbmc7CitpbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbjsKK2ltcG9ydCBncm9vdnkudXRpbC5Hcm9vdnlUZXN0Q2FzZTsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUudHlwZWhhbmRsaW5nLkRlZmF1bHRUeXBlVHJhbnNmb3JtYXRpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworCisvKioKKyAqIFRlc3QgdGhlIEludm9rZXIgY2xhc3MKKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgSW52b2tlclRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICBwcm90ZWN0ZWQgSW52b2tlciBpbnZva2VyID0gbmV3IEludm9rZXIoKTsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RBc0NvbGxlY3Rpb25XaXRoQXJyYXkoKSB7CisgICAgICAgIE9iamVjdFtdIGFycmF5ID0geyJBIiwgIkIiLCAiQyJ9OworICAgICAgICBhc3NlcnRBc0NvbGxlY3Rpb24oYXJyYXksIDMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBc0NvbGxlY3Rpb25XaXRoTWFwKCkgeworICAgICAgICBNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgbWFwLnB1dCgiQSIsICJhYmMiKTsKKyAgICAgICAgbWFwLnB1dCgiQiIsICJkZWYiKTsKKyAgICAgICAgbWFwLnB1dCgiQyIsICJ4eXoiKTsKKyAgICAgICAgYXNzZXJ0QXNDb2xsZWN0aW9uKG1hcCwgMyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFzQ29sbGVjdGlvbldpdGhMaXN0KCkgeworICAgICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGxpc3QuYWRkKCJBIik7CisgICAgICAgIGxpc3QuYWRkKCJCIik7CisgICAgICAgIGxpc3QuYWRkKCJDIik7CisgICAgICAgIGFzc2VydEFzQ29sbGVjdGlvbihsaXN0LCAzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlckV4Y2VwdGlvbigpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEdyb292eVJ1bnRpbWVFeGNlcHRpb24oIm1lc3NhZ2UiLCBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEdyb292eVJ1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gd29ya2VkCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIm1lc3NhZ2UiLCBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGUuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIE51bGxQb2ludGVyRXhjZXB0aW9uKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBc0Jvb2xlYW4oKSB7CisgICAgICAgIGFzc2VydEFzQm9vbGVhbih0cnVlLCBCb29sZWFuLlRSVUUpOworICAgICAgICBhc3NlcnRBc0Jvb2xlYW4odHJ1ZSwgInRydWUiKTsKKyAgICAgICAgYXNzZXJ0QXNCb29sZWFuKHRydWUsICJUUlVFIik7CisgICAgICAgIGFzc2VydEFzQm9vbGVhbih0cnVlLCAiZmFsc2UiKTsKKyAgICAgICAgYXNzZXJ0QXNCb29sZWFuKGZhbHNlLCBCb29sZWFuLkZBTFNFKTsKKyAgICAgICAgYXNzZXJ0QXNCb29sZWFuKGZhbHNlLCAoU3RyaW5nKSBudWxsKTsKKyAgICAgICAgYXNzZXJ0QXNCb29sZWFuKGZhbHNlLCAiIik7CisgICAgICAgIEdTdHJpbmcgZW1wdHlHU3RyaW5nID0gbmV3IEdTdHJpbmcobmV3IE9iamVjdFtdeyIifSkgeworICAgICAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFN0cmluZ3MoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXXsiIn07CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIGFzc2VydEFzQm9vbGVhbihmYWxzZSwgZW1wdHlHU3RyaW5nKTsKKyAgICAgICAgR1N0cmluZyBub25FbXB0eUdTdHJpbmcgPSBuZXcgR1N0cmluZyhuZXcgT2JqZWN0W117IngifSkgeworICAgICAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFN0cmluZ3MoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXXsieCJ9OworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBhc3NlcnRBc0Jvb2xlYW4odHJ1ZSwgbm9uRW1wdHlHU3RyaW5nKTsKKyAgICAgICAgYXNzZXJ0QXNCb29sZWFuKHRydWUsIG5ldyBJbnRlZ2VyKDEyMzQpKTsKKyAgICAgICAgYXNzZXJ0QXNCb29sZWFuKGZhbHNlLCBuZXcgSW50ZWdlcigwKSk7CisgICAgICAgIGFzc2VydEFzQm9vbGVhbih0cnVlLCBuZXcgRmxvYXQoMC4zZikpOworICAgICAgICBhc3NlcnRBc0Jvb2xlYW4odHJ1ZSwgbmV3IERvdWJsZSgzLjBmKSk7CisgICAgICAgIGFzc2VydEFzQm9vbGVhbihmYWxzZSwgbmV3IEZsb2F0KDAuMGYpKTsKKyAgICAgICAgYXNzZXJ0QXNCb29sZWFuKHRydWUsIG5ldyBDaGFyYWN0ZXIoKGNoYXIpIDEpKTsKKyAgICAgICAgYXNzZXJ0QXNCb29sZWFuKGZhbHNlLCBuZXcgQ2hhcmFjdGVyKChjaGFyKSAwKSk7CisgICAgICAgIGFzc2VydEFzQm9vbGVhbihmYWxzZSwgQ29sbGVjdGlvbnMuRU1QVFlfTElTVCk7CisgICAgICAgIGFzc2VydEFzQm9vbGVhbih0cnVlLCBBcnJheXMuYXNMaXN0KG5ldyBJbnRlZ2VyW117bmV3IEludGVnZXIoMSl9KSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExlc3NUaGFuKCkgeworICAgICAgICBhc3NlcnRUcnVlKFNjcmlwdEJ5dGVjb2RlQWRhcHRlci5jb21wYXJlTGVzc1RoYW4obmV3IEludGVnZXIoMSksIG5ldyBJbnRlZ2VyKDIpKSk7CisgICAgICAgIGFzc2VydFRydWUoU2NyaXB0Qnl0ZWNvZGVBZGFwdGVyLmNvbXBhcmVMZXNzVGhhbkVxdWFsKG5ldyBJbnRlZ2VyKDIpLCBuZXcgSW50ZWdlcigyKSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHcmVhdGVyVGhhbigpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTY3JpcHRCeXRlY29kZUFkYXB0ZXIuY29tcGFyZUdyZWF0ZXJUaGFuKG5ldyBJbnRlZ2VyKDMpLCBuZXcgSW50ZWdlcigyKSkpOworICAgICAgICBhc3NlcnRUcnVlKFNjcmlwdEJ5dGVjb2RlQWRhcHRlci5jb21wYXJlR3JlYXRlclRoYW5FcXVhbChuZXcgSW50ZWdlcigyKSwgbmV3IEludGVnZXIoMikpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZVRvKCkgeworICAgICAgICBhc3NlcnRUcnVlKERlZmF1bHRUeXBlVHJhbnNmb3JtYXRpb24uY29tcGFyZUVxdWFsKCJ4IiwgbmV3IEludGVnZXIoJ3gnKSkpOworICAgIH0KKworICAgIC8vIEltcGxlbWVudGF0aW9uIG1ldGhvZHMKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKgorICAgICAqIEFzc2VydHMgdGhlIGFzQm9vbGVhbiBtZXRob2QgcmV0dXJucyB0aGUgZ2l2ZW4gZmxhZworICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydEFzQm9vbGVhbihib29sZWFuIGV4cGVjdGVkLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgYm9vbGVhbiBhbnN3ZXIgPSBEZWZhdWx0VHlwZVRyYW5zZm9ybWF0aW9uLmNhc3RUb0Jvb2xlYW4odmFsdWUpOworICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlOiAiICsgdmFsdWUgKyAiIGFzQm9vbGVhbigpIiwgZXhwZWN0ZWQsIGFuc3dlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBvYmplY3QgY2FuIGJlIGNvbnZlcnRlZCBpbnRvIGEgY29sbGVjdGlvbiBhbmQgaXRlcmF0b3IKKyAgICAgKiBvZiB0aGUgZ2l2ZW4gc2l6ZQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydEFzQ29sbGVjdGlvbihPYmplY3QgY29sbGVjdGlvbk9iamVjdCwgaW50IGNvdW50KSB7CisgICAgICAgIENvbGxlY3Rpb24gY29sbGVjdGlvbiA9IERlZmF1bHRUeXBlVHJhbnNmb3JtYXRpb24uYXNDb2xsZWN0aW9uKGNvbGxlY3Rpb25PYmplY3QpOworICAgICAgICBhc3NlcnRUcnVlKCJDb2xsZWN0aW9uIGlzIG5vdCBudWxsIiwgY29sbGVjdGlvbiAhPSBudWxsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJDb2xsZWN0aW9uIHNpemUiLCBjb3VudCwgY29sbGVjdGlvbi5zaXplKCkpOworCisgICAgICAgIGFzc2VydEl0ZXJhdG9yKCJjb2xsZWN0aW9ucyBpdGVyYXRvciIsIGNvbGxlY3Rpb24uaXRlcmF0b3IoKSwgY291bnQpOworICAgICAgICBhc3NlcnRJdGVyYXRvcigiSW52b2tlckhlbHBlci5hc0l0ZXJhdG9yIiwgSW52b2tlckhlbHBlci5hc0l0ZXJhdG9yKGNvbGxlY3Rpb25PYmplY3QpLCBjb3VudCk7CisgICAgICAgIGFzc2VydEl0ZXJhdG9yKCJJbnZva2VySGVscGVyLmFzSXRlcmF0b3IoSW52b2tlckhlbHBlci5hc0NvbGxlY3Rpb24pIiwgSW52b2tlckhlbHBlci5hc0l0ZXJhdG9yKGNvbGxlY3Rpb24pLCBjb3VudCk7CisgICAgICAgIGFzc2VydEl0ZXJhdG9yKCJJbnZva2VySGVscGVyLmFzSXRlcmF0b3IoSW52b2tlckhlbHBlci5hc0l0ZXJhdG9yKSIsIEludm9rZXJIZWxwZXIuYXNJdGVyYXRvcihJbnZva2VySGVscGVyLmFzSXRlcmF0b3IoY29sbGVjdGlvbk9iamVjdCkpLCBjb3VudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXNzZXJ0cyB0aGF0IHRoZSBpdGVyYXRvciBpcyB2YWxpZCBhbmQgb2YgdGhlIHJpZ2h0IHNpemUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRJdGVyYXRvcihTdHJpbmcgbWVzc2FnZSwgSXRlcmF0b3IgaXRlcmF0b3IsIGludCBjb3VudCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUobWVzc2FnZSArICI6IHNob3VsZCBoYXZlIGl0ZW06ICIgKyBpLCBpdGVyYXRvci5oYXNOZXh0KCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlICsgIjogaXRlbTogIiArIGkgKyAiIHNob3VsZCBub3QgYmUgbnVsbCIsIGl0ZXJhdG9yLm5leHQoKSAhPSBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydEZhbHNlKAorICAgICAgICAgICAgICAgIG1lc3NhZ2UgKyAiOiBzaG91bGQgbm90IGhhdmUgaXRlbSBhZnRlciBpdGVyYXRpbmcgdGhyb3VnaDogIiArIGNvdW50ICsgIiBpdGVtcyIsCisgICAgICAgICAgICAgICAgaXRlcmF0b3IuaGFzTmV4dCgpKTsKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9KZGtEeW5hbWljUHJveHlJbnZvY2F0aW9uSGFuZGxlci5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9KZGtEeW5hbWljUHJveHlJbnZvY2F0aW9uSGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNzg3Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL0pka0R5bmFtaWNQcm94eUludm9jYXRpb25IYW5kbGVyLmphdmEKQEAgLTAsMCArMSwyNiBAQAorcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWU7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOworCitwdWJsaWMgY2xhc3MgSmRrRHluYW1pY1Byb3h5SW52b2NhdGlvbkhhbmRsZXIgaW1wbGVtZW50cyBJbnZvY2F0aW9uSGFuZGxlciB7CisKKwkvKiBJbnZvY2F0aW9uSGFuZGxlciBpbXBsZW1lbnRhdGlvbi4gKi8KKwlPYmplY3QgcHJveGllZE9iamVjdDsKKworICAgIHByaXZhdGUgSmRrRHluYW1pY1Byb3h5SW52b2NhdGlvbkhhbmRsZXIgKE9iamVjdCBvYmopIHsKKyAgICAgICAgdGhpcy5wcm94aWVkT2JqZWN0ID0gb2JqOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldFByb3hpZWRPYmplY3QgKE9iamVjdCBvYmopIHsKKyAgICAgICAgQ2xhc3MgY2wgPSBvYmouZ2V0Q2xhc3MoKTsKKyAgICAgICAgcmV0dXJuIFByb3h5Lm5ld1Byb3h5SW5zdGFuY2UoCisgICAgICAgICAgICBjbC5nZXRDbGFzc0xvYWRlcigpLAorICAgICAgICAgICAgY2wuZ2V0SW50ZXJmYWNlcygpLAorICAgICAgICAgICAgbmV3IEpka0R5bmFtaWNQcm94eUludm9jYXRpb25IYW5kbGVyIChvYmopCisgICAgICAgICk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBpbnZva2UoT2JqZWN0IHByb3h5LCBNZXRob2QgbSwgT2JqZWN0W10gYXJncykgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbS5pbnZva2UgKHByb3hpZWRPYmplY3QsIGFyZ3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvSmRrRHluYW1pY1Byb3h5U2VydmljZUJlYW4uamF2YSBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvSmRrRHluYW1pY1Byb3h5U2VydmljZUJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmZiNTAyCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9KZGtEeW5hbWljUHJveHlTZXJ2aWNlQmVhbi5qYXZhCkBAIC0wLDAgKzEsNyBAQAorcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWU7CisKK3B1YmxpYyBpbnRlcmZhY2UgSmRrRHluYW1pY1Byb3h5U2VydmljZUJlYW4geworCXB1YmxpYyBTdHJpbmcgZG9TZXJ2aWNlICgpOworCXB1YmxpYyB2b2lkIHNldEpka0R5bmFtaWNQcm94eVNlcnZpY2VCZWFuIChKZGtEeW5hbWljUHJveHlTZXJ2aWNlQmVhbiBpbik7Cit9CisKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvSmRrRHluYW1pY1Byb3h5U2VydmljZUJlYW5JbXBsMS5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL0pka0R5bmFtaWNQcm94eVNlcnZpY2VCZWFuSW1wbDEuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjZWM1MWQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL0pka0R5bmFtaWNQcm94eVNlcnZpY2VCZWFuSW1wbDEuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTQgQEAKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lOworCitjbGFzcyBKZGtEeW5hbWljUHJveHlTZXJ2aWNlQmVhbkltcGwxIGltcGxlbWVudHMgSmRrRHluYW1pY1Byb3h5U2VydmljZUJlYW4geworCisJSmRrRHluYW1pY1Byb3h5U2VydmljZUJlYW4gamRrRHluYW1pY1Byb3h5U2VydmljZUJlYW47CisKKwlTdHJpbmcgZG9TZXJ2aWNlICgpIHsKKwkJaWYgKGpka0R5bmFtaWNQcm94eVNlcnZpY2VCZWFuICE9IG51bGwpIHsKKwkJCXJldHVybiBqZGtEeW5hbWljUHJveHlTZXJ2aWNlQmVhbi5kb1NlcnZpY2UgKCk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gIlNFUlZJQ0UiOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9KZGtEeW5hbWljUHJveHlTZXJ2aWNlQmVhbkltcGwyLmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvSmRrRHluYW1pY1Byb3h5U2VydmljZUJlYW5JbXBsMi5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdkNzFiZQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvSmRrRHluYW1pY1Byb3h5U2VydmljZUJlYW5JbXBsMi5ncm9vdnkKQEAgLTAsMCArMSwxNCBAQAorcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWU7CisKK2NsYXNzIEpka0R5bmFtaWNQcm94eVNlcnZpY2VCZWFuSW1wbDIgaW1wbGVtZW50cyBKZGtEeW5hbWljUHJveHlTZXJ2aWNlQmVhbiB7CisJCisJSmRrRHluYW1pY1Byb3h5U2VydmljZUJlYW4gamRrRHluYW1pY1Byb3h5U2VydmljZUJlYW47CisKKwlTdHJpbmcgZG9TZXJ2aWNlICgpIHsKKwkJaWYgKGpka0R5bmFtaWNQcm94eVNlcnZpY2VCZWFuICE9IG51bGwpIHsKKwkJCXJldHVybiBqZGtEeW5hbWljUHJveHlTZXJ2aWNlQmVhbi5kb1NlcnZpY2UgKCk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gIlNFUlZJQ0UiOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9KZGtEeW5hbWljUHJveHlUZXN0LmphdmEgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL0pka0R5bmFtaWNQcm94eVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjdjMjJmCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9KZGtEeW5hbWljUHJveHlUZXN0LmphdmEKQEAgLTAsMCArMSwzMSBAQAorcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWU7CisKK2ltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlDbGFzc0xvYWRlcjsKK2ltcG9ydCBncm9vdnkudXRpbC5Hcm9vdnlUZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIEpka0R5bmFtaWNQcm94eVRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKwlwdWJsaWMgdm9pZCB0ZXN0SmRrRHluYW1pY1Byb3h5U2FtZUxvYWRlcigpIHRocm93cyBFeGNlcHRpb24geworCisJCS8vIEluc3RhbnRpYXRlIGFsbCBiZWFucy4KKyAgICAgICAgZmluYWwgR3Jvb3Z5Q2xhc3NMb2FkZXIgbG9hZGVyID0gbmV3IEdyb292eUNsYXNzTG9hZGVyKCk7CisgICAgICAgIEpka0R5bmFtaWNQcm94eVNlcnZpY2VCZWFuIHNiMSA9IChKZGtEeW5hbWljUHJveHlTZXJ2aWNlQmVhbikgSmRrRHluYW1pY1Byb3h5SW52b2NhdGlvbkhhbmRsZXIuZ2V0UHJveGllZE9iamVjdCAobG9hZGVyLmxvYWRDbGFzcyAoIm9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5KZGtEeW5hbWljUHJveHlTZXJ2aWNlQmVhbkltcGwxIikubmV3SW5zdGFuY2UgKCkgKTsKKwkJSmRrRHluYW1pY1Byb3h5U2VydmljZUJlYW4gc2IyID0gKEpka0R5bmFtaWNQcm94eVNlcnZpY2VCZWFuKSBKZGtEeW5hbWljUHJveHlJbnZvY2F0aW9uSGFuZGxlci5nZXRQcm94aWVkT2JqZWN0IChsb2FkZXIubG9hZENsYXNzICgib3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLkpka0R5bmFtaWNQcm94eVNlcnZpY2VCZWFuSW1wbDIiKS5uZXdJbnN0YW5jZSAoKSApOworCisJCS8vIE1hbnVhbGx5IHdpcmUgYmVhbnMgdG9nZXRoZXIuCisJCXNiMS5zZXRKZGtEeW5hbWljUHJveHlTZXJ2aWNlQmVhbiAoc2IyKTsKKwkJYXNzZXJ0RXF1YWxzICgiU0VSVklDRSIsIHNiMS5kb1NlcnZpY2UgKCkgKTsKKwl9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SmRrRHluYW1pY1Byb3h5RGlmZmVyZW50TG9hZGVycygpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIC8vIEluc3RhbnRpYXRlIGFsbCBiZWFucy4KKyAgICAgICAgSmRrRHluYW1pY1Byb3h5U2VydmljZUJlYW4gc2IxID0gKEpka0R5bmFtaWNQcm94eVNlcnZpY2VCZWFuKSBKZGtEeW5hbWljUHJveHlJbnZvY2F0aW9uSGFuZGxlci5nZXRQcm94aWVkT2JqZWN0IChuZXcgR3Jvb3Z5Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MgKCJvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuSmRrRHluYW1pY1Byb3h5U2VydmljZUJlYW5JbXBsMSIpLm5ld0luc3RhbmNlICgpICk7CisgICAgICAgIEpka0R5bmFtaWNQcm94eVNlcnZpY2VCZWFuIHNiMiA9IChKZGtEeW5hbWljUHJveHlTZXJ2aWNlQmVhbikgSmRrRHluYW1pY1Byb3h5SW52b2NhdGlvbkhhbmRsZXIuZ2V0UHJveGllZE9iamVjdCAobmV3IEdyb292eUNsYXNzTG9hZGVyKCkubG9hZENsYXNzICgib3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLkpka0R5bmFtaWNQcm94eVNlcnZpY2VCZWFuSW1wbDIiKS5uZXdJbnN0YW5jZSAoKSApOworCisgICAgICAgIC8vIE1hbnVhbGx5IHdpcmUgYmVhbnMgdG9nZXRoZXIuCisgICAgICAgIHNiMS5zZXRKZGtEeW5hbWljUHJveHlTZXJ2aWNlQmVhbiAoc2IyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzICgiU0VSVklDRSIsIHNiMS5kb1NlcnZpY2UgKCkgKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvTWV0YUNsYXNzSGVscGVyVGVzdC5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9NZXRhQ2xhc3NIZWxwZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I4YTYwMAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvTWV0YUNsYXNzSGVscGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTAgQEAKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lOw0KKw0KK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQorDQorcHVibGljIGNsYXNzIE1ldGFDbGFzc0hlbHBlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7DQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDbGFzc05hbWUoKSB7DQorICAgICAgICAvLyBHUk9PVlktMTI2Mg0KKyAgICAgICAgTWV0YUNsYXNzSGVscGVyLmdldENsYXNzTmFtZShudWxsKTsNCisgICAgfQ0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL01ldGhvZEZhaWx1cmVUZXN0LmphdmEgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL01ldGhvZEZhaWx1cmVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ2NzQwZAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvTWV0aG9kRmFpbHVyZVRlc3QuamF2YQpAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAkSWQkCisKKyBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAorIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0CisgICAgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhCisgICAgY29weSBvZiB0aGlzIGRvY3VtZW50LgorCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQorICAgIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKKyAgICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKKyAgICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCisgICAgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCisKKyA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IgorICAgIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQKKyAgICB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgorCisgNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KKyAgICBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMKKyBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKKyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCisgVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lOworCitpbXBvcnQgZ3Jvb3Z5LmxhbmcuQ2xvc3VyZTsKK2ltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlPYmplY3Q7CitpbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbjsKK2ltcG9ydCBncm9vdnkudXRpbC5Hcm9vdnlUZXN0Q2FzZTsKKworLyoqCisgKiBUZXN0cyBmYWlsaW5nIG1ldGhvZCBpbnZvY2F0aW9ucyB0byBlbnN1cmUgY29ycmVjdCBleGNlcHRpb25zCisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIE1ldGhvZEZhaWx1cmVUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgcHVibGljIHZvaWQgdGVzdEZhaWxpbmdNZXRob2QoKSB7CisgICAgICAgIE1vY2tHcm9vdnlPYmplY3Qgb2JqZWN0ID0gbmV3IE1vY2tHcm9vdnlPYmplY3QoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9iamVjdC5pbnZva2VNZXRob2QoIm5vbkV4aXN0ZW50TWV0aG9kIiwgImhlbGxvIik7CisKKyAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24iKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kV2hpY2hDYWxsc1RoZUZhaWxpbmdNZXRob2QoKSB7CisgICAgICAgIE1vY2tHcm9vdnlPYmplY3Qgb2JqZWN0ID0gbmV3IE1vY2tHcm9vdnlPYmplY3QoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9iamVjdC5pbnZva2VNZXRob2QoIm1ldGhvZFRoYXRGYWlscyIsIG51bGwpOworCisgICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uIik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEdyb292eVJ1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUpOworICAgICAgICAgICAgLy9lLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE1ldGhvZFdoaWNoQ2FsbHNUaGVGYWlsaW5nTWV0aG9kSW5zaWRlQUNsb3N1cmUoKSB7CisgICAgICAgIE1vY2tHcm9vdnlPYmplY3Qgb2JqZWN0ID0gbmV3IE1vY2tHcm9vdnlPYmplY3QoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9iamVjdC5pbnZva2VNZXRob2QoImNhbGxDbG9zdXJlIiwgbmV3IENsb3N1cmUodGhpcykgeworICAgICAgICAgICAgICAgIHByb3RlY3RlZCBPYmplY3QgZG9DYWxsKEdyb292eU9iamVjdCBvYmplY3QpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdC5pbnZva2VNZXRob2QoIm5vbkV4aXN0ZW50TWV0aG9kIiwgImhlbGxvIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24iKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoR3Jvb3Z5UnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZSk7CisgICAgICAgICAgICAvL2UucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvTWV0aG9kS2V5VGVzdC5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9NZXRob2RLZXlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNkNmM5YwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvTWV0aG9kS2V5VGVzdC5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgJElkJAorCisgQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQKKyB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIGNvcHlyaWdodAorICAgIHN0YXRlbWVudHMgYW5kIG5vdGljZXMuICBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYQorICAgIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KKworIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUKKyAgICBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCisgICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCisgICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworIDMuIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCisgICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLAorICAgIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLgorCisgNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIKKyAgICBub3IgbWF5ICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYSByZWdpc3RlcmVkCisgICAgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KKworIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtCisgICAgaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTCisgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECisgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTAorIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWU7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lLm1ldGFjbGFzcy5UZW1wb3JhcnlNZXRob2RLZXk7CisKKy8qKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIE1ldGhvZEtleVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEltcGxlbWVudGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE1ldGhvZEtleSBhID0gbmV3IERlZmF1bHRNZXRob2RLZXkoT2JqZWN0LmNsYXNzLCAiZm9vIiwgbmV3IENsYXNzW117T2JqZWN0LmNsYXNzLCBJbnRlZ2VyLmNsYXNzfSwgZmFsc2UpOworICAgICAgICBNZXRob2RLZXkgYTIgPSBuZXcgRGVmYXVsdE1ldGhvZEtleShPYmplY3QuY2xhc3MsICJmb28iLCBuZXcgQ2xhc3NbXXtPYmplY3QuY2xhc3MsIEludGVnZXIuY2xhc3N9LCBmYWxzZSk7CisgICAgICAgIE1ldGhvZEtleSBiID0gbmV3IERlZmF1bHRNZXRob2RLZXkoT2JqZWN0LmNsYXNzLCAiZm9vIiwgbmV3IENsYXNzW117T2JqZWN0LmNsYXNzfSwgZmFsc2UpOworICAgICAgICBNZXRob2RLZXkgYyA9IG5ldyBEZWZhdWx0TWV0aG9kS2V5KE9iamVjdC5jbGFzcywgImJhciIsIG5ldyBDbGFzc1tde09iamVjdC5jbGFzcywgSW50ZWdlci5jbGFzc30sIGZhbHNlKTsKKworICAgICAgICBhc3NlcnRDb21wYXJlKGEsIGEsIHRydWUpOworICAgICAgICBhc3NlcnRDb21wYXJlKGEsIGEyLCB0cnVlKTsKKyAgICAgICAgYXNzZXJ0Q29tcGFyZShiLCBiLCB0cnVlKTsKKworICAgICAgICBhc3NlcnRDb21wYXJlKGEsIGIsIGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0Q29tcGFyZShhLCBjLCBmYWxzZSk7CisgICAgICAgIGFzc2VydENvbXBhcmUoYiwgYywgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RUZW1wb3JhcnlJbXBsZW1lbnRhdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBNZXRob2RLZXkgYSA9IG5ldyBEZWZhdWx0TWV0aG9kS2V5KE9iamVjdC5jbGFzcywgImZvbyIsIG5ldyBDbGFzc1tde09iamVjdC5jbGFzcywgSW50ZWdlci5jbGFzc30sIGZhbHNlKTsKKyAgICAgICAgTWV0aG9kS2V5IGEyID0gbmV3IFRlbXBvcmFyeU1ldGhvZEtleShPYmplY3QuY2xhc3MsICJmb28iLCBuZXcgT2JqZWN0W117bmV3IE9iamVjdCgpLCBuZXcgSW50ZWdlcigxKX0sIGZhbHNlKTsKKyAgICAgICAgTWV0aG9kS2V5IGIgPSBuZXcgVGVtcG9yYXJ5TWV0aG9kS2V5KE9iamVjdC5jbGFzcywgImZvbyIsIG5ldyBPYmplY3RbXXtuZXcgT2JqZWN0KCl9LCBmYWxzZSk7CisgICAgICAgIE1ldGhvZEtleSBjID0gbmV3IFRlbXBvcmFyeU1ldGhvZEtleShPYmplY3QuY2xhc3MsICJiYXIiLCBuZXcgT2JqZWN0W117bmV3IE9iamVjdCgpLCBuZXcgSW50ZWdlcigxKX0sIGZhbHNlKTsKKworICAgICAgICBhc3NlcnRDb21wYXJlKGEsIGEsIHRydWUpOworICAgICAgICBhc3NlcnRDb21wYXJlKGEsIGEyLCB0cnVlKTsKKyAgICAgICAgYXNzZXJ0Q29tcGFyZShiLCBiLCB0cnVlKTsKKworICAgICAgICBhc3NlcnRDb21wYXJlKGEsIGIsIGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0Q29tcGFyZShhLCBjLCBmYWxzZSk7CisgICAgICAgIGFzc2VydENvbXBhcmUoYiwgYywgZmFsc2UpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydENvbXBhcmUoT2JqZWN0IGEsIE9iamVjdCBiLCBib29sZWFuIGV4cGVjdGVkKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiQ29tcGFyZSAiICsgYSArICIgdG8gIiArIGIsIGV4cGVjdGVkLCBhLmVxdWFscyhiKSk7CisgICAgICAgIGlmIChleHBlY3RlZCkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJoYXNoQ29kZSAiICsgYSArICIgdG8gIiArIGIsIGEuaGFzaENvZGUoKSwgYi5oYXNoQ29kZSgpKTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL01pbnVzVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL01pbnVzVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ3OGFiOQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvTWludXNUZXN0Lmdyb292eQpAQCAtMCwwICsxLDg0IEBACisKK2NsYXNzIE1pbnVzVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworCXZvaWQgZG9UZXN0TWludXMoU3RyaW5nIHR5cGUsIGRlZiBhLCBiLCBjLCBkKSB7CisJCWFzc2VydEVxdWFscyh0eXBlLCBbIGEsIGIgXSwgWyBhLCBiLCBjIF0gLSBbIGMgXSkKKwkJYXNzZXJ0RXF1YWxzKHR5cGUsIFsgYSwgYiBdLCBbIGEsIGIsIGMgXSAtIFsgYywgZCBdKQorCQlhc3NlcnRFcXVhbHModHlwZSwgW10sIFsgYSwgYiwgYyBdIC0gWyBhLCBiLCBjIF0pCisJCWFzc2VydEVxdWFscyh0eXBlLCBbXSwgWyBhLCBiLCBjIF0gLSBbIGMsIGIsIGEgXSkKKwkJYXNzZXJ0RXF1YWxzKHR5cGUsIFsgYSwgYiwgYyBdLCBbIGEsIGIsIGMgXSAtIFtdKQorCQlhc3NlcnRFcXVhbHModHlwZSwgW10sIFtdIC0gWyBhLCBiLCBjIF0pCisJfQorCisJdm9pZCBkb1Rlc3RNaW51c0R1cHBsaWNhdGVzKFN0cmluZyB0eXBlLCBkZWYgYSwgYiwgYywgZCkgeworCQlhc3NlcnRFcXVhbHModHlwZSwgW2EsIGFdLCBbYSwgYV0gLSBbXSkKKwkJYXNzZXJ0RXF1YWxzKHR5cGUsIFthLCBiLCBiLCBjXSwgW2EsIGIsIGIsIGNdIC0gW10pCisJCWFzc2VydEVxdWFscyh0eXBlLCBbYiwgYiwgY10sIFthLCBiLCBiLCBjXSAtIFthXSkKKwkJYXNzZXJ0RXF1YWxzKHR5cGUsIFthXSwgW2EsIGIsIGIsIGNdIC0gW2IsIGNdKQorCQlhc3NlcnRFcXVhbHModHlwZSwgW10sIFthXSAtIFsgYSwgYSBdKQorCX0KKworCXZvaWQgZG9UZXN0TWludXNXaXRoTnVsbChTdHJpbmcgdHlwZSwgZGVmIGEsIGIsIGMsIGQpIHsKKwkJYXNzZXJ0RXF1YWxzKHR5cGUsIFsgYSwgYiwgYyBdLCBbIGEsIGIsIGMgXSAtIFsgbnVsbCBdKQorCQlhc3NlcnRFcXVhbHModHlwZSwgWyBhLCBiLCBjIF0sIFsgYSwgYiwgYyAsIG51bGxdIC0gWyBudWxsIF0pCisJCWFzc2VydEVxdWFscyh0eXBlLCBbIGEsIGIgXSwgWyBhLCBiLCBjLCBudWxsIF0gLSBbIG51bGwsIGMgXSkKKwkJYXNzZXJ0RXF1YWxzKHR5cGUsIFtdLCBbXSAtIFsgYSwgYiwgYywgbnVsbCBdKQorCQlhc3NlcnRFcXVhbHModHlwZSwgWyBhLCBiLCBjLCBudWxsIF0sIFsgYSwgYiwgYywgbnVsbCBdIC0gWyBdKQorCQlhc3NlcnRFcXVhbHModHlwZSwgWyBhLCBiLCBudWxsIF0sIFsgYSwgYiwgYywgbnVsbCBdIC0gWyBjIF0pCisJfQorCisJdm9pZCB0ZXN0TWludXNDb21wYXJhYmxlKCkgeworCSAgICBkZWYgYSA9ICdhJworCSAgICBkZWYgYiA9ICdiJworCSAgICBkZWYgYyA9ICdjJworCSAgICBkZWYgZCA9ICdkJworCSAgICAKKwkgICAgZG9UZXN0TWludXMoJ0NvbXBhcmFibGUnLCBhLCBiLCBjLCBkKQorCSAgICBkb1Rlc3RNaW51c0R1cHBsaWNhdGVzKCdDb21wYXJhYmxlJywgYSwgYiwgYywgZCkKKwkgICAgZG9UZXN0TWludXNXaXRoTnVsbCgnQ29tcGFyYWJsZScsIGEsIGIsIGMsIGQpCisJfQorCQorCXZvaWQgdGVzdE1pbnVzTnVtYmVyKCkgeworCSAgICBkZWYgYSA9IDEKKwkgICAgZGVmIGIgPSAyCisJICAgIGRlZiBjID0gMworCSAgICBkZWYgZCA9IDQKKwkgICAgCisJICAgIGRvVGVzdE1pbnVzKCdOdW1iZXInLCBhLCBiLCBjLCBkKQorCSAgICBkb1Rlc3RNaW51c0R1cHBsaWNhdGVzKCdOdW1iZXInLCBhLCBiLCBjLCBkKQorCSAgICBkb1Rlc3RNaW51c1dpdGhOdWxsKCdOdW1iZXInLCBhLCBiLCBjLCBkKQorCX0KKworCXZvaWQgdGVzdE1pbnVzTnVtYmVyc01peGVkKCkgeworCSAgICBkZWYgYSA9IDEKKwkgICAgZGVmIGIgPSBuZXcgQmlnSW50ZWdlcignMicpCisJICAgIGRlZiBjID0gMy4wZAorCSAgICBkZWYgZCA9IG5ldyBCaWdEZWNpbWFsKCc0LjAnKQorCSAgICAKKwkgICAgZG9UZXN0TWludXMoJ051bWJlcnNNaXhlZCcsIGEsIGIsIGMsIGQpCisJICAgIGRvVGVzdE1pbnVzRHVwcGxpY2F0ZXMoJ051bWJlcnNNaXhlZCcsIGEsIGIsIGMsIGQpCisJICAgIGRvVGVzdE1pbnVzV2l0aE51bGwoJ051bWJlcnNNaXhlZCcsIGEsIGIsIGMsIGQpCisJfQorCisJdm9pZCB0ZXN0TWludXNOb25Db21wYXJhYmxlKCkgeworCSAgICBkZWYgYSA9IG5ldyBPYmplY3QoKQorCSAgICBkZWYgYiA9IG5ldyBPYmplY3QoKQorCSAgICBkZWYgYyA9IG5ldyBPYmplY3QoKQorCSAgICBkZWYgZCA9IG5ldyBPYmplY3QoKQorCSAgICAKKwkgICAgZG9UZXN0TWludXMoJ05vbkNvbXBhcmFibGUnLCBhLCBiLCBjLCBkKQorCSAgICBkb1Rlc3RNaW51c0R1cHBsaWNhdGVzKCdOb25Db21wYXJhYmxlJywgYSwgYiwgYywgZCkKKwkgICAgZG9UZXN0TWludXNXaXRoTnVsbCgnTm9uQ29tcGFyYWJsZScsIGEsIGIsIGMsIGQpCisJfQorCSAgICAKKwl2b2lkIHRlc3RNaW51c01peGVkKCkgeworCSAgICBkZWYgYSA9IG5ldyBPYmplY3QoKQorCSAgICBkZWYgYiA9IDIKKwkgICAgZGVmIGMgPSAnMycKKwkgICAgZGVmIGQgPSBuZXcgQmlnRGVjaW1hbCgnNC4wJykKKwkgICAgCisJICAgIGRvVGVzdE1pbnVzKCdNaXhlZCcsIGEsIGIsIGMsIGQpCisJICAgIGRvVGVzdE1pbnVzRHVwcGxpY2F0ZXMoJ01peGVkJywgYSwgYiwgYywgZCkKKwkgICAgZG9UZXN0TWludXNXaXRoTnVsbCgnTWl4ZWQnLCBhLCBiLCBjLCBkKQorCX0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvTW9ja0dyb292eU9iamVjdC5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9Nb2NrR3Jvb3Z5T2JqZWN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE2YzJlZAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvTW9ja0dyb292eU9iamVjdC5qYXZhCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgJElkJAorCisgQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQKKyB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIGNvcHlyaWdodAorICAgIHN0YXRlbWVudHMgYW5kIG5vdGljZXMuICBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYQorICAgIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KKworIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUKKyAgICBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCisgICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCisgICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworIDMuIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCisgICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLAorICAgIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLgorCisgNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIKKyAgICBub3IgbWF5ICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYSByZWdpc3RlcmVkCisgICAgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KKworIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtCisgICAgaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTCisgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECisgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTAorIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAqLworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZTsKKworaW1wb3J0IGdyb292eS5sYW5nLkNsb3N1cmU7CitpbXBvcnQgZ3Jvb3Z5LmxhbmcuR3Jvb3Z5T2JqZWN0U3VwcG9ydDsKKworLyoqCisgKiBBIFBPR08gdXNlZCBieSB0aGUgdGVzdCBjYXNlcworICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBNb2NrR3Jvb3Z5T2JqZWN0IGV4dGVuZHMgR3Jvb3Z5T2JqZWN0U3VwcG9ydCB7CisKKyAgICBwdWJsaWMgT2JqZWN0IG1ldGhvZFRoYXRGYWlscygpIHsKKyAgICAgICAgcmV0dXJuIGludm9rZU1ldGhvZCgibm9uRXhpc3RlbnRNZXRob2QiLCAiaGVsbG8iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGNhbGxDbG9zdXJlKENsb3N1cmUgY2xvc3VyZSkgeworICAgICAgICByZXR1cm4gY2xvc3VyZS5jYWxsKHRoaXMpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9OZXN0ZWRDYXRlZ29yeVRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9OZXN0ZWRDYXRlZ29yeVRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NDA2ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL05lc3RlZENhdGVnb3J5VGVzdC5ncm9vdnkKQEAgLTAsMCArMSw2NSBAQAorcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUNCisNCitpbXBvcnQgZ3Jvb3Z5LnV0aWwuR3Jvb3Z5VGVzdENhc2UNCisNCisNCitjbGFzcyBOZXN0ZWRDYXRlZ29yeVRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZXsNCisgICB2b2lkIHRlc3RHcmVldGVyX3BsYWluKCl7DQorCSAgIGRlZiBncmVldGVyID0gbmV3IEdyZWV0ZXIoKTsNCisJICAgYXNzZXJ0RXF1YWxzICJIZWxsbyBHcm9vdnkhIiwgZ3JlZXRlci5ncmVldCgpOw0KKwl9DQorDQorCXZvaWQgdGVzdEdyZWV0ZXJfd2l0aE9uZSgpew0KKwkgICBkZWYgZ3JlZXRlciA9IG5ldyBHcmVldGVyKCk7DQorCSAgIGFzc2VydEVxdWFscyAiSGVsbG8gR3Jvb3Z5ISIsIGdyZWV0ZXIuZ3JlZXQoKTsNCisJICAgdXNlKCBDYXRlZ29yeU9uZS5jbGFzcyApew0KKwkgICAgICBhc3NlcnRFcXVhbHMgIkhlbGxvIGZyb20gT25lIiwgZ3JlZXRlci5ncmVldCgpOw0KKwkgICB9DQorCSAgIGFzc2VydEVxdWFscyAiSGVsbG8gR3Jvb3Z5ISIsIGdyZWV0ZXIuZ3JlZXQoKTsNCisJfQ0KKw0KKwl2b2lkIHRlc3RHcmVldGVyX3dpdGhUd28oKXsNCisJICAgZGVmIGdyZWV0ZXIgPSBuZXcgR3JlZXRlcigpOw0KKwkgICBhc3NlcnRFcXVhbHMgIkhlbGxvIEdyb292eSEiLCBncmVldGVyLmdyZWV0KCk7DQorCSAgIHVzZSggQ2F0ZWdvcnlUd28uY2xhc3MgKXsNCisJICAgICAgYXNzZXJ0RXF1YWxzICJIZWxsbyBmcm9tIFR3byIsIGdyZWV0ZXIuZ3JlZXQoKTsNCisJICAgfQ0KKwkgICBhc3NlcnRFcXVhbHMgIkhlbGxvIEdyb292eSEiLCBncmVldGVyLmdyZWV0KCk7DQorCX0NCisNCisJdm9pZCB0ZXN0R3JlZXRlcl93aXRoT25lQW5kVHdvX25lc3RlZCgpew0KKwkgICAvLyBmYWlscyENCisJICAgZGVmIGdyZWV0ZXIgPSBuZXcgR3JlZXRlcigpOw0KKwkgICBhc3NlcnRFcXVhbHMgIkhlbGxvIEdyb292eSEiLCBncmVldGVyLmdyZWV0KCk7DQorCSAgIHVzZSggQ2F0ZWdvcnlPbmUuY2xhc3MgKXsNCisJICAgICAgYXNzZXJ0RXF1YWxzICJIZWxsbyBmcm9tIE9uZSIsIGdyZWV0ZXIuZ3JlZXQoKTsNCisJICAgICAgdXNlKCBDYXRlZ29yeVR3by5jbGFzcyApew0KKwkgICAgICAgICBhc3NlcnRFcXVhbHMgIkhlbGxvIGZyb20gVHdvIiwgZ3JlZXRlci5ncmVldCgpOw0KKwkgICAgICB9DQorCSAgICAgIGFzc2VydEVxdWFscyAiSGVsbG8gZnJvbSBPbmUiLCBncmVldGVyLmdyZWV0KCk7DQorCSAgIH0NCisJICAgYXNzZXJ0RXF1YWxzICJIZWxsbyBHcm9vdnkhIiwgZ3JlZXRlci5ncmVldCgpOw0KKwl9DQorfQ0KKw0KK2NsYXNzIEdyZWV0ZXJ7DQorICAgIFN0cmluZyBncmVldCgpew0KKyAgICAgICByZXR1cm4gIkhlbGxvIEdyb292eSEiOw0KKyAgICB9DQorDQorICAgIFN0cmluZyBzYXkoIFN0cmluZyBzICl7DQorICAgICAgIHJldHVybiAiSSBzYXk6ICIrIHM7DQorICAgIH0NCisgfQ0KKw0KKyBjbGFzcyBDYXRlZ29yeU9uZXsNCisgICAgc3RhdGljIFN0cmluZyBncmVldCggR3JlZXRlciBzZWxmICl7DQorICAgICAgIHJldHVybiAiSGVsbG8gZnJvbSBPbmUiOw0KKyAgICB9DQorIH0NCisNCisgY2xhc3MgQ2F0ZWdvcnlUd297DQorICAgIHN0YXRpYyBTdHJpbmcgZ3JlZXQoIEdyZWV0ZXIgc2VsZiApew0KKyAgICAgICByZXR1cm4gIkhlbGxvIGZyb20gVHdvIjsNCisgICAgfQ0KKyB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9OZXdTdGF0aWNNZXRhTWV0aG9kVGVzdC5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9OZXdTdGF0aWNNZXRhTWV0aG9kVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZjA1MDEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL05ld1N0YXRpY01ldGFNZXRob2RUZXN0LmphdmEKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgJElkJAorCisgQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAoIlNvZnR3YXJlIiksIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQKKyB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIGNvcHlyaWdodAorICAgIHN0YXRlbWVudHMgYW5kIG5vdGljZXMuICBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYQorICAgIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KKworIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUKKyAgICBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlCisgICAgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyCisgICAgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworIDMuIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCisgICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLAorICAgIHBsZWFzZSBjb250YWN0IGluZm9AY29kZWhhdXMub3JnLgorCisgNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIKKyAgICBub3IgbWF5ICJncm9vdnkiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gImdyb292eSIgaXMgYSByZWdpc3RlcmVkCisgICAgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4KKworIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtCisgICAgaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcvCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTCisgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECisgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTAorIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWU7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5yZWZsZWN0aW9uLkNhY2hlZE1ldGhvZDsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUubWV0YWNsYXNzLk5ld0luc3RhbmNlTWV0YU1ldGhvZDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKKworLyoqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgTmV3U3RhdGljTWV0YU1ldGhvZFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlTWV0YU1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBNZXRob2QgbWV0aG9kID0gZ2V0Q2xhc3MoKS5nZXRNZXRob2QoImR1bW15TWV0aG9kIiwgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3N9KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiU2hvdWxkIGhhdmUgZm91bmQgYSBtZXRob2QiLCBtZXRob2QgIT0gbnVsbCk7CisKKyAgICAgICAgTmV3SW5zdGFuY2VNZXRhTWV0aG9kIG1ldGFNZXRob2QgPSBjcmVhdGVOZXdNZXRhTWV0aG9kKG1ldGhvZCk7CisKKyAgICAgICAgT2JqZWN0IGFuc3dlciA9IG1ldGFNZXRob2QuaW52b2tlKCJhYmMiLCBuZXcgT2JqZWN0W117Inh5eiJ9KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJkZWYiLCBhbnN3ZXIpOworCisgICAgICAgIGFzc2VydFRydWUoIlNob3VsZCBub3QgYXBwZWFyIGFzIHN0YXRpYyBtZXRob2QiLCAhbWV0YU1ldGhvZC5pc1N0YXRpYygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlRGVmYXVsdEdyb292eU1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBNZXRob2QgbWV0aG9kID0gRGVmYXVsdEdyb292eU1ldGhvZHMuY2xhc3MuZ2V0TWV0aG9kKCJwbHVzIiwgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzLCBPYmplY3QuY2xhc3N9KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiU2hvdWxkIGhhdmUgZm91bmQgYSBtZXRob2QiLCBtZXRob2QgIT0gbnVsbCk7CisKKyAgICAgICAgTmV3SW5zdGFuY2VNZXRhTWV0aG9kIG1ldGFNZXRob2QgPSBjcmVhdGVOZXdNZXRhTWV0aG9kKG1ldGhvZCk7CisKKyAgICAgICAgT2JqZWN0IGFuc3dlciA9IG1ldGFNZXRob2QuaW52b2tlKCJhYmMiLCBuZXcgT2JqZWN0W117IjEyMyJ9KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhYmMxMjMiLCBhbnN3ZXIpOworCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRm91bmQ6ICIgKyBhbnN3ZXIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZva2VEZWZhdWx0R3Jvb3Z5TWV0aG9kVXNpbmdNZXRhQ2xhc3MoKSB7CisgICAgICAgIE9iamVjdCBhbnN3ZXIgPSBJbnZva2VySGVscGVyLmludm9rZU1ldGhvZCgiYWJjIiwgInBsdXMiLCBuZXcgT2JqZWN0W117IjEyMyJ9KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhYmMxMjMiLCBhbnN3ZXIpOworCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRm91bmQ6ICIgKyBhbnN3ZXIpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGR1bW15TWV0aG9kKFN0cmluZyBmb28sIFN0cmluZyBiYXIpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoImFiYyIsIGZvbyk7CisgICAgICAgIGFzc2VydEVxdWFscygieHl6IiwgYmFyKTsKKyAgICAgICAgcmV0dXJuICJkZWYiOworICAgIH0KKworICAgIHByb3RlY3RlZCBOZXdJbnN0YW5jZU1ldGFNZXRob2QgY3JlYXRlTmV3TWV0YU1ldGhvZChNZXRob2QgbWV0aG9kKSB7CisgICAgICAgIHJldHVybiBuZXcgTmV3SW5zdGFuY2VNZXRhTWV0aG9kKENhY2hlZE1ldGhvZC5maW5kKG1ldGhvZCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvTnVsbE9iamVjdFRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9OdWxsT2JqZWN0VGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYzNDMyMwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvTnVsbE9iamVjdFRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsNTUgQEAKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lCisKK2NsYXNzIE51bGxPYmplY3RUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworICAgIHZvaWQgdGVzdENhbGxpbmdNZXRob2QoKSB7CisgICAgICAgIGRlZiBmb28gPSBudWxsCisgICAgICAgIHRyeSB7CisgICAgICAgICAgcHJpbnRsbiBmb28uYmFyCisgICAgICAgICAgYXNzZXJ0IGZhbHNlICAvLyBzaG91bGQgdGhyb3cgZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgLy8gaXMgc3VjY2Vzc2Z1bGwKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICB2b2lkIHRlc3R0b1N0cmluZ01ldGhvZCgpIHsKKyAgICAgICAgZGVmIGZvbyA9IG51bGwKKyAgICAgICAgYXNzZXJ0IGZvby50b1N0cmluZygpID09ICJudWxsIgorICAgIH0KKworICAgIHZvaWQgdGVzdEVxdWFscygpIHsKKyAgICAgICAgZGVmIGEgPSBbMV0KKyAgICAgICAgYXNzZXJ0IGFbM10gPT0gYVs0XQorICAgICAgICBhc3NlcnQgYVsyXS5lcXVhbHMoYVs0XSkKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0QXNFeHByZXNzaW9uKCkgeworICAgICAgYXNzZXJ0IG51bGwgYXMgU3RyaW5nID09IG51bGwKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0SXMoKXsKKyAgICAgIGFzc2VydCBudWxsLmlzKG51bGwpCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdENhdGVnb3J5KCkgeworICAgICAgICBkZWYgbiA9IG51bGwKKworICAgICAgICBhc3NlcnQgImEgJG4gYiIgPT0gImEgbnVsbCBiIgorICAgICAgICAgICAgYXNzZXJ0IG4udG9TdHJpbmcoKSA9PSAibnVsbCIKKyAgICAgICAgICAgIGFzc2VydCBuICsgIiBpcyBhIG51bGwgdmFsdWUiID09ICJudWxsIGlzIGEgbnVsbCB2YWx1ZSIKKyAgICAgICAgICAgIGFzc2VydCAidGhpcyBpcyBhIG51bGwgdmFsdWUgIiArIG51bGwgPT0gInRoaXMgaXMgYSBudWxsIHZhbHVlIG51bGwiCisKKyAgICAgICAgICAgIHVzZSAoTXlDYXRlZ29yeSkgeworICAgICAgICAgICAgICAgIGFzc2VydCAiYSAkbiBiIiA9PSAiYSAgYiIKKyAgICAgICAgICAgICAgICBhc3NlcnQgbi50b1N0cmluZygpID09ICIiCisgICAgICAgICAgICAgICAgYXNzZXJ0IG4gKyAiIGlzIGEgbnVsbCB2YWx1ZSIgPT0gIiBpcyBhIG51bGwgdmFsdWUiCisgICAgICAgICAgICAgICAgYXNzZXJ0ICJ0aGlzIGlzIGEgbnVsbCB2YWx1ZSAiICsgbnVsbCA9PSAidGhpcyBpcyBhIG51bGwgdmFsdWUgIgorICAgICAgICAgICAgfQorICAgICAgICB9IAorfQorCitjbGFzcyBNeUNhdGVnb3J5IHsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZyhOdWxsT2JqZWN0IG9iaikgeworICAgICAgICByZXR1cm4gIiIKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvUHJvcGVydHlUZXN0LmphdmEgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL1Byb3BlcnR5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MWFhOTMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL1Byb3BlcnR5VGVzdC5qYXZhCkBAIC0wLDAgKzEsMjU5IEBACisvKgorICRJZCQKKworIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCisgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQKKyAgICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKKyAgICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCisgICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQorICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgorICAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKKyAgICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KKworIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCisgICAgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAorICAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCisKKyA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQorICAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLworCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUworIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAorIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKKyBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgKi8KKworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWU7CisKK2ltcG9ydCBncm9vdnkubGFuZy5NaXNzaW5nTWV0aG9kRXhjZXB0aW9uOworaW1wb3J0IGdyb292eS51dGlsLkdyb292eVRlc3RDYXNlOworaW1wb3J0IGdyb292eS51dGlsLk5vZGU7CisKK2ltcG9ydCBqYXZheC5zd2luZy4qOworaW1wb3J0IGphdmEuYXd0Lio7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIFRlc3QgdGhlIHByb3BlcnR5IGFjY2VzcyBvZiB0aGUgSW52b2tlciBjbGFzcworICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBQcm9wZXJ0eVRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICBwcm90ZWN0ZWQgSW52b2tlciBpbnZva2VyID0gbmV3IEludm9rZXIoKTsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RNYXBQcm9wZXJ0aWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICBtYXAucHV0KCJmb28iLCAiYWJjIik7CisgICAgICAgIG1hcC5wdXQoImJhciIsIG5ldyBJbnRlZ2VyKDEyMykpOworCisgICAgICAgIGFzc2VydEdldFNldFByb3BlcnR5KG1hcCwgImZvbyIsICJhYmMiLCAiZGVmIik7CisgICAgICAgIGFzc2VydEdldFNldFByb3BlcnR5KG1hcCwgImJhciIsIG5ldyBJbnRlZ2VyKDEyMyksIG5ldyBEb3VibGUoMTIuMzQpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmVhblByb3BlcnRpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRHVtbXlCZWFuIGJlYW4gPSBuZXcgRHVtbXlCZWFuKCk7CisKKyAgICAgICAgYXNzZXJ0R2V0U2V0UHJvcGVydHkoYmVhbiwgIm5hbWUiLCAiSmFtZXMiLCAiQm9iIik7CisgICAgICAgIGFzc2VydEdldFNldFByb3BlcnR5KGJlYW4sICJpIiwgbmV3IEludGVnZXIoMTIzKSwgbmV3IEludGVnZXIoNDU1KSk7CisKKyAgICAgICAgLy8gZHluYW1pYyBwcm9wZXJ0aWVzCisgICAgICAgIGFzc2VydEdldFNldFByb3BlcnR5KGJlYW4sICJkeW5hbWljRm9vIiwgbnVsbCwgImFWYWx1ZSIpOworICAgICAgICBhc3NlcnRHZXRTZXRQcm9wZXJ0eShiZWFuLCAiZHluYW1pY0ZvbyIsICJhVmFsdWUiLCAiTmV3VmFsdWUiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0b2RvIHRoaXMgaXMgbm8gbG9uZ2VyIHBvc3NpYmxlIGluIG5ldyBncm9vdnkKKyAgICAgKiBwdWJsaWMgdm9pZCB0ZXN0VXNpbmdNZXRob2RQcm9wZXJ0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAqIER1bW15QmVhbiBiZWFuID0gbmV3IER1bW15QmVhbigpOworICAgICAqIDxwLz4KKyAgICAgKiBhc3NlcnRHZXRTZXRQcm9wZXJ0eShiZWFuLCAibmFtZSIsICJKYW1lcyIsICJCb2IiKTsKKyAgICAgKiA8cC8+CisgICAgICogT2JqZWN0IHZhbHVlID0gSW52b2tlckhlbHBlci5nZXRQcm9wZXJ0eShiZWFuLCAiZ2V0TmFtZSIpOworICAgICAqIGFzc2VydFRydWUoIlNob3VsZCBoYXZlIHJldHVybmVkIGEgY2xvc3VyZTogIiArIHZhbHVlLCB2YWx1ZSBpbnN0YW5jZW9mIENsb3N1cmUpOworICAgICAqIENsb3N1cmUgY2xvc3VyZSA9IChDbG9zdXJlKSB2YWx1ZTsKKyAgICAgKiBPYmplY3QgcmVzdWx0ID0gY2xvc3VyZS5jYWxsKG51bGwpOworICAgICAqIGFzc2VydEVxdWFscygiUmVzdWx0IG9mIGNhbGwgdG8gY2xvc3VyZSIsICJCb2IiLCByZXN1bHQpOworICAgICAqIH0KKyAgICAgKi8KKworCisgICAgcHVibGljIHZvaWQgdGVzdFN0YXRpY1Byb3BlcnR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE9iamVjdCB2YWx1ZSA9IEludm9rZXJIZWxwZXIuZ2V0UHJvcGVydHkoU3lzdGVtLmNsYXNzLCAib3V0Iik7CisgICAgICAgIGFzc2VydEVxdWFscygic3RhdGljIHByb3BlcnR5IG91dCIsIFN5c3RlbS5vdXQsIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NQcm9wZXJ0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDbGFzcyBjID0gU3RyaW5nLmNsYXNzOworICAgICAgICBPYmplY3QgdmFsdWUgPSBJbnZva2VySGVscGVyLmdldFByb3BlcnR5KGMsICJuYW1lIik7CisgICAgICAgIGFzc2VydEVxdWFscygiY2xhc3MgbmFtZSBwcm9wZXJ0eSIsIGMuZ2V0TmFtZSgpLCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE1hcEVudHJ5UHJvcGVydHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSGFzaE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICBtYXAucHV0KCJhIiwgIngiKTsKKyAgICAgICAgT2JqZWN0W10gYXJyYXkgPSBtYXAuZW50cnlTZXQoKS50b0FycmF5KCk7CisgICAgICAgIE9iamVjdCBlbnRyeSA9IGFycmF5WzBdOworCisgICAgICAgIE9iamVjdCBrZXkgPSBJbnZva2VySGVscGVyLmdldFByb3BlcnR5KGVudHJ5LCAia2V5Iik7CisgICAgICAgIGFzc2VydEVxdWFscygia2V5IHByb3BlcnR5IiwgImEiLCBrZXkpOworCisgICAgICAgIE9iamVjdCB2YWx1ZSA9IEludm9rZXJIZWxwZXIuZ2V0UHJvcGVydHkoZW50cnksICJ2YWx1ZSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlIHByb3BlcnR5IiwgIngiLCB2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogdG9kbyB0aGlzIGlzIG5vIGxvbmdlciBwb3NzaWJsZSBpbiBuZXcgZ3Jvb3Z5CisgICAgICogcHVibGljIHZvaWQgdGVzdE1ldGhvZFByb3BlcnR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICogT2JqZWN0IHZhbHVlID0gSW52b2tlckhlbHBlci5nZXRQcm9wZXJ0eSh0aGlzLCAiZ2V0Q2hlZXNlIik7CisgICAgICogYXNzZXJ0VHJ1ZSgiU2hvdWxkIGhhdmUgcmV0dXJuZWQgYSBjbG9zdXJlOiAiICsgdmFsdWUsIHZhbHVlIGluc3RhbmNlb2YgQ2xvc3VyZSk7CisgICAgICogPHAvPgorICAgICAqIE9iamVjdCByZXN1bHQgPSAoKENsb3N1cmUpIHZhbHVlKS5jYWxsKCk7CisgICAgICogYXNzZXJ0RXF1YWxzKCJyZXN1bHQgb2YgY2xvc3VyZSBjYWxsIiwgZ2V0Q2hlZXNlKCksIHJlc3VsdCk7CisgICAgICogPHAvPgorICAgICAqIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xvc3VyZTogIiArIHZhbHVlICsgIiBhbmQgY2hlZXNlOiAiICsgcmVzdWx0KTsKKyAgICAgKiB9CisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGlzdENvZXJjaW9uUHJvcGVydHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRHVtbXlCZWFuIGJlYW4gPSBuZXcgRHVtbXlCZWFuKCk7CisgICAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgbGlzdC5hZGQobmV3IEludGVnZXIoMTApKTsKKyAgICAgICAgbGlzdC5hZGQobmV3IEludGVnZXIoMjApKTsKKworICAgICAgICBJbnZva2VySGVscGVyLnNldFByb3BlcnR5KGJlYW4sICJwb2ludCIsIGxpc3QpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlNob3VsZCBoYXZlIHNldCBhIHBvaW50IiwgbmV3IFBvaW50KDEwLCAyMCksIGJlYW4uZ2V0UG9pbnQoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExpc3RDb2VyY2lvblByb3BlcnR5T25KRnJhbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEpGcmFtZSBiZWFuID0gbmV3IEpGcmFtZSgpOworICAgICAgICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgbGlzdC5hZGQobmV3IEludGVnZXIoMTApKTsKKyAgICAgICAgICAgIGxpc3QuYWRkKG5ldyBJbnRlZ2VyKDIwKSk7CisKKyAgICAgICAgICAgIEludm9rZXJIZWxwZXIuc2V0UHJvcGVydHkoYmVhbiwgImxvY2F0aW9uIiwgbGlzdCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlNob3VsZCBoYXZlIHNldCBhIHBvaW50IiwgbmV3IFBvaW50KDEwLCAyMCksIGJlYW4uZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEhlYWRsZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGl0cyBmaW5lIHRvIG5vdCBydW4gdGhpcyB0ZXN0IG9uIGhlYWRsZXNzIGVudmlyb25tZW50cworICAgICAgICB9CisgICAgICAgIGNhdGNoIChNaXNzaW5nTWV0aG9kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmFpbGVkIHdpdGggY2F1c2U6ICIgKyBlKTsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBmYWlsKCJTaG91bGQgbm90IGhhdmUgdGhyb3c6ICIgKyBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0TmF2aWdhdGlvblByb3BlcnR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgbGlzdC5hZGQobmV3IER1bW15QmVhbigiSmFtZXMiKSk7CisgICAgICAgIGxpc3QuYWRkKG5ldyBEdW1teUJlYW4oIkJvYiIpKTsKKworICAgICAgICBMaXN0IHZhbHVlID0gKExpc3QpIEludm9rZXJIZWxwZXIuZ2V0UHJvcGVydHkobGlzdCwgIm5hbWUiKTsKKyAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMobmV3IE9iamVjdFtdeyJKYW1lcyIsICJCb2IifSwgdmFsdWUudG9BcnJheSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGlzdE9mTGlzdE5hdmlnYXRpb25Qcm9wZXJ0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGxpc3QuYWRkKG5ldyBEdW1teUJlYW4oIkphbWVzIikpOworICAgICAgICBsaXN0LmFkZChuZXcgRHVtbXlCZWFuKCJCb2IiKSk7CisKKyAgICAgICAgTGlzdCBsaXN0T2ZMaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBsaXN0T2ZMaXN0LmFkZChsaXN0KTsKKworICAgICAgICBMaXN0IHZhbHVlID0gKExpc3QpIEludm9rZXJIZWxwZXIuZ2V0UHJvcGVydHkobGlzdE9mTGlzdCwgIm5hbWUiKTsKKyAgICAgICAgT2JqZWN0W10gb2JqZWN0cyA9IHZhbHVlLnRvQXJyYXkoKTsKKyAgICAgICAgTGlzdCBvYmplY3RMaXN0ID0gKExpc3QpIG9iamVjdHNbMF07CisgICAgICAgIGFzc2VydEFycmF5RXF1YWxzKG5ldyBPYmplY3RbXXsiSmFtZXMiLCAiQm9iIn0sIG9iamVjdExpc3QudG9BcnJheSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9kZU5hdmlnYXRpb25Qcm9wZXJ0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBOb2RlIHogPSBuZXcgTm9kZShudWxsLCAieiIpOworICAgICAgICBOb2RlIHkgPSBuZXcgTm9kZShudWxsLCAieSIpOworCisgICAgICAgIExpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGNoaWxkcmVuLmFkZCh5KTsKKyAgICAgICAgY2hpbGRyZW4uYWRkKHopOworCisgICAgICAgIE5vZGUgeCA9IG5ldyBOb2RlKG51bGwsICJ4IiwgY2hpbGRyZW4pOworCisgICAgICAgIGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBjaGlsZHJlbi5hZGQoeCk7CisgICAgICAgIE5vZGUgYiA9IG5ldyBOb2RlKG51bGwsICJiIiwgY2hpbGRyZW4pOworCisgICAgICAgIC8vIEB0b2RvIHNob3VsZCB0cnkgd2l0aCBqdXN0IGEgbm9kZSBhcyB0aGUgY2hpbGQKKworICAgICAgICBMaXN0IHZhbHVlID0gKExpc3QpIEludm9rZXJIZWxwZXIuZ2V0UHJvcGVydHkoYiwgIngiKTsKKyAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMobmV3IE9iamVjdFtde3h9LCB2YWx1ZS50b0FycmF5KCkpOworCisgICAgICAgIHZhbHVlID0gKExpc3QpIEludm9rZXJIZWxwZXIuZ2V0UHJvcGVydHkodmFsdWUsICJ6Iik7CisgICAgICAgIGFzc2VydEFycmF5RXF1YWxzKG5ldyBPYmplY3RbXXt6fSwgdmFsdWUudG9BcnJheSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXNpbmdJblByb3BlcnR5T25Qcm9jZXNzVmlhR3Jvb3Z5TWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFByb2Nlc3MgcHJvY2VzcyA9IERlZmF1bHRHcm9vdnlNZXRob2RzLmV4ZWN1dGUoImphdmEgLXZlcnNpb24iKTsKKyAgICAgICAgT2JqZWN0IHZhbHVlID0gSW52b2tlckhlbHBlci5nZXRQcm9wZXJ0eShwcm9jZXNzLCAiaW4iKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh2YWx1ZSk7CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGb3VuZCBpbjogIiArIHZhbHVlKTsKKworICAgICAgICBwcm9jZXNzLmRlc3Ryb3koKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldENoZWVzZSgpIHsKKyAgICAgICAgcmV0dXJuICJjaGVkZGFyIjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcG9uZW50UGFyZW50KCkgeworICAgICAgICBKUGFuZWwgcGFuZWwgPSBuZXcgSlBhbmVsKCk7CisgICAgICAgIEpCdXR0b24gYmVhbiA9IG5ldyBKQnV0dG9uKCk7CisKKyAgICAgICAgcGFuZWwuYWRkKGJlYW4pOworCisgICAgICAgIE9iamVjdCB2YWx1ZSA9IEludm9rZXJIZWxwZXIuZ2V0UHJvcGVydHkoYmVhbiwgInBhcmVudCIpOworICAgICAgICBhc3NlcnRUcnVlKHZhbHVlICE9IG51bGwpOworICAgIH0KKworICAgIC8vIEltcGxlbWVudGF0aW9uIG1ldGhvZHMKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydEdldFNldFByb3BlcnR5KE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IGN1cnJlbnRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7CisgICAgICAgIGFzc2VydEdldFByb3BlcnR5KG9iamVjdCwgcHJvcGVydHksIGN1cnJlbnRWYWx1ZSk7CisKKyAgICAgICAgSW52b2tlckhlbHBlci5zZXRQcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5LCBuZXdWYWx1ZSk7CisKKyAgICAgICAgYXNzZXJ0R2V0UHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eSwgbmV3VmFsdWUpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydEdldFByb3BlcnR5KE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IGV4cGVjdGVkKSB7CisgICAgICAgIE9iamVjdCB2YWx1ZSA9IEludm9rZXJIZWxwZXIuZ2V0UHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwcm9wZXJ0eTogIiArIHByb3BlcnR5ICsgIiBvZjogIiArIG9iamVjdCwgZXhwZWN0ZWQsIHZhbHVlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL1N0YXRpY0luaXRUZXN0LmphdmEgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL1N0YXRpY0luaXRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFiMWYyZQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvU3RhdGljSW5pdFRlc3QuamF2YQpAQCAtMCwwICsxLDMxIEBACitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZTsKKworaW1wb3J0IGdyb292eS5sYW5nLkdyb292eUNsYXNzTG9hZGVyOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworCitjbGFzcyBYIHsKKworICAgIHB1YmxpYyBzdGF0aWMgaW50IGZpZWxkID0gMDsKKworICAgIHN0YXRpYyB7CisgICAgICAgIFN0YXRpY0luaXRUZXN0LmZhaWxlZCA9IHRydWU7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSU5JVCIpOworICAgIH0KK30KKworcHVibGljIGNsYXNzIFN0YXRpY0luaXRUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgc3RhdGljIGJvb2xlYW4gZmFpbGVkOworCisgICAgcHVibGljIHZvaWQgdGVzdEluaXRPcmRlciAoKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkdFVCBGSUVMRCIpOworICAgICAgICBmaW5hbCBGaWVsZCBmID0gbmV3IEdyb292eUNsYXNzTG9hZGVyKCkubG9hZENsYXNzKCJvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUuWCIsIGZhbHNlLCBmYWxzZSwgZmFsc2UpLmdldEZpZWxkKCJmaWVsZCIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZmFpbGVkKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSghZmFpbGVkKTsKKyAgICAgICAgZi5nZXRJbnQobnVsbCk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihmYWlsZWQpOworICAgICAgICBhc3NlcnRUcnVlKGZhaWxlZCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9TdGF0aWNQcmludGxuVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL1N0YXRpY1ByaW50bG5UZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjc0ZmUxCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9TdGF0aWNQcmludGxuVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwxNCBAQAorcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWU7CisKK2ltcG9ydCBncm9vdnkuYnVncy5UZXN0U3VwcG9ydAorCitjbGFzcyBTdGF0aWNQcmludGxuVGVzdCBleHRlbmRzIFRlc3RTdXBwb3J0IHsKKworICAgIHZvaWQgdGVzdFN0YXRpY1ByaW50KCkgeworICAgICAgICBtYWluKGdldE1vY2tBcmd1bWVudHMoKSkKKwl9CisJCisgICAgc3RhdGljIHZvaWQgbWFpbihhcmdzKSB7CisgICAgICAgIHByaW50bG4oImNhbGxlZCB3aXRoOiAiICsgYXJncykKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9TdHJpbmdBc0NsYXNzVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL1N0cmluZ0FzQ2xhc3NUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjhlNGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9TdHJpbmdBc0NsYXNzVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwxNyBAQAorcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUKKworY2xhc3MgU3RyaW5nQXNDbGFzc1Rlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZXsKKyAgICB2b2lkIHRlc3RTdHJpbmdBc0NsYXNzICAoKSB7CisgICAgICAgIGFzc2VydEVxdWFscyAiamF2YS51dGlsLkFycmF5TGlzdCIgYXMgQ2xhc3MsIEFycmF5TGlzdAorICAgIH0KKworICAgIHZvaWQgdGVzdFN0cmluZ0J1ZmZlciAoKSB7CisgICAgICAgIGFzc2VydEVxdWFscyAiJHtBcnJheUxpc3QuJ3BhY2thZ2UnLm5hbWV9LkFycmF5TGlzdCIgYXMgQ2xhc3MsIEFycmF5TGlzdAorICAgIH0KKworICAgIHZvaWQgdGVzdEZhaWxzICgpIHsKKyAgICAgICAgc2hvdWxkRmFpbCB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMgIk5PU1VDSENMQVNTIiBhcyBDbGFzcywgQXJyYXlMaXN0CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9UaW1lQ2F0ZWdvcnlUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvVGltZUNhdGVnb3J5VGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE4NGZkYwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvVGltZUNhdGVnb3J5VGVzdC5ncm9vdnkKQEAgLTAsMCArMSwyMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWUKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5UaW1lQ2F0ZWdvcnkKKworLyoqIAorICogVGVzdHMgdGhlIG9yZy5jb2RlaGF1cy5ncm9vdnkucnVudGltZS5UaW1lQ2F0ZWdvcnkgY2xhc3MuIAorICogTW9zdCBvZiB0aGVzZSB0ZXN0cyB1c2UgSmFudWFyeSAxIGFzIGEgc3RhcnQgdGltZSB0byBhdm9pZCAKKyAqIGxlYXAgeWVhcnMgYW5kIGRheWxpZ2h0IHNhdmluZ3MgdGltZSBpc3N1ZXMuIAorICogCisgKiBAYXV0aG9yIEhhbWxldCBEJ0FyY3kKKyAqLworY2xhc3MgVGltZUNhdGVnb3J5VGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIHZvaWQgdGVzdER1cmF0aW9uQXJpdGhtZXRpY09uTWlsbGlzZWNvbmRzKCkgeworICAgICAgICB1c2UoVGltZUNhdGVnb3J5KSB7CisgICAgICAgICAgICBkZWYgbWlkbmlnaHQgPSBuZXcgRGF0ZSgxMDAsIDAsIDEsIDAsIDAsIDApCisgICAgICAgICAgICBkZWYgb25lU2Vjb25kUGFzdE1pZG5pZ2h0ID0gbmV3IERhdGUoMTAwLCAwLCAxLCAwLCAwLCAxKQorICAgICAgICAgICAgZGVmIHR3b1NlY29uZHNQYXN0TWlkbmlnaHQgPSBuZXcgRGF0ZSgxMDAsIDAsIDEsIDAsIDAsIDIpCisKKyAgICAgICAgICAgIGFzc2VydCAobWlkbmlnaHQgKyAxMDAwLm1pbGxpc2Vjb25kKSA9PSBvbmVTZWNvbmRQYXN0TWlkbmlnaHQKKyAgICAgICAgICAgIGFzc2VydCAobWlkbmlnaHQgKyAyMDAwLm1pbGxpc2Vjb25kcykgPT0gdHdvU2Vjb25kc1Bhc3RNaWRuaWdodAorICAgICAgICAgICAgYXNzZXJ0ICh0d29TZWNvbmRzUGFzdE1pZG5pZ2h0IC0gMTAwMC5taWxsaXNlY29uZCkgPT0gb25lU2Vjb25kUGFzdE1pZG5pZ2h0CisgICAgICAgICAgICBhc3NlcnQgKHR3b1NlY29uZHNQYXN0TWlkbmlnaHQgLSAyMDAwLm1pbGxpc2Vjb25kcykgPT0gbWlkbmlnaHQKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgdGVzdER1cmF0aW9uQXJpdGhtZXRpY09uU2Vjb25kcygpIHsKKyAgICAgICAgdXNlKFRpbWVDYXRlZ29yeSkgeworICAgICAgICAgICAgZGVmIG1pZG5pZ2h0ID0gbmV3IERhdGUoMTAwLCAwLCAxLCAwLCAwLCAwKQorICAgICAgICAgICAgZGVmIG9uZVNlY29uZFBhc3RNaWRuaWdodCA9IG5ldyBEYXRlKDEwMCwgMCwgMSwgMCwgMCwgMSkKKyAgICAgICAgICAgIGRlZiB0d29TZWNvbmRzUGFzdE1pZG5pZ2h0ID0gbmV3IERhdGUoMTAwLCAwLCAxLCAwLCAwLCAyKQorCisgICAgICAgICAgICBhc3NlcnQgKG1pZG5pZ2h0ICsgMS5zZWNvbmQpID09IG9uZVNlY29uZFBhc3RNaWRuaWdodAorICAgICAgICAgICAgYXNzZXJ0IChtaWRuaWdodCArIDIuc2Vjb25kcykgPT0gdHdvU2Vjb25kc1Bhc3RNaWRuaWdodAorICAgICAgICAgICAgYXNzZXJ0ICh0d29TZWNvbmRzUGFzdE1pZG5pZ2h0IC0gMS5zZWNvbmQpID09IG9uZVNlY29uZFBhc3RNaWRuaWdodAorICAgICAgICAgICAgYXNzZXJ0ICh0d29TZWNvbmRzUGFzdE1pZG5pZ2h0IC0gMi5zZWNvbmRzKSA9PSBtaWRuaWdodAorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCB0ZXN0RHVyYXRpb25Bcml0aG1ldGljT25NaW51dGVzKCkgeworICAgICAgICB1c2UoVGltZUNhdGVnb3J5KSB7CisgICAgICAgICAgICBkZWYgbWlkbmlnaHQgPSBuZXcgRGF0ZSgxMDAsIDAsIDEsIDAsIDAsIDApCisgICAgICAgICAgICBkZWYgb25lTWludXRlUGFzdE1pZG5pZ2h0ID0gbmV3IERhdGUoMTAwLCAwLCAxLCAwLCAxLCAwKQorICAgICAgICAgICAgZGVmIHR3b01pbnV0ZXNQYXN0TWlkbmlnaHQgPSBuZXcgRGF0ZSgxMDAsIDAsIDEsIDAsIDIsIDApCisKKyAgICAgICAgICAgIGFzc2VydCAobWlkbmlnaHQgKyAxLm1pbnV0ZSkgPT0gb25lTWludXRlUGFzdE1pZG5pZ2h0CisgICAgICAgICAgICBhc3NlcnQgKG1pZG5pZ2h0ICsgMi5taW51dGVzKSA9PSB0d29NaW51dGVzUGFzdE1pZG5pZ2h0CisgICAgICAgICAgICBhc3NlcnQgKHR3b01pbnV0ZXNQYXN0TWlkbmlnaHQgLSA2MC5zZWNvbmRzKSA9PSBvbmVNaW51dGVQYXN0TWlkbmlnaHQKKyAgICAgICAgICAgIGFzc2VydCAodHdvTWludXRlc1Bhc3RNaWRuaWdodCAtIDEubWludXRlKSA9PSBvbmVNaW51dGVQYXN0TWlkbmlnaHQKKyAgICAgICAgICAgIGFzc2VydCAodHdvTWludXRlc1Bhc3RNaWRuaWdodCAtIDEyMC5zZWNvbmRzKSA9PSBtaWRuaWdodAorICAgICAgICAgICAgYXNzZXJ0ICh0d29NaW51dGVzUGFzdE1pZG5pZ2h0IC0gMi5taW51dGVzKSA9PSBtaWRuaWdodAorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCB0ZXN0RHVyYXRpb25Bcml0aG1ldGljT25Ib3VycygpIHsKKyAgICAgICAgdXNlKFRpbWVDYXRlZ29yeSkgeworICAgICAgICAgICAgZGVmIG1pZG5pZ2h0ID0gbmV3IERhdGUoMTAwLCAwLCAxLCAwLCAwLCAwKQorICAgICAgICAgICAgZGVmIG9uZUFNID0gbmV3IERhdGUoMTAwLCAwLCAxLCAxLCAwLCAwKQorICAgICAgICAgICAgZGVmIHR3b0FNID0gbmV3IERhdGUoMTAwLCAwLCAxLCAyLCAwLCAwKQorCisgICAgICAgICAgICBhc3NlcnQgKG1pZG5pZ2h0ICsgMS5ob3VyKSA9PSBvbmVBTQorICAgICAgICAgICAgYXNzZXJ0IChtaWRuaWdodCArIDIuaG91cnMpID09IHR3b0FNCisgICAgICAgICAgICBhc3NlcnQgKHR3b0FNIC0gMzYwMC5zZWNvbmRzKSA9PSBvbmVBTQorICAgICAgICAgICAgYXNzZXJ0ICh0d29BTSAtIDEuaG91cikgPT0gb25lQU0KKyAgICAgICAgICAgIGFzc2VydCAodHdvQU0gLSA3MjAwLnNlY29uZHMpID09IG1pZG5pZ2h0CisgICAgICAgICAgICBhc3NlcnQgKHR3b0FNIC0gMi5ob3VycykgPT0gbWlkbmlnaHQKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgdGVzdER1cmF0aW9uQXJpdGhtZXRpY09uRGF5cygpIHsKKyAgICAgICAgdXNlKFRpbWVDYXRlZ29yeSkgeworICAgICAgICAgICAgZGVmIGphbnVhcnlGaXJzdCA9IG5ldyBEYXRlKDEwMCwgMCwgMSwgMCwgMCwgMCkKKyAgICAgICAgICAgIGRlZiBqYW51YXJ5U2Vjb25kID0gbmV3IERhdGUoMTAwLCAwLCAyLCAwLCAwLCAwKQorICAgICAgICAgICAgZGVmIGphbnVhcnlUaGlyZCA9IG5ldyBEYXRlKDEwMCwgMCwgMywgMCwgMCwgMCkKKworICAgICAgICAgICAgYXNzZXJ0IChqYW51YXJ5Rmlyc3QgKyAxLmRheSkgPT0gamFudWFyeVNlY29uZAorICAgICAgICAgICAgYXNzZXJ0IChqYW51YXJ5Rmlyc3QgKyAyLmRheXMpID09IGphbnVhcnlUaGlyZAorICAgICAgICAgICAgYXNzZXJ0IChqYW51YXJ5VGhpcmQgLSAxLmRheSkgPT0gamFudWFyeVNlY29uZAorICAgICAgICAgICAgYXNzZXJ0IChqYW51YXJ5VGhpcmQgLSAyLmRheXMpID09IGphbnVhcnlGaXJzdAorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCB0ZXN0RHVyYXRpb25Bcml0aG1ldGljT25XZWVrcygpIHsKKyAgICAgICAgdXNlKFRpbWVDYXRlZ29yeSkgeworICAgICAgICAgICAgZGVmIGZpcnN0V2VlayA9IG5ldyBEYXRlKDEwMCwgMCwgMSwgMCwgMCwgMCkKKyAgICAgICAgICAgIGRlZiBzZWNvbmRXZWVrID0gbmV3IERhdGUoMTAwLCAwLCA4LCAwLCAwLCAwKQorICAgICAgICAgICAgZGVmIHRoaXJkV2VlayA9IG5ldyBEYXRlKDEwMCwgMCwgMTUsIDAsIDAsIDApCisKKyAgICAgICAgICAgIGFzc2VydCAoZmlyc3RXZWVrICsgMS53ZWVrKSA9PSBzZWNvbmRXZWVrCisgICAgICAgICAgICBhc3NlcnQgKGZpcnN0V2VlayArIDIud2Vla3MpID09IHRoaXJkV2VlaworICAgICAgICAgICAgYXNzZXJ0ICh0aGlyZFdlZWsgLSAxLndlZWspID09IHNlY29uZFdlZWsKKyAgICAgICAgICAgIGFzc2VydCAodGhpcmRXZWVrIC0gMi53ZWVrcykgPT0gZmlyc3RXZWVrCisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHRlc3REdXJhdGlvbkFyaXRobWV0aWNPbk1vbnRocygpIHsKKyAgICAgICAgdXNlKFRpbWVDYXRlZ29yeSkgeworICAgICAgICAgICAgZGVmIGphbnVhcnkgPSBuZXcgRGF0ZSgxMDAsIDAsIDEsIDAsIDAsIDApCisgICAgICAgICAgICBkZWYgZmVicnVhcnkgPSBuZXcgRGF0ZSgxMDAsIDEsIDEsIDAsIDAsIDApCisgICAgICAgICAgICBkZWYgbWFyY2ggPSBuZXcgRGF0ZSgxMDAsIDIsIDEsIDAsIDAsIDApCisKKyAgICAgICAgICAgIGFzc2VydCAoamFudWFyeSArIDEubW9udGgpID09IGZlYnJ1YXJ5CisgICAgICAgICAgICBhc3NlcnQgKGphbnVhcnkgKyAyLm1vbnRocykgPT0gbWFyY2gKKyAgICAgICAgICAgIGFzc2VydCAobWFyY2ggLSAxLm1vbnRoKSA9PSBmZWJydWFyeQorICAgICAgICAgICAgYXNzZXJ0IChtYXJjaCAtIDIubW9udGhzKSA9PSBqYW51YXJ5CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHRlc3REdXJhdGlvbkFyaXRobWV0aWNPblllYXJzKCkgeworICAgICAgICB1c2UoVGltZUNhdGVnb3J5KSB7CisgICAgICAgICAgICBkZWYgZmlyc3RZZWFyID0gbmV3IERhdGUoMTAwLCAwLCAxLCAwLCAwLCAwKQorICAgICAgICAgICAgZGVmIHNlY29uZFllYXIgPSBuZXcgRGF0ZSgxMDEsIDAsIDEsIDAsIDAsIDApCisgICAgICAgICAgICBkZWYgdGhpcmRZZWFyID0gbmV3IERhdGUoMTAyLCAwLCAxLCAwLCAwLCAwKQorCisgICAgICAgICAgICBhc3NlcnQgKGZpcnN0WWVhciArIDEueWVhcikgPT0gc2Vjb25kWWVhcgorICAgICAgICAgICAgYXNzZXJ0IChmaXJzdFllYXIgKyAyLnllYXJzKSA9PSB0aGlyZFllYXIKKyAgICAgICAgICAgIGFzc2VydCAodGhpcmRZZWFyIC0gMS55ZWFyKSA9PSBzZWNvbmRZZWFyCisgICAgICAgICAgICBhc3NlcnQgKHRoaXJkWWVhciAtIDIueWVhcnMpID09IGZpcnN0WWVhcgorICAgICAgICB9CisgICAgfQorCisKKyAgICB2b2lkIHRlc3REYXRlU3VidHJhY3Rpb25PblNlY29uZHMoKSB7CisgICAgICAgIHVzZShUaW1lQ2F0ZWdvcnkpIHsKKyAgICAgICAgICAgIGRlZiBjdXJyZW50ID0gbmV3IERhdGUoMTAwLCAwLCAxLCAwLCAwLCAwKQorICAgICAgICAgICAgZGVmIG9uZVNlY29uZExhdGVyID0gbmV3IERhdGUoMTAwLCAwLCAxLCAwLCAwLCAxKQorICAgICAgICAgICAgZGVmIHR3b1NlY29uZHNMYXRlciA9IG5ldyBEYXRlKDEwMCwgMCwgMSwgMCwgMCwgMikKKworICAgICAgICAgICAgZGVmIHJlc3VsdCA9IG9uZVNlY29uZExhdGVyIC0gY3VycmVudAorICAgICAgICAgICAgYXNzZXJ0IHJlc3VsdC5zZWNvbmRzID09IDEKKyAgICAgICAgICAgIHJlc3VsdCA9IHR3b1NlY29uZHNMYXRlciAtIGN1cnJlbnQKKyAgICAgICAgICAgIGFzc2VydCByZXN1bHQuc2Vjb25kcyA9PSAyCisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHRlc3REYXRlU3VidHJhY3Rpb25Pbk1pbnV0ZXMoKSB7CisgICAgICAgIHVzZShUaW1lQ2F0ZWdvcnkpIHsKKyAgICAgICAgICAgIGRlZiBjdXJyZW50ID0gbmV3IERhdGUoMTAwLCAwLCAxLCAwLCAwLCAwKQorICAgICAgICAgICAgZGVmIG9uZU1pbnV0ZUxhdGVyID0gbmV3IERhdGUoMTAwLCAwLCAxLCAwLCAxLCAwKQorICAgICAgICAgICAgZGVmIHR3b01pbnV0ZXNMYXRlciA9IG5ldyBEYXRlKDEwMCwgMCwgMSwgMCwgMiwgMCkKKworICAgICAgICAgICAgZGVmIHJlc3VsdCA9IG9uZU1pbnV0ZUxhdGVyIC0gY3VycmVudAorICAgICAgICAgICAgYXNzZXJ0IHJlc3VsdC5taW51dGVzID09IDEKKyAgICAgICAgICAgIHJlc3VsdCA9IHR3b01pbnV0ZXNMYXRlciAtIGN1cnJlbnQKKyAgICAgICAgICAgIGFzc2VydCByZXN1bHQubWludXRlcyA9PSAyCisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHRlc3REYXRlU3VidHJhY3Rpb25PbkhvdXJzKCkgeworICAgICAgICB1c2UoVGltZUNhdGVnb3J5KSB7CisgICAgICAgICAgICBkZWYgY3VycmVudCA9IG5ldyBEYXRlKDEwMCwgMCwgMSwgMCwgMCwgMCkKKyAgICAgICAgICAgIGRlZiBvbmVIb3VyTGF0ZXIgPSBuZXcgRGF0ZSgxMDAsIDAsIDEsIDEsIDAsIDApCisgICAgICAgICAgICBkZWYgdHdvSG91cnNMYXRlciA9IG5ldyBEYXRlKDEwMCwgMCwgMSwgMiwgMCwgMCkKKworICAgICAgICAgICAgZGVmIHJlc3VsdCA9IG9uZUhvdXJMYXRlciAtIGN1cnJlbnQKKyAgICAgICAgICAgIGFzc2VydCByZXN1bHQuaG91cnMgPT0gMQorICAgICAgICAgICAgcmVzdWx0ID0gdHdvSG91cnNMYXRlciAtIGN1cnJlbnQKKyAgICAgICAgICAgIGFzc2VydCByZXN1bHQuaG91cnMgPT0gMgorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCB0ZXN0RGF0ZVN1YnRyYWN0aW9uT25EYXlzKCkgeworICAgICAgICB1c2UoVGltZUNhdGVnb3J5KSB7CisgICAgICAgICAgICBkZWYgY3VycmVudCA9IG5ldyBEYXRlKDEwMCwgMCwgMSwgMCwgMCwgMCkKKyAgICAgICAgICAgIGRlZiBvbmVEYXlMYXRlciA9IG5ldyBEYXRlKDEwMCwgMCwgMiwgMCwgMCwgMCkKKyAgICAgICAgICAgIGRlZiB0d29EYXlzTGF0ZXIgPSBuZXcgRGF0ZSgxMDAsIDAsIDMsIDAsIDAsIDApCisKKyAgICAgICAgICAgIGRlZiByZXN1bHQgPSBvbmVEYXlMYXRlciAtIGN1cnJlbnQKKyAgICAgICAgICAgIGFzc2VydCByZXN1bHQuZGF5cyA9PSAxCisgICAgICAgICAgICByZXN1bHQgPSB0d29EYXlzTGF0ZXIgLSBjdXJyZW50CisgICAgICAgICAgICBhc3NlcnQgcmVzdWx0LmRheXMgPT0gMgorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCB0ZXN0RGF0ZVN1YnRyYWN0aW9uX05vWWVhcnNPck1vbnRocygpIHsKKyAgICAgICAgdXNlKFRpbWVDYXRlZ29yeSkgeworICAgICAgICAgICAgZGVmIHllYXJPbmUgPSBuZXcgRGF0ZSgxMDAsIDAsIDEsIDAsIDAsIDApCisgICAgICAgICAgICBkZWYgeWVhclRocmVlID0gbmV3IERhdGUoMTAyLCAwLCAxLCAwLCAwLCAwKQorCisgICAgICAgICAgICBkZWYgcmVzdWx0ID0geWVhclRocmVlIC0geWVhck9uZQorCisgICAgICAgICAgICAvL2RvIE5PVCBleHBlY3QgbW9udGhzIGFuZCB5ZWFycyB0byBiZQorICAgICAgICAgICAgLy9zZXQgb24gdGhlIHJlc3VsdCBvZiBkYXRlIHN1YnRyYWN0aW9uCisgICAgICAgICAgICBhc3NlcnQgcmVzdWx0LnllYXJzID09IDAKKyAgICAgICAgICAgIGFzc2VydCByZXN1bHQubW9udGhzID09IDAKKworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL1R1cGxlTGlzdFRlc3QuamF2YSBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvVHVwbGVMaXN0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZWRhZGMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL1R1cGxlTGlzdFRlc3QuamF2YQpAQCAtMCwwICsxLDkzIEBACisvKgorICRJZCQKKworIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCisgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQKKyAgICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKKyAgICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCisgICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQorICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgorICAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKKyAgICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KKworIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCisgICAgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAorICAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCisKKyA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQorICAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLworCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUworIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAorIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKKyBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgKi8KKworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWU7CisKK2ltcG9ydCBncm9vdnkudXRpbC5Hcm9vdnlUZXN0Q2FzZTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisKKy8qKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIFR1cGxlTGlzdFRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0ZU92ZXJUdXBsZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBJbnZva2VySGVscGVyLmFzSXRlcmF0b3IoSW52b2tlckhlbHBlci5jcmVhdGVUdXBsZShuZXcgT2JqZWN0W117ImEiLCAiYiIsICJjIn0pKTsKKyAgICAgICAgICAgICBpdGVyLmhhc05leHQoKTsKKyAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgIE9iamVjdCBpID0gaXRlci5uZXh0KCk7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGkpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJidWZmZXIiLCAiYWJjIiwgYnVmZmVyLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJdGVyYXRlT3Zlckxpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gSW52b2tlckhlbHBlci5hc0l0ZXJhdG9yKEludm9rZXJIZWxwZXIuY3JlYXRlTGlzdChuZXcgT2JqZWN0W117ImEiLCAiYiIsICJjIn0pKTsKKyAgICAgICAgICAgICBpdGVyLmhhc05leHQoKTsKKyAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgIE9iamVjdCBpID0gaXRlci5uZXh0KCk7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGkpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJidWZmZXIiLCAiYWJjIiwgYnVmZmVyLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVNYXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTWFwIG1hcCA9IEludm9rZXJIZWxwZXIuY3JlYXRlTWFwKG5ldyBPYmplY3RbXXsiYSIsICJ4IiwgImIiLCAieSJ9KTsKKworICAgICAgICBhc3NlcnROb3ROdWxsKCJtYXAiLCBtYXApOworICAgICAgICBhc3NlcnRFcXVhbHMoInNpemUiLCAyLCBtYXAuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZSBvZiBhIiwgIngiLCBtYXAuZ2V0KCJhIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlIG9mIGIiLCAieSIsIG1hcC5nZXQoImIiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9XaXRoUmVzb3VyY2VTdHJlYW1DbG9zZWRUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvV2l0aFJlc291cmNlU3RyZWFtQ2xvc2VkVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ4Y2U0NwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvV2l0aFJlc291cmNlU3RyZWFtQ2xvc2VkVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwzNCBAQAorcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnJ1bnRpbWU7CisKKy8qKiAKKyAqIFRlc3Qgd2l0aFdyaXRlciB3aXRoIGlubmVyIGxvb3AgY2xvc2luZyB0aGUgc3RyZWFtCisgKiBpbiBhZHZhbmNlLgorICogU29tZSBtZXRob2RzIGUuZy4gdHJhbnNmb3JtQ2hhcigpIGNsb3NlIHRoZSBzdHJlYW1zLgorICogSWYgdXNlZCBpbnNpZGUgYSB3aXRoV3JpdGVyKCksIGl0IG11c3Qgbm90IGxlYWQgdG8gCisgKiBwcm9ibGVtcworICogCisgKiBAYXV0aG9yIEpvYWNoaW0gQmF1bWFubjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworCitjbGFzcyBXaXRoUmVzb3VyY2VTdHJlYW1DbG9zZWRUZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisJdm9pZCB0ZXN0V2l0aFdyaXRlclN0cmVhbUNsb3NlZCgpIHsKKworCSAgICBkZWYgb3V0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCkKKwkgICAgZGVmIHJlYWRlciA9IG5ldyBTdHJpbmdSZWFkZXIoIkhhbGxvIFdlbHQiKQorCisJICAgIG91dGVyLndpdGhXcml0ZXIgeyB3cml0ZXIgLT4KKwkgICAgICAgIHJlYWRlci50cmFuc2Zvcm1DaGFyKHdyaXRlcikgeyBpdCB9CisJICAgICAgCisJICAgIH0KKwkJYXNzZXJ0IG91dGVyLnRvU3RyaW5nKCkgPT0gIkhhbGxvIFdlbHQiCisJfQorCXZvaWQgdGVzdFdpdGhPdXRwdXRTdHJlYW1DbG9zZWQoKSB7CisJICAgIGRlZiBvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKQorCSAgICBvcy53aXRoU3RyZWFtIHsgb3V0IC0+CisJICAgICAgICBvcy5jbG9zZSgpICAgICAKKwkgICAgfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9Xcml0ZXJBcHBlbmRUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvV3JpdGVyQXBwZW5kVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMzNDIzYwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3J1bnRpbWUvV3JpdGVyQXBwZW5kVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwyMjMgQEAKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS5ydW50aW1lOw0KKw0KK2ltcG9ydCBqYXZhLmlvLkZpbGUNCitpbXBvcnQgamF2YS5pby5SZWFkZXINCisNCisvKiogDQorICogVGVzdCBXcml0ZXIgYXBwZW5kIGFuZCBsZWZ0IHNoaWZ0IG1ldGhvZHMgaW4gR3Jvb3Z5DQorICogDQorICogQGF1dGhvciBKb2FjaGltIEJhdW1hbm48L2E+DQorICogQHZlcnNpb24gJFJldmlzaW9uJA0KKyAqLw0KK2NsYXNzIFdyaXRlckFwcGVuZFRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7DQorCS8qKg0KKwkgKiBUaGUgZm9sbG93aW5nIGluc3RhbmNlcyBhcmUgdXNlZCBpbiB0ZXN0aW5nIHRoZSBmaWxlIHdyaXRlcw0KKwkgKi8NCisJc3RhdGljIHRleHQgPSAiIiINCisJCQk8Z3Jvb3Z5Pg0KKwkJCSAgPHRoaW5ncz4NCisJCQkgICAgPHRoaW5nPkplbGx5IEJlYW5zPC90aGluZz4NCisJCQkgIDwvdGhpbmdzPg0KKwkJCSAgPG11c2ljPg0KKwkJCSAgICA8dHVuZT5UaGUgNTl0aCBTdHJlZXQgQnJpZGdlIFNvbmc8L3R1bmU+DQorCQkJICA8L211c2ljPg0KKwkJCSAgPGNoYXJhY3RlcnM+DQorCQkJICAgIDxjaGFyYWN0ZXIgbmFtZT0iQXVzdGluIFBvd2VycyI+DQorCQkJICAgICAgIDxlbmVteT5Eci4gRXZpbDwvZW5lbXk+DQorCQkJICAgICAgIDxlbmVteT5NaW5pIE1lPC9lbmVteT4NCisJCQkgICAgPC9jaGFyYWN0ZXI+DQorCQkJICA8L2NoYXJhY3RlcnM+DQorCQkJPC9ncm9vdnk+DQorCQkJIiIiDQorCXN0YXRpYyBnUGF0aFJlc3VsdCA9IG5ldyBYbWxTbHVycGVyKCkucGFyc2VUZXh0KHRleHQpDQorCXN0YXRpYyBnUGF0aFdyaXRlVG8NCisJc3RhdGljIGRlZmF1bHRFbmNvZGluZw0KKwlzdGF0aWMgVVRGOF9FTkNPRElORw0KKw0KKwlzdGF0aWMgew0KKwkJU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpDQorCQlnUGF0aFJlc3VsdC53cml0ZVRvKHN3KQ0KKwkJZ1BhdGhXcml0ZVRvID0gc3cudG9TdHJpbmcoKQ0KKwkJVVRGOF9FTkNPRElORyA9ICJVVEYtOCINCisJICAgIGRlZmF1bHRFbmNvZGluZyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5lbmNvZGluZyIpDQorCX0NCisNCisJLy8gT3VyIGZpbGUgaW5zdGFuY2UNCisJZGVmIEZpbGUgZmlsZTsNCisJDQorCXZvaWQgc2V0VXAoKSB7DQorCQkvLyBTZXR1cCBndWFyYW50ZWVzIHVzIHRoYXQgd2UgdXNlIGEgbm9uLWV4aXN0ZW50IGZpbGUNCisJCWZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJ1bml0VGVzdCIsICIudHh0IikgDQorCQlhc3NlcnQgZmlsZS5leGlzdHMoKSA9PSB0cnVlDQorCQkvL3ByaW50bG4gZmlsZS5jYW5vbmljYWxQYXRoDQorCQlhc3NlcnQgZmlsZS5sZW5ndGgoKSA9PSAwTA0KKwl9DQorCXZvaWQgdGVhckRvd24oKSB7DQorCQkvLyB3ZSByZW1vdmUgb3VyIHRlbXBvcmFyeSBmaWxlDQorCQlkZWYgZGVsZXRlZCA9IGZhbHNlDQorCQl3aGlsZShkZWxldGVkID09IGZhbHNlKQ0KKwkJCWRlbGV0ZWQgPSBmaWxlLmRlbGV0ZSgpDQorCQlhc3NlcnQgZmlsZS5leGlzdHMoKSA9PSBmYWxzZQ0KKwl9DQorDQorCXZvaWQgdGVzdEFwcGVuZFN0cmluZ1dpdGhFbmNvZGluZygpew0KKwkJZGVmIGV4cGVjdGVkDQorCQkvLyB0ZXN0IG5ldw0KKwkJZmlsZS53aXRoV3JpdGVyQXBwZW5kKFVURjhfRU5DT0RJTkcpIHsgd3JpdGVyIC0+DQorCQkgICAgd3JpdGVyLndyaXRlKHRleHQpDQorCQl9DQorCQlleHBlY3RlZCA9IHRleHQNCisJCWFzc2VydCBoYXNDb250ZW50cyhmaWxlLCBleHBlY3RlZCwgVVRGOF9FTkNPRElORykNCisJCQ0KKwkJLy8gdGVzdCBleGlzdGluZw0KKwkJZmlsZS53aXRoV3JpdGVyQXBwZW5kKFVURjhfRU5DT0RJTkcpIHsgd3JpdGVyIC0+DQorCQkgICAgd3JpdGVyLndyaXRlKHRleHQpDQorCQl9DQorCQlleHBlY3RlZCArPSB0ZXh0DQorCQlhc3NlcnQgaGFzQ29udGVudHMoZmlsZSwgZXhwZWN0ZWQsIFVURjhfRU5DT0RJTkcpDQorCX0NCisNCisJdm9pZCB0ZXN0QXBwZW5kV3JpdGFibGVXaXRoRW5jb2RpbmcoKXsNCisJCWRlZiBleHBlY3RlZA0KKwkJDQorCQkvLyB0ZXN0IG5ldw0KKwkJZmlsZS53aXRoV3JpdGVyQXBwZW5kKFVURjhfRU5DT0RJTkcpIHsgd3JpdGVyIC0+DQorCQkgICAgd3JpdGVyLndyaXRlKGdQYXRoUmVzdWx0KQ0KKwkJfQ0KKwkJZXhwZWN0ZWQgPSBnUGF0aFdyaXRlVG8NCisJCWFzc2VydCBoYXNDb250ZW50cyhmaWxlLCBleHBlY3RlZCwgVVRGOF9FTkNPRElORykNCisJCQ0KKwkJLy8gdGVzdCBleGlzdGluZw0KKwkJZmlsZS53aXRoV3JpdGVyQXBwZW5kKFVURjhfRU5DT0RJTkcpIHsgd3JpdGVyIC0+DQorCQkgICAgd3JpdGVyLndyaXRlKGdQYXRoUmVzdWx0KQ0KKwkJfQ0KKwkJZXhwZWN0ZWQgKz0gZ1BhdGhXcml0ZVRvDQorCQlhc3NlcnQgaGFzQ29udGVudHMoZmlsZSwgZXhwZWN0ZWQsIFVURjhfRU5DT0RJTkcpDQorCX0NCisNCisNCisJdm9pZCB0ZXN0TGVmdFNoaWZ0U3RyaW5nV2l0aEVuY29kaW5nKCl7DQorCQlkZWYgZXhwZWN0ZWQNCisJCQ0KKwkJLy8gdGVzdCBuZXcNCisJCWZpbGUud2l0aFdyaXRlckFwcGVuZChVVEY4X0VOQ09ESU5HKSB7IHdyaXRlciAtPg0KKwkJICAgIHdyaXRlciA8PCB0ZXh0DQorCQl9DQorCQlleHBlY3RlZCA9IHRleHQNCisJCWFzc2VydCBoYXNDb250ZW50cyhmaWxlLCBleHBlY3RlZCwgVVRGOF9FTkNPRElORykNCisJCQ0KKwkJLy8gdGVzdCBleGlzdGluZw0KKwkJZmlsZS53aXRoV3JpdGVyQXBwZW5kKFVURjhfRU5DT0RJTkcpIHsgd3JpdGVyIC0+DQorCQkgICAgd3JpdGVyIDw8IHRleHQNCisJCX0NCisJCWV4cGVjdGVkICs9IHRleHQNCisJCWFzc2VydCBoYXNDb250ZW50cyhmaWxlLCBleHBlY3RlZCwgVVRGOF9FTkNPRElORykNCisJfQ0KKwkJCQ0KKw0KKwl2b2lkIHRlc3RMZWZ0U2hpZnRXcml0YWJsZVdpdGhFbmNvZGluZygpew0KKwkJZGVmIGV4cGVjdGVkDQorCQkNCisJCS8vIHRlc3QgbmV3DQorCQlmaWxlLndpdGhXcml0ZXJBcHBlbmQoVVRGOF9FTkNPRElORykgeyB3cml0ZXIgLT4NCisJCSAgICB3cml0ZXIgPDwgZ1BhdGhSZXN1bHQNCisJCX0NCisJCWV4cGVjdGVkID0gZ1BhdGhXcml0ZVRvDQorCQlhc3NlcnQgaGFzQ29udGVudHMoZmlsZSwgZXhwZWN0ZWQsIFVURjhfRU5DT0RJTkcpDQorCQkNCisJCS8vIHRlc3QgZXhpc3RpbmcNCisJCWZpbGUud2l0aFdyaXRlckFwcGVuZChVVEY4X0VOQ09ESU5HKSB7IHdyaXRlciAtPg0KKwkJICAgIHdyaXRlciA8PCBnUGF0aFJlc3VsdA0KKwkJfQ0KKwkJZXhwZWN0ZWQgKz0gZ1BhdGhXcml0ZVRvDQorCQlhc3NlcnQgaGFzQ29udGVudHMoZmlsZSwgZXhwZWN0ZWQsIFVURjhfRU5DT0RJTkcpDQorCX0JCSANCisNCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQorCXZvaWQgdGVzdEFwcGVuZFN0cmluZ0RlZmF1bHRFbmNvZGluZygpew0KKwkJZGVmIGV4cGVjdGVkDQorCQkvLyB0ZXN0IG5ldw0KKwkJZmlsZS53aXRoV3JpdGVyQXBwZW5kIHsgd3JpdGVyIC0+DQorCQkgICAgd3JpdGVyLndyaXRlKHRleHQpDQorCQl9DQorCQlleHBlY3RlZCA9IHRleHQNCisJCWFzc2VydCBoYXNDb250ZW50cyhmaWxlLCBleHBlY3RlZCwgZGVmYXVsdEVuY29kaW5nKQ0KKwkJDQorCQkvLyB0ZXN0IGV4aXN0aW5nDQorCQlmaWxlLndpdGhXcml0ZXJBcHBlbmQgeyB3cml0ZXIgLT4NCisJCSAgICB3cml0ZXIud3JpdGUodGV4dCkNCisJCX0NCisJCWV4cGVjdGVkICs9IHRleHQNCisJCWFzc2VydCBoYXNDb250ZW50cyhmaWxlLCBleHBlY3RlZCwgZGVmYXVsdEVuY29kaW5nKQ0KKwl9DQorDQorCXZvaWQgdGVzdEFwcGVuZFdyaXRhYmxlRGVmYXVsdEVuY29kaW5nKCl7DQorCQlkZWYgZXhwZWN0ZWQNCisJCQ0KKwkJLy8gdGVzdCBuZXcNCisJCWZpbGUud2l0aFdyaXRlckFwcGVuZCB7IHdyaXRlciAtPg0KKwkJICAgIHdyaXRlci53cml0ZShnUGF0aFJlc3VsdCkNCisJCX0NCisJCWV4cGVjdGVkID0gZ1BhdGhXcml0ZVRvDQorCQlhc3NlcnQgaGFzQ29udGVudHMoZmlsZSwgZXhwZWN0ZWQsIGRlZmF1bHRFbmNvZGluZykNCisJCQ0KKwkJLy8gdGVzdCBleGlzdGluZw0KKwkJZmlsZS53aXRoV3JpdGVyQXBwZW5kIHsgd3JpdGVyIC0+DQorCQkgICAgd3JpdGVyLndyaXRlKGdQYXRoUmVzdWx0KQ0KKwkJfQ0KKwkJZXhwZWN0ZWQgKz0gZ1BhdGhXcml0ZVRvDQorCQlhc3NlcnQgaGFzQ29udGVudHMoZmlsZSwgZXhwZWN0ZWQsIGRlZmF1bHRFbmNvZGluZykNCisJfQ0KKw0KKw0KKwl2b2lkIHRlc3RMZWZ0U2hpZnRTdHJpbmdEZWZhdWx0RW5jb2RpbmcoKXsNCisJCWRlZiBleHBlY3RlZA0KKwkJDQorCQkvLyB0ZXN0IG5ldw0KKwkJZmlsZS53aXRoV3JpdGVyQXBwZW5kIHsgd3JpdGVyIC0+DQorCQkgICAgd3JpdGVyIDw8IHRleHQNCisJCX0NCisJCWV4cGVjdGVkID0gdGV4dA0KKwkJYXNzZXJ0IGhhc0NvbnRlbnRzKGZpbGUsIGV4cGVjdGVkLCBkZWZhdWx0RW5jb2RpbmcpDQorCQkNCisJCS8vIHRlc3QgZXhpc3RpbmcNCisJCWZpbGUud2l0aFdyaXRlckFwcGVuZCB7IHdyaXRlciAtPg0KKwkJICAgIHdyaXRlciA8PCB0ZXh0DQorCQl9DQorCQlleHBlY3RlZCArPSB0ZXh0DQorCQlhc3NlcnQgaGFzQ29udGVudHMoZmlsZSwgZXhwZWN0ZWQsIGRlZmF1bHRFbmNvZGluZykNCisJfQ0KKwkJCQ0KKw0KKwl2b2lkIHRlc3RMZWZ0U2hpZnRXcml0YWJsZURlZmF1bHRFbmNvZGluZygpew0KKwkJZGVmIGV4cGVjdGVkDQorCQkNCisJCS8vIHRlc3QgbmV3DQorCQlmaWxlLndpdGhXcml0ZXJBcHBlbmQgeyB3cml0ZXIgLT4NCisJCSAgICB3cml0ZXIgPDwgZ1BhdGhSZXN1bHQNCisJCX0NCisJCWV4cGVjdGVkID0gZ1BhdGhXcml0ZVRvDQorCQlhc3NlcnQgaGFzQ29udGVudHMoZmlsZSwgZXhwZWN0ZWQsIGRlZmF1bHRFbmNvZGluZykNCisJCQ0KKwkJLy8gdGVzdCBleGlzdGluZw0KKwkJZmlsZS53aXRoV3JpdGVyQXBwZW5kIHsgd3JpdGVyIC0+DQorCQkgICAgd3JpdGVyIDw8IGdQYXRoUmVzdWx0DQorCQl9DQorCQlleHBlY3RlZCArPSBnUGF0aFdyaXRlVG8NCisJCWFzc2VydCBoYXNDb250ZW50cyhmaWxlLCBleHBlY3RlZCwgZGVmYXVsdEVuY29kaW5nKQ0KKwl9CQkgDQorDQorCQ0KKwlib29sZWFuIGhhc0NvbnRlbnRzKEZpbGUgZiwgU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgY2hhclNldCkNCisJew0KKwkJLy8gcmVhZCBjb250ZW50cyB0aGUgSmF2YSB3YXkNCisJCWJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtleHBlY3RlZC5sZW5ndGgoKV07DQorCQkNCisJCWRlZiBmaWxlSVMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpDQorCQlmaWxlSVMucmVhZChidWYpDQorCQlmaWxlSVMuY2xvc2UoKQ0KKwkJaWYgKGV4cGVjdGVkICE9IG5ldyBTdHJpbmcoYnVmLCBjaGFyU2V0KSkNCisJCSAgICBwcmludGxuICJFWDogIiArIGV4cGVjdGVkICsgIi0tLS0tLSIgKyBuZXcgU3RyaW5nKGJ1ZiwgY2hhclNldCkgKyAiXG4tLS0tIg0KKwkJcmV0dXJuIGV4cGVjdGVkID09IG5ldyBTdHJpbmcoYnVmLCBjaGFyU2V0KQ0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9Ub2tlblRlc3QuamF2YSBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3N5bnRheC9Ub2tlblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjEwYTc1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L1Rva2VuVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzUyIEBACitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkuc3ludGF4OworCisKK2ltcG9ydCBncm9vdnkudXRpbC5Hcm9vdnlUZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIFRva2VuVGVzdAorICAgICAgICBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIHB1YmxpYyB2b2lkIHRlc3ROb3RoaW5nKCkgeworICAgIH0KKworLyoKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTElORSA9IDExOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT0xVTU4gPSAzMzsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3QoKQorICAgIHsKKyAgICAgICAgVG9rZW4gdG9rZW4gPSBuZXcgVG9rZW4oIDQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvcnR5LXR3byIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyICk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCA0MiwKKyAgICAgICAgICAgICAgICAgICAgICB0b2tlbi5nZXRUeXBlKCkgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoICJmb3J0eS10d28iLAorICAgICAgICAgICAgICAgICAgICAgIHRva2VuLmdldFRleHQoKSApOworCisgICAgICAgIGFzc2VydEVxdWFscyggMTEsCisgICAgICAgICAgICAgICAgICAgICAgdG9rZW4uZ2V0U3RhcnRMaW5lKCkgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIDIyLAorICAgICAgICAgICAgICAgICAgICAgIHRva2VuLmdldFN0YXJ0Q29sdW1uKCkgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGVmdEN1cmx5QnJhY2UoKQorICAgIHsKKyAgICAgICAgVG9rZW4gdG9rZW4gPSBUb2tlbi5sZWZ0Q3VybHlCcmFjZSggTElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09MVU1OICk7CisKKyAgICAgICAgYXNzZXJ0VG9rZW4oIHRva2VuLAorICAgICAgICAgICAgICAgICAgICAgVG9rZW4uTEVGVF9DVVJMWV9CUkFDRSwKKyAgICAgICAgICAgICAgICAgICAgICJ7IiApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSaWdodEN1cmx5QnJhY2UoKQorICAgIHsKKyAgICAgICAgVG9rZW4gdG9rZW4gPSBUb2tlbi5yaWdodEN1cmx5QnJhY2UoIExJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0xVTU4gKTsKKworICAgICAgICBhc3NlcnRUb2tlbiggdG9rZW4sCisgICAgICAgICAgICAgICAgICAgICBUb2tlbi5SSUdIVF9DVVJMWV9CUkFDRSwKKyAgICAgICAgICAgICAgICAgICAgICJ9IiApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMZWZ0U3F1YXJlQnJhY2tldCgpCisgICAgeworICAgICAgICBUb2tlbiB0b2tlbiA9IFRva2VuLmxlZnRTcXVhcmVCcmFja2V0KCBMSU5FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0xVTU4gKTsKKworICAgICAgICBhc3NlcnRUb2tlbiggdG9rZW4sCisgICAgICAgICAgICAgICAgICAgICBUb2tlbi5MRUZUX1NRVUFSRV9CUkFDS0VULAorICAgICAgICAgICAgICAgICAgICAgIlsiICk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJpZ2h0U3F1YXJlQnJhY2tldCgpCisgICAgeworICAgICAgICBUb2tlbiB0b2tlbiA9IFRva2VuLnJpZ2h0U3F1YXJlQnJhY2tldCggTElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTFVNTiApOworCisgICAgICAgIGFzc2VydFRva2VuKCB0b2tlbiwKKyAgICAgICAgICAgICAgICAgICAgIFRva2VuLlJJR0hUX1NRVUFSRV9CUkFDS0VULAorICAgICAgICAgICAgICAgICAgICAgIl0iICk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExlZnRQYXJlbnRoZXNpcygpCisgICAgeworICAgICAgICBUb2tlbiB0b2tlbiA9IFRva2VuLmxlZnRQYXJlbnRoZXNpcyggTElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTFVNTiApOworCisgICAgICAgIGFzc2VydFRva2VuKCB0b2tlbiwKKyAgICAgICAgICAgICAgICAgICAgIFRva2VuLkxFRlRfUEFSRU5USEVTSVMsCisgICAgICAgICAgICAgICAgICAgICAiKCIgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmlnaHRQYXJlbnRoZXNpcygpCisgICAgeworICAgICAgICBUb2tlbiB0b2tlbiA9IFRva2VuLnJpZ2h0UGFyZW50aGVzaXMoIExJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09MVU1OICk7CisKKyAgICAgICAgYXNzZXJ0VG9rZW4oIHRva2VuLAorICAgICAgICAgICAgICAgICAgICAgVG9rZW4uUklHSFRfUEFSRU5USEVTSVMsCisgICAgICAgICAgICAgICAgICAgICAiKSIgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG90KCkKKyAgICB7CisgICAgICAgIFRva2VuIHRva2VuID0gVG9rZW4uZG90KCBMSU5FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09MVU1OICk7CisKKyAgICAgICAgYXNzZXJ0VG9rZW4oIHRva2VuLAorICAgICAgICAgICAgICAgICAgICAgVG9rZW4uRE9ULAorICAgICAgICAgICAgICAgICAgICAgIi4iICk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERvdERvdCgpCisgICAgeworICAgICAgICBUb2tlbiB0b2tlbiA9IFRva2VuLmRvdERvdCggTElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTFVNTiApOworCisgICAgICAgIGFzc2VydFRva2VuKCB0b2tlbiwKKyAgICAgICAgICAgICAgICAgICAgIFRva2VuLkRPVF9ET1QsCisgICAgICAgICAgICAgICAgICAgICAiLi4iICk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5vdCgpCisgICAgeworICAgICAgICBUb2tlbiB0b2tlbiA9IFRva2VuLm5vdCggTElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTFVNTiApOworCisgICAgICAgIGFzc2VydFRva2VuKCB0b2tlbiwKKyAgICAgICAgICAgICAgICAgICAgIFRva2VuLk5PVCwKKyAgICAgICAgICAgICAgICAgICAgICIhIiApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wYXJlTm90RXF1YWwoKQorICAgIHsKKyAgICAgICAgVG9rZW4gdG9rZW4gPSBUb2tlbi5jb21wYXJlTm90RXF1YWwoIExJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0xVTU4gKTsKKworICAgICAgICBhc3NlcnRUb2tlbiggdG9rZW4sCisgICAgICAgICAgICAgICAgICAgICBUb2tlbi5DT01QQVJFX05PVF9FUVVBTCwKKyAgICAgICAgICAgICAgICAgICAgICIhPSIgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWwoKQorICAgIHsKKyAgICAgICAgVG9rZW4gdG9rZW4gPSBUb2tlbi5lcXVhbCggTElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09MVU1OICk7CisKKyAgICAgICAgYXNzZXJ0VG9rZW4oIHRva2VuLAorICAgICAgICAgICAgICAgICAgICAgVG9rZW4uRVFVQUwsCisgICAgICAgICAgICAgICAgICAgICAiPSIgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZUlkZW50aWNhbCgpCisgICAgeworICAgICAgICBUb2tlbiB0b2tlbiA9IFRva2VuLmNvbXBhcmVJZGVudGljYWwoIExJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09MVU1OICk7CisKKyAgICAgICAgYXNzZXJ0VG9rZW4oIHRva2VuLAorICAgICAgICAgICAgICAgICAgICAgVG9rZW4uQ09NUEFSRV9JREVOVElDQUwsCisgICAgICAgICAgICAgICAgICAgICAiPT09IiApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wYXJlRXF1YWwoKQorICAgIHsKKyAgICAgICAgVG9rZW4gdG9rZW4gPSBUb2tlbi5jb21wYXJlRXF1YWwoIExJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0xVTU4gKTsKKworICAgICAgICBhc3NlcnRUb2tlbiggdG9rZW4sCisgICAgICAgICAgICAgICAgICAgICBUb2tlbi5DT01QQVJFX0VRVUFMLAorICAgICAgICAgICAgICAgICAgICAgIj09IiApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wYXJlTGVzc1RoYW4oKQorICAgIHsKKyAgICAgICAgVG9rZW4gdG9rZW4gPSBUb2tlbi5jb21wYXJlTGVzc1RoYW4oIExJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0xVTU4gKTsKKworICAgICAgICBhc3NlcnRUb2tlbiggdG9rZW4sCisgICAgICAgICAgICAgICAgICAgICBUb2tlbi5DT01QQVJFX0xFU1NfVEhBTiwKKyAgICAgICAgICAgICAgICAgICAgICI8IiApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wYXJlTGVzc1RoYW5FcXVhbCgpCisgICAgeworICAgICAgICBUb2tlbiB0b2tlbiA9IFRva2VuLmNvbXBhcmVMZXNzVGhhbkVxdWFsKCBMSU5FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0xVTU4gKTsKKworICAgICAgICBhc3NlcnRUb2tlbiggdG9rZW4sCisgICAgICAgICAgICAgICAgICAgICBUb2tlbi5DT01QQVJFX0xFU1NfVEhBTl9FUVVBTCwKKyAgICAgICAgICAgICAgICAgICAgICI8PSIgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZUdyZWF0ZXJUaGFuKCkKKyAgICB7CisgICAgICAgIFRva2VuIHRva2VuID0gVG9rZW4uY29tcGFyZUdyZWF0ZXJUaGFuKCBMSU5FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09MVU1OICk7CisKKyAgICAgICAgYXNzZXJ0VG9rZW4oIHRva2VuLAorICAgICAgICAgICAgICAgICAgICAgVG9rZW4uQ09NUEFSRV9HUkVBVEVSX1RIQU4sCisgICAgICAgICAgICAgICAgICAgICAiPiIgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZUdyZWF0ZXJUaGFuRXF1YWwoKQorICAgIHsKKyAgICAgICAgVG9rZW4gdG9rZW4gPSBUb2tlbi5jb21wYXJlR3JlYXRlclRoYW5FcXVhbCggTElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09MVU1OICk7CisKKyAgICAgICAgYXNzZXJ0VG9rZW4oIHRva2VuLAorICAgICAgICAgICAgICAgICAgICAgVG9rZW4uQ09NUEFSRV9HUkVBVEVSX1RIQU5fRVFVQUwsCisgICAgICAgICAgICAgICAgICAgICAiPj0iICk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExvZ2ljYWxPcigpCisgICAgeworICAgICAgICBUb2tlbiB0b2tlbiA9IFRva2VuLmxvZ2ljYWxPciggTElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTFVNTiApOworCisgICAgICAgIGFzc2VydFRva2VuKCB0b2tlbiwKKyAgICAgICAgICAgICAgICAgICAgIFRva2VuLkxPR0lDQUxfT1IsCisgICAgICAgICAgICAgICAgICAgICAifHwiICk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExvZ2ljYWxBbmQoKQorICAgIHsKKyAgICAgICAgVG9rZW4gdG9rZW4gPSBUb2tlbi5sb2dpY2FsQW5kKCBMSU5FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTFVNTiApOworCisgICAgICAgIGFzc2VydFRva2VuKCB0b2tlbiwKKyAgICAgICAgICAgICAgICAgICAgIFRva2VuLkxPR0lDQUxfQU5ELAorICAgICAgICAgICAgICAgICAgICAgIiYmIiApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQbHVzKCkKKyAgICB7CisgICAgICAgIFRva2VuIHRva2VuID0gVG9rZW4ucGx1cyggTElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0xVTU4gKTsKKworICAgICAgICBhc3NlcnRUb2tlbiggdG9rZW4sCisgICAgICAgICAgICAgICAgICAgICBUb2tlbi5QTFVTLAorICAgICAgICAgICAgICAgICAgICAgIisiICk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFBsdXNQbHVzKCkKKyAgICB7CisgICAgICAgIFRva2VuIHRva2VuID0gVG9rZW4ucGx1c1BsdXMoIExJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTFVNTiApOworCisgICAgICAgIGFzc2VydFRva2VuKCB0b2tlbiwKKyAgICAgICAgICAgICAgICAgICAgIFRva2VuLlBMVVNfUExVUywKKyAgICAgICAgICAgICAgICAgICAgICIrKyIgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGx1c0VxdWFsKCkKKyAgICB7CisgICAgICAgIFRva2VuIHRva2VuID0gVG9rZW4ucGx1c0VxdWFsKCBMSU5FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09MVU1OICk7CisKKyAgICAgICAgYXNzZXJ0VG9rZW4oIHRva2VuLAorICAgICAgICAgICAgICAgICAgICAgVG9rZW4uUExVU19FUVVBTCwKKyAgICAgICAgICAgICAgICAgICAgICIrPSIgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWludXMoKQorICAgIHsKKyAgICAgICAgVG9rZW4gdG9rZW4gPSBUb2tlbi5taW51cyggTElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09MVU1OICk7CisKKyAgICAgICAgYXNzZXJ0VG9rZW4oIHRva2VuLAorICAgICAgICAgICAgICAgICAgICAgVG9rZW4uTUlOVVMsCisgICAgICAgICAgICAgICAgICAgICAiLSIgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWludXNNaW51cygpCisgICAgeworICAgICAgICBUb2tlbiB0b2tlbiA9IFRva2VuLm1pbnVzTWludXMoIExJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09MVU1OICk7CisKKyAgICAgICAgYXNzZXJ0VG9rZW4oIHRva2VuLAorICAgICAgICAgICAgICAgICAgICAgVG9rZW4uTUlOVVNfTUlOVVMsCisgICAgICAgICAgICAgICAgICAgICAiLS0iICk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE1pbnVzRXF1YWwoKQorICAgIHsKKyAgICAgICAgVG9rZW4gdG9rZW4gPSBUb2tlbi5taW51c0VxdWFsKCBMSU5FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTFVNTiApOworCisgICAgICAgIGFzc2VydFRva2VuKCB0b2tlbiwKKyAgICAgICAgICAgICAgICAgICAgIFRva2VuLk1JTlVTX0VRVUFMLAorICAgICAgICAgICAgICAgICAgICAgIi09IiApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3REaXZpZGUoKQorICAgIHsKKyAgICAgICAgVG9rZW4gdG9rZW4gPSBUb2tlbi5kaXZpZGUoIExJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0xVTU4gKTsKKworICAgICAgICBhc3NlcnRUb2tlbiggdG9rZW4sCisgICAgICAgICAgICAgICAgICAgICBUb2tlbi5ESVZJREUsCisgICAgICAgICAgICAgICAgICAgICAiLyIgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGl2aWRlRXF1YWwoKQorICAgIHsKKyAgICAgICAgVG9rZW4gdG9rZW4gPSBUb2tlbi5kaXZpZGVFcXVhbCggTElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09MVU1OICk7CisKKyAgICAgICAgYXNzZXJ0VG9rZW4oIHRva2VuLAorICAgICAgICAgICAgICAgICAgICAgVG9rZW4uRElWSURFX0VRVUFMLAorICAgICAgICAgICAgICAgICAgICAgIi89IiApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RNb2QoKQorICAgIHsKKyAgICAgICAgVG9rZW4gdG9rZW4gPSBUb2tlbi5tb2QoIExJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0xVTU4gKTsKKworICAgICAgICBhc3NlcnRUb2tlbiggdG9rZW4sCisgICAgICAgICAgICAgICAgICAgICBUb2tlbi5NT0QsCisgICAgICAgICAgICAgICAgICAgICAiJSIgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kRXF1YWwoKQorICAgIHsKKyAgICAgICAgVG9rZW4gdG9rZW4gPSBUb2tlbi5tb2RFcXVhbCggTElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09MVU1OICk7CisKKyAgICAgICAgYXNzZXJ0VG9rZW4oIHRva2VuLAorICAgICAgICAgICAgICAgICAgICAgVG9rZW4uTU9EX0VRVUFMLAorICAgICAgICAgICAgICAgICAgICAgIiU9IiApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBseSgpCisgICAgeworICAgICAgICBUb2tlbiB0b2tlbiA9IFRva2VuLm11bHRpcGx5KCBMSU5FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0xVTU4gKTsKKworICAgICAgICBhc3NlcnRUb2tlbiggdG9rZW4sCisgICAgICAgICAgICAgICAgICAgICBUb2tlbi5NVUxUSVBMWSwKKyAgICAgICAgICAgICAgICAgICAgICIqIiApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBseUVxdWFsKCkKKyAgICB7CisgICAgICAgIFRva2VuIHRva2VuID0gVG9rZW4ubXVsdGlwbHlFcXVhbCggTElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0xVTU4gKTsKKworICAgICAgICBhc3NlcnRUb2tlbiggdG9rZW4sCisgICAgICAgICAgICAgICAgICAgICBUb2tlbi5NVUxUSVBMWV9FUVVBTCwKKyAgICAgICAgICAgICAgICAgICAgICIqPSIgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tbWEoKQorICAgIHsKKyAgICAgICAgVG9rZW4gdG9rZW4gPSBUb2tlbi5jb21tYSggTElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09MVU1OICk7CisKKyAgICAgICAgYXNzZXJ0VG9rZW4oIHRva2VuLAorICAgICAgICAgICAgICAgICAgICAgVG9rZW4uQ09NTUEsCisgICAgICAgICAgICAgICAgICAgICAiLCIgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29sb24oKQorICAgIHsKKyAgICAgICAgVG9rZW4gdG9rZW4gPSBUb2tlbi5jb2xvbiggTElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09MVU1OICk7CisKKyAgICAgICAgYXNzZXJ0VG9rZW4oIHRva2VuLAorICAgICAgICAgICAgICAgICAgICAgVG9rZW4uQ09MT04sCisgICAgICAgICAgICAgICAgICAgICAiOiIgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VtaWNvbG9uKCkKKyAgICB7CisgICAgICAgIFRva2VuIHRva2VuID0gVG9rZW4uc2VtaWNvbG9uKCBMSU5FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09MVU1OICk7CisKKyAgICAgICAgYXNzZXJ0VG9rZW4oIHRva2VuLAorICAgICAgICAgICAgICAgICAgICAgVG9rZW4uU0VNSUNPTE9OLAorICAgICAgICAgICAgICAgICAgICAgIjsiICk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFF1ZXN0aW9uKCkKKyAgICB7CisgICAgICAgIFRva2VuIHRva2VuID0gVG9rZW4ucXVlc3Rpb24oIExJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTFVNTiApOworCisgICAgICAgIGFzc2VydFRva2VuKCB0b2tlbiwKKyAgICAgICAgICAgICAgICAgICAgIFRva2VuLlFVRVNUSU9OLAorICAgICAgICAgICAgICAgICAgICAgIj8iICk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFBpcGUoKQorICAgIHsKKyAgICAgICAgVG9rZW4gdG9rZW4gPSBUb2tlbi5waXBlKCBMSU5FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTFVNTiApOworCisgICAgICAgIGFzc2VydFRva2VuKCB0b2tlbiwKKyAgICAgICAgICAgICAgICAgICAgIFRva2VuLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAifCIgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlUXVvdGVTdHJpbmcoKQorICAgIHsKKyAgICAgICAgVG9rZW4gdG9rZW4gPSBUb2tlbi5kb3VibGVRdW90ZVN0cmluZyggTElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09MVU1OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hlZXNlIiApOworCisgICAgICAgIGFzc2VydFRva2VuKCB0b2tlbiwKKyAgICAgICAgICAgICAgICAgICAgIFRva2VuLkRPVUJMRV9RVU9URV9TVFJJTkcsCisgICAgICAgICAgICAgICAgICAgICAiY2hlZXNlIiwKKyAgICAgICAgICAgICAgICAgICAgICI8c3RyaW5nIGxpdGVyYWw+Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNpbmdsZVF1b3RlU3RyaW5nKCkKKyAgICB7CisgICAgICAgIFRva2VuIHRva2VuID0gVG9rZW4uc2luZ2xlUXVvdGVTdHJpbmcoIExJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTFVNTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoZWVzZSIgKTsKKworICAgICAgICBhc3NlcnRUb2tlbiggdG9rZW4sCisgICAgICAgICAgICAgICAgICAgICBUb2tlbi5TSU5HTEVfUVVPVEVfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgImNoZWVzZSIsCisgICAgICAgICAgICAgICAgICAgICAiPHN0cmluZyBsaXRlcmFsPiIgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SWRlbnRpZmllcigpCisgICAgeworICAgICAgICBUb2tlbiB0b2tlbiA9IFRva2VuLmlkZW50aWZpZXIoIExJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09MVU1OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaGVlc2UiICk7CisKKyAgICAgICAgYXNzZXJ0VG9rZW4oIHRva2VuLAorICAgICAgICAgICAgICAgICAgICAgVG9rZW4uSURFTlRJRklFUiwKKyAgICAgICAgICAgICAgICAgICAgICJjaGVlc2UiLAorICAgICAgICAgICAgICAgICAgICAgIjxpZGVudGlmaWVyPiIgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW50ZWdlck51bWJlcigpCisgICAgeworICAgICAgICBUb2tlbiB0b2tlbiA9IFRva2VuLmludGVnZXJOdW1iZXIoIExJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09MVU1OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI0MiIgKTsKKworICAgICAgICBhc3NlcnRUb2tlbiggdG9rZW4sCisgICAgICAgICAgICAgICAgICAgICBUb2tlbi5JTlRFR0VSX05VTUJFUiwKKyAgICAgICAgICAgICAgICAgICAgICI0MiIsCisgICAgICAgICAgICAgICAgICAgICAiPG51bWJlcj4iICk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZsb2F0TnVtYmVyKCkKKyAgICB7CisgICAgICAgIFRva2VuIHRva2VuID0gVG9rZW4uZmxvYXROdW1iZXIoIExJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTFVNTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjQyLjg0IiApOworCisgICAgICAgIGFzc2VydFRva2VuKCB0b2tlbiwKKyAgICAgICAgICAgICAgICAgICAgIFRva2VuLkZMT0FUX05VTUJFUiwKKyAgICAgICAgICAgICAgICAgICAgICI0Mi44NCIsCisgICAgICAgICAgICAgICAgICAgICAiPG51bWJlcj4iICk7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX0FzKCkKKyAgICB7CisgICAgICAgIGFzc2VydEtleXdvcmRUb2tlbiggImFzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbi5LRVlXT1JEX0FTICk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEtleXdvcmRfQWJzdHJhY3QoKQorICAgIHsKKyAgICAgICAgYXNzZXJ0S2V5d29yZFRva2VuKCAiYWJzdHJhY3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuLktFWVdPUkRfQUJTVFJBQ1QgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5d29yZF9CcmVhaygpCisgICAgeworICAgICAgICBhc3NlcnRLZXl3b3JkVG9rZW4oICJicmVhayIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW4uS0VZV09SRF9CUkVBSyApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX0Nhc2UoKQorICAgIHsKKyAgICAgICAgYXNzZXJ0S2V5d29yZFRva2VuKCAiY2FzZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW4uS0VZV09SRF9DQVNFICk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEtleXdvcmRfQ2F0Y2goKQorICAgIHsKKyAgICAgICAgYXNzZXJ0S2V5d29yZFRva2VuKCAiY2F0Y2giLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuLktFWVdPUkRfQ0FUQ0ggKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5d29yZF9DbGFzcygpCisgICAgeworICAgICAgICBhc3NlcnRLZXl3b3JkVG9rZW4oICJjbGFzcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW4uS0VZV09SRF9DTEFTUyApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX0NvbnN0KCkKKyAgICB7CisgICAgICAgIGFzc2VydEtleXdvcmRUb2tlbiggImNvbnN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbi5LRVlXT1JEX0NPTlNUICk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEtleXdvcmRfQ29udGludWUoKQorICAgIHsKKyAgICAgICAgYXNzZXJ0S2V5d29yZFRva2VuKCAiY29udGludWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuLktFWVdPUkRfQ09OVElOVUUgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5d29yZF9EZWZhdWx0KCkKKyAgICB7CisgICAgICAgIGFzc2VydEtleXdvcmRUb2tlbiggImRlZmF1bHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuLktFWVdPUkRfREVGQVVMVCApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX0RvKCkKKyAgICB7CisgICAgICAgIGFzc2VydEtleXdvcmRUb2tlbiggImRvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbi5LRVlXT1JEX0RPICk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEtleXdvcmRfRWxzZSgpCisgICAgeworICAgICAgICBhc3NlcnRLZXl3b3JkVG9rZW4oICJlbHNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbi5LRVlXT1JEX0VMU0UgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5d29yZF9FeHRlbmRzKCkKKyAgICB7CisgICAgICAgIGFzc2VydEtleXdvcmRUb2tlbiggImV4dGVuZHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuLktFWVdPUkRfRVhURU5EUyApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX0ZpbmFsKCkKKyAgICB7CisgICAgICAgIGFzc2VydEtleXdvcmRUb2tlbiggImZpbmFsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbi5LRVlXT1JEX0ZJTkFMICk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEtleXdvcmRfRmluYWxseSgpCisgICAgeworICAgICAgICBhc3NlcnRLZXl3b3JkVG9rZW4oICJmaW5hbGx5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbi5LRVlXT1JEX0ZJTkFMTFkgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5d29yZF9Gb3IoKQorICAgIHsKKyAgICAgICAgYXNzZXJ0S2V5d29yZFRva2VuKCAiZm9yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbi5LRVlXT1JEX0ZPUiApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX0dvdG8oKQorICAgIHsKKyAgICAgICAgYXNzZXJ0S2V5d29yZFRva2VuKCAiZ290byIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW4uS0VZV09SRF9HT1RPICk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEtleXdvcmRfSWYoKQorICAgIHsKKyAgICAgICAgYXNzZXJ0S2V5d29yZFRva2VuKCAiaWYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuLktFWVdPUkRfSUYgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5d29yZF9JbXBsZW1lbnRzKCkKKyAgICB7CisgICAgICAgIGFzc2VydEtleXdvcmRUb2tlbiggImltcGxlbWVudHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuLktFWVdPUkRfSU1QTEVNRU5UUyApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX0ltcG9ydCgpCisgICAgeworICAgICAgICBhc3NlcnRLZXl3b3JkVG9rZW4oICJpbXBvcnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuLktFWVdPUkRfSU1QT1JUICk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEtleXdvcmRfSW5zdGFuY2VvZigpCisgICAgeworICAgICAgICBhc3NlcnRLZXl3b3JkVG9rZW4oICJpbnN0YW5jZW9mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbi5LRVlXT1JEX0lOU1RBTkNFT0YgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5d29yZF9JbnRlcmZhY2UoKQorICAgIHsKKyAgICAgICAgYXNzZXJ0S2V5d29yZFRva2VuKCAiaW50ZXJmYWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbi5LRVlXT1JEX0lOVEVSRkFDRSApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX05hdGl2ZSgpCisgICAgeworICAgICAgICBhc3NlcnRLZXl3b3JkVG9rZW4oICJuYXRpdmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuLktFWVdPUkRfTkFUSVZFICk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEtleXdvcmRfTmV3KCkKKyAgICB7CisgICAgICAgIGFzc2VydEtleXdvcmRUb2tlbiggIm5ldyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW4uS0VZV09SRF9ORVcgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5d29yZF9QYWNrYWdlKCkKKyAgICB7CisgICAgICAgIGFzc2VydEtleXdvcmRUb2tlbiggInBhY2thZ2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuLktFWVdPUkRfUEFDS0FHRSApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX1ByaXZhdGUoKQorICAgIHsKKyAgICAgICAgYXNzZXJ0S2V5d29yZFRva2VuKCAicHJpdmF0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW4uS0VZV09SRF9QUklWQVRFICk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEtleXdvcmRfUHJvcGVydHkoKQorICAgIHsKKyAgICAgICAgYXNzZXJ0S2V5d29yZFRva2VuKCAicHJvcGVydHkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuLktFWVdPUkRfUFJPUEVSVFkgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5d29yZF9Qcm90ZWN0ZWQoKQorICAgIHsKKyAgICAgICAgYXNzZXJ0S2V5d29yZFRva2VuKCAicHJvdGVjdGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbi5LRVlXT1JEX1BST1RFQ1RFRCApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX1B1YmxpYygpCisgICAgeworICAgICAgICBhc3NlcnRLZXl3b3JkVG9rZW4oICJwdWJsaWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuLktFWVdPUkRfUFVCTElDICk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEtleXdvcmRfUmV0dXJuKCkKKyAgICB7CisgICAgICAgIGFzc2VydEtleXdvcmRUb2tlbiggInJldHVybiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW4uS0VZV09SRF9SRVRVUk4gKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5d29yZF9TdGF0aWMoKQorICAgIHsKKyAgICAgICAgYXNzZXJ0S2V5d29yZFRva2VuKCAic3RhdGljIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbi5LRVlXT1JEX1NUQVRJQyApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX1N1cGVyKCkKKyAgICB7CisgICAgICAgIGFzc2VydEtleXdvcmRUb2tlbiggInN1cGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbi5LRVlXT1JEX1NVUEVSICk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEtleXdvcmRfU3dpdGNoKCkKKyAgICB7CisgICAgICAgIGFzc2VydEtleXdvcmRUb2tlbiggInN3aXRjaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW4uS0VZV09SRF9TV0lUQ0ggKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5d29yZF9TeW5jaHJvbml6ZWQoKQorICAgIHsKKyAgICAgICAgYXNzZXJ0S2V5d29yZFRva2VuKCAic3luY2hyb25pemVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbi5LRVlXT1JEX1NZTkNIUk9OSVpFRCApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX1RoaXMoKQorICAgIHsKKyAgICAgICAgYXNzZXJ0S2V5d29yZFRva2VuKCAidGhpcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW4uS0VZV09SRF9USElTICk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEtleXdvcmRfVGhyb3coKQorICAgIHsKKyAgICAgICAgYXNzZXJ0S2V5d29yZFRva2VuKCAidGhyb3ciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuLktFWVdPUkRfVEhST1cgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5d29yZF9UaHJvd3MoKQorICAgIHsKKyAgICAgICAgYXNzZXJ0S2V5d29yZFRva2VuKCAidGhyb3dzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2tlbi5LRVlXT1JEX1RIUk9XUyApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkX1RyeSgpCisgICAgeworICAgICAgICBhc3NlcnRLZXl3b3JkVG9rZW4oICJ0cnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuLktFWVdPUkRfVFJZICk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEtleXdvcmRfV2hpbGUoKQorICAgIHsKKyAgICAgICAgYXNzZXJ0S2V5d29yZFRva2VuKCAid2hpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuLktFWVdPUkRfV0hJTEUgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlS2V5d29yZFR5cGVzKCkKKyAgICB7CisgICAgICAgIE1hcCBrZXl3b3JkcyA9IFRva2VuLmdldEtleXdvcmRNYXAoKTsKKworICAgICAgICBTZXQgdHlwZXMgPSBuZXcgSGFzaFNldCgpOworCisgICAgICAgIHR5cGVzLmFkZEFsbCgga2V5d29yZHMudmFsdWVzKCkgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIHR5cGVzLnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICBrZXl3b3Jkcy5zaXplKCkgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VW5rbm93blRva2VuVHlwZSgpCisgICAgeworICAgICAgICBhc3NlcnRFcXVhbHMoICI8dW5rbm93bj4iLAorICAgICAgICAgICAgICAgICAgICAgIFRva2VuLmdldFRva2VuRGVzY3JpcHRpb24oIDY2NjYgKSApOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRLZXl3b3JkVG9rZW4oU3RyaW5nIHRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBleHBlY3RlZFR5cGUpCisgICAgeworICAgICAgICBUb2tlbiB0b2tlbiA9IFRva2VuLmtleXdvcmQoIExJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09MVU1OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKTsKKworICAgICAgICBhc3NlcnRUb2tlbiggdG9rZW4sCisgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICB0ZXh0ICk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0VG9rZW4oVG9rZW4gdG9rZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRleHQpCisgICAgeworICAgICAgICBhc3NlcnRUb2tlbiggdG9rZW4sCisgICAgICAgICAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICciJyArIHRleHQgKyAnIicgKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRUb2tlbihUb2tlbiB0b2tlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGVzY3JpcHRpb24pCisgICAgeworICAgICAgICBhc3NlcnRFcXVhbHMoIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgdG9rZW4uZ2V0VHlwZSgpICk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCB0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgIHRva2VuLmdldFRleHQoKSApOworCisgICAgICAgIGFzc2VydEVxdWFscyggZGVzY3JpcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgdG9rZW4uZ2V0RGVzY3JpcHRpb24oKSApOworCisgICAgICAgIGFzc2VydEVxdWFscyggTElORSwKKyAgICAgICAgICAgICAgICAgICAgICB0b2tlbi5nZXRTdGFydExpbmUoKSApOworCisgICAgICAgIGFzc2VydEVxdWFscyggQ09MVU1OLAorICAgICAgICAgICAgICAgICAgICAgIHRva2VuLmdldFN0YXJ0Q29sdW1uKCkgKTsKKyAgICB9CisgICAgCisqLworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L3BhcnNlci9UZXN0UGFyc2VyU3VwcG9ydC5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvc3ludGF4L3BhcnNlci9UZXN0UGFyc2VyU3VwcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZjQ5ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS9zeW50YXgvcGFyc2VyL1Rlc3RQYXJzZXJTdXBwb3J0LmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqICRJZCQKKyAqIAorICogQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4KKyAqIGNvcHlyaWdodCBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiBSZWRpc3RyaWJ1dGlvbnMgbXVzdCBhbHNvIGNvbnRhaW4gYSBjb3B5CisgKiBvZiB0aGlzIGRvY3VtZW50LiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gMy4KKyAqIFRoZSBuYW1lICJncm9vdnkiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuIEZvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4gNC4gUHJvZHVjdHMgZGVyaXZlZAorICogZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluCisgKiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEKKyAqIHJlZ2lzdGVyZWQgdHJhZGVtYXJrIG9mIFRoZSBDb2RlaGF1cy4gNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlCisgKiBDb2RlaGF1cyAtIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLworICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqICAKKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnN5bnRheC5wYXJzZXI7CisKK2ltcG9ydCBncm9vdnkudXRpbC5Hcm9vdnlUZXN0Q2FzZTsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LmFzdC5Nb2R1bGVOb2RlOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5Tb3VyY2VVbml0OworCisKKy8qKgorICogQW4gYWJzdHJhY3QgYmFzZSBjbGFzcyB1c2VmdWwgZm9yIEFTVCBwYXJzZXIgcmVsYXRlZCB0ZXN0IGNhc2VzCisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFRlc3RQYXJzZXJTdXBwb3J0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UgeworCisgICAgcHVibGljIE1vZHVsZU5vZGUgcGFyc2UoU3RyaW5nIHRleHQsIFN0cmluZyBkZXNjcmlwdGlvbikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFNvdXJjZVVuaXQgdW5pdCA9IFNvdXJjZVVuaXQuY3JlYXRlKGRlc2NyaXB0aW9uLCB0ZXh0KTsKKyAgICAgICAgdW5pdC5wYXJzZSgpOworICAgICAgICB1bml0LmNvbnZlcnQoKTsKKworICAgICAgICByZXR1cm4gdW5pdC5nZXRBU1QoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9Db21waWxlclRlc3QuamF2YSBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL0NvbXBpbGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ZGJlNzAKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9Db21waWxlclRlc3QuamF2YQpAQCAtMCwwICsxLDkyIEBACisvKgorICRJZCQKKworIENvcHlyaWdodCAyMDAzIChDKSBKYW1lcyBTdHJhY2hhbiBhbmQgQm9iIE1jd2hpcnRlci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCisgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQKKyAgICBzdGF0ZW1lbnRzIGFuZCBub3RpY2VzLiAgUmVkaXN0cmlidXRpb25zIG11c3QgYWxzbyBjb250YWluIGEKKyAgICBjb3B5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlCisgICAgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZQorICAgIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlcgorICAgIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwKKyAgICBwbGVhc2UgY29udGFjdCBpbmZvQGNvZGVoYXVzLm9yZy4KKworIDQuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJncm9vdnkiCisgICAgbm9yIG1heSAiZ3Jvb3Z5IiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgICAgcGVybWlzc2lvbiBvZiBUaGUgQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZAorICAgIHRyYWRlbWFyayBvZiBUaGUgQ29kZWhhdXMuCisKKyA1LiBEdWUgY3JlZGl0IHNob3VsZCBiZSBnaXZlbiB0byBUaGUgQ29kZWhhdXMgLQorICAgIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLworCisgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09ERUhBVVMgQU5EIENPTlRSSUJVVE9SUworIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAorIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKKyBUSEUgQ09ERUhBVVMgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgKi8KKworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzOworCitpbXBvcnQgZ3Jvb3Z5LnV0aWwuR3Jvb3Z5VGVzdENhc2U7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS5jb250cm9sLkNvbXBpbGVyQ29uZmlndXJhdGlvbjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworLyoqCisgKiBBIGhhbmR5IHVuaXQgdGVzdCBjYXNlIGZvciBkdW1waW5nIHRoZSBvdXRwdXQgb2YgdGhlIGNvbXBpbGVyCisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFtZXNAY29yZWRldmVsb3BlcnMubmV0Ij5KYW1lcyBTdHJhY2hhbjwvYT4KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIENvbXBpbGVyVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIENvbXBpbGVyIGNvbXBpbGVyID0gbnVsbDsKKyAgICBib29sZWFuIGR1bXBDbGFzcyA9IHRydWU7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kQ2FsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvL3J1blRlc3QoIkNsb3N1cmVNZXRob2RUZXN0Lmdyb292eSIpOworICAgICAgICAvL3J1blRlc3QoInRyZWUvVmVyYm9zZVRyZWVUZXN0Lmdyb292eSIpOworICAgICAgICAvL3J1blRlc3QoInRyZWUvTmVzdGVkQ2xvc3VyZUJ1Z1Rlc3QuZ3Jvb3Z5Iik7CisgICAgICAgIHJ1blRlc3QoInRyZWUvU21hbGxUcmVlVGVzdC5ncm9vdnkiKTsKKyAgICAgICAgLy9ydW5UZXN0KCJMaXR0bGVDbG9zdXJlVGVzdC5ncm9vdnkiKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KFN0cmluZyBuYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoInNyYy90ZXN0L2dyb292eS8iICsgbmFtZSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiQ291bGQgbm90IGZpbmQgc291cmNlIGZpbGU6ICIgKyBmaWxlLCBmaWxlLmV4aXN0cygpKTsKKworICAgICAgICBjb21waWxlci5jb21waWxlKGZpbGUpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEZpbGUgZGlyID0gbmV3IEZpbGUoInRhcmdldC90ZXN0LWdlbmVyYXRlZC1jbGFzc2VzIik7CisgICAgICAgIGRpci5ta2RpcnMoKTsKKworICAgICAgICBDb21waWxlckNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IENvbXBpbGVyQ29uZmlndXJhdGlvbigpOworICAgICAgICBjb25maWcuc2V0VGFyZ2V0RGlyZWN0b3J5KGRpcik7CisgICAgICAgIGNvbmZpZy5zZXREZWJ1ZyhkdW1wQ2xhc3MpOworCisgICAgICAgIGNvbXBpbGVyID0gbmV3IENvbXBpbGVyKGNvbmZpZyk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9Eb2NHZW5lcmF0b3JNYWluLmphdmEgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9Eb2NHZW5lcmF0b3JNYWluLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI4YmFhMAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL0RvY0dlbmVyYXRvck1haW4uamF2YQpAQCAtMCwwICsxLDIwIEBACitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHM7CisKK2ltcG9ydCBncm9vdnkubGFuZy5Hcm9vdnlTaGVsbDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworcHVibGljIGNsYXNzIERvY0dlbmVyYXRvck1haW4geworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgR3Jvb3Z5U2hlbGwgc2hlbGwgPSBuZXcgR3Jvb3Z5U2hlbGwoKTsKKyAgICAgICAgICAgIC8vc2hlbGwucnVuKCJzcmMvbWFpbi9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL0RvY0dlbmVyYXRvci5ncm9vdnkiLCAib3JnLmNvZGVoYXVzLmdyb292eS50b29scy5Eb2NHZW5lcmF0b3IuZ3Jvb3Z5IiwgYXJncyk7CisgICAgICAgICAgICBzaGVsbC5ydW4obmV3IEZpbGUoInNyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvRG9jR2VuZXJhdG9yLmdyb292eSIpLCBhcmdzKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmFpbGVkOiAiICsgZSk7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvRmlsZVN5c3RlbUNvbXBpbGVyVGVzdC5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvRmlsZVN5c3RlbUNvbXBpbGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMzg2YjQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9GaWxlU3lzdGVtQ29tcGlsZXJUZXN0LmphdmEKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAkSWQkCisKKyBDb3B5cmlnaHQgMjAwMyAoQykgSmFtZXMgU3RyYWNoYW4gYW5kIEJvYiBNY3doaXJ0ZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICgiU29mdHdhcmUiKSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAorIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gY29weXJpZ2h0CisgICAgc3RhdGVtZW50cyBhbmQgbm90aWNlcy4gIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhCisgICAgY29weSBvZiB0aGlzIGRvY3VtZW50LgorCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZQorICAgIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUKKyAgICBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIKKyAgICBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgMy4gVGhlIG5hbWUgImdyb292eSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAgICBwZXJtaXNzaW9uIG9mIFRoZSBDb2RlaGF1cy4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sCisgICAgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCisKKyA0LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiZ3Jvb3Z5IgorICAgIG5vciBtYXkgImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICAgIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLiAiZ3Jvb3Z5IiBpcyBhIHJlZ2lzdGVyZWQKKyAgICB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgorCisgNS4gRHVlIGNyZWRpdCBzaG91bGQgYmUgZ2l2ZW4gdG8gVGhlIENvZGVoYXVzIC0KKyAgICBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZy8KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPREVIQVVTIEFORCBDT05UUklCVVRPUlMKKyBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVAorIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKKyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCisgVEhFIENPREVIQVVTIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS50b29sczsKKworaW1wb3J0IGdyb292eS51dGlsLkdyb292eVRlc3RDYXNlOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuY29udHJvbC5Db21waWxlckNvbmZpZ3VyYXRpb247CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBUZXN0cyB0aGUgY29tcGlsaW5nICYgcnVubmluZyBvZiBHcm9vdnlUZXN0Q2FzZXMKKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYW1lc0Bjb3JlZGV2ZWxvcGVycy5uZXQiPkphbWVzIFN0cmFjaGFuPC9hPgorICogQHZlcnNpb24gJFJldmlzaW9uJAorICovCitwdWJsaWMgY2xhc3MgRmlsZVN5c3RlbUNvbXBpbGVyVGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsKKworICAgIEZpbGVTeXN0ZW1Db21waWxlciBjb21waWxlciA9IG51bGw7CisgICAgZmluYWwgYm9vbGVhbiBkdW1wQ2xhc3MgPSB0cnVlOworCisgICAgcHVibGljIHZvaWQgdGVzdE1ldGhvZENhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy9ydW5UZXN0KCJDbG9zdXJlTWV0aG9kVGVzdC5ncm9vdnkiKTsKKyAgICAgICAgLy9ydW5UZXN0KCJ0cmVlL1ZlcmJvc2VUcmVlVGVzdC5ncm9vdnkiKTsKKyAgICAgICAgLy9ydW5UZXN0KCJ0cmVlL05lc3RlZENsb3N1cmVCdWdUZXN0Lmdyb292eSIpOworICAgICAgICBydW5UZXN0KCJ0cmVlL1NtYWxsVHJlZVRlc3QuZ3Jvb3Z5Iik7CisgICAgICAgIC8vcnVuVGVzdCgiTGl0dGxlQ2xvc3VyZVRlc3QuZ3Jvb3Z5Iik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgcnVuVGVzdChTdHJpbmcgbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKCJzcmMvdGVzdC9ncm9vdnkvIiArIG5hbWUpOworCisgICAgICAgIGFzc2VydFRydWUoIkNvdWxkIG5vdCBmaW5kIHNvdXJjZSBmaWxlOiAiICsgZmlsZSwgZmlsZS5leGlzdHMoKSk7CisKKyAgICAgICAgY29tcGlsZXIuY29tcGlsZShuZXcgRmlsZVtde2ZpbGV9KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBGaWxlIGRpciA9IG5ldyBGaWxlKCJ0YXJnZXQvdGVzdC1nZW5lcmF0ZWQtY2xhc3NlcyIpOworICAgICAgICBkaXIubWtkaXJzKCk7CisgICAgICAgIE1hcCBvcHRpb25zID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgb3B0aW9ucy5wdXQoInN0dWJEaXIiLCBkaXIpOworCisgICAgICAgIENvbXBpbGVyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gbmV3IENvbXBpbGVyQ29uZmlndXJhdGlvbigpOworICAgICAgICBjb25maWd1cmF0aW9uLnNldFRhcmdldERpcmVjdG9yeShkaXIpOworICAgICAgICBjb25maWd1cmF0aW9uLnNldFZlcmJvc2UoZHVtcENsYXNzKTsKKyAgICAgICAgY29uZmlndXJhdGlvbi5zZXRKb2ludENvbXBpbGF0aW9uT3B0aW9ucyhvcHRpb25zKTsKKworICAgICAgICBjb21waWxlciA9IG5ldyBGaWxlU3lzdGVtQ29tcGlsZXIoY29uZmlndXJhdGlvbik7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9GaW5kQWxsVGVzdHNTdWl0ZS5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvRmluZEFsbFRlc3RzU3VpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTA0N2VkCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvRmluZEFsbFRlc3RzU3VpdGUuamF2YQpAQCAtMCwwICsxLDEzMSBAQAorLyoKKyAqICRJZCQKKyAqIAorICogQ29weXJpZ2h0IDIwMDMgKEMpIEphbWVzIFN0cmFjaGFuIGFuZCBCb2IgTWN3aGlydGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogKCJTb2Z0d2FyZSIpLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiBjb3B5cmlnaHQgc3RhdGVtZW50cyBhbmQKKyAqIG5vdGljZXMuIFJlZGlzdHJpYnV0aW9ucyBtdXN0IGFsc28gY29udGFpbiBhIGNvcHkgb2YgdGhpcyBkb2N1bWVudC4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAzLiBUaGUgbmFtZSAiZ3Jvb3Z5IiBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgVGhlIENvZGVoYXVzLgorICogRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgaW5mb0Bjb2RlaGF1cy5vcmcuCisgKiAgNC4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgU29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgImdyb292eSIgbm9yIG1heQorICogImdyb292eSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFRoZQorICogQ29kZWhhdXMuICJncm9vdnkiIGlzIGEgcmVnaXN0ZXJlZCB0cmFkZW1hcmsgb2YgVGhlIENvZGVoYXVzLgorICogIDUuIER1ZSBjcmVkaXQgc2hvdWxkIGJlIGdpdmVuIHRvIFRoZSBDb2RlaGF1cyAtIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLworICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT0RFSEFVUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT0RFSEFVUyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqICAKKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKK2ltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBBIFRlc3RTdWl0ZSB3aGljaCB3aWxsIHJ1biBhIEdyb292eSB1bml0IHRlc3QgY2FzZSBpbnNpZGUgYW55IEphdmEgSURFCisgKiBlaXRoZXIgYXMgYSB1bml0IHRlc3QgY2FzZSBvciBhcyBhbiBhcHBsaWNhdGlvbi4KKyAqIDxwLz4KKyAqIFlvdSBjYW4gc3BlY2lmeSB0aGUgR3Jvb3Z5VW5pdFRlc3QgdG8gcnVuIGJ5IHJ1bm5pbmcgdGhpcyBjbGFzcyBhcyBhbiBhcHBwbGljYXRpb24KKyAqIGFuZCBzcGVjaWZ5aW5nIHRoZSBzY3JpcHQgdG8gcnVuIG9uIHRoZSBjb21tYW5kIGxpbmUuCisgKiA8cC8+CisgKiA8Y29kZT4KKyAqIGphdmEgZ3Jvb3Z5LnV0aWwuR3Jvb3Z5VGVzdFN1aXRlIHNyYy90ZXN0L0Zvby5ncm9vdnkKKyAqIDwvY29kZT4KKyAqIDxwLz4KKyAqIE9yIHRvIHJ1biB0aGUgdGVzdCBzdWl0ZSBhcyBhIHVuaXQgdGVzdCBzdWl0ZSBpbiBhbiBJREUgeW91IGNhbiB1c2UKKyAqIHRoZSAndGVzdCcgc3lzdGVtIHByb3BlcnR5IHRvIGRlZmluZSB0aGUgdGVzdCBzY3JpcHQgdG8gcnVuLgorICogZS5nLiBwYXNzIHRoaXMgaW50byB0aGUgSlZNIHdoZW4gdGhlIHVuaXQgdGVzdCBwbHVnaW4gcnVucy4uLgorICogPHAvPgorICogPGNvZGU+CisgKiAtRHRlc3Q9c3JjL3Rlc3QvRm9vLmdyb292eQorICogPC9jb2RlPgorICoKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphbWVzQGNvcmVkZXZlbG9wZXJzLm5ldCI+SmFtZXMgU3RyYWNoYW48L2E+CisgKiBAdmVyc2lvbiAkUmV2aXNpb24kCisgKi8KK3B1YmxpYyBjbGFzcyBGaW5kQWxsVGVzdHNTdWl0ZSBleHRlbmRzIFRlc3RTdWl0ZSB7CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyB0ZXN0RGlyZWN0b3J5ID0gInRhcmdldC90ZXN0LWNsYXNzZXMiOworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisgICAgICAgIEZpbmRBbGxUZXN0c1N1aXRlIHN1aXRlID0gbmV3IEZpbmRBbGxUZXN0c1N1aXRlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdWl0ZS5sb2FkVGVzdFN1aXRlKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSB0aGUgdGVzdCBzdWl0ZTogIiArIGUsIGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdWl0ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsb2FkVGVzdFN1aXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJlY3Vyc2VEaXJlY3RvcnkobmV3IEZpbGUodGVzdERpcmVjdG9yeSkpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHJlY3Vyc2VEaXJlY3RvcnkoRmlsZSBkaXIpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBGaWxlW10gZmlsZXMgPSBkaXIubGlzdEZpbGVzKCk7CisgICAgICAgIExpc3QgdHJhdmVyc2VMaXN0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBGaWxlIGZpbGUgPSBmaWxlc1tpXTsKKyAgICAgICAgICAgIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICB0cmF2ZXJzZUxpc3QuYWRkKGZpbGUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGZpbGUuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIGlmIChuYW1lLmVuZHNXaXRoKCJUZXN0LmNsYXNzIikgfHwgbmFtZS5lbmRzV2l0aCgiQnVnLmNsYXNzIikpIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkVGVzdChmaWxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gdHJhdmVyc2VMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgcmVjdXJzZURpcmVjdG9yeSgoRmlsZSkgaXRlci5uZXh0KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgYWRkVGVzdChGaWxlIGZpbGUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgbmFtZSA9IGZpbGUuZ2V0UGF0aCgpOworCisgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZyh0ZXN0RGlyZWN0b3J5Lmxlbmd0aCgpICsgMSwgbmFtZS5sZW5ndGgoKSAtICIuY2xhc3MiLmxlbmd0aCgpKTsKKyAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcuJyk7CisKKyAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIkZvdW5kOiAiICsgbmFtZSk7CisgICAgICAgIENsYXNzIHR5cGUgPSBsb2FkQ2xhc3MobmFtZSk7CisgICAgICAgIGFkZFRlc3RTdWl0ZSh0eXBlKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQ2xhc3MgbG9hZENsYXNzKFN0cmluZyBuYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MobmFtZSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpLmxvYWRDbGFzcyhuYW1lKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZTEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZShuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL0xvYWRlckNvbmZpZ3VyYXRpb25UZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL0xvYWRlckNvbmZpZ3VyYXRpb25UZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjhjYjIyCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvTG9hZGVyQ29uZmlndXJhdGlvblRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsOTAgQEAKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS50b29scw0KKw0KK2NsYXNzIExvYWRlckNvbmZpZ3VyYXRpb25UZXN0IGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2Ugew0KKw0KKyAgdm9pZCB0ZXN0Q29tbWVudCgpIHsNCisgICAgZGVmIHR4dCA9ICIjIEkgYW0gYSBjb21tZW50Ig0KKyAgICANCisgICAgZGVmIGNvbmZpZyA9IG5ldyBMb2FkZXJDb25maWd1cmF0aW9uKCkNCisgICAgY29uZmlnLnJlcXVpcmVNYWluID0gZmFsc2UNCisgICAgY29uZmlnLmNvbmZpZ3VyZShuZXcgU3RyaW5nQnVmZmVySW5wdXRTdHJlYW0odHh0KSkNCisgICAgDQorICAgIGFzc2VydCBjb25maWcuY2xhc3NQYXRoVXJscy5sZW5ndGggPT0gMCAgDQorICB9DQorICANCisgIHZvaWQgdGVzdE5vcm1hbFBhdGgoKSB7DQorICAgIC8vIGdlbmVyYXRlIGEgbG9hZCBpbnN0cnVjdGlvbiB3aXRoIGEgdmFsaWQgcGF0aA0KKyAgICBkZWYgZmlsZSA9IG5ldyBGaWxlKCIuIikNCisgICAgZGVmIHR4dCA9ICJsb2FkICRmaWxlIg0KKyAgICANCisgICAgZGVmIGNvbmZpZyA9IG5ldyBMb2FkZXJDb25maWd1cmF0aW9uKCkNCisgICAgY29uZmlnLnJlcXVpcmVNYWluID0gZmFsc2UNCisgICAgY29uZmlnLmNvbmZpZ3VyZShuZXcgU3RyaW5nQnVmZmVySW5wdXRTdHJlYW0odHh0KSkNCisgICAgDQorICAgIGFzc2VydCBjb25maWcuY2xhc3NQYXRoVXJscy5sZW5ndGggPT0gMQ0KKyAgICBhc3NlcnQgY29uZmlnLmNsYXNzUGF0aFVybHNbMF0uc2FtZUZpbGUoZmlsZS50b1VSSSgpLnRvVVJMKCkpDQorICB9DQorICANCisgIHZvaWQgdGVzdE5vbmV4aXN0aW5nUGF0aCgpIHsNCisgICAgLy8gZ2VuZXJhdGUgYSBsb2FkIGluc3RydWN0aW9uIHdpdGggYSB2YWxpZCBwYXRoDQorICAgIGRlZiBmaWxlID0gZ2V0Tm9uZXhpc3RhbnRGaWxlKG5ldyBGaWxlKCIuIikpDQorDQorICAgIGRlZiB0eHQgPSAibG9hZCAkZmlsZSINCisgICAgDQorICAgIGRlZiBjb25maWcgPSBuZXcgTG9hZGVyQ29uZmlndXJhdGlvbigpDQorICAgIGNvbmZpZy5yZXF1aXJlTWFpbiA9IGZhbHNlDQorICAgIGNvbmZpZy5jb25maWd1cmUobmV3IFN0cmluZ0J1ZmZlcklucHV0U3RyZWFtKHR4dCkpDQorICAgIA0KKyAgICBhc3NlcnQgY29uZmlnLmNsYXNzUGF0aFVybHMubGVuZ3RoID09IDANCisgIH0gIA0KKyAgDQorICBwcml2YXRlIEZpbGUgZ2V0Tm9uZXhpc3RhbnRGaWxlKEZpbGUgYmFzZSkgew0KKyAgICBkZWYgbnVtYmVyID0gIjAiDQorICAgIHdoaWxlIChiYXNlLmV4aXN0cygpKSB7DQorICAgICAgYmFzZSA9IG5ldyBGaWxlKGJhc2UsbnVtYmVyKQ0KKyAgICAgIG51bWJlcisrDQorICAgIH0NCisgICAgcmV0dXJuIGJhc2UNCisgIH0NCisgIA0KKyAgdm9pZCB0ZXN0RXhpc3RpbmdQcm9wZXJ0eSgpIHsNCisgICAgZGVmIHR4dCA9ICdsb2FkICR7amF2YS5ob21lfScNCisgICAgDQorICAgIGRlZiBjb25maWcgPSBuZXcgTG9hZGVyQ29uZmlndXJhdGlvbigpDQorICAgIGNvbmZpZy5yZXF1aXJlTWFpbiA9IGZhbHNlDQorICAgIGNvbmZpZy5jb25maWd1cmUobmV3IFN0cmluZ0J1ZmZlcklucHV0U3RyZWFtKHR4dCkpDQorICAgIA0KKyAgICBhc3NlcnQgY29uZmlnLmNsYXNzUGF0aFVybHMubGVuZ3RoID09IDENCisgICAgZGVmIHVybDEgPSBjb25maWcuY2xhc3NQYXRoVXJsc1swXQ0KKyAgICBkZWYgdXJsMiA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIikpLnRvVVJJKCkudG9VUkwoKQ0KKyAgICBhc3NlcnQgdXJsMS5zYW1lRmlsZSh1cmwyKQ0KKyAgfSAgDQorICANCisgIHZvaWQgdGVzdE5vbmV4aXN0aW5nUHJvcGVydHkoKSB7DQorICAgICBTdHJpbmcgbmFtZSA9IGdldE5vbmV4aXN0aW5nUHJvcGVydHlOYW1lKCJmb28iKQ0KKyAgICAgDQorICAgIGRlZiB0eHQgPSAnbG9hZCAheycrbmFtZSsnfScNCisgICAgDQorICAgIGRlZiBjb25maWcgPSBuZXcgTG9hZGVyQ29uZmlndXJhdGlvbigpDQorICAgIGNvbmZpZy5yZXF1aXJlTWFpbiA9IGZhbHNlDQorICAgIHNob3VsZEZhaWwgew0KKyAgICAgICAgY29uZmlnLmNvbmZpZ3VyZShuZXcgU3RyaW5nQnVmZmVySW5wdXRTdHJlYW0odHh0KSkNCisgICAgfQ0KKyAgICANCisgICAgdHh0ID0gJ2xvYWQgJHsnK25hbWUrJ30nDQorICAgIA0KKyAgICBjb25maWcgPSBuZXcgTG9hZGVyQ29uZmlndXJhdGlvbigpDQorICAgIGNvbmZpZy5yZXF1aXJlTWFpbiA9IGZhbHNlDQorICAgIGNvbmZpZy5jb25maWd1cmUobmV3IFN0cmluZ0J1ZmZlcklucHV0U3RyZWFtKHR4dCkpDQorICAgIA0KKyAgICBhc3NlcnQgY29uZmlnLmNsYXNzUGF0aFVybHMubGVuZ3RoID09IDANCisgIH0NCisgIA0KKyAgDQorICBwcml2YXRlIGdldE5vbmV4aXN0aW5nUHJvcGVydHlOYW1lKFN0cmluZyBiYXNlKSB7DQorICAgIHdoaWxlIChTeXN0ZW0uZ2V0UHJvcGVydHkoYmFzZSkhPW51bGwpIHsNCisgICAgICBiYXNlICs9ICJ4Ig0KKyAgICB9DQorICAgIHJldHVybiBiYXNlDQorICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL1N0cmluZ0hlbHBlclRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvU3RyaW5nSGVscGVyVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU3M2E0YwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL1N0cmluZ0hlbHBlclRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTggQEAKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS50b29scw0KKw0KK2ltcG9ydCBzdGF0aWMgb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5TdHJpbmdIZWxwZXIuKg0KKw0KK2NsYXNzIFN0cmluZ0hlbHBlclRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7DQorDQorICB2b2lkIHRlc3RUb2tlbml6ZSgpIHsNCisgICAgYXNzZXJ0IHRva2VuaXplVW5xdW90ZWQoImEgYiIpID09IFsiYSIsImIiXQ0KKyAgICBhc3NlcnQgdG9rZW5pemVVbnF1b3RlZCgiYSAnYiBhJyIpID09IFsiYSIsIidiIGEnIl0NCisgICAgYXNzZXJ0IHRva2VuaXplVW5xdW90ZWQoIiBhICdiIGEnIikgPT0gWyJhIiwiJ2IgYSciXQ0KKyAgICBhc3NlcnQgdG9rZW5pemVVbnF1b3RlZCgiIGEgJ2IgYSciICkgPT0gWyJhIiwiJ2IgYSciXQ0KKyAgICBhc3NlcnQgdG9rZW5pemVVbnF1b3RlZCgnYSAiYiBhIicpID09IFsiYSIsJyJiIGEiJ10NCisgICAgYXNzZXJ0IHRva2VuaXplVW5xdW90ZWQoImEgJ2IgXCJhIGNcIiciKSA9PSBbImEiLCInYiBcImEgY1wiJyJdDQorICAgIGFzc2VydCB0b2tlbml6ZVVucXVvdGVkKCJhIFwiYiAnYSBjJ1wiIikgPT0gWyJhIiwiXCJiICdhIGMnXCIiXQ0KKyAgICBhc3NlcnQgdG9rZW5pemVVbnF1b3RlZCgiJ2EgIikgPT0gWyInYSAiXQ0KKyAgICBhc3NlcnQgdG9rZW5pemVVbnF1b3RlZCgiXCJhICdiJyIpID09IFsiXCJhICdiJyJdDQorICB9DQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2dyb292eWRvYy9Hcm9vdnlEb2NUb29sVGVzdC5qYXZhIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvZ3Jvb3Z5ZG9jL0dyb292eURvY1Rvb2xUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NjZjBlOAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2dyb292eWRvYy9Hcm9vdnlEb2NUb29sVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTY1IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDA3IEplcmVteSBSYXluZXIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLmdyb292eWRvYzsKKworaW1wb3J0IGdyb292eS51dGlsLkdyb292eVRlc3RDYXNlOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3Jvb3Z5ZG9jLkdyb292eUNsYXNzRG9jOworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkuZ3Jvb3Z5ZG9jLkdyb292eU1ldGhvZERvYzsKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5Lmdyb292eWRvYy5Hcm9vdnlSb290RG9jOworCitwdWJsaWMgY2xhc3MgR3Jvb3Z5RG9jVG9vbFRlc3QgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZSB7CisgICAgR3Jvb3Z5RG9jVG9vbCB4bWxUb29sOworICAgIEdyb292eURvY1Rvb2wgeG1sVG9vbEZvclRlc3RzOworICAgIEdyb292eURvY1Rvb2wgcGxhaW5Ub29sOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGUyA9ICIvIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9DS19ESVIgPSAibW9jayIgKyBGUyArICJkb2MiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURU1QTEFURVNfRElSID0gIm1haW4iICsgRlMgKyAib3JnIiArIEZTICsgImNvZGVoYXVzIiArIEZTICsgImdyb292eSIgKyBGUyArICJ0b29scyIgKyBGUyArICJncm9vdnlkb2MiICsgRlMgKyAiZ3N0cmluZy10ZW1wbGF0ZXMiOworCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIHBsYWluVG9vbCA9IG5ldyBHcm9vdnlEb2NUb29sKCJzcmMiICsgRlMgKyAidGVzdCIpOworCisgICAgICAgIHhtbFRvb2wgPSBuZXcgR3Jvb3Z5RG9jVG9vbCgKKyAgICAgICAgICAgICAgICBuZXcgRmlsZVN5c3RlbVJlc291cmNlTWFuYWdlcigic3JjIiksIC8vIHRlbXBsYXRlIHN0b3JhZ2UKKyAgICAgICAgICAgICAgICAic3JjIiArIEZTICsgIm1haW4iLCAvLyBzb3VyY2UgZmlsZSBkaXJzCisgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tde1RFTVBMQVRFU19ESVIgKyBGUyArICJ0b3AtbGV2ZWwiICsgRlMgKyAicm9vdERvY1N0cnVjdHVyZWREYXRhLnhtbCJ9LAorICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXXtURU1QTEFURVNfRElSICsgRlMgKyAicGFja2FnZS1sZXZlbCIgKyBGUyArICJwYWNrYWdlRG9jU3RydWN0dXJlZERhdGEueG1sIn0sCisgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tde1RFTVBMQVRFU19ESVIgKyBGUyArICJjbGFzcy1sZXZlbCIgKyBGUyArICJjbGFzc0RvY1N0cnVjdHVyZWREYXRhLnhtbCJ9CisgICAgICAgICk7CisKKyAgICAgICAgeG1sVG9vbEZvclRlc3RzID0gbmV3IEdyb292eURvY1Rvb2woCisgICAgICAgICAgICAgICAgbmV3IEZpbGVTeXN0ZW1SZXNvdXJjZU1hbmFnZXIoInNyYyIpLCAvLyB0ZW1wbGF0ZSBzdG9yYWdlCisgICAgICAgICAgICAgICAgInNyYyIgKyBGUyArICJ0ZXN0IiwgLy8gc291cmNlIGZpbGUgZGlycworICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXXtURU1QTEFURVNfRElSICsgRlMgKyAidG9wLWxldmVsIiArIEZTICsgInJvb3REb2NTdHJ1Y3R1cmVkRGF0YS54bWwifSwKKyAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW117VEVNUExBVEVTX0RJUiArIEZTICsgInBhY2thZ2UtbGV2ZWwiICsgRlMgKyAicGFja2FnZURvY1N0cnVjdHVyZWREYXRhLnhtbCJ9LAorICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXXtURU1QTEFURVNfRElSICsgRlMgKyAiY2xhc3MtbGV2ZWwiICsgRlMgKyAiY2xhc3NEb2NTdHJ1Y3R1cmVkRGF0YS54bWwifQorICAgICAgICApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQbGFpbkdyb292eURvY1Rvb2woKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcGxhaW5Ub29sLmFkZCgib3JnIiArIEZTICsgImNvZGVoYXVzIiArIEZTICsgImdyb292eSIgKyBGUyArICJ0b29scyIgKyBGUyArICJncm9vdnlkb2MiICsgRlMgKyAiR3Jvb3Z5RG9jVG9vbFRlc3QuamF2YSIpOworICAgICAgICBHcm9vdnlSb290RG9jIHJvb3QgPSBwbGFpblRvb2wuZ2V0Um9vdERvYygpOworCisgICAgICAgIC8vIGxvb3AgdGhyb3VnaCBjbGFzc2VzIGluIHRyZWUKKyAgICAgICAgR3Jvb3Z5Q2xhc3NEb2NbXSBjbGFzc0RvY3MgPSByb290LmNsYXNzZXMoKTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPCBjbGFzc0RvY3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIEdyb292eUNsYXNzRG9jIGNsYXp6ID0gcm9vdC5jbGFzc2VzKClbaV07CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiR3Jvb3Z5RG9jVG9vbFRlc3QiLCBjbGF6ei5uYW1lKCkpOworCisgICAgICAgICAgICAvLyBsb29wIHRocm91Z2ggbWV0aG9kcyBpbiBjbGFzcworICAgICAgICAgICAgYm9vbGVhbiBzZWVuVGhpc01ldGhvZCA9IGZhbHNlOworICAgICAgICAgICAgR3Jvb3Z5TWV0aG9kRG9jW10gbWV0aG9kRG9jcyA9IGNsYXp6Lm1ldGhvZHMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGo9MDsgajwgbWV0aG9kRG9jcy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgIEdyb292eU1ldGhvZERvYyBtZXRob2QgPSBjbGF6ei5tZXRob2RzKClbal07CisKKyAgICAgICAgICAgICAgICBpZiAoInRlc3RQbGFpbkdyb292eURvY1Rvb2wiLmVxdWFscyhtZXRob2QubmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICBzZWVuVGhpc01ldGhvZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnRUcnVlKHNlZW5UaGlzTWV0aG9kKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHcm9vdnlEb2NUaGVDYXRlZ29yeU1ldGhvZENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHhtbFRvb2wuYWRkKCJncm9vdnkiICsgRlMgKyAidXRpbCIgKyBGUyArICJDbGlCdWlsZGVyLmdyb292eSIpOworICAgICAgICB4bWxUb29sLmFkZCgiZ3Jvb3Z5IiArIEZTICsgImxhbmciICsgRlMgKyAiR3Jvb3Z5TG9nVGVzdENhc2UuZ3Jvb3Z5Iik7CisgICAgICAgIHhtbFRvb2wuYWRkKCJncm9vdnkiICsgRlMgKyAibW9jayIgKyBGUyArICJpbnRlcmNlcHRvciIgKyBGUyArICJTdHJpY3RFeHBlY3RhdGlvbi5ncm9vdnkiKTsKKyAgICAgICAgeG1sVG9vbC5hZGQoImdyb292eSIgKyBGUyArICJ1aSIgKyBGUyArICJDb25zb2xlLmdyb292eSIpOworICAgICAgICB4bWxUb29sLmFkZCgib3JnIiArIEZTICsgImNvZGVoYXVzIiArIEZTICsgImdyb292eSIgKyBGUyArICJydW50aW1lIiArIEZTICsgIkdyb292eUNhdGVnb3J5U3VwcG9ydC5qYXZhIik7CisgICAgICAgIHhtbFRvb2wuYWRkKCJvcmciICsgRlMgKyAiY29kZWhhdXMiICsgRlMgKyAiZ3Jvb3Z5IiArIEZTICsgInJ1bnRpbWUiICsgRlMgKyAiQ29udmVydGVkTWFwLmphdmEiKTsKKyAgICAgICAgTW9ja091dHB1dFRvb2wgb3V0cHV0ID0gbmV3IE1vY2tPdXRwdXRUb29sKCk7CisgICAgICAgIHhtbFRvb2wucmVuZGVyVG9PdXRwdXQob3V0cHV0LCBNT0NLX0RJUik7CisKKyAgICAgICAgU3RyaW5nIGNhdGVnb3J5TWV0aG9kRG9jdW1lbnQgPSBvdXRwdXQuZ2V0VGV4dChNT0NLX0RJUiArIEZTICsgIm9yZyIgKyBGUyArICJjb2RlaGF1cyIgKyBGUyArICJncm9vdnkiICsgRlMgKyAicnVudGltZSIgKyBGUyArICJDYXRlZ29yeU1ldGhvZC5odG1sIik7IC8vIHRvZG8gLSBmaWd1cmUgb3V0IGhvdyB0byBnZXQgeG1sIGV4dGVuc2lvbiBmb3IgdGVtcGxhdGVzCisKKyAgICAgICAgYXNzZXJ0VHJ1ZShjYXRlZ29yeU1ldGhvZERvY3VtZW50LmluZGV4T2YoIjxtZXRob2QgcmV0dXJucz1cImJvb2xlYW5cIiBuYW1lPVwiaGFzQ2F0ZWdvcnlJbkFueVRocmVhZFwiPiIpID4gMCk7CisKKyAgICAgICAgU3RyaW5nIHBhY2thZ2VEb2N1bWVudCA9IG91dHB1dC5nZXRUZXh0KE1PQ0tfRElSICsgRlMgKyAib3JnIiArIEZTICsgImNvZGVoYXVzIiArIEZTICsgImdyb292eSIgKyBGUyArICJydW50aW1lIiArIEZTICsgInBhY2thZ2VEb2NTdHJ1Y3R1cmVkRGF0YS54bWwiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShwYWNrYWdlRG9jdW1lbnQuaW5kZXhPZigiPGNsYXNzIG5hbWU9XCJDYXRlZ29yeU1ldGhvZFwiIC8+IikgPiAwKTsKKworICAgICAgICBTdHJpbmcgcm9vdERvY3VtZW50ID0gb3V0cHV0LmdldFRleHQoTU9DS19ESVIgKyBGUyArICJyb290RG9jU3RydWN0dXJlZERhdGEueG1sIik7CisgICAgICAgIGFzc2VydFRydWUocm9vdERvY3VtZW50LmluZGV4T2YoIjxwYWNrYWdlIG5hbWU9XCJvcmciICsgRlMgKyAiY29kZWhhdXMiICsgRlMgKyAiZ3Jvb3Z5IiArIEZTICsgInJ1bnRpbWVcIiAvPiIpID4gMCk7CisgICAgICAgIGFzc2VydFRydWUocm9vdERvY3VtZW50LmluZGV4T2YoIjxjbGFzcyBwYXRoPVwib3JnIiArIEZTICsgImNvZGVoYXVzIiArIEZTICsgImdyb292eSIgKyBGUyArICJydW50aW1lIiArIEZTICsgIkNhdGVnb3J5TWV0aG9kXCIgbmFtZT1cIkNhdGVnb3J5TWV0aG9kXCIgLz4iKSA+IDApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgeG1sVG9vbC5hZGQoImdyb292eSIgKyBGUyArICJ1aSIgKyBGUyArICJDb25zb2xlLmdyb292eSIpOworICAgICAgICBNb2NrT3V0cHV0VG9vbCBvdXRwdXQgPSBuZXcgTW9ja091dHB1dFRvb2woKTsKKyAgICAgICAgeG1sVG9vbC5yZW5kZXJUb091dHB1dChvdXRwdXQsIE1PQ0tfRElSKTsKKworICAgICAgICBTdHJpbmcgY29uc29sZURvYyA9IG91dHB1dC5nZXRUZXh0KE1PQ0tfRElSICsgRlMgKyAiZ3Jvb3Z5IiArIEZTICsgInVpIiArIEZTICsgIkNvbnNvbGUuaHRtbCIpOworICAgICAgICBhc3NlcnRUcnVlKGNvbnNvbGVEb2MuaW5kZXhPZigiPGNvbnN0cnVjdG9yIG5hbWU9XCJDb25zb2xlXCI+IikgPiAwKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb25zb2xlRG9jLmluZGV4T2YoIjxwYXJhbWV0ZXIgdHlwZT1cIkNsYXNzTG9hZGVyXCIgbmFtZT1cInBhcmVudFwiIC8+IikgPiAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NDb21tZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHhtbFRvb2wuYWRkKCJncm9vdnkiICsgRlMgKyAieG1sIiArIEZTICsgIkRPTUJ1aWxkZXIuamF2YSIpOworICAgICAgICBNb2NrT3V0cHV0VG9vbCBvdXRwdXQgPSBuZXcgTW9ja091dHB1dFRvb2woKTsKKyAgICAgICAgeG1sVG9vbC5yZW5kZXJUb091dHB1dChvdXRwdXQsIE1PQ0tfRElSKTsKKworICAgICAgICBTdHJpbmcgZG9tQnVpbGRlckRvYyA9IG91dHB1dC5nZXRUZXh0KE1PQ0tfRElSICsgRlMgKyAiZ3Jvb3Z5IiArIEZTICsgInhtbCIgKyBGUyArICJET01CdWlsZGVyLmh0bWwiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkb21CdWlsZGVyRG9jLmluZGV4T2YoIkEgaGVscGVyIGNsYXNzIGZvciBjcmVhdGluZyBhIFczQyBET00gdHJlZSIpID4gMCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE1ldGhvZENvbW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgeG1sVG9vbC5hZGQoImdyb292eSIgKyBGUyArICJtb2RlbCIgKyBGUyArICJEZWZhdWx0VGFibGVDb2x1bW4uamF2YSIpOworICAgICAgICBNb2NrT3V0cHV0VG9vbCBvdXRwdXQgPSBuZXcgTW9ja091dHB1dFRvb2woKTsKKyAgICAgICAgeG1sVG9vbC5yZW5kZXJUb091dHB1dChvdXRwdXQsIE1PQ0tfRElSKTsKKworICAgICAgICBTdHJpbmcgZGVmVGFiQ29sRG9jID0gb3V0cHV0LmdldFRleHQoTU9DS19ESVIgKyBGUyArICJncm9vdnkiICsgRlMgKyAibW9kZWwiICsgRlMgKyAiRGVmYXVsdFRhYmxlQ29sdW1uLmh0bWwiKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGRlZlRhYkNvbERvYyk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShkZWZUYWJDb2xEb2MuaW5kZXhPZigiRXZhbHVhdGVzIHRoZSB2YWx1ZSBvZiBhIGNlbGwiKSA+IDApOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFja2FnZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgeG1sVG9vbC5hZGQoImdyb292eSIgKyBGUyArICJ4bWwiICsgRlMgKyAiRE9NQnVpbGRlci5qYXZhIik7CisgICAgICAgIE1vY2tPdXRwdXRUb29sIG91dHB1dCA9IG5ldyBNb2NrT3V0cHV0VG9vbCgpOworICAgICAgICB4bWxUb29sLnJlbmRlclRvT3V0cHV0KG91dHB1dCwgTU9DS19ESVIpOworCisgICAgICAgIFN0cmluZyBkb21CdWlsZGVyRG9jID0gb3V0cHV0LmdldFRleHQoTU9DS19ESVIgKyBGUyArICJncm9vdnkiICsgRlMgKyAieG1sIiArIEZTICsgIkRPTUJ1aWxkZXIuaHRtbCIpOworICAgICAgICBhc3NlcnRUcnVlKGRvbUJ1aWxkZXJEb2MuaW5kZXhPZigiPGNvbnRhaW5pbmdQYWNrYWdlIG5hbWU9XCJncm9vdnkiICsgRlMgKyAieG1sXCI+Z3Jvb3Z5LnhtbDwvY29udGFpbmluZ1BhY2thZ2U+IikgPiAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXh0ZW5kc0NsYXVzZVdpdGhvdXRTdXBlckNsYXNzSW5UcmVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHhtbFRvb2wuYWRkKCJncm9vdnkiICsgRlMgKyAieG1sIiArIEZTICsgIkRPTUJ1aWxkZXIuamF2YSIpOworICAgICAgICBNb2NrT3V0cHV0VG9vbCBvdXRwdXQgPSBuZXcgTW9ja091dHB1dFRvb2woKTsKKyAgICAgICAgeG1sVG9vbC5yZW5kZXJUb091dHB1dChvdXRwdXQsIE1PQ0tfRElSKTsKKworICAgICAgICBTdHJpbmcgZG9tQnVpbGRlckRvYyA9IG91dHB1dC5nZXRUZXh0KE1PQ0tfRElSICsgRlMgKyAiZ3Jvb3Z5IiArIEZTICsgInhtbCIgKyBGUyArICJET01CdWlsZGVyLmh0bWwiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkb21CdWlsZGVyRG9jLmluZGV4T2YoIjxleHRlbmRzPkJ1aWxkZXJTdXBwb3J0PC9leHRlbmRzPiIpID4gMCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEV4dGVuZHNDbGF1c2VXaXRoU3VwZXJDbGFzc0luVHJlZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB4bWxUb29sLmFkZCgiZ3Jvb3Z5IiArIEZTICsgInhtbCIgKyBGUyArICJET01CdWlsZGVyLmphdmEiKTsKKyAgICAgICAgeG1sVG9vbC5hZGQoImdyb292eSIgKyBGUyArICJ1dGlsIiArIEZTICsgIkJ1aWxkZXJTdXBwb3J0LmphdmEiKTsKKyAgICAgICAgTW9ja091dHB1dFRvb2wgb3V0cHV0ID0gbmV3IE1vY2tPdXRwdXRUb29sKCk7CisgICAgICAgIHhtbFRvb2wucmVuZGVyVG9PdXRwdXQob3V0cHV0LCBNT0NLX0RJUik7CisKKyAgICAgICAgU3RyaW5nIGRvbUJ1aWxkZXJEb2MgPSBvdXRwdXQuZ2V0VGV4dChNT0NLX0RJUiArIEZTICsgImdyb292eSIgKyBGUyArICJ4bWwiICsgRlMgKyAiRE9NQnVpbGRlci5odG1sIik7CisgICAgICAgIGFzc2VydFRydWUoZG9tQnVpbGRlckRvYy5pbmRleE9mKCI8ZXh0ZW5kcz5CdWlsZGVyU3VwcG9ydDwvZXh0ZW5kcz4iKSA+IDApOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFBhY2thZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAJeG1sVG9vbEZvclRlc3RzLmFkZCgiVWJlclRlc3RDYXNlQnVncy5qYXZhIik7CisgICAgICAgIE1vY2tPdXRwdXRUb29sIG91dHB1dCA9IG5ldyBNb2NrT3V0cHV0VG9vbCgpOworICAgICAgICB4bWxUb29sRm9yVGVzdHMucmVuZGVyVG9PdXRwdXQob3V0cHV0LCBNT0NLX0RJUik7CisgICAgICAgIFN0cmluZyBkb21CdWlsZGVyRG9jID0gb3V0cHV0LmdldFRleHQoTU9DS19ESVIgKyBGUyArICJEZWZhdWx0UGFja2FnZSIgKyBGUyArICJVYmVyVGVzdENhc2VCdWdzLmh0bWwiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkb21CdWlsZGVyRG9jLmluZGV4T2YoIjxleHRlbmRzPlRlc3RDYXNlPC9leHRlbmRzPiIpID4gMCk7ICAgIAkKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvZ3Jvb3Z5ZG9jL0dyb292eURvY1Rvb2xUZXN0U2FtcGxlR3Jvb3Z5Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2dyb292eWRvYy9Hcm9vdnlEb2NUb29sVGVzdFNhbXBsZUdyb292eS5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRiZTAxYgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2dyb292eWRvYy9Hcm9vdnlEb2NUb29sVGVzdFNhbXBsZUdyb292eS5ncm9vdnkKQEAgLTAsMCArMSwyNSBAQAorcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLmdyb292eWRvYzsKKworcHVibGljIGNsYXNzIEdyb292eURvY1Rvb2xUZXN0U2FtcGxlR3Jvb3Z5IHsKKyAgLyoqCisgICAgKiBGaXJzdCBtZXRob2QuIFNpbXBsZSBjYXNlCisgICAgKi8KKyAgZGVmIGZpcnN0TWV0aG9kKCkgeworICB9CisKKyAgLyoqIFNlY29uZCBtZXRob2QuIEhhcyByZXR1cm4gdHlwZSAqLworICBTdHJpbmcgc2Vjb25kTWV0aG9kKCkge30KKworICAvKiogVGhpcmQgbWV0aG9kLiBIYXMgcHJpbWl0aXZlIHJldHVybiB0eXBlICovCisgIGNoYXIgdGhpcmRNZXRob2QoKSB7fQorCisgIC8qKiBGb3VydGggbWV0aG9kLiBIYXMgZnVsbHkgcXVhbGlmaWVkIHJldHVybiB0eXBlICovCisgIGphdmEudXRpbC5EYXRlIGZvdXJ0aE1ldGhvZCgpIHt9CisKKyAgLyoKKyAgICAqIEZpZnRoIG1ldGhvZC4gRG9lc24ndCBoYXZlIGFueSBncm9vdnlkb2MgKG5vdGU6IHNpbmdsZSAqIGF0IGJlZ2lubmluZykKKyAgICAqLworICBkZWYgZmlmdGhNZXRob2QoKSB7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvY29tbWFuZHMvQWxpYXNDb21tYW5kVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9jb21tYW5kcy9BbGlhc0NvbW1hbmRUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mjg2MzNlCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvY29tbWFuZHMvQWxpYXNDb21tYW5kVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5jb21tYW5kcworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5Db21tYW5kRXhjZXB0aW9uCisKKy8qKgorICogVGVzdHMgZm9yIHRoZSB7QGxpbmsgQWxpYXNDb21tYW5kfSBjbGFzcy4KKyAqCisgKiBAdmVyc2lvbiAkSWQkCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYXNvbkBwbGFuZXQ1Ny5jb20iPkphc29uIERpbGxvbjwvYT4KKyAqLworY2xhc3MgQWxpYXNDb21tYW5kVGVzdAorICAgIGV4dGVuZHMgQ29tbWFuZFRlc3RTdXBwb3J0Cit7CisgICAgdm9pZCB0ZXN0QWxpYXMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzaGVsbCA8PCAnYWxpYXMnCisgICAgICAgICAgICBmYWlsKCkKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBleHBlY3RlZCkge30KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9jb21tYW5kcy9DbGVhckNvbW1hbmRUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL2NvbW1hbmRzL0NsZWFyQ29tbWFuZFRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkOGI2NjYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9jb21tYW5kcy9DbGVhckNvbW1hbmRUZXN0Lmdyb292eQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLmNvbW1hbmRzCisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLkNvbW1hbmRFeGNlcHRpb24KKworLyoqCisgKiBUZXN0cyBmb3IgdGhlIHtAbGluayBDbGVhckNvbW1hbmR9IGNsYXNzLgorICoKKyAqIEB2ZXJzaW9uICRJZCQKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphc29uQHBsYW5ldDU3LmNvbSI+SmFzb24gRGlsbG9uPC9hPgorICovCitjbGFzcyBDbGVhckNvbW1hbmRUZXN0CisgICAgZXh0ZW5kcyBDb21tYW5kVGVzdFN1cHBvcnQKK3sKKyAgICB2b2lkIHRlc3RDbGVhcigpIHsKKyAgICAgICAgc2hlbGwgPDwgJ2NsZWFyJworICAgIH0KKworICAgIHZvaWQgdGVzdENsZWFyV2l0aEFyZ3MoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzaGVsbCA8PCAnY2xlYXIgZm9vJworICAgICAgICAgICAgZmFpbCgpCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZXhwZWN0ZWQpIHt9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL2NvbW1hbmRzL0NvbW1hbmRUZXN0U3VwcG9ydC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9jb21tYW5kcy9Db21tYW5kVGVzdFN1cHBvcnQuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYmY0ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9jb21tYW5kcy9Db21tYW5kVGVzdFN1cHBvcnQuZ3Jvb3Z5CkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwuY29tbWFuZHMKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwuR3Jvb3Z5c2gKKworLyoqCisgKiBTdXBwb3J0IGZvciB0ZXN0aW5nIHtAbGluayBDb21tYW5kfSBpbnN0YW5jZXMuCisgKgorICogQHZlcnNpb24gJElkJAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFzb25AcGxhbmV0NTcuY29tIj5KYXNvbiBEaWxsb248L2E+CisgKi8KK2Fic3RyYWN0IGNsYXNzIENvbW1hbmRUZXN0U3VwcG9ydAorICAgIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UKK3sKKyAgICBHcm9vdnlzaCBzaGVsbAorCisgICAgT2JqZWN0IGxhc3RSZXN1bHQKKworICAgIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIHN1cGVyLnNldFVwKCkKKworICAgICAgICBzaGVsbCA9IG5ldyBHcm9vdnlzaCgpCisKKyAgICAgICAgc2hlbGwuZXJyb3JIb29rID0geyBUaHJvd2FibGUgY2F1c2UgLT4KKyAgICAgICAgICAgIHRocm93IGNhdXNlCisgICAgICAgIH0KKworICAgICAgICBzaGVsbC5yZXN1bHRIb29rID0geyByZXN1bHQgLT4KKyAgICAgICAgICAgIGxhc3RSZXN1bHQgPSByZXN1bHQKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL2NvbW1hbmRzL0Rpc3BsYXlDb21tYW5kVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9jb21tYW5kcy9EaXNwbGF5Q29tbWFuZFRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MjU3ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9jb21tYW5kcy9EaXNwbGF5Q29tbWFuZFRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwuY29tbWFuZHMKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwuQ29tbWFuZEV4Y2VwdGlvbgorCisvKioKKyAqIFRlc3RzIGZvciB0aGUge0BsaW5rIERpc3BsYXlDb21tYW5kfSBjbGFzcy4KKyAqCisgKiBAdmVyc2lvbiAkSWQkCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYXNvbkBwbGFuZXQ1Ny5jb20iPkphc29uIERpbGxvbjwvYT4KKyAqLworY2xhc3MgRGlzcGxheUNvbW1hbmRUZXN0CisgICAgZXh0ZW5kcyBDb21tYW5kVGVzdFN1cHBvcnQKK3sKKyAgICB2b2lkIHRlc3REaXNwbGF5KCkgeworICAgICAgICBzaGVsbCA8PCAnZGlzcGxheScKKyAgICB9CisKKyAgICB2b2lkIHRlc3REaXNwbGF5V2l0aEFyZ3MoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzaGVsbCA8PCAnZGlzcGxheSBmb28nCisgICAgICAgICAgICBmYWlsKCkKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBleHBlY3RlZCkge30KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvY29tbWFuZHMvRWRpdENvbW1hbmRUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL2NvbW1hbmRzL0VkaXRDb21tYW5kVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU0ODU4OAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL2NvbW1hbmRzL0VkaXRDb21tYW5kVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5jb21tYW5kcworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5Db21tYW5kRXhjZXB0aW9uCisKKy8qKgorICogVGVzdHMgZm9yIHRoZSB7QGxpbmsgRWRpdENvbW1hbmR9IGNsYXNzLgorICoKKyAqIEB2ZXJzaW9uICRJZCQKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphc29uQHBsYW5ldDU3LmNvbSI+SmFzb24gRGlsbG9uPC9hPgorICovCitjbGFzcyBFZGl0Q29tbWFuZFRlc3QKKyAgICBleHRlbmRzIENvbW1hbmRUZXN0U3VwcG9ydAoreworICAgIHZvaWQgdGVzdFRPRE8oKSB7fQorCisgICAgLyoKKyAgICB2b2lkIHRlc3RFZGl0KCkgeworICAgICAgICBzaGVsbCA8PCAnZWRpdCcKKyAgICB9CisgICAgKi8KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL2NvbW1hbmRzL0V4aXRDb21tYW5kVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9jb21tYW5kcy9FeGl0Q29tbWFuZFRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMzUwZTEKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9jb21tYW5kcy9FeGl0Q29tbWFuZFRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwuY29tbWFuZHMKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwuRXhpdE5vdGlmaWNhdGlvbgorCisvKioKKyAqIFRlc3RzIGZvciB0aGUge0BsaW5rIEV4aXRDb21tYW5kfSBjbGFzcy4KKyAqCisgKiBAdmVyc2lvbiAkSWQkCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYXNvbkBwbGFuZXQ1Ny5jb20iPkphc29uIERpbGxvbjwvYT4KKyAqLworY2xhc3MgRXhpdENvbW1hbmRUZXN0CisgICAgZXh0ZW5kcyBDb21tYW5kVGVzdFN1cHBvcnQKK3sKKyAgICB2b2lkIHRlc3RXaXRoTm9BcmdzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2hlbGwgPDwgJ2V4aXQnCisgICAgICAgICAgICBmYWlsKCkKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhpdE5vdGlmaWNhdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qCisgICAgRklYTUU6IEVycm9ycyBkb24ndCBjdXJyZW50bHkgdGhyb3cgYW55dGhpbmcsIGp1c3QgaW8uZXJyb3IucHJpbnRsbigpJ3MuLi4KKyAgICAKKyAgICB2b2lkIHRlc3RXaXRoQXJncygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNoZWxsIDw8ICdleGl0IGZvbycKKyAgICAgICAgICAgIGZhaWwoKQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgIH0KKyAgICAqLworfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvY29tbWFuZHMvSGVscENvbW1hbmRUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL2NvbW1hbmRzL0hlbHBDb21tYW5kVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ5YzZiYwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL2NvbW1hbmRzL0hlbHBDb21tYW5kVGVzdC5ncm9vdnkKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5jb21tYW5kcworCisvKioKKyAqIFRlc3RzIGZvciB0aGUge0BsaW5rIEhlbHBDb21tYW5kfSBjbGFzcy4KKyAqCisgKiBAdmVyc2lvbiAkSWQkCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYXNvbkBwbGFuZXQ1Ny5jb20iPkphc29uIERpbGxvbjwvYT4KKyAqLworY2xhc3MgSGVscENvbW1hbmRUZXN0CisgICAgZXh0ZW5kcyBDb21tYW5kVGVzdFN1cHBvcnQKK3sKKyAgICB2b2lkIHRlc3RMaXN0KCkgeworICAgICAgICBzaGVsbCA8PCAnaGVscCcKKyAgICB9CisgICAgCisgICAgdm9pZCB0ZXN0Q29tbWFuZEhlbHAoKSB7CisgICAgICAgIHNoZWxsIDw8ICdoZWxwIGV4aXQnCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdENvbW1hbmRIZWxwSW52YWxpZENvbW1hbmQoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzaGVsbCA8PCAnaGVscCBuby1zdWNoLWNvbW1hbmQnCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvY29tbWFuZHMvSGlzdG9yeUNvbW1hbmRUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL2NvbW1hbmRzL0hpc3RvcnlDb21tYW5kVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE0YTJjMAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL2NvbW1hbmRzL0hpc3RvcnlDb21tYW5kVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5jb21tYW5kcworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5Db21tYW5kRXhjZXB0aW9uCisKKy8qKgorICogVGVzdHMgZm9yIHRoZSB7QGxpbmsgSGlzdG9yeUNvbW1hbmR9IGNsYXNzLgorICoKKyAqIEB2ZXJzaW9uICRJZCQKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphc29uQHBsYW5ldDU3LmNvbSI+SmFzb24gRGlsbG9uPC9hPgorICovCitjbGFzcyBIaXN0b3J5Q29tbWFuZFRlc3QKKyAgICBleHRlbmRzIENvbW1hbmRUZXN0U3VwcG9ydAoreworICAgIHZvaWQgdGVzdEhpc3RvcnkoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzaGVsbCA8PCAnaGlzdG9yeScKKyAgICAgICAgICAgIGZhaWwoKQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGV4cGVjdGVkKSB7fQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL2NvbW1hbmRzL0ltcG9ydENvbW1hbmRUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL2NvbW1hbmRzL0ltcG9ydENvbW1hbmRUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjVhOTFhCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvY29tbWFuZHMvSW1wb3J0Q29tbWFuZFRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwuY29tbWFuZHMKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwuQ29tbWFuZEV4Y2VwdGlvbgorCisvKioKKyAqIFRlc3RzIGZvciB0aGUge0BsaW5rIEltcG9ydENvbW1hbmR9IGNsYXNzLgorICoKKyAqIEB2ZXJzaW9uICRJZCQKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphc29uQHBsYW5ldDU3LmNvbSI+SmFzb24gRGlsbG9uPC9hPgorICovCitjbGFzcyBJbXBvcnRDb21tYW5kVGVzdAorICAgIGV4dGVuZHMgQ29tbWFuZFRlc3RTdXBwb3J0Cit7CisgICAgdm9pZCB0ZXN0SW1wb3J0KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2hlbGwgPDwgJ2ltcG9ydCcKKyAgICAgICAgICAgIGZhaWwoKQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGV4cGVjdGVkKSB7fQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9jb21tYW5kcy9JbnNwZWN0Q29tbWFuZFRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvY29tbWFuZHMvSW5zcGVjdENvbW1hbmRUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mzc2OTY5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvY29tbWFuZHMvSW5zcGVjdENvbW1hbmRUZXN0Lmdyb292eQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLmNvbW1hbmRzCisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLkNvbW1hbmRFeGNlcHRpb24KKworLyoqCisgKiBUZXN0cyBmb3IgdGhlIHtAbGluayBJbnNwZWN0Q29tbWFuZH0gY2xhc3MuCisgKgorICogQHZlcnNpb24gJElkJAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFzb25AcGxhbmV0NTcuY29tIj5KYXNvbiBEaWxsb248L2E+CisgKi8KK2NsYXNzIEluc3BlY3RDb21tYW5kVGVzdAorICAgIGV4dGVuZHMgQ29tbWFuZFRlc3RTdXBwb3J0Cit7CisgICAgdm9pZCB0ZXN0SW5zcGVjdCgpIHsKKyAgICAgICAgc2hlbGwgPDwgJ2luc3BlY3QnCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvY29tbWFuZHMvTG9hZENvbW1hbmRUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL2NvbW1hbmRzL0xvYWRDb21tYW5kVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFmZDkwZgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL2NvbW1hbmRzL0xvYWRDb21tYW5kVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5jb21tYW5kcworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5Db21tYW5kRXhjZXB0aW9uCisKKy8qKgorICogVGVzdHMgZm9yIHRoZSB7QGxpbmsgTG9hZENvbW1hbmR9IGNsYXNzLgorICoKKyAqIEB2ZXJzaW9uICRJZCQKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphc29uQHBsYW5ldDU3LmNvbSI+SmFzb24gRGlsbG9uPC9hPgorICovCitjbGFzcyBMb2FkQ29tbWFuZFRlc3QKKyAgICBleHRlbmRzIENvbW1hbmRUZXN0U3VwcG9ydAoreworICAgIHZvaWQgdGVzdExvYWQoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzaGVsbCA8PCAnbG9hZCcKKyAgICAgICAgICAgIGZhaWwoKQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGV4cGVjdGVkKSB7fQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL2NvbW1hbmRzL1B1cmdlQ29tbWFuZFRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvY29tbWFuZHMvUHVyZ2VDb21tYW5kVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZlNDVhNAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL2NvbW1hbmRzL1B1cmdlQ29tbWFuZFRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwuY29tbWFuZHMKKworLyoqCisgKiBUZXN0cyBmb3IgdGhlIHtAbGluayBQdXJnZUNvbW1hbmR9IGNsYXNzLgorICoKKyAqIEB2ZXJzaW9uICRJZCQKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphc29uQHBsYW5ldDU3LmNvbSI+SmFzb24gRGlsbG9uPC9hPgorICovCitjbGFzcyBQdXJnZUNvbW1hbmRUZXN0CisgICAgZXh0ZW5kcyBDb21tYW5kVGVzdFN1cHBvcnQKK3sKKyAgICB2b2lkIHRlc3RQdXJnZVZhcmlhYmxlcygpIHsKKyAgICAgICAgc2hlbGwgPDwgJ3B1cmdlIHZhcmlhYmxlcycKKyAgICB9CisKKyAgICB2b2lkIHRlc3RQdXJnZUNsYXNzZXMoKSB7CisgICAgICAgIHNoZWxsIDw8ICdwdXJnZSBjbGFzc2VzJworICAgIH0KKworICAgIHZvaWQgdGVzdFB1cmdlSW1wb3J0cygpIHsKKyAgICAgICAgc2hlbGwgPDwgJ3B1cmdlIGltcG9ydHMnCisgICAgfQorCisgICAgdm9pZCB0ZXN0UHVyZ2VQcmVmZXJlbmNlcygpIHsKKyAgICAgICAgc2hlbGwgPDwgJ3B1cmdlIHByZWZlcmVuY2VzJworICAgIH0KKworICAgIHZvaWQgdGVzdFB1cmdlQWxsKCkgeworICAgICAgICBzaGVsbCA8PCAncHVyZ2UgYWxsJworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9jb21tYW5kcy9SZWNvcmRDb21tYW5kVGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9jb21tYW5kcy9SZWNvcmRDb21tYW5kVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhhNDQ0YQotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL2NvbW1hbmRzL1JlY29yZENvbW1hbmRUZXN0Lmdyb292eQpAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLmNvbW1hbmRzCisKKy8qKgorICogVGVzdHMgZm9yIHRoZSB7QGxpbmsgUmVjb3JkQ29tbWFuZH0gY2xhc3MuCisgKgorICogQHZlcnNpb24gJElkJAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFzb25AcGxhbmV0NTcuY29tIj5KYXNvbiBEaWxsb248L2E+CisgKi8KK2NsYXNzIFJlY29yZENvbW1hbmRUZXN0CisgICAgZXh0ZW5kcyBDb21tYW5kVGVzdFN1cHBvcnQKK3sKKyAgICB2b2lkIHRlc3RTdG9wTm90U3RhcnRlZCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNoZWxsIDw8ICdyZWNvcmQgc3RvcCcKKyAgICAgICAgICAgIGZhaWwoKQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXhwZWN0ZWQpIHt9CisgICAgfQorCisgICAgdm9pZCB0ZXN0U3RhcnRBbHJlYWR5U3RhcnRlZCgpIHsKKyAgICAgICAgc2hlbGwgPDwgJ3JlY29yZCBzdGFydCcKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2hlbGwgPDwgJ3JlY29yZCBzdGFydCcKKyAgICAgICAgICAgIGZhaWwoKQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXhwZWN0ZWQpIHt9CisKKyAgICAgICAgZGVmIGZpbGUgPSBzaGVsbCA8PCAncmVjb3JkIHN0b3AnCisKKyAgICAgICAgZmlsZS5kZWxldGUoKQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9jb21tYW5kcy9TYXZlQ29tbWFuZFRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvY29tbWFuZHMvU2F2ZUNvbW1hbmRUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDhhZjIzCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvY29tbWFuZHMvU2F2ZUNvbW1hbmRUZXN0Lmdyb292eQpAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLmNvbW1hbmRzCisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLkNvbW1hbmRFeGNlcHRpb24KKworLyoqCisgKiBUZXN0cyBmb3IgdGhlIHtAbGluayBTYXZlQ29tbWFuZH0gY2xhc3MuCisgKgorICogQHZlcnNpb24gJElkJAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFzb25AcGxhbmV0NTcuY29tIj5KYXNvbiBEaWxsb248L2E+CisgKi8KK2NsYXNzIFNhdmVDb21tYW5kVGVzdAorICAgIGV4dGVuZHMgQ29tbWFuZFRlc3RTdXBwb3J0Cit7CisgICAgdm9pZCB0ZXN0U2F2ZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNoZWxsIDw8ICdzYXZlJworICAgICAgICAgICAgZmFpbCgpCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZXhwZWN0ZWQpIHt9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvY29tbWFuZHMvU2V0Q29tbWFuZFRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvY29tbWFuZHMvU2V0Q29tbWFuZFRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4Y2YxYzUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9jb21tYW5kcy9TZXRDb21tYW5kVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5jb21tYW5kcworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5Db21tYW5kRXhjZXB0aW9uCisKKy8qKgorICogVGVzdHMgZm9yIHRoZSB7QGxpbmsgU2V0Q29tbWFuZH0gY2xhc3MuCisgKgorICogQHZlcnNpb24gJElkJAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFzb25AcGxhbmV0NTcuY29tIj5KYXNvbiBEaWxsb248L2E+CisgKi8KK2NsYXNzIFNldENvbW1hbmRUZXN0CisgICAgZXh0ZW5kcyBDb21tYW5kVGVzdFN1cHBvcnQKK3sKKyAgICB2b2lkIHRlc3RTZXQoKSB7CisgICAgICAgIHNoZWxsIDw8ICdzZXQnCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvY29tbWFuZHMvU2hvd0NvbW1hbmRUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL2NvbW1hbmRzL1Nob3dDb21tYW5kVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdiMmIwZAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL2NvbW1hbmRzL1Nob3dDb21tYW5kVGVzdC5ncm9vdnkKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5jb21tYW5kcworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5Db21tYW5kRXhjZXB0aW9uCisKKy8qKgorICogVGVzdHMgZm9yIHRoZSB7QGxpbmsgU2hvd0NvbW1hbmR9IGNsYXNzLgorICoKKyAqIEB2ZXJzaW9uICRJZCQKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphc29uQHBsYW5ldDU3LmNvbSI+SmFzb24gRGlsbG9uPC9hPgorICovCitjbGFzcyBTaG93Q29tbWFuZFRlc3QKKyAgICBleHRlbmRzIENvbW1hbmRUZXN0U3VwcG9ydAoreworICAgIHZvaWQgdGVzdFNob3coKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzaGVsbCA8PCAnc2hvdycKKyAgICAgICAgICAgIGZhaWwoKQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChDb21tYW5kRXhjZXB0aW9uIGV4cGVjdGVkKSB7fQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL2V4cHIvQ2xhc3NXaXRoUHJpdmF0ZUNvbnN0cnVjdG9yLmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL2V4cHIvQ2xhc3NXaXRoUHJpdmF0ZUNvbnN0cnVjdG9yLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmYwMjI1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvZXhwci9DbGFzc1dpdGhQcml2YXRlQ29uc3RydWN0b3IuZ3Jvb3Z5CkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMuc2hlbGwuZXhwcgorCisvKioKKyAqIFRlc3RzIGZvciBjbGFzc2VzIGRlZmluZWQgd2hpY2ggaGF2ZSBwcml2YXRlIGNvbnN0cnVjdG9ycy4KKyAqCisgKiBAdmVyc2lvbiAkSWQkCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYXNvbkBwbGFuZXQ1Ny5jb20iPkphc29uIERpbGxvbjwvYT4KKyAqLworY2xhc3MgQ2xhc3NXaXRoUHJpdmF0ZUNvbnN0cnVjdG9yCisgICAgZXh0ZW5kcyBFeHByVGVzdFN1cHBvcnQKK3sKKyAgICB2b2lkIHRlc3RDbGFzcygpIHsKKyAgICAgICAgc2hlbGwuZXhlY3V0ZSgnY2xhc3MgSyB7IHByaXZhdGUgSygpe30gfScpCisgICAgfQorICAgIHZvaWQgdGVzdEVudW0oKSB7CisgICAgICAgIHNoZWxsLmV4ZWN1dGUoJ2VudW0gRSB7QSxCLEN9JykKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvZXhwci9FeGl0VGVzdC5ncm9vdnkgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9leHByL0V4aXRUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWI0ZTg5Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvZXhwci9FeGl0VGVzdC5ncm9vdnkKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5leHByCisKKy8qKgorICogVGVzdHMgdGhhdCB3ZSBjYW4ndCBjYWxsIDx0dD5TeXN0ZW0uZXhpdCgpPC90dD4uCisgKgorICogQHZlcnNpb24gJElkJAorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFzb25AcGxhbmV0NTcuY29tIj5KYXNvbiBEaWxsb248L2E+CisgKi8KK2NsYXNzIEV4aXRUZXN0CisgICAgZXh0ZW5kcyBFeHByVGVzdFN1cHBvcnQKK3sKKyAgICB2b2lkIHRlc3RTeXN0ZW1FeGl0KCkgeworICAgICAgICAvKgorICAgICAgICBGSVhNRTogTmVlZCB0byBnZXQgdGhpcyBvbmUgd29ya2luZy4uLiBpdHMgbm90IGhhcHB5IHJpZ2h0IG5vdworICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNoZWxsLmV4ZWN1dGUoJ1N5c3RlbS5leGl0KDApJykKKyAgICAgICAgICAgIGZhaWwoKQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBleHBlY3RlZCkge30KKyAgICAgICAgKi8KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvZXhwci9FeHByVGVzdFN1cHBvcnQuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvZXhwci9FeHByVGVzdFN1cHBvcnQuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkY2YwN2MKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9leHByL0V4cHJUZXN0U3VwcG9ydC5ncm9vdnkKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAzLTIwMDcgdGhlIG9yaWdpbmFsIGF1dGhvciBvciBhdXRob3JzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmNvZGVoYXVzLmdyb292eS50b29scy5zaGVsbC5leHByCisKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLkdyb292eXNoCisKKy8qKgorICogU3VwcG9ydCBmb3IgZXhwcmVzc2lvbiB0ZXN0cy4KKyAqCisgKiBAdmVyc2lvbiAkSWQkCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqYXNvbkBwbGFuZXQ1Ny5jb20iPkphc29uIERpbGxvbjwvYT4KKyAqLworYWJzdHJhY3QgY2xhc3MgRXhwclRlc3RTdXBwb3J0CisgICAgZXh0ZW5kcyBHcm9vdnlUZXN0Q2FzZQoreworICAgIEdyb292eXNoIHNoZWxsCisgICAgCisgICAgT2JqZWN0IGxhc3RSZXN1bHQKKworICAgIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIHN1cGVyLnNldFVwKCkKKworICAgICAgICBzaGVsbCA9IG5ldyBHcm9vdnlzaCgpCisKKyAgICAgICAgc2hlbGwuZXJyb3JIb29rID0geyBUaHJvd2FibGUgY2F1c2UgLT4KKyAgICAgICAgICAgIHRocm93IGNhdXNlCisgICAgICAgIH0KKworICAgICAgICBzaGVsbC5yZXN1bHRIb29rID0geyByZXN1bHQgLT4KKyAgICAgICAgICAgIGxhc3RSZXN1bHQgPSByZXN1bHQKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC9leHByL1RpbWVJdFRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvZXhwci9UaW1lSXRUZXN0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzNlZTlkCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvZXhwci9UaW1lSXRUZXN0Lmdyb292eQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLmV4cHIKKworLyoqCisgKiBUZXN0cyBmb3IgPHR0PnRpbWUgPSB7IGl0KCkgfTwvdHQ+IGV4cHJlc3Npb25zLgorICoKKyAqIEB2ZXJzaW9uICRJZCQKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphc29uQHBsYW5ldDU3LmNvbSI+SmFzb24gRGlsbG9uPC9hPgorICovCitjbGFzcyBUaW1lSXRUZXN0CisgICAgZXh0ZW5kcyBFeHByVGVzdFN1cHBvcnQKK3sKKyAgICB2b2lkIHRlc3RTaW5nbGVMaW5lKCkgeworICAgICAgICBkZWYgcmVzdWx0ID0gc2hlbGwuZXhlY3V0ZSgndGltZSA9IHsgaXQoKSB9JykKKyAgICAgICAgYXNzZXJ0IHJlc3VsdCAhPSBudWxsCisgICAgfQorCisgICAgdm9pZCB0ZXN0TXVsdGlMaW5lKCkgeworICAgICAgICBkZWYgcmVzdWx0CisKKyAgICAgICAgcmVzdWx0ID0gc2hlbGwuZXhlY3V0ZSgndGltZSA9IHsnKQorICAgICAgICBhc3NlcnQgcmVzdWx0ID09IG51bGwKKworICAgICAgICByZXN1bHQgPSBzaGVsbC5leGVjdXRlKCdpdCgpJykKKyAgICAgICAgYXNzZXJ0IHJlc3VsdCA9PSBudWxsCisKKyAgICAgICAgcmVzdWx0ID0gc2hlbGwuZXhlY3V0ZSgnfScpCisgICAgICAgIGFzc2VydCByZXN1bHQgIT0gbnVsbAorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC91dGlsL01lc3NhZ2VTb3VyY2VUZXN0Lmdyb292eSBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3NoZWxsL3V0aWwvTWVzc2FnZVNvdXJjZVRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwN2YwZWYKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC91dGlsL01lc3NhZ2VTb3VyY2VUZXN0Lmdyb292eQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDMtMjAwNyB0aGUgb3JpZ2luYWwgYXV0aG9yIG9yIGF1dGhvcnMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuY29kZWhhdXMuZ3Jvb3Z5LnRvb2xzLnNoZWxsLnV0aWwKKworLyoqCisgKiBVbml0IHRlc3RzIGZvciB0aGUge0BsaW5rIE1lc3NhZ2VTb3VyY2V9IGNsYXNzLgorICoKKyAqIEB2ZXJzaW9uICRJZCQKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphc29uQHBsYW5ldDU3LmNvbSI+SmFzb24gRGlsbG9uPC9hPgorICovCitjbGFzcyBNZXNzYWdlU291cmNlVGVzdAorICAgIGV4dGVuZHMgR3Jvb3Z5VGVzdENhc2UKK3sKKyAgICBNZXNzYWdlU291cmNlIG1lc3NhZ2VzCisKKyAgICB2b2lkIHNldFVwKCkgeworICAgICAgICBtZXNzYWdlcyA9IG5ldyBNZXNzYWdlU291cmNlKHRoaXMuY2xhc3MpCisgICAgfQorICAgIAorICAgIHZvaWQgdGVzdExvYWRBbmRHZXRNZXNzYWdlKCkgeworICAgICAgICBkZWYgYSA9IG1lc3NhZ2VzWydhJ10KKyAgICAgICAgYXNzZXJ0ICcxJyA9PSBhCisKKyAgICAgICAgZGVmIGIgPSBtZXNzYWdlc1snYiddCisgICAgICAgIGFzc2VydCAnMicgPT0gYgorCisgICAgICAgIGRlZiBjID0gbWVzc2FnZXNbJ2MnXQorICAgICAgICBhc3NlcnQgJzMnID09IGMKKworICAgICAgICBkZWYgZiA9IG1lc3NhZ2VzLmZvcm1hdCgnZicsIGEsIGIsIGMpCisgICAgICAgIGFzc2VydCAnMSAyIDMnID09IGYKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvdXRpbC9NZXNzYWdlU291cmNlVGVzdC5wcm9wZXJ0aWVzIGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvc2hlbGwvdXRpbC9NZXNzYWdlU291cmNlVGVzdC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyYjIwNjAKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9zaGVsbC91dGlsL01lc3NhZ2VTb3VyY2VUZXN0LnByb3BlcnRpZXMKQEAgLTAsMCArMSwyNyBAQAorIworIyBDb3B5cmlnaHQgMjAwMy0yMDA3IHRoZSBvcmlnaW5hbCBhdXRob3Igb3IgYXV0aG9ycy4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjCisjICRJZCQKKyMKKworYT0xCisKK2I9MgorCitjPTMKKworZj17MH0gezF9IHsyfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3htbC9Eb21Ub0dyb292eVRlc3QuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMveG1sL0RvbVRvR3Jvb3Z5VGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk0Mjk3MgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3htbC9Eb21Ub0dyb292eVRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMTE2IEBACitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMueG1sDQorDQoraW1wb3J0IGphdmEuaW8uKg0KK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXINCitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeQ0KK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudA0KK2ltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZQ0KK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24NCisNCisvKioNCisgKiBAYXV0aG9yIEphbWVzIFN0cmFjaGFuDQorICogQGF1dGhvciBwYXVsaw0KKyAqIEB2ZXJzaW9uICRSZXZpc2lvbjogNDExMSAkDQorICovDQorcHVibGljIGNsYXNzIERvbVRvR3Jvb3Z5VGVzdCBleHRlbmRzIEdyb292eVRlc3RDYXNlIHsNCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExTID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpDQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1hNTF8xID0NCisgICAgICAgICI8YSBocmVmPSdodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZyc+R3Jvb3Z5PC9hPiINCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfWE1MXzIgPQ0KKyAgICAgICAgIjxwcm9qZWN0IG5hbWU9J3Rlc3RQcm9qZWN0Jz48dGFyZ2V0IG5hbWU9J3Rlc3RUYXJnZXQnPjxlY2hvPm1lc3NhZ2U8L2VjaG8+PGVjaG8vPjwvdGFyZ2V0PjwvcHJvamVjdD4iDQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1hNTF8zID0gJycnPD94bWwgdmVyc2lvbj0iMS4wIj8+DQorICAgICAgICA8IS0tIHRoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgdXNpbmcgbWFya3VwIHRvIHNwZWNpZnkgYSByaWNoIHVzZXIgaW50ZXJmYWNlIC0tPg0KKyAgICAgICAgPGZyYW1lIHNpemU9IlszMDAsMzAwXSIgdGV4dD0iTXkgV2luZG93Ij4NCisgICAgICAgICAgPGxhYmVsIGJvdW5kcz0iWzEwLDEwLDI5MCwzMF0iIHRleHQ9IlNhdmUgY2hhbmdlcyIvPg0KKyAgICAgICAgICA8cGFuZWwgYm91bmRzPSJbMTAsNDAsMjkwLDI5MF0iPg0KKyAgICAgICAgICAgIDxidXR0b24gYWN0aW9uPSJzYXZlKCkiIHRleHQ9Ik9LIi8+DQorICAgICAgICAgICAgPGJ1dHRvbiBhY3Rpb249ImNsb3NlKCkiIHRleHQ9IkNhbmNlbCIvPg0KKyAgICAgICAgICA8L3BhbmVsPg0KKyAgICAgICAgPC9mcmFtZT4nJycNCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfWE1MXzQgPSAnJycNCisgICAgICAgIDx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPg0KKyAgICAgICAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iU0tVIj4NCisgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPg0KKyAgICAgICAgICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSJcXGR7M30tW0EtWl17Mn0iLz4NCisgICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4NCisgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4NCisgICAgICAgIDwveHNkOnNjaGVtYT4nJycNCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUEVDVEVEX0JVSUxERVJfU0NSSVBUXzEgPQ0KKyAgICAgICAgImEoaHJlZjonaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmcnLCAnR3Jvb3Z5JykiDQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBFQ1RFRF9CVUlMREVSX1NDUklQVF8yID0gJycnDQorICAgICAgICBwcm9qZWN0KG5hbWU6J3Rlc3RQcm9qZWN0Jykgew0KKyAgICAgICAgICB0YXJnZXQobmFtZTondGVzdFRhcmdldCcpIHsNCisgICAgICAgICAgICBlY2hvKCdtZXNzYWdlJykNCisgICAgICAgICAgICBlY2hvKCkNCisgICAgICAgICAgfQ0KKyAgICAgICAgfScnJw0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQRUNURURfQlVJTERFUl9TQ1JJUFRfMyA9ICcnJw0KKyAgICAgICAgLyogdGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyB1c2luZyBtYXJrdXAgdG8gc3BlY2lmeSBhIHJpY2ggdXNlciBpbnRlcmZhY2UgKi8NCisgICAgICAgIGZyYW1lKHNpemU6J1szMDAsMzAwXScsIHRleHQ6J015IFdpbmRvdycpIHsNCisgICAgICAgICAgbGFiZWwoYm91bmRzOidbMTAsMTAsMjkwLDMwXScsIHRleHQ6J1NhdmUgY2hhbmdlcycpDQorICAgICAgICAgIHBhbmVsKGJvdW5kczonWzEwLDQwLDI5MCwyOTBdJykgew0KKyAgICAgICAgICAgIGJ1dHRvbihhY3Rpb246J3NhdmUoKScsIHRleHQ6J09LJykNCisgICAgICAgICAgICBidXR0b24oYWN0aW9uOidjbG9zZSgpJywgdGV4dDonQ2FuY2VsJykNCisgICAgICAgICAgfQ0KKyAgICAgICAgfScnJw0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQRUNURURfQlVJTERFUl9TQ1JJUFRfNCA9ICcnJw0KKyAgICAgICAgbWtwLmRlY2xhcmVOYW1lc3BhY2UoeHNkOidodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYScpDQorICAgICAgICAneHNkLnNjaGVtYScoKSB7DQorICAgICAgICAgICd4c2Quc2ltcGxlVHlwZScobmFtZTonU0tVJykgew0KKyAgICAgICAgICAgICd4c2QucmVzdHJpY3Rpb24nKGJhc2U6J3hzZDpzdHJpbmcnKSB7DQorICAgICAgICAgICAgICAneHNkLnBhdHRlcm4nKHZhbHVlOidcXFxcZHszfS1bQS1aXXsyfScpDQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9JycnDQorDQorICAgIHByb3RlY3RlZCBEb2N1bWVudEJ1aWxkZXIgYnVpbGRlcg0KKyAgICBwcm90ZWN0ZWQgRG9tVG9Hcm9vdnkgY29udmVydGVyDQorICAgIHByb3RlY3RlZCBGaWxlIGRpciA9IG5ldyBGaWxlKCJ0YXJnZXQvZ2VuZXJhdGVkLWdyb292eXhtbCIpDQorDQorICAgIHB1YmxpYyB2b2lkIHRlc3RDb252ZXJzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQorICAgICAgICBjb252ZXJ0KCJ0ZXN0MS54bWwiLCAidGVzdDEuZ3Jvb3Z5IikNCisgICAgICAgIGNvbnZlcnQoInBvLnhzZCIsICJwb1NjaGVtYS5ncm9vdnkiKQ0KKyAgICAgICAgY29udmVydCgic3dpbmcueG1sIiwgInN3aW5nLmdyb292eSIpDQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgdGVzdENvbnZlcnNpb25Gb3JtYXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCisgICAgICAgIGNoZWNrQ29udmVyc2lvbihURVNUX1hNTF8xLCBFWFBFQ1RFRF9CVUlMREVSX1NDUklQVF8xKQ0KKyAgICAgICAgY2hlY2tDb252ZXJzaW9uKFRFU1RfWE1MXzIsIEVYUEVDVEVEX0JVSUxERVJfU0NSSVBUXzIpDQorICAgICAgICBjaGVja0NvbnZlcnNpb24oVEVTVF9YTUxfMywgRVhQRUNURURfQlVJTERFUl9TQ1JJUFRfMykNCisgICAgICAgIGNoZWNrQ29udmVyc2lvbihURVNUX1hNTF80LCBFWFBFQ1RFRF9CVUlMREVSX1NDUklQVF80KQ0KKyAgICB9DQorDQorICAgIHByaXZhdGUgdm9pZCBjaGVja0NvbnZlcnNpb24oU3RyaW5nIHRlc3RYbWwsIFN0cmluZyBleHBlY3RlZFNjcmlwdCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gew0KKyAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0odGVzdFhtbC5nZXRCeXRlcygpKQ0KKyAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBidWlsZGVyLnBhcnNlKGlucHV0U3RyZWFtKQ0KKyAgICAgICAgU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKQ0KKyAgICAgICAgY29udmVydGVyID0gbmV3IERvbVRvR3Jvb3Z5KG5ldyBQcmludFdyaXRlcih3cml0ZXIpKQ0KKyAgICAgICAgY29udmVydGVyLnByaW50KGRvY3VtZW50KQ0KKyAgICAgICAgU3RyaW5nVGVzdFV0aWwuYXNzZXJ0TXVsdGlsaW5lU3RyaW5nc0VxdWFsKGV4cGVjdGVkU2NyaXB0LCB3cml0ZXIudG9TdHJpbmcoKSkNCisgICAgfQ0KKw0KKyAgICBwcml2YXRlIHZvaWQgY29udmVydChTdHJpbmcgbmFtZSwgU3RyaW5nIG91dHB1dCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQorICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IHBhcnNlKG5hbWUpDQorICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIobmV3IEZpbGVXcml0ZXIobmV3IEZpbGUoZGlyLCBvdXRwdXQpKSkNCisgICAgICAgIGNvbnZlcnRlciA9IG5ldyBEb21Ub0dyb292eSh3cml0ZXIpDQorICAgICAgICB3cml0ZXIucHJpbnRsbigiIyEvYmluL2dyb292eSIpDQorICAgICAgICB3cml0ZXIucHJpbnRsbigpDQorICAgICAgICB3cml0ZXIucHJpbnRsbigiLy8gZ2VuZXJhdGVkIGZyb20gIiArIG5hbWUpDQorICAgICAgICB3cml0ZXIucHJpbnRsbigpDQorICAgICAgICBjb252ZXJ0ZXIucHJpbnQoZG9jdW1lbnQpDQorICAgICAgICB3cml0ZXIuY2xvc2UoKQ0KKyAgICB9DQorDQorICAgIHByaXZhdGUgRG9jdW1lbnQgcGFyc2UoU3RyaW5nIG5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsNCisgICAgICAgIFVSTCByZXNvdXJjZSA9IGdldENsYXNzKCkuZ2V0UmVzb3VyY2UobmFtZSkNCisgICAgICAgIGFzc2VydFRydWUoIkNvdWxkIG5vdCBmaW5kIHJlc291cmNlOiAiICsgbmFtZSwgcmVzb3VyY2UgIT0gbnVsbCkNCisgICAgICAgIHJldHVybiBidWlsZGVyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShyZXNvdXJjZS50b1N0cmluZygpKSkNCisgICAgfQ0KKw0KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gew0KKyAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpDQorICAgICAgICBmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpDQorICAgICAgICBidWlsZGVyID0gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKQ0KKyAgICAgICAgZGlyLm1rZGlycygpDQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMveG1sL3BvLnhzZCBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3htbC9wby54c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVhN2QxMgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3htbC9wby54c2QKQEAgLTAsMCArMSw2NiBAQAorPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+CisKKyAgICA8eHNkOmFubm90YXRpb24+CisgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbiB4bWw6bGFuZz0iZW4iPgorICAgICAgICAgICAgUHVyY2hhc2Ugb3JkZXIgc2NoZW1hIGZvciBFeGFtcGxlLmNvbS4KKyAgICAgICAgICAgIENvcHlyaWdodCAyMDAwIEV4YW1wbGUuY29tLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgorICAgIDwveHNkOmFubm90YXRpb24+CisKKyAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHVyY2hhc2VPcmRlciIgdHlwZT0iUHVyY2hhc2VPcmRlclR5cGUiLz4KKworICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb21tZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisKKyAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlB1cmNoYXNlT3JkZXJUeXBlIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzaGlwVG8iIHR5cGU9IlVTQWRkcmVzcyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJpbGxUbyIgdHlwZT0iVVNBZGRyZXNzIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJjb21tZW50IiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpdGVtcyIgdHlwZT0iSXRlbXMiLz4KKyAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9yZGVyRGF0ZSIgdHlwZT0ieHNkOmRhdGUiLz4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKworICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVVNBZGRyZXNzIj4KKyAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RyZWV0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2l0eSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0YXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iemlwIiB0eXBlPSJ4c2Q6ZGVjaW1hbCIvPgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY291bnRyeSIgdHlwZT0ieHNkOk5NVE9LRU4iCisgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkPSJVUyIvPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorCisgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJJdGVtcyI+CisgICAgICAgIDx4c2Q6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaXRlbSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9kdWN0TmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InF1YW50aXR5Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnBvc2l0aXZlSW50ZWdlciI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOm1heEV4Y2x1c2l2ZSB2YWx1ZT0iMTAwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlVTUHJpY2UiIHR5cGU9InhzZDpkZWNpbWFsIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgcmVmPSJjb21tZW50IiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzaGlwRGF0ZSIgdHlwZT0ieHNkOmRhdGUiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icGFydE51bSIgdHlwZT0iU0tVIiB1c2U9InJlcXVpcmVkIi8+CisgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzZDplbGVtZW50PgorICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKworICAgIDwhLS0gU3RvY2sgS2VlcGluZyBVbml0LCBhIGNvZGUgZm9yIGlkZW50aWZ5aW5nIHByb2R1Y3RzIC0tPgorICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJTS1UiPgorICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgorICAgICAgICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSJcZHszfS1bQS1aXXsyfSIvPgorICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KKyAgICA8L3hzZDpzaW1wbGVUeXBlPgorCis8L3hzZDpzY2hlbWE+IApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3htbC9zd2luZy54bWwgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS90b29scy94bWwvc3dpbmcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMjViMzMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS90b29scy94bWwvc3dpbmcueG1sCkBAIC0wLDAgKzEsMTAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLSB0aGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIHVzaW5nIG1hcmt1cCB0byBzcGVjaWZ5IGEgcmljaCB1c2VyIGludGVyZmFjZSAtLT4KKzxmcmFtZSB0ZXh0PSJNeSBXaW5kb3ciIHNpemU9IlszMDAsMzAwXSI+CisgICAgPGxhYmVsIHRleHQ9IlNhdmUgY2hhbmdlcyIgYm91bmRzPSJbMTAsMTAsMjkwLDMwXSIvPgorICAgIDxwYW5lbCBib3VuZHM9IlsxMCw0MCwyOTAsMjkwXSI+CisgICAgICAgIDxidXR0b24gdGV4dD0iT0siIGFjdGlvbj0ic2F2ZSgpIi8+CisgICAgICAgIDxidXR0b24gdGV4dD0iQ2FuY2VsIiBhY3Rpb249ImNsb3NlKCkiLz4KKyAgICA8L3BhbmVsPgorPC9mcmFtZT4KKyAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS90b29scy94bWwvc3dpbmcyLnhtbCBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3htbC9zd2luZzIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMjViMzMKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rlc3Qvb3JnL2NvZGVoYXVzL2dyb292eS90b29scy94bWwvc3dpbmcyLnhtbApAQCAtMCwwICsxLDEwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0gdGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyB1c2luZyBtYXJrdXAgdG8gc3BlY2lmeSBhIHJpY2ggdXNlciBpbnRlcmZhY2UgLS0+Cis8ZnJhbWUgdGV4dD0iTXkgV2luZG93IiBzaXplPSJbMzAwLDMwMF0iPgorICAgIDxsYWJlbCB0ZXh0PSJTYXZlIGNoYW5nZXMiIGJvdW5kcz0iWzEwLDEwLDI5MCwzMF0iLz4KKyAgICA8cGFuZWwgYm91bmRzPSJbMTAsNDAsMjkwLDI5MF0iPgorICAgICAgICA8YnV0dG9uIHRleHQ9Ik9LIiBhY3Rpb249InNhdmUoKSIvPgorICAgICAgICA8YnV0dG9uIHRleHQ9IkNhbmNlbCIgYWN0aW9uPSJjbG9zZSgpIi8+CisgICAgPC9wYW5lbD4KKzwvZnJhbWU+CisgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90ZXN0L29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMveG1sL3Rlc3QxLnhtbCBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3htbC90ZXN0MS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA0YmI0NAotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdGVzdC9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3htbC90ZXN0MS54bWwKQEAgLTAsMCArMSwxOSBAQAorPGh0bWw+CisgICAgPGhlYWQ+CisgICAgICAgIDx0aXRsZT5YTUwgZW5jb2Rpbmcgd2l0aCBHcm9vdnk8L3RpdGxlPgorICAgIDwvaGVhZD4KKyAgICA8Ym9keT4KKyAgICAgICAgPGgxPlhNTCBlbmNvZGluZyB3aXRoIEdyb292eTwvaDE+CisgICAgICAgIDxwPnRoaXMgZm9ybWF0IGNhbiBiZSB1c2VkIGFzIGFuIGFsdGVybmF0aXZlIG1hcmt1cCB0byBYTUw8L3A+CisgICAgICAgIDwhLS0gYW4gZWxlbWVudCB3aXRoIGF0dHJpYnV0ZXMgYW5kIHRleHQgY29udGVudCAtLT4KKyAgICAgICAgPGEgaHJlZj0iaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmciPkdyb292eTwvYT4KKyAgICAgICAgPCEtLSBtaXhlZCBjb250ZW50IC0tPgorICAgICAgICA8cD5UaGlzIGlzIHNvbWUKKyAgICAgICAgICAgIDxiPm1peGVkPC9iPgorICAgICAgICAgICAgdGV4dC4gRm9yIG1vcmUgc2VlIHRoZQorICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2dyb292eS5jb2RlaGF1cy5vcmciPkdyb292eTwvYT4KKyAgICAgICAgICAgIHByb2plY3QKKyAgICAgICAgPC9wPgorICAgICAgICA8cD5zb21lIHRleHQ8L3A+CisgICAgPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdG9vbHMvb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9Eb2NHZW5lcmF0b3IuZ3Jvb3Z5IGIvZ3Jvb3Z5L3NyYy90b29scy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL0RvY0dlbmVyYXRvci5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU4ZGVhNwotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvdG9vbHMvb3JnL2NvZGVoYXVzL2dyb292eS90b29scy9Eb2NHZW5lcmF0b3IuZ3Jvb3Z5CkBAIC0wLDAgKzEsMzAzIEBACitwYWNrYWdlIG9yZy5jb2RlaGF1cy5ncm9vdnkudG9vbHMKKworaW1wb3J0IGdyb292eS54bWwuU3RyZWFtaW5nTWFya3VwQnVpbGRlcgorCitpbXBvcnQgamF2YS5pby5GaWxlCisKK2ltcG9ydCBjb20udGhvdWdodHdvcmtzLnFkb3guSmF2YURvY0J1aWxkZXIKK2ltcG9ydCBjb20udGhvdWdodHdvcmtzLnFkb3gubW9kZWwuSmF2YVNvdXJjZQoraW1wb3J0IGNvbS50aG91Z2h0d29ya3MucWRveC5tb2RlbC5KYXZhQ2xhc3MKK2ltcG9ydCBjb20udGhvdWdodHdvcmtzLnFkb3gubW9kZWwuSmF2YU1ldGhvZAoraW1wb3J0IGNvbS50aG91Z2h0d29ya3MucWRveC5tb2RlbC5KYXZhUGFyYW1ldGVyCitpbXBvcnQgY29tLnRob3VnaHR3b3Jrcy5xZG94Lm1vZGVsLlR5cGUKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworCisvKioKKyAqIEdlbmVyYXRlIGRvY3VtZW50YXRpb24gYWJvdXQgdGhlIG1ldGhvZHMgcHJvdmlkZWQgYnkgdGhlIEdyb292eSBEZXZlbG9wbWVudCBLaXQKKyAqIGVuaGFuY2luZyB0aGUgc3RhbmRhcmQgSkRLIGNsYXNzZXMuCisgKgorICogQGF1dGhvciBHdWlsbGF1bWUgTGFmb3JnZSwgSm9obiBXaWxzb24KKyAqLworY2xhc3MgRG9jR2VuZXJhdG9yCit7CisJZGVmIHNvdXJjZUZpbGVzID0gW10KKwlGaWxlIG91dHB1dEZvbGRlcgorCUphdmFEb2NCdWlsZGVyIGJ1aWxkZXIKKwkvLyBjYXRlZ29yaXplIGFsbCBncm9vdnkgbWV0aG9kcyBwZXIgY29yZSBKREsgY2xhc3MgdG8gd2hpY2ggaXQgYXBwbGllcworCWRlZiBqZGtFbmhhbmNlZENsYXNzZXMgPSBbOl0KKyAgICBkZWYgcGFja2FnZXMgPSBbOl0KKwlkZWYgc29ydGVkUGFja2FnZXMKKworCURvY0dlbmVyYXRvcihzb3VyY2VGaWxlcywgRmlsZSBvdXRwdXRGb2xkZXIpCisJeworCQl0aGlzLnNvdXJjZUZpbGVzID0gc291cmNlRmlsZXMKKwkJdGhpcy5vdXRwdXRGb2xkZXIgPSBvdXRwdXRGb2xkZXIKKwkJcGFyc2UoKQorCX0KKworCS8qKgorCSAqIFBhcnNlIHRoZSBEZWZhdWx0R3Jvb3Z5TWV0aG9kcyBjbGFzcyB0byBidWlsZCBhIGdyYXBoIHJlcHJlc2VudGluZyB0aGUgc3RydWN0dXJlIG9mIHRoZSBjbGFzcywKKwkgKiB3aXRoIGl0cyBtZXRob2RzLCBqYXZhZG9jIGNvbW1lbnRzIGFuZCB0YWdzLgorCSAqLworCXByaXZhdGUgdm9pZCBwYXJzZSgpCisJeworCQlidWlsZGVyID0gbmV3IEphdmFEb2NCdWlsZGVyKCkKKwkJc291cmNlRmlsZXMuZWFjaCB7CisJCQlwcmludGxuICJhZGRpbmcgcmVhZGVyIGZvciAkaXQiCisJCQlidWlsZGVyLmFkZFNvdXJjZShpdC5uZXdSZWFkZXIoKSkKKwkJfQorCisJCWRlZiBzb3VyY2VzID0gYnVpbGRlci5nZXRTb3VyY2VzKCkKKworCQlkZWYgbWV0aG9kcyA9IFtdCisJCXNvdXJjZXMuZWFjaCB7IHNvdXJjZSAtPgorCQkJZGVmIGNsYXNzZXMgPSBzb3VyY2UuZ2V0Q2xhc3NlcygpCisJCQljbGFzc2VzLmVhY2ggeyBhQ2xhc3MgLT4KKwkJCQltZXRob2RzLmFkZEFsbCAoYUNsYXNzLm1ldGhvZHMgYXMgTGlzdCkKKwkJCX0KKwkJfQorCQorICAgICAgICBkZWYgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKwkJZm9yIChtZXRob2QgaW4gbWV0aG9kcykgeworCQkJaWYgKG1ldGhvZC5pc1B1YmxpYygpICYmIG1ldGhvZC5pc1N0YXRpYygpKSB7CisJCQkJZGVmIHBhcmFtZXRlcnMgPSBtZXRob2QuZ2V0UGFyYW1ldGVycygpCisJCQkJZGVmIGpka0NsYXNzID0gcGFyYW1ldGVyc1swXS5nZXRUeXBlKCkudG9TdHJpbmcoKQorCisJCQkJaWYgKGpka0NsYXNzLnN0YXJ0c1dpdGgoJ2dyb292eScpKSB7CisJCQkJCS8vIG5vdGhpbmcsIHNraXAgaXQKKwkJCQl9CisJCQkJZWxzZSBpZiAoamRrRW5oYW5jZWRDbGFzc2VzLmNvbnRhaW5zS2V5KGpka0NsYXNzKSkgeworCQkJCSAgICBMaXN0IGwgPSBqZGtFbmhhbmNlZENsYXNzZXNbamRrQ2xhc3NdOworCQkJCQlsLmFkZChtZXRob2QpCisJCQkgICAgfQorCQkJCWVsc2UKKwkJCQkJamRrRW5oYW5jZWRDbGFzc2VzW2pka0NsYXNzXSA9IFttZXRob2RdCisJCQl9CisJCX0KKworCQlqZGtFbmhhbmNlZENsYXNzZXMua2V5U2V0KCkuZWFjaCB7IGNsYXNzTmFtZSAtPgorICAgICAgICAJZGVmIHRoZVBhY2thZ2UgPSBjbGFzc05hbWUuY29udGFpbnMoIi4iKSA/IGNsYXNzTmFtZS5yZXBsYWNlRmlyc3QoL1wuW15cLl0qJC8sICIiKSA6ICIiCisgICAgICAgIAlpZiAoIXBhY2thZ2VzLmNvbnRhaW5zS2V5KHRoZVBhY2thZ2UpKSB7CisgICAgICAgIAkJcGFja2FnZXNbdGhlUGFja2FnZV0gPSBbXQorICAgICAgICAJfQorICAgIAkJcGFja2FnZXNbdGhlUGFja2FnZV0gPDwgY2xhc3NOYW1lCisgICAgICAgIH0KKyAgICAgICAgc29ydGVkUGFja2FnZXMgPSBuZXcgVHJlZVNldChwYWNrYWdlcy5rZXlTZXQoKSkKKwl9CisKKwkvKioKKwkgKiBCdWlsZHMgYW4gSFRNTCBwYWdlIGZyb20gdGhlIHN0cnVjdHVyZSBvZiBEZWZhdWx0R3Jvb3Z5TWV0aG9kcy4KKwkgKi8KKwkJCisJZGVmIGdlbmVyYXRlTmV3KCkgeworCQlkZWYgZW5naW5lID0gbmV3IGdyb292eS50ZXh0LlNpbXBsZVRlbXBsYXRlRW5naW5lKCkKKworCQkvLyB0aGUgaW5kZXgKKwkJZGVmIHRlbXBsYXRlSW5kZXggPSBjcmVhdGVUZW1wbGF0ZShlbmdpbmUsICdpbmRleC5odG1sJykKKwkJZGVmIG91dCA9IG5ldyBGaWxlKG91dHB1dEZvbGRlciwgJ2luZGV4Lmh0bWwnKQorCQlkZWYgYmluZGluZyA9IFtwYWNrYWdlczogc29ydGVkUGFja2FnZXNdCisJCW91dC53aXRoV3JpdGVyIHsKKwkJCWl0IDw8IHRlbXBsYXRlSW5kZXgubWFrZShiaW5kaW5nKQorCQl9CisJCS8vIHRoZSBvdmVydmlldworCQlkZWYgdGVtcGxhdGVPdmVydmlldyA9IGNyZWF0ZVRlbXBsYXRlKGVuZ2luZSwgJ292ZXJ2aWV3LXN1bW1hcnkuaHRtbCcpCisJCW91dCA9IG5ldyBGaWxlKG91dHB1dEZvbGRlciwgJ292ZXJ2aWV3LXN1bW1hcnkuaHRtbCcpCisJCWJpbmRpbmcgPSBbcGFja2FnZXM6IHNvcnRlZFBhY2thZ2VzXQorCQlvdXQud2l0aFdyaXRlciB7CisJCQlpdCA8PCB0ZW1wbGF0ZU92ZXJ2aWV3Lm1ha2UoYmluZGluZykKKwkJfQorCQkKKwkJZGVmIHRlbXBsYXRlT3ZlcnZpZXdGcmFtZSA9IGNyZWF0ZVRlbXBsYXRlKGVuZ2luZSwgJ3RlbXBsYXRlLm92ZXJ2aWV3LWZyYW1lLmh0bWwnKQorCQlvdXQgPSBuZXcgRmlsZShvdXRwdXRGb2xkZXIsICdvdmVydmlldy1mcmFtZS5odG1sJykKKwkJYmluZGluZyA9IFtwYWNrYWdlczogc29ydGVkUGFja2FnZXNdCisJCW91dC53aXRoV3JpdGVyIHsKKwkJCWl0IDw8IHRlbXBsYXRlT3ZlcnZpZXdGcmFtZS5tYWtlKGJpbmRpbmcpCisJCX0KKwkJCisJCS8vIHRoZSBhbGxjbGFzc2VzLWZyYW1lLmh0bWwKKwkJZGVmIHRlbXBsYXRlQWxsQ2xhc3NlcyA9IGNyZWF0ZVRlbXBsYXRlKGVuZ2luZSwgJ3RlbXBsYXRlLmFsbGNsYXNzZXMtZnJhbWUuaHRtbCcpCisJCW91dCA9IG5ldyBGaWxlKG91dHB1dEZvbGRlciwgJ2FsbGNsYXNzZXMtZnJhbWUuaHRtbCcpCisJCWJpbmRpbmcgPSBbY2xhc3NlczogamRrRW5oYW5jZWRDbGFzc2VzLmtleVNldCgpLnNvcnQgeyBpdC5yZXBsYWNlQWxsKCcuKlxcLicsICcnKX1dCisJCW91dC53aXRoV3JpdGVyIHsKKwkJCWl0IDw8IHRlbXBsYXRlQWxsQ2xhc3Nlcy5tYWtlKGJpbmRpbmcpCisJCX0KKwkJCisJCS8vIHRoZSBwYWNrYWdlLWZyYW1lLmh0bWwgZm9yIGVhY2ggcGFja2FnZQorCQlkZWYgdGVtcGxhdGVQYWNrYWdlRnJhbWUgPSBjcmVhdGVUZW1wbGF0ZShlbmdpbmUsICd0ZW1wbGF0ZS5wYWNrYWdlLWZyYW1lLmh0bWwnKQorCQlwYWNrYWdlcy5lYWNoIHsgY3VyUGFja2FnZSwgcGFja2FnZUNsYXNzZXMgLT4KKwkJCWRlZiBwYWNrYWdlTmFtZSA9IGN1clBhY2thZ2UgPyBjdXJQYWNrYWdlIDogInByaW1pdGl2ZS10eXBlcyIKKwkJCWdlbmVyYXRlUGFja2FnZUZyYW1lKHRlbXBsYXRlUGFja2FnZUZyYW1lLCBwYWNrYWdlTmFtZSwgcGFja2FnZUNsYXNzZXMpCisJCX0JCQorCQkKKwkJLy8gdGhlIGNsYXNzLmh0bWwgZm9yIGVhY2ggY2xhc3MKKwkJZGVmIHRlbXBsYXRlQ2xhc3MgPSBjcmVhdGVUZW1wbGF0ZShlbmdpbmUsICd0ZW1wbGF0ZS5jbGFzcy5odG1sJykKKwkJcGFja2FnZXMuZWFjaCB7IGN1clBhY2thZ2UsIHBhY2thZ2VDbGFzc2VzIC0+CisJCQlkZWYgcGFja2FnZU5hbWUgPSBjdXJQYWNrYWdlID8gY3VyUGFja2FnZSA6ICJwcmltaXRpdmUtdHlwZXMiCisJCQlwYWNrYWdlQ2xhc3Nlcy5lYWNoIHsKKwkJCQlnZW5lcmF0ZUNsYXNzRGV0YWlscyh0ZW1wbGF0ZUNsYXNzLCBwYWNrYWdlTmFtZSwgaXQpCisJCQl9CisJCX0JCQorCQkKKwl9CisJcHJpdmF0ZSBnZW5lcmF0ZUNsYXNzRGV0YWlscyh0ZW1wbGF0ZSwgY3VyUGFja2FnZSwgYUNsYXNzKQorCXsKKyAgICAgICAgZGVmIHBhY2thZ2VQYXRoID0gZ2VuZXJhdGVQYWNrYWdlUGF0aChjdXJQYWNrYWdlKQorCQlkZWYgZGlyID0gbmV3IEZpbGUob3V0cHV0Rm9sZGVyLCBwYWNrYWdlUGF0aCkKKwkJZGlyLm1rZGlycygpCisJCWRlZiBvdXQgPSBuZXcgRmlsZShkaXIsIGFDbGFzcy5yZXBsYWNlQWxsKCcuKlxcLicsICcnKSArICcuaHRtbCcpCisJCWRlZiBsaXN0T2ZNZXRob2RzID0gamRrRW5oYW5jZWRDbGFzc2VzW2FDbGFzc10uc29ydHsgaXQubmFtZSB9CisJCWRlZiBtZXRob2RzID0gW10KKwkJbGlzdE9mTWV0aG9kcy5lYWNoIHsgbWV0aG9kIC0+CisJCQlkZWYgcGFyYW1ldGVycyA9IG1ldGhvZC5nZXRUYWdzQnlOYW1lKCJwYXJhbSIpLmNvbGxlY3QgeyBbbmFtZTogaXQudmFsdWUucmVwbGFjZUFsbCgnIC4qJywgJycpLCBjb21tZW50OiBpdC52YWx1ZS5yZXBsYWNlQWxsKCdeXFx3KicsICcnKV19CisJCQlpZiAocGFyYW1ldGVycykKKwkJCQlwYXJhbWV0ZXJzLnJlbW92ZSgwKSAvLyBtZXRob2QgaXMgc3RhdGljLCBmaXJzdCBhcmcgaXMgdGhlICJyZWFsIHRoaXMiCisKKwkJCWRlZiByZXR1cm5UeXBlID0gZ2V0UmV0dXJuVHlwZShtZXRob2QpCisJCQlkZWYgbWV0aG9kSW5mbyA9IFtuYW1lOiBtZXRob2QubmFtZSwgCisJCQkgICAgICAgICAgICAgICAgICBjb21tZW50OiBnZXRDb21tZW50KG1ldGhvZCksCisJCQkgICAgICAgICAgICAgICAgICBzaG9ydENvbW1lbnQ6IGdldENvbW1lbnQobWV0aG9kKS5yZXBsYWNlQWxsKCdcXC4uKicsICcnKSwKKwkJCSAgICAgICAgICAgICAgICAgIHJldHVybkNvbW1lbnQ6IG1ldGhvZC5nZXRUYWdCeU5hbWUoInJldHVybiIpPy5nZXRWYWx1ZSgpID86ICcnLAorCQkJICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZURvY1VybDogZ2V0RG9jVXJsKHJldHVyblR5cGUpLAorCQkJICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyc1NpZ25hdHVyZTogZ2V0UGFyYW1ldGVyc0RlY2wobWV0aG9kKSwKKwkJCSAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnNEb2NVcmw6IGdldFBhcmFtZXRlcnNEb2NVcmwobWV0aG9kKSwKKwkJCSAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6IHBhcmFtZXRlcnMsCisJCQkgICAgICAgICAgICAgICAgICBpc1N0YXRpYzogbWV0aG9kLnBhcmVudENsYXNzLm5hbWUgPT0gJ0RlZmF1bHRHcm9vdnlTdGF0aWNNZXRob2RzJ10KKwkJCW1ldGhvZHMgPDwgbWV0aG9kSW5mbworCQl9CisKKwkJZGVmIGJpbmRpbmcgPSBbY2xhc3NOYW1lOiBhQ2xhc3MucmVwbGFjZUFsbCgvLipcLi8sICcnKSwKKwkJICAgICAgICAgICBwYWNrYWdlTmFtZTogY3VyUGFja2FnZSwKKwkJICAgICAgICAgICBtZXRob2RzOiBtZXRob2RzXQorCQlvdXQud2l0aFdyaXRlciB7CisJCQlpdCA8PCB0ZW1wbGF0ZS5tYWtlKGJpbmRpbmcpCisJCX0KKwl9CisKKwlwcml2YXRlIFN0cmluZyBnZXRQYXJhbWV0ZXJzRG9jVXJsKG1ldGhvZCkKKwl7CisJCWdldFBhcmFtZXRlcnMobWV0aG9kKS5jb2xsZWN0eyIke2dldERvY1VybChpdC50eXBlLnRvU3RyaW5nKCkpfSAke2l0LmdldE5hbWUoKX0iIH0uam9pbigiLCAiKQorCX0KKworCXByaXZhdGUgU3RyaW5nIGdldERvY1VybCh0eXBlKQorCXsKKwkJaWYgKCF0eXBlLmNvbnRhaW5zKCcuJykpCisJCQlyZXR1cm4gdHlwZQorCQkKKwkJZGVmIHNob3J0Q2xhc3NOYW1lID0gdHlwZS5yZXBsYWNlQWxsKCIuKlxcLiIsICIiKQorCQlkZWYgcGFja2FnZU5hbWUgPSB0eXBlWzAuLigtc2hvcnRDbGFzc05hbWUuc2l6ZSgpLTIpXSAKKwkJZGVmIGFwaUJhc2VVcmwsIHRpdGxlCisJCWlmICh0eXBlLnN0YXJ0c1dpdGgoImdyb292eSIpKSB7CisJCQlhcGlCYXNlVXJsID0gImh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnL2FwaS8iCisJCQl0aXRsZSA9ICJHcm9vdnkgY2xhc3MgaW4gJHBhY2thZ2VOYW1lIgorCQl9CisJCWVsc2UgeworCQkJYXBpQmFzZVVybCA9ICJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40LjIvZG9jcy9hcGkvIgorCQkJdGl0bGUgPSAiSkRLIGNsYXNzIGluICRwYWNrYWdlTmFtZSIKKwkJfQorCisJCWRlZiB1cmwgPSBhcGlCYXNlVXJsICsgdHlwZS5yZXBsYWNlQWxsKCJcXC4iLCAiLyIpICsgJy5odG1sJworCQlyZXR1cm4gIjxhIGhyZWY9JyR1cmwnIHRpdGxlPSckdGl0bGUnPiRzaG9ydENsYXNzTmFtZTwvYT4iCisJfQorCisgICAgcHJpdmF0ZSBnZW5lcmF0ZVBhY2thZ2VQYXRoKGN1clBhY2thZ2UpCisgICAgeworICAgICAgICBkZWYgZmlsZVNlcCA9IEZpbGUuc2VwYXJhdG9yCisgICAgICAgIC8vIG5lZWQgdG8gZXNjYXBlIHNlcGFyYXRvciBvbiB3aW5kb3dzIGZvciByZWdleCdzIHNha2UKKyAgICAgICAgaWYgKGZpbGVTZXAgPT0gJ1xcJykgZmlsZVNlcCAqPSAyCisgICAgICAgIHJldHVybiBjdXJQYWNrYWdlLnJlcGxhY2VBbGwoJ1xcLicsIGZpbGVTZXApCisgICAgfQorCisJcHJpdmF0ZSBnZW5lcmF0ZVBhY2thZ2VGcmFtZSh0ZW1wbGF0ZVBhY2thZ2VGcmFtZSwgY3VyUGFja2FnZSwgcGFja2FnZUNsYXNzZXMpCisJeworICAgICAgICBkZWYgcGFja2FnZVBhdGggPSBnZW5lcmF0ZVBhY2thZ2VQYXRoKGN1clBhY2thZ2UpCisgICAgICAgIGRlZiBkaXIgPSBuZXcgRmlsZShvdXRwdXRGb2xkZXIsIHBhY2thZ2VQYXRoKQorCQlkaXIubWtkaXJzKCkKKwkJZGVmIG91dCA9IG5ldyBGaWxlKGRpciwgJ3BhY2thZ2UtZnJhbWUuaHRtbCcpCisJCWRlZiBiaW5kaW5nID0gW2NsYXNzZXM6IHBhY2thZ2VDbGFzc2VzLnNvcnQoKS5jb2xsZWN0IHsgaXQucmVwbGFjZUFsbCgvLipcLi8sICcnKX0sCisJCSAgICAgICAgICAgcGFja2FnZU5hbWU6IGN1clBhY2thZ2VdCisJCW91dC53aXRoV3JpdGVyIHsKKwkJCWl0IDw8IHRlbXBsYXRlUGFja2FnZUZyYW1lLm1ha2UoYmluZGluZykKKwkJfQorCX0KKwkKKwlkZWYgY3JlYXRlVGVtcGxhdGUodGVtcGxhdGVFbmdpbmUsIHJlc291cmNlRmlsZSkKKwl7CisJCWRlZiByZXNvdXJjZVVybCA9IGdldENsYXNzKCkuZ2V0UmVzb3VyY2UocmVzb3VyY2VGaWxlKQorCQlyZXR1cm4gdGVtcGxhdGVFbmdpbmUuY3JlYXRlVGVtcGxhdGUocmVzb3VyY2VVcmwudGV4dCkKKwl9CisKKworCS8qKgorIAkqIFJldHJpZXZlcyBhIFN0cmluZyByZXByZXNlbnRpbmcgdGhlIHJldHVybiB0eXBlCisgCSovCisJcHJpdmF0ZSBnZXRSZXR1cm5UeXBlKG1ldGhvZCkKKwl7CisJICAgIGRlZiByZXR1cm5UeXBlID0gbWV0aG9kLmdldFJldHVybnMoKQorCSAgICAKKwkgICAgaWYgKHJldHVyblR5cGUgIT0gbnVsbCkgeworCSAgICAJICAgIHJldHVybiByZXR1cm5UeXBlLnRvU3RyaW5nKCkKKwkgICAgfSBlbHNlIHsKKwkgICAgCSAgICByZXR1cm4gIiIKKwkgICAgfQorCX0KKworCS8qKgorCSAqIFJldHJpZXZlIGEgU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIG1ldGhvZCBwYXNzZWQgYXMgcGFyYW1ldGVyLgorCSAqCisJICogQHBhcmFtIG1ldGhvZCBhIG1ldGhvZAorCSAqIEByZXR1cm4gdGhlIGRlY2xhcmF0aW9uIG9mIHRoZSBtZXRob2QgKGxvbmcgdmVyc2lvbikKKwkgKi8KKwlwcml2YXRlIGdldFBhcmFtZXRlcnNEZWNsKG1ldGhvZCkKKwl7CisJCWdldFBhcmFtZXRlcnMobWV0aG9kKS5jb2xsZWN0eyAiJHtpdC5nZXRUeXBlKCl9ICR7aXQuZ2V0TmFtZSgpfSIgfS5qb2luKCIsICIpCisJfQorCisJLyoqCisJICogUmV0cmlldmUgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIG1ldGhvZC4KKwkgKgorCSAqIEBwYXJhbSBtZXRob2QgYSBtZXRob2QKKwkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwYXJhbWV0ZXJzIHdpdGhvdXQgdGhlIGZpcnN0IG9uZQorCSAqLworCXByaXZhdGUgZ2V0UGFyYW1ldGVycyhtZXRob2QpCisJeworCSAgICBpZiAobWV0aG9kLmdldFBhcmFtZXRlcnMoKS5zaXplKCkgPiAxKQorCQkgICAgcmV0dXJuIG1ldGhvZC5nZXRQYXJhbWV0ZXJzKCkudG9MaXN0KClbMS4uLTFdCisJCWVsc2UKKwkJICAgIHJldHVybiBbXQorCX0KKworCS8qKgorCSAqIFJldHJpZXZlIHRoZSBKYXZhRG9jIGNvbW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZXRob2QgcGFzc2VkIGFzIHBhcmFtZXRlci4KKwkgKgorCSAqIEBwYXJhbSBtZXRob2QgYSBtZXRob2QKKwkgKiBAcmV0dXJuIHRoZSBKYXZhRG9jIGNvbW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbWV0aG9kCisJICovCisJcHJpdmF0ZSBnZXRDb21tZW50KG1ldGhvZCkKKwl7CisJCWRlZiBhbnMgPSBtZXRob2QuZ2V0Q29tbWVudCgpCisJCWlmIChhbnMgPT0gbnVsbCkgcmV0dXJuICIiCisJCXJldHVybiBhbnMKKwl9CisKKyAgICAvKioKKyAgICAgKiBNYWluIGVudHJ5IHBvaW50LgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIG1haW4oYXJncykKKyAgICB7CisgICAgICAgIGRlZiBkZWZhdWx0R3Jvb3Z5TWV0aG9kU291cmNlID0gbmV3IEZpbGUoInNyYy9tYWluL29yZy9jb2RlaGF1cy9ncm9vdnkvcnVudGltZS9EZWZhdWx0R3Jvb3Z5TWV0aG9kcy5qYXZhIikKKyAgICAgICAgZGVmIGRlZmF1bHRHcm9vdnlTdGF0aWNNZXRob2RTb3VyY2UgPSBuZXcgRmlsZSgic3JjL21haW4vb3JnL2NvZGVoYXVzL2dyb292eS9ydW50aW1lL0RlZmF1bHRHcm9vdnlTdGF0aWNNZXRob2RzLmphdmEiKQorICAgICAgICBkZWYgb3V0Rm9sZGVyID0gbmV3IEZpbGUoInRhcmdldC9odG1sL2dyb292eS1qZGsiKQorICAgICAgICBvdXRGb2xkZXIubWtkaXJzKCkKKworICAgICAgICBkZWYgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworICAgICAgICBkZWYgZG9jR2VuID0gbmV3IERvY0dlbmVyYXRvcihbZGVmYXVsdEdyb292eU1ldGhvZFNvdXJjZSwgZGVmYXVsdEdyb292eVN0YXRpY01ldGhvZFNvdXJjZV0sIG91dEZvbGRlcikKKyAgICAgICAgZG9jR2VuLmdlbmVyYXRlTmV3KCkKKworICAgICAgICBkZWYgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKyAgICAgICAgcHJpbnRsbiAiRG9uZS4gaW4gJHtlbmQgLSBzdGFydH0gbWlsbGlzIgorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90b29scy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2dyb292eS5pY28gYi9ncm9vdnkvc3JjL3Rvb2xzL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvZ3Jvb3Z5LmljbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTliOGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90b29scy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2dyb292eS5pY28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90b29scy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2luZGV4Lmh0bWwgYi9ncm9vdnkvc3JjL3Rvb2xzL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvaW5kZXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWRkNDYzCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90b29scy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL2luZGV4Lmh0bWwKQEAgLTAsMCArMSwzOSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgRnJhbWVzZXQvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvZnJhbWVzZXQuZHRkIj4KKzwhLS1OZXdQYWdlLS0+Cis8SFRNTD4KKzxIRUFEPgorPFRJVExFPgorR3Jvb3Z5IEpESworPC9USVRMRT4KKzxsaW5rIGhyZWY9Imdyb292eS5pY28iIHR5cGU9ImltYWdlL3gtaWNvbiIgcmVsPSJzaG9ydGN1dCBpY29uIj4KKzxsaW5rIGhyZWY9Imdyb292eS5pY28iIHR5cGU9ImltYWdlL3gtaWNvbiIgcmVsPSJpY29uIj4KKworPFNDUklQVCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgordGFyZ2V0UGFnZSA9ICIiICsgd2luZG93LmxvY2F0aW9uLnNlYXJjaDsKK2lmICh0YXJnZXRQYWdlICE9ICIiICYmIHRhcmdldFBhZ2UgIT0gInVuZGVmaW5lZCIpCisgICB0YXJnZXRQYWdlID0gdGFyZ2V0UGFnZS5zdWJzdHJpbmcoMSk7CisKK2Z1bmN0aW9uIGxvYWRGcmFtZXMoKSAKK3sKKyAgICBpZiAodGFyZ2V0UGFnZSAhPSAiIiAmJiB0YXJnZXRQYWdlICE9ICJ1bmRlZmluZWQiKQorICAgICAgICAgdG9wLmNsYXNzRnJhbWUubG9jYXRpb24gPSB0b3AudGFyZ2V0UGFnZTsKK30KKzwvU0NSSVBUPgorPC9IRUFEPgorPEZSQU1FU0VUIGNvbHM9IjIwJSw4MCUiIHRpdGxlPSIiIG9uTG9hZD0idG9wLmxvYWRGcmFtZXMoKSI+Cis8RlJBTUVTRVQgcm93cz0iMzAlLDcwJSIgdGl0bGU9IiIgb25Mb2FkPSJ0b3AubG9hZEZyYW1lcygpIj4KKwk8RlJBTUUgc3JjPSJvdmVydmlldy1mcmFtZS5odG1sIiBuYW1lPSJwYWNrYWdlTGlzdEZyYW1lIiB0aXRsZT0iQWxsIFBhY2thZ2VzIj4KKwk8RlJBTUUgc3JjPSJhbGxjbGFzc2VzLWZyYW1lLmh0bWwiIG5hbWU9InBhY2thZ2VGcmFtZSIgdGl0bGU9IkFsbCBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzIChleGNlcHQgbm9uLXN0YXRpYyBuZXN0ZWQgdHlwZXMpIj4KKzwvRlJBTUVTRVQ+CisKKzxGUkFNRSBzcmM9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCIgbmFtZT0iY2xhc3NGcmFtZSIgdGl0bGU9IlBhY2thZ2UsIGNsYXNzIGFuZCBpbnRlcmZhY2UgZGVzY3JpcHRpb25zIiBzY3JvbGxpbmc9InllcyI+Cis8Tk9GUkFNRVM+Cis8SDI+CitGcmFtZSBBbGVydDwvSDI+Cis8UD4KK1RoaXMgZG9jdW1lbnQgaXMgZGVzaWduZWQgdG8gYmUgdmlld2VkIHVzaW5nIHRoZSBmcmFtZXMgZmVhdHVyZS4gSWYgeW91IHNlZSB0aGlzIG1lc3NhZ2UsIHlvdSBhcmUgdXNpbmcgYSBub24tZnJhbWUtY2FwYWJsZSB3ZWIgY2xpZW50LgorPEJSPgorTGluayB0bzxBIEhSRUY9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+Tm9uLWZyYW1lIHZlcnNpb24uPC9BPgorPC9OT0ZSQU1FUz4KKzwvRlJBTUVTRVQ+Cis8L0hUTUw+CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rvb2xzL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvb3ZlcnZpZXctc3VtbWFyeS5odG1sIGIvZ3Jvb3Z5L3NyYy90b29scy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL292ZXJ2aWV3LXN1bW1hcnkuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYThiOTBhCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90b29scy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL292ZXJ2aWV3LXN1bW1hcnkuaHRtbApAQCAtMCwwICsxLDI3IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iImh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAvbG9vc2UuZHRkIj4KKzxIVE1MPgorPEhFQUQ+Cis8VElUTEU+CitPdmVydmlldyAoR3Jvb3Z5IEpESykKKzwvVElUTEU+Cis8TElOSyBSRUwgPSJzdHlsZXNoZWV0IiBUWVBFPSJ0ZXh0L2NzcyIgSFJFRj0ic3R5bGVzaGVldC5jc3MiIFRJVExFPSJTdHlsZSI+Cis8L0hFQUQ+Cis8U0NSSVBUPgorZnVuY3Rpb24gYXNkKCkKK3sKK3BhcmVudC5kb2N1bWVudC50aXRsZSA9IGRvY3VtZW50LnRpdGxlOworfQorPC9TQ1JJUFQ+Cis8Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJhc2QoKTsiPgorCisKKzxIUj4KKzxDRU5URVI+Cis8SDI+CitHcm9vdnkgSkRLPGJyPkFQSSBTcGVjaWZpY2F0aW9uPC9IMj4KKzwvQ0VOVEVSPgorPGJvZHk+CitUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgbWV0aG9kcyBhZGRlZCB0byB0aGUgSkRLIHRvIG1ha2UgaXQgbW9yZSBncm9vdnkuCisKKzwvQk9EWT4KKzwvSFRNTD4KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdG9vbHMvb3JnL2NvZGVoYXVzL2dyb292eS90b29scy90ZW1wbGF0ZS5hbGxjbGFzc2VzLWZyYW1lLmh0bWwgYi9ncm9vdnkvc3JjL3Rvb2xzL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvdGVtcGxhdGUuYWxsY2xhc3Nlcy1mcmFtZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5OGM4ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rvb2xzL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvdGVtcGxhdGUuYWxsY2xhc3Nlcy1mcmFtZS5odG1sCkBAIC0wLDAgKzEsMzUgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgorPCEtLU5ld1BhZ2UtLT4KKzxIVE1MPgorPEhFQUQ+Cis8VElUTEU+CitBbGwgQ2xhc3NlcyAoR3Jvb3Z5IEdESykKKzwvVElUTEU+CisKKworPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9InN0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgorCisKKzwvSEVBRD4KKworPEJPRFkgQkdDT0xPUj0id2hpdGUiPgorPEZPTlQgc2l6ZT0iKzEiIENMQVNTPSJGcmFtZUhlYWRpbmdGb250Ij4KKzxCPkFsbCBDbGFzc2VzPC9CPjwvRk9OVD4KKworPEJSPgorCis8VEFCTEUgQk9SREVSPSIwIiBXSURUSD0iMTAwJSIgU1VNTUFSWT0iIj4KKzxUUj4KKzxURCBOT1dSQVA+CisKKzxGT05UIENMQVNTPSJGcmFtZUl0ZW1Gb250Ij4KKzwlIGNsYXNzZXMuZWFjaCB7ICU+Cis8QSBIUkVGPSIke2l0LnJlcGxhY2VBbGwoJ1xcLicsICcvJyl9Lmh0bWwiIHRhcmdldD0iY2xhc3NGcmFtZSI+JHtpdC5yZXBsYWNlQWxsKCcuKlxcLicsICcnKX08L0E+Cis8QlI+Cis8JSB9ICU+Cis8L0ZPTlQ+PC9URD4KKzwvVFI+Cis8L1RBQkxFPgorCis8L0JPRFk+Cis8L0hUTUw+CmRpZmYgLS1naXQgYS9ncm9vdnkvc3JjL3Rvb2xzL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvdGVtcGxhdGUuY2xhc3MuaHRtbCBiL2dyb292eS9zcmMvdG9vbHMvb3JnL2NvZGVoYXVzL2dyb292eS90b29scy90ZW1wbGF0ZS5jbGFzcy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmOWQ1ODQKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rvb2xzL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvdGVtcGxhdGUuY2xhc3MuaHRtbApAQCAtMCwwICsxLDkwIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KKworPEhUTUw+Cis8SEVBRD4KKzxUSVRMRT4ke2NsYXNzTmFtZX0gKEdyb292eSBKREspPC9USVRMRT4KKworPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgorCis8U0NSSVBUIHR5cGU9InRleHQvamF2YXNjcmlwdCI+CitmdW5jdGlvbiB3aW5kb3dUaXRsZSgpCit7CisgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlID0gZG9jdW1lbnQudGl0bGU7Cit9Cis8L1NDUklQVD4KKworPC9IRUFEPgorCis8Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgb25sb2FkPSJ3aW5kb3dUaXRsZSgpOyI+CisKKworPCEtLSA9PT09PT09PSBTVEFSVCBPRiBDTEFTUyBEQVRBID09PT09PT09IC0tPgorPEgyPgorPEZPTlQgU0laRT0iLTEiPgorJHtwYWNrYWdlTmFtZX08L0ZPTlQ+Cis8QlI+CitDbGFzcyAke2NsYXNzTmFtZX08L0gyPgorCis8IS0tID09PT09PT09PT0gTUVUSE9EIFNVTU1BUlkgPT09PT09PT09PT0gLS0+CisKKzxBIE5BTUU9Im1ldGhvZF9zdW1tYXJ5Ij48IS0tIC0tPjwvQT4KKzxUQUJMRSBCT1JERVI9IjEiIFdJRFRIPSIxMDAlIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFNVTU1BUlk9IiI+Cis8VFIgQkdDT0xPUj0iI0NDQ0NGRiIgQ0xBU1M9IlRhYmxlSGVhZGluZ0NvbG9yIj4KKzxUSCBBTElHTj0ibGVmdCIgQ09MU1BBTj0iMiI+PEZPTlQgU0laRT0iKzIiPgorPEI+TWV0aG9kIFN1bW1hcnk8L0I+PC9GT05UPjwvVEg+Cis8L1RSPgorCis8JSBtZXRob2RzLmVhY2ggeyBtZXRob2QgLT4gJT4KKzxUUiBCR0NPTE9SPSJ3aGl0ZSIgQ0xBU1M9IlRhYmxlUm93Q29sb3IiPgorPFREIEFMSUdOPSJyaWdodCIgVkFMSUdOPSJ0b3AiIFdJRFRIPSIxJSI+CisKKzxGT05UIFNJWkU9Ii0xIj4KKzxDT0RFPiR7bWV0aG9kLmlzU3RhdGljID8gJ3N0YXRpYyAnIDogJyd9JHttZXRob2QucmV0dXJuVHlwZURvY1VybH08L0NPREU+PC9GT05UPgorPC9URD4KKzxURD48Q09ERT48Qj48QSBIUkVGPSIjJHttZXRob2QubmFtZX0oJHttZXRob2QucGFyYW1ldGVyc1NpZ25hdHVyZX0pIj4ke21ldGhvZC5uYW1lfTwvQT48L0I+KCR7bWV0aG9kLnBhcmFtZXRlcnNEb2NVcmx9KTwvQ09ERT4KKzxCUj4KKyR7bWV0aG9kLnNob3J0Q29tbWVudH0KKzwvVEQ+Cis8L1RSPgorPCUgfSAlPgorPC9UQUJMRT4KKyZuYnNwOworCisKKzwhLS0gPT09PT09PT09PT09IE1FVEhPRCBERVRBSUwgPT09PT09PT09PSAtLT4KKworPEEgTkFNRT0ibWV0aG9kX2RldGFpbCI+PCEtLSAtLT48L0E+Cis8VEFCTEUgQk9SREVSPSIxIiBXSURUSD0iMTAwJSIgQ0VMTFBBRERJTkc9IjMiIENFTExTUEFDSU5HPSIwIiBTVU1NQVJZPSIiPgorPFRSIEJHQ09MT1I9IiNDQ0NDRkYiIENMQVNTPSJUYWJsZUhlYWRpbmdDb2xvciI+Cis8VEggQUxJR049ImxlZnQiIENPTFNQQU49IjEiPjxGT05UIFNJWkU9IisyIj4KKzxCPk1ldGhvZCBEZXRhaWw8L0I+PC9GT05UPjwvVEg+Cis8L1RSPgorPC9UQUJMRT4KKworPCUgbWV0aG9kcy5lYWNoIHsgbWV0aG9kIC0+ICU+CisKKzxBIG5hbWU9IiR7bWV0aG9kLm5hbWV9KCR7bWV0aG9kLnBhcmFtZXRlcnNTaWduYXR1cmV9KSI+PCEtLSAtLT48L0E+PEgzPiR7bWV0aG9kLm5hbWV9PC9IMz4KKzxQUkU+cHVibGljICR7bWV0aG9kLmlzU3RhdGljID8gJ3N0YXRpYyAnIDogJyd9JHttZXRob2QucmV0dXJuVHlwZURvY1VybH0gPEI+JHttZXRob2QubmFtZX08L0I+KCR7bWV0aG9kLnBhcmFtZXRlcnNEb2NVcmx9KTwvUFJFPgorPERMPgorPEREPiR7bWV0aG9kLmNvbW1lbnR9Cis8UD4KKzxERD48REw+PC9kbD48L0REPgorCis8JSBpZiAobWV0aG9kLnBhcmFtZXRlcnNTaWduYXR1cmUpIHsgJT4KKzxEVD48Qj5QYXJhbWV0ZXJzOjwvQj4KKwk8JSBtZXRob2QucGFyYW1ldGVycy5lYWNoIHsgcGFyYW0gLT4gJT4KKwkJPEREPjxDT0RFPiR7cGFyYW0ubmFtZX08L0NPREU+IC0gJHtwYXJhbS5jb21tZW50fS4KKzwlIH0gfSAlPgorCis8JSBpZiAobWV0aG9kLnJldHVybkNvbW1lbnQpIHsgJT4KKzxEVD48Qj5SZXR1cm5zOjwvQj48REQ+JHttZXRob2QucmV0dXJuQ29tbWVudH08L0RMPgorPCUgfSAlPgorPC9ERD4KKzwvREw+Cis8SFI+Cis8JSB9ICU+Cis8IS0tID09PT09PT09PSBFTkQgT0YgQ0xBU1MgREFUQSA9PT09PT09PT0gLS0+CisKKworPC9CT0RZPgorPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy90b29scy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3RlbXBsYXRlLm92ZXJ2aWV3LWZyYW1lLmh0bWwgYi9ncm9vdnkvc3JjL3Rvb2xzL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvdGVtcGxhdGUub3ZlcnZpZXctZnJhbWUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDdhOGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3NyYy90b29scy9vcmcvY29kZWhhdXMvZ3Jvb3Z5L3Rvb2xzL3RlbXBsYXRlLm92ZXJ2aWV3LWZyYW1lLmh0bWwKQEAgLTAsMCArMSwzOSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+CisKKzxodG1sPgorPGhlYWQ+Cis8dGl0bGU+CitPdmVydmlldyAoR3Jvb3Z5IEpESykKKzwvdGl0bGU+CisKKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9InN0eWxlc2hlZXQuY3NzIiB0aXRsZT0iU3R5bGUiPgorPC9oZWFkPgorCis8Ym9keT4KKworPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiPgorPHRyPgorPHRoIGFsaWduPSJsZWZ0IiBub3dyYXA+R3Jvb3Z5IEpESzwvdGg+Cis8L3RyPgorPC90YWJsZT4KKworPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiPgorPFRSPgorPFREIE5PV1JBUD48Rk9OVCBDTEFTUz0iRnJhbWVJdGVtRm9udCI+PEEgSFJFRj0iYWxsY2xhc3Nlcy1mcmFtZS5odG1sIiB0YXJnZXQ9InBhY2thZ2VGcmFtZSI+QWxsIENsYXNzZXM8L0E+PC9GT05UPgorCis8UD4KKzxGT05UIHNpemU9IisxIiBDTEFTUz0iRnJhbWVIZWFkaW5nRm9udCI+UGFja2FnZXM8L0ZPTlQ+PEJSPgorCis8Rk9OVCBDTEFTUz0iRnJhbWVJdGVtRm9udCI+PGEgaHJlZj0icHJpbWl0aXZlLXR5cGVzL3BhY2thZ2UtZnJhbWUuaHRtbCIgdGFyZ2V0PSJwYWNrYWdlRnJhbWUiPlByaW1pdGl2ZSB0eXBlczwvQT48L0ZPTlQ+Cis8JSBwYWNrYWdlcy5lYWNoIHsgJT4KKzxGT05UIENMQVNTPSJGcmFtZUl0ZW1Gb250Ij48YSBocmVmPSIke2l0LnJlcGxhY2VBbGwoJ1xcLicsICcvJyl9L3BhY2thZ2UtZnJhbWUuaHRtbCIgdGFyZ2V0PSJwYWNrYWdlRnJhbWUiPiR7aXR9PC9BPjwvRk9OVD4KKzxCUj4KKzwlIH0gJT4KKzwvVEQ+Cis8L1RSPgorPC9UQUJMRT4KKworPFA+CismbmJzcDsKKzwvQk9EWT4KKzwvSFRNTD4KZGlmZiAtLWdpdCBhL2dyb292eS9zcmMvdG9vbHMvb3JnL2NvZGVoYXVzL2dyb292eS90b29scy90ZW1wbGF0ZS5wYWNrYWdlLWZyYW1lLmh0bWwgYi9ncm9vdnkvc3JjL3Rvb2xzL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvdGVtcGxhdGUucGFja2FnZS1mcmFtZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmYzU3ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9ncm9vdnkvc3JjL3Rvb2xzL29yZy9jb2RlaGF1cy9ncm9vdnkvdG9vbHMvdGVtcGxhdGUucGFja2FnZS1mcmFtZS5odG1sCkBAIC0wLDAgKzEsMzYgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgorPCEtLU5ld1BhZ2UtLT4KKzxIVE1MPgorPEhFQUQ+Cis8IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jIChidWlsZCAxLjUuMC1yYykgb24gV2VkIEF1ZyAxMSAwNzoyODoxMCBQRFQgMjAwNCAtLT4KKzxUSVRMRT4KKyR7cGFja2FnZU5hbWV9IChKYXZhIDIgUGxhdGZvcm0gU0UgNS4wKQorPC9USVRMRT4KKworPE1FVEEgTkFNRT0ia2V5d29yZHMiIENPTlRFTlQ9IiR7cGFja2FnZU5hbWV9Ij4KKworPExJTksgUkVMID0ic3R5bGVzaGVldCIgVFlQRT0idGV4dC9jc3MiIEhSRUY9Ii4uLy4uL3N0eWxlc2hlZXQuY3NzIiBUSVRMRT0iU3R5bGUiPgorCisKKzwvSEVBRD4KKworPEJPRFkgQkdDT0xPUj0id2hpdGUiPgorPEZPTlQgc2l6ZT0iKzEiIENMQVNTPSJGcmFtZVRpdGxlRm9udCI+JHtwYWNrYWdlTmFtZX08L0ZPTlQ+CisKKworPFRBQkxFIEJPUkRFUj0iMCIgV0lEVEg9IjEwMCUiIFNVTU1BUlk9IiI+Cis8VFI+Cis8VEQgTk9XUkFQPgorPEZPTlQgc2l6ZT0iKzEiIENMQVNTPSJGcmFtZUhlYWRpbmdGb250Ij5DbGFzc2VzPC9GT05UPiZuYnNwOworPEZPTlQgQ0xBU1M9IkZyYW1lSXRlbUZvbnQiPgorPCUgY2xhc3Nlcy5lYWNoIHsgJT4KKzxCUj4KKzxBIGhyZWY9IiR7aXR9Lmh0bWwiIHRpdGxlPSJjbGFzcyBpbiAke3BhY2thZ2VOYW1lfSIgdGFyZ2V0PSJjbGFzc0ZyYW1lIj4ke2l0fTwvQT4KKzwlIH0gJT4KKzwvRk9OVD48L1REPgorPC9UUj4KKzwvVEFCTEU+CisKKworPC9CT0RZPgorPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3NyYy93aWtpLXNuYXBzaG90LnBkZiBiL2dyb292eS9zcmMvd2lraS1zbmFwc2hvdC5wZGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk0ZjI5YgotLS0gL2Rldi9udWxsCisrKyBiL2dyb292eS9zcmMvd2lraS1zbmFwc2hvdC5wZGYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ3Jvb3Z5L3hkb2NzL2ltYWdlcy9ncm9vdnktbG9nby5wbmcgYi9ncm9vdnkveGRvY3MvaW1hZ2VzL2dyb292eS1sb2dvLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGFmNGMxCi0tLSAvZGV2L251bGwKKysrIGIvZ3Jvb3Z5L3hkb2NzL2ltYWdlcy9ncm9vdnktbG9nby5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgo=