Transaction executed successfully

Transaction Details

Inspect execution, participants, message data, gas usage, events and raw transaction data.

Transaction hash
B70D79BB03F25217A49F830144095AD6ED5B8AB7DBDF13A7CA90EFB8D0704945

Transaction overview

Status
Success
Execution completed
Block
#380568
Included in block
Message Type
m_addpkg
Primary message

Execution summary

TX INDEX
0
Position in block
GAS WANTED
150,000,000
Requested gas limit
GAS USED
41,882,390
Gas consumed
FEE
250000ugnot
Transaction fee

Participants

Sender
Package / Realm
Not available
Memo
None

Message

Message #1
m_addpkg
Caller
Arguments
g1z0c0wrmwpzpd0gq4q67hl9508dtgv4epr0z5ml

Execution log

msg:0,success:true,log:,events:[]

Events

No events emitted by this transaction.

Raw encoded transaction

Co3dAQoML3ZtLm1fYWRkcGtnEvvcAQooZzF6MGMwd3Jtd3B6cGQwZ3E0cTY3aGw5NTA4ZHRndjRlcHIwejVtbBLN3AEKA290YxIfZ25vLmxhbmQvci9ueW0tdGhlZ25vbWljMDAxL290YxqcFAoJYWRtaW4uZ25vEo4UcGFja2FnZSBvdGMKCmltcG9ydCAoCgkiY2hhaW4iCgkic3RyY29udiIKCgkiZ25vLmxhbmQvci9udC9ncmMyMHJlZy92MCIKKQoKLy8gVGhlIGFkbWluJ3Mgd2hvbGUgcmVhY2ggKEExKS4gTm9uZSBvZiB0aGVzZSB0b3VjaGVzIGFuIG9mZmVyIG9yIGFuIGVzY3JvdwovLyAoQTMpOyBldmVyeSBvbmUgcmVmdXNlcyBjb2lucyAoUzIpIGFuZCBlbWl0cyBhbiBldmVudC4KCi8vIEFkZFRva2VuIHdoaXRlbGlzdHMgYSB0b2tlbiBieSBpdHMgZ3JjMjByZWcga2V5LCBlbmFibGVkIChXMikuCmZ1bmMgQWRkVG9rZW4oY3VyIHJlYWxtLCBrZXkgc3RyaW5nKSB7CglyZXF1aXJlQWRtaW4oY3VyKQoJaWYgZ3JjMjByZWcuR2V0KGtleSkgPT0gbmlsIHsKCQlwYW5pYyhFcnJUb2tlblVua25vd24pCgl9CglpZiB0b2tlbnMuSGFzKGtleSkgewoJCXBhbmljKEVyclRva2VuRXhpc3RzKQoJfQoJaWYgdG9rZW5zLlNpemUoKSA+PSBtYXhUb2tlbnMgewoJCXBhbmljKEVyclRvb01hbnlUb2tlbnMpCgl9Cgl0b2tlbnMuU2V0KGtleSwgdHJ1ZSkKCWNoYWluLkVtaXQoRXZlbnRUb2tlbkNoYW5nZWQsICJ0b2tlbiIsIGtleSwgImVuYWJsZWQiLCAidHJ1ZSIpCn0KCi8vIFNldFRva2VuRW5hYmxlZCBzd2l0Y2hlcyBuZXcgb2ZmZXJzIG9uIGEgdG9rZW4gb24gb3Igb2ZmLiBPcGVuIG9mZmVycyBvbiBhCi8vIGRpc2FibGVkIHRva2VuIGNhbiBzdGlsbCBiZSBmaWxsZWQgYW5kIGNhbmNlbGxlZCAoVzIpLgpmdW5jIFNldFRva2VuRW5hYmxlZChjdXIgcmVhbG0sIGtleSBzdHJpbmcsIGVuYWJsZWQgYm9vbCkgewoJcmVxdWlyZUFkbWluKGN1cikKCWlmICF0b2tlbnMuSGFzKGtleSkgewoJCXBhbmljKEVyclRva2VuTm90TGlzdGVkKQoJfQoJdG9rZW5zLlNldChrZXksIGVuYWJsZWQpCgljaGFpbi5FbWl0KEV2ZW50VG9rZW5DaGFuZ2VkLCAidG9rZW4iLCBrZXksICJlbmFibGVkIiwgc3RyY29udi5Gb3JtYXRCb29sKGVuYWJsZWQpKQp9CgovLyBTZXRGZWVCcHMgc2V0cyB0aGUgZGVmYXVsdCBmZWUgZm9yIE5FVyBvZmZlcnMgKEY0LCBGNSkuCmZ1bmMgU2V0RmVlQnBzKGN1ciByZWFsbSwgYnBzIGludDY0KSB7CglyZXF1aXJlQWRtaW4oY3VyKQoJcmVxdWlyZUZlZShicHMpCglmZWVCcHMgPSBicHMKCWNoYWluLkVtaXQoRXZlbnRGZWVDaGFuZ2VkLCAiZmVlX2JwcyIsIHN0cmNvbnYuRm9ybWF0SW50KGJwcywgMTApKQp9CgovLyBTZXRHbm9taWNGZWUgdHVybnMgdGhlIHJlZHVjZWQgR05PTUlDIGZlZSBvbiBvciBvZmYgYW5kIHNldHMgaXQgKEY2KS4KZnVuYyBTZXRHbm9taWNGZWUoY3VyIHJlYWxtLCBlbmFibGVkIGJvb2wsIGJwcyBpbnQ2NCkgewoJcmVxdWlyZUFkbWluKGN1cikKCXJlcXVpcmVGZWUoYnBzKQoJZ25vbWljRmVlT24gPSBlbmFibGVkCglnbm9taWNGZWUgPSBicHMKCWNoYWluLkVtaXQoRXZlbnRGZWVDaGFuZ2VkLAoJCSJnbm9taWNfZmVlX2VuYWJsZWQiLCBzdHJjb252LkZvcm1hdEJvb2woZW5hYmxlZCksCgkJImdub21pY19mZWVfYnBzIiwgc3RyY29udi5Gb3JtYXRJbnQoYnBzLCAxMCkpCn0KCi8vIFNldEZlZVJlY2lwaWVudCBjaGFuZ2VzIHdoZXJlIGZlZXMgZ28uCmZ1bmMgU2V0RmVlUmVjaXBpZW50KGN1ciByZWFsbSwgdG8gYWRkcmVzcykgewoJcmVxdWlyZUFkbWluKGN1cikKCWlmICF0by5Jc1ZhbGlkKCkgewoJCXBhbmljKEVyckJhZEFkZHJlc3MpCgl9CglpZiB0byA9PSByZWFsbUFkZHIgewoJCXBhbmljKEVyckZlZVRvUmVhbG0pCgl9CglvbGQgOj0gZmVlUmVjaXBpZW50CglmZWVSZWNpcGllbnQgPSB0bwoJY2hhaW4uRW1pdChFdmVudEZlZVJlY2lwaWVudENoYW5nZWQsICJvbGQiLCBvbGQuU3RyaW5nKCksICJuZXciLCB0by5TdHJpbmcoKSkKfQoKLy8gU2V0UGF1c2VkIGJsb2NrcyBvciBhbGxvd3MgbmV3IG9mZmVycyBhbmQgZmlsbHMuIEl0IG5ldmVyIGJsb2NrcyBDYW5jZWwKLy8gKEEyLCBSMTApLgpmdW5jIFNldFBhdXNlZChjdXIgcmVhbG0sIHAgYm9vbCkgewoJcmVxdWlyZUFkbWluKGN1cikKCXBhdXNlZCA9IHAKCWNoYWluLkVtaXQoRXZlbnRQYXVzZWQsICJwYXVzZWQiLCBzdHJjb252LkZvcm1hdEJvb2wocCkpCn0KCi8vIFRyYW5zZmVyQWRtaW4gaGFuZHMgdGhlIGFkbWluIHJvbGUgdG8gYW5vdGhlciBhZGRyZXNzLgpmdW5jIFRyYW5zZmVyQWRtaW4oY3VyIHJlYWxtLCB0byBhZGRyZXNzKSB7CglyZXF1aXJlQWRtaW4oY3VyKQoJaWYgIXRvLklzVmFsaWQoKSB8fCB0byA9PSByZWFsbUFkZHIgewoJCXBhbmljKEVyckJhZEFkZHJlc3MpCgl9CglvbGQgOj0gYWRtaW4KCWFkbWluID0gdG8KCWNoYWluLkVtaXQoRXZlbnRBZG1pbkNoYW5nZWQsICJvbGQiLCBvbGQuU3RyaW5nKCksICJuZXciLCB0by5TdHJpbmcoKSkKfQoKZnVuYyByZXF1aXJlQWRtaW4oY3VyIHJlYWxtKSB7CglyZXF1aXJlTm9Db2lucygpCglpZiBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkgIT0gYWRtaW4gewoJCXBhbmljKEVyck5vdEFkbWluKSAvLyBTNwoJfQp9CgpmdW5jIHJlcXVpcmVGZWUoYnBzIGludDY0KSB7CglpZiBicHMgPCAwIHx8IGJwcyA+IGZlZUNhcEJwcyB7CgkJcGFuaWMoRXJyRmVlQWJvdmVDYXApCgl9Cn0KGtIGCgpjb25maWcuZ25vEsMGcGFja2FnZSBvdGMKCi8vIEdFTkVSQVRFRCBieSBzY3JpcHRzL3JlbmRlci5zaCBmcm9tIGNvbmZpZy5lbnYuIERvIG5vdCBlZGl0IGJ5IGhhbmQuCgpjb25zdCAoCgkvLyBhZG1pbkFkZHJlc3MgaG9sZHMgdGhlIGtub2JzIGluIGFkbWluLmduby4gSXQgY2Fubm90IG1vdmUsIGZyZWV6ZSBvcgoJLy8gY2FuY2VsIGFueWJvZHkncyBlc2Nyb3cuIEVtcHR5ID0gdGhlIGRlcGxveWVyOyBhbnl0aGluZyBlbHNlIG11c3QgYmUgYQoJLy8gdmFsaWQgYWRkcmVzcyBvciBpbml0IHJlZnVzZXMgdG8gZGVwbG95LgoJYWRtaW5BZGRyZXNzID0gImcxejI1Mmpld2NwMmdheHM5aDJtbG4yZWRxY2U0OXQ3c250bDRuZXMiCgoJLy8gZmVlUmVjaXBpZW50QWRkcmVzcyByZWNlaXZlcyBldmVyeSBmZWUsIGluIHRoZSBmaWxsIHRoYXQgZWFybnMgaXQuCgkvLyBFbXB0eSA9IHRoZSBhZG1pbjsgYW55dGhpbmcgZWxzZSBtdXN0IGJlIGEgdmFsaWQgYWRkcmVzcy4KCWZlZVJlY2lwaWVudEFkZHJlc3MgPSAiZzFxbGt1Z3luODB1cjg4bXF1OWpkcWFhd2w0ajU0eHZmaGR1NmFsayIKCgkvLyBnbm9taWNUb2tlbktleSBpcyBjaGVja2VkIGFnYWluc3QgdGhlIGltcG9ydGVkIHRva2VuIHJlYWxtIGluIGluaXQoKS4KCWdub21pY1Rva2VuS2V5ID0gImduby5sYW5kL3IvbnltLXRoZWdub21pYzAwMS9nbm9taWMuR05PTUlDIgoKCS8vIGRlZmF1bHRGZWVCcHM6IDAuMzAlLiBnbm9taWNGZWVCcHM6IDAuMTAlIG9uIEdOT01JQyBvZmZlcnMuCglkZWZhdWx0RmVlQnBzICAgID0gaW50NjQoMzApCglnbm9taWNGZWVFbmFibGVkID0gdHJ1ZQoJZ25vbWljRmVlQnBzICAgICA9IGludDY0KDEwKQopChqVBwoHZmVlLmdubxKJB3BhY2thZ2Ugb3RjCgpjb25zdCBicHNEZW5vbWluYXRvciA9IDEwMDAwCgovLyBmZWVPZiBpcyBicHMgb2YgYW1vdW50LCByb3VuZGVkIGRvd24gKEYxKS4gU3BsaXQgc28gdGhhdCBhIGxhcmdlIGFtb3VudAovLyBjYW5ub3Qgb3ZlcmZsb3cgb24gdGhlIG11bHRpcGxpY2F0aW9uOiBicHMgaXMgYXQgbW9zdCBmZWVDYXBCcHMsIHNvIGJvdGgKLy8gdGVybXMgc3RheSBmYXIgYmVsb3cgaW50NjQgbWF4LgpmdW5jIGZlZU9mKGFtb3VudCwgYnBzIGludDY0KSBpbnQ2NCB7CglpZiBhbW91bnQgPD0gMCB8fCBicHMgPD0gMCB7CgkJcmV0dXJuIDAKCX0KCXJldHVybiBhbW91bnQvYnBzRGVub21pbmF0b3IqYnBzICsgYW1vdW50JWJwc0Rlbm9taW5hdG9yKmJwcy9icHNEZW5vbWluYXRvcgp9CgovLyBmZWVGb3IgcGlja3MgdGhlIGZlZSBhIG5ldyBvZmZlciBvbiB0b2tlbktleSBpcyBjcmVhdGVkIHdpdGggKEY0LCBGNikuCmZ1bmMgZmVlRm9yKHRva2VuS2V5IHN0cmluZykgaW50NjQgewoJaWYgZ25vbWljRmVlT24gJiYgdG9rZW5LZXkgPT0gZ25vbWljS2V5IHsKCQlyZXR1cm4gZ25vbWljRmVlCgl9CglyZXR1cm4gZmVlQnBzCn0KCi8vIGFkZFNhdCBhZGRzIHR3byBub24tbmVnYXRpdmUgdG90YWxzIHdpdGhvdXQgd3JhcHBpbmcgKFM1KS4gVGhlIHRvdGFscyBhcmUKLy8gc3RhdGlzdGljcywgbm90IG1vbmV5OiBvbmUgdGhhdCBzdG9wcyBhdCB0aGUgY2VpbGluZyBpcyBiZXR0ZXIgdGhhbiBvbmUKLy8gdGhhdCB0dXJucyBuZWdhdGl2ZS4KZnVuYyBhZGRTYXQoYSwgYiBpbnQ2NCkgaW50NjQgewoJaWYgYiA+IDAgJiYgYSA+IG1heEludDY0LWIgewoJCXJldHVybiBtYXhJbnQ2NAoJfQoJcmV0dXJuIGEgKyBiCn0KCmNvbnN0IG1heEludDY0ID0gaW50NjQoOTIyMzM3MjAzNjg1NDc3NTgwNykKGkYKC2dub21vZC50b21sEjdtb2R1bGUgPSAiZ25vLmxhbmQvci9ueW0tdGhlZ25vbWljMDAxL290YyIKZ25vID0gIjAuOSIKGrNdCgdvdGMuZ25vEqddLy8gUGFja2FnZSBvdGMgaXMgYW4gb3Zlci10aGUtY291bnRlciBkZXNrIGZvciBHUkMyMCB0b2tlbnMgYWdhaW5zdCBHTk9ULgovLwovLyBBIG1ha2VyIGVzY3Jvd3Mgb25lIHNpZGUgb2YgYSB0cmFkZSBpbiB0aGlzIHJlYWxtOyBhIHRha2VyIGZpbGxzIGl0IHdpdGgKLy8gdGhlIG90aGVyIHNpZGUsIGFuZCBib3RoIGhhbHZlcyBtb3ZlIGluIHRoZSBzYW1lIHRyYW5zYWN0aW9uIG9yIG5vdCBhdCBhbGwuCi8vIEV2ZXJ5IG9mZmVyIGhhcyBleGFjdGx5IG9uZSBHUkMyMCBzaWRlIGFuZCBvbmUgR05PVCBzaWRlIChSMSksIGlzIGZpbGxlZCBpbgovLyBmdWxsIG9yIG5vdCBhdCBhbGwgKFI4KSwgYW5kIGNhbiBiZSBjYW5jZWxsZWQgYnkgaXRzIG1ha2VyIGF0IGFueSBtb21lbnQsCi8vIHBhdXNlZCBvciBub3QgKFIxMCkuCi8vCi8vIFdIQVQgVEhFIEFETUlOIENBTk5PVCBETyAoQTMpLiBhZG1pbi5nbm8gc2V0cyBmZWVzIHdpdGhpbiBhIGNvbnN0YW50IGNhcCwKLy8gbWFuYWdlcyB0aGUgdG9rZW4gd2hpdGVsaXN0LCBwYXVzZXMgbmV3IG9mZmVycyBhbmQgZmlsbHMsIGFuZCBoYW5kcyB0aGUKLy8gcm9sZSBvbi4gTm8gZnVuY3Rpb24gYW55d2hlcmUgbW92ZXMsIGZyZWV6ZXMgb3IgY2FuY2VscyBhbiBlc2Nyb3cgZXhjZXB0Ci8vIEZpbGwgKHRvIHRoZSB0YWtlcikgYW5kIENhbmNlbCAodG8gdGhlIG1ha2VyLCBjYWxsZWQgYnkgdGhlIG1ha2VyKS4KLy8KLy8gVVBHUkFERVMuIEEgcmVhbG0gaXMgaW1tdXRhYmxlLiBJZiBhIGJ1ZyBpcyBmb3VuZCB0aGUgcGxhbiBpczogcGF1c2UsIGRlcGxveQovLyBhIG5ldyBwYXRoICguLi4vb3RjL3YyKSwgYW5kIGtlZXAgdGhpcyBvbmUgcmVhZGFibGUgc28gbWFrZXJzIGNhbiBzdGlsbAovLyBjYW5jZWwgaGVyZSDigJQgd2hpY2ggcGF1c2UgbmV2ZXIgYmxvY2tzLgpwYWNrYWdlIG90YwoKaW1wb3J0ICgKCSJjaGFpbiIKCSJjaGFpbi9iYW5rZXIiCgkiY2hhaW4vcnVudGltZS91bnNhZmUiCgkic3RyY29udiIKCSJzdHJpbmdzIgoJInRpbWUiCgoJImduby5sYW5kL3AvbnQvYXZsL3YwIgoJImduby5sYW5kL3IvbnQvZ3JjMjByZWcvdjAiCgoJdG9rZW4gImduby5sYW5kL3IvbnltLXRoZWdub21pYzAwMS9nbm9taWMiCikKCmNvbnN0IHVnbm90ID0gInVnbm90IgoKLy8gRml4ZWQgbGltaXRzLiBUaGV5IGFyZSBub3QgY29uZmlndXJhdGlvbjogY29uZmlnLmdubyBpcyByZWdlbmVyYXRlZCBieQovLyBzY3JpcHRzL3JlbmRlci5zaCBhdCBkZXBsb3ksIGFuZCBhIHNlY3VyaXR5IGNhcCBtdXN0IGJlIHRoZSBvbmUgdGhlIHRlc3RzCi8vIHJhbiBhZ2FpbnN0Lgpjb25zdCAoCgkvLyBmZWVDYXBCcHMgaXMgdGhlIGNlaWxpbmcgb24gYW55IGZlZSwgZm9yZXZlciAoRjUpOiAxMDAgPSAxJS4KCWZlZUNhcEJwcyA9IGludDY0KDEwMCkKCgkvLyBkZWZhdWx0UGFnZVNpemUgYW5kIG1heFBhZ2VTaXplIGJvdW5kIGV2ZXJ5IGxpc3QgKFM5KS4KCWRlZmF1bHRQYWdlU2l6ZSA9IDIwCgltYXhQYWdlU2l6ZSAgICAgPSA1MAoKCS8vIG1heFRva2VucyBib3VuZHMgdGhlIHdoaXRlbGlzdCwgc28gR2V0Q29uZmlnIGNhbiBsaXN0IGl0IGluIG9uZSByZWFkLgoJbWF4VG9rZW5zID0gNTAKKQoKLy8gRXZlbnRzLiBFdmVyeSBvbmUgY2FycmllcyB0aGUgb2ZmZXIgaWQgYW5kIHRoZSBhZGRyZXNzZXMgaW52b2x2ZWQuCmNvbnN0ICgKCUV2ZW50T2ZmZXJDcmVhdGVkICAgICAgICA9ICJPZmZlckNyZWF0ZWQiCglFdmVudE9mZmVyRmlsbGVkICAgICAgICAgPSAiT2ZmZXJGaWxsZWQiCglFdmVudE9mZmVyQ2FuY2VsbGVkICAgICAgPSAiT2ZmZXJDYW5jZWxsZWQiCglFdmVudEFkbWluQ2hhbmdlZCAgICAgICAgPSAiQWRtaW5DaGFuZ2VkIgoJRXZlbnRGZWVDaGFuZ2VkICAgICAgICAgID0gIkZlZUNoYW5nZWQiCglFdmVudEZlZVJlY2lwaWVudENoYW5nZWQgPSAiRmVlUmVjaXBpZW50Q2hhbmdlZCIKCUV2ZW50VG9rZW5DaGFuZ2VkICAgICAgICA9ICJUb2tlbkNoYW5nZWQiCglFdmVudFBhdXNlZCAgICAgICAgICAgICAgPSAiUGF1c2VkIgopCgp2YXIgKAoJYWRtaW4gICAgICAgIGFkZHJlc3MKCWZlZVJlY2lwaWVudCBhZGRyZXNzCglyZWFsbUFkZHIgICAgYWRkcmVzcwoJd2ViUGF0aCAgICAgIHN0cmluZyAvLyAiL3IvPG5hbWVzcGFjZT4vb3RjIiwgZm9yIGdub3dlYiBsaW5rcwoKCWZlZUJwcyAgICAgID0gZGVmYXVsdEZlZUJwcwoJZ25vbWljS2V5ICAgc3RyaW5nCglnbm9taWNGZWVPbiA9IGdub21pY0ZlZUVuYWJsZWQKCWdub21pY0ZlZSAgID0gZ25vbWljRmVlQnBzCglwYXVzZWQgICAgICBib29sCgoJLy8gdG9rZW5zOiByZWdpc3RyeSBrZXkgLT4gZW5hYmxlZCAoVzEsIFcyKS4KCXRva2VucyBhdmwuVHJlZQoKCS8vIG9mZmVyczogcGFkZGVkIGlkIC0+ICpPZmZlciwgZXZlcnkgb2ZmZXIgZXZlciBtYWRlIChSMTMpLgoJb2ZmZXJzIGF2bC5UcmVlCgkvLyBvcGVuUHVibGljOiBwYWRkZWQgaWQgLT4gbmlsLCBvbmx5IG9mZmVycyB0aGF0IGFyZSBvcGVuIEFORCBwdWJsaWMgKFI0KS4KCW9wZW5QdWJsaWMgYXZsLlRyZWUKCS8vIGJ5TWFrZXI6IG1ha2VyIC0+ICphdmwuVHJlZSBvZiBwYWRkZWQgaWQgLT4gbmlsLCBldmVyeSBvZmZlciBvZiB0aGF0CgkvLyBtYWtlciBpbiBhbnkgc3RhdGUsIHByaXZhdGUgb25lcyBpbmNsdWRlZC4KCWJ5TWFrZXIgYXZsLlRyZWUKCglsYXN0SUQgdWludDY0CgoJdG90YWxGZWVzICAgaW50NjQgLy8gdWdub3Qgc2VudCB0byB0aGUgZmVlIHJlY2lwaWVudCAoRjcpCgl0b3RhbFZvbHVtZSBpbnQ2NCAvLyBzdW0gb2YgR25vdEFtdCBvdmVyIGZpbGxlZCBvZmZlcnMgKEY3KQoJZmlsbGVkQ291bnQgaW50NjQKKQoKZnVuYyBpbml0KGN1ciByZWFsbSkgewoJcmVhbG1BZGRyID0gY3VyLkFkZHJlc3MoKQoJd2ViUGF0aCA9IHN0cmluZ3MuVHJpbVByZWZpeChjdXIuUGtnUGF0aCgpLCAiZ25vLmxhbmQiKQoKCS8vIE9ubHkgYW4gRU1QVFkgYWRkcmVzcyBmYWxscyBiYWNrLiBBIGNvbmZpZ3VyZWQgb25lIHRoYXQgZG9lcyBub3QgcGFyc2UKCS8vIHN0b3BzIHRoZSBkZXBsb3k6IGEgdHlwbyBtdXN0IG5vdCBxdWlldGx5IGhhbmQgdGhlIGFkbWluIHJvbGUsIG9yIHRoZQoJLy8gZmVlcywgdG8gd2hvZXZlciBzaWduZWQgdGhlIGRlcGxveS4KCWlmIGFkbWluQWRkcmVzcyA9PSAiIiB7CgkJYWRtaW4gPSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCQlpZiAhYWRtaW4uSXNWYWxpZCgpIHsKCQkJYWRtaW4gPSB1bnNhZmUuT3JpZ2luQ2FsbGVyKCkKCQl9Cgl9IGVsc2UgewoJCWFkbWluID0gYWRkcmVzcyhhZG1pbkFkZHJlc3MpCgl9CglpZiAhYWRtaW4uSXNWYWxpZCgpIHx8IGFkbWluID09IHJlYWxtQWRkciB7CgkJcGFuaWMoIm90YzogYWRtaW5BZGRyZXNzIGlzIG5vdCBhIHZhbGlkIGFkZHJlc3M6ICIgKyBhZG1pbkFkZHJlc3MpCgl9CgoJZmVlUmVjaXBpZW50ID0gYWRtaW4KCWlmIGZlZVJlY2lwaWVudEFkZHJlc3MgIT0gIiIgewoJCWZlZVJlY2lwaWVudCA9IGFkZHJlc3MoZmVlUmVjaXBpZW50QWRkcmVzcykKCQlpZiAhZmVlUmVjaXBpZW50LklzVmFsaWQoKSB7CgkJCXBhbmljKCJvdGM6IGZlZVJlY2lwaWVudEFkZHJlc3MgaXMgbm90IGEgdmFsaWQgYWRkcmVzczogIiArIGZlZVJlY2lwaWVudEFkZHJlc3MpCgkJfQoJfQoJaWYgZmVlUmVjaXBpZW50ID09IHJlYWxtQWRkciB7CgkJcGFuaWMoRXJyRmVlVG9SZWFsbSkKCX0KCWlmIGRlZmF1bHRGZWVCcHMgPCAwIHx8IGRlZmF1bHRGZWVCcHMgPiBmZWVDYXBCcHMgfHwgZ25vbWljRmVlQnBzIDwgMCB8fCBnbm9taWNGZWVCcHMgPiBmZWVDYXBCcHMgewoJCXBhbmljKEVyckZlZUFib3ZlQ2FwKQoJfQoKCS8vIFRoZSBrZXkgY29tZXMgZnJvbSB0aGUgaW1wb3J0ZWQgcmVhbG07IHRoZSBjb25zdGFudCBvbmx5IGV4aXN0cyBzbyBhCgkvLyB3cm9uZyBrZXkgaW4gY29uZmlnLmVudiBkaWVzIGhlcmUsIGF0IGRlcGxveSwgYW5kIG5vdCBhdCB0aGUgZmlyc3Qgb2ZmZXIuCglnbm9taWNLZXkgPSB0b2tlbi5Ub2tlbktleSgpCglpZiBnbm9taWNLZXkgIT0gZ25vbWljVG9rZW5LZXkgewoJCXBhbmljKCJvdGM6IGNvbmZpZy5nbm8gbmFtZXMgIiArIGdub21pY1Rva2VuS2V5ICsgIiBidXQgdGhlIGltcG9ydGVkIHRva2VuIHJlYWxtIGlzICIgKyBnbm9taWNLZXkpCgl9Cgl0b2tlbnMuU2V0KGdub21pY0tleSwgdHJ1ZSkKfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIE1ha2luZyBhbiBvZmZlcgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vIENyZWF0ZVNlbGxUb2tlbiBlc2Nyb3dzIHRva2VuQW10IG9mIHRoZSB0b2tlbiBhbmQgYXNrcyBnbm90QW10IHVnbm90IGZvciBpdC4KLy8gVGhlIG1ha2VyIG11c3QgZmlyc3QgQXBwcm92ZSB0aGlzIHJlYWxtJ3MgYWRkcmVzcyBmb3IgZXhhY3RseSB0b2tlbkFtdCBpbgovLyB0aGUgdG9rZW4ncyByZWFsbTsgb25seSB0aGF0IGFtb3VudCBpcyBwdWxsZWQgKFM0KS4gUmV0dXJucyB0aGUgb2ZmZXIgaWQuCmZ1bmMgQ3JlYXRlU2VsbFRva2VuKGN1ciByZWFsbSwgdG9rZW5LZXkgc3RyaW5nLCB0b2tlbkFtdCwgZ25vdEFtdCBpbnQ2NCwgdGFrZXIgc3RyaW5nLCBleHBpcmVzQXQgaW50NjQpIHVpbnQ2NCB7CglyZXF1aXJlTm9Db2lucygpIC8vIFMyCgltYWtlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCW8gOj0gbmV3T2ZmZXIobWFrZXIsIFNlbGxUb2tlbiwgdG9rZW5LZXksIHRva2VuQW10LCBnbm90QW10LCB0YWtlciwgZXhwaXJlc0F0KQoJaW5kZXgobykgLy8gUzM6IHN0YXRlIGJlZm9yZSB0cmFuc2ZlcnMKCgkvLyBNb3ZlcyBleGFjdGx5IHRva2VuQW10IG9yIHBhbmljczogZ3JjMjByZWcgb25seSBob2xkcyBwL250L2dyYzIwIHRva2VucywKCS8vIGFuZCBpdCB0dXJucyB0aGVpciBlcnJvciBpbnRvIGEgcGFuaWMgdGhhdCByZXZlcnRzIHRoZSBvZmZlciBhYm92ZSAoUzQpLgoJZ3JjMjByZWcuVHJhbnNmZXJGcm9tKDAsIGN1ciwgdG9rZW5LZXksIG1ha2VyLCByZWFsbUFkZHIsIHRva2VuQW10KQoKCWVtaXRDcmVhdGVkKG8pCglyZXR1cm4gby5JRAp9CgovLyBDcmVhdGVTZWxsR25vdCBlc2Nyb3dzIHRoZSB1Z25vdCBzZW50IHdpdGggdGhlIGNhbGwgYW5kIGFza3MgdG9rZW5BbXQgb2YKLy8gdGhlIHRva2VuIGZvciBpdC4gT25seSBhIGRpcmVjdCB1c2VyIGNhbGwgbWF5IGF0dGFjaCBjb2lucyAoUzEpLiBSZXR1cm5zCi8vIHRoZSBvZmZlciBpZC4KZnVuYyBDcmVhdGVTZWxsR25vdChjdXIgcmVhbG0sIHRva2VuS2V5IHN0cmluZywgdG9rZW5BbXQgaW50NjQsIHRha2VyIHN0cmluZywgZXhwaXJlc0F0IGludDY0KSB1aW50NjQgewoJcmVxdWlyZVVzZXIoY3VyKSAvLyBTMQoJZ25vdEFtdCA6PSBzZW50VWdub3QoKQoJbWFrZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCglvIDo9IG5ld09mZmVyKG1ha2VyLCBTZWxsR25vdCwgdG9rZW5LZXksIHRva2VuQW10LCBnbm90QW10LCB0YWtlciwgZXhwaXJlc0F0KQoJaW5kZXgobykKCWVtaXRDcmVhdGVkKG8pCglyZXR1cm4gby5JRAp9CgpmdW5jIG5ld09mZmVyKG1ha2VyIGFkZHJlc3MsIHNpZGUgU2lkZSwgdG9rZW5LZXkgc3RyaW5nLCB0b2tlbkFtdCwgZ25vdEFtdCBpbnQ2NCwgdGFrZXIgc3RyaW5nLCBleHBpcmVzQXQgaW50NjQpICpPZmZlciB7CglpZiBwYXVzZWQgewoJCXBhbmljKEVyclBhdXNlZCkgLy8gQTIKCX0KCWlmIHRva2VuQW10IDw9IDAgfHwgZ25vdEFtdCA8PSAwIHsKCQlwYW5pYyhFcnJCYWRBbW91bnQpIC8vIFIyLCBTNQoJfQoJcmVxdWlyZVRva2VuRW5hYmxlZCh0b2tlbktleSkgLy8gUjMKCW5vdyA6PSB0aW1lLk5vdygpLlVuaXgoKSAgICAgIC8vIFM4CglpZiBleHBpcmVzQXQgPCAwIHx8IChleHBpcmVzQXQgIT0gMCAmJiBleHBpcmVzQXQgPD0gbm93KSB7CgkJcGFuaWMoRXJyQmFkRXhwaXJ5KSAvLyBSOQoJfQoJdCA6PSBhZGRyZXNzKCIiKQoJaWYgdGFrZXIgIT0gIiIgewoJCXQgPSBhZGRyZXNzKHRha2VyKQoJCWlmICF0LklzVmFsaWQoKSB8fCB0ID09IHJlYWxtQWRkciB7CgkJCXBhbmljKEVyckJhZEFkZHJlc3MpIC8vIFM2CgkJfQoJCWlmIHQgPT0gbWFrZXIgewoJCQlwYW5pYyhFcnJUYWtlcklzTWFrZXIpIC8vIFI2CgkJfQoJfQoJZmVlIDo9IGZlZUZvcih0b2tlbktleSkKCWlmIGZlZSA8IDAgfHwgZmVlID4gZmVlQ2FwQnBzIHsKCQlwYW5pYyhFcnJGZWVBYm92ZUNhcCkgLy8gRjUKCX0KCWxhc3RJRCsrCglyZXR1cm4gJk9mZmVyewoJCUlEOiBsYXN0SUQsIE1ha2VyOiBtYWtlciwgVGFrZXI6IHQsIFNpZGU6IHNpZGUsCgkJVG9rZW5LZXk6IHRva2VuS2V5LCBUb2tlbkFtdDogdG9rZW5BbXQsIEdub3RBbXQ6IGdub3RBbXQsCgkJRmVlQnBzOiBmZWUsIEV4cGlyZXNBdDogZXhwaXJlc0F0LCBDcmVhdGVkQXQ6IG5vdywgU3RhdHVzOiBPcGVuLAoJfQp9CgpmdW5jIGluZGV4KG8gKk9mZmVyKSB7CglpZCA6PSBwYWRJRChvLklEKQoJb2ZmZXJzLlNldChpZCwgbykKCWlmIG8uVGFrZXIgPT0gIiIgewoJCW9wZW5QdWJsaWMuU2V0KGlkLCBuaWwpCgl9Cgl2YXIgbWluZSAqYXZsLlRyZWUKCWlmIHYgOj0gYnlNYWtlci5HZXQoby5NYWtlci5TdHJpbmcoKSk7IHYgIT0gbmlsIHsKCQltaW5lID0gdi4oKmF2bC5UcmVlKQoJfSBlbHNlIHsKCQltaW5lID0gYXZsLk5ld1RyZWUoKQoJCWJ5TWFrZXIuU2V0KG8uTWFrZXIuU3RyaW5nKCksIG1pbmUpCgl9CgltaW5lLlNldChpZCwgbmlsKQp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gVGFraW5nIGFuIG9mZmVyCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8gRmlsbCB0YWtlcyBhbiBvcGVuIG9mZmVyIGluIGZ1bGwgKFI4KS4KLy8KLy8gICAtIFNlbGxUb2tlbjogYXR0YWNoIGV4YWN0bHkgR25vdEFtdCB1Z25vdDsgZGlyZWN0IHVzZXIgY2FsbCBvbmx5IChTMSkuCi8vICAgLSBTZWxsR25vdDogYXR0YWNoIG5vdGhpbmcgKFMyKSBhbmQgZmlyc3QgQXBwcm92ZSB0aGlzIHJlYWxtIGZvciBleGFjdGx5Ci8vICAgICBUb2tlbkFtdDsgdGhlIHRva2VucyBnbyBzdHJhaWdodCBmcm9tIHRoZSB0YWtlciB0byB0aGUgbWFrZXIuCi8vCi8vIFRoZSBmZWUgY29tZXMgb2ZmIHRoZSBHTk9UIHNpZGUgYW5kIGdvZXMgdG8gdGhlIGZlZSByZWNpcGllbnQgaW4gdGhlIHNhbWUKLy8gY2FsbCAoRjIsIEYzKS4KZnVuYyBGaWxsKGN1ciByZWFsbSwgaWQgdWludDY0KSB7CglpZiBwYXVzZWQgewoJCXBhbmljKEVyclBhdXNlZCkgLy8gQTIKCX0KCW8gOj0gbXVzdE9mZmVyKGlkKQoJaWYgby5TdGF0dXMgIT0gT3BlbiB7CgkJcGFuaWMoRXJyTm90T3BlbikgLy8gUjEyCgl9CglpZiBvLlNpZGUgPT0gU2VsbFRva2VuIHsKCQlyZXF1aXJlVXNlcihjdXIpCgkJaWYgc2VudFVnbm90KCkgIT0gby5Hbm90QW10IHsKCQkJcGFuaWMoRXJyQmFkUGF5bWVudCkgLy8gUjgKCQl9Cgl9IGVsc2UgewoJCXJlcXVpcmVOb0NvaW5zKCkKCX0KCXRha2VyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoJaWYgdGFrZXIgPT0gby5NYWtlciB7CgkJcGFuaWMoRXJyT3duT2ZmZXIpIC8vIFI3Cgl9CglpZiBvLlRha2VyICE9ICIiICYmIG8uVGFrZXIgIT0gdGFrZXIgewoJCXBhbmljKEVyck5vdFRha2VyKSAvLyBSNQoJfQoJaWYgZXhwaXJlZChvKSB7CgkJcGFuaWMoRXJyRXhwaXJlZCkgLy8gUjkKCX0KCglmZWUgOj0gZmVlT2Yoby5Hbm90QW10LCBvLkZlZUJwcykKCW5ldCA6PSBvLkdub3RBbXQgLSBmZWUKCgkvLyBTMzogY2xvc2UgdGhlIG9mZmVyIGFuZCBjb3VudCBpdCBiZWZvcmUgYW55dGhpbmcgbW92ZXMuCgljbG9zZU9mZmVyKG8sIEZpbGxlZCkKCXRvdGFsRmVlcyA9IGFkZFNhdCh0b3RhbEZlZXMsIGZlZSkKCXRvdGFsVm9sdW1lID0gYWRkU2F0KHRvdGFsVm9sdW1lLCBvLkdub3RBbXQpCglmaWxsZWRDb3VudCA9IGFkZFNhdChmaWxsZWRDb3VudCwgMSkKCglpZiBvLlNpZGUgPT0gU2VsbFRva2VuIHsKCQlncmMyMHJlZy5UcmFuc2ZlcigwLCBjdXIsIG8uVG9rZW5LZXksIHRha2VyLCBvLlRva2VuQW10KQoJCXBheShjdXIsIG8uTWFrZXIsIG5ldCkKCX0gZWxzZSB7CgkJZ3JjMjByZWcuVHJhbnNmZXJGcm9tKDAsIGN1ciwgby5Ub2tlbktleSwgdGFrZXIsIG8uTWFrZXIsIG8uVG9rZW5BbXQpCgkJcGF5KGN1ciwgdGFrZXIsIG5ldCkKCX0KCXBheShjdXIsIGZlZVJlY2lwaWVudCwgZmVlKSAvLyBGNzogc2tpcHBlZCB3aGVuIDAKCgljaGFpbi5FbWl0KEV2ZW50T2ZmZXJGaWxsZWQsCgkJImlkIiwgc3RyY29udi5Gb3JtYXRVaW50KG8uSUQsIDEwKSwKCQkibWFrZXIiLCBvLk1ha2VyLlN0cmluZygpLAoJCSJ0YWtlciIsIHRha2VyLlN0cmluZygpLAoJCSJzaWRlIiwgby5TaWRlLlN0cmluZygpLAoJCSJ0b2tlbiIsIG8uVG9rZW5LZXksCgkJInRva2VuX2FtdCIsIHN0cmNvbnYuRm9ybWF0SW50KG8uVG9rZW5BbXQsIDEwKSwKCQkiZ25vdF9hbXQiLCBzdHJjb252LkZvcm1hdEludChvLkdub3RBbXQsIDEwKSwKCQkiZmVlIiwgc3RyY29udi5Gb3JtYXRJbnQoZmVlLCAxMCkpCn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBXaXRoZHJhd2luZyBhbiBvZmZlcgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vIENhbmNlbCByZXR1cm5zIHRoZSBlc2Nyb3cgdG8gdGhlIG1ha2VyLiBPbmx5IHRoZSBtYWtlciBjYW4gY2FsbCBpdCAoUjExKSwKLy8gYXQgYW55IHRpbWUsIGluY2x1ZGluZyBhZnRlciBleHBpcnkgYW5kIHdoaWxlIHBhdXNlZCAoUjEwKS4KZnVuYyBDYW5jZWwoY3VyIHJlYWxtLCBpZCB1aW50NjQpIHsKCXJlcXVpcmVOb0NvaW5zKCkgLy8gUzIKCW8gOj0gbXVzdE9mZmVyKGlkKQoJaWYgby5NYWtlciAhPSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkgewoJCXBhbmljKEVyck5vdE1ha2VyKSAvLyBTNwoJfQoJaWYgby5TdGF0dXMgIT0gT3BlbiB7CgkJcGFuaWMoRXJyTm90T3BlbikgLy8gUjEyCgl9CgljbG9zZU9mZmVyKG8sIENhbmNlbGxlZCkgLy8gUzMKCglpZiBvLlNpZGUgPT0gU2VsbFRva2VuIHsKCQlncmMyMHJlZy5UcmFuc2ZlcigwLCBjdXIsIG8uVG9rZW5LZXksIG8uTWFrZXIsIG8uVG9rZW5BbXQpCgl9IGVsc2UgewoJCXBheShjdXIsIG8uTWFrZXIsIG8uR25vdEFtdCkKCX0KCgljaGFpbi5FbWl0KEV2ZW50T2ZmZXJDYW5jZWxsZWQsCgkJImlkIiwgc3RyY29udi5Gb3JtYXRVaW50KG8uSUQsIDEwKSwKCQkibWFrZXIiLCBvLk1ha2VyLlN0cmluZygpKQp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gVGhlIHNtYWxsIG1hY2hpbmVyeQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmZ1bmMgY2xvc2VPZmZlcihvICpPZmZlciwgcyBTdGF0dXMpIHsKCW8uU3RhdHVzID0gcwoJb3BlblB1YmxpYy5SZW1vdmUocGFkSUQoby5JRCkpCn0KCi8vIGV4cGlyZWQgaXMgdHJ1ZSBvbmNlIGJsb2NrIHRpbWUgcmVhY2hlcyBFeHBpcmVzQXQgKFI5KS4gQW4gZXhwaXJlZCBvZmZlcgovLyBzdGF5cyBPcGVuIHVudGlsIGl0cyBtYWtlciBjYW5jZWxzIGl0IChSMTAsIFIxMSkuCmZ1bmMgZXhwaXJlZChvICpPZmZlcikgYm9vbCB7CglyZXR1cm4gby5FeHBpcmVzQXQgIT0gMCAmJiB0aW1lLk5vdygpLlVuaXgoKSA+PSBvLkV4cGlyZXNBdAp9CgpmdW5jIG11c3RPZmZlcihpZCB1aW50NjQpICpPZmZlciB7Cgl2IDo9IG9mZmVycy5HZXQocGFkSUQoaWQpKQoJaWYgdiA9PSBuaWwgewoJCXBhbmljKEVyck5vT2ZmZXIpCgl9CglyZXR1cm4gdi4oKk9mZmVyKQp9CgpmdW5jIHJlcXVpcmVUb2tlbkVuYWJsZWQoa2V5IHN0cmluZykgewoJdiA6PSB0b2tlbnMuR2V0KGtleSkKCWlmIHYgPT0gbmlsIHsKCQlwYW5pYyhFcnJUb2tlbk5vdExpc3RlZCkKCX0KCWlmICF2Lihib29sKSB7CgkJcGFuaWMoRXJyVG9rZW5EaXNhYmxlZCkKCX0KfQoKLy8gcmVxdWlyZVVzZXIgaW5zaXN0cyBvbiBhIGRpcmVjdCB1c2VyIGNhbGwgKFMxKS4gVGhlIGNvaW4gZW52ZWxvcGUgYmVsb25ncwovLyB0byB0aGUgd2hvbGUgbWVzc2FnZSwgc28gYSByZWFsbSBpbiB0aGUgbWlkZGxlIGNvdWxkIHNwZW5kIGl0IGVsc2V3aGVyZQovLyBhbmQgbGVhdmUgT3JpZ2luU2VuZCBkZXNjcmliaW5nIGEgcGF5bWVudCB0aGlzIHJlYWxtIG5ldmVyIHJlY2VpdmVkIOKAlCB0aGUKLy8gInBoYW50b20gcGF5bWVudCIgb2YgYXRvbWljc3dhcC5OZXdDdXN0b21Db2luU3dhcC4gYG1ha2V0eCBydW5gIGlzIHJlZnVzZWQKLy8gZm9yIHRoZSBzYW1lIHJlYXNvbi4KZnVuYyByZXF1aXJlVXNlcihjdXIgcmVhbG0pIHsKCWlmICFjdXIuUHJldmlvdXMoKS5Jc1VzZXJDYWxsKCkgewoJCXBhbmljKEVyck5vdFVzZXIpCgl9Cn0KCi8vIHNlbnRVZ25vdCByZXR1cm5zIHRoZSB1Z25vdCBhdHRhY2hlZCB0byB0aGUgY2FsbCwgYW5kIHJlZnVzZXMgYW55IGVudmVsb3BlCi8vIHRoYXQgaXMgbm90IGV4YWN0bHkgb25lIHBvc2l0aXZlIHVnbm90IGNvaW4uCmZ1bmMgc2VudFVnbm90KCkgaW50NjQgewoJc2VudCA6PSB1bnNhZmUuT3JpZ2luU2VuZCgpCglpZiBsZW4oc2VudCkgIT0gMSB8fCBzZW50WzBdLkRlbm9tICE9IHVnbm90IHx8IHNlbnRbMF0uQW1vdW50IDw9IDAgewoJCXBhbmljKEVyckJhZFBheW1lbnQpCgl9CglyZXR1cm4gc2VudFswXS5BbW91bnQKfQoKLy8gcmVxdWlyZU5vQ29pbnMgcmVmdXNlcyBhbnkgY29pbiBvbiBhIGNhbGwgdGhhdCBpcyBub3QgbWVhbnQgdG8gcmVjZWl2ZQovLyBvbmUgKFMyKTogdGhpcyByZWFsbSBoYXMgbm8gd2F5IHRvIHNlbmQgc3RyYXkgY29pbnMgYmFjay4KZnVuYyByZXF1aXJlTm9Db2lucygpIHsKCWZvciBfLCBjIDo9IHJhbmdlIHVuc2FmZS5PcmlnaW5TZW5kKCkgewoJCWlmIGMuQW1vdW50ICE9IDAgewoJCQlwYW5pYyhFcnJOb0NvaW5zKQoJCX0KCX0KfQoKZnVuYyBwYXkoY3VyIHJlYWxtLCB0byBhZGRyZXNzLCBhbW91bnQgaW50NjQpIHsKCWlmIGFtb3VudCA8PSAwIHsKCQlyZXR1cm4KCX0KCWJhbmtlci5OZXdCYW5rZXIoYmFua2VyLkJhbmtlclR5cGVSZWFsbVNlbmQsIGN1cikuCgkJU2VuZENvaW5zKHJlYWxtQWRkciwgdG8sIGNoYWluLk5ld0NvaW5zKGNoYWluLk5ld0NvaW4odWdub3QsIGFtb3VudCkpKQp9CgovLyBwYWRJRCBtYWtlcyBpZHMgc29ydCBhcyBudW1iZXJzIGluIHRoZSB0cmVlcy4KZnVuYyBwYWRJRChpZCB1aW50NjQpIHN0cmluZyB7CglzIDo9IHN0cmNvbnYuRm9ybWF0VWludChpZCwgMTApCglyZXR1cm4gc3RyaW5ncy5SZXBlYXQoIjAiLCAyMC1sZW4ocykpICsgcwp9CgpmdW5jIGVtaXRDcmVhdGVkKG8gKk9mZmVyKSB7CgljaGFpbi5FbWl0KEV2ZW50T2ZmZXJDcmVhdGVkLAoJCSJpZCIsIHN0cmNvbnYuRm9ybWF0VWludChvLklELCAxMCksCgkJIm1ha2VyIiwgby5NYWtlci5TdHJpbmcoKSwKCQkidGFrZXIiLCBvLlRha2VyLlN0cmluZygpLAoJCSJzaWRlIiwgby5TaWRlLlN0cmluZygpLAoJCSJ0b2tlbiIsIG8uVG9rZW5LZXksCgkJInRva2VuX2FtdCIsIHN0cmNvbnYuRm9ybWF0SW50KG8uVG9rZW5BbXQsIDEwKSwKCQkiZ25vdF9hbXQiLCBzdHJjb252LkZvcm1hdEludChvLkdub3RBbXQsIDEwKSwKCQkiZmVlX2JwcyIsIHN0cmNvbnYuRm9ybWF0SW50KG8uRmVlQnBzLCAxMCkpCn0KGo9JCgpyZW5kZXIuZ25vEoBJcGFja2FnZSBvdGMKCmltcG9ydCAoCgkic3RyY29udiIKCSJzdHJpbmdzIgoJInRpbWUiCgoJImduby5sYW5kL3AvbnQvYXZsL3YwIgoJImduby5sYW5kL3IvbnQvZ3JjMjByZWcvdjAiCikKCi8vIFJlYWRzIGRvIG5vdCByZWZ1c2UgY29pbnM6IHRoZSBlbnZlbG9wZSBiZWxvbmdzIHRvIHRoZSB3aG9sZSBtZXNzYWdlLCBzbyBhCi8vIGd1YXJkIGhlcmUgd291bGQgYnJlYWsgYW55IHJlYWxtIHRoYXQgcmVhZHMgYW4gb2ZmZXIgaW5zaWRlIGEgcGFpZCBjYWxsIG9mCi8vIGl0cyBvd24uIE9ubHkgd3JpdGVzIGFyZSBndWFyZGVkLgovLwovLyBBbW91bnRzIGluIEpTT04gYXJlIHN0cmluZ3M6IGludDY0IGRvZXMgbm90IGZpdCBhIEphdmFTY3JpcHQgbnVtYmVyLgoKZnVuYyBSZWFsbUFkZHJlc3MoKSBhZGRyZXNzIHsgcmV0dXJuIHJlYWxtQWRkciB9CgovLyBHZXRPZmZlciByZXR1cm5zIG9uZSBvZmZlciBhcyBKU09OLCBwdWJsaWMgb3IgcHJpdmF0ZS4KZnVuYyBHZXRPZmZlcihpZCB1aW50NjQpIHN0cmluZyB7IHJldHVybiBvZmZlckpTT04obXVzdE9mZmVyKGlkKSkgfQoKLy8gTGlzdE9wZW4gcmV0dXJucyBvcGVuIHB1YmxpYyBvZmZlcnMsIG5ld2VzdCBmaXJzdCAoUzkpLgpmdW5jIExpc3RPcGVuKG9mZnNldCwgbGltaXQgaW50KSBzdHJpbmcgewoJcmV0dXJuIGxpc3RKU09OKCZvcGVuUHVibGljLCBvZmZzZXQsIGxpbWl0KQp9CgovLyBMaXN0QnlNYWtlciByZXR1cm5zIGV2ZXJ5IG9mZmVyIG9mIG9uZSBtYWtlciwgcHJpdmF0ZSBhbmQgY2xvc2VkIG9uZXMKLy8gaW5jbHVkZWQsIG5ld2VzdCBmaXJzdC4KZnVuYyBMaXN0QnlNYWtlcihhZGRyIHN0cmluZywgb2Zmc2V0LCBsaW1pdCBpbnQpIHN0cmluZyB7Cgl2IDo9IGJ5TWFrZXIuR2V0KGFkZHIpCglpZiB2ID09IG5pbCB7CgkJcmV0dXJuIGB7InRvdGFsIjowLCJvZmZlcnMiOltdfWAKCX0KCXJldHVybiBsaXN0SlNPTih2LigqYXZsLlRyZWUpLCBvZmZzZXQsIGxpbWl0KQp9CgovLyBHZXRDb25maWcgcmV0dXJucyB0aGUgcGFyYW1ldGVycyBhbmQgdGhlIHdoaXRlbGlzdCBhcyBKU09OLgpmdW5jIEdldENvbmZpZygpIHN0cmluZyB7Cgl2YXIgYiBzdHJpbmdzLkJ1aWxkZXIKCWIuV3JpdGVTdHJpbmcoYHsicmVhbG0iOmAgKyBqc3RyKHJlYWxtQWRkci5TdHJpbmcoKSkpCgliLldyaXRlU3RyaW5nKGAsImFkbWluIjpgICsganN0cihhZG1pbi5TdHJpbmcoKSkpCgliLldyaXRlU3RyaW5nKGAsImZlZV9yZWNpcGllbnQiOmAgKyBqc3RyKGZlZVJlY2lwaWVudC5TdHJpbmcoKSkpCgliLldyaXRlU3RyaW5nKGAsImZlZV9icHMiOmAgKyBudW0oZmVlQnBzKSkKCWIuV3JpdGVTdHJpbmcoYCwiZmVlX2NhcF9icHMiOmAgKyBudW0oZmVlQ2FwQnBzKSkKCWIuV3JpdGVTdHJpbmcoYCwiZ25vbWljX2tleSI6YCArIGpzdHIoZ25vbWljS2V5KSkKCWIuV3JpdGVTdHJpbmcoYCwiZ25vbWljX2ZlZV9lbmFibGVkIjpgICsgc3RyY29udi5Gb3JtYXRCb29sKGdub21pY0ZlZU9uKSkKCWIuV3JpdGVTdHJpbmcoYCwiZ25vbWljX2ZlZV9icHMiOmAgKyBudW0oZ25vbWljRmVlKSkKCWIuV3JpdGVTdHJpbmcoYCwicGF1c2VkIjpgICsgc3RyY29udi5Gb3JtYXRCb29sKHBhdXNlZCkpCgliLldyaXRlU3RyaW5nKGAsIm1heF9wYWdlX3NpemUiOmAgKyBzdHJjb252Lkl0b2EobWF4UGFnZVNpemUpKQoJYi5Xcml0ZVN0cmluZyhgLCJ0b2tlbnMiOltgKQoJaSA6PSAwCgl0b2tlbnMuSXRlcmF0ZSgiIiwgIiIsIGZ1bmMoa2V5IHN0cmluZywgdiBhbnkpIGJvb2wgeyAvLyBib3VuZGVkIGJ5IG1heFRva2VucwoJCWlmIGkgPiAwIHsKCQkJYi5Xcml0ZVN0cmluZygiLCIpCgkJfQoJCWkrKwoJCXN5bSwgZGVjIDo9IHRva2VuSW5mbyhrZXkpCgkJYi5Xcml0ZVN0cmluZyhgeyJrZXkiOmAgKyBqc3RyKGtleSkgKyBgLCJzeW1ib2wiOmAgKyBqc3RyKHN5bSkgKwoJCQlgLCJkZWNpbWFscyI6YCArIHN0cmNvbnYuSXRvYShkZWMpICsgYCwiZW5hYmxlZCI6YCArIHN0cmNvbnYuRm9ybWF0Qm9vbCh2Lihib29sKSkgKyBgfWApCgkJcmV0dXJuIGZhbHNlCgl9KQoJYi5Xcml0ZVN0cmluZygiXX0iKQoJcmV0dXJuIGIuU3RyaW5nKCkKfQoKLy8gR2V0U3RhdHMgcmV0dXJucyB0aGUgcnVubmluZyB0b3RhbHMgYXMgSlNPTiAoRjcpLgpmdW5jIEdldFN0YXRzKCkgc3RyaW5nIHsKCXJldHVybiBgeyJ0b3RhbF9mZWVzX3Vnbm90IjpgICsganN0cihudW0odG90YWxGZWVzKSkgKwoJCWAsInRvdGFsX3ZvbHVtZV91Z25vdCI6YCArIGpzdHIobnVtKHRvdGFsVm9sdW1lKSkgKwoJCWAsImZpbGxlZCI6YCArIG51bShmaWxsZWRDb3VudCkgKwoJCWAsIm9mZmVycyI6YCArIHN0cmNvbnYuRm9ybWF0VWludChsYXN0SUQsIDEwKSArCgkJYCwib3Blbl9wdWJsaWMiOmAgKyBzdHJjb252Lkl0b2Eob3BlblB1YmxpYy5TaXplKCkpICsgYH1gCn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBSZW5kZXIKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLyBSZW5kZXIgc2VydmVzICIiIChzdGF0cyBhbmQgdGhlIGZpcnN0IHBhZ2UpLCAicGFnZS9OIiBhbmQgIm9mZmVyL0lEIi4KZnVuYyBSZW5kZXIocGF0aCBzdHJpbmcpIHN0cmluZyB7Cglzd2l0Y2ggewoJY2FzZSBwYXRoID09ICIiOgoJCXJldHVybiByZW5kZXJIb21lKDEpCgljYXNlIHN0cmluZ3MuSGFzUHJlZml4KHBhdGgsICJwYWdlLyIpOgoJCW4sIGVyciA6PSBzdHJjb252LkF0b2kocGF0aFtsZW4oInBhZ2UvIik6XSkKCQlpZiBlcnIgIT0gbmlsIHx8IG4gPCAxIHsKCQkJcmV0dXJuICIjIE5vdCBmb3VuZFxuIgoJCX0KCQlyZXR1cm4gcmVuZGVySG9tZShuKQoJY2FzZSBzdHJpbmdzLkhhc1ByZWZpeChwYXRoLCAib2ZmZXIvIik6CgkJaWQsIGVyciA6PSBzdHJjb252LlBhcnNlVWludChwYXRoW2xlbigib2ZmZXIvIik6XSwgMTAsIDY0KQoJCWlmIGVyciAhPSBuaWwgfHwgIW9mZmVycy5IYXMocGFkSUQoaWQpKSB7CgkJCXJldHVybiAiIyBOb3QgZm91bmRcbiIKCQl9CgkJcmV0dXJuIHJlbmRlck9mZmVyKG11c3RPZmZlcihpZCkpCgl9CglyZXR1cm4gIiMgTm90IGZvdW5kXG4iCn0KCmZ1bmMgcmVuZGVySG9tZShwYWdlIGludCkgc3RyaW5nIHsKCXZhciBiIHN0cmluZ3MuQnVpbGRlcgoJYi5Xcml0ZVN0cmluZygiIyBHbm9taWMgT1RDXG5cbiIpCgliLldyaXRlU3RyaW5nKCJFc2Nyb3dlZCBHUkMyMCDih4QgR05PVCBvZmZlcnMsIGZpbGxlZCBpbiBmdWxsIGFuZCBhdG9taWNhbGx5LlxuXG4iKQoJaWYgcGF1c2VkIHsKCQliLldyaXRlU3RyaW5nKCIqKlBhdXNlZDoqKiBubyBuZXcgb2ZmZXJzIG9yIGZpbGxzLiBNYWtlcnMgY2FuIHN0aWxsIGNhbmNlbC5cblxuIikKCX0KCWIuV3JpdGVTdHJpbmcoInwgVm9sdW1lIHwgRmVlcyB8IEZpbGxlZCB8IE9wZW4gKHB1YmxpYykgfCBGZWUgfFxufC0tLXwtLS18LS0tfC0tLXwtLS18XG4iKQoJYi5Xcml0ZVN0cmluZygifCAiICsgdW5pdHModG90YWxWb2x1bWUsIDYpICsgIiBHTk9UIHwgIiArIHVuaXRzKHRvdGFsRmVlcywgNikgKyAiIEdOT1QgfCAiICsKCQludW0oZmlsbGVkQ291bnQpICsgIiB8ICIgKyBzdHJjb252Lkl0b2Eob3BlblB1YmxpYy5TaXplKCkpICsgIiB8ICIgKyBicHMoZmVlQnBzKSkKCWlmIGdub21pY0ZlZU9uIHsKCQliLldyaXRlU3RyaW5nKCIgKEdOT01JQyAiICsgYnBzKGdub21pY0ZlZSkgKyAiKSIpCgl9CgliLldyaXRlU3RyaW5nKCIgfFxuXG4iKQoKCWIuV3JpdGVTdHJpbmcoIiMjIE9wZW4gb2ZmZXJzXG5cbiIpCglzaXplIDo9IG9wZW5QdWJsaWMuU2l6ZSgpCgkvLyBDb21wYXJlZCBhcyBwYWdlIG51bWJlcnMsIG5vdCBhcyBhbiBvZmZzZXQ6IChwYWdlLTEpKnBhZ2VTaXplIG92ZXJmbG93cwoJLy8gZm9yIGEgbGFyZ2UgZW5vdWdoIHBhZ2UuCglpZiBwYWdlID4gMSAmJiBwYWdlLTEgPiAoc2l6ZS0xKS9kZWZhdWx0UGFnZVNpemUgewoJCXJldHVybiAiIyBOb3QgZm91bmRcbiIKCX0KCWlmIHNpemUgPT0gMCB7CgkJYi5Xcml0ZVN0cmluZygiTm8gb3BlbiBvZmZlcnMuXG4iKQoJCXJldHVybiBiLlN0cmluZygpCgl9CglvZmZzZXQgOj0gKHBhZ2UgLSAxKSAqIGRlZmF1bHRQYWdlU2l6ZQoJYi5Xcml0ZVN0cmluZygifCBJRCB8IFNpZGUgfCBUb2tlbiB8IEFtb3VudCB8IEdOT1QgfCBNYWtlciB8IEV4cGlyZXMgfFxufC0tLXwtLS18LS0tfC0tLXwtLS18LS0tfC0tLXxcbiIpCglvcGVuUHVibGljLlJldmVyc2VJdGVyYXRlQnlPZmZzZXQob2Zmc2V0LCBkZWZhdWx0UGFnZVNpemUsIGZ1bmMoa2V5IHN0cmluZywgXyBhbnkpIGJvb2wgewoJCW8gOj0gb2ZmZXJzLkdldChrZXkpLigqT2ZmZXIpCgkJc3ltLCBkZWMgOj0gdG9rZW5JbmZvKG8uVG9rZW5LZXkpCgkJYi5Xcml0ZVN0cmluZygifCBbIiArIG51bTY0KG8uSUQpICsgIl0oIiArIGxpbmsoIm9mZmVyLyIrbnVtNjQoby5JRCkpICsgIikgfCAiICsgby5TaWRlLlN0cmluZygpICsKCQkJIiB8ICIgKyBzeW0gKyAiIHwgIiArIHVuaXRzKG8uVG9rZW5BbXQsIGRlYykgKyAiIHwgIiArIHVuaXRzKG8uR25vdEFtdCwgNikgKwoJCQkiIHwgIiArIHNob3J0KG8uTWFrZXIpICsgIiB8ICIgKyBleHBpcnkobykgKyAiIHxcbiIpCgkJcmV0dXJuIGZhbHNlCgl9KQoJaWYgcGFnZSA+IDEgewoJCWIuV3JpdGVTdHJpbmcoIlxuW+KGkCBuZXdlcl0oIiArIGxpbmsoInBhZ2UvIitzdHJjb252Lkl0b2EocGFnZS0xKSkgKyAiKSIpCgl9CglpZiBvZmZzZXQrZGVmYXVsdFBhZ2VTaXplIDwgc2l6ZSB7CgkJYi5Xcml0ZVN0cmluZygiXG5bb2xkZXIg4oaSXSgiICsgbGluaygicGFnZS8iK3N0cmNvbnYuSXRvYShwYWdlKzEpKSArICIpIikKCX0KCWIuV3JpdGVTdHJpbmcoIlxuIikKCXJldHVybiBiLlN0cmluZygpCn0KCmZ1bmMgcmVuZGVyT2ZmZXIobyAqT2ZmZXIpIHN0cmluZyB7CglzeW0sIGRlYyA6PSB0b2tlbkluZm8oby5Ub2tlbktleSkKCWZlZSA6PSBmZWVPZihvLkdub3RBbXQsIG8uRmVlQnBzKQoJdmFyIGIgc3RyaW5ncy5CdWlsZGVyCgliLldyaXRlU3RyaW5nKCIjIE9mZmVyICIgKyBudW02NChvLklEKSArICJcblxuIikKCWIuV3JpdGVTdHJpbmcoInwgfCB8XG58LS0tfC0tLXxcbiIpCglpZiBvLlN0YXR1cyA9PSBPcGVuICYmIGV4cGlyZWQobykgewoJCWIuV3JpdGVTdHJpbmcoInwgU3RhdHVzIHwgT3BlbiwgZXhwaXJlZDogaXQgY2FuIG5vIGxvbmdlciBiZSBmaWxsZWQsIG9ubHkgY2FuY2VsbGVkIGJ5IGl0cyBtYWtlciB8XG4iKQoJfSBlbHNlIHsKCQliLldyaXRlU3RyaW5nKCJ8IFN0YXR1cyB8ICIgKyBvLlN0YXR1cy5TdHJpbmcoKSArICIgfFxuIikKCX0KCWIuV3JpdGVTdHJpbmcoInwgU2lkZSB8ICIgKyBvLlNpZGUuU3RyaW5nKCkgKyAiIHxcbiIpCgliLldyaXRlU3RyaW5nKCJ8IFRva2VuIHwgIiArIHN5bSArICIgKGAiICsgby5Ub2tlbktleSArICJgKSB8XG4iKQoJYi5Xcml0ZVN0cmluZygifCBUb2tlbiBhbW91bnQgfCAiICsgdW5pdHMoby5Ub2tlbkFtdCwgZGVjKSArICIgIiArIHN5bSArICIgfFxuIikKCWIuV3JpdGVTdHJpbmcoInwgR05PVCBhbW91bnQgfCAiICsgdW5pdHMoby5Hbm90QW10LCA2KSArICIgR05PVCB8XG4iKQoJYi5Xcml0ZVN0cmluZygifCBGZWUgfCAiICsgYnBzKG8uRmVlQnBzKSArICIgPSAiICsgdW5pdHMoZmVlLCA2KSArICIgR05PVCwgcGFpZCBieSB3aG9ldmVyIHJlY2VpdmVzIHRoZSBHTk9UIHxcbiIpCgliLldyaXRlU3RyaW5nKCJ8IE1ha2VyIHwgYCIgKyBvLk1ha2VyLlN0cmluZygpICsgImAgfFxuIikKCWlmIG8uVGFrZXIgPT0gIiIgewoJCWIuV3JpdGVTdHJpbmcoInwgVGFrZXIgfCBhbnlvbmUgfFxuIikKCX0gZWxzZSB7CgkJYi5Xcml0ZVN0cmluZygifCBUYWtlciB8IGAiICsgby5UYWtlci5TdHJpbmcoKSArICJgIChub3QgbGlzdGVkKSB8XG4iKQoJfQoJYi5Xcml0ZVN0cmluZygifCBDcmVhdGVkIHwgIiArIHdoZW4oby5DcmVhdGVkQXQpICsgIiB8XG4iKQoJYi5Xcml0ZVN0cmluZygifCBFeHBpcmVzIHwgIiArIGV4cGlyeShvKSArICIgfFxuIikKCWIuV3JpdGVTdHJpbmcoIlxuW+KGkCBhbGwgb2ZmZXJzXSgiICsgbGluaygiIikgKyAiKVxuIikKCXJldHVybiBiLlN0cmluZygpCn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBIZWxwZXJzCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKZnVuYyBsaXN0SlNPTih0ICphdmwuVHJlZSwgb2Zmc2V0LCBsaW1pdCBpbnQpIHN0cmluZyB7CglpZiBvZmZzZXQgPCAwIHsKCQlvZmZzZXQgPSAwCgl9CglpZiBsaW1pdCA8PSAwIHsKCQlsaW1pdCA9IGRlZmF1bHRQYWdlU2l6ZQoJfQoJaWYgbGltaXQgPiBtYXhQYWdlU2l6ZSB7CgkJbGltaXQgPSBtYXhQYWdlU2l6ZQoJfQoJdmFyIGIgc3RyaW5ncy5CdWlsZGVyCgliLldyaXRlU3RyaW5nKGB7InRvdGFsIjpgICsgc3RyY29udi5JdG9hKHQuU2l6ZSgpKSArIGAsIm9mZmVycyI6W2ApCglpIDo9IDAKCXQuUmV2ZXJzZUl0ZXJhdGVCeU9mZnNldChvZmZzZXQsIGxpbWl0LCBmdW5jKGtleSBzdHJpbmcsIF8gYW55KSBib29sIHsKCQlpZiBpID4gMCB7CgkJCWIuV3JpdGVTdHJpbmcoIiwiKQoJCX0KCQlpKysKCQliLldyaXRlU3RyaW5nKG9mZmVySlNPTihvZmZlcnMuR2V0KGtleSkuKCpPZmZlcikpKQoJCXJldHVybiBmYWxzZQoJfSkKCWIuV3JpdGVTdHJpbmcoIl19IikKCXJldHVybiBiLlN0cmluZygpCn0KCmZ1bmMgb2ZmZXJKU09OKG8gKk9mZmVyKSBzdHJpbmcgewoJc3ltLCBkZWMgOj0gdG9rZW5JbmZvKG8uVG9rZW5LZXkpCglyZXR1cm4gYHsiaWQiOmAgKyBqc3RyKG51bTY0KG8uSUQpKSArCgkJYCwibWFrZXIiOmAgKyBqc3RyKG8uTWFrZXIuU3RyaW5nKCkpICsKCQlgLCJ0YWtlciI6YCArIGpzdHIoby5UYWtlci5TdHJpbmcoKSkgKwoJCWAsInNpZGUiOmAgKyBqc3RyKG8uU2lkZS5TdHJpbmcoKSkgKwoJCWAsInRva2VuX2tleSI6YCArIGpzdHIoby5Ub2tlbktleSkgKwoJCWAsInRva2VuX3N5bWJvbCI6YCArIGpzdHIoc3ltKSArCgkJYCwidG9rZW5fZGVjaW1hbHMiOmAgKyBzdHJjb252Lkl0b2EoZGVjKSArCgkJYCwidG9rZW5fYW10IjpgICsganN0cihudW0oby5Ub2tlbkFtdCkpICsKCQlgLCJnbm90X2FtdCI6YCArIGpzdHIobnVtKG8uR25vdEFtdCkpICsKCQlgLCJmZWVfYnBzIjpgICsgbnVtKG8uRmVlQnBzKSArCgkJYCwiZmVlX3Vnbm90IjpgICsganN0cihudW0oZmVlT2Yoby5Hbm90QW10LCBvLkZlZUJwcykpKSArCgkJYCwiZXhwaXJlc19hdCI6YCArIG51bShvLkV4cGlyZXNBdCkgKwoJCWAsImV4cGlyZWQiOmAgKyBzdHJjb252LkZvcm1hdEJvb2woZXhwaXJlZChvKSkgKwoJCWAsImNyZWF0ZWRfYXQiOmAgKyBudW0oby5DcmVhdGVkQXQpICsKCQlgLCJzdGF0dXMiOmAgKyBqc3RyKG8uU3RhdHVzLlN0cmluZygpKSArIGB9YAp9CgpmdW5jIHRva2VuSW5mbyhrZXkgc3RyaW5nKSAoc3RyaW5nLCBpbnQpIHsKCXQgOj0gZ3JjMjByZWcuR2V0KGtleSkKCWlmIHQgPT0gbmlsIHsKCQlyZXR1cm4ga2V5LCAwCgl9CglyZXR1cm4gdC5HZXRTeW1ib2woKSwgdC5HZXREZWNpbWFscygpCn0KCi8vIGpzdHIgcXVvdGVzIGEgc3RyaW5nIGZvciBKU09OLgpmdW5jIGpzdHIocyBzdHJpbmcpIHN0cmluZyB7Cgl2YXIgYiBzdHJpbmdzLkJ1aWxkZXIKCWIuV3JpdGVCeXRlKCciJykKCWZvciBfLCByIDo9IHJhbmdlIHMgewoJCXN3aXRjaCB7CgkJY2FzZSByID09ICciJyB8fCByID09ICdcXCc6CgkJCWIuV3JpdGVCeXRlKCdcXCcpCgkJCWIuV3JpdGVSdW5lKHIpCgkJY2FzZSByIDwgMHgyMDoKCQkJaCA6PSBzdHJjb252LkZvcm1hdEludChpbnQ2NChyKSwgMTYpCgkJCWIuV3JpdGVTdHJpbmcoYFx1YCArIHN0cmluZ3MuUmVwZWF0KCIwIiwgNC1sZW4oaCkpICsgaCkKCQlkZWZhdWx0OgoJCQliLldyaXRlUnVuZShyKQoJCX0KCX0KCWIuV3JpdGVCeXRlKCciJykKCXJldHVybiBiLlN0cmluZygpCn0KCmZ1bmMgbnVtKHYgaW50NjQpIHN0cmluZyAgICB7IHJldHVybiBzdHJjb252LkZvcm1hdEludCh2LCAxMCkgfQpmdW5jIG51bTY0KHYgdWludDY0KSBzdHJpbmcgeyByZXR1cm4gc3RyY29udi5Gb3JtYXRVaW50KHYsIDEwKSB9CgovLyB1bml0cyBmb3JtYXRzIGJhc2UgdW5pdHMgd2l0aCBkZWMgZGVjaW1hbHMsIHRyYWlsaW5nIHplcm9zIGRyb3BwZWQuCmZ1bmMgdW5pdHModiBpbnQ2NCwgZGVjIGludCkgc3RyaW5nIHsKCXMgOj0gc3RyY29udi5Gb3JtYXRJbnQodiwgMTApCglpZiBkZWMgPD0gMCB7CgkJcmV0dXJuIHMKCX0KCWlmIGxlbihzKSA8PSBkZWMgewoJCXMgPSBzdHJpbmdzLlJlcGVhdCgiMCIsIGRlYy1sZW4ocykrMSkgKyBzCgl9Cgl3aG9sZSwgZnJhYyA6PSBzWzpsZW4ocyktZGVjXSwgc3RyaW5ncy5UcmltUmlnaHQoc1tsZW4ocyktZGVjOl0sICIwIikKCWlmIGZyYWMgPT0gIiIgewoJCXJldHVybiB3aG9sZQoJfQoJcmV0dXJuIHdob2xlICsgIi4iICsgZnJhYwp9CgpmdW5jIGJwcyh2IGludDY0KSBzdHJpbmcgeyByZXR1cm4gdW5pdHModiwgMikgKyAiJSIgfQoKZnVuYyBzaG9ydChhIGFkZHJlc3MpIHN0cmluZyB7CglzIDo9IGEuU3RyaW5nKCkKCWlmIGxlbihzKSA8PSAxMiB7CgkJcmV0dXJuIHMKCX0KCXJldHVybiBzWzo4XSArICLigKYiICsgc1tsZW4ocyktNDpdCn0KCi8vIGxpbmsgaXMgYW4gYWJzb2x1dGUgZ25vd2ViIGxpbmsgdG8gb25lIG9mIHRoaXMgcmVhbG0ncyBSZW5kZXIgcGF0aHMuCi8vIGdub3dlYiByZWplY3RzIGEgYmFyZSAiOnBhdGgiIGRlc3RpbmF0aW9uIGFuZCBwcmludHMgaXQgYXMgcGxhaW4gdGV4dC4KZnVuYyBsaW5rKHBhdGggc3RyaW5nKSBzdHJpbmcgewoJaWYgcGF0aCA9PSAiIiB7CgkJcmV0dXJuIHdlYlBhdGgKCX0KCXJldHVybiB3ZWJQYXRoICsgIjoiICsgcGF0aAp9CgovLyBleHBpcnkgaXMgdGhlIEV4cGlyZXMgY2VsbDogdGhlIGRhdGUsIG1hcmtlZCBvbmNlIGl0IGhhcyBwYXNzZWQuCmZ1bmMgZXhwaXJ5KG8gKk9mZmVyKSBzdHJpbmcgewoJaWYgZXhwaXJlZChvKSB7CgkJcmV0dXJuICJleHBpcmVkICIgKyB3aGVuKG8uRXhwaXJlc0F0KQoJfQoJcmV0dXJuIHdoZW4oby5FeHBpcmVzQXQpCn0KCmZ1bmMgd2hlbih1bml4IGludDY0KSBzdHJpbmcgewoJaWYgdW5peCA9PSAwIHsKCQlyZXR1cm4gIm5ldmVyIgoJfQoJcmV0dXJuIHRpbWUuVW5peCh1bml4LCAwKS5VVEMoKS5Gb3JtYXQoIjIwMDYtMDEtMDIgMTU6MDQgVVRDIikKfQoa5BIKCXR5cGVzLmdubxLWEnBhY2thZ2Ugb3RjCgovLyBTaWRlIHNheXMgd2hpY2ggaGFsZiBvZiB0aGUgb2ZmZXIgdGhlIG1ha2VyIGVzY3Jvd2VkLgp0eXBlIFNpZGUgaW50Cgpjb25zdCAoCglTZWxsVG9rZW4gU2lkZSA9IDEgLy8gbWFrZXIgZXNjcm93cyB0aGUgdG9rZW4sIHRha2VyIHBheXMgR05PVAoJU2VsbEdub3QgIFNpZGUgPSAyIC8vIG1ha2VyIGVzY3Jvd3MgR05PVCwgdGFrZXIgcGF5cyB0aGUgdG9rZW4KKQoKZnVuYyAocyBTaWRlKSBTdHJpbmcoKSBzdHJpbmcgewoJc3dpdGNoIHMgewoJY2FzZSBTZWxsVG9rZW46CgkJcmV0dXJuICJTZWxsVG9rZW4iCgljYXNlIFNlbGxHbm90OgoJCXJldHVybiAiU2VsbEdub3QiCgl9CglyZXR1cm4gInVua25vd24iCn0KCi8vIFN0YXR1cyBpcyBPcGVuIHVudGlsIHRoZSBvZmZlciBpcyBmaWxsZWQgb3IgY2FuY2VsbGVkLiBCb3RoIGFyZSB0ZXJtaW5hbAovLyAoUjEyKS4KdHlwZSBTdGF0dXMgaW50Cgpjb25zdCAoCglPcGVuICAgICAgU3RhdHVzID0gMQoJRmlsbGVkICAgIFN0YXR1cyA9IDIKCUNhbmNlbGxlZCBTdGF0dXMgPSAzCikKCmZ1bmMgKHMgU3RhdHVzKSBTdHJpbmcoKSBzdHJpbmcgewoJc3dpdGNoIHMgewoJY2FzZSBPcGVuOgoJCXJldHVybiAiT3BlbiIKCWNhc2UgRmlsbGVkOgoJCXJldHVybiAiRmlsbGVkIgoJY2FzZSBDYW5jZWxsZWQ6CgkJcmV0dXJuICJDYW5jZWxsZWQiCgl9CglyZXR1cm4gInVua25vd24iCn0KCi8vIE9mZmVyIGlzIG9uZSBlc2Nyb3dlZCB0cmFkZTogZXhhY3RseSBvbmUgR1JDMjAgc2lkZSBhbmQgb25lIEdOT1Qgc2lkZSAoUjEpLgp0eXBlIE9mZmVyIHN0cnVjdCB7CglJRCAgICAgICAgdWludDY0CglNYWtlciAgICAgYWRkcmVzcwoJVGFrZXIgICAgIGFkZHJlc3MgLy8gZW1wdHkgPSBwdWJsaWMgKFI0KSwgc2V0ID0gcHJpdmF0ZSAoUjUpCglTaWRlICAgICAgU2lkZQoJVG9rZW5LZXkgIHN0cmluZyAvLyBncmMyMHJlZyBrZXkgKFczKQoJVG9rZW5BbXQgIGludDY0ICAvLyBiYXNlIHVuaXRzIG9mIHRoZSB0b2tlbgoJR25vdEFtdCAgIGludDY0ICAvLyB1Z25vdAoJRmVlQnBzICAgIGludDY0ICAvLyBjb3BpZWQgYXQgY3JlYXRpb24sIG5ldmVyIGNoYW5nZWQgKEY0LCBJNCkKCUV4cGlyZXNBdCBpbnQ2NCAgLy8gdW5peCBzZWNvbmRzLCAwID0gbm9uZSAoUjkpCglDcmVhdGVkQXQgaW50NjQKCVN0YXR1cyAgICBTdGF0dXMKfQoKLy8gRXJyb3JzIGFyZSBzaG9ydCBhbmQgc3RhYmxlIHNvIHRoYXQgdGVzdHMgYW5kIHRoZSBmcm9udGVuZCBjYW4gbWF0Y2ggdGhlbS4KY29uc3QgKAoJRXJyUGF1c2VkICAgICAgICAgPSAib3RjOiBwYXVzZWQiCglFcnJOb3RVc2VyICAgICAgICA9ICJvdGM6IG11c3QgYmUgYSBkaXJlY3QgdXNlciBjYWxsIgoJRXJyTm9Db2lucyAgICAgICAgPSAib3RjOiB0aGlzIGNhbGwgdGFrZXMgbm8gY29pbnMiCglFcnJCYWRQYXltZW50ICAgICA9ICJvdGM6IHNlbmQgZXhhY3RseSB0aGUgcmVxdWlyZWQgdWdub3QgYW5kIG5vdGhpbmcgZWxzZSIKCUVyckJhZEFtb3VudCAgICAgID0gIm90YzogYW1vdW50cyBtdXN0IGJlIHBvc2l0aXZlIgoJRXJyQmFkRXhwaXJ5ICAgICAgPSAib3RjOiBleHBpcnkgbXVzdCBiZSAwIG9yIGluIHRoZSBmdXR1cmUiCglFcnJCYWRBZGRyZXNzICAgICA9ICJvdGM6IGludmFsaWQgYWRkcmVzcyIKCUVyclRha2VySXNNYWtlciAgID0gIm90YzogdGFrZXIgY2Fubm90IGJlIHRoZSBtYWtlciIKCUVyclRva2VuTm90TGlzdGVkID0gIm90YzogdG9rZW4gbm90IHdoaXRlbGlzdGVkIgoJRXJyVG9rZW5EaXNhYmxlZCAgPSAib3RjOiB0b2tlbiBkaXNhYmxlZCIKCUVyclRva2VuVW5rbm93biAgID0gIm90YzogdG9rZW4gbm90IGluIGdyYzIwcmVnIgoJRXJyVG9rZW5FeGlzdHMgICAgPSAib3RjOiB0b2tlbiBhbHJlYWR5IHdoaXRlbGlzdGVkIgoJRXJyVG9vTWFueVRva2VucyAgPSAib3RjOiB0b2tlbiB3aGl0ZWxpc3QgaXMgZnVsbCIKCUVyck5vT2ZmZXIgICAgICAgID0gIm90Yzogbm8gc3VjaCBvZmZlciIKCUVyck5vdE9wZW4gICAgICAgID0gIm90Yzogb2ZmZXIgaXMgbm90IG9wZW4iCglFcnJOb3RNYWtlciAgICAgICA9ICJvdGM6IG5vdCBtYWtlciIKCUVyck5vdFRha2VyICAgICAgID0gIm90Yzogb2ZmZXIgaXMgcmVzZXJ2ZWQgZm9yIGFub3RoZXIgdGFrZXIiCglFcnJPd25PZmZlciAgICAgICA9ICJvdGM6IG1ha2VyIGNhbm5vdCBmaWxsIG93biBvZmZlciIKCUVyckV4cGlyZWQgICAgICAgID0gIm90Yzogb2ZmZXIgZXhwaXJlZCIKCUVyck5vdEFkbWluICAgICAgID0gIm90Yzogbm90IGFkbWluIgoJRXJyRmVlQWJvdmVDYXAgICAgPSAib3RjOiBmZWUgYWJvdmUgY2FwIgoJRXJyRmVlVG9SZWFsbSAgICAgPSAib3RjOiBmZWUgcmVjaXBpZW50IGNhbm5vdCBiZSB0aGUgcmVhbG0iCikKIiIKEy9nbm8uTWVtUGFja2FnZVR5cGUSCwoJTVBVc2VyQWxsEhMIgMaGjwESCzI1MDAwMHVnbm90GqgBCjoKEy90bS5QdWJLZXlTZWNwMjU2azESIwohA6IOaqmxiy8r0XdV4axy1OxflbovXMC4iYrCmMnOl7XJEkBJ8wTAj+/5LdZ+00UMdl24I+o+jgMK1dsLIq5Lg1NgnVUdD/Z4nF/lkpFupM9V5Kg9Bji4OWbqNSIKtf6Nx4hbGihnMXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcWx1dXhl

Raw transaction data

Raw JSON data