Transaction executed successfully
Transaction Details
Inspect execution, participants, message data, gas usage, events and raw transaction data.
Transaction hash
3D21D06C24332077E4C07A9A1A7DF8BF9B19D053A37FAC90E5F81EF095E7B645
Transaction overview
Execution summary
TX INDEX
0
Position in block
GAS WANTED
49,290,988
Requested gas limit
GAS USED
37,916,119
Gas consumed
FEE
49291ugnot
Transaction fee
Participants
Message
Message #1
m_addpkg
Arguments
g1wx60nkcp5lfsxmedeg7sfs47tzxkath05u63t417000000ugnot
Execution log
msg:0,success:true,log:,events:[]
Events
No events emitted by this transaction.
Raw encoded transaction
CvTaAQoML3ZtLm1fYWRkcGtnEuLaAQooZzF3eDYwbmtjcDVsZnN4bWVkZWc3c2ZzNDd0enhrYXRoMDV1NjN0NBKl2gEKBnN0YWJsZRJFZ25vLmxhbmQvci9nMXd4NjBua2NwNWxmc3htZWRlZzdzZnM0N3R6eGthdGgwNXU2M3Q0L3RyaWFsbWludDIvc3RhYmxlGmwKC2dub21vZC50b21sEl1tb2R1bGUgPSAiZ25vLmxhbmQvci9nMXd4NjBua2NwNWxmc3htZWRlZzdzZnM0N3R6eGthdGgwNXU2M3Q0L3RyaWFsbWludDIvc3RhYmxlIgpnbm8gPSAiMC45IgoawNgBCgpzdGFibGUuZ25vErDYAXBhY2thZ2Ugc3RhYmxlCgppbXBvcnQgKAoJcnVudGltZSAiY2hhaW4vcnVudGltZSIKCXVuc2FmZXJlYWxtICJjaGFpbi9ydW50aW1lL3Vuc2FmZSIKCSJlbmNvZGluZy9iYXNlNjQiCgkic3RyY29udiIKCSJzdHJpbmdzIgoKCSJnbm8ubGFuZC9wL250L2F2bC92MCIKCSJnbm8ubGFuZC9wL250L2dyYzcyMS92MCIKCSJnbm8ubGFuZC9wL250L3NlcWlkL3YwIgoJY2FtcGFpZ24gImduby5sYW5kL3IvZzF3eDYwbmtjcDVsZnN4bWVkZWc3c2ZzNDd0enhrYXRoMDV1NjN0NC90cmlhbG1pbnQyL2NhbXBhaWduIgoJYXJ0cGtnICJnbm8ubGFuZC9wL2cxd3g2MG5rY3A1bGZzeG1lZGVnN3NmczQ3dHp4a2F0aDA1dTYzdDQvYXJ0M2QyIgoJImduby5sYW5kL3AvbnQvdWZtdC92MCIKKQoKY29uc3QgKAoJQ29sbGVjdGlvbk5hbWUgICA9ICJUcmlhbCBNaW50IgoJQ29sbGVjdGlvblN5bWJvbCA9ICJUUklBTCIKCglyZWFsbVJlbFBhdGggPSAiL3IvZzF3eDYwbmtjcDVsZnN4bWVkZWc3c2ZzNDd0enhrYXRoMDV1NjN0NC90cmlhbG1pbnQyL3N0YWJsZSIKCglzdW1tYXJ5UGFnZVNpemUgPSAxMAoJZ25vd2ViTGlzdExpbWl0ID0gMTAKCXBhZ2VXaW5kb3cgICAgICAgICA9IDIKCXRva2VuUGFnZUltYWdlU2l6ZSA9ICI0MjAiCgoJUmV2ZWFsRGVsYXlCbG9ja3MgPSA1CikKCnZhciAoCgl0b2tlbiAgKmdyYzcyMS5Ub2tlbgoJbGVkZ2VyICpncmM3MjEuUHJpdmF0ZUxlZGdlciAvLyBwcml2YXRlOiBvbmx5IHRoaXMgcmVhbG0gbWludHMsIGJ1cm5zIGFuZCBtb3ZlcyB0b2tlbnMKCgljb2xsZWN0aW9uT3duZXIgYWRkcmVzcyA9ICJnMXd4NjBua2NwNWxmc3htZWRlZzdzZnM0N3R6eGthdGgwNXU2M3Q0IgoKCWFwcHJvdmVkVmVyc2lvbiBzdHJpbmcKCgltaW50UHJpY2VVZ25vdCBpbnQ2NCA9IDEwMDAwMDAwMDAwMDAgLy8gMTAwIEdOT1QsIHBlciByZXF1ZXN0CgoJd2hpdGVsaXN0QnBzIGF2bC5UcmVlCgoJcm95YWx0eUJwcyAgICAgICBpbnQ2NCAgID0gNTAwCglyb3lhbHR5UmVjaXBpZW50IGFkZHJlc3MgPSAiZzF3eDYwbmtjcDVsZnN4bWVkZWc3c2ZzNDd0enhrYXRoMDV1NjN0NCIKCgltaW50ZWRJRHMgW11ncmM3MjEuVG9rZW5JRAoKCW1pbnRlZFRyYWl0Q29tYm9zIGF2bC5UcmVlIC8vIGNvbWJvIGtleSAtPiB0cnVlCgl0b2tlbkNvbWJvS2V5cyAgICBhdmwuVHJlZSAvLyB0aWQuU3RyaW5nKCkgLT4gY29tYm9LZXkgc3RyaW5nCgltaW50Q291bnRCeVdhbGxldCBhdmwuVHJlZSAvLyBhZGRyZXNzLlN0cmluZygpIC0+IGludDY0CgoJbWludGluZ09wZW5NaXJyb3IgICAgICAgPSB0cnVlCgltYXhNaW50c1BlcldhbGxldE1pcnJvciBpbnQ2NCA9IDAKCglidXJuZWRSZWNvcmRzIGF2bC5UcmVlIC8vIHRpZC5TdHJpbmcoKSAtPiBidXJuUmVjb3JkCglidXJuZWRJRHMgICAgIFtdZ3JjNzIxLlRva2VuSUQKCgljbGFpbVJlY29yZHMgW11jbGFpbVJlY29yZAoKCXNlYWxlZERhdGEgYXZsLlRyZWUgLy8gdGlkLlN0cmluZygpIC0+IHRyYWl0UHJlc2V0CgltaW50SGVpZ2h0IGF2bC5UcmVlIC8vIHRpZC5TdHJpbmcoKSAtPiBpbnQ2NAoKCXNlYWxlZEltYWdlIHN0cmluZwopCgp0eXBlIHRyYWl0UHJlc2V0IHN0cnVjdCB7CglDaGFpbiAgICBzdHJpbmcKCVNoYXBlSWR4IGludAoJQ29sb3JJZHggaW50CglNZXRhbCAgICBzdHJpbmcKCUFjdGl2ZSAgIGJvb2wKCVJhcml0eSAgIHN0cmluZyAvLyB0aWVyIGZpeGVkIGF0IG1pbnQgYnkgdGhlIHZlcnNpb24gcmVhbG0gKHY1LnJhcml0eVRpZXIpCn0KCnR5cGUgY2xhaW1SZWNvcmQgc3RydWN0IHsKCVdhbGxldCAgICAgYWRkcmVzcwoJQnBzICAgICAgICBpbnQ2NAoJTWludEhlaWdodCBpbnQ2NAoJVGlkICAgICAgICBncmM3MjEuVG9rZW5JRAp9Cgp0eXBlIGJ1cm5SZWNvcmQgc3RydWN0IHsKCUJ1cm5lZEJ5ICAgYWRkcmVzcwoJQnVybkhlaWdodCBpbnQ2NAoJVHJhaXRzICAgICB0cmFpdFByZXNldAp9CgpmdW5jIChyIGJ1cm5SZWNvcmQpIG1ldGFkYXRhKCkgTWV0YWRhdGEgewoJaWYgci5UcmFpdHMuQ2hhaW4gPT0gIiIgewoJCXJldHVybiBNZXRhZGF0YXtOYW1lOiAiVW50aXRsZWQifQoJfQoJcmV0dXJuIHRyYWl0T25seU1ldGFkYXRhKHIuVHJhaXRzKQp9CgpmdW5jIGluaXQoY3VyIHJlYWxtKSB7Cgl0b2tlbiwgbGVkZ2VyID0gZ3JjNzIxLk5ld1Rva2VuKENvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uU3ltYm9sLCBzZXFpZC5JRCgwKSwgY3VyKQoJc3ZnIDo9IGA8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjE3MCIgaGVpZ2h0PSIxNzAiIHZpZXdCb3g9IjAgMCAxNzAgMTcwIj5gICsKCQlgPHJlY3Qgd2lkdGg9IjE3MCIgaGVpZ2h0PSIxNzAiIGZpbGw9IiMwYTBiMTAiLz5gICsKCQlgPGNpcmNsZSBjeD0iODUiIGN5PSI3OCIgcj0iMzQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzU1NSIgc3Ryb2tlLXdpZHRoPSI0Ii8+YCArCgkJYDx0ZXh0IHg9Ijg1IiB5PSI4MyIgZm9udC1zaXplPSIxMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzk5OSIgZm9udC1mYW1pbHk9Im1vbm9zcGFjZSI+U0VBTEVEPC90ZXh0PmAgKwoJCWA8L3N2Zz5gCglzZWFsZWRJbWFnZSA9ICJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LCIgKyBiYXNlNjQuU3RkRW5jb2RpbmcuRW5jb2RlVG9TdHJpbmcoW11ieXRlKHN2ZykpCn0KCnR5cGUgVHJhaXQgc3RydWN0IHsKCVRyYWl0VHlwZSBzdHJpbmcKCVZhbHVlICAgICBzdHJpbmcKfQoKdHlwZSBNZXRhZGF0YSBzdHJ1Y3QgewoJTmFtZSAgICAgICAgICAgIHN0cmluZwoJRGVzY3JpcHRpb24gICAgIHN0cmluZwoJSW1hZ2UgICAgICAgICAgIHN0cmluZwoJQmFja2dyb3VuZENvbG9yIHN0cmluZwoJQXR0cmlidXRlcyAgICAgIFtdVHJhaXQKfQoKZnVuYyBOYW1lKCkgc3RyaW5nICAgICAgeyByZXR1cm4gQ29sbGVjdGlvbk5hbWUgfQpmdW5jIFN5bWJvbCgpIHN0cmluZyAgICB7IHJldHVybiBDb2xsZWN0aW9uU3ltYm9sIH0KZnVuYyBUb2tlbkNvdW50KCkgaW50NjQgeyByZXR1cm4gdG9rZW4uVG90YWxTdXBwbHkoKSB9CmZ1bmMgVG9rZW5JRCgpIHN0cmluZyAgIHsgcmV0dXJuIHRva2VuLklEKCkgfQoKZnVuYyBHZXROYW1lKCkgc3RyaW5nICAgeyByZXR1cm4gQ29sbGVjdGlvbk5hbWUgfQpmdW5jIEdldFN5bWJvbCgpIHN0cmluZyB7IHJldHVybiBDb2xsZWN0aW9uU3ltYm9sIH0KCmZ1bmMgT3duZXJPZih0aWQgZ3JjNzIxLlRva2VuSUQpIChhZGRyZXNzLCBlcnJvcikgICAgIHsgcmV0dXJuIHRva2VuLk93bmVyT2YodGlkKSB9CmZ1bmMgQmFsYW5jZU9mKG93bmVyIGFkZHJlc3MpIChpbnQ2NCwgZXJyb3IpICAgICAgICAgIHsgcmV0dXJuIHRva2VuLkJhbGFuY2VPZihvd25lcikgfQpmdW5jIEdldEFwcHJvdmVkKHRpZCBncmM3MjEuVG9rZW5JRCkgKGFkZHJlc3MsIGVycm9yKSB7IHJldHVybiB0b2tlbi5HZXRBcHByb3ZlZCh0aWQpIH0KZnVuYyBJc0FwcHJvdmVkRm9yQWxsKG93bmVyLCBvcGVyYXRvciBhZGRyZXNzKSBib29sICAgeyByZXR1cm4gdG9rZW4uSXNBcHByb3ZlZEZvckFsbChvd25lciwgb3BlcmF0b3IpIH0KCmZ1bmMgQXBwcm92ZWRWZXJzaW9uKCkgc3RyaW5nIHsgcmV0dXJuIGFwcHJvdmVkVmVyc2lvbiB9CmZ1bmMgT3duZXIoKSBhZGRyZXNzICAgICAgICAgIHsgcmV0dXJuIGNvbGxlY3Rpb25Pd25lciB9CmZ1bmMgTWludFByaWNlKCkgaW50NjQgICAgICAgIHsgcmV0dXJuIG1pbnRQcmljZVVnbm90IH0KCmZ1bmMgTWludGVkSURzKCkgW11ncmM3MjEuVG9rZW5JRCB7IHJldHVybiBtaW50ZWRJRHMgfQpmdW5jIFRvdGFsQnVybmVkKCkgaW50NjQgICAgICAgICAgeyByZXR1cm4gaW50NjQobGVuKGJ1cm5lZElEcykpIH0KCmZ1bmMgTWludGluZ09wZW4oKSBib29sICAgICAgICB7IHJldHVybiBtaW50aW5nT3Blbk1pcnJvciB9CmZ1bmMgTWF4TWludHNQZXJXYWxsZXQoKSBpbnQ2NCB7IHJldHVybiBtYXhNaW50c1BlcldhbGxldE1pcnJvciB9CgpmdW5jIE1pbnRzQnlXYWxsZXQob3duZXIgYWRkcmVzcykgaW50NjQgewoJbiwgXyA6PSBtaW50Q291bnRCeVdhbGxldC5HZXQob3duZXIuU3RyaW5nKCkpLihpbnQ2NCkKCXJldHVybiBuCn0KCmZ1bmMgSXNUcmFpdENvbWJvQXZhaWxhYmxlKGNvbWJvS2V5IHN0cmluZykgYm9vbCB7CglyZXR1cm4gIW1pbnRlZFRyYWl0Q29tYm9zLkhhcyhjb21ib0tleSkKfQoKZnVuYyBXaGl0ZWxpc3RCcHMod2FsbGV0IGFkZHJlc3MpIChicHMgaW50NjQsIG9rIGJvb2wpIHsKCWlmICF3aGl0ZWxpc3RCcHMuSGFzKHdhbGxldC5TdHJpbmcoKSkgewoJCXJldHVybiAwLCBmYWxzZQoJfQoJcmV0dXJuIHdoaXRlbGlzdEJwcy5HZXQod2FsbGV0LlN0cmluZygpKS4oaW50NjQpLCB0cnVlCn0KCmZ1bmMgV2hpdGVsaXN0Q291bnQoKSBpbnQ2NCB7IHJldHVybiBpbnQ2NCh3aGl0ZWxpc3RCcHMuU2l6ZSgpKSB9CgpmdW5jIFdoaXRlbGlzdEVudHJ5KGluZGV4IGludCkgKHdhbGxldCBzdHJpbmcsIGJwcyBpbnQ2NCkgewoJdywgdiA6PSB3aGl0ZWxpc3RCcHMuR2V0QnlJbmRleChpbmRleCkKCXJldHVybiB3LCB2LihpbnQ2NCkKfQoKZnVuYyBFZmZlY3RpdmVQcmljZShjYWxsZXIgYWRkcmVzcykgaW50NjQgewoJaWYgdiwgb2sgOj0gd2hpdGVsaXN0QnBzLkdldChjYWxsZXIuU3RyaW5nKCkpLihpbnQ2NCk7IG9rIHsKCQlyZXR1cm4gbWludFByaWNlVWdub3QgKiB2IC8gMTAwMDAKCX0KCWlmIGJwcywgXywgb2sgOj0gY2FtcGFpZ24uUGVlayhjYWxsZXIpOyBvayB7CgkJcmV0dXJuIG1pbnRQcmljZVVnbm90ICogYnBzIC8gMTAwMDAKCX0KCXJldHVybiBtaW50UHJpY2VVZ25vdAp9CgpmdW5jIFJveWFsdHlJbmZvKHRpZCBncmM3MjEuVG9rZW5JRCwgc2FsZVByaWNlIGludDY0KSAoYWRkcmVzcywgaW50NjQsIGVycm9yKSB7CglpZiBfLCBlcnIgOj0gdG9rZW4uT3duZXJPZih0aWQpOyBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gIiIsIDAsIGVycgoJfQoJcmV0dXJuIHJveWFsdHlSZWNpcGllbnQsIHNhbGVQcmljZSAqIHJveWFsdHlCcHMgLyAxMDAwMCwgbmlsCn0KCmZ1bmMgUm95YWx0eUJwcygpIGludDY0ICAgICAgICAgeyByZXR1cm4gcm95YWx0eUJwcyB9CmZ1bmMgUm95YWx0eVJlY2lwaWVudCgpIGFkZHJlc3MgeyByZXR1cm4gcm95YWx0eVJlY2lwaWVudCB9CgpmdW5jIGNhbGxlckFkZHJlc3MoKSBhZGRyZXNzIHsKCXJldHVybiB1bnNhZmVyZWFsbS5QcmV2aW91c1JlYWxtKCkuQWRkcmVzcygpCn0KCmZ1bmMgYXNzZXJ0T3duZXIoKSB7CglpZiBjYWxsZXJBZGRyZXNzKCkgIT0gY29sbGVjdGlvbk93bmVyIHsKCQlwYW5pYygidW5hdXRob3JpemVkOiBjYWxsZXIgaXMgbm90IHRoZSBjb2xsZWN0aW9uIG93bmVyIikKCX0KfQoKZnVuYyBTZXRBcHByb3ZlZFZlcnNpb24oY3VyIHJlYWxtLCBwa2dwYXRoIHN0cmluZykgewoJYXNzZXJ0T3duZXIoKQoJYXBwcm92ZWRWZXJzaW9uID0gcGtncGF0aAp9CgpmdW5jIFNldE1pbnRQcmljZShjdXIgcmVhbG0sIHVnbm90IGludDY0KSB7Cglhc3NlcnRPd25lcigpCglpZiB1Z25vdCA8IDAgewoJCXBhbmljKCJwcmljZSBjYW5ub3QgYmUgbmVnYXRpdmUiKQoJfQoJbWludFByaWNlVWdub3QgPSB1Z25vdAp9CgpmdW5jIEFkZFRvV2hpdGVsaXN0KGN1ciByZWFsbSwgd2FsbGV0IGFkZHJlc3MsIGJwcyBpbnQ2NCkgewoJYXNzZXJ0T3duZXIoKQoJaWYgYnBzIDwgMCB8fCBicHMgPiAxMDAwMCB7CgkJcGFuaWMoImJwcyBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMTAwMDAiKQoJfQoJd2hpdGVsaXN0QnBzLlNldCh3YWxsZXQuU3RyaW5nKCksIGJwcykKfQoKZnVuYyBBZGRUb1doaXRlbGlzdEJhdGNoKGN1ciByZWFsbSwgd2FsbGV0c0NTViBzdHJpbmcsIGJwcyBpbnQ2NCkgewoJYXNzZXJ0T3duZXIoKQoJaWYgYnBzIDwgMCB8fCBicHMgPiAxMDAwMCB7CgkJcGFuaWMoImJwcyBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMTAwMDAiKQoJfQoJZm9yIF8sIHcgOj0gcmFuZ2Ugc3RyaW5ncy5TcGxpdCh3YWxsZXRzQ1NWLCAiLCIpIHsKCQl3ID0gc3RyaW5ncy5UcmltU3BhY2UodykKCQlpZiB3ID09ICIiIHsKCQkJY29udGludWUKCQl9CgkJd2hpdGVsaXN0QnBzLlNldCh3LCBicHMpCgl9Cn0KCmZ1bmMgUmVtb3ZlRnJvbVdoaXRlbGlzdChjdXIgcmVhbG0sIHdhbGxldCBhZGRyZXNzKSB7Cglhc3NlcnRPd25lcigpCgl3aGl0ZWxpc3RCcHMuUmVtb3ZlKHdhbGxldC5TdHJpbmcoKSkKfQoKZnVuYyBTZXRSb3lhbHR5QnBzKGN1ciByZWFsbSwgYnBzIGludDY0KSB7Cglhc3NlcnRPd25lcigpCglpZiBicHMgPCAwIHx8IGJwcyA+IDEwMDAwIHsKCQlwYW5pYygiYnBzIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxMDAwMCIpCgl9Cglyb3lhbHR5QnBzID0gYnBzCn0KCmZ1bmMgU2V0Um95YWx0eVJlY2lwaWVudChjdXIgcmVhbG0sIHJlY2lwaWVudCBhZGRyZXNzKSB7Cglhc3NlcnRPd25lcigpCglyb3lhbHR5UmVjaXBpZW50ID0gcmVjaXBpZW50Cn0KCmZ1bmMgYXNzZXJ0Q2FsbGVySXNBcHByb3ZlZFZlcnNpb24oY3VyIHJlYWxtKSB7CgljYWxsZXIgOj0gY3VyLlByZXZpb3VzKCkuUGtnUGF0aCgpCglpZiBhcHByb3ZlZFZlcnNpb24gPT0gIiIgewoJCXBhbmljKCJubyB2ZXJzaW9uIHJlYWxtIGhhcyBiZWVuIGFwcHJvdmVkIHlldCIpCgl9CglpZiBjYWxsZXIgIT0gYXBwcm92ZWRWZXJzaW9uIHsKCQlwYW5pYygidW5hdXRob3JpemVkOiBjYWxsZXIgaXMgbm90IHRoZSBhcHByb3ZlZCB2ZXJzaW9uIHJlYWxtIikKCX0KfQoKZnVuYyBSZWNvcmRNaW50KGN1ciByZWFsbSwgdG8gYWRkcmVzcywgcGF5ZXIgYWRkcmVzcywgdGlkIGdyYzcyMS5Ub2tlbklELCBjaGFpbk5hbWUgc3RyaW5nLCBzaGFwZUlkeCwgY29sb3JJZHggaW50LCBtZXRhbCBzdHJpbmcsIGFjdGl2ZSBib29sLCBjb21ib0tleSBzdHJpbmcsIHJhcml0eSBzdHJpbmcpIGdyYzcyMS5Ub2tlbklEIHsKCWFzc2VydENhbGxlcklzQXBwcm92ZWRWZXJzaW9uKGN1cikKCWlmIG1pbnRlZFRyYWl0Q29tYm9zLkhhcyhjb21ib0tleSkgewoJCXBhbmljKCJ0cmFpdCBjb21iaW5hdGlvbiBhbHJlYWR5IG1pbnRlZCIpCgl9CgljaGVja0VycihsZWRnZXIuTWludCh0bywgdGlkKSkKCW1pbnRlZFRyYWl0Q29tYm9zLlNldChjb21ib0tleSwgdHJ1ZSkKCXRva2VuQ29tYm9LZXlzLlNldCh0aWQuU3RyaW5nKCksIGNvbWJvS2V5KQoJbWludENvdW50QnlXYWxsZXQuU2V0KHRvLlN0cmluZygpLCBNaW50c0J5V2FsbGV0KHRvKSsxKQoJbWludGVkSURzID0gYXBwZW5kKG1pbnRlZElEcywgdGlkKQoKCWhlaWdodCA6PSBydW50aW1lLkNoYWluSGVpZ2h0KCkKCW1pbnRIZWlnaHQuU2V0KHRpZC5TdHJpbmcoKSwgaGVpZ2h0KQoJc2VhbGVkRGF0YS5TZXQodGlkLlN0cmluZygpLCB0cmFpdFByZXNldHsKCQlDaGFpbjogY2hhaW5OYW1lLCBTaGFwZUlkeDogc2hhcGVJZHgsIENvbG9ySWR4OiBjb2xvcklkeCwgTWV0YWw6IG1ldGFsLCBBY3RpdmU6IGFjdGl2ZSwgUmFyaXR5OiByYXJpdHksCgl9KQoKCWlmIF8sIGhhc092ZXJyaWRlIDo9IHdoaXRlbGlzdEJwcy5HZXQocGF5ZXIuU3RyaW5nKCkpLihpbnQ2NCk7ICFoYXNPdmVycmlkZSB7CgkJaWYgYnBzLCBvayA6PSBjYW1wYWlnbi5Db25zdW1lRGlzY291bnQoY3Jvc3MoY3VyKSwgcGF5ZXIpOyBvayB7CgkJCWNsYWltUmVjb3JkcyA9IGFwcGVuZChjbGFpbVJlY29yZHMsIGNsYWltUmVjb3JkewoJCQkJV2FsbGV0OiAgICAgcGF5ZXIsCgkJCQlCcHM6ICAgICAgICBicHMsCgkJCQlNaW50SGVpZ2h0OiBoZWlnaHQsCgkJCQlUaWQ6ICAgICAgICB0aWQsCgkJCX0pCgkJfQoJfQoJcmV0dXJuIHRpZAp9CgpmdW5jIENsYWltQ291bnQoKSBpbnQ2NCB7IHJldHVybiBpbnQ2NChsZW4oY2xhaW1SZWNvcmRzKSkgfQoKZnVuYyBDbGFpbUF0KGluZGV4IGludCkgKHdhbGxldCBhZGRyZXNzLCBicHMgaW50NjQsIG1pbnRIZWlnaHRfIGludDY0LCB0aWQgc3RyaW5nKSB7CglyIDo9IGNsYWltUmVjb3Jkc1tpbmRleF0KCXJldHVybiByLldhbGxldCwgci5CcHMsIHIuTWludEhlaWdodCwgci5UaWQuU3RyaW5nKCkKfQoKZnVuYyBSZXBvcnRNaW50aW5nT3BlbihjdXIgcmVhbG0sIG9wZW4gYm9vbCkgewoJYXNzZXJ0Q2FsbGVySXNBcHByb3ZlZFZlcnNpb24oY3VyKQoJbWludGluZ09wZW5NaXJyb3IgPSBvcGVuCn0KCmZ1bmMgUmVwb3J0TWF4TWludHNQZXJXYWxsZXQoY3VyIHJlYWxtLCBtYXggaW50NjQpIHsKCWFzc2VydENhbGxlcklzQXBwcm92ZWRWZXJzaW9uKGN1cikKCW1heE1pbnRzUGVyV2FsbGV0TWlycm9yID0gbWF4Cn0KCmZ1bmMgQWdlKHRpZCBncmM3MjEuVG9rZW5JRCkgaW50NjQgewoJaCA6PSBtaW50SGVpZ2h0LkdldCh0aWQuU3RyaW5nKCkpCglpZiBoID09IG5pbCB7CgkJcmV0dXJuIC0xCgl9CglyZXR1cm4gcnVudGltZS5DaGFpbkhlaWdodCgpIC0gaC4oaW50NjQpCn0KCmZ1bmMgSXNSZXZlYWxlZCh0aWQgZ3JjNzIxLlRva2VuSUQpIGJvb2wgewoJaWYgXywgaXNUcmFpdFByZXNldCA6PSBzZWFsZWREYXRhLkdldCh0aWQuU3RyaW5nKCkpLih0cmFpdFByZXNldCk7ICFpc1RyYWl0UHJlc2V0IHsKCQlyZXR1cm4gdHJ1ZQoJfQoJYWdlIDo9IEFnZSh0aWQpCglyZXR1cm4gYWdlID49IDAgJiYgYWdlID49IFJldmVhbERlbGF5QmxvY2tzCn0KCmZ1bmMgY3VycmVudE1ldGFkYXRhKHRpZCBncmM3MjEuVG9rZW5JRCkgKE1ldGFkYXRhLCBlcnJvcikgewoJaWYgXywgZXJyIDo9IHRva2VuLk93bmVyT2YodGlkKTsgZXJyICE9IG5pbCB7CgkJcmV0dXJuIE1ldGFkYXRhe30sIGVycgoJfQoJdHAsIG9rIDo9IHNlYWxlZERhdGEuR2V0KHRpZC5TdHJpbmcoKSkuKHRyYWl0UHJlc2V0KQoJaWYgIW9rIHsKCQlyZXR1cm4gTWV0YWRhdGF7fSwgZ3JjNzIxLkVyckludmFsaWRUb2tlbklkCgl9CglpZiAhSXNSZXZlYWxlZCh0aWQpIHsKCQlyZXR1cm4gc2VhbGVkTWV0YWRhdGEoKSwgbmlsCgl9CglyZXR1cm4gYXNzZW1ibGVkTWV0YWRhdGEodGlkLCB0cCksIG5pbAp9CgpmdW5jIHNlYWxlZE1ldGFkYXRhKCkgTWV0YWRhdGEgewoJcmV0dXJuIE1ldGFkYXRhe05hbWU6ICJTZWFsZWQiLCBJbWFnZTogc2VhbGVkSW1hZ2UsIEJhY2tncm91bmRDb2xvcjogIjBhMGIxMCIsIEF0dHJpYnV0ZXM6IFtdVHJhaXR7e1RyYWl0VHlwZTogIlN0YXR1cyIsIFZhbHVlOiAiU2VhbGVkIn19fQp9CgpmdW5jIGxpc3RSb3codGlkIGdyYzcyMS5Ub2tlbklEKSAobmFtZSwgaW1hZ2Ugc3RyaW5nKSB7Cgl0cCwgb2sgOj0gc2VhbGVkRGF0YS5HZXQodGlkLlN0cmluZygpKS4odHJhaXRQcmVzZXQpCglpZiAhb2sgewoJCXJldHVybiAiVW50aXRsZWQiLCAiIgoJfQoJaWYgIUlzUmV2ZWFsZWQodGlkKSB7CgkJcmV0dXJuICJTZWFsZWQiLCBzZWFsZWRJbWFnZQoJfQoJbmFtZSA9IHRyYWl0T25seU1ldGFkYXRhKHRwKS5OYW1lCglzdmcgOj0gYXJ0cGtnLlJlbmRlclRva2VuVGh1bWJTVkcodHAuQ2hhaW4sIHRwLk1ldGFsLCB0cC5TaGFwZUlkeCwgdHAuQ29sb3JJZHgsIHRwLkFjdGl2ZSwgdGlkLlN0cmluZygpKQoJcmV0dXJuIG5hbWUsICJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LCIgKyBiYXNlNjQuU3RkRW5jb2RpbmcuRW5jb2RlVG9TdHJpbmcoW11ieXRlKHN2ZykpCn0KCmZ1bmMgYXNzZW1ibGVkTWV0YWRhdGEodGlkIGdyYzcyMS5Ub2tlbklELCB0cCB0cmFpdFByZXNldCkgTWV0YWRhdGEgewoJc3ZnLCBzdG9uZSwgXywgY29sb3JOYW1lIDo9IGFydHBrZy5SZW5kZXJUb2tlblNWRyh0cC5DaGFpbiwgdHAuTWV0YWwsIHRwLlNoYXBlSWR4LCB0cC5Db2xvcklkeCwgdHAuQWN0aXZlLCB0aWQuU3RyaW5nKCkpCglzaGFwZU5hbWUgOj0gYXJ0cGtnLlNoYXBlTmFtZXNbdHAuU2hhcGVJZHhdCglpZiBzdG9uZSA9PSAiUGVhcmwiIHsKCQlzaGFwZU5hbWUgPSBhcnRwa2cuUGVhcmxTaGFwZU5hbWVzW3RwLlNoYXBlSWR4XQoJfQoJaW1hZ2UgOj0gImRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsIiArIGJhc2U2NC5TdGRFbmNvZGluZy5FbmNvZGVUb1N0cmluZyhbXWJ5dGUoc3ZnKSkKCXN0YXR1cyA6PSAiU3Vuc2V0IgoJaWYgdHAuQWN0aXZlIHsKCQlzdGF0dXMgPSAiQWN0aXZlIgoJfQoJcmV0dXJuIE1ldGFkYXRhewoJCU5hbWU6ICAgICAgICAgICAgcGllY2VEaXNwbGF5TmFtZShjb2xvck5hbWUsIHN0b25lLCBzaGFwZU5hbWUsIHRwLk1ldGFsLCB0cC5DaGFpbiksCgkJRGVzY3JpcHRpb246ICAgICB1Zm10LlNwcmludGYoIiVzICVzICVzIHNldCBpbiAlcyAlcyByaW5nLCBtaW50ZWQgb24gJXMuIiwgYXJ0aWNsZShjb2xvck5hbWUpLCBjb2xvck5hbWUsIHNoYXBlTmFtZSwgc3RyaW5ncy5Ub0xvd2VyKGFydGljbGUodHAuTWV0YWwpKSwgdHAuTWV0YWwsIHRwLkNoYWluKSwKCQlJbWFnZTogICAgICAgICAgIGltYWdlLAoJCUJhY2tncm91bmRDb2xvcjogIjBhMGIxMCIsCgkJQXR0cmlidXRlczogW11UcmFpdHsKCQkJe1RyYWl0VHlwZTogIkNoYWluIiwgVmFsdWU6IHRwLkNoYWlufSwKCQkJe1RyYWl0VHlwZTogIlN0b25lIiwgVmFsdWU6IHN0b25lfSwKCQkJe1RyYWl0VHlwZTogIlNoYXBlIiwgVmFsdWU6IHNoYXBlTmFtZX0sCgkJCXtUcmFpdFR5cGU6ICJDb2xvciIsIFZhbHVlOiBjb2xvck5hbWV9LAoJCQl7VHJhaXRUeXBlOiAiUmluZyIsIFZhbHVlOiB0cC5NZXRhbH0sCgkJCXtUcmFpdFR5cGU6ICJTdGF0dXMiLCBWYWx1ZTogc3RhdHVzfSwKCQkJe1RyYWl0VHlwZTogIlJhcml0eSIsIFZhbHVlOiB0cC5SYXJpdHl9LAoJCX0sCgl9Cn0KCmZ1bmMgYXJ0aWNsZSh3b3JkIHN0cmluZykgc3RyaW5nIHsKCWlmIHdvcmQgIT0gIiIgJiYgc3RyaW5ncy5Db250YWluc1J1bmUoIkFFSU9VYWVpb3UiLCBydW5lKHdvcmRbMF0pKSB7CgkJcmV0dXJuICJBbiIKCX0KCXJldHVybiAiQSIKfQoKZnVuYyBwaWVjZURpc3BsYXlOYW1lKGNvbG9yTmFtZSwgc3RvbmUsIHNoYXBlLCBtZXRhbCwgY2hhaW4gc3RyaW5nKSBzdHJpbmcgewoJcGllY2UgOj0gY29sb3JOYW1lICsgIiAiICsgc3RvbmUgKyAiICIgKyBzaGFwZQoJaWYgc3RvbmUgPT0gIlF1YXJ0eiIgfHwgc3RvbmUgPT0gIiIgewoJCXBpZWNlID0gY29sb3JOYW1lICsgIiAiICsgc2hhcGUKCX0KCXJldHVybiBwaWVjZSArICIgwrcgIiArIG1ldGFsICsgIiBSaW5nIMK3ICIgKyBjaGFpbgp9CgpmdW5jIGNvbG9yTmFtZUZvcihzdG9uZSBzdHJpbmcsIGNvbG9ySWR4IGludCkgc3RyaW5nIHsKCXBhaXJzIDo9IHN0cmluZ3MuU3BsaXQoYXJ0cGtnLkNvbG9yUGFsZXR0ZUNTVihzdG9uZSksICI7IikKCWlmIGNvbG9ySWR4IDwgMCB8fCBjb2xvcklkeCA+PSBsZW4ocGFpcnMpIHsKCQlyZXR1cm4gIiIKCX0KCXBhcnRzIDo9IHN0cmluZ3MuU3BsaXROKHBhaXJzW2NvbG9ySWR4XSwgIjoiLCAyKQoJaWYgbGVuKHBhcnRzKSAhPSAyIHsKCQlyZXR1cm4gIiIKCX0KCXJldHVybiBwYXJ0c1sxXQp9CgpmdW5jIHRyYWl0T25seU1ldGFkYXRhKHRwIHRyYWl0UHJlc2V0KSBNZXRhZGF0YSB7CglzdG9uZSA6PSBhcnRwa2cuU3RvbmVGb3JDaGFpbih0cC5DaGFpbikKCXNoYXBlTmFtZSA6PSBhcnRwa2cuU2hhcGVOYW1lc1t0cC5TaGFwZUlkeF0KCWlmIHN0b25lID09ICJQZWFybCIgewoJCXNoYXBlTmFtZSA9IGFydHBrZy5QZWFybFNoYXBlTmFtZXNbdHAuU2hhcGVJZHhdCgl9Cgljb2xvck5hbWUgOj0gY29sb3JOYW1lRm9yKHN0b25lLCB0cC5Db2xvcklkeCkKCXN0YXR1cyA6PSAiU3Vuc2V0IgoJaWYgdHAuQWN0aXZlIHsKCQlzdGF0dXMgPSAiQWN0aXZlIgoJfQoJcmV0dXJuIE1ldGFkYXRhewoJCU5hbWU6ICAgICAgICAgICAgcGllY2VEaXNwbGF5TmFtZShjb2xvck5hbWUsIHN0b25lLCBzaGFwZU5hbWUsIHRwLk1ldGFsLCB0cC5DaGFpbiksCgkJRGVzY3JpcHRpb246ICAgICB1Zm10LlNwcmludGYoIiVzICVzICVzIHNldCBpbiAlcyAlcyByaW5nLCBtaW50ZWQgb24gJXMuIiwgYXJ0aWNsZShjb2xvck5hbWUpLCBjb2xvck5hbWUsIHNoYXBlTmFtZSwgc3RyaW5ncy5Ub0xvd2VyKGFydGljbGUodHAuTWV0YWwpKSwgdHAuTWV0YWwsIHRwLkNoYWluKSwKCQlCYWNrZ3JvdW5kQ29sb3I6ICIwYTBiMTAiLAoJCUF0dHJpYnV0ZXM6IFtdVHJhaXR7CgkJCXtUcmFpdFR5cGU6ICJDaGFpbiIsIFZhbHVlOiB0cC5DaGFpbn0sCgkJCXtUcmFpdFR5cGU6ICJTdG9uZSIsIFZhbHVlOiBzdG9uZX0sCgkJCXtUcmFpdFR5cGU6ICJTaGFwZSIsIFZhbHVlOiBzaGFwZU5hbWV9LAoJCQl7VHJhaXRUeXBlOiAiQ29sb3IiLCBWYWx1ZTogY29sb3JOYW1lfSwKCQkJe1RyYWl0VHlwZTogIlJpbmciLCBWYWx1ZTogdHAuTWV0YWx9LAoJCQl7VHJhaXRUeXBlOiAiU3RhdHVzIiwgVmFsdWU6IHN0YXR1c30sCgkJCXtUcmFpdFR5cGU6ICJSYXJpdHkiLCBWYWx1ZTogdHAuUmFyaXR5fSwKCQl9LAoJfQp9CgpmdW5jIFRva2VuVVJJKHRpZCBncmM3MjEuVG9rZW5JRCkgKHN0cmluZywgZXJyb3IpIHsKCW1ldGFkYXRhLCBlcnIgOj0gY3VycmVudE1ldGFkYXRhKHRpZCkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiAiIiwgZXJyCgl9CglyZXR1cm4gbWV0YWRhdGEuSW1hZ2UsIG5pbAp9CgpmdW5jIFRva2VuTWV0YWRhdGEodGlkIGdyYzcyMS5Ub2tlbklEKSAoc3RyaW5nLCBlcnJvcikgewoJaWYgXywgZXJyIDo9IHRva2VuLk93bmVyT2YodGlkKTsgZXJyICE9IG5pbCB7CgkJcmV0dXJuICIiLCBlcnIKCX0KCW0gOj0gc2VhbGVkTWV0YWRhdGEoKQoJaWYgdHAsIG9rIDo9IHNlYWxlZERhdGEuR2V0KHRpZC5TdHJpbmcoKSkuKHRyYWl0UHJlc2V0KTsgb2sgJiYgSXNSZXZlYWxlZCh0aWQpIHsKCQltID0gdHJhaXRPbmx5TWV0YWRhdGEodHApCgl9CgltLkltYWdlID0gIiIKCXJldHVybiBtZXRhZGF0YUpTT04obSwgInRyYWl0VHlwZSIsICJiYWNrZ3JvdW5kQ29sb3IiKSwgbmlsCn0KCmZ1bmMgVG9rZW5KU09OKHRpZCBncmM3MjEuVG9rZW5JRCkgKHN0cmluZywgZXJyb3IpIHsKCW1ldGFkYXRhLCBlcnIgOj0gY3VycmVudE1ldGFkYXRhKHRpZCkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiAiIiwgZXJyCgl9CglyZXR1cm4gImRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsIiArIGJhc2U2NC5TdGRFbmNvZGluZy5FbmNvZGVUb1N0cmluZyhbXWJ5dGUobWV0YWRhdGFKU09OKG1ldGFkYXRhLCAidHJhaXRfdHlwZSIsICJiYWNrZ3JvdW5kX2NvbG9yIikpKSwgbmlsCn0KCmZ1bmMganNvbkVzY2FwZShzIHN0cmluZykgc3RyaW5nIHsKCXZhciBiIHN0cmluZ3MuQnVpbGRlcgoJZm9yIGkgOj0gMDsgaSA8IGxlbihzKTsgaSsrIHsKCQljIDo9IHNbaV0KCQlzd2l0Y2ggYyB7CgkJY2FzZSAnIic6CgkJCWIuV3JpdGVTdHJpbmcoYFwiYCkKCQljYXNlICdcXCc6CgkJCWIuV3JpdGVTdHJpbmcoYFxcYCkKCQlkZWZhdWx0OgoJCQliLldyaXRlQnl0ZShjKQoJCX0KCX0KCXJldHVybiBiLlN0cmluZygpCn0KCmZ1bmMgbWV0YWRhdGFKU09OKG0gTWV0YWRhdGEsIHRyYWl0S2V5LCBiZ0tleSBzdHJpbmcpIHN0cmluZyB7Cgl2YXIgYiBzdHJpbmdzLkJ1aWxkZXIKCWIuV3JpdGVTdHJpbmcoYHsibmFtZSI6ImApCgliLldyaXRlU3RyaW5nKGpzb25Fc2NhcGUobS5OYW1lKSkKCWIuV3JpdGVTdHJpbmcoYCIsImRlc2NyaXB0aW9uIjoiYCkKCWIuV3JpdGVTdHJpbmcoanNvbkVzY2FwZShtLkRlc2NyaXB0aW9uKSkKCWIuV3JpdGVTdHJpbmcoYCJgKQoJaWYgbS5JbWFnZSAhPSAiIiB7CgkJYi5Xcml0ZVN0cmluZyhgLCJpbWFnZSI6ImApCgkJYi5Xcml0ZVN0cmluZyhqc29uRXNjYXBlKG0uSW1hZ2UpKQoJCWIuV3JpdGVTdHJpbmcoYCJgKQoJfQoJaWYgbS5CYWNrZ3JvdW5kQ29sb3IgIT0gIiIgewoJCWIuV3JpdGVTdHJpbmcoYCwiYCArIGJnS2V5ICsgYCI6ImApCgkJYi5Xcml0ZVN0cmluZyhqc29uRXNjYXBlKG0uQmFja2dyb3VuZENvbG9yKSkKCQliLldyaXRlU3RyaW5nKGAiYCkKCX0KCWIuV3JpdGVTdHJpbmcoYCwiYXR0cmlidXRlcyI6W2ApCglmb3IgaSwgdCA6PSByYW5nZSBtLkF0dHJpYnV0ZXMgewoJCWlmIGkgPiAwIHsKCQkJYi5Xcml0ZVN0cmluZygiLCIpCgkJfQoJCWIuV3JpdGVTdHJpbmcoYHsiYCArIHRyYWl0S2V5ICsgYCI6ImApCgkJYi5Xcml0ZVN0cmluZyhqc29uRXNjYXBlKHQuVHJhaXRUeXBlKSkKCQliLldyaXRlU3RyaW5nKGAiLCJ2YWx1ZSI6ImApCgkJYi5Xcml0ZVN0cmluZyhqc29uRXNjYXBlKHQuVmFsdWUpKQoJCWIuV3JpdGVTdHJpbmcoYCJ9YCkKCX0KCWIuV3JpdGVTdHJpbmcoIl19IikKCXJldHVybiBiLlN0cmluZygpCn0KCmZ1bmMgQXBwcm92ZShjdXIgcmVhbG0sIHRvIGFkZHJlc3MsIHRpZCBncmM3MjEuVG9rZW5JRCkgewoJY2hlY2tFcnIobGVkZ2VyLkFwcHJvdmUoY2FsbGVyQWRkcmVzcygpLCB0bywgdGlkKSkKfQoKZnVuYyBTZXRBcHByb3ZhbEZvckFsbChjdXIgcmVhbG0sIG9wZXJhdG9yIGFkZHJlc3MsIGFwcHJvdmVkIGJvb2wpIHsKCWNoZWNrRXJyKGxlZGdlci5TZXRBcHByb3ZhbEZvckFsbChjYWxsZXJBZGRyZXNzKCksIG9wZXJhdG9yLCBhcHByb3ZlZCkpCn0KCmZ1bmMgVHJhbnNmZXJGcm9tKGN1ciByZWFsbSwgZnJvbSwgdG8gYWRkcmVzcywgdGlkIGdyYzcyMS5Ub2tlbklEKSB7CgljaGVja0VycihsZWRnZXIuVHJhbnNmZXJGcm9tKGNhbGxlckFkZHJlc3MoKSwgZnJvbSwgdG8sIHRpZCkpCn0KCmZ1bmMgU2FmZVRyYW5zZmVyRnJvbShjdXIgcmVhbG0sIGZyb20sIHRvIGFkZHJlc3MsIHRpZCBncmM3MjEuVG9rZW5JRCkgewoJY2hlY2tFcnIobGVkZ2VyLlRyYW5zZmVyRnJvbShjYWxsZXJBZGRyZXNzKCksIGZyb20sIHRvLCB0aWQpKQp9CgpmdW5jIEJ1cm4oY3VyIHJlYWxtLCB0aWQgZ3JjNzIxLlRva2VuSUQpIHsKCWNhbGxlciA6PSBjYWxsZXJBZGRyZXNzKCkKCW93bmVyLCBlcnIgOj0gdG9rZW4uT3duZXJPZih0aWQpCgljaGVja0VycihlcnIpCglpZiBjYWxsZXIgIT0gb3duZXIgewoJCXBhbmljKGdyYzcyMS5FcnJDYWxsZXJJc05vdE93bmVyKQoJfQoKCWtleSA6PSB0aWQuU3RyaW5nKCkKCWFyY2hpdmVkLCBfIDo9IHNlYWxlZERhdGEuR2V0KGtleSkuKHRyYWl0UHJlc2V0KQoKCWlmIGNvbWJvS2V5LCBvayA6PSB0b2tlbkNvbWJvS2V5cy5HZXQoa2V5KS4oc3RyaW5nKTsgb2sgewoJCW1pbnRlZFRyYWl0Q29tYm9zLlJlbW92ZShjb21ib0tleSkKCQl0b2tlbkNvbWJvS2V5cy5SZW1vdmUoa2V5KQoJfQoJc2VhbGVkRGF0YS5SZW1vdmUoa2V5KQoJbWludEhlaWdodC5SZW1vdmUoa2V5KQoKCWNoZWNrRXJyKGxlZGdlci5CdXJuKHRpZCkpCgoJYnVybmVkUmVjb3Jkcy5TZXQoa2V5LCBidXJuUmVjb3JkewoJCUJ1cm5lZEJ5OiAgIGNhbGxlciwKCQlCdXJuSGVpZ2h0OiBydW50aW1lLkNoYWluSGVpZ2h0KCksCgkJVHJhaXRzOiAgICAgYXJjaGl2ZWQsCgl9KQoJYnVybmVkSURzID0gYXBwZW5kKGJ1cm5lZElEcywgdGlkKQp9CgpmdW5jIHRyYWl0c1RvQ1NWKGF0dHJzIFtdVHJhaXQpIHN0cmluZyB7CglwYWlycyA6PSBtYWtlKFtdc3RyaW5nLCBsZW4oYXR0cnMpKQoJZm9yIGksIGEgOj0gcmFuZ2UgYXR0cnMgewoJCXBhaXJzW2ldID0gYS5UcmFpdFR5cGUgKyAiPSIgKyBhLlZhbHVlCgl9CglyZXR1cm4gc3RyaW5ncy5Kb2luKHBhaXJzLCAiOyIpCn0KCmZ1bmMgVG9rZW5TdW1tYXJ5KHRpZCBncmM3MjEuVG9rZW5JRCkgKHN0cmluZywgZXJyb3IpIHsgcmV0dXJuIHRva2VuU3VtbWFyeSh0aWQsIGZhbHNlKSB9CgpmdW5jIHRodW1iU3VtbWFyeSh0aWQgZ3JjNzIxLlRva2VuSUQpIChzdHJpbmcsIGVycm9yKSB7IHJldHVybiB0b2tlblN1bW1hcnkodGlkLCB0cnVlKSB9CgpmdW5jIHRva2VuU3VtbWFyeSh0aWQgZ3JjNzIxLlRva2VuSUQsIHRodW1iIGJvb2wpIChzdHJpbmcsIGVycm9yKSB7Cglvd25lciwgZXJyIDo9IHRva2VuLk93bmVyT2YodGlkKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuICIiLCBlcnIKCX0KCXZhciBtZXRhZGF0YSBNZXRhZGF0YQoJaWYgdHAsIG9rIDo9IHNlYWxlZERhdGEuR2V0KHRpZC5TdHJpbmcoKSkuKHRyYWl0UHJlc2V0KTsgdGh1bWIgJiYgb2sgJiYgSXNSZXZlYWxlZCh0aWQpIHsKCQltZXRhZGF0YSA9IHRyYWl0T25seU1ldGFkYXRhKHRwKQoJCXN2ZyA6PSBhcnRwa2cuUmVuZGVyVG9rZW5UaHVtYlNWRyh0cC5DaGFpbiwgdHAuTWV0YWwsIHRwLlNoYXBlSWR4LCB0cC5Db2xvcklkeCwgdHAuQWN0aXZlLCB0aWQuU3RyaW5nKCkpCgkJbWV0YWRhdGEuSW1hZ2UgPSAiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCwiICsgYmFzZTY0LlN0ZEVuY29kaW5nLkVuY29kZVRvU3RyaW5nKFtdYnl0ZShzdmcpKQoJfSBlbHNlIHsKCQltZXRhZGF0YSwgZXJyID0gY3VycmVudE1ldGFkYXRhKHRpZCkKCQlpZiBlcnIgIT0gbmlsIHsKCQkJcmV0dXJuICIiLCBlcnIKCQl9Cgl9CgllbmMgOj0gYmFzZTY0LlN0ZEVuY29kaW5nCglmaWVsZHMgOj0gW11zdHJpbmd7CgkJdGlkLlN0cmluZygpLAoJCW93bmVyLlN0cmluZygpLAoJCWVuYy5FbmNvZGVUb1N0cmluZyhbXWJ5dGUobWV0YWRhdGEuTmFtZSkpLAoJCWVuYy5FbmNvZGVUb1N0cmluZyhbXWJ5dGUobWV0YWRhdGEuRGVzY3JpcHRpb24pKSwKCQllbmMuRW5jb2RlVG9TdHJpbmcoW11ieXRlKG1ldGFkYXRhLkltYWdlKSksCgkJIiIsIC8vIGV4dGVybmFsIFVSTDogbm9uZQoJCWVuYy5FbmNvZGVUb1N0cmluZyhbXWJ5dGUodHJhaXRzVG9DU1YobWV0YWRhdGEuQXR0cmlidXRlcykpKSwKCQllbmMuRW5jb2RlVG9TdHJpbmcoW11ieXRlKG1ldGFkYXRhLkJhY2tncm91bmRDb2xvcikpLAoJfQoJcmV0dXJuIHN0cmluZ3MuSm9pbihmaWVsZHMsICJ8IiksIG5pbAp9CgpmdW5jIENvbGxlY3Rpb25TdW1tYXJ5KHBhZ2UgaW50KSBzdHJpbmcgewoJdG90YWwgOj0gbGVuKG1pbnRlZElEcykKCWlmIHBhZ2UgPCAxIHsKCQlwYWdlID0gMQoJfQoJc3RhcnRLIDo9IChwYWdlIC0gMSkgKiBzdW1tYXJ5UGFnZVNpemUKCWVuZEsgOj0gc3RhcnRLICsgc3VtbWFyeVBhZ2VTaXplCglpZiBlbmRLID4gdG90YWwgewoJCWVuZEsgPSB0b3RhbAoJfQoJdmFyIGxpbmVzIFtdc3RyaW5nCglmb3IgayA6PSBzdGFydEs7IGsgPCBlbmRLOyBrKysgewoJCXRpZCA6PSBtaW50ZWRJRHNbdG90YWwtMS1rXQoJCWxpbmUsIGVyciA6PSB0aHVtYlN1bW1hcnkodGlkKQoJCWlmIGVyciAhPSBuaWwgewoJCQljb250aW51ZQoJCX0KCQlsaW5lcyA9IGFwcGVuZChsaW5lcywgbGluZSkKCX0KCXJldHVybiBzdHJpbmdzLkpvaW4obGluZXMsICJcbiIpCn0KCmNvbnN0ICgKCXdhbGxldFNjYW5DaHVuayA9IDEwMAoJd2FsbGV0UmVuZGVyQ2FwID0gc3VtbWFyeVBhZ2VTaXplCikKCmZ1bmMgV2FsbGV0U3VtbWFyeShvd25lciBhZGRyZXNzLCBzdGFydElkeCBpbnQ2NCkgKHN1bW1hcnkgc3RyaW5nLCBuZXh0SWR4IGludDY0KSB7Cgl0b3RhbCA6PSBsZW4obWludGVkSURzKQoJc3RhcnQgOj0gaW50KHN0YXJ0SWR4KQoJaWYgc3RhcnQgPCAwIHsKCQlzdGFydCA9IDAKCX0KCWVuZCA6PSBzdGFydCArIHdhbGxldFNjYW5DaHVuawoJaWYgZW5kID4gdG90YWwgewoJCWVuZCA9IHRvdGFsCgl9Cgl2YXIgbGluZXMgW11zdHJpbmcKCWsgOj0gc3RhcnQKCWZvciA7IGsgPCBlbmQ7IGsrKyB7CgkJaWYgbGVuKGxpbmVzKSA+PSB3YWxsZXRSZW5kZXJDYXAgewoJCQlicmVhawoJCX0KCQl0aWQgOj0gbWludGVkSURzW3RvdGFsLTEta10KCQl0b2tlbk93bmVyLCBlcnIgOj0gdG9rZW4uT3duZXJPZih0aWQpCgkJaWYgZXJyICE9IG5pbCB8fCB0b2tlbk93bmVyICE9IG93bmVyIHsKCQkJY29udGludWUKCQl9CgkJbGluZSwgZXJyIDo9IHRodW1iU3VtbWFyeSh0aWQpCgkJaWYgZXJyICE9IG5pbCB7CgkJCWNvbnRpbnVlCgkJfQoJCWxpbmVzID0gYXBwZW5kKGxpbmVzLCBsaW5lKQoJfQoJcmV0dXJuIHN0cmluZ3MuSm9pbihsaW5lcywgIlxuIiksIGludDY0KGspCn0KCmZ1bmMgQnVybmVkVG9rZW5TdW1tYXJ5KHRpZCBncmM3MjEuVG9rZW5JRCkgKHN0cmluZywgZXJyb3IpIHsKCXJhdyA6PSBidXJuZWRSZWNvcmRzLkdldCh0aWQuU3RyaW5nKCkpCglyZWMsIG9rIDo9IHJhdy4oYnVyblJlY29yZCkKCWlmICFvayB7CgkJcmV0dXJuICIiLCBncmM3MjEuRXJySW52YWxpZFRva2VuSWQKCX0KCW0gOj0gcmVjLm1ldGFkYXRhKCkKCWVuYyA6PSBiYXNlNjQuU3RkRW5jb2RpbmcKCWZpZWxkcyA6PSBbXXN0cmluZ3sKCQl0aWQuU3RyaW5nKCksCgkJcmVjLkJ1cm5lZEJ5LlN0cmluZygpLAoJCXVmbXQuU3ByaW50ZigiJWQiLCByZWMuQnVybkhlaWdodCksCgkJZW5jLkVuY29kZVRvU3RyaW5nKFtdYnl0ZShtLk5hbWUpKSwKCQllbmMuRW5jb2RlVG9TdHJpbmcoW11ieXRlKG0uRGVzY3JpcHRpb24pKSwKCQkiIiwgLy8gaW1hZ2U6IGEgYnVybiBrZWVwcyBub25lCgkJIiIsIC8vIGV4dGVybmFsIFVSTDogbm9uZQoJCWVuYy5FbmNvZGVUb1N0cmluZyhbXWJ5dGUodHJhaXRzVG9DU1YobS5BdHRyaWJ1dGVzKSkpLAoJCWVuYy5FbmNvZGVUb1N0cmluZyhbXWJ5dGUobS5CYWNrZ3JvdW5kQ29sb3IpKSwKCX0KCXJldHVybiBzdHJpbmdzLkpvaW4oZmllbGRzLCAifCIpLCBuaWwKfQoKZnVuYyBiaWdUb2tlbkltYWdlKGltYWdlIHN0cmluZykgc3RyaW5nIHsKCWNvbnN0IHByZWZpeCA9ICJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LCIKCWlmICFzdHJpbmdzLkhhc1ByZWZpeChpbWFnZSwgcHJlZml4KSB7CgkJcmV0dXJuIGltYWdlCgl9CglyYXcsIGVyciA6PSBiYXNlNjQuU3RkRW5jb2RpbmcuRGVjb2RlU3RyaW5nKGltYWdlW2xlbihwcmVmaXgpOl0pCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gaW1hZ2UKCX0KCXN2ZyA6PSBzdHJpbmcocmF3KQoJcmVzaXplZCA6PSBzdHJpbmdzLlJlcGxhY2Uoc3ZnLCBgd2lkdGg9IjE3MC4wMCIgaGVpZ2h0PSIxNzAuMDAiYCwgYHdpZHRoPSJgK3Rva2VuUGFnZUltYWdlU2l6ZStgIiBoZWlnaHQ9ImArdG9rZW5QYWdlSW1hZ2VTaXplK2AiYCwgMSkKCWlmIHJlc2l6ZWQgPT0gc3ZnIHsKCQlyZXNpemVkID0gc3RyaW5ncy5SZXBsYWNlKHN2ZywgYHdpZHRoPSIxNzAiIGhlaWdodD0iMTcwImAsIGB3aWR0aD0iYCt0b2tlblBhZ2VJbWFnZVNpemUrYCIgaGVpZ2h0PSJgK3Rva2VuUGFnZUltYWdlU2l6ZStgImAsIDEpCgl9CglyZXR1cm4gcHJlZml4ICsgYmFzZTY0LlN0ZEVuY29kaW5nLkVuY29kZVRvU3RyaW5nKFtdYnl0ZShyZXNpemVkKSkKfQoKZnVuYyBzaG9ydEFkZHIoYSBzdHJpbmcpIHN0cmluZyB7CglpZiBsZW4oYSkgPD0gMTQgewoJCXJldHVybiBhCgl9CglyZXR1cm4gYVs6Nl0gKyAi4oCmIiArIGFbbGVuKGEpLTQ6XQp9CgpmdW5jIHJlbmRlck1pbnRlZExpc3RQYWdlKGIgKnN0cmluZ3MuQnVpbGRlciwgcGFnZSBpbnQpIHsKCXRvdGFsIDo9IGxlbihtaW50ZWRJRHMpCglpZiB0b3RhbCA9PSAwIHsKCQlyZXR1cm4KCX0KCXRvdGFsUGFnZXMgOj0gKHRvdGFsICsgZ25vd2ViTGlzdExpbWl0IC0gMSkgLyBnbm93ZWJMaXN0TGltaXQKCWlmIHBhZ2UgPCAxIHsKCQlwYWdlID0gMQoJfQoJaWYgcGFnZSA+IHRvdGFsUGFnZXMgewoJCXBhZ2UgPSB0b3RhbFBhZ2VzCgl9CglzdGFydEsgOj0gKHBhZ2UgLSAxKSAqIGdub3dlYkxpc3RMaW1pdAoJZW5kSyA6PSBzdGFydEsgKyBnbm93ZWJMaXN0TGltaXQKCWlmIGVuZEsgPiB0b3RhbCB7CgkJZW5kSyA9IHRvdGFsCgl9CgoJYi5Xcml0ZVN0cmluZygiXG4jIyBNaW50ZWQgc28gZmFyXG5cbiIpCglpZiB0b3RhbFBhZ2VzID4gMSB7CgkJYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoIl9wYWdlICVkIG9mICVkIC0tICVkIG1pbnRlZCB0b3RhbF9cblxuIiwgcGFnZSwgdG90YWxQYWdlcywgdG90YWwpKQoJfQoJYi5Xcml0ZVN0cmluZygifCBJbWFnZSB8IEluZGV4IHwgTmFtZSB8IE93bmVyIHxcbnw6LS0tOnw6LS0tOnwtLS18LS0tfFxuIikKCWZvciBrIDo9IHN0YXJ0SzsgayA8IGVuZEs7IGsrKyB7CgkJdGlkIDo9IG1pbnRlZElEc1t0b3RhbC0xLWtdCgkJbGluayA6PSByZWFsbVJlbFBhdGggKyAiOnRva2VuLyIgKyB0aWQuU3RyaW5nKCkKCQlvd25lciwgZXJyIDo9IHRva2VuLk93bmVyT2YodGlkKQoJCWlmIGVyciAhPSBuaWwgewoJCQlyYXcgOj0gYnVybmVkUmVjb3Jkcy5HZXQodGlkLlN0cmluZygpKQoJCQlyZWMsIG9rIDo9IHJhdy4oYnVyblJlY29yZCkKCQkJaWYgIW9rIHsKCQkJCWNvbnRpbnVlIC8vIHNob3VsZG4ndCBoYXBwZW46IGJ1cm5lZCBidXQgbm8gYXJjaGl2ZSByZWNvcmQKCQkJfQoJCQluYW1lIDo9IHJlYy5tZXRhZGF0YSgpLk5hbWUKCQkJYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoInwgQnVybmVkIHwgWyMlc10oJXMpIHwgJXMgKGJ1cm5lZCBhdCBibG9jayAlZCkgfCAlcyB8XG4iLCB0aWQuU3RyaW5nKCksIGxpbmssIG5hbWUsIHJlYy5CdXJuSGVpZ2h0LCBzaG9ydEFkZHIocmVjLkJ1cm5lZEJ5LlN0cmluZygpKSkpCgkJCWNvbnRpbnVlCgkJfQoJCW5hbWUsIGltYWdlIDo9IGxpc3RSb3codGlkKQoJCWltZ0NlbGwgOj0gIiIKCQlpZiBpbWFnZSAhPSAiIiB7CgkJCWltZ0NlbGwgPSB1Zm10LlNwcmludGYoIlshWyVzXSglcyldKCVzKSIsIG5hbWUsIGltYWdlLCBsaW5rKQoJCX0KCQliLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigifCAlcyB8IFsjJXNdKCVzKSB8ICVzIHwgJXMgfFxuIiwgaW1nQ2VsbCwgdGlkLlN0cmluZygpLCBsaW5rLCBuYW1lLCBzaG9ydEFkZHIob3duZXIuU3RyaW5nKCkpKSkKCX0KCWIuV3JpdGVTdHJpbmcoIlxuIikKCglyZW5kZXJQYWdlTGlua3MoYiwgcGFnZSwgdG90YWxQYWdlcywgInBhZ2UiKQp9CgpmdW5jIHJlbmRlclBhZ2VMaW5rcyhiICpzdHJpbmdzLkJ1aWxkZXIsIHBhZ2UsIHRvdGFsUGFnZXMgaW50LCBsaW5rQmFzZSBzdHJpbmcpIHsKCWlmIHRvdGFsUGFnZXMgPD0gMSB7CgkJcmV0dXJuCgl9CgliLldyaXRlU3RyaW5nKCJcbiIpCglwYXJ0cyA6PSBbXXN0cmluZ3t9CglpZiBwYWdlID4gMSB7CgkJcGFydHMgPSBhcHBlbmQocGFydHMsIHVmbXQuU3ByaW50ZigiWzw8IEZpcnN0XSglczolcy8xKSIsIHJlYWxtUmVsUGF0aCwgbGlua0Jhc2UpKQoJCXBhcnRzID0gYXBwZW5kKHBhcnRzLCB1Zm10LlNwcmludGYoIls8LSBuZXdlcl0oJXM6JXMvJWQpIiwgcmVhbG1SZWxQYXRoLCBsaW5rQmFzZSwgcGFnZS0xKSkKCX0KCWxhc3RTaG93biA6PSAwCglmb3IgcCA6PSAxOyBwIDw9IHRvdGFsUGFnZXM7IHArKyB7CgkJaWYgcCAhPSAxICYmIHAgIT0gdG90YWxQYWdlcyAmJiAocCA8IHBhZ2UtcGFnZVdpbmRvdyB8fCBwID4gcGFnZStwYWdlV2luZG93KSB7CgkJCWNvbnRpbnVlCgkJfQoJCWlmIGxhc3RTaG93biAhPSAwICYmIHAgIT0gbGFzdFNob3duKzEgewoJCQlwYXJ0cyA9IGFwcGVuZChwYXJ0cywgIi4uLiIpCgkJfQoJCWlmIHAgPT0gcGFnZSB7CgkJCXBhcnRzID0gYXBwZW5kKHBhcnRzLCB1Zm10LlNwcmludGYoIioqJWQqKiIsIHApKQoJCX0gZWxzZSB7CgkJCXBhcnRzID0gYXBwZW5kKHBhcnRzLCB1Zm10LlNwcmludGYoIlslZF0oJXM6JXMvJWQpIiwgcCwgcmVhbG1SZWxQYXRoLCBsaW5rQmFzZSwgcCkpCgkJfQoJCWxhc3RTaG93biA9IHAKCX0KCWlmIHBhZ2UgPCB0b3RhbFBhZ2VzIHsKCQlwYXJ0cyA9IGFwcGVuZChwYXJ0cywgdWZtdC5TcHJpbnRmKCJbb2xkZXIgLT5dKCVzOiVzLyVkKSIsIHJlYWxtUmVsUGF0aCwgbGlua0Jhc2UsIHBhZ2UrMSkpCgkJcGFydHMgPSBhcHBlbmQocGFydHMsIHVmbXQuU3ByaW50ZigiW0xhc3QgPj5dKCVzOiVzLyVkKSIsIHJlYWxtUmVsUGF0aCwgbGlua0Jhc2UsIHRvdGFsUGFnZXMpKQoJfQoJYi5Xcml0ZVN0cmluZyhzdHJpbmdzLkpvaW4ocGFydHMsICIgLSAiKSkKCWIuV3JpdGVTdHJpbmcoIlxuIikKfQoKZnVuYyByZW5kZXJCdXJuZWRMaXN0UGFnZShiICpzdHJpbmdzLkJ1aWxkZXIsIHBhZ2UgaW50KSB7Cgl0b3RhbCA6PSBsZW4oYnVybmVkSURzKQoJaWYgdG90YWwgPT0gMCB7CgkJcmV0dXJuCgl9Cgl0b3RhbFBhZ2VzIDo9ICh0b3RhbCArIGdub3dlYkxpc3RMaW1pdCAtIDEpIC8gZ25vd2ViTGlzdExpbWl0CglpZiBwYWdlIDwgMSB7CgkJcGFnZSA9IDEKCX0KCWlmIHBhZ2UgPiB0b3RhbFBhZ2VzIHsKCQlwYWdlID0gdG90YWxQYWdlcwoJfQoJc3RhcnRLIDo9IChwYWdlIC0gMSkgKiBnbm93ZWJMaXN0TGltaXQKCWVuZEsgOj0gc3RhcnRLICsgZ25vd2ViTGlzdExpbWl0CglpZiBlbmRLID4gdG90YWwgewoJCWVuZEsgPSB0b3RhbAoJfQoKCWIuV3JpdGVTdHJpbmcoIlxuIyMgQnVybmVkIHRva2Vuc1xuXG4iKQoJaWYgdG90YWxQYWdlcyA+IDEgewoJCWIuV3JpdGVTdHJpbmcodWZtdC5TcHJpbnRmKCJfcGFnZSAlZCBvZiAlZCAtLSAlZCBidXJuZWQgdG90YWxfXG5cbiIsIHBhZ2UsIHRvdGFsUGFnZXMsIHRvdGFsKSkKCX0KCWIuV3JpdGVTdHJpbmcoInwgSW5kZXggfCBOYW1lIHwgQnVybmVkIEJ5IHwgQmxvY2sgfFxufDotLS06fC0tLXwtLS18LS0tfFxuIikKCWZvciBrIDo9IHN0YXJ0SzsgayA8IGVuZEs7IGsrKyB7CgkJdGlkIDo9IGJ1cm5lZElEc1t0b3RhbC0xLWtdCgkJcmF3IDo9IGJ1cm5lZFJlY29yZHMuR2V0KHRpZC5TdHJpbmcoKSkKCQlyZWMsIG9rIDo9IHJhdy4oYnVyblJlY29yZCkKCQlpZiAhb2sgewoJCQljb250aW51ZQoJCX0KCQluYW1lIDo9IHJlYy5tZXRhZGF0YSgpLk5hbWUKCQliLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigifCAjJXMgfCAlcyB8ICVzIHwgJWQgfFxuIiwgdGlkLlN0cmluZygpLCBuYW1lLCBzaG9ydEFkZHIocmVjLkJ1cm5lZEJ5LlN0cmluZygpKSwgcmVjLkJ1cm5IZWlnaHQpKQoJfQoJYi5Xcml0ZVN0cmluZygiXG4iKQoKCXJlbmRlclBhZ2VMaW5rcyhiLCBwYWdlLCB0b3RhbFBhZ2VzLCAiYnVybmVkL3BhZ2UiKQp9CgpmdW5jIHJlbmRlckJ1cm5lZFRva2VuUGFnZSh0aWQgZ3JjNzIxLlRva2VuSUQpIHN0cmluZyB7CglyYXcgOj0gYnVybmVkUmVjb3Jkcy5HZXQodGlkLlN0cmluZygpKQoJcmVjLCBvayA6PSByYXcuKGJ1cm5SZWNvcmQpCglpZiAhb2sgewoJCXJldHVybiByZW5kZXI0MDQoKQoJfQoJbSA6PSByZWMubWV0YWRhdGEoKQoJbmFtZSA6PSBtLk5hbWUKCXZhciBiIHN0cmluZ3MuQnVpbGRlcgoJYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoIiMgJXMgIyVzIChidXJuZWQpXG5cbls8LSBiYWNrIHRvIGNvbGxlY3Rpb25dKCVzKVxuXG4iLCBDb2xsZWN0aW9uTmFtZSwgdGlkLlN0cmluZygpLCByZWFsbVJlbFBhdGgpKQoJYi5Xcml0ZVN0cmluZygiIyMgRGV0YWlsc1xuXG4iKQoJYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoIiogKipDb2xsZWN0aW9uKio6ICVzXG4iLCBDb2xsZWN0aW9uTmFtZSkpCgliLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigiKiAqKk5hbWUqKjogJXNcbiIsIG5hbWUpKQoJYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoIiogKipJbmRleCoqOiAjJXNcbiIsIHRpZC5TdHJpbmcoKSkpCglpZiBtLkRlc2NyaXB0aW9uICE9ICIiIHsKCQliLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigiKiAqKkRlc2NyaXB0aW9uKio6ICVzXG4iLCBtLkRlc2NyaXB0aW9uKSkKCX0KCWIuV3JpdGVTdHJpbmcodWZtdC5TcHJpbnRmKCIqICoqU3RhdHVzKio6IGJ1cm5lZCBieSAlcyBhdCBibG9jayAlZFxuIiwgcmVjLkJ1cm5lZEJ5LCByZWMuQnVybkhlaWdodCkpCgliLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigiKiAqKkFyY2hpdmUqKjogW2FsbCBidXJuZWQgdG9rZW5zXSglczpidXJuZWQpXG4iLCByZWFsbVJlbFBhdGgpKQoJaWYgbGVuKG0uQXR0cmlidXRlcykgPiAwIHsKCQliLldyaXRlU3RyaW5nKCJcbiMjIFRyYWl0c1xuXG4iKQoJCWZvciBfLCBhdHRyIDo9IHJhbmdlIG0uQXR0cmlidXRlcyB7CgkJCWIuV3JpdGVTdHJpbmcodWZtdC5TcHJpbnRmKCIqICoqJXMqKjogJXNcbiIsIGF0dHIuVHJhaXRUeXBlLCBhdHRyLlZhbHVlKSkKCQl9Cgl9CglyZXR1cm4gYi5TdHJpbmcoKQp9CgpmdW5jIHJlbmRlcjQwNCgpIHN0cmluZyB7CglyZXR1cm4gdWZtdC5TcHJpbnRmKCIjIDQwNFxuXG5bPC0gYmFjayB0byBjb2xsZWN0aW9uXSglcylcbiIsIHJlYWxtUmVsUGF0aCkKfQoKZnVuYyBSZW5kZXIocGF0aCBzdHJpbmcpIHN0cmluZyB7CglpZiBwYXRoID09ICIiIHsKCQl2YXIgYiBzdHJpbmdzLkJ1aWxkZXIKCQliLldyaXRlU3RyaW5nKHRva2VuLlJlbmRlckhvbWUoKSkKCQliLldyaXRlU3RyaW5nKCJcbiMjIEFib3V0XG5cbiIpCgkJYi5Xcml0ZVN0cmluZyhDb2xsZWN0aW9uTmFtZSArICI6IGVhY2ggcGllY2UncyBDaGFpbiB0cmFpdCBuYW1lcyBhIGduby5sYW5kIGNoYWluIGdlbmVyYXRpb24sIGFuZCBpdHMgc3RvbmUgaXMgdGhhdCBjaGFpbidzIHJlYWwgc3RvbmUgLS0gVG9wYXosIFNhcHBoaXJlLCBQZWFybCwgRGlhbW9uZCBmb3IgbWFpbm5ldCwgUXVhcnR6IGZvciB0aGUgdGVzdG5ldHMgd2l0aG91dCBvbmUuIE9ubHkgcmVhbCBjdXRzIGFuZCBjb2xvdXJzOyBldmVyeSBpbWFnZSBpcyBkcmF3biBvbi1jaGFpbi4gRGVsYXllZC1yZXZlYWwgbWludCAocmVhbCBtZXRhZGF0YSBzZWFsZWQgZm9yIGEgc2hvcnQgZGVsYXkgYWZ0ZXIgbWludGluZykuXG5cbiIpCgkJYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoIiogKipPd25lcioqOiAlc1xuIiwgT3duZXIoKSkpCgkJYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoIiogKipBc3NlbWJsZWQgdHJhaXQgY29tYmluYXRpb25zIG1pbnRlZCoqOiAlZFxuIiwgaW50NjQobWludGVkVHJhaXRDb21ib3MuU2l6ZSgpKSkpCgkJYi5Xcml0ZVN0cmluZygiKiAqKk1heCBzdXBwbHkqKjogdW5saW1pdGVkXG4iKQoJCWlmIG1pbnRpbmdPcGVuTWlycm9yIHsKCQkJYi5Xcml0ZVN0cmluZygiKiAqKk1pbnRpbmcqKjogb3BlblxuIikKCQl9IGVsc2UgewoJCQliLldyaXRlU3RyaW5nKCIqICoqTWludGluZyoqOiBjbG9zZWRcbiIpCgkJfQoJCWlmIG1pbnRQcmljZVVnbm90ID4gMCB7CgkJCWIuV3JpdGVTdHJpbmcodWZtdC5TcHJpbnRmKCIqICoqTWludCBwcmljZSoqOiAlZCB1Z25vdFxuIiwgbWludFByaWNlVWdub3QpKQoJCX0gZWxzZSB7CgkJCWIuV3JpdGVTdHJpbmcoIiogKipNaW50IHByaWNlKio6IGZyZWVcbiIpCgkJfQoJCWIuV3JpdGVTdHJpbmcodWZtdC5TcHJpbnRmKCIqICoqUmV2ZWFsIGRlbGF5Kio6ICVkIGJsb2NrKHMpXG4iLCBSZXZlYWxEZWxheUJsb2NrcykpCgkJaWYgbWF4TWludHNQZXJXYWxsZXRNaXJyb3IgPiAwIHsKCQkJYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoIiogKipNYXggbWludHMgcGVyIHdhbGxldCoqOiAlZFxuIiwgbWF4TWludHNQZXJXYWxsZXRNaXJyb3IpKQoJCX0gZWxzZSB7CgkJCWIuV3JpdGVTdHJpbmcoIiogKipNYXggbWludHMgcGVyIHdhbGxldCoqOiB1bmxpbWl0ZWRcbiIpCgkJfQoJCWlmIHJveWFsdHlCcHMgPiAwIHsKCQkJYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoIiogKipTZWNvbmRhcnkgc2FsZSByb3lhbHR5Kio6ICVkLiUwMmQlJSAoRUlQLTI5ODEgUm95YWx0eUluZm8pXG4iLCByb3lhbHR5QnBzLzEwMCwgcm95YWx0eUJwcyUxMDApKQoJCX0KCQlpZiBsZW4oYnVybmVkSURzKSA+IDAgewoJCQliLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigiKiAqKkJ1cm5lZCoqOiAlZCAtLSBbdmlldyBidXJuZWQgdG9rZW5zIC0+XSglczpidXJuZWQpXG4iLCBsZW4oYnVybmVkSURzKSwgcmVhbG1SZWxQYXRoKSkKCQl9CgoJCXJlbmRlck1pbnRlZExpc3RQYWdlKCZiLCAxKQoJCXJldHVybiBiLlN0cmluZygpCgl9CgoJcGFydHMgOj0gc3RyaW5ncy5TcGxpdChwYXRoLCAiLyIpCglpZiBsZW4ocGFydHMpID09IDIgJiYgcGFydHNbMF0gPT0gInBhZ2UiIHsKCQlwYWdlLCBlcnIgOj0gc3RyY29udi5BdG9pKHBhcnRzWzFdKQoJCWlmIGVyciAhPSBuaWwgfHwgcGFnZSA8IDEgewoJCQlyZXR1cm4gcmVuZGVyNDA0KCkKCQl9CgkJdmFyIGIgc3RyaW5ncy5CdWlsZGVyCgkJYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoIiMgJXMgLS0gbWludGVkIHRva2Vuc1xuXG5bPC0gYmFjayB0byBjb2xsZWN0aW9uXSglcylcbiIsIENvbGxlY3Rpb25OYW1lLCByZWFsbVJlbFBhdGgpKQoJCXJlbmRlck1pbnRlZExpc3RQYWdlKCZiLCBwYWdlKQoJCXJldHVybiBiLlN0cmluZygpCgl9CglpZiBwYXJ0c1swXSA9PSAiYnVybmVkIiB7CgkJcGFnZSA6PSAxCgkJaWYgbGVuKHBhcnRzKSA9PSAzICYmIHBhcnRzWzFdID09ICJwYWdlIiB7CgkJCXAsIGVyciA6PSBzdHJjb252LkF0b2kocGFydHNbMl0pCgkJCWlmIGVyciAhPSBuaWwgfHwgcCA8IDEgewoJCQkJcmV0dXJuIHJlbmRlcjQwNCgpCgkJCX0KCQkJcGFnZSA9IHAKCQl9IGVsc2UgaWYgbGVuKHBhcnRzKSAhPSAxIHsKCQkJcmV0dXJuIHJlbmRlcjQwNCgpCgkJfQoJCXZhciBiIHN0cmluZ3MuQnVpbGRlcgoJCWIuV3JpdGVTdHJpbmcodWZtdC5TcHJpbnRmKCIjICVzIC0tIGJ1cm5lZCB0b2tlbnNcblxuWzwtIGJhY2sgdG8gY29sbGVjdGlvbl0oJXMpXG4iLCBDb2xsZWN0aW9uTmFtZSwgcmVhbG1SZWxQYXRoKSkKCQlyZW5kZXJCdXJuZWRMaXN0UGFnZSgmYiwgcGFnZSkKCQlyZXR1cm4gYi5TdHJpbmcoKQoJfQoJaWYgbGVuKHBhcnRzKSA9PSAyICYmIHBhcnRzWzBdID09ICJ0b2tlbiIgewoJCXRpZCA6PSBncmM3MjEuVG9rZW5JRChwYXJ0c1sxXSkKCQlvd25lciwgZXJyIDo9IHRva2VuLk93bmVyT2YodGlkKQoJCWlmIGVyciAhPSBuaWwgewoJCQlyZXR1cm4gcmVuZGVyQnVybmVkVG9rZW5QYWdlKHRpZCkKCQl9CgkJbWV0YWRhdGEsIF8gOj0gY3VycmVudE1ldGFkYXRhKHRpZCkKCQl2YXIgYiBzdHJpbmdzLkJ1aWxkZXIKCQliLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigiIyAlcyAjJXNcblxuWzwtIGJhY2sgdG8gY29sbGVjdGlvbl0oJXMpXG5cbiIsIENvbGxlY3Rpb25OYW1lLCB0aWQuU3RyaW5nKCksIHJlYWxtUmVsUGF0aCkpCgkJaW1hZ2UgOj0gbWV0YWRhdGEuSW1hZ2UKCQluYW1lIDo9IG1ldGFkYXRhLk5hbWUKCQlpZiBuYW1lID09ICIiIHsKCQkJbmFtZSA9ICJVbnRpdGxlZCIKCQl9CgkJaWYgaW1hZ2UgIT0gIiIgewoJCQliLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigiIVslc10oJXMpXG5cbiIsIG5hbWUsIGJpZ1Rva2VuSW1hZ2UoaW1hZ2UpKSkKCQl9CgoJCWIuV3JpdGVTdHJpbmcoIiMjIERldGFpbHNcblxuIikKCQliLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigiKiAqKkNvbGxlY3Rpb24qKjogJXNcbiIsIENvbGxlY3Rpb25OYW1lKSkKCQliLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigiKiAqKk5hbWUqKjogJXNcbiIsIG5hbWUpKQoJCWIuV3JpdGVTdHJpbmcodWZtdC5TcHJpbnRmKCIqICoqSW5kZXgqKjogIyVzXG4iLCB0aWQuU3RyaW5nKCkpKQoJCWlmIG1ldGFkYXRhLkRlc2NyaXB0aW9uICE9ICIiIHsKCQkJYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoIiogKipEZXNjcmlwdGlvbioqOiAlc1xuIiwgbWV0YWRhdGEuRGVzY3JpcHRpb24pKQoJCX0KCQliLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigiKiAqKk93bmVyKio6ICVzXG4iLCBvd25lcikpCgkJYi5Xcml0ZVN0cmluZyh1Zm10LlNwcmludGYoIiogKipSZXZlYWxlZCoqOiAldCAoYWdlICVkIGJsb2NrKHMpKVxuIiwgSXNSZXZlYWxlZCh0aWQpLCBBZ2UodGlkKSkpCgoJCWlmIGxlbihtZXRhZGF0YS5BdHRyaWJ1dGVzKSA+IDAgewoJCQliLldyaXRlU3RyaW5nKCJcbiMjIFRyYWl0c1xuXG4iKQoJCQlmb3IgXywgYXR0ciA6PSByYW5nZSBtZXRhZGF0YS5BdHRyaWJ1dGVzIHsKCQkJCWIuV3JpdGVTdHJpbmcodWZtdC5TcHJpbnRmKCIqICoqJXMqKjogJXNcbiIsIGF0dHIuVHJhaXRUeXBlLCBhdHRyLlZhbHVlKSkKCQkJfQoJCX0KCQlyZXR1cm4gYi5TdHJpbmcoKQoJfQoKCXJldHVybiByZW5kZXI0MDQoKQp9CgpmdW5jIGNoZWNrRXJyKGVyciBlcnJvcikgewoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQp9CiIiChMvZ25vLk1lbVBhY2thZ2VUeXBlEgsKCU1QVXNlckFsbCINMTcwMDAwMDB1Z25vdBIRCNj7gC8SCjQ5MjkxdWdub3QaqAEKOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiECZnmjxh8z1An/XbR9f70VPxX5TQTu0HjqzAQDtnm7MVASQI3Tj05W7XEmNYo93S+kvyhhK0M/NrzAZS7rmgCn4y+RPfjjM5VEXsXdB3ndwuOSRYgNg/JIxXJiOCqLxXfYHsIaKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU=