Transaction executed successfully
Transaction Details
Inspect execution, participants, message data, gas usage, events and raw transaction data.
Transaction hash
09ED05674D7CAC77C7D97773EEB7EC59EC4D27C490D605E290152EDE5BE81844
Transaction overview
Execution summary
TX INDEX
0
Position in block
GAS WANTED
80,000,000
Requested gas limit
GAS USED
32,216,981
Gas consumed
FEE
80000ugnot
Transaction fee
Participants
Message
Message #1
m_addpkg
Arguments
g136j0m08pkm2lwwde9dmlx8uee26llent9s5cpf12000000ugnot
Execution log
msg:0,success:true,log:,events:[]
Events
No events emitted by this transaction.
Raw encoded transaction
CuahAQoML3ZtLm1fYWRkcGtnEtShAQooZzEzNmowbTA4cGttMmx3d2RlOWRtbHg4dWVlMjZsbGVudDlzNWNwZhKXoQEKBmNvbmZpZxImZ25vLmxhbmQvci9zYW1jcmV3L2xhdW5jaHBhZC9jb25maWcvdjEalZgBCgpjb25maWcuZ25vEoWYAS8vIFBhY2thZ2UgY29uZmlnIGlzIHRoZSB2ZXJzaW9uZWQsIGdvdmVybmVkIGNvbmZpZ3VyYXRpb24gZm9yIE1lbWJhIExhdW5jaHBhZC4KLy8gSXRzIGFkbWluIGlzIHRoZSBhY2NvdW50IHRoYXQgcHVibGlzaGVkIGl0IHVudGlsIGEgdHdvLXN0ZXAgaGFuZG9mZiBtb3ZlcwovLyB0aGUgcm9sZS4gRXZlcnkgbGFuZSBzdGFydHMgcGF1c2VkIGFuZCB3aXRob3V0IHRlcm1zLgpwYWNrYWdlIGNvbmZpZwoKaW1wb3J0ICgKCSJzdHJjb252IgoJInN0cmluZ3MiCgoJImNoYWluIgoJImNoYWluL3J1bnRpbWUvdW5zYWZlIgoJImduby5sYW5kL3Avc2FtY3Jldy9sYXVuY2hwYWQvbWV0YS92MSIKCXNtICJnbm8ubGFuZC9wL3NhbWNyZXcvbGF1bmNocGFkL3NhZmVtYXRoL3YxIgoJImduby5sYW5kL3IvbnQvZ3JjMjByZWcvdjAiCikKCmNvbnN0ICgKCUxhbmVEaXJlY3QgICAgID0gImRpcmVjdCIKCUxhbmVGYWlyU2FsZSAgID0gImZhaXJzYWxlIgoJTGFuZUFpcmRyb3AgICAgPSAiYWlyZHJvcCIKCUxhbmVDb2xsZWN0aW9uID0gImNvbGxlY3Rpb24iCglMYW5lTkZURHJvcHMgICA9ICJuZnRfZHJvcHMiCglMYW5lTkZUTWFya2V0ICA9ICJuZnRfbWFya2V0IgoJTmF0aXZlQ3VycmVuY3kgPSAidWdub3QiCglMZWRnZXJUb2tlbnMgICA9ICJ0b2tlbnMiCglMZWRnZXJORlQgICAgICA9ICJuZnQiCgltYXhDdXJyZW5jaWVzICA9IDE2CgltYXhJc3N1ZXJzICAgICA9IDMyCglpc3N1ZXJQcmVmaXggICA9ICJnbm8ubGFuZC9yL3NhbWNyZXcvIgoJbWF4Q3JlYXRpb25GZWUgPSBzbS5NYXhJbnQ2NCAvIDEyCikKCi8vIEN1cnJlbmN5UGFyYW1zIGhvbGRzIHRoZSB0ZXJtcyBvZiBvbmUgcXVvdGUgY3VycmVuY3kuIEEgZmVlIG9mIC0xIGNsb3NlcwovLyB0aGUgbGFuZSB0aGF0IGNoYXJnZXMgaXQuCnR5cGUgQ3VycmVuY3lQYXJhbXMgc3RydWN0IHsKCUtleSAgICAgICAgICAgICAgICAgc3RyaW5nCglEaXJlY3RDcmVhdGlvbkZlZSAgIGludDY0CglGYWlyU2FsZUNyZWF0aW9uRmVlIGludDY0IC8vIG5ldmVyIGJlbG93IERpcmVjdENyZWF0aW9uRmVlOiBjYW5jZWxsaW5nIGEgc2FsZSByZXR1cm5zIGl0cyBhbGxvY2F0aW9uCglGYWlyU2FsZVJhaXNlQ2FwICAgIGludDY0IC8vIG1vc3QgcXVvdGUgb25lIGZhaXIgc2FsZSBtYXkgaG9sZCBpbiBlc2Nyb3c7IDAgY2xvc2VzIGZhaXIgc2FsZXMKCUNvbGxlY3Rpb25GZWUgICAgICAgaW50NjQKfQoKLy8gUGFyYW1zIGlzIG9uZSBpbW11dGFibGUgc25hcHNob3Qgb2YgbGF1bmNoIHRlcm1zLiBBIHJhdGUgb2YgLTEgY2xvc2VzIHRoZQovLyBsYW5lIHRoYXQgY2hhcmdlcyBpdC4KdHlwZSBQYXJhbXMgc3RydWN0IHsKCVByaW1hcnlGZWVCUFMgICAgICBpbnQ2NCAvLyBzaGFyZSBvZiBzZXR0bGVkIGZhaXItc2FsZSBwcm9jZWVkcwoJTkZUUHJpbWFyeUZlZUJQUyAgIGludDY0CglORlRTZWNvbmRhcnlGZWVCUFMgaW50NjQKCVRyZWFzdXJ5ICAgICAgICAgICBhZGRyZXNzCglDdXJyZW5jaWVzICAgICAgICAgW11DdXJyZW5jeVBhcmFtcwp9Cgp2YXIgKAoJbGFuZXMgPSBbXXN0cmluZ3tMYW5lRGlyZWN0LCBMYW5lRmFpclNhbGUsIExhbmVBaXJkcm9wLCBMYW5lQ29sbGVjdGlvbiwgTGFuZU5GVERyb3BzLCBMYW5lTkZUTWFya2V0fQoJLy8gTm8gZnVuY3Rpb24gb2YgdGhlc2UgcmVhbG1zIGNhbiBwYXkgb3V0IGEgYmFsYW5jZSBzZW50IHRvIHRoZWlyIGFkZHJlc3MuCgl1bnNwZW5kYWJsZSA9IFtdc3RyaW5newoJCSJnbm8ubGFuZC9yL3NhbWNyZXcvbGF1bmNocGFkL2NvbmZpZy92MSIsCgkJImduby5sYW5kL3Ivc2FtY3Jldy9sYXVuY2hwYWQvdG9rZW5zL3YxIiwKCQkiZ25vLmxhbmQvci9zYW1jcmV3L2xhdW5jaHBhZC9zYWxlcy92MSIsCgkJImduby5sYW5kL3Ivc2FtY3Jldy9sYXVuY2hwYWQvbmZ0L3YxIiwKCQkiZ25vLmxhbmQvci9zYW1jcmV3L2xhdW5jaHBhZC9kcm9wcy92MSIsCgkJImduby5sYW5kL3Ivc2FtY3Jldy9sYXVuY2hwYWQvbWFya2V0L3YxIiwKCQkiZ25vLmxhbmQvci9zYW1jcmV3L2xhdW5jaHBhZC9jdXJhdGlvbi92MSIsCgkJImduby5sYW5kL3Ivc2FtY3Jldy9tZW1iYV9kYW8iLAoJCS8vIFRoZSBnb3Zlcm5hbmNlIGNvcmUgYW5kIGl0cyBicmlkZ2UgdG8gdGhlIGxlZ2FjeSBhcHBzIGhvbGQgbm8KCQkvLyB0cmVhc3VyeSBhbmQgbm8gZ2VuZXJpYyBjYWxsOiBub3RoaW5nIHRoZXJlIGNvdWxkIHBheSBhIGZlZSBvdXQuCgkJImduby5sYW5kL3Ivc2FtY3Jldy9tZW1iYV9nb3YiLAoJCSJnbm8ubGFuZC9yL3NhbWNyZXcvbWVtYmFfYnJpZGdlX3YxIiwKCX0KCglhZG1pbiAgICAgICAgYWRkcmVzcwoJcGVuZGluZ0FkbWluIGFkZHJlc3MKCXBhdXNlciAgICAgICBhZGRyZXNzCglpc3N1ZXJzICAgICAgPSBtYXBbc3RyaW5nXWJvb2x7fSAvLyAiPGxlZGdlcj46PHJlYWxtIGFkZHJlc3M+IgoJdmVyc2lvbnMgICAgIFtdUGFyYW1zCglhbGxvd2VkICAgICAgPSBtYXBbc3RyaW5nXWJvb2x7fQoJcGF1c2VkICAgICAgID0gbWFwW3N0cmluZ11ib29se30KCXZlcmlmaWVkICAgICA9IG1hcFtzdHJpbmddYm9vbHt9CglyZXNlcnZlZCAgICAgPSBtYXBbc3RyaW5nXWJvb2x7fQoJb3dlZENlaWxpbmdzID0gbWFwW3N0cmluZ11pbnQ2NHt9IC8vIGFic2VudDogbm8gY2VpbGluZwopCgpmdW5jIGluaXQoKSB7CglhZG1pbiA9IHVuc2FmZS5PcmlnaW5DYWxsZXIoKQoJdmVyc2lvbnMgPSBbXVBhcmFtc3t7UHJpbWFyeUZlZUJQUzogLTEsIE5GVFByaW1hcnlGZWVCUFM6IC0xLCBORlRTZWNvbmRhcnlGZWVCUFM6IC0xfX0KCWZvciBfLCBsYW5lIDo9IHJhbmdlIGxhbmVzIHsKCQlwYXVzZWRbbGFuZV0gPSB0cnVlCgl9Cglmb3IgXywgdGlja2VyIDo9IHJhbmdlIFtdc3RyaW5neyJNRU1CQSIsICJHTk9UIiwgIlVHTk9UIiwgIldVR05PVCIsICJHTlMiLCAiVVNEQyIsICJVU0RUIiwgIkFUT00iLCAiQlRDIiwgIkVUSCIsICJTQU1DUkVXIn0gewoJCXJlc2VydmVkW3RpY2tlcl0gPSB0cnVlCgl9Cn0KCi8vIGNhbGxlciBpcyB0aGUgaW1tZWRpYXRlIHVzZXIgb3IgcmVhbG0uIENvaW5zIGF0dGFjaGVkIHRvIGEgZGlyZWN0IGNhbGwKLy8gd291bGQgbGFuZCBpbiB0aGlzIHJlYWxtLCB3aGljaCBoYXMgbm8gd2F5IHRvIHJldHVybiB0aGVtLgpmdW5jIGNhbGxlcihjdXIgcmVhbG0pIGFkZHJlc3MgewoJLy8gVGhlIHBpbm5lZCBWTSBhbHJlYWR5IHJlZnVzZXMgYSByZWFsbSBjb250ZXh0IHRoYXQgaXMgbm90IHRoZSBsaXZlIG9uZQoJLy8gYmVmb3JlIHRoaXMgbGluZSBydW5zLiBQdWJsaXNoZWQgY29kZSBvdXRsaXZlcyBhIFZNIHJlbGVhc2UsIHNvIHRoZQoJLy8gY2hlY2sgc3RheXMuCglpZiAhY3VyLklzQ3VycmVudCgpIHsKCQlwYW5pYygibGF1bmNocGFkL2NvbmZpZzogc3RhbGUgcmVhbG0gY29udGV4dCIpCgl9CglpZiBjdXIuUHJldmlvdXMoKS5Jc1VzZXJDYWxsKCkgJiYgbGVuKHVuc2FmZS5PcmlnaW5TZW5kKCkpICE9IDAgewoJCXBhbmljKCJsYXVuY2hwYWQvY29uZmlnOiB0aGlzIGNhbGwgZG9lcyBub3QgYWNjZXB0IGNvaW5zIikKCX0KCXJldHVybiBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKfQoKZnVuYyByZXF1aXJlQWRtaW4oY3VyIHJlYWxtKSB7CglpZiBjYWxsZXIoY3VyKSAhPSBhZG1pbiB7CgkJcGFuaWMoImxhdW5jaHBhZC9jb25maWc6IGFkbWluIG9ubHkiKQoJfQp9CgpmdW5jIHVuc3BlbmRhYmxlUmVhbG0od2hvIGFkZHJlc3MpIGJvb2wgewoJZm9yIF8sIHBhdGggOj0gcmFuZ2UgdW5zcGVuZGFibGUgewoJCWlmIHdobyA9PSBjaGFpbi5QYWNrYWdlQWRkcmVzcyhwYXRoKSB7CgkJCXJldHVybiB0cnVlCgkJfQoJfQoJcmV0dXJuIGZhbHNlCn0KCi8vIElzVW5zcGVuZGFibGUgcmVwb3J0cyB3aGV0aGVyIGEgZmVlIG9yIGEgcm95YWx0eSBwYWlkIHRvIHdobyBjb3VsZCBuZXZlcgovLyBiZSBwYWlkIG91dCBhZ2Fpbjogd2hvIGlzIG9uZSBvZiB0aGUgcmVhbG1zIGxpc3RlZCBhYm92ZSwgd2hpY2ggaGF2ZSBubwovLyBmdW5jdGlvbiBmb3IgdGhhdCwgb3IgaXQgaXMgbm90IGFuIGFkZHJlc3MgYXMgdGhlIGNoYWluIHdyaXRlcyBvbmUsIHNvIG5vCi8vIGNhbGxlciBjYW4gZXZlciBwcmVzZW50IGl0LiBJdCBpcyBhIGNoZWNrIGZvciBzdWNoIHJlY2VpdmVycyBvbmx5LCBub3QgZm9yCi8vIHRoZSByZWNpcGllbnQgb2YgYSB0cmFuc2ZlcjogdGhlIHNhbGVzIHJlYWxtIGlzIG9uIHRoZSBsaXN0IGFuZCByaWdodGx5Ci8vIGhvbGRzIGFuZCBtb3ZlcyBsZWRnZXIgYmFsYW5jZXMgb2YgaXRzIG93bi4KZnVuYyBJc1Vuc3BlbmRhYmxlKHdobyBhZGRyZXNzKSBib29sIHsKCXJldHVybiAhbWV0YS5WYWxpZEFkZHJlc3Mod2hvKSB8fCB1bnNwZW5kYWJsZVJlYWxtKHdobykKfQoKZnVuYyB2YWxpZExhbmUobGFuZSBzdHJpbmcpIGJvb2wgewoJZm9yIF8sIGwgOj0gcmFuZ2UgbGFuZXMgewoJCWlmIGwgPT0gbGFuZSB7CgkJCXJldHVybiB0cnVlCgkJfQoJfQoJcmV0dXJuIGZhbHNlCn0KCmZ1bmMgdmVyc2lvblN0cmluZygpIHN0cmluZyB7IHJldHVybiBzdHJjb252LkZvcm1hdEludChHZXRDdXJyZW50VmVyc2lvbigpLCAxMCkgfQoKZnVuYyB2YWxpZEFzc2V0SUQoaWQgc3RyaW5nKSBib29sIHsKCWlmIGxlbihpZCkgPCAyIHx8IGxlbihpZCkgPiAyMCB8fCAoaWRbMF0gIT0gJ1QnICYmIGlkWzBdICE9ICdDJykgfHwgaWRbMV0gPCAnMScgfHwgaWRbMV0gPiAnOScgewoJCXJldHVybiBmYWxzZQoJfQoJZm9yIGkgOj0gMjsgaSA8IGxlbihpZCk7IGkrKyB7CgkJaWYgaWRbaV0gPCAnMCcgfHwgaWRbaV0gPiAnOScgewoJCQlyZXR1cm4gZmFsc2UKCQl9Cgl9CgluLCBlcnIgOj0gc3RyY29udi5QYXJzZUludChpZFsxOl0sIDEwLCA2NCkKCXJldHVybiBlcnIgPT0gbmlsICYmIG4gPiAwCn0KCi8vIFByb3Bvc2VBZG1pbiBzdGFnZXMgYSBoYW5kb2ZmIHRvIGEgdXNlciBhY2NvdW50IG9yIGEgcmVhbG0uIE5vdGhpbmcgY2hhbmdlcwovLyB1bnRpbCB0aGF0IGV4YWN0IGFkZHJlc3MgYWNjZXB0cywgc28gYSB0YXJnZXQgdGhhdCBjYW5ub3QgY2FsbCBpcyBoYXJtbGVzcy4KZnVuYyBQcm9wb3NlQWRtaW4oY3VyIHJlYWxtLCBuZXh0IGFkZHJlc3MpIHsKCXJlcXVpcmVBZG1pbihjdXIpCglpZiAhbWV0YS5WYWxpZEFkZHJlc3MobmV4dCkgfHwgbmV4dCA9PSBhZG1pbiB7CgkJcGFuaWMoImxhdW5jaHBhZC9jb25maWc6IGludmFsaWQgbmV4dCBhZG1pbiIpCgl9CglwZW5kaW5nQWRtaW4gPSBuZXh0CgljaGFpbi5FbWl0KCJBZG1pblByb3Bvc2VkIiwgImFkbWluIiwgYWRtaW4uU3RyaW5nKCksICJwZW5kaW5nIiwgbmV4dC5TdHJpbmcoKSkKfQoKZnVuYyBDYW5jZWxBZG1pblByb3Bvc2FsKGN1ciByZWFsbSkgewoJcmVxdWlyZUFkbWluKGN1cikKCWlmIHBlbmRpbmdBZG1pbiA9PSAiIiB7CgkJcGFuaWMoImxhdW5jaHBhZC9jb25maWc6IG5vIHBlbmRpbmcgYWRtaW4iKQoJfQoJcGVuZGluZ0FkbWluID0gIiIKCWNoYWluLkVtaXQoIkFkbWluUHJvcG9zYWxDYW5jZWxsZWQiLCAiYWRtaW4iLCBhZG1pbi5TdHJpbmcoKSkKfQoKZnVuYyBBY2NlcHRBZG1pbihjdXIgcmVhbG0pIHsKCXdobyA6PSBjYWxsZXIoY3VyKQoJaWYgcGVuZGluZ0FkbWluID09ICIiIHx8IHdobyAhPSBwZW5kaW5nQWRtaW4gewoJCXBhbmljKCJsYXVuY2hwYWQvY29uZmlnOiBwZW5kaW5nIGFkbWluIG9ubHkiKQoJfQoJcHJldmlvdXMgOj0gYWRtaW4KCWFkbWluID0gd2hvCglwZW5kaW5nQWRtaW4gPSAiIgoJY2hhaW4uRW1pdCgiQWRtaW5BY2NlcHRlZCIsICJhZG1pbiIsIHdoby5TdHJpbmcoKSwgInByZXZpb3VzIiwgcHJldmlvdXMuU3RyaW5nKCkpCn0KCi8vIHZhbGlkSXNzdWVyUGF0aCBhY2NlcHRzIGEgcmVhbG0gcGF0aCBiZWxvdyB0aGUgc2FtY3JldyBuYW1lc3BhY2Ugd2hvc2UKLy8gc2VnbWVudHMgYXJlIHBsYWluIGxvd2VyY2FzZSBuYW1lczogbm90aGluZyB0aGF0IGNvdWxkIHJlc29sdmUgZWxzZXdoZXJlLgpmdW5jIHZhbGlkSXNzdWVyUGF0aChwYXRoIHN0cmluZykgYm9vbCB7CglpZiBsZW4ocGF0aCkgPiAyMDAgfHwgIXN0cmluZ3MuSGFzUHJlZml4KHBhdGgsIGlzc3VlclByZWZpeCkgewoJCXJldHVybiBmYWxzZQoJfQoJZm9yIF8sIHNlZ21lbnQgOj0gcmFuZ2Ugc3RyaW5ncy5TcGxpdChwYXRoW2xlbihpc3N1ZXJQcmVmaXgpOl0sICIvIikgewoJCWlmIHNlZ21lbnQgPT0gIiIgewoJCQlyZXR1cm4gZmFsc2UKCQl9CgkJZm9yIGkgOj0gMDsgaSA8IGxlbihzZWdtZW50KTsgaSsrIHsKCQkJYyA6PSBzZWdtZW50W2ldCgkJCWlmIChjIDwgJ2EnIHx8IGMgPiAneicpICYmIChjIDwgJzAnIHx8IGMgPiAnOScpICYmIGMgIT0gJ18nIHsKCQkJCXJldHVybiBmYWxzZQoJCQl9CgkJfQoJfQoJcmV0dXJuIHRydWUKfQoKLy8gQWxsb3dJc3N1ZXIgbGlzdHMgYSByZWFsbSB1bmRlciBnbm8ubGFuZC9yL3NhbWNyZXcvIGFzIGFuIGlzc3VlciBmb3Igb25lCi8vIGxlZGdlciB0byByZWFkLiBUaGUgbGlzdCBvbmx5IGdyb3dzLCBzbyBhIGxlZGdlciBjYW4gYmluZCB3aGF0IGFuIGlzc3VlcgovLyBjcmVhdGVkIHRvIHRoYXQgaXNzdWVyIGZvciBnb29kLgpmdW5jIEFsbG93SXNzdWVyKGN1ciByZWFsbSwgbGVkZ2VyLCBwa2dQYXRoIHN0cmluZykgewoJcmVxdWlyZUFkbWluKGN1cikKCWlmIChsZWRnZXIgIT0gTGVkZ2VyVG9rZW5zICYmIGxlZGdlciAhPSBMZWRnZXJORlQpIHx8ICF2YWxpZElzc3VlclBhdGgocGtnUGF0aCkgfHwKCQlsZW4oaXNzdWVycykgPj0gbWF4SXNzdWVycyB7CgkJcGFuaWMoImxhdW5jaHBhZC9jb25maWc6IGludmFsaWQgaXNzdWVyIikKCX0KCWlzc3VlciA6PSBjaGFpbi5QYWNrYWdlQWRkcmVzcyhwa2dQYXRoKQoJaWYgaXNzdWVyID09IGN1ci5BZGRyZXNzKCkgewoJCXBhbmljKCJsYXVuY2hwYWQvY29uZmlnOiBpbnZhbGlkIGlzc3VlciIpCgl9CglrZXkgOj0gbGVkZ2VyICsgIjoiICsgaXNzdWVyLlN0cmluZygpCglpZiBpc3N1ZXJzW2tleV0gewoJCXBhbmljKCJsYXVuY2hwYWQvY29uZmlnOiBpc3N1ZXIgYWxyZWFkeSBhbGxvd2VkIikKCX0KCWlzc3VlcnNba2V5XSA9IHRydWUKCWNoYWluLkVtaXQoIklzc3VlckFsbG93ZWQiLCAibGVkZ2VyIiwgbGVkZ2VyLCAicGF0aCIsIHBrZ1BhdGgsICJpc3N1ZXIiLCBpc3N1ZXIuU3RyaW5nKCksICJhY3RvciIsIGFkbWluLlN0cmluZygpKQp9CgpmdW5jIElzSXNzdWVyKGxlZGdlciBzdHJpbmcsIHdobyBhZGRyZXNzKSBib29sIHsgcmV0dXJuIGlzc3VlcnNbbGVkZ2VyKyI6Iit3aG8uU3RyaW5nKCldIH0KCmZ1bmMgR2V0QWRtaW4oKSBhZGRyZXNzICAgICAgICB7IHJldHVybiBhZG1pbiB9CmZ1bmMgR2V0UGVuZGluZ0FkbWluKCkgYWRkcmVzcyB7IHJldHVybiBwZW5kaW5nQWRtaW4gfQpmdW5jIEdldFBhdXNlcigpIGFkZHJlc3MgICAgICAgeyByZXR1cm4gcGF1c2VyIH0KCmZ1bmMgY29weVBhcmFtcyhwIFBhcmFtcykgUGFyYW1zIHsKCWNvcHlQIDo9IHAKCWNvcHlQLkN1cnJlbmNpZXMgPSBtYWtlKFtdQ3VycmVuY3lQYXJhbXMsIGxlbihwLkN1cnJlbmNpZXMpKQoJY29weShjb3B5UC5DdXJyZW5jaWVzLCBwLkN1cnJlbmNpZXMpCglyZXR1cm4gY29weVAKfQoKZnVuYyBHZXRDdXJyZW50VmVyc2lvbigpIGludDY0IHsgcmV0dXJuIGludDY0KGxlbih2ZXJzaW9ucykpIH0KCmZ1bmMgR2V0VmVyc2lvbih2ZXJzaW9uIGludDY0KSBQYXJhbXMgewoJaWYgdmVyc2lvbiA8IDEgfHwgdmVyc2lvbiA+IGludDY0KGxlbih2ZXJzaW9ucykpIHsKCQlwYW5pYygibGF1bmNocGFkL2NvbmZpZzogdW5rbm93biB2ZXJzaW9uIikKCX0KCXJldHVybiBjb3B5UGFyYW1zKHZlcnNpb25zW3ZlcnNpb24tMV0pCn0KCi8vIE9uZSB2YWx1ZSBvZiB0aGUgY3VycmVudCB0ZXJtcyBlYWNoLCBzbyBhIGNoZWNrIGNhbiBjb21wYXJlIGl0cyB0ZXh0OiB0aGUKLy8gcHVibGlzaGVyJ3MgbWFudWFsIGZsb3cgcmVhZHMgb25lIGJlZm9yZSBhbmQgYWZ0ZXIgZWFjaCBzZXR0ZXIuIEEgcmF0ZSBvciBhCi8vIGZlZSBvZiAtMSBpcyBub3Qgc2V0OyBzbyBpcyBldmVyeSBmZWUgb2YgYSBjdXJyZW5jeSB3aXRob3V0IHRlcm1zLgpmdW5jIEdldFRyZWFzdXJ5KCkgYWRkcmVzcyAgICAgICAgIHsgcmV0dXJuIHZlcnNpb25zW2xlbih2ZXJzaW9ucyktMV0uVHJlYXN1cnkgfQpmdW5jIEdldFByaW1hcnlGZWVCUFMoKSBpbnQ2NCAgICAgIHsgcmV0dXJuIHZlcnNpb25zW2xlbih2ZXJzaW9ucyktMV0uUHJpbWFyeUZlZUJQUyB9CmZ1bmMgR2V0TkZUUHJpbWFyeUZlZUJQUygpIGludDY0ICAgeyByZXR1cm4gdmVyc2lvbnNbbGVuKHZlcnNpb25zKS0xXS5ORlRQcmltYXJ5RmVlQlBTIH0KZnVuYyBHZXRORlRTZWNvbmRhcnlGZWVCUFMoKSBpbnQ2NCB7IHJldHVybiB2ZXJzaW9uc1tsZW4odmVyc2lvbnMpLTFdLk5GVFNlY29uZGFyeUZlZUJQUyB9CgovLyBHZXRUb2tlblRlcm1zIGlzICI8ZGlyZWN0IGNyZWF0aW9uIGZlZT4sPGZhaXItc2FsZSBjcmVhdGlvbiBmZWU+LDxyYWlzZSBjYXA+IgovLyBpbiBhIGN1cnJlbmN5LgpmdW5jIEdldFRva2VuVGVybXMoa2V5IHN0cmluZykgc3RyaW5nIHsKCWMsIG9rIDo9IGZpbmRDdXJyZW5jeSh2ZXJzaW9uc1tsZW4odmVyc2lvbnMpLTFdLCBrZXkpCglpZiAhb2sgewoJCXJldHVybiAiLTEsLTEsMCIKCX0KCXJldHVybiBzdHJjb252LkZvcm1hdEludChjLkRpcmVjdENyZWF0aW9uRmVlLCAxMCkgKyAiLCIgKyBzdHJjb252LkZvcm1hdEludChjLkZhaXJTYWxlQ3JlYXRpb25GZWUsIDEwKSArICIsIiArIHN0cmNvbnYuRm9ybWF0SW50KGMuRmFpclNhbGVSYWlzZUNhcCwgMTApCn0KCmZ1bmMgR2V0Q29sbGVjdGlvbkZlZShrZXkgc3RyaW5nKSBpbnQ2NCB7CgljLCBvayA6PSBmaW5kQ3VycmVuY3kodmVyc2lvbnNbbGVuKHZlcnNpb25zKS0xXSwga2V5KQoJaWYgIW9rIHsKCQlyZXR1cm4gLTEKCX0KCXJldHVybiBjLkNvbGxlY3Rpb25GZWUKfQoKZnVuYyBBc3NlcnRFeHBlY3RlZFZlcnNpb24oZXhwZWN0ZWQgaW50NjQpIHsKCWlmIGV4cGVjdGVkICE9IEdldEN1cnJlbnRWZXJzaW9uKCkgewoJCXBhbmljKCJjb25maWcgY2hhbmdlZCIpCgl9Cn0KCmZ1bmMgdmFsaWRhdGVQYXJhbXMocCBQYXJhbXMpIHsKCWlmIHAuUHJpbWFyeUZlZUJQUyA8IC0xIHx8IHAuUHJpbWFyeUZlZUJQUyA+IDUwMCB8fAoJCXAuTkZUUHJpbWFyeUZlZUJQUyA8IC0xIHx8IHAuTkZUUHJpbWFyeUZlZUJQUyA+IDUwMCB8fAoJCXAuTkZUU2Vjb25kYXJ5RmVlQlBTIDwgLTEgfHwgcC5ORlRTZWNvbmRhcnlGZWVCUFMgPiAyMDAgewoJCXBhbmljKCJsYXVuY2hwYWQvY29uZmlnOiBwYXJhbWV0ZXIgb3V0IG9mIHJhbmdlIikKCX0KCWlmIHAuVHJlYXN1cnkgIT0gIiIgewoJCWlmICFtZXRhLlZhbGlkQWRkcmVzcyhwLlRyZWFzdXJ5KSB7CgkJCXBhbmljKCJsYXVuY2hwYWQvY29uZmlnOiBpbnZhbGlkIHRyZWFzdXJ5IikKCQl9CgkJaWYgdW5zcGVuZGFibGVSZWFsbShwLlRyZWFzdXJ5KSB7CgkJCXBhbmljKCJsYXVuY2hwYWQvY29uZmlnOiB0cmVhc3VyeSBjYW5ub3Qgc3BlbmQiKQoJCX0KCX0KCWlmIGxlbihwLkN1cnJlbmNpZXMpID4gbWF4Q3VycmVuY2llcyB7CgkJcGFuaWMoImxhdW5jaHBhZC9jb25maWc6IHRvbyBtYW55IGN1cnJlbmNpZXMiKQoJfQoJc2VlbiA6PSBtYXBbc3RyaW5nXWJvb2x7fQoJZm9yIF8sIGMgOj0gcmFuZ2UgcC5DdXJyZW5jaWVzIHsKCQlpZiBjLktleSA9PSAiIiB8fCBsZW4oYy5LZXkpID4gMjAwIHx8IHNlZW5bYy5LZXldIHx8CgkJCShjLktleSAhPSBOYXRpdmVDdXJyZW5jeSAmJiBncmMyMHJlZy5HZXQoYy5LZXkpID09IG5pbCkgfHwKCQkJYy5EaXJlY3RDcmVhdGlvbkZlZSA8IC0xIHx8IGMuRGlyZWN0Q3JlYXRpb25GZWUgPiBtYXhDcmVhdGlvbkZlZSB8fAoJCQljLkZhaXJTYWxlQ3JlYXRpb25GZWUgPCAtMSB8fCBjLkZhaXJTYWxlQ3JlYXRpb25GZWUgPiBtYXhDcmVhdGlvbkZlZSB8fAoJCQljLkNvbGxlY3Rpb25GZWUgPCAtMSB8fCBjLkNvbGxlY3Rpb25GZWUgPiBtYXhDcmVhdGlvbkZlZSB8fAoJCQljLkZhaXJTYWxlUmFpc2VDYXAgPCAwIHsKCQkJcGFuaWMoImxhdW5jaHBhZC9jb25maWc6IGludmFsaWQgY3VycmVuY3kgdGVybXMiKQoJCX0KCQlpZiBjLkZhaXJTYWxlQ3JlYXRpb25GZWUgPj0gMCAmJgoJCQkoYy5EaXJlY3RDcmVhdGlvbkZlZSA8IDAgfHwgYy5GYWlyU2FsZUNyZWF0aW9uRmVlIDwgYy5EaXJlY3RDcmVhdGlvbkZlZSkgewoJCQlwYW5pYygibGF1bmNocGFkL2NvbmZpZzogZmFpci1zYWxlIGZlZSBiZWxvdyBkaXJlY3QgZmVlIikKCQl9CgkJLy8gV2l0aCBkaXJlY3QgPD0gZmFpciA8IGNhcCwgYW5kIG5vIGNhcCB3aGlsZSBmYWlyIHNhbGVzIGFyZSBjbG9zZWQsCgkJLy8gbm8gdHdvIG9mIHRoZSB0aHJlZSBjYW4gYmUgc3dhcHBlZCB1bm5vdGljZWQuCgkJaWYgYy5GYWlyU2FsZVJhaXNlQ2FwICE9IDAgJiYKCQkJKGMuRmFpclNhbGVDcmVhdGlvbkZlZSA8IDAgfHwgYy5GYWlyU2FsZVJhaXNlQ2FwIDw9IGMuRmFpclNhbGVDcmVhdGlvbkZlZSkgewoJCQlwYW5pYygibGF1bmNocGFkL2NvbmZpZzogcmFpc2UgY2FwIG5vdCBhYm92ZSBmYWlyLXNhbGUgZmVlIikKCQl9CgkJc2VlbltjLktleV0gPSB0cnVlCgl9Cn0KCi8vIFRlcm1zIGNoYW5nZSBvbmx5IHRocm91Z2ggdGhlIHNldHRlcnMgYmVsb3cuIEVhY2ggdGFrZXMgc2NhbGFyIGFyZ3VtZW50cywKLy8gc28gYSB1c2VyIGFjY291bnQgY2FuIGNhbGwgaXQsIGFuZCBhcHBlbmRzIG9uZSBzbmFwc2hvdCB0aGF0IHBhc3NlZCB0aGUKLy8gd2hvbGUgdmFsaWRhdGlvbjsgZWFybGllciBzbmFwc2hvdHMgbmV2ZXIgY2hhbmdlLiBBIGxhdW5jaCBwaW5zIHRoZSB2ZXJzaW9uCi8vIGl0IHdhcyBjcmVhdGVkIHVuZGVyLCBhbmQgYW4gYWN0aW9uIHNpZ25lZCBhZ2FpbnN0IGFuIG9sZGVyIHZlcnNpb24gZmFpbHMuCgpmdW5jIGxhdGVzdCgpIFBhcmFtcyB7IHJldHVybiBjb3B5UGFyYW1zKHZlcnNpb25zW2xlbih2ZXJzaW9ucyktMV0pIH0KCmZ1bmMgYXBwZW5kVmVyc2lvbihuZXh0IFBhcmFtcywgY2hhbmdlIHN0cmluZykgaW50NjQgewoJdmFsaWRhdGVQYXJhbXMobmV4dCkKCXZlcnNpb25zID0gYXBwZW5kKHZlcnNpb25zLCBuZXh0KQoJY2hhaW4uRW1pdCgiQ29uZmlnVmVyc2lvbkFkZGVkIiwgInZlcnNpb24iLCB2ZXJzaW9uU3RyaW5nKCksICJjaGFuZ2UiLCBjaGFuZ2UsICJhY3RvciIsIGFkbWluLlN0cmluZygpKQoJcmV0dXJuIEdldEN1cnJlbnRWZXJzaW9uKCkKfQoKZnVuYyBmaW5kQ3VycmVuY3kocCBQYXJhbXMsIGtleSBzdHJpbmcpIChDdXJyZW5jeVBhcmFtcywgYm9vbCkgewoJZm9yIF8sIGMgOj0gcmFuZ2UgcC5DdXJyZW5jaWVzIHsKCQlpZiBjLktleSA9PSBrZXkgewoJCQlyZXR1cm4gYywgdHJ1ZQoJCX0KCX0KCXJldHVybiBDdXJyZW5jeVBhcmFtc3t9LCBmYWxzZQp9CgovLyBjdXJyZW5jeVRlcm1zIHJldHVybnMgdGhlIGluZGV4IG9mIGtleSdzIHRlcm1zIGluIHAsIGFkZGluZyB0aGVtIHdpdGggZXZlcnkKLy8gbGFuZSBjbG9zZWQgd2hlbiB0aGUgY3VycmVuY3kgaXMgbmV3LgpmdW5jIGN1cnJlbmN5VGVybXMocCAqUGFyYW1zLCBrZXkgc3RyaW5nKSBpbnQgewoJZm9yIGksIGMgOj0gcmFuZ2UgcC5DdXJyZW5jaWVzIHsKCQlpZiBjLktleSA9PSBrZXkgewoJCQlyZXR1cm4gaQoJCX0KCX0KCXAuQ3VycmVuY2llcyA9IGFwcGVuZChwLkN1cnJlbmNpZXMsIEN1cnJlbmN5UGFyYW1zewoJCUtleToga2V5LCBEaXJlY3RDcmVhdGlvbkZlZTogLTEsIEZhaXJTYWxlQ3JlYXRpb25GZWU6IC0xLCBDb2xsZWN0aW9uRmVlOiAtMSwKCX0pCglyZXR1cm4gbGVuKHAuQ3VycmVuY2llcykgLSAxCn0KCi8vIFNldFRyZWFzdXJ5IG5hbWVzIHRoZSByZWNlaXZlciBvZiBwcm90b2NvbCBmZWVzLiBPbmNlIG5hbWVkIGl0IGNhbiBiZQovLyByZXBsYWNlZCwgbm90IHJlbW92ZWQuCmZ1bmMgU2V0VHJlYXN1cnkoY3VyIHJlYWxtLCB0cmVhc3VyeSBhZGRyZXNzKSBpbnQ2NCB7CglyZXF1aXJlQWRtaW4oY3VyKQoJaWYgdHJlYXN1cnkgPT0gIiIgewoJCXBhbmljKCJsYXVuY2hwYWQvY29uZmlnOiBpbnZhbGlkIHRyZWFzdXJ5IikKCX0KCW5leHQgOj0gbGF0ZXN0KCkKCW5leHQuVHJlYXN1cnkgPSB0cmVhc3VyeQoJcmV0dXJuIGFwcGVuZFZlcnNpb24obmV4dCwgInRyZWFzdXJ5IikKfQoKZnVuYyBTZXRQcmltYXJ5RmVlQlBTKGN1ciByZWFsbSwgYnBzIGludDY0KSBpbnQ2NCB7CglyZXF1aXJlQWRtaW4oY3VyKQoJbmV4dCA6PSBsYXRlc3QoKQoJbmV4dC5QcmltYXJ5RmVlQlBTID0gYnBzCglyZXR1cm4gYXBwZW5kVmVyc2lvbihuZXh0LCAicHJpbWFyeV9mZWUiKQp9CgpmdW5jIFNldE5GVFByaW1hcnlGZWVCUFMoY3VyIHJlYWxtLCBicHMgaW50NjQpIGludDY0IHsKCXJlcXVpcmVBZG1pbihjdXIpCgluZXh0IDo9IGxhdGVzdCgpCgluZXh0Lk5GVFByaW1hcnlGZWVCUFMgPSBicHMKCXJldHVybiBhcHBlbmRWZXJzaW9uKG5leHQsICJuZnRfcHJpbWFyeV9mZWUiKQp9CgpmdW5jIFNldE5GVFNlY29uZGFyeUZlZUJQUyhjdXIgcmVhbG0sIGJwcyBpbnQ2NCkgaW50NjQgewoJcmVxdWlyZUFkbWluKGN1cikKCW5leHQgOj0gbGF0ZXN0KCkKCW5leHQuTkZUU2Vjb25kYXJ5RmVlQlBTID0gYnBzCglyZXR1cm4gYXBwZW5kVmVyc2lvbihuZXh0LCAibmZ0X3NlY29uZGFyeV9mZWUiKQp9CgovLyBTZXRUb2tlblRlcm1zIHByaWNlcyB0b2tlbiBjcmVhdGlvbiBpbiBvbmUgY3VycmVuY3kgYW5kIGJvdW5kcyB3aGF0IGEKLy8gc2luZ2xlIGZhaXIgc2FsZSBtYXkgcmFpc2UgaW4gaXQuCmZ1bmMgU2V0VG9rZW5UZXJtcyhjdXIgcmVhbG0sIGtleSBzdHJpbmcsIGRpcmVjdENyZWF0aW9uRmVlLCBmYWlyU2FsZUNyZWF0aW9uRmVlLCBmYWlyU2FsZVJhaXNlQ2FwIGludDY0KSBpbnQ2NCB7CglyZXF1aXJlQWRtaW4oY3VyKQoJbmV4dCA6PSBsYXRlc3QoKQoJaSA6PSBjdXJyZW5jeVRlcm1zKCZuZXh0LCBrZXkpCgluZXh0LkN1cnJlbmNpZXNbaV0uRGlyZWN0Q3JlYXRpb25GZWUgPSBkaXJlY3RDcmVhdGlvbkZlZQoJbmV4dC5DdXJyZW5jaWVzW2ldLkZhaXJTYWxlQ3JlYXRpb25GZWUgPSBmYWlyU2FsZUNyZWF0aW9uRmVlCgluZXh0LkN1cnJlbmNpZXNbaV0uRmFpclNhbGVSYWlzZUNhcCA9IGZhaXJTYWxlUmFpc2VDYXAKCXJldHVybiBhcHBlbmRWZXJzaW9uKG5leHQsICJ0b2tlbl90ZXJtcyIpCn0KCmZ1bmMgU2V0Q29sbGVjdGlvbkZlZShjdXIgcmVhbG0sIGtleSBzdHJpbmcsIGZlZSBpbnQ2NCkgaW50NjQgewoJcmVxdWlyZUFkbWluKGN1cikKCW5leHQgOj0gbGF0ZXN0KCkKCWkgOj0gY3VycmVuY3lUZXJtcygmbmV4dCwga2V5KQoJbmV4dC5DdXJyZW5jaWVzW2ldLkNvbGxlY3Rpb25GZWUgPSBmZWUKCXJldHVybiBhcHBlbmRWZXJzaW9uKG5leHQsICJjb2xsZWN0aW9uX2ZlZSIpCn0KCi8vIFJlbW92ZUN1cnJlbmN5IGRyb3BzIGEgY3VycmVuY3kncyB0ZXJtcywgaXRzIGFsbG93bGlzdCBlbnRyeSBhbmQgaXRzIG93ZWQKLy8gY2VpbGluZywgc28gYWRkaW5nIHRlcm1zIGFnYWluIGxhdGVyIG5laXRoZXIgcmVvcGVucyBpdCBub3IgYnJpbmdzIGJhY2sgYW4KLy8gb2xkIGNlaWxpbmcgYnkgaXRzZWxmLgpmdW5jIFJlbW92ZUN1cnJlbmN5KGN1ciByZWFsbSwga2V5IHN0cmluZykgaW50NjQgewoJcmVxdWlyZUFkbWluKGN1cikKCWN1cnJlbnQgOj0gbGF0ZXN0KCkKCW5leHQgOj0gY3VycmVudAoJbmV4dC5DdXJyZW5jaWVzID0gbmlsCglmb3IgXywgYyA6PSByYW5nZSBjdXJyZW50LkN1cnJlbmNpZXMgewoJCWlmIGMuS2V5ICE9IGtleSB7CgkJCW5leHQuQ3VycmVuY2llcyA9IGFwcGVuZChuZXh0LkN1cnJlbmNpZXMsIGMpCgkJfQoJfQoJaWYgbGVuKG5leHQuQ3VycmVuY2llcykgPT0gbGVuKGN1cnJlbnQuQ3VycmVuY2llcykgewoJCXBhbmljKCJsYXVuY2hwYWQvY29uZmlnOiB1bmtub3duIGN1cnJlbmN5IikKCX0KCWRlbGV0ZShhbGxvd2VkLCBrZXkpCglkZWxldGUob3dlZENlaWxpbmdzLCBrZXkpCglyZXR1cm4gYXBwZW5kVmVyc2lvbihuZXh0LCAiY3VycmVuY3lfcmVtb3ZlZCIpCn0KCi8vIElzTGFuZVJlYWR5IGNoZWNrcyBvbmx5IGltbXV0YWJsZSB0ZXJtcy4gVGhlIGltbWVkaWF0ZSBhbGxvd2xpc3QgaXMgY2hlY2tlZAovLyBhdCBhY3Rpb24gdGltZSBzbyBkZWxpc3RpbmcgY2Fubm90IHByZXZlbnQgYW4gb2xkIGxhdW5jaCdzIGV4aXRzLgpmdW5jIElzTGFuZVJlYWR5KGxhbmUsIGN1cnJlbmN5IHN0cmluZykgYm9vbCB7CglwIDo9IHZlcnNpb25zW2xlbih2ZXJzaW9ucyktMV0KCWMsIG9rIDo9IGZpbmRDdXJyZW5jeShwLCBjdXJyZW5jeSkKCWlmICFvayB8fCBwLlRyZWFzdXJ5ID09ICIiIHsKCQlyZXR1cm4gZmFsc2UKCX0KCXN3aXRjaCBsYW5lIHsKCS8vIEEgZGlyZWN0IGZlZSBpcyB3aGF0IG9wZW5zIGEgY3VycmVuY3kgdG8gdGhlIHRva2VuIGxhbmVzOiBhIGZhaXIgc2FsZQoJLy8gY2Fubm90IGJlIHByaWNlZCB3aXRob3V0IG9uZSwgYW5kIGFuIGFpcmRyb3AsIHdoaWNoIGlzIGZyZWUsIG5lZWRzIGl0IHRvby4KCWNhc2UgTGFuZURpcmVjdCwgTGFuZUFpcmRyb3A6CgkJcmV0dXJuIGMuRGlyZWN0Q3JlYXRpb25GZWUgPj0gMAoJY2FzZSBMYW5lRmFpclNhbGU6CgkJcmV0dXJuIGMuRmFpclNhbGVDcmVhdGlvbkZlZSA+PSAwICYmIGMuRmFpclNhbGVSYWlzZUNhcCA+IDAgJiYgcC5QcmltYXJ5RmVlQlBTID49IDAKCS8vIEEgY29sbGVjdGlvbiBmZWUgaXMgd2hhdCBvcGVucyBhIGN1cnJlbmN5IHRvIHRoZSBORlQgbGFuZXMuCgljYXNlIExhbmVDb2xsZWN0aW9uOgoJCXJldHVybiBjLkNvbGxlY3Rpb25GZWUgPj0gMAoJY2FzZSBMYW5lTkZURHJvcHM6CgkJcmV0dXJuIGMuQ29sbGVjdGlvbkZlZSA+PSAwICYmIHAuTkZUUHJpbWFyeUZlZUJQUyA+PSAwCgljYXNlIExhbmVORlRNYXJrZXQ6CgkJcmV0dXJuIGMuQ29sbGVjdGlvbkZlZSA+PSAwICYmIHAuTkZUU2Vjb25kYXJ5RmVlQlBTID49IDAKCX0KCXJldHVybiBmYWxzZQp9CgovLyBQYXVzZSBjbG9zZXMgYSBsYW5lIHRvIG5ldyBsYXVuY2hlcyBhbmQgY29udHJpYnV0aW9ucy4gQ2xhaW1zLCByZWZ1bmRzIGFuZAovLyBzZXR0bGVtZW50cyBuZXZlciByZWFkIHRoZSBnYXRlLCBzbyBub3RoaW5nIGhlcmUgY2FuIGhvbGQgZnVuZHMgYmFjay4KZnVuYyBQYXVzZShjdXIgcmVhbG0sIGxhbmUgc3RyaW5nKSB7Cgl3aG8gOj0gY2FsbGVyKGN1cikKCWlmICF2YWxpZExhbmUobGFuZSkgewoJCXBhbmljKCJsYXVuY2hwYWQvY29uZmlnOiBpbnZhbGlkIGxhbmUiKQoJfQoJaWYgd2hvICE9IGFkbWluICYmIHdobyAhPSBwYXVzZXIgewoJCXBhbmljKCJsYXVuY2hwYWQvY29uZmlnOiBwYXVzZXIgb3IgYWRtaW4gb25seSIpCgl9CglwYXVzZWRbbGFuZV0gPSB0cnVlCgljaGFpbi5FbWl0KCJMYW5lUGF1c2VkIiwgImxhbmUiLCBsYW5lLCAiYWN0b3IiLCB3aG8uU3RyaW5nKCkpCn0KCi8vIFVucGF1c2Ugb3BlbnMgYSBsYW5lLiBJdCBuZWVkcyBhIHBhdXNlciBpbiBwbGFjZSBhbmQgb25lIGxpc3RlZCBjdXJyZW5jeQovLyB3aG9zZSB0ZXJtcyBmb3IgdGhlIGxhbmUgYXJlIGNvbXBsZXRlLgpmdW5jIFVucGF1c2UoY3VyIHJlYWxtLCBsYW5lLCBjdXJyZW5jeSBzdHJpbmcpIHsKCXJlcXVpcmVBZG1pbihjdXIpCglpZiAhdmFsaWRMYW5lKGxhbmUpIHsKCQlwYW5pYygibGF1bmNocGFkL2NvbmZpZzogaW52YWxpZCBsYW5lIikKCX0KCWlmIHBhdXNlciA9PSAiIiB8fCAhYWxsb3dlZFtjdXJyZW5jeV0gfHwgIUlzTGFuZVJlYWR5KGxhbmUsIGN1cnJlbmN5KSB7CgkJcGFuaWMoImxhdW5jaHBhZC9jb25maWc6IGxhbmUgaXMgaW5jb21wbGV0ZSIpCgl9CglwYXVzZWRbbGFuZV0gPSBmYWxzZQoJY2hhaW4uRW1pdCgiTGFuZVVucGF1c2VkIiwgImxhbmUiLCBsYW5lLCAiY3VycmVuY3kiLCBjdXJyZW5jeSwgInZlcnNpb24iLCB2ZXJzaW9uU3RyaW5nKCksICJhY3RvciIsIGFkbWluLlN0cmluZygpKQp9CgpmdW5jIElzUGF1c2VkKGxhbmUgc3RyaW5nKSBib29sIHsKCWlmICF2YWxpZExhbmUobGFuZSkgewoJCXJldHVybiB0cnVlCgl9CglyZXR1cm4gcGF1c2VkW2xhbmVdCn0KCi8vIEFzc2VydExhbmVPcGVuIGdhdGVzIGEgbmV3IGluZmxvdzogdGhlIGxhbmUgaXMgb3BlbiBhbmQgdGhlIGN1cnJlbmN5IGlzCi8vIGxpc3RlZCB3aXRoIGNvbXBsZXRlIHRlcm1zLiBBIGNhbGxlciB0aGF0IGNoYXJnZXMgdGhlIHRlcm1zIGluIGZvcmNlIHJlYWRzCi8vIHRoZW0gaW4gdGhlIHNhbWUgdHJhbnNhY3Rpb24sIGFzIHRoZSBORlQgcmVhbG1zIGRvOyBvbmUgdGhhdCBjaGFyZ2VzIGF0IHRoZQovLyB2ZXJzaW9uIGl0cyB1c2VyIHNpZ25lZCBmb3IgY2hlY2tzIHRoYXQgdmVyc2lvbiB3aXRoIEFzc2VydE5ld0FjdGlvbiwgYXMKLy8gdG9rZW4gY3JlYXRpb25zIGFuZCBmYWlyLXNhbGUgbGF1bmNoZXMgZG8uIFRoZSB0b2tlbiBsYW5lcycgZXhpdHMgdXNlIHRoZQovLyB0ZXJtcyByZWNvcmRlZCBhdCBsYXVuY2ggYW5kIHBhc3Mgbm8gZ2F0ZS4KZnVuYyBBc3NlcnRMYW5lT3BlbihsYW5lLCBjdXJyZW5jeSBzdHJpbmcpIHsKCWlmIElzUGF1c2VkKGxhbmUpIHx8ICFhbGxvd2VkW2N1cnJlbmN5XSB8fCAhSXNMYW5lUmVhZHkobGFuZSwgY3VycmVuY3kpIHsKCQlwYW5pYygibGF1bmNocGFkL2NvbmZpZzogbmV3IGFjdGlvbiB1bmF2YWlsYWJsZSIpCgl9Cn0KCi8vIEFzc2VydE5ld0FjdGlvbiBhbHNvIHBpbnMgdGhlIHZlcnNpb24gd2hvc2UgcHJpY2VzIHRoZSBjYWxsZXIgc2lnbmVkIGZvci4KZnVuYyBBc3NlcnROZXdBY3Rpb24obGFuZSwgY3VycmVuY3kgc3RyaW5nLCBleHBlY3RlZFZlcnNpb24gaW50NjQpIHsKCUFzc2VydEV4cGVjdGVkVmVyc2lvbihleHBlY3RlZFZlcnNpb24pCglBc3NlcnRMYW5lT3BlbihsYW5lLCBjdXJyZW5jeSkKfQoKLy8gU2V0UGF1c2VyIG5hbWVzIHRoZSBvbmUgYWRkcmVzcywgYmVzaWRlcyB0aGUgYWRtaW4sIHRoYXQgbWF5IGNsb3NlIGxhbmVzLgpmdW5jIFNldFBhdXNlcihjdXIgcmVhbG0sIG5leHQgYWRkcmVzcykgewoJcmVxdWlyZUFkbWluKGN1cikKCWlmICFtZXRhLlZhbGlkQWRkcmVzcyhuZXh0KSB7CgkJcGFuaWMoImxhdW5jaHBhZC9jb25maWc6IGludmFsaWQgcGF1c2VyIikKCX0KCXBhdXNlciA9IG5leHQKCWNoYWluLkVtaXQoIlBhdXNlckNoYW5nZWQiLCAicGF1c2VyIiwgbmV4dC5TdHJpbmcoKSwgImFjdG9yIiwgYWRtaW4uU3RyaW5nKCkpCn0KCmZ1bmMgU2V0Q3VycmVuY3lBbGxvd2VkKGN1ciByZWFsbSwga2V5IHN0cmluZywgdmFsdWUgYm9vbCkgewoJcmVxdWlyZUFkbWluKGN1cikKCWlmICF2YWx1ZSB7CgkJZGVsZXRlKGFsbG93ZWQsIGtleSkKCX0gZWxzZSBpZiBfLCBvayA6PSBmaW5kQ3VycmVuY3kodmVyc2lvbnNbbGVuKHZlcnNpb25zKS0xXSwga2V5KTsgb2sgewoJCWFsbG93ZWRba2V5XSA9IHRydWUKCX0gZWxzZSB7CgkJcGFuaWMoImxhdW5jaHBhZC9jb25maWc6IGN1cnJlbmN5IHRlcm1zIG1pc3NpbmciKQoJfQoJY2hhaW4uRW1pdCgiQ3VycmVuY3lBbGxvd2VkIiwgImN1cnJlbmN5Iiwga2V5LCAiYWxsb3dlZCIsIHN0cmNvbnYuRm9ybWF0Qm9vbCh2YWx1ZSksICJ2ZXJzaW9uIiwgdmVyc2lvblN0cmluZygpLCAiYWN0b3IiLCBhZG1pbi5TdHJpbmcoKSkKfQoKZnVuYyBJc0N1cnJlbmN5QWxsb3dlZChrZXkgc3RyaW5nKSBib29sIHsgcmV0dXJuIGFsbG93ZWRba2V5XSB9CgovLyBTZXRTYWxlc093ZWRDZWlsaW5nIGJvdW5kcyB3aGF0IHRoZSBzYWxlcyByZWFsbSBtYXkgb3dlIGluIG9uZSBjdXJyZW5jeSwKLy8gaXRzIGZlZXMsIGVzY3JvdywgcmVmdW5kcyBhbmQgcHJvY2VlZHMgdG9nZXRoZXIsIGZvciBhIGZhaXItc2FsZQovLyBjb250cmlidXRpb24gdG8gYmUgYWNjZXB0ZWQuIE5vdGhpbmcgZWxzZSByZWFkcyBpdDogc2V0dGxlbWVudHMsIGNsYWltcywKLy8gcmVsZWFzZXMgYW5kIHN3ZWVwcyBnbyB0aHJvdWdoIGF0IGFueSBjZWlsaW5nLCBhbmQgYSBjZWlsaW5nIGJlbG93IHdoYXQgaXMKLy8gYWxyZWFkeSBvd2VkIG9ubHkgc3RvcHMgbmV3IGNvbnRyaWJ1dGlvbnMuIFVubGlrZSBhIHBhdXNlLCBpdCBsZXRzIHJ1bm5pbmcKLy8gc2FsZXMgdGFrZSBvcmRlcnMgd2hpbGUgdGhlcmUgaXMgcm9vbS4gTWF4SW50NjQsIHRoZSBkZWZhdWx0LCBpcyBubwovLyBjZWlsaW5nLiBJdCBpcyBub3QgYSB0ZXJtIGEgbGF1bmNoIHNpZ25zIGZvciwgc28gaXQgYWRkcyBubyB2ZXJzaW9uLgpmdW5jIFNldFNhbGVzT3dlZENlaWxpbmcoY3VyIHJlYWxtLCBrZXkgc3RyaW5nLCBjZWlsaW5nIGludDY0KSB7CglyZXF1aXJlQWRtaW4oY3VyKQoJaWYgXywgb2sgOj0gZmluZEN1cnJlbmN5KHZlcnNpb25zW2xlbih2ZXJzaW9ucyktMV0sIGtleSk7ICFvayB7CgkJcGFuaWMoImxhdW5jaHBhZC9jb25maWc6IGN1cnJlbmN5IHRlcm1zIG1pc3NpbmciKQoJfQoJaWYgY2VpbGluZyA8IDAgewoJCXBhbmljKCJsYXVuY2hwYWQvY29uZmlnOiBpbnZhbGlkIGNlaWxpbmciKQoJfQoJaWYgY2VpbGluZyA9PSBzbS5NYXhJbnQ2NCB7CgkJZGVsZXRlKG93ZWRDZWlsaW5ncywga2V5KQoJfSBlbHNlIHsKCQlvd2VkQ2VpbGluZ3Nba2V5XSA9IGNlaWxpbmcKCX0KCWNoYWluLkVtaXQoIlNhbGVzT3dlZENlaWxpbmciLCAiY3VycmVuY3kiLCBrZXksICJjZWlsaW5nIiwgc3RyY29udi5Gb3JtYXRJbnQoY2VpbGluZywgMTApLCAiYWN0b3IiLCBhZG1pbi5TdHJpbmcoKSkKfQoKZnVuYyBHZXRTYWxlc093ZWRDZWlsaW5nKGtleSBzdHJpbmcpIGludDY0IHsKCWlmIGNlaWxpbmcsIG9rIDo9IG93ZWRDZWlsaW5nc1trZXldOyBvayB7CgkJcmV0dXJuIGNlaWxpbmcKCX0KCXJldHVybiBzbS5NYXhJbnQ2NAp9CgpmdW5jIFNldFZlcmlmaWVkKGN1ciByZWFsbSwgYXNzZXRJRCBzdHJpbmcsIHZhbHVlIGJvb2wpIHsKCXJlcXVpcmVBZG1pbihjdXIpCglpZiAhdmFsaWRBc3NldElEKGFzc2V0SUQpIHsKCQlwYW5pYygibGF1bmNocGFkL2NvbmZpZzogaW52YWxpZCBhc3NldCBJRCIpCgl9Cgl2ZXJpZmllZFthc3NldElEXSA9IHZhbHVlCgljaGFpbi5FbWl0KCJWZXJpZmllZCIsICJhc3NldCIsIGFzc2V0SUQsICJ2ZXJpZmllZCIsIHN0cmNvbnYuRm9ybWF0Qm9vbCh2YWx1ZSksICJhY3RvciIsIGFkbWluLlN0cmluZygpKQp9CgpmdW5jIElzVmVyaWZpZWQoYXNzZXRJRCBzdHJpbmcpIGJvb2wgeyByZXR1cm4gdmVyaWZpZWRbYXNzZXRJRF0gfQoKZnVuYyBTZXRSZXNlcnZlZChjdXIgcmVhbG0sIHRpY2tlciBzdHJpbmcsIHZhbHVlIGJvb2wpIHsKCXJlcXVpcmVBZG1pbihjdXIpCglpZiBtZXRhLlRpY2tlcih0aWNrZXIpICE9IG5pbCB7CgkJcGFuaWMoImxhdW5jaHBhZC9jb25maWc6IGludmFsaWQgdGlja2VyIikKCX0KCXJlc2VydmVkW3RpY2tlcl0gPSB2YWx1ZQoJY2hhaW4uRW1pdCgiUmVzZXJ2ZWQiLCAidGlja2VyIiwgdGlja2VyLCAicmVzZXJ2ZWQiLCBzdHJjb252LkZvcm1hdEJvb2wodmFsdWUpLCAiYWN0b3IiLCBhZG1pbi5TdHJpbmcoKSkKfQoKZnVuYyBJc1Jlc2VydmVkKHRpY2tlciBzdHJpbmcpIGJvb2wgeyByZXR1cm4gcmVzZXJ2ZWRbdGlja2VyXSB9ChpNCgtnbm9tb2QudG9tbBI+bW9kdWxlID0gImduby5sYW5kL3Ivc2FtY3Jldy9sYXVuY2hwYWQvY29uZmlnL3YxIgpnbm8gPSAiMC45Igoa2AcKCXZpZXdzLmdubxLKB3BhY2thZ2UgY29uZmlnCgppbXBvcnQgKAoJInN0cmNvbnYiCgoJImduby5sYW5kL3Avc2FtY3Jldy9sYXVuY2hwYWQvbWV0YS92MSIKKQoKLy8gQWN0aW9uU3RhdHVzSlNPTiByZXBvcnRzIG9ubHkgdGhlIGN1cnJlbnQgY29uZmlnIGdhdGUgZm9yIGEgbmV3IGFjdGlvbi4KLy8gT3RoZXIgcmVhbG0sIGN1c3RvZHkgYW5kIHB1YmxpY2F0aW9uIHJlcXVpcmVtZW50cyBhcmUgc2VwYXJhdGUuCmZ1bmMgQWN0aW9uU3RhdHVzSlNPTihsYW5lLCBjdXJyZW5jeSBzdHJpbmcpIHN0cmluZyB7CglpZiAhdmFsaWRMYW5lKGxhbmUpIHx8IGN1cnJlbmN5ID09ICIiIHx8IGxlbihjdXJyZW5jeSkgPiAyMDAgewoJCXBhbmljKCJsYXVuY2hwYWQvY29uZmlnOiBpbnZhbGlkIGFjdGlvbiBzdGF0dXMgcXVlcnkiKQoJfQoJYmxvY2tlZCA6PSBJc1BhdXNlZChsYW5lKQoJYWxsb3dsaXN0ZWQgOj0gSXNDdXJyZW5jeUFsbG93ZWQoY3VycmVuY3kpCglyZWFkeSA6PSBJc0xhbmVSZWFkeShsYW5lLCBjdXJyZW5jeSkKCXJldHVybiAieyIgKwoJCWAic2NoZW1hIjoibGF1bmNocGFkLWNvbmZpZy1hY3Rpb24tdjEiYCArCgkJYCwibGFuZSI6YCArIG1ldGEuSlNPTlN0cmluZyhsYW5lKSArCgkJYCwiY3VycmVuY3kiOmAgKyBtZXRhLkpTT05TdHJpbmcoY3VycmVuY3kpICsKCQlgLCJ2ZXJzaW9uIjpgICsgbWV0YS5KU09OU3RyaW5nKHN0cmNvbnYuRm9ybWF0SW50KEdldEN1cnJlbnRWZXJzaW9uKCksIDEwKSkgKwoJCWAsInBhdXNlZCI6YCArIHN0cmNvbnYuRm9ybWF0Qm9vbChibG9ja2VkKSArCgkJYCwiYWxsb3dsaXN0ZWQiOmAgKyBzdHJjb252LkZvcm1hdEJvb2woYWxsb3dsaXN0ZWQpICsKCQlgLCJsYW5lUmVhZHkiOmAgKyBzdHJjb252LkZvcm1hdEJvb2wocmVhZHkpICsKCQlgLCJjb25maWdHYXRlT3BlbiI6YCArIHN0cmNvbnYuRm9ybWF0Qm9vbCghYmxvY2tlZCAmJiBhbGxvd2xpc3RlZCAmJiByZWFkeSkgKyAifSIKfQoiIgoTL2duby5NZW1QYWNrYWdlVHlwZRILCglNUFVzZXJBbGwiDTEyMDAwMDAwdWdub3QSEQiA0KVMEgo4MDAwMHVnbm90GogDCs0BChIvdG0uUHViS2V5TXVsdGlzaWcStgEIAhI6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQNdTsrzjy2oA1bKxxCiASBMVUReZbe8FQo/n1GUQS9f7RI6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQMo44neuGQmEOBJpWfwt5YFd/18PcgdS1Pidavq3ZGmeBI6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQMg5X9eKuwtmgamq/0K8oenVUfVQAsVWVenzmjN1+WBABKLAQoFCAMSAaASQNQTAWgxx8sSZmHtiO/SbNCSjCKojYQmfbfJ8FJxXPBRV4ZIOAWOfFhI/7w8DBPYnQXONj0k9bSzKXAOEtjZbjASQLBNja9WIZ3ehD6OTWCQvgCGYjB/mdrsaLMgchvl80gNN0lC4xMJkBWJc1qBrhUYm7IietnWkBP0tXbg853vsvMaKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU=